Fix merge issues, remove excess files - match perl-5.38.2 dist
authorafresh1 <afresh1@openbsd.org>
Tue, 14 May 2024 19:38:53 +0000 (19:38 +0000)
committerafresh1 <afresh1@openbsd.org>
Tue, 14 May 2024 19:38:53 +0000 (19:38 +0000)
ok gkoehler@
Commit and we'll fix fallout bluhm@
Right away, please deraadt@

981 files changed:
gnu/usr.bin/perl/.travis.yml [deleted file]
gnu/usr.bin/perl/AUTHORS
gnu/usr.bin/perl/Configure
gnu/usr.bin/perl/Cross/config.sh-arm-linux
gnu/usr.bin/perl/Cross/config.sh-arm-linux-n770
gnu/usr.bin/perl/EXTERN.h
gnu/usr.bin/perl/INSTALL
gnu/usr.bin/perl/INTERN.h
gnu/usr.bin/perl/MANIFEST
gnu/usr.bin/perl/META.json
gnu/usr.bin/perl/META.yml
gnu/usr.bin/perl/Makefile.SH
gnu/usr.bin/perl/Makefile.micro
gnu/usr.bin/perl/Porting/Glossary
gnu/usr.bin/perl/Porting/Maintainers.pl
gnu/usr.bin/perl/Porting/README.pod
gnu/usr.bin/perl/Porting/bench.pl
gnu/usr.bin/perl/Porting/bisect-runner.pl
gnu/usr.bin/perl/Porting/checkAUTHORS.pl [deleted file]
gnu/usr.bin/perl/Porting/checkcfgvar.pl
gnu/usr.bin/perl/Porting/cmpVERSION.pl
gnu/usr.bin/perl/Porting/config.sh
gnu/usr.bin/perl/Porting/config_H
gnu/usr.bin/perl/Porting/core-cpan-diff
gnu/usr.bin/perl/Porting/deparse-skips.txt
gnu/usr.bin/perl/Porting/exec-bit.txt
gnu/usr.bin/perl/Porting/make-rmg-checklist
gnu/usr.bin/perl/Porting/makerel
gnu/usr.bin/perl/Porting/perldelta_template.pod
gnu/usr.bin/perl/Porting/pumpkin.pod
gnu/usr.bin/perl/Porting/release_announcement_template.txt
gnu/usr.bin/perl/Porting/release_managers_guide.pod
gnu/usr.bin/perl/Porting/sync-with-cpan
gnu/usr.bin/perl/Porting/todo.pod
gnu/usr.bin/perl/README
gnu/usr.bin/perl/README.aix
gnu/usr.bin/perl/README.amiga
gnu/usr.bin/perl/README.android
gnu/usr.bin/perl/README.bs2000
gnu/usr.bin/perl/README.cygwin
gnu/usr.bin/perl/README.freebsd
gnu/usr.bin/perl/README.haiku
gnu/usr.bin/perl/README.hpux
gnu/usr.bin/perl/README.hurd
gnu/usr.bin/perl/README.irix
gnu/usr.bin/perl/README.linux
gnu/usr.bin/perl/README.macosx
gnu/usr.bin/perl/README.openbsd
gnu/usr.bin/perl/README.os2
gnu/usr.bin/perl/README.os390
gnu/usr.bin/perl/README.os400
gnu/usr.bin/perl/README.plan9
gnu/usr.bin/perl/README.qnx
gnu/usr.bin/perl/README.solaris
gnu/usr.bin/perl/README.synology
gnu/usr.bin/perl/README.tru64
gnu/usr.bin/perl/README.vms
gnu/usr.bin/perl/README.win32
gnu/usr.bin/perl/XSUB.h
gnu/usr.bin/perl/amigaos4/amigaio.c
gnu/usr.bin/perl/autodoc.pl
gnu/usr.bin/perl/av.c
gnu/usr.bin/perl/caretx.c
gnu/usr.bin/perl/cflags.SH
gnu/usr.bin/perl/charclass_invlists.h
gnu/usr.bin/perl/config_h.SH
gnu/usr.bin/perl/configpm
gnu/usr.bin/perl/configure.com
gnu/usr.bin/perl/cop.h
gnu/usr.bin/perl/cpan/CPAN/lib/CPAN.pm
gnu/usr.bin/perl/cpan/CPAN/lib/CPAN/Distribution.pm
gnu/usr.bin/perl/cpan/CPAN/lib/CPAN/HTTP/Client.pm
gnu/usr.bin/perl/cpan/Compress-Raw-Bzip2/Bzip2.xs
gnu/usr.bin/perl/cpan/Compress-Raw-Bzip2/bzip2-src/blocksort.c
gnu/usr.bin/perl/cpan/Compress-Raw-Bzip2/bzip2-src/bzlib.c
gnu/usr.bin/perl/cpan/Compress-Raw-Bzip2/bzip2-src/compress.c
gnu/usr.bin/perl/cpan/Compress-Raw-Bzip2/bzip2-src/crctable.c
gnu/usr.bin/perl/cpan/Compress-Raw-Bzip2/bzip2-src/decompress.c
gnu/usr.bin/perl/cpan/Compress-Raw-Bzip2/bzip2-src/huffman.c
gnu/usr.bin/perl/cpan/Compress-Raw-Bzip2/bzip2-src/randtable.c
gnu/usr.bin/perl/cpan/Compress-Raw-Bzip2/lib/Compress/Raw/Bzip2.pm
gnu/usr.bin/perl/cpan/Compress-Raw-Bzip2/private/MakeUtil.pm
gnu/usr.bin/perl/cpan/Compress-Raw-Bzip2/t/000prereq.t
gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/Changes [deleted file]
gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/MANIFEST [deleted file]
gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/META.json [deleted file]
gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/README [deleted file]
gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/Zlib.xs
gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/config.in
gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/examples/filtdef [deleted file]
gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/examples/filtinf [deleted file]
gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/lib/Compress/Raw/Zlib.pm
gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/ppport.h [deleted file]
gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/private/MakeUtil.pm
gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/suppressions.asan [deleted file]
gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/t/000prereq.t [deleted file]
gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/t/99pod.t [deleted file]
gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/t/Test/Builder.pm [deleted file]
gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/t/Test/More.pm [deleted file]
gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/t/Test/Simple.pm [deleted file]
gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/t/meta-json.t [deleted file]
gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/t/meta-yaml.t [deleted file]
gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/crc32.c
gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/deflate.c
gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/deflate.h
gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/inflate.c
gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/trees.c
gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/zconf.h
gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/zutil.c
gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/zutil.h
gnu/usr.bin/perl/cpan/Config-Perl-V/V.pm
gnu/usr.bin/perl/cpan/Config-Perl-V/t/20_plv56.t
gnu/usr.bin/perl/cpan/Config-Perl-V/t/21_plv58.t
gnu/usr.bin/perl/cpan/Config-Perl-V/t/22_plv510.t
gnu/usr.bin/perl/cpan/Config-Perl-V/t/23_plv512.t
gnu/usr.bin/perl/cpan/Config-Perl-V/t/24_plv514.t
gnu/usr.bin/perl/cpan/Config-Perl-V/t/25_plv516.t
gnu/usr.bin/perl/cpan/Config-Perl-V/t/25_plv5162.t
gnu/usr.bin/perl/cpan/Config-Perl-V/t/26_plv518.t
gnu/usr.bin/perl/cpan/Config-Perl-V/t/26_plv5182.t
gnu/usr.bin/perl/cpan/Config-Perl-V/t/27_plv5200.t
gnu/usr.bin/perl/cpan/Config-Perl-V/t/27_plv5202.t
gnu/usr.bin/perl/cpan/Config-Perl-V/t/28_plv5220.t
gnu/usr.bin/perl/cpan/Config-Perl-V/t/28_plv52201w.t
gnu/usr.bin/perl/cpan/DB_File/DB_File.pm
gnu/usr.bin/perl/cpan/Digest-MD5/MD5.pm
gnu/usr.bin/perl/cpan/Digest-MD5/MD5.xs
gnu/usr.bin/perl/cpan/Digest-MD5/t/files.t
gnu/usr.bin/perl/cpan/Digest-SHA/lib/Digest/SHA.pm
gnu/usr.bin/perl/cpan/Digest-SHA/shasum
gnu/usr.bin/perl/cpan/Digest-SHA/src/sha.c
gnu/usr.bin/perl/cpan/Digest-SHA/src/sha.h
gnu/usr.bin/perl/cpan/Digest-SHA/src/sha64bit.c
gnu/usr.bin/perl/cpan/Digest-SHA/src/sha64bit.h
gnu/usr.bin/perl/cpan/Encode/Encode.pm
gnu/usr.bin/perl/cpan/Encode/Makefile.PL
gnu/usr.bin/perl/cpan/Encode/lib/Encode/Alias.pm
gnu/usr.bin/perl/cpan/Encode/lib/Encode/MIME/Header.pm
gnu/usr.bin/perl/cpan/Encode/t/Aliases.t
gnu/usr.bin/perl/cpan/Encode/t/enc_data.t
gnu/usr.bin/perl/cpan/Encode/t/enc_module.t
gnu/usr.bin/perl/cpan/Encode/t/jperl.t
gnu/usr.bin/perl/cpan/Encode/t/mime-header.t
gnu/usr.bin/perl/cpan/ExtUtils-Install/lib/ExtUtils/Install.pm
gnu/usr.bin/perl/cpan/ExtUtils-Install/lib/ExtUtils/Installed.pm
gnu/usr.bin/perl/cpan/ExtUtils-Install/lib/ExtUtils/Packlist.pm
gnu/usr.bin/perl/cpan/ExtUtils-Install/t/Installapi2.t
gnu/usr.bin/perl/cpan/ExtUtils-Install/t/lib/MakeMaker/Test/Setup/BFD.pm
gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/Command.pm
gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/Command/MM.pm
gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/Liblist.pm
gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/Liblist/Kid.pm
gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM.pm
gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_AIX.pm
gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Any.pm
gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_BeOS.pm
gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Cygwin.pm
gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_DOS.pm
gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Darwin.pm
gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_MacOS.pm
gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_NW5.pm
gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_OS2.pm
gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_QNX.pm
gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_UWIN.pm
gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Unix.pm
gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_VMS.pm
gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_VOS.pm
gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Win32.pm
gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Win95.pm
gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MY.pm
gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker.pm
gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker/Config.pm
gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker/FAQ.pod
gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker/Locale.pm
gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker/Tutorial.pod
gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker/version.pm
gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker/version/regex.pm
gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/Mkbootstrap.pm
gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/Mksymlists.pm
gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/testlib.pm
gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/eu_command.t
gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/min_perl_version.t
gnu/usr.bin/perl/cpan/Filter-Util-Call/Call.pm
gnu/usr.bin/perl/cpan/Filter-Util-Call/Call.xs
gnu/usr.bin/perl/cpan/Getopt-Long/lib/Getopt/Long.pm
gnu/usr.bin/perl/cpan/HTTP-Tiny/lib/HTTP/Tiny.pm
gnu/usr.bin/perl/cpan/IO-Compress/Makefile.PL
gnu/usr.bin/perl/cpan/IO-Compress/lib/Compress/Zlib.pm
gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/Adapter/Bzip2.pm
gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/Adapter/Deflate.pm
gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/Adapter/Identity.pm
gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/Base.pm
gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/Base/Common.pm
gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/Bzip2.pm
gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/Deflate.pm
gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/FAQ.pod
gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/Gzip.pm
gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/Gzip/Constants.pm
gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/RawDeflate.pm
gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/Zip.pm
gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/Zip/Constants.pm
gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/Zlib/Constants.pm
gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/Zlib/Extra.pm
gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Uncompress/Adapter/Bunzip2.pm
gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Uncompress/Adapter/Identity.pm
gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Uncompress/Adapter/Inflate.pm
gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Uncompress/AnyInflate.pm
gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Uncompress/AnyUncompress.pm
gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Uncompress/Base.pm
gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Uncompress/Bunzip2.pm
gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Uncompress/Gunzip.pm
gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Uncompress/Inflate.pm
gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Uncompress/RawInflate.pm
gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Uncompress/Unzip.pm
gnu/usr.bin/perl/cpan/IO-Compress/private/MakeUtil.pm
gnu/usr.bin/perl/cpan/IO-Compress/t/000prereq.t
gnu/usr.bin/perl/cpan/IO-Compress/t/101truncate-rawdeflate.t
gnu/usr.bin/perl/cpan/IO-Socket-IP/lib/IO/Socket/IP.pm
gnu/usr.bin/perl/cpan/JSON-PP/lib/JSON/PP.pm
gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary.t [deleted file]
gnu/usr.bin/perl/cpan/MIME-Base64/Base64.xs
gnu/usr.bin/perl/cpan/Math-BigInt-FastCalc/lib/Math/BigInt/FastCalc.pm
gnu/usr.bin/perl/cpan/Math-BigInt/lib/Math/BigFloat.pm
gnu/usr.bin/perl/cpan/Math-BigInt/lib/Math/BigInt.pm
gnu/usr.bin/perl/cpan/Math-BigInt/lib/Math/BigInt/Calc.pm
gnu/usr.bin/perl/cpan/Math-BigInt/t/_bin_parts_to_lib_parts.t [deleted file]
gnu/usr.bin/perl/cpan/Math-BigInt/t/_bin_str_to_str_parts.t [deleted file]
gnu/usr.bin/perl/cpan/Math-BigInt/t/_dec_parts_to_lib_parts.t [deleted file]
gnu/usr.bin/perl/cpan/Math-BigInt/t/_dec_str_to_str_parts.t [deleted file]
gnu/usr.bin/perl/cpan/Math-BigInt/t/_e_math.t [deleted file]
gnu/usr.bin/perl/cpan/Math-BigInt/t/_hex_str_to_str_parts.t [deleted file]
gnu/usr.bin/perl/cpan/Math-BigInt/t/_oct_str_to_str_parts.t [deleted file]
gnu/usr.bin/perl/cpan/Math-BigInt/t/backermann-mbi.t [deleted file]
gnu/usr.bin/perl/cpan/Math-BigInt/t/bare_mbi.t
gnu/usr.bin/perl/cpan/Math-BigInt/t/bdigitsum-mbi.t [deleted file]
gnu/usr.bin/perl/cpan/Math-BigInt/t/bdstr-mbf.t [deleted file]
gnu/usr.bin/perl/cpan/Math-BigInt/t/bdstr-mbi.t [deleted file]
gnu/usr.bin/perl/cpan/Math-BigInt/t/bestr-mbf.t [deleted file]
gnu/usr.bin/perl/cpan/Math-BigInt/t/bestr-mbi.t [deleted file]
gnu/usr.bin/perl/cpan/Math-BigInt/t/bfib-mbi.t [deleted file]
gnu/usr.bin/perl/cpan/Math-BigInt/t/bigfltpm.inc
gnu/usr.bin/perl/cpan/Math-BigInt/t/bigintpm.inc
gnu/usr.bin/perl/cpan/Math-BigInt/t/bigintpm.t
gnu/usr.bin/perl/cpan/Math-BigInt/t/biglog.t
gnu/usr.bin/perl/cpan/Math-BigInt/t/blucas-mbi.t [deleted file]
gnu/usr.bin/perl/cpan/Math-BigInt/t/bnok-mbf.t [deleted file]
gnu/usr.bin/perl/cpan/Math-BigInt/t/bnok-mbi.t [deleted file]
gnu/usr.bin/perl/cpan/Math-BigInt/t/bnstr-mbf.t [deleted file]
gnu/usr.bin/perl/cpan/Math-BigInt/t/bnstr-mbi.t [deleted file]
gnu/usr.bin/perl/cpan/Math-BigInt/t/bpi-mbf.t [deleted file]
gnu/usr.bin/perl/cpan/Math-BigInt/t/bpi-mbi.t [deleted file]
gnu/usr.bin/perl/cpan/Math-BigInt/t/bpow-mbf.t [deleted file]
gnu/usr.bin/perl/cpan/Math-BigInt/t/bpow-mbi.t [deleted file]
gnu/usr.bin/perl/cpan/Math-BigInt/t/bsstr-mbf.t [deleted file]
gnu/usr.bin/perl/cpan/Math-BigInt/t/bsstr-mbi.t [deleted file]
gnu/usr.bin/perl/cpan/Math-BigInt/t/buparrow-mbi.t [deleted file]
gnu/usr.bin/perl/cpan/Math-BigInt/t/const-mbf.t [deleted file]
gnu/usr.bin/perl/cpan/Math-BigInt/t/const-mbi.t [deleted file]
gnu/usr.bin/perl/cpan/Math-BigInt/t/downgrade.t
gnu/usr.bin/perl/cpan/Math-BigInt/t/dparts-mbf.t [deleted file]
gnu/usr.bin/perl/cpan/Math-BigInt/t/dparts-mbi.t [deleted file]
gnu/usr.bin/perl/cpan/Math-BigInt/t/eparts-mbf.t [deleted file]
gnu/usr.bin/perl/cpan/Math-BigInt/t/eparts-mbi.t [deleted file]
gnu/usr.bin/perl/cpan/Math-BigInt/t/fparts-mbf.t [deleted file]
gnu/usr.bin/perl/cpan/Math-BigInt/t/fparts-mbi.t [deleted file]
gnu/usr.bin/perl/cpan/Math-BigInt/t/from_base-mbi.t [deleted file]
gnu/usr.bin/perl/cpan/Math-BigInt/t/from_base_num-mbi.t [deleted file]
gnu/usr.bin/perl/cpan/Math-BigInt/t/from_bin-mbf.t [deleted file]
gnu/usr.bin/perl/cpan/Math-BigInt/t/from_bin-mbi.t [deleted file]
gnu/usr.bin/perl/cpan/Math-BigInt/t/from_hex-mbf.t [deleted file]
gnu/usr.bin/perl/cpan/Math-BigInt/t/from_hex-mbi.t [deleted file]
gnu/usr.bin/perl/cpan/Math-BigInt/t/from_ieee754-mbf.t [deleted file]
gnu/usr.bin/perl/cpan/Math-BigInt/t/from_oct-mbf.t [deleted file]
gnu/usr.bin/perl/cpan/Math-BigInt/t/from_oct-mbi.t [deleted file]
gnu/usr.bin/perl/cpan/Math-BigInt/t/inf_nan.t
gnu/usr.bin/perl/cpan/Math-BigInt/t/lib_load-mbf-mbi.t [deleted file]
gnu/usr.bin/perl/cpan/Math-BigInt/t/lib_load-mbi-mbf.t [deleted file]
gnu/usr.bin/perl/cpan/Math-BigInt/t/mbimbf.inc
gnu/usr.bin/perl/cpan/Math-BigInt/t/new-mbf.t [deleted file]
gnu/usr.bin/perl/cpan/Math-BigInt/t/new-mbi.t [deleted file]
gnu/usr.bin/perl/cpan/Math-BigInt/t/nparts-mbf.t [deleted file]
gnu/usr.bin/perl/cpan/Math-BigInt/t/nparts-mbi.t [deleted file]
gnu/usr.bin/perl/cpan/Math-BigInt/t/objectify_mbf.t [deleted file]
gnu/usr.bin/perl/cpan/Math-BigInt/t/objectify_mbi.t [deleted file]
gnu/usr.bin/perl/cpan/Math-BigInt/t/sparts-mbf.t [deleted file]
gnu/usr.bin/perl/cpan/Math-BigInt/t/sparts-mbi.t [deleted file]
gnu/usr.bin/perl/cpan/Math-BigInt/t/sub_mbf.t
gnu/usr.bin/perl/cpan/Math-BigInt/t/sub_mbi.t
gnu/usr.bin/perl/cpan/Math-BigInt/t/to_base-mbi.t [deleted file]
gnu/usr.bin/perl/cpan/Math-BigInt/t/to_base_num-mbi.t [deleted file]
gnu/usr.bin/perl/cpan/Math-BigInt/t/to_ieee754-mbf.t [deleted file]
gnu/usr.bin/perl/cpan/Math-BigInt/t/upgrade.inc
gnu/usr.bin/perl/cpan/Math-BigInt/t/upgrade.t
gnu/usr.bin/perl/cpan/Math-BigInt/t/upgrade2.t
gnu/usr.bin/perl/cpan/Math-BigRat/lib/Math/BigRat.pm
gnu/usr.bin/perl/cpan/Math-BigRat/t/bigrat.t
gnu/usr.bin/perl/cpan/Math-BigRat/t/bigratpm.inc
gnu/usr.bin/perl/cpan/Math-Complex/lib/Math/Complex.pm [deleted file]
gnu/usr.bin/perl/cpan/Math-Complex/lib/Math/Trig.pm [deleted file]
gnu/usr.bin/perl/cpan/Math-Complex/t/Complex.t [deleted file]
gnu/usr.bin/perl/cpan/Math-Complex/t/Trig.t [deleted file]
gnu/usr.bin/perl/cpan/Math-Complex/t/underbar.t [deleted file]
gnu/usr.bin/perl/cpan/Memoize/Memoize.pm
gnu/usr.bin/perl/cpan/Memoize/Memoize/AnyDBM_File.pm
gnu/usr.bin/perl/cpan/Memoize/Memoize/Expire.pm
gnu/usr.bin/perl/cpan/Memoize/Memoize/ExpireFile.pm [deleted file]
gnu/usr.bin/perl/cpan/Memoize/Memoize/ExpireTest.pm [deleted file]
gnu/usr.bin/perl/cpan/Memoize/Memoize/NDBM_File.pm
gnu/usr.bin/perl/cpan/Memoize/Memoize/SDBM_File.pm
gnu/usr.bin/perl/cpan/Memoize/Memoize/Storable.pm
gnu/usr.bin/perl/cpan/Memoize/t/array.t [deleted file]
gnu/usr.bin/perl/cpan/Memoize/t/array_confusion.t [deleted file]
gnu/usr.bin/perl/cpan/Memoize/t/errors.t [deleted file]
gnu/usr.bin/perl/cpan/Memoize/t/expfile.t [deleted file]
gnu/usr.bin/perl/cpan/Memoize/t/expire.t [deleted file]
gnu/usr.bin/perl/cpan/Memoize/t/expmod_n.t [deleted file]
gnu/usr.bin/perl/cpan/Memoize/t/prototype.t [deleted file]
gnu/usr.bin/perl/cpan/Memoize/t/speed.t [deleted file]
gnu/usr.bin/perl/cpan/Memoize/t/tiefeatures.t [deleted file]
gnu/usr.bin/perl/cpan/PerlIO-via-QuotedPrint/lib/PerlIO/via/QuotedPrint.pm
gnu/usr.bin/perl/cpan/Pod-Perldoc/lib/Pod/Perldoc.pm
gnu/usr.bin/perl/cpan/Pod-Perldoc/lib/Pod/Perldoc/ToMan.pm
gnu/usr.bin/perl/cpan/Pod-Usage/lib/Pod/Usage.pm
gnu/usr.bin/perl/cpan/Pod-Usage/t/pod/pod2usage2.t
gnu/usr.bin/perl/cpan/Scalar-List-Utils/ListUtil.xs
gnu/usr.bin/perl/cpan/Scalar-List-Utils/lib/List/Util.pm
gnu/usr.bin/perl/cpan/Scalar-List-Utils/lib/List/Util/XS.pm
gnu/usr.bin/perl/cpan/Scalar-List-Utils/lib/Scalar/Util.pm
gnu/usr.bin/perl/cpan/Scalar-List-Utils/lib/Sub/Util.pm
gnu/usr.bin/perl/cpan/Socket/Makefile.PL
gnu/usr.bin/perl/cpan/Socket/Socket.pm
gnu/usr.bin/perl/cpan/Socket/Socket.xs
gnu/usr.bin/perl/cpan/Socket/t/getnameinfo.t
gnu/usr.bin/perl/cpan/Sys-Syslog/Makefile.PL
gnu/usr.bin/perl/cpan/Term-Cap/Cap.pm
gnu/usr.bin/perl/cpan/Term-Cap/test.pl
gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Builder.pm
gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Builder/Module.pm
gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Builder/Tester.pm
gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Builder/Tester/Color.pm
gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/More.pm
gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Simple.pm
gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Tester.pm
gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Tester/Capture.pm
gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Tester/CaptureRunner.pm
gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Tester/Delegate.pm
gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/use/ok.pm
gnu/usr.bin/perl/cpan/Test-Simple/lib/ok.pm
gnu/usr.bin/perl/cpan/Text-Balanced/lib/Text/Balanced.pm
gnu/usr.bin/perl/cpan/Time-Piece/Piece.pm
gnu/usr.bin/perl/cpan/Time-Piece/Piece.xs
gnu/usr.bin/perl/cpan/autodie/lib/Fatal.pm
gnu/usr.bin/perl/cpan/autodie/lib/autodie.pm
gnu/usr.bin/perl/cpan/autodie/lib/autodie/Scope/Guard.pm
gnu/usr.bin/perl/cpan/autodie/lib/autodie/Scope/GuardStack.pm
gnu/usr.bin/perl/cpan/autodie/lib/autodie/Util.pm
gnu/usr.bin/perl/cpan/autodie/lib/autodie/exception.pm
gnu/usr.bin/perl/cpan/autodie/lib/autodie/exception/system.pm
gnu/usr.bin/perl/cpan/autodie/lib/autodie/hints.pm
gnu/usr.bin/perl/cpan/autodie/lib/autodie/skip.pm
gnu/usr.bin/perl/cpan/autodie/t/exceptions.t
gnu/usr.bin/perl/cpan/autodie/t/lib/pujHa/ghach.pm
gnu/usr.bin/perl/cpan/autodie/t/lib/pujHa/ghach/Dotlh.pm
gnu/usr.bin/perl/cpan/bignum/lib/Math/BigFloat/Trace.pm
gnu/usr.bin/perl/cpan/bignum/lib/Math/BigInt/Trace.pm
gnu/usr.bin/perl/cpan/bignum/lib/bigint.pm
gnu/usr.bin/perl/cpan/bignum/lib/bignum.pm
gnu/usr.bin/perl/cpan/bignum/lib/bigrat.pm
gnu/usr.bin/perl/cpan/bignum/t/infnan-bignum.t [deleted file]
gnu/usr.bin/perl/cpan/experimental/lib/experimental.pm
gnu/usr.bin/perl/cpan/experimental/t/basic.t
gnu/usr.bin/perl/cpan/libnet/Makefile.PL
gnu/usr.bin/perl/cpan/libnet/lib/Net/Cmd.pm
gnu/usr.bin/perl/cpan/libnet/lib/Net/Config.pm
gnu/usr.bin/perl/cpan/libnet/lib/Net/Domain.pm
gnu/usr.bin/perl/cpan/libnet/lib/Net/FTP.pm
gnu/usr.bin/perl/cpan/libnet/lib/Net/FTP/A.pm
gnu/usr.bin/perl/cpan/libnet/lib/Net/FTP/E.pm
gnu/usr.bin/perl/cpan/libnet/lib/Net/FTP/I.pm
gnu/usr.bin/perl/cpan/libnet/lib/Net/FTP/L.pm
gnu/usr.bin/perl/cpan/libnet/lib/Net/FTP/dataconn.pm
gnu/usr.bin/perl/cpan/libnet/lib/Net/NNTP.pm
gnu/usr.bin/perl/cpan/libnet/lib/Net/Netrc.pm
gnu/usr.bin/perl/cpan/libnet/lib/Net/POP3.pm
gnu/usr.bin/perl/cpan/libnet/lib/Net/SMTP.pm
gnu/usr.bin/perl/cpan/libnet/lib/Net/Time.pm
gnu/usr.bin/perl/cpan/parent/lib/parent.pm
gnu/usr.bin/perl/cpan/parent/t/parent.t
gnu/usr.bin/perl/cpan/podlators/Makefile.PL
gnu/usr.bin/perl/cpan/podlators/lib/Pod/Man.pm
gnu/usr.bin/perl/cpan/podlators/lib/Pod/ParseLink.pm
gnu/usr.bin/perl/cpan/podlators/lib/Pod/Text.pm
gnu/usr.bin/perl/cpan/podlators/lib/Pod/Text/Color.pm
gnu/usr.bin/perl/cpan/podlators/lib/Pod/Text/Overstrike.pm
gnu/usr.bin/perl/cpan/podlators/lib/Pod/Text/Termcap.pm
gnu/usr.bin/perl/cpan/podlators/scripts/pod2man.PL
gnu/usr.bin/perl/cpan/podlators/scripts/pod2text.PL
gnu/usr.bin/perl/cpan/podlators/t/data/basic.cap
gnu/usr.bin/perl/cpan/podlators/t/data/basic.clr
gnu/usr.bin/perl/cpan/podlators/t/data/basic.man
gnu/usr.bin/perl/cpan/podlators/t/data/basic.ovr
gnu/usr.bin/perl/cpan/podlators/t/data/basic.txt
gnu/usr.bin/perl/cpan/podlators/t/data/perl.conf
gnu/usr.bin/perl/cpan/podlators/t/data/snippets/README [deleted file]
gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/paired-quotes [deleted file]
gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/small-caps-magic [deleted file]
gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/uppercase-license [deleted file]
gnu/usr.bin/perl/cpan/podlators/t/docs/pod-spelling.t
gnu/usr.bin/perl/cpan/podlators/t/docs/pod.t
gnu/usr.bin/perl/cpan/podlators/t/docs/synopsis.t
gnu/usr.bin/perl/cpan/podlators/t/general/basic.t
gnu/usr.bin/perl/cpan/podlators/t/general/filehandle.t
gnu/usr.bin/perl/cpan/podlators/t/general/pod-parser.t
gnu/usr.bin/perl/cpan/podlators/t/lib/Test/Podlators.pm
gnu/usr.bin/perl/cpan/podlators/t/lib/Test/RRA.pm
gnu/usr.bin/perl/cpan/podlators/t/lib/Test/RRA/Config.pm
gnu/usr.bin/perl/cpan/podlators/t/lib/Test/RRA/ModuleVersion.pm
gnu/usr.bin/perl/cpan/podlators/t/man/devise-date.t
gnu/usr.bin/perl/cpan/podlators/t/man/empty.t
gnu/usr.bin/perl/cpan/podlators/t/man/heading.t
gnu/usr.bin/perl/cpan/podlators/t/man/no-encode.t
gnu/usr.bin/perl/cpan/podlators/t/man/utf8-io.t
gnu/usr.bin/perl/cpan/podlators/t/parselink/basic.t
gnu/usr.bin/perl/cpan/podlators/t/style/minimum-version.t
gnu/usr.bin/perl/cpan/podlators/t/style/module-version.t
gnu/usr.bin/perl/cpan/podlators/t/style/strict.t
gnu/usr.bin/perl/cpan/podlators/t/text/termcap.t
gnu/usr.bin/perl/cpan/version/t/07locale.t
gnu/usr.bin/perl/cv.h
gnu/usr.bin/perl/cygwin/cygwin.c
gnu/usr.bin/perl/deb.c
gnu/usr.bin/perl/dist/Attribute-Handlers/lib/Attribute/Handlers.pm
gnu/usr.bin/perl/dist/Carp/lib/Carp.pm
gnu/usr.bin/perl/dist/Carp/lib/Carp/Heavy.pm
gnu/usr.bin/perl/dist/Data-Dumper/Dumper.pm
gnu/usr.bin/perl/dist/Data-Dumper/Dumper.xs
gnu/usr.bin/perl/dist/Data-Dumper/t/dumper.t
gnu/usr.bin/perl/dist/Devel-PPPort/PPPort_pm.PL
gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5003007
gnu/usr.bin/perl/dist/Devel-PPPort/parts/embed.fnc
gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/magic
gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/mess
gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/misc
gnu/usr.bin/perl/dist/ExtUtils-CBuilder/Changes
gnu/usr.bin/perl/dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder.pm
gnu/usr.bin/perl/dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Base.pm
gnu/usr.bin/perl/dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/Unix.pm
gnu/usr.bin/perl/dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/VMS.pm
gnu/usr.bin/perl/dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/Windows.pm
gnu/usr.bin/perl/dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/Windows/BCC.pm
gnu/usr.bin/perl/dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/Windows/GCC.pm
gnu/usr.bin/perl/dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/Windows/MSVC.pm
gnu/usr.bin/perl/dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/aix.pm
gnu/usr.bin/perl/dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/android.pm
gnu/usr.bin/perl/dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/cygwin.pm
gnu/usr.bin/perl/dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/darwin.pm
gnu/usr.bin/perl/dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/dec_osf.pm
gnu/usr.bin/perl/dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/os2.pm
gnu/usr.bin/perl/dist/ExtUtils-ParseXS/lib/ExtUtils/ParseXS.pm
gnu/usr.bin/perl/dist/ExtUtils-ParseXS/lib/ExtUtils/ParseXS/Constants.pm
gnu/usr.bin/perl/dist/ExtUtils-ParseXS/lib/ExtUtils/ParseXS/CountLines.pm
gnu/usr.bin/perl/dist/ExtUtils-ParseXS/lib/ExtUtils/ParseXS/Eval.pm
gnu/usr.bin/perl/dist/ExtUtils-ParseXS/lib/ExtUtils/ParseXS/Utilities.pm
gnu/usr.bin/perl/dist/ExtUtils-ParseXS/lib/ExtUtils/Typemaps.pm
gnu/usr.bin/perl/dist/ExtUtils-ParseXS/lib/ExtUtils/Typemaps/Cmd.pm
gnu/usr.bin/perl/dist/ExtUtils-ParseXS/lib/ExtUtils/Typemaps/InputMap.pm
gnu/usr.bin/perl/dist/ExtUtils-ParseXS/lib/ExtUtils/Typemaps/OutputMap.pm
gnu/usr.bin/perl/dist/ExtUtils-ParseXS/lib/ExtUtils/Typemaps/Type.pm
gnu/usr.bin/perl/dist/ExtUtils-ParseXS/lib/perlxs.pod
gnu/usr.bin/perl/dist/Filter-Simple/Changes [new file with mode: 0644]
gnu/usr.bin/perl/dist/I18N-LangTags/lib/I18N/LangTags/List.pm
gnu/usr.bin/perl/dist/IO/IO.pm
gnu/usr.bin/perl/dist/IO/lib/IO/Dir.pm
gnu/usr.bin/perl/dist/IO/lib/IO/File.pm
gnu/usr.bin/perl/dist/IO/lib/IO/Handle.pm
gnu/usr.bin/perl/dist/IO/lib/IO/Pipe.pm
gnu/usr.bin/perl/dist/IO/lib/IO/Poll.pm
gnu/usr.bin/perl/dist/IO/lib/IO/Seekable.pm
gnu/usr.bin/perl/dist/IO/lib/IO/Select.pm
gnu/usr.bin/perl/dist/IO/lib/IO/Socket.pm
gnu/usr.bin/perl/dist/IO/lib/IO/Socket/INET.pm
gnu/usr.bin/perl/dist/IO/lib/IO/Socket/UNIX.pm
gnu/usr.bin/perl/dist/IO/poll.h
gnu/usr.bin/perl/dist/IO/t/cachepropagate-unix.t
gnu/usr.bin/perl/dist/Locale-Maketext/ChangeLog
gnu/usr.bin/perl/dist/Locale-Maketext/lib/Locale/Maketext.pm
gnu/usr.bin/perl/dist/Net-Ping/lib/Net/Ping.pm
gnu/usr.bin/perl/dist/Net-Ping/t/450_service.t
gnu/usr.bin/perl/dist/PathTools/Changes
gnu/usr.bin/perl/dist/PathTools/Cwd.pm
gnu/usr.bin/perl/dist/PathTools/Cwd.xs
gnu/usr.bin/perl/dist/PathTools/Makefile.PL
gnu/usr.bin/perl/dist/PathTools/lib/File/Spec.pm
gnu/usr.bin/perl/dist/PathTools/lib/File/Spec/AmigaOS.pm
gnu/usr.bin/perl/dist/PathTools/lib/File/Spec/Cygwin.pm
gnu/usr.bin/perl/dist/PathTools/lib/File/Spec/Epoc.pm
gnu/usr.bin/perl/dist/PathTools/lib/File/Spec/Functions.pm
gnu/usr.bin/perl/dist/PathTools/lib/File/Spec/Mac.pm
gnu/usr.bin/perl/dist/PathTools/lib/File/Spec/OS2.pm
gnu/usr.bin/perl/dist/PathTools/lib/File/Spec/Unix.pm
gnu/usr.bin/perl/dist/PathTools/lib/File/Spec/VMS.pm
gnu/usr.bin/perl/dist/PathTools/lib/File/Spec/Win32.pm
gnu/usr.bin/perl/dist/Safe/Safe.pm
gnu/usr.bin/perl/dist/Safe/t/safeops.t
gnu/usr.bin/perl/dist/Storable/ChangeLog
gnu/usr.bin/perl/dist/Storable/Storable.pm
gnu/usr.bin/perl/dist/Storable/Storable.xs
gnu/usr.bin/perl/dist/Tie-File/lib/Tie/File.pm
gnu/usr.bin/perl/dist/Time-HiRes/Changes
gnu/usr.bin/perl/dist/Time-HiRes/HiRes.pm
gnu/usr.bin/perl/dist/Time-HiRes/HiRes.xs
gnu/usr.bin/perl/dist/Time-HiRes/Makefile.PL
gnu/usr.bin/perl/dist/Time-HiRes/t/stat.t
gnu/usr.bin/perl/dist/XSLoader/XSLoader_pm.PL
gnu/usr.bin/perl/dist/XSLoader/t/XSLoader.t
gnu/usr.bin/perl/dist/encoding-warnings/lib/encoding/warnings.pm
gnu/usr.bin/perl/dist/encoding-warnings/t/1-warning.t
gnu/usr.bin/perl/dist/encoding-warnings/t/2-fatal.t
gnu/usr.bin/perl/dist/encoding-warnings/t/3-normal.t
gnu/usr.bin/perl/dist/encoding-warnings/t/4-lexical.t
gnu/usr.bin/perl/dist/threads-shared/lib/threads/shared.pm
gnu/usr.bin/perl/dist/threads-shared/shared.xs
gnu/usr.bin/perl/dist/threads-shared/t/stress.t
gnu/usr.bin/perl/dist/threads/lib/threads.pm
gnu/usr.bin/perl/dist/threads/t/thread.t
gnu/usr.bin/perl/dist/threads/threads.xs
gnu/usr.bin/perl/doio.c
gnu/usr.bin/perl/doop.c
gnu/usr.bin/perl/dosish.h
gnu/usr.bin/perl/dquote.c
gnu/usr.bin/perl/dump.c
gnu/usr.bin/perl/ebcdic_tables.h
gnu/usr.bin/perl/embed.fnc
gnu/usr.bin/perl/embed.h
gnu/usr.bin/perl/embedvar.h
gnu/usr.bin/perl/ext/B/B.pm
gnu/usr.bin/perl/ext/B/B.xs
gnu/usr.bin/perl/ext/B/B/Concise.pm
gnu/usr.bin/perl/ext/B/Makefile.PL
gnu/usr.bin/perl/ext/B/t/b.t
gnu/usr.bin/perl/ext/B/t/optree_concise.t
gnu/usr.bin/perl/ext/B/t/optree_samples.t
gnu/usr.bin/perl/ext/B/t/optree_specials.t
gnu/usr.bin/perl/ext/B/t/optree_varinit.t
gnu/usr.bin/perl/ext/Devel-Peek/Peek.pm
gnu/usr.bin/perl/ext/Devel-Peek/t/Peek.t
gnu/usr.bin/perl/ext/DynaLoader/DynaLoader_pm.PL
gnu/usr.bin/perl/ext/DynaLoader/dl_dyld.xs
gnu/usr.bin/perl/ext/DynaLoader/dl_win32.xs
gnu/usr.bin/perl/ext/Errno/Errno_pm.PL
gnu/usr.bin/perl/ext/ExtUtils-Miniperl/lib/ExtUtils/Miniperl.pm
gnu/usr.bin/perl/ext/File-Find/lib/File/Find.pm
gnu/usr.bin/perl/ext/File-Find/t/find.t
gnu/usr.bin/perl/ext/File-Glob/Glob.pm
gnu/usr.bin/perl/ext/File-Glob/Glob.xs
gnu/usr.bin/perl/ext/File-Glob/bsd_glob.c
gnu/usr.bin/perl/ext/GDBM_File/GDBM_File.pm
gnu/usr.bin/perl/ext/Hash-Util/Util.xs
gnu/usr.bin/perl/ext/Hash-Util/lib/Hash/Util.pm
gnu/usr.bin/perl/ext/I18N-Langinfo/Langinfo.pm
gnu/usr.bin/perl/ext/I18N-Langinfo/Langinfo.xs
gnu/usr.bin/perl/ext/NDBM_File/Makefile.PL
gnu/usr.bin/perl/ext/NDBM_File/NDBM_File.pm
gnu/usr.bin/perl/ext/NDBM_File/NDBM_File.xs
gnu/usr.bin/perl/ext/ODBM_File/ODBM_File.pm
gnu/usr.bin/perl/ext/ODBM_File/ODBM_File.xs
gnu/usr.bin/perl/ext/ODBM_File/hints/ultrix.pl [deleted file]
gnu/usr.bin/perl/ext/Opcode/Opcode.pm
gnu/usr.bin/perl/ext/Opcode/Opcode.xs
gnu/usr.bin/perl/ext/POSIX/Makefile.PL
gnu/usr.bin/perl/ext/POSIX/POSIX.xs
gnu/usr.bin/perl/ext/POSIX/lib/POSIX.pm
gnu/usr.bin/perl/ext/POSIX/lib/POSIX.pod
gnu/usr.bin/perl/ext/POSIX/t/export.t
gnu/usr.bin/perl/ext/POSIX/t/posix.t
gnu/usr.bin/perl/ext/Pod-Functions/t/Functions.t
gnu/usr.bin/perl/ext/Pod-Html/bin/pod2html
gnu/usr.bin/perl/ext/Pod-Html/lib/Pod/Html.pm
gnu/usr.bin/perl/ext/Pod-Html/t/anchorify-536.t [deleted file]
gnu/usr.bin/perl/ext/SDBM_File/SDBM_File.pm
gnu/usr.bin/perl/ext/SDBM_File/dbu.c
gnu/usr.bin/perl/ext/SDBM_File/sdbm.c
gnu/usr.bin/perl/ext/Sys-Hostname/Hostname.pm
gnu/usr.bin/perl/ext/XS-APItest/APItest.pm
gnu/usr.bin/perl/ext/XS-APItest/APItest.xs
gnu/usr.bin/perl/ext/XS-APItest/core_or_not.inc
gnu/usr.bin/perl/ext/XS-APItest/t/call.t
gnu/usr.bin/perl/ext/XS-APItest/t/locale.t
gnu/usr.bin/perl/ext/XS-APItest/t/magic.t
gnu/usr.bin/perl/ext/XS-APItest/t/svcatpvf.t
gnu/usr.bin/perl/ext/XS-APItest/t/svpv_magic.t
gnu/usr.bin/perl/ext/XS-APItest/t/utf8.t
gnu/usr.bin/perl/ext/attributes/attributes.pm
gnu/usr.bin/perl/ext/attributes/attributes.xs
gnu/usr.bin/perl/ext/mro/mro.pm
gnu/usr.bin/perl/ext/mro/mro.xs
gnu/usr.bin/perl/ext/re/Makefile.PL
gnu/usr.bin/perl/ext/re/re.pm
gnu/usr.bin/perl/ext/re/t/lexical_debug.t
gnu/usr.bin/perl/feature.h
gnu/usr.bin/perl/globvar.sym
gnu/usr.bin/perl/gv.c
gnu/usr.bin/perl/gv.h
gnu/usr.bin/perl/handy.h
gnu/usr.bin/perl/hints/README.hints
gnu/usr.bin/perl/hints/aix.sh
gnu/usr.bin/perl/hints/catamount.sh
gnu/usr.bin/perl/hints/darwin.sh
gnu/usr.bin/perl/hints/dec_osf.sh
gnu/usr.bin/perl/hints/freebsd.sh
gnu/usr.bin/perl/hints/hpux.sh
gnu/usr.bin/perl/hints/linux.sh
gnu/usr.bin/perl/hints/openbsd.sh
gnu/usr.bin/perl/hints/os390.sh
gnu/usr.bin/perl/hints/solaris_2.sh
gnu/usr.bin/perl/hints/ultrix_4.sh [deleted file]
gnu/usr.bin/perl/hv.c
gnu/usr.bin/perl/hv.h
gnu/usr.bin/perl/hv_func.h
gnu/usr.bin/perl/inline.h
gnu/usr.bin/perl/install_lib.pl
gnu/usr.bin/perl/installperl
gnu/usr.bin/perl/intrpvar.h
gnu/usr.bin/perl/invlist_inline.h
gnu/usr.bin/perl/iperlsys.h
gnu/usr.bin/perl/keywords.c
gnu/usr.bin/perl/keywords.h
gnu/usr.bin/perl/l1_char_class_tab.h
gnu/usr.bin/perl/lib/AnyDBM_File.pm
gnu/usr.bin/perl/lib/B/Deparse-core.t
gnu/usr.bin/perl/lib/B/Deparse.pm
gnu/usr.bin/perl/lib/B/Deparse.t
gnu/usr.bin/perl/lib/B/Op_private.pm
gnu/usr.bin/perl/lib/Benchmark.pm
gnu/usr.bin/perl/lib/Benchmark.t
gnu/usr.bin/perl/lib/Class/Struct.pm
gnu/usr.bin/perl/lib/Config.t
gnu/usr.bin/perl/lib/DBM_Filter/t/encode.t
gnu/usr.bin/perl/lib/DBM_Filter/t/utf8.t
gnu/usr.bin/perl/lib/File/Basename.pm
gnu/usr.bin/perl/lib/File/Copy.pm
gnu/usr.bin/perl/lib/File/stat.pm
gnu/usr.bin/perl/lib/FileHandle.pm
gnu/usr.bin/perl/lib/Net/protoent.pm
gnu/usr.bin/perl/lib/Net/servent.pm
gnu/usr.bin/perl/lib/UNIVERSAL.pm
gnu/usr.bin/perl/lib/Unicode/UCD.t
gnu/usr.bin/perl/lib/User/grent.pm
gnu/usr.bin/perl/lib/User/pwent.pm
gnu/usr.bin/perl/lib/feature.pm
gnu/usr.bin/perl/lib/locale.t
gnu/usr.bin/perl/lib/overload.pm
gnu/usr.bin/perl/lib/overload.t
gnu/usr.bin/perl/lib/overload/numbers.pm
gnu/usr.bin/perl/lib/perl5db.pl
gnu/usr.bin/perl/lib/perl5db.t
gnu/usr.bin/perl/lib/unicore/ArabicShaping.txt
gnu/usr.bin/perl/lib/unicore/BidiBrackets.txt
gnu/usr.bin/perl/lib/unicore/BidiMirroring.txt
gnu/usr.bin/perl/lib/unicore/Blocks.txt
gnu/usr.bin/perl/lib/unicore/CJKRadicals.txt
gnu/usr.bin/perl/lib/unicore/CaseFolding.txt
gnu/usr.bin/perl/lib/unicore/CompositionExclusions.txt
gnu/usr.bin/perl/lib/unicore/DAge.txt
gnu/usr.bin/perl/lib/unicore/DCoreProperties.txt
gnu/usr.bin/perl/lib/unicore/DNormalizationProps.txt
gnu/usr.bin/perl/lib/unicore/EastAsianWidth.txt
gnu/usr.bin/perl/lib/unicore/EmojiSources.txt
gnu/usr.bin/perl/lib/unicore/HangulSyllableType.txt
gnu/usr.bin/perl/lib/unicore/Index.txt
gnu/usr.bin/perl/lib/unicore/IndicPositionalCategory.txt
gnu/usr.bin/perl/lib/unicore/IndicSyllabicCategory.txt
gnu/usr.bin/perl/lib/unicore/Jamo.txt
gnu/usr.bin/perl/lib/unicore/LineBreak.txt
gnu/usr.bin/perl/lib/unicore/NameAliases.txt
gnu/usr.bin/perl/lib/unicore/NamedSequences.txt
gnu/usr.bin/perl/lib/unicore/NamedSqProv.txt
gnu/usr.bin/perl/lib/unicore/NamesList.txt
gnu/usr.bin/perl/lib/unicore/NormalizationCorrections.txt
gnu/usr.bin/perl/lib/unicore/PropList.txt
gnu/usr.bin/perl/lib/unicore/PropValueAliases.txt
gnu/usr.bin/perl/lib/unicore/PropertyAliases.txt
gnu/usr.bin/perl/lib/unicore/ReadMe.txt
gnu/usr.bin/perl/lib/unicore/ScriptExtensions.txt
gnu/usr.bin/perl/lib/unicore/Scripts.txt
gnu/usr.bin/perl/lib/unicore/SpecialCasing.txt
gnu/usr.bin/perl/lib/unicore/StandardizedVariants.txt
gnu/usr.bin/perl/lib/unicore/UnicodeData.txt
gnu/usr.bin/perl/lib/unicore/auxiliary/GCBTest.txt
gnu/usr.bin/perl/lib/unicore/auxiliary/GraphemeBreakProperty.txt
gnu/usr.bin/perl/lib/unicore/auxiliary/LBTest.txt
gnu/usr.bin/perl/lib/unicore/auxiliary/SBTest.txt
gnu/usr.bin/perl/lib/unicore/auxiliary/SentenceBreakProperty.txt
gnu/usr.bin/perl/lib/unicore/auxiliary/WBTest.txt
gnu/usr.bin/perl/lib/unicore/auxiliary/WordBreakProperty.txt
gnu/usr.bin/perl/lib/unicore/extracted/DBidiClass.txt
gnu/usr.bin/perl/lib/unicore/extracted/DBinaryProperties.txt
gnu/usr.bin/perl/lib/unicore/extracted/DCombiningClass.txt
gnu/usr.bin/perl/lib/unicore/extracted/DDecompositionType.txt
gnu/usr.bin/perl/lib/unicore/extracted/DEastAsianWidth.txt
gnu/usr.bin/perl/lib/unicore/extracted/DGeneralCategory.txt
gnu/usr.bin/perl/lib/unicore/extracted/DJoinGroup.txt
gnu/usr.bin/perl/lib/unicore/extracted/DJoinType.txt
gnu/usr.bin/perl/lib/unicore/extracted/DLineBreak.txt
gnu/usr.bin/perl/lib/unicore/extracted/DNumType.txt
gnu/usr.bin/perl/lib/unicore/extracted/DNumValues.txt
gnu/usr.bin/perl/lib/unicore/mktables
gnu/usr.bin/perl/lib/unicore/version
gnu/usr.bin/perl/lib/utf8.pm
gnu/usr.bin/perl/lib/utf8.t
gnu/usr.bin/perl/lib/warnings.pm
gnu/usr.bin/perl/lib/warnings/register.pm
gnu/usr.bin/perl/locale.c
gnu/usr.bin/perl/make_patchnum.pl
gnu/usr.bin/perl/makedef.pl
gnu/usr.bin/perl/malloc.c
gnu/usr.bin/perl/mathoms.c
gnu/usr.bin/perl/metaconfig.h
gnu/usr.bin/perl/mg.c
gnu/usr.bin/perl/mg_names.inc
gnu/usr.bin/perl/mg_raw.h
gnu/usr.bin/perl/mg_vtable.h
gnu/usr.bin/perl/miniperlmain.c
gnu/usr.bin/perl/mkppport
gnu/usr.bin/perl/mro_core.c
gnu/usr.bin/perl/numeric.c
gnu/usr.bin/perl/op.c
gnu/usr.bin/perl/op.h
gnu/usr.bin/perl/op_reg_common.h
gnu/usr.bin/perl/opcode.h
gnu/usr.bin/perl/opnames.h
gnu/usr.bin/perl/os2/OS2/OS2-REXX/REXX.pm
gnu/usr.bin/perl/os2/os2.c
gnu/usr.bin/perl/os2/os2ish.h
gnu/usr.bin/perl/overload.h
gnu/usr.bin/perl/packsizetables.inc
gnu/usr.bin/perl/pad.c
gnu/usr.bin/perl/pad.h
gnu/usr.bin/perl/patchlevel.h
gnu/usr.bin/perl/perl.c
gnu/usr.bin/perl/perl.h
gnu/usr.bin/perl/perlapi.h
gnu/usr.bin/perl/perlio.c
gnu/usr.bin/perl/perlio.h
gnu/usr.bin/perl/perlvars.h
gnu/usr.bin/perl/perly.act
gnu/usr.bin/perl/perly.c
gnu/usr.bin/perl/perly.h
gnu/usr.bin/perl/perly.tab
gnu/usr.bin/perl/perly.y
gnu/usr.bin/perl/plan9/config.plan9
gnu/usr.bin/perl/plan9/config_h.sample
gnu/usr.bin/perl/plan9/config_sh.sample
gnu/usr.bin/perl/plan9/plan9.c
gnu/usr.bin/perl/plan9/plan9ish.h
gnu/usr.bin/perl/pod/buildtoc
gnu/usr.bin/perl/pod/perl.pod
gnu/usr.bin/perl/pod/perl5200delta.pod
gnu/usr.bin/perl/pod/perl5360delta.pod
gnu/usr.bin/perl/pod/perl5362delta.pod
gnu/usr.bin/perl/pod/perlapio.pod
gnu/usr.bin/perl/pod/perlcommunity.pod
gnu/usr.bin/perl/pod/perldata.pod
gnu/usr.bin/perl/pod/perldebguts.pod
gnu/usr.bin/perl/pod/perldebug.pod
gnu/usr.bin/perl/pod/perldelta.pod
gnu/usr.bin/perl/pod/perldiag.pod
gnu/usr.bin/perl/pod/perlexperiment.pod
gnu/usr.bin/perl/pod/perlfilter.pod
gnu/usr.bin/perl/pod/perlfunc.pod
gnu/usr.bin/perl/pod/perlgit.pod
gnu/usr.bin/perl/pod/perlguts.pod
gnu/usr.bin/perl/pod/perlhack.pod
gnu/usr.bin/perl/pod/perlhacktips.pod
gnu/usr.bin/perl/pod/perllocale.pod
gnu/usr.bin/perl/pod/perlmod.pod
gnu/usr.bin/perl/pod/perlmodinstall.pod
gnu/usr.bin/perl/pod/perlmodlib.PL
gnu/usr.bin/perl/pod/perlmodstyle.pod
gnu/usr.bin/perl/pod/perlmroapi.pod
gnu/usr.bin/perl/pod/perlnewmod.pod
gnu/usr.bin/perl/pod/perlop.pod
gnu/usr.bin/perl/pod/perlperf.pod
gnu/usr.bin/perl/pod/perlpodstyle.pod
gnu/usr.bin/perl/pod/perlport.pod
gnu/usr.bin/perl/pod/perlre.pod
gnu/usr.bin/perl/pod/perlreapi.pod
gnu/usr.bin/perl/pod/perlref.pod
gnu/usr.bin/perl/pod/perlreftut.pod
gnu/usr.bin/perl/pod/perlretut.pod
gnu/usr.bin/perl/pod/perlrun.pod
gnu/usr.bin/perl/pod/perlstyle.pod
gnu/usr.bin/perl/pod/perlsub.pod
gnu/usr.bin/perl/pod/perlsyn.pod
gnu/usr.bin/perl/pod/perlunicode.pod
gnu/usr.bin/perl/pod/perlutil.pod
gnu/usr.bin/perl/pod/perlvar.pod
gnu/usr.bin/perl/pod/perlvms.pod
gnu/usr.bin/perl/pp.c
gnu/usr.bin/perl/pp.h
gnu/usr.bin/perl/pp_ctl.c
gnu/usr.bin/perl/pp_hot.c
gnu/usr.bin/perl/pp_pack.c
gnu/usr.bin/perl/pp_proto.h
gnu/usr.bin/perl/pp_sort.c
gnu/usr.bin/perl/pp_sys.c
gnu/usr.bin/perl/proto.h
gnu/usr.bin/perl/reentr.c
gnu/usr.bin/perl/regcharclass.h
gnu/usr.bin/perl/regcomp.c
gnu/usr.bin/perl/regcomp.h
gnu/usr.bin/perl/regcomp.sym
gnu/usr.bin/perl/regen/ebcdic.pl
gnu/usr.bin/perl/regen/embed.pl
gnu/usr.bin/perl/regen/embed_lib.pl
gnu/usr.bin/perl/regen/feature.pl
gnu/usr.bin/perl/regen/keywords.pl
gnu/usr.bin/perl/regen/lib_cleanup.pl
gnu/usr.bin/perl/regen/mg_vtable.pl
gnu/usr.bin/perl/regen/mk_PL_charclass.pl
gnu/usr.bin/perl/regen/mk_invlists.pl
gnu/usr.bin/perl/regen/op_private
gnu/usr.bin/perl/regen/opcode.pl
gnu/usr.bin/perl/regen/opcodes
gnu/usr.bin/perl/regen/regcomp.pl
gnu/usr.bin/perl/regen/regen_lib.pl
gnu/usr.bin/perl/regen/unicode_constants.pl
gnu/usr.bin/perl/regen/warnings.pl
gnu/usr.bin/perl/regexec.c
gnu/usr.bin/perl/regexp.h
gnu/usr.bin/perl/regnodes.h
gnu/usr.bin/perl/scope.c
gnu/usr.bin/perl/scope.h
gnu/usr.bin/perl/sv.c
gnu/usr.bin/perl/sv.h
gnu/usr.bin/perl/t/TEST
gnu/usr.bin/perl/t/cmd/mod.t
gnu/usr.bin/perl/t/cmd/subval.t
gnu/usr.bin/perl/t/comp/package.t
gnu/usr.bin/perl/t/comp/parser.t
gnu/usr.bin/perl/t/comp/proto.t
gnu/usr.bin/perl/t/comp/require.t
gnu/usr.bin/perl/t/harness
gnu/usr.bin/perl/t/io/eintr.t
gnu/usr.bin/perl/t/io/socket.t
gnu/usr.bin/perl/t/lib/GH_15109/Apack.pm [deleted file]
gnu/usr.bin/perl/t/lib/GH_15109/Bpack.pm [deleted file]
gnu/usr.bin/perl/t/lib/GH_15109/Cpack.pm [deleted file]
gnu/usr.bin/perl/t/lib/GH_15109/Foo.pm [deleted file]
gnu/usr.bin/perl/t/lib/croak/op
gnu/usr.bin/perl/t/lib/croak/toke
gnu/usr.bin/perl/t/lib/feature/bundle
gnu/usr.bin/perl/t/lib/h2ph.pht
gnu/usr.bin/perl/t/lib/strict/vars
gnu/usr.bin/perl/t/lib/warnings/7fatal
gnu/usr.bin/perl/t/lib/warnings/9uninit
gnu/usr.bin/perl/t/lib/warnings/op
gnu/usr.bin/perl/t/lib/warnings/pp_hot
gnu/usr.bin/perl/t/lib/warnings/regexec
gnu/usr.bin/perl/t/lib/warnings/toke
gnu/usr.bin/perl/t/loc_tools.pl
gnu/usr.bin/perl/t/op/anonsub.t
gnu/usr.bin/perl/t/op/array.t
gnu/usr.bin/perl/t/op/attrs.t
gnu/usr.bin/perl/t/op/blocks.t
gnu/usr.bin/perl/t/op/caller.t
gnu/usr.bin/perl/t/op/coreamp.t
gnu/usr.bin/perl/t/op/coresubs.t
gnu/usr.bin/perl/t/op/die.t
gnu/usr.bin/perl/t/op/each.t
gnu/usr.bin/perl/t/op/eval.t
gnu/usr.bin/perl/t/op/for.t
gnu/usr.bin/perl/t/op/fork.t
gnu/usr.bin/perl/t/op/getppid.t
gnu/usr.bin/perl/t/op/glob.t
gnu/usr.bin/perl/t/op/goto.t
gnu/usr.bin/perl/t/op/heredoc.t
gnu/usr.bin/perl/t/op/hexfp.t
gnu/usr.bin/perl/t/op/inccode.t
gnu/usr.bin/perl/t/op/lex.t
gnu/usr.bin/perl/t/op/lex_assign.t
gnu/usr.bin/perl/t/op/magic.t
gnu/usr.bin/perl/t/op/method.t
gnu/usr.bin/perl/t/op/pack.t
gnu/usr.bin/perl/t/op/readline.t
gnu/usr.bin/perl/t/op/ref.t
gnu/usr.bin/perl/t/op/require_errors.t
gnu/usr.bin/perl/t/op/signatures.t
gnu/usr.bin/perl/t/op/smartmatch.t
gnu/usr.bin/perl/t/op/sort.t
gnu/usr.bin/perl/t/op/sprintf.t
gnu/usr.bin/perl/t/op/sprintf2.t
gnu/usr.bin/perl/t/op/srand.t
gnu/usr.bin/perl/t/op/sselect.t
gnu/usr.bin/perl/t/op/state.t
gnu/usr.bin/perl/t/op/sub.t
gnu/usr.bin/perl/t/op/switch.t
gnu/usr.bin/perl/t/op/taint.t
gnu/usr.bin/perl/t/op/tie.t
gnu/usr.bin/perl/t/op/tie_fetch_count.t
gnu/usr.bin/perl/t/op/undef.t
gnu/usr.bin/perl/t/op/vec.t
gnu/usr.bin/perl/t/perf/benchmarks
gnu/usr.bin/perl/t/perf/opcount.t
gnu/usr.bin/perl/t/porting/bincompat.t
gnu/usr.bin/perl/t/porting/customized.dat
gnu/usr.bin/perl/t/porting/customized.t
gnu/usr.bin/perl/t/porting/diag.t
gnu/usr.bin/perl/t/porting/dual-life.t
gnu/usr.bin/perl/t/porting/exec-bit.t
gnu/usr.bin/perl/t/porting/globvar.t
gnu/usr.bin/perl/t/porting/known_pod_issues.dat
gnu/usr.bin/perl/t/porting/libperl.t
gnu/usr.bin/perl/t/porting/manifest.t
gnu/usr.bin/perl/t/porting/pending-author.t [deleted file]
gnu/usr.bin/perl/t/porting/podcheck.t
gnu/usr.bin/perl/t/porting/regen.t
gnu/usr.bin/perl/t/re/charset.t
gnu/usr.bin/perl/t/re/pat.t
gnu/usr.bin/perl/t/re/pat_advanced.t
gnu/usr.bin/perl/t/re/pat_re_eval.t
gnu/usr.bin/perl/t/re/pat_rt_report.t
gnu/usr.bin/perl/t/re/qr-72922.t
gnu/usr.bin/perl/t/re/re_tests
gnu/usr.bin/perl/t/re/reg_mesg.t
gnu/usr.bin/perl/t/re/regex_sets.t
gnu/usr.bin/perl/t/re/regexp.t
gnu/usr.bin/perl/t/re/speed.t
gnu/usr.bin/perl/t/re/subst.t
gnu/usr.bin/perl/t/run/fresh_perl.t
gnu/usr.bin/perl/t/run/locale.t
gnu/usr.bin/perl/t/run/switchDx.t
gnu/usr.bin/perl/t/test.pl
gnu/usr.bin/perl/t/uni/method.t
gnu/usr.bin/perl/t/uni/overload.t
gnu/usr.bin/perl/t/uni/package.t
gnu/usr.bin/perl/t/uni/parser.t
gnu/usr.bin/perl/t/uni/stash.t
gnu/usr.bin/perl/t/uni/variables.t
gnu/usr.bin/perl/taint.c
gnu/usr.bin/perl/thread.h
gnu/usr.bin/perl/time64.c
gnu/usr.bin/perl/toke.c
gnu/usr.bin/perl/uconfig.h
gnu/usr.bin/perl/uconfig.sh
gnu/usr.bin/perl/uconfig64.sh
gnu/usr.bin/perl/unicode_constants.h
gnu/usr.bin/perl/universal.c
gnu/usr.bin/perl/unixish.h
gnu/usr.bin/perl/utf8.c
gnu/usr.bin/perl/utf8.h
gnu/usr.bin/perl/utfebcdic.h
gnu/usr.bin/perl/util.c
gnu/usr.bin/perl/util.h
gnu/usr.bin/perl/utils.lst
gnu/usr.bin/perl/utils/Makefile.PL
gnu/usr.bin/perl/utils/h2ph.PL
gnu/usr.bin/perl/utils/perlbug.PL
gnu/usr.bin/perl/vms/descrip_mms.template
gnu/usr.bin/perl/vms/gen_shrfls.pl
gnu/usr.bin/perl/vms/vms.c
gnu/usr.bin/perl/vms/vmsish.h
gnu/usr.bin/perl/vutil.c
gnu/usr.bin/perl/warnings.h
gnu/usr.bin/perl/win32/GNUmakefile
gnu/usr.bin/perl/win32/Makefile
gnu/usr.bin/perl/win32/config.gc
gnu/usr.bin/perl/win32/config.vc
gnu/usr.bin/perl/win32/config_H.gc
gnu/usr.bin/perl/win32/config_H.vc
gnu/usr.bin/perl/win32/config_sh.PL
gnu/usr.bin/perl/win32/fcrypt.c
gnu/usr.bin/perl/win32/include/sys/socket.h
gnu/usr.bin/perl/win32/perlhost.h
gnu/usr.bin/perl/win32/perllib.c
gnu/usr.bin/perl/win32/pod.mak
gnu/usr.bin/perl/win32/vmem.h
gnu/usr.bin/perl/win32/win32.c
gnu/usr.bin/perl/win32/win32.h
gnu/usr.bin/perl/win32/win32iop.h
gnu/usr.bin/perl/win32/win32sck.c

diff --git a/gnu/usr.bin/perl/.travis.yml b/gnu/usr.bin/perl/.travis.yml
deleted file mode 100644 (file)
index 51f83e1..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-language: c
-cache: ccache
-
-os:
-  - linux
-
-compiler:
-  - gcc
-
-install:
-  - git fetch --unshallow --tags # t/porting/cmp_version.t
-  # install & enable ccache on osx
-  - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew update && brew install ccache; fi
-  - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then export PATH="/usr/local/opt/ccache/libexec:$PATH"; fi
-
-env:
-    global:
-        - JOBS=4
-    matrix:
-        # exercise a variety of build options
-        # threads often cause build issues
-        - CONFIGURE_ARGS='-Uusethreads'
-        - CONFIGURE_ARGS='-Dusethreads'
-        # check long doubles
-        - CONFIGURE_ARGS='-Duseshrplib -Dusesitecustomize -Duselongdouble'
-        # exercise quadmath
-        - CONFIGURE_ARGS='-Duseshrplib -Dusequadmath -Dusecbacktrace -Dusethreads'
-
-matrix:
-  fast_finish: true
-
-script:
-  - ./Configure -des -Dusedevel -Uversiononly -Dcc="ccache $CC" $CONFIGURE_ARGS -Dprefix=$HOME/perl-blead -DDEBUGGING
-# all script commands are always run
-# rather than using one very long oneliner using '&&', just always check the build status
-  - if [ "x$TRAVIS_TEST_RESULT" = "x0" ]; then TEST_JOBS=$JOBS make -j$JOBS test_harness_notty; fi
-  - if [ "x$TRAVIS_TEST_RESULT" = "x0" ]; then make -j$JOBS install; fi
-  - if [ "x$TRAVIS_TEST_RESULT" = "x0" ]; then $HOME/perl-blead/bin/perlivp; fi
-
-addons:
-    apt:
-        packages:
-            - file
-            - cpio
-            - libdb-dev
-            - libgdbm-dev
-            - zlib1g-dev
-            - libbz2-dev
-
-notifications:
-## use dedicated email for smoking ?
-#  email:
-#    recipients:
-#      - perl5-porters@perl.org
-#    on_success: never  # default: change
-#    on_failure: always # default: always
-  irc:
-    nick: travisci
-    channels:
-      - "irc.perl.org#p5p-qa"
-#      - "irc.perl.org#bot-test"
-    template:
-      - "Report for %{repository} (%{commit}) from %{author} (%{elapsed_time})"
-      - "Status: %{message}"
-      - "Build URL: %{build_url}"
-      - "GitHub URL: https://github.com/%{repository_slug}/commit/%{commit}"
-    on_success: change # default: always
-    on_failure: always # default: always
-#    use_notice: true
index 8f25e9d..6bf0e1e 100644 (file)
 # is strictly forbidden.  (Passive distribution with the Perl source
 # code kit is, of course, allowed.)
 #
-# This should contain the preferred addresses.  Alternate addresses are in
-# Porting/checkAUTHORS.pl.
-#
-# updated_by: ./Porting/checkAUTHORS.pl --update --from=v5.30.0
+# This file contains the "canonical" or "preferred" details for our
+# contributors, and is managed by the Porting/updateAUTHORS.pl script,
+# along with .mailmap and Porting/exclude_contrib.txt. Generally you
+# should use the script to make any changes to this file, especially if
+# you wish to remove yourself. If you wish to register a new email
+# against one of these names you should update the .mailmap file
+# instead.
 -- 
 A. C. Yardley                  <yardley@tanet.net>
 A. Sinan Unur                  <nanis@cpan.org>
@@ -56,7 +59,8 @@ Albert Chin-A-Young            <china@thewrittenword.com>
 Albert Dvornik                 <bert@alum.mit.edu>
 Alberto Simões                 <ambs@cpan.org>
 Alessandro Forghieri           <alf@orion.it>
-Alex Davies                    <adavies@ptc.com>
+Alex                           <aleksandrosansan@gmail.com>
+Alex Davies                    <alex.davies501@gmail.com>
 Alex Gough                     <alex@rcon.org>
 Alex Solovey                   <a.solovey@gmail.com>
 Alex Vandiver                  <alexmv@mit.edu>
@@ -69,6 +73,7 @@ Alexander Gernler              <alexander_gernler@genua.de>
 Alexander Gough                <alex-p5p@earth.li>
 Alexander Hartmaier            <abraxxa@cpan.org>
 Alexander Klimov               <ask@wisdom.weizmann.ac.il>
+Alexander Nikolov              <sasho648@gmail.com>
 Alexander Smishlajev           <als@turnhere.com>
 Alexander Voronov              <alexander-voronov@yandex.ru>
 Alexandr Ciornii               <alexchorny@gmail.com>
@@ -106,6 +111,7 @@ Andrew Hamm                    <AHamm@civica.com.au>
 Andrew M. Langmead             <aml@world.std.com>
 Andrew Pimlott                 <pimlott@idiomtech.com>
 Andrew Rodland                 <arodland@cpan.org>
+Andrew Ruthven                 <andrew@etc.gen.nz>
 Andrew Savige                  <ajsavige@yahoo.com.au>
 Andrew Tam                     <andrewtam000@gmail.com>
 Andrew Vignaux                 <ajv@nz.sangacorp.com>
@@ -128,6 +134,7 @@ Aristotle Pagaltzis            <pagaltzis@gmx.de>
 Arjen Laarhoven                <arjen@nl.demon.net>
 Arkturuz                       <arkturuz@gmail.com>
 Arne Ahrend                    <aahrend@web.de>
+Arne Johannessen               <ajnn@cpan.org>
 Arnold D. Robbins              <arnold@gnu.ai.mit.edu>
 Art Green                      <Art_Green@mercmarine.com>
 Art Haas                       <ahaas@airmail.net>
@@ -148,6 +155,8 @@ Bah                            <bah@longitude.com>
 Barrie Slaymaker               <barries@slaysys.com>
 Barry Friedman
 Bart Kedryna                   <bkedryna@home.com>
+Bart Van Assche                <bvanassche@acm.org>
+Bartosz Jarzyna                <bbrtj.pro@gmail.com>
 Bas van Sisseren               <bas@quarantainenet.nl>
 Beau Cox
 Ben Carter                     <bcarter@gumdrop.flyinganvil.org>
@@ -217,6 +226,7 @@ Brian S. Cashman               <bsc@umich.edu>
 Brian Strand                   <bstrand@switchmanagement.com>
 Brooks D. Boyd
 Bruce Barnett                  <barnett@grymoire.crd.ge.com>
+Bruce Gray                     <bruce.gray@acm.org>
 Bruce J. Keeler                <bkeelerx@iwa.dp.intel.com>
 Bruce P. Schuck                <bruce@aps.org>
 Bryan Stenson                  <bryan@siliconvortex.com>
@@ -283,6 +293,7 @@ Chunhui Teng                   <cteng@nortel.ca>
 Claes Jacobsson                <claes@surfar.nu>
 Clark Cooper                   <coopercc@netheaven.com>
 Claudio Ramirez                <nxadm@cpan.org>
+Clemens Wasser                 <clemens.wasser@gmail.com>
 Clinton A. Pierce              <clintp@geeksalad.org>
 Clinton Gormley
 Colin Kuskie                   <ckuskie@cadence.com>
@@ -331,6 +342,7 @@ Daniel P. Berrange             <dan@berrange.com>
 Daniel Perrett                 <perrettdl@googlemail.com>
 Daniel S. Lewart               <lewart@uiuc.edu>
 Daniel Yacob                   <perl@geez.org>
+danielnachun                   <daniel.nachun@gmail.com>
 Danny R. Faught                <faught@mailhost.rsn.hp.com>
 Danny Rathjens
 Danny Sadinoff                 <danny-cpan@sadinoff.com>
@@ -425,6 +437,7 @@ Earl Hood
 Ed Avis                        <eda@waniasset.com>
 Ed J                           <etj@cpan.org>
 Ed Mooring                     <mooring@Lynx.COM>
+Ed Sabol                       <esabol@users.noreply.github.com>
 Ed Santiago                    <esm@pobox.com>
 Eddy Tan                       <eddy.net@gmail.com>
 Edgar Bering                   <trizor@gmail.com>
@@ -443,7 +456,6 @@ Eric Brine                     <ikegami@adaelis.com>
 Eric E. Coe                    <Eric.Coe@oracle.com>
 Eric Fifer                     <egf7@columbia.edu>
 Eric Herman                    <eric@freesa.org>
-Eric Lindblad                  <lindblad@gmx.com>
 Eric Melville
 Eric Promislow                 <ericp@ActiveState.com>
 Erich Rickheit
@@ -459,8 +471,10 @@ Fabien Tassin                  <tassin@eerie.fr>
 Father Chrysostomos            <sprout@cpan.org>
 Felipe Gasper                  <felipe@felipegasper.com>
 Felix Gallo                    <fgallo@etoys.com>
+Ferenc Erki                    <ferki@cpan.org>
 Fergal Daly                    <fergal@esatclear.ie>
 Fingle Nark                    <finglenark@gmail.com>
+Firas Khalil Khana             <firasuke@gmail.com>
 Florent Guillaume
 Florian Ragwitz                <rafl@debian.org>
 Florian Weimer                 <fweimer@redhat.com>
@@ -499,7 +513,6 @@ Gideon Israel Dsouza           <gideon@cpan.org>
 Giles Lean                     <giles@nemeton.com.au>
 Giovanni Tataranni             <gtataranni@users.noreply.github.com>
 Gisle Aas                      <gisle@aas.no>
-GitHub                         <noreply@github.com>
 Glenn D. Golden                <gdg@zplane.com>
 Glenn Linderman                <perl@nevcal.com>
 Gomar                          <gomar@md.media-web.de>
@@ -721,6 +734,7 @@ John W. Krahn
 John Wright                    <john@johnwright.org>
 Johnny Lam                     <jlam@jgrind.org>
 Jon Eveland                    <jweveland@yahoo.com>
+Jon Gentle                     <atrodo@atrodo.org>
 Jon Gunnip                     <jongunnip@hotmail.com>
 Jon Orwant                     <orwant@oreilly.com>
 Jonathan Biggar                <jon@sems.com>
@@ -780,6 +794,7 @@ Ken Williams                   <ken@mathforum.org>
 Kenichi Ishigaki               <ishigaki@cpan.org>
 Kenneth Albanowski             <kjahds@kjahds.com>
 Kenneth Duda                   <kjd@cisco.com>
+Kenneth Ölwing                 <knth@cpan.org>
 Kent Fredric                   <kentfredric@gmail.com>
 Keong Lim                      <Keong.Lim@sr.com.au>
 Kevin Brintnall                <kbrint@rufus.net>
@@ -800,6 +815,7 @@ Kragen Sitaker                 <kragen@pobox.com>
 Krishna Sethuraman             <krishna@sgi.com>
 Kriton Kyrimis                 <kyrimis@princeton.edu>
 Kurt D. Starsinic              <kstar@wolfetech.com>
+Kurt Fitzner                   <kurt@va1der.ca>
 Kyriakos Georgiou
 Lajos Veres                    <vlajos@gmail.com>
 Larry Parmelee                 <parmelee@CS.Cornell.EDU>
@@ -822,9 +838,11 @@ Leon Brocard                   <acme@astray.com>
 Leon Timmermans                <fawaka@gmail.com>
 Les Peters                     <lpeters@aol.net>
 Lesley Binks                   <lesley.binks@gmail.com>
+Li Linjie                      <lilinjie@uniontech.com>
 Lincoln D. Stein               <lstein@cshl.org>
 Linda Walsh
 Lionel Cons                    <lionel.cons@cern.ch>
+Loren Merritt                  <pengvado@videolan.org>
 Louis Strous                   <louis.strous@gmail.com>
 Lubomir Rintel                 <lkundrak@v3.sk>
 Luc St-Louis                   <luc.st-louis@ca.transport.bombardier.com>
@@ -850,6 +868,7 @@ Marc Reisner                   <reisner.marc@gmail.com>
 Marc Simpson                   <marc@0branch.com>
 Marc-Philip Werner             <marc-philip.werner@sap.com>
 Marcel Grünauer                <marcel@codewerk.com>
+Marcel Telka                   <marcel@telka.sk>
 Marco Fontani                  <MFONTANI@cpan.org>
 Marco Peereboom                <marco@conformal.com>
 Marcus Holland-Moritz          <mhx-perl@gmx.net>
@@ -864,7 +883,7 @@ Mark Dootson                   <mdootson@cpan.org>
 Mark Fowler                    <mark@twoshortplanks.com>
 Mark Hanson
 Mark J. Reed                   <mreed@strange.turner.com>
-Mark Jason Dominus             <mjd@plover.com>
+Mark Jason Dominus             <mjd@pobox.com>
 Mark K Trettin                 <mkt@lucent.com>
 Mark Kaehny                    <kaehny@execpc.com>
 Mark Kettenis                  <kettenis@wins.uva.nl>
@@ -879,6 +898,7 @@ Mark P. Lutz                   <mark.p.lutz@boeing.com>
 Mark Pease                     <peasem@primenet.com>
 Mark Pizzolato                 <mark@infocomm.com>
 Mark R. Levinson               <mrl@isc.upenn.edu>
+Mark Shelor                    <mshelor@cpan.org>
 Mark Stosberg                  <mark@summersault.com>
 Marko Asplund                  <aspa@merlot.kronodoc.fi>
 Markus Jansen                  <Markus.Jansen@ericsson.com>
@@ -916,13 +936,14 @@ Matt Turner                    <mattst88@gmail.com>
 Matthew Black                  <black@csulb.edu>
 Matthew Green                  <mrg@splode.eterna.com.au>
 Matthew Horsfall               <wolfsage@gmail.com>
+Matthew O. Persico             <matthew.persico@gmail.com>
 Matthew Sachs                  <matthewg@zevils.com>
 Matthew T Harden               <mthard@mthard1.monsanto.com>
 Matthias Bethke                <matthias@towiski.de>
 Matthias Ulrich Neeracher      <neeracher@mac.com>
 Matthias Urlichs               <smurf@noris.net>
 Matthijs van Duin              <xmath@cpan.org>
-Mattia Barbon                  <mbarbon@dsi.unive.it>
+Mattia Barbon                  <mattia@barbon.org>
 Maurizio Loreti                <maurizio.loreti@pd.infn.it>
 Max Baker                      <max@warped.org>
 Max Maischein                  <corion@corion.net>
@@ -972,6 +993,7 @@ Mikhail Zabaluev               <mhz@alt-linux.org>
 Milosz Tanski                  <mtanski@gridapp.com>
 Milton L. Hankins              <mlh@swl.msd.ray.com>
 Misty De Meo                   <mistydemeo@github.com>
+Mohammad S Anwar               <Mohammad.Anwar@yahoo.com>
 Mohammed El-Afifi              <mohammed_elafifi@yahoo.com>
 Moritz Lenz                    <moritz@casella.verplant.org>
 Moshe Kaminsky                 <kaminsky@math.huji.ac.il>
@@ -980,6 +1002,7 @@ Mr. Nobody                     <mrnobo1024@yahoo.com>
 Murray Nesbitt                 <murray@nesbitt.ca>
 Nathan Glenn                   <garfieldnate@gmail.com>
 Nathan Kurz                    <nate@valleytel.net>
+Nathan Mills                   <38995150+quipyowert2@users.noreply.github.com>
 Nathan Torkington              <gnat@frii.com>
 Nathan Trapuzzano              <nbtrap@nbtrap.com>
 Neale Ferguson                 <neale@VMA.TABNSW.COM.AU>
@@ -998,6 +1021,7 @@ Nick Johnston                  <nickjohnstonsky@gmail.com>
 Nick Logan                     <ugexe@cpan.org>
 Nick Williams                  <Nick.Williams@morganstanley.com>
 Nicolas Kaiser                 <nikai@nikai.net>
+Nicolas Mendoza                <mendoza@pvv.ntnu.no>
 Nicolas R                      <atoomic@cpan.org>
 Niels Thykier                  <niels@thykier.net>
 Nigel Sandever                 <njsandever@hotmail.com>
@@ -1080,6 +1104,7 @@ Peter J. Farley III            <pjfarley@banet.net>
 Peter J. Holzer                <hjp@hjp.at>
 Peter Jaspers-Fayer
 Peter John Acklam              <pjacklam@online.no>
+Peter Levine                   <plevine457@gmail.com>
 Peter Liscovius
 Peter Martini                  <PeterCMartini@GMail.com>
 Peter O'Gorman                 <peter@pogma.com>
@@ -1246,12 +1271,12 @@ Shirakata Kentaro              <argrath@ub32.org>
 Shishir Gundavaram             <shishir@ruby.ora.com>
 Shlomi Fish                    <shlomif@cpan.org>
 Shoichi Kaji                   <skaji@cpan.org>
+Sidney Markowitz               <sidney@sidney.com>
 Simon Cozens                   <simon@netthink.co.uk>
 Simon Glover                   <scog@roe.ac.uk>
 Simon Leinen
 Simon Parsons                  <S.Parsons@ftel.co.uk>
 Simon Schubert                 <corecode@fs.ei.tum.de>
-Sinan Unur                     <sinan@unur.com>
 Sisyphus                       <sisyphus@cpan.org>
 Sizhe Zhao                     <prc.zhao@outlook.com>
 Slaven Rezic                   <slaven@rezic.de>
@@ -1370,6 +1395,7 @@ Torsten Foertsch               <torsten.foertsch@gmx.net>
 Torsten Schönfeld              <kaffeetisch@gmx.de>
 Trevor Blackwell               <tlb@viaweb.com>
 Tsutomu IKEGAMI                <t-ikegami@aist.go.jp>
+Tsuyoshi Watanabe              <twata_1@yahoo.co.jp>
 Tuomas J. Lukka                <tjl@lukka.student.harvard.edu>
 Tye McQueen                    <tye@metronet.com>
 Ulrich Habel                   <rhaen@NetBSD.org>
@@ -1389,12 +1415,12 @@ Vincent Pit                    <perl@profvince.com>
 Vishal Bhatia                  <vishal@deja.com>
 Vitali Peil                    <vitali.peil@uni-bielefeld.de>
 vividsnow                      <vividsnow@gmail.com>
-vividsnow                      @vividsnow
 Vlad Harchev                   <hvv@hippo.ru>
 Vladimir Alexiev               <vladimir@cs.ualberta.ca>
 Vladimir Marek                 <vlmarek@volny.cz>
 Vladimir Timofeev              <vovkasm@gmail.com>
 Volker Schatz                  <perldoc@volkerschatz.com>
+vsfos                          <vsfos@foxmail.com>
 W. Geoffrey Rommel             <grommel@sears.com>
 W. Phillip Moore               <wpm@ms.com>
 Wallace Reis                   <wreis@cpan.org>
@@ -1437,3 +1463,4 @@ Zefram                         <zefram@fysh.org>
 Zsbán Ambrus                   <ambrus@math.bme.hu>
 Ævar Arnfjörð Bjarmason        <avar@cpan.org>
 Михаил Козачков                <mchlkzch@gmail.com>
+小鸡                             <345865759@163.com>
index 5c5cf89..e261cb9 100644 (file)
@@ -391,6 +391,7 @@ d_attribute_nonnull=''
 d_attribute_noreturn=''
 d_attribute_pure=''
 d_attribute_unused=''
+d_attribute_visibility=''
 d_attribute_warn_unused_result=''
 d_printf_format_null=''
 d_backtrace=''
@@ -761,6 +762,7 @@ d_semget=''
 d_semop=''
 d_sendmsg=''
 d_setegid=''
+d_setenv=''
 d_seteuid=''
 d_setgrent=''
 d_setgrent_r=''
@@ -1069,6 +1071,7 @@ i_sysselct=''
 i_sysstat=''
 i_sysstatfs=''
 i_sysstatvfs=''
+i_syssyscall=''
 i_systimes=''
 i_systypes=''
 i_sysuio=''
@@ -1207,6 +1210,11 @@ version_patchlevel_string=''
 perl5=''
 perladmin=''
 perlpath=''
+i32dformat=''
+u32XUformat=''
+u32oformat=''
+u32uformat=''
+u32xformat=''
 d_nv_preserves_uv=''
 d_nv_zero_is_allbits_zero=''
 i16size=''
@@ -1503,7 +1511,7 @@ archname=''
 usereentrant='undef'
 : List of libraries we want.
 : If anyone needs extra -lxxx, put those in a hint file.
-libswanted="cl pthread socket bind inet nsl ndbm gdbm dbm db malloc dl ld"
+libswanted="cl pthread socket bind inet ndbm gdbm dbm db malloc dl ld"
 libswanted="$libswanted sun m crypt sec util c cposix posix ucb bsd BSD"
 : We probably want to search /usr/shlib before most other libraries.
 : This is only used by the lib/ExtUtils/MakeMaker.pm routine extliblist.
@@ -2213,6 +2221,7 @@ $startsh
 xxxm=\$dflt
 $myecho
 ans='!'
+counter=42
 case "\$fastread" in
 yes) case "\$dflt" in
        '') ;;
@@ -2287,6 +2296,12 @@ while expr "X\$ans" : "X!" >/dev/null; do
                $myecho
                ;;
        esac
+       counter=\`echo \$counter | awk '{ print --\$0 }'\`
+       if [ \$counter = 0 ]; then
+               echo >&4
+               echo >&4 Too many attempts asking the same question.  Giving up.
+               exit 1
+       fi
 done
 case "\$ans" in
 '') ans="\$xxxm";;
@@ -3492,7 +3507,10 @@ EOM
                        osvers="$3"
                        ;;
                dragonfly) osname=dragonfly
-                       osvers="$3"
+                       case "$3" in
+                           [0-9]*) osvers="$3" ;;
+                           *) osvers="$2" ;;
+                       esac
                        ;;
                dynixptx*) osname=dynixptx
                        osvers=`echo "$4"|sed 's/^v//'`
@@ -3665,47 +3683,47 @@ EOM
                fi
        fi
 
-        case "$targetarch" in
-        '') ;;
-        *)  hostarch=$osname
-            case "$targetarch" in
-                nto*|*-nto-*)
-                    # Will load qnx.sh, which should change osname to nto
-                    osname=qnx
-                    osvers=''
-                    ;;
-                *linux-android*)
-                    # Catch arm-linux-androideabi, mipsel-linux-android,
-                    # and i686-linux-android
-                    osname=linux-android
-                    osvers=''
-                    ;;
-                *linux*)
-                    # Something like arm-linux-gnueabihf is really just
-                    # plain linux.
-                    osname=linux
-                    osvers=''
-                    ;;
-                *solaris*|*sunos*)
-                    osname=solaris
-                    # XXX perhaps we should just assume
-                    # osvers to be 2, or maybe take the value
-                    # from targetarch. Using $run before the
-                    # hints are run is somewhat icky.
-                    set X `$run $uname -a 2>/dev/null`
-                    shift
-                    case "$3" in
-                        5*) osvers=`echo $3 | $sed 's/^5/2/g'` ;;
-                        *)  osvers="$3" ;;
-                    esac
-                    ;;
-                *)
+       case "$targetarch" in
+       '') ;;
+       *)  hostarch=$osname
+           case "$targetarch" in
+               nto*|*-nto-*)
+                   # Will load qnx.sh, which should change osname to nto
+                   osname=qnx
+                   osvers=''
+                   ;;
+               *linux-android*)
+                   # Catch arm-linux-androideabi, mipsel-linux-android,
+                   # and i686-linux-android
+                   osname=linux-android
+                   osvers=''
+                   ;;
+               *linux*)
+                   # Something like arm-linux-gnueabihf is really just
+                   # plain linux.
+                   osname=linux
+                   osvers=''
+                   ;;
+               *solaris*|*sunos*)
+                   osname=solaris
+                   # XXX perhaps we should just assume
+                   # osvers to be 2, or maybe take the value
+                   # from targetarch. Using $run before the
+                   # hints are run is somewhat icky.
+                   set X `$run $uname -a 2>/dev/null`
+                   shift
+                   case "$3" in
+                       5*) osvers=`echo $3 | $sed 's/^5/2/g'` ;;
+                       *)  osvers="$3" ;;
+                   esac
+                   ;;
+               *)
                    osname=`echo $targetarch|sed 's,^[^-]*-,,'`
                    osvers=''
-                ;;
-            esac
-            ;;
-        esac
+               ;;
+           esac
+           ;;
+       esac
 
        : Now look for a hint file osname_osvers, unless one has been
        : specified already.
@@ -5207,26 +5225,6 @@ EOM
     esac
 fi
 
-: Check if quadmath is requested
-case "$usequadmath" in
-"$define"|true|[yY]*) usequadmath="$define" ;;
-*)                    usequadmath="$undef"  ;;
-esac
-
-: Fail if both uselongdouble and usequadmath are requested
-case "$usequadmath:$uselongdouble" in
-define:define)
-       $cat <<EOM >&4
-
-*** You requested the use of the quadmath library and use
-*** of long doubles.
-***
-*** Please select one or the other.
-EOM
-       exit 1
-       ;;
-esac
-
 : Looking for optional libraries
 echo " "
 echo "Checking for optional libraries..." >&4
@@ -5243,9 +5241,6 @@ esac
 case "$usecbacktrace" in
 "$define") libswanted="$libswanted bfd" ;;
 esac
-case "$usequadmath" in
-"$define") libswanted="$libswanted quadmath" ;;
-esac
 libsfound=''
 libsfiles=''
 libsdirs=''
@@ -5264,6 +5259,16 @@ for thislib in $libswanted; do
                $test -f "$xxx" && eval $libscheck
                $test -f "$xxx" && libstyle=shared
            fi
+           if test ! -f "$xxx"; then
+               xxx=$thisdir/lib$thislib.$so$_a
+               $test -f "$xxx" && eval $libscheck
+               $test -f "$xxx" && libstyle="import"
+           fi
+           if test ! -f "$xxx"; then
+               xxx=$thisdir/$thislib.$so$_a
+               $test -f "$xxx" && eval $libscheck
+               $test -f "$xxx" && libstyle="import"
+           fi
            if test ! -f "$xxx"; then
                xxx=$thisdir/lib$thislib.$so
                $test -f "$xxx" && eval $libscheck
@@ -5299,14 +5304,14 @@ for thislib in $libswanted; do
                case " $dflt " in
                *"-l$thislib "*);;
                *) dflt="$dflt -l$thislib"
-                   libsfound="$libsfound $xxx"
-                   yyy=`basename $xxx`
-                   libsfiles="$libsfiles $yyy"
-                   yyy=`echo $xxx|$sed -e "s%/$yyy\\$%%"`
-                   case " $libsdirs " in
-                   *" $yyy "*) ;;
-                   *) libsdirs="$libsdirs $yyy" ;;
-                   esac
+                  libsfound="$libsfound $xxx"
+                  yyy=`basename $xxx`
+                  libsfiles="$libsfiles $yyy"
+                  yyy=`echo $xxx|$sed -e "s%/$yyy\\$%%"`
+                  case " $libsdirs " in
+                  *" $yyy "*) ;;
+                  *) libsdirs="$libsdirs $yyy" ;;
+                  esac
                   ;;
                esac
                break
@@ -5447,25 +5452,6 @@ default|recommended)
                eval $checkccflag
                ;;
        esac
-       case "$gccversion" in
-       1*) ;;
-       2*) ;;
-       ?*)     echo " "
-               echo "Checking if your compiler accepts -fno-delete-null-pointer-checks" 2>&1
-               echo 'int main(void) { return 0; }' > gcctest.c
-               if $cc -O2 -fno-delete-null-pointer-checks -o gcctest gcctest.c; then
-                       echo "Yes, it does." 2>&1
-                       case "$ccflags" in
-                       *delete-null-pointer-checks*)
-                               echo "Leaving current flags $ccflags alone." 2>&1
-                               ;;
-                       *) dflt="$dflt -fno-delete-null-pointer-checks" ;;
-                       esac
-               else
-                       echo "Nope, it doesn't, but that's ok." 2>&1
-               fi
-               ;;
-       esac
        # For gcc, adding -pipe speeds up compilations for some, but apparently
        # some assemblers can't read from stdin.  (It also slows down compilations
        # in other cases, but those are apparently rarer these days.)  AD 5/2004.
@@ -7141,6 +7127,26 @@ if test "${api_revision}${api_version}${api_subversion}" = "550"; then
        api_versionstring='5.005'
 fi
 
+: Check if quadmath is requested
+case "$usequadmath" in
+"$define"|true|[yY]*) usequadmath="$define" ;;
+*)                    usequadmath="$undef"  ;;
+esac
+
+: Fail if both uselongdouble and usequadmath are requested
+case "$usequadmath:$uselongdouble" in
+define:define)
+       $cat <<EOM >&4
+
+*** You requested the use of the quadmath library and use
+*** of long doubles.
+***
+*** Please select one or the other.
+EOM
+       exit 1
+       ;;
+esac
+
 : determine the architecture name
 echo " "
 if xxx=`./loc arch blurfl $pth`; $test -f "$xxx"; then
@@ -7758,36 +7764,6 @@ case "$inc_version_list" in
 esac
 $rm -f getverlist
 
-: see if malloc/malloc.h has to be included
-set malloc/malloc.h i_mallocmalloc
-eval $inhdr
-
-: see if this is a malloc.h system
-: we want a real compile instead of Inhdr because some systems have a
-: malloc.h that just gives a compile error saying to use stdlib.h instead
-echo " "
-$cat >try.c <<EOCP
-#include <stdlib.h>
-#include <malloc.h>
-#$i_mallocmalloc I_MALLOCMALLOC
-#ifdef I_MALLOCMALLOC
-# include <malloc/malloc.h>
-#endif
-
-int main () { return 0; }
-EOCP
-set try
-if eval $compile; then
-    echo "<malloc.h> found." >&4
-    val="$define"
-else
-    echo "<malloc.h> NOT found." >&4
-    val="$undef"
-fi
-$rm_try
-set i_malloc
-eval $setvar
-
 : check for length of pointer
 echo " "
 case "$ptrsize" in
@@ -10756,7 +10732,7 @@ while test $# -ge 2; do
     shift 2
 done
 cat >> try.c <<'EOCP'
-#define        _(args) args
+#define _(args) args
 EOCP
 echo "$foo" >> try.c
 echo 'int no_real_function_has_this_name _((void)) { return 0; }' >> try.c
@@ -11321,6 +11297,34 @@ set d_attribute_always_inline
 eval $setvar
 $rm -f attrib*
 
+: Look for GCC-style attribute visibility
+case "$d_attribute_visibility" in
+'')
+echo " "
+echo "Checking whether your compiler can handle __attribute__((visibility)) ..." >&4
+$cat >attrib.c <<'EOCP'
+#include <stdio.h>
+__attribute__((visibility("hidden"))) int I_will_be_hidden(void);
+EOCP
+if $cc $ccflags -c attrib.c >attrib.out 2>&1 ; then
+       if $compiler_warning attrib.out >/dev/null 2>&1; then
+               echo "Your C compiler doesn't support __attribute__((visibility))."
+               val="$undef"
+       else
+               echo "Your C compiler supports __attribute__((visibility))."
+               val="$define"
+       fi
+else
+       echo "Your C compiler doesn't seem to understand __attribute__ at all."
+       val="$undef"
+fi
+;;
+*) val="$d_attribute_visibility" ;;
+esac
+set d_attribute_visibility
+eval $setvar
+$rm -f attrib*
+
 : see if getpgrp exists
 set getpgrp d_getpgrp
 eval $inlibc
@@ -16198,6 +16202,36 @@ eval $inlibc
 set llroundl d_llroundl
 eval $inlibc
 
+: see if malloc/malloc.h has to be included
+set malloc/malloc.h i_mallocmalloc
+eval $inhdr
+
+: see if this is a malloc.h system
+: we want a real compile instead of Inhdr because some systems have a
+: malloc.h that just gives a compile error saying to use stdlib.h instead
+echo " "
+$cat >try.c <<EOCP
+#include <stdlib.h>
+#include <malloc.h>
+#$i_mallocmalloc I_MALLOCMALLOC
+#ifdef I_MALLOCMALLOC
+# include <malloc/malloc.h>
+#endif
+
+int main () { return 0; }
+EOCP
+set try
+if eval $compile; then
+    echo "<malloc.h> found." >&4
+    val="$define"
+else
+    echo "<malloc.h> NOT found." >&4
+    val="$undef"
+fi
+$rm_try
+set i_malloc
+eval $setvar
+
 : see if localtime_r exists
 set localtime_r d_localtime_r
 eval $inlibc
@@ -16816,17 +16850,49 @@ case "$usequadmath:$i_quadmath" in
 define:define)
   nvtype="__float128"
   nvsize=16
-  case "$libs" in
-  *quadmath*) ;;
-  *) $cat <<EOM >&4
+  : libquadmath is not in the usual places, and the place
+  : changes if the compiler is upgraded.  So ask the compiler if it
+  : can find it.
+  : We do not need to save this, if it fails we abort.
+  libs="$libs -lquadmath"
+  set try
+  $cat >try.c <<EOM
+#include <quadmath.h>
+#include <stdio.h>
+int main(int argc, char *argv[]) {
+  __float128 x = 1.0;
+  if (fabsq(logq(x)) > 1e-6) {
+     fputs("quadmath is broken\n", stderr);
+     return 1;
+  }
+  puts("define");
+  return 0;
+}
+EOM
+  yyy=''
+  if eval $compile_ok; then
+      yyy=`$run ./try`
+      case "$yyy" in
+      define) ;;
+      *) cat <<EOM >&4
+
+*** You requested the use of the quadmath library, but
+*** it appears to be nonfunctional.
+*** Cannot continue, aborting.
+
+EOM
+       exit 1
+       ;;
+       esac
+  else
+      $cat <<EOM >&4
 
 *** You requested the use of the quadmath library, but you
 *** do not seem to have the quadmath library installed.
 *** Cannot continue, aborting.
 EOM
     exit 1
-    ;;
-  esac
+  fi
   ;;
 define:*) $cat <<EOM >&4
 
@@ -16983,6 +17049,10 @@ $cat <<EOP >try.c
 #ifdef I_STDLIB
 #include <stdlib.h>
 #endif
+#$i_inttypes I_INTTYPES
+#ifdef I_INTTYPES
+#include <inttypes.h>
+#endif
 #include <sys/types.h>
 #include <signal.h>
 #ifdef SIGFPE
@@ -18035,6 +18105,10 @@ eval $inlibc
 set setegid d_setegid
 eval $inlibc
 
+: see if setenv exists
+set setenv d_setenv
+eval $inlibc
+
 : see if seteuid exists
 set seteuid d_seteuid
 eval $inlibc
@@ -19717,9 +19791,13 @@ eval $inlibc
 set syscall d_syscall
 eval $inlibc
 
+: see if this is a sys/syscall.h system
+set sys/syscall.h i_syssyscall
+eval $inhdr
+
 : see if prototype for syscall is available
 echo " "
-set d_syscallproto syscall $i_unistd unistd.h
+set d_syscallproto syscall $i_unistd unistd.h $i_syssyscall sys/syscall.h
 eval $hasproto
 
 : see if sysconf exists
@@ -20077,6 +20155,10 @@ EOM
 #ifdef I_STDLIB
 #include <stdlib.h>
 #endif
+#$i_inttypes I_INTTYPES
+#ifdef I_INTTYPES
+#include <inttypes.h>
+#endif
 #include <sys/types.h>
 typedef $uvtype UV;
 int main()
@@ -21021,9 +21103,9 @@ case "$ccflags" in
        ;;
 esac
 
-randfunc=drand48
-drand01="drand48()"
-seedfunc="srand48"
+randfunc=Perl_drand48
+drand01="Perl_drand48()"
+seedfunc="Perl_drand48_init"
 randbits=48
 randseedtype=U32
 
@@ -21585,7 +21667,7 @@ EOCP
                case "$yyy" in
                12345678901)
                        sPRId64=PRId64; sPRIi64=PRIi64; sPRIu64=PRIu64;
-                       sPRIo64=PRIo64; sPRIx64=PRIx64; sPRIXU64=PRIXU64;
+                       sPRIo64=PRIo64; sPRIx64=PRIx64; sPRIXU64=PRIX64;
                        echo "We will use the C9X style."
                        ;;
                esac
@@ -21810,6 +21892,49 @@ EOM
 *)  groupstype="$gidtype";;
 esac
 
+: Check format strings for internal 32bit types
+echo " "
+$echo "Checking the format strings to be used for Perl's internal 32bit-types..." >&4
+
+case "$i32dformat" in
+'')    case "$i32type" in
+       int)
+               i32dformat='"d"'
+               u32uformat='"u"'
+               u32oformat='"o"'
+               u32xformat='"x"'
+               u32XUformat='"X"'
+               ;;
+       long)
+               i32dformat='"ld"'
+               u32uformat='"lu"'
+               u32oformat='"lo"'
+               u32xformat='"lx"'
+               u32XUformat='"lX"'
+               ;;
+       int_least32_t)          : will not happen currently
+               i32dformat=PRIdLEAST32
+               u32uformat=PRIuLEAST32
+               u32oformat=PRIoLEAST32
+               u32xformat=PRIxLEAST32
+               u32XUformat=PRIXLEAST32
+               ;;
+       int32_t)
+               i32dformat=PRId32
+               u32uformat=PRIu32
+               u32oformat=PRIo32
+               u32xformat=PRIx32
+               u32XUformat=PRIX32
+               ;;
+       esac ;;
+esac
+
+case "$i32dformat" in
+'') echo "$0: Fatal: failed to find format strings for 32-bit integers, cannot continue." >&4
+    exit 1
+    ;;
+esac
+
 : check whether make sets MAKE
 echo " "
 echo "Checking if your $make program sets \$(MAKE)..." >&4
@@ -23665,7 +23790,7 @@ EOF
 for i in \`$cc -v -c tmp.c 2>&1 $postprocess_cc_v\`
 do
        case "\$i" in
-       -D*) echo "\$i" | $sed 's/^-D//';;
+       -D*) echo "\$i" | $sed 's/^-D//;s/['\''\"]//g';;
        -A*) $test "$gccversion" && echo "\$i" | $sed 's/^-A//' | $sed 's/\(.*\)(\(.*\))/\1=\2/';;
        esac
 done
@@ -23975,7 +24100,6 @@ xs_extensions=''
 find_extensions='
     for xxx in *; do
        case "$xxx" in
-           CVS) ;;
            DynaLoader|dynaload) ;;
            *)
            this_ext=`echo "$xxx" | $sed -e s/-/\\\//g`;
@@ -24205,8 +24329,6 @@ esac
 nonxs_ext=''
 for xxx in $nonxs_extensions ; do
        case "$xxx" in
-       CVS|RCS|SCCS|.svn)
-               ;;
        VMS*)
                ;;
        *)      nonxs_ext="$nonxs_ext $xxx"
@@ -24370,7 +24492,7 @@ case " $extensions"  in
 *" Fcntl "*"_File "*" IO "*) ;; # GDBM_File
 *" Fcntl "*" IO "*"_File "*) ;; # NDBM_File
 *) echo "WARNING: Extensions DB_File or *DBM_File, Fcntl, and IO not configured." >&4
-   echo "WARNING: The Perl you are building will be quite crippled." >& 4
+   echo "WARNING: The Perl you are building will be quite crippled." >&4
    ;;
 esac
 
@@ -24585,6 +24707,7 @@ d_attribute_nonnull='$d_attribute_nonnull'
 d_attribute_noreturn='$d_attribute_noreturn'
 d_attribute_pure='$d_attribute_pure'
 d_attribute_unused='$d_attribute_unused'
+d_attribute_visibility='$d_attribute_visibility'
 d_attribute_warn_unused_result='$d_attribute_warn_unused_result'
 d_backtrace='$d_backtrace'
 d_bsd='$d_bsd'
@@ -24953,6 +25076,7 @@ d_semget='$d_semget'
 d_semop='$d_semop'
 d_sendmsg='$d_sendmsg'
 d_setegid='$d_setegid'
+d_setenv='$d_setenv'
 d_seteuid='$d_seteuid'
 d_setgrent='$d_setgrent'
 d_setgrent_r='$d_setgrent_r'
@@ -25208,6 +25332,7 @@ html3dir='$html3dir'
 html3direxp='$html3direxp'
 i16size='$i16size'
 i16type='$i16type'
+i32dformat='$i32dformat'
 i32size='$i32size'
 i32type='$i32type'
 i64size='$i64size'
@@ -25278,6 +25403,7 @@ i_syssockio='$i_syssockio'
 i_sysstat='$i_sysstat'
 i_sysstatfs='$i_sysstatfs'
 i_sysstatvfs='$i_sysstatvfs'
+i_syssyscall='$i_syssyscall'
 i_systime='$i_systime'
 i_systimek='$i_systimek'
 i_systimes='$i_systimes'
@@ -25595,8 +25721,12 @@ troff='$troff'
 ttyname_r_proto='$ttyname_r_proto'
 u16size='$u16size'
 u16type='$u16type'
+u32XUformat='$u32XUformat'
+u32oformat='$u32oformat'
 u32size='$u32size'
 u32type='$u32type'
+u32uformat='$u32uformat'
+u32xformat='$u32xformat'
 u64size='$u64size'
 u64type='$u64type'
 u8size='$u8size'
index 6ae7cb9..a61ea41 100644 (file)
@@ -32,11 +32,11 @@ alignbytes='4'
 aphostname='/bin/hostname'
 api_revision='5'
 api_subversion='0'
-api_version='36'
-api_versionstring='5.36.0'
+api_version='38'
+api_versionstring='5.38.0'
 ar='ar'
-archlib='/usr/lib/perl5/5.36.3/armv4l-linux'
-archlibexp='/usr/lib/perl5/5.36.3/armv4l-linux'
+archlib='/usr/lib/perl5/5.38.2/armv4l-linux'
+archlibexp='/usr/lib/perl5/5.38.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.36.3/armv4l-linux/CORE'
+ccdlflags='-rdynamic -Wl,-rpath,/usr/lib/perl5/5.38.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'
@@ -124,6 +124,7 @@ d_attribute_nonnull='undef'
 d_attribute_noreturn='undef'
 d_attribute_pure='undef'
 d_attribute_unused='undef'
+d_attribute_visibility='undef'
 d_attribute_warn_unused_result='undef'
 d_backtrace='undef'
 d_bsd='undef'
@@ -489,6 +490,7 @@ d_semget='define'
 d_semop='define'
 d_sendmsg='define'
 d_setegid='define'
+d_setenv='undef'
 d_seteuid='define'
 d_setgrent='define'
 d_setgrent_r='undef'
@@ -737,6 +739,7 @@ html3dir=' '
 html3direxp=''
 i16size='2'
 i16type='short'
+i32dformat='"ld"'
 i32size='4'
 i32type='long'
 i64size='8'
@@ -807,6 +810,7 @@ i_syssockio='undef'
 i_sysstat='define'
 i_sysstatfs='define'
 i_sysstatvfs='define'
+i_syssyscall='undef'
 i_systime='define'
 i_systimek='undef'
 i_systimes='define'
@@ -831,7 +835,7 @@ inc_version_list=' '
 inc_version_list_init='0'
 incpath=''
 inews=''
-installarchlib='./install_me_here/usr/lib/perl5/5.36.3/armv4l-linux'
+installarchlib='./install_me_here/usr/lib/perl5/5.38.2/armv4l-linux'
 installbin='./install_me_here/usr/bin'
 installhtml1dir=''
 installhtml3dir=''
@@ -839,13 +843,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.36.3'
+installprivlib='./install_me_here/usr/lib/perl5/5.38.2'
 installscript='./install_me_here/usr/bin'
-installsitearch='./install_me_here/usr/lib/perl5/site_perl/5.36.3/armv4l-linux'
+installsitearch='./install_me_here/usr/lib/perl5/site_perl/5.38.2/armv4l-linux'
 installsitebin='./install_me_here/usr/bin'
 installsitehtml1dir=''
 installsitehtml3dir=''
-installsitelib='./install_me_here/usr/lib/perl5/site_perl/5.36.3'
+installsitelib='./install_me_here/usr/lib/perl5/site_perl/5.38.2'
 installsiteman1dir='./install_me_here/usr/share/man/man1'
 installsiteman3dir='./install_me_here/usr/share/man/man3'
 installsitescript='./install_me_here/usr/bin'
@@ -980,8 +984,8 @@ pmake=''
 pr=''
 prefix='/usr'
 prefixexp='/usr'
-privlib='/usr/lib/perl5/5.36.3'
-privlibexp='/usr/lib/perl5/5.36.3'
+privlib='/usr/lib/perl5/5.38.2'
+privlibexp='/usr/lib/perl5/5.38.2'
 procselfexe='"/proc/self/exe"'
 prototype='define'
 ptrsize='4'
@@ -1046,17 +1050,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.36.3/armv4l-linux'
-sitearchexp='/usr/lib/perl5/site_perl/5.36.3/armv4l-linux'
+sitearch='/usr/lib/perl5/site_perl/5.38.2/armv4l-linux'
+sitearchexp='/usr/lib/perl5/site_perl/5.38.2/armv4l-linux'
 sitebin='/usr/bin'
 sitebinexp='/usr/bin'
 sitehtml1dir=''
 sitehtml1direxp=''
 sitehtml3dir=''
 sitehtml3direxp=''
-sitelib='/usr/lib/perl5/site_perl/5.36.3'
+sitelib='/usr/lib/perl5/site_perl/5.38.2'
 sitelib_stem='/usr/lib/perl5/site_perl'
-sitelibexp='/usr/lib/perl5/site_perl/5.36.3'
+sitelibexp='/usr/lib/perl5/site_perl/5.38.2'
 siteman1dir='/usr/share/man/man1'
 siteman1direxp='/usr/share/man/man1'
 siteman3dir='/usr/share/man/man3'
@@ -1097,7 +1101,7 @@ stdio_stream_array=''
 strerror_r_proto='0'
 strings='/usr/include/string.h'
 submit=''
-subversion='3'
+subversion='2'
 sysman='/usr/share/man/man1'
 tail=''
 tar=''
@@ -1117,8 +1121,12 @@ troff=''
 ttyname_r_proto='0'
 u16size='2'
 u16type='unsigned short'
+u32XUformat='"lX"'
+u32oformat='"lo"'
 u32size='4'
 u32type='unsigned long'
+u32uformat='"lu"'
+u32xformat='"lx"'
 u64size='8'
 u64type='unsigned long long'
 u8size='1'
@@ -1188,8 +1196,8 @@ vendorprefix=''
 vendorprefixexp=''
 vendorscript=''
 vendorscriptexp=''
-version='5.36.3'
-version_patchlevel_string='version 36 subversion 3'
+version='5.38.2'
+version_patchlevel_string='version 38 subversion 2'
 versiononly='undef'
 vi=''
 xlibpth='/usr/lib/386 /lib/386'
@@ -1203,10 +1211,10 @@ config_arg0='Configure'
 config_args=''
 config_argc=0
 PERL_REVISION=5
-PERL_VERSION=36
-PERL_SUBVERSION=3
+PERL_VERSION=38
+PERL_SUBVERSION=2
 PERL_API_REVISION=5
-PERL_API_VERSION=36
+PERL_API_VERSION=38
 PERL_API_SUBVERSION=0
 PERL_PATCHLEVEL=
 PERL_CONFIG_SH=true
index 53bfca4..ed18781 100644 (file)
@@ -32,11 +32,11 @@ alignbytes='4'
 aphostname='/bin/hostname'
 api_revision='5'
 api_subversion='0'
-api_version='36'
-api_versionstring='5.36.0'
+api_version='38'
+api_versionstring='5.38.0'
 ar='ar'
-archlib='/usr/lib/perl5/5.36.3/armv4l-linux'
-archlibexp='/usr/lib/perl5/5.36.3/armv4l-linux'
+archlib='/usr/lib/perl5/5.38.2/armv4l-linux'
+archlibexp='/usr/lib/perl5/5.38.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.36.3/armv4l-linux/CORE'
+ccdlflags='-rdynamic -Wl,-rpath,/usr/lib/perl5/5.38.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'
@@ -123,6 +123,7 @@ d_attribute_nonnull='undef'
 d_attribute_noreturn='undef'
 d_attribute_pure='undef'
 d_attribute_unused='undef'
+d_attribute_visibility='undef'
 d_attribute_warn_unused_result='undef'
 d_backtrace='undef'
 d_bsd='undef'
@@ -488,6 +489,7 @@ d_semget='define'
 d_semop='define'
 d_sendmsg='define'
 d_setegid='define'
+d_setenv='undef'
 d_seteuid='define'
 d_setgrent='define'
 d_setgrent_r='undef'
@@ -735,6 +737,7 @@ html3dir=' '
 html3direxp=''
 i16size='2'
 i16type='short'
+i32dformat='"ld"'
 i32size='4'
 i32type='long'
 i64size='8'
@@ -805,6 +808,7 @@ i_syssockio='undef'
 i_sysstat='define'
 i_sysstatfs='define'
 i_sysstatvfs='define'
+i_syssyscall='undef'
 i_systime='define'
 i_systimek='undef'
 i_systimes='define'
@@ -829,7 +833,7 @@ inc_version_list=' '
 inc_version_list_init='0'
 incpath=''
 inews=''
-installarchlib='./install_me_here/usr/lib/perl5/5.36.3/armv4l-linux'
+installarchlib='./install_me_here/usr/lib/perl5/5.38.2/armv4l-linux'
 installbin='./install_me_here/usr/bin'
 installhtml1dir=''
 installhtml3dir=''
@@ -837,13 +841,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.36.3'
+installprivlib='./install_me_here/usr/lib/perl5/5.38.2'
 installscript='./install_me_here/usr/bin'
-installsitearch='./install_me_here/usr/lib/perl5/site_perl/5.36.3/armv4l-linux'
+installsitearch='./install_me_here/usr/lib/perl5/site_perl/5.38.2/armv4l-linux'
 installsitebin='./install_me_here/usr/bin'
 installsitehtml1dir=''
 installsitehtml3dir=''
-installsitelib='./install_me_here/usr/lib/perl5/site_perl/5.36.3'
+installsitelib='./install_me_here/usr/lib/perl5/site_perl/5.38.2'
 installsiteman1dir='./install_me_here/usr/share/man/man1'
 installsiteman3dir='./install_me_here/usr/share/man/man3'
 installsitescript='./install_me_here/usr/bin'
@@ -978,8 +982,8 @@ pmake=''
 pr=''
 prefix='/usr'
 prefixexp='/usr'
-privlib='/usr/lib/perl5/5.36.3'
-privlibexp='/usr/lib/perl5/5.36.3'
+privlib='/usr/lib/perl5/5.38.2'
+privlibexp='/usr/lib/perl5/5.38.2'
 procselfexe='"/proc/self/exe"'
 prototype='define'
 ptrsize='4'
@@ -1044,17 +1048,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.36.3/armv4l-linux'
-sitearchexp='/usr/lib/perl5/site_perl/5.36.3/armv4l-linux'
+sitearch='/usr/lib/perl5/site_perl/5.38.2/armv4l-linux'
+sitearchexp='/usr/lib/perl5/site_perl/5.38.2/armv4l-linux'
 sitebin='/usr/bin'
 sitebinexp='/usr/bin'
 sitehtml1dir=''
 sitehtml1direxp=''
 sitehtml3dir=''
 sitehtml3direxp=''
-sitelib='/usr/lib/perl5/site_perl/5.36.3'
+sitelib='/usr/lib/perl5/site_perl/5.38.2'
 sitelib_stem='/usr/lib/perl5/site_perl'
-sitelibexp='/usr/lib/perl5/site_perl/5.36.3'
+sitelibexp='/usr/lib/perl5/site_perl/5.38.2'
 siteman1dir='/usr/share/man/man1'
 siteman1direxp='/usr/share/man/man1'
 siteman3dir='/usr/share/man/man3'
@@ -1095,7 +1099,7 @@ stdio_stream_array=''
 strerror_r_proto='0'
 strings='/usr/include/string.h'
 submit=''
-subversion='3'
+subversion='2'
 sysman='/usr/share/man/man1'
 tail=''
 tar=''
@@ -1115,8 +1119,12 @@ troff=''
 ttyname_r_proto='0'
 u16size='2'
 u16type='unsigned short'
+u32XUformat='"lX"'
+u32oformat='"lo"'
 u32size='4'
 u32type='unsigned long'
+u32uformat='"lu"'
+u32xformat='"lx"'
 u64size='8'
 u64type='unsigned long long'
 u8size='1'
@@ -1186,8 +1194,8 @@ vendorprefix=''
 vendorprefixexp=''
 vendorscript=''
 vendorscriptexp=''
-version='5.36.3'
-version_patchlevel_string='version 36 subversion 3'
+version='5.38.2'
+version_patchlevel_string='version 38 subversion 2'
 versiononly='undef'
 vi=''
 xlibpth='/usr/lib/386 /lib/386'
@@ -1201,10 +1209,10 @@ config_arg0='Configure'
 config_args=''
 config_argc=0
 PERL_REVISION=5
-PERL_VERSION=36
-PERL_SUBVERSION=3
+PERL_VERSION=38
+PERL_SUBVERSION=2
 PERL_API_REVISION=5
-PERL_API_VERSION=36
+PERL_API_VERSION=38
 PERL_API_SUBVERSION=0
 PERL_PATCHLEVEL=
 PERL_CONFIG_SH=true
index 7946323..e6d97ca 100644 (file)
@@ -9,10 +9,11 @@
  */
 
 /*
- * EXT  designates a global var which is defined in perl.h
- * dEXT designates a global var which is defined in another
- *      file, so we can't count on finding it in perl.h
- *      (this practice should be avoided).
+ * EXT:  designates a global var which is defined in perl.h
+ *
+ * dEXT: designates a global var which is defined in another
+ *       file, so we can't count on finding it in perl.h
+ *       (this practice should be avoided).
  */
 #undef EXT
 #undef dEXT
@@ -52,6 +53,6 @@
 #  endif
 
 #undef INIT
-#define INIT(x)
+#define INIT(...)
 
 #undef DOINIT
index 2c94240..0c9d1d9 100644 (file)
@@ -1,3 +1,5 @@
+# vim: syntax=pod
+
 If you read this file _as_is_, just ignore the funny characters you see.
 It is written in the POD format (see F<pod/perlpod.pod>) which is specially
 designed to be readable as is.
@@ -90,10 +92,10 @@ to F<pod/perldelta.pod> for more detailed information.
 
 =head3 Compatibility with earlier versions
 
-B<WARNING:> This version is not binary compatible with versions of Perl
-earlier than 5.36.0.  If you have built extensions (i.e. modules that
-include C code) using an earlier version of Perl, you will need to
-rebuild and reinstall those extensions.
+B<WARNING:> This version is not binary compatible with earlier versions
+of Perl.  If you have built extensions (i.e. modules that include C code)
+using an earlier version of Perl, you will need to rebuild and reinstall
+those extensions.
 
 Pure perl modules without XS or C code should continue to work fine
 without reinstallation.  See the discussion below on
@@ -101,11 +103,18 @@ L<"Coexistence with earlier versions of perl 5"> for more details.
 
 The standard extensions supplied with Perl will be handled automatically.
 
-On a related issue, old modules may possibly be affected by the changes
-in the Perl language in the current release.  Please see
-F<pod/perldelta.pod> for a description of what's changed.  See your
-installed copy of the perllocal.pod file for a (possibly incomplete)
-list of locally installed modules.  Also see the L<CPAN> module's
+On a related issue, old modules may possibly be affected by the changes in the
+Perl language in the current release.  We try hard to make new features
+"opt-in", such that existing code will work unchanged, and attempt to identify
+where bug fixes might expose code which was relying on incorrect interpreter
+behaviour.  Please see F<pod/perldelta.pod> for a description of what's
+changed between this and the previous release.  If you are upgrading from an
+earlier release, please also check the perldeltas describing changes for the
+intermediate releases, to get a full picture of what changes might affect your
+installation.
+
+See your installed copy of the perllocal.pod file for a (possibly
+incomplete) list of locally installed modules. Also see the L<CPAN> module's
 C<autobundle> function for one way to make a "bundle" of your currently
 installed modules.
 
@@ -411,6 +420,38 @@ the compiler dependency, you may need to also add "-Dcc=...".
 At C level the type is called C<__float128> (note, not "long double"),
 but Perl source knows it as NV.  (This is not "long doubles".)
 
+=head3 Taint Support
+
+Traditional perl has provided a security mechanism based on marking
+input data as untrusted unless it has been validated by a regex. This
+mechanism is called tainting and is enabled with the -T or -t options on
+the command line. This support has a performance cost on all code
+executed. It is possible to disable this support by providing the
+setting C<-Accflags=-DNO_TAINT_SUPPORT> or the setting
+C<-Accflags=-DSILENT_NO_TAINT_SUPPORT> to Configure.
+
+The former option C<NO_TAINT_SUPPORT> is more secure and disables taint
+support while making the use of the C<-T> or C<-t> options which
+normally enable taint support into an untrappable exception to ensure
+that no-one uses them while expecting taint checks to run. With this
+build mode there can be no confusion if a script supports taint or not.
+
+The latter option, C<SILENT_NO_TAINT_SUPPORT> is less secure but more
+flexible in that it silently disables taint support while ignoring the
+C<-T> and C<-t> command line options entirely. In this build mode it is
+possible to run a script with the C<-T> or C<-t> option and expect taint
+support but not get it, so this mode is only recommended to people who
+really know what they are doing.
+
+Both modes improve performance although the amount depends on your
+workload. It is not unreasonable to expect a 5%-10% improvement in
+performance by using one of these options. At this time this build mode
+is supported but not recommended, and if you chose to use such a perl
+you do so at your own risk. It is possible that there may be
+interoperability issues with CPAN distributions as many distributions
+are unaware of this build mode and will expect test scripts to pass or
+to detect unvalidated data when run under the C<-T> or C<-t>.
+
 =head3 Algorithmic Complexity Attacks on Hashes
 
 Perl 5.18 reworked the measures used to secure its hash function
@@ -450,30 +491,39 @@ storage with 256 32-bit random values as well. In practice the RNG we use
 for seeding the SBOX32 storage is very efficient, and populating the table
 required for hashing even fairly long keys is negligible as we only do it
 during startup. By default we build with SBOX32 enabled, but you can change
-that by setting
+that by setting the C<PERL_HASH_USE_SBOX32_ALSO> in the Configure process,
+with something like this
 
-   PERL_HASH_USE_SBOX32_ALSO
+   -Accflags='-DPERL_HASH_USE_SBOX32_ALSO=0'
 
-to zero in configure. By default Perl will use SBOX32 to hash strings 24 bytes
-or shorter, you can change this length by setting
+or alternatively you can use the simple define C<PERL_HASH_NO_SBOX32> like this:
 
-    SBOX32_MAX_LEN
+    -Accflags='-DPERL_HASH_NO_SBOX32'
 
-to the desired length, with the maximum length being 256.
+By default Perl will use SBOX32 to hash strings 24 bytes
+or shorter, you can change this length by setting C<SBOX32_MAX_LEN>
+to the desired length, with the maximum length being 256. For example with
+this:
+
+    -Accflags='-DSBOX_MAX_LEN=128'
 
 As of Perl 5.18 the order returned by keys(), values(), and each() is
 non-deterministic and distinct per hash, and the insert order for
 colliding keys is randomized as well, and perl allows for controlling this
 by the PERL_PERTURB_KEYS environment setting. You can disable this behavior
-entirely with the define
+entirely with the define C<PERL_PERTURB_KEYS_DISABLED> with
 
-    PERL_PERTURB_KEYS_DISABLED
+    -Accflags='-DPERL_PERTURB_KEYS_DISABLED'
 
 You can disable the environment variable checks and compile time specify
-the type of key traversal randomization to be used by defining one of these:
+the type of key traversal randomization to be used by defining either
+C<PERL_PERTURB_KEYS_RANDOM> or C<PERL_PERTURB_KEYS_DETERMINISTIC> with
+
+    -Accflags='-DPERL_PERTURB_KEYS_RANDOM'
 
-    PERL_PERTURB_KEYS_RANDOM
-    PERL_PERTURB_KEYS_DETERMINISTIC
+or
+
+    -Accflags='-DPERL_PERTURB_KEYS_DETERMINISTIC'
 
 Since Perl 5.18 the seed used for the hash function is randomly selected
 at process start, which can be overridden by specifying a seed by setting
@@ -489,9 +539,9 @@ DETERMINISTIC in this context means "if everything else is kept the same
 the same results should be observed".
 
 You can change this behavior so that your perl is built with a hard coded
-seed with the define
+seed with the define C<NO_HASH_SEED> by providing to Configure
 
-    NO_HASH_SEED
+    -Accflags='-DNO_HASH_SEED'
 
 Note that if you do this you should modify the code in hv_func.h to specify
 your own key. In the future this define may be renamed and replaced with one
@@ -519,6 +569,38 @@ C<-Accflags=-DNO_PERL_HASH_ENV>.
 The C<PERL_HASH_SEED_DEBUG> environment variable can be disabled by
 configuring perl with C<-Accflags=-DNO_PERL_HASH_SEED_DEBUG>.
 
+=head3 MISCELLANEOUS CONFIG
+
+Perl uses various defines to control defaults for its behavior. These
+values are chosen to represent "sane" config, but users can override
+these values in their builds if they wish. This is a list of such
+settings.
+
+=over 2
+
+=item PERL_MAX_NESTED_EVAL_BEGIN_BLOCKS_DEFAULT
+
+This define is used to control the default maximum number of nested
+eval/BEGIN statements, and in this context require should be
+understood to be a special form of eval so this means require/BEGIN
+and "use" statements as well.
+
+Currently each C<BEGIN> block inside of an C<eval EXPR> or C<require>
+operation will use a fairly high number of frames of the perl internal
+C stack, and this value is used to prevent stack overflows. Normally
+it is defaulted to 1000 but the default can be configured to another
+value, for instance 100, like this
+
+  -Accflags='-DPERL_MAX_NESTED_EVAL_BEGIN_BLOCKS_DEFAULT=100'
+
+
+If you don't know what this is then it is safe to ignore it. Do not
+configure this to 0 or another very low value, it will break a lot of
+code. If you want to set it to a low value use the run time variable
+C<${^MAX_NESTED_EVAL_BEGIN_BLOCKS}> instead.
+
+=back
+
 =head3 SOCKS
 
 Perl can be configured to be 'socksified', that is, to use the SOCKS
@@ -612,7 +694,7 @@ for example:
 
     18126:./miniperl: /sbin/loader: Fatal Error: cannot map libperl.so
 
-There is also an potential problem with the shared perl library if you
+There is also a potential problem with the shared perl library if you
 want to have more than one "flavor" of the same version of perl (e.g.
 with and without -DDEBUGGING).  For example, suppose you build and
 install a standard Perl 5.10.0 with a shared library.  Then, suppose you
@@ -637,21 +719,6 @@ architecture-dependent library for your -DDEBUGGING version of perl.
 You can do this by changing all the *archlib* variables in config.sh to
 point to your new architecture-dependent library.
 
-=head3 Environment access
-
-Perl often needs to write to the program's environment, such as when
-C<%ENV> is assigned to. Many implementations of the C library function
-C<putenv()> leak memory, so where possible perl will manipulate the
-environment directly to avoid these leaks. The default is now to perform
-direct manipulation whenever perl is running as a stand alone interpreter,
-and to call the safe but potentially leaky C<putenv()> function when the
-perl interpreter is embedded in another application. You can force perl
-to always use C<putenv()> by compiling with
-C<-Accflags="-DPERL_USE_SAFE_PUTENV">, see section L</"Altering Configure
-variables for C compiler switches etc.">.  You can force an embedded perl
-to use direct manipulation by setting C<PL_use_safe_putenv = 0;> after
-the C<perl_construct()> call.
-
 =head3 External glob
 
 Before File::Glob entered core in 5.6.0 globbing was implemented by shelling
@@ -683,7 +750,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.36.3.
+By default, Configure will use the following directories for 5.38.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
@@ -826,7 +893,7 @@ separated list of directories, like this
 
        sh Configure -Accflags='-DAPPLLIB_EXP=\"/usr/libperl\"'
 
-The directories defined by APPLLIB_EXP get added to @INC I<first>,
+The directories defined by APPLLIB_EXP get added to @INC B<first>,
 ahead of any others, and so provide a way to override the standard perl
 modules should you, for example, want to distribute fixes without
 touching the perl distribution proper.  And, like otherlib dirs,
@@ -1258,6 +1325,13 @@ options.  Try
 
 for a listing.
 
+Unrecognized arguments with a double dash prefix produce an error.
+
+Any other arguments are passed through to C<Configure>, so you could
+build a threaded perl with:
+
+        CC=gcc ./configure.gnu -Dusethreads
+
 (The file is called configure.gnu to avoid problems on systems
 that would not distinguish the files "Configure" and "configure".)
 
@@ -2506,8 +2580,8 @@ L<https://www.chiark.greenend.org.uk/~sgtatham/bugs.html>
 
 =head1 Coexistence with earlier versions of perl 5
 
-Perl 5.36.3 is not binary compatible with versions of Perl earlier than.
-5.36.0.  In other words, you will have to recompile your XS modules.
+Perl 5.38.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 stable version of Perl
 (e.g. 5.30.0) to another similar minor version (e.g. 5.30.1) without
@@ -2581,9 +2655,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.36.3
+       sh Configure -Dprefix=/opt/perl5.38.2
 
-and adding /opt/perl5.36.3/bin to the shell PATH variable.  Such users
+and adding /opt/perl5.38.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.
 
@@ -2596,13 +2670,13 @@ seriously consider using a separate directory, since development
 subversions may not have all the compatibility wrinkles ironed out
 yet.
 
-=head2 Upgrading from 5.35.11 or earlier
+=head2 Upgrading from 5.36.0 or earlier
 
-B<Perl 5.36.3 may not be binary compatible with Perl 5.35.11 or
+B<Perl 5.38.2 may not be binary compatible with Perl 5.36.0 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.36.3.  If you find you do need to rebuild an extension with
-5.36.3, you may safely do so without disturbing the older
+used with 5.38.2.  If you find you do need to rebuild an extension with
+5.38.2, you may safely do so without disturbing the older
 installations.  (See L<"Coexistence with earlier versions of perl 5">
 above.)
 
@@ -2635,15 +2709,15 @@ Firstly, the bare minimum to run this script
      print("$f\n");
   }
 
-in Linux with perl-5.36.3 is as follows (under $Config{prefix}):
+in Linux with perl-5.38.2 is as follows (under $Config{prefix}):
 
   ./bin/perl
-  ./lib/perl5/5.36.3/strict.pm
-  ./lib/perl5/5.36.3/warnings.pm
-  ./lib/perl5/5.36.3/i686-linux/File/Glob.pm
-  ./lib/perl5/5.36.3/feature.pm
-  ./lib/perl5/5.36.3/XSLoader.pm
-  ./lib/perl5/5.36.3/i686-linux/auto/File/Glob/Glob.so
+  ./lib/perl5/5.38.2/strict.pm
+  ./lib/perl5/5.38.2/warnings.pm
+  ./lib/perl5/5.38.2/i686-linux/File/Glob.pm
+  ./lib/perl5/5.38.2/feature.pm
+  ./lib/perl5/5.38.2/XSLoader.pm
+  ./lib/perl5/5.38.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
@@ -2756,11 +2830,16 @@ by perl itself; for source compatibility reasons, though, they weren't
 completely removed.
 
 =head2 C<-DNO_PERL_INTERNAL_RAND_SEED>
-X<PERL_INTERNAL_RAND_SEED>
 
 If you configure perl with C<-Accflags=-DNO_PERL_INTERNAL_RAND_SEED>,
 perl will ignore the C<PERL_INTERNAL_RAND_SEED> environment variable.
 
+=head2 C<-DNO_PERL_RAND_SEED>
+X<PERL_RAND_SEED>
+
+If you configure perl with C<-Accflags=-DNO_PERL_RAND_SEED>,
+perl will ignore the C<PERL_RAND_SEED> environment variable.
+
 =head1 DOCUMENTATION
 
 Read the manual entries before running perl.  The main documentation
index 4305b6b..6a28e60 100644 (file)
@@ -46,6 +46,6 @@
 #  endif
 
 #undef INIT
-#define INIT(x) = x
+#define INIT(...) = __VA_ARGS__
 
 #define DOINIT
index ba3ab8d..88d3080 100644 (file)
-.dir-locals.el                 Emacs control file
-.editorconfig                  EditorConfig style file
-.lgtm.yml                      LGTM.com configuration file
-.metaconf-exclusions.txt       Symbols that should ignored when generating Configure
-.travis.yml            continuous integration on github (where enabled)
-amigaos4/amigaio.c     AmigaOS4 port
-amigaos4/amigaio.h     AmigaOS4 port
-amigaos4/amigaos.c     AmigaOS4 port
-amigaos4/amigaos.h     AmigaOS4 port
-amigaos4/config.sh     AmigaOS4 config
-Artistic               The "Artistic License"
-asan_ignore            Errors to skip under clang's Addresss Sanitizer
-AUTHORS                        Contact info for contributors
-autodoc.pl             Creates pod/perlintern.pod and pod/perlapi.pod
-av.c                   Array value code
-av.h                   Array value header
-builtin.c              Functions in the builtin:: namespace
-caretx.c               C file to create $^X
-cflags.SH              A script that emits C compilation flags per file
-Changes                        Describe how to peruse changes between releases
-charclass_invlists.h   Compiled-in inversion lists
-CODE_OF_CONDUCT.md     Information on where to find the Standards of Conduct
-config.over            Site-specific overrides for Configure defaults
-config_h.SH            Produces config.h
-configpm               Produces lib/Config.pm
-Configure              Portability tool
-configure.com          Configure-equivalent for VMS
-configure.gnu          Crude emulation of GNU configure
-cop.h                  Control operator header
-Copying                        The GNU General Public License
+.dir-locals.el                         Emacs control file
+.editorconfig                          EditorConfig style file
+.lgtm.yml                              LGTM.com configuration file
+.metaconf-exclusions.txt               Symbols that should ignored when generating Configure
+Artistic                               The "Artistic License"
+asan_ignore                            Errors to skip under clang's Addresss Sanitizer
+AUTHORS                                        Contact info for contributors
+autodoc.pl                             Creates pod/perlintern.pod and pod/perlapi.pod
+av.c                                   Array value code
+av.h                                   Array value header
+builtin.c                              Functions in the builtin:: namespace
+caretx.c                               C file to create $^X
+cflags.SH                              A script that emits C compilation flags per file
+Changes                                        Describe how to peruse changes between releases
+charclass_invlists.h                   Compiled-in inversion lists
+class.c                                        Internals of the `use feature 'class'` object system
+CODE_OF_CONDUCT.md                     Information on where to find the Standards of Conduct
+config_h.SH                            Produces config.h
+configpm                               Produces lib/Config.pm
+Configure                              Portability tool
+configure.com                          Configure-equivalent for VMS
+configure.gnu                          Crude emulation of GNU configure
+cop.h                                  Control operator header
+Copying                                        The GNU General Public License
+cv.h                                   Code value header
+deb.c                                  Debugging routines
+doio.c                                 I/O operations
+doop.c                                 Support code for various operations
+dosish.h                               Some defines for MS/DOSish machines
+dquote.c                               Functions for double quotish contexts
+dump.c                                 Debugging output
+ebcdic_tables.h                                Generated tables included in utfebcdic.h
+embed.fnc                              Database used by embed.pl
+embed.h                                        Maps symbols to safer names
+embedvar.h                             C namespace management
+EXTERN.h                               Included before foreign .h files
+fakesdio.h                             stdio in terms of PerlIO
+feature.h                              Feature header
+form.h                                 Public declarations for formats
+generate_uudmap.c                      Generate uudmap.h, the uuencode decoding map
+globals.c                              File to declare global symbols (for shared library)
+globvar.sym                            Global variables that need hiding when embedded
+gv.c                                   Glob value code
+gv.h                                   Glob value header
+handy.h                                        Handy definitions
+hv.c                                   Hash value code
+hv.h                                   Hash value header
+hv_func.h                              Hash value static inline function header
+hv_macro.h                             Macros used by hv_func.h
+inline.h                               Static inline functions
+INSTALL                                        Detailed installation instructions
+install_lib.pl                         functions shared between install* scripts
+installhtml                            Perl script to install html files for pods
+installman                             Perl script to install man pages for pods
+installperl                            Perl script to do "make install" dirty work
+INTERN.h                               Included before domestic .h files
+intrpvar.h                             Variables held in each interpreter instance
+invlist_inline.h                       Inline functions for handling inversion lists
+iperlsys.h                             Perl's interface to the system
+keywords.c                             Perl_keyword(), generated by regen/keywords.pl
+keywords.h                             The keyword numbers
+l1_char_class_tab.h                    256 word bit table of character classes (for handy.h)
+locale.c                               locale-specific utility functions
+make_ext.pl                            Used by Makefile to execute extension Makefiles
+make_patchnum.pl                       Script to generate git_version.h and lib/Config_git.pl files for all OS'es
+makedef.pl                             Create symbol export lists for linking
+makedepend.SH                          Precursor to makedepend
+makedepend_file.SH                     Precursor to makedepend_file
+Makefile.micro                         microperl Makefile
+Makefile.SH                            A script that generates Makefile
+malloc.c                               A version of malloc you might not want
+malloc_ctl.h                           A version of malloc you might not want
+MANIFEST                               This list of files
+mathoms.c                              A home for binary-compatible code artifacts
+META.json                              Distribution meta-data in JSON
+META.yml                               Distribution meta-data in YAML
+metaconfig.h                           Control file for the metaconfig process
+metaconfig.SH                          Control file for the metaconfig process
+mg.c                                   Magic code
+mg.h                                   Magic header
+mg_names.inc                           Generated magic names used by dump.c
+mg_raw.h                               Generated magic data used by generate_uudmap.c
+mg_vtable.h                            Generated magic vtable data
+miniperlmain.c                         Basic perl w/o dynamic loading or extensions
+mkppport                               A script that distributes ppport.h
+mkppport.lst                           List of extensions that need a ppport.h
+mro_core.c                             Method Resolution Order code
+myconfig.SH                            Prints summary of the current configuration
+mydtrace.h                             Support for optional DTrace probes
+nostdio.h                              Cause compile error on stdio calls
+numeric.c                              Miscellaneous numeric conversion routines
+op.c                                   Opcode syntax tree code
+op.h                                   Opcode syntax tree header
+op_reg_common.h                                Common parts of op.h, regexp.h header
+opcode.h                               Automatically generated opcode header
+opnames.h                              Automatically generated opcode header
+overload.h                             generated overload enum (public)
+overload.inc                           generated overload name table (implementation)
+PACKAGING                              notes and best practice for packaging perl 5
+packsizetables.inc                     The generated packprops array used in pp_pack.c
+pad.c                                  Scratchpad functions
+pad.h                                  Scratchpad headers
+parser.h                               parser object header
+patchlevel.h                           The current patch level of perl
+peep.c                                 The peephole optimizer and optree finalizer
+perl.c                                 main()
+perl.h                                 Global declarations
+perl_inc_macro.h                       macro used to set \@INC using S_incpush_use_sep
+perl_langinfo.h                                Perl's version of <langinfo.h>
+perl_siphash.h                         Implementation of SipHash
+perlapi.h                              Empty backwards-compat include
+perldtrace.d                           D script for Perl probes
+perlio.c                               C code for PerlIO abstraction
+perlio.h                               PerlIO abstraction
+perlio.sym                             Symbols for PerlIO abstraction
+perliol.h                              PerlIO Layer definition
+perlsdio.h                             Fake stdio using perlio
+perlstatic.h                           Like inline.h, but functions not declared inline
+perlvars.h                             Global variables
+perly.act                              parser actions; derived from perly.y
+perly.c                                        parser code (NOT derived from perly.y)
+perly.h                                        header file for perly.c; derived from perly.y
+perly.tab                              parser state tables; derived from perly.y
+perly.y                                        Yacc grammar for perl
+Policy_sh.SH                           Hold site-wide preferences between Configure runs.
+pp.c                                   Push/Pop code
+pp.h                                   Push/Pop code defs
+pp_ctl.c                               Push/Pop code for control flow
+pp_hot.c                               Push/Pop code for heavily used opcodes
+pp_pack.c                              Push/Pop code for pack/unpack
+pp_proto.h                             C++ definitions for Push/Pop code
+pp_sort.c                              Push/Pop code for sort
+pp_sys.c                               Push/Pop code for system interaction
+proto.h                                        Prototypes
+README                                 The Instructions
+README.aix                             Perl notes for AIX
+README.amiga                           Perl notes for AmigaOS
+README.android                         Perl notes for Android
+README.bs2000                          Perl notes for POSIX-BC BS2000
+README.cn                              Perl for Simplified Chinese (in UTF-8)
+README.cygwin                          Perl notes for Cygwin
+README.freebsd                         Perl notes for FreeBSD
+README.haiku                           Perl notes for Haiku
+README.hpux                            Perl notes for HP-UX
+README.hurd                            Perl notes for Hurd
+README.irix                            Perl notes for Irix
+README.jp                              Perl for Japanese (in EUC-JP)
+README.ko                              Perl for Korean (in EUC-KR)
+README.linux                           Perl notes for Linux
+README.macosx                          Perl notes for Mac OS X
+README.micro                           Notes about microperl
+README.openbsd                         Perl notes for OpenBSD
+README.os2                             Perl notes for OS/2
+README.os390                           Perl notes for OS/390
+README.os400                           Perl notes for OS/400
+README.plan9                           Perl notes for Plan 9
+README.qnx                             Perl notes for QNX
+README.riscos                          Perl notes for RISC OS
+README.solaris                         Perl notes for Solaris
+README.synology                                Perl notes for Synology
+README.tru64                           Perl notes for Tru64
+README.tw                              Perl for Traditional Chinese (in Big5)
+README.vms                             Notes about installing the VMS port
+README.vos                             Perl notes for Stratus VOS
+README.win32                           Perl notes for Windows
+reentr.c                               Reentrant interfaces
+reentr.h                               Reentrant interfaces
+regcharclass.h                         Generated by regen/regcharclass.pl
+regcomp.c                              Regular expression compiler
+regcomp.h                              Private declarations for above
+regcomp.sym                            Data for regnodes.h
+regcomp_debug.c                                Regular expression compiler debug code
+regcomp_internal.h                     Internal stuff for regex compiler
+regcomp_invlist.c                      Invlist logic for regular expression engine
+regcomp_study.c                                Optimizer for regular expression compiler
+regcomp_trie.c                         Trie logic for regular expression compiler
+regen.pl                               Run all scripts that (re)generate files
+regen_perly.pl                         generate perly.{act,h,tab} from perly.y
+regexec.c                              Regular expression evaluator
+regexp.h                               Public declarations for the above
+reginline.h                            Inline subs for the RE engine.
+regnodes.h                             Description of nodes of the RE engine
+run.c                                  The interpreter loop
+runtests.SH                            A script that generates runtests
+sbox32_hash.h                          SBox hash code (32 Bit SBOX based hash function)
+scope.c                                        Scope entry and exit code
+scope.h                                        Scope entry and exit header
+scope_types.h                          Types used to manage the save stack
+SECURITY.md                            Add Security Policy for GitHub
+sv.c                                   Scalar value code
+sv.h                                   Scalar value header
+sv_inline.h                            Perl_newSV_type and required defs
+taint.c                                        Tainting code
+TestInit.pm                            Preamble library for tests
+thread.h                               Threading header
+time64.c                               64 bit clean time.h (code)
+time64.h                               64 bit clean time.h (header)
+time64_config.h                                64 bit clean time.h (configuration)
+toke.c                                 The tokener
+uconfig.h                              Configuration header for microperl
+uconfig.sh                             Configuration script for microperl
+uconfig64.sh                           Configuration script for microperl for LP64
+uni_keywords.h                         Map unicode property names to numbers
+unicode_constants.h                    compile-time macros for Unicode code points
+universal.c                            The default UNIVERSAL package methods
+unixish.h                              Defines that are assumed on Unix
+utf8.c                                 Unicode routines
+utf8.h                                 Unicode header
+utfebcdic.h                            Unicode on EBCDIC (UTF-EBCDIC, tr16) header
+util.c                                 Utility routines
+util.h                                 Dummy header
+utils.lst                              Lists utilities bundled with Perl
+vutil.c                                        Version object C functions
+vutil.h                                        Version object headers
+vxs.inc                                        Version object XS methods
+warnings.h                             The warning numbers
+write_buildcustomize.pl                        Generate lib/buildcustomize.pl
+XSUB.h                                 Include file for extension subroutines
+zaphod32_hash.h                                Zaphod32 hash code (32 bit fast hash function)
+amigaos4/amigaio.c                     AmigaOS4 port
+amigaos4/amigaio.h                     AmigaOS4 port
+amigaos4/amigaos.c                     AmigaOS4 port
+amigaos4/amigaos.h                     AmigaOS4 port
+amigaos4/config.sh                     AmigaOS4 config
 cpan/.dir-locals.el                    Emacs control file
-cpan/Archive-Tar/bin/ptar                              the ptar utility
-cpan/Archive-Tar/bin/ptardiff                          the ptardiff utility
-cpan/Archive-Tar/bin/ptargrep                          the ptardiff utility
-cpan/Archive-Tar/lib/Archive/Tar.pm                    Archive::Tar
-cpan/Archive-Tar/lib/Archive/Tar/Constant.pm           Archive::Tar
-cpan/Archive-Tar/lib/Archive/Tar/File.pm               Archive::Tar
-cpan/Archive-Tar/t/01_use.t                            Archive::Tar tests
-cpan/Archive-Tar/t/02_methods.t                                Archive::Tar tests
-cpan/Archive-Tar/t/03_file.t                           Archive::Tar tests
-cpan/Archive-Tar/t/04_resolved_issues.t                        Archive::Tar tests
-cpan/Archive-Tar/t/05_iter.t                           Archive::Tar tests
-cpan/Archive-Tar/t/06_error.t                          Archive::Tar tests
+cpan/Archive-Tar/bin/ptar                                      the ptar utility
+cpan/Archive-Tar/bin/ptardiff                                  the ptardiff utility
+cpan/Archive-Tar/bin/ptargrep                                  the ptardiff utility
+cpan/Archive-Tar/lib/Archive/Tar.pm                            Archive::Tar
+cpan/Archive-Tar/lib/Archive/Tar/Constant.pm                   Archive::Tar
+cpan/Archive-Tar/lib/Archive/Tar/File.pm                       Archive::Tar
+cpan/Archive-Tar/t/01_use.t                                    Archive::Tar tests
+cpan/Archive-Tar/t/02_methods.t                                        Archive::Tar tests
+cpan/Archive-Tar/t/03_file.t                                   Archive::Tar tests
+cpan/Archive-Tar/t/04_resolved_issues.t                                Archive::Tar tests
+cpan/Archive-Tar/t/05_iter.t                                   Archive::Tar tests
+cpan/Archive-Tar/t/06_error.t                                  Archive::Tar tests
 cpan/Archive-Tar/t/08_ptargrep.t
 cpan/Archive-Tar/t/09_roundtrip.t
-cpan/Archive-Tar/t/90_symlink.t                                Archive::Tar tests
-cpan/Archive-Tar/t/99_pod.t                            Archive::Tar tests
-cpan/Archive-Tar/t/src/header/signed.tar               Archive::Tar tests
+cpan/Archive-Tar/t/90_symlink.t                                        Archive::Tar tests
+cpan/Archive-Tar/t/99_pod.t                                    Archive::Tar tests
+cpan/Archive-Tar/t/src/header/signed.tar                       Archive::Tar tests
 cpan/Archive-Tar/t/src/linktest/linktest_missing_dir.tar       Archive::Tar tests
-cpan/Archive-Tar/t/src/linktest/linktest_with_dir.tar  Archive::Tar tests
-cpan/Archive-Tar/t/src/long/b                          Archive::Tar tests
-cpan/Archive-Tar/t/src/long/bar.tar                    Archive::Tar tests
-cpan/Archive-Tar/t/src/long/foo.tbz                    Archive::Tar tests
-cpan/Archive-Tar/t/src/long/foo.tgz                    Archive::Tar tests
-cpan/Archive-Tar/t/src/short/b                         Archive::Tar tests
-cpan/Archive-Tar/t/src/short/bar.tar                   Archive::Tar tests
-cpan/Archive-Tar/t/src/short/foo.tbz                   Archive::Tar tests
-cpan/Archive-Tar/t/src/short/foo.tgz                   Archive::Tar tests
-cpan/autodie/lib/autodie.pm            Functions succeed or die with lexical scope
-cpan/autodie/lib/autodie/exception.pm          Exception class for autodie
-cpan/autodie/lib/autodie/exception/system.pm   Exception class for autodying system()
-cpan/autodie/lib/autodie/hints.pm      Hinting interface for autodie
+cpan/Archive-Tar/t/src/linktest/linktest_with_dir.tar          Archive::Tar tests
+cpan/Archive-Tar/t/src/long/b                                  Archive::Tar tests
+cpan/Archive-Tar/t/src/long/bar.tar                            Archive::Tar tests
+cpan/Archive-Tar/t/src/long/foo.tbz                            Archive::Tar tests
+cpan/Archive-Tar/t/src/long/foo.tgz                            Archive::Tar tests
+cpan/Archive-Tar/t/src/short/b                                 Archive::Tar tests
+cpan/Archive-Tar/t/src/short/bar.tar                           Archive::Tar tests
+cpan/Archive-Tar/t/src/short/foo.tbz                           Archive::Tar tests
+cpan/Archive-Tar/t/src/short/foo.tgz                           Archive::Tar tests
+cpan/autodie/lib/autodie.pm                            Functions succeed or die with lexical scope
+cpan/autodie/lib/autodie/exception.pm                  Exception class for autodie
+cpan/autodie/lib/autodie/exception/system.pm           Exception class for autodying system()
+cpan/autodie/lib/autodie/hints.pm                      Hinting interface for autodie
 cpan/autodie/lib/autodie/Scope/Guard.pm
 cpan/autodie/lib/autodie/Scope/GuardStack.pm
 cpan/autodie/lib/autodie/skip.pm
 cpan/autodie/lib/autodie/Util.pm
-cpan/autodie/lib/Fatal.pm              Make errors in functions/builtins fatal
-cpan/autodie/t/00-load.t               autodie - basic load
+cpan/autodie/lib/Fatal.pm                              Make errors in functions/builtins fatal
+cpan/autodie/t/00-load.t                               autodie - basic load
 cpan/autodie/t/args.t
-cpan/autodie/t/autodie.t               autodie - Basic functionality
+cpan/autodie/t/autodie.t                               autodie - Basic functionality
 cpan/autodie/t/autodie_skippy.pm
-cpan/autodie/t/autodie_test_module.pm  autodie - test helper
-cpan/autodie/t/backcompat.t            autodie - More Fatal backcompat
-cpan/autodie/t/basic_exceptions.t      autodie - Basic exception tests
-cpan/autodie/t/binmode.t               autodie - Binmode testing
-cpan/autodie/t/blog_hints.t            autodie - Tests fro PJF's blog
-cpan/autodie/t/caller.t                        autodie - Caller diagnostics
+cpan/autodie/t/autodie_test_module.pm                  autodie - test helper
+cpan/autodie/t/backcompat.t                            autodie - More Fatal backcompat
+cpan/autodie/t/basic_exceptions.t                      autodie - Basic exception tests
+cpan/autodie/t/binmode.t                               autodie - Binmode testing
+cpan/autodie/t/blog_hints.t                            autodie - Tests fro PJF's blog
+cpan/autodie/t/caller.t                                        autodie - Caller diagnostics
 cpan/autodie/t/chmod.t
 cpan/autodie/t/chown.t
-cpan/autodie/t/context.t               autodie - Context clobbering tests
-cpan/autodie/t/context_lexical.t       autodie - Context clobbering lexically
+cpan/autodie/t/context.t                               autodie - Context clobbering tests
+cpan/autodie/t/context_lexical.t                       autodie - Context clobbering lexically
 cpan/autodie/t/core-trampoline-slurp.t
-cpan/autodie/t/crickey.t               autodie - Like an Australian
-cpan/autodie/t/dbmopen.t               autodie - dbm tests
+cpan/autodie/t/crickey.t                               autodie - Like an Australian
+cpan/autodie/t/dbmopen.t                               autodie - dbm tests
 cpan/autodie/t/eval_error.t
-cpan/autodie/t/exception_class.t       autodie - Exception class subclasses
+cpan/autodie/t/exception_class.t                       autodie - Exception class subclasses
 cpan/autodie/t/exception_nonref.t
-cpan/autodie/t/exceptions.t            autodie - 5.10 exception tests.
-cpan/autodie/t/exec.t                  autodie - exec tests.
-cpan/autodie/t/Fatal.t                 autodie - Fatal backcompatibility
-cpan/autodie/t/filehandles.t           autodie - filehandle tests
-cpan/autodie/t/fileno.t                        autodie - fileno tests
-cpan/autodie/t/flock.t                 autodie - File locking tests
-cpan/autodie/t/format-clobber.t                autodie - Don't clobber scalars
-cpan/autodie/t/hints.t                 autodie - Test hints interface
-cpan/autodie/t/hints_insist.t          autodie - Test hints insistance
-cpan/autodie/t/hints_pod_examples.t    autodie - Test hints POD examples
-cpan/autodie/t/hints_provider_does.t   autodie - Test hints/does roles
-cpan/autodie/t/hints_provider_easy_does_it.t   autodie - Test easy hints/does
-cpan/autodie/t/hints_provider_isa.t    autodie - Test hints/inheritance
+cpan/autodie/t/exceptions.t                            autodie - 5.10 exception tests.
+cpan/autodie/t/exec.t                                  autodie - exec tests.
+cpan/autodie/t/Fatal.t                                 autodie - Fatal backcompatibility
+cpan/autodie/t/filehandles.t                           autodie - filehandle tests
+cpan/autodie/t/fileno.t                                        autodie - fileno tests
+cpan/autodie/t/flock.t                                 autodie - File locking tests
+cpan/autodie/t/format-clobber.t                                autodie - Don't clobber scalars
+cpan/autodie/t/hints.t                                 autodie - Test hints interface
+cpan/autodie/t/hints_insist.t                          autodie - Test hints insistance
+cpan/autodie/t/hints_pod_examples.t                    autodie - Test hints POD examples
+cpan/autodie/t/hints_provider_does.t                   autodie - Test hints/does roles
+cpan/autodie/t/hints_provider_easy_does_it.t           autodie - Test easy hints/does
+cpan/autodie/t/hints_provider_isa.t                    autodie - Test hints/inheritance
 cpan/autodie/t/import-into.t
-cpan/autodie/t/internal.t              autodie - internal interface tests
-cpan/autodie/t/internal-backcompat.t   autodie - Back-compatibility tests
+cpan/autodie/t/internal.t                              autodie - internal interface tests
+cpan/autodie/t/internal-backcompat.t                   autodie - Back-compatibility tests
 cpan/autodie/t/kill.t
-cpan/autodie/t/lethal.t                        autodie - lethal is the one true name
-cpan/autodie/t/lib/autodie/test/au.pm          autodie - Australian helper
-cpan/autodie/t/lib/autodie/test/au/exception.pm        autodie - Australian helper
-cpan/autodie/t/lib/autodie/test/badname.pm     autodie - Bad exception class
-cpan/autodie/t/lib/autodie/test/missing.pm     autodie - Missing exception class
-cpan/autodie/t/lib/Caller_helper.pm            autodie - Caller helper
-cpan/autodie/t/lib/Hints_pod_examples.pm       autodie - Hints/pod helper
-cpan/autodie/t/lib/Hints_provider_does.pm      autodie - Hints/does helper
+cpan/autodie/t/lethal.t                                        autodie - lethal is the one true name
+cpan/autodie/t/lib/autodie/test/au.pm                  autodie - Australian helper
+cpan/autodie/t/lib/autodie/test/au/exception.pm                autodie - Australian helper
+cpan/autodie/t/lib/autodie/test/badname.pm             autodie - Bad exception class
+cpan/autodie/t/lib/autodie/test/missing.pm             autodie - Missing exception class
+cpan/autodie/t/lib/Caller_helper.pm                    autodie - Caller helper
+cpan/autodie/t/lib/Hints_pod_examples.pm               autodie - Hints/pod helper
+cpan/autodie/t/lib/Hints_provider_does.pm              autodie - Hints/does helper
 cpan/autodie/t/lib/Hints_provider_easy_does_it.pm      autodie - Hints/easy helper
-cpan/autodie/t/lib/Hints_provider_isa.pm       autodie - Hints/inherit helper
-cpan/autodie/t/lib/Hints_test.pm       autodie - Hints test helper
-cpan/autodie/t/lib/lethal.pm           autodie - with a better name
-cpan/autodie/t/lib/my/autodie.pm       autodie - blog_hints.t helper
+cpan/autodie/t/lib/Hints_provider_isa.pm               autodie - Hints/inherit helper
+cpan/autodie/t/lib/Hints_test.pm                       autodie - Hints test helper
+cpan/autodie/t/lib/lethal.pm                           autodie - with a better name
+cpan/autodie/t/lib/my/autodie.pm                       autodie - blog_hints.t helper
 cpan/autodie/t/lib/my/pragma.pm
-cpan/autodie/t/lib/OtherTypes.pm       autodie - Format clobberer helper.
-cpan/autodie/t/lib/pujHa/ghach.pm      autodie - Like a Klingon
-cpan/autodie/t/lib/pujHa/ghach/Dotlh.pm        autodie - With Klingon honour
-cpan/autodie/t/lib/Some/Module.pm      autodie - blog_hints.t helper
-cpan/autodie/t/mkdir.t                 autodie - filesystem tests
+cpan/autodie/t/lib/OtherTypes.pm                       autodie - Format clobberer helper.
+cpan/autodie/t/lib/pujHa/ghach.pm                      autodie - Like a Klingon
+cpan/autodie/t/lib/pujHa/ghach/Dotlh.pm                        autodie - With Klingon honour
+cpan/autodie/t/lib/Some/Module.pm                      autodie - blog_hints.t helper
+cpan/autodie/t/mkdir.t                                 autodie - filesystem tests
 cpan/autodie/t/no-default.t
 cpan/autodie/t/no_carp.t
-cpan/autodie/t/open.t                  autodie - Testing open
+cpan/autodie/t/open.t                                  autodie - Testing open
 cpan/autodie/t/read.t
-cpan/autodie/t/recv.t                  autodie - send/recv tests
-cpan/autodie/t/repeat.t                        autodie - repeat autodie leak tests
+cpan/autodie/t/recv.t                                  autodie - send/recv tests
+cpan/autodie/t/repeat.t                                        autodie - repeat autodie leak tests
 cpan/autodie/t/rt-74246.t
-cpan/autodie/t/scope_leak.t            autodie - file scope leak tests
+cpan/autodie/t/scope_leak.t                            autodie - file scope leak tests
 cpan/autodie/t/skip.t
-cpan/autodie/t/string-eval-basic.t     autodie - Basic string eval test
-cpan/autodie/t/string-eval-leak.t      autodie - String eval leak test
-cpan/autodie/t/sysopen.t               autodie - sysopen tests
+cpan/autodie/t/string-eval-basic.t                     autodie - Basic string eval test
+cpan/autodie/t/string-eval-leak.t                      autodie - String eval leak test
+cpan/autodie/t/sysopen.t                               autodie - sysopen tests
 cpan/autodie/t/touch_me
-cpan/autodie/t/truncate.t              autodie - File truncation tests
-cpan/autodie/t/unlink.t                        autodie - Unlink system tests.
-cpan/autodie/t/user-context.t          autodie - Context changes for usersubs
-cpan/autodie/t/usersub.t               autodie - user subroutine tests
+cpan/autodie/t/truncate.t                              autodie - File truncation tests
+cpan/autodie/t/unlink.t                                        autodie - Unlink system tests.
+cpan/autodie/t/user-context.t                          autodie - Context changes for usersubs
+cpan/autodie/t/usersub.t                               autodie - user subroutine tests
 cpan/autodie/t/utf8_open.t
 cpan/autodie/t/utime.t
-cpan/autodie/t/version.t               autodie - versioning tests
+cpan/autodie/t/version.t                               autodie - versioning tests
 cpan/autodie/t/version_tag.t
 cpan/AutoLoader/lib/AutoLoader.pm      Autoloader base class
 cpan/AutoLoader/lib/AutoSplit.pm       Split up autoload functions
@@ -150,11 +344,11 @@ cpan/bignum/gentest/backend.sh
 cpan/bignum/gentest/scope-nested-const.sh
 cpan/bignum/gentest/scope-nested-hex-oct.sh
 cpan/bignum/lib/bigfloat.pm
-cpan/bignum/lib/bigint.pm              bigint
-cpan/bignum/lib/bignum.pm              bignum
-cpan/bignum/lib/bigrat.pm              bigrat
-cpan/bignum/lib/Math/BigFloat/Trace.pm bignum tracing
-cpan/bignum/lib/Math/BigInt/Trace.pm   bignum tracing
+cpan/bignum/lib/bigint.pm                      bigint
+cpan/bignum/lib/bignum.pm                      bignum
+cpan/bignum/lib/bigrat.pm                      bigrat
+cpan/bignum/lib/Math/BigFloat/Trace.pm         bignum tracing
+cpan/bignum/lib/Math/BigInt/Trace.pm           bignum tracing
 cpan/bignum/lib/Math/BigRat/Trace.pm
 cpan/bignum/t/backend-gmp-bigfloat.t
 cpan/bignum/t/backend-gmp-bigint.t
@@ -164,11 +358,11 @@ cpan/bignum/t/backend-pari-bigfloat.t
 cpan/bignum/t/backend-pari-bigint.t
 cpan/bignum/t/backend-pari-bignum.t
 cpan/bignum/t/backend-pari-bigrat.t
-cpan/bignum/t/bigexp.t                 See if bignum works
+cpan/bignum/t/bigexp.t                         See if bignum works
 cpan/bignum/t/bigfloat.t
-cpan/bignum/t/bigint.t                 See if bigint works
-cpan/bignum/t/bignum.t                 See if bignum works
-cpan/bignum/t/bigrat.t                 See if bigrat works
+cpan/bignum/t/bigint.t                         See if bigint works
+cpan/bignum/t/bignum.t                         See if bignum works
+cpan/bignum/t/bigrat.t                         See if bigrat works
 cpan/bignum/t/const-bigfloat.t
 cpan/bignum/t/const-bigint.t
 cpan/bignum/t/const-bignum.t
@@ -185,21 +379,22 @@ cpan/bignum/t/import-bigfloat.t
 cpan/bignum/t/import-bigint.t
 cpan/bignum/t/import-bignum.t
 cpan/bignum/t/import-bigrat.t
-cpan/bignum/t/in_effect.t              See if in_effect() works
+cpan/bignum/t/in_effect.t                      See if in_effect() works
 cpan/bignum/t/infnan-bigfloat.t
 cpan/bignum/t/infnan-bigint.t
-cpan/bignum/t/infnan-bignum.t
+cpan/bignum/t/infnan-bignum-mbf.t
+cpan/bignum/t/infnan-bignum-mbr.t
 cpan/bignum/t/infnan-bigrat.t
-cpan/bignum/t/option_a.t               See if bignum a => X works
+cpan/bignum/t/option_a.t                       See if bignum a => X works
 cpan/bignum/t/option_a-bignum.t
 cpan/bignum/t/option_l-bigfloat.t
 cpan/bignum/t/option_l-bigint.t
 cpan/bignum/t/option_l-bignum.t
 cpan/bignum/t/option_l-bigrat.t
-cpan/bignum/t/option_p.t               See if bignum p => X works
+cpan/bignum/t/option_p.t                       See if bignum p => X works
 cpan/bignum/t/option_p-bignum.t
-cpan/bignum/t/overrides.t              See if global overrides behave
-cpan/bignum/t/ratopt_a.t               See if bigrat a => X works
+cpan/bignum/t/overrides.t                      See if global overrides behave
+cpan/bignum/t/ratopt_a.t                       See if bigrat a => X works
 cpan/bignum/t/scope-bigfloat.t
 cpan/bignum/t/scope-bigint.t
 cpan/bignum/t/scope-bignum.t
@@ -230,118 +425,123 @@ cpan/Compress-Raw-Bzip2/t/19nonpv.t
 cpan/Compress-Raw-Bzip2/t/99pod.t
 cpan/Compress-Raw-Bzip2/t/compress/CompTestUtils.pm
 cpan/Compress-Raw-Bzip2/typemap
-cpan/Compress-Raw-Zlib/config.in               Compress::Raw::Zlib
-cpan/Compress-Raw-Zlib/fallback/constants.h    Compress::Raw::Zlib
-cpan/Compress-Raw-Zlib/fallback/constants.xs   Compress::Raw::Zlib
-cpan/Compress-Raw-Zlib/lib/Compress/Raw/Zlib.pm        Compress::Raw::Zlib
-cpan/Compress-Raw-Zlib/Makefile.PL             Compress::Raw::Zlib
-cpan/Compress-Raw-Zlib/private/MakeUtil.pm     Compress::Raw::Zlib
-cpan/Compress-Raw-Zlib/t/01version.t           Compress::Raw::Zlib
-cpan/Compress-Raw-Zlib/t/02zlib.t              Compress::Raw::Zlib
-cpan/Compress-Raw-Zlib/t/07bufsize.t           Compress::Raw::Zlib
-cpan/Compress-Raw-Zlib/t/09limitoutput.t       Compress::Raw::Zlib
-cpan/Compress-Raw-Zlib/t/18lvalue.t            Compress::Raw::Zlib
+cpan/Compress-Raw-Zlib/config.in                       Compress::Raw::Zlib
+cpan/Compress-Raw-Zlib/fallback/constants.h            Compress::Raw::Zlib
+cpan/Compress-Raw-Zlib/fallback/constants.xs           Compress::Raw::Zlib
+cpan/Compress-Raw-Zlib/lib/Compress/Raw/Zlib.pm                Compress::Raw::Zlib
+cpan/Compress-Raw-Zlib/Makefile.PL                     Compress::Raw::Zlib
+cpan/Compress-Raw-Zlib/private/MakeUtil.pm             Compress::Raw::Zlib
+cpan/Compress-Raw-Zlib/t/01version.t                   Compress::Raw::Zlib
+cpan/Compress-Raw-Zlib/t/02zlib.t                      Compress::Raw::Zlib
+cpan/Compress-Raw-Zlib/t/07bufsize.t                   Compress::Raw::Zlib
+cpan/Compress-Raw-Zlib/t/09limitoutput.t               Compress::Raw::Zlib
+cpan/Compress-Raw-Zlib/t/18lvalue.t                    Compress::Raw::Zlib
 cpan/Compress-Raw-Zlib/t/19nonpv.t
 cpan/Compress-Raw-Zlib/t/compress/CompTestUtils.pm
-cpan/Compress-Raw-Zlib/typemap                 Compress::Raw::Zlib
-cpan/Compress-Raw-Zlib/Zlib.xs                 Compress::Raw::Zlib
-cpan/Compress-Raw-Zlib/zlib-src/adler32.c      Compress::Raw::Zlib
-cpan/Compress-Raw-Zlib/zlib-src/compress.c     Compress::Raw::Zlib
-cpan/Compress-Raw-Zlib/zlib-src/crc32.c                Compress::Raw::Zlib
-cpan/Compress-Raw-Zlib/zlib-src/crc32.h                Compress::Raw::Zlib
-cpan/Compress-Raw-Zlib/zlib-src/deflate.c      Compress::Raw::Zlib
-cpan/Compress-Raw-Zlib/zlib-src/deflate.h      Compress::Raw::Zlib
-cpan/Compress-Raw-Zlib/zlib-src/infback.c      Compress::Raw::Zlib
-cpan/Compress-Raw-Zlib/zlib-src/inffast.c      Compress::Raw::Zlib
-cpan/Compress-Raw-Zlib/zlib-src/inffast.h      Compress::Raw::Zlib
-cpan/Compress-Raw-Zlib/zlib-src/inffixed.h     Compress::Raw::Zlib
-cpan/Compress-Raw-Zlib/zlib-src/inflate.c      Compress::Raw::Zlib
-cpan/Compress-Raw-Zlib/zlib-src/inflate.h      Compress::Raw::Zlib
-cpan/Compress-Raw-Zlib/zlib-src/inftrees.c     Compress::Raw::Zlib
-cpan/Compress-Raw-Zlib/zlib-src/inftrees.h     Compress::Raw::Zlib
-cpan/Compress-Raw-Zlib/zlib-src/trees.c                Compress::Raw::Zlib
-cpan/Compress-Raw-Zlib/zlib-src/trees.h                Compress::Raw::Zlib
-cpan/Compress-Raw-Zlib/zlib-src/uncompr.c      Compress::Raw::Zlib
-cpan/Compress-Raw-Zlib/zlib-src/zconf.h                Compress::Raw::Zlib
-cpan/Compress-Raw-Zlib/zlib-src/zlib.h         Compress::Raw::Zlib
-cpan/Compress-Raw-Zlib/zlib-src/zutil.c                Compress::Raw::Zlib
-cpan/Compress-Raw-Zlib/zlib-src/zutil.h                Compress::Raw::Zlib
-cpan/Config-Perl-V/t/10_base.t                 Config::Perl::V
-cpan/Config-Perl-V/t/20_plv56.t                        Config::Perl::V
-cpan/Config-Perl-V/t/21_plv58.t                        Config::Perl::V
-cpan/Config-Perl-V/t/22_plv510.t               Config::Perl::V
-cpan/Config-Perl-V/t/23_plv512.t               Config::Perl::V
-cpan/Config-Perl-V/t/24_plv514.t               Config::Perl::V
-cpan/Config-Perl-V/t/25_plv516.t               Config::Perl::V
-cpan/Config-Perl-V/t/25_plv5162.t              Config::Perl::V
-cpan/Config-Perl-V/t/26_plv518.t               Config::Perl::V
-cpan/Config-Perl-V/t/26_plv5182.t              Config::Perl::V
-cpan/Config-Perl-V/t/27_plv5200.t              Config::Perl::V
-cpan/Config-Perl-V/t/27_plv5202.t              Config::Perl::V
-cpan/Config-Perl-V/t/28_plv5220.t              Config::Perl::V
-cpan/Config-Perl-V/t/28_plv52201w.t            Config::Perl::V
-cpan/Config-Perl-V/t/29_plv5235w.t             Config::Perl::V
-cpan/Config-Perl-V/t/30_plv5240.t              Config::Perl::V
-cpan/Config-Perl-V/t/31_plv52511.t             Config::Perl::V
-cpan/Config-Perl-V/t/32_plv5261rc1.t           Config::Perl::V
-cpan/Config-Perl-V/t/33_plv52711r.t            Config::Perl::V
-cpan/Config-Perl-V/t/34_plv5280.t              Config::Perl::V
-cpan/Config-Perl-V/t/35_plv52910g.t            Config::Perl::V
-cpan/Config-Perl-V/t/36_plv5300.t              Config::Perl::V
-cpan/Config-Perl-V/t/37_plv53111qm.t           Config::Perl::V
-cpan/Config-Perl-V/t/38_plv5320tld.t           Config::Perl::V
-cpan/Config-Perl-V/V.pm                                Config::Perl::V
-cpan/CPAN/lib/App/Cpan.pm              helper package for CPAN.pm
-cpan/CPAN/lib/CPAN.pm                  Interface to Comprehensive Perl Archive Network
-cpan/CPAN/lib/CPAN/API/HOWTO.pod       recipe book for programming with CPAN.pm
-cpan/CPAN/lib/CPAN/Author.pm           helper package for CPAN.pm
-cpan/CPAN/lib/CPAN/Bundle.pm           helper package for CPAN.pm
-cpan/CPAN/lib/CPAN/CacheMgr.pm         helper package for CPAN.pm
-cpan/CPAN/lib/CPAN/Complete.pm         helper package for CPAN.pm
-cpan/CPAN/lib/CPAN/Debug.pm            helper package for CPAN.pm
-cpan/CPAN/lib/CPAN/DeferredCode.pm     helper package for CPAN.pm
-cpan/CPAN/lib/CPAN/Distribution.pm     helper package for CPAN.pm
-cpan/CPAN/lib/CPAN/Distroprefs.pm      helper package for CPAN.pm
-cpan/CPAN/lib/CPAN/Distrostatus.pm     helper package for CPAN.pm
-cpan/CPAN/lib/CPAN/Exception/blocked_urllist.pm        helper package for CPAN.pm
+cpan/Compress-Raw-Zlib/typemap                         Compress::Raw::Zlib
+cpan/Compress-Raw-Zlib/Zlib.xs                         Compress::Raw::Zlib
+cpan/Compress-Raw-Zlib/zlib-src/adler32.c              Compress::Raw::Zlib
+cpan/Compress-Raw-Zlib/zlib-src/compress.c             Compress::Raw::Zlib
+cpan/Compress-Raw-Zlib/zlib-src/crc32.c                        Compress::Raw::Zlib
+cpan/Compress-Raw-Zlib/zlib-src/crc32.h                        Compress::Raw::Zlib
+cpan/Compress-Raw-Zlib/zlib-src/deflate.c              Compress::Raw::Zlib
+cpan/Compress-Raw-Zlib/zlib-src/deflate.h              Compress::Raw::Zlib
+cpan/Compress-Raw-Zlib/zlib-src/infback.c              Compress::Raw::Zlib
+cpan/Compress-Raw-Zlib/zlib-src/inffast.c              Compress::Raw::Zlib
+cpan/Compress-Raw-Zlib/zlib-src/inffast.h              Compress::Raw::Zlib
+cpan/Compress-Raw-Zlib/zlib-src/inffixed.h             Compress::Raw::Zlib
+cpan/Compress-Raw-Zlib/zlib-src/inflate.c              Compress::Raw::Zlib
+cpan/Compress-Raw-Zlib/zlib-src/inflate.h              Compress::Raw::Zlib
+cpan/Compress-Raw-Zlib/zlib-src/inftrees.c             Compress::Raw::Zlib
+cpan/Compress-Raw-Zlib/zlib-src/inftrees.h             Compress::Raw::Zlib
+cpan/Compress-Raw-Zlib/zlib-src/trees.c                        Compress::Raw::Zlib
+cpan/Compress-Raw-Zlib/zlib-src/trees.h                        Compress::Raw::Zlib
+cpan/Compress-Raw-Zlib/zlib-src/uncompr.c              Compress::Raw::Zlib
+cpan/Compress-Raw-Zlib/zlib-src/zconf.h                        Compress::Raw::Zlib
+cpan/Compress-Raw-Zlib/zlib-src/zlib.h                 Compress::Raw::Zlib
+cpan/Compress-Raw-Zlib/zlib-src/zutil.c                        Compress::Raw::Zlib
+cpan/Compress-Raw-Zlib/zlib-src/zutil.h                        Compress::Raw::Zlib
+cpan/Config-Perl-V/t/10_base.t         Config::Perl::V
+cpan/Config-Perl-V/t/20_plv56.t                Config::Perl::V
+cpan/Config-Perl-V/t/21_plv58.t                Config::Perl::V
+cpan/Config-Perl-V/t/22_plv510.t       Config::Perl::V
+cpan/Config-Perl-V/t/23_plv512.t       Config::Perl::V
+cpan/Config-Perl-V/t/24_plv514.t       Config::Perl::V
+cpan/Config-Perl-V/t/25_plv516.t       Config::Perl::V
+cpan/Config-Perl-V/t/25_plv5162.t      Config::Perl::V
+cpan/Config-Perl-V/t/26_plv518.t       Config::Perl::V
+cpan/Config-Perl-V/t/26_plv5182.t      Config::Perl::V
+cpan/Config-Perl-V/t/27_plv5200.t      Config::Perl::V
+cpan/Config-Perl-V/t/27_plv5202.t      Config::Perl::V
+cpan/Config-Perl-V/t/28_plv5220.t      Config::Perl::V
+cpan/Config-Perl-V/t/28_plv52201w.t    Config::Perl::V
+cpan/Config-Perl-V/t/29_plv5235w.t     Config::Perl::V
+cpan/Config-Perl-V/t/30_plv5240.t      Config::Perl::V
+cpan/Config-Perl-V/t/31_plv52511.t     Config::Perl::V
+cpan/Config-Perl-V/t/32_plv5261rc1.t   Config::Perl::V
+cpan/Config-Perl-V/t/33_plv52711r.t    Config::Perl::V
+cpan/Config-Perl-V/t/34_plv5280.t      Config::Perl::V
+cpan/Config-Perl-V/t/35_plv52910g.t    Config::Perl::V
+cpan/Config-Perl-V/t/36_plv5300.t      Config::Perl::V
+cpan/Config-Perl-V/t/37_plv53111qm.t   Config::Perl::V
+cpan/Config-Perl-V/t/38_plv5320tld.t   Config::Perl::V
+cpan/Config-Perl-V/t/39_plv5340tqm.t   Config::Perl::V
+cpan/Config-Perl-V/t/40_plv5358dnqm.t  Config::Perl::V
+cpan/Config-Perl-V/t/41_plv5360dnqm.t  Config::Perl::V
+cpan/Config-Perl-V/t/42_plv5373tld.t   Config::Perl::V
+cpan/Config-Perl-V/t/43_plv53710rcs.t  Test file related to Config::Perl::V
+cpan/Config-Perl-V/V.pm                        Config::Perl::V
+cpan/CPAN/lib/App/Cpan.pm                              helper package for CPAN.pm
+cpan/CPAN/lib/CPAN.pm                                  Interface to Comprehensive Perl Archive Network
+cpan/CPAN/lib/CPAN/API/HOWTO.pod                       recipe book for programming with CPAN.pm
+cpan/CPAN/lib/CPAN/Author.pm                           helper package for CPAN.pm
+cpan/CPAN/lib/CPAN/Bundle.pm                           helper package for CPAN.pm
+cpan/CPAN/lib/CPAN/CacheMgr.pm                         helper package for CPAN.pm
+cpan/CPAN/lib/CPAN/Complete.pm                         helper package for CPAN.pm
+cpan/CPAN/lib/CPAN/Debug.pm                            helper package for CPAN.pm
+cpan/CPAN/lib/CPAN/DeferredCode.pm                     helper package for CPAN.pm
+cpan/CPAN/lib/CPAN/Distribution.pm                     helper package for CPAN.pm
+cpan/CPAN/lib/CPAN/Distroprefs.pm                      helper package for CPAN.pm
+cpan/CPAN/lib/CPAN/Distrostatus.pm                     helper package for CPAN.pm
+cpan/CPAN/lib/CPAN/Exception/blocked_urllist.pm                helper package for CPAN.pm
 cpan/CPAN/lib/CPAN/Exception/RecursiveDependency.pm    helper package for CPAN.pm
 cpan/CPAN/lib/CPAN/Exception/yaml_not_installed.pm     helper package for CPAN.pm
 cpan/CPAN/lib/CPAN/Exception/yaml_process_error.pm     helper package for CPAN.pm
-cpan/CPAN/lib/CPAN/FirstTime.pm                Utility for creating CPAN config files
-cpan/CPAN/lib/CPAN/FTP.pm                      helper package for CPAN.pm
-cpan/CPAN/lib/CPAN/FTP/netrc.pm                helper package for CPAN.pm
-cpan/CPAN/lib/CPAN/HandleConfig.pm     helper package for CPAN.pm
-cpan/CPAN/lib/CPAN/HTTP/Client.pm      helper package for CPAN.pm
-cpan/CPAN/lib/CPAN/HTTP/Credentials.pm helper package for CPAN.pm
-cpan/CPAN/lib/CPAN/Index.pm            helper package for CPAN.pm
-cpan/CPAN/lib/CPAN/InfoObj.pm          helper package for CPAN.pm
-cpan/CPAN/lib/CPAN/Kwalify.pm          helper package for CPAN.pm
+cpan/CPAN/lib/CPAN/FirstTime.pm                                Utility for creating CPAN config files
+cpan/CPAN/lib/CPAN/FTP.pm                              helper package for CPAN.pm
+cpan/CPAN/lib/CPAN/FTP/netrc.pm                                helper package for CPAN.pm
+cpan/CPAN/lib/CPAN/HandleConfig.pm                     helper package for CPAN.pm
+cpan/CPAN/lib/CPAN/HTTP/Client.pm                      helper package for CPAN.pm
+cpan/CPAN/lib/CPAN/HTTP/Credentials.pm                 helper package for CPAN.pm
+cpan/CPAN/lib/CPAN/Index.pm                            helper package for CPAN.pm
+cpan/CPAN/lib/CPAN/InfoObj.pm                          helper package for CPAN.pm
+cpan/CPAN/lib/CPAN/Kwalify.pm                          helper package for CPAN.pm
 cpan/CPAN/lib/CPAN/Kwalify/distroprefs.dd              helper file for validating config files
-cpan/CPAN/lib/CPAN/Kwalify/distroprefs.yml     helper file for validating config files
-cpan/CPAN/lib/CPAN/LWP/UserAgent.pm    helper package for CPAN.pm
-cpan/CPAN/lib/CPAN/Mirrors.pm          helper package for CPAN.pm
-cpan/CPAN/lib/CPAN/Module.pm           helper package for CPAN.pm
-cpan/CPAN/lib/CPAN/Nox.pm                      Runs CPAN while avoiding compiled extensions
+cpan/CPAN/lib/CPAN/Kwalify/distroprefs.yml             helper file for validating config files
+cpan/CPAN/lib/CPAN/LWP/UserAgent.pm                    helper package for CPAN.pm
+cpan/CPAN/lib/CPAN/Mirrors.pm                          helper package for CPAN.pm
+cpan/CPAN/lib/CPAN/Module.pm                           helper package for CPAN.pm
+cpan/CPAN/lib/CPAN/Nox.pm                              Runs CPAN while avoiding compiled extensions
 cpan/CPAN/lib/CPAN/Plugin.pm
 cpan/CPAN/lib/CPAN/Plugin/Specfile.pm
 cpan/CPAN/lib/CPAN/Prompt.pm
-cpan/CPAN/lib/CPAN/Queue.pm            queueing system for CPAN.pm
+cpan/CPAN/lib/CPAN/Queue.pm                            queueing system for CPAN.pm
 cpan/CPAN/lib/CPAN/Shell.pm
-cpan/CPAN/lib/CPAN/Tarzip.pm           helper package for CPAN.pm
+cpan/CPAN/lib/CPAN/Tarzip.pm                           helper package for CPAN.pm
 cpan/CPAN/lib/CPAN/URL.pm
-cpan/CPAN/lib/CPAN/Version.pm          Simple math with different flavors of version strings
-cpan/CPAN/PAUSE2003.pub                CPAN public key
-cpan/CPAN/PAUSE2005.pub                CPAN public key
-cpan/CPAN/PAUSE2007.pub                CPAN public key
-cpan/CPAN/PAUSE2009.pub                CPAN public key
+cpan/CPAN/lib/CPAN/Version.pm                          Simple math with different flavors of version strings
+cpan/CPAN/PAUSE2003.pub                                        CPAN public key
+cpan/CPAN/PAUSE2005.pub                                        CPAN public key
+cpan/CPAN/PAUSE2007.pub                                        CPAN public key
+cpan/CPAN/PAUSE2009.pub                                        CPAN public key
 cpan/CPAN/PAUSE2011.pub
 cpan/CPAN/PAUSE2022.pub
-cpan/CPAN/scripts/cpan         easily interact with CPAN from the command line
-cpan/CPAN/t/01loadme.t         See if CPAN the module works
-cpan/CPAN/t/02nox.t            See if CPAN::Nox works
-cpan/CPAN/t/03pkgs.t           See if CPAN::Version works
-cpan/CPAN/t/10version.t                See if CPAN the module works
-cpan/CPAN/t/11mirroredby.t             See if CPAN::Mirrored::By works
+cpan/CPAN/scripts/cpan                                 easily interact with CPAN from the command line
+cpan/CPAN/t/01loadme.t                                 See if CPAN the module works
+cpan/CPAN/t/02nox.t                                    See if CPAN::Nox works
+cpan/CPAN/t/03pkgs.t                                   See if CPAN::Version works
+cpan/CPAN/t/10version.t                                        See if CPAN the module works
+cpan/CPAN/t/11mirroredby.t                             See if CPAN::Mirrored::By works
 cpan/CPAN/t/32pushyhttps.t
 cpan/CPAN-Meta/corpus/BadMETA.yml
 cpan/CPAN-Meta/corpus/bareyaml.meta
@@ -446,14 +646,14 @@ cpan/CPAN-Meta-Requirements/t/finalize.t
 cpan/CPAN-Meta-Requirements/t/from-hash.t
 cpan/CPAN-Meta-Requirements/t/merge.t
 cpan/CPAN-Meta-Requirements/t/strings.t
-cpan/CPAN-Meta-YAML/lib/CPAN/Meta/YAML.pm              CPAN-Meta-YAML files
+cpan/CPAN-Meta-YAML/lib/CPAN/Meta/YAML.pm                              CPAN-Meta-YAML files
 cpan/CPAN-Meta-YAML/t/01_api.t
-cpan/CPAN-Meta-YAML/t/01_compile.t             CPAN-Meta-YAML files
+cpan/CPAN-Meta-YAML/t/01_compile.t                                     CPAN-Meta-YAML files
 cpan/CPAN-Meta-YAML/t/10_read.t
 cpan/CPAN-Meta-YAML/t/11_read_string.t
 cpan/CPAN-Meta-YAML/t/12_write.t
 cpan/CPAN-Meta-YAML/t/13_write_string.t
-cpan/CPAN-Meta-YAML/t/20_subclass.t            CPAN-Meta-YAML files
+cpan/CPAN-Meta-YAML/t/20_subclass.t                                    CPAN-Meta-YAML files
 cpan/CPAN-Meta-YAML/t/21_yamlpm_compat.t
 cpan/CPAN-Meta-YAML/t/30_yaml_spec_tml.t
 cpan/CPAN-Meta-YAML/t/31_local_tml.t
@@ -461,8 +661,8 @@ cpan/CPAN-Meta-YAML/t/32_world_tml.t
 cpan/CPAN-Meta-YAML/t/86_fail.t
 cpan/CPAN-Meta-YAML/t/data/ascii.yml
 cpan/CPAN-Meta-YAML/t/data/latin1.yml
-cpan/CPAN-Meta-YAML/t/data/multibyte.yml               CPAN-Meta-YAML files
-cpan/CPAN-Meta-YAML/t/data/utf_16_le_bom.yml           CPAN-Meta-YAML files
+cpan/CPAN-Meta-YAML/t/data/multibyte.yml                               CPAN-Meta-YAML files
+cpan/CPAN-Meta-YAML/t/data/utf_16_le_bom.yml                           CPAN-Meta-YAML files
 cpan/CPAN-Meta-YAML/t/data/utf_8_bom.yml
 cpan/CPAN-Meta-YAML/t/lib/SubtestCompat.pm
 cpan/CPAN-Meta-YAML/t/lib/TestBridge.pm
@@ -497,30 +697,30 @@ cpan/CPAN-Meta-YAML/t/tml-world/toolbar.tml
 cpan/CPAN-Meta-YAML/t/tml-world/Vanilla-Perl.tml
 cpan/CPAN-Meta-YAML/t/tml-world/YAML-Tiny-META.tml
 cpan/CPAN-Meta-YAML/t/tml-world/yaml_org.tml
-cpan/DB_File/config.in         Part of Berkeley DB configuration
-cpan/DB_File/DB_File.pm                Berkeley DB extension Perl module
-cpan/DB_File/DB_File.xs                Berkeley DB extension external subroutines
-cpan/DB_File/dbinfo            Berkeley DB database version checker
+cpan/DB_File/config.in                 Part of Berkeley DB configuration
+cpan/DB_File/DB_File.pm                        Berkeley DB extension Perl module
+cpan/DB_File/DB_File.xs                        Berkeley DB extension external subroutines
+cpan/DB_File/dbinfo                    Berkeley DB database version checker
 cpan/DB_File/hints/bitrig.pl
-cpan/DB_File/hints/dynixptx.pl Hint for DB_File for named architecture
+cpan/DB_File/hints/dynixptx.pl         Hint for DB_File for named architecture
 cpan/DB_File/hints/minix.pl
 cpan/DB_File/hints/netbsd.pl
 cpan/DB_File/hints/openbsd.pl
-cpan/DB_File/hints/sco.pl      Hint for DB_File for named architecture
-cpan/DB_File/Makefile.PL       Berkeley DB extension makefile writer
-cpan/DB_File/t/db-btree.t      See if DB_File works
-cpan/DB_File/t/db-hash.t       See if DB_File works
-cpan/DB_File/t/db-recno.t      See if DB_File works
-cpan/DB_File/t/db-threads.t    See if DB_File works
-cpan/DB_File/typemap           Berkeley DB extension interface types
-cpan/DB_File/version.c         Berkeley DB extension interface version check
+cpan/DB_File/hints/sco.pl              Hint for DB_File for named architecture
+cpan/DB_File/Makefile.PL               Berkeley DB extension makefile writer
+cpan/DB_File/t/db-btree.t              See if DB_File works
+cpan/DB_File/t/db-hash.t               See if DB_File works
+cpan/DB_File/t/db-recno.t              See if DB_File works
+cpan/DB_File/t/db-threads.t            See if DB_File works
+cpan/DB_File/typemap                   Berkeley DB extension interface types
+cpan/DB_File/version.c                 Berkeley DB extension interface version check
 cpan/Digest/lib/Digest.pm
 cpan/Digest/lib/Digest/base.pm
 cpan/Digest/lib/Digest/file.pm
-cpan/Digest/t/base.t           See if Digest extensions work
-cpan/Digest/t/digest.t         See if Digest extensions work
-cpan/Digest/t/file.t           See if Digest extensions work
-cpan/Digest/t/lib/Digest/Dummy.pm              See if Digest extensions work
+cpan/Digest/t/base.t                   See if Digest extensions work
+cpan/Digest/t/digest.t                 See if Digest extensions work
+cpan/Digest/t/file.t                   See if Digest extensions work
+cpan/Digest/t/lib/Digest/Dummy.pm      See if Digest extensions work
 cpan/Digest/t/security.t               See if Digest extensions work
 cpan/Digest-MD5/hints/dec_osf.pl       Hints for named architecture
 cpan/Digest-MD5/hints/irix_6.pl                Hints for named architecture
@@ -571,225 +771,226 @@ cpan/Digest-SHA/t/state.t               See if Digest::SHA works
 cpan/Digest-SHA/t/unicode.t
 cpan/Digest-SHA/t/woodbury.t           See if Digest::SHA works
 cpan/Digest-SHA/typemap                        Typemap for Digest::SHA
-cpan/Encode/bin/enc2xs         Encode module generator
-cpan/Encode/bin/encguess               guess character encodings of files
-cpan/Encode/bin/piconv         iconv by perl
-cpan/Encode/bin/ucm2table      Table Generator for testing
-cpan/Encode/bin/ucmlint                A UCM Lint utility
-cpan/Encode/bin/ucmsort                A UCM sort utility
-cpan/Encode/bin/unidump                Unicode Dump like hexdump(1)
-cpan/Encode/Byte/Byte.pm               Encode extension
-cpan/Encode/Byte/Makefile.PL   Encode extension
-cpan/Encode/CN/CN.pm           Encode extension
-cpan/Encode/CN/Makefile.PL     Encode extension
-cpan/Encode/EBCDIC/EBCDIC.pm   Encode extension
-cpan/Encode/EBCDIC/Makefile.PL Encode extension
-cpan/Encode/encengine.c                Encode extension
-cpan/Encode/Encode.pm          Mother of all Encode extensions
-cpan/Encode/Encode.xs          Encode extension
-cpan/Encode/Encode/_PM.e2x     Skeleton file for enc2xs
-cpan/Encode/Encode/_T.e2x      Skeleton file for enc2xs
-cpan/Encode/Encode/Changes.e2x Skeleton file for enc2xs
-cpan/Encode/Encode/ConfigLocal_PM.e2x  Skeleton file for enc2xs
-cpan/Encode/Encode/encode.h    Encode extension header file
-cpan/Encode/Encode/Makefile_PL.e2x     Skeleton file for enc2xs
-cpan/Encode/Encode/README.e2x  Skeleton file for enc2xs
-cpan/Encode/encoding.pm                Perl Pragmatic Module
-cpan/Encode/JP/JP.pm           Encode extension
-cpan/Encode/JP/Makefile.PL     Encode extension
-cpan/Encode/KR/KR.pm           Encode extension
-cpan/Encode/KR/Makefile.PL     Encode extension
-cpan/Encode/lib/Encode/Alias.pm        Encode extension
-cpan/Encode/lib/Encode/CJKConstants.pm Encode extension
-cpan/Encode/lib/Encode/CN/HZ.pm                Encode extension
-cpan/Encode/lib/Encode/Config.pm       Encode configuration module
-cpan/Encode/lib/Encode/Encoder.pm      OO Encoder
-cpan/Encode/lib/Encode/Encoding.pm     Encode extension
-cpan/Encode/lib/Encode/GSM0338.pm      Encode extension
-cpan/Encode/lib/Encode/Guess.pm        Encode Extension
-cpan/Encode/lib/Encode/JP/H2Z.pm       Encode extension
-cpan/Encode/lib/Encode/JP/JIS7.pm      Encode extension
-cpan/Encode/lib/Encode/KR/2022_KR.pm   Encode extension
-cpan/Encode/lib/Encode/MIME/Header.pm  Encode extension
+cpan/Encode/bin/enc2xs                                 Encode module generator
+cpan/Encode/bin/encguess                               guess character encodings of files
+cpan/Encode/bin/piconv                                 iconv by perl
+cpan/Encode/bin/ucm2table                              Table Generator for testing
+cpan/Encode/bin/ucmlint                                        A UCM Lint utility
+cpan/Encode/bin/ucmsort                                        A UCM sort utility
+cpan/Encode/bin/unidump                                        Unicode Dump like hexdump(1)
+cpan/Encode/Byte/Byte.pm                               Encode extension
+cpan/Encode/Byte/Makefile.PL                           Encode extension
+cpan/Encode/CN/CN.pm                                   Encode extension
+cpan/Encode/CN/Makefile.PL                             Encode extension
+cpan/Encode/EBCDIC/EBCDIC.pm                           Encode extension
+cpan/Encode/EBCDIC/Makefile.PL                         Encode extension
+cpan/Encode/encengine.c                                        Encode extension
+cpan/Encode/Encode.pm                                  Mother of all Encode extensions
+cpan/Encode/Encode.xs                                  Encode extension
+cpan/Encode/Encode/_PM.e2x                             Skeleton file for enc2xs
+cpan/Encode/Encode/_T.e2x                              Skeleton file for enc2xs
+cpan/Encode/Encode/Changes.e2x                         Skeleton file for enc2xs
+cpan/Encode/Encode/ConfigLocal_PM.e2x                  Skeleton file for enc2xs
+cpan/Encode/Encode/encode.h                            Encode extension header file
+cpan/Encode/Encode/Makefile_PL.e2x                     Skeleton file for enc2xs
+cpan/Encode/Encode/README.e2x                          Skeleton file for enc2xs
+cpan/Encode/encoding.pm                                        Perl Pragmatic Module
+cpan/Encode/JP/JP.pm                                   Encode extension
+cpan/Encode/JP/Makefile.PL                             Encode extension
+cpan/Encode/KR/KR.pm                                   Encode extension
+cpan/Encode/KR/Makefile.PL                             Encode extension
+cpan/Encode/lib/Encode/Alias.pm                                Encode extension
+cpan/Encode/lib/Encode/CJKConstants.pm                 Encode extension
+cpan/Encode/lib/Encode/CN/HZ.pm                                Encode extension
+cpan/Encode/lib/Encode/Config.pm                       Encode configuration module
+cpan/Encode/lib/Encode/Encoder.pm                      OO Encoder
+cpan/Encode/lib/Encode/Encoding.pm                     Encode extension
+cpan/Encode/lib/Encode/GSM0338.pm                      Encode extension
+cpan/Encode/lib/Encode/Guess.pm                                Encode Extension
+cpan/Encode/lib/Encode/JP/H2Z.pm                       Encode extension
+cpan/Encode/lib/Encode/JP/JIS7.pm                      Encode extension
+cpan/Encode/lib/Encode/KR/2022_KR.pm                   Encode extension
+cpan/Encode/lib/Encode/MIME/Header.pm                  Encode extension
 cpan/Encode/lib/Encode/MIME/Header/ISO_2022_JP.pm      Encode extension
-cpan/Encode/lib/Encode/MIME/Name.pm    Encode extension
-cpan/Encode/lib/Encode/PerlIO.pod      Documents for Encode & PerlIO
-cpan/Encode/lib/Encode/Supported.pod   Documents for supported encodings
-cpan/Encode/lib/Encode/Unicode/UTF7.pm Encode extension
-cpan/Encode/Makefile.PL                        Encode extension makefile writer
-cpan/Encode/Symbol/Makefile.PL         Encode extension
-cpan/Encode/Symbol/Symbol.pm           Encode extension
-cpan/Encode/t/Aliases.t                        test script
-cpan/Encode/t/at-cn.t                  test script
-cpan/Encode/t/at-tw.t                  test script
-cpan/Encode/t/big5-eten.enc            test data
-cpan/Encode/t/big5-eten.utf            test data
-cpan/Encode/t/big5-hkscs.enc           test data
-cpan/Encode/t/big5-hkscs.utf           test data
-cpan/Encode/t/CJKT.t                   test script
+cpan/Encode/lib/Encode/MIME/Name.pm                    Encode extension
+cpan/Encode/lib/Encode/PerlIO.pod                      Documents for Encode & PerlIO
+cpan/Encode/lib/Encode/Supported.pod                   Documents for supported encodings
+cpan/Encode/lib/Encode/Unicode/UTF7.pm                 Encode extension
+cpan/Encode/Makefile.PL                                        Encode extension makefile writer
+cpan/Encode/Symbol/Makefile.PL                         Encode extension
+cpan/Encode/Symbol/Symbol.pm                           Encode extension
+cpan/Encode/t/Aliases.t                                        test script
+cpan/Encode/t/at-cn.t                                  test script
+cpan/Encode/t/at-tw.t                                  test script
+cpan/Encode/t/big5-eten.enc                            test data
+cpan/Encode/t/big5-eten.utf                            test data
+cpan/Encode/t/big5-hkscs.enc                           test data
+cpan/Encode/t/big5-hkscs.utf                           test data
+cpan/Encode/t/CJKT.t                                   test script
 cpan/Encode/t/cow.t
 cpan/Encode/t/decode.t
-cpan/Encode/t/enc_data.t               test script for utf8 DATA
-cpan/Encode/t/enc_eucjp.t              test script
-cpan/Encode/t/enc_module.enc           test data for t/enc_module.t
-cpan/Encode/t/enc_module.t             test script
-cpan/Encode/t/enc_utf8.t               test script
-cpan/Encode/t/Encode.t                 test script
-cpan/Encode/t/Encoder.t                        test script
-cpan/Encode/t/encoding.t               test script
-cpan/Encode/t/encoding-locale.t                test script
-cpan/Encode/t/fallback.t               test script
-cpan/Encode/t/from_to.t                        test script
-cpan/Encode/t/gb2312.enc               test data
-cpan/Encode/t/gb2312.utf               test data
-cpan/Encode/t/grow.t                   test script
-cpan/Encode/t/gsm0338.t                        test script
-cpan/Encode/t/guess.t                  test script
+cpan/Encode/t/enc_data.t                               test script for utf8 DATA
+cpan/Encode/t/enc_eucjp.t                              test script
+cpan/Encode/t/enc_module.enc                           test data for t/enc_module.t
+cpan/Encode/t/enc_module.t                             test script
+cpan/Encode/t/enc_utf8.t                               test script
+cpan/Encode/t/Encode.t                                 test script
+cpan/Encode/t/Encoder.t                                        test script
+cpan/Encode/t/encoding.t                               test script
+cpan/Encode/t/encoding-locale.t                                test script
+cpan/Encode/t/fallback.t                               test script
+cpan/Encode/t/from_to.t                                        test script
+cpan/Encode/t/gb2312.enc                               test data
+cpan/Encode/t/gb2312.utf                               test data
+cpan/Encode/t/grow.t                                   test script
+cpan/Encode/t/gsm0338.t                                        test script
+cpan/Encode/t/guess.t                                  test script
 cpan/Encode/t/isa.t
-cpan/Encode/t/jis7-fallback.t          test script
-cpan/Encode/t/jisx0201.enc             test data
-cpan/Encode/t/jisx0201.utf             test data
-cpan/Encode/t/jisx0208.enc             test data
-cpan/Encode/t/jisx0208.utf             test data
-cpan/Encode/t/jisx0212.enc             test data
-cpan/Encode/t/jisx0212.utf             test data
-cpan/Encode/t/jperl.t                  test script
-cpan/Encode/t/ksc5601.enc              test data
-cpan/Encode/t/ksc5601.utf              test data
-cpan/Encode/t/magic.t                  test script
-cpan/Encode/t/mime-header.t            test script
-cpan/Encode/t/mime-name.t              test script
-cpan/Encode/t/mime_header_iso2022jp.t  test script
-cpan/Encode/t/Mod_EUCJP.pm             module that t/enc_module.enc uses
-cpan/Encode/t/perlio.t                 test script
-cpan/Encode/t/piconv.t                 Test for piconv.t
-cpan/Encode/t/rt.pl                    test script
-cpan/Encode/t/rt113164.t               test script
-cpan/Encode/t/rt65541.t                        test script
-cpan/Encode/t/rt76824.t                        test script
-cpan/Encode/t/rt85489.t                        test script
-cpan/Encode/t/rt86327.t                        test script
+cpan/Encode/t/jis7-fallback.t                          test script
+cpan/Encode/t/jisx0201.enc                             test data
+cpan/Encode/t/jisx0201.utf                             test data
+cpan/Encode/t/jisx0208.enc                             test data
+cpan/Encode/t/jisx0208.utf                             test data
+cpan/Encode/t/jisx0212.enc                             test data
+cpan/Encode/t/jisx0212.utf                             test data
+cpan/Encode/t/jperl.t                                  test script
+cpan/Encode/t/ksc5601.enc                              test data
+cpan/Encode/t/ksc5601.utf                              test data
+cpan/Encode/t/magic.t                                  test script
+cpan/Encode/t/mime-header.t                            test script
+cpan/Encode/t/mime-name.t                              test script
+cpan/Encode/t/mime_header_iso2022jp.t                  test script
+cpan/Encode/t/Mod_EUCJP.pm                             module that t/enc_module.enc uses
+cpan/Encode/t/perlio.t                                 test script
+cpan/Encode/t/piconv.t                                 Test for piconv.t
+cpan/Encode/t/rt.pl                                    test script
+cpan/Encode/t/rt113164.t                               test script
+cpan/Encode/t/rt65541.t                                        test script
+cpan/Encode/t/rt76824.t                                        test script
+cpan/Encode/t/rt85489.t                                        test script
+cpan/Encode/t/rt86327.t                                        test script
 cpan/Encode/t/taint.t
 cpan/Encode/t/truncated_utf8.t
 cpan/Encode/t/undef.t
-cpan/Encode/t/unibench.pl              benchmark script
-cpan/Encode/t/Unicode.t                        test script
+cpan/Encode/t/unibench.pl                              benchmark script
+cpan/Encode/t/Unicode.t                                        test script
 cpan/Encode/t/Unicode_trailing_nul.t
 cpan/Encode/t/use-Encode-Alias.t
 cpan/Encode/t/utf32warnings.t
-cpan/Encode/t/utf8ref.t                        test script
-cpan/Encode/t/utf8strict.t             test script
+cpan/Encode/t/utf8ref.t                                        test script
+cpan/Encode/t/utf8strict.t                             test script
 cpan/Encode/t/utf8warnings.t
 cpan/Encode/t/xml.t
-cpan/Encode/TW/Makefile.PL             Encode extension
-cpan/Encode/TW/TW.pm                   Encode extension
-cpan/Encode/ucm/8859-1.ucm             Unicode Character Map
-cpan/Encode/ucm/8859-10.ucm            Unicode Character Map
-cpan/Encode/ucm/8859-11.ucm            Unicode Character Map
-cpan/Encode/ucm/8859-13.ucm            Unicode Character Map
-cpan/Encode/ucm/8859-14.ucm            Unicode Character Map
-cpan/Encode/ucm/8859-15.ucm            Unicode Character Map
-cpan/Encode/ucm/8859-16.ucm            Unicode Character Map
-cpan/Encode/ucm/8859-2.ucm             Unicode Character Map
-cpan/Encode/ucm/8859-3.ucm             Unicode Character Map
-cpan/Encode/ucm/8859-4.ucm             Unicode Character Map
-cpan/Encode/ucm/8859-5.ucm             Unicode Character Map
-cpan/Encode/ucm/8859-6.ucm             Unicode Character Map
-cpan/Encode/ucm/8859-7.ucm             Unicode Character Map
-cpan/Encode/ucm/8859-8.ucm             Unicode Character Map
-cpan/Encode/ucm/8859-9.ucm             Unicode Character Map
-cpan/Encode/ucm/adobeStdenc.ucm                Unicode Character Map
-cpan/Encode/ucm/adobeSymbol.ucm                Unicode Character Map
-cpan/Encode/ucm/adobeZdingbat.ucm      Unicode Character Map
-cpan/Encode/ucm/ascii.ucm              Unicode Character Map
-cpan/Encode/ucm/big5-eten.ucm          Unicode Character Map
-cpan/Encode/ucm/big5-hkscs.ucm         Unicode Character Map
-cpan/Encode/ucm/cp037.ucm              Unicode Character Map
-cpan/Encode/ucm/cp1006.ucm             Unicode Character Map
-cpan/Encode/ucm/cp1026.ucm             Unicode Character Map
-cpan/Encode/ucm/cp1047.ucm             Unicode Character Map
-cpan/Encode/ucm/cp1250.ucm             Unicode Character Map
-cpan/Encode/ucm/cp1251.ucm             Unicode Character Map
-cpan/Encode/ucm/cp1252.ucm             Unicode Character Map
-cpan/Encode/ucm/cp1253.ucm             Unicode Character Map
-cpan/Encode/ucm/cp1254.ucm             Unicode Character Map
-cpan/Encode/ucm/cp1255.ucm             Unicode Character Map
-cpan/Encode/ucm/cp1256.ucm             Unicode Character Map
-cpan/Encode/ucm/cp1257.ucm             Unicode Character Map
-cpan/Encode/ucm/cp1258.ucm             Unicode Character Map
-cpan/Encode/ucm/cp424.ucm              Unicode Character Map
-cpan/Encode/ucm/cp437.ucm              Unicode Character Map
-cpan/Encode/ucm/cp500.ucm              Unicode Character Map
-cpan/Encode/ucm/cp737.ucm              Unicode Character Map
-cpan/Encode/ucm/cp775.ucm              Unicode Character Map
-cpan/Encode/ucm/cp850.ucm              Unicode Character Map
-cpan/Encode/ucm/cp852.ucm              Unicode Character Map
-cpan/Encode/ucm/cp855.ucm              Unicode Character Map
-cpan/Encode/ucm/cp856.ucm              Unicode Character Map
-cpan/Encode/ucm/cp857.ucm              Unicode Character Map
-cpan/Encode/ucm/cp858.ucm              Unicode Character Map
-cpan/Encode/ucm/cp860.ucm              Unicode Character Map
-cpan/Encode/ucm/cp861.ucm              Unicode Character Map
-cpan/Encode/ucm/cp862.ucm              Unicode Character Map
-cpan/Encode/ucm/cp863.ucm              Unicode Character Map
-cpan/Encode/ucm/cp864.ucm              Unicode Character Map
-cpan/Encode/ucm/cp865.ucm              Unicode Character Map
-cpan/Encode/ucm/cp866.ucm              Unicode Character Map
-cpan/Encode/ucm/cp869.ucm              Unicode Character Map
-cpan/Encode/ucm/cp874.ucm              Unicode Character Map
-cpan/Encode/ucm/cp875.ucm              Unicode Character Map
-cpan/Encode/ucm/cp932.ucm              Unicode Character Map
-cpan/Encode/ucm/cp936.ucm              Unicode Character Map
-cpan/Encode/ucm/cp949.ucm              Unicode Character Map
-cpan/Encode/ucm/cp950.ucm              Unicode Character Map
-cpan/Encode/ucm/ctrl.ucm               Unicode Character Map
-cpan/Encode/ucm/dingbats.ucm           Unicode Character Map
-cpan/Encode/ucm/euc-cn.ucm             Unicode Character Map
-cpan/Encode/ucm/euc-jp.ucm             Unicode Character Map
-cpan/Encode/ucm/euc-kr.ucm             Unicode Character Map
-cpan/Encode/ucm/gb12345.ucm            Unicode Character Map
-cpan/Encode/ucm/gb2312.ucm             Unicode Character Map
-cpan/Encode/ucm/hp-roman8.ucm          Unicode Character Map
-cpan/Encode/ucm/ir-165.ucm             Unicode Character Map
-cpan/Encode/ucm/jis0201.ucm            Unicode Character Map
-cpan/Encode/ucm/jis0208.ucm            Unicode Character Map
-cpan/Encode/ucm/jis0212.ucm            Unicode Character Map
-cpan/Encode/ucm/johab.ucm              Unicode Character Map
-cpan/Encode/ucm/koi8-f.ucm             Unicode Character Map
-cpan/Encode/ucm/koi8-r.ucm             Unicode Character Map
-cpan/Encode/ucm/koi8-u.ucm             Unicode Character Map
-cpan/Encode/ucm/ksc5601.ucm            Unicode Character Map
-cpan/Encode/ucm/macArabic.ucm          Unicode Character Map
-cpan/Encode/ucm/macCentEuro.ucm                Unicode Character Map
-cpan/Encode/ucm/macChinsimp.ucm                Unicode Character Map
-cpan/Encode/ucm/macChintrad.ucm                Unicode Character Map
-cpan/Encode/ucm/macCroatian.ucm                Unicode Character Map
-cpan/Encode/ucm/macCyrillic.ucm                Unicode Character Map
-cpan/Encode/ucm/macDingbats.ucm                Unicode Character Map
-cpan/Encode/ucm/macFarsi.ucm           Unicode Character Map
-cpan/Encode/ucm/macGreek.ucm           Unicode Character Map
-cpan/Encode/ucm/macHebrew.ucm          Unicode Character Map
-cpan/Encode/ucm/macIceland.ucm         Unicode Character Map
-cpan/Encode/ucm/macJapanese.ucm                Unicode Character Map
-cpan/Encode/ucm/macKorean.ucm          Unicode Character Map
-cpan/Encode/ucm/macRoman.ucm           Unicode Character Map
-cpan/Encode/ucm/macROMnn.ucm           Unicode Character Map
-cpan/Encode/ucm/macRUMnn.ucm           Unicode Character Map
-cpan/Encode/ucm/macSami.ucm            Unicode Character Map
-cpan/Encode/ucm/macSymbol.ucm          Unicode Character Map
-cpan/Encode/ucm/macThai.ucm            Unicode Character Map
-cpan/Encode/ucm/macTurkish.ucm         Unicode Character Map
-cpan/Encode/ucm/macUkraine.ucm         Unicode Character Map
-cpan/Encode/ucm/nextstep.ucm           Unicode Character Map
-cpan/Encode/ucm/null.ucm               Unicode Character Map
-cpan/Encode/ucm/posix-bc.ucm           Unicode Character Map
-cpan/Encode/ucm/shiftjis.ucm           Unicode Character Map
-cpan/Encode/ucm/symbol.ucm             Unicode Character Map
-cpan/Encode/ucm/viscii.ucm             Unicode Character Map
-cpan/Encode/Unicode/Makefile.PL                Encode extension
-cpan/Encode/Unicode/Unicode.pm         Encode extension
-cpan/Encode/Unicode/Unicode.xs         Encode extension
+cpan/Encode/TW/Makefile.PL                             Encode extension
+cpan/Encode/TW/TW.pm                                   Encode extension
+cpan/Encode/ucm/8859-1.ucm                             Unicode Character Map
+cpan/Encode/ucm/8859-10.ucm                            Unicode Character Map
+cpan/Encode/ucm/8859-11.ucm                            Unicode Character Map
+cpan/Encode/ucm/8859-13.ucm                            Unicode Character Map
+cpan/Encode/ucm/8859-14.ucm                            Unicode Character Map
+cpan/Encode/ucm/8859-15.ucm                            Unicode Character Map
+cpan/Encode/ucm/8859-16.ucm                            Unicode Character Map
+cpan/Encode/ucm/8859-2.ucm                             Unicode Character Map
+cpan/Encode/ucm/8859-3.ucm                             Unicode Character Map
+cpan/Encode/ucm/8859-4.ucm                             Unicode Character Map
+cpan/Encode/ucm/8859-5.ucm                             Unicode Character Map
+cpan/Encode/ucm/8859-6.ucm                             Unicode Character Map
+cpan/Encode/ucm/8859-7.ucm                             Unicode Character Map
+cpan/Encode/ucm/8859-8.ucm                             Unicode Character Map
+cpan/Encode/ucm/8859-9.ucm                             Unicode Character Map
+cpan/Encode/ucm/adobeStdenc.ucm                                Unicode Character Map
+cpan/Encode/ucm/adobeSymbol.ucm                                Unicode Character Map
+cpan/Encode/ucm/adobeZdingbat.ucm                      Unicode Character Map
+cpan/Encode/ucm/ascii.ucm                              Unicode Character Map
+cpan/Encode/ucm/big5-eten.ucm                          Unicode Character Map
+cpan/Encode/ucm/big5-hkscs.ucm                         Unicode Character Map
+cpan/Encode/ucm/cp037.ucm                              Unicode Character Map
+cpan/Encode/ucm/cp1006.ucm                             Unicode Character Map
+cpan/Encode/ucm/cp1026.ucm                             Unicode Character Map
+cpan/Encode/ucm/cp1047.ucm                             Unicode Character Map
+cpan/Encode/ucm/cp1250.ucm                             Unicode Character Map
+cpan/Encode/ucm/cp1251.ucm                             Unicode Character Map
+cpan/Encode/ucm/cp1252.ucm                             Unicode Character Map
+cpan/Encode/ucm/cp1253.ucm                             Unicode Character Map
+cpan/Encode/ucm/cp1254.ucm                             Unicode Character Map
+cpan/Encode/ucm/cp1255.ucm                             Unicode Character Map
+cpan/Encode/ucm/cp1256.ucm                             Unicode Character Map
+cpan/Encode/ucm/cp1257.ucm                             Unicode Character Map
+cpan/Encode/ucm/cp1258.ucm                             Unicode Character Map
+cpan/Encode/ucm/cp424.ucm                              Unicode Character Map
+cpan/Encode/ucm/cp437.ucm                              Unicode Character Map
+cpan/Encode/ucm/cp500.ucm                              Unicode Character Map
+cpan/Encode/ucm/cp737.ucm                              Unicode Character Map
+cpan/Encode/ucm/cp775.ucm                              Unicode Character Map
+cpan/Encode/ucm/cp850.ucm                              Unicode Character Map
+cpan/Encode/ucm/cp852.ucm                              Unicode Character Map
+cpan/Encode/ucm/cp855.ucm                              Unicode Character Map
+cpan/Encode/ucm/cp856.ucm                              Unicode Character Map
+cpan/Encode/ucm/cp857.ucm                              Unicode Character Map
+cpan/Encode/ucm/cp858.ucm                              Unicode Character Map
+cpan/Encode/ucm/cp860.ucm                              Unicode Character Map
+cpan/Encode/ucm/cp861.ucm                              Unicode Character Map
+cpan/Encode/ucm/cp862.ucm                              Unicode Character Map
+cpan/Encode/ucm/cp863.ucm                              Unicode Character Map
+cpan/Encode/ucm/cp864.ucm                              Unicode Character Map
+cpan/Encode/ucm/cp865.ucm                              Unicode Character Map
+cpan/Encode/ucm/cp866.ucm                              Unicode Character Map
+cpan/Encode/ucm/cp869.ucm                              Unicode Character Map
+cpan/Encode/ucm/cp874.ucm                              Unicode Character Map
+cpan/Encode/ucm/cp875.ucm                              Unicode Character Map
+cpan/Encode/ucm/cp932.ucm                              Unicode Character Map
+cpan/Encode/ucm/cp936.ucm                              Unicode Character Map
+cpan/Encode/ucm/cp949.ucm                              Unicode Character Map
+cpan/Encode/ucm/cp950.ucm                              Unicode Character Map
+cpan/Encode/ucm/ctrl.ucm                               Unicode Character Map
+cpan/Encode/ucm/dingbats.ucm                           Unicode Character Map
+cpan/Encode/ucm/euc-cn.ucm                             Unicode Character Map
+cpan/Encode/ucm/euc-jp.ucm                             Unicode Character Map
+cpan/Encode/ucm/euc-kr.ucm                             Unicode Character Map
+cpan/Encode/ucm/gb12345.ucm                            Unicode Character Map
+cpan/Encode/ucm/gb2312.ucm                             Unicode Character Map
+cpan/Encode/ucm/hp-roman8.ucm                          Unicode Character Map
+cpan/Encode/ucm/ir-165.ucm                             Unicode Character Map
+cpan/Encode/ucm/jis0201.ucm                            Unicode Character Map
+cpan/Encode/ucm/jis0208.ucm                            Unicode Character Map
+cpan/Encode/ucm/jis0212.ucm                            Unicode Character Map
+cpan/Encode/ucm/johab.ucm                              Unicode Character Map
+cpan/Encode/ucm/koi8-f.ucm                             Unicode Character Map
+cpan/Encode/ucm/koi8-r.ucm                             Unicode Character Map
+cpan/Encode/ucm/koi8-u.ucm                             Unicode Character Map
+cpan/Encode/ucm/ksc5601.ucm                            Unicode Character Map
+cpan/Encode/ucm/macArabic.ucm                          Unicode Character Map
+cpan/Encode/ucm/macCentEuro.ucm                                Unicode Character Map
+cpan/Encode/ucm/macChinsimp.ucm                                Unicode Character Map
+cpan/Encode/ucm/macChintrad.ucm                                Unicode Character Map
+cpan/Encode/ucm/macCroatian.ucm                                Unicode Character Map
+cpan/Encode/ucm/macCyrillic.ucm                                Unicode Character Map
+cpan/Encode/ucm/macDingbats.ucm                                Unicode Character Map
+cpan/Encode/ucm/macFarsi.ucm                           Unicode Character Map
+cpan/Encode/ucm/macGreek.ucm                           Unicode Character Map
+cpan/Encode/ucm/macHebrew.ucm                          Unicode Character Map
+cpan/Encode/ucm/macIceland.ucm                         Unicode Character Map
+cpan/Encode/ucm/macJapanese.ucm                                Unicode Character Map
+cpan/Encode/ucm/macKorean.ucm                          Unicode Character Map
+cpan/Encode/ucm/macRoman.ucm                           Unicode Character Map
+cpan/Encode/ucm/macROMnn.ucm                           Unicode Character Map
+cpan/Encode/ucm/macRUMnn.ucm                           Unicode Character Map
+cpan/Encode/ucm/macSami.ucm                            Unicode Character Map
+cpan/Encode/ucm/macSymbol.ucm                          Unicode Character Map
+cpan/Encode/ucm/macThai.ucm                            Unicode Character Map
+cpan/Encode/ucm/macTurkish.ucm                         Unicode Character Map
+cpan/Encode/ucm/macUkraine.ucm                         Unicode Character Map
+cpan/Encode/ucm/nextstep.ucm                           Unicode Character Map
+cpan/Encode/ucm/null.ucm                               Unicode Character Map
+cpan/Encode/ucm/posix-bc.ucm                           Unicode Character Map
+cpan/Encode/ucm/shiftjis.ucm                           Unicode Character Map
+cpan/Encode/ucm/symbol.ucm                             Unicode Character Map
+cpan/Encode/ucm/viscii.ucm                             Unicode Character Map
+cpan/Encode/Unicode/Makefile.PL                                Encode extension
+cpan/Encode/Unicode/Unicode.pm                         Encode extension
+cpan/Encode/Unicode/Unicode.xs                         Encode extension
 cpan/experimental/lib/experimental.pm
+cpan/experimental/lib/stable.pm
 cpan/experimental/t/basic.t
 cpan/ExtUtils-Constant/lib/ExtUtils/Constant.pm                        generate XS code to import C header constants
 cpan/ExtUtils-Constant/lib/ExtUtils/Constant/Base.pm           generate XS code to import C header constants
@@ -809,121 +1010,121 @@ cpan/ExtUtils-Install/t/lib/MakeMaker/Test/Setup/BFD.pm        MakeMaker test utilities
 cpan/ExtUtils-Install/t/lib/MakeMaker/Test/Utils.pm    MakeMaker test utilities
 cpan/ExtUtils-Install/t/lib/TieOut.pm                  Testing library to capture prints
 cpan/ExtUtils-Install/t/Packlist.t                     See if Packlist works
-cpan/ExtUtils-MakeMaker/bin/instmodsh                          Give information about installed extensions
-cpan/ExtUtils-MakeMaker/lib/ExtUtils/Command.pm
-cpan/ExtUtils-MakeMaker/lib/ExtUtils/Command/MM.pm             Calling MM functions from the cmd line
-cpan/ExtUtils-MakeMaker/lib/ExtUtils/Liblist.pm                        Locates libraries
-cpan/ExtUtils-MakeMaker/lib/ExtUtils/Liblist/Kid.pm            Does the real work of the above
-cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker.pm              Write Makefiles for extensions
-cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker/Config.pm       MakeMaker wrapper for Config
-cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker/FAQ.pod         MakeMaker FAQ
-cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker/Locale.pm
-cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker/Tutorial.pod    Writing a module with MakeMaker
-cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker/version.pm
-cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker/version/regex.pm
-cpan/ExtUtils-MakeMaker/lib/ExtUtils/Mkbootstrap.pm            Writes a bootstrap file (see MakeMaker)
-cpan/ExtUtils-MakeMaker/lib/ExtUtils/Mksymlists.pm             Writes a linker options file for extensions
-cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM.pm                     MakeMaker adaptor class
-cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_AIX.pm                 MakeMaker methods for AIX
-cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Any.pm                 MakeMaker methods for Any OS
-cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_BeOS.pm                        MakeMaker methods for BeOS
-cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Cygwin.pm              MakeMaker methods for Cygwin
-cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Darwin.pm              MakeMaker methods for Darwin
-cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_DOS.pm                 MakeMaker methods for DOS
-cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_MacOS.pm               MakeMaker methods for MacOS
-cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_NW5.pm                 MakeMaker methods for NetWare
-cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_OS2.pm                 MakeMaker methods for OS/2
-cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_OS390.pm               MakeMaker methods for OS 390
-cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_QNX.pm                 MakeMaker methods for QNX
-cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Unix.pm                        MakeMaker methods for Unix
-cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_UWIN.pm                        MakeMaker methods for U/WIN
-cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_VMS.pm                 MakeMaker methods for VMS
-cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_VOS.pm                 MakeMaker methods for VOS
-cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Win32.pm               MakeMaker methods for Win32
-cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Win95.pm               MakeMaker methods for Win95
-cpan/ExtUtils-MakeMaker/lib/ExtUtils/MY.pm                     MakeMaker user override class
-cpan/ExtUtils-MakeMaker/lib/ExtUtils/testlib.pm                        Fixes up @INC to use just-built extension
-cpan/ExtUtils-MakeMaker/t/00compile.t                          See if MakeMaker modules compile
-cpan/ExtUtils-MakeMaker/t/01perl_bugs.t
-cpan/ExtUtils-MakeMaker/t/02-xsdynamic.t
-cpan/ExtUtils-MakeMaker/t/03-xsstatic.t
-cpan/ExtUtils-MakeMaker/t/04-xs-rpath-darwin.t
-cpan/ExtUtils-MakeMaker/t/arch_check.t                         Test MakeMaker's arch_check()
-cpan/ExtUtils-MakeMaker/t/backwards.t                          Check MakeMaker's backwards compatibility
-cpan/ExtUtils-MakeMaker/t/basic.t                              See if MakeMaker can build a module
-cpan/ExtUtils-MakeMaker/t/build_man.t                          Set if MakeMaker builds manpages
-cpan/ExtUtils-MakeMaker/t/cd.t                                 Test to see cd works
-cpan/ExtUtils-MakeMaker/t/config.t                             Test ExtUtils::MakeMaker::Config
-cpan/ExtUtils-MakeMaker/t/cp.t
-cpan/ExtUtils-MakeMaker/t/dir_target.t                         Verify if dir_target() is supported
-cpan/ExtUtils-MakeMaker/t/echo.t                               Test for ExtUtils::MakeMaker
-cpan/ExtUtils-MakeMaker/t/eu_command.t
-cpan/ExtUtils-MakeMaker/t/FIRST_MAKEFILE.t                     See if FIRST_MAKEFILE works
-cpan/ExtUtils-MakeMaker/t/fix_libs.t                           Test for ExtUtils::MakeMaker
-cpan/ExtUtils-MakeMaker/t/fixin.t                              See if ExtUtils::MakeMaker works
-cpan/ExtUtils-MakeMaker/t/hints.t                              See if hint files are honored.
-cpan/ExtUtils-MakeMaker/t/INST.t                               Check MakeMaker INST_* macros
-cpan/ExtUtils-MakeMaker/t/INST_PREFIX.t                                See if MakeMaker can apply PREFIXs
-cpan/ExtUtils-MakeMaker/t/INSTALL_BASE.t                       Test INSTALL_BASE in MakeMaker
-cpan/ExtUtils-MakeMaker/t/installed_file.t                     Test for ExtUtils::MakeMaker
-cpan/ExtUtils-MakeMaker/t/is_of_type.t                         Test for ExtUtils::MakeMaker
-cpan/ExtUtils-MakeMaker/t/lib/MakeMaker/Test/NoXS.pm           MakeMaker test utilities
-cpan/ExtUtils-MakeMaker/t/lib/MakeMaker/Test/Setup/BFD.pm      MakeMaker test utilities
-cpan/ExtUtils-MakeMaker/t/lib/MakeMaker/Test/Setup/XS.pm       MakeMaker test utilities
-cpan/ExtUtils-MakeMaker/t/lib/MakeMaker/Test/Utils.pm          MakeMaker test utilities
-cpan/ExtUtils-MakeMaker/t/lib/TieIn.pm                         Testing library for dummy input handles
-cpan/ExtUtils-MakeMaker/t/lib/TieOut.pm                                Testing library to capture prints
-cpan/ExtUtils-MakeMaker/t/Liblist.t                            See if ExtUtils::Liblist works
-cpan/ExtUtils-MakeMaker/t/make.t                               See if make detection works
-cpan/ExtUtils-MakeMaker/t/MakeMaker_Parameters.t               test "MakeMaker Parameters" section
-cpan/ExtUtils-MakeMaker/t/maketext_filter.t                    See if maketext_filter works
-cpan/ExtUtils-MakeMaker/t/meta_convert.t                               See if MakeMaker works
-cpan/ExtUtils-MakeMaker/t/META_for_testing.json                                test data for MakeMaker
-cpan/ExtUtils-MakeMaker/t/META_for_testing.yml                         test data for MakeMaker
-cpan/ExtUtils-MakeMaker/t/META_for_testing_tricky_version.yml                          test data for MakeMaker
-cpan/ExtUtils-MakeMaker/t/metafile_data.t                      See if META.yml handling works
-cpan/ExtUtils-MakeMaker/t/metafile_file.t                      See if META.yml handling works
-cpan/ExtUtils-MakeMaker/t/min_perl_version.t                   Test the MIN_PERL_VERSION argument to WriteMakefile.
-cpan/ExtUtils-MakeMaker/t/miniperl.t                           Test MakeMaker with miniperl
-cpan/ExtUtils-MakeMaker/t/Mkbootstrap.t                                See if ExtUtils::Mkbootstrap works
-cpan/ExtUtils-MakeMaker/t/MM_Any.t                             See if ExtUtils::MM_Any works
-cpan/ExtUtils-MakeMaker/t/MM_BeOS.t                            See if ExtUtils::MM_BeOS works
-cpan/ExtUtils-MakeMaker/t/MM_Cygwin.t                          See if ExtUtils::MM_Cygwin works
-cpan/ExtUtils-MakeMaker/t/MM_NW5.t                             See if ExtUtils::MM_NW5 works
-cpan/ExtUtils-MakeMaker/t/MM_OS2.t                             See if ExtUtils::MM_OS2 works
-cpan/ExtUtils-MakeMaker/t/MM_Unix.t                            See if ExtUtils::MM_UNIX works
-cpan/ExtUtils-MakeMaker/t/MM_VMS.t                             See if ExtUtils::MM_VMS works
-cpan/ExtUtils-MakeMaker/t/MM_Win32.t                           See if ExtUtils::MM_Win32 works
-cpan/ExtUtils-MakeMaker/t/oneliner.t                           See if MM can generate perl one-liners
-cpan/ExtUtils-MakeMaker/t/os_unsupported.t
-cpan/ExtUtils-MakeMaker/t/parse_abstract.t                     See if parse_abstract works
-cpan/ExtUtils-MakeMaker/t/parse_version.t                      See if parse_version works
-cpan/ExtUtils-MakeMaker/t/PL_FILES.t                           Test PL_FILES in MakeMaker
-cpan/ExtUtils-MakeMaker/t/pm.t                                 See if MakeMaker can handle PM
-cpan/ExtUtils-MakeMaker/t/pm_to_blib.t                         Test for ExtUtils::MakeMaker
-cpan/ExtUtils-MakeMaker/t/pod2man.t                            See if MakeMaker can handle no pod2man
-cpan/ExtUtils-MakeMaker/t/postamble.t                          See if postamble works
-cpan/ExtUtils-MakeMaker/t/prefixify.t                          See if MakeMaker can apply a PREFIX
-cpan/ExtUtils-MakeMaker/t/prereq.t                             See if MakeMaker works
-cpan/ExtUtils-MakeMaker/t/prereq_print.t                               See if PREREQ_PRINT works
-cpan/ExtUtils-MakeMaker/t/problems.t                           How MakeMaker reacts to build problems
-cpan/ExtUtils-MakeMaker/t/prompt.t                             See if E::MM::prompt() works
-cpan/ExtUtils-MakeMaker/t/recurs.t                             See if recursive builds work
-cpan/ExtUtils-MakeMaker/t/revision.t                           See if $Revision is correct
-cpan/ExtUtils-MakeMaker/t/several_authors.t                    See if multiple AUTHORs work
-cpan/ExtUtils-MakeMaker/t/split_command.t                      See if MM's xargs-like function works
-cpan/ExtUtils-MakeMaker/t/test_boilerplate.t                   MakeMaker test
+cpan/ExtUtils-MakeMaker/bin/instmodsh                                          Give information about installed extensions
+cpan/ExtUtils-MakeMaker/lib/ExtUtils/Command.pm                                        Module related to ExtUtils::MakeMaker
+cpan/ExtUtils-MakeMaker/lib/ExtUtils/Command/MM.pm                             Calling MM functions from the cmd line
+cpan/ExtUtils-MakeMaker/lib/ExtUtils/Liblist.pm                                        Locates libraries
+cpan/ExtUtils-MakeMaker/lib/ExtUtils/Liblist/Kid.pm                            Does the real work of the above
+cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker.pm                              Write Makefiles for extensions
+cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker/Config.pm                       MakeMaker wrapper for Config
+cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker/FAQ.pod                         MakeMaker FAQ
+cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker/Locale.pm                       Module related to ExtUtils::MakeMaker
+cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker/Tutorial.pod                    Writing a module with MakeMaker
+cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker/version.pm                      Module related to ExtUtils::MakeMaker
+cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker/version/regex.pm                        Module related to ExtUtils::MakeMaker
+cpan/ExtUtils-MakeMaker/lib/ExtUtils/Mkbootstrap.pm                            Writes a bootstrap file (see MakeMaker)
+cpan/ExtUtils-MakeMaker/lib/ExtUtils/Mksymlists.pm                             Writes a linker options file for extensions
+cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM.pm                                     MakeMaker adaptor class
+cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_AIX.pm                                 MakeMaker methods for AIX
+cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Any.pm                                 MakeMaker methods for Any OS
+cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_BeOS.pm                                        MakeMaker methods for BeOS
+cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Cygwin.pm                              MakeMaker methods for Cygwin
+cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Darwin.pm                              MakeMaker methods for Darwin
+cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_DOS.pm                                 MakeMaker methods for DOS
+cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_MacOS.pm                               MakeMaker methods for MacOS
+cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_NW5.pm                                 MakeMaker methods for NetWare
+cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_OS2.pm                                 MakeMaker methods for OS/2
+cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_OS390.pm                               MakeMaker methods for OS 390
+cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_QNX.pm                                 MakeMaker methods for QNX
+cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Unix.pm                                        MakeMaker methods for Unix
+cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_UWIN.pm                                        MakeMaker methods for U/WIN
+cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_VMS.pm                                 MakeMaker methods for VMS
+cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_VOS.pm                                 MakeMaker methods for VOS
+cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Win32.pm                               MakeMaker methods for Win32
+cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Win95.pm                               MakeMaker methods for Win95
+cpan/ExtUtils-MakeMaker/lib/ExtUtils/MY.pm                                     MakeMaker user override class
+cpan/ExtUtils-MakeMaker/lib/ExtUtils/testlib.pm                                        Fixes up @INC to use just-built extension
+cpan/ExtUtils-MakeMaker/t/00compile.t                                          See if MakeMaker modules compile
+cpan/ExtUtils-MakeMaker/t/01perl_bugs.t                                                Test file related to ExtUtils::MakeMaker
+cpan/ExtUtils-MakeMaker/t/02-xsdynamic.t                                       Test file related to ExtUtils::MakeMaker
+cpan/ExtUtils-MakeMaker/t/03-xsstatic.t                                                Test file related to ExtUtils::MakeMaker
+cpan/ExtUtils-MakeMaker/t/04-xs-rpath-darwin.t                                 Test file related to ExtUtils::MakeMaker
+cpan/ExtUtils-MakeMaker/t/arch_check.t                                         Test MakeMaker's arch_check()
+cpan/ExtUtils-MakeMaker/t/backwards.t                                          Check MakeMaker's backwards compatibility
+cpan/ExtUtils-MakeMaker/t/basic.t                                              See if MakeMaker can build a module
+cpan/ExtUtils-MakeMaker/t/build_man.t                                          Set if MakeMaker builds manpages
+cpan/ExtUtils-MakeMaker/t/cd.t                                                 Test to see cd works
+cpan/ExtUtils-MakeMaker/t/config.t                                             Test ExtUtils::MakeMaker::Config
+cpan/ExtUtils-MakeMaker/t/cp.t                                                 Test file related to ExtUtils::MakeMaker
+cpan/ExtUtils-MakeMaker/t/dir_target.t                                         Verify if dir_target() is supported
+cpan/ExtUtils-MakeMaker/t/echo.t                                               Test for ExtUtils::MakeMaker
+cpan/ExtUtils-MakeMaker/t/eu_command.t                                         Test file related to ExtUtils::MakeMaker
+cpan/ExtUtils-MakeMaker/t/FIRST_MAKEFILE.t                                     See if FIRST_MAKEFILE works
+cpan/ExtUtils-MakeMaker/t/fix_libs.t                                           Test for ExtUtils::MakeMaker
+cpan/ExtUtils-MakeMaker/t/fixin.t                                              See if ExtUtils::MakeMaker works
+cpan/ExtUtils-MakeMaker/t/hints.t                                              See if hint files are honored.
+cpan/ExtUtils-MakeMaker/t/INST.t                                               Check MakeMaker INST_* macros
+cpan/ExtUtils-MakeMaker/t/INST_PREFIX.t                                                See if MakeMaker can apply PREFIXs
+cpan/ExtUtils-MakeMaker/t/INSTALL_BASE.t                                       Test INSTALL_BASE in MakeMaker
+cpan/ExtUtils-MakeMaker/t/installed_file.t                                     Test for ExtUtils::MakeMaker
+cpan/ExtUtils-MakeMaker/t/is_of_type.t                                         Test for ExtUtils::MakeMaker
+cpan/ExtUtils-MakeMaker/t/lib/MakeMaker/Test/NoXS.pm                           MakeMaker test utilities
+cpan/ExtUtils-MakeMaker/t/lib/MakeMaker/Test/Setup/BFD.pm                      MakeMaker test utilities
+cpan/ExtUtils-MakeMaker/t/lib/MakeMaker/Test/Setup/XS.pm                       MakeMaker test utilities
+cpan/ExtUtils-MakeMaker/t/lib/MakeMaker/Test/Utils.pm                          MakeMaker test utilities
+cpan/ExtUtils-MakeMaker/t/lib/TieIn.pm                                         Testing library for dummy input handles
+cpan/ExtUtils-MakeMaker/t/lib/TieOut.pm                                                Testing library to capture prints
+cpan/ExtUtils-MakeMaker/t/Liblist.t                                            See if ExtUtils::Liblist works
+cpan/ExtUtils-MakeMaker/t/make.t                                               See if make detection works
+cpan/ExtUtils-MakeMaker/t/MakeMaker_Parameters.t                               test "MakeMaker Parameters" section
+cpan/ExtUtils-MakeMaker/t/maketext_filter.t                                    See if maketext_filter works
+cpan/ExtUtils-MakeMaker/t/meta_convert.t                                       See if MakeMaker works
+cpan/ExtUtils-MakeMaker/t/META_for_testing.json                                        test data for MakeMaker
+cpan/ExtUtils-MakeMaker/t/META_for_testing.yml                                 test data for MakeMaker
+cpan/ExtUtils-MakeMaker/t/META_for_testing_tricky_version.yml                  test data for MakeMaker
+cpan/ExtUtils-MakeMaker/t/metafile_data.t                                      See if META.yml handling works
+cpan/ExtUtils-MakeMaker/t/metafile_file.t                                      See if META.yml handling works
+cpan/ExtUtils-MakeMaker/t/min_perl_version.t                                   Test the MIN_PERL_VERSION argument to WriteMakefile.
+cpan/ExtUtils-MakeMaker/t/miniperl.t                                           Test MakeMaker with miniperl
+cpan/ExtUtils-MakeMaker/t/Mkbootstrap.t                                                See if ExtUtils::Mkbootstrap works
+cpan/ExtUtils-MakeMaker/t/MM_Any.t                                             See if ExtUtils::MM_Any works
+cpan/ExtUtils-MakeMaker/t/MM_BeOS.t                                            See if ExtUtils::MM_BeOS works
+cpan/ExtUtils-MakeMaker/t/MM_Cygwin.t                                          See if ExtUtils::MM_Cygwin works
+cpan/ExtUtils-MakeMaker/t/MM_NW5.t                                             See if ExtUtils::MM_NW5 works
+cpan/ExtUtils-MakeMaker/t/MM_OS2.t                                             See if ExtUtils::MM_OS2 works
+cpan/ExtUtils-MakeMaker/t/MM_Unix.t                                            See if ExtUtils::MM_UNIX works
+cpan/ExtUtils-MakeMaker/t/MM_VMS.t                                             See if ExtUtils::MM_VMS works
+cpan/ExtUtils-MakeMaker/t/MM_Win32.t                                           See if ExtUtils::MM_Win32 works
+cpan/ExtUtils-MakeMaker/t/oneliner.t                                           See if MM can generate perl one-liners
+cpan/ExtUtils-MakeMaker/t/os_unsupported.t                                     Test file related to ExtUtils::MakeMaker
+cpan/ExtUtils-MakeMaker/t/parse_abstract.t                                     See if parse_abstract works
+cpan/ExtUtils-MakeMaker/t/parse_version.t                                      See if parse_version works
+cpan/ExtUtils-MakeMaker/t/PL_FILES.t                                           Test PL_FILES in MakeMaker
+cpan/ExtUtils-MakeMaker/t/pm.t                                                 See if MakeMaker can handle PM
+cpan/ExtUtils-MakeMaker/t/pm_to_blib.t                                         Test for ExtUtils::MakeMaker
+cpan/ExtUtils-MakeMaker/t/pod2man.t                                            See if MakeMaker can handle no pod2man
+cpan/ExtUtils-MakeMaker/t/postamble.t                                          See if postamble works
+cpan/ExtUtils-MakeMaker/t/prefixify.t                                          See if MakeMaker can apply a PREFIX
+cpan/ExtUtils-MakeMaker/t/prereq.t                                             See if MakeMaker works
+cpan/ExtUtils-MakeMaker/t/prereq_print.t                                       See if PREREQ_PRINT works
+cpan/ExtUtils-MakeMaker/t/problems.t                                           How MakeMaker reacts to build problems
+cpan/ExtUtils-MakeMaker/t/prompt.t                                             See if E::MM::prompt() works
+cpan/ExtUtils-MakeMaker/t/recurs.t                                             See if recursive builds work
+cpan/ExtUtils-MakeMaker/t/revision.t                                           See if $Revision is correct
+cpan/ExtUtils-MakeMaker/t/several_authors.t                                    See if multiple AUTHORs work
+cpan/ExtUtils-MakeMaker/t/split_command.t                                      See if MM's xargs-like function works
+cpan/ExtUtils-MakeMaker/t/test_boilerplate.t                                   MakeMaker test
 cpan/ExtUtils-MakeMaker/t/testdata/reallylongdirectoryname/arch1/Config.pm     test data for MakeMaker
 cpan/ExtUtils-MakeMaker/t/testdata/reallylongdirectoryname/arch2/Config.pm     test data for MakeMaker
-cpan/ExtUtils-MakeMaker/t/testlib.t                            See if ExtUtils::testlib works
-cpan/ExtUtils-MakeMaker/t/unicode.t
-cpan/ExtUtils-MakeMaker/t/VERSION_FROM.t                       See if MakeMaker's VERSION_FROM works
-cpan/ExtUtils-MakeMaker/t/vstrings.t
-cpan/ExtUtils-MakeMaker/t/WriteEmptyMakefile.t                 See if WriteEmptyMakefile works
-cpan/ExtUtils-MakeMaker/t/writemakefile_args.t                 See if WriteMakefile works
-cpan/ExtUtils-Manifest/lib/ExtUtils/Manifest.pm                        Utilities to write MANIFEST files
-cpan/ExtUtils-Manifest/lib/ExtUtils/MANIFEST.SKIP              The default MANIFEST.SKIP
-cpan/ExtUtils-Manifest/t/Manifest.t                            See if ExtUtils::Manifest works
+cpan/ExtUtils-MakeMaker/t/testlib.t                                            See if ExtUtils::testlib works
+cpan/ExtUtils-MakeMaker/t/unicode.t                                            Test file related to ExtUtils::MakeMaker
+cpan/ExtUtils-MakeMaker/t/VERSION_FROM.t                                       See if MakeMaker's VERSION_FROM works
+cpan/ExtUtils-MakeMaker/t/vstrings.t                                           Test file related to ExtUtils::MakeMaker
+cpan/ExtUtils-MakeMaker/t/WriteEmptyMakefile.t                                 See if WriteEmptyMakefile works
+cpan/ExtUtils-MakeMaker/t/writemakefile_args.t                                 See if WriteMakefile works
+cpan/ExtUtils-Manifest/lib/ExtUtils/Manifest.pm                Utilities to write MANIFEST files
+cpan/ExtUtils-Manifest/lib/ExtUtils/MANIFEST.SKIP      The default MANIFEST.SKIP
+cpan/ExtUtils-Manifest/t/Manifest.t                    See if ExtUtils::Manifest works
 cpan/ExtUtils-PL2Bat/lib/ExtUtils/PL2Bat.pm    Implement pl2bat
 cpan/ExtUtils-PL2Bat/t/make_executable.t       Tests if ExtUtils::PL2Bat makes bat files that are executable
 cpan/File-Fetch/lib/File/Fetch.pm      File::Fetch
@@ -935,21 +1136,21 @@ cpan/File-Path/t/Path.t                  See if File::Path works
 cpan/File-Path/t/Path_root.t           See if File::Path works
 cpan/File-Path/t/Path_win32.t          See if File::Path works
 cpan/File-Path/t/taint.t               See if File::Path works with -T
-cpan/File-Temp/lib/File/Temp.pm        create safe temporary files and file handles
-cpan/File-Temp/t/cmp.t         See if File::Temp works
-cpan/File-Temp/t/fork.t                See if File::Temp works
-cpan/File-Temp/t/lock.t                See if File::Temp works
-cpan/File-Temp/t/mktemp.t      See if File::Temp works
-cpan/File-Temp/t/object.t      See if File::Temp works
-cpan/File-Temp/t/posix.t       See if File::Temp works
-cpan/File-Temp/t/rmtree.t      See if File::Temp works
-cpan/File-Temp/t/security.t    See if File::Temp works
-cpan/File-Temp/t/seekable.t    See if File::Temp works
-cpan/File-Temp/t/tempfile.t    See if File::Temp works
-cpan/Filter-Util-Call/Call.pm  Filter::Util::Call extension module
-cpan/Filter-Util-Call/Call.xs  Filter::Util::Call extension external subroutines
+cpan/File-Temp/lib/File/Temp.pm                create safe temporary files and file handles
+cpan/File-Temp/t/cmp.t                 See if File::Temp works
+cpan/File-Temp/t/fork.t                        See if File::Temp works
+cpan/File-Temp/t/lock.t                        See if File::Temp works
+cpan/File-Temp/t/mktemp.t              See if File::Temp works
+cpan/File-Temp/t/object.t              See if File::Temp works
+cpan/File-Temp/t/posix.t               See if File::Temp works
+cpan/File-Temp/t/rmtree.t              See if File::Temp works
+cpan/File-Temp/t/security.t            See if File::Temp works
+cpan/File-Temp/t/seekable.t            See if File::Temp works
+cpan/File-Temp/t/tempfile.t            See if File::Temp works
+cpan/Filter-Util-Call/Call.pm                  Filter::Util::Call extension module
+cpan/Filter-Util-Call/Call.xs                  Filter::Util::Call extension external subroutines
 cpan/Filter-Util-Call/filter-util.pl           See if Filter::Util::Call works
-cpan/Filter-Util-Call/t/call.t See if Filter::Util::Call works
+cpan/Filter-Util-Call/t/call.t                 See if Filter::Util::Call works
 cpan/Filter-Util-Call/t/rt_101033.pm
 cpan/Filter-Util-Call/t/rt_101033.t
 cpan/Filter-Util-Call/t/rt_54452-rebless.t
@@ -1059,6 +1260,7 @@ cpan/HTTP-Tiny/t/160_cookies.t
 cpan/HTTP-Tiny/t/161_basic_auth.t
 cpan/HTTP-Tiny/t/162_proxy_auth.t
 cpan/HTTP-Tiny/t/170_keepalive.t
+cpan/HTTP-Tiny/t/180_verify_SSL.t
 cpan/HTTP-Tiny/t/BrokenCookieJar.pm
 cpan/HTTP-Tiny/t/SimpleCookieJar.pm
 cpan/HTTP-Tiny/t/Util.pm
@@ -1227,23 +1429,23 @@ cpan/IO-Socket-IP/t/22timeout.t
 cpan/IO-Socket-IP/t/30nonblocking-connect.t            IO::Socket::IP tests
 cpan/IO-Socket-IP/t/31nonblocking-connect-internet.t   IO::Socket::IP tests
 cpan/IO-Socket-IP/t/99pod.t                            IO::Socket::IP tests
-cpan/IO-Zlib/t/basic.t         Tests for IO::Zlib
-cpan/IO-Zlib/t/external.t      Tests for IO::Zlib
-cpan/IO-Zlib/t/getc.t          Tests for IO::Zlib
-cpan/IO-Zlib/t/getline.t       Tests for IO::Zlib
-cpan/IO-Zlib/t/import.t                Tests for IO::Zlib
-cpan/IO-Zlib/t/large.t         Tests for IO::Zlib
-cpan/IO-Zlib/t/tied.t          Tests for IO::Zlib
-cpan/IO-Zlib/t/uncomp1.t       Tests for IO::Zlib
-cpan/IO-Zlib/t/uncomp2.t       Tests for IO::Zlib
-cpan/IO-Zlib/Zlib.pm           IO::Zlib
-cpan/IPC-Cmd/lib/IPC/Cmd.pm                    IPC::Cmd
-cpan/IPC-Cmd/t/01_IPC-Cmd.t    IPC::Cmd tests
-cpan/IPC-Cmd/t/02_Interactive.t        IPC::Cmd tests
-cpan/IPC-Cmd/t/03_run-forked.t IPC::Cmd tests
-cpan/IPC-Cmd/t/src/child.pl    IPC::Cmd tests
-cpan/IPC-Cmd/t/src/output.pl   IPC::Cmd tests
-cpan/IPC-Cmd/t/src/x.tgz       IPC::Cmd tests
+cpan/IO-Zlib/t/basic.t                 Tests for IO::Zlib
+cpan/IO-Zlib/t/external.t              Tests for IO::Zlib
+cpan/IO-Zlib/t/getc.t                  Tests for IO::Zlib
+cpan/IO-Zlib/t/getline.t               Tests for IO::Zlib
+cpan/IO-Zlib/t/import.t                        Tests for IO::Zlib
+cpan/IO-Zlib/t/large.t                 Tests for IO::Zlib
+cpan/IO-Zlib/t/tied.t                  Tests for IO::Zlib
+cpan/IO-Zlib/t/uncomp1.t               Tests for IO::Zlib
+cpan/IO-Zlib/t/uncomp2.t               Tests for IO::Zlib
+cpan/IO-Zlib/Zlib.pm                   IO::Zlib
+cpan/IPC-Cmd/lib/IPC/Cmd.pm            IPC::Cmd
+cpan/IPC-Cmd/t/01_IPC-Cmd.t            IPC::Cmd tests
+cpan/IPC-Cmd/t/02_Interactive.t                IPC::Cmd tests
+cpan/IPC-Cmd/t/03_run-forked.t         IPC::Cmd tests
+cpan/IPC-Cmd/t/src/child.pl            IPC::Cmd tests
+cpan/IPC-Cmd/t/src/output.pl           IPC::Cmd tests
+cpan/IPC-Cmd/t/src/x.tgz               IPC::Cmd tests
 cpan/IPC-SysV/hints/cygwin.pl          Hint for IPC::SysV for named architecture
 cpan/IPC-SysV/hints/next_3.pl          Hint for IPC::SysV for named architecture
 cpan/IPC-SysV/lib/IPC/Msg.pm           IPC::SysV extension Perl module
@@ -1288,7 +1490,23 @@ cpan/JSON-PP/t/020_unknown.t
 cpan/JSON-PP/t/021_evans.t
 cpan/JSON-PP/t/022_comment_at_eof.t
 cpan/JSON-PP/t/052_object.t
-cpan/JSON-PP/t/099_binary.t
+cpan/JSON-PP/t/099_binary.pl
+cpan/JSON-PP/t/099_binary00.t
+cpan/JSON-PP/t/099_binary01.t
+cpan/JSON-PP/t/099_binary02.t
+cpan/JSON-PP/t/099_binary03.t
+cpan/JSON-PP/t/099_binary04.t
+cpan/JSON-PP/t/099_binary05.t
+cpan/JSON-PP/t/099_binary06.t
+cpan/JSON-PP/t/099_binary07.t
+cpan/JSON-PP/t/099_binary08.t
+cpan/JSON-PP/t/099_binary09.t
+cpan/JSON-PP/t/099_binary10.t
+cpan/JSON-PP/t/099_binary11.t
+cpan/JSON-PP/t/099_binary12.t
+cpan/JSON-PP/t/099_binary13.t
+cpan/JSON-PP/t/099_binary14.t
+cpan/JSON-PP/t/099_binary15.t
 cpan/JSON-PP/t/104_sortby.t
 cpan/JSON-PP/t/105_esc_slash.t
 cpan/JSON-PP/t/106_allow_barekey.t
@@ -1303,42 +1521,46 @@ cpan/JSON-PP/t/115_tie_ixhash.t
 cpan/JSON-PP/t/116_incr_parse_fixed.t
 cpan/JSON-PP/t/117_numbers.t
 cpan/JSON-PP/t/118_boolean_values.t
+cpan/JSON-PP/t/119_incr_parse_utf8.t
+cpan/JSON-PP/t/120_incr_parse_truncated.t
+cpan/JSON-PP/t/core_bools.t
 cpan/JSON-PP/t/gh_28_json_test_suite.t
 cpan/JSON-PP/t/gh_29_trailing_false_value.t
 cpan/JSON-PP/t/rt_116998_wrong_character_offset.t
+cpan/JSON-PP/t/rt_122270_old_xs_boolean.t
 cpan/JSON-PP/t/rt_90071_incr_parse.t
 cpan/JSON-PP/t/zero-mojibake.t
-cpan/libnet/lib/Net/Cmd.pm
-cpan/libnet/lib/Net/Config.pm
-cpan/libnet/lib/Net/Domain.pm
-cpan/libnet/lib/Net/FTP.pm
-cpan/libnet/lib/Net/FTP/A.pm
-cpan/libnet/lib/Net/FTP/dataconn.pm
-cpan/libnet/lib/Net/FTP/E.pm
-cpan/libnet/lib/Net/FTP/I.pm
-cpan/libnet/lib/Net/FTP/L.pm
-cpan/libnet/lib/Net/libnetFAQ.pod
-cpan/libnet/lib/Net/Netrc.pm
-cpan/libnet/lib/Net/NNTP.pm
-cpan/libnet/lib/Net/POP3.pm
-cpan/libnet/lib/Net/SMTP.pm
-cpan/libnet/lib/Net/Time.pm
-cpan/libnet/Makefile.PL
-cpan/libnet/t/config.t         libnet
-cpan/libnet/t/datasend.t       libnet
-cpan/libnet/t/ftp.t            libnet
-cpan/libnet/t/hostname.t       libnet
-cpan/libnet/t/netrc.t          libnet
-cpan/libnet/t/nntp.t           libnet
-cpan/libnet/t/nntp_ipv6.t
-cpan/libnet/t/nntp_ssl.t
-cpan/libnet/t/pop3_ipv6.t
-cpan/libnet/t/pop3_ssl.t
-cpan/libnet/t/require.t                libnet
-cpan/libnet/t/smtp.t           libnet
-cpan/libnet/t/smtp_ipv6.t
-cpan/libnet/t/smtp_ssl.t
-cpan/libnet/t/time.t           libnet
+cpan/libnet/lib/Net/Cmd.pm             Module related to libnet
+cpan/libnet/lib/Net/Config.pm          Module related to libnet
+cpan/libnet/lib/Net/Domain.pm          Module related to libnet
+cpan/libnet/lib/Net/FTP.pm             Module related to libnet
+cpan/libnet/lib/Net/FTP/A.pm           Module related to libnet
+cpan/libnet/lib/Net/FTP/dataconn.pm    Module related to libnet
+cpan/libnet/lib/Net/FTP/E.pm           Module related to libnet
+cpan/libnet/lib/Net/FTP/I.pm           Module related to libnet
+cpan/libnet/lib/Net/FTP/L.pm           Module related to libnet
+cpan/libnet/lib/Net/libnetFAQ.pod      libnet
+cpan/libnet/lib/Net/Netrc.pm           Module related to libnet
+cpan/libnet/lib/Net/NNTP.pm            Module related to libnet
+cpan/libnet/lib/Net/POP3.pm            Module related to libnet
+cpan/libnet/lib/Net/SMTP.pm            Module related to libnet
+cpan/libnet/lib/Net/Time.pm            Module related to libnet
+cpan/libnet/Makefile.PL                        libnet
+cpan/libnet/t/config.t                 libnet
+cpan/libnet/t/datasend.t               libnet
+cpan/libnet/t/ftp.t                    libnet
+cpan/libnet/t/hostname.t               libnet
+cpan/libnet/t/netrc.t                  libnet
+cpan/libnet/t/nntp.t                   libnet
+cpan/libnet/t/nntp_ipv6.t              Test file related to libnet
+cpan/libnet/t/nntp_ssl.t               Test file related to libnet
+cpan/libnet/t/pop3_ipv6.t              Test file related to libnet
+cpan/libnet/t/pop3_ssl.t               Test file related to libnet
+cpan/libnet/t/require.t                        libnet
+cpan/libnet/t/smtp.t                   libnet
+cpan/libnet/t/smtp_ipv6.t              Test file related to libnet
+cpan/libnet/t/smtp_ssl.t               Test file related to libnet
+cpan/libnet/t/time.t                   libnet
 cpan/Locale-Maketext-Simple/lib/Locale/Maketext/Simple.pm      Locale::Simple
 cpan/Locale-Maketext-Simple/t/0-signature.t                    Locale::Simple tests
 cpan/Locale-Maketext-Simple/t/1-basic.t                                Locale::Simple tests
@@ -1350,136 +1572,80 @@ cpan/Locale-Maketext-Simple/t/po_with_i_default/i_default.po   Locale::Simple test
 cpan/Locale-Maketext-Simple/t/po_without_i_default/en.po       Locale::Simple tests
 cpan/Locale-Maketext-Simple/t/po_without_i_default/fr.po       Locale::Simple tests
 cpan/Math-BigInt/lib/Math/BigFloat.pm          An arbitrary precision floating-point arithmetic package
-cpan/Math-BigInt/lib/Math/BigInt.pm    An arbitrary precision integer arithmetic package
+cpan/Math-BigInt/lib/Math/BigInt.pm            An arbitrary precision integer arithmetic package
 cpan/Math-BigInt/lib/Math/BigInt/Calc.pm       Pure Perl module to support Math::BigInt
 cpan/Math-BigInt/lib/Math/BigInt/Lib.pm
-cpan/Math-BigInt/t/_bin_parts_to_lib_parts.t
-cpan/Math-BigInt/t/_bin_str_to_str_parts.t
-cpan/Math-BigInt/t/_dec_parts_to_lib_parts.t
-cpan/Math-BigInt/t/_dec_str_to_str_parts.t
-cpan/Math-BigInt/t/_e_math.t           Helper routine in BigFloat for _e math
-cpan/Math-BigInt/t/_hex_str_to_str_parts.t
-cpan/Math-BigInt/t/_oct_str_to_str_parts.t
-cpan/Math-BigInt/t/alias.inc           Support for BigInt tests
-cpan/Math-BigInt/t/backermann-mbi.t    Test Math::BigInt
-cpan/Math-BigInt/t/bare_mbf.t          Test MBF under Math::BigInt::BareCalc
-cpan/Math-BigInt/t/bare_mbi.t          Test MBI under Math::BigInt::BareCalc
-cpan/Math-BigInt/t/bare_mif.t          Rounding tests under BareCalc
-cpan/Math-BigInt/t/bdigitsum-mbi.t     Test Math::BigInt
-cpan/Math-BigInt/t/bdstr-mbf.t         Test Math::BigInt
-cpan/Math-BigInt/t/bdstr-mbi.t         Test Math::BigInt
-cpan/Math-BigInt/t/bestr-mbf.t         Test Math::BigInt
-cpan/Math-BigInt/t/bestr-mbi.t         Test Math::BigInt
-cpan/Math-BigInt/t/bfib-mbi.t
-cpan/Math-BigInt/t/big_pi_e.t          test bpi() and bexp()
-cpan/Math-BigInt/t/bigfltpm.inc                Shared tests for bigfltpm.t and sub_mbf.t
-cpan/Math-BigInt/t/bigfltpm.t          See if BigFloat.pm works
-cpan/Math-BigInt/t/bigintc.t           See if BigInt/Calc.pm works
+cpan/Math-BigInt/t/alias.inc                   Support for BigInt tests
+cpan/Math-BigInt/t/bare_mbf.t                  Test MBF under Math::BigInt::BareCalc
+cpan/Math-BigInt/t/bare_mbi.t                  Test MBI under Math::BigInt::BareCalc
+cpan/Math-BigInt/t/bare_mif.t                  Rounding tests under BareCalc
+cpan/Math-BigInt/t/big_pi_e.t                  test bpi() and bexp()
+cpan/Math-BigInt/t/bigfltpm.inc                        Shared tests for bigfltpm.t and sub_mbf.t
+cpan/Math-BigInt/t/bigfltpm.t                  See if BigFloat.pm works
+cpan/Math-BigInt/t/bigintc.t                   See if BigInt/Calc.pm works
 cpan/Math-BigInt/t/bigintc-import.t
-cpan/Math-BigInt/t/bigintpm.inc                Shared tests for bigintpm.t and sub_mbi.t
-cpan/Math-BigInt/t/bigintpm.t          See if BigInt.pm works
-cpan/Math-BigInt/t/bigints.t           See if BigInt.pm works
-cpan/Math-BigInt/t/biglog.t            Test the log function
-cpan/Math-BigInt/t/bigroot.t           Test the broot function
-cpan/Math-BigInt/t/blucas-mbi.t
-cpan/Math-BigInt/t/bnok-mbf.t
-cpan/Math-BigInt/t/bnok-mbi.t
-cpan/Math-BigInt/t/bnstr-mbf.t         Test Math::BigInt
-cpan/Math-BigInt/t/bnstr-mbi.t         Test Math::BigInt
-cpan/Math-BigInt/t/bpi-mbf.t
-cpan/Math-BigInt/t/bpi-mbi.t
-cpan/Math-BigInt/t/bpow-mbf.t
-cpan/Math-BigInt/t/bpow-mbi.t
-cpan/Math-BigInt/t/bsstr-mbf.t         Test Math::BigInt
-cpan/Math-BigInt/t/bsstr-mbi.t         Test Math::BigInt
-cpan/Math-BigInt/t/buparrow-mbi.t      Test Math::BigInt
+cpan/Math-BigInt/t/bigintpm.inc                        Shared tests for bigintpm.t and sub_mbi.t
+cpan/Math-BigInt/t/bigintpm.t                  See if BigInt.pm works
+cpan/Math-BigInt/t/bigints.t                   See if BigInt.pm works
+cpan/Math-BigInt/t/biglog.t                    Test the log function
+cpan/Math-BigInt/t/bigroot.t                   Test the broot function
 cpan/Math-BigInt/t/calling-class-methods.t     Test Math::BigInt
 cpan/Math-BigInt/t/calling-constant.t
 cpan/Math-BigInt/t/calling-instance-methods.t  Test Math::BigInt
 cpan/Math-BigInt/t/calling-lib1.t
 cpan/Math-BigInt/t/calling-lib2.t
-cpan/Math-BigInt/t/config.t            Test Math::BigInt->config()
-cpan/Math-BigInt/t/const-mbf.t
-cpan/Math-BigInt/t/const-mbi.t
-cpan/Math-BigInt/t/downgrade.t         Test if use Math::BigInt(); under downgrade works
-cpan/Math-BigInt/t/dparts-mbf.t                Test Math::BigInt
-cpan/Math-BigInt/t/dparts-mbi.t                Test Math::BigInt
-cpan/Math-BigInt/t/eparts-mbf.t                Test Math::BigInt
-cpan/Math-BigInt/t/eparts-mbi.t                Test Math::BigInt
-cpan/Math-BigInt/t/fparts-mbf.t
-cpan/Math-BigInt/t/fparts-mbi.t
-cpan/Math-BigInt/t/from_base-mbi.t
-cpan/Math-BigInt/t/from_base_num-mbi.t
-cpan/Math-BigInt/t/from_bin-mbf.t      Test Math::BigInt
-cpan/Math-BigInt/t/from_bin-mbi.t
-cpan/Math-BigInt/t/from_hex-mbf.t      Test Math::BigInt
-cpan/Math-BigInt/t/from_hex-mbi.t
-cpan/Math-BigInt/t/from_ieee754-mbf.t  Test Math::BigInt
-cpan/Math-BigInt/t/from_oct-mbf.t      Test Math::BigInt
-cpan/Math-BigInt/t/from_oct-mbi.t
-cpan/Math-BigInt/t/inf_nan.t           Special tests for inf and *NaN* handling
-cpan/Math-BigInt/t/isa.t               Test for Math::BigInt inheritance
-cpan/Math-BigInt/t/lib_load-mbf-mbi.t
-cpan/Math-BigInt/t/lib_load-mbi-mbf.t
+cpan/Math-BigInt/t/config.t                    Test Math::BigInt->config()
+cpan/Math-BigInt/t/downgrade.t                 Test if use Math::BigInt(); under downgrade works
+cpan/Math-BigInt/t/inf_nan.t                   Special tests for inf and *NaN* handling
+cpan/Math-BigInt/t/isa.t                       Test for Math::BigInt inheritance
 cpan/Math-BigInt/t/Math/BigFloat/Subclass.pm   Empty subclass of BigFloat for test
 cpan/Math-BigInt/t/Math/BigInt/BareCalc.pm     Bigint's simulation of Calc
 cpan/Math-BigInt/t/Math/BigInt/Lib/Minimal.pm
 cpan/Math-BigInt/t/Math/BigInt/Lib/TestUtil.pm Test Math::BigInt
 cpan/Math-BigInt/t/Math/BigInt/Scalar.pm       Pure Perl module to support Math::BigInt
 cpan/Math-BigInt/t/Math/BigInt/Subclass.pm     Empty subclass of BigInt for test
-cpan/Math-BigInt/t/mbf_ali.t           Tests for BigFloat
-cpan/Math-BigInt/t/mbi_ali.t           Tests for BigInt
-cpan/Math-BigInt/t/mbi_rand.t          Test Math::BigInt randomly
-cpan/Math-BigInt/t/mbimbf.inc          Actual BigInt/BigFloat accuracy, precision and fallback, round_mode tests
-cpan/Math-BigInt/t/mbimbf.t            BigInt/BigFloat accuracy, precision and fallback, round_mode
-cpan/Math-BigInt/t/nan_cmp.t           overloaded comparison involving *NaN*
-cpan/Math-BigInt/t/new-mbf.t           Test Math::BigInt
-cpan/Math-BigInt/t/new-mbi.t
-cpan/Math-BigInt/t/new_overloaded.t    test overloaded numbers in BigFloat's new()
-cpan/Math-BigInt/t/nparts-mbf.t                Test Math::BigInt
-cpan/Math-BigInt/t/nparts-mbi.t                Test Math::BigInt
-cpan/Math-BigInt/t/objectify_mbf.t     Math::BigInt tests
-cpan/Math-BigInt/t/objectify_mbi.t     Math::BigInt tests
-cpan/Math-BigInt/t/req_mbf0.t          test: require Math::BigFloat; ->bzero();
-cpan/Math-BigInt/t/req_mbf1.t          test: require Math::BigFloat; ->bone();
-cpan/Math-BigInt/t/req_mbfa.t          test: require Math::BigFloat; ->bnan();
-cpan/Math-BigInt/t/req_mbfi.t          test: require Math::BigFloat; ->binf();
-cpan/Math-BigInt/t/req_mbfn.t          test: require Math::BigFloat; ->new();
-cpan/Math-BigInt/t/req_mbfw.t          require Math::BigFloat; import ( with => );
-cpan/Math-BigInt/t/require.t           Test if require Math::BigInt works
-cpan/Math-BigInt/t/round.t             Test rounding with non-integer A and P
-cpan/Math-BigInt/t/rt-16221.t          Tests for objectify() w/foreign objs
-cpan/Math-BigInt/t/sparts-mbf.t                Test Math::BigInt
-cpan/Math-BigInt/t/sparts-mbi.t                Test Math::BigInt
-cpan/Math-BigInt/t/sub_ali.t           Tests for aliases in BigInt subclasses
-cpan/Math-BigInt/t/sub_mbf.t           Empty subclass test of BigFloat
-cpan/Math-BigInt/t/sub_mbi.t           Empty subclass test of BigInt
-cpan/Math-BigInt/t/sub_mif.t           Test A & P with subclasses using mbimbf.inc
-cpan/Math-BigInt/t/to_base-mbi.t
-cpan/Math-BigInt/t/to_base_num-mbi.t
-cpan/Math-BigInt/t/to_ieee754-mbf.t    Test Math::BigInt
-cpan/Math-BigInt/t/trap.t              Test whether trap_nan and trap_inf work
-cpan/Math-BigInt/t/upgrade.inc         Actual tests for upgrade.t
-cpan/Math-BigInt/t/upgrade.t           Test if use Math::BigInt(); under upgrade works
-cpan/Math-BigInt/t/upgrade2.t          Test that two upgrade levels work
-cpan/Math-BigInt/t/upgradef.t          Test if use Math::BigFloat(); under upgrade works
-cpan/Math-BigInt/t/use.t               Test if use Math::BigInt(); works
-cpan/Math-BigInt/t/use_lib1.t          Test combinations of Math::BigInt and BigFloat
-cpan/Math-BigInt/t/use_lib2.t          Test combinations of Math::BigInt and BigFloat
-cpan/Math-BigInt/t/use_lib3.t          Test combinations of Math::BigInt and BigFloat
-cpan/Math-BigInt/t/use_lib4.t          Test combinations of Math::BigInt and BigFloat
+cpan/Math-BigInt/t/mbf_ali.t                   Tests for BigFloat
+cpan/Math-BigInt/t/mbi_ali.t                   Tests for BigInt
+cpan/Math-BigInt/t/mbi_rand.t                  Test Math::BigInt randomly
+cpan/Math-BigInt/t/mbimbf.inc                  Actual BigInt/BigFloat accuracy, precision and fallback, round_mode tests
+cpan/Math-BigInt/t/mbimbf.t                    BigInt/BigFloat accuracy, precision and fallback, round_mode
+cpan/Math-BigInt/t/nan_cmp.t                   overloaded comparison involving *NaN*
+cpan/Math-BigInt/t/new_overloaded.t            test overloaded numbers in BigFloat's new()
+cpan/Math-BigInt/t/req_mbf0.t                  test: require Math::BigFloat; ->bzero();
+cpan/Math-BigInt/t/req_mbf1.t                  test: require Math::BigFloat; ->bone();
+cpan/Math-BigInt/t/req_mbfa.t                  test: require Math::BigFloat; ->bnan();
+cpan/Math-BigInt/t/req_mbfi.t                  test: require Math::BigFloat; ->binf();
+cpan/Math-BigInt/t/req_mbfn.t                  test: require Math::BigFloat; ->new();
+cpan/Math-BigInt/t/req_mbfw.t                  require Math::BigFloat; import ( with => );
+cpan/Math-BigInt/t/require.t                   Test if require Math::BigInt works
+cpan/Math-BigInt/t/round.t                     Test rounding with non-integer A and P
+cpan/Math-BigInt/t/rt-16221.t                  Tests for objectify() w/foreign objs
+cpan/Math-BigInt/t/sub_ali.t                   Tests for aliases in BigInt subclasses
+cpan/Math-BigInt/t/sub_mbf.t                   Empty subclass test of BigFloat
+cpan/Math-BigInt/t/sub_mbi.t                   Empty subclass test of BigInt
+cpan/Math-BigInt/t/sub_mif.t                   Test A & P with subclasses using mbimbf.inc
+cpan/Math-BigInt/t/trap.t                      Test whether trap_nan and trap_inf work
+cpan/Math-BigInt/t/upgrade.inc                 Actual tests for upgrade.t
+cpan/Math-BigInt/t/upgrade.t                   Test if use Math::BigInt(); under upgrade works
+cpan/Math-BigInt/t/upgrade2.t                  Test that two upgrade levels work
+cpan/Math-BigInt/t/upgradef.t                  Test if use Math::BigFloat(); under upgrade works
+cpan/Math-BigInt/t/use.t                       Test if use Math::BigInt(); works
+cpan/Math-BigInt/t/use_lib1.t                  Test combinations of Math::BigInt and BigFloat
+cpan/Math-BigInt/t/use_lib2.t                  Test combinations of Math::BigInt and BigFloat
+cpan/Math-BigInt/t/use_lib3.t                  Test combinations of Math::BigInt and BigFloat
+cpan/Math-BigInt/t/use_lib4.t                  Test combinations of Math::BigInt and BigFloat
 cpan/Math-BigInt/t/use_lib5.t
 cpan/Math-BigInt/t/use_lib6.t
-cpan/Math-BigInt/t/use_mbfw.t          use BigFloat w/ with and lib at the same time
-cpan/Math-BigInt/t/with_sub.t          Test use Math::BigFloat with => package
-cpan/Math-BigInt-FastCalc/FastCalc.xs  Math::BigInt::FastCalc extension
+cpan/Math-BigInt/t/use_mbfw.t                  use BigFloat w/ with and lib at the same time
+cpan/Math-BigInt/t/with_sub.t                  Test use Math::BigFloat with => package
+cpan/Math-BigInt-FastCalc/FastCalc.xs                  Math::BigInt::FastCalc extension
 cpan/Math-BigInt-FastCalc/lib/Math/BigInt/FastCalc.pm  Math::BigInt::FastCalc extension
-cpan/Math-BigInt-FastCalc/t/bigintfc.t Math::BigInt::FastCalc extension
+cpan/Math-BigInt-FastCalc/t/bigintfc.t                 Math::BigInt::FastCalc extension
 cpan/Math-BigInt-FastCalc/t/biglog.t
 cpan/Math-BigInt-FastCalc/t/bigroot.t
-cpan/Math-BigInt-FastCalc/t/bootstrap.t        Math::BigInt::FastCalc extension
-cpan/Math-BigInt-FastCalc/t/leak.t     test for memory leaks in Math::BigInt::FastCalc
-cpan/Math-BigInt-FastCalc/t/mbi_rand.t Math::BigInt::FastCalc extension
+cpan/Math-BigInt-FastCalc/t/bootstrap.t                        Math::BigInt::FastCalc extension
+cpan/Math-BigInt-FastCalc/t/leak.t                     test for memory leaks in Math::BigInt::FastCalc
+cpan/Math-BigInt-FastCalc/t/mbi_rand.t                 Math::BigInt::FastCalc extension
 cpan/Math-BigRat/lib/Math/BigRat.pm    Math::BigRat
 cpan/Math-BigRat/t/badd-mbr.t
 cpan/Math-BigRat/t/big_ap.t            Math::BigRat test
@@ -1502,46 +1668,38 @@ cpan/Math-BigRat/t/new-mbr.t
 cpan/Math-BigRat/t/requirer.t          see if require works properly
 cpan/Math-BigRat/t/rt121139.t
 cpan/Math-BigRat/t/trap.t              see if trap_nan and trap_inf work
-cpan/Math-Complex/lib/Math/Complex.pm  A Complex package
-cpan/Math-Complex/lib/Math/Trig.pm     A simple interface to complex trigonometry
-cpan/Math-Complex/t/Complex.t          See if Math::Complex works
-cpan/Math-Complex/t/Trig.t             See if Math::Trig works
-cpan/Math-Complex/t/underbar.t         See if Math::Complex works
 cpan/Memoize/Memoize.pm                        Memoize
 cpan/Memoize/Memoize/AnyDBM_File.pm    Memoize glue layer for AnyDBM_File
 cpan/Memoize/Memoize/Expire.pm         Memoize expiry manager example
-cpan/Memoize/Memoize/ExpireFile.pm     Memoize expiry manager test scaffold
-cpan/Memoize/Memoize/ExpireTest.pm     Memoize expiry manager test scaffold
 cpan/Memoize/Memoize/NDBM_File.pm      Memoize glue layer for NDBM_File
 cpan/Memoize/Memoize/SDBM_File.pm      Memoize glue layer for SDBM_File
 cpan/Memoize/Memoize/Storable.pm       Memoize glue layer for Storable
-cpan/Memoize/t/array.t                 Memoize array context return tests
-cpan/Memoize/t/array_confusion.t       Memoize ambiguous array return tests
+cpan/Memoize/t/basic.t
+cpan/Memoize/t/cache.t
 cpan/Memoize/t/correctness.t           Memoize basic correctness tests
-cpan/Memoize/t/errors.t                        Memoize PEBKAC detection tests
-cpan/Memoize/t/expfile.t               Memoize expiry manager tests
-cpan/Memoize/t/expire.t                        Memoize expiry manager tests
-cpan/Memoize/t/expmod_n.t              Memoize expiry manager tests
+cpan/Memoize/t/expmod.t
 cpan/Memoize/t/expmod_t.t              Memoize expiry manager (timed) tests
 cpan/Memoize/t/flush.t                 Memoize 'flush_cache' function tests
+cpan/Memoize/t/lib/DBMTest.pm
 cpan/Memoize/t/normalize.t             Memoize 'normalizer' feature tests
-cpan/Memoize/t/prototype.t             Memoize prototyped function handling tests
-cpan/Memoize/t/speed.t                 "Makes functions faster" advertisement test
+cpan/Memoize/t/st_concurrency
+cpan/Memoize/t/threadsafe.t
 cpan/Memoize/t/tie.t                   Memoize tied file test
+cpan/Memoize/t/tie_db.t
 cpan/Memoize/t/tie_gdbm.t              Memoize GDBM interface test
 cpan/Memoize/t/tie_ndbm.t              Memoize NDBM interface test
+cpan/Memoize/t/tie_odbm.t
 cpan/Memoize/t/tie_sdbm.t              Memoize SDBM interface test
 cpan/Memoize/t/tie_storable.t          Memoize Storable interface test
-cpan/Memoize/t/tiefeatures.t           Memoize FAULT / MERGE / HASH options test
 cpan/Memoize/t/unmemoize.t             Memoize 'unmemoize' function test
-cpan/MIME-Base64/Base64.xs             MIME::Base64 extension
+cpan/MIME-Base64/Base64.xs                     MIME::Base64 extension
 cpan/MIME-Base64/lib/MIME/Base64.pm
 cpan/MIME-Base64/lib/MIME/QuotedPrint.pm
-cpan/MIME-Base64/t/base64.t            See whether MIME::Base64 works
+cpan/MIME-Base64/t/base64.t                    See whether MIME::Base64 works
 cpan/MIME-Base64/t/base64url.t
-cpan/MIME-Base64/t/length.t    See whether MIME::QuotedPrint works
-cpan/MIME-Base64/t/quoted-print.t      See whether MIME::QuotedPrint works
-cpan/MIME-Base64/t/unicode.t           See whether MIME::Base64 works
+cpan/MIME-Base64/t/length.t                    See whether MIME::QuotedPrint works
+cpan/MIME-Base64/t/quoted-print.t              See whether MIME::QuotedPrint works
+cpan/MIME-Base64/t/unicode.t                   See whether MIME::Base64 works
 cpan/Module-Load/lib/Module/Load.pm            Module::Load
 cpan/Module-Load/t/01_Module-Load.t            Module::Load tests
 cpan/Module-Load/t/02_Module-Load.t            Module::Load tests
@@ -1584,23 +1742,13 @@ cpan/Module-Metadata/t/lib/GeneratePackage.pm
 cpan/Module-Metadata/t/metadata.t
 cpan/Module-Metadata/t/taint.t
 cpan/Module-Metadata/t/version.t
-cpan/NEXT/lib/NEXT.pm          Pseudo-class NEXT for method redispatch
-cpan/NEXT/t/actual.t           NEXT
-cpan/NEXT/t/actuns.t           NEXT
+cpan/NEXT/lib/NEXT.pm                          Pseudo-class NEXT for method redispatch
+cpan/NEXT/t/actual.t                           NEXT
+cpan/NEXT/t/actuns.t                           NEXT
 cpan/NEXT/t/dynamically_scoped_regex_vars.t    NEXT
-cpan/NEXT/t/next.t             NEXT
-cpan/NEXT/t/stringify.t                NEXT
-cpan/NEXT/t/unseen.t           NEXT
-cpan/OpenBSD-MkTemp/lib/OpenBSD/MkTemp.pm              OpenBSD::MkTemp
-cpan/OpenBSD-MkTemp/MkTemp.xs          OpenBSD::MkTemp
-cpan/OpenBSD-MkTemp/README             OpenBSD::MkTemp Readme
-cpan/OpenBSD-MkTemp/t/OpenBSD-MkTemp.t         OpenBSD::MkTemp test file
-cpan/OpenBSD-Pledge/lib/OpenBSD/Pledge.pm      OpenBSD::Pledge
-cpan/OpenBSD-Pledge/Pledge.xs  OpenBSD::Pledge
-cpan/OpenBSD-Pledge/t/OpenBSD-Pledge.t OpenBSD::Pledge test file
-cpan/OpenBSD-Unveil/lib/OpenBSD/Unveil.pm      OpenBSD::Unveil
-cpan/OpenBSD-Unveil/t/OpenBSD-Unveil.t OpenBSD::Unveil test file
-cpan/OpenBSD-Unveil/Unveil.xs  OpenBSD::Unveil
+cpan/NEXT/t/next.t                             NEXT
+cpan/NEXT/t/stringify.t                                NEXT
+cpan/NEXT/t/unseen.t                           NEXT
 cpan/Params-Check/lib/Params/Check.pm  Params::Check
 cpan/Params-Check/t/01_Params-Check.t  Params::Check tests
 cpan/parent/lib/parent.pm                      Establish an ISA relationship with base classes at compile time
@@ -1617,19 +1765,19 @@ cpan/parent/t/parent-classfromfile.t            tests for parent.pm
 cpan/parent/t/parent-pmc.t                     tests for parent.pm
 cpan/parent/t/parent-returns-false.t           tests for parent.pm
 cpan/parent/t/rt62341.t.disabled               test files for parent.pm
-cpan/Perl-OSType/lib/Perl/OSType.pm                    Perl::OSType
-cpan/Perl-OSType/t/OSType.t                    Perl::OSType
-cpan/perlfaq/lib/perlfaq.pm    Perl frequently asked questions
-cpan/perlfaq/lib/perlfaq.pod   Perl frequently asked questions
+cpan/Perl-OSType/lib/Perl/OSType.pm    Perl::OSType
+cpan/Perl-OSType/t/OSType.t            Perl::OSType
+cpan/perlfaq/lib/perlfaq.pm            Perl frequently asked questions
+cpan/perlfaq/lib/perlfaq.pod           Perl frequently asked questions
 cpan/perlfaq/lib/perlfaq1.pod          General Questions About Perl
-cpan/perlfaq/lib/perlfaq2.pod  Obtaining and Learning about Perl
-cpan/perlfaq/lib/perlfaq3.pod  Programming Tools
-cpan/perlfaq/lib/perlfaq4.pod  Data Manipulation
-cpan/perlfaq/lib/perlfaq5.pod  Files and Formats
-cpan/perlfaq/lib/perlfaq6.pod  Regexes
-cpan/perlfaq/lib/perlfaq7.pod  Perl Language Issues
-cpan/perlfaq/lib/perlfaq8.pod  System Interaction
-cpan/perlfaq/lib/perlfaq9.pod  Networking
+cpan/perlfaq/lib/perlfaq2.pod          Obtaining and Learning about Perl
+cpan/perlfaq/lib/perlfaq3.pod          Programming Tools
+cpan/perlfaq/lib/perlfaq4.pod          Data Manipulation
+cpan/perlfaq/lib/perlfaq5.pod          Files and Formats
+cpan/perlfaq/lib/perlfaq6.pod          Regexes
+cpan/perlfaq/lib/perlfaq7.pod          Perl Language Issues
+cpan/perlfaq/lib/perlfaq8.pod          System Interaction
+cpan/perlfaq/lib/perlfaq9.pod          Networking
 cpan/perlfaq/lib/perlglossary.pod      Perl Glossary
 cpan/PerlIO-via-QuotedPrint/lib/PerlIO/via/QuotedPrint.pm      PerlIO::via::QuotedPrint
 cpan/PerlIO-via-QuotedPrint/t/changes.t
@@ -1732,10 +1880,10 @@ cpan/Pod-Simple/t/corpus/8859_7.pod                     Pod::Simple test file
 cpan/Pod-Simple/t/corpus/8859_7.xml                    Pod::Simple test file
 cpan/Pod-Simple/t/corpus/cp1256.txt                    Pod::Simple test file
 cpan/Pod-Simple/t/corpus/cp1256.xml                    Pod::Simple test file
-cpan/Pod-Simple/t/corpus/enc_char_directive.txt                        Pod::Simple test file
-cpan/Pod-Simple/t/corpus/enc_char_directive.xml                        Pod::Simple test file
-cpan/Pod-Simple/t/corpus/enc_char_wrong_directive.txt                  Pod::Simple test file
-cpan/Pod-Simple/t/corpus/enc_char_wrong_directive.xml                  Pod::Simple test file
+cpan/Pod-Simple/t/corpus/enc_char_directive.txt                Pod::Simple test file
+cpan/Pod-Simple/t/corpus/enc_char_directive.xml                Pod::Simple test file
+cpan/Pod-Simple/t/corpus/enc_char_wrong_directive.txt  Pod::Simple test file
+cpan/Pod-Simple/t/corpus/enc_char_wrong_directive.xml  Pod::Simple test file
 cpan/Pod-Simple/t/corpus/encwarn01.txt                 Pod::Simple test file
 cpan/Pod-Simple/t/corpus/encwarn01.xml                 Pod::Simple test file
 cpan/Pod-Simple/t/corpus/encwarn02.txt                 Pod::Simple test file
@@ -1906,22 +2054,30 @@ cpan/Pod-Usage/t/pod/testcmp.pl
 cpan/Pod-Usage/t/pod/testp2pt.pl
 cpan/Pod-Usage/t/pod/usage.pod
 cpan/Pod-Usage/t/pod/usage2.pod
-cpan/podlators/lib/Pod/Man.pm                  Convert POD data to *roff
-cpan/podlators/lib/Pod/ParseLink.pm            Perl an L<> formatting code in POD text
-cpan/podlators/lib/Pod/Text.pm                 Pod-Parser - convert POD data to formatted ASCII text
-cpan/podlators/lib/Pod/Text/Color.pm           Convert POD data to color ASCII text
-cpan/podlators/lib/Pod/Text/Overstrike.pm      Convert POD data to formatted overstrike text
-cpan/podlators/lib/Pod/Text/Termcap.pm         Convert POD data to ASCII text with format escapes
-cpan/podlators/Makefile.PL                     podlators Makefile.PL
-cpan/podlators/scripts/pod2man.PL              Translator to turn pod into manpage
-cpan/podlators/scripts/pod2text.PL             Translator to turn pod into text
-cpan/podlators/t/data/basic.cap                        podlators test                  podlators test
-cpan/podlators/t/data/basic.clr                        podlators test
-cpan/podlators/t/data/basic.man                        podlators test
-cpan/podlators/t/data/basic.ovr                        podlators test
-cpan/podlators/t/data/basic.pod                        podlators test
-cpan/podlators/t/data/basic.txt                        podlators test
-cpan/podlators/t/data/perl.conf                        podlators test
+cpan/podlators/docs/docknot.yaml
+cpan/podlators/lib/Pod/Man.pm                                  Convert POD data to *roff
+cpan/podlators/lib/Pod/ParseLink.pm                            Perl an L<> formatting code in POD text
+cpan/podlators/lib/Pod/Text.pm                                 Pod-Parser - convert POD data to formatted ASCII text
+cpan/podlators/lib/Pod/Text/Color.pm                           Convert POD data to color ASCII text
+cpan/podlators/lib/Pod/Text/Overstrike.pm                      Convert POD data to formatted overstrike text
+cpan/podlators/lib/Pod/Text/Termcap.pm                         Convert POD data to ASCII text with format escapes
+cpan/podlators/Makefile.PL                                     podlators Makefile.PL
+cpan/podlators/scripts/pod2man.PL                              Translator to turn pod into manpage
+cpan/podlators/scripts/pod2text.PL                             Translator to turn pod into text
+cpan/podlators/t/data/basic.cap                                        podlators test
+cpan/podlators/t/data/basic.clr                                        podlators test
+cpan/podlators/t/data/basic.man                                        podlators test
+cpan/podlators/t/data/basic.ovr                                        podlators test
+cpan/podlators/t/data/basic.pod                                        podlators test
+cpan/podlators/t/data/basic.txt                                        podlators test
+cpan/podlators/t/data/man/encoding.groff
+cpan/podlators/t/data/man/encoding.pod
+cpan/podlators/t/data/man/encoding.roff
+cpan/podlators/t/data/man/encoding.utf8
+cpan/podlators/t/data/perl.conf                                        podlators test
+cpan/podlators/t/data/perlcriticrc
+cpan/podlators/t/data/perltidyrc
+cpan/podlators/t/data/regenerate-data
 cpan/podlators/t/data/snippets/color/escape-wrapping
 cpan/podlators/t/data/snippets/color/tag-width
 cpan/podlators/t/data/snippets/color/tag-wrapping
@@ -1945,9 +2101,19 @@ cpan/podlators/t/data/snippets/man/eth
 cpan/podlators/t/data/snippets/man/fixed-font
 cpan/podlators/t/data/snippets/man/fixed-font-in-item
 cpan/podlators/t/data/snippets/man/for-blocks
+cpan/podlators/t/data/snippets/man/guesswork
+cpan/podlators/t/data/snippets/man/guesswork-all
+cpan/podlators/t/data/snippets/man/guesswork-no-quoting
+cpan/podlators/t/data/snippets/man/guesswork-none
+cpan/podlators/t/data/snippets/man/guesswork-partial
+cpan/podlators/t/data/snippets/man/guesswork-quoting
 cpan/podlators/t/data/snippets/man/hyphen-in-s
 cpan/podlators/t/data/snippets/man/iso-8859-1
+cpan/podlators/t/data/snippets/man/iso-8859-1-error-die
+cpan/podlators/t/data/snippets/man/iso-8859-1-error-pod
+cpan/podlators/t/data/snippets/man/iso-8859-1-roff
 cpan/podlators/t/data/snippets/man/item-fonts
+cpan/podlators/t/data/snippets/man/language
 cpan/podlators/t/data/snippets/man/link-quoting
 cpan/podlators/t/data/snippets/man/link-to-url
 cpan/podlators/t/data/snippets/man/long-quote
@@ -1955,29 +2121,32 @@ cpan/podlators/t/data/snippets/man/lquote-and-quote
 cpan/podlators/t/data/snippets/man/lquote-rquote
 cpan/podlators/t/data/snippets/man/markup-in-name
 cpan/podlators/t/data/snippets/man/multiline-x
+cpan/podlators/t/data/snippets/man/naive
+cpan/podlators/t/data/snippets/man/naive-groff
 cpan/podlators/t/data/snippets/man/name-guesswork
+cpan/podlators/t/data/snippets/man/name-quotes
+cpan/podlators/t/data/snippets/man/name-quotes-none
 cpan/podlators/t/data/snippets/man/nested-lists
 cpan/podlators/t/data/snippets/man/newlines-in-c
 cpan/podlators/t/data/snippets/man/non-ascii
+cpan/podlators/t/data/snippets/man/nonbreaking-space-l
 cpan/podlators/t/data/snippets/man/not-bullet
 cpan/podlators/t/data/snippets/man/not-numbers
 cpan/podlators/t/data/snippets/man/nourls
-cpan/podlators/t/data/snippets/man/paired-quotes
 cpan/podlators/t/data/snippets/man/periods
 cpan/podlators/t/data/snippets/man/quote-escaping
 cpan/podlators/t/data/snippets/man/rquote-none
-cpan/podlators/t/data/snippets/man/small-caps-magic
 cpan/podlators/t/data/snippets/man/soft-hyphens
 cpan/podlators/t/data/snippets/man/trailing-space
 cpan/podlators/t/data/snippets/man/true-false
-cpan/podlators/t/data/snippets/man/uppercase-license
 cpan/podlators/t/data/snippets/man/utf8-nonbreaking
 cpan/podlators/t/data/snippets/man/utf8-verbatim
 cpan/podlators/t/data/snippets/man/x-whitespace
 cpan/podlators/t/data/snippets/man/x-whitespace-entry
+cpan/podlators/t/data/snippets/man/zero-width-space
 cpan/podlators/t/data/snippets/overstrike/tag-width
 cpan/podlators/t/data/snippets/overstrike/wrapping
-cpan/podlators/t/data/snippets/README                  podlators test
+cpan/podlators/t/data/snippets/README.md
 cpan/podlators/t/data/snippets/termcap/escape-wrapping
 cpan/podlators/t/data/snippets/termcap/tag-width
 cpan/podlators/t/data/snippets/termcap/tag-wrapping
@@ -1987,7 +2156,7 @@ cpan/podlators/t/data/snippets/termcap/wrapping
 cpan/podlators/t/data/snippets/text/alt
 cpan/podlators/t/data/snippets/text/c-with-spaces
 cpan/podlators/t/data/snippets/text/code
-cpan/podlators/t/data/snippets/text/cpp                        podlators test
+cpan/podlators/t/data/snippets/text/cpp                                podlators test
 cpan/podlators/t/data/snippets/text/empty
 cpan/podlators/t/data/snippets/text/error-die
 cpan/podlators/t/data/snippets/text/error-none
@@ -1996,12 +2165,22 @@ cpan/podlators/t/data/snippets/text/error-pod
 cpan/podlators/t/data/snippets/text/error-stderr
 cpan/podlators/t/data/snippets/text/error-stderr-opt
 cpan/podlators/t/data/snippets/text/for
+cpan/podlators/t/data/snippets/text/guesswork-no-quoting
+cpan/podlators/t/data/snippets/text/guesswork-quoting
 cpan/podlators/t/data/snippets/text/iso-8859-1
+cpan/podlators/t/data/snippets/text/iso-8859-1-error-die
+cpan/podlators/t/data/snippets/text/iso-8859-1-error-pod
+cpan/podlators/t/data/snippets/text/iso-8859-1-utf8
 cpan/podlators/t/data/snippets/text/late-encoding
 cpan/podlators/t/data/snippets/text/link-rt
 cpan/podlators/t/data/snippets/text/link-url
 cpan/podlators/t/data/snippets/text/margin
+cpan/podlators/t/data/snippets/text/naive
+cpan/podlators/t/data/snippets/text/name-quotes
+cpan/podlators/t/data/snippets/text/name-quotes-none
+cpan/podlators/t/data/snippets/text/non-latin
 cpan/podlators/t/data/snippets/text/nonbreaking-space
+cpan/podlators/t/data/snippets/text/nonbreaking-space-l
 cpan/podlators/t/data/snippets/text/nourls
 cpan/podlators/t/data/snippets/text/periods
 cpan/podlators/t/data/snippets/text/quotes-opt
@@ -2010,37 +2189,41 @@ cpan/podlators/t/data/snippets/text/sentence-spacing
 cpan/podlators/t/data/snippets/text/utf8
 cpan/podlators/t/data/snippets/text/utf8-iso
 cpan/podlators/t/data/snippets/text/verbatim
-cpan/podlators/t/data/termcap                  podlators test
-cpan/podlators/t/docs/pod.t                    podlators test
-cpan/podlators/t/docs/pod-spelling.t                   podlators test
-cpan/podlators/t/docs/spdx-license.t                   podlators test
-cpan/podlators/t/docs/synopsis.t                       podlators test
-cpan/podlators/t/general/basic.t                       podlators test
-cpan/podlators/t/general/filehandle.t                  podlators test
-cpan/podlators/t/general/pod-parser.t                  podlators test
-cpan/podlators/t/lib/Test/Podlators.pm                 podlators test
-cpan/podlators/t/lib/Test/RRA.pm                       podlators test
-cpan/podlators/t/lib/Test/RRA/Config.pm                        podlators test
-cpan/podlators/t/lib/Test/RRA/ModuleVersion.pm         podlators test
-cpan/podlators/t/man/devise-date.t                     podlators test
-cpan/podlators/t/man/devise-title.t                    podlators test
-cpan/podlators/t/man/empty.t                   podlators test
-cpan/podlators/t/man/heading.t                 podlators test
-cpan/podlators/t/man/iso-8859-1.t              podlators test
-cpan/podlators/t/man/no-encode.t               podlators test
-cpan/podlators/t/man/snippets.t                        podlators test
-cpan/podlators/t/man/utf8-io.t                 podlators test
-cpan/podlators/t/parselink/basic.t                     podlators test
+cpan/podlators/t/data/termcap                                  podlators test
+cpan/podlators/t/docs/changes.t
+cpan/podlators/t/docs/pod.t                                    podlators test
+cpan/podlators/t/docs/pod-spelling.t                           podlators test
+cpan/podlators/t/docs/spdx-license.t                           podlators test
+cpan/podlators/t/docs/synopsis.t                               podlators test
+cpan/podlators/t/general/basic.t                               podlators test
+cpan/podlators/t/general/filehandle.t                          podlators test
+cpan/podlators/t/general/pod-parser.t                          podlators test
+cpan/podlators/t/lib/Test/Podlators.pm                         podlators test
+cpan/podlators/t/lib/Test/RRA.pm                               podlators test
+cpan/podlators/t/lib/Test/RRA/Config.pm                                podlators test
+cpan/podlators/t/lib/Test/RRA/ModuleVersion.pm                 podlators test
+cpan/podlators/t/man/devise-date.t                             podlators test
+cpan/podlators/t/man/devise-title.t                            podlators test
+cpan/podlators/t/man/empty.t                                   podlators test
+cpan/podlators/t/man/encoding.t
+cpan/podlators/t/man/heading.t                                 podlators test
+cpan/podlators/t/man/iso-8859-1.t                              podlators test
+cpan/podlators/t/man/no-encode.t                               podlators test
+cpan/podlators/t/man/snippets.t                                        podlators test
+cpan/podlators/t/man/utf8-io.t                                 podlators test
+cpan/podlators/t/parselink/basic.t                             podlators test
+cpan/podlators/t/style/critic.t
+cpan/podlators/t/style/kwalitee.t
 cpan/podlators/t/style/minimum-version.t                       podlators test
-cpan/podlators/t/style/module-version.t                        podlators test
+cpan/podlators/t/style/module-version.t                                podlators test
 cpan/podlators/t/style/obsolete-strings.t
-cpan/podlators/t/style/strict.t                        podlators test
-cpan/podlators/t/text/color.t                  podlators test
+cpan/podlators/t/style/strict.t                                        podlators test
+cpan/podlators/t/text/color.t                                  podlators test
 cpan/podlators/t/text/invalid.t
 cpan/podlators/t/text/iso-8859-1.t
-cpan/podlators/t/text/overstrike.t                     podlators test
+cpan/podlators/t/text/overstrike.t                             podlators test
 cpan/podlators/t/text/snippets.t
-cpan/podlators/t/text/termcap.t                        podlators test
+cpan/podlators/t/text/termcap.t                                        podlators test
 cpan/podlators/t/text/utf8-io.t
 cpan/Scalar-List-Utils/lib/List/Util.pm                List::Util
 cpan/Scalar-List-Utils/lib/List/Util/XS.pm     List::Util
@@ -2132,556 +2315,545 @@ cpan/Term-ANSIColor/t/module/true-color.t
 cpan/Term-ANSIColor/t/taint/basic.t
 cpan/Term-Cap/Cap.pm                   Perl module supporting termcap usage
 cpan/Term-Cap/test.pl                  See if Term::Cap works
-cpan/Term-ReadKey/Changes                      Term::ReadKey
-cpan/Term-ReadKey/Configure.pm                 Term::ReadKey
-cpan/Term-ReadKey/example/test.pl              Term::ReadKey
-cpan/Term-ReadKey/genchars.pl                  Term::ReadKey
-cpan/Term-ReadKey/Makefile.PL                  Term::ReadKey
-cpan/Term-ReadKey/ppport.h                     Term::ReadKey
-cpan/Term-ReadKey/ReadKey.xs                   Term::ReadKey
-cpan/Term-ReadKey/ReadKey.pm.PL                Term::ReadKey
-cpan/Term-ReadKey/README                       Term::ReadKey
-cpan/Term-ReadKey/t/01_basic.t                 Term::ReadKey
-cpan/Term-ReadKey/t/02_terminal_functions.t    Term::ReadKey
-cpan/Test-Harness/bin/prove                            The prove harness utility
-cpan/Test-Harness/lib/App/Prove.pm                     Gubbins for the prove utility
-cpan/Test-Harness/lib/App/Prove/State.pm               Gubbins for the prove utility
-cpan/Test-Harness/lib/App/Prove/State/Result.pm                Gubbins for the prove utility
-cpan/Test-Harness/lib/App/Prove/State/Result/Test.pm   Gubbins for the prove utility
-cpan/Test-Harness/lib/TAP/Base.pm                      A parser for Test Anything Protocol
-cpan/Test-Harness/lib/TAP/Formatter/Base.pm            A parser for Test Anything Protocol
-cpan/Test-Harness/lib/TAP/Formatter/Color.pm           A parser for Test Anything Protocol
-cpan/Test-Harness/lib/TAP/Formatter/Console.pm         A parser for Test Anything Protocol
+cpan/Test-Harness/bin/prove                                    The prove harness utility
+cpan/Test-Harness/lib/App/Prove.pm                             Gubbins for the prove utility
+cpan/Test-Harness/lib/App/Prove/State.pm                       Gubbins for the prove utility
+cpan/Test-Harness/lib/App/Prove/State/Result.pm                        Gubbins for the prove utility
+cpan/Test-Harness/lib/App/Prove/State/Result/Test.pm           Gubbins for the prove utility
+cpan/Test-Harness/lib/TAP/Base.pm                              A parser for Test Anything Protocol
+cpan/Test-Harness/lib/TAP/Formatter/Base.pm                    A parser for Test Anything Protocol
+cpan/Test-Harness/lib/TAP/Formatter/Color.pm                   A parser for Test Anything Protocol
+cpan/Test-Harness/lib/TAP/Formatter/Console.pm                 A parser for Test Anything Protocol
 cpan/Test-Harness/lib/TAP/Formatter/Console/ParallelSession.pm A parser for Test Anything Protocol
-cpan/Test-Harness/lib/TAP/Formatter/Console/Session.pm A parser for Test Anything Protocol
-cpan/Test-Harness/lib/TAP/Formatter/File.pm            A parser for Test Anything Protocol
-cpan/Test-Harness/lib/TAP/Formatter/File/Session.pm    A parser for Test Anything Protocol
-cpan/Test-Harness/lib/TAP/Formatter/Session.pm         A parser for Test Anything Protocol
-cpan/Test-Harness/lib/TAP/Harness.pm                   A parser for Test Anything Protocol
+cpan/Test-Harness/lib/TAP/Formatter/Console/Session.pm         A parser for Test Anything Protocol
+cpan/Test-Harness/lib/TAP/Formatter/File.pm                    A parser for Test Anything Protocol
+cpan/Test-Harness/lib/TAP/Formatter/File/Session.pm            A parser for Test Anything Protocol
+cpan/Test-Harness/lib/TAP/Formatter/Session.pm                 A parser for Test Anything Protocol
+cpan/Test-Harness/lib/TAP/Harness.pm                           A parser for Test Anything Protocol
 cpan/Test-Harness/lib/TAP/Harness/Beyond.pod
-cpan/Test-Harness/lib/TAP/Harness/Env.pm               A parser for Test Anything Protocol
-cpan/Test-Harness/lib/TAP/Object.pm                    A parser for Test Anything Protocol
-cpan/Test-Harness/lib/TAP/Parser.pm                    A parser for Test Anything Protocol
-cpan/Test-Harness/lib/TAP/Parser/Aggregator.pm         A parser for Test Anything Protocol
-cpan/Test-Harness/lib/TAP/Parser/Grammar.pm            A parser for Test Anything Protocol
-cpan/Test-Harness/lib/TAP/Parser/Iterator.pm           A parser for Test Anything Protocol
-cpan/Test-Harness/lib/TAP/Parser/Iterator/Array.pm     A parser for Test Anything Protocol
-cpan/Test-Harness/lib/TAP/Parser/Iterator/Process.pm   A parser for Test Anything Protocol
-cpan/Test-Harness/lib/TAP/Parser/Iterator/Stream.pm    A parser for Test Anything Protocol
-cpan/Test-Harness/lib/TAP/Parser/IteratorFactory.pm    A parser for Test Anything Protocol
-cpan/Test-Harness/lib/TAP/Parser/Multiplexer.pm                A parser for Test Anything Protocol
-cpan/Test-Harness/lib/TAP/Parser/Result.pm             A parser for Test Anything Protocol
-cpan/Test-Harness/lib/TAP/Parser/Result/Bailout.pm     A parser for Test Anything Protocol
-cpan/Test-Harness/lib/TAP/Parser/Result/Comment.pm     A parser for Test Anything Protocol
-cpan/Test-Harness/lib/TAP/Parser/Result/Plan.pm                A parser for Test Anything Protocol
-cpan/Test-Harness/lib/TAP/Parser/Result/Pragma.pm      A parser for Test Anything Protocol
-cpan/Test-Harness/lib/TAP/Parser/Result/Test.pm                A parser for Test Anything Protocol
-cpan/Test-Harness/lib/TAP/Parser/Result/Unknown.pm     A parser for Test Anything Protocol
-cpan/Test-Harness/lib/TAP/Parser/Result/Version.pm     A parser for Test Anything Protocol
-cpan/Test-Harness/lib/TAP/Parser/Result/YAML.pm                A parser for Test Anything Protocol
-cpan/Test-Harness/lib/TAP/Parser/ResultFactory.pm      A parser for Test Anything Protocol
-cpan/Test-Harness/lib/TAP/Parser/Scheduler.pm          A parser for Test Anything Protocol
-cpan/Test-Harness/lib/TAP/Parser/Scheduler/Job.pm      A parser for Test Anything Protocol
-cpan/Test-Harness/lib/TAP/Parser/Scheduler/Spinner.pm  A parser for Test Anything Protocol
-cpan/Test-Harness/lib/TAP/Parser/Source.pm             A parser for Test Anything Protocol
+cpan/Test-Harness/lib/TAP/Harness/Env.pm                       A parser for Test Anything Protocol
+cpan/Test-Harness/lib/TAP/Object.pm                            A parser for Test Anything Protocol
+cpan/Test-Harness/lib/TAP/Parser.pm                            A parser for Test Anything Protocol
+cpan/Test-Harness/lib/TAP/Parser/Aggregator.pm                 A parser for Test Anything Protocol
+cpan/Test-Harness/lib/TAP/Parser/Grammar.pm                    A parser for Test Anything Protocol
+cpan/Test-Harness/lib/TAP/Parser/Iterator.pm                   A parser for Test Anything Protocol
+cpan/Test-Harness/lib/TAP/Parser/Iterator/Array.pm             A parser for Test Anything Protocol
+cpan/Test-Harness/lib/TAP/Parser/Iterator/Process.pm           A parser for Test Anything Protocol
+cpan/Test-Harness/lib/TAP/Parser/Iterator/Stream.pm            A parser for Test Anything Protocol
+cpan/Test-Harness/lib/TAP/Parser/IteratorFactory.pm            A parser for Test Anything Protocol
+cpan/Test-Harness/lib/TAP/Parser/Multiplexer.pm                        A parser for Test Anything Protocol
+cpan/Test-Harness/lib/TAP/Parser/Result.pm                     A parser for Test Anything Protocol
+cpan/Test-Harness/lib/TAP/Parser/Result/Bailout.pm             A parser for Test Anything Protocol
+cpan/Test-Harness/lib/TAP/Parser/Result/Comment.pm             A parser for Test Anything Protocol
+cpan/Test-Harness/lib/TAP/Parser/Result/Plan.pm                        A parser for Test Anything Protocol
+cpan/Test-Harness/lib/TAP/Parser/Result/Pragma.pm              A parser for Test Anything Protocol
+cpan/Test-Harness/lib/TAP/Parser/Result/Test.pm                        A parser for Test Anything Protocol
+cpan/Test-Harness/lib/TAP/Parser/Result/Unknown.pm             A parser for Test Anything Protocol
+cpan/Test-Harness/lib/TAP/Parser/Result/Version.pm             A parser for Test Anything Protocol
+cpan/Test-Harness/lib/TAP/Parser/Result/YAML.pm                        A parser for Test Anything Protocol
+cpan/Test-Harness/lib/TAP/Parser/ResultFactory.pm              A parser for Test Anything Protocol
+cpan/Test-Harness/lib/TAP/Parser/Scheduler.pm                  A parser for Test Anything Protocol
+cpan/Test-Harness/lib/TAP/Parser/Scheduler/Job.pm              A parser for Test Anything Protocol
+cpan/Test-Harness/lib/TAP/Parser/Scheduler/Spinner.pm          A parser for Test Anything Protocol
+cpan/Test-Harness/lib/TAP/Parser/Source.pm                     A parser for Test Anything Protocol
 cpan/Test-Harness/lib/TAP/Parser/SourceHandler.pm              A parser for Test Anything Protocol
 cpan/Test-Harness/lib/TAP/Parser/SourceHandler/Executable.pm
 cpan/Test-Harness/lib/TAP/Parser/SourceHandler/File.pm
 cpan/Test-Harness/lib/TAP/Parser/SourceHandler/Handle.pm
 cpan/Test-Harness/lib/TAP/Parser/SourceHandler/Perl.pm
 cpan/Test-Harness/lib/TAP/Parser/SourceHandler/RawTAP.pm
-cpan/Test-Harness/lib/TAP/Parser/YAMLish/Reader.pm     A parser for Test Anything Protocol
-cpan/Test-Harness/lib/TAP/Parser/YAMLish/Writer.pm     A parser for Test Anything Protocol
-cpan/Test-Harness/lib/Test/Harness.pm                  A test harness
-cpan/Test-Harness/t/aggregator.t                       Test::Harness test
-cpan/Test-Harness/t/bailout.t                          Test::Harness test
-cpan/Test-Harness/t/base.t                             Test::Harness test
-cpan/Test-Harness/t/callbacks.t                                Test::Harness test
-cpan/Test-Harness/t/compat/env.t                       Test::Harness test
-cpan/Test-Harness/t/compat/env_opts.t                  Test::Harness test
-cpan/Test-Harness/t/compat/failure.t                   Test::Harness test
-cpan/Test-Harness/t/compat/inc-propagation.t           Test::Harness test
-cpan/Test-Harness/t/compat/inc_taint.t                 Test::Harness test
-cpan/Test-Harness/t/compat/nonumbers.t                 Test::Harness test
-cpan/Test-Harness/t/compat/regression.t                        Test::Harness test
+cpan/Test-Harness/lib/TAP/Parser/YAMLish/Reader.pm             A parser for Test Anything Protocol
+cpan/Test-Harness/lib/TAP/Parser/YAMLish/Writer.pm             A parser for Test Anything Protocol
+cpan/Test-Harness/lib/Test/Harness.pm                          A test harness
+cpan/Test-Harness/t/aggregator.t                               Test::Harness test
+cpan/Test-Harness/t/bailout.t                                  Test::Harness test
+cpan/Test-Harness/t/base.t                                     Test::Harness test
+cpan/Test-Harness/t/callbacks.t                                        Test::Harness test
+cpan/Test-Harness/t/compat/env.t                               Test::Harness test
+cpan/Test-Harness/t/compat/env_opts.t                          Test::Harness test
+cpan/Test-Harness/t/compat/failure.t                           Test::Harness test
+cpan/Test-Harness/t/compat/inc-propagation.t                   Test::Harness test
+cpan/Test-Harness/t/compat/inc_taint.t                         Test::Harness test
+cpan/Test-Harness/t/compat/nonumbers.t                         Test::Harness test
+cpan/Test-Harness/t/compat/regression.t                                Test::Harness test
 cpan/Test-Harness/t/compat/subclass.t                          Test::Harness test
-cpan/Test-Harness/t/compat/switches.t                  Test::Harness test
-cpan/Test-Harness/t/compat/test-harness-compat.t       Test::Harness test
-cpan/Test-Harness/t/compat/version.t                   Test::Harness test
-cpan/Test-Harness/t/console.t                          Test::Harness test
-cpan/Test-Harness/t/data/catme.1                       Test data for Test::Harness
-cpan/Test-Harness/t/data/proverc                       Test data for Test::Harness
-cpan/Test-Harness/t/data/sample.yml                    Test data for Test::Harness
+cpan/Test-Harness/t/compat/switches.t                          Test::Harness test
+cpan/Test-Harness/t/compat/test-harness-compat.t               Test::Harness test
+cpan/Test-Harness/t/compat/version.t                           Test::Harness test
+cpan/Test-Harness/t/console.t                                  Test::Harness test
+cpan/Test-Harness/t/data/catme.1                               Test data for Test::Harness
+cpan/Test-Harness/t/data/proverc                               Test data for Test::Harness
+cpan/Test-Harness/t/data/sample.yml                            Test data for Test::Harness
 cpan/Test-Harness/t/env_opts.t
-cpan/Test-Harness/t/errors.t                           Test::Harness test
-cpan/Test-Harness/t/file.t                             Test::Harness test
-cpan/Test-Harness/t/glob-to-regexp.t                   Test::Harness test
-cpan/Test-Harness/t/grammar.t                          Test::Harness test
-cpan/Test-Harness/t/harness.t                          Test::Harness test
-cpan/Test-Harness/t/harness-bailout.t                  Test::Harness test
-cpan/Test-Harness/t/harness-subclass.t                 Test::Harness test
+cpan/Test-Harness/t/errors.t                                   Test::Harness test
+cpan/Test-Harness/t/file.t                                     Test::Harness test
+cpan/Test-Harness/t/glob-to-regexp.t                           Test::Harness test
+cpan/Test-Harness/t/grammar.t                                  Test::Harness test
+cpan/Test-Harness/t/harness.t                                  Test::Harness test
+cpan/Test-Harness/t/harness-bailout.t                          Test::Harness test
+cpan/Test-Harness/t/harness-subclass.t                         Test::Harness test
 cpan/Test-Harness/t/iterator_factory.t                         Test::Harness test
-cpan/Test-Harness/t/iterators.t                                Test::Harness test
-cpan/Test-Harness/t/lib/App/Prove/Plugin/Dummy.pm      Module for testing Test::Harness
-cpan/Test-Harness/t/lib/App/Prove/Plugin/Dummy2.pm     Module for testing Test::Harness
-cpan/Test-Harness/t/lib/Dev/Null.pm                    Module for testing Test::Harness
-cpan/Test-Harness/t/lib/EmptyParser.pm                 Module for testing Test::Harness
-cpan/Test-Harness/t/lib/IO/c55Capture.pm               Module for testing Test::Harness
-cpan/Test-Harness/t/lib/MyCustom.pm                    Module for testing Test::Harness
-cpan/Test-Harness/t/lib/MyFileSourceHandler.pm                         Test::Harness test
-cpan/Test-Harness/t/lib/MyGrammar.pm                   Module for testing Test::Harness
-cpan/Test-Harness/t/lib/MyIterator.pm                  Module for testing Test::Harness
-cpan/Test-Harness/t/lib/MyPerlSourceHandler.pm                         Test::Harness test
-cpan/Test-Harness/t/lib/MyResult.pm                    Module for testing Test::Harness
-cpan/Test-Harness/t/lib/MyResultFactory.pm             Module for testing Test::Harness
-cpan/Test-Harness/t/lib/MySourceHandler.pm                             Test::Harness test
-cpan/Test-Harness/t/lib/NoFork.pm                      Module for testing Test::Harness
-cpan/Test-Harness/t/lib/NOP.pm                         Module for testing Test::Harness
+cpan/Test-Harness/t/iterators.t                                        Test::Harness test
+cpan/Test-Harness/t/lib/App/Prove/Plugin/Dummy.pm              Module for testing Test::Harness
+cpan/Test-Harness/t/lib/App/Prove/Plugin/Dummy2.pm             Module for testing Test::Harness
+cpan/Test-Harness/t/lib/Dev/Null.pm                            Module for testing Test::Harness
+cpan/Test-Harness/t/lib/EmptyParser.pm                         Module for testing Test::Harness
+cpan/Test-Harness/t/lib/IO/c55Capture.pm                       Module for testing Test::Harness
+cpan/Test-Harness/t/lib/MyCustom.pm                            Module for testing Test::Harness
+cpan/Test-Harness/t/lib/MyFileSourceHandler.pm                 Test::Harness test
+cpan/Test-Harness/t/lib/MyGrammar.pm                           Module for testing Test::Harness
+cpan/Test-Harness/t/lib/MyIterator.pm                          Module for testing Test::Harness
+cpan/Test-Harness/t/lib/MyPerlSourceHandler.pm                 Test::Harness test
+cpan/Test-Harness/t/lib/MyResult.pm                            Module for testing Test::Harness
+cpan/Test-Harness/t/lib/MyResultFactory.pm                     Module for testing Test::Harness
+cpan/Test-Harness/t/lib/MySourceHandler.pm                     Test::Harness test
+cpan/Test-Harness/t/lib/NoFork.pm                              Module for testing Test::Harness
+cpan/Test-Harness/t/lib/NOP.pm                                 Module for testing Test::Harness
 cpan/Test-Harness/t/lib/TAP/Harness/TestSubclass.pm
-cpan/Test-Harness/t/lib/TAP/Parser/SubclassTest.pm     Module for testing Test::Harness
-cpan/Test-Harness/t/multiplexer.t                      Test::Harness test
-cpan/Test-Harness/t/nested.t                           Test::Harness test
-cpan/Test-Harness/t/nofork.t                           Test::Harness test
-cpan/Test-Harness/t/nofork-mux.t                       Test::Harness test
-cpan/Test-Harness/t/object.t                           Test::Harness test
-cpan/Test-Harness/t/parse.t                            Test::Harness test
-cpan/Test-Harness/t/parser-config.t                    Test::Harness test
-cpan/Test-Harness/t/parser-subclass.t                  Test::Harness test
-cpan/Test-Harness/t/perl5lib.t                         Test::Harness test
-cpan/Test-Harness/t/premature-bailout.t                        Test::Harness test
-cpan/Test-Harness/t/process.t                          Test::Harness test
-cpan/Test-Harness/t/prove.t                            Test::Harness test
-cpan/Test-Harness/t/proverc.t                          Test::Harness test
-cpan/Test-Harness/t/proverc/emptyexec                  Test data for Test::Harness
-cpan/Test-Harness/t/proverun.t                         Test::Harness test
+cpan/Test-Harness/t/lib/TAP/Parser/SubclassTest.pm             Module for testing Test::Harness
+cpan/Test-Harness/t/multiplexer.t                              Test::Harness test
+cpan/Test-Harness/t/nested.t                                   Test::Harness test
+cpan/Test-Harness/t/nofork.t                                   Test::Harness test
+cpan/Test-Harness/t/nofork-mux.t                               Test::Harness test
+cpan/Test-Harness/t/object.t                                   Test::Harness test
+cpan/Test-Harness/t/parse.t                                    Test::Harness test
+cpan/Test-Harness/t/parser-config.t                            Test::Harness test
+cpan/Test-Harness/t/parser-subclass.t                          Test::Harness test
+cpan/Test-Harness/t/perl5lib.t                                 Test::Harness test
+cpan/Test-Harness/t/premature-bailout.t                                Test::Harness test
+cpan/Test-Harness/t/process.t                                  Test::Harness test
+cpan/Test-Harness/t/prove.t                                    Test::Harness test
+cpan/Test-Harness/t/proverc.t                                  Test::Harness test
+cpan/Test-Harness/t/proverc/emptyexec                          Test data for Test::Harness
+cpan/Test-Harness/t/proverun.t                                 Test::Harness test
 cpan/Test-Harness/t/proveversion.t                             Test::Harness test
-cpan/Test-Harness/t/regression.t                       Test::Harness test
-cpan/Test-Harness/t/results.t                          Test::Harness test
+cpan/Test-Harness/t/regression.t                               Test::Harness test
+cpan/Test-Harness/t/results.t                                  Test::Harness test
 cpan/Test-Harness/t/rulesfile.t
-cpan/Test-Harness/t/sample-tests/bailout               Test data for Test::Harness
-cpan/Test-Harness/t/sample-tests/bignum                        Test data for Test::Harness
-cpan/Test-Harness/t/sample-tests/bignum_many           Test data for Test::Harness
-cpan/Test-Harness/t/sample-tests/combined              Test data for Test::Harness
-cpan/Test-Harness/t/sample-tests/combined_compat       Test data for Test::Harness
-cpan/Test-Harness/t/sample-tests/delayed               Test data for Test::Harness
-cpan/Test-Harness/t/sample-tests/descriptive           Test data for Test::Harness
-cpan/Test-Harness/t/sample-tests/descriptive_trailing  Test data for Test::Harness
-cpan/Test-Harness/t/sample-tests/die                   Test data for Test::Harness
-cpan/Test-Harness/t/sample-tests/die_head_end          Test data for Test::Harness
-cpan/Test-Harness/t/sample-tests/die_last_minute       Test data for Test::Harness
-cpan/Test-Harness/t/sample-tests/die_unfinished                Test data for Test::Harness
-cpan/Test-Harness/t/sample-tests/duplicates            Test data for Test::Harness
-cpan/Test-Harness/t/sample-tests/echo                  Test data for Test::Harness
-cpan/Test-Harness/t/sample-tests/empty                 Test data for Test::Harness
-cpan/Test-Harness/t/sample-tests/escape_eol            Test data for Test::Harness
-cpan/Test-Harness/t/sample-tests/escape_hash           Test data for Test::Harness
-cpan/Test-Harness/t/sample-tests/head_end              Test data for Test::Harness
-cpan/Test-Harness/t/sample-tests/head_fail             Test data for Test::Harness
-cpan/Test-Harness/t/sample-tests/inc_taint             Test data for Test::Harness
-cpan/Test-Harness/t/sample-tests/junk_before_plan      Test data for Test::Harness
-cpan/Test-Harness/t/sample-tests/lone_not_bug          Test data for Test::Harness
-cpan/Test-Harness/t/sample-tests/no_nums               Test data for Test::Harness
-cpan/Test-Harness/t/sample-tests/no_output             Test data for Test::Harness
-cpan/Test-Harness/t/sample-tests/out_err_mix           Test data for Test::Harness
-cpan/Test-Harness/t/sample-tests/out_of_order          Test data for Test::Harness
-cpan/Test-Harness/t/sample-tests/schwern               Test data for Test::Harness
-cpan/Test-Harness/t/sample-tests/schwern-todo-quiet    Test data for Test::Harness
-cpan/Test-Harness/t/sample-tests/segfault              Test data for Test::Harness
-cpan/Test-Harness/t/sample-tests/sequence_misparse     Test data for Test::Harness
-cpan/Test-Harness/t/sample-tests/shbang_misparse       Test data for Test::Harness
-cpan/Test-Harness/t/sample-tests/simple                        Test data for Test::Harness
-cpan/Test-Harness/t/sample-tests/simple_fail           Test data for Test::Harness
-cpan/Test-Harness/t/sample-tests/simple_yaml           Test data for Test::Harness
-cpan/Test-Harness/t/sample-tests/simple_yaml_missing_version13         Test data for Test::Harness
-cpan/Test-Harness/t/sample-tests/skip                  Test data for Test::Harness
-cpan/Test-Harness/t/sample-tests/skip_nomsg            Test data for Test::Harness
-cpan/Test-Harness/t/sample-tests/skipall               Test data for Test::Harness
-cpan/Test-Harness/t/sample-tests/skipall_nomsg         Test data for Test::Harness
-cpan/Test-Harness/t/sample-tests/skipall_v13           Test data for Test::Harness
-cpan/Test-Harness/t/sample-tests/space_after_plan      Test data for Test::Harness
+cpan/Test-Harness/t/sample-tests/bailout                       Test data for Test::Harness
+cpan/Test-Harness/t/sample-tests/bignum                                Test data for Test::Harness
+cpan/Test-Harness/t/sample-tests/bignum_many                   Test data for Test::Harness
+cpan/Test-Harness/t/sample-tests/combined                      Test data for Test::Harness
+cpan/Test-Harness/t/sample-tests/combined_compat               Test data for Test::Harness
+cpan/Test-Harness/t/sample-tests/delayed                       Test data for Test::Harness
+cpan/Test-Harness/t/sample-tests/descriptive                   Test data for Test::Harness
+cpan/Test-Harness/t/sample-tests/descriptive_trailing          Test data for Test::Harness
+cpan/Test-Harness/t/sample-tests/die                           Test data for Test::Harness
+cpan/Test-Harness/t/sample-tests/die_head_end                  Test data for Test::Harness
+cpan/Test-Harness/t/sample-tests/die_last_minute               Test data for Test::Harness
+cpan/Test-Harness/t/sample-tests/die_unfinished                        Test data for Test::Harness
+cpan/Test-Harness/t/sample-tests/duplicates                    Test data for Test::Harness
+cpan/Test-Harness/t/sample-tests/echo                          Test data for Test::Harness
+cpan/Test-Harness/t/sample-tests/empty                         Test data for Test::Harness
+cpan/Test-Harness/t/sample-tests/escape_eol                    Test data for Test::Harness
+cpan/Test-Harness/t/sample-tests/escape_hash                   Test data for Test::Harness
+cpan/Test-Harness/t/sample-tests/head_end                      Test data for Test::Harness
+cpan/Test-Harness/t/sample-tests/head_fail                     Test data for Test::Harness
+cpan/Test-Harness/t/sample-tests/inc_taint                     Test data for Test::Harness
+cpan/Test-Harness/t/sample-tests/junk_before_plan              Test data for Test::Harness
+cpan/Test-Harness/t/sample-tests/lone_not_bug                  Test data for Test::Harness
+cpan/Test-Harness/t/sample-tests/no_nums                       Test data for Test::Harness
+cpan/Test-Harness/t/sample-tests/no_output                     Test data for Test::Harness
+cpan/Test-Harness/t/sample-tests/out_err_mix                   Test data for Test::Harness
+cpan/Test-Harness/t/sample-tests/out_of_order                  Test data for Test::Harness
+cpan/Test-Harness/t/sample-tests/schwern                       Test data for Test::Harness
+cpan/Test-Harness/t/sample-tests/schwern-todo-quiet            Test data for Test::Harness
+cpan/Test-Harness/t/sample-tests/segfault                      Test data for Test::Harness
+cpan/Test-Harness/t/sample-tests/sequence_misparse             Test data for Test::Harness
+cpan/Test-Harness/t/sample-tests/shbang_misparse               Test data for Test::Harness
+cpan/Test-Harness/t/sample-tests/simple                                Test data for Test::Harness
+cpan/Test-Harness/t/sample-tests/simple_fail                   Test data for Test::Harness
+cpan/Test-Harness/t/sample-tests/simple_yaml                   Test data for Test::Harness
+cpan/Test-Harness/t/sample-tests/simple_yaml_missing_version13 Test data for Test::Harness
+cpan/Test-Harness/t/sample-tests/skip                          Test data for Test::Harness
+cpan/Test-Harness/t/sample-tests/skip_nomsg                    Test data for Test::Harness
+cpan/Test-Harness/t/sample-tests/skipall                       Test data for Test::Harness
+cpan/Test-Harness/t/sample-tests/skipall_nomsg                 Test data for Test::Harness
+cpan/Test-Harness/t/sample-tests/skipall_v13                   Test data for Test::Harness
+cpan/Test-Harness/t/sample-tests/space_after_plan              Test data for Test::Harness
 cpan/Test-Harness/t/sample-tests/space_after_plan_v13
-cpan/Test-Harness/t/sample-tests/stdout_stderr         Test data for Test::Harness
-cpan/Test-Harness/t/sample-tests/strict                        Test data for Test::Harness
-cpan/Test-Harness/t/sample-tests/switches              Test data for Test::Harness
-cpan/Test-Harness/t/sample-tests/taint                 Test data for Test::Harness
-cpan/Test-Harness/t/sample-tests/taint_warn            Test data for Test::Harness
-cpan/Test-Harness/t/sample-tests/todo                  Test data for Test::Harness
-cpan/Test-Harness/t/sample-tests/todo_inline           Test data for Test::Harness
-cpan/Test-Harness/t/sample-tests/todo_misparse         Test data for Test::Harness
-cpan/Test-Harness/t/sample-tests/too_many              Test data for Test::Harness
-cpan/Test-Harness/t/sample-tests/version_good          Test data for Test::Harness
-cpan/Test-Harness/t/sample-tests/version_late          Test data for Test::Harness
-cpan/Test-Harness/t/sample-tests/version_old           Test data for Test::Harness
-cpan/Test-Harness/t/sample-tests/vms_nit               Test data for Test::Harness
-cpan/Test-Harness/t/sample-tests/with_comments         Test data for Test::Harness
-cpan/Test-Harness/t/sample-tests/yaml_late_plan                Test data for Test::Harness
-cpan/Test-Harness/t/sample-tests/zero_valid            Test data for Test::Harness
-cpan/Test-Harness/t/scheduler.t                                Test::Harness test
-cpan/Test-Harness/t/source.t                           Test::Harness test
+cpan/Test-Harness/t/sample-tests/stdout_stderr                 Test data for Test::Harness
+cpan/Test-Harness/t/sample-tests/strict                                Test data for Test::Harness
+cpan/Test-Harness/t/sample-tests/switches                      Test data for Test::Harness
+cpan/Test-Harness/t/sample-tests/taint                         Test data for Test::Harness
+cpan/Test-Harness/t/sample-tests/taint_warn                    Test data for Test::Harness
+cpan/Test-Harness/t/sample-tests/todo                          Test data for Test::Harness
+cpan/Test-Harness/t/sample-tests/todo_inline                   Test data for Test::Harness
+cpan/Test-Harness/t/sample-tests/todo_misparse                 Test data for Test::Harness
+cpan/Test-Harness/t/sample-tests/too_many                      Test data for Test::Harness
+cpan/Test-Harness/t/sample-tests/version_good                  Test data for Test::Harness
+cpan/Test-Harness/t/sample-tests/version_late                  Test data for Test::Harness
+cpan/Test-Harness/t/sample-tests/version_old                   Test data for Test::Harness
+cpan/Test-Harness/t/sample-tests/vms_nit                       Test data for Test::Harness
+cpan/Test-Harness/t/sample-tests/with_comments                 Test data for Test::Harness
+cpan/Test-Harness/t/sample-tests/yaml_late_plan                        Test data for Test::Harness
+cpan/Test-Harness/t/sample-tests/zero_valid                    Test data for Test::Harness
+cpan/Test-Harness/t/scheduler.t                                        Test::Harness test
+cpan/Test-Harness/t/source.t                                   Test::Harness test
 cpan/Test-Harness/t/source_handler.t                           Test::Harness test
-cpan/Test-Harness/t/source_tests/harness               Test data for Test::Harness
-cpan/Test-Harness/t/source_tests/harness_badtap                Test data for Test::Harness
-cpan/Test-Harness/t/source_tests/harness_complain      Test data for Test::Harness
-cpan/Test-Harness/t/source_tests/harness_directives    Test data for Test::Harness
-cpan/Test-Harness/t/source_tests/harness_failure       Test data for Test::Harness
-cpan/Test-Harness/t/source_tests/psql.bat                              Test::Harness test
-cpan/Test-Harness/t/source_tests/source                        Test data for Test::Harness
-cpan/Test-Harness/t/source_tests/source.1                              Test::Harness test
-cpan/Test-Harness/t/source_tests/source.bat                            Test::Harness test
-cpan/Test-Harness/t/source_tests/source.pl                             Test::Harness test
-cpan/Test-Harness/t/source_tests/source.sh                             Test::Harness test
-cpan/Test-Harness/t/source_tests/source.t                              Test::Harness test
-cpan/Test-Harness/t/source_tests/source.tap                            Test::Harness test
-cpan/Test-Harness/t/source_tests/source_args.sh                                Test::Harness test
+cpan/Test-Harness/t/source_tests/harness                       Test data for Test::Harness
+cpan/Test-Harness/t/source_tests/harness_badtap                        Test data for Test::Harness
+cpan/Test-Harness/t/source_tests/harness_complain              Test data for Test::Harness
+cpan/Test-Harness/t/source_tests/harness_directives            Test data for Test::Harness
+cpan/Test-Harness/t/source_tests/harness_failure               Test data for Test::Harness
+cpan/Test-Harness/t/source_tests/psql.bat                      Test::Harness test
+cpan/Test-Harness/t/source_tests/source                                Test data for Test::Harness
+cpan/Test-Harness/t/source_tests/source.1                      Test::Harness test
+cpan/Test-Harness/t/source_tests/source.bat                    Test::Harness test
+cpan/Test-Harness/t/source_tests/source.pl                     Test::Harness test
+cpan/Test-Harness/t/source_tests/source.sh                     Test::Harness test
+cpan/Test-Harness/t/source_tests/source.t                      Test::Harness test
+cpan/Test-Harness/t/source_tests/source.tap                    Test::Harness test
+cpan/Test-Harness/t/source_tests/source_args.sh                        Test::Harness test
 cpan/Test-Harness/t/source_tests/test.tap
-cpan/Test-Harness/t/spool.t                            Test::Harness test
-cpan/Test-Harness/t/state.t                            Test::Harness test
-cpan/Test-Harness/t/state_results.t                    Test::Harness test
-cpan/Test-Harness/t/streams.t                          Test::Harness test
-cpan/Test-Harness/t/subclass_tests/non_perl_source     Test data for Test::Harness
-cpan/Test-Harness/t/subclass_tests/perl_source         Test data for Test::Harness
-cpan/Test-Harness/t/taint.t                            Test::Harness test
-cpan/Test-Harness/t/testargs.t                         Test::Harness test
-cpan/Test-Harness/t/unicode.t                          Test::Harness test
-cpan/Test-Harness/t/yamlish.t                          Test::Harness test
-cpan/Test-Harness/t/yamlish-output.t                   Test::Harness test
-cpan/Test-Harness/t/yamlish-writer.t                   Test::Harness test
-cpan/Test-Simple/lib/ok.pm
-cpan/Test-Simple/lib/Test/Builder.pm
-cpan/Test-Simple/lib/Test/Builder/Formatter.pm
-cpan/Test-Simple/lib/Test/Builder/IO/Scalar.pm
-cpan/Test-Simple/lib/Test/Builder/Module.pm
-cpan/Test-Simple/lib/Test/Builder/Tester.pm
-cpan/Test-Simple/lib/Test/Builder/Tester/Color.pm
-cpan/Test-Simple/lib/Test/Builder/TodoDiag.pm
-cpan/Test-Simple/lib/Test/More.pm
-cpan/Test-Simple/lib/Test/Simple.pm
-cpan/Test-Simple/lib/Test/Tester.pm
-cpan/Test-Simple/lib/Test/Tester/Capture.pm
-cpan/Test-Simple/lib/Test/Tester/CaptureRunner.pm
-cpan/Test-Simple/lib/Test/Tester/Delegate.pm
-cpan/Test-Simple/lib/Test/Tutorial.pod
-cpan/Test-Simple/lib/Test/use/ok.pm
-cpan/Test-Simple/lib/Test2.pm
-cpan/Test-Simple/lib/Test2/API.pm
-cpan/Test-Simple/lib/Test2/API/Breakage.pm
-cpan/Test-Simple/lib/Test2/API/Context.pm
-cpan/Test-Simple/lib/Test2/API/Instance.pm
-cpan/Test-Simple/lib/Test2/API/InterceptResult.pm
-cpan/Test-Simple/lib/Test2/API/InterceptResult/Event.pm
-cpan/Test-Simple/lib/Test2/API/InterceptResult/Facet.pm
-cpan/Test-Simple/lib/Test2/API/InterceptResult/Hub.pm
-cpan/Test-Simple/lib/Test2/API/InterceptResult/Squasher.pm
-cpan/Test-Simple/lib/Test2/API/Stack.pm
-cpan/Test-Simple/lib/Test2/Event.pm
-cpan/Test-Simple/lib/Test2/Event/Bail.pm
-cpan/Test-Simple/lib/Test2/Event/Diag.pm
-cpan/Test-Simple/lib/Test2/Event/Encoding.pm
-cpan/Test-Simple/lib/Test2/Event/Exception.pm
-cpan/Test-Simple/lib/Test2/Event/Fail.pm
-cpan/Test-Simple/lib/Test2/Event/Generic.pm
-cpan/Test-Simple/lib/Test2/Event/Note.pm
-cpan/Test-Simple/lib/Test2/Event/Ok.pm
-cpan/Test-Simple/lib/Test2/Event/Pass.pm
-cpan/Test-Simple/lib/Test2/Event/Plan.pm
-cpan/Test-Simple/lib/Test2/Event/Skip.pm
-cpan/Test-Simple/lib/Test2/Event/Subtest.pm
-cpan/Test-Simple/lib/Test2/Event/TAP/Version.pm
-cpan/Test-Simple/lib/Test2/Event/V2.pm
-cpan/Test-Simple/lib/Test2/Event/Waiting.pm
-cpan/Test-Simple/lib/Test2/EventFacet.pm
-cpan/Test-Simple/lib/Test2/EventFacet/About.pm
-cpan/Test-Simple/lib/Test2/EventFacet/Amnesty.pm
-cpan/Test-Simple/lib/Test2/EventFacet/Assert.pm
-cpan/Test-Simple/lib/Test2/EventFacet/Control.pm
-cpan/Test-Simple/lib/Test2/EventFacet/Error.pm
-cpan/Test-Simple/lib/Test2/EventFacet/Hub.pm
-cpan/Test-Simple/lib/Test2/EventFacet/Info.pm
-cpan/Test-Simple/lib/Test2/EventFacet/Info/Table.pm
-cpan/Test-Simple/lib/Test2/EventFacet/Meta.pm
-cpan/Test-Simple/lib/Test2/EventFacet/Parent.pm
-cpan/Test-Simple/lib/Test2/EventFacet/Plan.pm
-cpan/Test-Simple/lib/Test2/EventFacet/Render.pm
-cpan/Test-Simple/lib/Test2/EventFacet/Trace.pm
-cpan/Test-Simple/lib/Test2/Formatter.pm
-cpan/Test-Simple/lib/Test2/Formatter/TAP.pm
-cpan/Test-Simple/lib/Test2/Hub.pm
-cpan/Test-Simple/lib/Test2/Hub/Interceptor.pm
-cpan/Test-Simple/lib/Test2/Hub/Interceptor/Terminator.pm
-cpan/Test-Simple/lib/Test2/Hub/Subtest.pm
-cpan/Test-Simple/lib/Test2/IPC.pm
-cpan/Test-Simple/lib/Test2/IPC/Driver.pm
-cpan/Test-Simple/lib/Test2/IPC/Driver/Files.pm
-cpan/Test-Simple/lib/Test2/Tools/Tiny.pm
-cpan/Test-Simple/lib/Test2/Transition.pod
-cpan/Test-Simple/lib/Test2/Util.pm
-cpan/Test-Simple/lib/Test2/Util/ExternalMeta.pm
-cpan/Test-Simple/lib/Test2/Util/Facets2Legacy.pm
-cpan/Test-Simple/lib/Test2/Util/HashBase.pm
-cpan/Test-Simple/lib/Test2/Util/Trace.pm
-cpan/Test-Simple/t/HashBase.t
-cpan/Test-Simple/t/Legacy/00test_harness_check.t
-cpan/Test-Simple/t/Legacy/01-basic.t
-cpan/Test-Simple/t/Legacy/478-cmp_ok_hash.t
-cpan/Test-Simple/t/Legacy/auto.t
-cpan/Test-Simple/t/Legacy/bad_plan.t
-cpan/Test-Simple/t/Legacy/bail_out.t
-cpan/Test-Simple/t/Legacy/BEGIN_require_ok.t
-cpan/Test-Simple/t/Legacy/BEGIN_use_ok.t
-cpan/Test-Simple/t/Legacy/buffer.t
-cpan/Test-Simple/t/Legacy/Bugs/600.t
-cpan/Test-Simple/t/Legacy/Bugs/629.t
-cpan/Test-Simple/t/Legacy/Builder/Builder.t
-cpan/Test-Simple/t/Legacy/Builder/carp.t
-cpan/Test-Simple/t/Legacy/Builder/create.t
-cpan/Test-Simple/t/Legacy/Builder/current_test.t
-cpan/Test-Simple/t/Legacy/Builder/current_test_without_plan.t
-cpan/Test-Simple/t/Legacy/Builder/details.t
-cpan/Test-Simple/t/Legacy/Builder/done_testing.t
-cpan/Test-Simple/t/Legacy/Builder/done_testing_double.t
-cpan/Test-Simple/t/Legacy/Builder/done_testing_plan_mismatch.t
-cpan/Test-Simple/t/Legacy/Builder/done_testing_with_no_plan.t
-cpan/Test-Simple/t/Legacy/Builder/done_testing_with_number.t
-cpan/Test-Simple/t/Legacy/Builder/done_testing_with_plan.t
-cpan/Test-Simple/t/Legacy/Builder/fork_with_new_stdout.t
-cpan/Test-Simple/t/Legacy/Builder/has_plan.t
-cpan/Test-Simple/t/Legacy/Builder/has_plan2.t
-cpan/Test-Simple/t/Legacy/Builder/is_fh.t
-cpan/Test-Simple/t/Legacy/Builder/is_passing.t
-cpan/Test-Simple/t/Legacy/Builder/maybe_regex.t
-cpan/Test-Simple/t/Legacy/Builder/no_diag.t
-cpan/Test-Simple/t/Legacy/Builder/no_ending.t
-cpan/Test-Simple/t/Legacy/Builder/no_header.t
-cpan/Test-Simple/t/Legacy/Builder/no_plan_at_all.t
-cpan/Test-Simple/t/Legacy/Builder/ok_obj.t
-cpan/Test-Simple/t/Legacy/Builder/output.t
-cpan/Test-Simple/t/Legacy/Builder/reset.t
-cpan/Test-Simple/t/Legacy/Builder/reset_outputs.t
-cpan/Test-Simple/t/Legacy/Builder/try.t
-cpan/Test-Simple/t/Legacy/c_flag.t
-cpan/Test-Simple/t/Legacy/capture.t
-cpan/Test-Simple/t/Legacy/check_tests.t
-cpan/Test-Simple/t/Legacy/circular_data.t
-cpan/Test-Simple/t/Legacy/cmp_ok.t
-cpan/Test-Simple/t/Legacy/depth.t
-cpan/Test-Simple/t/Legacy/diag.t
-cpan/Test-Simple/t/Legacy/died.t
-cpan/Test-Simple/t/Legacy/dont_overwrite_die_handler.t
-cpan/Test-Simple/t/Legacy/eq_set.t
-cpan/Test-Simple/t/Legacy/exit.t
-cpan/Test-Simple/t/Legacy/explain.t
-cpan/Test-Simple/t/Legacy/explain_err_vars.t
-cpan/Test-Simple/t/Legacy/extra.t
-cpan/Test-Simple/t/Legacy/extra_one.t
-cpan/Test-Simple/t/Legacy/fail.t
-cpan/Test-Simple/t/Legacy/fail-like.t
-cpan/Test-Simple/t/Legacy/fail-more.t
-cpan/Test-Simple/t/Legacy/fail_one.t
-cpan/Test-Simple/t/Legacy/filehandles.t
-cpan/Test-Simple/t/Legacy/fork.t
-cpan/Test-Simple/t/Legacy/harness_active.t
-cpan/Test-Simple/t/Legacy/import.t
-cpan/Test-Simple/t/Legacy/is_deeply_dne_bug.t
-cpan/Test-Simple/t/Legacy/is_deeply_fail.t
-cpan/Test-Simple/t/Legacy/is_deeply_with_threads.t
-cpan/Test-Simple/t/Legacy/missing.t
-cpan/Test-Simple/t/Legacy/More.t
-cpan/Test-Simple/t/Legacy/new_ok.t
-cpan/Test-Simple/t/Legacy/no_log_results.t
-cpan/Test-Simple/t/Legacy/no_plan.t
-cpan/Test-Simple/t/Legacy/no_tests.t
-cpan/Test-Simple/t/Legacy/note.t
-cpan/Test-Simple/t/Legacy/overload.t
-cpan/Test-Simple/t/Legacy/overload_threads.t
-cpan/Test-Simple/t/Legacy/plan.t
-cpan/Test-Simple/t/Legacy/plan_bad.t
-cpan/Test-Simple/t/Legacy/plan_is_noplan.t
-cpan/Test-Simple/t/Legacy/plan_no_plan.t
-cpan/Test-Simple/t/Legacy/plan_shouldnt_import.t
-cpan/Test-Simple/t/Legacy/plan_skip_all.t
-cpan/Test-Simple/t/Legacy/Regression/637.t
-cpan/Test-Simple/t/Legacy/Regression/683_thread_todo.t
-cpan/Test-Simple/t/Legacy/Regression/6_cmp_ok.t
-cpan/Test-Simple/t/Legacy/Regression/736_use_ok.t
-cpan/Test-Simple/t/Legacy/Regression/789-read-only.t
-cpan/Test-Simple/t/Legacy/Regression/870-experimental-warnings.t
-cpan/Test-Simple/t/Legacy/Regression/is_capture.t
-cpan/Test-Simple/t/Legacy/require_ok.t
-cpan/Test-Simple/t/Legacy/run_test.t
-cpan/Test-Simple/t/Legacy/simple.t
-cpan/Test-Simple/t/Legacy/Simple/load.t
-cpan/Test-Simple/t/Legacy/skip.t
-cpan/Test-Simple/t/Legacy/skipall.t
-cpan/Test-Simple/t/Legacy/strays.t
-cpan/Test-Simple/t/Legacy/subtest/args.t
-cpan/Test-Simple/t/Legacy/subtest/bail_out.t
-cpan/Test-Simple/t/Legacy/subtest/basic.t
-cpan/Test-Simple/t/Legacy/subtest/callback.t
-cpan/Test-Simple/t/Legacy/subtest/die.t
-cpan/Test-Simple/t/Legacy/subtest/do.t
-cpan/Test-Simple/t/Legacy/subtest/events.t
-cpan/Test-Simple/t/Legacy/subtest/for_do_t.test
-cpan/Test-Simple/t/Legacy/subtest/fork.t
-cpan/Test-Simple/t/Legacy/subtest/implicit_done.t
-cpan/Test-Simple/t/Legacy/subtest/line_numbers.t
-cpan/Test-Simple/t/Legacy/subtest/plan.t
-cpan/Test-Simple/t/Legacy/subtest/predicate.t
-cpan/Test-Simple/t/Legacy/subtest/singleton.t
-cpan/Test-Simple/t/Legacy/subtest/threads.t
-cpan/Test-Simple/t/Legacy/subtest/todo.t
-cpan/Test-Simple/t/Legacy/subtest/wstat.t
-cpan/Test-Simple/t/Legacy/tbm_doesnt_set_exported_to.t
-cpan/Test-Simple/t/Legacy/Test2/Subtest.t
-cpan/Test-Simple/t/Legacy/Tester/tbt_01basic.t
-cpan/Test-Simple/t/Legacy/Tester/tbt_02fhrestore.t
-cpan/Test-Simple/t/Legacy/Tester/tbt_03die.t
-cpan/Test-Simple/t/Legacy/Tester/tbt_04line_num.t
-cpan/Test-Simple/t/Legacy/Tester/tbt_05faildiag.t
-cpan/Test-Simple/t/Legacy/Tester/tbt_06errormess.t
-cpan/Test-Simple/t/Legacy/Tester/tbt_07args.t
-cpan/Test-Simple/t/Legacy/Tester/tbt_08subtest.t
-cpan/Test-Simple/t/Legacy/Tester/tbt_09do.t
-cpan/Test-Simple/t/Legacy/Tester/tbt_09do_script.pl
-cpan/Test-Simple/t/Legacy/thread_taint.t
-cpan/Test-Simple/t/Legacy/threads.t
-cpan/Test-Simple/t/Legacy/todo.t
-cpan/Test-Simple/t/Legacy/undef.t
-cpan/Test-Simple/t/Legacy/use_ok.t
-cpan/Test-Simple/t/Legacy/useing.t
-cpan/Test-Simple/t/Legacy/utf8.t
-cpan/Test-Simple/t/Legacy/versions.t
-cpan/Test-Simple/t/Legacy_And_Test2/builder_loaded_late.t
-cpan/Test-Simple/t/Legacy_And_Test2/diag_event_on_ok.t
-cpan/Test-Simple/t/Legacy_And_Test2/hidden_warnings.t
-cpan/Test-Simple/t/Legacy_And_Test2/preload_diag_note.t
-cpan/Test-Simple/t/Legacy_And_Test2/thread_init_warning.t
-cpan/Test-Simple/t/lib/Dev/Null.pm
-cpan/Test-Simple/t/lib/Dummy.pm
-cpan/Test-Simple/t/lib/MyOverload.pm
-cpan/Test-Simple/t/lib/MyTest.pm
-cpan/Test-Simple/t/lib/NoExporter.pm
-cpan/Test-Simple/t/lib/SigDie.pm
-cpan/Test-Simple/t/lib/SkipAll.pm
-cpan/Test-Simple/t/lib/SmallTest.pm
-cpan/Test-Simple/t/lib/Test/Builder/NoOutput.pm
-cpan/Test-Simple/t/lib/Test/Simple/Catch.pm
-cpan/Test-Simple/t/lib/Test/Simple/sample_tests/death.plx
-cpan/Test-Simple/t/lib/Test/Simple/sample_tests/death_in_eval.plx
-cpan/Test-Simple/t/lib/Test/Simple/sample_tests/death_with_handler.plx
-cpan/Test-Simple/t/lib/Test/Simple/sample_tests/exit.plx
-cpan/Test-Simple/t/lib/Test/Simple/sample_tests/extras.plx
-cpan/Test-Simple/t/lib/Test/Simple/sample_tests/five_fail.plx
-cpan/Test-Simple/t/lib/Test/Simple/sample_tests/last_minute_death.plx
-cpan/Test-Simple/t/lib/Test/Simple/sample_tests/missing_done_testing.plx
-cpan/Test-Simple/t/lib/Test/Simple/sample_tests/one_fail.plx
-cpan/Test-Simple/t/lib/Test/Simple/sample_tests/one_fail_without_plan.plx
-cpan/Test-Simple/t/lib/Test/Simple/sample_tests/pre_plan_death.plx
-cpan/Test-Simple/t/lib/Test/Simple/sample_tests/require.plx
-cpan/Test-Simple/t/lib/Test/Simple/sample_tests/success.plx
-cpan/Test-Simple/t/lib/Test/Simple/sample_tests/too_few.plx
-cpan/Test-Simple/t/lib/Test/Simple/sample_tests/too_few_fail.plx
-cpan/Test-Simple/t/lib/Test/Simple/sample_tests/two_fail.plx
-cpan/Test-Simple/t/lib/TieOut.pm
-cpan/Test-Simple/t/regression/642_persistent_end.t
-cpan/Test-Simple/t/regression/662-tbt-no-plan.t
-cpan/Test-Simple/t/regression/684-nested_todo_diag.t
-cpan/Test-Simple/t/regression/694_note_diag_return_values.t
-cpan/Test-Simple/t/regression/696-intercept_skip_all.t
-cpan/Test-Simple/t/regression/721-nested-streamed-subtest.t
-cpan/Test-Simple/t/regression/757-reset_in_subtest.t
-cpan/Test-Simple/t/regression/812-todo.t
-cpan/Test-Simple/t/regression/817-subtest-todo.t
-cpan/Test-Simple/t/regression/862-intercept_tb_todo.t
-cpan/Test-Simple/t/regression/buffered_subtest_plan_buffered.t
-cpan/Test-Simple/t/regression/builder_does_not_init.t
-cpan/Test-Simple/t/regression/errors_facet.t
-cpan/Test-Simple/t/regression/fork_first.t
-cpan/Test-Simple/t/regression/inherit_trace.t
-cpan/Test-Simple/t/regression/no_name_in_subtest.t
-cpan/Test-Simple/t/regression/skip_reason_object_ipc.t
-cpan/Test-Simple/t/regression/todo_and_facets.t
-cpan/Test-Simple/t/Test2/acceptance/try_it_done_testing.t
-cpan/Test-Simple/t/Test2/acceptance/try_it_fork.t
-cpan/Test-Simple/t/Test2/acceptance/try_it_no_plan.t
-cpan/Test-Simple/t/Test2/acceptance/try_it_plan.t
-cpan/Test-Simple/t/Test2/acceptance/try_it_skip.t
-cpan/Test-Simple/t/Test2/acceptance/try_it_threads.t
-cpan/Test-Simple/t/Test2/acceptance/try_it_todo.t
-cpan/Test-Simple/t/Test2/behavior/disable_ipc_a.t
-cpan/Test-Simple/t/Test2/behavior/disable_ipc_b.t
-cpan/Test-Simple/t/Test2/behavior/disable_ipc_c.t
-cpan/Test-Simple/t/Test2/behavior/disable_ipc_d.t
-cpan/Test-Simple/t/Test2/behavior/err_var.t
-cpan/Test-Simple/t/Test2/behavior/Formatter.t
-cpan/Test-Simple/t/Test2/behavior/init_croak.t
-cpan/Test-Simple/t/Test2/behavior/intercept.t
-cpan/Test-Simple/t/Test2/behavior/ipc_wait_timeout.t
-cpan/Test-Simple/t/Test2/behavior/nested_context_exception.t
-cpan/Test-Simple/t/Test2/behavior/no_load_api.t
-cpan/Test-Simple/t/Test2/behavior/run_subtest_inherit.t
-cpan/Test-Simple/t/Test2/behavior/special_names.t
-cpan/Test-Simple/t/Test2/behavior/subtest_bailout.t
-cpan/Test-Simple/t/Test2/behavior/Subtest_buffer_formatter.t
-cpan/Test-Simple/t/Test2/behavior/Subtest_callback.t
-cpan/Test-Simple/t/Test2/behavior/Subtest_events.t
-cpan/Test-Simple/t/Test2/behavior/Subtest_plan.t
-cpan/Test-Simple/t/Test2/behavior/Subtest_todo.t
-cpan/Test-Simple/t/Test2/behavior/Taint.t
-cpan/Test-Simple/t/Test2/behavior/trace_signature.t
-cpan/Test-Simple/t/Test2/behavior/uuid.t
-cpan/Test-Simple/t/Test2/legacy/TAP.t
-cpan/Test-Simple/t/Test2/modules/API.t
-cpan/Test-Simple/t/Test2/modules/API/Breakage.t
-cpan/Test-Simple/t/Test2/modules/API/Context.t
-cpan/Test-Simple/t/Test2/modules/API/Instance.t
-cpan/Test-Simple/t/Test2/modules/API/InterceptResult.t
-cpan/Test-Simple/t/Test2/modules/API/InterceptResult/Event.t
-cpan/Test-Simple/t/Test2/modules/API/InterceptResult/Squasher.t
-cpan/Test-Simple/t/Test2/modules/API/Stack.t
-cpan/Test-Simple/t/Test2/modules/Event.t
-cpan/Test-Simple/t/Test2/modules/Event/Bail.t
-cpan/Test-Simple/t/Test2/modules/Event/Diag.t
-cpan/Test-Simple/t/Test2/modules/Event/Encoding.t
-cpan/Test-Simple/t/Test2/modules/Event/Exception.t
-cpan/Test-Simple/t/Test2/modules/Event/Fail.t
-cpan/Test-Simple/t/Test2/modules/Event/Generic.t
-cpan/Test-Simple/t/Test2/modules/Event/Note.t
-cpan/Test-Simple/t/Test2/modules/Event/Ok.t
-cpan/Test-Simple/t/Test2/modules/Event/Pass.t
-cpan/Test-Simple/t/Test2/modules/Event/Plan.t
-cpan/Test-Simple/t/Test2/modules/Event/Skip.t
-cpan/Test-Simple/t/Test2/modules/Event/Subtest.t
-cpan/Test-Simple/t/Test2/modules/Event/TAP/Version.t
-cpan/Test-Simple/t/Test2/modules/Event/V2.t
-cpan/Test-Simple/t/Test2/modules/Event/Waiting.t
-cpan/Test-Simple/t/Test2/modules/EventFacet.t
-cpan/Test-Simple/t/Test2/modules/EventFacet/About.t
-cpan/Test-Simple/t/Test2/modules/EventFacet/Amnesty.t
-cpan/Test-Simple/t/Test2/modules/EventFacet/Assert.t
-cpan/Test-Simple/t/Test2/modules/EventFacet/Control.t
-cpan/Test-Simple/t/Test2/modules/EventFacet/Error.t
-cpan/Test-Simple/t/Test2/modules/EventFacet/Info.t
-cpan/Test-Simple/t/Test2/modules/EventFacet/Meta.t
-cpan/Test-Simple/t/Test2/modules/EventFacet/Parent.t
-cpan/Test-Simple/t/Test2/modules/EventFacet/Plan.t
-cpan/Test-Simple/t/Test2/modules/EventFacet/Trace.t
-cpan/Test-Simple/t/Test2/modules/Formatter/TAP.t
-cpan/Test-Simple/t/Test2/modules/Hub.t
-cpan/Test-Simple/t/Test2/modules/Hub/Interceptor.t
-cpan/Test-Simple/t/Test2/modules/Hub/Interceptor/Terminator.t
-cpan/Test-Simple/t/Test2/modules/Hub/Subtest.t
-cpan/Test-Simple/t/Test2/modules/IPC.t
-cpan/Test-Simple/t/Test2/modules/IPC/Driver.t
-cpan/Test-Simple/t/Test2/modules/IPC/Driver/Files.t
-cpan/Test-Simple/t/Test2/modules/Tools/Tiny.t
-cpan/Test-Simple/t/Test2/modules/Util.t
-cpan/Test-Simple/t/Test2/modules/Util/ExternalMeta.t
-cpan/Test-Simple/t/Test2/modules/Util/Facets2Legacy.t
-cpan/Test-Simple/t/Test2/modules/Util/Trace.t
-cpan/Test-Simple/t/Test2/regression/693_ipc_ordering.t
-cpan/Test-Simple/t/Test2/regression/746-forking-subtest.t
-cpan/Test-Simple/t/Test2/regression/gh_16.t
-cpan/Test-Simple/t/Test2/regression/ipc_files_abort_exit.t
+cpan/Test-Harness/t/spool.t                                    Test::Harness test
+cpan/Test-Harness/t/state.t                                    Test::Harness test
+cpan/Test-Harness/t/state_results.t                            Test::Harness test
+cpan/Test-Harness/t/streams.t                                  Test::Harness test
+cpan/Test-Harness/t/subclass_tests/non_perl_source             Test data for Test::Harness
+cpan/Test-Harness/t/subclass_tests/perl_source                 Test data for Test::Harness
+cpan/Test-Harness/t/taint.t                                    Test::Harness test
+cpan/Test-Harness/t/testargs.t                                 Test::Harness test
+cpan/Test-Harness/t/unicode.t                                  Test::Harness test
+cpan/Test-Harness/t/yamlish.t                                  Test::Harness test
+cpan/Test-Harness/t/yamlish-output.t                           Test::Harness test
+cpan/Test-Harness/t/yamlish-writer.t                           Test::Harness test
+cpan/Test-Simple/lib/ok.pm                                                     Module related to Test::Simple
+cpan/Test-Simple/lib/Test/Builder.pm                                           Module related to Test::Simple
+cpan/Test-Simple/lib/Test/Builder/Formatter.pm                                 Module related to Test::Simple
+cpan/Test-Simple/lib/Test/Builder/IO/Scalar.pm                                 Module related to Test::Simple
+cpan/Test-Simple/lib/Test/Builder/Module.pm                                    Module related to Test::Simple
+cpan/Test-Simple/lib/Test/Builder/Tester.pm                                    Module related to Test::Simple
+cpan/Test-Simple/lib/Test/Builder/Tester/Color.pm                              Module related to Test::Simple
+cpan/Test-Simple/lib/Test/Builder/TodoDiag.pm                                  Module related to Test::Simple
+cpan/Test-Simple/lib/Test/More.pm                                              Module related to Test::Simple
+cpan/Test-Simple/lib/Test/Simple.pm                                            Module related to Test::Simple
+cpan/Test-Simple/lib/Test/Tester.pm                                            Module related to Test::Simple
+cpan/Test-Simple/lib/Test/Tester/Capture.pm                                    Module related to Test::Simple
+cpan/Test-Simple/lib/Test/Tester/CaptureRunner.pm                              Module related to Test::Simple
+cpan/Test-Simple/lib/Test/Tester/Delegate.pm                                   Module related to Test::Simple
+cpan/Test-Simple/lib/Test/Tutorial.pod                                         Test::Simple
+cpan/Test-Simple/lib/Test/use/ok.pm                                            Module related to Test::Simple
+cpan/Test-Simple/lib/Test2.pm                                                  Module related to Test::Simple
+cpan/Test-Simple/lib/Test2/API.pm                                              Module related to Test::Simple
+cpan/Test-Simple/lib/Test2/API/Breakage.pm                                     Module related to Test::Simple
+cpan/Test-Simple/lib/Test2/API/Context.pm                                      Module related to Test::Simple
+cpan/Test-Simple/lib/Test2/API/Instance.pm                                     Module related to Test::Simple
+cpan/Test-Simple/lib/Test2/API/InterceptResult.pm                              Module related to Test::Simple
+cpan/Test-Simple/lib/Test2/API/InterceptResult/Event.pm                                Module related to Test::Simple
+cpan/Test-Simple/lib/Test2/API/InterceptResult/Facet.pm                                Module related to Test::Simple
+cpan/Test-Simple/lib/Test2/API/InterceptResult/Hub.pm                          Module related to Test::Simple
+cpan/Test-Simple/lib/Test2/API/InterceptResult/Squasher.pm                     Module related to Test::Simple
+cpan/Test-Simple/lib/Test2/API/Stack.pm                                                Module related to Test::Simple
+cpan/Test-Simple/lib/Test2/Event.pm                                            Module related to Test::Simple
+cpan/Test-Simple/lib/Test2/Event/Bail.pm                                       Module related to Test::Simple
+cpan/Test-Simple/lib/Test2/Event/Diag.pm                                       Module related to Test::Simple
+cpan/Test-Simple/lib/Test2/Event/Encoding.pm                                   Module related to Test::Simple
+cpan/Test-Simple/lib/Test2/Event/Exception.pm                                  Module related to Test::Simple
+cpan/Test-Simple/lib/Test2/Event/Fail.pm                                       Module related to Test::Simple
+cpan/Test-Simple/lib/Test2/Event/Generic.pm                                    Module related to Test::Simple
+cpan/Test-Simple/lib/Test2/Event/Note.pm                                       Module related to Test::Simple
+cpan/Test-Simple/lib/Test2/Event/Ok.pm                                         Module related to Test::Simple
+cpan/Test-Simple/lib/Test2/Event/Pass.pm                                       Module related to Test::Simple
+cpan/Test-Simple/lib/Test2/Event/Plan.pm                                       Module related to Test::Simple
+cpan/Test-Simple/lib/Test2/Event/Skip.pm                                       Module related to Test::Simple
+cpan/Test-Simple/lib/Test2/Event/Subtest.pm                                    Module related to Test::Simple
+cpan/Test-Simple/lib/Test2/Event/TAP/Version.pm                                        Module related to Test::Simple
+cpan/Test-Simple/lib/Test2/Event/V2.pm                                         Module related to Test::Simple
+cpan/Test-Simple/lib/Test2/Event/Waiting.pm                                    Module related to Test::Simple
+cpan/Test-Simple/lib/Test2/EventFacet.pm                                       Module related to Test::Simple
+cpan/Test-Simple/lib/Test2/EventFacet/About.pm                                 Module related to Test::Simple
+cpan/Test-Simple/lib/Test2/EventFacet/Amnesty.pm                               Module related to Test::Simple
+cpan/Test-Simple/lib/Test2/EventFacet/Assert.pm                                        Module related to Test::Simple
+cpan/Test-Simple/lib/Test2/EventFacet/Control.pm                               Module related to Test::Simple
+cpan/Test-Simple/lib/Test2/EventFacet/Error.pm                                 Module related to Test::Simple
+cpan/Test-Simple/lib/Test2/EventFacet/Hub.pm                                   Module related to Test::Simple
+cpan/Test-Simple/lib/Test2/EventFacet/Info.pm                                  Module related to Test::Simple
+cpan/Test-Simple/lib/Test2/EventFacet/Info/Table.pm                            Module related to Test::Simple
+cpan/Test-Simple/lib/Test2/EventFacet/Meta.pm                                  Module related to Test::Simple
+cpan/Test-Simple/lib/Test2/EventFacet/Parent.pm                                        Module related to Test::Simple
+cpan/Test-Simple/lib/Test2/EventFacet/Plan.pm                                  Module related to Test::Simple
+cpan/Test-Simple/lib/Test2/EventFacet/Render.pm                                        Module related to Test::Simple
+cpan/Test-Simple/lib/Test2/EventFacet/Trace.pm                                 Module related to Test::Simple
+cpan/Test-Simple/lib/Test2/Formatter.pm                                                Module related to Test::Simple
+cpan/Test-Simple/lib/Test2/Formatter/TAP.pm                                    Module related to Test::Simple
+cpan/Test-Simple/lib/Test2/Hub.pm                                              Module related to Test::Simple
+cpan/Test-Simple/lib/Test2/Hub/Interceptor.pm                                  Module related to Test::Simple
+cpan/Test-Simple/lib/Test2/Hub/Interceptor/Terminator.pm                       Module related to Test::Simple
+cpan/Test-Simple/lib/Test2/Hub/Subtest.pm                                      Module related to Test::Simple
+cpan/Test-Simple/lib/Test2/IPC.pm                                              Module related to Test::Simple
+cpan/Test-Simple/lib/Test2/IPC/Driver.pm                                       Module related to Test::Simple
+cpan/Test-Simple/lib/Test2/IPC/Driver/Files.pm                                 Module related to Test::Simple
+cpan/Test-Simple/lib/Test2/Tools/Tiny.pm                                       Module related to Test::Simple
+cpan/Test-Simple/lib/Test2/Transition.pod                                      Test::Simple
+cpan/Test-Simple/lib/Test2/Util.pm                                             Module related to Test::Simple
+cpan/Test-Simple/lib/Test2/Util/ExternalMeta.pm                                        Module related to Test::Simple
+cpan/Test-Simple/lib/Test2/Util/Facets2Legacy.pm                               Module related to Test::Simple
+cpan/Test-Simple/lib/Test2/Util/HashBase.pm                                    Module related to Test::Simple
+cpan/Test-Simple/lib/Test2/Util/Trace.pm                                       Module related to Test::Simple
+cpan/Test-Simple/t/HashBase.t                                                  Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/00test_harness_check.t                               Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/01-basic.t                                           Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/478-cmp_ok_hash.t                                    Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/auto.t                                               Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/bad_plan.t                                           Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/bail_out.t                                           Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/BEGIN_require_ok.t                                   Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/BEGIN_use_ok.t                                       Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/buffer.t                                             Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/Bugs/600.t                                           Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/Bugs/629.t                                           Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/Builder/Builder.t                                    Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/Builder/carp.t                                       Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/Builder/create.t                                     Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/Builder/current_test.t                               Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/Builder/current_test_without_plan.t                  Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/Builder/details.t                                    Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/Builder/done_testing.t                               Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/Builder/done_testing_double.t                                Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/Builder/done_testing_plan_mismatch.t                 Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/Builder/done_testing_with_no_plan.t                  Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/Builder/done_testing_with_number.t                   Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/Builder/done_testing_with_plan.t                     Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/Builder/fork_with_new_stdout.t                       Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/Builder/has_plan.t                                   Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/Builder/has_plan2.t                                  Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/Builder/is_fh.t                                      Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/Builder/is_passing.t                                 Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/Builder/maybe_regex.t                                        Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/Builder/no_diag.t                                    Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/Builder/no_ending.t                                  Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/Builder/no_header.t                                  Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/Builder/no_plan_at_all.t                             Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/Builder/ok_obj.t                                     Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/Builder/output.t                                     Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/Builder/reset.t                                      Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/Builder/reset_outputs.t                              Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/Builder/try.t                                                Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/c_flag.t                                             Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/capture.t                                            Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/check_tests.t                                                Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/circular_data.t                                      Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/cmp_ok.t                                             Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/depth.t                                              Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/diag.t                                               Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/died.t                                               Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/dont_overwrite_die_handler.t                         Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/eq_set.t                                             Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/exit.t                                               Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/explain.t                                            Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/explain_err_vars.t                                   Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/extra.t                                              Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/extra_one.t                                          Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/fail.t                                               Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/fail-like.t                                          Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/fail-more.t                                          Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/fail_one.t                                           Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/filehandles.t                                                Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/fork.t                                               Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/harness_active.t                                     Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/import.t                                             Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/is_deeply_dne_bug.t                                  Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/is_deeply_fail.t                                     Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/is_deeply_with_threads.t                             Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/missing.t                                            Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/More.t                                               Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/new_ok.t                                             Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/no_log_results.t                                     Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/no_plan.t                                            Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/no_tests.t                                           Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/note.t                                               Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/overload.t                                           Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/overload_threads.t                                   Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/plan.t                                               Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/plan_bad.t                                           Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/plan_is_noplan.t                                     Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/plan_no_plan.t                                       Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/plan_shouldnt_import.t                               Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/plan_skip_all.t                                      Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/Regression/637.t                                     Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/Regression/683_thread_todo.t                         Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/Regression/6_cmp_ok.t                                        Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/Regression/736_use_ok.t                              Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/Regression/789-read-only.t                           Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/Regression/870-experimental-warnings.t               Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/Regression/is_capture.t                              Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/require_ok.t                                         Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/run_test.t                                           Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/simple.t                                             Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/Simple/load.t                                                Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/skip.t                                               Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/skipall.t                                            Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/strays.t                                             Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/subtest/args.t                                       Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/subtest/bail_out.t                                   Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/subtest/basic.t                                      Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/subtest/callback.t                                   Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/subtest/die.t                                                Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/subtest/do.t                                         Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/subtest/events.t                                     Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/subtest/for_do_t.test                                        Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/subtest/fork.t                                       Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/subtest/implicit_done.t                              Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/subtest/line_numbers.t                               Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/subtest/plan.t                                       Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/subtest/predicate.t                                  Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/subtest/singleton.t                                  Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/subtest/threads.t                                    Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/subtest/todo.t                                       Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/subtest/wstat.t                                      Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/tbm_doesnt_set_exported_to.t                         Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/Test2/Subtest.t                                      Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/Tester/tbt_01basic.t                                 Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/Tester/tbt_02fhrestore.t                             Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/Tester/tbt_03die.t                                   Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/Tester/tbt_04line_num.t                              Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/Tester/tbt_05faildiag.t                              Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/Tester/tbt_06errormess.t                             Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/Tester/tbt_07args.t                                  Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/Tester/tbt_08subtest.t                               Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/Tester/tbt_09do.t                                    Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/Tester/tbt_09do_script.pl                            Script related to Test::Simple
+cpan/Test-Simple/t/Legacy/thread_taint.t                                       Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/threads.t                                            Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/todo.t                                               Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/undef.t                                              Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/use_ok.t                                             Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/useing.t                                             Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/utf8.t                                               Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy/versions.t                                           Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy_And_Test2/builder_loaded_late.t                      Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy_And_Test2/diag_event_on_ok.t                         Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy_And_Test2/hidden_warnings.t                          Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy_And_Test2/preload_diag_note.t                                Test file related to Test::Simple
+cpan/Test-Simple/t/Legacy_And_Test2/thread_init_warning.t                      Test file related to Test::Simple
+cpan/Test-Simple/t/lib/Dev/Null.pm                                             Module related to Test::Simple
+cpan/Test-Simple/t/lib/Dummy.pm                                                        Module related to Test::Simple
+cpan/Test-Simple/t/lib/MyOverload.pm                                           Module related to Test::Simple
+cpan/Test-Simple/t/lib/MyTest.pm                                               Module related to Test::Simple
+cpan/Test-Simple/t/lib/NoExporter.pm                                           Module related to Test::Simple
+cpan/Test-Simple/t/lib/SigDie.pm                                               Module related to Test::Simple
+cpan/Test-Simple/t/lib/SkipAll.pm                                              Module related to Test::Simple
+cpan/Test-Simple/t/lib/SmallTest.pm                                            Module related to Test::Simple
+cpan/Test-Simple/t/lib/Test/Builder/NoOutput.pm                                        Module related to Test::Simple
+cpan/Test-Simple/t/lib/Test/Simple/Catch.pm                                    Module related to Test::Simple
+cpan/Test-Simple/t/lib/Test/Simple/sample_tests/death.plx                      Script related to Test::Simple
+cpan/Test-Simple/t/lib/Test/Simple/sample_tests/death_in_eval.plx              Script related to Test::Simple
+cpan/Test-Simple/t/lib/Test/Simple/sample_tests/death_with_handler.plx         Script related to Test::Simple
+cpan/Test-Simple/t/lib/Test/Simple/sample_tests/exit.plx                       Script related to Test::Simple
+cpan/Test-Simple/t/lib/Test/Simple/sample_tests/extras.plx                     Script related to Test::Simple
+cpan/Test-Simple/t/lib/Test/Simple/sample_tests/five_fail.plx                  Script related to Test::Simple
+cpan/Test-Simple/t/lib/Test/Simple/sample_tests/last_minute_death.plx          Script related to Test::Simple
+cpan/Test-Simple/t/lib/Test/Simple/sample_tests/missing_done_testing.plx       Script related to Test::Simple
+cpan/Test-Simple/t/lib/Test/Simple/sample_tests/one_fail.plx                   Script related to Test::Simple
+cpan/Test-Simple/t/lib/Test/Simple/sample_tests/one_fail_without_plan.plx      Script related to Test::Simple
+cpan/Test-Simple/t/lib/Test/Simple/sample_tests/pre_plan_death.plx             Script related to Test::Simple
+cpan/Test-Simple/t/lib/Test/Simple/sample_tests/require.plx                    Script related to Test::Simple
+cpan/Test-Simple/t/lib/Test/Simple/sample_tests/success.plx                    Script related to Test::Simple
+cpan/Test-Simple/t/lib/Test/Simple/sample_tests/too_few.plx                    Script related to Test::Simple
+cpan/Test-Simple/t/lib/Test/Simple/sample_tests/too_few_fail.plx               Script related to Test::Simple
+cpan/Test-Simple/t/lib/Test/Simple/sample_tests/two_fail.plx                   Script related to Test::Simple
+cpan/Test-Simple/t/lib/TieOut.pm                                               Module related to Test::Simple
+cpan/Test-Simple/t/regression/642_persistent_end.t                             Test file related to Test::Simple
+cpan/Test-Simple/t/regression/662-tbt-no-plan.t                                        Test file related to Test::Simple
+cpan/Test-Simple/t/regression/684-nested_todo_diag.t                           Test file related to Test::Simple
+cpan/Test-Simple/t/regression/694_note_diag_return_values.t                    Test file related to Test::Simple
+cpan/Test-Simple/t/regression/696-intercept_skip_all.t                         Test file related to Test::Simple
+cpan/Test-Simple/t/regression/721-nested-streamed-subtest.t                    Test file related to Test::Simple
+cpan/Test-Simple/t/regression/757-reset_in_subtest.t                           Test file related to Test::Simple
+cpan/Test-Simple/t/regression/812-todo.t                                       Test file related to Test::Simple
+cpan/Test-Simple/t/regression/817-subtest-todo.t                               Test file related to Test::Simple
+cpan/Test-Simple/t/regression/862-intercept_tb_todo.t                          Test file related to Test::Simple
+cpan/Test-Simple/t/regression/buffered_subtest_plan_buffered.t                 Test file related to Test::Simple
+cpan/Test-Simple/t/regression/builder_does_not_init.t                          Test file related to Test::Simple
+cpan/Test-Simple/t/regression/errors_facet.t                                   Test file related to Test::Simple
+cpan/Test-Simple/t/regression/fork_first.t                                     Test file related to Test::Simple
+cpan/Test-Simple/t/regression/inherit_trace.t                                  Test file related to Test::Simple
+cpan/Test-Simple/t/regression/no_name_in_subtest.t                             Test file related to Test::Simple
+cpan/Test-Simple/t/regression/skip_reason_object_ipc.t                         Test file related to Test::Simple
+cpan/Test-Simple/t/regression/todo_and_facets.t                                        Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/acceptance/try_it_done_testing.t                      Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/acceptance/try_it_fork.t                              Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/acceptance/try_it_no_plan.t                           Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/acceptance/try_it_plan.t                              Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/acceptance/try_it_skip.t                              Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/acceptance/try_it_threads.t                           Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/acceptance/try_it_todo.t                              Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/behavior/disable_ipc_a.t                              Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/behavior/disable_ipc_b.t                              Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/behavior/disable_ipc_c.t                              Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/behavior/disable_ipc_d.t                              Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/behavior/err_var.t                                    Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/behavior/Formatter.t                                  Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/behavior/init_croak.t                                 Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/behavior/intercept.t                                  Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/behavior/ipc_wait_timeout.t                           Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/behavior/nested_context_exception.t                   Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/behavior/no_load_api.t                                        Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/behavior/run_subtest_inherit.t                                Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/behavior/special_names.t                              Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/behavior/subtest_bailout.t                            Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/behavior/Subtest_buffer_formatter.t                   Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/behavior/Subtest_callback.t                           Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/behavior/Subtest_events.t                             Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/behavior/Subtest_plan.t                               Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/behavior/Subtest_todo.t                               Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/behavior/Taint.t                                      Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/behavior/trace_signature.t                            Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/behavior/uuid.t                                       Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/legacy/TAP.t                                          Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/modules/API.t                                         Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/modules/API/Breakage.t                                        Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/modules/API/Context.t                                 Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/modules/API/Instance.t                                        Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/modules/API/InterceptResult.t                         Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/modules/API/InterceptResult/Event.t                   Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/modules/API/InterceptResult/Squasher.t                        Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/modules/API/Stack.t                                   Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/modules/Event.t                                       Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/modules/Event/Bail.t                                  Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/modules/Event/Diag.t                                  Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/modules/Event/Encoding.t                              Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/modules/Event/Exception.t                             Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/modules/Event/Fail.t                                  Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/modules/Event/Generic.t                               Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/modules/Event/Note.t                                  Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/modules/Event/Ok.t                                    Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/modules/Event/Pass.t                                  Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/modules/Event/Plan.t                                  Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/modules/Event/Skip.t                                  Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/modules/Event/Subtest.t                               Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/modules/Event/TAP/Version.t                           Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/modules/Event/V2.t                                    Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/modules/Event/Waiting.t                               Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/modules/EventFacet.t                                  Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/modules/EventFacet/About.t                            Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/modules/EventFacet/Amnesty.t                          Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/modules/EventFacet/Assert.t                           Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/modules/EventFacet/Control.t                          Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/modules/EventFacet/Error.t                            Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/modules/EventFacet/Info.t                             Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/modules/EventFacet/Meta.t                             Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/modules/EventFacet/Parent.t                           Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/modules/EventFacet/Plan.t                             Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/modules/EventFacet/Trace.t                            Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/modules/Formatter/TAP.t                               Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/modules/Hub.t                                         Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/modules/Hub/Interceptor.t                             Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/modules/Hub/Interceptor/Terminator.t                  Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/modules/Hub/Subtest.t                                 Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/modules/IPC.t                                         Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/modules/IPC/Driver.t                                  Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/modules/IPC/Driver/Files.t                            Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/modules/Tools/Tiny.t                                  Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/modules/Util.t                                                Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/modules/Util/ExternalMeta.t                           Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/modules/Util/Facets2Legacy.t                          Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/modules/Util/Trace.t                                  Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/regression/693_ipc_ordering.t                         Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/regression/746-forking-subtest.t                      Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/regression/gh_16.t                                    Test file related to Test::Simple
+cpan/Test-Simple/t/Test2/regression/ipc_files_abort_exit.t                     Test file related to Test::Simple
 cpan/Text-Balanced/lib/Text/Balanced.pm        Text::Balanced
 cpan/Text-Balanced/t/01_compile.t      See if Text::Balanced works
 cpan/Text-Balanced/t/02_extbrk.t       See if Text::Balanced works
@@ -2720,25 +2892,25 @@ cpan/Text-Tabs/t/undef.t
 cpan/Text-Tabs/t/wrap.t                        See if Text::Wrap::wrap works
 cpan/Text-Tabs/t/Wrap-JLB.t            See if Text::Wrap::wrap works
 cpan/Text-Tabs/t/wrap_separator2.t     See if Text::Wrap::wrap works
-cpan/Tie-RefHash/lib/Tie/RefHash.pm            Base class for tied hashes with references as keys
-cpan/Tie-RefHash/t/rebless.t   Test for Tie::RefHash with rebless
-cpan/Tie-RefHash/t/refhash.t   Test for Tie::RefHash and Tie::RefHash::Nestable
-cpan/Tie-RefHash/t/storable.t  Test for Tie::RefHash with storable
-cpan/Tie-RefHash/t/threaded.t  Test for Tie::RefHash with threads
+cpan/Tie-RefHash/lib/Tie/RefHash.pm    Base class for tied hashes with references as keys
+cpan/Tie-RefHash/t/rebless.t           Test for Tie::RefHash with rebless
+cpan/Tie-RefHash/t/refhash.t           Test for Tie::RefHash and Tie::RefHash::Nestable
+cpan/Tie-RefHash/t/storable.t          Test for Tie::RefHash with storable
+cpan/Tie-RefHash/t/threaded.t          Test for Tie::RefHash with threads
 cpan/Time-Local/lib/Time/Local.pm      Reverse translation of localtime, gmtime
 cpan/Time-Local/t/Local.t              See if Time::Local works
-cpan/Time-Piece/Piece.pm       Time::Piece extension
-cpan/Time-Piece/Piece.xs       Time::Piece extension
-cpan/Time-Piece/Seconds.pm     Time::Piece extension
-cpan/Time-Piece/t/01base.t     Test for Time::Piece
-cpan/Time-Piece/t/02core.t     Test for Time::Piece
+cpan/Time-Piece/Piece.pm                       Time::Piece extension
+cpan/Time-Piece/Piece.xs                       Time::Piece extension
+cpan/Time-Piece/Seconds.pm                     Time::Piece extension
+cpan/Time-Piece/t/01base.t                     Test for Time::Piece
+cpan/Time-Piece/t/02core.t                     Test for Time::Piece
 cpan/Time-Piece/t/02core_dst.t
-cpan/Time-Piece/t/03compare.t  Test for Time::Piece
-cpan/Time-Piece/t/04mjd.t      Test for Time::Piece
-cpan/Time-Piece/t/05overload.t Test for Time::Piece
+cpan/Time-Piece/t/03compare.t                  Test for Time::Piece
+cpan/Time-Piece/t/04mjd.t                      Test for Time::Piece
+cpan/Time-Piece/t/05overload.t                 Test for Time::Piece
 cpan/Time-Piece/t/06large.t
-cpan/Time-Piece/t/06subclass.t Test for Time::Piece
-cpan/Time-Piece/t/07arith.t    Test for Time::Piece
+cpan/Time-Piece/t/06subclass.t                 Test for Time::Piece
+cpan/Time-Piece/t/07arith.t                    Test for Time::Piece
 cpan/Time-Piece/t/08truncate.t
 cpan/Time-Piece/t/09locales.t
 cpan/Time-Piece/t/10overload.t
@@ -2747,112 +2919,112 @@ cpan/Time-Piece/t/lib/Time/Piece/Twin.pm
 cpan/Unicode-Collate/Collate.pm                        Unicode::Collate
 cpan/Unicode-Collate/Collate.xs                        Unicode::Collate
 cpan/Unicode-Collate/Collate/allkeys.txt       Unicode::Collate
-cpan/Unicode-Collate/Collate/CJK/Big5.pm                       Unicode::Collate
-cpan/Unicode-Collate/Collate/CJK/GB2312.pm                     Unicode::Collate
-cpan/Unicode-Collate/Collate/CJK/JISX0208.pm                   Unicode::Collate
-cpan/Unicode-Collate/Collate/CJK/Korean.pm                     Unicode::Collate
-cpan/Unicode-Collate/Collate/CJK/Pinyin.pm                     Unicode::Collate
-cpan/Unicode-Collate/Collate/CJK/Stroke.pm                     Unicode::Collate
+cpan/Unicode-Collate/Collate/CJK/Big5.pm       Unicode::Collate
+cpan/Unicode-Collate/Collate/CJK/GB2312.pm     Unicode::Collate
+cpan/Unicode-Collate/Collate/CJK/JISX0208.pm   Unicode::Collate
+cpan/Unicode-Collate/Collate/CJK/Korean.pm     Unicode::Collate
+cpan/Unicode-Collate/Collate/CJK/Pinyin.pm     Unicode::Collate
+cpan/Unicode-Collate/Collate/CJK/Stroke.pm     Unicode::Collate
 cpan/Unicode-Collate/Collate/CJK/Zhuyin.pm
 cpan/Unicode-Collate/Collate/keys.txt          Unicode::Collate
-cpan/Unicode-Collate/Collate/Locale.pm                 Unicode::Collate
-cpan/Unicode-Collate/Collate/Locale/af.pl                      Unicode::Collate
-cpan/Unicode-Collate/Collate/Locale/ar.pl                      Unicode::Collate
+cpan/Unicode-Collate/Collate/Locale.pm         Unicode::Collate
+cpan/Unicode-Collate/Collate/Locale/af.pl      Unicode::Collate
+cpan/Unicode-Collate/Collate/Locale/ar.pl      Unicode::Collate
 cpan/Unicode-Collate/Collate/Locale/as.pl      Unicode::Collate
-cpan/Unicode-Collate/Collate/Locale/az.pl                      Unicode::Collate
+cpan/Unicode-Collate/Collate/Locale/az.pl      Unicode::Collate
 cpan/Unicode-Collate/Collate/Locale/be.pl      Unicode::Collate
-cpan/Unicode-Collate/Collate/Locale/bn.pl              Unicode::Collate
-cpan/Unicode-Collate/Collate/Locale/ca.pl                      Unicode::Collate
-cpan/Unicode-Collate/Collate/Locale/cs.pl                      Unicode::Collate
+cpan/Unicode-Collate/Collate/Locale/bn.pl      Unicode::Collate
+cpan/Unicode-Collate/Collate/Locale/ca.pl      Unicode::Collate
+cpan/Unicode-Collate/Collate/Locale/cs.pl      Unicode::Collate
 cpan/Unicode-Collate/Collate/Locale/cu.pl
-cpan/Unicode-Collate/Collate/Locale/cy.pl                      Unicode::Collate
-cpan/Unicode-Collate/Collate/Locale/da.pl                      Unicode::Collate
-cpan/Unicode-Collate/Collate/Locale/de_at_ph.pl                        Unicode::Collate
-cpan/Unicode-Collate/Collate/Locale/de_phone.pl                        Unicode::Collate
+cpan/Unicode-Collate/Collate/Locale/cy.pl      Unicode::Collate
+cpan/Unicode-Collate/Collate/Locale/da.pl      Unicode::Collate
+cpan/Unicode-Collate/Collate/Locale/de_at_ph.pl        Unicode::Collate
+cpan/Unicode-Collate/Collate/Locale/de_phone.pl        Unicode::Collate
 cpan/Unicode-Collate/Collate/Locale/dsb.pl
 cpan/Unicode-Collate/Collate/Locale/ee.pl
-cpan/Unicode-Collate/Collate/Locale/eo.pl                      Unicode::Collate
-cpan/Unicode-Collate/Collate/Locale/es.pl                      Unicode::Collate
-cpan/Unicode-Collate/Collate/Locale/es_trad.pl                 Unicode::Collate
-cpan/Unicode-Collate/Collate/Locale/et.pl                      Unicode::Collate
+cpan/Unicode-Collate/Collate/Locale/eo.pl      Unicode::Collate
+cpan/Unicode-Collate/Collate/Locale/es.pl      Unicode::Collate
+cpan/Unicode-Collate/Collate/Locale/es_trad.pl Unicode::Collate
+cpan/Unicode-Collate/Collate/Locale/et.pl      Unicode::Collate
 cpan/Unicode-Collate/Collate/Locale/fa.pl      Unicode::Collate
-cpan/Unicode-Collate/Collate/Locale/fi.pl                      Unicode::Collate
+cpan/Unicode-Collate/Collate/Locale/fi.pl      Unicode::Collate
 cpan/Unicode-Collate/Collate/Locale/fi_phone.pl        Unicode::Collate
-cpan/Unicode-Collate/Collate/Locale/fil.pl                     Unicode::Collate
-cpan/Unicode-Collate/Collate/Locale/fo.pl                      Unicode::Collate
-cpan/Unicode-Collate/Collate/Locale/fr_ca.pl                   Unicode::Collate
+cpan/Unicode-Collate/Collate/Locale/fil.pl     Unicode::Collate
+cpan/Unicode-Collate/Collate/Locale/fo.pl      Unicode::Collate
+cpan/Unicode-Collate/Collate/Locale/fr_ca.pl   Unicode::Collate
 cpan/Unicode-Collate/Collate/Locale/gu.pl      Unicode::Collate
-cpan/Unicode-Collate/Collate/Locale/ha.pl                      Unicode::Collate
-cpan/Unicode-Collate/Collate/Locale/haw.pl                     Unicode::Collate
+cpan/Unicode-Collate/Collate/Locale/ha.pl      Unicode::Collate
+cpan/Unicode-Collate/Collate/Locale/haw.pl     Unicode::Collate
 cpan/Unicode-Collate/Collate/Locale/he.pl
 cpan/Unicode-Collate/Collate/Locale/hi.pl      Unicode::Collate
-cpan/Unicode-Collate/Collate/Locale/hr.pl                      Unicode::Collate
-cpan/Unicode-Collate/Collate/Locale/hu.pl                      Unicode::Collate
-cpan/Unicode-Collate/Collate/Locale/hy.pl                      Unicode::Collate
-cpan/Unicode-Collate/Collate/Locale/ig.pl                      Unicode::Collate
-cpan/Unicode-Collate/Collate/Locale/is.pl                      Unicode::Collate
-cpan/Unicode-Collate/Collate/Locale/ja.pl                      Unicode::Collate
-cpan/Unicode-Collate/Collate/Locale/kk.pl                      Unicode::Collate
-cpan/Unicode-Collate/Collate/Locale/kl.pl                      Unicode::Collate
+cpan/Unicode-Collate/Collate/Locale/hr.pl      Unicode::Collate
+cpan/Unicode-Collate/Collate/Locale/hu.pl      Unicode::Collate
+cpan/Unicode-Collate/Collate/Locale/hy.pl      Unicode::Collate
+cpan/Unicode-Collate/Collate/Locale/ig.pl      Unicode::Collate
+cpan/Unicode-Collate/Collate/Locale/is.pl      Unicode::Collate
+cpan/Unicode-Collate/Collate/Locale/ja.pl      Unicode::Collate
+cpan/Unicode-Collate/Collate/Locale/kk.pl      Unicode::Collate
+cpan/Unicode-Collate/Collate/Locale/kl.pl      Unicode::Collate
 cpan/Unicode-Collate/Collate/Locale/kn.pl      Unicode::Collate
-cpan/Unicode-Collate/Collate/Locale/ko.pl                      Unicode::Collate
+cpan/Unicode-Collate/Collate/Locale/ko.pl      Unicode::Collate
 cpan/Unicode-Collate/Collate/Locale/kok.pl     Unicode::Collate
 cpan/Unicode-Collate/Collate/Locale/lkt.pl
 cpan/Unicode-Collate/Collate/Locale/ln.pl      Unicode::Collate
-cpan/Unicode-Collate/Collate/Locale/lt.pl                      Unicode::Collate
-cpan/Unicode-Collate/Collate/Locale/lv.pl                      Unicode::Collate
+cpan/Unicode-Collate/Collate/Locale/lt.pl      Unicode::Collate
+cpan/Unicode-Collate/Collate/Locale/lv.pl      Unicode::Collate
 cpan/Unicode-Collate/Collate/Locale/mk.pl      Unicode::Collate
 cpan/Unicode-Collate/Collate/Locale/ml.pl      Unicode::Collate
 cpan/Unicode-Collate/Collate/Locale/mr.pl      Unicode::Collate
-cpan/Unicode-Collate/Collate/Locale/mt.pl                      Unicode::Collate
-cpan/Unicode-Collate/Collate/Locale/nb.pl                      Unicode::Collate
-cpan/Unicode-Collate/Collate/Locale/nn.pl                      Unicode::Collate
-cpan/Unicode-Collate/Collate/Locale/nso.pl                     Unicode::Collate
-cpan/Unicode-Collate/Collate/Locale/om.pl                      Unicode::Collate
+cpan/Unicode-Collate/Collate/Locale/mt.pl      Unicode::Collate
+cpan/Unicode-Collate/Collate/Locale/nb.pl      Unicode::Collate
+cpan/Unicode-Collate/Collate/Locale/nn.pl      Unicode::Collate
+cpan/Unicode-Collate/Collate/Locale/nso.pl     Unicode::Collate
+cpan/Unicode-Collate/Collate/Locale/om.pl      Unicode::Collate
 cpan/Unicode-Collate/Collate/Locale/or.pl      Unicode::Collate
 cpan/Unicode-Collate/Collate/Locale/pa.pl      Unicode::Collate
-cpan/Unicode-Collate/Collate/Locale/pl.pl                      Unicode::Collate
-cpan/Unicode-Collate/Collate/Locale/ro.pl                      Unicode::Collate
-cpan/Unicode-Collate/Collate/Locale/sa.pl              Unicode::Collate
-cpan/Unicode-Collate/Collate/Locale/se.pl                      Unicode::Collate
+cpan/Unicode-Collate/Collate/Locale/pl.pl      Unicode::Collate
+cpan/Unicode-Collate/Collate/Locale/ro.pl      Unicode::Collate
+cpan/Unicode-Collate/Collate/Locale/sa.pl      Unicode::Collate
+cpan/Unicode-Collate/Collate/Locale/se.pl      Unicode::Collate
 cpan/Unicode-Collate/Collate/Locale/si.pl      Unicode::Collate
 cpan/Unicode-Collate/Collate/Locale/si_dict.pl Unicode::Collate
-cpan/Unicode-Collate/Collate/Locale/sk.pl                      Unicode::Collate
-cpan/Unicode-Collate/Collate/Locale/sl.pl                      Unicode::Collate
-cpan/Unicode-Collate/Collate/Locale/sq.pl                      Unicode::Collate
+cpan/Unicode-Collate/Collate/Locale/sk.pl      Unicode::Collate
+cpan/Unicode-Collate/Collate/Locale/sl.pl      Unicode::Collate
+cpan/Unicode-Collate/Collate/Locale/sq.pl      Unicode::Collate
 cpan/Unicode-Collate/Collate/Locale/sr.pl      Unicode::Collate
-cpan/Unicode-Collate/Collate/Locale/sv.pl                      Unicode::Collate
+cpan/Unicode-Collate/Collate/Locale/sv.pl      Unicode::Collate
 cpan/Unicode-Collate/Collate/Locale/sv_refo.pl Unicode::Collate
 cpan/Unicode-Collate/Collate/Locale/ta.pl      Unicode::Collate
 cpan/Unicode-Collate/Collate/Locale/te.pl      Unicode::Collate
 cpan/Unicode-Collate/Collate/Locale/th.pl      Unicode::Collate
-cpan/Unicode-Collate/Collate/Locale/tn.pl                      Unicode::Collate
-cpan/Unicode-Collate/Collate/Locale/to.pl                      Unicode::Collate
-cpan/Unicode-Collate/Collate/Locale/tr.pl                      Unicode::Collate
-cpan/Unicode-Collate/Collate/Locale/ug_cyrl.pl                 Unicode::Collate
-cpan/Unicode-Collate/Collate/Locale/uk.pl                      Unicode::Collate
+cpan/Unicode-Collate/Collate/Locale/tn.pl      Unicode::Collate
+cpan/Unicode-Collate/Collate/Locale/to.pl      Unicode::Collate
+cpan/Unicode-Collate/Collate/Locale/tr.pl      Unicode::Collate
+cpan/Unicode-Collate/Collate/Locale/ug_cyrl.pl Unicode::Collate
+cpan/Unicode-Collate/Collate/Locale/uk.pl      Unicode::Collate
 cpan/Unicode-Collate/Collate/Locale/ur.pl      Unicode::Collate
-cpan/Unicode-Collate/Collate/Locale/vi.pl                      Unicode::Collate
+cpan/Unicode-Collate/Collate/Locale/vi.pl      Unicode::Collate
 cpan/Unicode-Collate/Collate/Locale/vo.pl
 cpan/Unicode-Collate/Collate/Locale/wae.pl     Unicode::Collate
-cpan/Unicode-Collate/Collate/Locale/wo.pl                      Unicode::Collate
-cpan/Unicode-Collate/Collate/Locale/yo.pl                      Unicode::Collate
-cpan/Unicode-Collate/Collate/Locale/zh.pl                      Unicode::Collate
-cpan/Unicode-Collate/Collate/Locale/zh_big5.pl                 Unicode::Collate
-cpan/Unicode-Collate/Collate/Locale/zh_gb.pl                   Unicode::Collate
-cpan/Unicode-Collate/Collate/Locale/zh_pin.pl                  Unicode::Collate
-cpan/Unicode-Collate/Collate/Locale/zh_strk.pl                 Unicode::Collate
+cpan/Unicode-Collate/Collate/Locale/wo.pl      Unicode::Collate
+cpan/Unicode-Collate/Collate/Locale/yo.pl      Unicode::Collate
+cpan/Unicode-Collate/Collate/Locale/zh.pl      Unicode::Collate
+cpan/Unicode-Collate/Collate/Locale/zh_big5.pl Unicode::Collate
+cpan/Unicode-Collate/Collate/Locale/zh_gb.pl   Unicode::Collate
+cpan/Unicode-Collate/Collate/Locale/zh_pin.pl  Unicode::Collate
+cpan/Unicode-Collate/Collate/Locale/zh_strk.pl Unicode::Collate
 cpan/Unicode-Collate/Collate/Locale/zh_zhu.pl
-cpan/Unicode-Collate/Makefile.PL                       Unicode::Collate
+cpan/Unicode-Collate/Makefile.PL               Unicode::Collate
 cpan/Unicode-Collate/mkheader                  Unicode::Collate
 cpan/Unicode-Collate/t/altern.t                        Unicode::Collate
-cpan/Unicode-Collate/t/backwds.t                       Unicode::Collate
-cpan/Unicode-Collate/t/cjk_b5.t                Unicode::Collate
-cpan/Unicode-Collate/t/cjk_gb.t                Unicode::Collate
-cpan/Unicode-Collate/t/cjk_ja.t                Unicode::Collate
-cpan/Unicode-Collate/t/cjk_ko.t                Unicode::Collate
-cpan/Unicode-Collate/t/cjk_py.t                Unicode::Collate
-cpan/Unicode-Collate/t/cjk_st.t                Unicode::Collate
+cpan/Unicode-Collate/t/backwds.t               Unicode::Collate
+cpan/Unicode-Collate/t/cjk_b5.t                        Unicode::Collate
+cpan/Unicode-Collate/t/cjk_gb.t                        Unicode::Collate
+cpan/Unicode-Collate/t/cjk_ja.t                        Unicode::Collate
+cpan/Unicode-Collate/t/cjk_ko.t                        Unicode::Collate
+cpan/Unicode-Collate/t/cjk_py.t                        Unicode::Collate
+cpan/Unicode-Collate/t/cjk_st.t                        Unicode::Collate
 cpan/Unicode-Collate/t/cjk_zy.t
 cpan/Unicode-Collate/t/cjkrange.t              Unicode::Collate
 cpan/Unicode-Collate/t/compatui.t              Unicode::Collate
@@ -2861,7 +3033,7 @@ cpan/Unicode-Collate/t/default.t          Unicode::Collate
 cpan/Unicode-Collate/t/hangtype.t              Unicode::Collate
 cpan/Unicode-Collate/t/hangul.t                        Unicode::Collate
 cpan/Unicode-Collate/t/ident.t
-cpan/Unicode-Collate/t/iglevel2.t                      Unicode::Collate
+cpan/Unicode-Collate/t/iglevel2.t              Unicode::Collate
 cpan/Unicode-Collate/t/ignor.t                 Unicode::Collate
 cpan/Unicode-Collate/t/illegal.t               Unicode::Collate
 cpan/Unicode-Collate/t/illegalp.t              Unicode::Collate
@@ -2869,12 +3041,12 @@ cpan/Unicode-Collate/t/index.t                  Unicode::Collate
 cpan/Unicode-Collate/t/khitan.t                        Unicode::Collate
 cpan/Unicode-Collate/t/loc_af.t                        Unicode::Collate
 cpan/Unicode-Collate/t/loc_ar.t                        Unicode::Collate
-cpan/Unicode-Collate/t/loc_as.t        Unicode::Collate
+cpan/Unicode-Collate/t/loc_as.t                        Unicode::Collate
 cpan/Unicode-Collate/t/loc_az.t                        Unicode::Collate
 cpan/Unicode-Collate/t/loc_be.t                        Unicode::Collate
 cpan/Unicode-Collate/t/loc_bg.t                        Unicode::Collate
-cpan/Unicode-Collate/t/loc_bn.t                Unicode::Collate
-cpan/Unicode-Collate/t/loc_bs.t        Unicode::Collate
+cpan/Unicode-Collate/t/loc_bn.t                        Unicode::Collate
+cpan/Unicode-Collate/t/loc_bs.t                        Unicode::Collate
 cpan/Unicode-Collate/t/loc_bscy.t
 cpan/Unicode-Collate/t/loc_ca.t                        Unicode::Collate
 cpan/Unicode-Collate/t/loc_cjk.t               Unicode::Collate
@@ -2882,94 +3054,94 @@ cpan/Unicode-Collate/t/loc_cjkc.t               Unicode::Collate
 cpan/Unicode-Collate/t/loc_cs.t                        Unicode::Collate
 cpan/Unicode-Collate/t/loc_cu.t
 cpan/Unicode-Collate/t/loc_cy.t                        Unicode::Collate
-cpan/Unicode-Collate/t/loc_cyrl.t                      Unicode::Collate
+cpan/Unicode-Collate/t/loc_cyrl.t              Unicode::Collate
 cpan/Unicode-Collate/t/loc_da.t                        Unicode::Collate
 cpan/Unicode-Collate/t/loc_de.t                        Unicode::Collate
-cpan/Unicode-Collate/t/loc_deat.t                      Unicode::Collate
-cpan/Unicode-Collate/t/loc_deph.t                      Unicode::Collate
+cpan/Unicode-Collate/t/loc_deat.t              Unicode::Collate
+cpan/Unicode-Collate/t/loc_deph.t              Unicode::Collate
 cpan/Unicode-Collate/t/loc_dsb.t
 cpan/Unicode-Collate/t/loc_ee.t
 cpan/Unicode-Collate/t/loc_eo.t                        Unicode::Collate
 cpan/Unicode-Collate/t/loc_es.t                        Unicode::Collate
-cpan/Unicode-Collate/t/loc_estr.t                      Unicode::Collate
+cpan/Unicode-Collate/t/loc_estr.t              Unicode::Collate
 cpan/Unicode-Collate/t/loc_et.t                        Unicode::Collate
-cpan/Unicode-Collate/t/loc_fa.t        Unicode::Collate
+cpan/Unicode-Collate/t/loc_fa.t                        Unicode::Collate
 cpan/Unicode-Collate/t/loc_fi.t                        Unicode::Collate
-cpan/Unicode-Collate/t/loc_fil.t                       Unicode::Collate
-cpan/Unicode-Collate/t/loc_fiph.t      Unicode::Collate
+cpan/Unicode-Collate/t/loc_fil.t               Unicode::Collate
+cpan/Unicode-Collate/t/loc_fiph.t              Unicode::Collate
 cpan/Unicode-Collate/t/loc_fo.t                        Unicode::Collate
 cpan/Unicode-Collate/t/loc_fr.t                        Unicode::Collate
 cpan/Unicode-Collate/t/loc_frca.t              Unicode::Collate
-cpan/Unicode-Collate/t/loc_gu.t        Unicode::Collate
+cpan/Unicode-Collate/t/loc_gu.t                        Unicode::Collate
 cpan/Unicode-Collate/t/loc_ha.t                        Unicode::Collate
-cpan/Unicode-Collate/t/loc_haw.t                       Unicode::Collate
+cpan/Unicode-Collate/t/loc_haw.t               Unicode::Collate
 cpan/Unicode-Collate/t/loc_he.t
-cpan/Unicode-Collate/t/loc_hi.t        Unicode::Collate
+cpan/Unicode-Collate/t/loc_hi.t                        Unicode::Collate
 cpan/Unicode-Collate/t/loc_hr.t                        Unicode::Collate
 cpan/Unicode-Collate/t/loc_hu.t                        Unicode::Collate
 cpan/Unicode-Collate/t/loc_hy.t                        Unicode::Collate
 cpan/Unicode-Collate/t/loc_ig.t                        Unicode::Collate
 cpan/Unicode-Collate/t/loc_is.t                        Unicode::Collate
 cpan/Unicode-Collate/t/loc_ja.t                        Unicode::Collate
-cpan/Unicode-Collate/t/loc_jait.t                      Unicode::Collate
-cpan/Unicode-Collate/t/loc_japr.t                      Unicode::Collate
+cpan/Unicode-Collate/t/loc_jait.t              Unicode::Collate
+cpan/Unicode-Collate/t/loc_japr.t              Unicode::Collate
 cpan/Unicode-Collate/t/loc_kk.t                        Unicode::Collate
 cpan/Unicode-Collate/t/loc_kl.t                        Unicode::Collate
-cpan/Unicode-Collate/t/loc_kn.t        Unicode::Collate
+cpan/Unicode-Collate/t/loc_kn.t                        Unicode::Collate
 cpan/Unicode-Collate/t/loc_ko.t                        Unicode::Collate
-cpan/Unicode-Collate/t/loc_kok.t       Unicode::Collate
+cpan/Unicode-Collate/t/loc_kok.t               Unicode::Collate
 cpan/Unicode-Collate/t/loc_lkt.t
-cpan/Unicode-Collate/t/loc_ln.t        Unicode::Collate
+cpan/Unicode-Collate/t/loc_ln.t                        Unicode::Collate
 cpan/Unicode-Collate/t/loc_lt.t                        Unicode::Collate
 cpan/Unicode-Collate/t/loc_lv.t                        Unicode::Collate
 cpan/Unicode-Collate/t/loc_mk.t                        Unicode::Collate
-cpan/Unicode-Collate/t/loc_ml.t        Unicode::Collate
+cpan/Unicode-Collate/t/loc_ml.t                        Unicode::Collate
 cpan/Unicode-Collate/t/loc_mncy.t              Unicode::Collate
-cpan/Unicode-Collate/t/loc_mr.t        Unicode::Collate
+cpan/Unicode-Collate/t/loc_mr.t                        Unicode::Collate
 cpan/Unicode-Collate/t/loc_mt.t                        Unicode::Collate
 cpan/Unicode-Collate/t/loc_nb.t                        Unicode::Collate
 cpan/Unicode-Collate/t/loc_nn.t                        Unicode::Collate
-cpan/Unicode-Collate/t/loc_nso.t                       Unicode::Collate
+cpan/Unicode-Collate/t/loc_nso.t               Unicode::Collate
 cpan/Unicode-Collate/t/loc_om.t                        Unicode::Collate
-cpan/Unicode-Collate/t/loc_or.t        Unicode::Collate
-cpan/Unicode-Collate/t/loc_pa.t        Unicode::Collate
+cpan/Unicode-Collate/t/loc_or.t                        Unicode::Collate
+cpan/Unicode-Collate/t/loc_pa.t                        Unicode::Collate
 cpan/Unicode-Collate/t/loc_pl.t                        Unicode::Collate
 cpan/Unicode-Collate/t/loc_ro.t                        Unicode::Collate
 cpan/Unicode-Collate/t/loc_ru.t                        Unicode::Collate
-cpan/Unicode-Collate/t/loc_sa.t                Unicode::Collate
+cpan/Unicode-Collate/t/loc_sa.t                        Unicode::Collate
 cpan/Unicode-Collate/t/loc_se.t                        Unicode::Collate
-cpan/Unicode-Collate/t/loc_si.t        Unicode::Collate
-cpan/Unicode-Collate/t/loc_sidt.t      Unicode::Collate
+cpan/Unicode-Collate/t/loc_si.t                        Unicode::Collate
+cpan/Unicode-Collate/t/loc_sidt.t              Unicode::Collate
 cpan/Unicode-Collate/t/loc_sk.t                        Unicode::Collate
 cpan/Unicode-Collate/t/loc_sl.t                        Unicode::Collate
 cpan/Unicode-Collate/t/loc_sq.t                        Unicode::Collate
 cpan/Unicode-Collate/t/loc_sr.t                        Unicode::Collate
-cpan/Unicode-Collate/t/loc_srla.t      Unicode::Collate
+cpan/Unicode-Collate/t/loc_srla.t              Unicode::Collate
 cpan/Unicode-Collate/t/loc_sv.t                        Unicode::Collate
-cpan/Unicode-Collate/t/loc_svrf.t      Unicode::Collate
+cpan/Unicode-Collate/t/loc_svrf.t              Unicode::Collate
 cpan/Unicode-Collate/t/loc_sw.t                        Unicode::Collate
-cpan/Unicode-Collate/t/loc_ta.t        Unicode::Collate
-cpan/Unicode-Collate/t/loc_te.t        Unicode::Collate
-cpan/Unicode-Collate/t/loc_test.t                      Unicode::Collate
-cpan/Unicode-Collate/t/loc_th.t        Unicode::Collate
+cpan/Unicode-Collate/t/loc_ta.t                        Unicode::Collate
+cpan/Unicode-Collate/t/loc_te.t                        Unicode::Collate
+cpan/Unicode-Collate/t/loc_test.t              Unicode::Collate
+cpan/Unicode-Collate/t/loc_th.t                        Unicode::Collate
 cpan/Unicode-Collate/t/loc_tn.t                        Unicode::Collate
 cpan/Unicode-Collate/t/loc_to.t                        Unicode::Collate
 cpan/Unicode-Collate/t/loc_tr.t                        Unicode::Collate
 cpan/Unicode-Collate/t/loc_ugcy.t              Unicode::Collate
 cpan/Unicode-Collate/t/loc_uk.t                        Unicode::Collate
-cpan/Unicode-Collate/t/loc_ur.t        Unicode::Collate
+cpan/Unicode-Collate/t/loc_ur.t                        Unicode::Collate
 cpan/Unicode-Collate/t/loc_vi.t                        Unicode::Collate
 cpan/Unicode-Collate/t/loc_vo.t
-cpan/Unicode-Collate/t/loc_wae.t       Unicode::Collate
+cpan/Unicode-Collate/t/loc_wae.t               Unicode::Collate
 cpan/Unicode-Collate/t/loc_wo.t                        Unicode::Collate
 cpan/Unicode-Collate/t/loc_yo.t                        Unicode::Collate
 cpan/Unicode-Collate/t/loc_zh.t                        Unicode::Collate
-cpan/Unicode-Collate/t/loc_zhb5.t                      Unicode::Collate
-cpan/Unicode-Collate/t/loc_zhgb.t                      Unicode::Collate
-cpan/Unicode-Collate/t/loc_zhpy.t                      Unicode::Collate
-cpan/Unicode-Collate/t/loc_zhst.t                      Unicode::Collate
+cpan/Unicode-Collate/t/loc_zhb5.t              Unicode::Collate
+cpan/Unicode-Collate/t/loc_zhgb.t              Unicode::Collate
+cpan/Unicode-Collate/t/loc_zhpy.t              Unicode::Collate
+cpan/Unicode-Collate/t/loc_zhst.t              Unicode::Collate
 cpan/Unicode-Collate/t/loc_zhzy.t
-cpan/Unicode-Collate/t/nonchar.t                       Unicode::Collate
+cpan/Unicode-Collate/t/nonchar.t               Unicode::Collate
 cpan/Unicode-Collate/t/normal.t                        Unicode::Collate
 cpan/Unicode-Collate/t/notable.t
 cpan/Unicode-Collate/t/nushu.t
@@ -2977,7 +3149,7 @@ cpan/Unicode-Collate/t/overcjk0.t         Unicode::Collate
 cpan/Unicode-Collate/t/overcjk1.t              Unicode::Collate
 cpan/Unicode-Collate/t/override.t              Unicode::Collate
 cpan/Unicode-Collate/t/rearrang.t              Unicode::Collate
-cpan/Unicode-Collate/t/rewrite.t                       Unicode::Collate
+cpan/Unicode-Collate/t/rewrite.t               Unicode::Collate
 cpan/Unicode-Collate/t/tangut.t
 cpan/Unicode-Collate/t/test.t                  Unicode::Collate
 cpan/Unicode-Collate/t/trailwt.t               Unicode::Collate
@@ -3019,34 +3191,32 @@ cpan/Win32/t/Privileges.t
 cpan/Win32/t/Unicode.t                 See if Win32 extension works
 cpan/Win32/Win32.pm                    Win32 extension Perl module
 cpan/Win32/Win32.xs                    Win32 extension external subroutines
-cpan/Win32API-File/buffers.h   Win32API::File extension
-cpan/Win32API-File/cFile.h     Win32API::File extension
-cpan/Win32API-File/cFile.pc    Win32API::File extension
-cpan/Win32API-File/const2perl.h        Win32API::File extension
-cpan/Win32API-File/File.pm     Win32API::File extension
-cpan/Win32API-File/File.xs     Win32API::File extension
+cpan/Win32API-File/buffers.h                   Win32API::File extension
+cpan/Win32API-File/cFile.h                     Win32API::File extension
+cpan/Win32API-File/cFile.pc                    Win32API::File extension
+cpan/Win32API-File/const2perl.h                        Win32API::File extension
+cpan/Win32API-File/File.pm                     Win32API::File extension
+cpan/Win32API-File/File.xs                     Win32API::File extension
 cpan/Win32API-File/inc/ExtUtils/Myconst2perl.pm        Win32API::File extension
-cpan/Win32API-File/Makefile.PL Win32API::File extension makefile write
-cpan/Win32API-File/t/file.t    See if Win32API::File extension works
-cpan/Win32API-File/t/tie.t     See if Win32API::File extension works
-cpan/Win32API-File/typemap     Win32API::File extension interface types
-Cross/build-arm-n770-sh                Cross-compilation
-Cross/cflags-cross-arm         Cross-compilation
-Cross/config                   Cross-compilation
-Cross/config.sh-arm-linux      Cross-compilation
-Cross/config.sh-arm-linux-n770 Cross-compilation
-Cross/generate_config_sh       Cross-compilation
-Cross/installperl.patch                Cross-compilation
-Cross/Makefile                 Cross-compilation
-Cross/Makefile-cross-SH                Cross-compilation
-Cross/Makefile.SH.patch                Cross-compilation
-Cross/README                   Cross-compilation
-Cross/README.new               Cross-compilation
-Cross/TODO                     Cross-compilation
-Cross/warp                     Cross-compilation
-cv.h                           Code value header
-cygwin/cygwin.c                        Additional code for Cygwin port
-deb.c                          Debugging routines
+cpan/Win32API-File/Makefile.PL                 Win32API::File extension makefile write
+cpan/Win32API-File/t/file.t                    See if Win32API::File extension works
+cpan/Win32API-File/t/tie.t                     See if Win32API::File extension works
+cpan/Win32API-File/typemap                     Win32API::File extension interface types
+Cross/build-arm-n770-sh                        Cross-compilation
+Cross/cflags-cross-arm                 Cross-compilation
+Cross/config                           Cross-compilation
+Cross/config.sh-arm-linux              Cross-compilation
+Cross/config.sh-arm-linux-n770         Cross-compilation
+Cross/generate_config_sh               Cross-compilation
+Cross/installperl.patch                        Cross-compilation
+Cross/Makefile                         Cross-compilation
+Cross/Makefile-cross-SH                        Cross-compilation
+Cross/Makefile.SH.patch                        Cross-compilation
+Cross/README                           Cross-compilation
+Cross/README.new                       Cross-compilation
+Cross/TODO                             Cross-compilation
+Cross/warp                             Cross-compilation
+cygwin/cygwin.c                                Additional code for Cygwin port
 dist/Attribute-Handlers/Changes                                Attribute::Handlers
 dist/Attribute-Handlers/demo/demo.pl                   Attribute::Handlers demo
 dist/Attribute-Handlers/demo/Demo.pm                   Attribute::Handlers demo
@@ -3063,6 +3233,7 @@ dist/Attribute-Handlers/demo/demo_rawdata.pl              Attribute::Handlers demo
 dist/Attribute-Handlers/demo/Descriptions.pm           Attribute::Handlers demo
 dist/Attribute-Handlers/demo/MyClass.pm                        Attribute::Handlers demo
 dist/Attribute-Handlers/lib/Attribute/Handlers.pm      Attribute::Handlers
+dist/Attribute-Handlers/Makefile.PL                    Attribute::Handlers
 dist/Attribute-Handlers/t/caller.t                     See if Attribute::Handlers works
 dist/Attribute-Handlers/t/constants.t                  Test constants and Attribute::Handlers
 dist/Attribute-Handlers/t/data_convert.t               Test attribute data conversion
@@ -3072,316 +3243,318 @@ dist/autouse/lib/autouse.pm           Load and call a function only when it's used
 dist/autouse/t/autouse.t               See if autouse works
 dist/autouse/t/lib/MyTestModule.pm     Test module for autouse
 dist/autouse/t/lib/MyTestModule2.pm    Test module for autouse
-dist/base/Changes              base.pm changelog
-dist/base/lib/base.pm          Establish IS-A relationship at compile time
-dist/base/lib/fields.pm                Set up object field names for pseudo-hash-using classes
-dist/base/Makefile.PL  base.pm Makefile.PL
-dist/base/t/base.t             See if base works
-dist/base/t/base-open-chunk.t  See if base works
-dist/base/t/base-open-line.t   See if base works
-dist/base/t/compile-time.t     See if base works
-dist/base/t/core-global.t      See if base works around CORE::GLOBAL::require
-dist/base/t/fields.t           See if fields work
-dist/base/t/fields-5_6_0.t     See if fields work
-dist/base/t/fields-5_8_0.t     See if fields work
-dist/base/t/fields-base.t      See if fields work
-dist/base/t/incdot.t           Test how base.pm handles '.' in @INC
-dist/base/t/isa.t              See if base's behaviour doesn't change
+dist/base/Changes                      base.pm changelog
+dist/base/lib/base.pm                  Establish IS-A relationship at compile time
+dist/base/lib/fields.pm                        Set up object field names for pseudo-hash-using classes
+dist/base/Makefile.PL                  base.pm Makefile.PL
+dist/base/t/base.t                     See if base works
+dist/base/t/base-open-chunk.t          See if base works
+dist/base/t/base-open-line.t           See if base works
+dist/base/t/compile-time.t             See if base works
+dist/base/t/core-global.t              See if base works around CORE::GLOBAL::require
+dist/base/t/fields.t                   See if fields work
+dist/base/t/fields-5_6_0.t             See if fields work
+dist/base/t/fields-5_8_0.t             See if fields work
+dist/base/t/fields-base.t              See if fields work
+dist/base/t/incdot.t                   Test how base.pm handles '.' in @INC
+dist/base/t/isa.t                      See if base's behaviour doesn't change
 dist/base/t/lib/BaseIncMandatory.pm    Test module for base.pm
 dist/base/t/lib/BaseIncOptional.pm     Test module for base.pm
-dist/base/t/lib/Broken.pm      Test module for base.pm
-dist/base/t/lib/Dummy.pm       Test module for base.pm
-dist/base/t/lib/HasSigDie.pm   Module for testing base.pm
-dist/base/t/sigdie.t           See if base works with SIGDIE
-dist/base/t/version.t          See if base works with versions
-dist/base/t/warnings.t         See if base works with warnings
-dist/Carp/Changes              Changelog for Carp's CPAN releases
-dist/Carp/lib/Carp.pm          Error message extension
-dist/Carp/lib/Carp/Heavy.pm    Error message retired workhorse
-dist/Carp/Makefile.PL          makefile writer for Carp
-dist/Carp/README               README for Carp's CPAN releases
+dist/base/t/lib/Broken.pm              Test module for base.pm
+dist/base/t/lib/Dummy.pm               Test module for base.pm
+dist/base/t/lib/HasSigDie.pm           Module for testing base.pm
+dist/base/t/sigdie.t                   See if base works with SIGDIE
+dist/base/t/version.t                  See if base works with versions
+dist/base/t/warnings.t                 See if base works with warnings
+dist/Carp/Changes                      Changelog for Carp's CPAN releases
+dist/Carp/lib/Carp.pm                  Error message extension
+dist/Carp/lib/Carp/Heavy.pm            Error message retired workhorse
+dist/Carp/Makefile.PL                  makefile writer for Carp
+dist/Carp/README                       README for Carp's CPAN releases
 dist/Carp/t/arg_regexp.t               See if Carp formats regexp args OK in stack traces
 dist/Carp/t/arg_string.t               See if Carp formats string args OK in stack traces
-dist/Carp/t/baduni.t           See if Carp handles non-char Unicode
+dist/Carp/t/baduni.t                   See if Carp handles non-char Unicode
 dist/Carp/t/baduni_warnings.t          See if Carp handles non-char Unicode when loaded via warnings.pm
-dist/Carp/t/broken_can.t       Test Carp with bad can implementations
-dist/Carp/t/broken_univ_can.t  Test Carp with bad UNIVERSAL::can
-dist/Carp/t/Carp.t             See if Carp works
+dist/Carp/t/broken_can.t               Test Carp with bad can implementations
+dist/Carp/t/broken_univ_can.t          Test Carp with bad UNIVERSAL::can
+dist/Carp/t/Carp.t                     See if Carp works
 dist/Carp/t/Carp_overload.t            See if Carp handles overloads
 dist/Carp/t/Carp_overloadless.t                See if Carp handles overloads that dont use overload.pm
-dist/Carp/t/errno.t            See if Carp preserves $! and $^E
-dist/Carp/t/heavy.t            See if Carp::Heavy works
+dist/Carp/t/errno.t                    See if Carp preserves $! and $^E
+dist/Carp/t/heavy.t                    See if Carp::Heavy works
 dist/Carp/t/heavy_mismatch.t           See if Carp::Heavy catches version mismatch
-dist/Carp/t/stack_after_err.t  Test stack traces after syntax errors
+dist/Carp/t/stack_after_err.t          Test stack traces after syntax errors
 dist/Carp/t/stash_deletion.t           See if Carp handles stash deletion
-dist/Carp/t/swash.t            See if Carp avoids breaking swash loading
-dist/Carp/t/vivify_gv.t                See if Carp leaves utf8:: stuff alone
+dist/Carp/t/swash.t                    See if Carp avoids breaking swash loading
+dist/Carp/t/vivify_gv.t                        See if Carp leaves utf8:: stuff alone
 dist/Carp/t/vivify_stash.t             See if Carp leaves utf8:: stash alone
 dist/Carp/t/with_warnings.t            See if Carp plays nicely with warnings
-dist/constant/lib/constant.pm  For "use constant"
-dist/constant/t/constant.t     See if compile-time constants work
-dist/constant/t/utf8.t         Test Unicode constants under utf8 pragma
-dist/Data-Dumper/Changes       Data pretty printer, changelog
-dist/Data-Dumper/Dumper.pm     Data pretty printer, module
-dist/Data-Dumper/Dumper.xs     Data pretty printer, externals
-dist/Data-Dumper/Makefile.PL   Data pretty printer, makefile writer
-dist/Data-Dumper/t/bless.t     See if Data::Dumper works
-dist/Data-Dumper/t/bless_var_method.t  See if Data::Dumper::Bless works
-dist/Data-Dumper/t/bugs.t      See if Data::Dumper works
-dist/Data-Dumper/t/deparse.t   See if Data::Dumper::Deparse works
-dist/Data-Dumper/t/dumper.t    See if Data::Dumper works
-dist/Data-Dumper/t/dumpperl.t  See if Data::Dumper::Dumpperl works
-dist/Data-Dumper/t/freezer.t   See if Data::Dumper::Freezer works
-dist/Data-Dumper/t/freezer_useperl.t   See if Data::Dumper works
-dist/Data-Dumper/t/huge.t      See if Data::Dumper works on huge inputs
-dist/Data-Dumper/t/indent.t    See if Data::Dumper::Indent works
-dist/Data-Dumper/t/lib/Testing.pm      Functions used in testing Data-Dumper
-dist/Data-Dumper/t/misc.t      Miscellaneous tests for Data-Dumper
-dist/Data-Dumper/t/names.t     See if Data::Dumper::Names works
-dist/Data-Dumper/t/overload.t  See if Data::Dumper works for overloaded data
-dist/Data-Dumper/t/pair.t      See if Data::Dumper pair separator works
-dist/Data-Dumper/t/perl-74170.t        Regression test for stack reallocation
+dist/constant/Changes                  Changes for constant.pm
+dist/constant/lib/constant.pm          For "use constant"
+dist/constant/Makefile.PL              Build constant.pm (from the cpan release)
+dist/constant/t/constant.t             See if compile-time constants work
+dist/constant/t/utf8.t                 Test Unicode constants under utf8 pragma
+dist/Data-Dumper/Changes                       Data pretty printer, changelog
+dist/Data-Dumper/Dumper.pm                     Data pretty printer, module
+dist/Data-Dumper/Dumper.xs                     Data pretty printer, externals
+dist/Data-Dumper/Makefile.PL                   Data pretty printer, makefile writer
+dist/Data-Dumper/t/bless.t                     See if Data::Dumper works
+dist/Data-Dumper/t/bless_var_method.t          See if Data::Dumper::Bless works
+dist/Data-Dumper/t/bugs.t                      See if Data::Dumper works
+dist/Data-Dumper/t/deparse.t                   See if Data::Dumper::Deparse works
+dist/Data-Dumper/t/dumper.t                    See if Data::Dumper works
+dist/Data-Dumper/t/dumpperl.t                  See if Data::Dumper::Dumpperl works
+dist/Data-Dumper/t/freezer.t                   See if Data::Dumper::Freezer works
+dist/Data-Dumper/t/freezer_useperl.t           See if Data::Dumper works
+dist/Data-Dumper/t/huge.t                      See if Data::Dumper works on huge inputs
+dist/Data-Dumper/t/indent.t                    See if Data::Dumper::Indent works
+dist/Data-Dumper/t/lib/Testing.pm              Functions used in testing Data-Dumper
+dist/Data-Dumper/t/misc.t                      Miscellaneous tests for Data-Dumper
+dist/Data-Dumper/t/names.t                     See if Data::Dumper::Names works
+dist/Data-Dumper/t/overload.t                  See if Data::Dumper works for overloaded data
+dist/Data-Dumper/t/pair.t                      See if Data::Dumper pair separator works
+dist/Data-Dumper/t/perl-74170.t                        Regression test for stack reallocation
 dist/Data-Dumper/t/purity_deepcopy_maxdepth.t  See if three Data::Dumper functions work
-dist/Data-Dumper/t/qr.t                See if Data::Dumper works with qr|/|
-dist/Data-Dumper/t/quotekeys.t See if Data::Dumper::Quotekeys works
-dist/Data-Dumper/t/recurse.t   See if Data::Dumper::Maxrecurse works
-dist/Data-Dumper/t/seen.t      See if Data::Dumper::Seen works
-dist/Data-Dumper/t/sortkeys.t  See if Data::Dumper::Sortkeys works
-dist/Data-Dumper/t/sparseseen.t        See if Data::Dumper::Sparseseen works
-dist/Data-Dumper/t/terse.t     See if Data::Dumper terse option works
-dist/Data-Dumper/t/toaster.t   See if Data::Dumper::Toaster works
-dist/Data-Dumper/t/trailing_comma.t    See if Data::Dumper::Trailingcomma works
-dist/Data-Dumper/t/values.t    See if Data::Dumper::Values works
-dist/Data-Dumper/Todo          Data pretty printer, futures
-dist/Devel-PPPort/apicheck_c.PL                Devel::PPPort apicheck generator
+dist/Data-Dumper/t/qr.t                                See if Data::Dumper works with qr|/|
+dist/Data-Dumper/t/quotekeys.t                 See if Data::Dumper::Quotekeys works
+dist/Data-Dumper/t/recurse.t                   See if Data::Dumper::Maxrecurse works
+dist/Data-Dumper/t/seen.t                      See if Data::Dumper::Seen works
+dist/Data-Dumper/t/sortkeys.t                  See if Data::Dumper::Sortkeys works
+dist/Data-Dumper/t/sparseseen.t                        See if Data::Dumper::Sparseseen works
+dist/Data-Dumper/t/terse.t                     See if Data::Dumper terse option works
+dist/Data-Dumper/t/toaster.t                   See if Data::Dumper::Toaster works
+dist/Data-Dumper/t/trailing_comma.t            See if Data::Dumper::Trailingcomma works
+dist/Data-Dumper/t/values.t                    See if Data::Dumper::Values works
+dist/Data-Dumper/Todo                          Data pretty printer, futures
+dist/Devel-PPPort/apicheck_c.PL                        Devel::PPPort apicheck generator
 dist/Devel-PPPort/Changes                      Devel::PPPort Changes file
-dist/Devel-PPPort/devel/buildperl.pl   Devel::PPPort perl version builder
-dist/Devel-PPPort/devel/devtools.pl    Devel::PPPort development utilities
-dist/Devel-PPPort/devel/mkapidoc.pl    Devel::PPPort apidoc collector 
-dist/Devel-PPPort/devel/mkppport_fnc.pl        Devel::PPPort
-dist/Devel-PPPort/devel/mktodo         Devel::PPPort baseline/todo generator
-dist/Devel-PPPort/devel/mktodo.pl      Devel::PPPort baseline/todo generator
-dist/Devel-PPPort/devel/regenerate     Devel::PPPort API re-generator
-dist/Devel-PPPort/devel/scanprov       Devel::PPPort provided API scanner
+dist/Devel-PPPort/devel/buildperl.pl           Devel::PPPort perl version builder
+dist/Devel-PPPort/devel/devtools.pl            Devel::PPPort development utilities
+dist/Devel-PPPort/devel/mkapidoc.pl            Devel::PPPort apidoc collector
+dist/Devel-PPPort/devel/mkppport_fnc.pl                Devel::PPPort
+dist/Devel-PPPort/devel/mktodo                 Devel::PPPort baseline/todo generator
+dist/Devel-PPPort/devel/mktodo.pl              Devel::PPPort baseline/todo generator
+dist/Devel-PPPort/devel/regenerate             Devel::PPPort API re-generator
+dist/Devel-PPPort/devel/scanprov               Devel::PPPort provided API scanner
 dist/Devel-PPPort/devel/update_release_date.pl Devel::PPPort timestamp builder
-dist/Devel-PPPort/HACKERS              Devel::PPPort hackers documentation
-dist/Devel-PPPort/Makefile.PL          Devel::PPPort makefile writer
-dist/Devel-PPPort/MANIFEST.SKIP                Devel::PPPort manifest skip file
-dist/Devel-PPPort/mktests.PL           Devel::PPPort test file writer
-dist/Devel-PPPort/module2.c            Devel::PPPort test file
-dist/Devel-PPPort/module3.c            Devel::PPPort test file
-dist/Devel-PPPort/parts/apicheck.pl    Devel::PPPort apicheck generator
-dist/Devel-PPPort/parts/apidoc.fnc     Devel::PPPort Perl API listing
-dist/Devel-PPPort/parts/base/5003007   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5004000   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5004001   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5004002   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5004003   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5004004   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5004005   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5005000   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5005001   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5005002   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5005003   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5005004   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5006000   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5006001   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5006002   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5007000   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5007001   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5007002   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5007003   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5008000   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5008001   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5008002   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5008003   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5008004   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5008005   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5008006   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5008007   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5008008   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5008009   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5009000   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5009001   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5009002   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5009003   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5009004   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5009005   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5010000   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5010001   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5011000   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5011001   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5011002   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5011003   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5011004   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5011005   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5012000   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5012001   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5012002   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5012003   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5012004   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5012005   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5013000   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5013001   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5013002   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5013003   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5013004   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5013005   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5013006   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5013007   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5013008   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5013009   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5013010   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5013011   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5014000   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5014001   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5014002   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5014003   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5014004   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5015000   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5015001   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5015002   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5015003   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5015004   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5015005   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5015006   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5015007   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5015008   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5015009   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5016000   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5016001   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5016002   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5016003   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5017000   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5017001   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5017002   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5017003   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5017004   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5017005   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5017006   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5017007   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5017008   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5017009   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5017010   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5017011   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5018000   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5018001   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5018002   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5018003   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5018004   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5019000   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5019001   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5019002   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5019003   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5019004   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5019005   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5019006   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5019007   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5019008   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5019009   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5019010   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5019011   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5020000   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5020001   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5020002   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5020003   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5021000   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5021001   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5021002   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5021003   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5021004   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5021005   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5021006   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5021007   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5021008   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5021009   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5021010   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5021011   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5022000   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5022001   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5022002   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5022003   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5022004   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5023000   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5023001   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5023002   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5023003   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5023004   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5023005   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5023006   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5023007   Devel::PPPort baseline todo file
-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/base/5024001   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5024002   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5024003   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5024004   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5025000   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5025001   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5025002   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5025003   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5025004   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5025005   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5025006   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5025007   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5025008   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5025009   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5025010   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5025011   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5025012   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5026000   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5026001   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5026002   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5026003   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5027000   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5027001   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5027002   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5027003   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5027004   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5027005   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5027006   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5027007   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5027008   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5027009   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5027010   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5027011   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5028000   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5028001   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5028002   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5028003   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5029000   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5029001   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5029002   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5029003   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5029004   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5029005   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5029006   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5029007   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5029008   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5029009   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5029010   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5030000   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5030001   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5030002   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5030003   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5031000   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5031001   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5031002   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5031003   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5031004   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5031005   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5031006   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5031007   Devel::PPPort baseline todo file
+dist/Devel-PPPort/HACKERS                      Devel::PPPort hackers documentation
+dist/Devel-PPPort/Makefile.PL                  Devel::PPPort makefile writer
+dist/Devel-PPPort/MANIFEST.SKIP                        Devel::PPPort manifest skip file
+dist/Devel-PPPort/mktests.PL                   Devel::PPPort test file writer
+dist/Devel-PPPort/module2.c                    Devel::PPPort test file
+dist/Devel-PPPort/module3.c                    Devel::PPPort test file
+dist/Devel-PPPort/parts/apicheck.pl            Devel::PPPort apicheck generator
+dist/Devel-PPPort/parts/apidoc.fnc             Devel::PPPort Perl API listing
+dist/Devel-PPPort/parts/base/5003007           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5004000           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5004001           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5004002           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5004003           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5004004           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5004005           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5005000           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5005001           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5005002           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5005003           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5005004           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5006000           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5006001           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5006002           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5007000           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5007001           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5007002           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5007003           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5008000           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5008001           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5008002           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5008003           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5008004           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5008005           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5008006           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5008007           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5008008           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5008009           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5009000           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5009001           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5009002           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5009003           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5009004           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5009005           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5010000           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5010001           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5011000           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5011001           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5011002           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5011003           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5011004           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5011005           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5012000           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5012001           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5012002           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5012003           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5012004           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5012005           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5013000           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5013001           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5013002           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5013003           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5013004           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5013005           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5013006           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5013007           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5013008           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5013009           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5013010           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5013011           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5014000           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5014001           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5014002           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5014003           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5014004           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5015000           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5015001           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5015002           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5015003           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5015004           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5015005           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5015006           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5015007           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5015008           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5015009           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5016000           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5016001           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5016002           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5016003           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5017000           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5017001           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5017002           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5017003           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5017004           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5017005           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5017006           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5017007           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5017008           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5017009           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5017010           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5017011           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5018000           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5018001           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5018002           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5018003           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5018004           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5019000           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5019001           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5019002           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5019003           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5019004           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5019005           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5019006           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5019007           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5019008           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5019009           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5019010           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5019011           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5020000           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5020001           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5020002           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5020003           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5021000           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5021001           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5021002           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5021003           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5021004           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5021005           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5021006           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5021007           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5021008           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5021009           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5021010           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5021011           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5022000           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5022001           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5022002           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5022003           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5022004           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5023000           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5023001           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5023002           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5023003           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5023004           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5023005           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5023006           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5023007           Devel::PPPort baseline todo file
+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/base/5024001           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5024002           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5024003           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5024004           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5025000           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5025001           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5025002           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5025003           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5025004           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5025005           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5025006           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5025007           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5025008           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5025009           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5025010           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5025011           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5025012           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5026000           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5026001           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5026002           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5026003           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5027000           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5027001           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5027002           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5027003           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5027004           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5027005           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5027006           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5027007           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5027008           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5027009           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5027010           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5027011           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5028000           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5028001           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5028002           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5028003           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5029000           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5029001           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5029002           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5029003           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5029004           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5029005           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5029006           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5029007           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5029008           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5029009           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5029010           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5030000           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5030001           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5030002           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5030003           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5031000           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5031001           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5031002           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5031003           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5031004           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5031005           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5031006           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5031007           Devel::PPPort baseline todo file
 dist/Devel-PPPort/parts/base/5031008
-dist/Devel-PPPort/parts/base/5031009   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5031010   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5031011   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5032000   Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5031009           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5031010           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5031011           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5032000           Devel::PPPort baseline todo file
 dist/Devel-PPPort/parts/base/5032001
-dist/Devel-PPPort/parts/base/5033000   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5033001   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/base/5033002   Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5033000           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5033001           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/base/5033002           Devel::PPPort baseline todo file
 dist/Devel-PPPort/parts/base/5033003
 dist/Devel-PPPort/parts/base/5033004
 dist/Devel-PPPort/parts/base/5033005
@@ -3400,262 +3573,262 @@ dist/Devel-PPPort/parts/base/5035007
 dist/Devel-PPPort/parts/base/5035008
 dist/Devel-PPPort/parts/base/5035009
 dist/Devel-PPPort/parts/base/5035010
-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
-dist/Devel-PPPort/parts/inc/format     Devel::PPPort include
-dist/Devel-PPPort/parts/inc/grok       Devel::PPPort include
-dist/Devel-PPPort/parts/inc/gv         Devel::PPPort include
-dist/Devel-PPPort/parts/inc/HvNAME     Devel::PPPort include
+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
+dist/Devel-PPPort/parts/inc/format             Devel::PPPort include
+dist/Devel-PPPort/parts/inc/grok               Devel::PPPort include
+dist/Devel-PPPort/parts/inc/gv                 Devel::PPPort include
+dist/Devel-PPPort/parts/inc/HvNAME             Devel::PPPort include
 dist/Devel-PPPort/parts/inc/inctools
-dist/Devel-PPPort/parts/inc/limits     Devel::PPPort include
+dist/Devel-PPPort/parts/inc/limits             Devel::PPPort include
 dist/Devel-PPPort/parts/inc/locale
-dist/Devel-PPPort/parts/inc/magic      Devel::PPPort include
-dist/Devel-PPPort/parts/inc/magic_defs Devel::PPPort include
-dist/Devel-PPPort/parts/inc/memory     Devel::PPPort include
-dist/Devel-PPPort/parts/inc/mess       Devel::PPPort include
-dist/Devel-PPPort/parts/inc/misc       Devel::PPPort include
-dist/Devel-PPPort/parts/inc/mPUSH      Devel::PPPort include
-dist/Devel-PPPort/parts/inc/MY_CXT     Devel::PPPort include
-dist/Devel-PPPort/parts/inc/newCONSTSUB        Devel::PPPort include
-dist/Devel-PPPort/parts/inc/newRV      Devel::PPPort include
-dist/Devel-PPPort/parts/inc/newSV_type Devel::PPPort include
-dist/Devel-PPPort/parts/inc/newSVpv    Devel::PPPort include
-dist/Devel-PPPort/parts/inc/podtest    Devel::PPPort include
-dist/Devel-PPPort/parts/inc/ppphbin    Devel::PPPort include
-dist/Devel-PPPort/parts/inc/ppphdoc    Devel::PPPort include
-dist/Devel-PPPort/parts/inc/ppphtest   Devel::PPPort include
-dist/Devel-PPPort/parts/inc/pv_tools   Devel::PPPort include
-dist/Devel-PPPort/parts/inc/pvs                Devel::PPPort include
-dist/Devel-PPPort/parts/inc/shared_pv  Devel::PPPort include
-dist/Devel-PPPort/parts/inc/snprintf   Devel::PPPort include
-dist/Devel-PPPort/parts/inc/sprintf    Devel::PPPort include
-dist/Devel-PPPort/parts/inc/strlfuncs  Devel::PPPort include
+dist/Devel-PPPort/parts/inc/magic              Devel::PPPort include
+dist/Devel-PPPort/parts/inc/magic_defs         Devel::PPPort include
+dist/Devel-PPPort/parts/inc/memory             Devel::PPPort include
+dist/Devel-PPPort/parts/inc/mess               Devel::PPPort include
+dist/Devel-PPPort/parts/inc/misc               Devel::PPPort include
+dist/Devel-PPPort/parts/inc/mPUSH              Devel::PPPort include
+dist/Devel-PPPort/parts/inc/MY_CXT             Devel::PPPort include
+dist/Devel-PPPort/parts/inc/newCONSTSUB                Devel::PPPort include
+dist/Devel-PPPort/parts/inc/newRV              Devel::PPPort include
+dist/Devel-PPPort/parts/inc/newSV_type         Devel::PPPort include
+dist/Devel-PPPort/parts/inc/newSVpv            Devel::PPPort include
+dist/Devel-PPPort/parts/inc/podtest            Devel::PPPort include
+dist/Devel-PPPort/parts/inc/ppphbin            Devel::PPPort include
+dist/Devel-PPPort/parts/inc/ppphdoc            Devel::PPPort include
+dist/Devel-PPPort/parts/inc/ppphtest           Devel::PPPort include
+dist/Devel-PPPort/parts/inc/pv_tools           Devel::PPPort include
+dist/Devel-PPPort/parts/inc/pvs                        Devel::PPPort include
+dist/Devel-PPPort/parts/inc/shared_pv          Devel::PPPort include
+dist/Devel-PPPort/parts/inc/snprintf           Devel::PPPort include
+dist/Devel-PPPort/parts/inc/sprintf            Devel::PPPort include
+dist/Devel-PPPort/parts/inc/strlfuncs          Devel::PPPort include
 dist/Devel-PPPort/parts/inc/subparse
-dist/Devel-PPPort/parts/inc/Sv_set     Devel::PPPort include
-dist/Devel-PPPort/parts/inc/sv_xpvf    Devel::PPPort include
-dist/Devel-PPPort/parts/inc/SvPV       Devel::PPPort include
-dist/Devel-PPPort/parts/inc/SvREFCNT   Devel::PPPort include
-dist/Devel-PPPort/parts/inc/threads    Devel::PPPort include
+dist/Devel-PPPort/parts/inc/Sv_set             Devel::PPPort include
+dist/Devel-PPPort/parts/inc/sv_xpvf            Devel::PPPort include
+dist/Devel-PPPort/parts/inc/SvPV               Devel::PPPort include
+dist/Devel-PPPort/parts/inc/SvREFCNT           Devel::PPPort include
+dist/Devel-PPPort/parts/inc/threads            Devel::PPPort include
 dist/Devel-PPPort/parts/inc/utf8
-dist/Devel-PPPort/parts/inc/uv         Devel::PPPort include
-dist/Devel-PPPort/parts/inc/variables  Devel::PPPort include
-dist/Devel-PPPort/parts/inc/version    Devel::PPPort include
-dist/Devel-PPPort/parts/inc/warn       Devel::PPPort include
-dist/Devel-PPPort/parts/ppport.fnc     Devel::PPPort API listing
-dist/Devel-PPPort/parts/ppptools.pl    Devel::PPPort various utilities
-dist/Devel-PPPort/parts/todo/5003007   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/todo/5004000   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5004001   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/todo/5004002   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/todo/5004003   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/todo/5004004   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/todo/5004005   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/todo/5005000   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5005001   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/todo/5005002   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/todo/5005003   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/todo/5005004   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/todo/5006000   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5006001   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5006002   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5007000   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5007001   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5007002   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5007003   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5008000   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5008001   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5008002   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5008003   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5008004   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5008005   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5008006   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5008007   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5008008   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5008009   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5009000   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5009001   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5009002   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5009003   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5009004   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5009005   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5010000   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5010001   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5011000   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5011001   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5011002   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5011003   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5011004   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5011005   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5012000   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5012001   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5012002   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5012003   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5012004   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5012005   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5013000   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5013001   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5013002   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5013003   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5013004   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5013005   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5013006   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5013007   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5013008   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5013009   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5013010   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5013011   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5014000   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5014001   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5014002   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5014003   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5014004   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5015000   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5015001   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5015002   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5015003   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5015004   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5015005   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5015006   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5015007   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5015008   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5015009   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5016000   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5016001   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5016002   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5016003   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5017000   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5017001   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5017002   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5017003   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5017004   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5017005   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5017006   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5017007   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5017008   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5017009   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5017010   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5017011   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5018000   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5018001   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5018002   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5018003   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5018004   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5019000   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5019001   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5019002   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5019003   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5019004   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5019005   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5019006   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5019007   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5019008   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5019009   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5019010   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5019011   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5020000   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5020001   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5020002   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5020003   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5021000   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5021001   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5021002   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5021003   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/todo/5021004   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5021005   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5021006   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5021007   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5021008   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5021009   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5021010   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5021011   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5022000   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5022001   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5022002   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/todo/5022003   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/todo/5022004   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/todo/5023000   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5023001   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5023002   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5023003   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5023004   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5023005   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5023006   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5023007   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5023008   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5023009   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5024000   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5024001   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/todo/5024002   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/todo/5024003   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/todo/5024004   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/todo/5025000   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/todo/5025001   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/todo/5025002   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/todo/5025003   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/todo/5025004   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/todo/5025005   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/todo/5025006   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/todo/5025007   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/todo/5025008   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/todo/5025009   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/todo/5025010   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/todo/5025011   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/todo/5025012   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/todo/5026000   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/todo/5026001   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/todo/5026002   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/todo/5026003   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/todo/5027000   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/todo/5027001   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/todo/5027002   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/todo/5027003   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/todo/5027004   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/todo/5027005   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/todo/5027006   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/todo/5027007   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/todo/5027008   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/todo/5027009   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/todo/5027010   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/todo/5027011   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/todo/5028000   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/todo/5028001   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/todo/5028002   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5028003   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5029000   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/todo/5029001   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/todo/5029002   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/todo/5029003   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/todo/5029004   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/todo/5029005   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/todo/5029006   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/todo/5029007   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/todo/5029008   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/todo/5029009   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/todo/5029010   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/todo/5030000   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/todo/5030001   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5030002   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5030003   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5031000   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5031001   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/todo/5031002   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/todo/5031003   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/todo/5031004   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/todo/5031005   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/todo/5031006   Devel::PPPort baseline todo file
-dist/Devel-PPPort/parts/todo/5031007   Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/inc/uv                 Devel::PPPort include
+dist/Devel-PPPort/parts/inc/variables          Devel::PPPort include
+dist/Devel-PPPort/parts/inc/version            Devel::PPPort include
+dist/Devel-PPPort/parts/inc/warn               Devel::PPPort include
+dist/Devel-PPPort/parts/ppport.fnc             Devel::PPPort API listing
+dist/Devel-PPPort/parts/ppptools.pl            Devel::PPPort various utilities
+dist/Devel-PPPort/parts/todo/5003007           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/todo/5004000           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5004001           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/todo/5004002           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/todo/5004003           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/todo/5004004           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/todo/5004005           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/todo/5005000           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5005001           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/todo/5005002           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/todo/5005003           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/todo/5005004           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/todo/5006000           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5006001           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5006002           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5007000           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5007001           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5007002           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5007003           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5008000           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5008001           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5008002           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5008003           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5008004           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5008005           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5008006           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5008007           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5008008           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5008009           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5009000           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5009001           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5009002           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5009003           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5009004           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5009005           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5010000           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5010001           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5011000           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5011001           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5011002           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5011003           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5011004           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5011005           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5012000           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5012001           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5012002           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5012003           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5012004           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5012005           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5013000           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5013001           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5013002           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5013003           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5013004           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5013005           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5013006           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5013007           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5013008           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5013009           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5013010           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5013011           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5014000           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5014001           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5014002           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5014003           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5014004           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5015000           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5015001           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5015002           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5015003           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5015004           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5015005           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5015006           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5015007           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5015008           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5015009           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5016000           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5016001           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5016002           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5016003           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5017000           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5017001           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5017002           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5017003           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5017004           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5017005           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5017006           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5017007           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5017008           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5017009           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5017010           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5017011           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5018000           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5018001           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5018002           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5018003           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5018004           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5019000           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5019001           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5019002           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5019003           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5019004           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5019005           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5019006           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5019007           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5019008           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5019009           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5019010           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5019011           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5020000           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5020001           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5020002           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5020003           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5021000           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5021001           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5021002           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5021003           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/todo/5021004           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5021005           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5021006           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5021007           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5021008           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5021009           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5021010           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5021011           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5022000           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5022001           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5022002           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/todo/5022003           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/todo/5022004           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/todo/5023000           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5023001           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5023002           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5023003           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5023004           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5023005           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5023006           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5023007           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5023008           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5023009           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5024000           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5024001           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/todo/5024002           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/todo/5024003           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/todo/5024004           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/todo/5025000           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/todo/5025001           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/todo/5025002           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/todo/5025003           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/todo/5025004           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/todo/5025005           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/todo/5025006           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/todo/5025007           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/todo/5025008           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/todo/5025009           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/todo/5025010           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/todo/5025011           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/todo/5025012           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/todo/5026000           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/todo/5026001           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/todo/5026002           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/todo/5026003           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/todo/5027000           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/todo/5027001           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/todo/5027002           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/todo/5027003           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/todo/5027004           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/todo/5027005           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/todo/5027006           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/todo/5027007           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/todo/5027008           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/todo/5027009           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/todo/5027010           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/todo/5027011           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/todo/5028000           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/todo/5028001           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/todo/5028002           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5028003           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5029000           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/todo/5029001           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/todo/5029002           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/todo/5029003           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/todo/5029004           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/todo/5029005           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/todo/5029006           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/todo/5029007           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/todo/5029008           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/todo/5029009           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/todo/5029010           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/todo/5030000           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/todo/5030001           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5030002           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5030003           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5031000           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5031001           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/todo/5031002           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/todo/5031003           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/todo/5031004           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/todo/5031005           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/todo/5031006           Devel::PPPort baseline todo file
+dist/Devel-PPPort/parts/todo/5031007           Devel::PPPort baseline todo file
 dist/Devel-PPPort/parts/todo/5031008
-dist/Devel-PPPort/parts/todo/5031009   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5031010   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5031011   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5032000   Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5031009           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5031010           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5031011           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5032000           Devel::PPPort todo file
 dist/Devel-PPPort/parts/todo/5032001
-dist/Devel-PPPort/parts/todo/5033000   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5033001   Devel::PPPort todo file
-dist/Devel-PPPort/parts/todo/5033002   Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5033000           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5033001           Devel::PPPort todo file
+dist/Devel-PPPort/parts/todo/5033002           Devel::PPPort todo file
 dist/Devel-PPPort/parts/todo/5033003
 dist/Devel-PPPort/parts/todo/5033004
 dist/Devel-PPPort/parts/todo/5033005
@@ -3674,57 +3847,61 @@ dist/Devel-PPPort/parts/todo/5035007
 dist/Devel-PPPort/parts/todo/5035008
 dist/Devel-PPPort/parts/todo/5035009
 dist/Devel-PPPort/parts/todo/5035010
-dist/Devel-PPPort/PPPort.xs            Devel::PPPort dummy PPPort.xs
-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/PPPort.xs                    Devel::PPPort dummy PPPort.xs
+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/soak                         Devel::PPPort Test Harness to run under various Perls
 dist/Devel-PPPort/t/testutil.pl                        Devel::PPPort test utilities
-dist/Devel-PPPort/TODO                 Devel::PPPort developer notes
-dist/Devel-PPPort/typemap              Devel::PPPort Typemap
+dist/Devel-PPPort/TODO                         Devel::PPPort developer notes
+dist/Devel-PPPort/typemap                      Devel::PPPort Typemap
 dist/Devel-SelfStubber/lib/Devel/SelfStubber.pm        Generate stubs for SelfLoader.pm
 dist/Devel-SelfStubber/t/Devel-SelfStubber.t   See if Devel::SelfStubber works
-dist/Dumpvalue/lib/Dumpvalue.pm        Screen dump of perl values
-dist/Dumpvalue/t/Dumpvalue.t   See if Dumpvalue works
+dist/Dumpvalue/lib/Dumpvalue.pm                Screen dump of perl values
+dist/Dumpvalue/t/Dumpvalue.t           See if Dumpvalue works
 dist/Dumpvalue/t/extend-coverage.t     Extend Dumpvalue's test coverage
-dist/Dumpvalue/t/lib/TieOut.pm Helper module for Dumpvalue tests
+dist/Dumpvalue/t/lib/TieOut.pm         Helper module for Dumpvalue tests
 dist/Dumpvalue/t/rt-134441-dumpvalue.t See if Dumpvalue works
+dist/encoding-warnings/Changes                 encoding::warnings
 dist/encoding-warnings/lib/encoding/warnings.pm        warn on implicit encoding conversions
-dist/encoding-warnings/t/1-warning.t   tests for encoding::warnings
-dist/encoding-warnings/t/2-fatal.t     tests for encoding::warnings
-dist/encoding-warnings/t/3-normal.t    tests for encoding::warnings
-dist/encoding-warnings/t/4-lexical.t   tests for encoding::warnings
-dist/Env/lib/Env.pm            Map environment into ordinary variables
-dist/Env/t/array.t             See if Env works for arrays
-dist/Env/t/env.t               See if Env works
+dist/encoding-warnings/Makefile.PL             encoding::warnings
+dist/encoding-warnings/t/1-warning.t           tests for encoding::warnings
+dist/encoding-warnings/t/2-fatal.t             tests for encoding::warnings
+dist/encoding-warnings/t/3-normal.t            tests for encoding::warnings
+dist/encoding-warnings/t/4-lexical.t           tests for encoding::warnings
+dist/Env/lib/Env.pm                    Map environment into ordinary variables
+dist/Env/t/array.t                     See if Env works for arrays
+dist/Env/t/env.t                       See if Env works
+dist/Exporter/Changes                  History of changes for Exporter
 dist/Exporter/lib/Exporter.pm          Exporter base class
 dist/Exporter/lib/Exporter/Heavy.pm    Complicated routines for Exporter
+dist/Exporter/Makefile.PL              Build Exporter
 dist/Exporter/t/Exporter.t             See if Exporter works
 dist/Exporter/t/warn.t                 See if Exporter respects warning handlers
-dist/ExtUtils-CBuilder/Changes         EU-CB change log
-dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder.pm                        Compile and link C code for Perl modules
-dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Base.pm           Base class for ExtUtils::CBuilder methods
-dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/aix.pm   CBuilder methods for AIX
+dist/ExtUtils-CBuilder/Changes                                         EU-CB change log
+dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder.pm                                Compile and link C code for Perl modules
+dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Base.pm                   Base class for ExtUtils::CBuilder methods
+dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/aix.pm           CBuilder methods for AIX
 dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/android.pm       CBuilder methods for Android
-dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/cygwin.pm        CBuilder methods for cygwin
-dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/darwin.pm        CBuilder methods for darwin
+dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/cygwin.pm                CBuilder methods for cygwin
+dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/darwin.pm                CBuilder methods for darwin
 dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/dec_osf.pm       CBuilder methods for OSF
-dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/os2.pm   CBuilder methods for OS/2
-dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/Unix.pm  CBuilder methods for Unix
-dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/VMS.pm   CBuilder methods for VMS
+dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/os2.pm           CBuilder methods for OS/2
+dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/Unix.pm          CBuilder methods for Unix
+dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/VMS.pm           CBuilder methods for VMS
 dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/Windows.pm       CBuilder methods for Windows
 dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/Windows/BCC.pm   CBuilder methods for Windows
 dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/Windows/GCC.pm   CBuilder methods for Windows
 dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/Windows/MSVC.pm  CBuilder methods for Windows
-dist/ExtUtils-CBuilder/LICENSE         EU-CB license
-dist/ExtUtils-CBuilder/Makefile.PL             EU-CB configuration script
-dist/ExtUtils-CBuilder/README.patching         EU-CB patching nstructions
-dist/ExtUtils-CBuilder/README.release          EU-CB release instructions
-dist/ExtUtils-CBuilder/t/00-have-compiler.t                    ExtUtils::CBuilder tests
-dist/ExtUtils-CBuilder/t/01-basic.t                            tests for ExtUtils::CBuilder
-dist/ExtUtils-CBuilder/t/02-link.t                             tests for ExtUtils::CBuilder
-dist/ExtUtils-CBuilder/t/03-cplusplus.t                                tests for ExtUtils::CBuilder
-dist/ExtUtils-CBuilder/t/04-base.t                             tests for ExtUtils::CBuilder
+dist/ExtUtils-CBuilder/LICENSE                                         EU-CB license
+dist/ExtUtils-CBuilder/Makefile.PL                                     EU-CB configuration script
+dist/ExtUtils-CBuilder/README.patching                                 EU-CB patching nstructions
+dist/ExtUtils-CBuilder/README.release                                  EU-CB release instructions
+dist/ExtUtils-CBuilder/t/00-have-compiler.t                            ExtUtils::CBuilder tests
+dist/ExtUtils-CBuilder/t/01-basic.t                                    tests for ExtUtils::CBuilder
+dist/ExtUtils-CBuilder/t/02-link.t                                     tests for ExtUtils::CBuilder
+dist/ExtUtils-CBuilder/t/03-cplusplus.t                                        tests for ExtUtils::CBuilder
+dist/ExtUtils-CBuilder/t/04-base.t                                     tests for ExtUtils::CBuilder
 dist/ExtUtils-ParseXS/Changes                                  ExtUtils::ParseXS change log
 dist/ExtUtils-ParseXS/lib/ExtUtils/ParseXS.pm                  converts Perl XS code into C code
 dist/ExtUtils-ParseXS/lib/ExtUtils/ParseXS.pod                 ExtUtils::ParseXS documentation
@@ -3782,15 +3959,22 @@ dist/ExtUtils-ParseXS/t/lib/PrimitiveCapture.pm                 Primitive STDOUT/ERR capturing
 dist/ExtUtils-ParseXS/t/lib/TypemapTest/Foo.pm                 ExtUtils::Typemaps tests
 dist/ExtUtils-ParseXS/t/pseudotypemap1                         A test-typemap
 dist/ExtUtils-ParseXS/t/typemap                                        Standard typemap for controlled testing
+dist/ExtUtils-ParseXS/t/XSAlias.xs                             Test file for ExtUtils::ParseXS ALIAS tests
 dist/ExtUtils-ParseXS/t/XSBroken.xs                            Test file for ExtUtils::ParseXS tests
+dist/ExtUtils-ParseXS/t/XSFalsePositive.xs                     Test file for ExtUtils::ParseXS tests
+dist/ExtUtils-ParseXS/t/XSFalsePositive2.xs                    Test file for ExtUtils::ParseXS tests
 dist/ExtUtils-ParseXS/t/XSInclude.xsh                          Test file for ExtUtils::ParseXS tests
 dist/ExtUtils-ParseXS/t/XSMore.xs                              Test file for ExtUtils::ParseXS tests
+dist/ExtUtils-ParseXS/t/XSNoMap.xs
 dist/ExtUtils-ParseXS/t/XSTest.pm                              Test file for ExtUtils::ParseXS tests
 dist/ExtUtils-ParseXS/t/XSTest.xs                              Test file for ExtUtils::ParseXS tests
+dist/ExtUtils-ParseXS/t/XSTightDirectives.xs                   Test file for ExtUtils::ParseXS tests
 dist/ExtUtils-ParseXS/t/XSUsage.pm                             ExtUtils::ParseXS tests
 dist/ExtUtils-ParseXS/t/XSUsage.xs                             ExtUtils::ParseXS tests
 dist/ExtUtils-ParseXS/t/XSWarn.xs                              ExtUtils::ParseXS tests
+dist/Filter-Simple/Changes                                     History of change for Filter::Simple
 dist/Filter-Simple/lib/Filter/Simple.pm                                Simple frontend to Filter::Util::Call
+dist/Filter-Simple/Makefile.PL                                 Build Filter::Simple
 dist/Filter-Simple/t/code_no_comments.t                                See if Filter::Simple works
 dist/Filter-Simple/t/data.t                                    See if Filter::Simple works
 dist/Filter-Simple/t/export.t                                  See if Filter::Simple works
@@ -3804,14 +3988,17 @@ dist/Filter-Simple/t/lib/Filter/Simple/FilterOnlyTest.pm        Helper file for Filter:
 dist/Filter-Simple/t/lib/Filter/Simple/FilterTest.pm           Helper file for Filter::Simple tests
 dist/Filter-Simple/t/lib/Filter/Simple/ImportTest.pm           Helper file for Filter::Simple tests
 dist/Filter-Simple/t/no.t                                      See if Filter::Simple works
-dist/FindBin/lib/FindBin.pm                    Find name of currently executing program
-dist/FindBin/t/FindBin.t                       See if FindBin works
-dist/I18N-Collate/lib/I18N/Collate.pm          Routines to do strxfrm-based collation
-dist/I18N-Collate/t/I18N-Collate.t             See if I18N::Collate works
-dist/I18N-LangTags/ChangeLog                   I18N::LangTags
+dist/FindBin/Changes                   Tracks changes made in blead
+dist/FindBin/lib/FindBin.pm            Find name of currently executing program
+dist/FindBin/Makefile.PL               Build FindBin
+dist/FindBin/t/FindBin.t               See if FindBin works
+dist/I18N-Collate/lib/I18N/Collate.pm  Routines to do strxfrm-based collation
+dist/I18N-Collate/t/I18N-Collate.t     See if I18N::Collate works
+dist/I18N-LangTags/ChangeLog                   I18N::LangTags change history
 dist/I18N-LangTags/lib/I18N/LangTags.pm                I18N::LangTags
 dist/I18N-LangTags/lib/I18N/LangTags/Detect.pm Detect language preferences
 dist/I18N-LangTags/lib/I18N/LangTags/List.pm   List of tags for human languages
+dist/I18N-LangTags/Makefile.PL                 Build I18N::LangTags
 dist/I18N-LangTags/README                      I18N::LangTags
 dist/I18N-LangTags/t/01_about_verbose.t                See whether I18N::LangTags works
 dist/I18N-LangTags/t/05_main.t                 See whether I18N::LangTags works
@@ -3821,59 +4008,60 @@ dist/I18N-LangTags/t/20_locales.t               See whether I18N::LangTags works
 dist/I18N-LangTags/t/50_super.t                        See whether I18N::LangTags works
 dist/I18N-LangTags/t/55_supers_strict.t                See whether I18N::LangTags works
 dist/I18N-LangTags/t/80_all_env.t              See whether I18N::LangTags works
-dist/if/Changes                        if perl module change log
-dist/if/if.pm                  For "use if"
-dist/if/MANIFEST               MANIFEST for if.pm
-dist/if/META.json              META.json for if.pm
-dist/if/META.yml               META.json for if.pm
-dist/if/t/if.t                 Tests for "use if"
-dist/IO/ChangeLog              IO perl module change log
-dist/IO/hints/sco.pl           Hint for IO for named architecture
-dist/IO/IO.pm                  Top-level interface to IO::* classes
-dist/IO/IO.xs                  IO extension external subroutines
-dist/IO/lib/IO/Dir.pm          IO directory reading package
-dist/IO/lib/IO/File.pm         IO file handle package
-dist/IO/lib/IO/Handle.pm       IO base handle package
-dist/IO/lib/IO/Pipe.pm         IO pipe package
-dist/IO/lib/IO/Poll.pm         IO system poll() interface
-dist/IO/lib/IO/Seekable.pm     IO methods for seekable handles
-dist/IO/lib/IO/Select.pm       IO system select() interface
-dist/IO/lib/IO/Socket.pm       IO socket handle package
-dist/IO/lib/IO/Socket/INET.pm  IO INET specific socket methods
-dist/IO/lib/IO/Socket/UNIX.pm  IO UNIX specific socket methods
-dist/IO/Makefile.PL            IO extension makefile writer
-dist/IO/poll.c                 IO poll() emulation using select()
-dist/IO/poll.h                 IO poll() emulation using select()
-dist/IO/README                 IO extension maintenance notice
-dist/IO/t/cachepropagate-tcp.t See if IO::Socket duplication works
-dist/IO/t/cachepropagate-udp.t See if IO::Socket duplication works
-dist/IO/t/cachepropagate-unix.t        See if IO::Socket duplication works
-dist/IO/t/gh17447.t            Tests fix for #17447
-dist/IO/t/IO.t                 See if IO works
-dist/IO/t/io_const.t           See if constants from IO work
-dist/IO/t/io_dir.t             See if directory-related methods from IO work
-dist/IO/t/io_dup.t             See if dup()-related methods from IO work
-dist/IO/t/io_file.t            See if binmode()-related methods on IO::File work
-dist/IO/t/io_file_export.t     Test IO::File exports
-dist/IO/t/io_getline.t         Test getline and getlines
-dist/IO/t/io_leak.t            See if IO leaks SVs (only run in core)
-dist/IO/t/io_linenum.t         See if I/O line numbers are tracked correctly
-dist/IO/t/io_multihomed.t      See if INET sockets work with multi-homed hosts
-dist/IO/t/io_pipe.t            See if pipe()-related methods from IO work
-dist/IO/t/io_poll.t            See if poll()-related methods from IO work
-dist/IO/t/io_sel.t             See if select()-related methods from IO work
-dist/IO/t/io_sock.t            See if INET socket-related methods from IO work
-dist/IO/t/io_sock_errstr.t     See if socket constructors put error string in the right place
-dist/IO/t/io_taint.t           See if the untaint method from IO works
-dist/IO/t/io_tell.t            See if seek()/tell()-related methods from IO work
-dist/IO/t/io_udp.t             See if UDP socket-related methods from IO work
-dist/IO/t/io_unix.t            See if UNIX socket-related methods from IO work
-dist/IO/t/io_utf8.t            See if perlio opens work
-dist/IO/t/io_utf8argv.t                See if <> respects open pragma
-dist/IO/t/io_xs.t              See if XSUB methods from IO work
-dist/lib/lib_pm.PL             For "use lib", produces lib/lib.pm
+dist/if/Changes                                if perl module change log
+dist/if/if.pm                          For "use if"
+dist/if/Makefile.PL                    Makefile.PL for if.pm
+dist/if/MANIFEST                       MANIFEST for if.pm
+dist/if/META.json                      META.json for if.pm
+dist/if/META.yml                       META.json for if.pm
+dist/if/t/if.t                         Tests for "use if"
+dist/IO/ChangeLog                      IO perl module change log
+dist/IO/hints/sco.pl                   Hint for IO for named architecture
+dist/IO/IO.pm                          Top-level interface to IO::* classes
+dist/IO/IO.xs                          IO extension external subroutines
+dist/IO/lib/IO/Dir.pm                  IO directory reading package
+dist/IO/lib/IO/File.pm                 IO file handle package
+dist/IO/lib/IO/Handle.pm               IO base handle package
+dist/IO/lib/IO/Pipe.pm                 IO pipe package
+dist/IO/lib/IO/Poll.pm                 IO system poll() interface
+dist/IO/lib/IO/Seekable.pm             IO methods for seekable handles
+dist/IO/lib/IO/Select.pm               IO system select() interface
+dist/IO/lib/IO/Socket.pm               IO socket handle package
+dist/IO/lib/IO/Socket/INET.pm          IO INET specific socket methods
+dist/IO/lib/IO/Socket/UNIX.pm          IO UNIX specific socket methods
+dist/IO/Makefile.PL                    IO extension makefile writer
+dist/IO/poll.c                         IO poll() emulation using select()
+dist/IO/poll.h                         IO poll() emulation using select()
+dist/IO/README                         IO extension maintenance notice
+dist/IO/t/cachepropagate-tcp.t         See if IO::Socket duplication works
+dist/IO/t/cachepropagate-udp.t         See if IO::Socket duplication works
+dist/IO/t/cachepropagate-unix.t                See if IO::Socket duplication works
+dist/IO/t/gh17447.t                    Tests fix for #17447
+dist/IO/t/IO.t                         See if IO works
+dist/IO/t/io_const.t                   See if constants from IO work
+dist/IO/t/io_dir.t                     See if directory-related methods from IO work
+dist/IO/t/io_dup.t                     See if dup()-related methods from IO work
+dist/IO/t/io_file.t                    See if binmode()-related methods on IO::File work
+dist/IO/t/io_file_export.t             Test IO::File exports
+dist/IO/t/io_getline.t                 Test getline and getlines
+dist/IO/t/io_leak.t                    See if IO leaks SVs (only run in core)
+dist/IO/t/io_linenum.t                 See if I/O line numbers are tracked correctly
+dist/IO/t/io_multihomed.t              See if INET sockets work with multi-homed hosts
+dist/IO/t/io_pipe.t                    See if pipe()-related methods from IO work
+dist/IO/t/io_poll.t                    See if poll()-related methods from IO work
+dist/IO/t/io_sel.t                     See if select()-related methods from IO work
+dist/IO/t/io_sock.t                    See if INET socket-related methods from IO work
+dist/IO/t/io_sock_errstr.t             See if socket constructors put error string in the right place
+dist/IO/t/io_taint.t                   See if the untaint method from IO works
+dist/IO/t/io_tell.t                    See if seek()/tell()-related methods from IO work
+dist/IO/t/io_udp.t                     See if UDP socket-related methods from IO work
+dist/IO/t/io_unix.t                    See if UNIX socket-related methods from IO work
+dist/IO/t/io_utf8.t                    See if perlio opens work
+dist/IO/t/io_utf8argv.t                        See if <> respects open pragma
+dist/IO/t/io_xs.t                      See if XSUB methods from IO work
+dist/lib/lib_pm.PL                     For "use lib", produces lib/lib.pm
 dist/lib/Makefile.PL
-dist/lib/t/01lib.t             For "use lib" testing
+dist/lib/t/01lib.t                     For "use lib" testing
 dist/Locale-Maketext/ChangeLog                         Locale::Maketext
 dist/Locale-Maketext/lib/Locale/Maketext.pm            Locale::Maketext
 dist/Locale-Maketext/lib/Locale/Maketext.pod           Locale::Maketext documentation
@@ -3881,10 +4069,11 @@ dist/Locale-Maketext/lib/Locale/Maketext/Cookbook.pod   Locale::Maketext
 dist/Locale-Maketext/lib/Locale/Maketext/Guts.pm       Locale::Maketext
 dist/Locale-Maketext/lib/Locale/Maketext/GutsLoader.pm Locale::Maketext
 dist/Locale-Maketext/lib/Locale/Maketext/TPJ13.pod     Locale::Maketext documentation article
+dist/Locale-Maketext/Makefile.PL                       Build Locale::Maketext
 dist/Locale-Maketext/README                            Locale::Maketext
 dist/Locale-Maketext/t/01_about_verbose.t              See if Locale::Maketext works
 dist/Locale-Maketext/t/04_use_external_lex_cache.t     See if Locale::Maketext works
-dist/Locale-Maketext/t/09_compile.t    Test Locale::Maketext::_compile
+dist/Locale-Maketext/t/09_compile.t                    Test Locale::Maketext::_compile
 dist/Locale-Maketext/t/10_make.t                       See if Locale::Maketext works
 dist/Locale-Maketext/t/20_get.t                                See if Locale::Maketext works
 dist/Locale-Maketext/t/30_eval_dollar_at.t             See if Locale::Maketext works
@@ -3898,24 +4087,33 @@ dist/Locale-Maketext/t/92_blacklist.t                   See if Locale::Maketext works
 dist/Locale-Maketext/t/93_whitelist.t                  See if Locale::Maketext works
 dist/Locale-Maketext/t/94_denylist.t                   See if Locale::Maketext works
 dist/Locale-Maketext/t/95_allowlist.t                  See if Locale::Maketext works
-dist/Module-CoreList/Changes                   Module::CoreList Changes
-dist/Module-CoreList/corelist                  The corelist command-line utility
-dist/Module-CoreList/identify-dependencies     A usage example for Module::CoreList
-dist/Module-CoreList/lib/Module/CoreList.pm    Module::CoreList
-dist/Module-CoreList/lib/Module/CoreList.pod   Module::CoreList
+dist/Math-Complex/ChangeLog            History of changes for Math::Complex
+dist/Math-Complex/lib/Math/Complex.pm  A package for doing math with complex numbers
+dist/Math-Complex/lib/Math/Trig.pm     A simple interface to complex trigonometry
+dist/Math-Complex/Makefile.PL          Build Math::Complex
+dist/Math-Complex/t/Complex.t          See if Math::Complex works
+dist/Math-Complex/t/Trig.t             See if Math::Trig works
+dist/Math-Complex/t/underbar.t         See if Math::Complex works
+dist/Math-Complex/TODO                 TODO for Math::Complex
+dist/Module-CoreList/Changes                           Module::CoreList Changes
+dist/Module-CoreList/corelist                          The corelist command-line utility
+dist/Module-CoreList/identify-dependencies             A usage example for Module::CoreList
+dist/Module-CoreList/lib/Module/CoreList.pm            Module::CoreList
+dist/Module-CoreList/lib/Module/CoreList.pod           Module::CoreList
 dist/Module-CoreList/lib/Module/CoreList/Utils.pm      Module::CoreList guts
-dist/Module-CoreList/Makefile.PL               Module::CoreList
-dist/Module-CoreList/MANIFEST                  Module::CoreList
-dist/Module-CoreList/README                    Module::CoreList
-dist/Module-CoreList/t/corelist.t              Module::CoreList tests
-dist/Module-CoreList/t/deprecated.t            Module::CoreList tests
-dist/Module-CoreList/t/find_modules.t          Module::CoreList tests
-dist/Module-CoreList/t/is_core.t               Module::CoreList tests
+dist/Module-CoreList/Makefile.PL                       Module::CoreList
+dist/Module-CoreList/MANIFEST                          Module::CoreList
+dist/Module-CoreList/README                            Module::CoreList
+dist/Module-CoreList/t/corelist.t                      Module::CoreList tests
+dist/Module-CoreList/t/deprecated.t                    Module::CoreList tests
+dist/Module-CoreList/t/find_modules.t                  Module::CoreList tests
+dist/Module-CoreList/t/is_core.t                       Module::CoreList tests
 dist/Module-CoreList/t/maintainer.t                    Module::CoreList tests
-dist/Module-CoreList/t/pod.t                   Module::CoreList tests
-dist/Module-CoreList/t/utils.t                 Module::CoreList tests
+dist/Module-CoreList/t/pod.t                           Module::CoreList tests
+dist/Module-CoreList/t/utils.t                         Module::CoreList tests
 dist/Net-Ping/Changes                  Net::Ping
 dist/Net-Ping/lib/Net/Ping.pm          Hello, anybody home?
+dist/Net-Ping/Makefile.PL              Build Net::Ping
 dist/Net-Ping/t/000_load.t
 dist/Net-Ping/t/001_new.t
 dist/Net-Ping/t/010_pingecho.t
@@ -3924,7 +4122,7 @@ dist/Net-Ping/t/120_udp_inst.t            Ping Net::Ping
 dist/Net-Ping/t/130_tcp_inst.t         Ping Net::Ping
 dist/Net-Ping/t/140_stream_inst.t      Ping Net::Ping
 dist/Net-Ping/t/150_syn_inst.t         Ping Net::Ping
-dist/Net-Ping/t/190_alarm.t                    Ping Net::Ping
+dist/Net-Ping/t/190_alarm.t            Ping Net::Ping
 dist/Net-Ping/t/200_ping_tcp.t         Ping Net::Ping
 dist/Net-Ping/t/250_ping_hires.t       Ping Net::Ping
 dist/Net-Ping/t/300_ping_stream.t      Ping Net::Ping
@@ -3936,12 +4134,13 @@ dist/Net-Ping/t/500_ping_icmp.t         Ping Net::Ping
 dist/Net-Ping/t/501_ping_icmpv6.t      Ping Net::Ping
 dist/Net-Ping/t/510_ping_udp.t         Ping Net::Ping
 dist/Net-Ping/t/520_icmp_ttl.t         Ping Net::Ping
-dist/PathTools/Changes                 Changelog for PathTools dist
+dist/Net-Ping/TODO                     TODO list for Net::Ping
+dist/PathTools/Changes                         Changelog for PathTools dist
 dist/PathTools/Cwd.pm                          Various cwd routines (getcwd, fastcwd, chdir)
 dist/PathTools/Cwd.xs                          Cwd extension external subroutines
-dist/PathTools/lib/File/Spec.pm                portable operations on file names
+dist/PathTools/lib/File/Spec.pm                        portable operations on file names
 dist/PathTools/lib/File/Spec/AmigaOS.pm                portable operations on AmigaOS file names
-dist/PathTools/lib/File/Spec/Cygwin.pm portable operations on Cygwin file names
+dist/PathTools/lib/File/Spec/Cygwin.pm         portable operations on Cygwin file names
 dist/PathTools/lib/File/Spec/Epoc.pm           portable operations on EPOC file names
 dist/PathTools/lib/File/Spec/Functions.pm      Function interface to File::Spec object methods
 dist/PathTools/lib/File/Spec/Mac.pm            portable operations on Mac file names
@@ -3950,45 +4149,47 @@ dist/PathTools/lib/File/Spec/Unix.pm            portable operations on Unix file names
 dist/PathTools/lib/File/Spec/VMS.pm            portable operations on VMS file names
 dist/PathTools/lib/File/Spec/Win32.pm          portable operations on Win32 and NetWare file names
 dist/PathTools/Makefile.PL                     makefile writer for Cwd
-dist/PathTools/MANIFEST                MANIFEST for PathTools
-dist/PathTools/META.json               META.json for PathTools
-dist/PathTools/META.yml                META.yml for PathTools
-dist/PathTools/t/abs2rel.t             See if File::Spec->abs2rel works
+dist/PathTools/MANIFEST                                MANIFEST for PathTools
+dist/PathTools/META.json                       META.json for PathTools
+dist/PathTools/META.yml                                META.yml for PathTools
+dist/PathTools/t/abs2rel.t                     See if File::Spec->abs2rel works
 dist/PathTools/t/crossplatform.t               See if File::Spec works crossplatform
-dist/PathTools/t/cwd.t                 See if Cwd works
+dist/PathTools/t/cwd.t                         See if Cwd works
 dist/PathTools/t/cwd_enoent.t                  See if getcwd errors correctly
 dist/PathTools/t/Functions.t                   See if File::Spec::Functions works
-dist/PathTools/t/rel2abs2rel.t         See if File::Spec->rel2abs/abs2rel works
-dist/PathTools/t/Spec.t                        See if File::Spec works
+dist/PathTools/t/rel2abs2rel.t                 See if File::Spec->rel2abs/abs2rel works
+dist/PathTools/t/Spec.t                                See if File::Spec works
 dist/PathTools/t/Spec-taint.t                  See if File::Spec works with taint
 dist/PathTools/t/taint.t                       See if Cwd works with taint
 dist/PathTools/t/tmpdir.t                      See if File::Spec->tmpdir() works
 dist/PathTools/t/win32.t                       See if Cwd works on Win32
-dist/Safe/Changes              Changes for Safe.pm
-dist/Safe/Makefile.PL          Makefile.PL for Safe.pm
-dist/Safe/MANIFEST             MANIFEST for Safe.pm
-dist/Safe/META.yml             META.yml for Safe.pm
-dist/Safe/README               README for Safe.pm
-dist/Safe/Safe.pm              Safe extension Perl module
-dist/Safe/t/safe1.t            See if Safe works
-dist/Safe/t/safe2.t            See if Safe works
-dist/Safe/t/safe3.t            See if Safe works
-dist/Safe/t/safeload.t         Tests that some modules can be loaded by Safe
-dist/Safe/t/safenamedcap.t     Tests that Tie::Hash::NamedCapture can be loaded
-dist/Safe/t/safeops.t          Tests that all ops can be trapped by Safe
-dist/Safe/t/saferegexp.t       Tests Safe with regular expressions
-dist/Safe/t/safesecurity.t     Tests misc. security fixes in Safe
-dist/Safe/t/safesort.t         Tests Safe with sort
-dist/Safe/t/safeuniversal.t    Tests Safe with functions from universal.c
-dist/Safe/t/safeutf8.t         Tests Safe with utf8.pm
-dist/Safe/t/safewrap.t         Tests Safe::wrap_code_ref()
+dist/Safe/Changes                      Changes for Safe.pm
+dist/Safe/Makefile.PL                  Makefile.PL for Safe.pm
+dist/Safe/MANIFEST                     MANIFEST for Safe.pm
+dist/Safe/META.yml                     META.yml for Safe.pm
+dist/Safe/README                       README for Safe.pm
+dist/Safe/Safe.pm                      Safe extension Perl module
+dist/Safe/t/safe1.t                    See if Safe works
+dist/Safe/t/safe2.t                    See if Safe works
+dist/Safe/t/safe3.t                    See if Safe works
+dist/Safe/t/safeload.t                 Tests that some modules can be loaded by Safe
+dist/Safe/t/safenamedcap.t             Tests that Tie::Hash::NamedCapture can be loaded
+dist/Safe/t/safeops.t                  Tests that all ops can be trapped by Safe
+dist/Safe/t/saferegexp.t               Tests Safe with regular expressions
+dist/Safe/t/safesecurity.t             Tests misc. security fixes in Safe
+dist/Safe/t/safesort.t                 Tests Safe with sort
+dist/Safe/t/safeuniversal.t            Tests Safe with functions from universal.c
+dist/Safe/t/safeutf8.t                 Tests Safe with utf8.pm
+dist/Safe/t/safewrap.t                 Tests Safe::wrap_code_ref()
 dist/Search-Dict/Changes               Change log
 dist/Search-Dict/lib/Search/Dict.pm    Perform binary search on dictionaries
 dist/Search-Dict/Makefile.PL           Makefile.PL
 dist/Search-Dict/README.patching       Patch instructions
 dist/Search-Dict/README.release                Release instructions
 dist/Search-Dict/t/Dict.t              See if Search::Dict works
+dist/SelfLoader/Changes                        History of changes for SelfLoader
 dist/SelfLoader/lib/SelfLoader.pm      Load functions only on demand
+dist/SelfLoader/Makefile.PL            Build SelfLoader
 dist/SelfLoader/t/01SelfLoader.t       See if SelfLoader works
 dist/SelfLoader/t/02SelfLoader-buggy.t See if SelfLoader works
 dist/SelfLoader/t/03taint.t            See if SelfLoader works under taint
@@ -4007,6 +4208,7 @@ dist/Storable/t/attach.t          Check STORABLE_attach doesn't create objects unnecessa
 dist/Storable/t/attach_errors.t                Trigger and test STORABLE_attach errors
 dist/Storable/t/attach_singleton.t     Test STORABLE_attach for the Singleton pattern
 dist/Storable/t/blessed.t              See if Storable works
+dist/Storable/t/boolean.t              See if Storable works
 dist/Storable/t/canonical.t            See if Storable works
 dist/Storable/t/circular_hook.t                Test thaw hook called depth-first for circular refs
 dist/Storable/t/code.t                 See if Storable works
@@ -4056,25 +4258,31 @@ dist/Storable/t/utf8hash.t              See if Storable works
 dist/Storable/t/weak.t                 Can Storable store weakrefs
 dist/Term-Complete/lib/Term/Complete.pm        A command completion subroutine
 dist/Term-Complete/t/Complete.t                See if Term::Complete works
-dist/Term-ReadLine/lib/Term/ReadLine.pm                Stub readline library
-dist/Term-ReadLine/t/AE.t                      See if Term::ReadLine works
-dist/Term-ReadLine/t/AETk.t                    See if Term::ReadLine works
-dist/Term-ReadLine/t/ReadLine.t                        See if Term::ReadLine works
-dist/Term-ReadLine/t/ReadLine-STDERR.t         See if Term::ReadLine works
-dist/Term-ReadLine/t/Tk.t                      See if Term::ReadLine works
-dist/Test/lib/Test.pm          A simple framework for writing test scripts
-dist/Test/t/05_about_verbose.t See if Test works
-dist/Test/t/fail.t             See if Test works
-dist/Test/t/mix.t              See if Test works
-dist/Test/t/multiline.t                See if Test works
-dist/Test/t/onfail.t           See if Test works
-dist/Test/t/qr.t               See if Test works
-dist/Test/t/skip.t             See if Test works
-dist/Test/t/success.t          See if Test works
-dist/Test/t/todo.t             See if Test works
-dist/Text-Abbrev/lib/Text/Abbrev.pm            An abbreviation table builder
+dist/Term-ReadLine/lib/Term/ReadLine.pm        Stub readline library
+dist/Term-ReadLine/t/AE.t              See if Term::ReadLine works
+dist/Term-ReadLine/t/AETk.t            See if Term::ReadLine works
+dist/Term-ReadLine/t/ReadLine.t                See if Term::ReadLine works
+dist/Term-ReadLine/t/ReadLine-STDERR.t See if Term::ReadLine works
+dist/Term-ReadLine/t/Tk.t              See if Term::ReadLine works
+dist/Test/ChangeLog                    History of changes for the Test module
+dist/Test/lib/Test.pm                  A simple framework for writing test scripts
+dist/Test/Makefile.PL                  Build the Test module
+dist/Test/t/05_about_verbose.t         See if Test works
+dist/Test/t/fail.t                     See if Test works
+dist/Test/t/mix.t                      See if Test works
+dist/Test/t/multiline.t                        See if Test works
+dist/Test/t/onfail.t                   See if Test works
+dist/Test/t/qr.t                       See if Test works
+dist/Test/t/skip.t                     See if Test works
+dist/Test/t/success.t                  See if Test works
+dist/Test/t/todo.t                     See if Test works
+dist/Text-Abbrev/lib/Text/Abbrev.pm    An abbreviation table builder
 dist/Text-Abbrev/t/Abbrev.t            Test Text::Abbrev
+dist/Thread-Queue/Changes              Thread-safe queues
+dist/Thread-Queue/examples/callback.pl Thread::Queue example script
+dist/Thread-Queue/examples/queue.pl    Thread::Queue example script
 dist/Thread-Queue/lib/Thread/Queue.pm  Thread-safe queues
+dist/Thread-Queue/Makefile.PL          Build Thread::Queue
 dist/Thread-Queue/t/01_basic.t         Thread::Queue tests
 dist/Thread-Queue/t/02_refs.t          Thread::Queue tests
 dist/Thread-Queue/t/03_peek.t          Thread::Queue tests
@@ -4084,68 +4292,74 @@ dist/Thread-Queue/t/06_insert.t         Thread::Queue tests
 dist/Thread-Queue/t/07_lock.t          Thread::Queue tests
 dist/Thread-Queue/t/08_nothreads.t     Thread::Queue tests
 dist/Thread-Queue/t/09_ended.t         Thread::Queue tests
-dist/Thread-Queue/t/10_timed.t Thread::Queue tests
-dist/Thread-Queue/t/11_limit.t Thread::Queue tests
+dist/Thread-Queue/t/10_timed.t         Thread::Queue tests
+dist/Thread-Queue/t/11_limit.t         Thread::Queue tests
+dist/Thread-Semaphore/Changes                  History of changes for Thread::Semaphore
+dist/Thread-Semaphore/examples/semaphore.pl    Thread::Semaphore example script
 dist/Thread-Semaphore/lib/Thread/Semaphore.pm  Thread-safe semaphores
+dist/Thread-Semaphore/Makefile.PL              Build Thread::Semaphore
 dist/Thread-Semaphore/t/01_basic.t             Thread::Semaphore tests
 dist/Thread-Semaphore/t/02_errs.t              Thread::Semaphore tests
 dist/Thread-Semaphore/t/03_nothreads.t         Thread::Semaphore tests
 dist/Thread-Semaphore/t/04_nonblocking.t       Thread::Semaphore tests
-dist/Thread-Semaphore/t/05_force.t     Thread::Semaphore tests
-dist/Thread-Semaphore/t/06_timed.t     Thread::Semaphore tests
-dist/threads/hints/hpux.pl     Hint file for HPUX
-dist/threads/hints/linux.pl    Hint file for Linux
+dist/Thread-Semaphore/t/05_force.t             Thread::Semaphore tests
+dist/Thread-Semaphore/t/06_timed.t             Thread::Semaphore tests
+dist/threads/hints/hpux.pl             Hint file for HPUX
+dist/threads/hints/linux.pl            Hint file for Linux
 dist/threads/lib/threads.pm            ithreads
-dist/threads/t/basic.t         ithreads
-dist/threads/t/blocks.t                Test threads in special blocks
-dist/threads/t/context.t       Explicit thread context
-dist/threads/t/end.t           Test end functions
-dist/threads/t/err.t           Test $thr->error()
-dist/threads/t/exit.t          Test exit and die in threads
-dist/threads/t/free.t          Test ithread destruction
-dist/threads/t/free2.t         More ithread destruction tests
-dist/threads/t/join.t          Testing the join function
-dist/threads/t/kill.t          Tests thread signalling
-dist/threads/t/kill2.t         Tests thread signalling
-dist/threads/t/kill3.t         Tests thread signalling
-dist/threads/t/libc.t          testing libc functions for threadsafety
-dist/threads/t/list.t          Test threads->list()
-dist/threads/t/no_threads.t    threads test for non-threaded Perls
-dist/threads/t/problems.t      Test various memory problems
-dist/threads/t/stack.t         Tests for stack limits
-dist/threads/t/stack_env.t     Tests for stack limits
-dist/threads/t/state.t         Tests state methods
-dist/threads/t/stress_cv.t     Test with multiple threads, coderef cv argument.
-dist/threads/t/stress_re.t     Test with multiple threads, string cv argument and regexes.
-dist/threads/t/stress_string.t Test with multiple threads, string cv argument.
-dist/threads/t/thread.t                General ithread tests from thr5005
+dist/threads/t/basic.t                 ithreads
+dist/threads/t/blocks.t                        Test threads in special blocks
+dist/threads/t/context.t               Explicit thread context
+dist/threads/t/end.t                   Test end functions
+dist/threads/t/err.t                   Test $thr->error()
+dist/threads/t/exit.t                  Test exit and die in threads
+dist/threads/t/free.t                  Test ithread destruction
+dist/threads/t/free2.t                 More ithread destruction tests
+dist/threads/t/join.t                  Testing the join function
+dist/threads/t/kill.t                  Tests thread signalling
+dist/threads/t/kill2.t                 Tests thread signalling
+dist/threads/t/kill3.t                 Tests thread signalling
+dist/threads/t/libc.t                  testing libc functions for threadsafety
+dist/threads/t/list.t                  Test threads->list()
+dist/threads/t/no_threads.t            threads test for non-threaded Perls
+dist/threads/t/problems.t              Test various memory problems
+dist/threads/t/stack.t                 Tests for stack limits
+dist/threads/t/stack_env.t             Tests for stack limits
+dist/threads/t/state.t                 Tests state methods
+dist/threads/t/stress_cv.t             Test with multiple threads, coderef cv argument.
+dist/threads/t/stress_re.t             Test with multiple threads, string cv argument and regexes.
+dist/threads/t/stress_string.t         Test with multiple threads, string cv argument.
+dist/threads/t/thread.t                        General ithread tests from thr5005
 dist/threads/t/unique.t                        Test unique attribute with threads
-dist/threads/threads.xs                ithreads
-dist/threads-shared/hints/linux.pl     thread shared variables
+dist/threads/t/version.t               Test that pod version matches code version.
+dist/threads/threads.h                 threads compatibility helper
+dist/threads/threads.xs                        ithreads
+dist/threads-shared/hints/linux.pl             thread shared variables
 dist/threads-shared/lib/threads/shared.pm      thread shared variables
-dist/threads-shared/shared.xs          thread shared variables
-dist/threads-shared/t/0nothread.t      Tests for basic shared array functionality.
-dist/threads-shared/t/av_refs.t                Tests for arrays containing references
-dist/threads-shared/t/av_simple.t      Tests for basic shared array functionality.
-dist/threads-shared/t/blessed.t                Test blessed shared variables
-dist/threads-shared/t/clone.t          Test shared cloning
-dist/threads-shared/t/cond.t           Test condition variables
-dist/threads-shared/t/disabled.t       Test threads::shared when threads are disabled.
-dist/threads-shared/t/dualvar.t        Test dual-valued variables
-dist/threads-shared/t/hv_refs.t                Test shared hashes containing references
-dist/threads-shared/t/hv_simple.t      Tests for basic shared hash functionality.
-dist/threads-shared/t/no_share.t       Tests for disabled share on variables.
-dist/threads-shared/t/object.t         Shared objects tests
-dist/threads-shared/t/object2.t        More shared objects tests
-dist/threads-shared/t/shared_attr.t    Test :shared attribute
-dist/threads-shared/t/stress.t         Stress test
-dist/threads-shared/t/sv_refs.t                thread shared variables
-dist/threads-shared/t/sv_simple.t      thread shared variables
-dist/threads-shared/t/utf8.t           Test UTF-8 keys in shared hashes
-dist/threads-shared/t/wait.t           Test cond_wait and cond_timedwait
-dist/threads-shared/t/waithires.t      Test sub-second cond_timedwait
+dist/threads-shared/shared.xs                  thread shared variables
+dist/threads-shared/t/0nothread.t              Tests for basic shared array functionality.
+dist/threads-shared/t/av_refs.t                        Tests for arrays containing references
+dist/threads-shared/t/av_simple.t              Tests for basic shared array functionality.
+dist/threads-shared/t/blessed.t                        Test blessed shared variables
+dist/threads-shared/t/clone.t                  Test shared cloning
+dist/threads-shared/t/cond.t                   Test condition variables
+dist/threads-shared/t/disabled.t               Test threads::shared when threads are disabled.
+dist/threads-shared/t/dualvar.t                        Test dual-valued variables
+dist/threads-shared/t/hv_refs.t                        Test shared hashes containing references
+dist/threads-shared/t/hv_simple.t              Tests for basic shared hash functionality.
+dist/threads-shared/t/no_share.t               Tests for disabled share on variables.
+dist/threads-shared/t/object.t                 Shared objects tests
+dist/threads-shared/t/object2.t                        More shared objects tests
+dist/threads-shared/t/shared_attr.t            Test :shared attribute
+dist/threads-shared/t/stress.t                 Stress test
+dist/threads-shared/t/sv_refs.t                        thread shared variables
+dist/threads-shared/t/sv_simple.t              thread shared variables
+dist/threads-shared/t/utf8.t                   Test UTF-8 keys in shared hashes
+dist/threads-shared/t/wait.t                   Test cond_wait and cond_timedwait
+dist/threads-shared/t/waithires.t              Test sub-second cond_timedwait
 dist/Tie-File/ChangeLog                        Tie::File
 dist/Tie-File/lib/Tie/File.pm          Files as tied arrays
+dist/Tie-File/Makefile.PL              Build Tie::File
 dist/Tie-File/t/01_gen.t               Generic read/write tests for Tie::File
 dist/Tie-File/t/02_fetchsize.t         File length fetch test for Tie::File
 dist/Tie-File/t/03_longfetch.t         Past-the-end-of-the-array tests for Tie::File
@@ -4223,255 +4437,247 @@ dist/Unicode-Normalize/t/func.t               Unicode::Normalize
 dist/Unicode-Normalize/t/illegal.t     Unicode::Normalize
 dist/Unicode-Normalize/t/norm.t                Unicode::Normalize
 dist/Unicode-Normalize/t/null.t                Unicode::Normalize
-dist/Unicode-Normalize/t/partial1.t            Unicode::Normalize
-dist/Unicode-Normalize/t/partial2.t            Unicode::Normalize
+dist/Unicode-Normalize/t/partial1.t    Unicode::Normalize
+dist/Unicode-Normalize/t/partial2.t    Unicode::Normalize
 dist/Unicode-Normalize/t/proto.t       Unicode::Normalize
 dist/Unicode-Normalize/t/split.t       Unicode::Normalize
 dist/Unicode-Normalize/t/test.t                Unicode::Normalize
 dist/Unicode-Normalize/t/tie.t         Unicode::Normalize
-dist/XSLoader/Makefile.PL      Dynamic Loader makefile writer
-dist/XSLoader/t/XSLoader.t     See if XSLoader works
-dist/XSLoader/XSLoader_pm.PL   Simple XS Loader perl module
-doio.c                 I/O operations
-doop.c                 Support code for various operations
-dosish.h               Some defines for MS/DOSish machines
-dquote.c               Functions for double quotish contexts
-dump.c                 Debugging output
-ebcdic_tables.h                Generated tables included in utfebcdic.h
-embed.fnc              Database used by embed.pl
-embed.h                        Maps symbols to safer names
-embedvar.h             C namespace management
+dist/XSLoader/Makefile.PL              Dynamic Loader makefile writer
+dist/XSLoader/t/XSLoader.t             See if XSLoader works
+dist/XSLoader/XSLoader_pm.PL           Simple XS Loader perl module
 ext/Amiga-ARexx/__examples/simplecommand.pl    Amiga::ARexx extension
 ext/Amiga-ARexx/__examples/simplehost.pl       Amiga::ARexx extension
-ext/Amiga-ARexx/ARexx.pm       Amiga::ARexx extension
-ext/Amiga-ARexx/ARexx.xs       Amiga::ARexx extension
-ext/Amiga-ARexx/Makefile.PL    Amiga::ARexx extension
+ext/Amiga-ARexx/ARexx.pm                       Amiga::ARexx extension
+ext/Amiga-ARexx/ARexx.xs                       Amiga::ARexx extension
+ext/Amiga-ARexx/Makefile.PL                    Amiga::ARexx extension
 ext/Amiga-ARexx/tagtypes.h                     Amiga::ARexx extension
-ext/Amiga-ARexx/typemap        Amiga::ARexx extension
+ext/Amiga-ARexx/typemap                                Amiga::ARexx extension
 ext/Amiga-Exec/__examples/simplecommand.pl     Amiga::Exec extension
 ext/Amiga-Exec/__examples/simplehost.pl                Amiga::Exec extension
-ext/Amiga-Exec/Exec.pm Amiga::Exec extension
-ext/Amiga-Exec/Exec.xs Amiga::Exec extension
+ext/Amiga-Exec/Exec.pm                         Amiga::Exec extension
+ext/Amiga-Exec/Exec.xs                         Amiga::Exec extension
 ext/Amiga-Exec/Makefile.PL                     Amiga::Exec extension
-ext/Amiga-Exec/tagtypes.h      Amiga::Exec extension
-ext/Amiga-Exec/typemap         Amiga::Exec extension
+ext/Amiga-Exec/tagtypes.h                      Amiga::Exec extension
+ext/Amiga-Exec/typemap                         Amiga::Exec extension
 ext/attributes/attributes.pm           For "sub foo : attrlist"
 ext/attributes/attributes.xs           For "sub foo : attrlist"
-ext/B/B.pm             Compiler backend support functions and methods
-ext/B/B.xs             Compiler backend external subroutines
-ext/B/B/Concise.pm     Compiler Concise backend
-ext/B/B/Showlex.pm     Compiler Showlex backend
-ext/B/B/Terse.pm       Compiler Terse backend
-ext/B/B/Xref.pm                Compiler Xref backend
-ext/B/hints/darwin.pl  Hints for named architecture
-ext/B/Makefile.PL      Compiler backend makefile writer
-ext/B/O.pm             Compiler front-end module (-MO=...)
-ext/B/t/b.t            See if B works
-ext/B/t/B/success.pm   Test module for ext/B/t/o.t
-ext/B/t/concise.t      See whether B::Concise works
-ext/B/t/concise-xs.t   See whether B::Concise recognizes XS functions
-ext/B/t/f_map                  code from perldoc -f map
-ext/B/t/f_map.t                        converted to optreeCheck()s
-ext/B/t/f_sort                 optree test raw material
-ext/B/t/f_sort.t               optree test raw material
-ext/B/t/invlist.t              test B::INVLIST
-ext/B/t/o.t            See if O works
-ext/B/t/optree_check.t         test OptreeCheck apparatus
-ext/B/t/optree_concise.t       more B::Concise tests
-ext/B/t/optree_constants.t     B::Concise rendering of optimized constant subs
-ext/B/t/optree_for.t           for loops
-ext/B/t/optree_misc.t          misc optree tests
-ext/B/t/optree_samples.t       various basic codes: if for while
-ext/B/t/optree_sort.t          inplace sort optimization regression
-ext/B/t/optree_specials.t      BEGIN, END, etc code
-ext/B/t/optree_varinit.t       my,our,local var init optimization
-ext/B/t/OptreeCheck.pm         optree comparison tool
-ext/B/t/perlstring.t   See if B::perlstring output roundtrips properly
-ext/B/t/pragma.t       See if user pragmas work.
-ext/B/t/showlex.t      See if B::ShowLex works
-ext/B/t/strict.t       See if B works with strict and warnings.
-ext/B/t/sv_stash.t     See if SvSTASH() works
-ext/B/t/terse.t                See if B::Terse works
-ext/B/t/walkoptree.t   See if B::walkoptree (and friends) work
-ext/B/t/xref.t         See if B::Xref works
-ext/B/typemap                  Compiler backend interface types
-ext/Devel-Peek/Changes         Data debugging tool, changelog
-ext/Devel-Peek/Peek.pm         Data debugging tool, module and pod
-ext/Devel-Peek/Peek.xs         Data debugging tool, externals
-ext/Devel-Peek/t/Peek.t                See if Devel::Peek works
-ext/DynaLoader/dl_aix.xs       AIX implementation
-ext/DynaLoader/dl_dllload.xs   S/390 dllload() style implementation
-ext/DynaLoader/dl_dlopen.xs    BSD/SunOS4&5 dlopen() style implementation
-ext/DynaLoader/dl_dyld.xs      NeXT/Apple dyld implementation
-ext/DynaLoader/dl_freemint.xs  GNU dld style implementation for FreeMINT
-ext/DynaLoader/dl_hpux.xs      HP-UX implementation
-ext/DynaLoader/dl_none.xs      Stub implementation
-ext/DynaLoader/dl_vms.xs       VMS implementation
-ext/DynaLoader/dl_win32.xs     Win32 implementation
-ext/DynaLoader/dlutils.c       Dynamic loader utilities for dl_*.xs files
-ext/DynaLoader/DynaLoader_pm.PL        Dynamic Loader perl module
-ext/DynaLoader/hints/aix.pl    Hint for DynaLoader for named architecture
-ext/DynaLoader/hints/android.pl        Hint for DynaLoader for named architecture
+ext/B/B.pm                             Compiler backend support functions and methods
+ext/B/B.xs                             Compiler backend external subroutines
+ext/B/B/Concise.pm                     Compiler Concise backend
+ext/B/B/Showlex.pm                     Compiler Showlex backend
+ext/B/B/Terse.pm                       Compiler Terse backend
+ext/B/B/Xref.pm                                Compiler Xref backend
+ext/B/hints/darwin.pl                  Hints for named architecture
+ext/B/hints/openbsd.pl                 Hints for named architecture
+ext/B/Makefile.PL                      Compiler backend makefile writer
+ext/B/O.pm                             Compiler front-end module (-MO=...)
+ext/B/t/b.t                            See if B works
+ext/B/t/B/success.pm                   Test module for ext/B/t/o.t
+ext/B/t/bool.t                         See if B works for bool
+ext/B/t/concise.t                      See whether B::Concise works
+ext/B/t/concise-xs.t                   See whether B::Concise recognizes XS functions
+ext/B/t/f_map                          code from perldoc -f map
+ext/B/t/f_map.t                                converted to optreeCheck()s
+ext/B/t/f_sort                         optree test raw material
+ext/B/t/f_sort.t                       optree test raw material
+ext/B/t/invlist.t                      test B::INVLIST
+ext/B/t/o.t                            See if O works
+ext/B/t/optree_check.t                 test OptreeCheck apparatus
+ext/B/t/optree_concise.t               more B::Concise tests
+ext/B/t/optree_constants.t             B::Concise rendering of optimized constant subs
+ext/B/t/optree_for.t                   for loops
+ext/B/t/optree_misc.t                  misc optree tests
+ext/B/t/optree_samples.t               various basic codes: if for while
+ext/B/t/optree_sort.t                  inplace sort optimization regression
+ext/B/t/optree_specials.t              BEGIN, END, etc code
+ext/B/t/optree_varinit.t               my,our,local var init optimization
+ext/B/t/OptreeCheck.pm                 optree comparison tool
+ext/B/t/perlstring.t                   See if B::perlstring output roundtrips properly
+ext/B/t/pragma.t                       See if user pragmas work.
+ext/B/t/showlex.t                      See if B::ShowLex works
+ext/B/t/strict.t                       See if B works with strict and warnings.
+ext/B/t/sv_stash.t                     See if SvSTASH() works
+ext/B/t/terse.t                                See if B::Terse works
+ext/B/t/walkoptree.t                   See if B::walkoptree (and friends) work
+ext/B/t/xref.t                         See if B::Xref works
+ext/B/typemap                          Compiler backend interface types
+ext/Devel-Peek/Changes                 Data debugging tool, changelog
+ext/Devel-Peek/Peek.pm                 Data debugging tool, module and pod
+ext/Devel-Peek/Peek.xs                 Data debugging tool, externals
+ext/Devel-Peek/t/Peek.t                        See if Devel::Peek works
+ext/DynaLoader/dl_aix.xs               AIX implementation
+ext/DynaLoader/dl_dllload.xs           S/390 dllload() style implementation
+ext/DynaLoader/dl_dlopen.xs            BSD/SunOS4&5 dlopen() style implementation
+ext/DynaLoader/dl_dyld.xs              NeXT/Apple dyld implementation
+ext/DynaLoader/dl_freemint.xs          GNU dld style implementation for FreeMINT
+ext/DynaLoader/dl_hpux.xs              HP-UX implementation
+ext/DynaLoader/dl_none.xs              Stub implementation
+ext/DynaLoader/dl_vms.xs               VMS implementation
+ext/DynaLoader/dl_win32.xs             Win32 implementation
+ext/DynaLoader/dlutils.c               Dynamic loader utilities for dl_*.xs files
+ext/DynaLoader/DynaLoader_pm.PL                Dynamic Loader perl module
+ext/DynaLoader/hints/aix.pl            Hint for DynaLoader for named architecture
+ext/DynaLoader/hints/android.pl                Hint for DynaLoader for named architecture
 ext/DynaLoader/hints/gnukfreebsd.pl    Hint for DynaLoader for named architecture
 ext/DynaLoader/hints/gnuknetbsd.pl     Hint for DynaLoader for named architecture
-ext/DynaLoader/hints/linux.pl  Hint for DynaLoader for named architecture
-ext/DynaLoader/hints/netbsd.pl Hint for DynaLoader for named architecture
-ext/DynaLoader/hints/openbsd.pl        Hint for DynaLoader for named architecture
-ext/DynaLoader/Makefile.PL     Dynamic Loader makefile writer
-ext/DynaLoader/README          Dynamic Loader notes and intro
-ext/DynaLoader/t/DynaLoader.t  See if DynaLoader works
-ext/Errno/ChangeLog    Errno changes
-ext/Errno/Errno_pm.PL  Errno perl module create script
-ext/Errno/Makefile.PL  Errno extension makefile writer
-ext/Errno/t/Errno.t    See if Errno works
+ext/DynaLoader/hints/linux.pl          Hint for DynaLoader for named architecture
+ext/DynaLoader/hints/netbsd.pl         Hint for DynaLoader for named architecture
+ext/DynaLoader/hints/openbsd.pl                Hint for DynaLoader for named architecture
+ext/DynaLoader/Makefile.PL             Dynamic Loader makefile writer
+ext/DynaLoader/README                  Dynamic Loader notes and intro
+ext/DynaLoader/t/DynaLoader.t          See if DynaLoader works
+ext/Errno/ChangeLog                    Errno changes
+ext/Errno/Errno_pm.PL                  Errno perl module create script
+ext/Errno/Makefile.PL                  Errno extension makefile writer
+ext/Errno/t/Errno.t                    See if Errno works
 ext/ExtUtils-Miniperl/lib/ExtUtils/Miniperl.pm Writes {mini,}perlmain.c
-ext/Fcntl/Fcntl.pm     Fcntl extension Perl module
-ext/Fcntl/Fcntl.xs     Fcntl extension external subroutines
-ext/Fcntl/Makefile.PL  Fcntl extension makefile writer
-ext/Fcntl/t/autoload.t See if Fcntl AUTOLOAD error messages work
-ext/Fcntl/t/fcntl.t    See if Fcntl works
-ext/Fcntl/t/mode.t     See if S_ISREG() and S_ISDIR() work
-ext/Fcntl/t/syslfs.t   See if large files work for sysio
+ext/Fcntl/Fcntl.pm                     Fcntl extension Perl module
+ext/Fcntl/Fcntl.xs                     Fcntl extension external subroutines
+ext/Fcntl/Makefile.PL                  Fcntl extension makefile writer
+ext/Fcntl/t/autoload.t                 See if Fcntl AUTOLOAD error messages work
+ext/Fcntl/t/fcntl.t                    See if Fcntl works
+ext/Fcntl/t/mode.t                     See if S_ISREG() and S_ISDIR() work
+ext/Fcntl/t/syslfs.t                   See if large files work for sysio
 ext/File-DosGlob/DosGlob.xs            Win32 DOS-globbing module
 ext/File-DosGlob/lib/File/DosGlob.pm   Win32 DOS-globbing module
 ext/File-DosGlob/t/DosGlob.t           See if File::DosGlob works
-ext/File-Find/lib/File/Find.pm Routines to do a find
-ext/File-Find/t/find.t         See if File::Find works
-ext/File-Find/t/lib/Testing.pm         Functions used in testing File-find
-ext/File-Find/t/taint.t                See if File::Find works with taint
-ext/File-Glob/bsd_glob.c       File::Glob extension run time code
-ext/File-Glob/bsd_glob.h       File::Glob extension header file
-ext/File-Glob/Changes          File::Glob extension changelog
-ext/File-Glob/Glob.pm          File::Glob extension module
-ext/File-Glob/Glob.xs          File::Glob extension external subroutines
-ext/File-Glob/Makefile.PL      File::Glob extension makefile writer
-ext/File-Glob/t/basic.t                See if File::Glob works
-ext/File-Glob/t/case.t         See if File::Glob works
-ext/File-Glob/t/global.t       See if File::Glob works
-ext/File-Glob/t/rt114984.t     See if File::Glob works
-ext/File-Glob/t/rt131211.t     See if File::Glob works
-ext/File-Glob/t/taint.t                See if File::Glob works
-ext/File-Glob/t/threads.t      See if File::Glob + threads works
-ext/File-Glob/TODO             File::Glob extension todo list
-ext/FileCache/lib/FileCache.pm Keep more files open than the system permits
-ext/FileCache/t/01open.t       See if FileCache works
-ext/FileCache/t/02maxopen.t    See if FileCache works
-ext/FileCache/t/03append.t     See if FileCache works
-ext/FileCache/t/04twoarg.t     See if FileCache works
-ext/FileCache/t/05override.t   See if FileCache works
-ext/FileCache/t/06export.t     See if FileCache exporting works
-ext/FileCache/t/07noimport.t   See if FileCache works without importing
-ext/GDBM_File/GDBM_File.pm     GDBM extension Perl module
-ext/GDBM_File/GDBM_File.xs     GDBM extension external subroutines
-ext/GDBM_File/hints/sco.pl     Hint for GDBM_File for named architecture
-ext/GDBM_File/Makefile.PL      GDBM extension makefile writer
-ext/GDBM_File/t/count.t                Test if the count method works
-ext/GDBM_File/t/dump.t         Test if export/import methods work
-ext/GDBM_File/t/fatal.t                Test the fatal_func argument to gdbm_open
-ext/GDBM_File/t/gdbm.t         See if GDBM_File works
-ext/GDBM_File/t/opt.t          Test if gdbm_setopt and derived methods work
-ext/GDBM_File/t/snapshot.t     Test if the latest_snapshot method works
-ext/GDBM_File/typemap          GDBM extension interface types
-ext/Hash-Util/Changes          Change history of Hash::Util
-ext/Hash-Util/lib/Hash/Util.pm Hash::Util
-ext/Hash-Util/Makefile.PL      Makefile for Hash::Util
-ext/Hash-Util/t/builtin.t      See if Hash::Util builtin exports work as expected
-ext/Hash-Util/t/Util.t         See if Hash::Util works
-ext/Hash-Util/Util.xs          XS bits of Hash::Util
-ext/Hash-Util-FieldHash/Changes                        Changes for Hash::Util::FieldHash
-ext/Hash-Util-FieldHash/FieldHash.xs           XS portion
+ext/File-Find/lib/File/Find.pm                         Routines to do a find
+ext/File-Find/t/correct-absolute-path-with-follow.t
+ext/File-Find/t/find.t                                 See if File::Find works
+ext/File-Find/t/lib/Testing.pm                         Functions used in testing File-find
+ext/File-Find/t/taint.t                                        See if File::Find works with taint
+ext/File-Glob/bsd_glob.c               File::Glob extension run time code
+ext/File-Glob/bsd_glob.h               File::Glob extension header file
+ext/File-Glob/Changes                  File::Glob extension changelog
+ext/File-Glob/Glob.pm                  File::Glob extension module
+ext/File-Glob/Glob.xs                  File::Glob extension external subroutines
+ext/File-Glob/Makefile.PL              File::Glob extension makefile writer
+ext/File-Glob/t/basic.t                        See if File::Glob works
+ext/File-Glob/t/case.t                 See if File::Glob works
+ext/File-Glob/t/global.t               See if File::Glob works
+ext/File-Glob/t/rt114984.t             See if File::Glob works
+ext/File-Glob/t/rt131211.t             See if File::Glob works
+ext/File-Glob/t/taint.t                        See if File::Glob works
+ext/File-Glob/t/threads.t              See if File::Glob + threads works
+ext/File-Glob/TODO                     File::Glob extension todo list
+ext/FileCache/lib/FileCache.pm         Keep more files open than the system permits
+ext/FileCache/t/01open.t               See if FileCache works
+ext/FileCache/t/02maxopen.t            See if FileCache works
+ext/FileCache/t/03append.t             See if FileCache works
+ext/FileCache/t/04twoarg.t             See if FileCache works
+ext/FileCache/t/05override.t           See if FileCache works
+ext/FileCache/t/06export.t             See if FileCache exporting works
+ext/FileCache/t/07noimport.t           See if FileCache works without importing
+ext/GDBM_File/GDBM_File.pm             GDBM extension Perl module
+ext/GDBM_File/GDBM_File.xs             GDBM extension external subroutines
+ext/GDBM_File/hints/sco.pl             Hint for GDBM_File for named architecture
+ext/GDBM_File/Makefile.PL              GDBM extension makefile writer
+ext/GDBM_File/t/count.t                        Test if the count method works
+ext/GDBM_File/t/dump.t                 Test if export/import methods work
+ext/GDBM_File/t/fatal.t                        Test the fatal_func argument to gdbm_open
+ext/GDBM_File/t/gdbm.t                 See if GDBM_File works
+ext/GDBM_File/t/opt.t                  Test if gdbm_setopt and derived methods work
+ext/GDBM_File/t/snapshot.t             Test if the latest_snapshot method works
+ext/GDBM_File/typemap                  GDBM extension interface types
+ext/Hash-Util/Changes                  Change history of Hash::Util
+ext/Hash-Util/lib/Hash/Util.pm         Hash::Util
+ext/Hash-Util/Makefile.PL              Makefile for Hash::Util
+ext/Hash-Util/t/builtin.t              See if Hash::Util builtin exports work as expected
+ext/Hash-Util/t/Util.t                 See if Hash::Util works
+ext/Hash-Util/Util.xs                  XS bits of Hash::Util
+ext/Hash-Util-FieldHash/Changes                                Changes for Hash::Util::FieldHash
+ext/Hash-Util-FieldHash/FieldHash.xs                   XS portion
 ext/Hash-Util-FieldHash/lib/Hash/Util/FieldHash.pm     Perl portion and documentation
-ext/Hash-Util-FieldHash/t/01_load.t            Test script
-ext/Hash-Util-FieldHash/t/02_function.t                Test script
-ext/Hash-Util-FieldHash/t/03_class.t           Test script
-ext/Hash-Util-FieldHash/t/04_thread.t          Test script
-ext/Hash-Util-FieldHash/t/05_perlhook.t                Test script
-ext/Hash-Util-FieldHash/t/11_hashassign.t      Adapted from t/op/hashassign.t
-ext/Hash-Util-FieldHash/t/12_hashwarn.t                Adapted from t/op/hashwarn.t
-ext/I18N-Langinfo/Langinfo.pm  I18N::Langinfo
-ext/I18N-Langinfo/Langinfo.xs  I18N::Langinfo
-ext/I18N-Langinfo/Makefile.PL  I18N::Langinfo
-ext/I18N-Langinfo/t/Langinfo.t See whether I18N::Langinfo works
-ext/IPC-Open3/lib/IPC/Open2.pm Open a two-ended pipe
-ext/IPC-Open3/lib/IPC/Open3.pm Open a three-ended pipe
-ext/IPC-Open3/t/fd.t           See if IPC::Open3 works w/ file descriptors
-ext/IPC-Open3/t/IPC-Open2.t    See if IPC::Open2 works
-ext/IPC-Open3/t/IPC-Open3.t    See if IPC::Open3 works
-ext/mro/Changes                        mro extension
-ext/mro/mro.pm                 mro extension
-ext/mro/mro.xs                 mro extension
-ext/NDBM_File/hints/cygwin.pl  Hint for NDBM_File for named architecture
-ext/NDBM_File/hints/dec_osf.pl Hint for NDBM_File for named architecture
-ext/NDBM_File/hints/dynixptx.pl        Hint for NDBM_File for named architecture
-ext/NDBM_File/hints/gnu.pl     Hint for NDBM_File for named architecture
+ext/Hash-Util-FieldHash/t/01_load.t                    Test script
+ext/Hash-Util-FieldHash/t/02_function.t                        Test script
+ext/Hash-Util-FieldHash/t/03_class.t                   Test script
+ext/Hash-Util-FieldHash/t/04_thread.t                  Test script
+ext/Hash-Util-FieldHash/t/05_perlhook.t                        Test script
+ext/Hash-Util-FieldHash/t/11_hashassign.t              Adapted from t/op/hashassign.t
+ext/Hash-Util-FieldHash/t/12_hashwarn.t                        Adapted from t/op/hashwarn.t
+ext/I18N-Langinfo/Langinfo.pm          I18N::Langinfo
+ext/I18N-Langinfo/Langinfo.xs          I18N::Langinfo
+ext/I18N-Langinfo/Makefile.PL          I18N::Langinfo
+ext/I18N-Langinfo/t/Langinfo.t         See whether I18N::Langinfo works
+ext/IPC-Open3/lib/IPC/Open2.pm         Open a two-ended pipe
+ext/IPC-Open3/lib/IPC/Open3.pm         Open a three-ended pipe
+ext/IPC-Open3/t/fd.t                   See if IPC::Open3 works w/ file descriptors
+ext/IPC-Open3/t/IPC-Open2.t            See if IPC::Open2 works
+ext/IPC-Open3/t/IPC-Open3.t            See if IPC::Open3 works
+ext/mro/Changes                                mro extension
+ext/mro/mro.pm                         mro extension
+ext/mro/mro.xs                         mro extension
+ext/NDBM_File/hints/cygwin.pl          Hint for NDBM_File for named architecture
+ext/NDBM_File/hints/dec_osf.pl         Hint for NDBM_File for named architecture
+ext/NDBM_File/hints/dynixptx.pl                Hint for NDBM_File for named architecture
+ext/NDBM_File/hints/gnu.pl             Hint for NDBM_File for named architecture
 ext/NDBM_File/hints/gnukfreebsd.pl     Hint for NDBM_File for named architecture
 ext/NDBM_File/hints/gnuknetbsd.pl      Hint for NDBM_File for named architecture
-ext/NDBM_File/hints/linux.pl   Hint for NDBM_File for named architecture
-ext/NDBM_File/hints/MSWin32.pl Hint for NDBM_File for named architecture
-ext/NDBM_File/hints/sco.pl     Hint for NDBM_File for named architecture
-ext/NDBM_File/hints/solaris.pl Hint for NDBM_File for named architecture
-ext/NDBM_File/hints/svr4.pl    Hint for NDBM_File for named architecture
-ext/NDBM_File/Makefile.PL      NDBM extension makefile writer
-ext/NDBM_File/NDBM_File.pm     NDBM extension Perl module
-ext/NDBM_File/NDBM_File.xs     NDBM extension external subroutines
-ext/NDBM_File/t/ndbm.t         See if NDBM_File works
-ext/NDBM_File/typemap          NDBM extension interface types
-ext/ODBM_File/hints/cygwin.pl  Hint for ODBM_File for named architecture
-ext/ODBM_File/hints/dec_osf.pl Hint for ODBM_File for named architecture
-ext/ODBM_File/hints/gnu.pl     Hint for ODBM_File for named architecture
+ext/NDBM_File/hints/linux.pl           Hint for NDBM_File for named architecture
+ext/NDBM_File/hints/MSWin32.pl         Hint for NDBM_File for named architecture
+ext/NDBM_File/hints/sco.pl             Hint for NDBM_File for named architecture
+ext/NDBM_File/hints/solaris.pl         Hint for NDBM_File for named architecture
+ext/NDBM_File/hints/svr4.pl            Hint for NDBM_File for named architecture
+ext/NDBM_File/Makefile.PL              NDBM extension makefile writer
+ext/NDBM_File/NDBM_File.pm             NDBM extension Perl module
+ext/NDBM_File/NDBM_File.xs             NDBM extension external subroutines
+ext/NDBM_File/t/ndbm.t                 See if NDBM_File works
+ext/NDBM_File/typemap                  NDBM extension interface types
+ext/ODBM_File/hints/cygwin.pl          Hint for ODBM_File for named architecture
+ext/ODBM_File/hints/dec_osf.pl         Hint for ODBM_File for named architecture
+ext/ODBM_File/hints/gnu.pl             Hint for ODBM_File for named architecture
 ext/ODBM_File/hints/gnukfreebsd.pl     Hint for NDBM_File for named architecture
 ext/ODBM_File/hints/gnuknetbsd.pl      Hint for NDBM_File for named architecture
-ext/ODBM_File/hints/hpux.pl    Hint for ODBM_File for named architecture
-ext/ODBM_File/hints/linux.pl   Hint for ODBM_File for named architecture
-ext/ODBM_File/hints/MSWin32.pl Hint for ODBM_File for named architecture
-ext/ODBM_File/hints/sco.pl     Hint for ODBM_File for named architecture
-ext/ODBM_File/hints/solaris.pl Hint for ODBM_File for named architecture
-ext/ODBM_File/hints/svr4.pl    Hint for ODBM_File for named architecture
-ext/ODBM_File/hints/ultrix.pl  Hint for ODBM_File for named architecture
-ext/ODBM_File/Makefile.PL      ODBM extension makefile writer
-ext/ODBM_File/ODBM_File.pm     ODBM extension Perl module
-ext/ODBM_File/ODBM_File.xs     ODBM extension external subroutines
-ext/ODBM_File/t/odbm.t         See if ODBM_File works
-ext/ODBM_File/typemap          ODBM extension interface types
-ext/Opcode/Opcode.pm           Opcode extension Perl module
-ext/Opcode/Opcode.xs           Opcode extension external subroutines
-ext/Opcode/ops.pm              "Pragma" form of Opcode extension Perl module
-ext/Opcode/t/Opcode.t          See if Opcode works
-ext/Opcode/t/ops.t             See if Opcode works
-ext/PerlIO-encoding/encoding.pm        PerlIO::encoding
-ext/PerlIO-encoding/encoding.xs        PerlIO::encoding
+ext/ODBM_File/hints/hpux.pl            Hint for ODBM_File for named architecture
+ext/ODBM_File/hints/linux.pl           Hint for ODBM_File for named architecture
+ext/ODBM_File/hints/MSWin32.pl         Hint for ODBM_File for named architecture
+ext/ODBM_File/hints/sco.pl             Hint for ODBM_File for named architecture
+ext/ODBM_File/hints/solaris.pl         Hint for ODBM_File for named architecture
+ext/ODBM_File/hints/svr4.pl            Hint for ODBM_File for named architecture
+ext/ODBM_File/Makefile.PL              ODBM extension makefile writer
+ext/ODBM_File/ODBM_File.pm             ODBM extension Perl module
+ext/ODBM_File/ODBM_File.xs             ODBM extension external subroutines
+ext/ODBM_File/t/odbm.t                 See if ODBM_File works
+ext/ODBM_File/typemap                  ODBM extension interface types
+ext/Opcode/Opcode.pm                   Opcode extension Perl module
+ext/Opcode/Opcode.xs                   Opcode extension external subroutines
+ext/Opcode/ops.pm                      "Pragma" form of Opcode extension Perl module
+ext/Opcode/t/Opcode.t                  See if Opcode works
+ext/Opcode/t/ops.t                     See if Opcode works
+ext/PerlIO-encoding/encoding.pm                PerlIO::encoding
+ext/PerlIO-encoding/encoding.xs                PerlIO::encoding
 ext/PerlIO-encoding/t/encoding.t       See if PerlIO encoding conversion works
 ext/PerlIO-encoding/t/fallback.t       See if PerlIO fallbacks work
 ext/PerlIO-encoding/t/nolooping.t      Tests for PerlIO::encoding
 ext/PerlIO-encoding/t/threads.t                Tests PerlIO::encoding and threads
-ext/PerlIO-mmap/mmap.pm        PerlIO layer for memory maps
-ext/PerlIO-mmap/mmap.xs        PerlIO layer for memory maps
-ext/PerlIO-scalar/scalar.pm    PerlIO layer for scalars
-ext/PerlIO-scalar/scalar.xs    PerlIO layer for scalars
-ext/PerlIO-scalar/t/scalar.t   See if PerlIO::scalar works
+ext/PerlIO-mmap/mmap.pm                        PerlIO layer for memory maps
+ext/PerlIO-mmap/mmap.xs                        PerlIO layer for memory maps
+ext/PerlIO-scalar/scalar.pm            PerlIO layer for scalars
+ext/PerlIO-scalar/scalar.xs            PerlIO layer for scalars
+ext/PerlIO-scalar/t/scalar.t           See if PerlIO::scalar works
 ext/PerlIO-scalar/t/scalar_ungetc.t    Tests for PerlIO layer for scalars
-ext/PerlIO-via/hints/aix.pl    Hint for PerlIO::via for named architecture
+ext/PerlIO-via/hints/aix.pl            Hint for PerlIO::via for named architecture
 ext/PerlIO-via/t/thread.t              See if PerlIO::via works with threads
-ext/PerlIO-via/t/via.t         See if PerlIO::via works
-ext/PerlIO-via/via.pm          PerlIO layer for layers in perl
-ext/PerlIO-via/via.xs          PerlIO layer for layers in perl
+ext/PerlIO-via/t/via.t                 See if PerlIO::via works
+ext/PerlIO-via/via.pm                  PerlIO layer for layers in perl
+ext/PerlIO-via/via.xs                  PerlIO layer for layers in perl
 ext/Pod-Functions/Functions_pm.PL      Writes Functions.pm
 ext/Pod-Functions/Makefile.PL          Makefile writer
 ext/Pod-Functions/t/Functions.t                See if Pod::Functions works
-ext/Pod-Html/bin/pod2html      Translator to turn pod into HTML
+ext/Pod-Html/bin/pod2html                      Translator to turn pod into HTML
 ext/Pod-Html/corpus/perlpodspec-copy.pod
 ext/Pod-Html/corpus/perlvar-copy.pod
-ext/Pod-Html/lib/Pod/Html.pm   Convert POD data to HTML
-ext/Pod-Html/lib/Pod/Html/Util.pm      Helper functions for Pod-Html
+ext/Pod-Html/lib/Pod/Html.pm                   Convert POD data to HTML
+ext/Pod-Html/lib/Pod/Html/Util.pm              Helper functions for Pod-Html
 ext/Pod-Html/t/anchorify.t
-ext/Pod-Html/t/anchorify-536.t Test Pod-Html utility functions during perl-5.36
 ext/Pod-Html/t/cache.pod
 ext/Pod-Html/t/cache.t
 ext/Pod-Html/t/crossref.pod
 ext/Pod-Html/t/crossref.t
 ext/Pod-Html/t/crossref2.t
 ext/Pod-Html/t/crossref3.t
-ext/Pod-Html/t/eol.t           test end of line agnosticism
+ext/Pod-Html/t/eol.t                           test end of line agnosticism
 ext/Pod-Html/t/feature.pod
 ext/Pod-Html/t/feature.t
 ext/Pod-Html/t/feature2.pod
@@ -4486,2481 +4692,1799 @@ ext/Pod-Html/t/htmldir4.pod
 ext/Pod-Html/t/htmldir4.t
 ext/Pod-Html/t/htmldir5.pod
 ext/Pod-Html/t/htmldir5.t
-ext/Pod-Html/t/htmlescp.pod    pod2html escape test input data
-ext/Pod-Html/t/htmlescp.t      pod2html escape test
-ext/Pod-Html/t/htmllink.pod    pod2html link test input data
-ext/Pod-Html/t/htmllink.t      pod2html link test
-ext/Pod-Html/t/htmlview.pod    pod2html render test input data
-ext/Pod-Html/t/htmlview.t      pod2html render test
-ext/Pod-Html/t/lib/Testing.pm  Testing functions for Pod-Html
+ext/Pod-Html/t/htmlescp.pod                    pod2html escape test input data
+ext/Pod-Html/t/htmlescp.t                      pod2html escape test
+ext/Pod-Html/t/htmllink.pod                    pod2html link test input data
+ext/Pod-Html/t/htmllink.t                      pod2html link test
+ext/Pod-Html/t/htmlview.pod                    pod2html render test input data
+ext/Pod-Html/t/htmlview.t                      pod2html render test
+ext/Pod-Html/t/lib/Testing.pm                  Testing functions for Pod-Html
 ext/Pod-Html/t/poderr.pod
 ext/Pod-Html/t/poderr.t
 ext/Pod-Html/t/podnoerr.pod
 ext/Pod-Html/t/podnoerr.t
-ext/POSIX/hints/bsdos.pl       Hint for POSIX for named architecture
-ext/POSIX/hints/dynixptx.pl    Hint for POSIX for named architecture
-ext/POSIX/hints/freebsd.pl     Hint for POSIX for named architecture
-ext/POSIX/hints/gnukfreebsd.pl Hint for POSIX for named architecture
-ext/POSIX/hints/gnuknetbsd.pl  Hint for POSIX for named architecture
-ext/POSIX/hints/linux.pl       Hint for POSIX for named architecture
-ext/POSIX/hints/mint.pl                Hint for POSIX for named architecture
-ext/POSIX/hints/netbsd.pl      Hint for POSIX for named architecture
-ext/POSIX/hints/openbsd.pl     Hint for POSIX for named architecture
-ext/POSIX/hints/sunos_4.pl     Hint for POSIX for named architecture
-ext/POSIX/hints/svr4.pl                Hint for POSIX for named architecture
-ext/POSIX/lib/POSIX.pm         POSIX extension Perl module
-ext/POSIX/lib/POSIX.pod                POSIX extension documentation
-ext/POSIX/Makefile.PL          POSIX extension makefile writer
-ext/POSIX/POSIX.xs             POSIX extension external subroutines
-ext/POSIX/t/export.t           Test @EXPORT and @EXPORT_OK
-ext/POSIX/t/fenv.t             Floating-point rounding mode tests for POSIX
-ext/POSIX/t/iscrash            See if POSIX isxxx() crashes with threads on Win32
-ext/POSIX/t/iv_const.t         See if integer constants of POSIX are IV
-ext/POSIX/t/math.t             Basic math tests for POSIX
-ext/POSIX/t/mb.t               Multibyte function tests for POSIX
-ext/POSIX/t/posix.t            See if POSIX works
-ext/POSIX/t/sigaction.t                See if POSIX::sigaction works
-ext/POSIX/t/sigset.t           See if POSIX::SigSet works
-ext/POSIX/t/strerror_errno.t   See if POSIX:strerror doesn't trash $!
-ext/POSIX/t/sysconf.t          See if POSIX works
-ext/POSIX/t/taint.t            See if POSIX works with taint
-ext/POSIX/t/termios.t          See if POSIX works
-ext/POSIX/t/time.t             See if POSIX time-related functions work
-ext/POSIX/t/unimplemented.t    Test the diagnostics for unimplemented functions
-ext/POSIX/t/usage.t            Test the diagnostics for usage messages
-ext/POSIX/t/waitpid.t          See if waitpid works
-ext/POSIX/t/wrappers.t         Test the POSIX wrapper subroutines
-ext/POSIX/typemap              POSIX extension interface types
-ext/re/Makefile.PL             re extension makefile writer
-ext/re/re.pm                   re extension Perl module
-ext/re/re.xs                   re extension external subroutines
-ext/re/re_comp.h               re extension wrapper for regcomp.h
-ext/re/re_top.h                        re extension symbol hiding header
-ext/re/t/lexical_debug.pl      generate debug output for lexical re 'debug'
-ext/re/t/lexical_debug.t       test that lexical re 'debug' works
-ext/re/t/qr.t                  test that qr// is a Regexp
-ext/re/t/re.t                  see if re pragma works
-ext/re/t/re_funcs.t            See if exportable 're' funcs in re.xs work
-ext/re/t/re_funcs_u.t          See if exportable 're' funcs in universal.c work
-ext/re/t/reflags.t             see if re '/xism' pragma works
-ext/re/t/regop.pl              generate debug output for various patterns
-ext/re/t/regop.t               test RE optimizations by scraping debug output
-ext/re/t/strict.t              see if re 'strict' subpragma works
-ext/SDBM_File/biblio   SDBM kit
-ext/SDBM_File/CHANGES  SDBM kit
-ext/SDBM_File/dba.c    SDBM kit
-ext/SDBM_File/dbd.c    SDBM kit
-ext/SDBM_File/dbe.1    SDBM kit
-ext/SDBM_File/dbe.c    SDBM kit
-ext/SDBM_File/dbu.c    SDBM kit
-ext/SDBM_File/grind    SDBM kit
-ext/SDBM_File/hash.c   SDBM kit
-ext/SDBM_File/Makefile.PL      SDBM extension makefile writer
-ext/SDBM_File/pair.c   SDBM kit
-ext/SDBM_File/pair.h   SDBM kit
-ext/SDBM_File/README   SDBM kit
-ext/SDBM_File/readme.ms        SDBM kit
-ext/SDBM_File/README.too       SDBM kit
-ext/SDBM_File/sdbm.3   SDBM kit
-ext/SDBM_File/sdbm.c   SDBM kit
-ext/SDBM_File/sdbm.h   SDBM kit
-ext/SDBM_File/SDBM_File.pm     SDBM extension Perl module
-ext/SDBM_File/SDBM_File.xs     SDBM extension external subroutines
-ext/SDBM_File/t/constants.t    See if SDBM_File constants work
-ext/SDBM_File/t/corrupt.t      See if SDBM_File handles corrupt files
-ext/SDBM_File/t/prep.t         See if SDBM_File with extra argument works
-ext/SDBM_File/t/sdbm.t         See if SDBM_File works
-ext/SDBM_File/tune.h   SDBM kit
-ext/SDBM_File/typemap          SDBM extension interface types
-ext/SDBM_File/util.c   SDBM kit
-ext/Sys-Hostname/Hostname.pm   Sys::Hostname extension Perl module
-ext/Sys-Hostname/Hostname.xs   Sys::Hostname extension external subroutines
-ext/Sys-Hostname/t/Hostname.t  See if Sys::Hostname works
+ext/POSIX/hints/bsdos.pl               Hint for POSIX for named architecture
+ext/POSIX/hints/dynixptx.pl            Hint for POSIX for named architecture
+ext/POSIX/hints/freebsd.pl             Hint for POSIX for named architecture
+ext/POSIX/hints/gnukfreebsd.pl         Hint for POSIX for named architecture
+ext/POSIX/hints/gnuknetbsd.pl          Hint for POSIX for named architecture
+ext/POSIX/hints/linux.pl               Hint for POSIX for named architecture
+ext/POSIX/hints/mint.pl                        Hint for POSIX for named architecture
+ext/POSIX/hints/netbsd.pl              Hint for POSIX for named architecture
+ext/POSIX/hints/openbsd.pl             Hint for POSIX for named architecture
+ext/POSIX/hints/sunos_4.pl             Hint for POSIX for named architecture
+ext/POSIX/hints/svr4.pl                        Hint for POSIX for named architecture
+ext/POSIX/lib/POSIX.pm                 POSIX extension Perl module
+ext/POSIX/lib/POSIX.pod                        POSIX extension documentation
+ext/POSIX/Makefile.PL                  POSIX extension makefile writer
+ext/POSIX/POSIX.xs                     POSIX extension external subroutines
+ext/POSIX/t/export.t                   Test @EXPORT and @EXPORT_OK
+ext/POSIX/t/fenv.t                     Floating-point rounding mode tests for POSIX
+ext/POSIX/t/iscrash                    See if POSIX isxxx() crashes with threads on Win32
+ext/POSIX/t/iv_const.t                 See if integer constants of POSIX are IV
+ext/POSIX/t/math.t                     Basic math tests for POSIX
+ext/POSIX/t/mb.t                       Multibyte function tests for POSIX
+ext/POSIX/t/posix.t                    See if POSIX works
+ext/POSIX/t/sigaction.t                        See if POSIX::sigaction works
+ext/POSIX/t/sigset.t                   See if POSIX::SigSet works
+ext/POSIX/t/strerror_errno.t           See if POSIX:strerror doesn't trash $!
+ext/POSIX/t/sysconf.t                  See if POSIX works
+ext/POSIX/t/taint.t                    See if POSIX works with taint
+ext/POSIX/t/termios.t                  See if POSIX works
+ext/POSIX/t/time.t                     See if POSIX time-related functions work
+ext/POSIX/t/unimplemented.t            Test the diagnostics for unimplemented functions
+ext/POSIX/t/usage.t                    Test the diagnostics for usage messages
+ext/POSIX/t/waitpid.t                  See if waitpid works
+ext/POSIX/t/wrappers.t                 Test the POSIX wrapper subroutines
+ext/POSIX/typemap                      POSIX extension interface types
+ext/re/Makefile.PL                     re extension makefile writer
+ext/re/re.pm                           re extension Perl module
+ext/re/re.xs                           re extension external subroutines
+ext/re/re_comp.h                       re extension wrapper for regcomp.h
+ext/re/re_top.h                                re extension symbol hiding header
+ext/re/t/intflags.pl                   Program used by intflags.t
+ext/re/t/intflags.t                    Test that intflags are serialized properly
+ext/re/t/lexical_debug.pl              generate debug output for lexical re 'debug'
+ext/re/t/lexical_debug.t               test that lexical re 'debug' works
+ext/re/t/qr.t                          test that qr// is a Regexp
+ext/re/t/re.t                          see if re pragma works
+ext/re/t/re_funcs.t                    See if exportable 're' funcs in re.xs work
+ext/re/t/re_funcs_u.t                  See if exportable 're' funcs in universal.c work
+ext/re/t/reflags.t                     see if re '/xism' pragma works
+ext/re/t/regop.pl                      generate debug output for various patterns
+ext/re/t/regop.t                       test RE optimizations by scraping debug output
+ext/re/t/strict.t                      see if re 'strict' subpragma works
+ext/SDBM_File/biblio                   SDBM kit
+ext/SDBM_File/CHANGES                  SDBM kit
+ext/SDBM_File/dba.c                    SDBM kit
+ext/SDBM_File/dbd.c                    SDBM kit
+ext/SDBM_File/dbe.1                    SDBM kit
+ext/SDBM_File/dbe.c                    SDBM kit
+ext/SDBM_File/dbu.c                    SDBM kit
+ext/SDBM_File/grind                    SDBM kit
+ext/SDBM_File/hash.c                   SDBM kit
+ext/SDBM_File/Makefile.PL              SDBM extension makefile writer
+ext/SDBM_File/pair.c                   SDBM kit
+ext/SDBM_File/pair.h                   SDBM kit
+ext/SDBM_File/README                   SDBM kit
+ext/SDBM_File/readme.ms                        SDBM kit
+ext/SDBM_File/README.too               SDBM kit
+ext/SDBM_File/sdbm.3                   SDBM kit
+ext/SDBM_File/sdbm.c                   SDBM kit
+ext/SDBM_File/sdbm.h                   SDBM kit
+ext/SDBM_File/SDBM_File.pm             SDBM extension Perl module
+ext/SDBM_File/SDBM_File.xs             SDBM extension external subroutines
+ext/SDBM_File/t/constants.t            See if SDBM_File constants work
+ext/SDBM_File/t/corrupt.t              See if SDBM_File handles corrupt files
+ext/SDBM_File/t/prep.t                 See if SDBM_File with extra argument works
+ext/SDBM_File/t/sdbm.t                 See if SDBM_File works
+ext/SDBM_File/tune.h                   SDBM kit
+ext/SDBM_File/typemap                  SDBM extension interface types
+ext/SDBM_File/util.c                   SDBM kit
+ext/Sys-Hostname/Hostname.pm           Sys::Hostname extension Perl module
+ext/Sys-Hostname/Hostname.xs           Sys::Hostname extension external subroutines
+ext/Sys-Hostname/t/Hostname.t          See if Sys::Hostname works
 ext/Tie-Hash-NamedCapture/NamedCapture.pm      Implements %- and %+ behaviour
 ext/Tie-Hash-NamedCapture/t/tiehash.t          Tests TIEHASH
 ext/Tie-Memoize/lib/Tie/Memoize.pm     Base class for memoized tied hashes
 ext/Tie-Memoize/t/Tie-Memoize.t                Test for Tie::Memoize
-ext/VMS-DCLsym/0README.txt     ReadMe file for VMS::DCLsym
-ext/VMS-DCLsym/DCLsym.pm       Perl access to CLI symbols
-ext/VMS-DCLsym/DCLsym.xs       Perl access to CLI symbols
-ext/VMS-DCLsym/Makefile.PL     MakeMaker driver for VMS::DCLsym
-ext/VMS-DCLsym/t/vms_dclsym.t  regression tests for VMS::DCLsym
+ext/VMS-DCLsym/0README.txt             ReadMe file for VMS::DCLsym
+ext/VMS-DCLsym/DCLsym.pm               Perl access to CLI symbols
+ext/VMS-DCLsym/DCLsym.xs               Perl access to CLI symbols
+ext/VMS-DCLsym/Makefile.PL             MakeMaker driver for VMS::DCLsym
+ext/VMS-DCLsym/t/vms_dclsym.t          regression tests for VMS::DCLsym
 ext/VMS-Filespec/lib/VMS/Filespec.pm   VMS-Unix file syntax interconversion
 ext/VMS-Filespec/t/filespec.t          See if VMS::Filespec functions work
-ext/VMS-Stdio/0README.txt      ReadMe file for VMS::Stdio
-ext/VMS-Stdio/Makefile.PL      MakeMaker driver for VMS::Stdio
-ext/VMS-Stdio/Stdio.pm         VMS options to stdio routines
-ext/VMS-Stdio/Stdio.xs         VMS options to stdio routines
-ext/VMS-Stdio/t/vms_stdio.t    regression tests for VMS::Stdio
-ext/Win32CORE/Makefile.PL      Win32CORE extension
-ext/Win32CORE/t/win32core.t    Win32CORE extension
-ext/Win32CORE/Win32CORE.c      Win32CORE extension
-ext/Win32CORE/Win32CORE.pm     Win32CORE extension (stubs for Win32 CORE subs)
-ext/XS-APItest/APItest.pm      XS::APItest extension
-ext/XS-APItest/APItest.xs      XS::APItest extension
-ext/XS-APItest/APItest_BS      autogenerate APItest.bs
-ext/XS-APItest/core.c          Test API functions when PERL_CORE is defined
-ext/XS-APItest/core_or_not.inc Code common to core.c and notcore.c
-ext/XS-APItest/exception.c     XS::APItest extension
-ext/XS-APItest/Makefile.PL     XS::APItest extension
-ext/XS-APItest/notcore.c       Test API functions when PERL_CORE is not defined
-ext/XS-APItest/numeric.xs      XS::APItest wrappers for numeric.c
-ext/XS-APItest/t/addissub.t    test op check wrapping
-ext/XS-APItest/t/arrayexpr.t   test recursive descent expression parsing
-ext/XS-APItest/t/autoload.t    Test XS AUTOLOAD routines
-ext/XS-APItest/t/BHK.pm                Helper for ./blockhooks.t
-ext/XS-APItest/t/Block.pm      Helper for ./blockhooks.t
-ext/XS-APItest/t/blockasexpr.t test recursive descent block parsing
-ext/XS-APItest/t/blockhooks.t  XS::APItest: tests for PL_blockhooks
-ext/XS-APItest/t/blockhooks-csc.t      XS::APItest: more tests for PL_blockhooks
-ext/XS-APItest/t/boolean.t     test SvIsBOOL
-ext/XS-APItest/t/boolean-thr.t test SvIsBOOL on threads
-ext/XS-APItest/t/bootstrap.t   XS::APItest: test APItest.bs
-ext/XS-APItest/t/call.t                Test calling perl from C
-ext/XS-APItest/t/call_checker.t        test call checker plugin API
-ext/XS-APItest/t/caller.t      XS::APItest: tests for caller_cx
-ext/XS-APItest/t/callregexec.t XS::APItest: tests for CALLREGEXEC()
-ext/XS-APItest/t/check_warnings.t      test scope of "Too late for CHECK"
-ext/XS-APItest/t/cleanup.t     test stack behaviour on unwinding
-ext/XS-APItest/t/clone-with-stack.t    test clone with CLONEf_COPY_STACKS works
-ext/XS-APItest/t/cophh.t       test COPHH API
-ext/XS-APItest/t/coplabel.t    test cop_*_label
-ext/XS-APItest/t/copstash.t    test alloccopstash
-ext/XS-APItest/t/copyhints.t   test hv_copy_hints_hv() API
-ext/XS-APItest/t/customop.t    XS::APItest: tests for custom ops
-ext/XS-APItest/t/cv_name.t     test cv_name
-ext/XS-APItest/t/delimcpy.t    test delimcpy
-ext/XS-APItest/t/eval-filter.t Simple source filter/eval test
-ext/XS-APItest/t/exception.t   XS::APItest extension
-ext/XS-APItest/t/extend.t      test EXTEND() macro
-ext/XS-APItest/t/fetch_pad_names.t     Tests for UTF8 names in pad
-ext/XS-APItest/t/get.t         test get_sv et al.
-ext/XS-APItest/t/gotosub.t     XS::APItest: tests goto &xsub and hints
-ext/XS-APItest/t/grok.t                XS::APItest: tests for grok* functions
-ext/XS-APItest/t/gv_autoload4.t        XS::APItest: tests for gv_autoload4() and variants
-ext/XS-APItest/t/gv_const_sv.t XS::APItest: test gv_const_sv()
-ext/XS-APItest/t/gv_fetchmeth.t                XS::APItest: tests for gv_fetchmeth() and variants
+ext/VMS-Stdio/0README.txt              ReadMe file for VMS::Stdio
+ext/VMS-Stdio/Makefile.PL              MakeMaker driver for VMS::Stdio
+ext/VMS-Stdio/Stdio.pm                 VMS options to stdio routines
+ext/VMS-Stdio/Stdio.xs                 VMS options to stdio routines
+ext/VMS-Stdio/t/vms_stdio.t            regression tests for VMS::Stdio
+ext/Win32CORE/Makefile.PL              Win32CORE extension
+ext/Win32CORE/t/win32core.t            Win32CORE extension
+ext/Win32CORE/Win32CORE.c              Win32CORE extension
+ext/Win32CORE/Win32CORE.pm             Win32CORE extension (stubs for Win32 CORE subs)
+ext/XS-APItest/APItest.pm                      XS::APItest extension
+ext/XS-APItest/APItest.xs                      XS::APItest extension
+ext/XS-APItest/APItest_BS                      autogenerate APItest.bs
+ext/XS-APItest/core.c                          Test API functions when PERL_CORE is defined
+ext/XS-APItest/core_or_not.inc                 Code common to core.c and notcore.c
+ext/XS-APItest/exception.c                     XS::APItest extension
+ext/XS-APItest/Makefile.PL                     XS::APItest extension
+ext/XS-APItest/notcore.c                       Test API functions when PERL_CORE is not defined
+ext/XS-APItest/numeric.xs                      XS::APItest wrappers for numeric.c
+ext/XS-APItest/t/addissub.t                    test op check wrapping
+ext/XS-APItest/t/arrayexpr.t                   test recursive descent expression parsing
+ext/XS-APItest/t/autoload.t                    Test XS AUTOLOAD routines
+ext/XS-APItest/t/BHK.pm                                Helper for ./blockhooks.t
+ext/XS-APItest/t/Block.pm                      Helper for ./blockhooks.t
+ext/XS-APItest/t/blockasexpr.t                 test recursive descent block parsing
+ext/XS-APItest/t/blockhooks.t                  XS::APItest: tests for PL_blockhooks
+ext/XS-APItest/t/blockhooks-csc.t              XS::APItest: more tests for PL_blockhooks
+ext/XS-APItest/t/boolean.t                     test SvIsBOOL
+ext/XS-APItest/t/boolean-thr.t                 test SvIsBOOL on threads
+ext/XS-APItest/t/bootstrap.t                   XS::APItest: test APItest.bs
+ext/XS-APItest/t/call.t                                Test calling perl from C
+ext/XS-APItest/t/call_checker.t                        test call checker plugin API
+ext/XS-APItest/t/caller.t                      XS::APItest: tests for caller_cx
+ext/XS-APItest/t/callregexec.t                 XS::APItest: tests for CALLREGEXEC()
+ext/XS-APItest/t/check_warnings.t              test scope of "Too late for CHECK"
+ext/XS-APItest/t/cleanup.t                     test stack behaviour on unwinding
+ext/XS-APItest/t/clone-with-stack.t            test clone with CLONEf_COPY_STACKS works
+ext/XS-APItest/t/cophh.t                       test COPHH API
+ext/XS-APItest/t/coplabel.t                    test cop_*_label
+ext/XS-APItest/t/copstash.t                    test alloccopstash
+ext/XS-APItest/t/copyhints.t                   test hv_copy_hints_hv() API
+ext/XS-APItest/t/customop.t                    XS::APItest: tests for custom ops
+ext/XS-APItest/t/cv_name.t                     test cv_name
+ext/XS-APItest/t/cv_refcounted_anysv.t         test CvREFCOUNTED_ANYSV
+ext/XS-APItest/t/delimcpy.t                    test delimcpy
+ext/XS-APItest/t/eval-filter.t                 Simple source filter/eval test
+ext/XS-APItest/t/exception.t                   XS::APItest extension
+ext/XS-APItest/t/extend.t                      test EXTEND() macro
+ext/XS-APItest/t/fetch_pad_names.t             Tests for UTF8 names in pad
+ext/XS-APItest/t/get.t                         test get_sv et al.
+ext/XS-APItest/t/gotosub.t                     XS::APItest: tests goto &xsub and hints
+ext/XS-APItest/t/grok.t                                XS::APItest: tests for grok* functions
+ext/XS-APItest/t/gv_autoload4.t                        XS::APItest: tests for gv_autoload4() and variants
+ext/XS-APItest/t/gv_const_sv.t                 XS::APItest: test gv_const_sv()
+ext/XS-APItest/t/gv_fetchmeth.t                        XS::APItest: tests for gv_fetchmeth() and variants
 ext/XS-APItest/t/gv_fetchmeth_autoload.t       XS::APItest: tests for gv_fetchmeth_autoload() and variants
-ext/XS-APItest/t/gv_fetchmethod_flags.t        XS::APItest: tests for gv_fetchmethod_flags() and variants
-ext/XS-APItest/t/gv_init.t     XS::APItest: tests for gv_init and variants
-ext/XS-APItest/t/handy00.t     XS::APItest: tests for handy.h
-ext/XS-APItest/t/handy01.t     XS::APItest: tests for handy.h
-ext/XS-APItest/t/handy02.t     XS::APItest: tests for handy.h
-ext/XS-APItest/t/handy03.t     XS::APItest: tests for handy.h
-ext/XS-APItest/t/handy04.t     XS::APItest: tests for handy.h
-ext/XS-APItest/t/handy05.t     XS::APItest: tests for handy.h
-ext/XS-APItest/t/handy06.t     XS::APItest: tests for handy.h
-ext/XS-APItest/t/handy07.t     XS::APItest: tests for handy.h
-ext/XS-APItest/t/handy08.t     XS::APItest: tests for handy.h
-ext/XS-APItest/t/handy09.t     XS::APItest: tests for handy.h
-ext/XS-APItest/t/handy_base.pl XS::APItest: tests for handy.h
-ext/XS-APItest/t/hash.t                XS::APItest: tests for hash related APIs
-ext/XS-APItest/t/hv_macro.t    XS::APItest: tests for low level macros used in hashing
-ext/XS-APItest/t/join_with_space.t     test op_convert_list
-ext/XS-APItest/t/keyword_multiline.t   test keyword plugin parsing across lines
-ext/XS-APItest/t/keyword_plugin.t      test keyword plugin mechanism
+ext/XS-APItest/t/gv_fetchmethod_flags.t                XS::APItest: tests for gv_fetchmethod_flags() and variants
+ext/XS-APItest/t/gv_init.t                     XS::APItest: tests for gv_init and variants
+ext/XS-APItest/t/handy00.t                     XS::APItest: tests for handy.h
+ext/XS-APItest/t/handy01.t                     XS::APItest: tests for handy.h
+ext/XS-APItest/t/handy02.t                     XS::APItest: tests for handy.h
+ext/XS-APItest/t/handy03.t                     XS::APItest: tests for handy.h
+ext/XS-APItest/t/handy04.t                     XS::APItest: tests for handy.h
+ext/XS-APItest/t/handy05.t                     XS::APItest: tests for handy.h
+ext/XS-APItest/t/handy06.t                     XS::APItest: tests for handy.h
+ext/XS-APItest/t/handy07.t                     XS::APItest: tests for handy.h
+ext/XS-APItest/t/handy08.t                     XS::APItest: tests for handy.h
+ext/XS-APItest/t/handy09.t                     XS::APItest: tests for handy.h
+ext/XS-APItest/t/handy_base.pl                 XS::APItest: tests for handy.h
+ext/XS-APItest/t/hash.t                                XS::APItest: tests for hash related APIs
+ext/XS-APItest/t/hv_macro.t                    XS::APItest: tests for low level macros used in hashing
+ext/XS-APItest/t/join_with_space.t             test op_convert_list
+ext/XS-APItest/t/keyword_multiline.t           test keyword plugin parsing across lines
+ext/XS-APItest/t/keyword_plugin.t              test keyword plugin mechanism
 ext/XS-APItest/t/keyword_plugin_threads.t      test keyword plugin loading from multiple threads
-ext/XS-APItest/t/labelconst.aux        auxiliary file for label test
-ext/XS-APItest/t/labelconst.t  test recursive descent label parsing
-ext/XS-APItest/t/labelconst_utf8.aux   auxiliary file for label test in UTF-8
-ext/XS-APItest/t/lexsub.t      Test XS registration of lexical subs
-ext/XS-APItest/t/load-module.t test load_module()
-ext/XS-APItest/t/locale.t      test locale-related things
-ext/XS-APItest/t/loopblock.t   test recursive descent block parsing
-ext/XS-APItest/t/looprest.t    test recursive descent statement-sequence parsing
-ext/XS-APItest/t/lvalue.t      Test XS lvalue functions
-ext/XS-APItest/t/magic.t       test attaching, finding, and removing magic
-ext/XS-APItest/t/magic_chain.t test low-level MAGIC chain handling
-ext/XS-APItest/t/Markers.pm    Helper for ./blockhooks.t
-ext/XS-APItest/t/mro.t         Test mro plugin api
-ext/XS-APItest/t/multicall.t   XS::APItest: test MULTICALL macros
-ext/XS-APItest/t/my_cxt.t      XS::APItest: test MY_CXT interface
-ext/XS-APItest/t/my_exit.t     XS::APItest: test my_exit
-ext/XS-APItest/t/my_strtod.t   XS::APItest: test my_strtod
-ext/XS-APItest/t/newCONSTSUB.t XS::APItest: test newCONSTSUB(_flags)
-ext/XS-APItest/t/newDEFSVOP.t  XS::APItest: test newDEFSVOP
-ext/XS-APItest/t/Null.pm       Helper for ./blockhooks.t
-ext/XS-APItest/t/op.t          XS::APItest: tests for OP related APIs
-ext/XS-APItest/t/op_contextualize.t    test op_contextualize() API
-ext/XS-APItest/t/op_list.t     test OP list construction API
-ext/XS-APItest/t/overload.t    XS::APItest: tests for overload related APIs
-ext/XS-APItest/t/pad_scalar.t  Test pad_findmy_* functions
-ext/XS-APItest/t/peep.t                test PL_peepp/PL_rpeepp
-ext/XS-APItest/t/pmflag.t      Test removal of Perl_pmflag()
-ext/XS-APItest/t/postinc.t     test op_lvalue()
-ext/XS-APItest/t/printf.t      XS::APItest extension
-ext/XS-APItest/t/ptr_table.t   Test ptr_table_* APIs
-ext/XS-APItest/t/push.t                XS::APItest extension
-ext/XS-APItest/t/refs.t                Test typemap ref handling
-ext/XS-APItest/t/rmagical.t    XS::APItest extension
-ext/XS-APItest/t/rv2cv_op_cv.t test rv2cv_op_cv() API
-ext/XS-APItest/t/savehints.t   test SAVEHINTS() API
-ext/XS-APItest/t/scopelessblock.t      test recursive descent statement-sequence parsing
-ext/XS-APItest/t/sort.t                Test sort(xs_cmp ...)
-ext/XS-APItest/t/stmtasexpr.t  test recursive descent statement parsing
-ext/XS-APItest/t/stmtsasexpr.t test recursive descent statement-sequence parsing
-ext/XS-APItest/t/stuff_modify_bug.t    test for eval side-effecting source string
-ext/XS-APItest/t/stuff_svcur_bug.t     test for a bug in lex_stuff_pvn
-ext/XS-APItest/t/subcall.t     Test XSUB calls
-ext/XS-APItest/t/subsignature.t        Test parse_subsignature()
-ext/XS-APItest/t/sv_numeq.t    Test sv_numeq
-ext/XS-APItest/t/sv_streq.t    Test sv_streq
-ext/XS-APItest/t/svcat.t       Test sv_catpvn
-ext/XS-APItest/t/svcatpvf.t    Test sv_catpvf argument reordering
-ext/XS-APItest/t/sviscow.t     Test SvIsCOW
-ext/XS-APItest/t/svpeek.t      XS::APItest extension
-ext/XS-APItest/t/svpv.t                More generic SvPVbyte and SvPVutf8 tests
-ext/XS-APItest/t/svpv_magic.t  Test behaviour of SvPVbyte/utf8 & get magic
-ext/XS-APItest/t/svsetsv.t     Test behaviour of sv_setsv with/without PERL_CORE
-ext/XS-APItest/t/swaplabel.t   test recursive descent label parsing
-ext/XS-APItest/t/swaptwostmts.t        test recursive descent statement parsing
-ext/XS-APItest/t/sym-hook.t    Test rv2cv hooks for bareword lookup
-ext/XS-APItest/t/synthetic_scope.t     Test block_start/block_end/intro_my
-ext/XS-APItest/t/temp_lv_sub.t XS::APItest: tests for lvalue subs returning temps
-ext/XS-APItest/t/underscore_length.t   Test find_rundefsv()
-ext/XS-APItest/t/utf16_to_utf8.t       Test behaviour of utf16_to_utf8{,reversed}
-ext/XS-APItest/t/utf8.t                Tests for code in utf8.c
-ext/XS-APItest/t/utf8_setup.pl Tests for code in utf8.c
-ext/XS-APItest/t/utf8_to_bytes.t       Tests for code in utf8.c
-ext/XS-APItest/t/utf8_warn00.t Tests for code in utf8.c
-ext/XS-APItest/t/utf8_warn01.t Tests for code in utf8.c
-ext/XS-APItest/t/utf8_warn02.t Tests for code in utf8.c
-ext/XS-APItest/t/utf8_warn03.t Tests for code in utf8.c
-ext/XS-APItest/t/utf8_warn04.t Tests for code in utf8.c
-ext/XS-APItest/t/utf8_warn05.t Tests for code in utf8.c
-ext/XS-APItest/t/utf8_warn06.t Tests for code in utf8.c
-ext/XS-APItest/t/utf8_warn07.t Tests for code in utf8.c
-ext/XS-APItest/t/utf8_warn08.t Tests for code in utf8.c
-ext/XS-APItest/t/utf8_warn09.t Tests for code in utf8.c
-ext/XS-APItest/t/utf8_warn_base.pl     Tests for code in utf8.c
-ext/XS-APItest/t/weaken.t      XS::APItest: tests for sv_rvweaken() and sv_get_backrefs()
-ext/XS-APItest/t/whichsig.t    XS::APItest: tests for whichsig() and variants
-ext/XS-APItest/t/win32.t       Test Win32 specific APIs
-ext/XS-APItest/t/xs_special_subs.t     Test that XS BEGIN/CHECK/INIT/END work
+ext/XS-APItest/t/labelconst.aux                        auxiliary file for label test
+ext/XS-APItest/t/labelconst.t                  test recursive descent label parsing
+ext/XS-APItest/t/labelconst_utf8.aux           auxiliary file for label test in UTF-8
+ext/XS-APItest/t/lexsub.t                      Test XS registration of lexical subs
+ext/XS-APItest/t/load-module.t                 test load_module()
+ext/XS-APItest/t/locale.t                      test locale-related things
+ext/XS-APItest/t/loopblock.t                   test recursive descent block parsing
+ext/XS-APItest/t/looprest.t                    test recursive descent statement-sequence parsing
+ext/XS-APItest/t/lvalue.t                      Test XS lvalue functions
+ext/XS-APItest/t/magic.t                       test attaching, finding, and removing magic
+ext/XS-APItest/t/magic_chain.t                 test low-level MAGIC chain handling
+ext/XS-APItest/t/Markers.pm                    Helper for ./blockhooks.t
+ext/XS-APItest/t/mortal_destructor.t           Test mortal_destructor api.
+ext/XS-APItest/t/mro.t                         Test mro plugin api
+ext/XS-APItest/t/multicall.t                   XS::APItest: test MULTICALL macros
+ext/XS-APItest/t/my_cxt.t                      XS::APItest: test MY_CXT interface
+ext/XS-APItest/t/my_exit.t                     XS::APItest: test my_exit
+ext/XS-APItest/t/my_strtod.t                   XS::APItest: test my_strtod
+ext/XS-APItest/t/newAV.t                       XS::APItest: test newAV* functions
+ext/XS-APItest/t/newCONSTSUB.t                 XS::APItest: test newCONSTSUB(_flags)
+ext/XS-APItest/t/newDEFSVOP.t                  XS::APItest: test newDEFSVOP
+ext/XS-APItest/t/Null.pm                       Helper for ./blockhooks.t
+ext/XS-APItest/t/op.t                          XS::APItest: tests for OP related APIs
+ext/XS-APItest/t/op_contextualize.t            test op_contextualize() API
+ext/XS-APItest/t/op_list.t                     test OP list construction API
+ext/XS-APItest/t/overload.t                    XS::APItest: tests for overload related APIs
+ext/XS-APItest/t/pad_scalar.t                  Test pad_findmy_* functions
+ext/XS-APItest/t/peep.t                                test PL_peepp/PL_rpeepp
+ext/XS-APItest/t/pmflag.t                      Test removal of Perl_pmflag()
+ext/XS-APItest/t/postinc.t                     test op_lvalue()
+ext/XS-APItest/t/printf.t                      XS::APItest extension
+ext/XS-APItest/t/ptr_table.t                   Test ptr_table_* APIs
+ext/XS-APItest/t/push.t                                XS::APItest extension
+ext/XS-APItest/t/refs.t                                Test typemap ref handling
+ext/XS-APItest/t/rmagical.t                    XS::APItest extension
+ext/XS-APItest/t/rv2cv_op_cv.t                 test rv2cv_op_cv() API
+ext/XS-APItest/t/savehints.t                   test SAVEHINTS() API
+ext/XS-APItest/t/savestack.t                   test savestack behavior, currently only in the regex engine
+ext/XS-APItest/t/scopelessblock.t              test recursive descent statement-sequence parsing
+ext/XS-APItest/t/sort.t                                Test sort(xs_cmp ...)
+ext/XS-APItest/t/stmtasexpr.t                  test recursive descent statement parsing
+ext/XS-APItest/t/stmtsasexpr.t                 test recursive descent statement-sequence parsing
+ext/XS-APItest/t/stuff_modify_bug.t            test for eval side-effecting source string
+ext/XS-APItest/t/stuff_svcur_bug.t             test for a bug in lex_stuff_pvn
+ext/XS-APItest/t/subcall.t                     Test XSUB calls
+ext/XS-APItest/t/subsignature.t                        Test parse_subsignature()
+ext/XS-APItest/t/sv_numeq.t                    Test sv_numeq
+ext/XS-APItest/t/sv_streq.t                    Test sv_streq
+ext/XS-APItest/t/svcat.t                       Test sv_catpvn
+ext/XS-APItest/t/svcatpvf.t                    Test sv_catpvf argument reordering
+ext/XS-APItest/t/sviscow.t                     Test SvIsCOW
+ext/XS-APItest/t/svpeek.t                      XS::APItest extension
+ext/XS-APItest/t/svpv.t                                More generic SvPVbyte and SvPVutf8 tests
+ext/XS-APItest/t/svpv_magic.t                  Test behaviour of SvPVbyte/utf8 & get magic
+ext/XS-APItest/t/svsetsv.t                     Test behaviour of sv_setsv with/without PERL_CORE
+ext/XS-APItest/t/swaplabel.t                   test recursive descent label parsing
+ext/XS-APItest/t/swaptwostmts.t                        test recursive descent statement parsing
+ext/XS-APItest/t/sym-hook.t                    Test rv2cv hooks for bareword lookup
+ext/XS-APItest/t/synthetic_scope.t             Test block_start/block_end/intro_my
+ext/XS-APItest/t/temp_lv_sub.t                 XS::APItest: tests for lvalue subs returning temps
+ext/XS-APItest/t/underscore_length.t           Test find_rundefsv()
+ext/XS-APItest/t/utf16_to_utf8.t               Test behaviour of utf16_to_utf8{,reversed}
+ext/XS-APItest/t/utf8.t                                Tests for code in utf8.c
+ext/XS-APItest/t/utf8_setup.pl                 Tests for code in utf8.c
+ext/XS-APItest/t/utf8_to_bytes.t               Tests for code in utf8.c
+ext/XS-APItest/t/utf8_warn00.t                 Tests for code in utf8.c
+ext/XS-APItest/t/utf8_warn01.t                 Tests for code in utf8.c
+ext/XS-APItest/t/utf8_warn02.t                 Tests for code in utf8.c
+ext/XS-APItest/t/utf8_warn03.t                 Tests for code in utf8.c
+ext/XS-APItest/t/utf8_warn04.t                 Tests for code in utf8.c
+ext/XS-APItest/t/utf8_warn05.t                 Tests for code in utf8.c
+ext/XS-APItest/t/utf8_warn06.t                 Tests for code in utf8.c
+ext/XS-APItest/t/utf8_warn07.t                 Tests for code in utf8.c
+ext/XS-APItest/t/utf8_warn08.t                 Tests for code in utf8.c
+ext/XS-APItest/t/utf8_warn09.t                 Tests for code in utf8.c
+ext/XS-APItest/t/utf8_warn_base.pl             Tests for code in utf8.c
+ext/XS-APItest/t/weaken.t                      XS::APItest: tests for sv_rvweaken() and sv_get_backrefs()
+ext/XS-APItest/t/whichsig.t                    XS::APItest: tests for whichsig() and variants
+ext/XS-APItest/t/win32.t                       Test Win32 specific APIs
+ext/XS-APItest/t/xs_special_subs.t             Test that XS BEGIN/CHECK/INIT/END work
 ext/XS-APItest/t/xs_special_subs_require.t     for require too
-ext/XS-APItest/t/xsub_h.t      Tests for XSUB.h
+ext/XS-APItest/t/xsub_h.t                      Tests for XSUB.h
 ext/XS-APItest/typemap
-ext/XS-APItest/XSUB-redefined-macros.xs        XS code needing redefined macros.
-ext/XS-APItest/XSUB-undef-XS_VERSION.xs        XS code needing #undef XS_VERSION
-ext/XS-Typemap/Makefile.PL     XS::Typemap extension
-ext/XS-Typemap/README          XS::Typemap extension
-ext/XS-Typemap/stdio.c         XS::Typemap extension
-ext/XS-Typemap/t/Typemap.t     test that typemaps work
-ext/XS-Typemap/Typemap.pm      XS::Typemap extension
-ext/XS-Typemap/Typemap.xs      XS::Typemap extension
-EXTERN.h                       Included before foreign .h files
-fakesdio.h                     stdio in terms of PerlIO
-feature.h                      Feature header
-form.h                         Public declarations for formats
-generate_uudmap.c              Generate uudmap.h, the uuencode decoding map
-git_version.h                  Pre-generated git_version.h for OpenBSD
-globals.c                      File to declare global symbols (for shared library)
-globvar.sym                    Global variables that need hiding when embedded
-gv.c                           Glob value code
-gv.h                           Glob value header
-h2pl/cbreak.pl                 cbreak routines using .ph
-h2pl/cbreak2.pl                        cbreak routines using .pl
-h2pl/eg/sizeof.ph              Sample sizeof array initialization
-h2pl/eg/sys/errno.pl           Sample translated errno.pl
-h2pl/eg/sys/ioctl.pl           Sample translated ioctl.pl
-h2pl/eg/sysexits.pl            Sample translated sysexits.pl
-h2pl/getioctlsizes             Program to extract types from ioctl.h
-h2pl/mksizes                   Program to make %sizeof array
-h2pl/mkvars                    Program to make .pl from .ph files
-h2pl/README                    How to turn .ph files into .pl files
-h2pl/tcbreak                   cbreak test routine using .ph
-h2pl/tcbreak2                  cbreak test routine using .pl
-haiku/Haiku/Haiku.pm           Haiku extension Perl module
-haiku/Haiku/Haiku.xs           Haiku extension external subroutines
-haiku/Haiku/Makefile.PL                Haiku extension makefile writer
-haiku/haikuish.h               Header for the Haiku port
-handy.h                                Handy definitions
-hints/aix.sh                   Hints for named architecture
-hints/aix_3.sh                 Hints for named architecture
-hints/aix_4.sh                 Hints for named architecture
-hints/altos486.sh              Hints for named architecture
-hints/amigaos.sh               Hints for named architecture
-hints/atheos.sh                        Hints for named architecture
-hints/aux_3.sh                 Hints for named architecture
-hints/bitrig.sh                        Hints for named architecture
-hints/broken-db.msg            Warning message for systems with broken DB library
-hints/bsdos.sh                 Hints for named architecture
-hints/catamount.sh             Hints for named architecture
-hints/convexos.sh              Hints for named architecture
-hints/cxux.sh                  Hints for named architecture
-hints/cygwin.sh                        Hints for named architecture
-hints/darwin.sh                        Hints for named architecture
-hints/dcosx.sh                 Hints for named architecture
-hints/dec_osf.sh               Hints for named architecture
-hints/dragonfly.sh             Hints for named architecture
-hints/dynix.sh                 Hints for named architecture
-hints/dynixptx.sh              Hints for named architecture
-hints/epix.sh                  Hints for named architecture
-hints/esix4.sh                 Hints for named architecture
-hints/fps.sh                   Hints for named architecture
-hints/freebsd.sh               Hints for named architecture
-hints/freemint.sh              Hints for named architecture
-hints/gnu.sh                   Hints for named architecture
-hints/gnukfreebsd.sh           Hints for named architecture
-hints/gnuknetbsd.sh            Hints for named architecture
-hints/greenhills.sh            Hints for named architecture
-hints/haiku.sh                 Hints for named architecture
-hints/hpux.sh                  Hints for named architecture
-hints/i386.sh                  Hints for named architecture
-hints/interix.sh               Hints for named architecture
-hints/irix_4.sh                        Hints for named architecture
-hints/irix_5.sh                        Hints for named architecture
-hints/irix_6.sh                        Hints for named architecture
-hints/irix_6_0.sh              Hints for named architecture
-hints/irix_6_1.sh              Hints for named architecture
-hints/isc.sh                   Hints for named architecture
-hints/isc_2.sh                 Hints for named architecture
-hints/linux.sh                 Hints for named architecture
-hints/linux-android.sh         Hints for named architecture
-hints/lynxos.sh                        Hints for named architecture
-hints/midnightbsd.sh           Hints for named architecture
-hints/minix.sh                 Hints for named architecture
-hints/mips.sh                  Hints for named architecture
-hints/mirbsd.sh                        Hints for named architecture
-hints/mpc.sh                   Hints for named architecture
-hints/ncr_tower.sh             Hints for named architecture
-hints/netbsd.sh                        Hints for named architecture
-hints/newsos4.sh               Hints for named architecture
-hints/nonstopux.sh             Hints for named architecture
-hints/openbsd.sh               Hints for named architecture
-hints/opus.sh                  Hints for named architecture
-hints/os2.sh                   Hints for named architecture
-hints/os390.sh                 Hints for named architecture
-hints/os400.sh                 Hints for named architecture
-hints/posix-bc.sh              Hints for named architecture
-hints/qnx.sh                   Hints for named architecture
-hints/README.hints             Notes about hints
-hints/riscos.sh                        Hints for named architecture
-hints/sco.sh                   Hints for named architecture
-hints/sco_2_3_0.sh             Hints for named architecture
-hints/sco_2_3_1.sh             Hints for named architecture
-hints/sco_2_3_2.sh             Hints for named architecture
-hints/sco_2_3_3.sh             Hints for named architecture
-hints/sco_2_3_4.sh             Hints for named architecture
-hints/solaris_2.sh             Hints for named architecture
-hints/stellar.sh               Hints for named architecture
-hints/sunos_4_0.sh             Hints for named architecture
-hints/sunos_4_1.sh             Hints for named architecture
-hints/super-ux.sh              Hints for named architecture
-hints/svr4.sh                  Hints for named architecture
-hints/svr5.sh                  Hints for named architecture
-hints/t001.c                   Test case for gcc bug
-hints/ti1500.sh                        Hints for named architecture
-hints/ultrix_4.sh              Hints for named architecture
-hints/umips.sh                 Hints for named architecture
-hints/unicos.sh                        Hints for named architecture
-hints/unicosmk.sh              Hints for named architecture
-hints/unisysdynix.sh           Hints for named architecture
-hints/utekv.sh                 Hints for named architecture
-hints/vos.sh                   Hints for named architecture
-hv.c                           Hash value code
-hv.h                           Hash value header
-hv_func.h                      Hash value static inline function header
-hv_macro.h                     Macros used by hv_func.h
-inline.h                       Static inline functions
-INSTALL                                Detailed installation instructions
-install_lib.pl                 functions shared between install* scripts
-installhtml                    Perl script to install html files for pods
-installman                     Perl script to install man pages for pods
-installperl                    Perl script to do "make install" dirty work
-INTERN.h                       Included before domestic .h files
-intrpvar.h                     Variables held in each interpreter instance
-invlist_inline.h               Inline functions for handling inversion lists
-iperlsys.h                     Perl's interface to the system
-keywords.c                     Perl_keyword(), generated by regen/keywords.pl
-keywords.h                     The keyword numbers
-l1_char_class_tab.h            256 word bit table of character classes (for handy.h)
-lib/_charnames.pm              Character names
-lib/AnyDBM_File.pm             Perl module to emulate dbmopen
-lib/AnyDBM_File.t              See if AnyDBM_File works
-lib/B/Deparse.pm               Compiler Deparse backend
-lib/B/Deparse.t                        See if B::Deparse works
-lib/B/Deparse-core.t           See if B::Deparse knows when to use CORE::
-lib/B/Deparse-subclass.t       See if B::Deparse can be subclassed
-lib/B/Op_private.pm            Definitions of OP op_private flags
-lib/Benchmark.pm               Measure execution time
-lib/Benchmark.t                        See if Benchmark works
-lib/blib.pm                    For "use blib"
-lib/blib.t                     blib.pm test
-lib/builtin.pm                 builtin function namespace
-lib/builtin.t                  test builtin function namespace
-lib/bytes.pm                   Pragma to enable byte operations
-lib/bytes.t                    bytes.pm test
-lib/bytes_heavy.pl             Support routines for byte pragma
-lib/charnames.pm               Character names
-lib/charnames.t                        See if character names work
-lib/Class/Struct.pm            Declare struct-like datatypes as Perl classes
-lib/Class/Struct.t             See if Class::Struct works
-lib/Config.t                   See if Config works
-lib/Config/Extensions.pm       Convenient hash lookup for built extensions
-lib/Config/Extensions.t                See if Config::Extensions works
-lib/Config_git.pl              Pre-generated Config_git.pl for OpenBSD
-lib/CORE.pod                   document the CORE namespace
-lib/DB.pm                      Debugger API (draft)
-lib/DB.t                       See if DB works
-lib/DBM_Filter.pm              DBM Filter module
-lib/DBM_Filter/compress.pm     DBM Filter to compress keys/values
-lib/DBM_Filter/encode.pm       DBM Filter for encoding
-lib/DBM_Filter/int32.pm                DBM Filter for creating int32 keys/values
-lib/DBM_Filter/null.pm         DBM Filter for null termination
-lib/DBM_Filter/t/01error.t     test DBM_Filter::null
-lib/DBM_Filter/t/02core.t      test DBM_Filter::null
-lib/DBM_Filter/t/compress.t    test DBM_Filter::compress
-lib/DBM_Filter/t/encode.t      test DBM_Filter::encode
-lib/DBM_Filter/t/int32.t       test DBM_Filter::int32
-lib/DBM_Filter/t/null.t                test DBM_Filter::null
-lib/DBM_Filter/t/utf8.t                test DBM_Filter::utf8
-lib/DBM_Filter/utf8.pm         DBM Filter for UTF-8 Encoding
-lib/dbm_filter_util.pl         Utility functions used by DBM Filter tests
-lib/deprecate.pm               A pragma for deprecating modules from the core.
-lib/diagnostics.pm             Print verbose diagnostics
-lib/diagnostics.t              See if diagnostics.pm works
-lib/DirHandle.pm               like FileHandle only for directories
-lib/DirHandle.t                        See if DirHandle works
-lib/dumpvar.pl                 A variable dumper
-lib/dumpvar.t                  A variable dumper tester
-lib/English.pm                 Readable aliases for short variables
-lib/English.t                  See if English works
-lib/ExtUtils/Embed.pm          Utilities for embedding Perl in C programs
-lib/ExtUtils/t/Embed.t         See if ExtUtils::Embed and embedding works
-lib/ExtUtils/typemap           Extension interface types
-lib/ExtUtils/XSSymSet.pm       on VMS, manage linker symbols when building extensions
-lib/feature.pm                 Pragma to enable new syntax
-lib/feature.t                  See if features work
-lib/feature/unicode_strings.t  See if feature "unicode_strings" work
-lib/File/Basename.pm           Emulate the basename program
-lib/File/Basename.t            See if File::Basename works
-lib/File/Compare.pm            Emulation of cmp command
-lib/File/Compare.t             See if File::Compare works
-lib/File/Copy.pm               Emulation of cp command
-lib/File/Copy.t                        See if File::Copy works
-lib/File/stat.pm               By-name interface to Perl's builtin stat
-lib/File/stat.t                        See if File::stat works
-lib/File/stat-7896.t           A test for ID 20011110.104
-lib/FileHandle.pm              Backward-compatible front end to IO extension
-lib/FileHandle.t               See if FileHandle works
-lib/filetest.pm                        For "use filetest"
-lib/filetest.t                 See if filetest works
-lib/Getopt/Std.pm              Fetch command options (getopt, getopts)
-lib/Getopt/Std.t               See if Getopt::Std and Getopt::Long work
-lib/h2ph.t                     See if h2ph works like it should
-lib/h2xs.t                     See if h2xs produces expected lists of files
-lib/integer.pm                 For "use integer"
-lib/integer.t                  For "use integer" testing
-lib/Internals.pod              Document the Internals namespace (implemented by universal.c)
-lib/Internals.t                        For Internals::* testing
-lib/less.pm                    For "use less"
-lib/less.t                     See if less support works
-lib/locale.pm                  For "use locale"
-lib/locale.t                   See if locale support works
-lib/locale_threads.t           Tes locale and threads interactions
-lib/meta_notation.pm           Helper for certain /lib .pm's
-lib/meta_notation.t            See if meta_notation.t works
-lib/Net/hostent.pm             By-name interface to Perl's builtin gethost*
-lib/Net/hostent.t              See if Net::hostent works
-lib/Net/netent.pm              By-name interface to Perl's builtin getnet*
-lib/Net/netent.t               See if Net::netent works
-lib/Net/protoent.pm            By-name interface to Perl's builtin getproto*
-lib/Net/protoent.t             See if Net::protoent works
-lib/Net/servent.pm             By-name interface to Perl's builtin getserv*
-lib/Net/servent.t              See if Net::servtent works
-lib/open.pm                    Pragma to specify default I/O layers
-lib/open.t                     See if the open pragma works
-lib/overload.pm                        Module for overloading perl operators
-lib/overload.t                 See if operator overloading works
-lib/overload/numbers.pm                Helper for overloading pragma
-lib/overload64.t               See if operator overloading works with 64-bit ints
-lib/overloading.pm             Pragma to lexically control overloading
-lib/overloading.t              Tests for overloading.pm
-lib/perl5db.pl                 Perl debugging routines
-lib/perl5db.t                  Tests for the Perl debugger
-lib/perl5db/t/break-on-dot     Test script used by perl5db.t
-lib/perl5db/t/breakpoint-bug   Test script used by perl5db.t
-lib/perl5db/t/disable-breakpoints-1    Test script used by perl5db.t
-lib/perl5db/t/disable-breakpoints-2    Test script used by perl5db.t
-lib/perl5db/t/disable-breakpoints-3    Test script used by perl5db.t
-lib/perl5db/t/EnableModule.pm  Tests for the Perl debugger
-lib/perl5db/t/eval-line-bug    Tests for the Perl debugger
-lib/perl5db/t/fact             Tests for the Perl debugger
-lib/perl5db/t/filename-line-breakpoint         Tests for the Perl debugger
-lib/perl5db/t/gh-17660         Tests for the Perl debugger
-lib/perl5db/t/gh-17661         Tests for the Perl debugger
-lib/perl5db/t/gh-17661b                Tests for the Perl debugger
-lib/perl5db/t/load-modules     Tests for the Perl debugger
-lib/perl5db/t/lsub-n           Test script used by perl5db.t
-lib/perl5db/t/lvalue-bug       Tests for the Perl debugger
-lib/perl5db/t/MyModule.pm      Tests for the Perl debugger
-lib/perl5db/t/proxy-constants  Tests for the Perl debugger
-lib/perl5db/t/rt-104168                Tests for the Perl debugger
-lib/perl5db/t/rt-120174                Tests for the Perl debugger
+ext/XS-APItest/XSUB-redefined-macros.xs                XS code needing redefined macros.
+ext/XS-APItest/XSUB-undef-XS_VERSION.xs                XS code needing #undef XS_VERSION
+ext/XS-Typemap/Makefile.PL             XS::Typemap extension
+ext/XS-Typemap/README                  XS::Typemap extension
+ext/XS-Typemap/stdio.c                 XS::Typemap extension
+ext/XS-Typemap/t/Typemap.t             test that typemaps work
+ext/XS-Typemap/Typemap.pm              XS::Typemap extension
+ext/XS-Typemap/Typemap.xs              XS::Typemap extension
+h2pl/cbreak.pl                         cbreak routines using .ph
+h2pl/cbreak2.pl                                cbreak routines using .pl
+h2pl/eg/sizeof.ph                      Sample sizeof array initialization
+h2pl/eg/sys/errno.pl                   Sample translated errno.pl
+h2pl/eg/sys/ioctl.pl                   Sample translated ioctl.pl
+h2pl/eg/sysexits.pl                    Sample translated sysexits.pl
+h2pl/getioctlsizes                     Program to extract types from ioctl.h
+h2pl/mksizes                           Program to make %sizeof array
+h2pl/mkvars                            Program to make .pl from .ph files
+h2pl/README                            How to turn .ph files into .pl files
+h2pl/tcbreak                           cbreak test routine using .ph
+h2pl/tcbreak2                          cbreak test routine using .pl
+haiku/Haiku/Haiku.pm                   Haiku extension Perl module
+haiku/Haiku/Haiku.xs                   Haiku extension external subroutines
+haiku/Haiku/Makefile.PL                        Haiku extension makefile writer
+haiku/haikuish.h                       Header for the Haiku port
+hints/aix.sh                           Hints for named architecture
+hints/aix_3.sh                         Hints for named architecture
+hints/aix_4.sh                         Hints for named architecture
+hints/altos486.sh                      Hints for named architecture
+hints/amigaos.sh                       Hints for named architecture
+hints/atheos.sh                                Hints for named architecture
+hints/aux_3.sh                         Hints for named architecture
+hints/bitrig.sh                                Hints for named architecture
+hints/broken-db.msg                    Warning message for systems with broken DB library
+hints/bsdos.sh                         Hints for named architecture
+hints/catamount.sh                     Hints for named architecture
+hints/convexos.sh                      Hints for named architecture
+hints/cxux.sh                          Hints for named architecture
+hints/cygwin.sh                                Hints for named architecture
+hints/darwin.sh                                Hints for named architecture
+hints/dcosx.sh                         Hints for named architecture
+hints/dec_osf.sh                       Hints for named architecture
+hints/dragonfly.sh                     Hints for named architecture
+hints/dynix.sh                         Hints for named architecture
+hints/dynixptx.sh                      Hints for named architecture
+hints/epix.sh                          Hints for named architecture
+hints/esix4.sh                         Hints for named architecture
+hints/fps.sh                           Hints for named architecture
+hints/freebsd.sh                       Hints for named architecture
+hints/freemint.sh                      Hints for named architecture
+hints/gnu.sh                           Hints for named architecture
+hints/gnukfreebsd.sh                   Hints for named architecture
+hints/gnuknetbsd.sh                    Hints for named architecture
+hints/greenhills.sh                    Hints for named architecture
+hints/haiku.sh                         Hints for named architecture
+hints/hpux.sh                          Hints for named architecture
+hints/i386.sh                          Hints for named architecture
+hints/interix.sh                       Hints for named architecture
+hints/irix_4.sh                                Hints for named architecture
+hints/irix_5.sh                                Hints for named architecture
+hints/irix_6.sh                                Hints for named architecture
+hints/irix_6_0.sh                      Hints for named architecture
+hints/irix_6_1.sh                      Hints for named architecture
+hints/isc.sh                           Hints for named architecture
+hints/isc_2.sh                         Hints for named architecture
+hints/linux.sh                         Hints for named architecture
+hints/linux-android.sh                 Hints for named architecture
+hints/lynxos.sh                                Hints for named architecture
+hints/midnightbsd.sh                   Hints for named architecture
+hints/minix.sh                         Hints for named architecture
+hints/mips.sh                          Hints for named architecture
+hints/mirbsd.sh                                Hints for named architecture
+hints/mpc.sh                           Hints for named architecture
+hints/ncr_tower.sh                     Hints for named architecture
+hints/netbsd.sh                                Hints for named architecture
+hints/newsos4.sh                       Hints for named architecture
+hints/nonstopux.sh                     Hints for named architecture
+hints/openbsd.sh                       Hints for named architecture
+hints/opus.sh                          Hints for named architecture
+hints/os2.sh                           Hints for named architecture
+hints/os390.sh                         Hints for named architecture
+hints/os400.sh                         Hints for named architecture
+hints/posix-bc.sh                      Hints for named architecture
+hints/qnx.sh                           Hints for named architecture
+hints/README.hints                     Notes about hints
+hints/riscos.sh                                Hints for named architecture
+hints/sco.sh                           Hints for named architecture
+hints/sco_2_3_0.sh                     Hints for named architecture
+hints/sco_2_3_1.sh                     Hints for named architecture
+hints/sco_2_3_2.sh                     Hints for named architecture
+hints/sco_2_3_3.sh                     Hints for named architecture
+hints/sco_2_3_4.sh                     Hints for named architecture
+hints/solaris_2.sh                     Hints for named architecture
+hints/stellar.sh                       Hints for named architecture
+hints/sunos_4_0.sh                     Hints for named architecture
+hints/sunos_4_1.sh                     Hints for named architecture
+hints/super-ux.sh                      Hints for named architecture
+hints/svr4.sh                          Hints for named architecture
+hints/svr5.sh                          Hints for named architecture
+hints/t001.c                           Test case for gcc bug
+hints/ti1500.sh                                Hints for named architecture
+hints/umips.sh                         Hints for named architecture
+hints/unicos.sh                                Hints for named architecture
+hints/unicosmk.sh                      Hints for named architecture
+hints/unisysdynix.sh                   Hints for named architecture
+hints/utekv.sh                         Hints for named architecture
+hints/vos.sh                           Hints for named architecture
+lib/_charnames.pm                      Character names
+lib/AnyDBM_File.pm                     Perl module to emulate dbmopen
+lib/AnyDBM_File.t                      See if AnyDBM_File works
+lib/B/Deparse.pm                       Compiler Deparse backend
+lib/B/Deparse.t                                See if B::Deparse works
+lib/B/Deparse-core.t                   See if B::Deparse knows when to use CORE::
+lib/B/Deparse-subclass.t               See if B::Deparse can be subclassed
+lib/B/Op_private.pm                    Definitions of OP op_private flags
+lib/Benchmark.pm                       Measure execution time
+lib/Benchmark.t                                See if Benchmark works
+lib/blib.pm                            For "use blib"
+lib/blib.t                             blib.pm test
+lib/builtin.pm                         builtin function namespace
+lib/builtin.t                          test builtin function namespace
+lib/bytes.pm                           Pragma to enable byte operations
+lib/bytes.t                            bytes.pm test
+lib/bytes_heavy.pl                     Support routines for byte pragma
+lib/charnames.pm                       Character names
+lib/charnames.t                                See if character names work
+lib/Class/Struct.pm                    Declare struct-like datatypes as Perl classes
+lib/Class/Struct.t                     See if Class::Struct works
+lib/Config.t                           See if Config works
+lib/Config/Extensions.pm               Convenient hash lookup for built extensions
+lib/Config/Extensions.t                        See if Config::Extensions works
+lib/CORE.pod                           document the CORE namespace
+lib/DB.pm                              Debugger API (draft)
+lib/DB.t                               See if DB works
+lib/DBM_Filter.pm                      DBM Filter module
+lib/DBM_Filter/compress.pm             DBM Filter to compress keys/values
+lib/DBM_Filter/encode.pm               DBM Filter for encoding
+lib/DBM_Filter/int32.pm                        DBM Filter for creating int32 keys/values
+lib/DBM_Filter/null.pm                 DBM Filter for null termination
+lib/DBM_Filter/t/01error.t             test DBM_Filter::null
+lib/DBM_Filter/t/02core.t              test DBM_Filter::null
+lib/DBM_Filter/t/compress.t            test DBM_Filter::compress
+lib/DBM_Filter/t/encode.t              test DBM_Filter::encode
+lib/DBM_Filter/t/int32.t               test DBM_Filter::int32
+lib/DBM_Filter/t/null.t                        test DBM_Filter::null
+lib/DBM_Filter/t/utf8.t                        test DBM_Filter::utf8
+lib/DBM_Filter/utf8.pm                 DBM Filter for UTF-8 Encoding
+lib/dbm_filter_util.pl                 Utility functions used by DBM Filter tests
+lib/deprecate.pm                       A pragma for deprecating modules from the core.
+lib/diagnostics.pm                     Print verbose diagnostics
+lib/diagnostics.t                      See if diagnostics.pm works
+lib/DirHandle.pm                       like FileHandle only for directories
+lib/DirHandle.t                                See if DirHandle works
+lib/dumpvar.pl                         A variable dumper
+lib/dumpvar.t                          A variable dumper tester
+lib/English.pm                         Readable aliases for short variables
+lib/English.t                          See if English works
+lib/ExtUtils/Embed.pm                  Utilities for embedding Perl in C programs
+lib/ExtUtils/t/Embed.t                 See if ExtUtils::Embed and embedding works
+lib/ExtUtils/typemap                   Extension interface types
+lib/ExtUtils/XSSymSet.pm               on VMS, manage linker symbols when building extensions
+lib/feature.pm                         Pragma to enable new syntax
+lib/feature.t                          See if features work
+lib/feature/unicode_strings.t          See if feature "unicode_strings" work
+lib/File/Basename.pm                   Emulate the basename program
+lib/File/Basename.t                    See if File::Basename works
+lib/File/Compare.pm                    Emulation of cmp command
+lib/File/Compare.t                     See if File::Compare works
+lib/File/Copy.pm                       Emulation of cp command
+lib/File/Copy.t                                See if File::Copy works
+lib/File/stat.pm                       By-name interface to Perl's builtin stat
+lib/File/stat.t                                See if File::stat works
+lib/File/stat-7896.t                   A test for ID 20011110.104
+lib/FileHandle.pm                      Backward-compatible front end to IO extension
+lib/FileHandle.t                       See if FileHandle works
+lib/filetest.pm                                For "use filetest"
+lib/filetest.t                         See if filetest works
+lib/Getopt/Std.pm                      Fetch command options (getopt, getopts)
+lib/Getopt/Std.t                       See if Getopt::Std and Getopt::Long work
+lib/h2ph.t                             See if h2ph works like it should
+lib/h2xs.t                             See if h2xs produces expected lists of files
+lib/integer.pm                         For "use integer"
+lib/integer.t                          For "use integer" testing
+lib/Internals.pod                      Document the Internals namespace (implemented by universal.c)
+lib/Internals.t                                For Internals::* testing
+lib/less.pm                            For "use less"
+lib/less.t                             See if less support works
+lib/locale.pm                          For "use locale"
+lib/locale.t                           See if locale support works
+lib/locale_threads.t                   Tes locale and threads interactions
+lib/meta_notation.pm                   Helper for certain /lib .pm's
+lib/meta_notation.t                    See if meta_notation.t works
+lib/Net/hostent.pm                     By-name interface to Perl's builtin gethost*
+lib/Net/hostent.t                      See if Net::hostent works
+lib/Net/netent.pm                      By-name interface to Perl's builtin getnet*
+lib/Net/netent.t                       See if Net::netent works
+lib/Net/protoent.pm                    By-name interface to Perl's builtin getproto*
+lib/Net/protoent.t                     See if Net::protoent works
+lib/Net/servent.pm                     By-name interface to Perl's builtin getserv*
+lib/Net/servent.t                      See if Net::servtent works
+lib/open.pm                            Pragma to specify default I/O layers
+lib/open.t                             See if the open pragma works
+lib/overload.pm                                Module for overloading perl operators
+lib/overload.t                         See if operator overloading works
+lib/overload/numbers.pm                        Helper for overloading pragma
+lib/overload64.t                       See if operator overloading works with 64-bit ints
+lib/overloading.pm                     Pragma to lexically control overloading
+lib/overloading.t                      Tests for overloading.pm
+lib/perl5db.pl                         Perl debugging routines
+lib/perl5db.t                          Tests for the Perl debugger
+lib/perl5db/t/break-on-dot                             Test script used by perl5db.t
+lib/perl5db/t/breakpoint-bug                           Test script used by perl5db.t
+lib/perl5db/t/disable-breakpoints-1                    Test script used by perl5db.t
+lib/perl5db/t/disable-breakpoints-2                    Test script used by perl5db.t
+lib/perl5db/t/disable-breakpoints-3                    Test script used by perl5db.t
+lib/perl5db/t/EnableModule.pm                          Tests for the Perl debugger
+lib/perl5db/t/eval-line-bug                            Tests for the Perl debugger
+lib/perl5db/t/fact                                     Tests for the Perl debugger
+lib/perl5db/t/filename-line-breakpoint                 Tests for the Perl debugger
+lib/perl5db/t/gh-17660                                 Tests for the Perl debugger
+lib/perl5db/t/gh-17661                                 Tests for the Perl debugger
+lib/perl5db/t/gh-17661b                                        Tests for the Perl debugger
+lib/perl5db/t/load-modules                             Tests for the Perl debugger
+lib/perl5db/t/lsub-n                                   Test script used by perl5db.t
+lib/perl5db/t/lvalue-bug                               Tests for the Perl debugger
+lib/perl5db/t/MyModule.pm                              Tests for the Perl debugger
+lib/perl5db/t/proxy-constants                          Tests for the Perl debugger
+lib/perl5db/t/rt-104168                                        Tests for the Perl debugger
+lib/perl5db/t/rt-120174                                        Tests for the Perl debugger
 lib/perl5db/t/rt-121509-restart-after-chdir            Tests for the Perl debugger
-lib/perl5db/t/rt-124203                Test threads in the Perl debugger
-lib/perl5db/t/rt-124203b       Test threads in the Perl debugger
-lib/perl5db/t/rt-61222         Tests for the Perl debugger
-lib/perl5db/t/rt-66110         Tests for the Perl debugger
-lib/perl5db/t/source-cmd-test.perldb           Tests for the Perl debugger
+lib/perl5db/t/rt-124203                                        Test threads in the Perl debugger
+lib/perl5db/t/rt-124203b                               Test threads in the Perl debugger
+lib/perl5db/t/rt-61222                                 Tests for the Perl debugger
+lib/perl5db/t/rt-66110                                 Tests for the Perl debugger
+lib/perl5db/t/source-cmd-test.perldb                   Tests for the Perl debugger
 lib/perl5db/t/source-cmd-test-no-q.perldb              Tests for the Perl debugger
-lib/perl5db/t/symbol-table-bug Tests for the Perl debugger
-lib/perl5db/t/taint            Tests for the Perl debugger
-lib/perl5db/t/test-a-statement-1       Tests for the Perl debugger
-lib/perl5db/t/test-a-statement-2       Tests for the Perl debugger
-lib/perl5db/t/test-a-statement-3       Tests for the Perl debugger
-lib/perl5db/t/test-dieLevel-option-1   Tests for the Perl debugger
-lib/perl5db/t/test-frame-option-1      Tests for the Perl debugger
-lib/perl5db/t/test-l-statement-1       Tests for the Perl debugger
-lib/perl5db/t/test-l-statement-2       Tests for the Perl debugger
-lib/perl5db/t/test-m-statement-1       Tests for the Perl debugger
+lib/perl5db/t/symbol-table-bug                         Tests for the Perl debugger
+lib/perl5db/t/taint                                    Tests for the Perl debugger
+lib/perl5db/t/test-a-statement-1                       Tests for the Perl debugger
+lib/perl5db/t/test-a-statement-2                       Tests for the Perl debugger
+lib/perl5db/t/test-a-statement-3                       Tests for the Perl debugger
+lib/perl5db/t/test-dieLevel-option-1                   Tests for the Perl debugger
+lib/perl5db/t/test-frame-option-1                      Tests for the Perl debugger
+lib/perl5db/t/test-l-statement-1                       Tests for the Perl debugger
+lib/perl5db/t/test-l-statement-2                       Tests for the Perl debugger
+lib/perl5db/t/test-m-statement-1                       Tests for the Perl debugger
 lib/perl5db/t/test-passing-at-underscore-to-x-etc      Tests for the Perl debugger
-lib/perl5db/t/test-PrintRet-option-1   Tests for the Perl debugger
-lib/perl5db/t/test-r-statement Tests for the Perl debugger
-lib/perl5db/t/test-w-statement-1       Tests for the Perl debugger
-lib/perl5db/t/test-warnLevel-option-1  Tests for the Perl debugger
-lib/perl5db/t/uncalled-subroutine      Tests for the Perl debugger
-lib/perl5db/t/with-subroutine          Tests for the Perl debugger
-lib/perlbug.t                  Tests for the Perl bug reporter
-lib/PerlIO.pm                  PerlIO support module
-lib/Pod/t/Usage.t              See if Pod::Usage works
-lib/SelectSaver.pm             Enforce proper select scoping
-lib/SelectSaver.t              See if SelectSaver works
-lib/sigtrap.pm                 For trapping an abort and giving traceback
-lib/sigtrap.t                  See if sigtrap works
-lib/sort.pm                    For "use sort"
-lib/sort.t                     See if "use sort" works
-lib/strict.pm                  For "use strict"
-lib/strict.t                   See if strictures work
-lib/subs.pm                    Declare overriding subs
-lib/subs.t                     See if subroutine pseudo-importation works
-lib/Symbol.pm                  Symbol table manipulation routines
-lib/Symbol.t                   See if Symbol works
-lib/Thread.pm                  Thread extensions frontend
-lib/Thread.t                   Thread extensions frontend tests
-lib/Tie/Array.pm               Base class for tied arrays
-lib/Tie/Array/push.t           Test for Tie::Array
-lib/Tie/Array/splice.t         Test for Tie::Array::SPLICE
-lib/Tie/Array/std.t            Test for Tie::StdArray
-lib/Tie/Array/stdpush.t                Test for Tie::StdArray
-lib/Tie/ExtraHash.t            Test for Tie::ExtraHash (in Tie/Hash.pm)
-lib/Tie/Handle.pm              Base class for tied handles
-lib/Tie/Handle/stdhandle.t     Test for Tie::StdHandle
+lib/perl5db/t/test-PrintRet-option-1                   Tests for the Perl debugger
+lib/perl5db/t/test-r-statement                         Tests for the Perl debugger
+lib/perl5db/t/test-w-statement-1                       Tests for the Perl debugger
+lib/perl5db/t/test-warnLevel-option-1                  Tests for the Perl debugger
+lib/perl5db/t/uncalled-subroutine                      Tests for the Perl debugger
+lib/perl5db/t/with-subroutine                          Tests for the Perl debugger
+lib/perlbug.t                          Tests for the Perl bug reporter
+lib/PerlIO.pm                          PerlIO support module
+lib/Pod/t/Usage.t                      See if Pod::Usage works
+lib/SelectSaver.pm                     Enforce proper select scoping
+lib/SelectSaver.t                      See if SelectSaver works
+lib/sigtrap.pm                         For trapping an abort and giving traceback
+lib/sigtrap.t                          See if sigtrap works
+lib/sort.pm                            For "use sort"
+lib/sort.t                             See if "use sort" works
+lib/strict.pm                          For "use strict"
+lib/strict.t                           See if strictures work
+lib/subs.pm                            Declare overriding subs
+lib/subs.t                             See if subroutine pseudo-importation works
+lib/Symbol.pm                          Symbol table manipulation routines
+lib/Symbol.t                           See if Symbol works
+lib/Thread.pm                          Thread extensions frontend
+lib/Thread.t                           Thread extensions frontend tests
+lib/Tie/Array.pm                       Base class for tied arrays
+lib/Tie/Array/push.t                   Test for Tie::Array
+lib/Tie/Array/splice.t                 Test for Tie::Array::SPLICE
+lib/Tie/Array/std.t                    Test for Tie::StdArray
+lib/Tie/Array/stdpush.t                        Test for Tie::StdArray
+lib/Tie/ExtraHash.t                    Test for Tie::ExtraHash (in Tie/Hash.pm)
+lib/Tie/Handle.pm                      Base class for tied handles
+lib/Tie/Handle/stdhandle.t             Test for Tie::StdHandle
 lib/Tie/Handle/stdhandle_from_handle.t Test for Tie::StdHandle/Handle backwards compat
-lib/Tie/Hash.pm                        Base class for tied hashes
-lib/Tie/Hash.t                 See if Tie::Hash works
-lib/Tie/Scalar.pm              Base class for tied scalars
-lib/Tie/Scalar.t               See if Tie::Scalar works
-lib/Tie/StdHandle.pm           Tie::StdHandle
-lib/Tie/SubstrHash.pm          Compact hash for known key, value and table size
-lib/Tie/SubstrHash.t           Test for Tie::SubstrHash
-lib/Time/gmtime.pm             By-name interface to Perl's builtin gmtime
-lib/Time/gmtime.t              Test for Time::gmtime
-lib/Time/localtime.pm          By-name interface to Perl's builtin localtime
-lib/Time/localtime.t           Test for Time::localtime
-lib/Time/tm.pm                 Internal object for Time::{gm,local}time
-lib/Unicode/README             Explanation what happened to lib/unicode.
-lib/Unicode/UCD.pm             Unicode character database
-lib/Unicode/UCD.t              See if Unicode character database works
+lib/Tie/Hash.pm                                Base class for tied hashes
+lib/Tie/Hash.t                         See if Tie::Hash works
+lib/Tie/Scalar.pm                      Base class for tied scalars
+lib/Tie/Scalar.t                       See if Tie::Scalar works
+lib/Tie/StdHandle.pm                   Tie::StdHandle
+lib/Tie/SubstrHash.pm                  Compact hash for known key, value and table size
+lib/Tie/SubstrHash.t                   Test for Tie::SubstrHash
+lib/Time/gmtime.pm                     By-name interface to Perl's builtin gmtime
+lib/Time/gmtime.t                      Test for Time::gmtime
+lib/Time/localtime.pm                  By-name interface to Perl's builtin localtime
+lib/Time/localtime.t                   Test for Time::localtime
+lib/Time/tm.pm                         Internal object for Time::{gm,local}time
+lib/Unicode/README                     Explanation what happened to lib/unicode.
+lib/Unicode/testnorm.t                 Run official Unicode Consortium's normalization tests
+lib/Unicode/UCD.pm                     Unicode character database
+lib/Unicode/UCD.t                      See if Unicode character database works
 lib/unicore/ArabicShaping.txt                  Unicode character database
-lib/unicore/auxiliary/GCBTest.txt                      Unicode character database
-lib/unicore/auxiliary/GraphemeBreakProperty.txt                        Unicode character database
-lib/unicore/auxiliary/LBTest.txt                       Unicode character database
-lib/unicore/auxiliary/SBTest.txt                       Unicode character database
-lib/unicore/auxiliary/SentenceBreakProperty.txt                        Unicode character database
-lib/unicore/auxiliary/WBTest.txt                       Unicode character database
-lib/unicore/auxiliary/WordBreakProperty.txt                    Unicode character database
+lib/unicore/auxiliary/GCBTest.txt              Unicode character database
+lib/unicore/auxiliary/GraphemeBreakProperty.txt        Unicode character database
+lib/unicore/auxiliary/LBTest.txt               Unicode character database
+lib/unicore/auxiliary/SBTest.txt               Unicode character database
+lib/unicore/auxiliary/SentenceBreakProperty.txt        Unicode character database
+lib/unicore/auxiliary/WBTest.txt               Unicode character database
+lib/unicore/auxiliary/WordBreakProperty.txt    Unicode character database
 lib/unicore/BidiBrackets.txt                   Unicode character database
 lib/unicore/BidiMirroring.txt                  Unicode character database
 lib/unicore/Blocks.txt                         Unicode character database
 lib/unicore/CaseFolding.txt                    Unicode character database
 lib/unicore/CJKRadicals.txt                    Unicode character database
-lib/unicore/CombiningClass.pl                  Unicode character database
-lib/unicore/CompositionExclusions.txt                  Unicode character database
+lib/unicore/CompositionExclusions.txt          Unicode character database
 lib/unicore/DAge.txt                           Unicode character database
 lib/unicore/DCoreProperties.txt                        Unicode character database
-lib/unicore/Decomposition.pl                   Unicode character database
-lib/unicore/DNormalizationProps.txt                    Unicode character database
+lib/unicore/DNormalizationProps.txt            Unicode character database
 lib/unicore/EastAsianWidth.txt                 Unicode character database
 lib/unicore/emoji/emoji.txt                    Unicode character database
 lib/unicore/EmojiSources.txt                   Unicode character database
-lib/unicore/EquivalentUnifiedIdeograph.txt                     Unicode character database
-lib/unicore/extracted/DBidiClass.txt                   Unicode character database
-lib/unicore/extracted/DBinaryProperties.txt                    Unicode character database
-lib/unicore/extracted/DCombiningClass.txt                      Unicode character database
-lib/unicore/extracted/DDecompositionType.txt                   Unicode character database
-lib/unicore/extracted/DEastAsianWidth.txt                      Unicode character database
-lib/unicore/extracted/DGeneralCategory.txt                     Unicode character database
-lib/unicore/extracted/DJoinGroup.txt                   Unicode character database
-lib/unicore/extracted/DJoinType.txt                    Unicode character database
-lib/unicore/extracted/DLineBreak.txt                   Unicode character database
-lib/unicore/extracted/DNumType.txt                     Unicode character database
-lib/unicore/extracted/DNumValues.txt                   Unicode character database
-lib/unicore/HangulSyllableType.txt                     Unicode character database
+lib/unicore/EquivalentUnifiedIdeograph.txt     Unicode character database
+lib/unicore/extracted/DBidiClass.txt           Unicode character database
+lib/unicore/extracted/DBinaryProperties.txt    Unicode character database
+lib/unicore/extracted/DCombiningClass.txt      Unicode character database
+lib/unicore/extracted/DDecompositionType.txt   Unicode character database
+lib/unicore/extracted/DEastAsianWidth.txt      Unicode character database
+lib/unicore/extracted/DGeneralCategory.txt     Unicode character database
+lib/unicore/extracted/DJoinGroup.txt           Unicode character database
+lib/unicore/extracted/DJoinType.txt            Unicode character database
+lib/unicore/extracted/DLineBreak.txt           Unicode character database
+lib/unicore/extracted/DNumType.txt             Unicode character database
+lib/unicore/extracted/DNumValues.txt           Unicode character database
+lib/unicore/HangulSyllableType.txt             Unicode character database
 lib/unicore/IdStatus.txt                       Unicode UTS 39 database
 lib/unicore/IdType.txt                         Unicode UTS 39 database
 lib/unicore/Index.txt                          Unicode character database
-lib/unicore/IndicPositionalCategory.txt                        Unicode character database
-lib/unicore/IndicSyllabicCategory.txt                  Unicode character database
+lib/unicore/IndicPositionalCategory.txt                Unicode character database
+lib/unicore/IndicSyllabicCategory.txt          Unicode character database
 lib/unicore/Jamo.txt                           Unicode character database
-lib/unicore/lib/Age/NA.pl                      Unicode character database
-lib/unicore/lib/Age/V100.pl                    Unicode character database
-lib/unicore/lib/Age/V11.pl                     Unicode character database
-lib/unicore/lib/Age/V110.pl                    Unicode character database
-lib/unicore/lib/Age/V120.pl                    Unicode character database
-lib/unicore/lib/Age/V130.pl                    Unicode character database
-lib/unicore/lib/Age/V140.pl                    Unicode character database
-lib/unicore/lib/Age/V20.pl                     Unicode character database
-lib/unicore/lib/Age/V30.pl                     Unicode character database
-lib/unicore/lib/Age/V31.pl                     Unicode character database
-lib/unicore/lib/Age/V32.pl                     Unicode character database
-lib/unicore/lib/Age/V40.pl                     Unicode character database
-lib/unicore/lib/Age/V41.pl                     Unicode character database
-lib/unicore/lib/Age/V50.pl                     Unicode character database
-lib/unicore/lib/Age/V51.pl                     Unicode character database
-lib/unicore/lib/Age/V52.pl                     Unicode character database
-lib/unicore/lib/Age/V60.pl                     Unicode character database
-lib/unicore/lib/Age/V61.pl                     Unicode character database
-lib/unicore/lib/Age/V70.pl                     Unicode character database
-lib/unicore/lib/Age/V80.pl                     Unicode character database
-lib/unicore/lib/Age/V90.pl                     Unicode character database
-lib/unicore/lib/Alpha/Y.pl                     Unicode character database
-lib/unicore/lib/Bc/AL.pl                       Unicode character database
-lib/unicore/lib/Bc/AN.pl                       Unicode character database
-lib/unicore/lib/Bc/B.pl                        Unicode character database
-lib/unicore/lib/Bc/BN.pl                       Unicode character database
-lib/unicore/lib/Bc/CS.pl                       Unicode character database
-lib/unicore/lib/Bc/EN.pl                       Unicode character database
-lib/unicore/lib/Bc/ES.pl                       Unicode character database
-lib/unicore/lib/Bc/ET.pl                       Unicode character database
-lib/unicore/lib/Bc/L.pl                        Unicode character database
-lib/unicore/lib/Bc/NSM.pl                      Unicode character database
-lib/unicore/lib/Bc/ON.pl                       Unicode character database
-lib/unicore/lib/Bc/R.pl                        Unicode character database
-lib/unicore/lib/Bc/WS.pl                       Unicode character database
-lib/unicore/lib/BidiC/Y.pl                     Unicode character database
-lib/unicore/lib/BidiM/Y.pl                     Unicode character database
-lib/unicore/lib/Blk/NB.pl                      Unicode character database
-lib/unicore/lib/Bpt/C.pl                       Unicode character database
-lib/unicore/lib/Bpt/N.pl                       Unicode character database
-lib/unicore/lib/Bpt/O.pl                       Unicode character database
-lib/unicore/lib/Cased/Y.pl                     Unicode character database
-lib/unicore/lib/Ccc/A.pl                       Unicode character database
-lib/unicore/lib/Ccc/AL.pl                      Unicode character database
-lib/unicore/lib/Ccc/AR.pl                      Unicode character database
-lib/unicore/lib/Ccc/ATAR.pl                    Unicode character database
-lib/unicore/lib/Ccc/B.pl                       Unicode character database
-lib/unicore/lib/Ccc/BR.pl                      Unicode character database
-lib/unicore/lib/Ccc/DB.pl                      Unicode character database
-lib/unicore/lib/Ccc/NK.pl                      Unicode character database
-lib/unicore/lib/Ccc/NR.pl                      Unicode character database
-lib/unicore/lib/Ccc/OV.pl                      Unicode character database
-lib/unicore/lib/Ccc/VR.pl                      Unicode character database
-lib/unicore/lib/CE/Y.pl                        Unicode character database
-lib/unicore/lib/CI/Y.pl                        Unicode character database
-lib/unicore/lib/CompEx/Y.pl                    Unicode character database
-lib/unicore/lib/CWCF/Y.pl                      Unicode character database
-lib/unicore/lib/CWCM/Y.pl                      Unicode character database
-lib/unicore/lib/CWKCF/Y.pl                     Unicode character database
-lib/unicore/lib/CWL/Y.pl                       Unicode character database
-lib/unicore/lib/CWT/Y.pl                       Unicode character database
-lib/unicore/lib/CWU/Y.pl                       Unicode character database
-lib/unicore/lib/Dash/Y.pl                      Unicode character database
-lib/unicore/lib/Dep/Y.pl                       Unicode character database
-lib/unicore/lib/DI/Y.pl                        Unicode character database
-lib/unicore/lib/Dia/Y.pl                       Unicode character database
-lib/unicore/lib/Dt/Com.pl                      Unicode character database
-lib/unicore/lib/Dt/Enc.pl                      Unicode character database
-lib/unicore/lib/Dt/Fin.pl                      Unicode character database
-lib/unicore/lib/Dt/Font.pl                     Unicode character database
-lib/unicore/lib/Dt/Init.pl                     Unicode character database
-lib/unicore/lib/Dt/Iso.pl                      Unicode character database
-lib/unicore/lib/Dt/Med.pl                      Unicode character database
-lib/unicore/lib/Dt/Nar.pl                      Unicode character database
-lib/unicore/lib/Dt/Nb.pl                       Unicode character database
-lib/unicore/lib/Dt/NonCanon.pl                 Unicode character database
-lib/unicore/lib/Dt/Sqr.pl                      Unicode character database
-lib/unicore/lib/Dt/Sub.pl                      Unicode character database
-lib/unicore/lib/Dt/Sup.pl                      Unicode character database
-lib/unicore/lib/Dt/Vert.pl                     Unicode character database
-lib/unicore/lib/Ea/A.pl                        Unicode character database
-lib/unicore/lib/Ea/H.pl                        Unicode character database
-lib/unicore/lib/Ea/N.pl                        Unicode character database
-lib/unicore/lib/Ea/Na.pl                       Unicode character database
-lib/unicore/lib/Ea/W.pl                        Unicode character database
-lib/unicore/lib/EBase/Y.pl                     Unicode character database
-lib/unicore/lib/EComp/Y.pl                     Unicode character database
-lib/unicore/lib/Emoji/Y.pl                     Unicode character database
-lib/unicore/lib/EPres/Y.pl                     Unicode character database
-lib/unicore/lib/Ext/Y.pl                       Unicode character database
-lib/unicore/lib/ExtPict/Y.pl                   Unicode character database
-lib/unicore/lib/Gc/C.pl                        Unicode character database
-lib/unicore/lib/Gc/Cf.pl                       Unicode character database
-lib/unicore/lib/Gc/Cn.pl                       Unicode character database
-lib/unicore/lib/Gc/L.pl                        Unicode character database
-lib/unicore/lib/Gc/LC.pl                       Unicode character database
-lib/unicore/lib/Gc/Ll.pl                       Unicode character database
-lib/unicore/lib/Gc/Lm.pl                       Unicode character database
-lib/unicore/lib/Gc/Lo.pl                       Unicode character database
-lib/unicore/lib/Gc/Lu.pl                       Unicode character database
-lib/unicore/lib/Gc/M.pl                        Unicode character database
-lib/unicore/lib/Gc/Mc.pl                       Unicode character database
-lib/unicore/lib/Gc/Me.pl                       Unicode character database
-lib/unicore/lib/Gc/Mn.pl                       Unicode character database
-lib/unicore/lib/Gc/N.pl                        Unicode character database
-lib/unicore/lib/Gc/Nd.pl                       Unicode character database
-lib/unicore/lib/Gc/Nl.pl                       Unicode character database
-lib/unicore/lib/Gc/No.pl                       Unicode character database
-lib/unicore/lib/Gc/P.pl                        Unicode character database
-lib/unicore/lib/Gc/Pc.pl                       Unicode character database
-lib/unicore/lib/Gc/Pd.pl                       Unicode character database
-lib/unicore/lib/Gc/Pe.pl                       Unicode character database
-lib/unicore/lib/Gc/Pf.pl                       Unicode character database
-lib/unicore/lib/Gc/Pi.pl                       Unicode character database
-lib/unicore/lib/Gc/Po.pl                       Unicode character database
-lib/unicore/lib/Gc/Ps.pl                       Unicode character database
-lib/unicore/lib/Gc/S.pl                        Unicode character database
-lib/unicore/lib/Gc/Sc.pl                       Unicode character database
-lib/unicore/lib/Gc/Sk.pl                       Unicode character database
-lib/unicore/lib/Gc/Sm.pl                       Unicode character database
-lib/unicore/lib/Gc/So.pl                       Unicode character database
-lib/unicore/lib/Gc/Z.pl                        Unicode character database
-lib/unicore/lib/Gc/Zs.pl                       Unicode character database
-lib/unicore/lib/GCB/CN.pl                      Unicode character database
-lib/unicore/lib/GCB/EX.pl                      Unicode character database
-lib/unicore/lib/GCB/LV.pl                      Unicode character database
-lib/unicore/lib/GCB/LVT.pl                     Unicode character database
-lib/unicore/lib/GCB/PP.pl                      Unicode character database
-lib/unicore/lib/GCB/SM.pl                      Unicode character database
-lib/unicore/lib/GCB/XX.pl                      Unicode character database
-lib/unicore/lib/GrBase/Y.pl                    Unicode character database
-lib/unicore/lib/GrExt/Y.pl                     Unicode character database
-lib/unicore/lib/Hex/Y.pl                       Unicode character database
-lib/unicore/lib/Hst/NA.pl                      Unicode character database
-lib/unicore/lib/Hyphen/T.pl                    Unicode character database
-lib/unicore/lib/IDC/Y.pl                       Unicode character database
-lib/unicore/lib/Ideo/Y.pl                      Unicode character database
-lib/unicore/lib/IDS/Y.pl                       Unicode character database
-lib/unicore/lib/IdStatus/Allowed.pl                    Unicode character database
-lib/unicore/lib/IdStatus/Restrict.pl                   Unicode character database
-lib/unicore/lib/IdType/DefaultI.pl                     Unicode character database
-lib/unicore/lib/IdType/Exclusio.pl                     Unicode character database
-lib/unicore/lib/IdType/Inclusio.pl                     Unicode character database
-lib/unicore/lib/IdType/LimitedU.pl                     Unicode character database
-lib/unicore/lib/IdType/NotChara.pl                     Unicode character database
-lib/unicore/lib/IdType/NotNFKC.pl                      Unicode character database
-lib/unicore/lib/IdType/NotXID.pl                       Unicode character database
-lib/unicore/lib/IdType/Obsolete.pl                     Unicode character database
-lib/unicore/lib/IdType/Recommen.pl                     Unicode character database
-lib/unicore/lib/IdType/Technica.pl                     Unicode character database
-lib/unicore/lib/IdType/Uncommon.pl                     Unicode character database
-lib/unicore/lib/In/10_0.pl                     Unicode character database
-lib/unicore/lib/In/11_0.pl                     Unicode character database
-lib/unicore/lib/In/12_0.pl                     Unicode character database
-lib/unicore/lib/In/12_1.pl                     Unicode character database
-lib/unicore/lib/In/13_0.pl                     Unicode character database
-lib/unicore/lib/In/14_0.pl                     Unicode character database
-lib/unicore/lib/In/2_0.pl                      Unicode character database
-lib/unicore/lib/In/2_1.pl                      Unicode character database
-lib/unicore/lib/In/3_0.pl                      Unicode character database
-lib/unicore/lib/In/3_1.pl                      Unicode character database
-lib/unicore/lib/In/3_2.pl                      Unicode character database
-lib/unicore/lib/In/4_0.pl                      Unicode character database
-lib/unicore/lib/In/4_1.pl                      Unicode character database
-lib/unicore/lib/In/5_0.pl                      Unicode character database
-lib/unicore/lib/In/5_1.pl                      Unicode character database
-lib/unicore/lib/In/5_2.pl                      Unicode character database
-lib/unicore/lib/In/6_0.pl                      Unicode character database
-lib/unicore/lib/In/6_1.pl                      Unicode character database
-lib/unicore/lib/In/6_2.pl                      Unicode character database
-lib/unicore/lib/In/6_3.pl                      Unicode character database
-lib/unicore/lib/In/7_0.pl                      Unicode character database
-lib/unicore/lib/In/8_0.pl                      Unicode character database
-lib/unicore/lib/In/9_0.pl                      Unicode character database
-lib/unicore/lib/InPC/Bottom.pl                 Unicode character database
-lib/unicore/lib/InPC/BottomAn.pl                       Unicode character database
-lib/unicore/lib/InPC/Left.pl                   Unicode character database
-lib/unicore/lib/InPC/LeftAndR.pl                       Unicode character database
-lib/unicore/lib/InPC/NA.pl                     Unicode character database
-lib/unicore/lib/InPC/Overstru.pl                       Unicode character database
-lib/unicore/lib/InPC/Right.pl                  Unicode character database
-lib/unicore/lib/InPC/Top.pl                    Unicode character database
-lib/unicore/lib/InPC/TopAndBo.pl                       Unicode character database
-lib/unicore/lib/InPC/TopAndL2.pl                       Unicode character database
-lib/unicore/lib/InPC/TopAndLe.pl                       Unicode character database
-lib/unicore/lib/InPC/TopAndRi.pl                       Unicode character database
-lib/unicore/lib/InPC/VisualOr.pl                       Unicode character database
-lib/unicore/lib/InSC/Avagraha.pl                       Unicode character database
-lib/unicore/lib/InSC/Bindu.pl                  Unicode character database
-lib/unicore/lib/InSC/Cantilla.pl                       Unicode character database
-lib/unicore/lib/InSC/Consona2.pl                       Unicode character database
-lib/unicore/lib/InSC/Consona3.pl                       Unicode character database
-lib/unicore/lib/InSC/Consona4.pl                       Unicode character database
-lib/unicore/lib/InSC/Consona5.pl                       Unicode character database
-lib/unicore/lib/InSC/Consona6.pl                       Unicode character database
-lib/unicore/lib/InSC/Consona7.pl                       Unicode character database
-lib/unicore/lib/InSC/Consona8.pl                       Unicode character database
-lib/unicore/lib/InSC/Consonan.pl                       Unicode character database
-lib/unicore/lib/InSC/Invisibl.pl                       Unicode character database
-lib/unicore/lib/InSC/Nukta.pl                  Unicode character database
-lib/unicore/lib/InSC/Number.pl                 Unicode character database
-lib/unicore/lib/InSC/Other.pl                  Unicode character database
-lib/unicore/lib/InSC/PureKill.pl                       Unicode character database
-lib/unicore/lib/InSC/Syllable.pl                       Unicode character database
-lib/unicore/lib/InSC/ToneMark.pl                       Unicode character database
-lib/unicore/lib/InSC/Virama.pl                 Unicode character database
-lib/unicore/lib/InSC/Visarga.pl                        Unicode character database
-lib/unicore/lib/InSC/Vowel.pl                  Unicode character database
-lib/unicore/lib/InSC/VowelDep.pl                       Unicode character database
-lib/unicore/lib/InSC/VowelInd.pl                       Unicode character database
-lib/unicore/lib/Jg/Ain.pl                      Unicode character database
-lib/unicore/lib/Jg/Alef.pl                     Unicode character database
-lib/unicore/lib/Jg/Beh.pl                      Unicode character database
-lib/unicore/lib/Jg/Dal.pl                      Unicode character database
-lib/unicore/lib/Jg/FarsiYeh.pl                 Unicode character database
-lib/unicore/lib/Jg/Feh.pl                      Unicode character database
-lib/unicore/lib/Jg/Gaf.pl                      Unicode character database
-lib/unicore/lib/Jg/Hah.pl                      Unicode character database
-lib/unicore/lib/Jg/HanifiRo.pl                 Unicode character database
-lib/unicore/lib/Jg/Kaf.pl                      Unicode character database
-lib/unicore/lib/Jg/Lam.pl                      Unicode character database
-lib/unicore/lib/Jg/NoJoinin.pl                 Unicode character database
-lib/unicore/lib/Jg/Noon.pl                     Unicode character database
-lib/unicore/lib/Jg/Qaf.pl                      Unicode character database
-lib/unicore/lib/Jg/Reh.pl                      Unicode character database
-lib/unicore/lib/Jg/Sad.pl                      Unicode character database
-lib/unicore/lib/Jg/Seen.pl                     Unicode character database
-lib/unicore/lib/Jg/Tah.pl                      Unicode character database
-lib/unicore/lib/Jg/Waw.pl                      Unicode character database
-lib/unicore/lib/Jg/Yeh.pl                      Unicode character database
-lib/unicore/lib/Jt/C.pl                        Unicode character database
-lib/unicore/lib/Jt/D.pl                        Unicode character database
-lib/unicore/lib/Jt/L.pl                        Unicode character database
-lib/unicore/lib/Jt/R.pl                        Unicode character database
-lib/unicore/lib/Jt/T.pl                        Unicode character database
-lib/unicore/lib/Jt/U.pl                        Unicode character database
-lib/unicore/lib/Lb/AI.pl                       Unicode character database
-lib/unicore/lib/Lb/AL.pl                       Unicode character database
-lib/unicore/lib/Lb/BA.pl                       Unicode character database
-lib/unicore/lib/Lb/BB.pl                       Unicode character database
-lib/unicore/lib/Lb/CJ.pl                       Unicode character database
-lib/unicore/lib/Lb/CL.pl                       Unicode character database
-lib/unicore/lib/Lb/CM.pl                       Unicode character database
-lib/unicore/lib/Lb/EX.pl                       Unicode character database
-lib/unicore/lib/Lb/GL.pl                       Unicode character database
-lib/unicore/lib/Lb/ID.pl                       Unicode character database
-lib/unicore/lib/Lb/IN.pl                       Unicode character database
-lib/unicore/lib/Lb/IS.pl                       Unicode character database
-lib/unicore/lib/Lb/NS.pl                       Unicode character database
-lib/unicore/lib/Lb/NU.pl                       Unicode character database
-lib/unicore/lib/Lb/OP.pl                       Unicode character database
-lib/unicore/lib/Lb/PO.pl                       Unicode character database
-lib/unicore/lib/Lb/PR.pl                       Unicode character database
-lib/unicore/lib/Lb/QU.pl                       Unicode character database
-lib/unicore/lib/Lb/SA.pl                       Unicode character database
-lib/unicore/lib/Lb/XX.pl                       Unicode character database
-lib/unicore/lib/Lower/Y.pl                     Unicode character database
-lib/unicore/lib/Math/Y.pl                      Unicode character database
-lib/unicore/lib/NFCQC/M.pl                     Unicode character database
-lib/unicore/lib/NFCQC/Y.pl                     Unicode character database
-lib/unicore/lib/NFDQC/N.pl                     Unicode character database
-lib/unicore/lib/NFDQC/Y.pl                     Unicode character database
-lib/unicore/lib/NFKCQC/N.pl                    Unicode character database
-lib/unicore/lib/NFKCQC/Y.pl                    Unicode character database
-lib/unicore/lib/NFKDQC/N.pl                    Unicode character database
-lib/unicore/lib/NFKDQC/Y.pl                    Unicode character database
-lib/unicore/lib/Nt/Di.pl                       Unicode character database
-lib/unicore/lib/Nt/None.pl                     Unicode character database
-lib/unicore/lib/Nt/Nu.pl                       Unicode character database
-lib/unicore/lib/Nv/0.pl                        Unicode character database
-lib/unicore/lib/Nv/1.pl                        Unicode character database
-lib/unicore/lib/Nv/10.pl                       Unicode character database
-lib/unicore/lib/Nv/100.pl                      Unicode character database
-lib/unicore/lib/Nv/1000.pl                     Unicode character database
-lib/unicore/lib/Nv/10000.pl                    Unicode character database
-lib/unicore/lib/Nv/100000.pl                   Unicode character database
-lib/unicore/lib/Nv/11.pl                       Unicode character database
-lib/unicore/lib/Nv/12.pl                       Unicode character database
-lib/unicore/lib/Nv/13.pl                       Unicode character database
-lib/unicore/lib/Nv/14.pl                       Unicode character database
-lib/unicore/lib/Nv/15.pl                       Unicode character database
-lib/unicore/lib/Nv/16.pl                       Unicode character database
-lib/unicore/lib/Nv/17.pl                       Unicode character database
-lib/unicore/lib/Nv/18.pl                       Unicode character database
-lib/unicore/lib/Nv/19.pl                       Unicode character database
-lib/unicore/lib/Nv/1_16.pl                     Unicode character database
-lib/unicore/lib/Nv/1_2.pl                      Unicode character database
-lib/unicore/lib/Nv/1_3.pl                      Unicode character database
-lib/unicore/lib/Nv/1_4.pl                      Unicode character database
-lib/unicore/lib/Nv/1_6.pl                      Unicode character database
-lib/unicore/lib/Nv/1_8.pl                      Unicode character database
-lib/unicore/lib/Nv/2.pl                        Unicode character database
-lib/unicore/lib/Nv/20.pl                       Unicode character database
-lib/unicore/lib/Nv/200.pl                      Unicode character database
-lib/unicore/lib/Nv/2000.pl                     Unicode character database
-lib/unicore/lib/Nv/20000.pl                    Unicode character database
-lib/unicore/lib/Nv/2_3.pl                      Unicode character database
-lib/unicore/lib/Nv/3.pl                        Unicode character database
-lib/unicore/lib/Nv/30.pl                       Unicode character database
-lib/unicore/lib/Nv/300.pl                      Unicode character database
-lib/unicore/lib/Nv/3000.pl                     Unicode character database
-lib/unicore/lib/Nv/30000.pl                    Unicode character database
-lib/unicore/lib/Nv/3_16.pl                     Unicode character database
-lib/unicore/lib/Nv/3_4.pl                      Unicode character database
-lib/unicore/lib/Nv/4.pl                        Unicode character database
-lib/unicore/lib/Nv/40.pl                       Unicode character database
-lib/unicore/lib/Nv/400.pl                      Unicode character database
-lib/unicore/lib/Nv/4000.pl                     Unicode character database
-lib/unicore/lib/Nv/40000.pl                    Unicode character database
-lib/unicore/lib/Nv/5.pl                        Unicode character database
-lib/unicore/lib/Nv/50.pl                       Unicode character database
-lib/unicore/lib/Nv/500.pl                      Unicode character database
-lib/unicore/lib/Nv/5000.pl                     Unicode character database
-lib/unicore/lib/Nv/50000.pl                    Unicode character database
-lib/unicore/lib/Nv/6.pl                        Unicode character database
-lib/unicore/lib/Nv/60.pl                       Unicode character database
-lib/unicore/lib/Nv/600.pl                      Unicode character database
-lib/unicore/lib/Nv/6000.pl                     Unicode character database
-lib/unicore/lib/Nv/60000.pl                    Unicode character database
-lib/unicore/lib/Nv/7.pl                        Unicode character database
-lib/unicore/lib/Nv/70.pl                       Unicode character database
-lib/unicore/lib/Nv/700.pl                      Unicode character database
-lib/unicore/lib/Nv/7000.pl                     Unicode character database
-lib/unicore/lib/Nv/70000.pl                    Unicode character database
-lib/unicore/lib/Nv/8.pl                        Unicode character database
-lib/unicore/lib/Nv/80.pl                       Unicode character database
-lib/unicore/lib/Nv/800.pl                      Unicode character database
-lib/unicore/lib/Nv/8000.pl                     Unicode character database
-lib/unicore/lib/Nv/80000.pl                    Unicode character database
-lib/unicore/lib/Nv/9.pl                        Unicode character database
-lib/unicore/lib/Nv/90.pl                       Unicode character database
-lib/unicore/lib/Nv/900.pl                      Unicode character database
-lib/unicore/lib/Nv/9000.pl                     Unicode character database
-lib/unicore/lib/Nv/90000.pl                    Unicode character database
-lib/unicore/lib/PatSyn/Y.pl                    Unicode character database
-lib/unicore/lib/PCM/Y.pl                       Unicode character database
-lib/unicore/lib/Perl/_PerlAny.pl                       Unicode character database
-lib/unicore/lib/Perl/_PerlCh2.pl                       Unicode character database
-lib/unicore/lib/Perl/_PerlCha.pl                       Unicode character database
-lib/unicore/lib/Perl/_PerlFol.pl                       Unicode character database
-lib/unicore/lib/Perl/_PerlIDC.pl                       Unicode character database
-lib/unicore/lib/Perl/_PerlIDS.pl                       Unicode character database
-lib/unicore/lib/Perl/_PerlIsI.pl                       Unicode character database
-lib/unicore/lib/Perl/_PerlNch.pl                       Unicode character database
-lib/unicore/lib/Perl/_PerlPat.pl                       Unicode character database
-lib/unicore/lib/Perl/_PerlPr2.pl                       Unicode character database
-lib/unicore/lib/Perl/_PerlPro.pl                       Unicode character database
-lib/unicore/lib/Perl/_PerlQuo.pl                       Unicode character database
-lib/unicore/lib/Perl/Alnum.pl                  Unicode character database
-lib/unicore/lib/Perl/Assigned.pl                       Unicode character database
-lib/unicore/lib/Perl/Blank.pl                  Unicode character database
-lib/unicore/lib/Perl/Graph.pl                  Unicode character database
-lib/unicore/lib/Perl/PerlWord.pl                       Unicode character database
-lib/unicore/lib/Perl/PosixPun.pl                       Unicode character database
-lib/unicore/lib/Perl/Print.pl                  Unicode character database
-lib/unicore/lib/Perl/SpacePer.pl                       Unicode character database
-lib/unicore/lib/Perl/Title.pl                  Unicode character database
-lib/unicore/lib/Perl/Word.pl                   Unicode character database
-lib/unicore/lib/Perl/XPosixPu.pl                       Unicode character database
-lib/unicore/lib/QMark/Y.pl                     Unicode character database
-lib/unicore/lib/SB/AT.pl                       Unicode character database
-lib/unicore/lib/SB/CL.pl                       Unicode character database
-lib/unicore/lib/SB/EX.pl                       Unicode character database
-lib/unicore/lib/SB/FO.pl                       Unicode character database
-lib/unicore/lib/SB/LE.pl                       Unicode character database
-lib/unicore/lib/SB/LO.pl                       Unicode character database
-lib/unicore/lib/SB/NU.pl                       Unicode character database
-lib/unicore/lib/SB/SC.pl                       Unicode character database
-lib/unicore/lib/SB/Sp.pl                       Unicode character database
-lib/unicore/lib/SB/ST.pl                       Unicode character database
-lib/unicore/lib/SB/UP.pl                       Unicode character database
-lib/unicore/lib/SB/XX.pl                       Unicode character database
-lib/unicore/lib/Sc/Arab.pl                     Unicode character database
-lib/unicore/lib/Sc/Beng.pl                     Unicode character database
-lib/unicore/lib/Sc/Cprt.pl                     Unicode character database
-lib/unicore/lib/Sc/Cyrl.pl                     Unicode character database
-lib/unicore/lib/Sc/Deva.pl                     Unicode character database
-lib/unicore/lib/Sc/Dupl.pl                     Unicode character database
-lib/unicore/lib/Sc/Geor.pl                     Unicode character database
-lib/unicore/lib/Sc/Glag.pl                     Unicode character database
-lib/unicore/lib/Sc/Gong.pl                     Unicode character database
-lib/unicore/lib/Sc/Gonm.pl                     Unicode character database
-lib/unicore/lib/Sc/Gran.pl                     Unicode character database
-lib/unicore/lib/Sc/Grek.pl                     Unicode character database
-lib/unicore/lib/Sc/Gujr.pl                     Unicode character database
-lib/unicore/lib/Sc/Guru.pl                     Unicode character database
-lib/unicore/lib/Sc/Han.pl                      Unicode character database
-lib/unicore/lib/Sc/Hang.pl                     Unicode character database
-lib/unicore/lib/Sc/Hira.pl                     Unicode character database
-lib/unicore/lib/Sc/Kana.pl                     Unicode character database
-lib/unicore/lib/Sc/Knda.pl                     Unicode character database
-lib/unicore/lib/Sc/Latn.pl                     Unicode character database
-lib/unicore/lib/Sc/Limb.pl                     Unicode character database
-lib/unicore/lib/Sc/Linb.pl                     Unicode character database
-lib/unicore/lib/Sc/Mlym.pl                     Unicode character database
-lib/unicore/lib/Sc/Mong.pl                     Unicode character database
-lib/unicore/lib/Sc/Mult.pl                     Unicode character database
-lib/unicore/lib/Sc/Orya.pl                     Unicode character database
-lib/unicore/lib/Sc/Sinh.pl                     Unicode character database
-lib/unicore/lib/Sc/Syrc.pl                     Unicode character database
-lib/unicore/lib/Sc/Taml.pl                     Unicode character database
-lib/unicore/lib/Sc/Telu.pl                     Unicode character database
-lib/unicore/lib/Sc/Zinh.pl                     Unicode character database
-lib/unicore/lib/Sc/Zyyy.pl                     Unicode character database
-lib/unicore/lib/Scx/Adlm.pl                    Unicode character database
-lib/unicore/lib/Scx/Arab.pl                    Unicode character database
-lib/unicore/lib/Scx/Armn.pl                    Unicode character database
-lib/unicore/lib/Scx/Beng.pl                    Unicode character database
-lib/unicore/lib/Scx/Bhks.pl                    Unicode character database
-lib/unicore/lib/Scx/Bopo.pl                    Unicode character database
-lib/unicore/lib/Scx/Cakm.pl                    Unicode character database
-lib/unicore/lib/Scx/Cham.pl                    Unicode character database
-lib/unicore/lib/Scx/Copt.pl                    Unicode character database
-lib/unicore/lib/Scx/Cprt.pl                    Unicode character database
-lib/unicore/lib/Scx/Cyrl.pl                    Unicode character database
-lib/unicore/lib/Scx/Deva.pl                    Unicode character database
-lib/unicore/lib/Scx/Diak.pl                    Unicode character database
-lib/unicore/lib/Scx/Dupl.pl                    Unicode character database
-lib/unicore/lib/Scx/Ethi.pl                    Unicode character database
-lib/unicore/lib/Scx/Geor.pl                    Unicode character database
-lib/unicore/lib/Scx/Glag.pl                    Unicode character database
-lib/unicore/lib/Scx/Gong.pl                    Unicode character database
-lib/unicore/lib/Scx/Gonm.pl                    Unicode character database
-lib/unicore/lib/Scx/Gran.pl                    Unicode character database
-lib/unicore/lib/Scx/Grek.pl                    Unicode character database
-lib/unicore/lib/Scx/Gujr.pl                    Unicode character database
-lib/unicore/lib/Scx/Guru.pl                    Unicode character database
-lib/unicore/lib/Scx/Han.pl                     Unicode character database
-lib/unicore/lib/Scx/Hang.pl                    Unicode character database
-lib/unicore/lib/Scx/Hebr.pl                    Unicode character database
-lib/unicore/lib/Scx/Hira.pl                    Unicode character database
-lib/unicore/lib/Scx/Hmng.pl                    Unicode character database
-lib/unicore/lib/Scx/Hmnp.pl                    Unicode character database
-lib/unicore/lib/Scx/Kana.pl                    Unicode character database
-lib/unicore/lib/Scx/Khar.pl                    Unicode character database
-lib/unicore/lib/Scx/Khmr.pl                    Unicode character database
-lib/unicore/lib/Scx/Khoj.pl                    Unicode character database
-lib/unicore/lib/Scx/Knda.pl                    Unicode character database
-lib/unicore/lib/Scx/Kthi.pl                    Unicode character database
-lib/unicore/lib/Scx/Lana.pl                    Unicode character database
-lib/unicore/lib/Scx/Lao.pl                     Unicode character database
-lib/unicore/lib/Scx/Latn.pl                    Unicode character database
-lib/unicore/lib/Scx/Limb.pl                    Unicode character database
-lib/unicore/lib/Scx/Lina.pl                    Unicode character database
-lib/unicore/lib/Scx/Linb.pl                    Unicode character database
-lib/unicore/lib/Scx/Mlym.pl                    Unicode character database
-lib/unicore/lib/Scx/Mong.pl                    Unicode character database
-lib/unicore/lib/Scx/Mult.pl                    Unicode character database
-lib/unicore/lib/Scx/Mymr.pl                    Unicode character database
-lib/unicore/lib/Scx/Nand.pl                    Unicode character database
-lib/unicore/lib/Scx/Nko.pl                     Unicode character database
-lib/unicore/lib/Scx/Orya.pl                    Unicode character database
-lib/unicore/lib/Scx/Phlp.pl                    Unicode character database
-lib/unicore/lib/Scx/Rohg.pl                    Unicode character database
-lib/unicore/lib/Scx/Shrd.pl                    Unicode character database
-lib/unicore/lib/Scx/Sind.pl                    Unicode character database
-lib/unicore/lib/Scx/Sinh.pl                    Unicode character database
-lib/unicore/lib/Scx/Syrc.pl                    Unicode character database
-lib/unicore/lib/Scx/Tagb.pl                    Unicode character database
-lib/unicore/lib/Scx/Takr.pl                    Unicode character database
-lib/unicore/lib/Scx/Talu.pl                    Unicode character database
-lib/unicore/lib/Scx/Taml.pl                    Unicode character database
-lib/unicore/lib/Scx/Tang.pl                    Unicode character database
-lib/unicore/lib/Scx/Telu.pl                    Unicode character database
-lib/unicore/lib/Scx/Thaa.pl                    Unicode character database
-lib/unicore/lib/Scx/Tibt.pl                    Unicode character database
-lib/unicore/lib/Scx/Tirh.pl                    Unicode character database
-lib/unicore/lib/Scx/Vith.pl                    Unicode character database
-lib/unicore/lib/Scx/Xsux.pl                    Unicode character database
-lib/unicore/lib/Scx/Yezi.pl                    Unicode character database
-lib/unicore/lib/Scx/Yi.pl                      Unicode character database
-lib/unicore/lib/Scx/Zinh.pl                    Unicode character database
-lib/unicore/lib/Scx/Zyyy.pl                    Unicode character database
-lib/unicore/lib/Scx/Zzzz.pl                    Unicode character database
-lib/unicore/lib/SD/Y.pl                        Unicode character database
-lib/unicore/lib/STerm/Y.pl                     Unicode character database
-lib/unicore/lib/Term/Y.pl                      Unicode character database
-lib/unicore/lib/UIdeo/Y.pl                     Unicode character database
-lib/unicore/lib/Upper/Y.pl                     Unicode character database
-lib/unicore/lib/Vo/R.pl                        Unicode character database
-lib/unicore/lib/Vo/Tr.pl                       Unicode character database
-lib/unicore/lib/Vo/Tu.pl                       Unicode character database
-lib/unicore/lib/Vo/U.pl                        Unicode character database
-lib/unicore/lib/VS/Y.pl                        Unicode character database
-lib/unicore/lib/WB/EX.pl                       Unicode character database
-lib/unicore/lib/WB/Extend.pl                   Unicode character database
-lib/unicore/lib/WB/FO.pl                       Unicode character database
-lib/unicore/lib/WB/HL.pl                       Unicode character database
-lib/unicore/lib/WB/KA.pl                       Unicode character database
-lib/unicore/lib/WB/LE.pl                       Unicode character database
-lib/unicore/lib/WB/MB.pl                       Unicode character database
-lib/unicore/lib/WB/ML.pl                       Unicode character database
-lib/unicore/lib/WB/MN.pl                       Unicode character database
-lib/unicore/lib/WB/NU.pl                       Unicode character database
-lib/unicore/lib/WB/WSegSpac.pl                 Unicode character database
-lib/unicore/lib/WB/XX.pl                       Unicode character database
-lib/unicore/lib/XIDC/Y.pl                      Unicode character database
-lib/unicore/lib/XIDS/Y.pl                      Unicode character database
 lib/unicore/LineBreak.txt                      Unicode character database
 lib/unicore/Makefile                           Unicode character database
 lib/unicore/mktables                           Unicode character database generator
-lib/unicore/mktables.lst                       Unicode character database
-lib/unicore/Name.pl                    Unicode character database
-lib/unicore/Name.pm                    Unicode character database
 lib/unicore/NameAliases.txt                    Unicode character database
 lib/unicore/NamedSequences.txt                 Unicode character database
 lib/unicore/NamedSqProv.txt                    Unicode character database
 lib/unicore/NamesList.txt                      Unicode character database
-lib/unicore/NormalizationCorrections.txt                       Unicode character database
+lib/unicore/NormalizationCorrections.txt       Unicode character database
+lib/unicore/NormTest.txt                       Unicode character database
 lib/unicore/PropertyAliases.txt                        Unicode character database
 lib/unicore/PropList.txt                       Unicode character database
-lib/unicore/PropValueAliases.txt                       Unicode character database
+lib/unicore/PropValueAliases.txt               Unicode character database
 lib/unicore/README.perl                                Unicode character database
 lib/unicore/ReadMe.txt                         Unicode character database info
-lib/unicore/ScriptExtensions.txt                       Unicode character database
+lib/unicore/ScriptExtensions.txt               Unicode character database
 lib/unicore/Scripts.txt                                Unicode character database
 lib/unicore/SpecialCasing.txt                  Unicode character database
-lib/unicore/StandardizedVariants.txt                   Unicode character database
-lib/unicore/TestProp.pl                        Unicode character database
-lib/unicore/To/_PerlLB.pl                      Unicode character database
-lib/unicore/To/_PerlSCX.pl                     Unicode character database
-lib/unicore/To/Age.pl                  Unicode character database
-lib/unicore/To/Bc.pl                   Unicode character database
-lib/unicore/To/Bmg.pl                  Unicode character database
-lib/unicore/To/Bpb.pl                  Unicode character database
-lib/unicore/To/Bpt.pl                  Unicode character database
-lib/unicore/To/Cf.pl                   Unicode character database
-lib/unicore/To/Ea.pl                   Unicode character database
-lib/unicore/To/EqUIdeo.pl                      Unicode character database
-lib/unicore/To/Gc.pl                   Unicode character database
-lib/unicore/To/GCB.pl                  Unicode character database
-lib/unicore/To/Hst.pl                  Unicode character database
-lib/unicore/To/Identif2.pl                     Unicode character database
-lib/unicore/To/Identifi.pl                     Unicode character database
-lib/unicore/To/InPC.pl                 Unicode character database
-lib/unicore/To/InSC.pl                 Unicode character database
-lib/unicore/To/Isc.pl                  Unicode character database
-lib/unicore/To/Jg.pl                   Unicode character database
-lib/unicore/To/Jt.pl                   Unicode character database
-lib/unicore/To/Lb.pl                   Unicode character database
-lib/unicore/To/Lc.pl                   Unicode character database
-lib/unicore/To/Na1.pl                  Unicode character database
-lib/unicore/To/NameAlia.pl                     Unicode character database
-lib/unicore/To/NFCQC.pl                        Unicode character database
-lib/unicore/To/NFDQC.pl                        Unicode character database
-lib/unicore/To/NFKCCF.pl                       Unicode character database
-lib/unicore/To/NFKCQC.pl                       Unicode character database
-lib/unicore/To/NFKDQC.pl                       Unicode character database
-lib/unicore/To/Nt.pl                   Unicode character database
-lib/unicore/To/Nv.pl                   Unicode character database
-lib/unicore/To/PerlDeci.pl                     Unicode character database
-lib/unicore/To/SB.pl                   Unicode character database
-lib/unicore/To/Sc.pl                   Unicode character database
-lib/unicore/To/Scx.pl                  Unicode character database
-lib/unicore/To/Tc.pl                   Unicode character database
-lib/unicore/To/Uc.pl                   Unicode character database
-lib/unicore/To/Vo.pl                   Unicode character database
-lib/unicore/To/WB.pl                   Unicode character database
-lib/unicore/UCD.pl                     Unicode character database
+lib/unicore/StandardizedVariants.txt           Unicode character database
+lib/unicore/TestNorm.pl                                Unicode character database
 lib/unicore/uni_keywords.pl                    Indices into array in charclass_invlists.h
 lib/unicore/UnicodeData.txt                    Unicode character database
 lib/unicore/version                            The version of the Unicode
-lib/unicore/VerticalOrientation.txt                    Unicode character database
-lib/UNIVERSAL.pm               Base class for ALL classes
-lib/User/grent.pm              By-name interface to Perl's builtin getgr*
-lib/User/grent.t               See if User::grwent works
-lib/User/pwent.pm              By-name interface to Perl's builtin getpw*
-lib/User/pwent.t               See if User::pwent works
-lib/utf8.pm                    Pragma to control Unicode support
-lib/utf8.t                     See if utf8 operations work
-lib/vars.pm                    Declare pseudo-imported global variables
-lib/vars.t                     See if "use vars" works
-lib/vars_carp.t                        See if "use vars" doesn't load Carp.pm per default
-lib/vmsish.pm                  Control VMS-specific behavior of Perl core
-lib/vmsish.t                   Tests for vmsish.pm
-lib/warnings.pm                        For "use warnings"
-lib/warnings.t                 See if warning controls work
-lib/warnings/register.pm       For "use warnings::register"
-locale.c                       locale-specific utility functions
-make_ext.pl                    Used by Makefile to execute extension Makefiles
-make_patchnum.pl               Script to generate git_version.h and lib/Config_git.pl files for all OS'es
-makedef.pl                     Create symbol export lists for linking
-makedepend.SH                  Precursor to makedepend
-makedepend_file.SH                     Precursor to makedepend_file
-Makefile.micro                 microperl Makefile
-Makefile.SH                    A script that generates Makefile
-malloc.c                       A version of malloc you might not want
-malloc_ctl.h                   A version of malloc you might not want
-MANIFEST                       This list of files
-mathoms.c                      A home for binary-compatible code artifacts
-META.json                      Distribution meta-data in JSON
-META.yml                       Distribution meta-data in YAML
-metaconfig.h                   Control file for the metaconfig process
-metaconfig.SH                  Control file for the metaconfig process
-mg.c                           Magic code
-mg.h                           Magic header
-mg_names.inc                   Generated magic names used by dump.c
-mg_raw.h                       Generated magic data used by generate_uudmap.c
-mg_vtable.h                    Generated magic vtable data
-miniperlmain.c                 Basic perl w/o dynamic loading or extensions
-mkppport                       A script that distributes ppport.h
-mkppport.lst                   List of extensions that need a ppport.h
-mro_core.c                             Method Resolution Order code
-myconfig.SH                    Prints summary of the current configuration
-mydtrace.h                     Support for optional DTrace probes
-nostdio.h                      Cause compile error on stdio calls
-numeric.c                      Miscellaneous numeric conversion routines
-op.c                           Opcode syntax tree code
-op.h                           Opcode syntax tree header
-op_reg_common.h                        Common parts of op.h, regexp.h header
-opcode.h                       Automatically generated opcode header
-opnames.h                      Automatically generated opcode header
-os2/Changes                    Changelog for OS/2 port
-os2/diff.configure             Patches to Configure
-os2/dl_os2.c                   Addon for dl_open
-os2/dlfcn.h                    Addon for dl_open
-os2/Makefile.SHs               Shared library generation for OS/2
-os2/os2.c                      Additional code for OS/2
-os2/os2.sym                    Additional symbols to export
-os2/OS2/OS2-ExtAttr/Changes    EA access module
-os2/OS2/OS2-ExtAttr/ExtAttr.pm EA access module
-os2/OS2/OS2-ExtAttr/ExtAttr.xs EA access module
-os2/OS2/OS2-ExtAttr/Makefile.PL        EA access module
-os2/OS2/OS2-ExtAttr/MANIFEST   EA access module
-os2/OS2/OS2-ExtAttr/myea.h     EA access module
-os2/OS2/OS2-ExtAttr/t/os2_ea.t EA access module
-os2/OS2/OS2-ExtAttr/typemap    EA access module
-os2/OS2/OS2-PrfDB/Changes      System database access module
-os2/OS2/OS2-PrfDB/Makefile.PL  System database access module
-os2/OS2/OS2-PrfDB/MANIFEST     System database access module
-os2/OS2/OS2-PrfDB/PrfDB.pm     System database access module
-os2/OS2/OS2-PrfDB/PrfDB.xs     System database access module
-os2/OS2/OS2-PrfDB/t/os2_prfdb.t        System database access module
-os2/OS2/OS2-Process/Makefile.PL        system() constants in a module
-os2/OS2/OS2-Process/MANIFEST   system() constants in a module
-os2/OS2/OS2-Process/Process.pm system() constants in a module
-os2/OS2/OS2-Process/Process.xs system() constants in a module
-os2/OS2/OS2-Process/t/os2_atoms.t      Test for OS2::Process
-os2/OS2/OS2-Process/t/os2_clipboard.t  Test for OS2::Process
-os2/OS2/OS2-Process/t/os2_process.t    Tests
-os2/OS2/OS2-Process/t/os2_process_kid.t        Tests
+lib/unicore/VerticalOrientation.txt            Unicode character database
+lib/UNIVERSAL.pm                       Base class for ALL classes
+lib/User/grent.pm                      By-name interface to Perl's builtin getgr*
+lib/User/grent.t                       See if User::grwent works
+lib/User/pwent.pm                      By-name interface to Perl's builtin getpw*
+lib/User/pwent.t                       See if User::pwent works
+lib/utf8.pm                            Pragma to control Unicode support
+lib/utf8.t                             See if utf8 operations work
+lib/vars.pm                            Declare pseudo-imported global variables
+lib/vars.t                             See if "use vars" works
+lib/vars_carp.t                                See if "use vars" doesn't load Carp.pm per default
+lib/vmsish.pm                          Control VMS-specific behavior of Perl core
+lib/vmsish.t                           Tests for vmsish.pm
+lib/warnings.pm                                For "use warnings"
+lib/warnings.t                         See if warning controls work
+lib/warnings/register.pm               For "use warnings::register"
+os2/Changes                            Changelog for OS/2 port
+os2/diff.configure                     Patches to Configure
+os2/dl_os2.c                           Addon for dl_open
+os2/dlfcn.h                            Addon for dl_open
+os2/Makefile.SHs                       Shared library generation for OS/2
+os2/os2.c                              Additional code for OS/2
+os2/os2.sym                            Additional symbols to export
+os2/OS2/OS2-ExtAttr/Changes                    EA access module
+os2/OS2/OS2-ExtAttr/ExtAttr.pm                 EA access module
+os2/OS2/OS2-ExtAttr/ExtAttr.xs                 EA access module
+os2/OS2/OS2-ExtAttr/Makefile.PL                        EA access module
+os2/OS2/OS2-ExtAttr/MANIFEST                   EA access module
+os2/OS2/OS2-ExtAttr/myea.h                     EA access module
+os2/OS2/OS2-ExtAttr/t/os2_ea.t                 EA access module
+os2/OS2/OS2-ExtAttr/typemap                    EA access module
+os2/OS2/OS2-PrfDB/Changes                      System database access module
+os2/OS2/OS2-PrfDB/Makefile.PL                  System database access module
+os2/OS2/OS2-PrfDB/MANIFEST                     System database access module
+os2/OS2/OS2-PrfDB/PrfDB.pm                     System database access module
+os2/OS2/OS2-PrfDB/PrfDB.xs                     System database access module
+os2/OS2/OS2-PrfDB/t/os2_prfdb.t                        System database access module
+os2/OS2/OS2-Process/Makefile.PL                        system() constants in a module
+os2/OS2/OS2-Process/MANIFEST                   system() constants in a module
+os2/OS2/OS2-Process/Process.pm                 system() constants in a module
+os2/OS2/OS2-Process/Process.xs                 system() constants in a module
+os2/OS2/OS2-Process/t/os2_atoms.t              Test for OS2::Process
+os2/OS2/OS2-Process/t/os2_clipboard.t          Test for OS2::Process
+os2/OS2/OS2-Process/t/os2_process.t            Tests
+os2/OS2/OS2-Process/t/os2_process_kid.t                Tests
 os2/OS2/OS2-Process/t/os2_process_text.t       Tests
-os2/OS2/OS2-REXX/Changes               DLL access module
-os2/OS2/OS2-REXX/DLL/Changes   DLL access module
-os2/OS2/OS2-REXX/DLL/DLL.pm    DLL access module
-os2/OS2/OS2-REXX/DLL/DLL.xs    DLL access module
-os2/OS2/OS2-REXX/DLL/Makefile.PL       DLL access module
-os2/OS2/OS2-REXX/DLL/MANIFEST  DLL access module
-os2/OS2/OS2-REXX/Makefile.PL   DLL access module
-os2/OS2/OS2-REXX/MANIFEST      DLL access module
-os2/OS2/OS2-REXX/REXX.pm       DLL access module
-os2/OS2/OS2-REXX/REXX.xs       DLL access module
-os2/OS2/OS2-REXX/t/rx_cmprt.t  DLL access module
-os2/OS2/OS2-REXX/t/rx_dllld.t  DLL access module
-os2/OS2/OS2-REXX/t/rx_emxrv.t  DLL access module
-os2/OS2/OS2-REXX/t/rx_objcall.t        DLL access module
-os2/OS2/OS2-REXX/t/rx_sql.test DLL access module
-os2/OS2/OS2-REXX/t/rx_tiesql.test      DLL access module
-os2/OS2/OS2-REXX/t/rx_tievar.t DLL access module
-os2/OS2/OS2-REXX/t/rx_tieydb.t DLL access module
-os2/OS2/OS2-REXX/t/rx_varset.t DLL access module
-os2/OS2/OS2-REXX/t/rx_vrexx.t  DLL access module
-os2/OS2/typemap                        Common typemap for OS/2 types
-os2/os2_base.t                 Additional tests for builtin methods
-os2/os2_pipe.t                 Tests for pipe creation logic
-os2/os2add.sym                 Overriding symbols to export
-os2/os2ish.h                   Header for OS/2
-os2/os2thread.h                        pthread-like typedefs
-os2/perl2cmd.pl                        Corrects installed binaries under OS/2
-os2/perlrexx.c                 Support perl interpreter embedded in REXX
-os2/perlrexx.cmd               Test perl interpreter embedded in REXX
-overload.h                     generated overload enum (public)
-overload.inc                   generated overload name table (implementation)
-PACKAGING                      notes and best practice for packaging perl 5
-packsizetables.inc             The generated packprops array used in pp_pack.c
-pad.c                          Scratchpad functions
-pad.h                          Scratchpad headers
-parser.h                       parser object header
-patchlevel.h                   The current patch level of perl
-perl.c                         main()
-perl.h                         Global declarations
-perl_inc_macro.h               macro used to set \@INC using S_incpush_use_sep
-perl_langinfo.h                        Perl's version of <langinfo.h>
-perl_siphash.h                 Implementation of SipHash
-perlapi.h                      Empty backwards-compat include
-perldtrace.d                   D script for Perl probes
-perlio.c                       C code for PerlIO abstraction
-perlio.h                       PerlIO abstraction
-perlio.sym                     Symbols for PerlIO abstraction
-perliol.h                      PerlIO Layer definition
-perlsdio.h                     Fake stdio using perlio
-perlvars.h                     Global variables
-perly.act                      parser actions; derived from perly.y
-perly.c                                parser code (NOT derived from perly.y)
-perly.h                                header file for perly.c; derived from perly.y
-perly.tab                      parser state tables; derived from perly.y
-perly.y                                Yacc grammar for perl
-plan9/9front.patch             Plan9 port: patch for 9front-specific flavor of Plan 9
-plan9/aperl                    Plan9 port: shell to make Perl error messages Acme-friendly
-plan9/arpa/inet.h              Plan9 port: replacement C header file
-plan9/buildinfo                        Plan9 port: configuration information
-plan9/config.plan9             Plan9 port: config.h template
-plan9/config_h.sample          Plan9 port: 5.32.0 sample config.h
-plan9/config_sh.sample         Plan9 port: 5.32.0 sample config.sh
-plan9/exclude                  Plan9 port: tests to skip
-plan9/fndvers                  Plan9 port: update Perl version in config.plan9
-plan9/genconfig.pl             Plan9 port: generate config.sh
-plan9/math.h                   Plan9 port: Plan9-specific math.h
-plan9/mkfile                   Plan9 port: Mk driver for build
-plan9/myconfig.plan9           Plan9 port: script to print config summary
-plan9/plan9.c                  Plan9 port: Plan9-specific C routines
-plan9/plan9ish.h               Plan9 port: Plan9-specific C header file
-plan9/setup.rc                 Plan9 port: script for easy build+install
-plan9/uninstall.rc             Plan9 port: uninstall script
-plan9/versnum                  Plan9 port: script to print version number
-pod/buildtoc                   Generate pod/perltoc.pod and pod/roffitall
-pod/Makefile.SH                        generate Makefile which makes pods into something else
-pod/perl.pod                   Perl overview (this section)
-pod/perl5004delta.pod          Perl changes in version 5.004
-pod/perl5005delta.pod          Perl changes in version 5.005
-pod/perl5100delta.pod          Perl changes in version 5.10.0
-pod/perl5101delta.pod          Perl changes in version 5.10.1
-pod/perl5120delta.pod          Perl changes in version 5.12.0
-pod/perl5121delta.pod          Perl changes in version 5.12.1
-pod/perl5122delta.pod          Perl changes in version 5.12.2
-pod/perl5123delta.pod          Perl changes in version 5.12.3
-pod/perl5124delta.pod          Perl changes in version 5.12.4
-pod/perl5125delta.pod          Perl changes in version 5.12.5
-pod/perl5140delta.pod          Perl changes in version 5.14.0
-pod/perl5141delta.pod          Perl changes in version 5.14.1
-pod/perl5142delta.pod          Perl changes in version 5.14.2
-pod/perl5143delta.pod          Perl changes in version 5.14.3
-pod/perl5144delta.pod          Perl changes in version 5.14.4
-pod/perl5160delta.pod          Perl changes in version 5.16.0
-pod/perl5161delta.pod          Perl changes in version 5.16.1
-pod/perl5162delta.pod          Perl changes in version 5.16.2
-pod/perl5163delta.pod          Perl changes in version 5.16.3
-pod/perl5180delta.pod          Perl changes in version 5.18.0
-pod/perl5181delta.pod          Perl changes in version 5.18.1
-pod/perl5182delta.pod          Perl changes in version 5.18.2
-pod/perl5184delta.pod          Perl changes in version 5.18.4
-pod/perl5200delta.pod          Perl changes in version 5.20.0
-pod/perl5201delta.pod          Perl changes in version 5.20.1
-pod/perl5202delta.pod          Perl changes in version 5.20.2
-pod/perl5203delta.pod          Perl changes in version 5.20.3
-pod/perl5220delta.pod          Perl changes in version 5.22.0
-pod/perl5221delta.pod          Perl changes in version 5.22.1
-pod/perl5222delta.pod          Perl changes in version 5.22.2
-pod/perl5223delta.pod          Perl changes in version 5.22.3
-pod/perl5224delta.pod          Perl changes in version 5.22.4
-pod/perl5240delta.pod          Perl changes in version 5.24.0
-pod/perl5241delta.pod          Perl changes in version 5.24.1
-pod/perl5242delta.pod          Perl changes in version 5.24.2
-pod/perl5243delta.pod          Perl changes in version 5.24.3
-pod/perl5244delta.pod          Perl changes in version 5.24.4
-pod/perl5260delta.pod          Perl changes in version 5.26.0
-pod/perl5261delta.pod          Perl changes in version 5.26.1
-pod/perl5262delta.pod          Perl changes in version 5.26.2
-pod/perl5263delta.pod          Perl changes in version 5.26.3
-pod/perl5280delta.pod          Perl changes in version 5.28.0
-pod/perl5281delta.pod          Perl changes in version 5.28.1
-pod/perl5282delta.pod          Perl changes in version 5.28.2
-pod/perl5283delta.pod          Perl changes in version 5.28.3
-pod/perl5300delta.pod          Perl changes in version 5.30.0
-pod/perl5301delta.pod          Perl changes in version 5.30.1
-pod/perl5302delta.pod          Perl changes in version 5.30.2
-pod/perl5303delta.pod          Perl changes in version 5.30.3
-pod/perl5320delta.pod          Perl changes in version 5.32.0
-pod/perl5321delta.pod          Perl changes in version 5.32.1
-pod/perl5340delta.pod          Perl changes in version 5.34.0
-pod/perl5341delta.pod          Perl changes in version 5.34.1
-pod/perl5342delta.pod          Perl changes in version 5.34.2
-pod/perl5343delta.pod          Perl changes in version 5.34.3
-pod/perl5360delta.pod          Perl changes in version 5.36.0
-pod/perl5361delta.pod          Perl changes in version 5.36.1
-pod/perl5362delta.pod          Perl changes in version 5.36.2
-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
-pod/perl582delta.pod           Perl changes in version 5.8.2
-pod/perl583delta.pod           Perl changes in version 5.8.3
-pod/perl584delta.pod           Perl changes in version 5.8.4
-pod/perl585delta.pod           Perl changes in version 5.8.5
-pod/perl586delta.pod           Perl changes in version 5.8.6
-pod/perl587delta.pod           Perl changes in version 5.8.7
-pod/perl588delta.pod           Perl changes in version 5.8.8
-pod/perl589delta.pod           Perl changes in version 5.8.9
-pod/perl58delta.pod            Perl changes in version 5.8.0
-pod/perlapio.pod               Perl internal IO abstraction interface
-pod/perlartistic.pod           Perl Artistic License
-pod/perlbook.pod               Perl book information
-pod/perlboot.pod               
-pod/perlbot.pod                        
-pod/perlcall.pod               Perl calling conventions from C
-pod/perlcheat.pod              Perl cheat sheet
-pod/perlclib.pod               Internal replacements for standard C library functions
-pod/perlcommunity.pod          Perl community information
-pod/perldata.pod               Perl data structures
-pod/perldbmfilter.pod          Perl DBM filters
-pod/perldebguts.pod            Perl debugging guts and tips
-pod/perldebtut.pod             Perl debugging tutorial
-pod/perldebug.pod              Perl debugging
-pod/perldelta.pod              Perl changes since previous version
-pod/perldeprecation.pod                Perl deprecations
-pod/perldiag.pod               Perl diagnostic messages
-pod/perldocstyle.pod           Perl style guide for core docs
-pod/perldsc.pod                        Perl data structures intro
-pod/perldtrace.pod             Perl's support for DTrace
-pod/perlebcdic.pod             Considerations for running Perl on EBCDIC platforms
-pod/perlembed.pod              Perl ways to embed perl in your C or C++ application
-pod/perlexperiment.pod         A listing of experimental features in Perl
-pod/perlfilter.pod             Perl source filters
-pod/perlfork.pod               Perl fork() information
-pod/perlform.pod               Perl formats
-pod/perlfunc.pod               Perl built-in functions
-pod/perlgit.pod                        Using git with the Perl repository
-pod/perlgov.pod                        Perl Rules of Governance
-pod/perlgpl.pod                        GNU General Public License
-pod/perlguts.pod               Perl internal functions for those doing extensions
-pod/perlhack.pod               Perl hackers guide
-pod/perlhacktips.pod           Tips for Perl core C code hacking
-pod/perlhacktut.pod            Walk through the creation of a simple C code patch
-pod/perlhist.pod               Perl history records
-pod/perlinterp.pod             Overview of the Perl interpreter source and how it works
-pod/perlintro.pod              Perl introduction for beginners
-pod/perliol.pod                        C API for Perl's implementation of IO in Layers
-pod/perlipc.pod                        Perl interprocess communication
-pod/perllexwarn.pod            Perl warnings and their control
-pod/perllocale.pod             Perl locale support
-pod/perllol.pod                        Perl data structures: arrays of arrays
-pod/perlmod.pod                        Perl modules: how they work
-pod/perlmodinstall.pod         Perl modules: how to install from CPAN
-pod/perlmodlib.PL              Generate pod/perlmodlib.pod
-pod/perlmodstyle.pod           Perl modules: how to write modules with style
-pod/perlmroapi.pod             Perl method resolution plugin interface
-pod/perlnewmod.pod             Perl modules: preparing a new module for distribution
-pod/perlnumber.pod             Perl number semantics
-pod/perlobj.pod                        Perl objects
-pod/perlootut.pod              Perl OO tutorial for beginners
-pod/perlop.pod                 Perl operators and precedence
-pod/perlopentut.pod            Perl open() tutorial
-pod/perlpacktut.pod            Perl pack() and unpack() tutorial
-pod/perlperf.pod               Perl Performance and Optimization Techniques
-pod/perlpod.pod                        Perl plain old documentation
-pod/perlpodspec.pod            Perl plain old documentation format specification
-pod/perlpodstyle.pod           Perl POD style guide
-pod/perlpolicy.pod             Perl development policies
-pod/perlport.pod               Perl portability guide
-pod/perlpragma.pod             Perl modules: writing a user pragma
-pod/perlre.pod                 Perl regular expressions, the rest of the story
-pod/perlreapi.pod              Perl regular expression plugin interface
-pod/perlrebackslash.pod                Perl regular expression backslash sequences
-pod/perlrecharclass.pod                Perl regular expression character classes
-pod/perlref.pod                        Perl references, the rest of the story
-pod/perlreftut.pod             Perl references short introduction
-pod/perlreguts.pod             Perl regular expression engine internals
-pod/perlrepository.pod         
-pod/perlrequick.pod            Perl regular expressions quick start
-pod/perlreref.pod              Perl regular expressions quick reference
-pod/perlretut.pod              Perl regular expressions tutorial
-pod/perlrun.pod                        Perl execution and options
-pod/perlsec.pod                        Perl security
-pod/perlsecpolicy.pod          Perl security report handling policy
-pod/perlsource.pod             Guide to the Perl source tree
-pod/perlstyle.pod              Perl style guide
-pod/perlsub.pod                        Perl subroutines
-pod/perlsyn.pod                        Perl syntax
-pod/perlthrtut.pod             Perl threads tutorial
-pod/perltie.pod                        Perl objects hidden behind simple variables
-pod/perltodo.pod               
-pod/perltooc.pod               
-pod/perltoot.pod               
-pod/perltrap.pod               Perl traps for the unwary
-pod/perlunicode.pod            Perl Unicode support
-pod/perlunicook.pod            Perl Unicode cookbook
-pod/perlunifaq.pod             Perl Unicode FAQ
-pod/perluniintro.pod           Perl Unicode introduction
-pod/perluniprops.pod           Index of Unicode properties in Perl
-pod/perlunitut.pod             Perl Unicode tutorial
-pod/perlutil.pod               utilities packaged with the Perl distribution
-pod/perlvar.pod                        Perl predefined variables
-pod/perlvms.pod                        Perl notes for VMS
-pod/rofftoc                    Generate a table of contents in troff format
-pod/splitman                   Splits perlfunc into multiple man pages
-pod/splitpod                   Splits perlfunc into multiple pod pages
-Policy_sh.SH                   Hold site-wide preferences between Configure runs.
-Porting/acknowledgements.pl    Generate perldelta acknowledgements text
-Porting/add-package.pl         Add/Update CPAN modules that are part of Core
-Porting/add-pod-file           Utility to add new pod/*.pod file to core distribution
-Porting/bench.pl               Run benchmarks against t/perf/benchmarks
-Porting/bisect.pl              A tool to make bisecting easy
-Porting/bisect-example.sh      Example script to use with git bisect run
-Porting/bisect-runner.pl       Tool to be called by git bisect run
-Porting/bump-perl-version      bump the perl version in relevant files
-Porting/check-cpan-pollution   Check for commits that may wrongly touch CPAN distros
-Porting/checkansi.pl           Check source code for ANSI-C violations
-Porting/checkAUTHORS.pl                Check that the AUTHORS file is complete
-Porting/checkcfguse.pl         Check that config symbols are being used
-Porting/checkcfgvar.pl         Check that config scripts define all symbols
-Porting/checkpodencoding.pl    Check POD encoding
-Porting/checkURL.pl            Check whether we have working URLs
-Porting/checkVERSION.pl                Check whether we have $VERSIONs
-Porting/cmpVERSION.pl          Compare whether two trees have changed modules
-Porting/config.sh              Sample config.sh
-Porting/config_H               Sample config.h
-Porting/config_h.pl            Reorder config_h.SH after metaconfig
-Porting/core-cpan-diff         Compare core distros with their CPAN equivalents
-Porting/core-team.json         Membership of the Perl Core Team
-Porting/corecpan.pl            Reports outdated dual-lived modules
-Porting/corelist.pl            Generates data for Module::CoreList
-Porting/corelist-diff          Tool to produce corelist diffs
-Porting/corelist-perldelta.pl  Generates data perldelta from Module::CoreList
-Porting/deparse-skips.txt      List of test files to ignore/skip for deparse tests.
-Porting/docs-team-charter.pod  Perl Documentation Team charter
-Porting/epigraphs.pod          the release epigraphs used over the years
-Porting/exec-bit.txt           List of files that get +x in release tarball
-Porting/exercise_makedef.pl    Brute force testing for makedef.pl
-Porting/expand-macro.pl                A tool to expand C macro definitions in the Perl source
-Porting/findrfuncs             Find reentrant variants of functions used in an executable
-Porting/git-deltatool          Mark commits for perldelta in git notes
-Porting/git-find-p4-change     Find the change for a p4 change number
-Porting/git-make-p4-refs       Output git refs for each p4 change number, suitable for appending to .git/packed-refs
-Porting/GitUtils.pm            Generate the contents of a .patch file
-Porting/Glossary               Glossary of config.sh variables
-Porting/harness-timer-report.pl        Analyze the timings from the test harness
-Porting/how_to_write_a_perldelta.pod   Bluffer's guide to writing a perldelta.
-Porting/leakfinder.pl          Hacky script for finding memory leaks
-Porting/Maintainers            Program to pretty print info in Maintainers.pl
-Porting/Maintainers.pl         Information about maintainers
-Porting/Maintainers.pm         Library to pretty print info in Maintainers.pl
-Porting/make-rmg-checklist     Generates a checklist 4 the release manager
-Porting/make_dot_patch.pl      Make a .patch file from a git WD
-Porting/make_snapshot.pl       Make a tgz snapshot of our tree with a .patch file in it
-Porting/makemeta               Create the top-level META.yml
-Porting/makerel                        Release making utility
-Porting/manicheck              Check against MANIFEST
-Porting/manifest_lib.pl                Library for checking and sorting the MANIFEST
-Porting/manisort               Sort the MANIFEST
-Porting/mksample               Generate Porting/config_H and Porting/config.sh
-Porting/new-perldelta.pl       Generate a new perldelta
-Porting/newtests-perldelta.pl  Generate Perldelta stub for newly added tests
-Porting/perldelta_template.pod Template for creating new perldelta.pod files
+os2/OS2/OS2-REXX/Changes                       DLL access module
+os2/OS2/OS2-REXX/DLL/Changes                   DLL access module
+os2/OS2/OS2-REXX/DLL/DLL.pm                    DLL access module
+os2/OS2/OS2-REXX/DLL/DLL.xs                    DLL access module
+os2/OS2/OS2-REXX/DLL/Makefile.PL               DLL access module
+os2/OS2/OS2-REXX/DLL/MANIFEST                  DLL access module
+os2/OS2/OS2-REXX/Makefile.PL                   DLL access module
+os2/OS2/OS2-REXX/MANIFEST                      DLL access module
+os2/OS2/OS2-REXX/REXX.pm                       DLL access module
+os2/OS2/OS2-REXX/REXX.xs                       DLL access module
+os2/OS2/OS2-REXX/t/rx_cmprt.t                  DLL access module
+os2/OS2/OS2-REXX/t/rx_dllld.t                  DLL access module
+os2/OS2/OS2-REXX/t/rx_emxrv.t                  DLL access module
+os2/OS2/OS2-REXX/t/rx_objcall.t                        DLL access module
+os2/OS2/OS2-REXX/t/rx_sql.test                 DLL access module
+os2/OS2/OS2-REXX/t/rx_tiesql.test              DLL access module
+os2/OS2/OS2-REXX/t/rx_tievar.t                 DLL access module
+os2/OS2/OS2-REXX/t/rx_tieydb.t                 DLL access module
+os2/OS2/OS2-REXX/t/rx_varset.t                 DLL access module
+os2/OS2/OS2-REXX/t/rx_vrexx.t                  DLL access module
+os2/OS2/typemap                                        Common typemap for OS/2 types
+os2/os2_base.t                         Additional tests for builtin methods
+os2/os2_pipe.t                         Tests for pipe creation logic
+os2/os2add.sym                         Overriding symbols to export
+os2/os2ish.h                           Header for OS/2
+os2/os2thread.h                                pthread-like typedefs
+os2/perl2cmd.pl                                Corrects installed binaries under OS/2
+os2/perlrexx.c                         Support perl interpreter embedded in REXX
+os2/perlrexx.cmd                       Test perl interpreter embedded in REXX
+plan9/9front.patch                     Plan9 port: patch for 9front-specific flavor of Plan 9
+plan9/aperl                            Plan9 port: shell to make Perl error messages Acme-friendly
+plan9/arpa/inet.h                      Plan9 port: replacement C header file
+plan9/buildinfo                                Plan9 port: configuration information
+plan9/config.plan9                     Plan9 port: config.h template
+plan9/config_h.sample                  Plan9 port: 5.32.0 sample config.h
+plan9/config_sh.sample                 Plan9 port: 5.32.0 sample config.sh
+plan9/exclude                          Plan9 port: tests to skip
+plan9/fndvers                          Plan9 port: update Perl version in config.plan9
+plan9/genconfig.pl                     Plan9 port: generate config.sh
+plan9/math.h                           Plan9 port: Plan9-specific math.h
+plan9/mkfile                           Plan9 port: Mk driver for build
+plan9/myconfig.plan9                   Plan9 port: script to print config summary
+plan9/plan9.c                          Plan9 port: Plan9-specific C routines
+plan9/plan9ish.h                       Plan9 port: Plan9-specific C header file
+plan9/setup.rc                         Plan9 port: script for easy build+install
+plan9/uninstall.rc                     Plan9 port: uninstall script
+plan9/versnum                          Plan9 port: script to print version number
+pod/buildtoc                           Generate pod/perltoc.pod and pod/roffitall
+pod/Makefile.SH                                generate Makefile which makes pods into something else
+pod/perl.pod                           Perl overview (this section)
+pod/perl5004delta.pod                  Perl changes in version 5.004
+pod/perl5005delta.pod                  Perl changes in version 5.005
+pod/perl5100delta.pod                  Perl changes in version 5.10.0
+pod/perl5101delta.pod                  Perl changes in version 5.10.1
+pod/perl5120delta.pod                  Perl changes in version 5.12.0
+pod/perl5121delta.pod                  Perl changes in version 5.12.1
+pod/perl5122delta.pod                  Perl changes in version 5.12.2
+pod/perl5123delta.pod                  Perl changes in version 5.12.3
+pod/perl5124delta.pod                  Perl changes in version 5.12.4
+pod/perl5125delta.pod                  Perl changes in version 5.12.5
+pod/perl5140delta.pod                  Perl changes in version 5.14.0
+pod/perl5141delta.pod                  Perl changes in version 5.14.1
+pod/perl5142delta.pod                  Perl changes in version 5.14.2
+pod/perl5143delta.pod                  Perl changes in version 5.14.3
+pod/perl5144delta.pod                  Perl changes in version 5.14.4
+pod/perl5160delta.pod                  Perl changes in version 5.16.0
+pod/perl5161delta.pod                  Perl changes in version 5.16.1
+pod/perl5162delta.pod                  Perl changes in version 5.16.2
+pod/perl5163delta.pod                  Perl changes in version 5.16.3
+pod/perl5180delta.pod                  Perl changes in version 5.18.0
+pod/perl5181delta.pod                  Perl changes in version 5.18.1
+pod/perl5182delta.pod                  Perl changes in version 5.18.2
+pod/perl5184delta.pod                  Perl changes in version 5.18.4
+pod/perl5200delta.pod                  Perl changes in version 5.20.0
+pod/perl5201delta.pod                  Perl changes in version 5.20.1
+pod/perl5202delta.pod                  Perl changes in version 5.20.2
+pod/perl5203delta.pod                  Perl changes in version 5.20.3
+pod/perl5220delta.pod                  Perl changes in version 5.22.0
+pod/perl5221delta.pod                  Perl changes in version 5.22.1
+pod/perl5222delta.pod                  Perl changes in version 5.22.2
+pod/perl5223delta.pod                  Perl changes in version 5.22.3
+pod/perl5224delta.pod                  Perl changes in version 5.22.4
+pod/perl5240delta.pod                  Perl changes in version 5.24.0
+pod/perl5241delta.pod                  Perl changes in version 5.24.1
+pod/perl5242delta.pod                  Perl changes in version 5.24.2
+pod/perl5243delta.pod                  Perl changes in version 5.24.3
+pod/perl5244delta.pod                  Perl changes in version 5.24.4
+pod/perl5260delta.pod                  Perl changes in version 5.26.0
+pod/perl5261delta.pod                  Perl changes in version 5.26.1
+pod/perl5262delta.pod                  Perl changes in version 5.26.2
+pod/perl5263delta.pod                  Perl changes in version 5.26.3
+pod/perl5280delta.pod                  Perl changes in version 5.28.0
+pod/perl5281delta.pod                  Perl changes in version 5.28.1
+pod/perl5282delta.pod                  Perl changes in version 5.28.2
+pod/perl5283delta.pod                  Perl changes in version 5.28.3
+pod/perl5300delta.pod                  Perl changes in version 5.30.0
+pod/perl5301delta.pod                  Perl changes in version 5.30.1
+pod/perl5302delta.pod                  Perl changes in version 5.30.2
+pod/perl5303delta.pod                  Perl changes in version 5.30.3
+pod/perl5320delta.pod                  Perl changes in version 5.32.0
+pod/perl5321delta.pod                  Perl changes in version 5.32.1
+pod/perl5340delta.pod                  Perl changes in version 5.34.0
+pod/perl5341delta.pod                  Perl changes in version 5.34.1
+pod/perl5342delta.pod                  Perl changes in version 5.34.2
+pod/perl5343delta.pod                  Perl changes in version 5.34.3
+pod/perl5360delta.pod                  Perl changes in version 5.36.0
+pod/perl5361delta.pod                  Perl changes in version 5.36.1
+pod/perl5362delta.pod                  Perl changes in version 5.36.2
+pod/perl5363delta.pod                  Perl changes in version 5.36.3
+pod/perl5380delta.pod                  Perl changes in version 5.38.0
+pod/perl5381delta.pod                  Perl changes in version 5.38.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
+pod/perl582delta.pod                   Perl changes in version 5.8.2
+pod/perl583delta.pod                   Perl changes in version 5.8.3
+pod/perl584delta.pod                   Perl changes in version 5.8.4
+pod/perl585delta.pod                   Perl changes in version 5.8.5
+pod/perl586delta.pod                   Perl changes in version 5.8.6
+pod/perl587delta.pod                   Perl changes in version 5.8.7
+pod/perl588delta.pod                   Perl changes in version 5.8.8
+pod/perl589delta.pod                   Perl changes in version 5.8.9
+pod/perl58delta.pod                    Perl changes in version 5.8.0
+pod/perlapio.pod                       Perl internal IO abstraction interface
+pod/perlartistic.pod                   Perl Artistic License
+pod/perlbook.pod                       Perl book information
+pod/perlboot.pod
+pod/perlbot.pod
+pod/perlcall.pod                       Perl calling conventions from C
+pod/perlcheat.pod                      Perl cheat sheet
+pod/perlclass.pod                      Perl class syntax
+pod/perlclassguts.pod                  Internals of class syntax
+pod/perlclib.pod                       Internal replacements for standard C library functions
+pod/perlcommunity.pod                  Perl community information
+pod/perldata.pod                       Perl data structures
+pod/perldbmfilter.pod                  Perl DBM filters
+pod/perldebguts.pod                    Perl debugging guts and tips
+pod/perldebtut.pod                     Perl debugging tutorial
+pod/perldebug.pod                      Perl debugging
+pod/perldelta.pod                      Perl changes since previous version
+pod/perldeprecation.pod                        Perl deprecations
+pod/perldiag.pod                       Perl diagnostic messages
+pod/perldocstyle.pod                   Perl style guide for core docs
+pod/perldsc.pod                                Perl data structures intro
+pod/perldtrace.pod                     Perl's support for DTrace
+pod/perlebcdic.pod                     Considerations for running Perl on EBCDIC platforms
+pod/perlembed.pod                      Perl ways to embed perl in your C or C++ application
+pod/perlexperiment.pod                 A listing of experimental features in Perl
+pod/perlfilter.pod                     Perl source filters
+pod/perlfork.pod                       Perl fork() information
+pod/perlform.pod                       Perl formats
+pod/perlfunc.pod                       Perl built-in functions
+pod/perlgit.pod                                Using git with the Perl repository
+pod/perlgov.pod                                Perl Rules of Governance
+pod/perlgpl.pod                                GNU General Public License
+pod/perlguts.pod                       Perl internal functions for those doing extensions
+pod/perlhack.pod                       Perl hackers guide
+pod/perlhacktips.pod                   Tips for Perl core C code hacking
+pod/perlhacktut.pod                    Walk through the creation of a simple C code patch
+pod/perlhist.pod                       Perl history records
+pod/perlinterp.pod                     Overview of the Perl interpreter source and how it works
+pod/perlintro.pod                      Perl introduction for beginners
+pod/perliol.pod                                C API for Perl's implementation of IO in Layers
+pod/perlipc.pod                                Perl interprocess communication
+pod/perllexwarn.pod                    Perl warnings and their control
+pod/perllocale.pod                     Perl locale support
+pod/perllol.pod                                Perl data structures: arrays of arrays
+pod/perlmod.pod                                Perl modules: how they work
+pod/perlmodinstall.pod                 Perl modules: how to install from CPAN
+pod/perlmodlib.PL                      Generate pod/perlmodlib.pod
+pod/perlmodstyle.pod                   Perl modules: how to write modules with style
+pod/perlmroapi.pod                     Perl method resolution plugin interface
+pod/perlnewmod.pod                     Perl modules: preparing a new module for distribution
+pod/perlnumber.pod                     Perl number semantics
+pod/perlobj.pod                                Perl objects
+pod/perlootut.pod                      Perl OO tutorial for beginners
+pod/perlop.pod                         Perl operators and precedence
+pod/perlopentut.pod                    Perl open() tutorial
+pod/perlpacktut.pod                    Perl pack() and unpack() tutorial
+pod/perlperf.pod                       Perl Performance and Optimization Techniques
+pod/perlpod.pod                                Perl plain old documentation
+pod/perlpodspec.pod                    Perl plain old documentation format specification
+pod/perlpodstyle.pod                   Perl POD style guide
+pod/perlpolicy.pod                     Perl development policies
+pod/perlport.pod                       Perl portability guide
+pod/perlpragma.pod                     Perl modules: writing a user pragma
+pod/perlre.pod                         Perl regular expressions, the rest of the story
+pod/perlreapi.pod                      Perl regular expression plugin interface
+pod/perlrebackslash.pod                        Perl regular expression backslash sequences
+pod/perlrecharclass.pod                        Perl regular expression character classes
+pod/perlref.pod                                Perl references, the rest of the story
+pod/perlreftut.pod                     Perl references short introduction
+pod/perlreguts.pod                     Perl regular expression engine internals
+pod/perlrepository.pod
+pod/perlrequick.pod                    Perl regular expressions quick start
+pod/perlreref.pod                      Perl regular expressions quick reference
+pod/perlretut.pod                      Perl regular expressions tutorial
+pod/perlrun.pod                                Perl execution and options
+pod/perlsec.pod                                Perl security
+pod/perlsecpolicy.pod                  Perl security report handling policy
+pod/perlsource.pod                     Guide to the Perl source tree
+pod/perlstyle.pod                      Perl style guide
+pod/perlsub.pod                                Perl subroutines
+pod/perlsyn.pod                                Perl syntax
+pod/perlthrtut.pod                     Perl threads tutorial
+pod/perltie.pod                                Perl objects hidden behind simple variables
+pod/perltodo.pod
+pod/perltooc.pod
+pod/perltoot.pod
+pod/perltrap.pod                       Perl traps for the unwary
+pod/perlunicode.pod                    Perl Unicode support
+pod/perlunicook.pod                    Perl Unicode cookbook
+pod/perlunifaq.pod                     Perl Unicode FAQ
+pod/perluniintro.pod                   Perl Unicode introduction
+pod/perlunitut.pod                     Perl Unicode tutorial
+pod/perlutil.pod                       utilities packaged with the Perl distribution
+pod/perlvar.pod                                Perl predefined variables
+pod/perlvms.pod                                Perl notes for VMS
+pod/rofftoc                            Generate a table of contents in troff format
+pod/splitman                           Splits perlfunc into multiple man pages
+pod/splitpod                           Splits perlfunc into multiple pod pages
+Porting/acknowledgements.pl                    Generate perldelta acknowledgements text
+Porting/add-package.pl                         Add/Update CPAN modules that are part of Core
+Porting/add-pod-file                           Utility to add new pod/*.pod file to core distribution
+Porting/bench.pl                               Run benchmarks against t/perf/benchmarks
+Porting/bisect.pl                              A tool to make bisecting easy
+Porting/bisect-example.sh                      Example script to use with git bisect run
+Porting/bisect-runner.pl                       Tool to be called by git bisect run
+Porting/bump-perl-version                      bump the perl version in relevant files
+Porting/check-cpan-pollution                   Check for commits that may wrongly touch CPAN distros
+Porting/checkansi.pl                           Check source code for ANSI-C violations
+Porting/checkcfguse.pl                         Check that config symbols are being used
+Porting/checkcfgvar.pl                         Check that config scripts define all symbols
+Porting/checkpodencoding.pl                    Check POD encoding
+Porting/checkURL.pl                            Check whether we have working URLs
+Porting/checkVERSION.pl                                Check whether we have $VERSIONs
+Porting/cmpVERSION.pl                          Compare whether two trees have changed modules
+Porting/config.sh                              Sample config.sh
+Porting/config_H                               Sample config.h
+Porting/config_h.pl                            Reorder config_h.SH after metaconfig
+Porting/core-cpan-diff                         Compare core distros with their CPAN equivalents
+Porting/core-team.json                         Membership of the Perl Core Team
+Porting/corecpan.pl                            Reports outdated dual-lived modules
+Porting/corelist.pl                            Generates data for Module::CoreList
+Porting/corelist-diff                          Tool to produce corelist diffs
+Porting/corelist-perldelta.pl                  Generates data perldelta from Module::CoreList
+Porting/deparse-skips.txt                      List of test files to ignore/skip for deparse tests.
+Porting/docs-team-charter.pod                  Perl Documentation Team charter
+Porting/epigraphs.pod                          the release epigraphs used over the years
+Porting/exclude_contrib.txt                    Data about contributors that do not want to be listed in AUTHORS
+Porting/exec-bit.txt                           List of files that get +x in release tarball
+Porting/exercise_makedef.pl                    Brute force testing for makedef.pl
+Porting/expand-macro.pl                                A tool to expand C macro definitions in the Perl source
+Porting/findrfuncs                             Find reentrant variants of functions used in an executable
+Porting/git-deltatool                          Mark commits for perldelta in git notes
+Porting/git-find-p4-change                     Find the change for a p4 change number
+Porting/git-make-p4-refs                       Output git refs for each p4 change number, suitable for appending to .git/packed-refs
+Porting/GitUtils.pm                            Generate the contents of a .patch file
+Porting/Glossary                               Glossary of config.sh variables
+Porting/harness-timer-report.pl                        Analyze the timings from the test harness
+Porting/how_to_write_a_perldelta.pod           Bluffer's guide to writing a perldelta.
+Porting/leakfinder.pl                          Hacky script for finding memory leaks
+Porting/Maintainers                            Program to pretty print info in Maintainers.pl
+Porting/Maintainers.pl                         Information about maintainers
+Porting/Maintainers.pm                         Library to pretty print info in Maintainers.pl
+Porting/make-rmg-checklist                     Generates a checklist 4 the release manager
+Porting/make_dot_patch.pl                      Make a .patch file from a git WD
+Porting/make_snapshot.pl                       Make a tgz snapshot of our tree with a .patch file in it
+Porting/makemeta                               Create the top-level META.yml
+Porting/makerel                                        Release making utility
+Porting/manicheck                              Check against MANIFEST
+Porting/manifest_lib.pl                                Library for checking and sorting the MANIFEST
+Porting/manisort                               Sort the MANIFEST
+Porting/mksample                               Generate Porting/config_H and Porting/config.sh
+Porting/new-perldelta.pl                       Generate a new perldelta
+Porting/newtests-perldelta.pl                  Generate Perldelta stub for newly added tests
+Porting/perldelta_template.pod                 Template for creating new perldelta.pod files
 Porting/perlgov-team-update                    Tool to update perlgov from perl-core-teaml
-Porting/perlhist_calculate.pl          Perform calculations to update perlhist
-Porting/pod_lib.pl             Code for handling generated pods
-Porting/pod_rules.pl           generate lists of pod files for Makefiles
-Porting/podtidy                        Reformat pod using Pod::Tidy
-Porting/pumpkin.pod            Guidelines and hints for Perl maintainers
-Porting/README.pod                     Outline of contents of Porting directory
-Porting/README.y2038           Perl notes for the 2038 fix
+Porting/perlhist_calculate.pl                  Perform calculations to update perlhist
+Porting/pod_lib.pl                             Code for handling generated pods
+Porting/pod_rules.pl                           generate lists of pod files for Makefiles
+Porting/podtidy                                        Reformat pod using Pod::Tidy
+Porting/pumpkin.pod                            Guidelines and hints for Perl maintainers
+Porting/README.pod                             Outline of contents of Porting directory
+Porting/README.y2038                           Perl notes for the 2038 fix
 Porting/release_announcement_template.txt
-Porting/release_managers_guide.pod     Release Manager's Guide
-Porting/release_schedule.pod   Schedule for future releases
-Porting/rt_list_patches                A tool to help you apply patches from RT
-Porting/security_template.pod  Template for vulnerability announcements
-Porting/sort_perldiag.pl       Keep our diagnostics orderly
-Porting/sync-with-cpan         Sync with CPAN
-Porting/timecheck.c            Test program for the 2038 fix
-Porting/timecheck2.c           Test program for the 2038 fix
-Porting/todo.pod               Perl things to do
-Porting/updateAUTHORS.pl       Tool to automatically update AUTHORS and .mailmap from git log data
-Porting/valgrindpp.pl          Summarize valgrind reports
-Porting/vote_admin_guide.pod   Perlgov Vote Administrator guide
-pp.c                           Push/Pop code
-pp.h                           Push/Pop code defs
-pp_ctl.c                       Push/Pop code for control flow
-pp_hot.c                       Push/Pop code for heavily used opcodes
-pp_pack.c                      Push/Pop code for pack/unpack
-pp_proto.h                     C++ definitions for Push/Pop code
-pp_sort.c                      Push/Pop code for sort
-pp_sys.c                       Push/Pop code for system interaction
-proto.h                                Prototypes
-qnx/ar                         QNX implementation of "ar" utility
-qnx/cpp                                QNX implementation of preprocessor filter
-qnx/qnx.c                      QNX silent matherr callback
-README                         The Instructions
-README.aix                     Perl notes for AIX
-README.amiga                   Perl notes for AmigaOS
-README.android                 Perl notes for Android
-README.bs2000                  Perl notes for POSIX-BC BS2000
-README.cn                      Perl for Simplified Chinese (in UTF-8)
-README.cygwin                  Perl notes for Cygwin
-README.freebsd                 Perl notes for FreeBSD
-README.haiku                   Perl notes for Haiku
-README.hpux                    Perl notes for HP-UX
-README.hurd                    Perl notes for Hurd
-README.irix                    Perl notes for Irix
-README.jp                      Perl for Japanese (in EUC-JP)
-README.ko                      Perl for Korean (in EUC-KR)
-README.linux                   Perl notes for Linux
-README.macosx                  Perl notes for Mac OS X
-README.micro                   Notes about microperl
-README.openbsd                 Perl notes for OpenBSD
-README.os2                     Perl notes for OS/2
-README.os390                   Perl notes for OS/390
-README.os400                   Perl notes for OS/400
-README.plan9                   Perl notes for Plan 9
-README.qnx                     Perl notes for QNX
-README.riscos                  Perl notes for RISC OS
-README.solaris                 Perl notes for Solaris
-README.synology                        Perl notes for Synology
-README.tru64                   Perl notes for Tru64
-README.tw                      Perl for Traditional Chinese (in Big5)
-README.vms                     Notes about installing the VMS port
-README.vos                     Perl notes for Stratus VOS
-README.win32                   Perl notes for Windows
-reentr.c                       Reentrant interfaces
-reentr.h                       Reentrant interfaces
-regcharclass.h                 Generated by regen/regcharclass.pl
-regcomp.c                      Regular expression compiler
-regcomp.h                      Private declarations for above
-regcomp.sym                    Data for regnodes.h
-regen.pl                       Run all scripts that (re)generate files
-regen/charset_translations.pl  Character set utilities
-regen/ebcdic.pl                        Generates ebcdic_tables.h
-regen/embed.pl                 Produces {embed,embedvar,proto}.h
-regen/embed_lib.pl             Reads embed.fnc and regen/opcodes
-regen/feature.pl               Generates feature.pm
-regen/genpacksizetables.pl     Generate the size tables for pack/unpack
-regen/keywords.pl              Program to write keywords.h
-regen/lib_cleanup.pl           Generate lib/.gitignore from MANIFEST
-regen/mg_vtable.pl             generate mg_vtable.h
-regen/miniperlmain.pl          generate miniperlmain.c
-regen/mk_invlists.pl           Generates charclass_invlists.h
-regen/mk_PL_charclass.pl       Populate the PL_charclass table
-regen/mph.pl                   Generate perfect hashes
-regen/op_private               Definitions of bits in an OP's op_private field
-regen/opcode.pl                        Opcode header generator
-regen/opcodes                  Opcode data
-regen/overload.pl              generate overload.h
-regen/reentr.pl                        Reentrant interfaces
-regen/regcharclass.pl          Generate regcharclass.h from inline data
+Porting/release_managers_guide.pod             Release Manager's Guide
+Porting/release_schedule.pod                   Schedule for future releases
+Porting/rt_list_patches                                A tool to help you apply patches from RT
+Porting/security_template.pod                  Template for vulnerability announcements
+Porting/sort_perldiag.pl                       Keep our diagnostics orderly
+Porting/sync-with-cpan                         Sync with CPAN
+Porting/test-dist-modules.pl                   Test dist/ modules on currently active perl (used for CI)
+Porting/timecheck.c                            Test program for the 2038 fix
+Porting/timecheck2.c                           Test program for the 2038 fix
+Porting/todo.pod                               Perl things to do
+Porting/updateAUTHORS.pl                       Tool to automatically update AUTHORS and .mailmap from git log data
+Porting/updateAUTHORS.pm                       Brains of updateAUTHORS.pl
+Porting/valgrindpp.pl                          Summarize valgrind reports
+Porting/vote_admin_guide.pod                   Perlgov Vote Administrator guide
+qnx/ar                                 QNX implementation of "ar" utility
+qnx/cpp                                        QNX implementation of preprocessor filter
+qnx/qnx.c                              QNX silent matherr callback
+regen/charset_translations.pl          Character set utilities
+regen/ebcdic.pl                                Generates ebcdic_tables.h
+regen/embed.pl                         Produces {embed,embedvar,proto}.h
+regen/embed_lib.pl                     Reads embed.fnc and regen/opcodes
+regen/feature.pl                       Generates feature.pm
+regen/genpacksizetables.pl             Generate the size tables for pack/unpack
+regen/HeaderParser.pm                  Module used to parse header files
+regen/keywords.pl                      Program to write keywords.h
+regen/lib_cleanup.pl                   Generate lib/.gitignore from MANIFEST
+regen/mg_vtable.pl                     generate mg_vtable.h
+regen/miniperlmain.pl                  generate miniperlmain.c
+regen/mk_invlists.pl                   Generates charclass_invlists.h
+regen/mk_PL_charclass.pl               Populate the PL_charclass table
+regen/mph.pl                           Generate perfect hashes
+regen/op_private                       Definitions of bits in an OP's op_private field
+regen/opcode.pl                                Opcode header generator
+regen/opcodes                          Opcode data
+regen/overload.pl                      generate overload.h
+regen/reentr.pl                                Reentrant interfaces
+regen/regcharclass.pl                  Generate regcharclass.h from inline data
 regen/regcharclass_multi_char_folds.pl Generate input for regcharclass.pl
-regen/regcomp.pl               Builder of regnodes.h
-regen/regen_lib.pl             Common file routines for generator scripts
-regen/uconfig_h.pl             generate uconfig.h (requires /bin/sh)
-regen/unicode_constants.pl     generate unicode_constants.h
-regen/warnings.pl              Program to write warnings.h and lib/warnings.pm
-regen_perly.pl                 generate perly.{act,h,tab} from perly.y
-regexec.c                      Regular expression evaluator
-regexp.h                       Public declarations for the above
-regnodes.h                     Description of nodes of RE engine
-run.c                          The interpreter loop
-runtests.SH                    A script that generates runtests
-sbox32_hash.h                  SBox hash code (32 Bit SBOX based hash function)
-scope.c                                Scope entry and exit code
-scope.h                                Scope entry and exit header
-SECURITY.md                    Add Security Policy for GitHub
-sv.c                           Scalar value code
-sv.h                           Scalar value header
-sv_inline.h                    Perl_newSV_type and required defs
-t/base/cond.t                  See if conditionals work
-t/base/if.t                    See if if works
-t/base/lex.t                   See if lexical items work
-t/base/num.t                   See if numbers work
-t/base/pat.t                   See if pattern matching works
-t/base/rs.t                    See if record-read works
-t/base/term.t                  See if various terms work
-t/base/translate.t             See if character set translation works
-t/base/while.t                 See if while work
+regen/regcomp.pl                       Builder of regnodes.h
+regen/regen_lib.pl                     Common file routines for generator scripts
+regen/scope_types.pl                   Regenerate scope_types.h
+regen/tidy_embed.pl                    Program to clean up embed.fnc manually
+regen/uconfig_h.pl                     generate uconfig.h (requires /bin/sh)
+regen/unicode_constants.pl             generate unicode_constants.h
+regen/warnings.pl                      Program to write warnings.h and lib/warnings.pm
+t/base/cond.t                          See if conditionals work
+t/base/if.t                            See if if works
+t/base/lex.t                           See if lexical items work
+t/base/num.t                           See if numbers work
+t/base/pat.t                           See if pattern matching works
+t/base/rs.t                            See if record-read works
+t/base/term.t                          See if various terms work
+t/base/translate.t                     See if character set translation works
+t/base/while.t                         See if while work
 t/benchmark/gh7094-speed-up-keys-on-empty-hash.t       Benchmark if keys on empty hashes is fast enough
-t/bigmem/hash.t                        Check hashing too large strings throws an exception
-t/bigmem/index.t               Check that index() handles large offsets
-t/bigmem/pos.t                 Check that pos() handles large offsets
-t/bigmem/read.t                        Check read() handles large offsets
-t/bigmem/regexp.t              Test regular expressions with large strings
-t/bigmem/subst.t               Test s/// with large strings
-t/bigmem/vec.t                 Check vec() handles large offsets
-t/charset_tools.pl             To aid in portable testing across platforms with different character sets
-t/cmd/elsif.t                  See if else-if works
-t/cmd/for.t                    See if for loops work
-t/cmd/mod.t                    See if statement modifiers work
-t/cmd/subval.t                 See if subroutine values work
-t/cmd/switch.t                 See if switch optimizations work
-t/comp/bproto.t                        See if builtins conform to their prototypes
-t/comp/cmdopt.t                        See if command optimization works
-t/comp/colon.t                 See if colons are parsed correctly
-t/comp/decl.t                  See if declarations work
-t/comp/filter_exception.t      See if $@ survives source filters
-t/comp/final_line_num.t                See if line numbers are correct at EOF
-t/comp/fold.t                  See if constant folding works
-t/comp/form_scope.t            See if format scoping works
-t/comp/hints.aux               Auxiliary file for %^H test
-t/comp/hints.t                 See if %^H works
-t/comp/line_debug.t            See if @{"_<$file"} works
-t/comp/line_debug_0.aux                Auxiliary file for @{"_<$file"} test
-t/comp/multiline.t             See if multiline strings work
-t/comp/opsubs.t                        See if q() etc. are not parsed as functions
-t/comp/our.t                   Tests for our declaration
-t/comp/package.t               See if packages work
-t/comp/package_block.t         See if package block syntax works
-t/comp/parser.t                        See if the parser works in edge cases
+t/bigmem/hash.t                                Check hashing too large strings throws an exception
+t/bigmem/index.t                       Check that index() handles large offsets
+t/bigmem/pos.t                         Check that pos() handles large offsets
+t/bigmem/read.t                                Check read() handles large offsets
+t/bigmem/regexp.t                      Test regular expressions with large strings
+t/bigmem/subst.t                       Test s/// with large strings
+t/bigmem/vec.t                         Check vec() handles large offsets
+t/charset_tools.pl                     To aid in portable testing across platforms with different character sets
+t/class/class.t                                See if class declarations work
+t/class/construct.t                    See if class constructors work
+t/class/destruct.t                     See if class destruction works
+t/class/field.t                                See if class field declarations work
+t/class/inherit.t                      See if class inheritance works
+t/class/method.t                       See if class method declarations work
+t/class/phasers.t                      See if class phaser blocks work
+t/class/threads.t                      See if classes work across multiple threads
+t/cmd/elsif.t                          See if else-if works
+t/cmd/for.t                            See if for loops work
+t/cmd/mod.t                            See if statement modifiers work
+t/cmd/subval.t                         See if subroutine values work
+t/cmd/switch.t                         See if switch optimizations work
+t/comp/bproto.t                                See if builtins conform to their prototypes
+t/comp/cmdopt.t                                See if command optimization works
+t/comp/colon.t                         See if colons are parsed correctly
+t/comp/decl.t                          See if declarations work
+t/comp/filter_exception.t              See if $@ survives source filters
+t/comp/final_line_num.t                        See if line numbers are correct at EOF
+t/comp/fold.t                          See if constant folding works
+t/comp/form_scope.t                    See if format scoping works
+t/comp/hints.aux                       Auxiliary file for %^H test
+t/comp/hints.t                         See if %^H works
+t/comp/line_debug.t                    See if @{"_<$file"} works
+t/comp/line_debug_0.aux                        Auxiliary file for @{"_<$file"} test
+t/comp/multiline.t                     See if multiline strings work
+t/comp/opsubs.t                                See if q() etc. are not parsed as functions
+t/comp/our.t                           Tests for our declaration
+t/comp/package.t                       See if packages work
+t/comp/package_block.t                 See if package block syntax works
+t/comp/parser.t                                See if the parser works in edge cases
 t/comp/parser_run.t                    See if parser works in additional edge case
-t/comp/proto.t                 See if function prototypes work
-t/comp/redef.t                 See if we get correct warnings on redefined subs
-t/comp/require.t               See if require works
-t/comp/retainedlines.t         See if the debugger can retain eval's lines
-t/comp/term.t                  See if more terms work
-t/comp/uproto.t                        See if the _ prototype works
-t/comp/use.t                   See if pragmata work
-t/comp/utf.t                   See if UTFs work
-t/harness                      Finer diagnostics from test suite
-t/io/argv.t                    See if ARGV stuff works
-t/io/binmode.t                 See if binmode() works
-t/io/bom.t                     See if scripts can start with a byte order mark
-t/io/closepid.t                        See if close works for subprocesses
-t/io/crlf.t                    See if :crlf works
-t/io/crlf_through.t            See if pipe passes data intact with :crlf
-t/io/data.t                    See if DATA works
-t/io/defout.t                  See if PL_defoutgv works
-t/io/dup.t                     See if >& works right
-t/io/eintr.t                   See if code called during EINTR is safe
-t/io/eintr_print.t             Test that print is not returning EINTR
-t/io/errno.t                   See if $! is correctly set
-t/io/errnosig.t                        Test case for restoration $! when leaving signal handlers
-t/io/fflush.t                  See if auto-flush on fork/exec/system/qx works
-t/io/fs.t                      See if directory manipulations work
-t/io/getcwd.t                  See if Internals::getcwd is sane
-t/io/inplace.t                 See if inplace editing works
-t/io/iofile.t                  See if we can load IO::File on demand
-t/io/iprefix.t                 See if inplace editing works with prefixes
-t/io/layers.t                  See if PerlIO layers work
-t/io/msg.t                     See if SysV message queues work
-t/io/nargv.t                   See if nested ARGV stuff works
-t/io/open.t                    See if open works
-t/io/openpid.t                 See if open works for subprocesses
+t/comp/proto.t                         See if function prototypes work
+t/comp/redef.t                         See if we get correct warnings on redefined subs
+t/comp/require.t                       See if require works
+t/comp/retainedlines.t                 See if the debugger can retain eval's lines
+t/comp/term.t                          See if more terms work
+t/comp/uproto.t                                See if the _ prototype works
+t/comp/use.t                           See if pragmata work
+t/comp/utf.t                           See if UTFs work
+t/harness                              Finer diagnostics from test suite
+t/io/argv.t                            See if ARGV stuff works
+t/io/binmode.t                         See if binmode() works
+t/io/bom.t                             See if scripts can start with a byte order mark
+t/io/closepid.t                                See if close works for subprocesses
+t/io/crlf.t                            See if :crlf works
+t/io/crlf_through.t                    See if pipe passes data intact with :crlf
+t/io/data.t                            See if DATA works
+t/io/defout.t                          See if PL_defoutgv works
+t/io/dup.t                             See if >& works right
+t/io/eintr.t                           See if code called during EINTR is safe
+t/io/eintr_print.t                     Test that print is not returning EINTR
+t/io/errno.t                           See if $! is correctly set
+t/io/errnosig.t                                Test case for restoration $! when leaving signal handlers
+t/io/fflush.t                          See if auto-flush on fork/exec/system/qx works
+t/io/fs.t                              See if directory manipulations work
+t/io/getcwd.t                          See if Internals::getcwd is sane
+t/io/inplace.t                         See if inplace editing works
+t/io/iofile.t                          See if we can load IO::File on demand
+t/io/iprefix.t                         See if inplace editing works with prefixes
+t/io/layers.t                          See if PerlIO layers work
+t/io/msg.t                             See if SysV message queues work
+t/io/nargv.t                           See if nested ARGV stuff works
+t/io/open.t                            See if open works
+t/io/openpid.t                         See if open works for subprocesses
 t/io/paragraph_mode.t                  See if paragraph mode works
-t/io/perlio.t                  See if PerlIO works
-t/io/perlio_fail.t             See if bad layers fail
-t/io/perlio_leaks.t            See if PerlIO layers are leaking
-t/io/perlio_open.t             See if certain special forms of open work
-t/io/pipe.t                    See if secure pipes work
-t/io/print.t                   See if print commands work
-t/io/pvbm.t                    See if PVBMs break IO commands
-t/io/read.t                    See if read works
-t/io/say.t                     See if say works
-t/io/sem.t                     See if SysV semaphores work
-t/io/semctl.t                  See if SysV semaphore semctl works
-t/io/shm.t                     See if SysV shared memory works
-t/io/socket.t                  See if socket functions work
-t/io/socketpair.t              See if socketpair function works
-t/io/tell.t                    See if file seeking works
-t/io/through.t                 See if pipe passes data intact
-t/io/utf8.t                    See if file seeking works
-t/japh/abigail.t               Obscure tests
-t/lib/CannotParse.pm           For test case in op/require_errors.t
-t/lib/charnames/alias          Tests of "use charnames" with aliases.
-t/lib/Cname.pm                 Test charnames in regexes (op/pat.t)
-t/lib/common.pl                        Helper for lib/{warnings,feature}.t
-t/lib/commonsense.t            See if configuration meets basic needs
-t/lib/Count.pm                 Helper for t/op/method.t
-t/lib/croak.t                  Test calls to Perl_croak() in the C source.
-t/lib/croak/gv                 Test croak calls from gv.c
-t/lib/croak/mg                 Test croak calls from mg.c
-t/lib/croak/op                 Test croak calls from op.c
-t/lib/croak/pp                 Test croak calls from pp.c
-t/lib/croak/pp_ctl             Test croak calls from pp_ctl.c
-t/lib/croak/pp_hot             Test croak calls from pp_hot.c
-t/lib/croak/pp_sys             Test croak calls from pp_sys.c
-t/lib/croak/regcomp            Test croak calls from regcomp.c
-t/lib/croak/toke               Test croak calls from toke.c
-t/lib/croak/toke_l1            Test croak calls from toke.c; file is not UTF-8 encoded
-t/lib/cygwin.t                 Builtin cygwin function tests
-t/lib/dbmt_common.pl           Common functionality for ?DBM_File tests
-t/lib/deprecate.t              Test deprecate.pm
-t/lib/deprecate/Deprecated.pm  Deprecated module to test deprecate.pm
-t/lib/deprecate/Optionally.pm  Optionally deprecated module to test deprecate.pm
-t/lib/Devel/nodb.pm            Module for t/run/switchd.t
-t/lib/Devel/switchd.pm         Module for t/run/switchd.t
-t/lib/Devel/switchd_empty.pm   Module for t/run/switchd.t
-t/lib/Devel/switchd_goto.pm    Module for t/run/switchd.t
-t/lib/feature/api              Test API for checking features enabled/disabled
+t/io/perlio.t                          See if PerlIO works
+t/io/perlio_fail.t                     See if bad layers fail
+t/io/perlio_leaks.t                    See if PerlIO layers are leaking
+t/io/perlio_open.t                     See if certain special forms of open work
+t/io/pipe.t                            See if secure pipes work
+t/io/print.t                           See if print commands work
+t/io/pvbm.t                            See if PVBMs break IO commands
+t/io/read.t                            See if read works
+t/io/say.t                             See if say works
+t/io/sem.t                             See if SysV semaphores work
+t/io/semctl.t                          See if SysV semaphore semctl works
+t/io/shm.t                             See if SysV shared memory works
+t/io/socket.t                          See if socket functions work
+t/io/socketpair.t                      See if socketpair function works
+t/io/tell.t                            See if file seeking works
+t/io/through.t                         See if pipe passes data intact
+t/io/utf8.t                            See if file seeking works
+t/japh/abigail.t                       Obscure tests
+t/lib/caller/Apack.pm                  test Module for caller.t and t/op/hook/require.t
+t/lib/caller/Bicycle.pm                        test Module for t/op/hook/require.t (cyclic)
+t/lib/caller/Bpack.pm                  test Module for caller.t and t/op/hook/require.t
+t/lib/caller/Cpack.pm                  test Module for caller.t and t/op/hook/require.t
+t/lib/caller/Cycle.pm                  test Module for t/op/hook/require.t (cyclic)
+t/lib/caller/Foo.pm                    test Module for caller.t and t/op/hook/require.t
+t/lib/caller/Tricycle.pm               test Module for t/op/hook/require.t (cyclic)
+t/lib/CannotParse.pm                   For test case in op/require_errors.t
+t/lib/charnames/alias                  Tests of "use charnames" with aliases.
+t/lib/Cname.pm                         Test charnames in regexes (op/pat.t)
+t/lib/common.pl                                Helper for lib/{warnings,feature}.t
+t/lib/commonsense.t                    See if configuration meets basic needs
+t/lib/Count.pm                         Helper for t/op/method.t
+t/lib/croak.t                          Test calls to Perl_croak() in the C source.
+t/lib/croak/class                      Test croak calls from class.c
+t/lib/croak/gv                         Test croak calls from gv.c
+t/lib/croak/mg                         Test croak calls from mg.c
+t/lib/croak/op                         Test croak calls from op.c
+t/lib/croak/pp                         Test croak calls from pp.c
+t/lib/croak/pp_ctl                     Test croak calls from pp_ctl.c
+t/lib/croak/pp_hot                     Test croak calls from pp_hot.c
+t/lib/croak/pp_sys                     Test croak calls from pp_sys.c
+t/lib/croak/regcomp                    Test croak calls from regcomp.c
+t/lib/croak/toke                       Test croak calls from toke.c
+t/lib/croak/toke_l1                    Test croak calls from toke.c; file is not UTF-8 encoded
+t/lib/cygwin.t                         Builtin cygwin function tests
+t/lib/dbmt_common.pl                   Common functionality for ?DBM_File tests
+t/lib/deprecate.t                      Test deprecate.pm
+t/lib/deprecate/Deprecated.pm          Deprecated module to test deprecate.pm
+t/lib/deprecate/Optionally.pm          Optionally deprecated module to test deprecate.pm
+t/lib/Devel/nodb.pm                    Module for t/run/switchd.t
+t/lib/Devel/switchd.pm                 Module for t/run/switchd.t
+t/lib/Devel/switchd_empty.pm           Module for t/run/switchd.t
+t/lib/Devel/switchd_goto.pm            Module for t/run/switchd.t
+t/lib/Dies.pm                          For test case in op/require_errors.t
+t/lib/feature/api                      Test API for checking features enabled/disabled
 t/lib/feature/bareword_filehandles     Tests for enabling/disabling bareword_filehandles feature
-t/lib/feature/bits             Tests for feature bit handling
-t/lib/feature/bundle           Tests for feature bundles
-t/lib/feature/implicit         Tests for implicit loading of feature.pm
-t/lib/feature/indirect         Tests for enabling/disabling indirect method calls
-t/lib/feature/multidimensional Tests for enabling/disabling $foo{$x, $y} => $foo{join($;, $x, $y)}
-t/lib/feature/nonesuch         Tests for enabling/disabling nonexistent feature
-t/lib/feature/removed          Tests for enabling/disabling removed feature
-t/lib/feature/say              Tests for enabling/disabling say feature
-t/lib/feature/switch           Tests for enabling/disabling switch feature
-t/lib/GH_15109/Apack.pm                test Module for caller.t
-t/lib/GH_15109/Bpack.pm                test Module for caller.t
-t/lib/GH_15109/Cpack.pm                test Module for caller.t
-t/lib/GH_15109/Foo.pm          test Module for caller.t
-t/lib/h2ph.h                   Test header file for h2ph
-t/lib/h2ph.pht                 Generated output from h2ph.h by h2ph, for comparison
-t/lib/locale/latin1            Part of locale.t in Latin 1
-t/lib/locale/utf8              Part of locale.t in UTF8
-t/lib/mypragma.pm              An example user pragma
-t/lib/mypragma.t               Test the example user pragma
-t/lib/no_load.t                        Test that some modules don't load others
-t/lib/overload_fallback.t      Test that using overload 2x in a scope doesn't clobber fallback
-t/lib/overload_nomethod.t      Test that nomethod works as expected
-t/lib/proxy_constant_subs.t    Test that Proxy Constant Subs behave correctly
-t/lib/Sans_mypragma.pm         Test module for t/lib/mypragma.t
-t/lib/strict/refs              Tests of "use strict 'refs'" for strict.t
-t/lib/strict/subs              Tests of "use strict 'subs'" for strict.t
-t/lib/strict/vars              Tests of "use strict 'vars'" for strict.t
-t/lib/subs/subs                        Tests of "use subs"
-t/lib/test_require.pm          A test file for t/op/inccode.t
-t/lib/test_use.pm              A test pragma for t/comp/use.t
-t/lib/test_use_14937.pm                A test pragma for t/comp/use.t
-t/lib/universal.t              Tests for functions in universal.c
-t/lib/warnings/1global         Tests of global warnings for warnings.t
-t/lib/warnings/2use            Tests for "use warnings" for warnings.t
-t/lib/warnings/3both           Tests for interaction of $^W and "use warnings"
-t/lib/warnings/4lint           Tests for -W switch
-t/lib/warnings/5nolint         Tests for -X switch
-t/lib/warnings/6default                Tests default warnings
-t/lib/warnings/7fatal          Tests fatal warnings
-t/lib/warnings/8signal         Tests warnings + __WARN__ and __DIE__
-t/lib/warnings/9enabled                Tests warnings
-t/lib/warnings/9uninit         Tests "Use of uninitialized" warnings
-t/lib/warnings/av              Tests for av.c for warnings.t
-t/lib/warnings/builtin         Tests for builtin.c for warnings.t
-t/lib/warnings/doio            Tests for doio.c for warnings.t
-t/lib/warnings/gv              Tests for gv.c for warnings.t
-t/lib/warnings/hv              Tests for hv.c for warnings.t
-t/lib/warnings/malloc          Tests for malloc.c for warnings.t
-t/lib/warnings/mg              Tests for mg.c for warnings.t
-t/lib/warnings/op              Tests for op.c for warnings.t
-t/lib/warnings/pad             Tests for pad.c for warnings.t
-t/lib/warnings/perl            Tests for perl.c for warnings.t
-t/lib/warnings/perlio          Tests for perlio.c for warnings.t
-t/lib/warnings/pp              Tests for pp.c for warnings.t
-t/lib/warnings/pp_ctl          Tests for pp_ctl.c for warnings.t
-t/lib/warnings/pp_hot          Tests for pp_hot.c for warnings.t
-t/lib/warnings/pp_pack         Tests for pp_pack.c for warnings.t
-t/lib/warnings/pp_sys          Tests for pp_sys.c for warnings.t
-t/lib/warnings/regcomp         Tests for regcomp.c for warnings.t
-t/lib/warnings/regexec         Tests for regexec.c for warnings.t
-t/lib/warnings/run             Tests for run.c for warnings.t
-t/lib/warnings/sv              Tests for sv.c for warnings.t
-t/lib/warnings/taint           Tests for taint.c for warnings.t
-t/lib/warnings/toke            Tests for toke.c for warnings.t
-t/lib/warnings/universal       Tests for universal.c for warnings.t
-t/lib/warnings/utf8            Tests for utf8.c for warnings.t
-t/lib/warnings/util            Tests for util.c for warnings.t
-t/loc_tools.pl                 Common functions for finding platform's locales
-t/mro/basic.t                  mro tests
-t/mro/basic_01_c3.t            mro tests
-t/mro/basic_01_c3_utf8.t       utf8 mro tests
-t/mro/basic_01_dfs.t           mro tests
-t/mro/basic_01_dfs_utf8.t      utf8 mro tests
-t/mro/basic_02_c3.t            mro tests
-t/mro/basic_02_c3_utf8.t       utf8 mro tests
-t/mro/basic_02_dfs.t           mro tests
-t/mro/basic_02_dfs_utf8.t      utf8 mro tests
-t/mro/basic_03_c3.t            mro tests
-t/mro/basic_03_c3_utf8.t       utf8 mro tests
-t/mro/basic_03_dfs.t           mro tests
-t/mro/basic_03_dfs_utf8.t      utf8 mro tests
-t/mro/basic_04_c3.t            mro tests
-t/mro/basic_04_c3_utf8.t       utf8 mro tests
-t/mro/basic_04_dfs.t           mro tests
-t/mro/basic_04_dfs_utf8.t      utf8 mro tests
-t/mro/basic_05_c3.t            mro tests
-t/mro/basic_05_c3_utf8.t       utf8 mro tests
-t/mro/basic_05_dfs.t           mro tests
-t/mro/basic_05_dfs_utf8.t      utf8 mro tests
-t/mro/basic_utf8.t             utf8 mro tests
-t/mro/c3_with_overload.t       mro tests
-t/mro/c3_with_overload_utf8.t  utf8 mro tests
-t/mro/complex_c3.t             mro tests
-t/mro/complex_c3_utf8.t                utf8 mro tests
-t/mro/complex_dfs.t            mro tests
-t/mro/complex_dfs_utf8.t       utf8 mro tests
-t/mro/dbic_c3.t                        mro tests
-t/mro/dbic_c3_utf8.t           utf8 mro tests
-t/mro/dbic_dfs.t               mro tests
-t/mro/dbic_dfs_utf8.t          utf8 mro tests
-t/mro/inconsistent_c3.t                mro tests
-t/mro/inconsistent_c3_utf8.t   utf8 mro tests
-t/mro/isa_aliases.t            tests for shared @ISA arrays
-t/mro/isa_aliases_utf8.t       utf8 mro tests
-t/mro/isa_c3.t                 test for optimisatised mro_get_linear_isa_c3
-t/mro/isa_c3_utf8.t            utf8 mro tests
-t/mro/isa_dfs.t                        test for optimisatised mro_get_linear_isa_dfs
-t/mro/isa_dfs_utf8.t           utf8 mro tests
-t/mro/isarev.t                 PL_isarev/mro::get_isarev tests
-t/mro/isarev_utf8.t            utf8 mro tests
-t/mro/method_caching.t         mro tests
-t/mro/method_caching_utf8.t    utf8 mro tests
-t/mro/next_edgecases.t         mro tests
-t/mro/next_edgecases_utf8.t    utf8 mro tests
-t/mro/next_goto.t              mro tests
-t/mro/next_goto_utf8.t         utf8 mro tests
-t/mro/next_inanon.t            mro tests
-t/mro/next_inanon_utf8.t       utf8 mro tests
-t/mro/next_ineval.t            mro tests
-t/mro/next_ineval_utf8.t       utf8 mro tests
-t/mro/next_method.t            mro tests
-t/mro/next_method_utf8.t       utf8 mro tests
-t/mro/next_NEXT.t              mro tests
-t/mro/next_NEXT_utf8.t         utf8 mro tests
-t/mro/next_skip.t              mro tests
-t/mro/next_skip_utf8.t         utf8 mro tests
-t/mro/overload_c3.t            mro tests
-t/mro/overload_c3_utf8.t       utf8 mro tests
-t/mro/overload_dfs.t           mro tests
-t/mro/package_aliases.t                mro tests
-t/mro/package_aliases_utf8.t   utf8 mro tests
-t/mro/pkg_gen.t                        mro tests
-t/mro/pkg_gen_utf8.t           utf8 mro tests
-t/mro/recursion_c3.t           mro tests
-t/mro/recursion_c3_utf8.t      utf8 mro tests
-t/mro/recursion_dfs.t          mro tests
-t/mro/recursion_dfs_utf8.t     utf8 mro tests
-t/mro/vulcan_c3.t              mro tests
-t/mro/vulcan_c3_utf8.t         utf8 mro tests
-t/mro/vulcan_dfs.t             mro tests
-t/mro/vulcan_dfs_utf8.t                utf8 mro tests
-t/op/64bitint.t                        See if 64 bit integers work
-t/op/aassign.t                 test list assign
-t/op/alarm.t                   See if alarm works
-t/op/anonconst.t               See if :const works
-t/op/anonsub.t                 See if anonymous subroutines work
-t/op/append.t                  See if . works
-t/op/args.t                    See if operations on @_ work
-t/op/arith2.t                  See if arithmetic works
-t/op/array.t                   See if array operations work
-t/op/assignwarn.t              See if OP= operators warn correctly for undef targets
-t/op/attrhand.t                        See if attribute handlers work
-t/op/attrproto.t               See if the prototype attribute works
-t/op/attrs.t                   See if attributes on declarations work
-t/op/auto.t                    See if autoincrement et all work
-t/op/avhv.t                    See if pseudo-hashes work
-t/op/bless.t                   See if bless works
-t/op/blocks.t                  See if BEGIN and friends work
-t/op/bool.t                    Check misc details of boolean values
-t/op/bop.t                     See if bitops work
-t/op/caller.pl                 Tests shared between caller.t and XS op.t
-t/op/caller.t                  See if caller() works
-t/op/catch.t                   See if catching exception works
-t/op/chars.t                   See if character escapes work
-t/op/chdir.t                   See if chdir works
-t/op/chop.t                    See if chop works
-t/op/chr.t                     See if chr works
-t/op/closure.t                 See if closures work
-t/op/closure_test.pl           Extra file for closure.t
-t/op/cmpchain.t                        See if comparison chaining works
-t/op/concat2.t                 Tests too complex for concat.t
-t/op/cond.t                    See if conditional expressions work
-t/op/const-optree.t            Tests for sub(){...} becoming constant
-t/op/context.t                 See if context propagation works
-t/op/coreamp.t                 Test &foo() calls for CORE subs
-t/op/coresubs.t                        Generic tests for CORE subs
-t/op/cproto.t                  Check builtin prototypes
-t/op/crypt.t                   See if crypt works
-t/op/current_sub.t             __SUB__ tests
-t/op/dbm.t                     See if dbmopen/dbmclose work
-t/op/decl-refs.t               See if my \$foo works
-t/op/defer.t                   See if defer blocks work
-t/op/defined.t                 See if defined() edge cases work
-t/op/defins.t                  See if auto-insert of defined() works
-t/op/delete.t                  See if delete works
-t/op/die.t                     See if die works
-t/op/die_except.t              See if die/eval avoids $@ clobberage
-t/op/die_exit.t                        See if die and exit status interaction works
-t/op/die_keeperr.t             See if G_KEEPERR works for destructors
-t/op/die_unwind.t              Check die/eval early-$@ backcompat hack
-t/op/do.t                      See if subroutines work
-t/op/dor.t                     See if defined-or (//) works
-t/op/dump.t                    See if dump works.
-t/op/each.t                    See if hash iterators work
-t/op/each_array.t              See if array iterators work
-t/op/eval.t                    See if eval operator works
-t/op/evalbytes.t               See if evalbytes operator works
-t/op/exec.t                    See if exec, system and qx work
-t/op/exists_sub.t              See if exists(&sub) works
-t/op/exp.t                     See if math functions work
-t/op/fh.t                      See if filehandles work
-t/op/filehandle.t              Tests for https://github.com/Perl/perl5/issues/10133
-t/op/filetest.t                        See if file tests work
-t/op/filetest_stack_ok.t       See if file tests leave their argument on the stack
-t/op/filetest_t.t              See if -t file test works
-t/op/flip.t                    See if range operator works
-t/op/for.t                     See if for loops work
-t/op/for-many.t                        See if n-at-a-time for loops work
-t/op/fork.t                    See if fork works
-t/op/fresh_perl_utf8.t         UTF8 tests for pads and gvs
-t/op/getpid.t                  See if $$ and getppid work with threads
-t/op/getppid.t                 See if getppid works
-t/op/glob.t                    See if <*> works
-t/op/gmagic.t                  See if GMAGIC works
-t/op/goto.t                    See if goto works
-t/op/goto_xs.t                 See if "goto &sub" works on XSUBs
-t/op/grent.t                   See if getgr*() functions work
-t/op/grep.t                    See if grep() and map() work
-t/op/groups.t                  See if $( works
-t/op/gv.t                      See if typeglobs work
-t/op/hash.t                    See if the complexity attackers are repelled
-t/op/hash-clear-placeholders.t Tests for corner cases in S_clear_placeholders
-t/op/hash-rt85026.t            See if hash iteration/deletion works
-t/op/hashassign.t              See if hash assignments work
-t/op/hashwarn.t                        See if warnings for bad hash assignments work
-t/op/heredoc.t                 See if heredoc edge and corner cases work
-t/op/hexfp.t                   See if hexadecimal float literals work
-t/op/inc.t                     See if inc/dec of integers near 32 bit limit work
-t/op/inccode.t                 See if coderefs work in @INC
-t/op/inccode-tie.t             See if tie to @INC works
-t/op/incfilter.t               See if the source filters in coderef-in-@INC work
-t/op/index.t                   See if index works
-t/op/index_thr.t               See if index works in another thread
-t/op/infnan.t                  See if inf/nan work
-t/op/int.t                     See if int works
-t/op/isa.t                     See if isa works
-t/op/join.t                    See if join works
-t/op/kill0.t                   See if kill works
-t/op/kill0_child               Process tree script that is kill()ed
-t/op/kvaslice.t                        See if index/value array slices work
-t/op/kvhslice.t                        See if key/value hash slices work
-t/op/lc.t                      See if lc, uc, lcfirst, ucfirst, quotemeta work
-t/op/leaky-magic.t             See whether vars' magic leaks into packages
-t/op/length.t                  See if length works
-t/op/lex.t                     Tests too complex for t/base/lex.t
-t/op/lex_assign.t              See if ops involving lexicals or pad temps work
-t/op/lexsub.t                  See if lexical subroutines work
-t/op/lfs.t                     See if large files work for perlio
-t/op/list.t                    See if lists and list slices work
-t/op/local.t                   See if local works
-t/op/localref.t                        See if local ${deref} works
-t/op/lock.t                    Tests for lock args & retval (no threads)
-t/op/loopctl.t                 See if next/last/redo work
-t/op/lop.t                     See if logical operators work
-t/op/lvref.t                   See if aliasing via references works
-t/op/magic.t                   See if magic variables work
-t/op/magic-27839.t             Test for #27839, skipped for minitest
-t/op/method.t                  See if method calls work
-t/op/mkdir.t                   See if mkdir works
-t/op/multideref.t              See if "$a[0]{foo}[$i]{$k}" etc works
-t/op/my.t                      See if lexical scoping works
-t/op/my_stash.t                        See if my Package works
-t/op/mydef.t                   See if "my $_" works
-t/op/negate.t                  See if unary minus works
-t/op/not.t                     See if not works
-t/op/numconvert.t              See if accessing fields does not change numeric values
-t/op/numify.t                  See if string-to-number conversion works
-t/op/numify_chkflags.t         See if string-to-number conversion behaves correctly
-t/op/oct.t                     See if oct and hex work
-t/op/or.t                      See if || works in weird situations
-t/op/ord.t                     See if ord works
-t/op/overload_integer.t                See if overload::constant for integer works after "use".
-t/op/override.t                        See if operator overriding works
-t/op/pack.t                    See if pack and unpack work
-t/op/packagev.t                        See if package VERSION work
-t/op/pos.t                     See if pos works
-t/op/postfixderef.t            See if ->$* ->@[ et al work
-t/op/pow.t                     See if ** works
-t/op/print.t                   See if print works
-t/op/protowarn.t               See if the illegalproto warnings work
-t/op/push.t                    See if push and pop work
-t/op/pwent.t                   See if getpw*() functions work
-t/op/qr.t                      See if qr works
-t/op/quotemeta.t               See if quotemeta works
-t/op/rand.t                    See if rand works
-t/op/range.t                   See if .. works
-t/op/read.t                    See if read() works
-t/op/readdir.t                 See if readdir() works
-t/op/readline.t                        See if <> / readline / rcatline work
-t/op/recurse.t                 See if deep recursion works
-t/op/ref.t                     See if refs and objects work
-t/op/repeat.t                  See if x operator works
-t/op/require_37033.t           See if require always closes rsfp
-t/op/require_errors.t          See if errors from require are reported correctly
-t/op/require_override.t                See if require handles no argument properly
-t/op/reset.t                   See if reset operator works
-t/op/reverse.t                 See if reverse operator works
-t/op/rt119311.t                        Test bug #119311 (die/DESTROY/recursion)
-t/op/runlevel.t                        See if die() works from perl_call_*()
-t/op/select.t                  See if 0- and 1-argument select works
-t/op/setpgrpstack.t            See if setpgrp works
-t/op/sigdispatch.t             See if signals are always dispatched
-t/op/signame_canonical.t       See if duplicate signal names always use the canonical name when the handler is invoked.
-t/op/signatures.t              See if sub signatures work
-t/op/sigsystem.t               See if system and SIGCHLD handlers play together nicely
-t/op/sleep.t                   See if sleep works
-t/op/smartkve.t                        See if smart deref for keys/values/each works
-t/op/smartmatch.t              See if the ~~ operator works
-t/op/sort.t                    See if sort works
-t/op/splice.t                  See if splice works
-t/op/split.t                   See if split works
-t/op/split_unicode.t           Test split /\s/ and Unicode
-t/op/sprintf.t                 See if sprintf works
-t/op/sprintf2.t                        See if sprintf works
-t/op/srand.t                   See if srand works
-t/op/sselect.t                 See if 4 argument select works
-t/op/stash.t                   See if %:: stashes work
-t/op/stash_parse_gv.t          See if parse_gv_stash_name works
-t/op/stat.t                    See if stat works
-t/op/stat_errors.t             See if stat and file tests handle threshold errors
-t/op/state.t                   See if state variables work
-t/op/study.t                   See if study works
-t/op/studytied.t               See if study works with tied scalars
-t/op/sub.t                     See if subroutines work
-t/op/sub_lval.t                        See if lvalue subroutines work
-t/op/substr.t                  See if substr works
-t/op/substr_thr.t              See if substr works in another thread
-t/op/svflags.t                 See if POK is set as expected.
-t/op/svleak.pl                 Test file for svleak.t
-t/op/svleak.t                  See if stuff leaks SVs
-t/op/switch.t                  See if switches (given/when) work
-t/op/symbolcache.t             See if undef/delete works on stashes with functions
-t/op/syscall_emulator.t                Tests that syscall works via the emulator
-t/op/sysio.t                   See if sysread and syswrite work
-t/op/taint.t                   See if tainting works
-t/op/threads.t                 Misc. tests for perl features with threads
-t/op/threads-dirh.t            Test interaction of threads and dir handles
-t/op/threads_create.pl         Ancillary file for t/op/threads.t
-t/op/tie.t                     See if tie/untie functions work
-t/op/tie_fetch_count.t         See if FETCH is only called once on tied variables
-t/op/tiearray.t                        See if tie for arrays works
-t/op/tiehandle.t               See if tie for handles works
-t/op/tiehash.t                 Tests for tied hashes using test.pl
-t/op/time.t                    See if time functions work
-t/op/time_loop.t               Test that very large values don't hang gmtime and localtime.
-t/op/tr.t                      See if tr works
-t/op/tr_latin1.t               See if tr works, but file isn't encoded in UTF-8
-t/op/try.t                     See if try works
-t/op/undef.t                   See if undef works
-t/op/universal.t               See if UNIVERSAL class works
-t/op/unlink.t                  See if unlink works
-t/op/unshift.t                 See if unshift works
-t/op/upgrade.t                 See if upgrading and assigning scalars works
-t/op/utf8cache.t               Tests malfunctions of utf8 cache
-t/op/utf8decode.t              See if UTF-8 decoding works
-t/op/utf8magic.t               See if utf8:: functions handle magic variables
-t/op/utfhash.t                 See if utf8 keys in hashes behave
-t/op/utftaint.t                        See if utf8 and taint work together
-t/op/vec.t                     See if vectors work
-t/op/ver.t                     See if v-strings and the %v format flag work
-t/op/waitpid.t                 See if waitpid works
-t/op/wantarray.t               See if wantarray works
-t/op/warn.t                    See if warn works
-t/op/while.t                   See if while loops work
-t/op/write.t                   See if write works (formats work)
-t/op/yadayada.t                        See if ... works
+t/lib/feature/bits                     Tests for feature bit handling
+t/lib/feature/bundle                   Tests for feature bundles
+t/lib/feature/implicit                 Tests for implicit loading of feature.pm
+t/lib/feature/indirect                 Tests for enabling/disabling indirect method calls
+t/lib/feature/multidimensional         Tests for enabling/disabling $foo{$x, $y} => $foo{join($;, $x, $y)}
+t/lib/feature/nonesuch                 Tests for enabling/disabling nonexistent feature
+t/lib/feature/removed                  Tests for enabling/disabling removed feature
+t/lib/feature/say                      Tests for enabling/disabling say feature
+t/lib/feature/switch                   Tests for enabling/disabling switch feature
+t/lib/h2ph.h                           Test header file for h2ph
+t/lib/h2ph.pht                         Generated output from h2ph.h by h2ph, for comparison
+t/lib/locale/latin1                    Part of locale.t in Latin 1
+t/lib/locale/utf8                      Part of locale.t in UTF8
+t/lib/mypragma.pm                      An example user pragma
+t/lib/mypragma.t                       Test the example user pragma
+t/lib/no_load.t                                Test that some modules don't load others
+t/lib/overload_fallback.t              Test that using overload 2x in a scope doesn't clobber fallback
+t/lib/overload_nomethod.t              Test that nomethod works as expected
+t/lib/proxy_constant_subs.t            Test that Proxy Constant Subs behave correctly
+t/lib/Sans_mypragma.pm                 Test module for t/lib/mypragma.t
+t/lib/strict/refs                      Tests of "use strict 'refs'" for strict.t
+t/lib/strict/subs                      Tests of "use strict 'subs'" for strict.t
+t/lib/strict/vars                      Tests of "use strict 'vars'" for strict.t
+t/lib/subs/subs                                Tests of "use subs"
+t/lib/test_require.pm                  A test file for t/op/inccode.t
+t/lib/test_use.pm                      A test pragma for t/comp/use.t
+t/lib/test_use_14937.pm                        A test pragma for t/comp/use.t
+t/lib/universal.t                      Tests for functions in universal.c
+t/lib/warnings/1global                 Tests of global warnings for warnings.t
+t/lib/warnings/2use                    Tests for "use warnings" for warnings.t
+t/lib/warnings/3both                   Tests for interaction of $^W and "use warnings"
+t/lib/warnings/4lint                   Tests for -W switch
+t/lib/warnings/5nolint                 Tests for -X switch
+t/lib/warnings/6default                        Tests default warnings
+t/lib/warnings/7fatal                  Tests fatal warnings
+t/lib/warnings/8signal                 Tests warnings + __WARN__ and __DIE__
+t/lib/warnings/9enabled                        Tests warnings
+t/lib/warnings/9uninit                 Tests "Use of uninitialized" warnings
+t/lib/warnings/av                      Tests for av.c for warnings.t
+t/lib/warnings/builtin                 Tests for builtin.c for warnings.t
+t/lib/warnings/class                   Tests for class.c for warnings.t
+t/lib/warnings/doio                    Tests for doio.c for warnings.t
+t/lib/warnings/gv                      Tests for gv.c for warnings.t
+t/lib/warnings/hv                      Tests for hv.c for warnings.t
+t/lib/warnings/malloc                  Tests for malloc.c for warnings.t
+t/lib/warnings/mg                      Tests for mg.c for warnings.t
+t/lib/warnings/op                      Tests for op.c for warnings.t
+t/lib/warnings/pad                     Tests for pad.c for warnings.t
+t/lib/warnings/perl                    Tests for perl.c for warnings.t
+t/lib/warnings/perlio                  Tests for perlio.c for warnings.t
+t/lib/warnings/pp                      Tests for pp.c for warnings.t
+t/lib/warnings/pp_ctl                  Tests for pp_ctl.c for warnings.t
+t/lib/warnings/pp_hot                  Tests for pp_hot.c for warnings.t
+t/lib/warnings/pp_pack                 Tests for pp_pack.c for warnings.t
+t/lib/warnings/pp_sys                  Tests for pp_sys.c for warnings.t
+t/lib/warnings/regcomp                 Tests for regcomp.c for warnings.t
+t/lib/warnings/regexec                 Tests for regexec.c for warnings.t
+t/lib/warnings/run                     Tests for run.c for warnings.t
+t/lib/warnings/sv                      Tests for sv.c for warnings.t
+t/lib/warnings/taint                   Tests for taint.c for warnings.t
+t/lib/warnings/toke                    Tests for toke.c for warnings.t
+t/lib/warnings/universal               Tests for universal.c for warnings.t
+t/lib/warnings/utf8                    Tests for utf8.c for warnings.t
+t/lib/warnings/util                    Tests for util.c for warnings.t
+t/loc_tools.pl                         Common functions for finding platform's locales
+t/mro/basic.t                          mro tests
+t/mro/basic_01_c3.t                    mro tests
+t/mro/basic_01_c3_utf8.t               utf8 mro tests
+t/mro/basic_01_dfs.t                   mro tests
+t/mro/basic_01_dfs_utf8.t              utf8 mro tests
+t/mro/basic_02_c3.t                    mro tests
+t/mro/basic_02_c3_utf8.t               utf8 mro tests
+t/mro/basic_02_dfs.t                   mro tests
+t/mro/basic_02_dfs_utf8.t              utf8 mro tests
+t/mro/basic_03_c3.t                    mro tests
+t/mro/basic_03_c3_utf8.t               utf8 mro tests
+t/mro/basic_03_dfs.t                   mro tests
+t/mro/basic_03_dfs_utf8.t              utf8 mro tests
+t/mro/basic_04_c3.t                    mro tests
+t/mro/basic_04_c3_utf8.t               utf8 mro tests
+t/mro/basic_04_dfs.t                   mro tests
+t/mro/basic_04_dfs_utf8.t              utf8 mro tests
+t/mro/basic_05_c3.t                    mro tests
+t/mro/basic_05_c3_utf8.t               utf8 mro tests
+t/mro/basic_05_dfs.t                   mro tests
+t/mro/basic_05_dfs_utf8.t              utf8 mro tests
+t/mro/basic_utf8.t                     utf8 mro tests
+t/mro/c3_with_overload.t               mro tests
+t/mro/c3_with_overload_utf8.t          utf8 mro tests
+t/mro/complex_c3.t                     mro tests
+t/mro/complex_c3_utf8.t                        utf8 mro tests
+t/mro/complex_dfs.t                    mro tests
+t/mro/complex_dfs_utf8.t               utf8 mro tests
+t/mro/dbic_c3.t                                mro tests
+t/mro/dbic_c3_utf8.t                   utf8 mro tests
+t/mro/dbic_dfs.t                       mro tests
+t/mro/dbic_dfs_utf8.t                  utf8 mro tests
+t/mro/inconsistent_c3.t                        mro tests
+t/mro/inconsistent_c3_utf8.t           utf8 mro tests
+t/mro/isa_aliases.t                    tests for shared @ISA arrays
+t/mro/isa_aliases_utf8.t               utf8 mro tests
+t/mro/isa_c3.t                         test for optimisatised mro_get_linear_isa_c3
+t/mro/isa_c3_utf8.t                    utf8 mro tests
+t/mro/isa_dfs.t                                test for optimisatised mro_get_linear_isa_dfs
+t/mro/isa_dfs_utf8.t                   utf8 mro tests
+t/mro/isarev.t                         PL_isarev/mro::get_isarev tests
+t/mro/isarev_utf8.t                    utf8 mro tests
+t/mro/method_caching.t                 mro tests
+t/mro/method_caching_utf8.t            utf8 mro tests
+t/mro/next_edgecases.t                 mro tests
+t/mro/next_edgecases_utf8.t            utf8 mro tests
+t/mro/next_goto.t                      mro tests
+t/mro/next_goto_utf8.t                 utf8 mro tests
+t/mro/next_inanon.t                    mro tests
+t/mro/next_inanon_utf8.t               utf8 mro tests
+t/mro/next_ineval.t                    mro tests
+t/mro/next_ineval_utf8.t               utf8 mro tests
+t/mro/next_method.t                    mro tests
+t/mro/next_method_utf8.t               utf8 mro tests
+t/mro/next_NEXT.t                      mro tests
+t/mro/next_NEXT_utf8.t                 utf8 mro tests
+t/mro/next_skip.t                      mro tests
+t/mro/next_skip_utf8.t                 utf8 mro tests
+t/mro/overload_c3.t                    mro tests
+t/mro/overload_c3_utf8.t               utf8 mro tests
+t/mro/overload_dfs.t                   mro tests
+t/mro/package_aliases.t                        mro tests
+t/mro/package_aliases_utf8.t           utf8 mro tests
+t/mro/pkg_gen.t                                mro tests
+t/mro/pkg_gen_utf8.t                   utf8 mro tests
+t/mro/recursion_c3.t                   mro tests
+t/mro/recursion_c3_utf8.t              utf8 mro tests
+t/mro/recursion_dfs.t                  mro tests
+t/mro/recursion_dfs_utf8.t             utf8 mro tests
+t/mro/vulcan_c3.t                      mro tests
+t/mro/vulcan_c3_utf8.t                 utf8 mro tests
+t/mro/vulcan_dfs.t                     mro tests
+t/mro/vulcan_dfs_utf8.t                        utf8 mro tests
+t/op/64bitint.t                                See if 64 bit integers work
+t/op/aassign.t                         test list assign
+t/op/alarm.t                           See if alarm works
+t/op/anonconst.t                       See if :const works
+t/op/anonsub.t                         See if anonymous subroutines work
+t/op/append.t                          See if . works
+t/op/args.t                            See if operations on @_ work
+t/op/arith2.t                          See if arithmetic works
+t/op/array.t                           See if array operations work
+t/op/assignwarn.t                      See if OP= operators warn correctly for undef targets
+t/op/attrhand.t                                See if attribute handlers work
+t/op/attrproto.t                       See if the prototype attribute works
+t/op/attrs.t                           See if attributes on declarations work
+t/op/auto.t                            See if autoincrement et all work
+t/op/avhv.t                            See if pseudo-hashes work
+t/op/bless.t                           See if bless works
+t/op/blocks.t                          See if BEGIN and friends work
+t/op/bool.t                            Check misc details of boolean values
+t/op/bop.t                             See if bitops work
+t/op/caller.pl                         Tests shared between caller.t and XS op.t
+t/op/caller.t                          See if caller() works
+t/op/catch.t                           See if catching exception works
+t/op/chars.t                           See if character escapes work
+t/op/chdir.t                           See if chdir works
+t/op/chop.t                            See if chop works
+t/op/chr.t                             See if chr works
+t/op/closure.t                         See if closures work
+t/op/closure_test.pl                   Extra file for closure.t
+t/op/cmpchain.t                                See if comparison chaining works
+t/op/concat2.t                         Tests too complex for concat.t
+t/op/cond.t                            See if conditional expressions work
+t/op/const-optree.t                    Tests for sub(){...} becoming constant
+t/op/context.t                         See if context propagation works
+t/op/coreamp.t                         Test &foo() calls for CORE subs
+t/op/coresubs.t                                Generic tests for CORE subs
+t/op/cproto.t                          Check builtin prototypes
+t/op/crypt.t                           See if crypt works
+t/op/current_sub.t                     __SUB__ tests
+t/op/dbm.t                             See if dbmopen/dbmclose work
+t/op/decl-refs.t                       See if my \$foo works
+t/op/defer.t                           See if defer blocks work
+t/op/defined.t                         See if defined() edge cases work
+t/op/defins.t                          See if auto-insert of defined() works
+t/op/delete.t                          See if delete works
+t/op/die.t                             See if die works
+t/op/die_except.t                      See if die/eval avoids $@ clobberage
+t/op/die_exit.t                                See if die and exit status interaction works
+t/op/die_keeperr.t                     See if G_KEEPERR works for destructors
+t/op/die_unwind.t                      Check die/eval early-$@ backcompat hack
+t/op/do.t                              See if subroutines work
+t/op/dor.t                             See if defined-or (//) works
+t/op/dump.t                            See if dump works.
+t/op/each.t                            See if hash iterators work
+t/op/each_array.t                      See if array iterators work
+t/op/eval.t                            See if eval operator works
+t/op/evalbytes.t                       See if evalbytes operator works
+t/op/exec.t                            See if exec, system and qx work
+t/op/exists_sub.t                      See if exists(&sub) works
+t/op/exp.t                             See if math functions work
+t/op/fh.t                              See if filehandles work
+t/op/filehandle.t                      Tests for https://github.com/Perl/perl5/issues/10133
+t/op/filetest.t                                See if file tests work
+t/op/filetest_stack_ok.t               See if file tests leave their argument on the stack
+t/op/filetest_t.t                      See if -t file test works
+t/op/flip.t                            See if range operator works
+t/op/for.t                             See if for loops work
+t/op/for-many.t                                See if n-at-a-time for loops work
+t/op/fork.t                            See if fork works
+t/op/fresh_perl_utf8.t                 UTF8 tests for pads and gvs
+t/op/getpid.t                          See if $$ and getppid work with threads
+t/op/getppid.t                         See if getppid works
+t/op/glob.t                            See if <*> works
+t/op/gmagic.t                          See if GMAGIC works
+t/op/goto.t                            See if goto works
+t/op/goto_xs.t                         See if "goto &sub" works on XSUBs
+t/op/grent.t                           See if getgr*() functions work
+t/op/grep.t                            See if grep() and map() work
+t/op/groups.t                          See if $( works
+t/op/gv.t                              See if typeglobs work
+t/op/hash.t                            See if the complexity attackers are repelled
+t/op/hash-clear-placeholders.t         Tests for corner cases in S_clear_placeholders
+t/op/hash-rt85026.t                    See if hash iteration/deletion works
+t/op/hashassign.t                      See if hash assignments work
+t/op/hashwarn.t                                See if warnings for bad hash assignments work
+t/op/heredoc.t                         See if heredoc edge and corner cases work
+t/op/hexfp.t                           See if hexadecimal float literals work
+t/op/hook/require.t                    See if require hooks work properly.
+t/op/inc.t                             See if inc/dec of integers near 32 bit limit work
+t/op/inccode.t                         See if coderefs work in @INC
+t/op/inccode-tie.t                     See if tie to @INC works
+t/op/incfilter.t                       See if the source filters in coderef-in-@INC work
+t/op/index.t                           See if index works
+t/op/index_thr.t                       See if index works in another thread
+t/op/infnan.t                          See if inf/nan work
+t/op/int.t                             See if int works
+t/op/isa.t                             See if isa works
+t/op/join.t                            See if join works
+t/op/kill0.t                           See if kill works
+t/op/kill0_child                       Process tree script that is kill()ed
+t/op/kvaslice.t                                See if index/value array slices work
+t/op/kvhslice.t                                See if key/value hash slices work
+t/op/lc.t                              See if lc, uc, lcfirst, ucfirst, quotemeta work
+t/op/leaky-magic.t                     See whether vars' magic leaks into packages
+t/op/length.t                          See if length works
+t/op/lex.t                             Tests too complex for t/base/lex.t
+t/op/lex_assign.t                      See if ops involving lexicals or pad temps work
+t/op/lexsub.t                          See if lexical subroutines work
+t/op/lfs.t                             See if large files work for perlio
+t/op/list.t                            See if lists and list slices work
+t/op/local.t                           See if local works
+t/op/localref.t                                See if local ${deref} works
+t/op/lock.t                            Tests for lock args & retval (no threads)
+t/op/loopctl.t                         See if next/last/redo work
+t/op/lop.t                             See if logical operators work
+t/op/lvref.t                           See if aliasing via references works
+t/op/magic.t                           See if magic variables work
+t/op/magic-27839.t                     Test for #27839, skipped for minitest
+t/op/method.t                          See if method calls work
+t/op/mkdir.t                           See if mkdir works
+t/op/multideref.t                      See if "$a[0]{foo}[$i]{$k}" etc works
+t/op/my.t                              See if lexical scoping works
+t/op/my_stash.t                                See if my Package works
+t/op/mydef.t                           See if "my $_" works
+t/op/negate.t                          See if unary minus works
+t/op/not.t                             See if not works
+t/op/numconvert.t                      See if accessing fields does not change numeric values
+t/op/numify.t                          See if string-to-number conversion works
+t/op/numify_chkflags.t                 See if string-to-number conversion behaves correctly
+t/op/oct.t                             See if oct and hex work
+t/op/or.t                              See if || works in weird situations
+t/op/ord.t                             See if ord works
+t/op/overload_integer.t                        See if overload::constant for integer works after "use".
+t/op/override.t                                See if operator overriding works
+t/op/pack.t                            See if pack and unpack work
+t/op/packagev.t                                See if package VERSION work
+t/op/pos.t                             See if pos works
+t/op/postfixderef.t                    See if ->$* ->@[ et al work
+t/op/pow.t                             See if ** works
+t/op/print.t                           See if print works
+t/op/protowarn.t                       See if the illegalproto warnings work
+t/op/push.t                            See if push and pop work
+t/op/pwent.t                           See if getpw*() functions work
+t/op/qr.t                              See if qr works
+t/op/quotemeta.t                       See if quotemeta works
+t/op/rand.t                            See if rand works
+t/op/range.t                           See if .. works
+t/op/read.t                            See if read() works
+t/op/readdir.t                         See if readdir() works
+t/op/readline.t                                See if <> / readline / rcatline work
+t/op/recurse.t                         See if deep recursion works
+t/op/ref.t                             See if refs and objects work
+t/op/repeat.t                          See if x operator works
+t/op/require_37033.t                   See if require always closes rsfp
+t/op/require_errors.t                  See if errors from require are reported correctly
+t/op/require_gh20577.t                 Make sure updating %INC from an INC hook doesnt break @INC
+t/op/require_override.t                        See if require handles no argument properly
+t/op/reset.t                           See if reset operator works
+t/op/reverse.t                         See if reverse operator works
+t/op/rt119311.t                                Test bug #119311 (die/DESTROY/recursion)
+t/op/runlevel.t                                See if die() works from perl_call_*()
+t/op/select.t                          See if 0- and 1-argument select works
+t/op/setpgrpstack.t                    See if setpgrp works
+t/op/sigdispatch.t                     See if signals are always dispatched
+t/op/signame_canonical.t               See if duplicate signal names always use the canonical name when the handler is invoked.
+t/op/signatures.t                      See if sub signatures work
+t/op/sigsystem.t                       See if system and SIGCHLD handlers play together nicely
+t/op/sleep.t                           See if sleep works
+t/op/smartkve.t                                See if smart deref for keys/values/each works
+t/op/smartmatch.t                      See if the ~~ operator works
+t/op/sort.t                            See if sort works
+t/op/splice.t                          See if splice works
+t/op/split.t                           See if split works
+t/op/split_unicode.t                   Test split /\s/ and Unicode
+t/op/sprintf.t                         See if sprintf works
+t/op/sprintf2.t                                See if sprintf works
+t/op/srand.t                           See if srand works
+t/op/sselect.t                         See if 4 argument select works
+t/op/stash.t                           See if %:: stashes work
+t/op/stash_parse_gv.t                  See if parse_gv_stash_name works
+t/op/stat.t                            See if stat works
+t/op/stat_errors.t                     See if stat and file tests handle threshold errors
+t/op/state.t                           See if state variables work
+t/op/study.t                           See if study works
+t/op/studytied.t                       See if study works with tied scalars
+t/op/sub.t                             See if subroutines work
+t/op/sub_lval.t                                See if lvalue subroutines work
+t/op/substr.t                          See if substr works
+t/op/substr_thr.t                      See if substr works in another thread
+t/op/svflags.t                         See if POK is set as expected.
+t/op/svleak.pl                         Test file for svleak.t
+t/op/svleak.t                          See if stuff leaks SVs
+t/op/switch.t                          See if switches (given/when) work
+t/op/symbolcache.t                     See if undef/delete works on stashes with functions
+t/op/sysio.t                           See if sysread and syswrite work
+t/op/taint.t                           See if tainting works
+t/op/threads.t                         Misc. tests for perl features with threads
+t/op/threads-dirh.t                    Test interaction of threads and dir handles
+t/op/threads_create.pl                 Ancillary file for t/op/threads.t
+t/op/tie.t                             See if tie/untie functions work
+t/op/tie_fetch_count.t                 See if FETCH is only called once on tied variables
+t/op/tiearray.t                                See if tie for arrays works
+t/op/tiehandle.t                       See if tie for handles works
+t/op/tiehash.t                         Tests for tied hashes using test.pl
+t/op/time.t                            See if time functions work
+t/op/time_loop.t                       Test that very large values don't hang gmtime and localtime.
+t/op/tr.t                              See if tr works
+t/op/tr_latin1.t                       See if tr works, but file isn't encoded in UTF-8
+t/op/try.t                             See if try works
+t/op/undef.t                           See if undef works
+t/op/universal.t                       See if UNIVERSAL class works
+t/op/unlink.t                          See if unlink works
+t/op/unshift.t                         See if unshift works
+t/op/upgrade.t                         See if upgrading and assigning scalars works
+t/op/utf8cache.t                       Tests malfunctions of utf8 cache
+t/op/utf8decode.t                      See if UTF-8 decoding works
+t/op/utf8magic.t                       See if utf8:: functions handle magic variables
+t/op/utfhash.t                         See if utf8 keys in hashes behave
+t/op/utftaint.t                                See if utf8 and taint work together
+t/op/vec.t                             See if vectors work
+t/op/ver.t                             See if v-strings and the %v format flag work
+t/op/waitpid.t                         See if waitpid works
+t/op/wantarray.t                       See if wantarray works
+t/op/warn.t                            See if warn works
+t/op/while.t                           See if while loops work
+t/op/write.t                           See if write works (formats work)
+t/op/yadayada.t                                See if ... works
 t/opbasic/arith.t                      See if arithmetic works
-t/opbasic/cmp.t                        See if the various string and numeric compare work
+t/opbasic/cmp.t                                See if the various string and numeric compare work
 t/opbasic/concat.t                     See if string concatenation works
-t/opbasic/magic_phase.t                See if ${^GLOBAL_PHASE} works
-t/opbasic/qq.t                 See if qq works
-t/perf/benchmarks              snippets of benchmarking/profiling code
-t/perf/benchmarks.t            test t/perf/benchmarks syntax
-t/perf/opcount.t               See if optimised subs have the right op counts
-t/perf/optree.t                        Test presence of some op optimisations
-t/perf/speed.t                 See if optimisations are keeping things fast
-t/perf/taint.t                 See if optimisations are keeping things fast (taint issues)
-t/perl.supp                    Perl valgrind suppressions
-t/porting/args_assert.t                Check that all PERL_ARGS_ASSERT* macros are used
-t/porting/authors.t            Check that all authors have been acknowledged
-t/porting/bench.t              Check Porting/bench.pl runs ok
-t/porting/bench/badhash                a test file for t/porting/bench.t
-t/porting/bench/badname                a test file for t/porting/bench.t
-t/porting/bench/badversion.json        a test file for t/porting/bench.t
-t/porting/bench/callsub.json   a test file for t/porting/bench.t
-t/porting/bench/callsub2.json  a test file for t/porting/bench.t
-t/porting/bench/oddentry       a test file for t/porting/bench.t
-t/porting/bench/ret0           a test file for t/porting/bench.t
-t/porting/bench/synerr         a test file for t/porting/bench.t
-t/porting/bench_selftest.t     run Porting/bench.pl's selftest facility
-t/porting/bincompat.t          Check that {non_,}bincompat_options are ordered
-t/porting/checkcase.t          Check whether we are case-insensitive-fs-friendly
-t/porting/checkcfgvar.t                Check that all config.sh-like files are good
-t/porting/cmp_version.t                Test whether all changed module files have their VERSION bumped
-t/porting/copyright.t          Check that copyright years match
-t/porting/corelist.t           Check that Module-CoreList has perl versions for the current perl
+t/opbasic/magic_phase.t                        See if ${^GLOBAL_PHASE} works
+t/opbasic/qq.t                         See if qq works
+t/perf/benchmarks                      snippets of benchmarking/profiling code
+t/perf/benchmarks.t                    test t/perf/benchmarks syntax
+t/perf/opcount.t                       See if optimised subs have the right op counts
+t/perf/optree.t                                Test presence of some op optimisations
+t/perf/speed.t                         See if optimisations are keeping things fast
+t/perf/taint.t                         See if optimisations are keeping things fast (taint issues)
+t/perl.supp                            Perl valgrind suppressions
+t/porting/args_assert.t                        Check that all PERL_ARGS_ASSERT* macros are used
+t/porting/authors.t                    Check that all authors have been acknowledged
+t/porting/bench.t                      Check Porting/bench.pl runs ok
+t/porting/bench/badhash                        a test file for t/porting/bench.t
+t/porting/bench/badname                        a test file for t/porting/bench.t
+t/porting/bench/badversion.json                a test file for t/porting/bench.t
+t/porting/bench/callsub.json           a test file for t/porting/bench.t
+t/porting/bench/callsub2.json          a test file for t/porting/bench.t
+t/porting/bench/oddentry               a test file for t/porting/bench.t
+t/porting/bench/ret0                   a test file for t/porting/bench.t
+t/porting/bench/synerr                 a test file for t/porting/bench.t
+t/porting/bench_selftest.t             run Porting/bench.pl's selftest facility
+t/porting/bincompat.t                  Check that {non_,}bincompat_options are ordered
+t/porting/checkcase.t                  Check whether we are case-insensitive-fs-friendly
+t/porting/checkcfgvar.t                        Check that all config.sh-like files are good
+t/porting/cmp_version.t                        Test whether all changed module files have their VERSION bumped
+t/porting/copyright.t                  Check that copyright years match
+t/porting/corelist.t                   Check that Module-CoreList has perl versions for the current perl
 t/porting/customized.dat               Data file for porting/customized.t
-t/porting/customized.t         Check all CUSTOMIZED files are as they should be
-t/porting/diag.t               Test completeness of perldiag.pod
-t/porting/dual-life.t          Check that dual-life bins are in utils/
-t/porting/exec-bit.t           Check that exec-bit bins are identified
-t/porting/extrefs.t            Check perl headers don't make extern refs
-t/porting/filenames.t          Check the MANIFEST for filename portability.
-t/porting/FindExt.t            Test win32/FindExt.pm
-t/porting/globvar.t            Check that globvar.sym is sane
-t/porting/known_pod_issues.dat Data file for porting/podcheck.t
-t/porting/libperl.t            Check libperl.a sanity
-t/porting/maintainers.t                Test that Porting/Maintainers.pl is up to date
-t/porting/manifest.t           Test that this MANIFEST file is well formed
-t/porting/pending-author.t     Check if any pending commit would break tests
-t/porting/perlfunc.t           Test that Functions_pm.PL can parse perlfunc.pod
-t/porting/pod_rules.t          Check that various pod lists are consistent
-t/porting/podcheck.t           Test the POD of shipped modules is well formed
-t/porting/re_context.t         Check assumptions made by save_re_context()
-t/porting/readme.t             Check that all files in Porting/ are mentioned in Porting/README.pod
-t/porting/regen.t              Check that regen.pl doesn't need running
-t/porting/ss_dup.t             Check that sv.c:ss_dup handles everything
-t/porting/test_bootstrap.t     Test that the instructions for test bootstrapping aren't accidentally overlooked.
-t/porting/utils.t              Check that utility scripts still compile
-t/re/alpha_assertions.t                See if things like '(*postive_lookahed:...) work properly
-t/re/anyof.t                   See if bracketed char classes [...] compile properly
-t/re/begin-once.t              Checking that /o freeze a variable in a RegExp
-t/re/bigfuzzy_not_utf8.t       Big and ugly tests not storable as UTF-8
-t/re/charset.t                 See if regex modifiers like /d, /u work properly
-t/re/fold_grind.pl             Core file to see if regex case folding works properly
-t/re/fold_grind_8.t            Wrapper for fold_grind.pl for /l testing with a UTF-8 locale
-t/re/fold_grind_a.t            Wrapper for fold_grind.pl for /a testing
-t/re/fold_grind_aa.t           Wrapper for fold_grind.pl for /aa testing
-t/re/fold_grind_d.t            Wrapper for fold_grind.pl for /d testing
-t/re/fold_grind_l.t            Wrapper for fold_grind.pl for /l testing with a C locale
-t/re/fold_grind_T.t            Wrapper for fold_grind.pl for /l testing with a Turkic locale
-t/re/fold_grind_u.t            Wrapper for fold_grind.pl for /u testing
-t/re/keep_tabs.t               Tests where \t can't be expanded.
-t/re/no_utf8_pm.t              Verify utf8.pm doesn't get loaded unless required
+t/porting/customized.t                 Check all CUSTOMIZED files are as they should be
+t/porting/deprecation.t                        Test that deprecation warnings are handled right
+t/porting/diag.t                       Test completeness of perldiag.pod
+t/porting/dual-life.t                  Check that dual-life bins are in utils/
+t/porting/exec-bit.t                   Check that exec-bit bins are identified
+t/porting/extrefs.t                    Check perl headers don't make extern refs
+t/porting/filenames.t                  Check the MANIFEST for filename portability.
+t/porting/FindExt.t                    Test win32/FindExt.pm
+t/porting/globvar.t                    Check that globvar.sym is sane
+t/porting/header_parser.t              Check that regen/HeaderParser.pm works as expected
+t/porting/known_pod_issues.dat         Data file for porting/podcheck.t
+t/porting/libperl.t                    Check libperl.a sanity
+t/porting/maintainers.t                        Test that Porting/Maintainers.pl is up to date
+t/porting/manifest.t                   Test that this MANIFEST file is well formed
+t/porting/perlfunc.t                   Test that Functions_pm.PL can parse perlfunc.pod
+t/porting/pod_rules.t                  Check that various pod lists are consistent
+t/porting/podcheck.t                   Test the POD of shipped modules is well formed
+t/porting/re_context.t                 Check assumptions made by save_re_context()
+t/porting/readme.t                     Check that all files in Porting/ are mentioned in Porting/README.pod
+t/porting/regen.t                      Check that regen.pl doesn't need running
+t/porting/ss_dup.t                     Check that sv.c:ss_dup handles everything
+t/porting/test_bootstrap.t             Test that the instructions for test bootstrapping aren't accidentally overlooked.
+t/porting/test_testlist.t              Test that we t/harness and t/TEST and MANIFEST agree on our test list
+t/porting/update_authors.t             Tests for Porting/updateAUTHORS.pl
+t/porting/utils.t                      Check that utility scripts still compile
+t/re/alpha_assertions.t                        See if things like '(*postive_lookahed:...) work properly
+t/re/anyof.t                           See if bracketed char classes [...] compile properly
+t/re/begin-once.t                      Checking that /o freeze a variable in a RegExp
+t/re/bigfuzzy_not_utf8.t               Big and ugly tests not storable as UTF-8
+t/re/charset.t                         See if regex modifiers like /d, /u work properly
+t/re/fold_grind.pl                     Core file to see if regex case folding works properly
+t/re/fold_grind_8.t                    Wrapper for fold_grind.pl for /l testing with a UTF-8 locale
+t/re/fold_grind_a.t                    Wrapper for fold_grind.pl for /a testing
+t/re/fold_grind_aa.t                   Wrapper for fold_grind.pl for /aa testing
+t/re/fold_grind_d.t                    Wrapper for fold_grind.pl for /d testing
+t/re/fold_grind_l.t                    Wrapper for fold_grind.pl for /l testing with a C locale
+t/re/fold_grind_T.t                    Wrapper for fold_grind.pl for /l testing with a Turkic locale
+t/re/fold_grind_u.t                    Wrapper for fold_grind.pl for /u testing
+t/re/keep_tabs.t                       Tests where \t can't be expanded.
+t/re/no_utf8_pm.t                      Verify utf8.pm doesn't get loaded unless required
 t/re/opt.t                             Test regexp optimizations
-t/re/overload.t                Test against string corruption in pattern matches on overloaded objects
-t/re/pat.t                     See if esoteric patterns work
-t/re/pat_advanced.t            See if advanced esoteric patterns work
-t/re/pat_advanced_thr.t                See if advanced esoteric patterns work in another thread
-t/re/pat_psycho.t              See if insane esoteric and slow patterns work
-t/re/pat_psycho_thr.t          See if insane esoteric and slow patterns work in another thread
-t/re/pat_re_eval.t             See if esoteric patterns using re 'eval' work
-t/re/pat_re_eval_thr.t         See if esoteric patterns using re 'eval' work in another thread
-t/re/pat_rt_report.t           See if esoteric patterns from rt reports work
-t/re/pat_rt_report_thr.t       See if esoteric patterns from rt reports work in another thread
-t/re/pat_special_cc.t          See if special charclasses (\s \w \d) work the same as (\s and [\s])
-t/re/pat_special_cc_thr.t      See if special charclasses (\s \w \d) work the same as (\s and [\s]) under threads
-t/re/pat_thr.t                 See if esoteric patterns work in another thread
-t/re/pos.t                     Ensure pos() gets set properly after pre-match failures in pp_match
-t/re/qr.t                      See if qr works
-t/re/qr-72922.t                        Test for bug #72922
-t/re/qr_gc.t                   See if qr doesn't leak
-t/re/qrstack.t                 See if qr expands the stack properly
-t/re/re_tests                  Regular expressions for regexp.t
-t/re/recompile.t               See if pattern caching/recompilation works
-t/re/reg_60508.t               See if bug #60508 is fixed
-t/re/reg_email.t               See if regex recursion works by parsing email addresses
-t/re/reg_email_thr.t           See if regex recursion works by parsing email addresses in another thread
-t/re/reg_eval.t                        Test again regexp state corruption in (?{ }) and (??{ })
-t/re/reg_eval_scope.t          Test scoping issues with (?{ }) and (??{ })
-t/re/reg_fold.t                        See if case folding works properly
-t/re/reg_mesg.t                        See if one can get regular expression errors
-t/re/reg_namedcapture.t                Make sure glob assignment doesn't break named capture
-t/re/reg_nc_tie.t              Test the tied methods of Tie::Hash::NamedCapture
-t/re/reg_nocapture.t           Test the /n flag for regexps
-t/re/reg_pmod.t                        See if regexp /p modifier works as expected
-t/re/reg_posixcc.t             See if posix character classes behave consistently
-t/re/regex_sets.t              Test (?[ ])
-t/re/regex_sets_compat.t       Test (?[ ]) is compatible with old [ ]
-t/re/regexp.t                  See if regular expressions work
-t/re/regexp_noamp.t            See if regular expressions work with optimizations
-t/re/regexp_nonull.t           See if regexps work without trailing nulls
-t/re/regexp_notrie.t           See if regular expressions work without trie optimisation
-t/re/regexp_qr.t               See if regular expressions work as qr//
-t/re/regexp_qr_embed.t         See if regular expressions work with embedded qr//
-t/re/regexp_qr_embed_thr.t     See if regular expressions work with embedded qr// in another thread
-t/re/regexp_trielist.t         See if regular expressions work with trie optimisation
-t/re/regexp_unicode_prop.t     See if unicode properties work in regular expressions as expected
-t/re/regexp_unicode_prop_thr.t See if unicode properties work in regular expressions as expected under threads
-t/re/rt122747.t                        Test rt122747 assert faile (requires DEBUGGING)
-t/re/rxcode.t                  See if /(?{ code })/ works
-t/re/script_run.t              See if script runs works
-t/re/speed.t                   See if optimisations are keeping things fast
-t/re/speed_thr.t               ditto under threads
-t/re/subst.t                   See if substitution works
-t/re/subst_amp.t               See if $&-related substitution works
-t/re/subst_wamp.t              See if substitution works with $& present
-t/re/substT.t                  See if substitution works with -T
-t/re/uniprops01.t              Test unicode \p{} regex constructs
-t/re/uniprops02.t              Test unicode \p{} regex constructs
-t/re/uniprops03.t              Test unicode \p{} regex constructs
-t/re/uniprops04.t              Test unicode \p{} regex constructs
-t/re/uniprops05.t              Test unicode \p{} regex constructs
-t/re/uniprops06.t              Test unicode \p{} regex constructs
-t/re/uniprops07.t              Test unicode \p{} regex constructs
-t/re/uniprops08.t              Test unicode \p{} regex constructs
-t/re/uniprops09.t              Test unicode \p{} regex constructs
-t/re/uniprops10.t              Test unicode \p{} regex constructs
-t/re/user_prop_race_thr.t      Test races in user-defined \p{} under threads
-t/README                       Instructions for regression tests
-t/run/cloexec.t                        Test close-on-exec.
-t/run/dtrace.pl                        For dtrace.t
-t/run/dtrace.t                 Test for DTrace probes
-t/run/exit.t                   Test perl's exit status.
-t/run/flib/broken.pm           Bad .pm file for switchM.t
-t/run/flib/t2.pm               Test for .pmcs with -I/dir/
-t/run/flib/t2.pmc              Test for .pmcs with -I/dir/
-t/run/fresh_perl.t             Tests that require a fresh perl.
-t/run/locale.t         Tests related to locale handling
-t/run/noswitch.t               Test aliasing ARGV for other switch tests
-t/run/runenv.t                 Test if perl honors its environment variables.
-t/run/runenv_hashseed.t        Test if perl honors PERL_HASH_SEED.
-t/run/script.t                 See if script invocation works
-t/run/switch0.t                        Test the -0 switch
-t/run/switcha.t                        Test the -a switch
-t/run/switchC.t                        Test the -C switch
-t/run/switchd.t                        Test the -d switch
-t/run/switchd-78586.t          See whether bug 78586 is fixed
-t/run/switchDx.t               Test the -D switch
-t/run/switches.t               Tests for the other switches (-0, -l, -c, -s, -M, -m, -V, -v, -h, -z, -i)
-t/run/switchF.t                        Test the -F switch
-t/run/switchF1.t               Pathological tests for the -F switch
-t/run/switchF2.t               Pathological tests for the -F switch
-t/run/switchI.t                        Test the -I switch
-t/run/switchM.t                        Test the -M switch
-t/run/switchn.t                        Test the -n switch
-t/run/switchp.t                        Test the -p switch
-t/run/switcht.t                        Test the -t switch
-t/run/switchx.aux              Data for switchx.t
-t/run/switchx.t                        Test the -x switch
-t/run/switchx2.aux             Data for switchx.t
-t/run/switchx3.aux             Data for switchx.t
-t/TEST                         The regression tester
-t/test.pl                      Simple testing library
-t/test_pl/_num_to_alpha.t      Tests for the simple testing library 
-t/test_pl/can_isa_ok.t         Tests for the simple testing library
-t/test_pl/plan_skip_all.t      Tests for the simple testing library
-t/test_pl/tempfile.t           Tests for the simple testing library
-t/thread_it.pl                 Run regression tests in a new thread
-t/uni/attrs.t                  See if Unicode attributes work
-t/uni/bless.t                  See if Unicode bless works
-t/uni/caller.t                 See if Unicode doesn't get mangled in caller()
-t/uni/case.pl                  See if Unicode casing works
-t/uni/chomp.t                  See if Unicode chomp works
-t/uni/class.t                  See if Unicode classes work (\p)
-t/uni/eval.t                   See if Unicode hints don't affect eval()
-t/uni/fold.t                   See if Unicode folding works
-t/uni/goto.t                   See if Unicode goto &sub works
-t/uni/greek.t                  See if Unicode in greek works
-t/uni/gv.t                     See if Unicode GVs work.
-t/uni/labels.t                 See if Unicode labels work
-t/uni/latin2.t                 See if Unicode in latin2 works
-t/uni/lex_utf8.t               See if Unicode in lexer works
-t/uni/lower.t                  See if Unicode casing works
-t/uni/method.t                 See if Unicode methods work
-t/uni/opcroak.t                        See if Unicode croaks from op.c work
-t/uni/overload.t               See if Unicode overloading works
-t/uni/package.t                        See if Unicode in package declarations works
-t/uni/parser.t                 See if Unicode in the parser works in edge cases.
-t/uni/readline.t               See if Unicode filehandles in <FH> work
-t/uni/select.t                 See if Unicode filehandles aren't mangled by select()
-t/uni/sprintf.t                        See if Unicode sprintf works
-t/uni/stash.t                  See if Unicode stashes work
-t/uni/tie.t                    See if Unicode tie works
-t/uni/title.t                  See if Unicode casing works
-t/uni/tr_utf8.t                        See if Unicode tr/// in utf8 works
-t/uni/universal.t              See if Unicode in calls to UNIVERSAL works
-t/uni/upper.t                  See if Unicode casing works
-t/uni/variables.t              See that the rules for variable names work
-t/uni/write.t                  See if Unicode formats work
-t/win32/crypt.t                        Test Win32 crypt for compatibility
-t/win32/fs.t                   Test Win32 link for compatibility
-t/win32/popen.t                        Test for stdout races in backticks, etc
-t/win32/runenv.t               Test if Win* perl honors its env variables
-t/win32/signal.t               Test Win32 signal emulation
-t/win32/stat.t                 Test Win32 stat emulation
-t/win32/symlink.t              Test Win32 symlink
-t/win32/system.t               See if system works in Win*
-t/win32/system_tests           Test runner for system.t
-taint.c                                Tainting code
-TestInit.pm                    Preamble library for tests
-thread.h                       Threading header
-time64.c                       64 bit clean time.h (code)
-time64.h                       64 bit clean time.h (header)
-time64_config.h                        64 bit clean time.h (configuration)
-toke.c                         The tokener
-uconfig.h                      Configuration header for microperl
-uconfig.sh                     Configuration script for microperl
-uconfig64.sh                   Configuration script for microperl for LP64
-uni_keywords.h                 Map unicode property names to numbers
-unicode_constants.h            compile-time macros for Unicode code points
-universal.c                    The default UNIVERSAL package methods
-unixish.h                      Defines that are assumed on Unix
-utf8.c                         Unicode routines
-utf8.h                         Unicode header
-utfebcdic.h                    Unicode on EBCDIC (UTF-EBCDIC, tr16) header
-util.c                         Utility routines
-util.h                         Dummy header
-utils.lst                      Lists utilities bundled with Perl
-utils/corelist.PL              Module::CoreList
-utils/cpan.PL                  easily interact with CPAN from the command line
-utils/enc2xs.PL                        Encode module generator
+t/re/overload.t                                Test against string corruption in pattern matches on overloaded objects
+t/re/pat.t                             See if esoteric patterns work
+t/re/pat_advanced.t                    See if advanced esoteric patterns work
+t/re/pat_advanced_thr.t                        See if advanced esoteric patterns work in another thread
+t/re/pat_psycho.t                      See if insane esoteric and slow patterns work
+t/re/pat_psycho_thr.t                  See if insane esoteric and slow patterns work in another thread
+t/re/pat_re_eval.t                     See if esoteric patterns using re 'eval' work
+t/re/pat_re_eval_thr.t                 See if esoteric patterns using re 'eval' work in another thread
+t/re/pat_rt_report.t                   See if esoteric patterns from rt reports work
+t/re/pat_rt_report_thr.t               See if esoteric patterns from rt reports work in another thread
+t/re/pat_special_cc.t                  See if special charclasses (\s \w \d) work the same as (\s and [\s])
+t/re/pat_special_cc_thr.t              See if special charclasses (\s \w \d) work the same as (\s and [\s]) under threads
+t/re/pat_thr.t                         See if esoteric patterns work in another thread
+t/re/pos.t                             Ensure pos() gets set properly after pre-match failures in pp_match
+t/re/qr.t                              See if qr works
+t/re/qr-72922.t                                Test for bug #72922
+t/re/qr_gc.t                           See if qr doesn't leak
+t/re/qrstack.t                         See if qr expands the stack properly
+t/re/re_tests                          Regular expressions for regexp.t
+t/re/recompile.t                       See if pattern caching/recompilation works
+t/re/reg_60508.t                       See if bug #60508 is fixed
+t/re/reg_email.t                       See if regex recursion works by parsing email addresses
+t/re/reg_email_thr.t                   See if regex recursion works by parsing email addresses in another thread
+t/re/reg_eval.t                                Test again regexp state corruption in (?{ }) and (??{ })
+t/re/reg_eval_scope.t                  Test scoping issues with (?{ }) and (??{ })
+t/re/reg_fold.t                                See if case folding works properly
+t/re/reg_mesg.t                                See if one can get regular expression errors
+t/re/reg_namedcapture.t                        Make sure glob assignment doesn't break named capture
+t/re/reg_nc_tie.t                      Test the tied methods of Tie::Hash::NamedCapture
+t/re/reg_nocapture.t                   Test the /n flag for regexps
+t/re/reg_pmod.t                                See if regexp /p modifier works as expected
+t/re/reg_posixcc.t                     See if posix character classes behave consistently
+t/re/regex_sets.t                      Test (?[ ])
+t/re/regex_sets_compat.t               Test (?[ ]) is compatible with old [ ]
+t/re/regexp.t                          See if regular expressions work
+t/re/regexp_noamp.t                    See if regular expressions work with optimizations
+t/re/regexp_nonull.t                   See if regexps work without trailing nulls
+t/re/regexp_normal.t                   See if regexps work when expressions are normalized in various ways
+t/re/regexp_notrie.t                   See if regular expressions work without trie optimisation
+t/re/regexp_qr.t                       See if regular expressions work as qr//
+t/re/regexp_qr_embed.t                 See if regular expressions work with embedded qr//
+t/re/regexp_qr_embed_thr.t             See if regular expressions work with embedded qr// in another thread
+t/re/regexp_trielist.t                 See if regular expressions work with trie optimisation
+t/re/regexp_unicode_prop.t             See if unicode properties work in regular expressions as expected
+t/re/regexp_unicode_prop_thr.t         See if unicode properties work in regular expressions as expected under threads
+t/re/rt122747.t                                Test rt122747 assert faile (requires DEBUGGING)
+t/re/rxcode.t                          See if /(?{ code })/ works
+t/re/script_run.t                      See if script runs works
+t/re/speed.t                           See if optimisations are keeping things fast
+t/re/speed_thr.t                       ditto under threads
+t/re/stclass_threads.t                 Test if stclass is preserved across threads
+t/re/subst.t                           See if substitution works
+t/re/subst_amp.t                       See if $&-related substitution works
+t/re/subst_wamp.t                      See if substitution works with $& present
+t/re/substT.t                          See if substitution works with -T
+t/re/uniprops01.t                      Test unicode \p{} regex constructs
+t/re/uniprops02.t                      Test unicode \p{} regex constructs
+t/re/uniprops03.t                      Test unicode \p{} regex constructs
+t/re/uniprops04.t                      Test unicode \p{} regex constructs
+t/re/uniprops05.t                      Test unicode \p{} regex constructs
+t/re/uniprops06.t                      Test unicode \p{} regex constructs
+t/re/uniprops07.t                      Test unicode \p{} regex constructs
+t/re/uniprops08.t                      Test unicode \p{} regex constructs
+t/re/uniprops09.t                      Test unicode \p{} regex constructs
+t/re/uniprops10.t                      Test unicode \p{} regex constructs
+t/re/user_prop_race_thr.t              Test races in user-defined \p{} under threads
+t/README                               Instructions for regression tests
+t/run/cloexec.t                                Test close-on-exec.
+t/run/dtrace.pl                                For dtrace.t
+t/run/dtrace.t                         Test for DTrace probes
+t/run/exit.t                           Test perl's exit status.
+t/run/flib/broken.pm                   Bad .pm file for switchM.t
+t/run/flib/t2.pm                       Test for .pmcs with -I/dir/
+t/run/flib/t2.pmc                      Test for .pmcs with -I/dir/
+t/run/fresh_perl.t                     Tests that require a fresh perl.
+t/run/locale.t                         Tests related to locale handling
+t/run/noswitch.t                       Test aliasing ARGV for other switch tests
+t/run/runenv.t                         Test if perl honors its environment variables.
+t/run/runenv_hashseed.t                        Test if perl honors PERL_HASH_SEED.
+t/run/runenv_randseed.t                        Test if perl honors PERL_RAND_SEED.
+t/run/script.t                         See if script invocation works
+t/run/switch0.t                                Test the -0 switch
+t/run/switcha.t                                Test the -a switch
+t/run/switchC.t                                Test the -C switch
+t/run/switchd.t                                Test the -d switch
+t/run/switchd-78586.t                  See whether bug 78586 is fixed
+t/run/switchDx.t                       Test the -D switch
+t/run/switches.t                       Tests for the other switches (-0, -l, -c, -s, -M, -m, -V, -v, -h, -z, -i)
+t/run/switchF.t                                Test the -F switch
+t/run/switchF1.t                       Pathological tests for the -F switch
+t/run/switchF2.t                       Pathological tests for the -F switch
+t/run/switchI.t                                Test the -I switch
+t/run/switchM.t                                Test the -M switch
+t/run/switchn.t                                Test the -n switch
+t/run/switchp.t                                Test the -p switch
+t/run/switcht.t                                Test the -t switch
+t/run/switchx.aux                      Data for switchx.t
+t/run/switchx.t                                Test the -x switch
+t/run/switchx2.aux                     Data for switchx.t
+t/run/switchx3.aux                     Data for switchx.t
+t/TEST                                 The regression tester
+t/test.pl                              Simple testing library
+t/test_pl/_num_to_alpha.t              Tests for the simple testing library
+t/test_pl/can_isa_ok.t                 Tests for the simple testing library
+t/test_pl/plan_skip_all.t              Tests for the simple testing library
+t/test_pl/tempfile.t                   Tests for the simple testing library
+t/thread_it.pl                         Run regression tests in a new thread
+t/uni/attrs.t                          See if Unicode attributes work
+t/uni/bless.t                          See if Unicode bless works
+t/uni/caller.t                         See if Unicode doesn't get mangled in caller()
+t/uni/case.pl                          See if Unicode casing works
+t/uni/chomp.t                          See if Unicode chomp works
+t/uni/class.t                          See if Unicode classes work (\p)
+t/uni/eval.t                           See if Unicode hints don't affect eval()
+t/uni/fold.t                           See if Unicode folding works
+t/uni/goto.t                           See if Unicode goto &sub works
+t/uni/greek.t                          See if Unicode in greek works
+t/uni/gv.t                             See if Unicode GVs work.
+t/uni/labels.t                         See if Unicode labels work
+t/uni/latin2.t                         See if Unicode in latin2 works
+t/uni/lex_utf8.t                       See if Unicode in lexer works
+t/uni/lower.t                          See if Unicode casing works
+t/uni/method.t                         See if Unicode methods work
+t/uni/opcroak.t                                See if Unicode croaks from op.c work
+t/uni/overload.t                       See if Unicode overloading works
+t/uni/package.t                                See if Unicode in package declarations works
+t/uni/parser.t                         See if Unicode in the parser works in edge cases.
+t/uni/readline.t                       See if Unicode filehandles in <FH> work
+t/uni/select.t                         See if Unicode filehandles aren't mangled by select()
+t/uni/sprintf.t                                See if Unicode sprintf works
+t/uni/stash.t                          See if Unicode stashes work
+t/uni/tie.t                            See if Unicode tie works
+t/uni/title.t                          See if Unicode casing works
+t/uni/tr_utf8.t                                See if Unicode tr/// in utf8 works
+t/uni/universal.t                      See if Unicode in calls to UNIVERSAL works
+t/uni/upper.t                          See if Unicode casing works
+t/uni/variables.t                      See that the rules for variable names work
+t/uni/write.t                          See if Unicode formats work
+t/win32/crypt.t                                Test Win32 crypt for compatibility
+t/win32/fs.t                           Test Win32 link for compatibility
+t/win32/popen.t                                Test for stdout races in backticks, etc
+t/win32/runenv.t                       Test if Win* perl honors its env variables
+t/win32/seekdir.t                      Test that seekdir/readdir are restricted to relevant memory
+t/win32/signal.t                       Test Win32 signal emulation
+t/win32/stat.t                         Test Win32 stat emulation
+t/win32/symlink.t                      Test Win32 symlink
+t/win32/system.t                       See if system works in Win*
+t/win32/system_tests                   Test runner for system.t
+utils/corelist.PL                      Module::CoreList
+utils/cpan.PL                          easily interact with CPAN from the command line
+utils/enc2xs.PL                                Encode module generator
 utils/encguess.PL                      guess character encodings of files
-utils/h2ph.PL                  A thing to turn C .h files into perl .ph files
-utils/h2xs.PL                  Program to make .xs files from C header files
-utils/instmodsh.PL             Give information about installed extensions
-utils/json_pp.PL               JSON::PP command line utility
-utils/libnetcfg.PL             libnet
-utils/Makefile.PL              Extract the utility scripts
-utils/perlbug.PL               A simple tool to submit a bug report
-utils/perldoc.PL               A simple tool to find & display perl's documentation
-utils/perlivp.PL               installation verification procedure
-utils/piconv.PL                        iconv(1), reinvented in perl
-utils/pl2pm.PL                 A pl to pm translator
-utils/pod2html.PL              Translator to turn pod into HTML
-utils/prove.PL                 The prove harness utility
-utils/ptar.PL                  The ptar utility
-utils/ptardiff.PL              The ptardiff utility
-utils/ptargrep.PL              The ptargrep utility
-utils/shasum.PL                        filter for computing SHA digests (analogous to md5sum)
-utils/splain.PL                        Stand-alone version of diagnostics.pm
+utils/h2ph.PL                          A thing to turn C .h files into perl .ph files
+utils/h2xs.PL                          Program to make .xs files from C header files
+utils/instmodsh.PL                     Give information about installed extensions
+utils/json_pp.PL                       JSON::PP command line utility
+utils/libnetcfg.PL                     libnet
+utils/Makefile.PL                      Extract the utility scripts
+utils/perlbug.PL                       A simple tool to submit a bug report
+utils/perldoc.PL                       A simple tool to find & display perl's documentation
+utils/perlivp.PL                       installation verification procedure
+utils/piconv.PL                                iconv(1), reinvented in perl
+utils/pl2pm.PL                         A pl to pm translator
+utils/pod2html.PL                      Translator to turn pod into HTML
+utils/prove.PL                         The prove harness utility
+utils/ptar.PL                          The ptar utility
+utils/ptardiff.PL                      The ptardiff utility
+utils/ptargrep.PL                      The ptargrep utility
+utils/shasum.PL                                filter for computing SHA digests (analogous to md5sum)
+utils/splain.PL                                Stand-alone version of diagnostics.pm
 utils/streamzip.PL
-utils/xsubpp.PL                        External subroutine preprocessor
+utils/xsubpp.PL                                External subroutine preprocessor
 utils/zipdetails.PL                    display the internal structure of zip files
-vms/descrip_mms.template       Template MM[SK] description file for build
-vms/gen_shrfls.pl              generate options files and glue for shareable image
-vms/genopt.com                 hack to write options files in case of broken makes
-vms/make_command.com           record MM[SK] command used to build Perl
-vms/mms2make.pl                        convert descrip.mms to make syntax
-vms/munchconfig.c              performs shell $var substitution for VMS
-vms/myconfig.com               record local configuration info for bug report
-vms/test.com                   DCL driver for regression tests
-vms/vms.c                      VMS-specific C code for Perl core
-vms/vmsish.h                   VMS-specific C header for Perl core
-vms/vmspipe.com                        VMS-specific piped command helper script
-vos/Changes                    Changes made to port Perl to the VOS operating system
-vos/compile_full_perl.cm       VOS command macro to build "full" Perl
-vos/configure_full_perl.sh     VOS shell script to configure "full" perl before building
-vos/make_full_perl.sh          VOS shell script to build and test "full" perl
-vos/vos.c                      VOS emulations for missing POSIX functions
-vos/vosish.h                   VOS-specific header file
-vutil.c                                Version object C functions
-vutil.h                                Version object headers
-vxs.inc                                Version object XS methods
-warnings.h                     The warning numbers
-win32/bin/exetype.pl           Set executable type to CONSOLE or WINDOWS
-win32/bin/perlglob.pl          Win32 globbing
-win32/bin/pl2bat.pl            wrap perl scripts into batch files
-win32/bin/runperl.pl           run perl script via batch file namesake
-win32/bin/search.pl            Win32 port
-win32/config.gc                        Win32 base line config.sh (MinGW build)
-win32/config.vc                        Win32 base line config.sh (Visual C++ build)
-win32/config_H.gc              Win32 config header (MinGW build)
-win32/config_h.PL              Perl code to convert Win32 config.sh to config.h
-win32/config_H.vc              Win32 config header (Visual C++ build)
-win32/config_sh.PL             Perl code to update Win32 config.sh from Makefile
-win32/create_perllibst_h.pl    creates perllibst.h file for inclusion from perllib.c
-win32/distclean.bat            Remove _ALL_ files not listed here in MANIFEST
-win32/fcrypt.c                 crypt() implementation
-win32/FindExt.pm               Scan for extensions
-win32/GNUmakefile              Win32 makefile for GNU make
-win32/include/arpa/inet.h      Win32 port
-win32/include/dirent.h         Win32 port
-win32/include/netdb.h          Win32 port
-win32/include/sys/errno2.h     Win32 port
-win32/include/sys/socket.h     Win32 port
-win32/list_static_libs.pl      prints libraries for static linking
-win32/Makefile                 Win32 makefile for NMAKE (Visual C++ build)
-win32/perlexe.ico              perlexe.ico image file
-win32/perlexe.manifest         Assembly manifest file
-win32/perlexe.rc               associated perl binary with icon
-win32/perlglob.c               Win32 port
-win32/perlhost.h               Perl "host" implementation
-win32/perllib.c                        Win32 port
-win32/pod.mak                  Win32 port
-win32/runperl.c                        Win32 port
-win32/vdir.h                   Perl "host" virtual directory manager for Win32
-win32/vmem.h                   Perl "host" memory manager for Win32
-win32/win32.c                  Win32 port
-win32/win32.h                  Win32 port
-win32/win32iop.h               Win32 port
-win32/win32sck.c               Win32 port
-win32/win32thread.c            Win32 functions for threads
-win32/win32thread.h            Win32 port mapping to threads
-write_buildcustomize.pl                Generate lib/buildcustomize.pl
-XSUB.h                         Include file for extension subroutines
-zaphod32_hash.h                        Zaphod32 hash code (32 bit fast hash function)
+vms/descrip_mms.template               Template MM[SK] description file for build
+vms/gen_shrfls.pl                      generate options files and glue for shareable image
+vms/genopt.com                         hack to write options files in case of broken makes
+vms/make_command.com                   record MM[SK] command used to build Perl
+vms/mms2make.pl                                convert descrip.mms to make syntax
+vms/munchconfig.c                      performs shell $var substitution for VMS
+vms/myconfig.com                       record local configuration info for bug report
+vms/test.com                           DCL driver for regression tests
+vms/vms.c                              VMS-specific C code for Perl core
+vms/vmsish.h                           VMS-specific C header for Perl core
+vms/vmspipe.com                                VMS-specific piped command helper script
+vos/Changes                            Changes made to port Perl to the VOS operating system
+vos/compile_full_perl.cm               VOS command macro to build "full" Perl
+vos/configure_full_perl.sh             VOS shell script to configure "full" perl before building
+vos/make_full_perl.sh                  VOS shell script to build and test "full" perl
+vos/vos.c                              VOS emulations for missing POSIX functions
+vos/vosish.h                           VOS-specific header file
+win32/bin/exetype.pl                   Set executable type to CONSOLE or WINDOWS
+win32/bin/perlglob.pl                  Win32 globbing
+win32/bin/pl2bat.pl                    wrap perl scripts into batch files
+win32/bin/runperl.pl                   run perl script via batch file namesake
+win32/bin/search.pl                    Win32 port
+win32/config.gc                                Win32 base line config.sh (MinGW build)
+win32/config.vc                                Win32 base line config.sh (Visual C++ build)
+win32/config_H.gc                      Win32 config header (MinGW build)
+win32/config_h.PL                      Perl code to convert Win32 config.sh to config.h
+win32/config_H.vc                      Win32 config header (Visual C++ build)
+win32/config_sh.PL                     Perl code to update Win32 config.sh from Makefile
+win32/create_perllibst_h.pl            creates perllibst.h file for inclusion from perllib.c
+win32/distclean.bat                    Remove _ALL_ files not listed here in MANIFEST
+win32/fcrypt.c                         crypt() implementation
+win32/FindExt.pm                       Scan for extensions
+win32/GNUmakefile                      Win32 makefile for GNU make
+win32/include/arpa/inet.h              Win32 port
+win32/include/dirent.h                 Win32 port
+win32/include/netdb.h                  Win32 port
+win32/include/sys/errno2.h             Win32 port
+win32/include/sys/socket.h             Win32 port
+win32/list_static_libs.pl              prints libraries for static linking
+win32/Makefile                         Win32 makefile for NMAKE (Visual C++ build)
+win32/perlexe.ico                      perlexe.ico image file
+win32/perlexe.manifest                 Assembly manifest file
+win32/perlexe.rc                       associated perl binary with icon
+win32/perlglob.c                       Win32 port
+win32/perlhost.h                       Perl "host" implementation
+win32/perllib.c                                Win32 port
+win32/pod.mak                          Win32 port
+win32/runperl.c                                Win32 port
+win32/vdir.h                           Perl "host" virtual directory manager for Win32
+win32/vmem.h                           Perl "host" memory manager for Win32
+win32/win32.c                          Win32 port
+win32/win32.h                          Win32 port
+win32/win32iop.h                       Win32 port
+win32/win32sck.c                       Win32 port
+win32/win32thread.c                    Win32 functions for threads
+win32/win32thread.h                    Win32 port mapping to threads
index 442e1c4..026a96a 100644 (file)
@@ -36,6 +36,7 @@
          "dist/IO",
          "dist/lib",
          "dist/Locale-Maketext",
+         "dist/Math-Complex",
          "dist/Module-CoreList",
          "dist/Net-Ping",
          "dist/PathTools",
          "url" : "https://github.com/Perl/perl5"
       }
    },
-   "version" : "5.036003",
-   "x_serialization_backend" : "JSON::PP version 4.07"
+   "version" : "5.038002",
+   "x_serialization_backend" : "JSON::PP version 4.16"
 }
index bb66274..08e3568 100644 (file)
@@ -34,6 +34,7 @@ no_index:
     - dist/IO
     - dist/lib
     - dist/Locale-Maketext
+    - dist/Math-Complex
     - dist/Module-CoreList
     - dist/Net-Ping
     - dist/PathTools
@@ -105,5 +106,5 @@ resources:
   homepage: https://www.perl.org/
   license: https://dev.perl.org/licenses/
   repository: https://github.com/Perl/perl5
-version: '5.036003'
+version: '5.038002'
 x_serialization_backend: 'CPAN::Meta::YAML version 0.018'
index 3985e37..160f21d 100644 (file)
@@ -73,7 +73,7 @@ true)
                esac
                ;;
        cygwin*)
-               shrpldflags="$shrpldflags -Wl,--out-implib=libperl.dll.a -Wl,--image-base,0x52000000"
+               shrpldflags="$shrpldflags -Wl,--out-implib=libperl.dll.a"
                linklibperl="-L. -lperl"
                ;;
        sunos*)
@@ -209,7 +209,6 @@ extra_dep='
 cpan/Pod-Simple/pm_to_blib: dist/if/pm_to_blib
 ext/Pod-Functions/pm_to_blib: cpan/Pod-Simple/pm_to_blib cpan/Pod-Escapes/pm_to_blib pod/perlfunc.pod
 cpan/IO-Compress/pm_to_blib: dist/lib/pm_to_blib
-lib/auto/Term/ReadKey/ReadKey.so: lib/auto/Cwd/Cwd.so
 '
 for f in $dynamic_ext; do
     : the dependency named here will never exist
@@ -497,7 +496,7 @@ shextract=`SH_to_target $SH`
 ## In the following dollars and backticks do not need the extra backslash.
 $spitshell >>$Makefile <<!GROK!THIS!
 
-private = preplibrary \$(CONFIGPM) \$(CONFIGPOD) lib/buildcustomize.pl
+private = preplibrary \$(CONFIGPM) \$(CONFIGPOD) git_version.h lib/buildcustomize.pl
 
 # Files to be built with variable substitution before miniperl
 # is available.
@@ -531,17 +530,19 @@ unidatadirs = lib/unicore/To lib/unicore/lib
 
 h1 = EXTERN.h INTERN.h XSUB.h av.h $(CONFIGH) cop.h cv.h dosish.h
 h2 = embed.h form.h gv.h handy.h hv.h hv_func.h keywords.h mg.h op.h opcode.h
-h3 = pad.h patchlevel.h perl.h perlapi.h perly.h pp.h proto.h regcomp.h
+h3 = pad.h patchlevel.h perl.h perlapi.h perly.h pp.h proto.h regcomp.h regcomp_internal.h
 h4 = regexp.h scope.h sv.h unixish.h util.h iperlsys.h thread.h
 h5 = utf8.h warnings.h mydtrace.h op_reg_common.h l1_char_class_tab.h
 h6 = charclass_invlists.h
 h = $(h1) $(h2) $(h3) $(h4) $(h5) $(h6)
 
-c1 = av.c scope.c op.c doop.c doio.c dump.c gv.c hv.c mg.c reentr.c mro_core.c perl.c
-c2 = perly.c pp.c pp_hot.c pp_ctl.c pp_sys.c regcomp.c regexec.c utf8.c sv.c
-c3 = taint.c toke.c util.c deb.c run.c builtin.c universal.c pad.c globals.c keywords.c
+c1 = av.c scope.c op.c peep.c doop.c doio.c dump.c gv.c hv.c mg.c reentr.c mro_core.c perl.c
+c2 = perly.c pp.c pp_hot.c pp_ctl.c pp_sys.c utf8.c sv.c
+c3 = taint.c toke.c util.c deb.c run.c builtin.c universal.c class.c pad.c globals.c keywords.c
 c4 = perlio.c numeric.c mathoms.c locale.c pp_pack.c pp_sort.c caretx.c dquote.c time64.c
-c5 = $(mallocsrc) syscall_emulator.c
+c5 = regcomp.c regcomp_debug.c regcomp_invlist.c regcomp_study.c regcomp_trie.c regexec.c
+c6 = $(mallocsrc)
+c_base  = $(c1) $(c2) $(c3) $(c4) $(c5) $(c6)
 
 !NO!SUBS!
 
@@ -553,17 +554,24 @@ main_only_objs =$main_only_objs
 
 $spitshell >>$Makefile <<'!NO!SUBS!'
 
-c = $(c1) $(c2) $(c3) $(c4) $(c5) miniperlmain.c $(mini_only_src)
+c = $(c_base) miniperlmain.c $(mini_only_src)
 
-obj1 = $(mallocobj) gv$(OBJ_EXT) toke$(OBJ_EXT) perly$(OBJ_EXT) pad$(OBJ_EXT) regcomp$(OBJ_EXT) dump$(OBJ_EXT) util$(OBJ_EXT) mg$(OBJ_EXT) reentr$(OBJ_EXT) mro_core$(OBJ_EXT) keywords$(OBJ_EXT) builtin$(OBJ_EXT)
-obj2 = hv$(OBJ_EXT) av$(OBJ_EXT) run$(OBJ_EXT) pp_hot$(OBJ_EXT) sv$(OBJ_EXT) pp$(OBJ_EXT) scope$(OBJ_EXT) pp_ctl$(OBJ_EXT) pp_sys$(OBJ_EXT)
-obj3 = doop$(OBJ_EXT) doio$(OBJ_EXT) regexec$(OBJ_EXT) utf8$(OBJ_EXT) taint$(OBJ_EXT) deb$(OBJ_EXT) globals$(OBJ_EXT) perlio$(OBJ_EXT) numeric$(OBJ_EXT) mathoms$(OBJ_EXT) locale$(OBJ_EXT) pp_pack$(OBJ_EXT) pp_sort$(OBJ_EXT) caretx$(OBJ_EXT) dquote$(OBJ_EXT) time64$(OBJ_EXT) syscall_emulator$(OBJ_EXT)
+obj1  = $(mallocobj) gv$(OBJ_EXT) toke$(OBJ_EXT) perly$(OBJ_EXT) pad$(OBJ_EXT)
+obj2  = regcomp$(OBJ_EXT) regcomp_debug$(OBJ_EXT) regcomp_invlist$(OBJ_EXT) regcomp_study$(OBJ_EXT) regcomp_trie$(OBJ_EXT)
+obj3  = regexec$(OBJ_EXT) dump$(OBJ_EXT) util$(OBJ_EXT) mg$(OBJ_EXT) reentr$(OBJ_EXT) mro_core$(OBJ_EXT)
+obj4  = keywords$(OBJ_EXT) builtin$(OBJ_EXT) class$(OBJ_EXT)
+obj5  = hv$(OBJ_EXT) av$(OBJ_EXT) run$(OBJ_EXT) pp_hot$(OBJ_EXT) sv$(OBJ_EXT) pp$(OBJ_EXT)
+obj6  = scope$(OBJ_EXT) pp_ctl$(OBJ_EXT) pp_sys$(OBJ_EXT) peep$(OBJ_EXT)
+obj7  = doop$(OBJ_EXT) doio$(OBJ_EXT) utf8$(OBJ_EXT) taint$(OBJ_EXT)
+obj8  = deb$(OBJ_EXT) globals$(OBJ_EXT) perlio$(OBJ_EXT) numeric$(OBJ_EXT) mathoms$(OBJ_EXT)
+obj9  = locale$(OBJ_EXT) pp_pack$(OBJ_EXT) pp_sort$(OBJ_EXT) caretx$(OBJ_EXT) dquote$(OBJ_EXT)
+obj10 = time64$(OBJ_EXT)
 
 # split the objects into 3 exclusive sets: those used by both miniperl and
 # perl, and those used by just one or the other. Doesn't include the
 # actual perl(mini)main.o, nor any dtrace objects.
 
-common_objs    = $(obj1) $(obj2) $(obj3) $(ARCHOBJS)
+common_objs    = $(obj1) $(obj2) $(obj3) $(obj4) $(obj5) $(obj6) $(obj7) $(obj8) $(obj9) $(obj10) $(ARCHOBJS)
 
 miniperl_objs_nodt = $(mini_only_objs) $(common_objs) miniperlmain$(OBJ_EXT)
 perllib_objs_nodt  = $(main_only_objs) $(common_objs)
@@ -614,7 +622,7 @@ esac
 
 $spitshell >>$Makefile <<'!NO!SUBS!'
 
-perltoc_pod_prereqs = extra.pods pod/perl5363delta.pod pod/perlapi.pod pod/perlintern.pod pod/perlmodlib.pod
+perltoc_pod_prereqs = extra.pods pod/perl5382delta.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
 
@@ -654,11 +662,11 @@ lintflags = \
        @echo `$(CCCMD)` $(PLDLFLAGS) $*.c
        @`$(CCCMD)` $(PLDLFLAGS) $*.c
 
-.c.i:  perl.h config.h
+.c.i:
        @echo `$(CCCMDSRC)` -E $*.c \> $*.i
        @`$(CCCMDSRC)` -E $*.c > $*.i
 
-.c.s:  perl.h config.h
+.c.s:
        @echo `$(CCCMDSRC)` -S $*.c
        @`$(CCCMDSRC)` -S $*.c
 
@@ -673,16 +681,15 @@ $(MANIFEST_SRT):  MANIFEST $(PERL_EXE)
 
 .PHONY: all utilities
 
-# OpenBSD uses pre-generated lib/Config_git.pl and git_version.h files
 # Both git_version.h and lib/Config_git.pl are built
 # by make_patchnum.pl.
-#git_version.h: lib/Config_git.pl
-#
-#lib/Config_git.pl: $(MINIPERL_EXE) make_patchnum.pl
-#      $(MINIPERL) make_patchnum.pl
-#
-## make sure that we recompile perl.c if the git version changes
-#perl$(OBJ_EXT): git_version.h
+git_version.h: lib/Config_git.pl
+
+lib/Config_git.pl: $(MINIPERL_EXE) make_patchnum.pl
+       $(MINIPERL) make_patchnum.pl
+
+# make sure that we recompile perl.c if the git version changes
+perl$(OBJ_EXT): git_version.h
 
 !NO!SUBS!
 
@@ -1113,7 +1120,10 @@ $(CONFIGPOD): config.sh $(MINIPERL_EXE) configpm Porting/Glossary lib/Config_git
 unidatafiles $(unidatafiles) pod/perluniprops.pod: uni.data
 
 uni.data: $(MINIPERL_EXE) $(CONFIGPM) lib/unicore/mktables $(nonxs_ext)
-       touch uni.data
+       $(MINIPERL) lib/unicore/mktables -C lib/unicore -P pod -maketest -makenormtest -makelist -p
+#      Commented out so always runs, mktables looks at far more files than we
+#      can in this makefile to decide if needs to run or not
+#      touch uni.data
 
 # $(PERL_EXE) and ext because pod_lib.pl needs Digest::MD5
 # But also this ensures that all extensions are built before we try to scan
@@ -1129,9 +1139,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/perl5363delta.pod: pod/perldelta.pod
-       $(RMS) pod/perl5363delta.pod
-       $(LNS) perldelta.pod pod/perl5363delta.pod
+pod/perl5382delta.pod: pod/perldelta.pod
+       $(RMS) pod/perl5382delta.pod
+       $(LNS) perldelta.pod pod/perl5382delta.pod
 
 extra.pods: $(MINIPERL_EXE)
        -@test ! -f extra.pods || rm -f `cat extra.pods`
@@ -1361,7 +1371,7 @@ _mopup:
        -rm -f *perl.xok
        -rm -f cygwin.c libperl*.def libperl*.dll cygperl*.dll *.exe.stackdump
        -rm -f $(PERL_EXE) $(MINIPERL_EXE) $(LIBPERL) libperl.* microperl
-       -rm -f $(DTRACE_H)
+       -rm -f config.arch config.over $(DTRACE_H)
 
 _cleaner1:
        -cd os2; rm -f Makefile
@@ -1426,10 +1436,10 @@ _cleaner2:
        -rmdir lib/TAP/Formatter lib/TAP lib/Sys/Syslog lib/Sys lib/Sub
        -rmdir lib/Search lib/Scalar lib/Pod/Text lib/Pod/Simple
        -rmdir lib/Pod/Perldoc lib/Pod/Html lib/PerlIO/via lib/PerlIO lib/Perl
-       -rmdir lib/Parse/CPAN lib/Parse lib/Params lib/OpenBSD lib/Net/FTP
-       -rmdir lib/Module/Load lib/Module/CoreList lib/Module lib/Memoize
-       -rmdir lib/Math/BigRat lib/Math/BigInt lib/Math/BigFloat lib/Math
-       -rmdir lib/MIME lib/Locale/Maketext lib/Locale lib/List/Util lib/List
+       -rmdir lib/Parse/CPAN lib/Parse lib/Params lib/Net/FTP lib/Module/Load
+       -rmdir lib/Module/CoreList lib/Module lib/Memoize lib/Math/BigRat
+       -rmdir lib/Math/BigInt lib/Math/BigFloat lib/Math lib/MIME
+       -rmdir lib/Locale/Maketext lib/Locale lib/List/Util lib/List
        -rmdir lib/JSON/PP lib/JSON lib/IPC lib/IO/Uncompress/Adapter
        -rmdir lib/IO/Uncompress lib/IO/Socket lib/IO/Compress/Zlib
        -rmdir lib/IO/Compress/Zip lib/IO/Compress/Gzip lib/IO/Compress/Base
@@ -1632,7 +1642,7 @@ $spitshell >>$Makefile <<'!NO!SUBS!'
 
 # minitest can't depend on lib/Config.pm because that might be where miniperl
 # is crashing.
-minitest_prep:
+minitest_prep: $(MINIPERL_EXE)
        -@test -f lib/Config.pm || $(MAKE) lib/Config.pm $(unidatafiles)
        @echo " "
        @echo "You may see some irrelevant test failures if you have been unable"
@@ -1642,10 +1652,10 @@ minitest_prep:
 
 MINITEST_TESTS = base/*.t comp/*.t cmd/*.t run/*.t io/*.t re/*.t opbasic/*.t op/*.t uni/*.t perf/*.t
 
-minitest: $(MINIPERL_EXE) minitest_prep
+minitest: minitest_prep
        cd t && $(RUN_PERL) TEST $(MINITEST_TESTS) <$(devtty)
 
-minitest-notty minitest_notty: $(MINIPERL_EXE) minitest_prep
+minitest-notty minitest_notty: minitest_prep
        cd t && PERL_SKIP_TTY_TEST=1 $(RUN_PERL) TEST $(MINITEST_TESTS)
 
 # Test via harness
@@ -1657,7 +1667,7 @@ test_harness_notty: test_prep
        HARNESS_NOTTY=1 TESTFILE=harness $(RUN_TESTS) choose
 
 test_reonly test-reonly: test_prep_reonly
-       TEST_ARGS='re/*.t ext/re/t/*.t' TESTFILE=harness $(RUN_TESTS) choose
+       TEST_ARGS='re/*.t ../ext/re/t/*.t' PERL_TEST_HARNESS_ASAP=1 TESTFILE=harness $(RUN_TESTS) choose
 
 
 # Porting tests (well-formedness of pod, manifest, etc)
@@ -1721,8 +1731,8 @@ distcheck: FORCE
 
 .PHONY: ctags
 
-TAGS: $(c1) $(c2) $(c3) $(c4) $(c5) $(h)
-       etags $(c1) $(c2) $(c3) $(c4) $(c5) $(h)
+TAGS: $(c_base) $(h)
+       etags $(c_base) $(h)
 !NO!SUBS!
 
 $spitshell >>$Makefile <<!GROK!THIS!
index dabebcd..75f9333 100644 (file)
@@ -1,6 +1,6 @@
 LD = $(CC)
 CCFLAGS = -c
-DEFINES = -DPERL_CORE -DPERL_MICRO -DPERL_USE_SAFE_PUTENV -DNO_MATHOMS
+DEFINES = -DPERL_CORE -DPERL_MICRO -DNO_MATHOMS
 OPTIMIZE = 
 CFLAGS = $(DEFINES) $(OPTIMIZE)
 LDFLAGS = 
@@ -18,7 +18,8 @@ O = uav$(_O) udeb$(_O) udoio$(_O) udoop$(_O) udquote$(_O) udump$(_O) \
        umg$(_O) uperlmain$(_O) uop$(_O) ureentr$(_O) \
        upad$(_O) uperl$(_O) uperlio$(_O) uperly$(_O) upp$(_O) \
        upp_ctl$(_O) upp_hot$(_O) upp_sys$(_O) upp_pack$(_O) upp_sort$(_O) \
-       uregcomp$(_O) uregexec$(_O) urun$(_O) \
+       uregcomp$(_O) uregcomp_debug$(_O) uregcomp_invlist$(_O) \
+       uregcomp_study$(_O) uregcomp_trie$(_O) uregexec$(_O) urun$(_O) \
        uscope$(_O) usv$(_O) utaint$(_O) utime64$(_O) utoke$(_O) \
        unumeric$(_O) ulocale$(_O) umathoms$(_O) \
        uuniversal$(_O) uutf8$(_O) uutil$(_O) ukeywords$(_O)
@@ -138,7 +139,19 @@ upp_pack$(_O):     $(HE) pp_pack.c
 upp_sort$(_O): $(HE) pp_sort.c
        $(CC) $(CCFLAGS) -o $@ $(CFLAGS) pp_sort.c
 
-uregcomp$(_O): $(HE) regcomp.c regcomp.h regnodes.h INTERN.h
+uregcomp$(_O): $(HE) regcomp.c regcomp_internal.h regcomp.h regnodes.h INTERN.h
+       $(CC) $(CCFLAGS) -o $@ $(CFLAGS) regcomp.c
+
+uregcomp_debug$(_O):   $(HE) regcomp_debug.c regcomp_internal.h regcomp.h regnodes.h INTERN.h
+       $(CC) $(CCFLAGS) -o $@ $(CFLAGS) regcomp.c
+
+uregcomp_invlist$(_O): $(HE) regcomp_invlist.c regcomp_internal.h regcomp.h regnodes.h INTERN.h
+       $(CC) $(CCFLAGS) -o $@ $(CFLAGS) regcomp.c
+
+uregcomp_study$(_O):   $(HE) regcomp_study.c regcomp_internal.h regcomp.h regnodes.h INTERN.h
+       $(CC) $(CCFLAGS) -o $@ $(CFLAGS) regcomp.c
+
+uregcomp_trie$(_O):    $(HE) regcomp_trie.c regcomp_internal.h regcomp.h regnodes.h INTERN.h
        $(CC) $(CCFLAGS) -o $@ $(CFLAGS) regcomp.c
 
 uregexec$(_O): $(HE) regexec.c regcomp.h regnodes.h
index 2dcb565..f38aa14 100644 (file)
@@ -493,6 +493,10 @@ d_attribute_unused (d_attribut.U):
        and arguments may not always be used, and to not throw warnings
        if they don't get used.
 
+d_attribute_visibility (d_attribut.U):
+       This variable conditionally defines the HASATTRIBUTE_VISIBILITY symbol,
+       and indicates different GCC attribute visibility
+
 d_attribute_warn_unused_result (d_attribut.U):
        This variable conditionally defines
        HASATTRIBUTE_WARN_UNUSED_RESULT, which indicates that the C
@@ -2279,6 +2283,10 @@ d_setegid (d_setegid.U):
        indicates to the C program that the setegid() routine is available
        to change the effective gid of the current program.
 
+d_setenv (d_setenv.U):
+       This variable conditionally defines the HAS_SETENV symbol, which
+       indicates to the C program that the setenv routine is available.
+
 d_seteuid (d_seteuid.U):
        This variable conditionally defines the HAS_SETEUID symbol, which
        indicates to the C program that the seteuid() routine is available
@@ -3501,6 +3509,10 @@ i16size (perlxv.U):
 i16type (perlxv.U):
        This variable contains the C type used for Perl's I16.
 
+i32dformat (perlx32f.U):
+       This variable contains the format string used for printing
+       a Perl I32 as a signed decimal integer.
+
 i32size (perlxv.U):
        This variable is the size of an I32 in bytes.
 
@@ -3795,6 +3807,10 @@ i_sysstatvfs (i_sysstatvfs.U):
        This variable conditionally defines the I_SYSSTATVFS symbol,
        and indicates whether a C program should include <sys/statvfs.h>.
 
+i_syssyscall (i_syssyscall.U):
+       This variable conditionally defines the I_SYS_SYSCALL symbol,
+       and indicates whether a C program should include <sys/syscall.h>.
+
 i_systime (i_time.U):
        This variable conditionally defines I_SYS_TIME, which indicates
        to the C program that it should include <sys/time.h>.
@@ -5518,12 +5534,28 @@ u16size (perlxv.U):
 u16type (perlxv.U):
        This variable contains the C type used for Perl's U16.
 
+u32oformat (perlx32f.U):
+       This variable contains the format string used for printing
+       a Perl U32 as an unsigned octal integer.
+
 u32size (perlxv.U):
        This variable is the size of an U32 in bytes.
 
 u32type (perlxv.U):
        This variable contains the C type used for Perl's U32.
 
+u32uformat (perlx32f.U):
+       This variable contains the format string used for printing
+       a Perl U32 as an unsigned decimal integer.
+
+u32xformat (perlx32f.U):
+       This variable contains the format string used for printing
+       a Perl U32 as an unsigned hexadecimal integer in lowercase abcdef.
+
+u32XUformat (perlx32f.U):
+       This variable contains the format string used for printing
+       a Perl U32 as an unsigned hexadecimal integer in uppercase ABCDEF.
+
 u64size (perlxv.U):
        This variable is the size of an U64 in bytes.
 
index 30c3212..825aa50 100644 (file)
@@ -142,7 +142,7 @@ use File::Glob qw(:case);
     },
 
     'autodie' => {
-        'DISTRIBUTION' => 'TODDR/autodie-2.34.tar.gz',
+        'DISTRIBUTION' => 'TODDR/autodie-2.36.tar.gz',
         'FILES'        => q[cpan/autodie],
         'EXCLUDED'     => [
             qr{benchmarks},
@@ -172,6 +172,7 @@ use File::Glob qw(:case);
         'DISTRIBUTION' => 'SMUELLER/AutoLoader-5.74.tar.gz',
         'FILES'        => q[cpan/AutoLoader],
         'EXCLUDED'     => ['t/00pod.t'],
+        'CUSTOMIZED'   => ['t/02AutoSplit.t'],
     },
 
     'autouse' => {
@@ -186,7 +187,7 @@ use File::Glob qw(:case);
     },
 
     'bignum' => {
-        'DISTRIBUTION' => 'PJACKLAM/bignum-0.65.tar.gz',
+        'DISTRIBUTION' => 'PJACKLAM/bignum-0.66.tar.gz',
         'FILES'        => q[cpan/bignum],
         'EXCLUDED'     => [
             qr{^xt/},
@@ -204,7 +205,7 @@ use File::Glob qw(:case);
     },
 
     'Compress::Raw::Bzip2' => {
-        'DISTRIBUTION' => 'PMQS/Compress-Raw-Bzip2-2.103.tar.gz',
+        'DISTRIBUTION' => 'PMQS/Compress-Raw-Bzip2-2.204.tar.gz',
         'FILES'        => q[cpan/Compress-Raw-Bzip2],
         'EXCLUDED'     => [
             qr{^t/Test/},
@@ -213,10 +214,15 @@ use File::Glob qw(:case);
             'bzip2-src/bzip2-cpp.patch',
             'bzip2-src/bzip2-unsigned.patch',
         ],
+        'CUSTOMIZED'   => [
+            # https://github.com/pmqs/Compress-Raw-Bzip2/issues/11
+            'Bzip2.xs',
+            'lib/Compress/Raw/Bzip.pm'
+        ],
     },
 
     'Compress::Raw::Zlib' => {
-        'DISTRIBUTION' => 'PMQS/Compress-Raw-Zlib-2.105.tar.gz',
+        'DISTRIBUTION' => 'PMQS/Compress-Raw-Zlib-2.204.tar.gz',
         'FILES'    => q[cpan/Compress-Raw-Zlib],
         'EXCLUDED' => [
             qr{^examples/},
@@ -226,10 +232,16 @@ use File::Glob qw(:case);
                 t/99pod.t
                 ),
         ],
+        'CUSTOMIZED' => [
+            # https://github.com/pmqs/Compress-Raw-Zlib/issues/23
+            'lib/Compress/Raw/Zlib.pm',
+            'Zlib.xs'
+        ],
     },
 
     'Config::Perl::V' => {
-        'DISTRIBUTION' => 'HMBRAND/Config-Perl-V-0.33.tgz',
+        'DISTRIBUTION' => 'HMBRAND/Config-Perl-V-0.36.tgz',
+        'SYNCINFO'     => 'yorton on Sat Mar  4 10:43:06 2023',
         'FILES'        => q[cpan/Config-Perl-V],
         'EXCLUDED'     => [qw(
                examples/show-v.pl
@@ -250,7 +262,7 @@ use File::Glob qw(:case);
     },
 
     'CPAN' => {
-        'DISTRIBUTION' => 'ANDK/CPAN-2.33-TRIAL.tar.gz',
+        'DISTRIBUTION' => 'ANDK/CPAN-2.36.tar.gz',
         'FILES'        => q[cpan/CPAN],
         'EXCLUDED'     => [
             qr{^distroprefs/},
@@ -330,7 +342,7 @@ use File::Glob qw(:case);
     },
 
     'DB_File' => {
-        'DISTRIBUTION' => 'PMQS/DB_File-1.857.tar.gz',
+        'DISTRIBUTION' => 'PMQS/DB_File-1.858.tar.gz',
         'FILES'        => q[cpan/DB_File],
         'EXCLUDED'     => [
             qr{^patches/},
@@ -367,10 +379,15 @@ use File::Glob qw(:case);
         'DISTRIBUTION' => 'TODDR/Digest-MD5-2.58.tar.gz',
         'FILES'        => q[cpan/Digest-MD5],
         'EXCLUDED'     => [ 'rfc1321.txt', 'bin/md5sum.pl' ],
+        'CUSTOMIZED'   => [
+            # https://github.com/Dual-Life/digest-md5/pull/24
+            'MD5.pm',
+            'MD5.xs'
+        ],
     },
 
     'Digest::SHA' => {
-        'DISTRIBUTION' => 'MSHELOR/Digest-SHA-6.02.tar.gz',
+        'DISTRIBUTION' => 'MSHELOR/Digest-SHA-6.04.tar.gz',
         'FILES'        => q[cpan/Digest-SHA],
         'EXCLUDED'     => [
             qw( t/pod.t
@@ -387,7 +404,7 @@ use File::Glob qw(:case);
     },
 
     'Encode' => {
-        'DISTRIBUTION' => 'DANKOGAI/Encode-3.17.tar.gz',
+        'DISTRIBUTION' => 'DANKOGAI/Encode-3.19.tar.gz',
         'FILES'        => q[cpan/Encode],
         'EXCLUDED'     => [
             qw( t/whatwg-aliases.json
@@ -412,13 +429,13 @@ use File::Glob qw(:case);
     },
 
     'experimental' => {
-        'DISTRIBUTION' => 'LEONT/experimental-0.027.tar.gz',
+        'DISTRIBUTION' => 'LEONT/experimental-0.031.tar.gz',
         'FILES'        => q[cpan/experimental],
         'EXCLUDED'     => [qr{^xt/}],
     },
 
     'Exporter' => {
-        'DISTRIBUTION' => 'TODDR/Exporter-5.74.tar.gz',
+        'DISTRIBUTION' => 'TODDR/Exporter-5.77.tar.gz',
         'FILES'        => q[dist/Exporter],
         'EXCLUDED' => [
             qw( t/pod.t
@@ -457,7 +474,7 @@ use File::Glob qw(:case);
     },
 
     'ExtUtils::Install' => {
-        'DISTRIBUTION' => 'BINGOS/ExtUtils-Install-2.20.tar.gz',
+        'DISTRIBUTION' => 'BINGOS/ExtUtils-Install-2.22.tar.gz',
         'FILES'        => q[cpan/ExtUtils-Install],
         'EXCLUDED'     => [
             qw( t/lib/Test/Builder.pm
@@ -471,7 +488,8 @@ use File::Glob qw(:case);
     },
 
     'ExtUtils::MakeMaker' => {
-        'DISTRIBUTION' => 'BINGOS/ExtUtils-MakeMaker-7.64.tar.gz',
+        'DISTRIBUTION' => 'BINGOS/ExtUtils-MakeMaker-7.70.tar.gz',
+        'SYNCINFO'     => 'yorton on Sun Mar 26 16:20:23 2023',
         'FILES'        => q[cpan/ExtUtils-MakeMaker],
         'EXCLUDED'     => [
             qr{^t/lib/Test/},
@@ -486,7 +504,7 @@ use File::Glob qw(:case);
     },
 
     'ExtUtils::PL2Bat' => {
-        'DISTRIBUTION' => 'LEONT/ExtUtils-PL2Bat-0.004.tar.gz',
+        'DISTRIBUTION' => 'LEONT/ExtUtils-PL2Bat-0.005.tar.gz',
         'FILES'        => q[cpan/ExtUtils-PL2Bat],
         'EXCLUDED'     => [
             't/00-compile.t',
@@ -544,7 +562,7 @@ use File::Glob qw(:case);
     },
 
     'Filter::Util::Call' => {
-        'DISTRIBUTION' => 'RURBAN/Filter-1.60.tar.gz',
+        'DISTRIBUTION' => 'RURBAN/Filter-1.64.tar.gz',
         'FILES'        => q[cpan/Filter-Util-Call
                  pod/perlfilter.pod
                 ],
@@ -555,6 +573,8 @@ use File::Glob qw(:case);
             qr{^lib/Filter/},
             qr{^tee/},
             qw( .appveyor.yml
+                .cirrus.yml
+                .github/workflows/testsuite.yml
                 .whitesource
                 Call/Makefile.PL
                 Call/ppport.h
@@ -587,12 +607,12 @@ use File::Glob qw(:case);
     },
 
     'FindBin' => {
-        'DISTRIBUTION' => 'TODDR/FindBin-1.52.tar.gz',
+        'DISTRIBUTION' => 'TODDR/FindBin-1.53.tar.gz',
         'FILES'        => q[dist/FindBin],
     },
 
     'Getopt::Long' => {
-        'DISTRIBUTION' => 'JV/Getopt-Long-2.52.tar.gz',
+        'DISTRIBUTION' => 'JV/Getopt-Long-2.54.tar.gz',
         'FILES'        => q[cpan/Getopt-Long],
         'EXCLUDED'     => [
             qr{^examples/},
@@ -603,9 +623,10 @@ use File::Glob qw(:case);
     },
 
     'HTTP::Tiny' => {
-        'DISTRIBUTION' => 'DAGOLDEN/HTTP-Tiny-0.080.tar.gz',
+        'DISTRIBUTION' => 'DAGOLDEN/HTTP-Tiny-0.086.tar.gz',
         'FILES'        => q[cpan/HTTP-Tiny],
         'EXCLUDED'     => [
+            'corpus/snake-oil.crt', # only used by 210_live_ssl.t
             't/00-report-prereqs.t',
             't/00-report-prereqs.dd',
             't/200_live.t',
@@ -632,13 +653,13 @@ use File::Glob qw(:case);
     },
 
     'IO' => {
-        'DISTRIBUTION' => 'TODDR/IO-1.50.tar.gz',
+        'DISTRIBUTION' => 'TODDR/IO-1.51.tar.gz',
         'FILES'        => q[dist/IO],
         'EXCLUDED'     => ['t/test.pl'],
     },
 
     'IO-Compress' => {
-        'DISTRIBUTION' => 'PMQS/IO-Compress-2.106.tar.gz',
+        'DISTRIBUTION' => 'PMQS/IO-Compress-2.204.tar.gz',
         'MAIN_MODULE'  => 'IO::Compress::Base',
         'FILES'        => q[cpan/IO-Compress],
         'EXCLUDED'     => [
@@ -657,10 +678,14 @@ use File::Glob qw(:case);
         'EXCLUDED'     => [
             qr{^examples/},
         ],
+        'CUSTOMIZED' => [
+            # https://rt.cpan.org/Ticket/Display.html?id=148293
+            'lib/IO/Socket/IP.pm'
+        ],
     },
 
     'IO::Zlib' => {
-        'DISTRIBUTION' => 'TOMHUGHES/IO-Zlib-1.11.tar.gz',
+        'DISTRIBUTION' => 'TOMHUGHES/IO-Zlib-1.14.tar.gz',
         'FILES'        => q[cpan/IO-Zlib],
     },
 
@@ -680,7 +705,7 @@ use File::Glob qw(:case);
     },
 
     'JSON::PP' => {
-        'DISTRIBUTION' => 'ISHIGAKI/JSON-PP-4.07.tar.gz',
+        'DISTRIBUTION' => 'ISHIGAKI/JSON-PP-4.16.tar.gz',
         'FILES'        => q[cpan/JSON-PP],
     },
 
@@ -695,7 +720,8 @@ use File::Glob qw(:case);
     },
 
     'libnet' => {
-        'DISTRIBUTION' => 'SHAY/libnet-3.13.tar.gz',
+        'DISTRIBUTION' => 'SHAY/libnet-3.15.tar.gz',
+        'SYNCINFO'     => 'yorton on Mon Mar 20 20:48:38 2023',
         'MAIN_MODULE'  => 'Net::Cmd',
         'FILES'        => q[cpan/libnet],
         'EXCLUDED'     => [
@@ -708,27 +734,10 @@ use File::Glob qw(:case);
             qr(^demos/),
             qr(^t/external/),
         ],
-         # https://github.com/steve-m-hay/perl-libnet/pull/45
-        'CUSTOMIZED' => [
-            'lib/Net/Cmd.pm',
-            'lib/Net/Config.pm',
-            'lib/Net/Domain.pm',
-            'lib/Net/FTP.pm',
-            'lib/Net/FTP/A.pm',
-            'lib/Net/FTP/E.pm',
-            'lib/Net/FTP/I.pm',
-            'lib/Net/FTP/L.pm',
-            'lib/Net/FTP/dataconn.pm',
-            'lib/Net/NNTP.pm',
-            'lib/Net/Netrc.pm',
-            'lib/Net/POP3.pm',
-            'lib/Net/SMTP.pm',
-            'lib/Net/Time.pm',
-        ],
     },
 
     'Locale::Maketext' => {
-        'DISTRIBUTION' => 'TODDR/Locale-Maketext-1.29.tar.gz',
+        'DISTRIBUTION' => 'TODDR/Locale-Maketext-1.32.tar.gz',
         'FILES'        => q[dist/Locale-Maketext],
         'EXCLUDED'     => [
             qw(
@@ -749,7 +758,7 @@ use File::Glob qw(:case);
     },
 
     'Math::BigInt' => {
-        'DISTRIBUTION' => 'PJACKLAM/Math-BigInt-1.999830.tar.gz',
+        'DISTRIBUTION' => 'PJACKLAM/Math-BigInt-1.999837.tar.gz',
         'FILES'        => q[cpan/Math-BigInt],
         'EXCLUDED'     => [
             qr{^xt/},
@@ -763,7 +772,7 @@ use File::Glob qw(:case);
     },
 
     'Math::BigInt::FastCalc' => {
-        'DISTRIBUTION' => 'PJACKLAM/Math-BigInt-FastCalc-0.5012.tar.gz',
+        'DISTRIBUTION' => 'PJACKLAM/Math-BigInt-FastCalc-0.5013.tar.gz',
         'FILES'        => q[cpan/Math-BigInt-FastCalc],
         'EXCLUDED'     => [
             qr{^inc/},
@@ -788,7 +797,7 @@ use File::Glob qw(:case);
     },
 
     'Math::BigRat' => {
-        'DISTRIBUTION' => 'PJACKLAM/Math-BigRat-0.2621.tar.gz',
+        'DISTRIBUTION' => 'PJACKLAM/Math-BigRat-0.2624.tar.gz',
         'FILES'        => q[cpan/Math-BigRat],
         'EXCLUDED'     => [
             qr{^xt/},
@@ -803,13 +812,7 @@ use File::Glob qw(:case);
 
     'Math::Complex' => {
         'DISTRIBUTION' => 'ZEFRAM/Math-Complex-1.59.tar.gz',
-        'FILES'        => q[cpan/Math-Complex],
-        'CUSTOMIZED'   => [
-            'lib/Math/Complex.pm', # CPAN RT 118467
-            't/Complex.t',         # CPAN RT 118467
-            't/Trig.t',            # CPAN RT 118467
-            't/underbar.t',
-        ],
+        'FILES'        => q[dist/Math-Complex],
         'EXCLUDED'     => [
             qw( t/pod.t
                 t/pod-coverage.t
@@ -818,29 +821,25 @@ use File::Glob qw(:case);
     },
 
     'Memoize' => {
-        'DISTRIBUTION' => 'MJD/Memoize-1.03.tgz',
+        'DISTRIBUTION' => 'ARISTOTLE/Memoize-1.16.tar.gz',
         'FILES'        => q[cpan/Memoize],
-        'EXCLUDED'     => ['article.html'],
-        'CUSTOMIZED'   => [
-            # CVE-2016-1238
-            qw( Memoize.pm ),
-
-            # CPAN RT 108382
-            qw( t/expmod_t.t t/speed.t ),
-
-            # CPAN RT 139736
-            qw( t/errors.t t/tie_gdbm.t ),
-        ],
+        'EXCLUDED'     => [ qr{^inc/} ],
     },
 
     'MIME::Base64' => {
         'DISTRIBUTION' => 'CAPOEIRAB/MIME-Base64-3.16.tar.gz',
         'FILES'        => q[cpan/MIME-Base64],
         'EXCLUDED'     => [ qr{^xt/}, 'benchmark', 'benchmark-qp', qr{^t/00-report-prereqs} ],
+        'CUSTOMIZED'   => [
+            # https://github.com/Dual-Life/mime-base64/pull/17
+            'Base64.xs',
+            'lib/MIME/Base64.pm'
+        ],
     },
 
     'Module::CoreList' => {
-        'DISTRIBUTION' => 'BINGOS/Module-CoreList-5.20220320.tar.gz',
+        'DISTRIBUTION' => 'BINGOS/Module-CoreList-5.20230320.tar.gz',
+        'SYNCINFO'     => 'yorton on Tue Mar 21 11:46:02 2023',
         'FILES'        => q[dist/Module-CoreList],
     },
 
@@ -871,7 +870,7 @@ use File::Glob qw(:case);
     },
 
     'Net::Ping' => {
-        'DISTRIBUTION' => 'RURBAN/Net-Ping-2.74.tar.gz',
+        'DISTRIBUTION' => 'RURBAN/Net-Ping-2.75.tar.gz',
         'FILES'        => q[dist/Net-Ping],
         'EXCLUDED'     => [
             qr{^\.[awc]},
@@ -885,16 +884,6 @@ use File::Glob qw(:case);
             qw(t/appveyor-test.bat),
 
         ],
-        'CUSTOMIZED' => [
-            qw{
-                t/000_load.t
-                t/001_new.t
-                t/010_pingecho.t
-                t/450_service.t
-                t/500_ping_icmp.t
-                t/501_ping_icmpv6.t
-            }
-        ],
     },
 
     'NEXT' => {
@@ -909,7 +898,7 @@ use File::Glob qw(:case);
     },
 
     'parent' => {
-        'DISTRIBUTION' => 'CORION/parent-0.238.tar.gz',
+        'DISTRIBUTION' => 'CORION/parent-0.241.tar.gz',
         'FILES'        => q[cpan/parent],
         'EXCLUDED'     => [
             qr{^xt}
@@ -939,12 +928,12 @@ use File::Glob qw(:case);
     },
 
     'PerlIO::via::QuotedPrint' => {
-        'DISTRIBUTION' => 'SHAY/PerlIO-via-QuotedPrint-0.09.tar.gz',
+        'DISTRIBUTION' => 'SHAY/PerlIO-via-QuotedPrint-0.10.tar.gz',
         'FILES'        => q[cpan/PerlIO-via-QuotedPrint],
     },
 
     'Pod::Checker' => {
-        'DISTRIBUTION' => 'MAREKR/Pod-Checker-1.74.tar.gz',
+        'DISTRIBUTION' => 'MAREKR/Pod-Checker-1.75.tar.gz',
         'FILES'        => q[cpan/Pod-Checker],
     },
 
@@ -987,7 +976,7 @@ use File::Glob qw(:case);
     },
 
     'Pod::Usage' => {
-        'DISTRIBUTION' => 'ATOOMIC/Pod-Usage-2.01.tar.gz',
+        'DISTRIBUTION' => 'MAREKR/Pod-Usage-2.03.tar.gz',
         'FILES'        => q[cpan/Pod-Usage],
         'EXCLUDED' => [
             qr{^t/00-},
@@ -996,19 +985,12 @@ use File::Glob qw(:case);
     },
 
     'podlators' => {
-        'DISTRIBUTION' => 'RRA/podlators-4.14.tar.gz',
+        'DISTRIBUTION' => 'RRA/podlators-5.01.tar.gz',
         'MAIN_MODULE'  => 'Pod::Man',
         'FILES'        => q[cpan/podlators pod/perlpodstyle.pod],
         'EXCLUDED'     => [
-            qr{^docs/metadata/},
-        ],
-
-        # https://github.com/rra/podlators/pull/15
-        'CUSTOMIZED' => [
-            't/general/basic.t',
-            't/man/empty.t',
-            't/man/no-encode.t',
-            't/text/invalid.t',
+            qr{^\.github/dependabot\.yml},
+            qr{^\.github/workflows/build\.yaml},
         ],
 
         'MAP' => {
@@ -1024,7 +1006,7 @@ use File::Glob qw(:case);
     },
 
     'Scalar::Util' => {
-        'DISTRIBUTION' => 'PEVANS/Scalar-List-Utils-1.62.tar.gz',
+        'DISTRIBUTION' => 'PEVANS/Scalar-List-Utils-1.63.tar.gz',
         'FILES'        => q[cpan/Scalar-List-Utils],
     },
 
@@ -1040,14 +1022,8 @@ use File::Glob qw(:case);
     },
 
     'Socket' => {
-        'DISTRIBUTION' => 'PEVANS/Socket-2.032.tar.gz',
+        'DISTRIBUTION' => 'PEVANS/Socket-2.036.tar.gz',
         'FILES'        => q[cpan/Socket],
-        # https://rt.cpan.org/Ticket/Display.html?id=142470&results=b81893fab36c7e48a07b4b763c03731a
-        # maybe others
-        'CUSTOMIZED' => [
-            'Socket.pm',
-            'Socket.xs',
-        ],
     },
 
     'Storable' => {
@@ -1089,7 +1065,7 @@ use File::Glob qw(:case);
     },
 
     'Term::Cap' => {
-        'DISTRIBUTION' => 'JSTOWE/Term-Cap-1.17.tar.gz',
+        'DISTRIBUTION' => 'JSTOWE/Term-Cap-1.18.tar.gz',
         'FILES'        => q[cpan/Term-Cap],
     },
 
@@ -1130,7 +1106,9 @@ use File::Glob qw(:case);
     },
 
     'Test::Simple' => {
-        'DISTRIBUTION' => 'EXODIST/Test-Simple-1.302190.tar.gz',
+        'DISTRIBUTION' => 'EXODIST/Test-Simple-1.302194.tar.gz',
+        'SYNCINFO'     => 'yorton on Tue Mar 14 13:43:38 2023',
+        'SYNCINFO'     => 'yorton on Mon Mar  6 19:16:42 2023',
         'FILES'        => q[cpan/Test-Simple],
         'EXCLUDED'     => [
             qr{^examples/},
@@ -1150,14 +1128,8 @@ use File::Glob qw(:case);
     },
 
     'Text::Balanced' => {
-        'DISTRIBUTION' => 'SHAY/Text-Balanced-2.04.tar.gz',
+        'DISTRIBUTION' => 'SHAY/Text-Balanced-2.06.tar.gz',
         'FILES'        => q[cpan/Text-Balanced],
-        'EXCLUDED'     => [
-            qw( t/97_meta.t
-                t/98_pod.t
-                t/99_pmv.t
-                ),
-        ],
     },
 
     'Text::ParseWords' => {
@@ -1215,7 +1187,6 @@ use File::Glob qw(:case);
             qr{^examples/},
             qw( t/pod.t
                 t/test.pl
-                threads.h
                 ),
         ],
     },
@@ -1225,7 +1196,6 @@ use File::Glob qw(:case);
         'FILES'        => q[dist/threads-shared],
         'EXCLUDED'     => [
             qw( examples/class.pl
-                shared.h
                 t/pod.t
                 t/test.pl
                 ),
@@ -1233,7 +1203,7 @@ use File::Glob qw(:case);
     },
 
     'Tie::File' => {
-        'DISTRIBUTION' => 'TODDR/Tie-File-1.05.tar.gz',
+        'DISTRIBUTION' => 'TODDR/Tie-File-1.07.tar.gz',
         'FILES'        => q[dist/Tie-File],
     },
 
@@ -1271,6 +1241,11 @@ use File::Glob qw(:case);
         'DISTRIBUTION' => 'ESAYM/Time-Piece-1.3401.tar.gz',
         'FILES'        => q[cpan/Time-Piece],
         'EXCLUDED'     => [ qw[reverse_deps.txt] ],
+        'CUSTOMIZED'   => [
+            # https://github.com/Dual-Life/Time-Piece/pull/64
+            'Piece.pm',
+            'Piece.xs'
+         ],
     },
 
     'Unicode::Collate' => {
@@ -1316,7 +1291,9 @@ use File::Glob qw(:case);
         # to delete an entire block out of lib/version.pm, since that code is
         # only necessary with the CPAN release.
         'CUSTOMIZED'   => [
-            'lib/version.pm'
+            'lib/version.pm',
+
+            't/07locale.t'
          ],
 
         'MAP' => {
@@ -1335,7 +1312,7 @@ use File::Glob qw(:case);
     },
 
     'Win32' => {
-        'DISTRIBUTION' => "JDB/Win32-0.58.tar.gz",
+        'DISTRIBUTION' => "JDB/Win32-0.59.tar.gz",
         'FILES'        => q[cpan/Win32],
     },
 
@@ -1468,6 +1445,7 @@ use File::Glob qw(:case);
                 lib/Time/tm.pm
                 lib/UNIVERSAL.pm
                 lib/Unicode/README
+                lib/Unicode/testnorm.t
                 lib/Unicode/UCD.{pm,t}
                 lib/User/grent.{pm,t}
                 lib/User/pwent.{pm,t}
@@ -1507,14 +1485,18 @@ use File::Glob qw(:case);
                 lib/vmsish.{pm,t}
                 ],
     },
-    'openbsd' => {
-        'FILES'      => q[lib/Config_git.pl],
-    },
 );
 
+
 # legacy CPAN flag
-for ( values %Modules ) {
-    $_->{CPAN} = !!$_->{DISTRIBUTION};
+for my $mod_name ( keys %Modules ) {
+    my $data = $Modules{$mod_name};
+    $data->{CPAN} = !!$data->{DISTRIBUTION};
+    my (@files)= split /\s+/, $data->{FILES};
+    if (@files and $files[0]=~s!^(cpan|dist)/!!) {
+        $DistName{$files[0]} = $mod_name;
+        $DistName{"$1/$files[0]"} = $mod_name;
+    }
 }
 
 # legacy UPSTREAM flag
index 0f22b5e..05f10ad 100644 (file)
@@ -37,12 +37,6 @@ number in various files within the perl source.
 
 Check source code for ANSI-C violations.
 
-=head2 F<checkAUTHORS.pl>
-
-Used by F<t/porting/authors.t> to ensure the F<AUTHORS> list is up to
-date. See also L<< /"F<updateAUTHORS.pl>" >> for a way to automatically
-fix issues found by this tool.
-
 =head2 F<checkcfguse.pl>
 
 Check where the symbols defined in the various F<config.sh>-clones
@@ -146,6 +140,11 @@ The charter of the Perl Documentation Team
 
 List of Perl release epigraphs.
 
+=head2 F<exclude_contrib.txt>
+
+List of base 64 encoded SHA256 digests of C<< "name <email>" >> data
+which should be ignored by F<updateAUTHORS.pl>.
+
 =head2 F<exec-bit.txt>
 
 This file contains a list of files that F<makerel> will ensure get an
@@ -360,6 +359,11 @@ and case are ignored, as explained in L<perldiag>.
 
 Script to help out with syncing cpan distros.
 
+=head2 F<test-dist-modules.pl>
+
+Test modules in F<dist/> against the perl in C<PATH>.  Used in the
+github workflow to test against older perls.
+
 =head2 F<timecheck2.c>
 
 A little program to test the limits of your system's time functions. See
@@ -381,10 +385,15 @@ any previous attempts.
 =head2 F<updateAUTHORS.pl>
 
 This script will automatically update AUTHORS and create .mailmap entries
-based on the git commit log history. If F<checkAUTHORS.pl> complains
+based on the git commit log history. If F<t/porting/authors.t> complains
 during testing you should run this. It will automatically fix most if not
 all AUTHORS related test fails.
 
+=head2 F<updateAUTHORS.pm>
+
+The class used by F<updateAUTHORS.pl> to do its business. Package name
+C<Porting::updateAUTHORS>.
+
 =head2 F<valgrindpp.pl>
 
 A post-processor for C<make test.valgrind>.  F<valgrindpp.pl> is a
@@ -398,4 +407,3 @@ leaks.
 Guide for Vote Administrators for running Steering Council elections.
 
 =cut
-
index 1d730f6..3773835 100755 (executable)
@@ -902,22 +902,22 @@ sub parse_cachegrind {
             die "Error: while executing $id:\n"
               . "unexpected code or cachegrind output:\n$_\n";
         }
-        if (/I   refs:\s+([\d,]+)/) {
+        if (/I\s+refs:\s+([\d,]+)/) {
             $res{Ir} = $1;
         }
-        elsif (/I1  misses:\s+([\d,]+)/) {
+        elsif (/I1\s+misses:\s+([\d,]+)/) {
             $res{Ir_m1} = $1;
         }
-        elsif (/LLi misses:\s+([\d,]+)/) {
+        elsif (/LLi\s+misses:\s+([\d,]+)/) {
             $res{Ir_mm} = $1;
         }
-        elsif (/D   refs:\s+.*?([\d,]+) rd .*?([\d,]+) wr/) {
+        elsif (/D\s+refs:\s+.*?([\d,]+) rd .*?([\d,]+) wr/) {
             @res{qw(Dr Dw)} = ($1,$2);
         }
-        elsif (/D1  misses:\s+.*?([\d,]+) rd .*?([\d,]+) wr/) {
+        elsif (/D1\s+misses:\s+.*?([\d,]+) rd .*?([\d,]+) wr/) {
             @res{qw(Dr_m1 Dw_m1)} = ($1,$2);
         }
-        elsif (/LLd misses:\s+.*?([\d,]+) rd .*?([\d,]+) wr/) {
+        elsif (/LLd\s+misses:\s+.*?([\d,]+) rd .*?([\d,]+) wr/) {
             @res{qw(Dr_mm Dw_mm)} = ($1,$2);
         }
         elsif (/Branches:\s+.*?([\d,]+) cond .*?([\d,]+) ind/) {
@@ -1185,7 +1185,7 @@ sub grind_run {
                         $envstr .= "$_=$env->{$_} " for sort keys %$env;
                     }
                     my $cmd = "PERL_HASH_SEED=0 $envstr"
-                            . "valgrind --tool=cachegrind  --branch-sim=yes "
+                            . "valgrind --tool=cachegrind  --branch-sim=yes --cache-sim=yes "
                             . "--cachegrind-out-file=/dev/null "
                             . "$OPTS{grindargs} "
                             . "$perl $OPTS{perlargs} $args - $counts->[$j] 2>&1";
index 1126c8d..d62a905 100644 (file)
@@ -54,39 +54,56 @@ my %defines =
 push @paths, qw(/usr/local/lib /lib /usr/lib)
         unless $linux64;
 
-unless(GetOptions(\%options,
-                  'target=s', 'make=s', 'jobs|j=i', 'crash', 'expect-pass=i',
-                  'expect-fail' => sub { $options{'expect-pass'} = 0; },
-                  'clean!', 'one-liner|e=s@', 'c', 'l', 'w', 'match=s',
-                  'no-match=s' => sub {
-                      $options{match} = $_[1];
-                      $options{'expect-pass'} = 0;
-                  },
-                  'force-manifest', 'force-regen', 'setpgrp!', 'timeout=i',
-                  'test-build', 'validate',
-                  'all-fixups', 'early-fixup=s@', 'late-fixup=s@', 'valgrind',
-                  'check-args', 'check-shebang!', 'usage|help|?', 'gold=s',
-                  'module=s', 'with-module=s', 'cpan-config-dir=s',
-                  'test-module=s', 'no-module-tests',
-                  'A=s@',
-                  'D=s@' => sub {
-                      my (undef, $val) = @_;
-                      if ($val =~ /\A([^=]+)=(.*)/s) {
-                          $defines{$1} = length $2 ? $2 : "\0";
-                      } else {
-                          $defines{$val} = '';
-                      }
-                  },
-                  'U=s@' => sub {
-                      $defines{$_[1]} = undef;
-                  },
-                )) {
-    pod2usage(exitval => 255, verbose => 1);
-}
+my $rv = GetOptions(
+    \%options,
+    'target=s', 'make=s', 'jobs|j=i', 'crash', 'expect-pass=i',
+    'expect-fail' => sub { $options{'expect-pass'} = 0; },
+    'clean!', 'one-liner|e=s@', 'c', 'l', 'w', 'match=s',
+    'no-match=s' => sub {
+        $options{match} = $_[1];
+        $options{'expect-pass'} = 0;
+    },
+    'force-manifest', 'force-regen', 'setpgrp!', 'timeout=i',
+    'test-build', 'validate',
+    'all-fixups', 'early-fixup=s@', 'late-fixup=s@', 'valgrind',
+    'check-args', 'check-shebang!', 'usage|help|?', 'gold=s',
+    'module=s', 'with-module=s', 'cpan-config-dir=s',
+    'test-module=s', 'no-module-tests',
+    'A=s@',
+    'D=s@' => sub {
+        my (undef, $val) = @_;
+        if ($val =~ /\A([^=]+)=(.*)/s) {
+            $defines{$1} = length $2 ? $2 : "\0";
+        } else {
+            $defines{$val} = '';
+        }
+    },
+    'U=s@' => sub {
+        $defines{$_[1]} = undef;
+    },
+);
+exit 255 unless $rv;
 
 my ($target, $match) = @options{qw(target match)};
 
-@ARGV = ('sh', '-c', 'cd t && ./perl TEST base/*.t')
+# El Capitan (OS X 10.11) (and later) strip DYLD_LIBRARY_PATH
+# from the environment of /bin/sh
+# https://developer.apple.com/library/archive/documentation/Security/Conceptual/System_Integrity_Protection_Guide/RuntimeProtections/RuntimeProtections.html
+#
+# (They *could* have chosen instead to ignore it and pass it through. It would
+# have the same direct effect, but maybe needing more coding. I suspect the
+# choice to strip it was deliberate, as it will also eliminate a bunch more
+# attack vectors, because it prevents you sneaking an override "into" something
+# else you convince the user to run.)
+
+my $aggressive_apple_security = "";
+if ($^O eq 'darwin') {
+    require Cwd;
+    my $cwd = quotemeta Cwd::getcwd();
+    $aggressive_apple_security = "DYLD_LIBRARY_PATH=$cwd ";
+}
+
+@ARGV = ('sh', '-c', "cd t && $aggressive_apple_security./perl TEST base/*.t")
     if $options{validate} && !@ARGV;
 
 pod2usage(exitval => 0, verbose => 2) if $options{usage};
@@ -123,7 +140,7 @@ if (defined $target && $target =~ /\.t\z/) {
     unless ($target =~ s!\At/!!) {
         $target = "../$target";
     }
-    @ARGV = ('sh', '-c', "cd t && ./perl TEST " . quotemeta $target);
+    @ARGV = ('sh', '-c', "cd t && $aggressive_apple_security./perl TEST " . quotemeta $target);
     $target = 'test_prep';
 }
 
@@ -844,6 +861,29 @@ Display the usage information and exit.
 
 =back
 
+=head1 ABOUT BISECTION
+
+The process is all about identifying the commit that caused some change
+in behaviour - maybe good, maybe bad. But it is built around C<git bisect>,
+which is much more specifically aimed at finding "what broke the build".
+C<git> terminology embeds that assumption - commits earlier than the
+target commit are "good" commits, those at or later than the target commit
+are "bad" commits.
+
+The default behaviour of F<bisect.pl> mimics this - you supply some code
+that I<fails> with a perl built B<at or after> the target commit and
+I<succeeds> with a perl built B<before> the target commit, and F<bisect.pl>
+will find the target commit.
+
+The F<bisect.pl> option C<--expect-fail> reverses those expectations
+(and changes nothing else). So with C<--expect-fail>, you should supply
+code that I<fails> only with a perl built B<before> the target commit,
+and I<succeeds> with a perl built B<at or after> the target commit.
+
+By default, I<failure> is a piece of perl code that terminates with
+a non-zero exit code, e.g. by calling C<die()>. Options that change what
+is interpreted as failure include C<--crash>, C<--test-build> and C<--match>.
+
 =head1 EXAMPLES
 
 =head2 Code has started to crash under C<miniperl>
@@ -1062,6 +1102,90 @@ L<Commit 125e1a3|https://github.com/Perl/perl5/commit/125e1a36a939>
 
 =back
 
+=head2 When did perl stop segfaulting on certain code?
+
+=over 4
+
+=item * Problem
+
+It was reported that perl was segfaulting on this code in perl-5.36.0:
+
+    @a = sort{eval"("}1,2
+
+Bisection subsequently identified the commit at which the segfaulting first
+appeared.  But when we ran that code against what was then the HEAD of blead
+(L<Commit 70d911|https://github.com/Perl/perl5/commit/70d911984f>), we got no
+segfault.  So the next question we faced was: At what commit did the
+segfaulting cease?
+
+=item * Solution
+
+Because the code in question loaded no libraries, it was amenable to bisection
+with C<miniperl>, thereby shortening bisection time considerably.
+
+    perl Porting/bisect.pl \
+        --start=v5.36.0 \
+        --target=miniperl \
+        --expect-fail -e '@a = sort{eval"("}1,2'
+
+=item * Reference
+
+L<GH issue 20261|https://github.com/Perl/perl5/issues/20261>
+
+=back
+
+=head2 When did perl stop emitting warnings when running on certain code?
+
+=over 4
+
+=item * Background
+
+Most of the time, we bisect in order to identify the first "bad" commit:  the
+first time code failed to compile; the first time the code emitted warnings;
+and so forth.
+
+Some times, however, we want to identify the first "good" commit:  the point
+where the code began to compile; the point where the code no longer emitted
+warnings; etc.
+
+We can use this program for that purpose, but we have to reverse our sense of
+"good" and "bad" commits.  We use the C<--expect-fail> option to do that
+reversal.
+
+=item * Problem
+
+It was reported that in an older version of Perl, a warning was being emitted
+when a program was using the F<bigrat> module and
+C<Scalar::Util::looks_like_number()> was called passing a non-integral number
+(I<i.e.,> a rational).
+
+    $ perl -wE 'use Scalar::Util; use bigrat;
+      say "mercy" if Scalar::Util::looks_like_number(1/9);'
+
+In perl-5.32, this emitted:
+
+    $ Argument "1/9" isn't numeric in addition (+) at
+      /usr/local/lib/perl5/5.32/Math/BigRat.pm line 1955.
+      mercy
+
+But it was observed that there was no warning in perl-5.36.
+
+=item * Solution
+
+    $ perl Porting/bisect.pl \
+        --start=5624cfff8f \
+        --end=b80b9f7fc6 \
+        --expect-fail \
+        -we 'use Scalar::Util; use bigrat; my @w;
+            local $SIG{__WARN__} = sub { die };
+            print "mercy\n" if Scalar::Util::looks_like_number(1/9)'
+
+=item * Reference
+
+L<GH issue 20685|https://github.com/Perl/perl5/issues/20685>
+
+=back
+
 =cut
 
 # Ensure we always exit with 255, to cause git bisect to abort.
@@ -1226,9 +1350,11 @@ sub extract_from_file {
 
 sub edit_file {
     my ($file, $munger) = @_;
-    local $/;
     my $fh = open_or_die($file);
-    my $orig = <$fh>;
+    my $orig = do {
+        local $/;
+        <$fh>;
+    };
     die_255("Can't read $file: $!") unless defined $orig && close $fh;
     my $new = $munger->($orig);
     return if $new eq $orig;
@@ -1379,7 +1505,9 @@ sub apply_patch {
     my ($patch, $what, $files) = @_;
     $what = 'patch' unless defined $what;
     unless (defined $files) {
-        $patch =~ m!^--- [ab]/(\S+)\n\+\+\+ [ba]/\1!sm;
+        # Handle context diffs (*** ---) and unified diffs (+++ ---)
+        # and ignore trailing "garbage" after the filenames
+        $patch =~ m!^[-*]{3} [ab]/(\S+)[^\n]*\n[-+]{3} [ba]/\1!sm;
         $files = " $1";
     }
     my $patch_to_use = placate_patch_prog($patch);
@@ -1582,6 +1710,7 @@ if ($options{'all-fixups'}) {
     patch_SH();
     patch_C();
     patch_ext();
+    patch_t();
 }
 apply_fixups($options{'early-fixup'});
 
@@ -1623,8 +1752,11 @@ unless (extract_from_file('Configure', 'ignore_versioned_solibs')) {
     $defines{libs} = \@libs unless exists $defines{libs};
 }
 
+# a4f3eea9be6bcf3c added a test for GNU libc to Configure
+# Prior to that we really don't get much choice but to force usenm off
+# everywhere (and modern systems are fast enough that this doesn't matter)
 $defines{usenm} = undef
-    if $major < 2 && !exists $defines{usenm};
+    if $major < 4 && !exists $defines{usenm};
 
 my ($missing, $created_dirs);
 ($missing, $created_dirs) = force_manifest()
@@ -1692,8 +1824,10 @@ if ($target =~ /config\.s?h/) {
 
     run_report_and_exit(@ARGV);
 } elsif (!-f 'config.sh') {
-    # Skip if something went wrong with Configure
+    report_and_exit(undef, 'PLEASE REPORT BUG', 'could not build', 'config.sh')
+        if $options{'test-build'};
 
+    # Skip if something went wrong with Configure
     skip('could not build config.sh');
 }
 
@@ -1710,6 +1844,7 @@ if($options{'force-regen'}
 unless ($options{'all-fixups'}) {
     patch_C();
     patch_ext();
+    patch_t();
 }
 
 # Parallel build for miniperl is safe
@@ -2156,6 +2291,124 @@ index 53649d5..0635a6e 100755
 EOPATCH
     }
 
+    if ($major < 4 && extract_from_file('Configure',
+                                        qr/: see which flavor of setpgrp is in use/)) {
+        edit_file('Configure', sub {
+                      my $code = shift;
+                      my $new = <<'EOT';
+if $cc $ccflags $ldflags -o set set.c $libs >/dev/null 2>&1; then
+EOT
+                      chomp $new;
+
+                      # before commit ecfc54246c2a6f42:
+                      # before commit 8e07c86ebc651fe9:
+                      my @old = (<<'EOT', <<'EOT');
+if $cc $ccflags -o set $ldflags set.c $libs >/dev/null 2>&1; then
+EOT
+if $cc $ccflags -o set set.c $ldflags $libs >/dev/null 2>&1; then
+EOT
+                      for my $was (@old) {
+                          # Yes, this modifies @old. No problem here:
+                          chomp $was;
+                          $was = quotemeta $was;
+                          $code =~ s/$was/$new/;
+                      }
+
+                      # also commit ecfc54246c2a6f42:
+                      $code =~ s!\tif usg; then!\tif ./usg; then!;
+
+                      return $code;
+                  });
+
+        # We need the new probe from 2afac517c48c20de, which has prototypes
+        # (but include the various C headers unconditionally)
+        apply_patch(<<'EOPATCH');
+diff --git a/Configure b/Configure
+index 18f2172435..5a75ebd767 100755
+--- a/Configure
++++ b/Configure
+@@ -4986,45 +5055,61 @@ eval $inlibc
+ set setpgrp d_setpgrp
+ eval $inlibc
+-: see which flavor of setpgrp is in use
++echo "Checking to see which flavor of setpgrp is in use . . . "
+ case "$d_setpgrp" in
+ "$define")
+       echo " "
+       $cat >set.c <<EOP
++#include <stdio.h>
++#include <sys/types.h>
++#include <unistd.h>
+ main()
+ {
+       if (getuid() == 0) {
+               printf("(I see you are running Configure as super-user...)\n");
+               setuid(1);
+       }
++#ifdef TRY_BSD_PGRP
+       if (-1 == setpgrp(1, 1))
+-              exit(1);
+-      exit(0);
++              exit(0);
++#else
++      if (setpgrp() != -1)
++              exit(0);
++#endif
++      exit(1);
+ }
+ EOP
+-      if $cc $ccflags $ldflags -o set set.c $libs >/dev/null 2>&1; then
+-              ./set 2>/dev/null
+-              case $? in
+-              0) echo "You have to use setpgrp() instead of setpgrp(pid, pgrp)." >&4
+-                      val="$undef";;
+-              *) echo "You have to use setpgrp(pid, pgrp) instead of setpgrp()." >&4
+-                      val="$define";;
+-              esac
++      if $cc -DTRY_BSD_PGRP $ccflags $ldflags -o set set.c $libs >/dev/null 2>&1 && ./set; then
++              echo 'You have to use setpgrp(pid,pgrp) instead of setpgrp().' >&4
++              val="$define"
++      elif $cc $ccflags $ldflags -o set set.c $libs >/dev/null 2>&1 && ./set; then
++              echo 'You have to use setpgrp() instead of setpgrp(pid,pgrp).' >&4
++              val="$undef"
+       else
++              echo "I can't seem to compile and run the test program."
+               if ./usg; then
+-                      xxx="USG one, i.e. you use setpgrp()."
+-                      val="$undef"
++                      xxx="a USG one, i.e. you use setpgrp()."
+               else
+-                      xxx="BSD one, i.e. you use setpgrp(pid, pgrp)."
+-                      val="$define"
++                      # SVR4 systems can appear rather BSD-ish.
++                      case "$i_unistd" in
++                      $undef)
++                              xxx="a BSD one, i.e. you use setpgrp(pid,pgrp)."
++                              val="$define"
++                              ;;
++                      $define)
++                              xxx="probably a USG one, i.e. you use setpgrp()."
++                              val="$undef"
++                              ;;
++                      esac
+               fi
+-              echo "Assuming your setpgrp is a $xxx" >&4
++              echo "Assuming your setpgrp is $xxx" >&4
+       fi
+       ;;
+ *) val="$undef";;
+ esac
+-set d_bsdpgrp
++set d_bsdsetpgrp
+ eval $setvar
++d_bsdpgrp=$d_bsdsetpgrp
+ $rm -f set set.c
+ : see if bzero exists
+EOPATCH
+    }
+
     if ($major == 4 && extract_from_file('Configure', qr/^d_gethbynam=/)) {
         # Fixes a bug introduced in 4599a1dedd47b916
         apply_commit('3cbc818d1d0ac470');
@@ -2227,6 +2480,76 @@ EOPATCH
         }
     }
 
+    if ($major < 5) {
+        my $what = extract_from_file('Configure', qr!(\s+)return __libc_main!);
+        if ($what) {
+            # To add to the fun commit commit dfe9444ca7881e71 in Feb 1988
+            # changed several things:
+            if ($what !~ /\t/) {
+                apply_patch(<<'EOPATCH');
+--- a/Configure
++++ b/Configure
+@@ -3854,11 +3911,12 @@ n) echo "OK, that should do.";;
+ int
+ main()
+ {
+-  return __libc_main();
++      return __libc_main();
+ }
+ EOM
+-if $cc $ccflags $ldflags -o gnulibc gnulibc.c $libs >/dev/null 2>&1 && \
+-    ./gnulibc | $contains '^GNU C Library' >/dev/null 2>&1; then
++set gnulibc
++if eval $compile && \
++  ./gnulibc | $contains '^GNU C Library' >/dev/null 2>&1; then
+       val="$define"
+       echo "You are using the GNU C Library"
+ else
+EOPATCH
+            }
+
+            # And commit dc45a647708b6c54 tweaks 1 line in April 1998
+            edit_file('Configure', sub {
+                          my $code = shift;
+                          $code =~ s{contains '\^GNU C Library' >/dev/null 2>&1; then}
+                                    {contains '^GNU C Library'; then};
+                          return $code;
+                      });
+
+            # This is part of aebf16e7cdbc86ec from June 1998
+            # but with compiles_ok inlined
+            apply_patch(<<'EOPATCH');
+diff --git a/Configure b/Configure
+index 38072f0e5e..43735feacf 100755
+--- a/Configure
++++ b/Configure
+@@ -4024,15 +4024,19 @@ $cc $optimize $ccflags $ldflags -o ${mc_file} $* ${mc_file}.c $libs;'
+ echo " "
+ echo "Checking for GNU C Library..." >&4
+ cat >gnulibc.c <<EOM
++#include <stdio.h>
+ int
+ main()
+ {
+-      return __libc_main();
++#ifdef __GLIBC__
++    exit(0);
++#else
++    exit(1);
++#endif
+ }
+ EOM
+ set gnulibc
+-if eval $compile && \
+-  ./gnulibc | $contains '^GNU C Library'; then
++if $cc $ccflags $ldflags -o gnulibc gnulibc.c $libs && ./gnulibc; then
+       val="$define"
+       echo "You are using the GNU C Library"
+ else
+EOPATCH
+        }
+    }
+
     if ($major < 6 && !extract_from_file('Configure',
                                          qr!^\t-A\)$!)) {
         # This adds the -A option to Configure, which is incredibly useful
@@ -2325,6 +2648,18 @@ index 4b55fa6..60c3c64 100755
 EOPATCH
     }
 
+    if ($major < 6) {
+        edit_file('Configure', sub {
+                      my $code = shift;
+                      # This will cause a build failure, but it will stop
+                      # Configure looping endlessly trying to get a different
+                      # answer:
+                      $code =~ s{(dflt=)n(\n\s+rp="Function \$ans does not exist)}
+                                {$1y$2};
+                      return $code;
+                  });
+    }
+
     if ($major < 8 && $^O eq 'aix') {
         edit_file('Configure', sub {
                       my $code = shift;
@@ -2353,18 +2688,120 @@ EOPATCH
                   });
     }
 
-    if ($major == 8 || $major == 9) {
+    if ($major < 32) {
+        edit_file('Configure', sub {
+                      my $code = shift;
+
+                      # A lot of the probes used to be written assuming no need
+                      # for prototypes for exit(), printf() etc.
+                      # Curiously also the code was written to call exit()
+                      # rather than return from main - early portability?
+                      #
+                      # Commit 55954f198635e488 did most of the work in ensuring
+                      # that there was always a prototype for exit, by adding
+                      # #include <stdlib.h> in many probes. However the last
+                      # missing prototype was only addressed by f16c94bc75aefb81
+                      # (for futimes), and the last missing prototypes a few
+                      # commits later in f82f0f36c7188b6d
+                      #
+                      # As an aside, commit dc45a647708b6c54 fixes the signal
+                      # name probe (etc) - the commit tagged as perl-5.004_01
+                      # *seems* to fix the signal name probe, but actually it
+                      # fixes an error in the fallback awk code, not the C
+                      # probe's missing prototype.
+                      #
+                      # With current C compilers there is no correctness risk
+                      # from including a header more than once, so the easiest
+                      # approach to making this all work is to add includes
+                      # "to be sure to be sure"
+                      #
+                      # The trick is not to break *working* probes by
+                      # accidentally including a header *within* a construction.
+                      # So we need to have some confidence that it's the start
+                      # of a file (or somewhere safe)
+
+                      my $headers = <<'EOFIX';
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+EOFIX
+
+                      # This handles $cat and plain cat:
+                      $code =~ s{([\$\t\n ]cat > *[a-z0-9]+\.c <<[^\n]*\n)}
+                                {$1$headers}g;
+                      # Of course, there's always one that's backwards:
+                      $code =~ s{([\$\t\n ]cat <<[^\n]* > *[a-z0-9]+\.c\n)}
+                                {$1$headers}g;
+
+                      # and >> used to *create* a file.
+                      # We have to be careful to distinguish those from >> used
+                      # to append to a file. All the first lines have #include
+                      # or #ifdef. Except the few that don't...
+                      $code =~ s{
+                                    ([\$\t\n ]cat\ >>\ *[a-z]+\.c\ <<[^\n]*\n)
+                                    (
+                                        # #include/#ifdef ...
+                                        \#
+                                    |
+                                        # The non-blocking IO probe
+                                        (?:int\ )?main\(\)
+                                    |
+                                        # The alignment constraint probe
+                                        struct\ foobar
+                                    )
+                                }
+                                {$1$headers$2}gx;
+
+                      # This is part of commit c727eafaa06ca49a:
+                      $code =~ s{\(int\)exit\(0\);}
+                                {\(void\)exit\(0\);};
+
+                      return $code;
+                  });
+    }
+
+    if ($major < 10) {
         # Fix symbol detection to that of commit 373dfab3839ca168 if it's any
         # intermediate version 5129fff43c4fe08c or later, as the intermediate
         # versions don't work correctly on (at least) Sparc Linux.
         # 5129fff43c4fe08c adds the first mention of mistrustnm.
         # 373dfab3839ca168 removes the last mention of lc=""
+        #
+        # Fix symbol detection prior to 5129fff43c4fe08c to use the same
+        # approach, where we don't call printf without a prototype
+        # We can't include <stdio.h> to get its prototype, as the way this works
+        # is to create a (wrong) prototype for the probed functions, and those
+        # conflict if the function in question is in stdio.h.
         edit_file('Configure', sub {
                       my $code = shift;
                       return $code
                           if $code !~ /\btc="";/; # 373dfab3839ca168 or later
-                      return $code
-                          if $code !~ /\bmistrustnm\b/; # before 5129fff43c4fe08c
+                      if ($code !~ /\bmistrustnm\b/) {
+                          # doing this as a '' heredoc seems to be the easiest
+                          # way to avoid confusing levels of backslashes:
+                          my $now = <<'EOT';
+void *(*(p()))$tdc { extern void *$1$tdc; return &$1; } int main() { if(p()) return(0); else return(1); }
+EOT
+                          chomp $now;
+
+                          # before 5129fff43c4fe08c
+                          # befure 16d20bd98cd29be7
+                          my @old = (<<'EOT', <<'EOT');
+main() { extern short $1$tdc; printf(\"%hd\", $1$tc); }
+EOT
+main() { extern int $1$tdc; printf(\"%d\", $1$tc); }
+EOT
+                          for my $was (@old) {
+                              chomp $was;
+                              $was = quotemeta $was;
+
+                              # Prior to commit d674cd6de52ff38b there was no
+                              # 'int ' for 'int main'
+                              $code =~ s/(?:int )?$was/$now/;
+                          }
+                          return $code;
+                      }
+
                       my $fixed = <<'EOC';
 
 : is a C symbol defined?
@@ -2450,6 +2887,13 @@ index 3d2e8b9..6ce7766 100755
  
 EOPATCH
     }
+
+    if ($major < 38 && !extract_from_file('Configure', qr/Too many attempts asking the same question/)) {
+        # Without this, myread can loop infinitely trying to get a valid answer,
+        # and hence Configure gets stuck in a loop, outputting the same question
+        # repeatedly. This isn't what we need.
+        apply_commit('46bfb3c49f22629a');
+    }
 }
 
 sub patch_hints {
@@ -2508,6 +2952,66 @@ sub patch_hints {
                       return $code;
                   });
         }
+
+        if ($major < 8 ||
+                ($major < 10 && !extract_from_file('ext/DynaLoader/Makefile.PL',
+                                                   qr/sub MY::static /))) {
+            edit_file('hints/darwin.sh', sub {
+                          my $code = shift;
+                          # As above, the build fails if version of code in op.o
+                          # is linked to, instead of opmini.o
+                          # We don't need this after commit 908fcb8bef8cbab8,
+                          # which moves DynaLoader.o into the shared perl
+                          # library, as it *also* redoes the build so that
+                          # miniperl is linked against all the object files
+                          # (explicitly excluding op.o), instead of against the
+                          # shared library (and reyling on "flat namespaces"
+                          # - ie make Mach-O behave like ELF - to end up with
+                          # objects in the library linking against opmini.o)
+                          $code .= <<'EOHACK';
+
+# Force a flat namespace everywhere:
+echo $ldflags | grep flat_namespace || ldflags=`echo \$lddflags -flat_namespace`
+echo $lddlflags | grep flat_namespace || lddlflags=`echo \$lddlflags -flat_namespace`
+EOHACK
+                          return $code;
+                      });
+        }
+
+        if ($major < 16) {
+            edit_file('hints/darwin.sh', sub {
+                          my $code = shift;
+                          # This is commit 60a655a1ee05c577
+                          $code =~ s/usenm='true'/usenm='false'/;
+
+                          # With the Configure probes fixed (in patch_Configure)
+                          # the "d_stdstdio" logic now concludes "define".
+                          # Unfortunately that is not correct - attempting to
+                          # build 5.8.0 without this override results in SEGVs
+                          # or similar chaos.
+                          #
+                          # The problem is introduced by commit 5a3a8a022aa61cba
+                          # which enables perlio by default.
+                          # The problem is hidden after 15b61c98f82f3010, which
+                          # adds "d_faststdio" and defaults it to "undef" from
+                          # that commit onwards, but override that and the build
+                          # would break, up until "turning off perlio" was
+                          # disabled by commit dd35fa16610ef2fa
+                          $code .= "\nd_stdstdio='undef'\n";
+
+                          return $code;
+                      });
+        }
+
+        if ($major < 34) {
+            edit_file('hints/darwin.sh', sub {
+                      my $code = shift;
+                      # This is commits aadc6422eaec39c2 and 54d41b60822734cf
+                      # rolled into one:
+                      $code =~ s/    10\.\*(?: \| 11\.\*)?\)/    [1-9][0-9].*)/g;
+                      return $code;
+                  });
+        }
     } elsif ($^O eq 'netbsd') {
         if ($major < 6) {
             # These are part of commit 099685bc64c7dbce
@@ -2922,6 +3426,15 @@ $2!;
         }
     }
 
+    if ($major == 3) {
+        # This is part of commit f0efd8cf98c95b42:
+        edit_file('Makefile.SH', sub {
+                      my $code = shift;
+                      $code =~ s/<<!NO!SUBS!/<<'!NO!SUBS!'/;
+                      return $code;
+                  });
+    }
+
     if ($major == 7) {
         # Remove commits 9fec149bb652b6e9 and 5bab1179608f81d8, which add/amend
         # rules to automatically run regen scripts that rebuild C headers. These
@@ -2941,6 +3454,38 @@ $2!;
         }
     }
 
+    if ($^O eq 'darwin' && ($major < 8
+                                || ($major < 10
+                                    && !extract_from_file('ext/DynaLoader/Makefile.PL',
+                                                          qr/sub MY::static /)))) {
+        my $cwd = Cwd::getcwd();
+        my $wrapper = 'miniperl.sh';
+        my $fh = open_or_die($wrapper, '>');
+        print $fh <<"EOT";
+#!/bin/sh
+${aggressive_apple_security}exec $cwd/miniperl "\$\@"
+EOT
+        close_or_die($fh);
+        chmod 0755, $wrapper
+            or die "Couldn't chmod 0755 $wrapper: $!";
+
+        edit_file('ext/util/make_ext', sub {
+                      my $code = shift;
+                      # This is shell expansion syntax
+                      $code =~ s{ (\.\./\$depth/miniperl) }
+                                { $1.sh };
+                      # This is actually the same line as edited above.
+                      # We need this because (yay), without this EU::MM will
+                      # default to searching for a working perl binary
+                      # (sensible plan) but due to macOS stripping
+                      # DYLD_LIBRARY_PATH during system(...), .../miniperl
+                      # (as found from $^X) *isn't* going to work.
+                      $code =~ s{ (Makefile\.PL INSTALLDIRS=perl) }
+                                { $1 PERL=\.\./\$depth/miniperl.sh };
+                      return $code;
+                  });
+    }
+
     if ($^O eq 'aix' && $major >= 8 && $major < 28
         && extract_from_file('Makefile.SH', qr!\Q./$(MINIPERLEXP) makedef.pl\E.*aix!)) {
         # This is a variant the AIX part of commit 72bbce3da5eeffde:
@@ -2999,6 +3544,23 @@ sub patch_C {
     # This is ordered by $major, as it's likely that different platforms may
     # well want to share code.
 
+    if ($major == 0) {
+        apply_patch(<<'EOPATCH');
+diff --git a/proto.h b/proto.h
+index 9ffc6bbabc..16da198342 100644
+--- a/proto.h
++++ b/proto.h
+@@ -8,6 +8,7 @@
+ #endif
+ #ifdef OVERLOAD
+ SV*   amagic_call _((SV* left,SV* right,int method,int dir));
++bool Gv_AMupdate _((HV* stash));
+ #endif /* OVERLOAD */
+ OP*   append_elem _((I32 optype, OP* head, OP* tail));
+ OP*   append_list _((I32 optype, LISTOP* first, LISTOP* last));
+EOPATCH
+    }
+
     if ($major == 2 && extract_from_file('perl.c', qr/^\tfclose\(e_fp\);$/)) {
         # need to patch perl.c to avoid calling fclose() twice on e_fp when
         # using -e
@@ -3087,6 +3649,36 @@ index 4608a2a..f0c9d1d 100644
 EOPATCH
     }
 
+    # _(( was the macro wrapper for hiding ANSI prototypes from K&R C compilers:
+    if ($major == 3 && !extract_from_file('proto.h', qr/\bsafemalloc\s+_\(\(/)) {
+        # This is part of commit bbce6d69784bf43b:
+        # [inseparable changes from patch from perl5.003_08 to perl5.003_09]
+        # This only affects a few versions, but without this safemalloc etc get
+        # an implicit return type (of int), and that is truncating addresses on
+        # 64 bit systems. (And these days, seems that x86_64 linux has a memory
+        # map which causes malloc to return addresses >= 2**32)
+        apply_patch(<<'EOPATCH');
+diff --git a/proto.h b/proto.h
+index 851567b340..e650c8b07d 100644
+--- a/proto.h
++++ b/proto.h
+@@ -479,6 +479,13 @@ Malloc_t realloc _((Malloc_t where, MEM_SIZE nbytes));
+ Free_t   free _((Malloc_t where));
+ #endif
++#ifndef MYMALLOC
++Malloc_t safemalloc _((MEM_SIZE nbytes));
++Malloc_t safecalloc _((MEM_SIZE elements, MEM_SIZE size));
++Malloc_t saferealloc _((Malloc_t where, MEM_SIZE nbytes));
++Free_t   safefree _((Malloc_t where));
++#endif
++
+ #ifdef LEAKTEST
+ Malloc_t safexmalloc _((I32 x, MEM_SIZE size));
+ Malloc_t safexcalloc _((I32 x, MEM_SIZE elements, MEM_SIZE size));
+EOPATCH
+    }
+
     if ($major < 4 && $^O eq 'openbsd') {
         my $bad;
         # Need changes from commit a6e633defa583ad5.
@@ -3627,6 +4219,38 @@ index 2a6cbcd..eab2de1 100644
 EOPATCH
     }
 
+    if ($major < 6 && extract_from_file('perl.h', qr/PL_uuemap\[\]/)) {
+        # That [] needs to be [65]:
+        apply_commit('7575fa06ca7baf15');
+    }
+
+    if ($major < 6 && $^O eq 'darwin'
+            && !extract_from_file('perl.h', qr/ifdef I_FCNTL/)) {
+        # This is part of commit 9a34ef1dede5fef4, but in a stable part of the
+        # file:
+        apply_patch(<<'EOPATCH')
+diff --git a/perl.h b/perl.h
+index 0d3f0b8333..19f6684894 100644
+--- a/perl.h
++++ b/perl.h
+@@ -310,6 +310,14 @@ register struct op *Perl_op asm(stringify(OP_IN_REGISTER));
+ #   define BYTEORDER 0x1234
+ #endif
++#ifdef I_FCNTL
++#  include <fcntl.h>
++#endif
++
++#ifdef I_SYS_FILE
++#  include <sys/file.h>
++#endif
++
+ /* Overall memory policy? */
+ #ifndef CONSERVATIVE
+ #   define LIBERAL 1
+EOPATCH
+    }
+
     if ($major == 7 && $^O eq 'aix' && -f 'ext/List/Util/Util.xs'
         && extract_from_file('ext/List/Util/Util.xs', qr/PUSHBLOCK/)
         && !extract_from_file('makedef.pl', qr/^Perl_cxinc/)) {
@@ -3693,8 +4317,26 @@ index 900b491..6251a0b 100644
 EOPATCH
 }
 
-    if ($major < 8 && $^O eq 'openbsd'
-        && !extract_from_file('perl.h', qr/include <unistd\.h>/)) {
+    if ($major < 8 && !extract_from_file('perl.h', qr/\bshort htovs\b/)) {
+        # This is part of commit c623ac675720b314
+        apply_patch(<<'EOPATCH');
+diff --git a/perl.h b/perl.h
+index 023b90b7ea..59a21faecd 100644
+--- a/perl.h
++++ b/perl.h
+@@ -2279,4 +2279,8 @@ struct ptr_tbl {
+ # endif
+       /* otherwise default to functions in util.c */
++short htovs(short n);
++short vtohs(short n);
++long htovl(long n);
++long vtohl(long n);
+ #endif
+EOPATCH
+    }
+
+    if ($major < 8 && !extract_from_file('perl.h', qr/include <unistd\.h>/)) {
         # This is part of commit 3f270f98f9305540, applied at a slightly
         # different location in perl.h, where the context is stable back to
         # 5.000
@@ -3716,6 +4358,50 @@ index 9418b52..b8b1a7c 100644
  #if defined(STANDARD_C) && defined(I_STDLIB)
 EOPATCH
     }
+
+    if ($major < 10) {
+        # This is commit 731e259481f36b35, but adapted to remove all the
+        # variations of guards around the inclusion of <signal.h>
+        # Whilst we only hit this as a problem on arm64 macOS (so far), because
+        # it insists on prototypes for everything, I'm assuming that doing this
+        # everywhere and unconditionally might solve similar problems on other
+        # platforms. Certainly, it *ought* to be safe to include a C89 header
+        # these days.
+        for my $file (qw(doop.c mg.c mpeix/mpeixish.h plan9/plan9ish.h unixish.h util.c)) {
+            next
+                unless -f $file;
+            edit_file($file, sub {
+                          my $code = shift;
+                          $code =~ s{
+                                        \n
+                                        \#if \s+ [^\n]+
+                                        \n
+                                        \# \s* include \s+ <signal\.h>
+                                        \n
+                                        \#endif
+                                        \n
+                                }
+                                    {\n#include <signal.h>\n}x;
+                          return $code;
+                      });
+        }
+    }
+
+    if ($major == 15) {
+        # This affects a small range of commits around July 2011, but build
+        # failures here get in the way of bisecting other problems:
+
+        my $line = extract_from_file('embed.fnc', qr/^X?pR\t\|I32\t\|was_lvalue_sub$/);
+        if ($line) {
+            # Need to export Perl_was_lvalue_sub:
+            apply_commit('7b70e8177801df4e')
+                unless $line =~ /X/;
+
+            # It needs to be 'ApR' not 'XpR', to be visible to List::Util
+            # (arm64 macOS treats the missing prototypes as errors)
+            apply_commit('c73b0699db4d0b8b');
+        }
+    }
 }
 
 sub patch_ext {
@@ -3744,7 +4430,7 @@ sub patch_ext {
         checkout_file('ext/DynaLoader/dl_dyld.xs', 'f556e5b971932902');
         apply_patch(<<'EOPATCH');
 diff -u a/ext/DynaLoader/dl_dyld.xs~ a/ext/DynaLoader/dl_dyld.xs
---- a/ext/DynaLoader/dl_dyld.xs~       2011-10-11 21:41:27.000000000 +0100
+--- a/ext/DynaLoader/dl_dyld.xs        2011-10-11 21:41:27.000000000 +0100
 +++ b/ext/DynaLoader/dl_dyld.xs        2011-10-11 21:42:20.000000000 +0100
 @@ -41,6 +41,35 @@
  #include "perl.h"
@@ -3782,20 +4468,36 @@ diff -u a/ext/DynaLoader/dl_dyld.xs~ a/ext/DynaLoader/dl_dyld.xs
  #define DL_LOADONCEONLY
  
  #include "dlutils.c"  /* SaveError() etc      */
-@@ -185,7 +191,7 @@
+@@ -104,7 +145,7 @@
+     dl_last_error = savepv(error);
+ }
+-static char *dlopen(char *path, int mode /* mode is ignored */)
++static char *dlopen(char *path)
+ {
+     int dyld_result;
+     NSObjectFileImage ofile;
+@@ -161,13 +202,11 @@
+ dl_load_file(filename, flags=0)
+     char *    filename
+     int               flags
+-    PREINIT:
+-    int mode = 1;
      CODE:
      DLDEBUG(1,PerlIO_printf(Perl_debug_log, "dl_load_file(%s,%x):\n", filename,flags));
      if (flags & 0x01)
 -      Perl_warn(aTHX_ "Can't make loaded symbols global on this platform while loading %s",filename);
+-    RETVAL = dlopen(filename, mode) ;
 +      Perl_warn_nocontext("Can't make loaded symbols global on this platform while loading %s",filename);
-     RETVAL = dlopen(filename, mode) ;
++    RETVAL = dlopen(filename);
      DLDEBUG(2,PerlIO_printf(Perl_debug_log, " libref=%x\n", RETVAL));
      ST(0) = sv_newmortal() ;
+     if (RETVAL == NULL)
 EOPATCH
         if ($major < 4 && !extract_from_file('util.c', qr/^form/m)) {
             apply_patch(<<'EOPATCH');
 diff -u a/ext/DynaLoader/dl_dyld.xs~ a/ext/DynaLoader/dl_dyld.xs
---- a/ext/DynaLoader/dl_dyld.xs~       2011-10-11 21:56:25.000000000 +0100
+--- a/ext/DynaLoader/dl_dyld.xs        2011-10-11 21:56:25.000000000 +0100
 +++ b/ext/DynaLoader/dl_dyld.xs        2011-10-11 22:00:00.000000000 +0100
 @@ -60,6 +60,18 @@
  #  define get_av perl_get_av
@@ -3823,12 +4525,13 @@ EOPATCH
     if ($major < 10) {
         if ($unfixable_db_file) {
             # Nothing we can do.
-        } elsif (!extract_from_file('ext/DB_File/DB_File.xs',
-                                    qr/^#ifdef AT_LEAST_DB_4_1$/)) {
-            # This line is changed by commit 3245f0580c13b3ab
-            my $line = extract_from_file('ext/DB_File/DB_File.xs',
-                                         qr/^(        status = \(?RETVAL->dbp->open\)?\(RETVAL->dbp, name, NULL, RETVAL->type, $)/);
-            apply_patch(<<"EOPATCH");
+        } else {
+            if (!extract_from_file('ext/DB_File/DB_File.xs',
+                                   qr/^#ifdef AT_LEAST_DB_4_1$/)) {
+                # This line is changed by commit 3245f0580c13b3ab
+                my $line = extract_from_file('ext/DB_File/DB_File.xs',
+                                             qr/^(        status = \(?RETVAL->dbp->open\)?\(RETVAL->dbp, name, NULL, RETVAL->type, $)/);
+                apply_patch(<<"EOPATCH");
 diff --git a/ext/DB_File/DB_File.xs b/ext/DB_File/DB_File.xs
 index 489ba96..fba8ded 100644
 --- a/ext/DB_File/DB_File.xs
@@ -3855,6 +4558,13 @@ index 489ba96..fba8ded 100644
        /* printf("open returned %d %s\\n", status, db_strerror(status)) ; */
  
 EOPATCH
+            }
+
+            if (!extract_from_file('ext/DB_File/DB_File.xs',
+                                   qr/\bextern void __getBerkeleyDBInfo\b/)) {
+                # A prototype for __getBerkeleyDBInfo();
+                apply_commit('b92372bcedd4cbc4');
+            }
         }
     }
 
@@ -3897,6 +4607,28 @@ EOFIX
                   });
     }
 
+    if ($major < 10 and -f 'ext/Digest/MD5/MD5.xs') {
+        require Digest::MD5;
+        my ($was, $now);
+        # The edit to the XS is commit 9ee8e69ab2318ba3, but the testcase fixup
+        # needs to work for several earlier commits.
+        edit_file('ext/Digest/MD5/MD5.xs', sub {
+                      my $xs = shift;
+                      $was = Digest::MD5::md5_hex($xs);
+                      $xs =~ s{\Q#if PATCHLEVEL <= 4 && !defined(PL_dowarn)}
+                              {#if PERL_VERSION <= 4 && !defined(PL_dowarn)};
+                      $now = Digest::MD5::md5_hex($xs);
+                      return $xs;
+                  });
+
+        edit_file('ext/Digest/MD5/t/files.t', sub {
+                      my $testcase = shift;
+                      $testcase =~ s/$was/$now/g;
+                      return $testcase;
+                  })
+            if $was ne $now;
+    }
+
     if ($major >= 10 && $major < 20
             && !extract_from_file('ext/SDBM_File/Makefile.PL', qr/MY::subdir_x/)) {
         # Parallel make fix for SDBM_File
@@ -3906,6 +4638,75 @@ EOFIX
         # So far, only AIX make has come acropper on this bug.
         apply_commit('4d106cc5d8fd328d', 'ext/SDBM_File/Makefile.PL');
     }
+
+    if (-f 'ext/Errno/Errno_pm.PL') {
+        if ($major < 22 && !extract_from_file('ext/Errno/Errno_pm.PL',
+                                              qr/RT#123784/)) {
+            my $gcc_major = extract_from_file('config.sh',
+                                              qr/^gccversion='([0-9]+)\./,
+                                              0);
+            if ($gcc_major >= 5) {
+                # This is the fix of commit 816b056ffb99ae54, but implemented in
+                # a way that should work back to the earliest versions of Errno:
+                edit_file('ext/Errno/Errno_pm.PL', sub {
+                              my $code = shift;
+                              $code =~ s/( \$Config\{cppflags\})/$1 -P/g;
+                              return $code;
+                          });
+            }
+        }
+        if ($major < 8 && !extract_from_file('ext/Errno/Errno_pm.PL',
+                                             qr/With the -dM option, gcc/)) {
+            # This is the fix of commit 9ae2e8df64ee1443 re-ordered slightly so
+            # that it should work back to the earliest versions of Errno:
+            apply_patch(<<'EOPATCH');
+diff --git a/ext/Errno/Errno_pm.PL b/ext/Errno/Errno_pm.PL
+index b669790314..c00d6c1a86 100644
+--- a/ext/Errno/Errno_pm.PL
++++ b/ext/Errno/Errno_pm.PL
+@@ -30,6 +30,12 @@ sub process_file {
+             warn "Cannot open '$file'";
+             return;
+       }     
++    } elsif ($Config{gccversion} ne '') {
++      # With the -dM option, gcc outputs every #define it finds
++      unless(open(FH,"$Config{cc} -E -dM $file |")) {
++            warn "Cannot open '$file'";
++            return;
++      }
+     } else {
+       unless(open(FH,"< $file")) {
+             warn "Cannot open '$file'";
+@@ -45,8 +51,12 @@ sub process_file {
+ sub get_files {
+     my %file = ();
+-    # VMS keeps its include files in system libraries (well, except for Gcc)
+-    if ($^O eq 'VMS') {
++    if ($^O eq 'linux') {
++      # Some Linuxes have weird errno.hs which generate
++      # no #file or #line directives
++      $file{'/usr/include/errno.h'} = 1;
++    } elsif ($^O eq 'VMS') {
++      # VMS keeps its include files in system libraries (well, except for Gcc)
+       if ($Config{vms_cc_type} eq 'decc') {
+           $file{'Sys$Library:DECC$RTLDEF.TLB'} = 1;
+       } elsif ($Config{vms_cc_type} eq 'vaxc') {
+EOPATCH
+        }
+    }
+}
+
+sub patch_t {
+    if ($^O eq 'darwin') {
+        # This has # $x = `$^X -le "print 'hi there'"`;
+        # and it needs to pass for the automated validation self-test:
+        edit_file('t/base/term.t', sub {
+                      my $code = shift;
+                      $code =~ s/`(\$\^X )/`$aggressive_apple_security$1/;
+                      return $code;
+                  });
+    }
 }
 
 sub apply_fixups {
diff --git a/gnu/usr.bin/perl/Porting/checkAUTHORS.pl b/gnu/usr.bin/perl/Porting/checkAUTHORS.pl
deleted file mode 100755 (executable)
index bd70e07..0000000
+++ /dev/null
@@ -1,1270 +0,0 @@
-#!/usr/bin/perl -w
-package Porting::checkAUTHORS;
-use strict;
-use warnings;
-
-use v5.026;
-
-use utf8;
-use Getopt::Long;
-use Unicode::Collate;
-use Text::Wrap;
-$Text::Wrap::columns = 80;
-
-my ($committer, $patch, $author);
-my ($rank, $ta, $ack, $who, $tap, $update) = (0) x 6;
-my ($percentage, $cumulative, $reverse);
-my (%authors, %untraced, %patchers, %committers, %real_names);
-my ( $from_commit, $to_commit );
-my ( $map, $preferred_email_or_github );
-my $AUTHORS_header;
-my $author_file= './AUTHORS';
-
-sub main {
-    my $result = GetOptions (
-                 # modes
-                 "who"            => \$who,
-                 "rank"           => \$rank,
-                 "thanks-applied" => \$ta,
-                 "missing"        => \$ack ,
-                 "tap"            => \$tap,
-                 "update"         => \$update,
-
-                 # modifiers
-                 "authors=s"      => \$author_file,
-                 "percentage"     => \$percentage,      # show as %age
-                 "cumulative"     => \$cumulative,
-                 "reverse"        => \$reverse,
-                 "from=s"         => \$from_commit,
-                 "to=s"           => \$to_commit,
-
-                );
-
-
-    my $has_from_commit = defined $from_commit ? 1 : 0;
-
-    if ( !$result # GetOptions failed
-        or ( $rank + $ta + $who + $ack + $tap + $update != 1 ) # use one and one exactly 'mode'
-        or !( scalar @ARGV + $has_from_commit )  # gitlog provided from --from or stdin
-        ) {
-        usage();
-    }
-
-    die "Can't locate '$author_file'. Specify it with '--authors <path>'."
-      unless -f $author_file;
-
-    ( $map, $preferred_email_or_github ) = generate_known_author_map();
-
-    my $preserve_case = $update ? 1 : 0;
-    my $AUTHORS_header = read_authors_file($author_file, $preserve_case);
-
-    if ($rank) {
-      parse_commits();
-      display_ordered(\%patchers);
-    } elsif ($ta) {
-      parse_commits();
-      display_ordered(\%committers);
-    } elsif ($tap) {
-      parse_commits_authors();
-      display_test_output(\%patchers, \%authors, \%real_names);
-    } elsif ($ack) {
-      parse_commits();
-      display_missing_authors(\%patchers, \%authors, \%real_names);
-    } elsif ($who) {
-      parse_commits();
-      list_authors(\%patchers, \%authors);
-    } elsif ( $update ) {
-      update_authors_files( \%authors, $map, $preferred_email_or_github, $author_file );
-    } else {
-        die "unknown mode";
-    }
-
-    exit(0);
-}
-
-main() unless caller;
-
-sub usage {
-
-  die <<"EOS";
-Usage: $0 [modes] [modifiers] <git-log-output-file>
-
-Modes (use only one):
-   --who                          # show list of unique authors by full name
-   --rank                         # rank authors by patches
-   --thanks-applied               # ranks committers of others' patches
-   --missing                      # display authors not in AUTHORS
-   --tap                          # show authors present/missing as TAP
-   --update                       # update the AUTHORS file with missing
-
-Modifiers:
-   --authors <authors-file>       # path to authors file (default: ./AUTHORS)
-   --percentage                   # show rankings as percentages
-   --cumulative                   # show rankings cumulatively
-   --reverse                      # show rankings in reverse
-   --from                         # git commit ID used for 'git log' source (use file from STDIN when missing)
-   --to[=HEAD]                    # git commit ID used for 'git log' destination, default to HEAD.
-
-Sample Usages:
-
-  \$ perl Porting/checkAUTHORS.pl --who --from=v5.31.6 --to=v5.31.7
-  \$ perl Porting/checkAUTHORS.pl --rank --percentage --from=v5.31.6
-  \$ perl Porting/checkAUTHORS.pl --thanks-applied --from=v5.31.6
-  \$ perl Porting/checkAUTHORS.pl --missing --from=v5.31.6
-  \$ perl Porting/checkAUTHORS.pl --tap --from=v5.31.6
-  \$ perl Porting/checkAUTHORS.pl --update --from=v5.31.6
-
-or the split int two and generate your own git log output
-
-Generate git-log-output-file with git log --pretty=fuller rev1..rev2
-(or pipe by specifying '-' for stdin).  For example:
-  \$ git log --pretty=fuller v5.31.6..v5.31.7 > gitlog
-  \$ perl Porting/checkAUTHORS.pl --rank --percentage gitlog
-
-
-EOS
-}
-
-sub list_authors {
-    my ($patchers, $authors) = @_;
-    binmode(STDOUT, ":utf8");
-    print wrap '', '', join(', ', Unicode::Collate->new(level => 1)->sort(
-                      map { $authors->{$_} }
-                      grep { length $_ > 1 } # skip the exception '!' and '?'
-                      keys %$patchers)) . ".\n";
-}
-
-# use --from [and --to] if provided
-# otherwise fallback to stdin for backward compatibility
-sub _git_log {
-    if ( length $from_commit ) {
-        my ( $from, $to ) = ( $from_commit, $to_commit );
-        $to //= 'HEAD';
-        my $gitlog = [ qx{git log --pretty=fuller $from..$to} ];
-        die "git log failed: $!" unless $? == 0;
-        return $gitlog;
-    }
-
-    return [ <> ];
-}
-
-sub parse_commits {
-    my ( $process ) = @_;
-
-    $process //= \&process; # default processor
-
-    my $git_log = _git_log();
-
-    my @lines = split( /^commit\s*/sm, join( '', $git_log->@* ) );
-    foreach (@lines) {
-        next if m/^$/;
-        next if m/^(\S*?)^Merge:/ism;    # skip merge commits
-        if (m/^(.*?)^Author:\s*(.*?)^AuthorDate:\s*.*?^Commit:\s*(.*?)^(.*)$/gism) {
-
-            # new patch
-            ( $patch, $author, $committer ) = ( $1, $2, $3 );
-            chomp($author);
-            unless ($author) { die $_ }
-            chomp($committer);
-            unless ($committer) { die $_ }
-
-            $process->( $committer, $patch, $author );
-        } else {
-            die "XXX $_ did not match";
-        }
-    }
-
-    return;
-}
-
-# just grab authors. Quicker than parse_commits
-
-sub parse_commits_authors {
-
-    my $git_log = _git_log();
-
-    foreach ($git_log->@*) {
-        next unless /^Author:\s*(.*)$/;
-        my $author = $1;
-        $author = _raw_address($author);
-        $patchers{$author}++;
-    }
-
-    return;
-}
-
-sub generate_known_author_map {
-    my %map;
-
-    my %preferred_email_or_github;
-
-    my $previous_name = "";
-    my $previous_preferred_contact = "";
-    while (<DATA>) {
-        next if m{^\s*#};
-
-        chomp;
-        s/\\100/\@/g;
-
-        $_ = lc;
-        if ( my ( $name, $contact ) = /^\s*([^#\s]\S*)\s+(.*\S)/ ) {
-
-            $name =~ s/^\\043/#/;
-            # use the previous stored email if the line starts by a '+'
-            if   ( $name eq '+' ) {
-                $name             = $previous_name;
-            }
-            else {
-                $previous_name              = $name;
-                $previous_preferred_contact = $contact;
-                if ( index($name, '@' ) > 0 ) {
-                    # if name is an email, then this is our preferred email... legacy list
-                    $previous_preferred_contact = $name;
-                }
-            }
-
-            $map{$contact} = $name;
-
-            if ( $contact ne $previous_preferred_contact ) {
-                $preferred_email_or_github{$contact} = $previous_preferred_contact;
-            }
-            if ( $name ne '+' ) {
-                $preferred_email_or_github{$name} = $previous_preferred_contact;
-            }
-        }
-    }
-
-    #
-    # Email addresses for we do not have names.
-    #
-    $map{$_} = "?"
-        for
-        "bah\100longitude.com",
-        "bbucklan\100jpl-devvax.jpl.nasa.gov",
-        "bilbo\100ua.fm",
-        "bob\100starlabs.net",
-        "cygwin\100cygwin.com",
-        "david\100dhaller.de", "erik\100cs.uni-jena.de", "info\100lingo.kiev.ua",    # Lingo Translation agency
-        "jms\100mathras.comcast.net",
-        "premchai21\100yahoo.com",
-        "pxm\100nubz.org",
-        "raf\100tradingpost.com.au",
-        "smoketst\100hp46t243.cup.hp.com", "root\100chronos.fi.muni.cz",             # no clue - jrv 20090803
-        "gomar\100md.media-web.de",    # no clue - jrv 20090803
-        "data-drift\100so.uio.no",     # no data. originally private message from 199701282014.VAA12645@selters.uio.no
-        "arbor\100al37al08.telecel.pt"
-        ,    # reported perlbug ticket 5196 - no actual code contribution. no real name - jrv 20091006
-        "oracle\100pcr8.pcr.com",    # Reported perlbug ticket 1015 - no patch - Probably Ed Eddington ed@pcr.com
-        "snaury\100gmail.com",       # Reported cpan ticket 35943, with patch for fix
-        ;
-
-    #
-    # Email addresses for people that don't have an email address in AUTHORS
-    # Presumably deliberately?
-    #
-
-    $map{$_} = '!' for
-
-        # Nick Ing-Simmons has passed away (2006-09-25).
-        "nick\100ing-simmons.net",
-        "nik\100tiuk.ti.com",
-        "nick.ing-simmons\100elixent.com",
-        "nick\100ni-s.u-net.com",
-        "nick.ing-simmons\100tiuk.ti.com",
-
-        # Iain Truskett has passed away (2003-12-29).
-        "perl\100dellah.anu.edu.au", "spoon\100dellah.org", "spoon\100cpan.org",
-
-        # Ton Hospel
-        "me-02\100ton.iguana.be", "perl-5.8.0\100ton.iguana.be", "perl5-porters\100ton.iguana.be",
-
-        # Beau Cox
-        "beau\100beaucox.com",
-
-        # Randy W. Sims
-        "ml-perl\100thepierianspring.org",
-
-        # Jason Hord
-        "pravus\100cpan.org",
-
-        # perl internal addresses
-        "perl5-porters\100africa.nicoh.com",
-        "perlbug\100perl.org",,
-        "perl5-porters.nicoh.com",
-        "perlbug-followup\100perl.org",
-        "perlbug-comment\100perl.org",
-        "bug-module-corelist\100rt.cpan.org",
-        "bug-storable\100rt.cpan.org",
-        "bugs-perl5\100bugs6.perl.org",
-        "unknown",
-        "unknown\100unknown",
-        "unknown\100longtimeago",
-        "unknown\100perl.org",
-        "",
-        "(none)",
-        ;
-
-    return ( \%map, \%preferred_email_or_github );
-}
-
-sub read_authors_file {
-    my ( $filename, $preserve_case ) = @_;
-    return unless defined $filename;
-
-    my @headers;
-
-    my (%count, %raw);
-    {
-        open my $fh, '<', $filename or die "Can't open $filename: $!";
-        binmode $fh, ':encoding(UTF-8)';
-        my $in_header = 1;
-        while (<$fh>) {
-            next if /^\#/;
-            do { $in_header = 0; next } if /^-- /;
-            if (/^([^<]+)<([^>]+)>/) {
-                # Easy line.
-                my ($name, $email) = ($1, $2);
-                $name =~ s/\s*\z//;
-                $raw{$email} = $name;
-                $count{$email}++;
-            } elsif ( /^([^@]+)\s+(\@\S+)\s*$/ ) {
-                my ($name, $github) = ($1, $2);
-                $name =~ s/\s*\z//;
-                $raw{$github} = $name;
-                $count{$github}++;
-            } elsif (/^([- .'\w]+)[\t\n]/) {
-
-                # Name only
-                $untraced{$1}++;
-            } elsif ( length $_ ) {
-                chomp;
-                warn "Can't parse line '$_'";
-            } else {
-                next;
-            }
-        }
-        continue {
-            push @headers, $_ if $in_header;
-        }
-    }
-    foreach my $contact ( sort keys %raw ) {
-        print "E-mail $contact occurs $count{$contact} times\n" if $count{$contact} > 1;
-        my $lc = lc $contact;
-        my $key = $preserve_case ? $contact : $lc;
-        $authors{ $map->{$lc} || $key } = $raw{$contact};
-    }
-    $authors{$_} = $_ for qw(? !);
-
-    push @headers, '-- ', "\n";
-
-    return join( '', @headers );
-}
-
-sub update_authors_files {
-    my ( $authors, $known_authors, $preferred_email_or_github, $author_file ) = @_;
-
-    die qq[Cannot find AUTHORS file '$author_file'] unless -f $author_file;
-    binmode(STDOUT, ":utf8");
-
-    # add missing authors from the recent commits
-    _detect_new_authors_from_recent_commit( $authors, $known_authors );
-
-    my @author_names = sort { $a cmp $b } values %$authors;
-    my $maxlen = length [ sort { length $b <=> length $a } @author_names ]->[0];
-
-    my @list;
-    foreach my $github_or_email ( sort keys %authors ) {
-
-        next if length $github_or_email == 1;
-
-        my $name = $authors{$github_or_email};
-        $name =~ s{\s+$}{};
-
-        #$github_or_email = $known_authors->{ $github_or_email } // $github_or_email;
-        $github_or_email = $preferred_email_or_github->{ $github_or_email } // $github_or_email;
-
-        if ( index( $github_or_email, '@' ) != 0 ) { # preserve '<>' for unicode consortium
-            $github_or_email = '<' . $github_or_email . '>';
-        }
-
-        push @list, sprintf( "%-${maxlen}s %s\n", $name, $github_or_email);
-    }
-
-    # preserve the untraced authors :-) [without email or GitHub account]
-    push @list, map { "$_\n" } keys %untraced;
-
-    {
-        open my $fh, '>', $author_file or die "Can't open $author_file: $!";
-        binmode $fh, ':raw:encoding(UTF-8)';
-
-        print {$fh} $AUTHORS_header;
-
-        map { print {$fh} $_ } sort { lc $a cmp lc $b } @list;
-
-        close $fh;
-
-    }
-
-    return;
-}
-
-# read all recent commits and check if the author email is known
-#   if the email is unknown add the author's GitHub account if possible or his email
-sub _detect_new_authors_from_recent_commit {
-    my ( $authors, $known_authors ) = @_;
-
-    my $check_if_email_known = sub {
-        my ( $email ) = @_;
-
-        my $preferred = $map->{$email} // $map->{lc $email}
-            // $preferred_email_or_github->{$email}
-            // $preferred_email_or_github->{lc $email}
-            // $email;
-
-        return $authors{$preferred} || $authors{ lc $preferred } ? 1 : 0;
-    };
-
-    my $already_checked = {};
-    my $process = sub {
-        my ( $committer, $patch, $author ) = @_;
-
-        foreach my $person ( $author, $committer ) {
-            next unless length $person;
-            next if $already_checked->{$person};
-            $already_checked->{$person} = 1;
-
-            my $is_author = $person eq $author;
-
-            if ( $person =~ m{^(.+)\s+<(.+)>$} ) {
-                my ( $name, $email ) = ( $1, $2 );
-
-                # skip unicode consortium and bad emails
-                if ( index( $email, '@' ) <= 0 ) {
-                    warn "# Skipping new author: $person - bad email";
-                    next;
-                }
-
-                next if $check_if_email_known->( $email );
-
-                # for new users we would prefer using the GitHub account
-                my $github_or_email = _commit_to_github_id( $patch, $is_author ) // $email;
-
-                next if $check_if_email_known->( $github_or_email );
-
-                print "# Detected a new author: $name using email $email [ $github_or_email ]\n";
-                $authors{$github_or_email} = $name; # add it to the list of authors
-            } else {
-                warn "Fail to parse author: $person";
-            }
-        }
-    };
-
-    parse_commits( $process );
-
-    return;
-}
-
-sub _commit_to_github_id {
-    my ( $commit, $is_author ) = @_;
-
-    chomp $commit if defined $commit;
-    return unless length $commit;
-
-    eval { require HTTP::Tiny; 1 } or do {
-        warn "HTTP::Tiny is missing, cannot detect GitHub account from commit id.";
-        no warnings;
-        *_commit_to_github_id = sub {};
-        return;
-    };
-
-    my $github_url_for_commit = q[https://github.com/Perl/perl5/commit/] . $commit;
-    my $response = HTTP::Tiny->new->get( $github_url_for_commit );
-
-    if ( ! $response->{success} ) {
-        warn "HTTP Request Failed: '$github_url_for_commit'";
-        return;
-    }
-
-    my $content = $response->{content} // '';
-
-    # poor man scrapping - probably have to be improved over time
-    # try to parse something like: <a href="/Perl/perl5/commits?author=ThisIsMyGitHubID"
-    my @github_ids; # up to two entries author and committer
-    while ( $content =~ s{\Q<a href="/Perl/perl5/commits?author=\E(.+)"}{} ) {
-        push @github_ids, '@' . $1;
-    }
-
-    warn "Found more than two github ids for $github_url_for_commit" if scalar @github_ids > 2;
-
-    return $github_ids[0] if $is_author;
-    if ( !$is_author && scalar @github_ids >= 2 ) {
-        return $github_ids[1]; # committer is the second entry
-    }
-
-    return $github_ids[0];
-}
-
-
-sub display_test_output {
-    my $patchers   = shift;
-    my $authors    = shift;
-    my $real_names = shift;
-    my $count = 0;
-    printf "1..%d\n", scalar keys %$patchers;
-
-    foreach my $email ( sort keys %$patchers ) {
-        $count++;
-        if ($authors->{$email}) {
-            print "ok $count - ".$real_names->{$email} ." $email\n";
-        } else {
-            print "not ok $count - Contributor not found in AUTHORS. ",
-                  ($real_names->{$email} || '???' )." $email\n",
-                  "# To fix run Porting/updateAUTHORS.pl and then review",
-                  " and commit the result.\n";
-            print STDERR "# ", ($real_names->{$email} || '???' ), " <$email>",
-                  " not found in AUTHORS.\n",
-                  "# To fix run Porting/updateAUTHORS.pl and then review",
-                  " and commit the result.\n";
-        }
-    }
-
-    return;
-}
-
-sub display_missing_authors {
-    my $patchers   = shift;
-    my $authors    = shift;
-    my $real_names = shift;
-    my %missing;
-    foreach ( sort keys %$patchers ) {
-        next if $authors->{$_};
-
-        # Sort by number of patches, then name.
-        $missing{ $patchers{$_} }->{$_}++;
-    }
-    foreach my $patches ( sort { $b <=> $a } keys %missing ) {
-        print "\n\n=head1 $patches patch(es)\n\n";
-        foreach my $author ( sort keys %{ $missing{$patches} } ) {
-            my $xauthor = $author;
-            $xauthor =~ s/@/\\100/g;    # xxx temp hack
-            print "" . ( $real_names->{$author} || $author ) . "\t\t\t<" . $xauthor . ">\n";
-        }
-    }
-
-    return;
-}
-
-sub display_ordered {
-    my $what = shift;
-    my @sorted;
-    my $total;
-
-    while ( my ( $name, $count ) = each %$what ) {
-        push @{ $sorted[$count] }, $name;
-        $total += $count;
-    }
-
-    my $i = @sorted;
-    return unless @sorted;
-    my $sum = 0;
-    foreach my $i ( $reverse ? 0 .. $#sorted : reverse 0 .. $#sorted ) {
-        next unless $sorted[$i];
-        my $prefix;
-        $sum += $i * @{ $sorted[$i] };
-
-        # Value to display is either this one, or the cumulative sum.
-        my $value = $cumulative ? $sum : $i;
-        if ($percentage) {
-            $prefix = sprintf "%6.2f:\t", 100 * $value / $total;
-        } else {
-            $prefix = "$value:\t";
-        }
-        print wrap ( $prefix, "\t", join( " ", sort @{ $sorted[$i] } ), "\n" );
-    }
-
-    return;
-}
-
-sub process {
-    my ( $committer, $patch, $author ) = @_;
-    return unless $author;
-    return unless $committer;
-
-    $author = _raw_address($author);
-    $patchers{$author}++;
-
-    $committer = _raw_address($committer);
-    if ( $committer ne $author ) {
-
-        # separate commit credit only if committing someone else's patch
-        $committers{$committer}++;
-    }
-
-    return;
-}
-
-sub _raw_address {
-    my $addr = shift;
-    my $real_name;
-    if ($addr =~ /(?:\\?")?\s*\(via RT\) <perlbug-followup\@perl\.org>$/p) {
-        my $name = ${^PREMATCH};
-        $addr = 'perlbug-followup@perl.org';
-        #
-        # Try to find the author
-        #
-        if (exists $map->{$name}) {
-            $addr = $map->{$name};
-            $real_name = $authors{$addr};
-        }
-        else {
-            while (my ($email, $author_name) = each %authors) {
-                if ($name eq $author_name) {
-                    $addr = $email;
-                    $real_name = $name;
-                    last;
-                }
-            }
-        }
-    }
-    elsif ( $addr =~ /<.*>/ ) {
-        $addr =~ s/^\s*(.*)\s*<\s*(.*?)\s*>.*$/$2/;
-        $real_name = $1;
-    }
-    $addr =~ s/\[mailto://;
-    $addr =~ s/\]//;
-    $addr = lc $addr;
-    $addr = $map->{$addr} || $addr;
-    $addr =~ s/\\100/@/g;    # Sometimes, there are encoded @ signs in the git log.
-
-    if ($real_name) { $real_names{$addr} = $real_name }
-
-    return $addr;
-}
-
-1; # make sure we return true in case we are required.
-__DATA__
-
-#
-# List of mappings. First entry the "correct" email address or GitHub account,
-# as appears in the AUTHORS file. Other lines are "alias" mapped to it.
-#
-# If the "correct" email address is a '+', the entry above it is reused;
-# this for addresses with more than one alias.
-#
-# Note that all entries are in lowercase. Further, no '@' signs should
-# appear; use \100 instead.
-#
-#
-#  Committers.
-#
-adamh                                   \100BytesGuy
-+                                       bytesguy\100users.noreply.github.com
-+                                       git\100ahartley.com
-adi                                     enache\100rdslink.ro
-alanbur                                 alan.burlison\100sun.com
-+                                       alan.burlison\100uk.sun.com
-+                                       aburlison\100cix.compulink.co.uk
-ams                                     ams\100toroid.org
-+                                       ams\100wiw.org
-atoomic                                 \100atoomic
-+                                       atoomic\100cpan.org
-+                                       cpan\100atoomic.org
-+                                       nicolas\100atoomic.org
-chip                                    chip\100pobox.com
-+                                       chip\100perl.com
-+                                       salzench\100nielsenmedia.com
-+                                       chip\100atlantic.net
-+                                       chip\100rio.atlantic.net
-+                                       salzench\100dun.nielsen.com
-+                                       chip\100ci005.sv2.upperbeyond.com
-craigb                                  craigberry\100mac.com
-+                                       craig.berry\100metamorgs.com
-+                                       craig.berry\100signaltreesolutions.com
-+                                       craig.berry\100psinetcs.com
-+                                       craig.a.berry\100gmail.com
-+                                       craig a. berry)
-davem                                   davem\100iabyn.nospamdeletethisbit.com
-+                                       davem\100fdgroup.com
-+                                       davem\100iabyn.com
-+                                       davem\100fdgroup.co.uk
-+                                       davem\100fdisolutions.com
-+                                       davem\100iabyn.com
-demerphq                                demerphq\100gmail.com
-+                                       yves.orton\100de.mci.com
-+                                       yves.orton\100mciworldcom.de
-+                                       yves.orton\100booking.com
-+                                       demerphq\100dromedary.booking.com
-+                                       demerphq\100gemini.(none)
-+                                       demerphq\100camel.booking.com
-+                                       demerphq\100hotmail.com
-doughera                                doughera\100lafayette.edu
-+                                       doughera\100lafcol.lafayette.edu
-+                                       doughera\100fractal.phys.lafayette.edu
-+                                       doughera.lafayette.edu
-+                                       doughera\100newton.phys.lafayette.edu
-
-gbarr                                   gbarr\100pobox.com
-+                                       bodg\100tiuk.ti.com
-+                                       gbarr\100ti.com
-+                                       graham.barr\100tiuk.ti.com
-+                                       gbarr\100monty.mutatus.co.uk
-gisle                                   gisle\100aas.no
-+                                       gisle\100activestate.com
-+                                       aas\100aas.no
-+                                       aas\100bergen.sn.no
-gsar                                    gsar\100cpan.org
-+                                       gsar\100activestate.com
-+                                       gsar\100engin.umich.edu
-hv                                      hv\100crypt.org
-+                                       hv\100crypt.compulink.co.uk
-+                                       hv\100iii.co.uk
-jhi                                     jhi\100iki.fi
-+                                       jhietaniemi\100gmail.com
-+                                       jhi\100kosh.hut.fi
-+                                       jhi\100alpha.hut.fi
-+                                       jhi\100cc.hut.fi
-+                                       jhi\100hut.fi
-+                                       jarkko.hietaniemi\100nokia.com
-+                                       jarkko.hietaniemi\100cc.hut.fi
-+                                       jarkko.hietaniemi\100booking.com
-jesse                                   jesse\100fsck.com
-+                                       jesse\100bestpractical.com
-+                                       jesse\100perl.org
-merijn                                  h.m.brand\100xs4all.nl
-+                                       h.m.brand\100procura.nl
-+                                       merijn.brand\100procura.nl
-+                                       h.m.brand\100hccnet.nl
-+                                       merijn\100l1.procura.nl
-+                                       merijn\100a5.(none)
-+                                       perl5\100tux.freedom.nl
-mhx                                     mhx-perl\100gmx.net
-+                                       mhx\100r2d2.(none)
-+                                       mhx\100cpan.org
-mst                                     mst\100shadowcat.co.uk
-+                                       matthewt\100hercule.scsys.co.uk
-nicholas                                nick\100ccl4.org
-+                                       nick\100unfortu.net
-+                                       nick\100talking.bollo.cx
-+                                       nick\100plum.flirble.org
-+                                       nick\100babyhippo.co.uk
-+                                       nick\100bagpuss.unfortu.net
-+                                       nick\100babyhippo.com
-+                                       nicholas\100dromedary.ams6.corp.booking.com
-+                                       Nicholas Clark (sans From field in mail header)
-pudge                                   pudge\100pobox.com
-rgs                                     rgs@consttype.org
-+                                       rgarciasuarez\100free.fr
-+                                       rgarciasuarez\100mandrakesoft.com
-+                                       rgarciasuarez\100mandriva.com
-+                                       rgarciasuarez\100gmail.com
-+                                       raphel.garcia-suarez\100hexaflux.com
-sky                                     artur\100contiller.se
-+                                       sky\100nanisky.com
-+                                       arthur\100contiller.se
-smueller                                smueller\100cpan.org
-+                                       7k8lrvf02\100sneakemail.com
-+                                       kjx9zthh3001\100sneakemail.com
-+                                       dtr8sin02\100sneakemail.com
-+                                       rt8363b02\100sneakemail.com
-+                                       o6hhmk002\100sneakemail.com
-+                                       l2ot9pa02\100sneakemail.com
-+                                       wyp3rlx02\100sneakemail.com
-+                                       0mgwtfbbq\100sneakemail.com
-+                                       xyey9001\100sneakemail.com
-steveh                                  steve.m.hay\100googlemail.com
-+                                       stevehay\100planit.com
-+                                       steve.hay\100uk.radan.com
-stevep                                  steve\100fisharerojo.org
-+                                       steve.peters\100gmail.com
-+                                       root\100dixie.cscaper.com
-timb                                    Tim.Bunce\100pobox.com
-+                                       tim.bunce\100ig.co.uk
-tonyc                                   tony\100develop-help.com
-+                                       tony\100openbsd32.tony.develop-help.com
-+                                       tony\100saturn.(none)
-
-#
-# Mere mortals.
-#
-\043####\100juerd.nl                    juerd\100cpan.org
-+                                       juerd\100c3.convolution.nl
-+                                       juerd\100convolution.nl
-a.r.ferreira\100gmail.com               aferreira\100shopzilla.com
-abe\100ztreet.demon.nl                  abeltje\100cpan.org
-abela\100hsc.fr                         abela\100geneanet.org
-abigail\100abigail.be                   abigail\100foad.org
-+                                       abigail\100abigail.nl
-+                                       abigail\100fnx.com
-aburt\100isis.cs.du.edu                 isis!aburt
-ach\100mpe.mpg.de                       ach\100rosat.mpe-garching.mpg.de
-adavies\100ptc.com                      alex.davies\100talktalk.net
-ajohnson\100nvidia.com                  ajohnson\100wischip.com
-+                                       anders\100broadcom.com
-alexm\100netli.com                      alexm\100w-m.ru
-alex-p5p\100earth.li                    alex\100rcon.rog
-alexmv\100mit.edu                       alex\100chmrr.net
-alian\100cpan.org                       alian\100alianwebserver.com
-allen\100grumman.com                    allen\100gateway.grumman.com
-allen\100huarp.harvard.edu              nort\100bottesini.harvard.edu
-+                                       nort\100qnx.com
-allens\100cpan.org                      easmith\100beatrice.rutgers.edu
-+                                       root\100dogberry.rutgers.edu
-ambs\100cpan.org                        hashashin\100gmail.com
-andrea                                  a.koenig@mind.de
-+                                       andreas.koenig\100anima.de
-+                                       andreas.koenig.gmwojprw\100franz.ak.mind.de
-+                                       andreas.koenig.7os6vvqr\100franz.ak.mind.de
-+                                       a.koenig\100mind.de
-+                                       k\100anna.in-berlin.de
-+                                       andk\100cpan.org
-+                                       koenig\100anna.mind.de
-+                                       k\100anna.mind.de
-+                                       root\100ak-71.mind.de
-+                                       root\100ak-75.mind.de
-+                                       k\100sissy.in-berlin.de
-+                                       a.koenig\100kulturbox.de
-+                                       k\100sissy.in-berlin.de
-+                                       root\100dubravka.in-berlin.de
-anno4000\100lublin.zrz.tu-berlin.de     anno4000\100mailbox.tu-berlin.de
-+                                       siegel\100zrz.tu-berlin.de
-apocal@cpan.org                         perl\1000ne.us
-arnold\100gnu.ai.mit.edu                arnold\100emoryu2.arpa
-+                                       gatech!skeeve!arnold
-arodland\100cpan.org                    andrew\100hbslabs.com
-arussell\100cs.uml.edu                  adam\100adam-pc.(none)
-ash\100cpan.org                         ash_cpan\100firemirror.com
-avar                                    avar\100cpan.org
-+                                       avarab\100gmail.com
-bailey\100newman.upenn.edu              bailey\100hmivax.humgen.upenn.edu
-+                                       bailey\100genetics.upenn.edu
-+                                       bailey.charles\100gmail.com
-bah\100ecnvantage.com                   bholzman\100longitude.com
-barries\100slaysys.com                  root\100jester.slaysys.com
-bkedryna\100home.com                    bart\100cg681574-a.adubn1.nj.home.com
-bcarter\100gumdrop.flyinganvil.org      q.eibcartereio.=~m-b.{6}-cgimosx\100gumdrop.flyinganvil.org
-ben_tilly\100operamail.com              btilly\100gmail.com
-+                                       ben_tilly\100hotmail.com
-ben\100morrow.me.uk                     mauzo\100csv.warwick.ac.uk
-+                                       mauzo\100.(none)
-bepi\100perl.it                         enrico.sorcinelli\100gmail.com
-bert\100alum.mit.edu                    bert\100genscan.com
-bigbang7\100gmail.com                   ddascalescu+github\100gmail.com
-blgl\100stacken.kth.se                  blgl\100hagernas.com
-+                                       2bfjdsla52kztwejndzdstsxl9athp\100gmail.com
-b@os13.org                              brad+github\10013os.net
-khw\100cpan.org                         khw\100karl.(none)
-brian.d.foy\100gmail.com                bdfoy\100cpan.org
-BQW10602\100nifty.com                   sadahiro\100cpan.org
-bulk88\100hotmail.com                   bulk88
-
-chad.granum\100dreamhost.com            exodist7\100gmail.com
-choroba\100cpan.org                     choroba\100weed.(none)
-+                                       choroba\100matfyz.cz
-chromatic\100wgz.org                    chromatic\100rmci.net
-ckuskie\100cadence.com                  colink\100perldreamer.com
-claes\100surfar.nu                      claes\100versed.se
-clintp\100geeksalad.org                 cpierce1\100ford.com
-clkao\100clkao.org                      clkao\100bestpractical.com
-corion\100corion.net                    corion\100cpan.org
-+                                       github@corion.net
-cp\100onsitetech.com                    publiustemp-p5p\100yahoo.com
-+                                       publiustemp-p5p3\100yahoo.com
-+                                       ovid\100cpan.org
-cpan\100audreyt.org                     autrijus\100egb.elixus.org
-+                                       autrijus\100geb.elixus.org
-+                                       autrijus\100gmail.com
-+                                       autrijus\100ossf.iis.sinica.edu.tw
-+                                       autrijus\100autrijus.org
-+                                       audreyt\100audreyt.org
-cpan\100ton.iguana.be                   me-01\100ton.iguana.be
-crt\100kiski.net                        perl\100ctweten.amsite.com
-cp\100onsitetech.com                    ovid\100cpan.org
-dairiki\100dairiki.org                  dairiki at dairiki.org
-dagolden\100cpan.org                    xdaveg\100gmail.com
-+                                       xdg\100xdg.me
-damian\100conway.org                    damian\100cs.monash.edu.au
-dan\100sidhe.org                        sugalsd\100lbcc.cc.or.us
-+                                       sugalskd\100osshe.edu
-daniel\100bitpusher.com                 daniel\100biz.bitpusher.com
-dave\100mag-sol.com                     dave\100dave.org.uk
-+                                       dave\100perlhacks.com
-david.dyck\100fluke.com                 dcd\100tc.fluke.com
-david\100justatheory.com                david\100wheeler.net
-+                                       david\100kineticode.com
-+                                       david\100wheeler.com
-+                                       david\100wheeler.net
-whatever\100davidnicol.com              davidnicol\100gmail.com
-dennis\100booking.com                   dennis\100camel.ams6.corp.booking.com
-+                                      dennis.kaarsemaker\100booking.com
-+                                       dennis\100kaarsemaker.net
-dev-perl\100pimb.org                    knew-p5p\100pimb.org
-+                                       lists-p5p\100pimb.org
-djberg86\100attbi.com                   djberg96\100attbi.com
-dk\100tetsuo.karasik.eu.org             dmitry\100karasik.eu.org
-dma+github@stripysock.com               dominichamon@users.noreply.github.com
-dom\100earth.li                         dom\100semmle.com
-domo\100computer.org                    shouldbedomo\100mac.com
-+                                       domo\100slipper.ip.lu
-+                                       domo\100tcp.ip.lu
-dougm\100covalent.net                   dougm\100opengroup.org
-+                                       dougm\100osf.org
-dougw\100cpan.org                       doug_wilson\100intuit.com
-dwegscheid\100qtm.net                   wegscd\100whirlpool.com
-edwardp\100excitehome.net               epeschko\100den-mdev1
-+                                       epeschko\100elmer.tci.com
-+                                       esp5\100pge.com
-egf7\100columbia.edu                    efifer\100sanwaint.com
-eggert\100twinsun.com                   eggert\100sea.sm.unisys.com
-etj\100cpan.org                         mohawk2\100users.noreply.github.com
-
-fugazi\100zyx.net                       larrysh\100cpan.org
-+                                       lshatzer\100islanddata.com
-
-gbacon\100itsc.uah.edu                  gbacon\100adtrn-srv4.adtran.com
-gerberb\100zenez.com                    root\100devsys0.zenez.com
-gfuji\100cpan.org                       g.psy.va\100gmail.com
-genesullivan50\100yahoo.com             gsullivan\100cpan.org
-gerard\100ggoossen.net                  gerard\100tty.nl
-gibreel\100pobox.com                    stephen.zander\100interlock.mckesson.com
-+                                       srz\100loopback
-gideon\100cpan.org                      gidisrael\100gmail.com
-gnat\100frii.com                        gnat\100prometheus.frii.com
-gp\100familiehaase.de                   gerrit\100familiehaase.de
-grazz\100pobox.com                      grazz\100nyc.rr.com
-gward\100ase.com                        greg\100bic.mni.mcgill.ca
-haggai\100cpan.org                      alanhaggai\100alanhaggai.org
-+                                       alanhaggai\100gmail.com
-hansmu\100xs4all.nl                     hansm\100icgroup.nl
-+                                       hansm\100icgned.nl
-+                                       hans\100icgned.nl
-+                                       hans\100icgroup.nl
-+                                       hansm\100euronet.nl
-+                                       hansm\100euro.net
-hio\100ymir.co.jp                       hio\100hio.jp
-hops\100sco.com                         hops\100scoot.pdev.sco.com
-
-ian.goodacre\100xtra.co.nz              ian\100debian.lan
-ingo_weinhold\100gmx.de                 bonefish\100cs.tu-berlin.de
-
-james\100mastros.biz                    theorb\100desert-island.me.uk
-jan\100jandubois.com                    jand\100activestate.com
-+                                       jan.dubois\100ibm.net
-japhy\100pobox.com                      japhy\100pobox.org
-+                                       japhy\100perlmonk.org
-+                                       japhy\100cpan.org
-+                                       jeffp\100crusoe.net
-jari.aalto\100poboxes.com               jari.aalto\100cante.net
-jarausch\100numa1.igpm.rwth-aachen.de   helmutjarausch\100unknown
-jasons\100cs.unm.edu                    jasons\100sandy-home.arc.unm.edu
-jbuehler\100hekimian.com                jhpb\100hekimian.com
-jcromie\100cpan.org                      jcromie\100100divsol.com
-+                                       jim.cromie\100gmail.com
-jd\100cpanel.net                        lightsey\100debian.org
-+                                       john\10004755.net
-+                                       john\100nixnuts.net
-jdhedden\100cpan.org                    jerry\100hedden.us
-+                                       jdhedden\1001979.usna.com
-+                                       jdhedden\100gmail.com
-+                                       jdhedden\100yahoo.com
-+                                       jhedden\100pn100-02-2-356p.corp.bloomberg.com
-+                                       jdhedden\100solydxk
-jeremy\100zawodny.com                   jzawodn\100wcnet.org
-jesse\100sig.bsh.com                    jesse\100ginger
-jfriedl\100yahoo.com                    jfriedl\100yahoo-inc.com
-jfs\100fluent.com                       jfs\100jfs.fluent.com
-jhannah\100mutationgrid.com             jay\100jays.net
-+                                       jhannah\100omnihotels.com
-jidanni\100jidanni.org                  jidanni\100hoffa.dreamhost.com
-jjore\100cpan.org                       twists\100gmail.com
-jkeenan\100cpan.org                     jkeen\100verizon.net
-+                                       jkeenan\100dromedary-001.ams6.corp.booking.com
-jns\100integration-house.com            jns\100gellyfish.com
-+                                       gellyfish\100gellyfish.com
-john\100atlantech.com                   john\100titanic.atlantech.com
-john\100johnwright.org                  john.wright\100hp.com
-joseph\100cscaper.com                   joseph\1005sigma.com
-joshua\100rodd.us                       jrodd\100pbs.org
-jtobey\100john-edwin-tobey.org          jtobey\100user1.channel1.com
-jpeacock\100messagesystems.com          john.peacock\100havurah-software.org
-+                                       jpeacock\100havurah-software.org
-+                                       jpeacock\100dsl092-147-156.wdc1.dsl.speakeasy.net
-+                                       jpeacock\100jpeacock-hp.doesntexist.org
-+                                       jpeacock\100cpan.org
-+                                       jpeacock\100rowman.com
-james.schneider\100db.com               jschneid\100netilla.com
-jpl.jpl\100gmail.com                    jpl\100research.att.com
-jql\100accessone.com                    jql\100jql.accessone.com
-jsm28\100hermes.cam.ac.uk               jsm28\100cam.ac.uk
-
-kane\100dwim.org                        kane\100xs4all.net
-+                                       kane\100cpan.org
-+                                       kane\100xs4all.nl
-+                                       jos\100dwim.org
-+                                       jib\100ripe.net
-keith.s.thompson\100gmail.com           kst\100mib.org
-ken\100mathforum.org                    kenahoo\100gmail.com
-+                                       ken.williams\100thomsonreuters.com
-kentfredric\100gmail.com                kentnl\100cpan.org
-kmx\100volny.cz                         kmx\100volny.cz
-+                                       kmx\100cpan.org
-kroepke\100dolphin-services.de          kay\100dolphin-services.de
-kst\100mib.org                          kst\100cts.com
-+                                       kst\100SDSC.EDU
-kstar\100wolfetech.com                  kstar\100cpan.org
-+                                       kurt_starsinic\100ml.com
-+                                       kstar\100www.chapin.edu
-+                                       kstar\100chapin.edu
-larry\100wall.org                       lwall\100jpl-devvax.jpl.nasa.gov
-+                                       lwall\100netlabs.com
-+                                       larry\100netlabs.com
-+                                       lwall\100sems.com
-+                                       lwall\100scalpel.netlabs.com
-laszlo.molnar\100eth.ericsson.se        molnarl\100cdata.tvnet.hu
-+                                       ml1050\100freemail.hu
-lewart\100uiuc.edu                      lewart\100vadds.cvm.uiuc.edu
-+                                       d-lewart\100uiuc.edu
-lindblad@gmx.com                        52227507+apparluk\100users.noreply.github.com
-lkundrak\100v3.sk                       lubo.rintel\100gooddata.com
-lstein\100cshl.org                      lstein\100formaggio.cshl.org
-+                                       lstein\100genome.wi.mit.edu
-l.mai\100web.de                         plokinom\100gmail.com
-lupe\100lupe-christoph.de               lupe\100alanya.m.isar.de
-lutherh\100stratcom.com                 lutherh\100infinet.com
-mab\100wdl.loral.com                    markb\100rdcf.sm.unisys.com
-marcel\100codewerk.com                  gr\100univie.ac.at
-+                                       hanekomu\100gmail.com
-marcgreen\100cpan.org                   marcgreen\100wpi.edu
-markleightonfisher\100gmail.com         fisherm\100tce.com
-+                                       mark-fisher\100mindspring.com
-mark.p.lutz\100boeing.com               tecmpl1\100triton.ca.boeing.com
-marnix\100gmail.com                     pttesac!marnix!vanam
-marty+p5p\100kasei.com                  marty\100martian.org
-mats\100sm6sxl.net                      mats\100sm5sxl.net
-mbarbon\100dsi.unive.it                 mattia.barbon\100libero.it
-+                                       mattia\100barbon.org
-mcmahon\100ibiblio.org                  mcmahon\100metalab.unc.edu
-me\100davidglasser.net                  glasser\100tang-eleven-seventy-nine.mit.edu
-merijnb\100iloquent.nl                  merijnb\100ms.com
-+                                       merijnb\100iloquent.com
-merlyn\100stonehenge.com                merlyn\100gadget.cscaper.com
-mestre.smash\100gmail.com               smash\100cpan.org
-mgjv\100comdyn.com.au                   mgjv\100tradingpost.com.au
-mlh\100swl.msd.ray.com                  webtools\100uewrhp03.msd.ray.com
-michael.schroeder\100informatik.uni-erlangen.de mls\100suse.de
-mike\100stok.co.uk                      mike\100exegenix.com
-61100689+mikefultondev\100users.noreply.github.com mikefultonpersonal\100gmail.com
-miyagawa\100bulknews.net                    miyagawa\100edge.co.jp
-mjtg\100cam.ac.uk                       mjtg\100cus.cam.ac.uk
-mikedlr\100tardis.ed.ac.uk              mikedlr\100it.com.pl
-moritz\100casella.verplant.org          moritz\100faui2k3.org
-+                                       moritz lenz
-
-neale\100VMA.TABNSW.COM.AU              neale\100pucc.princeton.edu
-neeracher\100mac.com                    neeri\100iis.ee.ethz.ch
-neilb\100neilb.org                      neilb\100cre.canon.co.uk
-+                                       neil\100bowers.com
-
-nospam-abuse\100bloodgate.com           tels\100bloodgate.com
-+                                       perl_dummy\100bloodgate.com
-
-ian.phillipps\100iname.com              ian_phillipps\100yahoo.co.uk
-+                                       ian\100dial.pipex.com
-ignasi.roca\100fujitsu-siemens.com      ignasi.roca\100fujitsu.siemens.es
-ikegami\100adaelis.com                  eric\100fmdev10.(none)
-ilmari\100ilmari.org                    ilmari\100vesla.ilmari.org
-illpide\100telecel.pt                   arbor\100al37al08.telecel.pt
-# see http://www.nntp.perl.org/group/perl.perl5.porters/2001/01/msg28925.html
-#
-ilya\100math.berkeley.edu               ilya\100math.ohio-state.edu
-+                                       nospam-abuse\100ilyaz.org
-+                                       [9]ilya\100math.ohio-state.edu
-ilya\100martynov.org                    ilya\100juil.nonet
-
-joshua\100paloalto.com                  joshua.pritikin\100db.com
-
-litt\100acm.org                         tlhackque\100yahoo.com
-
-meyering@asic.sc.ti.com                 jim\100meyering.net
-
-okamoto\100corp.hp.com                  okamoto\100hpcc123.corp.hp.com
-orwant\100oreilly.com                   orwant\100media.mit.edu
-
-p5-authors\100crystalflame.net          perl\100crystalflame.net
-+                                       rs\100crystalflame.net
-+                                       coral\100eekeek.org
-+                                       coral\100moonlight.crystalflame.net
-+                                       rs\100oregonnet.com
-+                                       rs\100topsy.com
-paul.green\100stratus.com               paul_greenvos\100vos.stratus.com
-+                                       pgreen\100seussnt.stratus.com
-pmqs                                    pmqs\100cpan.org
-+                                       paul.marquess\100btinternet.com
-+                                       paul_marquess\100yahoo.co.uk
-+                                       paul.marquess\100ntlworld.com
-+                                       paul.marquess\100openwave.com
-+                                       pmarquess\100bfsec.bt.co.uk
-+                                       pmqs\100cpan.org
-+                                       paul\100paul-desktop.(none)
-Pavel.Zakouril\100mff.cuni.cz           root\100egg.karlov.mff.cuni.cz
-pcg\100goof.com                         schmorp\100schmorp.de
-perl\100cadop.com                       cdp\100hpescdp.fc.hp.com
-perl\100greerga.m-l.org                 greerga\100m-l.org
-perl\100profvince.com                   vince\100profvince.com
-perl-rt\100wizbit.be                    p5p\100perl.wizbit.be
-# Maybe we should special case this to get real names out?
-Peter.Dintelmann\100Dresdner-Bank.com   peter.dintelmann\100dresdner-bank.com
-# NOTE: There is an intentional trailing space in the line above
-pfeifer\100wait.de                      pfeifer\100charly.informatik.uni-dortmund.de
-+                                       upf\100de.uu.net
-pjacklam\100online.no                   pjacklam\100gmail.com
-ribasushi@cpan.org                     rabbit\100rabbit.us
-+                                      rabbit+bugs\100rabbit.us
-arc\100cpan.org                         perl\100aaroncrane.co.uk
-+                                       arc@users.noreply.github.com
-phil\100perkpartners.com                phil\100finchcomputer.com
-pimlott\100idiomtech.com                andrew\100pimlott.net
-+                                       pimlott\100abel.math.harvard.edu
-pixel\100mandriva.com                   pixel\100mandrakesoft.com
-pne\100cpan.org                         philip.newton\100gmx.net
-+                                       philip.newton\100datenrevision.de
-+                                       pnewton\100gmx.de
-pprymmer\100factset.com                 pvhp\100forte.com
-khw\100cpan.org                         khw\100karl.(none)
-+                                       public\100khwilliamson.com
-+                                       khw\100khw-desktop.(none)
-
-radu\100netsoft.ro                      rgreab\100fx.ro
-raiph                                   \100raiph
-+                                       raiph.mellor\100gmail.com
-rajagopa\100pauline.schrodinger.com     rajagopa\100schrodinger.com
-raphael.manfredi\100pobox.com           raphael_manfredi\100grenoble.hp.com
-info\100perl-services.de                renee.baecker\100smart-websolutions.de
-+                                       reneeb\100reneeb-desktop.(none)
-+                                       github\100renee-baecker.de
-+                                       otrs\100ubuntu.(none)
-+                                       perl\100renee-baecker.de
-+                                       reb\100perl-services.de
-+                                       module\100renee-baecker.de
-rich+perl\100hyphen-dash-hyphen.info    richardleach\100users.noreply.github.com
-richard.foley\100rfi.net                richard.foley\100t-online.de
-+                                       richard.foley\100ubs.com
-+                                       richard.foley\100ubsw.com
-rick\100consumercontact.com             rick\100bort.ca
-+                                       rick.delaney\100rogers.com
-+                                       rick\100bort.ca
-+                                       rick.delaney\100home.com
-rjbs\100cpan.org                        rjbs-perl-p5p\100lists.manxome.org
-+                                       perl.p5p\100rjbs.manxome.org
-+                                       rjbs\100semiotic.systems
-+                                       rjbs\100users.noreply.github.com
-rjk\100linguist.dartmouth.edu           rjk\100linguist.thayer.dartmouth.edu
-+                                       rjk-perl-p5p\100tamias.net
-+                                       rjk\100tamias.net
-rjray\100redhat.com                     rjray\100uswest.com
-rmgiroux\100acm.org                     rmgiroux\100hotmail.com
-+                                       mgiroux\100bear.com
-rmbarker\100cpan.org                    rmb1\100cise.npl.co.uk
-+                                       robin.barker\100npl.co.uk
-+                                       rmb\100cise.npl.co.uk
-+                                       robin\100spade-ubuntu.(none)
-+                                       r.m.barker\100btinternet.com
-+                                       rmbarker.cpan\100btinternet.com
-robertmay\100cpan.org                   rob\100themayfamily.me.uk
-roberto\100keltia.freenix.fr            roberto\100eurocontrol.fr
-robin\100cpan.org                       robin\100kitsite.com
-roderick\100argon.org                   roderick\100gate.net
-+                                       roderick\100ibcinc.com
-argrath\100ub32.org                     root\100ub32.org
-rootbeer\100teleport.com                rootbeer\100redcat.com
-+                                       tomphoenix\100unknown
-rra\100stanford.edu                     rra\100cpan.org
-rurban\100cpan.org                      rurban\100x-ray.at
-+                                       rurban\100cpanel.net
-rvtol+news\100isolution.nl              rvtol\100isolution.nl
-sartak\100gmail.com                     sartak\100bestpractical.com
-+                                       code\100sartak.org
-danny-cpan\100sadinoff.com              sadinoff\100olf.com
-schubiger\100cpan.org                   steven\100accognoscere.org
-+                                       sts\100accognoscere.org
-+                                       schubiger\100gmail.com
-+                                       stsc\100refcnt.org
-schwern\100pobox.com                    schwern\100gmail.com
-+                                       schwern\100athens.arena-i.com
-+                                       schwern\100blackrider.aocn.com
-+                                       schwern\100ool-18b93024.dyn.optonline.net
-scop\100cs132170.pp.htv.fi              ville.skytta\100iki.fi
-scotth\100sgi.com                       author scotth\100sgi.com 842220273 +0000
-+                                       schotth\100sgi.com
-schwab\100suse.de                       schwab\100issan.informatik.uni-dortmund.de
-+                                       schwab\100ls5.informatik.uni-dortmund.de
-sebastien\100aperghis.net               maddingue\100free.fr
-+                                       saper\100cpan.org
-shigeya\100wide.ad.jp                   shigeya\100foretune.co.jp
-shlomif\100cpan.org                     shlomif\100vipe.technion.ac.il
-+                                       shlomif\100iglu.org.il
-+                                       shlomif+processed-by-perl\100gmail.com
-+                                       shlomif\100shlomifish.org
-simon\100netthink.co.uk                 simon\100simon-cozens.org
-+                                       simon\100pembro4.pmb.ox.ac.uk
-+                                       simon\100brecon.co.uk
-+                                       simon\100othersideofthe.earth.li
-+                                       simon\100cozens.net
-+
-sisyphus\100cpan.org                    sisyphus1\100optusnet.com.au
-+                                       sisyphus359\100gmail.com
-lannings\100who.int                     lannings\100gmail.com
-+                                       slanning\100cpan.org
-slaven\100rezic.de                      slaven.rezic\100berlin.de
-+                                       srezic\100iconmobile.com
-+                                       srezic\100cpan.org
-+                                       eserte\100cs.tu-berlin.de
-+                                       eserte\100vran.herceg.de
-smcc\100mit.edu                         smcc\100ocf.berkeley.edu
-+                                       smcc\100csua.berkeley.edu
-+                                       alias\100mcs.com
-+                                       smccam\100uclink4.berkeley.edu
-spider\100orb.nashua.nh.us              spider\100web.zk3.dec.com
-+                                       spider\100leggy.zk3.dec.com
-+                                       spider-perl\100orb.nashua.nh.us
-+                                       spider\100peano.zk3.dec.com
-+                                       spider.boardman\100orb.nashua.nh.us>
-+                                       spidb\100cpan.org
-+                                       spider.boardman\100orb.nashua.nh.us
-+                                       root\100peano.zk3.dec.com
-s.denaxas\100gmail.com                  spiros\100lokku.com
-spp\100ds.net                           spp\100psa.pencom.com
-+                                       spp\100psasolar.colltech.com
-+                                       spp\100spotter.yi.org
-stef\100mongueurs.net                   stef\100payrard.net
-+                                       s.payrard\100wanadoo.fr
-+                                       properler\100freesurf.fr
-+                                       stef\100francenet.fr
-stevan\100cpan.org                      stevan.little\100gmail.com
-+                                       stevan.little\100iinteractive.com
-sthoenna\100efn.org                     ysth\100raven.shiftboard.com
-
-tassilo.parseval\100post.rwth-aachen.de tassilo.von.parseval\100rwth-aachen.de
-tchrist\100perl.com                     tchrist\100mox.perl.com
-+                                       tchrist\100jhereg.perl.com
-thomas.dorner\100start.de               tdorner\100amadeus.net
-tjenness\100cpan.org                    t.jenness\100jach.hawaii.edu
-+                                       timj\100jach.hawaii.edu
-tobez\100tobez.org                      tobez\100plab.ku.dk
-toddr\100cpan.org                       toddr\100cpanel.net
-tom\100compton.nu                       thh\100cyberscience.com
-tom.horsley\100mail.ccur.com            tom.horsley\100ccur.com
-+                                       tom\100amber.ssd.hcsc.com
-
-vkonovalov\100lucent.com                vkonovalov\100peterstar.ru
-+                                       konovalo\100mail.wplus.net
-+                                       vadim\100vkonovalov.ru
-+                                       vkonovalov\100spb.lucent.com
-+                                       vkonovalov\100alcatel-lucent.com
-+                                       vadim.konovalov\100alcatel-lucent.com
-
-whatever\100davidnicol.com              davidnicol\100gmail.com
-wolfgang.laun\100alcatel.at             wolfgang.laun\100chello.at
-+                                       wolfgang.laun\100thalesgroup.com
-+                                       wolfgang.laun\100gmail.com
-wolfsage\100gmail.com                   mhorsfall\100darmstadtium.(none)
-yath\100yath.de                         yath-perlbug\100yath.de
index fb80b6f..69004a7 100755 (executable)
@@ -7,34 +7,29 @@
 #
 # VMS is probably not handled properly here, due to their own
 # rather elaborate DCL scripting.
-#
 
 use strict;
 use warnings;
 use autodie;
 
-sub usage
-{
+sub usage {
     my $err = shift and select STDERR;
     print "usage: $0 [--list] [--regen] [--default=value]\n";
     exit $err;
     } # usage
 
-use Getopt::Long;
-my $opt_l = 0;
-my $opt_r = 0;
-my $default;
-my $tap = 0;
-my $test;
+use Getopt::Long qw(:config bundling);
 GetOptions (
-    "help|?"   => sub { usage (0); },
-    "l|list!"  => \$opt_l,
-    "regen"    => \$opt_r,
-    "default=s" => \$default,
-    "tap"      => \$tap,
+    "help|?"      => sub { usage (0); },
+    "l|list!"     => \(my $opt_l = 0),
+    "regen"       => \(my $opt_r = 0),
+    "default=s"   => \ my $default,
+    "tap"         => \(my $tap   = 0),
+    "v|verbose:1" => \(my $opt_v = 0),
     ) or usage (1);
 
 $default and $default =~ s/^'(.*)'$/$1/; # Will be quoted on generation
+my $test;
 
 require './regen/regen_lib.pl' if $opt_r;
 
@@ -61,6 +56,7 @@ my @CFG = (
 my @MASTER_CFG;
 {
     my %seen;
+    $opt_v and warn "Reading $MASTER_CFG ...\n";
     open my $fh, '<', $MASTER_CFG;
     while (<$fh>) {
        while (/[^\\]\$([a-z]\w+)/g) {
@@ -76,6 +72,7 @@ my @MASTER_CFG;
 my %MANIFEST;
 
 {
+    $opt_v and warn "Reading MANIFEST ...\n";
     open my $fh, '<', 'MANIFEST';
     while (<$fh>) {
        $MANIFEST{$1}++ if /^(.+?)\t/;
@@ -87,14 +84,15 @@ printf "1..%d\n", 2 * @CFG if $tap;
 
 for my $cfg (sort @CFG) {
     unless (exists $MANIFEST{$cfg}) {
-       print STDERR "[skipping not-expected '$cfg']\n";
+       warn "[skipping not-expected '$cfg']\n";
        next;
     }
     my %cfg;
     my $section = 0;
     my @lines;
 
-    open my $fh, '<', $cfg;
+    $opt_v and warn "Reading $cfg ...\n";
+    open my $fh, '<', $cfg or die "$cfg: $!\n";
 
     if ($cfg eq 'configure.com') {
        ++$cfg{startperl}; # Cheat.
index be24e09..187763b 100644 (file)
@@ -19,13 +19,14 @@ use 5.006;
 use ExtUtils::MakeMaker;
 use File::Spec::Functions qw(devnull);
 use Getopt::Long;
+use Time::Local qw(timelocal_posix);
 
 my ($diffs, $exclude_upstream, $tag_to_compare, $tap);
 unless (GetOptions('diffs' => \$diffs,
-                  'exclude|x' => \$exclude_upstream,
-                  'tag=s' => \$tag_to_compare,
-                  'tap' => \$tap,
-                  ) && @ARGV == 0) {
+                   'exclude|x' => \$exclude_upstream,
+                   'tag=s' => \$tag_to_compare,
+                   'tap' => \$tap,
+                   ) && @ARGV == 0) {
     die "usage: $0 [ -d -x --tag TAG --tap]";
 }
 
@@ -39,12 +40,12 @@ if (-d ".git" || (exists $ENV{GIT_DIR} && -d $ENV{GIT_DIR})) {
     my $found;
     if (-f '.git') {
         # the hash of the initial commit in perl.git (perl-1.0)
-       my $commit = '8d063cd8450e59ea1c611a2f4f5a21059a2804f1';
-       my $out = `git rev-parse --verify --quiet '$commit^{commit}'`;
-       chomp $out;
-       if($out eq $commit) {
+        my $commit = '8d063cd8450e59ea1c611a2f4f5a21059a2804f1';
+        my $out = `git rev-parse --verify --quiet '$commit^{commit}'`;
+        chomp $out;
+        if($out eq $commit) {
             ++$found;
-       }
+        }
     }
 
     die "$0: This is a Perl directory but does not look like Git working directory\n"
@@ -68,7 +69,7 @@ unless (defined $tag_to_compare) {
 
 unless (length $tag_to_compare) {
     die "$0: Git found, but no Git tags found\n"
-       unless $tap;
+        unless $tap;
     print "1..0 # SKIP: Git found, but no Git tags found\n";
     exit 0;
 }
@@ -82,15 +83,45 @@ unless ($tag_exists eq $tag_to_compare) {
     exit 0;
 }
 
+my $commit_epoch = `git log -1 --format="%ct"`;
+chomp($commit_epoch);
+# old git versions dont support taggerdate:unix. so use :iso8601 and then
+# use timelocal_posix() to convert to an epoch.
+my $tag_date = `git for-each-ref --format="%(taggerdate:iso8601)" refs/tags/$tag_to_compare`;
+chomp($tag_date);
+my $tag_epoch= do {
+    my ($Y,$M,$D,$h,$m,$s) = split /[- :]/, $tag_date; # 2023-03-20 22:49:09
+    timelocal_posix($s,$m,$h,$D,$M,$Y);
+};
+
+if ($commit_epoch - $tag_epoch > 60 * 24 * 60 * 60) {
+    my $months = sprintf "%.2f", ($commit_epoch - $tag_epoch) / (30 * 24 * 60 * 60);
+    my $message=
+        "Tag '$tag_to_compare' is very old compared to the most recent commit.\n"
+      . "We normally release a new version every month, and this one is $months months\n"
+      . "older than the current commit.  You probably have not synchronized your tags.\n"
+      . "This is common with github clones.  You can try the following:\n"
+      . "\n"
+      . "  git remote add -f upstream git\@github.com:Perl/perl5.git\n"
+      . "\n"
+      . "to fix your checkout.\n";
+    die "$0: $message" unless $tap;
+    $message= "$message";
+    $message=~s/^/# /mg;
+    print STDERR "\n$message";
+    print "1..0 # SKIP: Tag '$tag_to_compare' is $months months old. Update your tags!\n";
+    exit 0;
+}
+
 my %upstream_files;
 if ($exclude_upstream) {
     unshift @INC, 'Porting';
     require Maintainers;
 
     for my $m (grep {!defined $Maintainers::Modules{$_}{UPSTREAM}
-                        or $Maintainers::Modules{$_}{UPSTREAM} ne 'blead'}
-              keys %Maintainers::Modules) {
-       $upstream_files{$_} = 1 for Maintainers::get_module_files($m);
+                         or $Maintainers::Modules{$_}{UPSTREAM} ne 'blead'}
+               keys %Maintainers::Modules) {
+        $upstream_files{$_} = 1 for Maintainers::get_module_files($m);
     }
 }
 
@@ -140,8 +171,8 @@ my %skip;
 # usually due to some # mix-up
 
 my %skip_versions = (
-          # 'some/sample/file.pm' => [ '1.23', '1.24' ],
-         );
+    # 'some/sample/file.pm' => [ '1.23', '1.24' ],
+);
 
 my $skip_dirs = qr|^t/lib|;
 
@@ -149,30 +180,30 @@ sub pm_file_from_xs {
     my $xs = shift;
 
     foreach my $try (sub {
-                        # First try a .pm at the same level as the .xs file
-                        # with the same basename
-                        return shift =~ s/\.xs\z//r;
-                    },
-                    sub {
-                        # Try for a (different) .pm at the same level, based
-                        # on the directory name:
-                        my ($path) = shift =~ m!^(.*)/!;
-                        my ($last) = $path =~ m!([^-/]+)\z!;
-                        return "$path/$last";
-                    },
-                    sub {
-                        # Try to work out the extension's full package, and
-                        # look for a .pm in lib/ based on that:
-                        my ($path) = shift =~ m!^(.*)/!;
-                        my ($last) = $path =~ m!([^/]+)\z!;
-                        $last = 'List-Util' if $last eq 'Scalar-List-Utils';
-                        $last =~ tr !-!/!;
-                        return "$path/lib/$last";
-                    }) {
-       # For all cases, first look to see if the .pm file is generated.
-       my $base = $try->($xs);
-       return "${base}_pm.PL" if -f "${base}_pm.PL";
-       return "${base}.pm" if -f "${base}.pm";
+                         # First try a .pm at the same level as the .xs file
+                         # with the same basename
+                         return shift =~ s/\.xs\z//r;
+                     },
+                     sub {
+                         # Try for a (different) .pm at the same level, based
+                         # on the directory name:
+                         my ($path) = shift =~ m!^(.*)/!;
+                         my ($last) = $path =~ m!([^-/]+)\z!;
+                         return "$path/$last";
+                     },
+                     sub {
+                         # Try to work out the extension's full package, and
+                         # look for a .pm in lib/ based on that:
+                         my ($path) = shift =~ m!^(.*)/!;
+                         my ($last) = $path =~ m!([^/]+)\z!;
+                         $last = 'List-Util' if $last eq 'Scalar-List-Utils';
+                         $last =~ tr !-!/!;
+                         return "$path/lib/$last";
+                     }) {
+        # For all cases, first look to see if the .pm file is generated.
+        my $base = $try->($xs);
+        return "${base}_pm.PL" if -f "${base}_pm.PL";
+        return "${base}.pm" if -f "${base}.pm";
     }
 
     die "No idea which .pm file corresponds to '$xs', so aborting";
@@ -185,6 +216,7 @@ sub pm_file_from_xs {
 # with XS modules with more than one XS file, and "interesting" layouts.
 
 my %module_diffs;
+my %dist_diffs;
 
 foreach (`git --no-pager diff --name-only $tag_to_compare --diff-filter=ACMRTUXB`) {
     chomp;
@@ -193,24 +225,27 @@ foreach (`git --no-pager diff --name-only $tag_to_compare --diff-filter=ACMRTUXB
     next if $this_dir =~ $skip_dirs || exists $skip{$_};
     next if exists $upstream_files{$_};
     if (/\.pm\z/ || m|^lib/.*\.pl\z| || /_pm\.PL\z/) {
-       push @{$module_diffs{$_}}, $_;
+        push @{$module_diffs{$_}}, $_;
     } elsif (/\.xs\z/ && !/\bt\b/) {
-       push @{$module_diffs{pm_file_from_xs($_)}}, $_;
+        push @{$module_diffs{pm_file_from_xs($_)}}, $_;
+    } elsif (!/\bt\b/ && /\.[ch]\z/ && m!^((?:dist|ext|cpan)/[^/]+)/!) {
+       push @{ $dist_diffs{$1} }, $_;
     }
 }
 
-unless (%module_diffs) {
+unless (%module_diffs || %dist_diffs) {
     print "1..1\nok 1 - No difference found\n" if $tap;
     exit;
 }
 
-printf "1..%d\n" => scalar keys %module_diffs if $tap;
+printf "1..%d\n" => (keys(%module_diffs) + keys (%dist_diffs)) if $tap;
 print "#\n# Comparing against $tag_to_compare ....\n#\n" if $tap;
 
 my $count;
 my $diff_cmd = "git --no-pager diff $tag_to_compare ";
 my $q = ($^O eq 'MSWin32' || $^O eq 'VMS') ? '"' : "'";
 my (@diff);
+my %dist_bumped;
 
 foreach my $pm_file (sort keys %module_diffs) {
     # git has already told us that the files differ, so no need to grab each as
@@ -223,34 +258,59 @@ foreach my $pm_file (sort keys %module_diffs) {
     if (!defined $orig_pm_version || $orig_pm_version eq 'undef') { # sigh
         print "ok $count - SKIP Can't parse \$VERSION in $pm_file\n"
           if $tap;
+
+        # Behave like a version bump if the orig version could not be parsed,
+        # but the current file could
+        if (defined $pm_version && $pm_version ne 'undef' && $pm_file =~ m!^((?:dist|ext|cpan)/[^/]+)/!) {
+            $dist_bumped{$1}++;
+        }
     } elsif (!defined $pm_version || $pm_version eq 'undef') {
         my $nok = "not ok $count - in $pm_file version was $orig_pm_version, now unparsable\n";
         print $nok if $tap;
         print STDERR "# $nok\n";
     } elsif ($pm_version ne $orig_pm_version) { # good
         print "ok $count - $pm_file\n" if $tap;
+        if ($pm_file =~ m!^((?:dist|ext|cpan)/[^/]+)/!) {
+           $dist_bumped{$1}++;
+        }
     } else {
-       if ($tap) {
+        if ($tap) {
             print "#\n# " . '-' x 75 . "\n"
             . "# Version number ($pm_version) unchanged since"
             . " $tag_to_compare, but contents have changed:\n#\n";
-           foreach (sort @{$module_diffs{$pm_file}}) {
-               print "# $_" for `$diff_cmd $q$_$q`;
-           }
+            foreach (sort @{$module_diffs{$pm_file}}) {
+                print "# $_" for `$diff_cmd $q$_$q`;
+            }
             print "# " . '-' x 75 . "\n";
 
-           if (exists $skip_versions{$pm_file}
-               and grep $pm_version eq $_, @{$skip_versions{$pm_file}}) {
-               print "ok $count - SKIP $pm_file version $pm_version\n";
-           } else {
-               my $nok = "not ok $count - $pm_file version $pm_version\n";
-               print $nok;
-               print STDERR "# $nok";
-           }
-       } else {
-           push @diff, @{$module_diffs{$pm_file}};
-           print "$pm_file version $pm_version\n";
-       }
+            if (exists $skip_versions{$pm_file}
+                and grep $pm_version eq $_, @{$skip_versions{$pm_file}}) {
+                print "ok $count - SKIP $pm_file version $pm_version\n";
+            } else {
+                my $nok = "not ok $count - $pm_file version $pm_version\n";
+                print $nok;
+                print STDERR "# $nok";
+            }
+        } else {
+            push @diff, @{$module_diffs{$pm_file}};
+            print "$pm_file version $pm_version\n";
+        }
+    }
+}
+
+foreach my $dist (sort keys %dist_diffs) {
+    my $file_count = @{ $dist_diffs{$dist} };
+    my $msg = $file_count == 1 ? "file was" : "files were";
+    ++$count;
+
+    if ($dist_bumped{$dist}) {
+         print "ok $count - in $dist $file_count $msg modified and a version was bumped\n";
+    } else {
+        my $nok = "not ok $count - in $dist $file_count $msg modified but no versions were bumped\n";
+        print "# No versions bumped in $dist but $file_count $msg modified\n";
+        print "# $_\n" for (sort @{$dist_diffs{$dist}});
+        print $nok if $tap;
+        print STDERR "# $nok\n";
     }
 }
 
@@ -264,7 +324,7 @@ sub get_file_from_git {
 
 if ($diffs) {
     for (sort @diff) {
-       print "\n";
-       system "$diff_cmd $q$_$q";
+        print "\n";
+        system "$diff_cmd $q$_$q";
     }
 }
index dd772e8..f914487 100644 (file)
@@ -8,25 +8,20 @@
 
 # Package name      : perl5
 # Source directory  : .
-# Configuration time: Sat Aug 22 16:03:38 CEST 2020
-# Configured by     : yourname
-# Target system     : linux lx09 5.8.0-1-default #1 smp tue aug 4 07:30:59 utc 2020 (9bc0044) x86_64 x86_64 x86_64 gnulinux 
+# Configuration time: Fri Apr 28 15:57:25 CEST 2023
+# Configured by     : merijn
+# Target system     : linux lx09 6.2.12-1-default #1 smp preempt_dynamic thu apr 20 11:01:10 utc 2023 (eb3255d) x86_64 x86_64 x86_64 gnulinux 
 
 : Configure command line arguments.
-config_arg0='Configure'
-config_args='-Dprefix=/opt/perl -Dcf_by=yourname -Dcf_email=yourname@yourhost.yourplace.com -Dperladmin=yourname@yourhost.yourplace.com -Dmydomain=.yourplace.com -Dmyhostname=yourhost -Duse64bitint -Duselongdouble -Dusethreads -Dusedevel -des'
-config_argc=11
-config_arg1='-Dprefix=/opt/perl'
-config_arg2='-Dcf_by=yourname'
-config_arg3='-Dcf_email=yourname@yourhost.yourplace.com'
-config_arg4='-Dperladmin=yourname@yourhost.yourplace.com'
-config_arg5='-Dmydomain=.yourplace.com'
-config_arg6='-Dmyhostname=yourhost'
-config_arg7='-Duse64bitint'
-config_arg8='-Duselongdouble'
-config_arg9='-Dusethreads'
-config_arg10='-Dusedevel'
-config_arg11='-des'
+config_arg0='./Configure'
+config_args='-Dusedevel -Duse64bitall -Dusequadmath -Dusethreads -Duseithreads -des'
+config_argc=6
+config_arg1='-Dusedevel'
+config_arg2='-Duse64bitall'
+config_arg3='-Dusequadmath'
+config_arg4='-Dusethreads'
+config_arg5='-Duseithreads'
+config_arg6='-des'
 
 Author=''
 Date=''
@@ -44,24 +39,24 @@ _o='.o'
 afs='false'
 afsroot='/afs'
 alignbytes='16'
-aphostname=''
+aphostname='/usr/bin/hostname'
 api_revision='5'
 api_subversion='0'
-api_version='36'
-api_versionstring='5.36.0'
+api_version='38'
+api_versionstring='5.38.0'
 ar='ar'
-archlib='/opt/perl/lib/5.36.3/x86_64-linux-thread-multi-ld'
-archlibexp='/opt/perl/lib/5.36.3/x86_64-linux-thread-multi-ld'
+archlib='/pro/lib/perl5/5.38.2/x86_64-linux-thread-multi-quadmath'
+archlibexp='/pro/lib/perl5/5.38.2/x86_64-linux-thread-multi-quadmath'
 archname64=''
-archname='x86_64-linux-thread-multi-ld'
+archname='x86_64-linux-thread-multi-quadmath'
 archobjs=''
 asctime_r_proto='REENTRANT_PROTO_B_SB'
 awk='awk'
 baserev='5.0'
 bash=''
-bin='/opt/perl/bin'
+bin='/pro/bin'
 bin_ELF='define'
-binexp='/opt/perl/bin'
+binexp='/pro/bin'
 bison='bison'
 byacc='byacc'
 byteorder='12345678'
@@ -71,14 +66,14 @@ cat='cat'
 cc='cc'
 cccdlflags='-fPIC'
 ccdlflags='-Wl,-E'
-ccflags='-D_REENTRANT -D_GNU_SOURCE -fwrapv -fno-strict-aliasing -pipe -fstack-protector-strong -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_FORTIFY_SOURCE=2'
+ccflags='-D_REENTRANT -D_GNU_SOURCE -pie -fPIE -fPIC -DDEBUGGING -fwrapv -fno-strict-aliasing -pipe -fstack-protector-strong -I/pro/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_FORTIFY_SOURCE=2'
 ccflags_uselargefiles='-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64'
 ccname='gcc'
 ccsymbols=''
 ccversion=''
-cf_by='yourname'
-cf_email='yourname@yourhost.yourplace.com'
-cf_time='Sat Aug 22 16:03:38 CEST 2020'
+cf_by='merijn'
+cf_email='hmbrand@cpan.org'
+cf_time='Fri Apr 28 15:57:25 CEST 2023'
 charbits='8'
 charsize='1'
 chgrp=''
@@ -94,18 +89,18 @@ cpio=''
 cpp='cpp'
 cpp_stuff='42'
 cppccsymbols=''
-cppflags='-D_REENTRANT -D_GNU_SOURCE -fwrapv -fno-strict-aliasing -pipe -fstack-protector-strong -I/usr/local/include'
+cppflags='-D_REENTRANT -D_GNU_SOURCE -pie -fPIE -fPIC -DDEBUGGING -fwrapv -fno-strict-aliasing -pipe -fstack-protector-strong -I/pro/local/include'
 cpplast='-'
 cppminus='-'
 cpprun='cc  -E'
 cppstdin='cc  -E'
-cppsymbols='__amd64=1 __amd64__=1 __ATOMIC_ACQ_REL=4 __ATOMIC_ACQUIRE=2 __ATOMIC_CONSUME=1 __ATOMIC_HLE_ACQUIRE=65536 __ATOMIC_HLE_RELEASE=131072 __ATOMIC_RELAXED=0 __ATOMIC_RELEASE=3 __ATOMIC_SEQ_CST=5 __BIGGEST_ALIGNMENT__=16 __BYTE_ORDER__=1234 __CHAR16_TYPE__=short\ unsigned\ int __CHAR32_TYPE__=unsigned\ int __CHAR_BIT__=8 __code_model_small__=1 __DBL_DECIMAL_DIG__=17 __DBL_DENORM_MIN__=((double)4.94065645841246544176568792868221372e-324L) __DBL_DIG__=15 __DBL_EPSILON__=((double)2.22044604925031308084726333618164062e-16L) __DBL_HAS_DENORM__=1 __DBL_HAS_INFINITY__=1 __DBL_HAS_QUIET_NAN__=1 __DBL_MANT_DIG__=53 __DBL_MAX_10_EXP__=308 __DBL_MAX__=((double)1.79769313486231570814527423731704357e+308L) __DBL_MAX_EXP__=1024 __DBL_MIN_10_EXP__=(-307) __DBL_MIN__=((double)2.22507385850720138309023271733240406e-308L) __DBL_MIN_EXP__=(-1021) __DBL_NORM_MAX__=((double)1.79769313486231570814527423731704357e+308L) __DEC128_EPSILON__=1E-33DL __DEC128_MANT_DIG__=34 __DEC128_MAX__=9.999999999999999999999999999999999E6144DL __DEC128_MAX_EXP__=6145 __DEC128_MIN__=1E-6143DL __DEC128_MIN_EXP__=(-6142) __DEC128_SUBNORMAL_MIN__=0.000000000000000000000000000000001E-6143DL __DEC32_EPSILON__=1E-6DF __DEC32_MANT_DIG__=7 __DEC32_MAX__=9.999999E96DF __DEC32_MAX_EXP__=97 __DEC32_MIN__=1E-95DF __DEC32_MIN_EXP__=(-94) __DEC32_SUBNORMAL_MIN__=0.000001E-95DF __DEC64_EPSILON__=1E-15DD __DEC64_MANT_DIG__=16 __DEC64_MAX__=9.999999999999999E384DD __DEC64_MAX_EXP__=385 __DEC64_MIN__=1E-383DD __DEC64_MIN_EXP__=(-382) __DEC64_SUBNORMAL_MIN__=0.000000000000001E-383DD __DEC_EVAL_METHOD__=2 __DECIMAL_BID_FORMAT__=1 __DECIMAL_DIG__=21 __ELF__=1 _FILE_OFFSET_BITS=64 __FINITE_MATH_ONLY__=0 __FLOAT_WORD_ORDER__=1234 __FLT128_DECIMAL_DIG__=36 __FLT128_DENORM_MIN__=6.47517511943802511092443895822764655e-4966F128 __FLT128_DIG__=33 __FLT128_EPSILON__=1.92592994438723585305597794258492732e-34F128 __FLT128_HAS_DENORM__=1 __FLT128_HAS_INFINITY__=1 __FLT128_HAS_QUIET_NAN__=1 __FLT128_MANT_DIG__=113 __FLT128_MAX_10_EXP__=4932 __FLT128_MAX__=1.18973149535723176508575932662800702e+4932F128 __FLT128_MAX_EXP__=16384 __FLT128_MIN_10_EXP__=(-4931) __FLT128_MIN__=3.36210314311209350626267781732175260e-4932F128 __FLT128_MIN_EXP__=(-16381) __FLT128_NORM_MAX__=1.18973149535723176508575932662800702e+4932F128 __FLT32_DECIMAL_DIG__=9 __FLT32_DENORM_MIN__=1.40129846432481707092372958328991613e-45F32 __FLT32_DIG__=6 __FLT32_EPSILON__=1.19209289550781250000000000000000000e-7F32 __FLT32_HAS_DENORM__=1 __FLT32_HAS_INFINITY__=1 __FLT32_HAS_QUIET_NAN__=1 __FLT32_MANT_DIG__=24 __FLT32_MAX_10_EXP__=38 __FLT32_MAX__=3.40282346638528859811704183484516925e+38F32 __FLT32_MAX_EXP__=128 __FLT32_MIN_10_EXP__=(-37) __FLT32_MIN__=1.17549435082228750796873653722224568e-38F32 __FLT32_MIN_EXP__=(-125) __FLT32_NORM_MAX__=3.40282346638528859811704183484516925e+38F32 __FLT32X_DECIMAL_DIG__=17 __FLT32X_DENORM_MIN__=4.94065645841246544176568792868221372e-324F32x __FLT32X_DIG__=15 __FLT32X_EPSILON__=2.22044604925031308084726333618164062e-16F32x __FLT32X_HAS_DENORM__=1 __FLT32X_HAS_INFINITY__=1 __FLT32X_HAS_QUIET_NAN__=1 __FLT32X_MANT_DIG__=53 __FLT32X_MAX_10_EXP__=308 __FLT32X_MAX__=1.79769313486231570814527423731704357e+308F32x __FLT32X_MAX_EXP__=1024 __FLT32X_MIN_10_EXP__=(-307) __FLT32X_MIN__=2.22507385850720138309023271733240406e-308F32x __FLT32X_MIN_EXP__=(-1021) __FLT32X_NORM_MAX__=1.79769313486231570814527423731704357e+308F32x __FLT64_DECIMAL_DIG__=17 __FLT64_DENORM_MIN__=4.94065645841246544176568792868221372e-324F64 __FLT64_DIG__=15 __FLT64_EPSILON__=2.22044604925031308084726333618164062e-16F64 __FLT64_HAS_DENORM__=1 __FLT64_HAS_INFINITY__=1 __FLT64_HAS_QUIET_NAN__=1 __FLT64_MANT_DIG__=53 __FLT64_MAX_10_EXP__=308 __FLT64_MAX__=1.79769313486231570814527423731704357e+308F64 __FLT64_MAX_EXP__=1024 __FLT64_MIN_10_EXP__=(-307) __FLT64_MIN__=2.22507385850720138309023271733240406e-308F64 __FLT64_MIN_EXP__=(-1021) __FLT64_NORM_MAX__=1.79769313486231570814527423731704357e+308F64 __FLT64X_DECIMAL_DIG__=21 __FLT64X_DENORM_MIN__=3.64519953188247460252840593361941982e-4951F64x __FLT64X_DIG__=18 __FLT64X_EPSILON__=1.08420217248550443400745280086994171e-19F64x __FLT64X_HAS_DENORM__=1 __FLT64X_HAS_INFINITY__=1 __FLT64X_HAS_QUIET_NAN__=1 __FLT64X_MANT_DIG__=64 __FLT64X_MAX_10_EXP__=4932 __FLT64X_MAX__=1.18973149535723176502126385303097021e+4932F64x __FLT64X_MAX_EXP__=16384 __FLT64X_MIN_10_EXP__=(-4931) __FLT64X_MIN__=3.36210314311209350626267781732175260e-4932F64x __FLT64X_MIN_EXP__=(-16381) __FLT64X_NORM_MAX__=1.18973149535723176502126385303097021e+4932F64x __FLT_DECIMAL_DIG__=9 __FLT_DENORM_MIN__=1.40129846432481707092372958328991613e-45F __FLT_DIG__=6 __FLT_EPSILON__=1.19209289550781250000000000000000000e-7F __FLT_EVAL_METHOD__=0 __FLT_EVAL_METHOD_TS_18661_3__=0 __FLT_HAS_DENORM__=1 __FLT_HAS_INFINITY__=1 __FLT_HAS_QUIET_NAN__=1 __FLT_MANT_DIG__=24 __FLT_MAX_10_EXP__=38 __FLT_MAX__=3.40282346638528859811704183484516925e+38F __FLT_MAX_EXP__=128 __FLT_MIN_10_EXP__=(-37) __FLT_MIN__=1.17549435082228750796873653722224568e-38F __FLT_MIN_EXP__=(-125) __FLT_NORM_MAX__=3.40282346638528859811704183484516925e+38F __FLT_RADIX__=2 __FXSR__=1 __GCC_ASM_FLAG_OUTPUTS__=1 __GCC_ATOMIC_BOOL_LOCK_FREE=2 __GCC_ATOMIC_CHAR16_T_LOCK_FREE=2 __GCC_ATOMIC_CHAR32_T_LOCK_FREE=2 __GCC_ATOMIC_CHAR_LOCK_FREE=2 __GCC_ATOMIC_INT_LOCK_FREE=2 __GCC_ATOMIC_LLONG_LOCK_FREE=2 __GCC_ATOMIC_LONG_LOCK_FREE=2 __GCC_ATOMIC_POINTER_LOCK_FREE=2 __GCC_ATOMIC_SHORT_LOCK_FREE=2 __GCC_ATOMIC_TEST_AND_SET_TRUEVAL=1 __GCC_ATOMIC_WCHAR_T_LOCK_FREE=2 __GCC_HAVE_DWARF2_CFI_ASM=1 __GCC_HAVE_SYNC_COMPARE_AND_SWAP_1=1 __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2=1 __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4=1 __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8=1 __GCC_IEC_559=2 __GCC_IEC_559_COMPLEX=2 __GLIBC__=2 __GLIBC_MINOR__=31 __GNUC__=10 __GNUC_MINOR__=2 __GNUC_PATCHLEVEL__=1 __GNUC_STDC_INLINE__=1 __GNU_LIBRARY__=6 __gnu_linux__=1 _GNU_SOURCE=1 __GXX_ABI_VERSION=1014 __HAVE_SPECULATION_SAFE_VALUE=1 __INT16_C=__INT16_C __INT16_MAX__=0x7fff __INT16_TYPE__=short\ int __INT32_C=__INT32_C __INT32_MAX__=0x7fffffff __INT32_TYPE__=int __INT64_C=__INT64_C __INT64_MAX__=0x7fffffffffffffffL __INT64_TYPE__=long\ int __INT8_C=__INT8_C __INT8_MAX__=0x7f __INT8_TYPE__=signed\ char __INT_FAST16_MAX__=0x7fffffffffffffffL __INT_FAST16_TYPE__=long\ int __INT_FAST16_WIDTH__=64 __INT_FAST32_MAX__=0x7fffffffffffffffL __INT_FAST32_TYPE__=long\ int __INT_FAST32_WIDTH__=64 __INT_FAST64_MAX__=0x7fffffffffffffffL __INT_FAST64_TYPE__=long\ int __INT_FAST64_WIDTH__=64 __INT_FAST8_MAX__=0x7f __INT_FAST8_TYPE__=signed\ char __INT_FAST8_WIDTH__=8 __INT_LEAST16_MAX__=0x7fff __INT_LEAST16_TYPE__=short\ int __INT_LEAST16_WIDTH__=16 __INT_LEAST32_MAX__=0x7fffffff __INT_LEAST32_TYPE__=int __INT_LEAST32_WIDTH__=32 __INT_LEAST64_MAX__=0x7fffffffffffffffL __INT_LEAST64_TYPE__=long\ int __INT_LEAST64_WIDTH__=64 __INT_LEAST8_MAX__=0x7f __INT_LEAST8_TYPE__=signed\ char __INT_LEAST8_WIDTH__=8 __INT_MAX__=0x7fffffff __INTMAX_C=__INTMAX_C __INTMAX_MAX__=0x7fffffffffffffffL __INTMAX_TYPE__=long\ int __INTMAX_WIDTH__=64 __INTPTR_MAX__=0x7fffffffffffffffL __INTPTR_TYPE__=long\ int __INTPTR_WIDTH__=64 __INT_WIDTH__=32 __k8=1 __k8__=1 _LARGEFILE64_SOURCE=1 _LARGEFILE_SOURCE=1 __LDBL_DECIMAL_DIG__=21 __LDBL_DENORM_MIN__=3.64519953188247460252840593361941982e-4951L __LDBL_DIG__=18 __LDBL_EPSILON__=1.08420217248550443400745280086994171e-19L __LDBL_HAS_DENORM__=1 __LDBL_HAS_INFINITY__=1 __LDBL_HAS_QUIET_NAN__=1 __LDBL_MANT_DIG__=64 __LDBL_MAX_10_EXP__=4932 __LDBL_MAX__=1.18973149535723176502126385303097021e+4932L __LDBL_MAX_EXP__=16384 __LDBL_MIN_10_EXP__=(-4931) __LDBL_MIN__=3.36210314311209350626267781732175260e-4932L __LDBL_MIN_EXP__=(-16381) __LDBL_NORM_MAX__=1.18973149535723176502126385303097021e+4932L __linux=1 __linux__=1 linux=1 __LONG_LONG_MAX__=0x7fffffffffffffffLL __LONG_LONG_WIDTH__=64 __LONG_MAX__=0x7fffffffffffffffL __LONG_WIDTH__=64 __LP64__=1 _LP64=1 __MMX__=1 __MMX_WITH_SSE__=1 __ORDER_BIG_ENDIAN__=4321 __ORDER_LITTLE_ENDIAN__=1234 __ORDER_PDP_ENDIAN__=3412 _POSIX_C_SOURCE=200809L _POSIX_SOURCE=1 __PRAGMA_REDEFINE_EXTNAME=1 __PTRDIFF_MAX__=0x7fffffffffffffffL __PTRDIFF_TYPE__=long\ int __PTRDIFF_WIDTH__=64 _REENTRANT=1 __REGISTER_PREFIX__= __SCHAR_MAX__=0x7f __SCHAR_WIDTH__=8 __SEG_FS=1 __SEG_GS=1 __SHRT_MAX__=0x7fff __SHRT_WIDTH__=16 __SIG_ATOMIC_MAX__=0x7fffffff __SIG_ATOMIC_MIN__=(-0x7fffffff\ -\ 1) __SIG_ATOMIC_TYPE__=int __SIG_ATOMIC_WIDTH__=32 __SIZE_MAX__=0xffffffffffffffffUL __SIZEOF_DOUBLE__=8 __SIZEOF_FLOAT128__=16 __SIZEOF_FLOAT__=4 __SIZEOF_FLOAT80__=16 __SIZEOF_INT128__=16 __SIZEOF_INT__=4 __SIZEOF_LONG__=8 __SIZEOF_LONG_DOUBLE__=16 __SIZEOF_LONG_LONG__=8 __SIZEOF_POINTER__=8 __SIZEOF_PTRDIFF_T__=8 __SIZEOF_SHORT__=2 __SIZEOF_SIZE_T__=8 __SIZEOF_WCHAR_T__=4 __SIZEOF_WINT_T__=4 __SIZE_TYPE__=long\ unsigned\ int __SIZE_WIDTH__=64 __SSE__=1 __SSE2__=1 __SSE2_MATH__=1 __SSE_MATH__=1 __STDC__=1 __STDC_HOSTED__=1 __STDC_IEC_559__=1 __STDC_IEC_559_COMPLEX__=1 __STDC_ISO_10646__=201706L _STDC_PREDEF_H=1 __STDC_UTF_16__=1 __STDC_UTF_32__=1 __STDC_VERSION__=201710L __UINT16_C=__UINT16_C __UINT16_MAX__=0xffff __UINT16_TYPE__=short\ unsigned\ int __UINT32_C=__UINT32_C __UINT32_MAX__=0xffffffffU __UINT32_TYPE__=unsigned\ int __UINT64_C=__UINT64_C __UINT64_MAX__=0xffffffffffffffffUL __UINT64_TYPE__=long\ unsigned\ int __UINT8_C=__UINT8_C __UINT8_MAX__=0xff __UINT8_TYPE__=unsigned\ char __UINT_FAST16_MAX__=0xffffffffffffffffUL __UINT_FAST16_TYPE__=long\ unsigned\ int __UINT_FAST32_MAX__=0xffffffffffffffffUL __UINT_FAST32_TYPE__=long\ unsigned\ int __UINT_FAST64_MAX__=0xffffffffffffffffUL __UINT_FAST64_TYPE__=long\ unsigned\ int __UINT_FAST8_MAX__=0xff __UINT_FAST8_TYPE__=unsigned\ char __UINT_LEAST16_MAX__=0xffff __UINT_LEAST16_TYPE__=short\ unsigned\ int __UINT_LEAST32_MAX__=0xffffffffU __UINT_LEAST32_TYPE__=unsigned\ int __UINT_LEAST64_MAX__=0xffffffffffffffffUL __UINT_LEAST64_TYPE__=long\ unsigned\ int __UINT_LEAST8_MAX__=0xff __UINT_LEAST8_TYPE__=unsigned\ char __UINTMAX_C=__UINTMAX_C __UINTMAX_MAX__=0xffffffffffffffffUL __UINTMAX_TYPE__=long\ unsigned\ int __UINTPTR_MAX__=0xffffffffffffffffUL __UINTPTR_TYPE__=long\ unsigned\ int __unix=1 __unix__=1 unix=1 __USE_FILE_OFFSET64=1 __USE_GNU=1 __USE_LARGEFILE=1 __USE_LARGEFILE64=1 __USE_MISC=1 __USE_POSIX=1 __USE_POSIX199309=1 __USE_POSIX199506=1 __USE_POSIX2=1 __USER_LABEL_PREFIX__= __USE_UNIX98=1 __USE_XOPEN=1 __USE_XOPEN_EXTENDED=1 __VERSION__="10.2.1\ 20200805\ [revision\ dda1e9d08434def88ed86557d08b23251332c5aa]" __WCHAR_MAX__=0x7fffffff __WCHAR_MIN__=(-0x7fffffff\ -\ 1) __WCHAR_TYPE__=int __WCHAR_WIDTH__=32 __WINT_MAX__=0xffffffffU __WINT_MIN__=0U __WINT_TYPE__=unsigned\ int __WINT_WIDTH__=32 __x86_64=1 __x86_64__=1 _XOPEN_SOURCE=700 _XOPEN_SOURCE_EXTENDED=1'
+cppsymbols='__amd64=1 __amd64__=1 __ATOMIC_ACQ_REL=4 __ATOMIC_ACQUIRE=2 __ATOMIC_CONSUME=1 __ATOMIC_HLE_ACQUIRE=65536 __ATOMIC_HLE_RELEASE=131072 __ATOMIC_RELAXED=0 __ATOMIC_RELEASE=3 __ATOMIC_SEQ_CST=5 __BFLT16_DECIMAL_DIG__=4 __BFLT16_DENORM_MIN__=9.18354961579912115600575419704879436e-41BF16 __BFLT16_DIG__=2 __BFLT16_EPSILON__=7.81250000000000000000000000000000000e-3BF16 __BFLT16_HAS_DENORM__=1 __BFLT16_HAS_INFINITY__=1 __BFLT16_HAS_QUIET_NAN__=1 __BFLT16_IS_IEC_60559__=0 __BFLT16_MANT_DIG__=8 __BFLT16_MAX_10_EXP__=38 __BFLT16_MAX__=3.38953138925153547590470800371487867e+38BF16 __BFLT16_MAX_EXP__=128 __BFLT16_MIN_10_EXP__=(-37) __BFLT16_MIN__=1.17549435082228750796873653722224568e-38BF16 __BFLT16_MIN_EXP__=(-125) __BFLT16_NORM_MAX__=3.38953138925153547590470800371487867e+38BF16 __BIGGEST_ALIGNMENT__=16 __BYTE_ORDER__=1234 __CHAR16_TYPE__=short\ unsigned\ int __CHAR32_TYPE__=unsigned\ int __CHAR_BIT__=8 __code_model_small__=1 __DBL_DECIMAL_DIG__=17 __DBL_DENORM_MIN__=((double)4.94065645841246544176568792868221372e-324L) __DBL_DIG__=15 __DBL_EPSILON__=((double)2.22044604925031308084726333618164062e-16L) __DBL_HAS_DENORM__=1 __DBL_HAS_INFINITY__=1 __DBL_HAS_QUIET_NAN__=1 __DBL_IS_IEC_60559__=1 __DBL_MANT_DIG__=53 __DBL_MAX_10_EXP__=308 __DBL_MAX__=((double)1.79769313486231570814527423731704357e+308L) __DBL_MAX_EXP__=1024 __DBL_MIN_10_EXP__=(-307) __DBL_MIN__=((double)2.22507385850720138309023271733240406e-308L) __DBL_MIN_EXP__=(-1021) __DBL_NORM_MAX__=((double)1.79769313486231570814527423731704357e+308L) __DEC128_EPSILON__=1E-33DL __DEC128_MANT_DIG__=34 __DEC128_MAX__=9.999999999999999999999999999999999E6144DL __DEC128_MAX_EXP__=6145 __DEC128_MIN__=1E-6143DL __DEC128_MIN_EXP__=(-6142) __DEC128_SUBNORMAL_MIN__=0.000000000000000000000000000000001E-6143DL __DEC32_EPSILON__=1E-6DF __DEC32_MANT_DIG__=7 __DEC32_MAX__=9.999999E96DF __DEC32_MAX_EXP__=97 __DEC32_MIN__=1E-95DF __DEC32_MIN_EXP__=(-94) __DEC32_SUBNORMAL_MIN__=0.000001E-95DF __DEC64_EPSILON__=1E-15DD __DEC64_MANT_DIG__=16 __DEC64_MAX__=9.999999999999999E384DD __DEC64_MAX_EXP__=385 __DEC64_MIN__=1E-383DD __DEC64_MIN_EXP__=(-382) __DEC64_SUBNORMAL_MIN__=0.000000000000001E-383DD __DEC_EVAL_METHOD__=2 __DECIMAL_BID_FORMAT__=1 __DECIMAL_DIG__=21 __ELF__=1 _FILE_OFFSET_BITS=64 __FINITE_MATH_ONLY__=0 __FLOAT_WORD_ORDER__=1234 __FLT128_DECIMAL_DIG__=36 __FLT128_DENORM_MIN__=6.47517511943802511092443895822764655e-4966F128 __FLT128_DIG__=33 __FLT128_EPSILON__=1.92592994438723585305597794258492732e-34F128 __FLT128_HAS_DENORM__=1 __FLT128_HAS_INFINITY__=1 __FLT128_HAS_QUIET_NAN__=1 __FLT128_IS_IEC_60559__=1 __FLT128_MANT_DIG__=113 __FLT128_MAX_10_EXP__=4932 __FLT128_MAX__=1.18973149535723176508575932662800702e+4932F128 __FLT128_MAX_EXP__=16384 __FLT128_MIN_10_EXP__=(-4931) __FLT128_MIN__=3.36210314311209350626267781732175260e-4932F128 __FLT128_MIN_EXP__=(-16381) __FLT128_NORM_MAX__=1.18973149535723176508575932662800702e+4932F128 __FLT16_DECIMAL_DIG__=5 __FLT16_DENORM_MIN__=5.96046447753906250000000000000000000e-8F16 __FLT16_DIG__=3 __FLT16_EPSILON__=9.76562500000000000000000000000000000e-4F16 __FLT16_HAS_DENORM__=1 __FLT16_HAS_INFINITY__=1 __FLT16_HAS_QUIET_NAN__=1 __FLT16_IS_IEC_60559__=1 __FLT16_MANT_DIG__=11 __FLT16_MAX_10_EXP__=4 __FLT16_MAX__=6.55040000000000000000000000000000000e+4F16 __FLT16_MAX_EXP__=16 __FLT16_MIN_10_EXP__=(-4) __FLT16_MIN__=6.10351562500000000000000000000000000e-5F16 __FLT16_MIN_EXP__=(-13) __FLT16_NORM_MAX__=6.55040000000000000000000000000000000e+4F16 __FLT32_DECIMAL_DIG__=9 __FLT32_DENORM_MIN__=1.40129846432481707092372958328991613e-45F32 __FLT32_DIG__=6 __FLT32_EPSILON__=1.19209289550781250000000000000000000e-7F32 __FLT32_HAS_DENORM__=1 __FLT32_HAS_INFINITY__=1 __FLT32_HAS_QUIET_NAN__=1 __FLT32_IS_IEC_60559__=1 __FLT32_MANT_DIG__=24 __FLT32_MAX_10_EXP__=38 __FLT32_MAX__=3.40282346638528859811704183484516925e+38F32 __FLT32_MAX_EXP__=128 __FLT32_MIN_10_EXP__=(-37) __FLT32_MIN__=1.17549435082228750796873653722224568e-38F32 __FLT32_MIN_EXP__=(-125) __FLT32_NORM_MAX__=3.40282346638528859811704183484516925e+38F32 __FLT32X_DECIMAL_DIG__=17 __FLT32X_DENORM_MIN__=4.94065645841246544176568792868221372e-324F32x __FLT32X_DIG__=15 __FLT32X_EPSILON__=2.22044604925031308084726333618164062e-16F32x __FLT32X_HAS_DENORM__=1 __FLT32X_HAS_INFINITY__=1 __FLT32X_HAS_QUIET_NAN__=1 __FLT32X_IS_IEC_60559__=1 __FLT32X_MANT_DIG__=53 __FLT32X_MAX_10_EXP__=308 __FLT32X_MAX__=1.79769313486231570814527423731704357e+308F32x __FLT32X_MAX_EXP__=1024 __FLT32X_MIN_10_EXP__=(-307) __FLT32X_MIN__=2.22507385850720138309023271733240406e-308F32x __FLT32X_MIN_EXP__=(-1021) __FLT32X_NORM_MAX__=1.79769313486231570814527423731704357e+308F32x __FLT64_DECIMAL_DIG__=17 __FLT64_DENORM_MIN__=4.94065645841246544176568792868221372e-324F64 __FLT64_DIG__=15 __FLT64_EPSILON__=2.22044604925031308084726333618164062e-16F64 __FLT64_HAS_DENORM__=1 __FLT64_HAS_INFINITY__=1 __FLT64_HAS_QUIET_NAN__=1 __FLT64_IS_IEC_60559__=1 __FLT64_MANT_DIG__=53 __FLT64_MAX_10_EXP__=308 __FLT64_MAX__=1.79769313486231570814527423731704357e+308F64 __FLT64_MAX_EXP__=1024 __FLT64_MIN_10_EXP__=(-307) __FLT64_MIN__=2.22507385850720138309023271733240406e-308F64 __FLT64_MIN_EXP__=(-1021) __FLT64_NORM_MAX__=1.79769313486231570814527423731704357e+308F64 __FLT64X_DECIMAL_DIG__=21 __FLT64X_DENORM_MIN__=3.64519953188247460252840593361941982e-4951F64x __FLT64X_DIG__=18 __FLT64X_EPSILON__=1.08420217248550443400745280086994171e-19F64x __FLT64X_HAS_DENORM__=1 __FLT64X_HAS_INFINITY__=1 __FLT64X_HAS_QUIET_NAN__=1 __FLT64X_IS_IEC_60559__=1 __FLT64X_MANT_DIG__=64 __FLT64X_MAX_10_EXP__=4932 __FLT64X_MAX__=1.18973149535723176502126385303097021e+4932F64x __FLT64X_MAX_EXP__=16384 __FLT64X_MIN_10_EXP__=(-4931) __FLT64X_MIN__=3.36210314311209350626267781732175260e-4932F64x __FLT64X_MIN_EXP__=(-16381) __FLT64X_NORM_MAX__=1.18973149535723176502126385303097021e+4932F64x __FLT_DECIMAL_DIG__=9 __FLT_DENORM_MIN__=1.40129846432481707092372958328991613e-45F __FLT_DIG__=6 __FLT_EPSILON__=1.19209289550781250000000000000000000e-7F __FLT_EVAL_METHOD__=0 __FLT_EVAL_METHOD_TS_18661_3__=0 __FLT_HAS_DENORM__=1 __FLT_HAS_INFINITY__=1 __FLT_HAS_QUIET_NAN__=1 __FLT_IS_IEC_60559__=1 __FLT_MANT_DIG__=24 __FLT_MAX_10_EXP__=38 __FLT_MAX__=3.40282346638528859811704183484516925e+38F __FLT_MAX_EXP__=128 __FLT_MIN_10_EXP__=(-37) __FLT_MIN__=1.17549435082228750796873653722224568e-38F __FLT_MIN_EXP__=(-125) __FLT_NORM_MAX__=3.40282346638528859811704183484516925e+38F __FLT_RADIX__=2 __FXSR__=1 __GCC_ASM_FLAG_OUTPUTS__=1 __GCC_ATOMIC_BOOL_LOCK_FREE=2 __GCC_ATOMIC_CHAR16_T_LOCK_FREE=2 __GCC_ATOMIC_CHAR32_T_LOCK_FREE=2 __GCC_ATOMIC_CHAR_LOCK_FREE=2 __GCC_ATOMIC_INT_LOCK_FREE=2 __GCC_ATOMIC_LLONG_LOCK_FREE=2 __GCC_ATOMIC_LONG_LOCK_FREE=2 __GCC_ATOMIC_POINTER_LOCK_FREE=2 __GCC_ATOMIC_SHORT_LOCK_FREE=2 __GCC_ATOMIC_TEST_AND_SET_TRUEVAL=1 __GCC_ATOMIC_WCHAR_T_LOCK_FREE=2 __GCC_CONSTRUCTIVE_SIZE=64 __GCC_DESTRUCTIVE_SIZE=64 __GCC_HAVE_DWARF2_CFI_ASM=1 __GCC_HAVE_SYNC_COMPARE_AND_SWAP_1=1 __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2=1 __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4=1 __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8=1 __GCC_IEC_559=2 __GCC_IEC_559_COMPLEX=2 __GLIBC__=2 __GLIBC_MINOR__=37 __GNUC__=13 __GNUC_EXECUTION_CHARSET_NAME="UTF-8" __GNUC_MINOR__=0 __GNUC_PATCHLEVEL__=1 __GNUC_STDC_INLINE__=1 __GNUC_WIDE_EXECUTION_CHARSET_NAME="UTF-32LE" __GNU_LIBRARY__=6 __gnu_linux__=1 _GNU_SOURCE=1 __GXX_ABI_VERSION=1018 __HAVE_SPECULATION_SAFE_VALUE=1 __INT16_C=__INT16_C __INT16_MAX__=0x7fff __INT16_TYPE__=short\ int __INT32_C=__INT32_C __INT32_MAX__=0x7fffffff __INT32_TYPE__=int __INT64_C=__INT64_C __INT64_MAX__=0x7fffffffffffffffL __INT64_TYPE__=long\ int __INT8_C=__INT8_C __INT8_MAX__=0x7f __INT8_TYPE__=signed\ char __INT_FAST16_MAX__=0x7fffffffffffffffL __INT_FAST16_TYPE__=long\ int __INT_FAST16_WIDTH__=64 __INT_FAST32_MAX__=0x7fffffffffffffffL __INT_FAST32_TYPE__=long\ int __INT_FAST32_WIDTH__=64 __INT_FAST64_MAX__=0x7fffffffffffffffL __INT_FAST64_TYPE__=long\ int __INT_FAST64_WIDTH__=64 __INT_FAST8_MAX__=0x7f __INT_FAST8_TYPE__=signed\ char __INT_FAST8_WIDTH__=8 __INT_LEAST16_MAX__=0x7fff __INT_LEAST16_TYPE__=short\ int __INT_LEAST16_WIDTH__=16 __INT_LEAST32_MAX__=0x7fffffff __INT_LEAST32_TYPE__=int __INT_LEAST32_WIDTH__=32 __INT_LEAST64_MAX__=0x7fffffffffffffffL __INT_LEAST64_TYPE__=long\ int __INT_LEAST64_WIDTH__=64 __INT_LEAST8_MAX__=0x7f __INT_LEAST8_TYPE__=signed\ char __INT_LEAST8_WIDTH__=8 __INT_MAX__=0x7fffffff __INTMAX_C=__INTMAX_C __INTMAX_MAX__=0x7fffffffffffffffL __INTMAX_TYPE__=long\ int __INTMAX_WIDTH__=64 __INTPTR_MAX__=0x7fffffffffffffffL __INTPTR_TYPE__=long\ int __INTPTR_WIDTH__=64 __INT_WIDTH__=32 __k8=1 __k8__=1 _LARGEFILE64_SOURCE=1 _LARGEFILE_SOURCE=1 __LDBL_DECIMAL_DIG__=21 __LDBL_DENORM_MIN__=3.64519953188247460252840593361941982e-4951L __LDBL_DIG__=18 __LDBL_EPSILON__=1.08420217248550443400745280086994171e-19L __LDBL_HAS_DENORM__=1 __LDBL_HAS_INFINITY__=1 __LDBL_HAS_QUIET_NAN__=1 __LDBL_IS_IEC_60559__=1 __LDBL_MANT_DIG__=64 __LDBL_MAX_10_EXP__=4932 __LDBL_MAX__=1.18973149535723176502126385303097021e+4932L __LDBL_MAX_EXP__=16384 __LDBL_MIN_10_EXP__=(-4931) __LDBL_MIN__=3.36210314311209350626267781732175260e-4932L __LDBL_MIN_EXP__=(-16381) __LDBL_NORM_MAX__=1.18973149535723176502126385303097021e+4932L __linux=1 __linux__=1 linux=1 __LONG_LONG_MAX__=0x7fffffffffffffffLL __LONG_LONG_WIDTH__=64 __LONG_MAX__=0x7fffffffffffffffL __LONG_WIDTH__=64 __LP64__=1 _LP64=1 __MMX__=1 __MMX_WITH_SSE__=1 __ORDER_BIG_ENDIAN__=4321 __ORDER_LITTLE_ENDIAN__=1234 __ORDER_PDP_ENDIAN__=3412 __pic__=2 __PIC__=2 _POSIX_C_SOURCE=200809L _POSIX_SOURCE=1 __PRAGMA_REDEFINE_EXTNAME=1 __PTRDIFF_MAX__=0x7fffffffffffffffL __PTRDIFF_TYPE__=long\ int __PTRDIFF_WIDTH__=64 _REENTRANT=1 __REGISTER_PREFIX__= __SCHAR_MAX__=0x7f __SCHAR_WIDTH__=8 __SEG_FS=1 __SEG_GS=1 __SHRT_MAX__=0x7fff __SHRT_WIDTH__=16 __SIG_ATOMIC_MAX__=0x7fffffff __SIG_ATOMIC_MIN__=(-0x7fffffff\ -\ 1) __SIG_ATOMIC_TYPE__=int __SIG_ATOMIC_WIDTH__=32 __SIZE_MAX__=0xffffffffffffffffUL __SIZEOF_DOUBLE__=8 __SIZEOF_FLOAT128__=16 __SIZEOF_FLOAT__=4 __SIZEOF_FLOAT80__=16 __SIZEOF_INT128__=16 __SIZEOF_INT__=4 __SIZEOF_LONG__=8 __SIZEOF_LONG_DOUBLE__=16 __SIZEOF_LONG_LONG__=8 __SIZEOF_POINTER__=8 __SIZEOF_PTRDIFF_T__=8 __SIZEOF_SHORT__=2 __SIZEOF_SIZE_T__=8 __SIZEOF_WCHAR_T__=4 __SIZEOF_WINT_T__=4 __SIZE_TYPE__=long\ unsigned\ int __SIZE_WIDTH__=64 __SSE__=1 __SSE2__=1 __SSE2_MATH__=1 __SSE_MATH__=1 __STDC__=1 __STDC_HOSTED__=1 __STDC_IEC_559__=1 __STDC_IEC_559_COMPLEX__=1 __STDC_IEC_60559_BFP__=201404L __STDC_IEC_60559_COMPLEX__=201404L __STDC_ISO_10646__=201706L _STDC_PREDEF_H=1 __STDC_UTF_16__=1 __STDC_UTF_32__=1 __STDC_VERSION__=201710L __UINT16_C=__UINT16_C __UINT16_MAX__=0xffff __UINT16_TYPE__=short\ unsigned\ int __UINT32_C=__UINT32_C __UINT32_MAX__=0xffffffffU __UINT32_TYPE__=unsigned\ int __UINT64_C=__UINT64_C __UINT64_MAX__=0xffffffffffffffffUL __UINT64_TYPE__=long\ unsigned\ int __UINT8_C=__UINT8_C __UINT8_MAX__=0xff __UINT8_TYPE__=unsigned\ char __UINT_FAST16_MAX__=0xffffffffffffffffUL __UINT_FAST16_TYPE__=long\ unsigned\ int __UINT_FAST32_MAX__=0xffffffffffffffffUL __UINT_FAST32_TYPE__=long\ unsigned\ int __UINT_FAST64_MAX__=0xffffffffffffffffUL __UINT_FAST64_TYPE__=long\ unsigned\ int __UINT_FAST8_MAX__=0xff __UINT_FAST8_TYPE__=unsigned\ char __UINT_LEAST16_MAX__=0xffff __UINT_LEAST16_TYPE__=short\ unsigned\ int __UINT_LEAST32_MAX__=0xffffffffU __UINT_LEAST32_TYPE__=unsigned\ int __UINT_LEAST64_MAX__=0xffffffffffffffffUL __UINT_LEAST64_TYPE__=long\ unsigned\ int __UINT_LEAST8_MAX__=0xff __UINT_LEAST8_TYPE__=unsigned\ char __UINTMAX_C=__UINTMAX_C __UINTMAX_MAX__=0xffffffffffffffffUL __UINTMAX_TYPE__=long\ unsigned\ int __UINTPTR_MAX__=0xffffffffffffffffUL __UINTPTR_TYPE__=long\ unsigned\ int __unix=1 __unix__=1 unix=1 __USE_FILE_OFFSET64=1 __USE_GNU=1 __USE_LARGEFILE=1 __USE_LARGEFILE64=1 __USE_MISC=1 __USE_POSIX=1 __USE_POSIX199309=1 __USE_POSIX199506=1 __USE_POSIX2=1 __USER_LABEL_PREFIX__= __USE_UNIX98=1 __USE_XOPEN=1 __USE_XOPEN_EXTENDED=1 __VERSION__="13.0.1\ 20230421\ (prerelease)\ [revision\ f980561c60b0446cc427595198d7f3f4f90e0924]" __WCHAR_MAX__=0x7fffffff __WCHAR_MIN__=(-0x7fffffff\ -\ 1) __WCHAR_TYPE__=int __WCHAR_WIDTH__=32 __WINT_MAX__=0xffffffffU __WINT_MIN__=0U __WINT_TYPE__=unsigned\ int __WINT_WIDTH__=32 __x86_64=1 __x86_64__=1 _XOPEN_SOURCE=700 _XOPEN_SOURCE_EXTENDED=1'
 crypt_r_proto='REENTRANT_PROTO_B_CCS'
 cryptlib=''
-csh='csh'
+csh='tcsh'
 ctermid_r_proto='0'
 ctime_r_proto='REENTRANT_PROTO_B_SB'
-d_Gconvert='qgcvt((x),(n),(b))'
+d_Gconvert='sprintf((b),"%.*g",(n),(x))'
 d_PRIEUldbl='define'
 d_PRIFUldbl='define'
 d_PRIGUldbl='define'
@@ -141,6 +136,7 @@ d_attribute_nonnull='define'
 d_attribute_noreturn='define'
 d_attribute_pure='define'
 d_attribute_unused='define'
+d_attribute_visibility='define'
 d_attribute_warn_unused_result='define'
 d_backtrace='define'
 d_bsd='undef'
@@ -229,8 +225,8 @@ d_fdclose='undef'
 d_fdim='define'
 d_fds_bits='define'
 d_fegetround='define'
-d_ffs='undef'
-d_ffsl='undef'
+d_ffs='define'
+d_ffsl='define'
 d_fgetpos='define'
 d_finite='define'
 d_finitel='define'
@@ -438,10 +434,10 @@ d_nextafter='define'
 d_nexttoward='define'
 d_nice='define'
 d_nl_langinfo='define'
-d_nl_langinfo_l='undef'
+d_nl_langinfo_l='define'
 d_non_int_bitfields='define'
 d_nv_preserves_uv='define'
-d_nv_zero_is_allbits_zero='undef'
+d_nv_zero_is_allbits_zero='define'
 d_off64_t='define'
 d_old_pthread_create_joinable='undef'
 d_oldpthreads='undef'
@@ -509,6 +505,7 @@ d_semget='define'
 d_semop='define'
 d_sendmsg='define'
 d_setegid='define'
+d_setenv='define'
 d_seteuid='define'
 d_setgrent='define'
 d_setgrent_r='undef'
@@ -607,21 +604,21 @@ d_strtoul='define'
 d_strtoull='define'
 d_strtouq='define'
 d_strxfrm='define'
-d_strxfrm_l='undef'
+d_strxfrm_l='define'
 d_suidsafe='undef'
 d_symlink='define'
 d_syscall='define'
 d_syscallproto='define'
 d_sysconf='define'
 d_sysernlst=''
-d_syserrlst='define'
+d_syserrlst='undef'
 d_system='define'
 d_tcgetpgrp='define'
 d_tcsetpgrp='define'
 d_telldir='define'
 d_telldirproto='define'
 d_tgamma='define'
-d_thread_local='undef'
+d_thread_local='define'
 d_thread_safe_nl_langinfo_l='define'
 d_time='define'
 d_timegm='define'
@@ -714,11 +711,11 @@ fpostype='fpos_t'
 freetype='void'
 from=':'
 full_ar='/usr/bin/ar'
-full_csh='/usr/bin/csh'
+full_csh='/usr/bin/tcsh'
 full_sed='/usr/bin/sed'
 gccansipedantic=''
 gccosandvers=''
-gccversion='10.2.1 20200805 [revision dda1e9d08434def88ed86557d08b23251332c5aa]'
+gccversion='13.0.1 20230421 (prerelease) [revision f980561c60b0446cc427595198d7f3f4f90e0924]'
 getgrent_r_proto='REENTRANT_PROTO_I_SBWR'
 getgrgid_r_proto='REENTRANT_PROTO_I_TSBWR'
 getgrnam_r_proto='REENTRANT_PROTO_I_CSBWR'
@@ -746,7 +743,7 @@ gidtype='gid_t'
 glibpth='/usr/shlib  /lib /usr/lib /usr/lib/386 /lib/386 /usr/ccs/lib /usr/ucblib /usr/local/lib /lib64 /usr/lib64 /usr/local/lib64 '
 gmake='gmake'
 gmtime_r_proto='REENTRANT_PROTO_S_TS'
-gnulibc_version='2.31'
+gnulibc_version='2.37'
 grep='grep'
 groupcat='cat /etc/group'
 groupstype='gid_t'
@@ -764,6 +761,7 @@ html3dir=' '
 html3direxp=''
 i16size='2'
 i16type='short'
+i32dformat='"d"'
 i32size='4'
 i32type='int'
 i64size='8'
@@ -834,6 +832,7 @@ i_syssockio='undef'
 i_sysstat='define'
 i_sysstatfs='define'
 i_sysstatvfs='define'
+i_syssyscall='define'
 i_systime='define'
 i_systimek='undef'
 i_systimes='define'
@@ -857,28 +856,28 @@ ignore_versioned_solibs='y'
 inc_version_list=''
 inc_version_list_init='0'
 incpath=''
-incpth='/usr/lib64/gcc/x86_64-suse-linux/10/include /usr/local/include /usr/lib64/gcc/x86_64-suse-linux/10/include-fixed /usr/lib64/gcc/x86_64-suse-linux/10/../../../../x86_64-suse-linux/include /usr/include'
+incpth='/usr/lib64/gcc/x86_64-suse-linux/13/include /usr/local/include /usr/lib64/gcc/x86_64-suse-linux/13/include-fixed /usr/x86_64-suse-linux/include /usr/include'
 inews=''
-initialinstalllocation='/opt/perl/bin'
-installarchlib='/opt/perl/lib/5.36.3/x86_64-linux-thread-multi-ld'
-installbin='/opt/perl/bin'
+initialinstalllocation='/pro/bin'
+installarchlib='/pro/lib/perl5/5.38.2/x86_64-linux-thread-multi-quadmath'
+installbin='/pro/bin'
 installhtml1dir=''
 installhtml3dir=''
-installman1dir='/opt/perl/man/man1'
-installman3dir='/opt/perl/man/man3'
-installprefix='/opt/perl'
-installprefixexp='/opt/perl'
-installprivlib='/opt/perl/lib/5.36.3'
-installscript='/opt/perl/bin'
-installsitearch='/opt/perl/lib/site_perl/5.36.3/x86_64-linux-thread-multi-ld'
-installsitebin='/opt/perl/bin'
+installman1dir='/pro/local/man/man1'
+installman3dir='/pro/local/man/man3'
+installprefix='/pro'
+installprefixexp='/pro'
+installprivlib='/pro/lib/perl5/5.38.2'
+installscript='/pro/bin'
+installsitearch='/pro/lib/perl5/site_perl/5.38.2/x86_64-linux-thread-multi-quadmath'
+installsitebin='/pro/bin'
 installsitehtml1dir=''
 installsitehtml3dir=''
-installsitelib='/opt/perl/lib/site_perl/5.36.3'
-installsiteman1dir='/opt/perl/man/man1'
-installsiteman3dir='/opt/perl/man/man3'
-installsitescript='/opt/perl/bin'
-installstyle='lib'
+installsitelib='/pro/lib/perl5/site_perl/5.38.2'
+installsiteman1dir='/pro/local/man/man1'
+installsiteman3dir='/pro/local/man/man3'
+installsitescript='/pro/bin'
+installstyle='lib/perl5'
 installusrbinperl='undef'
 installvendorarch=''
 installvendorbin=''
@@ -897,21 +896,21 @@ known_extensions='Amiga/ARexx Amiga/Exec Archive/Tar Attribute/Handlers attribut
 ksh=''
 ld='cc'
 ld_can_script='define'
-lddlflags='-shared -O2 -L/usr/local/lib -fstack-protector-strong'
-ldflags=' -fstack-protector-strong -L/usr/local/lib'
+lddlflags='-shared -O2 -L/pro/local/lib -fstack-protector-strong'
+ldflags='-L/pro/local/lib -fstack-protector-strong'
 ldflags_uselargefiles=''
 ldlibpthname='LD_LIBRARY_PATH'
 less='less'
 lib_ext='.a'
-libc='libc-2.31.so'
+libc='/lib/../lib64/libc.so.6'
 libperl='libperl.a'
-libpth='/usr/local/lib /usr/lib64/gcc/x86_64-suse-linux/10/include-fixed /usr/lib64/gcc/x86_64-suse-linux/10/../../../../x86_64-suse-linux/lib /usr/lib /lib/../lib64 /usr/lib/../lib64 /lib /lib64 /usr/lib64 /usr/local/lib64'
-libs='-lpthread -lnsl -lgdbm -ldb -ldl -lm -lcrypt -lutil -lc -lgdbm_compat'
-libsdirs=' /usr/lib/../lib64'
-libsfiles=' libpthread.so libnsl.so libgdbm.so libdb.so libdl.so libm.so libcrypt.so libutil.so libc.so libgdbm_compat.so'
-libsfound=' /usr/lib/../lib64/libpthread.so /usr/lib/../lib64/libnsl.so /usr/lib/../lib64/libgdbm.so /usr/lib/../lib64/libdb.so /usr/lib/../lib64/libdl.so /usr/lib/../lib64/libm.so /usr/lib/../lib64/libcrypt.so /usr/lib/../lib64/libutil.so /usr/lib/../lib64/libc.so /usr/lib/../lib64/libgdbm_compat.so'
-libspath=' /usr/local/lib /usr/lib64/gcc/x86_64-suse-linux/10/include-fixed /usr/lib64/gcc/x86_64-suse-linux/10/../../../../x86_64-suse-linux/lib /usr/lib /lib/../lib64 /usr/lib/../lib64 /lib /lib64 /usr/lib64 /usr/local/lib64'
-libswanted='cl pthread cl pthread socket inet nsl gdbm dbm db malloc dl ld sun m crypt sec util c cposix posix ucb BSD gdbm_compat'
+libpth='/usr/local/lib /usr/x86_64-suse-linux/lib /usr/lib /data/pro/local/lib /usr/lib64 /usr/local/lib64'
+libs='-lpthread -lgdbm -ldb -ldl -lm -lcrypt -lutil -lc -lgdbm_compat -lquadmath'
+libsdirs=' /usr/lib64'
+libsfiles=' libpthread.a libgdbm.so libdb.so libdl.a libm.so libcrypt.so libutil.a libc.so libgdbm_compat.so'
+libsfound=' /usr/lib64/libpthread.a /usr/lib64/libgdbm.so /usr/lib64/libdb.so /usr/lib64/libdl.a /usr/lib64/libm.so /usr/lib64/libcrypt.so /usr/lib64/libutil.a /usr/lib64/libc.so /usr/lib64/libgdbm_compat.so'
+libspath=' /usr/local/lib /usr/x86_64-suse-linux/lib /usr/lib /data/pro/local/lib /usr/lib64 /usr/local/lib64 /usr/lib64/gcc/x86_64-suse-linux/13 /usr/lib64/gcc/x86_64-suse-linux/13/../../../../lib64 /usr/lib64/gcc/x86_64-suse-linux/13/../../..'
+libswanted='cl pthread socket inet gdbm dbm db malloc dl ld sun m crypt sec util c cposix posix ucb BSD gdbm_compat'
 libswanted_uselargefiles=''
 line=''
 lint=''
@@ -919,8 +918,8 @@ lkflags=''
 ln='ln'
 lns='/usr/bin/ln -s'
 localtime_r_proto='REENTRANT_PROTO_S_TS'
-locincpth='/usr/local/include /opt/local/include /usr/gnu/include /opt/gnu/include /usr/GNU/include /opt/GNU/include'
-loclibpth='/usr/local/lib /opt/local/lib /usr/gnu/lib /opt/gnu/lib /usr/GNU/lib /opt/GNU/lib'
+locincpth='/pro/local/include'
+loclibpth='/pro/local/lib'
 longdblinfbytes='0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00'
 longdblkind='3'
 longdblmantbits='64'
@@ -940,11 +939,11 @@ make_set_make='#'
 mallocobj=''
 mallocsrc=''
 malloctype='void *'
-man1dir='/opt/perl/man/man1'
-man1direxp='/opt/perl/man/man1'
+man1dir='/pro/local/man/man1'
+man1direxp='/pro/local/man/man1'
 man1ext='1'
-man3dir='/opt/perl/man/man3'
-man3direxp='/opt/perl/man/man3'
+man3dir='/pro/local/man/man3'
+man3direxp='/pro/local/man/man3'
 man3ext='3'
 mips_type=''
 mistrustnm=''
@@ -955,9 +954,9 @@ more='more'
 multiarch='undef'
 mv=''
 myarchname='x86_64-linux'
-mydomain='.yourplace.com'
-myhostname='yourhost'
-myuname='linux lx09 5.8.0-1-default #1 smp tue aug 4 07:30:59 utc 2020 (9bc0044) x86_64 x86_64 x86_64 gnulinux '
+mydomain='.procura.nl'
+myhostname='lx09'
+myuname='linux lx09 6.2.12-1-default #1 smp preempt_dynamic thu apr 20 11:01:10 utc 2023 (eb3255d) x86_64 x86_64 x86_64 gnulinux '
 n='-n'
 need_va_copy='define'
 netdb_hlen_type='size_t'
@@ -969,48 +968,48 @@ nm_opt=''
 nm_so_opt='--dynamic'
 nonxs_ext='Archive/Tar Attribute/Handlers autodie AutoLoader autouse base bignum Carp Config/Perl/V constant CPAN CPAN/Meta CPAN/Meta/Requirements CPAN/Meta/YAML Devel/SelfStubber Digest Dumpvalue encoding/warnings Env Errno experimental Exporter ExtUtils/CBuilder ExtUtils/Constant ExtUtils/Install ExtUtils/MakeMaker ExtUtils/Manifest ExtUtils/Miniperl ExtUtils/ParseXS ExtUtils/PL2Bat FileCache File/Fetch File/Find File/Path File/Temp Filter/Simple FindBin Getopt/Long HTTP/Tiny I18N/Collate I18N/LangTags if IO/Compress IO/Socket/IP IO/Zlib IPC/Cmd IPC/Open3 JSON/PP lib libnet Locale/Maketext Locale/Maketext/Simple Math/BigInt Math/BigRat Math/Complex Memoize Module/CoreList Module/Load Module/Load/Conditional Module/Loaded Module/Metadata Net/Ping NEXT Params/Check parent perlfaq PerlIO/via/QuotedPrint Perl/OSType Pod/Checker Pod/Escapes Pod/Functions Pod/Html podlators Pod/Perldoc Pod/Simple Pod/Usage Safe Search/Dict SelfLoader Term/ANSIColor Term/Cap Term/Complete Term/ReadLine Test Test/Harness Test/Simple Text/Abbrev Text/Balanced Text/ParseWords Text/Tabs Thread/Queue Thread/Semaphore Tie/File Tie/Hash/NamedCapture Tie/Memoize Tie/RefHash Time/Local version XSLoader'
 nroff='nroff'
-nvEUformat='"LE"'
-nvFUformat='"LF"'
-nvGUformat='"LG"'
-nv_overflows_integers_at='256.0*256.0*256.0*256.0*256.0*256.0*256.0*2.0*2.0*2.0*2.0*2.0*2.0*2.0*2.0'
+nvEUformat='"QE"'
+nvFUformat='"QF"'
+nvGUformat='"QG"'
+nv_overflows_integers_at='256.0*256.0*256.0*256.0*256.0*256.0*256.0*256.0*256.0*256.0*256.0*256.0*256.0*256.0*2.0'
 nv_preserves_uv_bits='64'
-nveformat='"Le"'
-nvfformat='"Lf"'
-nvgformat='"Lg"'
-nvmantbits='64'
+nveformat='"Qe"'
+nvfformat='"Qf"'
+nvgformat='"Qg"'
+nvmantbits='112'
 nvsize='16'
-nvtype='long double'
+nvtype='__float128'
 o_nonblock='O_NONBLOCK'
 obj_ext='.o'
 old_pthread_create_joinable=''
 optimize='-O2'
 orderlib='false'
 osname='linux'
-osvers='5.8.0-1-default'
+osvers='6.2.12-1-default'
 otherlibdirs=' '
 package='perl5'
-pager='/usr/bin/less -R'
+pager='/pro/bin/less -R'
 passcat='cat /etc/passwd'
-patchlevel='33'
+patchlevel='37'
 path_sep=':'
-perl5='/usr/bin/perl'
+perl5='/pro/bin/perl'
 perl='perl'
 perl_patchlevel=''
 perl_static_inline='static __inline__'
-perl_thread_local=''
-perladmin='yourname@yourhost.yourplace.com'
-perllibs='-lpthread -lnsl -ldl -lm -lcrypt -lutil -lc'
-perlpath='/opt/perl/bin/perl5.36.3'
+perl_thread_local='_Thread_local'
+perladmin='hmbrand@cpan.org'
+perllibs='-lpthread -ldl -lm -lcrypt -lutil -lc -lquadmath'
+perlpath='/pro/bin/perl5.38.2'
 pg='pg'
-phostname=''
+phostname='hostname'
 pidtype='pid_t'
-plibpth='/lib/x86_64-suse-linux/10 /lib/../lib64 /usr/lib/x86_64-suse-linux/10 /usr/lib/../lib64 /lib /usr/lib'
+plibpth='/lib/x86_64-suse-linux/13 /lib/../lib64 /usr/lib/x86_64-suse-linux/13 /usr/lib/../lib64 /lib /usr/lib'
 pmake=''
 pr=''
-prefix='/opt/perl'
-prefixexp='/opt/perl'
-privlib='/opt/perl/lib/5.36.3'
-privlibexp='/opt/perl/lib/5.36.3'
+prefix='/pro'
+prefixexp='/pro'
+privlib='/pro/lib/perl5/5.38.2'
+privlibexp='/pro/lib/perl5/5.38.2'
 procselfexe='"/proc/self/exe"'
 ptrsize='8'
 quadkind='2'
@@ -1032,7 +1031,7 @@ runnm='false'
 sGMTIME_max='67768036191676799'
 sGMTIME_min='-62167219200'
 sLOCALTIME_max='67768036191673199'
-sLOCALTIME_min='-62167220372'
+sLOCALTIME_min='-62167220250'
 sPRIEUldbl='"LE"'
 sPRIFUldbl='"LF"'
 sPRIGUldbl='"LG"'
@@ -1047,8 +1046,8 @@ sPRIu64='"lu"'
 sPRIx64='"lx"'
 sSCNfldbl='"Lf"'
 sched_yield='sched_yield()'
-scriptdir='/opt/perl/bin'
-scriptdirexp='/opt/perl/bin'
+scriptdir='/pro/bin'
+scriptdirexp='/pro/bin'
 sed='sed'
 seedfunc='Perl_drand48_init'
 selectminbits='64'
@@ -1075,25 +1074,25 @@ 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, 0'
 sig_size='68'
 signal_t='void'
-sitearch='/opt/perl/lib/site_perl/5.36.3/x86_64-linux-thread-multi-ld'
-sitearchexp='/opt/perl/lib/site_perl/5.36.3/x86_64-linux-thread-multi-ld'
-sitebin='/opt/perl/bin'
-sitebinexp='/opt/perl/bin'
+sitearch='/pro/lib/perl5/site_perl/5.38.2/x86_64-linux-thread-multi-quadmath'
+sitearchexp='/pro/lib/perl5/site_perl/5.38.2/x86_64-linux-thread-multi-quadmath'
+sitebin='/pro/bin'
+sitebinexp='/pro/bin'
 sitehtml1dir=''
 sitehtml1direxp=''
 sitehtml3dir=''
 sitehtml3direxp=''
-sitelib='/opt/perl/lib/site_perl/5.36.3'
-sitelib_stem='/opt/perl/lib/site_perl'
-sitelibexp='/opt/perl/lib/site_perl/5.36.3'
-siteman1dir='/opt/perl/man/man1'
-siteman1direxp='/opt/perl/man/man1'
-siteman3dir='/opt/perl/man/man3'
-siteman3direxp='/opt/perl/man/man3'
-siteprefix='/opt/perl'
-siteprefixexp='/opt/perl'
-sitescript='/opt/perl/bin'
-sitescriptexp='/opt/perl/bin'
+sitelib='/pro/lib/perl5/site_perl/5.38.2'
+sitelib_stem='/pro/lib/perl5/site_perl'
+sitelibexp='/pro/lib/perl5/site_perl/5.38.2'
+siteman1dir='/pro/local/man/man1'
+siteman1direxp='/pro/local/man/man1'
+siteman3dir='/pro/local/man/man3'
+siteman3direxp='/pro/local/man/man3'
+siteprefix='/pro'
+siteprefixexp='/pro'
+sitescript='/pro/bin'
+sitescriptexp='/pro/bin'
 sizesize='8'
 sizetype='size_t'
 sleep=''
@@ -1110,10 +1109,10 @@ srandom_r_proto='REENTRANT_PROTO_I_TS'
 src='.'
 ssizetype='ssize_t'
 st_dev_sign='1'
-st_dev_size='4'
+st_dev_size='8'
 st_ino_sign='1'
 st_ino_size='8'
-startperl='#!/opt/perl/bin/perl5.36.3'
+startperl='#!/pro/bin/perl5.38.2'
 startsh='#!/bin/sh'
 static_ext=' '
 stdchar='char'
@@ -1125,7 +1124,7 @@ stdio_ptr='((fp)->_ptr)'
 stdio_stream_array=''
 strerror_r_proto='REENTRANT_PROTO_B_IBW'
 submit=''
-subversion='3'
+subversion='2'
 sysman='/usr/share/man/man1'
 sysroot=''
 tail=''
@@ -1151,8 +1150,12 @@ troff=''
 ttyname_r_proto='REENTRANT_PROTO_I_IBW'
 u16size='2'
 u16type='unsigned short'
+u32XUformat='"X"'
+u32oformat='"o"'
 u32size='4'
 u32type='unsigned int'
+u32uformat='"u"'
+u32xformat='"x"'
 u64size='8'
 u64type='unsigned long'
 u8size='1'
@@ -1177,7 +1180,7 @@ useithreads='define'
 usekernprocpathname='undef'
 uselanginfo='true'
 uselargefiles='define'
-uselongdouble='define'
+uselongdouble='undef'
 usemallocwrap='define'
 usemorebits='undef'
 usemultiplicity='define'
@@ -1187,7 +1190,7 @@ usensgetexecutablepath='undef'
 useopcode='true'
 useperlio='define'
 useposix='true'
-usequadmath='undef'
+usequadmath='define'
 usereentrant='undef'
 userelocatableinc='undef'
 useshrplib='false'
@@ -1224,23 +1227,24 @@ vendorprefix=''
 vendorprefixexp=''
 vendorscript=''
 vendorscriptexp=''
-version='5.36.3'
-version_patchlevel_string='version 36 subversion 3'
+version='5.38.2'
+version_patchlevel_string='version 38 subversion 2'
 versiononly='define'
 vi=''
-xlibpth='/usr/lib/386 /lib/386'
+xlibpth='/usr/lib/386 /lib/386 /usr/lib64/gcc/x86_64-suse-linux/13 /usr/lib64/gcc/x86_64-suse-linux/13/../../../../lib64 /usr/lib64/gcc/x86_64-suse-linux/13/../../..'
 xlocale_needed='undef'
-yacc='yacc'
+yacc='/pro/3gl/CPAN/bin/byacc'
 yaccflags=''
 zcat=''
 zip='zip'
 PERL_REVISION=5
-PERL_VERSION=36
-PERL_SUBVERSION=3
+PERL_VERSION=38
+PERL_SUBVERSION=2
 PERL_API_REVISION=5
-PERL_API_VERSION=36
+PERL_API_VERSION=38
 PERL_API_SUBVERSION=0
 PERL_PATCHLEVEL=''
 PERL_CONFIG_SH=true
 : Variables propagated from previous config.sh file.
 libdb_needs_pthread='N'
+libdirs=' /lib /pro/local/lib'
index 8e68e60..6f4e342 100644 (file)
@@ -54,7 +54,7 @@
  *     This symbol, if defined, indicates that the chsize routine is available
  *     to truncate files.  You might need a -lx to get this routine.
  */
-/*#define      HAS_CHSIZE              / **/
+/*#define HAS_CHSIZE            / **/
 
 /* HAS_CRYPT:
  *     This symbol, if defined, indicates that the crypt routine is available
  *     This symbol, if defined, indicates that the mbstowcs routine is
  *     available to convert a multibyte string into a wide character string.
  */
-#define        HAS_MBSTOWCS            /**/
+#define HAS_MBSTOWCS            /**/
 
 /* HAS_MBTOWC:
  *     This symbol, if defined, indicates that the mbtowc routine is available
  *     This symbol, if defined, indicates to the C program that it should
  *     include <arpa/inet.h> to get inet_addr and friends declarations.
  */
-#define        I_ARPA_INET             /**/
+#define I_ARPA_INET             /**/
 
 /* I_DBM:
  *     This symbol, if defined, indicates that <dbm.h> exists and should
  *     This symbol, if defined, indicates to the C program that it should
  *     include <locale.h>.
  */
-#define        I_LOCALE                /**/
+#define I_LOCALE                /**/
 
 /* I_NETINET_IN:
  *     This symbol, if defined, indicates to the C program that it should
  *     This symbol, if defined, indicates the <sys/sockio.h> should be included
  *     to get socket ioctl options, like SIOCATMARK.
  */
-#define        I_SYS_IOCTL             /**/
+#define I_SYS_IOCTL             /**/
 /*#define I_SYS_SOCKIO / **/
 
 /* I_SYS_NDIR:
  *     This symbol, if defined, indicates to the C program that it should
  *     include <sys/stat.h>.
  */
-#define        I_SYS_STAT              /**/
+#define I_SYS_STAT              /**/
 
 /* I_SYS_TIMES:
  *     This symbol, if defined, indicates to the C program that it should
  *     include <sys/times.h>.
  */
-#define        I_SYS_TIMES             /**/
+#define I_SYS_TIMES             /**/
 
 /* I_SYS_TYPES:
  *     This symbol, if defined, indicates to the C program that it should
  *     include <sys/types.h>.
  */
-#define        I_SYS_TYPES             /**/
+#define I_SYS_TYPES             /**/
 
 /* I_SYS_UN:
  *     This symbol, if defined, indicates to the C program that it should
  *     This symbol is defined if the C compiler can cast negative
  *     or large floating point numbers to 32-bit ints.
  */
-/*#define      CASTI32         / **/
+/*#define CASTI32               / **/
 
 /* CASTNEGFLOAT:
  *     This symbol is defined if the C compiler can cast negative
  *             2 = couldn't cast >= 0x80000000
  *             4 = couldn't cast in argument expression list
  */
-#define        CASTNEGFLOAT            /**/
+#define CASTNEGFLOAT            /**/
 #define CASTFLAGS 0            /**/
 
 /* VOID_CLOSEDIR:
  *     This symbol, if defined, indicates that siginfo_t has the
  *     si_value member
  */
-#define        HAS_SIGINFO_SI_ERRNO    /**/
-#define        HAS_SIGINFO_SI_PID      /**/
-#define        HAS_SIGINFO_SI_UID      /**/
-#define        HAS_SIGINFO_SI_ADDR     /**/
-#define        HAS_SIGINFO_SI_STATUS   /**/
-#define        HAS_SIGINFO_SI_BAND     /**/
-#define        HAS_SIGINFO_SI_VALUE    /**/
+#define HAS_SIGINFO_SI_ERRNO    /**/
+#define HAS_SIGINFO_SI_PID      /**/
+#define HAS_SIGINFO_SI_UID      /**/
+#define HAS_SIGINFO_SI_ADDR     /**/
+#define HAS_SIGINFO_SI_STATUS   /**/
+#define HAS_SIGINFO_SI_BAND     /**/
+#define HAS_SIGINFO_SI_VALUE    /**/
 
 /* HAS_SIGSETJMP:
  *     This variable indicates to the C program that the sigsetjmp()
  *     This symbol, if defined, indicates that this system uses
  *     EBCDIC encoding.
  */
-/*#define      EBCDIC          / **/
+/*#define EBCDIC                / **/
 
 /* ARCHLIB:
  *     This variable, if defined, holds the name of the directory in
  *     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.36.3/x86_64-linux"            /**/
-#define ARCHLIB_EXP "/opt/perl/lib/5.36.3/x86_64-linux"                /**/
+#define ARCHLIB "/opt/perl/lib/5.38.2/x86_64-linux"            /**/
+#define ARCHLIB_EXP "/opt/perl/lib/5.38.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.36.3"         /**/
-#define PRIVLIB_EXP "/opt/perl/lib/5.36.3"             /**/
+#define PRIVLIB "/opt/perl/lib/5.38.2"         /**/
+#define PRIVLIB_EXP "/opt/perl/lib/5.38.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.36.3/x86_64-linux"         /**/
-#define SITEARCH_EXP "/opt/perl/lib/site_perl/5.36.3/x86_64-linux"             /**/
+#define SITEARCH "/opt/perl/lib/site_perl/5.38.2/x86_64-linux"         /**/
+#define SITEARCH_EXP "/opt/perl/lib/site_perl/5.38.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.36.3"               /**/
-#define SITELIB_EXP "/opt/perl/lib/site_perl/5.36.3"           /**/
+#define SITELIB "/opt/perl/lib/site_perl/5.38.2"               /**/
+#define SITELIB_EXP "/opt/perl/lib/site_perl/5.38.2"           /**/
 #define SITELIB_STEM "/opt/perl/lib/site_perl"         /**/
 
 /* PERL_VENDORARCH:
  *     This symbol, if defined, indicates that the system supports filenames
  *     longer than 14 characters.
  */
-#define        FLEXFILENAMES           /**/
+#define FLEXFILENAMES           /**/
 
 /* HAS_GETGRENT:
  *     This symbol, if defined, indicates that the getgrent routine is
  *     This symbol, if defined, indicates the availability of
  *     struct ipv6_mreq_source;
  */
-#define        HAS_SOCKET              /**/
-#define        HAS_SOCKETPAIR  /**/
-/*#define      HAS_SOCKADDR_SA_LEN     / **/
-#define        HAS_SOCKADDR_IN6        /**/
-#define        HAS_SIN6_SCOPE_ID       /**/
-#define        HAS_IP_MREQ     /**/
-#define        HAS_IP_MREQ_SOURCE      /**/
-#define        HAS_IPV6_MREQ   /**/
-/*#define      HAS_IPV6_MREQ_SOURCE    / **/
+#define HAS_SOCKET              /**/
+#define HAS_SOCKETPAIR  /**/
+/*#define HAS_SOCKADDR_SA_LEN   / **/
+#define HAS_SOCKADDR_IN6        /**/
+#define HAS_SIN6_SCOPE_ID       /**/
+#define HAS_IP_MREQ     /**/
+#define HAS_IP_MREQ_SOURCE      /**/
+#define HAS_IPV6_MREQ   /**/
+/*#define HAS_IPV6_MREQ_SOURCE  / **/
 
 /* USE_STAT_BLOCKS:
  *     This symbol is defined if this system has a stat structure declaring
  *     This symbol, if defined, indicates that <sys/uio.h> exists and
  *     should be included.
  */
-#define        I_SYSUIO                /**/
+#define I_SYSUIO                /**/
 
 /* I_TERMIO:
  *     This symbol, if defined, indicates that the program should include
  *     Perl has been cross-compiled to.  Undefined if not a cross-compile.
  */
 #ifndef USE_CROSS_COMPILE
-/*#define      USE_CROSS_COMPILE       / **/
-#define        PERL_TARGETARCH ""      /**/
+/*#define USE_CROSS_COMPILE     / **/
+#define PERL_TARGETARCH ""      /**/
 #endif
 
 /* PERL_USE_DEVEL:
  *     -Dusedevel, to enable development features.  This should not be
  *     done for production builds.
  */
-#define        PERL_USE_DEVEL          /**/
+#define PERL_USE_DEVEL          /**/
 
 /* HAS_ATOLF:
  *     This symbol, if defined, indicates that the atolf routine is
 /* HAS_C99_VARIADIC_MACROS:
  *     If defined, the compiler supports C99 variadic macros.
  */
-#define        HAS_C99_VARIADIC_MACROS /**/
+#define HAS_C99_VARIADIC_MACROS /**/
 
 /* HAS_CLASS:
  *     This symbol, if defined, indicates that the class routine is
  *     to the program to supply one.  A good guess is
  *             extern int dbminit(char *);
  */
-#define        HAS_DBMINIT_PROTO       /**/
+#define HAS_DBMINIT_PROTO       /**/
 
 /* HAS_DIR_DD_FD:
- *     This symbol, if defined, indicates that the the DIR* dirstream
+ *     This symbol, if defined, indicates that the DIR* dirstream
  *     structure contains a member variable named dd_fd.
  */
 /*#define HAS_DIR_DD_FD                / **/
  *     to the program to supply one.  A good guess is
  *             extern int flock(int, int);
  */
-#define        HAS_FLOCK_PROTO /**/
+#define HAS_FLOCK_PROTO /**/
 
 /* HAS_FMA:
  *     This symbol, if defined, indicates that the fma routine is
  *           FP_NAN        NaN
  *
  */
-#define        HAS_FPCLASSIFY          /**/
-/*#define      HAS_FP_CLASSIFY         / **/
+#define HAS_FPCLASSIFY          /**/
+/*#define HAS_FP_CLASSIFY               / **/
 
 /* HAS_FPCLASSL:
  *     This symbol, if defined, indicates that the fpclassl routine is
 /* HAS_FPOS64_T:
  *     This symbol will be defined if the C compiler supports fpos64_t.
  */
-/*#define      HAS_FPOS64_T            / **/
+/*#define HAS_FPOS64_T          / **/
 
 /* HAS_FREXPL:
  *     This symbol, if defined, indicates that the frexpl routine is
 /* HAS_UNLINKAT:
  *     This symbol is defined if the unlinkat() routine is available.
  */
-#define        HAS_FCHMODAT    /**/
-#define        HAS_LINKAT      /**/
-#define        HAS_OPENAT      /**/
-#define        HAS_RENAMEAT    /**/
-#define        HAS_UNLINKAT    /**/
+#define HAS_FCHMODAT    /**/
+#define HAS_LINKAT      /**/
+#define HAS_OPENAT      /**/
+#define HAS_RENAMEAT    /**/
+#define HAS_UNLINKAT    /**/
 
 /* HAS_FSEEKO:
  *     This symbol, if defined, indicates that the fseeko routine is
  *     j0l() function is available for Bessel functions of the first
  *     kind of the order zero, for long doubles.
  */
-#define        HAS_J0          /**/
-#define        HAS_J0L         /**/
+#define HAS_J0          /**/
+#define HAS_J0L         /**/
 
 /* HAS_LC_MONETARY_2008:
  *     This symbol, if defined, indicates that the localeconv routine is
  *     This symbol, if defined, indicates to the C program that it should
  *     include <xlocale.h> to get uselocale() and its friends.
  */
-#define        HAS_NEWLOCALE   /**/
-#define        HAS_FREELOCALE  /**/
-#define        HAS_USELOCALE   /**/
-/*#define      HAS_QUERYLOCALE / **/
-#define        I_XLOCALE               /**/
+#define HAS_NEWLOCALE   /**/
+#define HAS_FREELOCALE  /**/
+#define HAS_USELOCALE   /**/
+/*#define HAS_QUERYLOCALE       / **/
+#define I_XLOCALE               /**/
 
 /* HAS_NEXTAFTER:
  *     This symbol, if defined, indicates that the nextafter routine is
 /* HAS_OFF64_T:
  *     This symbol will be defined if the C compiler supports off64_t.
  */
-/*#define      HAS_OFF64_T             / **/
+/*#define HAS_OFF64_T                   / **/
 
 /* HAS_PIPE2:
  *     This symbol, if defined, indicates that the pipe2
 /* HAS_PTRDIFF_T:
  *     This symbol will be defined if the C compiler supports ptrdiff_t.
  */
-#define        HAS_PTRDIFF_T                   /**/
+#define HAS_PTRDIFF_T                   /**/
 
 /* HAS_READV:
  *     This symbol, if defined, indicates that the readv routine is
  *             extern void* sbrk(int);
  *             extern void* sbrk(size_t);
  */
-#define        HAS_SBRK_PROTO  /**/
+#define HAS_SBRK_PROTO  /**/
 
 /* HAS_SCALBN:
  *     This symbol, if defined, indicates that the scalbn routine is
  *     be used.
  */
 #ifndef USE_SITECUSTOMIZE
-/*#define      USE_SITECUSTOMIZE               / **/
+/*#define USE_SITECUSTOMIZE             / **/
 #endif
 
 /* HAS_SNPRINTF:
  *     to the program to supply one.  A good guess is
  *             extern int sockatmark(int);
  */
-#define        HAS_SOCKATMARK_PROTO    /**/
+#define HAS_SOCKATMARK_PROTO    /**/
 
 /* HAS_SOCKS5_INIT:
  *     This symbol, if defined, indicates that the socks5_init routine is
  *     to the program to supply one.  Good guesses are
  *             extern int setresgid(uid_t ruid, uid_t euid, uid_t suid);
  */
-/*#define      HAS_SETRESGID_PROTO     / **/
+/*#define HAS_SETRESGID_PROTO   / **/
 
 /* HAS_SETRESUID_PROTO:
  *     This symbol, if defined, indicates that the system provides
  *     to the program to supply one.  Good guesses are
  *             extern int setresuid(uid_t ruid, uid_t euid, uid_t suid);
  */
-/*#define      HAS_SETRESUID_PROTO     / **/
+/*#define HAS_SETRESUID_PROTO   / **/
 
 /* HAS_STRUCT_STATFS_F_FLAGS:
  *     This symbol, if defined, indicates that the struct statfs
  *             extern int syscall(int,  ...);
  *             extern int syscall(long, ...);
  */
-#define        HAS_SYSCALL_PROTO       /**/
+#define HAS_SYSCALL_PROTO       /**/
 
 /* HAS_TELLDIR_PROTO:
  *     This symbol, if defined, indicates that the system provides
  *     to the program to supply one.  A good guess is
  *             extern long telldir(DIR*);
  */
-#define        HAS_TELLDIR_PROTO       /**/
+#define HAS_TELLDIR_PROTO       /**/
 
 /* HAS_TGAMMA:
  *     This symbol, if defined, indicates that the tgamma routine is
  *     This symbol, if defined, indicates that the asctime64 () routine is
  *     available to do the 64bit variant of asctime ()
  */
-/*#define      HAS_CTIME64             / **/
-/*#define      HAS_LOCALTIME64         / **/
-/*#define      HAS_GMTIME64            / **/
-/*#define      HAS_MKTIME64            / **/
-/*#define      HAS_DIFFTIME64          / **/
-/*#define      HAS_ASCTIME64           / **/
+/*#define HAS_CTIME64           / **/
+/*#define HAS_LOCALTIME64               / **/
+/*#define HAS_GMTIME64          / **/
+/*#define HAS_MKTIME64          / **/
+/*#define HAS_DIFFTIME64                / **/
+/*#define HAS_ASCTIME64         / **/
 
 /* HAS_TIMEGM:
  *     This symbol, if defined, indicates that the timegm routine is
  *     to the program to supply one.  A good guess is
  *             extern int usleep(useconds_t);
  */
-#define        HAS_USLEEP_PROTO        /**/
+#define HAS_USLEEP_PROTO        /**/
 
 /* HAS_USTAT:
  *     This symbol, if defined, indicates that the ustat system call is
 
 /* HAS_WCSXFRM:
  *     This symbol, if defined, indicates that the wcsxfrm routine is
- *     available to tranform a wide character string for wcscmp().
+ *     available to transform a wide character string for wcscmp().
  */
 #define HAS_WCSXFRM    /**/
 
  *     Note that if fflushNULL is defined, fflushall will not
  *     even be probed for and will be left undefined.
  */
-#define        FFLUSH_NULL             /**/
-/*#define      FFLUSH_ALL              / **/
+#define FFLUSH_NULL             /**/
+/*#define FFLUSH_ALL            / **/
 
 /* I_BFD:
  *     This symbol, if defined, indicates that <bfd.h> exists and
  *     can be included.
  */
-/*#define      I_BFD           / **/
+/*#define I_BFD         / **/
 
 /* I_CRYPT:
  *     This symbol, if defined, indicates that <crypt.h> exists and
  *     should be included.
  */
-#define        I_CRYPT         /**/
+#define I_CRYPT         /**/
 
 /* DB_Prefix_t:
  *     This symbol contains the type of the prefix structure element
  *     This symbol, if defined, indicates that <fp.h> exists and
  *     should be included.
  */
-/*#define      I_FP            / **/
+/*#define I_FP          / **/
 
 /* I_FP_CLASS:
  *     This symbol, if defined, indicates that <fp_class.h> exists and
  *     should be included.
  */
-/*#define      I_FP_CLASS              / **/
+/*#define I_FP_CLASS            / **/
 
 /* I_IEEEFP:
  *     This symbol, if defined, indicates that <ieeefp.h> exists and
  *     should be included.
  */
-/*#define      I_IEEEFP                / **/
+/*#define I_IEEEFP              / **/
 
 /* I_INTTYPES:
  *     This symbol, if defined, indicates to the C program that it should
  *     This symbol, if defined, indicates that <langinfo.h> exists and
  *     should be included.
  */
-#define        I_LANGINFO              /**/
+#define I_LANGINFO              /**/
 
 /* I_LIBUTIL:
  *     This symbol, if defined, indicates that <libutil.h> exists and
  *     should be included.
  */
-/*#define      I_LIBUTIL               / **/
+/*#define I_LIBUTIL             / **/
 
 /* I_MALLOCMALLOC:
  *     This symbol, if defined, indicates to the C program that it should
  *     This symbol, if defined, indicates that <mntent.h> exists and
  *     should be included.
  */
-#define        I_MNTENT                /**/
+#define I_MNTENT                /**/
 
 /* I_NETINET_TCP:
  *     This symbol, if defined, indicates to the C program that it should
  *     This symbol, if defined, indicates that <poll.h> exists and
  *     should be included. (see also HAS_POLL)
  */
-#define        I_POLL          /**/
+#define I_POLL          /**/
 
 /* I_PROT:
  *     This symbol, if defined, indicates that <prot.h> exists and
  *     should be included.
  */
-/*#define      I_PROT          / **/
+/*#define I_PROT                / **/
 
 /* I_QUADMATH:
  *     This symbol, if defined, indicates that <quadmath.h> exists and
  *     should be included.
  */
-#define        I_QUADMATH              /**/
+#define I_QUADMATH              /**/
 
 /* I_SHADOW:
  *     This symbol, if defined, indicates that <shadow.h> exists and
  *     should be included.
  */
-#define        I_SHADOW                /**/
+#define I_SHADOW                /**/
 
 /* I_SOCKS:
  *     This symbol, if defined, indicates that <socks.h> exists and
  *     should be included.
  */
-/*#define      I_SOCKS         / **/
+/*#define I_SOCKS               / **/
 
 /* I_STDBOOL:
  *     This symbol, if defined, indicates that <stdbool.h> exists and
  *     can be included.
  */
-#define        I_STDBOOL               /**/
+#define I_STDBOOL               /**/
 
 /* I_STDINT:
  *     This symbol, if defined, indicates that <stdint.h> exists and
  *     This symbol, if defined, indicates that <sunmath.h> exists and
  *     should be included.
  */
-/*#define      I_SUNMATH               / **/
+/*#define I_SUNMATH             / **/
 
 /* I_SYSLOG:
  *     This symbol, if defined, indicates that <syslog.h> exists and
  *     should be included.
  */
-#define        I_SYSLOG                /**/
+#define I_SYSLOG                /**/
 
 /* I_SYSMODE:
  *     This symbol, if defined, indicates that <sys/mode.h> exists and
  *     should be included.
  */
-/*#define      I_SYSMODE               / **/
+/*#define I_SYSMODE             / **/
 
 /* I_SYS_MOUNT:
  *     This symbol, if defined, indicates that <sys/mount.h> exists and
  *     should be included.
  */
-#define        I_SYS_MOUNT             /**/
+#define I_SYS_MOUNT             /**/
 
 /* I_SYS_STATFS:
  *     This symbol, if defined, indicates that <sys/statfs.h> exists.
  */
-#define        I_SYS_STATFS            /**/
+#define I_SYS_STATFS            /**/
 
 /* I_SYS_STATVFS:
  *     This symbol, if defined, indicates that <sys/statvfs.h> exists and
  *     should be included.
  */
-#define        I_SYS_STATVFS           /**/
+#define I_SYS_STATVFS           /**/
 
 /* I_SYSUTSNAME:
  *     This symbol, if defined, indicates that <sys/utsname.h> exists and
  *     should be included.
  */
-#define        I_SYSUTSNAME            /**/
+#define I_SYSUTSNAME            /**/
 
 /* I_SYS_VFS:
  *     This symbol, if defined, indicates that <sys/vfs.h> exists and
  *     should be included.
  */
-#define        I_SYS_VFS               /**/
+#define I_SYS_VFS               /**/
 
 /* I_USTAT:
  *     This symbol, if defined, indicates that <ustat.h> exists and
  *     should be included.
  */
-#define        I_USTAT         /**/
+#define I_USTAT         /**/
 
 /* I_WCHAR:
  *     This symbol, if defined, indicates to the C program that <wchar.h>
  *     of copying mechanisms, handy.h defines a platform-
  *     independent macro, Perl_va_copy(src, dst), to do the job.
  */
-#define        NEED_VA_COPY            /**/
+#define NEED_VA_COPY            /**/
 
 /* IVTYPE:
  *     This symbol defines the C type used for Perl's IV.
  *     This symbol, if defined, indicates that a variable of type NVTYPE
  *     stores 0.0 in memory as all bits zero.
  */
-#define        IVTYPE          long            /**/
-#define        UVTYPE          unsigned long           /**/
-#define        I8TYPE          signed char             /**/
-#define        U8TYPE          unsigned char           /**/
-#define        I16TYPE         short   /**/
-#define        U16TYPE         unsigned short  /**/
-#define        I32TYPE         int     /**/
-#define        U32TYPE         unsigned int    /**/
+#define IVTYPE          long            /**/
+#define UVTYPE          unsigned long           /**/
+#define I8TYPE          signed char             /**/
+#define U8TYPE          unsigned char           /**/
+#define I16TYPE         short   /**/
+#define U16TYPE         unsigned short  /**/
+#define I32TYPE         int     /**/
+#define U32TYPE         unsigned int    /**/
 #ifdef HAS_QUAD
-#define        I64TYPE         long    /**/
-#define        U64TYPE         unsigned long   /**/
+#define I64TYPE         long    /**/
+#define U64TYPE         unsigned long   /**/
 #endif
-#define        NVTYPE          double          /**/
-#define        IVSIZE          8               /**/
-#define        UVSIZE          8               /**/
-#define        I8SIZE          1               /**/
-#define        U8SIZE          1               /**/
-#define        I16SIZE         2       /**/
-#define        U16SIZE         2       /**/
-#define        I32SIZE         4       /**/
-#define        U32SIZE         4       /**/
+#define NVTYPE          double          /**/
+#define IVSIZE          8               /**/
+#define UVSIZE          8               /**/
+#define I8SIZE          1               /**/
+#define U8SIZE          1               /**/
+#define I16SIZE         2       /**/
+#define U16SIZE         2       /**/
+#define I32SIZE         4       /**/
+#define U32SIZE         4       /**/
 #ifdef HAS_QUAD
-#define        I64SIZE         8       /**/
-#define        U64SIZE         8       /**/
+#define I64SIZE         8       /**/
+#define U64SIZE         8       /**/
 #endif
-#define        NVSIZE          8               /**/
+#define NVSIZE          8               /**/
 #undef NV_PRESERVES_UV
-#define        NV_PRESERVES_UV_BITS    53
-#define        NV_OVERFLOWS_INTEGERS_AT        (256.0*256.0*256.0*256.0*256.0*256.0*2.0*2.0*2.0*2.0*2.0)
-#define        NV_ZERO_IS_ALLBITS_ZERO
+#define NV_PRESERVES_UV_BITS    53
+#define NV_OVERFLOWS_INTEGERS_AT        (256.0*256.0*256.0*256.0*256.0*256.0*2.0*2.0*2.0*2.0*2.0)
+#define NV_ZERO_IS_ALLBITS_ZERO
 #if UVSIZE == 8
 #   ifdef BYTEORDER
 #       if BYTEORDER == 0x1234
  *     This symbol defines the format string used for printing a Perl NV
  *     using %g-ish floating point format.
  */
-#define        IVdf            "ld"            /**/
-#define        UVuf            "lu"            /**/
-#define        UVof            "lo"            /**/
-#define        UVxf            "lx"            /**/
-#define        UVXf            "lX"            /**/
-#define        NVef            "e"             /**/
-#define        NVff            "f"             /**/
-#define        NVgf            "g"             /**/
+#define IVdf            "ld"            /**/
+#define UVuf            "lu"            /**/
+#define UVof            "lo"            /**/
+#define UVxf            "lx"            /**/
+#define UVXf            "lX"            /**/
+#define NVef            "e"             /**/
+#define NVff            "f"             /**/
+#define NVgf            "g"             /**/
 
 /* SELECT_MIN_BITS:
  *     This symbol holds the minimum number of bits operated by select.
  *     script to make sure (one hopes) that it runs with perl and not
  *     some shell.
  */
-#define STARTPERL "#!/opt/perl/bin/perl5.36.3"         /**/
+#define STARTPERL "#!/opt/perl/bin/perl5.38.2"         /**/
 
 /* HAS_STDIO_STREAM_ARRAY:
  *     This symbol, if defined, tells that there is an array
  *     This symbol tells the name of the array holding the stdio streams.
  *     Usual values include _iob, __iob, and __sF.
  */
-/*#define      HAS_STDIO_STREAM_ARRAY  / **/
+/*#define HAS_STDIO_STREAM_ARRAY        / **/
 #ifdef HAS_STDIO_STREAM_ARRAY
 #define STDIO_STREAM_ARRAY     
 #endif
  *     you may need at least to reboot your OS to 64-bit mode.
  */
 #ifndef USE_64_BIT_INT
-#define        USE_64_BIT_INT          /**/
+#define USE_64_BIT_INT          /**/
 #endif
 #ifndef USE_64_BIT_ALL
-#define        USE_64_BIT_ALL          /**/
+#define USE_64_BIT_ALL          /**/
 #endif
 
 /* USE_C_BACKTRACE:
  *     Defaults to define in Perls 5.8 and earlier, to undef later.
  */
 #ifndef USE_FAST_STDIO
-/*#define      USE_FAST_STDIO          / **/
+/*#define USE_FAST_STDIO                / **/
 #endif
 
 /* USE_KERN_PROC_PATHNAME:
  *     should be used when available.
  */
 #ifndef USE_LARGE_FILES
-#define        USE_LARGE_FILES         /**/
+#define USE_LARGE_FILES         /**/
 #endif
 
 /* USE_LONG_DOUBLE:
  *     be used when available.
  */
 #ifndef USE_LONG_DOUBLE
-/*#define      USE_LONG_DOUBLE         / **/
+/*#define USE_LONG_DOUBLE               / **/
 #endif
 
 /* USE_MORE_BITS:
  *     long doubles should be used when available.
  */
 #ifndef USE_MORE_BITS
-/*#define      USE_MORE_BITS           / **/
+/*#define USE_MORE_BITS         / **/
 #endif
 
 /* MULTIPLICITY:
  *     be built to use multiplicity.
  */
 #ifndef MULTIPLICITY
-/*#define      MULTIPLICITY            / **/
+/*#define MULTIPLICITY          / **/
 #endif
 
 /* USE_NSGETEXECUTABLEPATH:
  *     used in a fully backward compatible manner.
  */
 #ifndef USE_PERLIO
-#define        USE_PERLIO              /**/
+#define USE_PERLIO              /**/
 #endif
 
 /* USE_QUADMATH:
  *     be used when available.
  */
 #ifndef USE_QUADMATH
-/*#define      USE_QUADMATH            / **/
+/*#define USE_QUADMATH          / **/
 #endif
 
 /* USE_SOCKS:
  *     be built to use socks.
  */
 #ifndef USE_SOCKS
-/*#define      USE_SOCKS               / **/
+/*#define USE_SOCKS             / **/
 #endif
 
 /* HAS_DRAND48_PROTO:
  *     to the program to supply one.  A good guess is
  *             extern double drand48(void);
  */
-#define        HAS_DRAND48_PROTO       /**/
+#define HAS_DRAND48_PROTO       /**/
 
 /* HAS_GETHOST_PROTOS:
  *     This symbol, if defined, indicates that <netdb.h> includes
  *     gethostbyaddr().  Otherwise, it is up to the program to guess
  *     them.  See netdbtype.U for probing for various Netdb_xxx_t types.
  */
-#define        HAS_GETHOST_PROTOS      /**/
+#define HAS_GETHOST_PROTOS      /**/
 
 /* HAS_GETNET_PROTOS:
  *     This symbol, if defined, indicates that <netdb.h> includes
  *     getnetbyaddr().  Otherwise, it is up to the program to guess
  *     them.  See netdbtype.U for probing for various Netdb_xxx_t types.
  */
-#define        HAS_GETNET_PROTOS       /**/
+#define HAS_GETNET_PROTOS       /**/
 
 /* HAS_GETPROTO_PROTOS:
  *     This symbol, if defined, indicates that <netdb.h> includes
  *     getprotobyaddr().  Otherwise, it is up to the program to guess
  *     them.  See netdbtype.U for probing for various Netdb_xxx_t types.
  */
-#define        HAS_GETPROTO_PROTOS     /**/
+#define HAS_GETPROTO_PROTOS     /**/
 
 /* HAS_GETSERV_PROTOS:
  *     This symbol, if defined, indicates that <netdb.h> includes
  *     getservbyaddr().  Otherwise, it is up to the program to guess
  *     them.  See netdbtype.U for probing for various Netdb_xxx_t types.
  */
-#define        HAS_GETSERV_PROTOS      /**/
+#define HAS_GETSERV_PROTOS      /**/
 
 /* HAS_LSEEK_PROTO:
  *     This symbol, if defined, indicates that the system provides
  *     to the program to supply one.  A good guess is
  *             extern off_t lseek(int, off_t, int);
  */
-#define        HAS_LSEEK_PROTO /**/
+#define HAS_LSEEK_PROTO /**/
 
 /* Netdb_host_t:
  *     This symbol holds the type used for the 1st argument
  *     try to use the various _r versions of library functions.
  *     This is extremely experimental.
  */
-/*#define      USE_ITHREADS            / **/
-/*#define              USE_THREADS             / **/
-/*#define      OLD_PTHREADS_API                / **/
-/*#define      USE_REENTRANT_API       / **/
+/*#define USE_ITHREADS          / **/
+/*#define       USE_THREADS             / **/
+/*#define OLD_PTHREADS_API              / **/
+/*#define USE_REENTRANT_API     / **/
 
 /* HAS_TIME:
  *     This symbol, if defined, indicates that the time() routine exists.
 /* Gid_t_f:
  *     This symbol defines the format string used for printing a Gid_t.
  */
-#define        Gid_t_f         "u"             /**/
+#define Gid_t_f         "u"             /**/
 
 /* Gid_t_sign:
  *     This symbol holds the signedness of a Gid_t.
 /* Uid_t_f:
  *     This symbol defines the format string used for printing a Uid_t.
  */
-#define        Uid_t_f         "u"             /**/
+#define Uid_t_f         "u"             /**/
 
 /* Uid_t_sign:
  *     This symbol holds the signedness of a Uid_t.
index 7ccafcb..698f78c 100644 (file)
@@ -53,7 +53,7 @@ Usage: $0 [opts] [ -d | -v | -x ] [ -a | module ... ]
 -d/--diff     Display file differences using diff(1), rather than just
               listing which files have changed.
 
---diffopts    Options to pass to the diff command. Defaults to '-u --binary'
+--diffopts    Options to pass to the diff command. Defaults to '-u --text'
               (except on *BSD, where it's just '-u').
 
 -f|force      Force download from CPAN of new 02packages.details.txt file
@@ -126,9 +126,9 @@ sub run {
           if ( $reverse || $use_diff || $diff_opts );
     }
     else {
-        #$diff_opts = '-u --binary' unless defined $diff_opts;
+        #$diff_opts = '-u --text' unless defined $diff_opts;
         if (! defined $diff_opts) {
-            $diff_opts = ($^O =~ m/bsd$/i) ? '-u' : '-u --binary';
+            $diff_opts = ($^O =~ m/bsd$/i) ? '-u' : '-u --text';
         };
         usage("can't use -f without --crosscheck") if $force;
     }
index 37573d7..120322f 100644 (file)
 __DEPARSE_FAILURES__
 
 base/lex.t                # checks regexp stringification
+# class/*.t generally failing because OP_METHSTART not recognised
+class/class.t
+class/construct.t
+class/destruct.t
+class/field.t
+class/inherit.t
+class/method.t
+class/phasers.t
+class/threads.t
+#
 comp/final_line_num.t     # tests syntax error after BEGIN block
 comp/fold.t               # mutability of folded constants
 comp/parser.t             # crazy #line directives ==> shell syntax errors
@@ -44,7 +54,6 @@ op/attrhand.t             # Custom attrs ignored; also AH provides none
 op/caller.t
 op/goto.t
 op/gv.t                   # glob copy constants
-op/hexfp.t
 op/index.t
 op/join.t                 # mutability of folded constants
 op/length.t               # utf8ness of deparsed strings
@@ -63,14 +72,17 @@ op/sub.t
 op/switch.t
 op/symbolcache.t
 op/taint.t
+op/undef.t                # keys%{($h=undef)||{}} becomes keys%{{} unless .. }
 op/vec.t
 op/warn.t
 op/write.t
+perf/opcount.t            # keys%{($h=undef)||{}} becomes keys%{{} unless .. }
 porting/globvar.t
 re/overload.t             # [perl #123385] %^H output
 re/pat_advanced.t         # [perl #123417]
 re/pat_rt_report.t        # malformed utf8 constant; also /\c@/ -> /\c\@/
 re/pat.t                  # [perl #90590]
+re/pat_re_eval.t          # the new /(*{...})/ forms don't deparse
 re/regex_sets.t
 re/reg_fold.t             # [perl #123385] %^H output
 re/rxcode.t               # checks regexp stringification
@@ -154,31 +166,46 @@ uni/variables.t
 #    }
 
 ../cpan/bignum/t/bigexp.t
+../cpan/bignum/t/bigfloat.t
 ../cpan/bignum/t/bigint.t
 ../cpan/bignum/t/bignum.t
 ../cpan/bignum/t/bigrat.t
+../cpan/bignum/t/const-bigfloat.t
 ../cpan/bignum/t/const-bigint.t
 ../cpan/bignum/t/const-bignum.t
 ../cpan/bignum/t/const-bigrat.t
+../cpan/bignum/t/down-mbi-up-mbf.t
+../cpan/bignum/t/down-mbi-up-mbr.t
+../cpan/bignum/t/down-mbi-up-undef.t
+../cpan/bignum/t/down-undef-up-mbf.t
+../cpan/bignum/t/e_pi-bigfloat.t
 ../cpan/bignum/t/e_pi-bigint.t
 ../cpan/bignum/t/e_pi-bignum.t
 ../cpan/bignum/t/e_pi-bigrat.t
+../cpan/bignum/t/import-bigfloat.t
 ../cpan/bignum/t/import-bigint.t
 ../cpan/bignum/t/import-bignum.t
 ../cpan/bignum/t/import-bigrat.t
 ../cpan/bignum/t/in_effect.t
+../cpan/bignum/t/infnan-bigfloat.t
 ../cpan/bignum/t/infnan-bigint.t
-../cpan/bignum/t/infnan-bignum.t
+../cpan/bignum/t/infnan-bignum-mbf.t
+../cpan/bignum/t/infnan-bignum-mbr.t
 ../cpan/bignum/t/infnan-bigrat.t
+../cpan/bignum/t/option_a-bignum.t
 ../cpan/bignum/t/option_a.t
-../cpan/bignum/t/option_l.t
+../cpan/bignum/t/option_l-bigfloat.t
+../cpan/bignum/t/option_l-bigint.t
+../cpan/bignum/t/option_l-bignum.t
+../cpan/bignum/t/option_l-bigrat.t
+../cpan/bignum/t/option_p-bignum.t
 ../cpan/bignum/t/option_p.t
 ../cpan/bignum/t/overrides.t
 ../cpan/bignum/t/ratopt_a.t
+../cpan/bignum/t/scope-bigfloat.t
 ../cpan/bignum/t/scope-bigint.t
 ../cpan/bignum/t/scope-bignum.t
 ../cpan/bignum/t/scope-bigrat.t
-../cpan/bignum/t/scope-nested-const.t
 
 # -------------
 
@@ -187,10 +214,6 @@ uni/variables.t
 # of the test file from being compiled
 ../cpan/ExtUtils-MakeMaker/t/MM_VMS.t
 
-# see comment above about bignum failures
-../cpan/Math-BigInt/t/const-mbf.t
-../cpan/Math-BigInt/t/const-mbi.t
-
 # see comment above about bignum failures
 ../cpan/Math-BigRat/t/const-mbr.t
 
@@ -233,7 +256,6 @@ uni/variables.t
 ../ext/XS-APItest/t/call_checker.t
 ../ext/XS-APItest/t/cleanup.t
 ../ext/XS-APItest/t/fetch_pad_names.t
-../ext/XS-APItest/t/svpeek.t
 ../ext/XS-APItest/t/synthetic_scope.t
 ../lib/Config.t                         # Config_heavy.pl fns getting output
 ../lib/charnames.t
index 1b3712b..fd31622 100644 (file)
@@ -20,6 +20,8 @@ dist/Devel-PPPort/devel/regenerate
 dist/Devel-PPPort/devel/scanprov
 dist/Devel-PPPort/devel/update_release_date.pl
 dist/Devel-PPPort/soak
+dist/Thread-Queue/examples/callback.pl
+dist/Thread-Queue/examples/queue.pl
 installperl
 installman
 makedepend.SH
@@ -42,7 +44,6 @@ Porting/bench.pl
 Porting/bisect.pl
 Porting/bisect-example.sh
 Porting/bisect-runner.pl
-Porting/checkAUTHORS.pl
 Porting/checkURL.pl
 Porting/checkVERSION.pl
 Porting/checkansi.pl
@@ -69,3 +70,4 @@ Porting/updateAUTHORS.pl
 Porting/valgrindpp.pl
 Cross/generate_config_sh
 Cross/warp
+dist/Thread-Semaphore/examples/semaphore.pl
index 2dbddfc..8661607 100644 (file)
@@ -148,7 +148,7 @@ my $passthru_headers = qr/^= (?: over | item | back | cut )/xms;
 
 # version used when generating diffs (acknowledgements, Module::CoreList etc)
 # 5.36.0 -> 5.34.0
-# 5.36.3 -> 5.36.0
+# 5.36.1 -> 5.36.0
 my ($major, $minor, $point) = split(/\./, $version);
 my $last_version = join('.', $major, ($point == 0 ? ($minor - 2, 0) : ($minor, $point-1)));
 
@@ -188,7 +188,7 @@ foreach my $line (@pod_lines) {
 
     $line =~ s/\Q5.X.Y\E/$version/g;
     $line =~ s/\Q5.LAST\E/$last_version/g;
-    $line =~ s/\Q5.X\E-b/$major.$minor/g;
+    $line =~ s/\Q5.X\E\b/$major.$minor/g;
 
     $current_element->{'content'} .= "\n" . $line;
 }
index 03652aa..2d9ce10 100644 (file)
@@ -24,7 +24,7 @@ use warnings;
 #
 # Tim Bunce, June 1997
 
-use ExtUtils::Manifest qw(fullcheck);
+use ExtUtils::Manifest qw(manicheck);
 $ExtUtils::Manifest::Quiet = 1;
 use Getopt::Std;
 use Digest::SHA;
@@ -87,26 +87,12 @@ print "\nMaking a release for $perl in $relroot/$reldir\n\n";
 cleanup($relroot, $reldir) if $opts{c};
 
 print "Cross-checking the MANIFEST...\n";
-my ($missfile, $missentry) = fullcheck();
-@$missentry
-    = grep {$_ !~ m!^\.(?:git|github|mailmap)! and $_ !~ m!(?:/|^)\.gitignore!} @$missentry;
-if (@$missfile ) {
+my @missfile = manicheck();
+if (@missfile) {
     warn "Can't make a release with MANIFEST files missing:\n";
-    warn "\t".$_."\n" for (@$missfile);
+    warn "\t".$_."\n" for (@missfile);
 }
-if (@$missentry ) {
-    warn "Can't make a release with files not listed in MANIFEST\n";
-    warn "\t".$_."\n" for (@$missentry);
-
-}
-if ("@$missentry" =~ m/\.orig\b/) {
-    # Handy listing of find command and .orig files from patching work.
-    # I tend to run 'xargs rm' and copy and paste the file list.
-    my $cmd = "find . -name '*.orig' -print";
-    print "$cmd\n";
-    system($cmd);
-}
-die "Aborted.\n" if @$missentry or @$missfile;
+die "Aborted.\n" if @missfile;
 print "\n";
 
 # VMS no longer has hardcoded version numbers descrip.mms
index dfe6b1f..195b848 100644 (file)
@@ -115,7 +115,7 @@ release manager will have to investigate the situation carefully.)
 
 =item *
 
-XXX Remove this section if not applicable.
+XXX Remove this section if Porting/corelist-perldelta.pl did not add any content here.
 
 =back
 
@@ -127,7 +127,7 @@ XXX Remove this section if not applicable.
 
 L<XXX> has been upgraded from version A.xx to B.yy.
 
-If there was something important to note about this change, include that here.
+XXX If there was something important to note about this change, include that here.
 
 =back
 
@@ -137,7 +137,7 @@ If there was something important to note about this change, include that here.
 
 =item *
 
-XXX
+XXX Remove this section if Porting/corelist-perldelta.pl did not add any content here.
 
 =back
 
@@ -357,6 +357,9 @@ XXX
 XXX Important bug fixes in the core language are summarized here.  Bug fixes in
 files in F<ext/> and F<lib/> are best summarized in L</Modules and Pragmata>.
 
+Include references to GitHub issues and PRs as: [GH #12345] and the release
+manager will later use a regex to expand these into links.
+
 [ List each fix as an =item entry ]
 
 =over 4
@@ -403,7 +406,7 @@ died, add a short obituary here.
 
 XXX Generate this with:
 
-  perl Porting/acknowledgements.pl v5.36.3..HEAD
+  perl Porting/acknowledgements.pl v5.37.12..HEAD
 
 =head1 Reporting Bugs
 
index 6ca9f1e..f11fa98 100644 (file)
@@ -542,9 +542,9 @@ Here's how I generate a new patch.  I'll use the hypothetical
 5.004_07 to 5.004_08 patch as an example.
 
        # unpack perl5.004_07/
-       gzip -d -c perl5.004_07.tar.gz | tar -xf -
+       gzip -d -c perl5.004_07.tar.gz | tar -xof -
        # unpack perl5.004_08/
-       gzip -d -c perl5.004_08.tar.gz | tar -xf -
+       gzip -d -c perl5.004_08.tar.gz | tar -xof -
        makepatch perl5.004_07 perl5.004_08 > perl5.004_08.pat
 
 Makepatch will automatically generate appropriate B<rm> commands to remove
index 7ec8315..d324736 100644 (file)
@@ -23,6 +23,6 @@ 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 should appear in the first half of 2022.
+The next major stable release of Perl should appear in the first half of 2023.
 
 [YOUR SALUTATION HERE]
index 37fde78..50890b2 100644 (file)
@@ -512,23 +512,10 @@ blead release, so you may find nothing to do here.
 =head3 update AUTHORS
 
 The AUTHORS file can be updated by running F<Porting/updateAUTHORS.pl>.
-
-(The old method was C<Porting/checkAUTHORS.pl --update --from=5.X.Y> and
-it's still used under the hood, but you should use the
-F<Porting/updateAUTHORS.pl> update.)
-
-In the old method, for MAINT and BLEAD-FINAL releases, C<v5.X.Y> needs to
-refer to the last release in the previous development cycle (so for
-example, for a 5.14.x release, this would be 5.13.11).
-
-In the old method, for BLEAD-POINT releases, it needs to refer to the
-previous BLEAD-POINT release (so for 5.15.3 this would be 5.15.2).
-
-Note: It should not be harmful to use a wider range.
-
-Note: If you have uncommitted changes this could cause some warnings,
-and you might like to use the additional argument C<--to=upstream/blead>
-to use the last known git commit by GitHub.
+This shouldn't really be necessary anymore, and in theory nothing should
+change as our CI should not pass if a commit would result in AUTHORS
+needing to change, but do it anyway to be sure. Make sure all your changes
+are committed first.
 
 Review the changes to the AUTHORS file, be sure you are not adding duplicate
 entries or removing any entries, then commit your changes.
index 0fc5726..de9b79b 100644 (file)
@@ -97,7 +97,40 @@ from the filename -- but can be overwritten by the C<--version> option.
 
 =item C<--jobs> I<N>
 
-When running C<make>, pass a C<< -jI<N> >> option to it.
+When running C<make>, pass a C<< -jI<N> >> option to it to enable
+parallel building.
+
+Note that you can also set C<< TEST_JOBS=I<N> >> in the environment
+to enable parallel *testing* on top of parallel *building*.
+
+=item C<--yes>
+
+Just continue at all places where we would normally ask for the user
+to hit enter or hit CTL-C, with the exception of cases related to
+CUSTOMIZED distributions, where this option will cause the update to
+exit immediately unless the C<--force> option has also been used.
+
+=item C<--force>
+
+Do things we normally would refuse to do.
+
+=item C<--tarball>
+
+Use a predownloaded tarball and not one from CPAN.
+
+=item C<--version>
+
+Sync with a specific version, not the latest on CPAN.
+
+=item C<--no-test>
+
+=item C<--nt>
+
+Do not run tests. This is helpful for bulk updates.
+
+=item C<--help>
+
+Show help.
 
 =back
 
@@ -154,14 +187,17 @@ die "This does not look like a top level directory"
 die "Please run Configure before using $0\n"
     if !WIN32 && !-f "Makefile";
 
+#these are populated by Porting/Maintainers.pl
 our @IGNORABLE;
 our %Modules;
+our %DistName;
 
 use autodie;
 
 require "./Porting/Maintainers.pl";
 
 my $MAKE_LOG = 'make.log';
+unlink $MAKE_LOG if -e $MAKE_LOG;
 
 my %IGNORABLE    = map {$_ => 1} @IGNORABLE;
 
@@ -170,9 +206,10 @@ my $tmpdir = tmpdir();
 my $package      = "02packages.details.txt";
 my $package_url  = "http://www.cpan.org/modules/$package";
 my $package_file = "$tmpdir/$package"; # this is a cache
+my $type_dir     = "cpan";
 
 my @problematic = (
-    'podlators', # weird CUSTOMIZED section due to .PL files
+    # no current entries as of perl-5.38.2 (Jun 2023)
 );
 
 
@@ -186,11 +223,14 @@ sub usage
 GetOptions ('tarball=s'  =>  \my $tarball,
             'version=s'  =>  \my $version,
             'jobs=i'     =>  \my $make_jobs,
-             force       =>  \my $force,
-             help        =>  sub { usage 0; },
-             ) or  die "Failed to parse arguments";
+            'yes'        =>  \my $yes_to_all,
+            'force'      =>  \my $force,
+            'no-test|nt' =>  \my $no_test,
+            'help'       =>  sub { usage 0; },
+            'type=s'     =>  \$type_dir,
+        ) or  die "Failed to parse arguments";
 
-usage 1 unless @ARGV == 1 || @ARGV == 2;
+usage 1 unless @ARGV == 1;
 
 sub find_type_f {
     my @res;
@@ -220,22 +260,74 @@ sub make_writable {
     }
 }
 
-sub make {
-    my @args= @_;
+my $SEP_LINE = ("-" x 79) . "\n";
+
+sub cat_make_log {
+    my ($message) = @_;
+    print $message, $message=~/Starting/
+                    ? " and saving its output to '$MAKE_LOG' ...\n"
+                    : "\n";
+
+    open my $ofh, ">>", $MAKE_LOG
+        or die "Failed to open '$MAKE_LOG' for append\n";
+    print $ofh $SEP_LINE,"$message at ",
+                scalar(localtime),"\n",$SEP_LINE;
+    close $ofh;
+}
+
+sub run_make {
+    my @args = @_;
     unshift @args, "-j$make_jobs" if defined $make_jobs;
+    cat_make_log("Starting `make @args`");
+    my $errored;
     if (WIN32) {
         chdir "Win32";
-        system "$Config{make} @args> ..\\$MAKE_LOG 2>&1"
-            and die "Running make failed, see $MAKE_LOG";
+        $errored = system "$Config{make} @args >> ..\\$MAKE_LOG 2>&1";
         chdir '..';
     } else {
-        system "$Config{make} @args> $MAKE_LOG 2>&1"
-            and die "Running make failed, see $MAKE_LOG";
+        $errored = system "$Config{make} @args >> $MAKE_LOG 2>&1";
     };
-};
+    cat_make_log("Finished `make @args`");
+    if ($errored) {
+        if ($args[0] ne "test-prep") {
+            # see if we can extract the last Test Summary Report from
+            # the $MAKE_LOG file,
+            if (open my $ifh, "<", $MAKE_LOG) {
+                my @report;
+                my $in_summary;
+                while (<$ifh>) {
+                    if (/^Test Summary Report/) {
+                        @report = ();
+                        $in_summary = 1;
+                    } elsif ($_ eq $SEP_LINE) {
+                        $in_summary = 0;
+                    }
+                    push @report, $_ if $in_summary;
+                }
+                print for @report;
+            } else {
+                warn "Failed to open $MAKE_LOG for reading: $!";
+            }
+        }
+        die "Running `make` failed, see '$MAKE_LOG' for more details\n";
+    }
+}
 
-my ($module)  = shift;
+sub pause_for_input {
+    my ($after_message) = @_;
+    print "Hit <return> to continue; ^C to abort ";
+    if ($yes_to_all) {
+        print "\n--yes was used on command line, continuing.\n";
+    } else {
+        my $noop = <STDIN>;
+    }
+    print $after_message if $after_message;
+}
 
+my ($module)  = shift @ARGV;
+if (my $mod_name = $DistName{$module}) {
+    $module = $mod_name;
+}
 my $info = $Modules{$module};
 if (!$info) {
     # Maybe the user said "Test-Simple" instead of "Test::Simple", or
@@ -266,8 +358,33 @@ for $module in Porting/Maintainers.pl (and you'll also need to regenerate
 t/porting/customized.dat in that case; see t/porting/customized.t).
 
 EOF
-    print "Hit return to continue; ^C to abort "; <STDIN>;
+    if ($yes_to_all and !$force) {
+        die "This distribution is marked as CUSTOMIZED\n",
+            "You used --yes on the command line, but without --force.\n",
+            "Bailing out. Use --force to go ahead anyway.\n";
+    }
+    pause_for_input("\n");
+}
+
+if (!$ENV{TEST_JOBS} and !WIN32) {
+    print "*** NOTE *** For speedups you can set TEST_JOBS=N in the env before running this script.\n";
+}
+if (!$make_jobs and !WIN32) {
+    print "*** NOTE *** For speedups you can pass --jobs=N as an arg to this script.\n"
 }
+print "About to clean the $type_dir/ directory, and ensure its contents is up to date.\n";
+print "Will also checkout -f on $type_dir/, MANIFEST and Porting/Maintainers.pl\n";
+print "*** WARNING *** - this may DELETE uncommitted changes. Hit ^C if you have ANY doubts!\n";
+pause_for_input("\n");
+# clean out the cpan directory, this cleans up any temporary files that might be
+# in the way, or other issues that might come up if the user bails out of the sync
+# script and then runs it again.
+my $clean_out= `git clean -dfx $type_dir`; # use backticks to hide the output
+system git => 'checkout -f',
+              $type_dir,
+              'MANIFEST',
+              'Porting/Maintainers.pl'; # let the user see the output
+print "the $type_dir/ directory is now clean and up to date\n---\n";
 
 my  $distribution = $$info {DISTRIBUTION};
 
@@ -284,12 +401,18 @@ if (!-d $files [0] || grep { $_ eq $module } @problematic) {
 use Cwd 'cwd';
 my $orig_pwd = cwd();
 
-chdir "cpan";
+chdir "$type_dir";
 
 my  $pkg_dir      = $files[0];
     $pkg_dir      =~ s!.*/!!;
 
-my ($old_version) = $distribution =~ /-([0-9.]+(?:-TRIAL[0-9]*)?)\.tar\.gz/;
+my $tail_pat = qr/(?:\.tar\.gz|\.tgz|\.zip)\z/;
+
+my ($old_version) = $distribution =~ /-([0-9._]+(?:-TRIAL[0-9]*)?)$tail_pat/;
+
+if (!$old_version) {
+    die "WTF: failed to parse old version from '$distribution'\n";
+}
 
 sub wget {
     my ($url, $saveas) = @_;
@@ -324,12 +447,13 @@ sub wget {
 #
 my $new_file;
 my $new_version;
+my $re_update = "";
 if (defined $tarball) {
     $tarball = rel2abs( $tarball, $orig_pwd ) ;
     die "Tarball $tarball does not exist\n" if !-e $tarball;
     die "Tarball $tarball is not a plain file\n" if !-f _;
     $new_file     = $tarball;
-    $new_version  = $version // ($new_file =~ /-([0-9._]+(?:-TRIAL[0-9]*)?)\.tar\.gz/) [0];
+    $new_version  = $version // ($new_file =~ /-([0-9._]+(?:-TRIAL[0-9]*)?)$tail_pat/) [0];
     die "Blead and that tarball both have version $new_version of $module\n"
         if $new_version eq $old_version;
 }
@@ -352,8 +476,13 @@ else {
     }
     $new_file = (split '/', $new_path) [-1];
 
-    die "The latest version of $module is $new_version, but blead already has it\n"
-        if $new_version eq $old_version;
+    if ($old_version eq $new_version) {
+        $re_update = "Re-";
+        print "The latest version of $module is $new_version, but blead already has it.\n";
+        print "Continuing may update MANIFEST or other metadata so it may make sense to continue anyway.\n";
+        print "Are you sure you want to continue?\n";
+        pause_for_input();
+    }
 
     my $url = "https://cpan.metacpan.org/authors/id/$new_path";
     say "Fetching $url";
@@ -363,7 +492,7 @@ else {
     wget $url, $new_file;
 }
 
-my  $old_dir      = "$pkg_dir-$old_version";
+my  $old_dir      = "$pkg_dir-$old_version-OLD";
 
 say "Cleaning out old directory";
 system git => 'clean', '-dfxq', $pkg_dir;
@@ -371,7 +500,7 @@ system git => 'clean', '-dfxq', $pkg_dir;
 say "Unpacking $new_file";
 Archive::Tar->extract_archive( $new_file );
 
-(my $new_dir = basename($new_file)) =~ s/\.tar\.gz//;
+(my $new_dir = basename($new_file)) =~ s/$tail_pat//;
 # ensure 'make' will update all files
 my $t= time;
 for my $file (find_type_f($new_dir)) {
@@ -415,8 +544,8 @@ FILE: for my $file ( find_type_f( $new_dir )) {
         $file = $files[0] . '/' . $file;
     }
 
-    if ( $file =~ m{^cpan/} ) {
-        $file =~ s{^cpan/}{};
+    if ( $file =~ m{^$type_dir/} ) {
+        $file =~ s{^$type_dir/}{};
     }
     else {
         $file = '../' . $file;
@@ -453,10 +582,17 @@ my %old_files = map {$_ => 1} @old_files;
 my @delete;
 my @commit;
 my @gone;
+my $changes_file;
 FILE:
 foreach my $file (@new_files) {
     next if -d "$pkg_dir/$file";   # Ignore directories.
     next if $old_files {$file};    # It's already there.
+    if ($file=~/Changes/i or $file=~/Changelog/) {
+        if ($changes_file) {
+            die "More than one changes file? $file and $changes_file both exist?";
+        }
+        $changes_file = "$pkg_dir/$file";
+    }
     if ($IGNORABLE {$file}) {
         push @delete => $file;
         next;
@@ -469,6 +605,54 @@ foreach my $file (@old_files) {
     push @gone => $file;
 }
 
+my @changes_info;
+if (!$changes_file) {
+    print "Could not find a changes file!\n",
+          "If this is not correct and there is one, please consider updating this script!\n";
+} else {
+    open my $ifh, "<", $changes_file
+        or die "Failed to open '$changes_file':$!";
+    chomp(my @lines = <$ifh>);
+    close $ifh;
+    my $seen_new_version;
+    my $is_update = $new_version ne $old_version;
+
+    for(my $idx = 0; $idx < @lines; $idx++) {
+        if ($lines[$idx] =~ /$new_version/ ||
+            ($pkg_dir eq "CPAN" and $lines[$idx] =~/^\d{4}-\d{2}-\d{2}/
+             && $lines[$idx+2]
+             && $lines[$idx+2] =~ /release $new_version/)
+        ){
+            $seen_new_version = 1;
+            push @changes_info, $lines[$idx];
+        } elsif ($seen_new_version) {
+            if ($is_update && $pkg_dir eq "ExtUtils-MakeMaker") {
+                if ($lines[$idx] =~/$old_version/) {
+                    last;
+                }
+            }
+            elsif (($lines[$idx]=~/\d\.\d/ and $lines[$idx]=~/20\d\d/) ||
+                ($lines[$idx]=~/---------------------------------/) ||
+                ($pkg_dir eq "CPAN" and $lines[$idx] =~/^\d{4}-\d{2}-\d{2}/) ||
+                ($pkg_dir eq "version" and $lines[$idx] =~/^\d\.\d+/) ||
+                ($pkg_dir eq "Getopt-Long" and $lines[$idx] =~/Changes in version/) ||
+                ($pkg_dir eq "ExtUtils-Install" and $lines[$idx] =~/^\d+\.\d+/) ||
+                0 # less commit churn if we have to tweak the heuristics above
+            ){
+                last;
+            }
+            push @changes_info, $lines[$idx];
+
+        }
+    }
+    if (!@changes_info) {
+        die "No changes?";
+    } else {
+        print "Changes from $changes_file\n";
+        print $_,"\n" for @changes_info;
+    }
+}
+
 #
 # Find all files with an exec bit
 #
@@ -504,15 +688,18 @@ if (@de_exec && @delete) {
 if (@de_exec) {
     my %permitted = map { (my $x = $_) =~ tr/\n//d; $x => 1 } grep !/^#/,
         do { local @ARGV = '../Porting/exec-bit.txt'; <> };
-    @de_exec = grep !$permitted{"cpan/$pkg_dir/$_"}, @de_exec;
+    @de_exec = grep !$permitted{"$type_dir/$pkg_dir/$_"}, @de_exec;
 }
+@$_ = sort @$_ for \@delete, \@commit, \@gone, \@de_exec;
 
 say "unlink $pkg_dir/$_" for @delete;
 say "git add $pkg_dir/$_" for @commit;
 say "git rm -f $pkg_dir/$_" for @gone;
 say "chmod a-x $pkg_dir/$_" for @de_exec;
 
-print "Hit return to continue; ^C to abort "; <STDIN>;
+print "--\nWill perform the above steps and then start testing.\n";
+print "You may want to `tail -F $MAKE_LOG` in another window\n";
+pause_for_input("\n");
 
 unlink "$pkg_dir/$_"                      for @delete;
 system git   => 'add', "$pkg_dir/$_"      for @commit;
@@ -532,8 +719,11 @@ if ($$info {CUSTOMIZED}) {
 }
 
 chdir "..";
-if (@commit || @gone) {
-    say "Fixing MANIFEST";
+{
+    # we update the MANIFEST file always now, so that we can
+    # ensure each file from this sync is updated to say that we
+    # got it from the latest version.
+    say "Updating the MANIFEST file";
     my $MANIFEST     = "MANIFEST";
     my $MANIFEST_NEW = "$MANIFEST.new";
 
@@ -541,14 +731,37 @@ if (@commit || @gone) {
         or die "Failed to open $MANIFEST for reading: $!\n";
     open my $new, ">", $MANIFEST_NEW
         or die "Failed to open $MANIFEST_NEW for writing: $!\n";
-    my %gone = map +("cpan/$pkg_dir/$_" => 1), @gone;
+    my %keep = map +("$type_dir/$pkg_dir/$_" => 1), keys %new_files;
+    my %gone = map +("$type_dir/$pkg_dir/$_" => 1), @gone;
     while (my $line = <$orig>) {
-        my ($file) = $line =~ /^(\S+)/
-            or die "Can't parse MANIFEST line: $line";
-        print $new $line if !$gone{$file};
+        chomp $line;
+        my ($file, $descr) = split /\t+/, $line;
+        if (!$file) {
+            die "Can't parse MANIFEST line: '$line' at line $.\n";
+        }
+        if ($keep{$file} and !$descr) {
+            # make sure we have at least one tab, old versions of
+            # this script would add lines to MANIFEST with no tab.
+            $line =~ s/^(\S+)\z/$1\t\t/;
+
+            my $file_descr = "";
+            if ( $file =~ /\.t/ ) {
+                $file_descr = "Test file";
+            }
+            elsif ( $file =~ /\.pm/ ) {
+                $file_descr = "Module";
+            }
+            elsif ( $file =~ /\.pl/ ) {
+                $file_descr = "Script";
+            }
+            $file_descr .= " related to " if $file_descr;
+            # and update the line to show where the file came from.
+            $line =~ s/(\t+).*/$1$file_descr$module/;
+        }
+        say $new $line if !$gone{$file};
     }
 
-    say $new "cpan/$pkg_dir/$_" for @commit;
+    say $new "$type_dir/$pkg_dir/$_\t\t$pkg_dir" for @commit;
 
     close $new or die "Can't close $MANIFEST: $!\n";
 
@@ -558,10 +771,11 @@ if (@commit || @gone) {
 }
 
 
-print "Running a make and saving its output to $MAKE_LOG ... ";
-# Prepare for running (selected) tests
-make 'test-prep';
-print "done\n";
+
+# Prepare for running (selected) tests - strictly speaking this isn't
+# necessary, as we run the tests with "run_make" now, but this allows
+# us to separate build issues from test issues.
+run_make 'test-prep' unless $no_test;
 
 # The build system installs code from CPAN dists into the lib/ directory,
 # creating directories as needed. This means that the cleaning-related rules
@@ -588,66 +802,51 @@ if (@commit || @gone) {
 # Must clean up, or else t/porting/FindExt.t will fail.
 # Note that we can always retrieve the original directory with a git checkout.
 #
-print "About to clean up; hit return or abort (^C) "; <STDIN>;
-
-remove_tree( "cpan/$old_dir" );
-unlink "cpan/$new_file" unless $tarball;
-
-#
-# Run the tests. First the test belonging to the module, followed by the
-# tests in t/porting
-#
-chdir "t";
-say "Running module tests";
-my @test_files = grep { /\.t$/ } find_type_f( "../cpan/$pkg_dir" );
-my $exe_dir = WIN32 ? "..\\" : './';
-my $output = `${exe_dir}perl$Config{_exe} TEST @test_files`;
-unless ($output =~ /All tests successful/) {
-    say $output;
-    exit 1;
-}
-
-print "Running tests in t/porting ";
-my @tests = glob 'porting/*.t';
-chomp @tests;
-my @failed;
-foreach my $t (@tests) {
-    my @not = grep {!/# TODO/ }
-              grep { /^not/ }
-              `${exe_dir}perl -I../lib -I.. $t`;
-    print @not ? '!' : '.';
-    push @failed => $t if @not;
-}
-print "\n";
-say "Failed tests: @failed" if @failed;
+print "About to clean up the old version, update Maintainers.pl and start tests\n";
+pause_for_input("\n");
 
+remove_tree( "$type_dir/$old_dir" );
+unlink "$type_dir/$new_file" unless $tarball;
 
-chdir '..';
 
 open my $Maintainers_pl, '<', 'Porting/Maintainers.pl';
 open my $new_Maintainers_pl, '>', 'Maintainers.pl';
 
-my $found;
+my $found = 0;
 my $in_mod_section;
 while (<$Maintainers_pl>) {
-    if (!$found) {
-        if ($in_mod_section) {
-            if (/DISTRIBUTION/) {
-                if (s/\Q$old_version/$new_version/) {
-                    $found = 1;
-                }
+    if ($in_mod_section) {
+        if ($found == 1) {
+            # Keep track of when and who did the sync.
+            # This must be before the DISTRIBUTION check.
+            # This ensures that *something* is updated when we re-update.
+            my $date = localtime;
+            my $user = $ENV{USER} ? "$ENV{USER} on " : "";
+            my $key = "SYNCINFO";
+            if ( /^'([A-Z_]+)'\s+=>/ and $1 eq $key) {
+                s/(=>\s+)'[^']+'/$1'$user$date'/;
             }
-
-            if (/^    \}/) {
-                $in_mod_section = 0;
+            else {
+                print $new_Maintainers_pl
+                    "        '$key'     => '$user$date',\n";
             }
+            $found = 2;
+            $in_mod_section = 0;
         }
-
-        if (/\Q$module/) {
-            $in_mod_section = 1;
+        if (/DISTRIBUTION/) {
+            if (s/\Q$old_version/$new_version/) {
+                $found = 1;
+            }
+        }
+        if (/^\s*\}/) { # sanity
+            $in_mod_section = 0;
         }
     }
 
+    if (/\Q$module\E/ and !$found) {
+        $in_mod_section = 1;
+    }
+
     print $new_Maintainers_pl $_;
 }
 
@@ -662,6 +861,28 @@ else {
     say "Make sure you update this by hand before committing.";
 }
 
+# Run the tests. First the test belonging to the module, followed by the
+# tests in t/porting
+
+my $shell_quote = WIN32 ? '"' : "'";
+if ($no_test) {
+    print "*** NOT RUNNING TESTS ***\n";
+} else {
+    run_make "test-harness TEST_ARGS=$shell_quote-re $pkg_dir$shell_quote";
+    run_make "test-porting";
+}
+
+my $committed;
+if (@changes_info) {
+    system git => 'commit',
+           join("\n",
+               "-m$type_dir/$pkg_dir - ${re_update}Update to version $new_version",
+               "",@changes_info),
+           "$type_dir/$pkg_dir", "MANIFEST", "Porting/Maintainers.pl"
+        or $committed = 1; # note system returns true for an error!
+}
+
+
 print <<"EOF";
 
 =======================================================================
@@ -676,11 +897,37 @@ has added an XS dependency - even if the full test suite passes just fine.
 Hopefully all will complete successfully, but if not, you can make any
 changes you need to get the tests to pass. Don't forget that you'll need
 a "CUSTOMIZED" entry in Porting/Maintainers.pl if you change any of the
-files under cpan/$pkg_dir.
+files under $type_dir/$pkg_dir.
+
+EOF
+
+if ($committed) {
+    print <<"EOF";
+The changes have already been committed. If the tests above fail you can
+discard this patch with
+
+    git reset --hard HEAD^.
+
+You may also want to review the commit message and alter it with
+
+    git commit --amend
+
+Regardless you still need to push this commit upstream with something like
+
+    git push origin HEAD:$ENV{USER}/update_${pkg_dir}_v_$new_version
 
-Once all tests pass, you can "git add -u" and "git commit" the changes
-with a message along the lines of "Update Foo::Bar to v1.234".
+EOF
+} else {
+    print <<"EOF";
+Once all tests pass, you can commit it with a command like:
+
+    git commit -m${shell_quote}$type_dir/$pkg_dir - Update to version $new_version${shell_quote} $type_dir/$pkg_dir
+
+and then push it upstream with a command like
+
+    git push origin HEAD:$ENV{USER}/update_${pkg_dir}_v_$new_version
 
 EOF
+}
 
 __END__
index 7bbd671..800e984 100644 (file)
@@ -137,7 +137,7 @@ for example POSIX passes Exporter some very memory hungry data structures.
 
 =head2 makedef.pl and conditional compilation
 
-The script F<makedef.pl> that generates the list of exported symbols on
+The script F<makedef.pl> generates the list of exported symbols on
 platforms which need this. Functions are declared in F<embed.fnc>, variables
 in F<intrpvar.h>. Quite a few of the functions and variables are conditionally
 declared there, using C<#ifdef>. However, F<makedef.pl> doesn't understand the
@@ -486,7 +486,7 @@ Natively 64-bit systems need neither -Duse64bitint nor -Duse64bitall.
 On these systems, it might be the default compilation mode, and there
 is currently no guarantee that passing no use64bitall option to the
 Configure process will build a 32bit perl. Implementing -Duse32bit*
-options would be nice for perl 5.36.3.
+options would be nice for a future version.
 
 =head2 Profile Perl - am I hot or not?
 
@@ -1183,7 +1183,7 @@ L<http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/2013-01/msg00339.html>
 =head1 Big projects
 
 Tasks that will get your name mentioned in the description of the "Highlights
-of 5.36.3"
+of 5.40.0"
 
 =head2 make ithreads more robust
 
index 7dd3a2d..33d33c5 100644 (file)
@@ -2,10 +2,7 @@ Perl is Copyright (C) 1993 - 2023 by Larry Wall and others.
 
 All rights reserved.
 
-
-
-ABOUT PERL
-==========
+# ABOUT PERL
 
 Perl is a general-purpose programming language originally developed for
 text manipulation and now used for a wide range of tasks including
@@ -28,15 +25,14 @@ There are also many Perl books available, covering a wide variety of topics,
 from various publishers.  See pod/perlbook.pod for more information.
 
 
-INSTALLATION
-============
+# INSTALLATION
 
 If you're using a relatively modern operating system and want to
 install this version of Perl locally, run the following commands:
 
-  ./Configure -des -Dprefix=$HOME/localperl
-  make test
-  make install
+    ./Configure -des -Dprefix=$HOME/localperl
+    make test
+    make install
 
 This will configure and compile perl for your platform, run the regression
 tests, and install perl in a subdirectory "localperl" of your home directory.
@@ -50,11 +46,10 @@ variety of platforms, some more common than others.
 Once you have Perl installed, a wealth of documentation is available to you
 through the 'perldoc' tool.  To get started, run this command:
 
-  perldoc perl
+    perldoc perl
 
 
-IF YOU RUN INTO TROUBLE
-=======================
+# IF YOU RUN INTO TROUBLE
 
 Perl is a large and complex system that's used for everything from
 knitting to rocket science.  If you run into trouble, it's quite
@@ -76,20 +71,19 @@ Just a personal note:  I want you to know that I create nice things like this
 because it pleases the Author of my story.  If this bothers you, then your
 notion of Authorship needs some revision.  But you can use perl anyway. :-)
 
-                                                       The author.
+The author.
 
 
-LICENSING
-=========
+# LICENSING
 
 This program is free software; you can redistribute it and/or modify
 it under the terms of either:
 
-       a) the GNU General Public License as published by the Free
-       Software Foundation; either version 1, or (at your option) any
-       later version, or
+a.  the GNU General Public License as published by the Free
+    Software Foundation; either version 1, or (at your option) any
+    later version, or
 
-       b) the "Artistic License" which comes with this Kit.
+b.  the "Artistic License" which comes with this Kit.
 
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -126,5 +120,3 @@ is, in this case, a form of mere aggregation.)  This is my interpretation
 of the GPL.  If you still have concerns or difficulties understanding
 my intent, feel free to contact me.  Of course, the Artistic License
 spells all this out for your protection, so you may prefer to use that.
-
-
index 5398150..5e2fc9c 100644 (file)
@@ -1,3 +1,5 @@
+# vim: syntax=pod
+
 If you read this file _as_is_, just ignore the funny characters you see.
 It is written in the POD format (see pod/perlpod.pod) which is specially
 designed to be readable as is.
index 41345c1..68ef827 100644 (file)
@@ -1,3 +1,5 @@
+# vim: syntax=pod
+
 If you read this file _as_is_, just ignore the funny characters you
 see. It is written in the POD format (see perlpod manpage) which is
 specially designed to be readable as is.
index c9be849..4aca1f2 100644 (file)
@@ -1,3 +1,5 @@
+# vim: syntax=pod
+
 If you read this file _as_is_, just ignore the funny characters you
 see. It is written in the POD format (see pod/perlpod.pod) which is
 specially designed to be readable as is.
index d34cc7c..2ea0d12 100644 (file)
@@ -1,3 +1,5 @@
+# vim: syntax=pod
+
 This document is written in pod format hence there are punctuation
 characters in odd places.  Do not worry, you've apparently got the
 ASCII->EBCDIC translation worked out correctly.  You can read more
index ab9814a..79dc74a 100644 (file)
@@ -1,3 +1,5 @@
+# vim: syntax=pod
+
 If you read this file _as_is_, just ignore the funny characters you
 see. It is written in the POD format (see F<pod/perlpod.pod>) which is
 specially designed to be readable as is.
@@ -31,7 +33,7 @@ L<https://www.cygwin.com/>
 
 A recent net or commercial release of Cygwin is required.
 
-At the time this document was last updated, Cygwin 1.7.16 was current.
+At the time this document was last updated, Cygwin 3.0.7 was current.
 
 
 =head2 Cygwin Configuration
@@ -41,8 +43,8 @@ that Perl builds cleanly.  These changes are B<not> required for normal
 Perl usage.
 
 B<NOTE:> The binaries that are built will run on all Win32 versions.
-They do not depend on your host system (WinXP/Win2K/Win7) or your
-Cygwin configuration (binary/text mounts, cvgserver).
+They do not depend on your host system or your
+Cygwin configuration (binary/text mounts, cygserver).
 The only dependencies come from hard-coded pathnames like F</usr/local>.
 However, your host system and Cygwin configuration will affect Perl's
 runtime behavior (see L</"TEST">).
@@ -128,11 +130,10 @@ NOTE: The BerkeleyDB library only completely works on NTFS partitions.
 A port of SysV IPC is available for Cygwin.
 
 NOTE: This has B<not> been extensively tested.  In particular,
-C<d_semctl_semun> is undefined because it fails a Configure test
-and on Win9x the I<shm*()> functions seem to hang.  It also creates
-a compile time dependency because F<perl.h> includes F<<sys/ipc.h>>
-and F<<sys/sem.h>> (which will be required in the future when compiling
-CPAN modules). CURRENTLY NOT SUPPORTED!
+C<d_semctl_semun> is undefined because it fails a Configure test.  It
+also creates a compile time dependency because F<perl.h> includes
+F<<sys/ipc.h>> and F<<sys/sem.h>> (which will be required in the
+future when compiling CPAN modules). CURRENTLY NOT SUPPORTED!
 
 =item * C<-lutil>
 
@@ -201,47 +202,14 @@ build perl from sources.
 
 =back
 
-=head2 Suspicious Warnings on Cygwin
-
-You may see some messages during Configure that seem suspicious.
-
-=over 4
-
-=item * Win9x and C<d_eofnblk>
-
-Win9x does not correctly report C<EOF> with a non-blocking read on a
-closed pipe.  You will see the following messages:
-
- But it also returns -1 to signal EOF, so be careful!
- WARNING: you can't distinguish between EOF and no data!
-
- *** WHOA THERE!!! ***
-     The recommended value for $d_eofnblk on this machine was
-     "define"!
-     Keep the recommended value? [y]
-
-At least for consistency with WinNT, you should keep the recommended
-value.
-
-=item * Compiler/Preprocessor defines
-
-The following error occurs because of the Cygwin C<#define> of
-C<_LONG_DOUBLE>:
-
-  Guessing which symbols your C compiler and preprocessor define...
-  try.c:<line#>: missing binary operator
-
-This failure does not seem to cause any problems.  With older gcc
-versions, "parse error" is reported instead of "missing binary
-operator".
-
-=back
-
 =head1 MAKE ON CYGWIN
 
 Simply run I<make> and wait:
 
-  make 2>&1 | tee log.make
+  make -jn 2>&1 | tee log.make
+
+where I<n> is the maximum number of simultaneous compilations you want;
+omitting this parameter is the same as specifying C<-j1>.
 
 =head1 TEST ON CYGWIN
 
@@ -252,7 +220,12 @@ There are two steps to running the test suite:
   cd t; ./perl harness 2>&1 | tee ../log.harness
 
 The same tests are run both times, but more information is provided when
-running as C<./perl harness>.
+running as C<./perl harness>, and you can run the tests in parallel by
+instead specifying
+
+  cd t; TEST_JOBS=n ./perl harness 2>&1 | tee ../log.harness
+
+where I<n> is the maximum number of tests to run simulataneously.
 
 Test results vary depending on your host system and your Cygwin
 configuration.  If a test can pass in some Cygwin setup, it is always
@@ -329,8 +302,8 @@ to portability, more information can be found in the Cygwin documentation.
 =item * Pathnames
 
 Cygwin pathnames are separated by forward (F</>) slashes, Universal
-Naming Codes (F<//UNC>) are also supported Since cygwin-1.7 non-POSIX
-pathnames are discouraged.  Names may contain all printable
+Naming Codes (F<//UNC>) are also supported Since cygwin-1.7 non-POSIX
+pathnames should not be used.  Names may contain all printable
 characters.
 
 File names are case insensitive, but case preserving.  A pathname that
@@ -419,30 +392,24 @@ or:
  as parent(0x6FB30000) != 0x6FE60000 46 [main] perl 3488 fork: child
  3588 - died waiting for dll loading, errno11
 
-See L<https://cygwin.com/faq/faq-nochunks.html#faq.using.fixing-fork-failures>
+See L<https://cygwin.com/faq/faq.html#faq.using.fixing-fork-failures>
 It helps if not too many DLLs are loaded in memory so the available address space is larger,
 e.g. stopping the MS Internet Explorer might help.
 
-Use the perlrebase or rebase utilities to resolve the conflicting dll addresses.
++Use the rebase utilities to resolve the conflicting dll addresses.
 The rebase package is included in the Cygwin setup. Use F<setup.exe>
 from L<https://cygwin.com/install.html> to install it.
 
-1. kill all perl processes and run C<perlrebase> or
-
-2. kill all cygwin processes and services, start dash from cmd.exe and run C<rebaseall>.
+1. kill all perl processes and run
+   C<</bin/find <dir> -xdev -name \*.dll | /bin/rebase -OT ->> or
 
-=item * C<chown()>
-
-On WinNT C<chown()> can change a file's user and group IDs.  On Win9x C<chown()>
-is a no-op, although this is appropriate since there is no security model.
+2. kill all cygwin processes and services, and run setup.exe.
 
 =item * Miscellaneous
 
 File locking using the C<F_GETLK> command to C<fcntl()> is a stub that
 returns C<ENOSYS>.
 
-Win9x can not C<rename()> an open file (although WinNT can).
-
 The Cygwin C<chroot()> implementation has holes (it can not restrict file
 access by native Win32 programs).
 
@@ -566,7 +533,7 @@ be kept as clean as possible.
  pod/perl573delta.pod pod/perl58delta.pod pod/perl581delta.pod
  pod/perl590delta.pod pod/perlhist.pod pod/perlmodlib.pod
  pod/perltoc.pod Porting/Glossary pod/perlgit.pod
- Porting/checkAUTHORS.pl
+ Porting/updateAUTHORS.pl
  dist/Cwd/Changes ext/Compress-Raw-Zlib/Changes
  dist/Time-HiRes/Changes
  ext/Compress-Raw-Zlib/README ext/Compress-Zlib/Changes
@@ -774,4 +741,4 @@ Jerry D. Hedden <jdhedden@cpan.org>.
 
 =head1 HISTORY
 
-Last updated: 2012-02-08
+Last updated: 2019-11-14
index 7cadb6e..af31112 100644 (file)
@@ -1,3 +1,5 @@
+# vim: syntax=pod
+
 If you read this file _as_is_, just ignore the funny characters you
 see.  It is written in the POD format (see pod/perlpod.pod) which is
 specifically designed to be readable as is.
@@ -17,7 +19,7 @@ When perl is configured to use ithreads, it will use re-entrant library calls
 in preference to non-re-entrant versions.  There is a bug in FreeBSD's
 C<readdir_r> function in versions 4.5 and earlier that can cause a SEGV when
 reading large directories. A patch for FreeBSD libc is available
-(see L<http://www.freebsd.org/cgi/query-pr.cgi?pr=misc/30631> )
+(see L<https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=30631>)
 which has been integrated into FreeBSD 4.6.
 
 =head2 C<$^X> doesn't always contain a full path in FreeBSD
@@ -27,7 +29,7 @@ system. On FreeBSD the full path of the perl interpreter is found by using
 C<sysctl> with C<KERN_PROC_PATHNAME> if that is supported, else by reading
 the symlink F</proc/curproc/file>. FreeBSD 7 and earlier has a bug where
 either approach sometimes returns an incorrect value
-(see L<http://www.freebsd.org/cgi/query-pr.cgi?pr=35703> ).
+(see L<https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=35703>).
 In these cases perl will fall back to the old behaviour of using C's
 C<argv[0]> value for C<$^X>.
 
index 139bf93..c7dc17a 100644 (file)
@@ -1,3 +1,5 @@
+# vim: syntax=pod
+
 If you read this file _as_is_, just ignore the funny characters you see.
 It is written in the POD format (see pod/perlpod.pod) which is specially
 designed to be readable as is.
@@ -22,9 +24,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.36.3/BePC-haiku/CORE/libperl.so .
+  cd /boot/common/lib; ln -s perl5/5.38.2/BePC-haiku/CORE/libperl.so .
 
-Replace C<5.36.3> with your respective version of Perl.
+Replace C<5.38.2> with your respective version of Perl.
 
 =head1 KNOWN PROBLEMS
 
index e782fd4..2a0aae6 100644 (file)
@@ -1,3 +1,5 @@
+# vim: syntax=pod
+
 If you read this file _as_is_, just ignore the funny characters you see.
 It is written in the POD format (see pod/perlpod.pod) which is specially
 designed to be readable as is.
index 6ce3c2e..c03acf2 100644 (file)
@@ -1,3 +1,5 @@
+# vim: syntax=pod
+
 If you read this file _as_is_, just ignore the funny characters you see.
 It is written in the POD format (see pod/perlpod.pod) which is specially
 designed to be readable as is.
index 09b655c..5e9446a 100644 (file)
@@ -1,3 +1,5 @@
+# vim: syntax=pod
+
 If you read this file _as_is_, just ignore the funny characters you
 see.  It is written in the POD format (see pod/perlpod.pod) which is
 specifically designed to be readable as is.
index 4e8fd69..db2d113 100644 (file)
@@ -1,3 +1,5 @@
+# vim: syntax=pod
+
 If you read this file _as_is_, just ignore the funny characters you
 see.  It is written in the POD format (see pod/perlpod.pod) which is
 specifically designed to be readable as is.
index 587f810..472b776 100644 (file)
@@ -1,3 +1,5 @@
+# vim: syntax=pod
+
 If you read this file _as_is_, just ignore the funny characters you see.
 It is written in the POD format (see pod/perlpod.pod) which is specially
 designed to be readable as is.
@@ -10,9 +12,9 @@ perlmacosx - Perl under Mac OS X
 
 This document briefly describes Perl under Mac OS X.
 
-  curl -O https://www.cpan.org/src/perl-5.36.3.tar.gz
-  tar -xzf perl-5.36.3.tar.gz
-  cd perl-5.36.3
+  curl -O https://www.cpan.org/src/perl-5.38.2.tar.gz
+  tar -xzf perl-5.38.2.tar.gz
+  cd perl-5.38.2
   ./Configure -des -Dprefix=/usr/local/
   make
   make test
@@ -20,7 +22,7 @@ This document briefly describes Perl under Mac OS X.
 
 =head1 DESCRIPTION
 
-The latest Perl release (5.36.3 as of this writing) builds without changes
+The latest Perl release (5.38.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 2606208..63c8ed3 100644 (file)
@@ -1,3 +1,5 @@
+# vim: syntax=pod
+
 If you read this file _as_is_, just ignore the funny characters you
 see.  It is written in the POD format (see pod/perlpod.pod) which is
 specifically designed to be readable as is.
index efeb156..45b8312 100644 (file)
@@ -1,3 +1,5 @@
+# vim: syntax=pod
+
 If you read this file _as_is_, just ignore the funny characters you
 see. It is written in the POD format (see perlpod manpage) which is
 specially designed to be readable as is.
@@ -619,7 +621,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.36.3/
+  unzip perl_ste.zip -d f:/perllib/lib/site_perl/5.38.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 8ec6846..3cadfe2 100644 (file)
@@ -1,3 +1,5 @@
+# vim: syntax=pod
+
 This document is written in pod format hence there are punctuation
 characters in odd places. You can read more
 about pod in pod/perlpod.pod or the short summary in the INSTALL file.
index a5f22c5..fcb6100 100644 (file)
@@ -1,3 +1,5 @@
+# vim: syntax=pod
+
 If you read this file _as_is_, just ignore the funny characters you see.
 It is written in the POD format (see pod/perlpod.pod) which is specially
 designed to be readable as is.
index 5e53c05..57b6be7 100644 (file)
@@ -1,3 +1,5 @@
+# vim: syntax=pod
+
 If you read this file _as_is_, just ignore the funny characters you see.
 It is written in the POD format (see pod/perlpod.pod) which is specially
 designed to be readable as is.
index f677c20..f109799 100644 (file)
@@ -1,3 +1,5 @@
+# vim: syntax=pod
+
 If you read this file _as_is_, just ignore the funny characters you see.
 It is written in the POD format (see pod/perlpod.pod) which is specially
 designed to be readable as is.
index 7b11079..bd9405a 100644 (file)
@@ -1,3 +1,5 @@
+# vim: syntax=pod
+
 If you read this file _as_is_, just ignore the funny characters you
 see.  It is written in the POD format (see pod/perlpod.pod) which is
 specifically designed to be readable as is.
index f2dd757..8d6f41a 100644 (file)
@@ -1,3 +1,5 @@
+# vim: syntax=pod
+
 If you read this file _as_is_, just ignore the funny characters you see.
 It is written in the POD format (see pod/perlpod.pod) which is specially
 designed to be readable as is. But if you have been into Perl you
@@ -23,20 +25,98 @@ L<Synology FAQ|https://kb.synology.com/en-global/DSM/tutorial/What_kind_of_CPU_d
 Since it is based on Linux, the NAS can run many popular Linux
 software packages, including Perl. In fact, Synology provides a
 ready-to-install package for Perl, depending on the version of DSM
-the installed perl ranges from 5.8.6 on DSM-4.3 to 5.24.0 on DSM-6.1.
+the installed perl ranges from 5.8.6 on DSM-4.3 to 5.28.1 on DSM-7.1.
 
 There is an active user community that provides many software packages
 for the Synology DSM systems; at the time of writing this document
-they provide Perl version 5.24.1.
+they provide Perl version 5.28.1.
 
 This document describes various features of Synology DSM operating
 system that will affect how Perl 5 (hereafter just Perl) is
 configured, compiled and/or runs. It has been compiled and verified by
 Johan Vromans for the Synology DS413 (QorIQ), with feedback from
-H.Merijn Brand (DS213, ARMv5tel and RS815, Intel Atom x64).
+H.Merijn Brand (DS213: ARMv5tel, RS815: Intel Atom x64, and DS218+:
+Celeron J3355).
 
 =head2 Setting up the build environment
 
+=head3 DSM 7
+
+For a comfortable development environment, Entware is currently the only
+viable solution. Just follow the detailed instructions on
+L<Install Entware on Synology NAS|https://github.com/Entware/Entware/wiki/Install-on-Synology-NAS>.
+supported architectures are armv5, armv7, mipsel, wl500g, x86_32, and x86_64.
+Check L<here|https://pkg.entware.net/binaries/> for supported platforms.
+
+That github link also shows what environments should be supported.
+
+It was tested on DSM-7.1 by H.Merijn Brand on a DS218+ and a DS220+ (both
+Intel x64).
+
+Entware comes with a precompiled 5.26.1 (Jan 2018) that allowes
+building shared XS code. Note that this installation does B<not> use
+a site_perl folder. The available C<cpan> works. If all required
+development packages are installed too, also for XS.
+
+Installing perl from the Community package center:
+
+=over 4
+
+=item *
+
+Using your favourite browser open the DSM management page and start
+the Package Center.
+
+=item *
+
+In Settings, add the following Package Sources:
+
+  Name:     Community
+  Location: https://synopackage.com/repository/spk/All
+
+=item *
+
+Still in Settings, in Channel Update, select Beta Channel.
+
+=back
+
+To complete the development environment, install make and gcc
+
+ ds220# opkg install make gcc
+
+Then, optionally, make sure you use the more recent bash and gawk.
+
+ ds220# opkg install bash gawk
+ ds220# cd /usr/bin
+ ds220# mv bash bash.syno
+ ds220# ln -s /opt/bin/bash .
+
+In order to have Configure find the required libraries
+
+ ds220# cd /opt/lib
+ ds220# ln -s libcrypt.so.?       libcrypt.so
+ ds220# ln -s libdl.so.?          libdl.so
+ ds220# ln -s libgdbm.so.?        libgdbm.so
+ ds220# ln -s libgdbm_compat.so.? libgdbm_compat.so
+ ds220# ln -s libm.so.?           libm.so
+ ds220# ln -s libpthread.so.?     libpthread.so
+ ds220# ln -s libutil.so.?        libutil.so
+
+=head3 DSM 6
+
+Using iPkg has been deprecated on DSM 6, but an alternative is available
+for DSM 6: entware/opkg. For instructions on how to use that, please read
+L<Install Entware-ng on Synology NAS|https://github.com/Entware-ng/Entware-ng/wiki/Install-on-Synology-NAS>
+
+That sadly does not (yet) work on QorIQ. At the moment of writing, the
+supported architectures are armv5, armv7, mipsel, wl500g, x86_32, and x86_64.
+Check L<here|https://pkg.entware.net/binaries/> for supported platforms.
+
+Entware-ng comes with a precompiled 5.24.1 (June 2017) that allowes
+building shared XS code. Note that this installation does B<not> use
+a site_perl folder. The available C<cpan> works. If all required
+development packages are installed too, also for XS.
+
 =head3 DSM 5
 
 As DSM is a trimmed-down Linux system, it lacks many of the tools and
@@ -62,6 +142,9 @@ In Settings, add the following Package Sources:
   https://www.cphub.net
   http://packages.quadrat4.de
 
+As these two are both discontinued, it is unlikely you will be able
+to set up a build environment on DSM 5.
+
 =item *
 
 Still in Settings, in Channel Update, select Beta Channel.
@@ -131,21 +214,6 @@ Execute the following commands:
 B<WARNING:> When you perform a system software upgrade, these links
 will disappear and need to be re-established.
 
-=head3 DSM 6
-
-Using iPkg has been deprecated on DSM 6, but an alternative is available
-for DSM 6: entware/opkg. For instructions on how to use that, please read
-L<Install Entware-ng on Synology NAS|https://github.com/Entware-ng/Entware-ng/wiki/Install-on-Synology-NAS>
-
-That sadly does not (yet) work on QorIQ. At the moment of writing, the
-supported architectures are armv5, armv7, mipsel, wl500g, x86_32, and x86_64.
-Check L<here|https://pkg.entware.net/binaries/> for supported platforms.
-
-Entware-ng comes with a precompiled 5.24.1 (June 2017) that allowes
-building shared XS code. Note that this installation does B<not> use
-a site_perl folder. The available C<cpan> works. If all required
-development packages are installed too, also for XS.
-
 =head2 Compiling Perl 5
 
 When the build environment has been set up, building and testing Perl
@@ -158,16 +226,18 @@ sources as usual, and add a file Policy.sh as follows:
   # Install Perl in a tree in /opt/perl instead of /opt/bin.
   prefix=/opt/perl
 
-  # Select the compiler. Note that there is no 'cc' alias or link.
+  # Select the compiler. Note that there is no 'cc' alias or link
+  # on older DSM versions
   cc=gcc
+  awk=/opt/bin/gawk
 
-  # Build flags.
+  # Build flags. Optional
   ccflags="-DDEBUGGING"
 
   # Library and include paths.
-  libpth="/lib"
   locincpth="/opt/include"
-  loclibpth="/lib"
+  loclibpth="/opt/lib /usr/local/lib /usr/lib"
+  libpth="/opt/lib /usr/local/lib /usr/lib"
 
 You may want to create the destination directory and give it the right
 permissions before installing, thus eliminating the need to build Perl
@@ -176,16 +246,19 @@ as a super user.
 In the directory where you unpacked the sources, issue the familiar
 commands:
 
-  ./Configure -des
-  make
-  make test
-  make install
+  $ bash ./Configure -Dusedevel -Duseshrplib -Duse64bitall -des
+  $ make -j2
+  $ env TEST_JOBS=2 make test_harness
+  make install
 
 =head2 Known problems
 
 =head3 Configure
 
-No known problems yet
+The GNU C-compiler might spit out unexpected stuff under -v, which
+causes the analysis of cppsymbols to fail because of unmatched quotes.
+
+You'll note if config.sh fails with a syntax error.
 
 =head3 Build
 
@@ -216,7 +289,7 @@ some system components will start to fail.
 
 =back
 
-=head2 Smoke testing Perl 5
+=head2 Smoke testing Perl
 
 If building completes successfully, you can set up smoke testing as
 described in the Test::Smoke documentation.
@@ -267,11 +340,11 @@ the programs are run.
 
 =head1 REVISION
 
-June 2017, for Synology DSM 5.1.5022 and DSM 6.1-15101-4.
+July 2022, for DSM 5.1.5022 and DSM 6.1-15101-4, and DSM-7.1-42661-3.
 
 =head1 AUTHOR
 
 Johan Vromans <jvromans@squirrel.nl>
-H. Merijn Brand <h.m.brand@xs4all.nl>
+H. Merijn Brand <cpan@tux.freedom.nl>
 
 =cut
index 7b596a9..c5162b3 100644 (file)
@@ -1,3 +1,5 @@
+# vim: syntax=pod
+
 If you read this file _as_is_, just ignore the funny characters you see.
 It is written in the POD format (see pod/perlpod.pod) which is specially
 designed to be readable as is.
index 716fd86..5d8bd9b 100644 (file)
@@ -1,3 +1,5 @@
+# vim: syntax=pod
+
 If you read this file _as_is_, just ignore the equal signs on the left.
 This file is written in the POD format (see [.pod]perlpod.pod) which is
 specially designed to be readable as is.
@@ -137,11 +139,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^.36^.3.tar
+    vmstar -xvf perl-5^.38^.2.tar
 
 Then set default to the top-level source directory like so:
 
-    set default [.perl-5^.36^.3]
+    set default [.perl-5^.38^.2]
 
 and proceed with configuration as described in the next section.
 
index bad9e5b..5a7474a 100644 (file)
@@ -1,3 +1,5 @@
+# vim: syntax=pod
+
 If you read this file _as_is_, just ignore the funny characters you
 see. It is written in the POD format (see pod/perlpod.pod) which is
 specially designed to be readable as is.
@@ -53,7 +55,7 @@ delivering complete gcc toolchain for MS Windows:
 
 Delivers gcc toolchain building 32-bit executables (which can be used both 32 and 64 bit Windows platforms)
 
-=item L<http://mingw-w64.org>
+=item L<https://mingw-w64.org>
 
 Delivers gcc toolchain targeting both 64-bit Windows and 32-bit Windows
 platforms (despite the project name "mingw-w64" they are not only 64-bit
@@ -72,10 +74,10 @@ https://docs.microsoft.com/en-us/visualstudio/productinfo/vs2013-compatibility-v
 and
 https://docs.microsoft.com/en-us/visualstudio/productinfo/vs2013-sysrequirements-vs
 
-The MinGW64 compiler is available at L<http://mingw-w64.org>.
+The MinGW64 compiler is available at L<https://mingw-w64.org>.
 The latter is actually a cross-compiler targeting Win64. There's also a trimmed
 down compiler (no java, or gfortran) suitable for building perl available at:
-L<http://strawberryperl.com/package/kmx/64_gcctoolchain/>
+L<https://strawberryperl.com/package/kmx/64_gcctoolchain/>
 
 NOTE: If you're using a 32-bit compiler to build perl on a 64-bit Windows
 operating system, then you should set the WIN64 environment variable to "undef".
@@ -133,20 +135,25 @@ These free versions of Visual C++ 2013-2022 Professional contain the same
 compilers and linkers that ship with the full versions, and also contain
 everything necessary to build Perl.
 
-These packages can be downloaded by searching in the Download Center at
-L<https://www.microsoft.com/downloads/search.aspx?displaylang=en>.  (Providing exact
-links to these packages has proven a pointless task because the links keep on
-changing so often.)
+These packages can be downloaded from L<https://visualstudio.microsoft.com/>.
 
 Install Visual C++ 2013-2022 Community, then setup your environment
 using, e.g.
 
- C:\Program Files\Microsoft Visual Studio 12.0\Common7\Tools\vsvars32.bat
+F<C:\Program Files\Microsoft Visual Studio 12.0\Common7\Tools\vsvars32.bat>
 
 (assuming the default installation location was chosen).
 
-Perl should now build using the win32/Makefile.  You will need to edit that
-file to set CCTYPE to one of MSVC120-MSVC142 first.
+Perl should now build using the F<win32/Makefile>.  You will need to edit that
+file to set C<CCTYPE> to one of C<MSVC120>-C<MSVC143> first.
+
+=item Microsoft C++ Build Tools
+
+There's also a standalone (IDE-less) version of the build tools mentioned
+above containing the MSVC compiler available for download from
+L<https://visualstudio.microsoft.com/visual-cpp-build-tools/>.
+
+This is also referred to as I<Build Tools for Visual Studio>.
 
 =item GCC
 
@@ -154,7 +161,7 @@ Perl can be compiled with gcc from MinGW (version 3.4.5 or later) or from
 MinGW64 (version 4.4.3 or later).  It can be downloaded here:
 
 L<https://osdn.net/projects/mingw/>
-L<http://www.mingw-w64.org/>
+L<https://www.mingw-w64.org/>
 
 You also need gmake. Usually it comes with MinGW but its executable may have
 a different name, such as mingw32-make.exe.
@@ -167,11 +174,11 @@ or later, and with MinGW64 64-bit 6.3.0 or later.
 =item Intel C++ Compiler
 
 Experimental support for using Intel C++ Compiler has been added. Edit
-win32/Makefile and pick the correct CCTYPE for the Visual C that Intel C was
-installed into. Also uncomment __ICC to enable Intel C on Visual C support.
+F<win32/Makefile> and pick the correct C<CCTYPE> for the Visual C that Intel C
+was installed into. Also uncomment C<__ICC> to enable Intel C on Visual C support.
 To set up the build environment, from the Start Menu run
 IA-32 Visual Studio 20__ mode or Intel 64 Visual Studio 20__ mode as
-appropriate. Then run nmake as usually in that prompt box.
+appropriate. Then run C<nmake> as usual in that prompt box.
 
 Only Intel C++ Compiler v12.1 has been tested. Other versions probably will
 work. Using Intel C++ Compiler instead of Visual C has the benefit of C99
@@ -187,65 +194,65 @@ unlike GCC.
 
 =item *
 
-Make sure you are in the "win32" subdirectory under the perl toplevel.
-This directory contains a "Makefile" that will work with
-versions of nmake that come with Visual C++, and
-a GNU make "GNUmakefile" that will work for all supported compilers.
-The defaults in the gmake makefile are setup to build using MinGW/gcc.
+Make sure you are in the F<win32> subdirectory under the perl toplevel.
+This directory contains a F<Makefile> that will work with
+versions of C<nmake> that come with Visual C++, and
+a GNU make F<GNUmakefile> that will work for all supported compilers.
+The defaults in the C<gmake> makefile are set up to build with MinGW/gcc.
 
 =item *
 
-Edit the GNUmakefile (or Makefile, if you're using nmake) and change the values
-of INST_DRV and INST_TOP. You can also enable various build flags. These are
-explained in the makefiles.
+Edit the F<GNUmakefile> (or F<Makefile>, if you're using F<nmake>) and change
+the values of I<INST_DRV> and C<INST_TOP>. You can also enable various build
+flags. These are explained in the makefiles.
 
-Note that it is generally not a good idea to try to build a perl with
-INST_DRV and INST_TOP set to a path that already exists from a previous
+Note that it is generally not a good idea to try to build a C<perl> with
+C<INST_DRV> and C<INST_TOP> set to a path that already exists from a previous
 build.  In particular, this may cause problems with the
-lib/ExtUtils/t/Embed.t test, which attempts to build a test program and
-may end up building against the installed perl's lib/CORE directory rather
-than the one being tested.
+F<lib/ExtUtils/t/Embed.t> test, which attempts to build a test program and
+may end up building against the installed C<perl>'s F<lib/CORE> directory
+rather than the one being tested.
 
-You will have to make sure that CCTYPE is set correctly and that
-CCHOME points to wherever you installed your compiler.  For GCC this
+You will have to make sure that C<CCTYPE> is set correctly and that
+C<CCHOME> points to wherever you installed your compiler.  For GCC this
 should be the directory that contains the F<bin>, F<include> and
 F<lib> directories.
 
 If building with the cross-compiler provided by
 mingw-w64.org you'll need to uncomment the line that sets
-GCCCROSS in the GNUmakefile. Do this only if it's the cross-compiler - ie
-only if the bin folder doesn't contain a gcc.exe. (The cross-compiler
-does not provide a gcc.exe, g++.exe, ar.exe, etc. Instead, all of these
-executables are prefixed with 'x86_64-w64-mingw32-'.)
+C<GCCCROSS> in the F<GNUmakefile>. Do this only if it's the cross-compiler,
+ie. only if the F<bin> folder doesn't contain a F<gcc.exe>. (The cross-compiler
+does not provide a F<gcc.exe>, F<g++.exe>, F<ar.exe>, etc. Instead, all of these
+executables are prefixed with C<x86_64-w64-mingw32->.)
 
-The default value for CCHOME in the makefiles for Visual C++
+The default value for C<CCHOME> in the makefiles for Visual C++
 may not be correct for some versions.  Make sure the default exists
 and is valid.
 
-If you want build some core extensions statically into perl's dll, specify
-them in the STATIC_EXT macro.
+If you want build some core extensions statically into C<perl>'s DLL,
+specify them in the C<STATIC_EXT> macro.
 
 Be sure to read the instructions near the top of the makefiles carefully.
 
 =item *
 
-Type "gmake" (or "nmake" if you are using that make).
+Type C<gmake> (or C<nmake> if you are using that version of C<make>).
 
-This should build everything.  Specifically, it will create perl.exe,
-perl536.dll at the perl toplevel, and various other extension dll's
-under the lib\auto directory.  If the build fails for any reason, make
+This should build everything.  Specifically, it will create F<perl.exe>,
+F<perl538.dll> at the perl toplevel, and various other extension DLL's
+under the F<lib\auto> directory.  If the build fails for any reason, make
 sure you have done the previous steps correctly.
 
-To try gmake's parallel mode, type "gmake -j2", where 2, is the maximum number
+To try C<gmake>'s parallel mode, type C<gmake -j2> where C<2> is the maximum number
 of parallel jobs you want to run. A number of things in the build process will
 run in parallel, but there are serialization points where you will see just 1
 CPU maxed out. This is normal.
 
 If you are advanced enough with building C code, here is a suggestion to speed
-up building perl, and the later C<make test>. Try to keep your PATH environmental
+up building C<perl>, and the later C<make test>. Try to keep your C<PATH> environment
 variable with the least number of folders possible (remember to keep your C
-compiler's folders there). C<C:\WINDOWS\system32> or C<C:\WINNT\system32>
-depending on your OS version should be first folder in PATH, since "cmd.exe"
+compiler's folders there). F<C:\WINDOWS\system32> or F<C:\WINNT\system32>
+depending on your OS version should be first folder in C<PATH>, since C<cmd.exe>
 is the most commonly launched program during the build and later testing.
 
 =back
index 6cd6d2e..82cd0dc 100644 (file)
@@ -74,28 +74,28 @@ Macro to declare an XSUB and its C parameter list explicitly exporting the symbo
 Macro used by C<L</XS_INTERNAL>> and C<L</XS_EXTERNAL>> to declare a function
 prototype.  You probably shouldn't be using this directly yourself.
 
-=for apidoc Amns||dAX
+=for apidoc Amn;||dAX
 Sets up the C<ax> variable.
 This is usually handled automatically by C<xsubpp> by calling C<dXSARGS>.
 
-=for apidoc Amns||dAXMARK
+=for apidoc Amn;||dAXMARK
 Sets up the C<ax> variable and stack marker variable C<mark>.
 This is usually handled automatically by C<xsubpp> by calling C<dXSARGS>.
 
-=for apidoc Amns||dITEMS
+=for apidoc Amn;||dITEMS
 Sets up the C<items> variable.
 This is usually handled automatically by C<xsubpp> by calling C<dXSARGS>.
 
-=for apidoc Amns||dXSARGS
+=for apidoc Amn;||dXSARGS
 Sets up stack and mark pointers for an XSUB, calling C<dSP> and C<dMARK>.
 Sets up the C<ax> and C<items> variables by calling C<dAX> and C<dITEMS>.
 This is usually handled automatically by C<xsubpp>.
 
-=for apidoc Amns||dXSI32
+=for apidoc Amn;||dXSI32
 Sets up the C<ix> variable for an XSUB which has aliases.  This is usually
 handled automatically by C<xsubpp>.
 
-=for apidoc Amns||dUNDERBAR
+=for apidoc Amn;||dUNDERBAR
 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.
@@ -261,16 +261,16 @@ Return a double from an XSUB immediately.  Uses C<XST_mNV>.
 =for apidoc Am|void|XSRETURN_PV|char* str
 Return a copy of a string from an XSUB immediately.  Uses C<XST_mPV>.
 
-=for apidoc Amns||XSRETURN_NO
+=for apidoc Amn;||XSRETURN_NO
 Return C<&PL_sv_no> from an XSUB immediately.  Uses C<XST_mNO>.
 
-=for apidoc Amns||XSRETURN_YES
+=for apidoc Amn;||XSRETURN_YES
 Return C<&PL_sv_yes> from an XSUB immediately.  Uses C<XST_mYES>.
 
-=for apidoc Amns||XSRETURN_UNDEF
+=for apidoc Amn;||XSRETURN_UNDEF
 Return C<&PL_sv_undef> from an XSUB immediately.  Uses C<XST_mUNDEF>.
 
-=for apidoc Amns||XSRETURN_EMPTY
+=for apidoc Amn;||XSRETURN_EMPTY
 Return an empty list from an XSUB immediately.
 
 =for apidoc AmU||newXSproto|char* name|XSUBADDR_t f|char* filename|const char *proto
@@ -282,18 +282,18 @@ The version identifier for an XS module.  This is usually
 handled automatically by C<ExtUtils::MakeMaker>.  See
 C<L</XS_VERSION_BOOTCHECK>>.
 
-=for apidoc Amns||XS_VERSION_BOOTCHECK
+=for apidoc Amn;||XS_VERSION_BOOTCHECK
 Macro to verify that a PM module's C<$VERSION> variable matches the XS
 module's C<XS_VERSION> variable.  This is usually handled automatically by
 C<xsubpp>.  See L<perlxs/"The VERSIONCHECK: Keyword">.
 
-=for apidoc Amns||XS_APIVERSION_BOOTCHECK
+=for apidoc Amn;||XS_APIVERSION_BOOTCHECK
 Macro to verify that the perl api version an XS module has been compiled against
 matches the api version of the perl interpreter it's being loaded into.
 
 =for apidoc_section $exceptions
 
-=for apidoc Amns||dXCPT
+=for apidoc Amn;||dXCPT
 Set up necessary local variables for exception handling.
 See L<perlguts/"Exception Handling">.
 
@@ -306,7 +306,7 @@ Ends a try block.  See L<perlguts/"Exception Handling">.
 =for apidoc AmnU||XCPT_CATCH
 Introduces a catch block.  See L<perlguts/"Exception Handling">.
 
-=for apidoc Amns||XCPT_RETHROW
+=for apidoc Amn;||XCPT_RETHROW
 Rethrows a previously caught exception.  See L<perlguts/"Exception Handling">.
 
 =cut
@@ -329,15 +329,15 @@ Rethrows a previously caught exception.  See L<perlguts/"Exception Handling">.
         return;                                                \
     } STMT_END
 
-#define XSRETURN_IV(v) STMT_START { XST_mIV(0,v);  XSRETURN(1); } STMT_END
-#define XSRETURN_UV(v) STMT_START { XST_mUV(0,v);  XSRETURN(1); } STMT_END
-#define XSRETURN_NV(v) STMT_START { XST_mNV(0,v);  XSRETURN(1); } STMT_END
-#define XSRETURN_PV(v) STMT_START { XST_mPV(0,v);  XSRETURN(1); } STMT_END
-#define XSRETURN_PVN(v,n) STMT_START { XST_mPVN(0,v,n);  XSRETURN(1); } STMT_END
-#define XSRETURN_NO    STMT_START { XST_mNO(0);    XSRETURN(1); } STMT_END
-#define XSRETURN_YES   STMT_START { XST_mYES(0);   XSRETURN(1); } STMT_END
-#define XSRETURN_UNDEF STMT_START { XST_mUNDEF(0); XSRETURN(1); } STMT_END
-#define XSRETURN_EMPTY STMT_START {                XSRETURN(0); } STMT_END
+#define XSRETURN_IV(v)    STMT_START { XST_mIV(0,v);    XSRETURN(1); } STMT_END
+#define XSRETURN_UV(v)    STMT_START { XST_mUV(0,v);    XSRETURN(1); } STMT_END
+#define XSRETURN_NV(v)    STMT_START { XST_mNV(0,v);    XSRETURN(1); } STMT_END
+#define XSRETURN_PV(v)    STMT_START { XST_mPV(0,v);    XSRETURN(1); } STMT_END
+#define XSRETURN_PVN(v,n) STMT_START { XST_mPVN(0,v,n); XSRETURN(1); } STMT_END
+#define XSRETURN_NO       STMT_START { XST_mNO(0);      XSRETURN(1); } STMT_END
+#define XSRETURN_YES      STMT_START { XST_mYES(0);     XSRETURN(1); } STMT_END
+#define XSRETURN_UNDEF    STMT_START { XST_mUNDEF(0);   XSRETURN(1); } STMT_END
+#define XSRETURN_EMPTY    STMT_START {                  XSRETURN(0); } STMT_END
 
 #define newXSproto(a,b,c,d)    newXS_flags(a,b,c,d,0)
 
@@ -426,7 +426,7 @@ Rethrows a previously caught exception.  See L<perlguts/"Exception Handling">.
         } STMT_END
 
 #define DBM_ckFilter(arg,type,name)                            \
-        STMT_START {                                           \
+    STMT_START {                                               \
         if (db->type) {                                                \
             if (db->filtering) {                               \
                 croak("recursion detected in %s", name) ;      \
@@ -450,7 +450,8 @@ Rethrows a previously caught exception.  See L<perlguts/"Exception Handling">.
             if (name[7] == 's'){                                \
                 arg = sv_2mortal(arg);                          \
             }                                                   \
-        } } STMT_END
+        }                                                       \
+    } STMT_END
 
 #if 1          /* for compatibility */
 #  define VTBL_sv              &PL_vtbl_sv
index e51186c..698165f 100644 (file)
@@ -249,7 +249,7 @@ PerlIO *Perl_my_popen(pTHX_ const char *cmd, const char *mode)
         }
 
         /* Our new process is running and will close it streams etc
-         * once its done. All we need to is open the pipe via stdio
+         * once it's done. All we need to is open the pipe via stdio
          */
 
         return result;
index 8dea08c..8b05a17 100644 (file)
@@ -33,7 +33,7 @@ my %extra_input_pods = ( 'dist/ExtUtils-ParseXS/lib/perlxs.pod' => 1 );
 # the legal section names, or an error is thrown.  $section_name_variable must
 # be one of the legal section name variables defined below; these expand to
 # legal section names.  This form is used so that minor wording changes in
-# these titles can be confied to this file.  All the names of the variables
+# these titles can be confined to this file.  All the names of the variables
 # end in '_scn'; this suffix is optional in the apidoc_section lines.
 #
 # All API elements defined between this line and the next 'apidoc_section'
@@ -369,7 +369,7 @@ my $apidoc_re = qr/ ^ (\s*)            # $1
                       (.*?)            # $7
                       \s* \n /x;
 # Only certain flags, dealing with display, are acceptable for apidoc_item
-my $display_flags = "fFnDopsTx";
+my $display_flags = "fFnDopTx;";
 
 sub check_api_doc_line ($$) {
     my ($file, $in) = @_;
@@ -529,13 +529,19 @@ sub autodoc ($$) { # parse a file and extract documentation info
             }
 
             die "flag '$1' is not legal (for function $element_name (from $file))"
-                        if $flags =~ / ( [^AabCDdEeFfGhiIMmNnTOoPpRrSsUuWXxy] ) /x;
+                        if $flags =~ / ( [^AabCDdEeFfGhiIMmNnTOoPpRrSsUuWXxy;#] ) /x;
 
             die "'u' flag must also have 'm' or 'y' flags' for $element_name"
                                             if $flags =~ /u/ && $flags !~ /[my]/;
             warn ("'$element_name' not \\w+ in '$proto_in_file' in $file")
                         if $flags !~ /N/ && $element_name !~ / ^ [_[:alpha:]] \w* $ /x;
 
+            if ($flags =~ /#/) {
+                die "Return type must be empty for '$element_name'"
+                                                                   if $ret_type;
+                $ret_type = '#ifdef';
+            }
+
             if (exists $seen{$element_name} && $flags !~ /h/) {
                 die ("'$element_name' in $file was already documented in $seen{$element_name}");
             }
@@ -633,21 +639,23 @@ sub autodoc ($$) { # parse a file and extract documentation info
         if ($element_name) {
 
             # Here, we have accumulated into $text, the pod for $element_name
-            my $where = $flags =~ /A/ ? 'api' : 'guts';
+            my $where = $flags =~ /A/ ? 'api' : 'intern';
 
             die "No =for apidoc_section nor =head1 in $file for '$element_name'\n"
                                                     unless defined $section;
-            if (exists $docs{$where}{$section}{$element_name}) {
+            my $is_link_only = ($flags =~ /h/);
+            if (! $is_link_only && exists $docs{$where}{$section}{$element_name}) {
                 warn "$0: duplicate API entry for '$element_name' in"
                     . " $where/$section\n";
                 next;
             }
 
             # Override the text with just a link if the flags call for that
-            my $is_link_only = ($flags =~ /h/);
             if ($is_link_only) {
                 if ($file_is_C) {
-                    die "Can't currently handle link with items to it:\n$in" if @items;
+                    die "Can't currently handle link with items to it:\n$in"
+                                                                       if @items;
+                    $docs{$where}{$section}{X_tags}{$element_name} = $file;
                     redo;    # Don't put anything if C source
                 }
 
@@ -664,7 +672,7 @@ sub autodoc ($$) { # parse a file and extract documentation info
                 # Don't output a usage example for linked to documentation if
                 # it is trivial (has no arguments) and we aren't to add a
                 # semicolon
-                $flags .= 'U' if $flags =~ /n/ && $flags !~ /[Us]/;
+                $flags .= 'U' if $flags =~ /n/ && $flags !~ /[U;]/;
 
                 # Keep track of all the pod files that we refer to.
                 push $described_elsewhere{$podname}->@*, $podname;
@@ -1313,7 +1321,9 @@ sub docout ($$$) { # output the docs for one function group
         if (   ($item_flags =~ /p/ && $item_flags =~ /o/ && $item_flags !~ /M/)
 
                 # Can't handle threaded varargs
-            || ($item_flags =~ /f/ && $item_flags !~ /T/))
+            || (   $item_flags =~ /f/
+                && $item_flags !~ /T/
+                && $item_name !~ /strftime/))
         {
             $item->{name} = "Perl_$item_name";
             print $fh <<~"EOT";
@@ -1328,8 +1338,8 @@ sub docout ($$$) { # output the docs for one function group
 
     if ($flags =~ /[Uy]/) { # no usage; typedefs are considered simple enough
                             # to never warrant a usage line
-        warn("U and s flags are incompatible")
-                                            if $flags =~ /U/ && $flags =~ /s/;
+        warn("U and ; flags are incompatible")
+                                            if $flags =~ /U/ && $flags =~ /;/;
         # nothing
     } else {
 
@@ -1361,11 +1371,12 @@ sub docout ($$$) { # output the docs for one function group
             my @base_args = $items[0]->{args}->@*;
             my $base_thread_context = $items[0]->{flags} =~ /T/;
             for (my $i = 1; $i < @items; $i++) {
-                no warnings 'experimental::smartmatch';
                 my $item = $items[$i];
+                my $args_are_equal = $item->{args}->@* == @base_args
+                  && !grep $item->{args}[$_] ne $base_args[$_], keys @base_args;
                 $need_individual_usage = 1
                                     if    $item->{ret_type} ne $base_ret_type
-                                    || ! ($item->{args}->@* ~~ @base_args)
+                                    || !  $args_are_equal
                                     ||   (   $item->{flags} =~ /T/
                                           != $base_thread_context);
                 my $ret_length = length $item->{ret_type};
@@ -1492,7 +1503,7 @@ sub docout ($$$) { # output the docs for one function group
                     print $fh ")";
                 }
 
-                print $fh ";" if $item_flags =~ /s/; # semicolon: "dTHR;"
+                print $fh ";" if $item_flags =~ /;/; # semicolon: "dTHR;"
                 print $fh "\n";
 
                 # Only the first entry is normally displayed
@@ -1508,44 +1519,14 @@ sub docout ($$$) { # output the docs for one function group
 }
 
 sub construct_missings_section {
-    my ($pod_name, $missings_ref) = @_;
+    my ($missings_hdr, $missings_ref) = @_;
     my $text = "";
 
-    return $text unless $missings_ref->@*;
-
-    $text .= <<~EOT;
-
-        =head1 $undocumented_scn
-
-        EOT
-    if ($pod_name eq 'perlapi') {
-        $text .= <<~'EOT';
-            The following functions have been flagged as part of the public
-            API, but are currently undocumented.  Use them at your own risk,
-            as the interfaces are subject to change.  Functions that are not
-            listed in this document are not intended for public use, and
-            should NOT be used under any circumstances.
-
-            If you feel you need to use one of these functions, first send
-            email to L<perl5-porters@perl.org|mailto:perl5-porters@perl.org>.
-            It may be that there is a good reason for the function not being
-            documented, and it should be removed from this list; or it may
-            just be that no one has gotten around to documenting it.  In the
-            latter case, you will be asked to submit a patch to document the
-            function.  Once your patch is accepted, it will indicate that the
-            interface is stable (unless it is explicitly marked otherwise) and
-            usable by you.
-            EOT
-    }
-    else {
-        $text .= <<~'EOT';
-            The following functions are currently undocumented.  If you use
-            one of them, you may wish to consider creating and submitting
-            documentation for it.
-            EOT
-    }
+    $text .= "$missings_hdr\n" . format_pod_indexes($missings_ref);
 
-    $text .= "\n" . format_pod_indexes($missings_ref);
+    if ($missings_ref->@* == 0) {
+        return $text . "\nThere are currently no items of this type\n";
+    }
 
     # Sort the elements.
     my @missings = sort dictionary_order $missings_ref->@*;
@@ -1654,19 +1635,74 @@ sub construct_missings_section {
 }
 
 sub dictionary_order {
-    # Do a case-insensitive dictionary sort, with only alphabetics
-    # significant, falling back to using everything for determinancy
-    return (uc($a =~ s/[[:^alpha:]]//r) cmp uc($b =~ s/[[:^alpha:]]//r))
-           || uc($a) cmp uc($b)
-           || $a cmp $b;
+    # Do a case-insensitive dictionary sort, falling back in stages to using
+    # everything for determinancy.  The initial comparison ignores
+    # all non-word characters and non-trailing underscores and digits, with
+    # trailing ones collating to after any other characters.  This collation
+    # order continues in case tie breakers are needed; sequences of digits
+    # that do get looked at always compare numerically.  The first tie
+    # breaker takes all digits and underscores into account.  The next tie
+    # breaker uses a caseless character-by-character comparison of everything
+    # (including non-word characters).  Finally is a cased comparison.
+    #
+    # This gives intuitive results, but obviously could be tweaked.
+
+    no warnings 'non_unicode';
+
+    local $a = $a;
+    local $b = $b;
+
+    # Convert all digit sequences to same length with leading zeros, so for
+    # example, 8 will compare less than 16 (using a fill length value that
+    # should be longer than any sequence in the input).
+    $a =~ s/(\d+)/sprintf "%06d", $1/ge;
+    $b =~ s/(\d+)/sprintf "%06d", $1/ge;
+
+    # Translate any underscores and digits so they compare after all Unicode
+    # characters
+    $a =~ tr[_0-9]/\x{110000}-\x{11000A}/;
+    $b =~ tr[_0-9]/\x{110000}-\x{11000A}/;
+
+    use feature 'state';
+    # Modify \w, \W to reflect the changes.
+    state $ud = '\x{110000}-\x{11000A}';    # xlated underscore, digits
+    state $w = "\\w$ud";                    # new \w string
+    state $mod_w = qr/[$w]/;
+    state $mod_W = qr/[^$w]/;
+
+    # Only \w for initial comparison
+    my $a_only_word = uc($a =~ s/$mod_W//gr);
+    my $b_only_word = uc($b =~ s/$mod_W//gr);
+
+    # And not initial nor interior underscores nor digits (by squeezing them
+    # out)
+    my $a_stripped = $a_only_word =~ s/ (*atomic:[$ud]+) (*pla: $mod_w ) //grxx;
+    my $b_stripped = $b_only_word =~ s/ (*atomic:[$ud]+) (*pla: $mod_w ) //grxx;
+
+    # If the stripped versions differ, use that as the comparison.
+    my $cmp = $a_stripped cmp $b_stripped;
+    return $cmp if $cmp;
+
+    # For the first tie breaker, repeat, but consider initial and interior
+    # underscores and digits, again having those compare after all Unicode
+    # characters
+    $cmp = $a_only_word cmp $b_only_word;
+    return $cmp if $cmp;
+
+    # Next tie breaker is just a caseless comparison
+    $cmp = uc($a) cmp uc($b);
+    return $cmp if $cmp;
+
+    # Finally a straight comparison
+    return $a cmp $b;
 }
 
 sub output {
-    my ($podname, $header, $dochash, $missings_ref, $footer) = @_;
+    my ($podname, $header, $dochash, $footer, @missings_refs) = @_;
     #
     # strip leading '|' from each line which had been used to hide
     # pod from pod checkers.
-    s/^\|//gm for $header, $footer;
+    s/^\|//gm for $header, $footer, @missings_refs;
 
     my $fh = open_new("pod/$podname.pod", undef,
                       {by => "$0 extracting documentation",
@@ -1685,6 +1721,12 @@ sub output {
 
         print $fh "\n=head1 $section_name\n";
 
+        if ($section_info->{X_tags}) {
+            print $fh "X<$_>" for sort keys $section_info->{X_tags}->%*;
+            print $fh "\n";
+            delete $section_info->{X_tags};
+        }
+
         if ($podname eq 'perlapi') {
             print $fh "\n", $valid_sections{$section_name}{header}, "\n"
                                 if defined $valid_sections{$section_name}{header};
@@ -1703,7 +1745,9 @@ sub output {
             }
         }
         else {
-            print $fh "\nThere are only public API items currently in $section_name\n";
+            my $pod_type = ($podname eq 'api') ? "public" : "internal";
+            print $fh "\nThere are currently no $pod_type API items in ",
+                      $section_name, "\n";
         }
 
         print $fh "\n", $valid_sections{$section_name}{footer}, "\n"
@@ -1711,7 +1755,23 @@ sub output {
                             && defined $valid_sections{$section_name}{footer};
     }
 
-    print $fh construct_missings_section($podname, $missings_ref);
+
+    my $first_time = 1;
+    while (1) {
+        my $missings_hdr = shift @missings_refs or last;
+        my $missings_ref = shift @missings_refs or die "Foo";
+
+        if ($first_time) {
+            $first_time = 0;
+            print $fh <<~EOT;
+
+                =head1 $undocumented_scn
+
+                EOT
+        }
+
+        print $fh construct_missings_section($missings_hdr, $missings_ref);
+    }
 
     print $fh "\n$footer\n=cut\n";
 
@@ -1719,14 +1779,16 @@ sub output {
 }
 
 foreach (@{(setup_embed())[0]}) {
-    next if @$_ < 2;
-    my ($flags, $ret_type, $func, @args) = @$_;
-    s/\b(?:NN|NULLOK)\b\s+//g for @args;
+    my $embed= $_->{embed}
+        or next;
+    my ($flags, $ret_type, $func, $args) = @{$embed}{qw(flags return_type name args)};
+    my @munged_args= @$args;
+    s/\b(?:NN|NULLOK)\b\s+//g for @munged_args;
 
     $funcflags{$func} = {
                          flags => $flags,
                          ret_type => $ret_type,
-                         args => \@args,
+                         args => \@munged_args,
                         };
 }
 
@@ -1761,11 +1823,27 @@ foreach (sort keys %missing) {
 
 # List of funcs in the public API that aren't also marked as core-only,
 # experimental nor deprecated.
-my @missing_api = grep $funcflags{$_}{flags} =~ /A/
-                    && $funcflags{$_}{flags} !~ /[xD]/
-                    && !$docs{api}{$_}, keys %funcflags;
+
+my @undocumented_api =    grep {        $funcflags{$_}{flags} =~ /A/
+                                   && ! $docs{api}{$_}
+                               } keys %funcflags;
+my @undocumented_intern = grep {        $funcflags{$_}{flags} !~ /[AS]/
+                                   && ! $docs{intern}{$_}
+                               } keys %funcflags;
+my @undocumented_deprecated_api    = grep { $funcflags{$_}{flags} =~ /D/ }
+                                                            @undocumented_api;
+my @undocumented_deprecated_intern = grep { $funcflags{$_}{flags} =~ /D/ }
+                                                           @undocumented_intern;
+my @undocumented_experimental_api    =  grep { $funcflags{$_}{flags} =~ /x/ }
+                                                            @undocumented_api;
+my @undocumented_experimental_intern =  grep { $funcflags{$_}{flags} =~ /x/ }
+                                                           @undocumented_intern;
+my @missing_api = grep { $funcflags{$_}{flags} !~ /[xD]/ } @undocumented_api;
 push @missing_api, keys %missing_macros;
 
+my @missing_intern = grep { $funcflags{$_}{flags} !~ /[xD]/ }
+                                                           @undocumented_intern;
+
 my @other_places = ( qw(perlclib ), keys %described_elsewhere );
 my $places_other_than_intern = join ", ",
             map { "L<$_>" } sort dictionary_order 'perlapi', @other_places;
@@ -1785,7 +1863,9 @@ my $section_list = join "\n\n", map { "=item L</$_>" }
                                 sort(dictionary_order keys %valid_sections),
                                 $undocumented_scn;  # Keep last
 
-output('perlapi', <<"_EOB_", $docs{api}, \@missing_api, <<"_EOE_");
+# Leading '|' is to hide these lines from pod checkers.  khw is unsure if this
+# is still needed.
+my $api_hdr = <<"_EOB_";
 |=encoding UTF-8
 |
 |=head1 NAME
@@ -1826,7 +1906,7 @@ output('perlapi', <<"_EOB_", $docs{api}, \@missing_api, <<"_EOE_");
 |
 |Note that all Perl API global variables must be referenced with the C<PL_>
 |prefix.  Again, those not listed here are not to be used by extension writers,
-|and can be changed or removed without notice; same with macros.
+|and may be changed or removed without notice; same with macros.
 |Some macros are provided for compatibility with the older,
 |unadorned names, but this support may be disabled in a future release.
 |
@@ -1870,6 +1950,8 @@ output('perlapi', <<"_EOB_", $docs{api}, \@missing_api, <<"_EOE_");
 |
 |The listing below is alphabetical, case insensitive.
 _EOB_
+
+my $api_footer = <<"_EOE_";
 |=head1 AUTHORS
 |
 |Until May 1997, this document was maintained by Jeff Okamoto
@@ -1889,11 +1971,45 @@ _EOB_
 |F<config.h>, $places_other_than_api
 _EOE_
 
-# List of non-static internal functions
-my @missing_guts =
- grep $funcflags{$_}{flags} !~ /[AS]/ && !$docs{guts}{$_}, keys %funcflags;
+my $api_missings_hdr = <<'_EOT_';
+|The following functions have been flagged as part of the public
+|API, but are currently undocumented.  Use them at your own risk,
+|as the interfaces are subject to change.  Functions that are not
+|listed in this document are not intended for public use, and
+|should NOT be used under any circumstances.
+|
+|If you feel you need to use one of these functions, first send
+|email to L<perl5-porters@perl.org|mailto:perl5-porters@perl.org>.
+|It may be that there is a good reason for the function not being
+|documented, and it should be removed from this list; or it may
+|just be that no one has gotten around to documenting it.  In the
+|latter case, you will be asked to submit a patch to document the
+|function.  Once your patch is accepted, it will indicate that the
+|interface is stable (unless it is explicitly marked otherwise) and
+|usable by you.
+_EOT_
+
+my $api_experimental_hdr = <<"_EOT_";
+|
+|Next are the API-flagged elements that are considered experimental.  Using one
+|of these is even more risky than plain undocumented ones.  They are listed
+|here because they should be listed somewhere (so their existence doesn't get
+|lost) and this is the best place for them.
+_EOT_
+
+my $api_deprecated_hdr = <<"_EOT_";
+|
+|Finally are deprecated undocumented API elements.
+|Do not use any for new code; remove all occurrences of all of these from
+|existing code.
+_EOT_
+
+output('perlapi', $api_hdr, $docs{api}, $api_footer,
+       $api_missings_hdr, \@missing_api,
+       $api_experimental_hdr, \@undocumented_experimental_api,
+       $api_deprecated_hdr, \@undocumented_deprecated_api);
 
-output('perlintern', <<'_EOB_', $docs{guts}, \@missing_guts, <<"_EOE_");
+my $intern_hdr = <<"_EOB_";
 |=head1 NAME
 |
 |perlintern - autogenerated documentation of purely B<internal>
@@ -1910,6 +2026,8 @@ output('perlintern', <<'_EOB_', $docs{guts}, \@missing_guts, <<"_EOE_");
 |It has the same sections as L<perlapi>, though some may be empty.
 |
 _EOB_
+
+my $intern_footer = <<"_EOE_";
 |
 |=head1 AUTHORS
 |
@@ -1921,3 +2039,33 @@ _EOB_
 |
 |F<config.h>, $places_other_than_intern
 _EOE_
+
+my $intern_missings_hdr = <<"_EOT_";
+|
+|This section lists the elements that are otherwise undocumented.  If you use
+|any of them, please consider creating and submitting documentation for it.
+|
+|Experimental and deprecated undocumented elements are listed separately at the
+|end.
+|
+_EOT_
+
+my $intern_experimental_hdr = <<"_EOT_";
+|
+|Next are the experimental undocumented elements
+|
+_EOT_
+
+my $intern_deprecated_hdr = <<"_EOT_";
+|
+|Finally are the deprecated undocumented elements.
+|Do not use any for new code; remove all occurrences of all of these from
+|existing code.
+|
+_EOT_
+
+output('perlintern', $intern_hdr, $docs{intern}, $intern_footer,
+       $intern_missings_hdr, \@missing_intern,
+       $intern_experimental_hdr, \@undocumented_experimental_intern,
+       $intern_deprecated_hdr, \@undocumented_deprecated_intern
+      );
index c571345..d9868f4 100644 (file)
@@ -103,19 +103,12 @@ Perl_av_extend_guts(pTHX_ AV *av, SSize_t key, SSize_t *maxp, SV ***allocp,
             "panic: av_extend_guts() negative count (%" IVdf ")", (IV)key);
 
     if (key > *maxp) {
-        SSize_t ary_offset = *maxp + 1; /* Start NULL initialization
-                                         * from this element */
-        SSize_t to_null = 0; /* How many elements to Zero */
+        SSize_t ary_offset = *maxp + 1;
+        SSize_t to_null = 0;
         SSize_t newmax  = 0;
 
         if (av && *allocp != *arrayp) { /* a shifted SV* array exists */
-
-            /* to_null will contain the number of elements currently
-             * shifted and about to be unshifted. If the array has not
-             * been shifted to the maximum possible extent, this will be
-             * a smaller number than (*maxp - AvFILLp(av)). */
             to_null = *arrayp - *allocp;
-
             *maxp += to_null;
             ary_offset = AvFILLp(av) + 1;
 
@@ -123,13 +116,6 @@ Perl_av_extend_guts(pTHX_ AV *av, SSize_t key, SSize_t *maxp, SV ***allocp,
 
             if (key > *maxp - 10) {
                 newmax = key + *maxp;
-
-                /* Zero everything above AvFILLp(av), which could be more
-                 * elements than have actually been shifted. If we don't
-                 * do this, trailing elements at the end of the resized
-                 * array may not be correctly initialized. */
-                to_null = *maxp - AvFILLp(av);
-
                 goto resize;
             }
         } else if (*allocp) { /* a full SV* array exists */
@@ -181,9 +167,7 @@ Perl_av_extend_guts(pTHX_ AV *av, SSize_t key, SSize_t *maxp, SV ***allocp,
 #ifdef Perl_safesysmalloc_size
           resized:
 #endif
-            to_null += newmax - *maxp; /* Initialize all new elements
-                                        * (newmax - *maxp) in addition to
-                                        * any previously specified */
+            to_null += newmax - *maxp;
             *maxp = newmax;
 
             /* See GH#18014 for discussion of when this might be needed: */
@@ -193,7 +177,8 @@ Perl_av_extend_guts(pTHX_ AV *av, SSize_t key, SSize_t *maxp, SV ***allocp,
                 PL_stack_max = PL_stack_base + newmax;
             }
         } else { /* there is no SV* array yet */
-            *maxp = key < 3 ? 3 : key;
+            *maxp = key < PERL_ARRAY_NEW_MIN_KEY ?
+                          PERL_ARRAY_NEW_MIN_KEY : key;
             {
                 /* see comment above about newmax+1*/
                 MEM_WRAP_CHECK_s(*maxp, SV*,
@@ -209,7 +194,7 @@ Perl_av_extend_guts(pTHX_ AV *av, SSize_t key, SSize_t *maxp, SV ***allocp,
              * don't get any special treatment here.
              * See https://github.com/Perl/perl5/pull/18690 for more detail */
             ary_offset = 0;
-            to_null = *maxp+1; /* Initialize all new array elements */
+            to_null = *maxp+1;
             goto zero;
         }
 
@@ -302,11 +287,11 @@ Perl_av_fetch(pTHX_ AV *av, SSize_t key, I32 lval)
     if ((Size_t)key >= (Size_t)size) {
         if (UNLIKELY(neg))
             return NULL;
-        goto emptyness;
+        goto emptiness;
     }
 
     if (!AvARRAY(av)[key]) {
-      emptyness:
+      emptiness:
         return lval ? av_store(av,key,newSV_type(SVt_NULL)) : NULL;
     }
 
@@ -388,10 +373,47 @@ Perl_av_store(pTHX_ AV *av, SSize_t key, SV *val)
     }
     else if (AvREAL(av))
         SvREFCNT_dec(ary[key]);
+
+    /* store the val into the AV before we call magic so that the magic can
+     * "see" the new value. Especially set magic on the AV itself. */
     ary[key] = val;
+
     if (SvSMAGICAL(av)) {
         const MAGIC *mg = SvMAGIC(av);
         bool set = TRUE;
+        /* We have to increment the refcount on val before we call any magic,
+         * as it is now stored in the AV (just before this block), we will
+         * then call the magic handlers which might die/Perl_croak, and
+         * longjmp up the stack to the most recent exception trap. Which means
+         * the caller code that would be expected to handle the refcount
+         * increment likely would never be executed, leading to a double free.
+         * This can happen in a case like
+         *
+         * @ary = (1);
+         *
+         * or this:
+         *
+         * if (av_store(av,n,sv)) SvREFCNT_inc(sv);
+         *
+         * where @ary/av has set magic applied to it which can die. In the
+         * first case the sv representing 1 would be mortalized, so when the
+         * set magic threw an exception it would be freed as part of the
+         * normal stack unwind. However this leaves the av structure still
+         * holding a valid visible pointer to the now freed value. In practice
+         * the next SV created will reuse the same reference, but without the
+         * refcount to account for the previous ownership and we end up with
+         * warnings about a totally different variable being double freed in
+         * the form of "attempt to free unreferenced variable"
+         * warnings/errors.
+         *
+         * https://github.com/Perl/perl5/issues/20675
+         *
+         * Arguably the API for av_store is broken in the face of magic. Instead
+         * av_store should be responsible for the refcount increment, and only
+         * not do it when specifically told to do so (eg, when storing an
+         * otherwise unreferenced scalar into an AV).
+         */
+        SvREFCNT_inc(val);  /* see comment above */
         for (; mg; mg = mg->mg_moremagic) {
           if (!isUPPER(mg->mg_type)) continue;
           if (val) {
@@ -404,52 +426,14 @@ Perl_av_store(pTHX_ AV *av, SSize_t key, SV *val)
         }
         if (set)
            mg_set(MUTABLE_SV(av));
+        /* And now we are done the magic, we have to decrement it back as the av_store() api
+         * says the caller is responsible for the refcount increment, assuming
+         * av_store returns true. */
+        SvREFCNT_dec(val);
     }
     return &ary[key];
 }
 
-/*
-=for apidoc av_new_alloc
-
-This implements L<perlapi/C<newAV_alloc_x>>
-and L<perlapi/C<newAV_alloc_xz>>, which are the public API for this
-functionality.
-
-Creates a new AV and allocates its SV* array.
-
-This is similar to, but more efficient than doing:
-
-    AV *av = newAV();
-    av_extend(av, key);
-
-The size parameter is used to pre-allocate a SV* array large enough to
-hold at least elements C<0..(size-1)>.  C<size> must be at least 1.
-
-The C<zeroflag> parameter controls whether or not the array is NULL
-initialized.
-
-=cut
-*/
-
-AV *
-Perl_av_new_alloc(pTHX_ SSize_t size, bool zeroflag)
-{
-    AV * const av = newAV();
-    SV** ary;
-    PERL_ARGS_ASSERT_AV_NEW_ALLOC;
-    assert(size > 0);
-
-    Newx(ary, size, SV*); /* Newx performs the memwrap check */
-    AvALLOC(av) = ary;
-    AvARRAY(av) = ary;
-    AvMAX(av) = size - 1;
-
-    if (zeroflag)
-        Zero(ary, size, SV*);
-
-    return av;
-}
-
 /*
 =for apidoc av_make
 
@@ -507,6 +491,113 @@ Perl_av_make(pTHX_ SSize_t size, SV **strp)
     return av;
 }
 
+/*
+=for apidoc newAVav
+
+Creates a new AV and populates it with values copied from an existing AV.  The
+new AV will have a reference count of 1, and will contain newly created SVs
+copied from the original SV.  The original source will remain unchanged.
+
+Perl equivalent: C<my @new_array = @existing_array;>
+
+=cut
+*/
+
+AV *
+Perl_newAVav(pTHX_ AV *oav)
+{
+    PERL_ARGS_ASSERT_NEWAVAV;
+
+    Size_t count = av_count(oav);
+
+    if(UNLIKELY(!oav) || count == 0)
+        return newAV();
+
+    AV *ret = newAV_alloc_x(count);
+
+    /* avoid ret being leaked if croak when calling magic below */
+    EXTEND_MORTAL(1);
+    PL_tmps_stack[++PL_tmps_ix] = (SV *)ret;
+    SSize_t ret_at_tmps_ix = PL_tmps_ix;
+
+    Size_t i;
+    if(LIKELY(!SvRMAGICAL(oav) && AvREAL(oav) && (SvTYPE(oav) == SVt_PVAV))) {
+        for(i = 0; i < count; i++) {
+            SV **svp = av_fetch_simple(oav, i, 0);
+            av_push_simple(ret, svp ? newSVsv(*svp) : &PL_sv_undef);
+        }
+    } else {
+        for(i = 0; i < count; i++) {
+            SV **svp = av_fetch(oav, i, 0);
+            av_push_simple(ret, svp ? newSVsv(*svp) : &PL_sv_undef);
+        }
+    }
+
+    /* disarm leak guard */
+    if(LIKELY(PL_tmps_ix == ret_at_tmps_ix))
+        PL_tmps_ix--;
+    else
+        PL_tmps_stack[ret_at_tmps_ix] = &PL_sv_undef;
+
+    return ret;
+}
+
+/*
+=for apidoc newAVhv
+
+Creates a new AV and populates it with keys and values copied from an existing
+HV.  The new AV will have a reference count of 1, and will contain newly
+created SVs copied from the original HV.  The original source will remain
+unchanged.
+
+Perl equivalent: C<my @new_array = %existing_hash;>
+
+=cut
+*/
+
+AV *
+Perl_newAVhv(pTHX_ HV *ohv)
+{
+    PERL_ARGS_ASSERT_NEWAVHV;
+
+    if(UNLIKELY(!ohv))
+        return newAV();
+
+    bool tied = SvRMAGICAL(ohv) && mg_find(MUTABLE_SV(ohv), PERL_MAGIC_tied);
+
+    Size_t nkeys = hv_iterinit(ohv);
+    /* This number isn't perfect but it doesn't matter; it only has to be
+     * close to make the initial allocation about the right size
+     */
+    AV *ret = newAV_alloc_xz(nkeys ? nkeys * 2 : 2);
+
+    /* avoid ret being leaked if croak when calling magic below */
+    EXTEND_MORTAL(1);
+    PL_tmps_stack[++PL_tmps_ix] = (SV *)ret;
+    SSize_t ret_at_tmps_ix = PL_tmps_ix;
+
+
+    HE *he;
+    while((he = hv_iternext(ohv))) {
+        if(tied) {
+            av_push_simple(ret, newSVsv(hv_iterkeysv(he)));
+            av_push_simple(ret, newSVsv(hv_iterval(ohv, he)));
+        }
+        else {
+            av_push_simple(ret, newSVhek(HeKEY_hek(he)));
+            av_push_simple(ret, HeVAL(he) ? newSVsv(HeVAL(he)) : &PL_sv_undef);
+        }
+    }
+
+    /* disarm leak guard */
+    if(LIKELY(PL_tmps_ix == ret_at_tmps_ix))
+        PL_tmps_ix--;
+    else
+        PL_tmps_stack[ret_at_tmps_ix] = &PL_sv_undef;
+
+    return ret;
+}
+
 /*
 =for apidoc av_clear
 
@@ -605,7 +696,7 @@ void
 Perl_av_undef(pTHX_ AV *av)
 {
     bool real;
-    SSize_t orig_ix = PL_tmps_ix; /* silence bogus warning about possible unitialized use */
+    SSize_t orig_ix = PL_tmps_ix; /* silence bogus warning about possible uninitialized use */
 
     PERL_ARGS_ASSERT_AV_UNDEF;
     assert(SvTYPE(av) == SVt_PVAV);
index 3d11877..6dc7d9c 100644 (file)
@@ -121,7 +121,7 @@ Perl_set_caret_X(pTHX) {
        returning the text "unknown" from the readlink rather than the path
        to the executable (or returning an error from the readlink). Any
        valid path has a '/' in it somewhere, so use that to validate the
-       result. See http://www.freebsd.org/cgi/query-pr.cgi?pr=35703
+       result. See https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=35703
     */
     if (len > 0 && memchr(buf, '/', len)) {
         sv_setpvn(caret_x, buf, len);
index 443f5fc..d38e0a0 100644 (file)
@@ -379,6 +379,19 @@ esac
 ;;
 esac
 
+# gcc version 12 and 13 are overly aggressive with use-after-free warnings
+# and have false positives on code that shouldn't warn, and they haven't
+# sorted it out yet. See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108115
+case "$gccversion" in
+"1"[23]*)
+    for f in -Wno-use-after-free
+    do
+        echo "cflags.SH: Adding $f because of false positives in gccversion '$gccversion'"
+        warn="$warn $f"
+    done
+;;
+esac
+
 echo "cflags.SH: cc       = $cc"
 echo "cflags.SH: ccflags  = $ccflags"
 echo "cflags.SH: stdflags = $stdflags"
index 2aa27f3..209681a 100644 (file)
@@ -1,4 +1,4 @@
-/* -*- buffer-read-only: t -*-
+/* -*- mode: C; buffer-read-only: t -*-
  * !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!!
  * This file is built by regen/mk_invlists.pl from Unicode::UCD.
  * Any changes made here will be lost!
  * encompassing all of the Unicode BMP, and thus including all the economically
  * important world scripts.  At 12 most of them are: including Arabic,
  * Cyrillic, Greek, Hebrew, Indian subcontinent, Latin, and Thai; but not Han,
- * Japanese, nor Korean.  (The regarglen structure in regnodes.h is a U8, and
- * the trie types TRIEC and AHOCORASICKC are larger than U8 for shift values
- * above 12.)  Be sure to benchmark before changing, as larger sizes do
- * significantly slow down the test suite */
+ * Japanese, nor Korean.  The regnode sizing data structure in regnodes.h currently
+ * uses a U8, and the trie types TRIEC and AHOCORASICKC are larger than U8 for
+ * shift values above 12.)  Be sure to benchmark before changing, as larger sizes
+ * do significantly slow down the test suite. */
 
 #define NUM_ANYOF_CODE_POINTS   (1 << 8)
 
@@ -18460,7 +18460,7 @@ static const I32 Lowercase_Mapping_invmap[] = {  /* for EBCDIC 037 */
 #if (defined(PERL_IN_REGCOMP_C) && ! defined(PERL_IN_XSUB_RE))
 
 static const UV _Perl_CCC_non0_non230_invlist[] = {  /* for all charsets */
-       373,    /* Number of elements */
+       379,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -18749,6 +18749,8 @@ static const UV _Perl_CCC_non0_non230_invlist[] = {  /* for all charsets */
        0x10A40,
        0x10AE6,
        0x10AE7,
+       0x10EFD,
+       0x10F00,
        0x10F46,
        0x10F48,
        0x10F4B,
@@ -18819,6 +18821,8 @@ static const UV _Perl_CCC_non0_non230_invlist[] = {  /* for all charsets */
        0x11D46,
        0x11D97,
        0x11D98,
+       0x11F41,
+       0x11F43,
        0x16AF0,
        0x16AF5,
        0x16FF0,
@@ -18833,6 +18837,8 @@ static const UV _Perl_CCC_non0_non230_invlist[] = {  /* for all charsets */
        0x1D183,
        0x1D18A,
        0x1D18C,
+       0x1E4EC,
+       0x1E4EF,
        0x1E8D0,
        0x1E8D7,
        0x1E94A,
@@ -18842,7 +18848,7 @@ static const UV _Perl_CCC_non0_non230_invlist[] = {  /* for all charsets */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV _Perl_GCB_invlist[] = {  /* for ASCII/Latin1 */
-       1826,   /* Number of elements */
+       1851,   /* Number of elements */
        148565664, /* Version and data structure type */
        0,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -19063,6 +19069,8 @@ static const UV _Perl_GCB_invlist[] = {  /* for ASCII/Latin1 */
        0xCD7,
        0xCE2,
        0xCE4,
+       0xCF3,
+       0xCF4,
        0xD00,
        0xD02,
        0xD04,
@@ -19111,7 +19119,7 @@ static const UV _Perl_GCB_invlist[] = {  /* for ASCII/Latin1 */
        0xEB4,
        0xEBD,
        0xEC8,
-       0xECE,
+       0xECF,
        0xF18,
        0xF1A,
        0xF35,
@@ -20314,6 +20322,8 @@ static const UV _Perl_GCB_invlist[] = {  /* for ASCII/Latin1 */
        0x10D28,
        0x10EAB,
        0x10EAD,
+       0x10EFD,
+       0x10F00,
        0x10F46,
        0x10F51,
        0x10F82,
@@ -20375,6 +20385,8 @@ static const UV _Perl_GCB_invlist[] = {  /* for ASCII/Latin1 */
        0x11238,
        0x1123E,
        0x1123F,
+       0x11241,
+       0x11242,
        0x112DF,
        0x112E0,
        0x112E3,
@@ -20538,8 +20550,23 @@ static const UV _Perl_GCB_invlist[] = {  /* for ASCII/Latin1 */
        0x11EF3,
        0x11EF5,
        0x11EF7,
+       0x11F00,
+       0x11F02,
+       0x11F03,
+       0x11F04,
+       0x11F34,
+       0x11F36,
+       0x11F3B,
+       0x11F3E,
+       0x11F40,
+       0x11F41,
+       0x11F42,
+       0x11F43,
        0x13430,
-       0x13439,
+       0x13440,
+       0x13441,
+       0x13447,
+       0x13456,
        0x16AF0,
        0x16AF5,
        0x16B30,
@@ -20599,12 +20626,16 @@ static const UV _Perl_GCB_invlist[] = {  /* for ASCII/Latin1 */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E08F,
+       0x1E090,
        0x1E130,
        0x1E137,
        0x1E2AE,
        0x1E2AF,
        0x1E2EC,
        0x1E2F0,
+       0x1E4EC,
+       0x1E4F0,
        0x1E8D0,
        0x1E8D7,
        0x1E944,
@@ -20923,6 +20954,8 @@ static const GCB_enum _Perl_GCB_invmap[] = {  /* for ASCII/Latin1 */
        GCB_Other,
        GCB_Extend,
        GCB_Other,
+       GCB_SpacingMark,
+       GCB_Other,
        GCB_Extend,
        GCB_SpacingMark,
        GCB_Other,
@@ -22178,6 +22211,8 @@ static const GCB_enum _Perl_GCB_invmap[] = {  /* for ASCII/Latin1 */
        GCB_Other,
        GCB_Extend,
        GCB_Other,
+       GCB_Extend,
+       GCB_Other,
        GCB_SpacingMark,
        GCB_Extend,
        GCB_SpacingMark,
@@ -22236,6 +22271,8 @@ static const GCB_enum _Perl_GCB_invmap[] = {  /* for ASCII/Latin1 */
        GCB_Extend,
        GCB_Other,
        GCB_Extend,
+       GCB_Other,
+       GCB_Extend,
        GCB_SpacingMark,
        GCB_Extend,
        GCB_Other,
@@ -22398,7 +22435,22 @@ static const GCB_enum _Perl_GCB_invmap[] = {  /* for ASCII/Latin1 */
        GCB_Extend,
        GCB_SpacingMark,
        GCB_Other,
+       GCB_Extend,
+       GCB_Prepend,
+       GCB_SpacingMark,
+       GCB_Other,
+       GCB_SpacingMark,
+       GCB_Extend,
+       GCB_Other,
+       GCB_SpacingMark,
+       GCB_Extend,
+       GCB_SpacingMark,
+       GCB_Extend,
+       GCB_Other,
        GCB_Control,
+       GCB_Extend,
+       GCB_Other,
+       GCB_Extend,
        GCB_Other,
        GCB_Extend,
        GCB_Other,
@@ -22469,6 +22521,10 @@ static const GCB_enum _Perl_GCB_invmap[] = {  /* for ASCII/Latin1 */
        GCB_Other,
        GCB_Extend,
        GCB_Other,
+       GCB_Extend,
+       GCB_Other,
+       GCB_Extend,
+       GCB_Other,
        GCB_ExtPict_XX,
        GCB_Other,
        GCB_ExtPict_XX,
@@ -22546,7 +22602,7 @@ static const GCB_enum _Perl_GCB_invmap[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV _Perl_GCB_invlist[] = {  /* for EBCDIC 1047 */
-       1827,   /* Number of elements */
+       1852,   /* Number of elements */
        148565664, /* Version and data structure type */
        0,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -22768,6 +22824,8 @@ static const UV _Perl_GCB_invlist[] = {  /* for EBCDIC 1047 */
        0xCD7,
        0xCE2,
        0xCE4,
+       0xCF3,
+       0xCF4,
        0xD00,
        0xD02,
        0xD04,
@@ -22816,7 +22874,7 @@ static const UV _Perl_GCB_invlist[] = {  /* for EBCDIC 1047 */
        0xEB4,
        0xEBD,
        0xEC8,
-       0xECE,
+       0xECF,
        0xF18,
        0xF1A,
        0xF35,
@@ -24019,6 +24077,8 @@ static const UV _Perl_GCB_invlist[] = {  /* for EBCDIC 1047 */
        0x10D28,
        0x10EAB,
        0x10EAD,
+       0x10EFD,
+       0x10F00,
        0x10F46,
        0x10F51,
        0x10F82,
@@ -24080,6 +24140,8 @@ static const UV _Perl_GCB_invlist[] = {  /* for EBCDIC 1047 */
        0x11238,
        0x1123E,
        0x1123F,
+       0x11241,
+       0x11242,
        0x112DF,
        0x112E0,
        0x112E3,
@@ -24243,8 +24305,23 @@ static const UV _Perl_GCB_invlist[] = {  /* for EBCDIC 1047 */
        0x11EF3,
        0x11EF5,
        0x11EF7,
+       0x11F00,
+       0x11F02,
+       0x11F03,
+       0x11F04,
+       0x11F34,
+       0x11F36,
+       0x11F3B,
+       0x11F3E,
+       0x11F40,
+       0x11F41,
+       0x11F42,
+       0x11F43,
        0x13430,
-       0x13439,
+       0x13440,
+       0x13441,
+       0x13447,
+       0x13456,
        0x16AF0,
        0x16AF5,
        0x16B30,
@@ -24304,12 +24381,16 @@ static const UV _Perl_GCB_invlist[] = {  /* for EBCDIC 1047 */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E08F,
+       0x1E090,
        0x1E130,
        0x1E137,
        0x1E2AE,
        0x1E2AF,
        0x1E2EC,
        0x1E2F0,
+       0x1E4EC,
+       0x1E4F0,
        0x1E8D0,
        0x1E8D7,
        0x1E944,
@@ -24632,6 +24713,8 @@ static const GCB_enum _Perl_GCB_invmap[] = {  /* for EBCDIC 1047 */
        GCB_Other,
        GCB_Extend,
        GCB_Other,
+       GCB_SpacingMark,
+       GCB_Other,
        GCB_Extend,
        GCB_SpacingMark,
        GCB_Other,
@@ -25887,6 +25970,8 @@ static const GCB_enum _Perl_GCB_invmap[] = {  /* for EBCDIC 1047 */
        GCB_Other,
        GCB_Extend,
        GCB_Other,
+       GCB_Extend,
+       GCB_Other,
        GCB_SpacingMark,
        GCB_Extend,
        GCB_SpacingMark,
@@ -25945,6 +26030,8 @@ static const GCB_enum _Perl_GCB_invmap[] = {  /* for EBCDIC 1047 */
        GCB_Extend,
        GCB_Other,
        GCB_Extend,
+       GCB_Other,
+       GCB_Extend,
        GCB_SpacingMark,
        GCB_Extend,
        GCB_Other,
@@ -26107,7 +26194,22 @@ static const GCB_enum _Perl_GCB_invmap[] = {  /* for EBCDIC 1047 */
        GCB_Extend,
        GCB_SpacingMark,
        GCB_Other,
+       GCB_Extend,
+       GCB_Prepend,
+       GCB_SpacingMark,
+       GCB_Other,
+       GCB_SpacingMark,
+       GCB_Extend,
+       GCB_Other,
+       GCB_SpacingMark,
+       GCB_Extend,
+       GCB_SpacingMark,
+       GCB_Extend,
+       GCB_Other,
        GCB_Control,
+       GCB_Extend,
+       GCB_Other,
+       GCB_Extend,
        GCB_Other,
        GCB_Extend,
        GCB_Other,
@@ -26178,6 +26280,10 @@ static const GCB_enum _Perl_GCB_invmap[] = {  /* for EBCDIC 1047 */
        GCB_Other,
        GCB_Extend,
        GCB_Other,
+       GCB_Extend,
+       GCB_Other,
+       GCB_Extend,
+       GCB_Other,
        GCB_ExtPict_XX,
        GCB_Other,
        GCB_ExtPict_XX,
@@ -26255,7 +26361,7 @@ static const GCB_enum _Perl_GCB_invmap[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV _Perl_GCB_invlist[] = {  /* for EBCDIC 037 */
-       1827,   /* Number of elements */
+       1852,   /* Number of elements */
        148565664, /* Version and data structure type */
        0,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -26477,6 +26583,8 @@ static const UV _Perl_GCB_invlist[] = {  /* for EBCDIC 037 */
        0xCD7,
        0xCE2,
        0xCE4,
+       0xCF3,
+       0xCF4,
        0xD00,
        0xD02,
        0xD04,
@@ -26525,7 +26633,7 @@ static const UV _Perl_GCB_invlist[] = {  /* for EBCDIC 037 */
        0xEB4,
        0xEBD,
        0xEC8,
-       0xECE,
+       0xECF,
        0xF18,
        0xF1A,
        0xF35,
@@ -27728,6 +27836,8 @@ static const UV _Perl_GCB_invlist[] = {  /* for EBCDIC 037 */
        0x10D28,
        0x10EAB,
        0x10EAD,
+       0x10EFD,
+       0x10F00,
        0x10F46,
        0x10F51,
        0x10F82,
@@ -27789,6 +27899,8 @@ static const UV _Perl_GCB_invlist[] = {  /* for EBCDIC 037 */
        0x11238,
        0x1123E,
        0x1123F,
+       0x11241,
+       0x11242,
        0x112DF,
        0x112E0,
        0x112E3,
@@ -27952,8 +28064,23 @@ static const UV _Perl_GCB_invlist[] = {  /* for EBCDIC 037 */
        0x11EF3,
        0x11EF5,
        0x11EF7,
+       0x11F00,
+       0x11F02,
+       0x11F03,
+       0x11F04,
+       0x11F34,
+       0x11F36,
+       0x11F3B,
+       0x11F3E,
+       0x11F40,
+       0x11F41,
+       0x11F42,
+       0x11F43,
        0x13430,
-       0x13439,
+       0x13440,
+       0x13441,
+       0x13447,
+       0x13456,
        0x16AF0,
        0x16AF5,
        0x16B30,
@@ -28013,12 +28140,16 @@ static const UV _Perl_GCB_invlist[] = {  /* for EBCDIC 037 */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E08F,
+       0x1E090,
        0x1E130,
        0x1E137,
        0x1E2AE,
        0x1E2AF,
        0x1E2EC,
        0x1E2F0,
+       0x1E4EC,
+       0x1E4F0,
        0x1E8D0,
        0x1E8D7,
        0x1E944,
@@ -28341,6 +28472,8 @@ static const GCB_enum _Perl_GCB_invmap[] = {  /* for EBCDIC 037 */
        GCB_Other,
        GCB_Extend,
        GCB_Other,
+       GCB_SpacingMark,
+       GCB_Other,
        GCB_Extend,
        GCB_SpacingMark,
        GCB_Other,
@@ -29596,6 +29729,8 @@ static const GCB_enum _Perl_GCB_invmap[] = {  /* for EBCDIC 037 */
        GCB_Other,
        GCB_Extend,
        GCB_Other,
+       GCB_Extend,
+       GCB_Other,
        GCB_SpacingMark,
        GCB_Extend,
        GCB_SpacingMark,
@@ -29654,6 +29789,8 @@ static const GCB_enum _Perl_GCB_invmap[] = {  /* for EBCDIC 037 */
        GCB_Extend,
        GCB_Other,
        GCB_Extend,
+       GCB_Other,
+       GCB_Extend,
        GCB_SpacingMark,
        GCB_Extend,
        GCB_Other,
@@ -29816,7 +29953,22 @@ static const GCB_enum _Perl_GCB_invmap[] = {  /* for EBCDIC 037 */
        GCB_Extend,
        GCB_SpacingMark,
        GCB_Other,
+       GCB_Extend,
+       GCB_Prepend,
+       GCB_SpacingMark,
+       GCB_Other,
+       GCB_SpacingMark,
+       GCB_Extend,
+       GCB_Other,
+       GCB_SpacingMark,
+       GCB_Extend,
+       GCB_SpacingMark,
+       GCB_Extend,
+       GCB_Other,
        GCB_Control,
+       GCB_Extend,
+       GCB_Other,
+       GCB_Extend,
        GCB_Other,
        GCB_Extend,
        GCB_Other,
@@ -29887,6 +30039,10 @@ static const GCB_enum _Perl_GCB_invmap[] = {  /* for EBCDIC 037 */
        GCB_Other,
        GCB_Extend,
        GCB_Other,
+       GCB_Extend,
+       GCB_Other,
+       GCB_Extend,
+       GCB_Other,
        GCB_ExtPict_XX,
        GCB_Other,
        GCB_ExtPict_XX,
@@ -38855,7 +39011,7 @@ static const I32 _Perl_IVCF_invmap[] = {  /* for EBCDIC 037 */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV _Perl_LB_invlist[] = {  /* for ASCII/Latin1 */
-       2501,   /* Number of elements */
+       2539,   /* Number of elements */
        148565664, /* Version and data structure type */
        0,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -39143,6 +39299,8 @@ static const UV _Perl_LB_invlist[] = {  /* for ASCII/Latin1 */
        0xCE4,
        0xCE6,
        0xCF0,
+       0xCF3,
+       0xCF4,
        0xD00,
        0xD04,
        0xD3B,
@@ -39191,7 +39349,7 @@ static const UV _Perl_LB_invlist[] = {  /* for ASCII/Latin1 */
        0xEB4,
        0xEBD,
        0xEC8,
-       0xECE,
+       0xECF,
        0xED0,
        0xEDA,
        0xF01,
@@ -39380,6 +39538,10 @@ static const UV _Perl_LB_invlist[] = {  /* for ASCII/Latin1 */
        0x1CF7,
        0x1CFA,
        0x1DC0,
+       0x1DCD,
+       0x1DCE,
+       0x1DFC,
+       0x1DFD,
        0x1E00,
        0x1FFD,
        0x1FFE,
@@ -40820,6 +40982,8 @@ static const UV _Perl_LB_invlist[] = {  /* for ASCII/Latin1 */
        0x10EAB,
        0x10EAD,
        0x10EAE,
+       0x10EFD,
+       0x10F00,
        0x10F46,
        0x10F51,
        0x10F82,
@@ -40879,6 +41043,8 @@ static const UV _Perl_LB_invlist[] = {  /* for ASCII/Latin1 */
        0x1123D,
        0x1123E,
        0x1123F,
+       0x11241,
+       0x11242,
        0x112A9,
        0x112AA,
        0x112DF,
@@ -40989,6 +41155,8 @@ static const UV _Perl_LB_invlist[] = {  /* for ASCII/Latin1 */
        0x11A9E,
        0x11AA1,
        0x11AA3,
+       0x11B00,
+       0x11B0A,
        0x11C2F,
        0x11C37,
        0x11C38,
@@ -41026,6 +41194,17 @@ static const UV _Perl_LB_invlist[] = {  /* for ASCII/Latin1 */
        0x11DAA,
        0x11EF3,
        0x11EF7,
+       0x11F00,
+       0x11F02,
+       0x11F03,
+       0x11F04,
+       0x11F34,
+       0x11F3B,
+       0x11F3E,
+       0x11F43,
+       0x11F45,
+       0x11F50,
+       0x11F5A,
        0x11FDD,
        0x11FE1,
        0x11FFF,
@@ -41049,6 +41228,14 @@ static const UV _Perl_LB_invlist[] = {  /* for ASCII/Latin1 */
        0x13437,
        0x13438,
        0x13439,
+       0x1343C,
+       0x1343D,
+       0x1343E,
+       0x1343F,
+       0x13440,
+       0x13441,
+       0x13447,
+       0x13456,
        0x145CE,
        0x145CF,
        0x145D0,
@@ -41089,8 +41276,12 @@ static const UV _Perl_LB_invlist[] = {  /* for ASCII/Latin1 */
        0x18D09,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -41139,6 +41330,8 @@ static const UV _Perl_LB_invlist[] = {  /* for ASCII/Latin1 */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E08F,
+       0x1E090,
        0x1E130,
        0x1E137,
        0x1E140,
@@ -41150,6 +41343,9 @@ static const UV _Perl_LB_invlist[] = {  /* for ASCII/Latin1 */
        0x1E2FA,
        0x1E2FF,
        0x1E300,
+       0x1E4EC,
+       0x1E4F0,
+       0x1E4FA,
        0x1E8D0,
        0x1E8D7,
        0x1E944,
@@ -41272,15 +41468,17 @@ static const UV _Perl_LB_invlist[] = {  /* for ASCII/Latin1 */
        0x1F6CC,
        0x1F6CD,
        0x1F6D8,
-       0x1F6DD,
+       0x1F6DC,
        0x1F6ED,
        0x1F6F0,
        0x1F6FD,
        0x1F700,
        0x1F774,
+       0x1F777,
+       0x1F77B,
        0x1F780,
        0x1F7D5,
-       0x1F7D9,
+       0x1F7DA,
        0x1F7E0,
        0x1F7EC,
        0x1F7F0,
@@ -41327,24 +41525,20 @@ static const UV _Perl_LB_invlist[] = {  /* for ASCII/Latin1 */
        0x1FA60,
        0x1FA6E,
        0x1FA70,
-       0x1FA75,
-       0x1FA78,
        0x1FA7D,
        0x1FA80,
-       0x1FA87,
+       0x1FA89,
        0x1FA90,
-       0x1FAAD,
-       0x1FAB0,
-       0x1FABB,
-       0x1FAC0,
+       0x1FABE,
+       0x1FABF,
        0x1FAC3,
        0x1FAC6,
-       0x1FAD0,
-       0x1FADA,
+       0x1FACE,
+       0x1FADC,
        0x1FAE0,
-       0x1FAE8,
+       0x1FAE9,
        0x1FAF0,
-       0x1FAF7,
+       0x1FAF9,
        0x1FB00,
        0x1FBF0,
        0x1FBFA,
@@ -41714,6 +41908,8 @@ static const LB_enum _Perl_LB_invmap[] = {  /* for ASCII/Latin1 */
        LB_Alphabetic,
        LB_Combining_Mark,
        LB_Alphabetic,
+       LB_Combining_Mark,
+       LB_Alphabetic,
        LB_Numeric,
        LB_Alphabetic,
        LB_Postfix_Numeric,
@@ -41937,6 +42133,10 @@ static const LB_enum _Perl_LB_invmap[] = {  /* for ASCII/Latin1 */
        LB_Combining_Mark,
        LB_Alphabetic,
        LB_Combining_Mark,
+       LB_Glue,
+       LB_Combining_Mark,
+       LB_Glue,
+       LB_Combining_Mark,
        LB_Alphabetic,
        LB_Break_Before,
        LB_Alphabetic,
@@ -41975,7 +42175,7 @@ static const LB_enum _Perl_LB_invmap[] = {  /* for ASCII/Latin1 */
        LB_Nonstarter,
        LB_Alphabetic,
        LB_Break_After,
-       LB_Alphabetic,
+       LB_Postfix_Numeric,
        LB_Break_After,
        LB_Alphabetic,
        LB_Break_After,
@@ -43384,6 +43584,8 @@ static const LB_enum _Perl_LB_invmap[] = {  /* for ASCII/Latin1 */
        LB_Combining_Mark,
        LB_Alphabetic,
        LB_Combining_Mark,
+       LB_Alphabetic,
+       LB_Combining_Mark,
        LB_Break_After,
        LB_Alphabetic,
        LB_Numeric,
@@ -43436,6 +43638,8 @@ static const LB_enum _Perl_LB_invmap[] = {  /* for ASCII/Latin1 */
        LB_Alphabetic,
        LB_Combining_Mark,
        LB_Alphabetic,
+       LB_Combining_Mark,
+       LB_Alphabetic,
        LB_Break_After,
        LB_Alphabetic,
        LB_Combining_Mark,
@@ -43546,6 +43750,8 @@ static const LB_enum _Perl_LB_invmap[] = {  /* for ASCII/Latin1 */
        LB_Break_Before,
        LB_Break_After,
        LB_Alphabetic,
+       LB_Break_Before,
+       LB_Alphabetic,
        LB_Combining_Mark,
        LB_Alphabetic,
        LB_Combining_Mark,
@@ -43583,6 +43789,17 @@ static const LB_enum _Perl_LB_invmap[] = {  /* for ASCII/Latin1 */
        LB_Alphabetic,
        LB_Combining_Mark,
        LB_Alphabetic,
+       LB_Combining_Mark,
+       LB_Alphabetic,
+       LB_Combining_Mark,
+       LB_Alphabetic,
+       LB_Combining_Mark,
+       LB_Alphabetic,
+       LB_Combining_Mark,
+       LB_Break_After,
+       LB_Ideographic,
+       LB_Numeric,
+       LB_Alphabetic,
        LB_Postfix_Numeric,
        LB_Alphabetic,
        LB_Break_After,
@@ -43605,6 +43822,14 @@ static const LB_enum _Perl_LB_invmap[] = {  /* for ASCII/Latin1 */
        LB_Glue,
        LB_Open_Punctuation,
        LB_Close_Punctuation,
+       LB_Glue,
+       LB_Open_Punctuation,
+       LB_Close_Punctuation,
+       LB_Open_Punctuation,
+       LB_Close_Punctuation,
+       LB_Combining_Mark,
+       LB_Alphabetic,
+       LB_Combining_Mark,
        LB_Alphabetic,
        LB_Open_Punctuation,
        LB_Close_Punctuation,
@@ -43650,6 +43875,10 @@ static const LB_enum _Perl_LB_invmap[] = {  /* for ASCII/Latin1 */
        LB_Alphabetic,
        LB_Nonstarter,
        LB_Alphabetic,
+       LB_Nonstarter,
+       LB_Alphabetic,
+       LB_Nonstarter,
+       LB_Alphabetic,
        LB_Ideographic,
        LB_Alphabetic,
        LB_Combining_Mark,
@@ -43698,6 +43927,8 @@ static const LB_enum _Perl_LB_invmap[] = {  /* for ASCII/Latin1 */
        LB_Alphabetic,
        LB_Combining_Mark,
        LB_Alphabetic,
+       LB_Combining_Mark,
+       LB_Alphabetic,
        LB_Numeric,
        LB_Alphabetic,
        LB_Combining_Mark,
@@ -43708,6 +43939,9 @@ static const LB_enum _Perl_LB_invmap[] = {  /* for ASCII/Latin1 */
        LB_Prefix_Numeric,
        LB_Alphabetic,
        LB_Combining_Mark,
+       LB_Numeric,
+       LB_Alphabetic,
+       LB_Combining_Mark,
        LB_Alphabetic,
        LB_Combining_Mark,
        LB_Alphabetic,
@@ -43834,7 +44068,9 @@ static const LB_enum _Perl_LB_invmap[] = {  /* for ASCII/Latin1 */
        LB_Ideographic,
        LB_Unassigned_Extended_Pictographic_Ideographic,
        LB_Alphabetic,
+       LB_Ideographic,
        LB_Unassigned_Extended_Pictographic_Ideographic,
+       LB_Ideographic,
        LB_Alphabetic,
        LB_Ideographic,
        LB_Unassigned_Extended_Pictographic_Ideographic,
@@ -43890,10 +44126,6 @@ static const LB_enum _Perl_LB_invmap[] = {  /* for ASCII/Latin1 */
        LB_Ideographic,
        LB_Unassigned_Extended_Pictographic_Ideographic,
        LB_Ideographic,
-       LB_Unassigned_Extended_Pictographic_Ideographic,
-       LB_Ideographic,
-       LB_Unassigned_Extended_Pictographic_Ideographic,
-       LB_Ideographic,
        LB_E_Base,
        LB_Unassigned_Extended_Pictographic_Ideographic,
        LB_Ideographic,
@@ -43931,7 +44163,7 @@ static const LB_enum _Perl_LB_invmap[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV _Perl_LB_invlist[] = {  /* for EBCDIC 1047 */
-       2513,   /* Number of elements */
+       2551,   /* Number of elements */
        148565664, /* Version and data structure type */
        0,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -44231,6 +44463,8 @@ static const UV _Perl_LB_invlist[] = {  /* for EBCDIC 1047 */
        0xCE4,
        0xCE6,
        0xCF0,
+       0xCF3,
+       0xCF4,
        0xD00,
        0xD04,
        0xD3B,
@@ -44279,7 +44513,7 @@ static const UV _Perl_LB_invlist[] = {  /* for EBCDIC 1047 */
        0xEB4,
        0xEBD,
        0xEC8,
-       0xECE,
+       0xECF,
        0xED0,
        0xEDA,
        0xF01,
@@ -44468,6 +44702,10 @@ static const UV _Perl_LB_invlist[] = {  /* for EBCDIC 1047 */
        0x1CF7,
        0x1CFA,
        0x1DC0,
+       0x1DCD,
+       0x1DCE,
+       0x1DFC,
+       0x1DFD,
        0x1E00,
        0x1FFD,
        0x1FFE,
@@ -45908,6 +46146,8 @@ static const UV _Perl_LB_invlist[] = {  /* for EBCDIC 1047 */
        0x10EAB,
        0x10EAD,
        0x10EAE,
+       0x10EFD,
+       0x10F00,
        0x10F46,
        0x10F51,
        0x10F82,
@@ -45967,6 +46207,8 @@ static const UV _Perl_LB_invlist[] = {  /* for EBCDIC 1047 */
        0x1123D,
        0x1123E,
        0x1123F,
+       0x11241,
+       0x11242,
        0x112A9,
        0x112AA,
        0x112DF,
@@ -46077,6 +46319,8 @@ static const UV _Perl_LB_invlist[] = {  /* for EBCDIC 1047 */
        0x11A9E,
        0x11AA1,
        0x11AA3,
+       0x11B00,
+       0x11B0A,
        0x11C2F,
        0x11C37,
        0x11C38,
@@ -46114,6 +46358,17 @@ static const UV _Perl_LB_invlist[] = {  /* for EBCDIC 1047 */
        0x11DAA,
        0x11EF3,
        0x11EF7,
+       0x11F00,
+       0x11F02,
+       0x11F03,
+       0x11F04,
+       0x11F34,
+       0x11F3B,
+       0x11F3E,
+       0x11F43,
+       0x11F45,
+       0x11F50,
+       0x11F5A,
        0x11FDD,
        0x11FE1,
        0x11FFF,
@@ -46137,6 +46392,14 @@ static const UV _Perl_LB_invlist[] = {  /* for EBCDIC 1047 */
        0x13437,
        0x13438,
        0x13439,
+       0x1343C,
+       0x1343D,
+       0x1343E,
+       0x1343F,
+       0x13440,
+       0x13441,
+       0x13447,
+       0x13456,
        0x145CE,
        0x145CF,
        0x145D0,
@@ -46177,8 +46440,12 @@ static const UV _Perl_LB_invlist[] = {  /* for EBCDIC 1047 */
        0x18D09,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -46227,6 +46494,8 @@ static const UV _Perl_LB_invlist[] = {  /* for EBCDIC 1047 */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E08F,
+       0x1E090,
        0x1E130,
        0x1E137,
        0x1E140,
@@ -46238,6 +46507,9 @@ static const UV _Perl_LB_invlist[] = {  /* for EBCDIC 1047 */
        0x1E2FA,
        0x1E2FF,
        0x1E300,
+       0x1E4EC,
+       0x1E4F0,
+       0x1E4FA,
        0x1E8D0,
        0x1E8D7,
        0x1E944,
@@ -46360,15 +46632,17 @@ static const UV _Perl_LB_invlist[] = {  /* for EBCDIC 1047 */
        0x1F6CC,
        0x1F6CD,
        0x1F6D8,
-       0x1F6DD,
+       0x1F6DC,
        0x1F6ED,
        0x1F6F0,
        0x1F6FD,
        0x1F700,
        0x1F774,
+       0x1F777,
+       0x1F77B,
        0x1F780,
        0x1F7D5,
-       0x1F7D9,
+       0x1F7DA,
        0x1F7E0,
        0x1F7EC,
        0x1F7F0,
@@ -46415,24 +46689,20 @@ static const UV _Perl_LB_invlist[] = {  /* for EBCDIC 1047 */
        0x1FA60,
        0x1FA6E,
        0x1FA70,
-       0x1FA75,
-       0x1FA78,
        0x1FA7D,
        0x1FA80,
-       0x1FA87,
+       0x1FA89,
        0x1FA90,
-       0x1FAAD,
-       0x1FAB0,
-       0x1FABB,
-       0x1FAC0,
+       0x1FABE,
+       0x1FABF,
        0x1FAC3,
        0x1FAC6,
-       0x1FAD0,
-       0x1FADA,
+       0x1FACE,
+       0x1FADC,
        0x1FAE0,
-       0x1FAE8,
+       0x1FAE9,
        0x1FAF0,
-       0x1FAF7,
+       0x1FAF9,
        0x1FB00,
        0x1FBF0,
        0x1FBFA,
@@ -46817,6 +47087,8 @@ static const LB_enum _Perl_LB_invmap[] = {  /* for EBCDIC 1047 */
        LB_Alphabetic,
        LB_Combining_Mark,
        LB_Alphabetic,
+       LB_Combining_Mark,
+       LB_Alphabetic,
        LB_Numeric,
        LB_Alphabetic,
        LB_Postfix_Numeric,
@@ -47040,6 +47312,10 @@ static const LB_enum _Perl_LB_invmap[] = {  /* for EBCDIC 1047 */
        LB_Combining_Mark,
        LB_Alphabetic,
        LB_Combining_Mark,
+       LB_Glue,
+       LB_Combining_Mark,
+       LB_Glue,
+       LB_Combining_Mark,
        LB_Alphabetic,
        LB_Break_Before,
        LB_Alphabetic,
@@ -47078,7 +47354,7 @@ static const LB_enum _Perl_LB_invmap[] = {  /* for EBCDIC 1047 */
        LB_Nonstarter,
        LB_Alphabetic,
        LB_Break_After,
-       LB_Alphabetic,
+       LB_Postfix_Numeric,
        LB_Break_After,
        LB_Alphabetic,
        LB_Break_After,
@@ -48487,6 +48763,8 @@ static const LB_enum _Perl_LB_invmap[] = {  /* for EBCDIC 1047 */
        LB_Combining_Mark,
        LB_Alphabetic,
        LB_Combining_Mark,
+       LB_Alphabetic,
+       LB_Combining_Mark,
        LB_Break_After,
        LB_Alphabetic,
        LB_Numeric,
@@ -48539,6 +48817,8 @@ static const LB_enum _Perl_LB_invmap[] = {  /* for EBCDIC 1047 */
        LB_Alphabetic,
        LB_Combining_Mark,
        LB_Alphabetic,
+       LB_Combining_Mark,
+       LB_Alphabetic,
        LB_Break_After,
        LB_Alphabetic,
        LB_Combining_Mark,
@@ -48649,6 +48929,8 @@ static const LB_enum _Perl_LB_invmap[] = {  /* for EBCDIC 1047 */
        LB_Break_Before,
        LB_Break_After,
        LB_Alphabetic,
+       LB_Break_Before,
+       LB_Alphabetic,
        LB_Combining_Mark,
        LB_Alphabetic,
        LB_Combining_Mark,
@@ -48686,6 +48968,17 @@ static const LB_enum _Perl_LB_invmap[] = {  /* for EBCDIC 1047 */
        LB_Alphabetic,
        LB_Combining_Mark,
        LB_Alphabetic,
+       LB_Combining_Mark,
+       LB_Alphabetic,
+       LB_Combining_Mark,
+       LB_Alphabetic,
+       LB_Combining_Mark,
+       LB_Alphabetic,
+       LB_Combining_Mark,
+       LB_Break_After,
+       LB_Ideographic,
+       LB_Numeric,
+       LB_Alphabetic,
        LB_Postfix_Numeric,
        LB_Alphabetic,
        LB_Break_After,
@@ -48708,6 +49001,14 @@ static const LB_enum _Perl_LB_invmap[] = {  /* for EBCDIC 1047 */
        LB_Glue,
        LB_Open_Punctuation,
        LB_Close_Punctuation,
+       LB_Glue,
+       LB_Open_Punctuation,
+       LB_Close_Punctuation,
+       LB_Open_Punctuation,
+       LB_Close_Punctuation,
+       LB_Combining_Mark,
+       LB_Alphabetic,
+       LB_Combining_Mark,
        LB_Alphabetic,
        LB_Open_Punctuation,
        LB_Close_Punctuation,
@@ -48753,6 +49054,10 @@ static const LB_enum _Perl_LB_invmap[] = {  /* for EBCDIC 1047 */
        LB_Alphabetic,
        LB_Nonstarter,
        LB_Alphabetic,
+       LB_Nonstarter,
+       LB_Alphabetic,
+       LB_Nonstarter,
+       LB_Alphabetic,
        LB_Ideographic,
        LB_Alphabetic,
        LB_Combining_Mark,
@@ -48801,6 +49106,8 @@ static const LB_enum _Perl_LB_invmap[] = {  /* for EBCDIC 1047 */
        LB_Alphabetic,
        LB_Combining_Mark,
        LB_Alphabetic,
+       LB_Combining_Mark,
+       LB_Alphabetic,
        LB_Numeric,
        LB_Alphabetic,
        LB_Combining_Mark,
@@ -48811,6 +49118,9 @@ static const LB_enum _Perl_LB_invmap[] = {  /* for EBCDIC 1047 */
        LB_Prefix_Numeric,
        LB_Alphabetic,
        LB_Combining_Mark,
+       LB_Numeric,
+       LB_Alphabetic,
+       LB_Combining_Mark,
        LB_Alphabetic,
        LB_Combining_Mark,
        LB_Alphabetic,
@@ -48937,7 +49247,9 @@ static const LB_enum _Perl_LB_invmap[] = {  /* for EBCDIC 1047 */
        LB_Ideographic,
        LB_Unassigned_Extended_Pictographic_Ideographic,
        LB_Alphabetic,
+       LB_Ideographic,
        LB_Unassigned_Extended_Pictographic_Ideographic,
+       LB_Ideographic,
        LB_Alphabetic,
        LB_Ideographic,
        LB_Unassigned_Extended_Pictographic_Ideographic,
@@ -48993,10 +49305,6 @@ static const LB_enum _Perl_LB_invmap[] = {  /* for EBCDIC 1047 */
        LB_Ideographic,
        LB_Unassigned_Extended_Pictographic_Ideographic,
        LB_Ideographic,
-       LB_Unassigned_Extended_Pictographic_Ideographic,
-       LB_Ideographic,
-       LB_Unassigned_Extended_Pictographic_Ideographic,
-       LB_Ideographic,
        LB_E_Base,
        LB_Unassigned_Extended_Pictographic_Ideographic,
        LB_Ideographic,
@@ -49034,7 +49342,7 @@ static const LB_enum _Perl_LB_invmap[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV _Perl_LB_invlist[] = {  /* for EBCDIC 037 */
-       2513,   /* Number of elements */
+       2551,   /* Number of elements */
        148565664, /* Version and data structure type */
        0,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -49334,6 +49642,8 @@ static const UV _Perl_LB_invlist[] = {  /* for EBCDIC 037 */
        0xCE4,
        0xCE6,
        0xCF0,
+       0xCF3,
+       0xCF4,
        0xD00,
        0xD04,
        0xD3B,
@@ -49382,7 +49692,7 @@ static const UV _Perl_LB_invlist[] = {  /* for EBCDIC 037 */
        0xEB4,
        0xEBD,
        0xEC8,
-       0xECE,
+       0xECF,
        0xED0,
        0xEDA,
        0xF01,
@@ -49571,6 +49881,10 @@ static const UV _Perl_LB_invlist[] = {  /* for EBCDIC 037 */
        0x1CF7,
        0x1CFA,
        0x1DC0,
+       0x1DCD,
+       0x1DCE,
+       0x1DFC,
+       0x1DFD,
        0x1E00,
        0x1FFD,
        0x1FFE,
@@ -51011,6 +51325,8 @@ static const UV _Perl_LB_invlist[] = {  /* for EBCDIC 037 */
        0x10EAB,
        0x10EAD,
        0x10EAE,
+       0x10EFD,
+       0x10F00,
        0x10F46,
        0x10F51,
        0x10F82,
@@ -51070,6 +51386,8 @@ static const UV _Perl_LB_invlist[] = {  /* for EBCDIC 037 */
        0x1123D,
        0x1123E,
        0x1123F,
+       0x11241,
+       0x11242,
        0x112A9,
        0x112AA,
        0x112DF,
@@ -51180,6 +51498,8 @@ static const UV _Perl_LB_invlist[] = {  /* for EBCDIC 037 */
        0x11A9E,
        0x11AA1,
        0x11AA3,
+       0x11B00,
+       0x11B0A,
        0x11C2F,
        0x11C37,
        0x11C38,
@@ -51217,6 +51537,17 @@ static const UV _Perl_LB_invlist[] = {  /* for EBCDIC 037 */
        0x11DAA,
        0x11EF3,
        0x11EF7,
+       0x11F00,
+       0x11F02,
+       0x11F03,
+       0x11F04,
+       0x11F34,
+       0x11F3B,
+       0x11F3E,
+       0x11F43,
+       0x11F45,
+       0x11F50,
+       0x11F5A,
        0x11FDD,
        0x11FE1,
        0x11FFF,
@@ -51240,6 +51571,14 @@ static const UV _Perl_LB_invlist[] = {  /* for EBCDIC 037 */
        0x13437,
        0x13438,
        0x13439,
+       0x1343C,
+       0x1343D,
+       0x1343E,
+       0x1343F,
+       0x13440,
+       0x13441,
+       0x13447,
+       0x13456,
        0x145CE,
        0x145CF,
        0x145D0,
@@ -51280,8 +51619,12 @@ static const UV _Perl_LB_invlist[] = {  /* for EBCDIC 037 */
        0x18D09,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -51330,6 +51673,8 @@ static const UV _Perl_LB_invlist[] = {  /* for EBCDIC 037 */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E08F,
+       0x1E090,
        0x1E130,
        0x1E137,
        0x1E140,
@@ -51341,6 +51686,9 @@ static const UV _Perl_LB_invlist[] = {  /* for EBCDIC 037 */
        0x1E2FA,
        0x1E2FF,
        0x1E300,
+       0x1E4EC,
+       0x1E4F0,
+       0x1E4FA,
        0x1E8D0,
        0x1E8D7,
        0x1E944,
@@ -51463,15 +51811,17 @@ static const UV _Perl_LB_invlist[] = {  /* for EBCDIC 037 */
        0x1F6CC,
        0x1F6CD,
        0x1F6D8,
-       0x1F6DD,
+       0x1F6DC,
        0x1F6ED,
        0x1F6F0,
        0x1F6FD,
        0x1F700,
        0x1F774,
+       0x1F777,
+       0x1F77B,
        0x1F780,
        0x1F7D5,
-       0x1F7D9,
+       0x1F7DA,
        0x1F7E0,
        0x1F7EC,
        0x1F7F0,
@@ -51518,24 +51868,20 @@ static const UV _Perl_LB_invlist[] = {  /* for EBCDIC 037 */
        0x1FA60,
        0x1FA6E,
        0x1FA70,
-       0x1FA75,
-       0x1FA78,
        0x1FA7D,
        0x1FA80,
-       0x1FA87,
+       0x1FA89,
        0x1FA90,
-       0x1FAAD,
-       0x1FAB0,
-       0x1FABB,
-       0x1FAC0,
+       0x1FABE,
+       0x1FABF,
        0x1FAC3,
        0x1FAC6,
-       0x1FAD0,
-       0x1FADA,
+       0x1FACE,
+       0x1FADC,
        0x1FAE0,
-       0x1FAE8,
+       0x1FAE9,
        0x1FAF0,
-       0x1FAF7,
+       0x1FAF9,
        0x1FB00,
        0x1FBF0,
        0x1FBFA,
@@ -51920,6 +52266,8 @@ static const LB_enum _Perl_LB_invmap[] = {  /* for EBCDIC 037 */
        LB_Alphabetic,
        LB_Combining_Mark,
        LB_Alphabetic,
+       LB_Combining_Mark,
+       LB_Alphabetic,
        LB_Numeric,
        LB_Alphabetic,
        LB_Postfix_Numeric,
@@ -52143,6 +52491,10 @@ static const LB_enum _Perl_LB_invmap[] = {  /* for EBCDIC 037 */
        LB_Combining_Mark,
        LB_Alphabetic,
        LB_Combining_Mark,
+       LB_Glue,
+       LB_Combining_Mark,
+       LB_Glue,
+       LB_Combining_Mark,
        LB_Alphabetic,
        LB_Break_Before,
        LB_Alphabetic,
@@ -52181,7 +52533,7 @@ static const LB_enum _Perl_LB_invmap[] = {  /* for EBCDIC 037 */
        LB_Nonstarter,
        LB_Alphabetic,
        LB_Break_After,
-       LB_Alphabetic,
+       LB_Postfix_Numeric,
        LB_Break_After,
        LB_Alphabetic,
        LB_Break_After,
@@ -53590,6 +53942,8 @@ static const LB_enum _Perl_LB_invmap[] = {  /* for EBCDIC 037 */
        LB_Combining_Mark,
        LB_Alphabetic,
        LB_Combining_Mark,
+       LB_Alphabetic,
+       LB_Combining_Mark,
        LB_Break_After,
        LB_Alphabetic,
        LB_Numeric,
@@ -53642,6 +53996,8 @@ static const LB_enum _Perl_LB_invmap[] = {  /* for EBCDIC 037 */
        LB_Alphabetic,
        LB_Combining_Mark,
        LB_Alphabetic,
+       LB_Combining_Mark,
+       LB_Alphabetic,
        LB_Break_After,
        LB_Alphabetic,
        LB_Combining_Mark,
@@ -53752,6 +54108,8 @@ static const LB_enum _Perl_LB_invmap[] = {  /* for EBCDIC 037 */
        LB_Break_Before,
        LB_Break_After,
        LB_Alphabetic,
+       LB_Break_Before,
+       LB_Alphabetic,
        LB_Combining_Mark,
        LB_Alphabetic,
        LB_Combining_Mark,
@@ -53789,6 +54147,17 @@ static const LB_enum _Perl_LB_invmap[] = {  /* for EBCDIC 037 */
        LB_Alphabetic,
        LB_Combining_Mark,
        LB_Alphabetic,
+       LB_Combining_Mark,
+       LB_Alphabetic,
+       LB_Combining_Mark,
+       LB_Alphabetic,
+       LB_Combining_Mark,
+       LB_Alphabetic,
+       LB_Combining_Mark,
+       LB_Break_After,
+       LB_Ideographic,
+       LB_Numeric,
+       LB_Alphabetic,
        LB_Postfix_Numeric,
        LB_Alphabetic,
        LB_Break_After,
@@ -53811,6 +54180,14 @@ static const LB_enum _Perl_LB_invmap[] = {  /* for EBCDIC 037 */
        LB_Glue,
        LB_Open_Punctuation,
        LB_Close_Punctuation,
+       LB_Glue,
+       LB_Open_Punctuation,
+       LB_Close_Punctuation,
+       LB_Open_Punctuation,
+       LB_Close_Punctuation,
+       LB_Combining_Mark,
+       LB_Alphabetic,
+       LB_Combining_Mark,
        LB_Alphabetic,
        LB_Open_Punctuation,
        LB_Close_Punctuation,
@@ -53856,6 +54233,10 @@ static const LB_enum _Perl_LB_invmap[] = {  /* for EBCDIC 037 */
        LB_Alphabetic,
        LB_Nonstarter,
        LB_Alphabetic,
+       LB_Nonstarter,
+       LB_Alphabetic,
+       LB_Nonstarter,
+       LB_Alphabetic,
        LB_Ideographic,
        LB_Alphabetic,
        LB_Combining_Mark,
@@ -53904,6 +54285,8 @@ static const LB_enum _Perl_LB_invmap[] = {  /* for EBCDIC 037 */
        LB_Alphabetic,
        LB_Combining_Mark,
        LB_Alphabetic,
+       LB_Combining_Mark,
+       LB_Alphabetic,
        LB_Numeric,
        LB_Alphabetic,
        LB_Combining_Mark,
@@ -53914,6 +54297,9 @@ static const LB_enum _Perl_LB_invmap[] = {  /* for EBCDIC 037 */
        LB_Prefix_Numeric,
        LB_Alphabetic,
        LB_Combining_Mark,
+       LB_Numeric,
+       LB_Alphabetic,
+       LB_Combining_Mark,
        LB_Alphabetic,
        LB_Combining_Mark,
        LB_Alphabetic,
@@ -54040,7 +54426,9 @@ static const LB_enum _Perl_LB_invmap[] = {  /* for EBCDIC 037 */
        LB_Ideographic,
        LB_Unassigned_Extended_Pictographic_Ideographic,
        LB_Alphabetic,
+       LB_Ideographic,
        LB_Unassigned_Extended_Pictographic_Ideographic,
+       LB_Ideographic,
        LB_Alphabetic,
        LB_Ideographic,
        LB_Unassigned_Extended_Pictographic_Ideographic,
@@ -54096,10 +54484,6 @@ static const LB_enum _Perl_LB_invmap[] = {  /* for EBCDIC 037 */
        LB_Ideographic,
        LB_Unassigned_Extended_Pictographic_Ideographic,
        LB_Ideographic,
-       LB_Unassigned_Extended_Pictographic_Ideographic,
-       LB_Ideographic,
-       LB_Unassigned_Extended_Pictographic_Ideographic,
-       LB_Ideographic,
        LB_E_Base,
        LB_Unassigned_Extended_Pictographic_Ideographic,
        LB_Ideographic,
@@ -54134,7 +54518,7 @@ static const LB_enum _Perl_LB_invmap[] = {  /* for EBCDIC 037 */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV _Perl_SB_invlist[] = {  /* for ASCII/Latin1 */
-       3227,   /* Number of elements */
+       3262,   /* Number of elements */
        148565664, /* Version and data structure type */
        0,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -55100,6 +55484,7 @@ static const UV _Perl_SB_invlist[] = {  /* for ASCII/Latin1 */
        0xCF0,
        0xCF1,
        0xCF3,
+       0xCF4,
        0xD00,
        0xD04,
        0xD0D,
@@ -55180,7 +55565,7 @@ static const UV _Perl_SB_invlist[] = {  /* for ASCII/Latin1 */
        0xEC6,
        0xEC7,
        0xEC8,
-       0xECE,
+       0xECF,
        0xED0,
        0xEDA,
        0xEDC,
@@ -55244,6 +55629,7 @@ static const UV _Perl_SB_invlist[] = {  /* for ASCII/Latin1 */
        0x10D0,
        0x10FB,
        0x10FC,
+       0x10FD,
        0x1249,
        0x124A,
        0x124E,
@@ -56416,7 +56802,6 @@ static const UV _Perl_SB_invlist[] = {  /* for ASCII/Latin1 */
        0xAB30,
        0xAB5B,
        0xAB5C,
-       0xAB69,
        0xAB6A,
        0xAB70,
        0xABC0,
@@ -56700,6 +57085,7 @@ static const UV _Perl_SB_invlist[] = {  /* for ASCII/Latin1 */
        0x10EAD,
        0x10EB0,
        0x10EB2,
+       0x10EFD,
        0x10F00,
        0x10F1D,
        0x10F27,
@@ -56784,6 +57170,8 @@ static const UV _Perl_SB_invlist[] = {  /* for ASCII/Latin1 */
        0x1123D,
        0x1123E,
        0x1123F,
+       0x11241,
+       0x11242,
        0x11280,
        0x11287,
        0x11288,
@@ -57001,6 +57389,19 @@ static const UV _Perl_SB_invlist[] = {  /* for ASCII/Latin1 */
        0x11EF3,
        0x11EF7,
        0x11EF9,
+       0x11F00,
+       0x11F02,
+       0x11F03,
+       0x11F04,
+       0x11F11,
+       0x11F12,
+       0x11F34,
+       0x11F3B,
+       0x11F3E,
+       0x11F43,
+       0x11F45,
+       0x11F50,
+       0x11F5A,
        0x11FB0,
        0x11FB1,
        0x12000,
@@ -57012,9 +57413,11 @@ static const UV _Perl_SB_invlist[] = {  /* for ASCII/Latin1 */
        0x12F90,
        0x12FF1,
        0x13000,
-       0x1342F,
        0x13430,
-       0x13439,
+       0x13440,
+       0x13441,
+       0x13447,
+       0x13456,
        0x14400,
        0x14647,
        0x16800,
@@ -57081,8 +57484,12 @@ static const UV _Perl_SB_invlist[] = {  /* for ASCII/Latin1 */
        0x1AFFF,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -57224,6 +57631,8 @@ static const UV _Perl_SB_invlist[] = {  /* for ASCII/Latin1 */
        0x1DF0A,
        0x1DF0B,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
        0x1E000,
        0x1E007,
        0x1E008,
@@ -57234,6 +57643,10 @@ static const UV _Perl_SB_invlist[] = {  /* for ASCII/Latin1 */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E030,
+       0x1E06E,
+       0x1E08F,
+       0x1E090,
        0x1E100,
        0x1E12D,
        0x1E130,
@@ -57250,6 +57663,10 @@ static const UV _Perl_SB_invlist[] = {  /* for ASCII/Latin1 */
        0x1E2EC,
        0x1E2F0,
        0x1E2FA,
+       0x1E4D0,
+       0x1E4EC,
+       0x1E4F0,
+       0x1E4FA,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -57348,7 +57765,7 @@ static const UV _Perl_SB_invlist[] = {  /* for ASCII/Latin1 */
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -57359,6 +57776,8 @@ static const UV _Perl_SB_invlist[] = {  /* for ASCII/Latin1 */
        0x2FA1E,
        0x30000,
        0x3134B,
+       0x31350,
+       0x323B0,
        0xE0001,
        0xE0002,
        0xE0020,
@@ -58356,6 +58775,7 @@ static const SB_enum _Perl_SB_invmap[] = {  /* for ASCII/Latin1 */
        SB_Numeric,
        SB_Other,
        SB_OLetter,
+       SB_Extend,
        SB_Other,
        SB_Extend,
        SB_OLetter,
@@ -58500,6 +58920,7 @@ static const SB_enum _Perl_SB_invmap[] = {  /* for ASCII/Latin1 */
        SB_Other,
        SB_OLetter,
        SB_Other,
+       SB_Lower,
        SB_OLetter,
        SB_Other,
        SB_OLetter,
@@ -59566,7 +59987,7 @@ static const SB_enum _Perl_SB_invmap[] = {  /* for ASCII/Latin1 */
        SB_Upper,
        SB_Lower,
        SB_Other,
-       SB_OLetter,
+       SB_Lower,
        SB_Upper,
        SB_Lower,
        SB_OLetter,
@@ -59673,7 +60094,6 @@ static const SB_enum _Perl_SB_invmap[] = {  /* for ASCII/Latin1 */
        SB_Lower,
        SB_Other,
        SB_Lower,
-       SB_OLetter,
        SB_Other,
        SB_Lower,
        SB_OLetter,
@@ -59957,6 +60377,7 @@ static const SB_enum _Perl_SB_invmap[] = {  /* for ASCII/Latin1 */
        SB_Other,
        SB_OLetter,
        SB_Other,
+       SB_Extend,
        SB_OLetter,
        SB_Other,
        SB_OLetter,
@@ -60040,6 +60461,8 @@ static const SB_enum _Perl_SB_invmap[] = {  /* for ASCII/Latin1 */
        SB_STerm,
        SB_Other,
        SB_Extend,
+       SB_OLetter,
+       SB_Extend,
        SB_Other,
        SB_OLetter,
        SB_Other,
@@ -60258,9 +60681,20 @@ static const SB_enum _Perl_SB_invmap[] = {  /* for ASCII/Latin1 */
        SB_Extend,
        SB_STerm,
        SB_Other,
+       SB_Extend,
+       SB_OLetter,
+       SB_Extend,
        SB_OLetter,
        SB_Other,
        SB_OLetter,
+       SB_Extend,
+       SB_Other,
+       SB_Extend,
+       SB_STerm,
+       SB_Other,
+       SB_Numeric,
+       SB_Other,
+       SB_OLetter,
        SB_Other,
        SB_OLetter,
        SB_Other,
@@ -60270,7 +60704,11 @@ static const SB_enum _Perl_SB_invmap[] = {  /* for ASCII/Latin1 */
        SB_Other,
        SB_OLetter,
        SB_Other,
+       SB_OLetter,
        SB_Format,
+       SB_Extend,
+       SB_OLetter,
+       SB_Extend,
        SB_Other,
        SB_OLetter,
        SB_Other,
@@ -60352,6 +60790,10 @@ static const SB_enum _Perl_SB_invmap[] = {  /* for ASCII/Latin1 */
        SB_Other,
        SB_OLetter,
        SB_Other,
+       SB_OLetter,
+       SB_Other,
+       SB_OLetter,
+       SB_Other,
        SB_Extend,
        SB_STerm,
        SB_Format,
@@ -60481,6 +60923,10 @@ static const SB_enum _Perl_SB_invmap[] = {  /* for ASCII/Latin1 */
        SB_OLetter,
        SB_Lower,
        SB_Other,
+       SB_Lower,
+       SB_Other,
+       SB_Extend,
+       SB_Other,
        SB_Extend,
        SB_Other,
        SB_Extend,
@@ -60489,6 +60935,8 @@ static const SB_enum _Perl_SB_invmap[] = {  /* for ASCII/Latin1 */
        SB_Other,
        SB_Extend,
        SB_Other,
+       SB_Lower,
+       SB_Other,
        SB_Extend,
        SB_Other,
        SB_OLetter,
@@ -60508,6 +60956,10 @@ static const SB_enum _Perl_SB_invmap[] = {  /* for ASCII/Latin1 */
        SB_Numeric,
        SB_Other,
        SB_OLetter,
+       SB_Extend,
+       SB_Numeric,
+       SB_Other,
+       SB_OLetter,
        SB_Other,
        SB_OLetter,
        SB_Other,
@@ -60616,6 +61068,8 @@ static const SB_enum _Perl_SB_invmap[] = {  /* for ASCII/Latin1 */
        SB_Other,
        SB_OLetter,
        SB_Other,
+       SB_OLetter,
+       SB_Other,
        SB_Format,
        SB_Other,
        SB_Extend,
@@ -60636,7 +61090,7 @@ static const SB_enum _Perl_SB_invmap[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV _Perl_SB_invlist[] = {  /* for EBCDIC 1047 */
-       3251,   /* Number of elements */
+       3286,   /* Number of elements */
        148565664, /* Version and data structure type */
        0,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -61626,6 +62080,7 @@ static const UV _Perl_SB_invlist[] = {  /* for EBCDIC 1047 */
        0xCF0,
        0xCF1,
        0xCF3,
+       0xCF4,
        0xD00,
        0xD04,
        0xD0D,
@@ -61706,7 +62161,7 @@ static const UV _Perl_SB_invlist[] = {  /* for EBCDIC 1047 */
        0xEC6,
        0xEC7,
        0xEC8,
-       0xECE,
+       0xECF,
        0xED0,
        0xEDA,
        0xEDC,
@@ -61770,6 +62225,7 @@ static const UV _Perl_SB_invlist[] = {  /* for EBCDIC 1047 */
        0x10D0,
        0x10FB,
        0x10FC,
+       0x10FD,
        0x1249,
        0x124A,
        0x124E,
@@ -62942,7 +63398,6 @@ static const UV _Perl_SB_invlist[] = {  /* for EBCDIC 1047 */
        0xAB30,
        0xAB5B,
        0xAB5C,
-       0xAB69,
        0xAB6A,
        0xAB70,
        0xABC0,
@@ -63226,6 +63681,7 @@ static const UV _Perl_SB_invlist[] = {  /* for EBCDIC 1047 */
        0x10EAD,
        0x10EB0,
        0x10EB2,
+       0x10EFD,
        0x10F00,
        0x10F1D,
        0x10F27,
@@ -63310,6 +63766,8 @@ static const UV _Perl_SB_invlist[] = {  /* for EBCDIC 1047 */
        0x1123D,
        0x1123E,
        0x1123F,
+       0x11241,
+       0x11242,
        0x11280,
        0x11287,
        0x11288,
@@ -63527,6 +63985,19 @@ static const UV _Perl_SB_invlist[] = {  /* for EBCDIC 1047 */
        0x11EF3,
        0x11EF7,
        0x11EF9,
+       0x11F00,
+       0x11F02,
+       0x11F03,
+       0x11F04,
+       0x11F11,
+       0x11F12,
+       0x11F34,
+       0x11F3B,
+       0x11F3E,
+       0x11F43,
+       0x11F45,
+       0x11F50,
+       0x11F5A,
        0x11FB0,
        0x11FB1,
        0x12000,
@@ -63538,9 +64009,11 @@ static const UV _Perl_SB_invlist[] = {  /* for EBCDIC 1047 */
        0x12F90,
        0x12FF1,
        0x13000,
-       0x1342F,
        0x13430,
-       0x13439,
+       0x13440,
+       0x13441,
+       0x13447,
+       0x13456,
        0x14400,
        0x14647,
        0x16800,
@@ -63607,8 +64080,12 @@ static const UV _Perl_SB_invlist[] = {  /* for EBCDIC 1047 */
        0x1AFFF,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -63750,6 +64227,8 @@ static const UV _Perl_SB_invlist[] = {  /* for EBCDIC 1047 */
        0x1DF0A,
        0x1DF0B,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
        0x1E000,
        0x1E007,
        0x1E008,
@@ -63760,6 +64239,10 @@ static const UV _Perl_SB_invlist[] = {  /* for EBCDIC 1047 */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E030,
+       0x1E06E,
+       0x1E08F,
+       0x1E090,
        0x1E100,
        0x1E12D,
        0x1E130,
@@ -63776,6 +64259,10 @@ static const UV _Perl_SB_invlist[] = {  /* for EBCDIC 1047 */
        0x1E2EC,
        0x1E2F0,
        0x1E2FA,
+       0x1E4D0,
+       0x1E4EC,
+       0x1E4F0,
+       0x1E4FA,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -63874,7 +64361,7 @@ static const UV _Perl_SB_invlist[] = {  /* for EBCDIC 1047 */
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -63885,6 +64372,8 @@ static const UV _Perl_SB_invlist[] = {  /* for EBCDIC 1047 */
        0x2FA1E,
        0x30000,
        0x3134B,
+       0x31350,
+       0x323B0,
        0xE0001,
        0xE0002,
        0xE0020,
@@ -64909,6 +65398,7 @@ static const SB_enum _Perl_SB_invmap[] = {  /* for EBCDIC 1047 */
        SB_Numeric,
        SB_Other,
        SB_OLetter,
+       SB_Extend,
        SB_Other,
        SB_Extend,
        SB_OLetter,
@@ -65053,6 +65543,7 @@ static const SB_enum _Perl_SB_invmap[] = {  /* for EBCDIC 1047 */
        SB_Other,
        SB_OLetter,
        SB_Other,
+       SB_Lower,
        SB_OLetter,
        SB_Other,
        SB_OLetter,
@@ -66119,7 +66610,7 @@ static const SB_enum _Perl_SB_invmap[] = {  /* for EBCDIC 1047 */
        SB_Upper,
        SB_Lower,
        SB_Other,
-       SB_OLetter,
+       SB_Lower,
        SB_Upper,
        SB_Lower,
        SB_OLetter,
@@ -66226,7 +66717,6 @@ static const SB_enum _Perl_SB_invmap[] = {  /* for EBCDIC 1047 */
        SB_Lower,
        SB_Other,
        SB_Lower,
-       SB_OLetter,
        SB_Other,
        SB_Lower,
        SB_OLetter,
@@ -66510,6 +67000,7 @@ static const SB_enum _Perl_SB_invmap[] = {  /* for EBCDIC 1047 */
        SB_Other,
        SB_OLetter,
        SB_Other,
+       SB_Extend,
        SB_OLetter,
        SB_Other,
        SB_OLetter,
@@ -66593,6 +67084,8 @@ static const SB_enum _Perl_SB_invmap[] = {  /* for EBCDIC 1047 */
        SB_STerm,
        SB_Other,
        SB_Extend,
+       SB_OLetter,
+       SB_Extend,
        SB_Other,
        SB_OLetter,
        SB_Other,
@@ -66811,7 +67304,18 @@ static const SB_enum _Perl_SB_invmap[] = {  /* for EBCDIC 1047 */
        SB_Extend,
        SB_STerm,
        SB_Other,
+       SB_Extend,
+       SB_OLetter,
+       SB_Extend,
+       SB_OLetter,
+       SB_Other,
        SB_OLetter,
+       SB_Extend,
+       SB_Other,
+       SB_Extend,
+       SB_STerm,
+       SB_Other,
+       SB_Numeric,
        SB_Other,
        SB_OLetter,
        SB_Other,
@@ -66823,7 +67327,11 @@ static const SB_enum _Perl_SB_invmap[] = {  /* for EBCDIC 1047 */
        SB_Other,
        SB_OLetter,
        SB_Other,
+       SB_OLetter,
        SB_Format,
+       SB_Extend,
+       SB_OLetter,
+       SB_Extend,
        SB_Other,
        SB_OLetter,
        SB_Other,
@@ -66905,6 +67413,10 @@ static const SB_enum _Perl_SB_invmap[] = {  /* for EBCDIC 1047 */
        SB_Other,
        SB_OLetter,
        SB_Other,
+       SB_OLetter,
+       SB_Other,
+       SB_OLetter,
+       SB_Other,
        SB_Extend,
        SB_STerm,
        SB_Format,
@@ -67034,6 +67546,8 @@ static const SB_enum _Perl_SB_invmap[] = {  /* for EBCDIC 1047 */
        SB_OLetter,
        SB_Lower,
        SB_Other,
+       SB_Lower,
+       SB_Other,
        SB_Extend,
        SB_Other,
        SB_Extend,
@@ -67044,6 +67558,10 @@ static const SB_enum _Perl_SB_invmap[] = {  /* for EBCDIC 1047 */
        SB_Other,
        SB_Extend,
        SB_Other,
+       SB_Lower,
+       SB_Other,
+       SB_Extend,
+       SB_Other,
        SB_OLetter,
        SB_Other,
        SB_Extend,
@@ -67061,6 +67579,10 @@ static const SB_enum _Perl_SB_invmap[] = {  /* for EBCDIC 1047 */
        SB_Numeric,
        SB_Other,
        SB_OLetter,
+       SB_Extend,
+       SB_Numeric,
+       SB_Other,
+       SB_OLetter,
        SB_Other,
        SB_OLetter,
        SB_Other,
@@ -67169,6 +67691,8 @@ static const SB_enum _Perl_SB_invmap[] = {  /* for EBCDIC 1047 */
        SB_Other,
        SB_OLetter,
        SB_Other,
+       SB_OLetter,
+       SB_Other,
        SB_Format,
        SB_Other,
        SB_Extend,
@@ -67189,7 +67713,7 @@ static const SB_enum _Perl_SB_invmap[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV _Perl_SB_invlist[] = {  /* for EBCDIC 037 */
-       3247,   /* Number of elements */
+       3282,   /* Number of elements */
        148565664, /* Version and data structure type */
        0,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -68175,6 +68699,7 @@ static const UV _Perl_SB_invlist[] = {  /* for EBCDIC 037 */
        0xCF0,
        0xCF1,
        0xCF3,
+       0xCF4,
        0xD00,
        0xD04,
        0xD0D,
@@ -68255,7 +68780,7 @@ static const UV _Perl_SB_invlist[] = {  /* for EBCDIC 037 */
        0xEC6,
        0xEC7,
        0xEC8,
-       0xECE,
+       0xECF,
        0xED0,
        0xEDA,
        0xEDC,
@@ -68319,6 +68844,7 @@ static const UV _Perl_SB_invlist[] = {  /* for EBCDIC 037 */
        0x10D0,
        0x10FB,
        0x10FC,
+       0x10FD,
        0x1249,
        0x124A,
        0x124E,
@@ -69491,7 +70017,6 @@ static const UV _Perl_SB_invlist[] = {  /* for EBCDIC 037 */
        0xAB30,
        0xAB5B,
        0xAB5C,
-       0xAB69,
        0xAB6A,
        0xAB70,
        0xABC0,
@@ -69775,6 +70300,7 @@ static const UV _Perl_SB_invlist[] = {  /* for EBCDIC 037 */
        0x10EAD,
        0x10EB0,
        0x10EB2,
+       0x10EFD,
        0x10F00,
        0x10F1D,
        0x10F27,
@@ -69859,6 +70385,8 @@ static const UV _Perl_SB_invlist[] = {  /* for EBCDIC 037 */
        0x1123D,
        0x1123E,
        0x1123F,
+       0x11241,
+       0x11242,
        0x11280,
        0x11287,
        0x11288,
@@ -70076,6 +70604,19 @@ static const UV _Perl_SB_invlist[] = {  /* for EBCDIC 037 */
        0x11EF3,
        0x11EF7,
        0x11EF9,
+       0x11F00,
+       0x11F02,
+       0x11F03,
+       0x11F04,
+       0x11F11,
+       0x11F12,
+       0x11F34,
+       0x11F3B,
+       0x11F3E,
+       0x11F43,
+       0x11F45,
+       0x11F50,
+       0x11F5A,
        0x11FB0,
        0x11FB1,
        0x12000,
@@ -70087,9 +70628,11 @@ static const UV _Perl_SB_invlist[] = {  /* for EBCDIC 037 */
        0x12F90,
        0x12FF1,
        0x13000,
-       0x1342F,
        0x13430,
-       0x13439,
+       0x13440,
+       0x13441,
+       0x13447,
+       0x13456,
        0x14400,
        0x14647,
        0x16800,
@@ -70156,8 +70699,12 @@ static const UV _Perl_SB_invlist[] = {  /* for EBCDIC 037 */
        0x1AFFF,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -70299,6 +70846,8 @@ static const UV _Perl_SB_invlist[] = {  /* for EBCDIC 037 */
        0x1DF0A,
        0x1DF0B,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
        0x1E000,
        0x1E007,
        0x1E008,
@@ -70309,6 +70858,10 @@ static const UV _Perl_SB_invlist[] = {  /* for EBCDIC 037 */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E030,
+       0x1E06E,
+       0x1E08F,
+       0x1E090,
        0x1E100,
        0x1E12D,
        0x1E130,
@@ -70325,6 +70878,10 @@ static const UV _Perl_SB_invlist[] = {  /* for EBCDIC 037 */
        0x1E2EC,
        0x1E2F0,
        0x1E2FA,
+       0x1E4D0,
+       0x1E4EC,
+       0x1E4F0,
+       0x1E4FA,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -70423,7 +70980,7 @@ static const UV _Perl_SB_invlist[] = {  /* for EBCDIC 037 */
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -70434,6 +70991,8 @@ static const UV _Perl_SB_invlist[] = {  /* for EBCDIC 037 */
        0x2FA1E,
        0x30000,
        0x3134B,
+       0x31350,
+       0x323B0,
        0xE0001,
        0xE0002,
        0xE0020,
@@ -71454,6 +72013,7 @@ static const SB_enum _Perl_SB_invmap[] = {  /* for EBCDIC 037 */
        SB_Numeric,
        SB_Other,
        SB_OLetter,
+       SB_Extend,
        SB_Other,
        SB_Extend,
        SB_OLetter,
@@ -71598,6 +72158,7 @@ static const SB_enum _Perl_SB_invmap[] = {  /* for EBCDIC 037 */
        SB_Other,
        SB_OLetter,
        SB_Other,
+       SB_Lower,
        SB_OLetter,
        SB_Other,
        SB_OLetter,
@@ -72664,7 +73225,7 @@ static const SB_enum _Perl_SB_invmap[] = {  /* for EBCDIC 037 */
        SB_Upper,
        SB_Lower,
        SB_Other,
-       SB_OLetter,
+       SB_Lower,
        SB_Upper,
        SB_Lower,
        SB_OLetter,
@@ -72771,7 +73332,6 @@ static const SB_enum _Perl_SB_invmap[] = {  /* for EBCDIC 037 */
        SB_Lower,
        SB_Other,
        SB_Lower,
-       SB_OLetter,
        SB_Other,
        SB_Lower,
        SB_OLetter,
@@ -73055,6 +73615,7 @@ static const SB_enum _Perl_SB_invmap[] = {  /* for EBCDIC 037 */
        SB_Other,
        SB_OLetter,
        SB_Other,
+       SB_Extend,
        SB_OLetter,
        SB_Other,
        SB_OLetter,
@@ -73138,6 +73699,8 @@ static const SB_enum _Perl_SB_invmap[] = {  /* for EBCDIC 037 */
        SB_STerm,
        SB_Other,
        SB_Extend,
+       SB_OLetter,
+       SB_Extend,
        SB_Other,
        SB_OLetter,
        SB_Other,
@@ -73356,7 +73919,18 @@ static const SB_enum _Perl_SB_invmap[] = {  /* for EBCDIC 037 */
        SB_Extend,
        SB_STerm,
        SB_Other,
+       SB_Extend,
+       SB_OLetter,
+       SB_Extend,
+       SB_OLetter,
+       SB_Other,
        SB_OLetter,
+       SB_Extend,
+       SB_Other,
+       SB_Extend,
+       SB_STerm,
+       SB_Other,
+       SB_Numeric,
        SB_Other,
        SB_OLetter,
        SB_Other,
@@ -73368,7 +73942,11 @@ static const SB_enum _Perl_SB_invmap[] = {  /* for EBCDIC 037 */
        SB_Other,
        SB_OLetter,
        SB_Other,
+       SB_OLetter,
        SB_Format,
+       SB_Extend,
+       SB_OLetter,
+       SB_Extend,
        SB_Other,
        SB_OLetter,
        SB_Other,
@@ -73450,6 +74028,10 @@ static const SB_enum _Perl_SB_invmap[] = {  /* for EBCDIC 037 */
        SB_Other,
        SB_OLetter,
        SB_Other,
+       SB_OLetter,
+       SB_Other,
+       SB_OLetter,
+       SB_Other,
        SB_Extend,
        SB_STerm,
        SB_Format,
@@ -73579,6 +74161,10 @@ static const SB_enum _Perl_SB_invmap[] = {  /* for EBCDIC 037 */
        SB_OLetter,
        SB_Lower,
        SB_Other,
+       SB_Lower,
+       SB_Other,
+       SB_Extend,
+       SB_Other,
        SB_Extend,
        SB_Other,
        SB_Extend,
@@ -73587,6 +74173,8 @@ static const SB_enum _Perl_SB_invmap[] = {  /* for EBCDIC 037 */
        SB_Other,
        SB_Extend,
        SB_Other,
+       SB_Lower,
+       SB_Other,
        SB_Extend,
        SB_Other,
        SB_OLetter,
@@ -73606,6 +74194,10 @@ static const SB_enum _Perl_SB_invmap[] = {  /* for EBCDIC 037 */
        SB_Numeric,
        SB_Other,
        SB_OLetter,
+       SB_Extend,
+       SB_Numeric,
+       SB_Other,
+       SB_OLetter,
        SB_Other,
        SB_OLetter,
        SB_Other,
@@ -73714,6 +74306,8 @@ static const SB_enum _Perl_SB_invmap[] = {  /* for EBCDIC 037 */
        SB_Other,
        SB_OLetter,
        SB_Other,
+       SB_OLetter,
+       SB_Other,
        SB_Format,
        SB_Other,
        SB_Extend,
@@ -73731,7 +74325,7 @@ static const SB_enum _Perl_SB_invmap[] = {  /* for EBCDIC 037 */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV _Perl_SCX_invlist[] = {  /* for ASCII/Latin1 */
-       1731,   /* Number of elements */
+       1750,   /* Number of elements */
        148565664, /* Version and data structure type */
        0,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -74061,7 +74655,7 @@ static const UV _Perl_SCX_invlist[] = {  /* for ASCII/Latin1 */
        0xCE6,
        0xCF0,
        0xCF1,
-       0xCF3,
+       0xCF4,
        0xD00,
        0xD0D,
        0xD0E,
@@ -74122,7 +74716,7 @@ static const UV _Perl_SCX_invlist[] = {  /* for ASCII/Latin1 */
        0xEC6,
        0xEC7,
        0xEC8,
-       0xECE,
+       0xECF,
        0xED0,
        0xEDA,
        0xEDC,
@@ -74887,6 +75481,7 @@ static const UV _Perl_SCX_invlist[] = {  /* for ASCII/Latin1 */
        0x10EAE,
        0x10EB0,
        0x10EB2,
+       0x10EFD,
        0x10F00,
        0x10F28,
        0x10F30,
@@ -74923,7 +75518,7 @@ static const UV _Perl_SCX_invlist[] = {  /* for ASCII/Latin1 */
        0x11200,
        0x11212,
        0x11213,
-       0x1123F,
+       0x11242,
        0x11280,
        0x11287,
        0x11288,
@@ -75034,6 +75629,8 @@ static const UV _Perl_SCX_invlist[] = {  /* for ASCII/Latin1 */
        0x11AB0,
        0x11AC0,
        0x11AF9,
+       0x11B00,
+       0x11B0A,
        0x11C00,
        0x11C09,
        0x11C0A,
@@ -75076,6 +75673,12 @@ static const UV _Perl_SCX_invlist[] = {  /* for ASCII/Latin1 */
        0x11DAA,
        0x11EE0,
        0x11EF9,
+       0x11F00,
+       0x11F11,
+       0x11F12,
+       0x11F3B,
+       0x11F3E,
+       0x11F5A,
        0x11FB0,
        0x11FB1,
        0x11FC0,
@@ -75096,9 +75699,7 @@ static const UV _Perl_SCX_invlist[] = {  /* for ASCII/Latin1 */
        0x12F90,
        0x12FF3,
        0x13000,
-       0x1342F,
-       0x13430,
-       0x13439,
+       0x13456,
        0x14400,
        0x14647,
        0x16800,
@@ -75158,8 +75759,12 @@ static const UV _Perl_SCX_invlist[] = {  /* for ASCII/Latin1 */
        0x1B001,
        0x1B120,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -75196,6 +75801,8 @@ static const UV _Perl_SCX_invlist[] = {  /* for ASCII/Latin1 */
        0x1D1EB,
        0x1D200,
        0x1D246,
+       0x1D2C0,
+       0x1D2D4,
        0x1D2E0,
        0x1D2F4,
        0x1D300,
@@ -75252,6 +75859,8 @@ static const UV _Perl_SCX_invlist[] = {  /* for ASCII/Latin1 */
        0x1DAB0,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
        0x1E000,
        0x1E007,
        0x1E008,
@@ -75262,6 +75871,10 @@ static const UV _Perl_SCX_invlist[] = {  /* for ASCII/Latin1 */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E030,
+       0x1E06E,
+       0x1E08F,
+       0x1E090,
        0x1E100,
        0x1E12D,
        0x1E130,
@@ -75276,6 +75889,8 @@ static const UV _Perl_SCX_invlist[] = {  /* for ASCII/Latin1 */
        0x1E2FA,
        0x1E2FF,
        0x1E300,
+       0x1E4D0,
+       0x1E4FA,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -75394,14 +76009,14 @@ static const UV _Perl_SCX_invlist[] = {  /* for ASCII/Latin1 */
        0x1F266,
        0x1F300,
        0x1F6D8,
-       0x1F6DD,
+       0x1F6DC,
        0x1F6ED,
        0x1F6F0,
        0x1F6FD,
        0x1F700,
-       0x1F774,
-       0x1F780,
-       0x1F7D9,
+       0x1F777,
+       0x1F77B,
+       0x1F7DA,
        0x1F7E0,
        0x1F7EC,
        0x1F7F0,
@@ -75423,23 +76038,19 @@ static const UV _Perl_SCX_invlist[] = {  /* for ASCII/Latin1 */
        0x1FA60,
        0x1FA6E,
        0x1FA70,
-       0x1FA75,
-       0x1FA78,
        0x1FA7D,
        0x1FA80,
-       0x1FA87,
+       0x1FA89,
        0x1FA90,
-       0x1FAAD,
-       0x1FAB0,
-       0x1FABB,
-       0x1FAC0,
+       0x1FABE,
+       0x1FABF,
        0x1FAC6,
-       0x1FAD0,
-       0x1FADA,
+       0x1FACE,
+       0x1FADC,
        0x1FAE0,
-       0x1FAE8,
+       0x1FAE9,
        0x1FAF0,
-       0x1FAF7,
+       0x1FAF9,
        0x1FB00,
        0x1FB93,
        0x1FB94,
@@ -75449,7 +76060,7 @@ static const UV _Perl_SCX_invlist[] = {  /* for ASCII/Latin1 */
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -75460,6 +76071,8 @@ static const UV _Perl_SCX_invlist[] = {  /* for ASCII/Latin1 */
        0x2FA1E,
        0x30000,
        0x3134B,
+       0x31350,
+       0x323B0,
        0xE0001,
        0xE0002,
        0xE0020,
@@ -75545,106 +76158,108 @@ typedef enum {
        SCX_Kaithi = 63,
        SCX_Kannada = 64,
        SCX_Katakana = 65,
-       SCX_Kayah_Li = 66,
-       SCX_Kharoshthi = 67,
-       SCX_Khitan_Small_Script = 68,
-       SCX_Khmer = 69,
-       SCX_Khojki = 70,
-       SCX_Khudawadi = 71,
-       SCX_Kore = 72,
-       SCX_Lao = 73,
-       SCX_Latin = 74,
-       SCX_Lepcha = 75,
-       SCX_Limbu = 76,
-       SCX_Linear_A = 77,
-       SCX_Linear_B = 78,
-       SCX_Lisu = 79,
-       SCX_Lycian = 80,
-       SCX_Lydian = 81,
-       SCX_Mahajani = 82,
-       SCX_Makasar = 83,
-       SCX_Malayalam = 84,
-       SCX_Mandaic = 85,
-       SCX_Manichaean = 86,
-       SCX_Marchen = 87,
-       SCX_Masaram_Gondi = 88,
-       SCX_Medefaidrin = 89,
-       SCX_Meetei_Mayek = 90,
-       SCX_Mende_Kikakui = 91,
-       SCX_Meroitic_Cursive = 92,
-       SCX_Meroitic_Hieroglyphs = 93,
-       SCX_Miao = 94,
-       SCX_Modi = 95,
-       SCX_Mongolian = 96,
-       SCX_Mro = 97,
-       SCX_Multani = 98,
-       SCX_Myanmar = 99,
-       SCX_Nabataean = 100,
-       SCX_Nandinagari = 101,
-       SCX_New_Tai_Lue = 102,
-       SCX_Newa = 103,
-       SCX_Nko = 104,
-       SCX_Nushu = 105,
-       SCX_Nyiakeng_Puachue_Hmong = 106,
-       SCX_Ogham = 107,
-       SCX_Ol_Chiki = 108,
-       SCX_Old_Hungarian = 109,
-       SCX_Old_Italic = 110,
-       SCX_Old_North_Arabian = 111,
-       SCX_Old_Permic = 112,
-       SCX_Old_Persian = 113,
-       SCX_Old_Sogdian = 114,
-       SCX_Old_South_Arabian = 115,
-       SCX_Old_Turkic = 116,
-       SCX_Old_Uyghur = 117,
-       SCX_Oriya = 118,
-       SCX_Osage = 119,
-       SCX_Osmanya = 120,
-       SCX_Pahawh_Hmong = 121,
-       SCX_Palmyrene = 122,
-       SCX_Pau_Cin_Hau = 123,
-       SCX_Phags_Pa = 124,
-       SCX_Phoenician = 125,
-       SCX_Psalter_Pahlavi = 126,
-       SCX_Rejang = 127,
-       SCX_Runic = 128,
-       SCX_Samaritan = 129,
-       SCX_Saurashtra = 130,
-       SCX_Sharada = 131,
-       SCX_Shavian = 132,
-       SCX_Siddham = 133,
-       SCX_SignWriting = 134,
-       SCX_Sinhala = 135,
-       SCX_Sogdian = 136,
-       SCX_Sora_Sompeng = 137,
-       SCX_Soyombo = 138,
-       SCX_Sundanese = 139,
-       SCX_Syloti_Nagri = 140,
-       SCX_Syriac = 141,
-       SCX_Tagalog = 142,
-       SCX_Tagbanwa = 143,
-       SCX_Tai_Le = 144,
-       SCX_Tai_Tham = 145,
-       SCX_Tai_Viet = 146,
-       SCX_Takri = 147,
-       SCX_Tamil = 148,
-       SCX_Tangsa = 149,
-       SCX_Tangut = 150,
-       SCX_Telugu = 151,
-       SCX_Thaana = 152,
-       SCX_Thai = 153,
-       SCX_Tibetan = 154,
-       SCX_Tifinagh = 155,
-       SCX_Tirhuta = 156,
-       SCX_Toto = 157,
-       SCX_Ugaritic = 158,
-       SCX_Vai = 159,
-       SCX_Vithkuqi = 160,
-       SCX_Wancho = 161,
-       SCX_Warang_Citi = 162,
-       SCX_Yezidi = 163,
-       SCX_Yi = 164,
-       SCX_Zanabazar_Square = 165,
+       SCX_Kawi = 66,
+       SCX_Kayah_Li = 67,
+       SCX_Kharoshthi = 68,
+       SCX_Khitan_Small_Script = 69,
+       SCX_Khmer = 70,
+       SCX_Khojki = 71,
+       SCX_Khudawadi = 72,
+       SCX_Kore = 73,
+       SCX_Lao = 74,
+       SCX_Latin = 75,
+       SCX_Lepcha = 76,
+       SCX_Limbu = 77,
+       SCX_Linear_A = 78,
+       SCX_Linear_B = 79,
+       SCX_Lisu = 80,
+       SCX_Lycian = 81,
+       SCX_Lydian = 82,
+       SCX_Mahajani = 83,
+       SCX_Makasar = 84,
+       SCX_Malayalam = 85,
+       SCX_Mandaic = 86,
+       SCX_Manichaean = 87,
+       SCX_Marchen = 88,
+       SCX_Masaram_Gondi = 89,
+       SCX_Medefaidrin = 90,
+       SCX_Meetei_Mayek = 91,
+       SCX_Mende_Kikakui = 92,
+       SCX_Meroitic_Cursive = 93,
+       SCX_Meroitic_Hieroglyphs = 94,
+       SCX_Miao = 95,
+       SCX_Modi = 96,
+       SCX_Mongolian = 97,
+       SCX_Mro = 98,
+       SCX_Multani = 99,
+       SCX_Myanmar = 100,
+       SCX_Nabataean = 101,
+       SCX_Nag_Mundari = 102,
+       SCX_Nandinagari = 103,
+       SCX_New_Tai_Lue = 104,
+       SCX_Newa = 105,
+       SCX_Nko = 106,
+       SCX_Nushu = 107,
+       SCX_Nyiakeng_Puachue_Hmong = 108,
+       SCX_Ogham = 109,
+       SCX_Ol_Chiki = 110,
+       SCX_Old_Hungarian = 111,
+       SCX_Old_Italic = 112,
+       SCX_Old_North_Arabian = 113,
+       SCX_Old_Permic = 114,
+       SCX_Old_Persian = 115,
+       SCX_Old_Sogdian = 116,
+       SCX_Old_South_Arabian = 117,
+       SCX_Old_Turkic = 118,
+       SCX_Old_Uyghur = 119,
+       SCX_Oriya = 120,
+       SCX_Osage = 121,
+       SCX_Osmanya = 122,
+       SCX_Pahawh_Hmong = 123,
+       SCX_Palmyrene = 124,
+       SCX_Pau_Cin_Hau = 125,
+       SCX_Phags_Pa = 126,
+       SCX_Phoenician = 127,
+       SCX_Psalter_Pahlavi = 128,
+       SCX_Rejang = 129,
+       SCX_Runic = 130,
+       SCX_Samaritan = 131,
+       SCX_Saurashtra = 132,
+       SCX_Sharada = 133,
+       SCX_Shavian = 134,
+       SCX_Siddham = 135,
+       SCX_SignWriting = 136,
+       SCX_Sinhala = 137,
+       SCX_Sogdian = 138,
+       SCX_Sora_Sompeng = 139,
+       SCX_Soyombo = 140,
+       SCX_Sundanese = 141,
+       SCX_Syloti_Nagri = 142,
+       SCX_Syriac = 143,
+       SCX_Tagalog = 144,
+       SCX_Tagbanwa = 145,
+       SCX_Tai_Le = 146,
+       SCX_Tai_Tham = 147,
+       SCX_Tai_Viet = 148,
+       SCX_Takri = 149,
+       SCX_Tamil = 150,
+       SCX_Tangsa = 151,
+       SCX_Tangut = 152,
+       SCX_Telugu = 153,
+       SCX_Thaana = 154,
+       SCX_Thai = 155,
+       SCX_Tibetan = 156,
+       SCX_Tifinagh = 157,
+       SCX_Tirhuta = 158,
+       SCX_Toto = 159,
+       SCX_Ugaritic = 160,
+       SCX_Vai = 161,
+       SCX_Vithkuqi = 162,
+       SCX_Wancho = 163,
+       SCX_Warang_Citi = 164,
+       SCX_Yezidi = 165,
+       SCX_Yi = 166,
+       SCX_Zanabazar_Square = 167,
        SCX_use_AUX_TABLE_1 = -1,
        SCX_use_AUX_TABLE_2 = -2,
        SCX_use_AUX_TABLE_3 = -3,
@@ -76366,6 +76981,7 @@ static const UV script_zeros[] = {
        0x966,  /* Kaithi */
        0xce6,  /* Kannada */
        '0',    /* Katakana */
+       0x11f50,        /* Kawi */
        0xa900, /* Kayah_Li */
        '0',    /* Kharoshthi */
        '0',    /* Khitan_Small_Script */
@@ -76401,6 +77017,7 @@ static const UV script_zeros[] = {
        0xa66,  /* Multani */
         0,     /* Myanmar */
        '0',    /* Nabataean */
+       0x1e4f0,        /* Nag_Mundari */
        0xce6,  /* Nandinagari */
        0x19d0, /* New_Tai_Lue */
        0x11450,        /* Newa */
@@ -77619,6 +78236,7 @@ static const SCX_enum _Perl_SCX_invmap[] = {  /* for ASCII/Latin1 */
        SCX_Unknown,
        SCX_Yezidi,
        SCX_Unknown,
+       SCX_Arabic,
        SCX_Old_Sogdian,
        SCX_Unknown,
        SCX_Sogdian,
@@ -77766,6 +78384,8 @@ static const SCX_enum _Perl_SCX_invmap[] = {  /* for ASCII/Latin1 */
        SCX_Canadian_Aboriginal,
        SCX_Pau_Cin_Hau,
        SCX_Unknown,
+       SCX_Devanagari,
+       SCX_Unknown,
        SCX_Bhaiksuki,
        SCX_Unknown,
        SCX_Bhaiksuki,
@@ -77808,6 +78428,12 @@ static const SCX_enum _Perl_SCX_invmap[] = {  /* for ASCII/Latin1 */
        SCX_Unknown,
        SCX_Makasar,
        SCX_Unknown,
+       SCX_Kawi,
+       SCX_Unknown,
+       SCX_Kawi,
+       SCX_Unknown,
+       SCX_Kawi,
+       SCX_Unknown,
        SCX_Lisu,
        SCX_Unknown,
        SCX_Tamil,
@@ -77829,8 +78455,6 @@ static const SCX_enum _Perl_SCX_invmap[] = {  /* for ASCII/Latin1 */
        SCX_Unknown,
        SCX_Egyptian_Hieroglyphs,
        SCX_Unknown,
-       SCX_Egyptian_Hieroglyphs,
-       SCX_Unknown,
        SCX_Anatolian_Hieroglyphs,
        SCX_Unknown,
        SCX_Bamum,
@@ -77892,6 +78516,10 @@ static const SCX_enum _Perl_SCX_invmap[] = {  /* for ASCII/Latin1 */
        SCX_Unknown,
        SCX_use_AUX_TABLE_44,
        SCX_Unknown,
+       SCX_use_AUX_TABLE_44,
+       SCX_Unknown,
+       SCX_use_AUX_TABLE_45,
+       SCX_Unknown,
        SCX_use_AUX_TABLE_45,
        SCX_Unknown,
        SCX_Nushu,
@@ -77932,6 +78560,8 @@ static const SCX_enum _Perl_SCX_invmap[] = {  /* for ASCII/Latin1 */
        SCX_Unknown,
        SCX_Common,
        SCX_Unknown,
+       SCX_Common,
+       SCX_Unknown,
        SCX_use_AUX_TABLE_38,
        SCX_Common,
        SCX_Unknown,
@@ -77984,6 +78614,8 @@ static const SCX_enum _Perl_SCX_invmap[] = {  /* for ASCII/Latin1 */
        SCX_Unknown,
        SCX_Latin,
        SCX_Unknown,
+       SCX_Latin,
+       SCX_Unknown,
        SCX_Glagolitic,
        SCX_Unknown,
        SCX_Glagolitic,
@@ -77994,6 +78626,10 @@ static const SCX_enum _Perl_SCX_invmap[] = {  /* for ASCII/Latin1 */
        SCX_Unknown,
        SCX_Glagolitic,
        SCX_Unknown,
+       SCX_Cyrillic,
+       SCX_Unknown,
+       SCX_Cyrillic,
+       SCX_Unknown,
        SCX_Nyiakeng_Puachue_Hmong,
        SCX_Unknown,
        SCX_Nyiakeng_Puachue_Hmong,
@@ -78008,6 +78644,8 @@ static const SCX_enum _Perl_SCX_invmap[] = {  /* for ASCII/Latin1 */
        SCX_Unknown,
        SCX_Wancho,
        SCX_Unknown,
+       SCX_Nag_Mundari,
+       SCX_Unknown,
        SCX_Ethiopic,
        SCX_Unknown,
        SCX_Ethiopic,
@@ -78174,9 +78812,7 @@ static const SCX_enum _Perl_SCX_invmap[] = {  /* for ASCII/Latin1 */
        SCX_Unknown,
        SCX_Common,
        SCX_Unknown,
-       SCX_Common,
-       SCX_Unknown,
-       SCX_Common,
+       SCX_use_AUX_TABLE_38,
        SCX_Unknown,
        SCX_use_AUX_TABLE_38,
        SCX_Unknown,
@@ -78212,7 +78848,7 @@ static const SCX_enum _Perl_SCX_invmap[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV _Perl_SCX_invlist[] = {  /* for EBCDIC 1047 */
-       1757,   /* Number of elements */
+       1776,   /* Number of elements */
        148565664, /* Version and data structure type */
        0,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -78568,7 +79204,7 @@ static const UV _Perl_SCX_invlist[] = {  /* for EBCDIC 1047 */
        0xCE6,
        0xCF0,
        0xCF1,
-       0xCF3,
+       0xCF4,
        0xD00,
        0xD0D,
        0xD0E,
@@ -78629,7 +79265,7 @@ static const UV _Perl_SCX_invlist[] = {  /* for EBCDIC 1047 */
        0xEC6,
        0xEC7,
        0xEC8,
-       0xECE,
+       0xECF,
        0xED0,
        0xEDA,
        0xEDC,
@@ -79394,6 +80030,7 @@ static const UV _Perl_SCX_invlist[] = {  /* for EBCDIC 1047 */
        0x10EAE,
        0x10EB0,
        0x10EB2,
+       0x10EFD,
        0x10F00,
        0x10F28,
        0x10F30,
@@ -79430,7 +80067,7 @@ static const UV _Perl_SCX_invlist[] = {  /* for EBCDIC 1047 */
        0x11200,
        0x11212,
        0x11213,
-       0x1123F,
+       0x11242,
        0x11280,
        0x11287,
        0x11288,
@@ -79541,6 +80178,8 @@ static const UV _Perl_SCX_invlist[] = {  /* for EBCDIC 1047 */
        0x11AB0,
        0x11AC0,
        0x11AF9,
+       0x11B00,
+       0x11B0A,
        0x11C00,
        0x11C09,
        0x11C0A,
@@ -79583,6 +80222,12 @@ static const UV _Perl_SCX_invlist[] = {  /* for EBCDIC 1047 */
        0x11DAA,
        0x11EE0,
        0x11EF9,
+       0x11F00,
+       0x11F11,
+       0x11F12,
+       0x11F3B,
+       0x11F3E,
+       0x11F5A,
        0x11FB0,
        0x11FB1,
        0x11FC0,
@@ -79603,9 +80248,7 @@ static const UV _Perl_SCX_invlist[] = {  /* for EBCDIC 1047 */
        0x12F90,
        0x12FF3,
        0x13000,
-       0x1342F,
-       0x13430,
-       0x13439,
+       0x13456,
        0x14400,
        0x14647,
        0x16800,
@@ -79665,8 +80308,12 @@ static const UV _Perl_SCX_invlist[] = {  /* for EBCDIC 1047 */
        0x1B001,
        0x1B120,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -79703,6 +80350,8 @@ static const UV _Perl_SCX_invlist[] = {  /* for EBCDIC 1047 */
        0x1D1EB,
        0x1D200,
        0x1D246,
+       0x1D2C0,
+       0x1D2D4,
        0x1D2E0,
        0x1D2F4,
        0x1D300,
@@ -79759,6 +80408,8 @@ static const UV _Perl_SCX_invlist[] = {  /* for EBCDIC 1047 */
        0x1DAB0,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
        0x1E000,
        0x1E007,
        0x1E008,
@@ -79769,6 +80420,10 @@ static const UV _Perl_SCX_invlist[] = {  /* for EBCDIC 1047 */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E030,
+       0x1E06E,
+       0x1E08F,
+       0x1E090,
        0x1E100,
        0x1E12D,
        0x1E130,
@@ -79783,6 +80438,8 @@ static const UV _Perl_SCX_invlist[] = {  /* for EBCDIC 1047 */
        0x1E2FA,
        0x1E2FF,
        0x1E300,
+       0x1E4D0,
+       0x1E4FA,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -79901,14 +80558,14 @@ static const UV _Perl_SCX_invlist[] = {  /* for EBCDIC 1047 */
        0x1F266,
        0x1F300,
        0x1F6D8,
-       0x1F6DD,
+       0x1F6DC,
        0x1F6ED,
        0x1F6F0,
        0x1F6FD,
        0x1F700,
-       0x1F774,
-       0x1F780,
-       0x1F7D9,
+       0x1F777,
+       0x1F77B,
+       0x1F7DA,
        0x1F7E0,
        0x1F7EC,
        0x1F7F0,
@@ -79930,23 +80587,19 @@ static const UV _Perl_SCX_invlist[] = {  /* for EBCDIC 1047 */
        0x1FA60,
        0x1FA6E,
        0x1FA70,
-       0x1FA75,
-       0x1FA78,
        0x1FA7D,
        0x1FA80,
-       0x1FA87,
+       0x1FA89,
        0x1FA90,
-       0x1FAAD,
-       0x1FAB0,
-       0x1FABB,
-       0x1FAC0,
+       0x1FABE,
+       0x1FABF,
        0x1FAC6,
-       0x1FAD0,
-       0x1FADA,
+       0x1FACE,
+       0x1FADC,
        0x1FAE0,
-       0x1FAE8,
+       0x1FAE9,
        0x1FAF0,
-       0x1FAF7,
+       0x1FAF9,
        0x1FB00,
        0x1FB93,
        0x1FB94,
@@ -79956,7 +80609,7 @@ static const UV _Perl_SCX_invlist[] = {  /* for EBCDIC 1047 */
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -79967,6 +80620,8 @@ static const UV _Perl_SCX_invlist[] = {  /* for EBCDIC 1047 */
        0x2FA1E,
        0x30000,
        0x3134B,
+       0x31350,
+       0x323B0,
        0xE0001,
        0xE0002,
        0xE0020,
@@ -80055,106 +80710,108 @@ typedef enum {
        SCX_Kaithi = 63,
        SCX_Kannada = 64,
        SCX_Katakana = 65,
-       SCX_Kayah_Li = 66,
-       SCX_Kharoshthi = 67,
-       SCX_Khitan_Small_Script = 68,
-       SCX_Khmer = 69,
-       SCX_Khojki = 70,
-       SCX_Khudawadi = 71,
-       SCX_Kore = 72,
-       SCX_Lao = 73,
-       SCX_Latin = 74,
-       SCX_Lepcha = 75,
-       SCX_Limbu = 76,
-       SCX_Linear_A = 77,
-       SCX_Linear_B = 78,
-       SCX_Lisu = 79,
-       SCX_Lycian = 80,
-       SCX_Lydian = 81,
-       SCX_Mahajani = 82,
-       SCX_Makasar = 83,
-       SCX_Malayalam = 84,
-       SCX_Mandaic = 85,
-       SCX_Manichaean = 86,
-       SCX_Marchen = 87,
-       SCX_Masaram_Gondi = 88,
-       SCX_Medefaidrin = 89,
-       SCX_Meetei_Mayek = 90,
-       SCX_Mende_Kikakui = 91,
-       SCX_Meroitic_Cursive = 92,
-       SCX_Meroitic_Hieroglyphs = 93,
-       SCX_Miao = 94,
-       SCX_Modi = 95,
-       SCX_Mongolian = 96,
-       SCX_Mro = 97,
-       SCX_Multani = 98,
-       SCX_Myanmar = 99,
-       SCX_Nabataean = 100,
-       SCX_Nandinagari = 101,
-       SCX_New_Tai_Lue = 102,
-       SCX_Newa = 103,
-       SCX_Nko = 104,
-       SCX_Nushu = 105,
-       SCX_Nyiakeng_Puachue_Hmong = 106,
-       SCX_Ogham = 107,
-       SCX_Ol_Chiki = 108,
-       SCX_Old_Hungarian = 109,
-       SCX_Old_Italic = 110,
-       SCX_Old_North_Arabian = 111,
-       SCX_Old_Permic = 112,
-       SCX_Old_Persian = 113,
-       SCX_Old_Sogdian = 114,
-       SCX_Old_South_Arabian = 115,
-       SCX_Old_Turkic = 116,
-       SCX_Old_Uyghur = 117,
-       SCX_Oriya = 118,
-       SCX_Osage = 119,
-       SCX_Osmanya = 120,
-       SCX_Pahawh_Hmong = 121,
-       SCX_Palmyrene = 122,
-       SCX_Pau_Cin_Hau = 123,
-       SCX_Phags_Pa = 124,
-       SCX_Phoenician = 125,
-       SCX_Psalter_Pahlavi = 126,
-       SCX_Rejang = 127,
-       SCX_Runic = 128,
-       SCX_Samaritan = 129,
-       SCX_Saurashtra = 130,
-       SCX_Sharada = 131,
-       SCX_Shavian = 132,
-       SCX_Siddham = 133,
-       SCX_SignWriting = 134,
-       SCX_Sinhala = 135,
-       SCX_Sogdian = 136,
-       SCX_Sora_Sompeng = 137,
-       SCX_Soyombo = 138,
-       SCX_Sundanese = 139,
-       SCX_Syloti_Nagri = 140,
-       SCX_Syriac = 141,
-       SCX_Tagalog = 142,
-       SCX_Tagbanwa = 143,
-       SCX_Tai_Le = 144,
-       SCX_Tai_Tham = 145,
-       SCX_Tai_Viet = 146,
-       SCX_Takri = 147,
-       SCX_Tamil = 148,
-       SCX_Tangsa = 149,
-       SCX_Tangut = 150,
-       SCX_Telugu = 151,
-       SCX_Thaana = 152,
-       SCX_Thai = 153,
-       SCX_Tibetan = 154,
-       SCX_Tifinagh = 155,
-       SCX_Tirhuta = 156,
-       SCX_Toto = 157,
-       SCX_Ugaritic = 158,
-       SCX_Vai = 159,
-       SCX_Vithkuqi = 160,
-       SCX_Wancho = 161,
-       SCX_Warang_Citi = 162,
-       SCX_Yezidi = 163,
-       SCX_Yi = 164,
-       SCX_Zanabazar_Square = 165,
+       SCX_Kawi = 66,
+       SCX_Kayah_Li = 67,
+       SCX_Kharoshthi = 68,
+       SCX_Khitan_Small_Script = 69,
+       SCX_Khmer = 70,
+       SCX_Khojki = 71,
+       SCX_Khudawadi = 72,
+       SCX_Kore = 73,
+       SCX_Lao = 74,
+       SCX_Latin = 75,
+       SCX_Lepcha = 76,
+       SCX_Limbu = 77,
+       SCX_Linear_A = 78,
+       SCX_Linear_B = 79,
+       SCX_Lisu = 80,
+       SCX_Lycian = 81,
+       SCX_Lydian = 82,
+       SCX_Mahajani = 83,
+       SCX_Makasar = 84,
+       SCX_Malayalam = 85,
+       SCX_Mandaic = 86,
+       SCX_Manichaean = 87,
+       SCX_Marchen = 88,
+       SCX_Masaram_Gondi = 89,
+       SCX_Medefaidrin = 90,
+       SCX_Meetei_Mayek = 91,
+       SCX_Mende_Kikakui = 92,
+       SCX_Meroitic_Cursive = 93,
+       SCX_Meroitic_Hieroglyphs = 94,
+       SCX_Miao = 95,
+       SCX_Modi = 96,
+       SCX_Mongolian = 97,
+       SCX_Mro = 98,
+       SCX_Multani = 99,
+       SCX_Myanmar = 100,
+       SCX_Nabataean = 101,
+       SCX_Nag_Mundari = 102,
+       SCX_Nandinagari = 103,
+       SCX_New_Tai_Lue = 104,
+       SCX_Newa = 105,
+       SCX_Nko = 106,
+       SCX_Nushu = 107,
+       SCX_Nyiakeng_Puachue_Hmong = 108,
+       SCX_Ogham = 109,
+       SCX_Ol_Chiki = 110,
+       SCX_Old_Hungarian = 111,
+       SCX_Old_Italic = 112,
+       SCX_Old_North_Arabian = 113,
+       SCX_Old_Permic = 114,
+       SCX_Old_Persian = 115,
+       SCX_Old_Sogdian = 116,
+       SCX_Old_South_Arabian = 117,
+       SCX_Old_Turkic = 118,
+       SCX_Old_Uyghur = 119,
+       SCX_Oriya = 120,
+       SCX_Osage = 121,
+       SCX_Osmanya = 122,
+       SCX_Pahawh_Hmong = 123,
+       SCX_Palmyrene = 124,
+       SCX_Pau_Cin_Hau = 125,
+       SCX_Phags_Pa = 126,
+       SCX_Phoenician = 127,
+       SCX_Psalter_Pahlavi = 128,
+       SCX_Rejang = 129,
+       SCX_Runic = 130,
+       SCX_Samaritan = 131,
+       SCX_Saurashtra = 132,
+       SCX_Sharada = 133,
+       SCX_Shavian = 134,
+       SCX_Siddham = 135,
+       SCX_SignWriting = 136,
+       SCX_Sinhala = 137,
+       SCX_Sogdian = 138,
+       SCX_Sora_Sompeng = 139,
+       SCX_Soyombo = 140,
+       SCX_Sundanese = 141,
+       SCX_Syloti_Nagri = 142,
+       SCX_Syriac = 143,
+       SCX_Tagalog = 144,
+       SCX_Tagbanwa = 145,
+       SCX_Tai_Le = 146,
+       SCX_Tai_Tham = 147,
+       SCX_Tai_Viet = 148,
+       SCX_Takri = 149,
+       SCX_Tamil = 150,
+       SCX_Tangsa = 151,
+       SCX_Tangut = 152,
+       SCX_Telugu = 153,
+       SCX_Thaana = 154,
+       SCX_Thai = 155,
+       SCX_Tibetan = 156,
+       SCX_Tifinagh = 157,
+       SCX_Tirhuta = 158,
+       SCX_Toto = 159,
+       SCX_Ugaritic = 160,
+       SCX_Vai = 161,
+       SCX_Vithkuqi = 162,
+       SCX_Wancho = 163,
+       SCX_Warang_Citi = 164,
+       SCX_Yezidi = 165,
+       SCX_Yi = 166,
+       SCX_Zanabazar_Square = 167,
        SCX_use_AUX_TABLE_1 = -1,
        SCX_use_AUX_TABLE_2 = -2,
        SCX_use_AUX_TABLE_3 = -3,
@@ -80879,6 +81536,7 @@ static const UV script_zeros[] = {
        0x966,  /* Kaithi */
        0xce6,  /* Kannada */
        '0',    /* Katakana */
+       0x11f50,        /* Kawi */
        0xa900, /* Kayah_Li */
        '0',    /* Kharoshthi */
        '0',    /* Khitan_Small_Script */
@@ -80914,6 +81572,7 @@ static const UV script_zeros[] = {
        0xa66,  /* Multani */
         0,     /* Myanmar */
        '0',    /* Nabataean */
+       0x1e4f0,        /* Nag_Mundari */
        0xce6,  /* Nandinagari */
        0x19d0, /* New_Tai_Lue */
        0x11450,        /* Newa */
@@ -82158,6 +82817,7 @@ static const SCX_enum _Perl_SCX_invmap[] = {  /* for EBCDIC 1047 */
        SCX_Unknown,
        SCX_Yezidi,
        SCX_Unknown,
+       SCX_Arabic,
        SCX_Old_Sogdian,
        SCX_Unknown,
        SCX_Sogdian,
@@ -82305,6 +82965,8 @@ static const SCX_enum _Perl_SCX_invmap[] = {  /* for EBCDIC 1047 */
        SCX_Canadian_Aboriginal,
        SCX_Pau_Cin_Hau,
        SCX_Unknown,
+       SCX_Devanagari,
+       SCX_Unknown,
        SCX_Bhaiksuki,
        SCX_Unknown,
        SCX_Bhaiksuki,
@@ -82347,6 +83009,12 @@ static const SCX_enum _Perl_SCX_invmap[] = {  /* for EBCDIC 1047 */
        SCX_Unknown,
        SCX_Makasar,
        SCX_Unknown,
+       SCX_Kawi,
+       SCX_Unknown,
+       SCX_Kawi,
+       SCX_Unknown,
+       SCX_Kawi,
+       SCX_Unknown,
        SCX_Lisu,
        SCX_Unknown,
        SCX_Tamil,
@@ -82368,8 +83036,6 @@ static const SCX_enum _Perl_SCX_invmap[] = {  /* for EBCDIC 1047 */
        SCX_Unknown,
        SCX_Egyptian_Hieroglyphs,
        SCX_Unknown,
-       SCX_Egyptian_Hieroglyphs,
-       SCX_Unknown,
        SCX_Anatolian_Hieroglyphs,
        SCX_Unknown,
        SCX_Bamum,
@@ -82431,6 +83097,10 @@ static const SCX_enum _Perl_SCX_invmap[] = {  /* for EBCDIC 1047 */
        SCX_Unknown,
        SCX_use_AUX_TABLE_44,
        SCX_Unknown,
+       SCX_use_AUX_TABLE_44,
+       SCX_Unknown,
+       SCX_use_AUX_TABLE_45,
+       SCX_Unknown,
        SCX_use_AUX_TABLE_45,
        SCX_Unknown,
        SCX_Nushu,
@@ -82471,6 +83141,8 @@ static const SCX_enum _Perl_SCX_invmap[] = {  /* for EBCDIC 1047 */
        SCX_Unknown,
        SCX_Common,
        SCX_Unknown,
+       SCX_Common,
+       SCX_Unknown,
        SCX_use_AUX_TABLE_38,
        SCX_Common,
        SCX_Unknown,
@@ -82523,6 +83195,8 @@ static const SCX_enum _Perl_SCX_invmap[] = {  /* for EBCDIC 1047 */
        SCX_Unknown,
        SCX_Latin,
        SCX_Unknown,
+       SCX_Latin,
+       SCX_Unknown,
        SCX_Glagolitic,
        SCX_Unknown,
        SCX_Glagolitic,
@@ -82533,6 +83207,10 @@ static const SCX_enum _Perl_SCX_invmap[] = {  /* for EBCDIC 1047 */
        SCX_Unknown,
        SCX_Glagolitic,
        SCX_Unknown,
+       SCX_Cyrillic,
+       SCX_Unknown,
+       SCX_Cyrillic,
+       SCX_Unknown,
        SCX_Nyiakeng_Puachue_Hmong,
        SCX_Unknown,
        SCX_Nyiakeng_Puachue_Hmong,
@@ -82547,6 +83225,8 @@ static const SCX_enum _Perl_SCX_invmap[] = {  /* for EBCDIC 1047 */
        SCX_Unknown,
        SCX_Wancho,
        SCX_Unknown,
+       SCX_Nag_Mundari,
+       SCX_Unknown,
        SCX_Ethiopic,
        SCX_Unknown,
        SCX_Ethiopic,
@@ -82713,9 +83393,7 @@ static const SCX_enum _Perl_SCX_invmap[] = {  /* for EBCDIC 1047 */
        SCX_Unknown,
        SCX_Common,
        SCX_Unknown,
-       SCX_Common,
-       SCX_Unknown,
-       SCX_Common,
+       SCX_use_AUX_TABLE_38,
        SCX_Unknown,
        SCX_use_AUX_TABLE_38,
        SCX_Unknown,
@@ -82751,7 +83429,7 @@ static const SCX_enum _Perl_SCX_invmap[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV _Perl_SCX_invlist[] = {  /* for EBCDIC 037 */
-       1753,   /* Number of elements */
+       1772,   /* Number of elements */
        148565664, /* Version and data structure type */
        0,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -83103,7 +83781,7 @@ static const UV _Perl_SCX_invlist[] = {  /* for EBCDIC 037 */
        0xCE6,
        0xCF0,
        0xCF1,
-       0xCF3,
+       0xCF4,
        0xD00,
        0xD0D,
        0xD0E,
@@ -83164,7 +83842,7 @@ static const UV _Perl_SCX_invlist[] = {  /* for EBCDIC 037 */
        0xEC6,
        0xEC7,
        0xEC8,
-       0xECE,
+       0xECF,
        0xED0,
        0xEDA,
        0xEDC,
@@ -83929,6 +84607,7 @@ static const UV _Perl_SCX_invlist[] = {  /* for EBCDIC 037 */
        0x10EAE,
        0x10EB0,
        0x10EB2,
+       0x10EFD,
        0x10F00,
        0x10F28,
        0x10F30,
@@ -83965,7 +84644,7 @@ static const UV _Perl_SCX_invlist[] = {  /* for EBCDIC 037 */
        0x11200,
        0x11212,
        0x11213,
-       0x1123F,
+       0x11242,
        0x11280,
        0x11287,
        0x11288,
@@ -84076,6 +84755,8 @@ static const UV _Perl_SCX_invlist[] = {  /* for EBCDIC 037 */
        0x11AB0,
        0x11AC0,
        0x11AF9,
+       0x11B00,
+       0x11B0A,
        0x11C00,
        0x11C09,
        0x11C0A,
@@ -84118,6 +84799,12 @@ static const UV _Perl_SCX_invlist[] = {  /* for EBCDIC 037 */
        0x11DAA,
        0x11EE0,
        0x11EF9,
+       0x11F00,
+       0x11F11,
+       0x11F12,
+       0x11F3B,
+       0x11F3E,
+       0x11F5A,
        0x11FB0,
        0x11FB1,
        0x11FC0,
@@ -84138,9 +84825,7 @@ static const UV _Perl_SCX_invlist[] = {  /* for EBCDIC 037 */
        0x12F90,
        0x12FF3,
        0x13000,
-       0x1342F,
-       0x13430,
-       0x13439,
+       0x13456,
        0x14400,
        0x14647,
        0x16800,
@@ -84200,8 +84885,12 @@ static const UV _Perl_SCX_invlist[] = {  /* for EBCDIC 037 */
        0x1B001,
        0x1B120,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -84238,6 +84927,8 @@ static const UV _Perl_SCX_invlist[] = {  /* for EBCDIC 037 */
        0x1D1EB,
        0x1D200,
        0x1D246,
+       0x1D2C0,
+       0x1D2D4,
        0x1D2E0,
        0x1D2F4,
        0x1D300,
@@ -84294,6 +84985,8 @@ static const UV _Perl_SCX_invlist[] = {  /* for EBCDIC 037 */
        0x1DAB0,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
        0x1E000,
        0x1E007,
        0x1E008,
@@ -84304,6 +84997,10 @@ static const UV _Perl_SCX_invlist[] = {  /* for EBCDIC 037 */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E030,
+       0x1E06E,
+       0x1E08F,
+       0x1E090,
        0x1E100,
        0x1E12D,
        0x1E130,
@@ -84318,6 +85015,8 @@ static const UV _Perl_SCX_invlist[] = {  /* for EBCDIC 037 */
        0x1E2FA,
        0x1E2FF,
        0x1E300,
+       0x1E4D0,
+       0x1E4FA,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -84436,14 +85135,14 @@ static const UV _Perl_SCX_invlist[] = {  /* for EBCDIC 037 */
        0x1F266,
        0x1F300,
        0x1F6D8,
-       0x1F6DD,
+       0x1F6DC,
        0x1F6ED,
        0x1F6F0,
        0x1F6FD,
        0x1F700,
-       0x1F774,
-       0x1F780,
-       0x1F7D9,
+       0x1F777,
+       0x1F77B,
+       0x1F7DA,
        0x1F7E0,
        0x1F7EC,
        0x1F7F0,
@@ -84465,23 +85164,19 @@ static const UV _Perl_SCX_invlist[] = {  /* for EBCDIC 037 */
        0x1FA60,
        0x1FA6E,
        0x1FA70,
-       0x1FA75,
-       0x1FA78,
        0x1FA7D,
        0x1FA80,
-       0x1FA87,
+       0x1FA89,
        0x1FA90,
-       0x1FAAD,
-       0x1FAB0,
-       0x1FABB,
-       0x1FAC0,
+       0x1FABE,
+       0x1FABF,
        0x1FAC6,
-       0x1FAD0,
-       0x1FADA,
+       0x1FACE,
+       0x1FADC,
        0x1FAE0,
-       0x1FAE8,
+       0x1FAE9,
        0x1FAF0,
-       0x1FAF7,
+       0x1FAF9,
        0x1FB00,
        0x1FB93,
        0x1FB94,
@@ -84491,7 +85186,7 @@ static const UV _Perl_SCX_invlist[] = {  /* for EBCDIC 037 */
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -84502,6 +85197,8 @@ static const UV _Perl_SCX_invlist[] = {  /* for EBCDIC 037 */
        0x2FA1E,
        0x30000,
        0x3134B,
+       0x31350,
+       0x323B0,
        0xE0001,
        0xE0002,
        0xE0020,
@@ -84590,106 +85287,108 @@ typedef enum {
        SCX_Kaithi = 63,
        SCX_Kannada = 64,
        SCX_Katakana = 65,
-       SCX_Kayah_Li = 66,
-       SCX_Kharoshthi = 67,
-       SCX_Khitan_Small_Script = 68,
-       SCX_Khmer = 69,
-       SCX_Khojki = 70,
-       SCX_Khudawadi = 71,
-       SCX_Kore = 72,
-       SCX_Lao = 73,
-       SCX_Latin = 74,
-       SCX_Lepcha = 75,
-       SCX_Limbu = 76,
-       SCX_Linear_A = 77,
-       SCX_Linear_B = 78,
-       SCX_Lisu = 79,
-       SCX_Lycian = 80,
-       SCX_Lydian = 81,
-       SCX_Mahajani = 82,
-       SCX_Makasar = 83,
-       SCX_Malayalam = 84,
-       SCX_Mandaic = 85,
-       SCX_Manichaean = 86,
-       SCX_Marchen = 87,
-       SCX_Masaram_Gondi = 88,
-       SCX_Medefaidrin = 89,
-       SCX_Meetei_Mayek = 90,
-       SCX_Mende_Kikakui = 91,
-       SCX_Meroitic_Cursive = 92,
-       SCX_Meroitic_Hieroglyphs = 93,
-       SCX_Miao = 94,
-       SCX_Modi = 95,
-       SCX_Mongolian = 96,
-       SCX_Mro = 97,
-       SCX_Multani = 98,
-       SCX_Myanmar = 99,
-       SCX_Nabataean = 100,
-       SCX_Nandinagari = 101,
-       SCX_New_Tai_Lue = 102,
-       SCX_Newa = 103,
-       SCX_Nko = 104,
-       SCX_Nushu = 105,
-       SCX_Nyiakeng_Puachue_Hmong = 106,
-       SCX_Ogham = 107,
-       SCX_Ol_Chiki = 108,
-       SCX_Old_Hungarian = 109,
-       SCX_Old_Italic = 110,
-       SCX_Old_North_Arabian = 111,
-       SCX_Old_Permic = 112,
-       SCX_Old_Persian = 113,
-       SCX_Old_Sogdian = 114,
-       SCX_Old_South_Arabian = 115,
-       SCX_Old_Turkic = 116,
-       SCX_Old_Uyghur = 117,
-       SCX_Oriya = 118,
-       SCX_Osage = 119,
-       SCX_Osmanya = 120,
-       SCX_Pahawh_Hmong = 121,
-       SCX_Palmyrene = 122,
-       SCX_Pau_Cin_Hau = 123,
-       SCX_Phags_Pa = 124,
-       SCX_Phoenician = 125,
-       SCX_Psalter_Pahlavi = 126,
-       SCX_Rejang = 127,
-       SCX_Runic = 128,
-       SCX_Samaritan = 129,
-       SCX_Saurashtra = 130,
-       SCX_Sharada = 131,
-       SCX_Shavian = 132,
-       SCX_Siddham = 133,
-       SCX_SignWriting = 134,
-       SCX_Sinhala = 135,
-       SCX_Sogdian = 136,
-       SCX_Sora_Sompeng = 137,
-       SCX_Soyombo = 138,
-       SCX_Sundanese = 139,
-       SCX_Syloti_Nagri = 140,
-       SCX_Syriac = 141,
-       SCX_Tagalog = 142,
-       SCX_Tagbanwa = 143,
-       SCX_Tai_Le = 144,
-       SCX_Tai_Tham = 145,
-       SCX_Tai_Viet = 146,
-       SCX_Takri = 147,
-       SCX_Tamil = 148,
-       SCX_Tangsa = 149,
-       SCX_Tangut = 150,
-       SCX_Telugu = 151,
-       SCX_Thaana = 152,
-       SCX_Thai = 153,
-       SCX_Tibetan = 154,
-       SCX_Tifinagh = 155,
-       SCX_Tirhuta = 156,
-       SCX_Toto = 157,
-       SCX_Ugaritic = 158,
-       SCX_Vai = 159,
-       SCX_Vithkuqi = 160,
-       SCX_Wancho = 161,
-       SCX_Warang_Citi = 162,
-       SCX_Yezidi = 163,
-       SCX_Yi = 164,
-       SCX_Zanabazar_Square = 165,
+       SCX_Kawi = 66,
+       SCX_Kayah_Li = 67,
+       SCX_Kharoshthi = 68,
+       SCX_Khitan_Small_Script = 69,
+       SCX_Khmer = 70,
+       SCX_Khojki = 71,
+       SCX_Khudawadi = 72,
+       SCX_Kore = 73,
+       SCX_Lao = 74,
+       SCX_Latin = 75,
+       SCX_Lepcha = 76,
+       SCX_Limbu = 77,
+       SCX_Linear_A = 78,
+       SCX_Linear_B = 79,
+       SCX_Lisu = 80,
+       SCX_Lycian = 81,
+       SCX_Lydian = 82,
+       SCX_Mahajani = 83,
+       SCX_Makasar = 84,
+       SCX_Malayalam = 85,
+       SCX_Mandaic = 86,
+       SCX_Manichaean = 87,
+       SCX_Marchen = 88,
+       SCX_Masaram_Gondi = 89,
+       SCX_Medefaidrin = 90,
+       SCX_Meetei_Mayek = 91,
+       SCX_Mende_Kikakui = 92,
+       SCX_Meroitic_Cursive = 93,
+       SCX_Meroitic_Hieroglyphs = 94,
+       SCX_Miao = 95,
+       SCX_Modi = 96,
+       SCX_Mongolian = 97,
+       SCX_Mro = 98,
+       SCX_Multani = 99,
+       SCX_Myanmar = 100,
+       SCX_Nabataean = 101,
+       SCX_Nag_Mundari = 102,
+       SCX_Nandinagari = 103,
+       SCX_New_Tai_Lue = 104,
+       SCX_Newa = 105,
+       SCX_Nko = 106,
+       SCX_Nushu = 107,
+       SCX_Nyiakeng_Puachue_Hmong = 108,
+       SCX_Ogham = 109,
+       SCX_Ol_Chiki = 110,
+       SCX_Old_Hungarian = 111,
+       SCX_Old_Italic = 112,
+       SCX_Old_North_Arabian = 113,
+       SCX_Old_Permic = 114,
+       SCX_Old_Persian = 115,
+       SCX_Old_Sogdian = 116,
+       SCX_Old_South_Arabian = 117,
+       SCX_Old_Turkic = 118,
+       SCX_Old_Uyghur = 119,
+       SCX_Oriya = 120,
+       SCX_Osage = 121,
+       SCX_Osmanya = 122,
+       SCX_Pahawh_Hmong = 123,
+       SCX_Palmyrene = 124,
+       SCX_Pau_Cin_Hau = 125,
+       SCX_Phags_Pa = 126,
+       SCX_Phoenician = 127,
+       SCX_Psalter_Pahlavi = 128,
+       SCX_Rejang = 129,
+       SCX_Runic = 130,
+       SCX_Samaritan = 131,
+       SCX_Saurashtra = 132,
+       SCX_Sharada = 133,
+       SCX_Shavian = 134,
+       SCX_Siddham = 135,
+       SCX_SignWriting = 136,
+       SCX_Sinhala = 137,
+       SCX_Sogdian = 138,
+       SCX_Sora_Sompeng = 139,
+       SCX_Soyombo = 140,
+       SCX_Sundanese = 141,
+       SCX_Syloti_Nagri = 142,
+       SCX_Syriac = 143,
+       SCX_Tagalog = 144,
+       SCX_Tagbanwa = 145,
+       SCX_Tai_Le = 146,
+       SCX_Tai_Tham = 147,
+       SCX_Tai_Viet = 148,
+       SCX_Takri = 149,
+       SCX_Tamil = 150,
+       SCX_Tangsa = 151,
+       SCX_Tangut = 152,
+       SCX_Telugu = 153,
+       SCX_Thaana = 154,
+       SCX_Thai = 155,
+       SCX_Tibetan = 156,
+       SCX_Tifinagh = 157,
+       SCX_Tirhuta = 158,
+       SCX_Toto = 159,
+       SCX_Ugaritic = 160,
+       SCX_Vai = 161,
+       SCX_Vithkuqi = 162,
+       SCX_Wancho = 163,
+       SCX_Warang_Citi = 164,
+       SCX_Yezidi = 165,
+       SCX_Yi = 166,
+       SCX_Zanabazar_Square = 167,
        SCX_use_AUX_TABLE_1 = -1,
        SCX_use_AUX_TABLE_2 = -2,
        SCX_use_AUX_TABLE_3 = -3,
@@ -85414,6 +86113,7 @@ static const UV script_zeros[] = {
        0x966,  /* Kaithi */
        0xce6,  /* Kannada */
        '0',    /* Katakana */
+       0x11f50,        /* Kawi */
        0xa900, /* Kayah_Li */
        '0',    /* Kharoshthi */
        '0',    /* Khitan_Small_Script */
@@ -85449,6 +86149,7 @@ static const UV script_zeros[] = {
        0xa66,  /* Multani */
         0,     /* Myanmar */
        '0',    /* Nabataean */
+       0x1e4f0,        /* Nag_Mundari */
        0xce6,  /* Nandinagari */
        0x19d0, /* New_Tai_Lue */
        0x11450,        /* Newa */
@@ -86689,6 +87390,7 @@ static const SCX_enum _Perl_SCX_invmap[] = {  /* for EBCDIC 037 */
        SCX_Unknown,
        SCX_Yezidi,
        SCX_Unknown,
+       SCX_Arabic,
        SCX_Old_Sogdian,
        SCX_Unknown,
        SCX_Sogdian,
@@ -86836,6 +87538,8 @@ static const SCX_enum _Perl_SCX_invmap[] = {  /* for EBCDIC 037 */
        SCX_Canadian_Aboriginal,
        SCX_Pau_Cin_Hau,
        SCX_Unknown,
+       SCX_Devanagari,
+       SCX_Unknown,
        SCX_Bhaiksuki,
        SCX_Unknown,
        SCX_Bhaiksuki,
@@ -86878,6 +87582,12 @@ static const SCX_enum _Perl_SCX_invmap[] = {  /* for EBCDIC 037 */
        SCX_Unknown,
        SCX_Makasar,
        SCX_Unknown,
+       SCX_Kawi,
+       SCX_Unknown,
+       SCX_Kawi,
+       SCX_Unknown,
+       SCX_Kawi,
+       SCX_Unknown,
        SCX_Lisu,
        SCX_Unknown,
        SCX_Tamil,
@@ -86899,8 +87609,6 @@ static const SCX_enum _Perl_SCX_invmap[] = {  /* for EBCDIC 037 */
        SCX_Unknown,
        SCX_Egyptian_Hieroglyphs,
        SCX_Unknown,
-       SCX_Egyptian_Hieroglyphs,
-       SCX_Unknown,
        SCX_Anatolian_Hieroglyphs,
        SCX_Unknown,
        SCX_Bamum,
@@ -86962,6 +87670,10 @@ static const SCX_enum _Perl_SCX_invmap[] = {  /* for EBCDIC 037 */
        SCX_Unknown,
        SCX_use_AUX_TABLE_44,
        SCX_Unknown,
+       SCX_use_AUX_TABLE_44,
+       SCX_Unknown,
+       SCX_use_AUX_TABLE_45,
+       SCX_Unknown,
        SCX_use_AUX_TABLE_45,
        SCX_Unknown,
        SCX_Nushu,
@@ -87002,6 +87714,8 @@ static const SCX_enum _Perl_SCX_invmap[] = {  /* for EBCDIC 037 */
        SCX_Unknown,
        SCX_Common,
        SCX_Unknown,
+       SCX_Common,
+       SCX_Unknown,
        SCX_use_AUX_TABLE_38,
        SCX_Common,
        SCX_Unknown,
@@ -87054,6 +87768,8 @@ static const SCX_enum _Perl_SCX_invmap[] = {  /* for EBCDIC 037 */
        SCX_Unknown,
        SCX_Latin,
        SCX_Unknown,
+       SCX_Latin,
+       SCX_Unknown,
        SCX_Glagolitic,
        SCX_Unknown,
        SCX_Glagolitic,
@@ -87064,6 +87780,10 @@ static const SCX_enum _Perl_SCX_invmap[] = {  /* for EBCDIC 037 */
        SCX_Unknown,
        SCX_Glagolitic,
        SCX_Unknown,
+       SCX_Cyrillic,
+       SCX_Unknown,
+       SCX_Cyrillic,
+       SCX_Unknown,
        SCX_Nyiakeng_Puachue_Hmong,
        SCX_Unknown,
        SCX_Nyiakeng_Puachue_Hmong,
@@ -87078,6 +87798,8 @@ static const SCX_enum _Perl_SCX_invmap[] = {  /* for EBCDIC 037 */
        SCX_Unknown,
        SCX_Wancho,
        SCX_Unknown,
+       SCX_Nag_Mundari,
+       SCX_Unknown,
        SCX_Ethiopic,
        SCX_Unknown,
        SCX_Ethiopic,
@@ -87244,9 +87966,7 @@ static const SCX_enum _Perl_SCX_invmap[] = {  /* for EBCDIC 037 */
        SCX_Unknown,
        SCX_Common,
        SCX_Unknown,
-       SCX_Common,
-       SCX_Unknown,
-       SCX_Common,
+       SCX_use_AUX_TABLE_38,
        SCX_Unknown,
        SCX_use_AUX_TABLE_38,
        SCX_Unknown,
@@ -87279,7 +87999,7 @@ static const SCX_enum _Perl_SCX_invmap[] = {  /* for EBCDIC 037 */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV _Perl_WB_invlist[] = {  /* for ASCII/Latin1 */
-       1949,   /* Number of elements */
+       1979,   /* Number of elements */
        148565664, /* Version and data structure type */
        0,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -87704,6 +88424,7 @@ static const UV _Perl_WB_invlist[] = {  /* for ASCII/Latin1 */
        0xCF0,
        0xCF1,
        0xCF3,
+       0xCF4,
        0xD00,
        0xD04,
        0xD0D,
@@ -87766,7 +88487,7 @@ static const UV _Perl_WB_invlist[] = {  /* for ASCII/Latin1 */
        0xEB4,
        0xEBD,
        0xEC8,
-       0xECE,
+       0xECF,
        0xED0,
        0xEDA,
        0xF00,
@@ -88608,6 +89329,7 @@ static const UV _Perl_WB_invlist[] = {  /* for ASCII/Latin1 */
        0x10EAD,
        0x10EB0,
        0x10EB2,
+       0x10EFD,
        0x10F00,
        0x10F1D,
        0x10F27,
@@ -88681,6 +89403,8 @@ static const UV _Perl_WB_invlist[] = {  /* for ASCII/Latin1 */
        0x11238,
        0x1123E,
        0x1123F,
+       0x11241,
+       0x11242,
        0x11280,
        0x11287,
        0x11288,
@@ -88877,6 +89601,18 @@ static const UV _Perl_WB_invlist[] = {  /* for ASCII/Latin1 */
        0x11EE0,
        0x11EF3,
        0x11EF7,
+       0x11F00,
+       0x11F02,
+       0x11F03,
+       0x11F04,
+       0x11F11,
+       0x11F12,
+       0x11F34,
+       0x11F3B,
+       0x11F3E,
+       0x11F43,
+       0x11F50,
+       0x11F5A,
        0x11FB0,
        0x11FB1,
        0x12000,
@@ -88888,9 +89624,11 @@ static const UV _Perl_WB_invlist[] = {  /* for ASCII/Latin1 */
        0x12F90,
        0x12FF1,
        0x13000,
-       0x1342F,
        0x13430,
-       0x13439,
+       0x13440,
+       0x13441,
+       0x13447,
+       0x13456,
        0x14400,
        0x14647,
        0x16800,
@@ -88946,6 +89684,8 @@ static const UV _Perl_WB_invlist[] = {  /* for ASCII/Latin1 */
        0x1B001,
        0x1B120,
        0x1B123,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1BC00,
@@ -89052,6 +89792,8 @@ static const UV _Perl_WB_invlist[] = {  /* for ASCII/Latin1 */
        0x1DAB0,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
        0x1E000,
        0x1E007,
        0x1E008,
@@ -89062,6 +89804,10 @@ static const UV _Perl_WB_invlist[] = {  /* for ASCII/Latin1 */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E030,
+       0x1E06E,
+       0x1E08F,
+       0x1E090,
        0x1E100,
        0x1E12D,
        0x1E130,
@@ -89078,6 +89824,10 @@ static const UV _Perl_WB_invlist[] = {  /* for ASCII/Latin1 */
        0x1E2EC,
        0x1E2F0,
        0x1E2FA,
+       0x1E4D0,
+       0x1E4EC,
+       0x1E4F0,
+       0x1E4FA,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -89693,6 +90443,7 @@ static const WB_enum _Perl_WB_invmap[] = {  /* for ASCII/Latin1 */
        WB_Numeric,
        WB_Other,
        WB_ALetter,
+       WB_Extend,
        WB_Other,
        WB_Extend,
        WB_ALetter,
@@ -90598,6 +91349,7 @@ static const WB_enum _Perl_WB_invmap[] = {  /* for ASCII/Latin1 */
        WB_Other,
        WB_ALetter,
        WB_Other,
+       WB_Extend,
        WB_ALetter,
        WB_Other,
        WB_ALetter,
@@ -90670,6 +91422,8 @@ static const WB_enum _Perl_WB_invmap[] = {  /* for ASCII/Latin1 */
        WB_Extend,
        WB_Other,
        WB_Extend,
+       WB_ALetter,
+       WB_Extend,
        WB_Other,
        WB_ALetter,
        WB_Other,
@@ -90867,7 +91621,17 @@ static const WB_enum _Perl_WB_invmap[] = {  /* for ASCII/Latin1 */
        WB_ALetter,
        WB_Extend,
        WB_Other,
+       WB_Extend,
+       WB_ALetter,
+       WB_Extend,
+       WB_ALetter,
+       WB_Other,
        WB_ALetter,
+       WB_Extend,
+       WB_Other,
+       WB_Extend,
+       WB_Other,
+       WB_Numeric,
        WB_Other,
        WB_ALetter,
        WB_Other,
@@ -90879,7 +91643,11 @@ static const WB_enum _Perl_WB_invmap[] = {  /* for ASCII/Latin1 */
        WB_Other,
        WB_ALetter,
        WB_Other,
+       WB_ALetter,
        WB_Format,
+       WB_Extend,
+       WB_ALetter,
+       WB_Extend,
        WB_Other,
        WB_ALetter,
        WB_Other,
@@ -90938,6 +91706,8 @@ static const WB_enum _Perl_WB_invmap[] = {  /* for ASCII/Latin1 */
        WB_Other,
        WB_Katakana,
        WB_Other,
+       WB_Katakana,
+       WB_Other,
        WB_ALetter,
        WB_Other,
        WB_ALetter,
@@ -91042,6 +91812,8 @@ static const WB_enum _Perl_WB_invmap[] = {  /* for ASCII/Latin1 */
        WB_Other,
        WB_ALetter,
        WB_Other,
+       WB_ALetter,
+       WB_Other,
        WB_Extend,
        WB_Other,
        WB_Extend,
@@ -91055,6 +91827,10 @@ static const WB_enum _Perl_WB_invmap[] = {  /* for ASCII/Latin1 */
        WB_ALetter,
        WB_Other,
        WB_Extend,
+       WB_Other,
+       WB_ALetter,
+       WB_Other,
+       WB_Extend,
        WB_ALetter,
        WB_Other,
        WB_Numeric,
@@ -91069,6 +91845,10 @@ static const WB_enum _Perl_WB_invmap[] = {  /* for ASCII/Latin1 */
        WB_Numeric,
        WB_Other,
        WB_ALetter,
+       WB_Extend,
+       WB_Numeric,
+       WB_Other,
+       WB_ALetter,
        WB_Other,
        WB_ALetter,
        WB_Other,
@@ -91236,7 +92016,7 @@ static const WB_enum _Perl_WB_invmap[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV _Perl_WB_invlist[] = {  /* for EBCDIC 1047 */
-       1972,   /* Number of elements */
+       2002,   /* Number of elements */
        148565664, /* Version and data structure type */
        0,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -91684,6 +92464,7 @@ static const UV _Perl_WB_invlist[] = {  /* for EBCDIC 1047 */
        0xCF0,
        0xCF1,
        0xCF3,
+       0xCF4,
        0xD00,
        0xD04,
        0xD0D,
@@ -91746,7 +92527,7 @@ static const UV _Perl_WB_invlist[] = {  /* for EBCDIC 1047 */
        0xEB4,
        0xEBD,
        0xEC8,
-       0xECE,
+       0xECF,
        0xED0,
        0xEDA,
        0xF00,
@@ -92588,6 +93369,7 @@ static const UV _Perl_WB_invlist[] = {  /* for EBCDIC 1047 */
        0x10EAD,
        0x10EB0,
        0x10EB2,
+       0x10EFD,
        0x10F00,
        0x10F1D,
        0x10F27,
@@ -92661,6 +93443,8 @@ static const UV _Perl_WB_invlist[] = {  /* for EBCDIC 1047 */
        0x11238,
        0x1123E,
        0x1123F,
+       0x11241,
+       0x11242,
        0x11280,
        0x11287,
        0x11288,
@@ -92857,6 +93641,18 @@ static const UV _Perl_WB_invlist[] = {  /* for EBCDIC 1047 */
        0x11EE0,
        0x11EF3,
        0x11EF7,
+       0x11F00,
+       0x11F02,
+       0x11F03,
+       0x11F04,
+       0x11F11,
+       0x11F12,
+       0x11F34,
+       0x11F3B,
+       0x11F3E,
+       0x11F43,
+       0x11F50,
+       0x11F5A,
        0x11FB0,
        0x11FB1,
        0x12000,
@@ -92868,9 +93664,11 @@ static const UV _Perl_WB_invlist[] = {  /* for EBCDIC 1047 */
        0x12F90,
        0x12FF1,
        0x13000,
-       0x1342F,
        0x13430,
-       0x13439,
+       0x13440,
+       0x13441,
+       0x13447,
+       0x13456,
        0x14400,
        0x14647,
        0x16800,
@@ -92926,6 +93724,8 @@ static const UV _Perl_WB_invlist[] = {  /* for EBCDIC 1047 */
        0x1B001,
        0x1B120,
        0x1B123,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1BC00,
@@ -93032,6 +93832,8 @@ static const UV _Perl_WB_invlist[] = {  /* for EBCDIC 1047 */
        0x1DAB0,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
        0x1E000,
        0x1E007,
        0x1E008,
@@ -93042,6 +93844,10 @@ static const UV _Perl_WB_invlist[] = {  /* for EBCDIC 1047 */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E030,
+       0x1E06E,
+       0x1E08F,
+       0x1E090,
        0x1E100,
        0x1E12D,
        0x1E130,
@@ -93058,6 +93864,10 @@ static const UV _Perl_WB_invlist[] = {  /* for EBCDIC 1047 */
        0x1E2EC,
        0x1E2F0,
        0x1E2FA,
+       0x1E4D0,
+       0x1E4EC,
+       0x1E4F0,
+       0x1E4FA,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -93699,6 +94509,7 @@ static const WB_enum _Perl_WB_invmap[] = {  /* for EBCDIC 1047 */
        WB_Numeric,
        WB_Other,
        WB_ALetter,
+       WB_Extend,
        WB_Other,
        WB_Extend,
        WB_ALetter,
@@ -94604,6 +95415,7 @@ static const WB_enum _Perl_WB_invmap[] = {  /* for EBCDIC 1047 */
        WB_Other,
        WB_ALetter,
        WB_Other,
+       WB_Extend,
        WB_ALetter,
        WB_Other,
        WB_ALetter,
@@ -94676,6 +95488,8 @@ static const WB_enum _Perl_WB_invmap[] = {  /* for EBCDIC 1047 */
        WB_Extend,
        WB_Other,
        WB_Extend,
+       WB_ALetter,
+       WB_Extend,
        WB_Other,
        WB_ALetter,
        WB_Other,
@@ -94873,7 +95687,17 @@ static const WB_enum _Perl_WB_invmap[] = {  /* for EBCDIC 1047 */
        WB_ALetter,
        WB_Extend,
        WB_Other,
+       WB_Extend,
+       WB_ALetter,
+       WB_Extend,
+       WB_ALetter,
+       WB_Other,
        WB_ALetter,
+       WB_Extend,
+       WB_Other,
+       WB_Extend,
+       WB_Other,
+       WB_Numeric,
        WB_Other,
        WB_ALetter,
        WB_Other,
@@ -94885,7 +95709,11 @@ static const WB_enum _Perl_WB_invmap[] = {  /* for EBCDIC 1047 */
        WB_Other,
        WB_ALetter,
        WB_Other,
+       WB_ALetter,
        WB_Format,
+       WB_Extend,
+       WB_ALetter,
+       WB_Extend,
        WB_Other,
        WB_ALetter,
        WB_Other,
@@ -94944,6 +95772,8 @@ static const WB_enum _Perl_WB_invmap[] = {  /* for EBCDIC 1047 */
        WB_Other,
        WB_Katakana,
        WB_Other,
+       WB_Katakana,
+       WB_Other,
        WB_ALetter,
        WB_Other,
        WB_ALetter,
@@ -95048,6 +95878,8 @@ static const WB_enum _Perl_WB_invmap[] = {  /* for EBCDIC 1047 */
        WB_Other,
        WB_ALetter,
        WB_Other,
+       WB_ALetter,
+       WB_Other,
        WB_Extend,
        WB_Other,
        WB_Extend,
@@ -95061,6 +95893,10 @@ static const WB_enum _Perl_WB_invmap[] = {  /* for EBCDIC 1047 */
        WB_ALetter,
        WB_Other,
        WB_Extend,
+       WB_Other,
+       WB_ALetter,
+       WB_Other,
+       WB_Extend,
        WB_ALetter,
        WB_Other,
        WB_Numeric,
@@ -95075,6 +95911,10 @@ static const WB_enum _Perl_WB_invmap[] = {  /* for EBCDIC 1047 */
        WB_Numeric,
        WB_Other,
        WB_ALetter,
+       WB_Extend,
+       WB_Numeric,
+       WB_Other,
+       WB_ALetter,
        WB_Other,
        WB_ALetter,
        WB_Other,
@@ -95242,7 +96082,7 @@ static const WB_enum _Perl_WB_invmap[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV _Perl_WB_invlist[] = {  /* for EBCDIC 037 */
-       1968,   /* Number of elements */
+       1998,   /* Number of elements */
        148565664, /* Version and data structure type */
        0,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -95686,6 +96526,7 @@ static const UV _Perl_WB_invlist[] = {  /* for EBCDIC 037 */
        0xCF0,
        0xCF1,
        0xCF3,
+       0xCF4,
        0xD00,
        0xD04,
        0xD0D,
@@ -95748,7 +96589,7 @@ static const UV _Perl_WB_invlist[] = {  /* for EBCDIC 037 */
        0xEB4,
        0xEBD,
        0xEC8,
-       0xECE,
+       0xECF,
        0xED0,
        0xEDA,
        0xF00,
@@ -96590,6 +97431,7 @@ static const UV _Perl_WB_invlist[] = {  /* for EBCDIC 037 */
        0x10EAD,
        0x10EB0,
        0x10EB2,
+       0x10EFD,
        0x10F00,
        0x10F1D,
        0x10F27,
@@ -96663,6 +97505,8 @@ static const UV _Perl_WB_invlist[] = {  /* for EBCDIC 037 */
        0x11238,
        0x1123E,
        0x1123F,
+       0x11241,
+       0x11242,
        0x11280,
        0x11287,
        0x11288,
@@ -96859,6 +97703,18 @@ static const UV _Perl_WB_invlist[] = {  /* for EBCDIC 037 */
        0x11EE0,
        0x11EF3,
        0x11EF7,
+       0x11F00,
+       0x11F02,
+       0x11F03,
+       0x11F04,
+       0x11F11,
+       0x11F12,
+       0x11F34,
+       0x11F3B,
+       0x11F3E,
+       0x11F43,
+       0x11F50,
+       0x11F5A,
        0x11FB0,
        0x11FB1,
        0x12000,
@@ -96870,9 +97726,11 @@ static const UV _Perl_WB_invlist[] = {  /* for EBCDIC 037 */
        0x12F90,
        0x12FF1,
        0x13000,
-       0x1342F,
        0x13430,
-       0x13439,
+       0x13440,
+       0x13441,
+       0x13447,
+       0x13456,
        0x14400,
        0x14647,
        0x16800,
@@ -96928,6 +97786,8 @@ static const UV _Perl_WB_invlist[] = {  /* for EBCDIC 037 */
        0x1B001,
        0x1B120,
        0x1B123,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1BC00,
@@ -97034,6 +97894,8 @@ static const UV _Perl_WB_invlist[] = {  /* for EBCDIC 037 */
        0x1DAB0,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
        0x1E000,
        0x1E007,
        0x1E008,
@@ -97044,6 +97906,10 @@ static const UV _Perl_WB_invlist[] = {  /* for EBCDIC 037 */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E030,
+       0x1E06E,
+       0x1E08F,
+       0x1E090,
        0x1E100,
        0x1E12D,
        0x1E130,
@@ -97060,6 +97926,10 @@ static const UV _Perl_WB_invlist[] = {  /* for EBCDIC 037 */
        0x1E2EC,
        0x1E2F0,
        0x1E2FA,
+       0x1E4D0,
+       0x1E4EC,
+       0x1E4F0,
+       0x1E4FA,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -97697,6 +98567,7 @@ static const WB_enum _Perl_WB_invmap[] = {  /* for EBCDIC 037 */
        WB_Numeric,
        WB_Other,
        WB_ALetter,
+       WB_Extend,
        WB_Other,
        WB_Extend,
        WB_ALetter,
@@ -98602,6 +99473,7 @@ static const WB_enum _Perl_WB_invmap[] = {  /* for EBCDIC 037 */
        WB_Other,
        WB_ALetter,
        WB_Other,
+       WB_Extend,
        WB_ALetter,
        WB_Other,
        WB_ALetter,
@@ -98674,6 +99546,8 @@ static const WB_enum _Perl_WB_invmap[] = {  /* for EBCDIC 037 */
        WB_Extend,
        WB_Other,
        WB_Extend,
+       WB_ALetter,
+       WB_Extend,
        WB_Other,
        WB_ALetter,
        WB_Other,
@@ -98871,7 +99745,17 @@ static const WB_enum _Perl_WB_invmap[] = {  /* for EBCDIC 037 */
        WB_ALetter,
        WB_Extend,
        WB_Other,
+       WB_Extend,
+       WB_ALetter,
+       WB_Extend,
+       WB_ALetter,
+       WB_Other,
        WB_ALetter,
+       WB_Extend,
+       WB_Other,
+       WB_Extend,
+       WB_Other,
+       WB_Numeric,
        WB_Other,
        WB_ALetter,
        WB_Other,
@@ -98883,7 +99767,11 @@ static const WB_enum _Perl_WB_invmap[] = {  /* for EBCDIC 037 */
        WB_Other,
        WB_ALetter,
        WB_Other,
+       WB_ALetter,
        WB_Format,
+       WB_Extend,
+       WB_ALetter,
+       WB_Extend,
        WB_Other,
        WB_ALetter,
        WB_Other,
@@ -98942,6 +99830,8 @@ static const WB_enum _Perl_WB_invmap[] = {  /* for EBCDIC 037 */
        WB_Other,
        WB_Katakana,
        WB_Other,
+       WB_Katakana,
+       WB_Other,
        WB_ALetter,
        WB_Other,
        WB_ALetter,
@@ -99046,6 +99936,8 @@ static const WB_enum _Perl_WB_invmap[] = {  /* for EBCDIC 037 */
        WB_Other,
        WB_ALetter,
        WB_Other,
+       WB_ALetter,
+       WB_Other,
        WB_Extend,
        WB_Other,
        WB_Extend,
@@ -99059,6 +99951,10 @@ static const WB_enum _Perl_WB_invmap[] = {  /* for EBCDIC 037 */
        WB_ALetter,
        WB_Other,
        WB_Extend,
+       WB_Other,
+       WB_ALetter,
+       WB_Other,
+       WB_Extend,
        WB_ALetter,
        WB_Other,
        WB_Numeric,
@@ -99073,6 +99969,10 @@ static const WB_enum _Perl_WB_invmap[] = {  /* for EBCDIC 037 */
        WB_Numeric,
        WB_Other,
        WB_ALetter,
+       WB_Extend,
+       WB_Numeric,
+       WB_Other,
+       WB_ALetter,
        WB_Other,
        WB_ALetter,
        WB_Other,
@@ -127432,7 +128332,7 @@ static const UV UNI_ASCII_invlist[] = {  /* for EBCDIC 037 */
 #  endif       /* EBCDIC 037 */
 
 static const UV UNI_ASSIGNED_invlist[] = {  /* for all charsets */
-       1396,   /* Number of elements */
+       1414,   /* Number of elements */
        148565664, /* Version and data structure type */
        0,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -127679,7 +128579,7 @@ static const UV UNI_ASSIGNED_invlist[] = {  /* for all charsets */
        0xCE6,
        0xCF0,
        0xCF1,
-       0xCF3,
+       0xCF4,
        0xD00,
        0xD0D,
        0xD0E,
@@ -127739,7 +128639,7 @@ static const UV UNI_ASSIGNED_invlist[] = {  /* for all charsets */
        0xEC6,
        0xEC7,
        0xEC8,
-       0xECE,
+       0xECF,
        0xED0,
        0xEDA,
        0xEDC,
@@ -128280,7 +129180,7 @@ static const UV UNI_ASSIGNED_invlist[] = {  /* for all charsets */
        0x10EAE,
        0x10EB0,
        0x10EB2,
-       0x10F00,
+       0x10EFD,
        0x10F28,
        0x10F30,
        0x10F5A,
@@ -128315,7 +129215,7 @@ static const UV UNI_ASSIGNED_invlist[] = {  /* for all charsets */
        0x11200,
        0x11212,
        0x11213,
-       0x1123F,
+       0x11242,
        0x11280,
        0x11287,
        0x11288,
@@ -128420,6 +129320,8 @@ static const UV UNI_ASSIGNED_invlist[] = {  /* for all charsets */
        0x11AA3,
        0x11AB0,
        0x11AF9,
+       0x11B00,
+       0x11B0A,
        0x11C00,
        0x11C09,
        0x11C0A,
@@ -128462,6 +129364,12 @@ static const UV UNI_ASSIGNED_invlist[] = {  /* for all charsets */
        0x11DAA,
        0x11EE0,
        0x11EF9,
+       0x11F00,
+       0x11F11,
+       0x11F12,
+       0x11F3B,
+       0x11F3E,
+       0x11F5A,
        0x11FB0,
        0x11FB1,
        0x11FC0,
@@ -128477,9 +129385,7 @@ static const UV UNI_ASSIGNED_invlist[] = {  /* for all charsets */
        0x12F90,
        0x12FF3,
        0x13000,
-       0x1342F,
-       0x13430,
-       0x13439,
+       0x13456,
        0x14400,
        0x14647,
        0x16800,
@@ -128532,8 +129438,12 @@ static const UV UNI_ASSIGNED_invlist[] = {  /* for all charsets */
        0x1AFFF,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -128562,6 +129472,8 @@ static const UV UNI_ASSIGNED_invlist[] = {  /* for all charsets */
        0x1D1EB,
        0x1D200,
        0x1D246,
+       0x1D2C0,
+       0x1D2D4,
        0x1D2E0,
        0x1D2F4,
        0x1D300,
@@ -128616,6 +129528,8 @@ static const UV UNI_ASSIGNED_invlist[] = {  /* for all charsets */
        0x1DAB0,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
        0x1E000,
        0x1E007,
        0x1E008,
@@ -128626,6 +129540,10 @@ static const UV UNI_ASSIGNED_invlist[] = {  /* for all charsets */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E030,
+       0x1E06E,
+       0x1E08F,
+       0x1E090,
        0x1E100,
        0x1E12D,
        0x1E130,
@@ -128640,6 +129558,8 @@ static const UV UNI_ASSIGNED_invlist[] = {  /* for all charsets */
        0x1E2FA,
        0x1E2FF,
        0x1E300,
+       0x1E4D0,
+       0x1E4FA,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -128756,14 +129676,14 @@ static const UV UNI_ASSIGNED_invlist[] = {  /* for all charsets */
        0x1F266,
        0x1F300,
        0x1F6D8,
-       0x1F6DD,
+       0x1F6DC,
        0x1F6ED,
        0x1F6F0,
        0x1F6FD,
        0x1F700,
-       0x1F774,
-       0x1F780,
-       0x1F7D9,
+       0x1F777,
+       0x1F77B,
+       0x1F7DA,
        0x1F7E0,
        0x1F7EC,
        0x1F7F0,
@@ -128785,23 +129705,19 @@ static const UV UNI_ASSIGNED_invlist[] = {  /* for all charsets */
        0x1FA60,
        0x1FA6E,
        0x1FA70,
-       0x1FA75,
-       0x1FA78,
        0x1FA7D,
        0x1FA80,
-       0x1FA87,
+       0x1FA89,
        0x1FA90,
-       0x1FAAD,
-       0x1FAB0,
-       0x1FABB,
-       0x1FAC0,
+       0x1FABE,
+       0x1FABF,
        0x1FAC6,
-       0x1FAD0,
-       0x1FADA,
+       0x1FACE,
+       0x1FADC,
        0x1FAE0,
-       0x1FAE8,
+       0x1FAE9,
        0x1FAF0,
-       0x1FAF7,
+       0x1FAF9,
        0x1FB00,
        0x1FB93,
        0x1FB94,
@@ -128811,7 +129727,7 @@ static const UV UNI_ASSIGNED_invlist[] = {  /* for all charsets */
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -128822,6 +129738,8 @@ static const UV UNI_ASSIGNED_invlist[] = {  /* for all charsets */
        0x2FA1E,
        0x30000,
        0x3134B,
+       0x31350,
+       0x323B0,
        0xE0001,
        0xE0002,
        0xE0020,
@@ -128837,7 +129755,7 @@ static const UV UNI_ASSIGNED_invlist[] = {  /* for all charsets */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_CASED_invlist[] = {  /* for ASCII/Latin1 */
-       311,    /* Number of elements */
+       315,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -128904,7 +129822,7 @@ static const UV UNI_CASED_invlist[] = {  /* for ASCII/Latin1 */
        0x10CE,
        0x10D0,
        0x10FB,
-       0x10FD,
+       0x10FC,
        0x1100,
        0x13A0,
        0x13F6,
@@ -129024,14 +129942,14 @@ static const UV UNI_CASED_invlist[] = {  /* for ASCII/Latin1 */
        0xA7D4,
        0xA7D5,
        0xA7DA,
-       0xA7F5,
+       0xA7F2,
        0xA7F7,
        0xA7F8,
        0xA7FB,
        0xAB30,
        0xAB5B,
        0xAB5C,
-       0xAB69,
+       0xAB6A,
        0xAB70,
        0xABC0,
        0xFB00,
@@ -129144,6 +130062,10 @@ static const UV UNI_CASED_invlist[] = {  /* for ASCII/Latin1 */
        0x1DF0A,
        0x1DF0B,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
+       0x1E030,
+       0x1E06E,
        0x1E900,
        0x1E944,
        0x1F130,
@@ -129162,7 +130084,7 @@ static const UV UNI_CASED_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_CASED_invlist[] = {  /* for EBCDIC 1047 */
-       337,    /* Number of elements */
+       341,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -129255,7 +130177,7 @@ static const UV UNI_CASED_invlist[] = {  /* for EBCDIC 1047 */
        0x10CE,
        0x10D0,
        0x10FB,
-       0x10FD,
+       0x10FC,
        0x1100,
        0x13A0,
        0x13F6,
@@ -129375,14 +130297,14 @@ static const UV UNI_CASED_invlist[] = {  /* for EBCDIC 1047 */
        0xA7D4,
        0xA7D5,
        0xA7DA,
-       0xA7F5,
+       0xA7F2,
        0xA7F7,
        0xA7F8,
        0xA7FB,
        0xAB30,
        0xAB5B,
        0xAB5C,
-       0xAB69,
+       0xAB6A,
        0xAB70,
        0xABC0,
        0xFB00,
@@ -129495,6 +130417,10 @@ static const UV UNI_CASED_invlist[] = {  /* for EBCDIC 1047 */
        0x1DF0A,
        0x1DF0B,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
+       0x1E030,
+       0x1E06E,
        0x1E900,
        0x1E944,
        0x1F130,
@@ -129513,7 +130439,7 @@ static const UV UNI_CASED_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_CASED_invlist[] = {  /* for EBCDIC 037 */
-       333,    /* Number of elements */
+       337,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -129602,7 +130528,7 @@ static const UV UNI_CASED_invlist[] = {  /* for EBCDIC 037 */
        0x10CE,
        0x10D0,
        0x10FB,
-       0x10FD,
+       0x10FC,
        0x1100,
        0x13A0,
        0x13F6,
@@ -129722,14 +130648,14 @@ static const UV UNI_CASED_invlist[] = {  /* for EBCDIC 037 */
        0xA7D4,
        0xA7D5,
        0xA7DA,
-       0xA7F5,
+       0xA7F2,
        0xA7F7,
        0xA7F8,
        0xA7FB,
        0xAB30,
        0xAB5B,
        0xAB5C,
-       0xAB69,
+       0xAB6A,
        0xAB70,
        0xABC0,
        0xFB00,
@@ -129842,6 +130768,10 @@ static const UV UNI_CASED_invlist[] = {  /* for EBCDIC 037 */
        0x1DF0A,
        0x1DF0B,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
+       0x1E030,
+       0x1E06E,
        0x1E900,
        0x1E944,
        0x1F130,
@@ -129857,7 +130787,7 @@ static const UV UNI_CASED_invlist[] = {  /* for EBCDIC 037 */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_CASEDLETTER_invlist[] = {  /* for ASCII/Latin1 */
-       285,    /* Number of elements */
+       287,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -130144,6 +131074,8 @@ static const UV UNI_CASEDLETTER_invlist[] = {  /* for ASCII/Latin1 */
        0x1DF0A,
        0x1DF0B,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
        0x1E900,
        0x1E944
 };
@@ -130156,7 +131088,7 @@ static const UV UNI_CASEDLETTER_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_CASEDLETTER_invlist[] = {  /* for EBCDIC 1047 */
-       317,    /* Number of elements */
+       319,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -130475,6 +131407,8 @@ static const UV UNI_CASEDLETTER_invlist[] = {  /* for EBCDIC 1047 */
        0x1DF0A,
        0x1DF0B,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
        0x1E900,
        0x1E944
 };
@@ -130487,7 +131421,7 @@ static const UV UNI_CASEDLETTER_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_CASEDLETTER_invlist[] = {  /* for EBCDIC 037 */
-       313,    /* Number of elements */
+       315,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -130802,6 +131736,8 @@ static const UV UNI_CASEDLETTER_invlist[] = {  /* for EBCDIC 037 */
        0x1DF0A,
        0x1DF0B,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
        0x1E900,
        0x1E944
 };
@@ -130811,7 +131747,7 @@ static const UV UNI_CASEDLETTER_invlist[] = {  /* for EBCDIC 037 */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_LOWERCASELETTER_invlist[] = {  /* for ASCII/Latin1 */
-       1315,   /* Number of elements */
+       1317,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -132128,6 +133064,8 @@ static const UV UNI_LOWERCASELETTER_invlist[] = {  /* for ASCII/Latin1 */
        0x1DF0A,
        0x1DF0B,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
        0x1E922,
        0x1E944
 };
@@ -132140,7 +133078,7 @@ static const UV UNI_LOWERCASELETTER_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_LOWERCASELETTER_invlist[] = {  /* for EBCDIC 1047 */
-       1329,   /* Number of elements */
+       1331,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -133471,6 +134409,8 @@ static const UV UNI_LOWERCASELETTER_invlist[] = {  /* for EBCDIC 1047 */
        0x1DF0A,
        0x1DF0B,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
        0x1E922,
        0x1E944
 };
@@ -133483,7 +134423,7 @@ static const UV UNI_LOWERCASELETTER_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_LOWERCASELETTER_invlist[] = {  /* for EBCDIC 037 */
-       1329,   /* Number of elements */
+       1331,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -134814,6 +135754,8 @@ static const UV UNI_LOWERCASELETTER_invlist[] = {  /* for EBCDIC 037 */
        0x1DF0A,
        0x1DF0B,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
        0x1E922,
        0x1E944
 };
@@ -139824,7 +140766,7 @@ static const UV UNI_VERTSPACE_invlist[] = {  /* for EBCDIC 037 */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_XPOSIXALNUM_invlist[] = {  /* for ASCII/Latin1 */
-       1521,   /* Number of elements */
+       1545,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -140106,8 +141048,6 @@ static const UV UNI_XPOSIXALNUM_invlist[] = {  /* for ASCII/Latin1 */
        0xBE6,
        0xBF0,
        0xC00,
-       0xC04,
-       0xC05,
        0xC0D,
        0xC0E,
        0xC11,
@@ -140158,7 +141098,7 @@ static const UV UNI_XPOSIXALNUM_invlist[] = {  /* for ASCII/Latin1 */
        0xCE6,
        0xCF0,
        0xCF1,
-       0xCF3,
+       0xCF4,
        0xD00,
        0xD0D,
        0xD0E,
@@ -140244,7 +141184,7 @@ static const UV UNI_XPOSIXALNUM_invlist[] = {  /* for ASCII/Latin1 */
        0xF49,
        0xF6D,
        0xF71,
-       0xF82,
+       0xF84,
        0xF88,
        0xF98,
        0xF99,
@@ -140863,7 +141803,7 @@ static const UV UNI_XPOSIXALNUM_invlist[] = {  /* for ASCII/Latin1 */
        0x11070,
        0x11071,
        0x11076,
-       0x11082,
+       0x11080,
        0x110B9,
        0x110C2,
        0x110C3,
@@ -140896,7 +141836,7 @@ static const UV UNI_XPOSIXALNUM_invlist[] = {  /* for ASCII/Latin1 */
        0x11237,
        0x11238,
        0x1123E,
-       0x1123F,
+       0x11242,
        0x11280,
        0x11287,
        0x11288,
@@ -141075,6 +142015,14 @@ static const UV UNI_XPOSIXALNUM_invlist[] = {  /* for ASCII/Latin1 */
        0x11DAA,
        0x11EE0,
        0x11EF7,
+       0x11F00,
+       0x11F11,
+       0x11F12,
+       0x11F3B,
+       0x11F3E,
+       0x11F41,
+       0x11F50,
+       0x11F5A,
        0x11FB0,
        0x11FB1,
        0x12000,
@@ -141086,7 +142034,9 @@ static const UV UNI_XPOSIXALNUM_invlist[] = {  /* for ASCII/Latin1 */
        0x12F90,
        0x12FF1,
        0x13000,
-       0x1342F,
+       0x13430,
+       0x13441,
+       0x13447,
        0x14400,
        0x14647,
        0x16800,
@@ -141139,8 +142089,12 @@ static const UV UNI_XPOSIXALNUM_invlist[] = {  /* for ASCII/Latin1 */
        0x1AFFF,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -141219,6 +142173,8 @@ static const UV UNI_XPOSIXALNUM_invlist[] = {  /* for ASCII/Latin1 */
        0x1D800,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
        0x1E000,
        0x1E007,
        0x1E008,
@@ -141229,6 +142185,10 @@ static const UV UNI_XPOSIXALNUM_invlist[] = {  /* for ASCII/Latin1 */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E030,
+       0x1E06E,
+       0x1E08F,
+       0x1E090,
        0x1E100,
        0x1E12D,
        0x1E137,
@@ -141243,6 +142203,10 @@ static const UV UNI_XPOSIXALNUM_invlist[] = {  /* for ASCII/Latin1 */
        0x1E2EC,
        0x1E2F0,
        0x1E2FA,
+       0x1E4D0,
+       0x1E4EC,
+       0x1E4F0,
+       0x1E4FA,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -141338,7 +142302,7 @@ static const UV UNI_XPOSIXALNUM_invlist[] = {  /* for ASCII/Latin1 */
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -141348,7 +142312,9 @@ static const UV UNI_XPOSIXALNUM_invlist[] = {  /* for ASCII/Latin1 */
        0x2F800,
        0x2FA1E,
        0x30000,
-       0x3134B
+       0x3134B,
+       0x31350,
+       0x323B0
 };
 
 #  endif       /* ASCII/Latin1 */
@@ -141359,7 +142325,7 @@ static const UV UNI_XPOSIXALNUM_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_XPOSIXALNUM_invlist[] = {  /* for EBCDIC 1047 */
-       1545,   /* Number of elements */
+       1569,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -141665,8 +142631,6 @@ static const UV UNI_XPOSIXALNUM_invlist[] = {  /* for EBCDIC 1047 */
        0xBE6,
        0xBF0,
        0xC00,
-       0xC04,
-       0xC05,
        0xC0D,
        0xC0E,
        0xC11,
@@ -141717,7 +142681,7 @@ static const UV UNI_XPOSIXALNUM_invlist[] = {  /* for EBCDIC 1047 */
        0xCE6,
        0xCF0,
        0xCF1,
-       0xCF3,
+       0xCF4,
        0xD00,
        0xD0D,
        0xD0E,
@@ -141803,7 +142767,7 @@ static const UV UNI_XPOSIXALNUM_invlist[] = {  /* for EBCDIC 1047 */
        0xF49,
        0xF6D,
        0xF71,
-       0xF82,
+       0xF84,
        0xF88,
        0xF98,
        0xF99,
@@ -142422,7 +143386,7 @@ static const UV UNI_XPOSIXALNUM_invlist[] = {  /* for EBCDIC 1047 */
        0x11070,
        0x11071,
        0x11076,
-       0x11082,
+       0x11080,
        0x110B9,
        0x110C2,
        0x110C3,
@@ -142455,7 +143419,7 @@ static const UV UNI_XPOSIXALNUM_invlist[] = {  /* for EBCDIC 1047 */
        0x11237,
        0x11238,
        0x1123E,
-       0x1123F,
+       0x11242,
        0x11280,
        0x11287,
        0x11288,
@@ -142634,6 +143598,14 @@ static const UV UNI_XPOSIXALNUM_invlist[] = {  /* for EBCDIC 1047 */
        0x11DAA,
        0x11EE0,
        0x11EF7,
+       0x11F00,
+       0x11F11,
+       0x11F12,
+       0x11F3B,
+       0x11F3E,
+       0x11F41,
+       0x11F50,
+       0x11F5A,
        0x11FB0,
        0x11FB1,
        0x12000,
@@ -142645,7 +143617,9 @@ static const UV UNI_XPOSIXALNUM_invlist[] = {  /* for EBCDIC 1047 */
        0x12F90,
        0x12FF1,
        0x13000,
-       0x1342F,
+       0x13430,
+       0x13441,
+       0x13447,
        0x14400,
        0x14647,
        0x16800,
@@ -142698,8 +143672,12 @@ static const UV UNI_XPOSIXALNUM_invlist[] = {  /* for EBCDIC 1047 */
        0x1AFFF,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -142778,6 +143756,8 @@ static const UV UNI_XPOSIXALNUM_invlist[] = {  /* for EBCDIC 1047 */
        0x1D800,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
        0x1E000,
        0x1E007,
        0x1E008,
@@ -142788,6 +143768,10 @@ static const UV UNI_XPOSIXALNUM_invlist[] = {  /* for EBCDIC 1047 */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E030,
+       0x1E06E,
+       0x1E08F,
+       0x1E090,
        0x1E100,
        0x1E12D,
        0x1E137,
@@ -142802,6 +143786,10 @@ static const UV UNI_XPOSIXALNUM_invlist[] = {  /* for EBCDIC 1047 */
        0x1E2EC,
        0x1E2F0,
        0x1E2FA,
+       0x1E4D0,
+       0x1E4EC,
+       0x1E4F0,
+       0x1E4FA,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -142897,7 +143885,7 @@ static const UV UNI_XPOSIXALNUM_invlist[] = {  /* for EBCDIC 1047 */
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -142907,7 +143895,9 @@ static const UV UNI_XPOSIXALNUM_invlist[] = {  /* for EBCDIC 1047 */
        0x2F800,
        0x2FA1E,
        0x30000,
-       0x3134B
+       0x3134B,
+       0x31350,
+       0x323B0
 };
 
 #  endif       /* EBCDIC 1047 */
@@ -142918,7 +143908,7 @@ static const UV UNI_XPOSIXALNUM_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_XPOSIXALNUM_invlist[] = {  /* for EBCDIC 037 */
-       1541,   /* Number of elements */
+       1565,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -143220,8 +144210,6 @@ static const UV UNI_XPOSIXALNUM_invlist[] = {  /* for EBCDIC 037 */
        0xBE6,
        0xBF0,
        0xC00,
-       0xC04,
-       0xC05,
        0xC0D,
        0xC0E,
        0xC11,
@@ -143272,7 +144260,7 @@ static const UV UNI_XPOSIXALNUM_invlist[] = {  /* for EBCDIC 037 */
        0xCE6,
        0xCF0,
        0xCF1,
-       0xCF3,
+       0xCF4,
        0xD00,
        0xD0D,
        0xD0E,
@@ -143358,7 +144346,7 @@ static const UV UNI_XPOSIXALNUM_invlist[] = {  /* for EBCDIC 037 */
        0xF49,
        0xF6D,
        0xF71,
-       0xF82,
+       0xF84,
        0xF88,
        0xF98,
        0xF99,
@@ -143977,7 +144965,7 @@ static const UV UNI_XPOSIXALNUM_invlist[] = {  /* for EBCDIC 037 */
        0x11070,
        0x11071,
        0x11076,
-       0x11082,
+       0x11080,
        0x110B9,
        0x110C2,
        0x110C3,
@@ -144010,7 +144998,7 @@ static const UV UNI_XPOSIXALNUM_invlist[] = {  /* for EBCDIC 037 */
        0x11237,
        0x11238,
        0x1123E,
-       0x1123F,
+       0x11242,
        0x11280,
        0x11287,
        0x11288,
@@ -144189,6 +145177,14 @@ static const UV UNI_XPOSIXALNUM_invlist[] = {  /* for EBCDIC 037 */
        0x11DAA,
        0x11EE0,
        0x11EF7,
+       0x11F00,
+       0x11F11,
+       0x11F12,
+       0x11F3B,
+       0x11F3E,
+       0x11F41,
+       0x11F50,
+       0x11F5A,
        0x11FB0,
        0x11FB1,
        0x12000,
@@ -144200,7 +145196,9 @@ static const UV UNI_XPOSIXALNUM_invlist[] = {  /* for EBCDIC 037 */
        0x12F90,
        0x12FF1,
        0x13000,
-       0x1342F,
+       0x13430,
+       0x13441,
+       0x13447,
        0x14400,
        0x14647,
        0x16800,
@@ -144253,8 +145251,12 @@ static const UV UNI_XPOSIXALNUM_invlist[] = {  /* for EBCDIC 037 */
        0x1AFFF,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -144333,6 +145335,8 @@ static const UV UNI_XPOSIXALNUM_invlist[] = {  /* for EBCDIC 037 */
        0x1D800,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
        0x1E000,
        0x1E007,
        0x1E008,
@@ -144343,6 +145347,10 @@ static const UV UNI_XPOSIXALNUM_invlist[] = {  /* for EBCDIC 037 */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E030,
+       0x1E06E,
+       0x1E08F,
+       0x1E090,
        0x1E100,
        0x1E12D,
        0x1E137,
@@ -144357,6 +145365,10 @@ static const UV UNI_XPOSIXALNUM_invlist[] = {  /* for EBCDIC 037 */
        0x1E2EC,
        0x1E2F0,
        0x1E2FA,
+       0x1E4D0,
+       0x1E4EC,
+       0x1E4F0,
+       0x1E4FA,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -144452,7 +145464,7 @@ static const UV UNI_XPOSIXALNUM_invlist[] = {  /* for EBCDIC 037 */
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -144462,7 +145474,9 @@ static const UV UNI_XPOSIXALNUM_invlist[] = {  /* for EBCDIC 037 */
        0x2F800,
        0x2FA1E,
        0x30000,
-       0x3134B
+       0x3134B,
+       0x31350,
+       0x323B0
 };
 
 #  endif       /* EBCDIC 037 */
@@ -144470,7 +145484,7 @@ static const UV UNI_XPOSIXALNUM_invlist[] = {  /* for EBCDIC 037 */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_XPOSIXALPHA_invlist[] = {  /* for ASCII/Latin1 */
-       1445,   /* Number of elements */
+       1465,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -144744,8 +145758,6 @@ static const UV UNI_XPOSIXALPHA_invlist[] = {  /* for ASCII/Latin1 */
        0xBD7,
        0xBD8,
        0xC00,
-       0xC04,
-       0xC05,
        0xC0D,
        0xC0E,
        0xC11,
@@ -144792,7 +145804,7 @@ static const UV UNI_XPOSIXALPHA_invlist[] = {  /* for ASCII/Latin1 */
        0xCE0,
        0xCE4,
        0xCF1,
-       0xCF3,
+       0xCF4,
        0xD00,
        0xD0D,
        0xD0E,
@@ -144868,7 +145880,7 @@ static const UV UNI_XPOSIXALPHA_invlist[] = {  /* for ASCII/Latin1 */
        0xF49,
        0xF6D,
        0xF71,
-       0xF82,
+       0xF84,
        0xF88,
        0xF98,
        0xF99,
@@ -145471,7 +146483,7 @@ static const UV UNI_XPOSIXALPHA_invlist[] = {  /* for ASCII/Latin1 */
        0x11046,
        0x11071,
        0x11076,
-       0x11082,
+       0x11080,
        0x110B9,
        0x110C2,
        0x110C3,
@@ -145502,7 +146514,7 @@ static const UV UNI_XPOSIXALPHA_invlist[] = {  /* for ASCII/Latin1 */
        0x11237,
        0x11238,
        0x1123E,
-       0x1123F,
+       0x11242,
        0x11280,
        0x11287,
        0x11288,
@@ -145661,6 +146673,12 @@ static const UV UNI_XPOSIXALPHA_invlist[] = {  /* for ASCII/Latin1 */
        0x11D99,
        0x11EE0,
        0x11EF7,
+       0x11F00,
+       0x11F11,
+       0x11F12,
+       0x11F3B,
+       0x11F3E,
+       0x11F41,
        0x11FB0,
        0x11FB1,
        0x12000,
@@ -145672,7 +146690,9 @@ static const UV UNI_XPOSIXALPHA_invlist[] = {  /* for ASCII/Latin1 */
        0x12F90,
        0x12FF1,
        0x13000,
-       0x1342F,
+       0x13430,
+       0x13441,
+       0x13447,
        0x14400,
        0x14647,
        0x16800,
@@ -145719,8 +146739,12 @@ static const UV UNI_XPOSIXALPHA_invlist[] = {  /* for ASCII/Latin1 */
        0x1AFFF,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -145797,6 +146821,8 @@ static const UV UNI_XPOSIXALPHA_invlist[] = {  /* for ASCII/Latin1 */
        0x1D7CC,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
        0x1E000,
        0x1E007,
        0x1E008,
@@ -145807,6 +146833,10 @@ static const UV UNI_XPOSIXALPHA_invlist[] = {  /* for ASCII/Latin1 */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E030,
+       0x1E06E,
+       0x1E08F,
+       0x1E090,
        0x1E100,
        0x1E12D,
        0x1E137,
@@ -145817,6 +146847,8 @@ static const UV UNI_XPOSIXALPHA_invlist[] = {  /* for ASCII/Latin1 */
        0x1E2AE,
        0x1E2C0,
        0x1E2EC,
+       0x1E4D0,
+       0x1E4EC,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -145908,7 +146940,7 @@ static const UV UNI_XPOSIXALPHA_invlist[] = {  /* for ASCII/Latin1 */
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -145918,7 +146950,9 @@ static const UV UNI_XPOSIXALPHA_invlist[] = {  /* for ASCII/Latin1 */
        0x2F800,
        0x2FA1E,
        0x30000,
-       0x3134B
+       0x3134B,
+       0x31350,
+       0x323B0
 };
 
 #  endif       /* ASCII/Latin1 */
@@ -145929,7 +146963,7 @@ static const UV UNI_XPOSIXALPHA_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_XPOSIXALPHA_invlist[] = {  /* for EBCDIC 1047 */
-       1471,   /* Number of elements */
+       1491,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -146229,8 +147263,6 @@ static const UV UNI_XPOSIXALPHA_invlist[] = {  /* for EBCDIC 1047 */
        0xBD7,
        0xBD8,
        0xC00,
-       0xC04,
-       0xC05,
        0xC0D,
        0xC0E,
        0xC11,
@@ -146277,7 +147309,7 @@ static const UV UNI_XPOSIXALPHA_invlist[] = {  /* for EBCDIC 1047 */
        0xCE0,
        0xCE4,
        0xCF1,
-       0xCF3,
+       0xCF4,
        0xD00,
        0xD0D,
        0xD0E,
@@ -146353,7 +147385,7 @@ static const UV UNI_XPOSIXALPHA_invlist[] = {  /* for EBCDIC 1047 */
        0xF49,
        0xF6D,
        0xF71,
-       0xF82,
+       0xF84,
        0xF88,
        0xF98,
        0xF99,
@@ -146956,7 +147988,7 @@ static const UV UNI_XPOSIXALPHA_invlist[] = {  /* for EBCDIC 1047 */
        0x11046,
        0x11071,
        0x11076,
-       0x11082,
+       0x11080,
        0x110B9,
        0x110C2,
        0x110C3,
@@ -146987,7 +148019,7 @@ static const UV UNI_XPOSIXALPHA_invlist[] = {  /* for EBCDIC 1047 */
        0x11237,
        0x11238,
        0x1123E,
-       0x1123F,
+       0x11242,
        0x11280,
        0x11287,
        0x11288,
@@ -147146,6 +148178,12 @@ static const UV UNI_XPOSIXALPHA_invlist[] = {  /* for EBCDIC 1047 */
        0x11D99,
        0x11EE0,
        0x11EF7,
+       0x11F00,
+       0x11F11,
+       0x11F12,
+       0x11F3B,
+       0x11F3E,
+       0x11F41,
        0x11FB0,
        0x11FB1,
        0x12000,
@@ -147157,7 +148195,9 @@ static const UV UNI_XPOSIXALPHA_invlist[] = {  /* for EBCDIC 1047 */
        0x12F90,
        0x12FF1,
        0x13000,
-       0x1342F,
+       0x13430,
+       0x13441,
+       0x13447,
        0x14400,
        0x14647,
        0x16800,
@@ -147204,8 +148244,12 @@ static const UV UNI_XPOSIXALPHA_invlist[] = {  /* for EBCDIC 1047 */
        0x1AFFF,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -147282,6 +148326,8 @@ static const UV UNI_XPOSIXALPHA_invlist[] = {  /* for EBCDIC 1047 */
        0x1D7CC,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
        0x1E000,
        0x1E007,
        0x1E008,
@@ -147292,6 +148338,10 @@ static const UV UNI_XPOSIXALPHA_invlist[] = {  /* for EBCDIC 1047 */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E030,
+       0x1E06E,
+       0x1E08F,
+       0x1E090,
        0x1E100,
        0x1E12D,
        0x1E137,
@@ -147302,6 +148352,8 @@ static const UV UNI_XPOSIXALPHA_invlist[] = {  /* for EBCDIC 1047 */
        0x1E2AE,
        0x1E2C0,
        0x1E2EC,
+       0x1E4D0,
+       0x1E4EC,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -147393,7 +148445,7 @@ static const UV UNI_XPOSIXALPHA_invlist[] = {  /* for EBCDIC 1047 */
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -147403,7 +148455,9 @@ static const UV UNI_XPOSIXALPHA_invlist[] = {  /* for EBCDIC 1047 */
        0x2F800,
        0x2FA1E,
        0x30000,
-       0x3134B
+       0x3134B,
+       0x31350,
+       0x323B0
 };
 
 #  endif       /* EBCDIC 1047 */
@@ -147414,7 +148468,7 @@ static const UV UNI_XPOSIXALPHA_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_XPOSIXALPHA_invlist[] = {  /* for EBCDIC 037 */
-       1467,   /* Number of elements */
+       1487,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -147710,8 +148764,6 @@ static const UV UNI_XPOSIXALPHA_invlist[] = {  /* for EBCDIC 037 */
        0xBD7,
        0xBD8,
        0xC00,
-       0xC04,
-       0xC05,
        0xC0D,
        0xC0E,
        0xC11,
@@ -147758,7 +148810,7 @@ static const UV UNI_XPOSIXALPHA_invlist[] = {  /* for EBCDIC 037 */
        0xCE0,
        0xCE4,
        0xCF1,
-       0xCF3,
+       0xCF4,
        0xD00,
        0xD0D,
        0xD0E,
@@ -147834,7 +148886,7 @@ static const UV UNI_XPOSIXALPHA_invlist[] = {  /* for EBCDIC 037 */
        0xF49,
        0xF6D,
        0xF71,
-       0xF82,
+       0xF84,
        0xF88,
        0xF98,
        0xF99,
@@ -148437,7 +149489,7 @@ static const UV UNI_XPOSIXALPHA_invlist[] = {  /* for EBCDIC 037 */
        0x11046,
        0x11071,
        0x11076,
-       0x11082,
+       0x11080,
        0x110B9,
        0x110C2,
        0x110C3,
@@ -148468,7 +149520,7 @@ static const UV UNI_XPOSIXALPHA_invlist[] = {  /* for EBCDIC 037 */
        0x11237,
        0x11238,
        0x1123E,
-       0x1123F,
+       0x11242,
        0x11280,
        0x11287,
        0x11288,
@@ -148627,6 +149679,12 @@ static const UV UNI_XPOSIXALPHA_invlist[] = {  /* for EBCDIC 037 */
        0x11D99,
        0x11EE0,
        0x11EF7,
+       0x11F00,
+       0x11F11,
+       0x11F12,
+       0x11F3B,
+       0x11F3E,
+       0x11F41,
        0x11FB0,
        0x11FB1,
        0x12000,
@@ -148638,7 +149696,9 @@ static const UV UNI_XPOSIXALPHA_invlist[] = {  /* for EBCDIC 037 */
        0x12F90,
        0x12FF1,
        0x13000,
-       0x1342F,
+       0x13430,
+       0x13441,
+       0x13447,
        0x14400,
        0x14647,
        0x16800,
@@ -148685,8 +149745,12 @@ static const UV UNI_XPOSIXALPHA_invlist[] = {  /* for EBCDIC 037 */
        0x1AFFF,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -148763,6 +149827,8 @@ static const UV UNI_XPOSIXALPHA_invlist[] = {  /* for EBCDIC 037 */
        0x1D7CC,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
        0x1E000,
        0x1E007,
        0x1E008,
@@ -148773,6 +149839,10 @@ static const UV UNI_XPOSIXALPHA_invlist[] = {  /* for EBCDIC 037 */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E030,
+       0x1E06E,
+       0x1E08F,
+       0x1E090,
        0x1E100,
        0x1E12D,
        0x1E137,
@@ -148783,6 +149853,8 @@ static const UV UNI_XPOSIXALPHA_invlist[] = {  /* for EBCDIC 037 */
        0x1E2AE,
        0x1E2C0,
        0x1E2EC,
+       0x1E4D0,
+       0x1E4EC,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -148874,7 +149946,7 @@ static const UV UNI_XPOSIXALPHA_invlist[] = {  /* for EBCDIC 037 */
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -148884,7 +149956,9 @@ static const UV UNI_XPOSIXALPHA_invlist[] = {  /* for EBCDIC 037 */
        0x2F800,
        0x2FA1E,
        0x30000,
-       0x3134B
+       0x3134B,
+       0x31350,
+       0x323B0
 };
 
 #  endif       /* EBCDIC 037 */
@@ -149029,7 +150103,7 @@ static const UV UNI_XPOSIXCNTRL_invlist[] = {  /* for EBCDIC 037 */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_XPOSIXDIGIT_invlist[] = {  /* for ASCII/Latin1 */
-       125,    /* Number of elements */
+       129,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -149142,6 +150216,8 @@ static const UV UNI_XPOSIXDIGIT_invlist[] = {  /* for ASCII/Latin1 */
        0x11D5A,
        0x11DA0,
        0x11DAA,
+       0x11F50,
+       0x11F5A,
        0x16A60,
        0x16A6A,
        0x16AC0,
@@ -149154,6 +150230,8 @@ static const UV UNI_XPOSIXDIGIT_invlist[] = {  /* for ASCII/Latin1 */
        0x1E14A,
        0x1E2F0,
        0x1E2FA,
+       0x1E4F0,
+       0x1E4FA,
        0x1E950,
        0x1E95A,
        0x1FBF0,
@@ -149168,7 +150246,7 @@ static const UV UNI_XPOSIXDIGIT_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_XPOSIXDIGIT_invlist[] = {  /* for EBCDIC 1047 */
-       125,    /* Number of elements */
+       129,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -149281,6 +150359,8 @@ static const UV UNI_XPOSIXDIGIT_invlist[] = {  /* for EBCDIC 1047 */
        0x11D5A,
        0x11DA0,
        0x11DAA,
+       0x11F50,
+       0x11F5A,
        0x16A60,
        0x16A6A,
        0x16AC0,
@@ -149293,6 +150373,8 @@ static const UV UNI_XPOSIXDIGIT_invlist[] = {  /* for EBCDIC 1047 */
        0x1E14A,
        0x1E2F0,
        0x1E2FA,
+       0x1E4F0,
+       0x1E4FA,
        0x1E950,
        0x1E95A,
        0x1FBF0,
@@ -149307,7 +150389,7 @@ static const UV UNI_XPOSIXDIGIT_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_XPOSIXDIGIT_invlist[] = {  /* for EBCDIC 037 */
-       125,    /* Number of elements */
+       129,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -149420,6 +150502,8 @@ static const UV UNI_XPOSIXDIGIT_invlist[] = {  /* for EBCDIC 037 */
        0x11D5A,
        0x11DA0,
        0x11DAA,
+       0x11F50,
+       0x11F5A,
        0x16A60,
        0x16A6A,
        0x16AC0,
@@ -149432,6 +150516,8 @@ static const UV UNI_XPOSIXDIGIT_invlist[] = {  /* for EBCDIC 037 */
        0x1E14A,
        0x1E2F0,
        0x1E2FA,
+       0x1E4F0,
+       0x1E4FA,
        0x1E950,
        0x1E95A,
        0x1FBF0,
@@ -149443,7 +150529,7 @@ static const UV UNI_XPOSIXDIGIT_invlist[] = {  /* for EBCDIC 037 */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_XPOSIXGRAPH_invlist[] = {  /* for ASCII/Latin1 */
-       1407,   /* Number of elements */
+       1425,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -149693,7 +150779,7 @@ static const UV UNI_XPOSIXGRAPH_invlist[] = {  /* for ASCII/Latin1 */
        0xCE6,
        0xCF0,
        0xCF1,
-       0xCF3,
+       0xCF4,
        0xD00,
        0xD0D,
        0xD0E,
@@ -149753,7 +150839,7 @@ static const UV UNI_XPOSIXGRAPH_invlist[] = {  /* for ASCII/Latin1 */
        0xEC6,
        0xEC7,
        0xEC8,
-       0xECE,
+       0xECF,
        0xED0,
        0xEDA,
        0xEDC,
@@ -150302,7 +151388,7 @@ static const UV UNI_XPOSIXGRAPH_invlist[] = {  /* for ASCII/Latin1 */
        0x10EAE,
        0x10EB0,
        0x10EB2,
-       0x10F00,
+       0x10EFD,
        0x10F28,
        0x10F30,
        0x10F5A,
@@ -150337,7 +151423,7 @@ static const UV UNI_XPOSIXGRAPH_invlist[] = {  /* for ASCII/Latin1 */
        0x11200,
        0x11212,
        0x11213,
-       0x1123F,
+       0x11242,
        0x11280,
        0x11287,
        0x11288,
@@ -150442,6 +151528,8 @@ static const UV UNI_XPOSIXGRAPH_invlist[] = {  /* for ASCII/Latin1 */
        0x11AA3,
        0x11AB0,
        0x11AF9,
+       0x11B00,
+       0x11B0A,
        0x11C00,
        0x11C09,
        0x11C0A,
@@ -150484,6 +151572,12 @@ static const UV UNI_XPOSIXGRAPH_invlist[] = {  /* for ASCII/Latin1 */
        0x11DAA,
        0x11EE0,
        0x11EF9,
+       0x11F00,
+       0x11F11,
+       0x11F12,
+       0x11F3B,
+       0x11F3E,
+       0x11F5A,
        0x11FB0,
        0x11FB1,
        0x11FC0,
@@ -150499,9 +151593,7 @@ static const UV UNI_XPOSIXGRAPH_invlist[] = {  /* for ASCII/Latin1 */
        0x12F90,
        0x12FF3,
        0x13000,
-       0x1342F,
-       0x13430,
-       0x13439,
+       0x13456,
        0x14400,
        0x14647,
        0x16800,
@@ -150554,8 +151646,12 @@ static const UV UNI_XPOSIXGRAPH_invlist[] = {  /* for ASCII/Latin1 */
        0x1AFFF,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -150584,6 +151680,8 @@ static const UV UNI_XPOSIXGRAPH_invlist[] = {  /* for ASCII/Latin1 */
        0x1D1EB,
        0x1D200,
        0x1D246,
+       0x1D2C0,
+       0x1D2D4,
        0x1D2E0,
        0x1D2F4,
        0x1D300,
@@ -150638,6 +151736,8 @@ static const UV UNI_XPOSIXGRAPH_invlist[] = {  /* for ASCII/Latin1 */
        0x1DAB0,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
        0x1E000,
        0x1E007,
        0x1E008,
@@ -150648,6 +151748,10 @@ static const UV UNI_XPOSIXGRAPH_invlist[] = {  /* for ASCII/Latin1 */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E030,
+       0x1E06E,
+       0x1E08F,
+       0x1E090,
        0x1E100,
        0x1E12D,
        0x1E130,
@@ -150662,6 +151766,8 @@ static const UV UNI_XPOSIXGRAPH_invlist[] = {  /* for ASCII/Latin1 */
        0x1E2FA,
        0x1E2FF,
        0x1E300,
+       0x1E4D0,
+       0x1E4FA,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -150778,14 +151884,14 @@ static const UV UNI_XPOSIXGRAPH_invlist[] = {  /* for ASCII/Latin1 */
        0x1F266,
        0x1F300,
        0x1F6D8,
-       0x1F6DD,
+       0x1F6DC,
        0x1F6ED,
        0x1F6F0,
        0x1F6FD,
        0x1F700,
-       0x1F774,
-       0x1F780,
-       0x1F7D9,
+       0x1F777,
+       0x1F77B,
+       0x1F7DA,
        0x1F7E0,
        0x1F7EC,
        0x1F7F0,
@@ -150807,23 +151913,19 @@ static const UV UNI_XPOSIXGRAPH_invlist[] = {  /* for ASCII/Latin1 */
        0x1FA60,
        0x1FA6E,
        0x1FA70,
-       0x1FA75,
-       0x1FA78,
        0x1FA7D,
        0x1FA80,
-       0x1FA87,
+       0x1FA89,
        0x1FA90,
-       0x1FAAD,
-       0x1FAB0,
-       0x1FABB,
-       0x1FAC0,
+       0x1FABE,
+       0x1FABF,
        0x1FAC6,
-       0x1FAD0,
-       0x1FADA,
+       0x1FACE,
+       0x1FADC,
        0x1FAE0,
-       0x1FAE8,
+       0x1FAE9,
        0x1FAF0,
-       0x1FAF7,
+       0x1FAF9,
        0x1FB00,
        0x1FB93,
        0x1FB94,
@@ -150833,7 +151935,7 @@ static const UV UNI_XPOSIXGRAPH_invlist[] = {  /* for ASCII/Latin1 */
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -150844,6 +151946,8 @@ static const UV UNI_XPOSIXGRAPH_invlist[] = {  /* for ASCII/Latin1 */
        0x2FA1E,
        0x30000,
        0x3134B,
+       0x31350,
+       0x323B0,
        0xE0001,
        0xE0002,
        0xE0020,
@@ -150864,7 +151968,7 @@ static const UV UNI_XPOSIXGRAPH_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_XPOSIXGRAPH_invlist[] = {  /* for EBCDIC 1047 */
-       1407,   /* Number of elements */
+       1425,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -151114,7 +152218,7 @@ static const UV UNI_XPOSIXGRAPH_invlist[] = {  /* for EBCDIC 1047 */
        0xCE6,
        0xCF0,
        0xCF1,
-       0xCF3,
+       0xCF4,
        0xD00,
        0xD0D,
        0xD0E,
@@ -151174,7 +152278,7 @@ static const UV UNI_XPOSIXGRAPH_invlist[] = {  /* for EBCDIC 1047 */
        0xEC6,
        0xEC7,
        0xEC8,
-       0xECE,
+       0xECF,
        0xED0,
        0xEDA,
        0xEDC,
@@ -151723,7 +152827,7 @@ static const UV UNI_XPOSIXGRAPH_invlist[] = {  /* for EBCDIC 1047 */
        0x10EAE,
        0x10EB0,
        0x10EB2,
-       0x10F00,
+       0x10EFD,
        0x10F28,
        0x10F30,
        0x10F5A,
@@ -151758,7 +152862,7 @@ static const UV UNI_XPOSIXGRAPH_invlist[] = {  /* for EBCDIC 1047 */
        0x11200,
        0x11212,
        0x11213,
-       0x1123F,
+       0x11242,
        0x11280,
        0x11287,
        0x11288,
@@ -151863,6 +152967,8 @@ static const UV UNI_XPOSIXGRAPH_invlist[] = {  /* for EBCDIC 1047 */
        0x11AA3,
        0x11AB0,
        0x11AF9,
+       0x11B00,
+       0x11B0A,
        0x11C00,
        0x11C09,
        0x11C0A,
@@ -151905,6 +153011,12 @@ static const UV UNI_XPOSIXGRAPH_invlist[] = {  /* for EBCDIC 1047 */
        0x11DAA,
        0x11EE0,
        0x11EF9,
+       0x11F00,
+       0x11F11,
+       0x11F12,
+       0x11F3B,
+       0x11F3E,
+       0x11F5A,
        0x11FB0,
        0x11FB1,
        0x11FC0,
@@ -151920,9 +153032,7 @@ static const UV UNI_XPOSIXGRAPH_invlist[] = {  /* for EBCDIC 1047 */
        0x12F90,
        0x12FF3,
        0x13000,
-       0x1342F,
-       0x13430,
-       0x13439,
+       0x13456,
        0x14400,
        0x14647,
        0x16800,
@@ -151975,8 +153085,12 @@ static const UV UNI_XPOSIXGRAPH_invlist[] = {  /* for EBCDIC 1047 */
        0x1AFFF,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -152005,6 +153119,8 @@ static const UV UNI_XPOSIXGRAPH_invlist[] = {  /* for EBCDIC 1047 */
        0x1D1EB,
        0x1D200,
        0x1D246,
+       0x1D2C0,
+       0x1D2D4,
        0x1D2E0,
        0x1D2F4,
        0x1D300,
@@ -152059,6 +153175,8 @@ static const UV UNI_XPOSIXGRAPH_invlist[] = {  /* for EBCDIC 1047 */
        0x1DAB0,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
        0x1E000,
        0x1E007,
        0x1E008,
@@ -152069,6 +153187,10 @@ static const UV UNI_XPOSIXGRAPH_invlist[] = {  /* for EBCDIC 1047 */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E030,
+       0x1E06E,
+       0x1E08F,
+       0x1E090,
        0x1E100,
        0x1E12D,
        0x1E130,
@@ -152083,6 +153205,8 @@ static const UV UNI_XPOSIXGRAPH_invlist[] = {  /* for EBCDIC 1047 */
        0x1E2FA,
        0x1E2FF,
        0x1E300,
+       0x1E4D0,
+       0x1E4FA,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -152199,14 +153323,14 @@ static const UV UNI_XPOSIXGRAPH_invlist[] = {  /* for EBCDIC 1047 */
        0x1F266,
        0x1F300,
        0x1F6D8,
-       0x1F6DD,
+       0x1F6DC,
        0x1F6ED,
        0x1F6F0,
        0x1F6FD,
        0x1F700,
-       0x1F774,
-       0x1F780,
-       0x1F7D9,
+       0x1F777,
+       0x1F77B,
+       0x1F7DA,
        0x1F7E0,
        0x1F7EC,
        0x1F7F0,
@@ -152228,23 +153352,19 @@ static const UV UNI_XPOSIXGRAPH_invlist[] = {  /* for EBCDIC 1047 */
        0x1FA60,
        0x1FA6E,
        0x1FA70,
-       0x1FA75,
-       0x1FA78,
        0x1FA7D,
        0x1FA80,
-       0x1FA87,
+       0x1FA89,
        0x1FA90,
-       0x1FAAD,
-       0x1FAB0,
-       0x1FABB,
-       0x1FAC0,
+       0x1FABE,
+       0x1FABF,
        0x1FAC6,
-       0x1FAD0,
-       0x1FADA,
+       0x1FACE,
+       0x1FADC,
        0x1FAE0,
-       0x1FAE8,
+       0x1FAE9,
        0x1FAF0,
-       0x1FAF7,
+       0x1FAF9,
        0x1FB00,
        0x1FB93,
        0x1FB94,
@@ -152254,7 +153374,7 @@ static const UV UNI_XPOSIXGRAPH_invlist[] = {  /* for EBCDIC 1047 */
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -152265,6 +153385,8 @@ static const UV UNI_XPOSIXGRAPH_invlist[] = {  /* for EBCDIC 1047 */
        0x2FA1E,
        0x30000,
        0x3134B,
+       0x31350,
+       0x323B0,
        0xE0001,
        0xE0002,
        0xE0020,
@@ -152285,7 +153407,7 @@ static const UV UNI_XPOSIXGRAPH_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_XPOSIXGRAPH_invlist[] = {  /* for EBCDIC 037 */
-       1407,   /* Number of elements */
+       1425,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -152535,7 +153657,7 @@ static const UV UNI_XPOSIXGRAPH_invlist[] = {  /* for EBCDIC 037 */
        0xCE6,
        0xCF0,
        0xCF1,
-       0xCF3,
+       0xCF4,
        0xD00,
        0xD0D,
        0xD0E,
@@ -152595,7 +153717,7 @@ static const UV UNI_XPOSIXGRAPH_invlist[] = {  /* for EBCDIC 037 */
        0xEC6,
        0xEC7,
        0xEC8,
-       0xECE,
+       0xECF,
        0xED0,
        0xEDA,
        0xEDC,
@@ -153144,7 +154266,7 @@ static const UV UNI_XPOSIXGRAPH_invlist[] = {  /* for EBCDIC 037 */
        0x10EAE,
        0x10EB0,
        0x10EB2,
-       0x10F00,
+       0x10EFD,
        0x10F28,
        0x10F30,
        0x10F5A,
@@ -153179,7 +154301,7 @@ static const UV UNI_XPOSIXGRAPH_invlist[] = {  /* for EBCDIC 037 */
        0x11200,
        0x11212,
        0x11213,
-       0x1123F,
+       0x11242,
        0x11280,
        0x11287,
        0x11288,
@@ -153284,6 +154406,8 @@ static const UV UNI_XPOSIXGRAPH_invlist[] = {  /* for EBCDIC 037 */
        0x11AA3,
        0x11AB0,
        0x11AF9,
+       0x11B00,
+       0x11B0A,
        0x11C00,
        0x11C09,
        0x11C0A,
@@ -153326,6 +154450,12 @@ static const UV UNI_XPOSIXGRAPH_invlist[] = {  /* for EBCDIC 037 */
        0x11DAA,
        0x11EE0,
        0x11EF9,
+       0x11F00,
+       0x11F11,
+       0x11F12,
+       0x11F3B,
+       0x11F3E,
+       0x11F5A,
        0x11FB0,
        0x11FB1,
        0x11FC0,
@@ -153341,9 +154471,7 @@ static const UV UNI_XPOSIXGRAPH_invlist[] = {  /* for EBCDIC 037 */
        0x12F90,
        0x12FF3,
        0x13000,
-       0x1342F,
-       0x13430,
-       0x13439,
+       0x13456,
        0x14400,
        0x14647,
        0x16800,
@@ -153396,8 +154524,12 @@ static const UV UNI_XPOSIXGRAPH_invlist[] = {  /* for EBCDIC 037 */
        0x1AFFF,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -153426,6 +154558,8 @@ static const UV UNI_XPOSIXGRAPH_invlist[] = {  /* for EBCDIC 037 */
        0x1D1EB,
        0x1D200,
        0x1D246,
+       0x1D2C0,
+       0x1D2D4,
        0x1D2E0,
        0x1D2F4,
        0x1D300,
@@ -153480,6 +154614,8 @@ static const UV UNI_XPOSIXGRAPH_invlist[] = {  /* for EBCDIC 037 */
        0x1DAB0,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
        0x1E000,
        0x1E007,
        0x1E008,
@@ -153490,6 +154626,10 @@ static const UV UNI_XPOSIXGRAPH_invlist[] = {  /* for EBCDIC 037 */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E030,
+       0x1E06E,
+       0x1E08F,
+       0x1E090,
        0x1E100,
        0x1E12D,
        0x1E130,
@@ -153504,6 +154644,8 @@ static const UV UNI_XPOSIXGRAPH_invlist[] = {  /* for EBCDIC 037 */
        0x1E2FA,
        0x1E2FF,
        0x1E300,
+       0x1E4D0,
+       0x1E4FA,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -153620,14 +154762,14 @@ static const UV UNI_XPOSIXGRAPH_invlist[] = {  /* for EBCDIC 037 */
        0x1F266,
        0x1F300,
        0x1F6D8,
-       0x1F6DD,
+       0x1F6DC,
        0x1F6ED,
        0x1F6F0,
        0x1F6FD,
        0x1F700,
-       0x1F774,
-       0x1F780,
-       0x1F7D9,
+       0x1F777,
+       0x1F77B,
+       0x1F7DA,
        0x1F7E0,
        0x1F7EC,
        0x1F7F0,
@@ -153649,23 +154791,19 @@ static const UV UNI_XPOSIXGRAPH_invlist[] = {  /* for EBCDIC 037 */
        0x1FA60,
        0x1FA6E,
        0x1FA70,
-       0x1FA75,
-       0x1FA78,
        0x1FA7D,
        0x1FA80,
-       0x1FA87,
+       0x1FA89,
        0x1FA90,
-       0x1FAAD,
-       0x1FAB0,
-       0x1FABB,
-       0x1FAC0,
+       0x1FABE,
+       0x1FABF,
        0x1FAC6,
-       0x1FAD0,
-       0x1FADA,
+       0x1FACE,
+       0x1FADC,
        0x1FAE0,
-       0x1FAE8,
+       0x1FAE9,
        0x1FAF0,
-       0x1FAF7,
+       0x1FAF9,
        0x1FB00,
        0x1FB93,
        0x1FB94,
@@ -153675,7 +154813,7 @@ static const UV UNI_XPOSIXGRAPH_invlist[] = {  /* for EBCDIC 037 */
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -153686,6 +154824,8 @@ static const UV UNI_XPOSIXGRAPH_invlist[] = {  /* for EBCDIC 037 */
        0x2FA1E,
        0x30000,
        0x3134B,
+       0x31350,
+       0x323B0,
        0xE0001,
        0xE0002,
        0xE0020,
@@ -153703,7 +154843,7 @@ static const UV UNI_XPOSIXGRAPH_invlist[] = {  /* for EBCDIC 037 */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_XPOSIXLOWER_invlist[] = {  /* for ASCII/Latin1 */
-       1337,   /* Number of elements */
+       1343,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -154260,7 +155400,7 @@ static const UV UNI_XPOSIXLOWER_invlist[] = {  /* for ASCII/Latin1 */
        0x589,
        0x10D0,
        0x10FB,
-       0x10FD,
+       0x10FC,
        0x1100,
        0x13F8,
        0x13FE,
@@ -154940,6 +156080,8 @@ static const UV UNI_XPOSIXLOWER_invlist[] = {  /* for ASCII/Latin1 */
        0xA7D8,
        0xA7D9,
        0xA7DA,
+       0xA7F2,
+       0xA7F5,
        0xA7F6,
        0xA7F7,
        0xA7F8,
@@ -154947,7 +156089,7 @@ static const UV UNI_XPOSIXLOWER_invlist[] = {  /* for ASCII/Latin1 */
        0xAB30,
        0xAB5B,
        0xAB5C,
-       0xAB69,
+       0xAB6A,
        0xAB70,
        0xABC0,
        0xFB00,
@@ -155042,6 +156184,10 @@ static const UV UNI_XPOSIXLOWER_invlist[] = {  /* for ASCII/Latin1 */
        0x1DF0A,
        0x1DF0B,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
+       0x1E030,
+       0x1E06E,
        0x1E922,
        0x1E944
 };
@@ -155054,7 +156200,7 @@ static const UV UNI_XPOSIXLOWER_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_XPOSIXLOWER_invlist[] = {  /* for EBCDIC 1047 */
-       1345,   /* Number of elements */
+       1351,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -155619,7 +156765,7 @@ static const UV UNI_XPOSIXLOWER_invlist[] = {  /* for EBCDIC 1047 */
        0x589,
        0x10D0,
        0x10FB,
-       0x10FD,
+       0x10FC,
        0x1100,
        0x13F8,
        0x13FE,
@@ -156299,6 +157445,8 @@ static const UV UNI_XPOSIXLOWER_invlist[] = {  /* for EBCDIC 1047 */
        0xA7D8,
        0xA7D9,
        0xA7DA,
+       0xA7F2,
+       0xA7F5,
        0xA7F6,
        0xA7F7,
        0xA7F8,
@@ -156306,7 +157454,7 @@ static const UV UNI_XPOSIXLOWER_invlist[] = {  /* for EBCDIC 1047 */
        0xAB30,
        0xAB5B,
        0xAB5C,
-       0xAB69,
+       0xAB6A,
        0xAB70,
        0xABC0,
        0xFB00,
@@ -156401,6 +157549,10 @@ static const UV UNI_XPOSIXLOWER_invlist[] = {  /* for EBCDIC 1047 */
        0x1DF0A,
        0x1DF0B,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
+       0x1E030,
+       0x1E06E,
        0x1E922,
        0x1E944
 };
@@ -156413,7 +157565,7 @@ static const UV UNI_XPOSIXLOWER_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_XPOSIXLOWER_invlist[] = {  /* for EBCDIC 037 */
-       1345,   /* Number of elements */
+       1351,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -156978,7 +158130,7 @@ static const UV UNI_XPOSIXLOWER_invlist[] = {  /* for EBCDIC 037 */
        0x589,
        0x10D0,
        0x10FB,
-       0x10FD,
+       0x10FC,
        0x1100,
        0x13F8,
        0x13FE,
@@ -157658,6 +158810,8 @@ static const UV UNI_XPOSIXLOWER_invlist[] = {  /* for EBCDIC 037 */
        0xA7D8,
        0xA7D9,
        0xA7DA,
+       0xA7F2,
+       0xA7F5,
        0xA7F6,
        0xA7F7,
        0xA7F8,
@@ -157665,7 +158819,7 @@ static const UV UNI_XPOSIXLOWER_invlist[] = {  /* for EBCDIC 037 */
        0xAB30,
        0xAB5B,
        0xAB5C,
-       0xAB69,
+       0xAB6A,
        0xAB70,
        0xABC0,
        0xFB00,
@@ -157760,6 +158914,10 @@ static const UV UNI_XPOSIXLOWER_invlist[] = {  /* for EBCDIC 037 */
        0x1DF0A,
        0x1DF0B,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
+       0x1E030,
+       0x1E06E,
        0x1E922,
        0x1E944
 };
@@ -157769,7 +158927,7 @@ static const UV UNI_XPOSIXLOWER_invlist[] = {  /* for EBCDIC 037 */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_XPOSIXPRINT_invlist[] = {  /* for ASCII/Latin1 */
-       1401,   /* Number of elements */
+       1419,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -158019,7 +159177,7 @@ static const UV UNI_XPOSIXPRINT_invlist[] = {  /* for ASCII/Latin1 */
        0xCE6,
        0xCF0,
        0xCF1,
-       0xCF3,
+       0xCF4,
        0xD00,
        0xD0D,
        0xD0E,
@@ -158079,7 +159237,7 @@ static const UV UNI_XPOSIXPRINT_invlist[] = {  /* for ASCII/Latin1 */
        0xEC6,
        0xEC7,
        0xEC8,
-       0xECE,
+       0xECF,
        0xED0,
        0xEDA,
        0xEDC,
@@ -158622,7 +159780,7 @@ static const UV UNI_XPOSIXPRINT_invlist[] = {  /* for ASCII/Latin1 */
        0x10EAE,
        0x10EB0,
        0x10EB2,
-       0x10F00,
+       0x10EFD,
        0x10F28,
        0x10F30,
        0x10F5A,
@@ -158657,7 +159815,7 @@ static const UV UNI_XPOSIXPRINT_invlist[] = {  /* for ASCII/Latin1 */
        0x11200,
        0x11212,
        0x11213,
-       0x1123F,
+       0x11242,
        0x11280,
        0x11287,
        0x11288,
@@ -158762,6 +159920,8 @@ static const UV UNI_XPOSIXPRINT_invlist[] = {  /* for ASCII/Latin1 */
        0x11AA3,
        0x11AB0,
        0x11AF9,
+       0x11B00,
+       0x11B0A,
        0x11C00,
        0x11C09,
        0x11C0A,
@@ -158804,6 +159964,12 @@ static const UV UNI_XPOSIXPRINT_invlist[] = {  /* for ASCII/Latin1 */
        0x11DAA,
        0x11EE0,
        0x11EF9,
+       0x11F00,
+       0x11F11,
+       0x11F12,
+       0x11F3B,
+       0x11F3E,
+       0x11F5A,
        0x11FB0,
        0x11FB1,
        0x11FC0,
@@ -158819,9 +159985,7 @@ static const UV UNI_XPOSIXPRINT_invlist[] = {  /* for ASCII/Latin1 */
        0x12F90,
        0x12FF3,
        0x13000,
-       0x1342F,
-       0x13430,
-       0x13439,
+       0x13456,
        0x14400,
        0x14647,
        0x16800,
@@ -158874,8 +160038,12 @@ static const UV UNI_XPOSIXPRINT_invlist[] = {  /* for ASCII/Latin1 */
        0x1AFFF,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -158904,6 +160072,8 @@ static const UV UNI_XPOSIXPRINT_invlist[] = {  /* for ASCII/Latin1 */
        0x1D1EB,
        0x1D200,
        0x1D246,
+       0x1D2C0,
+       0x1D2D4,
        0x1D2E0,
        0x1D2F4,
        0x1D300,
@@ -158958,6 +160128,8 @@ static const UV UNI_XPOSIXPRINT_invlist[] = {  /* for ASCII/Latin1 */
        0x1DAB0,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
        0x1E000,
        0x1E007,
        0x1E008,
@@ -158968,6 +160140,10 @@ static const UV UNI_XPOSIXPRINT_invlist[] = {  /* for ASCII/Latin1 */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E030,
+       0x1E06E,
+       0x1E08F,
+       0x1E090,
        0x1E100,
        0x1E12D,
        0x1E130,
@@ -158982,6 +160158,8 @@ static const UV UNI_XPOSIXPRINT_invlist[] = {  /* for ASCII/Latin1 */
        0x1E2FA,
        0x1E2FF,
        0x1E300,
+       0x1E4D0,
+       0x1E4FA,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -159098,14 +160276,14 @@ static const UV UNI_XPOSIXPRINT_invlist[] = {  /* for ASCII/Latin1 */
        0x1F266,
        0x1F300,
        0x1F6D8,
-       0x1F6DD,
+       0x1F6DC,
        0x1F6ED,
        0x1F6F0,
        0x1F6FD,
        0x1F700,
-       0x1F774,
-       0x1F780,
-       0x1F7D9,
+       0x1F777,
+       0x1F77B,
+       0x1F7DA,
        0x1F7E0,
        0x1F7EC,
        0x1F7F0,
@@ -159127,23 +160305,19 @@ static const UV UNI_XPOSIXPRINT_invlist[] = {  /* for ASCII/Latin1 */
        0x1FA60,
        0x1FA6E,
        0x1FA70,
-       0x1FA75,
-       0x1FA78,
        0x1FA7D,
        0x1FA80,
-       0x1FA87,
+       0x1FA89,
        0x1FA90,
-       0x1FAAD,
-       0x1FAB0,
-       0x1FABB,
-       0x1FAC0,
+       0x1FABE,
+       0x1FABF,
        0x1FAC6,
-       0x1FAD0,
-       0x1FADA,
+       0x1FACE,
+       0x1FADC,
        0x1FAE0,
-       0x1FAE8,
+       0x1FAE9,
        0x1FAF0,
-       0x1FAF7,
+       0x1FAF9,
        0x1FB00,
        0x1FB93,
        0x1FB94,
@@ -159153,7 +160327,7 @@ static const UV UNI_XPOSIXPRINT_invlist[] = {  /* for ASCII/Latin1 */
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -159164,6 +160338,8 @@ static const UV UNI_XPOSIXPRINT_invlist[] = {  /* for ASCII/Latin1 */
        0x2FA1E,
        0x30000,
        0x3134B,
+       0x31350,
+       0x323B0,
        0xE0001,
        0xE0002,
        0xE0020,
@@ -159184,7 +160360,7 @@ static const UV UNI_XPOSIXPRINT_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_XPOSIXPRINT_invlist[] = {  /* for EBCDIC 1047 */
-       1401,   /* Number of elements */
+       1419,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -159434,7 +160610,7 @@ static const UV UNI_XPOSIXPRINT_invlist[] = {  /* for EBCDIC 1047 */
        0xCE6,
        0xCF0,
        0xCF1,
-       0xCF3,
+       0xCF4,
        0xD00,
        0xD0D,
        0xD0E,
@@ -159494,7 +160670,7 @@ static const UV UNI_XPOSIXPRINT_invlist[] = {  /* for EBCDIC 1047 */
        0xEC6,
        0xEC7,
        0xEC8,
-       0xECE,
+       0xECF,
        0xED0,
        0xEDA,
        0xEDC,
@@ -160037,7 +161213,7 @@ static const UV UNI_XPOSIXPRINT_invlist[] = {  /* for EBCDIC 1047 */
        0x10EAE,
        0x10EB0,
        0x10EB2,
-       0x10F00,
+       0x10EFD,
        0x10F28,
        0x10F30,
        0x10F5A,
@@ -160072,7 +161248,7 @@ static const UV UNI_XPOSIXPRINT_invlist[] = {  /* for EBCDIC 1047 */
        0x11200,
        0x11212,
        0x11213,
-       0x1123F,
+       0x11242,
        0x11280,
        0x11287,
        0x11288,
@@ -160177,6 +161353,8 @@ static const UV UNI_XPOSIXPRINT_invlist[] = {  /* for EBCDIC 1047 */
        0x11AA3,
        0x11AB0,
        0x11AF9,
+       0x11B00,
+       0x11B0A,
        0x11C00,
        0x11C09,
        0x11C0A,
@@ -160219,6 +161397,12 @@ static const UV UNI_XPOSIXPRINT_invlist[] = {  /* for EBCDIC 1047 */
        0x11DAA,
        0x11EE0,
        0x11EF9,
+       0x11F00,
+       0x11F11,
+       0x11F12,
+       0x11F3B,
+       0x11F3E,
+       0x11F5A,
        0x11FB0,
        0x11FB1,
        0x11FC0,
@@ -160234,9 +161418,7 @@ static const UV UNI_XPOSIXPRINT_invlist[] = {  /* for EBCDIC 1047 */
        0x12F90,
        0x12FF3,
        0x13000,
-       0x1342F,
-       0x13430,
-       0x13439,
+       0x13456,
        0x14400,
        0x14647,
        0x16800,
@@ -160289,8 +161471,12 @@ static const UV UNI_XPOSIXPRINT_invlist[] = {  /* for EBCDIC 1047 */
        0x1AFFF,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -160319,6 +161505,8 @@ static const UV UNI_XPOSIXPRINT_invlist[] = {  /* for EBCDIC 1047 */
        0x1D1EB,
        0x1D200,
        0x1D246,
+       0x1D2C0,
+       0x1D2D4,
        0x1D2E0,
        0x1D2F4,
        0x1D300,
@@ -160373,6 +161561,8 @@ static const UV UNI_XPOSIXPRINT_invlist[] = {  /* for EBCDIC 1047 */
        0x1DAB0,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
        0x1E000,
        0x1E007,
        0x1E008,
@@ -160383,6 +161573,10 @@ static const UV UNI_XPOSIXPRINT_invlist[] = {  /* for EBCDIC 1047 */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E030,
+       0x1E06E,
+       0x1E08F,
+       0x1E090,
        0x1E100,
        0x1E12D,
        0x1E130,
@@ -160397,6 +161591,8 @@ static const UV UNI_XPOSIXPRINT_invlist[] = {  /* for EBCDIC 1047 */
        0x1E2FA,
        0x1E2FF,
        0x1E300,
+       0x1E4D0,
+       0x1E4FA,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -160513,14 +161709,14 @@ static const UV UNI_XPOSIXPRINT_invlist[] = {  /* for EBCDIC 1047 */
        0x1F266,
        0x1F300,
        0x1F6D8,
-       0x1F6DD,
+       0x1F6DC,
        0x1F6ED,
        0x1F6F0,
        0x1F6FD,
        0x1F700,
-       0x1F774,
-       0x1F780,
-       0x1F7D9,
+       0x1F777,
+       0x1F77B,
+       0x1F7DA,
        0x1F7E0,
        0x1F7EC,
        0x1F7F0,
@@ -160542,23 +161738,19 @@ static const UV UNI_XPOSIXPRINT_invlist[] = {  /* for EBCDIC 1047 */
        0x1FA60,
        0x1FA6E,
        0x1FA70,
-       0x1FA75,
-       0x1FA78,
        0x1FA7D,
        0x1FA80,
-       0x1FA87,
+       0x1FA89,
        0x1FA90,
-       0x1FAAD,
-       0x1FAB0,
-       0x1FABB,
-       0x1FAC0,
+       0x1FABE,
+       0x1FABF,
        0x1FAC6,
-       0x1FAD0,
-       0x1FADA,
+       0x1FACE,
+       0x1FADC,
        0x1FAE0,
-       0x1FAE8,
+       0x1FAE9,
        0x1FAF0,
-       0x1FAF7,
+       0x1FAF9,
        0x1FB00,
        0x1FB93,
        0x1FB94,
@@ -160568,7 +161760,7 @@ static const UV UNI_XPOSIXPRINT_invlist[] = {  /* for EBCDIC 1047 */
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -160579,6 +161771,8 @@ static const UV UNI_XPOSIXPRINT_invlist[] = {  /* for EBCDIC 1047 */
        0x2FA1E,
        0x30000,
        0x3134B,
+       0x31350,
+       0x323B0,
        0xE0001,
        0xE0002,
        0xE0020,
@@ -160599,7 +161793,7 @@ static const UV UNI_XPOSIXPRINT_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_XPOSIXPRINT_invlist[] = {  /* for EBCDIC 037 */
-       1401,   /* Number of elements */
+       1419,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -160849,7 +162043,7 @@ static const UV UNI_XPOSIXPRINT_invlist[] = {  /* for EBCDIC 037 */
        0xCE6,
        0xCF0,
        0xCF1,
-       0xCF3,
+       0xCF4,
        0xD00,
        0xD0D,
        0xD0E,
@@ -160909,7 +162103,7 @@ static const UV UNI_XPOSIXPRINT_invlist[] = {  /* for EBCDIC 037 */
        0xEC6,
        0xEC7,
        0xEC8,
-       0xECE,
+       0xECF,
        0xED0,
        0xEDA,
        0xEDC,
@@ -161452,7 +162646,7 @@ static const UV UNI_XPOSIXPRINT_invlist[] = {  /* for EBCDIC 037 */
        0x10EAE,
        0x10EB0,
        0x10EB2,
-       0x10F00,
+       0x10EFD,
        0x10F28,
        0x10F30,
        0x10F5A,
@@ -161487,7 +162681,7 @@ static const UV UNI_XPOSIXPRINT_invlist[] = {  /* for EBCDIC 037 */
        0x11200,
        0x11212,
        0x11213,
-       0x1123F,
+       0x11242,
        0x11280,
        0x11287,
        0x11288,
@@ -161592,6 +162786,8 @@ static const UV UNI_XPOSIXPRINT_invlist[] = {  /* for EBCDIC 037 */
        0x11AA3,
        0x11AB0,
        0x11AF9,
+       0x11B00,
+       0x11B0A,
        0x11C00,
        0x11C09,
        0x11C0A,
@@ -161634,6 +162830,12 @@ static const UV UNI_XPOSIXPRINT_invlist[] = {  /* for EBCDIC 037 */
        0x11DAA,
        0x11EE0,
        0x11EF9,
+       0x11F00,
+       0x11F11,
+       0x11F12,
+       0x11F3B,
+       0x11F3E,
+       0x11F5A,
        0x11FB0,
        0x11FB1,
        0x11FC0,
@@ -161649,9 +162851,7 @@ static const UV UNI_XPOSIXPRINT_invlist[] = {  /* for EBCDIC 037 */
        0x12F90,
        0x12FF3,
        0x13000,
-       0x1342F,
-       0x13430,
-       0x13439,
+       0x13456,
        0x14400,
        0x14647,
        0x16800,
@@ -161704,8 +162904,12 @@ static const UV UNI_XPOSIXPRINT_invlist[] = {  /* for EBCDIC 037 */
        0x1AFFF,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -161734,6 +162938,8 @@ static const UV UNI_XPOSIXPRINT_invlist[] = {  /* for EBCDIC 037 */
        0x1D1EB,
        0x1D200,
        0x1D246,
+       0x1D2C0,
+       0x1D2D4,
        0x1D2E0,
        0x1D2F4,
        0x1D300,
@@ -161788,6 +162994,8 @@ static const UV UNI_XPOSIXPRINT_invlist[] = {  /* for EBCDIC 037 */
        0x1DAB0,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
        0x1E000,
        0x1E007,
        0x1E008,
@@ -161798,6 +163006,10 @@ static const UV UNI_XPOSIXPRINT_invlist[] = {  /* for EBCDIC 037 */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E030,
+       0x1E06E,
+       0x1E08F,
+       0x1E090,
        0x1E100,
        0x1E12D,
        0x1E130,
@@ -161812,6 +163024,8 @@ static const UV UNI_XPOSIXPRINT_invlist[] = {  /* for EBCDIC 037 */
        0x1E2FA,
        0x1E2FF,
        0x1E300,
+       0x1E4D0,
+       0x1E4FA,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -161928,14 +163142,14 @@ static const UV UNI_XPOSIXPRINT_invlist[] = {  /* for EBCDIC 037 */
        0x1F266,
        0x1F300,
        0x1F6D8,
-       0x1F6DD,
+       0x1F6DC,
        0x1F6ED,
        0x1F6F0,
        0x1F6FD,
        0x1F700,
-       0x1F774,
-       0x1F780,
-       0x1F7D9,
+       0x1F777,
+       0x1F77B,
+       0x1F7DA,
        0x1F7E0,
        0x1F7EC,
        0x1F7F0,
@@ -161957,23 +163171,19 @@ static const UV UNI_XPOSIXPRINT_invlist[] = {  /* for EBCDIC 037 */
        0x1FA60,
        0x1FA6E,
        0x1FA70,
-       0x1FA75,
-       0x1FA78,
        0x1FA7D,
        0x1FA80,
-       0x1FA87,
+       0x1FA89,
        0x1FA90,
-       0x1FAAD,
-       0x1FAB0,
-       0x1FABB,
-       0x1FAC0,
+       0x1FABE,
+       0x1FABF,
        0x1FAC6,
-       0x1FAD0,
-       0x1FADA,
+       0x1FACE,
+       0x1FADC,
        0x1FAE0,
-       0x1FAE8,
+       0x1FAE9,
        0x1FAF0,
-       0x1FAF7,
+       0x1FAF9,
        0x1FB00,
        0x1FB93,
        0x1FB94,
@@ -161983,7 +163193,7 @@ static const UV UNI_XPOSIXPRINT_invlist[] = {  /* for EBCDIC 037 */
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -161994,6 +163204,8 @@ static const UV UNI_XPOSIXPRINT_invlist[] = {  /* for EBCDIC 037 */
        0x2FA1E,
        0x30000,
        0x3134B,
+       0x31350,
+       0x323B0,
        0xE0001,
        0xE0002,
        0xE0020,
@@ -162011,7 +163223,7 @@ static const UV UNI_XPOSIXPRINT_invlist[] = {  /* for EBCDIC 037 */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_XPOSIXPUNCT_invlist[] = {  /* for ASCII/Latin1 */
-       369,    /* Number of elements */
+       373,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -162354,12 +163566,16 @@ static const UV UNI_XPOSIXPUNCT_invlist[] = {  /* for ASCII/Latin1 */
        0x11A9D,
        0x11A9E,
        0x11AA3,
+       0x11B00,
+       0x11B0A,
        0x11C41,
        0x11C46,
        0x11C70,
        0x11C72,
        0x11EF7,
        0x11EF9,
+       0x11F43,
+       0x11F50,
        0x11FFF,
        0x12000,
        0x12470,
@@ -162394,7 +163610,7 @@ static const UV UNI_XPOSIXPUNCT_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_XPOSIXPUNCT_invlist[] = {  /* for EBCDIC 1047 */
-       377,    /* Number of elements */
+       381,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -162745,12 +163961,16 @@ static const UV UNI_XPOSIXPUNCT_invlist[] = {  /* for EBCDIC 1047 */
        0x11A9D,
        0x11A9E,
        0x11AA3,
+       0x11B00,
+       0x11B0A,
        0x11C41,
        0x11C46,
        0x11C70,
        0x11C72,
        0x11EF7,
        0x11EF9,
+       0x11F43,
+       0x11F50,
        0x11FFF,
        0x12000,
        0x12470,
@@ -162785,7 +164005,7 @@ static const UV UNI_XPOSIXPUNCT_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_XPOSIXPUNCT_invlist[] = {  /* for EBCDIC 037 */
-       379,    /* Number of elements */
+       383,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -163138,12 +164358,16 @@ static const UV UNI_XPOSIXPUNCT_invlist[] = {  /* for EBCDIC 037 */
        0x11A9D,
        0x11A9E,
        0x11AA3,
+       0x11B00,
+       0x11B0A,
        0x11C41,
        0x11C46,
        0x11C70,
        0x11C72,
        0x11EF7,
        0x11EF9,
+       0x11F43,
+       0x11F50,
        0x11FFF,
        0x12000,
        0x12470,
@@ -167261,7 +168485,7 @@ static const UV UNI_XPOSIXUPPER_invlist[] = {  /* for EBCDIC 037 */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_XPOSIXWORD_invlist[] = {  /* for ASCII/Latin1 */
-       1519,   /* Number of elements */
+       1543,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -167581,7 +168805,7 @@ static const UV UNI_XPOSIXWORD_invlist[] = {  /* for ASCII/Latin1 */
        0xCE6,
        0xCF0,
        0xCF1,
-       0xCF3,
+       0xCF4,
        0xD00,
        0xD0D,
        0xD0E,
@@ -167647,7 +168871,7 @@ static const UV UNI_XPOSIXWORD_invlist[] = {  /* for ASCII/Latin1 */
        0xEC6,
        0xEC7,
        0xEC8,
-       0xECE,
+       0xECF,
        0xED0,
        0xEDA,
        0xEDC,
@@ -168274,7 +169498,7 @@ static const UV UNI_XPOSIXWORD_invlist[] = {  /* for ASCII/Latin1 */
        0x10EAD,
        0x10EB0,
        0x10EB2,
-       0x10F00,
+       0x10EFD,
        0x10F1D,
        0x10F27,
        0x10F28,
@@ -168321,7 +169545,7 @@ static const UV UNI_XPOSIXWORD_invlist[] = {  /* for ASCII/Latin1 */
        0x11213,
        0x11238,
        0x1123E,
-       0x1123F,
+       0x11242,
        0x11280,
        0x11287,
        0x11288,
@@ -168482,6 +169706,14 @@ static const UV UNI_XPOSIXWORD_invlist[] = {  /* for ASCII/Latin1 */
        0x11DAA,
        0x11EE0,
        0x11EF7,
+       0x11F00,
+       0x11F11,
+       0x11F12,
+       0x11F3B,
+       0x11F3E,
+       0x11F43,
+       0x11F50,
+       0x11F5A,
        0x11FB0,
        0x11FB1,
        0x12000,
@@ -168493,7 +169725,9 @@ static const UV UNI_XPOSIXWORD_invlist[] = {  /* for ASCII/Latin1 */
        0x12F90,
        0x12FF1,
        0x13000,
-       0x1342F,
+       0x13430,
+       0x13440,
+       0x13456,
        0x14400,
        0x14647,
        0x16800,
@@ -168548,8 +169782,12 @@ static const UV UNI_XPOSIXWORD_invlist[] = {  /* for ASCII/Latin1 */
        0x1AFFF,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -168656,6 +169894,8 @@ static const UV UNI_XPOSIXWORD_invlist[] = {  /* for ASCII/Latin1 */
        0x1DAB0,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
        0x1E000,
        0x1E007,
        0x1E008,
@@ -168666,6 +169906,10 @@ static const UV UNI_XPOSIXWORD_invlist[] = {  /* for ASCII/Latin1 */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E030,
+       0x1E06E,
+       0x1E08F,
+       0x1E090,
        0x1E100,
        0x1E12D,
        0x1E130,
@@ -168678,6 +169922,8 @@ static const UV UNI_XPOSIXWORD_invlist[] = {  /* for ASCII/Latin1 */
        0x1E2AF,
        0x1E2C0,
        0x1E2FA,
+       0x1E4D0,
+       0x1E4FA,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -168771,7 +170017,7 @@ static const UV UNI_XPOSIXWORD_invlist[] = {  /* for ASCII/Latin1 */
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -168782,6 +170028,8 @@ static const UV UNI_XPOSIXWORD_invlist[] = {  /* for ASCII/Latin1 */
        0x2FA1E,
        0x30000,
        0x3134B,
+       0x31350,
+       0x323B0,
        0xE0100,
        0xE01F0
 };
@@ -168794,7 +170042,7 @@ static const UV UNI_XPOSIXWORD_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_XPOSIXWORD_invlist[] = {  /* for EBCDIC 1047 */
-       1543,   /* Number of elements */
+       1567,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -169138,7 +170386,7 @@ static const UV UNI_XPOSIXWORD_invlist[] = {  /* for EBCDIC 1047 */
        0xCE6,
        0xCF0,
        0xCF1,
-       0xCF3,
+       0xCF4,
        0xD00,
        0xD0D,
        0xD0E,
@@ -169204,7 +170452,7 @@ static const UV UNI_XPOSIXWORD_invlist[] = {  /* for EBCDIC 1047 */
        0xEC6,
        0xEC7,
        0xEC8,
-       0xECE,
+       0xECF,
        0xED0,
        0xEDA,
        0xEDC,
@@ -169831,7 +171079,7 @@ static const UV UNI_XPOSIXWORD_invlist[] = {  /* for EBCDIC 1047 */
        0x10EAD,
        0x10EB0,
        0x10EB2,
-       0x10F00,
+       0x10EFD,
        0x10F1D,
        0x10F27,
        0x10F28,
@@ -169878,7 +171126,7 @@ static const UV UNI_XPOSIXWORD_invlist[] = {  /* for EBCDIC 1047 */
        0x11213,
        0x11238,
        0x1123E,
-       0x1123F,
+       0x11242,
        0x11280,
        0x11287,
        0x11288,
@@ -170039,6 +171287,14 @@ static const UV UNI_XPOSIXWORD_invlist[] = {  /* for EBCDIC 1047 */
        0x11DAA,
        0x11EE0,
        0x11EF7,
+       0x11F00,
+       0x11F11,
+       0x11F12,
+       0x11F3B,
+       0x11F3E,
+       0x11F43,
+       0x11F50,
+       0x11F5A,
        0x11FB0,
        0x11FB1,
        0x12000,
@@ -170050,7 +171306,9 @@ static const UV UNI_XPOSIXWORD_invlist[] = {  /* for EBCDIC 1047 */
        0x12F90,
        0x12FF1,
        0x13000,
-       0x1342F,
+       0x13430,
+       0x13440,
+       0x13456,
        0x14400,
        0x14647,
        0x16800,
@@ -170105,8 +171363,12 @@ static const UV UNI_XPOSIXWORD_invlist[] = {  /* for EBCDIC 1047 */
        0x1AFFF,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -170213,6 +171475,8 @@ static const UV UNI_XPOSIXWORD_invlist[] = {  /* for EBCDIC 1047 */
        0x1DAB0,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
        0x1E000,
        0x1E007,
        0x1E008,
@@ -170223,6 +171487,10 @@ static const UV UNI_XPOSIXWORD_invlist[] = {  /* for EBCDIC 1047 */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E030,
+       0x1E06E,
+       0x1E08F,
+       0x1E090,
        0x1E100,
        0x1E12D,
        0x1E130,
@@ -170235,6 +171503,8 @@ static const UV UNI_XPOSIXWORD_invlist[] = {  /* for EBCDIC 1047 */
        0x1E2AF,
        0x1E2C0,
        0x1E2FA,
+       0x1E4D0,
+       0x1E4FA,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -170328,7 +171598,7 @@ static const UV UNI_XPOSIXWORD_invlist[] = {  /* for EBCDIC 1047 */
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -170339,6 +171609,8 @@ static const UV UNI_XPOSIXWORD_invlist[] = {  /* for EBCDIC 1047 */
        0x2FA1E,
        0x30000,
        0x3134B,
+       0x31350,
+       0x323B0,
        0xE0100,
        0xE01F0
 };
@@ -170351,7 +171623,7 @@ static const UV UNI_XPOSIXWORD_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_XPOSIXWORD_invlist[] = {  /* for EBCDIC 037 */
-       1539,   /* Number of elements */
+       1563,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -170691,7 +171963,7 @@ static const UV UNI_XPOSIXWORD_invlist[] = {  /* for EBCDIC 037 */
        0xCE6,
        0xCF0,
        0xCF1,
-       0xCF3,
+       0xCF4,
        0xD00,
        0xD0D,
        0xD0E,
@@ -170757,7 +172029,7 @@ static const UV UNI_XPOSIXWORD_invlist[] = {  /* for EBCDIC 037 */
        0xEC6,
        0xEC7,
        0xEC8,
-       0xECE,
+       0xECF,
        0xED0,
        0xEDA,
        0xEDC,
@@ -171384,7 +172656,7 @@ static const UV UNI_XPOSIXWORD_invlist[] = {  /* for EBCDIC 037 */
        0x10EAD,
        0x10EB0,
        0x10EB2,
-       0x10F00,
+       0x10EFD,
        0x10F1D,
        0x10F27,
        0x10F28,
@@ -171431,7 +172703,7 @@ static const UV UNI_XPOSIXWORD_invlist[] = {  /* for EBCDIC 037 */
        0x11213,
        0x11238,
        0x1123E,
-       0x1123F,
+       0x11242,
        0x11280,
        0x11287,
        0x11288,
@@ -171592,6 +172864,14 @@ static const UV UNI_XPOSIXWORD_invlist[] = {  /* for EBCDIC 037 */
        0x11DAA,
        0x11EE0,
        0x11EF7,
+       0x11F00,
+       0x11F11,
+       0x11F12,
+       0x11F3B,
+       0x11F3E,
+       0x11F43,
+       0x11F50,
+       0x11F5A,
        0x11FB0,
        0x11FB1,
        0x12000,
@@ -171603,7 +172883,9 @@ static const UV UNI_XPOSIXWORD_invlist[] = {  /* for EBCDIC 037 */
        0x12F90,
        0x12FF1,
        0x13000,
-       0x1342F,
+       0x13430,
+       0x13440,
+       0x13456,
        0x14400,
        0x14647,
        0x16800,
@@ -171658,8 +172940,12 @@ static const UV UNI_XPOSIXWORD_invlist[] = {  /* for EBCDIC 037 */
        0x1AFFF,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -171766,6 +173052,8 @@ static const UV UNI_XPOSIXWORD_invlist[] = {  /* for EBCDIC 037 */
        0x1DAB0,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
        0x1E000,
        0x1E007,
        0x1E008,
@@ -171776,6 +173064,10 @@ static const UV UNI_XPOSIXWORD_invlist[] = {  /* for EBCDIC 037 */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E030,
+       0x1E06E,
+       0x1E08F,
+       0x1E090,
        0x1E100,
        0x1E12D,
        0x1E130,
@@ -171788,6 +173080,8 @@ static const UV UNI_XPOSIXWORD_invlist[] = {  /* for EBCDIC 037 */
        0x1E2AF,
        0x1E2C0,
        0x1E2FA,
+       0x1E4D0,
+       0x1E4FA,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -171881,7 +173175,7 @@ static const UV UNI_XPOSIXWORD_invlist[] = {  /* for EBCDIC 037 */
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -171892,6 +173186,8 @@ static const UV UNI_XPOSIXWORD_invlist[] = {  /* for EBCDIC 037 */
        0x2FA1E,
        0x30000,
        0x3134B,
+       0x31350,
+       0x323B0,
        0xE0100,
        0xE01F0
 };
@@ -172927,7 +174223,7 @@ static const UV UNI__PERL_ANY_FOLDS_invlist[] = {  /* for EBCDIC 037 */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI__PERL_CHARNAME_BEGIN_invlist[] = {  /* for ASCII/Latin1 */
-       1309,   /* Number of elements */
+       1331,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -173882,6 +175178,8 @@ static const UV UNI__PERL_CHARNAME_BEGIN_invlist[] = {  /* for ASCII/Latin1 */
        0x11212,
        0x11213,
        0x1122C,
+       0x1123F,
+       0x11241,
        0x11280,
        0x11287,
        0x11288,
@@ -174006,6 +175304,12 @@ static const UV UNI__PERL_CHARNAME_BEGIN_invlist[] = {  /* for ASCII/Latin1 */
        0x11D99,
        0x11EE0,
        0x11EF3,
+       0x11F02,
+       0x11F03,
+       0x11F04,
+       0x11F11,
+       0x11F12,
+       0x11F34,
        0x11FB0,
        0x11FB1,
        0x12000,
@@ -174015,7 +175319,9 @@ static const UV UNI__PERL_CHARNAME_BEGIN_invlist[] = {  /* for ASCII/Latin1 */
        0x12F90,
        0x12FF1,
        0x13000,
-       0x1342F,
+       0x13430,
+       0x13441,
+       0x13447,
        0x14400,
        0x14647,
        0x16800,
@@ -174060,8 +175366,12 @@ static const UV UNI__PERL_CHARNAME_BEGIN_invlist[] = {  /* for ASCII/Latin1 */
        0x1AFFF,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -174136,6 +175446,10 @@ static const UV UNI__PERL_CHARNAME_BEGIN_invlist[] = {  /* for ASCII/Latin1 */
        0x1D7CC,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
+       0x1E030,
+       0x1E06E,
        0x1E100,
        0x1E12D,
        0x1E137,
@@ -174146,6 +175460,8 @@ static const UV UNI__PERL_CHARNAME_BEGIN_invlist[] = {  /* for ASCII/Latin1 */
        0x1E2AE,
        0x1E2C0,
        0x1E2EC,
+       0x1E4D0,
+       0x1E4EC,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -174229,7 +175545,7 @@ static const UV UNI__PERL_CHARNAME_BEGIN_invlist[] = {  /* for ASCII/Latin1 */
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -174239,7 +175555,9 @@ static const UV UNI__PERL_CHARNAME_BEGIN_invlist[] = {  /* for ASCII/Latin1 */
        0x2F800,
        0x2FA1E,
        0x30000,
-       0x3134B
+       0x3134B,
+       0x31350,
+       0x323B0
 };
 
 #  endif       /* ASCII/Latin1 */
@@ -174250,7 +175568,7 @@ static const UV UNI__PERL_CHARNAME_BEGIN_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI__PERL_CHARNAME_BEGIN_invlist[] = {  /* for EBCDIC 1047 */
-       1335,   /* Number of elements */
+       1357,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -175231,6 +176549,8 @@ static const UV UNI__PERL_CHARNAME_BEGIN_invlist[] = {  /* for EBCDIC 1047 */
        0x11212,
        0x11213,
        0x1122C,
+       0x1123F,
+       0x11241,
        0x11280,
        0x11287,
        0x11288,
@@ -175355,6 +176675,12 @@ static const UV UNI__PERL_CHARNAME_BEGIN_invlist[] = {  /* for EBCDIC 1047 */
        0x11D99,
        0x11EE0,
        0x11EF3,
+       0x11F02,
+       0x11F03,
+       0x11F04,
+       0x11F11,
+       0x11F12,
+       0x11F34,
        0x11FB0,
        0x11FB1,
        0x12000,
@@ -175364,7 +176690,9 @@ static const UV UNI__PERL_CHARNAME_BEGIN_invlist[] = {  /* for EBCDIC 1047 */
        0x12F90,
        0x12FF1,
        0x13000,
-       0x1342F,
+       0x13430,
+       0x13441,
+       0x13447,
        0x14400,
        0x14647,
        0x16800,
@@ -175409,8 +176737,12 @@ static const UV UNI__PERL_CHARNAME_BEGIN_invlist[] = {  /* for EBCDIC 1047 */
        0x1AFFF,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -175485,6 +176817,10 @@ static const UV UNI__PERL_CHARNAME_BEGIN_invlist[] = {  /* for EBCDIC 1047 */
        0x1D7CC,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
+       0x1E030,
+       0x1E06E,
        0x1E100,
        0x1E12D,
        0x1E137,
@@ -175495,6 +176831,8 @@ static const UV UNI__PERL_CHARNAME_BEGIN_invlist[] = {  /* for EBCDIC 1047 */
        0x1E2AE,
        0x1E2C0,
        0x1E2EC,
+       0x1E4D0,
+       0x1E4EC,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -175578,7 +176916,7 @@ static const UV UNI__PERL_CHARNAME_BEGIN_invlist[] = {  /* for EBCDIC 1047 */
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -175588,7 +176926,9 @@ static const UV UNI__PERL_CHARNAME_BEGIN_invlist[] = {  /* for EBCDIC 1047 */
        0x2F800,
        0x2FA1E,
        0x30000,
-       0x3134B
+       0x3134B,
+       0x31350,
+       0x323B0
 };
 
 #  endif       /* EBCDIC 1047 */
@@ -175599,7 +176939,7 @@ static const UV UNI__PERL_CHARNAME_BEGIN_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI__PERL_CHARNAME_BEGIN_invlist[] = {  /* for EBCDIC 037 */
-       1331,   /* Number of elements */
+       1353,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -176576,6 +177916,8 @@ static const UV UNI__PERL_CHARNAME_BEGIN_invlist[] = {  /* for EBCDIC 037 */
        0x11212,
        0x11213,
        0x1122C,
+       0x1123F,
+       0x11241,
        0x11280,
        0x11287,
        0x11288,
@@ -176700,6 +178042,12 @@ static const UV UNI__PERL_CHARNAME_BEGIN_invlist[] = {  /* for EBCDIC 037 */
        0x11D99,
        0x11EE0,
        0x11EF3,
+       0x11F02,
+       0x11F03,
+       0x11F04,
+       0x11F11,
+       0x11F12,
+       0x11F34,
        0x11FB0,
        0x11FB1,
        0x12000,
@@ -176709,7 +178057,9 @@ static const UV UNI__PERL_CHARNAME_BEGIN_invlist[] = {  /* for EBCDIC 037 */
        0x12F90,
        0x12FF1,
        0x13000,
-       0x1342F,
+       0x13430,
+       0x13441,
+       0x13447,
        0x14400,
        0x14647,
        0x16800,
@@ -176754,8 +178104,12 @@ static const UV UNI__PERL_CHARNAME_BEGIN_invlist[] = {  /* for EBCDIC 037 */
        0x1AFFF,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -176830,6 +178184,10 @@ static const UV UNI__PERL_CHARNAME_BEGIN_invlist[] = {  /* for EBCDIC 037 */
        0x1D7CC,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
+       0x1E030,
+       0x1E06E,
        0x1E100,
        0x1E12D,
        0x1E137,
@@ -176840,6 +178198,8 @@ static const UV UNI__PERL_CHARNAME_BEGIN_invlist[] = {  /* for EBCDIC 037 */
        0x1E2AE,
        0x1E2C0,
        0x1E2EC,
+       0x1E4D0,
+       0x1E4EC,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -176923,7 +178283,7 @@ static const UV UNI__PERL_CHARNAME_BEGIN_invlist[] = {  /* for EBCDIC 037 */
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -176933,7 +178293,9 @@ static const UV UNI__PERL_CHARNAME_BEGIN_invlist[] = {  /* for EBCDIC 037 */
        0x2F800,
        0x2FA1E,
        0x30000,
-       0x3134B
+       0x3134B,
+       0x31350,
+       0x323B0
 };
 
 #  endif       /* EBCDIC 037 */
@@ -176941,7 +178303,7 @@ static const UV UNI__PERL_CHARNAME_BEGIN_invlist[] = {  /* for EBCDIC 037 */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI__PERL_CHARNAME_CONTINUE_invlist[] = {  /* for ASCII/Latin1 */
-       1533,   /* Number of elements */
+       1557,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -177269,7 +178631,7 @@ static const UV UNI__PERL_CHARNAME_CONTINUE_invlist[] = {  /* for ASCII/Latin1 *
        0xCE6,
        0xCF0,
        0xCF1,
-       0xCF3,
+       0xCF4,
        0xD00,
        0xD0D,
        0xD0E,
@@ -177335,7 +178697,7 @@ static const UV UNI__PERL_CHARNAME_CONTINUE_invlist[] = {  /* for ASCII/Latin1 *
        0xEC6,
        0xEC7,
        0xEC8,
-       0xECE,
+       0xECF,
        0xED0,
        0xEDA,
        0xEDC,
@@ -177974,7 +179336,7 @@ static const UV UNI__PERL_CHARNAME_CONTINUE_invlist[] = {  /* for ASCII/Latin1 *
        0x10EAD,
        0x10EB0,
        0x10EB2,
-       0x10F00,
+       0x10EFD,
        0x10F1D,
        0x10F27,
        0x10F28,
@@ -178021,7 +179383,7 @@ static const UV UNI__PERL_CHARNAME_CONTINUE_invlist[] = {  /* for ASCII/Latin1 *
        0x11213,
        0x11238,
        0x1123E,
-       0x1123F,
+       0x11242,
        0x11280,
        0x11287,
        0x11288,
@@ -178182,6 +179544,14 @@ static const UV UNI__PERL_CHARNAME_CONTINUE_invlist[] = {  /* for ASCII/Latin1 *
        0x11DAA,
        0x11EE0,
        0x11EF7,
+       0x11F00,
+       0x11F11,
+       0x11F12,
+       0x11F3B,
+       0x11F3E,
+       0x11F43,
+       0x11F50,
+       0x11F5A,
        0x11FB0,
        0x11FB1,
        0x12000,
@@ -178193,7 +179563,9 @@ static const UV UNI__PERL_CHARNAME_CONTINUE_invlist[] = {  /* for ASCII/Latin1 *
        0x12F90,
        0x12FF1,
        0x13000,
-       0x1342F,
+       0x13430,
+       0x13440,
+       0x13456,
        0x14400,
        0x14647,
        0x16800,
@@ -178248,8 +179620,12 @@ static const UV UNI__PERL_CHARNAME_CONTINUE_invlist[] = {  /* for ASCII/Latin1 *
        0x1AFFF,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -178356,6 +179732,8 @@ static const UV UNI__PERL_CHARNAME_CONTINUE_invlist[] = {  /* for ASCII/Latin1 *
        0x1DAB0,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
        0x1E000,
        0x1E007,
        0x1E008,
@@ -178366,6 +179744,10 @@ static const UV UNI__PERL_CHARNAME_CONTINUE_invlist[] = {  /* for ASCII/Latin1 *
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E030,
+       0x1E06E,
+       0x1E08F,
+       0x1E090,
        0x1E100,
        0x1E12D,
        0x1E130,
@@ -178378,6 +179760,8 @@ static const UV UNI__PERL_CHARNAME_CONTINUE_invlist[] = {  /* for ASCII/Latin1 *
        0x1E2AF,
        0x1E2C0,
        0x1E2FA,
+       0x1E4D0,
+       0x1E4FA,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -178465,7 +179849,7 @@ static const UV UNI__PERL_CHARNAME_CONTINUE_invlist[] = {  /* for ASCII/Latin1 *
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -178476,6 +179860,8 @@ static const UV UNI__PERL_CHARNAME_CONTINUE_invlist[] = {  /* for ASCII/Latin1 *
        0x2FA1E,
        0x30000,
        0x3134B,
+       0x31350,
+       0x323B0,
        0xE0100,
        0xE01F0
 };
@@ -178488,7 +179874,7 @@ static const UV UNI__PERL_CHARNAME_CONTINUE_invlist[] = {  /* for ASCII/Latin1 *
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI__PERL_CHARNAME_CONTINUE_invlist[] = {  /* for EBCDIC 1047 */
-       1559,   /* Number of elements */
+       1583,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -178842,7 +180228,7 @@ static const UV UNI__PERL_CHARNAME_CONTINUE_invlist[] = {  /* for EBCDIC 1047 */
        0xCE6,
        0xCF0,
        0xCF1,
-       0xCF3,
+       0xCF4,
        0xD00,
        0xD0D,
        0xD0E,
@@ -178908,7 +180294,7 @@ static const UV UNI__PERL_CHARNAME_CONTINUE_invlist[] = {  /* for EBCDIC 1047 */
        0xEC6,
        0xEC7,
        0xEC8,
-       0xECE,
+       0xECF,
        0xED0,
        0xEDA,
        0xEDC,
@@ -179547,7 +180933,7 @@ static const UV UNI__PERL_CHARNAME_CONTINUE_invlist[] = {  /* for EBCDIC 1047 */
        0x10EAD,
        0x10EB0,
        0x10EB2,
-       0x10F00,
+       0x10EFD,
        0x10F1D,
        0x10F27,
        0x10F28,
@@ -179594,7 +180980,7 @@ static const UV UNI__PERL_CHARNAME_CONTINUE_invlist[] = {  /* for EBCDIC 1047 */
        0x11213,
        0x11238,
        0x1123E,
-       0x1123F,
+       0x11242,
        0x11280,
        0x11287,
        0x11288,
@@ -179755,6 +181141,14 @@ static const UV UNI__PERL_CHARNAME_CONTINUE_invlist[] = {  /* for EBCDIC 1047 */
        0x11DAA,
        0x11EE0,
        0x11EF7,
+       0x11F00,
+       0x11F11,
+       0x11F12,
+       0x11F3B,
+       0x11F3E,
+       0x11F43,
+       0x11F50,
+       0x11F5A,
        0x11FB0,
        0x11FB1,
        0x12000,
@@ -179766,7 +181160,9 @@ static const UV UNI__PERL_CHARNAME_CONTINUE_invlist[] = {  /* for EBCDIC 1047 */
        0x12F90,
        0x12FF1,
        0x13000,
-       0x1342F,
+       0x13430,
+       0x13440,
+       0x13456,
        0x14400,
        0x14647,
        0x16800,
@@ -179821,8 +181217,12 @@ static const UV UNI__PERL_CHARNAME_CONTINUE_invlist[] = {  /* for EBCDIC 1047 */
        0x1AFFF,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -179929,6 +181329,8 @@ static const UV UNI__PERL_CHARNAME_CONTINUE_invlist[] = {  /* for EBCDIC 1047 */
        0x1DAB0,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
        0x1E000,
        0x1E007,
        0x1E008,
@@ -179939,6 +181341,10 @@ static const UV UNI__PERL_CHARNAME_CONTINUE_invlist[] = {  /* for EBCDIC 1047 */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E030,
+       0x1E06E,
+       0x1E08F,
+       0x1E090,
        0x1E100,
        0x1E12D,
        0x1E130,
@@ -179951,6 +181357,8 @@ static const UV UNI__PERL_CHARNAME_CONTINUE_invlist[] = {  /* for EBCDIC 1047 */
        0x1E2AF,
        0x1E2C0,
        0x1E2FA,
+       0x1E4D0,
+       0x1E4FA,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -180038,7 +181446,7 @@ static const UV UNI__PERL_CHARNAME_CONTINUE_invlist[] = {  /* for EBCDIC 1047 */
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -180049,6 +181457,8 @@ static const UV UNI__PERL_CHARNAME_CONTINUE_invlist[] = {  /* for EBCDIC 1047 */
        0x2FA1E,
        0x30000,
        0x3134B,
+       0x31350,
+       0x323B0,
        0xE0100,
        0xE01F0
 };
@@ -180061,7 +181471,7 @@ static const UV UNI__PERL_CHARNAME_CONTINUE_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI__PERL_CHARNAME_CONTINUE_invlist[] = {  /* for EBCDIC 037 */
-       1555,   /* Number of elements */
+       1579,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -180411,7 +181821,7 @@ static const UV UNI__PERL_CHARNAME_CONTINUE_invlist[] = {  /* for EBCDIC 037 */
        0xCE6,
        0xCF0,
        0xCF1,
-       0xCF3,
+       0xCF4,
        0xD00,
        0xD0D,
        0xD0E,
@@ -180477,7 +181887,7 @@ static const UV UNI__PERL_CHARNAME_CONTINUE_invlist[] = {  /* for EBCDIC 037 */
        0xEC6,
        0xEC7,
        0xEC8,
-       0xECE,
+       0xECF,
        0xED0,
        0xEDA,
        0xEDC,
@@ -181116,7 +182526,7 @@ static const UV UNI__PERL_CHARNAME_CONTINUE_invlist[] = {  /* for EBCDIC 037 */
        0x10EAD,
        0x10EB0,
        0x10EB2,
-       0x10F00,
+       0x10EFD,
        0x10F1D,
        0x10F27,
        0x10F28,
@@ -181163,7 +182573,7 @@ static const UV UNI__PERL_CHARNAME_CONTINUE_invlist[] = {  /* for EBCDIC 037 */
        0x11213,
        0x11238,
        0x1123E,
-       0x1123F,
+       0x11242,
        0x11280,
        0x11287,
        0x11288,
@@ -181324,6 +182734,14 @@ static const UV UNI__PERL_CHARNAME_CONTINUE_invlist[] = {  /* for EBCDIC 037 */
        0x11DAA,
        0x11EE0,
        0x11EF7,
+       0x11F00,
+       0x11F11,
+       0x11F12,
+       0x11F3B,
+       0x11F3E,
+       0x11F43,
+       0x11F50,
+       0x11F5A,
        0x11FB0,
        0x11FB1,
        0x12000,
@@ -181335,7 +182753,9 @@ static const UV UNI__PERL_CHARNAME_CONTINUE_invlist[] = {  /* for EBCDIC 037 */
        0x12F90,
        0x12FF1,
        0x13000,
-       0x1342F,
+       0x13430,
+       0x13440,
+       0x13456,
        0x14400,
        0x14647,
        0x16800,
@@ -181390,8 +182810,12 @@ static const UV UNI__PERL_CHARNAME_CONTINUE_invlist[] = {  /* for EBCDIC 037 */
        0x1AFFF,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -181498,6 +182922,8 @@ static const UV UNI__PERL_CHARNAME_CONTINUE_invlist[] = {  /* for EBCDIC 037 */
        0x1DAB0,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
        0x1E000,
        0x1E007,
        0x1E008,
@@ -181508,6 +182934,10 @@ static const UV UNI__PERL_CHARNAME_CONTINUE_invlist[] = {  /* for EBCDIC 037 */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E030,
+       0x1E06E,
+       0x1E08F,
+       0x1E090,
        0x1E100,
        0x1E12D,
        0x1E130,
@@ -181520,6 +182950,8 @@ static const UV UNI__PERL_CHARNAME_CONTINUE_invlist[] = {  /* for EBCDIC 037 */
        0x1E2AF,
        0x1E2C0,
        0x1E2FA,
+       0x1E4D0,
+       0x1E4FA,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -181607,7 +183039,7 @@ static const UV UNI__PERL_CHARNAME_CONTINUE_invlist[] = {  /* for EBCDIC 037 */
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -181618,6 +183050,8 @@ static const UV UNI__PERL_CHARNAME_CONTINUE_invlist[] = {  /* for EBCDIC 037 */
        0x2FA1E,
        0x30000,
        0x3134B,
+       0x31350,
+       0x323B0,
        0xE0100,
        0xE01F0
 };
@@ -181843,7 +183277,7 @@ static const UV UNI__PERL_FOLDS_TO_MULTI_CHAR_invlist[] = {  /* for EBCDIC 037 *
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI__PERL_IDCONT_invlist[] = {  /* for ASCII/Latin1 */
-       1527,   /* Number of elements */
+       1551,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -182165,7 +183599,7 @@ static const UV UNI__PERL_IDCONT_invlist[] = {  /* for ASCII/Latin1 */
        0xCE6,
        0xCF0,
        0xCF1,
-       0xCF3,
+       0xCF4,
        0xD00,
        0xD0D,
        0xD0E,
@@ -182231,7 +183665,7 @@ static const UV UNI__PERL_IDCONT_invlist[] = {  /* for ASCII/Latin1 */
        0xEC6,
        0xEC7,
        0xEC8,
-       0xECE,
+       0xECF,
        0xED0,
        0xEDA,
        0xEDC,
@@ -182870,7 +184304,7 @@ static const UV UNI__PERL_IDCONT_invlist[] = {  /* for ASCII/Latin1 */
        0x10EAD,
        0x10EB0,
        0x10EB2,
-       0x10F00,
+       0x10EFD,
        0x10F1D,
        0x10F27,
        0x10F28,
@@ -182917,7 +184351,7 @@ static const UV UNI__PERL_IDCONT_invlist[] = {  /* for ASCII/Latin1 */
        0x11213,
        0x11238,
        0x1123E,
-       0x1123F,
+       0x11242,
        0x11280,
        0x11287,
        0x11288,
@@ -183078,6 +184512,14 @@ static const UV UNI__PERL_IDCONT_invlist[] = {  /* for ASCII/Latin1 */
        0x11DAA,
        0x11EE0,
        0x11EF7,
+       0x11F00,
+       0x11F11,
+       0x11F12,
+       0x11F3B,
+       0x11F3E,
+       0x11F43,
+       0x11F50,
+       0x11F5A,
        0x11FB0,
        0x11FB1,
        0x12000,
@@ -183089,7 +184531,9 @@ static const UV UNI__PERL_IDCONT_invlist[] = {  /* for ASCII/Latin1 */
        0x12F90,
        0x12FF1,
        0x13000,
-       0x1342F,
+       0x13430,
+       0x13440,
+       0x13456,
        0x14400,
        0x14647,
        0x16800,
@@ -183144,8 +184588,12 @@ static const UV UNI__PERL_IDCONT_invlist[] = {  /* for ASCII/Latin1 */
        0x1AFFF,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -183252,6 +184700,8 @@ static const UV UNI__PERL_IDCONT_invlist[] = {  /* for ASCII/Latin1 */
        0x1DAB0,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
        0x1E000,
        0x1E007,
        0x1E008,
@@ -183262,6 +184712,10 @@ static const UV UNI__PERL_IDCONT_invlist[] = {  /* for ASCII/Latin1 */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E030,
+       0x1E06E,
+       0x1E08F,
+       0x1E090,
        0x1E100,
        0x1E12D,
        0x1E130,
@@ -183274,6 +184728,8 @@ static const UV UNI__PERL_IDCONT_invlist[] = {  /* for ASCII/Latin1 */
        0x1E2AF,
        0x1E2C0,
        0x1E2FA,
+       0x1E4D0,
+       0x1E4FA,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -183361,7 +184817,7 @@ static const UV UNI__PERL_IDCONT_invlist[] = {  /* for ASCII/Latin1 */
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -183372,6 +184828,8 @@ static const UV UNI__PERL_IDCONT_invlist[] = {  /* for ASCII/Latin1 */
        0x2FA1E,
        0x30000,
        0x3134B,
+       0x31350,
+       0x323B0,
        0xE0100,
        0xE01F0
 };
@@ -183384,7 +184842,7 @@ static const UV UNI__PERL_IDCONT_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI__PERL_IDCONT_invlist[] = {  /* for EBCDIC 1047 */
-       1551,   /* Number of elements */
+       1575,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -183730,7 +185188,7 @@ static const UV UNI__PERL_IDCONT_invlist[] = {  /* for EBCDIC 1047 */
        0xCE6,
        0xCF0,
        0xCF1,
-       0xCF3,
+       0xCF4,
        0xD00,
        0xD0D,
        0xD0E,
@@ -183796,7 +185254,7 @@ static const UV UNI__PERL_IDCONT_invlist[] = {  /* for EBCDIC 1047 */
        0xEC6,
        0xEC7,
        0xEC8,
-       0xECE,
+       0xECF,
        0xED0,
        0xEDA,
        0xEDC,
@@ -184435,7 +185893,7 @@ static const UV UNI__PERL_IDCONT_invlist[] = {  /* for EBCDIC 1047 */
        0x10EAD,
        0x10EB0,
        0x10EB2,
-       0x10F00,
+       0x10EFD,
        0x10F1D,
        0x10F27,
        0x10F28,
@@ -184482,7 +185940,7 @@ static const UV UNI__PERL_IDCONT_invlist[] = {  /* for EBCDIC 1047 */
        0x11213,
        0x11238,
        0x1123E,
-       0x1123F,
+       0x11242,
        0x11280,
        0x11287,
        0x11288,
@@ -184643,6 +186101,14 @@ static const UV UNI__PERL_IDCONT_invlist[] = {  /* for EBCDIC 1047 */
        0x11DAA,
        0x11EE0,
        0x11EF7,
+       0x11F00,
+       0x11F11,
+       0x11F12,
+       0x11F3B,
+       0x11F3E,
+       0x11F43,
+       0x11F50,
+       0x11F5A,
        0x11FB0,
        0x11FB1,
        0x12000,
@@ -184654,7 +186120,9 @@ static const UV UNI__PERL_IDCONT_invlist[] = {  /* for EBCDIC 1047 */
        0x12F90,
        0x12FF1,
        0x13000,
-       0x1342F,
+       0x13430,
+       0x13440,
+       0x13456,
        0x14400,
        0x14647,
        0x16800,
@@ -184709,8 +186177,12 @@ static const UV UNI__PERL_IDCONT_invlist[] = {  /* for EBCDIC 1047 */
        0x1AFFF,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -184817,6 +186289,8 @@ static const UV UNI__PERL_IDCONT_invlist[] = {  /* for EBCDIC 1047 */
        0x1DAB0,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
        0x1E000,
        0x1E007,
        0x1E008,
@@ -184827,6 +186301,10 @@ static const UV UNI__PERL_IDCONT_invlist[] = {  /* for EBCDIC 1047 */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E030,
+       0x1E06E,
+       0x1E08F,
+       0x1E090,
        0x1E100,
        0x1E12D,
        0x1E130,
@@ -184839,6 +186317,8 @@ static const UV UNI__PERL_IDCONT_invlist[] = {  /* for EBCDIC 1047 */
        0x1E2AF,
        0x1E2C0,
        0x1E2FA,
+       0x1E4D0,
+       0x1E4FA,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -184926,7 +186406,7 @@ static const UV UNI__PERL_IDCONT_invlist[] = {  /* for EBCDIC 1047 */
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -184937,6 +186417,8 @@ static const UV UNI__PERL_IDCONT_invlist[] = {  /* for EBCDIC 1047 */
        0x2FA1E,
        0x30000,
        0x3134B,
+       0x31350,
+       0x323B0,
        0xE0100,
        0xE01F0
 };
@@ -184949,7 +186431,7 @@ static const UV UNI__PERL_IDCONT_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI__PERL_IDCONT_invlist[] = {  /* for EBCDIC 037 */
-       1547,   /* Number of elements */
+       1571,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -185291,7 +186773,7 @@ static const UV UNI__PERL_IDCONT_invlist[] = {  /* for EBCDIC 037 */
        0xCE6,
        0xCF0,
        0xCF1,
-       0xCF3,
+       0xCF4,
        0xD00,
        0xD0D,
        0xD0E,
@@ -185357,7 +186839,7 @@ static const UV UNI__PERL_IDCONT_invlist[] = {  /* for EBCDIC 037 */
        0xEC6,
        0xEC7,
        0xEC8,
-       0xECE,
+       0xECF,
        0xED0,
        0xEDA,
        0xEDC,
@@ -185996,7 +187478,7 @@ static const UV UNI__PERL_IDCONT_invlist[] = {  /* for EBCDIC 037 */
        0x10EAD,
        0x10EB0,
        0x10EB2,
-       0x10F00,
+       0x10EFD,
        0x10F1D,
        0x10F27,
        0x10F28,
@@ -186043,7 +187525,7 @@ static const UV UNI__PERL_IDCONT_invlist[] = {  /* for EBCDIC 037 */
        0x11213,
        0x11238,
        0x1123E,
-       0x1123F,
+       0x11242,
        0x11280,
        0x11287,
        0x11288,
@@ -186204,6 +187686,14 @@ static const UV UNI__PERL_IDCONT_invlist[] = {  /* for EBCDIC 037 */
        0x11DAA,
        0x11EE0,
        0x11EF7,
+       0x11F00,
+       0x11F11,
+       0x11F12,
+       0x11F3B,
+       0x11F3E,
+       0x11F43,
+       0x11F50,
+       0x11F5A,
        0x11FB0,
        0x11FB1,
        0x12000,
@@ -186215,7 +187705,9 @@ static const UV UNI__PERL_IDCONT_invlist[] = {  /* for EBCDIC 037 */
        0x12F90,
        0x12FF1,
        0x13000,
-       0x1342F,
+       0x13430,
+       0x13440,
+       0x13456,
        0x14400,
        0x14647,
        0x16800,
@@ -186270,8 +187762,12 @@ static const UV UNI__PERL_IDCONT_invlist[] = {  /* for EBCDIC 037 */
        0x1AFFF,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -186378,6 +187874,8 @@ static const UV UNI__PERL_IDCONT_invlist[] = {  /* for EBCDIC 037 */
        0x1DAB0,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
        0x1E000,
        0x1E007,
        0x1E008,
@@ -186388,6 +187886,10 @@ static const UV UNI__PERL_IDCONT_invlist[] = {  /* for EBCDIC 037 */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E030,
+       0x1E06E,
+       0x1E08F,
+       0x1E090,
        0x1E100,
        0x1E12D,
        0x1E130,
@@ -186400,6 +187902,8 @@ static const UV UNI__PERL_IDCONT_invlist[] = {  /* for EBCDIC 037 */
        0x1E2AF,
        0x1E2C0,
        0x1E2FA,
+       0x1E4D0,
+       0x1E4FA,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -186487,7 +187991,7 @@ static const UV UNI__PERL_IDCONT_invlist[] = {  /* for EBCDIC 037 */
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -186498,6 +188002,8 @@ static const UV UNI__PERL_IDCONT_invlist[] = {  /* for EBCDIC 037 */
        0x2FA1E,
        0x30000,
        0x3134B,
+       0x31350,
+       0x323B0,
        0xE0100,
        0xE01F0
 };
@@ -186507,7 +188013,7 @@ static const UV UNI__PERL_IDCONT_invlist[] = {  /* for EBCDIC 037 */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI__PERL_IDSTART_invlist[] = {  /* for ASCII/Latin1 */
-       1315,   /* Number of elements */
+       1337,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -187466,6 +188972,8 @@ static const UV UNI__PERL_IDSTART_invlist[] = {  /* for ASCII/Latin1 */
        0x11212,
        0x11213,
        0x1122C,
+       0x1123F,
+       0x11241,
        0x11280,
        0x11287,
        0x11288,
@@ -187590,6 +189098,12 @@ static const UV UNI__PERL_IDSTART_invlist[] = {  /* for ASCII/Latin1 */
        0x11D99,
        0x11EE0,
        0x11EF3,
+       0x11F02,
+       0x11F03,
+       0x11F04,
+       0x11F11,
+       0x11F12,
+       0x11F34,
        0x11FB0,
        0x11FB1,
        0x12000,
@@ -187601,7 +189115,9 @@ static const UV UNI__PERL_IDSTART_invlist[] = {  /* for ASCII/Latin1 */
        0x12F90,
        0x12FF1,
        0x13000,
-       0x1342F,
+       0x13430,
+       0x13441,
+       0x13447,
        0x14400,
        0x14647,
        0x16800,
@@ -187646,8 +189162,12 @@ static const UV UNI__PERL_IDSTART_invlist[] = {  /* for ASCII/Latin1 */
        0x1AFFF,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -187722,6 +189242,10 @@ static const UV UNI__PERL_IDSTART_invlist[] = {  /* for ASCII/Latin1 */
        0x1D7CC,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
+       0x1E030,
+       0x1E06E,
        0x1E100,
        0x1E12D,
        0x1E137,
@@ -187732,6 +189256,8 @@ static const UV UNI__PERL_IDSTART_invlist[] = {  /* for ASCII/Latin1 */
        0x1E2AE,
        0x1E2C0,
        0x1E2EC,
+       0x1E4D0,
+       0x1E4EC,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -187815,7 +189341,7 @@ static const UV UNI__PERL_IDSTART_invlist[] = {  /* for ASCII/Latin1 */
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -187825,7 +189351,9 @@ static const UV UNI__PERL_IDSTART_invlist[] = {  /* for ASCII/Latin1 */
        0x2F800,
        0x2FA1E,
        0x30000,
-       0x3134B
+       0x3134B,
+       0x31350,
+       0x323B0
 };
 
 #  endif       /* ASCII/Latin1 */
@@ -187836,7 +189364,7 @@ static const UV UNI__PERL_IDSTART_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI__PERL_IDSTART_invlist[] = {  /* for EBCDIC 1047 */
-       1341,   /* Number of elements */
+       1363,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -188821,6 +190349,8 @@ static const UV UNI__PERL_IDSTART_invlist[] = {  /* for EBCDIC 1047 */
        0x11212,
        0x11213,
        0x1122C,
+       0x1123F,
+       0x11241,
        0x11280,
        0x11287,
        0x11288,
@@ -188945,6 +190475,12 @@ static const UV UNI__PERL_IDSTART_invlist[] = {  /* for EBCDIC 1047 */
        0x11D99,
        0x11EE0,
        0x11EF3,
+       0x11F02,
+       0x11F03,
+       0x11F04,
+       0x11F11,
+       0x11F12,
+       0x11F34,
        0x11FB0,
        0x11FB1,
        0x12000,
@@ -188956,7 +190492,9 @@ static const UV UNI__PERL_IDSTART_invlist[] = {  /* for EBCDIC 1047 */
        0x12F90,
        0x12FF1,
        0x13000,
-       0x1342F,
+       0x13430,
+       0x13441,
+       0x13447,
        0x14400,
        0x14647,
        0x16800,
@@ -189001,8 +190539,12 @@ static const UV UNI__PERL_IDSTART_invlist[] = {  /* for EBCDIC 1047 */
        0x1AFFF,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -189077,6 +190619,10 @@ static const UV UNI__PERL_IDSTART_invlist[] = {  /* for EBCDIC 1047 */
        0x1D7CC,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
+       0x1E030,
+       0x1E06E,
        0x1E100,
        0x1E12D,
        0x1E137,
@@ -189087,6 +190633,8 @@ static const UV UNI__PERL_IDSTART_invlist[] = {  /* for EBCDIC 1047 */
        0x1E2AE,
        0x1E2C0,
        0x1E2EC,
+       0x1E4D0,
+       0x1E4EC,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -189170,7 +190718,7 @@ static const UV UNI__PERL_IDSTART_invlist[] = {  /* for EBCDIC 1047 */
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -189180,7 +190728,9 @@ static const UV UNI__PERL_IDSTART_invlist[] = {  /* for EBCDIC 1047 */
        0x2F800,
        0x2FA1E,
        0x30000,
-       0x3134B
+       0x3134B,
+       0x31350,
+       0x323B0
 };
 
 #  endif       /* EBCDIC 1047 */
@@ -189191,7 +190741,7 @@ static const UV UNI__PERL_IDSTART_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI__PERL_IDSTART_invlist[] = {  /* for EBCDIC 037 */
-       1337,   /* Number of elements */
+       1359,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -190172,6 +191722,8 @@ static const UV UNI__PERL_IDSTART_invlist[] = {  /* for EBCDIC 037 */
        0x11212,
        0x11213,
        0x1122C,
+       0x1123F,
+       0x11241,
        0x11280,
        0x11287,
        0x11288,
@@ -190296,6 +191848,12 @@ static const UV UNI__PERL_IDSTART_invlist[] = {  /* for EBCDIC 037 */
        0x11D99,
        0x11EE0,
        0x11EF3,
+       0x11F02,
+       0x11F03,
+       0x11F04,
+       0x11F11,
+       0x11F12,
+       0x11F34,
        0x11FB0,
        0x11FB1,
        0x12000,
@@ -190307,7 +191865,9 @@ static const UV UNI__PERL_IDSTART_invlist[] = {  /* for EBCDIC 037 */
        0x12F90,
        0x12FF1,
        0x13000,
-       0x1342F,
+       0x13430,
+       0x13441,
+       0x13447,
        0x14400,
        0x14647,
        0x16800,
@@ -190352,8 +191912,12 @@ static const UV UNI__PERL_IDSTART_invlist[] = {  /* for EBCDIC 037 */
        0x1AFFF,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -190428,6 +191992,10 @@ static const UV UNI__PERL_IDSTART_invlist[] = {  /* for EBCDIC 037 */
        0x1D7CC,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
+       0x1E030,
+       0x1E06E,
        0x1E100,
        0x1E12D,
        0x1E137,
@@ -190438,6 +192006,8 @@ static const UV UNI__PERL_IDSTART_invlist[] = {  /* for EBCDIC 037 */
        0x1E2AE,
        0x1E2C0,
        0x1E2EC,
+       0x1E4D0,
+       0x1E4EC,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -190521,7 +192091,7 @@ static const UV UNI__PERL_IDSTART_invlist[] = {  /* for EBCDIC 037 */
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -190531,7 +192101,9 @@ static const UV UNI__PERL_IDSTART_invlist[] = {  /* for EBCDIC 037 */
        0x2F800,
        0x2FA1E,
        0x30000,
-       0x3134B
+       0x3134B,
+       0x31350,
+       0x323B0
 };
 
 #  endif       /* EBCDIC 037 */
@@ -191851,6 +193423,78 @@ static const UV UNI_AGE__14_invlist[] = {  /* for all charsets */
        0x2B739
 };
 
+static const UV UNI_AGE__15_invlist[] = {  /* for all charsets */
+       65,     /* Number of elements */
+       148565664, /* Version and data structure type */
+       1,      /* 0 if the list starts at 0;
+                  1 if it starts at the element beyond 0 */
+       0x0,
+       0xCF3,
+       0xCF4,
+       0xECE,
+       0xECF,
+       0x10EFD,
+       0x10F00,
+       0x1123F,
+       0x11242,
+       0x11B00,
+       0x11B0A,
+       0x11F00,
+       0x11F11,
+       0x11F12,
+       0x11F3B,
+       0x11F3E,
+       0x11F5A,
+       0x1342F,
+       0x13430,
+       0x13439,
+       0x13456,
+       0x1B132,
+       0x1B133,
+       0x1B155,
+       0x1B156,
+       0x1D2C0,
+       0x1D2D4,
+       0x1DF25,
+       0x1DF2B,
+       0x1E030,
+       0x1E06E,
+       0x1E08F,
+       0x1E090,
+       0x1E4D0,
+       0x1E4FA,
+       0x1F6DC,
+       0x1F6DD,
+       0x1F774,
+       0x1F777,
+       0x1F77B,
+       0x1F780,
+       0x1F7D9,
+       0x1F7DA,
+       0x1FA75,
+       0x1FA78,
+       0x1FA87,
+       0x1FA89,
+       0x1FAAD,
+       0x1FAB0,
+       0x1FABB,
+       0x1FABE,
+       0x1FABF,
+       0x1FAC0,
+       0x1FACE,
+       0x1FAD0,
+       0x1FADA,
+       0x1FADC,
+       0x1FAE8,
+       0x1FAE9,
+       0x1FAF7,
+       0x1FAF9,
+       0x2B739,
+       0x2B73A,
+       0x31350,
+       0x323B0
+};
+
 static const UV UNI_AGE__2_invlist[] = {  /* for all charsets */
        59,     /* Number of elements */
        148565664, /* Version and data structure type */
@@ -194229,7 +195873,7 @@ static const UV UNI_ANY_invlist[] = {  /* for all charsets */
 };
 
 static const UV UNI_ARAB_invlist[] = {  /* for all charsets */
-       103,    /* Number of elements */
+       105,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -194268,6 +195912,8 @@ static const UV UNI_ARAB_invlist[] = {  /* for all charsets */
        0x102FC,
        0x10E60,
        0x10E7F,
+       0x10EFD,
+       0x10F00,
        0x1EE00,
        0x1EE04,
        0x1EE05,
@@ -194358,6 +196004,16 @@ static const UV UNI_ARABICEXTB_invlist[] = {  /* for all charsets */
        0x8A0
 };
 
+static const UV UNI_ARABICEXTC_invlist[] = {  /* for all charsets */
+       3,      /* Number of elements */
+       148565664, /* Version and data structure type */
+       1,      /* 0 if the list starts at 0;
+                  1 if it starts at the element beyond 0 */
+       0x0,
+       0x10EC0,
+       0x10F00
+};
+
 static const UV UNI_ARABICMATH_invlist[] = {  /* for all charsets */
        3,      /* Number of elements */
        148565664, /* Version and data structure type */
@@ -194507,7 +196163,7 @@ static const UV UNI_BATK_invlist[] = {  /* for all charsets */
 };
 
 static const UV UNI_BC__AL_invlist[] = {  /* for all charsets */
-       57,     /* Number of elements */
+       59,     /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -194556,6 +196212,8 @@ static const UV UNI_BC__AL_invlist[] = {  /* for all charsets */
        0x10D30,
        0x10D3A,
        0x10D40,
+       0x10EC0,
+       0x10EFD,
        0x10F30,
        0x10F46,
        0x10F51,
@@ -195464,7 +197122,7 @@ static const UV UNI_BC__FSI_invlist[] = {  /* for all charsets */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_BC__L_invlist[] = {  /* for ASCII/Latin1 */
-       942,    /* Number of elements */
+       956,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -195649,7 +197307,7 @@ static const UV UNI_BC__L_invlist[] = {  /* for ASCII/Latin1 */
        0xEB4,
        0xEBD,
        0xEC8,
-       0xECE,
+       0xECF,
        0xF18,
        0xF1A,
        0xF35,
@@ -196100,6 +197758,8 @@ static const UV UNI_BC__L_invlist[] = {  /* for ASCII/Latin1 */
        0x11238,
        0x1123E,
        0x1123F,
+       0x11241,
+       0x11242,
        0x112DF,
        0x112E0,
        0x112E3,
@@ -196224,8 +197884,20 @@ static const UV UNI_BC__L_invlist[] = {  /* for ASCII/Latin1 */
        0x11D98,
        0x11EF3,
        0x11EF5,
+       0x11F00,
+       0x11F02,
+       0x11F36,
+       0x11F3B,
+       0x11F40,
+       0x11F41,
+       0x11F42,
+       0x11F43,
        0x11FD5,
        0x11FF2,
+       0x13440,
+       0x13441,
+       0x13447,
+       0x13456,
        0x16AF0,
        0x16AF5,
        0x16B30,
@@ -196294,6 +197966,8 @@ static const UV UNI_BC__L_invlist[] = {  /* for ASCII/Latin1 */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E08F,
+       0x1E090,
        0x1E130,
        0x1E137,
        0x1E2AE,
@@ -196302,6 +197976,8 @@ static const UV UNI_BC__L_invlist[] = {  /* for ASCII/Latin1 */
        0x1E2F0,
        0x1E2FF,
        0x1E300,
+       0x1E4EC,
+       0x1E4F0,
        0x1E800,
        0x1F02C,
        0x1F030,
@@ -196326,14 +198002,14 @@ static const UV UNI_BC__L_invlist[] = {  /* for ASCII/Latin1 */
        0x1F266,
        0x1F300,
        0x1F6D8,
-       0x1F6DD,
+       0x1F6DC,
        0x1F6ED,
        0x1F6F0,
        0x1F6FD,
        0x1F700,
-       0x1F774,
-       0x1F780,
-       0x1F7D9,
+       0x1F777,
+       0x1F77B,
+       0x1F7DA,
        0x1F7E0,
        0x1F7EC,
        0x1F7F0,
@@ -196355,23 +198031,19 @@ static const UV UNI_BC__L_invlist[] = {  /* for ASCII/Latin1 */
        0x1FA60,
        0x1FA6E,
        0x1FA70,
-       0x1FA75,
-       0x1FA78,
        0x1FA7D,
        0x1FA80,
-       0x1FA87,
+       0x1FA89,
        0x1FA90,
-       0x1FAAD,
-       0x1FAB0,
-       0x1FABB,
-       0x1FAC0,
+       0x1FABE,
+       0x1FABF,
        0x1FAC6,
-       0x1FAD0,
-       0x1FADA,
+       0x1FACE,
+       0x1FADC,
        0x1FAE0,
-       0x1FAE8,
+       0x1FAE9,
        0x1FAF0,
-       0x1FAF7,
+       0x1FAF9,
        0x1FB00,
        0x1FB93,
        0x1FB94,
@@ -196420,7 +198092,7 @@ static const UV UNI_BC__L_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_BC__L_invlist[] = {  /* for EBCDIC 1047 */
-       968,    /* Number of elements */
+       982,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -196631,7 +198303,7 @@ static const UV UNI_BC__L_invlist[] = {  /* for EBCDIC 1047 */
        0xEB4,
        0xEBD,
        0xEC8,
-       0xECE,
+       0xECF,
        0xF18,
        0xF1A,
        0xF35,
@@ -197082,6 +198754,8 @@ static const UV UNI_BC__L_invlist[] = {  /* for EBCDIC 1047 */
        0x11238,
        0x1123E,
        0x1123F,
+       0x11241,
+       0x11242,
        0x112DF,
        0x112E0,
        0x112E3,
@@ -197206,8 +198880,20 @@ static const UV UNI_BC__L_invlist[] = {  /* for EBCDIC 1047 */
        0x11D98,
        0x11EF3,
        0x11EF5,
+       0x11F00,
+       0x11F02,
+       0x11F36,
+       0x11F3B,
+       0x11F40,
+       0x11F41,
+       0x11F42,
+       0x11F43,
        0x11FD5,
        0x11FF2,
+       0x13440,
+       0x13441,
+       0x13447,
+       0x13456,
        0x16AF0,
        0x16AF5,
        0x16B30,
@@ -197276,6 +198962,8 @@ static const UV UNI_BC__L_invlist[] = {  /* for EBCDIC 1047 */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E08F,
+       0x1E090,
        0x1E130,
        0x1E137,
        0x1E2AE,
@@ -197284,6 +198972,8 @@ static const UV UNI_BC__L_invlist[] = {  /* for EBCDIC 1047 */
        0x1E2F0,
        0x1E2FF,
        0x1E300,
+       0x1E4EC,
+       0x1E4F0,
        0x1E800,
        0x1F02C,
        0x1F030,
@@ -197308,14 +198998,14 @@ static const UV UNI_BC__L_invlist[] = {  /* for EBCDIC 1047 */
        0x1F266,
        0x1F300,
        0x1F6D8,
-       0x1F6DD,
+       0x1F6DC,
        0x1F6ED,
        0x1F6F0,
        0x1F6FD,
        0x1F700,
-       0x1F774,
-       0x1F780,
-       0x1F7D9,
+       0x1F777,
+       0x1F77B,
+       0x1F7DA,
        0x1F7E0,
        0x1F7EC,
        0x1F7F0,
@@ -197337,23 +199027,19 @@ static const UV UNI_BC__L_invlist[] = {  /* for EBCDIC 1047 */
        0x1FA60,
        0x1FA6E,
        0x1FA70,
-       0x1FA75,
-       0x1FA78,
        0x1FA7D,
        0x1FA80,
-       0x1FA87,
+       0x1FA89,
        0x1FA90,
-       0x1FAAD,
-       0x1FAB0,
-       0x1FABB,
-       0x1FAC0,
+       0x1FABE,
+       0x1FABF,
        0x1FAC6,
-       0x1FAD0,
-       0x1FADA,
+       0x1FACE,
+       0x1FADC,
        0x1FAE0,
-       0x1FAE8,
+       0x1FAE9,
        0x1FAF0,
-       0x1FAF7,
+       0x1FAF9,
        0x1FB00,
        0x1FB93,
        0x1FB94,
@@ -197402,7 +199088,7 @@ static const UV UNI_BC__L_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_BC__L_invlist[] = {  /* for EBCDIC 037 */
-       964,    /* Number of elements */
+       978,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -197609,7 +199295,7 @@ static const UV UNI_BC__L_invlist[] = {  /* for EBCDIC 037 */
        0xEB4,
        0xEBD,
        0xEC8,
-       0xECE,
+       0xECF,
        0xF18,
        0xF1A,
        0xF35,
@@ -198060,6 +199746,8 @@ static const UV UNI_BC__L_invlist[] = {  /* for EBCDIC 037 */
        0x11238,
        0x1123E,
        0x1123F,
+       0x11241,
+       0x11242,
        0x112DF,
        0x112E0,
        0x112E3,
@@ -198184,8 +199872,20 @@ static const UV UNI_BC__L_invlist[] = {  /* for EBCDIC 037 */
        0x11D98,
        0x11EF3,
        0x11EF5,
+       0x11F00,
+       0x11F02,
+       0x11F36,
+       0x11F3B,
+       0x11F40,
+       0x11F41,
+       0x11F42,
+       0x11F43,
        0x11FD5,
        0x11FF2,
+       0x13440,
+       0x13441,
+       0x13447,
+       0x13456,
        0x16AF0,
        0x16AF5,
        0x16B30,
@@ -198254,6 +199954,8 @@ static const UV UNI_BC__L_invlist[] = {  /* for EBCDIC 037 */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E08F,
+       0x1E090,
        0x1E130,
        0x1E137,
        0x1E2AE,
@@ -198262,6 +199964,8 @@ static const UV UNI_BC__L_invlist[] = {  /* for EBCDIC 037 */
        0x1E2F0,
        0x1E2FF,
        0x1E300,
+       0x1E4EC,
+       0x1E4F0,
        0x1E800,
        0x1F02C,
        0x1F030,
@@ -198286,14 +199990,14 @@ static const UV UNI_BC__L_invlist[] = {  /* for EBCDIC 037 */
        0x1F266,
        0x1F300,
        0x1F6D8,
-       0x1F6DD,
+       0x1F6DC,
        0x1F6ED,
        0x1F6F0,
        0x1F6FD,
        0x1F700,
-       0x1F774,
-       0x1F780,
-       0x1F7D9,
+       0x1F777,
+       0x1F77B,
+       0x1F7DA,
        0x1F7E0,
        0x1F7EC,
        0x1F7F0,
@@ -198315,23 +200019,19 @@ static const UV UNI_BC__L_invlist[] = {  /* for EBCDIC 037 */
        0x1FA60,
        0x1FA6E,
        0x1FA70,
-       0x1FA75,
-       0x1FA78,
        0x1FA7D,
        0x1FA80,
-       0x1FA87,
+       0x1FA89,
        0x1FA90,
-       0x1FAAD,
-       0x1FAB0,
-       0x1FABB,
-       0x1FAC0,
+       0x1FABE,
+       0x1FABF,
        0x1FAC6,
-       0x1FAD0,
-       0x1FADA,
+       0x1FACE,
+       0x1FADC,
        0x1FAE0,
-       0x1FAE8,
+       0x1FAE9,
        0x1FAF0,
-       0x1FAF7,
+       0x1FAF9,
        0x1FB00,
        0x1FB93,
        0x1FB94,
@@ -198405,7 +200105,7 @@ static const UV UNI_BC__LRO_invlist[] = {  /* for all charsets */
 };
 
 static const UV UNI_BC__NSM_invlist[] = {  /* for all charsets */
-       663,    /* Number of elements */
+       683,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -198591,7 +200291,7 @@ static const UV UNI_BC__NSM_invlist[] = {  /* for all charsets */
        0xEB4,
        0xEBD,
        0xEC8,
-       0xECE,
+       0xECF,
        0xF18,
        0xF1A,
        0xF35,
@@ -198846,6 +200546,8 @@ static const UV UNI_BC__NSM_invlist[] = {  /* for all charsets */
        0x10D28,
        0x10EAB,
        0x10EAD,
+       0x10EFD,
+       0x10F00,
        0x10F46,
        0x10F51,
        0x10F82,
@@ -198890,6 +200592,8 @@ static const UV UNI_BC__NSM_invlist[] = {  /* for all charsets */
        0x11238,
        0x1123E,
        0x1123F,
+       0x11241,
+       0x11242,
        0x112DF,
        0x112E0,
        0x112E3,
@@ -199012,6 +200716,18 @@ static const UV UNI_BC__NSM_invlist[] = {  /* for all charsets */
        0x11D98,
        0x11EF3,
        0x11EF5,
+       0x11F00,
+       0x11F02,
+       0x11F36,
+       0x11F3B,
+       0x11F40,
+       0x11F41,
+       0x11F42,
+       0x11F43,
+       0x13440,
+       0x13441,
+       0x13447,
+       0x13456,
        0x16AF0,
        0x16AF5,
        0x16B30,
@@ -199060,12 +200776,16 @@ static const UV UNI_BC__NSM_invlist[] = {  /* for all charsets */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E08F,
+       0x1E090,
        0x1E130,
        0x1E137,
        0x1E2AE,
        0x1E2AF,
        0x1E2EC,
        0x1E2F0,
+       0x1E4EC,
+       0x1E4F0,
        0x1E8D0,
        0x1E8D7,
        0x1E944,
@@ -199077,7 +200797,7 @@ static const UV UNI_BC__NSM_invlist[] = {  /* for all charsets */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_BC__ON_invlist[] = {  /* for ASCII/Latin1 */
-       383,    /* Number of elements */
+       379,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -199414,14 +201134,14 @@ static const UV UNI_BC__ON_invlist[] = {  /* for ASCII/Latin1 */
        0x1F266,
        0x1F300,
        0x1F6D8,
-       0x1F6DD,
+       0x1F6DC,
        0x1F6ED,
        0x1F6F0,
        0x1F6FD,
        0x1F700,
-       0x1F774,
-       0x1F780,
-       0x1F7D9,
+       0x1F777,
+       0x1F77B,
+       0x1F7DA,
        0x1F7E0,
        0x1F7EC,
        0x1F7F0,
@@ -199443,23 +201163,19 @@ static const UV UNI_BC__ON_invlist[] = {  /* for ASCII/Latin1 */
        0x1FA60,
        0x1FA6E,
        0x1FA70,
-       0x1FA75,
-       0x1FA78,
        0x1FA7D,
        0x1FA80,
-       0x1FA87,
+       0x1FA89,
        0x1FA90,
-       0x1FAAD,
-       0x1FAB0,
-       0x1FABB,
-       0x1FAC0,
+       0x1FABE,
+       0x1FABF,
        0x1FAC6,
-       0x1FAD0,
-       0x1FADA,
+       0x1FACE,
+       0x1FADC,
        0x1FAE0,
-       0x1FAE8,
+       0x1FAE9,
        0x1FAF0,
-       0x1FAF7,
+       0x1FAF9,
        0x1FB00,
        0x1FB93,
        0x1FB94,
@@ -199474,7 +201190,7 @@ static const UV UNI_BC__ON_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_BC__ON_invlist[] = {  /* for EBCDIC 1047 */
-       391,    /* Number of elements */
+       387,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -199819,14 +201535,14 @@ static const UV UNI_BC__ON_invlist[] = {  /* for EBCDIC 1047 */
        0x1F266,
        0x1F300,
        0x1F6D8,
-       0x1F6DD,
+       0x1F6DC,
        0x1F6ED,
        0x1F6F0,
        0x1F6FD,
        0x1F700,
-       0x1F774,
-       0x1F780,
-       0x1F7D9,
+       0x1F777,
+       0x1F77B,
+       0x1F7DA,
        0x1F7E0,
        0x1F7EC,
        0x1F7F0,
@@ -199848,23 +201564,19 @@ static const UV UNI_BC__ON_invlist[] = {  /* for EBCDIC 1047 */
        0x1FA60,
        0x1FA6E,
        0x1FA70,
-       0x1FA75,
-       0x1FA78,
        0x1FA7D,
        0x1FA80,
-       0x1FA87,
+       0x1FA89,
        0x1FA90,
-       0x1FAAD,
-       0x1FAB0,
-       0x1FABB,
-       0x1FAC0,
+       0x1FABE,
+       0x1FABF,
        0x1FAC6,
-       0x1FAD0,
-       0x1FADA,
+       0x1FACE,
+       0x1FADC,
        0x1FAE0,
-       0x1FAE8,
+       0x1FAE9,
        0x1FAF0,
-       0x1FAF7,
+       0x1FAF9,
        0x1FB00,
        0x1FB93,
        0x1FB94,
@@ -199879,7 +201591,7 @@ static const UV UNI_BC__ON_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_BC__ON_invlist[] = {  /* for EBCDIC 037 */
-       387,    /* Number of elements */
+       383,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -200220,14 +201932,14 @@ static const UV UNI_BC__ON_invlist[] = {  /* for EBCDIC 037 */
        0x1F266,
        0x1F300,
        0x1F6D8,
-       0x1F6DD,
+       0x1F6DC,
        0x1F6ED,
        0x1F6F0,
        0x1F6FD,
        0x1F700,
-       0x1F774,
-       0x1F780,
-       0x1F7D9,
+       0x1F777,
+       0x1F77B,
+       0x1F7DA,
        0x1F7E0,
        0x1F7EC,
        0x1F7F0,
@@ -200249,23 +201961,19 @@ static const UV UNI_BC__ON_invlist[] = {  /* for EBCDIC 037 */
        0x1FA60,
        0x1FA6E,
        0x1FA70,
-       0x1FA75,
-       0x1FA78,
        0x1FA7D,
        0x1FA80,
-       0x1FA87,
+       0x1FA89,
        0x1FA90,
-       0x1FAAD,
-       0x1FAB0,
-       0x1FABB,
-       0x1FAC0,
+       0x1FABE,
+       0x1FABF,
        0x1FAC6,
-       0x1FAD0,
-       0x1FADA,
+       0x1FACE,
+       0x1FADC,
        0x1FAE0,
-       0x1FAE8,
+       0x1FAE9,
        0x1FAF0,
-       0x1FAF7,
+       0x1FAF9,
        0x1FB00,
        0x1FB93,
        0x1FB94,
@@ -200295,7 +202003,7 @@ static const UV UNI_BC__PDI_invlist[] = {  /* for all charsets */
 };
 
 static const UV UNI_BC__R_invlist[] = {  /* for all charsets */
-       79,     /* Number of elements */
+       81,     /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -200361,6 +202069,8 @@ static const UV UNI_BC__R_invlist[] = {  /* for all charsets */
        0x10E7F,
        0x10EAB,
        0x10EAD,
+       0x10EC0,
+       0x10F00,
        0x10F30,
        0x10F70,
        0x10F82,
@@ -202567,7 +204277,7 @@ static const UV UNI_BYZANTINEMUSIC_invlist[] = {  /* for all charsets */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_C_invlist[] = {  /* for ASCII/Latin1 */
-       1401,   /* Number of elements */
+       1423,   /* Number of elements */
        148565664, /* Version and data structure type */
        0,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -202823,7 +204533,7 @@ static const UV UNI_C_invlist[] = {  /* for ASCII/Latin1 */
        0xCE6,
        0xCF0,
        0xCF1,
-       0xCF3,
+       0xCF4,
        0xD00,
        0xD0D,
        0xD0E,
@@ -202883,7 +204593,7 @@ static const UV UNI_C_invlist[] = {  /* for ASCII/Latin1 */
        0xEC6,
        0xEC7,
        0xEC8,
-       0xECE,
+       0xECF,
        0xED0,
        0xEDA,
        0xEDC,
@@ -203428,7 +205138,7 @@ static const UV UNI_C_invlist[] = {  /* for ASCII/Latin1 */
        0x10EAE,
        0x10EB0,
        0x10EB2,
-       0x10F00,
+       0x10EFD,
        0x10F28,
        0x10F30,
        0x10F5A,
@@ -203463,7 +205173,7 @@ static const UV UNI_C_invlist[] = {  /* for ASCII/Latin1 */
        0x11200,
        0x11212,
        0x11213,
-       0x1123F,
+       0x11242,
        0x11280,
        0x11287,
        0x11288,
@@ -203568,6 +205278,8 @@ static const UV UNI_C_invlist[] = {  /* for ASCII/Latin1 */
        0x11AA3,
        0x11AB0,
        0x11AF9,
+       0x11B00,
+       0x11B0A,
        0x11C00,
        0x11C09,
        0x11C0A,
@@ -203610,6 +205322,12 @@ static const UV UNI_C_invlist[] = {  /* for ASCII/Latin1 */
        0x11DAA,
        0x11EE0,
        0x11EF9,
+       0x11F00,
+       0x11F11,
+       0x11F12,
+       0x11F3B,
+       0x11F3E,
+       0x11F5A,
        0x11FB0,
        0x11FB1,
        0x11FC0,
@@ -203625,7 +205343,9 @@ static const UV UNI_C_invlist[] = {  /* for ASCII/Latin1 */
        0x12F90,
        0x12FF3,
        0x13000,
-       0x1342F,
+       0x13430,
+       0x13440,
+       0x13456,
        0x14400,
        0x14647,
        0x16800,
@@ -203678,8 +205398,12 @@ static const UV UNI_C_invlist[] = {  /* for ASCII/Latin1 */
        0x1AFFF,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -203710,6 +205434,8 @@ static const UV UNI_C_invlist[] = {  /* for ASCII/Latin1 */
        0x1D1EB,
        0x1D200,
        0x1D246,
+       0x1D2C0,
+       0x1D2D4,
        0x1D2E0,
        0x1D2F4,
        0x1D300,
@@ -203764,6 +205490,8 @@ static const UV UNI_C_invlist[] = {  /* for ASCII/Latin1 */
        0x1DAB0,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
        0x1E000,
        0x1E007,
        0x1E008,
@@ -203774,6 +205502,10 @@ static const UV UNI_C_invlist[] = {  /* for ASCII/Latin1 */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E030,
+       0x1E06E,
+       0x1E08F,
+       0x1E090,
        0x1E100,
        0x1E12D,
        0x1E130,
@@ -203788,6 +205520,8 @@ static const UV UNI_C_invlist[] = {  /* for ASCII/Latin1 */
        0x1E2FA,
        0x1E2FF,
        0x1E300,
+       0x1E4D0,
+       0x1E4FA,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -203904,14 +205638,14 @@ static const UV UNI_C_invlist[] = {  /* for ASCII/Latin1 */
        0x1F266,
        0x1F300,
        0x1F6D8,
-       0x1F6DD,
+       0x1F6DC,
        0x1F6ED,
        0x1F6F0,
        0x1F6FD,
        0x1F700,
-       0x1F774,
-       0x1F780,
-       0x1F7D9,
+       0x1F777,
+       0x1F77B,
+       0x1F7DA,
        0x1F7E0,
        0x1F7EC,
        0x1F7F0,
@@ -203933,23 +205667,19 @@ static const UV UNI_C_invlist[] = {  /* for ASCII/Latin1 */
        0x1FA60,
        0x1FA6E,
        0x1FA70,
-       0x1FA75,
-       0x1FA78,
        0x1FA7D,
        0x1FA80,
-       0x1FA87,
+       0x1FA89,
        0x1FA90,
-       0x1FAAD,
-       0x1FAB0,
-       0x1FABB,
-       0x1FAC0,
+       0x1FABE,
+       0x1FABF,
        0x1FAC6,
-       0x1FAD0,
-       0x1FADA,
+       0x1FACE,
+       0x1FADC,
        0x1FAE0,
-       0x1FAE8,
+       0x1FAE9,
        0x1FAF0,
-       0x1FAF7,
+       0x1FAF9,
        0x1FB00,
        0x1FB93,
        0x1FB94,
@@ -203959,7 +205689,7 @@ static const UV UNI_C_invlist[] = {  /* for ASCII/Latin1 */
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -203970,6 +205700,8 @@ static const UV UNI_C_invlist[] = {  /* for ASCII/Latin1 */
        0x2FA1E,
        0x30000,
        0x3134B,
+       0x31350,
+       0x323B0,
        0xE0100,
        0xE01F0
 };
@@ -203982,7 +205714,7 @@ static const UV UNI_C_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_C_invlist[] = {  /* for EBCDIC 1047 */
-       1401,   /* Number of elements */
+       1423,   /* Number of elements */
        148565664, /* Version and data structure type */
        0,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -204238,7 +205970,7 @@ static const UV UNI_C_invlist[] = {  /* for EBCDIC 1047 */
        0xCE6,
        0xCF0,
        0xCF1,
-       0xCF3,
+       0xCF4,
        0xD00,
        0xD0D,
        0xD0E,
@@ -204298,7 +206030,7 @@ static const UV UNI_C_invlist[] = {  /* for EBCDIC 1047 */
        0xEC6,
        0xEC7,
        0xEC8,
-       0xECE,
+       0xECF,
        0xED0,
        0xEDA,
        0xEDC,
@@ -204843,7 +206575,7 @@ static const UV UNI_C_invlist[] = {  /* for EBCDIC 1047 */
        0x10EAE,
        0x10EB0,
        0x10EB2,
-       0x10F00,
+       0x10EFD,
        0x10F28,
        0x10F30,
        0x10F5A,
@@ -204878,7 +206610,7 @@ static const UV UNI_C_invlist[] = {  /* for EBCDIC 1047 */
        0x11200,
        0x11212,
        0x11213,
-       0x1123F,
+       0x11242,
        0x11280,
        0x11287,
        0x11288,
@@ -204983,6 +206715,8 @@ static const UV UNI_C_invlist[] = {  /* for EBCDIC 1047 */
        0x11AA3,
        0x11AB0,
        0x11AF9,
+       0x11B00,
+       0x11B0A,
        0x11C00,
        0x11C09,
        0x11C0A,
@@ -205025,6 +206759,12 @@ static const UV UNI_C_invlist[] = {  /* for EBCDIC 1047 */
        0x11DAA,
        0x11EE0,
        0x11EF9,
+       0x11F00,
+       0x11F11,
+       0x11F12,
+       0x11F3B,
+       0x11F3E,
+       0x11F5A,
        0x11FB0,
        0x11FB1,
        0x11FC0,
@@ -205040,7 +206780,9 @@ static const UV UNI_C_invlist[] = {  /* for EBCDIC 1047 */
        0x12F90,
        0x12FF3,
        0x13000,
-       0x1342F,
+       0x13430,
+       0x13440,
+       0x13456,
        0x14400,
        0x14647,
        0x16800,
@@ -205093,8 +206835,12 @@ static const UV UNI_C_invlist[] = {  /* for EBCDIC 1047 */
        0x1AFFF,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -205125,6 +206871,8 @@ static const UV UNI_C_invlist[] = {  /* for EBCDIC 1047 */
        0x1D1EB,
        0x1D200,
        0x1D246,
+       0x1D2C0,
+       0x1D2D4,
        0x1D2E0,
        0x1D2F4,
        0x1D300,
@@ -205179,6 +206927,8 @@ static const UV UNI_C_invlist[] = {  /* for EBCDIC 1047 */
        0x1DAB0,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
        0x1E000,
        0x1E007,
        0x1E008,
@@ -205189,6 +206939,10 @@ static const UV UNI_C_invlist[] = {  /* for EBCDIC 1047 */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E030,
+       0x1E06E,
+       0x1E08F,
+       0x1E090,
        0x1E100,
        0x1E12D,
        0x1E130,
@@ -205203,6 +206957,8 @@ static const UV UNI_C_invlist[] = {  /* for EBCDIC 1047 */
        0x1E2FA,
        0x1E2FF,
        0x1E300,
+       0x1E4D0,
+       0x1E4FA,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -205319,14 +207075,14 @@ static const UV UNI_C_invlist[] = {  /* for EBCDIC 1047 */
        0x1F266,
        0x1F300,
        0x1F6D8,
-       0x1F6DD,
+       0x1F6DC,
        0x1F6ED,
        0x1F6F0,
        0x1F6FD,
        0x1F700,
-       0x1F774,
-       0x1F780,
-       0x1F7D9,
+       0x1F777,
+       0x1F77B,
+       0x1F7DA,
        0x1F7E0,
        0x1F7EC,
        0x1F7F0,
@@ -205348,23 +207104,19 @@ static const UV UNI_C_invlist[] = {  /* for EBCDIC 1047 */
        0x1FA60,
        0x1FA6E,
        0x1FA70,
-       0x1FA75,
-       0x1FA78,
        0x1FA7D,
        0x1FA80,
-       0x1FA87,
+       0x1FA89,
        0x1FA90,
-       0x1FAAD,
-       0x1FAB0,
-       0x1FABB,
-       0x1FAC0,
+       0x1FABE,
+       0x1FABF,
        0x1FAC6,
-       0x1FAD0,
-       0x1FADA,
+       0x1FACE,
+       0x1FADC,
        0x1FAE0,
-       0x1FAE8,
+       0x1FAE9,
        0x1FAF0,
-       0x1FAF7,
+       0x1FAF9,
        0x1FB00,
        0x1FB93,
        0x1FB94,
@@ -205374,7 +207126,7 @@ static const UV UNI_C_invlist[] = {  /* for EBCDIC 1047 */
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -205385,6 +207137,8 @@ static const UV UNI_C_invlist[] = {  /* for EBCDIC 1047 */
        0x2FA1E,
        0x30000,
        0x3134B,
+       0x31350,
+       0x323B0,
        0xE0100,
        0xE01F0
 };
@@ -205397,7 +207151,7 @@ static const UV UNI_C_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_C_invlist[] = {  /* for EBCDIC 037 */
-       1401,   /* Number of elements */
+       1423,   /* Number of elements */
        148565664, /* Version and data structure type */
        0,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -205653,7 +207407,7 @@ static const UV UNI_C_invlist[] = {  /* for EBCDIC 037 */
        0xCE6,
        0xCF0,
        0xCF1,
-       0xCF3,
+       0xCF4,
        0xD00,
        0xD0D,
        0xD0E,
@@ -205713,7 +207467,7 @@ static const UV UNI_C_invlist[] = {  /* for EBCDIC 037 */
        0xEC6,
        0xEC7,
        0xEC8,
-       0xECE,
+       0xECF,
        0xED0,
        0xEDA,
        0xEDC,
@@ -206258,7 +208012,7 @@ static const UV UNI_C_invlist[] = {  /* for EBCDIC 037 */
        0x10EAE,
        0x10EB0,
        0x10EB2,
-       0x10F00,
+       0x10EFD,
        0x10F28,
        0x10F30,
        0x10F5A,
@@ -206293,7 +208047,7 @@ static const UV UNI_C_invlist[] = {  /* for EBCDIC 037 */
        0x11200,
        0x11212,
        0x11213,
-       0x1123F,
+       0x11242,
        0x11280,
        0x11287,
        0x11288,
@@ -206398,6 +208152,8 @@ static const UV UNI_C_invlist[] = {  /* for EBCDIC 037 */
        0x11AA3,
        0x11AB0,
        0x11AF9,
+       0x11B00,
+       0x11B0A,
        0x11C00,
        0x11C09,
        0x11C0A,
@@ -206440,6 +208196,12 @@ static const UV UNI_C_invlist[] = {  /* for EBCDIC 037 */
        0x11DAA,
        0x11EE0,
        0x11EF9,
+       0x11F00,
+       0x11F11,
+       0x11F12,
+       0x11F3B,
+       0x11F3E,
+       0x11F5A,
        0x11FB0,
        0x11FB1,
        0x11FC0,
@@ -206455,7 +208217,9 @@ static const UV UNI_C_invlist[] = {  /* for EBCDIC 037 */
        0x12F90,
        0x12FF3,
        0x13000,
-       0x1342F,
+       0x13430,
+       0x13440,
+       0x13456,
        0x14400,
        0x14647,
        0x16800,
@@ -206508,8 +208272,12 @@ static const UV UNI_C_invlist[] = {  /* for EBCDIC 037 */
        0x1AFFF,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -206540,6 +208308,8 @@ static const UV UNI_C_invlist[] = {  /* for EBCDIC 037 */
        0x1D1EB,
        0x1D200,
        0x1D246,
+       0x1D2C0,
+       0x1D2D4,
        0x1D2E0,
        0x1D2F4,
        0x1D300,
@@ -206594,6 +208364,8 @@ static const UV UNI_C_invlist[] = {  /* for EBCDIC 037 */
        0x1DAB0,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
        0x1E000,
        0x1E007,
        0x1E008,
@@ -206604,6 +208376,10 @@ static const UV UNI_C_invlist[] = {  /* for EBCDIC 037 */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E030,
+       0x1E06E,
+       0x1E08F,
+       0x1E090,
        0x1E100,
        0x1E12D,
        0x1E130,
@@ -206618,6 +208394,8 @@ static const UV UNI_C_invlist[] = {  /* for EBCDIC 037 */
        0x1E2FA,
        0x1E2FF,
        0x1E300,
+       0x1E4D0,
+       0x1E4FA,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -206734,14 +208512,14 @@ static const UV UNI_C_invlist[] = {  /* for EBCDIC 037 */
        0x1F266,
        0x1F300,
        0x1F6D8,
-       0x1F6DD,
+       0x1F6DC,
        0x1F6ED,
        0x1F6F0,
        0x1F6FD,
        0x1F700,
-       0x1F774,
-       0x1F780,
-       0x1F7D9,
+       0x1F777,
+       0x1F77B,
+       0x1F7DA,
        0x1F7E0,
        0x1F7EC,
        0x1F7F0,
@@ -206763,23 +208541,19 @@ static const UV UNI_C_invlist[] = {  /* for EBCDIC 037 */
        0x1FA60,
        0x1FA6E,
        0x1FA70,
-       0x1FA75,
-       0x1FA78,
        0x1FA7D,
        0x1FA80,
-       0x1FA87,
+       0x1FA89,
        0x1FA90,
-       0x1FAAD,
-       0x1FAB0,
-       0x1FABB,
-       0x1FAC0,
+       0x1FABE,
+       0x1FABF,
        0x1FAC6,
-       0x1FAD0,
-       0x1FADA,
+       0x1FACE,
+       0x1FADC,
        0x1FAE0,
-       0x1FAE8,
+       0x1FAE9,
        0x1FAF0,
-       0x1FAF7,
+       0x1FAF9,
        0x1FB00,
        0x1FB93,
        0x1FB94,
@@ -206789,7 +208563,7 @@ static const UV UNI_C_invlist[] = {  /* for EBCDIC 037 */
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -206800,6 +208574,8 @@ static const UV UNI_C_invlist[] = {  /* for EBCDIC 037 */
        0x2FA1E,
        0x30000,
        0x3134B,
+       0x31350,
+       0x323B0,
        0xE0100,
        0xE01F0
 };
@@ -206847,7 +208623,7 @@ static const UV UNI_CARI_invlist[] = {  /* for all charsets */
 };
 
 static const UV UNI_CCC__0_invlist[] = {  /* for all charsets */
-       377,    /* Number of elements */
+       385,    /* Number of elements */
        148565664, /* Version and data structure type */
        0,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -207116,6 +208892,8 @@ static const UV UNI_CCC__0_invlist[] = {  /* for all charsets */
        0x10D28,
        0x10EAB,
        0x10EAD,
+       0x10EFD,
+       0x10F00,
        0x10F46,
        0x10F51,
        0x10F82,
@@ -207188,6 +208966,8 @@ static const UV UNI_CCC__0_invlist[] = {  /* for all charsets */
        0x11D46,
        0x11D97,
        0x11D98,
+       0x11F41,
+       0x11F43,
        0x16AF0,
        0x16AF5,
        0x16B30,
@@ -207218,12 +208998,16 @@ static const UV UNI_CCC__0_invlist[] = {  /* for all charsets */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E08F,
+       0x1E090,
        0x1E130,
        0x1E137,
        0x1E2AE,
        0x1E2AF,
        0x1E2EC,
        0x1E2F0,
+       0x1E4EC,
+       0x1E4F0,
        0x1E8D0,
        0x1E8D7,
        0x1E944,
@@ -207749,7 +209533,7 @@ static const UV UNI_CCC__84_invlist[] = {  /* for all charsets */
 };
 
 static const UV UNI_CCC__9_invlist[] = {  /* for all charsets */
-       111,    /* Number of elements */
+       113,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -207863,7 +209647,9 @@ static const UV UNI_CCC__9_invlist[] = {  /* for all charsets */
        0x11D44,
        0x11D46,
        0x11D97,
-       0x11D98
+       0x11D98,
+       0x11F41,
+       0x11F43
 };
 
 static const UV UNI_CCC__91_invlist[] = {  /* for all charsets */
@@ -207877,7 +209663,7 @@ static const UV UNI_CCC__91_invlist[] = {  /* for all charsets */
 };
 
 static const UV UNI_CCC__A_invlist[] = {  /* for all charsets */
-       255,    /* Number of elements */
+       259,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -208128,12 +209914,16 @@ static const UV UNI_CCC__A_invlist[] = {  /* for all charsets */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E08F,
+       0x1E090,
        0x1E130,
        0x1E137,
        0x1E2AE,
        0x1E2AF,
        0x1E2EC,
        0x1E2F0,
+       0x1E4EF,
+       0x1E4F0,
        0x1E944,
        0x1E94A
 };
@@ -208155,7 +209945,7 @@ static const UV UNI_CCC__AL_invlist[] = {  /* for all charsets */
 };
 
 static const UV UNI_CCC__AR_invlist[] = {  /* for all charsets */
-       11,     /* Number of elements */
+       13,     /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -208169,11 +209959,13 @@ static const UV UNI_CCC__AR_invlist[] = {  /* for all charsets */
        0x1DF6,
        0x1DF7,
        0x302C,
-       0x302D
+       0x302D,
+       0x1E4EC,
+       0x1E4EE
 };
 
 static const UV UNI_CCC__B_invlist[] = {  /* for all charsets */
-       167,    /* Number of elements */
+       171,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -208328,6 +210120,8 @@ static const UV UNI_CCC__B_invlist[] = {  /* for all charsets */
        0x10A3B,
        0x10AE6,
        0x10AE7,
+       0x10EFD,
+       0x10F00,
        0x10F46,
        0x10F48,
        0x10F4B,
@@ -208342,6 +210136,8 @@ static const UV UNI_CCC__B_invlist[] = {  /* for all charsets */
        0x1D183,
        0x1D18A,
        0x1D18C,
+       0x1E4EE,
+       0x1E4EF,
        0x1E8D0,
        0x1E8D7
 };
@@ -208549,7 +210345,7 @@ static const UV UNI_CF_invlist[] = {  /* for ASCII/Latin1 */
        0x110CD,
        0x110CE,
        0x13430,
-       0x13439,
+       0x13440,
        0x1BCA0,
        0x1BCA4,
        0x1D173,
@@ -208606,7 +210402,7 @@ static const UV UNI_CF_invlist[] = {  /* for EBCDIC 1047 */
        0x110CD,
        0x110CE,
        0x13430,
-       0x13439,
+       0x13440,
        0x1BCA0,
        0x1BCA4,
        0x1D173,
@@ -208663,7 +210459,7 @@ static const UV UNI_CF_invlist[] = {  /* for EBCDIC 037 */
        0x110CD,
        0x110CE,
        0x13430,
-       0x13439,
+       0x13440,
        0x1BCA0,
        0x1BCA4,
        0x1D173,
@@ -208739,7 +210535,7 @@ static const UV UNI_CHRS_invlist[] = {  /* for all charsets */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_CI_invlist[] = {  /* for ASCII/Latin1 */
-       855,    /* Number of elements */
+       875,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -208971,7 +210767,7 @@ static const UV UNI_CI_invlist[] = {  /* for ASCII/Latin1 */
        0xEC6,
        0xEC7,
        0xEC8,
-       0xECE,
+       0xECF,
        0xF18,
        0xF1A,
        0xF35,
@@ -209348,6 +211144,8 @@ static const UV UNI_CI_invlist[] = {  /* for ASCII/Latin1 */
        0x10D28,
        0x10EAB,
        0x10EAD,
+       0x10EFD,
+       0x10F00,
        0x10F46,
        0x10F51,
        0x10F82,
@@ -209396,6 +211194,8 @@ static const UV UNI_CI_invlist[] = {  /* for ASCII/Latin1 */
        0x11238,
        0x1123E,
        0x1123F,
+       0x11241,
+       0x11242,
        0x112DF,
        0x112E0,
        0x112E3,
@@ -209518,8 +211318,18 @@ static const UV UNI_CI_invlist[] = {  /* for ASCII/Latin1 */
        0x11D98,
        0x11EF3,
        0x11EF5,
+       0x11F00,
+       0x11F02,
+       0x11F36,
+       0x11F3B,
+       0x11F40,
+       0x11F41,
+       0x11F42,
+       0x11F43,
        0x13430,
-       0x13439,
+       0x13441,
+       0x13447,
+       0x13456,
        0x16AF0,
        0x16AF5,
        0x16B30,
@@ -209580,12 +211390,18 @@ static const UV UNI_CI_invlist[] = {  /* for ASCII/Latin1 */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E030,
+       0x1E06E,
+       0x1E08F,
+       0x1E090,
        0x1E130,
        0x1E13E,
        0x1E2AE,
        0x1E2AF,
        0x1E2EC,
        0x1E2F0,
+       0x1E4EB,
+       0x1E4F0,
        0x1E8D0,
        0x1E8D7,
        0x1E944,
@@ -209608,7 +211424,7 @@ static const UV UNI_CI_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_CI_invlist[] = {  /* for EBCDIC 1047 */
-       853,    /* Number of elements */
+       873,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -209838,7 +211654,7 @@ static const UV UNI_CI_invlist[] = {  /* for EBCDIC 1047 */
        0xEC6,
        0xEC7,
        0xEC8,
-       0xECE,
+       0xECF,
        0xF18,
        0xF1A,
        0xF35,
@@ -210215,6 +212031,8 @@ static const UV UNI_CI_invlist[] = {  /* for EBCDIC 1047 */
        0x10D28,
        0x10EAB,
        0x10EAD,
+       0x10EFD,
+       0x10F00,
        0x10F46,
        0x10F51,
        0x10F82,
@@ -210263,6 +212081,8 @@ static const UV UNI_CI_invlist[] = {  /* for EBCDIC 1047 */
        0x11238,
        0x1123E,
        0x1123F,
+       0x11241,
+       0x11242,
        0x112DF,
        0x112E0,
        0x112E3,
@@ -210385,8 +212205,18 @@ static const UV UNI_CI_invlist[] = {  /* for EBCDIC 1047 */
        0x11D98,
        0x11EF3,
        0x11EF5,
+       0x11F00,
+       0x11F02,
+       0x11F36,
+       0x11F3B,
+       0x11F40,
+       0x11F41,
+       0x11F42,
+       0x11F43,
        0x13430,
-       0x13439,
+       0x13441,
+       0x13447,
+       0x13456,
        0x16AF0,
        0x16AF5,
        0x16B30,
@@ -210447,12 +212277,18 @@ static const UV UNI_CI_invlist[] = {  /* for EBCDIC 1047 */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E030,
+       0x1E06E,
+       0x1E08F,
+       0x1E090,
        0x1E130,
        0x1E13E,
        0x1E2AE,
        0x1E2AF,
        0x1E2EC,
        0x1E2F0,
+       0x1E4EB,
+       0x1E4F0,
        0x1E8D0,
        0x1E8D7,
        0x1E944,
@@ -210475,7 +212311,7 @@ static const UV UNI_CI_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_CI_invlist[] = {  /* for EBCDIC 037 */
-       851,    /* Number of elements */
+       871,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -210703,7 +212539,7 @@ static const UV UNI_CI_invlist[] = {  /* for EBCDIC 037 */
        0xEC6,
        0xEC7,
        0xEC8,
-       0xECE,
+       0xECF,
        0xF18,
        0xF1A,
        0xF35,
@@ -211080,6 +212916,8 @@ static const UV UNI_CI_invlist[] = {  /* for EBCDIC 037 */
        0x10D28,
        0x10EAB,
        0x10EAD,
+       0x10EFD,
+       0x10F00,
        0x10F46,
        0x10F51,
        0x10F82,
@@ -211128,6 +212966,8 @@ static const UV UNI_CI_invlist[] = {  /* for EBCDIC 037 */
        0x11238,
        0x1123E,
        0x1123F,
+       0x11241,
+       0x11242,
        0x112DF,
        0x112E0,
        0x112E3,
@@ -211250,8 +213090,18 @@ static const UV UNI_CI_invlist[] = {  /* for EBCDIC 037 */
        0x11D98,
        0x11EF3,
        0x11EF5,
+       0x11F00,
+       0x11F02,
+       0x11F36,
+       0x11F3B,
+       0x11F40,
+       0x11F41,
+       0x11F42,
+       0x11F43,
        0x13430,
-       0x13439,
+       0x13441,
+       0x13447,
+       0x13456,
        0x16AF0,
        0x16AF5,
        0x16B30,
@@ -211312,12 +213162,18 @@ static const UV UNI_CI_invlist[] = {  /* for EBCDIC 037 */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E030,
+       0x1E06E,
+       0x1E08F,
+       0x1E090,
        0x1E130,
        0x1E13E,
        0x1E2AE,
        0x1E2AF,
        0x1E2EC,
        0x1E2F0,
+       0x1E4EB,
+       0x1E4F0,
        0x1E8D0,
        0x1E8D7,
        0x1E944,
@@ -211454,6 +213310,16 @@ static const UV UNI_CJKEXTG_invlist[] = {  /* for all charsets */
        0x31350
 };
 
+static const UV UNI_CJKEXTH_invlist[] = {  /* for all charsets */
+       3,      /* Number of elements */
+       148565664, /* Version and data structure type */
+       1,      /* 0 if the list starts at 0;
+                  1 if it starts at the element beyond 0 */
+       0x0,
+       0x31350,
+       0x323B0
+};
+
 static const UV UNI_CJKRADICALSSUP_invlist[] = {  /* for all charsets */
        3,      /* Number of elements */
        148565664, /* Version and data structure type */
@@ -211485,7 +213351,7 @@ static const UV UNI_CJKSYMBOLS_invlist[] = {  /* for all charsets */
 };
 
 static const UV UNI_CN_invlist[] = {  /* for all charsets */
-       1396,   /* Number of elements */
+       1414,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -211732,7 +213598,7 @@ static const UV UNI_CN_invlist[] = {  /* for all charsets */
        0xCE6,
        0xCF0,
        0xCF1,
-       0xCF3,
+       0xCF4,
        0xD00,
        0xD0D,
        0xD0E,
@@ -211792,7 +213658,7 @@ static const UV UNI_CN_invlist[] = {  /* for all charsets */
        0xEC6,
        0xEC7,
        0xEC8,
-       0xECE,
+       0xECF,
        0xED0,
        0xEDA,
        0xEDC,
@@ -212333,7 +214199,7 @@ static const UV UNI_CN_invlist[] = {  /* for all charsets */
        0x10EAE,
        0x10EB0,
        0x10EB2,
-       0x10F00,
+       0x10EFD,
        0x10F28,
        0x10F30,
        0x10F5A,
@@ -212368,7 +214234,7 @@ static const UV UNI_CN_invlist[] = {  /* for all charsets */
        0x11200,
        0x11212,
        0x11213,
-       0x1123F,
+       0x11242,
        0x11280,
        0x11287,
        0x11288,
@@ -212473,6 +214339,8 @@ static const UV UNI_CN_invlist[] = {  /* for all charsets */
        0x11AA3,
        0x11AB0,
        0x11AF9,
+       0x11B00,
+       0x11B0A,
        0x11C00,
        0x11C09,
        0x11C0A,
@@ -212515,6 +214383,12 @@ static const UV UNI_CN_invlist[] = {  /* for all charsets */
        0x11DAA,
        0x11EE0,
        0x11EF9,
+       0x11F00,
+       0x11F11,
+       0x11F12,
+       0x11F3B,
+       0x11F3E,
+       0x11F5A,
        0x11FB0,
        0x11FB1,
        0x11FC0,
@@ -212530,9 +214404,7 @@ static const UV UNI_CN_invlist[] = {  /* for all charsets */
        0x12F90,
        0x12FF3,
        0x13000,
-       0x1342F,
-       0x13430,
-       0x13439,
+       0x13456,
        0x14400,
        0x14647,
        0x16800,
@@ -212585,8 +214457,12 @@ static const UV UNI_CN_invlist[] = {  /* for all charsets */
        0x1AFFF,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -212615,6 +214491,8 @@ static const UV UNI_CN_invlist[] = {  /* for all charsets */
        0x1D1EB,
        0x1D200,
        0x1D246,
+       0x1D2C0,
+       0x1D2D4,
        0x1D2E0,
        0x1D2F4,
        0x1D300,
@@ -212669,6 +214547,8 @@ static const UV UNI_CN_invlist[] = {  /* for all charsets */
        0x1DAB0,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
        0x1E000,
        0x1E007,
        0x1E008,
@@ -212679,6 +214559,10 @@ static const UV UNI_CN_invlist[] = {  /* for all charsets */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E030,
+       0x1E06E,
+       0x1E08F,
+       0x1E090,
        0x1E100,
        0x1E12D,
        0x1E130,
@@ -212693,6 +214577,8 @@ static const UV UNI_CN_invlist[] = {  /* for all charsets */
        0x1E2FA,
        0x1E2FF,
        0x1E300,
+       0x1E4D0,
+       0x1E4FA,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -212809,14 +214695,14 @@ static const UV UNI_CN_invlist[] = {  /* for all charsets */
        0x1F266,
        0x1F300,
        0x1F6D8,
-       0x1F6DD,
+       0x1F6DC,
        0x1F6ED,
        0x1F6F0,
        0x1F6FD,
        0x1F700,
-       0x1F774,
-       0x1F780,
-       0x1F7D9,
+       0x1F777,
+       0x1F77B,
+       0x1F7DA,
        0x1F7E0,
        0x1F7EC,
        0x1F7F0,
@@ -212838,23 +214724,19 @@ static const UV UNI_CN_invlist[] = {  /* for all charsets */
        0x1FA60,
        0x1FA6E,
        0x1FA70,
-       0x1FA75,
-       0x1FA78,
        0x1FA7D,
        0x1FA80,
-       0x1FA87,
+       0x1FA89,
        0x1FA90,
-       0x1FAAD,
-       0x1FAB0,
-       0x1FABB,
-       0x1FAC0,
+       0x1FABE,
+       0x1FABF,
        0x1FAC6,
-       0x1FAD0,
-       0x1FADA,
+       0x1FACE,
+       0x1FADC,
        0x1FAE0,
-       0x1FAE8,
+       0x1FAE9,
        0x1FAF0,
-       0x1FAF7,
+       0x1FAF9,
        0x1FB00,
        0x1FB93,
        0x1FB94,
@@ -212864,7 +214746,7 @@ static const UV UNI_CN_invlist[] = {  /* for all charsets */
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -212875,6 +214757,8 @@ static const UV UNI_CN_invlist[] = {  /* for all charsets */
        0x2FA1E,
        0x30000,
        0x3134B,
+       0x31350,
+       0x323B0,
        0xE0001,
        0xE0002,
        0xE0020,
@@ -217870,7 +219754,7 @@ static const UV UNI_CWCM_invlist[] = {  /* for EBCDIC 037 */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_CWKCF_invlist[] = {  /* for ASCII/Latin1 */
-       1677,   /* Number of elements */
+       1679,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -219459,6 +221343,8 @@ static const UV UNI_CWKCF_invlist[] = {  /* for ASCII/Latin1 */
        0x1D7CC,
        0x1D7CE,
        0x1D800,
+       0x1E030,
+       0x1E06E,
        0x1E900,
        0x1E922,
        0x1EE00,
@@ -219561,7 +221447,7 @@ static const UV UNI_CWKCF_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_CWKCF_invlist[] = {  /* for EBCDIC 1047 */
-       1687,   /* Number of elements */
+       1689,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -221160,6 +223046,8 @@ static const UV UNI_CWKCF_invlist[] = {  /* for EBCDIC 1047 */
        0x1D7CC,
        0x1D7CE,
        0x1D800,
+       0x1E030,
+       0x1E06E,
        0x1E900,
        0x1E922,
        0x1EE00,
@@ -221262,7 +223150,7 @@ static const UV UNI_CWKCF_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_CWKCF_invlist[] = {  /* for EBCDIC 037 */
-       1685,   /* Number of elements */
+       1687,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -222859,6 +224747,8 @@ static const UV UNI_CWKCF_invlist[] = {  /* for EBCDIC 037 */
        0x1D7CC,
        0x1D7CE,
        0x1D800,
+       0x1E030,
+       0x1E06E,
        0x1E900,
        0x1E922,
        0x1EE00,
@@ -234381,6 +236271,16 @@ static const UV UNI_CYRILLICEXTC_invlist[] = {  /* for all charsets */
        0x1C90
 };
 
+static const UV UNI_CYRILLICEXTD_invlist[] = {  /* for all charsets */
+       3,      /* Number of elements */
+       148565664, /* Version and data structure type */
+       1,      /* 0 if the list starts at 0;
+                  1 if it starts at the element beyond 0 */
+       0x0,
+       0x1E030,
+       0x1E090
+};
+
 static const UV UNI_CYRILLICSUP_invlist[] = {  /* for all charsets */
        3,      /* Number of elements */
        148565664, /* Version and data structure type */
@@ -234392,7 +236292,7 @@ static const UV UNI_CYRILLICSUP_invlist[] = {  /* for all charsets */
 };
 
 static const UV UNI_CYRL_invlist[] = {  /* for all charsets */
-       19,     /* Number of elements */
+       23,     /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -234414,7 +236314,11 @@ static const UV UNI_CYRL_invlist[] = {  /* for all charsets */
        0xA640,
        0xA6A0,
        0xFE2E,
-       0xFE30
+       0xFE30,
+       0x1E030,
+       0x1E06E,
+       0x1E08F,
+       0x1E090
 };
 
 #  if 'A' == 65 /* ASCII/Latin1 */
@@ -234622,7 +236526,7 @@ static const UV UNI_DEP_invlist[] = {  /* for all charsets */
 };
 
 static const UV UNI_DEVA_invlist[] = {  /* for all charsets */
-       15,     /* Number of elements */
+       17,     /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -234640,7 +236544,9 @@ static const UV UNI_DEVA_invlist[] = {  /* for all charsets */
        0xA830,
        0xA83A,
        0xA8E0,
-       0xA900
+       0xA900,
+       0x11B00,
+       0x11B0A
 };
 
 static const UV UNI_DEVANAGARIEXT_invlist[] = {  /* for all charsets */
@@ -234653,6 +236559,16 @@ static const UV UNI_DEVANAGARIEXT_invlist[] = {  /* for all charsets */
        0xA900
 };
 
+static const UV UNI_DEVANAGARIEXTA_invlist[] = {  /* for all charsets */
+       3,      /* Number of elements */
+       148565664, /* Version and data structure type */
+       1,      /* 0 if the list starts at 0;
+                  1 if it starts at the element beyond 0 */
+       0x0,
+       0x11B00,
+       0x11B60
+};
+
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_DI_invlist[] = {  /* for ASCII/Latin1 */
@@ -234800,7 +236716,7 @@ static const UV UNI_DI_invlist[] = {  /* for EBCDIC 037 */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_DIA_invlist[] = {  /* for ASCII/Latin1 */
-       385,    /* Number of elements */
+       391,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -235083,6 +236999,8 @@ static const UV UNI_DIA_invlist[] = {  /* for ASCII/Latin1 */
        0x10AE7,
        0x10D22,
        0x10D28,
+       0x10EFD,
+       0x10F00,
        0x10F46,
        0x10F51,
        0x10F82,
@@ -235149,6 +237067,8 @@ static const UV UNI_DIA_invlist[] = {  /* for ASCII/Latin1 */
        0x11D46,
        0x11D97,
        0x11D98,
+       0x13447,
+       0x13456,
        0x16AF0,
        0x16AF5,
        0x16B30,
@@ -235177,6 +237097,8 @@ static const UV UNI_DIA_invlist[] = {  /* for ASCII/Latin1 */
        0x1D18C,
        0x1D1AA,
        0x1D1AE,
+       0x1E030,
+       0x1E06E,
        0x1E130,
        0x1E137,
        0x1E2AE,
@@ -235199,7 +237121,7 @@ static const UV UNI_DIA_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_DIA_invlist[] = {  /* for EBCDIC 1047 */
-       385,    /* Number of elements */
+       391,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -235482,6 +237404,8 @@ static const UV UNI_DIA_invlist[] = {  /* for EBCDIC 1047 */
        0x10AE7,
        0x10D22,
        0x10D28,
+       0x10EFD,
+       0x10F00,
        0x10F46,
        0x10F51,
        0x10F82,
@@ -235548,6 +237472,8 @@ static const UV UNI_DIA_invlist[] = {  /* for EBCDIC 1047 */
        0x11D46,
        0x11D97,
        0x11D98,
+       0x13447,
+       0x13456,
        0x16AF0,
        0x16AF5,
        0x16B30,
@@ -235576,6 +237502,8 @@ static const UV UNI_DIA_invlist[] = {  /* for EBCDIC 1047 */
        0x1D18C,
        0x1D1AA,
        0x1D1AE,
+       0x1E030,
+       0x1E06E,
        0x1E130,
        0x1E137,
        0x1E2AE,
@@ -235598,7 +237526,7 @@ static const UV UNI_DIA_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_DIA_invlist[] = {  /* for EBCDIC 037 */
-       383,    /* Number of elements */
+       389,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -235879,6 +237807,8 @@ static const UV UNI_DIA_invlist[] = {  /* for EBCDIC 037 */
        0x10AE7,
        0x10D22,
        0x10D28,
+       0x10EFD,
+       0x10F00,
        0x10F46,
        0x10F51,
        0x10F82,
@@ -235945,6 +237875,8 @@ static const UV UNI_DIA_invlist[] = {  /* for EBCDIC 037 */
        0x11D46,
        0x11D97,
        0x11D98,
+       0x13447,
+       0x13456,
        0x16AF0,
        0x16AF5,
        0x16B30,
@@ -235973,6 +237905,8 @@ static const UV UNI_DIA_invlist[] = {  /* for EBCDIC 037 */
        0x1D18C,
        0x1D1AA,
        0x1D1AE,
+       0x1E030,
+       0x1E06E,
        0x1E130,
        0x1E137,
        0x1E2AE,
@@ -239058,7 +240992,7 @@ static const UV UNI_DT__NB_invlist[] = {  /* for EBCDIC 037 */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_DT__NONCANON_invlist[] = {  /* for ASCII/Latin1 */
-       383,    /* Number of elements */
+       385,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -239359,6 +241293,8 @@ static const UV UNI_DT__NONCANON_invlist[] = {  /* for ASCII/Latin1 */
        0x1D7CC,
        0x1D7CE,
        0x1D800,
+       0x1E030,
+       0x1E06E,
        0x1EE00,
        0x1EE04,
        0x1EE05,
@@ -239455,7 +241391,7 @@ static const UV UNI_DT__NONCANON_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_DT__NONCANON_invlist[] = {  /* for EBCDIC 1047 */
-       389,    /* Number of elements */
+       391,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -239762,6 +241698,8 @@ static const UV UNI_DT__NONCANON_invlist[] = {  /* for EBCDIC 1047 */
        0x1D7CC,
        0x1D7CE,
        0x1D800,
+       0x1E030,
+       0x1E06E,
        0x1EE00,
        0x1EE04,
        0x1EE05,
@@ -239858,7 +241796,7 @@ static const UV UNI_DT__NONCANON_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_DT__NONCANON_invlist[] = {  /* for EBCDIC 037 */
-       387,    /* Number of elements */
+       389,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -240163,6 +242101,8 @@ static const UV UNI_DT__NONCANON_invlist[] = {  /* for EBCDIC 037 */
        0x1D7CC,
        0x1D7CE,
        0x1D800,
+       0x1E030,
+       0x1E06E,
        0x1EE00,
        0x1EE04,
        0x1EE05,
@@ -240256,7 +242196,7 @@ static const UV UNI_DT__NONCANON_invlist[] = {  /* for EBCDIC 037 */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_DT__NONE_invlist[] = {  /* for ASCII/Latin1 */
-       793,    /* Number of elements */
+       795,    /* Number of elements */
        148565664, /* Version and data structure type */
        0,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -240965,6 +242905,8 @@ static const UV UNI_DT__NONE_invlist[] = {  /* for ASCII/Latin1 */
        0x1D7CC,
        0x1D7CE,
        0x1D800,
+       0x1E030,
+       0x1E06E,
        0x1EE00,
        0x1EE04,
        0x1EE05,
@@ -241063,7 +243005,7 @@ static const UV UNI_DT__NONE_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_DT__NONE_invlist[] = {  /* for EBCDIC 1047 */
-       791,    /* Number of elements */
+       793,    /* Number of elements */
        148565664, /* Version and data structure type */
        0,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -241770,6 +243712,8 @@ static const UV UNI_DT__NONE_invlist[] = {  /* for EBCDIC 1047 */
        0x1D7CC,
        0x1D7CE,
        0x1D800,
+       0x1E030,
+       0x1E06E,
        0x1EE00,
        0x1EE04,
        0x1EE05,
@@ -241868,7 +243812,7 @@ static const UV UNI_DT__NONE_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_DT__NONE_invlist[] = {  /* for EBCDIC 037 */
-       793,    /* Number of elements */
+       795,    /* Number of elements */
        148565664, /* Version and data structure type */
        0,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -242577,6 +244521,8 @@ static const UV UNI_DT__NONE_invlist[] = {  /* for EBCDIC 037 */
        0x1D7CC,
        0x1D7CE,
        0x1D800,
+       0x1E030,
+       0x1E06E,
        0x1EE00,
        0x1EE04,
        0x1EE05,
@@ -242710,7 +244656,7 @@ static const UV UNI_DT__SQR_invlist[] = {  /* for all charsets */
 };
 
 static const UV UNI_DT__SUB_invlist[] = {  /* for all charsets */
-       9,      /* Number of elements */
+       11,     /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -242722,13 +244668,15 @@ static const UV UNI_DT__SUB_invlist[] = {  /* for all charsets */
        0x2090,
        0x209D,
        0x2C7C,
-       0x2C7D
+       0x2C7D,
+       0x1E051,
+       0x1E06B
 };
 
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_DT__SUP_invlist[] = {  /* for ASCII/Latin1 */
-       59,     /* Number of elements */
+       63,     /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -242789,6 +244737,10 @@ static const UV UNI_DT__SUP_invlist[] = {  /* for ASCII/Latin1 */
        0x107B1,
        0x107B2,
        0x107BB,
+       0x1E030,
+       0x1E051,
+       0x1E06B,
+       0x1E06E,
        0x1F16A,
        0x1F16D
 };
@@ -242801,7 +244753,7 @@ static const UV UNI_DT__SUP_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_DT__SUP_invlist[] = {  /* for EBCDIC 1047 */
-       61,     /* Number of elements */
+       65,     /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -242864,6 +244816,10 @@ static const UV UNI_DT__SUP_invlist[] = {  /* for EBCDIC 1047 */
        0x107B1,
        0x107B2,
        0x107BB,
+       0x1E030,
+       0x1E051,
+       0x1E06B,
+       0x1E06E,
        0x1F16A,
        0x1F16D
 };
@@ -242876,7 +244832,7 @@ static const UV UNI_DT__SUP_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_DT__SUP_invlist[] = {  /* for EBCDIC 037 */
-       61,     /* Number of elements */
+       65,     /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -242939,6 +244895,10 @@ static const UV UNI_DT__SUP_invlist[] = {  /* for EBCDIC 037 */
        0x107B1,
        0x107B2,
        0x107BB,
+       0x1E030,
+       0x1E051,
+       0x1E06B,
+       0x1E06E,
        0x1F16A,
        0x1F16D
 };
@@ -244593,8 +246553,12 @@ static const UV UNI_EA__N_invlist[] = {  /* for ASCII/Latin1 */
        0x1AFFF,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -244665,7 +246629,7 @@ static const UV UNI_EA__N_invlist[] = {  /* for ASCII/Latin1 */
        0x1F6D3,
        0x1F6D5,
        0x1F6D8,
-       0x1F6DD,
+       0x1F6DC,
        0x1F6E0,
        0x1F6EB,
        0x1F6ED,
@@ -244682,23 +246646,19 @@ static const UV UNI_EA__N_invlist[] = {  /* for ASCII/Latin1 */
        0x1F947,
        0x1FA00,
        0x1FA70,
-       0x1FA75,
-       0x1FA78,
        0x1FA7D,
        0x1FA80,
-       0x1FA87,
+       0x1FA89,
        0x1FA90,
-       0x1FAAD,
-       0x1FAB0,
-       0x1FABB,
-       0x1FAC0,
+       0x1FABE,
+       0x1FABF,
        0x1FAC6,
-       0x1FAD0,
-       0x1FADA,
+       0x1FACE,
+       0x1FADC,
        0x1FAE0,
-       0x1FAE8,
+       0x1FAE9,
        0x1FAF0,
-       0x1FAF7,
+       0x1FAF9,
        0x20000,
        0x2FFFE,
        0x30000,
@@ -245168,8 +247128,12 @@ static const UV UNI_EA__N_invlist[] = {  /* for EBCDIC 1047 */
        0x1AFFF,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -245240,7 +247204,7 @@ static const UV UNI_EA__N_invlist[] = {  /* for EBCDIC 1047 */
        0x1F6D3,
        0x1F6D5,
        0x1F6D8,
-       0x1F6DD,
+       0x1F6DC,
        0x1F6E0,
        0x1F6EB,
        0x1F6ED,
@@ -245257,23 +247221,19 @@ static const UV UNI_EA__N_invlist[] = {  /* for EBCDIC 1047 */
        0x1F947,
        0x1FA00,
        0x1FA70,
-       0x1FA75,
-       0x1FA78,
        0x1FA7D,
        0x1FA80,
-       0x1FA87,
+       0x1FA89,
        0x1FA90,
-       0x1FAAD,
-       0x1FAB0,
-       0x1FABB,
-       0x1FAC0,
+       0x1FABE,
+       0x1FABF,
        0x1FAC6,
-       0x1FAD0,
-       0x1FADA,
+       0x1FACE,
+       0x1FADC,
        0x1FAE0,
-       0x1FAE8,
+       0x1FAE9,
        0x1FAF0,
-       0x1FAF7,
+       0x1FAF9,
        0x20000,
        0x2FFFE,
        0x30000,
@@ -245743,8 +247703,12 @@ static const UV UNI_EA__N_invlist[] = {  /* for EBCDIC 037 */
        0x1AFFF,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -245815,7 +247779,7 @@ static const UV UNI_EA__N_invlist[] = {  /* for EBCDIC 037 */
        0x1F6D3,
        0x1F6D5,
        0x1F6D8,
-       0x1F6DD,
+       0x1F6DC,
        0x1F6E0,
        0x1F6EB,
        0x1F6ED,
@@ -245832,23 +247796,19 @@ static const UV UNI_EA__N_invlist[] = {  /* for EBCDIC 037 */
        0x1F947,
        0x1FA00,
        0x1FA70,
-       0x1FA75,
-       0x1FA78,
        0x1FA7D,
        0x1FA80,
-       0x1FA87,
+       0x1FA89,
        0x1FA90,
-       0x1FAAD,
-       0x1FAB0,
-       0x1FABB,
-       0x1FAC0,
+       0x1FABE,
+       0x1FABF,
        0x1FAC6,
-       0x1FAD0,
-       0x1FADA,
+       0x1FACE,
+       0x1FADC,
        0x1FAE0,
-       0x1FAE8,
+       0x1FAE9,
        0x1FAF0,
-       0x1FAF7,
+       0x1FAF9,
        0x20000,
        0x2FFFE,
        0x30000,
@@ -246127,8 +248087,12 @@ static const UV UNI_EA__W_invlist[] = {  /* for all charsets */
        0x1AFFF,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -246195,7 +248159,7 @@ static const UV UNI_EA__W_invlist[] = {  /* for all charsets */
        0x1F6D3,
        0x1F6D5,
        0x1F6D8,
-       0x1F6DD,
+       0x1F6DC,
        0x1F6E0,
        0x1F6EB,
        0x1F6ED,
@@ -246212,23 +248176,19 @@ static const UV UNI_EA__W_invlist[] = {  /* for all charsets */
        0x1F947,
        0x1FA00,
        0x1FA70,
-       0x1FA75,
-       0x1FA78,
        0x1FA7D,
        0x1FA80,
-       0x1FA87,
+       0x1FA89,
        0x1FA90,
-       0x1FAAD,
-       0x1FAB0,
-       0x1FABB,
-       0x1FAC0,
+       0x1FABE,
+       0x1FABF,
        0x1FAC6,
-       0x1FAD0,
-       0x1FADA,
+       0x1FACE,
+       0x1FADC,
        0x1FAE0,
-       0x1FAE8,
+       0x1FAE9,
        0x1FAF0,
-       0x1FAF7,
+       0x1FAF9,
        0x20000,
        0x2FFFE,
        0x30000,
@@ -246330,7 +248290,7 @@ static const UV UNI_EBASE_invlist[] = {  /* for all charsets */
        0x1FAC3,
        0x1FAC6,
        0x1FAF0,
-       0x1FAF7
+       0x1FAF9
 };
 
 #  if 'A' == 65 /* ASCII/Latin1 */
@@ -246436,15 +248396,13 @@ static const UV UNI_ECOMP_invlist[] = {  /* for EBCDIC 037 */
 #  endif       /* EBCDIC 037 */
 
 static const UV UNI_EGYP_invlist[] = {  /* for all charsets */
-       5,      /* Number of elements */
+       3,      /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
        0x0,
        0x13000,
-       0x1342F,
-       0x13430,
-       0x13439
+       0x13456
 };
 
 static const UV UNI_EGYPTIANHIEROGLYPHFORMATCONTROLS_invlist[] = {  /* for all charsets */
@@ -246454,7 +248412,7 @@ static const UV UNI_EGYPTIANHIEROGLYPHFORMATCONTROLS_invlist[] = {  /* for all c
                   1 if it starts at the element beyond 0 */
        0x0,
        0x13430,
-       0x13440
+       0x13460
 };
 
 static const UV UNI_ELBA_invlist[] = {  /* for all charsets */
@@ -246490,7 +248448,7 @@ static const UV UNI_EMOD_invlist[] = {  /* for all charsets */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_EMOJI_invlist[] = {  /* for ASCII/Latin1 */
-       307,    /* Number of elements */
+       303,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -246763,7 +248721,7 @@ static const UV UNI_EMOJI_invlist[] = {  /* for ASCII/Latin1 */
        0x1F6D3,
        0x1F6D5,
        0x1F6D8,
-       0x1F6DD,
+       0x1F6DC,
        0x1F6E6,
        0x1F6E9,
        0x1F6EA,
@@ -246784,23 +248742,19 @@ static const UV UNI_EMOJI_invlist[] = {  /* for ASCII/Latin1 */
        0x1F947,
        0x1FA00,
        0x1FA70,
-       0x1FA75,
-       0x1FA78,
        0x1FA7D,
        0x1FA80,
-       0x1FA87,
+       0x1FA89,
        0x1FA90,
-       0x1FAAD,
-       0x1FAB0,
-       0x1FABB,
-       0x1FAC0,
+       0x1FABE,
+       0x1FABF,
        0x1FAC6,
-       0x1FAD0,
-       0x1FADA,
+       0x1FACE,
+       0x1FADC,
        0x1FAE0,
-       0x1FAE8,
+       0x1FAE9,
        0x1FAF0,
-       0x1FAF7
+       0x1FAF9
 };
 
 #  endif       /* ASCII/Latin1 */
@@ -246811,7 +248765,7 @@ static const UV UNI_EMOJI_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_EMOJI_invlist[] = {  /* for EBCDIC 1047 */
-       307,    /* Number of elements */
+       303,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -247084,7 +249038,7 @@ static const UV UNI_EMOJI_invlist[] = {  /* for EBCDIC 1047 */
        0x1F6D3,
        0x1F6D5,
        0x1F6D8,
-       0x1F6DD,
+       0x1F6DC,
        0x1F6E6,
        0x1F6E9,
        0x1F6EA,
@@ -247105,23 +249059,19 @@ static const UV UNI_EMOJI_invlist[] = {  /* for EBCDIC 1047 */
        0x1F947,
        0x1FA00,
        0x1FA70,
-       0x1FA75,
-       0x1FA78,
        0x1FA7D,
        0x1FA80,
-       0x1FA87,
+       0x1FA89,
        0x1FA90,
-       0x1FAAD,
-       0x1FAB0,
-       0x1FABB,
-       0x1FAC0,
+       0x1FABE,
+       0x1FABF,
        0x1FAC6,
-       0x1FAD0,
-       0x1FADA,
+       0x1FACE,
+       0x1FADC,
        0x1FAE0,
-       0x1FAE8,
+       0x1FAE9,
        0x1FAF0,
-       0x1FAF7
+       0x1FAF9
 };
 
 #  endif       /* EBCDIC 1047 */
@@ -247132,7 +249082,7 @@ static const UV UNI_EMOJI_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_EMOJI_invlist[] = {  /* for EBCDIC 037 */
-       307,    /* Number of elements */
+       303,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -247405,7 +249355,7 @@ static const UV UNI_EMOJI_invlist[] = {  /* for EBCDIC 037 */
        0x1F6D3,
        0x1F6D5,
        0x1F6D8,
-       0x1F6DD,
+       0x1F6DC,
        0x1F6E6,
        0x1F6E9,
        0x1F6EA,
@@ -247426,23 +249376,19 @@ static const UV UNI_EMOJI_invlist[] = {  /* for EBCDIC 037 */
        0x1F947,
        0x1FA00,
        0x1FA70,
-       0x1FA75,
-       0x1FA78,
        0x1FA7D,
        0x1FA80,
-       0x1FA87,
+       0x1FA89,
        0x1FA90,
-       0x1FAAD,
-       0x1FAB0,
-       0x1FABB,
-       0x1FAC0,
+       0x1FABE,
+       0x1FABF,
        0x1FAC6,
-       0x1FAD0,
-       0x1FADA,
+       0x1FACE,
+       0x1FADC,
        0x1FAE0,
-       0x1FAE8,
+       0x1FAE9,
        0x1FAF0,
-       0x1FAF7
+       0x1FAF9
 };
 
 #  endif       /* EBCDIC 037 */
@@ -247498,7 +249444,7 @@ static const UV UNI_ENCLOSEDIDEOGRAPHICSUP_invlist[] = {  /* for all charsets */
 };
 
 static const UV UNI_EPRES_invlist[] = {  /* for all charsets */
-       167,    /* Number of elements */
+       163,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -247635,7 +249581,7 @@ static const UV UNI_EPRES_invlist[] = {  /* for all charsets */
        0x1F6D3,
        0x1F6D5,
        0x1F6D8,
-       0x1F6DD,
+       0x1F6DC,
        0x1F6E0,
        0x1F6EB,
        0x1F6ED,
@@ -247652,23 +249598,19 @@ static const UV UNI_EPRES_invlist[] = {  /* for all charsets */
        0x1F947,
        0x1FA00,
        0x1FA70,
-       0x1FA75,
-       0x1FA78,
        0x1FA7D,
        0x1FA80,
-       0x1FA87,
+       0x1FA89,
        0x1FA90,
-       0x1FAAD,
-       0x1FAB0,
-       0x1FABB,
-       0x1FAC0,
+       0x1FABE,
+       0x1FABF,
        0x1FAC6,
-       0x1FAD0,
-       0x1FADA,
+       0x1FACE,
+       0x1FADC,
        0x1FAE0,
-       0x1FAE8,
+       0x1FAE9,
        0x1FAF0,
-       0x1FAF7
+       0x1FAF9
 };
 
 static const UV UNI_ETHI_invlist[] = {  /* for all charsets */
@@ -248575,7 +250517,7 @@ static const UV UNI_GCB__CN_invlist[] = {  /* for ASCII/Latin1 */
        0xFFF0,
        0xFFFC,
        0x13430,
-       0x13439,
+       0x13440,
        0x1BCA0,
        0x1BCA4,
        0x1D173,
@@ -248627,7 +250569,7 @@ static const UV UNI_GCB__CN_invlist[] = {  /* for EBCDIC 1047 */
        0xFFF0,
        0xFFFC,
        0x13430,
-       0x13439,
+       0x13440,
        0x1BCA0,
        0x1BCA4,
        0x1D173,
@@ -248679,7 +250621,7 @@ static const UV UNI_GCB__CN_invlist[] = {  /* for EBCDIC 037 */
        0xFFF0,
        0xFFFC,
        0x13430,
-       0x13439,
+       0x13440,
        0x1BCA0,
        0x1BCA4,
        0x1D173,
@@ -248695,7 +250637,7 @@ static const UV UNI_GCB__CN_invlist[] = {  /* for EBCDIC 037 */
 #  endif       /* EBCDIC 037 */
 
 static const UV UNI_GCB__EX_invlist[] = {  /* for all charsets */
-       709,    /* Number of elements */
+       729,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -248905,7 +250847,7 @@ static const UV UNI_GCB__EX_invlist[] = {  /* for all charsets */
        0xEB4,
        0xEBD,
        0xEC8,
-       0xECE,
+       0xECF,
        0xF18,
        0xF1A,
        0xF35,
@@ -249162,6 +251104,8 @@ static const UV UNI_GCB__EX_invlist[] = {  /* for all charsets */
        0x10D28,
        0x10EAB,
        0x10EAD,
+       0x10EFD,
+       0x10F00,
        0x10F46,
        0x10F51,
        0x10F82,
@@ -249206,6 +251150,8 @@ static const UV UNI_GCB__EX_invlist[] = {  /* for all charsets */
        0x11238,
        0x1123E,
        0x1123F,
+       0x11241,
+       0x11242,
        0x112DF,
        0x112E0,
        0x112E3,
@@ -249340,6 +251286,18 @@ static const UV UNI_GCB__EX_invlist[] = {  /* for all charsets */
        0x11D98,
        0x11EF3,
        0x11EF5,
+       0x11F00,
+       0x11F02,
+       0x11F36,
+       0x11F3B,
+       0x11F40,
+       0x11F41,
+       0x11F42,
+       0x11F43,
+       0x13440,
+       0x13441,
+       0x13447,
+       0x13456,
        0x16AF0,
        0x16AF5,
        0x16B30,
@@ -249392,12 +251350,16 @@ static const UV UNI_GCB__EX_invlist[] = {  /* for all charsets */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E08F,
+       0x1E090,
        0x1E130,
        0x1E137,
        0x1E2AE,
        0x1E2AF,
        0x1E2EC,
        0x1E2F0,
+       0x1E4EC,
+       0x1E4F0,
        0x1E8D0,
        0x1E8D7,
        0x1E944,
@@ -249423,7 +251385,7 @@ static const UV UNI_GCB__L_invlist[] = {  /* for all charsets */
 };
 
 static const UV UNI_GCB__PP_invlist[] = {  /* for all charsets */
-       29,     /* Number of elements */
+       31,     /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -249455,11 +251417,13 @@ static const UV UNI_GCB__PP_invlist[] = {  /* for all charsets */
        0x11A84,
        0x11A8A,
        0x11D46,
-       0x11D47
+       0x11D47,
+       0x11F02,
+       0x11F03
 };
 
 static const UV UNI_GCB__SM_invlist[] = {  /* for all charsets */
-       321,    /* Number of elements */
+       331,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -249526,6 +251490,8 @@ static const UV UNI_GCB__SM_invlist[] = {  /* for all charsets */
        0xCC9,
        0xCCA,
        0xCCC,
+       0xCF3,
+       0xCF4,
        0xD02,
        0xD04,
        0xD3F,
@@ -249776,6 +251742,14 @@ static const UV UNI_GCB__SM_invlist[] = {  /* for all charsets */
        0x11D97,
        0x11EF5,
        0x11EF7,
+       0x11F03,
+       0x11F04,
+       0x11F34,
+       0x11F36,
+       0x11F3E,
+       0x11F40,
+       0x11F41,
+       0x11F42,
        0x16F51,
        0x16F88,
        0x16FF0,
@@ -249813,7 +251787,7 @@ static const UV UNI_GCB__V_invlist[] = {  /* for all charsets */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_GCB__XX_invlist[] = {  /* for ASCII/Latin1 */
-       640,    /* Number of elements */
+       658,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -249989,6 +251963,8 @@ static const UV UNI_GCB__XX_invlist[] = {  /* for ASCII/Latin1 */
        0xCD7,
        0xCE2,
        0xCE4,
+       0xCF3,
+       0xCF4,
        0xD00,
        0xD04,
        0xD3B,
@@ -250026,7 +252002,7 @@ static const UV UNI_GCB__XX_invlist[] = {  /* for ASCII/Latin1 */
        0xEB3,
        0xEBD,
        0xEC8,
-       0xECE,
+       0xECF,
        0xF18,
        0xF1A,
        0xF35,
@@ -250253,6 +252229,8 @@ static const UV UNI_GCB__XX_invlist[] = {  /* for ASCII/Latin1 */
        0x10D28,
        0x10EAB,
        0x10EAD,
+       0x10EFD,
+       0x10F00,
        0x10F46,
        0x10F51,
        0x10F82,
@@ -250297,6 +252275,8 @@ static const UV UNI_GCB__XX_invlist[] = {  /* for ASCII/Latin1 */
        0x11238,
        0x1123E,
        0x1123F,
+       0x11241,
+       0x11242,
        0x112DF,
        0x112EB,
        0x11300,
@@ -250385,8 +252365,16 @@ static const UV UNI_GCB__XX_invlist[] = {  /* for ASCII/Latin1 */
        0x11D98,
        0x11EF3,
        0x11EF7,
+       0x11F00,
+       0x11F04,
+       0x11F34,
+       0x11F3B,
+       0x11F3E,
+       0x11F43,
        0x13430,
-       0x13439,
+       0x13441,
+       0x13447,
+       0x13456,
        0x16AF0,
        0x16AF5,
        0x16B30,
@@ -250441,12 +252429,16 @@ static const UV UNI_GCB__XX_invlist[] = {  /* for ASCII/Latin1 */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E08F,
+       0x1E090,
        0x1E130,
        0x1E137,
        0x1E2AE,
        0x1E2AF,
        0x1E2EC,
        0x1E2F0,
+       0x1E4EC,
+       0x1E4F0,
        0x1E8D0,
        0x1E8D7,
        0x1E944,
@@ -250467,7 +252459,7 @@ static const UV UNI_GCB__XX_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_GCB__XX_invlist[] = {  /* for EBCDIC 1047 */
-       640,    /* Number of elements */
+       658,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -250643,6 +252635,8 @@ static const UV UNI_GCB__XX_invlist[] = {  /* for EBCDIC 1047 */
        0xCD7,
        0xCE2,
        0xCE4,
+       0xCF3,
+       0xCF4,
        0xD00,
        0xD04,
        0xD3B,
@@ -250680,7 +252674,7 @@ static const UV UNI_GCB__XX_invlist[] = {  /* for EBCDIC 1047 */
        0xEB3,
        0xEBD,
        0xEC8,
-       0xECE,
+       0xECF,
        0xF18,
        0xF1A,
        0xF35,
@@ -250907,6 +252901,8 @@ static const UV UNI_GCB__XX_invlist[] = {  /* for EBCDIC 1047 */
        0x10D28,
        0x10EAB,
        0x10EAD,
+       0x10EFD,
+       0x10F00,
        0x10F46,
        0x10F51,
        0x10F82,
@@ -250951,6 +252947,8 @@ static const UV UNI_GCB__XX_invlist[] = {  /* for EBCDIC 1047 */
        0x11238,
        0x1123E,
        0x1123F,
+       0x11241,
+       0x11242,
        0x112DF,
        0x112EB,
        0x11300,
@@ -251039,8 +253037,16 @@ static const UV UNI_GCB__XX_invlist[] = {  /* for EBCDIC 1047 */
        0x11D98,
        0x11EF3,
        0x11EF7,
+       0x11F00,
+       0x11F04,
+       0x11F34,
+       0x11F3B,
+       0x11F3E,
+       0x11F43,
        0x13430,
-       0x13439,
+       0x13441,
+       0x13447,
+       0x13456,
        0x16AF0,
        0x16AF5,
        0x16B30,
@@ -251095,12 +253101,16 @@ static const UV UNI_GCB__XX_invlist[] = {  /* for EBCDIC 1047 */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E08F,
+       0x1E090,
        0x1E130,
        0x1E137,
        0x1E2AE,
        0x1E2AF,
        0x1E2EC,
        0x1E2F0,
+       0x1E4EC,
+       0x1E4F0,
        0x1E8D0,
        0x1E8D7,
        0x1E944,
@@ -251121,7 +253131,7 @@ static const UV UNI_GCB__XX_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_GCB__XX_invlist[] = {  /* for EBCDIC 037 */
-       640,    /* Number of elements */
+       658,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -251297,6 +253307,8 @@ static const UV UNI_GCB__XX_invlist[] = {  /* for EBCDIC 037 */
        0xCD7,
        0xCE2,
        0xCE4,
+       0xCF3,
+       0xCF4,
        0xD00,
        0xD04,
        0xD3B,
@@ -251334,7 +253346,7 @@ static const UV UNI_GCB__XX_invlist[] = {  /* for EBCDIC 037 */
        0xEB3,
        0xEBD,
        0xEC8,
-       0xECE,
+       0xECF,
        0xF18,
        0xF1A,
        0xF35,
@@ -251561,6 +253573,8 @@ static const UV UNI_GCB__XX_invlist[] = {  /* for EBCDIC 037 */
        0x10D28,
        0x10EAB,
        0x10EAD,
+       0x10EFD,
+       0x10F00,
        0x10F46,
        0x10F51,
        0x10F82,
@@ -251605,6 +253619,8 @@ static const UV UNI_GCB__XX_invlist[] = {  /* for EBCDIC 037 */
        0x11238,
        0x1123E,
        0x1123F,
+       0x11241,
+       0x11242,
        0x112DF,
        0x112EB,
        0x11300,
@@ -251693,8 +253709,16 @@ static const UV UNI_GCB__XX_invlist[] = {  /* for EBCDIC 037 */
        0x11D98,
        0x11EF3,
        0x11EF7,
+       0x11F00,
+       0x11F04,
+       0x11F34,
+       0x11F3B,
+       0x11F3E,
+       0x11F43,
        0x13430,
-       0x13439,
+       0x13441,
+       0x13447,
+       0x13456,
        0x16AF0,
        0x16AF5,
        0x16B30,
@@ -251749,12 +253773,16 @@ static const UV UNI_GCB__XX_invlist[] = {  /* for EBCDIC 037 */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E08F,
+       0x1E090,
        0x1E130,
        0x1E137,
        0x1E2AE,
        0x1E2AF,
        0x1E2EC,
        0x1E2F0,
+       0x1E4EC,
+       0x1E4F0,
        0x1E8D0,
        0x1E8D7,
        0x1E944,
@@ -251990,7 +254018,7 @@ static const UV UNI_GRAN_invlist[] = {  /* for all charsets */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_GRBASE_invlist[] = {  /* for ASCII/Latin1 */
-       1723,   /* Number of elements */
+       1751,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -252294,7 +254322,7 @@ static const UV UNI_GRBASE_invlist[] = {  /* for ASCII/Latin1 */
        0xCE6,
        0xCF0,
        0xCF1,
-       0xCF3,
+       0xCF4,
        0xD02,
        0xD0D,
        0xD0E,
@@ -253131,6 +255159,8 @@ static const UV UNI_GRBASE_invlist[] = {  /* for ASCII/Latin1 */
        0x11236,
        0x11238,
        0x1123E,
+       0x1123F,
+       0x11241,
        0x11280,
        0x11287,
        0x11288,
@@ -253303,6 +255333,8 @@ static const UV UNI_GRBASE_invlist[] = {  /* for ASCII/Latin1 */
        0x11AA3,
        0x11AB0,
        0x11AF9,
+       0x11B00,
+       0x11B0A,
        0x11C00,
        0x11C09,
        0x11C0A,
@@ -253349,6 +255381,16 @@ static const UV UNI_GRBASE_invlist[] = {  /* for ASCII/Latin1 */
        0x11EF3,
        0x11EF5,
        0x11EF9,
+       0x11F02,
+       0x11F11,
+       0x11F12,
+       0x11F36,
+       0x11F3E,
+       0x11F40,
+       0x11F41,
+       0x11F42,
+       0x11F43,
+       0x11F5A,
        0x11FB0,
        0x11FB1,
        0x11FC0,
@@ -253364,7 +255406,9 @@ static const UV UNI_GRBASE_invlist[] = {  /* for ASCII/Latin1 */
        0x12F90,
        0x12FF3,
        0x13000,
-       0x1342F,
+       0x13430,
+       0x13441,
+       0x13447,
        0x14400,
        0x14647,
        0x16800,
@@ -253419,8 +255463,12 @@ static const UV UNI_GRBASE_invlist[] = {  /* for ASCII/Latin1 */
        0x1AFFF,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -253459,6 +255507,8 @@ static const UV UNI_GRBASE_invlist[] = {  /* for ASCII/Latin1 */
        0x1D242,
        0x1D245,
        0x1D246,
+       0x1D2C0,
+       0x1D2D4,
        0x1D2E0,
        0x1D2F4,
        0x1D300,
@@ -253517,6 +255567,10 @@ static const UV UNI_GRBASE_invlist[] = {  /* for ASCII/Latin1 */
        0x1DA8C,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
+       0x1E030,
+       0x1E06E,
        0x1E100,
        0x1E12D,
        0x1E137,
@@ -253533,6 +255587,10 @@ static const UV UNI_GRBASE_invlist[] = {  /* for ASCII/Latin1 */
        0x1E2FA,
        0x1E2FF,
        0x1E300,
+       0x1E4D0,
+       0x1E4EC,
+       0x1E4F0,
+       0x1E4FA,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -253651,14 +255709,14 @@ static const UV UNI_GRBASE_invlist[] = {  /* for ASCII/Latin1 */
        0x1F266,
        0x1F300,
        0x1F6D8,
-       0x1F6DD,
+       0x1F6DC,
        0x1F6ED,
        0x1F6F0,
        0x1F6FD,
        0x1F700,
-       0x1F774,
-       0x1F780,
-       0x1F7D9,
+       0x1F777,
+       0x1F77B,
+       0x1F7DA,
        0x1F7E0,
        0x1F7EC,
        0x1F7F0,
@@ -253680,23 +255738,19 @@ static const UV UNI_GRBASE_invlist[] = {  /* for ASCII/Latin1 */
        0x1FA60,
        0x1FA6E,
        0x1FA70,
-       0x1FA75,
-       0x1FA78,
        0x1FA7D,
        0x1FA80,
-       0x1FA87,
+       0x1FA89,
        0x1FA90,
-       0x1FAAD,
-       0x1FAB0,
-       0x1FABB,
-       0x1FAC0,
+       0x1FABE,
+       0x1FABF,
        0x1FAC6,
-       0x1FAD0,
-       0x1FADA,
+       0x1FACE,
+       0x1FADC,
        0x1FAE0,
-       0x1FAE8,
+       0x1FAE9,
        0x1FAF0,
-       0x1FAF7,
+       0x1FAF9,
        0x1FB00,
        0x1FB93,
        0x1FB94,
@@ -253706,7 +255760,7 @@ static const UV UNI_GRBASE_invlist[] = {  /* for ASCII/Latin1 */
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -253716,7 +255770,9 @@ static const UV UNI_GRBASE_invlist[] = {  /* for ASCII/Latin1 */
        0x2F800,
        0x2FA1E,
        0x30000,
-       0x3134B
+       0x3134B,
+       0x31350,
+       0x323B0
 };
 
 #  endif       /* ASCII/Latin1 */
@@ -253727,7 +255783,7 @@ static const UV UNI_GRBASE_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_GRBASE_invlist[] = {  /* for EBCDIC 1047 */
-       1723,   /* Number of elements */
+       1751,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -254031,7 +256087,7 @@ static const UV UNI_GRBASE_invlist[] = {  /* for EBCDIC 1047 */
        0xCE6,
        0xCF0,
        0xCF1,
-       0xCF3,
+       0xCF4,
        0xD02,
        0xD0D,
        0xD0E,
@@ -254868,6 +256924,8 @@ static const UV UNI_GRBASE_invlist[] = {  /* for EBCDIC 1047 */
        0x11236,
        0x11238,
        0x1123E,
+       0x1123F,
+       0x11241,
        0x11280,
        0x11287,
        0x11288,
@@ -255040,6 +257098,8 @@ static const UV UNI_GRBASE_invlist[] = {  /* for EBCDIC 1047 */
        0x11AA3,
        0x11AB0,
        0x11AF9,
+       0x11B00,
+       0x11B0A,
        0x11C00,
        0x11C09,
        0x11C0A,
@@ -255086,6 +257146,16 @@ static const UV UNI_GRBASE_invlist[] = {  /* for EBCDIC 1047 */
        0x11EF3,
        0x11EF5,
        0x11EF9,
+       0x11F02,
+       0x11F11,
+       0x11F12,
+       0x11F36,
+       0x11F3E,
+       0x11F40,
+       0x11F41,
+       0x11F42,
+       0x11F43,
+       0x11F5A,
        0x11FB0,
        0x11FB1,
        0x11FC0,
@@ -255101,7 +257171,9 @@ static const UV UNI_GRBASE_invlist[] = {  /* for EBCDIC 1047 */
        0x12F90,
        0x12FF3,
        0x13000,
-       0x1342F,
+       0x13430,
+       0x13441,
+       0x13447,
        0x14400,
        0x14647,
        0x16800,
@@ -255156,8 +257228,12 @@ static const UV UNI_GRBASE_invlist[] = {  /* for EBCDIC 1047 */
        0x1AFFF,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -255196,6 +257272,8 @@ static const UV UNI_GRBASE_invlist[] = {  /* for EBCDIC 1047 */
        0x1D242,
        0x1D245,
        0x1D246,
+       0x1D2C0,
+       0x1D2D4,
        0x1D2E0,
        0x1D2F4,
        0x1D300,
@@ -255254,6 +257332,10 @@ static const UV UNI_GRBASE_invlist[] = {  /* for EBCDIC 1047 */
        0x1DA8C,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
+       0x1E030,
+       0x1E06E,
        0x1E100,
        0x1E12D,
        0x1E137,
@@ -255270,6 +257352,10 @@ static const UV UNI_GRBASE_invlist[] = {  /* for EBCDIC 1047 */
        0x1E2FA,
        0x1E2FF,
        0x1E300,
+       0x1E4D0,
+       0x1E4EC,
+       0x1E4F0,
+       0x1E4FA,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -255388,14 +257474,14 @@ static const UV UNI_GRBASE_invlist[] = {  /* for EBCDIC 1047 */
        0x1F266,
        0x1F300,
        0x1F6D8,
-       0x1F6DD,
+       0x1F6DC,
        0x1F6ED,
        0x1F6F0,
        0x1F6FD,
        0x1F700,
-       0x1F774,
-       0x1F780,
-       0x1F7D9,
+       0x1F777,
+       0x1F77B,
+       0x1F7DA,
        0x1F7E0,
        0x1F7EC,
        0x1F7F0,
@@ -255417,23 +257503,19 @@ static const UV UNI_GRBASE_invlist[] = {  /* for EBCDIC 1047 */
        0x1FA60,
        0x1FA6E,
        0x1FA70,
-       0x1FA75,
-       0x1FA78,
        0x1FA7D,
        0x1FA80,
-       0x1FA87,
+       0x1FA89,
        0x1FA90,
-       0x1FAAD,
-       0x1FAB0,
-       0x1FABB,
-       0x1FAC0,
+       0x1FABE,
+       0x1FABF,
        0x1FAC6,
-       0x1FAD0,
-       0x1FADA,
+       0x1FACE,
+       0x1FADC,
        0x1FAE0,
-       0x1FAE8,
+       0x1FAE9,
        0x1FAF0,
-       0x1FAF7,
+       0x1FAF9,
        0x1FB00,
        0x1FB93,
        0x1FB94,
@@ -255443,7 +257525,7 @@ static const UV UNI_GRBASE_invlist[] = {  /* for EBCDIC 1047 */
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -255453,7 +257535,9 @@ static const UV UNI_GRBASE_invlist[] = {  /* for EBCDIC 1047 */
        0x2F800,
        0x2FA1E,
        0x30000,
-       0x3134B
+       0x3134B,
+       0x31350,
+       0x323B0
 };
 
 #  endif       /* EBCDIC 1047 */
@@ -255464,7 +257548,7 @@ static const UV UNI_GRBASE_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_GRBASE_invlist[] = {  /* for EBCDIC 037 */
-       1723,   /* Number of elements */
+       1751,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -255768,7 +257852,7 @@ static const UV UNI_GRBASE_invlist[] = {  /* for EBCDIC 037 */
        0xCE6,
        0xCF0,
        0xCF1,
-       0xCF3,
+       0xCF4,
        0xD02,
        0xD0D,
        0xD0E,
@@ -256605,6 +258689,8 @@ static const UV UNI_GRBASE_invlist[] = {  /* for EBCDIC 037 */
        0x11236,
        0x11238,
        0x1123E,
+       0x1123F,
+       0x11241,
        0x11280,
        0x11287,
        0x11288,
@@ -256777,6 +258863,8 @@ static const UV UNI_GRBASE_invlist[] = {  /* for EBCDIC 037 */
        0x11AA3,
        0x11AB0,
        0x11AF9,
+       0x11B00,
+       0x11B0A,
        0x11C00,
        0x11C09,
        0x11C0A,
@@ -256823,6 +258911,16 @@ static const UV UNI_GRBASE_invlist[] = {  /* for EBCDIC 037 */
        0x11EF3,
        0x11EF5,
        0x11EF9,
+       0x11F02,
+       0x11F11,
+       0x11F12,
+       0x11F36,
+       0x11F3E,
+       0x11F40,
+       0x11F41,
+       0x11F42,
+       0x11F43,
+       0x11F5A,
        0x11FB0,
        0x11FB1,
        0x11FC0,
@@ -256838,7 +258936,9 @@ static const UV UNI_GRBASE_invlist[] = {  /* for EBCDIC 037 */
        0x12F90,
        0x12FF3,
        0x13000,
-       0x1342F,
+       0x13430,
+       0x13441,
+       0x13447,
        0x14400,
        0x14647,
        0x16800,
@@ -256893,8 +258993,12 @@ static const UV UNI_GRBASE_invlist[] = {  /* for EBCDIC 037 */
        0x1AFFF,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -256933,6 +259037,8 @@ static const UV UNI_GRBASE_invlist[] = {  /* for EBCDIC 037 */
        0x1D242,
        0x1D245,
        0x1D246,
+       0x1D2C0,
+       0x1D2D4,
        0x1D2E0,
        0x1D2F4,
        0x1D300,
@@ -256991,6 +259097,10 @@ static const UV UNI_GRBASE_invlist[] = {  /* for EBCDIC 037 */
        0x1DA8C,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
+       0x1E030,
+       0x1E06E,
        0x1E100,
        0x1E12D,
        0x1E137,
@@ -257007,6 +259117,10 @@ static const UV UNI_GRBASE_invlist[] = {  /* for EBCDIC 037 */
        0x1E2FA,
        0x1E2FF,
        0x1E300,
+       0x1E4D0,
+       0x1E4EC,
+       0x1E4F0,
+       0x1E4FA,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -257125,14 +259239,14 @@ static const UV UNI_GRBASE_invlist[] = {  /* for EBCDIC 037 */
        0x1F266,
        0x1F300,
        0x1F6D8,
-       0x1F6DD,
+       0x1F6DC,
        0x1F6ED,
        0x1F6F0,
        0x1F6FD,
        0x1F700,
-       0x1F774,
-       0x1F780,
-       0x1F7D9,
+       0x1F777,
+       0x1F77B,
+       0x1F7DA,
        0x1F7E0,
        0x1F7EC,
        0x1F7F0,
@@ -257154,23 +259268,19 @@ static const UV UNI_GRBASE_invlist[] = {  /* for EBCDIC 037 */
        0x1FA60,
        0x1FA6E,
        0x1FA70,
-       0x1FA75,
-       0x1FA78,
        0x1FA7D,
        0x1FA80,
-       0x1FA87,
+       0x1FA89,
        0x1FA90,
-       0x1FAAD,
-       0x1FAB0,
-       0x1FABB,
-       0x1FAC0,
+       0x1FABE,
+       0x1FABF,
        0x1FAC6,
-       0x1FAD0,
-       0x1FADA,
+       0x1FACE,
+       0x1FADC,
        0x1FAE0,
-       0x1FAE8,
+       0x1FAE9,
        0x1FAF0,
-       0x1FAF7,
+       0x1FAF9,
        0x1FB00,
        0x1FB93,
        0x1FB94,
@@ -257180,7 +259290,7 @@ static const UV UNI_GRBASE_invlist[] = {  /* for EBCDIC 037 */
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -257190,7 +259300,9 @@ static const UV UNI_GRBASE_invlist[] = {  /* for EBCDIC 037 */
        0x2F800,
        0x2FA1E,
        0x30000,
-       0x3134B
+       0x3134B,
+       0x31350,
+       0x323B0
 };
 
 #  endif       /* EBCDIC 037 */
@@ -257290,7 +259402,7 @@ static const UV UNI_GREK_invlist[] = {  /* for all charsets */
 };
 
 static const UV UNI_GREXT_invlist[] = {  /* for all charsets */
-       707,    /* Number of elements */
+       727,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -257500,7 +259612,7 @@ static const UV UNI_GREXT_invlist[] = {  /* for all charsets */
        0xEB4,
        0xEBD,
        0xEC8,
-       0xECE,
+       0xECF,
        0xF18,
        0xF1A,
        0xF35,
@@ -257757,6 +259869,8 @@ static const UV UNI_GREXT_invlist[] = {  /* for all charsets */
        0x10D28,
        0x10EAB,
        0x10EAD,
+       0x10EFD,
+       0x10F00,
        0x10F46,
        0x10F51,
        0x10F82,
@@ -257801,6 +259915,8 @@ static const UV UNI_GREXT_invlist[] = {  /* for all charsets */
        0x11238,
        0x1123E,
        0x1123F,
+       0x11241,
+       0x11242,
        0x112DF,
        0x112E0,
        0x112E3,
@@ -257935,6 +260051,18 @@ static const UV UNI_GREXT_invlist[] = {  /* for all charsets */
        0x11D98,
        0x11EF3,
        0x11EF5,
+       0x11F00,
+       0x11F02,
+       0x11F36,
+       0x11F3B,
+       0x11F40,
+       0x11F41,
+       0x11F42,
+       0x11F43,
+       0x13440,
+       0x13441,
+       0x13447,
+       0x13456,
        0x16AF0,
        0x16AF5,
        0x16B30,
@@ -257987,12 +260115,16 @@ static const UV UNI_GREXT_invlist[] = {  /* for all charsets */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E08F,
+       0x1E090,
        0x1E130,
        0x1E137,
        0x1E2AE,
        0x1E2AF,
        0x1E2EC,
        0x1E2F0,
+       0x1E4EC,
+       0x1E4F0,
        0x1E8D0,
        0x1E8D7,
        0x1E944,
@@ -258112,7 +260244,7 @@ static const UV UNI_HALFMARKS_invlist[] = {  /* for all charsets */
 };
 
 static const UV UNI_HAN_invlist[] = {  /* for all charsets */
-       75,     /* Number of elements */
+       77,     /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -258180,7 +260312,7 @@ static const UV UNI_HAN_invlist[] = {  /* for all charsets */
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -258190,7 +260322,9 @@ static const UV UNI_HAN_invlist[] = {  /* for all charsets */
        0x2F800,
        0x2FA1E,
        0x30000,
-       0x3134B
+       0x3134B,
+       0x31350,
+       0x323B0
 };
 
 static const UV UNI_HANG_invlist[] = {  /* for all charsets */
@@ -258314,7 +260448,7 @@ static const UV UNI_HIGHSURROGATES_invlist[] = {  /* for all charsets */
 };
 
 static const UV UNI_HIRA_invlist[] = {  /* for all charsets */
-       33,     /* Number of elements */
+       35,     /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -258347,6 +260481,8 @@ static const UV UNI_HIRA_invlist[] = {  /* for all charsets */
        0xFFA0,
        0x1B001,
        0x1B120,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
        0x1F200,
@@ -258534,7 +260670,7 @@ static const UV UNI_HYPHEN_invlist[] = {  /* for EBCDIC 037 */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_IDC_invlist[] = {  /* for ASCII/Latin1 */
-       1513,   /* Number of elements */
+       1537,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -258856,7 +260992,7 @@ static const UV UNI_IDC_invlist[] = {  /* for ASCII/Latin1 */
        0xCE6,
        0xCF0,
        0xCF1,
-       0xCF3,
+       0xCF4,
        0xD00,
        0xD0D,
        0xD0E,
@@ -258922,7 +261058,7 @@ static const UV UNI_IDC_invlist[] = {  /* for ASCII/Latin1 */
        0xEC6,
        0xEC7,
        0xEC8,
-       0xECE,
+       0xECF,
        0xED0,
        0xEDA,
        0xEDC,
@@ -259547,7 +261683,7 @@ static const UV UNI_IDC_invlist[] = {  /* for ASCII/Latin1 */
        0x10EAD,
        0x10EB0,
        0x10EB2,
-       0x10F00,
+       0x10EFD,
        0x10F1D,
        0x10F27,
        0x10F28,
@@ -259594,7 +261730,7 @@ static const UV UNI_IDC_invlist[] = {  /* for ASCII/Latin1 */
        0x11213,
        0x11238,
        0x1123E,
-       0x1123F,
+       0x11242,
        0x11280,
        0x11287,
        0x11288,
@@ -259755,6 +261891,14 @@ static const UV UNI_IDC_invlist[] = {  /* for ASCII/Latin1 */
        0x11DAA,
        0x11EE0,
        0x11EF7,
+       0x11F00,
+       0x11F11,
+       0x11F12,
+       0x11F3B,
+       0x11F3E,
+       0x11F43,
+       0x11F50,
+       0x11F5A,
        0x11FB0,
        0x11FB1,
        0x12000,
@@ -259766,7 +261910,9 @@ static const UV UNI_IDC_invlist[] = {  /* for ASCII/Latin1 */
        0x12F90,
        0x12FF1,
        0x13000,
-       0x1342F,
+       0x13430,
+       0x13440,
+       0x13456,
        0x14400,
        0x14647,
        0x16800,
@@ -259821,8 +261967,12 @@ static const UV UNI_IDC_invlist[] = {  /* for ASCII/Latin1 */
        0x1AFFF,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -259929,6 +262079,8 @@ static const UV UNI_IDC_invlist[] = {  /* for ASCII/Latin1 */
        0x1DAB0,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
        0x1E000,
        0x1E007,
        0x1E008,
@@ -259939,6 +262091,10 @@ static const UV UNI_IDC_invlist[] = {  /* for ASCII/Latin1 */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E030,
+       0x1E06E,
+       0x1E08F,
+       0x1E090,
        0x1E100,
        0x1E12D,
        0x1E130,
@@ -259951,6 +262107,8 @@ static const UV UNI_IDC_invlist[] = {  /* for ASCII/Latin1 */
        0x1E2AF,
        0x1E2C0,
        0x1E2FA,
+       0x1E4D0,
+       0x1E4FA,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -260038,7 +262196,7 @@ static const UV UNI_IDC_invlist[] = {  /* for ASCII/Latin1 */
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -260049,6 +262207,8 @@ static const UV UNI_IDC_invlist[] = {  /* for ASCII/Latin1 */
        0x2FA1E,
        0x30000,
        0x3134B,
+       0x31350,
+       0x323B0,
        0xE0100,
        0xE01F0
 };
@@ -260061,7 +262221,7 @@ static const UV UNI_IDC_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_IDC_invlist[] = {  /* for EBCDIC 1047 */
-       1537,   /* Number of elements */
+       1561,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -260407,7 +262567,7 @@ static const UV UNI_IDC_invlist[] = {  /* for EBCDIC 1047 */
        0xCE6,
        0xCF0,
        0xCF1,
-       0xCF3,
+       0xCF4,
        0xD00,
        0xD0D,
        0xD0E,
@@ -260473,7 +262633,7 @@ static const UV UNI_IDC_invlist[] = {  /* for EBCDIC 1047 */
        0xEC6,
        0xEC7,
        0xEC8,
-       0xECE,
+       0xECF,
        0xED0,
        0xEDA,
        0xEDC,
@@ -261098,7 +263258,7 @@ static const UV UNI_IDC_invlist[] = {  /* for EBCDIC 1047 */
        0x10EAD,
        0x10EB0,
        0x10EB2,
-       0x10F00,
+       0x10EFD,
        0x10F1D,
        0x10F27,
        0x10F28,
@@ -261145,7 +263305,7 @@ static const UV UNI_IDC_invlist[] = {  /* for EBCDIC 1047 */
        0x11213,
        0x11238,
        0x1123E,
-       0x1123F,
+       0x11242,
        0x11280,
        0x11287,
        0x11288,
@@ -261306,6 +263466,14 @@ static const UV UNI_IDC_invlist[] = {  /* for EBCDIC 1047 */
        0x11DAA,
        0x11EE0,
        0x11EF7,
+       0x11F00,
+       0x11F11,
+       0x11F12,
+       0x11F3B,
+       0x11F3E,
+       0x11F43,
+       0x11F50,
+       0x11F5A,
        0x11FB0,
        0x11FB1,
        0x12000,
@@ -261317,7 +263485,9 @@ static const UV UNI_IDC_invlist[] = {  /* for EBCDIC 1047 */
        0x12F90,
        0x12FF1,
        0x13000,
-       0x1342F,
+       0x13430,
+       0x13440,
+       0x13456,
        0x14400,
        0x14647,
        0x16800,
@@ -261372,8 +263542,12 @@ static const UV UNI_IDC_invlist[] = {  /* for EBCDIC 1047 */
        0x1AFFF,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -261480,6 +263654,8 @@ static const UV UNI_IDC_invlist[] = {  /* for EBCDIC 1047 */
        0x1DAB0,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
        0x1E000,
        0x1E007,
        0x1E008,
@@ -261490,6 +263666,10 @@ static const UV UNI_IDC_invlist[] = {  /* for EBCDIC 1047 */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E030,
+       0x1E06E,
+       0x1E08F,
+       0x1E090,
        0x1E100,
        0x1E12D,
        0x1E130,
@@ -261502,6 +263682,8 @@ static const UV UNI_IDC_invlist[] = {  /* for EBCDIC 1047 */
        0x1E2AF,
        0x1E2C0,
        0x1E2FA,
+       0x1E4D0,
+       0x1E4FA,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -261589,7 +263771,7 @@ static const UV UNI_IDC_invlist[] = {  /* for EBCDIC 1047 */
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -261600,6 +263782,8 @@ static const UV UNI_IDC_invlist[] = {  /* for EBCDIC 1047 */
        0x2FA1E,
        0x30000,
        0x3134B,
+       0x31350,
+       0x323B0,
        0xE0100,
        0xE01F0
 };
@@ -261612,7 +263796,7 @@ static const UV UNI_IDC_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_IDC_invlist[] = {  /* for EBCDIC 037 */
-       1533,   /* Number of elements */
+       1557,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -261954,7 +264138,7 @@ static const UV UNI_IDC_invlist[] = {  /* for EBCDIC 037 */
        0xCE6,
        0xCF0,
        0xCF1,
-       0xCF3,
+       0xCF4,
        0xD00,
        0xD0D,
        0xD0E,
@@ -262020,7 +264204,7 @@ static const UV UNI_IDC_invlist[] = {  /* for EBCDIC 037 */
        0xEC6,
        0xEC7,
        0xEC8,
-       0xECE,
+       0xECF,
        0xED0,
        0xEDA,
        0xEDC,
@@ -262645,7 +264829,7 @@ static const UV UNI_IDC_invlist[] = {  /* for EBCDIC 037 */
        0x10EAD,
        0x10EB0,
        0x10EB2,
-       0x10F00,
+       0x10EFD,
        0x10F1D,
        0x10F27,
        0x10F28,
@@ -262692,7 +264876,7 @@ static const UV UNI_IDC_invlist[] = {  /* for EBCDIC 037 */
        0x11213,
        0x11238,
        0x1123E,
-       0x1123F,
+       0x11242,
        0x11280,
        0x11287,
        0x11288,
@@ -262853,6 +265037,14 @@ static const UV UNI_IDC_invlist[] = {  /* for EBCDIC 037 */
        0x11DAA,
        0x11EE0,
        0x11EF7,
+       0x11F00,
+       0x11F11,
+       0x11F12,
+       0x11F3B,
+       0x11F3E,
+       0x11F43,
+       0x11F50,
+       0x11F5A,
        0x11FB0,
        0x11FB1,
        0x12000,
@@ -262864,7 +265056,9 @@ static const UV UNI_IDC_invlist[] = {  /* for EBCDIC 037 */
        0x12F90,
        0x12FF1,
        0x13000,
-       0x1342F,
+       0x13430,
+       0x13440,
+       0x13456,
        0x14400,
        0x14647,
        0x16800,
@@ -262919,8 +265113,12 @@ static const UV UNI_IDC_invlist[] = {  /* for EBCDIC 037 */
        0x1AFFF,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -263027,6 +265225,8 @@ static const UV UNI_IDC_invlist[] = {  /* for EBCDIC 037 */
        0x1DAB0,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
        0x1E000,
        0x1E007,
        0x1E008,
@@ -263037,6 +265237,10 @@ static const UV UNI_IDC_invlist[] = {  /* for EBCDIC 037 */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E030,
+       0x1E06E,
+       0x1E08F,
+       0x1E090,
        0x1E100,
        0x1E12D,
        0x1E130,
@@ -263049,6 +265253,8 @@ static const UV UNI_IDC_invlist[] = {  /* for EBCDIC 037 */
        0x1E2AF,
        0x1E2C0,
        0x1E2FA,
+       0x1E4D0,
+       0x1E4FA,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -263136,7 +265342,7 @@ static const UV UNI_IDC_invlist[] = {  /* for EBCDIC 037 */
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -263147,6 +265353,8 @@ static const UV UNI_IDC_invlist[] = {  /* for EBCDIC 037 */
        0x2FA1E,
        0x30000,
        0x3134B,
+       0x31350,
+       0x323B0,
        0xE0100,
        0xE01F0
 };
@@ -263156,7 +265364,7 @@ static const UV UNI_IDC_invlist[] = {  /* for EBCDIC 037 */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_IDENTIFIERSTATUS__ALLOWED_invlist[] = {  /* for ASCII/Latin1 */
-       777,    /* Number of elements */
+       785,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -263518,7 +265726,7 @@ static const UV UNI_IDENTIFIERSTATUS__ALLOWED_invlist[] = {  /* for ASCII/Latin1
        0xCE6,
        0xCF0,
        0xCF1,
-       0xCF3,
+       0xCF4,
        0xD00,
        0xD01,
        0xD02,
@@ -263596,7 +265804,7 @@ static const UV UNI_IDENTIFIERSTATUS__ALLOWED_invlist[] = {  /* for ASCII/Latin1
        0xEC6,
        0xEC7,
        0xEC8,
-       0xECE,
+       0xECF,
        0xED0,
        0xEDA,
        0xEDE,
@@ -263793,8 +266001,6 @@ static const UV UNI_IDENTIFIERSTATUS__ALLOWED_invlist[] = {  /* for ASCII/Latin1
        0x1FFB,
        0x1FFC,
        0x1FFD,
-       0x200C,
-       0x200E,
        0x2010,
        0x2011,
        0x2019,
@@ -263911,12 +266117,20 @@ static const UV UNI_IDENTIFIERSTATUS__ALLOWED_invlist[] = {  /* for ASCII/Latin1
        0x16FF2,
        0x1B11F,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
+       0x1E08F,
+       0x1E090,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -263928,7 +266142,7 @@ static const UV UNI_IDENTIFIERSTATUS__ALLOWED_invlist[] = {  /* for ASCII/Latin1
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -263936,7 +266150,9 @@ static const UV UNI_IDENTIFIERSTATUS__ALLOWED_invlist[] = {  /* for ASCII/Latin1
        0x2CEB0,
        0x2EBE1,
        0x30000,
-       0x3134B
+       0x3134B,
+       0x31350,
+       0x323B0
 };
 
 #  endif       /* ASCII/Latin1 */
@@ -263947,7 +266163,7 @@ static const UV UNI_IDENTIFIERSTATUS__ALLOWED_invlist[] = {  /* for ASCII/Latin1
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_IDENTIFIERSTATUS__ALLOWED_invlist[] = {  /* for EBCDIC 1047 */
-       811,    /* Number of elements */
+       819,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -264343,7 +266559,7 @@ static const UV UNI_IDENTIFIERSTATUS__ALLOWED_invlist[] = {  /* for EBCDIC 1047
        0xCE6,
        0xCF0,
        0xCF1,
-       0xCF3,
+       0xCF4,
        0xD00,
        0xD01,
        0xD02,
@@ -264421,7 +266637,7 @@ static const UV UNI_IDENTIFIERSTATUS__ALLOWED_invlist[] = {  /* for EBCDIC 1047
        0xEC6,
        0xEC7,
        0xEC8,
-       0xECE,
+       0xECF,
        0xED0,
        0xEDA,
        0xEDE,
@@ -264618,8 +266834,6 @@ static const UV UNI_IDENTIFIERSTATUS__ALLOWED_invlist[] = {  /* for EBCDIC 1047
        0x1FFB,
        0x1FFC,
        0x1FFD,
-       0x200C,
-       0x200E,
        0x2010,
        0x2011,
        0x2019,
@@ -264736,12 +266950,20 @@ static const UV UNI_IDENTIFIERSTATUS__ALLOWED_invlist[] = {  /* for EBCDIC 1047
        0x16FF2,
        0x1B11F,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
+       0x1E08F,
+       0x1E090,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -264753,7 +266975,7 @@ static const UV UNI_IDENTIFIERSTATUS__ALLOWED_invlist[] = {  /* for EBCDIC 1047
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -264761,7 +266983,9 @@ static const UV UNI_IDENTIFIERSTATUS__ALLOWED_invlist[] = {  /* for EBCDIC 1047
        0x2CEB0,
        0x2EBE1,
        0x30000,
-       0x3134B
+       0x3134B,
+       0x31350,
+       0x323B0
 };
 
 #  endif       /* EBCDIC 1047 */
@@ -264772,7 +266996,7 @@ static const UV UNI_IDENTIFIERSTATUS__ALLOWED_invlist[] = {  /* for EBCDIC 1047
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_IDENTIFIERSTATUS__ALLOWED_invlist[] = {  /* for EBCDIC 037 */
-       807,    /* Number of elements */
+       815,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -265164,7 +267388,7 @@ static const UV UNI_IDENTIFIERSTATUS__ALLOWED_invlist[] = {  /* for EBCDIC 037 *
        0xCE6,
        0xCF0,
        0xCF1,
-       0xCF3,
+       0xCF4,
        0xD00,
        0xD01,
        0xD02,
@@ -265242,7 +267466,7 @@ static const UV UNI_IDENTIFIERSTATUS__ALLOWED_invlist[] = {  /* for EBCDIC 037 *
        0xEC6,
        0xEC7,
        0xEC8,
-       0xECE,
+       0xECF,
        0xED0,
        0xEDA,
        0xEDE,
@@ -265439,8 +267663,6 @@ static const UV UNI_IDENTIFIERSTATUS__ALLOWED_invlist[] = {  /* for EBCDIC 037 *
        0x1FFB,
        0x1FFC,
        0x1FFD,
-       0x200C,
-       0x200E,
        0x2010,
        0x2011,
        0x2019,
@@ -265557,12 +267779,20 @@ static const UV UNI_IDENTIFIERSTATUS__ALLOWED_invlist[] = {  /* for EBCDIC 037 *
        0x16FF2,
        0x1B11F,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
+       0x1E08F,
+       0x1E090,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -265574,7 +267804,7 @@ static const UV UNI_IDENTIFIERSTATUS__ALLOWED_invlist[] = {  /* for EBCDIC 037 *
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -265582,7 +267812,9 @@ static const UV UNI_IDENTIFIERSTATUS__ALLOWED_invlist[] = {  /* for EBCDIC 037 *
        0x2CEB0,
        0x2EBE1,
        0x30000,
-       0x3134B
+       0x3134B,
+       0x31350,
+       0x323B0
 };
 
 #  endif       /* EBCDIC 037 */
@@ -265590,7 +267822,7 @@ static const UV UNI_IDENTIFIERSTATUS__ALLOWED_invlist[] = {  /* for EBCDIC 037 *
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_IDENTIFIERSTATUS__RESTRICTED_invlist[] = {  /* for ASCII/Latin1 */
-       777,    /* Number of elements */
+       785,    /* Number of elements */
        148565664, /* Version and data structure type */
        0,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -265952,7 +268184,7 @@ static const UV UNI_IDENTIFIERSTATUS__RESTRICTED_invlist[] = {  /* for ASCII/Lat
        0xCE6,
        0xCF0,
        0xCF1,
-       0xCF3,
+       0xCF4,
        0xD00,
        0xD01,
        0xD02,
@@ -266030,7 +268262,7 @@ static const UV UNI_IDENTIFIERSTATUS__RESTRICTED_invlist[] = {  /* for ASCII/Lat
        0xEC6,
        0xEC7,
        0xEC8,
-       0xECE,
+       0xECF,
        0xED0,
        0xEDA,
        0xEDE,
@@ -266227,8 +268459,6 @@ static const UV UNI_IDENTIFIERSTATUS__RESTRICTED_invlist[] = {  /* for ASCII/Lat
        0x1FFB,
        0x1FFC,
        0x1FFD,
-       0x200C,
-       0x200E,
        0x2010,
        0x2011,
        0x2019,
@@ -266345,12 +268575,20 @@ static const UV UNI_IDENTIFIERSTATUS__RESTRICTED_invlist[] = {  /* for ASCII/Lat
        0x16FF2,
        0x1B11F,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
+       0x1E08F,
+       0x1E090,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -266362,7 +268600,7 @@ static const UV UNI_IDENTIFIERSTATUS__RESTRICTED_invlist[] = {  /* for ASCII/Lat
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -266370,7 +268608,9 @@ static const UV UNI_IDENTIFIERSTATUS__RESTRICTED_invlist[] = {  /* for ASCII/Lat
        0x2CEB0,
        0x2EBE1,
        0x30000,
-       0x3134B
+       0x3134B,
+       0x31350,
+       0x323B0
 };
 
 #  endif       /* ASCII/Latin1 */
@@ -266381,7 +268621,7 @@ static const UV UNI_IDENTIFIERSTATUS__RESTRICTED_invlist[] = {  /* for ASCII/Lat
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_IDENTIFIERSTATUS__RESTRICTED_invlist[] = {  /* for EBCDIC 1047 */
-       811,    /* Number of elements */
+       819,    /* Number of elements */
        148565664, /* Version and data structure type */
        0,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -266777,7 +269017,7 @@ static const UV UNI_IDENTIFIERSTATUS__RESTRICTED_invlist[] = {  /* for EBCDIC 10
        0xCE6,
        0xCF0,
        0xCF1,
-       0xCF3,
+       0xCF4,
        0xD00,
        0xD01,
        0xD02,
@@ -266855,7 +269095,7 @@ static const UV UNI_IDENTIFIERSTATUS__RESTRICTED_invlist[] = {  /* for EBCDIC 10
        0xEC6,
        0xEC7,
        0xEC8,
-       0xECE,
+       0xECF,
        0xED0,
        0xEDA,
        0xEDE,
@@ -267052,8 +269292,6 @@ static const UV UNI_IDENTIFIERSTATUS__RESTRICTED_invlist[] = {  /* for EBCDIC 10
        0x1FFB,
        0x1FFC,
        0x1FFD,
-       0x200C,
-       0x200E,
        0x2010,
        0x2011,
        0x2019,
@@ -267170,12 +269408,20 @@ static const UV UNI_IDENTIFIERSTATUS__RESTRICTED_invlist[] = {  /* for EBCDIC 10
        0x16FF2,
        0x1B11F,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
+       0x1E08F,
+       0x1E090,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -267187,7 +269433,7 @@ static const UV UNI_IDENTIFIERSTATUS__RESTRICTED_invlist[] = {  /* for EBCDIC 10
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -267195,7 +269441,9 @@ static const UV UNI_IDENTIFIERSTATUS__RESTRICTED_invlist[] = {  /* for EBCDIC 10
        0x2CEB0,
        0x2EBE1,
        0x30000,
-       0x3134B
+       0x3134B,
+       0x31350,
+       0x323B0
 };
 
 #  endif       /* EBCDIC 1047 */
@@ -267206,7 +269454,7 @@ static const UV UNI_IDENTIFIERSTATUS__RESTRICTED_invlist[] = {  /* for EBCDIC 10
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_IDENTIFIERSTATUS__RESTRICTED_invlist[] = {  /* for EBCDIC 037 */
-       807,    /* Number of elements */
+       815,    /* Number of elements */
        148565664, /* Version and data structure type */
        0,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -267598,7 +269846,7 @@ static const UV UNI_IDENTIFIERSTATUS__RESTRICTED_invlist[] = {  /* for EBCDIC 03
        0xCE6,
        0xCF0,
        0xCF1,
-       0xCF3,
+       0xCF4,
        0xD00,
        0xD01,
        0xD02,
@@ -267676,7 +269924,7 @@ static const UV UNI_IDENTIFIERSTATUS__RESTRICTED_invlist[] = {  /* for EBCDIC 03
        0xEC6,
        0xEC7,
        0xEC8,
-       0xECE,
+       0xECF,
        0xED0,
        0xEDA,
        0xEDE,
@@ -267873,8 +270121,6 @@ static const UV UNI_IDENTIFIERSTATUS__RESTRICTED_invlist[] = {  /* for EBCDIC 03
        0x1FFB,
        0x1FFC,
        0x1FFD,
-       0x200C,
-       0x200E,
        0x2010,
        0x2011,
        0x2019,
@@ -267991,12 +270237,20 @@ static const UV UNI_IDENTIFIERSTATUS__RESTRICTED_invlist[] = {  /* for EBCDIC 03
        0x16FF2,
        0x1B11F,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
+       0x1E08F,
+       0x1E090,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -268008,7 +270262,7 @@ static const UV UNI_IDENTIFIERSTATUS__RESTRICTED_invlist[] = {  /* for EBCDIC 03
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -268016,7 +270270,9 @@ static const UV UNI_IDENTIFIERSTATUS__RESTRICTED_invlist[] = {  /* for EBCDIC 03
        0x2CEB0,
        0x2EBE1,
        0x30000,
-       0x3134B
+       0x3134B,
+       0x31350,
+       0x323B0
 };
 
 #  endif       /* EBCDIC 037 */
@@ -268024,7 +270280,7 @@ static const UV UNI_IDENTIFIERSTATUS__RESTRICTED_invlist[] = {  /* for EBCDIC 03
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_IDENTIFIERTYPE__DEFAULTIGNORABLE_invlist[] = {  /* for ASCII/Latin1 */
-       39,     /* Number of elements */
+       37,     /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -268042,8 +270298,6 @@ static const UV UNI_IDENTIFIERTYPE__DEFAULTIGNORABLE_invlist[] = {  /* for ASCII
        0x180B,
        0x1810,
        0x200B,
-       0x200C,
-       0x200E,
        0x2010,
        0x202A,
        0x202F,
@@ -268077,7 +270331,7 @@ static const UV UNI_IDENTIFIERTYPE__DEFAULTIGNORABLE_invlist[] = {  /* for ASCII
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_IDENTIFIERTYPE__DEFAULTIGNORABLE_invlist[] = {  /* for EBCDIC 1047 */
-       39,     /* Number of elements */
+       37,     /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -268095,8 +270349,6 @@ static const UV UNI_IDENTIFIERTYPE__DEFAULTIGNORABLE_invlist[] = {  /* for EBCDI
        0x180B,
        0x1810,
        0x200B,
-       0x200C,
-       0x200E,
        0x2010,
        0x202A,
        0x202F,
@@ -268130,7 +270382,7 @@ static const UV UNI_IDENTIFIERTYPE__DEFAULTIGNORABLE_invlist[] = {  /* for EBCDI
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_IDENTIFIERTYPE__DEFAULTIGNORABLE_invlist[] = {  /* for EBCDIC 037 */
-       39,     /* Number of elements */
+       37,     /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -268148,8 +270400,6 @@ static const UV UNI_IDENTIFIERTYPE__DEFAULTIGNORABLE_invlist[] = {  /* for EBCDI
        0x180B,
        0x1810,
        0x200B,
-       0x200C,
-       0x200E,
        0x2010,
        0x202A,
        0x202F,
@@ -268178,7 +270428,7 @@ static const UV UNI_IDENTIFIERTYPE__DEFAULTIGNORABLE_invlist[] = {  /* for EBCDI
 #  endif       /* EBCDIC 037 */
 
 static const UV UNI_IDENTIFIERTYPE__EXCLUSION_invlist[] = {  /* for all charsets */
-       443,    /* Number of elements */
+       449,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -268408,7 +270658,7 @@ static const UV UNI_IDENTIFIERTYPE__EXCLUSION_invlist[] = {  /* for all charsets
        0x11200,
        0x11212,
        0x11213,
-       0x1123F,
+       0x11242,
        0x11280,
        0x11287,
        0x11288,
@@ -268541,6 +270791,12 @@ static const UV UNI_IDENTIFIERTYPE__EXCLUSION_invlist[] = {  /* for all charsets
        0x11D5A,
        0x11EE0,
        0x11EF9,
+       0x11F00,
+       0x11F11,
+       0x11F12,
+       0x11F3B,
+       0x11F3E,
+       0x11F5A,
        0x12000,
        0x1239A,
        0x12400,
@@ -268552,9 +270808,7 @@ static const UV UNI_IDENTIFIERTYPE__EXCLUSION_invlist[] = {  /* for all charsets
        0x12F90,
        0x12FF3,
        0x13000,
-       0x1342F,
-       0x13430,
-       0x13439,
+       0x13456,
        0x14400,
        0x14647,
        0x16A40,
@@ -268621,6 +270875,8 @@ static const UV UNI_IDENTIFIERTYPE__EXCLUSION_invlist[] = {  /* for all charsets
        0x1E02B,
        0x1E290,
        0x1E2AF,
+       0x1E4D0,
+       0x1E4FA,
        0x1E800,
        0x1E8C5,
        0x1E8C7,
@@ -268630,7 +270886,7 @@ static const UV UNI_IDENTIFIERTYPE__EXCLUSION_invlist[] = {  /* for all charsets
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_IDENTIFIERTYPE__INCLUSION_invlist[] = {  /* for ASCII/Latin1 */
-       31,     /* Number of elements */
+       29,     /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -268653,8 +270909,6 @@ static const UV UNI_IDENTIFIERTYPE__INCLUSION_invlist[] = {  /* for ASCII/Latin1
        0x6FF,
        0xF0B,
        0xF0C,
-       0x200C,
-       0x200E,
        0x2010,
        0x2011,
        0x2019,
@@ -268675,7 +270929,7 @@ static const UV UNI_IDENTIFIERTYPE__INCLUSION_invlist[] = {  /* for ASCII/Latin1
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_IDENTIFIERTYPE__INCLUSION_invlist[] = {  /* for EBCDIC 1047 */
-       33,     /* Number of elements */
+       31,     /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -268700,8 +270954,6 @@ static const UV UNI_IDENTIFIERTYPE__INCLUSION_invlist[] = {  /* for EBCDIC 1047
        0x6FF,
        0xF0B,
        0xF0C,
-       0x200C,
-       0x200E,
        0x2010,
        0x2011,
        0x2019,
@@ -268722,7 +270974,7 @@ static const UV UNI_IDENTIFIERTYPE__INCLUSION_invlist[] = {  /* for EBCDIC 1047
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_IDENTIFIERTYPE__INCLUSION_invlist[] = {  /* for EBCDIC 037 */
-       33,     /* Number of elements */
+       31,     /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -268747,8 +270999,6 @@ static const UV UNI_IDENTIFIERTYPE__INCLUSION_invlist[] = {  /* for EBCDIC 037 *
        0x6FF,
        0xF0B,
        0xF0C,
-       0x200C,
-       0x200E,
        0x2010,
        0x2011,
        0x2019,
@@ -268948,7 +271198,7 @@ static const UV UNI_IDENTIFIERTYPE__LIMITEDUSE_invlist[] = {  /* for all charset
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_IDENTIFIERTYPE__NOTCHARACTER_invlist[] = {  /* for ASCII/Latin1 */
-       1399,   /* Number of elements */
+       1417,   /* Number of elements */
        148565664, /* Version and data structure type */
        0,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -269202,7 +271452,7 @@ static const UV UNI_IDENTIFIERTYPE__NOTCHARACTER_invlist[] = {  /* for ASCII/Lat
        0xCE6,
        0xCF0,
        0xCF1,
-       0xCF3,
+       0xCF4,
        0xD00,
        0xD0D,
        0xD0E,
@@ -269262,7 +271512,7 @@ static const UV UNI_IDENTIFIERTYPE__NOTCHARACTER_invlist[] = {  /* for ASCII/Lat
        0xEC6,
        0xEC7,
        0xEC8,
-       0xECE,
+       0xECF,
        0xED0,
        0xEDA,
        0xEDC,
@@ -269803,7 +272053,7 @@ static const UV UNI_IDENTIFIERTYPE__NOTCHARACTER_invlist[] = {  /* for ASCII/Lat
        0x10EAE,
        0x10EB0,
        0x10EB2,
-       0x10F00,
+       0x10EFD,
        0x10F28,
        0x10F30,
        0x10F5A,
@@ -269838,7 +272088,7 @@ static const UV UNI_IDENTIFIERTYPE__NOTCHARACTER_invlist[] = {  /* for ASCII/Lat
        0x11200,
        0x11212,
        0x11213,
-       0x1123F,
+       0x11242,
        0x11280,
        0x11287,
        0x11288,
@@ -269943,6 +272193,8 @@ static const UV UNI_IDENTIFIERTYPE__NOTCHARACTER_invlist[] = {  /* for ASCII/Lat
        0x11AA3,
        0x11AB0,
        0x11AF9,
+       0x11B00,
+       0x11B0A,
        0x11C00,
        0x11C09,
        0x11C0A,
@@ -269985,6 +272237,12 @@ static const UV UNI_IDENTIFIERTYPE__NOTCHARACTER_invlist[] = {  /* for ASCII/Lat
        0x11DAA,
        0x11EE0,
        0x11EF9,
+       0x11F00,
+       0x11F11,
+       0x11F12,
+       0x11F3B,
+       0x11F3E,
+       0x11F5A,
        0x11FB0,
        0x11FB1,
        0x11FC0,
@@ -270000,9 +272258,7 @@ static const UV UNI_IDENTIFIERTYPE__NOTCHARACTER_invlist[] = {  /* for ASCII/Lat
        0x12F90,
        0x12FF3,
        0x13000,
-       0x1342F,
-       0x13430,
-       0x13439,
+       0x13456,
        0x14400,
        0x14647,
        0x16800,
@@ -270055,8 +272311,12 @@ static const UV UNI_IDENTIFIERTYPE__NOTCHARACTER_invlist[] = {  /* for ASCII/Lat
        0x1AFFF,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -270085,6 +272345,8 @@ static const UV UNI_IDENTIFIERTYPE__NOTCHARACTER_invlist[] = {  /* for ASCII/Lat
        0x1D1EB,
        0x1D200,
        0x1D246,
+       0x1D2C0,
+       0x1D2D4,
        0x1D2E0,
        0x1D2F4,
        0x1D300,
@@ -270139,6 +272401,8 @@ static const UV UNI_IDENTIFIERTYPE__NOTCHARACTER_invlist[] = {  /* for ASCII/Lat
        0x1DAB0,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
        0x1E000,
        0x1E007,
        0x1E008,
@@ -270149,6 +272413,10 @@ static const UV UNI_IDENTIFIERTYPE__NOTCHARACTER_invlist[] = {  /* for ASCII/Lat
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E030,
+       0x1E06E,
+       0x1E08F,
+       0x1E090,
        0x1E100,
        0x1E12D,
        0x1E130,
@@ -270163,6 +272431,8 @@ static const UV UNI_IDENTIFIERTYPE__NOTCHARACTER_invlist[] = {  /* for ASCII/Lat
        0x1E2FA,
        0x1E2FF,
        0x1E300,
+       0x1E4D0,
+       0x1E4FA,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -270279,14 +272549,14 @@ static const UV UNI_IDENTIFIERTYPE__NOTCHARACTER_invlist[] = {  /* for ASCII/Lat
        0x1F266,
        0x1F300,
        0x1F6D8,
-       0x1F6DD,
+       0x1F6DC,
        0x1F6ED,
        0x1F6F0,
        0x1F6FD,
        0x1F700,
-       0x1F774,
-       0x1F780,
-       0x1F7D9,
+       0x1F777,
+       0x1F77B,
+       0x1F7DA,
        0x1F7E0,
        0x1F7EC,
        0x1F7F0,
@@ -270308,23 +272578,19 @@ static const UV UNI_IDENTIFIERTYPE__NOTCHARACTER_invlist[] = {  /* for ASCII/Lat
        0x1FA60,
        0x1FA6E,
        0x1FA70,
-       0x1FA75,
-       0x1FA78,
        0x1FA7D,
        0x1FA80,
-       0x1FA87,
+       0x1FA89,
        0x1FA90,
-       0x1FAAD,
-       0x1FAB0,
-       0x1FABB,
-       0x1FAC0,
+       0x1FABE,
+       0x1FABF,
        0x1FAC6,
-       0x1FAD0,
-       0x1FADA,
+       0x1FACE,
+       0x1FADC,
        0x1FAE0,
-       0x1FAE8,
+       0x1FAE9,
        0x1FAF0,
-       0x1FAF7,
+       0x1FAF9,
        0x1FB00,
        0x1FB93,
        0x1FB94,
@@ -270334,7 +272600,7 @@ static const UV UNI_IDENTIFIERTYPE__NOTCHARACTER_invlist[] = {  /* for ASCII/Lat
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -270345,6 +272611,8 @@ static const UV UNI_IDENTIFIERTYPE__NOTCHARACTER_invlist[] = {  /* for ASCII/Lat
        0x2FA1E,
        0x30000,
        0x3134B,
+       0x31350,
+       0x323B0,
        0xE0001,
        0xE0002,
        0xE0020,
@@ -270361,7 +272629,7 @@ static const UV UNI_IDENTIFIERTYPE__NOTCHARACTER_invlist[] = {  /* for ASCII/Lat
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_IDENTIFIERTYPE__NOTCHARACTER_invlist[] = {  /* for EBCDIC 1047 */
-       1403,   /* Number of elements */
+       1421,   /* Number of elements */
        148565664, /* Version and data structure type */
        0,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -270619,7 +272887,7 @@ static const UV UNI_IDENTIFIERTYPE__NOTCHARACTER_invlist[] = {  /* for EBCDIC 10
        0xCE6,
        0xCF0,
        0xCF1,
-       0xCF3,
+       0xCF4,
        0xD00,
        0xD0D,
        0xD0E,
@@ -270679,7 +272947,7 @@ static const UV UNI_IDENTIFIERTYPE__NOTCHARACTER_invlist[] = {  /* for EBCDIC 10
        0xEC6,
        0xEC7,
        0xEC8,
-       0xECE,
+       0xECF,
        0xED0,
        0xEDA,
        0xEDC,
@@ -271220,7 +273488,7 @@ static const UV UNI_IDENTIFIERTYPE__NOTCHARACTER_invlist[] = {  /* for EBCDIC 10
        0x10EAE,
        0x10EB0,
        0x10EB2,
-       0x10F00,
+       0x10EFD,
        0x10F28,
        0x10F30,
        0x10F5A,
@@ -271255,7 +273523,7 @@ static const UV UNI_IDENTIFIERTYPE__NOTCHARACTER_invlist[] = {  /* for EBCDIC 10
        0x11200,
        0x11212,
        0x11213,
-       0x1123F,
+       0x11242,
        0x11280,
        0x11287,
        0x11288,
@@ -271360,6 +273628,8 @@ static const UV UNI_IDENTIFIERTYPE__NOTCHARACTER_invlist[] = {  /* for EBCDIC 10
        0x11AA3,
        0x11AB0,
        0x11AF9,
+       0x11B00,
+       0x11B0A,
        0x11C00,
        0x11C09,
        0x11C0A,
@@ -271402,6 +273672,12 @@ static const UV UNI_IDENTIFIERTYPE__NOTCHARACTER_invlist[] = {  /* for EBCDIC 10
        0x11DAA,
        0x11EE0,
        0x11EF9,
+       0x11F00,
+       0x11F11,
+       0x11F12,
+       0x11F3B,
+       0x11F3E,
+       0x11F5A,
        0x11FB0,
        0x11FB1,
        0x11FC0,
@@ -271417,9 +273693,7 @@ static const UV UNI_IDENTIFIERTYPE__NOTCHARACTER_invlist[] = {  /* for EBCDIC 10
        0x12F90,
        0x12FF3,
        0x13000,
-       0x1342F,
-       0x13430,
-       0x13439,
+       0x13456,
        0x14400,
        0x14647,
        0x16800,
@@ -271472,8 +273746,12 @@ static const UV UNI_IDENTIFIERTYPE__NOTCHARACTER_invlist[] = {  /* for EBCDIC 10
        0x1AFFF,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -271502,6 +273780,8 @@ static const UV UNI_IDENTIFIERTYPE__NOTCHARACTER_invlist[] = {  /* for EBCDIC 10
        0x1D1EB,
        0x1D200,
        0x1D246,
+       0x1D2C0,
+       0x1D2D4,
        0x1D2E0,
        0x1D2F4,
        0x1D300,
@@ -271556,6 +273836,8 @@ static const UV UNI_IDENTIFIERTYPE__NOTCHARACTER_invlist[] = {  /* for EBCDIC 10
        0x1DAB0,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
        0x1E000,
        0x1E007,
        0x1E008,
@@ -271566,6 +273848,10 @@ static const UV UNI_IDENTIFIERTYPE__NOTCHARACTER_invlist[] = {  /* for EBCDIC 10
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E030,
+       0x1E06E,
+       0x1E08F,
+       0x1E090,
        0x1E100,
        0x1E12D,
        0x1E130,
@@ -271580,6 +273866,8 @@ static const UV UNI_IDENTIFIERTYPE__NOTCHARACTER_invlist[] = {  /* for EBCDIC 10
        0x1E2FA,
        0x1E2FF,
        0x1E300,
+       0x1E4D0,
+       0x1E4FA,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -271696,14 +273984,14 @@ static const UV UNI_IDENTIFIERTYPE__NOTCHARACTER_invlist[] = {  /* for EBCDIC 10
        0x1F266,
        0x1F300,
        0x1F6D8,
-       0x1F6DD,
+       0x1F6DC,
        0x1F6ED,
        0x1F6F0,
        0x1F6FD,
        0x1F700,
-       0x1F774,
-       0x1F780,
-       0x1F7D9,
+       0x1F777,
+       0x1F77B,
+       0x1F7DA,
        0x1F7E0,
        0x1F7EC,
        0x1F7F0,
@@ -271725,23 +274013,19 @@ static const UV UNI_IDENTIFIERTYPE__NOTCHARACTER_invlist[] = {  /* for EBCDIC 10
        0x1FA60,
        0x1FA6E,
        0x1FA70,
-       0x1FA75,
-       0x1FA78,
        0x1FA7D,
        0x1FA80,
-       0x1FA87,
+       0x1FA89,
        0x1FA90,
-       0x1FAAD,
-       0x1FAB0,
-       0x1FABB,
-       0x1FAC0,
+       0x1FABE,
+       0x1FABF,
        0x1FAC6,
-       0x1FAD0,
-       0x1FADA,
+       0x1FACE,
+       0x1FADC,
        0x1FAE0,
-       0x1FAE8,
+       0x1FAE9,
        0x1FAF0,
-       0x1FAF7,
+       0x1FAF9,
        0x1FB00,
        0x1FB93,
        0x1FB94,
@@ -271751,7 +274035,7 @@ static const UV UNI_IDENTIFIERTYPE__NOTCHARACTER_invlist[] = {  /* for EBCDIC 10
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -271762,6 +274046,8 @@ static const UV UNI_IDENTIFIERTYPE__NOTCHARACTER_invlist[] = {  /* for EBCDIC 10
        0x2FA1E,
        0x30000,
        0x3134B,
+       0x31350,
+       0x323B0,
        0xE0001,
        0xE0002,
        0xE0020,
@@ -271778,7 +274064,7 @@ static const UV UNI_IDENTIFIERTYPE__NOTCHARACTER_invlist[] = {  /* for EBCDIC 10
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_IDENTIFIERTYPE__NOTCHARACTER_invlist[] = {  /* for EBCDIC 037 */
-       1403,   /* Number of elements */
+       1421,   /* Number of elements */
        148565664, /* Version and data structure type */
        0,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -272036,7 +274322,7 @@ static const UV UNI_IDENTIFIERTYPE__NOTCHARACTER_invlist[] = {  /* for EBCDIC 03
        0xCE6,
        0xCF0,
        0xCF1,
-       0xCF3,
+       0xCF4,
        0xD00,
        0xD0D,
        0xD0E,
@@ -272096,7 +274382,7 @@ static const UV UNI_IDENTIFIERTYPE__NOTCHARACTER_invlist[] = {  /* for EBCDIC 03
        0xEC6,
        0xEC7,
        0xEC8,
-       0xECE,
+       0xECF,
        0xED0,
        0xEDA,
        0xEDC,
@@ -272637,7 +274923,7 @@ static const UV UNI_IDENTIFIERTYPE__NOTCHARACTER_invlist[] = {  /* for EBCDIC 03
        0x10EAE,
        0x10EB0,
        0x10EB2,
-       0x10F00,
+       0x10EFD,
        0x10F28,
        0x10F30,
        0x10F5A,
@@ -272672,7 +274958,7 @@ static const UV UNI_IDENTIFIERTYPE__NOTCHARACTER_invlist[] = {  /* for EBCDIC 03
        0x11200,
        0x11212,
        0x11213,
-       0x1123F,
+       0x11242,
        0x11280,
        0x11287,
        0x11288,
@@ -272777,6 +275063,8 @@ static const UV UNI_IDENTIFIERTYPE__NOTCHARACTER_invlist[] = {  /* for EBCDIC 03
        0x11AA3,
        0x11AB0,
        0x11AF9,
+       0x11B00,
+       0x11B0A,
        0x11C00,
        0x11C09,
        0x11C0A,
@@ -272819,6 +275107,12 @@ static const UV UNI_IDENTIFIERTYPE__NOTCHARACTER_invlist[] = {  /* for EBCDIC 03
        0x11DAA,
        0x11EE0,
        0x11EF9,
+       0x11F00,
+       0x11F11,
+       0x11F12,
+       0x11F3B,
+       0x11F3E,
+       0x11F5A,
        0x11FB0,
        0x11FB1,
        0x11FC0,
@@ -272834,9 +275128,7 @@ static const UV UNI_IDENTIFIERTYPE__NOTCHARACTER_invlist[] = {  /* for EBCDIC 03
        0x12F90,
        0x12FF3,
        0x13000,
-       0x1342F,
-       0x13430,
-       0x13439,
+       0x13456,
        0x14400,
        0x14647,
        0x16800,
@@ -272889,8 +275181,12 @@ static const UV UNI_IDENTIFIERTYPE__NOTCHARACTER_invlist[] = {  /* for EBCDIC 03
        0x1AFFF,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -272919,6 +275215,8 @@ static const UV UNI_IDENTIFIERTYPE__NOTCHARACTER_invlist[] = {  /* for EBCDIC 03
        0x1D1EB,
        0x1D200,
        0x1D246,
+       0x1D2C0,
+       0x1D2D4,
        0x1D2E0,
        0x1D2F4,
        0x1D300,
@@ -272973,6 +275271,8 @@ static const UV UNI_IDENTIFIERTYPE__NOTCHARACTER_invlist[] = {  /* for EBCDIC 03
        0x1DAB0,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
        0x1E000,
        0x1E007,
        0x1E008,
@@ -272983,6 +275283,10 @@ static const UV UNI_IDENTIFIERTYPE__NOTCHARACTER_invlist[] = {  /* for EBCDIC 03
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E030,
+       0x1E06E,
+       0x1E08F,
+       0x1E090,
        0x1E100,
        0x1E12D,
        0x1E130,
@@ -272997,6 +275301,8 @@ static const UV UNI_IDENTIFIERTYPE__NOTCHARACTER_invlist[] = {  /* for EBCDIC 03
        0x1E2FA,
        0x1E2FF,
        0x1E300,
+       0x1E4D0,
+       0x1E4FA,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -273113,14 +275419,14 @@ static const UV UNI_IDENTIFIERTYPE__NOTCHARACTER_invlist[] = {  /* for EBCDIC 03
        0x1F266,
        0x1F300,
        0x1F6D8,
-       0x1F6DD,
+       0x1F6DC,
        0x1F6ED,
        0x1F6F0,
        0x1F6FD,
        0x1F700,
-       0x1F774,
-       0x1F780,
-       0x1F7D9,
+       0x1F777,
+       0x1F77B,
+       0x1F7DA,
        0x1F7E0,
        0x1F7EC,
        0x1F7F0,
@@ -273142,23 +275448,19 @@ static const UV UNI_IDENTIFIERTYPE__NOTCHARACTER_invlist[] = {  /* for EBCDIC 03
        0x1FA60,
        0x1FA6E,
        0x1FA70,
-       0x1FA75,
-       0x1FA78,
        0x1FA7D,
        0x1FA80,
-       0x1FA87,
+       0x1FA89,
        0x1FA90,
-       0x1FAAD,
-       0x1FAB0,
-       0x1FABB,
-       0x1FAC0,
+       0x1FABE,
+       0x1FABF,
        0x1FAC6,
-       0x1FAD0,
-       0x1FADA,
+       0x1FACE,
+       0x1FADC,
        0x1FAE0,
-       0x1FAE8,
+       0x1FAE9,
        0x1FAF0,
-       0x1FAF7,
+       0x1FAF9,
        0x1FB00,
        0x1FB93,
        0x1FB94,
@@ -273168,7 +275470,7 @@ static const UV UNI_IDENTIFIERTYPE__NOTCHARACTER_invlist[] = {  /* for EBCDIC 03
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -273179,6 +275481,8 @@ static const UV UNI_IDENTIFIERTYPE__NOTCHARACTER_invlist[] = {  /* for EBCDIC 03
        0x2FA1E,
        0x30000,
        0x3134B,
+       0x31350,
+       0x323B0,
        0xE0001,
        0xE0002,
        0xE0020,
@@ -273192,7 +275496,7 @@ static const UV UNI_IDENTIFIERTYPE__NOTCHARACTER_invlist[] = {  /* for EBCDIC 03
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_IDENTIFIERTYPE__NOTNFKC_invlist[] = {  /* for ASCII/Latin1 */
-       511,    /* Number of elements */
+       513,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -273619,6 +275923,8 @@ static const UV UNI_IDENTIFIERTYPE__NOTNFKC_invlist[] = {  /* for ASCII/Latin1 *
        0x1D7CC,
        0x1D7CE,
        0x1D800,
+       0x1E030,
+       0x1E06E,
        0x1EE00,
        0x1EE04,
        0x1EE05,
@@ -273717,7 +276023,7 @@ static const UV UNI_IDENTIFIERTYPE__NOTNFKC_invlist[] = {  /* for ASCII/Latin1 *
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_IDENTIFIERTYPE__NOTNFKC_invlist[] = {  /* for EBCDIC 1047 */
-       517,    /* Number of elements */
+       519,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -274150,6 +276456,8 @@ static const UV UNI_IDENTIFIERTYPE__NOTNFKC_invlist[] = {  /* for EBCDIC 1047 */
        0x1D7CC,
        0x1D7CE,
        0x1D800,
+       0x1E030,
+       0x1E06E,
        0x1EE00,
        0x1EE04,
        0x1EE05,
@@ -274248,7 +276556,7 @@ static const UV UNI_IDENTIFIERTYPE__NOTNFKC_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_IDENTIFIERTYPE__NOTNFKC_invlist[] = {  /* for EBCDIC 037 */
-       515,    /* Number of elements */
+       517,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -274679,6 +276987,8 @@ static const UV UNI_IDENTIFIERTYPE__NOTNFKC_invlist[] = {  /* for EBCDIC 037 */
        0x1D7CC,
        0x1D7CE,
        0x1D800,
+       0x1E030,
+       0x1E06E,
        0x1EE00,
        0x1EE04,
        0x1EE05,
@@ -274774,7 +277084,7 @@ static const UV UNI_IDENTIFIERTYPE__NOTNFKC_invlist[] = {  /* for EBCDIC 037 */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_IDENTIFIERTYPE__NOTXID_invlist[] = {  /* for ASCII/Latin1 */
-       707,    /* Number of elements */
+       709,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -275319,6 +277629,8 @@ static const UV UNI_IDENTIFIERTYPE__NOTXID_invlist[] = {  /* for ASCII/Latin1 */
        0x11A9D,
        0x11A9E,
        0x11AA3,
+       0x11B00,
+       0x11B0A,
        0x11C41,
        0x11C46,
        0x11C5A,
@@ -275327,6 +277639,8 @@ static const UV UNI_IDENTIFIERTYPE__NOTXID_invlist[] = {  /* for ASCII/Latin1 */
        0x11C72,
        0x11EF7,
        0x11EF9,
+       0x11F43,
+       0x11F50,
        0x11FC0,
        0x11FF2,
        0x11FFF,
@@ -275336,7 +277650,7 @@ static const UV UNI_IDENTIFIERTYPE__NOTXID_invlist[] = {  /* for ASCII/Latin1 */
        0x12FF1,
        0x12FF3,
        0x13430,
-       0x13439,
+       0x13440,
        0x16A6E,
        0x16A70,
        0x16AF5,
@@ -275377,6 +277691,8 @@ static const UV UNI_IDENTIFIERTYPE__NOTXID_invlist[] = {  /* for ASCII/Latin1 */
        0x1D242,
        0x1D245,
        0x1D246,
+       0x1D2C0,
+       0x1D2D4,
        0x1D2E0,
        0x1D2F4,
        0x1D300,
@@ -275435,14 +277751,14 @@ static const UV UNI_IDENTIFIERTYPE__NOTXID_invlist[] = {  /* for ASCII/Latin1 */
        0x1F266,
        0x1F300,
        0x1F6D8,
-       0x1F6DD,
+       0x1F6DC,
        0x1F6ED,
        0x1F6F0,
        0x1F6FD,
        0x1F700,
-       0x1F774,
-       0x1F780,
-       0x1F7D9,
+       0x1F777,
+       0x1F77B,
+       0x1F7DA,
        0x1F7E0,
        0x1F7EC,
        0x1F7F0,
@@ -275464,23 +277780,19 @@ static const UV UNI_IDENTIFIERTYPE__NOTXID_invlist[] = {  /* for ASCII/Latin1 */
        0x1FA60,
        0x1FA6E,
        0x1FA70,
-       0x1FA75,
-       0x1FA78,
        0x1FA7D,
        0x1FA80,
-       0x1FA87,
+       0x1FA89,
        0x1FA90,
-       0x1FAAD,
-       0x1FAB0,
-       0x1FABB,
-       0x1FAC0,
+       0x1FABE,
+       0x1FABF,
        0x1FAC6,
-       0x1FAD0,
-       0x1FADA,
+       0x1FACE,
+       0x1FADC,
        0x1FAE0,
-       0x1FAE8,
+       0x1FAE9,
        0x1FAF0,
-       0x1FAF7,
+       0x1FAF9,
        0x1FB00,
        0x1FB93,
        0x1FB94,
@@ -275495,7 +277807,7 @@ static const UV UNI_IDENTIFIERTYPE__NOTXID_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_IDENTIFIERTYPE__NOTXID_invlist[] = {  /* for EBCDIC 1047 */
-       721,    /* Number of elements */
+       723,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -276054,6 +278366,8 @@ static const UV UNI_IDENTIFIERTYPE__NOTXID_invlist[] = {  /* for EBCDIC 1047 */
        0x11A9D,
        0x11A9E,
        0x11AA3,
+       0x11B00,
+       0x11B0A,
        0x11C41,
        0x11C46,
        0x11C5A,
@@ -276062,6 +278376,8 @@ static const UV UNI_IDENTIFIERTYPE__NOTXID_invlist[] = {  /* for EBCDIC 1047 */
        0x11C72,
        0x11EF7,
        0x11EF9,
+       0x11F43,
+       0x11F50,
        0x11FC0,
        0x11FF2,
        0x11FFF,
@@ -276071,7 +278387,7 @@ static const UV UNI_IDENTIFIERTYPE__NOTXID_invlist[] = {  /* for EBCDIC 1047 */
        0x12FF1,
        0x12FF3,
        0x13430,
-       0x13439,
+       0x13440,
        0x16A6E,
        0x16A70,
        0x16AF5,
@@ -276112,6 +278428,8 @@ static const UV UNI_IDENTIFIERTYPE__NOTXID_invlist[] = {  /* for EBCDIC 1047 */
        0x1D242,
        0x1D245,
        0x1D246,
+       0x1D2C0,
+       0x1D2D4,
        0x1D2E0,
        0x1D2F4,
        0x1D300,
@@ -276170,14 +278488,14 @@ static const UV UNI_IDENTIFIERTYPE__NOTXID_invlist[] = {  /* for EBCDIC 1047 */
        0x1F266,
        0x1F300,
        0x1F6D8,
-       0x1F6DD,
+       0x1F6DC,
        0x1F6ED,
        0x1F6F0,
        0x1F6FD,
        0x1F700,
-       0x1F774,
-       0x1F780,
-       0x1F7D9,
+       0x1F777,
+       0x1F77B,
+       0x1F7DA,
        0x1F7E0,
        0x1F7EC,
        0x1F7F0,
@@ -276199,23 +278517,19 @@ static const UV UNI_IDENTIFIERTYPE__NOTXID_invlist[] = {  /* for EBCDIC 1047 */
        0x1FA60,
        0x1FA6E,
        0x1FA70,
-       0x1FA75,
-       0x1FA78,
        0x1FA7D,
        0x1FA80,
-       0x1FA87,
+       0x1FA89,
        0x1FA90,
-       0x1FAAD,
-       0x1FAB0,
-       0x1FABB,
-       0x1FAC0,
+       0x1FABE,
+       0x1FABF,
        0x1FAC6,
-       0x1FAD0,
-       0x1FADA,
+       0x1FACE,
+       0x1FADC,
        0x1FAE0,
-       0x1FAE8,
+       0x1FAE9,
        0x1FAF0,
-       0x1FAF7,
+       0x1FAF9,
        0x1FB00,
        0x1FB93,
        0x1FB94,
@@ -276230,7 +278544,7 @@ static const UV UNI_IDENTIFIERTYPE__NOTXID_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_IDENTIFIERTYPE__NOTXID_invlist[] = {  /* for EBCDIC 037 */
-       719,    /* Number of elements */
+       721,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -276787,6 +279101,8 @@ static const UV UNI_IDENTIFIERTYPE__NOTXID_invlist[] = {  /* for EBCDIC 037 */
        0x11A9D,
        0x11A9E,
        0x11AA3,
+       0x11B00,
+       0x11B0A,
        0x11C41,
        0x11C46,
        0x11C5A,
@@ -276795,6 +279111,8 @@ static const UV UNI_IDENTIFIERTYPE__NOTXID_invlist[] = {  /* for EBCDIC 037 */
        0x11C72,
        0x11EF7,
        0x11EF9,
+       0x11F43,
+       0x11F50,
        0x11FC0,
        0x11FF2,
        0x11FFF,
@@ -276804,7 +279122,7 @@ static const UV UNI_IDENTIFIERTYPE__NOTXID_invlist[] = {  /* for EBCDIC 037 */
        0x12FF1,
        0x12FF3,
        0x13430,
-       0x13439,
+       0x13440,
        0x16A6E,
        0x16A70,
        0x16AF5,
@@ -276845,6 +279163,8 @@ static const UV UNI_IDENTIFIERTYPE__NOTXID_invlist[] = {  /* for EBCDIC 037 */
        0x1D242,
        0x1D245,
        0x1D246,
+       0x1D2C0,
+       0x1D2D4,
        0x1D2E0,
        0x1D2F4,
        0x1D300,
@@ -276903,14 +279223,14 @@ static const UV UNI_IDENTIFIERTYPE__NOTXID_invlist[] = {  /* for EBCDIC 037 */
        0x1F266,
        0x1F300,
        0x1F6D8,
-       0x1F6DD,
+       0x1F6DC,
        0x1F6ED,
        0x1F6F0,
        0x1F6FD,
        0x1F700,
-       0x1F774,
-       0x1F780,
-       0x1F7D9,
+       0x1F777,
+       0x1F77B,
+       0x1F7DA,
        0x1F7E0,
        0x1F7EC,
        0x1F7F0,
@@ -276932,23 +279252,19 @@ static const UV UNI_IDENTIFIERTYPE__NOTXID_invlist[] = {  /* for EBCDIC 037 */
        0x1FA60,
        0x1FA6E,
        0x1FA70,
-       0x1FA75,
-       0x1FA78,
        0x1FA7D,
        0x1FA80,
-       0x1FA87,
+       0x1FA89,
        0x1FA90,
-       0x1FAAD,
-       0x1FAB0,
-       0x1FABB,
-       0x1FAC0,
+       0x1FABE,
+       0x1FABF,
        0x1FAC6,
-       0x1FAD0,
-       0x1FADA,
+       0x1FACE,
+       0x1FADC,
        0x1FAE0,
-       0x1FAE8,
+       0x1FAE9,
        0x1FAF0,
-       0x1FAF7,
+       0x1FAF9,
        0x1FB00,
        0x1FB93,
        0x1FB94,
@@ -277176,7 +279492,7 @@ static const UV UNI_IDENTIFIERTYPE__OBSOLETE_invlist[] = {  /* for all charsets
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_IDENTIFIERTYPE__RECOMMENDED_invlist[] = {  /* for ASCII/Latin1 */
-       761,    /* Number of elements */
+       771,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -277530,7 +279846,7 @@ static const UV UNI_IDENTIFIERTYPE__RECOMMENDED_invlist[] = {  /* for ASCII/Lati
        0xCE6,
        0xCF0,
        0xCF1,
-       0xCF3,
+       0xCF4,
        0xD00,
        0xD01,
        0xD02,
@@ -277608,7 +279924,7 @@ static const UV UNI_IDENTIFIERTYPE__RECOMMENDED_invlist[] = {  /* for ASCII/Lati
        0xEC6,
        0xEC7,
        0xEC8,
-       0xECE,
+       0xECF,
        0xED0,
        0xEDA,
        0xEDE,
@@ -277915,12 +280231,20 @@ static const UV UNI_IDENTIFIERTYPE__RECOMMENDED_invlist[] = {  /* for ASCII/Lati
        0x16FF2,
        0x1B11F,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
+       0x1E08F,
+       0x1E090,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -277932,7 +280256,7 @@ static const UV UNI_IDENTIFIERTYPE__RECOMMENDED_invlist[] = {  /* for ASCII/Lati
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -277940,7 +280264,9 @@ static const UV UNI_IDENTIFIERTYPE__RECOMMENDED_invlist[] = {  /* for ASCII/Lati
        0x2CEB0,
        0x2EBE1,
        0x30000,
-       0x3134B
+       0x3134B,
+       0x31350,
+       0x323B0
 };
 
 #  endif       /* ASCII/Latin1 */
@@ -277951,7 +280277,7 @@ static const UV UNI_IDENTIFIERTYPE__RECOMMENDED_invlist[] = {  /* for ASCII/Lati
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_IDENTIFIERTYPE__RECOMMENDED_invlist[] = {  /* for EBCDIC 1047 */
-       791,    /* Number of elements */
+       801,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -278335,7 +280661,7 @@ static const UV UNI_IDENTIFIERTYPE__RECOMMENDED_invlist[] = {  /* for EBCDIC 104
        0xCE6,
        0xCF0,
        0xCF1,
-       0xCF3,
+       0xCF4,
        0xD00,
        0xD01,
        0xD02,
@@ -278413,7 +280739,7 @@ static const UV UNI_IDENTIFIERTYPE__RECOMMENDED_invlist[] = {  /* for EBCDIC 104
        0xEC6,
        0xEC7,
        0xEC8,
-       0xECE,
+       0xECF,
        0xED0,
        0xEDA,
        0xEDE,
@@ -278720,12 +281046,20 @@ static const UV UNI_IDENTIFIERTYPE__RECOMMENDED_invlist[] = {  /* for EBCDIC 104
        0x16FF2,
        0x1B11F,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
+       0x1E08F,
+       0x1E090,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -278737,7 +281071,7 @@ static const UV UNI_IDENTIFIERTYPE__RECOMMENDED_invlist[] = {  /* for EBCDIC 104
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -278745,7 +281079,9 @@ static const UV UNI_IDENTIFIERTYPE__RECOMMENDED_invlist[] = {  /* for EBCDIC 104
        0x2CEB0,
        0x2EBE1,
        0x30000,
-       0x3134B
+       0x3134B,
+       0x31350,
+       0x323B0
 };
 
 #  endif       /* EBCDIC 1047 */
@@ -278756,7 +281092,7 @@ static const UV UNI_IDENTIFIERTYPE__RECOMMENDED_invlist[] = {  /* for EBCDIC 104
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_IDENTIFIERTYPE__RECOMMENDED_invlist[] = {  /* for EBCDIC 037 */
-       787,    /* Number of elements */
+       797,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -279136,7 +281472,7 @@ static const UV UNI_IDENTIFIERTYPE__RECOMMENDED_invlist[] = {  /* for EBCDIC 037
        0xCE6,
        0xCF0,
        0xCF1,
-       0xCF3,
+       0xCF4,
        0xD00,
        0xD01,
        0xD02,
@@ -279214,7 +281550,7 @@ static const UV UNI_IDENTIFIERTYPE__RECOMMENDED_invlist[] = {  /* for EBCDIC 037
        0xEC6,
        0xEC7,
        0xEC8,
-       0xECE,
+       0xECF,
        0xED0,
        0xEDA,
        0xEDE,
@@ -279521,12 +281857,20 @@ static const UV UNI_IDENTIFIERTYPE__RECOMMENDED_invlist[] = {  /* for EBCDIC 037
        0x16FF2,
        0x1B11F,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
+       0x1E08F,
+       0x1E090,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -279538,7 +281882,7 @@ static const UV UNI_IDENTIFIERTYPE__RECOMMENDED_invlist[] = {  /* for EBCDIC 037
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -279546,7 +281890,9 @@ static const UV UNI_IDENTIFIERTYPE__RECOMMENDED_invlist[] = {  /* for EBCDIC 037
        0x2CEB0,
        0x2EBE1,
        0x30000,
-       0x3134B
+       0x3134B,
+       0x31350,
+       0x323B0
 };
 
 #  endif       /* EBCDIC 037 */
@@ -279758,7 +282104,7 @@ static const UV UNI_IDENTIFIERTYPE__TECHNICAL_invlist[] = {  /* for all charsets
 };
 
 static const UV UNI_IDENTIFIERTYPE__UNCOMMONUSE_invlist[] = {  /* for all charsets */
-       165,    /* Number of elements */
+       167,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -279913,6 +282259,8 @@ static const UV UNI_IDENTIFIERTYPE__UNCOMMONUSE_invlist[] = {  /* for all charse
        0xFE30,
        0x10780,
        0x10781,
+       0x10EFD,
+       0x10F00,
        0x16A40,
        0x16A5F,
        0x16A60,
@@ -279930,7 +282278,7 @@ static const UV UNI_IDENTIFIERTYPE__UNCOMMONUSE_invlist[] = {  /* for all charse
 };
 
 static const UV UNI_IDEO_invlist[] = {  /* for all charsets */
-       39,     /* Number of elements */
+       41,     /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -279962,7 +282310,7 @@ static const UV UNI_IDEO_invlist[] = {  /* for all charsets */
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -279972,7 +282320,9 @@ static const UV UNI_IDEO_invlist[] = {  /* for all charsets */
        0x2F800,
        0x2FA1E,
        0x30000,
-       0x3134B
+       0x3134B,
+       0x31350,
+       0x323B0
 };
 
 static const UV UNI_IDEOGRAPHICSYMBOLS_invlist[] = {  /* for all charsets */
@@ -279988,7 +282338,7 @@ static const UV UNI_IDEOGRAPHICSYMBOLS_invlist[] = {  /* for all charsets */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_IDS_invlist[] = {  /* for ASCII/Latin1 */
-       1297,   /* Number of elements */
+       1319,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -280929,6 +283279,8 @@ static const UV UNI_IDS_invlist[] = {  /* for ASCII/Latin1 */
        0x11212,
        0x11213,
        0x1122C,
+       0x1123F,
+       0x11241,
        0x11280,
        0x11287,
        0x11288,
@@ -281053,6 +283405,12 @@ static const UV UNI_IDS_invlist[] = {  /* for ASCII/Latin1 */
        0x11D99,
        0x11EE0,
        0x11EF3,
+       0x11F02,
+       0x11F03,
+       0x11F04,
+       0x11F11,
+       0x11F12,
+       0x11F34,
        0x11FB0,
        0x11FB1,
        0x12000,
@@ -281064,7 +283422,9 @@ static const UV UNI_IDS_invlist[] = {  /* for ASCII/Latin1 */
        0x12F90,
        0x12FF1,
        0x13000,
-       0x1342F,
+       0x13430,
+       0x13441,
+       0x13447,
        0x14400,
        0x14647,
        0x16800,
@@ -281109,8 +283469,12 @@ static const UV UNI_IDS_invlist[] = {  /* for ASCII/Latin1 */
        0x1AFFF,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -281185,6 +283549,10 @@ static const UV UNI_IDS_invlist[] = {  /* for ASCII/Latin1 */
        0x1D7CC,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
+       0x1E030,
+       0x1E06E,
        0x1E100,
        0x1E12D,
        0x1E137,
@@ -281195,6 +283563,8 @@ static const UV UNI_IDS_invlist[] = {  /* for ASCII/Latin1 */
        0x1E2AE,
        0x1E2C0,
        0x1E2EC,
+       0x1E4D0,
+       0x1E4EC,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -281278,7 +283648,7 @@ static const UV UNI_IDS_invlist[] = {  /* for ASCII/Latin1 */
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -281288,7 +283658,9 @@ static const UV UNI_IDS_invlist[] = {  /* for ASCII/Latin1 */
        0x2F800,
        0x2FA1E,
        0x30000,
-       0x3134B
+       0x3134B,
+       0x31350,
+       0x323B0
 };
 
 #  endif       /* ASCII/Latin1 */
@@ -281299,7 +283671,7 @@ static const UV UNI_IDS_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_IDS_invlist[] = {  /* for EBCDIC 1047 */
-       1323,   /* Number of elements */
+       1345,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -282266,6 +284638,8 @@ static const UV UNI_IDS_invlist[] = {  /* for EBCDIC 1047 */
        0x11212,
        0x11213,
        0x1122C,
+       0x1123F,
+       0x11241,
        0x11280,
        0x11287,
        0x11288,
@@ -282390,6 +284764,12 @@ static const UV UNI_IDS_invlist[] = {  /* for EBCDIC 1047 */
        0x11D99,
        0x11EE0,
        0x11EF3,
+       0x11F02,
+       0x11F03,
+       0x11F04,
+       0x11F11,
+       0x11F12,
+       0x11F34,
        0x11FB0,
        0x11FB1,
        0x12000,
@@ -282401,7 +284781,9 @@ static const UV UNI_IDS_invlist[] = {  /* for EBCDIC 1047 */
        0x12F90,
        0x12FF1,
        0x13000,
-       0x1342F,
+       0x13430,
+       0x13441,
+       0x13447,
        0x14400,
        0x14647,
        0x16800,
@@ -282446,8 +284828,12 @@ static const UV UNI_IDS_invlist[] = {  /* for EBCDIC 1047 */
        0x1AFFF,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -282522,6 +284908,10 @@ static const UV UNI_IDS_invlist[] = {  /* for EBCDIC 1047 */
        0x1D7CC,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
+       0x1E030,
+       0x1E06E,
        0x1E100,
        0x1E12D,
        0x1E137,
@@ -282532,6 +284922,8 @@ static const UV UNI_IDS_invlist[] = {  /* for EBCDIC 1047 */
        0x1E2AE,
        0x1E2C0,
        0x1E2EC,
+       0x1E4D0,
+       0x1E4EC,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -282615,7 +285007,7 @@ static const UV UNI_IDS_invlist[] = {  /* for EBCDIC 1047 */
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -282625,7 +285017,9 @@ static const UV UNI_IDS_invlist[] = {  /* for EBCDIC 1047 */
        0x2F800,
        0x2FA1E,
        0x30000,
-       0x3134B
+       0x3134B,
+       0x31350,
+       0x323B0
 };
 
 #  endif       /* EBCDIC 1047 */
@@ -282636,7 +285030,7 @@ static const UV UNI_IDS_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_IDS_invlist[] = {  /* for EBCDIC 037 */
-       1319,   /* Number of elements */
+       1341,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -283599,6 +285993,8 @@ static const UV UNI_IDS_invlist[] = {  /* for EBCDIC 037 */
        0x11212,
        0x11213,
        0x1122C,
+       0x1123F,
+       0x11241,
        0x11280,
        0x11287,
        0x11288,
@@ -283723,6 +286119,12 @@ static const UV UNI_IDS_invlist[] = {  /* for EBCDIC 037 */
        0x11D99,
        0x11EE0,
        0x11EF3,
+       0x11F02,
+       0x11F03,
+       0x11F04,
+       0x11F11,
+       0x11F12,
+       0x11F34,
        0x11FB0,
        0x11FB1,
        0x12000,
@@ -283734,7 +286136,9 @@ static const UV UNI_IDS_invlist[] = {  /* for EBCDIC 037 */
        0x12F90,
        0x12FF1,
        0x13000,
-       0x1342F,
+       0x13430,
+       0x13441,
+       0x13447,
        0x14400,
        0x14647,
        0x16800,
@@ -283779,8 +286183,12 @@ static const UV UNI_IDS_invlist[] = {  /* for EBCDIC 037 */
        0x1AFFF,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -283855,6 +286263,10 @@ static const UV UNI_IDS_invlist[] = {  /* for EBCDIC 037 */
        0x1D7CC,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
+       0x1E030,
+       0x1E06E,
        0x1E100,
        0x1E12D,
        0x1E137,
@@ -283865,6 +286277,8 @@ static const UV UNI_IDS_invlist[] = {  /* for EBCDIC 037 */
        0x1E2AE,
        0x1E2C0,
        0x1E2EC,
+       0x1E4D0,
+       0x1E4EC,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -283948,7 +286362,7 @@ static const UV UNI_IDS_invlist[] = {  /* for EBCDIC 037 */
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -283958,7 +286372,9 @@ static const UV UNI_IDS_invlist[] = {  /* for EBCDIC 037 */
        0x2F800,
        0x2FA1E,
        0x30000,
-       0x3134B
+       0x3134B,
+       0x31350,
+       0x323B0
 };
 
 #  endif       /* EBCDIC 037 */
@@ -287137,7 +289553,1362 @@ static const UV UNI_IN__11_invlist[] = {  /* for all charsets */
        0x1F100,
        0x1F10D,
        0x1F110,
-       0x1F16C,
+       0x1F16C,
+       0x1F170,
+       0x1F1AD,
+       0x1F1E6,
+       0x1F203,
+       0x1F210,
+       0x1F23C,
+       0x1F240,
+       0x1F249,
+       0x1F250,
+       0x1F252,
+       0x1F260,
+       0x1F266,
+       0x1F300,
+       0x1F6D5,
+       0x1F6E0,
+       0x1F6ED,
+       0x1F6F0,
+       0x1F6FA,
+       0x1F700,
+       0x1F774,
+       0x1F780,
+       0x1F7D9,
+       0x1F800,
+       0x1F80C,
+       0x1F810,
+       0x1F848,
+       0x1F850,
+       0x1F85A,
+       0x1F860,
+       0x1F888,
+       0x1F890,
+       0x1F8AE,
+       0x1F900,
+       0x1F90C,
+       0x1F910,
+       0x1F93F,
+       0x1F940,
+       0x1F971,
+       0x1F973,
+       0x1F977,
+       0x1F97A,
+       0x1F97B,
+       0x1F97C,
+       0x1F9A3,
+       0x1F9B0,
+       0x1F9BA,
+       0x1F9C0,
+       0x1F9C3,
+       0x1F9D0,
+       0x1FA00,
+       0x1FA60,
+       0x1FA6E,
+       0x1FFFE,
+       0x2A6D7,
+       0x2A700,
+       0x2B735,
+       0x2B740,
+       0x2B81E,
+       0x2B820,
+       0x2CEA2,
+       0x2CEB0,
+       0x2EBE1,
+       0x2F800,
+       0x2FA1E,
+       0x2FFFE,
+       0x30000,
+       0x3FFFE,
+       0x40000,
+       0x4FFFE,
+       0x50000,
+       0x5FFFE,
+       0x60000,
+       0x6FFFE,
+       0x70000,
+       0x7FFFE,
+       0x80000,
+       0x8FFFE,
+       0x90000,
+       0x9FFFE,
+       0xA0000,
+       0xAFFFE,
+       0xB0000,
+       0xBFFFE,
+       0xC0000,
+       0xCFFFE,
+       0xD0000,
+       0xDFFFE,
+       0xE0000,
+       0xE0001,
+       0xE0002,
+       0xE0020,
+       0xE0080,
+       0xE0100,
+       0xE01F0,
+       0xEFFFE,
+       0x110000
+};
+
+static const UV UNI_IN__12_invlist[] = {  /* for all charsets */
+       1354,   /* Number of elements */
+       148565664, /* Version and data structure type */
+       0,      /* 0 if the list starts at 0;
+                  1 if it starts at the element beyond 0 */
+       0x0,
+       0x378,
+       0x37A,
+       0x380,
+       0x384,
+       0x38B,
+       0x38C,
+       0x38D,
+       0x38E,
+       0x3A2,
+       0x3A3,
+       0x530,
+       0x531,
+       0x557,
+       0x559,
+       0x58B,
+       0x58D,
+       0x590,
+       0x591,
+       0x5C8,
+       0x5D0,
+       0x5EB,
+       0x5EF,
+       0x5F5,
+       0x600,
+       0x61D,
+       0x61E,
+       0x70E,
+       0x70F,
+       0x74B,
+       0x74D,
+       0x7B2,
+       0x7C0,
+       0x7FB,
+       0x7FD,
+       0x82E,
+       0x830,
+       0x83F,
+       0x840,
+       0x85C,
+       0x85E,
+       0x85F,
+       0x860,
+       0x86B,
+       0x8A0,
+       0x8B5,
+       0x8B6,
+       0x8BE,
+       0x8D3,
+       0x984,
+       0x985,
+       0x98D,
+       0x98F,
+       0x991,
+       0x993,
+       0x9A9,
+       0x9AA,
+       0x9B1,
+       0x9B2,
+       0x9B3,
+       0x9B6,
+       0x9BA,
+       0x9BC,
+       0x9C5,
+       0x9C7,
+       0x9C9,
+       0x9CB,
+       0x9CF,
+       0x9D7,
+       0x9D8,
+       0x9DC,
+       0x9DE,
+       0x9DF,
+       0x9E4,
+       0x9E6,
+       0x9FF,
+       0xA01,
+       0xA04,
+       0xA05,
+       0xA0B,
+       0xA0F,
+       0xA11,
+       0xA13,
+       0xA29,
+       0xA2A,
+       0xA31,
+       0xA32,
+       0xA34,
+       0xA35,
+       0xA37,
+       0xA38,
+       0xA3A,
+       0xA3C,
+       0xA3D,
+       0xA3E,
+       0xA43,
+       0xA47,
+       0xA49,
+       0xA4B,
+       0xA4E,
+       0xA51,
+       0xA52,
+       0xA59,
+       0xA5D,
+       0xA5E,
+       0xA5F,
+       0xA66,
+       0xA77,
+       0xA81,
+       0xA84,
+       0xA85,
+       0xA8E,
+       0xA8F,
+       0xA92,
+       0xA93,
+       0xAA9,
+       0xAAA,
+       0xAB1,
+       0xAB2,
+       0xAB4,
+       0xAB5,
+       0xABA,
+       0xABC,
+       0xAC6,
+       0xAC7,
+       0xACA,
+       0xACB,
+       0xACE,
+       0xAD0,
+       0xAD1,
+       0xAE0,
+       0xAE4,
+       0xAE6,
+       0xAF2,
+       0xAF9,
+       0xB00,
+       0xB01,
+       0xB04,
+       0xB05,
+       0xB0D,
+       0xB0F,
+       0xB11,
+       0xB13,
+       0xB29,
+       0xB2A,
+       0xB31,
+       0xB32,
+       0xB34,
+       0xB35,
+       0xB3A,
+       0xB3C,
+       0xB45,
+       0xB47,
+       0xB49,
+       0xB4B,
+       0xB4E,
+       0xB56,
+       0xB58,
+       0xB5C,
+       0xB5E,
+       0xB5F,
+       0xB64,
+       0xB66,
+       0xB78,
+       0xB82,
+       0xB84,
+       0xB85,
+       0xB8B,
+       0xB8E,
+       0xB91,
+       0xB92,
+       0xB96,
+       0xB99,
+       0xB9B,
+       0xB9C,
+       0xB9D,
+       0xB9E,
+       0xBA0,
+       0xBA3,
+       0xBA5,
+       0xBA8,
+       0xBAB,
+       0xBAE,
+       0xBBA,
+       0xBBE,
+       0xBC3,
+       0xBC6,
+       0xBC9,
+       0xBCA,
+       0xBCE,
+       0xBD0,
+       0xBD1,
+       0xBD7,
+       0xBD8,
+       0xBE6,
+       0xBFB,
+       0xC00,
+       0xC0D,
+       0xC0E,
+       0xC11,
+       0xC12,
+       0xC29,
+       0xC2A,
+       0xC3A,
+       0xC3D,
+       0xC45,
+       0xC46,
+       0xC49,
+       0xC4A,
+       0xC4E,
+       0xC55,
+       0xC57,
+       0xC58,
+       0xC5B,
+       0xC60,
+       0xC64,
+       0xC66,
+       0xC70,
+       0xC77,
+       0xC8D,
+       0xC8E,
+       0xC91,
+       0xC92,
+       0xCA9,
+       0xCAA,
+       0xCB4,
+       0xCB5,
+       0xCBA,
+       0xCBC,
+       0xCC5,
+       0xCC6,
+       0xCC9,
+       0xCCA,
+       0xCCE,
+       0xCD5,
+       0xCD7,
+       0xCDE,
+       0xCDF,
+       0xCE0,
+       0xCE4,
+       0xCE6,
+       0xCF0,
+       0xCF1,
+       0xCF3,
+       0xD00,
+       0xD04,
+       0xD05,
+       0xD0D,
+       0xD0E,
+       0xD11,
+       0xD12,
+       0xD45,
+       0xD46,
+       0xD49,
+       0xD4A,
+       0xD50,
+       0xD54,
+       0xD64,
+       0xD66,
+       0xD80,
+       0xD82,
+       0xD84,
+       0xD85,
+       0xD97,
+       0xD9A,
+       0xDB2,
+       0xDB3,
+       0xDBC,
+       0xDBD,
+       0xDBE,
+       0xDC0,
+       0xDC7,
+       0xDCA,
+       0xDCB,
+       0xDCF,
+       0xDD5,
+       0xDD6,
+       0xDD7,
+       0xDD8,
+       0xDE0,
+       0xDE6,
+       0xDF0,
+       0xDF2,
+       0xDF5,
+       0xE01,
+       0xE3B,
+       0xE3F,
+       0xE5C,
+       0xE81,
+       0xE83,
+       0xE84,
+       0xE85,
+       0xE86,
+       0xE8B,
+       0xE8C,
+       0xEA4,
+       0xEA5,
+       0xEA6,
+       0xEA7,
+       0xEBE,
+       0xEC0,
+       0xEC5,
+       0xEC6,
+       0xEC7,
+       0xEC8,
+       0xECE,
+       0xED0,
+       0xEDA,
+       0xEDC,
+       0xEE0,
+       0xF00,
+       0xF48,
+       0xF49,
+       0xF6D,
+       0xF71,
+       0xF98,
+       0xF99,
+       0xFBD,
+       0xFBE,
+       0xFCD,
+       0xFCE,
+       0xFDB,
+       0x1000,
+       0x10C6,
+       0x10C7,
+       0x10C8,
+       0x10CD,
+       0x10CE,
+       0x10D0,
+       0x1249,
+       0x124A,
+       0x124E,
+       0x1250,
+       0x1257,
+       0x1258,
+       0x1259,
+       0x125A,
+       0x125E,
+       0x1260,
+       0x1289,
+       0x128A,
+       0x128E,
+       0x1290,
+       0x12B1,
+       0x12B2,
+       0x12B6,
+       0x12B8,
+       0x12BF,
+       0x12C0,
+       0x12C1,
+       0x12C2,
+       0x12C6,
+       0x12C8,
+       0x12D7,
+       0x12D8,
+       0x1311,
+       0x1312,
+       0x1316,
+       0x1318,
+       0x135B,
+       0x135D,
+       0x137D,
+       0x1380,
+       0x139A,
+       0x13A0,
+       0x13F6,
+       0x13F8,
+       0x13FE,
+       0x1400,
+       0x169D,
+       0x16A0,
+       0x16F9,
+       0x1700,
+       0x170D,
+       0x170E,
+       0x1715,
+       0x1720,
+       0x1737,
+       0x1740,
+       0x1754,
+       0x1760,
+       0x176D,
+       0x176E,
+       0x1771,
+       0x1772,
+       0x1774,
+       0x1780,
+       0x17DE,
+       0x17E0,
+       0x17EA,
+       0x17F0,
+       0x17FA,
+       0x1800,
+       0x180F,
+       0x1810,
+       0x181A,
+       0x1820,
+       0x1879,
+       0x1880,
+       0x18AB,
+       0x18B0,
+       0x18F6,
+       0x1900,
+       0x191F,
+       0x1920,
+       0x192C,
+       0x1930,
+       0x193C,
+       0x1940,
+       0x1941,
+       0x1944,
+       0x196E,
+       0x1970,
+       0x1975,
+       0x1980,
+       0x19AC,
+       0x19B0,
+       0x19CA,
+       0x19D0,
+       0x19DB,
+       0x19DE,
+       0x1A1C,
+       0x1A1E,
+       0x1A5F,
+       0x1A60,
+       0x1A7D,
+       0x1A7F,
+       0x1A8A,
+       0x1A90,
+       0x1A9A,
+       0x1AA0,
+       0x1AAE,
+       0x1AB0,
+       0x1ABF,
+       0x1B00,
+       0x1B4C,
+       0x1B50,
+       0x1B7D,
+       0x1B80,
+       0x1BF4,
+       0x1BFC,
+       0x1C38,
+       0x1C3B,
+       0x1C4A,
+       0x1C4D,
+       0x1C89,
+       0x1C90,
+       0x1CBB,
+       0x1CBD,
+       0x1CC8,
+       0x1CD0,
+       0x1CFB,
+       0x1D00,
+       0x1DFA,
+       0x1DFB,
+       0x1F16,
+       0x1F18,
+       0x1F1E,
+       0x1F20,
+       0x1F46,
+       0x1F48,
+       0x1F4E,
+       0x1F50,
+       0x1F58,
+       0x1F59,
+       0x1F5A,
+       0x1F5B,
+       0x1F5C,
+       0x1F5D,
+       0x1F5E,
+       0x1F5F,
+       0x1F7E,
+       0x1F80,
+       0x1FB5,
+       0x1FB6,
+       0x1FC5,
+       0x1FC6,
+       0x1FD4,
+       0x1FD6,
+       0x1FDC,
+       0x1FDD,
+       0x1FF0,
+       0x1FF2,
+       0x1FF5,
+       0x1FF6,
+       0x1FFF,
+       0x2000,
+       0x2065,
+       0x2066,
+       0x2072,
+       0x2074,
+       0x208F,
+       0x2090,
+       0x209D,
+       0x20A0,
+       0x20C0,
+       0x20D0,
+       0x20F1,
+       0x2100,
+       0x218C,
+       0x2190,
+       0x2427,
+       0x2440,
+       0x244B,
+       0x2460,
+       0x2B74,
+       0x2B76,
+       0x2B96,
+       0x2B98,
+       0x2C2F,
+       0x2C30,
+       0x2C5F,
+       0x2C60,
+       0x2CF4,
+       0x2CF9,
+       0x2D26,
+       0x2D27,
+       0x2D28,
+       0x2D2D,
+       0x2D2E,
+       0x2D30,
+       0x2D68,
+       0x2D6F,
+       0x2D71,
+       0x2D7F,
+       0x2D97,
+       0x2DA0,
+       0x2DA7,
+       0x2DA8,
+       0x2DAF,
+       0x2DB0,
+       0x2DB7,
+       0x2DB8,
+       0x2DBF,
+       0x2DC0,
+       0x2DC7,
+       0x2DC8,
+       0x2DCF,
+       0x2DD0,
+       0x2DD7,
+       0x2DD8,
+       0x2DDF,
+       0x2DE0,
+       0x2E50,
+       0x2E80,
+       0x2E9A,
+       0x2E9B,
+       0x2EF4,
+       0x2F00,
+       0x2FD6,
+       0x2FF0,
+       0x2FFC,
+       0x3000,
+       0x3040,
+       0x3041,
+       0x3097,
+       0x3099,
+       0x3100,
+       0x3105,
+       0x3130,
+       0x3131,
+       0x318F,
+       0x3190,
+       0x31BB,
+       0x31C0,
+       0x31E4,
+       0x31F0,
+       0x321F,
+       0x3220,
+       0x32FF,
+       0x3300,
+       0x4DB6,
+       0x4DC0,
+       0x9FF0,
+       0xA000,
+       0xA48D,
+       0xA490,
+       0xA4C7,
+       0xA4D0,
+       0xA62C,
+       0xA640,
+       0xA6F8,
+       0xA700,
+       0xA7C0,
+       0xA7C2,
+       0xA7C7,
+       0xA7F7,
+       0xA82C,
+       0xA830,
+       0xA83A,
+       0xA840,
+       0xA878,
+       0xA880,
+       0xA8C6,
+       0xA8CE,
+       0xA8DA,
+       0xA8E0,
+       0xA954,
+       0xA95F,
+       0xA97D,
+       0xA980,
+       0xA9CE,
+       0xA9CF,
+       0xA9DA,
+       0xA9DE,
+       0xA9FF,
+       0xAA00,
+       0xAA37,
+       0xAA40,
+       0xAA4E,
+       0xAA50,
+       0xAA5A,
+       0xAA5C,
+       0xAAC3,
+       0xAADB,
+       0xAAF7,
+       0xAB01,
+       0xAB07,
+       0xAB09,
+       0xAB0F,
+       0xAB11,
+       0xAB17,
+       0xAB20,
+       0xAB27,
+       0xAB28,
+       0xAB2F,
+       0xAB30,
+       0xAB68,
+       0xAB70,
+       0xABEE,
+       0xABF0,
+       0xABFA,
+       0xAC00,
+       0xD7A4,
+       0xD7B0,
+       0xD7C7,
+       0xD7CB,
+       0xD7FC,
+       0xD800,
+       0xFA6E,
+       0xFA70,
+       0xFADA,
+       0xFB00,
+       0xFB07,
+       0xFB13,
+       0xFB18,
+       0xFB1D,
+       0xFB37,
+       0xFB38,
+       0xFB3D,
+       0xFB3E,
+       0xFB3F,
+       0xFB40,
+       0xFB42,
+       0xFB43,
+       0xFB45,
+       0xFB46,
+       0xFBC2,
+       0xFBD3,
+       0xFD40,
+       0xFD50,
+       0xFD90,
+       0xFD92,
+       0xFDC8,
+       0xFDD0,
+       0xFDFE,
+       0xFE00,
+       0xFE1A,
+       0xFE20,
+       0xFE53,
+       0xFE54,
+       0xFE67,
+       0xFE68,
+       0xFE6C,
+       0xFE70,
+       0xFE75,
+       0xFE76,
+       0xFEFD,
+       0xFEFF,
+       0xFF00,
+       0xFF01,
+       0xFFBF,
+       0xFFC2,
+       0xFFC8,
+       0xFFCA,
+       0xFFD0,
+       0xFFD2,
+       0xFFD8,
+       0xFFDA,
+       0xFFDD,
+       0xFFE0,
+       0xFFE7,
+       0xFFE8,
+       0xFFEF,
+       0xFFF9,
+       0x1000C,
+       0x1000D,
+       0x10027,
+       0x10028,
+       0x1003B,
+       0x1003C,
+       0x1003E,
+       0x1003F,
+       0x1004E,
+       0x10050,
+       0x1005E,
+       0x10080,
+       0x100FB,
+       0x10100,
+       0x10103,
+       0x10107,
+       0x10134,
+       0x10137,
+       0x1018F,
+       0x10190,
+       0x1019C,
+       0x101A0,
+       0x101A1,
+       0x101D0,
+       0x101FE,
+       0x10280,
+       0x1029D,
+       0x102A0,
+       0x102D1,
+       0x102E0,
+       0x102FC,
+       0x10300,
+       0x10324,
+       0x1032D,
+       0x1034B,
+       0x10350,
+       0x1037B,
+       0x10380,
+       0x1039E,
+       0x1039F,
+       0x103C4,
+       0x103C8,
+       0x103D6,
+       0x10400,
+       0x1049E,
+       0x104A0,
+       0x104AA,
+       0x104B0,
+       0x104D4,
+       0x104D8,
+       0x104FC,
+       0x10500,
+       0x10528,
+       0x10530,
+       0x10564,
+       0x1056F,
+       0x10570,
+       0x10600,
+       0x10737,
+       0x10740,
+       0x10756,
+       0x10760,
+       0x10768,
+       0x10800,
+       0x10806,
+       0x10808,
+       0x10809,
+       0x1080A,
+       0x10836,
+       0x10837,
+       0x10839,
+       0x1083C,
+       0x1083D,
+       0x1083F,
+       0x10856,
+       0x10857,
+       0x1089F,
+       0x108A7,
+       0x108B0,
+       0x108E0,
+       0x108F3,
+       0x108F4,
+       0x108F6,
+       0x108FB,
+       0x1091C,
+       0x1091F,
+       0x1093A,
+       0x1093F,
+       0x10940,
+       0x10980,
+       0x109B8,
+       0x109BC,
+       0x109D0,
+       0x109D2,
+       0x10A04,
+       0x10A05,
+       0x10A07,
+       0x10A0C,
+       0x10A14,
+       0x10A15,
+       0x10A18,
+       0x10A19,
+       0x10A36,
+       0x10A38,
+       0x10A3B,
+       0x10A3F,
+       0x10A49,
+       0x10A50,
+       0x10A59,
+       0x10A60,
+       0x10AA0,
+       0x10AC0,
+       0x10AE7,
+       0x10AEB,
+       0x10AF7,
+       0x10B00,
+       0x10B36,
+       0x10B39,
+       0x10B56,
+       0x10B58,
+       0x10B73,
+       0x10B78,
+       0x10B92,
+       0x10B99,
+       0x10B9D,
+       0x10BA9,
+       0x10BB0,
+       0x10C00,
+       0x10C49,
+       0x10C80,
+       0x10CB3,
+       0x10CC0,
+       0x10CF3,
+       0x10CFA,
+       0x10D28,
+       0x10D30,
+       0x10D3A,
+       0x10E60,
+       0x10E7F,
+       0x10F00,
+       0x10F28,
+       0x10F30,
+       0x10F5A,
+       0x10FE0,
+       0x10FF7,
+       0x11000,
+       0x1104E,
+       0x11052,
+       0x11070,
+       0x1107F,
+       0x110C2,
+       0x110CD,
+       0x110CE,
+       0x110D0,
+       0x110E9,
+       0x110F0,
+       0x110FA,
+       0x11100,
+       0x11135,
+       0x11136,
+       0x11147,
+       0x11150,
+       0x11177,
+       0x11180,
+       0x111CE,
+       0x111D0,
+       0x111E0,
+       0x111E1,
+       0x111F5,
+       0x11200,
+       0x11212,
+       0x11213,
+       0x1123F,
+       0x11280,
+       0x11287,
+       0x11288,
+       0x11289,
+       0x1128A,
+       0x1128E,
+       0x1128F,
+       0x1129E,
+       0x1129F,
+       0x112AA,
+       0x112B0,
+       0x112EB,
+       0x112F0,
+       0x112FA,
+       0x11300,
+       0x11304,
+       0x11305,
+       0x1130D,
+       0x1130F,
+       0x11311,
+       0x11313,
+       0x11329,
+       0x1132A,
+       0x11331,
+       0x11332,
+       0x11334,
+       0x11335,
+       0x1133A,
+       0x1133B,
+       0x11345,
+       0x11347,
+       0x11349,
+       0x1134B,
+       0x1134E,
+       0x11350,
+       0x11351,
+       0x11357,
+       0x11358,
+       0x1135D,
+       0x11364,
+       0x11366,
+       0x1136D,
+       0x11370,
+       0x11375,
+       0x11400,
+       0x1145A,
+       0x1145B,
+       0x1145C,
+       0x1145D,
+       0x11460,
+       0x11480,
+       0x114C8,
+       0x114D0,
+       0x114DA,
+       0x11580,
+       0x115B6,
+       0x115B8,
+       0x115DE,
+       0x11600,
+       0x11645,
+       0x11650,
+       0x1165A,
+       0x11660,
+       0x1166D,
+       0x11680,
+       0x116B9,
+       0x116C0,
+       0x116CA,
+       0x11700,
+       0x1171B,
+       0x1171D,
+       0x1172C,
+       0x11730,
+       0x11740,
+       0x11800,
+       0x1183C,
+       0x118A0,
+       0x118F3,
+       0x118FF,
+       0x11900,
+       0x119A0,
+       0x119A8,
+       0x119AA,
+       0x119D8,
+       0x119DA,
+       0x119E5,
+       0x11A00,
+       0x11A48,
+       0x11A50,
+       0x11AA3,
+       0x11AC0,
+       0x11AF9,
+       0x11C00,
+       0x11C09,
+       0x11C0A,
+       0x11C37,
+       0x11C38,
+       0x11C46,
+       0x11C50,
+       0x11C6D,
+       0x11C70,
+       0x11C90,
+       0x11C92,
+       0x11CA8,
+       0x11CA9,
+       0x11CB7,
+       0x11D00,
+       0x11D07,
+       0x11D08,
+       0x11D0A,
+       0x11D0B,
+       0x11D37,
+       0x11D3A,
+       0x11D3B,
+       0x11D3C,
+       0x11D3E,
+       0x11D3F,
+       0x11D48,
+       0x11D50,
+       0x11D5A,
+       0x11D60,
+       0x11D66,
+       0x11D67,
+       0x11D69,
+       0x11D6A,
+       0x11D8F,
+       0x11D90,
+       0x11D92,
+       0x11D93,
+       0x11D99,
+       0x11DA0,
+       0x11DAA,
+       0x11EE0,
+       0x11EF9,
+       0x11FC0,
+       0x11FF2,
+       0x11FFF,
+       0x1239A,
+       0x12400,
+       0x1246F,
+       0x12470,
+       0x12475,
+       0x12480,
+       0x12544,
+       0x13000,
+       0x1342F,
+       0x13430,
+       0x13439,
+       0x14400,
+       0x14647,
+       0x16800,
+       0x16A39,
+       0x16A40,
+       0x16A5F,
+       0x16A60,
+       0x16A6A,
+       0x16A6E,
+       0x16A70,
+       0x16AD0,
+       0x16AEE,
+       0x16AF0,
+       0x16AF6,
+       0x16B00,
+       0x16B46,
+       0x16B50,
+       0x16B5A,
+       0x16B5B,
+       0x16B62,
+       0x16B63,
+       0x16B78,
+       0x16B7D,
+       0x16B90,
+       0x16E40,
+       0x16E9B,
+       0x16F00,
+       0x16F4B,
+       0x16F4F,
+       0x16F88,
+       0x16F8F,
+       0x16FA0,
+       0x16FE0,
+       0x16FE4,
+       0x17000,
+       0x187F8,
+       0x18800,
+       0x18AF3,
+       0x1B000,
+       0x1B11F,
+       0x1B150,
+       0x1B153,
+       0x1B164,
+       0x1B168,
+       0x1B170,
+       0x1B2FC,
+       0x1BC00,
+       0x1BC6B,
+       0x1BC70,
+       0x1BC7D,
+       0x1BC80,
+       0x1BC89,
+       0x1BC90,
+       0x1BC9A,
+       0x1BC9C,
+       0x1BCA4,
+       0x1D000,
+       0x1D0F6,
+       0x1D100,
+       0x1D127,
+       0x1D129,
+       0x1D1E9,
+       0x1D200,
+       0x1D246,
+       0x1D2E0,
+       0x1D2F4,
+       0x1D300,
+       0x1D357,
+       0x1D360,
+       0x1D379,
+       0x1D400,
+       0x1D455,
+       0x1D456,
+       0x1D49D,
+       0x1D49E,
+       0x1D4A0,
+       0x1D4A2,
+       0x1D4A3,
+       0x1D4A5,
+       0x1D4A7,
+       0x1D4A9,
+       0x1D4AD,
+       0x1D4AE,
+       0x1D4BA,
+       0x1D4BB,
+       0x1D4BC,
+       0x1D4BD,
+       0x1D4C4,
+       0x1D4C5,
+       0x1D506,
+       0x1D507,
+       0x1D50B,
+       0x1D50D,
+       0x1D515,
+       0x1D516,
+       0x1D51D,
+       0x1D51E,
+       0x1D53A,
+       0x1D53B,
+       0x1D53F,
+       0x1D540,
+       0x1D545,
+       0x1D546,
+       0x1D547,
+       0x1D54A,
+       0x1D551,
+       0x1D552,
+       0x1D6A6,
+       0x1D6A8,
+       0x1D7CC,
+       0x1D7CE,
+       0x1DA8C,
+       0x1DA9B,
+       0x1DAA0,
+       0x1DAA1,
+       0x1DAB0,
+       0x1E000,
+       0x1E007,
+       0x1E008,
+       0x1E019,
+       0x1E01B,
+       0x1E022,
+       0x1E023,
+       0x1E025,
+       0x1E026,
+       0x1E02B,
+       0x1E100,
+       0x1E12D,
+       0x1E130,
+       0x1E13E,
+       0x1E140,
+       0x1E14A,
+       0x1E14E,
+       0x1E150,
+       0x1E2C0,
+       0x1E2FA,
+       0x1E2FF,
+       0x1E300,
+       0x1E800,
+       0x1E8C5,
+       0x1E8C7,
+       0x1E8D7,
+       0x1E900,
+       0x1E94C,
+       0x1E950,
+       0x1E95A,
+       0x1E95E,
+       0x1E960,
+       0x1EC71,
+       0x1ECB5,
+       0x1ED01,
+       0x1ED3E,
+       0x1EE00,
+       0x1EE04,
+       0x1EE05,
+       0x1EE20,
+       0x1EE21,
+       0x1EE23,
+       0x1EE24,
+       0x1EE25,
+       0x1EE27,
+       0x1EE28,
+       0x1EE29,
+       0x1EE33,
+       0x1EE34,
+       0x1EE38,
+       0x1EE39,
+       0x1EE3A,
+       0x1EE3B,
+       0x1EE3C,
+       0x1EE42,
+       0x1EE43,
+       0x1EE47,
+       0x1EE48,
+       0x1EE49,
+       0x1EE4A,
+       0x1EE4B,
+       0x1EE4C,
+       0x1EE4D,
+       0x1EE50,
+       0x1EE51,
+       0x1EE53,
+       0x1EE54,
+       0x1EE55,
+       0x1EE57,
+       0x1EE58,
+       0x1EE59,
+       0x1EE5A,
+       0x1EE5B,
+       0x1EE5C,
+       0x1EE5D,
+       0x1EE5E,
+       0x1EE5F,
+       0x1EE60,
+       0x1EE61,
+       0x1EE63,
+       0x1EE64,
+       0x1EE65,
+       0x1EE67,
+       0x1EE6B,
+       0x1EE6C,
+       0x1EE73,
+       0x1EE74,
+       0x1EE78,
+       0x1EE79,
+       0x1EE7D,
+       0x1EE7E,
+       0x1EE7F,
+       0x1EE80,
+       0x1EE8A,
+       0x1EE8B,
+       0x1EE9C,
+       0x1EEA1,
+       0x1EEA4,
+       0x1EEA5,
+       0x1EEAA,
+       0x1EEAB,
+       0x1EEBC,
+       0x1EEF0,
+       0x1EEF2,
+       0x1F000,
+       0x1F02C,
+       0x1F030,
+       0x1F094,
+       0x1F0A0,
+       0x1F0AF,
+       0x1F0B1,
+       0x1F0C0,
+       0x1F0C1,
+       0x1F0D0,
+       0x1F0D1,
+       0x1F0F6,
+       0x1F100,
+       0x1F10D,
+       0x1F110,
+       0x1F16D,
        0x1F170,
        0x1F1AD,
        0x1F1E6,
@@ -287151,15 +290922,17 @@ static const UV UNI_IN__11_invlist[] = {  /* for all charsets */
        0x1F260,
        0x1F266,
        0x1F300,
-       0x1F6D5,
+       0x1F6D6,
        0x1F6E0,
        0x1F6ED,
        0x1F6F0,
-       0x1F6FA,
+       0x1F6FB,
        0x1F700,
        0x1F774,
        0x1F780,
        0x1F7D9,
+       0x1F7E0,
+       0x1F7EC,
        0x1F800,
        0x1F80C,
        0x1F810,
@@ -287172,24 +290945,28 @@ static const UV UNI_IN__11_invlist[] = {  /* for all charsets */
        0x1F8AE,
        0x1F900,
        0x1F90C,
-       0x1F910,
-       0x1F93F,
-       0x1F940,
-       0x1F971,
+       0x1F90D,
+       0x1F972,
        0x1F973,
        0x1F977,
        0x1F97A,
-       0x1F97B,
-       0x1F97C,
        0x1F9A3,
-       0x1F9B0,
-       0x1F9BA,
-       0x1F9C0,
-       0x1F9C3,
-       0x1F9D0,
-       0x1FA00,
+       0x1F9A5,
+       0x1F9AB,
+       0x1F9AE,
+       0x1F9CB,
+       0x1F9CD,
+       0x1FA54,
        0x1FA60,
        0x1FA6E,
+       0x1FA70,
+       0x1FA74,
+       0x1FA78,
+       0x1FA7B,
+       0x1FA80,
+       0x1FA83,
+       0x1FA90,
+       0x1FA96,
        0x1FFFE,
        0x2A6D7,
        0x2A700,
@@ -287236,8 +291013,8 @@ static const UV UNI_IN__11_invlist[] = {  /* for all charsets */
        0x110000
 };
 
-static const UV UNI_IN__12_invlist[] = {  /* for all charsets */
-       1354,   /* Number of elements */
+static const UV UNI_IN__12_DOT_1_invlist[] = {  /* for all charsets */
+       1352,   /* Number of elements */
        148565664, /* Version and data structure type */
        0,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -287810,8 +291587,6 @@ static const UV UNI_IN__12_invlist[] = {  /* for all charsets */
        0x31F0,
        0x321F,
        0x3220,
-       0x32FF,
-       0x3300,
        0x4DB6,
        0x4DC0,
        0x9FF0,
@@ -288597,8 +292372,8 @@ static const UV UNI_IN__12_invlist[] = {  /* for all charsets */
        0x110000
 };
 
-static const UV UNI_IN__12_DOT_1_invlist[] = {  /* for all charsets */
-       1352,   /* Number of elements */
+static const UV UNI_IN__13_invlist[] = {  /* for all charsets */
+       1372,   /* Number of elements */
        148565664, /* Version and data structure type */
        0,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -288649,7 +292424,7 @@ static const UV UNI_IN__12_DOT_1_invlist[] = {  /* for all charsets */
        0x8A0,
        0x8B5,
        0x8B6,
-       0x8BE,
+       0x8C8,
        0x8D3,
        0x984,
        0x985,
@@ -288758,7 +292533,7 @@ static const UV UNI_IN__12_DOT_1_invlist[] = {  /* for all charsets */
        0xB49,
        0xB4B,
        0xB4E,
-       0xB56,
+       0xB55,
        0xB58,
        0xB5C,
        0xB5E,
@@ -288847,8 +292622,6 @@ static const UV UNI_IN__12_DOT_1_invlist[] = {  /* for all charsets */
        0xCF1,
        0xCF3,
        0xD00,
-       0xD04,
-       0xD05,
        0xD0D,
        0xD0E,
        0xD11,
@@ -288862,7 +292635,7 @@ static const UV UNI_IN__12_DOT_1_invlist[] = {  /* for all charsets */
        0xD64,
        0xD66,
        0xD80,
-       0xD82,
+       0xD81,
        0xD84,
        0xD85,
        0xD97,
@@ -289035,7 +292808,7 @@ static const UV UNI_IN__12_DOT_1_invlist[] = {  /* for all charsets */
        0x1AA0,
        0x1AAE,
        0x1AB0,
-       0x1ABF,
+       0x1AC1,
        0x1B00,
        0x1B4C,
        0x1B50,
@@ -289110,7 +292883,7 @@ static const UV UNI_IN__12_DOT_1_invlist[] = {  /* for all charsets */
        0x2B74,
        0x2B76,
        0x2B96,
-       0x2B98,
+       0x2B97,
        0x2C2F,
        0x2C30,
        0x2C5F,
@@ -289145,7 +292918,7 @@ static const UV UNI_IN__12_DOT_1_invlist[] = {  /* for all charsets */
        0x2DD8,
        0x2DDF,
        0x2DE0,
-       0x2E50,
+       0x2E53,
        0x2E80,
        0x2E9A,
        0x2E9B,
@@ -289165,15 +292938,11 @@ static const UV UNI_IN__12_DOT_1_invlist[] = {  /* for all charsets */
        0x3131,
        0x318F,
        0x3190,
-       0x31BB,
-       0x31C0,
        0x31E4,
        0x31F0,
        0x321F,
        0x3220,
-       0x4DB6,
-       0x4DC0,
-       0x9FF0,
+       0x9FFD,
        0xA000,
        0xA48D,
        0xA490,
@@ -289185,9 +292954,9 @@ static const UV UNI_IN__12_DOT_1_invlist[] = {  /* for all charsets */
        0xA700,
        0xA7C0,
        0xA7C2,
-       0xA7C7,
-       0xA7F7,
-       0xA82C,
+       0xA7CB,
+       0xA7F5,
+       0xA82D,
        0xA830,
        0xA83A,
        0xA840,
@@ -289227,7 +292996,7 @@ static const UV UNI_IN__12_DOT_1_invlist[] = {  /* for all charsets */
        0xAB28,
        0xAB2F,
        0xAB30,
-       0xAB68,
+       0xAB6C,
        0xAB70,
        0xABEE,
        0xABF0,
@@ -289315,7 +293084,7 @@ static const UV UNI_IN__12_DOT_1_invlist[] = {  /* for all charsets */
        0x10137,
        0x1018F,
        0x10190,
-       0x1019C,
+       0x1019D,
        0x101A0,
        0x101A1,
        0x101D0,
@@ -289434,10 +293203,18 @@ static const UV UNI_IN__12_DOT_1_invlist[] = {  /* for all charsets */
        0x10D3A,
        0x10E60,
        0x10E7F,
+       0x10E80,
+       0x10EAA,
+       0x10EAB,
+       0x10EAE,
+       0x10EB0,
+       0x10EB2,
        0x10F00,
        0x10F28,
        0x10F30,
        0x10F5A,
+       0x10FB0,
+       0x10FCC,
        0x10FE0,
        0x10FF7,
        0x11000,
@@ -289455,12 +293232,10 @@ static const UV UNI_IN__12_DOT_1_invlist[] = {  /* for all charsets */
        0x11100,
        0x11135,
        0x11136,
-       0x11147,
+       0x11148,
        0x11150,
        0x11177,
        0x11180,
-       0x111CE,
-       0x111D0,
        0x111E0,
        0x111E1,
        0x111F5,
@@ -289513,11 +293288,9 @@ static const UV UNI_IN__12_DOT_1_invlist[] = {  /* for all charsets */
        0x11370,
        0x11375,
        0x11400,
-       0x1145A,
-       0x1145B,
        0x1145C,
        0x1145D,
-       0x11460,
+       0x11462,
        0x11480,
        0x114C8,
        0x114D0,
@@ -289547,7 +293320,21 @@ static const UV UNI_IN__12_DOT_1_invlist[] = {  /* for all charsets */
        0x118A0,
        0x118F3,
        0x118FF,
-       0x11900,
+       0x11907,
+       0x11909,
+       0x1190A,
+       0x1190C,
+       0x11914,
+       0x11915,
+       0x11917,
+       0x11918,
+       0x11936,
+       0x11937,
+       0x11939,
+       0x1193B,
+       0x11947,
+       0x11950,
+       0x1195A,
        0x119A0,
        0x119A8,
        0x119AA,
@@ -289602,6 +293389,8 @@ static const UV UNI_IN__12_DOT_1_invlist[] = {  /* for all charsets */
        0x11DAA,
        0x11EE0,
        0x11EF9,
+       0x11FB0,
+       0x11FB1,
        0x11FC0,
        0x11FF2,
        0x11FFF,
@@ -289649,11 +293438,15 @@ static const UV UNI_IN__12_DOT_1_invlist[] = {  /* for all charsets */
        0x16F8F,
        0x16FA0,
        0x16FE0,
-       0x16FE4,
+       0x16FE5,
+       0x16FF0,
+       0x16FF2,
        0x17000,
        0x187F8,
        0x18800,
-       0x18AF3,
+       0x18CD6,
+       0x18D00,
+       0x18D09,
        0x1B000,
        0x1B11F,
        0x1B150,
@@ -289849,11 +293642,7 @@ static const UV UNI_IN__12_DOT_1_invlist[] = {  /* for all charsets */
        0x1F0D1,
        0x1F0F6,
        0x1F100,
-       0x1F10D,
-       0x1F110,
-       0x1F16D,
-       0x1F170,
-       0x1F1AD,
+       0x1F1AE,
        0x1F1E6,
        0x1F203,
        0x1F210,
@@ -289865,11 +293654,11 @@ static const UV UNI_IN__12_DOT_1_invlist[] = {  /* for all charsets */
        0x1F260,
        0x1F266,
        0x1F300,
-       0x1F6D6,
+       0x1F6D8,
        0x1F6E0,
        0x1F6ED,
        0x1F6F0,
-       0x1F6FB,
+       0x1F6FD,
        0x1F700,
        0x1F774,
        0x1F780,
@@ -289886,32 +293675,38 @@ static const UV UNI_IN__12_DOT_1_invlist[] = {  /* for all charsets */
        0x1F888,
        0x1F890,
        0x1F8AE,
+       0x1F8B0,
+       0x1F8B2,
        0x1F900,
-       0x1F90C,
-       0x1F90D,
-       0x1F972,
-       0x1F973,
-       0x1F977,
+       0x1F979,
        0x1F97A,
-       0x1F9A3,
-       0x1F9A5,
-       0x1F9AB,
-       0x1F9AE,
-       0x1F9CB,
+       0x1F9CC,
        0x1F9CD,
        0x1FA54,
        0x1FA60,
        0x1FA6E,
        0x1FA70,
-       0x1FA74,
+       0x1FA75,
        0x1FA78,
        0x1FA7B,
        0x1FA80,
-       0x1FA83,
+       0x1FA87,
        0x1FA90,
-       0x1FA96,
+       0x1FAA9,
+       0x1FAB0,
+       0x1FAB7,
+       0x1FAC0,
+       0x1FAC3,
+       0x1FAD0,
+       0x1FAD7,
+       0x1FB00,
+       0x1FB93,
+       0x1FB94,
+       0x1FBCB,
+       0x1FBF0,
+       0x1FBFA,
        0x1FFFE,
-       0x2A6D7,
+       0x2A6DE,
        0x2A700,
        0x2B735,
        0x2B740,
@@ -289923,7 +293718,7 @@ static const UV UNI_IN__12_DOT_1_invlist[] = {  /* for all charsets */
        0x2F800,
        0x2FA1E,
        0x2FFFE,
-       0x30000,
+       0x3134B,
        0x3FFFE,
        0x40000,
        0x4FFFE,
@@ -289956,8 +293751,8 @@ static const UV UNI_IN__12_DOT_1_invlist[] = {  /* for all charsets */
        0x110000
 };
 
-static const UV UNI_IN__13_invlist[] = {  /* for all charsets */
-       1372,   /* Number of elements */
+static const UV UNI_IN__14_invlist[] = {  /* for all charsets */
+       1412,   /* Number of elements */
        148565664, /* Version and data structure type */
        0,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -289986,8 +293781,6 @@ static const UV UNI_IN__13_invlist[] = {  /* for all charsets */
        0x5EF,
        0x5F5,
        0x600,
-       0x61D,
-       0x61E,
        0x70E,
        0x70F,
        0x74B,
@@ -290005,11 +293798,11 @@ static const UV UNI_IN__13_invlist[] = {  /* for all charsets */
        0x85F,
        0x860,
        0x86B,
-       0x8A0,
-       0x8B5,
-       0x8B6,
-       0x8C8,
-       0x8D3,
+       0x870,
+       0x88F,
+       0x890,
+       0x892,
+       0x898,
        0x984,
        0x985,
        0x98D,
@@ -290165,7 +293958,7 @@ static const UV UNI_IN__13_invlist[] = {  /* for all charsets */
        0xC29,
        0xC2A,
        0xC3A,
-       0xC3D,
+       0xC3C,
        0xC45,
        0xC46,
        0xC49,
@@ -290175,6 +293968,8 @@ static const UV UNI_IN__13_invlist[] = {  /* for all charsets */
        0xC57,
        0xC58,
        0xC5B,
+       0xC5D,
+       0xC5E,
        0xC60,
        0xC64,
        0xC66,
@@ -290197,7 +293992,7 @@ static const UV UNI_IN__13_invlist[] = {  /* for all charsets */
        0xCCE,
        0xCD5,
        0xCD7,
-       0xCDE,
+       0xCDD,
        0xCDF,
        0xCE0,
        0xCE4,
@@ -290332,10 +294127,8 @@ static const UV UNI_IN__13_invlist[] = {  /* for all charsets */
        0x16A0,
        0x16F9,
        0x1700,
-       0x170D,
-       0x170E,
-       0x1715,
-       0x1720,
+       0x1716,
+       0x171F,
        0x1737,
        0x1740,
        0x1754,
@@ -290352,8 +294145,6 @@ static const UV UNI_IN__13_invlist[] = {  /* for all charsets */
        0x17F0,
        0x17FA,
        0x1800,
-       0x180F,
-       0x1810,
        0x181A,
        0x1820,
        0x1879,
@@ -290392,11 +294183,11 @@ static const UV UNI_IN__13_invlist[] = {  /* for all charsets */
        0x1AA0,
        0x1AAE,
        0x1AB0,
-       0x1AC1,
+       0x1ACF,
        0x1B00,
-       0x1B4C,
+       0x1B4D,
        0x1B50,
-       0x1B7D,
+       0x1B7F,
        0x1B80,
        0x1BF4,
        0x1BFC,
@@ -290412,8 +294203,6 @@ static const UV UNI_IN__13_invlist[] = {  /* for all charsets */
        0x1CD0,
        0x1CFB,
        0x1D00,
-       0x1DFA,
-       0x1DFB,
        0x1F16,
        0x1F18,
        0x1F1E,
@@ -290454,7 +294243,7 @@ static const UV UNI_IN__13_invlist[] = {  /* for all charsets */
        0x2090,
        0x209D,
        0x20A0,
-       0x20C0,
+       0x20C1,
        0x20D0,
        0x20F1,
        0x2100,
@@ -290468,10 +294257,6 @@ static const UV UNI_IN__13_invlist[] = {  /* for all charsets */
        0x2B76,
        0x2B96,
        0x2B97,
-       0x2C2F,
-       0x2C30,
-       0x2C5F,
-       0x2C60,
        0x2CF4,
        0x2CF9,
        0x2D26,
@@ -290502,7 +294287,7 @@ static const UV UNI_IN__13_invlist[] = {  /* for all charsets */
        0x2DD8,
        0x2DDF,
        0x2DE0,
-       0x2E53,
+       0x2E5E,
        0x2E80,
        0x2E9A,
        0x2E9B,
@@ -290526,8 +294311,6 @@ static const UV UNI_IN__13_invlist[] = {  /* for all charsets */
        0x31F0,
        0x321F,
        0x3220,
-       0x9FFD,
-       0xA000,
        0xA48D,
        0xA490,
        0xA4C7,
@@ -290536,10 +294319,14 @@ static const UV UNI_IN__13_invlist[] = {  /* for all charsets */
        0xA640,
        0xA6F8,
        0xA700,
-       0xA7C0,
-       0xA7C2,
        0xA7CB,
-       0xA7F5,
+       0xA7D0,
+       0xA7D2,
+       0xA7D3,
+       0xA7D4,
+       0xA7D5,
+       0xA7DA,
+       0xA7F2,
        0xA82D,
        0xA830,
        0xA83A,
@@ -290610,16 +294397,12 @@ static const UV UNI_IN__13_invlist[] = {  /* for all charsets */
        0xFB43,
        0xFB45,
        0xFB46,
-       0xFBC2,
+       0xFBC3,
        0xFBD3,
-       0xFD40,
-       0xFD50,
        0xFD90,
        0xFD92,
        0xFDC8,
-       0xFDD0,
-       0xFDFE,
-       0xFE00,
+       0xFDCF,
        0xFE1A,
        0xFE20,
        0xFE53,
@@ -290704,13 +294487,33 @@ static const UV UNI_IN__13_invlist[] = {  /* for all charsets */
        0x10530,
        0x10564,
        0x1056F,
-       0x10570,
+       0x1057B,
+       0x1057C,
+       0x1058B,
+       0x1058C,
+       0x10593,
+       0x10594,
+       0x10596,
+       0x10597,
+       0x105A2,
+       0x105A3,
+       0x105B2,
+       0x105B3,
+       0x105BA,
+       0x105BB,
+       0x105BD,
        0x10600,
        0x10737,
        0x10740,
        0x10756,
        0x10760,
        0x10768,
+       0x10780,
+       0x10786,
+       0x10787,
+       0x107B1,
+       0x107B2,
+       0x107BB,
        0x10800,
        0x10806,
        0x10808,
@@ -290797,6 +294600,8 @@ static const UV UNI_IN__13_invlist[] = {  /* for all charsets */
        0x10F28,
        0x10F30,
        0x10F5A,
+       0x10F70,
+       0x10F8A,
        0x10FB0,
        0x10FCC,
        0x10FE0,
@@ -290804,9 +294609,9 @@ static const UV UNI_IN__13_invlist[] = {  /* for all charsets */
        0x11000,
        0x1104E,
        0x11052,
-       0x11070,
+       0x11076,
        0x1107F,
-       0x110C2,
+       0x110C3,
        0x110CD,
        0x110CE,
        0x110D0,
@@ -290890,7 +294695,7 @@ static const UV UNI_IN__13_invlist[] = {  /* for all charsets */
        0x11660,
        0x1166D,
        0x11680,
-       0x116B9,
+       0x116BA,
        0x116C0,
        0x116CA,
        0x11700,
@@ -290898,7 +294703,7 @@ static const UV UNI_IN__13_invlist[] = {  /* for all charsets */
        0x1171D,
        0x1172C,
        0x11730,
-       0x11740,
+       0x11747,
        0x11800,
        0x1183C,
        0x118A0,
@@ -290929,7 +294734,7 @@ static const UV UNI_IN__13_invlist[] = {  /* for all charsets */
        0x11A48,
        0x11A50,
        0x11AA3,
-       0x11AC0,
+       0x11AB0,
        0x11AF9,
        0x11C00,
        0x11C09,
@@ -290985,6 +294790,8 @@ static const UV UNI_IN__13_invlist[] = {  /* for all charsets */
        0x12475,
        0x12480,
        0x12544,
+       0x12F90,
+       0x12FF3,
        0x13000,
        0x1342F,
        0x13430,
@@ -290998,7 +294805,9 @@ static const UV UNI_IN__13_invlist[] = {  /* for all charsets */
        0x16A60,
        0x16A6A,
        0x16A6E,
-       0x16A70,
+       0x16ABF,
+       0x16AC0,
+       0x16ACA,
        0x16AD0,
        0x16AEE,
        0x16AF0,
@@ -291031,8 +294840,14 @@ static const UV UNI_IN__13_invlist[] = {  /* for all charsets */
        0x18CD6,
        0x18D00,
        0x18D09,
+       0x1AFF0,
+       0x1AFF4,
+       0x1AFF5,
+       0x1AFFC,
+       0x1AFFD,
+       0x1AFFF,
        0x1B000,
-       0x1B11F,
+       0x1B123,
        0x1B150,
        0x1B153,
        0x1B164,
@@ -291049,12 +294864,18 @@ static const UV UNI_IN__13_invlist[] = {  /* for all charsets */
        0x1BC9A,
        0x1BC9C,
        0x1BCA4,
+       0x1CF00,
+       0x1CF2E,
+       0x1CF30,
+       0x1CF47,
+       0x1CF50,
+       0x1CFC4,
        0x1D000,
        0x1D0F6,
        0x1D100,
        0x1D127,
        0x1D129,
-       0x1D1E9,
+       0x1D1EB,
        0x1D200,
        0x1D246,
        0x1D2E0,
@@ -291109,6 +294930,8 @@ static const UV UNI_IN__13_invlist[] = {  /* for all charsets */
        0x1DAA0,
        0x1DAA1,
        0x1DAB0,
+       0x1DF00,
+       0x1DF1F,
        0x1E000,
        0x1E007,
        0x1E008,
@@ -291127,10 +294950,20 @@ static const UV UNI_IN__13_invlist[] = {  /* for all charsets */
        0x1E14A,
        0x1E14E,
        0x1E150,
+       0x1E290,
+       0x1E2AF,
        0x1E2C0,
        0x1E2FA,
        0x1E2FF,
        0x1E300,
+       0x1E7E0,
+       0x1E7E7,
+       0x1E7E8,
+       0x1E7EC,
+       0x1E7ED,
+       0x1E7EF,
+       0x1E7F0,
+       0x1E7FF,
        0x1E800,
        0x1E8C5,
        0x1E8C7,
@@ -291239,7 +295072,7 @@ static const UV UNI_IN__13_invlist[] = {  /* for all charsets */
        0x1F266,
        0x1F300,
        0x1F6D8,
-       0x1F6E0,
+       0x1F6DD,
        0x1F6ED,
        0x1F6F0,
        0x1F6FD,
@@ -291249,6 +295082,8 @@ static const UV UNI_IN__13_invlist[] = {  /* for all charsets */
        0x1F7D9,
        0x1F7E0,
        0x1F7EC,
+       0x1F7F0,
+       0x1F7F1,
        0x1F800,
        0x1F80C,
        0x1F810,
@@ -291262,27 +295097,27 @@ static const UV UNI_IN__13_invlist[] = {  /* for all charsets */
        0x1F8B0,
        0x1F8B2,
        0x1F900,
-       0x1F979,
-       0x1F97A,
-       0x1F9CC,
-       0x1F9CD,
        0x1FA54,
        0x1FA60,
        0x1FA6E,
        0x1FA70,
        0x1FA75,
        0x1FA78,
-       0x1FA7B,
+       0x1FA7D,
        0x1FA80,
        0x1FA87,
        0x1FA90,
-       0x1FAA9,
+       0x1FAAD,
        0x1FAB0,
-       0x1FAB7,
+       0x1FABB,
        0x1FAC0,
-       0x1FAC3,
+       0x1FAC6,
        0x1FAD0,
-       0x1FAD7,
+       0x1FADA,
+       0x1FAE0,
+       0x1FAE8,
+       0x1FAF0,
+       0x1FAF7,
        0x1FB00,
        0x1FB93,
        0x1FB94,
@@ -291290,9 +295125,9 @@ static const UV UNI_IN__13_invlist[] = {  /* for all charsets */
        0x1FBF0,
        0x1FBFA,
        0x1FFFE,
-       0x2A6DE,
+       0x2A6E0,
        0x2A700,
-       0x2B735,
+       0x2B739,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -291335,8 +295170,8 @@ static const UV UNI_IN__13_invlist[] = {  /* for all charsets */
        0x110000
 };
 
-static const UV UNI_IN__14_invlist[] = {  /* for all charsets */
-       1412,   /* Number of elements */
+static const UV UNI_IN__15_invlist[] = {  /* for all charsets */
+       1430,   /* Number of elements */
        148565664, /* Version and data structure type */
        0,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -291583,7 +295418,7 @@ static const UV UNI_IN__14_invlist[] = {  /* for all charsets */
        0xCE6,
        0xCF0,
        0xCF1,
-       0xCF3,
+       0xCF4,
        0xD00,
        0xD0D,
        0xD0E,
@@ -291643,7 +295478,7 @@ static const UV UNI_IN__14_invlist[] = {  /* for all charsets */
        0xEC6,
        0xEC7,
        0xEC8,
-       0xECE,
+       0xECF,
        0xED0,
        0xEDA,
        0xEDC,
@@ -292180,7 +296015,7 @@ static const UV UNI_IN__14_invlist[] = {  /* for all charsets */
        0x10EAE,
        0x10EB0,
        0x10EB2,
-       0x10F00,
+       0x10EFD,
        0x10F28,
        0x10F30,
        0x10F5A,
@@ -292215,7 +296050,7 @@ static const UV UNI_IN__14_invlist[] = {  /* for all charsets */
        0x11200,
        0x11212,
        0x11213,
-       0x1123F,
+       0x11242,
        0x11280,
        0x11287,
        0x11288,
@@ -292320,6 +296155,8 @@ static const UV UNI_IN__14_invlist[] = {  /* for all charsets */
        0x11AA3,
        0x11AB0,
        0x11AF9,
+       0x11B00,
+       0x11B0A,
        0x11C00,
        0x11C09,
        0x11C0A,
@@ -292362,6 +296199,12 @@ static const UV UNI_IN__14_invlist[] = {  /* for all charsets */
        0x11DAA,
        0x11EE0,
        0x11EF9,
+       0x11F00,
+       0x11F11,
+       0x11F12,
+       0x11F3B,
+       0x11F3E,
+       0x11F5A,
        0x11FB0,
        0x11FB1,
        0x11FC0,
@@ -292377,9 +296220,7 @@ static const UV UNI_IN__14_invlist[] = {  /* for all charsets */
        0x12F90,
        0x12FF3,
        0x13000,
-       0x1342F,
-       0x13430,
-       0x13439,
+       0x13456,
        0x14400,
        0x14647,
        0x16800,
@@ -292432,8 +296273,12 @@ static const UV UNI_IN__14_invlist[] = {  /* for all charsets */
        0x1AFFF,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -292462,6 +296307,8 @@ static const UV UNI_IN__14_invlist[] = {  /* for all charsets */
        0x1D1EB,
        0x1D200,
        0x1D246,
+       0x1D2C0,
+       0x1D2D4,
        0x1D2E0,
        0x1D2F4,
        0x1D300,
@@ -292516,6 +296363,8 @@ static const UV UNI_IN__14_invlist[] = {  /* for all charsets */
        0x1DAB0,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
        0x1E000,
        0x1E007,
        0x1E008,
@@ -292526,6 +296375,10 @@ static const UV UNI_IN__14_invlist[] = {  /* for all charsets */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E030,
+       0x1E06E,
+       0x1E08F,
+       0x1E090,
        0x1E100,
        0x1E12D,
        0x1E130,
@@ -292540,6 +296393,8 @@ static const UV UNI_IN__14_invlist[] = {  /* for all charsets */
        0x1E2FA,
        0x1E2FF,
        0x1E300,
+       0x1E4D0,
+       0x1E4FA,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -292656,14 +296511,14 @@ static const UV UNI_IN__14_invlist[] = {  /* for all charsets */
        0x1F266,
        0x1F300,
        0x1F6D8,
-       0x1F6DD,
+       0x1F6DC,
        0x1F6ED,
        0x1F6F0,
        0x1F6FD,
        0x1F700,
-       0x1F774,
-       0x1F780,
-       0x1F7D9,
+       0x1F777,
+       0x1F77B,
+       0x1F7DA,
        0x1F7E0,
        0x1F7EC,
        0x1F7F0,
@@ -292685,23 +296540,19 @@ static const UV UNI_IN__14_invlist[] = {  /* for all charsets */
        0x1FA60,
        0x1FA6E,
        0x1FA70,
-       0x1FA75,
-       0x1FA78,
        0x1FA7D,
        0x1FA80,
-       0x1FA87,
+       0x1FA89,
        0x1FA90,
-       0x1FAAD,
-       0x1FAB0,
-       0x1FABB,
-       0x1FAC0,
+       0x1FABE,
+       0x1FABF,
        0x1FAC6,
-       0x1FAD0,
-       0x1FADA,
+       0x1FACE,
+       0x1FADC,
        0x1FAE0,
-       0x1FAE8,
+       0x1FAE9,
        0x1FAF0,
-       0x1FAF7,
+       0x1FAF9,
        0x1FB00,
        0x1FB93,
        0x1FB94,
@@ -292711,7 +296562,7 @@ static const UV UNI_IN__14_invlist[] = {  /* for all charsets */
        0x1FFFE,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -292722,6 +296573,8 @@ static const UV UNI_IN__14_invlist[] = {  /* for all charsets */
        0x2FA1E,
        0x2FFFE,
        0x3134B,
+       0x31350,
+       0x323B0,
        0x3FFFE,
        0x40000,
        0x4FFFE,
@@ -309000,7 +312853,7 @@ static const UV UNI_IN__9_invlist[] = {  /* for all charsets */
 };
 
 static const UV UNI_IN__NA_invlist[] = {  /* for all charsets */
-       1412,   /* Number of elements */
+       1430,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -309247,7 +313100,7 @@ static const UV UNI_IN__NA_invlist[] = {  /* for all charsets */
        0xCE6,
        0xCF0,
        0xCF1,
-       0xCF3,
+       0xCF4,
        0xD00,
        0xD0D,
        0xD0E,
@@ -309307,7 +313160,7 @@ static const UV UNI_IN__NA_invlist[] = {  /* for all charsets */
        0xEC6,
        0xEC7,
        0xEC8,
-       0xECE,
+       0xECF,
        0xED0,
        0xEDA,
        0xEDC,
@@ -309844,7 +313697,7 @@ static const UV UNI_IN__NA_invlist[] = {  /* for all charsets */
        0x10EAE,
        0x10EB0,
        0x10EB2,
-       0x10F00,
+       0x10EFD,
        0x10F28,
        0x10F30,
        0x10F5A,
@@ -309879,7 +313732,7 @@ static const UV UNI_IN__NA_invlist[] = {  /* for all charsets */
        0x11200,
        0x11212,
        0x11213,
-       0x1123F,
+       0x11242,
        0x11280,
        0x11287,
        0x11288,
@@ -309984,6 +313837,8 @@ static const UV UNI_IN__NA_invlist[] = {  /* for all charsets */
        0x11AA3,
        0x11AB0,
        0x11AF9,
+       0x11B00,
+       0x11B0A,
        0x11C00,
        0x11C09,
        0x11C0A,
@@ -310026,6 +313881,12 @@ static const UV UNI_IN__NA_invlist[] = {  /* for all charsets */
        0x11DAA,
        0x11EE0,
        0x11EF9,
+       0x11F00,
+       0x11F11,
+       0x11F12,
+       0x11F3B,
+       0x11F3E,
+       0x11F5A,
        0x11FB0,
        0x11FB1,
        0x11FC0,
@@ -310041,9 +313902,7 @@ static const UV UNI_IN__NA_invlist[] = {  /* for all charsets */
        0x12F90,
        0x12FF3,
        0x13000,
-       0x1342F,
-       0x13430,
-       0x13439,
+       0x13456,
        0x14400,
        0x14647,
        0x16800,
@@ -310096,8 +313955,12 @@ static const UV UNI_IN__NA_invlist[] = {  /* for all charsets */
        0x1AFFF,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -310126,6 +313989,8 @@ static const UV UNI_IN__NA_invlist[] = {  /* for all charsets */
        0x1D1EB,
        0x1D200,
        0x1D246,
+       0x1D2C0,
+       0x1D2D4,
        0x1D2E0,
        0x1D2F4,
        0x1D300,
@@ -310180,6 +314045,8 @@ static const UV UNI_IN__NA_invlist[] = {  /* for all charsets */
        0x1DAB0,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
        0x1E000,
        0x1E007,
        0x1E008,
@@ -310190,6 +314057,10 @@ static const UV UNI_IN__NA_invlist[] = {  /* for all charsets */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E030,
+       0x1E06E,
+       0x1E08F,
+       0x1E090,
        0x1E100,
        0x1E12D,
        0x1E130,
@@ -310204,6 +314075,8 @@ static const UV UNI_IN__NA_invlist[] = {  /* for all charsets */
        0x1E2FA,
        0x1E2FF,
        0x1E300,
+       0x1E4D0,
+       0x1E4FA,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -310320,14 +314193,14 @@ static const UV UNI_IN__NA_invlist[] = {  /* for all charsets */
        0x1F266,
        0x1F300,
        0x1F6D8,
-       0x1F6DD,
+       0x1F6DC,
        0x1F6ED,
        0x1F6F0,
        0x1F6FD,
        0x1F700,
-       0x1F774,
-       0x1F780,
-       0x1F7D9,
+       0x1F777,
+       0x1F77B,
+       0x1F7DA,
        0x1F7E0,
        0x1F7EC,
        0x1F7F0,
@@ -310349,23 +314222,19 @@ static const UV UNI_IN__NA_invlist[] = {  /* for all charsets */
        0x1FA60,
        0x1FA6E,
        0x1FA70,
-       0x1FA75,
-       0x1FA78,
        0x1FA7D,
        0x1FA80,
-       0x1FA87,
+       0x1FA89,
        0x1FA90,
-       0x1FAAD,
-       0x1FAB0,
-       0x1FABB,
-       0x1FAC0,
+       0x1FABE,
+       0x1FABF,
        0x1FAC6,
-       0x1FAD0,
-       0x1FADA,
+       0x1FACE,
+       0x1FADC,
        0x1FAE0,
-       0x1FAE8,
+       0x1FAE9,
        0x1FAF0,
-       0x1FAF7,
+       0x1FAF9,
        0x1FB00,
        0x1FB93,
        0x1FB94,
@@ -310375,7 +314244,7 @@ static const UV UNI_IN__NA_invlist[] = {  /* for all charsets */
        0x1FFFE,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -310386,6 +314255,8 @@ static const UV UNI_IN__NA_invlist[] = {  /* for all charsets */
        0x2FA1E,
        0x2FFFE,
        0x3134B,
+       0x31350,
+       0x323B0,
        0x3FFFE,
        0x40000,
        0x4FFFE,
@@ -310998,6 +314869,16 @@ static const UV UNI_INKATAKANA_invlist[] = {  /* for all charsets */
        0x3100
 };
 
+static const UV UNI_INKAWI_invlist[] = {  /* for all charsets */
+       3,      /* Number of elements */
+       148565664, /* Version and data structure type */
+       1,      /* 0 if the list starts at 0;
+                  1 if it starts at the element beyond 0 */
+       0x0,
+       0x11F00,
+       0x11F60
+};
+
 static const UV UNI_INKHAROSHTHI_invlist[] = {  /* for all charsets */
        3,      /* Number of elements */
        148565664, /* Version and data structure type */
@@ -311298,6 +315179,16 @@ static const UV UNI_INNABATAEAN_invlist[] = {  /* for all charsets */
        0x108B0
 };
 
+static const UV UNI_INNAGMUNDARI_invlist[] = {  /* for all charsets */
+       3,      /* Number of elements */
+       148565664, /* Version and data structure type */
+       1,      /* 0 if the list starts at 0;
+                  1 if it starts at the element beyond 0 */
+       0x0,
+       0x1E4D0,
+       0x1E500
+};
+
 static const UV UNI_INNANDINAGARI_invlist[] = {  /* for all charsets */
        3,      /* Number of elements */
        148565664, /* Version and data structure type */
@@ -311489,7 +315380,7 @@ static const UV UNI_INPAUCINHAU_invlist[] = {  /* for all charsets */
 };
 
 static const UV UNI_INPC__BOTTOM_invlist[] = {  /* for all charsets */
-       291,    /* Number of elements */
+       295,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -311704,6 +315595,8 @@ static const UV UNI_INPC__BOTTOM_invlist[] = {  /* for all charsets */
        0x111CD,
        0x1122F,
        0x11230,
+       0x11241,
+       0x11242,
        0x112E3,
        0x112E5,
        0x112E9,
@@ -311783,7 +315676,9 @@ static const UV UNI_INPC__BOTTOM_invlist[] = {  /* for all charsets */
        0x11D47,
        0x11D48,
        0x11EF4,
-       0x11EF5
+       0x11EF5,
+       0x11F38,
+       0x11F3B
 };
 
 static const UV UNI_INPC__BOTTOMANDLEFT_invlist[] = {  /* for all charsets */
@@ -311813,7 +315708,7 @@ static const UV UNI_INPC__BOTTOMANDRIGHT_invlist[] = {  /* for all charsets */
 };
 
 static const UV UNI_INPC__LEFT_invlist[] = {  /* for all charsets */
-       95,     /* Number of elements */
+       97,     /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -311911,7 +315806,9 @@ static const UV UNI_INPC__LEFT_invlist[] = {  /* for all charsets */
        0x11CB1,
        0x11CB2,
        0x11EF5,
-       0x11EF6
+       0x11EF6,
+       0x11F3E,
+       0x11F40
 };
 
 static const UV UNI_INPC__LEFTANDRIGHT_invlist[] = {  /* for all charsets */
@@ -311951,7 +315848,7 @@ static const UV UNI_INPC__LEFTANDRIGHT_invlist[] = {  /* for all charsets */
 };
 
 static const UV UNI_INPC__NA_invlist[] = {  /* for all charsets */
-       429,    /* Number of elements */
+       441,    /* Number of elements */
        148565664, /* Version and data structure type */
        0,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -311963,6 +315860,8 @@ static const UV UNI_INPC__NA_invlist[] = {  /* for all charsets */
        0x93E,
        0x950,
        0x951,
+       0x953,
+       0x955,
        0x958,
        0x962,
        0x964,
@@ -312064,6 +315963,8 @@ static const UV UNI_INPC__NA_invlist[] = {  /* for all charsets */
        0xCD7,
        0xCE2,
        0xCE4,
+       0xCF3,
+       0xCF4,
        0xD00,
        0xD04,
        0xD3B,
@@ -312101,7 +316002,7 @@ static const UV UNI_INPC__NA_invlist[] = {  /* for all charsets */
        0xEC0,
        0xEC5,
        0xEC8,
-       0xECE,
+       0xECF,
        0xF18,
        0xF1A,
        0xF35,
@@ -312220,7 +316121,7 @@ static const UV UNI_INPC__NA_invlist[] = {  /* for all charsets */
        0xA8F2,
        0xA8FF,
        0xA900,
-       0xA92B,
+       0xA926,
        0xA92E,
        0xA947,
        0xA954,
@@ -312296,6 +316197,8 @@ static const UV UNI_INPC__NA_invlist[] = {  /* for all charsets */
        0x11238,
        0x1123E,
        0x1123F,
+       0x11241,
+       0x11242,
        0x112DF,
        0x112EB,
        0x11300,
@@ -312383,7 +316286,13 @@ static const UV UNI_INPC__NA_invlist[] = {  /* for all charsets */
        0x11D93,
        0x11D97,
        0x11EF3,
-       0x11EF7
+       0x11EF7,
+       0x11F00,
+       0x11F04,
+       0x11F34,
+       0x11F3B,
+       0x11F3E,
+       0x11F42
 };
 
 static const UV UNI_INPC__OVERSTRUCK_invlist[] = {  /* for all charsets */
@@ -312403,7 +316312,7 @@ static const UV UNI_INPC__OVERSTRUCK_invlist[] = {  /* for all charsets */
 };
 
 static const UV UNI_INPC__RIGHT_invlist[] = {  /* for all charsets */
-       333,    /* Number of elements */
+       341,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -312466,6 +316375,8 @@ static const UV UNI_INPC__RIGHT_invlist[] = {  /* for all charsets */
        0xCC5,
        0xCD5,
        0xCD7,
+       0xCF3,
+       0xCF4,
        0xD02,
        0xD04,
        0xD3E,
@@ -312739,11 +316650,17 @@ static const UV UNI_INPC__RIGHT_invlist[] = {  /* for all charsets */
        0x11D96,
        0x11D97,
        0x11EF6,
-       0x11EF7
+       0x11EF7,
+       0x11F03,
+       0x11F04,
+       0x11F34,
+       0x11F36,
+       0x11F41,
+       0x11F42
 };
 
 static const UV UNI_INPC__TOP_invlist[] = {  /* for all charsets */
-       391,    /* Number of elements */
+       399,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -312756,7 +316673,7 @@ static const UV UNI_INPC__TOP_invlist[] = {  /* for all charsets */
        0x949,
        0x951,
        0x952,
-       0x953,
+       0x955,
        0x956,
        0x981,
        0x982,
@@ -312835,7 +316752,7 @@ static const UV UNI_INPC__TOP_invlist[] = {  /* for all charsets */
        0xEBB,
        0xEBC,
        0xEC8,
-       0xECE,
+       0xECF,
        0xF39,
        0xF3A,
        0xF72,
@@ -312954,6 +316871,8 @@ static const UV UNI_INPC__TOP_invlist[] = {  /* for all charsets */
        0xA8F2,
        0xA8FF,
        0xA900,
+       0xA926,
+       0xA92B,
        0xA94A,
        0xA94B,
        0xA94F,
@@ -313137,7 +317056,13 @@ static const UV UNI_INPC__TOP_invlist[] = {  /* for all charsets */
        0x11D95,
        0x11D96,
        0x11EF3,
-       0x11EF4
+       0x11EF4,
+       0x11F00,
+       0x11F03,
+       0x11F36,
+       0x11F38,
+       0x11F40,
+       0x11F41
 };
 
 static const UV UNI_INPC__TOPANDBOTTOM_invlist[] = {  /* for all charsets */
@@ -313367,7 +317292,7 @@ static const UV UNI_INSC__AVAGRAHA_invlist[] = {  /* for all charsets */
 };
 
 static const UV UNI_INSC__BINDU_invlist[] = {  /* for all charsets */
-       113,    /* Number of elements */
+       117,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -313394,6 +317319,8 @@ static const UV UNI_INSC__BINDU_invlist[] = {  /* for all charsets */
        0xC05,
        0xC80,
        0xC83,
+       0xCF3,
+       0xCF4,
        0xD00,
        0xD03,
        0xD04,
@@ -313483,7 +317410,9 @@ static const UV UNI_INSC__BINDU_invlist[] = {  /* for all charsets */
        0x11D40,
        0x11D41,
        0x11D95,
-       0x11D96
+       0x11D96,
+       0x11F00,
+       0x11F02
 };
 
 static const UV UNI_INSC__BRAHMIJOININGNUMBER_invlist[] = {  /* for all charsets */
@@ -313497,7 +317426,7 @@ static const UV UNI_INSC__BRAHMIJOININGNUMBER_invlist[] = {  /* for all charsets
 };
 
 static const UV UNI_INSC__CANTILLATIONMARK_invlist[] = {  /* for all charsets */
-       25,     /* Number of elements */
+       27,     /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -313507,6 +317436,8 @@ static const UV UNI_INSC__CANTILLATIONMARK_invlist[] = {  /* for all charsets */
        0xA51,
        0xA52,
        0xAFA,
+       0xAFB,
+       0xAFC,
        0xAFD,
        0x1CD0,
        0x1CD3,
@@ -313529,7 +317460,7 @@ static const UV UNI_INSC__CANTILLATIONMARK_invlist[] = {  /* for all charsets */
 };
 
 static const UV UNI_INSC__CONSONANT_invlist[] = {  /* for all charsets */
-       311,    /* Number of elements */
+       315,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -313784,6 +317715,8 @@ static const UV UNI_INSC__CONSONANT_invlist[] = {  /* for all charsets */
        0x11212,
        0x11213,
        0x1122C,
+       0x1123F,
+       0x11240,
        0x11284,
        0x11287,
        0x11288,
@@ -313843,7 +317776,9 @@ static const UV UNI_INSC__CONSONANT_invlist[] = {  /* for all charsets */
        0x11D6C,
        0x11D8A,
        0x11EE0,
-       0x11EF2
+       0x11EF2,
+       0x11F12,
+       0x11F34
 };
 
 static const UV UNI_INSC__CONSONANTDEAD_invlist[] = {  /* for all charsets */
@@ -314103,7 +318038,7 @@ static const UV UNI_INSC__CONSONANTPLACEHOLDER_invlist[] = {  /* for EBCDIC 037
 #  endif       /* EBCDIC 037 */
 
 static const UV UNI_INSC__CONSONANTPRECEDINGREPHA_invlist[] = {  /* for all charsets */
-       7,      /* Number of elements */
+       9,      /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -314113,7 +318048,9 @@ static const UV UNI_INSC__CONSONANTPRECEDINGREPHA_invlist[] = {  /* for all char
        0x11941,
        0x11942,
        0x11D46,
-       0x11D47
+       0x11D47,
+       0x11F02,
+       0x11F03
 };
 
 static const UV UNI_INSC__CONSONANTPREFIXED_invlist[] = {  /* for all charsets */
@@ -314191,13 +318128,15 @@ static const UV UNI_INSC__CONSONANTWITHSTACKER_invlist[] = {  /* for all charset
 };
 
 static const UV UNI_INSC__GEMINATIONMARK_invlist[] = {  /* for all charsets */
-       7,      /* Number of elements */
+       9,      /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
        0x0,
        0xA71,
        0xA72,
+       0xAFB,
+       0xAFC,
        0x11237,
        0x11238,
        0x11A98,
@@ -314205,7 +318144,7 @@ static const UV UNI_INSC__GEMINATIONMARK_invlist[] = {  /* for all charsets */
 };
 
 static const UV UNI_INSC__INVISIBLESTACKER_invlist[] = {  /* for all charsets */
-       25,     /* Number of elements */
+       27,     /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -314233,7 +318172,9 @@ static const UV UNI_INSC__INVISIBLESTACKER_invlist[] = {  /* for all charsets */
        0x11D45,
        0x11D46,
        0x11D97,
-       0x11D98
+       0x11D98,
+       0x11F42,
+       0x11F43
 };
 
 static const UV UNI_INSC__MODIFYINGLETTER_invlist[] = {  /* for all charsets */
@@ -314321,7 +318262,7 @@ static const UV UNI_INSC__NUKTA_invlist[] = {  /* for all charsets */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_INSC__NUMBER_invlist[] = {  /* for ASCII/Latin1 */
-       91,     /* Number of elements */
+       93,     /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -314415,7 +318356,9 @@ static const UV UNI_INSC__NUMBER_invlist[] = {  /* for ASCII/Latin1 */
        0x11D50,
        0x11D5A,
        0x11DA0,
-       0x11DAA
+       0x11DAA,
+       0x11F50,
+       0x11F5A
 };
 
 #  endif       /* ASCII/Latin1 */
@@ -314426,7 +318369,7 @@ static const UV UNI_INSC__NUMBER_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_INSC__NUMBER_invlist[] = {  /* for EBCDIC 1047 */
-       91,     /* Number of elements */
+       93,     /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -314520,7 +318463,9 @@ static const UV UNI_INSC__NUMBER_invlist[] = {  /* for EBCDIC 1047 */
        0x11D50,
        0x11D5A,
        0x11DA0,
-       0x11DAA
+       0x11DAA,
+       0x11F50,
+       0x11F5A
 };
 
 #  endif       /* EBCDIC 1047 */
@@ -314531,7 +318476,7 @@ static const UV UNI_INSC__NUMBER_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_INSC__NUMBER_invlist[] = {  /* for EBCDIC 037 */
-       91,     /* Number of elements */
+       93,     /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -314625,7 +318570,9 @@ static const UV UNI_INSC__NUMBER_invlist[] = {  /* for EBCDIC 037 */
        0x11D50,
        0x11D5A,
        0x11DA0,
-       0x11DAA
+       0x11DAA,
+       0x11F50,
+       0x11F5A
 };
 
 #  endif       /* EBCDIC 037 */
@@ -314643,7 +318590,7 @@ static const UV UNI_INSC__NUMBERJOINER_invlist[] = {  /* for all charsets */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_INSC__OTHER_invlist[] = {  /* for ASCII/Latin1 */
-       647,    /* Number of elements */
+       655,    /* Number of elements */
        148565664, /* Version and data structure type */
        0,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -314869,7 +318816,7 @@ static const UV UNI_INSC__OTHER_invlist[] = {  /* for ASCII/Latin1 */
        0xCE6,
        0xCF0,
        0xCF1,
-       0xCF3,
+       0xCF4,
        0xD00,
        0xD0D,
        0xD0E,
@@ -314941,7 +318888,7 @@ static const UV UNI_INSC__OTHER_invlist[] = {  /* for ASCII/Latin1 */
        0xEC8,
        0xECC,
        0xECD,
-       0xECE,
+       0xECF,
        0xED0,
        0xEDA,
        0xEDC,
@@ -315141,7 +319088,7 @@ static const UV UNI_INSC__OTHER_invlist[] = {  /* for ASCII/Latin1 */
        0x11213,
        0x11238,
        0x1123E,
-       0x1123F,
+       0x11242,
        0x11280,
        0x11287,
        0x11288,
@@ -315293,7 +319240,15 @@ static const UV UNI_INSC__OTHER_invlist[] = {  /* for ASCII/Latin1 */
        0x11DA0,
        0x11DAA,
        0x11EE0,
-       0x11EF7
+       0x11EF7,
+       0x11F00,
+       0x11F11,
+       0x11F12,
+       0x11F3B,
+       0x11F3E,
+       0x11F43,
+       0x11F50,
+       0x11F5A
 };
 
 #  endif       /* ASCII/Latin1 */
@@ -315304,7 +319259,7 @@ static const UV UNI_INSC__OTHER_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_INSC__OTHER_invlist[] = {  /* for EBCDIC 1047 */
-       647,    /* Number of elements */
+       655,    /* Number of elements */
        148565664, /* Version and data structure type */
        0,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -315530,7 +319485,7 @@ static const UV UNI_INSC__OTHER_invlist[] = {  /* for EBCDIC 1047 */
        0xCE6,
        0xCF0,
        0xCF1,
-       0xCF3,
+       0xCF4,
        0xD00,
        0xD0D,
        0xD0E,
@@ -315602,7 +319557,7 @@ static const UV UNI_INSC__OTHER_invlist[] = {  /* for EBCDIC 1047 */
        0xEC8,
        0xECC,
        0xECD,
-       0xECE,
+       0xECF,
        0xED0,
        0xEDA,
        0xEDC,
@@ -315802,7 +319757,7 @@ static const UV UNI_INSC__OTHER_invlist[] = {  /* for EBCDIC 1047 */
        0x11213,
        0x11238,
        0x1123E,
-       0x1123F,
+       0x11242,
        0x11280,
        0x11287,
        0x11288,
@@ -315954,7 +319909,15 @@ static const UV UNI_INSC__OTHER_invlist[] = {  /* for EBCDIC 1047 */
        0x11DA0,
        0x11DAA,
        0x11EE0,
-       0x11EF7
+       0x11EF7,
+       0x11F00,
+       0x11F11,
+       0x11F12,
+       0x11F3B,
+       0x11F3E,
+       0x11F43,
+       0x11F50,
+       0x11F5A
 };
 
 #  endif       /* EBCDIC 1047 */
@@ -315965,7 +319928,7 @@ static const UV UNI_INSC__OTHER_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_INSC__OTHER_invlist[] = {  /* for EBCDIC 037 */
-       647,    /* Number of elements */
+       655,    /* Number of elements */
        148565664, /* Version and data structure type */
        0,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -316191,7 +320154,7 @@ static const UV UNI_INSC__OTHER_invlist[] = {  /* for EBCDIC 037 */
        0xCE6,
        0xCF0,
        0xCF1,
-       0xCF3,
+       0xCF4,
        0xD00,
        0xD0D,
        0xD0E,
@@ -316263,7 +320226,7 @@ static const UV UNI_INSC__OTHER_invlist[] = {  /* for EBCDIC 037 */
        0xEC8,
        0xECC,
        0xECD,
-       0xECE,
+       0xECF,
        0xED0,
        0xEDA,
        0xEDC,
@@ -316463,7 +320426,7 @@ static const UV UNI_INSC__OTHER_invlist[] = {  /* for EBCDIC 037 */
        0x11213,
        0x11238,
        0x1123E,
-       0x1123F,
+       0x11242,
        0x11280,
        0x11287,
        0x11288,
@@ -316615,13 +320578,21 @@ static const UV UNI_INSC__OTHER_invlist[] = {  /* for EBCDIC 037 */
        0x11DA0,
        0x11DAA,
        0x11EE0,
-       0x11EF7
+       0x11EF7,
+       0x11F00,
+       0x11F11,
+       0x11F12,
+       0x11F3B,
+       0x11F3E,
+       0x11F43,
+       0x11F50,
+       0x11F5A
 };
 
 #  endif       /* EBCDIC 037 */
 
 static const UV UNI_INSC__PUREKILLER_invlist[] = {  /* for all charsets */
-       45,     /* Number of elements */
+       47,     /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -316669,7 +320640,9 @@ static const UV UNI_INSC__PUREKILLER_invlist[] = {  /* for all charsets */
        0x11A34,
        0x11A35,
        0x11D44,
-       0x11D45
+       0x11D45,
+       0x11F41,
+       0x11F42
 };
 
 static const UV UNI_INSC__REGISTERSHIFTER_invlist[] = {  /* for all charsets */
@@ -316685,7 +320658,7 @@ static const UV UNI_INSC__REGISTERSHIFTER_invlist[] = {  /* for all charsets */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_INSC__SYLLABLEMODIFIER_invlist[] = {  /* for ASCII/Latin1 */
-       39,     /* Number of elements */
+       41,     /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -316694,6 +320667,8 @@ static const UV UNI_INSC__SYLLABLEMODIFIER_invlist[] = {  /* for ASCII/Latin1 */
        0xB4,
        0x9FE,
        0x9FF,
+       0xECE,
+       0xECF,
        0xF35,
        0xF36,
        0xF37,
@@ -316738,7 +320713,7 @@ static const UV UNI_INSC__SYLLABLEMODIFIER_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_INSC__SYLLABLEMODIFIER_invlist[] = {  /* for EBCDIC 1047 */
-       41,     /* Number of elements */
+       43,     /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -316749,6 +320724,8 @@ static const UV UNI_INSC__SYLLABLEMODIFIER_invlist[] = {  /* for EBCDIC 1047 */
        0xFB,
        0x9FE,
        0x9FF,
+       0xECE,
+       0xECF,
        0xF35,
        0xF36,
        0xF37,
@@ -316793,7 +320770,7 @@ static const UV UNI_INSC__SYLLABLEMODIFIER_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_INSC__SYLLABLEMODIFIER_invlist[] = {  /* for EBCDIC 037 */
-       41,     /* Number of elements */
+       43,     /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -316804,6 +320781,8 @@ static const UV UNI_INSC__SYLLABLEMODIFIER_invlist[] = {  /* for EBCDIC 037 */
        0xFB,
        0x9FE,
        0x9FF,
+       0xECE,
+       0xECF,
        0xF35,
        0xF36,
        0xF37,
@@ -316957,7 +320936,7 @@ static const UV UNI_INSC__VIRAMA_invlist[] = {  /* for all charsets */
 };
 
 static const UV UNI_INSC__VISARGA_invlist[] = {  /* for all charsets */
-       71,     /* Number of elements */
+       73,     /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -317031,7 +321010,9 @@ static const UV UNI_INSC__VISARGA_invlist[] = {  /* for all charsets */
        0x11D41,
        0x11D42,
        0x11D96,
-       0x11D97
+       0x11D97,
+       0x11F03,
+       0x11F04
 };
 
 static const UV UNI_INSC__VOWEL_invlist[] = {  /* for all charsets */
@@ -317053,7 +321034,7 @@ static const UV UNI_INSC__VOWEL_invlist[] = {  /* for all charsets */
 };
 
 static const UV UNI_INSC__VOWELDEPENDENT_invlist[] = {  /* for all charsets */
-       269,    /* Number of elements */
+       275,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -317256,6 +321237,8 @@ static const UV UNI_INSC__VOWELDEPENDENT_invlist[] = {  /* for all charsets */
        0x111CF,
        0x1122C,
        0x11234,
+       0x11241,
+       0x11242,
        0x112E0,
        0x112E9,
        0x1133E,
@@ -317325,11 +321308,15 @@ static const UV UNI_INSC__VOWELDEPENDENT_invlist[] = {  /* for all charsets */
        0x11D93,
        0x11D95,
        0x11EF3,
-       0x11EF7
+       0x11EF7,
+       0x11F34,
+       0x11F3B,
+       0x11F3E,
+       0x11F41
 };
 
 static const UV UNI_INSC__VOWELINDEPENDENT_invlist[] = {  /* for all charsets */
-       177,    /* Number of elements */
+       181,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -317456,6 +321443,8 @@ static const UV UNI_INSC__VOWELINDEPENDENT_invlist[] = {  /* for all charsets */
        0x11191,
        0x11200,
        0x11208,
+       0x11240,
+       0x11241,
        0x11280,
        0x11284,
        0x112B0,
@@ -317509,7 +321498,9 @@ static const UV UNI_INSC__VOWELINDEPENDENT_invlist[] = {  /* for all charsets */
        0x11D67,
        0x11D69,
        0x11D6A,
-       0x11D6C
+       0x11D6C,
+       0x11F04,
+       0x11F11
 };
 
 static const UV UNI_INSIDDHAM_invlist[] = {  /* for all charsets */
@@ -319561,7 +323552,7 @@ static const UV UNI_JT__R_invlist[] = {  /* for all charsets */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_JT__T_invlist[] = {  /* for ASCII/Latin1 */
-       695,    /* Number of elements */
+       713,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -319757,7 +323748,7 @@ static const UV UNI_JT__T_invlist[] = {  /* for ASCII/Latin1 */
        0xEB4,
        0xEBD,
        0xEC8,
-       0xECE,
+       0xECF,
        0xF18,
        0xF1A,
        0xF35,
@@ -320026,6 +324017,8 @@ static const UV UNI_JT__T_invlist[] = {  /* for ASCII/Latin1 */
        0x10D28,
        0x10EAB,
        0x10EAD,
+       0x10EFD,
+       0x10F00,
        0x10F46,
        0x10F51,
        0x10F82,
@@ -320070,6 +324063,8 @@ static const UV UNI_JT__T_invlist[] = {  /* for ASCII/Latin1 */
        0x11238,
        0x1123E,
        0x1123F,
+       0x11241,
+       0x11242,
        0x112DF,
        0x112E0,
        0x112E3,
@@ -320192,8 +324187,18 @@ static const UV UNI_JT__T_invlist[] = {  /* for ASCII/Latin1 */
        0x11D98,
        0x11EF3,
        0x11EF5,
+       0x11F00,
+       0x11F02,
+       0x11F36,
+       0x11F3B,
+       0x11F40,
+       0x11F41,
+       0x11F42,
+       0x11F43,
        0x13430,
-       0x13439,
+       0x13441,
+       0x13447,
+       0x13456,
        0x16AF0,
        0x16AF5,
        0x16B30,
@@ -320244,12 +324249,16 @@ static const UV UNI_JT__T_invlist[] = {  /* for ASCII/Latin1 */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E08F,
+       0x1E090,
        0x1E130,
        0x1E137,
        0x1E2AE,
        0x1E2AF,
        0x1E2EC,
        0x1E2F0,
+       0x1E4EC,
+       0x1E4F0,
        0x1E8D0,
        0x1E8D7,
        0x1E944,
@@ -320270,7 +324279,7 @@ static const UV UNI_JT__T_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_JT__T_invlist[] = {  /* for EBCDIC 1047 */
-       695,    /* Number of elements */
+       713,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -320466,7 +324475,7 @@ static const UV UNI_JT__T_invlist[] = {  /* for EBCDIC 1047 */
        0xEB4,
        0xEBD,
        0xEC8,
-       0xECE,
+       0xECF,
        0xF18,
        0xF1A,
        0xF35,
@@ -320735,6 +324744,8 @@ static const UV UNI_JT__T_invlist[] = {  /* for EBCDIC 1047 */
        0x10D28,
        0x10EAB,
        0x10EAD,
+       0x10EFD,
+       0x10F00,
        0x10F46,
        0x10F51,
        0x10F82,
@@ -320779,6 +324790,8 @@ static const UV UNI_JT__T_invlist[] = {  /* for EBCDIC 1047 */
        0x11238,
        0x1123E,
        0x1123F,
+       0x11241,
+       0x11242,
        0x112DF,
        0x112E0,
        0x112E3,
@@ -320901,8 +324914,18 @@ static const UV UNI_JT__T_invlist[] = {  /* for EBCDIC 1047 */
        0x11D98,
        0x11EF3,
        0x11EF5,
+       0x11F00,
+       0x11F02,
+       0x11F36,
+       0x11F3B,
+       0x11F40,
+       0x11F41,
+       0x11F42,
+       0x11F43,
        0x13430,
-       0x13439,
+       0x13441,
+       0x13447,
+       0x13456,
        0x16AF0,
        0x16AF5,
        0x16B30,
@@ -320953,12 +324976,16 @@ static const UV UNI_JT__T_invlist[] = {  /* for EBCDIC 1047 */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E08F,
+       0x1E090,
        0x1E130,
        0x1E137,
        0x1E2AE,
        0x1E2AF,
        0x1E2EC,
        0x1E2F0,
+       0x1E4EC,
+       0x1E4F0,
        0x1E8D0,
        0x1E8D7,
        0x1E944,
@@ -320979,7 +325006,7 @@ static const UV UNI_JT__T_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_JT__T_invlist[] = {  /* for EBCDIC 037 */
-       695,    /* Number of elements */
+       713,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -321175,7 +325202,7 @@ static const UV UNI_JT__T_invlist[] = {  /* for EBCDIC 037 */
        0xEB4,
        0xEBD,
        0xEC8,
-       0xECE,
+       0xECF,
        0xF18,
        0xF1A,
        0xF35,
@@ -321444,6 +325471,8 @@ static const UV UNI_JT__T_invlist[] = {  /* for EBCDIC 037 */
        0x10D28,
        0x10EAB,
        0x10EAD,
+       0x10EFD,
+       0x10F00,
        0x10F46,
        0x10F51,
        0x10F82,
@@ -321488,6 +325517,8 @@ static const UV UNI_JT__T_invlist[] = {  /* for EBCDIC 037 */
        0x11238,
        0x1123E,
        0x1123F,
+       0x11241,
+       0x11242,
        0x112DF,
        0x112E0,
        0x112E3,
@@ -321610,8 +325641,18 @@ static const UV UNI_JT__T_invlist[] = {  /* for EBCDIC 037 */
        0x11D98,
        0x11EF3,
        0x11EF5,
+       0x11F00,
+       0x11F02,
+       0x11F36,
+       0x11F3B,
+       0x11F40,
+       0x11F41,
+       0x11F42,
+       0x11F43,
        0x13430,
-       0x13439,
+       0x13441,
+       0x13447,
+       0x13456,
        0x16AF0,
        0x16AF5,
        0x16B30,
@@ -321662,12 +325703,16 @@ static const UV UNI_JT__T_invlist[] = {  /* for EBCDIC 037 */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E08F,
+       0x1E090,
        0x1E130,
        0x1E137,
        0x1E2AE,
        0x1E2AF,
        0x1E2EC,
        0x1E2F0,
+       0x1E4EC,
+       0x1E4F0,
        0x1E8D0,
        0x1E8D7,
        0x1E944,
@@ -321685,7 +325730,7 @@ static const UV UNI_JT__T_invlist[] = {  /* for EBCDIC 037 */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_JT__U_invlist[] = {  /* for ASCII/Latin1 */
-       745,    /* Number of elements */
+       763,    /* Number of elements */
        148565664, /* Version and data structure type */
        0,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -321901,7 +325946,7 @@ static const UV UNI_JT__U_invlist[] = {  /* for ASCII/Latin1 */
        0xEB4,
        0xEBD,
        0xEC8,
-       0xECE,
+       0xECF,
        0xF18,
        0xF1A,
        0xF35,
@@ -322188,6 +326233,8 @@ static const UV UNI_JT__U_invlist[] = {  /* for ASCII/Latin1 */
        0x10D28,
        0x10EAB,
        0x10EAD,
+       0x10EFD,
+       0x10F00,
        0x10F30,
        0x10F45,
        0x10F46,
@@ -322244,6 +326291,8 @@ static const UV UNI_JT__U_invlist[] = {  /* for ASCII/Latin1 */
        0x11238,
        0x1123E,
        0x1123F,
+       0x11241,
+       0x11242,
        0x112DF,
        0x112E0,
        0x112E3,
@@ -322366,8 +326415,18 @@ static const UV UNI_JT__U_invlist[] = {  /* for ASCII/Latin1 */
        0x11D98,
        0x11EF3,
        0x11EF5,
+       0x11F00,
+       0x11F02,
+       0x11F36,
+       0x11F3B,
+       0x11F40,
+       0x11F41,
+       0x11F42,
+       0x11F43,
        0x13430,
-       0x13439,
+       0x13441,
+       0x13447,
+       0x13456,
        0x16AF0,
        0x16AF5,
        0x16B30,
@@ -322418,12 +326477,16 @@ static const UV UNI_JT__U_invlist[] = {  /* for ASCII/Latin1 */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E08F,
+       0x1E090,
        0x1E130,
        0x1E137,
        0x1E2AE,
        0x1E2AF,
        0x1E2EC,
        0x1E2F0,
+       0x1E4EC,
+       0x1E4F0,
        0x1E8D0,
        0x1E8D7,
        0x1E900,
@@ -322444,7 +326507,7 @@ static const UV UNI_JT__U_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_JT__U_invlist[] = {  /* for EBCDIC 1047 */
-       745,    /* Number of elements */
+       763,    /* Number of elements */
        148565664, /* Version and data structure type */
        0,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -322660,7 +326723,7 @@ static const UV UNI_JT__U_invlist[] = {  /* for EBCDIC 1047 */
        0xEB4,
        0xEBD,
        0xEC8,
-       0xECE,
+       0xECF,
        0xF18,
        0xF1A,
        0xF35,
@@ -322947,6 +327010,8 @@ static const UV UNI_JT__U_invlist[] = {  /* for EBCDIC 1047 */
        0x10D28,
        0x10EAB,
        0x10EAD,
+       0x10EFD,
+       0x10F00,
        0x10F30,
        0x10F45,
        0x10F46,
@@ -323003,6 +327068,8 @@ static const UV UNI_JT__U_invlist[] = {  /* for EBCDIC 1047 */
        0x11238,
        0x1123E,
        0x1123F,
+       0x11241,
+       0x11242,
        0x112DF,
        0x112E0,
        0x112E3,
@@ -323125,8 +327192,18 @@ static const UV UNI_JT__U_invlist[] = {  /* for EBCDIC 1047 */
        0x11D98,
        0x11EF3,
        0x11EF5,
+       0x11F00,
+       0x11F02,
+       0x11F36,
+       0x11F3B,
+       0x11F40,
+       0x11F41,
+       0x11F42,
+       0x11F43,
        0x13430,
-       0x13439,
+       0x13441,
+       0x13447,
+       0x13456,
        0x16AF0,
        0x16AF5,
        0x16B30,
@@ -323177,12 +327254,16 @@ static const UV UNI_JT__U_invlist[] = {  /* for EBCDIC 1047 */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E08F,
+       0x1E090,
        0x1E130,
        0x1E137,
        0x1E2AE,
        0x1E2AF,
        0x1E2EC,
        0x1E2F0,
+       0x1E4EC,
+       0x1E4F0,
        0x1E8D0,
        0x1E8D7,
        0x1E900,
@@ -323203,7 +327284,7 @@ static const UV UNI_JT__U_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_JT__U_invlist[] = {  /* for EBCDIC 037 */
-       745,    /* Number of elements */
+       763,    /* Number of elements */
        148565664, /* Version and data structure type */
        0,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -323419,7 +327500,7 @@ static const UV UNI_JT__U_invlist[] = {  /* for EBCDIC 037 */
        0xEB4,
        0xEBD,
        0xEC8,
-       0xECE,
+       0xECF,
        0xF18,
        0xF1A,
        0xF35,
@@ -323706,6 +327787,8 @@ static const UV UNI_JT__U_invlist[] = {  /* for EBCDIC 037 */
        0x10D28,
        0x10EAB,
        0x10EAD,
+       0x10EFD,
+       0x10F00,
        0x10F30,
        0x10F45,
        0x10F46,
@@ -323762,6 +327845,8 @@ static const UV UNI_JT__U_invlist[] = {  /* for EBCDIC 037 */
        0x11238,
        0x1123E,
        0x1123F,
+       0x11241,
+       0x11242,
        0x112DF,
        0x112E0,
        0x112E3,
@@ -323884,8 +327969,18 @@ static const UV UNI_JT__U_invlist[] = {  /* for EBCDIC 037 */
        0x11D98,
        0x11EF3,
        0x11EF5,
+       0x11F00,
+       0x11F02,
+       0x11F36,
+       0x11F3B,
+       0x11F40,
+       0x11F41,
+       0x11F42,
+       0x11F43,
        0x13430,
-       0x13439,
+       0x13441,
+       0x13447,
+       0x13456,
        0x16AF0,
        0x16AF5,
        0x16B30,
@@ -323936,12 +328031,16 @@ static const UV UNI_JT__U_invlist[] = {  /* for EBCDIC 037 */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E08F,
+       0x1E090,
        0x1E130,
        0x1E137,
        0x1E2AE,
        0x1E2AF,
        0x1E2EC,
        0x1E2F0,
+       0x1E4EC,
+       0x1E4F0,
        0x1E8D0,
        0x1E8D7,
        0x1E900,
@@ -323956,6 +328055,16 @@ static const UV UNI_JT__U_invlist[] = {  /* for EBCDIC 037 */
 
 #  endif       /* EBCDIC 037 */
 
+static const UV UNI_KAKTOVIKNUMERALS_invlist[] = {  /* for all charsets */
+       3,      /* Number of elements */
+       148565664, /* Version and data structure type */
+       1,      /* 0 if the list starts at 0;
+                  1 if it starts at the element beyond 0 */
+       0x0,
+       0x1D2C0,
+       0x1D2E0
+};
+
 static const UV UNI_KALI_invlist[] = {  /* for all charsets */
        3,      /* Number of elements */
        148565664, /* Version and data structure type */
@@ -323967,7 +328076,7 @@ static const UV UNI_KALI_invlist[] = {  /* for all charsets */
 };
 
 static const UV UNI_KANA_invlist[] = {  /* for all charsets */
-       39,     /* Number of elements */
+       41,     /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -324008,6 +328117,8 @@ static const UV UNI_KANA_invlist[] = {  /* for all charsets */
        0x1B001,
        0x1B120,
        0x1B123,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168
 };
@@ -324072,6 +328183,20 @@ static const UV UNI_KATAKANAEXT_invlist[] = {  /* for all charsets */
        0x3200
 };
 
+static const UV UNI_KAWI_invlist[] = {  /* for all charsets */
+       7,      /* Number of elements */
+       148565664, /* Version and data structure type */
+       1,      /* 0 if the list starts at 0;
+                  1 if it starts at the element beyond 0 */
+       0x0,
+       0x11F00,
+       0x11F11,
+       0x11F12,
+       0x11F3B,
+       0x11F3E,
+       0x11F5A
+};
+
 static const UV UNI_KHAR_invlist[] = {  /* for all charsets */
        17,     /* Number of elements */
        148565664, /* Version and data structure type */
@@ -324135,7 +328260,7 @@ static const UV UNI_KHOJ_invlist[] = {  /* for all charsets */
        0x11200,
        0x11212,
        0x11213,
-       0x1123F
+       0x11242
 };
 
 static const UV UNI_KITS_invlist[] = {  /* for all charsets */
@@ -324185,7 +328310,7 @@ static const UV UNI_KNDA_invlist[] = {  /* for all charsets */
        0xCE6,
        0xCF0,
        0xCF1,
-       0xCF3,
+       0xCF4,
        0x1CD0,
        0x1CD1,
        0x1CD2,
@@ -324219,7 +328344,7 @@ static const UV UNI_KTHI_invlist[] = {  /* for all charsets */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_L_invlist[] = {  /* for ASCII/Latin1 */
-       1297,   /* Number of elements */
+       1319,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -325162,6 +329287,8 @@ static const UV UNI_L_invlist[] = {  /* for ASCII/Latin1 */
        0x11212,
        0x11213,
        0x1122C,
+       0x1123F,
+       0x11241,
        0x11280,
        0x11287,
        0x11288,
@@ -325286,6 +329413,12 @@ static const UV UNI_L_invlist[] = {  /* for ASCII/Latin1 */
        0x11D99,
        0x11EE0,
        0x11EF3,
+       0x11F02,
+       0x11F03,
+       0x11F04,
+       0x11F11,
+       0x11F12,
+       0x11F34,
        0x11FB0,
        0x11FB1,
        0x12000,
@@ -325295,7 +329428,9 @@ static const UV UNI_L_invlist[] = {  /* for ASCII/Latin1 */
        0x12F90,
        0x12FF1,
        0x13000,
-       0x1342F,
+       0x13430,
+       0x13441,
+       0x13447,
        0x14400,
        0x14647,
        0x16800,
@@ -325340,8 +329475,12 @@ static const UV UNI_L_invlist[] = {  /* for ASCII/Latin1 */
        0x1AFFF,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -325416,6 +329555,10 @@ static const UV UNI_L_invlist[] = {  /* for ASCII/Latin1 */
        0x1D7CC,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
+       0x1E030,
+       0x1E06E,
        0x1E100,
        0x1E12D,
        0x1E137,
@@ -325426,6 +329569,8 @@ static const UV UNI_L_invlist[] = {  /* for ASCII/Latin1 */
        0x1E2AE,
        0x1E2C0,
        0x1E2EC,
+       0x1E4D0,
+       0x1E4EC,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -325509,7 +329654,7 @@ static const UV UNI_L_invlist[] = {  /* for ASCII/Latin1 */
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -325519,7 +329664,9 @@ static const UV UNI_L_invlist[] = {  /* for ASCII/Latin1 */
        0x2F800,
        0x2FA1E,
        0x30000,
-       0x3134B
+       0x3134B,
+       0x31350,
+       0x323B0
 };
 
 #  endif       /* ASCII/Latin1 */
@@ -325530,7 +329677,7 @@ static const UV UNI_L_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_L_invlist[] = {  /* for EBCDIC 1047 */
-       1323,   /* Number of elements */
+       1345,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -326499,6 +330646,8 @@ static const UV UNI_L_invlist[] = {  /* for EBCDIC 1047 */
        0x11212,
        0x11213,
        0x1122C,
+       0x1123F,
+       0x11241,
        0x11280,
        0x11287,
        0x11288,
@@ -326623,6 +330772,12 @@ static const UV UNI_L_invlist[] = {  /* for EBCDIC 1047 */
        0x11D99,
        0x11EE0,
        0x11EF3,
+       0x11F02,
+       0x11F03,
+       0x11F04,
+       0x11F11,
+       0x11F12,
+       0x11F34,
        0x11FB0,
        0x11FB1,
        0x12000,
@@ -326632,7 +330787,9 @@ static const UV UNI_L_invlist[] = {  /* for EBCDIC 1047 */
        0x12F90,
        0x12FF1,
        0x13000,
-       0x1342F,
+       0x13430,
+       0x13441,
+       0x13447,
        0x14400,
        0x14647,
        0x16800,
@@ -326677,8 +330834,12 @@ static const UV UNI_L_invlist[] = {  /* for EBCDIC 1047 */
        0x1AFFF,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -326753,6 +330914,10 @@ static const UV UNI_L_invlist[] = {  /* for EBCDIC 1047 */
        0x1D7CC,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
+       0x1E030,
+       0x1E06E,
        0x1E100,
        0x1E12D,
        0x1E137,
@@ -326763,6 +330928,8 @@ static const UV UNI_L_invlist[] = {  /* for EBCDIC 1047 */
        0x1E2AE,
        0x1E2C0,
        0x1E2EC,
+       0x1E4D0,
+       0x1E4EC,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -326846,7 +331013,7 @@ static const UV UNI_L_invlist[] = {  /* for EBCDIC 1047 */
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -326856,7 +331023,9 @@ static const UV UNI_L_invlist[] = {  /* for EBCDIC 1047 */
        0x2F800,
        0x2FA1E,
        0x30000,
-       0x3134B
+       0x3134B,
+       0x31350,
+       0x323B0
 };
 
 #  endif       /* EBCDIC 1047 */
@@ -326867,7 +331036,7 @@ static const UV UNI_L_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_L_invlist[] = {  /* for EBCDIC 037 */
-       1319,   /* Number of elements */
+       1341,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -327832,6 +332001,8 @@ static const UV UNI_L_invlist[] = {  /* for EBCDIC 037 */
        0x11212,
        0x11213,
        0x1122C,
+       0x1123F,
+       0x11241,
        0x11280,
        0x11287,
        0x11288,
@@ -327956,6 +332127,12 @@ static const UV UNI_L_invlist[] = {  /* for EBCDIC 037 */
        0x11D99,
        0x11EE0,
        0x11EF3,
+       0x11F02,
+       0x11F03,
+       0x11F04,
+       0x11F11,
+       0x11F12,
+       0x11F34,
        0x11FB0,
        0x11FB1,
        0x12000,
@@ -327965,7 +332142,9 @@ static const UV UNI_L_invlist[] = {  /* for EBCDIC 037 */
        0x12F90,
        0x12FF1,
        0x13000,
-       0x1342F,
+       0x13430,
+       0x13441,
+       0x13447,
        0x14400,
        0x14647,
        0x16800,
@@ -328010,8 +332189,12 @@ static const UV UNI_L_invlist[] = {  /* for EBCDIC 037 */
        0x1AFFF,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -328086,6 +332269,10 @@ static const UV UNI_L_invlist[] = {  /* for EBCDIC 037 */
        0x1D7CC,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
+       0x1E030,
+       0x1E06E,
        0x1E100,
        0x1E12D,
        0x1E137,
@@ -328096,6 +332283,8 @@ static const UV UNI_L_invlist[] = {  /* for EBCDIC 037 */
        0x1E2AE,
        0x1E2C0,
        0x1E2EC,
+       0x1E4D0,
+       0x1E4EC,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -328179,7 +332368,7 @@ static const UV UNI_L_invlist[] = {  /* for EBCDIC 037 */
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -328189,7 +332378,9 @@ static const UV UNI_L_invlist[] = {  /* for EBCDIC 037 */
        0x2F800,
        0x2FA1E,
        0x30000,
-       0x3134B
+       0x3134B,
+       0x31350,
+       0x323B0
 };
 
 #  endif       /* EBCDIC 037 */
@@ -328235,7 +332426,7 @@ static const UV UNI_LAO_invlist[] = {  /* for all charsets */
        0xEC6,
        0xEC7,
        0xEC8,
-       0xECE,
+       0xECF,
        0xED0,
        0xEDA,
        0xEDC,
@@ -328479,7 +332670,7 @@ static const UV UNI_LATINEXTG_invlist[] = {  /* for all charsets */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_LATN_invlist[] = {  /* for ASCII/Latin1 */
-       93,     /* Number of elements */
+       95,     /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -328575,7 +332766,9 @@ static const UV UNI_LATN_invlist[] = {  /* for ASCII/Latin1 */
        0x107B2,
        0x107BB,
        0x1DF00,
-       0x1DF1F
+       0x1DF1F,
+       0x1DF25,
+       0x1DF2B
 };
 
 #  endif       /* ASCII/Latin1 */
@@ -328586,7 +332779,7 @@ static const UV UNI_LATN_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_LATN_invlist[] = {  /* for EBCDIC 1047 */
-       119,    /* Number of elements */
+       121,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -328708,7 +332901,9 @@ static const UV UNI_LATN_invlist[] = {  /* for EBCDIC 1047 */
        0x107B2,
        0x107BB,
        0x1DF00,
-       0x1DF1F
+       0x1DF1F,
+       0x1DF25,
+       0x1DF2B
 };
 
 #  endif       /* EBCDIC 1047 */
@@ -328719,7 +332914,7 @@ static const UV UNI_LATN_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_LATN_invlist[] = {  /* for EBCDIC 037 */
-       115,    /* Number of elements */
+       117,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -328837,7 +333032,9 @@ static const UV UNI_LATN_invlist[] = {  /* for EBCDIC 037 */
        0x107B2,
        0x107BB,
        0x1DF00,
-       0x1DF1F
+       0x1DF1F,
+       0x1DF25,
+       0x1DF2B
 };
 
 #  endif       /* EBCDIC 037 */
@@ -329553,7 +333750,7 @@ static const UV UNI_LB__AI_invlist[] = {  /* for EBCDIC 037 */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_LB__AL_invlist[] = {  /* for ASCII/Latin1 */
-       1597,   /* Number of elements */
+       1613,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -330094,8 +334291,6 @@ static const UV UNI_LB__AL_invlist[] = {  /* for ASCII/Latin1 */
        0x2044,
        0x204A,
        0x2056,
-       0x2057,
-       0x2058,
        0x205C,
        0x205D,
        0x2061,
@@ -330704,6 +334899,8 @@ static const UV UNI_LB__AL_invlist[] = {  /* for ASCII/Latin1 */
        0x1123B,
        0x1123D,
        0x1123E,
+       0x1123F,
+       0x11241,
        0x11280,
        0x11287,
        0x11288,
@@ -330840,6 +335037,12 @@ static const UV UNI_LB__AL_invlist[] = {  /* for ASCII/Latin1 */
        0x11EF3,
        0x11EF7,
        0x11EF9,
+       0x11F02,
+       0x11F03,
+       0x11F04,
+       0x11F11,
+       0x11F12,
+       0x11F34,
        0x11FB0,
        0x11FB1,
        0x11FC0,
@@ -330863,7 +335066,9 @@ static const UV UNI_LB__AL_invlist[] = {  /* for ASCII/Latin1 */
        0x1328A,
        0x13379,
        0x1337C,
-       0x1342F,
+       0x13430,
+       0x13441,
+       0x13447,
        0x14400,
        0x145CE,
        0x145D0,
@@ -330936,6 +335141,8 @@ static const UV UNI_LB__AL_invlist[] = {  /* for ASCII/Latin1 */
        0x1D242,
        0x1D245,
        0x1D246,
+       0x1D2C0,
+       0x1D2D4,
        0x1D2E0,
        0x1D2F4,
        0x1D300,
@@ -330996,6 +335203,10 @@ static const UV UNI_LB__AL_invlist[] = {  /* for ASCII/Latin1 */
        0x1DA8C,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
+       0x1E030,
+       0x1E06E,
        0x1E100,
        0x1E12D,
        0x1E137,
@@ -331006,6 +335217,8 @@ static const UV UNI_LB__AL_invlist[] = {  /* for ASCII/Latin1 */
        0x1E2AE,
        0x1E2C0,
        0x1E2EC,
+       0x1E4D0,
+       0x1E4EC,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -331164,7 +335377,7 @@ static const UV UNI_LB__AL_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_LB__AL_invlist[] = {  /* for EBCDIC 1047 */
-       1625,   /* Number of elements */
+       1641,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -331733,8 +335946,6 @@ static const UV UNI_LB__AL_invlist[] = {  /* for EBCDIC 1047 */
        0x2044,
        0x204A,
        0x2056,
-       0x2057,
-       0x2058,
        0x205C,
        0x205D,
        0x2061,
@@ -332343,6 +336554,8 @@ static const UV UNI_LB__AL_invlist[] = {  /* for EBCDIC 1047 */
        0x1123B,
        0x1123D,
        0x1123E,
+       0x1123F,
+       0x11241,
        0x11280,
        0x11287,
        0x11288,
@@ -332479,6 +336692,12 @@ static const UV UNI_LB__AL_invlist[] = {  /* for EBCDIC 1047 */
        0x11EF3,
        0x11EF7,
        0x11EF9,
+       0x11F02,
+       0x11F03,
+       0x11F04,
+       0x11F11,
+       0x11F12,
+       0x11F34,
        0x11FB0,
        0x11FB1,
        0x11FC0,
@@ -332502,7 +336721,9 @@ static const UV UNI_LB__AL_invlist[] = {  /* for EBCDIC 1047 */
        0x1328A,
        0x13379,
        0x1337C,
-       0x1342F,
+       0x13430,
+       0x13441,
+       0x13447,
        0x14400,
        0x145CE,
        0x145D0,
@@ -332575,6 +336796,8 @@ static const UV UNI_LB__AL_invlist[] = {  /* for EBCDIC 1047 */
        0x1D242,
        0x1D245,
        0x1D246,
+       0x1D2C0,
+       0x1D2D4,
        0x1D2E0,
        0x1D2F4,
        0x1D300,
@@ -332635,6 +336858,10 @@ static const UV UNI_LB__AL_invlist[] = {  /* for EBCDIC 1047 */
        0x1DA8C,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
+       0x1E030,
+       0x1E06E,
        0x1E100,
        0x1E12D,
        0x1E137,
@@ -332645,6 +336872,8 @@ static const UV UNI_LB__AL_invlist[] = {  /* for EBCDIC 1047 */
        0x1E2AE,
        0x1E2C0,
        0x1E2EC,
+       0x1E4D0,
+       0x1E4EC,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -332803,7 +337032,7 @@ static const UV UNI_LB__AL_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_LB__AL_invlist[] = {  /* for EBCDIC 037 */
-       1621,   /* Number of elements */
+       1637,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -333368,8 +337597,6 @@ static const UV UNI_LB__AL_invlist[] = {  /* for EBCDIC 037 */
        0x2044,
        0x204A,
        0x2056,
-       0x2057,
-       0x2058,
        0x205C,
        0x205D,
        0x2061,
@@ -333978,6 +338205,8 @@ static const UV UNI_LB__AL_invlist[] = {  /* for EBCDIC 037 */
        0x1123B,
        0x1123D,
        0x1123E,
+       0x1123F,
+       0x11241,
        0x11280,
        0x11287,
        0x11288,
@@ -334114,6 +338343,12 @@ static const UV UNI_LB__AL_invlist[] = {  /* for EBCDIC 037 */
        0x11EF3,
        0x11EF7,
        0x11EF9,
+       0x11F02,
+       0x11F03,
+       0x11F04,
+       0x11F11,
+       0x11F12,
+       0x11F34,
        0x11FB0,
        0x11FB1,
        0x11FC0,
@@ -334137,7 +338372,9 @@ static const UV UNI_LB__AL_invlist[] = {  /* for EBCDIC 037 */
        0x1328A,
        0x13379,
        0x1337C,
-       0x1342F,
+       0x13430,
+       0x13441,
+       0x13447,
        0x14400,
        0x145CE,
        0x145D0,
@@ -334210,6 +338447,8 @@ static const UV UNI_LB__AL_invlist[] = {  /* for EBCDIC 037 */
        0x1D242,
        0x1D245,
        0x1D246,
+       0x1D2C0,
+       0x1D2D4,
        0x1D2E0,
        0x1D2F4,
        0x1D300,
@@ -334270,6 +338509,10 @@ static const UV UNI_LB__AL_invlist[] = {  /* for EBCDIC 037 */
        0x1DA8C,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
+       0x1E030,
+       0x1E06E,
        0x1E100,
        0x1E12D,
        0x1E137,
@@ -334280,6 +338523,8 @@ static const UV UNI_LB__AL_invlist[] = {  /* for EBCDIC 037 */
        0x1E2AE,
        0x1E2C0,
        0x1E2EC,
+       0x1E4D0,
+       0x1E4EC,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -334447,7 +338692,7 @@ static const UV UNI_LB__B2_invlist[] = {  /* for all charsets */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_LB__BA_invlist[] = {  /* for ASCII/Latin1 */
-       201,    /* Number of elements */
+       203,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -334634,6 +338879,8 @@ static const UV UNI_LB__BA_invlist[] = {  /* for ASCII/Latin1 */
        0x11AA3,
        0x11C41,
        0x11C46,
+       0x11F43,
+       0x11F45,
        0x11FFF,
        0x12000,
        0x12470,
@@ -334662,7 +338909,7 @@ static const UV UNI_LB__BA_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_LB__BA_invlist[] = {  /* for EBCDIC 1047 */
-       201,    /* Number of elements */
+       203,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -334849,6 +339096,8 @@ static const UV UNI_LB__BA_invlist[] = {  /* for EBCDIC 1047 */
        0x11AA3,
        0x11C41,
        0x11C46,
+       0x11F43,
+       0x11F45,
        0x11FFF,
        0x12000,
        0x12470,
@@ -334877,7 +339126,7 @@ static const UV UNI_LB__BA_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_LB__BA_invlist[] = {  /* for EBCDIC 037 */
-       201,    /* Number of elements */
+       203,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -335064,6 +339313,8 @@ static const UV UNI_LB__BA_invlist[] = {  /* for EBCDIC 037 */
        0x11AA3,
        0x11C41,
        0x11C46,
+       0x11F43,
+       0x11F45,
        0x11FFF,
        0x12000,
        0x12470,
@@ -335089,7 +339340,7 @@ static const UV UNI_LB__BA_invlist[] = {  /* for EBCDIC 037 */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_LB__BB_invlist[] = {  /* for ASCII/Latin1 */
-       49,     /* Number of elements */
+       51,     /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -335140,6 +339391,8 @@ static const UV UNI_LB__BB_invlist[] = {  /* for ASCII/Latin1 */
        0x11A46,
        0x11A9E,
        0x11AA1,
+       0x11B00,
+       0x11B0A,
        0x11C70,
        0x11C71
 };
@@ -335152,7 +339405,7 @@ static const UV UNI_LB__BB_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_LB__BB_invlist[] = {  /* for EBCDIC 1047 */
-       49,     /* Number of elements */
+       51,     /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -335203,6 +339456,8 @@ static const UV UNI_LB__BB_invlist[] = {  /* for EBCDIC 1047 */
        0x11A46,
        0x11A9E,
        0x11AA1,
+       0x11B00,
+       0x11B0A,
        0x11C70,
        0x11C71
 };
@@ -335215,7 +339470,7 @@ static const UV UNI_LB__BB_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_LB__BB_invlist[] = {  /* for EBCDIC 037 */
-       49,     /* Number of elements */
+       51,     /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -335266,6 +339521,8 @@ static const UV UNI_LB__BB_invlist[] = {  /* for EBCDIC 037 */
        0x11A46,
        0x11A9E,
        0x11AA1,
+       0x11B00,
+       0x11B0A,
        0x11C70,
        0x11C71
 };
@@ -335337,7 +339594,7 @@ static const UV UNI_LB__CB_invlist[] = {  /* for all charsets */
 };
 
 static const UV UNI_LB__CJ_invlist[] = {  /* for all charsets */
-       55,     /* Number of elements */
+       59,     /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -335392,8 +339649,12 @@ static const UV UNI_LB__CJ_invlist[] = {  /* for all charsets */
        0x3200,
        0xFF67,
        0xFF71,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168
 };
@@ -335401,7 +339662,7 @@ static const UV UNI_LB__CJ_invlist[] = {  /* for all charsets */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_LB__CL_invlist[] = {  /* for ASCII/Latin1 */
-       175,    /* Number of elements */
+       179,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -335578,6 +339839,10 @@ static const UV UNI_LB__CL_invlist[] = {  /* for ASCII/Latin1 */
        0x1337C,
        0x13438,
        0x13439,
+       0x1343D,
+       0x1343E,
+       0x1343F,
+       0x13440,
        0x145CF,
        0x145D0
 };
@@ -335590,7 +339855,7 @@ static const UV UNI_LB__CL_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_LB__CL_invlist[] = {  /* for EBCDIC 1047 */
-       175,    /* Number of elements */
+       179,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -335767,6 +340032,10 @@ static const UV UNI_LB__CL_invlist[] = {  /* for EBCDIC 1047 */
        0x1337C,
        0x13438,
        0x13439,
+       0x1343D,
+       0x1343E,
+       0x1343F,
+       0x13440,
        0x145CF,
        0x145D0
 };
@@ -335779,7 +340048,7 @@ static const UV UNI_LB__CL_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_LB__CL_invlist[] = {  /* for EBCDIC 037 */
-       175,    /* Number of elements */
+       179,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -335956,6 +340225,10 @@ static const UV UNI_LB__CL_invlist[] = {  /* for EBCDIC 037 */
        0x1337C,
        0x13438,
        0x13439,
+       0x1343D,
+       0x1343E,
+       0x1343F,
+       0x13440,
        0x145CF,
        0x145D0
 };
@@ -335965,7 +340238,7 @@ static const UV UNI_LB__CL_invlist[] = {  /* for EBCDIC 037 */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_LB__CM_invlist[] = {  /* for ASCII/Latin1 */
-       574,    /* Number of elements */
+       600,    /* Number of elements */
        148565664, /* Version and data structure type */
        0,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -336143,6 +340416,8 @@ static const UV UNI_LB__CM_invlist[] = {  /* for ASCII/Latin1 */
        0xCD7,
        0xCE2,
        0xCE4,
+       0xCF3,
+       0xCF4,
        0xD00,
        0xD04,
        0xD3B,
@@ -336244,6 +340519,10 @@ static const UV UNI_LB__CM_invlist[] = {  /* for ASCII/Latin1 */
        0x1CF7,
        0x1CFA,
        0x1DC0,
+       0x1DCD,
+       0x1DCE,
+       0x1DFC,
+       0x1DFD,
        0x1E00,
        0x200C,
        0x200D,
@@ -336345,6 +340624,8 @@ static const UV UNI_LB__CM_invlist[] = {  /* for ASCII/Latin1 */
        0x10D28,
        0x10EAB,
        0x10EAD,
+       0x10EFD,
+       0x10F00,
        0x10F46,
        0x10F51,
        0x10F82,
@@ -336383,6 +340664,8 @@ static const UV UNI_LB__CM_invlist[] = {  /* for ASCII/Latin1 */
        0x11238,
        0x1123E,
        0x1123F,
+       0x11241,
+       0x11242,
        0x112DF,
        0x112EB,
        0x11300,
@@ -336475,6 +340758,18 @@ static const UV UNI_LB__CM_invlist[] = {  /* for ASCII/Latin1 */
        0x11D98,
        0x11EF3,
        0x11EF7,
+       0x11F00,
+       0x11F02,
+       0x11F03,
+       0x11F04,
+       0x11F34,
+       0x11F3B,
+       0x11F3E,
+       0x11F43,
+       0x13440,
+       0x13441,
+       0x13447,
+       0x13456,
        0x16AF0,
        0x16AF5,
        0x16B30,
@@ -336527,12 +340822,16 @@ static const UV UNI_LB__CM_invlist[] = {  /* for ASCII/Latin1 */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E08F,
+       0x1E090,
        0x1E130,
        0x1E137,
        0x1E2AE,
        0x1E2AF,
        0x1E2EC,
        0x1E2F0,
+       0x1E4EC,
+       0x1E4F0,
        0x1E8D0,
        0x1E8D7,
        0x1E944,
@@ -336553,7 +340852,7 @@ static const UV UNI_LB__CM_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_LB__CM_invlist[] = {  /* for EBCDIC 1047 */
-       578,    /* Number of elements */
+       604,    /* Number of elements */
        148565664, /* Version and data structure type */
        0,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -336735,6 +341034,8 @@ static const UV UNI_LB__CM_invlist[] = {  /* for EBCDIC 1047 */
        0xCD7,
        0xCE2,
        0xCE4,
+       0xCF3,
+       0xCF4,
        0xD00,
        0xD04,
        0xD3B,
@@ -336836,6 +341137,10 @@ static const UV UNI_LB__CM_invlist[] = {  /* for EBCDIC 1047 */
        0x1CF7,
        0x1CFA,
        0x1DC0,
+       0x1DCD,
+       0x1DCE,
+       0x1DFC,
+       0x1DFD,
        0x1E00,
        0x200C,
        0x200D,
@@ -336937,6 +341242,8 @@ static const UV UNI_LB__CM_invlist[] = {  /* for EBCDIC 1047 */
        0x10D28,
        0x10EAB,
        0x10EAD,
+       0x10EFD,
+       0x10F00,
        0x10F46,
        0x10F51,
        0x10F82,
@@ -336975,6 +341282,8 @@ static const UV UNI_LB__CM_invlist[] = {  /* for EBCDIC 1047 */
        0x11238,
        0x1123E,
        0x1123F,
+       0x11241,
+       0x11242,
        0x112DF,
        0x112EB,
        0x11300,
@@ -337067,6 +341376,18 @@ static const UV UNI_LB__CM_invlist[] = {  /* for EBCDIC 1047 */
        0x11D98,
        0x11EF3,
        0x11EF7,
+       0x11F00,
+       0x11F02,
+       0x11F03,
+       0x11F04,
+       0x11F34,
+       0x11F3B,
+       0x11F3E,
+       0x11F43,
+       0x13440,
+       0x13441,
+       0x13447,
+       0x13456,
        0x16AF0,
        0x16AF5,
        0x16B30,
@@ -337119,12 +341440,16 @@ static const UV UNI_LB__CM_invlist[] = {  /* for EBCDIC 1047 */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E08F,
+       0x1E090,
        0x1E130,
        0x1E137,
        0x1E2AE,
        0x1E2AF,
        0x1E2EC,
        0x1E2F0,
+       0x1E4EC,
+       0x1E4F0,
        0x1E8D0,
        0x1E8D7,
        0x1E944,
@@ -337145,7 +341470,7 @@ static const UV UNI_LB__CM_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_LB__CM_invlist[] = {  /* for EBCDIC 037 */
-       578,    /* Number of elements */
+       604,    /* Number of elements */
        148565664, /* Version and data structure type */
        0,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -337327,6 +341652,8 @@ static const UV UNI_LB__CM_invlist[] = {  /* for EBCDIC 037 */
        0xCD7,
        0xCE2,
        0xCE4,
+       0xCF3,
+       0xCF4,
        0xD00,
        0xD04,
        0xD3B,
@@ -337428,6 +341755,10 @@ static const UV UNI_LB__CM_invlist[] = {  /* for EBCDIC 037 */
        0x1CF7,
        0x1CFA,
        0x1DC0,
+       0x1DCD,
+       0x1DCE,
+       0x1DFC,
+       0x1DFD,
        0x1E00,
        0x200C,
        0x200D,
@@ -337529,6 +341860,8 @@ static const UV UNI_LB__CM_invlist[] = {  /* for EBCDIC 037 */
        0x10D28,
        0x10EAB,
        0x10EAD,
+       0x10EFD,
+       0x10F00,
        0x10F46,
        0x10F51,
        0x10F82,
@@ -337567,6 +341900,8 @@ static const UV UNI_LB__CM_invlist[] = {  /* for EBCDIC 037 */
        0x11238,
        0x1123E,
        0x1123F,
+       0x11241,
+       0x11242,
        0x112DF,
        0x112EB,
        0x11300,
@@ -337659,6 +341994,18 @@ static const UV UNI_LB__CM_invlist[] = {  /* for EBCDIC 037 */
        0x11D98,
        0x11EF3,
        0x11EF7,
+       0x11F00,
+       0x11F02,
+       0x11F03,
+       0x11F04,
+       0x11F34,
+       0x11F3B,
+       0x11F3E,
+       0x11F43,
+       0x13440,
+       0x13441,
+       0x13447,
+       0x13456,
        0x16AF0,
        0x16AF5,
        0x16B30,
@@ -337711,12 +342058,16 @@ static const UV UNI_LB__CM_invlist[] = {  /* for EBCDIC 037 */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E08F,
+       0x1E090,
        0x1E130,
        0x1E137,
        0x1E2AE,
        0x1E2AF,
        0x1E2EC,
        0x1E2F0,
+       0x1E4EC,
+       0x1E4F0,
        0x1E8D0,
        0x1E8D7,
        0x1E944,
@@ -338028,7 +342379,7 @@ static const UV UNI_LB__EX_invlist[] = {  /* for EBCDIC 037 */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_LB__GL_invlist[] = {  /* for ASCII/Latin1 */
-       27,     /* Number of elements */
+       33,     /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -338049,6 +342400,10 @@ static const UV UNI_LB__GL_invlist[] = {  /* for ASCII/Latin1 */
        0xFDB,
        0x180E,
        0x180F,
+       0x1DCD,
+       0x1DCE,
+       0x1DFC,
+       0x1DFD,
        0x2007,
        0x2008,
        0x2011,
@@ -338057,6 +342412,8 @@ static const UV UNI_LB__GL_invlist[] = {  /* for ASCII/Latin1 */
        0x2030,
        0x13430,
        0x13437,
+       0x13439,
+       0x1343C,
        0x16FE4,
        0x16FE5
 };
@@ -338069,7 +342426,7 @@ static const UV UNI_LB__GL_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_LB__GL_invlist[] = {  /* for EBCDIC 1047 */
-       27,     /* Number of elements */
+       33,     /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -338090,6 +342447,10 @@ static const UV UNI_LB__GL_invlist[] = {  /* for EBCDIC 1047 */
        0xFDB,
        0x180E,
        0x180F,
+       0x1DCD,
+       0x1DCE,
+       0x1DFC,
+       0x1DFD,
        0x2007,
        0x2008,
        0x2011,
@@ -338098,6 +342459,8 @@ static const UV UNI_LB__GL_invlist[] = {  /* for EBCDIC 1047 */
        0x2030,
        0x13430,
        0x13437,
+       0x13439,
+       0x1343C,
        0x16FE4,
        0x16FE5
 };
@@ -338110,7 +342473,7 @@ static const UV UNI_LB__GL_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_LB__GL_invlist[] = {  /* for EBCDIC 037 */
-       27,     /* Number of elements */
+       33,     /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -338131,6 +342494,10 @@ static const UV UNI_LB__GL_invlist[] = {  /* for EBCDIC 037 */
        0xFDB,
        0x180E,
        0x180F,
+       0x1DCD,
+       0x1DCE,
+       0x1DFC,
+       0x1DFD,
        0x2007,
        0x2008,
        0x2011,
@@ -338139,6 +342506,8 @@ static const UV UNI_LB__GL_invlist[] = {  /* for EBCDIC 037 */
        0x2030,
        0x13430,
        0x13437,
+       0x13439,
+       0x1343C,
        0x16FE4,
        0x16FE5
 };
@@ -339834,7 +344203,7 @@ static const UV UNI_LB__HY_invlist[] = {  /* for EBCDIC 037 */
 #  endif       /* EBCDIC 037 */
 
 static const UV UNI_LB__ID_invlist[] = {  /* for all charsets */
-       335,    /* Number of elements */
+       337,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -340029,6 +344398,8 @@ static const UV UNI_LB__ID_invlist[] = {  /* for all charsets */
        0xFFDD,
        0xFFE2,
        0xFFE5,
+       0x11F45,
+       0x11F50,
        0x17000,
        0x187F8,
        0x18800,
@@ -340165,7 +344536,7 @@ static const UV UNI_LB__ID_invlist[] = {  /* for all charsets */
        0x1FAC3,
        0x1FAC6,
        0x1FAF0,
-       0x1FAF7,
+       0x1FAF9,
        0x1FB00,
        0x1FC00,
        0x1FFFE,
@@ -340438,7 +344809,7 @@ static const UV UNI_LB__NS_invlist[] = {  /* for all charsets */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_LB__NU_invlist[] = {  /* for ASCII/Latin1 */
-       125,    /* Number of elements */
+       129,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -340551,6 +344922,8 @@ static const UV UNI_LB__NU_invlist[] = {  /* for ASCII/Latin1 */
        0x11D5A,
        0x11DA0,
        0x11DAA,
+       0x11F50,
+       0x11F5A,
        0x16A60,
        0x16A6A,
        0x16AC0,
@@ -340563,6 +344936,8 @@ static const UV UNI_LB__NU_invlist[] = {  /* for ASCII/Latin1 */
        0x1E14A,
        0x1E2F0,
        0x1E2FA,
+       0x1E4F0,
+       0x1E4FA,
        0x1E950,
        0x1E95A,
        0x1FBF0,
@@ -340577,7 +344952,7 @@ static const UV UNI_LB__NU_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_LB__NU_invlist[] = {  /* for EBCDIC 1047 */
-       125,    /* Number of elements */
+       129,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -340690,6 +345065,8 @@ static const UV UNI_LB__NU_invlist[] = {  /* for EBCDIC 1047 */
        0x11D5A,
        0x11DA0,
        0x11DAA,
+       0x11F50,
+       0x11F5A,
        0x16A60,
        0x16A6A,
        0x16AC0,
@@ -340702,6 +345079,8 @@ static const UV UNI_LB__NU_invlist[] = {  /* for EBCDIC 1047 */
        0x1E14A,
        0x1E2F0,
        0x1E2FA,
+       0x1E4F0,
+       0x1E4FA,
        0x1E950,
        0x1E95A,
        0x1FBF0,
@@ -340716,7 +345095,7 @@ static const UV UNI_LB__NU_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_LB__NU_invlist[] = {  /* for EBCDIC 037 */
-       125,    /* Number of elements */
+       129,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -340829,6 +345208,8 @@ static const UV UNI_LB__NU_invlist[] = {  /* for EBCDIC 037 */
        0x11D5A,
        0x11DA0,
        0x11DAA,
+       0x11F50,
+       0x11F5A,
        0x16A60,
        0x16A6A,
        0x16AC0,
@@ -340841,6 +345222,8 @@ static const UV UNI_LB__NU_invlist[] = {  /* for EBCDIC 037 */
        0x1E14A,
        0x1E2F0,
        0x1E2FA,
+       0x1E4F0,
+       0x1E4FA,
        0x1E950,
        0x1E95A,
        0x1FBF0,
@@ -340852,7 +345235,7 @@ static const UV UNI_LB__NU_invlist[] = {  /* for EBCDIC 037 */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_LB__OP_invlist[] = {  /* for ASCII/Latin1 */
-       179,    /* Number of elements */
+       183,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -341031,6 +345414,10 @@ static const UV UNI_LB__OP_invlist[] = {  /* for ASCII/Latin1 */
        0x1337A,
        0x13437,
        0x13438,
+       0x1343C,
+       0x1343D,
+       0x1343E,
+       0x1343F,
        0x145CE,
        0x145CF,
        0x1E95E,
@@ -341045,7 +345432,7 @@ static const UV UNI_LB__OP_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_LB__OP_invlist[] = {  /* for EBCDIC 1047 */
-       177,    /* Number of elements */
+       181,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -341222,6 +345609,10 @@ static const UV UNI_LB__OP_invlist[] = {  /* for EBCDIC 1047 */
        0x1337A,
        0x13437,
        0x13438,
+       0x1343C,
+       0x1343D,
+       0x1343E,
+       0x1343F,
        0x145CE,
        0x145CF,
        0x1E95E,
@@ -341236,7 +345627,7 @@ static const UV UNI_LB__OP_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_LB__OP_invlist[] = {  /* for EBCDIC 037 */
-       177,    /* Number of elements */
+       181,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -341413,6 +345804,10 @@ static const UV UNI_LB__OP_invlist[] = {  /* for EBCDIC 037 */
        0x1337A,
        0x13437,
        0x13438,
+       0x1343C,
+       0x1343D,
+       0x1343E,
+       0x1343F,
        0x145CE,
        0x145CF,
        0x1E95E,
@@ -341424,7 +345819,7 @@ static const UV UNI_LB__OP_invlist[] = {  /* for EBCDIC 037 */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_LB__PO_invlist[] = {  /* for ASCII/Latin1 */
-       49,     /* Number of elements */
+       51,     /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -341447,6 +345842,8 @@ static const UV UNI_LB__PO_invlist[] = {  /* for ASCII/Latin1 */
        0xD7A,
        0x2030,
        0x2038,
+       0x2057,
+       0x2058,
        0x20A7,
        0x20A8,
        0x20B6,
@@ -341487,7 +345884,7 @@ static const UV UNI_LB__PO_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_LB__PO_invlist[] = {  /* for EBCDIC 1047 */
-       49,     /* Number of elements */
+       51,     /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -341510,6 +345907,8 @@ static const UV UNI_LB__PO_invlist[] = {  /* for EBCDIC 1047 */
        0xD7A,
        0x2030,
        0x2038,
+       0x2057,
+       0x2058,
        0x20A7,
        0x20A8,
        0x20B6,
@@ -341550,7 +345949,7 @@ static const UV UNI_LB__PO_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_LB__PO_invlist[] = {  /* for EBCDIC 037 */
-       49,     /* Number of elements */
+       51,     /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -341573,6 +345972,8 @@ static const UV UNI_LB__PO_invlist[] = {  /* for EBCDIC 037 */
        0xD7A,
        0x2030,
        0x2038,
+       0x2057,
+       0x2058,
        0x20A7,
        0x20A8,
        0x20B6,
@@ -341946,7 +346347,7 @@ static const UV UNI_LB__SA_invlist[] = {  /* for all charsets */
        0xEC6,
        0xEC7,
        0xEC8,
-       0xECE,
+       0xECF,
        0xEDC,
        0xEE0,
        0x1000,
@@ -342116,7 +346517,7 @@ static const UV UNI_LB__WJ_invlist[] = {  /* for all charsets */
 };
 
 static const UV UNI_LB__XX_invlist[] = {  /* for all charsets */
-       1308,   /* Number of elements */
+       1328,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -342363,7 +346764,7 @@ static const UV UNI_LB__XX_invlist[] = {  /* for all charsets */
        0xCE6,
        0xCF0,
        0xCF1,
-       0xCF3,
+       0xCF4,
        0xD00,
        0xD0D,
        0xD0E,
@@ -342423,7 +346824,7 @@ static const UV UNI_LB__XX_invlist[] = {  /* for all charsets */
        0xEC6,
        0xEC7,
        0xEC8,
-       0xECE,
+       0xECF,
        0xED0,
        0xEDA,
        0xEDC,
@@ -342960,7 +347361,7 @@ static const UV UNI_LB__XX_invlist[] = {  /* for all charsets */
        0x10EAE,
        0x10EB0,
        0x10EB2,
-       0x10F00,
+       0x10EFD,
        0x10F28,
        0x10F30,
        0x10F5A,
@@ -342995,7 +347396,7 @@ static const UV UNI_LB__XX_invlist[] = {  /* for all charsets */
        0x11200,
        0x11212,
        0x11213,
-       0x1123F,
+       0x11242,
        0x11280,
        0x11287,
        0x11288,
@@ -343100,6 +347501,8 @@ static const UV UNI_LB__XX_invlist[] = {  /* for all charsets */
        0x11AA3,
        0x11AB0,
        0x11AF9,
+       0x11B00,
+       0x11B0A,
        0x11C00,
        0x11C09,
        0x11C0A,
@@ -343142,6 +347545,12 @@ static const UV UNI_LB__XX_invlist[] = {  /* for all charsets */
        0x11DAA,
        0x11EE0,
        0x11EF9,
+       0x11F00,
+       0x11F11,
+       0x11F12,
+       0x11F3B,
+       0x11F3E,
+       0x11F5A,
        0x11FB0,
        0x11FB1,
        0x11FC0,
@@ -343157,9 +347566,7 @@ static const UV UNI_LB__XX_invlist[] = {  /* for all charsets */
        0x12F90,
        0x12FF3,
        0x13000,
-       0x1342F,
-       0x13430,
-       0x13439,
+       0x13456,
        0x14400,
        0x14647,
        0x16800,
@@ -343212,8 +347619,12 @@ static const UV UNI_LB__XX_invlist[] = {  /* for all charsets */
        0x1AFFF,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -343242,6 +347653,8 @@ static const UV UNI_LB__XX_invlist[] = {  /* for all charsets */
        0x1D1EB,
        0x1D200,
        0x1D246,
+       0x1D2C0,
+       0x1D2D4,
        0x1D2E0,
        0x1D2F4,
        0x1D300,
@@ -343296,6 +347709,8 @@ static const UV UNI_LB__XX_invlist[] = {  /* for all charsets */
        0x1DAB0,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
        0x1E000,
        0x1E007,
        0x1E008,
@@ -343306,6 +347721,10 @@ static const UV UNI_LB__XX_invlist[] = {  /* for all charsets */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E030,
+       0x1E06E,
+       0x1E08F,
+       0x1E090,
        0x1E100,
        0x1E12D,
        0x1E130,
@@ -343320,6 +347739,8 @@ static const UV UNI_LB__XX_invlist[] = {  /* for all charsets */
        0x1E2FA,
        0x1E2FF,
        0x1E300,
+       0x1E4D0,
+       0x1E4FA,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -343581,7 +348002,7 @@ static const UV UNI_LISUSUP_invlist[] = {  /* for all charsets */
 };
 
 static const UV UNI_LM_invlist[] = {  /* for all charsets */
-       139,    /* Number of elements */
+       143,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -343720,8 +348141,12 @@ static const UV UNI_LM_invlist[] = {  /* for all charsets */
        0x1AFFC,
        0x1AFFD,
        0x1AFFF,
+       0x1E030,
+       0x1E06E,
        0x1E137,
        0x1E13E,
+       0x1E4EB,
+       0x1E4EC,
        0x1E94B,
        0x1E94C
 };
@@ -343729,7 +348154,7 @@ static const UV UNI_LM_invlist[] = {  /* for all charsets */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_LO_invlist[] = {  /* for ASCII/Latin1 */
-       1003,   /* Number of elements */
+       1021,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -344462,6 +348887,8 @@ static const UV UNI_LO_invlist[] = {  /* for ASCII/Latin1 */
        0x11212,
        0x11213,
        0x1122C,
+       0x1123F,
+       0x11241,
        0x11280,
        0x11287,
        0x11288,
@@ -344584,6 +349011,12 @@ static const UV UNI_LO_invlist[] = {  /* for ASCII/Latin1 */
        0x11D99,
        0x11EE0,
        0x11EF3,
+       0x11F02,
+       0x11F03,
+       0x11F04,
+       0x11F11,
+       0x11F12,
+       0x11F34,
        0x11FB0,
        0x11FB1,
        0x12000,
@@ -344593,7 +349026,9 @@ static const UV UNI_LO_invlist[] = {  /* for ASCII/Latin1 */
        0x12F90,
        0x12FF1,
        0x13000,
-       0x1342F,
+       0x13430,
+       0x13441,
+       0x13447,
        0x14400,
        0x14647,
        0x16800,
@@ -344622,8 +349057,12 @@ static const UV UNI_LO_invlist[] = {  /* for ASCII/Latin1 */
        0x18D09,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -344646,6 +349085,8 @@ static const UV UNI_LO_invlist[] = {  /* for ASCII/Latin1 */
        0x1E2AE,
        0x1E2C0,
        0x1E2EC,
+       0x1E4D0,
+       0x1E4EB,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -344725,7 +349166,7 @@ static const UV UNI_LO_invlist[] = {  /* for ASCII/Latin1 */
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -344735,7 +349176,9 @@ static const UV UNI_LO_invlist[] = {  /* for ASCII/Latin1 */
        0x2F800,
        0x2FA1E,
        0x30000,
-       0x3134B
+       0x3134B,
+       0x31350,
+       0x323B0
 };
 
 #  endif       /* ASCII/Latin1 */
@@ -344746,7 +349189,7 @@ static const UV UNI_LO_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_LO_invlist[] = {  /* for EBCDIC 1047 */
-       1001,   /* Number of elements */
+       1019,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -345477,6 +349920,8 @@ static const UV UNI_LO_invlist[] = {  /* for EBCDIC 1047 */
        0x11212,
        0x11213,
        0x1122C,
+       0x1123F,
+       0x11241,
        0x11280,
        0x11287,
        0x11288,
@@ -345599,6 +350044,12 @@ static const UV UNI_LO_invlist[] = {  /* for EBCDIC 1047 */
        0x11D99,
        0x11EE0,
        0x11EF3,
+       0x11F02,
+       0x11F03,
+       0x11F04,
+       0x11F11,
+       0x11F12,
+       0x11F34,
        0x11FB0,
        0x11FB1,
        0x12000,
@@ -345608,7 +350059,9 @@ static const UV UNI_LO_invlist[] = {  /* for EBCDIC 1047 */
        0x12F90,
        0x12FF1,
        0x13000,
-       0x1342F,
+       0x13430,
+       0x13441,
+       0x13447,
        0x14400,
        0x14647,
        0x16800,
@@ -345637,8 +350090,12 @@ static const UV UNI_LO_invlist[] = {  /* for EBCDIC 1047 */
        0x18D09,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -345661,6 +350118,8 @@ static const UV UNI_LO_invlist[] = {  /* for EBCDIC 1047 */
        0x1E2AE,
        0x1E2C0,
        0x1E2EC,
+       0x1E4D0,
+       0x1E4EB,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -345740,7 +350199,7 @@ static const UV UNI_LO_invlist[] = {  /* for EBCDIC 1047 */
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -345750,7 +350209,9 @@ static const UV UNI_LO_invlist[] = {  /* for EBCDIC 1047 */
        0x2F800,
        0x2FA1E,
        0x30000,
-       0x3134B
+       0x3134B,
+       0x31350,
+       0x323B0
 };
 
 #  endif       /* EBCDIC 1047 */
@@ -345761,7 +350222,7 @@ static const UV UNI_LO_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_LO_invlist[] = {  /* for EBCDIC 037 */
-       1001,   /* Number of elements */
+       1019,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -346492,6 +350953,8 @@ static const UV UNI_LO_invlist[] = {  /* for EBCDIC 037 */
        0x11212,
        0x11213,
        0x1122C,
+       0x1123F,
+       0x11241,
        0x11280,
        0x11287,
        0x11288,
@@ -346614,6 +351077,12 @@ static const UV UNI_LO_invlist[] = {  /* for EBCDIC 037 */
        0x11D99,
        0x11EE0,
        0x11EF3,
+       0x11F02,
+       0x11F03,
+       0x11F04,
+       0x11F11,
+       0x11F12,
+       0x11F34,
        0x11FB0,
        0x11FB1,
        0x12000,
@@ -346623,7 +351092,9 @@ static const UV UNI_LO_invlist[] = {  /* for EBCDIC 037 */
        0x12F90,
        0x12FF1,
        0x13000,
-       0x1342F,
+       0x13430,
+       0x13441,
+       0x13447,
        0x14400,
        0x14647,
        0x16800,
@@ -346652,8 +351123,12 @@ static const UV UNI_LO_invlist[] = {  /* for EBCDIC 037 */
        0x18D09,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -346676,6 +351151,8 @@ static const UV UNI_LO_invlist[] = {  /* for EBCDIC 037 */
        0x1E2AE,
        0x1E2C0,
        0x1E2EC,
+       0x1E4D0,
+       0x1E4EB,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -346755,7 +351232,7 @@ static const UV UNI_LO_invlist[] = {  /* for EBCDIC 037 */
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -346765,7 +351242,9 @@ static const UV UNI_LO_invlist[] = {  /* for EBCDIC 037 */
        0x2F800,
        0x2FA1E,
        0x30000,
-       0x3134B
+       0x3134B,
+       0x31350,
+       0x323B0
 };
 
 #  endif       /* EBCDIC 037 */
@@ -346825,7 +351304,7 @@ static const UV UNI_LYDI_invlist[] = {  /* for all charsets */
 };
 
 static const UV UNI_M_invlist[] = {  /* for all charsets */
-       599,    /* Number of elements */
+       621,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -346990,6 +351469,8 @@ static const UV UNI_M_invlist[] = {  /* for all charsets */
        0xCD7,
        0xCE2,
        0xCE4,
+       0xCF3,
+       0xCF4,
        0xD00,
        0xD04,
        0xD3B,
@@ -347027,7 +351508,7 @@ static const UV UNI_M_invlist[] = {  /* for all charsets */
        0xEB4,
        0xEBD,
        0xEC8,
-       0xECE,
+       0xECF,
        0xF18,
        0xF1A,
        0xF35,
@@ -347230,6 +351711,8 @@ static const UV UNI_M_invlist[] = {  /* for all charsets */
        0x10D28,
        0x10EAB,
        0x10EAD,
+       0x10EFD,
+       0x10F00,
        0x10F46,
        0x10F51,
        0x10F82,
@@ -347268,6 +351751,8 @@ static const UV UNI_M_invlist[] = {  /* for all charsets */
        0x11238,
        0x1123E,
        0x1123F,
+       0x11241,
+       0x11242,
        0x112DF,
        0x112EB,
        0x11300,
@@ -347362,6 +351847,18 @@ static const UV UNI_M_invlist[] = {  /* for all charsets */
        0x11D98,
        0x11EF3,
        0x11EF7,
+       0x11F00,
+       0x11F02,
+       0x11F03,
+       0x11F04,
+       0x11F34,
+       0x11F3B,
+       0x11F3E,
+       0x11F43,
+       0x13440,
+       0x13441,
+       0x13447,
+       0x13456,
        0x16AF0,
        0x16AF5,
        0x16B30,
@@ -347416,12 +351913,16 @@ static const UV UNI_M_invlist[] = {  /* for all charsets */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E08F,
+       0x1E090,
        0x1E130,
        0x1E137,
        0x1E2AE,
        0x1E2AF,
        0x1E2EC,
        0x1E2F0,
+       0x1E4EC,
+       0x1E4F0,
        0x1E8D0,
        0x1E8D7,
        0x1E944,
@@ -348411,7 +352912,7 @@ static const UV UNI_MAYANNUMERALS_invlist[] = {  /* for all charsets */
 };
 
 static const UV UNI_MC_invlist[] = {  /* for all charsets */
-       355,    /* Number of elements */
+       365,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -348486,6 +352987,8 @@ static const UV UNI_MC_invlist[] = {  /* for all charsets */
        0xCCC,
        0xCD5,
        0xCD7,
+       0xCF3,
+       0xCF4,
        0xD02,
        0xD04,
        0xD3E,
@@ -348762,6 +353265,14 @@ static const UV UNI_MC_invlist[] = {  /* for all charsets */
        0x11D97,
        0x11EF5,
        0x11EF7,
+       0x11F03,
+       0x11F04,
+       0x11F34,
+       0x11F36,
+       0x11F3E,
+       0x11F40,
+       0x11F41,
+       0x11F42,
        0x16F51,
        0x16F88,
        0x16FF0,
@@ -348951,7 +353462,7 @@ static const UV UNI_MLYM_invlist[] = {  /* for all charsets */
 };
 
 static const UV UNI_MN_invlist[] = {  /* for all charsets */
-       673,    /* Number of elements */
+       693,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -349141,7 +353652,7 @@ static const UV UNI_MN_invlist[] = {  /* for all charsets */
        0xEB4,
        0xEBD,
        0xEC8,
-       0xECE,
+       0xECF,
        0xF18,
        0xF1A,
        0xF35,
@@ -349402,6 +353913,8 @@ static const UV UNI_MN_invlist[] = {  /* for all charsets */
        0x10D28,
        0x10EAB,
        0x10EAD,
+       0x10EFD,
+       0x10F00,
        0x10F46,
        0x10F51,
        0x10F82,
@@ -349446,6 +353959,8 @@ static const UV UNI_MN_invlist[] = {  /* for all charsets */
        0x11238,
        0x1123E,
        0x1123F,
+       0x11241,
+       0x11242,
        0x112DF,
        0x112E0,
        0x112E3,
@@ -349568,6 +354083,18 @@ static const UV UNI_MN_invlist[] = {  /* for all charsets */
        0x11D98,
        0x11EF3,
        0x11EF5,
+       0x11F00,
+       0x11F02,
+       0x11F36,
+       0x11F3B,
+       0x11F40,
+       0x11F41,
+       0x11F42,
+       0x11F43,
+       0x13440,
+       0x13441,
+       0x13447,
+       0x13456,
        0x16AF0,
        0x16AF5,
        0x16B30,
@@ -349616,12 +354143,16 @@ static const UV UNI_MN_invlist[] = {  /* for all charsets */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E08F,
+       0x1E090,
        0x1E130,
        0x1E137,
        0x1E2AE,
        0x1E2AF,
        0x1E2EC,
        0x1E2F0,
+       0x1E4EC,
+       0x1E4F0,
        0x1E8D0,
        0x1E8D7,
        0x1E944,
@@ -349789,7 +354320,7 @@ static const UV UNI_MYMR_invlist[] = {  /* for all charsets */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_N_invlist[] = {  /* for ASCII/Latin1 */
-       269,    /* Number of elements */
+       275,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -350020,6 +354551,8 @@ static const UV UNI_N_invlist[] = {  /* for ASCII/Latin1 */
        0x11D5A,
        0x11DA0,
        0x11DAA,
+       0x11F50,
+       0x11F5A,
        0x11FC0,
        0x11FD5,
        0x12400,
@@ -350034,6 +354567,8 @@ static const UV UNI_N_invlist[] = {  /* for ASCII/Latin1 */
        0x16B62,
        0x16E80,
        0x16E97,
+       0x1D2C0,
+       0x1D2D4,
        0x1D2E0,
        0x1D2F4,
        0x1D360,
@@ -350044,6 +354579,8 @@ static const UV UNI_N_invlist[] = {  /* for ASCII/Latin1 */
        0x1E14A,
        0x1E2F0,
        0x1E2FA,
+       0x1E4F0,
+       0x1E4FA,
        0x1E8C7,
        0x1E8D0,
        0x1E950,
@@ -350072,7 +354609,7 @@ static const UV UNI_N_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_N_invlist[] = {  /* for EBCDIC 1047 */
-       269,    /* Number of elements */
+       275,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -350303,6 +354840,8 @@ static const UV UNI_N_invlist[] = {  /* for EBCDIC 1047 */
        0x11D5A,
        0x11DA0,
        0x11DAA,
+       0x11F50,
+       0x11F5A,
        0x11FC0,
        0x11FD5,
        0x12400,
@@ -350317,6 +354856,8 @@ static const UV UNI_N_invlist[] = {  /* for EBCDIC 1047 */
        0x16B62,
        0x16E80,
        0x16E97,
+       0x1D2C0,
+       0x1D2D4,
        0x1D2E0,
        0x1D2F4,
        0x1D360,
@@ -350327,6 +354868,8 @@ static const UV UNI_N_invlist[] = {  /* for EBCDIC 1047 */
        0x1E14A,
        0x1E2F0,
        0x1E2FA,
+       0x1E4F0,
+       0x1E4FA,
        0x1E8C7,
        0x1E8D0,
        0x1E950,
@@ -350355,7 +354898,7 @@ static const UV UNI_N_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_N_invlist[] = {  /* for EBCDIC 037 */
-       269,    /* Number of elements */
+       275,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -350586,6 +355129,8 @@ static const UV UNI_N_invlist[] = {  /* for EBCDIC 037 */
        0x11D5A,
        0x11DA0,
        0x11DAA,
+       0x11F50,
+       0x11F5A,
        0x11FC0,
        0x11FD5,
        0x12400,
@@ -350600,6 +355145,8 @@ static const UV UNI_N_invlist[] = {  /* for EBCDIC 037 */
        0x16B62,
        0x16E80,
        0x16E97,
+       0x1D2C0,
+       0x1D2D4,
        0x1D2E0,
        0x1D2F4,
        0x1D360,
@@ -350610,6 +355157,8 @@ static const UV UNI_N_invlist[] = {  /* for EBCDIC 037 */
        0x1E14A,
        0x1E2F0,
        0x1E2FA,
+       0x1E4F0,
+       0x1E4FA,
        0x1E8C7,
        0x1E8D0,
        0x1E950,
@@ -350632,6 +355181,16 @@ static const UV UNI_N_invlist[] = {  /* for EBCDIC 037 */
 
 #  endif       /* EBCDIC 037 */
 
+static const UV UNI_NAGM_invlist[] = {  /* for all charsets */
+       3,      /* Number of elements */
+       148565664, /* Version and data structure type */
+       1,      /* 0 if the list starts at 0;
+                  1 if it starts at the element beyond 0 */
+       0x0,
+       0x1E4D0,
+       0x1E4FA
+};
+
 static const UV UNI_NAND_invlist[] = {  /* for all charsets */
        19,     /* Number of elements */
        148565664, /* Version and data structure type */
@@ -350696,8 +355255,6 @@ static const UV UNI_NB_invlist[] = {  /* for all charsets */
        0x10C80,
        0x10D40,
        0x10E60,
-       0x10EC0,
-       0x10F00,
        0x11250,
        0x11280,
        0x11380,
@@ -350712,17 +355269,17 @@ static const UV UNI_NB_invlist[] = {  /* for all charsets */
        0x118A0,
        0x11960,
        0x119A0,
-       0x11B00,
+       0x11B60,
        0x11C00,
        0x11CC0,
        0x11D00,
        0x11DB0,
        0x11EE0,
-       0x11F00,
+       0x11F60,
        0x11FB0,
        0x12550,
        0x12F90,
-       0x13440,
+       0x13460,
        0x14400,
        0x14680,
        0x16800,
@@ -350741,16 +355298,18 @@ static const UV UNI_NB_invlist[] = {  /* for all charsets */
        0x1CFD0,
        0x1D000,
        0x1D250,
-       0x1D2E0,
+       0x1D2C0,
        0x1D380,
        0x1D400,
        0x1DAB0,
        0x1DF00,
-       0x1E030,
+       0x1E090,
        0x1E100,
        0x1E150,
        0x1E290,
        0x1E300,
+       0x1E4D0,
+       0x1E500,
        0x1E7E0,
        0x1E8E0,
        0x1E900,
@@ -350770,7 +355329,7 @@ static const UV UNI_NB_invlist[] = {  /* for all charsets */
        0x2F800,
        0x2FA20,
        0x30000,
-       0x31350,
+       0x323B0,
        0xE0000,
        0xE0080,
        0xE0100,
@@ -352572,7 +357131,7 @@ static const UV UNI_NFDQC__Y_invlist[] = {  /* for EBCDIC 037 */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_NFKCQC__N_invlist[] = {  /* for ASCII/Latin1 */
-       509,    /* Number of elements */
+       511,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -352997,6 +357556,8 @@ static const UV UNI_NFKCQC__N_invlist[] = {  /* for ASCII/Latin1 */
        0x1D7CC,
        0x1D7CE,
        0x1D800,
+       0x1E030,
+       0x1E06E,
        0x1EE00,
        0x1EE04,
        0x1EE05,
@@ -353095,7 +357656,7 @@ static const UV UNI_NFKCQC__N_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_NFKCQC__N_invlist[] = {  /* for EBCDIC 1047 */
-       515,    /* Number of elements */
+       517,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -353526,6 +358087,8 @@ static const UV UNI_NFKCQC__N_invlist[] = {  /* for EBCDIC 1047 */
        0x1D7CC,
        0x1D7CE,
        0x1D800,
+       0x1E030,
+       0x1E06E,
        0x1EE00,
        0x1EE04,
        0x1EE05,
@@ -353624,7 +358187,7 @@ static const UV UNI_NFKCQC__N_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_NFKCQC__N_invlist[] = {  /* for EBCDIC 037 */
-       513,    /* Number of elements */
+       515,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -354053,6 +358616,8 @@ static const UV UNI_NFKCQC__N_invlist[] = {  /* for EBCDIC 037 */
        0x1D7CC,
        0x1D7CE,
        0x1D800,
+       0x1E030,
+       0x1E06E,
        0x1EE00,
        0x1EE04,
        0x1EE05,
@@ -354148,7 +358713,7 @@ static const UV UNI_NFKCQC__N_invlist[] = {  /* for EBCDIC 037 */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_NFKCQC__Y_invlist[] = {  /* for ASCII/Latin1 */
-       585,    /* Number of elements */
+       587,    /* Number of elements */
        148565664, /* Version and data structure type */
        0,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -354649,6 +359214,8 @@ static const UV UNI_NFKCQC__Y_invlist[] = {  /* for ASCII/Latin1 */
        0x1D7CC,
        0x1D7CE,
        0x1D800,
+       0x1E030,
+       0x1E06E,
        0x1EE00,
        0x1EE04,
        0x1EE05,
@@ -354747,7 +359314,7 @@ static const UV UNI_NFKCQC__Y_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_NFKCQC__Y_invlist[] = {  /* for EBCDIC 1047 */
-       591,    /* Number of elements */
+       593,    /* Number of elements */
        148565664, /* Version and data structure type */
        0,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -355254,6 +359821,8 @@ static const UV UNI_NFKCQC__Y_invlist[] = {  /* for EBCDIC 1047 */
        0x1D7CC,
        0x1D7CE,
        0x1D800,
+       0x1E030,
+       0x1E06E,
        0x1EE00,
        0x1EE04,
        0x1EE05,
@@ -355352,7 +359921,7 @@ static const UV UNI_NFKCQC__Y_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_NFKCQC__Y_invlist[] = {  /* for EBCDIC 037 */
-       589,    /* Number of elements */
+       591,    /* Number of elements */
        148565664, /* Version and data structure type */
        0,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -355857,6 +360426,8 @@ static const UV UNI_NFKCQC__Y_invlist[] = {  /* for EBCDIC 037 */
        0x1D7CC,
        0x1D7CE,
        0x1D800,
+       0x1E030,
+       0x1E06E,
        0x1EE00,
        0x1EE04,
        0x1EE05,
@@ -355952,7 +360523,7 @@ static const UV UNI_NFKCQC__Y_invlist[] = {  /* for EBCDIC 037 */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_NFKDQC__N_invlist[] = {  /* for ASCII/Latin1 */
-       793,    /* Number of elements */
+       795,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -356661,6 +361232,8 @@ static const UV UNI_NFKDQC__N_invlist[] = {  /* for ASCII/Latin1 */
        0x1D7CC,
        0x1D7CE,
        0x1D800,
+       0x1E030,
+       0x1E06E,
        0x1EE00,
        0x1EE04,
        0x1EE05,
@@ -356759,7 +361332,7 @@ static const UV UNI_NFKDQC__N_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_NFKDQC__N_invlist[] = {  /* for EBCDIC 1047 */
-       791,    /* Number of elements */
+       793,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -357466,6 +362039,8 @@ static const UV UNI_NFKDQC__N_invlist[] = {  /* for EBCDIC 1047 */
        0x1D7CC,
        0x1D7CE,
        0x1D800,
+       0x1E030,
+       0x1E06E,
        0x1EE00,
        0x1EE04,
        0x1EE05,
@@ -357564,7 +362139,7 @@ static const UV UNI_NFKDQC__N_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_NFKDQC__N_invlist[] = {  /* for EBCDIC 037 */
-       793,    /* Number of elements */
+       795,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -358273,6 +362848,8 @@ static const UV UNI_NFKDQC__N_invlist[] = {  /* for EBCDIC 037 */
        0x1D7CC,
        0x1D7CE,
        0x1D800,
+       0x1E030,
+       0x1E06E,
        0x1EE00,
        0x1EE04,
        0x1EE05,
@@ -358420,7 +362997,7 @@ static const UV UNI_NL_invlist[] = {  /* for all charsets */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_NO_invlist[] = {  /* for ASCII/Latin1 */
-       143,    /* Number of elements */
+       145,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -358549,6 +363126,8 @@ static const UV UNI_NO_invlist[] = {  /* for ASCII/Latin1 */
        0x16B62,
        0x16E80,
        0x16E97,
+       0x1D2C0,
+       0x1D2D4,
        0x1D2E0,
        0x1D2F4,
        0x1D360,
@@ -358577,7 +363156,7 @@ static const UV UNI_NO_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_NO_invlist[] = {  /* for EBCDIC 1047 */
-       145,    /* Number of elements */
+       147,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -358708,6 +363287,8 @@ static const UV UNI_NO_invlist[] = {  /* for EBCDIC 1047 */
        0x16B62,
        0x16E80,
        0x16E97,
+       0x1D2C0,
+       0x1D2D4,
        0x1D2E0,
        0x1D2F4,
        0x1D360,
@@ -358736,7 +363317,7 @@ static const UV UNI_NO_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_NO_invlist[] = {  /* for EBCDIC 037 */
-       145,    /* Number of elements */
+       147,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -358867,6 +363448,8 @@ static const UV UNI_NO_invlist[] = {  /* for EBCDIC 037 */
        0x16B62,
        0x16E80,
        0x16E97,
+       0x1D2C0,
+       0x1D2D4,
        0x1D2E0,
        0x1D2F4,
        0x1D360,
@@ -359070,7 +363653,7 @@ static const UV UNI_NT__DI_invlist[] = {  /* for EBCDIC 037 */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_NT__NU_invlist[] = {  /* for ASCII/Latin1 */
-       303,    /* Number of elements */
+       305,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -359327,6 +363910,8 @@ static const UV UNI_NT__NU_invlist[] = {  /* for ASCII/Latin1 */
        0x16B62,
        0x16E80,
        0x16E97,
+       0x1D2C0,
+       0x1D2D4,
        0x1D2E0,
        0x1D2F4,
        0x1D360,
@@ -359387,7 +363972,7 @@ static const UV UNI_NT__NU_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_NT__NU_invlist[] = {  /* for EBCDIC 1047 */
-       303,    /* Number of elements */
+       305,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -359644,6 +364229,8 @@ static const UV UNI_NT__NU_invlist[] = {  /* for EBCDIC 1047 */
        0x16B62,
        0x16E80,
        0x16E97,
+       0x1D2C0,
+       0x1D2D4,
        0x1D2E0,
        0x1D2F4,
        0x1D360,
@@ -359704,7 +364291,7 @@ static const UV UNI_NT__NU_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_NT__NU_invlist[] = {  /* for EBCDIC 037 */
-       303,    /* Number of elements */
+       305,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -359961,6 +364548,8 @@ static const UV UNI_NT__NU_invlist[] = {  /* for EBCDIC 037 */
        0x16B62,
        0x16E80,
        0x16E97,
+       0x1D2C0,
+       0x1D2D4,
        0x1D2E0,
        0x1D2F4,
        0x1D360,
@@ -360038,7 +364627,7 @@ static const UV UNI_NV___MINUS_1_SLASH_2_invlist[] = {  /* for all charsets */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_NV__0_invlist[] = {  /* for ASCII/Latin1 */
-       165,    /* Number of elements */
+       171,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -360175,6 +364764,8 @@ static const UV UNI_NV__0_invlist[] = {  /* for ASCII/Latin1 */
        0x11D51,
        0x11DA0,
        0x11DA1,
+       0x11F50,
+       0x11F51,
        0x16A60,
        0x16A61,
        0x16AC0,
@@ -360183,6 +364774,8 @@ static const UV UNI_NV__0_invlist[] = {  /* for ASCII/Latin1 */
        0x16B51,
        0x16E80,
        0x16E81,
+       0x1D2C0,
+       0x1D2C1,
        0x1D2E0,
        0x1D2E1,
        0x1D7CE,
@@ -360199,6 +364792,8 @@ static const UV UNI_NV__0_invlist[] = {  /* for ASCII/Latin1 */
        0x1E141,
        0x1E2F0,
        0x1E2F1,
+       0x1E4F0,
+       0x1E4F1,
        0x1E950,
        0x1E951,
        0x1F100,
@@ -360217,7 +364812,7 @@ static const UV UNI_NV__0_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_NV__0_invlist[] = {  /* for EBCDIC 1047 */
-       165,    /* Number of elements */
+       171,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -360354,6 +364949,8 @@ static const UV UNI_NV__0_invlist[] = {  /* for EBCDIC 1047 */
        0x11D51,
        0x11DA0,
        0x11DA1,
+       0x11F50,
+       0x11F51,
        0x16A60,
        0x16A61,
        0x16AC0,
@@ -360362,6 +364959,8 @@ static const UV UNI_NV__0_invlist[] = {  /* for EBCDIC 1047 */
        0x16B51,
        0x16E80,
        0x16E81,
+       0x1D2C0,
+       0x1D2C1,
        0x1D2E0,
        0x1D2E1,
        0x1D7CE,
@@ -360378,6 +364977,8 @@ static const UV UNI_NV__0_invlist[] = {  /* for EBCDIC 1047 */
        0x1E141,
        0x1E2F0,
        0x1E2F1,
+       0x1E4F0,
+       0x1E4F1,
        0x1E950,
        0x1E951,
        0x1F100,
@@ -360396,7 +364997,7 @@ static const UV UNI_NV__0_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_NV__0_invlist[] = {  /* for EBCDIC 037 */
-       165,    /* Number of elements */
+       171,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -360533,6 +365134,8 @@ static const UV UNI_NV__0_invlist[] = {  /* for EBCDIC 037 */
        0x11D51,
        0x11DA0,
        0x11DA1,
+       0x11F50,
+       0x11F51,
        0x16A60,
        0x16A61,
        0x16AC0,
@@ -360541,6 +365144,8 @@ static const UV UNI_NV__0_invlist[] = {  /* for EBCDIC 037 */
        0x16B51,
        0x16E80,
        0x16E81,
+       0x1D2C0,
+       0x1D2C1,
        0x1D2E0,
        0x1D2E1,
        0x1D7CE,
@@ -360557,6 +365162,8 @@ static const UV UNI_NV__0_invlist[] = {  /* for EBCDIC 037 */
        0x1E141,
        0x1E2F0,
        0x1E2F1,
+       0x1E4F0,
+       0x1E4F1,
        0x1E950,
        0x1E951,
        0x1F100,
@@ -360572,7 +365179,7 @@ static const UV UNI_NV__0_invlist[] = {  /* for EBCDIC 037 */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_NV__1_invlist[] = {  /* for ASCII/Latin1 */
-       277,    /* Number of elements */
+       283,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -360791,6 +365398,8 @@ static const UV UNI_NV__1_invlist[] = {  /* for ASCII/Latin1 */
        0x11D52,
        0x11DA1,
        0x11DA2,
+       0x11F51,
+       0x11F52,
        0x12415,
        0x12416,
        0x1241E,
@@ -360813,6 +365422,8 @@ static const UV UNI_NV__1_invlist[] = {  /* for ASCII/Latin1 */
        0x16E82,
        0x16E94,
        0x16E95,
+       0x1D2C1,
+       0x1D2C2,
        0x1D2E1,
        0x1D2E2,
        0x1D360,
@@ -360835,6 +365446,8 @@ static const UV UNI_NV__1_invlist[] = {  /* for ASCII/Latin1 */
        0x1E142,
        0x1E2F1,
        0x1E2F2,
+       0x1E4F1,
+       0x1E4F2,
        0x1E8C7,
        0x1E8C8,
        0x1E951,
@@ -360863,7 +365476,7 @@ static const UV UNI_NV__1_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_NV__1_invlist[] = {  /* for EBCDIC 1047 */
-       277,    /* Number of elements */
+       283,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -361082,6 +365695,8 @@ static const UV UNI_NV__1_invlist[] = {  /* for EBCDIC 1047 */
        0x11D52,
        0x11DA1,
        0x11DA2,
+       0x11F51,
+       0x11F52,
        0x12415,
        0x12416,
        0x1241E,
@@ -361104,6 +365719,8 @@ static const UV UNI_NV__1_invlist[] = {  /* for EBCDIC 1047 */
        0x16E82,
        0x16E94,
        0x16E95,
+       0x1D2C1,
+       0x1D2C2,
        0x1D2E1,
        0x1D2E2,
        0x1D360,
@@ -361126,6 +365743,8 @@ static const UV UNI_NV__1_invlist[] = {  /* for EBCDIC 1047 */
        0x1E142,
        0x1E2F1,
        0x1E2F2,
+       0x1E4F1,
+       0x1E4F2,
        0x1E8C7,
        0x1E8C8,
        0x1E951,
@@ -361154,7 +365773,7 @@ static const UV UNI_NV__1_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_NV__1_invlist[] = {  /* for EBCDIC 037 */
-       277,    /* Number of elements */
+       283,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -361373,6 +365992,8 @@ static const UV UNI_NV__1_invlist[] = {  /* for EBCDIC 037 */
        0x11D52,
        0x11DA1,
        0x11DA2,
+       0x11F51,
+       0x11F52,
        0x12415,
        0x12416,
        0x1241E,
@@ -361395,6 +366016,8 @@ static const UV UNI_NV__1_invlist[] = {  /* for EBCDIC 037 */
        0x16E82,
        0x16E94,
        0x16E95,
+       0x1D2C1,
+       0x1D2C2,
        0x1D2E1,
        0x1D2E2,
        0x1D360,
@@ -361417,6 +366040,8 @@ static const UV UNI_NV__1_invlist[] = {  /* for EBCDIC 037 */
        0x1E142,
        0x1E2F1,
        0x1E2F2,
+       0x1E4F1,
+       0x1E4F2,
        0x1E8C7,
        0x1E8C8,
        0x1E951,
@@ -361916,7 +366541,7 @@ static const UV UNI_NV__1_SLASH_9_invlist[] = {  /* for all charsets */
 };
 
 static const UV UNI_NV__10_invlist[] = {  /* for all charsets */
-       117,    /* Number of elements */
+       119,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -362027,6 +366652,8 @@ static const UV UNI_NV__10_invlist[] = {  /* for all charsets */
        0x16B5C,
        0x16E8A,
        0x16E8B,
+       0x1D2CA,
+       0x1D2CB,
        0x1D2EA,
        0x1D2EB,
        0x1D369,
@@ -362276,7 +366903,7 @@ static const UV UNI_NV__1000000000000_invlist[] = {  /* for all charsets */
 };
 
 static const UV UNI_NV__11_invlist[] = {  /* for all charsets */
-       17,     /* Number of elements */
+       19,     /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -362295,6 +366922,8 @@ static const UV UNI_NV__11_invlist[] = {  /* for all charsets */
        0x24EC,
        0x16E8B,
        0x16E8C,
+       0x1D2CB,
+       0x1D2CC,
        0x1D2EB,
        0x1D2EC
 };
@@ -362320,7 +366949,7 @@ static const UV UNI_NV__11_SLASH_2_invlist[] = {  /* for all charsets */
 };
 
 static const UV UNI_NV__12_invlist[] = {  /* for all charsets */
-       17,     /* Number of elements */
+       19,     /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -362339,12 +366968,14 @@ static const UV UNI_NV__12_invlist[] = {  /* for all charsets */
        0x24ED,
        0x16E8C,
        0x16E8D,
+       0x1D2CC,
+       0x1D2CD,
        0x1D2EC,
        0x1D2ED
 };
 
 static const UV UNI_NV__13_invlist[] = {  /* for all charsets */
-       13,     /* Number of elements */
+       15,     /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -362359,6 +366990,8 @@ static const UV UNI_NV__13_invlist[] = {  /* for all charsets */
        0x24EE,
        0x16E8D,
        0x16E8E,
+       0x1D2CD,
+       0x1D2CE,
        0x1D2ED,
        0x1D2EE
 };
@@ -362374,7 +367007,7 @@ static const UV UNI_NV__13_SLASH_2_invlist[] = {  /* for all charsets */
 };
 
 static const UV UNI_NV__14_invlist[] = {  /* for all charsets */
-       13,     /* Number of elements */
+       15,     /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -362389,12 +367022,14 @@ static const UV UNI_NV__14_invlist[] = {  /* for all charsets */
        0x24EF,
        0x16E8E,
        0x16E8F,
+       0x1D2CE,
+       0x1D2CF,
        0x1D2EE,
        0x1D2EF
 };
 
 static const UV UNI_NV__15_invlist[] = {  /* for all charsets */
-       13,     /* Number of elements */
+       15,     /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -362409,6 +367044,8 @@ static const UV UNI_NV__15_invlist[] = {  /* for all charsets */
        0x24F0,
        0x16E8F,
        0x16E90,
+       0x1D2CF,
+       0x1D2D0,
        0x1D2EF,
        0x1D2F0
 };
@@ -362424,7 +367061,7 @@ static const UV UNI_NV__15_SLASH_2_invlist[] = {  /* for all charsets */
 };
 
 static const UV UNI_NV__16_invlist[] = {  /* for all charsets */
-       15,     /* Number of elements */
+       17,     /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -362441,12 +367078,14 @@ static const UV UNI_NV__16_invlist[] = {  /* for all charsets */
        0x24F1,
        0x16E90,
        0x16E91,
+       0x1D2D0,
+       0x1D2D1,
        0x1D2F0,
        0x1D2F1
 };
 
 static const UV UNI_NV__17_invlist[] = {  /* for all charsets */
-       15,     /* Number of elements */
+       17,     /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -362463,6 +367102,8 @@ static const UV UNI_NV__17_invlist[] = {  /* for all charsets */
        0x24F2,
        0x16E91,
        0x16E92,
+       0x1D2D1,
+       0x1D2D2,
        0x1D2F1,
        0x1D2F2
 };
@@ -362478,7 +367119,7 @@ static const UV UNI_NV__17_SLASH_2_invlist[] = {  /* for all charsets */
 };
 
 static const UV UNI_NV__18_invlist[] = {  /* for all charsets */
-       15,     /* Number of elements */
+       17,     /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -362495,12 +367136,14 @@ static const UV UNI_NV__18_invlist[] = {  /* for all charsets */
        0x24F3,
        0x16E92,
        0x16E93,
+       0x1D2D2,
+       0x1D2D3,
        0x1D2F2,
        0x1D2F3
 };
 
 static const UV UNI_NV__19_invlist[] = {  /* for all charsets */
-       15,     /* Number of elements */
+       17,     /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -362517,6 +367160,8 @@ static const UV UNI_NV__19_invlist[] = {  /* for all charsets */
        0x24F4,
        0x16E93,
        0x16E94,
+       0x1D2D3,
+       0x1D2D4,
        0x1D2F3,
        0x1D2F4
 };
@@ -362524,7 +367169,7 @@ static const UV UNI_NV__19_invlist[] = {  /* for all charsets */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_NV__2_invlist[] = {  /* for ASCII/Latin1 */
-       275,    /* Number of elements */
+       281,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -362733,6 +367378,8 @@ static const UV UNI_NV__2_invlist[] = {  /* for ASCII/Latin1 */
        0x11D53,
        0x11DA2,
        0x11DA3,
+       0x11F52,
+       0x11F53,
        0x12400,
        0x12401,
        0x12416,
@@ -362763,6 +367410,8 @@ static const UV UNI_NV__2_invlist[] = {  /* for ASCII/Latin1 */
        0x16E83,
        0x16E95,
        0x16E96,
+       0x1D2C2,
+       0x1D2C3,
        0x1D2E2,
        0x1D2E3,
        0x1D361,
@@ -362783,6 +367432,8 @@ static const UV UNI_NV__2_invlist[] = {  /* for ASCII/Latin1 */
        0x1E143,
        0x1E2F2,
        0x1E2F3,
+       0x1E4F2,
+       0x1E4F3,
        0x1E8C8,
        0x1E8C9,
        0x1E952,
@@ -362813,7 +367464,7 @@ static const UV UNI_NV__2_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_NV__2_invlist[] = {  /* for EBCDIC 1047 */
-       275,    /* Number of elements */
+       281,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -363022,6 +367673,8 @@ static const UV UNI_NV__2_invlist[] = {  /* for EBCDIC 1047 */
        0x11D53,
        0x11DA2,
        0x11DA3,
+       0x11F52,
+       0x11F53,
        0x12400,
        0x12401,
        0x12416,
@@ -363052,6 +367705,8 @@ static const UV UNI_NV__2_invlist[] = {  /* for EBCDIC 1047 */
        0x16E83,
        0x16E95,
        0x16E96,
+       0x1D2C2,
+       0x1D2C3,
        0x1D2E2,
        0x1D2E3,
        0x1D361,
@@ -363072,6 +367727,8 @@ static const UV UNI_NV__2_invlist[] = {  /* for EBCDIC 1047 */
        0x1E143,
        0x1E2F2,
        0x1E2F3,
+       0x1E4F2,
+       0x1E4F3,
        0x1E8C8,
        0x1E8C9,
        0x1E952,
@@ -363102,7 +367759,7 @@ static const UV UNI_NV__2_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_NV__2_invlist[] = {  /* for EBCDIC 037 */
-       275,    /* Number of elements */
+       281,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -363311,6 +367968,8 @@ static const UV UNI_NV__2_invlist[] = {  /* for EBCDIC 037 */
        0x11D53,
        0x11DA2,
        0x11DA3,
+       0x11F52,
+       0x11F53,
        0x12400,
        0x12401,
        0x12416,
@@ -363341,6 +368000,8 @@ static const UV UNI_NV__2_invlist[] = {  /* for EBCDIC 037 */
        0x16E83,
        0x16E95,
        0x16E96,
+       0x1D2C2,
+       0x1D2C3,
        0x1D2E2,
        0x1D2E3,
        0x1D361,
@@ -363361,6 +368022,8 @@ static const UV UNI_NV__2_invlist[] = {  /* for EBCDIC 037 */
        0x1E143,
        0x1E2F2,
        0x1E2F3,
+       0x1E4F2,
+       0x1E4F3,
        0x1E8C8,
        0x1E8C9,
        0x1E952,
@@ -363676,7 +368339,7 @@ static const UV UNI_NV__29_invlist[] = {  /* for all charsets */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_NV__3_invlist[] = {  /* for ASCII/Latin1 */
-       269,    /* Number of elements */
+       275,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -363873,6 +368536,8 @@ static const UV UNI_NV__3_invlist[] = {  /* for ASCII/Latin1 */
        0x11D54,
        0x11DA3,
        0x11DA4,
+       0x11F53,
+       0x11F54,
        0x12401,
        0x12402,
        0x12408,
@@ -363905,6 +368570,8 @@ static const UV UNI_NV__3_invlist[] = {  /* for ASCII/Latin1 */
        0x16E84,
        0x16E96,
        0x16E97,
+       0x1D2C3,
+       0x1D2C4,
        0x1D2E3,
        0x1D2E4,
        0x1D362,
@@ -363925,6 +368592,8 @@ static const UV UNI_NV__3_invlist[] = {  /* for ASCII/Latin1 */
        0x1E144,
        0x1E2F3,
        0x1E2F4,
+       0x1E4F3,
+       0x1E4F4,
        0x1E8C9,
        0x1E8CA,
        0x1E953,
@@ -363959,7 +368628,7 @@ static const UV UNI_NV__3_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_NV__3_invlist[] = {  /* for EBCDIC 1047 */
-       269,    /* Number of elements */
+       275,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -364156,6 +368825,8 @@ static const UV UNI_NV__3_invlist[] = {  /* for EBCDIC 1047 */
        0x11D54,
        0x11DA3,
        0x11DA4,
+       0x11F53,
+       0x11F54,
        0x12401,
        0x12402,
        0x12408,
@@ -364188,6 +368859,8 @@ static const UV UNI_NV__3_invlist[] = {  /* for EBCDIC 1047 */
        0x16E84,
        0x16E96,
        0x16E97,
+       0x1D2C3,
+       0x1D2C4,
        0x1D2E3,
        0x1D2E4,
        0x1D362,
@@ -364208,6 +368881,8 @@ static const UV UNI_NV__3_invlist[] = {  /* for EBCDIC 1047 */
        0x1E144,
        0x1E2F3,
        0x1E2F4,
+       0x1E4F3,
+       0x1E4F4,
        0x1E8C9,
        0x1E8CA,
        0x1E953,
@@ -364242,7 +368917,7 @@ static const UV UNI_NV__3_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_NV__3_invlist[] = {  /* for EBCDIC 037 */
-       269,    /* Number of elements */
+       275,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -364439,6 +369114,8 @@ static const UV UNI_NV__3_invlist[] = {  /* for EBCDIC 037 */
        0x11D54,
        0x11DA3,
        0x11DA4,
+       0x11F53,
+       0x11F54,
        0x12401,
        0x12402,
        0x12408,
@@ -364471,6 +369148,8 @@ static const UV UNI_NV__3_invlist[] = {  /* for EBCDIC 037 */
        0x16E84,
        0x16E96,
        0x16E97,
+       0x1D2C3,
+       0x1D2C4,
        0x1D2E3,
        0x1D2E4,
        0x1D362,
@@ -364491,6 +369170,8 @@ static const UV UNI_NV__3_invlist[] = {  /* for EBCDIC 037 */
        0x1E144,
        0x1E2F3,
        0x1E2F4,
+       0x1E4F3,
+       0x1E4F4,
        0x1E8C9,
        0x1E8CA,
        0x1E953,
@@ -364900,7 +369581,7 @@ static const UV UNI_NV__39_invlist[] = {  /* for all charsets */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_NV__4_invlist[] = {  /* for ASCII/Latin1 */
-       255,    /* Number of elements */
+       261,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -365085,6 +369766,8 @@ static const UV UNI_NV__4_invlist[] = {  /* for ASCII/Latin1 */
        0x11D55,
        0x11DA4,
        0x11DA5,
+       0x11F54,
+       0x11F55,
        0x12402,
        0x12403,
        0x12409,
@@ -365117,6 +369800,8 @@ static const UV UNI_NV__4_invlist[] = {  /* for ASCII/Latin1 */
        0x16B55,
        0x16E84,
        0x16E85,
+       0x1D2C4,
+       0x1D2C5,
        0x1D2E4,
        0x1D2E5,
        0x1D363,
@@ -365137,6 +369822,8 @@ static const UV UNI_NV__4_invlist[] = {  /* for ASCII/Latin1 */
        0x1E145,
        0x1E2F4,
        0x1E2F5,
+       0x1E4F4,
+       0x1E4F5,
        0x1E8CA,
        0x1E8CB,
        0x1E954,
@@ -365169,7 +369856,7 @@ static const UV UNI_NV__4_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_NV__4_invlist[] = {  /* for EBCDIC 1047 */
-       255,    /* Number of elements */
+       261,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -365354,6 +370041,8 @@ static const UV UNI_NV__4_invlist[] = {  /* for EBCDIC 1047 */
        0x11D55,
        0x11DA4,
        0x11DA5,
+       0x11F54,
+       0x11F55,
        0x12402,
        0x12403,
        0x12409,
@@ -365386,6 +370075,8 @@ static const UV UNI_NV__4_invlist[] = {  /* for EBCDIC 1047 */
        0x16B55,
        0x16E84,
        0x16E85,
+       0x1D2C4,
+       0x1D2C5,
        0x1D2E4,
        0x1D2E5,
        0x1D363,
@@ -365406,6 +370097,8 @@ static const UV UNI_NV__4_invlist[] = {  /* for EBCDIC 1047 */
        0x1E145,
        0x1E2F4,
        0x1E2F5,
+       0x1E4F4,
+       0x1E4F5,
        0x1E8CA,
        0x1E8CB,
        0x1E954,
@@ -365438,7 +370131,7 @@ static const UV UNI_NV__4_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_NV__4_invlist[] = {  /* for EBCDIC 037 */
-       255,    /* Number of elements */
+       261,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -365623,6 +370316,8 @@ static const UV UNI_NV__4_invlist[] = {  /* for EBCDIC 037 */
        0x11D55,
        0x11DA4,
        0x11DA5,
+       0x11F54,
+       0x11F55,
        0x12402,
        0x12403,
        0x12409,
@@ -365655,6 +370350,8 @@ static const UV UNI_NV__4_invlist[] = {  /* for EBCDIC 037 */
        0x16B55,
        0x16E84,
        0x16E85,
+       0x1D2C4,
+       0x1D2C5,
        0x1D2E4,
        0x1D2E5,
        0x1D363,
@@ -365675,6 +370372,8 @@ static const UV UNI_NV__4_invlist[] = {  /* for EBCDIC 037 */
        0x1E145,
        0x1E2F4,
        0x1E2F5,
+       0x1E4F4,
+       0x1E4F5,
        0x1E8CA,
        0x1E8CB,
        0x1E954,
@@ -365922,7 +370621,7 @@ static const UV UNI_NV__49_invlist[] = {  /* for all charsets */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_NV__5_invlist[] = {  /* for ASCII/Latin1 */
-       259,    /* Number of elements */
+       265,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -366115,6 +370814,8 @@ static const UV UNI_NV__5_invlist[] = {  /* for ASCII/Latin1 */
        0x11D56,
        0x11DA5,
        0x11DA6,
+       0x11F55,
+       0x11F56,
        0x12403,
        0x12404,
        0x1240A,
@@ -366145,6 +370846,8 @@ static const UV UNI_NV__5_invlist[] = {  /* for ASCII/Latin1 */
        0x16B56,
        0x16E85,
        0x16E86,
+       0x1D2C5,
+       0x1D2C6,
        0x1D2E5,
        0x1D2E6,
        0x1D364,
@@ -366167,6 +370870,8 @@ static const UV UNI_NV__5_invlist[] = {  /* for ASCII/Latin1 */
        0x1E146,
        0x1E2F5,
        0x1E2F6,
+       0x1E4F5,
+       0x1E4F6,
        0x1E8CB,
        0x1E8CC,
        0x1E955,
@@ -366195,7 +370900,7 @@ static const UV UNI_NV__5_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_NV__5_invlist[] = {  /* for EBCDIC 1047 */
-       259,    /* Number of elements */
+       265,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -366388,6 +371093,8 @@ static const UV UNI_NV__5_invlist[] = {  /* for EBCDIC 1047 */
        0x11D56,
        0x11DA5,
        0x11DA6,
+       0x11F55,
+       0x11F56,
        0x12403,
        0x12404,
        0x1240A,
@@ -366418,6 +371125,8 @@ static const UV UNI_NV__5_invlist[] = {  /* for EBCDIC 1047 */
        0x16B56,
        0x16E85,
        0x16E86,
+       0x1D2C5,
+       0x1D2C6,
        0x1D2E5,
        0x1D2E6,
        0x1D364,
@@ -366440,6 +371149,8 @@ static const UV UNI_NV__5_invlist[] = {  /* for EBCDIC 1047 */
        0x1E146,
        0x1E2F5,
        0x1E2F6,
+       0x1E4F5,
+       0x1E4F6,
        0x1E8CB,
        0x1E8CC,
        0x1E955,
@@ -366468,7 +371179,7 @@ static const UV UNI_NV__5_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_NV__5_invlist[] = {  /* for EBCDIC 037 */
-       259,    /* Number of elements */
+       265,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -366661,6 +371372,8 @@ static const UV UNI_NV__5_invlist[] = {  /* for EBCDIC 037 */
        0x11D56,
        0x11DA5,
        0x11DA6,
+       0x11F55,
+       0x11F56,
        0x12403,
        0x12404,
        0x1240A,
@@ -366691,6 +371404,8 @@ static const UV UNI_NV__5_invlist[] = {  /* for EBCDIC 037 */
        0x16B56,
        0x16E85,
        0x16E86,
+       0x1D2C5,
+       0x1D2C6,
        0x1D2E5,
        0x1D2E6,
        0x1D364,
@@ -366713,6 +371428,8 @@ static const UV UNI_NV__5_invlist[] = {  /* for EBCDIC 037 */
        0x1E146,
        0x1E2F5,
        0x1E2F6,
+       0x1E4F5,
+       0x1E4F6,
        0x1E8CB,
        0x1E8CC,
        0x1E955,
@@ -366930,7 +371647,7 @@ static const UV UNI_NV__500000_invlist[] = {  /* for all charsets */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_NV__6_invlist[] = {  /* for ASCII/Latin1 */
-       229,    /* Number of elements */
+       235,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -367103,6 +371820,8 @@ static const UV UNI_NV__6_invlist[] = {  /* for ASCII/Latin1 */
        0x11D57,
        0x11DA6,
        0x11DA7,
+       0x11F56,
+       0x11F57,
        0x12404,
        0x12405,
        0x1240B,
@@ -367127,6 +371846,8 @@ static const UV UNI_NV__6_invlist[] = {  /* for ASCII/Latin1 */
        0x16B57,
        0x16E86,
        0x16E87,
+       0x1D2C6,
+       0x1D2C7,
        0x1D2E6,
        0x1D2E7,
        0x1D365,
@@ -367145,6 +371866,8 @@ static const UV UNI_NV__6_invlist[] = {  /* for ASCII/Latin1 */
        0x1E147,
        0x1E2F6,
        0x1E2F7,
+       0x1E4F6,
+       0x1E4F7,
        0x1E8CC,
        0x1E8CD,
        0x1E956,
@@ -367173,7 +371896,7 @@ static const UV UNI_NV__6_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_NV__6_invlist[] = {  /* for EBCDIC 1047 */
-       229,    /* Number of elements */
+       235,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -367346,6 +372069,8 @@ static const UV UNI_NV__6_invlist[] = {  /* for EBCDIC 1047 */
        0x11D57,
        0x11DA6,
        0x11DA7,
+       0x11F56,
+       0x11F57,
        0x12404,
        0x12405,
        0x1240B,
@@ -367370,6 +372095,8 @@ static const UV UNI_NV__6_invlist[] = {  /* for EBCDIC 1047 */
        0x16B57,
        0x16E86,
        0x16E87,
+       0x1D2C6,
+       0x1D2C7,
        0x1D2E6,
        0x1D2E7,
        0x1D365,
@@ -367388,6 +372115,8 @@ static const UV UNI_NV__6_invlist[] = {  /* for EBCDIC 1047 */
        0x1E147,
        0x1E2F6,
        0x1E2F7,
+       0x1E4F6,
+       0x1E4F7,
        0x1E8CC,
        0x1E8CD,
        0x1E956,
@@ -367416,7 +372145,7 @@ static const UV UNI_NV__6_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_NV__6_invlist[] = {  /* for EBCDIC 037 */
-       229,    /* Number of elements */
+       235,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -367589,6 +372318,8 @@ static const UV UNI_NV__6_invlist[] = {  /* for EBCDIC 037 */
        0x11D57,
        0x11DA6,
        0x11DA7,
+       0x11F56,
+       0x11F57,
        0x12404,
        0x12405,
        0x1240B,
@@ -367613,6 +372344,8 @@ static const UV UNI_NV__6_invlist[] = {  /* for EBCDIC 037 */
        0x16B57,
        0x16E86,
        0x16E87,
+       0x1D2C6,
+       0x1D2C7,
        0x1D2E6,
        0x1D2E7,
        0x1D365,
@@ -367631,6 +372364,8 @@ static const UV UNI_NV__6_invlist[] = {  /* for EBCDIC 037 */
        0x1E147,
        0x1E2F6,
        0x1E2F7,
+       0x1E4F6,
+       0x1E4F7,
        0x1E8CC,
        0x1E8CD,
        0x1E956,
@@ -367754,7 +372489,7 @@ static const UV UNI_NV__600000_invlist[] = {  /* for all charsets */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_NV__7_invlist[] = {  /* for ASCII/Latin1 */
-       223,    /* Number of elements */
+       229,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -367923,6 +372658,8 @@ static const UV UNI_NV__7_invlist[] = {  /* for ASCII/Latin1 */
        0x11D58,
        0x11DA7,
        0x11DA8,
+       0x11F57,
+       0x11F58,
        0x12405,
        0x12406,
        0x1240C,
@@ -367945,6 +372682,8 @@ static const UV UNI_NV__7_invlist[] = {  /* for ASCII/Latin1 */
        0x16B58,
        0x16E87,
        0x16E88,
+       0x1D2C7,
+       0x1D2C8,
        0x1D2E7,
        0x1D2E8,
        0x1D366,
@@ -367963,6 +372702,8 @@ static const UV UNI_NV__7_invlist[] = {  /* for ASCII/Latin1 */
        0x1E148,
        0x1E2F7,
        0x1E2F8,
+       0x1E4F7,
+       0x1E4F8,
        0x1E8CD,
        0x1E8CE,
        0x1E957,
@@ -367991,7 +372732,7 @@ static const UV UNI_NV__7_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_NV__7_invlist[] = {  /* for EBCDIC 1047 */
-       223,    /* Number of elements */
+       229,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -368160,6 +372901,8 @@ static const UV UNI_NV__7_invlist[] = {  /* for EBCDIC 1047 */
        0x11D58,
        0x11DA7,
        0x11DA8,
+       0x11F57,
+       0x11F58,
        0x12405,
        0x12406,
        0x1240C,
@@ -368182,6 +372925,8 @@ static const UV UNI_NV__7_invlist[] = {  /* for EBCDIC 1047 */
        0x16B58,
        0x16E87,
        0x16E88,
+       0x1D2C7,
+       0x1D2C8,
        0x1D2E7,
        0x1D2E8,
        0x1D366,
@@ -368200,6 +372945,8 @@ static const UV UNI_NV__7_invlist[] = {  /* for EBCDIC 1047 */
        0x1E148,
        0x1E2F7,
        0x1E2F8,
+       0x1E4F7,
+       0x1E4F8,
        0x1E8CD,
        0x1E8CE,
        0x1E957,
@@ -368228,7 +372975,7 @@ static const UV UNI_NV__7_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_NV__7_invlist[] = {  /* for EBCDIC 037 */
-       223,    /* Number of elements */
+       229,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -368397,6 +373144,8 @@ static const UV UNI_NV__7_invlist[] = {  /* for EBCDIC 037 */
        0x11D58,
        0x11DA7,
        0x11DA8,
+       0x11F57,
+       0x11F58,
        0x12405,
        0x12406,
        0x1240C,
@@ -368419,6 +373168,8 @@ static const UV UNI_NV__7_invlist[] = {  /* for EBCDIC 037 */
        0x16B58,
        0x16E87,
        0x16E88,
+       0x1D2C7,
+       0x1D2C8,
        0x1D2E7,
        0x1D2E8,
        0x1D366,
@@ -368437,6 +373188,8 @@ static const UV UNI_NV__7_invlist[] = {  /* for EBCDIC 037 */
        0x1E148,
        0x1E2F7,
        0x1E2F8,
+       0x1E4F7,
+       0x1E4F8,
        0x1E8CD,
        0x1E8CE,
        0x1E957,
@@ -368588,7 +373341,7 @@ static const UV UNI_NV__700000_invlist[] = {  /* for all charsets */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_NV__8_invlist[] = {  /* for ASCII/Latin1 */
-       217,    /* Number of elements */
+       223,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -368753,6 +373506,8 @@ static const UV UNI_NV__8_invlist[] = {  /* for ASCII/Latin1 */
        0x11D59,
        0x11DA8,
        0x11DA9,
+       0x11F58,
+       0x11F59,
        0x12406,
        0x12407,
        0x1240D,
@@ -368775,6 +373530,8 @@ static const UV UNI_NV__8_invlist[] = {  /* for ASCII/Latin1 */
        0x16B59,
        0x16E88,
        0x16E89,
+       0x1D2C8,
+       0x1D2C9,
        0x1D2E8,
        0x1D2E9,
        0x1D367,
@@ -368793,6 +373550,8 @@ static const UV UNI_NV__8_invlist[] = {  /* for ASCII/Latin1 */
        0x1E149,
        0x1E2F8,
        0x1E2F9,
+       0x1E4F8,
+       0x1E4F9,
        0x1E8CE,
        0x1E8CF,
        0x1E958,
@@ -368819,7 +373578,7 @@ static const UV UNI_NV__8_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_NV__8_invlist[] = {  /* for EBCDIC 1047 */
-       217,    /* Number of elements */
+       223,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -368984,6 +373743,8 @@ static const UV UNI_NV__8_invlist[] = {  /* for EBCDIC 1047 */
        0x11D59,
        0x11DA8,
        0x11DA9,
+       0x11F58,
+       0x11F59,
        0x12406,
        0x12407,
        0x1240D,
@@ -369006,6 +373767,8 @@ static const UV UNI_NV__8_invlist[] = {  /* for EBCDIC 1047 */
        0x16B59,
        0x16E88,
        0x16E89,
+       0x1D2C8,
+       0x1D2C9,
        0x1D2E8,
        0x1D2E9,
        0x1D367,
@@ -369024,6 +373787,8 @@ static const UV UNI_NV__8_invlist[] = {  /* for EBCDIC 1047 */
        0x1E149,
        0x1E2F8,
        0x1E2F9,
+       0x1E4F8,
+       0x1E4F9,
        0x1E8CE,
        0x1E8CF,
        0x1E958,
@@ -369050,7 +373815,7 @@ static const UV UNI_NV__8_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_NV__8_invlist[] = {  /* for EBCDIC 037 */
-       217,    /* Number of elements */
+       223,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -369215,6 +373980,8 @@ static const UV UNI_NV__8_invlist[] = {  /* for EBCDIC 037 */
        0x11D59,
        0x11DA8,
        0x11DA9,
+       0x11F58,
+       0x11F59,
        0x12406,
        0x12407,
        0x1240D,
@@ -369237,6 +374004,8 @@ static const UV UNI_NV__8_invlist[] = {  /* for EBCDIC 037 */
        0x16B59,
        0x16E88,
        0x16E89,
+       0x1D2C8,
+       0x1D2C9,
        0x1D2E8,
        0x1D2E9,
        0x1D367,
@@ -369255,6 +374024,8 @@ static const UV UNI_NV__8_invlist[] = {  /* for EBCDIC 037 */
        0x1E149,
        0x1E2F8,
        0x1E2F9,
+       0x1E4F8,
+       0x1E4F9,
        0x1E8CE,
        0x1E8CF,
        0x1E958,
@@ -369372,7 +374143,7 @@ static const UV UNI_NV__800000_invlist[] = {  /* for all charsets */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_NV__9_invlist[] = {  /* for ASCII/Latin1 */
-       221,    /* Number of elements */
+       227,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -369539,6 +374310,8 @@ static const UV UNI_NV__9_invlist[] = {  /* for ASCII/Latin1 */
        0x11D5A,
        0x11DA9,
        0x11DAA,
+       0x11F59,
+       0x11F5A,
        0x12407,
        0x12408,
        0x1240E,
@@ -369561,6 +374334,8 @@ static const UV UNI_NV__9_invlist[] = {  /* for ASCII/Latin1 */
        0x16B5A,
        0x16E89,
        0x16E8A,
+       0x1D2C9,
+       0x1D2CA,
        0x1D2E9,
        0x1D2EA,
        0x1D368,
@@ -369579,6 +374354,8 @@ static const UV UNI_NV__9_invlist[] = {  /* for ASCII/Latin1 */
        0x1E14A,
        0x1E2F9,
        0x1E2FA,
+       0x1E4F9,
+       0x1E4FA,
        0x1E8CF,
        0x1E8D0,
        0x1E959,
@@ -369607,7 +374384,7 @@ static const UV UNI_NV__9_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_NV__9_invlist[] = {  /* for EBCDIC 1047 */
-       221,    /* Number of elements */
+       227,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -369774,6 +374551,8 @@ static const UV UNI_NV__9_invlist[] = {  /* for EBCDIC 1047 */
        0x11D5A,
        0x11DA9,
        0x11DAA,
+       0x11F59,
+       0x11F5A,
        0x12407,
        0x12408,
        0x1240E,
@@ -369796,6 +374575,8 @@ static const UV UNI_NV__9_invlist[] = {  /* for EBCDIC 1047 */
        0x16B5A,
        0x16E89,
        0x16E8A,
+       0x1D2C9,
+       0x1D2CA,
        0x1D2E9,
        0x1D2EA,
        0x1D368,
@@ -369814,6 +374595,8 @@ static const UV UNI_NV__9_invlist[] = {  /* for EBCDIC 1047 */
        0x1E14A,
        0x1E2F9,
        0x1E2FA,
+       0x1E4F9,
+       0x1E4FA,
        0x1E8CF,
        0x1E8D0,
        0x1E959,
@@ -369842,7 +374625,7 @@ static const UV UNI_NV__9_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_NV__9_invlist[] = {  /* for EBCDIC 037 */
-       221,    /* Number of elements */
+       227,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -370009,6 +374792,8 @@ static const UV UNI_NV__9_invlist[] = {  /* for EBCDIC 037 */
        0x11D5A,
        0x11DA9,
        0x11DAA,
+       0x11F59,
+       0x11F5A,
        0x12407,
        0x12408,
        0x1240E,
@@ -370031,6 +374816,8 @@ static const UV UNI_NV__9_invlist[] = {  /* for EBCDIC 037 */
        0x16B5A,
        0x16E89,
        0x16E8A,
+       0x1D2C9,
+       0x1D2CA,
        0x1D2E9,
        0x1D2EA,
        0x1D368,
@@ -370049,6 +374836,8 @@ static const UV UNI_NV__9_invlist[] = {  /* for EBCDIC 037 */
        0x1E14A,
        0x1E2F9,
        0x1E2FA,
+       0x1E4F9,
+       0x1E4FA,
        0x1E8CF,
        0x1E8D0,
        0x1E959,
@@ -370180,7 +374969,7 @@ static const UV UNI_NV__900000_invlist[] = {  /* for all charsets */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_NV__NAN_invlist[] = {  /* for ASCII/Latin1 */
-       413,    /* Number of elements */
+       419,    /* Number of elements */
        148565664, /* Version and data structure type */
        0,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -370523,6 +375312,8 @@ static const UV UNI_NV__NAN_invlist[] = {  /* for ASCII/Latin1 */
        0x11D5A,
        0x11DA0,
        0x11DAA,
+       0x11F50,
+       0x11F5A,
        0x11FC0,
        0x11FD5,
        0x12400,
@@ -370537,6 +375328,8 @@ static const UV UNI_NV__NAN_invlist[] = {  /* for ASCII/Latin1 */
        0x16B62,
        0x16E80,
        0x16E97,
+       0x1D2C0,
+       0x1D2D4,
        0x1D2E0,
        0x1D2F4,
        0x1D360,
@@ -370547,6 +375340,8 @@ static const UV UNI_NV__NAN_invlist[] = {  /* for ASCII/Latin1 */
        0x1E14A,
        0x1E2F0,
        0x1E2FA,
+       0x1E4F0,
+       0x1E4FA,
        0x1E8C7,
        0x1E8D0,
        0x1E950,
@@ -370607,7 +375402,7 @@ static const UV UNI_NV__NAN_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_NV__NAN_invlist[] = {  /* for EBCDIC 1047 */
-       413,    /* Number of elements */
+       419,    /* Number of elements */
        148565664, /* Version and data structure type */
        0,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -370950,6 +375745,8 @@ static const UV UNI_NV__NAN_invlist[] = {  /* for EBCDIC 1047 */
        0x11D5A,
        0x11DA0,
        0x11DAA,
+       0x11F50,
+       0x11F5A,
        0x11FC0,
        0x11FD5,
        0x12400,
@@ -370964,6 +375761,8 @@ static const UV UNI_NV__NAN_invlist[] = {  /* for EBCDIC 1047 */
        0x16B62,
        0x16E80,
        0x16E97,
+       0x1D2C0,
+       0x1D2D4,
        0x1D2E0,
        0x1D2F4,
        0x1D360,
@@ -370974,6 +375773,8 @@ static const UV UNI_NV__NAN_invlist[] = {  /* for EBCDIC 1047 */
        0x1E14A,
        0x1E2F0,
        0x1E2FA,
+       0x1E4F0,
+       0x1E4FA,
        0x1E8C7,
        0x1E8D0,
        0x1E950,
@@ -371034,7 +375835,7 @@ static const UV UNI_NV__NAN_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_NV__NAN_invlist[] = {  /* for EBCDIC 037 */
-       413,    /* Number of elements */
+       419,    /* Number of elements */
        148565664, /* Version and data structure type */
        0,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -371377,6 +376178,8 @@ static const UV UNI_NV__NAN_invlist[] = {  /* for EBCDIC 037 */
        0x11D5A,
        0x11DA0,
        0x11DAA,
+       0x11F50,
+       0x11F5A,
        0x11FC0,
        0x11FD5,
        0x12400,
@@ -371391,6 +376194,8 @@ static const UV UNI_NV__NAN_invlist[] = {  /* for EBCDIC 037 */
        0x16B62,
        0x16E80,
        0x16E97,
+       0x1D2C0,
+       0x1D2D4,
        0x1D2E0,
        0x1D2F4,
        0x1D360,
@@ -371401,6 +376206,8 @@ static const UV UNI_NV__NAN_invlist[] = {  /* for EBCDIC 037 */
        0x1E14A,
        0x1E2F0,
        0x1E2FA,
+       0x1E4F0,
+       0x1E4FA,
        0x1E8C7,
        0x1E8D0,
        0x1E950,
@@ -371600,7 +376407,7 @@ static const UV UNI_OUGR_invlist[] = {  /* for all charsets */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_P_invlist[] = {  /* for ASCII/Latin1 */
-       379,    /* Number of elements */
+       383,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -371953,12 +376760,16 @@ static const UV UNI_P_invlist[] = {  /* for ASCII/Latin1 */
        0x11A9D,
        0x11A9E,
        0x11AA3,
+       0x11B00,
+       0x11B0A,
        0x11C41,
        0x11C46,
        0x11C70,
        0x11C72,
        0x11EF7,
        0x11EF9,
+       0x11F43,
+       0x11F50,
        0x11FFF,
        0x12000,
        0x12470,
@@ -371993,7 +376804,7 @@ static const UV UNI_P_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_P_invlist[] = {  /* for EBCDIC 1047 */
-       387,    /* Number of elements */
+       391,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -372354,12 +377165,16 @@ static const UV UNI_P_invlist[] = {  /* for EBCDIC 1047 */
        0x11A9D,
        0x11A9E,
        0x11AA3,
+       0x11B00,
+       0x11B0A,
        0x11C41,
        0x11C46,
        0x11C70,
        0x11C72,
        0x11EF7,
        0x11EF9,
+       0x11F43,
+       0x11F50,
        0x11FFF,
        0x12000,
        0x12470,
@@ -372394,7 +377209,7 @@ static const UV UNI_P_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_P_invlist[] = {  /* for EBCDIC 037 */
-       385,    /* Number of elements */
+       389,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -372753,12 +377568,16 @@ static const UV UNI_P_invlist[] = {  /* for EBCDIC 037 */
        0x11A9D,
        0x11A9E,
        0x11AA3,
+       0x11B00,
+       0x11B0A,
        0x11C41,
        0x11C46,
        0x11C70,
        0x11C72,
        0x11EF7,
        0x11EF9,
+       0x11F43,
+       0x11F50,
        0x11FFF,
        0x12000,
        0x12470,
@@ -374096,7 +378915,7 @@ static const UV UNI_PLAYINGCARDS_invlist[] = {  /* for all charsets */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_PO_invlist[] = {  /* for ASCII/Latin1 */
-       371,    /* Number of elements */
+       375,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -374441,12 +379260,16 @@ static const UV UNI_PO_invlist[] = {  /* for ASCII/Latin1 */
        0x11A9D,
        0x11A9E,
        0x11AA3,
+       0x11B00,
+       0x11B0A,
        0x11C41,
        0x11C46,
        0x11C70,
        0x11C72,
        0x11EF7,
        0x11EF9,
+       0x11F43,
+       0x11F50,
        0x11FFF,
        0x12000,
        0x12470,
@@ -374481,7 +379304,7 @@ static const UV UNI_PO_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_PO_invlist[] = {  /* for EBCDIC 1047 */
-       375,    /* Number of elements */
+       379,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -374830,12 +379653,16 @@ static const UV UNI_PO_invlist[] = {  /* for EBCDIC 1047 */
        0x11A9D,
        0x11A9E,
        0x11AA3,
+       0x11B00,
+       0x11B0A,
        0x11C41,
        0x11C46,
        0x11C70,
        0x11C72,
        0x11EF7,
        0x11EF9,
+       0x11F43,
+       0x11F50,
        0x11FFF,
        0x12000,
        0x12470,
@@ -374870,7 +379697,7 @@ static const UV UNI_PO_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_PO_invlist[] = {  /* for EBCDIC 037 */
-       375,    /* Number of elements */
+       379,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -375219,12 +380046,16 @@ static const UV UNI_PO_invlist[] = {  /* for EBCDIC 037 */
        0x11A9D,
        0x11A9E,
        0x11AA3,
+       0x11B00,
+       0x11B0A,
        0x11C41,
        0x11C46,
        0x11C70,
        0x11C72,
        0x11EF7,
        0x11EF9,
+       0x11F43,
+       0x11F50,
        0x11FFF,
        0x12000,
        0x12470,
@@ -376038,7 +380869,7 @@ static const UV UNI_RUNR_invlist[] = {  /* for all charsets */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_S_invlist[] = {  /* for ASCII/Latin1 */
-       469,    /* Number of elements */
+       465,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -376461,14 +381292,14 @@ static const UV UNI_S_invlist[] = {  /* for ASCII/Latin1 */
        0x1F266,
        0x1F300,
        0x1F6D8,
-       0x1F6DD,
+       0x1F6DC,
        0x1F6ED,
        0x1F6F0,
        0x1F6FD,
        0x1F700,
-       0x1F774,
-       0x1F780,
-       0x1F7D9,
+       0x1F777,
+       0x1F77B,
+       0x1F7DA,
        0x1F7E0,
        0x1F7EC,
        0x1F7F0,
@@ -376490,23 +381321,19 @@ static const UV UNI_S_invlist[] = {  /* for ASCII/Latin1 */
        0x1FA60,
        0x1FA6E,
        0x1FA70,
-       0x1FA75,
-       0x1FA78,
        0x1FA7D,
        0x1FA80,
-       0x1FA87,
+       0x1FA89,
        0x1FA90,
-       0x1FAAD,
-       0x1FAB0,
-       0x1FABB,
-       0x1FAC0,
+       0x1FABE,
+       0x1FABF,
        0x1FAC6,
-       0x1FAD0,
-       0x1FADA,
+       0x1FACE,
+       0x1FADC,
        0x1FAE0,
-       0x1FAE8,
+       0x1FAE9,
        0x1FAF0,
-       0x1FAF7,
+       0x1FAF9,
        0x1FB00,
        0x1FB93,
        0x1FB94,
@@ -376521,7 +381348,7 @@ static const UV UNI_S_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_S_invlist[] = {  /* for EBCDIC 1047 */
-       475,    /* Number of elements */
+       471,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -376950,14 +381777,14 @@ static const UV UNI_S_invlist[] = {  /* for EBCDIC 1047 */
        0x1F266,
        0x1F300,
        0x1F6D8,
-       0x1F6DD,
+       0x1F6DC,
        0x1F6ED,
        0x1F6F0,
        0x1F6FD,
        0x1F700,
-       0x1F774,
-       0x1F780,
-       0x1F7D9,
+       0x1F777,
+       0x1F77B,
+       0x1F7DA,
        0x1F7E0,
        0x1F7EC,
        0x1F7F0,
@@ -376979,23 +381806,19 @@ static const UV UNI_S_invlist[] = {  /* for EBCDIC 1047 */
        0x1FA60,
        0x1FA6E,
        0x1FA70,
-       0x1FA75,
-       0x1FA78,
        0x1FA7D,
        0x1FA80,
-       0x1FA87,
+       0x1FA89,
        0x1FA90,
-       0x1FAAD,
-       0x1FAB0,
-       0x1FABB,
-       0x1FAC0,
+       0x1FABE,
+       0x1FABF,
        0x1FAC6,
-       0x1FAD0,
-       0x1FADA,
+       0x1FACE,
+       0x1FADC,
        0x1FAE0,
-       0x1FAE8,
+       0x1FAE9,
        0x1FAF0,
-       0x1FAF7,
+       0x1FAF9,
        0x1FB00,
        0x1FB93,
        0x1FB94,
@@ -377010,7 +381833,7 @@ static const UV UNI_S_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_S_invlist[] = {  /* for EBCDIC 037 */
-       473,    /* Number of elements */
+       469,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -377437,14 +382260,14 @@ static const UV UNI_S_invlist[] = {  /* for EBCDIC 037 */
        0x1F266,
        0x1F300,
        0x1F6D8,
-       0x1F6DD,
+       0x1F6DC,
        0x1F6ED,
        0x1F6F0,
        0x1F6FD,
        0x1F700,
-       0x1F774,
-       0x1F780,
-       0x1F7D9,
+       0x1F777,
+       0x1F77B,
+       0x1F7DA,
        0x1F7E0,
        0x1F7EC,
        0x1F7F0,
@@ -377466,23 +382289,19 @@ static const UV UNI_S_invlist[] = {  /* for EBCDIC 037 */
        0x1FA60,
        0x1FA6E,
        0x1FA70,
-       0x1FA75,
-       0x1FA78,
        0x1FA7D,
        0x1FA80,
-       0x1FA87,
+       0x1FA89,
        0x1FA90,
-       0x1FAAD,
-       0x1FAB0,
-       0x1FABB,
-       0x1FAC0,
+       0x1FABE,
+       0x1FABF,
        0x1FAC6,
-       0x1FAD0,
-       0x1FADA,
+       0x1FACE,
+       0x1FADC,
        0x1FAE0,
-       0x1FAE8,
+       0x1FAE9,
        0x1FAF0,
-       0x1FAF7,
+       0x1FAF9,
        0x1FB00,
        0x1FB93,
        0x1FB94,
@@ -377906,7 +382725,7 @@ static const UV UNI_SB__CL_invlist[] = {  /* for EBCDIC 037 */
 #  endif       /* EBCDIC 037 */
 
 static const UV UNI_SB__EX_invlist[] = {  /* for all charsets */
-       605,    /* Number of elements */
+       627,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -378071,6 +382890,8 @@ static const UV UNI_SB__EX_invlist[] = {  /* for all charsets */
        0xCD7,
        0xCE2,
        0xCE4,
+       0xCF3,
+       0xCF4,
        0xD00,
        0xD04,
        0xD3B,
@@ -378108,7 +382929,7 @@ static const UV UNI_SB__EX_invlist[] = {  /* for all charsets */
        0xEB4,
        0xEBD,
        0xEC8,
-       0xECE,
+       0xECF,
        0xF18,
        0xF1A,
        0xF35,
@@ -378315,6 +383136,8 @@ static const UV UNI_SB__EX_invlist[] = {  /* for all charsets */
        0x10D28,
        0x10EAB,
        0x10EAD,
+       0x10EFD,
+       0x10F00,
        0x10F46,
        0x10F51,
        0x10F82,
@@ -378353,6 +383176,8 @@ static const UV UNI_SB__EX_invlist[] = {  /* for all charsets */
        0x11238,
        0x1123E,
        0x1123F,
+       0x11241,
+       0x11242,
        0x112DF,
        0x112EB,
        0x11300,
@@ -378447,6 +383272,18 @@ static const UV UNI_SB__EX_invlist[] = {  /* for all charsets */
        0x11D98,
        0x11EF3,
        0x11EF7,
+       0x11F00,
+       0x11F02,
+       0x11F03,
+       0x11F04,
+       0x11F34,
+       0x11F3B,
+       0x11F3E,
+       0x11F43,
+       0x13440,
+       0x13441,
+       0x13447,
+       0x13456,
        0x16AF0,
        0x16AF5,
        0x16B30,
@@ -378501,12 +383338,16 @@ static const UV UNI_SB__EX_invlist[] = {  /* for all charsets */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E08F,
+       0x1E090,
        0x1E130,
        0x1E137,
        0x1E2AE,
        0x1E2AF,
        0x1E2EC,
        0x1E2F0,
+       0x1E4EC,
+       0x1E4F0,
        0x1E8D0,
        0x1E8D7,
        0x1E944,
@@ -378560,7 +383401,7 @@ static const UV UNI_SB__FO_invlist[] = {  /* for ASCII/Latin1 */
        0x110CD,
        0x110CE,
        0x13430,
-       0x13439,
+       0x13440,
        0x1BCA0,
        0x1BCA4,
        0x1D173,
@@ -378617,7 +383458,7 @@ static const UV UNI_SB__FO_invlist[] = {  /* for EBCDIC 1047 */
        0x110CD,
        0x110CE,
        0x13430,
-       0x13439,
+       0x13440,
        0x1BCA0,
        0x1BCA4,
        0x1D173,
@@ -378674,7 +383515,7 @@ static const UV UNI_SB__FO_invlist[] = {  /* for EBCDIC 037 */
        0x110CD,
        0x110CE,
        0x13430,
-       0x13439,
+       0x13440,
        0x1BCA0,
        0x1BCA4,
        0x1D173,
@@ -378686,7 +383527,7 @@ static const UV UNI_SB__FO_invlist[] = {  /* for EBCDIC 037 */
 #  endif       /* EBCDIC 037 */
 
 static const UV UNI_SB__LE_invlist[] = {  /* for all charsets */
-       1073,   /* Number of elements */
+       1087,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -378995,7 +383836,7 @@ static const UV UNI_SB__LE_invlist[] = {  /* for all charsets */
        0x108F,
        0x10D0,
        0x10FB,
-       0x10FC,
+       0x10FD,
        0x1249,
        0x124A,
        0x124E,
@@ -379187,8 +384028,6 @@ static const UV UNI_SB__LE_invlist[] = {  /* for all charsets */
        0xA789,
        0xA78F,
        0xA790,
-       0xA7F2,
-       0xA7F5,
        0xA7F7,
        0xA7F8,
        0xA7FB,
@@ -379263,8 +384102,6 @@ static const UV UNI_SB__LE_invlist[] = {  /* for all charsets */
        0xAB27,
        0xAB28,
        0xAB2F,
-       0xAB69,
-       0xAB6A,
        0xABC0,
        0xABE3,
        0xAC00,
@@ -379469,6 +384306,8 @@ static const UV UNI_SB__LE_invlist[] = {  /* for all charsets */
        0x11212,
        0x11213,
        0x1122C,
+       0x1123F,
+       0x11241,
        0x11280,
        0x11287,
        0x11288,
@@ -379591,6 +384430,12 @@ static const UV UNI_SB__LE_invlist[] = {  /* for all charsets */
        0x11D99,
        0x11EE0,
        0x11EF3,
+       0x11F02,
+       0x11F03,
+       0x11F04,
+       0x11F11,
+       0x11F12,
+       0x11F34,
        0x11FB0,
        0x11FB1,
        0x12000,
@@ -379602,7 +384447,9 @@ static const UV UNI_SB__LE_invlist[] = {  /* for all charsets */
        0x12F90,
        0x12FF1,
        0x13000,
-       0x1342F,
+       0x13430,
+       0x13441,
+       0x13447,
        0x14400,
        0x14647,
        0x16800,
@@ -379645,8 +384492,12 @@ static const UV UNI_SB__LE_invlist[] = {  /* for all charsets */
        0x1AFFF,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -379671,6 +384522,8 @@ static const UV UNI_SB__LE_invlist[] = {  /* for all charsets */
        0x1E2AE,
        0x1E2C0,
        0x1E2EC,
+       0x1E4D0,
+       0x1E4EC,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -379752,7 +384605,7 @@ static const UV UNI_SB__LE_invlist[] = {  /* for all charsets */
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -379762,13 +384615,15 @@ static const UV UNI_SB__LE_invlist[] = {  /* for all charsets */
        0x2F800,
        0x2FA1E,
        0x30000,
-       0x3134B
+       0x3134B,
+       0x31350,
+       0x323B0
 };
 
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_SB__LO_invlist[] = {  /* for ASCII/Latin1 */
-       1331,   /* Number of elements */
+       1339,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -380321,6 +385176,8 @@ static const UV UNI_SB__LO_invlist[] = {  /* for ASCII/Latin1 */
        0x530,
        0x560,
        0x589,
+       0x10FC,
+       0x10FD,
        0x13F8,
        0x13FE,
        0x1C80,
@@ -380999,6 +385856,8 @@ static const UV UNI_SB__LO_invlist[] = {  /* for ASCII/Latin1 */
        0xA7D8,
        0xA7D9,
        0xA7DA,
+       0xA7F2,
+       0xA7F5,
        0xA7F6,
        0xA7F7,
        0xA7F8,
@@ -381006,7 +385865,7 @@ static const UV UNI_SB__LO_invlist[] = {  /* for ASCII/Latin1 */
        0xAB30,
        0xAB5B,
        0xAB5C,
-       0xAB69,
+       0xAB6A,
        0xAB70,
        0xABC0,
        0xFB00,
@@ -381101,6 +385960,10 @@ static const UV UNI_SB__LO_invlist[] = {  /* for ASCII/Latin1 */
        0x1DF0A,
        0x1DF0B,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
+       0x1E030,
+       0x1E06E,
        0x1E922,
        0x1E944
 };
@@ -381113,7 +385976,7 @@ static const UV UNI_SB__LO_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_SB__LO_invlist[] = {  /* for EBCDIC 1047 */
-       1339,   /* Number of elements */
+       1347,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -381674,6 +386537,8 @@ static const UV UNI_SB__LO_invlist[] = {  /* for EBCDIC 1047 */
        0x530,
        0x560,
        0x589,
+       0x10FC,
+       0x10FD,
        0x13F8,
        0x13FE,
        0x1C80,
@@ -382352,6 +387217,8 @@ static const UV UNI_SB__LO_invlist[] = {  /* for EBCDIC 1047 */
        0xA7D8,
        0xA7D9,
        0xA7DA,
+       0xA7F2,
+       0xA7F5,
        0xA7F6,
        0xA7F7,
        0xA7F8,
@@ -382359,7 +387226,7 @@ static const UV UNI_SB__LO_invlist[] = {  /* for EBCDIC 1047 */
        0xAB30,
        0xAB5B,
        0xAB5C,
-       0xAB69,
+       0xAB6A,
        0xAB70,
        0xABC0,
        0xFB00,
@@ -382454,6 +387321,10 @@ static const UV UNI_SB__LO_invlist[] = {  /* for EBCDIC 1047 */
        0x1DF0A,
        0x1DF0B,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
+       0x1E030,
+       0x1E06E,
        0x1E922,
        0x1E944
 };
@@ -382466,7 +387337,7 @@ static const UV UNI_SB__LO_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_SB__LO_invlist[] = {  /* for EBCDIC 037 */
-       1339,   /* Number of elements */
+       1347,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -383027,6 +387898,8 @@ static const UV UNI_SB__LO_invlist[] = {  /* for EBCDIC 037 */
        0x530,
        0x560,
        0x589,
+       0x10FC,
+       0x10FD,
        0x13F8,
        0x13FE,
        0x1C80,
@@ -383705,6 +388578,8 @@ static const UV UNI_SB__LO_invlist[] = {  /* for EBCDIC 037 */
        0xA7D8,
        0xA7D9,
        0xA7DA,
+       0xA7F2,
+       0xA7F5,
        0xA7F6,
        0xA7F7,
        0xA7F8,
@@ -383712,7 +388587,7 @@ static const UV UNI_SB__LO_invlist[] = {  /* for EBCDIC 037 */
        0xAB30,
        0xAB5B,
        0xAB5C,
-       0xAB69,
+       0xAB6A,
        0xAB70,
        0xABC0,
        0xFB00,
@@ -383807,6 +388682,10 @@ static const UV UNI_SB__LO_invlist[] = {  /* for EBCDIC 037 */
        0x1DF0A,
        0x1DF0B,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
+       0x1E030,
+       0x1E06E,
        0x1E922,
        0x1E944
 };
@@ -383816,7 +388695,7 @@ static const UV UNI_SB__LO_invlist[] = {  /* for EBCDIC 037 */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_SB__NU_invlist[] = {  /* for ASCII/Latin1 */
-       127,    /* Number of elements */
+       131,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -383931,6 +388810,8 @@ static const UV UNI_SB__NU_invlist[] = {  /* for ASCII/Latin1 */
        0x11D5A,
        0x11DA0,
        0x11DAA,
+       0x11F50,
+       0x11F5A,
        0x16A60,
        0x16A6A,
        0x16AC0,
@@ -383943,6 +388824,8 @@ static const UV UNI_SB__NU_invlist[] = {  /* for ASCII/Latin1 */
        0x1E14A,
        0x1E2F0,
        0x1E2FA,
+       0x1E4F0,
+       0x1E4FA,
        0x1E950,
        0x1E95A,
        0x1FBF0,
@@ -383957,7 +388840,7 @@ static const UV UNI_SB__NU_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_SB__NU_invlist[] = {  /* for EBCDIC 1047 */
-       127,    /* Number of elements */
+       131,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -384072,6 +388955,8 @@ static const UV UNI_SB__NU_invlist[] = {  /* for EBCDIC 1047 */
        0x11D5A,
        0x11DA0,
        0x11DAA,
+       0x11F50,
+       0x11F5A,
        0x16A60,
        0x16A6A,
        0x16AC0,
@@ -384084,6 +388969,8 @@ static const UV UNI_SB__NU_invlist[] = {  /* for EBCDIC 1047 */
        0x1E14A,
        0x1E2F0,
        0x1E2FA,
+       0x1E4F0,
+       0x1E4FA,
        0x1E950,
        0x1E95A,
        0x1FBF0,
@@ -384098,7 +388985,7 @@ static const UV UNI_SB__NU_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_SB__NU_invlist[] = {  /* for EBCDIC 037 */
-       127,    /* Number of elements */
+       131,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -384213,6 +389100,8 @@ static const UV UNI_SB__NU_invlist[] = {  /* for EBCDIC 037 */
        0x11D5A,
        0x11DA0,
        0x11DAA,
+       0x11F50,
+       0x11F5A,
        0x16A60,
        0x16A6A,
        0x16AC0,
@@ -384225,6 +389114,8 @@ static const UV UNI_SB__NU_invlist[] = {  /* for EBCDIC 037 */
        0x1E14A,
        0x1E2F0,
        0x1E2FA,
+       0x1E4F0,
+       0x1E4FA,
        0x1E950,
        0x1E95A,
        0x1FBF0,
@@ -384542,7 +389433,7 @@ static const UV UNI_SB__SP_invlist[] = {  /* for EBCDIC 037 */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_SB__ST_invlist[] = {  /* for ASCII/Latin1 */
-       153,    /* Number of elements */
+       155,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -384685,6 +389576,8 @@ static const UV UNI_SB__ST_invlist[] = {  /* for ASCII/Latin1 */
        0x11C43,
        0x11EF7,
        0x11EF9,
+       0x11F43,
+       0x11F45,
        0x16A6E,
        0x16A70,
        0x16AF5,
@@ -384709,7 +389602,7 @@ static const UV UNI_SB__ST_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_SB__ST_invlist[] = {  /* for EBCDIC 1047 */
-       153,    /* Number of elements */
+       155,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -384852,6 +389745,8 @@ static const UV UNI_SB__ST_invlist[] = {  /* for EBCDIC 1047 */
        0x11C43,
        0x11EF7,
        0x11EF9,
+       0x11F43,
+       0x11F45,
        0x16A6E,
        0x16A70,
        0x16AF5,
@@ -384876,7 +389771,7 @@ static const UV UNI_SB__ST_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_SB__ST_invlist[] = {  /* for EBCDIC 037 */
-       153,    /* Number of elements */
+       155,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -385019,6 +389914,8 @@ static const UV UNI_SB__ST_invlist[] = {  /* for EBCDIC 037 */
        0x11C43,
        0x11EF7,
        0x11EF9,
+       0x11F43,
+       0x11F45,
        0x16A6E,
        0x16A70,
        0x16AF5,
@@ -389026,7 +393923,7 @@ static const UV UNI_SB__UP_invlist[] = {  /* for EBCDIC 037 */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_SB__XX_invlist[] = {  /* for ASCII/Latin1 */
-       1661,   /* Number of elements */
+       1681,   /* Number of elements */
        148565664, /* Version and data structure type */
        0,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -389374,7 +394271,7 @@ static const UV UNI_SB__XX_invlist[] = {  /* for ASCII/Latin1 */
        0xCE6,
        0xCF0,
        0xCF1,
-       0xCF3,
+       0xCF4,
        0xD00,
        0xD0D,
        0xD0E,
@@ -389440,7 +394337,7 @@ static const UV UNI_SB__XX_invlist[] = {  /* for ASCII/Latin1 */
        0xEC6,
        0xEC7,
        0xEC8,
-       0xECE,
+       0xECF,
        0xED0,
        0xEDA,
        0xEDC,
@@ -390157,7 +395054,7 @@ static const UV UNI_SB__XX_invlist[] = {  /* for ASCII/Latin1 */
        0x10EAD,
        0x10EB0,
        0x10EB2,
-       0x10F00,
+       0x10EFD,
        0x10F1D,
        0x10F27,
        0x10F28,
@@ -390210,7 +395107,7 @@ static const UV UNI_SB__XX_invlist[] = {  /* for ASCII/Latin1 */
        0x1123B,
        0x1123D,
        0x1123E,
-       0x1123F,
+       0x11242,
        0x11280,
        0x11287,
        0x11288,
@@ -390379,6 +395276,14 @@ static const UV UNI_SB__XX_invlist[] = {  /* for ASCII/Latin1 */
        0x11DAA,
        0x11EE0,
        0x11EF9,
+       0x11F00,
+       0x11F11,
+       0x11F12,
+       0x11F3B,
+       0x11F3E,
+       0x11F45,
+       0x11F50,
+       0x11F5A,
        0x11FB0,
        0x11FB1,
        0x12000,
@@ -390390,9 +395295,7 @@ static const UV UNI_SB__XX_invlist[] = {  /* for ASCII/Latin1 */
        0x12F90,
        0x12FF1,
        0x13000,
-       0x1342F,
-       0x13430,
-       0x13439,
+       0x13456,
        0x14400,
        0x14647,
        0x16800,
@@ -390449,8 +395352,12 @@ static const UV UNI_SB__XX_invlist[] = {  /* for ASCII/Latin1 */
        0x1AFFF,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -390557,6 +395464,8 @@ static const UV UNI_SB__XX_invlist[] = {  /* for ASCII/Latin1 */
        0x1DAB0,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
        0x1E000,
        0x1E007,
        0x1E008,
@@ -390567,6 +395476,10 @@ static const UV UNI_SB__XX_invlist[] = {  /* for ASCII/Latin1 */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E030,
+       0x1E06E,
+       0x1E08F,
+       0x1E090,
        0x1E100,
        0x1E12D,
        0x1E130,
@@ -390579,6 +395492,8 @@ static const UV UNI_SB__XX_invlist[] = {  /* for ASCII/Latin1 */
        0x1E2AF,
        0x1E2C0,
        0x1E2FA,
+       0x1E4D0,
+       0x1E4FA,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -390674,7 +395589,7 @@ static const UV UNI_SB__XX_invlist[] = {  /* for ASCII/Latin1 */
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -390685,6 +395600,8 @@ static const UV UNI_SB__XX_invlist[] = {  /* for ASCII/Latin1 */
        0x2FA1E,
        0x30000,
        0x3134B,
+       0x31350,
+       0x323B0,
        0xE0001,
        0xE0002,
        0xE0020,
@@ -390701,7 +395618,7 @@ static const UV UNI_SB__XX_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_SB__XX_invlist[] = {  /* for EBCDIC 1047 */
-       1681,   /* Number of elements */
+       1701,   /* Number of elements */
        148565664, /* Version and data structure type */
        0,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -391069,7 +395986,7 @@ static const UV UNI_SB__XX_invlist[] = {  /* for EBCDIC 1047 */
        0xCE6,
        0xCF0,
        0xCF1,
-       0xCF3,
+       0xCF4,
        0xD00,
        0xD0D,
        0xD0E,
@@ -391135,7 +396052,7 @@ static const UV UNI_SB__XX_invlist[] = {  /* for EBCDIC 1047 */
        0xEC6,
        0xEC7,
        0xEC8,
-       0xECE,
+       0xECF,
        0xED0,
        0xEDA,
        0xEDC,
@@ -391852,7 +396769,7 @@ static const UV UNI_SB__XX_invlist[] = {  /* for EBCDIC 1047 */
        0x10EAD,
        0x10EB0,
        0x10EB2,
-       0x10F00,
+       0x10EFD,
        0x10F1D,
        0x10F27,
        0x10F28,
@@ -391905,7 +396822,7 @@ static const UV UNI_SB__XX_invlist[] = {  /* for EBCDIC 1047 */
        0x1123B,
        0x1123D,
        0x1123E,
-       0x1123F,
+       0x11242,
        0x11280,
        0x11287,
        0x11288,
@@ -392074,6 +396991,14 @@ static const UV UNI_SB__XX_invlist[] = {  /* for EBCDIC 1047 */
        0x11DAA,
        0x11EE0,
        0x11EF9,
+       0x11F00,
+       0x11F11,
+       0x11F12,
+       0x11F3B,
+       0x11F3E,
+       0x11F45,
+       0x11F50,
+       0x11F5A,
        0x11FB0,
        0x11FB1,
        0x12000,
@@ -392085,9 +397010,7 @@ static const UV UNI_SB__XX_invlist[] = {  /* for EBCDIC 1047 */
        0x12F90,
        0x12FF1,
        0x13000,
-       0x1342F,
-       0x13430,
-       0x13439,
+       0x13456,
        0x14400,
        0x14647,
        0x16800,
@@ -392144,8 +397067,12 @@ static const UV UNI_SB__XX_invlist[] = {  /* for EBCDIC 1047 */
        0x1AFFF,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -392252,6 +397179,8 @@ static const UV UNI_SB__XX_invlist[] = {  /* for EBCDIC 1047 */
        0x1DAB0,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
        0x1E000,
        0x1E007,
        0x1E008,
@@ -392262,6 +397191,10 @@ static const UV UNI_SB__XX_invlist[] = {  /* for EBCDIC 1047 */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E030,
+       0x1E06E,
+       0x1E08F,
+       0x1E090,
        0x1E100,
        0x1E12D,
        0x1E130,
@@ -392274,6 +397207,8 @@ static const UV UNI_SB__XX_invlist[] = {  /* for EBCDIC 1047 */
        0x1E2AF,
        0x1E2C0,
        0x1E2FA,
+       0x1E4D0,
+       0x1E4FA,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -392369,7 +397304,7 @@ static const UV UNI_SB__XX_invlist[] = {  /* for EBCDIC 1047 */
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -392380,6 +397315,8 @@ static const UV UNI_SB__XX_invlist[] = {  /* for EBCDIC 1047 */
        0x2FA1E,
        0x30000,
        0x3134B,
+       0x31350,
+       0x323B0,
        0xE0001,
        0xE0002,
        0xE0020,
@@ -392396,7 +397333,7 @@ static const UV UNI_SB__XX_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_SB__XX_invlist[] = {  /* for EBCDIC 037 */
-       1679,   /* Number of elements */
+       1699,   /* Number of elements */
        148565664, /* Version and data structure type */
        0,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -392762,7 +397699,7 @@ static const UV UNI_SB__XX_invlist[] = {  /* for EBCDIC 037 */
        0xCE6,
        0xCF0,
        0xCF1,
-       0xCF3,
+       0xCF4,
        0xD00,
        0xD0D,
        0xD0E,
@@ -392828,7 +397765,7 @@ static const UV UNI_SB__XX_invlist[] = {  /* for EBCDIC 037 */
        0xEC6,
        0xEC7,
        0xEC8,
-       0xECE,
+       0xECF,
        0xED0,
        0xEDA,
        0xEDC,
@@ -393545,7 +398482,7 @@ static const UV UNI_SB__XX_invlist[] = {  /* for EBCDIC 037 */
        0x10EAD,
        0x10EB0,
        0x10EB2,
-       0x10F00,
+       0x10EFD,
        0x10F1D,
        0x10F27,
        0x10F28,
@@ -393598,7 +398535,7 @@ static const UV UNI_SB__XX_invlist[] = {  /* for EBCDIC 037 */
        0x1123B,
        0x1123D,
        0x1123E,
-       0x1123F,
+       0x11242,
        0x11280,
        0x11287,
        0x11288,
@@ -393767,6 +398704,14 @@ static const UV UNI_SB__XX_invlist[] = {  /* for EBCDIC 037 */
        0x11DAA,
        0x11EE0,
        0x11EF9,
+       0x11F00,
+       0x11F11,
+       0x11F12,
+       0x11F3B,
+       0x11F3E,
+       0x11F45,
+       0x11F50,
+       0x11F5A,
        0x11FB0,
        0x11FB1,
        0x12000,
@@ -393778,9 +398723,7 @@ static const UV UNI_SB__XX_invlist[] = {  /* for EBCDIC 037 */
        0x12F90,
        0x12FF1,
        0x13000,
-       0x1342F,
-       0x13430,
-       0x13439,
+       0x13456,
        0x14400,
        0x14647,
        0x16800,
@@ -393837,8 +398780,12 @@ static const UV UNI_SB__XX_invlist[] = {  /* for EBCDIC 037 */
        0x1AFFF,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -393945,6 +398892,8 @@ static const UV UNI_SB__XX_invlist[] = {  /* for EBCDIC 037 */
        0x1DAB0,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
        0x1E000,
        0x1E007,
        0x1E008,
@@ -393955,6 +398904,10 @@ static const UV UNI_SB__XX_invlist[] = {  /* for EBCDIC 037 */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E030,
+       0x1E06E,
+       0x1E08F,
+       0x1E090,
        0x1E100,
        0x1E12D,
        0x1E130,
@@ -393967,6 +398920,8 @@ static const UV UNI_SB__XX_invlist[] = {  /* for EBCDIC 037 */
        0x1E2AF,
        0x1E2C0,
        0x1E2FA,
+       0x1E4D0,
+       0x1E4FA,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -394062,7 +399017,7 @@ static const UV UNI_SB__XX_invlist[] = {  /* for EBCDIC 037 */
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -394073,6 +399028,8 @@ static const UV UNI_SB__XX_invlist[] = {  /* for EBCDIC 037 */
        0x2FA1E,
        0x30000,
        0x3134B,
+       0x31350,
+       0x323B0,
        0xE0001,
        0xE0002,
        0xE0020,
@@ -394274,7 +399231,7 @@ static const UV UNI_SC__ADLM_invlist[] = {  /* for all charsets */
 };
 
 static const UV UNI_SC__ARAB_invlist[] = {  /* for all charsets */
-       115,    /* Number of elements */
+       117,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -394325,6 +399282,8 @@ static const UV UNI_SC__ARAB_invlist[] = {  /* for all charsets */
        0xFEFD,
        0x10E60,
        0x10E7F,
+       0x10EFD,
+       0x10F00,
        0x1EE00,
        0x1EE04,
        0x1EE05,
@@ -394524,7 +399483,7 @@ static const UV UNI_SC__CPRT_invlist[] = {  /* for all charsets */
 };
 
 static const UV UNI_SC__CYRL_invlist[] = {  /* for all charsets */
-       17,     /* Number of elements */
+       21,     /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -394544,11 +399503,15 @@ static const UV UNI_SC__CYRL_invlist[] = {  /* for all charsets */
        0xA640,
        0xA6A0,
        0xFE2E,
-       0xFE30
+       0xFE30,
+       0x1E030,
+       0x1E06E,
+       0x1E08F,
+       0x1E090
 };
 
 static const UV UNI_SC__DEVA_invlist[] = {  /* for all charsets */
-       9,      /* Number of elements */
+       11,     /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -394560,7 +399523,9 @@ static const UV UNI_SC__DEVA_invlist[] = {  /* for all charsets */
        0x966,
        0x980,
        0xA8E0,
-       0xA900
+       0xA900,
+       0x11B00,
+       0x11B0A
 };
 
 static const UV UNI_SC__DOGR_invlist[] = {  /* for all charsets */
@@ -394876,7 +399841,7 @@ static const UV UNI_SC__GURU_invlist[] = {  /* for all charsets */
 };
 
 static const UV UNI_SC__HAN_invlist[] = {  /* for all charsets */
-       41,     /* Number of elements */
+       43,     /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -394910,7 +399875,7 @@ static const UV UNI_SC__HAN_invlist[] = {  /* for all charsets */
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -394920,7 +399885,9 @@ static const UV UNI_SC__HAN_invlist[] = {  /* for all charsets */
        0x2F800,
        0x2FA1E,
        0x30000,
-       0x3134B
+       0x3134B,
+       0x31350,
+       0x323B0
 };
 
 static const UV UNI_SC__HANG_invlist[] = {  /* for all charsets */
@@ -394970,7 +399937,7 @@ static const UV UNI_SC__HANO_invlist[] = {  /* for all charsets */
 };
 
 static const UV UNI_SC__HIRA_invlist[] = {  /* for all charsets */
-       11,     /* Number of elements */
+       13,     /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -394981,6 +399948,8 @@ static const UV UNI_SC__HIRA_invlist[] = {  /* for all charsets */
        0x30A0,
        0x1B001,
        0x1B120,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
        0x1F200,
@@ -395014,7 +399983,7 @@ static const UV UNI_SC__KALI_invlist[] = {  /* for all charsets */
 };
 
 static const UV UNI_SC__KANA_invlist[] = {  /* for all charsets */
-       27,     /* Number of elements */
+       29,     /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -395043,6 +400012,8 @@ static const UV UNI_SC__KANA_invlist[] = {  /* for all charsets */
        0x1B001,
        0x1B120,
        0x1B123,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168
 };
@@ -395056,7 +400027,7 @@ static const UV UNI_SC__KHOJ_invlist[] = {  /* for all charsets */
        0x11200,
        0x11212,
        0x11213,
-       0x1123F
+       0x11242
 };
 
 static const UV UNI_SC__KNDA_invlist[] = {  /* for all charsets */
@@ -395090,7 +400061,7 @@ static const UV UNI_SC__KNDA_invlist[] = {  /* for all charsets */
        0xCE6,
        0xCF0,
        0xCF1,
-       0xCF3
+       0xCF4
 };
 
 static const UV UNI_SC__KTHI_invlist[] = {  /* for all charsets */
@@ -395108,7 +400079,7 @@ static const UV UNI_SC__KTHI_invlist[] = {  /* for all charsets */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_SC__LATN_invlist[] = {  /* for ASCII/Latin1 */
-       77,     /* Number of elements */
+       79,     /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -395188,7 +400159,9 @@ static const UV UNI_SC__LATN_invlist[] = {  /* for ASCII/Latin1 */
        0x107B2,
        0x107BB,
        0x1DF00,
-       0x1DF1F
+       0x1DF1F,
+       0x1DF25,
+       0x1DF2B
 };
 
 #  endif       /* ASCII/Latin1 */
@@ -395199,7 +400172,7 @@ static const UV UNI_SC__LATN_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_SC__LATN_invlist[] = {  /* for EBCDIC 1047 */
-       103,    /* Number of elements */
+       105,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -395305,7 +400278,9 @@ static const UV UNI_SC__LATN_invlist[] = {  /* for EBCDIC 1047 */
        0x107B2,
        0x107BB,
        0x1DF00,
-       0x1DF1F
+       0x1DF1F,
+       0x1DF25,
+       0x1DF2B
 };
 
 #  endif       /* EBCDIC 1047 */
@@ -395316,7 +400291,7 @@ static const UV UNI_SC__LATN_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_SC__LATN_invlist[] = {  /* for EBCDIC 037 */
-       99,     /* Number of elements */
+       101,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -395418,7 +400393,9 @@ static const UV UNI_SC__LATN_invlist[] = {  /* for EBCDIC 037 */
        0x107B2,
        0x107BB,
        0x1DF00,
-       0x1DF1F
+       0x1DF1F,
+       0x1DF25,
+       0x1DF2B
 };
 
 #  endif       /* EBCDIC 037 */
@@ -396052,7 +401029,7 @@ static const UV UNI_SC__YI_invlist[] = {  /* for all charsets */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_SC__ZYYY_invlist[] = {  /* for ASCII/Latin1 */
-       348,    /* Number of elements */
+       346,    /* Number of elements */
        148565664, /* Version and data structure type */
        0,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -396268,6 +401245,8 @@ static const UV UNI_SC__ZYYY_invlist[] = {  /* for ASCII/Latin1 */
        0x1D1AA,
        0x1D1AE,
        0x1D1EB,
+       0x1D2C0,
+       0x1D2D4,
        0x1D2E0,
        0x1D2F4,
        0x1D300,
@@ -396348,14 +401327,14 @@ static const UV UNI_SC__ZYYY_invlist[] = {  /* for ASCII/Latin1 */
        0x1F266,
        0x1F300,
        0x1F6D8,
-       0x1F6DD,
+       0x1F6DC,
        0x1F6ED,
        0x1F6F0,
        0x1F6FD,
        0x1F700,
-       0x1F774,
-       0x1F780,
-       0x1F7D9,
+       0x1F777,
+       0x1F77B,
+       0x1F7DA,
        0x1F7E0,
        0x1F7EC,
        0x1F7F0,
@@ -396377,23 +401356,19 @@ static const UV UNI_SC__ZYYY_invlist[] = {  /* for ASCII/Latin1 */
        0x1FA60,
        0x1FA6E,
        0x1FA70,
-       0x1FA75,
-       0x1FA78,
        0x1FA7D,
        0x1FA80,
-       0x1FA87,
+       0x1FA89,
        0x1FA90,
-       0x1FAAD,
-       0x1FAB0,
-       0x1FABB,
-       0x1FAC0,
+       0x1FABE,
+       0x1FABF,
        0x1FAC6,
-       0x1FAD0,
-       0x1FADA,
+       0x1FACE,
+       0x1FADC,
        0x1FAE0,
-       0x1FAE8,
+       0x1FAE9,
        0x1FAF0,
-       0x1FAF7,
+       0x1FAF9,
        0x1FB00,
        0x1FB93,
        0x1FB94,
@@ -396414,7 +401389,7 @@ static const UV UNI_SC__ZYYY_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_SC__ZYYY_invlist[] = {  /* for EBCDIC 1047 */
-       374,    /* Number of elements */
+       372,    /* Number of elements */
        148565664, /* Version and data structure type */
        0,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -396656,6 +401631,8 @@ static const UV UNI_SC__ZYYY_invlist[] = {  /* for EBCDIC 1047 */
        0x1D1AA,
        0x1D1AE,
        0x1D1EB,
+       0x1D2C0,
+       0x1D2D4,
        0x1D2E0,
        0x1D2F4,
        0x1D300,
@@ -396736,14 +401713,14 @@ static const UV UNI_SC__ZYYY_invlist[] = {  /* for EBCDIC 1047 */
        0x1F266,
        0x1F300,
        0x1F6D8,
-       0x1F6DD,
+       0x1F6DC,
        0x1F6ED,
        0x1F6F0,
        0x1F6FD,
        0x1F700,
-       0x1F774,
-       0x1F780,
-       0x1F7D9,
+       0x1F777,
+       0x1F77B,
+       0x1F7DA,
        0x1F7E0,
        0x1F7EC,
        0x1F7F0,
@@ -396765,23 +401742,19 @@ static const UV UNI_SC__ZYYY_invlist[] = {  /* for EBCDIC 1047 */
        0x1FA60,
        0x1FA6E,
        0x1FA70,
-       0x1FA75,
-       0x1FA78,
        0x1FA7D,
        0x1FA80,
-       0x1FA87,
+       0x1FA89,
        0x1FA90,
-       0x1FAAD,
-       0x1FAB0,
-       0x1FABB,
-       0x1FAC0,
+       0x1FABE,
+       0x1FABF,
        0x1FAC6,
-       0x1FAD0,
-       0x1FADA,
+       0x1FACE,
+       0x1FADC,
        0x1FAE0,
-       0x1FAE8,
+       0x1FAE9,
        0x1FAF0,
-       0x1FAF7,
+       0x1FAF9,
        0x1FB00,
        0x1FB93,
        0x1FB94,
@@ -396802,7 +401775,7 @@ static const UV UNI_SC__ZYYY_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_SC__ZYYY_invlist[] = {  /* for EBCDIC 037 */
-       370,    /* Number of elements */
+       368,    /* Number of elements */
        148565664, /* Version and data structure type */
        0,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -397040,6 +402013,8 @@ static const UV UNI_SC__ZYYY_invlist[] = {  /* for EBCDIC 037 */
        0x1D1AA,
        0x1D1AE,
        0x1D1EB,
+       0x1D2C0,
+       0x1D2D4,
        0x1D2E0,
        0x1D2F4,
        0x1D300,
@@ -397120,14 +402095,14 @@ static const UV UNI_SC__ZYYY_invlist[] = {  /* for EBCDIC 037 */
        0x1F266,
        0x1F300,
        0x1F6D8,
-       0x1F6DD,
+       0x1F6DC,
        0x1F6ED,
        0x1F6F0,
        0x1F6FD,
        0x1F700,
-       0x1F774,
-       0x1F780,
-       0x1F7D9,
+       0x1F777,
+       0x1F77B,
+       0x1F7DA,
        0x1F7E0,
        0x1F7EC,
        0x1F7F0,
@@ -397149,23 +402124,19 @@ static const UV UNI_SC__ZYYY_invlist[] = {  /* for EBCDIC 037 */
        0x1FA60,
        0x1FA6E,
        0x1FA70,
-       0x1FA75,
-       0x1FA78,
        0x1FA7D,
        0x1FA80,
-       0x1FA87,
+       0x1FA89,
        0x1FA90,
-       0x1FAAD,
-       0x1FAB0,
-       0x1FABB,
-       0x1FAC0,
+       0x1FABE,
+       0x1FABF,
        0x1FAC6,
-       0x1FAD0,
-       0x1FADA,
+       0x1FACE,
+       0x1FADC,
        0x1FAE0,
-       0x1FAE8,
+       0x1FAE9,
        0x1FAF0,
-       0x1FAF7,
+       0x1FAF9,
        0x1FB00,
        0x1FB93,
        0x1FB94,
@@ -397183,7 +402154,7 @@ static const UV UNI_SC__ZYYY_invlist[] = {  /* for EBCDIC 037 */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_SD_invlist[] = {  /* for ASCII/Latin1 */
-       65,     /* Number of elements */
+       69,     /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -397251,7 +402222,11 @@ static const UV UNI_SD_invlist[] = {  /* for ASCII/Latin1 */
        0x1D692,
        0x1D694,
        0x1DF1A,
-       0x1DF1B
+       0x1DF1B,
+       0x1E04C,
+       0x1E04E,
+       0x1E068,
+       0x1E069
 };
 
 #  endif       /* ASCII/Latin1 */
@@ -397262,7 +402237,7 @@ static const UV UNI_SD_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_SD_invlist[] = {  /* for EBCDIC 1047 */
-       67,     /* Number of elements */
+       71,     /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -397332,7 +402307,11 @@ static const UV UNI_SD_invlist[] = {  /* for EBCDIC 1047 */
        0x1D692,
        0x1D694,
        0x1DF1A,
-       0x1DF1B
+       0x1DF1B,
+       0x1E04C,
+       0x1E04E,
+       0x1E068,
+       0x1E069
 };
 
 #  endif       /* EBCDIC 1047 */
@@ -397343,7 +402322,7 @@ static const UV UNI_SD_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_SD_invlist[] = {  /* for EBCDIC 037 */
-       67,     /* Number of elements */
+       71,     /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -397413,7 +402392,11 @@ static const UV UNI_SD_invlist[] = {  /* for EBCDIC 037 */
        0x1D692,
        0x1D694,
        0x1DF1A,
-       0x1DF1B
+       0x1DF1B,
+       0x1E04C,
+       0x1E04E,
+       0x1E068,
+       0x1E069
 };
 
 #  endif       /* EBCDIC 037 */
@@ -398221,7 +403204,7 @@ static const UV UNI_SMALLKANAEXT_invlist[] = {  /* for all charsets */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_SO_invlist[] = {  /* for ASCII/Latin1 */
-       373,    /* Number of elements */
+       369,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -398548,14 +403531,14 @@ static const UV UNI_SO_invlist[] = {  /* for ASCII/Latin1 */
        0x1F3FB,
        0x1F400,
        0x1F6D8,
-       0x1F6DD,
+       0x1F6DC,
        0x1F6ED,
        0x1F6F0,
        0x1F6FD,
        0x1F700,
-       0x1F774,
-       0x1F780,
-       0x1F7D9,
+       0x1F777,
+       0x1F77B,
+       0x1F7DA,
        0x1F7E0,
        0x1F7EC,
        0x1F7F0,
@@ -398577,23 +403560,19 @@ static const UV UNI_SO_invlist[] = {  /* for ASCII/Latin1 */
        0x1FA60,
        0x1FA6E,
        0x1FA70,
-       0x1FA75,
-       0x1FA78,
        0x1FA7D,
        0x1FA80,
-       0x1FA87,
+       0x1FA89,
        0x1FA90,
-       0x1FAAD,
-       0x1FAB0,
-       0x1FABB,
-       0x1FAC0,
+       0x1FABE,
+       0x1FABF,
        0x1FAC6,
-       0x1FAD0,
-       0x1FADA,
+       0x1FACE,
+       0x1FADC,
        0x1FAE0,
-       0x1FAE8,
+       0x1FAE9,
        0x1FAF0,
-       0x1FAF7,
+       0x1FAF9,
        0x1FB00,
        0x1FB93,
        0x1FB94,
@@ -398608,7 +403587,7 @@ static const UV UNI_SO_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_SO_invlist[] = {  /* for EBCDIC 1047 */
-       373,    /* Number of elements */
+       369,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -398935,14 +403914,14 @@ static const UV UNI_SO_invlist[] = {  /* for EBCDIC 1047 */
        0x1F3FB,
        0x1F400,
        0x1F6D8,
-       0x1F6DD,
+       0x1F6DC,
        0x1F6ED,
        0x1F6F0,
        0x1F6FD,
        0x1F700,
-       0x1F774,
-       0x1F780,
-       0x1F7D9,
+       0x1F777,
+       0x1F77B,
+       0x1F7DA,
        0x1F7E0,
        0x1F7EC,
        0x1F7F0,
@@ -398964,23 +403943,19 @@ static const UV UNI_SO_invlist[] = {  /* for EBCDIC 1047 */
        0x1FA60,
        0x1FA6E,
        0x1FA70,
-       0x1FA75,
-       0x1FA78,
        0x1FA7D,
        0x1FA80,
-       0x1FA87,
+       0x1FA89,
        0x1FA90,
-       0x1FAAD,
-       0x1FAB0,
-       0x1FABB,
-       0x1FAC0,
+       0x1FABE,
+       0x1FABF,
        0x1FAC6,
-       0x1FAD0,
-       0x1FADA,
+       0x1FACE,
+       0x1FADC,
        0x1FAE0,
-       0x1FAE8,
+       0x1FAE9,
        0x1FAF0,
-       0x1FAF7,
+       0x1FAF9,
        0x1FB00,
        0x1FB93,
        0x1FB94,
@@ -398995,7 +403970,7 @@ static const UV UNI_SO_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_SO_invlist[] = {  /* for EBCDIC 037 */
-       373,    /* Number of elements */
+       369,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -399322,14 +404297,14 @@ static const UV UNI_SO_invlist[] = {  /* for EBCDIC 037 */
        0x1F3FB,
        0x1F400,
        0x1F6D8,
-       0x1F6DD,
+       0x1F6DC,
        0x1F6ED,
        0x1F6F0,
        0x1F6FD,
        0x1F700,
-       0x1F774,
-       0x1F780,
-       0x1F7D9,
+       0x1F777,
+       0x1F77B,
+       0x1F7DA,
        0x1F7E0,
        0x1F7EC,
        0x1F7F0,
@@ -399351,23 +404326,19 @@ static const UV UNI_SO_invlist[] = {  /* for EBCDIC 037 */
        0x1FA60,
        0x1FA6E,
        0x1FA70,
-       0x1FA75,
-       0x1FA78,
        0x1FA7D,
        0x1FA80,
-       0x1FA87,
+       0x1FA89,
        0x1FA90,
-       0x1FAAD,
-       0x1FAB0,
-       0x1FABB,
-       0x1FAC0,
+       0x1FABE,
+       0x1FABF,
        0x1FAC6,
-       0x1FAD0,
-       0x1FADA,
+       0x1FACE,
+       0x1FADC,
        0x1FAE0,
-       0x1FAE8,
+       0x1FAE9,
        0x1FAF0,
-       0x1FAF7,
+       0x1FAF9,
        0x1FB00,
        0x1FB93,
        0x1FB94,
@@ -399433,7 +404404,7 @@ static const UV UNI_SPECIALS_invlist[] = {  /* for all charsets */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_STERM_invlist[] = {  /* for ASCII/Latin1 */
-       159,    /* Number of elements */
+       161,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -399582,6 +404553,8 @@ static const UV UNI_STERM_invlist[] = {  /* for ASCII/Latin1 */
        0x11C43,
        0x11EF7,
        0x11EF9,
+       0x11F43,
+       0x11F45,
        0x16A6E,
        0x16A70,
        0x16AF5,
@@ -399606,7 +404579,7 @@ static const UV UNI_STERM_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_STERM_invlist[] = {  /* for EBCDIC 1047 */
-       159,    /* Number of elements */
+       161,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -399755,6 +404728,8 @@ static const UV UNI_STERM_invlist[] = {  /* for EBCDIC 1047 */
        0x11C43,
        0x11EF7,
        0x11EF9,
+       0x11F43,
+       0x11F45,
        0x16A6E,
        0x16A70,
        0x16AF5,
@@ -399779,7 +404754,7 @@ static const UV UNI_STERM_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_STERM_invlist[] = {  /* for EBCDIC 037 */
-       159,    /* Number of elements */
+       161,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -399928,6 +404903,8 @@ static const UV UNI_STERM_invlist[] = {  /* for EBCDIC 037 */
        0x11C43,
        0x11EF7,
        0x11EF9,
+       0x11F43,
+       0x11F45,
        0x16A6E,
        0x16A70,
        0x16AF5,
@@ -400387,7 +405364,7 @@ static const UV UNI_TELU_invlist[] = {  /* for all charsets */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_TERM_invlist[] = {  /* for ASCII/Latin1 */
-       215,    /* Number of elements */
+       217,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -400590,6 +405567,8 @@ static const UV UNI_TERM_invlist[] = {  /* for ASCII/Latin1 */
        0x11C72,
        0x11EF7,
        0x11EF9,
+       0x11F43,
+       0x11F45,
        0x12470,
        0x12475,
        0x16A6E,
@@ -400616,7 +405595,7 @@ static const UV UNI_TERM_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_TERM_invlist[] = {  /* for EBCDIC 1047 */
-       217,    /* Number of elements */
+       219,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -400821,6 +405800,8 @@ static const UV UNI_TERM_invlist[] = {  /* for EBCDIC 1047 */
        0x11C72,
        0x11EF7,
        0x11EF9,
+       0x11F43,
+       0x11F45,
        0x12470,
        0x12475,
        0x16A6E,
@@ -400847,7 +405828,7 @@ static const UV UNI_TERM_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_TERM_invlist[] = {  /* for EBCDIC 037 */
-       217,    /* Number of elements */
+       219,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -401052,6 +406033,8 @@ static const UV UNI_TERM_invlist[] = {  /* for EBCDIC 037 */
        0x11C72,
        0x11EF7,
        0x11EF9,
+       0x11F43,
+       0x11F45,
        0x12470,
        0x12475,
        0x16A6E,
@@ -401251,7 +406234,7 @@ static const UV UNI_UGAR_invlist[] = {  /* for all charsets */
 };
 
 static const UV UNI_UIDEO_invlist[] = {  /* for all charsets */
-       31,     /* Number of elements */
+       33,     /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -401277,7 +406260,7 @@ static const UV UNI_UIDEO_invlist[] = {  /* for all charsets */
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -401285,7 +406268,9 @@ static const UV UNI_UIDEO_invlist[] = {  /* for all charsets */
        0x2CEB0,
        0x2EBE1,
        0x30000,
-       0x3134B
+       0x3134B,
+       0x31350,
+       0x323B0
 };
 
 static const UV UNI_VAI_invlist[] = {  /* for all charsets */
@@ -401501,7 +406486,7 @@ static const UV UNI_VO__R_invlist[] = {  /* for ASCII/Latin1 */
        0x11A00,
        0x11AC0,
        0x13000,
-       0x13440,
+       0x13460,
        0x14400,
        0x14680,
        0x16FE0,
@@ -401692,7 +406677,7 @@ static const UV UNI_VO__R_invlist[] = {  /* for EBCDIC 1047 */
        0x11A00,
        0x11AC0,
        0x13000,
-       0x13440,
+       0x13460,
        0x14400,
        0x14680,
        0x16FE0,
@@ -401883,7 +406868,7 @@ static const UV UNI_VO__R_invlist[] = {  /* for EBCDIC 037 */
        0x11A00,
        0x11AC0,
        0x13000,
-       0x13440,
+       0x13460,
        0x14400,
        0x14680,
        0x16FE0,
@@ -402261,7 +407246,7 @@ static const UV UNI_VO__U_invlist[] = {  /* for ASCII/Latin1 */
        0x11A00,
        0x11AC0,
        0x13000,
-       0x13440,
+       0x13460,
        0x14400,
        0x14680,
        0x16FE0,
@@ -402530,7 +407515,7 @@ static const UV UNI_VO__U_invlist[] = {  /* for EBCDIC 1047 */
        0x11A00,
        0x11AC0,
        0x13000,
-       0x13440,
+       0x13460,
        0x14400,
        0x14680,
        0x16FE0,
@@ -402799,7 +407784,7 @@ static const UV UNI_VO__U_invlist[] = {  /* for EBCDIC 037 */
        0x11A00,
        0x11AC0,
        0x13000,
-       0x13440,
+       0x13460,
        0x14400,
        0x14680,
        0x16FE0,
@@ -403010,7 +407995,7 @@ static const UV UNI_WB__EX_invlist[] = {  /* for EBCDIC 037 */
 #  endif       /* EBCDIC 037 */
 
 static const UV UNI_WB__EXTEND_invlist[] = {  /* for all charsets */
-       607,    /* Number of elements */
+       629,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -403175,6 +408160,8 @@ static const UV UNI_WB__EXTEND_invlist[] = {  /* for all charsets */
        0xCD7,
        0xCE2,
        0xCE4,
+       0xCF3,
+       0xCF4,
        0xD00,
        0xD04,
        0xD3B,
@@ -403212,7 +408199,7 @@ static const UV UNI_WB__EXTEND_invlist[] = {  /* for all charsets */
        0xEB4,
        0xEBD,
        0xEC8,
-       0xECE,
+       0xECF,
        0xF18,
        0xF1A,
        0xF35,
@@ -403419,6 +408406,8 @@ static const UV UNI_WB__EXTEND_invlist[] = {  /* for all charsets */
        0x10D28,
        0x10EAB,
        0x10EAD,
+       0x10EFD,
+       0x10F00,
        0x10F46,
        0x10F51,
        0x10F82,
@@ -403457,6 +408446,8 @@ static const UV UNI_WB__EXTEND_invlist[] = {  /* for all charsets */
        0x11238,
        0x1123E,
        0x1123F,
+       0x11241,
+       0x11242,
        0x112DF,
        0x112EB,
        0x11300,
@@ -403551,6 +408542,18 @@ static const UV UNI_WB__EXTEND_invlist[] = {  /* for all charsets */
        0x11D98,
        0x11EF3,
        0x11EF7,
+       0x11F00,
+       0x11F02,
+       0x11F03,
+       0x11F04,
+       0x11F34,
+       0x11F3B,
+       0x11F3E,
+       0x11F43,
+       0x13440,
+       0x13441,
+       0x13447,
+       0x13456,
        0x16AF0,
        0x16AF5,
        0x16B30,
@@ -403605,12 +408608,16 @@ static const UV UNI_WB__EXTEND_invlist[] = {  /* for all charsets */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E08F,
+       0x1E090,
        0x1E130,
        0x1E137,
        0x1E2AE,
        0x1E2AF,
        0x1E2EC,
        0x1E2F0,
+       0x1E4EC,
+       0x1E4F0,
        0x1E8D0,
        0x1E8D7,
        0x1E944,
@@ -403664,7 +408671,7 @@ static const UV UNI_WB__FO_invlist[] = {  /* for ASCII/Latin1 */
        0x110CD,
        0x110CE,
        0x13430,
-       0x13439,
+       0x13440,
        0x1BCA0,
        0x1BCA4,
        0x1D173,
@@ -403719,7 +408726,7 @@ static const UV UNI_WB__FO_invlist[] = {  /* for EBCDIC 1047 */
        0x110CD,
        0x110CE,
        0x13430,
-       0x13439,
+       0x13440,
        0x1BCA0,
        0x1BCA4,
        0x1D173,
@@ -403774,7 +408781,7 @@ static const UV UNI_WB__FO_invlist[] = {  /* for EBCDIC 037 */
        0x110CD,
        0x110CE,
        0x13430,
-       0x13439,
+       0x13440,
        0x1BCA0,
        0x1BCA4,
        0x1D173,
@@ -403786,7 +408793,7 @@ static const UV UNI_WB__FO_invlist[] = {  /* for EBCDIC 037 */
 #  endif       /* EBCDIC 037 */
 
 static const UV UNI_WB__KA_invlist[] = {  /* for all charsets */
-       29,     /* Number of elements */
+       31,     /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -403817,6 +408824,8 @@ static const UV UNI_WB__KA_invlist[] = {  /* for all charsets */
        0x1B001,
        0x1B120,
        0x1B123,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168
 };
@@ -403824,7 +408833,7 @@ static const UV UNI_WB__KA_invlist[] = {  /* for all charsets */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_WB__LE_invlist[] = {  /* for ASCII/Latin1 */
-       1141,   /* Number of elements */
+       1157,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -404641,6 +409650,8 @@ static const UV UNI_WB__LE_invlist[] = {  /* for ASCII/Latin1 */
        0x11212,
        0x11213,
        0x1122C,
+       0x1123F,
+       0x11241,
        0x11280,
        0x11287,
        0x11288,
@@ -404761,6 +409772,12 @@ static const UV UNI_WB__LE_invlist[] = {  /* for ASCII/Latin1 */
        0x11D99,
        0x11EE0,
        0x11EF3,
+       0x11F02,
+       0x11F03,
+       0x11F04,
+       0x11F11,
+       0x11F12,
+       0x11F34,
        0x11FB0,
        0x11FB1,
        0x12000,
@@ -404772,7 +409789,9 @@ static const UV UNI_WB__LE_invlist[] = {  /* for ASCII/Latin1 */
        0x12F90,
        0x12FF1,
        0x13000,
-       0x1342F,
+       0x13430,
+       0x13441,
+       0x13447,
        0x14400,
        0x14647,
        0x16800,
@@ -404873,6 +409892,10 @@ static const UV UNI_WB__LE_invlist[] = {  /* for ASCII/Latin1 */
        0x1D7CC,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
+       0x1E030,
+       0x1E06E,
        0x1E100,
        0x1E12D,
        0x1E137,
@@ -404883,6 +409906,8 @@ static const UV UNI_WB__LE_invlist[] = {  /* for ASCII/Latin1 */
        0x1E2AE,
        0x1E2C0,
        0x1E2EC,
+       0x1E4D0,
+       0x1E4EC,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -404979,7 +410004,7 @@ static const UV UNI_WB__LE_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_WB__LE_invlist[] = {  /* for EBCDIC 1047 */
-       1167,   /* Number of elements */
+       1183,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -405822,6 +410847,8 @@ static const UV UNI_WB__LE_invlist[] = {  /* for EBCDIC 1047 */
        0x11212,
        0x11213,
        0x1122C,
+       0x1123F,
+       0x11241,
        0x11280,
        0x11287,
        0x11288,
@@ -405942,6 +410969,12 @@ static const UV UNI_WB__LE_invlist[] = {  /* for EBCDIC 1047 */
        0x11D99,
        0x11EE0,
        0x11EF3,
+       0x11F02,
+       0x11F03,
+       0x11F04,
+       0x11F11,
+       0x11F12,
+       0x11F34,
        0x11FB0,
        0x11FB1,
        0x12000,
@@ -405953,7 +410986,9 @@ static const UV UNI_WB__LE_invlist[] = {  /* for EBCDIC 1047 */
        0x12F90,
        0x12FF1,
        0x13000,
-       0x1342F,
+       0x13430,
+       0x13441,
+       0x13447,
        0x14400,
        0x14647,
        0x16800,
@@ -406054,6 +411089,10 @@ static const UV UNI_WB__LE_invlist[] = {  /* for EBCDIC 1047 */
        0x1D7CC,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
+       0x1E030,
+       0x1E06E,
        0x1E100,
        0x1E12D,
        0x1E137,
@@ -406064,6 +411103,8 @@ static const UV UNI_WB__LE_invlist[] = {  /* for EBCDIC 1047 */
        0x1E2AE,
        0x1E2C0,
        0x1E2EC,
+       0x1E4D0,
+       0x1E4EC,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -406160,7 +411201,7 @@ static const UV UNI_WB__LE_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_WB__LE_invlist[] = {  /* for EBCDIC 037 */
-       1163,   /* Number of elements */
+       1179,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -406999,6 +412040,8 @@ static const UV UNI_WB__LE_invlist[] = {  /* for EBCDIC 037 */
        0x11212,
        0x11213,
        0x1122C,
+       0x1123F,
+       0x11241,
        0x11280,
        0x11287,
        0x11288,
@@ -407119,6 +412162,12 @@ static const UV UNI_WB__LE_invlist[] = {  /* for EBCDIC 037 */
        0x11D99,
        0x11EE0,
        0x11EF3,
+       0x11F02,
+       0x11F03,
+       0x11F04,
+       0x11F11,
+       0x11F12,
+       0x11F34,
        0x11FB0,
        0x11FB1,
        0x12000,
@@ -407130,7 +412179,9 @@ static const UV UNI_WB__LE_invlist[] = {  /* for EBCDIC 037 */
        0x12F90,
        0x12FF1,
        0x13000,
-       0x1342F,
+       0x13430,
+       0x13441,
+       0x13447,
        0x14400,
        0x14647,
        0x16800,
@@ -407231,6 +412282,10 @@ static const UV UNI_WB__LE_invlist[] = {  /* for EBCDIC 037 */
        0x1D7CC,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
+       0x1E030,
+       0x1E06E,
        0x1E100,
        0x1E12D,
        0x1E137,
@@ -407241,6 +412296,8 @@ static const UV UNI_WB__LE_invlist[] = {  /* for EBCDIC 037 */
        0x1E2AE,
        0x1E2C0,
        0x1E2EC,
+       0x1E4D0,
+       0x1E4EC,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -407694,7 +412751,7 @@ static const UV UNI_WB__NL_invlist[] = {  /* for EBCDIC 037 */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_WB__NU_invlist[] = {  /* for ASCII/Latin1 */
-       127,    /* Number of elements */
+       131,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -407809,6 +412866,8 @@ static const UV UNI_WB__NU_invlist[] = {  /* for ASCII/Latin1 */
        0x11D5A,
        0x11DA0,
        0x11DAA,
+       0x11F50,
+       0x11F5A,
        0x16A60,
        0x16A6A,
        0x16AC0,
@@ -407821,6 +412880,8 @@ static const UV UNI_WB__NU_invlist[] = {  /* for ASCII/Latin1 */
        0x1E14A,
        0x1E2F0,
        0x1E2FA,
+       0x1E4F0,
+       0x1E4FA,
        0x1E950,
        0x1E95A,
        0x1FBF0,
@@ -407835,7 +412896,7 @@ static const UV UNI_WB__NU_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_WB__NU_invlist[] = {  /* for EBCDIC 1047 */
-       127,    /* Number of elements */
+       131,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -407950,6 +413011,8 @@ static const UV UNI_WB__NU_invlist[] = {  /* for EBCDIC 1047 */
        0x11D5A,
        0x11DA0,
        0x11DAA,
+       0x11F50,
+       0x11F5A,
        0x16A60,
        0x16A6A,
        0x16AC0,
@@ -407962,6 +413025,8 @@ static const UV UNI_WB__NU_invlist[] = {  /* for EBCDIC 1047 */
        0x1E14A,
        0x1E2F0,
        0x1E2FA,
+       0x1E4F0,
+       0x1E4FA,
        0x1E950,
        0x1E95A,
        0x1FBF0,
@@ -407976,7 +413041,7 @@ static const UV UNI_WB__NU_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_WB__NU_invlist[] = {  /* for EBCDIC 037 */
-       127,    /* Number of elements */
+       131,    /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -408091,6 +413156,8 @@ static const UV UNI_WB__NU_invlist[] = {  /* for EBCDIC 037 */
        0x11D5A,
        0x11DA0,
        0x11DAA,
+       0x11F50,
+       0x11F5A,
        0x16A60,
        0x16A6A,
        0x16AC0,
@@ -408103,6 +413170,8 @@ static const UV UNI_WB__NU_invlist[] = {  /* for EBCDIC 037 */
        0x1E14A,
        0x1E2F0,
        0x1E2FA,
+       0x1E4F0,
+       0x1E4FA,
        0x1E950,
        0x1E95A,
        0x1FBF0,
@@ -408240,7 +413309,7 @@ static const UV UNI_WB__WSEGSPACE_invlist[] = {  /* for EBCDIC 037 */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_WB__XX_invlist[] = {  /* for ASCII/Latin1 */
-       1541,   /* Number of elements */
+       1557,   /* Number of elements */
        148565664, /* Version and data structure type */
        0,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -408576,7 +413645,7 @@ static const UV UNI_WB__XX_invlist[] = {  /* for ASCII/Latin1 */
        0xCE6,
        0xCF0,
        0xCF1,
-       0xCF3,
+       0xCF4,
        0xD00,
        0xD0D,
        0xD0E,
@@ -408632,7 +413701,7 @@ static const UV UNI_WB__XX_invlist[] = {  /* for ASCII/Latin1 */
        0xEB4,
        0xEBD,
        0xEC8,
-       0xECE,
+       0xECF,
        0xED0,
        0xEDA,
        0xF00,
@@ -409287,7 +414356,7 @@ static const UV UNI_WB__XX_invlist[] = {  /* for ASCII/Latin1 */
        0x10EAD,
        0x10EB0,
        0x10EB2,
-       0x10F00,
+       0x10EFD,
        0x10F1D,
        0x10F27,
        0x10F28,
@@ -409338,7 +414407,7 @@ static const UV UNI_WB__XX_invlist[] = {  /* for ASCII/Latin1 */
        0x11213,
        0x11238,
        0x1123E,
-       0x1123F,
+       0x11242,
        0x11280,
        0x11287,
        0x11288,
@@ -409495,6 +414564,14 @@ static const UV UNI_WB__XX_invlist[] = {  /* for ASCII/Latin1 */
        0x11DAA,
        0x11EE0,
        0x11EF7,
+       0x11F00,
+       0x11F11,
+       0x11F12,
+       0x11F3B,
+       0x11F3E,
+       0x11F43,
+       0x11F50,
+       0x11F5A,
        0x11FB0,
        0x11FB1,
        0x12000,
@@ -409506,9 +414583,7 @@ static const UV UNI_WB__XX_invlist[] = {  /* for ASCII/Latin1 */
        0x12F90,
        0x12FF1,
        0x13000,
-       0x1342F,
-       0x13430,
-       0x13439,
+       0x13456,
        0x14400,
        0x14647,
        0x16800,
@@ -409559,6 +414634,8 @@ static const UV UNI_WB__XX_invlist[] = {  /* for ASCII/Latin1 */
        0x1B001,
        0x1B120,
        0x1B123,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1BC00,
@@ -409663,6 +414740,8 @@ static const UV UNI_WB__XX_invlist[] = {  /* for ASCII/Latin1 */
        0x1DAB0,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
        0x1E000,
        0x1E007,
        0x1E008,
@@ -409673,6 +414752,10 @@ static const UV UNI_WB__XX_invlist[] = {  /* for ASCII/Latin1 */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E030,
+       0x1E06E,
+       0x1E08F,
+       0x1E090,
        0x1E100,
        0x1E12D,
        0x1E130,
@@ -409685,6 +414768,8 @@ static const UV UNI_WB__XX_invlist[] = {  /* for ASCII/Latin1 */
        0x1E2AF,
        0x1E2C0,
        0x1E2FA,
+       0x1E4D0,
+       0x1E4FA,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -409795,7 +414880,7 @@ static const UV UNI_WB__XX_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_WB__XX_invlist[] = {  /* for EBCDIC 1047 */
-       1565,   /* Number of elements */
+       1581,   /* Number of elements */
        148565664, /* Version and data structure type */
        0,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -410155,7 +415240,7 @@ static const UV UNI_WB__XX_invlist[] = {  /* for EBCDIC 1047 */
        0xCE6,
        0xCF0,
        0xCF1,
-       0xCF3,
+       0xCF4,
        0xD00,
        0xD0D,
        0xD0E,
@@ -410211,7 +415296,7 @@ static const UV UNI_WB__XX_invlist[] = {  /* for EBCDIC 1047 */
        0xEB4,
        0xEBD,
        0xEC8,
-       0xECE,
+       0xECF,
        0xED0,
        0xEDA,
        0xF00,
@@ -410866,7 +415951,7 @@ static const UV UNI_WB__XX_invlist[] = {  /* for EBCDIC 1047 */
        0x10EAD,
        0x10EB0,
        0x10EB2,
-       0x10F00,
+       0x10EFD,
        0x10F1D,
        0x10F27,
        0x10F28,
@@ -410917,7 +416002,7 @@ static const UV UNI_WB__XX_invlist[] = {  /* for EBCDIC 1047 */
        0x11213,
        0x11238,
        0x1123E,
-       0x1123F,
+       0x11242,
        0x11280,
        0x11287,
        0x11288,
@@ -411074,6 +416159,14 @@ static const UV UNI_WB__XX_invlist[] = {  /* for EBCDIC 1047 */
        0x11DAA,
        0x11EE0,
        0x11EF7,
+       0x11F00,
+       0x11F11,
+       0x11F12,
+       0x11F3B,
+       0x11F3E,
+       0x11F43,
+       0x11F50,
+       0x11F5A,
        0x11FB0,
        0x11FB1,
        0x12000,
@@ -411085,9 +416178,7 @@ static const UV UNI_WB__XX_invlist[] = {  /* for EBCDIC 1047 */
        0x12F90,
        0x12FF1,
        0x13000,
-       0x1342F,
-       0x13430,
-       0x13439,
+       0x13456,
        0x14400,
        0x14647,
        0x16800,
@@ -411138,6 +416229,8 @@ static const UV UNI_WB__XX_invlist[] = {  /* for EBCDIC 1047 */
        0x1B001,
        0x1B120,
        0x1B123,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1BC00,
@@ -411242,6 +416335,8 @@ static const UV UNI_WB__XX_invlist[] = {  /* for EBCDIC 1047 */
        0x1DAB0,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
        0x1E000,
        0x1E007,
        0x1E008,
@@ -411252,6 +416347,10 @@ static const UV UNI_WB__XX_invlist[] = {  /* for EBCDIC 1047 */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E030,
+       0x1E06E,
+       0x1E08F,
+       0x1E090,
        0x1E100,
        0x1E12D,
        0x1E130,
@@ -411264,6 +416363,8 @@ static const UV UNI_WB__XX_invlist[] = {  /* for EBCDIC 1047 */
        0x1E2AF,
        0x1E2C0,
        0x1E2FA,
+       0x1E4D0,
+       0x1E4FA,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -411374,7 +416475,7 @@ static const UV UNI_WB__XX_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_WB__XX_invlist[] = {  /* for EBCDIC 037 */
-       1561,   /* Number of elements */
+       1577,   /* Number of elements */
        148565664, /* Version and data structure type */
        0,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -411730,7 +416831,7 @@ static const UV UNI_WB__XX_invlist[] = {  /* for EBCDIC 037 */
        0xCE6,
        0xCF0,
        0xCF1,
-       0xCF3,
+       0xCF4,
        0xD00,
        0xD0D,
        0xD0E,
@@ -411786,7 +416887,7 @@ static const UV UNI_WB__XX_invlist[] = {  /* for EBCDIC 037 */
        0xEB4,
        0xEBD,
        0xEC8,
-       0xECE,
+       0xECF,
        0xED0,
        0xEDA,
        0xF00,
@@ -412441,7 +417542,7 @@ static const UV UNI_WB__XX_invlist[] = {  /* for EBCDIC 037 */
        0x10EAD,
        0x10EB0,
        0x10EB2,
-       0x10F00,
+       0x10EFD,
        0x10F1D,
        0x10F27,
        0x10F28,
@@ -412492,7 +417593,7 @@ static const UV UNI_WB__XX_invlist[] = {  /* for EBCDIC 037 */
        0x11213,
        0x11238,
        0x1123E,
-       0x1123F,
+       0x11242,
        0x11280,
        0x11287,
        0x11288,
@@ -412649,6 +417750,14 @@ static const UV UNI_WB__XX_invlist[] = {  /* for EBCDIC 037 */
        0x11DAA,
        0x11EE0,
        0x11EF7,
+       0x11F00,
+       0x11F11,
+       0x11F12,
+       0x11F3B,
+       0x11F3E,
+       0x11F43,
+       0x11F50,
+       0x11F5A,
        0x11FB0,
        0x11FB1,
        0x12000,
@@ -412660,9 +417769,7 @@ static const UV UNI_WB__XX_invlist[] = {  /* for EBCDIC 037 */
        0x12F90,
        0x12FF1,
        0x13000,
-       0x1342F,
-       0x13430,
-       0x13439,
+       0x13456,
        0x14400,
        0x14647,
        0x16800,
@@ -412713,6 +417820,8 @@ static const UV UNI_WB__XX_invlist[] = {  /* for EBCDIC 037 */
        0x1B001,
        0x1B120,
        0x1B123,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1BC00,
@@ -412817,6 +417926,8 @@ static const UV UNI_WB__XX_invlist[] = {  /* for EBCDIC 037 */
        0x1DAB0,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
        0x1E000,
        0x1E007,
        0x1E008,
@@ -412827,6 +417938,10 @@ static const UV UNI_WB__XX_invlist[] = {  /* for EBCDIC 037 */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E030,
+       0x1E06E,
+       0x1E08F,
+       0x1E090,
        0x1E100,
        0x1E12D,
        0x1E130,
@@ -412839,6 +417954,8 @@ static const UV UNI_WB__XX_invlist[] = {  /* for EBCDIC 037 */
        0x1E2AF,
        0x1E2C0,
        0x1E2FA,
+       0x1E4D0,
+       0x1E4FA,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -412958,7 +418075,7 @@ static const UV UNI_WCHO_invlist[] = {  /* for all charsets */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_XIDC_invlist[] = {  /* for ASCII/Latin1 */
-       1527,   /* Number of elements */
+       1551,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -413280,7 +418397,7 @@ static const UV UNI_XIDC_invlist[] = {  /* for ASCII/Latin1 */
        0xCE6,
        0xCF0,
        0xCF1,
-       0xCF3,
+       0xCF4,
        0xD00,
        0xD0D,
        0xD0E,
@@ -413346,7 +418463,7 @@ static const UV UNI_XIDC_invlist[] = {  /* for ASCII/Latin1 */
        0xEC6,
        0xEC7,
        0xEC8,
-       0xECE,
+       0xECF,
        0xED0,
        0xEDA,
        0xEDC,
@@ -413985,7 +419102,7 @@ static const UV UNI_XIDC_invlist[] = {  /* for ASCII/Latin1 */
        0x10EAD,
        0x10EB0,
        0x10EB2,
-       0x10F00,
+       0x10EFD,
        0x10F1D,
        0x10F27,
        0x10F28,
@@ -414032,7 +419149,7 @@ static const UV UNI_XIDC_invlist[] = {  /* for ASCII/Latin1 */
        0x11213,
        0x11238,
        0x1123E,
-       0x1123F,
+       0x11242,
        0x11280,
        0x11287,
        0x11288,
@@ -414193,6 +419310,14 @@ static const UV UNI_XIDC_invlist[] = {  /* for ASCII/Latin1 */
        0x11DAA,
        0x11EE0,
        0x11EF7,
+       0x11F00,
+       0x11F11,
+       0x11F12,
+       0x11F3B,
+       0x11F3E,
+       0x11F43,
+       0x11F50,
+       0x11F5A,
        0x11FB0,
        0x11FB1,
        0x12000,
@@ -414204,7 +419329,9 @@ static const UV UNI_XIDC_invlist[] = {  /* for ASCII/Latin1 */
        0x12F90,
        0x12FF1,
        0x13000,
-       0x1342F,
+       0x13430,
+       0x13440,
+       0x13456,
        0x14400,
        0x14647,
        0x16800,
@@ -414259,8 +419386,12 @@ static const UV UNI_XIDC_invlist[] = {  /* for ASCII/Latin1 */
        0x1AFFF,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -414367,6 +419498,8 @@ static const UV UNI_XIDC_invlist[] = {  /* for ASCII/Latin1 */
        0x1DAB0,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
        0x1E000,
        0x1E007,
        0x1E008,
@@ -414377,6 +419510,10 @@ static const UV UNI_XIDC_invlist[] = {  /* for ASCII/Latin1 */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E030,
+       0x1E06E,
+       0x1E08F,
+       0x1E090,
        0x1E100,
        0x1E12D,
        0x1E130,
@@ -414389,6 +419526,8 @@ static const UV UNI_XIDC_invlist[] = {  /* for ASCII/Latin1 */
        0x1E2AF,
        0x1E2C0,
        0x1E2FA,
+       0x1E4D0,
+       0x1E4FA,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -414476,7 +419615,7 @@ static const UV UNI_XIDC_invlist[] = {  /* for ASCII/Latin1 */
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -414487,6 +419626,8 @@ static const UV UNI_XIDC_invlist[] = {  /* for ASCII/Latin1 */
        0x2FA1E,
        0x30000,
        0x3134B,
+       0x31350,
+       0x323B0,
        0xE0100,
        0xE01F0
 };
@@ -414499,7 +419640,7 @@ static const UV UNI_XIDC_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_XIDC_invlist[] = {  /* for EBCDIC 1047 */
-       1551,   /* Number of elements */
+       1575,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -414845,7 +419986,7 @@ static const UV UNI_XIDC_invlist[] = {  /* for EBCDIC 1047 */
        0xCE6,
        0xCF0,
        0xCF1,
-       0xCF3,
+       0xCF4,
        0xD00,
        0xD0D,
        0xD0E,
@@ -414911,7 +420052,7 @@ static const UV UNI_XIDC_invlist[] = {  /* for EBCDIC 1047 */
        0xEC6,
        0xEC7,
        0xEC8,
-       0xECE,
+       0xECF,
        0xED0,
        0xEDA,
        0xEDC,
@@ -415550,7 +420691,7 @@ static const UV UNI_XIDC_invlist[] = {  /* for EBCDIC 1047 */
        0x10EAD,
        0x10EB0,
        0x10EB2,
-       0x10F00,
+       0x10EFD,
        0x10F1D,
        0x10F27,
        0x10F28,
@@ -415597,7 +420738,7 @@ static const UV UNI_XIDC_invlist[] = {  /* for EBCDIC 1047 */
        0x11213,
        0x11238,
        0x1123E,
-       0x1123F,
+       0x11242,
        0x11280,
        0x11287,
        0x11288,
@@ -415758,6 +420899,14 @@ static const UV UNI_XIDC_invlist[] = {  /* for EBCDIC 1047 */
        0x11DAA,
        0x11EE0,
        0x11EF7,
+       0x11F00,
+       0x11F11,
+       0x11F12,
+       0x11F3B,
+       0x11F3E,
+       0x11F43,
+       0x11F50,
+       0x11F5A,
        0x11FB0,
        0x11FB1,
        0x12000,
@@ -415769,7 +420918,9 @@ static const UV UNI_XIDC_invlist[] = {  /* for EBCDIC 1047 */
        0x12F90,
        0x12FF1,
        0x13000,
-       0x1342F,
+       0x13430,
+       0x13440,
+       0x13456,
        0x14400,
        0x14647,
        0x16800,
@@ -415824,8 +420975,12 @@ static const UV UNI_XIDC_invlist[] = {  /* for EBCDIC 1047 */
        0x1AFFF,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -415932,6 +421087,8 @@ static const UV UNI_XIDC_invlist[] = {  /* for EBCDIC 1047 */
        0x1DAB0,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
        0x1E000,
        0x1E007,
        0x1E008,
@@ -415942,6 +421099,10 @@ static const UV UNI_XIDC_invlist[] = {  /* for EBCDIC 1047 */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E030,
+       0x1E06E,
+       0x1E08F,
+       0x1E090,
        0x1E100,
        0x1E12D,
        0x1E130,
@@ -415954,6 +421115,8 @@ static const UV UNI_XIDC_invlist[] = {  /* for EBCDIC 1047 */
        0x1E2AF,
        0x1E2C0,
        0x1E2FA,
+       0x1E4D0,
+       0x1E4FA,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -416041,7 +421204,7 @@ static const UV UNI_XIDC_invlist[] = {  /* for EBCDIC 1047 */
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -416052,6 +421215,8 @@ static const UV UNI_XIDC_invlist[] = {  /* for EBCDIC 1047 */
        0x2FA1E,
        0x30000,
        0x3134B,
+       0x31350,
+       0x323B0,
        0xE0100,
        0xE01F0
 };
@@ -416064,7 +421229,7 @@ static const UV UNI_XIDC_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_XIDC_invlist[] = {  /* for EBCDIC 037 */
-       1547,   /* Number of elements */
+       1571,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -416406,7 +421571,7 @@ static const UV UNI_XIDC_invlist[] = {  /* for EBCDIC 037 */
        0xCE6,
        0xCF0,
        0xCF1,
-       0xCF3,
+       0xCF4,
        0xD00,
        0xD0D,
        0xD0E,
@@ -416472,7 +421637,7 @@ static const UV UNI_XIDC_invlist[] = {  /* for EBCDIC 037 */
        0xEC6,
        0xEC7,
        0xEC8,
-       0xECE,
+       0xECF,
        0xED0,
        0xEDA,
        0xEDC,
@@ -417111,7 +422276,7 @@ static const UV UNI_XIDC_invlist[] = {  /* for EBCDIC 037 */
        0x10EAD,
        0x10EB0,
        0x10EB2,
-       0x10F00,
+       0x10EFD,
        0x10F1D,
        0x10F27,
        0x10F28,
@@ -417158,7 +422323,7 @@ static const UV UNI_XIDC_invlist[] = {  /* for EBCDIC 037 */
        0x11213,
        0x11238,
        0x1123E,
-       0x1123F,
+       0x11242,
        0x11280,
        0x11287,
        0x11288,
@@ -417319,6 +422484,14 @@ static const UV UNI_XIDC_invlist[] = {  /* for EBCDIC 037 */
        0x11DAA,
        0x11EE0,
        0x11EF7,
+       0x11F00,
+       0x11F11,
+       0x11F12,
+       0x11F3B,
+       0x11F3E,
+       0x11F43,
+       0x11F50,
+       0x11F5A,
        0x11FB0,
        0x11FB1,
        0x12000,
@@ -417330,7 +422503,9 @@ static const UV UNI_XIDC_invlist[] = {  /* for EBCDIC 037 */
        0x12F90,
        0x12FF1,
        0x13000,
-       0x1342F,
+       0x13430,
+       0x13440,
+       0x13456,
        0x14400,
        0x14647,
        0x16800,
@@ -417385,8 +422560,12 @@ static const UV UNI_XIDC_invlist[] = {  /* for EBCDIC 037 */
        0x1AFFF,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -417493,6 +422672,8 @@ static const UV UNI_XIDC_invlist[] = {  /* for EBCDIC 037 */
        0x1DAB0,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
        0x1E000,
        0x1E007,
        0x1E008,
@@ -417503,6 +422684,10 @@ static const UV UNI_XIDC_invlist[] = {  /* for EBCDIC 037 */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E030,
+       0x1E06E,
+       0x1E08F,
+       0x1E090,
        0x1E100,
        0x1E12D,
        0x1E130,
@@ -417515,6 +422700,8 @@ static const UV UNI_XIDC_invlist[] = {  /* for EBCDIC 037 */
        0x1E2AF,
        0x1E2C0,
        0x1E2FA,
+       0x1E4D0,
+       0x1E4FA,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -417602,7 +422789,7 @@ static const UV UNI_XIDC_invlist[] = {  /* for EBCDIC 037 */
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -417613,6 +422800,8 @@ static const UV UNI_XIDC_invlist[] = {  /* for EBCDIC 037 */
        0x2FA1E,
        0x30000,
        0x3134B,
+       0x31350,
+       0x323B0,
        0xE0100,
        0xE01F0
 };
@@ -417622,7 +422811,7 @@ static const UV UNI_XIDC_invlist[] = {  /* for EBCDIC 037 */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_XIDS_invlist[] = {  /* for ASCII/Latin1 */
-       1311,   /* Number of elements */
+       1333,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -418577,6 +423766,8 @@ static const UV UNI_XIDS_invlist[] = {  /* for ASCII/Latin1 */
        0x11212,
        0x11213,
        0x1122C,
+       0x1123F,
+       0x11241,
        0x11280,
        0x11287,
        0x11288,
@@ -418701,6 +423892,12 @@ static const UV UNI_XIDS_invlist[] = {  /* for ASCII/Latin1 */
        0x11D99,
        0x11EE0,
        0x11EF3,
+       0x11F02,
+       0x11F03,
+       0x11F04,
+       0x11F11,
+       0x11F12,
+       0x11F34,
        0x11FB0,
        0x11FB1,
        0x12000,
@@ -418712,7 +423909,9 @@ static const UV UNI_XIDS_invlist[] = {  /* for ASCII/Latin1 */
        0x12F90,
        0x12FF1,
        0x13000,
-       0x1342F,
+       0x13430,
+       0x13441,
+       0x13447,
        0x14400,
        0x14647,
        0x16800,
@@ -418757,8 +423956,12 @@ static const UV UNI_XIDS_invlist[] = {  /* for ASCII/Latin1 */
        0x1AFFF,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -418833,6 +424036,10 @@ static const UV UNI_XIDS_invlist[] = {  /* for ASCII/Latin1 */
        0x1D7CC,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
+       0x1E030,
+       0x1E06E,
        0x1E100,
        0x1E12D,
        0x1E137,
@@ -418843,6 +424050,8 @@ static const UV UNI_XIDS_invlist[] = {  /* for ASCII/Latin1 */
        0x1E2AE,
        0x1E2C0,
        0x1E2EC,
+       0x1E4D0,
+       0x1E4EC,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -418926,7 +424135,7 @@ static const UV UNI_XIDS_invlist[] = {  /* for ASCII/Latin1 */
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -418936,7 +424145,9 @@ static const UV UNI_XIDS_invlist[] = {  /* for ASCII/Latin1 */
        0x2F800,
        0x2FA1E,
        0x30000,
-       0x3134B
+       0x3134B,
+       0x31350,
+       0x323B0
 };
 
 #  endif       /* ASCII/Latin1 */
@@ -418947,7 +424158,7 @@ static const UV UNI_XIDS_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_XIDS_invlist[] = {  /* for EBCDIC 1047 */
-       1337,   /* Number of elements */
+       1359,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -419928,6 +425139,8 @@ static const UV UNI_XIDS_invlist[] = {  /* for EBCDIC 1047 */
        0x11212,
        0x11213,
        0x1122C,
+       0x1123F,
+       0x11241,
        0x11280,
        0x11287,
        0x11288,
@@ -420052,6 +425265,12 @@ static const UV UNI_XIDS_invlist[] = {  /* for EBCDIC 1047 */
        0x11D99,
        0x11EE0,
        0x11EF3,
+       0x11F02,
+       0x11F03,
+       0x11F04,
+       0x11F11,
+       0x11F12,
+       0x11F34,
        0x11FB0,
        0x11FB1,
        0x12000,
@@ -420063,7 +425282,9 @@ static const UV UNI_XIDS_invlist[] = {  /* for EBCDIC 1047 */
        0x12F90,
        0x12FF1,
        0x13000,
-       0x1342F,
+       0x13430,
+       0x13441,
+       0x13447,
        0x14400,
        0x14647,
        0x16800,
@@ -420108,8 +425329,12 @@ static const UV UNI_XIDS_invlist[] = {  /* for EBCDIC 1047 */
        0x1AFFF,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -420184,6 +425409,10 @@ static const UV UNI_XIDS_invlist[] = {  /* for EBCDIC 1047 */
        0x1D7CC,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
+       0x1E030,
+       0x1E06E,
        0x1E100,
        0x1E12D,
        0x1E137,
@@ -420194,6 +425423,8 @@ static const UV UNI_XIDS_invlist[] = {  /* for EBCDIC 1047 */
        0x1E2AE,
        0x1E2C0,
        0x1E2EC,
+       0x1E4D0,
+       0x1E4EC,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -420277,7 +425508,7 @@ static const UV UNI_XIDS_invlist[] = {  /* for EBCDIC 1047 */
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -420287,7 +425518,9 @@ static const UV UNI_XIDS_invlist[] = {  /* for EBCDIC 1047 */
        0x2F800,
        0x2FA1E,
        0x30000,
-       0x3134B
+       0x3134B,
+       0x31350,
+       0x323B0
 };
 
 #  endif       /* EBCDIC 1047 */
@@ -420298,7 +425531,7 @@ static const UV UNI_XIDS_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_XIDS_invlist[] = {  /* for EBCDIC 037 */
-       1333,   /* Number of elements */
+       1355,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -421275,6 +426508,8 @@ static const UV UNI_XIDS_invlist[] = {  /* for EBCDIC 037 */
        0x11212,
        0x11213,
        0x1122C,
+       0x1123F,
+       0x11241,
        0x11280,
        0x11287,
        0x11288,
@@ -421399,6 +426634,12 @@ static const UV UNI_XIDS_invlist[] = {  /* for EBCDIC 037 */
        0x11D99,
        0x11EE0,
        0x11EF3,
+       0x11F02,
+       0x11F03,
+       0x11F04,
+       0x11F11,
+       0x11F12,
+       0x11F34,
        0x11FB0,
        0x11FB1,
        0x12000,
@@ -421410,7 +426651,9 @@ static const UV UNI_XIDS_invlist[] = {  /* for EBCDIC 037 */
        0x12F90,
        0x12FF1,
        0x13000,
-       0x1342F,
+       0x13430,
+       0x13441,
+       0x13447,
        0x14400,
        0x14647,
        0x16800,
@@ -421455,8 +426698,12 @@ static const UV UNI_XIDS_invlist[] = {  /* for EBCDIC 037 */
        0x1AFFF,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -421531,6 +426778,10 @@ static const UV UNI_XIDS_invlist[] = {  /* for EBCDIC 037 */
        0x1D7CC,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
+       0x1E030,
+       0x1E06E,
        0x1E100,
        0x1E12D,
        0x1E137,
@@ -421541,6 +426792,8 @@ static const UV UNI_XIDS_invlist[] = {  /* for EBCDIC 037 */
        0x1E2AE,
        0x1E2C0,
        0x1E2EC,
+       0x1E4D0,
+       0x1E4EC,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -421624,7 +426877,7 @@ static const UV UNI_XIDS_invlist[] = {  /* for EBCDIC 037 */
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -421634,7 +426887,9 @@ static const UV UNI_XIDS_invlist[] = {  /* for EBCDIC 037 */
        0x2F800,
        0x2FA1E,
        0x30000,
-       0x3134B
+       0x3134B,
+       0x31350,
+       0x323B0
 };
 
 #  endif       /* EBCDIC 037 */
@@ -421950,7 +427205,7 @@ static const UV UNI_ZS_invlist[] = {  /* for EBCDIC 037 */
 #  if 'A' == 65 /* ASCII/Latin1 */
 
 static const UV UNI_ZYYY_invlist[] = {  /* for ASCII/Latin1 */
-       296,    /* Number of elements */
+       294,    /* Number of elements */
        148565664, /* Version and data structure type */
        0,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -422116,6 +427371,8 @@ static const UV UNI_ZYYY_invlist[] = {  /* for ASCII/Latin1 */
        0x1D1AA,
        0x1D1AE,
        0x1D1EB,
+       0x1D2C0,
+       0x1D2D4,
        0x1D2E0,
        0x1D2F4,
        0x1D300,
@@ -422194,14 +427451,14 @@ static const UV UNI_ZYYY_invlist[] = {  /* for ASCII/Latin1 */
        0x1F266,
        0x1F300,
        0x1F6D8,
-       0x1F6DD,
+       0x1F6DC,
        0x1F6ED,
        0x1F6F0,
        0x1F6FD,
        0x1F700,
-       0x1F774,
-       0x1F780,
-       0x1F7D9,
+       0x1F777,
+       0x1F77B,
+       0x1F7DA,
        0x1F7E0,
        0x1F7EC,
        0x1F7F0,
@@ -422223,23 +427480,19 @@ static const UV UNI_ZYYY_invlist[] = {  /* for ASCII/Latin1 */
        0x1FA60,
        0x1FA6E,
        0x1FA70,
-       0x1FA75,
-       0x1FA78,
        0x1FA7D,
        0x1FA80,
-       0x1FA87,
+       0x1FA89,
        0x1FA90,
-       0x1FAAD,
-       0x1FAB0,
-       0x1FABB,
-       0x1FAC0,
+       0x1FABE,
+       0x1FABF,
        0x1FAC6,
-       0x1FAD0,
-       0x1FADA,
+       0x1FACE,
+       0x1FADC,
        0x1FAE0,
-       0x1FAE8,
+       0x1FAE9,
        0x1FAF0,
-       0x1FAF7,
+       0x1FAF9,
        0x1FB00,
        0x1FB93,
        0x1FB94,
@@ -422260,7 +427513,7 @@ static const UV UNI_ZYYY_invlist[] = {  /* for ASCII/Latin1 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
 
 static const UV UNI_ZYYY_invlist[] = {  /* for EBCDIC 1047 */
-       322,    /* Number of elements */
+       320,    /* Number of elements */
        148565664, /* Version and data structure type */
        0,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -422452,6 +427705,8 @@ static const UV UNI_ZYYY_invlist[] = {  /* for EBCDIC 1047 */
        0x1D1AA,
        0x1D1AE,
        0x1D1EB,
+       0x1D2C0,
+       0x1D2D4,
        0x1D2E0,
        0x1D2F4,
        0x1D300,
@@ -422530,14 +427785,14 @@ static const UV UNI_ZYYY_invlist[] = {  /* for EBCDIC 1047 */
        0x1F266,
        0x1F300,
        0x1F6D8,
-       0x1F6DD,
+       0x1F6DC,
        0x1F6ED,
        0x1F6F0,
        0x1F6FD,
        0x1F700,
-       0x1F774,
-       0x1F780,
-       0x1F7D9,
+       0x1F777,
+       0x1F77B,
+       0x1F7DA,
        0x1F7E0,
        0x1F7EC,
        0x1F7F0,
@@ -422559,23 +427814,19 @@ static const UV UNI_ZYYY_invlist[] = {  /* for EBCDIC 1047 */
        0x1FA60,
        0x1FA6E,
        0x1FA70,
-       0x1FA75,
-       0x1FA78,
        0x1FA7D,
        0x1FA80,
-       0x1FA87,
+       0x1FA89,
        0x1FA90,
-       0x1FAAD,
-       0x1FAB0,
-       0x1FABB,
-       0x1FAC0,
+       0x1FABE,
+       0x1FABF,
        0x1FAC6,
-       0x1FAD0,
-       0x1FADA,
+       0x1FACE,
+       0x1FADC,
        0x1FAE0,
-       0x1FAE8,
+       0x1FAE9,
        0x1FAF0,
-       0x1FAF7,
+       0x1FAF9,
        0x1FB00,
        0x1FB93,
        0x1FB94,
@@ -422596,7 +427847,7 @@ static const UV UNI_ZYYY_invlist[] = {  /* for EBCDIC 1047 */
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
 
 static const UV UNI_ZYYY_invlist[] = {  /* for EBCDIC 037 */
-       318,    /* Number of elements */
+       316,    /* Number of elements */
        148565664, /* Version and data structure type */
        0,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -422784,6 +428035,8 @@ static const UV UNI_ZYYY_invlist[] = {  /* for EBCDIC 037 */
        0x1D1AA,
        0x1D1AE,
        0x1D1EB,
+       0x1D2C0,
+       0x1D2D4,
        0x1D2E0,
        0x1D2F4,
        0x1D300,
@@ -422862,14 +428115,14 @@ static const UV UNI_ZYYY_invlist[] = {  /* for EBCDIC 037 */
        0x1F266,
        0x1F300,
        0x1F6D8,
-       0x1F6DD,
+       0x1F6DC,
        0x1F6ED,
        0x1F6F0,
        0x1F6FD,
        0x1F700,
-       0x1F774,
-       0x1F780,
-       0x1F7D9,
+       0x1F777,
+       0x1F77B,
+       0x1F7DA,
        0x1F7E0,
        0x1F7EC,
        0x1F7F0,
@@ -422891,23 +428144,19 @@ static const UV UNI_ZYYY_invlist[] = {  /* for EBCDIC 037 */
        0x1FA60,
        0x1FA6E,
        0x1FA70,
-       0x1FA75,
-       0x1FA78,
        0x1FA7D,
        0x1FA80,
-       0x1FA87,
+       0x1FA89,
        0x1FA90,
-       0x1FAAD,
-       0x1FAB0,
-       0x1FABB,
-       0x1FAC0,
+       0x1FABE,
+       0x1FABF,
        0x1FAC6,
-       0x1FAD0,
-       0x1FADA,
+       0x1FACE,
+       0x1FADC,
        0x1FAE0,
-       0x1FAE8,
+       0x1FAE9,
        0x1FAF0,
-       0x1FAF7,
+       0x1FAF9,
        0x1FB00,
        0x1FB93,
        0x1FB94,
@@ -422923,7 +428172,7 @@ static const UV UNI_ZYYY_invlist[] = {  /* for EBCDIC 037 */
 #  endif       /* EBCDIC 037 */
 
 static const UV UNI_ZZZZ_invlist[] = {  /* for all charsets */
-       1392,   /* Number of elements */
+       1410,   /* Number of elements */
        148565664, /* Version and data structure type */
        1,      /* 0 if the list starts at 0;
                   1 if it starts at the element beyond 0 */
@@ -423170,7 +428419,7 @@ static const UV UNI_ZZZZ_invlist[] = {  /* for all charsets */
        0xCE6,
        0xCF0,
        0xCF1,
-       0xCF3,
+       0xCF4,
        0xD00,
        0xD0D,
        0xD0E,
@@ -423230,7 +428479,7 @@ static const UV UNI_ZZZZ_invlist[] = {  /* for all charsets */
        0xEC6,
        0xEC7,
        0xEC8,
-       0xECE,
+       0xECF,
        0xED0,
        0xEDA,
        0xEDC,
@@ -423771,7 +429020,7 @@ static const UV UNI_ZZZZ_invlist[] = {  /* for all charsets */
        0x10EAE,
        0x10EB0,
        0x10EB2,
-       0x10F00,
+       0x10EFD,
        0x10F28,
        0x10F30,
        0x10F5A,
@@ -423806,7 +429055,7 @@ static const UV UNI_ZZZZ_invlist[] = {  /* for all charsets */
        0x11200,
        0x11212,
        0x11213,
-       0x1123F,
+       0x11242,
        0x11280,
        0x11287,
        0x11288,
@@ -423911,6 +429160,8 @@ static const UV UNI_ZZZZ_invlist[] = {  /* for all charsets */
        0x11AA3,
        0x11AB0,
        0x11AF9,
+       0x11B00,
+       0x11B0A,
        0x11C00,
        0x11C09,
        0x11C0A,
@@ -423953,6 +429204,12 @@ static const UV UNI_ZZZZ_invlist[] = {  /* for all charsets */
        0x11DAA,
        0x11EE0,
        0x11EF9,
+       0x11F00,
+       0x11F11,
+       0x11F12,
+       0x11F3B,
+       0x11F3E,
+       0x11F5A,
        0x11FB0,
        0x11FB1,
        0x11FC0,
@@ -423968,9 +429225,7 @@ static const UV UNI_ZZZZ_invlist[] = {  /* for all charsets */
        0x12F90,
        0x12FF3,
        0x13000,
-       0x1342F,
-       0x13430,
-       0x13439,
+       0x13456,
        0x14400,
        0x14647,
        0x16800,
@@ -424023,8 +429278,12 @@ static const UV UNI_ZZZZ_invlist[] = {  /* for all charsets */
        0x1AFFF,
        0x1B000,
        0x1B123,
+       0x1B132,
+       0x1B133,
        0x1B150,
        0x1B153,
+       0x1B155,
+       0x1B156,
        0x1B164,
        0x1B168,
        0x1B170,
@@ -424053,6 +429312,8 @@ static const UV UNI_ZZZZ_invlist[] = {  /* for all charsets */
        0x1D1EB,
        0x1D200,
        0x1D246,
+       0x1D2C0,
+       0x1D2D4,
        0x1D2E0,
        0x1D2F4,
        0x1D300,
@@ -424107,6 +429368,8 @@ static const UV UNI_ZZZZ_invlist[] = {  /* for all charsets */
        0x1DAB0,
        0x1DF00,
        0x1DF1F,
+       0x1DF25,
+       0x1DF2B,
        0x1E000,
        0x1E007,
        0x1E008,
@@ -424117,6 +429380,10 @@ static const UV UNI_ZZZZ_invlist[] = {  /* for all charsets */
        0x1E025,
        0x1E026,
        0x1E02B,
+       0x1E030,
+       0x1E06E,
+       0x1E08F,
+       0x1E090,
        0x1E100,
        0x1E12D,
        0x1E130,
@@ -424131,6 +429398,8 @@ static const UV UNI_ZZZZ_invlist[] = {  /* for all charsets */
        0x1E2FA,
        0x1E2FF,
        0x1E300,
+       0x1E4D0,
+       0x1E4FA,
        0x1E7E0,
        0x1E7E7,
        0x1E7E8,
@@ -424247,14 +429516,14 @@ static const UV UNI_ZZZZ_invlist[] = {  /* for all charsets */
        0x1F266,
        0x1F300,
        0x1F6D8,
-       0x1F6DD,
+       0x1F6DC,
        0x1F6ED,
        0x1F6F0,
        0x1F6FD,
        0x1F700,
-       0x1F774,
-       0x1F780,
-       0x1F7D9,
+       0x1F777,
+       0x1F77B,
+       0x1F7DA,
        0x1F7E0,
        0x1F7EC,
        0x1F7F0,
@@ -424276,23 +429545,19 @@ static const UV UNI_ZZZZ_invlist[] = {  /* for all charsets */
        0x1FA60,
        0x1FA6E,
        0x1FA70,
-       0x1FA75,
-       0x1FA78,
        0x1FA7D,
        0x1FA80,
-       0x1FA87,
+       0x1FA89,
        0x1FA90,
-       0x1FAAD,
-       0x1FAB0,
-       0x1FABB,
-       0x1FAC0,
+       0x1FABE,
+       0x1FABF,
        0x1FAC6,
-       0x1FAD0,
-       0x1FADA,
+       0x1FACE,
+       0x1FADC,
        0x1FAE0,
-       0x1FAE8,
+       0x1FAE9,
        0x1FAF0,
-       0x1FAF7,
+       0x1FAF9,
        0x1FB00,
        0x1FB93,
        0x1FB94,
@@ -424302,7 +429567,7 @@ static const UV UNI_ZZZZ_invlist[] = {  /* for all charsets */
        0x20000,
        0x2A6E0,
        0x2A700,
-       0x2B739,
+       0x2B73A,
        0x2B740,
        0x2B81E,
        0x2B820,
@@ -424313,6 +429578,8 @@ static const UV UNI_ZZZZ_invlist[] = {  /* for all charsets */
        0x2FA1E,
        0x30000,
        0x3134B,
+       0x31350,
+       0x323B0,
        0xE0001,
        0xE0002,
        0xE0020,
@@ -424478,6 +429745,7 @@ typedef enum {
        UNI_AGE__12_DOT_1,
        UNI_AGE__13,
        UNI_AGE__14,
+       UNI_AGE__15,
        UNI_AGE__2,
        UNI_AGE__2_DOT_1,
        UNI_AGE__3,
@@ -424507,6 +429775,7 @@ typedef enum {
        UNI_ARAB,
        UNI_ARABICEXTA,
        UNI_ARABICEXTB,
+       UNI_ARABICEXTC,
        UNI_ARABICMATH,
        UNI_ARABICPFA,
        UNI_ARABICPFB,
@@ -424643,6 +429912,7 @@ typedef enum {
        UNI_CJKEXTE,
        UNI_CJKEXTF,
        UNI_CJKEXTG,
+       UNI_CJKEXTH,
        UNI_CJKRADICALSSUP,
        UNI_CJKSTROKES,
        UNI_CJKSYMBOLS,
@@ -424668,12 +429938,14 @@ typedef enum {
        UNI_CYRILLICEXTA,
        UNI_CYRILLICEXTB,
        UNI_CYRILLICEXTC,
+       UNI_CYRILLICEXTD,
        UNI_CYRILLICSUP,
        UNI_CYRL,
        UNI_DASH,
        UNI_DEP,
        UNI_DEVA,
        UNI_DEVANAGARIEXT,
+       UNI_DEVANAGARIEXTA,
        UNI_DI,
        UNI_DIA,
        UNI_DIACRITICALS,
@@ -424850,6 +430122,7 @@ typedef enum {
        UNI_INKAITHI,
        UNI_INKANNADA,
        UNI_INKATAKANA,
+       UNI_INKAWI,
        UNI_INKHAROSHTHI,
        UNI_INKHITANSMALLSCRIPT,
        UNI_INKHMER,
@@ -424880,6 +430153,7 @@ typedef enum {
        UNI_INMULTANI,
        UNI_INMYANMAR,
        UNI_INNABATAEAN,
+       UNI_INNAGMUNDARI,
        UNI_INNANDINAGARI,
        UNI_INNEWA,
        UNI_INNEWTAILUE,
@@ -424995,6 +430269,7 @@ typedef enum {
        UNI_IN__12_DOT_1,
        UNI_IN__13,
        UNI_IN__14,
+       UNI_IN__15,
        UNI_IN__1_DOT_1,
        UNI_IN__2,
        UNI_IN__2_DOT_1,
@@ -425131,6 +430406,7 @@ typedef enum {
        UNI_JT__R,
        UNI_JT__T,
        UNI_JT__U,
+       UNI_KAKTOVIKNUMERALS,
        UNI_KALI,
        UNI_KANA,
        UNI_KANAEXTA,
@@ -425139,6 +430415,7 @@ typedef enum {
        UNI_KANBUN,
        UNI_KANGXI,
        UNI_KATAKANAEXT,
+       UNI_KAWI,
        UNI_KHAR,
        UNI_KHMERSYMBOLS,
        UNI_KHMR,
@@ -425252,6 +430529,7 @@ typedef enum {
        UNI_MYANMAREXTB,
        UNI_MYMR,
        UNI_N,
+       UNI_NAGM,
        UNI_NAND,
        UNI_NARB,
        UNI_NB,
@@ -425711,6 +430989,7 @@ static const UV * const uni_prop_ptrs[] = {
        UNI_AGE__12_DOT_1_invlist,
        UNI_AGE__13_invlist,
        UNI_AGE__14_invlist,
+       UNI_AGE__15_invlist,
        UNI_AGE__2_invlist,
        UNI_AGE__2_DOT_1_invlist,
        UNI_AGE__3_invlist,
@@ -425740,6 +431019,7 @@ static const UV * const uni_prop_ptrs[] = {
        UNI_ARAB_invlist,
        UNI_ARABICEXTA_invlist,
        UNI_ARABICEXTB_invlist,
+       UNI_ARABICEXTC_invlist,
        UNI_ARABICMATH_invlist,
        UNI_ARABICPFA_invlist,
        UNI_ARABICPFB_invlist,
@@ -425876,6 +431156,7 @@ static const UV * const uni_prop_ptrs[] = {
        UNI_CJKEXTE_invlist,
        UNI_CJKEXTF_invlist,
        UNI_CJKEXTG_invlist,
+       UNI_CJKEXTH_invlist,
        UNI_CJKRADICALSSUP_invlist,
        UNI_CJKSTROKES_invlist,
        UNI_CJKSYMBOLS_invlist,
@@ -425901,12 +431182,14 @@ static const UV * const uni_prop_ptrs[] = {
        UNI_CYRILLICEXTA_invlist,
        UNI_CYRILLICEXTB_invlist,
        UNI_CYRILLICEXTC_invlist,
+       UNI_CYRILLICEXTD_invlist,
        UNI_CYRILLICSUP_invlist,
        UNI_CYRL_invlist,
        UNI_DASH_invlist,
        UNI_DEP_invlist,
        UNI_DEVA_invlist,
        UNI_DEVANAGARIEXT_invlist,
+       UNI_DEVANAGARIEXTA_invlist,
        UNI_DI_invlist,
        UNI_DIA_invlist,
        UNI_DIACRITICALS_invlist,
@@ -426083,6 +431366,7 @@ static const UV * const uni_prop_ptrs[] = {
        UNI_INKAITHI_invlist,
        UNI_INKANNADA_invlist,
        UNI_INKATAKANA_invlist,
+       UNI_INKAWI_invlist,
        UNI_INKHAROSHTHI_invlist,
        UNI_INKHITANSMALLSCRIPT_invlist,
        UNI_INKHMER_invlist,
@@ -426113,6 +431397,7 @@ static const UV * const uni_prop_ptrs[] = {
        UNI_INMULTANI_invlist,
        UNI_INMYANMAR_invlist,
        UNI_INNABATAEAN_invlist,
+       UNI_INNAGMUNDARI_invlist,
        UNI_INNANDINAGARI_invlist,
        UNI_INNEWA_invlist,
        UNI_INNEWTAILUE_invlist,
@@ -426228,6 +431513,7 @@ static const UV * const uni_prop_ptrs[] = {
        UNI_IN__12_DOT_1_invlist,
        UNI_IN__13_invlist,
        UNI_IN__14_invlist,
+       UNI_IN__15_invlist,
        UNI_IN__1_DOT_1_invlist,
        UNI_IN__2_invlist,
        UNI_IN__2_DOT_1_invlist,
@@ -426364,6 +431650,7 @@ static const UV * const uni_prop_ptrs[] = {
        UNI_JT__R_invlist,
        UNI_JT__T_invlist,
        UNI_JT__U_invlist,
+       UNI_KAKTOVIKNUMERALS_invlist,
        UNI_KALI_invlist,
        UNI_KANA_invlist,
        UNI_KANAEXTA_invlist,
@@ -426372,6 +431659,7 @@ static const UV * const uni_prop_ptrs[] = {
        UNI_KANBUN_invlist,
        UNI_KANGXI_invlist,
        UNI_KATAKANAEXT_invlist,
+       UNI_KAWI_invlist,
        UNI_KHAR_invlist,
        UNI_KHMERSYMBOLS_invlist,
        UNI_KHMR_invlist,
@@ -426485,6 +431773,7 @@ static const UV * const uni_prop_ptrs[] = {
        UNI_MYANMAREXTB_invlist,
        UNI_MYMR_invlist,
        UNI_N_invlist,
+       UNI_NAGM_invlist,
        UNI_NAND_invlist,
        UNI_NARB_invlist,
        UNI_NB_invlist,
@@ -427004,6 +432293,7 @@ static const char * const UNI_age_values[] = {
        "12.1",
        "13.0",
        "14.0",
+       "15.0",
        "NA",
        "na",
        "Unassigned",
@@ -427014,6 +432304,7 @@ static const char * const UNI_age_values[] = {
        "V12_1",
        "V13_0",
        "V14_0",
+       "V15_0",
        "V1_1",
        "V2_0",
        "V2_1",
@@ -427039,6 +432330,7 @@ static const char * const UNI_age_values[] = {
        "v121",
        "v130",
        "v140",
+       "v150",
        "v20",
        "v21",
        "v30",
@@ -427213,12 +432505,17 @@ static const char * const UNI_blk_values[] = {
        "arabicexta",
        "Arabic_Ext_B",
        "arabicextb",
+       "Arabic_Ext_C",
+       "arabicextc",
        "Arabic Extended-A",
        "Arabic_Extended_A",
        "arabicextendeda",
        "Arabic Extended-B",
        "Arabic_Extended_B",
        "arabicextendedb",
+       "Arabic Extended-C",
+       "Arabic_Extended_C",
+       "arabicextendedc",
        "Arabic_Math",
        "arabicmath",
        "Arabic Mathematical Alphabetic Symbols",
@@ -427356,6 +432653,8 @@ static const char * const UNI_blk_values[] = {
        "cjkextf",
        "CJK_Ext_G",
        "cjkextg",
+       "CJK_Ext_H",
+       "cjkexth",
        "CJK_Radicals_Sup",
        "cjkradicalssup",
        "CJK Radicals Supplement",
@@ -427393,6 +432692,9 @@ static const char * const UNI_blk_values[] = {
        "CJK Unified Ideographs Extension G",
        "CJK_Unified_Ideographs_Extension_G",
        "cjkunifiedideographsextensiong",
+       "CJK Unified Ideographs Extension H",
+       "CJK_Unified_Ideographs_Extension_H",
+       "cjkunifiedideographsextensionh",
        "Combining Diacritical Marks",
        "Combining_Diacritical_Marks",
        "combiningdiacriticalmarks",
@@ -427452,6 +432754,8 @@ static const char * const UNI_blk_values[] = {
        "cyrillicextb",
        "Cyrillic_Ext_C",
        "cyrillicextc",
+       "Cyrillic_Ext_D",
+       "cyrillicextd",
        "Cyrillic Extended-A",
        "Cyrillic_Extended_A",
        "cyrillicextendeda",
@@ -427461,6 +432765,9 @@ static const char * const UNI_blk_values[] = {
        "Cyrillic Extended-C",
        "Cyrillic_Extended_C",
        "cyrillicextendedc",
+       "Cyrillic Extended-D",
+       "Cyrillic_Extended_D",
+       "cyrillicextendedd",
        "Cyrillic_Sup",
        "cyrillicsup",
        "Cyrillic Supplement",
@@ -427474,9 +432781,14 @@ static const char * const UNI_blk_values[] = {
        "devanagari",
        "Devanagari_Ext",
        "devanagariext",
+       "Devanagari_Ext_A",
+       "devanagariexta",
        "Devanagari Extended",
        "Devanagari_Extended",
        "devanagariextended",
+       "Devanagari Extended-A",
+       "Devanagari_Extended_A",
+       "devanagariextendeda",
        "Diacriticals",
        "diacriticals",
        "Diacriticals_Ext",
@@ -427689,6 +433001,9 @@ static const char * const UNI_blk_values[] = {
        "javanese",
        "Kaithi",
        "kaithi",
+       "Kaktovik Numerals",
+       "Kaktovik_Numerals",
+       "kaktoviknumerals",
        "Kana_Ext_A",
        "kanaexta",
        "Kana_Ext_B",
@@ -427720,6 +433035,8 @@ static const char * const UNI_blk_values[] = {
        "Katakana Phonetic Extensions",
        "Katakana_Phonetic_Extensions",
        "katakanaphoneticextensions",
+       "Kawi",
+       "kawi",
        "Kayah Li",
        "Kayah_Li",
        "kayahli",
@@ -427937,6 +433254,9 @@ static const char * const UNI_blk_values[] = {
        "myanmarextendedb",
        "Nabataean",
        "nabataean",
+       "Nag Mundari",
+       "Nag_Mundari",
+       "nagmundari",
        "Nandinagari",
        "nandinagari",
        "NB",
@@ -429935,6 +435255,8 @@ static const char * const UNI_sc_values[] = {
        "kannada",
        "Katakana",
        "katakana",
+       "Kawi",
+       "kawi",
        "Kayah_Li",
        "kayahli",
        "Khar",
@@ -430063,6 +435385,10 @@ static const char * const UNI_sc_values[] = {
        "mymr",
        "Nabataean",
        "nabataean",
+       "Nagm",
+       "nagm",
+       "Nag_Mundari",
+       "nagmundari",
        "Nand",
        "nand",
        "Nandinagari",
@@ -430704,56 +436030,57 @@ static const U8 WB_table[23][23] = {
 
 /* Generated from:
  * 688d673ec947f7ccf898b4eae9848139d4d33676b688dee54f449f8bf9d3bbd2 lib/Unicode/UCD.pm
- * c7698811e9adb6cc98fb996a7de4be2b6532f2ac67e76055cc8afdbf6ee18af3 lib/unicore/ArabicShaping.txt
- * 24a74555f918bbe99f5b3f1b83cf36fc0e205bb8a600a6a3aa539c710a3dcf27 lib/unicore/BidiBrackets.txt
- * 7a5c74cedc1616a9af0a9d22e108ae592d86fe93649c144ae6ba49f193a44122 lib/unicore/BidiMirroring.txt
- * 598870dddef7b34b5a972916528c456aff2765b79cd4f9647fb58ceb767e7f17 lib/unicore/Blocks.txt
- * a566cd48687b2cd897e02501118b2413c14ae86d318f9abbbba97feb84189f0f lib/unicore/CaseFolding.txt
- * 3360762fc3295cea54ab251c31df621d05ba4b94d46c60eaac29aa16d70ad1e0 lib/unicore/CompositionExclusions.txt
- * 7e058dec02147098bc9c28d86209f0f251bba0538f3b5a705ad02ea3bb709fe0 lib/unicore/DAge.txt
- * e3eddd7d469cd1b0feed7528defad1a1cc7c6a9ceb0ae4446a6d10921ed2e7bc lib/unicore/DCoreProperties.txt
- * b2c444c20730b097787fdf50bd7d6dd3fc5256ab8084f5b35b11c8776eca674c lib/unicore/DNormalizationProps.txt
- * f901ac011aa32a09224d6555da71e2532c59c1d3381322829de0e3b880507250 lib/unicore/EastAsianWidth.txt
- * 5995522f01633073911dad1edb74d13aa832f42862c0392a79627b85d52f2391 lib/unicore/EquivalentUnifiedIdeograph.txt
- * cd1c9367cba438afa965fcb5edc6ed3ec6e685fd5dd21c0cc20c026f04beb0e5 lib/unicore/HangulSyllableType.txt
- * 3f3f368fccdb37f350ecedc20b37fa71ab31c04e847884c77780d34283539f73 lib/unicore/IdStatus.txt
- * 45a150c23961b58d7784704af6c4daccd6517d97b6489e53d13bbdbf9e4f065f lib/unicore/IdType.txt
- * d8704c8725568813a947ff2ef38bcf1f05e2a6fbea6876ba384890f187a8bf61 lib/unicore/IndicPositionalCategory.txt
- * c7b969b653dc278fb66ab4136223d320e30ad19367eb791ae60dcc6d92071b16 lib/unicore/IndicSyllabicCategory.txt
- * 39ff89e0a329e1ccce6d54fad8cf82e90926901928c0ca9b9a2ad5681f330dd9 lib/unicore/Jamo.txt
- * 9e06e9f35c6959fb91dcc7993f90d58523c3079bc62c6b25f828b4cdebc5d70c lib/unicore/LineBreak.txt
- * 14b3b677d33f95c51423dce6eef4a6a28b4b160451ecedee4b91edb6745cf4a3 lib/unicore/NameAliases.txt
- * db5745688affcdc0c3927a1ee0667018a96a7b24513f866d5235e98fef6c2436 lib/unicore/NamedSequences.txt
- * 6bddfdb850417a5bee6deff19290fd1b138589909afb50f5a049f343bf2c6722 lib/unicore/PropList.txt
- * eb755757e20b72b330b2948df3cf2ff7adb0e31bb060140dc09dafb132ace2cd lib/unicore/PropValueAliases.txt
- * 859d7225f2d2a460b3ccb1d61a7945f8cc219acdf5aa53b66b7a1e4bf6ebfc87 lib/unicore/PropertyAliases.txt
- * d37eedf63ff9c48bac863d5f76862373d6cf5269fd21253d499e2430d638c01d lib/unicore/ScriptExtensions.txt
- * 52db475c4ec445e73b0b16915448c357614946ad7062843c563e00d7535c6510 lib/unicore/Scripts.txt
- * c667b45908fd269af25fd55d2fc5bbc157fb1b77675936e25c513ce32e080334 lib/unicore/SpecialCasing.txt
- * 36018e68657fdcb3485f636630ffe8c8532e01c977703d2803f5b89d6c5feafb lib/unicore/UnicodeData.txt
- * 869ff43dd012f924d03c89fc268c88f0e7eea72f0228b91ca30455afdb84f8fd lib/unicore/VerticalOrientation.txt
- * ddc7d4d1f3838573b94fc5d83ff7217e63c47b22ae1cd40c5fe1a54efc15589b lib/unicore/auxiliary/GCBTest.txt
- * 97e79f1f8d9cd76d120f2420381a01abc00a7c78a2aa583fa3f9627264a99742 lib/unicore/auxiliary/GraphemeBreakProperty.txt
- * 488dbb6a7e1d0070d4aa7c175352c818ff6425172850d1b40c6177726658cb05 lib/unicore/auxiliary/LBTest.txt
- * 7e42dd749dbb94aa44b13faf9df6319d9a16ce2ea09a3a094fcfbb5962168040 lib/unicore/auxiliary/SBTest.txt
- * 7092ca4117cec891c25c7724132efc519e1dece01ae9fd6068035a9db04d526e lib/unicore/auxiliary/SentenceBreakProperty.txt
- * 8094b544ec1580c7e41ac0187805cc1aeb330a90301ec7505563e1a59318284e lib/unicore/auxiliary/WBTest.txt
- * 7716752aad296d4ab23ff4ed0a2746fc5328750ff84e9e7d6f3828ee9eaef742 lib/unicore/auxiliary/WordBreakProperty.txt
- * b597836124298b8f7fa076273802840cfc3271a25f5c397a082e120954b82c3c lib/unicore/emoji/emoji.txt
- * e5fe51acc74e3e83b4fb4c7b25f3c34491d6eb8095c9955d0712dafbca7b3c2b lib/unicore/extracted/DBidiClass.txt
- * cd0a14176d93bf440b77a582a0d678190fc0688b15442d4cfb250bf2e27956af lib/unicore/extracted/DBinaryProperties.txt
- * 12b0c3af9b600b49488d66545a3e7844ea980809627201bf9afeebe1c9f16f4e lib/unicore/extracted/DCombiningClass.txt
- * f76064b298cfbd715ba542e7894f7a507d32da2f011070d1d01df95cad9817d6 lib/unicore/extracted/DDecompositionType.txt
- * f9bef074cc916db57fece99d54a4505f8e7c7b17481619e3f0005211f7717d4b lib/unicore/extracted/DEastAsianWidth.txt
- * cde679c8461976ed40d7edf61ae98cbb947540831f06f5bc7da7decbf91a1420 lib/unicore/extracted/DGeneralCategory.txt
- * 9bb891831328713603a486a4a03df7f7987c3e1e8144a6d1ac71fd061ef3f732 lib/unicore/extracted/DJoinGroup.txt
- * e97c65bbea0a69d2fae6ec4182b09e519e13232e20bd804b3004edc0f36bb0d4 lib/unicore/extracted/DJoinType.txt
- * 43f6df50e4878f501b417e366b0ee097ae5ccb2d4ce942026bed3d62d78e7887 lib/unicore/extracted/DLineBreak.txt
- * a04502ebb36a45d83cbe48a7d8132ea8143edb7b3d34d0aa6afe4a9685049741 lib/unicore/extracted/DNumType.txt
- * 11075771b112e8e7ccf6ffa637c4c91eadc3ef3db0517b24e605df8fd3624239 lib/unicore/extracted/DNumValues.txt
- * 1e514199c3fa46f5df6148d272db7bddbfd5e89c9710e39773ef9d734f344a2f lib/unicore/mktables
- * c72bbdeda99714db1c8024d3311da4aef3c0db3b9b9f11455a7cfe10d5e9aba3 lib/unicore/version
+ * eb840f36e0a7446293578c684a54c6d83d249abde7bdd4dfa89794af1d7fe9e9 lib/unicore/ArabicShaping.txt
+ * 333ae1e99db0504ca8a046a07dc45b5e7aa91869c685e6bf955ebe674804827a lib/unicore/BidiBrackets.txt
+ * b4b9e1d87d8ea273613880de9d2b2f0b0b696244b42152bfa0a3106e7d983a20 lib/unicore/BidiMirroring.txt
+ * 529dc5d0f6386d52f2f56e004bbfab48ce2d587eea9d38ba546c4052491bd820 lib/unicore/Blocks.txt
+ * cdd49e55eae3bbf1f0a3f6580c974a0263cb86a6a08daa10fbf705b4808a56f7 lib/unicore/CaseFolding.txt
+ * 3b019c0a33c3140cbc920c078f4f9af2680ba4f71869c8d4de5190667c70b6a3 lib/unicore/CompositionExclusions.txt
+ * 7570877e0fa197c45338f7c41a02636da4e14c8dba6a3611a01cd30bf329d5ca lib/unicore/DAge.txt
+ * d367290bc0867e6b484c68370530bdd1a08b6b32404601b8c7accaf83e05628d lib/unicore/DCoreProperties.txt
+ * d5687a48c95c7d6e1ec59cb29c0f2e8b052018eb069a4371b7368d0561e12a29 lib/unicore/DNormalizationProps.txt
+ * 743e7bc435c04ab1a8459710b1c3cad56eedced5b806b4659b6e69b85d0adf2a lib/unicore/EastAsianWidth.txt
+ * f2e04bae8c856fad3a16353a99d4cc2de6c72770260379f5e4974a97548aad2a lib/unicore/EquivalentUnifiedIdeograph.txt
+ * 9a3ab36d36a22bdb84de7a17b17e9b9c242134f0080f0a8b4b28d209465a8fc8 lib/unicore/HangulSyllableType.txt
+ * 790bc9595795c0e0a3860a21a7f97157a134b61a4fc4ab03c7d315d07c9a6eb7 lib/unicore/IdStatus.txt
+ * 71d3ed8f15cd5d8cd00cdebe62015ff26356462774b261b4a2b83d3bf46b1639 lib/unicore/IdType.txt
+ * 0ce56c1294da405c0a0a0071582ac839fd229bbf97bdd260462ee571309d4ec4 lib/unicore/IndicPositionalCategory.txt
+ * ffae561a51b47ddbbe267fdd8505ac3776b85b2932268809127acee84200b573 lib/unicore/IndicSyllabicCategory.txt
+ * 14733bcb6731ae0c07485bf59a41cb3db08785a50bd2b46b836b4341eab7ee46 lib/unicore/Jamo.txt
+ * 012bca868e2c4e59a5a10a7546baf0c6fb1b2ef458c277f054915c8a49d292bf lib/unicore/LineBreak.txt
+ * 3e39509e8fae3e5d50ba73759d0b97194501d14a9c63107a6372a46b38be18e8 lib/unicore/NameAliases.txt
+ * 1d5202155f14841973aa540b1625f4befbde185ac77ce5aceaaaa0501a68bd66 lib/unicore/NamedSequences.txt
+ * fb9ac8cc154a80cad6caac9897af55a4e75176af6f4e2bb6edc2bf8b1d57f326 lib/unicore/NormTest.txt
+ * e05c0a2811d113dae4abd832884199a3ea8d187ee1b872d8240a788a96540bfd lib/unicore/PropList.txt
+ * 13a7666843abea5c6b7eb8c057c57ab9bb2ba96cfc936e204224dd67d71cafad lib/unicore/PropValueAliases.txt
+ * e4935149af407fa455901832b710bccb63d2453e46d09190e234d019bcfbba45 lib/unicore/PropertyAliases.txt
+ * 7e07313d9d0bee42220c476b64485995130ae30917bbcf7780b602d677d7e33f lib/unicore/ScriptExtensions.txt
+ * cca85d830f46aece2e7c1459ef1249993dca8f2e46d51e869255be140d7ea4b0 lib/unicore/Scripts.txt
+ * 78b29c64b5840d25c11a9f31b665ee551b8a499eca6c70d770fcad7dd710f494 lib/unicore/SpecialCasing.txt
+ * 806e9aed65037197f1ec85e12be6e8cd870fc5608b4de0fffd990f689f376a73 lib/unicore/UnicodeData.txt
+ * ca6d332f485a6f5f452b29b4a74146af0f2c17b7577aa4c821d597210f70611a lib/unicore/VerticalOrientation.txt
+ * 0d2080d0def294a4b7660801cc03ddfe5866ff300c789c2cc1b50fd7802b2d97 lib/unicore/auxiliary/GCBTest.txt
+ * 5a0f8748575432f8ff95e1dd5bfaa27bda1a844809e17d6939ee912bba6568a1 lib/unicore/auxiliary/GraphemeBreakProperty.txt
+ * 371bde4052aa593b108684ae292d8ea2dbb93c19990e0cdf416fa7239557aac3 lib/unicore/auxiliary/LBTest.txt
+ * f62279d8fd10935ba0cf0d8417a1dcbe7ab0d4e62f59c17e02cbe40f580c4162 lib/unicore/auxiliary/SBTest.txt
+ * 61e4ba975b0a5bc1a76ee931b94914395d7289ef624e3c0d4d6b9460ee387bea lib/unicore/auxiliary/SentenceBreakProperty.txt
+ * 2a676130c71194245e7c74a837e58330f202600d8ddcf4518129dd476f26e18e lib/unicore/auxiliary/WBTest.txt
+ * 5188a56e91593467c2e912601ebc78750e6adc9b04541b8c5becb5441e388ce2 lib/unicore/auxiliary/WordBreakProperty.txt
+ * 29071dba22c72c27783a73016afb8ffaeb025866740791f9c2d0b55cc45a3470 lib/unicore/emoji/emoji.txt
+ * 4841f2090c2dbc592d3ce43bb74c2191b3da50fb9a0d00274f1448c202851b02 lib/unicore/extracted/DBidiClass.txt
+ * f10a35451429137f7348825f22d624b6390c526ead3d8e756d2af9e5ed5b2b67 lib/unicore/extracted/DBinaryProperties.txt
+ * ca54f6360cd288ad92113415bf1f77749015abe11cbd6798d21f7fa81f04205d lib/unicore/extracted/DCombiningClass.txt
+ * db059ce45e3cec49bfda56e262fa658b3a5561b1648de266c818d2a08a85b78a lib/unicore/extracted/DDecompositionType.txt
+ * d62e6950f086e53f47c593a38342621f8838f48c49a1de070cf83d3959bd1688 lib/unicore/extracted/DEastAsianWidth.txt
+ * fe29a45c0882500e591140aaa5c4f5067e6a5d746806148af34400c48b9c06f9 lib/unicore/extracted/DGeneralCategory.txt
+ * e13ca1344b16023aa38c6ada39f9658536fc6bb7c3c24d579f0bc316a4f4f1e0 lib/unicore/extracted/DJoinGroup.txt
+ * c4870b11e2b8b7d0eb70b99ce85608e5c28a399efa316cca97238a58ae160e5e lib/unicore/extracted/DJoinType.txt
+ * 3f4f32ed2a577344a508114527e721d7a8b633d32f38945d47fe0c743650c585 lib/unicore/extracted/DLineBreak.txt
+ * 710abf2d581ac9c57f244c0834f9d9969d9781e0396adccd330eaae658ac7d6b lib/unicore/extracted/DNumType.txt
+ * 6bd30f385f3baf3ab5d5308c111a81de87bea5f494ba0ba69e8ab45263b8c34d lib/unicore/extracted/DNumValues.txt
+ * f7265069b38ba9a0675a18600e241b1ec6fc8c55fd806fe4c13bc5d8cb0dc508 lib/unicore/mktables
+ * 55d90fdc3f902e5c0b16b3378f9eaa36e970a1c09723c33de7d47d0370044012 lib/unicore/version
  * 0a6b5ab33bb1026531f816efe81aea1a8ffcd34a27cbea37dd6a70a63d73c844 regen/charset_translations.pl
- * 5f8520d3a17ade6317fc0c423f5091470924b1ef425bca0c41ce8e4a9f8460fe regen/mk_PL_charclass.pl
- * 1c73795f9150bd556573e7ae982789377289e22b6a7f3db0a05c36852e8d749f regen/mk_invlists.pl
- * ex: set ro: */
+ * c7ff8e0d207d3538c7feb4a1a152b159e5e902d20293b303569ea8323e84633e regen/mk_PL_charclass.pl
+ * cdbafee25193032242e77f2a6332b731d8392ce342fa616dbabc2c14c7b44eb6 regen/mk_invlists.pl
+ * ex: set ro ft=c: */
index b817483..5880dc5 100644 (file)
@@ -32,7 +32,7 @@ case "$CONFIG_H" in
 already-done) echo "Not re-extracting config.h" ;;
 *)
 echo "Extracting $CONFIG_H (with variable substitutions)"
-sed <<!GROK!THIS! >$CONFIG_H -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-def!#undef!'
+sed <<!GROK!THIS! >$CONFIG_H -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-def!#undef!' -e's!define\t!define !'
 /* This file was produced by running the config_h.SH script, which
  * gets its values from $CONFIG_SH, which is generally produced by
  * running Configure.
@@ -1495,6 +1495,10 @@ sed <<!GROK!THIS! >$CONFIG_H -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un
  *     Can we handle GCC attribute for functions that should always be
  *     inlined.
  */
+/* HASATTRIBUTE_VISIBILITY:
+ *     Can we handle GCC attribute for functions that should have a
+ *     different visibility.
+ */
 #$d_attribute_deprecated HASATTRIBUTE_DEPRECATED       /**/
 #$d_attribute_format HASATTRIBUTE_FORMAT       /**/
 #$d_printf_format_null PRINTF_FORMAT_NULL_OK   /**/
@@ -1505,6 +1509,7 @@ sed <<!GROK!THIS! >$CONFIG_H -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un
 #$d_attribute_unused HASATTRIBUTE_UNUSED       /**/
 #$d_attribute_warn_unused_result HASATTRIBUTE_WARN_UNUSED_RESULT       /**/
 #$d_attribute_always_inline HASATTRIBUTE_ALWAYS_INLINE /**/
+#$d_attribute_visibility HASATTRIBUTE_VISIBILITY       /**/
 
 /* HAS_BACKTRACE:
  *     This symbol, if defined, indicates that the backtrace() routine is
@@ -2281,7 +2286,7 @@ sed <<!GROK!THIS! >$CONFIG_H -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un
  */
 #ifndef USE_CROSS_COMPILE
 #$usecrosscompile      USE_CROSS_COMPILE       /**/
-#define        PERL_TARGETARCH "$targetarch"   /**/
+#define PERL_TARGETARCH        "$targetarch"   /**/
 #endif
 
 /* PERL_USE_DEVEL:
@@ -2434,7 +2439,7 @@ sed <<!GROK!THIS! >$CONFIG_H -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un
 #$d_dbminitproto       HAS_DBMINIT_PROTO       /**/
 
 /* HAS_DIR_DD_FD:
- *     This symbol, if defined, indicates that the the DIR* dirstream
+ *     This symbol, if defined, indicates that the DIR* dirstream
  *     structure contains a member variable named dd_fd.
  */
 #$d_dir_dd_fd HAS_DIR_DD_FD            /**/
@@ -3294,6 +3299,12 @@ sed <<!GROK!THIS! >$CONFIG_H -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un
  */
 #$d_sendmsg HAS_SENDMSG                /**/
 
+/* HAS_SETENV:
+ *     This symbol, if defined, indicates that the setenv routine is
+ *     available for use.
+ */
+#$d_setenv HAS_SETENV          /**/
+
 /* HAS_SETITIMER:
  *     This symbol, if defined, indicates that the setitimer routine is
  *     available to set interval timers.
@@ -3618,7 +3629,7 @@ sed <<!GROK!THIS! >$CONFIG_H -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un
 
 /* HAS_WCSXFRM:
  *     This symbol, if defined, indicates that the wcsxfrm routine is
- *     available to tranform a wide character string for wcscmp().
+ *     available to transform a wide character string for wcscmp().
  */
 #$d_wcsxfrm HAS_WCSXFRM        /**/
 
@@ -3835,6 +3846,11 @@ sed <<!GROK!THIS! >$CONFIG_H -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un
  */
 #$i_sysstatvfs I_SYS_STATVFS           /**/
 
+/* I_SYS_SYSCALL:
+ *     This symbol, if defined, indicates that <sys/syscall.h> exists.
+ */
+#$i_syssyscall I_SYS_SYSCALL           /**/
+
 /* I_SYSUTSNAME:
  *     This symbol, if defined, indicates that <sys/utsname.h> exists and
  *     should be included.
@@ -4015,6 +4031,32 @@ sed <<!GROK!THIS! >$CONFIG_H -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un
  */
 #$need_va_copy NEED_VA_COPY            /**/
 
+/* I32df:
+ *     This symbol defines the format string used for printing a Perl I32
+ *     as a signed decimal integer.
+ */
+/* U32uf:
+ *     This symbol defines the format string used for printing a Perl U32
+ *     as an unsigned decimal integer.
+ */
+/* U32of:
+ *     This symbol defines the format string used for printing a Perl U32
+ *     as an unsigned octal integer.
+ */
+/* U32xf:
+ *     This symbol defines the format string used for printing a Perl U32
+ *     as an unsigned hexadecimal integer in lowercase abcdef.
+ */
+/* U32Xf:
+ *     This symbol defines the format string used for printing a Perl U32
+ *     as an unsigned hexadecimal integer in uppercase ABCDEF.
+ */
+#define I32df          $i32dformat             /**/
+#define U32of          $u32oformat             /**/
+#define U32uf          $u32uformat             /**/
+#define U32xf          $u32xformat             /**/
+#define U32Xf          $u32XUformat            /**/
+
 /* IVTYPE:
  *     This symbol defines the C type used for Perl's IV.
  */
@@ -4104,35 +4146,35 @@ sed <<!GROK!THIS! >$CONFIG_H -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un
  *     This symbol, if defined, indicates that a variable of type NVTYPE
  *     stores 0.0 in memory as all bits zero.
  */
-#define        IVTYPE          $ivtype         /**/
-#define        UVTYPE          $uvtype         /**/
-#define        I8TYPE          $i8type         /**/
-#define        U8TYPE          $u8type         /**/
-#define        I16TYPE         $i16type        /**/
-#define        U16TYPE         $u16type        /**/
-#define        I32TYPE         $i32type        /**/
-#define        U32TYPE         $u32type        /**/
+#define IVTYPE         $ivtype         /**/
+#define UVTYPE         $uvtype         /**/
+#define I8TYPE         $i8type         /**/
+#define U8TYPE         $u8type         /**/
+#define I16TYPE                $i16type        /**/
+#define U16TYPE                $u16type        /**/
+#define I32TYPE                $i32type        /**/
+#define U32TYPE                $u32type        /**/
 #ifdef HAS_QUAD
-#define        I64TYPE         $i64type        /**/
-#define        U64TYPE         $u64type        /**/
+#define I64TYPE                $i64type        /**/
+#define U64TYPE                $u64type        /**/
 #endif
-#define        NVTYPE          $nvtype         /**/
-#define        IVSIZE          $ivsize         /**/
-#define        UVSIZE          $uvsize         /**/
-#define        I8SIZE          $i8size         /**/
-#define        U8SIZE          $u8size         /**/
-#define        I16SIZE         $i16size        /**/
-#define        U16SIZE         $u16size        /**/
-#define        I32SIZE         $i32size        /**/
-#define        U32SIZE         $u32size        /**/
+#define NVTYPE         $nvtype         /**/
+#define IVSIZE         $ivsize         /**/
+#define UVSIZE         $uvsize         /**/
+#define I8SIZE         $i8size         /**/
+#define U8SIZE         $u8size         /**/
+#define I16SIZE                $i16size        /**/
+#define U16SIZE                $u16size        /**/
+#define I32SIZE                $i32size        /**/
+#define U32SIZE                $u32size        /**/
 #ifdef HAS_QUAD
-#define        I64SIZE         $i64size        /**/
-#define        U64SIZE         $u64size        /**/
+#define I64SIZE                $i64size        /**/
+#define U64SIZE                $u64size        /**/
 #endif
-#define        NVSIZE          $nvsize         /**/
+#define NVSIZE         $nvsize         /**/
 #$d_nv_preserves_uv    NV_PRESERVES_UV
-#define        NV_PRESERVES_UV_BITS    $nv_preserves_uv_bits
-#define        NV_OVERFLOWS_INTEGERS_AT        ($nv_overflows_integers_at)
+#define NV_PRESERVES_UV_BITS   $nv_preserves_uv_bits
+#define NV_OVERFLOWS_INTEGERS_AT       ($nv_overflows_integers_at)
 #$d_nv_zero_is_allbits_zero    NV_ZERO_IS_ALLBITS_ZERO
 #if UVSIZE == 8
 #   ifdef BYTEORDER
@@ -4180,14 +4222,14 @@ sed <<!GROK!THIS! >$CONFIG_H -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un
  *     This symbol defines the format string used for printing a Perl NV
  *     using %g-ish floating point format.
  */
-#define        IVdf            $ivdformat              /**/
-#define        UVuf            $uvuformat              /**/
-#define        UVof            $uvoformat              /**/
-#define        UVxf            $uvxformat              /**/
-#define        UVXf            $uvXUformat             /**/
-#define        NVef            $nveformat              /**/
-#define        NVff            $nvfformat              /**/
-#define        NVgf            $nvgformat              /**/
+#define IVdf           $ivdformat              /**/
+#define UVuf           $uvuformat              /**/
+#define UVof           $uvoformat              /**/
+#define UVxf           $uvxformat              /**/
+#define UVXf           $uvXUformat             /**/
+#define NVef           $nveformat              /**/
+#define NVff           $nvfformat              /**/
+#define NVgf           $nvgformat              /**/
 
 /* SELECT_MIN_BITS:
  *     This symbol holds the minimum number of bits operated by select.
@@ -5284,7 +5326,7 @@ sed <<!GROK!THIS! >$CONFIG_H -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un
 /* Gid_t_f:
  *     This symbol defines the format string used for printing a Gid_t.
  */
-#define        Gid_t_f         $gidformat              /**/
+#define Gid_t_f                $gidformat              /**/
 
 /* Gid_t_sign:
  *     This symbol holds the signedness of a Gid_t.
@@ -5352,7 +5394,7 @@ sed <<!GROK!THIS! >$CONFIG_H -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un
 /* Uid_t_f:
  *     This symbol defines the format string used for printing a Uid_t.
  */
-#define        Uid_t_f         $uidformat              /**/
+#define Uid_t_f                $uidformat              /**/
 
 /* Uid_t_sign:
  *     This symbol holds the signedness of a Uid_t.
index 34bf185..07219d8 100644 (file)
@@ -1,4 +1,5 @@
 #!./miniperl -w
+# vim: syntax=perl
 #
 # configpm
 #
 # this case, since for example an extension makefile that has a dependency
 # on Config.pm should trigger even if only Config_heavy.pl has changed.
 
-sub usage { die <<EOF }
-usage: $0  [ options ]
-    --no-glossary       don't include Porting/Glossary in lib/Config.pod
-    --chdir=dir         change directory before writing files
+sub uncomment($) { 
+    return $_[0]=~s/^#(?:    )?//mgr;
+}
+
+sub usage { die uncomment <<EOF }
+#    usage: $0  [ options ]
+#        --no-glossary       don't include Porting/Glossary in lib/Config.pod
+#        --chdir=dir         change directory before writing files
 EOF
 
 use strict;
@@ -135,74 +140,74 @@ die "Can't automatically determine name for Config_heavy.pl from '$Config_PM'"
 my $config_txt;
 my $heavy_txt;
 
-my $export_funcs = <<'EOT';
-my %Export_Cache = (myconfig => 1, config_sh => 1, config_vars => 1,
-                   config_re => 1, compile_date => 1, local_patches => 1,
-                   bincompat_options => 1, non_bincompat_options => 1,
-                   header_files => 1);
+my $export_funcs = uncomment <<'EOT';
+#    my %Export_Cache = (myconfig => 1, config_sh => 1, config_vars => 1,
+#                        config_re => 1, compile_date => 1, local_patches => 1,
+#                        bincompat_options => 1, non_bincompat_options => 1,
+#                        header_files => 1);
 EOT
 
 my %export_ok = eval $export_funcs or die;
 
-$config_txt .= sprintf << 'EOT', $], $export_funcs;
-# This file was created by configpm when Perl was built. Any changes
-# made to this file will be lost the next time perl is built.
-
-# for a description of the variables, please have a look at the
-# Glossary file, as written in the Porting folder, or use the url:
-# https://github.com/Perl/perl5/blob/blead/Porting/Glossary
-
-package Config;
-use strict;
-use warnings;
-our ( %%Config, $VERSION );
-
-$VERSION = "%s";
-
-# Skip @Config::EXPORT because it only contains %%Config, which we special
-# case below as it's not a function. @Config::EXPORT won't change in the
-# lifetime of Perl 5.
-%s
-@Config::EXPORT = qw(%%Config);
-@Config::EXPORT_OK = keys %%Export_Cache;
-
-# Need to stub all the functions to make code such as print Config::config_sh
-# keep working
-
+$config_txt .= sprintf uncomment << 'EOT', $], $export_funcs;
+#    # This file was created by configpm when Perl was built. Any changes
+#    # made to this file will be lost the next time perl is built.
+#
+#    # for a description of the variables, please have a look at the
+#    # Glossary file, as written in the Porting folder, or use the url:
+#    # https://github.com/Perl/perl5/blob/blead/Porting/Glossary
+#
+#    package Config;
+#    use strict;
+#    use warnings;
+#    our ( %%Config, $VERSION );
+#
+#    $VERSION = "%s";
+#
+#    # Skip @Config::EXPORT because it only contains %%Config, which we special
+#    # case below as it's not a function. @Config::EXPORT won't change in the
+#    # lifetime of Perl 5.
+#    %s
+#    @Config::EXPORT = qw(%%Config);
+#    @Config::EXPORT_OK = keys %%Export_Cache;
+#
+#    # Need to stub all the functions to make code such as print Config::config_sh
+#    # keep working
+#
 EOT
 
 $config_txt .= "sub $_;\n" foreach sort keys %export_ok;
 
 my $myver = sprintf "%vd", $^V;
 
-$config_txt .= sprintf <<'ENDOFBEG', ($myver) x 3;
-
-# Define our own import method to avoid pulling in the full Exporter:
-sub import {
-    shift;
-    @_ = @Config::EXPORT unless @_;
-
-    my @funcs = grep $_ ne '%%Config', @_;
-    my $export_Config = @funcs < @_ ? 1 : 0;
-
-    no strict 'refs';
-    my $callpkg = caller(0);
-    foreach my $func (@funcs) {
-       die qq{"$func" is not exported by the Config module\n}
-           unless $Export_Cache{$func};
-       *{$callpkg.'::'.$func} = \&{$func};
-    }
-
-    *{"$callpkg\::Config"} = \%%Config if $export_Config;
-    return;
-}
-
-die "$0: Perl lib version (%s) doesn't match executable '$^X' version ($])"
-    unless $^V;
-
-$^V eq %s
-    or die sprintf "%%s: Perl lib version (%s) doesn't match executable '$^X' version (%%vd)", $0, $^V;
-
+$config_txt .= sprintf uncomment <<'ENDOFBEG', ($myver) x 3;
+#
+#    # Define our own import method to avoid pulling in the full Exporter:
+#    sub import {
+#        shift;
+#        @_ = @Config::EXPORT unless @_;
+#
+#        my @funcs = grep $_ ne '%%Config', @_;
+#        my $export_Config = @funcs < @_ ? 1 : 0;
+#
+#        no strict 'refs';
+#        my $callpkg = caller(0);
+#        foreach my $func (@funcs) {
+#            die qq{"$func" is not exported by the Config module\n}
+#                unless $Export_Cache{$func};
+#            *{$callpkg.'::'.$func} = \&{$func};
+#        }
+#
+#        *{"$callpkg\::Config"} = \%%Config if $export_Config;
+#        return;
+#    }
+#
+#    die "$0: Perl lib version (%s) doesn't match executable '$^X' version ($])"
+#        unless $^V;
+#
+#    $^V eq %s
+#        or die sprintf "%%s: Perl lib version (%s) doesn't match executable '$^X' version (%%vd)", $0, $^V;
+#
 ENDOFBEG
 
 
@@ -217,12 +222,12 @@ my $quote;
 # (at least up to version 804.034) fails to build without them. We force them
 # to be emitted to Config_heavy.pl for backcompat with such modules (and we may
 # find that this set needs to be extended in future). See RT#132347.
-my @v_forced = map "$_\n", split /\n+/, <<'EOT';
-i_limits='define'
-i_stdlib='define'
-i_string='define'
-i_time='define'
-prototype='define'
+my @v_forced = map "$_\n", split /\n+/, uncomment <<'EOT';
+#    i_limits='define'
+#    i_stdlib='define'
+#    i_string='define'
+#    i_time='define'
+#    prototype='define'
 EOT
 
 
@@ -282,47 +287,47 @@ my %seen_quotes;
 # This is somewhat grim, but I want the code for parsing config.sh here and
 # now so that I can expand $Config{ivsize} and $Config{ivtype}
 
-my $fetch_string = <<'EOT';
-
-# Search for it in the big string
-sub fetch_string {
-    my($self, $key) = @_;
-
+my $fetch_string = uncomment <<'EOT';
+#
+#    # Search for it in the big string
+#    sub fetch_string {
+#        my($self, $key) = @_;
+#
 EOT
 
 if ($seen_quotes{'"'}) {
     # We need the full ' and " code
 
-$fetch_string .= <<'EOT';
-    return undef unless my ($quote_type, $value) = $Config_SH_expanded =~ /\n$key=(['"])(.*?)\1\n/s;
-
-    # If we had a double-quote, we'd better eval it so escape
-    # sequences and such can be interpolated. Since the incoming
-    # value is supposed to follow shell rules and not perl rules,
-    # we escape any perl variable markers
-
-    # Historically, since " 'support' was added in change 1409, the
-    # interpolation was done before the undef. Stick to this arguably buggy
-    # behaviour as we're refactoring.
-    if ($quote_type eq '"') {
-       $value =~ s/\$/\\\$/g;
-       $value =~ s/\@/\\\@/g;
-       eval "\$value = \"$value\"";
-    }
-
-    # So we can say "if $Config{'foo'}".
-    $self->{$key} = $value eq 'undef' ? undef : $value; # cache it
-}
+$fetch_string .= uncomment <<'EOT';
+#        return undef unless my ($quote_type, $value) = $Config_SH_expanded =~ /\n$key=(['"])(.*?)\1\n/s;
+#
+#        # If we had a double-quote, we'd better eval it so escape
+#        # sequences and such can be interpolated. Since the incoming
+#        # value is supposed to follow shell rules and not perl rules,
+#        # we escape any perl variable markers
+#
+#        # Historically, since " 'support' was added in change 1409, the
+#        # interpolation was done before the undef. Stick to this arguably buggy
+#        # behaviour as we're refactoring.
+#        if ($quote_type eq '"') {
+#            $value =~ s/\$/\\\$/g;
+#            $value =~ s/\@/\\\@/g;
+#            eval "\$value = \"$value\"";
+#        }
+#
+#        # So we can say "if $Config{'foo'}".
+#        $self->{$key} = $value eq 'undef' ? undef : $value; # cache it
+#    }
 EOT
 
 } else {
     # We only have ' delimited.
 
-$fetch_string .= <<'EOT';
-    return undef unless $Config_SH_expanded =~ /\n$key=\'(.*?)\'\n/s;
-    # So we can say "if $Config{'foo'}".
-    $self->{$key} = $1 eq 'undef' ? undef : $1;
-}
+$fetch_string .= uncomment <<'EOT';
+#        return undef unless $Config_SH_expanded =~ /\n$key=\'(.*?)\'\n/s;
+#        # So we can say "if $Config{'foo'}".
+#        $self->{$key} = $1 eq 'undef' ? undef : $1;
+#    }
 EOT
 
 }
@@ -429,32 +434,32 @@ if (fetch_string({}, 'otherlibdirs') =~ m!\.\.\./!) {
     $need_relocation{otherlibdirs} = 'otherlibdirs';
 }
 
-my $relocation_code = <<'EOT';
-
-sub relocate_inc {
-  my $libdir = shift;
-  return $libdir unless $libdir =~ s!^\.\.\./!!;
-  my $prefix = $^X;
-  if ($prefix =~ s!/[^/]*$!!) {
-    while ($libdir =~ m!^\.\./!) {
-      # Loop while $libdir starts "../" and $prefix still has a trailing
-      # directory
-      last unless $prefix =~ s!/([^/]+)$!!;
-      # but bail out if the directory we picked off the end of $prefix is .
-      # or ..
-      if ($1 eq '.' or $1 eq '..') {
-       # Undo! This should be rare, hence code it this way rather than a
-       # check each time before the s!!! above.
-       $prefix = "$prefix/$1";
-       last;
-      }
-      # Remove that leading ../ and loop again
-      substr ($libdir, 0, 3, '');
-    }
-    $libdir = "$prefix/$libdir";
-  }
-  $libdir;
-}
+my $relocation_code = uncomment <<'EOT';
+#
+#    sub relocate_inc {
+#      my $libdir = shift;
+#      return $libdir unless $libdir =~ s!^\.\.\./!!;
+#      my $prefix = $^X;
+#      if ($prefix =~ s!/[^/]*$!!) {
+#        while ($libdir =~ m!^\.\./!) {
+#          # Loop while $libdir starts "../" and $prefix still has a trailing
+#          # directory
+#          last unless $prefix =~ s!/([^/]+)$!!;
+#          # but bail out if the directory we picked off the end of $prefix is .
+#          # or ..
+#          if ($1 eq '.' or $1 eq '..') {
+#            # Undo! This should be rare, hence code it this way rather than a
+#            # check each time before the s!!! above.
+#            $prefix = "$prefix/$1";
+#            last;
+#          }
+#          # Remove that leading ../ and loop again
+#          substr ($libdir, 0, 3, '');
+#        }
+#        $libdir = "$prefix/$libdir";
+#      }
+#      $libdir;
+#    }
 EOT
 
 my $osname = fetch_string({}, 'osname');
@@ -462,66 +467,66 @@ my $from = $osname eq 'VMS' ? 'PERLSHR image' : 'binary (from libperl)';
 my $env_cygwin = $osname eq 'cygwin'
     ? 'push @env, "CYGWIN=\"$ENV{CYGWIN}\"" if $ENV{CYGWIN};' . "\n" : "";
 
-$heavy_txt .= sprintf <<'ENDOFBEG', $osname, $osname, $from, $osname, $env_cygwin;
-# This file was created by configpm when Perl was built. Any changes
-# made to this file will be lost the next time perl is built.
-
-package Config;
-use strict;
-use warnings;
-our %%Config;
-
-sub bincompat_options {
-    return split ' ', (Internals::V())[0];
-}
-
-sub non_bincompat_options {
-    return split ' ', (Internals::V())[1];
-}
-
-sub compile_date {
-    return (Internals::V())[2]
-}
-
-sub local_patches {
-    my (undef, undef, undef, @patches) = Internals::V();
-    return @patches;
-}
-
-sub _V {
-    die "Perl lib was built for '%s' but is being run on '$^O'"
-        unless "%s" eq $^O;
-
-    my ($bincompat, $non_bincompat, $date, @patches) = Internals::V();
-
-    my @opts = sort split ' ', "$bincompat $non_bincompat";
-
-    print Config::myconfig();
-    print "\nCharacteristics of this %s: \n";
-
-    print "  Compile-time options:\n";
-    print "    $_\n" for @opts;
-
-    if (@patches) {
-        print "  Locally applied patches:\n";
-        print "    $_\n" foreach @patches;
-    }
-
-    print "  Built under %s\n";
-
-    print "  $date\n" if defined $date;
-
-    my @env = map { "$_=\"$ENV{$_}\"" } sort grep {/^PERL/} keys %%ENV;
-%s
-    if (@env) {
-        print "  \%%ENV:\n";
-        print "    $_\n" foreach @env;
-    }
-    print "  \@INC:\n";
-    print "    $_\n" foreach @INC;
-}
-
-sub header_files {
+$heavy_txt .= sprintf uncomment <<'ENDOFBEG', $osname, $osname, $from, $osname, $env_cygwin;
+#    # This file was created by configpm when Perl was built. Any changes
+#    # made to this file will be lost the next time perl is built.
+#
+#    package Config;
+#    use strict;
+#    use warnings;
+#    our %%Config;
+#
+#    sub bincompat_options {
+#        return split ' ', (Internals::V())[0];
+#    }
+#
+#    sub non_bincompat_options {
+#        return split ' ', (Internals::V())[1];
+#    }
+#
+#    sub compile_date {
+#        return (Internals::V())[2]
+#    }
+#
+#    sub local_patches {
+#        my (undef, undef, undef, @patches) = Internals::V();
+#        return @patches;
+#    }
+#
+#    sub _V {
+#        die "Perl lib was built for '%s' but is being run on '$^O'"
+#            unless "%s" eq $^O;
+#
+#        my ($bincompat, $non_bincompat, $date, @patches) = Internals::V();
+#
+#        my @opts = sort split ' ', "$bincompat $non_bincompat";
+#
+#        print Config::myconfig();
+#        print "\nCharacteristics of this %s: \n";
+#
+#        print "  Compile-time options:\n";
+#        print "    $_\n" for @opts;
+#
+#        if (@patches) {
+#            print "  Locally applied patches:\n";
+#            print "    $_\n" foreach @patches;
+#        }
+#
+#        print "  Built under %s\n";
+#
+#        print "  $date\n" if defined $date;
+#
+#        my @env = map { "$_=\"$ENV{$_}\"" } sort grep {/^PERL/} keys %%ENV;
+#    %s
+#        if (@env) {
+#            print "  \%%ENV:\n";
+#            print "    $_\n" foreach @env;
+#        }
+#        print "  \@INC:\n";
+#        print "    $_\n" foreach @INC;
+#    }
+#
+#    sub header_files {
 ENDOFBEG
 
 $heavy_txt .= $header_files . "\n}\n\n";
@@ -548,33 +553,35 @@ open(MYCONFIG,'<','myconfig.SH') || die "open myconfig.SH failed: $!";
 do { $heavy_txt .= $_ } until !defined($_ = <MYCONFIG>) || /^\s*$/;
 close(MYCONFIG);
 
-$heavy_txt .= "\n!END!\n" . <<'EOT';
-my $summary_expanded;
-
-sub myconfig {
-    return $summary_expanded if $summary_expanded;
-    ($summary_expanded = $summary) =~ s{\$(\w+)}
-                { 
-                       my $c;
-                       if ($1 eq 'git_ancestor_line') {
-                               if ($Config::Config{git_ancestor}) {
-                                       $c= "\n  Ancestor: $Config::Config{git_ancestor}";
-                               } else {
-                                       $c= "";
-                               }
-                       } else {
-                               $c = $Config::Config{$1}; 
-                       }
-                       defined($c) ? $c : 'undef' 
-               }ge;
-    $summary_expanded;
-}
-
-local *_ = \my $a;
-$_ = <<'!END!';
+$heavy_txt .= "\n!END!\n" . uncomment <<'EOT';
+#    my $summary_expanded;
+#
+#    sub myconfig {
+#        return $summary_expanded if $summary_expanded;
+#        ($summary_expanded = $summary) =~ s{\$(\w+)}
+#                     {
+#                            my $c;
+#                            if ($1 eq 'git_ancestor_line') {
+#                                    if ($Config::Config{git_ancestor}) {
+#                                            $c= "\n  Ancestor: $Config::Config{git_ancestor}";
+#                                    } else {
+#                                            $c= "";
+#                                    }
+#                            } else {
+#                                    $c = $Config::Config{$1};
+#                            }
+#                            defined($c) ? $c : 'undef'
+#                    }ge;
+#        $summary_expanded;
+#    }
+#
+#    local *_ = \my $a;
+#    $_ = <<'!END!';
 EOT
 #proper lexicographical order of the keys
 my %seen_var;
+my @v_define = ( "taint_support=''\n",
+                 "taint_disabled=''\n" );
 $heavy_txt .= join('',
     map { $_->[-1] }
     sort {$a->[0] cmp $b->[0] }
@@ -582,7 +589,7 @@ $heavy_txt .= join('',
     map {
         /^([^=]+)/ ? [ $1, $_ ]
                    : [ $_, $_ ] # shouldnt happen
-    } @v_others, @v_forced
+    } (@v_others, @v_forced, @v_define)
 ) . "!END!\n";
 
 # Only need the dynamic byteorder code in Config.pm if 'byteorder' is one of
@@ -593,29 +600,53 @@ if ($Common{byteorder}) {
     $heavy_txt .= $byteorder_code;
 }
 
+$heavy_txt .= uncomment <<'EOT';
+#    s/(byteorder=)(['"]).*?\2/$1$2$Config::byteorder$2/m;
+#
+EOT
+
+$heavy_txt .= uncomment <<'EOF_TAINT_INIT';
+#    {
+#        # We have to set this up late as Win32 does not build miniperl
+#        # with the same defines and CC flags as it builds perl itself.
+#        my $defines = join " ", (Internals::V)[0,1];
+#        if (
+#            $defines =~ /\b(SILENT_NO_TAINT_SUPPORT)\b/ ||
+#            $defines =~ /\b(NO_TAINT_SUPPORT)\b/
+#        ){
+#            my $which = $1;
+#            my $taint_disabled = ($which eq "SILENT_NO_TAINT_SUPPORT")
+#                                 ? "silent" : "define";
+#            s/^(taint_disabled=['"])(["'])/$1$taint_disabled$2/m;
+#        }
+#        else {
+#            my $taint_support = 'define';
+#            s/^(taint_support=['"])(["'])/$1$taint_support$2/m;
+#        }
+#    }
+EOF_TAINT_INIT
+
 if (@need_relocation) {
 $heavy_txt .= 'foreach my $what (qw(' . join (' ', @need_relocation) .
-      ")) {\n" . <<'EOT';
-    s/^($what=)(['"])(.*?)\2/$1 . $2 . relocate_inc($3) . $2/me;
-}
+      ")) {\n" . uncomment <<'EOT';
+#        s/^($what=)(['"])(.*?)\2/$1 . $2 . relocate_inc($3) . $2/me;
+#    }
 EOT
 # Currently it only makes sense to do the ... relocation on Unix, so there's
 # no need to emulate the "which separator for this platform" logic in perl.c -
 # ':' will always be applicable
 if ($need_relocation{otherlibdirs}) {
-$heavy_txt .= << 'EOT';
-s{^(otherlibdirs=)(['"])(.*?)\2}
- {$1 . $2 . join ':', map {relocate_inc($_)} split ':', $3 . $2}me;
+$heavy_txt .= uncomment << 'EOT';
+#    s{^(otherlibdirs=)(['"])(.*?)\2}
+#     {$1 . $2 . join ':', map {relocate_inc($_)} split ':', $3 . $2}me;
 EOT
 }
 }
 
-$heavy_txt .= <<'EOT';
-s/(byteorder=)(['"]).*?\2/$1$2$Config::byteorder$2/m;
-
-my $config_sh_len = length $_;
-
-our $Config_SH_expanded = "\n$_" . << 'EOVIRTUAL';
+$heavy_txt .= uncomment <<'EOT';
+#    my $config_sh_len = length $_;
+#
+#    our $Config_SH_expanded = "\n$_" . << 'EOVIRTUAL';
 EOT
 
 foreach my $prefix (qw(ccflags ldflags)) {
@@ -670,129 +701,129 @@ if (open(my $fh, '<', 'cflags')) {
 
 $heavy_txt .= "EOVIRTUAL\n";
 
-$heavy_txt .= <<'ENDOFGIT';
-eval {
-       # do not have hairy conniptions if this isnt available
-       require 'Config_git.pl';
-       $Config_SH_expanded .= $Config::Git_Data;
-       1;
-} or warn "Warning: failed to load Config_git.pl, something strange about this perl...\n";
+$heavy_txt .= uncomment <<'ENDOFGIT';
+#    eval {
+#            # do not have hairy conniptions if this isnt available
+#            require 'Config_git.pl';
+#            $Config_SH_expanded .= $Config::Git_Data;
+#            1;
+#    } or warn "Warning: failed to load Config_git.pl, something strange about this perl...\n";
 ENDOFGIT
 
 $heavy_txt .= $fetch_string;
 
-$config_txt .= <<'ENDOFEND';
-
-sub FETCH {
-    my($self, $key) = @_;
-
-    # check for cached value (which may be undef so we use exists not defined)
-    return exists $self->{$key} ? $self->{$key} : $self->fetch_string($key);
-}
-
+$config_txt .= uncomment <<'ENDOFEND';
+#
+#    sub FETCH {
+#        my($self, $key) = @_;
+#
+#        # check for cached value (which may be undef so we use exists not defined)
+#        return exists $self->{$key} ? $self->{$key} : $self->fetch_string($key);
+#    }
+#
 ENDOFEND
 
-$heavy_txt .= <<'ENDOFEND';
-
-my $prevpos = 0;
-
-sub FIRSTKEY {
-    $prevpos = 0;
-    substr($Config_SH_expanded, 1, index($Config_SH_expanded, '=') - 1 );
-}
-
-sub NEXTKEY {
+$heavy_txt .= uncomment <<'ENDOFEND';
+#
+#    my $prevpos = 0;
+#
+#    sub FIRSTKEY {
+#        $prevpos = 0;
+#        substr($Config_SH_expanded, 1, index($Config_SH_expanded, '=') - 1 );
+#    }
+#
+#    sub NEXTKEY {
 ENDOFEND
 if ($seen_quotes{'"'}) {
-$heavy_txt .= <<'ENDOFEND';
-    # Find out how the current key's quoted so we can skip to its end.
-    my $quote = substr($Config_SH_expanded,
-                      index($Config_SH_expanded, "=", $prevpos)+1, 1);
-    my $pos = index($Config_SH_expanded, qq($quote\n), $prevpos) + 2;
+$heavy_txt .= uncomment <<'ENDOFEND';
+#        # Find out how the current key's quoted so we can skip to its end.
+#        my $quote = substr($Config_SH_expanded,
+#                           index($Config_SH_expanded, "=", $prevpos)+1, 1);
+#        my $pos = index($Config_SH_expanded, qq($quote\n), $prevpos) + 2;
 ENDOFEND
 } else {
     # Just ' quotes, so it's much easier.
-$heavy_txt .= <<'ENDOFEND';
-    my $pos = index($Config_SH_expanded, qq('\n), $prevpos) + 2;
+$heavy_txt .= uncomment <<'ENDOFEND';
+#        my $pos = index($Config_SH_expanded, qq('\n), $prevpos) + 2;
 ENDOFEND
 }
-$heavy_txt .= <<'ENDOFEND';
-    my $len = index($Config_SH_expanded, "=", $pos) - $pos;
-    $prevpos = $pos;
-    $len > 0 ? substr($Config_SH_expanded, $pos, $len) : undef;
-}
-
-sub EXISTS {
-    return 1 if exists($_[0]->{$_[1]});
-
-    return(index($Config_SH_expanded, "\n$_[1]='") != -1
+$heavy_txt .= uncomment <<'ENDOFEND';
+#        my $len = index($Config_SH_expanded, "=", $pos) - $pos;
+#        $prevpos = $pos;
+#        $len > 0 ? substr($Config_SH_expanded, $pos, $len) : undef;
+#    }
+#
+#    sub EXISTS {
+#        return 1 if exists($_[0]->{$_[1]});
+#
+#        return(index($Config_SH_expanded, "\n$_[1]='") != -1
 ENDOFEND
 if ($seen_quotes{'"'}) {
-$heavy_txt .= <<'ENDOFEND';
-           or index($Config_SH_expanded, "\n$_[1]=\"") != -1
+$heavy_txt .= uncomment <<'ENDOFEND';
+#               or index($Config_SH_expanded, "\n$_[1]=\"") != -1
 ENDOFEND
 }
-$heavy_txt .= <<'ENDOFEND';
-          );
-}
-
-sub STORE  { die "\%Config::Config is read-only\n" }
-*DELETE = *CLEAR = \*STORE; # Typeglob aliasing uses less space
-
-sub config_sh {
-    substr $Config_SH_expanded, 1, $config_sh_len;
-}
-
-sub config_re {
-    my $re = shift;
-    return map { chomp; $_ } grep eval{ /^(?:$re)=/ }, split /^/,
-    $Config_SH_expanded;
-}
-
-sub config_vars {
-    # implements -V:cfgvar option (see perlrun -V:)
-    foreach (@_) {
-       # find optional leading, trailing colons; and query-spec
-       my ($notag,$qry,$lncont) = m/^(:)?(.*?)(:)?$/;  # flags fore and aft, 
-       # map colon-flags to print decorations
-       my $prfx = $notag ? '': "$qry=";                # tag-prefix for print
-       my $lnend = $lncont ? ' ' : ";\n";              # line ending for print
-
-       # all config-vars are by definition \w only, any \W means regex
-       if ($qry =~ /\W/) {
-           my @matches = config_re($qry);
-           print map "$_$lnend", @matches ? @matches : "$qry: not found"               if !$notag;
-           print map { s/\w+=//; "$_$lnend" } @matches ? @matches : "$qry: not found"  if  $notag;
-       } else {
-           my $v = (exists $Config::Config{$qry}) ? $Config::Config{$qry}
-                                                  : 'UNKNOWN';
-           $v = 'undef' unless defined $v;
-           print "${prfx}'${v}'$lnend";
-       }
-    }
-}
-
-# Called by the real AUTOLOAD
-sub launcher {
-    undef &AUTOLOAD;
-    goto \&$Config::AUTOLOAD;
-}
-
-1;
+$heavy_txt .= uncomment <<'ENDOFEND';
+#              );
+#    }
+#
+#    sub STORE  { die "\%Config::Config is read-only\n" }
+#    *DELETE = *CLEAR = \*STORE; # Typeglob aliasing uses less space
+#
+#    sub config_sh {
+#        substr $Config_SH_expanded, 1, $config_sh_len;
+#    }
+#
+#    sub config_re {
+#        my $re = shift;
+#        return map { chomp; $_ } grep eval{ /^(?:$re)=/ }, split /^/,
+#        $Config_SH_expanded;
+#    }
+#
+#    sub config_vars {
+#        # implements -V:cfgvar option (see perlrun -V:)
+#        foreach (@_) {
+#            # find optional leading, trailing colons; and query-spec
+#            my ($notag,$qry,$lncont) = m/^(:)?(.*?)(:)?$/;  # flags fore and aft,
+#            # map colon-flags to print decorations
+#            my $prfx = $notag ? '': "$qry=";                # tag-prefix for print
+#            my $lnend = $lncont ? ' ' : ";\n";              # line ending for print
+#
+#            # all config-vars are by definition \w only, any \W means regex
+#            if ($qry =~ /\W/) {
+#                my @matches = config_re($qry);
+#                print map "$_$lnend", @matches ? @matches : "$qry: not found"               if !$notag;
+#                print map { s/\w+=//; "$_$lnend" } @matches ? @matches : "$qry: not found"  if  $notag;
+#            } else {
+#                my $v = (exists $Config::Config{$qry}) ? $Config::Config{$qry}
+#                                                       : 'UNKNOWN';
+#                $v = 'undef' unless defined $v;
+#                print "${prfx}'${v}'$lnend";
+#            }
+#        }
+#    }
+#
+#    # Called by the real AUTOLOAD
+#    sub launcher {
+#        undef &AUTOLOAD;
+#        goto \&$Config::AUTOLOAD;
+#    }
+#
+#    1;
 ENDOFEND
 
 if ($^O eq 'os2') {
-    $config_txt .= <<'ENDOFSET';
-my %preconfig;
-if ($OS2::is_aout) {
-    my ($value, $v) = $Config_SH_expanded =~ m/^used_aout='(.*)'\s*$/m;
-    for (split ' ', $value) {
-        ($v) = $Config_SH_expanded =~ m/^aout_$_='(.*)'\s*$/m;
-        $preconfig{$_} = $v eq 'undef' ? undef : $v;
-    }
-}
-$preconfig{d_fork} = undef unless $OS2::can_fork; # Some funny cases can't
-sub TIEHASH { bless {%preconfig} }
+    $config_txt .= uncomment <<'ENDOFSET';
+#    my %preconfig;
+#    if ($OS2::is_aout) {
+#        my ($value, $v) = $Config_SH_expanded =~ m/^used_aout='(.*)'\s*$/m;
+#        for (split ' ', $value) {
+#            ($v) = $Config_SH_expanded =~ m/^aout_$_='(.*)'\s*$/m;
+#            $preconfig{$_} = $v eq 'undef' ? undef : $v;
+#        }
+#    }
+#    $preconfig{d_fork} = undef unless $OS2::can_fork; # Some funny cases can't
+#    sub TIEHASH { bless {%preconfig} }
 ENDOFSET
     # Extract the name of the DLL from the makefile to avoid duplication
     my ($f) = grep -r, qw(GNUMakefile Makefile);
@@ -802,14 +833,14 @@ ENDOFSET
            $dll = $1, last if /^PERL_DLL_BASE\s*=\s*(\S*)\s*$/;
        }
     }
-    $config_txt .= <<ENDOFSET if $dll;
-\$preconfig{dll_name} = '$dll';
+    $config_txt .= uncomment <<ENDOFSET if $dll;
+#    \$preconfig{dll_name} = '$dll';
 ENDOFSET
 } else {
-    $config_txt .= <<'ENDOFSET';
-sub TIEHASH {
-    bless $_[1], $_[0];
-}
+    $config_txt .= uncomment <<'ENDOFSET';
+#    sub TIEHASH {
+#        bless $_[1], $_[0];
+#    }
 ENDOFSET
 }
 
@@ -840,202 +871,194 @@ my $fast_config = join '', map { "    $_,\n" } sort values %Common;
 
 # Sanity check needed to stop an infinite loop if Config_heavy.pl fails to
 # define &launcher for some reason (eg it got truncated)
-$config_txt .= sprintf <<'ENDOFTIE', $fast_config;
-
-sub DESTROY { }
-
-sub AUTOLOAD {
-    require 'Config_heavy.pl';
-    goto \&launcher unless $Config::AUTOLOAD =~ /launcher$/;
-    die "&Config::AUTOLOAD failed on $Config::AUTOLOAD";
-}
-
-# tie returns the object, so the value returned to require will be true.
-tie %%Config, 'Config', {
-%s};
+$config_txt .= sprintf uncomment <<'ENDOFTIE', $fast_config;
+#
+#    sub DESTROY { }
+#
+#    sub AUTOLOAD {
+#        require 'Config_heavy.pl';
+#        goto \&launcher unless $Config::AUTOLOAD =~ /launcher$/;
+#        die "&Config::AUTOLOAD failed on $Config::AUTOLOAD";
+#    }
+#
+#    # tie returns the object, so the value returned to require will be true.
+#    tie %%Config, 'Config', {
+#    %s};
 ENDOFTIE
 
 
 open(CONFIG_POD, '>:raw', $Config_POD) or die "Can't open $Config_POD: $!";
-print CONFIG_POD <<'ENDOFTAIL';
-=head1 NAME
-
-=for comment  Generated by configpm.  Any changes made here will be lost!
-
-Config - access Perl configuration information
-
-=head1 SYNOPSIS
-
-    use Config;
-    if ($Config{usethreads}) {
-       print "has thread support\n"
-    } 
-
-    use Config qw(myconfig config_sh config_vars config_re);
-
-    print myconfig();
-
-    print config_sh();
-
-    print config_re();
-
-    config_vars(qw(osname archname));
-
-
-=head1 DESCRIPTION
-
-The Config module contains all the information that was available to
-the C<Configure> program at Perl build time (over 900 values).
-
-Shell variables from the F<config.sh> file (written by Configure) are
-stored in the readonly-variable C<%Config>, indexed by their names.
-
-Values stored in config.sh as 'undef' are returned as undefined
-values.  The perl C<exists> function can be used to check if a
-named variable exists.
-
-For a description of the variables, please have a look at the
-Glossary file, as written in the Porting folder, or use the url:
-https://github.com/Perl/perl5/blob/blead/Porting/Glossary
-
-=over 4
-
-=item myconfig()
-
-Returns a textual summary of the major perl configuration values.
-See also C<-V> in L<perlrun/Command Switches>.
-
-=item config_sh()
-
-Returns the entire perl configuration information in the form of the
-original config.sh shell variable assignment script.
-
-=item config_re($regex)
-
-Like config_sh() but returns, as a list, only the config entries who's
-names match the $regex.
-
-=item config_vars(@names)
-
-Prints to STDOUT the values of the named configuration variable. Each is
-printed on a separate line in the form:
-
-  name='value';
-
-Names which are unknown are output as C<name='UNKNOWN';>.
-See also C<-V:name> in L<perlrun/Command Switches>.
-
-=item bincompat_options()
-
-Returns a list of C pre-processor options used when compiling this F<perl>
-binary, which affect its binary compatibility with extensions.
-C<bincompat_options()> and C<non_bincompat_options()> are shown together in
-the output of C<perl -V> as I<Compile-time options>.
-
-=item non_bincompat_options()
-
-Returns a list of C pre-processor options used when compiling this F<perl>
-binary, which do not affect binary compatibility with extensions.
-
-=item compile_date()
-
-Returns the compile date (as a string), equivalent to what is shown by
-C<perl -V>
-
-=item local_patches()
-
-Returns a list of the names of locally applied patches, equivalent to what
-is shown by C<perl -V>.
-
-=item header_files()
-
-Returns a list of the header files that should be used as dependencies for
-XS code, for this version of Perl on this platform.
-
-=back
-
-=head1 EXAMPLE
-
-Here's a more sophisticated example of using %Config:
-
-    use Config;
-    use strict;
-
-    my %sig_num;
-    my @sig_name;
-    unless($Config{sig_name} && $Config{sig_num}) {
-       die "No sigs?";
-    } else {
-       my @names = split ' ', $Config{sig_name};
-       @sig_num{@names} = split ' ', $Config{sig_num};
-       foreach (@names) {
-           $sig_name[$sig_num{$_}] ||= $_;
-       }   
-    }
-
-    print "signal #17 = $sig_name[17]\n";
-    if ($sig_num{ALRM}) { 
-       print "SIGALRM is $sig_num{ALRM}\n";
-    }   
-
-=head1 WARNING
-
-Because this information is not stored within the perl executable
-itself it is possible (but unlikely) that the information does not
-relate to the actual perl binary which is being used to access it.
-
-The Config module is installed into the architecture and version
-specific library directory ($Config{installarchlib}) and it checks the
-perl version number when loaded.
-
-The values stored in config.sh may be either single-quoted or
-double-quoted. Double-quoted strings are handy for those cases where you
-need to include escape sequences in the strings. To avoid runtime variable
-interpolation, any C<$> and C<@> characters are replaced by C<\$> and
-C<\@>, respectively. This isn't foolproof, of course, so don't embed C<\$>
-or C<\@> in double-quoted strings unless you're willing to deal with the
-consequences. (The slashes will end up escaped and the C<$> or C<@> will
-trigger variable interpolation)
-
-=head1 GLOSSARY
-
-Most C<Config> variables are determined by the C<Configure> script
-on platforms supported by it (which is most UNIX platforms).  Some
-platforms have custom-made C<Config> variables, and may thus not have
-some of the variables described below, or may have extraneous variables
-specific to that particular port.  See the port specific documentation
-in such cases.
-
-=cut
-
+print CONFIG_POD uncomment <<'ENDOFTAIL';
+#    =head1 NAME
+#
+#    =for comment  Generated by configpm.  Any changes made here will be lost!
+#
+#    Config - access Perl configuration information
+#
+#    =head1 SYNOPSIS
+#
+#        use Config;
+#        if ($Config{usethreads}) {
+#            print "has thread support\n"
+#        }
+#
+#        use Config qw(myconfig config_sh config_vars config_re);
+#
+#        print myconfig();
+#
+#        print config_sh();
+#
+#        print config_re();
+#
+#        config_vars(qw(osname archname));
+#
+#
+#    =head1 DESCRIPTION
+#
+#    The Config module contains all the information that was available to
+#    the F<Configure> program at Perl build time (over 900 values).
+#
+#    Shell variables from the F<config.sh> file (written by Configure) are
+#    stored in the readonly-variable C<%Config>, indexed by their names.
+#
+#    Values stored in config.sh as 'undef' are returned as undefined
+#    values.  The perl C<exists> function can be used to check if a
+#    named variable exists.
+#
+#    For a description of the variables, please have a look at the
+#    Glossary file, as written in the Porting folder, or use the url:
+#    https://github.com/Perl/perl5/blob/blead/Porting/Glossary
+#
+#    =over 4
+#
+#    =item myconfig()
+#
+#    Returns a textual summary of the major perl configuration values.
+#    See also C<-V> in L<perlrun/Command Switches>.
+#
+#    =item config_sh()
+#
+#    Returns the entire perl configuration information in the form of the
+#    original config.sh shell variable assignment script.
+#
+#    =item config_re($regex)
+#
+#    Like config_sh() but returns, as a list, only the config entries who's
+#    names match the $regex.
+#
+#    =item config_vars(@names)
+#
+#    Prints to STDOUT the values of the named configuration variable. Each is
+#    printed on a separate line in the form:
+#
+#      name='value';
+#
+#    Names which are unknown are output as C<name='UNKNOWN';>.
+#    See also C<-V:name> in L<perlrun/Command Switches>.
+#
+#    =item bincompat_options()
+#
+#    Returns a list of C pre-processor options used when compiling this F<perl>
+#    binary, which affect its binary compatibility with extensions.
+#    C<bincompat_options()> and C<non_bincompat_options()> are shown together in
+#    the output of C<perl -V> as I<Compile-time options>.
+#
+#    =item non_bincompat_options()
+#
+#    Returns a list of C pre-processor options used when compiling this F<perl>
+#    binary, which do not affect binary compatibility with extensions.
+#
+#    =item compile_date()
+#
+#    Returns the compile date (as a string), equivalent to what is shown by
+#    C<perl -V>
+#
+#    =item local_patches()
+#
+#    Returns a list of the names of locally applied patches, equivalent to what
+#    is shown by C<perl -V>.
+#
+#    =item header_files()
+#
+#    Returns a list of the header files that should be used as dependencies for
+#    XS code, for this version of Perl on this platform.
+#
+#    =back
+#
+#    =head1 EXAMPLE
+#
+#    Here's a more sophisticated example of using %Config:
+#
+#        use Config;
+#        use strict;
+#
+#        my %sig_num;
+#        my @sig_name;
+#        unless($Config{sig_name} && $Config{sig_num}) {
+#            die "No sigs?";
+#        } else {
+#            my @names = split ' ', $Config{sig_name};
+#            @sig_num{@names} = split ' ', $Config{sig_num};
+#            foreach (@names) {
+#                $sig_name[$sig_num{$_}] ||= $_;
+#            }
+#        }
+#
+#        print "signal #17 = $sig_name[17]\n";
+#        if ($sig_num{ALRM}) {
+#            print "SIGALRM is $sig_num{ALRM}\n";
+#        }
+#
+#    =head1 WARNING
+#
+#    Because this information is not stored within the perl executable
+#    itself it is possible (but unlikely) that the information does not
+#    relate to the actual perl binary which is being used to access it.
+#
+#    The Config module is installed into the architecture and version
+#    specific library directory ($Config{installarchlib}) and it checks the
+#    perl version number when loaded.
+#
+#    The values stored in config.sh may be either single-quoted or
+#    double-quoted. Double-quoted strings are handy for those cases where you
+#    need to include escape sequences in the strings. To avoid runtime variable
+#    interpolation, any C<$> and C<@> characters are replaced by C<\$> and
+#    C<\@>, respectively. This isn't foolproof, of course, so don't embed C<\$>
+#    or C<\@> in double-quoted strings unless you're willing to deal with the
+#    consequences. (The slashes will end up escaped and the C<$> or C<@> will
+#    trigger variable interpolation)
+#
+#    =head1 GLOSSARY
+#
+#    Most C<Config> variables are determined by the C<Configure> script
+#    on platforms supported by it (which is most UNIX platforms).  Some
+#    platforms have custom-made C<Config> variables, and may thus not have
+#    some of the variables described below, or may have extraneous variables
+#    specific to that particular port.  See the port specific documentation
+#    in such cases.
+#
+#    =cut
+#
 ENDOFTAIL
 
 if ($Opts{glossary}) {
   open(GLOS, '<', $Glossary) or die "Can't open $Glossary: $!";
 }
-my %seen = ();
 my $text = 0;
 $/ = '';
 my $errors= 0;
 
-sub process {
-  if (s/\A(\w*)\s+\(([\w.]+)\):\s*\n(\t?)/=item C<$1>\n\nFrom F<$2>:\n\n/m) {
-    my $c = substr $1, 0, 1;
-    unless ($seen{$c}++) {
-      print CONFIG_POD <<EOF if $text;
-=back
+my %glossary;
 
-EOF
-      print CONFIG_POD <<EOF;
-=head2 $c
+my $fc;
+my $item;
 
-=over 4
-
-EOF
-     $text = 1;
-    }
+sub process {
+  if (s/\A(\w*)\s+\(([\w.]+)\):\s*\n(\t?)/=item C<$1>\n\nFrom F<$2>:\n\n/m) {
+    $item = $1;
+    $fc = substr $item, 0, 1;
   }
-  elsif (!$text || !/\A\t/) {
+  elsif (!$item || !/\A\t/) {
     warn "Expected a Configure variable header",
       ($text ? " or another paragraph of description" : () ),
       ", instead we got:\n$_";
@@ -1067,6 +1090,7 @@ EOF
   s/(?<![.<\'\"])\b([A-Z_]{2,})\b(?![\'\"])/C<$1>/g;   # UNISTD
   s/(?<![.<\'\"])\b(?!the\b)(\w+)\s+macro\b/C<$1> macro/g; # FILE_cnt macro
   s/n[\0]t/n't/g;              # undo can't, won't damage
+  $glossary{$fc}{$item} .= $_;
 }
 
 if ($Opts{glossary}) {
@@ -1074,7 +1098,6 @@ if ($Opts{glossary}) {
     <GLOS>;                            # Skip the preamble
   while (<GLOS>) {
     process;
-    print CONFIG_POD;
   }
   if ($errors) {
     die "Errors encountered while processing $Glossary. ",
@@ -1085,33 +1108,67 @@ if ($Opts{glossary}) {
   }
 }
 
-print CONFIG_POD <<'ENDOFTAIL';
-
-=back
-
-=head1 GIT DATA
-
-Information on the git commit from which the current perl binary was compiled
-can be found in the variable C<$Config::Git_Data>.  The variable is a
-structured string that looks something like this:
-
-  git_commit_id='ea0c2dbd5f5ac6845ecc7ec6696415bf8e27bd52'
-  git_describe='GitLive-blead-1076-gea0c2db'
-  git_branch='smartmatch'
-  git_uncommitted_changes=''
-  git_commit_id_title='Commit id:'
-  git_commit_date='2009-05-09 17:47:31 +0200'
-
-Its format is not guaranteed not to change over time.
-
-=head1 NOTE
+$glossary{t}{taint_support} //= uncomment <<EOF_TEXT;
+#    =item C<taint_support>
+#
+#    From define: C<SILENT_NO_TAINT_SUPPORT> or C<NO_TAINT_SUPPORT>
+#
+#    If this perl is compiled with support for taint mode this variable will
+#    be set to 'define', if it is not it will be set to the empty string.
+#    Either of the above defines will result in it being empty.  This property
+#    was added in version 5.37.11. See also L</taint_disabled>.
+#
+EOF_TEXT
 
-This module contains a good example of how to use tie to implement a
-cache and an example of how to make a tied variable readonly to those
-outside of it.
+$glossary{t}{taint_disabled} //= uncomment <<EOF_TEXT;
+#    =item C<taint_disabled>
+#
+#    From define: C<SILENT_NO_TAINT_SUPPORT> or C<NO_TAINT_SUPPORT>
+#
+#    If this perl is compiled with support for taint mode this variable will
+#    be set to the empty string, if it was compiled with
+#    C<SILENT_NO_TAINT_SUPPORT> defined then it will be set to be "silent",
+#    and if it was compiled with C<NO_TAINT_SUPPORT> defined it will be
+#    'define'. Either of the above defines will results in it being a true
+#    value. This property was added in 5.37.11. See also L</taint_support>.
+#
+EOF_TEXT
 
-=cut
+if ($Opts{glossary}) {
+    foreach my $fc (sort keys %glossary) {
+        print CONFIG_POD "=head2 $fc\n\n=over 4\n\n";
+        foreach my $item (sort keys %{$glossary{$fc}}) {
+            print CONFIG_POD $glossary{$fc}{$item};
+        }
+        print CONFIG_POD "=back\n\n";
+    }
+}
 
+print CONFIG_POD uncomment <<'ENDOFTAIL';
+#
+#    =head1 GIT DATA
+#
+#    Information on the git commit from which the current perl binary was compiled
+#    can be found in the variable C<$Config::Git_Data>.  The variable is a
+#    structured string that looks something like this:
+#
+#      git_commit_id='ea0c2dbd5f5ac6845ecc7ec6696415bf8e27bd52'
+#      git_describe='GitLive-blead-1076-gea0c2db'
+#      git_branch='smartmatch'
+#      git_uncommitted_changes=''
+#      git_commit_id_title='Commit id:'
+#      git_commit_date='2009-05-09 17:47:31 +0200'
+#
+#    Its format is not guaranteed not to change over time.
+#
+#    =head1 NOTE
+#
+#    This module contains a good example of how to use tie to implement a
+#    cache and an example of how to make a tied variable readonly to those
+#    outside of it.
+#
+#    =cut
+#
 ENDOFTAIL
 
 close(GLOS) if $Opts{glossary};
@@ -1128,18 +1185,6 @@ my $orig_heavy_txt = "";
 }
 
 if ($orig_config_txt ne $config_txt or $orig_heavy_txt ne $heavy_txt) {
-    # During the build don't look in /usr/local for libs or includes
-    # but after, we want to let modules look there.
-    my $install_heavy_txt = $heavy_txt;
-    $install_heavy_txt =~ s,^(ccflags|cppflags)[^=]*='[^']+,$& -I/usr/local/include,gm;
-    $install_heavy_txt =~ s,^(ldflags|lddlflags)[^=]*='[^']+,$& -L/usr/local/lib,gm;
-
-    open INSTALL_CONFIG_HEAVY, ">", "$Config_heavy.install"
-         or die "Can't open install $Config_heavy: $!\n";
-    print INSTALL_CONFIG_HEAVY $install_heavy_txt;
-    close INSTALL_CONFIG_HEAVY;
-    print "updated install $Config_heavy\n";
-
     open CONFIG, ">", $Config_PM or die "Can't open $Config_PM: $!\n";
     open CONFIG_HEAVY, ">", $Config_heavy or die "Can't open $Config_heavy: $!\n";
     print CONFIG $config_txt;
index e9001ad..9b43ca6 100644 (file)
@@ -36,7 +36,6 @@ $! VMS-isms we will need:
 $ echo = "write sys$output "
 $ cat  = "type"
 $ delete := delete ! local symbol overrides globals with qualifiers
-$ gcc_symbol = "gcc"
 $ ld = "Link/nodebug"
 $ ans = ""
 $ macros = ""
@@ -1288,7 +1287,6 @@ $!
 $ version = revision + "_" + patchlevel + "_" + subversion
 $!
 $!: see if we need a special compiler
-$! cc_list = "cc/decc|gcc" !%Config-I-VMS, compiler symbols/commands
 $!
 $ nocc = "f"
 $ vms_cc_dflt = ""
@@ -1302,8 +1300,6 @@ $ WRITE CONFIG "#include <stdio.h>"
 $ WRITE CONFIG "int main() {"
 $ WRITE CONFIG "#ifdef __DECC"
 $ WRITE CONFIG "        printf(""/DECC\n"");"
-$ WRITE CONFIG "#else"
-$ WRITE CONFIG "        printf(""/VAXC\n"");"
 $ WRITE CONFIG "#endif"
 $ WRITE CONFIG "        exit(0);"
 $ WRITE CONFIG "}"
@@ -1318,11 +1314,7 @@ $ SET ON
 $ IF (silent) THEN GOSUB Shut_up
 $ IF tmp.NE.%X10B90001
 $ THEN 
-$  IF tmp.NE.%X10000001
-$  THEN 
-$    nocc = "t"  !%X10000001 is return from gcc
-$    GOTO Gcc_initial_check
-$  ENDIF
+$   GOTO Cxx_initial_check
 $ ENDIF
 $!
 $ GOSUB List_Parse
@@ -1336,33 +1328,6 @@ $   vms_cc_dflt = "/decc"
 $   vms_cc_available = vms_cc_available + "cc/decc "
 $ ENDIF
 $!
-$Gcc_initial_check:
-$ echo "Checking for gcc"
-$ OPEN/WRITE CONFIG gccvers.lis
-$ SET NOON
-$ DEFINE/USER_MODE SYS$ERROR CONFIG
-$ DEFINE/USER_MODE SYS$OUTPUT CONFIG
-$ 'gcc_symbol'/noobj/version _nla0:
-$ tmp = $status
-$ SET ON
-$ IF (silent) THEN GOSUB Shut_up
-$ CLOSE CONFIG
-$ IF (tmp.NE.%X10000001).and.(tmp.ne.%X00030001)
-$ THEN
-$   echo "Symbol ""''gcc_symbol'"" is not defined. I guess you do not have it."
-$   DELETE/NOLOG/NOCONFIRM gccvers.lis;
-$   GOTO Cxx_initial_check
-$ ENDIF
-$ OPEN/READ CONFIG gccvers.lis
-$GCC_List_Read:
-$ READ/END_OF_FILE=GCC_List_End CONFIG line
-$ GOTO GCC_List_Read
-$GCC_List_End:
-$ CLOSE CONFIG
-$ echo line
-$ vms_cc_available = vms_cc_available + "''gcc_symbol' "
-$ DELETE/NOLOG/NOCONFIRM gccvers.lis;
-$!
 $Cxx_initial_check:
 $!
 $! In order to build with the HP C++ compiler, invoke configure.com with "-Dusecxx" on
@@ -1456,8 +1421,6 @@ $     dflt = "cxx"
 $   ELSE
 $     dflt = "cc''vms_cc_dflt'"  !-> "cc" in case first compile went OK
 $   ENDIF
-$ ELSE
-$   dflt = gcc_symbol
 $ ENDIF
 $ rp = "Use which C compiler? [''dflt'] "
 $ GOSUB myread
@@ -1506,11 +1469,6 @@ $   THEN
 $     ccname := DEC
 $     C_COMPILER_Replace = "CC=cc=''Mcc'"
 $   ENDIF
-$   IF Mcc .EQS. "gcc"
-$   THEN
-$     ccname := GCC
-$     C_COMPILER_Replace = "CC=cc=''Mcc'"
-$   ENDIF
 $ ENDIF
 $Decc_Version_check:
 $ ccversion=""
@@ -1562,121 +1520,7 @@ $   echo4 "adding /NOANSI_ALIAS qualifier to ccflags."
 $   ccflags = ccflags + "/NOANSI_ALIAS"
 $   DELETE/NOLOG/NOCONFIRM deccvers.*;
 $ ENDIF
-$Gcc_check:
-$ gccversion = ""
-$ IF ccname .EQS. "GCC"
-$ THEN
-$   vaxcrtl_olb = F$SEARCH("SYS$LIBRARY:VAXCRTL.OLB")
-$   vaxcrtl_exe = F$SEARCH("SYS$SHARE:VAXCRTL.EXE")
-$   gcclib_olb  = F$SEARCH("GNU_CC:[000000]GCCLIB.OLB")
-$   IF gcclib_olb .EQS. "" 
-$   THEN 
-$!    These objects/libs come w/ gcc 2.7.2 for AXP:
-$     tmp = F$SEARCH("GNU_CC:[000000]libgcc2.olb")
-$     IF tmp .NES. "" then gcclib_olb = tmp
-$     tmp = F$SEARCH("GNU_CC:[000000]libgcclib.olb")
-$     IF tmp .NES. "" 
-$     THEN 
-$       IF gcclib_olb .EQS. "" 
-$       THEN gcclib_olb = tmp
-$       ELSE gcclib_olb = gcclib_olb + "/lib," + tmp
-$       ENDIF
-$     ENDIF
-$     tmp = F$SEARCH("SYS$LIBRARY:VAXCRTL.OLB")
-$     IF tmp .NES. "" 
-$     THEN 
-$       IF gcclib_olb .EQS. "" 
-$       THEN gcclib_olb = tmp
-$       ELSE gcclib_olb = gcclib_olb + "/lib," + tmp
-$       ENDIF
-$     ENDIF
-$     tmp = F$SEARCH("GNU_CC:[000000]crt0.obj")
-$     IF tmp .NES. "" 
-$     THEN 
-$       IF gcclib_olb .EQS. "" 
-$       THEN gcclib_olb = tmp
-$       ELSE gcclib_olb = gcclib_olb + "/lib," + tmp
-$       ENDIF
-$     ENDIF
-$     IF gcclib_olb .EQS. vaxcrtl_olb THEN gcclib_olb = "" !goofy order of axplibs
-$   ELSE
-$     gcclib_olb = gcclib_olb + "/lib"
-$   ENDIF
-$   IF   gcclib_olb .NES. "" .AND. -
-     (vaxcrtl_olb .NES. "" .OR. -
-      vaxcrtl_exe .NES. "" )
-$   THEN
-$     echo ""
-$     echo4 "Checking for GNU cc in disguise and/or its version number..." !>&4
-$     OPEN/WRITE CONFIG gccvers.c
-$     WRITE CONFIG "#include <stdio.h>"
-$     WRITE CONFIG "int main() {"
-$     WRITE CONFIG "#ifdef __GNUC__"
-$     WRITE CONFIG "#ifdef __VERSION__"
-$     WRITE CONFIG "        printf(""%s\n"", __VERSION__);"
-$     WRITE CONFIG "#else"
-$     WRITE CONFIG "        printf(""%s\n"", ""1"");"
-$     WRITE CONFIG "#endif"
-$     WRITE CONFIG "#endif"
-$     WRITE CONFIG "        exit(0);"
-$     WRITE CONFIG "}"
-$     CLOSE CONFIG
-$     DEFINE SYS$ERROR _NLA0:
-$     DEFINE SYS$OUTPUT _NLA0:
-$     'Mcc' gccvers.c
-$     tmp = $status
-$     DEASSIGN SYS$ERROR _NLA0:
-$     DEASSIGN SYS$OUTPUT _NLA0:
-$     IF (silent) THEN GOSUB Shut_up
-$     DEFINE SYS$ERROR _NLA0:
-$     DEFINE SYS$OUTPUT _NLA0:
-$     IF vaxcrtl_exe .EQS. ""
-$     THEN 
-$       IF F$LOCATE("VAXCRTL",gcclib_olb).NE.F$LENGTH(gcclib_olb)
-$       THEN 
-$         link/nodebug gccvers.obj,'gcclib_olb',SYS$LIBRARY:VAXCRTL/Library
-$         tmp = $status
-$       ELSE
-$         link/nodebug gccvers.obj,'gcclib_olb'
-$         tmp = $status
-$       ENDIF
-$     ELSE
-$       OPEN/WRITE CONFIG GCCVERS.OPT
-$       WRITE CONFIG "SYS$SHARE:VAXCRTL/SHARE"
-$       CLOSE CONFIG
-$       link/nodebug gccvers.obj,GCCVERS.OPT/OPT,'gcclib_olb'
-$       tmp = $status
-$     ENDIF
-$     DEASSIGN SYS$ERROR
-$     DEASSIGN SYS$OUTPUT
-$     IF (silent) THEN GOSUB Shut_up
-$     OPEN/WRITE CONFIG gccvers.out
-$     DEFINE SYS$ERROR CONFIG
-$     DEFINE SYS$OUTPUT CONFIG
-$     mcr []gccvers.exe
-$     tmp = $status
-$     CLOSE CONFIG
-$     DEASSIGN SYS$OUTPUT
-$     DEASSIGN SYS$ERROR
-$     IF (silent) THEN GOSUB Shut_up
-$     OPEN/READ CONFIG gccvers.out
-$     READ/END_OF_FILE=Gcc_cleanup CONFIG line
-$Gcc_cleanup:
-$     CLOSE CONFIG
-$     DELETE/NOLOG/NOCONFIRM gccvers.*;
-$     IF F$LOCATE("GNU C version ",line).NE.F$LENGTH(line)
-$     THEN 
-$       echo "You are not using GNU cc."
-$       GOTO Host_name
-$     ELSE 
-$       echo "You are using GNU cc ''line'"
-$       gccversion = line
-$       ccname := "GCC"
-$       C_COMPILER_Replace = "CC=cc=''Mcc'"
-$       GOTO Include_dirs
-$     ENDIF
-$   ENDIF
-$ ENDIF
+$!
 $Cxx_Version_check:
 $ IF ccname .EQS. "CXX"
 $ THEN
@@ -1769,17 +1613,6 @@ $ line = F$EDIT(line,"TRIM")       !bit redundant but we're in no big hurry
 $ DELETE/NOLOG/NOCONFIRM ccvms.lis;
 $ RETURN
 $!
-$Include_dirs:
-$!: What should the include directory be ? (.TLB text libraries)
-$ dflt = gcclib_olb 
-$ rp = "Where are the include files you want to use? "
-$ IF f$length( rp + "[''dflt'] " ) .GT. 76
-$ THEN rp = F$FAO("!AS!/!AS",rp,"[''dflt'] ")
-$ ELSE rp = rp + "[''dflt'] "
-$ ENDIF
-$ GOSUB myread
-$ usrinc = ans
-$!
 $!: see if we have to deal with yellow pages, now NIS.
 $!: now get the host name
 $Host_name:
@@ -2369,22 +2202,6 @@ $!
 $ bool_dflt = "n"
 $ vms_prefix = "perl_root"
 $ vms_prefixup = F$EDIT(vms_prefix,"UPCASE")
-$ rp = "Will you be sharing your ''vms_prefixup' with ''otherarch'? [''bool_dflt'] "
-$ GOSUB myread
-$ IF .NOT. ans
-$ THEN
-$   sharedperl = "N"
-$ ELSE
-$   sharedperl = "Y"
-$   IF (F$ELEMENT(0, "-", archname).EQS."VMS_AXP")
-$   THEN
-$     macros = macros + """AXE=1"","
-$   ENDIF
-$   IF (F$ELEMENT(0, "-", archname).EQS."VMS_IA64")
-$   THEN
-$     macros = macros + """IXE=1"","
-$   ENDIF
-$ ENDIF
 $!
 $!: is AFS running?                       !sfn
 $!: decide how portable to be.  Allow command line overrides. !sfn
@@ -3239,34 +3056,22 @@ $ ELSE
 $   uselargefiles = "undef"
 $ ENDIF
 $!
+$ i32dformat="""d"""
+$ u32uformat="""u"""
+$ u32oformat="""o"""
+$ u32xformat="""x"""
+$ u32XUformat="""X"""
+$!
 $ usemymalloc = "undef"
 $ if mymalloc then usemymalloc = "define"
 $!
 $ perl_cc=Mcc
 $!
-$ IF (sharedperl .AND. F$ELEMENT(0, "-", archname) .EQS. "VMS_AXP")
-$ THEN
-$   obj_ext=".abj"
-$   so="axe"
-$   dlext="axe"
-$   exe_ext=".axe"
-$   lib_ext=".alb"
-$ ELSE
-$   IF (sharedperl .AND. F$ELEMENT(0, "-", archname) .EQS. "VMS_IA64")
-$   THEN
-$     obj_ext=".ibj"
-$     so="ixe"
-$     dlext="ixe"
-$     exe_ext=".ixe"
-$     lib_ext=".ilb"
-$   ELSE
-$     obj_ext=".obj"
-$     so="exe"
-$     dlext="exe"
-$     exe_ext=".exe"
-$     lib_ext=".olb"
-$   ENDIF
-$ ENDIF
+$ obj_ext=".obj"
+$ so="exe"
+$ dlext="exe"
+$ exe_ext=".exe"
+$ lib_ext=".olb"
 $ dlobj="dl_vms''obj_ext'"
 $!
 $ cppstdin="''perl_cc'/noobj/comments=as_is/preprocess=sys$output sys$input"
@@ -3434,24 +3239,13 @@ $ ENDIF
 $!
 $! Some that we need to invoke the compiler for
 $!
-$!
 $! handy construction aliases/symbols
 $!
 $ OS := "open/write CONFIG []try.c"
 $ WS := "write CONFIG"
 $ CS := "close CONFIG"
 $ DS := "delete/nolog/noconfirm []try.*;*"
-$ Needs_Opt := N
 $ good_compile = %X10B90001
-$ IF ccname .EQS. "GCC"
-$ THEN
-$   open/write OPTCHAN []try.opt
-$   write OPTCHAN "Gnu_CC:[000000]gcclib.olb/library"
-$   write OPTCHAN "Sys$Share:VAXCRTL/Share"
-$   Close OPTCHAN
-$   Needs_Opt := Y
-$   good_compile = %X10000001
-$ ENDIF
 $ IF ccname .EQS. "CXX"
 $ THEN
 $   good_compile = %X15F60001
@@ -3550,14 +3344,8 @@ $ GOSUB compile_ok
 $ DEFINE/USER_MODE SYS$ERROR _NLA0:
 $ DEFINE/USER_MODE SYS$OUTPUT _NLA0:
 $ SET NOON
-$ IF Needs_Opt
-$ THEN
-$   'ld' try.obj,try.opt/opt
-$   link_status = $status
-$ ELSE
-$   'ld' try.obj
-$   link_status = $status
-$ ENDIF
+$ 'ld' try.obj
+$ link_status = $status
 $ SET ON
 $ IF F$SEARCH("try.obj") .NES. "" THEN DELETE/NOLOG/NOCONFIRM try.obj;
 $ RETURN
@@ -4569,6 +4357,23 @@ $ tmp = "acess"
 $ GOSUB inlibc
 $ d_access = tmp
 $!
+$! Check for mkostemp
+$!
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "int main()"
+$ WS "{"
+$ WS "mkostemp(""foo"", 0);"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ tmp = "mkostemp"
+$ GOSUB inlibc
+$ d_mkostemp = tmp
+$!
 $! Check for mkstemp
 $!
 $ OS
@@ -5489,21 +5294,14 @@ $ ENDIF
 $!
 $! Some that are compiler or VMS version sensitive
 $!
-$! Gnu C stuff
-$ IF ccname .EQS. "GCC"
+$ IF ccname .EQS. "CXX"
 $ THEN
-$   d_attribut="define"
-$   vms_cc_type="gcc"
+$   vms_cc_type="cxx"
 $ ELSE
-$   IF ccname .EQS. "CXX"
-$   THEN
-$      vms_cc_type="cxx"
-$   ELSE
-$      vms_cc_type="cc"
-$   ENDIF
-$   d_attribut="undef"
+$   vms_cc_type="cc"
 $ ENDIF
 $!
+$ d_attribut="undef"
 $ d_getitimer="define"
 $ d_gettimeod="define"
 $ d_mmap="define"
@@ -6122,6 +5920,7 @@ $ WC "d_attribute_nonnull='undef'"
 $ WC "d_attribute_noreturn='undef'"
 $ WC "d_attribute_pure='undef'"
 $ WC "d_attribute_unused='undef'"
+$ WC "d_attribute_visibility='undef'"
 $ WC "d_attribute_warn_unused_result='undef'"
 $ WC "d_prctl='undef'"
 $ WC "d_prctl_set_name='undef'"
@@ -6369,6 +6168,7 @@ $ WC "d_mkdtemp='" + d_mkdtemp + "'"
 $ WC "d_mkfifo='undef'"
 $ WC "d_mknod='undef'"
 $ WC "d_mkostemp='undef'"
+$ WC "d_mkostemp='" + d_mkostemp + "'"
 $ WC "d_mkstemp='" + d_mkstemp + "'"
 $ WC "d_mkstemps='" + d_mkstemps + "'"
 $ WC "d_mktime='" + d_mktime + "'"
@@ -6680,7 +6480,6 @@ $ WC "freetype='void'"
 $ WC "full_ar='" + "'"
 $ WC "full_csh='" + " '"
 $ WC "full_sed='_NLA0:'"
-$ WC "gccversion='" + gccversion + "'"
 $ WC "gidformat='lu'"
 $ WC "gidsign='1'"
 $ WC "gidsize='4'"
@@ -6692,6 +6491,7 @@ $ WC "hint='none'"
 $ WC "hintfile='" + "'"
 $ WC "i16size='" + i16size + "'"
 $ WC "i16type='" + i16type + "'"
+$ WC "i32dformat='" + i32dformat + "'"
 $ WC "i32size='" + i32size + "'"
 $ WC "i32type='" + i32type + "'"
 $ WC "i64size='" + i64size + "'"
@@ -6768,6 +6568,7 @@ $ WC "i_syssockio='undef'"
 $ WC "i_sysstat='define'"
 $ WC "i_sysstatfs='undef'"
 $ WC "i_sysstatvfs='" + i_sysstatvfs + "'"
+$ WC "i_syssyscall='undef'"
 $ WC "i_systime='undef'"
 $ WC "i_systimek='undef'"
 $ WC "i_systimes='undef'"
@@ -6985,8 +6786,12 @@ $ WC "targetsh='MCR'"
 $ WC "timetype='" + timetype + "'"
 $ WC "u16size='" + u16size + "'"
 $ WC "u16type='" + u16type + "'"
+$ WC "u32oformat='" + u32oformat + "'"
+$ WC "u32uformat='" + u32uformat + "'"
 $ WC "u32size='" + u32size + "'"
 $ WC "u32type='" + u32type + "'"
+$ WC "u32xformat='" + u32xformat + "'"
+$ WC "u32XUformat='" + u32XUformat + "'"
 $ WC "u64size='" + u64size + "'"
 $ WC "u64type='" + u64type + "'"
 $ WC "u8size='" + u8size + "'"
@@ -7188,20 +6993,7 @@ $! Okay, we've gotten here. Build munchconfig.exe
 $ COPY/NOLOG [-.vms]munchconfig.c []
 $ COPY/NOLOG [-.vms]'Makefile_SH' []
 $ 'Perl_CC' 'ccflags' munchconfig.c
-$ IF Needs_Opt
-$ THEN
-$   OPEN/WRITE CONFIG []munchconfig.opt
-$   IF ccname .EQS. "GCC"
-$   THEN
-$     WRITE CONFIG "Gnu_CC:[000000]gcclib.olb/library"
-$   ENDIF
-$   WRITE CONFIG "Sys$Share:VAXCRTL/Share"
-$   CLOSE CONFIG
-$   'ld'/EXE='exe_ext' munchconfig'obj_ext',munchconfig.opt/opt
-$   DELETE/NOLOG/NOCONFIRM munchconfig.opt;
-$ ELSE
-$   'ld'/EXE='exe_ext' munchconfig'obj_ext'
-$ ENDIF
+$ 'ld'/EXE='exe_ext' munchconfig'obj_ext'
 $ IF F$SEARCH("munchconfig''obj_ext'") .NES. "" THEN DELETE/NOLOG/NOCONFIRM munchconfig'obj_ext';
 $ IF F$SEARCH("munchconfig.c") .NES. "" THEN DELETE/NOLOG/NOCONFIRM munchconfig.c;
 $ IF ccname .EQS. "CXX"
@@ -7253,7 +7045,6 @@ $ IF use_two_pot_malloc THEN WC "#define TWO_POT_OPTIMIZE"
 $ IF mymalloc THEN WC "#define EMBEDMYMALLOC"
 $ IF use_pack_malloc THEN WC "#define PACK_MALLOC"
 $ IF use_debugmalloc THEN WC "#define DEBUGGING_MSTATS"
-$ IF ccname .EQS. "GCC" THEN WC "#define GNUC_ATTRIBUTE_CHECK"
 $ IF (Has_Dec_C_Sockets)
 $ THEN
 $    WC "#define VMS_DO_SOCKETS"
@@ -7313,12 +7104,6 @@ $   DECCXX_REPLACE = "DECCXX=DECCXX=1"
 $ ELSE
 $   DECCXX_REPLACE = "DECCXX="
 $ ENDIF
-$ IF ccname .EQS. "GCC"
-$ THEN
-$   GNUC_REPLACE = "GNUC=gnuc=1"
-$ ELSE
-$   GNUC_REPLACE = "GNUC=" 
-$ ENDIF
 $ IF Has_Dec_C_Sockets
 $ THEN
 $   SOCKET_REPLACE = "SOCKET=DECC_SOCKETS=1"
@@ -7365,7 +7150,6 @@ $ WC := write CONFIG
 $ WC "''DECC_REPLACE'"
 $ WC "''DECCXX_REPLACE'"
 $ WC "''ARCH_TYPE'"
-$ WC "''GNUC_REPLACE'"
 $ WC "''SOCKET_REPLACE'"
 $ WC "''THREAD_REPLACE'"
 $ WC "''C_Compiler_Replace'"
@@ -7504,8 +7288,6 @@ $   echo ""
 $   echo4 "The perl.cld file is now being written..."
 $   OPEN/WRITE CONFIG 'file_2_find'
 $   ext = ".exe"
-$   IF (sharedperl .AND. F$ELEMENT(0, "-", archname) .EQS. "VMS_AXP") THEN ext := .AXE
-$   IF (sharedperl .AND. F$ELEMENT(0, "-", archname) .EQS. "VMS_IA64") THEN ext := .IXE
 $   IF (use_vmsdebug_perl)
 $   THEN
 $     WRITE CONFIG "define verb dbgperl"
@@ -7561,11 +7343,6 @@ $ WRITE CONFIG "$   root_spec = P1"
 $ WRITE CONFIG "$ endif"
 $ WRITE CONFIG "$ define/translation=concealed ''vms_prefix' 'root_spec'"
 $ WRITE CONFIG "$ ext = "".exe"""
-$ IF sharedperl
-$ THEN
-$ WRITE CONFIG "$ if f$getsyi(""ARCH_TYPE"") .eq. 2 then ext = "".AXE"""
-$ WRITE CONFIG "$ if f$getsyi(""ARCH_TYPE"") .eq. 3 then ext = "".IXE"""
-$ ENDIF
 $ IF (perl_symbol)
 $ THEN
 $   perl_setup_perl = "'" + "'perl'" ! triple quoted foreign command symbol
index d93e0f0..1b2b794 100644 (file)
@@ -33,7 +33,7 @@ struct jmpenv {
     struct jmpenv *    je_prev;
     Sigjmp_buf         je_buf;         /* uninit if je_prev is NULL */
     int                        je_ret;         /* last exception thrown */
-    bool               je_mustcatch;   /* need to call longjmp()? */
+    bool               je_mustcatch;   /* longjmp()s must be caught locally */
     U16                 je_old_delaymagic; /* saved PL_delaymagic */
     SSize_t             je_old_stack_hwm;
 };
@@ -110,30 +110,47 @@ typedef struct jmpenv JMPENV;
 
 #define dJMPENV                JMPENV cur_env
 
-#define JMPENV_PUSH(v) \
+#define JMPENV_PUSH(v)                                                  \
     STMT_START {                                                       \
-        DEBUG_l({                                                      \
-            int i = 0; JMPENV *p = PL_top_env;                         \
+        DEBUG_l({                                                       \
+            int i = 0;                                                  \
+            JMPENV *p = PL_top_env;                                     \
             while (p) { i++; p = p->je_prev; }                         \
-            Perl_deb(aTHX_ "JUMPENV_PUSH level=%d at %s:%d\n",         \
-                         i,  __FILE__, __LINE__);})                    \
+            Perl_deb(aTHX_ "JMPENV_PUSH pre level=%d in %s at %s:%d\n", \
+                         i,  SAFE_FUNCTION__, __FILE__, __LINE__);      \
+        });                                                             \
         cur_env.je_prev = PL_top_env;                                  \
         JE_OLD_STACK_HWM_save(cur_env);                                 \
-        cur_env.je_ret = PerlProc_setjmp(cur_env.je_buf, SCOPE_SAVES_SIGNAL_MASK);             \
+        /* setjmp() is callable in limited contexts which does not */  \
+        /* include assignment, so switch() instead */                  \
+        switch (PerlProc_setjmp(cur_env.je_buf, SCOPE_SAVES_SIGNAL_MASK)) { \
+        case 0: cur_env.je_ret = 0; break;                             \
+        case 1: cur_env.je_ret = 1; break;                             \
+        case 2: cur_env.je_ret = 2; break;                             \
+        case 3: cur_env.je_ret = 3; break;                             \
+        default: Perl_croak(aTHX_ "panic: unexpected setjmp() result\n"); \
+        }                                                              \
         JE_OLD_STACK_HWM_restore(cur_env);                              \
         PL_top_env = &cur_env;                                         \
         cur_env.je_mustcatch = FALSE;                                  \
         cur_env.je_old_delaymagic = PL_delaymagic;                     \
+        DEBUG_l({                                                       \
+            int i = 0;                                                  \
+            JMPENV *p = PL_top_env;                                     \
+            while (p) { i++; p = p->je_prev; }                         \
+            Perl_deb(aTHX_ "JMPENV_PUSH level=%d ret=%d in %s at %s:%d\n",    \
+                         i, cur_env.je_ret, SAFE_FUNCTION__,  __FILE__, __LINE__); \
+        });                                                             \
         (v) = cur_env.je_ret;                                          \
     } STMT_END
 
 #define JMPENV_POP \
     STMT_START {                                                       \
-        DEBUG_l({                                                      \
+        DEBUG_l({                                                       \
             int i = -1; JMPENV *p = PL_top_env;                                \
             while (p) { i++; p = p->je_prev; }                         \
-            Perl_deb(aTHX_ "JUMPENV_POP level=%d at %s:%d\n",          \
-                         i, __FILE__, __LINE__);})                     \
+            Perl_deb(aTHX_ "JMPENV_POP level=%d in %s at %s:%d\n",        \
+                         i, SAFE_FUNCTION__, __FILE__, __LINE__);})        \
         assert(PL_top_env == &cur_env);                                        \
         PL_delaymagic = cur_env.je_old_delaymagic;                     \
         PL_top_env = cur_env.je_prev;                                  \
@@ -141,27 +158,29 @@ typedef struct jmpenv JMPENV;
 
 #define JMPENV_JUMP(v) \
     STMT_START {                                               \
-        DEBUG_l({                                              \
+        DEBUG_l({                                               \
             int i = -1; JMPENV *p = PL_top_env;                        \
             while (p) { i++; p = p->je_prev; }                 \
-            Perl_deb(aTHX_ "JUMPENV_JUMP(%d) level=%d at %s:%d\n", \
-                         (int)v, i, __FILE__, __LINE__);})     \
-        if (PL_top_env->je_prev)                               \
+            Perl_deb(aTHX_ "JMPENV_JUMP(%d) level=%d in %s at %s:%d\n",         \
+                         (int)(v), i, SAFE_FUNCTION__, __FILE__, __LINE__);})   \
+        if (PL_top_env->je_prev) {                             \
+            assert((v) >= 0 && (v) <= 3);                      \
             PerlProc_longjmp(PL_top_env->je_buf, (v));         \
+        }                                                      \
         if ((v) == 2)                                          \
             PerlProc_exit(STATUS_EXIT);                                \
-        PerlIO_printf(PerlIO_stderr(), "panic: top_env, v=%d\n", (int)v); \
+        PerlIO_printf(PerlIO_stderr(), "panic: top_env, v=%d\n", (int)(v)); \
         PerlProc_exit(1);                                      \
     } STMT_END
 
 #define CATCH_GET              (PL_top_env->je_mustcatch)
 #define CATCH_SET(v) \
     STMT_START {                                                       \
-        DEBUG_l(                                                       \
+        DEBUG_l(                                                        \
             Perl_deb(aTHX_                                             \
-                "JUMPLEVEL set catch %d => %d (for %p) at %s:%d\n",    \
-                 PL_top_env->je_mustcatch, v, (void*)PL_top_env,       \
-                 __FILE__, __LINE__);)                                 \
+                "JUMPLEVEL set catch %d => %d (for %p) in %s at %s:%d\n",   \
+                 PL_top_env->je_mustcatch, (v), (void*)PL_top_env,      \
+                 SAFE_FUNCTION__, __FILE__, __LINE__);)                        \
         PL_top_env->je_mustcatch = (v);                                        \
     } STMT_END
 
@@ -175,8 +194,8 @@ typedef struct refcounted_he COPHH;
 #define COPHH_EXISTS REFCOUNTED_HE_EXISTS
 
 /*
-=for apidoc  Amx|SV *|cophh_fetch_pvn|const COPHH *cophh|const char *key|STRLEN keylen|U32 hash|U32 flags
-=for apidoc_item|SV *|cophh_fetch_pv |const COPHH *cophh|const char *key              |U32 hash|U32 flags
+=for apidoc  Amx|SV *|cophh_fetch_pv |const COPHH *cophh|const char *key              |U32 hash|U32 flags
+=for apidoc_item|SV *|cophh_fetch_pvn|const COPHH *cophh|const char *key|STRLEN keylen|U32 hash|U32 flags
 =for apidoc_item|SV *|cophh_fetch_pvs|const COPHH *cophh|           "key"                      |U32 flags
 =for apidoc_item|SV *|cophh_fetch_sv |const COPHH *cophh|        SV *key              |U32 hash|U32 flags
 
@@ -206,19 +225,24 @@ the octets.
 =for apidoc Amnh||COPHH_KEY_UTF8
 
 =cut
+
 */
 
-#define cophh_fetch_pvn(cophh, key, keylen, hash, flags) \
-    Perl_refcounted_he_fetch_pvn(aTHX_ cophh, key, keylen, hash, flags)
+#define cophh_fetch_pvn(cophh, key, keylen, hash, flags)                    \
+    Perl_refcounted_he_fetch_pvn(aTHX_ cophh, key, keylen, hash,            \
+                                       (flags & COPHH_KEY_UTF8))
 
-#define cophh_fetch_pvs(cophh, key, flags) \
-    Perl_refcounted_he_fetch_pvn(aTHX_ cophh, STR_WITH_LEN(key), 0, flags)
+#define cophh_fetch_pvs(cophh, key, flags)                                  \
+    Perl_refcounted_he_fetch_pvn(aTHX_ cophh, STR_WITH_LEN(key), 0,         \
+                                       (flags & COPHH_KEY_UTF8))
 
-#define cophh_fetch_pv(cophh, key, hash, flags) \
-    Perl_refcounted_he_fetch_pv(aTHX_ cophh, key, hash, flags)
+#define cophh_fetch_pv(cophh, key, hash, flags)                             \
+    Perl_refcounted_he_fetch_pv(aTHX_ cophh, key, hash,                     \
+                                      (flags & COPHH_KEY_UTF8))
 
-#define cophh_fetch_sv(cophh, key, hash, flags) \
-    Perl_refcounted_he_fetch_sv(aTHX_ cophh, key, hash, flags)
+#define cophh_fetch_sv(cophh, key, hash, flags)                             \
+    Perl_refcounted_he_fetch_sv(aTHX_ cophh, key, hash,                     \
+                                      (flags & COPHH_KEY_UTF8))
 
 /*
 =for apidoc Amx|bool|cophh_exists_pvn|const COPHH *cophh|const char *key|STRLEN keylen|U32 hash|U32 flags
@@ -305,8 +329,8 @@ Generate and return a fresh cop hints hash containing no entries.
 #define cophh_new_empty() ((COPHH *)NULL)
 
 /*
-=for apidoc  Amx|COPHH *|cophh_store_pvn|COPHH *cophh|const char *key|STRLEN keylen|U32 hash|SV *value|U32 flags
-=for apidoc_item|COPHH *|cophh_store_pv |COPHH *cophh|const char *key              |U32 hash|SV *value|U32 flags
+=for apidoc  Amx|COPHH *|cophh_store_pv |COPHH *cophh|const char *key              |U32 hash|SV *value|U32 flags
+=for apidoc_item|COPHH *|cophh_store_pvn|COPHH *cophh|const char *key|STRLEN keylen|U32 hash|SV *value|U32 flags
 =for apidoc_item|COPHH *|cophh_store_pvs|COPHH *cophh|           "key"                      |SV *value|U32 flags
 =for apidoc_item|COPHH *|cophh_store_sv |COPHH *cophh|        SV *key              |U32 hash|SV *value|U32 flags
 
@@ -357,8 +381,8 @@ the octets.
     Perl_refcounted_he_new_sv(aTHX_ cophh, key, hash, value, flags)
 
 /*
-=for apidoc  Amx|COPHH *|cophh_delete_pvn|COPHH *cophh|const char *key|STRLEN keylen|U32 hash|U32 flags
-=for apidoc_item|COPHH *|cophh_delete_pv |COPHH *cophh|const char *key              |U32 hash|U32 flags
+=for apidoc  Amx|COPHH *|cophh_delete_pv |COPHH *cophh|const char *key              |U32 hash|U32 flags
+=for apidoc_item|COPHH *|cophh_delete_pvn|COPHH *cophh|const char *key|STRLEN keylen|U32 hash|U32 flags
 =for apidoc_item|COPHH *|cophh_delete_pvs|COPHH *cophh|           "key"                      |U32 flags
 =for apidoc_item|COPHH *|cophh_delete_sv |COPHH *cophh|        SV *key              |U32 hash|U32 flags
 
@@ -415,15 +439,20 @@ struct cop {
 #ifdef USE_ITHREADS
     PADOFFSET  cop_stashoff;   /* offset into PL_stashpad, for the
                                    package the line was compiled in */
-    char *     cop_file;       /* name of file this command is from */
+    char *      cop_file;       /* rcpv containing name of file this command is from */
 #else
     HV *       cop_stash;      /* package line was compiled in */
     GV *       cop_filegv;     /* name of GV file this command is from */
 #endif
     U32                cop_hints;      /* hints bits from pragmata */
     U32                cop_seq;        /* parse sequence number */
-    /* Beware. mg.c and warnings.pl assume the type of this is STRLEN *:  */
-    STRLEN *   cop_warnings;   /* lexical warnings bitmask */
+    char *      cop_warnings;   /* Lexical warnings bitmask vector.
+                                   Refcounted shared copy of ${^WARNING_BITS}.
+                                   This pointer either points at one of the
+                                   magic values for warnings, or it points
+                                   at a buffer constructed with rcpv_new().
+                                   Use the RCPV_LEN() macro to get its length.
+                                 */
     /* compile time state of %^H.  See the comment in op.c for how this is
        used to recreate a hash to return from caller.  */
     COPHH *    cop_hints_hash;
@@ -439,7 +468,10 @@ struct cop {
 =for apidoc Am|const char *|CopFILE|const COP * c
 Returns the name of the file associated with the C<COP> C<c>
 
-=for apidoc Am|STRLEN|CopLINE|const COP * c
+=for apidoc Am|const char *|CopFILE_LEN|const COP * c
+Returns the length of the file associated with the C<COP> C<c>
+
+=for apidoc Am|line_t|CopLINE|const COP * c
 Returns the line number in the source code associated with the C<COP> C<c>
 
 =for apidoc Am|AV *|CopFILEAV|const COP * c
@@ -455,6 +487,17 @@ Returns the SV associated with the C<COP> C<c>
 =for apidoc Am|void|CopFILE_set|COP * c|const char * pv
 Makes C<pv> the name of the file associated with the C<COP> C<c>
 
+=for apidoc Am|void|CopFILE_setn|COP * c|const char * pv|STRLEN len
+Makes C<pv> the name of the file associated with the C<COP> C<c>
+
+=for apidoc Am|void|CopFILE_copy|COP * dst|COP * src
+Efficiently copies the cop file name from one COP to another. Wraps
+the required logic to do a refcounted copy under threads or not.
+
+=for apidoc Am|void|CopFILE_free|COP * c
+Frees the file data in a cop. Under the hood this is a refcounting
+operation.
+
 =for apidoc Am|GV *|CopFILEGV|const COP * c
 Returns the GV associated with the C<COP> C<c>
 
@@ -482,14 +525,113 @@ string C<p>, creating the package if necessary.
 =cut
 */
 
+/*
+=for apidoc Am|RCPV *|RCPVx|char *pv
+Returns the RCPV structure (struct rcpv) for a refcounted
+string pv created with C<rcpv_new()>.
+No checks are performed to ensure that C<pv> was actually allocated
+with C<rcpv_new()>, it is the callers responsibility to ensure that
+this is the case.
+
+=for apidoc Am|RCPV *|RCPV_REFCOUNT|char *pv
+Returns the refcount for a pv created with C<rcpv_new()>. 
+No checks are performed to ensure that C<pv> was actually allocated
+with C<rcpv_new()>, it is the callers responsibility to ensure that
+this is the case.
+
+=for apidoc Am|RCPV *|RCPV_REFCNT_inc|char *pv
+Increments the refcount for a C<char *> pointer which was created
+with a call to C<rcpv_new()>. Same as calling rcpv_copy().
+No checks are performed to ensure that C<pv> was actually allocated
+with C<rcpv_new()>, it is the callers responsibility to ensure that
+this is the case.
+
+=for apidoc Am|RCPV *|RCPV_REFCNT_dec|char *pv
+Decrements the refcount for a C<char *> pointer which was created
+with a call to C<rcpv_new()>. Same as calling rcpv_free().
+No checks are performed to ensure that C<pv> was actually allocated
+with C<rcpv_new()>, it is the callers responsibility to ensure that
+this is the case.
+
+=for apidoc Am|RCPV *|RCPV_LEN|char *pv
+Returns the length of a pv created with C<rcpv_new()>.
+Note that this reflects the length of the string from the callers
+point of view, it does not include the mandatory null which is
+always injected at the end of the string by rcpv_new().
+No checks are performed to ensure that C<pv> was actually allocated
+with C<rcpv_new()>, it is the callers responsibility to ensure that
+this is the case.
+
+=cut
+*/
+
+struct rcpv {
+    STRLEN  refcount;  /* UV would mean a 64 refcnt on
+                          32 bit builds with -Duse64bitint */
+    STRLEN  len;       /* length of string including mandatory
+                          null byte at end */
+    char    pv[1];
+};
+typedef struct rcpv RCPV;
+
+#define RCPVf_USE_STRLEN    (1 << 0)
+#define RCPVf_NO_COPY       (1 << 1)
+#define RCPVf_ALLOW_EMPTY   (1 << 2)
+
+#define RCPVx(pv_arg)       ((RCPV *)((pv_arg) - STRUCT_OFFSET(struct rcpv, pv)))
+#define RCPV_REFCOUNT(pv)   (RCPVx(pv)->refcount)
+#define RCPV_LEN(pv)        (RCPVx(pv)->len-1) /* len always includes space for a null */
+#define RCPV_REFCNT_inc(pv) rcpv_copy(pv)
+#define RCPV_REFCNT_dec(pv) rcpv_free(pv)
+
 #ifdef USE_ITHREADS
 
-#  define CopFILE(c)           ((c)->cop_file)
+#  define CopFILE(c)            ((c)->cop_file)
+#  define CopFILE_LEN(c)        (CopFILE(c) ? RCPV_LEN(CopFILE(c)) : 0)
 #  define CopFILEGV(c)         (CopFILE(c) \
                                  ? gv_fetchfile(CopFILE(c)) : NULL)
 
-#  define CopFILE_set(c,pv)    ((c)->cop_file = savesharedpv(pv))
-#  define CopFILE_setn(c,pv,l)  ((c)->cop_file = savesharedpvn((pv),(l)))
+#  define CopFILE_set_x(c,pv)       ((c)->cop_file = rcpv_new((pv),0,RCPVf_USE_STRLEN))
+#  define CopFILE_setn_x(c,pv,l)    ((c)->cop_file = rcpv_new((pv),(l),0))
+#  define CopFILE_free_x(c)         ((c)->cop_file = rcpv_free((c)->cop_file))
+#  define CopFILE_copy_x(dst,src)   ((dst)->cop_file = rcpv_copy((src)->cop_file))
+
+/* change condition to 1 && to enable this debugging */
+#  define CopFILE_debug(c,t,rk)                 \
+    if (0 && (c)->cop_file)                     \
+        PerlIO_printf(Perl_debug_log,           \
+            "%-14s THX:%p OP:%p PV:%p rc: "     \
+            "%6zu fn: '%.*s' at %s line %d\n",  \
+            (t), aTHX, (c), (c)->cop_file,      \
+            RCPV_REFCOUNT((c)->cop_file)-rk,    \
+            (int)RCPV_LEN((c)->cop_file),       \
+            (c)->cop_file,__FILE__,__LINE__)    \
+
+
+#  define CopFILE_set(c,pv)                     \
+    STMT_START {                                \
+        CopFILE_set_x(c,pv);                    \
+        CopFILE_debug(c,"CopFILE_set", 0);      \
+    } STMT_END
+
+#  define CopFILE_setn(c,pv,l)                  \
+    STMT_START {                                \
+        CopFILE_setn_x(c,pv,l);                 \
+        CopFILE_debug(c,"CopFILE_setn", 0);     \
+    } STMT_END
+
+#  define CopFILE_copy(dst,src)                 \
+    STMT_START {                                \
+        CopFILE_copy_x((dst),(src));            \
+        CopFILE_debug((dst),"CopFILE_copy", 0); \
+    } STMT_END
+
+#  define CopFILE_free(c)                       \
+    STMT_START {                                \
+        CopFILE_debug((c),"CopFILE_free", 1);   \
+        CopFILE_free_x(c);                      \
+    } STMT_END
+
 
 #  define CopFILESV(c)         (CopFILE(c) \
                                  ? GvSV(gv_fetchfile(CopFILE(c))) : NULL)
@@ -502,13 +644,13 @@ string C<p>, creating the package if necessary.
 #  define CopSTASH_set(c,hv)   ((c)->cop_stashoff = (hv)               \
                                     ? alloccopstash(hv)                        \
                                     : 0)
-#  define CopFILE_free(c)      (PerlMemShared_free(CopFILE(c)),(CopFILE(c) = NULL))
 
 #else /* Above: yes threads; Below no threads */
 
 #  define CopFILEGV(c)         ((c)->cop_filegv)
 #  define CopFILEGV_set(c,gv)  ((c)->cop_filegv = (GV*)SvREFCNT_inc(gv))
 #  define CopFILE_set(c,pv)    CopFILEGV_set((c), gv_fetchfile(pv))
+#  define CopFILE_copy(dst,src) CopFILEGV_set((dst),CopFILEGV(src))
 #  define CopFILE_setn(c,pv,l) CopFILEGV_set((c), gv_fetchfile_flags((pv),(l),0))
 #  define CopFILESV(c)         (CopFILEGV(c) ? GvSV(CopFILEGV(c)) : NULL)
 #  define CopFILEAV(c)         (CopFILEGV(c) ? GvAV(CopFILEGV(c)) : NULL)
@@ -520,6 +662,8 @@ string C<p>, creating the package if necessary.
 #  define CopFILEAVn(c)         (CopFILEGV(c) ? GvAVn(CopFILEGV(c)) : NULL)
 #  define CopFILE(c)           (CopFILEGV(c) /* +2 for '_<' */         \
                                     ? GvNAME(CopFILEGV(c))+2 : NULL)
+#  define CopFILE_LEN(c)       (CopFILEGV(c) /* -2 for '_<' */         \
+                                    ? GvNAMELEN(CopFILEGV(c))-2 : 0)
 #  define CopSTASH(c)          ((c)->cop_stash)
 #  define CopSTASH_set(c,hv)   ((c)->cop_stash = (hv))
 #  define CopFILE_free(c)      (SvREFCNT_dec(CopFILEGV(c)),(CopFILEGV(c) = NULL))
@@ -534,10 +678,12 @@ string C<p>, creating the package if necessary.
 #define CopHINTHASH_get(c)     ((COPHH*)((c)->cop_hints_hash))
 #define CopHINTHASH_set(c,h)   ((c)->cop_hints_hash = (h))
 
+#define CopFEATURES_setfrom(dst, src) ((dst)->cop_features = (src)->cop_features)
+
 /*
-=for apidoc   Am|SV *|cop_hints_fetch_pvn|const COP *cop|const char *key|STRLEN keylen|U32 hash|U32 flags
-=for apidoc_item|SV *|cop_hints_fetch_pv |const COP *cop|const char *key              |U32 hash|U32 flags
-=for apidoc_item|SV *|cop_hints_fetch_pvs|const COP *cop|           "key"                      |U32 flags
+=for apidoc   Am|SV *|cop_hints_fetch_pv |const COP *cop|const char *key              |U32 hash|U32 flags
+=for apidoc_item|SV *|cop_hints_fetch_pvn|const COP *cop|const char *key|STRLEN keylen|U32 hash|U32 flags
+=for apidoc_item|SV *|cop_hints_fetch_pvs|const COP *cop|           "key"             |U32 flags
 =for apidoc_item|SV *|cop_hints_fetch_sv |const COP *cop|        SV *key              |U32 hash|U32 flags
 
 These look up the hint entry in the cop C<cop> with the key specified by
@@ -579,8 +725,8 @@ the octets.
     cophh_fetch_sv(CopHINTHASH_get(cop), key, hash, flags)
 
 /*
-=for apidoc   Am|bool|cop_hints_exists_pvn|const COP *cop|const char *key|STRLEN keylen|U32 hash|U32 flags
-=for apidoc_item|bool|cop_hints_exists_pv |const COP *cop|const char *key              |U32 hash|U32 flags
+=for apidoc  Am|bool|cop_hints_exists_pv |const COP *cop|const char *key|U32 hash               |U32 flags
+=for apidoc_item|bool|cop_hints_exists_pvn|const COP *cop|const char *key|STRLEN keylen|U32 hash|U32 flags
 =for apidoc_item|bool|cop_hints_exists_pvs|const COP *cop|           "key"                      |U32 flags
 =for apidoc_item|bool|cop_hints_exists_sv |const COP *cop|        SV *key              |U32 hash|U32 flags
 
@@ -766,7 +912,7 @@ struct block_eval {
 
 /* blk_u16 bit usage for eval contexts: */
 
-#define CxOLD_IN_EVAL(cx)      (((cx)->blk_u16) & 0x3F) /* saved PL in_eval */
+#define CxOLD_IN_EVAL(cx)      (((cx)->blk_u16) & 0x3F) /* saved PL_in_eval */
 #define CxEVAL_TXT_REFCNTED(cx)        (((cx)->blk_u16) & 0x40) /* cur_text rc++ */
 #define CxOLD_OP_TYPE(cx)      (((cx)->blk_u16) >> 7)   /* type of eval op */
 
@@ -793,7 +939,7 @@ struct block_loop {
         } lazyiv;
         struct { /* CXt_LOOP_LAZYSV C<for ('a'..'z')> */
             SV * cur;
-            SV * end; /* maxiumum value (or minimum in reverse) */
+            SV * end; /* maximum value (or minimum in reverse) */
         } lazysv;
     } state_u;
 #ifdef USE_ITHREADS
@@ -808,9 +954,9 @@ struct block_loop {
                 ? &GvSV((c)->blk_loop.itervar_u.gv)     \
                 : (SV **)&(c)->blk_loop.itervar_u.gv)
 
-#define CxLABEL(c)     (0 + CopLABEL((c)->blk_oldcop))
-#define CxLABEL_len(c,len)     (0 + CopLABEL_len((c)->blk_oldcop, len))
-#define CxLABEL_len_flags(c,len,flags) (0 + CopLABEL_len_flags((c)->blk_oldcop, len, flags))
+#define CxLABEL(c)     (CopLABEL((c)->blk_oldcop))
+#define CxLABEL_len(c,len)     (CopLABEL_len((c)->blk_oldcop, len))
+#define CxLABEL_len_flags(c,len,flags) ((const char *)CopLABEL_len_flags((c)->blk_oldcop, len, flags))
 #define CxHASARGS(c)   (((c)->cx_type & CXp_HASARGS) == CXp_HASARGS)
 
 /* CxLVAL(): the lval flags of the call site: the relevant flag bits from
@@ -875,7 +1021,7 @@ struct block {
 
 #define CX_DEBUG(cx, action)                                           \
     DEBUG_l(                                                           \
-        Perl_deb(aTHX_ "CX %ld %s %s (scope %ld,%ld) (save %ld,%ld) at %s:%d\n",\
+        Perl_deb(aTHX_ "CX %ld %s %s (scope %ld,%ld) (save %ld,%ld) in %s at %s:%d\n",\
                     (long)cxstack_ix,                                  \
                     action,                                            \
                     PL_block_type[CxTYPE(cx)],                         \
@@ -883,7 +1029,7 @@ struct block {
                     (long)(cx->blk_oldscopesp),                                \
                     (long)PL_savestack_ix,                             \
                     (long)(cx->blk_oldsaveix),                          \
-                    __FILE__, __LINE__));
+                    SAFE_FUNCTION__, __FILE__, __LINE__));
 
 
 
@@ -1130,10 +1276,10 @@ typedef struct stackinfo PERL_SI;
 #define cxstack_max    (PL_curstackinfo->si_cxmax)
 
 #ifdef DEBUGGING
-#  define      SET_MARK_OFFSET \
+#  define SET_MARK_OFFSET \
     PL_curstackinfo->si_markoff = PL_markstack_ptr - PL_markstack
 #else
-#  define      SET_MARK_OFFSET NOOP
+#  define SET_MARK_OFFSET NOOP
 #endif
 
 #if defined DEBUGGING && !defined DEBUGGING_RE_ONLY
@@ -1148,8 +1294,8 @@ typedef struct stackinfo PERL_SI;
         DEBUG_l({                                                      \
             int i = 0; PERL_SI *p = PL_curstackinfo;                   \
             while (p) { i++; p = p->si_prev; }                         \
-            Perl_deb(aTHX_ "push STACKINFO %d at %s:%d\n",             \
-                         i, __FILE__, __LINE__);})                     \
+            Perl_deb(aTHX_ "push STACKINFO %d in %s at %s:%d\n",        \
+                         i, SAFE_FUNCTION__, __FILE__, __LINE__);})        \
         if (!next) {                                                   \
             next = new_stackinfo(32, 2048/sizeof(PERL_CONTEXT) - 1);   \
             next->si_prev = PL_curstackinfo;                           \
@@ -1176,8 +1322,8 @@ typedef struct stackinfo PERL_SI;
         DEBUG_l({                                                      \
             int i = -1; PERL_SI *p = PL_curstackinfo;                  \
             while (p) { i++; p = p->si_prev; }                         \
-            Perl_deb(aTHX_ "pop  STACKINFO %d at %s:%d\n",             \
-                         i, __FILE__, __LINE__);})                     \
+            Perl_deb(aTHX_ "pop  STACKINFO %d in %s at %s:%d\n",        \
+                         i, SAFE_FUNCTION__, __FILE__, __LINE__);})        \
         if (!prev) {                                                   \
             Perl_croak_popstack();                                     \
         }                                                              \
@@ -1212,17 +1358,17 @@ program; otherwise 0;
 /*
 =for apidoc_section $multicall
 
-=for apidoc Amns||dMULTICALL
+=for apidoc Amn;||dMULTICALL
 Declare local variables for a multicall.  See L<perlcall/LIGHTWEIGHT CALLBACKS>.
 
-=for apidoc Ams||PUSH_MULTICALL|CV* the_cv
+=for apidoc Am;||PUSH_MULTICALL|CV* the_cv
 Opening bracket for a lightweight callback.
 See L<perlcall/LIGHTWEIGHT CALLBACKS>.
 
-=for apidoc Amns||MULTICALL
+=for apidoc Amn;||MULTICALL
 Make a lightweight callback.  See L<perlcall/LIGHTWEIGHT CALLBACKS>.
 
-=for apidoc Amns||POP_MULTICALL
+=for apidoc Amn;||POP_MULTICALL
 Closing bracket for a lightweight callback.
 See L<perlcall/LIGHTWEIGHT CALLBACKS>.
 
index 19dcad2..1e257b5 100644 (file)
@@ -2,7 +2,7 @@
 # vim: ts=4 sts=4 sw=4:
 use strict;
 package CPAN;
-$CPAN::VERSION = '2.33';
+$CPAN::VERSION = '2.36';
 $CPAN::VERSION =~ s/_//;
 
 # we need to run chdir all over and we would get at wrong libraries
index d346a6b..6ce0572 100644 (file)
@@ -9,7 +9,7 @@ use File::Path ();
 use POSIX ":sys_wait_h"; 
 @CPAN::Distribution::ISA = qw(CPAN::InfoObj);
 use vars qw($VERSION);
-$VERSION = "2.33";
+$VERSION = "2.34";
 
 my $run_allow_installing_within_test = 1; # boolean; either in test or in install, there is no third option
 
@@ -2950,7 +2950,7 @@ sub prereqs_for_slot {
         }
         if (-f "Build.PL"
             && ! -f File::Spec->catfile($self->{build_dir},"Makefile.PL")
-            && ! $merged->requirements_for_module("Module::Build")
+            && ! @{[ $merged->required_modules ]}
             && ! $CPAN::META->has_inst("Module::Build")
            ) {
             $CPAN::Frontend->mywarn(
index 4fc792c..b2c86d0 100644 (file)
@@ -6,7 +6,7 @@ use vars qw(@ISA);
 use CPAN::HTTP::Credentials;
 use HTTP::Tiny 0.005;
 
-$CPAN::HTTP::Client::VERSION = $CPAN::HTTP::Client::VERSION = "1.9601";
+$CPAN::HTTP::Client::VERSION = $CPAN::HTTP::Client::VERSION = "1.9602";
 
 # CPAN::HTTP::Client is adapted from parts of cpanm by Tatsuhiko Miyagawa
 # and parts of LWP by Gisle Aas
@@ -32,6 +32,7 @@ sub mirror {
 
     my $want_proxy = $self->_want_proxy($uri);
     my $http = HTTP::Tiny->new(
+        verify_SSL => 1,
         $want_proxy ? (proxy => $self->{proxy}) : ()
     );
 
index fd56767..83a261f 100644 (file)
@@ -391,7 +391,7 @@ new(className, appendOut=1, blockSize100k=1, workfactor=0, verbosity=0)
         SV* obj = sv_2mortal(newSViv(PTR2IV(s))) ;
         XPUSHs(obj);
     }
-    if (GIMME == G_ARRAY) {
+    if (GIMME_V == G_ARRAY) {
         SV * sv = sv_2mortal(newSViv(err)) ;
        setDUALstatus(sv, err);
         XPUSHs(sv) ;
@@ -447,7 +447,7 @@ new(className, appendOut=1 , consume=1, small=0, verbosity=0, limitOutput=0)
         SV* obj = sv_2mortal(newSViv(PTR2IV(s))) ;
         XPUSHs(obj);
     }
-    if (GIMME == G_ARRAY) {
+    if (GIMME_V == G_ARRAY) {
         SV * sv = sv_2mortal(newSViv(err)) ;
        setDUALstatus(sv, err);
         XPUSHs(sv) ;
index 92d81fe..04d3abc 100644 (file)
@@ -11,7 +11,7 @@
    bzip2/libbzip2 version 1.0.8 of 13 July 2019
    Copyright (C) 1996-2019 Julian Seward <jseward@acm.org>
 
-   Please read the WARNING, DISCLAIMER and PATENTS sections in the 
+   Please read the WARNING, DISCLAIMER and PATENTS sections in the
    README file.
 
    This program is released under the terms of the license contained
 /*---------------------------------------------*/
 
 /*---------------------------------------------*/
-static 
+static
 __inline__
-void fallbackSimpleSort ( UInt32* fmap, 
-                          UInt32* eclass, 
-                          Int32   lo, 
+void fallbackSimpleSort ( UInt32* fmap,
+                          UInt32* eclass,
+                          Int32   lo,
                           Int32   hi )
 {
    Int32 i, j, tmp;
@@ -90,9 +90,9 @@ void fallbackSimpleSort ( UInt32* fmap,
 
 
 static
-void fallbackQSort3 ( UInt32* fmap, 
+void fallbackQSort3 ( UInt32* fmap,
                       UInt32* eclass,
-                      Int32   loSt, 
+                      Int32   loSt,
                       Int32   hiSt )
 {
    Int32 unLo, unHi, ltLo, gtHi, n, m;
@@ -117,9 +117,9 @@ void fallbackQSort3 ( UInt32* fmap,
       }
 
       /* Random partitioning.  Median of 3 sometimes fails to
-         avoid bad cases.  Median of 9 seems to help but 
+         avoid bad cases.  Median of 9 seems to help but
          looks rather expensive.  This too seems to work but
-         is cheaper.  Guidance for the magic constants 
+         is cheaper.  Guidance for the magic constants
          7621 and 32768 is taken from Sedgewick's algorithms
          book, chapter 35.
       */
@@ -136,10 +136,10 @@ void fallbackQSort3 ( UInt32* fmap,
          while (1) {
             if (unLo > unHi) break;
             n = (Int32)eclass[fmap[unLo]] - (Int32)med;
-            if (n == 0) { 
-               fswap(fmap[unLo], fmap[ltLo]); 
-               ltLo++; unLo++; 
-               continue; 
+            if (n == 0) {
+               fswap(fmap[unLo], fmap[ltLo]);
+               ltLo++; unLo++;
+               continue;
             };
             if (n > 0) break;
             unLo++;
@@ -147,10 +147,10 @@ void fallbackQSort3 ( UInt32* fmap,
          while (1) {
             if (unLo > unHi) break;
             n = (Int32)eclass[fmap[unHi]] - (Int32)med;
-            if (n == 0) { 
-               fswap(fmap[unHi], fmap[gtHi]); 
-               gtHi--; unHi--; 
-               continue; 
+            if (n == 0) {
+               fswap(fmap[unHi], fmap[gtHi]);
+               gtHi--; unHi--;
+               continue;
             };
             if (n < 0) break;
             unHi--;
@@ -209,8 +209,8 @@ void fallbackQSort3 ( UInt32* fmap,
 #define UNALIGNED_BH(zz)  ((zz) & 0x01f)
 
 static
-void fallbackSort ( UInt32* fmap, 
-                    UInt32* eclass, 
+void fallbackSort ( UInt32* fmap,
+                    UInt32* eclass,
                     UInt32* bhtab,
                     Int32   nblock,
                     Int32   verb )
@@ -251,7 +251,7 @@ void fallbackSort ( UInt32* fmap,
    --*/
 
    /*-- set sentinel bits for block-end detection --*/
-   for (i = 0; i < 32; i++) { 
+   for (i = 0; i < 32; i++) {
       SET_BH(nblock + 2*i);
       CLEAR_BH(nblock + 2*i + 1);
    }
@@ -260,7 +260,7 @@ void fallbackSort ( UInt32* fmap,
    H = 1;
    while (1) {
 
-      if (verb >= 4) 
+      if (verb >= 4)
          VPrintf1 ( "        depth %6d has ", H );
 
       j = 0;
@@ -305,14 +305,14 @@ void fallbackSort ( UInt32* fmap,
          }
       }
 
-      if (verb >= 4) 
+      if (verb >= 4)
          VPrintf1 ( "%6d unresolved strings\n", nNotDone );
 
       H *= 2;
       if (H > nblock || nNotDone == 0) break;
    }
 
-   /*-- 
+   /*--
       Reconstruct the original block in
       eclass8 [0 .. nblock-1], since the
       previous phase destroyed it.
@@ -344,9 +344,9 @@ void fallbackSort ( UInt32* fmap,
 /*---------------------------------------------*/
 static
 __inline__
-Bool mainGtU ( UInt32  i1, 
+Bool mainGtU ( UInt32  i1,
                UInt32  i2,
-               UChar*  block, 
+               UChar*  block,
                UInt16* quadrant,
                UInt32  nblock,
                Int32*  budget )
@@ -486,8 +486,8 @@ void mainSimpleSort ( UInt32* ptr,
                       UChar*  block,
                       UInt16* quadrant,
                       Int32   nblock,
-                      Int32   lo, 
-                      Int32   hi, 
+                      Int32   lo,
+                      Int32   hi,
                       Int32   d,
                       Int32*  budget )
 {
@@ -511,8 +511,8 @@ void mainSimpleSort ( UInt32* ptr,
          if (i > hi) break;
          v = ptr[i];
          j = i;
-         while ( mainGtU ( 
-                    ptr[j-h]+d, v+d, block, quadrant, nblock, budget 
+         while ( mainGtU (
+                    ptr[j-h]+d, v+d, block, quadrant, nblock, budget
                  ) ) {
             ptr[j] = ptr[j-h];
             j = j - h;
@@ -525,8 +525,8 @@ void mainSimpleSort ( UInt32* ptr,
          if (i > hi) break;
          v = ptr[i];
          j = i;
-         while ( mainGtU ( 
-                    ptr[j-h]+d, v+d, block, quadrant, nblock, budget 
+         while ( mainGtU (
+                    ptr[j-h]+d, v+d, block, quadrant, nblock, budget
                  ) ) {
             ptr[j] = ptr[j-h];
             j = j - h;
@@ -539,8 +539,8 @@ void mainSimpleSort ( UInt32* ptr,
          if (i > hi) break;
          v = ptr[i];
          j = i;
-         while ( mainGtU ( 
-                    ptr[j-h]+d, v+d, block, quadrant, nblock, budget 
+         while ( mainGtU (
+                    ptr[j-h]+d, v+d, block, quadrant, nblock, budget
                  ) ) {
             ptr[j] = ptr[j-h];
             j = j - h;
@@ -578,13 +578,13 @@ void mainSimpleSort ( UInt32* ptr,
    }                                  \
 }
 
-static 
+static
 __inline__
 UChar mmed3 ( UChar a, UChar b, UChar c )
 {
    UChar t;
    if (a > b) { t = a; a = b; b = t; };
-   if (b > c) { 
+   if (b > c) {
       b = c;
       if (a > b) b = a;
    }
@@ -622,8 +622,8 @@ void mainQSort3 ( UInt32* ptr,
                   UChar*  block,
                   UInt16* quadrant,
                   Int32   nblock,
-                  Int32   loSt, 
-                  Int32   hiSt, 
+                  Int32   loSt,
+                  Int32   hiSt,
                   Int32   dSt,
                   Int32*  budget )
 {
@@ -646,14 +646,14 @@ void mainQSort3 ( UInt32* ptr,
       AssertH ( sp < MAIN_QSORT_STACK_SIZE - 2, 1001 );
 
       mpop ( lo, hi, d );
-      if (hi - lo < MAIN_QSORT_SMALL_THRESH || 
+      if (hi - lo < MAIN_QSORT_SMALL_THRESH ||
           d > MAIN_QSORT_DEPTH_THRESH) {
          mainSimpleSort ( ptr, block, quadrant, nblock, lo, hi, d, budget );
          if (*budget < 0) return;
          continue;
       }
 
-      med = (Int32) 
+      med = (Int32)
             mmed3 ( block[ptr[ lo         ]+d],
                     block[ptr[ hi         ]+d],
                     block[ptr[ (lo+hi)>>1 ]+d] );
@@ -665,9 +665,9 @@ void mainQSort3 ( UInt32* ptr,
          while (True) {
             if (unLo > unHi) break;
             n = ((Int32)block[ptr[unLo]+d]) - med;
-            if (n == 0) { 
-               mswap(ptr[unLo], ptr[ltLo]); 
-               ltLo++; unLo++; continue; 
+            if (n == 0) {
+               mswap(ptr[unLo], ptr[ltLo]);
+               ltLo++; unLo++; continue;
             };
             if (n >  0) break;
             unLo++;
@@ -675,9 +675,9 @@ void mainQSort3 ( UInt32* ptr,
          while (True) {
             if (unLo > unHi) break;
             n = ((Int32)block[ptr[unHi]+d]) - med;
-            if (n == 0) { 
-               mswap(ptr[unHi], ptr[gtHi]); 
-               gtHi--; unHi--; continue; 
+            if (n == 0) {
+               mswap(ptr[unHi], ptr[gtHi]);
+               gtHi--; unHi--; continue;
             };
             if (n <  0) break;
             unHi--;
@@ -748,9 +748,9 @@ void mainQSort3 ( UInt32* ptr,
 #define CLEARMASK (~(SETMASK))
 
 static
-void mainSort ( UInt32* ptr, 
+void mainSort ( UInt32* ptr,
                 UChar*  block,
-                UInt16* quadrant, 
+                UInt16* quadrant,
                 UInt32* ftab,
                 Int32   nblock,
                 Int32   verb,
@@ -878,7 +878,7 @@ void mainSort ( UInt32* ptr,
       /*--
          Step 1:
          Complete the big bucket [ss] by quicksorting
-         any unsorted small buckets [ss, j], for j != ss.  
+         any unsorted small buckets [ss, j], for j != ss.
          Hopefully previous pointer-scanning phases have already
          completed many of the small buckets [ss, j], so
          we don't have to sort them at all.
@@ -894,10 +894,10 @@ void mainSort ( UInt32* ptr,
                      VPrintf4 ( "        qsort [0x%x, 0x%x]   "
                                 "done %d   this %d\n",
                                 ss, j, numQSorted, hi - lo + 1 );
-                  mainQSort3 ( 
-                     ptr, block, quadrant, nblock, 
-                     lo, hi, BZ_N_RADIX, budget 
-                  );   
+                  mainQSort3 (
+                     ptr, block, quadrant, nblock,
+                     lo, hi, BZ_N_RADIX, budget
+                  );
                   numQSorted += (hi - lo + 1);
                   if (*budget < 0) return;
                }
@@ -929,16 +929,16 @@ void mainSort ( UInt32* ptr,
          for (j = (ftab[(ss+1) << 8] & CLEARMASK) - 1; j > copyEnd[ss]; j--) {
             k = ptr[j]-1; if (k < 0) k += nblock;
             c1 = block[k];
-            if (!bigDone[c1]) 
+            if (!bigDone[c1])
                ptr[ copyEnd[c1]-- ] = k;
          }
       }
 
       AssertH ( (copyStart[ss]-1 == copyEnd[ss])
-                || 
+                ||
                 /* Extremely rare case missing in bzip2-1.0.0 and 1.0.1.
-                   Necessity for this case is demonstrated by compressing 
-                   a sequence of approximately 48.5 million of character 
+                   Necessity for this case is demonstrated by compressing
+                   a sequence of approximately 48.5 million of character
                    251; 1.0.0/1.0.1 will then die here. */
                 (copyStart[ss] == 0 && copyEnd[ss] == nblock-1),
                 1007 )
@@ -955,7 +955,7 @@ void mainSort ( UInt32* ptr,
          updating for the last bucket is pointless.
 
          The quadrant array provides a way to incrementally
-         cache sort orderings, as they appear, so as to 
+         cache sort orderings, as they appear, so as to
          make subsequent comparisons in fullGtU() complete
          faster.  For repetitive blocks this makes a big
          difference (but not big enough to be able to avoid
@@ -965,9 +965,9 @@ void mainSort ( UInt32* ptr,
 
             for 0 <= i < nblock and 0 <= j <= nblock
 
-            if block[i] != block[j], 
+            if block[i] != block[j],
 
-               then the relative values of quadrant[i] and 
+               then the relative values of quadrant[i] and
                     quadrant[j] are meaningless.
 
                else {
@@ -1030,7 +1030,7 @@ void mainSort ( UInt32* ptr,
 */
 void BZ2_blockSort ( EState* s )
 {
-   UInt32* ptr    = s->ptr; 
+   UInt32* ptr    = s->ptr;
    UChar*  block  = s->block;
    UInt32* ftab   = s->ftab;
    Int32   nblock = s->nblock;
@@ -1054,8 +1054,8 @@ void BZ2_blockSort ( EState* s )
       quadrant = (UInt16*)(&(block[i]));
 
       /* (wfact-1) / 3 puts the default-factor-30
-         transition point at very roughly the same place as 
-         with v0.1 and v0.9.0.  
+         transition point at very roughly the same place as
+         with v0.1 and v0.9.0.
          Not that it particularly matters any more, since the
          resulting compressed stream is now the same regardless
          of whether or not we use the main sort or fallback sort.
@@ -1066,14 +1066,14 @@ void BZ2_blockSort ( EState* s )
       budget = budgetInit;
 
       mainSort ( ptr, block, quadrant, ftab, nblock, verb, &budget );
-      if (verb >= 3) 
+      if (verb >= 3)
          VPrintf3 ( "      %d work, %d block, ratio %5.2f\n",
                     budgetInit - budget,
-                    nblock, 
+                    nblock,
                     (float)(budgetInit - budget) /
-                    (float)(nblock==0 ? 1 : nblock) ); 
+                    (float)(nblock==0 ? 1 : nblock) );
       if (budget < 0) {
-         if (verb >= 2) 
+         if (verb >= 2)
             VPrintf0 ( "    too repetitive; using fallback"
                        " sorting algorithm\n" );
          fallbackSort ( s->arr1, s->arr2, ftab, nblock, verb );
index 612175d..88118bf 100644 (file)
@@ -1415,7 +1415,7 @@ BZFILE * bzopen_or_bzdopen
       case 's':
          smallMode = 1; break;
       default:
-         if (isdigit((int)(*mode))) {
+         if (isdigit((unsigned char)(*mode))) {
             blockSize100k = *mode-BZ_HDR_0;
          }
       }
index 1666cf0..d977453 100644 (file)
@@ -11,7 +11,7 @@
    bzip2/libbzip2 version 1.0.8 of 13 July 2019
    Copyright (C) 1996-2019 Julian Seward <jseward@acm.org>
 
-   Please read the WARNING, DISCLAIMER and PATENTS sections in the 
+   Please read the WARNING, DISCLAIMER and PATENTS sections in the
    README file.
 
    This program is released under the terms of the license contained
@@ -22,7 +22,7 @@
 /* CHANGES
     0.9.0    -- original version.
     0.9.0a/b -- no changes in this file.
-    0.9.0c   -- changed setting of nGroups in sendMTFValues() 
+    0.9.0c   -- changed setting of nGroups in sendMTFValues()
                 so as to do a bit better on small files
 */
 
@@ -125,11 +125,11 @@ void generateMTFValues ( EState* s )
    Int32   wr;
    Int32   EOB;
 
-   /* 
+   /*
       After sorting (eg, here),
          s->arr1 [ 0 .. s->nblock-1 ] holds sorted order,
          and
-         ((UChar*)s->arr2) [ 0 .. s->nblock-1 ] 
+         ((UChar*)s->arr2) [ 0 .. s->nblock-1 ]
          holds the original block data.
 
       The first thing to do is generate the MTF values,
@@ -144,7 +144,7 @@ void generateMTFValues ( EState* s )
          (UChar*) (&((UChar*)s->arr2)[s->nblock])
 
       These storage aliases are set up in bzCompressInit(),
-      except for the last one, which is arranged in 
+      except for the last one, which is arranged in
       compressBlock().
    */
    UInt32* ptr   = s->ptr;
@@ -167,7 +167,7 @@ void generateMTFValues ( EState* s )
       ll_i = s->unseqToSeq[block[j]];
       AssertD ( ll_i < s->nInUse, "generateMTFValues(2a)" );
 
-      if (yy[0] == ll_i) { 
+      if (yy[0] == ll_i) {
          zPend++;
       } else {
 
@@ -175,11 +175,11 @@ void generateMTFValues ( EState* s )
             zPend--;
             while (True) {
                if (zPend & 1) {
-                  mtfv[wr] = BZ_RUNB; wr++; 
-                  s->mtfFreq[BZ_RUNB]++; 
+                  mtfv[wr] = BZ_RUNB; wr++;
+                  s->mtfFreq[BZ_RUNB]++;
                } else {
-                  mtfv[wr] = BZ_RUNA; wr++; 
-                  s->mtfFreq[BZ_RUNA]++; 
+                  mtfv[wr] = BZ_RUNA; wr++;
+                  s->mtfFreq[BZ_RUNA]++;
                }
                if (zPend < 2) break;
                zPend = (zPend - 2) / 2;
@@ -187,15 +187,15 @@ void generateMTFValues ( EState* s )
             zPend = 0;
          }
          {
-            register UChar  rtmp;
-            register UChar* ryy_j;
-            register UChar  rll_i;
+            UChar  rtmp;
+            UChar* ryy_j;
+            UChar  rll_i;
             rtmp  = yy[1];
             yy[1] = yy[0];
             ryy_j = &(yy[1]);
             rll_i = ll_i;
             while ( rll_i != rtmp ) {
-               register UChar rtmp2;
+               UChar rtmp2;
                ryy_j++;
                rtmp2  = rtmp;
                rtmp   = *ryy_j;
@@ -213,11 +213,11 @@ void generateMTFValues ( EState* s )
       zPend--;
       while (True) {
          if (zPend & 1) {
-            mtfv[wr] = BZ_RUNB; wr++; 
-            s->mtfFreq[BZ_RUNB]++; 
+            mtfv[wr] = BZ_RUNB; wr++;
+            s->mtfFreq[BZ_RUNB]++;
          } else {
-            mtfv[wr] = BZ_RUNA; wr++; 
-            s->mtfFreq[BZ_RUNA]++; 
+            mtfv[wr] = BZ_RUNA; wr++;
+            s->mtfFreq[BZ_RUNA]++;
          }
          if (zPend < 2) break;
          zPend = (zPend - 2) / 2;
@@ -261,7 +261,7 @@ void sendMTFValues ( EState* s )
    ((void)nBytes); /* Silence variable ‘nBytes’ set but not used warning */
    if (s->verbosity >= 3)
       VPrintf3( "      %d in block, %d after MTF & 1-2 coding, "
-                "%d+2 syms in use\n", 
+                "%d+2 syms in use\n",
                 s->nblock, s->nMTF, s->nInUse );
 
    alphaSize = s->nInUse+2;
@@ -278,7 +278,7 @@ void sendMTFValues ( EState* s )
                        nGroups = 6;
 
    /*--- Generate an initial set of coding tables ---*/
-   { 
+   {
       Int32 nPart, remF, tFreq, aFreq;
 
       nPart = nGroups;
@@ -293,8 +293,8 @@ void sendMTFValues ( EState* s )
             aFreq += s->mtfFreq[ge];
          }
 
-         if (ge > gs 
-             && nPart != nGroups && nPart != 1 
+         if (ge > gs
+             && nPart != nGroups && nPart != 1
              && ((nGroups-nPart) % 2 == 1)) {
             aFreq -= s->mtfFreq[ge];
             ge--;
@@ -303,21 +303,21 @@ void sendMTFValues ( EState* s )
          if (s->verbosity >= 3)
             VPrintf5( "      initial group %d, [%d .. %d], "
                       "has %d syms (%4.1f%%)\n",
-                      nPart, gs, ge, aFreq, 
+                      nPart, gs, ge, aFreq,
                       (100.0 * (float)aFreq) / (float)(s->nMTF) );
+
          for (v = 0; v < alphaSize; v++)
-            if (v >= gs && v <= ge) 
+            if (v >= gs && v <= ge)
                s->len[nPart-1][v] = BZ_LESSER_ICOST; else
                s->len[nPart-1][v] = BZ_GREATER_ICOST;
+
          nPart--;
          gs = ge+1;
          remF -= aFreq;
       }
    }
 
-   /*--- 
+   /*---
       Iterate up to BZ_N_ITERS times to improve the tables.
    ---*/
    for (iter = 0; iter < BZ_N_ITERS; iter++) {
@@ -330,7 +330,7 @@ void sendMTFValues ( EState* s )
 
       /*---
         Set up an auxiliary length table which is used to fast-track
-       the common case (nGroups == 6). 
+       the common case (nGroups == 6).
       ---*/
       if (nGroups == 6) {
          for (v = 0; v < alphaSize; v++) {
@@ -347,10 +347,10 @@ void sendMTFValues ( EState* s )
 
          /*--- Set group start & end marks. --*/
          if (gs >= s->nMTF) break;
-         ge = gs + BZ_G_SIZE - 1; 
+         ge = gs + BZ_G_SIZE - 1;
          if (ge >= s->nMTF) ge = s->nMTF-1;
 
-         /*-- 
+         /*--
             Calculate the cost of this group as coded
             by each of the coding tables.
          --*/
@@ -358,8 +358,8 @@ void sendMTFValues ( EState* s )
 
          if (nGroups == 6 && 50 == ge-gs+1) {
             /*--- fast track the common case ---*/
-            register UInt32 cost01, cost23, cost45;
-            register UInt16 icv;
+            UInt32 cost01, cost23, cost45;
+            UInt16 icv;
             cost01 = cost23 = cost45 = 0;
 
 #           define BZ_ITER(nn)                \
@@ -387,13 +387,13 @@ void sendMTFValues ( EState* s )
 
          } else {
            /*--- slow version which correctly handles all situations ---*/
-            for (i = gs; i <= ge; i++) { 
+            for (i = gs; i <= ge; i++) {
                UInt16 icv = mtfv[i];
                for (t = 0; t < nGroups; t++) cost[t] += s->len[t][icv];
             }
          }
-         /*-- 
+
+         /*--
             Find the coding table which is best for this group,
             and record its identity in the selector table.
          --*/
@@ -405,7 +405,7 @@ void sendMTFValues ( EState* s )
          s->selector[nSelectors] = bt;
          nSelectors++;
 
-         /*-- 
+         /*--
             Increment the symbol frequencies for the selected table.
           --*/
          if (nGroups == 6 && 50 == ge-gs+1) {
@@ -435,7 +435,7 @@ void sendMTFValues ( EState* s )
          gs = ge+1;
       }
       if (s->verbosity >= 3) {
-         VPrintf2 ( "      pass %d: size is %d, grp uses are ", 
+         VPrintf2 ( "      pass %d: size is %d, grp uses are ",
                    iter+1, totc/8 );
          for (t = 0; t < nGroups; t++)
             VPrintf1 ( "%d ", fave[t] );
@@ -445,10 +445,10 @@ void sendMTFValues ( EState* s )
       /*--
         Recompute the tables based on the accumulated frequencies.
       --*/
-      /* maxLen was changed from 20 to 17 in bzip2-1.0.3.  See 
+      /* maxLen was changed from 20 to 17 in bzip2-1.0.3.  See
          comment in huffman.c for details. */
       for (t = 0; t < nGroups; t++)
-         BZ2_hbMakeCodeLengths ( &(s->len[t][0]), &(s->rfreq[t][0]), 
+         BZ2_hbMakeCodeLengths ( &(s->len[t][0]), &(s->rfreq[t][0]),
                                  alphaSize, 17 /*20*/ );
    }
 
@@ -488,19 +488,19 @@ void sendMTFValues ( EState* s )
       }
       AssertH ( !(maxLen > 17 /*20*/ ), 3004 );
       AssertH ( !(minLen < 1),  3005 );
-      BZ2_hbAssignCodes ( &(s->code[t][0]), &(s->len[t][0]), 
+      BZ2_hbAssignCodes ( &(s->code[t][0]), &(s->len[t][0]),
                           minLen, maxLen, alphaSize );
    }
 
    /*--- Transmit the mapping table. ---*/
-   { 
+   {
       Bool inUse16[16];
       for (i = 0; i < 16; i++) {
           inUse16[i] = False;
           for (j = 0; j < 16; j++)
              if (s->inUse[i * 16 + j]) inUse16[i] = True;
       }
-     
+
       nBytes = s->numZ;
       for (i = 0; i < 16; i++)
          if (inUse16[i]) bsW(s,1,1); else bsW(s,1,0);
@@ -511,7 +511,7 @@ void sendMTFValues ( EState* s )
                if (s->inUse[i * 16 + j]) bsW(s,1,1); else bsW(s,1,0);
             }
 
-      if (s->verbosity >= 3) 
+      if (s->verbosity >= 3)
          VPrintf1( "      bytes: mapping %d, ", s->numZ-nBytes );
    }
 
@@ -519,7 +519,7 @@ void sendMTFValues ( EState* s )
    nBytes = s->numZ;
    bsW ( s, 3, nGroups );
    bsW ( s, 15, nSelectors );
-   for (i = 0; i < nSelectors; i++) { 
+   for (i = 0; i < nSelectors; i++) {
       for (j = 0; j < s->selectorMtf[i]; j++) bsW(s,1,1);
       bsW(s,1,0);
    }
@@ -548,14 +548,14 @@ void sendMTFValues ( EState* s )
    gs = 0;
    while (True) {
       if (gs >= s->nMTF) break;
-      ge = gs + BZ_G_SIZE - 1; 
+      ge = gs + BZ_G_SIZE - 1;
       if (ge >= s->nMTF) ge = s->nMTF-1;
       AssertH ( s->selector[selCtr] < nGroups, 3006 );
 
       if (nGroups == 6 && 50 == ge-gs+1) {
             /*--- fast track the common case ---*/
             UInt16 mtfv_i;
-            UChar* s_len_sel_selCtr 
+            UChar* s_len_sel_selCtr
                = &(s->len[s->selector[selCtr]][0]);
             Int32* s_code_sel_selCtr
                = &(s->code[s->selector[selCtr]][0]);
@@ -582,7 +582,7 @@ void sendMTFValues ( EState* s )
       } else {
         /*--- slow version which correctly handles all situations ---*/
          for (i = gs; i <= ge; i++) {
-            bsW ( s, 
+            bsW ( s,
                   s->len  [s->selector[selCtr]] [mtfv[i]],
                   s->code [s->selector[selCtr]] [mtfv[i]] );
          }
@@ -637,8 +637,8 @@ void BZ2_compressBlock ( EState* s, Bool is_last_block )
       /*-- Now the block's CRC, so it is in a known place. --*/
       bsPutUInt32 ( s, s->blockCRC );
 
-      /*-- 
-         Now a single bit indicating (non-)randomisation. 
+      /*--
+         Now a single bit indicating (non-)randomisation.
          As of version 0.9.5, we use a better sorting algorithm
          which makes randomisation unnecessary.  So always set
          the randomised bit to 'no'.  Of course, the decoder
index a9212db..2095e00 100644 (file)
@@ -11,7 +11,7 @@
    bzip2/libbzip2 version 1.0.8 of 13 July 2019
    Copyright (C) 1996-2019 Julian Seward <jseward@acm.org>
 
-   Please read the WARNING, DISCLAIMER and PATENTS sections in the 
+   Please read the WARNING, DISCLAIMER and PATENTS sections in the
    README file.
 
    This program is released under the terms of the license contained
index 1a01f1d..cc338c5 100644 (file)
@@ -11,7 +11,7 @@
    bzip2/libbzip2 version 1.0.8 of 13 July 2019
    Copyright (C) 1996-2019 Julian Seward <jseward@acm.org>
 
-   Please read the WARNING, DISCLAIMER and PATENTS sections in the 
+   Please read the WARNING, DISCLAIMER and PATENTS sections in the
    README file.
 
    This program is released under the terms of the license contained
@@ -128,7 +128,7 @@ Int32 BZ2_decompress ( DState* s )
    Int32  N;
    Int32  curr;
    Int32  zt;
-   Int32  zn; 
+   Int32  zn;
    Int32  zvec;
    Int32  zj;
    Int32  gSel;
@@ -182,7 +182,7 @@ Int32 BZ2_decompress ( DState* s )
    N           = s->save_N;
    curr        = s->save_curr;
    zt          = s->save_zt;
-   zn          = s->save_zn; 
+   zn          = s->save_zn;
    zvec        = s->save_zvec;
    zj          = s->save_zj;
    gSel        = s->save_gSel;
@@ -205,14 +205,14 @@ Int32 BZ2_decompress ( DState* s )
       if (uc != BZ_HDR_h) RETURN(BZ_DATA_ERROR_MAGIC);
 
       GET_BITS(BZ_X_MAGIC_4, s->blockSize100k, 8)
-      if (s->blockSize100k < (BZ_HDR_0 + 1) || 
+      if (s->blockSize100k < (BZ_HDR_0 + 1) ||
           s->blockSize100k > (BZ_HDR_0 + 9)) RETURN(BZ_DATA_ERROR_MAGIC);
       s->blockSize100k -= BZ_HDR_0;
 
       if (s->smallDecompress) {
          s->ll16 = (UInt16*) BZALLOC( s->blockSize100k * 100000 * sizeof(UInt16) );
-         s->ll4  = (UChar*) BZALLOC( 
-                      ((1 + s->blockSize100k * 100000) >> 1) * sizeof(UChar) 
+         s->ll4  = (UChar*) BZALLOC(
+                      ((1 + s->blockSize100k * 100000) >> 1) * sizeof(UChar)
                    );
          if (s->ll16 == NULL || s->ll4 == NULL) RETURN(BZ_MEM_ERROR);
       } else {
@@ -238,7 +238,7 @@ Int32 BZ2_decompress ( DState* s )
       s->currBlockNo++;
       if (s->verbosity >= 2)
          VPrintf1 ( "\n    [%d: huff+mtf ", s->currBlockNo );
+
       s->storedBlockCRC = 0;
       GET_UCHAR(BZ_X_BCRC_1, uc);
       s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc);
@@ -261,14 +261,14 @@ Int32 BZ2_decompress ( DState* s )
 
       if (s->origPtr < 0)
          RETURN(BZ_DATA_ERROR);
-      if (s->origPtr > 10 + 100000*s->blockSize100k) 
+      if (s->origPtr > 10 + 100000*s->blockSize100k)
          RETURN(BZ_DATA_ERROR);
 
       /*--- Receive the mapping table ---*/
       for (i = 0; i < 16; i++) {
          GET_BIT(BZ_X_MAPPING_1, uc);
-         if (uc == 1) 
-            s->inUse16[i] = True; else 
+         if (uc == 1)
+            s->inUse16[i] = True; else
             s->inUse16[i] = False;
       }
 
@@ -310,7 +310,7 @@ Int32 BZ2_decompress ( DState* s )
       {
          UChar pos[BZ_N_GROUPS], tmp, v;
          for (v = 0; v < nGroups; v++) pos[v] = v;
-   
+
          for (i = 0; i < nSelectors; i++) {
             v = s->selectorMtf[i];
             tmp = pos[v];
@@ -343,10 +343,10 @@ Int32 BZ2_decompress ( DState* s )
             if (s->len[t][i] > maxLen) maxLen = s->len[t][i];
             if (s->len[t][i] < minLen) minLen = s->len[t][i];
          }
-         BZ2_hbCreateDecodeTables ( 
-            &(s->limit[t][0]), 
-            &(s->base[t][0]), 
-            &(s->perm[t][0]), 
+         BZ2_hbCreateDecodeTables (
+            &(s->limit[t][0]),
+            &(s->base[t][0]),
+            &(s->perm[t][0]),
             &(s->len[t][0]),
             minLen, maxLen, alphaSize
          );
@@ -445,23 +445,23 @@ Int32 BZ2_decompress ( DState* s )
                      s->mtfa[(z)-3] = s->mtfa[(z)-4];
                      nn -= 4;
                   }
-                  while (nn > 0) { 
-                     s->mtfa[(pp+nn)] = s->mtfa[(pp+nn)-1]; nn--; 
+                  while (nn > 0) {
+                     s->mtfa[(pp+nn)] = s->mtfa[(pp+nn)-1]; nn--;
                   };
                   s->mtfa[pp] = uc;
-               } else { 
+               } else {
                   /* general case */
                   lno = nn / MTFL_SIZE;
                   off = nn % MTFL_SIZE;
                   pp = s->mtfbase[lno] + off;
                   uc = s->mtfa[pp];
-                  while (pp > s->mtfbase[lno]) { 
-                     s->mtfa[pp] = s->mtfa[pp-1]; pp--; 
+                  while (pp > s->mtfbase[lno]) {
+                     s->mtfa[pp] = s->mtfa[pp-1]; pp--;
                   };
                   s->mtfbase[lno]++;
                   while (lno > 0) {
                      s->mtfbase[lno]--;
-                     s->mtfa[s->mtfbase[lno]] 
+                     s->mtfa[s->mtfbase[lno]]
                         = s->mtfa[s->mtfbase[lno-1] + MTFL_SIZE - 1];
                      lno--;
                   }
@@ -556,7 +556,7 @@ Int32 BZ2_decompress ( DState* s )
          if (s->blockRandomised) {
             BZ_RAND_INIT_MASK;
             BZ_GET_SMALL(s->k0); s->nblock_used++;
-            BZ_RAND_UPD_MASK; s->k0 ^= BZ_RAND_MASK; 
+            BZ_RAND_UPD_MASK; s->k0 ^= BZ_RAND_MASK;
          } else {
             BZ_GET_SMALL(s->k0); s->nblock_used++;
          }
@@ -575,7 +575,7 @@ Int32 BZ2_decompress ( DState* s )
          if (s->blockRandomised) {
             BZ_RAND_INIT_MASK;
             BZ_GET_FAST(s->k0); s->nblock_used++;
-            BZ_RAND_UPD_MASK; s->k0 ^= BZ_RAND_MASK; 
+            BZ_RAND_UPD_MASK; s->k0 ^= BZ_RAND_MASK;
          } else {
             BZ_GET_FAST(s->k0); s->nblock_used++;
          }
@@ -644,7 +644,7 @@ Int32 BZ2_decompress ( DState* s )
    s->save_gBase       = gBase;
    s->save_gPerm       = gPerm;
 
-   return retVal;   
+   return retVal;
 }
 
 
index 43a1899..de94b96 100644 (file)
@@ -11,7 +11,7 @@
    bzip2/libbzip2 version 1.0.8 of 13 July 2019
    Copyright (C) 1996-2019 Julian Seward <jseward@acm.org>
 
-   Please read the WARNING, DISCLAIMER and PATENTS sections in the 
+   Please read the WARNING, DISCLAIMER and PATENTS sections in the
    README file.
 
    This program is released under the terms of the license contained
@@ -60,7 +60,7 @@
 
 
 /*---------------------------------------------------*/
-void BZ2_hbMakeCodeLengths ( UChar *len, 
+void BZ2_hbMakeCodeLengths ( UChar *len,
                              Int32 *freq,
                              Int32 alphaSize,
                              Int32 maxLen )
@@ -74,7 +74,7 @@ void BZ2_hbMakeCodeLengths ( UChar *len,
 
    Int32 heap   [ BZ_MAX_ALPHA_SIZE + 2 ];
    Int32 weight [ BZ_MAX_ALPHA_SIZE * 2 ];
-   Int32 parent [ BZ_MAX_ALPHA_SIZE * 2 ]; 
+   Int32 parent [ BZ_MAX_ALPHA_SIZE * 2 ];
 
    for (i = 0; i < alphaSize; i++)
       weight[i+1] = (freq[i] == 0 ? 1 : freq[i]) << 8;
@@ -96,7 +96,7 @@ void BZ2_hbMakeCodeLengths ( UChar *len,
       }
 
       AssertH( nHeap < (BZ_MAX_ALPHA_SIZE+2), 2001 );
-   
+
       while (nHeap > 1) {
          n1 = heap[1]; heap[1] = heap[nHeap]; nHeap--; DOWNHEAP(1);
          n2 = heap[1]; heap[1] = heap[nHeap]; nHeap--; DOWNHEAP(1);
@@ -119,7 +119,7 @@ void BZ2_hbMakeCodeLengths ( UChar *len,
          len[i-1] = j;
          if (j > maxLen) tooLong = True;
       }
-      
+
       if (! tooLong) break;
 
       /* 17 Oct 04: keep-going condition for the following loop used
index 70666a1..56f59b9 100644 (file)
@@ -11,7 +11,7 @@
    bzip2/libbzip2 version 1.0.8 of 13 July 2019
    Copyright (C) 1996-2019 Julian Seward <jseward@acm.org>
 
-   Please read the WARNING, DISCLAIMER and PATENTS sections in the 
+   Please read the WARNING, DISCLAIMER and PATENTS sections in the
    README file.
 
    This program is released under the terms of the license contained
 
 
 /*---------------------------------------------*/
-const Int32 BZ2_rNums[512] = { 
-   619, 720, 127, 481, 931, 816, 813, 233, 566, 247, 
-   985, 724, 205, 454, 863, 491, 741, 242, 949, 214, 
-   733, 859, 335, 708, 621, 574, 73, 654, 730, 472, 
-   419, 436, 278, 496, 867, 210, 399, 680, 480, 51, 
-   878, 465, 811, 169, 869, 675, 611, 697, 867, 561, 
-   862, 687, 507, 283, 482, 129, 807, 591, 733, 623, 
-   150, 238, 59, 379, 684, 877, 625, 169, 643, 105, 
-   170, 607, 520, 932, 727, 476, 693, 425, 174, 647, 
-   73, 122, 335, 530, 442, 853, 695, 249, 445, 515, 
-   909, 545, 703, 919, 874, 474, 882, 500, 594, 612, 
-   641, 801, 220, 162, 819, 984, 589, 513, 495, 799, 
-   161, 604, 958, 533, 221, 400, 386, 867, 600, 782, 
-   382, 596, 414, 171, 516, 375, 682, 485, 911, 276, 
-   98, 553, 163, 354, 666, 933, 424, 341, 533, 870, 
-   227, 730, 475, 186, 263, 647, 537, 686, 600, 224, 
-   469, 68, 770, 919, 190, 373, 294, 822, 808, 206, 
-   184, 943, 795, 384, 383, 461, 404, 758, 839, 887, 
-   715, 67, 618, 276, 204, 918, 873, 777, 604, 560, 
-   951, 160, 578, 722, 79, 804, 96, 409, 713, 940, 
-   652, 934, 970, 447, 318, 353, 859, 672, 112, 785, 
-   645, 863, 803, 350, 139, 93, 354, 99, 820, 908, 
-   609, 772, 154, 274, 580, 184, 79, 626, 630, 742, 
-   653, 282, 762, 623, 680, 81, 927, 626, 789, 125, 
-   411, 521, 938, 300, 821, 78, 343, 175, 128, 250, 
-   170, 774, 972, 275, 999, 639, 495, 78, 352, 126, 
-   857, 956, 358, 619, 580, 124, 737, 594, 701, 612, 
-   669, 112, 134, 694, 363, 992, 809, 743, 168, 974, 
-   944, 375, 748, 52, 600, 747, 642, 182, 862, 81, 
-   344, 805, 988, 739, 511, 655, 814, 334, 249, 515, 
-   897, 955, 664, 981, 649, 113, 974, 459, 893, 228, 
-   433, 837, 553, 268, 926, 240, 102, 654, 459, 51, 
-   686, 754, 806, 760, 493, 403, 415, 394, 687, 700, 
-   946, 670, 656, 610, 738, 392, 760, 799, 887, 653, 
-   978, 321, 576, 617, 626, 502, 894, 679, 243, 440, 
-   680, 879, 194, 572, 640, 724, 926, 56, 204, 700, 
-   707, 151, 457, 449, 797, 195, 791, 558, 945, 679, 
-   297, 59, 87, 824, 713, 663, 412, 693, 342, 606, 
-   134, 108, 571, 364, 631, 212, 174, 643, 304, 329, 
-   343, 97, 430, 751, 497, 314, 983, 374, 822, 928, 
-   140, 206, 73, 263, 980, 736, 876, 478, 430, 305, 
-   170, 514, 364, 692, 829, 82, 855, 953, 676, 246, 
-   369, 970, 294, 750, 807, 827, 150, 790, 288, 923, 
-   804, 378, 215, 828, 592, 281, 565, 555, 710, 82, 
-   896, 831, 547, 261, 524, 462, 293, 465, 502, 56, 
-   661, 821, 976, 991, 658, 869, 905, 758, 745, 193, 
-   768, 550, 608, 933, 378, 286, 215, 979, 792, 961, 
-   61, 688, 793, 644, 986, 403, 106, 366, 905, 644, 
-   372, 567, 466, 434, 645, 210, 389, 550, 919, 135, 
-   780, 773, 635, 389, 707, 100, 626, 958, 165, 504, 
-   920, 176, 193, 713, 857, 265, 203, 50, 668, 108, 
-   645, 990, 626, 197, 510, 357, 358, 850, 858, 364, 
+const Int32 BZ2_rNums[512] = {
+   619, 720, 127, 481, 931, 816, 813, 233, 566, 247,
+   985, 724, 205, 454, 863, 491, 741, 242, 949, 214,
+   733, 859, 335, 708, 621, 574, 73, 654, 730, 472,
+   419, 436, 278, 496, 867, 210, 399, 680, 480, 51,
+   878, 465, 811, 169, 869, 675, 611, 697, 867, 561,
+   862, 687, 507, 283, 482, 129, 807, 591, 733, 623,
+   150, 238, 59, 379, 684, 877, 625, 169, 643, 105,
+   170, 607, 520, 932, 727, 476, 693, 425, 174, 647,
+   73, 122, 335, 530, 442, 853, 695, 249, 445, 515,
+   909, 545, 703, 919, 874, 474, 882, 500, 594, 612,
+   641, 801, 220, 162, 819, 984, 589, 513, 495, 799,
+   161, 604, 958, 533, 221, 400, 386, 867, 600, 782,
+   382, 596, 414, 171, 516, 375, 682, 485, 911, 276,
+   98, 553, 163, 354, 666, 933, 424, 341, 533, 870,
+   227, 730, 475, 186, 263, 647, 537, 686, 600, 224,
+   469, 68, 770, 919, 190, 373, 294, 822, 808, 206,
+   184, 943, 795, 384, 383, 461, 404, 758, 839, 887,
+   715, 67, 618, 276, 204, 918, 873, 777, 604, 560,
+   951, 160, 578, 722, 79, 804, 96, 409, 713, 940,
+   652, 934, 970, 447, 318, 353, 859, 672, 112, 785,
+   645, 863, 803, 350, 139, 93, 354, 99, 820, 908,
+   609, 772, 154, 274, 580, 184, 79, 626, 630, 742,
+   653, 282, 762, 623, 680, 81, 927, 626, 789, 125,
+   411, 521, 938, 300, 821, 78, 343, 175, 128, 250,
+   170, 774, 972, 275, 999, 639, 495, 78, 352, 126,
+   857, 956, 358, 619, 580, 124, 737, 594, 701, 612,
+   669, 112, 134, 694, 363, 992, 809, 743, 168, 974,
+   944, 375, 748, 52, 600, 747, 642, 182, 862, 81,
+   344, 805, 988, 739, 511, 655, 814, 334, 249, 515,
+   897, 955, 664, 981, 649, 113, 974, 459, 893, 228,
+   433, 837, 553, 268, 926, 240, 102, 654, 459, 51,
+   686, 754, 806, 760, 493, 403, 415, 394, 687, 700,
+   946, 670, 656, 610, 738, 392, 760, 799, 887, 653,
+   978, 321, 576, 617, 626, 502, 894, 679, 243, 440,
+   680, 879, 194, 572, 640, 724, 926, 56, 204, 700,
+   707, 151, 457, 449, 797, 195, 791, 558, 945, 679,
+   297, 59, 87, 824, 713, 663, 412, 693, 342, 606,
+   134, 108, 571, 364, 631, 212, 174, 643, 304, 329,
+   343, 97, 430, 751, 497, 314, 983, 374, 822, 928,
+   140, 206, 73, 263, 980, 736, 876, 478, 430, 305,
+   170, 514, 364, 692, 829, 82, 855, 953, 676, 246,
+   369, 970, 294, 750, 807, 827, 150, 790, 288, 923,
+   804, 378, 215, 828, 592, 281, 565, 555, 710, 82,
+   896, 831, 547, 261, 524, 462, 293, 465, 502, 56,
+   661, 821, 976, 991, 658, 869, 905, 758, 745, 193,
+   768, 550, 608, 933, 378, 286, 215, 979, 792, 961,
+   61, 688, 793, 644, 986, 403, 106, 366, 905, 644,
+   372, 567, 466, 434, 645, 210, 389, 550, 919, 135,
+   780, 773, 635, 389, 707, 100, 626, 958, 165, 504,
+   920, 176, 193, 713, 857, 265, 203, 50, 668, 108,
+   645, 990, 626, 197, 510, 357, 358, 850, 858, 364,
    936, 638
 };
 
index 99d7670..94c0427 100644 (file)
@@ -11,7 +11,7 @@ use Carp ;
 use bytes ;
 our ($VERSION, $XS_VERSION, @ISA, @EXPORT, $AUTOLOAD);
 
-$VERSION = '2.103';
+$VERSION = '2.204_001';
 $XS_VERSION = $VERSION;
 $VERSION = eval $VERSION;
 
@@ -384,7 +384,7 @@ See the Changes file.
 
 =head1 COPYRIGHT AND LICENSE
 
-Copyright (c) 2005-2022 Paul Marquess. All rights reserved.
+Copyright (c) 2005-2023 Paul Marquess. All rights reserved.
 
 This program is free software; you can redistribute it and/or
 modify it under the same terms as Perl itself.
index e763cba..aa540c6 100644 (file)
@@ -35,8 +35,7 @@ sub MY::libscan
     my $path = shift;
 
     return undef
-        if $path =~ /^(?:RCS|CVS|SCCS|\.svn|_darcs)$/ ||
-           $path =~ /(~|\.bak|_bak)$/ ||
+        if $path =~ /(~|\.bak|_bak)$/ ||
            $path =~ /\..*\.sw(o|p)$/  ||
            $path =~ /\B\.svn\b/;
 
index 5ab2f35..871fe18 100755 (executable)
@@ -19,7 +19,7 @@ BEGIN
         if eval { require Test::NoWarnings ;  import Test::NoWarnings; 1 };
 
 
-    my $VERSION = '2.103';
+    my $VERSION = '2.204';
     my @NAMES = qw(
 
                        );
diff --git a/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/Changes b/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/Changes
deleted file mode 100644 (file)
index 0a813ca..0000000
+++ /dev/null
@@ -1,677 +0,0 @@
-CHANGES
--------
-
-  2.202 27 June 2022
-
-      * Z_NULL should be 'UV' rather than 'PV'
-        https://github.com/pmqs/Compress-Raw-Zlib/issues/17
-        Sun Jun 26 22:02:04 2022 +0100
-        de28f0335d3d605d696b19d43fc48de42272455c
-
-  2.201 25 June 2022
-
-      * 2.021
-        Sat Jun 25 08:42:46 2022 +0100
-        85416cab509c18c5fa3f923de7b45b6c7c0f7a6f
-
-      * 2.201
-        Sat Jun 25 08:39:26 2022 +0100
-        b3d63862b2ff4ac9d28e23be500c0d32ad69dd11
-
-      * More zlib-ng updates
-        Thu Jun 23 22:42:13 2022 +0100
-        313f626425181702b5fc80af2b6ea7eed41d5a9d
-
-      * Fix test count regression in t/07bufsize.t (#16)
-        Wed Jun 22 09:45:11 2022 +0100
-        98dc5b4a2b30c26752b6f686462b06b8db72a5e4
-
-  2.200 21 June 2022
-
-      * Added zlib-ng support
-        https://github.com/pmqs/Compress-Raw-Zlib/issues/9
-
-      * Only set Z_SOLO when building zlib sources https://github.com/pmqs/Compress-Raw-Zlib/issues/12
-        Tue Jun 7 10:13:00 2022 +0100
-        c44e0b732e214b7f77d42a3af6ae64ef944cee90
-
-  2.105 14 April 2022
-
-      * Add Compress::Raw::Zlib::VERSION to output
-        Sat May 14 15:16:57 2022 +0100
-        3e22c93169a67986017f64d9a2e5085c417d8624
-
-      * Dump version info when running test harness
-        Sat May 14 15:10:17 2022 +0100
-        ca9f33ba0323d0abc91a83800636f180b2b44162
-
-      * Fix use of ZLIB_INCLUDE/LIB
-        Sat May 14 09:01:38 2022 +0100
-        8a7d4a97d7441b61a8a888342766419044fa5a33
-
-      * More fixes for BUILD_ZLIB off
-        Sat May 14 08:54:04 2022 +0100
-        2d9650094dab90858ef58bfbda62f3bc60e159e4
-
-      * Add BUILD_ZLIB to the matrix
-        Sat May 14 08:31:54 2022 +0100
-        b61b92fc9d06bf04f1adec337357ffbd39535901
-
-      * Merge branch 'master' of https://github.com/pmqs/Compress-Raw-Zlib
-        Sat May 14 08:27:14 2022 +0100
-        3ac7d0d3d45ae263402fab1ebb3835e2ae16c5a6
-
-      * Fix for BUILD_ZLIB disabled
-        Sat May 14 08:25:34 2022 +0100
-        b0f04e37fb58a34ef01767ad16a8f63ca868eec6
-
-      * Add BUILD_ZLIB to the matrix
-        Sat May 14 08:22:56 2022 +0100
-        aa8f5ff981c7305c995d4e2f798ae0d7d45866a5
-
-  2.104 13 April 2022
-
-      * Merge pull request #11 from monkburger/symbol_fix_2
-        Fri May 13 07:17:19 2022 +0100
-        64aea2d3f78946d7df4096eadfa0d7267f4439a5
-
-      * perl_crz -> Perl_crz
-        Tue May 3 18:19:24 2022 +0000
-        20502e6c2eba8ddcad80b20574e840457c0cb369
-
-      * This is a slightly different way to fix https://github.com/pmqs/Compress-Raw-Zlib/issues/8
-        Tue May 3 18:06:48 2022 +0000
-        d9cd27fb212da7455b6ba44729ca11bb441f3950
-
-      * add tests for crc32/adler32_combine
-        Mon May 2 16:18:13 2022 +0100
-        dcfe9ef439790f1a4fae81cf3eac38cfeb848294
-
-  2.103 3 April 2022
-
-      * Sync upstream fix for CVE-2018-25032
-        https://github.com/advisories/GHSA-jc36-42cf-vqwj
-
-        Update to Zlib 1.2.12
-        d507f527768f6cbab5831ed3ec17fe741163785c
-
-        Fix for inflateSync return code change
-        f47ea5f36c40fe19efe404dd75fd790b115de596
-
-        Fix for incorrect CRC from zlib 1.2.12.1
-        https://github.com/madler/zlib/commit/ec3df00224d4b396e2ac6586ab5d25f673caa4c2
-        60104e3a162a116548303861ae0811fb850e65fd
-
-      * AUTHOR doesn't contain the stated information
-        bf5a03c1b440c8d9e41cffb344bf889794cc532b
-
-
-  2.101 20 February 2021
-
-      * fix version numbers in meta files
-
-  2.100 7 January 2021
-
-      * trim whitespace
-        5de62cd3987c736c14d1aa804936808fbc1fe9cb
-
-  2.096 31 July 2020
-
-      * No changes
-
-  2.095 19 July 2020
-
-      * No changes
-
-  2.094 13 July 2020
-
-      * Issue with Append mode & SvOOK
-        https://github.com/pmqs/Compress-Raw-Zlib/issues/3
-        80ee0524012f46c5984c2d57649af0b07f82c750
-
-  2.093 7 December 2019
-
-      * No Changes
-
-  2.092 4 December 2019
-
-      * No Changes
-
-  2.091 23 November 2019
-
-      * Silence "macro expands to multiple statements" warning
-        Change sourced upstream from https://github.com/Perl/perl5/issues/17013
-        https://github.com/pmqs/Compress-Raw-Zlib/issues/2
-        da2bd1fc765b80d01ed10a79b6c4a035e5095ed8
-
-  2.090 9 November 2019
-
-      * No Changes
-
-  2.089 3 November 2019
-
-      * No Changes
-
-  2.088 31 October 2019
-
-      * Add SUPPORT section
-        d348ad76c2073a2973d094891fbd0c2e24bf397d
-
-      * 000prereq.t: dump Perl version
-        e1afe502818cb1ccf5bad917b14b029b408f47f1
-
-  2.087 10 August 2019
-
-      * clang warning in ppport.h
-        update to latest ppport.h
-        https://github.com/pmqs/Compress-Raw-Zlib/issues/1
-        664a5fbacf778acdd4cfbcc571997f3df5ee43d3
-
-  2.086 31 March 2019
-
-      * Moved source to github https://github.com/pmqs/Compress-Raw-Zlib
-
-      * Add META_MERGE to Makefile.PL
-
-      * Added meta-json.t & meta-yaml.t
-
-  2.084 5 January 2019
-
-      * No Changes
-
-  2.083 30 December 2018
-
-      * No Changes
-
-  2.081 4 April 2018
-
-      * previous release used $^W instead of use warnings. Fixed.
-
-  2.080 2 April 2018
-
-      * No Changes
-
-  2.076 21 Nov 2017
-
-      * Zlib.xs
-        Silence gcc compiler warnings when -Wsign-compare is enabled
-        #123688: Compilation warnings with clang
-
-      * zlib-src/inflate.c and zlib-src/infback.c
-        Silence gcc compiler warnings when -Wimplicit-fallthrough is enabled
-        #123358: Compilation warnings with gcc-7.*
-
-      * Makefile.PL
-        Windows uses -lzlib. Linux uses -lz
-        #123699: wrong external zlib name used on Windows
-
-  2.075 14 Nov 2017
-
-      * Update zlib-src directory to use zlib 1.2.11
-        #123245: perl 5.26.1 is vulnerable to CVE-2016-9843, CVE-2016-9841, CVE-2016-9840, CVE-2016-9842
-
-      * Zlib.xs
-        Don't allow offset to be greater than length of buffer in crc32.
-
-      * Zlib.xs
-        Change my_zcalloc to use safecalloc.
-        The link, https://github.com/madler/zlib/issues/253, is the upstream report for the remaining
-        valgrind errors not already dealt with by 1.2.11. Using calloc in Zlib.xs for now as a workaround.
-        #121074: valgrind errors in the test suite
-
-  2.074 19 Feb 2017
-
-      * Fix bad 2.073 release
-
-  2.073 18 Feb 2017
-
-      * Zlib.xs
-        Comment out unused variables & remove C++-ism
-        #120272: [PATCH] Unbreak compilation
-
-  2.072 12 Feb 2017
-
-      * Makefile.PL
-        #120084: Need Fix for Makefile.PL depending on . in @INC
-
-      * zlib-src
-        #120207: inflateUndermine: subvert arg conditionally used/unused
-
-      * zlib-src
-        #112829: two gcc6-found problems
-
-      * fix deflateParams for zlib > 1.2.8
-        #119762: Tests broken with zlib-1.2.10
-
-  2.071 30 Dec 2016
-
-      * #119580 (inflate.c: One (last?) compilation warning)
-        Identical issue reeported in upstream zlib
-             https://github.com/madler/zlib/issues/111
-
-        Fix checked into zlib dev codeline via
-            https://github.com/madler/zlib/commit/2edb94a3025d288dc251bc6cbb2c02e60fbd7438
-
-  2.070 28 Dec 2016
-
-      * #107642: compilation warning from inflate.c
-
-      * #119007: [PATCH] Wrong FLAG_APPEND logic analog to Bzip2
-
-  2.069 26 Sept 2015
-
-      * reduce compiler warnings and stderr noise
-        [#101341]
-
-      * amigaos4: cpan/Compress-Raw-Zlib: also __amigaos4__
-        [#106799]
-
-      * const all global data
-        https://github.com/madler/zlib/commit/82e9dc60932bf2ce5422a5e76e66e5a05abd26e3
-        [#101298]
-
-      * Coverity finding: Unused value
-        https://github.com/madler/zlib/commit/9859a94c1002484ee5f824c05683a5b2484cbf49
-        [105414]
-
-      * Coverity findings
-        [102399]
-
-      * Coverity finding: Overlapping buffer in memory copy
-        [105413]
-
-  2.068 10 Dec 2014
-
-      * Silence more compiler warnings
-
-      * Disable running of 07bufsize.y by default.
-        COMPRESS_ZLIB_RUN_MOST needs set to run them. Makes life more
-        bearable on legacy platforms
-
-
-  2.067 8 Dec 2014
-
-      * Silence compiler warnings
-
-  2.066 21 Sept 2014
-
-      * Another COW violation
-        [#98069]
-
-      * misleading nesting/indentation (found by Coverity)
-        [#95405]
-
-  2.065 3 February 2014
-
-      * [PATCH] resolve c++ build failure in core
-        [#92657]
-
-      * gcc -g3: final link failed: Memory exhausted
-        [#88936]
-
-  2.064 1 February 2014
-
-      * [PATCH] Handle non-PVs better
-        [#91558]
-
-      * Z_OK instead of Z_BUF_ERROR
-        [#92521]
-
-  2.063 23 October 2013
-
-      * gcc -g3: final link failed: Memory exhausted
-        [#88936]
-
-      * Compress::Raw::Zlib uses AutoLoader for no reason
-        [#88260]
-
-      * Typo in Compress::Zlib _combine function documentation
-        [#89305]
-
-  2.062 11 August 2013
-
-      * typo fix
-        [#86417]
-
-  2.061 19 May 2013
-
-      * Include zlib 1.2.8 source.
-
-      * typo fix
-        [#85431]
-
-      * silence compiler warning by making 2nd parameter to
-        DispStream a const char*
-
-      * Mishandling of BUILD_ZLIB=0 option
-        [#85492]
-
-  2.060 7 January 2013
-
-      * Mention SimpleZip in POD
-
-  2.059 24 November 2012
-
-      * Copy-on-write support
-        [#81353]
-
-  2.058 12 November 2012
-
-      * No Changes
-
-  2.057 10 November 2012
-
-      * Compress::Raw::Zlib needs to use PERL_NO_GET_CONTEXT
-        [#80319]
-
-      * Install to 'site' instead of 'perl' when perl version is 5.11+
-        [#79812]
-
-      * update to ppport.h that includes SvPV_nomg_nolen
-        [#78079]
-
-  2.056 10 August 2012
-
-      * Fix C++ build issue
-        Thanks to Karl Williamson for supplying the patch.
-
-  2.055 4 August 2012
-
-      * Fix misuse of magic in API
-        [#78079]
-
-  2.054 8 May 2012
-
-      * Build issue on Win32
-        [#77030]
-
-  2.053 6 May 2012
-
-      * Include zlib 1.2.7 source.
-
-  2.052 29 April 2012
-
-      * Fixed build issue when Perl is built with C++
-
-  2.051 20 February 2012
-
-      * Bug in Compress::Raw::Zlib on Windows
-        [#75222]
-
-  2.050 20 February 2012
-
-      * Build failure on Irix & Solaris.
-        [RT #69985]
-
-  2.049 18 February 2012
-
-      * Include zlib 1.2.6 source.
-
-  2.048 29 January 2012
-
-      * Set minimum zlib version to 1.2.0
-
-  2.047 28 January 2012
-
-      * Allow flush to be called multiple times without any intermediate
-        call to deflate and still return Z_OK.
-        In the code below $status was Z_BUF_ERROR before this change.
-
-          $def->flush(...);
-          $status = $def->flush(...);
-
-      * Added support for zlibCompileFlags
-
-      * Set minimum Perl version to 5.6
-
-  2.045 3 December 2011
-
-      * Moved FAQ.pod into Zlib.pm
-
-  2.044 2 December 2011
-
-      * Moved FAQ.pod under the lib directory so it can get installed
-
-  2.043 20 November 2011
-
-      * No Changes
-
-  2.042 17 November 2011
-
-      * No Changes
-
-  2.040 28 October 2011
-
-      * No Changes
-
-  2.039 28 October 2011
-
-      * croak if attempt to freeze/thaw compression object
-        [RT #69985]
-
-  2.037 22 June 2011
-
-      * No Changes
-
-  2.036 6 May 2011
-
-      * Added offset patramter to CRC32
-
-  2.035 6 May 2011
-
-      * No Changes
-
-  2.033 11 Jan 2011
-      * Fixed typos & spelling errors.
-        [perl# 81782]
-
-  2.032 4 Jan 2011
-
-      * Document inflateReset
-        [RT #61082]
-
-  2.030 22 July 2010
-
-      * Ran the zlib2ansi script against the files in zlib-src.
-        Thanks to Nicholas Clark for the reminder.
-
-      * Added "-DNO_VIZ" to DEFINE in Makefile.PL
-        [RT #65293]
-
-  2.027 24 April 2010
-
-      * Updated to include zlib 1.2.5
-
-  2.026 7 April 2010
-
-      * Fixed definition of Z_TREES in Makefile.PL
-        [RT #65293]
-
-      * Fixed build issue with definition of off64_t not found on Solaris
-        by modifying the zlib source - changed the symbol
-        _LARGEFILE64_SOURCE to _LARGEFILE64_SOURCE_dummy in zconf.h,
-        zlib.h and zutil.h
-        [RT #56108]
-
-  2.025 27 March 2010
-
-      * Updated to include zlib 1.2.4
-
-      * Allow zlib version check to be disabled by setting
-        TEST_SKIP_VERSION_CHECK environment variable.
-        [RT #54510]
-
-  2.023 9 November 2009
-
-      * fixed instance where $[ should have been $] in t/02zlib.t
-        Thanks to Robin Barker and zefram [RT #50765] for independently
-        spotting the issue.
-
-  2.021 30 August 2009
-
-      * Changed test harness so that it can cope with PERL5OPT=-MCarp=verbose
-        [RT# 47225]
-
-  2.020 3 June 2009
-
-      * Minor documentation update.
-
-  2.019 4 May 2009
-
-      * No Changes
-
-  2.018 3 May 2009
-
-      * No Changes
-
-  2.017 28 March 2009
-
-      * Added 'LimitOutput' option
-
-      * Removed MAN3PODS from Makefile.PL
-
-      * Fixed coring issue when LimitOutput was used.
-
-      * Documented Compress::Raw::Zlib::zlib_version()
-
-      * Documented Compress::Raw::Zlib::deflateReset()
-        [RT #40566]
-
-  2.015 3 September 2008
-
-      * Makefile.PL
-        Backout changes made in 2.014
-
-  2.014 2 September 2008
-
-      * Makefile.PL
-        Updated to check for indirect dependencies.
-
-  2.012 15 July 2008
-
-      * Document the gzip flags that WindowBits can take.
-
-      * Allow a dictionary to be used with a raw inflate.
-        Needs zlib 1.2.2.1 or better.
-        [RT #36046]
-
-  2.011 5 May 2008
-
-      * A C++-style comment sneaked in with the last update. Fixed.
-        [core patch #33828]
-
-  2.010 5 May 2008
-
-      * No Changes
-
-  2.009 20 April 2008
-
-      * No Changes
-
-  2.008 2 November 2007
-
-      * Minor documentation changes in README
-
-  2.006 1 September 2007
-
-      * Makefile.PL
-        Added INSTALLDIRS directive to install as a core module when built
-        on a perl >= 5.9.
-
-  2.005 18 June 2007
-
-      * Only include ppport.h when not being built with perl.
-        [core patch #30655]
-
-  2.004 3 March 2007
-
-      * Fixed lvalue substr issue
-
-      * Remove redundant code from Zlib.xs
-
-  2.003 2 January 2007
-
-      * Added explicit version checking
-
-  2.002 29 December 2006
-
-      * Documentation updates.
-
-  2.001 1 November 2006
-
-      * Remove beta status.
-
-  2.000_14 26 October 2006
-
-      * Fixed memory leak on realloc.
-
-      * Ticket #18986 says that ExtUtils::Install 1.39 fixes the in-use
-        issue on win32/cygwin, so make the code that checks whether trying
-        to install via the cpan shell conditional on the version of
-        ExtUtils::Install.
-        http://rt.cpan.org/Ticket/Display.html?id=18986
-
-  2.000_10 13 March 2006
-
-      * Fixed a potential NULL pointer dereference problem in
-        Compress::Raw::Zlib::resetLastBlockByte.
-        Issue highlighted by David Dyck and reproduced by Marcus Holland-Moritz.
-
-  2.000_09 3 March 2006
-
-      * Released onto CPAN
-
-      * Documentation updates.
-
-  2.000_08 2 March 2006
-
-      * Moved the IO::* modules out into their own distributions.
-
-      * Breakout zlib specific code into separate modules.
-
-      * Limited support for reading/writing zip files added.
-
-  2.000_06 5 October 2005
-
-      * Added eof parameter to Compress::Zlib::inflate method.
-
-      * Fixed issue with 64-bit
-
-  2.000_05 4 October 2005
-
-      * Renamed IO::* to IO::Compress::* & IO::Uncompress::*
-
-  2.000_04 23 September 2005
-
-      * Fixed some more non-portable test that were failing on VMS.
-
-      * fixed problem where error messages in the oneshot interface were
-        getting lost.
-
-  2.000_03 12 September 2005
-
-      * Fixed some non-portable test that were failing on VMS.
-
-      * Fixed export of zlib constants from the IO::* classes
-
-  2.000_02 6 September 2005
-
-      * Split Append mode into Append and Merge
-
-      * Fixed typos in the documentation.
-
-      * Added pod/FAQ.pod
-
-      * Added libscan to Makefile.PL
-
-      * Added InputLength for IO::Gunzip et al
-
-  2.000_01 22 August 2005
-
-      * Fixed VERSION in Compress::Gzip::Constants
-
-      * Removed Compress::Gzip::Info from the distribution.
-
-  2.000_00 21 August 2005
-
-      * First Beta relase of Compress::zlib rewrite.
diff --git a/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/MANIFEST b/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/MANIFEST
deleted file mode 100644 (file)
index 80bb59c..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-README
-Changes
-t/000prereq.t
-t/01version.t
-t/02zlib.t
-t/07bufsize.t
-t/09limitoutput.t
-t/18lvalue.t
-t/19nonpv.t
-t/99pod.t
-t/Test/Builder.pm
-t/Test/More.pm
-t/Test/Simple.pm
-t/compress/CompTestUtils.pm
-t/meta-json.t
-t/meta-yaml.t
-Zlib.xs
-typemap
-Makefile.PL
-private/MakeUtil.pm
-MANIFEST
-ppport.h
-config.in
-zlib-src/adler32.c
-zlib-src/compress.c
-zlib-src/crc32.c
-zlib-src/crc32.h
-zlib-src/deflate.c
-zlib-src/deflate.h
-zlib-src/infback.c
-zlib-src/inffast.c
-zlib-src/inffast.h
-zlib-src/inffixed.h
-zlib-src/inflate.c
-zlib-src/inflate.h
-zlib-src/inftrees.c
-zlib-src/inftrees.h
-zlib-src/trees.c
-zlib-src/trees.h
-zlib-src/uncompr.c
-zlib-src/zconf.h
-zlib-src/zlib.h
-zlib-src/zutil.c
-zlib-src/zutil.h
-fallback/constants.h
-fallback/constants.xs
-lib/Compress/Raw/Zlib.pm
-examples/filtdef    Perl
-examples/filtinf    Perl
-META.yml                                 Module meta-data (added by MakeMaker)
-META.json                                Module JSON meta-data (added by MakeMaker)
diff --git a/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/META.json b/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/META.json
deleted file mode 100644 (file)
index b9e6c9d..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-{
-   "abstract" : "unknown",
-   "author" : [
-      "unknown"
-   ],
-   "dynamic_config" : 1,
-   "generated_by" : "ExtUtils::MakeMaker version 7.34, CPAN::Meta::Converter version 2.150005",
-   "license" : [
-      "perl_5"
-   ],
-   "meta-spec" : {
-      "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
-      "version" : "2"
-   },
-   "name" : "Compress-Raw-Zlib",
-   "no_index" : {
-      "directory" : [
-         "t",
-         "inc",
-         "t",
-         "private"
-      ]
-   },
-   "prereqs" : {
-      "build" : {
-         "requires" : {
-            "ExtUtils::MakeMaker" : "0"
-         }
-      },
-      "configure" : {
-         "requires" : {
-            "ExtUtils::MakeMaker" : "0"
-         }
-      }
-   },
-   "release_status" : "stable",
-   "resources" : {
-      "bugtracker" : {
-         "web" : "https://github.com/pmqs/Compress-Raw-Zlib/issues"
-      },
-      "homepage" : "https://github.com/pmqs/Compress-Raw-Zlib",
-      "repository" : {
-         "type" : "git",
-         "url" : "git://github.com/pmqs/Compress-Raw-Zlib.git",
-         "web" : "https://github.com/pmqs/Compress-Raw-Zlib"
-      }
-   },
-   "version" : "2.202",
-   "x_serialization_backend" : "JSON::PP version 2.27300"
-}
diff --git a/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/README b/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/README
deleted file mode 100644 (file)
index 310f1c0..0000000
+++ /dev/null
@@ -1,381 +0,0 @@
-
-                            Compress-Raw-Zlib
-
-                               Version 2.202
-
-                               27 June 2022
-
-        Copyright (c) 2005-2022 Paul Marquess. All rights reserved.
-          This program is free software; you can redistribute it
-           and/or modify it under the same terms as Perl itself.
-
-              The directory zlib-src contains a subset of the
-             source files copied directly from zlib version 1.2.13.
-                  These files are Copyright(C) 1995-2022
-                     Jean-loup Gailly and Mark Adler.
-             Full source for the zlib library is available at
-                            http://www.zlib.org
-
-DESCRIPTION
------------
-
-This module provides a Perl interface to the zlib compression library.
-
-PREREQUISITES
--------------
-
-Before you can build Compress-Raw-Zlib you need to have the following
-installed on your system:
-
-    * A C compiler
-
-    * Perl 5.006 or better.
-
-By default, Compress-Raw-Zlib will build its own private copy of the
-zlib library. If you want to use a different version of
-zlib, follow the instructions in the section called
-"Controlling the version of zlib used by Compress-Raw-Zlib"
-later in this document.
-
-BUILDING THE MODULE
--------------------
-
-Assuming you have met all the prerequisites, the module can now be built
-using this sequence of commands:
-
-    perl Makefile.PL
-    make
-    make test
-
-INSTALLATION
-------------
-
-To install Compress-Raw-Zlib, run the command below:
-
-    make install
-
-Controlling the version of zlib used by Compress-Raw-Zlib
-----------------------------------------------------------
-
-Compress-Raw-Zlib interfaces to the zlib compression library. There
-are three options available to control which version/instance of the
-zlib library is used:
-
-    1. Build a private copy of the zlib library using the
-       zlib library source that is included with this module.
-       This is the default and recommended option.
-
-    2. Build a private copy of the zlib library using a standard
-       zlib source distribution.
-
-    3. Use a pre-built zlib library.
-
-Note that if you intend to use either Option 2 or 3, you need to have
-zlib version 1.2.0 or better.
-
-The contents of the file config.in are used to control which of the
-three options is actually used. This file is read during the
-
-    perl Makefile.PL
-
-step of the build, so remember to make any required changes to config.in
-before building this module.
-
-  Option 1
-  --------
-
-  For option 1, edit the file config.in and set the variables in it
-  as follows:
-
-      BUILD_ZLIB   = True
-      INCLUDE      = ./zlib-src
-      LIB          = ./zlib-src
-      OLD_ZLIB     = False
-      GZIP_OS_CODE = AUTO_DETECT
-
-  Option 2
-  --------
-
-  For option 2, fetch a copy of the zlib source distribution from
-  http://www.zlib.org and unpack it into the Compress-Raw-Zlib source
-  directory. Assuming you have fetched zlib 1.2.13,
-  it will create a directory called zlib-1.2.13.
-
-  Now set the variables in the file config.in as follows (if the version
-  you have fetched isn't 1.2.13, change the INCLUDE and LIB
-  variables appropriately):
-
-      BUILD_ZLIB   = True
-      INCLUDE      = ./zlib-1.2.13
-      LIB          = ./zlib-1.2.13
-      OLD_ZLIB     = False
-      GZIP_OS_CODE = AUTO_DETECT
-
-  Option 3
-  --------
-
-  For option 3, you need to find out where zlib is stored on your
-  system.  There are two parts to this.
-
-  First, find the directory where the zlib library is stored (some
-  common names for the library are libz.a and libz.so). Set the LIB variable
-  in the config.in file to that directory.
-
-  Secondly, find the directory where the file zlib.h is stored. Now set
-  the INCLUDE variable in the config.in file to that directory.
-
-  Next set BUILD_ZLIB to False.
-
-  Finally, if you are running zlib 1.0.5 or older, set the OLD_ZLIB
-  variable to True. Otherwise set it to False.
-
-  As an example, if the zlib library on your system is in
-  /usr/local/lib, zlib.h is in /usr/local/include and zlib is more
-  recent than version 1.0.5, the variables in config.in should be set as
-  follows:
-
-      BUILD_ZLIB   = False
-      INCLUDE      = /usr/local/include
-      LIB          = /usr/local/lib
-      OLD_ZLIB     = False
-      GZIP_OS_CODE = AUTO_DETECT
-
-Setting the Gzip OS Code
-------------------------
-
-Every gzip stream stores a byte in its header to identify the Operating
-System that was used to create the gzip stream. When you build Compress-Raw-Zlib it will attempt to determine the value that is correct for
-your Operating System. This will then be used by IO::Compress::Gzip as the
-default value for the OS byte in all gzip headers it creates.
-
-The variable GZIP_OS_CODE in the config.in file controls the setting of
-this value when building Compress-Raw-Zlib. If GZIP_OS_CODE is set to
-AUTO_DETECT, Compress-Raw-Zlib will attempt to determine the correct value for
-your Operating System.
-
-Alternatively, you can override auto-detection of the default OS code and
-explicitly set it yourself. Set the GZIP_OS_CODE variable in the config.in
-file to be a number between 0 and 255. For example
-
-    GZIP_OS_CODE = 3
-
-See RFC 1952 for valid OS codes that can be used.
-
-If you are running one of the less popular Operating Systems, it is
-possible that the default value picked by this module is incorrect or the
-default value (3) is used when there is a better value available. When
-Compress-Raw-Zlib cannot determine what operating system you are running, it
-will use the default value 3 for the OS code.
-
-If you find you have to change this value, because you think the value auto
-detected is incorrect, please take a few moments to contact the author of
-this module.
-
-TROUBLESHOOTING
----------------
-
-Undefined Symbol gzsetparams
-----------------------------
-
-If you get the error shown below when you run the Compress-Raw-Zlib test
-harness it probably means you are running a copy of zlib that is
-version 1.0.5 or older.
-
-t/01version.........Can't load 'blib/arch/auto/Compress/Zlib/Zlib.so' for
-                    module Compress::Raw::Zlib: blib/arch/auto/Compress/Raw/Zlib/Zlib.so:
-                    undefined symbol: gzsetparams at ...
-
-There are two ways to fix this problem:
-
-    1. Upgrade to the latest version of zlib.
-
-    2. Edit config.in and set the OLD_ZLIB variable to True.
-
-Test Harness 01version fails
-----------------------------
-If the 01version test harness fails, and the problem isn't covered by the
-scenario above, it probably means that you have two versions of
-zlib installed on your system.
-
-Run the command below to see if this is indeed the case
-
-    make test TEST_VERBOSE=1 TEST_FILES=t/01version.t
-
-Try removing the one you don't want to use and rebuild.
-
-Solaris build fails with "language optional software package not installed"
----------------------------------------------------------------------------
-
-If you are trying to build this module under Solaris and you get an
-error message like this
-
-    /usr/ucb/cc: language optional software package not installed
-
-it means that Perl cannot find the C compiler on your system. The cryptic
-message is just Sun's way of telling you that you haven't bought their
-C compiler.
-
-When you build a Perl module that needs a C compiler, the Perl build
-system tries to use the same C compiler that was used to build perl
-itself. In this case your Perl binary was built with a C compiler that
-lived in /usr/ucb.
-
-To continue with building this module, you need to get a C compiler,
-or tell Perl where your C compiler is, if you already have one.
-
-Assuming you have now got a C compiler, what you do next will be dependent
-on what C compiler you have installed. If you have just installed Sun's
-C compiler, you shouldn't have to do anything. Just try rebuilding
-this module.
-
-If you have installed another C compiler, say gcc, you have to tell perl
-how to use it instead of /usr/ucb/cc.
-
-This set of options seems to work if you want to use gcc. Your mileage
-may vary.
-
-    perl Makefile.PL CC=gcc CCCDLFLAGS=-fPIC OPTIMIZE=" "
-    make test
-
-If that doesn't work for you, it's time to make changes to the Makefile
-by hand. Good luck!
-
-Solaris build fails with "gcc: unrecognized option `-KPIC'"
------------------------------------------------------------
-
-You are running Solaris and you get an error like this when you try to
-build this Perl module
-
-    gcc: unrecognized option `-KPIC'
-
-This symptom usually means that you are using a Perl binary that has been
-built with the Sun C compiler, but you are using gcc to build this module.
-
-When Perl builds modules that need a C compiler, it will attempt to use
-the same C compiler and command line options that was used to build perl
-itself. In this case "-KPIC" is a valid option for the Sun C compiler,
-but not for gcc. The equivalent option for gcc is "-fPIC".
-
-The solution is either:
-
-    1. Build both Perl and this module with the same C compiler, either
-       by using the Sun C compiler for both or gcc for both.
-
-    2. Try generating the Makefile for this module like this perl
-
-           perl Makefile.PL CC=gcc CCCDLFLAGS=-fPIC OPTIMIZE=" " LD=gcc
-           make test
-
-       This second option seems to work when mixing a Perl binary built
-       with the Sun C compiler and this module built with gcc. Your
-       mileage may vary.
-
-HP-UX Notes
------------
-
-I've had a report that when building Compress-Raw-Zlib under HP-UX that it
-is necessary to have first built the zlib library with the -fpic
-option.
-
-Linux Notes
------------
-
-Although most Linux distributions already come with zlib, some
-people report getting this error when they try to build this module:
-
-$ make
-cp Zlib.pm blib/lib/Compress/Zlib.pm
-AutoSplitting blib/lib/Compress/Zlib.pm (blib/lib/auto/Compress/Zlib)
-/usr/bin/perl -I/usr/lib/perl5/5.6.1/i386-linux -I/usr/lib/perl5/5.6.1 /usr/lib/perl5/5.6.1/ExtUtils/xsubpp  -typemap /usr/lib/perl5/5.6.1/ExtUtils/typemap -typemap typemap Zlib.xs > Zlib.xsc && mv Zlib.xsc Zlib.c
-gcc -c -I/usr/local/include -fno-strict-aliasing -I/usr/local/include -O2 -march=i386 -mcpu=i686   -DVERSION=\"1.16\" -DXS_VERSION=\"1.16\" -fPIC -I/usr/lib/perl5/5.6.1/i386-linux/CORE  Zlib.c
-Zlib.xs:25:19: zlib.h: No such file or directory
-make: *** [Zlib.o] Error 1
-
-This usually means that you have not installed the development RPM
-for zlib. Check for an RPM that start with "zlib-devel" in your Linux
-distribution.
-
-Win32 Notes
------------
-
-If you are running Activestate Perl (from http://www.activestate.com),
-it ships with a pre-compiled version of Compress-Raw-Zlib. To check if a
-newer version of Compress-Raw-Zlib is available run this from the command
-prompt
-
-    C:\> ppm verify -upgrade Compress-Raw-Zlib
-
-If you are not running Activestate Perl and you don't have access
-to a C compiler, you will not be able to build and install this module.
-
-Win32 & Cygwin Notes
---------------------
-
-It is not possible to install Compress-Raw-Zlib using the CPAN shell.
-This is because the Compress-Raw-Zlib DLL is itself used by the CPAN shell
-and it is impossible to remove a DLL while it is already loaded under
-Windows.
-
-The workaround is to install Compress-Raw-Zlib manually using the
-instructions given at the start of this file.
-
-SUPPORT
--------
-
-General feedback/questions/bug reports should be sent to
-https://github.com/pmqs/Compress-Raw-Zlib/issues (preferred) or
-https://rt.cpan.org/Public/Dist/Display.html?Name=Compress-Raw-Zlib.
-
-FEEDBACK
---------
-
-How to report a problem with Compress-Raw-Zlib.
-
-To help me help you, I need all of the following information:
-
- 1. The Versions of everything relevant.
-    This includes:
-
-     a. The *complete* output from running this
-
-            perl -V
-
-        Do not edit the output in any way.
-        Note, I want you to run "perl -V" and NOT "perl -v".
-
-        If your perl does not understand the "-V" option it is too
-        old. This module needs Perl version 5.004 or better.
-
-     b. The version of Compress-Raw-Zlib you have.
-        If you have successfully installed Compress-Raw-Zlib, this one-liner
-        will tell you:
-
-           perl -MCompress::Raw::Zlib -e 'print qq[ver $Compress::Raw::Zlib::VERSION\n]'
-
-        If you are  running windows use this
-
-           perl -MCompress::Raw::Zlib -e "print qq[ver $Compress::Raw::Zlib::VERSION\n]"
-
-        If you haven't installed Compress-Raw-Zlib then search Compress::Raw::Zlib.pm
-        for a line like this:
-
-          $VERSION = "2.202" ;
-
-     c. The version of zlib you have used.
-        If you have successfully installed Compress-Raw-Zlib, this one-liner
-        will tell you:
-
-          perl -MCompress::Raw::Zlib -e "print q[zlib ver ]. Compress::Raw::Zlib::ZLIB_VERSION.qq[\n]"
-
-        If not, look at the beginning of the file zlib.h.
-
- 2. If you are having problems building Compress-Raw-Zlib, send me a
-    complete log of what happened. Start by unpacking the Compress-Raw-Zlib
-    module into a fresh directory and keep a log of all the steps
-
-        [edit config.in, if necessary]
-        perl Makefile.PL
-        make
-        make test TEST_VERBOSE=1
-
-Paul Marquess <pmqs@cpan.org>
index f9bb891..c47c66d 100644 (file)
@@ -1103,7 +1103,7 @@ _deflateInit(flags,level, method, windowBits, memLevel, strategy, bufsize, dicti
             "Compress::Raw::Zlib::deflateStream", (void*)s);
         XPUSHs(obj);
     }
-    if (GIMME == G_ARRAY) {
+    if (GIMME_V == G_ARRAY) {
         SV * sv = sv_2mortal(newSViv(err)) ;
        setDUALstatus(sv, err);
         XPUSHs(sv) ;
@@ -1176,7 +1176,7 @@ _inflateInit(flags, windowBits, bufsize, dictionary)
                    (void*)s);
         XPUSHs(obj);
     }
-    if (GIMME == G_ARRAY) {
+    if (GIMME_V == G_ARRAY) {
         SV * sv = sv_2mortal(newSViv(err)) ;
        setDUALstatus(sv, err);
         XPUSHs(sv) ;
@@ -2294,7 +2294,7 @@ _createDeflateStream(inf_s, flags,level, method, windowBits, memLevel, strategy,
 
     XPUSHs(sv_setref_pv(sv_newmortal(),
             "Compress::Raw::Zlib::deflateStream", (void*)s));
-    if (GIMME == G_ARRAY) {
+    if (GIMME_V == G_ARRAY) {
         SV * sv = sv_2mortal(newSViv(err)) ;
         setDUALstatus(sv, err);
         XPUSHs(sv) ;
index f6dd04c..b82e0b5 100644 (file)
@@ -16,9 +16,9 @@
 #    Setting the Gzip OS Code
 #
 
-BUILD_ZLIB      = False
-INCLUDE         = /usr/include
-LIB             = /usr/lib
+BUILD_ZLIB      = True
+INCLUDE         = ./zlib-src
+LIB             = ./zlib-src
 OLD_ZLIB        = False
 GZIP_OS_CODE    = AUTO_DETECT
 USE_ZLIB_NG     = False
diff --git a/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/examples/filtdef b/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/examples/filtdef
deleted file mode 100644 (file)
index 6046498..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-#!/usr/local/bin/perl
-
-use Compress::Raw::Zlib ;
-
-use strict ;
-use warnings ;
-
-binmode STDIN;
-binmode STDOUT;
-
-my $x = new Compress::Raw::Zlib::Deflate()
-   or die "Cannot create a deflation stream\n" ;
-
-my $output = '' ;
-
-while (<>)
-{
-    $x->deflate($_, $output) == Z_OK
-        or die "deflate failed\n" ;
-
-    print $output ;
-}
-
-$x->flush($output) == Z_OK
-    or die "flush failed\n" ;
-
-print $output ;
diff --git a/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/examples/filtinf b/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/examples/filtinf
deleted file mode 100644 (file)
index 0662c14..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-#!/usr/local/bin/perl
-
-use Compress::Raw::Zlib ;
-
-use strict ;
-use warnings ;
-
-binmode STDIN;
-binmode STDOUT;
-
-my $x = new Compress::Raw::Zlib::Inflate
-   or die "Cannot create a inflation stream\n" ;
-
-my $input = '' ;
-my $output = '' ;
-my $status ;
-
-while (read(STDIN, $input, 4096))
-{
-    $status = $x->inflate($input, $output) ;
-
-    print $output
-        if $status == Z_OK or $status == Z_STREAM_END ;
-
-    last if $status != Z_OK ;
-}
-
-die "inflation failed\n"
-    unless $status == Z_STREAM_END ;
index 7e403ba..7250f38 100644 (file)
@@ -10,7 +10,7 @@ use warnings ;
 use bytes ;
 our ($VERSION, $XS_VERSION, @ISA, @EXPORT, %EXPORT_TAGS, @EXPORT_OK, $AUTOLOAD, %DEFLATE_CONSTANTS, @DEFLATE_CONSTANTS);
 
-$VERSION = '2.202';
+$VERSION = '2.204_001';
 $XS_VERSION = $VERSION;
 $VERSION = eval $VERSION;
 
@@ -1637,7 +1637,7 @@ See the Changes file.
 
 =head1 COPYRIGHT AND LICENSE
 
-Copyright (c) 2005-2022 Paul Marquess. All rights reserved.
+Copyright (c) 2005-2023 Paul Marquess. All rights reserved.
 
 This program is free software; you can redistribute it and/or
 modify it under the same terms as Perl itself.
diff --git a/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/ppport.h b/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/ppport.h
deleted file mode 100644 (file)
index 9d8fe09..0000000
+++ /dev/null
@@ -1,8641 +0,0 @@
-#if 0
-<<'SKIP';
-#endif
-/*
-----------------------------------------------------------------------
-
-    ppport.h -- Perl/Pollution/Portability Version 3.52
-
-    Automatically created by Devel::PPPort running under perl 5.024000.
-
-    Do NOT edit this file directly! -- Edit PPPort_pm.PL and the
-    includes in parts/inc/ instead.
-
-    Use 'perldoc ppport.h' to view the documentation below.
-
-----------------------------------------------------------------------
-
-SKIP
-
-=pod
-
-=head1 NAME
-
-ppport.h - Perl/Pollution/Portability version 3.52
-
-=head1 SYNOPSIS
-
-  perl ppport.h [options] [source files]
-
-  Searches current directory for files if no [source files] are given
-
-  --help                      show short help
-
-  --version                   show version
-
-  --patch=file                write one patch file with changes
-  --copy=suffix               write changed copies with suffix
-  --diff=program              use diff program and options
-
-  --compat-version=version    provide compatibility with Perl version
-  --cplusplus                 accept C++ comments
-
-  --quiet                     don't output anything except fatal errors
-  --nodiag                    don't show diagnostics
-  --nohints                   don't show hints
-  --nochanges                 don't suggest changes
-  --nofilter                  don't filter input files
-
-  --strip                     strip all script and doc functionality
-                              from ppport.h
-
-  --list-provided             list provided API
-  --list-unsupported          list unsupported API
-  --api-info=name             show Perl API portability information
-
-=head1 COMPATIBILITY
-
-This version of F<ppport.h> is designed to support operation with Perl
-installations back to 5.003, and has been tested up to 5.30.
-
-=head1 OPTIONS
-
-=head2 --help
-
-Display a brief usage summary.
-
-=head2 --version
-
-Display the version of F<ppport.h>.
-
-=head2 --patch=I<file>
-
-If this option is given, a single patch file will be created if
-any changes are suggested. This requires a working diff program
-to be installed on your system.
-
-=head2 --copy=I<suffix>
-
-If this option is given, a copy of each file will be saved with
-the given suffix that contains the suggested changes. This does
-not require any external programs. Note that this does not
-automagically add a dot between the original filename and the
-suffix. If you want the dot, you have to include it in the option
-argument.
-
-If neither C<--patch> or C<--copy> are given, the default is to
-simply print the diffs for each file. This requires either
-C<Text::Diff> or a C<diff> program to be installed.
-
-=head2 --diff=I<program>
-
-Manually set the diff program and options to use. The default
-is to use C<Text::Diff>, when installed, and output unified
-context diffs.
-
-=head2 --compat-version=I<version>
-
-Tell F<ppport.h> to check for compatibility with the given
-Perl version. The default is to check for compatibility with Perl
-version 5.003. You can use this option to reduce the output
-of F<ppport.h> if you intend to be backward compatible only
-down to a certain Perl version.
-
-=head2 --cplusplus
-
-Usually, F<ppport.h> will detect C++ style comments and
-replace them with C style comments for portability reasons.
-Using this option instructs F<ppport.h> to leave C++
-comments untouched.
-
-=head2 --quiet
-
-Be quiet. Don't print anything except fatal errors.
-
-=head2 --nodiag
-
-Don't output any diagnostic messages. Only portability
-alerts will be printed.
-
-=head2 --nohints
-
-Don't output any hints. Hints often contain useful portability
-notes. Warnings will still be displayed.
-
-=head2 --nochanges
-
-Don't suggest any changes. Only give diagnostic output and hints
-unless these are also deactivated.
-
-=head2 --nofilter
-
-Don't filter the list of input files. By default, files not looking
-like source code (i.e. not *.xs, *.c, *.cc, *.cpp or *.h) are skipped.
-
-=head2 --strip
-
-Strip all script and documentation functionality from F<ppport.h>.
-This reduces the size of F<ppport.h> dramatically and may be useful
-if you want to include F<ppport.h> in smaller modules without
-increasing their distribution size too much.
-
-The stripped F<ppport.h> will have a C<--unstrip> option that allows
-you to undo the stripping, but only if an appropriate C<Devel::PPPort>
-module is installed.
-
-=head2 --list-provided
-
-Lists the API elements for which compatibility is provided by
-F<ppport.h>. Also lists if it must be explicitly requested,
-if it has dependencies, and if there are hints or warnings for it.
-
-=head2 --list-unsupported
-
-Lists the API elements that are known not to be supported by
-F<ppport.h> and below which version of Perl they probably
-won't be available or work.
-
-=head2 --api-info=I<name>
-
-Show portability information for API elements matching I<name>.
-If I<name> is surrounded by slashes, it is interpreted as a regular
-expression.
-
-=head1 DESCRIPTION
-
-In order for a Perl extension (XS) module to be as portable as possible
-across differing versions of Perl itself, certain steps need to be taken.
-
-=over 4
-
-=item *
-
-Including this header is the first major one. This alone will give you
-access to a large part of the Perl API that hasn't been available in
-earlier Perl releases. Use
-
-    perl ppport.h --list-provided
-
-to see which API elements are provided by ppport.h.
-
-=item *
-
-You should avoid using deprecated parts of the API. For example, using
-global Perl variables without the C<PL_> prefix is deprecated. Also,
-some API functions used to have a C<perl_> prefix. Using this form is
-also deprecated. You can safely use the supported API, as F<ppport.h>
-will provide wrappers for older Perl versions.
-
-=item *
-
-If you use one of a few functions or variables that were not present in
-earlier versions of Perl, and that can't be provided using a macro, you
-have to explicitly request support for these functions by adding one or
-more C<#define>s in your source code before the inclusion of F<ppport.h>.
-
-These functions or variables will be marked C<explicit> in the list shown
-by C<--list-provided>.
-
-Depending on whether you module has a single or multiple files that
-use such functions or variables, you want either C<static> or global
-variants.
-
-For a C<static> function or variable (used only in a single source
-file), use:
-
-    #define NEED_function
-    #define NEED_variable
-
-For a global function or variable (used in multiple source files),
-use:
-
-    #define NEED_function_GLOBAL
-    #define NEED_variable_GLOBAL
-
-Note that you mustn't have more than one global request for the
-same function or variable in your project.
-
-    Function / Variable       Static Request               Global Request
-    -----------------------------------------------------------------------------------------
-    PL_parser                 NEED_PL_parser               NEED_PL_parser_GLOBAL
-    PL_signals                NEED_PL_signals              NEED_PL_signals_GLOBAL
-    SvRX()                    NEED_SvRX                    NEED_SvRX_GLOBAL
-    caller_cx()               NEED_caller_cx               NEED_caller_cx_GLOBAL
-    croak_xs_usage()          NEED_croak_xs_usage          NEED_croak_xs_usage_GLOBAL
-    die_sv()                  NEED_die_sv                  NEED_die_sv_GLOBAL
-    eval_pv()                 NEED_eval_pv                 NEED_eval_pv_GLOBAL
-    grok_bin()                NEED_grok_bin                NEED_grok_bin_GLOBAL
-    grok_hex()                NEED_grok_hex                NEED_grok_hex_GLOBAL
-    grok_number()             NEED_grok_number             NEED_grok_number_GLOBAL
-    grok_numeric_radix()      NEED_grok_numeric_radix      NEED_grok_numeric_radix_GLOBAL
-    grok_oct()                NEED_grok_oct                NEED_grok_oct_GLOBAL
-    gv_fetchpvn_flags()       NEED_gv_fetchpvn_flags       NEED_gv_fetchpvn_flags_GLOBAL
-    load_module()             NEED_load_module             NEED_load_module_GLOBAL
-    mess()                    NEED_mess                    NEED_mess_GLOBAL
-    mess_nocontext()          NEED_mess_nocontext          NEED_mess_nocontext_GLOBAL
-    mess_sv()                 NEED_mess_sv                 NEED_mess_sv_GLOBAL
-    mg_findext()              NEED_mg_findext              NEED_mg_findext_GLOBAL
-    my_snprintf()             NEED_my_snprintf             NEED_my_snprintf_GLOBAL
-    my_sprintf()              NEED_my_sprintf              NEED_my_sprintf_GLOBAL
-    my_strlcat()              NEED_my_strlcat              NEED_my_strlcat_GLOBAL
-    my_strlcpy()              NEED_my_strlcpy              NEED_my_strlcpy_GLOBAL
-    my_strnlen()              NEED_my_strnlen              NEED_my_strnlen_GLOBAL
-    newCONSTSUB()             NEED_newCONSTSUB             NEED_newCONSTSUB_GLOBAL
-    newRV_noinc()             NEED_newRV_noinc             NEED_newRV_noinc_GLOBAL
-    newSV_type()              NEED_newSV_type              NEED_newSV_type_GLOBAL
-    newSVpvn_flags()          NEED_newSVpvn_flags          NEED_newSVpvn_flags_GLOBAL
-    newSVpvn_share()          NEED_newSVpvn_share          NEED_newSVpvn_share_GLOBAL
-    pv_display()              NEED_pv_display              NEED_pv_display_GLOBAL
-    pv_escape()               NEED_pv_escape               NEED_pv_escape_GLOBAL
-    pv_pretty()               NEED_pv_pretty               NEED_pv_pretty_GLOBAL
-    sv_2pv_flags()            NEED_sv_2pv_flags            NEED_sv_2pv_flags_GLOBAL
-    sv_2pvbyte()              NEED_sv_2pvbyte              NEED_sv_2pvbyte_GLOBAL
-    sv_catpvf_mg()            NEED_sv_catpvf_mg            NEED_sv_catpvf_mg_GLOBAL
-    sv_catpvf_mg_nocontext()  NEED_sv_catpvf_mg_nocontext  NEED_sv_catpvf_mg_nocontext_GLOBAL
-    sv_pvn_force_flags()      NEED_sv_pvn_force_flags      NEED_sv_pvn_force_flags_GLOBAL
-    sv_setpvf_mg()            NEED_sv_setpvf_mg            NEED_sv_setpvf_mg_GLOBAL
-    sv_setpvf_mg_nocontext()  NEED_sv_setpvf_mg_nocontext  NEED_sv_setpvf_mg_nocontext_GLOBAL
-    sv_unmagicext()           NEED_sv_unmagicext           NEED_sv_unmagicext_GLOBAL
-    utf8_to_uvchr_buf()       NEED_utf8_to_uvchr_buf       NEED_utf8_to_uvchr_buf_GLOBAL
-    vload_module()            NEED_vload_module            NEED_vload_module_GLOBAL
-    vmess()                   NEED_vmess                   NEED_vmess_GLOBAL
-    vnewSVpvf()               NEED_vnewSVpvf               NEED_vnewSVpvf_GLOBAL
-    warner()                  NEED_warner                  NEED_warner_GLOBAL
-
-To avoid namespace conflicts, you can change the namespace of the
-explicitly exported functions / variables using the C<DPPP_NAMESPACE>
-macro. Just C<#define> the macro before including C<ppport.h>:
-
-    #define DPPP_NAMESPACE MyOwnNamespace_
-    #include "ppport.h"
-
-The default namespace is C<DPPP_>.
-
-=back
-
-The good thing is that most of the above can be checked by running
-F<ppport.h> on your source code. See the next section for
-details.
-
-=head1 EXAMPLES
-
-To verify whether F<ppport.h> is needed for your module, whether you
-should make any changes to your code, and whether any special defines
-should be used, F<ppport.h> can be run as a Perl script to check your
-source code. Simply say:
-
-    perl ppport.h
-
-The result will usually be a list of patches suggesting changes
-that should at least be acceptable, if not necessarily the most
-efficient solution, or a fix for all possible problems.
-
-If you know that your XS module uses features only available in
-newer Perl releases, if you're aware that it uses C++ comments,
-and if you want all suggestions as a single patch file, you could
-use something like this:
-
-    perl ppport.h --compat-version=5.6.0 --cplusplus --patch=test.diff
-
-If you only want your code to be scanned without any suggestions
-for changes, use:
-
-    perl ppport.h --nochanges
-
-You can specify a different C<diff> program or options, using
-the C<--diff> option:
-
-    perl ppport.h --diff='diff -C 10'
-
-This would output context diffs with 10 lines of context.
-
-If you want to create patched copies of your files instead, use:
-
-    perl ppport.h --copy=.new
-
-To display portability information for the C<newSVpvn> function,
-use:
-
-    perl ppport.h --api-info=newSVpvn
-
-Since the argument to C<--api-info> can be a regular expression,
-you can use
-
-    perl ppport.h --api-info=/_nomg$/
-
-to display portability information for all C<_nomg> functions or
-
-    perl ppport.h --api-info=/./
-
-to display information for all known API elements.
-
-=head1 BUGS
-
-If this version of F<ppport.h> is causing failure during
-the compilation of this module, please check if newer versions
-of either this module or C<Devel::PPPort> are available on CPAN
-before sending a bug report.
-
-If F<ppport.h> was generated using the latest version of
-C<Devel::PPPort> and is causing failure of this module, please
-send a bug report to L<perlbug@perl.org|mailto:perlbug@perl.org>.
-
-Please include the following information:
-
-=over 4
-
-=item 1.
-
-The complete output from running "perl -V"
-
-=item 2.
-
-This file.
-
-=item 3.
-
-The name and version of the module you were trying to build.
-
-=item 4.
-
-A full log of the build that failed.
-
-=item 5.
-
-Any other information that you think could be relevant.
-
-=back
-
-For the latest version of this code, please get the C<Devel::PPPort>
-module from CPAN.
-
-=head1 COPYRIGHT
-
-Version 3.x, Copyright (c) 2004-2013, Marcus Holland-Moritz.
-
-Version 2.x, Copyright (C) 2001, Paul Marquess.
-
-Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
-
-This program is free software; you can redistribute it and/or
-modify it under the same terms as Perl itself.
-
-=head1 SEE ALSO
-
-See L<Devel::PPPort>.
-
-=cut
-
-use strict;
-
-# Disable broken TRIE-optimization
-BEGIN { eval '${^RE_TRIE_MAXBUF} = -1' if "$]" >= 5.009004 && "$]" <= 5.009005 }
-
-my $VERSION = 3.52;
-
-my %opt = (
-  quiet     => 0,
-  diag      => 1,
-  hints     => 1,
-  changes   => 1,
-  cplusplus => 0,
-  filter    => 1,
-  strip     => 0,
-  version   => 0,
-);
-
-my($ppport) = $0 =~ /([\w.]+)$/;
-my $LF = '(?:\r\n|[\r\n])';   # line feed
-my $HS = "[ \t]";             # horizontal whitespace
-
-# Never use C comments in this file!
-my $ccs  = '/'.'*';
-my $cce  = '*'.'/';
-my $rccs = quotemeta $ccs;
-my $rcce = quotemeta $cce;
-
-eval {
-  require Getopt::Long;
-  Getopt::Long::GetOptions(\%opt, qw(
-    help quiet diag! filter! hints! changes! cplusplus strip version
-    patch=s copy=s diff=s compat-version=s
-    list-provided list-unsupported api-info=s
-  )) or usage();
-};
-
-if ($@ and grep /^-/, @ARGV) {
-  usage() if "@ARGV" =~ /^--?h(?:elp)?$/;
-  die "Getopt::Long not found. Please don't use any options.\n";
-}
-
-if ($opt{version}) {
-  print "This is $0 $VERSION.\n";
-  exit 0;
-}
-
-usage() if $opt{help};
-strip() if $opt{strip};
-
-if (exists $opt{'compat-version'}) {
-  my($r,$v,$s) = eval { parse_version($opt{'compat-version'}) };
-  if ($@) {
-    die "Invalid version number format: '$opt{'compat-version'}'\n";
-  }
-  die "Only Perl 5 is supported\n" if $r != 5;
-  die "Invalid version number: $opt{'compat-version'}\n" if $v >= 1000 || $s >= 1000;
-  $opt{'compat-version'} = sprintf "%d.%03d%03d", $r, $v, $s;
-}
-else {
-  $opt{'compat-version'} = 5;
-}
-
-my %API = map { /^(\w+)\|([^|]*)\|([^|]*)\|(\w*)$/
-                ? ( $1 => {
-                      ($2                  ? ( base     => $2 ) : ()),
-                      ($3                  ? ( todo     => $3 ) : ()),
-                      (index($4, 'v') >= 0 ? ( varargs  => 1  ) : ()),
-                      (index($4, 'p') >= 0 ? ( provided => 1  ) : ()),
-                      (index($4, 'n') >= 0 ? ( nothxarg => 1  ) : ()),
-                    } )
-                : die "invalid spec: $_" } qw(
-AvFILLp|5.004050||p
-AvFILL|||
-BOM_UTF8|||
-BhkDISABLE||5.024000|
-BhkENABLE||5.024000|
-BhkENTRY_set||5.024000|
-BhkENTRY|||
-BhkFLAGS|||
-CALL_BLOCK_HOOKS|||
-CLASS|||n
-CPERLscope|5.005000||p
-CX_CURPAD_SAVE|||
-CX_CURPAD_SV|||
-C_ARRAY_END|5.013002||p
-C_ARRAY_LENGTH|5.008001||p
-CopFILEAV|5.006000||p
-CopFILEGV_set|5.006000||p
-CopFILEGV|5.006000||p
-CopFILESV|5.006000||p
-CopFILE_set|5.006000||p
-CopFILE|5.006000||p
-CopSTASHPV_set|5.006000||p
-CopSTASHPV|5.006000||p
-CopSTASH_eq|5.006000||p
-CopSTASH_set|5.006000||p
-CopSTASH|5.006000||p
-CopyD|5.009002|5.004050|p
-Copy|||
-CvPADLIST||5.008001|
-CvSTASH|||
-CvWEAKOUTSIDE|||
-DECLARATION_FOR_LC_NUMERIC_MANIPULATION||5.021010|n
-DEFSV_set|5.010001||p
-DEFSV|5.004050||p
-DO_UTF8||5.006000|
-END_EXTERN_C|5.005000||p
-ENTER|||
-ERRSV|5.004050||p
-EXTEND|||
-EXTERN_C|5.005000||p
-F0convert|||n
-FREETMPS|||
-GIMME_V||5.004000|n
-GIMME|||n
-GROK_NUMERIC_RADIX|5.007002||p
-G_ARRAY|||
-G_DISCARD|||
-G_EVAL|||
-G_METHOD|5.006001||p
-G_NOARGS|||
-G_SCALAR|||
-G_VOID||5.004000|
-GetVars|||
-GvAV|||
-GvCV|||
-GvHV|||
-GvSV|||
-Gv_AMupdate||5.011000|
-HEf_SVKEY|5.003070||p
-HeHASH||5.003070|
-HeKEY||5.003070|
-HeKLEN||5.003070|
-HePV||5.004000|
-HeSVKEY_force||5.003070|
-HeSVKEY_set||5.004000|
-HeSVKEY||5.003070|
-HeUTF8|5.010001|5.008000|p
-HeVAL||5.003070|
-HvENAMELEN||5.015004|
-HvENAMEUTF8||5.015004|
-HvENAME||5.013007|
-HvNAMELEN_get|5.009003||p
-HvNAMELEN||5.015004|
-HvNAMEUTF8||5.015004|
-HvNAME_get|5.009003||p
-HvNAME|||
-INT2PTR|5.006000||p
-IN_LOCALE_COMPILETIME|5.007002||p
-IN_LOCALE_RUNTIME|5.007002||p
-IN_LOCALE|5.007002||p
-IN_PERL_COMPILETIME|5.008001||p
-IS_NUMBER_GREATER_THAN_UV_MAX|5.007002||p
-IS_NUMBER_INFINITY|5.007002||p
-IS_NUMBER_IN_UV|5.007002||p
-IS_NUMBER_NAN|5.007003||p
-IS_NUMBER_NEG|5.007002||p
-IS_NUMBER_NOT_INT|5.007002||p
-IVSIZE|5.006000||p
-IVTYPE|5.006000||p
-IVdf|5.006000||p
-LEAVE|||
-LIKELY|||p
-LINKLIST||5.013006|
-LVRET|||
-MARK|||
-MULTICALL||5.024000|
-MUTABLE_PTR|5.010001||p
-MUTABLE_SV|5.010001||p
-MY_CXT_CLONE|5.009002||p
-MY_CXT_INIT|5.007003||p
-MY_CXT|5.007003||p
-MoveD|5.009002|5.004050|p
-Move|||
-NOOP|5.005000||p
-NUM2PTR|5.006000||p
-NVTYPE|5.006000||p
-NVef|5.006001||p
-NVff|5.006001||p
-NVgf|5.006001||p
-Newxc|5.009003||p
-Newxz|5.009003||p
-Newx|5.009003||p
-Nullav|||
-Nullch|||
-Nullcv|||
-Nullhv|||
-Nullsv|||
-OP_CLASS||5.013007|
-OP_DESC||5.007003|
-OP_NAME||5.007003|
-OP_TYPE_IS_OR_WAS||5.019010|
-OP_TYPE_IS||5.019007|
-ORIGMARK|||
-OpHAS_SIBLING|5.021007||p
-OpLASTSIB_set|5.021011||p
-OpMAYBESIB_set|5.021011||p
-OpMORESIB_set|5.021011||p
-OpSIBLING|5.021007||p
-PAD_BASE_SV|||
-PAD_CLONE_VARS|||
-PAD_COMPNAME_FLAGS|||
-PAD_COMPNAME_GEN_set|||
-PAD_COMPNAME_GEN|||
-PAD_COMPNAME_OURSTASH|||
-PAD_COMPNAME_PV|||
-PAD_COMPNAME_TYPE|||
-PAD_RESTORE_LOCAL|||
-PAD_SAVE_LOCAL|||
-PAD_SAVE_SETNULLPAD|||
-PAD_SETSV|||
-PAD_SET_CUR_NOSAVE|||
-PAD_SET_CUR|||
-PAD_SVl|||
-PAD_SV|||
-PERLIO_FUNCS_CAST|5.009003||p
-PERLIO_FUNCS_DECL|5.009003||p
-PERL_ABS|5.008001||p
-PERL_ARGS_ASSERT_CROAK_XS_USAGE|||p
-PERL_BCDVERSION|5.024000||p
-PERL_GCC_BRACE_GROUPS_FORBIDDEN|5.008001||p
-PERL_HASH|5.003070||p
-PERL_INT_MAX|5.003070||p
-PERL_INT_MIN|5.003070||p
-PERL_LONG_MAX|5.003070||p
-PERL_LONG_MIN|5.003070||p
-PERL_MAGIC_arylen|5.007002||p
-PERL_MAGIC_backref|5.007002||p
-PERL_MAGIC_bm|5.007002||p
-PERL_MAGIC_collxfrm|5.007002||p
-PERL_MAGIC_dbfile|5.007002||p
-PERL_MAGIC_dbline|5.007002||p
-PERL_MAGIC_defelem|5.007002||p
-PERL_MAGIC_envelem|5.007002||p
-PERL_MAGIC_env|5.007002||p
-PERL_MAGIC_ext|5.007002||p
-PERL_MAGIC_fm|5.007002||p
-PERL_MAGIC_glob|5.024000||p
-PERL_MAGIC_isaelem|5.007002||p
-PERL_MAGIC_isa|5.007002||p
-PERL_MAGIC_mutex|5.024000||p
-PERL_MAGIC_nkeys|5.007002||p
-PERL_MAGIC_overload_elem|5.024000||p
-PERL_MAGIC_overload_table|5.007002||p
-PERL_MAGIC_overload|5.024000||p
-PERL_MAGIC_pos|5.007002||p
-PERL_MAGIC_qr|5.007002||p
-PERL_MAGIC_regdata|5.007002||p
-PERL_MAGIC_regdatum|5.007002||p
-PERL_MAGIC_regex_global|5.007002||p
-PERL_MAGIC_shared_scalar|5.007003||p
-PERL_MAGIC_shared|5.007003||p
-PERL_MAGIC_sigelem|5.007002||p
-PERL_MAGIC_sig|5.007002||p
-PERL_MAGIC_substr|5.007002||p
-PERL_MAGIC_sv|5.007002||p
-PERL_MAGIC_taint|5.007002||p
-PERL_MAGIC_tiedelem|5.007002||p
-PERL_MAGIC_tiedscalar|5.007002||p
-PERL_MAGIC_tied|5.007002||p
-PERL_MAGIC_utf8|5.008001||p
-PERL_MAGIC_uvar_elem|5.007003||p
-PERL_MAGIC_uvar|5.007002||p
-PERL_MAGIC_vec|5.007002||p
-PERL_MAGIC_vstring|5.008001||p
-PERL_PV_ESCAPE_ALL|5.009004||p
-PERL_PV_ESCAPE_FIRSTCHAR|5.009004||p
-PERL_PV_ESCAPE_NOBACKSLASH|5.009004||p
-PERL_PV_ESCAPE_NOCLEAR|5.009004||p
-PERL_PV_ESCAPE_QUOTE|5.009004||p
-PERL_PV_ESCAPE_RE|5.009005||p
-PERL_PV_ESCAPE_UNI_DETECT|5.009004||p
-PERL_PV_ESCAPE_UNI|5.009004||p
-PERL_PV_PRETTY_DUMP|5.009004||p
-PERL_PV_PRETTY_ELLIPSES|5.010000||p
-PERL_PV_PRETTY_LTGT|5.009004||p
-PERL_PV_PRETTY_NOCLEAR|5.010000||p
-PERL_PV_PRETTY_QUOTE|5.009004||p
-PERL_PV_PRETTY_REGPROP|5.009004||p
-PERL_QUAD_MAX|5.003070||p
-PERL_QUAD_MIN|5.003070||p
-PERL_REVISION|5.006000||p
-PERL_SCAN_ALLOW_UNDERSCORES|5.007003||p
-PERL_SCAN_DISALLOW_PREFIX|5.007003||p
-PERL_SCAN_GREATER_THAN_UV_MAX|5.007003||p
-PERL_SCAN_SILENT_ILLDIGIT|5.008001||p
-PERL_SHORT_MAX|5.003070||p
-PERL_SHORT_MIN|5.003070||p
-PERL_SIGNALS_UNSAFE_FLAG|5.008001||p
-PERL_SUBVERSION|5.006000||p
-PERL_SYS_INIT3||5.006000|
-PERL_SYS_INIT|||
-PERL_SYS_TERM||5.024000|
-PERL_UCHAR_MAX|5.003070||p
-PERL_UCHAR_MIN|5.003070||p
-PERL_UINT_MAX|5.003070||p
-PERL_UINT_MIN|5.003070||p
-PERL_ULONG_MAX|5.003070||p
-PERL_ULONG_MIN|5.003070||p
-PERL_UNUSED_ARG|5.009003||p
-PERL_UNUSED_CONTEXT|5.009004||p
-PERL_UNUSED_DECL|5.007002||p
-PERL_UNUSED_RESULT|5.021001||p
-PERL_UNUSED_VAR|5.007002||p
-PERL_UQUAD_MAX|5.003070||p
-PERL_UQUAD_MIN|5.003070||p
-PERL_USE_GCC_BRACE_GROUPS|5.009004||p
-PERL_USHORT_MAX|5.003070||p
-PERL_USHORT_MIN|5.003070||p
-PERL_VERSION|5.006000||p
-PL_DBsignal|5.005000||p
-PL_DBsingle|||pn
-PL_DBsub|||pn
-PL_DBtrace|||pn
-PL_Sv|5.005000||p
-PL_bufend|5.024000||p
-PL_bufptr|5.024000||p
-PL_check||5.006000|
-PL_compiling|5.004050||p
-PL_comppad_name||5.017004|
-PL_comppad||5.008001|
-PL_copline|5.024000||p
-PL_curcop|5.004050||p
-PL_curpad||5.005000|
-PL_curstash|5.004050||p
-PL_debstash|5.004050||p
-PL_defgv|5.004050||p
-PL_diehook|5.004050||p
-PL_dirty|5.004050||p
-PL_dowarn|||pn
-PL_errgv|5.004050||p
-PL_error_count|5.024000||p
-PL_expect|5.024000||p
-PL_hexdigit|5.005000||p
-PL_hints|5.005000||p
-PL_in_my_stash|5.024000||p
-PL_in_my|5.024000||p
-PL_keyword_plugin||5.011002|
-PL_last_in_gv|||n
-PL_laststatval|5.005000||p
-PL_lex_state|5.024000||p
-PL_lex_stuff|5.024000||p
-PL_linestr|5.024000||p
-PL_modglobal||5.005000|n
-PL_na|5.004050||pn
-PL_no_modify|5.006000||p
-PL_ofsgv|||n
-PL_opfreehook||5.011000|n
-PL_parser|5.009005||p
-PL_peepp||5.007003|n
-PL_perl_destruct_level|5.004050||p
-PL_perldb|5.004050||p
-PL_ppaddr|5.006000||p
-PL_rpeepp||5.013005|n
-PL_rsfp_filters|5.024000||p
-PL_rsfp|5.024000||p
-PL_rs|||n
-PL_signals|5.008001||p
-PL_stack_base|5.004050||p
-PL_stack_sp|5.004050||p
-PL_statcache|5.005000||p
-PL_stdingv|5.004050||p
-PL_sv_arenaroot|5.004050||p
-PL_sv_no|5.004050||pn
-PL_sv_undef|5.004050||pn
-PL_sv_yes|5.004050||pn
-PL_sv_zero|||n
-PL_tainted|5.004050||p
-PL_tainting|5.004050||p
-PL_tokenbuf|5.024000||p
-POP_MULTICALL||5.024000|
-POPi|||n
-POPl|||n
-POPn|||n
-POPpbytex||5.007001|n
-POPpx||5.005030|n
-POPp|||n
-POPs|||n
-POPul||5.006000|n
-POPu||5.004000|n
-PTR2IV|5.006000||p
-PTR2NV|5.006000||p
-PTR2UV|5.006000||p
-PTR2nat|5.009003||p
-PTR2ul|5.007001||p
-PTRV|5.006000||p
-PUSHMARK|||
-PUSH_MULTICALL||5.024000|
-PUSHi|||
-PUSHmortal|5.009002||p
-PUSHn|||
-PUSHp|||
-PUSHs|||
-PUSHu|5.004000||p
-PUTBACK|||
-PadARRAY||5.024000|
-PadMAX||5.024000|
-PadlistARRAY||5.024000|
-PadlistMAX||5.024000|
-PadlistNAMESARRAY||5.024000|
-PadlistNAMESMAX||5.024000|
-PadlistNAMES||5.024000|
-PadlistREFCNT||5.017004|
-PadnameIsOUR|||
-PadnameIsSTATE|||
-PadnameLEN||5.024000|
-PadnameOURSTASH|||
-PadnameOUTER|||
-PadnamePV||5.024000|
-PadnameREFCNT_dec||5.024000|
-PadnameREFCNT||5.024000|
-PadnameSV||5.024000|
-PadnameTYPE|||
-PadnameUTF8||5.021007|
-PadnamelistARRAY||5.024000|
-PadnamelistMAX||5.024000|
-PadnamelistREFCNT_dec||5.024000|
-PadnamelistREFCNT||5.024000|
-PerlIO_clearerr||5.007003|
-PerlIO_close||5.007003|
-PerlIO_context_layers||5.009004|
-PerlIO_eof||5.007003|
-PerlIO_error||5.007003|
-PerlIO_fileno||5.007003|
-PerlIO_fill||5.007003|
-PerlIO_flush||5.007003|
-PerlIO_get_base||5.007003|
-PerlIO_get_bufsiz||5.007003|
-PerlIO_get_cnt||5.007003|
-PerlIO_get_ptr||5.007003|
-PerlIO_read||5.007003|
-PerlIO_restore_errno|||
-PerlIO_save_errno|||
-PerlIO_seek||5.007003|
-PerlIO_set_cnt||5.007003|
-PerlIO_set_ptrcnt||5.007003|
-PerlIO_setlinebuf||5.007003|
-PerlIO_stderr||5.007003|
-PerlIO_stdin||5.007003|
-PerlIO_stdout||5.007003|
-PerlIO_tell||5.007003|
-PerlIO_unread||5.007003|
-PerlIO_write||5.007003|
-PerlLIO_dup2_cloexec|||
-PerlLIO_dup_cloexec|||
-PerlLIO_open3_cloexec|||
-PerlLIO_open_cloexec|||
-PerlProc_pipe_cloexec|||
-PerlSock_accept_cloexec|||
-PerlSock_socket_cloexec|||
-PerlSock_socketpair_cloexec|||
-Perl_langinfo|||n
-Perl_setlocale|||n
-PoisonFree|5.009004||p
-PoisonNew|5.009004||p
-PoisonWith|5.009004||p
-Poison|5.008000||p
-READ_XDIGIT||5.017006|
-REPLACEMENT_CHARACTER_UTF8|||
-RESTORE_LC_NUMERIC||5.024000|
-RETVAL|||n
-Renewc|||
-Renew|||
-SAVECLEARSV|||
-SAVECOMPPAD|||
-SAVEPADSV|||
-SAVETMPS|||
-SAVE_DEFSV|5.004050||p
-SPAGAIN|||
-SP|||
-START_EXTERN_C|5.005000||p
-START_MY_CXT|5.007003||p
-STMT_END|||p
-STMT_START|||p
-STORE_LC_NUMERIC_FORCE_TO_UNDERLYING||5.024000|
-STORE_LC_NUMERIC_SET_TO_NEEDED||5.024000|
-STR_WITH_LEN|5.009003||p
-ST|||
-SV_CONST_RETURN|5.009003||p
-SV_COW_DROP_PV|5.008001||p
-SV_COW_SHARED_HASH_KEYS|5.009005||p
-SV_GMAGIC|5.007002||p
-SV_HAS_TRAILING_NUL|5.009004||p
-SV_IMMEDIATE_UNREF|5.007001||p
-SV_MUTABLE_RETURN|5.009003||p
-SV_NOSTEAL|5.009002||p
-SV_SMAGIC|5.009003||p
-SV_UTF8_NO_ENCODING|5.008001||p
-SVfARG|5.009005||p
-SVf_UTF8|5.006000||p
-SVf|5.006000||p
-SVt_INVLIST||5.019002|
-SVt_IV|||
-SVt_NULL|||
-SVt_NV|||
-SVt_PVAV|||
-SVt_PVCV|||
-SVt_PVFM|||
-SVt_PVGV|||
-SVt_PVHV|||
-SVt_PVIO|||
-SVt_PVIV|||
-SVt_PVLV|||
-SVt_PVMG|||
-SVt_PVNV|||
-SVt_PV|||
-SVt_REGEXP||5.011000|
-Safefree|||
-Slab_Alloc|||
-Slab_Free|||
-Slab_to_ro|||
-Slab_to_rw|||
-StructCopy|||
-SvCUR_set|||
-SvCUR|||
-SvEND|||
-SvGAMAGIC||5.006001|
-SvGETMAGIC|5.004050||p
-SvGROW|||
-SvIOK_UV||5.006000|
-SvIOK_notUV||5.006000|
-SvIOK_off|||
-SvIOK_only_UV||5.006000|
-SvIOK_only|||
-SvIOK_on|||
-SvIOKp|||
-SvIOK|||
-SvIVX|||
-SvIV_nomg|5.009001||p
-SvIV_set|||
-SvIVx|||
-SvIV|||
-SvIsCOW_shared_hash||5.008003|
-SvIsCOW||5.008003|
-SvLEN_set|||
-SvLEN|||
-SvLOCK||5.007003|
-SvMAGIC_set|5.009003||p
-SvNIOK_off|||
-SvNIOKp|||
-SvNIOK|||
-SvNOK_off|||
-SvNOK_only|||
-SvNOK_on|||
-SvNOKp|||
-SvNOK|||
-SvNVX|||
-SvNV_nomg||5.013002|
-SvNV_set|||
-SvNVx|||
-SvNV|||
-SvOK|||
-SvOOK_offset||5.011000|
-SvOOK|||
-SvPOK_off|||
-SvPOK_only_UTF8||5.006000|
-SvPOK_only|||
-SvPOK_on|||
-SvPOKp|||
-SvPOK|||
-SvPVCLEAR|||
-SvPVX_const|5.009003||p
-SvPVX_mutable|5.009003||p
-SvPVX|||
-SvPV_const|5.009003||p
-SvPV_flags_const_nolen|5.009003||p
-SvPV_flags_const|5.009003||p
-SvPV_flags_mutable|5.009003||p
-SvPV_flags|5.007002||p
-SvPV_force_flags_mutable|5.009003||p
-SvPV_force_flags_nolen|5.009003||p
-SvPV_force_flags|5.007002||p
-SvPV_force_mutable|5.009003||p
-SvPV_force_nolen|5.009003||p
-SvPV_force_nomg_nolen|5.009003||p
-SvPV_force_nomg|5.007002||p
-SvPV_force|||p
-SvPV_mutable|5.009003||p
-SvPV_nolen_const|5.009003||p
-SvPV_nolen|5.006000||p
-SvPV_nomg_const_nolen|5.009003||p
-SvPV_nomg_const|5.009003||p
-SvPV_nomg_nolen|5.013007||p
-SvPV_nomg|5.007002||p
-SvPV_renew|5.009003||p
-SvPV_set|||
-SvPVbyte_force||5.009002|
-SvPVbyte_nolen||5.006000|
-SvPVbytex_force||5.006000|
-SvPVbytex||5.006000|
-SvPVbyte|5.006000||p
-SvPVutf8_force||5.006000|
-SvPVutf8_nolen||5.006000|
-SvPVutf8x_force||5.006000|
-SvPVutf8x||5.006000|
-SvPVutf8||5.006000|
-SvPVx|||
-SvPV|||
-SvREADONLY_off|||
-SvREADONLY_on|||
-SvREADONLY|||
-SvREFCNT_dec_NN||5.017007|
-SvREFCNT_dec|||
-SvREFCNT_inc_NN|5.009004||p
-SvREFCNT_inc_simple_NN|5.009004||p
-SvREFCNT_inc_simple_void_NN|5.009004||p
-SvREFCNT_inc_simple_void|5.009004||p
-SvREFCNT_inc_simple|5.009004||p
-SvREFCNT_inc_void_NN|5.009004||p
-SvREFCNT_inc_void|5.009004||p
-SvREFCNT_inc|||p
-SvREFCNT|||
-SvROK_off|||
-SvROK_on|||
-SvROK|||
-SvRV_set|5.009003||p
-SvRV|||
-SvRXOK|5.009005||p
-SvRX|5.009005||p
-SvSETMAGIC|||
-SvSHARED_HASH|5.009003||p
-SvSHARE||5.007003|
-SvSTASH_set|5.009003||p
-SvSTASH|||
-SvSetMagicSV_nosteal||5.004000|
-SvSetMagicSV||5.004000|
-SvSetSV_nosteal||5.004000|
-SvSetSV|||
-SvTAINTED_off||5.004000|
-SvTAINTED_on||5.004000|
-SvTAINTED||5.004000|
-SvTAINT|||
-SvTHINKFIRST|||
-SvTRUE_nomg||5.013006|
-SvTRUE|||
-SvTYPE|||
-SvUNLOCK||5.007003|
-SvUOK|5.007001|5.006000|p
-SvUPGRADE|||
-SvUTF8_off||5.006000|
-SvUTF8_on||5.006000|
-SvUTF8||5.006000|
-SvUVXx|5.004000||p
-SvUVX|5.004000||p
-SvUV_nomg|5.009001||p
-SvUV_set|5.009003||p
-SvUVx|5.004000||p
-SvUV|5.004000||p
-SvVOK||5.008001|
-SvVSTRING_mg|5.009004||p
-THIS|||n
-UNDERBAR|5.009002||p
-UNICODE_REPLACEMENT|||p
-UNLIKELY|||p
-UTF8SKIP||5.006000|
-UTF8_IS_INVARIANT|||
-UTF8_IS_NONCHAR|||
-UTF8_IS_SUPER|||
-UTF8_IS_SURROGATE|||
-UTF8_MAXBYTES|5.009002||p
-UTF8_SAFE_SKIP|||p
-UVCHR_IS_INVARIANT|||
-UVCHR_SKIP||5.022000|
-UVSIZE|5.006000||p
-UVTYPE|5.006000||p
-UVXf|5.007001||p
-UVof|5.006000||p
-UVuf|5.006000||p
-UVxf|5.006000||p
-WARN_ALL|5.006000||p
-WARN_AMBIGUOUS|5.006000||p
-WARN_ASSERTIONS|5.024000||p
-WARN_BAREWORD|5.006000||p
-WARN_CLOSED|5.006000||p
-WARN_CLOSURE|5.006000||p
-WARN_DEBUGGING|5.006000||p
-WARN_DEPRECATED|5.006000||p
-WARN_DIGIT|5.006000||p
-WARN_EXEC|5.006000||p
-WARN_EXITING|5.006000||p
-WARN_GLOB|5.006000||p
-WARN_INPLACE|5.006000||p
-WARN_INTERNAL|5.006000||p
-WARN_IO|5.006000||p
-WARN_LAYER|5.008000||p
-WARN_MALLOC|5.006000||p
-WARN_MISC|5.006000||p
-WARN_NEWLINE|5.006000||p
-WARN_NUMERIC|5.006000||p
-WARN_ONCE|5.006000||p
-WARN_OVERFLOW|5.006000||p
-WARN_PACK|5.006000||p
-WARN_PARENTHESIS|5.006000||p
-WARN_PIPE|5.006000||p
-WARN_PORTABLE|5.006000||p
-WARN_PRECEDENCE|5.006000||p
-WARN_PRINTF|5.006000||p
-WARN_PROTOTYPE|5.006000||p
-WARN_QW|5.006000||p
-WARN_RECURSION|5.006000||p
-WARN_REDEFINE|5.006000||p
-WARN_REGEXP|5.006000||p
-WARN_RESERVED|5.006000||p
-WARN_SEMICOLON|5.006000||p
-WARN_SEVERE|5.006000||p
-WARN_SIGNAL|5.006000||p
-WARN_SUBSTR|5.006000||p
-WARN_SYNTAX|5.006000||p
-WARN_TAINT|5.006000||p
-WARN_THREADS|5.008000||p
-WARN_UNINITIALIZED|5.006000||p
-WARN_UNOPENED|5.006000||p
-WARN_UNPACK|5.006000||p
-WARN_UNTIE|5.006000||p
-WARN_UTF8|5.006000||p
-WARN_VOID|5.006000||p
-WIDEST_UTYPE|5.015004||p
-XCPT_CATCH|5.009002||p
-XCPT_RETHROW|5.009002||p
-XCPT_TRY_END|5.009002||p
-XCPT_TRY_START|5.009002||p
-XPUSHi|||
-XPUSHmortal|5.009002||p
-XPUSHn|||
-XPUSHp|||
-XPUSHs|||
-XPUSHu|5.004000||p
-XSPROTO|5.010000||p
-XSRETURN_EMPTY|||
-XSRETURN_IV|||
-XSRETURN_NO|||
-XSRETURN_NV|||
-XSRETURN_PV|||
-XSRETURN_UNDEF|||
-XSRETURN_UV|5.008001||p
-XSRETURN_YES|||
-XSRETURN|||p
-XST_mIV|||
-XST_mNO|||
-XST_mNV|||
-XST_mPV|||
-XST_mUNDEF|||
-XST_mUV|5.008001||p
-XST_mYES|||
-XS_APIVERSION_BOOTCHECK||5.024000|
-XS_EXTERNAL||5.024000|
-XS_INTERNAL||5.024000|
-XS_VERSION_BOOTCHECK||5.024000|
-XS_VERSION|||
-XSprePUSH|5.006000||p
-XS|||
-XopDISABLE||5.024000|
-XopENABLE||5.024000|
-XopENTRYCUSTOM||5.024000|
-XopENTRY_set||5.024000|
-XopENTRY||5.024000|
-XopFLAGS||5.013007|
-ZeroD|5.009002||p
-Zero|||
-__ASSERT_|||p
-_aMY_CXT|5.007003||p
-_inverse_folds|||
-_is_grapheme|||
-_is_in_locale_category|||
-_new_invlist_C_array|||
-_pMY_CXT|5.007003||p
-_to_fold_latin1|||n
-_to_upper_title_latin1|||
-_to_utf8_case|||
-_variant_byte_number|||n
-_warn_problematic_locale|||n
-aMY_CXT_|5.007003||p
-aMY_CXT|5.007003||p
-aTHXR_|5.024000||p
-aTHXR|5.024000||p
-aTHX_|5.006000||p
-aTHX|5.006000||p
-abort_execution|||
-add_above_Latin1_folds|||
-add_data|||n
-add_multi_match|||
-add_utf16_textfilter|||
-adjust_size_and_find_bucket|||n
-advance_one_LB|||
-advance_one_SB|||
-advance_one_WB|||
-allocmy|||
-amagic_call|||
-amagic_cmp_locale|||
-amagic_cmp|||
-amagic_deref_call||5.013007|
-amagic_i_ncmp|||
-amagic_is_enabled|||
-amagic_ncmp|||
-anonymise_cv_maybe|||
-any_dup|||
-ao|||
-apply_attrs_my|||
-apply_attrs|||
-apply|||
-argvout_final|||
-assert_uft8_cache_coherent|||
-assignment_type|||
-atfork_lock||5.007003|n
-atfork_unlock||5.007003|n
-av_arylen_p||5.009003|
-av_clear|||
-av_delete||5.006000|
-av_exists||5.006000|
-av_extend_guts|||
-av_extend|||
-av_fetch|||
-av_fill|||
-av_iter_p||5.011000|
-av_len|||
-av_make|||
-av_nonelem|||
-av_pop|||
-av_push|||
-av_reify|||
-av_shift|||
-av_store|||
-av_tindex|5.017009|5.017009|p
-av_top_index|5.017009|5.017009|p
-av_undef|||
-av_unshift|||
-ax|||n
-backup_one_GCB|||
-backup_one_LB|||
-backup_one_SB|||
-backup_one_WB|||
-bad_type_gv|||
-bad_type_pv|||
-bind_match|||
-block_end||5.004000|
-block_gimme||5.004000|
-block_start||5.004000|
-blockhook_register||5.013003|
-boolSV|5.004000||p
-boot_core_PerlIO|||
-boot_core_UNIVERSAL|||
-boot_core_mro|||
-bytes_cmp_utf8||5.013007|
-cBOOL|5.013000||p
-call_argv|5.006000||p
-call_atexit||5.006000|
-call_list||5.004000|
-call_method|5.006000||p
-call_pv|5.006000||p
-call_sv|5.006000||p
-caller_cx|5.013005|5.006000|p
-calloc||5.007002|n
-cando|||
-cast_i32||5.006000|n
-cast_iv||5.006000|n
-cast_ulong||5.006000|n
-cast_uv||5.006000|n
-category_name|||n
-change_engine_size|||
-check_and_deprecate|||
-check_type_and_open|||
-check_uni|||
-checkcomma|||
-ckWARN2_d|||
-ckWARN2|||
-ckWARN3_d|||
-ckWARN3|||
-ckWARN4_d|||
-ckWARN4|||
-ckWARN_d|||
-ckWARN|5.006000||p
-ck_entersub_args_core|||
-ck_entersub_args_list||5.013006|
-ck_entersub_args_proto_or_list||5.013006|
-ck_entersub_args_proto||5.013006|
-ck_warner_d||5.011001|v
-ck_warner||5.011001|v
-ckwarn_common|||
-ckwarn_d||5.009003|
-ckwarn||5.009003|
-clear_defarray||5.023008|
-clear_special_blocks|||
-clone_params_del|||n
-clone_params_new|||n
-closest_cop|||
-cntrl_to_mnemonic|||n
-compute_EXACTish|||n
-construct_ahocorasick_from_trie|||
-cop_free|||
-cop_hints_2hv||5.013007|
-cop_hints_fetch_pvn||5.013007|
-cop_hints_fetch_pvs||5.013007|
-cop_hints_fetch_pv||5.013007|
-cop_hints_fetch_sv||5.013007|
-cophh_2hv||5.013007|
-cophh_copy||5.013007|
-cophh_delete_pvn||5.013007|
-cophh_delete_pvs||5.013007|
-cophh_delete_pv||5.013007|
-cophh_delete_sv||5.013007|
-cophh_fetch_pvn||5.013007|
-cophh_fetch_pvs||5.013007|
-cophh_fetch_pv||5.013007|
-cophh_fetch_sv||5.013007|
-cophh_free||5.013007|
-cophh_new_empty||5.024000|
-cophh_store_pvn||5.013007|
-cophh_store_pvs||5.013007|
-cophh_store_pv||5.013007|
-cophh_store_sv||5.013007|
-core_prototype|||
-coresub_op|||
-cr_textfilter|||
-croak_caller|||vn
-croak_memory_wrap|5.019003||pn
-croak_no_mem|||n
-croak_no_modify|5.013003||pn
-croak_nocontext|||pvn
-croak_popstack|||n
-croak_sv|5.013001||p
-croak_xs_usage|5.010001||pn
-croak|||v
-csighandler||5.009003|n
-current_re_engine|||
-curse|||
-custom_op_desc||5.007003|
-custom_op_get_field|||
-custom_op_name||5.007003|
-custom_op_register||5.013007|
-custom_op_xop||5.013007|
-cv_clone_into|||
-cv_clone|||
-cv_const_sv_or_av|||n
-cv_const_sv||5.003070|n
-cv_dump|||
-cv_forget_slab|||
-cv_get_call_checker_flags|||
-cv_get_call_checker||5.013006|
-cv_name||5.021005|
-cv_set_call_checker_flags||5.021004|
-cv_set_call_checker||5.013006|
-cv_undef_flags|||
-cv_undef|||
-cvgv_from_hek|||
-cvgv_set|||
-cvstash_set|||
-cx_dump||5.005000|
-cx_dup|||
-cxinc|||
-dAXMARK|5.009003||p
-dAX|5.007002||p
-dITEMS|5.007002||p
-dMARK|||
-dMULTICALL||5.009003|
-dMY_CXT_SV|5.007003||p
-dMY_CXT|5.007003||p
-dNOOP|5.006000||p
-dORIGMARK|||
-dSP|||
-dTHR|5.004050||p
-dTHXR|5.024000||p
-dTHXa|5.006000||p
-dTHXoa|5.006000||p
-dTHX|5.006000||p
-dUNDERBAR|5.009002||p
-dVAR|5.009003||p
-dXCPT|5.009002||p
-dXSARGS|||
-dXSI32|||
-dXSTARG|5.006000||p
-deb_curcv|||
-deb_nocontext|||vn
-deb_stack_all|||
-deb_stack_n|||
-debop||5.005000|
-debprofdump||5.005000|
-debprof|||
-debstackptrs||5.007003|
-debstack||5.007003|
-debug_start_match|||
-deb||5.007003|v
-defelem_target|||
-del_sv|||
-delimcpy_no_escape|||n
-delimcpy||5.004000|n
-despatch_signals||5.007001|
-destroy_matcher|||
-die_nocontext|||vn
-die_sv|5.013001||p
-die_unwind|||
-die|||v
-dirp_dup|||
-div128|||
-djSP|||
-do_aexec5|||
-do_aexec|||
-do_aspawn|||
-do_binmode||5.004050|
-do_chomp|||
-do_close|||
-do_delete_local|||
-do_dump_pad|||
-do_eof|||
-do_exec3|||
-do_exec|||
-do_gv_dump||5.006000|
-do_gvgv_dump||5.006000|
-do_hv_dump||5.006000|
-do_ipcctl|||
-do_ipcget|||
-do_join|||
-do_magic_dump||5.006000|
-do_msgrcv|||
-do_msgsnd|||
-do_ncmp|||
-do_oddball|||
-do_op_dump||5.006000|
-do_open9||5.006000|
-do_openn||5.007001|
-do_open||5.003070|
-do_pmop_dump||5.006000|
-do_print|||
-do_readline|||
-do_seek|||
-do_semop|||
-do_shmio|||
-do_smartmatch|||
-do_spawn_nowait|||
-do_spawn|||
-do_sprintf|||
-do_sv_dump||5.006000|
-do_sysseek|||
-do_tell|||
-do_trans_complex_utf8|||
-do_trans_complex|||
-do_trans_count_utf8|||
-do_trans_count|||
-do_trans_simple_utf8|||
-do_trans_simple|||
-do_trans|||
-do_vecget|||
-do_vecset|||
-do_vop|||
-docatch|||
-does_utf8_overflow|||n
-doeval_compile|||
-dofile|||
-dofindlabel|||
-doform|||
-doing_taint||5.008001|n
-dooneliner|||
-doopen_pm|||
-doparseform|||
-dopoptoeval|||
-dopoptogivenfor|||
-dopoptolabel|||
-dopoptoloop|||
-dopoptosub_at|||
-dopoptowhen|||
-doref||5.009003|
-dounwind|||
-dowantarray|||
-drand48_init_r|||n
-drand48_r|||n
-dtrace_probe_call|||
-dtrace_probe_load|||
-dtrace_probe_op|||
-dtrace_probe_phase|||
-dump_all_perl|||
-dump_all||5.006000|
-dump_c_backtrace|||
-dump_eval||5.006000|
-dump_exec_pos|||
-dump_form||5.006000|
-dump_indent||5.006000|v
-dump_mstats|||
-dump_packsubs_perl|||
-dump_packsubs||5.006000|
-dump_regex_sets_structures|||
-dump_sub_perl|||
-dump_sub||5.006000|
-dump_sv_child|||
-dump_trie_interim_list|||
-dump_trie_interim_table|||
-dump_trie|||
-dump_vindent||5.006000|
-dumpuntil|||
-dup_attrlist|||
-dup_warnings|||
-edit_distance|||n
-emulate_setlocale|||n
-eval_pv|5.006000||p
-eval_sv|5.006000||p
-exec_failed|||
-expect_number|||
-fbm_compile||5.005000|
-fbm_instr||5.005000|
-feature_is_enabled|||
-filter_add|||
-filter_del|||
-filter_gets|||
-filter_read|||
-finalize_optree|||
-finalize_op|||
-find_and_forget_pmops|||
-find_array_subscript|||
-find_beginning|||
-find_byclass|||
-find_default_stash|||
-find_hash_subscript|||
-find_in_my_stash|||
-find_lexical_cv|||
-find_next_masked|||n
-find_runcv_where|||
-find_runcv||5.008001|
-find_rundefsv||5.013002|
-find_script|||
-find_span_end_mask|||n
-find_span_end|||n
-first_symbol|||n
-fixup_errno_string|||
-foldEQ_latin1_s2_folded|||n
-foldEQ_latin1||5.013008|n
-foldEQ_locale||5.013002|n
-foldEQ_utf8||5.013002|
-foldEQ||5.013002|n
-fold_constants|||
-forbid_setid|||
-force_ident_maybe_lex|||
-force_ident|||
-force_list|||
-force_next|||
-force_strict_version|||
-force_version|||
-force_word|||
-forget_pmop|||
-form_nocontext|||vn
-form||5.004000|v
-fp_dup|||
-fprintf_nocontext|||vn
-free_c_backtrace|||
-free_global_struct|||
-free_tied_hv_pool|||
-free_tmps|||
-gen_constant_list|||
-get_ANYOFM_contents|||
-get_ANYOF_cp_list_for_ssc|||
-get_and_check_backslash_N_name_wrapper|||
-get_and_check_backslash_N_name|||
-get_aux_mg|||
-get_av|5.006000||p
-get_c_backtrace_dump|||
-get_c_backtrace|||
-get_context||5.006000|n
-get_cvn_flags|||
-get_cvs|5.011000||p
-get_cv|5.006000||p
-get_db_sub|||
-get_debug_opts|||
-get_hash_seed|||
-get_hv|5.006000||p
-get_mstats|||
-get_no_modify|||
-get_num|||
-get_op_descs||5.005000|
-get_op_names||5.005000|
-get_opargs|||
-get_ppaddr||5.006000|
-get_sv|5.006000||p
-get_vtbl||5.005030|
-getcwd_sv||5.007002|
-getenv_len|||
-glob_2number|||
-glob_assign_glob|||
-gp_dup|||
-gp_free|||
-gp_ref|||
-grok_atoUV|||n
-grok_bin|5.007003||p
-grok_bslash_N|||
-grok_hex|5.007003||p
-grok_infnan||5.021004|
-grok_number_flags||5.021002|
-grok_number|5.007002||p
-grok_numeric_radix|5.007002||p
-grok_oct|5.007003||p
-group_end|||
-gv_AVadd|||
-gv_HVadd|||
-gv_IOadd|||
-gv_SVadd|||
-gv_add_by_type||5.011000|
-gv_autoload4||5.004000|
-gv_autoload_pvn||5.015004|
-gv_autoload_pv||5.015004|
-gv_autoload_sv||5.015004|
-gv_check|||
-gv_const_sv||5.009003|
-gv_dump||5.006000|
-gv_efullname3||5.003070|
-gv_efullname4||5.006001|
-gv_efullname|||
-gv_fetchfile_flags||5.009005|
-gv_fetchfile|||
-gv_fetchmeth_autoload||5.007003|
-gv_fetchmeth_internal|||
-gv_fetchmeth_pv_autoload||5.015004|
-gv_fetchmeth_pvn_autoload||5.015004|
-gv_fetchmeth_pvn||5.015004|
-gv_fetchmeth_pv||5.015004|
-gv_fetchmeth_sv_autoload||5.015004|
-gv_fetchmeth_sv||5.015004|
-gv_fetchmethod_autoload||5.004000|
-gv_fetchmethod|||
-gv_fetchmeth|||
-gv_fetchpvn_flags|5.009002||p
-gv_fetchpvs|5.009004||p
-gv_fetchpv|||
-gv_fetchsv|||
-gv_fullname3||5.003070|
-gv_fullname4||5.006001|
-gv_fullname|||
-gv_handler||5.007001|
-gv_init_pvn|||
-gv_init_pv||5.015004|
-gv_init_svtype|||
-gv_init_sv||5.015004|
-gv_init|||
-gv_is_in_main|||
-gv_magicalize_isa|||
-gv_magicalize|||
-gv_name_set||5.009004|
-gv_override|||
-gv_setref|||
-gv_stashpvn_internal|||
-gv_stashpvn|5.003070||p
-gv_stashpvs|5.009003||p
-gv_stashpv|||
-gv_stashsvpvn_cached|||
-gv_stashsv|||
-handle_named_backref|||
-handle_possible_posix|||
-handle_regex_sets|||
-handle_user_defined_property|||
-he_dup|||
-hek_dup|||
-hfree_next_entry|||
-hsplit|||
-hv_assert|||
-hv_auxinit_internal|||n
-hv_auxinit|||
-hv_clear_placeholders||5.009001|
-hv_clear|||
-hv_common_key_len||5.010000|
-hv_common||5.010000|
-hv_copy_hints_hv||5.009004|
-hv_delayfree_ent||5.004000|
-hv_delete_ent||5.003070|
-hv_delete|||
-hv_eiter_p||5.009003|
-hv_eiter_set||5.009003|
-hv_ename_add|||
-hv_ename_delete|||
-hv_exists_ent||5.003070|
-hv_exists|||
-hv_fetch_ent||5.003070|
-hv_fetchs|5.009003||p
-hv_fetch|||
-hv_fill||5.013002|
-hv_free_ent_ret|||
-hv_free_entries|||
-hv_free_ent||5.004000|
-hv_iterinit|||
-hv_iterkeysv||5.003070|
-hv_iterkey|||
-hv_iternextsv|||
-hv_iternext|||
-hv_iterval|||
-hv_ksplit||5.003070|
-hv_magic_check|||n
-hv_magic|||
-hv_name_set||5.009003|
-hv_notallowed|||
-hv_placeholders_get||5.009003|
-hv_placeholders_p|||
-hv_placeholders_set||5.009003|
-hv_pushkv|||
-hv_rand_set||5.018000|
-hv_riter_p||5.009003|
-hv_riter_set||5.009003|
-hv_scalar||5.009001|
-hv_store_ent||5.003070|
-hv_stores|5.009004||p
-hv_store|||
-hv_undef_flags|||
-hv_undef|||
-ibcmp_locale||5.004000|
-ibcmp_utf8||5.007003|
-ibcmp|||
-incline|||
-incpush_if_exists|||
-incpush_use_sep|||
-incpush|||
-ingroup|||
-init_argv_symbols|||
-init_constants|||
-init_dbargs|||
-init_debugger|||
-init_global_struct|||
-init_ids|||
-init_interp|||
-init_main_stash|||
-init_named_cv|||
-init_perllib|||
-init_postdump_symbols|||
-init_predump_symbols|||
-init_stacks||5.005000|
-init_tm||5.007002|
-init_uniprops|||
-inplace_aassign|||
-instr|||n
-intro_my||5.004000|
-intuit_method|||
-intuit_more|||
-invert|||
-invoke_exception_hook|||
-io_close|||
-isALNUMC_A|||p
-isALNUMC|5.006000||p
-isALNUM_A|||p
-isALNUM|||p
-isALPHANUMERIC_A|||p
-isALPHANUMERIC|5.017008|5.017008|p
-isALPHA_A|||p
-isALPHA|||p
-isASCII_A|||p
-isASCII|5.006000||p
-isBLANK_A|||p
-isBLANK|5.006001||p
-isC9_STRICT_UTF8_CHAR|||n
-isCNTRL_A|||p
-isCNTRL|5.006000||p
-isDIGIT_A|||p
-isDIGIT|||p
-isFF_OVERLONG|||n
-isFOO_utf8_lc|||
-isGCB|||
-isGRAPH_A|||p
-isGRAPH|5.006000||p
-isIDCONT_A|||p
-isIDCONT|5.017008|5.017008|p
-isIDFIRST_A|||p
-isIDFIRST|||p
-isLB|||
-isLOWER_A|||p
-isLOWER|||p
-isOCTAL_A|||p
-isOCTAL|5.013005|5.013005|p
-isPRINT_A|||p
-isPRINT|5.004000||p
-isPSXSPC_A|||p
-isPSXSPC|5.006001||p
-isPUNCT_A|||p
-isPUNCT|5.006000||p
-isSB|||
-isSCRIPT_RUN|||
-isSPACE_A|||p
-isSPACE|||p
-isSTRICT_UTF8_CHAR|||n
-isUPPER_A|||p
-isUPPER|||p
-isUTF8_CHAR_flags|||
-isUTF8_CHAR||5.021001|n
-isWB|||
-isWORDCHAR_A|||p
-isWORDCHAR|5.013006|5.013006|p
-isXDIGIT_A|||p
-isXDIGIT|5.006000||p
-is_an_int|||
-is_ascii_string||5.011000|n
-is_c9strict_utf8_string_loclen|||n
-is_c9strict_utf8_string_loc|||n
-is_c9strict_utf8_string|||n
-is_handle_constructor|||n
-is_invariant_string||5.021007|n
-is_lvalue_sub||5.007001|
-is_safe_syscall||5.019004|
-is_ssc_worth_it|||n
-is_strict_utf8_string_loclen|||n
-is_strict_utf8_string_loc|||n
-is_strict_utf8_string|||n
-is_utf8_char_buf||5.015008|n
-is_utf8_common_with_len|||
-is_utf8_common|||
-is_utf8_cp_above_31_bits|||n
-is_utf8_fixed_width_buf_flags|||n
-is_utf8_fixed_width_buf_loc_flags|||n
-is_utf8_fixed_width_buf_loclen_flags|||n
-is_utf8_invariant_string_loc|||n
-is_utf8_invariant_string|||n
-is_utf8_non_invariant_string|||n
-is_utf8_overlong_given_start_byte_ok|||n
-is_utf8_string_flags|||n
-is_utf8_string_loc_flags|||n
-is_utf8_string_loclen_flags|||n
-is_utf8_string_loclen||5.009003|n
-is_utf8_string_loc||5.008001|n
-is_utf8_string||5.006001|n
-is_utf8_valid_partial_char_flags|||n
-is_utf8_valid_partial_char|||n
-isa_lookup|||
-isinfnansv|||
-isinfnan||5.021004|n
-items|||n
-ix|||n
-jmaybe|||
-join_exact|||
-keyword_plugin_standard|||
-keyword|||
-leave_scope|||
-lex_stuff_pvs||5.013005|
-listkids|||
-list|||
-load_module_nocontext|||vn
-load_module|5.006000||pv
-localize|||
-looks_like_bool|||
-looks_like_number|||
-lop|||
-mPUSHi|5.009002||p
-mPUSHn|5.009002||p
-mPUSHp|5.009002||p
-mPUSHs|5.010001||p
-mPUSHu|5.009002||p
-mXPUSHi|5.009002||p
-mXPUSHn|5.009002||p
-mXPUSHp|5.009002||p
-mXPUSHs|5.010001||p
-mXPUSHu|5.009002||p
-magic_clear_all_env|||
-magic_cleararylen_p|||
-magic_clearenv|||
-magic_clearhints|||
-magic_clearhint|||
-magic_clearisa|||
-magic_clearpack|||
-magic_clearsig|||
-magic_copycallchecker|||
-magic_dump||5.006000|
-magic_existspack|||
-magic_freearylen_p|||
-magic_freeovrld|||
-magic_getarylen|||
-magic_getdebugvar|||
-magic_getdefelem|||
-magic_getnkeys|||
-magic_getpack|||
-magic_getpos|||
-magic_getsig|||
-magic_getsubstr|||
-magic_gettaint|||
-magic_getuvar|||
-magic_getvec|||
-magic_get|||
-magic_killbackrefs|||
-magic_methcall1|||
-magic_methcall|||v
-magic_methpack|||
-magic_nextpack|||
-magic_regdata_cnt|||
-magic_regdatum_get|||
-magic_regdatum_set|||
-magic_scalarpack|||
-magic_set_all_env|||
-magic_setarylen|||
-magic_setcollxfrm|||
-magic_setdbline|||
-magic_setdebugvar|||
-magic_setdefelem|||
-magic_setenv|||
-magic_sethint|||
-magic_setisa|||
-magic_setlvref|||
-magic_setmglob|||
-magic_setnkeys|||
-magic_setnonelem|||
-magic_setpack|||
-magic_setpos|||
-magic_setregexp|||
-magic_setsig|||
-magic_setsubstr|||
-magic_settaint|||
-magic_setutf8|||
-magic_setuvar|||
-magic_setvec|||
-magic_set|||
-magic_sizepack|||
-magic_wipepack|||
-make_matcher|||
-make_trie|||
-malloc_good_size|||n
-malloced_size|||n
-malloc||5.007002|n
-markstack_grow||5.021001|
-matcher_matches_sv|||
-maybe_multimagic_gv|||
-mayberelocate|||
-measure_struct|||
-memEQs|5.009005||p
-memEQ|5.004000||p
-memNEs|5.009005||p
-memNE|5.004000||p
-mem_collxfrm|||
-mem_log_alloc|||n
-mem_log_common|||n
-mem_log_free|||n
-mem_log_realloc|||n
-mess_alloc|||
-mess_nocontext|||pvn
-mess_sv|5.013001||p
-mess|5.006000||pv
-mfree||5.007002|n
-mg_clear|||
-mg_copy|||
-mg_dup|||
-mg_find_mglob|||
-mg_findext|5.013008||pn
-mg_find|||n
-mg_free_type||5.013006|
-mg_freeext|||
-mg_free|||
-mg_get|||
-mg_localize|||
-mg_magical|||n
-mg_set|||
-mg_size||5.005000|
-mini_mktime||5.007002|n
-minus_v|||
-missingterm|||
-mode_from_discipline|||
-modkids|||
-more_bodies|||
-more_sv|||
-moreswitches|||
-move_proto_attr|||
-mro_clean_isarev|||
-mro_gather_and_rename|||
-mro_get_from_name||5.010001|
-mro_get_linear_isa_dfs|||
-mro_get_linear_isa||5.009005|
-mro_get_private_data||5.010001|
-mro_isa_changed_in|||
-mro_meta_dup|||
-mro_meta_init|||
-mro_method_changed_in||5.009005|
-mro_package_moved|||
-mro_register||5.010001|
-mro_set_mro||5.010001|
-mro_set_private_data||5.010001|
-mul128|||
-multiconcat_stringify|||
-multideref_stringify|||
-my_atof2||5.007002|
-my_atof3|||
-my_atof||5.006000|
-my_attrs|||
-my_bytes_to_utf8|||n
-my_chsize|||
-my_clearenv|||
-my_cxt_index|||
-my_cxt_init|||
-my_dirfd||5.009005|n
-my_exit_jump|||
-my_exit|||
-my_failure_exit||5.004000|
-my_fflush_all||5.006000|
-my_fork||5.007003|n
-my_kid|||
-my_lstat_flags|||
-my_lstat||5.024000|
-my_memrchr|||n
-my_mkostemp|||n
-my_mkstemp_cloexec|||n
-my_mkstemp|||n
-my_nl_langinfo|||n
-my_pclose||5.003070|
-my_popen_list||5.007001|
-my_popen||5.003070|
-my_setenv|||
-my_snprintf|5.009004||pvn
-my_socketpair||5.007003|n
-my_sprintf|5.009003||pvn
-my_stat_flags|||
-my_stat||5.024000|
-my_strerror|||
-my_strftime||5.007002|
-my_strlcat|5.009004||pn
-my_strlcpy|5.009004||pn
-my_strnlen|||pn
-my_strtod|||n
-my_unexec|||
-my_vsnprintf||5.009004|n
-need_utf8|||n
-newANONATTRSUB||5.006000|
-newANONHASH|||
-newANONLIST|||
-newANONSUB|||
-newASSIGNOP|||
-newATTRSUB_x|||
-newATTRSUB||5.006000|
-newAVREF|||
-newAV|||
-newBINOP|||
-newCONDOP|||
-newCONSTSUB_flags||5.015006|
-newCONSTSUB|5.004050||p
-newCVREF|||
-newDEFSVOP||5.021006|
-newFORM|||
-newFOROP||5.013007|
-newGIVENOP||5.009003|
-newGIVWHENOP|||
-newGVOP|||
-newGVREF|||
-newGVgen_flags||5.015004|
-newGVgen|||
-newHVREF|||
-newHVhv||5.005000|
-newHV|||
-newIO|||
-newLISTOP|||
-newLOGOP|||
-newLOOPEX|||
-newLOOPOP|||
-newMETHOP_internal|||
-newMETHOP_named||5.021005|
-newMETHOP||5.021005|
-newMYSUB||5.017004|
-newNULLLIST|||
-newOP|||
-newPADOP|||
-newPMOP|||
-newPROG|||
-newPVOP|||
-newRANGE|||
-newRV_inc|5.004000||p
-newRV_noinc|5.004000||p
-newRV|||
-newSLICEOP|||
-newSTATEOP|||
-newSTUB|||
-newSUB|||
-newSVOP|||
-newSVREF|||
-newSV_type|5.009005||p
-newSVavdefelem|||
-newSVhek||5.009003|
-newSViv|||
-newSVnv|||
-newSVpadname||5.017004|
-newSVpv_share||5.013006|
-newSVpvf_nocontext|||vn
-newSVpvf||5.004000|v
-newSVpvn_flags|5.010001||p
-newSVpvn_share|5.007001||p
-newSVpvn_utf8|5.010001||p
-newSVpvn|5.004050||p
-newSVpvs_flags|5.010001||p
-newSVpvs_share|5.009003||p
-newSVpvs|5.009003||p
-newSVpv|||
-newSVrv|||
-newSVsv_flags|||
-newSVsv_nomg|||
-newSVsv|||
-newSVuv|5.006000||p
-newSV|||
-newUNOP_AUX||5.021007|
-newUNOP|||
-newWHENOP||5.009003|
-newWHILEOP||5.013007|
-newXS_deffile|||
-newXS_len_flags|||
-newXSproto||5.006000|
-newXS||5.006000|
-new_collate|||
-new_constant|||
-new_ctype|||
-new_he|||
-new_logop|||
-new_msg_hv|||
-new_numeric|||
-new_regcurly|||n
-new_stackinfo||5.005000|
-new_version||5.009000|
-next_symbol|||
-nextargv|||
-nextchar|||
-ninstr|||n
-no_bareword_allowed|||
-no_fh_allowed|||
-no_op|||
-noperl_die|||vn
-not_a_number|||
-not_incrementable|||
-nothreadhook||5.008000|
-notify_parser_that_changed_to_utf8|||
-nuke_stacks|||
-num_overflow|||n
-oopsAV|||
-oopsHV|||
-op_append_elem||5.013006|
-op_append_list||5.013006|
-op_class|||
-op_clear|||
-op_contextualize||5.013006|
-op_convert_list||5.021006|
-op_dump||5.006000|
-op_free|||
-op_integerize|||
-op_linklist||5.013006|
-op_lvalue_flags|||
-op_null||5.007002|
-op_parent|||n
-op_prepend_elem||5.013006|
-op_refcnt_lock||5.009002|
-op_refcnt_unlock||5.009002|
-op_relocate_sv|||
-op_sibling_splice||5.021002|n
-op_std_init|||
-open_script|||
-openn_cleanup|||
-openn_setup|||
-opmethod_stash|||
-opslab_force_free|||
-opslab_free_nopad|||
-opslab_free|||
-optimize_optree|||
-optimize_op|||
-output_posix_warnings|||
-pMY_CXT_|5.007003||p
-pMY_CXT|5.007003||p
-pTHX_|5.006000||p
-pTHX|5.006000||p
-packWARN|5.007003||p
-pack_cat||5.007003|
-pack_rec|||
-package_version|||
-package|||
-packlist||5.008001|
-pad_add_anon||5.008001|
-pad_add_name_pvn||5.015001|
-pad_add_name_pvs||5.015001|
-pad_add_name_pv||5.015001|
-pad_add_name_sv||5.015001|
-pad_add_weakref|||
-pad_alloc_name|||
-pad_block_start|||
-pad_check_dup|||
-pad_compname_type||5.009003|
-pad_findlex|||
-pad_findmy_pvn||5.015001|
-pad_findmy_pvs||5.015001|
-pad_findmy_pv||5.015001|
-pad_findmy_sv||5.015001|
-pad_fixup_inner_anons|||
-pad_free|||
-pad_leavemy|||
-pad_new||5.008001|
-pad_push|||
-pad_reset|||
-pad_setsv|||
-pad_sv|||
-pad_swipe|||
-padlist_dup|||
-padlist_store|||
-padname_dup|||
-padname_free|||
-padnamelist_dup|||
-padnamelist_free|||
-parse_body|||
-parse_gv_stash_name|||
-parse_ident|||
-parse_lparen_question_flags|||
-parse_unicode_opts|||
-parse_uniprop_string|||
-parser_dup|||
-parser_free_nexttoke_ops|||
-parser_free|||
-path_is_searchable|||n
-peep|||
-pending_ident|||
-perl_alloc_using|||n
-perl_alloc|||n
-perl_clone_using|||n
-perl_clone|||n
-perl_construct|||n
-perl_destruct||5.007003|n
-perl_free|||n
-perl_parse||5.006000|n
-perl_run|||n
-pidgone|||
-pm_description|||
-pmop_dump||5.006000|
-pmruntime|||
-pmtrans|||
-pop_scope|||
-populate_ANYOF_from_invlist|||
-populate_isa|||v
-pregcomp||5.009005|
-pregexec|||
-pregfree2||5.011000|
-pregfree|||
-prescan_version||5.011004|
-print_bytes_for_locale|||
-print_collxfrm_input_and_return|||
-printbuf|||
-printf_nocontext|||vn
-process_special_blocks|||
-ptr_hash|||n
-ptr_table_fetch||5.009005|
-ptr_table_find|||n
-ptr_table_free||5.009005|
-ptr_table_new||5.009005|
-ptr_table_split||5.009005|
-ptr_table_store||5.009005|
-push_scope|||
-put_charclass_bitmap_innards_common|||
-put_charclass_bitmap_innards_invlist|||
-put_charclass_bitmap_innards|||
-put_code_point|||
-put_range|||
-pv_display|5.006000||p
-pv_escape|5.009004||p
-pv_pretty|5.009004||p
-pv_uni_display||5.007003|
-qerror|||
-quadmath_format_needed|||n
-quadmath_format_single|||n
-re_compile||5.009005|
-re_croak2|||
-re_dup_guts|||
-re_exec_indentf|||v
-re_indentf|||v
-re_intuit_start||5.019001|
-re_intuit_string||5.006000|
-re_op_compile|||
-re_printf|||v
-realloc||5.007002|n
-reentrant_free||5.024000|
-reentrant_init||5.024000|
-reentrant_retry||5.024000|vn
-reentrant_size||5.024000|
-ref_array_or_hash|||
-refcounted_he_chain_2hv|||
-refcounted_he_fetch_pvn|||
-refcounted_he_fetch_pvs|||
-refcounted_he_fetch_pv|||
-refcounted_he_fetch_sv|||
-refcounted_he_free|||
-refcounted_he_inc|||
-refcounted_he_new_pvn|||
-refcounted_he_new_pvs|||
-refcounted_he_new_pv|||
-refcounted_he_new_sv|||
-refcounted_he_value|||
-refkids|||
-refto|||
-ref||5.024000|
-reg2Lanode|||
-reg_check_named_buff_matched|||n
-reg_named_buff_all||5.009005|
-reg_named_buff_exists||5.009005|
-reg_named_buff_fetch||5.009005|
-reg_named_buff_firstkey||5.009005|
-reg_named_buff_iter|||
-reg_named_buff_nextkey||5.009005|
-reg_named_buff_scalar||5.009005|
-reg_named_buff|||
-reg_node|||
-reg_numbered_buff_fetch|||
-reg_numbered_buff_length|||
-reg_numbered_buff_store|||
-reg_qr_package|||
-reg_scan_name|||
-reg_skipcomment|||n
-reg_temp_copy|||
-reganode|||
-regatom|||
-regbranch|||
-regclass|||
-regcp_restore|||
-regcppop|||
-regcppush|||
-regcurly|||n
-regdump_extflags|||
-regdump_intflags|||
-regdump||5.005000|
-regdupe_internal|||
-regex_set_precedence|||n
-regexec_flags||5.005000|
-regfree_internal||5.009005|
-reghop3|||n
-reghop4|||n
-reghopmaybe3|||n
-reginclass|||
-reginitcolors||5.006000|
-reginsert|||
-regmatch|||
-regnext||5.005000|
-regnode_guts|||
-regpiece|||
-regprop|||
-regrepeat|||
-regtail_study|||
-regtail|||
-regtry|||
-reg|||
-repeatcpy|||n
-report_evil_fh|||
-report_redefined_cv|||
-report_uninit|||
-report_wrongway_fh|||
-require_pv||5.006000|
-require_tie_mod|||
-restore_magic|||
-restore_switched_locale|||
-rninstr|||n
-rpeep|||
-rsignal_restore|||
-rsignal_save|||
-rsignal_state||5.004000|
-rsignal||5.004000|
-run_body|||
-run_user_filter|||
-runops_debug||5.005000|
-runops_standard||5.005000|
-rv2cv_op_cv||5.013006|
-rvpv_dup|||
-rxres_free|||
-rxres_restore|||
-rxres_save|||
-safesyscalloc||5.006000|n
-safesysfree||5.006000|n
-safesysmalloc||5.006000|n
-safesysrealloc||5.006000|n
-same_dirent|||
-save_I16||5.004000|
-save_I32|||
-save_I8||5.006000|
-save_adelete||5.011000|
-save_aelem_flags||5.011000|
-save_aelem||5.004050|
-save_alloc||5.006000|
-save_aptr|||
-save_ary|||
-save_bool||5.008001|
-save_clearsv|||
-save_delete|||
-save_destructor_x||5.006000|
-save_destructor||5.006000|
-save_freeop|||
-save_freepv|||
-save_freesv|||
-save_generic_pvref||5.006001|
-save_generic_svref||5.005030|
-save_gp||5.004000|
-save_hash|||
-save_hdelete||5.011000|
-save_hek_flags|||n
-save_helem_flags||5.011000|
-save_helem||5.004050|
-save_hints||5.010001|
-save_hptr|||
-save_int|||
-save_item|||
-save_iv||5.005000|
-save_lines|||
-save_list|||
-save_long|||
-save_magic_flags|||
-save_mortalizesv||5.007001|
-save_nogv|||
-save_op||5.005000|
-save_padsv_and_mortalize||5.010001|
-save_pptr|||
-save_pushi32ptr||5.010001|
-save_pushptri32ptr|||
-save_pushptrptr||5.010001|
-save_pushptr||5.010001|
-save_re_context||5.006000|
-save_scalar_at|||
-save_scalar|||
-save_set_svflags||5.009000|
-save_shared_pvref||5.007003|
-save_sptr|||
-save_strlen|||
-save_svref|||
-save_to_buffer|||n
-save_vptr||5.006000|
-savepvn|||
-savepvs||5.009003|
-savepv|||
-savesharedpvn||5.009005|
-savesharedpvs||5.013006|
-savesharedpv||5.007003|
-savesharedsvpv||5.013006|
-savestack_grow_cnt||5.008001|
-savestack_grow|||
-savesvpv||5.009002|
-sawparens|||
-scalar_mod_type|||n
-scalarboolean|||
-scalarkids|||
-scalarseq|||
-scalarvoid|||
-scalar|||
-scan_bin||5.006000|
-scan_commit|||
-scan_const|||
-scan_formline|||
-scan_heredoc|||
-scan_hex|||
-scan_ident|||
-scan_inputsymbol|||
-scan_num||5.007001|
-scan_oct|||
-scan_pat|||
-scan_subst|||
-scan_trans|||
-scan_version||5.009001|
-scan_vstring||5.009005|
-search_const|||
-seed||5.008001|
-sequence_num|||
-set_ANYOF_arg|||
-set_caret_X|||
-set_context||5.006000|n
-set_numeric_radix||5.006000|
-set_numeric_standard||5.006000|
-set_numeric_underlying|||
-set_padlist|||n
-set_regex_pv|||
-setdefout|||
-setfd_cloexec_for_nonsysfd|||
-setfd_cloexec_or_inhexec_by_sysfdness|||
-setfd_cloexec|||n
-setfd_inhexec_for_sysfd|||
-setfd_inhexec|||n
-setlocale_debug_string|||n
-share_hek_flags|||
-share_hek||5.004000|
-should_warn_nl|||n
-si_dup|||
-sighandler|||n
-simplify_sort|||
-skip_to_be_ignored_text|||
-softref2xv|||
-sortcv_stacked|||
-sortcv_xsub|||
-sortcv|||
-sortsv_flags||5.009003|
-sortsv||5.007003|
-space_join_names_mortal|||
-ss_dup|||
-ssc_add_range|||
-ssc_and|||
-ssc_anything|||
-ssc_clear_locale|||n
-ssc_cp_and|||
-ssc_finalize|||
-ssc_init|||
-ssc_intersection|||
-ssc_is_anything|||n
-ssc_is_cp_posixl_init|||n
-ssc_or|||
-ssc_union|||
-stack_grow|||
-start_subparse||5.004000|
-stdize_locale|||
-strEQ|||
-strGE|||
-strGT|||
-strLE|||
-strLT|||
-strNE|||
-str_to_version||5.006000|
-strip_return|||
-strnEQ|||
-strnNE|||
-study_chunk|||
-sub_crush_depth|||
-sublex_done|||
-sublex_push|||
-sublex_start|||
-sv_2bool_flags||5.013006|
-sv_2bool|||
-sv_2cv|||
-sv_2io|||
-sv_2iuv_common|||
-sv_2iuv_non_preserve|||
-sv_2iv_flags||5.009001|
-sv_2iv|||
-sv_2mortal|||
-sv_2nv_flags||5.013001|
-sv_2pv_flags|5.007002||p
-sv_2pv_nolen|5.006000||p
-sv_2pvbyte_nolen|5.006000||p
-sv_2pvbyte|5.006000||p
-sv_2pvutf8_nolen||5.006000|
-sv_2pvutf8||5.006000|
-sv_2pv|||
-sv_2uv_flags||5.009001|
-sv_2uv|5.004000||p
-sv_add_arena|||
-sv_add_backref|||
-sv_backoff|||n
-sv_bless|||
-sv_buf_to_ro|||
-sv_buf_to_rw|||
-sv_cat_decode||5.008001|
-sv_catpv_flags||5.013006|
-sv_catpv_mg|5.004050||p
-sv_catpv_nomg||5.013006|
-sv_catpvf_mg_nocontext|||pvn
-sv_catpvf_mg|5.006000|5.004000|pv
-sv_catpvf_nocontext|||vn
-sv_catpvf||5.004000|v
-sv_catpvn_flags||5.007002|
-sv_catpvn_mg|5.004050||p
-sv_catpvn_nomg|5.007002||p
-sv_catpvn|||
-sv_catpvs_flags||5.013006|
-sv_catpvs_mg||5.013006|
-sv_catpvs_nomg||5.013006|
-sv_catpvs|5.009003||p
-sv_catpv|||
-sv_catsv_flags||5.007002|
-sv_catsv_mg|5.004050||p
-sv_catsv_nomg|5.007002||p
-sv_catsv|||
-sv_chop|||
-sv_clean_all|||
-sv_clean_objs|||
-sv_clear|||
-sv_cmp_flags||5.013006|
-sv_cmp_locale_flags||5.013006|
-sv_cmp_locale||5.004000|
-sv_cmp|||
-sv_collxfrm_flags||5.013006|
-sv_collxfrm|||
-sv_copypv_flags||5.017002|
-sv_copypv_nomg||5.017002|
-sv_copypv|||
-sv_dec_nomg||5.013002|
-sv_dec|||
-sv_del_backref|||
-sv_derived_from_pvn||5.015004|
-sv_derived_from_pv||5.015004|
-sv_derived_from_sv||5.015004|
-sv_derived_from||5.004000|
-sv_destroyable||5.010000|
-sv_display|||
-sv_does_pvn||5.015004|
-sv_does_pv||5.015004|
-sv_does_sv||5.015004|
-sv_does||5.009004|
-sv_dump|||
-sv_dup_common|||
-sv_dup_inc_multiple|||
-sv_dup_inc|||
-sv_dup|||
-sv_eq_flags||5.013006|
-sv_eq|||
-sv_exp_grow|||
-sv_force_normal_flags||5.007001|
-sv_force_normal||5.006000|
-sv_free_arenas|||
-sv_free|||
-sv_gets||5.003070|
-sv_grow|||
-sv_i_ncmp|||
-sv_inc_nomg||5.013002|
-sv_inc|||
-sv_insert_flags||5.010001|
-sv_insert|||
-sv_isa|||
-sv_isobject|||
-sv_iv||5.005000|
-sv_len_utf8_nomg|||
-sv_len_utf8||5.006000|
-sv_len|||
-sv_magic_portable|5.024000|5.004000|p
-sv_magicext_mglob|||
-sv_magicext||5.007003|
-sv_magic|||
-sv_mortalcopy_flags|||
-sv_mortalcopy|||
-sv_ncmp|||
-sv_newmortal|||
-sv_newref|||
-sv_nolocking||5.007003|
-sv_nosharing||5.007003|
-sv_nounlocking|||
-sv_nv||5.005000|
-sv_only_taint_gmagic|||n
-sv_or_pv_pos_u2b|||
-sv_peek||5.005000|
-sv_pos_b2u_flags||5.019003|
-sv_pos_b2u_midway|||
-sv_pos_b2u||5.006000|
-sv_pos_u2b_cached|||
-sv_pos_u2b_flags||5.011005|
-sv_pos_u2b_forwards|||n
-sv_pos_u2b_midway|||n
-sv_pos_u2b||5.006000|
-sv_pvbyten_force||5.006000|
-sv_pvbyten||5.006000|
-sv_pvbyte||5.006000|
-sv_pvn_force_flags|5.007002||p
-sv_pvn_force|||
-sv_pvn_nomg|5.007003|5.005000|p
-sv_pvn||5.005000|
-sv_pvutf8n_force||5.006000|
-sv_pvutf8n||5.006000|
-sv_pvutf8||5.006000|
-sv_pv||5.006000|
-sv_recode_to_utf8||5.007003|
-sv_reftype|||
-sv_ref||5.015004|
-sv_replace|||
-sv_report_used|||
-sv_resetpvn|||
-sv_reset|||
-sv_rvunweaken|||
-sv_rvweaken||5.006000|
-sv_set_undef|||
-sv_sethek|||
-sv_setiv_mg|5.004050||p
-sv_setiv|||
-sv_setnv_mg|5.006000||p
-sv_setnv|||
-sv_setpv_bufsize|||
-sv_setpv_mg|5.004050||p
-sv_setpvf_mg_nocontext|||pvn
-sv_setpvf_mg|5.006000|5.004000|pv
-sv_setpvf_nocontext|||vn
-sv_setpvf||5.004000|v
-sv_setpviv_mg||5.008001|
-sv_setpviv||5.008001|
-sv_setpvn_mg|5.004050||p
-sv_setpvn|||
-sv_setpvs_mg||5.013006|
-sv_setpvs|5.009004||p
-sv_setpv|||
-sv_setref_iv|||
-sv_setref_nv|||
-sv_setref_pvn|||
-sv_setref_pvs||5.024000|
-sv_setref_pv|||
-sv_setref_uv||5.007001|
-sv_setsv_flags||5.007002|
-sv_setsv_mg|5.004050||p
-sv_setsv_nomg|5.007002||p
-sv_setsv|||
-sv_setuv_mg|5.004050||p
-sv_setuv|5.004000||p
-sv_string_from_errnum|||
-sv_tainted||5.004000|
-sv_taint||5.004000|
-sv_true||5.005000|
-sv_unglob|||
-sv_uni_display||5.007003|
-sv_unmagicext|5.013008||p
-sv_unmagic|||
-sv_unref_flags||5.007001|
-sv_unref|||
-sv_untaint||5.004000|
-sv_upgrade|||
-sv_usepvn_flags||5.009004|
-sv_usepvn_mg|5.004050||p
-sv_usepvn|||
-sv_utf8_decode|||
-sv_utf8_downgrade|||
-sv_utf8_encode||5.006000|
-sv_utf8_upgrade_flags_grow||5.011000|
-sv_utf8_upgrade_flags||5.007002|
-sv_utf8_upgrade_nomg||5.007002|
-sv_utf8_upgrade||5.007001|
-sv_uv|5.005000||p
-sv_vcatpvf_mg|5.006000|5.004000|p
-sv_vcatpvfn_flags||5.017002|
-sv_vcatpvfn||5.004000|
-sv_vcatpvf|5.006000|5.004000|p
-sv_vsetpvf_mg|5.006000|5.004000|p
-sv_vsetpvfn||5.004000|
-sv_vsetpvf|5.006000|5.004000|p
-svtype|||
-swallow_bom|||
-swatch_get|||
-switch_category_locale_to_template|||
-switch_to_global_locale|||n
-sync_locale||5.021004|n
-sys_init3||5.010000|n
-sys_init||5.010000|n
-sys_intern_clear|||
-sys_intern_dup|||
-sys_intern_init|||
-sys_term||5.010000|n
-taint_env|||
-taint_proper|||
-tied_method|||v
-tmps_grow_p|||
-toFOLD_utf8_safe|||
-toFOLD_utf8||5.019001|
-toFOLD_uvchr||5.023009|
-toFOLD||5.019001|
-toLOWER_L1||5.019001|
-toLOWER_LC||5.004000|
-toLOWER_utf8_safe|||
-toLOWER_utf8||5.015007|
-toLOWER_uvchr||5.023009|
-toLOWER|||
-toTITLE_utf8_safe|||
-toTITLE_utf8||5.015007|
-toTITLE_uvchr||5.023009|
-toTITLE||5.019001|
-toUPPER_utf8_safe|||
-toUPPER_utf8||5.015007|
-toUPPER_uvchr||5.023009|
-toUPPER|||
-to_byte_substr|||
-to_lower_latin1|||n
-to_utf8_substr|||
-tokenize_use|||
-tokeq|||
-tokereport|||
-too_few_arguments_pv|||
-too_many_arguments_pv|||
-translate_substr_offsets|||n
-traverse_op_tree|||
-try_amagic_bin|||
-try_amagic_un|||
-turkic_fc|||
-turkic_lc|||
-turkic_uc|||
-uiv_2buf|||n
-unlnk|||
-unpack_rec|||
-unpack_str||5.007003|
-unpackstring||5.008001|
-unreferenced_to_tmp_stack|||
-unshare_hek_or_pvn|||
-unshare_hek|||
-unsharepvn||5.003070|
-unwind_handler_stack|||
-update_debugger_info|||
-upg_version||5.009005|
-usage|||
-utf16_textfilter|||
-utf16_to_utf8_reversed||5.006001|
-utf16_to_utf8||5.006001|
-utf8_distance||5.006000|
-utf8_hop_back|||n
-utf8_hop_forward|||n
-utf8_hop_safe|||n
-utf8_hop||5.006000|n
-utf8_length||5.007001|
-utf8_mg_len_cache_update|||
-utf8_mg_pos_cache_update|||
-utf8_to_uvchr_buf|5.015009|5.015009|p
-utf8_to_uvchr|||p
-utf8n_to_uvchr_error|||n
-utf8n_to_uvchr||5.007001|n
-utf8n_to_uvuni||5.007001|
-utilize|||
-uvchr_to_utf8_flags||5.007003|
-uvchr_to_utf8||5.007001|
-uvoffuni_to_utf8_flags||5.019004|
-uvuni_to_utf8_flags||5.007003|
-uvuni_to_utf8||5.007001|
-valid_utf8_to_uvchr|||n
-validate_suid|||
-variant_under_utf8_count|||n
-varname|||
-vcmp||5.009000|
-vcroak||5.006000|
-vdeb||5.007003|
-vform||5.006000|
-visit|||
-vivify_defelem|||
-vivify_ref|||
-vload_module|5.006000||p
-vmess|5.006000|5.006000|p
-vnewSVpvf|5.006000|5.004000|p
-vnormal||5.009002|
-vnumify||5.009000|
-vstringify||5.009000|
-vverify||5.009003|
-vwarner||5.006000|
-vwarn||5.006000|
-wait4pid|||
-warn_nocontext|||pvn
-warn_on_first_deprecated_use|||
-warn_sv|5.013001||p
-warner_nocontext|||vn
-warner|5.006000|5.004000|pv
-warn|||v
-was_lvalue_sub|||
-watch|||
-whichsig_pvn||5.015004|
-whichsig_pv||5.015004|
-whichsig_sv||5.015004|
-whichsig|||
-win32_croak_not_implemented|||n
-win32_setlocale|||
-with_queued_errors|||
-wrap_op_checker||5.015008|
-write_to_stderr|||
-xs_boot_epilog|||
-xs_handshake|||vn
-xs_version_bootcheck|||
-yyerror_pvn|||
-yyerror_pv|||
-yyerror|||
-yylex|||
-yyparse|||
-yyquit|||
-yyunlex|||
-yywarn|||
-);
-
-if (exists $opt{'list-unsupported'}) {
-  my $f;
-  for $f (sort { lc $a cmp lc $b } keys %API) {
-    next unless $API{$f}{todo};
-    print "$f ", '.'x(40-length($f)), " ", format_version($API{$f}{todo}), "\n";
-  }
-  exit 0;
-}
-
-# Scan for possible replacement candidates
-
-my(%replace, %need, %hints, %warnings, %depends);
-my $replace = 0;
-my($hint, $define, $function);
-
-sub find_api
-{
-  my $code = shift;
-  $code =~ s{
-    / (?: \*[^*]*\*+(?:[^$ccs][^*]*\*+)* / | /[^\r\n]*)
-  | "[^"\\]*(?:\\.[^"\\]*)*"
-  | '[^'\\]*(?:\\.[^'\\]*)*' }{}egsx;
-  grep { exists $API{$_} } $code =~ /(\w+)/mg;
-}
-
-while (<DATA>) {
-  if ($hint) {
-    my $h = $hint->[0] eq 'Hint' ? \%hints : \%warnings;
-    if (m{^\s*\*\s(.*?)\s*$}) {
-      for (@{$hint->[1]}) {
-        $h->{$_} ||= '';  # suppress warning with older perls
-        $h->{$_} .= "$1\n";
-      }
-    }
-    else { undef $hint }
-  }
-
-  $hint = [$1, [split /,?\s+/, $2]]
-      if m{^\s*$rccs\s+(Hint|Warning):\s+(\w+(?:,?\s+\w+)*)\s*$};
-
-  if ($define) {
-    if ($define->[1] =~ /\\$/) {
-      $define->[1] .= $_;
-    }
-    else {
-      if (exists $API{$define->[0]} && $define->[1] !~ /^DPPP_\(/) {
-        my @n = find_api($define->[1]);
-        push @{$depends{$define->[0]}}, @n if @n
-      }
-      undef $define;
-    }
-  }
-
-  $define = [$1, $2] if m{^\s*#\s*define\s+(\w+)(?:\([^)]*\))?\s+(.*)};
-
-  if ($function) {
-    if (/^}/) {
-      if (exists $API{$function->[0]}) {
-        my @n = find_api($function->[1]);
-        push @{$depends{$function->[0]}}, @n if @n
-      }
-      undef $function;
-    }
-    else {
-      $function->[1] .= $_;
-    }
-  }
-
-  $function = [$1, ''] if m{^DPPP_\(my_(\w+)\)};
-
-  $replace     = $1 if m{^\s*$rccs\s+Replace:\s+(\d+)\s+$rcce\s*$};
-  $replace{$2} = $1 if $replace and m{^\s*#\s*define\s+(\w+)(?:\([^)]*\))?\s+(\w+)};
-  $replace{$2} = $1 if m{^\s*#\s*define\s+(\w+)(?:\([^)]*\))?\s+(\w+).*$rccs\s+Replace\s+$rcce};
-  $replace{$1} = $2 if m{^\s*$rccs\s+Replace (\w+) with (\w+)\s+$rcce\s*$};
-
-  if (m{^\s*$rccs\s+(\w+(\s*,\s*\w+)*)\s+depends\s+on\s+(\w+(\s*,\s*\w+)*)\s+$rcce\s*$}) {
-    my @deps = map { s/\s+//g; $_ } split /,/, $3;
-    my $d;
-    for $d (map { s/\s+//g; $_ } split /,/, $1) {
-      push @{$depends{$d}}, @deps;
-    }
-  }
-
-  $need{$1} = 1 if m{^#if\s+defined\(NEED_(\w+)(?:_GLOBAL)?\)};
-}
-
-for (values %depends) {
-  my %s;
-  $_ = [sort grep !$s{$_}++, @$_];
-}
-
-if (exists $opt{'api-info'}) {
-  my $f;
-  my $count = 0;
-  my $match = $opt{'api-info'} =~ m!^/(.*)/$! ? $1 : "^\Q$opt{'api-info'}\E\$";
-  for $f (sort { lc $a cmp lc $b } keys %API) {
-    next unless $f =~ /$match/;
-    print "\n=== $f ===\n\n";
-    my $info = 0;
-    if ($API{$f}{base} || $API{$f}{todo}) {
-      my $base = format_version($API{$f}{base} || $API{$f}{todo});
-      print "Supported at least starting from perl-$base.\n";
-      $info++;
-    }
-    if ($API{$f}{provided}) {
-      my $todo = $API{$f}{todo} ? format_version($API{$f}{todo}) : "5.003";
-      print "Support by $ppport provided back to perl-$todo.\n";
-      print "Support needs to be explicitly requested by NEED_$f.\n" if exists $need{$f};
-      print "Depends on: ", join(', ', @{$depends{$f}}), ".\n" if exists $depends{$f};
-      print "\n$hints{$f}" if exists $hints{$f};
-      print "\nWARNING:\n$warnings{$f}" if exists $warnings{$f};
-      $info++;
-    }
-    print "No portability information available.\n" unless $info;
-    $count++;
-  }
-  $count or print "Found no API matching '$opt{'api-info'}'.";
-  print "\n";
-  exit 0;
-}
-
-if (exists $opt{'list-provided'}) {
-  my $f;
-  for $f (sort { lc $a cmp lc $b } keys %API) {
-    next unless $API{$f}{provided};
-    my @flags;
-    push @flags, 'explicit' if exists $need{$f};
-    push @flags, 'depend'   if exists $depends{$f};
-    push @flags, 'hint'     if exists $hints{$f};
-    push @flags, 'warning'  if exists $warnings{$f};
-    my $flags = @flags ? '  ['.join(', ', @flags).']' : '';
-    print "$f$flags\n";
-  }
-  exit 0;
-}
-
-my @files;
-my @srcext = qw( .xs .c .h .cc .cpp -c.inc -xs.inc );
-my $srcext = join '|', map { quotemeta $_ } @srcext;
-
-if (@ARGV) {
-  my %seen;
-  for (@ARGV) {
-    if (-e) {
-      if (-f) {
-        push @files, $_ unless $seen{$_}++;
-      }
-      else { warn "'$_' is not a file.\n" }
-    }
-    else {
-      my @new = grep { -f } glob $_
-          or warn "'$_' does not exist.\n";
-      push @files, grep { !$seen{$_}++ } @new;
-    }
-  }
-}
-else {
-  eval {
-    require File::Find;
-    File::Find::find(sub {
-      $File::Find::name =~ /($srcext)$/i
-          and push @files, $File::Find::name;
-    }, '.');
-  };
-  if ($@) {
-    @files = map { glob "*$_" } @srcext;
-  }
-}
-
-if (!@ARGV || $opt{filter}) {
-  my(@in, @out);
-  my %xsc = map { /(.*)\.xs$/ ? ("$1.c" => 1, "$1.cc" => 1) : () } @files;
-  for (@files) {
-    my $out = exists $xsc{$_} || /\b\Q$ppport\E$/i || !/($srcext)$/i;
-    push @{ $out ? \@out : \@in }, $_;
-  }
-  if (@ARGV && @out) {
-    warning("Skipping the following files (use --nofilter to avoid this):\n| ", join "\n| ", @out);
-  }
-  @files = @in;
-}
-
-die "No input files given!\n" unless @files;
-
-my(%files, %global, %revreplace);
-%revreplace = reverse %replace;
-my $filename;
-my $patch_opened = 0;
-
-for $filename (@files) {
-  unless (open IN, "<$filename") {
-    warn "Unable to read from $filename: $!\n";
-    next;
-  }
-
-  info("Scanning $filename ...");
-
-  my $c = do { local $/; <IN> };
-  close IN;
-
-  my %file = (orig => $c, changes => 0);
-
-  # Temporarily remove C/XS comments and strings from the code
-  my @ccom;
-
-  $c =~ s{
-    ( ^$HS*\#$HS*include\b[^\r\n]+\b(?:\Q$ppport\E|XSUB\.h)\b[^\r\n]*
-    | ^$HS*\#$HS*(?:define|elif|if(?:def)?)\b[^\r\n]* )
-  | ( ^$HS*\#[^\r\n]*
-    | "[^"\\]*(?:\\.[^"\\]*)*"
-    | '[^'\\]*(?:\\.[^'\\]*)*'
-    | / (?: \*[^*]*\*+(?:[^$ccs][^*]*\*+)* / | /[^\r\n]* ) )
-  }{ defined $2 and push @ccom, $2;
-     defined $1 ? $1 : "$ccs$#ccom$cce" }mgsex;
-
-  $file{ccom} = \@ccom;
-  $file{code} = $c;
-  $file{has_inc_ppport} = $c =~ /^$HS*#$HS*include[^\r\n]+\b\Q$ppport\E\b/m;
-
-  my $func;
-
-  for $func (keys %API) {
-    my $match = $func;
-    $match .= "|$revreplace{$func}" if exists $revreplace{$func};
-    if ($c =~ /\b(?:Perl_)?($match)\b/) {
-      $file{uses_replace}{$1}++ if exists $revreplace{$func} && $1 eq $revreplace{$func};
-      $file{uses_Perl}{$func}++ if $c =~ /\bPerl_$func\b/;
-      if (exists $API{$func}{provided}) {
-        $file{uses_provided}{$func}++;
-        if (!exists $API{$func}{base} || $API{$func}{base} > $opt{'compat-version'}) {
-          $file{uses}{$func}++;
-          my @deps = rec_depend($func);
-          if (@deps) {
-            $file{uses_deps}{$func} = \@deps;
-            for (@deps) {
-              $file{uses}{$_} = 0 unless exists $file{uses}{$_};
-            }
-          }
-          for ($func, @deps) {
-            $file{needs}{$_} = 'static' if exists $need{$_};
-          }
-        }
-      }
-      if (exists $API{$func}{todo} && $API{$func}{todo} > $opt{'compat-version'}) {
-        if ($c =~ /\b$func\b/) {
-          $file{uses_todo}{$func}++;
-        }
-      }
-    }
-  }
-
-  while ($c =~ /^$HS*#$HS*define$HS+(NEED_(\w+?)(_GLOBAL)?)\b/mg) {
-    if (exists $need{$2}) {
-      $file{defined $3 ? 'needed_global' : 'needed_static'}{$2}++;
-    }
-    else { warning("Possibly wrong #define $1 in $filename") }
-  }
-
-  for (qw(uses needs uses_todo needed_global needed_static)) {
-    for $func (keys %{$file{$_}}) {
-      push @{$global{$_}{$func}}, $filename;
-    }
-  }
-
-  $files{$filename} = \%file;
-}
-
-# Globally resolve NEED_'s
-my $need;
-for $need (keys %{$global{needs}}) {
-  if (@{$global{needs}{$need}} > 1) {
-    my @targets = @{$global{needs}{$need}};
-    my @t = grep $files{$_}{needed_global}{$need}, @targets;
-    @targets = @t if @t;
-    @t = grep /\.xs$/i, @targets;
-    @targets = @t if @t;
-    my $target = shift @targets;
-    $files{$target}{needs}{$need} = 'global';
-    for (@{$global{needs}{$need}}) {
-      $files{$_}{needs}{$need} = 'extern' if $_ ne $target;
-    }
-  }
-}
-
-for $filename (@files) {
-  exists $files{$filename} or next;
-
-  info("=== Analyzing $filename ===");
-
-  my %file = %{$files{$filename}};
-  my $func;
-  my $c = $file{code};
-  my $warnings = 0;
-
-  for $func (sort keys %{$file{uses_Perl}}) {
-    if ($API{$func}{varargs}) {
-      unless ($API{$func}{nothxarg}) {
-        my $changes = ($c =~ s{\b(Perl_$func\s*\(\s*)(?!aTHX_?)(\)|[^\s)]*\))}
-                              { $1 . ($2 eq ')' ? 'aTHX' : 'aTHX_ ') . $2 }ge);
-        if ($changes) {
-          warning("Doesn't pass interpreter argument aTHX to Perl_$func");
-          $file{changes} += $changes;
-        }
-      }
-    }
-    else {
-      warning("Uses Perl_$func instead of $func");
-      $file{changes} += ($c =~ s{\bPerl_$func(\s*)\((\s*aTHX_?)?\s*}
-                                {$func$1(}g);
-    }
-  }
-
-  for $func (sort keys %{$file{uses_replace}}) {
-    warning("Uses $func instead of $replace{$func}");
-    $file{changes} += ($c =~ s/\b$func\b/$replace{$func}/g);
-  }
-
-  for $func (sort keys %{$file{uses_provided}}) {
-    if ($file{uses}{$func}) {
-      if (exists $file{uses_deps}{$func}) {
-        diag("Uses $func, which depends on ", join(', ', @{$file{uses_deps}{$func}}));
-      }
-      else {
-        diag("Uses $func");
-      }
-    }
-    $warnings += hint($func);
-  }
-
-  unless ($opt{quiet}) {
-    for $func (sort keys %{$file{uses_todo}}) {
-      print "*** WARNING: Uses $func, which may not be portable below perl ",
-            format_version($API{$func}{todo}), ", even with '$ppport'\n";
-      $warnings++;
-    }
-  }
-
-  for $func (sort keys %{$file{needed_static}}) {
-    my $message = '';
-    if (not exists $file{uses}{$func}) {
-      $message = "No need to define NEED_$func if $func is never used";
-    }
-    elsif (exists $file{needs}{$func} && $file{needs}{$func} ne 'static') {
-      $message = "No need to define NEED_$func when already needed globally";
-    }
-    if ($message) {
-      diag($message);
-      $file{changes} += ($c =~ s/^$HS*#$HS*define$HS+NEED_$func\b.*$LF//mg);
-    }
-  }
-
-  for $func (sort keys %{$file{needed_global}}) {
-    my $message = '';
-    if (not exists $global{uses}{$func}) {
-      $message = "No need to define NEED_${func}_GLOBAL if $func is never used";
-    }
-    elsif (exists $file{needs}{$func}) {
-      if ($file{needs}{$func} eq 'extern') {
-        $message = "No need to define NEED_${func}_GLOBAL when already needed globally";
-      }
-      elsif ($file{needs}{$func} eq 'static') {
-        $message = "No need to define NEED_${func}_GLOBAL when only used in this file";
-      }
-    }
-    if ($message) {
-      diag($message);
-      $file{changes} += ($c =~ s/^$HS*#$HS*define$HS+NEED_${func}_GLOBAL\b.*$LF//mg);
-    }
-  }
-
-  $file{needs_inc_ppport} = keys %{$file{uses}};
-
-  if ($file{needs_inc_ppport}) {
-    my $pp = '';
-
-    for $func (sort keys %{$file{needs}}) {
-      my $type = $file{needs}{$func};
-      next if $type eq 'extern';
-      my $suffix = $type eq 'global' ? '_GLOBAL' : '';
-      unless (exists $file{"needed_$type"}{$func}) {
-        if ($type eq 'global') {
-          diag("Files [@{$global{needs}{$func}}] need $func, adding global request");
-        }
-        else {
-          diag("File needs $func, adding static request");
-        }
-        $pp .= "#define NEED_$func$suffix\n";
-      }
-    }
-
-    if ($pp && ($c =~ s/^(?=$HS*#$HS*define$HS+NEED_\w+)/$pp/m)) {
-      $pp = '';
-      $file{changes}++;
-    }
-
-    unless ($file{has_inc_ppport}) {
-      diag("Needs to include '$ppport'");
-      $pp .= qq(#include "$ppport"\n)
-    }
-
-    if ($pp) {
-      $file{changes} += ($c =~ s/^($HS*#$HS*define$HS+NEED_\w+.*?)^/$1$pp/ms)
-                     || ($c =~ s/^(?=$HS*#$HS*include.*\Q$ppport\E)/$pp/m)
-                     || ($c =~ s/^($HS*#$HS*include.*XSUB.*\s*?)^/$1$pp/m)
-                     || ($c =~ s/^/$pp/);
-    }
-  }
-  else {
-    if ($file{has_inc_ppport}) {
-      diag("No need to include '$ppport'");
-      $file{changes} += ($c =~ s/^$HS*?#$HS*include.*\Q$ppport\E.*?$LF//m);
-    }
-  }
-
-  # put back in our C comments
-  my $ix;
-  my $cppc = 0;
-  my @ccom = @{$file{ccom}};
-  for $ix (0 .. $#ccom) {
-    if (!$opt{cplusplus} && $ccom[$ix] =~ s!^//!!) {
-      $cppc++;
-      $file{changes} += $c =~ s/$rccs$ix$rcce/$ccs$ccom[$ix] $cce/;
-    }
-    else {
-      $c =~ s/$rccs$ix$rcce/$ccom[$ix]/;
-    }
-  }
-
-  if ($cppc) {
-    my $s = $cppc != 1 ? 's' : '';
-    warning("Uses $cppc C++ style comment$s, which is not portable");
-  }
-
-  my $s = $warnings != 1 ? 's' : '';
-  my $warn = $warnings ? " ($warnings warning$s)" : '';
-  info("Analysis completed$warn");
-
-  if ($file{changes}) {
-    if (exists $opt{copy}) {
-      my $newfile = "$filename$opt{copy}";
-      if (-e $newfile) {
-        error("'$newfile' already exists, refusing to write copy of '$filename'");
-      }
-      else {
-        local *F;
-        if (open F, ">$newfile") {
-          info("Writing copy of '$filename' with changes to '$newfile'");
-          print F $c;
-          close F;
-        }
-        else {
-          error("Cannot open '$newfile' for writing: $!");
-        }
-      }
-    }
-    elsif (exists $opt{patch} || $opt{changes}) {
-      if (exists $opt{patch}) {
-        unless ($patch_opened) {
-          if (open PATCH, ">$opt{patch}") {
-            $patch_opened = 1;
-          }
-          else {
-            error("Cannot open '$opt{patch}' for writing: $!");
-            delete $opt{patch};
-            $opt{changes} = 1;
-            goto fallback;
-          }
-        }
-        mydiff(\*PATCH, $filename, $c);
-      }
-      else {
-fallback:
-        info("Suggested changes:");
-        mydiff(\*STDOUT, $filename, $c);
-      }
-    }
-    else {
-      my $s = $file{changes} == 1 ? '' : 's';
-      info("$file{changes} potentially required change$s detected");
-    }
-  }
-  else {
-    info("Looks good");
-  }
-}
-
-close PATCH if $patch_opened;
-
-exit 0;
-
-
-sub try_use { eval "use @_;"; return $@ eq '' }
-
-sub mydiff
-{
-  local *F = shift;
-  my($file, $str) = @_;
-  my $diff;
-
-  if (exists $opt{diff}) {
-    $diff = run_diff($opt{diff}, $file, $str);
-  }
-
-  if (!defined $diff and try_use('Text::Diff')) {
-    $diff = Text::Diff::diff($file, \$str, { STYLE => 'Unified' });
-    $diff = <<HEADER . $diff;
---- $file
-+++ $file.patched
-HEADER
-  }
-
-  if (!defined $diff) {
-    $diff = run_diff('diff -u', $file, $str);
-  }
-
-  if (!defined $diff) {
-    $diff = run_diff('diff', $file, $str);
-  }
-
-  if (!defined $diff) {
-    error("Cannot generate a diff. Please install Text::Diff or use --copy.");
-    return;
-  }
-
-  print F $diff;
-}
-
-sub run_diff
-{
-  my($prog, $file, $str) = @_;
-  my $tmp = 'dppptemp';
-  my $suf = 'aaa';
-  my $diff = '';
-  local *F;
-
-  while (-e "$tmp.$suf") { $suf++ }
-  $tmp = "$tmp.$suf";
-
-  if (open F, ">$tmp") {
-    print F $str;
-    close F;
-
-    if (open F, "$prog $file $tmp |") {
-      while (<F>) {
-        s/\Q$tmp\E/$file.patched/;
-        $diff .= $_;
-      }
-      close F;
-      unlink $tmp;
-      return $diff;
-    }
-
-    unlink $tmp;
-  }
-  else {
-    error("Cannot open '$tmp' for writing: $!");
-  }
-
-  return undef;
-}
-
-sub rec_depend
-{
-  my($func, $seen) = @_;
-  return () unless exists $depends{$func};
-  $seen = {%{$seen||{}}};
-  return () if $seen->{$func}++;
-  my %s;
-  grep !$s{$_}++, map { ($_, rec_depend($_, $seen)) } @{$depends{$func}};
-}
-
-sub parse_version
-{
-  my $ver = shift;
-
-  if ($ver =~ /^(\d+)\.(\d+)\.(\d+)$/) {
-    return ($1, $2, $3);
-  }
-  elsif ($ver !~ /^\d+\.[\d_]+$/) {
-    die "cannot parse version '$ver'\n";
-  }
-
-  $ver =~ s/_//g;
-  $ver =~ s/$/000000/;
-
-  my($r,$v,$s) = $ver =~ /(\d+)\.(\d{3})(\d{3})/;
-
-  $v = int $v;
-  $s = int $s;
-
-  if ($r < 5 || ($r == 5 && $v < 6)) {
-    if ($s % 10) {
-      die "cannot parse version '$ver'\n";
-    }
-  }
-
-  return ($r, $v, $s);
-}
-
-sub format_version
-{
-  my $ver = shift;
-
-  $ver =~ s/$/000000/;
-  my($r,$v,$s) = $ver =~ /(\d+)\.(\d{3})(\d{3})/;
-
-  $v = int $v;
-  $s = int $s;
-
-  if ($r < 5 || ($r == 5 && $v < 6)) {
-    if ($s % 10) {
-      die "invalid version '$ver'\n";
-    }
-    $s /= 10;
-
-    $ver = sprintf "%d.%03d", $r, $v;
-    $s > 0 and $ver .= sprintf "_%02d", $s;
-
-    return $ver;
-  }
-
-  return sprintf "%d.%d.%d", $r, $v, $s;
-}
-
-sub info
-{
-  $opt{quiet} and return;
-  print @_, "\n";
-}
-
-sub diag
-{
-  $opt{quiet} and return;
-  $opt{diag} and print @_, "\n";
-}
-
-sub warning
-{
-  $opt{quiet} and return;
-  print "*** ", @_, "\n";
-}
-
-sub error
-{
-  print "*** ERROR: ", @_, "\n";
-}
-
-my %given_hints;
-my %given_warnings;
-sub hint
-{
-  $opt{quiet} and return;
-  my $func = shift;
-  my $rv = 0;
-  if (exists $warnings{$func} && !$given_warnings{$func}++) {
-    my $warn = $warnings{$func};
-    $warn =~ s!^!*** !mg;
-    print "*** WARNING: $func\n", $warn;
-    $rv++;
-  }
-  if ($opt{hints} && exists $hints{$func} && !$given_hints{$func}++) {
-    my $hint = $hints{$func};
-    $hint =~ s/^/   /mg;
-    print "   --- hint for $func ---\n", $hint;
-  }
-  $rv;
-}
-
-sub usage
-{
-  my($usage) = do { local(@ARGV,$/)=($0); <> } =~ /^=head\d$HS+SYNOPSIS\s*^(.*?)\s*^=/ms;
-  my %M = ( 'I' => '*' );
-  $usage =~ s/^\s*perl\s+\S+/$^X $0/;
-  $usage =~ s/([A-Z])<([^>]+)>/$M{$1}$2$M{$1}/g;
-
-  print <<ENDUSAGE;
-
-Usage: $usage
-
-See perldoc $0 for details.
-
-ENDUSAGE
-
-  exit 2;
-}
-
-sub strip
-{
-  my $self = do { local(@ARGV,$/)=($0); <> };
-  my($copy) = $self =~ /^=head\d\s+COPYRIGHT\s*^(.*?)^=\w+/ms;
-  $copy =~ s/^(?=\S+)/    /gms;
-  $self =~ s/^$HS+Do NOT edit.*?(?=^-)/$copy/ms;
-  $self =~ s/^SKIP.*(?=^__DATA__)/SKIP
-if (\@ARGV && \$ARGV[0] eq '--unstrip') {
-  eval { require Devel::PPPort };
-  \$@ and die "Cannot require Devel::PPPort, please install.\\n";
-  if (eval \$Devel::PPPort::VERSION < $VERSION) {
-    die "$0 was originally generated with Devel::PPPort $VERSION.\\n"
-      . "Your Devel::PPPort is only version \$Devel::PPPort::VERSION.\\n"
-      . "Please install a newer version, or --unstrip will not work.\\n";
-  }
-  Devel::PPPort::WriteFile(\$0);
-  exit 0;
-}
-print <<END;
-
-Sorry, but this is a stripped version of \$0.
-
-To be able to use its original script and doc functionality,
-please try to regenerate this file using:
-
-  \$^X \$0 --unstrip
-
-END
-/ms;
-  my($pl, $c) = $self =~ /(.*^__DATA__)(.*)/ms;
-  $c =~ s{
-    / (?: \*[^*]*\*+(?:[^$ccs][^*]*\*+)* / | /[^\r\n]*)
-  | ( "[^"\\]*(?:\\.[^"\\]*)*"
-    | '[^'\\]*(?:\\.[^'\\]*)*' )
-  | ($HS+) }{ defined $2 ? ' ' : ($1 || '') }gsex;
-  $c =~ s!\s+$!!mg;
-  $c =~ s!^$LF!!mg;
-  $c =~ s!^\s*#\s*!#!mg;
-  $c =~ s!^\s+!!mg;
-
-  open OUT, ">$0" or die "cannot strip $0: $!\n";
-  print OUT "$pl$c\n";
-
-  exit 0;
-}
-
-__DATA__
-*/
-
-#ifndef _P_P_PORTABILITY_H_
-#define _P_P_PORTABILITY_H_
-
-#ifndef DPPP_NAMESPACE
-#  define DPPP_NAMESPACE DPPP_
-#endif
-
-#define DPPP_CAT2(x,y) CAT2(x,y)
-#define DPPP_(name) DPPP_CAT2(DPPP_NAMESPACE, name)
-
-#ifndef PERL_REVISION
-#  if !defined(__PATCHLEVEL_H_INCLUDED__) && !(defined(PATCHLEVEL) && defined(SUBVERSION))
-#    define PERL_PATCHLEVEL_H_IMPLICIT
-#    include <patchlevel.h>
-#  endif
-#  if !(defined(PERL_VERSION) || (defined(SUBVERSION) && defined(PATCHLEVEL)))
-#    include <could_not_find_Perl_patchlevel.h>
-#  endif
-#  ifndef PERL_REVISION
-#    define PERL_REVISION       (5)
-     /* Replace: 1 */
-#    define PERL_VERSION        PATCHLEVEL
-#    define PERL_SUBVERSION     SUBVERSION
-     /* Replace PERL_PATCHLEVEL with PERL_VERSION */
-     /* Replace: 0 */
-#  endif
-#endif
-
-#define D_PPP_DEC2BCD(dec) ((((dec)/100)<<8)|((((dec)%100)/10)<<4)|((dec)%10))
-#define PERL_BCDVERSION ((D_PPP_DEC2BCD(PERL_REVISION)<<24)|(D_PPP_DEC2BCD(PERL_VERSION)<<12)|D_PPP_DEC2BCD(PERL_SUBVERSION))
-
-/* It is very unlikely that anyone will try to use this with Perl 6
-   (or greater), but who knows.
- */
-#if PERL_REVISION != 5
-#  error ppport.h only works with Perl version 5
-#endif /* PERL_REVISION != 5 */
-#ifndef dTHR
-#  define dTHR                           dNOOP
-#endif
-#ifndef dTHX
-#  define dTHX                           dNOOP
-#endif
-
-#ifndef dTHXa
-#  define dTHXa(x)                       dNOOP
-#endif
-#ifndef pTHX
-#  define pTHX                           void
-#endif
-
-#ifndef pTHX_
-#  define pTHX_
-#endif
-
-#ifndef aTHX
-#  define aTHX
-#endif
-
-#ifndef aTHX_
-#  define aTHX_
-#endif
-
-#if (PERL_BCDVERSION < 0x5006000)
-#  ifdef USE_THREADS
-#    define aTHXR  thr
-#    define aTHXR_ thr,
-#  else
-#    define aTHXR
-#    define aTHXR_
-#  endif
-#  define dTHXR  dTHR
-#else
-#  define aTHXR  aTHX
-#  define aTHXR_ aTHX_
-#  define dTHXR  dTHX
-#endif
-#ifndef dTHXoa
-#  define dTHXoa(x)                      dTHXa(x)
-#endif
-
-#ifdef I_LIMITS
-#  include <limits.h>
-#endif
-
-#ifndef PERL_UCHAR_MIN
-#  define PERL_UCHAR_MIN ((unsigned char)0)
-#endif
-
-#ifndef PERL_UCHAR_MAX
-#  ifdef UCHAR_MAX
-#    define PERL_UCHAR_MAX ((unsigned char)UCHAR_MAX)
-#  else
-#    ifdef MAXUCHAR
-#      define PERL_UCHAR_MAX ((unsigned char)MAXUCHAR)
-#    else
-#      define PERL_UCHAR_MAX ((unsigned char)~(unsigned)0)
-#    endif
-#  endif
-#endif
-
-#ifndef PERL_USHORT_MIN
-#  define PERL_USHORT_MIN ((unsigned short)0)
-#endif
-
-#ifndef PERL_USHORT_MAX
-#  ifdef USHORT_MAX
-#    define PERL_USHORT_MAX ((unsigned short)USHORT_MAX)
-#  else
-#    ifdef MAXUSHORT
-#      define PERL_USHORT_MAX ((unsigned short)MAXUSHORT)
-#    else
-#      ifdef USHRT_MAX
-#        define PERL_USHORT_MAX ((unsigned short)USHRT_MAX)
-#      else
-#        define PERL_USHORT_MAX ((unsigned short)~(unsigned)0)
-#      endif
-#    endif
-#  endif
-#endif
-
-#ifndef PERL_SHORT_MAX
-#  ifdef SHORT_MAX
-#    define PERL_SHORT_MAX ((short)SHORT_MAX)
-#  else
-#    ifdef MAXSHORT    /* Often used in <values.h> */
-#      define PERL_SHORT_MAX ((short)MAXSHORT)
-#    else
-#      ifdef SHRT_MAX
-#        define PERL_SHORT_MAX ((short)SHRT_MAX)
-#      else
-#        define PERL_SHORT_MAX ((short) (PERL_USHORT_MAX >> 1))
-#      endif
-#    endif
-#  endif
-#endif
-
-#ifndef PERL_SHORT_MIN
-#  ifdef SHORT_MIN
-#    define PERL_SHORT_MIN ((short)SHORT_MIN)
-#  else
-#    ifdef MINSHORT
-#      define PERL_SHORT_MIN ((short)MINSHORT)
-#    else
-#      ifdef SHRT_MIN
-#        define PERL_SHORT_MIN ((short)SHRT_MIN)
-#      else
-#        define PERL_SHORT_MIN (-PERL_SHORT_MAX - ((3 & -1) == 3))
-#      endif
-#    endif
-#  endif
-#endif
-
-#ifndef PERL_UINT_MAX
-#  ifdef UINT_MAX
-#    define PERL_UINT_MAX ((unsigned int)UINT_MAX)
-#  else
-#    ifdef MAXUINT
-#      define PERL_UINT_MAX ((unsigned int)MAXUINT)
-#    else
-#      define PERL_UINT_MAX (~(unsigned int)0)
-#    endif
-#  endif
-#endif
-
-#ifndef PERL_UINT_MIN
-#  define PERL_UINT_MIN ((unsigned int)0)
-#endif
-
-#ifndef PERL_INT_MAX
-#  ifdef INT_MAX
-#    define PERL_INT_MAX ((int)INT_MAX)
-#  else
-#    ifdef MAXINT    /* Often used in <values.h> */
-#      define PERL_INT_MAX ((int)MAXINT)
-#    else
-#      define PERL_INT_MAX ((int)(PERL_UINT_MAX >> 1))
-#    endif
-#  endif
-#endif
-
-#ifndef PERL_INT_MIN
-#  ifdef INT_MIN
-#    define PERL_INT_MIN ((int)INT_MIN)
-#  else
-#    ifdef MININT
-#      define PERL_INT_MIN ((int)MININT)
-#    else
-#      define PERL_INT_MIN (-PERL_INT_MAX - ((3 & -1) == 3))
-#    endif
-#  endif
-#endif
-
-#ifndef PERL_ULONG_MAX
-#  ifdef ULONG_MAX
-#    define PERL_ULONG_MAX ((unsigned long)ULONG_MAX)
-#  else
-#    ifdef MAXULONG
-#      define PERL_ULONG_MAX ((unsigned long)MAXULONG)
-#    else
-#      define PERL_ULONG_MAX (~(unsigned long)0)
-#    endif
-#  endif
-#endif
-
-#ifndef PERL_ULONG_MIN
-#  define PERL_ULONG_MIN ((unsigned long)0L)
-#endif
-
-#ifndef PERL_LONG_MAX
-#  ifdef LONG_MAX
-#    define PERL_LONG_MAX ((long)LONG_MAX)
-#  else
-#    ifdef MAXLONG
-#      define PERL_LONG_MAX ((long)MAXLONG)
-#    else
-#      define PERL_LONG_MAX ((long) (PERL_ULONG_MAX >> 1))
-#    endif
-#  endif
-#endif
-
-#ifndef PERL_LONG_MIN
-#  ifdef LONG_MIN
-#    define PERL_LONG_MIN ((long)LONG_MIN)
-#  else
-#    ifdef MINLONG
-#      define PERL_LONG_MIN ((long)MINLONG)
-#    else
-#      define PERL_LONG_MIN (-PERL_LONG_MAX - ((3 & -1) == 3))
-#    endif
-#  endif
-#endif
-
-#if defined(HAS_QUAD) && (defined(convex) || defined(uts))
-#  ifndef PERL_UQUAD_MAX
-#    ifdef ULONGLONG_MAX
-#      define PERL_UQUAD_MAX ((unsigned long long)ULONGLONG_MAX)
-#    else
-#      ifdef MAXULONGLONG
-#        define PERL_UQUAD_MAX ((unsigned long long)MAXULONGLONG)
-#      else
-#        define PERL_UQUAD_MAX (~(unsigned long long)0)
-#      endif
-#    endif
-#  endif
-
-#  ifndef PERL_UQUAD_MIN
-#    define PERL_UQUAD_MIN ((unsigned long long)0L)
-#  endif
-
-#  ifndef PERL_QUAD_MAX
-#    ifdef LONGLONG_MAX
-#      define PERL_QUAD_MAX ((long long)LONGLONG_MAX)
-#    else
-#      ifdef MAXLONGLONG
-#        define PERL_QUAD_MAX ((long long)MAXLONGLONG)
-#      else
-#        define PERL_QUAD_MAX ((long long) (PERL_UQUAD_MAX >> 1))
-#      endif
-#    endif
-#  endif
-
-#  ifndef PERL_QUAD_MIN
-#    ifdef LONGLONG_MIN
-#      define PERL_QUAD_MIN ((long long)LONGLONG_MIN)
-#    else
-#      ifdef MINLONGLONG
-#        define PERL_QUAD_MIN ((long long)MINLONGLONG)
-#      else
-#        define PERL_QUAD_MIN (-PERL_QUAD_MAX - ((3 & -1) == 3))
-#      endif
-#    endif
-#  endif
-#endif
-
-/* This is based on code from 5.003 perl.h */
-#ifdef HAS_QUAD
-#  ifdef cray
-#ifndef IVTYPE
-#  define IVTYPE                         int
-#endif
-
-#ifndef IV_MIN
-#  define IV_MIN                         PERL_INT_MIN
-#endif
-
-#ifndef IV_MAX
-#  define IV_MAX                         PERL_INT_MAX
-#endif
-
-#ifndef UV_MIN
-#  define UV_MIN                         PERL_UINT_MIN
-#endif
-
-#ifndef UV_MAX
-#  define UV_MAX                         PERL_UINT_MAX
-#endif
-
-#    ifdef INTSIZE
-#ifndef IVSIZE
-#  define IVSIZE                         INTSIZE
-#endif
-
-#    endif
-#  else
-#    if defined(convex) || defined(uts)
-#ifndef IVTYPE
-#  define IVTYPE                         long long
-#endif
-
-#ifndef IV_MIN
-#  define IV_MIN                         PERL_QUAD_MIN
-#endif
-
-#ifndef IV_MAX
-#  define IV_MAX                         PERL_QUAD_MAX
-#endif
-
-#ifndef UV_MIN
-#  define UV_MIN                         PERL_UQUAD_MIN
-#endif
-
-#ifndef UV_MAX
-#  define UV_MAX                         PERL_UQUAD_MAX
-#endif
-
-#      ifdef LONGLONGSIZE
-#ifndef IVSIZE
-#  define IVSIZE                         LONGLONGSIZE
-#endif
-
-#      endif
-#    else
-#ifndef IVTYPE
-#  define IVTYPE                         long
-#endif
-
-#ifndef IV_MIN
-#  define IV_MIN                         PERL_LONG_MIN
-#endif
-
-#ifndef IV_MAX
-#  define IV_MAX                         PERL_LONG_MAX
-#endif
-
-#ifndef UV_MIN
-#  define UV_MIN                         PERL_ULONG_MIN
-#endif
-
-#ifndef UV_MAX
-#  define UV_MAX                         PERL_ULONG_MAX
-#endif
-
-#      ifdef LONGSIZE
-#ifndef IVSIZE
-#  define IVSIZE                         LONGSIZE
-#endif
-
-#      endif
-#    endif
-#  endif
-#ifndef IVSIZE
-#  define IVSIZE                         8
-#endif
-
-#ifndef LONGSIZE
-#  define LONGSIZE                       8
-#endif
-
-#ifndef PERL_QUAD_MIN
-#  define PERL_QUAD_MIN                  IV_MIN
-#endif
-
-#ifndef PERL_QUAD_MAX
-#  define PERL_QUAD_MAX                  IV_MAX
-#endif
-
-#ifndef PERL_UQUAD_MIN
-#  define PERL_UQUAD_MIN                 UV_MIN
-#endif
-
-#ifndef PERL_UQUAD_MAX
-#  define PERL_UQUAD_MAX                 UV_MAX
-#endif
-
-#else
-#ifndef IVTYPE
-#  define IVTYPE                         long
-#endif
-
-#ifndef LONGSIZE
-#  define LONGSIZE                       4
-#endif
-
-#ifndef IV_MIN
-#  define IV_MIN                         PERL_LONG_MIN
-#endif
-
-#ifndef IV_MAX
-#  define IV_MAX                         PERL_LONG_MAX
-#endif
-
-#ifndef UV_MIN
-#  define UV_MIN                         PERL_ULONG_MIN
-#endif
-
-#ifndef UV_MAX
-#  define UV_MAX                         PERL_ULONG_MAX
-#endif
-
-#endif
-
-#ifndef IVSIZE
-#  ifdef LONGSIZE
-#    define IVSIZE LONGSIZE
-#  else
-#    define IVSIZE 4 /* A bold guess, but the best we can make. */
-#  endif
-#endif
-#ifndef UVTYPE
-#  define UVTYPE                         unsigned IVTYPE
-#endif
-
-#ifndef UVSIZE
-#  define UVSIZE                         IVSIZE
-#endif
-#ifndef cBOOL
-#  define cBOOL(cbool)                   ((cbool) ? (bool)1 : (bool)0)
-#endif
-
-#ifndef OpHAS_SIBLING
-#  define OpHAS_SIBLING(o)               (cBOOL((o)->op_sibling))
-#endif
-
-#ifndef OpSIBLING
-#  define OpSIBLING(o)                   (0 + (o)->op_sibling)
-#endif
-
-#ifndef OpMORESIB_set
-#  define OpMORESIB_set(o, sib)          ((o)->op_sibling = (sib))
-#endif
-
-#ifndef OpLASTSIB_set
-#  define OpLASTSIB_set(o, parent)       ((o)->op_sibling = NULL)
-#endif
-
-#ifndef OpMAYBESIB_set
-#  define OpMAYBESIB_set(o, sib, parent) ((o)->op_sibling = (sib))
-#endif
-
-#ifndef HEf_SVKEY
-#  define HEf_SVKEY                      -2
-#endif
-
-#if defined(DEBUGGING) && !defined(__COVERITY__)
-#ifndef __ASSERT_
-#  define __ASSERT_(statement)           assert(statement),
-#endif
-
-#else
-#ifndef __ASSERT_
-#  define __ASSERT_(statement)
-#endif
-
-#endif
-
-#ifndef SvRX
-#if defined(NEED_SvRX)
-static void * DPPP_(my_SvRX)(pTHX_ SV *rv);
-static
-#else
-extern void * DPPP_(my_SvRX)(pTHX_ SV *rv);
-#endif
-
-#if defined(NEED_SvRX) || defined(NEED_SvRX_GLOBAL)
-
-#ifdef SvRX
-#  undef SvRX
-#endif
-#define SvRX(a) DPPP_(my_SvRX)(aTHX_ a)
-
-
-void *
-DPPP_(my_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
-#ifndef SvRXOK
-#  define SvRXOK(sv)                     (!!SvRX(sv))
-#endif
-
-#ifndef PERL_UNUSED_DECL
-#  ifdef HASATTRIBUTE
-#    if (defined(__GNUC__) && defined(__cplusplus)) || defined(__INTEL_COMPILER)
-#      define PERL_UNUSED_DECL
-#    else
-#      define PERL_UNUSED_DECL __attribute__((unused))
-#    endif
-#  else
-#    define PERL_UNUSED_DECL
-#  endif
-#endif
-
-#ifndef PERL_UNUSED_ARG
-#  if defined(lint) && defined(S_SPLINT_S) /* www.splint.org */
-#    include <note.h>
-#    define PERL_UNUSED_ARG(x) NOTE(ARGUNUSED(x))
-#  else
-#    define PERL_UNUSED_ARG(x) ((void)x)
-#  endif
-#endif
-
-#ifndef PERL_UNUSED_VAR
-#  define PERL_UNUSED_VAR(x) ((void)x)
-#endif
-
-#ifndef PERL_UNUSED_CONTEXT
-#  ifdef USE_ITHREADS
-#    define PERL_UNUSED_CONTEXT PERL_UNUSED_ARG(my_perl)
-#  else
-#    define PERL_UNUSED_CONTEXT
-#  endif
-#endif
-
-#ifndef PERL_UNUSED_RESULT
-#  if defined(__GNUC__) && defined(HASATTRIBUTE_WARN_UNUSED_RESULT)
-#    define PERL_UNUSED_RESULT(v) STMT_START { __typeof__(v) z = (v); (void)sizeof(z); } STMT_END
-#  else
-#    define PERL_UNUSED_RESULT(v) ((void)(v))
-#  endif
-#endif
-#ifndef NOOP
-#  define NOOP                           /*EMPTY*/(void)0
-#endif
-
-#ifndef dNOOP
-#  define dNOOP                          extern int /*@unused@*/ Perl___notused PERL_UNUSED_DECL
-#endif
-
-#ifndef NVTYPE
-#  if defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE)
-#    define NVTYPE long double
-#  else
-#    define NVTYPE double
-#  endif
-typedef NVTYPE NV;
-#endif
-
-#ifndef INT2PTR
-#  if (IVSIZE == PTRSIZE) && (UVSIZE == PTRSIZE)
-#    define PTRV                  UV
-#    define INT2PTR(any,d)        (any)(d)
-#  else
-#    if PTRSIZE == LONGSIZE
-#      define PTRV                unsigned long
-#    else
-#      define PTRV                unsigned
-#    endif
-#    define INT2PTR(any,d)        (any)(PTRV)(d)
-#  endif
-#endif
-
-#ifndef PTR2ul
-#  if PTRSIZE == LONGSIZE
-#    define PTR2ul(p)     (unsigned long)(p)
-#  else
-#    define PTR2ul(p)     INT2PTR(unsigned long,p)
-#  endif
-#endif
-#ifndef PTR2nat
-#  define PTR2nat(p)                     (PTRV)(p)
-#endif
-
-#ifndef NUM2PTR
-#  define NUM2PTR(any,d)                 (any)PTR2nat(d)
-#endif
-
-#ifndef PTR2IV
-#  define PTR2IV(p)                      INT2PTR(IV,p)
-#endif
-
-#ifndef PTR2UV
-#  define PTR2UV(p)                      INT2PTR(UV,p)
-#endif
-
-#ifndef PTR2NV
-#  define PTR2NV(p)                      NUM2PTR(NV,p)
-#endif
-
-#undef START_EXTERN_C
-#undef END_EXTERN_C
-#undef EXTERN_C
-#ifdef __cplusplus
-#  define START_EXTERN_C extern "C" {
-#  define END_EXTERN_C }
-#  define EXTERN_C extern "C"
-#else
-#  define START_EXTERN_C
-#  define END_EXTERN_C
-#  define EXTERN_C extern
-#endif
-
-#if defined(PERL_GCC_PEDANTIC)
-#  ifndef PERL_GCC_BRACE_GROUPS_FORBIDDEN
-#    define PERL_GCC_BRACE_GROUPS_FORBIDDEN
-#  endif
-#endif
-
-#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN) && !defined(__cplusplus)
-#  ifndef PERL_USE_GCC_BRACE_GROUPS
-#    define PERL_USE_GCC_BRACE_GROUPS
-#  endif
-#endif
-
-#undef STMT_START
-#undef STMT_END
-#ifdef PERL_USE_GCC_BRACE_GROUPS
-#  define STMT_START    (void)( /* gcc supports ``({ STATEMENTS; })'' */
-#  define STMT_END      )
-#else
-#  if defined(VOIDFLAGS) && (VOIDFLAGS) && (defined(sun) || defined(__sun__)) && !defined(__GNUC__)
-#    define STMT_START  if (1)
-#    define STMT_END    else (void)0
-#  else
-#    define STMT_START  do
-#    define STMT_END    while (0)
-#  endif
-#endif
-#ifndef boolSV
-#  define boolSV(b)                      ((b) ? &PL_sv_yes : &PL_sv_no)
-#endif
-
-/* DEFSV appears first in 5.004_56 */
-#ifndef DEFSV
-#  define DEFSV                          GvSV(PL_defgv)
-#endif
-
-#ifndef SAVE_DEFSV
-#  define SAVE_DEFSV                     SAVESPTR(GvSV(PL_defgv))
-#endif
-
-#ifndef DEFSV_set
-#  define DEFSV_set(sv)                  (DEFSV = (sv))
-#endif
-
-/* Older perls (<=5.003) lack AvFILLp */
-#ifndef AvFILLp
-#  define AvFILLp                        AvFILL
-#endif
-#ifndef av_tindex
-#  define av_tindex                      AvFILL
-#endif
-
-#ifndef av_top_index
-#  define av_top_index                   AvFILL
-#endif
-#ifndef ERRSV
-#  define ERRSV                          get_sv("@",FALSE)
-#endif
-
-/* Hint: gv_stashpvn
- * This function's backport doesn't support the length parameter, but
- * rather ignores it. Portability can only be ensured if the length
- * parameter is used for speed reasons, but the length can always be
- * correctly computed from the string argument.
- */
-#ifndef gv_stashpvn
-#  define gv_stashpvn(str,len,create)    gv_stashpv(str,create)
-#endif
-
-/* Replace: 1 */
-#ifndef get_cv
-#  define get_cv                         perl_get_cv
-#endif
-
-#ifndef get_sv
-#  define get_sv                         perl_get_sv
-#endif
-
-#ifndef get_av
-#  define get_av                         perl_get_av
-#endif
-
-#ifndef get_hv
-#  define get_hv                         perl_get_hv
-#endif
-
-/* Replace: 0 */
-#ifndef dUNDERBAR
-#  define dUNDERBAR                      dNOOP
-#endif
-
-#ifndef UNDERBAR
-#  define UNDERBAR                       DEFSV
-#endif
-#ifndef dAX
-#  define dAX                            I32 ax = MARK - PL_stack_base + 1
-#endif
-
-#ifndef dITEMS
-#  define dITEMS                         I32 items = SP - MARK
-#endif
-#ifndef dXSTARG
-#  define dXSTARG                        SV * targ = sv_newmortal()
-#endif
-#ifndef dAXMARK
-#  define dAXMARK                        I32 ax = POPMARK; \
-                               register SV ** const mark = PL_stack_base + ax++
-#endif
-#ifndef XSprePUSH
-#  define XSprePUSH                      (sp = PL_stack_base + ax - 1)
-#endif
-
-#if (PERL_BCDVERSION < 0x5005000)
-#  undef XSRETURN
-#  define XSRETURN(off)                                   \
-      STMT_START {                                        \
-          PL_stack_sp = PL_stack_base + ax + ((off) - 1); \
-          return;                                         \
-      } STMT_END
-#endif
-#ifndef XSPROTO
-#  define XSPROTO(name)                  void name(pTHX_ CV* cv)
-#endif
-
-#ifndef SVfARG
-#  define SVfARG(p)                      ((void*)(p))
-#endif
-#ifndef PERL_ABS
-#  define PERL_ABS(x)                    ((x) < 0 ? -(x) : (x))
-#endif
-#ifndef dVAR
-#  define dVAR                           dNOOP
-#endif
-#ifndef SVf
-#  define SVf                            "_"
-#endif
-#ifndef UTF8_MAXBYTES
-#  define UTF8_MAXBYTES                  UTF8_MAXLEN
-#endif
-#ifndef CPERLscope
-#  define CPERLscope(x)                  x
-#endif
-#ifndef PERL_HASH
-#  define PERL_HASH(hash,str,len)        \
-     STMT_START { \
-        const char *s_PeRlHaSh = str; \
-        I32 i_PeRlHaSh = len; \
-        U32 hash_PeRlHaSh = 0; \
-        while (i_PeRlHaSh--) \
-            hash_PeRlHaSh = hash_PeRlHaSh * 33 + *s_PeRlHaSh++; \
-        (hash) = hash_PeRlHaSh; \
-    } STMT_END
-#endif
-
-#ifndef PERLIO_FUNCS_DECL
-# ifdef PERLIO_FUNCS_CONST
-#  define PERLIO_FUNCS_DECL(funcs) const PerlIO_funcs funcs
-#  define PERLIO_FUNCS_CAST(funcs) (PerlIO_funcs*)(funcs)
-# else
-#  define PERLIO_FUNCS_DECL(funcs) PerlIO_funcs funcs
-#  define PERLIO_FUNCS_CAST(funcs) (funcs)
-# endif
-#endif
-
-/* provide these typedefs for older perls */
-#if (PERL_BCDVERSION < 0x5009003)
-
-# ifdef ARGSproto
-typedef OP* (CPERLscope(*Perl_ppaddr_t))(ARGSproto);
-# else
-typedef OP* (CPERLscope(*Perl_ppaddr_t))(pTHX);
-# endif
-
-typedef OP* (CPERLscope(*Perl_check_t)) (pTHX_ OP*);
-
-#endif
-
-#ifndef WIDEST_UTYPE
-# ifdef QUADKIND
-#  ifdef U64TYPE
-#   define WIDEST_UTYPE U64TYPE
-#  else
-#   define WIDEST_UTYPE Quad_t
-#  endif
-# else
-#  define WIDEST_UTYPE U32
-# endif
-#endif
-
-#ifdef EBCDIC
-
-/* This is the first version where these macros are fully correct.  Relying on
- * the C library functions, as earlier releases did, causes problems with
- * locales */
-# if (PERL_BCDVERSION < 0x5022000)
-#  undef isALNUM
-#  undef isALNUM_A
-#  undef isALNUMC
-#  undef isALNUMC_A
-#  undef isALPHA
-#  undef isALPHA_A
-#  undef isALPHANUMERIC
-#  undef isALPHANUMERIC_A
-#  undef isASCII
-#  undef isASCII_A
-#  undef isBLANK
-#  undef isBLANK_A
-#  undef isCNTRL
-#  undef isCNTRL_A
-#  undef isDIGIT
-#  undef isDIGIT_A
-#  undef isGRAPH
-#  undef isGRAPH_A
-#  undef isIDCONT
-#  undef isIDCONT_A
-#  undef isIDFIRST
-#  undef isIDFIRST_A
-#  undef isLOWER
-#  undef isLOWER_A
-#  undef isOCTAL
-#  undef isOCTAL_A
-#  undef isPRINT
-#  undef isPRINT_A
-#  undef isPSXSPC
-#  undef isPSXSPC_A
-#  undef isPUNCT
-#  undef isPUNCT_A
-#  undef isSPACE
-#  undef isSPACE_A
-#  undef isUPPER
-#  undef isUPPER_A
-#  undef isWORDCHAR
-#  undef isWORDCHAR_A
-#  undef isXDIGIT
-#  undef isXDIGIT_A
-# endif
-#ifndef isASCII
-#  define isASCII(c)                     (isCNTRL(c) || isPRINT(c))
-#endif
-
-        /* The below is accurate for all EBCDIC code pages supported by
-         * all the versions of Perl overridden by this */
-#ifndef isCNTRL
-#  define isCNTRL(c)                     (    (c) == '\0' || (c) == '\a' || (c) == '\b'      \
-                             ||  (c) == '\f' || (c) == '\n' || (c) == '\r'      \
-                             ||  (c) == '\t' || (c) == '\v'                     \
-                             || ((c) <= 3 && (c) >= 1) /* SOH, STX, ETX */      \
-                             ||  (c) == 7    /* U+7F DEL */                     \
-                             || ((c) <= 0x13 && (c) >= 0x0E) /* SO, SI */       \
-                                                      /* DLE, DC[1-3] */        \
-                             ||  (c) == 0x18 /* U+18 CAN */                     \
-                             ||  (c) == 0x19 /* U+19 EOM */                     \
-                             || ((c) <= 0x1F && (c) >= 0x1C) /* [FGRU]S */      \
-                             ||  (c) == 0x26 /* U+17 ETB */                     \
-                             ||  (c) == 0x27 /* U+1B ESC */                     \
-                             ||  (c) == 0x2D /* U+05 ENQ */                     \
-                             ||  (c) == 0x2E /* U+06 ACK */                     \
-                             ||  (c) == 0x32 /* U+16 SYN */                     \
-                             ||  (c) == 0x37 /* U+04 EOT */                     \
-                             ||  (c) == 0x3C /* U+14 DC4 */                     \
-                             ||  (c) == 0x3D /* U+15 NAK */                     \
-                             ||  (c) == 0x3F /* U+1A SUB */                     \
-                            )
-#endif
-
-/* The ordering of the tests in this and isUPPER are to exclude most characters
- * early */
-#ifndef isLOWER
-#  define isLOWER(c)                     (        (c) >= 'a' && (c) <= 'z'                   \
-                             &&  (   (c) <= 'i'                                 \
-                                 || ((c) >= 'j' && (c) <= 'r')                  \
-                                 ||  (c) >= 's'))
-#endif
-
-#ifndef isUPPER
-#  define isUPPER(c)                     (        (c) >= 'A' && (c) <= 'Z'                   \
-                             && (    (c) <= 'I'                                 \
-                                 || ((c) >= 'J' && (c) <= 'R')                  \
-                                 ||  (c) >= 'S'))
-#endif
-
-#else   /* Above is EBCDIC; below is ASCII */
-
-# if (PERL_BCDVERSION < 0x5004000)
-/* The implementation of these in older perl versions can give wrong results if
- * the C program locale is set to other than the C locale */
-#  undef isALNUM
-#  undef isALNUM_A
-#  undef isALPHA
-#  undef isALPHA_A
-#  undef isDIGIT
-#  undef isDIGIT_A
-#  undef isIDFIRST
-#  undef isIDFIRST_A
-#  undef isLOWER
-#  undef isLOWER_A
-#  undef isUPPER
-#  undef isUPPER_A
-# endif
-
-# if (PERL_BCDVERSION < 0x5008000)
-/* Hint: isCNTRL
- * Earlier perls omitted DEL */
-#  undef isCNTRL
-# endif
-
-# if (PERL_BCDVERSION < 0x5010000)
-/* Hint: isPRINT
- * The implementation in older perl versions includes all of the
- * isSPACE() characters, which is wrong. The version provided by
- * Devel::PPPort always overrides a present buggy version.
- */
-#  undef isPRINT
-#  undef isPRINT_A
-# endif
-
-# if (PERL_BCDVERSION < 0x5014000)
-/* Hint: isASCII
- * The implementation in older perl versions always returned true if the
- * parameter was a signed char
- */
-#  undef isASCII
-#  undef isASCII_A
-# endif
-
-# if (PERL_BCDVERSION < 0x5020000)
-/* Hint: isSPACE
- * The implementation in older perl versions didn't include \v */
-#  undef isSPACE
-#  undef isSPACE_A
-# endif
-#ifndef isASCII
-#  define isASCII(c)                     ((WIDEST_UTYPE) (c) <= 127)
-#endif
-
-#ifndef isCNTRL
-#  define isCNTRL(c)                     ((WIDEST_UTYPE) (c) < ' ' || (c) == 127)
-#endif
-
-#ifndef isLOWER
-#  define isLOWER(c)                     ((c) >= 'a' && (c) <= 'z')
-#endif
-
-#ifndef isUPPER
-#  define isUPPER(c)                     ((c) <= 'Z' && (c) >= 'A')
-#endif
-
-#endif /* Below are definitions common to EBCDIC and ASCII */
-#ifndef isALNUM
-#  define isALNUM(c)                     isWORDCHAR(c)
-#endif
-
-#ifndef isALNUMC
-#  define isALNUMC(c)                    isALPHANUMERIC(c)
-#endif
-
-#ifndef isALPHA
-#  define isALPHA(c)                     (isUPPER(c) || isLOWER(c))
-#endif
-
-#ifndef isALPHANUMERIC
-#  define isALPHANUMERIC(c)              (isALPHA(c) || isDIGIT(c))
-#endif
-
-#ifndef isBLANK
-#  define isBLANK(c)                     ((c) == ' ' || (c) == '\t')
-#endif
-
-#ifndef isDIGIT
-#  define isDIGIT(c)                     ((c) <= '9' && (c) >= '0')
-#endif
-
-#ifndef isGRAPH
-#  define isGRAPH(c)                     (isWORDCHAR(c) || isPUNCT(c))
-#endif
-
-#ifndef isIDCONT
-#  define isIDCONT(c)                    isWORDCHAR(c)
-#endif
-
-#ifndef isIDFIRST
-#  define isIDFIRST(c)                   (isALPHA(c) || (c) == '_')
-#endif
-
-#ifndef isOCTAL
-#  define isOCTAL(c)                     (((WIDEST_UTYPE)((c)) & ~7) == '0')
-#endif
-
-#ifndef isPRINT
-#  define isPRINT(c)                     (isGRAPH(c) || (c) == ' ')
-#endif
-
-#ifndef isPSXSPC
-#  define isPSXSPC(c)                    isSPACE(c)
-#endif
-
-#ifndef isPUNCT
-#  define isPUNCT(c)                     (   (c) == '-' || (c) == '!' || (c) == '"'          \
-                             || (c) == '#' || (c) == '$' || (c) == '%'          \
-                             || (c) == '&' || (c) == '\'' || (c) == '('         \
-                             || (c) == ')' || (c) == '*' || (c) == '+'          \
-                             || (c) == ',' || (c) == '.' || (c) == '/'          \
-                             || (c) == ':' || (c) == ';' || (c) == '<'          \
-                             || (c) == '=' || (c) == '>' || (c) == '?'          \
-                             || (c) == '@' || (c) == '[' || (c) == '\\'         \
-                             || (c) == ']' || (c) == '^' || (c) == '_'          \
-                             || (c) == '`' || (c) == '{' || (c) == '|'          \
-                             || (c) == '}' || (c) == '~')
-#endif
-
-#ifndef isSPACE
-#  define isSPACE(c)                     (   isBLANK(c) || (c) == '\n' || (c) == '\r'    \
-                                 || (c) == '\v' || (c) == '\f')
-#endif
-
-#ifndef isWORDCHAR
-#  define isWORDCHAR(c)                  (isALPHANUMERIC(c) || (c) == '_')
-#endif
-
-#ifndef isXDIGIT
-#  define isXDIGIT(c)                    (   isDIGIT(c)                                  \
-                                 || ((c) >= 'a' && (c) <= 'f')                  \
-                                 || ((c) >= 'A' && (c) <= 'F'))
-#endif
-#ifndef isALNUM_A
-#  define isALNUM_A                      isALNUM
-#endif
-
-#ifndef isALNUMC_A
-#  define isALNUMC_A                     isALNUMC
-#endif
-
-#ifndef isALPHA_A
-#  define isALPHA_A                      isALPHA
-#endif
-
-#ifndef isALPHANUMERIC_A
-#  define isALPHANUMERIC_A               isALPHANUMERIC
-#endif
-
-#ifndef isASCII_A
-#  define isASCII_A                      isASCII
-#endif
-
-#ifndef isBLANK_A
-#  define isBLANK_A                      isBLANK
-#endif
-
-#ifndef isCNTRL_A
-#  define isCNTRL_A                      isCNTRL
-#endif
-
-#ifndef isDIGIT_A
-#  define isDIGIT_A                      isDIGIT
-#endif
-
-#ifndef isGRAPH_A
-#  define isGRAPH_A                      isGRAPH
-#endif
-
-#ifndef isIDCONT_A
-#  define isIDCONT_A                     isIDCONT
-#endif
-
-#ifndef isIDFIRST_A
-#  define isIDFIRST_A                    isIDFIRST
-#endif
-
-#ifndef isLOWER_A
-#  define isLOWER_A                      isLOWER
-#endif
-
-#ifndef isOCTAL_A
-#  define isOCTAL_A                      isOCTAL
-#endif
-
-#ifndef isPRINT_A
-#  define isPRINT_A                      isPRINT
-#endif
-
-#ifndef isPSXSPC_A
-#  define isPSXSPC_A                     isPSXSPC
-#endif
-
-#ifndef isPUNCT_A
-#  define isPUNCT_A                      isPUNCT
-#endif
-
-#ifndef isSPACE_A
-#  define isSPACE_A                      isSPACE
-#endif
-
-#ifndef isUPPER_A
-#  define isUPPER_A                      isUPPER
-#endif
-
-#ifndef isWORDCHAR_A
-#  define isWORDCHAR_A                   isWORDCHAR
-#endif
-
-#ifndef isXDIGIT_A
-#  define isXDIGIT_A                     isXDIGIT
-#endif
-
-/* Until we figure out how to support this in older perls... */
-#if (PERL_BCDVERSION >= 0x5008000)
-#ifndef HeUTF8
-#  define HeUTF8(he)                     ((HeKLEN(he) == HEf_SVKEY) ?            \
-                                 SvUTF8(HeKEY_sv(he)) :                 \
-                                 (U32)HeKUTF8(he))
-#endif
-
-#endif
-#ifndef C_ARRAY_LENGTH
-#  define C_ARRAY_LENGTH(a)              (sizeof(a)/sizeof((a)[0]))
-#endif
-
-#ifndef C_ARRAY_END
-#  define C_ARRAY_END(a)                 ((a) + C_ARRAY_LENGTH(a))
-#endif
-#ifndef LIKELY
-#  define LIKELY(x)                      (x)
-#endif
-
-#ifndef UNLIKELY
-#  define UNLIKELY(x)                    (x)
-#endif
-#ifndef UNICODE_REPLACEMENT
-#  define UNICODE_REPLACEMENT            0xFFFD
-#endif
-
-#ifndef MUTABLE_PTR
-#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
-#  define MUTABLE_PTR(p) ({ void *_p = (p); _p; })
-#else
-#  define MUTABLE_PTR(p) ((void *) (p))
-#endif
-#endif
-#ifndef MUTABLE_SV
-#  define MUTABLE_SV(p)                  ((SV *)MUTABLE_PTR(p))
-#endif
-#ifndef WARN_ALL
-#  define WARN_ALL                       0
-#endif
-
-#ifndef WARN_CLOSURE
-#  define WARN_CLOSURE                   1
-#endif
-
-#ifndef WARN_DEPRECATED
-#  define WARN_DEPRECATED                2
-#endif
-
-#ifndef WARN_EXITING
-#  define WARN_EXITING                   3
-#endif
-
-#ifndef WARN_GLOB
-#  define WARN_GLOB                      4
-#endif
-
-#ifndef WARN_IO
-#  define WARN_IO                        5
-#endif
-
-#ifndef WARN_CLOSED
-#  define WARN_CLOSED                    6
-#endif
-
-#ifndef WARN_EXEC
-#  define WARN_EXEC                      7
-#endif
-
-#ifndef WARN_LAYER
-#  define WARN_LAYER                     8
-#endif
-
-#ifndef WARN_NEWLINE
-#  define WARN_NEWLINE                   9
-#endif
-
-#ifndef WARN_PIPE
-#  define WARN_PIPE                      10
-#endif
-
-#ifndef WARN_UNOPENED
-#  define WARN_UNOPENED                  11
-#endif
-
-#ifndef WARN_MISC
-#  define WARN_MISC                      12
-#endif
-
-#ifndef WARN_NUMERIC
-#  define WARN_NUMERIC                   13
-#endif
-
-#ifndef WARN_ONCE
-#  define WARN_ONCE                      14
-#endif
-
-#ifndef WARN_OVERFLOW
-#  define WARN_OVERFLOW                  15
-#endif
-
-#ifndef WARN_PACK
-#  define WARN_PACK                      16
-#endif
-
-#ifndef WARN_PORTABLE
-#  define WARN_PORTABLE                  17
-#endif
-
-#ifndef WARN_RECURSION
-#  define WARN_RECURSION                 18
-#endif
-
-#ifndef WARN_REDEFINE
-#  define WARN_REDEFINE                  19
-#endif
-
-#ifndef WARN_REGEXP
-#  define WARN_REGEXP                    20
-#endif
-
-#ifndef WARN_SEVERE
-#  define WARN_SEVERE                    21
-#endif
-
-#ifndef WARN_DEBUGGING
-#  define WARN_DEBUGGING                 22
-#endif
-
-#ifndef WARN_INPLACE
-#  define WARN_INPLACE                   23
-#endif
-
-#ifndef WARN_INTERNAL
-#  define WARN_INTERNAL                  24
-#endif
-
-#ifndef WARN_MALLOC
-#  define WARN_MALLOC                    25
-#endif
-
-#ifndef WARN_SIGNAL
-#  define WARN_SIGNAL                    26
-#endif
-
-#ifndef WARN_SUBSTR
-#  define WARN_SUBSTR                    27
-#endif
-
-#ifndef WARN_SYNTAX
-#  define WARN_SYNTAX                    28
-#endif
-
-#ifndef WARN_AMBIGUOUS
-#  define WARN_AMBIGUOUS                 29
-#endif
-
-#ifndef WARN_BAREWORD
-#  define WARN_BAREWORD                  30
-#endif
-
-#ifndef WARN_DIGIT
-#  define WARN_DIGIT                     31
-#endif
-
-#ifndef WARN_PARENTHESIS
-#  define WARN_PARENTHESIS               32
-#endif
-
-#ifndef WARN_PRECEDENCE
-#  define WARN_PRECEDENCE                33
-#endif
-
-#ifndef WARN_PRINTF
-#  define WARN_PRINTF                    34
-#endif
-
-#ifndef WARN_PROTOTYPE
-#  define WARN_PROTOTYPE                 35
-#endif
-
-#ifndef WARN_QW
-#  define WARN_QW                        36
-#endif
-
-#ifndef WARN_RESERVED
-#  define WARN_RESERVED                  37
-#endif
-
-#ifndef WARN_SEMICOLON
-#  define WARN_SEMICOLON                 38
-#endif
-
-#ifndef WARN_TAINT
-#  define WARN_TAINT                     39
-#endif
-
-#ifndef WARN_THREADS
-#  define WARN_THREADS                   40
-#endif
-
-#ifndef WARN_UNINITIALIZED
-#  define WARN_UNINITIALIZED             41
-#endif
-
-#ifndef WARN_UNPACK
-#  define WARN_UNPACK                    42
-#endif
-
-#ifndef WARN_UNTIE
-#  define WARN_UNTIE                     43
-#endif
-
-#ifndef WARN_UTF8
-#  define WARN_UTF8                      44
-#endif
-
-#ifndef WARN_VOID
-#  define WARN_VOID                      45
-#endif
-
-#ifndef WARN_ASSERTIONS
-#  define WARN_ASSERTIONS                46
-#endif
-#ifndef packWARN
-#  define packWARN(a)                    (a)
-#endif
-
-#ifndef ckWARN
-#  ifdef G_WARN_ON
-#    define  ckWARN(a)                  (PL_dowarn & G_WARN_ON)
-#  else
-#    define  ckWARN(a)                  PL_dowarn
-#  endif
-#endif
-
-#if (PERL_BCDVERSION >= 0x5004000) && !defined(warner)
-#if defined(NEED_warner)
-static void DPPP_(my_warner)(U32 err, const char *pat, ...);
-static
-#else
-extern void DPPP_(my_warner)(U32 err, const char *pat, ...);
-#endif
-
-#if defined(NEED_warner) || defined(NEED_warner_GLOBAL)
-
-#define Perl_warner DPPP_(my_warner)
-
-
-void
-DPPP_(my_warner)(U32 err, const char *pat, ...)
-{
-  SV *sv;
-  va_list args;
-
-  PERL_UNUSED_ARG(err);
-
-  va_start(args, pat);
-  sv = vnewSVpvf(pat, &args);
-  va_end(args);
-  sv_2mortal(sv);
-  warn("%s", SvPV_nolen(sv));
-}
-
-#define warner  Perl_warner
-
-#define Perl_warner_nocontext  Perl_warner
-
-#endif
-#endif
-
-#define _ppport_MIN(a,b) (((a) <= (b)) ? (a) : (b))
-#ifndef sv_setuv
-#  define sv_setuv(sv, uv)               \
-               STMT_START {                         \
-                 UV TeMpUv = uv;                    \
-                 if (TeMpUv <= IV_MAX)              \
-                   sv_setiv(sv, TeMpUv);            \
-                 else                               \
-                   sv_setnv(sv, (double)TeMpUv);    \
-               } STMT_END
-#endif
-#ifndef newSVuv
-#  define newSVuv(uv)                    ((uv) <= IV_MAX ? newSViv((IV)uv) : newSVnv((NV)uv))
-#endif
-#ifndef sv_2uv
-#  define sv_2uv(sv)                     ((PL_Sv = (sv)), (UV) (SvNOK(PL_Sv) ? SvNV(PL_Sv) : sv_2nv(PL_Sv)))
-#endif
-
-#ifndef SvUVX
-#  define SvUVX(sv)                      ((UV)SvIVX(sv))
-#endif
-
-#ifndef SvUVXx
-#  define SvUVXx(sv)                     SvUVX(sv)
-#endif
-
-#ifndef SvUV
-#  define SvUV(sv)                       (SvIOK(sv) ? SvUVX(sv) : sv_2uv(sv))
-#endif
-
-#ifndef SvUVx
-#  define SvUVx(sv)                      ((PL_Sv = (sv)), SvUV(PL_Sv))
-#endif
-
-/* Hint: sv_uv
- * Always use the SvUVx() macro instead of sv_uv().
- */
-#ifndef sv_uv
-#  define sv_uv(sv)                      SvUVx(sv)
-#endif
-
-#if !defined(SvUOK) && defined(SvIOK_UV)
-#  define SvUOK(sv) SvIOK_UV(sv)
-#endif
-#ifndef XST_mUV
-#  define XST_mUV(i,v)                   (ST(i) = sv_2mortal(newSVuv(v))  )
-#endif
-
-#ifndef XSRETURN_UV
-#  define XSRETURN_UV(v)                 STMT_START { XST_mUV(0,v);  XSRETURN(1); } STMT_END
-#endif
-#ifndef PUSHu
-#  define PUSHu(u)                       STMT_START { sv_setuv(TARG, (UV)(u)); PUSHTARG;  } STMT_END
-#endif
-
-#ifndef XPUSHu
-#  define XPUSHu(u)                      STMT_START { sv_setuv(TARG, (UV)(u)); XPUSHTARG; } STMT_END
-#endif
-
-#if defined UTF8SKIP
-
-/* Don't use official version because it uses MIN, which may not be available */
-#undef UTF8_SAFE_SKIP
-#ifndef UTF8_SAFE_SKIP
-#  define UTF8_SAFE_SKIP(s, e)           (                                          \
-                                      ((((e) - (s)) <= 0)                       \
-                                      ? 0                                       \
-                                      : _ppport_MIN(((e) - (s)), UTF8SKIP(s))))
-#endif
-
-#endif
-
-#if !defined(my_strnlen)
-#if defined(NEED_my_strnlen)
-static STRLEN DPPP_(my_my_strnlen)(const char *str, Size_t maxlen);
-static
-#else
-extern STRLEN DPPP_(my_my_strnlen)(const char *str, Size_t maxlen);
-#endif
-
-#if defined(NEED_my_strnlen) || defined(NEED_my_strnlen_GLOBAL)
-
-#define my_strnlen DPPP_(my_my_strnlen)
-#define Perl_my_strnlen DPPP_(my_my_strnlen)
-
-
-STRLEN
-DPPP_(my_my_strnlen)(const char *str, Size_t maxlen)
-{
-    const char *p = str;
-
-    while(maxlen-- && *p)
-        p++;
-
-    return p - str;
-}
-
-#endif
-#endif
-
-#if (PERL_BCDVERSION < 0x5031002)
-        /* Versions prior to this accepted things that are now considered
-         * malformations, and didn't return -1 on error with warnings enabled
-         * */
-#  undef utf8_to_uvchr_buf
-#endif
-
-/* This implementation brings modern, generally more restricted standards to
- * 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
- * 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. */
-
-#ifndef 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
-#    else
-#      define _ppport_utf8_to_uvchr_buf_callee utf8_to_uv
-#    endif
-
-#  endif
-
-#ifdef _ppport_utf8_to_uvchr_buf_callee
-#  if defined(NEED_utf8_to_uvchr_buf)
-static UV DPPP_(my_utf8_to_uvchr_buf)(pTHX_ const U8 * s, const U8 * send, STRLEN * retlen);
-static
-#else
-extern UV DPPP_(my_utf8_to_uvchr_buf)(pTHX_ const U8 * s, const U8 * send, STRLEN * retlen);
-#endif
-
-#if defined(NEED_utf8_to_uvchr_buf) || defined(NEED_utf8_to_uvchr_buf_GLOBAL)
-
-#ifdef utf8_to_uvchr_buf
-#  undef utf8_to_uvchr_buf
-#endif
-#define utf8_to_uvchr_buf(a,b,c) DPPP_(my_utf8_to_uvchr_buf)(aTHX_ a,b,c)
-#define Perl_utf8_to_uvchr_buf DPPP_(my_utf8_to_uvchr_buf)
-
-
-UV
-DPPP_(my_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 (send > s) {
-        curlen = send - s;
-    }
-    else {
-        assert(0);  /* Modern perls die under this circumstance */
-        curlen = 0;
-        if (! do_warnings) {    /* Handle empty here if no warnings needed */
-            if (retlen) *retlen = 0;
-            return UNICODE_REPLACEMENT;
-        }
-    }
-
-    /* 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 (PERL_BCDVERSION < 0x5026000)
-#      ifndef 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.  */
-
-    else if (curlen > 0 && *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 */
-        if (sizeof(ret) < 8) {
-            overflows = 1;
-        }
-        else {
-            const U8 highest[] =    /* 2*63-1 */
-                        "\xFF\x80\x87\xBF\xBF\xBF\xBF\xBF\xBF\xBF\xBF\xBF\xBF";
-            const U8 *cur_h = highest;
-
-            for (cur_s = s; cur_s < send; cur_s++, cur_h++) {
-                if (UNLIKELY(*cur_s == *cur_h)) {
-                    continue;
-                }
-
-                /* 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 */
-                overflows = *cur_s > *cur_h;
-                break;
-
-            }
-
-            /* 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. */
-        }
-    }
-
-#      endif
-#    endif  /* < 5.26 */
-
-    if (UNLIKELY(overflows)) {
-        if (! do_warnings) {
-            if (retlen) {
-                *retlen = _ppport_MIN(*retlen, UTF8SKIP(s));
-                *retlen = _ppport_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);
-            }
-            if (retlen) {
-                *retlen = (STRLEN) -1;
-            }
-            return 0;
-        }
-    }
-
-    /* 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') */
-    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' */
-        if (do_warnings) {
-            *retlen = (STRLEN) -1;
-        }
-        else {
-            ret = _ppport_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 (PERL_BCDVERSION < 0x5016000)
-
-            /* 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;
-                do {
-                    if (s[i] < 0x80 || s[i] > 0xBF) {
-                        *retlen = i;
-                        break;
-                    }
-                } while (++i < *retlen);
-            }
-
-#           endif
-
-        }
-    }
-
-    return ret;
-}
-
-#  endif
-#endif
-#endif
-
-#if defined(UTF8SKIP) && defined(utf8_to_uvchr_buf)
-#undef utf8_to_uvchr /* Always redefine this unsafe function so that it refuses
-                        to read past a NUL, making it much less likely to read
-                        off the end of the buffer.  A NUL indicates the start
-                        of the next character anyway.  If the input isn't
-                        NUL-terminated, the function remains unsafe, as it
-                        always has been. */
-#ifndef utf8_to_uvchr
-#  define utf8_to_uvchr(s, lp)           \
-    ((*(s) == '\0')                                                             \
-    ? utf8_to_uvchr_buf(s,((s)+1), lp) /* Handle single NUL specially */        \
-    : utf8_to_uvchr_buf(s, (s) + my_strnlen((char *) (s), UTF8SKIP(s)), (lp)))
-#endif
-
-#endif
-
-#ifdef HAS_MEMCMP
-#ifndef memNE
-#  define memNE(s1,s2,l)                 (memcmp(s1,s2,l))
-#endif
-
-#ifndef memEQ
-#  define memEQ(s1,s2,l)                 (!memcmp(s1,s2,l))
-#endif
-
-#else
-#ifndef memNE
-#  define memNE(s1,s2,l)                 (bcmp(s1,s2,l))
-#endif
-
-#ifndef memEQ
-#  define memEQ(s1,s2,l)                 (!bcmp(s1,s2,l))
-#endif
-
-#endif
-#ifndef memEQs
-#  define memEQs(s1, l, s2)              \
-                   (sizeof(s2)-1 == l && memEQ(s1, (s2 ""), (sizeof(s2)-1)))
-#endif
-
-#ifndef memNEs
-#  define memNEs(s1, l, s2)              !memEQs(s1, l, s2)
-#endif
-#ifndef MoveD
-#  define MoveD(s,d,n,t)                 memmove((char*)(d),(char*)(s), (n) * sizeof(t))
-#endif
-
-#ifndef CopyD
-#  define CopyD(s,d,n,t)                 memcpy((char*)(d),(char*)(s), (n) * sizeof(t))
-#endif
-
-#ifdef HAS_MEMSET
-#ifndef ZeroD
-#  define ZeroD(d,n,t)                   memzero((char*)(d), (n) * sizeof(t))
-#endif
-
-#else
-#ifndef ZeroD
-#  define ZeroD(d,n,t)                   ((void)memzero((char*)(d), (n) * sizeof(t)), d)
-#endif
-
-#endif
-#ifndef PoisonWith
-#  define PoisonWith(d,n,t,b)            (void)memset((char*)(d), (U8)(b), (n) * sizeof(t))
-#endif
-
-#ifndef PoisonNew
-#  define PoisonNew(d,n,t)               PoisonWith(d,n,t,0xAB)
-#endif
-
-#ifndef PoisonFree
-#  define PoisonFree(d,n,t)              PoisonWith(d,n,t,0xEF)
-#endif
-
-#ifndef Poison
-#  define Poison(d,n,t)                  PoisonFree(d,n,t)
-#endif
-#ifndef Newx
-#  define Newx(v,n,t)                    New(0,v,n,t)
-#endif
-
-#ifndef Newxc
-#  define Newxc(v,n,t,c)                 Newc(0,v,n,t,c)
-#endif
-
-#ifndef Newxz
-#  define Newxz(v,n,t)                   Newz(0,v,n,t)
-#endif
-#ifndef PERL_MAGIC_sv
-#  define PERL_MAGIC_sv                  '\0'
-#endif
-
-#ifndef PERL_MAGIC_overload
-#  define PERL_MAGIC_overload            'A'
-#endif
-
-#ifndef PERL_MAGIC_overload_elem
-#  define PERL_MAGIC_overload_elem       'a'
-#endif
-
-#ifndef PERL_MAGIC_overload_table
-#  define PERL_MAGIC_overload_table      'c'
-#endif
-
-#ifndef PERL_MAGIC_bm
-#  define PERL_MAGIC_bm                  'B'
-#endif
-
-#ifndef PERL_MAGIC_regdata
-#  define PERL_MAGIC_regdata             'D'
-#endif
-
-#ifndef PERL_MAGIC_regdatum
-#  define PERL_MAGIC_regdatum            'd'
-#endif
-
-#ifndef PERL_MAGIC_env
-#  define PERL_MAGIC_env                 'E'
-#endif
-
-#ifndef PERL_MAGIC_envelem
-#  define PERL_MAGIC_envelem             'e'
-#endif
-
-#ifndef PERL_MAGIC_fm
-#  define PERL_MAGIC_fm                  'f'
-#endif
-
-#ifndef PERL_MAGIC_regex_global
-#  define PERL_MAGIC_regex_global        'g'
-#endif
-
-#ifndef PERL_MAGIC_isa
-#  define PERL_MAGIC_isa                 'I'
-#endif
-
-#ifndef PERL_MAGIC_isaelem
-#  define PERL_MAGIC_isaelem             'i'
-#endif
-
-#ifndef PERL_MAGIC_nkeys
-#  define PERL_MAGIC_nkeys               'k'
-#endif
-
-#ifndef PERL_MAGIC_dbfile
-#  define PERL_MAGIC_dbfile              'L'
-#endif
-
-#ifndef PERL_MAGIC_dbline
-#  define PERL_MAGIC_dbline              'l'
-#endif
-
-#ifndef PERL_MAGIC_mutex
-#  define PERL_MAGIC_mutex               'm'
-#endif
-
-#ifndef PERL_MAGIC_shared
-#  define PERL_MAGIC_shared              'N'
-#endif
-
-#ifndef PERL_MAGIC_shared_scalar
-#  define PERL_MAGIC_shared_scalar       'n'
-#endif
-
-#ifndef PERL_MAGIC_collxfrm
-#  define PERL_MAGIC_collxfrm            'o'
-#endif
-
-#ifndef PERL_MAGIC_tied
-#  define PERL_MAGIC_tied                'P'
-#endif
-
-#ifndef PERL_MAGIC_tiedelem
-#  define PERL_MAGIC_tiedelem            'p'
-#endif
-
-#ifndef PERL_MAGIC_tiedscalar
-#  define PERL_MAGIC_tiedscalar          'q'
-#endif
-
-#ifndef PERL_MAGIC_qr
-#  define PERL_MAGIC_qr                  'r'
-#endif
-
-#ifndef PERL_MAGIC_sig
-#  define PERL_MAGIC_sig                 'S'
-#endif
-
-#ifndef PERL_MAGIC_sigelem
-#  define PERL_MAGIC_sigelem             's'
-#endif
-
-#ifndef PERL_MAGIC_taint
-#  define PERL_MAGIC_taint               't'
-#endif
-
-#ifndef PERL_MAGIC_uvar
-#  define PERL_MAGIC_uvar                'U'
-#endif
-
-#ifndef PERL_MAGIC_uvar_elem
-#  define PERL_MAGIC_uvar_elem           'u'
-#endif
-
-#ifndef PERL_MAGIC_vstring
-#  define PERL_MAGIC_vstring             'V'
-#endif
-
-#ifndef PERL_MAGIC_vec
-#  define PERL_MAGIC_vec                 'v'
-#endif
-
-#ifndef PERL_MAGIC_utf8
-#  define PERL_MAGIC_utf8                'w'
-#endif
-
-#ifndef PERL_MAGIC_substr
-#  define PERL_MAGIC_substr              'x'
-#endif
-
-#ifndef PERL_MAGIC_defelem
-#  define PERL_MAGIC_defelem             'y'
-#endif
-
-#ifndef PERL_MAGIC_glob
-#  define PERL_MAGIC_glob                '*'
-#endif
-
-#ifndef PERL_MAGIC_arylen
-#  define PERL_MAGIC_arylen              '#'
-#endif
-
-#ifndef PERL_MAGIC_pos
-#  define PERL_MAGIC_pos                 '.'
-#endif
-
-#ifndef PERL_MAGIC_backref
-#  define PERL_MAGIC_backref             '<'
-#endif
-
-#ifndef PERL_MAGIC_ext
-#  define PERL_MAGIC_ext                 '~'
-#endif
-
-#ifdef NEED_mess_sv
-#define NEED_mess
-#endif
-
-#ifdef NEED_mess
-#define NEED_mess_nocontext
-#define NEED_vmess
-#endif
-
-#ifndef croak_sv
-#if (PERL_BCDVERSION >= 0x5007003) || ( (PERL_BCDVERSION >= 0x5006001) && (PERL_BCDVERSION < 0x5007000) )
-#  if ( (PERL_BCDVERSION >= 0x5008000) && (PERL_BCDVERSION < 0x5008009) ) || ( (PERL_BCDVERSION >= 0x5009000) && (PERL_BCDVERSION < 0x5010001) )
-#    define D_PPP_FIX_UTF8_ERRSV(errsv, sv)                     \
-        STMT_START {                                            \
-            if (sv != 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
-#  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));       \
-        }                                     \
-    } STMT_END
-#elif (PERL_BCDVERSION >= 0x5004000)
-#  define croak_sv(sv) croak("%" SVf, SVfARG(sv))
-#else
-#  define croak_sv(sv) croak("%s", SvPV_nolen(sv))
-#endif
-#endif
-
-#ifndef die_sv
-#if defined(NEED_die_sv)
-static OP * DPPP_(my_die_sv)(pTHX_ SV *sv);
-static
-#else
-extern OP * DPPP_(my_die_sv)(pTHX_ SV *sv);
-#endif
-
-#if defined(NEED_die_sv) || defined(NEED_die_sv_GLOBAL)
-
-#ifdef die_sv
-#  undef die_sv
-#endif
-#define die_sv(a) DPPP_(my_die_sv)(aTHX_ a)
-#define Perl_die_sv DPPP_(my_die_sv)
-
-OP *
-DPPP_(my_die_sv)(pTHX_ SV *sv)
-{
-    croak_sv(sv);
-    return (OP *)NULL;
-}
-#endif
-#endif
-
-#ifndef warn_sv
-#if (PERL_BCDVERSION >= 0x5004000)
-#  define warn_sv(sv) warn("%" SVf, SVfARG(sv))
-#else
-#  define warn_sv(sv) warn("%s", SvPV_nolen(sv))
-#endif
-#endif
-
-#ifndef vmess
-#if defined(NEED_vmess)
-static SV * DPPP_(my_vmess)(pTHX_ const char * pat, va_list * args);
-static
-#else
-extern SV * DPPP_(my_vmess)(pTHX_ const char * pat, va_list * args);
-#endif
-
-#if defined(NEED_vmess) || defined(NEED_vmess_GLOBAL)
-
-#ifdef vmess
-#  undef vmess
-#endif
-#define vmess(a,b) DPPP_(my_vmess)(aTHX_ a,b)
-#define Perl_vmess DPPP_(my_vmess)
-
-SV*
-DPPP_(my_vmess)(pTHX_ const char* pat, va_list* args)
-{
-    mess(pat, args);
-    return PL_mess_sv;
-}
-#endif
-#endif
-
-#if (PERL_BCDVERSION < 0x5006000)
-#undef mess
-#endif
-
-#if !defined(mess_nocontext) && !defined(Perl_mess_nocontext)
-#if defined(NEED_mess_nocontext)
-static SV * DPPP_(my_mess_nocontext)(const char * pat, ...);
-static
-#else
-extern SV * DPPP_(my_mess_nocontext)(const char * pat, ...);
-#endif
-
-#if defined(NEED_mess_nocontext) || defined(NEED_mess_nocontext_GLOBAL)
-
-#define mess_nocontext DPPP_(my_mess_nocontext)
-#define Perl_mess_nocontext DPPP_(my_mess_nocontext)
-
-SV*
-DPPP_(my_mess_nocontext)(const char* pat, ...)
-{
-    dTHX;
-    SV *sv;
-    va_list args;
-    va_start(args, pat);
-    sv = vmess(pat, &args);
-    va_end(args);
-    return sv;
-}
-#endif
-#endif
-
-#ifndef mess
-#if defined(NEED_mess)
-static SV * DPPP_(my_mess)(pTHX_ const char * pat, ...);
-static
-#else
-extern SV * DPPP_(my_mess)(pTHX_ const char * pat, ...);
-#endif
-
-#if defined(NEED_mess) || defined(NEED_mess_GLOBAL)
-
-#define Perl_mess DPPP_(my_mess)
-
-SV*
-DPPP_(my_mess)(pTHX_ const char* pat, ...)
-{
-    SV *sv;
-    va_list args;
-    va_start(args, pat);
-    sv = vmess(pat, &args);
-    va_end(args);
-    return sv;
-}
-#ifdef mess_nocontext
-#define mess mess_nocontext
-#else
-#define mess Perl_mess_nocontext
-#endif
-#endif
-#endif
-
-#ifndef mess_sv
-#if defined(NEED_mess_sv)
-static SV * DPPP_(my_mess_sv)(pTHX_ SV * basemsg, bool consume);
-static
-#else
-extern SV * DPPP_(my_mess_sv)(pTHX_ SV * basemsg, bool consume);
-#endif
-
-#if defined(NEED_mess_sv) || defined(NEED_mess_sv_GLOBAL)
-
-#ifdef mess_sv
-#  undef mess_sv
-#endif
-#define mess_sv(a,b) DPPP_(my_mess_sv)(aTHX_ a,b)
-#define Perl_mess_sv DPPP_(my_mess_sv)
-
-SV *
-DPPP_(my_mess_sv)(pTHX_ SV *basemsg, bool consume)
-{
-    SV *tmp;
-    SV *ret;
-
-    if (SvPOK(basemsg) && SvCUR(basemsg) && *(SvEND(basemsg)-1) == '\n') {
-        if (consume)
-            return basemsg;
-        ret = mess("");
-        SvSetSV_nosteal(ret, basemsg);
-        return ret;
-    }
-
-    if (consume) {
-        sv_catsv(basemsg, mess(""));
-        return basemsg;
-    }
-
-    ret = mess("");
-    tmp = newSVsv(ret);
-    SvSetSV_nosteal(ret, basemsg);
-    sv_catsv(ret, tmp);
-    sv_dec(tmp);
-    return ret;
-}
-#endif
-#endif
-
-#ifndef warn_nocontext
-#define warn_nocontext warn
-#endif
-
-#ifndef croak_nocontext
-#define croak_nocontext croak
-#endif
-
-#ifndef croak_no_modify
-#define croak_no_modify() croak_nocontext("%s", PL_no_modify)
-#define Perl_croak_no_modify() croak_no_modify()
-#endif
-
-#ifndef croak_memory_wrap
-#if (PERL_BCDVERSION >= 0x5009002) || ( (PERL_BCDVERSION >= 0x5008006) && (PERL_BCDVERSION < 0x5009000) )
-#  define croak_memory_wrap() croak_nocontext("%s", PL_memory_wrap)
-#else
-#  define croak_memory_wrap() croak_nocontext("panic: memory wrap")
-#endif
-#endif
-
-#ifndef croak_xs_usage
-#if defined(NEED_croak_xs_usage)
-static void DPPP_(my_croak_xs_usage)(const CV * const cv, const char * const params);
-static
-#else
-extern void DPPP_(my_croak_xs_usage)(const CV * const cv, const char * const params);
-#endif
-
-#if defined(NEED_croak_xs_usage) || defined(NEED_croak_xs_usage_GLOBAL)
-
-#define croak_xs_usage DPPP_(my_croak_xs_usage)
-#define Perl_croak_xs_usage DPPP_(my_croak_xs_usage)
-
-
-#ifndef PERL_ARGS_ASSERT_CROAK_XS_USAGE
-#define PERL_ARGS_ASSERT_CROAK_XS_USAGE assert(cv); assert(params)
-#endif
-
-void
-DPPP_(my_croak_xs_usage)(const CV *const cv, const char *const params)
-{
-    dTHX;
-    const GV *const gv = CvGV(cv);
-
-    PERL_ARGS_ASSERT_CROAK_XS_USAGE;
-
-    if (gv) {
-        const char *const gvname = GvNAME(gv);
-        const HV *const stash = GvSTASH(gv);
-        const char *const hvname = stash ? HvNAME(stash) : NULL;
-
-        if (hvname)
-            croak("Usage: %s::%s(%s)", hvname, gvname, params);
-        else
-            croak("Usage: %s(%s)", gvname, params);
-    } else {
-        /* Pants. I don't think that it should be possible to get here. */
-        croak("Usage: CODE(0x%" UVxf ")(%s)", PTR2UV(cv), params);
-    }
-}
-#endif
-#endif
-
-#ifndef PERL_SIGNALS_UNSAFE_FLAG
-
-#define PERL_SIGNALS_UNSAFE_FLAG 0x0001
-
-#if (PERL_BCDVERSION < 0x5008000)
-#  define D_PPP_PERL_SIGNALS_INIT   PERL_SIGNALS_UNSAFE_FLAG
-#else
-#  define D_PPP_PERL_SIGNALS_INIT   0
-#endif
-
-#if defined(NEED_PL_signals)
-static U32 DPPP_(my_PL_signals) = D_PPP_PERL_SIGNALS_INIT;
-#elif defined(NEED_PL_signals_GLOBAL)
-U32 DPPP_(my_PL_signals) = D_PPP_PERL_SIGNALS_INIT;
-#else
-extern U32 DPPP_(my_PL_signals);
-#endif
-#define PL_signals DPPP_(my_PL_signals)
-
-#endif
-
-/* Hint: PL_ppaddr
- * Calling an op via PL_ppaddr requires passing a context argument
- * for threaded builds. Since the context argument is different for
- * 5.005 perls, you can use aTHXR (supplied by ppport.h), which will
- * automatically be defined as the correct argument.
- */
-
-#if (PERL_BCDVERSION <= 0x5005005)
-/* Replace: 1 */
-#  define PL_ppaddr                 ppaddr
-#  define PL_no_modify              no_modify
-/* Replace: 0 */
-#endif
-
-#if (PERL_BCDVERSION <= 0x5004005)
-/* Replace: 1 */
-#  define PL_DBsignal               DBsignal
-#  define PL_DBsingle               DBsingle
-#  define PL_DBsub                  DBsub
-#  define PL_DBtrace                DBtrace
-#  define PL_Sv                     Sv
-#  define PL_bufend                 bufend
-#  define PL_bufptr                 bufptr
-#  define PL_compiling              compiling
-#  define PL_copline                copline
-#  define PL_curcop                 curcop
-#  define PL_curstash               curstash
-#  define PL_debstash               debstash
-#  define PL_defgv                  defgv
-#  define PL_diehook                diehook
-#  define PL_dirty                  dirty
-#  define PL_dowarn                 dowarn
-#  define PL_errgv                  errgv
-#  define PL_error_count            error_count
-#  define PL_expect                 expect
-#  define PL_hexdigit               hexdigit
-#  define PL_hints                  hints
-#  define PL_in_my                  in_my
-#  define PL_laststatval            laststatval
-#  define PL_lex_state              lex_state
-#  define PL_lex_stuff              lex_stuff
-#  define PL_linestr                linestr
-#  define PL_na                     na
-#  define PL_perl_destruct_level    perl_destruct_level
-#  define PL_perldb                 perldb
-#  define PL_rsfp_filters           rsfp_filters
-#  define PL_rsfp                   rsfp
-#  define PL_stack_base             stack_base
-#  define PL_stack_sp               stack_sp
-#  define PL_statcache              statcache
-#  define PL_stdingv                stdingv
-#  define PL_sv_arenaroot           sv_arenaroot
-#  define PL_sv_no                  sv_no
-#  define PL_sv_undef               sv_undef
-#  define PL_sv_yes                 sv_yes
-#  define PL_tainted                tainted
-#  define PL_tainting               tainting
-#  define PL_tokenbuf               tokenbuf
-/* Replace: 0 */
-#endif
-
-/* Warning: PL_parser
- * For perl versions earlier than 5.9.5, this is an always
- * non-NULL dummy. Also, it cannot be dereferenced. Don't
- * use it if you can avoid is and unless you absolutely know
- * what you're doing.
- * If you always check that PL_parser is non-NULL, you can
- * define DPPP_PL_parser_NO_DUMMY to avoid the creation of
- * a dummy parser structure.
- */
-
-#if (PERL_BCDVERSION >= 0x5009005)
-# ifdef DPPP_PL_parser_NO_DUMMY
-#  define D_PPP_my_PL_parser_var(var) ((PL_parser ? PL_parser : \
-                (croak("panic: PL_parser == NULL in %s:%d", \
-                       __FILE__, __LINE__), (yy_parser *) NULL))->var)
-# else
-#  ifdef DPPP_PL_parser_NO_DUMMY_WARNING
-#   define D_PPP_parser_dummy_warning(var)
-#  else
-#   define D_PPP_parser_dummy_warning(var) \
-             warn("warning: dummy PL_" #var " used in %s:%d", __FILE__, __LINE__),
-#  endif
-#  define D_PPP_my_PL_parser_var(var) ((PL_parser ? PL_parser : \
-                (D_PPP_parser_dummy_warning(var) &DPPP_(dummy_PL_parser)))->var)
-#if defined(NEED_PL_parser)
-static yy_parser DPPP_(dummy_PL_parser);
-#elif defined(NEED_PL_parser_GLOBAL)
-yy_parser DPPP_(dummy_PL_parser);
-#else
-extern yy_parser DPPP_(dummy_PL_parser);
-#endif
-
-# endif
-
-/* PL_expect, PL_copline, PL_rsfp, PL_rsfp_filters, PL_linestr, PL_bufptr, PL_bufend, PL_lex_state, PL_lex_stuff, PL_tokenbuf depends on PL_parser */
-/* Warning: PL_expect, PL_copline, PL_rsfp, PL_rsfp_filters, PL_linestr, PL_bufptr, PL_bufend, PL_lex_state, PL_lex_stuff, PL_tokenbuf
- * Do not use this variable unless you know exactly what you're
- * doing. It is internal to the perl parser and may change or even
- * be removed in the future. As of perl 5.9.5, you have to check
- * for (PL_parser != NULL) for this variable to have any effect.
- * An always non-NULL PL_parser dummy is provided for earlier
- * perl versions.
- * If PL_parser is NULL when you try to access this variable, a
- * dummy is being accessed instead and a warning is issued unless
- * you define DPPP_PL_parser_NO_DUMMY_WARNING.
- * If DPPP_PL_parser_NO_DUMMY is defined, the code trying to access
- * this variable will croak with a panic message.
- */
-
-# define PL_expect         D_PPP_my_PL_parser_var(expect)
-# define PL_copline        D_PPP_my_PL_parser_var(copline)
-# define PL_rsfp           D_PPP_my_PL_parser_var(rsfp)
-# define PL_rsfp_filters   D_PPP_my_PL_parser_var(rsfp_filters)
-# define PL_linestr        D_PPP_my_PL_parser_var(linestr)
-# define PL_bufptr         D_PPP_my_PL_parser_var(bufptr)
-# define PL_bufend         D_PPP_my_PL_parser_var(bufend)
-# define PL_lex_state      D_PPP_my_PL_parser_var(lex_state)
-# define PL_lex_stuff      D_PPP_my_PL_parser_var(lex_stuff)
-# define PL_tokenbuf       D_PPP_my_PL_parser_var(tokenbuf)
-# define PL_in_my          D_PPP_my_PL_parser_var(in_my)
-# define PL_in_my_stash    D_PPP_my_PL_parser_var(in_my_stash)
-# define PL_error_count    D_PPP_my_PL_parser_var(error_count)
-
-
-#else
-
-/* ensure that PL_parser != NULL and cannot be dereferenced */
-# define PL_parser         ((void *) 1)
-
-#endif
-#ifndef mPUSHs
-#  define mPUSHs(s)                      PUSHs(sv_2mortal(s))
-#endif
-
-#ifndef PUSHmortal
-#  define PUSHmortal                     PUSHs(sv_newmortal())
-#endif
-
-#ifndef mPUSHp
-#  define mPUSHp(p,l)                    sv_setpvn(PUSHmortal, (p), (l))
-#endif
-
-#ifndef mPUSHn
-#  define mPUSHn(n)                      sv_setnv(PUSHmortal, (NV)(n))
-#endif
-
-#ifndef mPUSHi
-#  define mPUSHi(i)                      sv_setiv(PUSHmortal, (IV)(i))
-#endif
-
-#ifndef mPUSHu
-#  define mPUSHu(u)                      sv_setuv(PUSHmortal, (UV)(u))
-#endif
-#ifndef mXPUSHs
-#  define mXPUSHs(s)                     XPUSHs(sv_2mortal(s))
-#endif
-
-#ifndef XPUSHmortal
-#  define XPUSHmortal                    XPUSHs(sv_newmortal())
-#endif
-
-#ifndef mXPUSHp
-#  define mXPUSHp(p,l)                   STMT_START { EXTEND(sp,1); sv_setpvn(PUSHmortal, (p), (l)); } STMT_END
-#endif
-
-#ifndef mXPUSHn
-#  define mXPUSHn(n)                     STMT_START { EXTEND(sp,1); sv_setnv(PUSHmortal, (NV)(n)); } STMT_END
-#endif
-
-#ifndef mXPUSHi
-#  define mXPUSHi(i)                     STMT_START { EXTEND(sp,1); sv_setiv(PUSHmortal, (IV)(i)); } STMT_END
-#endif
-
-#ifndef mXPUSHu
-#  define mXPUSHu(u)                     STMT_START { EXTEND(sp,1); sv_setuv(PUSHmortal, (UV)(u)); } STMT_END
-#endif
-
-/* Replace: 1 */
-#ifndef call_sv
-#  define call_sv                        perl_call_sv
-#endif
-
-#ifndef call_pv
-#  define call_pv                        perl_call_pv
-#endif
-
-#ifndef call_argv
-#  define call_argv                      perl_call_argv
-#endif
-
-#ifndef call_method
-#  define call_method                    perl_call_method
-#endif
-#ifndef eval_sv
-#  define eval_sv                        perl_eval_sv
-#endif
-
-/* Replace: 0 */
-#ifndef PERL_LOADMOD_DENY
-#  define PERL_LOADMOD_DENY              0x1
-#endif
-
-#ifndef PERL_LOADMOD_NOIMPORT
-#  define PERL_LOADMOD_NOIMPORT          0x2
-#endif
-
-#ifndef PERL_LOADMOD_IMPORT_OPS
-#  define PERL_LOADMOD_IMPORT_OPS        0x4
-#endif
-
-#ifndef G_METHOD
-# define G_METHOD               64
-# ifdef call_sv
-#  undef call_sv
-# endif
-# if (PERL_BCDVERSION < 0x5006000)
-#  define call_sv(sv, flags)  ((flags) & G_METHOD ? perl_call_method((char *) SvPV_nolen_const(sv), \
-                                (flags) & ~G_METHOD) : perl_call_sv(sv, flags))
-# else
-#  define call_sv(sv, flags)  ((flags) & G_METHOD ? Perl_call_method(aTHX_ (char *) SvPV_nolen_const(sv), \
-                                (flags) & ~G_METHOD) : Perl_call_sv(aTHX_ sv, flags))
-# endif
-#endif
-
-/* Replace perl_eval_pv with eval_pv */
-
-#ifndef eval_pv
-#if defined(NEED_eval_pv)
-static SV* DPPP_(my_eval_pv)(char *p, I32 croak_on_error);
-static
-#else
-extern SV* DPPP_(my_eval_pv)(char *p, I32 croak_on_error);
-#endif
-
-#if defined(NEED_eval_pv) || defined(NEED_eval_pv_GLOBAL)
-
-#ifdef eval_pv
-#  undef eval_pv
-#endif
-#define eval_pv(a,b) DPPP_(my_eval_pv)(aTHX_ a,b)
-#define Perl_eval_pv DPPP_(my_eval_pv)
-
-
-SV*
-DPPP_(my_eval_pv)(char *p, I32 croak_on_error)
-{
-    dSP;
-    SV* sv = newSVpv(p, 0);
-
-    PUSHMARK(sp);
-    eval_sv(sv, G_SCALAR);
-    SvREFCNT_dec(sv);
-
-    SPAGAIN;
-    sv = POPs;
-    PUTBACK;
-
-    if (croak_on_error && SvTRUEx(ERRSV))
-        croak_sv(ERRSV);
-
-    return sv;
-}
-
-#endif
-#endif
-
-#ifndef vload_module
-#if defined(NEED_vload_module)
-static void DPPP_(my_vload_module)(U32 flags, SV *name, SV *ver, va_list *args);
-static
-#else
-extern void DPPP_(my_vload_module)(U32 flags, SV *name, SV *ver, va_list *args);
-#endif
-
-#if defined(NEED_vload_module) || defined(NEED_vload_module_GLOBAL)
-
-#ifdef vload_module
-#  undef vload_module
-#endif
-#define vload_module(a,b,c,d) DPPP_(my_vload_module)(aTHX_ a,b,c,d)
-#define Perl_vload_module DPPP_(my_vload_module)
-
-
-void
-DPPP_(my_vload_module)(U32 flags, SV *name, SV *ver, va_list *args)
-{
-    dTHR;
-    dVAR;
-    OP *veop, *imop;
-
-    OP * const modname = newSVOP(OP_CONST, 0, name);
-    /* 5.005 has a somewhat hacky force_normal that doesn't croak on
-       SvREADONLY() if PL_compling is true. Current perls take care in
-       ck_require() to correctly turn off SvREADONLY before calling
-       force_normal_flags(). This seems a better fix than fudging PL_compling
-     */
-    SvREADONLY_off(((SVOP*)modname)->op_sv);
-    modname->op_private |= OPpCONST_BARE;
-    if (ver) {
-        veop = newSVOP(OP_CONST, 0, ver);
-    }
-    else
-        veop = NULL;
-    if (flags & PERL_LOADMOD_NOIMPORT) {
-        imop = sawparens(newNULLLIST());
-    }
-    else if (flags & PERL_LOADMOD_IMPORT_OPS) {
-        imop = va_arg(*args, OP*);
-    }
-    else {
-        SV *sv;
-        imop = NULL;
-        sv = va_arg(*args, SV*);
-        while (sv) {
-            imop = append_elem(OP_LIST, imop, newSVOP(OP_CONST, 0, sv));
-            sv = va_arg(*args, SV*);
-        }
-    }
-    {
-        const line_t ocopline = PL_copline;
-        COP * const ocurcop = PL_curcop;
-        const int oexpect = PL_expect;
-
-#if (PERL_BCDVERSION >= 0x5004000)
-        utilize(!(flags & PERL_LOADMOD_DENY), start_subparse(FALSE, 0),
-                veop, modname, imop);
-#elif (PERL_BCDVERSION > 0x5003000)
-        utilize(!(flags & PERL_LOADMOD_DENY), start_subparse(),
-                veop, modname, imop);
-#else
-        utilize(!(flags & PERL_LOADMOD_DENY), start_subparse(),
-                modname, imop);
-#endif
-        PL_expect = oexpect;
-        PL_copline = ocopline;
-        PL_curcop = ocurcop;
-    }
-}
-
-#endif
-#endif
-
-#ifndef load_module
-#if defined(NEED_load_module)
-static void DPPP_(my_load_module)(U32 flags, SV *name, SV *ver, ...);
-static
-#else
-extern void DPPP_(my_load_module)(U32 flags, SV *name, SV *ver, ...);
-#endif
-
-#if defined(NEED_load_module) || defined(NEED_load_module_GLOBAL)
-
-#ifdef load_module
-#  undef load_module
-#endif
-#define load_module DPPP_(my_load_module)
-#define Perl_load_module DPPP_(my_load_module)
-
-
-void
-DPPP_(my_load_module)(U32 flags, SV *name, SV *ver, ...)
-{
-    va_list args;
-    va_start(args, ver);
-    vload_module(flags, name, ver, &args);
-    va_end(args);
-}
-
-#endif
-#endif
-#ifndef newRV_inc
-#  define newRV_inc(sv)                  newRV(sv)   /* Replace */
-#endif
-
-#ifndef newRV_noinc
-#if defined(NEED_newRV_noinc)
-static SV * DPPP_(my_newRV_noinc)(SV *sv);
-static
-#else
-extern SV * DPPP_(my_newRV_noinc)(SV *sv);
-#endif
-
-#if defined(NEED_newRV_noinc) || defined(NEED_newRV_noinc_GLOBAL)
-
-#ifdef newRV_noinc
-#  undef newRV_noinc
-#endif
-#define newRV_noinc(a) DPPP_(my_newRV_noinc)(aTHX_ a)
-#define Perl_newRV_noinc DPPP_(my_newRV_noinc)
-
-SV *
-DPPP_(my_newRV_noinc)(SV *sv)
-{
-  SV *rv = (SV *)newRV(sv);
-  SvREFCNT_dec(sv);
-  return rv;
-}
-#endif
-#endif
-
-/* Hint: newCONSTSUB
- * Returns a CV* as of perl-5.7.1. This return value is not supported
- * by Devel::PPPort.
- */
-
-/* newCONSTSUB from IO.xs is in the core starting with 5.004_63 */
-#if (PERL_BCDVERSION < 0x5004063) && (PERL_BCDVERSION != 0x5004005)
-#if defined(NEED_newCONSTSUB)
-static void DPPP_(my_newCONSTSUB)(HV *stash, const char *name, SV *sv);
-static
-#else
-extern void DPPP_(my_newCONSTSUB)(HV *stash, const char *name, SV *sv);
-#endif
-
-#if defined(NEED_newCONSTSUB) || defined(NEED_newCONSTSUB_GLOBAL)
-
-#ifdef newCONSTSUB
-#  undef newCONSTSUB
-#endif
-#define newCONSTSUB(a,b,c) DPPP_(my_newCONSTSUB)(aTHX_ a,b,c)
-#define Perl_newCONSTSUB DPPP_(my_newCONSTSUB)
-
-
-/* This is just a trick to avoid a dependency of newCONSTSUB on PL_parser */
-/* (There's no PL_parser in perl < 5.005, so this is completely safe)     */
-#define D_PPP_PL_copline PL_copline
-
-void
-DPPP_(my_newCONSTSUB)(HV *stash, const char *name, SV *sv)
-{
-        U32 oldhints = PL_hints;
-        HV *old_cop_stash = PL_curcop->cop_stash;
-        HV *old_curstash = PL_curstash;
-        line_t oldline = PL_curcop->cop_line;
-        PL_curcop->cop_line = D_PPP_PL_copline;
-
-        PL_hints &= ~HINT_BLOCK_SCOPE;
-        if (stash)
-                PL_curstash = PL_curcop->cop_stash = stash;
-
-        newSUB(
-
-#if   (PERL_BCDVERSION < 0x5003022)
-                start_subparse(),
-#elif (PERL_BCDVERSION == 0x5003022)
-                start_subparse(0),
-#else  /* 5.003_23  onwards */
-                start_subparse(FALSE, 0),
-#endif
-
-                newSVOP(OP_CONST, 0, newSVpv((char *) name, 0)),
-                newSVOP(OP_CONST, 0, &PL_sv_no),   /* SvPV(&PL_sv_no) == "" -- GMB */
-                newSTATEOP(0, Nullch, newSVOP(OP_CONST, 0, sv))
-        );
-
-        PL_hints = oldhints;
-        PL_curcop->cop_stash = old_cop_stash;
-        PL_curstash = old_curstash;
-        PL_curcop->cop_line = oldline;
-}
-#endif
-#endif
-
-/*
- * Boilerplate macros for initializing and accessing interpreter-local
- * data from C.  All statics in extensions should be reworked to use
- * this, if you want to make the extension thread-safe.  See ext/re/re.xs
- * for an example of the use of these macros.
- *
- * Code that uses these macros is responsible for the following:
- * 1. #define MY_CXT_KEY to a unique string, e.g. "DynaLoader_guts"
- * 2. Declare a typedef named my_cxt_t that is a structure that contains
- *    all the data that needs to be interpreter-local.
- * 3. Use the START_MY_CXT macro after the declaration of my_cxt_t.
- * 4. Use the MY_CXT_INIT macro such that it is called exactly once
- *    (typically put in the BOOT: section).
- * 5. Use the members of the my_cxt_t structure everywhere as
- *    MY_CXT.member.
- * 6. Use the dMY_CXT macro (a declaration) in all the functions that
- *    access MY_CXT.
- */
-
-#if defined(MULTIPLICITY) || defined(PERL_OBJECT) || \
-    defined(PERL_CAPI)    || defined(PERL_IMPLICIT_CONTEXT)
-
-#ifndef START_MY_CXT
-
-/* This must appear in all extensions that define a my_cxt_t structure,
- * right after the definition (i.e. at file scope).  The non-threads
- * case below uses it to declare the data as static. */
-#define START_MY_CXT
-
-#if (PERL_BCDVERSION < 0x5004068)
-/* Fetches the SV that keeps the per-interpreter data. */
-#define dMY_CXT_SV \
-        SV *my_cxt_sv = get_sv(MY_CXT_KEY, FALSE)
-#else /* >= perl5.004_68 */
-#define dMY_CXT_SV \
-        SV *my_cxt_sv = *hv_fetch(PL_modglobal, MY_CXT_KEY,             \
-                                  sizeof(MY_CXT_KEY)-1, TRUE)
-#endif /* < perl5.004_68 */
-
-/* This declaration should be used within all functions that use the
- * interpreter-local data. */
-#define dMY_CXT \
-        dMY_CXT_SV;                                                     \
-        my_cxt_t *my_cxtp = INT2PTR(my_cxt_t*,SvUV(my_cxt_sv))
-
-/* Creates and zeroes the per-interpreter data.
- * (We allocate my_cxtp in a Perl SV so that it will be released when
- * the interpreter goes away.) */
-#define MY_CXT_INIT \
-        dMY_CXT_SV;                                                     \
-        /* newSV() allocates one more than needed */                    \
-        my_cxt_t *my_cxtp = (my_cxt_t*)SvPVX(newSV(sizeof(my_cxt_t)-1));\
-        Zero(my_cxtp, 1, my_cxt_t);                                     \
-        sv_setuv(my_cxt_sv, PTR2UV(my_cxtp))
-
-/* This macro must be used to access members of the my_cxt_t structure.
- * e.g. MYCXT.some_data */
-#define MY_CXT          (*my_cxtp)
-
-/* Judicious use of these macros can reduce the number of times dMY_CXT
- * is used.  Use is similar to pTHX, aTHX etc. */
-#define pMY_CXT         my_cxt_t *my_cxtp
-#define pMY_CXT_        pMY_CXT,
-#define _pMY_CXT        ,pMY_CXT
-#define aMY_CXT         my_cxtp
-#define aMY_CXT_        aMY_CXT,
-#define _aMY_CXT        ,aMY_CXT
-
-#endif /* START_MY_CXT */
-
-#ifndef MY_CXT_CLONE
-/* Clones the per-interpreter data. */
-#define MY_CXT_CLONE \
-        dMY_CXT_SV;                                                     \
-        my_cxt_t *my_cxtp = (my_cxt_t*)SvPVX(newSV(sizeof(my_cxt_t)-1));\
-        Copy(INT2PTR(my_cxt_t*, SvUV(my_cxt_sv)), my_cxtp, 1, my_cxt_t);\
-        sv_setuv(my_cxt_sv, PTR2UV(my_cxtp))
-#endif
-
-#else /* single interpreter */
-
-#ifndef START_MY_CXT
-
-#define START_MY_CXT    static my_cxt_t my_cxt;
-#define dMY_CXT_SV      dNOOP
-#define dMY_CXT         dNOOP
-#define MY_CXT_INIT     NOOP
-#define MY_CXT          my_cxt
-
-#define pMY_CXT         void
-#define pMY_CXT_
-#define _pMY_CXT
-#define aMY_CXT
-#define aMY_CXT_
-#define _aMY_CXT
-
-#endif /* START_MY_CXT */
-
-#ifndef MY_CXT_CLONE
-#define MY_CXT_CLONE    NOOP
-#endif
-
-#endif
-
-#ifndef IVdf
-#  if IVSIZE == LONGSIZE
-#    define     IVdf      "ld"
-#    define     UVuf      "lu"
-#    define     UVof      "lo"
-#    define     UVxf      "lx"
-#    define     UVXf      "lX"
-#  elif IVSIZE == INTSIZE
-#    define   IVdf      "d"
-#    define   UVuf      "u"
-#    define   UVof      "o"
-#    define   UVxf      "x"
-#    define   UVXf      "X"
-#  else
-#    error "cannot define IV/UV formats"
-#  endif
-#endif
-
-#ifndef NVef
-#  if defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE) && \
-      defined(PERL_PRIfldbl) && (PERL_BCDVERSION != 0x5006000)
-            /* Not very likely, but let's try anyway. */
-#    define NVef          PERL_PRIeldbl
-#    define NVff          PERL_PRIfldbl
-#    define NVgf          PERL_PRIgldbl
-#  else
-#    define NVef          "e"
-#    define NVff          "f"
-#    define NVgf          "g"
-#  endif
-#endif
-
-#ifndef SvREFCNT_inc
-#  ifdef PERL_USE_GCC_BRACE_GROUPS
-#    define SvREFCNT_inc(sv)            \
-      ({                                \
-          SV * const _sv = (SV*)(sv);   \
-          if (_sv)                      \
-               (SvREFCNT(_sv))++;       \
-          _sv;                          \
-      })
-#  else
-#    define SvREFCNT_inc(sv)    \
-          ((PL_Sv=(SV*)(sv)) ? (++(SvREFCNT(PL_Sv)),PL_Sv) : NULL)
-#  endif
-#endif
-
-#ifndef SvREFCNT_inc_simple
-#  ifdef PERL_USE_GCC_BRACE_GROUPS
-#    define SvREFCNT_inc_simple(sv)     \
-      ({                                        \
-          if (sv)                               \
-               (SvREFCNT(sv))++;                \
-          (SV *)(sv);                           \
-      })
-#  else
-#    define SvREFCNT_inc_simple(sv) \
-          ((sv) ? (SvREFCNT(sv)++,(SV*)(sv)) : NULL)
-#  endif
-#endif
-
-#ifndef SvREFCNT_inc_NN
-#  ifdef PERL_USE_GCC_BRACE_GROUPS
-#    define SvREFCNT_inc_NN(sv)         \
-      ({                                        \
-          SV * const _sv = (SV*)(sv);   \
-          SvREFCNT(_sv)++;              \
-          _sv;                          \
-      })
-#  else
-#    define SvREFCNT_inc_NN(sv) \
-          (PL_Sv=(SV*)(sv),++(SvREFCNT(PL_Sv)),PL_Sv)
-#  endif
-#endif
-
-#ifndef SvREFCNT_inc_void
-#  ifdef PERL_USE_GCC_BRACE_GROUPS
-#    define SvREFCNT_inc_void(sv)               \
-      ({                                        \
-          SV * const _sv = (SV*)(sv);   \
-          if (_sv)                      \
-              (void)(SvREFCNT(_sv)++);  \
-      })
-#  else
-#    define SvREFCNT_inc_void(sv) \
-          (void)((PL_Sv=(SV*)(sv)) ? ++(SvREFCNT(PL_Sv)) : 0)
-#  endif
-#endif
-#ifndef SvREFCNT_inc_simple_void
-#  define SvREFCNT_inc_simple_void(sv)   STMT_START { if (sv) SvREFCNT(sv)++; } STMT_END
-#endif
-
-#ifndef SvREFCNT_inc_simple_NN
-#  define SvREFCNT_inc_simple_NN(sv)     (++SvREFCNT(sv), (SV*)(sv))
-#endif
-
-#ifndef SvREFCNT_inc_void_NN
-#  define SvREFCNT_inc_void_NN(sv)       (void)(++SvREFCNT((SV*)(sv)))
-#endif
-
-#ifndef SvREFCNT_inc_simple_void_NN
-#  define SvREFCNT_inc_simple_void_NN(sv) (void)(++SvREFCNT((SV*)(sv)))
-#endif
-
-#ifndef newSV_type
-
-#if defined(NEED_newSV_type)
-static SV* DPPP_(my_newSV_type)(pTHX_ svtype const t);
-static
-#else
-extern SV* DPPP_(my_newSV_type)(pTHX_ svtype const t);
-#endif
-
-#if defined(NEED_newSV_type) || defined(NEED_newSV_type_GLOBAL)
-
-#ifdef newSV_type
-#  undef newSV_type
-#endif
-#define newSV_type(a) DPPP_(my_newSV_type)(aTHX_ a)
-#define Perl_newSV_type DPPP_(my_newSV_type)
-
-
-SV*
-DPPP_(my_newSV_type)(pTHX_ svtype const t)
-{
-  SV* const sv = newSV(0);
-  sv_upgrade(sv, t);
-  return sv;
-}
-
-#endif
-
-#endif
-
-#if (PERL_BCDVERSION < 0x5006000)
-# define D_PPP_CONSTPV_ARG(x)  ((char *) (x))
-#else
-# define D_PPP_CONSTPV_ARG(x)  (x)
-#endif
-#ifndef newSVpvn
-#  define newSVpvn(data,len)             ((data)                                              \
-                                    ? ((len) ? newSVpv((data), (len)) : newSVpv("", 0)) \
-                                    : newSV(0))
-#endif
-#ifndef newSVpvn_utf8
-#  define newSVpvn_utf8(s, len, u)       newSVpvn_flags((s), (len), (u) ? SVf_UTF8 : 0)
-#endif
-#ifndef SVf_UTF8
-#  define SVf_UTF8                       0
-#endif
-
-#ifndef newSVpvn_flags
-
-#if defined(NEED_newSVpvn_flags)
-static SV * DPPP_(my_newSVpvn_flags)(pTHX_ const char *s, STRLEN len, U32 flags);
-static
-#else
-extern SV * DPPP_(my_newSVpvn_flags)(pTHX_ const char *s, STRLEN len, U32 flags);
-#endif
-
-#if defined(NEED_newSVpvn_flags) || defined(NEED_newSVpvn_flags_GLOBAL)
-
-#ifdef newSVpvn_flags
-#  undef newSVpvn_flags
-#endif
-#define newSVpvn_flags(a,b,c) DPPP_(my_newSVpvn_flags)(aTHX_ a,b,c)
-#define Perl_newSVpvn_flags DPPP_(my_newSVpvn_flags)
-
-
-SV *
-DPPP_(my_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;
-}
-
-#endif
-
-#endif
-
-/* 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().
- */
-#ifndef sv_2pv_nolen
-#  define sv_2pv_nolen(sv)               SvPV_nolen(sv)
-#endif
-
-#ifdef SvPVbyte
-
-/* Hint: SvPVbyte
- * Does not work in perl-5.6.1, ppport.h implements a version
- * borrowed from perl-5.7.3.
- */
-
-#if (PERL_BCDVERSION < 0x5007000)
-
-#if defined(NEED_sv_2pvbyte)
-static char * DPPP_(my_sv_2pvbyte)(pTHX_ SV *sv, STRLEN *lp);
-static
-#else
-extern char * DPPP_(my_sv_2pvbyte)(pTHX_ SV *sv, STRLEN *lp);
-#endif
-
-#if defined(NEED_sv_2pvbyte) || defined(NEED_sv_2pvbyte_GLOBAL)
-
-#ifdef sv_2pvbyte
-#  undef sv_2pvbyte
-#endif
-#define sv_2pvbyte(a,b) DPPP_(my_sv_2pvbyte)(aTHX_ a,b)
-#define Perl_sv_2pvbyte DPPP_(my_sv_2pvbyte)
-
-
-char *
-DPPP_(my_sv_2pvbyte)(pTHX_ SV *sv, STRLEN *lp)
-{
-  sv_utf8_downgrade(sv,0);
-  return SvPV(sv,*lp);
-}
-
-#endif
-
-/* Hint: sv_2pvbyte
- * Use the SvPVbyte() macro instead of sv_2pvbyte().
- */
-
-#undef SvPVbyte
-
-#define SvPVbyte(sv, lp)                                                \
-        ((SvFLAGS(sv) & (SVf_POK|SVf_UTF8)) == (SVf_POK)                \
-         ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_2pvbyte(sv, &lp))
-
-#endif
-
-#else
-
-#  define SvPVbyte          SvPV
-#  define sv_2pvbyte        sv_2pv
-
-#endif
-#ifndef sv_2pvbyte_nolen
-#  define sv_2pvbyte_nolen(sv)           sv_2pv_nolen(sv)
-#endif
-
-/* Hint: sv_pvn
- * Always use the SvPV() macro instead of sv_pvn().
- */
-
-/* Hint: sv_pvn_force
- * Always use the SvPV_force() macro instead of sv_pvn_force().
- */
-
-/* If these are undefined, they're not handled by the core anyway */
-#ifndef SV_IMMEDIATE_UNREF
-#  define SV_IMMEDIATE_UNREF             0
-#endif
-
-#ifndef SV_GMAGIC
-#  define SV_GMAGIC                      0
-#endif
-
-#ifndef SV_COW_DROP_PV
-#  define SV_COW_DROP_PV                 0
-#endif
-
-#ifndef SV_UTF8_NO_ENCODING
-#  define SV_UTF8_NO_ENCODING            0
-#endif
-
-#ifndef SV_NOSTEAL
-#  define SV_NOSTEAL                     0
-#endif
-
-#ifndef SV_CONST_RETURN
-#  define SV_CONST_RETURN                0
-#endif
-
-#ifndef SV_MUTABLE_RETURN
-#  define SV_MUTABLE_RETURN              0
-#endif
-
-#ifndef SV_SMAGIC
-#  define SV_SMAGIC                      0
-#endif
-
-#ifndef SV_HAS_TRAILING_NUL
-#  define SV_HAS_TRAILING_NUL            0
-#endif
-
-#ifndef SV_COW_SHARED_HASH_KEYS
-#  define SV_COW_SHARED_HASH_KEYS        0
-#endif
-
-#if (PERL_BCDVERSION < 0x5007002)
-
-#if defined(NEED_sv_2pv_flags)
-static char * DPPP_(my_sv_2pv_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags);
-static
-#else
-extern char * DPPP_(my_sv_2pv_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags);
-#endif
-
-#if defined(NEED_sv_2pv_flags) || defined(NEED_sv_2pv_flags_GLOBAL)
-
-#ifdef sv_2pv_flags
-#  undef sv_2pv_flags
-#endif
-#define sv_2pv_flags(a,b,c) DPPP_(my_sv_2pv_flags)(aTHX_ a,b,c)
-#define Perl_sv_2pv_flags DPPP_(my_sv_2pv_flags)
-
-
-char *
-DPPP_(my_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 defined(NEED_sv_pvn_force_flags)
-static char * DPPP_(my_sv_pvn_force_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags);
-static
-#else
-extern char * DPPP_(my_sv_pvn_force_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags);
-#endif
-
-#if defined(NEED_sv_pvn_force_flags) || defined(NEED_sv_pvn_force_flags_GLOBAL)
-
-#ifdef sv_pvn_force_flags
-#  undef sv_pvn_force_flags
-#endif
-#define sv_pvn_force_flags(a,b,c) DPPP_(my_sv_pvn_force_flags)(aTHX_ a,b,c)
-#define Perl_sv_pvn_force_flags DPPP_(my_sv_pvn_force_flags)
-
-
-char *
-DPPP_(my_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
-
-#endif
-
-#if (PERL_BCDVERSION < 0x5008008) || ( (PERL_BCDVERSION >= 0x5009000) && (PERL_BCDVERSION < 0x5009003) )
-# define D_PPP_SVPV_NOLEN_LP_ARG &PL_na
-#else
-# define D_PPP_SVPV_NOLEN_LP_ARG 0
-#endif
-#ifndef SvPV_const
-#  define SvPV_const(sv, lp)             SvPV_flags_const(sv, lp, SV_GMAGIC)
-#endif
-
-#ifndef SvPV_mutable
-#  define SvPV_mutable(sv, lp)           SvPV_flags_mutable(sv, lp, SV_GMAGIC)
-#endif
-#ifndef SvPV_flags
-#  define SvPV_flags(sv, lp, flags)      \
-                 ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
-                  ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_2pv_flags(sv, &lp, flags))
-#endif
-#ifndef SvPV_flags_const
-#  define SvPV_flags_const(sv, lp, flags) \
-                 ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
-                  ? ((lp = SvCUR(sv)), SvPVX_const(sv)) : \
-                  (const char*) sv_2pv_flags(sv, &lp, flags|SV_CONST_RETURN))
-#endif
-#ifndef SvPV_flags_const_nolen
-#  define SvPV_flags_const_nolen(sv, flags) \
-                 ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
-                  ? SvPVX_const(sv) : \
-                  (const char*) sv_2pv_flags(sv, D_PPP_SVPV_NOLEN_LP_ARG, flags|SV_CONST_RETURN))
-#endif
-#ifndef SvPV_flags_mutable
-#  define SvPV_flags_mutable(sv, lp, flags) \
-                 ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
-                  ? ((lp = SvCUR(sv)), SvPVX_mutable(sv)) : \
-                  sv_2pv_flags(sv, &lp, flags|SV_MUTABLE_RETURN))
-#endif
-#ifndef SvPV_force
-#  define SvPV_force(sv, lp)             SvPV_force_flags(sv, lp, SV_GMAGIC)
-#endif
-
-#ifndef SvPV_force_nolen
-#  define SvPV_force_nolen(sv)           SvPV_force_flags_nolen(sv, SV_GMAGIC)
-#endif
-
-#ifndef SvPV_force_mutable
-#  define SvPV_force_mutable(sv, lp)     SvPV_force_flags_mutable(sv, lp, SV_GMAGIC)
-#endif
-
-#ifndef SvPV_force_nomg
-#  define SvPV_force_nomg(sv, lp)        SvPV_force_flags(sv, lp, 0)
-#endif
-
-#ifndef SvPV_force_nomg_nolen
-#  define SvPV_force_nomg_nolen(sv)      SvPV_force_flags_nolen(sv, 0)
-#endif
-#ifndef SvPV_force_flags
-#  define SvPV_force_flags(sv, lp, flags) \
-                 ((SvFLAGS(sv) & (SVf_POK|SVf_THINKFIRST)) == SVf_POK \
-                 ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_pvn_force_flags(sv, &lp, flags))
-#endif
-#ifndef SvPV_force_flags_nolen
-#  define SvPV_force_flags_nolen(sv, flags) \
-                 ((SvFLAGS(sv) & (SVf_POK|SVf_THINKFIRST)) == SVf_POK \
-                 ? SvPVX(sv) : sv_pvn_force_flags(sv, D_PPP_SVPV_NOLEN_LP_ARG, flags))
-#endif
-#ifndef SvPV_force_flags_mutable
-#  define SvPV_force_flags_mutable(sv, lp, flags) \
-                 ((SvFLAGS(sv) & (SVf_POK|SVf_THINKFIRST)) == SVf_POK \
-                 ? ((lp = SvCUR(sv)), SvPVX_mutable(sv)) \
-                  : sv_pvn_force_flags(sv, &lp, flags|SV_MUTABLE_RETURN))
-#endif
-#ifndef SvPV_nolen
-#  define SvPV_nolen(sv)                 \
-                 ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
-                  ? SvPVX(sv) : sv_2pv_flags(sv, D_PPP_SVPV_NOLEN_LP_ARG, SV_GMAGIC))
-#endif
-#ifndef SvPV_nolen_const
-#  define SvPV_nolen_const(sv)           \
-                 ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
-                  ? SvPVX_const(sv) : sv_2pv_flags(sv, D_PPP_SVPV_NOLEN_LP_ARG, SV_GMAGIC|SV_CONST_RETURN))
-#endif
-#ifndef SvPV_nomg
-#  define SvPV_nomg(sv, lp)              SvPV_flags(sv, lp, 0)
-#endif
-
-#ifndef SvPV_nomg_const
-#  define SvPV_nomg_const(sv, lp)        SvPV_flags_const(sv, lp, 0)
-#endif
-
-#ifndef SvPV_nomg_const_nolen
-#  define SvPV_nomg_const_nolen(sv)      SvPV_flags_const_nolen(sv, 0)
-#endif
-
-#ifndef SvPV_nomg_nolen
-#  define SvPV_nomg_nolen(sv)            ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
-                                    ? SvPVX(sv) : sv_2pv_flags(sv, D_PPP_SVPV_NOLEN_LP_ARG, 0))
-#endif
-#ifndef SvPV_renew
-#  define SvPV_renew(sv,n)               STMT_START { SvLEN_set(sv, n); \
-                 SvPV_set((sv), (char *) saferealloc(          \
-                       (Malloc_t)SvPVX(sv), (MEM_SIZE)((n)))); \
-               } STMT_END
-#endif
-#ifndef SvMAGIC_set
-#  define SvMAGIC_set(sv, val)           \
-                STMT_START { assert(SvTYPE(sv) >= SVt_PVMG); \
-                (((XPVMG*) SvANY(sv))->xmg_magic = (val)); } STMT_END
-#endif
-
-#if (PERL_BCDVERSION < 0x5009003)
-#ifndef SvPVX_const
-#  define SvPVX_const(sv)                ((const char*) (0 + SvPVX(sv)))
-#endif
-
-#ifndef SvPVX_mutable
-#  define SvPVX_mutable(sv)              (0 + SvPVX(sv))
-#endif
-#ifndef SvRV_set
-#  define SvRV_set(sv, val)              \
-                STMT_START { assert(SvTYPE(sv) >=  SVt_RV); \
-                (((XRV*) SvANY(sv))->xrv_rv = (val)); } STMT_END
-#endif
-
-#else
-#ifndef SvPVX_const
-#  define SvPVX_const(sv)                ((const char*)((sv)->sv_u.svu_pv))
-#endif
-
-#ifndef SvPVX_mutable
-#  define SvPVX_mutable(sv)              ((sv)->sv_u.svu_pv)
-#endif
-#ifndef SvRV_set
-#  define SvRV_set(sv, val)              \
-                STMT_START { assert(SvTYPE(sv) >=  SVt_RV); \
-                ((sv)->sv_u.svu_rv = (val)); } STMT_END
-#endif
-
-#endif
-#ifndef SvSTASH_set
-#  define SvSTASH_set(sv, val)           \
-                STMT_START { assert(SvTYPE(sv) >= SVt_PVMG); \
-                (((XPVMG*) SvANY(sv))->xmg_stash = (val)); } STMT_END
-#endif
-
-#if (PERL_BCDVERSION < 0x5004000)
-#ifndef SvUV_set
-#  define SvUV_set(sv, val)              \
-                STMT_START { assert(SvTYPE(sv) == SVt_IV || SvTYPE(sv) >= SVt_PVIV); \
-                (((XPVIV*) SvANY(sv))->xiv_iv = (IV) (val)); } STMT_END
-#endif
-
-#else
-#ifndef SvUV_set
-#  define SvUV_set(sv, val)              \
-                STMT_START { assert(SvTYPE(sv) == SVt_IV || SvTYPE(sv) >= SVt_PVIV); \
-                (((XPVUV*) SvANY(sv))->xuv_uv = (val)); } STMT_END
-#endif
-
-#endif
-
-#if (PERL_BCDVERSION >= 0x5004000) && !defined(vnewSVpvf)
-#if defined(NEED_vnewSVpvf)
-static SV * DPPP_(my_vnewSVpvf)(pTHX_ const char *pat, va_list *args);
-static
-#else
-extern SV * DPPP_(my_vnewSVpvf)(pTHX_ const char *pat, va_list *args);
-#endif
-
-#if defined(NEED_vnewSVpvf) || defined(NEED_vnewSVpvf_GLOBAL)
-
-#ifdef vnewSVpvf
-#  undef vnewSVpvf
-#endif
-#define vnewSVpvf(a,b) DPPP_(my_vnewSVpvf)(aTHX_ a,b)
-#define Perl_vnewSVpvf DPPP_(my_vnewSVpvf)
-
-
-SV *
-DPPP_(my_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;
-}
-
-#endif
-#endif
-
-#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_vcatpvf)
-#  define sv_vcatpvf(sv, pat, args)  sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*))
-#endif
-
-#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_vsetpvf)
-#  define sv_vsetpvf(sv, pat, args)  sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*))
-#endif
-
-#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_catpvf_mg)
-#if defined(NEED_sv_catpvf_mg)
-static void DPPP_(my_sv_catpvf_mg)(pTHX_ SV *sv, const char *pat, ...);
-static
-#else
-extern void DPPP_(my_sv_catpvf_mg)(pTHX_ SV *sv, const char *pat, ...);
-#endif
-
-#if defined(NEED_sv_catpvf_mg) || defined(NEED_sv_catpvf_mg_GLOBAL)
-
-#define Perl_sv_catpvf_mg DPPP_(my_sv_catpvf_mg)
-
-
-void
-DPPP_(my_sv_catpvf_mg)(pTHX_ SV *sv, const char *pat, ...)
-{
-  va_list args;
-  va_start(args, pat);
-  sv_vcatpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
-  SvSETMAGIC(sv);
-  va_end(args);
-}
-
-#endif
-#endif
-
-#ifdef PERL_IMPLICIT_CONTEXT
-#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_catpvf_mg_nocontext)
-#if defined(NEED_sv_catpvf_mg_nocontext)
-static void DPPP_(my_sv_catpvf_mg_nocontext)(SV *sv, const char *pat, ...);
-static
-#else
-extern void DPPP_(my_sv_catpvf_mg_nocontext)(SV *sv, const char *pat, ...);
-#endif
-
-#if defined(NEED_sv_catpvf_mg_nocontext) || defined(NEED_sv_catpvf_mg_nocontext_GLOBAL)
-
-#define sv_catpvf_mg_nocontext DPPP_(my_sv_catpvf_mg_nocontext)
-#define Perl_sv_catpvf_mg_nocontext DPPP_(my_sv_catpvf_mg_nocontext)
-
-
-void
-DPPP_(my_sv_catpvf_mg_nocontext)(SV *sv, const char *pat, ...)
-{
-  dTHX;
-  va_list args;
-  va_start(args, pat);
-  sv_vcatpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
-  SvSETMAGIC(sv);
-  va_end(args);
-}
-
-#endif
-#endif
-#endif
-
-/* sv_catpvf_mg depends on sv_catpvf_mg_nocontext */
-#ifndef sv_catpvf_mg
-#  ifdef PERL_IMPLICIT_CONTEXT
-#    define sv_catpvf_mg   Perl_sv_catpvf_mg_nocontext
-#  else
-#    define sv_catpvf_mg   Perl_sv_catpvf_mg
-#  endif
-#endif
-
-#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_vcatpvf_mg)
-#  define sv_vcatpvf_mg(sv, pat, args)                                     \
-   STMT_START {                                                            \
-     sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));  \
-     SvSETMAGIC(sv);                                                       \
-   } STMT_END
-#endif
-
-#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_setpvf_mg)
-#if defined(NEED_sv_setpvf_mg)
-static void DPPP_(my_sv_setpvf_mg)(pTHX_ SV *sv, const char *pat, ...);
-static
-#else
-extern void DPPP_(my_sv_setpvf_mg)(pTHX_ SV *sv, const char *pat, ...);
-#endif
-
-#if defined(NEED_sv_setpvf_mg) || defined(NEED_sv_setpvf_mg_GLOBAL)
-
-#define Perl_sv_setpvf_mg DPPP_(my_sv_setpvf_mg)
-
-
-void
-DPPP_(my_sv_setpvf_mg)(pTHX_ SV *sv, const char *pat, ...)
-{
-  va_list args;
-  va_start(args, pat);
-  sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
-  SvSETMAGIC(sv);
-  va_end(args);
-}
-
-#endif
-#endif
-
-#ifdef PERL_IMPLICIT_CONTEXT
-#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_setpvf_mg_nocontext)
-#if defined(NEED_sv_setpvf_mg_nocontext)
-static void DPPP_(my_sv_setpvf_mg_nocontext)(SV *sv, const char *pat, ...);
-static
-#else
-extern void DPPP_(my_sv_setpvf_mg_nocontext)(SV *sv, const char *pat, ...);
-#endif
-
-#if defined(NEED_sv_setpvf_mg_nocontext) || defined(NEED_sv_setpvf_mg_nocontext_GLOBAL)
-
-#define sv_setpvf_mg_nocontext DPPP_(my_sv_setpvf_mg_nocontext)
-#define Perl_sv_setpvf_mg_nocontext DPPP_(my_sv_setpvf_mg_nocontext)
-
-
-void
-DPPP_(my_sv_setpvf_mg_nocontext)(SV *sv, const char *pat, ...)
-{
-  dTHX;
-  va_list args;
-  va_start(args, pat);
-  sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
-  SvSETMAGIC(sv);
-  va_end(args);
-}
-
-#endif
-#endif
-#endif
-
-/* sv_setpvf_mg depends on sv_setpvf_mg_nocontext */
-#ifndef sv_setpvf_mg
-#  ifdef PERL_IMPLICIT_CONTEXT
-#    define sv_setpvf_mg   Perl_sv_setpvf_mg_nocontext
-#  else
-#    define sv_setpvf_mg   Perl_sv_setpvf_mg
-#  endif
-#endif
-
-#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_vsetpvf_mg)
-#  define sv_vsetpvf_mg(sv, pat, args)                                     \
-   STMT_START {                                                            \
-     sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));  \
-     SvSETMAGIC(sv);                                                       \
-   } STMT_END
-#endif
-
-/* Hint: newSVpvn_share
- * The SVs created by this function only mimic the behaviour of
- * shared PVs without really being shared. Only use if you know
- * what you're doing.
- */
-
-#ifndef newSVpvn_share
-
-#if defined(NEED_newSVpvn_share)
-static SV * DPPP_(my_newSVpvn_share)(pTHX_ const char *src, I32 len, U32 hash);
-static
-#else
-extern SV * DPPP_(my_newSVpvn_share)(pTHX_ const char *src, I32 len, U32 hash);
-#endif
-
-#if defined(NEED_newSVpvn_share) || defined(NEED_newSVpvn_share_GLOBAL)
-
-#ifdef newSVpvn_share
-#  undef newSVpvn_share
-#endif
-#define newSVpvn_share(a,b,c) DPPP_(my_newSVpvn_share)(aTHX_ a,b,c)
-#define Perl_newSVpvn_share DPPP_(my_newSVpvn_share)
-
-
-SV *
-DPPP_(my_newSVpvn_share)(pTHX_ const char *src, I32 len, U32 hash)
-{
-  SV *sv;
-  if (len < 0)
-    len = -len;
-  if (!hash)
-    PERL_HASH(hash, (char*) src, len);
-  sv = newSVpvn((char *) src, len);
-  sv_upgrade(sv, SVt_PVIV);
-  SvIVX(sv) = hash;
-  SvREADONLY_on(sv);
-  SvPOK_on(sv);
-  return sv;
-}
-
-#endif
-
-#endif
-#ifndef SvSHARED_HASH
-#  define SvSHARED_HASH(sv)              (0 + SvUVX(sv))
-#endif
-#ifndef HvNAME_get
-#  define HvNAME_get(hv)                 HvNAME(hv)
-#endif
-#ifndef HvNAMELEN_get
-#  define HvNAMELEN_get(hv)              (HvNAME_get(hv) ? (I32)strlen(HvNAME_get(hv)) : 0)
-#endif
-
-#ifndef gv_fetchpvn_flags
-#if defined(NEED_gv_fetchpvn_flags)
-static GV* DPPP_(my_gv_fetchpvn_flags)(pTHX_ const char* name, STRLEN len, int flags, int types);
-static
-#else
-extern GV* DPPP_(my_gv_fetchpvn_flags)(pTHX_ const char* name, STRLEN len, int flags, int types);
-#endif
-
-#if defined(NEED_gv_fetchpvn_flags) || defined(NEED_gv_fetchpvn_flags_GLOBAL)
-
-#ifdef gv_fetchpvn_flags
-#  undef gv_fetchpvn_flags
-#endif
-#define gv_fetchpvn_flags(a,b,c,d) DPPP_(my_gv_fetchpvn_flags)(aTHX_ a,b,c,d)
-#define Perl_gv_fetchpvn_flags DPPP_(my_gv_fetchpvn_flags)
-
-
-GV*
-DPPP_(my_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
-#endif
-#ifndef GvSVn
-#  define GvSVn(gv)                      GvSV(gv)
-#endif
-
-#ifndef isGV_with_GP
-#  define isGV_with_GP(gv)               isGV(gv)
-#endif
-
-#ifndef gv_fetchsv
-#  define gv_fetchsv(name, flags, svt)   gv_fetchpv(SvPV_nolen_const(name), flags, svt)
-#endif
-#ifndef get_cvn_flags
-#  define get_cvn_flags(name, namelen, flags) get_cv(name, flags)
-#endif
-
-#ifndef gv_init_pvn
-#  define gv_init_pvn(gv, stash, ptr, len, flags) gv_init(gv, stash, ptr, len, flags & GV_ADDMULTI ? TRUE : FALSE)
-#endif
-
-/* concatenating with "" ensures that only literal strings are accepted as argument
- * note that STR_WITH_LEN() can't be used as argument to macros or functions that
- * under some configurations might be macros
- */
-#ifndef STR_WITH_LEN
-#  define STR_WITH_LEN(s)                (s ""), (sizeof(s)-1)
-#endif
-#ifndef newSVpvs
-#  define newSVpvs(str)                  newSVpvn(str "", sizeof(str) - 1)
-#endif
-
-#ifndef newSVpvs_flags
-#  define newSVpvs_flags(str, flags)     newSVpvn_flags(str "", sizeof(str) - 1, flags)
-#endif
-
-#ifndef newSVpvs_share
-#  define newSVpvs_share(str)            newSVpvn_share(str "", sizeof(str) - 1, 0)
-#endif
-
-#ifndef sv_catpvs
-#  define sv_catpvs(sv, str)             sv_catpvn(sv, str "", sizeof(str) - 1)
-#endif
-
-#ifndef sv_setpvs
-#  define sv_setpvs(sv, str)             sv_setpvn(sv, str "", sizeof(str) - 1)
-#endif
-
-#ifndef hv_fetchs
-#  define hv_fetchs(hv, key, lval)       hv_fetch(hv, key "", sizeof(key) - 1, lval)
-#endif
-
-#ifndef hv_stores
-#  define hv_stores(hv, key, val)        hv_store(hv, key "", sizeof(key) - 1, val, 0)
-#endif
-#ifndef gv_fetchpvs
-#  define gv_fetchpvs(name, flags, svt)  gv_fetchpvn_flags(name "", sizeof(name) - 1, flags, svt)
-#endif
-
-#ifndef gv_stashpvs
-#  define gv_stashpvs(name, flags)       gv_stashpvn(name "", sizeof(name) - 1, flags)
-#endif
-#ifndef get_cvs
-#  define get_cvs(name, flags)           get_cvn_flags(name "", sizeof(name)-1, flags)
-#endif
-#ifndef SvGETMAGIC
-#  define SvGETMAGIC(x)                  STMT_START { if (SvGMAGICAL(x)) mg_get(x); } STMT_END
-#endif
-
-/* That's the best we can do... */
-#ifndef sv_catpvn_nomg
-#  define sv_catpvn_nomg                 sv_catpvn
-#endif
-
-#ifndef sv_catsv_nomg
-#  define sv_catsv_nomg                  sv_catsv
-#endif
-
-#ifndef sv_setsv_nomg
-#  define sv_setsv_nomg                  sv_setsv
-#endif
-
-#ifndef sv_pvn_nomg
-#  define sv_pvn_nomg                    sv_pvn
-#endif
-
-#ifndef SvIV_nomg
-#  define SvIV_nomg                      SvIV
-#endif
-
-#ifndef SvUV_nomg
-#  define SvUV_nomg                      SvUV
-#endif
-
-#ifndef sv_catpv_mg
-#  define sv_catpv_mg(sv, ptr)          \
-   STMT_START {                         \
-     SV *TeMpSv = sv;                   \
-     sv_catpv(TeMpSv,ptr);              \
-     SvSETMAGIC(TeMpSv);                \
-   } STMT_END
-#endif
-
-#ifndef sv_catpvn_mg
-#  define sv_catpvn_mg(sv, ptr, len)    \
-   STMT_START {                         \
-     SV *TeMpSv = sv;                   \
-     sv_catpvn(TeMpSv,ptr,len);         \
-     SvSETMAGIC(TeMpSv);                \
-   } STMT_END
-#endif
-
-#ifndef sv_catsv_mg
-#  define sv_catsv_mg(dsv, ssv)         \
-   STMT_START {                         \
-     SV *TeMpSv = dsv;                  \
-     sv_catsv(TeMpSv,ssv);              \
-     SvSETMAGIC(TeMpSv);                \
-   } STMT_END
-#endif
-
-#ifndef sv_setiv_mg
-#  define sv_setiv_mg(sv, i)            \
-   STMT_START {                         \
-     SV *TeMpSv = sv;                   \
-     sv_setiv(TeMpSv,i);                \
-     SvSETMAGIC(TeMpSv);                \
-   } STMT_END
-#endif
-
-#ifndef sv_setnv_mg
-#  define sv_setnv_mg(sv, num)          \
-   STMT_START {                         \
-     SV *TeMpSv = sv;                   \
-     sv_setnv(TeMpSv,num);              \
-     SvSETMAGIC(TeMpSv);                \
-   } STMT_END
-#endif
-
-#ifndef sv_setpv_mg
-#  define sv_setpv_mg(sv, ptr)          \
-   STMT_START {                         \
-     SV *TeMpSv = sv;                   \
-     sv_setpv(TeMpSv,ptr);              \
-     SvSETMAGIC(TeMpSv);                \
-   } STMT_END
-#endif
-
-#ifndef sv_setpvn_mg
-#  define sv_setpvn_mg(sv, ptr, len)    \
-   STMT_START {                         \
-     SV *TeMpSv = sv;                   \
-     sv_setpvn(TeMpSv,ptr,len);         \
-     SvSETMAGIC(TeMpSv);                \
-   } STMT_END
-#endif
-
-#ifndef sv_setsv_mg
-#  define sv_setsv_mg(dsv, ssv)         \
-   STMT_START {                         \
-     SV *TeMpSv = dsv;                  \
-     sv_setsv(TeMpSv,ssv);              \
-     SvSETMAGIC(TeMpSv);                \
-   } STMT_END
-#endif
-
-#ifndef sv_setuv_mg
-#  define sv_setuv_mg(sv, i)            \
-   STMT_START {                         \
-     SV *TeMpSv = sv;                   \
-     sv_setuv(TeMpSv,i);                \
-     SvSETMAGIC(TeMpSv);                \
-   } STMT_END
-#endif
-
-#ifndef sv_usepvn_mg
-#  define sv_usepvn_mg(sv, ptr, len)    \
-   STMT_START {                         \
-     SV *TeMpSv = sv;                   \
-     sv_usepvn(TeMpSv,ptr,len);         \
-     SvSETMAGIC(TeMpSv);                \
-   } STMT_END
-#endif
-#ifndef SvVSTRING_mg
-#  define SvVSTRING_mg(sv)               (SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_vstring) : NULL)
-#endif
-
-/* Hint: sv_magic_portable
- * This is a compatibility function that is only available with
- * Devel::PPPort. It is NOT in the perl core.
- * Its purpose is to mimic the 5.8.0 behaviour of sv_magic() when
- * it is being passed a name pointer with namlen == 0. In that
- * case, perl 5.8.0 and later store the pointer, not a copy of it.
- * The compatibility can be provided back to perl 5.004. With
- * earlier versions, the code will not compile.
- */
-
-#if (PERL_BCDVERSION < 0x5004000)
-
-  /* code that uses sv_magic_portable will not compile */
-
-#elif (PERL_BCDVERSION < 0x5008000)
-
-#  define sv_magic_portable(sv, obj, how, name, namlen)     \
-   STMT_START {                                             \
-     SV *SvMp_sv = (sv);                                    \
-     char *SvMp_name = (char *) (name);                     \
-     I32 SvMp_namlen = (namlen);                            \
-     if (SvMp_name && SvMp_namlen == 0)                     \
-     {                                                      \
-       MAGIC *mg;                                           \
-       sv_magic(SvMp_sv, obj, how, 0, 0);                   \
-       mg = SvMAGIC(SvMp_sv);                               \
-       mg->mg_len = -42; /* XXX: this is the tricky part */ \
-       mg->mg_ptr = SvMp_name;                              \
-     }                                                      \
-     else                                                   \
-     {                                                      \
-       sv_magic(SvMp_sv, obj, how, SvMp_name, SvMp_namlen); \
-     }                                                      \
-   } STMT_END
-
-#else
-
-#  define sv_magic_portable(a, b, c, d, e)  sv_magic(a, b, c, d, e)
-
-#endif
-
-#if !defined(mg_findext)
-#if defined(NEED_mg_findext)
-static MAGIC * DPPP_(my_mg_findext)(SV * sv, int type, const MGVTBL *vtbl);
-static
-#else
-extern MAGIC * DPPP_(my_mg_findext)(SV * sv, int type, const MGVTBL *vtbl);
-#endif
-
-#if defined(NEED_mg_findext) || defined(NEED_mg_findext_GLOBAL)
-
-#define mg_findext DPPP_(my_mg_findext)
-#define Perl_mg_findext DPPP_(my_mg_findext)
-
-
-MAGIC *
-DPPP_(my_mg_findext)(SV * sv, int type, const MGVTBL *vtbl) {
-    if (sv) {
-        MAGIC *mg;
-
-#ifdef AvPAD_NAMELIST
-        assert(!(SvTYPE(sv) == SVt_PVAV && AvPAD_NAMELIST(sv)));
-#endif
-
-        for (mg = SvMAGIC (sv); mg; mg = mg->mg_moremagic) {
-            if (mg->mg_type == type && mg->mg_virtual == vtbl)
-                return mg;
-        }
-    }
-
-    return NULL;
-}
-
-#endif
-#endif
-
-#if !defined(sv_unmagicext)
-#if defined(NEED_sv_unmagicext)
-static int DPPP_(my_sv_unmagicext)(pTHX_ SV * const sv, const int type, MGVTBL * vtbl);
-static
-#else
-extern int DPPP_(my_sv_unmagicext)(pTHX_ SV * const sv, const int type, MGVTBL * vtbl);
-#endif
-
-#if defined(NEED_sv_unmagicext) || defined(NEED_sv_unmagicext_GLOBAL)
-
-#ifdef sv_unmagicext
-#  undef sv_unmagicext
-#endif
-#define sv_unmagicext(a,b,c) DPPP_(my_sv_unmagicext)(aTHX_ a,b,c)
-#define Perl_sv_unmagicext DPPP_(my_sv_unmagicext)
-
-
-int
-DPPP_(my_sv_unmagicext)(pTHX_ SV *const sv, const int type, MGVTBL *vtbl)
-{
-    MAGIC* mg;
-    MAGIC** mgp;
-
-    if (SvTYPE(sv) < SVt_PVMG || !SvMAGIC(sv))
-       return 0;
-    mgp = &(SvMAGIC(sv));
-    for (mg = *mgp; mg; mg = *mgp) {
-       const MGVTBL* const virt = mg->mg_virtual;
-       if (mg->mg_type == type && virt == vtbl) {
-           *mgp = mg->mg_moremagic;
-           if (virt && virt->svt_free)
-               virt->svt_free(aTHX_ sv, mg);
-           if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
-               if (mg->mg_len > 0)
-                   Safefree(mg->mg_ptr);
-               else if (mg->mg_len == HEf_SVKEY) /* Questionable on older perls... */
-                   SvREFCNT_dec(MUTABLE_SV(mg->mg_ptr));
-               else if (mg->mg_type == PERL_MAGIC_utf8)
-                   Safefree(mg->mg_ptr);
-            }
-           if (mg->mg_flags & MGf_REFCOUNTED)
-               SvREFCNT_dec(mg->mg_obj);
-           Safefree(mg);
-       }
-       else
-           mgp = &mg->mg_moremagic;
-    }
-    if (SvMAGIC(sv)) {
-       if (SvMAGICAL(sv))      /* if we're under save_magic, wait for restore_magic; */
-           mg_magical(sv);     /*    else fix the flags now */
-    }
-    else {
-       SvMAGICAL_off(sv);
-       SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_IOK|SVp_NOK|SVp_POK)) >> PRIVSHIFT;
-    }
-    return 0;
-}
-
-#endif
-#endif
-
-#ifdef USE_ITHREADS
-#ifndef CopFILE
-#  define CopFILE(c)                     ((c)->cop_file)
-#endif
-
-#ifndef CopFILEGV
-#  define CopFILEGV(c)                   (CopFILE(c) ? gv_fetchfile(CopFILE(c)) : Nullgv)
-#endif
-
-#ifndef CopFILE_set
-#  define CopFILE_set(c,pv)              ((c)->cop_file = savepv(pv))
-#endif
-
-#ifndef CopFILESV
-#  define CopFILESV(c)                   (CopFILE(c) ? GvSV(gv_fetchfile(CopFILE(c))) : Nullsv)
-#endif
-
-#ifndef CopFILEAV
-#  define CopFILEAV(c)                   (CopFILE(c) ? GvAV(gv_fetchfile(CopFILE(c))) : Nullav)
-#endif
-
-#ifndef CopSTASHPV
-#  define CopSTASHPV(c)                  ((c)->cop_stashpv)
-#endif
-
-#ifndef CopSTASHPV_set
-#  define CopSTASHPV_set(c,pv)           ((c)->cop_stashpv = ((pv) ? savepv(pv) : Nullch))
-#endif
-
-#ifndef CopSTASH
-#  define CopSTASH(c)                    (CopSTASHPV(c) ? gv_stashpv(CopSTASHPV(c),GV_ADD) : Nullhv)
-#endif
-
-#ifndef CopSTASH_set
-#  define CopSTASH_set(c,hv)             CopSTASHPV_set(c, (hv) ? HvNAME(hv) : Nullch)
-#endif
-
-#ifndef CopSTASH_eq
-#  define CopSTASH_eq(c,hv)              ((hv) && (CopSTASHPV(c) == HvNAME(hv) \
-                                        || (CopSTASHPV(c) && HvNAME(hv) \
-                                        && strEQ(CopSTASHPV(c), HvNAME(hv)))))
-#endif
-
-#else
-#ifndef CopFILEGV
-#  define CopFILEGV(c)                   ((c)->cop_filegv)
-#endif
-
-#ifndef CopFILEGV_set
-#  define CopFILEGV_set(c,gv)            ((c)->cop_filegv = (GV*)SvREFCNT_inc(gv))
-#endif
-
-#ifndef CopFILE_set
-#  define CopFILE_set(c,pv)              CopFILEGV_set((c), gv_fetchfile(pv))
-#endif
-
-#ifndef CopFILESV
-#  define CopFILESV(c)                   (CopFILEGV(c) ? GvSV(CopFILEGV(c)) : Nullsv)
-#endif
-
-#ifndef CopFILEAV
-#  define CopFILEAV(c)                   (CopFILEGV(c) ? GvAV(CopFILEGV(c)) : Nullav)
-#endif
-
-#ifndef CopFILE
-#  define CopFILE(c)                     (CopFILESV(c) ? SvPVX(CopFILESV(c)) : Nullch)
-#endif
-
-#ifndef CopSTASH
-#  define CopSTASH(c)                    ((c)->cop_stash)
-#endif
-
-#ifndef CopSTASH_set
-#  define CopSTASH_set(c,hv)             ((c)->cop_stash = (hv))
-#endif
-
-#ifndef CopSTASHPV
-#  define CopSTASHPV(c)                  (CopSTASH(c) ? HvNAME(CopSTASH(c)) : Nullch)
-#endif
-
-#ifndef CopSTASHPV_set
-#  define CopSTASHPV_set(c,pv)           CopSTASH_set((c), gv_stashpv(pv,GV_ADD))
-#endif
-
-#ifndef CopSTASH_eq
-#  define CopSTASH_eq(c,hv)              (CopSTASH(c) == (hv))
-#endif
-
-#endif /* USE_ITHREADS */
-
-#if (PERL_BCDVERSION >= 0x5006000)
-#ifndef caller_cx
-
-# if defined(NEED_caller_cx) || defined(NEED_caller_cx_GLOBAL)
-static I32
-DPPP_dopoptosub_at(const PERL_CONTEXT *cxstk, I32 startingblock)
-{
-    I32 i;
-
-    for (i = startingblock; i >= 0; i--) {
-       register const PERL_CONTEXT * const cx = &cxstk[i];
-       switch (CxTYPE(cx)) {
-       default:
-           continue;
-       case CXt_EVAL:
-       case CXt_SUB:
-       case CXt_FORMAT:
-           return i;
-       }
-    }
-    return i;
-}
-# endif
-
-# if defined(NEED_caller_cx)
-static const PERL_CONTEXT * DPPP_(my_caller_cx)(pTHX_ I32 count, const PERL_CONTEXT **dbcxp);
-static
-#else
-extern const PERL_CONTEXT * DPPP_(my_caller_cx)(pTHX_ I32 count, const PERL_CONTEXT **dbcxp);
-#endif
-
-#if defined(NEED_caller_cx) || defined(NEED_caller_cx_GLOBAL)
-
-#ifdef caller_cx
-#  undef caller_cx
-#endif
-#define caller_cx(a,b) DPPP_(my_caller_cx)(aTHX_ a,b)
-#define Perl_caller_cx DPPP_(my_caller_cx)
-
-
-const PERL_CONTEXT *
-DPPP_(my_caller_cx)(pTHX_ I32 count, const PERL_CONTEXT **dbcxp)
-{
-    register I32 cxix = DPPP_dopoptosub_at(cxstack, cxstack_ix);
-    register const PERL_CONTEXT *cx;
-    register const PERL_CONTEXT *ccstack = cxstack;
-    const PERL_SI *top_si = PL_curstackinfo;
-
-    for (;;) {
-       /* we may be in a higher stacklevel, so dig down deeper */
-       while (cxix < 0 && top_si->si_type != PERLSI_MAIN) {
-           top_si = top_si->si_prev;
-           ccstack = top_si->si_cxstack;
-           cxix = DPPP_dopoptosub_at(ccstack, top_si->si_cxix);
-       }
-       if (cxix < 0)
-           return NULL;
-       /* caller() should not report the automatic calls to &DB::sub */
-       if (PL_DBsub && GvCV(PL_DBsub) && cxix >= 0 &&
-               ccstack[cxix].blk_sub.cv == GvCV(PL_DBsub))
-           count++;
-       if (!count--)
-           break;
-       cxix = DPPP_dopoptosub_at(ccstack, cxix - 1);
-    }
-
-    cx = &ccstack[cxix];
-    if (dbcxp) *dbcxp = cx;
-
-    if (CxTYPE(cx) == CXt_SUB || CxTYPE(cx) == CXt_FORMAT) {
-        const I32 dbcxix = DPPP_dopoptosub_at(ccstack, cxix - 1);
-       /* We expect that ccstack[dbcxix] is CXt_SUB, anyway, the
-          field below is defined for any cx. */
-       /* caller() should not report the automatic calls to &DB::sub */
-       if (PL_DBsub && GvCV(PL_DBsub) && dbcxix >= 0 && ccstack[dbcxix].blk_sub.cv == GvCV(PL_DBsub))
-           cx = &ccstack[dbcxix];
-    }
-
-    return cx;
-}
-
-# endif
-#endif /* caller_cx */
-#endif /* 5.6.0 */
-#ifndef IN_PERL_COMPILETIME
-#  define IN_PERL_COMPILETIME            (PL_curcop == &PL_compiling)
-#endif
-
-#ifndef IN_LOCALE_RUNTIME
-#  define IN_LOCALE_RUNTIME              (PL_curcop->op_private & HINT_LOCALE)
-#endif
-
-#ifndef IN_LOCALE_COMPILETIME
-#  define IN_LOCALE_COMPILETIME          (PL_hints & HINT_LOCALE)
-#endif
-
-#ifndef IN_LOCALE
-#  define IN_LOCALE                      (IN_PERL_COMPILETIME ? IN_LOCALE_COMPILETIME : IN_LOCALE_RUNTIME)
-#endif
-#ifndef IS_NUMBER_IN_UV
-#  define IS_NUMBER_IN_UV                0x01
-#endif
-
-#ifndef IS_NUMBER_GREATER_THAN_UV_MAX
-#  define IS_NUMBER_GREATER_THAN_UV_MAX  0x02
-#endif
-
-#ifndef IS_NUMBER_NOT_INT
-#  define IS_NUMBER_NOT_INT              0x04
-#endif
-
-#ifndef IS_NUMBER_NEG
-#  define IS_NUMBER_NEG                  0x08
-#endif
-
-#ifndef IS_NUMBER_INFINITY
-#  define IS_NUMBER_INFINITY             0x10
-#endif
-
-#ifndef IS_NUMBER_NAN
-#  define IS_NUMBER_NAN                  0x20
-#endif
-#ifndef GROK_NUMERIC_RADIX
-#  define GROK_NUMERIC_RADIX(sp, send)   grok_numeric_radix(sp, send)
-#endif
-#ifndef PERL_SCAN_GREATER_THAN_UV_MAX
-#  define PERL_SCAN_GREATER_THAN_UV_MAX  0x02
-#endif
-
-#ifndef PERL_SCAN_SILENT_ILLDIGIT
-#  define PERL_SCAN_SILENT_ILLDIGIT      0x04
-#endif
-
-#ifndef PERL_SCAN_ALLOW_UNDERSCORES
-#  define PERL_SCAN_ALLOW_UNDERSCORES    0x01
-#endif
-
-#ifndef PERL_SCAN_DISALLOW_PREFIX
-#  define PERL_SCAN_DISALLOW_PREFIX      0x02
-#endif
-
-#ifndef grok_numeric_radix
-#if defined(NEED_grok_numeric_radix)
-static bool DPPP_(my_grok_numeric_radix)(pTHX_ const char ** sp, const char * send);
-static
-#else
-extern bool DPPP_(my_grok_numeric_radix)(pTHX_ const char ** sp, const char * send);
-#endif
-
-#if defined(NEED_grok_numeric_radix) || defined(NEED_grok_numeric_radix_GLOBAL)
-
-#ifdef grok_numeric_radix
-#  undef grok_numeric_radix
-#endif
-#define grok_numeric_radix(a,b) DPPP_(my_grok_numeric_radix)(aTHX_ a,b)
-#define Perl_grok_numeric_radix DPPP_(my_grok_numeric_radix)
-
-bool
-DPPP_(my_grok_numeric_radix)(pTHX_ const char **sp, const char *send)
-{
-#ifdef USE_LOCALE_NUMERIC
-#ifdef PL_numeric_radix_sv
-    if (PL_numeric_radix_sv && IN_LOCALE) {
-        STRLEN len;
-        char* radix = SvPV(PL_numeric_radix_sv, len);
-        if (*sp + len <= send && memEQ(*sp, radix, len)) {
-            *sp += len;
-            return TRUE;
-        }
-    }
-#else
-    /* older perls don't have PL_numeric_radix_sv so the radix
-     * must manually be requested from locale.h
-     */
-#include <locale.h>
-    dTHR;  /* needed for older threaded perls */
-    struct lconv *lc = localeconv();
-    char *radix = lc->decimal_point;
-    if (radix && IN_LOCALE) {
-        STRLEN len = strlen(radix);
-        if (*sp + len <= send && memEQ(*sp, radix, len)) {
-            *sp += len;
-            return TRUE;
-        }
-    }
-#endif
-#endif /* USE_LOCALE_NUMERIC */
-    /* always try "." if numeric radix didn't match because
-     * we may have data from different locales mixed */
-    if (*sp < send && **sp == '.') {
-        ++*sp;
-        return TRUE;
-    }
-    return FALSE;
-}
-#endif
-#endif
-
-#ifndef grok_number
-#if defined(NEED_grok_number)
-static int DPPP_(my_grok_number)(pTHX_ const char * pv, STRLEN len, UV * valuep);
-static
-#else
-extern int DPPP_(my_grok_number)(pTHX_ const char * pv, STRLEN len, UV * valuep);
-#endif
-
-#if defined(NEED_grok_number) || defined(NEED_grok_number_GLOBAL)
-
-#ifdef grok_number
-#  undef grok_number
-#endif
-#define grok_number(a,b,c) DPPP_(my_grok_number)(aTHX_ a,b,c)
-#define Perl_grok_number DPPP_(my_grok_number)
-
-int
-DPPP_(my_grok_number)(pTHX_ const char *pv, STRLEN len, UV *valuep)
-{
-  const char *s = pv;
-  const char *send = pv + len;
-  const UV max_div_10 = UV_MAX / 10;
-  const char max_mod_10 = UV_MAX % 10;
-  int numtype = 0;
-  int sawinf = 0;
-  int sawnan = 0;
-
-  while (s < send && isSPACE(*s))
-    s++;
-  if (s == send) {
-    return 0;
-  } else if (*s == '-') {
-    s++;
-    numtype = IS_NUMBER_NEG;
-  }
-  else if (*s == '+')
-  s++;
-
-  if (s == send)
-    return 0;
-
-  /* next must be digit or the radix separator or beginning of infinity */
-  if (isDIGIT(*s)) {
-    /* UVs are at least 32 bits, so the first 9 decimal digits cannot
-       overflow.  */
-    UV value = *s - '0';
-    /* This construction seems to be more optimiser friendly.
-       (without it gcc does the isDIGIT test and the *s - '0' separately)
-       With it gcc on arm is managing 6 instructions (6 cycles) per digit.
-       In theory the optimiser could deduce how far to unroll the loop
-       before checking for overflow.  */
-    if (++s < send) {
-      int digit = *s - '0';
-      if (digit >= 0 && digit <= 9) {
-        value = value * 10 + digit;
-        if (++s < send) {
-          digit = *s - '0';
-          if (digit >= 0 && digit <= 9) {
-            value = value * 10 + digit;
-            if (++s < send) {
-              digit = *s - '0';
-              if (digit >= 0 && digit <= 9) {
-                value = value * 10 + digit;
-                if (++s < send) {
-                  digit = *s - '0';
-                  if (digit >= 0 && digit <= 9) {
-                    value = value * 10 + digit;
-                    if (++s < send) {
-                      digit = *s - '0';
-                      if (digit >= 0 && digit <= 9) {
-                        value = value * 10 + digit;
-                        if (++s < send) {
-                          digit = *s - '0';
-                          if (digit >= 0 && digit <= 9) {
-                            value = value * 10 + digit;
-                            if (++s < send) {
-                              digit = *s - '0';
-                              if (digit >= 0 && digit <= 9) {
-                                value = value * 10 + digit;
-                                if (++s < send) {
-                                  digit = *s - '0';
-                                  if (digit >= 0 && digit <= 9) {
-                                    value = value * 10 + digit;
-                                    if (++s < send) {
-                                      /* Now got 9 digits, so need to check
-                                         each time for overflow.  */
-                                      digit = *s - '0';
-                                      while (digit >= 0 && digit <= 9
-                                             && (value < max_div_10
-                                                 || (value == max_div_10
-                                                     && digit <= max_mod_10))) {
-                                        value = value * 10 + digit;
-                                        if (++s < send)
-                                          digit = *s - '0';
-                                        else
-                                          break;
-                                      }
-                                      if (digit >= 0 && digit <= 9
-                                          && (s < send)) {
-                                        /* value overflowed.
-                                           skip the remaining digits, don't
-                                           worry about setting *valuep.  */
-                                        do {
-                                          s++;
-                                        } while (s < send && isDIGIT(*s));
-                                        numtype |=
-                                          IS_NUMBER_GREATER_THAN_UV_MAX;
-                                        goto skip_value;
-                                      }
-                                    }
-                                  }
-                                }
-                              }
-                            }
-                          }
-                        }
-                      }
-                    }
-                  }
-                }
-              }
-            }
-          }
-        }
-      }
-    }
-    numtype |= IS_NUMBER_IN_UV;
-    if (valuep)
-      *valuep = value;
-
-  skip_value:
-    if (GROK_NUMERIC_RADIX(&s, send)) {
-      numtype |= IS_NUMBER_NOT_INT;
-      while (s < send && isDIGIT(*s))  /* optional digits after the radix */
-        s++;
-    }
-  }
-  else if (GROK_NUMERIC_RADIX(&s, send)) {
-    numtype |= IS_NUMBER_NOT_INT | IS_NUMBER_IN_UV; /* valuep assigned below */
-    /* no digits before the radix means we need digits after it */
-    if (s < send && isDIGIT(*s)) {
-      do {
-        s++;
-      } while (s < send && isDIGIT(*s));
-      if (valuep) {
-        /* integer approximation is valid - it's 0.  */
-        *valuep = 0;
-      }
-    }
-    else
-      return 0;
-  } else if (*s == 'I' || *s == 'i') {
-    s++; if (s == send || (*s != 'N' && *s != 'n')) return 0;
-    s++; if (s == send || (*s != 'F' && *s != 'f')) return 0;
-    s++; if (s < send && (*s == 'I' || *s == 'i')) {
-      s++; if (s == send || (*s != 'N' && *s != 'n')) return 0;
-      s++; if (s == send || (*s != 'I' && *s != 'i')) return 0;
-      s++; if (s == send || (*s != 'T' && *s != 't')) return 0;
-      s++; if (s == send || (*s != 'Y' && *s != 'y')) return 0;
-      s++;
-    }
-    sawinf = 1;
-  } else if (*s == 'N' || *s == 'n') {
-    /* XXX TODO: There are signaling NaNs and quiet NaNs. */
-    s++; if (s == send || (*s != 'A' && *s != 'a')) return 0;
-    s++; if (s == send || (*s != 'N' && *s != 'n')) return 0;
-    s++;
-    sawnan = 1;
-  } else
-    return 0;
-
-  if (sawinf) {
-    numtype &= IS_NUMBER_NEG; /* Keep track of sign  */
-    numtype |= IS_NUMBER_INFINITY | IS_NUMBER_NOT_INT;
-  } else if (sawnan) {
-    numtype &= IS_NUMBER_NEG; /* Keep track of sign  */
-    numtype |= IS_NUMBER_NAN | IS_NUMBER_NOT_INT;
-  } else if (s < send) {
-    /* we can have an optional exponent part */
-    if (*s == 'e' || *s == 'E') {
-      /* The only flag we keep is sign.  Blow away any "it's UV"  */
-      numtype &= IS_NUMBER_NEG;
-      numtype |= IS_NUMBER_NOT_INT;
-      s++;
-      if (s < send && (*s == '-' || *s == '+'))
-        s++;
-      if (s < send && isDIGIT(*s)) {
-        do {
-          s++;
-        } while (s < send && isDIGIT(*s));
-      }
-      else
-      return 0;
-    }
-  }
-  while (s < send && isSPACE(*s))
-    s++;
-  if (s >= send)
-    return numtype;
-  if (len == 10 && memEQ(pv, "0 but true", 10)) {
-    if (valuep)
-      *valuep = 0;
-    return IS_NUMBER_IN_UV;
-  }
-  return 0;
-}
-#endif
-#endif
-
-/*
- * The grok_* routines have been modified to use warn() instead of
- * Perl_warner(). Also, 'hexdigit' was the former name of PL_hexdigit,
- * which is why the stack variable has been renamed to 'xdigit'.
- */
-
-#ifndef grok_bin
-#if defined(NEED_grok_bin)
-static UV DPPP_(my_grok_bin)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result);
-static
-#else
-extern UV DPPP_(my_grok_bin)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result);
-#endif
-
-#if defined(NEED_grok_bin) || defined(NEED_grok_bin_GLOBAL)
-
-#ifdef grok_bin
-#  undef grok_bin
-#endif
-#define grok_bin(a,b,c,d) DPPP_(my_grok_bin)(aTHX_ a,b,c,d)
-#define Perl_grok_bin DPPP_(my_grok_bin)
-
-UV
-DPPP_(my_grok_bin)(pTHX_ const char *start, STRLEN *len_p, I32 *flags, NV *result)
-{
-    const char *s = start;
-    STRLEN len = *len_p;
-    UV value = 0;
-    NV value_nv = 0;
-
-    const UV max_div_2 = UV_MAX / 2;
-    bool allow_underscores = *flags & PERL_SCAN_ALLOW_UNDERSCORES;
-    bool overflowed = FALSE;
-
-    if (!(*flags & PERL_SCAN_DISALLOW_PREFIX)) {
-        /* strip off leading b or 0b.
-           for compatibility silently suffer "b" and "0b" as valid binary
-           numbers. */
-        if (len >= 1) {
-            if (s[0] == 'b') {
-                s++;
-                len--;
-            }
-            else if (len >= 2 && s[0] == '0' && s[1] == 'b') {
-                s+=2;
-                len-=2;
-            }
-        }
-    }
-
-    for (; len-- && *s; s++) {
-        char bit = *s;
-        if (bit == '0' || bit == '1') {
-            /* Write it in this wonky order with a goto to attempt to get the
-               compiler to make the common case integer-only loop pretty tight.
-               With gcc seems to be much straighter code than old scan_bin.  */
-          redo:
-            if (!overflowed) {
-                if (value <= max_div_2) {
-                    value = (value << 1) | (bit - '0');
-                    continue;
-                }
-                /* Bah. We're just overflowed.  */
-                warn("Integer overflow in binary number");
-                overflowed = TRUE;
-                value_nv = (NV) value;
-            }
-            value_nv *= 2.0;
-            /* If an NV has not enough bits in its mantissa to
-             * represent a UV this summing of small low-order numbers
-             * is a waste of time (because the NV cannot preserve
-             * the low-order bits anyway): we could just remember when
-             * did we overflow and in the end just multiply value_nv by the
-             * right amount. */
-            value_nv += (NV)(bit - '0');
-            continue;
-        }
-        if (bit == '_' && len && allow_underscores && (bit = s[1])
-            && (bit == '0' || bit == '1'))
-            {
-                --len;
-                ++s;
-                goto redo;
-            }
-        if (!(*flags & PERL_SCAN_SILENT_ILLDIGIT))
-            warn("Illegal binary digit '%c' ignored", *s);
-        break;
-    }
-
-    if (   ( overflowed && value_nv > 4294967295.0)
-#if UVSIZE > 4
-        || (!overflowed && value > 0xffffffff  )
-#endif
-        ) {
-        warn("Binary number > 0b11111111111111111111111111111111 non-portable");
-    }
-    *len_p = s - start;
-    if (!overflowed) {
-        *flags = 0;
-        return value;
-    }
-    *flags = PERL_SCAN_GREATER_THAN_UV_MAX;
-    if (result)
-        *result = value_nv;
-    return UV_MAX;
-}
-#endif
-#endif
-
-#ifndef grok_hex
-#if defined(NEED_grok_hex)
-static UV DPPP_(my_grok_hex)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result);
-static
-#else
-extern UV DPPP_(my_grok_hex)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result);
-#endif
-
-#if defined(NEED_grok_hex) || defined(NEED_grok_hex_GLOBAL)
-
-#ifdef grok_hex
-#  undef grok_hex
-#endif
-#define grok_hex(a,b,c,d) DPPP_(my_grok_hex)(aTHX_ a,b,c,d)
-#define Perl_grok_hex DPPP_(my_grok_hex)
-
-UV
-DPPP_(my_grok_hex)(pTHX_ const char *start, STRLEN *len_p, I32 *flags, NV *result)
-{
-    const char *s = start;
-    STRLEN len = *len_p;
-    UV value = 0;
-    NV value_nv = 0;
-
-    const UV max_div_16 = UV_MAX / 16;
-    bool allow_underscores = *flags & PERL_SCAN_ALLOW_UNDERSCORES;
-    bool overflowed = FALSE;
-    const char *xdigit;
-
-    if (!(*flags & PERL_SCAN_DISALLOW_PREFIX)) {
-        /* strip off leading x or 0x.
-           for compatibility silently suffer "x" and "0x" as valid hex numbers.
-        */
-        if (len >= 1) {
-            if (s[0] == 'x') {
-                s++;
-                len--;
-            }
-            else if (len >= 2 && s[0] == '0' && s[1] == 'x') {
-                s+=2;
-                len-=2;
-            }
-        }
-    }
-
-    for (; len-- && *s; s++) {
-        xdigit = strchr((char *) PL_hexdigit, *s);
-        if (xdigit) {
-            /* Write it in this wonky order with a goto to attempt to get the
-               compiler to make the common case integer-only loop pretty tight.
-               With gcc seems to be much straighter code than old scan_hex.  */
-          redo:
-            if (!overflowed) {
-                if (value <= max_div_16) {
-                    value = (value << 4) | ((xdigit - PL_hexdigit) & 15);
-                    continue;
-                }
-                warn("Integer overflow in hexadecimal number");
-                overflowed = TRUE;
-                value_nv = (NV) value;
-            }
-            value_nv *= 16.0;
-            /* If an NV has not enough bits in its mantissa to
-             * represent a UV this summing of small low-order numbers
-             * is a waste of time (because the NV cannot preserve
-             * the low-order bits anyway): we could just remember when
-             * did we overflow and in the end just multiply value_nv by the
-             * right amount of 16-tuples. */
-            value_nv += (NV)((xdigit - PL_hexdigit) & 15);
-            continue;
-        }
-        if (*s == '_' && len && allow_underscores && s[1]
-                && (xdigit = strchr((char *) PL_hexdigit, s[1])))
-            {
-                --len;
-                ++s;
-                goto redo;
-            }
-        if (!(*flags & PERL_SCAN_SILENT_ILLDIGIT))
-            warn("Illegal hexadecimal digit '%c' ignored", *s);
-        break;
-    }
-
-    if (   ( overflowed && value_nv > 4294967295.0)
-#if UVSIZE > 4
-        || (!overflowed && value > 0xffffffff  )
-#endif
-        ) {
-        warn("Hexadecimal number > 0xffffffff non-portable");
-    }
-    *len_p = s - start;
-    if (!overflowed) {
-        *flags = 0;
-        return value;
-    }
-    *flags = PERL_SCAN_GREATER_THAN_UV_MAX;
-    if (result)
-        *result = value_nv;
-    return UV_MAX;
-}
-#endif
-#endif
-
-#ifndef grok_oct
-#if defined(NEED_grok_oct)
-static UV DPPP_(my_grok_oct)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result);
-static
-#else
-extern UV DPPP_(my_grok_oct)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result);
-#endif
-
-#if defined(NEED_grok_oct) || defined(NEED_grok_oct_GLOBAL)
-
-#ifdef grok_oct
-#  undef grok_oct
-#endif
-#define grok_oct(a,b,c,d) DPPP_(my_grok_oct)(aTHX_ a,b,c,d)
-#define Perl_grok_oct DPPP_(my_grok_oct)
-
-UV
-DPPP_(my_grok_oct)(pTHX_ const char *start, STRLEN *len_p, I32 *flags, NV *result)
-{
-    const char *s = start;
-    STRLEN len = *len_p;
-    UV value = 0;
-    NV value_nv = 0;
-
-    const UV max_div_8 = UV_MAX / 8;
-    bool allow_underscores = *flags & PERL_SCAN_ALLOW_UNDERSCORES;
-    bool overflowed = FALSE;
-
-    for (; len-- && *s; s++) {
-         /* gcc 2.95 optimiser not smart enough to figure that this subtraction
-            out front allows slicker code.  */
-        int digit = *s - '0';
-        if (digit >= 0 && digit <= 7) {
-            /* Write it in this wonky order with a goto to attempt to get the
-               compiler to make the common case integer-only loop pretty tight.
-            */
-          redo:
-            if (!overflowed) {
-                if (value <= max_div_8) {
-                    value = (value << 3) | digit;
-                    continue;
-                }
-                /* Bah. We're just overflowed.  */
-                warn("Integer overflow in octal number");
-                overflowed = TRUE;
-                value_nv = (NV) value;
-            }
-            value_nv *= 8.0;
-            /* If an NV has not enough bits in its mantissa to
-             * represent a UV this summing of small low-order numbers
-             * is a waste of time (because the NV cannot preserve
-             * the low-order bits anyway): we could just remember when
-             * did we overflow and in the end just multiply value_nv by the
-             * right amount of 8-tuples. */
-            value_nv += (NV)digit;
-            continue;
-        }
-        if (digit == ('_' - '0') && len && allow_underscores
-            && (digit = s[1] - '0') && (digit >= 0 && digit <= 7))
-            {
-                --len;
-                ++s;
-                goto redo;
-            }
-        /* Allow \octal to work the DWIM way (that is, stop scanning
-         * as soon as non-octal characters are seen, complain only iff
-         * someone seems to want to use the digits eight and nine). */
-        if (digit == 8 || digit == 9) {
-            if (!(*flags & PERL_SCAN_SILENT_ILLDIGIT))
-                warn("Illegal octal digit '%c' ignored", *s);
-        }
-        break;
-    }
-
-    if (   ( overflowed && value_nv > 4294967295.0)
-#if UVSIZE > 4
-        || (!overflowed && value > 0xffffffff  )
-#endif
-        ) {
-        warn("Octal number > 037777777777 non-portable");
-    }
-    *len_p = s - start;
-    if (!overflowed) {
-        *flags = 0;
-        return value;
-    }
-    *flags = PERL_SCAN_GREATER_THAN_UV_MAX;
-    if (result)
-        *result = value_nv;
-    return UV_MAX;
-}
-#endif
-#endif
-
-#if !defined(my_snprintf)
-#if defined(NEED_my_snprintf)
-static int DPPP_(my_my_snprintf)(char * buffer, const Size_t len, const char * format, ...);
-static
-#else
-extern int DPPP_(my_my_snprintf)(char * buffer, const Size_t len, const char * format, ...);
-#endif
-
-#if defined(NEED_my_snprintf) || defined(NEED_my_snprintf_GLOBAL)
-
-#define my_snprintf DPPP_(my_my_snprintf)
-#define Perl_my_snprintf DPPP_(my_my_snprintf)
-
-
-int
-DPPP_(my_my_snprintf)(char *buffer, const Size_t len, const char *format, ...)
-{
-    dTHX;
-    int retval;
-    va_list ap;
-    va_start(ap, format);
-#ifdef HAS_VSNPRINTF
-    retval = vsnprintf(buffer, len, format, ap);
-#else
-    retval = vsprintf(buffer, format, ap);
-#endif
-    va_end(ap);
-    if (retval < 0 || (len > 0 && (Size_t)retval >= len))
-        Perl_croak(aTHX_ "panic: my_snprintf buffer overflow");
-    return retval;
-}
-
-#endif
-#endif
-
-#if !defined(my_sprintf)
-#if defined(NEED_my_sprintf)
-static int DPPP_(my_my_sprintf)(char * buffer, const char * pat, ...);
-static
-#else
-extern int DPPP_(my_my_sprintf)(char * buffer, const char * pat, ...);
-#endif
-
-#if defined(NEED_my_sprintf) || defined(NEED_my_sprintf_GLOBAL)
-
-#define my_sprintf DPPP_(my_my_sprintf)
-#define Perl_my_sprintf DPPP_(my_my_sprintf)
-
-
-int
-DPPP_(my_my_sprintf)(char *buffer, const char* pat, ...)
-{
-    va_list args;
-    va_start(args, pat);
-    vsprintf(buffer, pat, args);
-    va_end(args);
-    return strlen(buffer);
-}
-
-#endif
-#endif
-
-#ifdef NO_XSLOCKS
-#  ifdef dJMPENV
-#    define dXCPT             dJMPENV; int rEtV = 0
-#    define XCPT_TRY_START    JMPENV_PUSH(rEtV); if (rEtV == 0)
-#    define XCPT_TRY_END      JMPENV_POP;
-#    define XCPT_CATCH        if (rEtV != 0)
-#    define XCPT_RETHROW      JMPENV_JUMP(rEtV)
-#  else
-#    define dXCPT             Sigjmp_buf oldTOP; int rEtV = 0
-#    define XCPT_TRY_START    Copy(top_env, oldTOP, 1, Sigjmp_buf); rEtV = Sigsetjmp(top_env, 1); if (rEtV == 0)
-#    define XCPT_TRY_END      Copy(oldTOP, top_env, 1, Sigjmp_buf);
-#    define XCPT_CATCH        if (rEtV != 0)
-#    define XCPT_RETHROW      Siglongjmp(top_env, rEtV)
-#  endif
-#endif
-
-#if !defined(my_strlcat)
-#if defined(NEED_my_strlcat)
-static Size_t DPPP_(my_my_strlcat)(char * dst, const char * src, Size_t size);
-static
-#else
-extern Size_t DPPP_(my_my_strlcat)(char * dst, const char * src, Size_t size);
-#endif
-
-#if defined(NEED_my_strlcat) || defined(NEED_my_strlcat_GLOBAL)
-
-#define my_strlcat DPPP_(my_my_strlcat)
-#define Perl_my_strlcat DPPP_(my_my_strlcat)
-
-
-Size_t
-DPPP_(my_my_strlcat)(char *dst, const char *src, Size_t size)
-{
-    Size_t used, length, copy;
-
-    used = strlen(dst);
-    length = strlen(src);
-    if (size > 0 && used < size - 1) {
-        copy = (length >= size - used) ? size - used - 1 : length;
-        memcpy(dst + used, src, copy);
-        dst[used + copy] = '\0';
-    }
-    return used + length;
-}
-#endif
-#endif
-
-#if !defined(my_strlcpy)
-#if defined(NEED_my_strlcpy)
-static Size_t DPPP_(my_my_strlcpy)(char * dst, const char * src, Size_t size);
-static
-#else
-extern Size_t DPPP_(my_my_strlcpy)(char * dst, const char * src, Size_t size);
-#endif
-
-#if defined(NEED_my_strlcpy) || defined(NEED_my_strlcpy_GLOBAL)
-
-#define my_strlcpy DPPP_(my_my_strlcpy)
-#define Perl_my_strlcpy DPPP_(my_my_strlcpy)
-
-
-Size_t
-DPPP_(my_my_strlcpy)(char *dst, const char *src, Size_t size)
-{
-    Size_t length, copy;
-
-    length = strlen(src);
-    if (size > 0) {
-        copy = (length >= size) ? size - 1 : length;
-        memcpy(dst, src, copy);
-        dst[copy] = '\0';
-    }
-    return length;
-}
-
-#endif
-#endif
-#ifndef PERL_PV_ESCAPE_QUOTE
-#  define PERL_PV_ESCAPE_QUOTE           0x0001
-#endif
-
-#ifndef PERL_PV_PRETTY_QUOTE
-#  define PERL_PV_PRETTY_QUOTE           PERL_PV_ESCAPE_QUOTE
-#endif
-
-#ifndef PERL_PV_PRETTY_ELLIPSES
-#  define PERL_PV_PRETTY_ELLIPSES        0x0002
-#endif
-
-#ifndef PERL_PV_PRETTY_LTGT
-#  define PERL_PV_PRETTY_LTGT            0x0004
-#endif
-
-#ifndef PERL_PV_ESCAPE_FIRSTCHAR
-#  define PERL_PV_ESCAPE_FIRSTCHAR       0x0008
-#endif
-
-#ifndef PERL_PV_ESCAPE_UNI
-#  define PERL_PV_ESCAPE_UNI             0x0100
-#endif
-
-#ifndef PERL_PV_ESCAPE_UNI_DETECT
-#  define PERL_PV_ESCAPE_UNI_DETECT      0x0200
-#endif
-
-#ifndef PERL_PV_ESCAPE_ALL
-#  define PERL_PV_ESCAPE_ALL             0x1000
-#endif
-
-#ifndef PERL_PV_ESCAPE_NOBACKSLASH
-#  define PERL_PV_ESCAPE_NOBACKSLASH     0x2000
-#endif
-
-#ifndef PERL_PV_ESCAPE_NOCLEAR
-#  define PERL_PV_ESCAPE_NOCLEAR         0x4000
-#endif
-
-#ifndef PERL_PV_ESCAPE_RE
-#  define PERL_PV_ESCAPE_RE              0x8000
-#endif
-
-#ifndef PERL_PV_PRETTY_NOCLEAR
-#  define PERL_PV_PRETTY_NOCLEAR         PERL_PV_ESCAPE_NOCLEAR
-#endif
-#ifndef PERL_PV_PRETTY_DUMP
-#  define PERL_PV_PRETTY_DUMP            PERL_PV_PRETTY_ELLIPSES|PERL_PV_PRETTY_QUOTE
-#endif
-
-#ifndef PERL_PV_PRETTY_REGPROP
-#  define PERL_PV_PRETTY_REGPROP         PERL_PV_PRETTY_ELLIPSES|PERL_PV_PRETTY_LTGT|PERL_PV_ESCAPE_RE
-#endif
-
-/* Hint: pv_escape
- * Note that unicode functionality is only backported to
- * those perl versions that support it. For older perl
- * versions, the implementation will fall back to bytes.
- */
-
-#ifndef pv_escape
-#if defined(NEED_pv_escape)
-static char * DPPP_(my_pv_escape)(pTHX_ SV * dsv, char const * const str, const STRLEN count, const STRLEN max, STRLEN * const escaped, const U32 flags);
-static
-#else
-extern char * DPPP_(my_pv_escape)(pTHX_ SV * dsv, char const * const str, const STRLEN count, const STRLEN max, STRLEN * const escaped, const U32 flags);
-#endif
-
-#if defined(NEED_pv_escape) || defined(NEED_pv_escape_GLOBAL)
-
-#ifdef pv_escape
-#  undef pv_escape
-#endif
-#define pv_escape(a,b,c,d,e,f) DPPP_(my_pv_escape)(aTHX_ a,b,c,d,e,f)
-#define Perl_pv_escape DPPP_(my_pv_escape)
-
-
-char *
-DPPP_(my_pv_escape)(pTHX_ SV *dsv, char const * const str,
-  const STRLEN count, const STRLEN max,
-  STRLEN * const escaped, const U32 flags)
-{
-    const char esc = flags & PERL_PV_ESCAPE_RE ? '%' : '\\';
-    const char dq = flags & PERL_PV_ESCAPE_QUOTE ? '"' : esc;
-    char octbuf[32] = "%123456789ABCDF";
-    STRLEN wrote = 0;
-    STRLEN chsize = 0;
-    STRLEN readsize = 1;
-#if defined(is_utf8_string) && defined(utf8_to_uvchr_buf)
-    bool isuni = flags & PERL_PV_ESCAPE_UNI ? 1 : 0;
-#endif
-    const char *pv  = str;
-    const char * const end = pv + count;
-    octbuf[0] = esc;
-
-    if (!(flags & PERL_PV_ESCAPE_NOCLEAR))
-        sv_setpvs(dsv, "");
-
-#if defined(is_utf8_string) && defined(utf8_to_uvchr_buf)
-    if ((flags & PERL_PV_ESCAPE_UNI_DETECT) && is_utf8_string((U8*)pv, count))
-        isuni = 1;
-#endif
-
-    for (; pv < end && (!max || wrote < max) ; pv += readsize) {
-        const UV u =
-#if defined(is_utf8_string) && defined(utf8_to_uvchr_buf)
-                     isuni ? utf8_to_uvchr_buf((U8*)pv, end, &readsize) :
-#endif
-                             (U8)*pv;
-        const U8 c = (U8)u & 0xFF;
-
-        if (u > 255 || (flags & PERL_PV_ESCAPE_ALL)) {
-            if (flags & PERL_PV_ESCAPE_FIRSTCHAR)
-                chsize = my_snprintf(octbuf, sizeof octbuf,
-                                      "%" UVxf, u);
-            else
-                chsize = my_snprintf(octbuf, sizeof octbuf,
-                                      "%cx{%" UVxf "}", esc, u);
-        } else if (flags & PERL_PV_ESCAPE_NOBACKSLASH) {
-            chsize = 1;
-        } else {
-            if (c == dq || c == esc || !isPRINT(c)) {
-                chsize = 2;
-                switch (c) {
-                case '\\' : /* fallthrough */
-                case '%'  : if (c == esc)
-                                octbuf[1] = esc;
-                            else
-                                chsize = 1;
-                            break;
-                case '\v' : octbuf[1] = 'v'; break;
-                case '\t' : octbuf[1] = 't'; break;
-                case '\r' : octbuf[1] = 'r'; break;
-                case '\n' : octbuf[1] = 'n'; break;
-                case '\f' : octbuf[1] = 'f'; break;
-                case '"'  : if (dq == '"')
-                                octbuf[1] = '"';
-                            else
-                                chsize = 1;
-                            break;
-                default:    chsize = my_snprintf(octbuf, sizeof octbuf,
-                                pv < end && isDIGIT((U8)*(pv+readsize))
-                                ? "%c%03o" : "%c%o", esc, c);
-                }
-            } else {
-                chsize = 1;
-            }
-        }
-        if (max && wrote + chsize > max) {
-            break;
-        } else if (chsize > 1) {
-            sv_catpvn(dsv, octbuf, chsize);
-            wrote += chsize;
-        } else {
-            char tmp[2];
-            my_snprintf(tmp, sizeof tmp, "%c", c);
-            sv_catpvn(dsv, tmp, 1);
-            wrote++;
-        }
-        if (flags & PERL_PV_ESCAPE_FIRSTCHAR)
-            break;
-    }
-    if (escaped != NULL)
-        *escaped= pv - str;
-    return SvPVX(dsv);
-}
-
-#endif
-#endif
-
-#ifndef pv_pretty
-#if defined(NEED_pv_pretty)
-static char * DPPP_(my_pv_pretty)(pTHX_ SV * dsv, char const * const str, const STRLEN count, const STRLEN max, char const * const start_color, char const * const end_color, const U32 flags);
-static
-#else
-extern char * DPPP_(my_pv_pretty)(pTHX_ SV * dsv, char const * const str, const STRLEN count, const STRLEN max, char const * const start_color, char const * const end_color, const U32 flags);
-#endif
-
-#if defined(NEED_pv_pretty) || defined(NEED_pv_pretty_GLOBAL)
-
-#ifdef pv_pretty
-#  undef pv_pretty
-#endif
-#define pv_pretty(a,b,c,d,e,f,g) DPPP_(my_pv_pretty)(aTHX_ a,b,c,d,e,f,g)
-#define Perl_pv_pretty DPPP_(my_pv_pretty)
-
-
-char *
-DPPP_(my_pv_pretty)(pTHX_ SV *dsv, char const * const str, const STRLEN count,
-  const STRLEN max, char const * const start_color, char const * const end_color,
-  const U32 flags)
-{
-    const U8 dq = (flags & PERL_PV_PRETTY_QUOTE) ? '"' : '%';
-    STRLEN escaped;
-
-    if (!(flags & PERL_PV_PRETTY_NOCLEAR))
-        sv_setpvs(dsv, "");
-
-    if (dq == '"')
-        sv_catpvs(dsv, "\"");
-    else if (flags & PERL_PV_PRETTY_LTGT)
-        sv_catpvs(dsv, "<");
-
-    if (start_color != NULL)
-        sv_catpv(dsv, D_PPP_CONSTPV_ARG(start_color));
-
-    pv_escape(dsv, str, count, max, &escaped, flags | PERL_PV_ESCAPE_NOCLEAR);
-
-    if (end_color != NULL)
-        sv_catpv(dsv, D_PPP_CONSTPV_ARG(end_color));
-
-    if (dq == '"')
-        sv_catpvs(dsv, "\"");
-    else if (flags & PERL_PV_PRETTY_LTGT)
-        sv_catpvs(dsv, ">");
-
-    if ((flags & PERL_PV_PRETTY_ELLIPSES) && escaped < count)
-        sv_catpvs(dsv, "...");
-
-    return SvPVX(dsv);
-}
-
-#endif
-#endif
-
-#ifndef pv_display
-#if defined(NEED_pv_display)
-static char * DPPP_(my_pv_display)(pTHX_ SV * dsv, const char * pv, STRLEN cur, STRLEN len, STRLEN pvlim);
-static
-#else
-extern char * DPPP_(my_pv_display)(pTHX_ SV * dsv, const char * pv, STRLEN cur, STRLEN len, STRLEN pvlim);
-#endif
-
-#if defined(NEED_pv_display) || defined(NEED_pv_display_GLOBAL)
-
-#ifdef pv_display
-#  undef pv_display
-#endif
-#define pv_display(a,b,c,d,e) DPPP_(my_pv_display)(aTHX_ a,b,c,d,e)
-#define Perl_pv_display DPPP_(my_pv_display)
-
-
-char *
-DPPP_(my_pv_display)(pTHX_ SV *dsv, const char *pv, STRLEN cur, STRLEN len, STRLEN pvlim)
-{
-    pv_pretty(dsv, pv, cur, pvlim, NULL, NULL, PERL_PV_PRETTY_DUMP);
-    if (len > cur && pv[cur] == '\0')
-        sv_catpvs(dsv, "\\0");
-    return SvPVX(dsv);
-}
-
-#endif
-#endif
-
-#endif /* _P_P_PORTABILITY_H_ */
-
-/* End of File ppport.h */
index e763cba..aa540c6 100644 (file)
@@ -35,8 +35,7 @@ sub MY::libscan
     my $path = shift;
 
     return undef
-        if $path =~ /^(?:RCS|CVS|SCCS|\.svn|_darcs)$/ ||
-           $path =~ /(~|\.bak|_bak)$/ ||
+        if $path =~ /(~|\.bak|_bak)$/ ||
            $path =~ /\..*\.sw(o|p)$/  ||
            $path =~ /\B\.svn\b/;
 
diff --git a/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/suppressions.asan b/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/suppressions.asan
deleted file mode 100644 (file)
index ac5f399..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-# suppressions file for address sanitizer
-
-leak:Perl_yylex
-leak:Perl_yyparse
-leak:Perl_init_i18nl10n
-leak:Perl_newSTATEOP
-leak:S_optimize_op
-leak:Perl_re_op_compile
-leak:S_doeval_compile
-leak:Perl_re_dup_guts
diff --git a/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/t/000prereq.t b/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/t/000prereq.t
deleted file mode 100644 (file)
index 6e426cb..0000000
+++ /dev/null
@@ -1,223 +0,0 @@
-BEGIN {
-    if ($ENV{PERL_CORE}) {
-        chdir 't' if -d 't';
-        @INC = ("../lib", "lib/compress");
-    }
-}
-
-use lib qw(t t/compress);
-use strict ;
-use warnings ;
-
-use Test::More ;
-
-BEGIN
-{
-
-    diag "Running Perl version  $]\n";
-
-    # use Test::NoWarnings, if available
-    my $extra = 0 ;
-    $extra = 1
-        if eval { require Test::NoWarnings ;  import Test::NoWarnings; 1 };
-
-
-    my $VERSION = '2.202';
-    my @NAMES = qw(
-
-                       );
-
-    my @OPT = qw(
-
-                       );
-
-    plan tests => 1 + @NAMES + @OPT + $extra ;
-
-    ok 1;
-
-    foreach my $name (@NAMES)
-    {
-        use_ok($name, $VERSION);
-    }
-
-
-    foreach my $name (@OPT)
-    {
-        eval " require $name " ;
-        if ($@)
-        {
-            ok 1, "$name not available"
-        }
-        else
-        {
-            my $ver = eval("\$${name}::VERSION");
-            is $ver, $VERSION, "$name version should be $VERSION"
-                or diag "$name version is $ver, need $VERSION" ;
-        }
-    }
-
-}
-
-sub bit
-{
-    return 1 << $_[0];
-}
-
-{
-    # Print our versions of all modules used
-
-    use Compress::Raw::Zlib;
-
-    my @results = ( [ 'Perl', $] ] );
-    my @modules = qw(
-                    Compress::Raw::Zlib
-                    );
-
-    my %have = ();
-
-    for my $module (@modules)
-    {
-        my $ver = packageVer($module) ;
-        my $v = defined $ver
-                    ? $ver
-                    : "Not Installed" ;
-        push @results, [$module, $v] ;
-        $have{$module} ++
-            if $ver ;
-    }
-
-    push @results, ['',''];
-    push @results, ["zlib_version (from zlib library)", Compress::Raw::Zlib::zlib_version() ];
-    push @results, ["ZLIB_VERSION (from zlib.h)", Compress::Raw::Zlib::ZLIB_VERSION ];
-    push @results, ["ZLIB_VERNUM", sprintf("0x%x", Compress::Raw::Zlib::ZLIB_VERNUM) ];
-    push @results, ['',''];
-
-    push @results, ['BUILD_ZLIB',  $Compress::Raw::Zlib::BUILD_ZLIB];
-    push @results, ['GZIP_OS_CODE',  $Compress::Raw::Zlib::gzip_os_code];
-    push @results, ['',''];
-
-    if (Compress::Raw::Zlib::is_zlibng)
-    {
-        push @results, ["Using zlib-ng", "Yes" ];
-
-        push @results, ["zlibng_version", Compress::Raw::Zlib::zlibng_version() ];
-
-        if (Compress::Raw::Zlib::is_zlibng_compat)
-        {
-            push @results, ["zlib-ng Mode", "Compat" ];
-        }
-        else
-        {
-            push @results, ["zlib-ng Mode", "Native" ];
-        }
-
-        my @ng = qw(
-            ZLIBNG_VERSION
-            ZLIBNG_VER_MAJOR
-            ZLIBNG_VER_MINOR
-            ZLIBNG_VER_REVISION
-            ZLIBNG_VER_STATUS
-            ZLIBNG_VER_MODIFIED
-            );
-
-        for my $n (@ng)
-        {
-            no strict 'refs';
-            push @results, ["  $n", &{ "Compress::Raw::Zlib::$n" } ];
-        }
-
-        no strict 'refs';
-        push @results, ["  ZLIBNG_VERNUM", sprintf("0x%x", &{ "Compress::Raw::Zlib::ZLIBNG_VERNUM" }) ];
-
-    }
-    else
-    {
-        push @results, ["Using zlib-ng", "No" ];
-    }
-
-    push @results, ['',''];
-    push @results, ["is_zlib_native",   Compress::Raw::Zlib::is_zlib_native() ? 1 : 0 ];
-    push @results, ["is_zlibng",        Compress::Raw::Zlib::is_zlibng() ?1 : 0];
-    push @results, ["is_zlibng_native", Compress::Raw::Zlib::is_zlibng_native() ? 1 : 0 ];
-    push @results, ["is_zlibng_compat", Compress::Raw::Zlib::is_zlibng_compat() ? 1 : 0];
-
-
-    my $zlib_h = ZLIB_VERSION ;
-    my $libz   = Compress::Raw::Zlib::zlib_version;
-    my $ZLIB_VERNUM = sprintf ("0x%X", Compress::Raw::Zlib::ZLIB_VERNUM()) ;
-    my $flags = Compress::Raw::Zlib::zlibCompileFlags();
-
-    push @results, ['',''];
-    push @results, ['zlibCompileFlags', $flags];
-    push @results, ['  Type Sizes', ''];
-
-    my %sizes = (
-        0   => '16 bit',
-        1   => '32 bit',
-        2   => '64 bit',
-        3   => 'other'
-    );
-
-    push @results, ['    size of uInt',      $sizes{ ($flags >> 0) & 0x3 } ];
-    push @results, ['    size of uLong',     $sizes{ ($flags >> 2) & 0x3 } ];
-    push @results, ['    size of pointer',   $sizes{ ($flags >> 4) & 0x3 } ];
-    push @results, ['    size of z_off_t',   $sizes{ ($flags >> 6) & 0x3 } ];
-
-    my @compiler_options;
-    push @compiler_options, 'ZLIB_DEBUG'  if $flags & bit(8) ;
-    push @compiler_options, 'ASM'         if $flags & bit(9) ;
-    push @compiler_options, 'ZLIB_WINAPI' if $flags & bit(10) ;
-    push @compiler_options, 'None'        unless @compiler_options;
-    push @results, ['  Compiler Options', join ", ", @compiler_options];
-
-    my @one_time;
-    push @one_time, 'BUILDFIXED'  if $flags & bit(12) ;
-    push @one_time, 'DYNAMIC_CRC_TABLE'  if $flags & bit(13) ;
-    push @one_time, 'None'        unless @one_time;
-    push @results, ['  One-time table building', join ", ", @one_time];
-
-    my @library;
-    push @library, 'NO_GZCOMPRESS'  if $flags & bit(16) ;
-    push @library, 'NO_GZIP'  if $flags & bit(17) ;
-    push @library, 'None'        unless @library;
-    push @results, ['  Library content', join ", ", @library];
-
-    my @operational;
-    push @operational, 'PKZIP_BUG_WORKAROUND'  if $flags & bit(20) ;
-    push @operational, 'FASTEST'  if $flags & bit(21) ;
-    push @operational, 'None'        unless @operational;
-    push @results, ['  Operation variations', join ", ", @operational];
-
-
-
-    if ($have{"Compress::Raw::Lzma"})
-    {
-        my $ver = eval { Compress::Raw::Lzma::lzma_version_string(); } || "unknown";
-        push @results, ["lzma", $ver] ;
-    }
-
-    use List::Util qw(max);
-    my $width = max map { length $_->[0] } @results;
-
-    diag "\n\n" ;
-    for my $m (@results)
-    {
-        my ($name, $ver) = @$m;
-
-        my $b = " " x (1 + $width - length $name);
-
-        diag $name . $b . $ver . "\n" ;
-    }
-
-    diag "\n\n" ;
-}
-
-sub packageVer
-{
-    no strict 'refs';
-    my $package = shift;
-
-    eval "use $package;";
-    return ${ "${package}::VERSION" };
-
-}
\ No newline at end of file
diff --git a/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/t/99pod.t b/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/t/99pod.t
deleted file mode 100644 (file)
index 5abb63d..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-BEGIN {
-    if ($ENV{PERL_CORE}) {
-       chdir 't' if -d 't';
-       @INC = ("../lib", "lib/compress");
-    }
-}
-
-use lib qw(t t/compress);
-use Test::More;
-
-eval "use Test::Pod 1.00";
-
-plan skip_all => "Test::Pod 1.00 required for testing POD" if $@;
-
-all_pod_files_ok();
diff --git a/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/t/Test/Builder.pm b/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/t/Test/Builder.pm
deleted file mode 100644 (file)
index 29b6e1c..0000000
+++ /dev/null
@@ -1,1625 +0,0 @@
-package Test::Builder;
-
-use 5.004;
-
-# $^C was only introduced in 5.005-ish.  We do this to prevent
-# use of uninitialized value warnings in older perls.
-$^C ||= 0;
-
-use strict;
-our ($VERSION);
-$VERSION = '0.30';
-$VERSION = eval $VERSION;    # make the alpha version come out as a number
-
-# Make Test::Builder thread-safe for ithreads.
-BEGIN {
-    use Config;
-    # Load threads::shared when threads are turned on
-    if( $] >= 5.008 && $Config{useithreads} && $INC{'threads.pm'}) {
-        require threads::shared;
-
-        # Hack around YET ANOTHER threads::shared bug.  It would 
-        # occassionally forget the contents of the variable when sharing it.
-        # So we first copy the data, then share, then put our copy back.
-        *share = sub (\[$@%]) {
-            my $type = ref $_[0];
-            my $data;
-
-            if( $type eq 'HASH' ) {
-                %$data = %{$_[0]};
-            }
-            elsif( $type eq 'ARRAY' ) {
-                @$data = @{$_[0]};
-            }
-            elsif( $type eq 'SCALAR' ) {
-                $$data = ${$_[0]};
-            }
-            else {
-                die "Unknown type: ".$type;
-            }
-
-            $_[0] = &threads::shared::share($_[0]);
-
-            if( $type eq 'HASH' ) {
-                %{$_[0]} = %$data;
-            }
-            elsif( $type eq 'ARRAY' ) {
-                @{$_[0]} = @$data;
-            }
-            elsif( $type eq 'SCALAR' ) {
-                ${$_[0]} = $$data;
-            }
-            else {
-                die "Unknown type: ".$type;
-            }
-
-            return $_[0];
-        };
-    }
-    # 5.8.0's threads::shared is busted when threads are off.
-    # We emulate it here.
-    else {
-        *share = sub { return $_[0] };
-        *lock  = sub { 0 };
-    }
-}
-
-
-=head1 NAME
-
-Test::Builder - Backend for building test libraries
-
-=head1 SYNOPSIS
-
-  package My::Test::Module;
-  use Test::Builder;
-  require Exporter;
-  @ISA = qw(Exporter);
-  @EXPORT = qw(ok);
-
-  my $Test = Test::Builder->new;
-  $Test->output('my_logfile');
-
-  sub import {
-      my($self) = shift;
-      my $pack = caller;
-
-      $Test->exported_to($pack);
-      $Test->plan(@_);
-
-      $self->export_to_level(1, $self, 'ok');
-  }
-
-  sub ok {
-      my($test, $name) = @_;
-
-      $Test->ok($test, $name);
-  }
-
-
-=head1 DESCRIPTION
-
-Test::Simple and Test::More have proven to be popular testing modules,
-but they're not always flexible enough.  Test::Builder provides the a
-building block upon which to write your own test libraries I<which can
-work together>.
-
-=head2 Construction
-
-=over 4
-
-=item B<new>
-
-  my $Test = Test::Builder->new;
-
-Returns a Test::Builder object representing the current state of the
-test.
-
-Since you only run one test per program C<new> always returns the same
-Test::Builder object.  No matter how many times you call new(), you're
-getting the same object.  This is called a singleton.  This is done so that
-multiple modules share such global information as the test counter and
-where test output is going.
-
-If you want a completely new Test::Builder object different from the
-singleton, use C<create>.
-
-=cut
-
-my $Test = Test::Builder->new;
-sub new {
-    my($class) = shift;
-    $Test ||= $class->create;
-    return $Test;
-}
-
-
-=item B<create>
-
-  my $Test = Test::Builder->create;
-
-Ok, so there can be more than one Test::Builder object and this is how
-you get it.  You might use this instead of C<new()> if you're testing
-a Test::Builder based module, but otherwise you probably want C<new>.
-
-B<NOTE>: the implementation is not complete.  C<level>, for example, is
-still shared amongst B<all> Test::Builder objects, even ones created using
-this method.  Also, the method name may change in the future.
-
-=cut
-
-sub create {
-    my $class = shift;
-
-    my $self = bless {}, $class;
-    $self->reset;
-
-    return $self;
-}
-
-=item B<reset>
-
-  $Test->reset;
-
-Reinitializes the Test::Builder singleton to its original state.
-Mostly useful for tests run in persistent environments where the same
-test might be run multiple times in the same process.
-
-=cut
-
-our ($Level);
-
-sub reset {
-    my ($self) = @_;
-
-    # We leave this a global because it has to be localized and localizing
-    # hash keys is just asking for pain.  Also, it was documented.
-    $Level = 1;
-
-    $self->{Test_Died}    = 0;
-    $self->{Have_Plan}    = 0;
-    $self->{No_Plan}      = 0;
-    $self->{Original_Pid} = $$;
-
-    share($self->{Curr_Test});
-    $self->{Curr_Test}    = 0;
-    $self->{Test_Results} = &share([]);
-
-    $self->{Exported_To}    = undef;
-    $self->{Expected_Tests} = 0;
-
-    $self->{Skip_All}   = 0;
-
-    $self->{Use_Nums}   = 1;
-
-    $self->{No_Header}  = 0;
-    $self->{No_Ending}  = 0;
-
-    $self->_dup_stdhandles unless $^C;
-
-    return undef;
-}
-
-=back
-
-=head2 Setting up tests
-
-These methods are for setting up tests and declaring how many there
-are.  You usually only want to call one of these methods.
-
-=over 4
-
-=item B<exported_to>
-
-  my $pack = $Test->exported_to;
-  $Test->exported_to($pack);
-
-Tells Test::Builder what package you exported your functions to.
-This is important for getting TODO tests right.
-
-=cut
-
-sub exported_to {
-    my($self, $pack) = @_;
-
-    if( defined $pack ) {
-        $self->{Exported_To} = $pack;
-    }
-    return $self->{Exported_To};
-}
-
-=item B<plan>
-
-  $Test->plan('no_plan');
-  $Test->plan( skip_all => $reason );
-  $Test->plan( tests => $num_tests );
-
-A convenient way to set up your tests.  Call this and Test::Builder
-will print the appropriate headers and take the appropriate actions.
-
-If you call plan(), don't call any of the other methods below.
-
-=cut
-
-sub plan {
-    my($self, $cmd, $arg) = @_;
-
-    return unless $cmd;
-
-    if( $self->{Have_Plan} ) {
-        die sprintf "You tried to plan twice!  Second plan at %s line %d\n",
-          ($self->caller)[1,2];
-    }
-
-    if( $cmd eq 'no_plan' ) {
-        $self->no_plan;
-    }
-    elsif( $cmd eq 'skip_all' ) {
-        return $self->skip_all($arg);
-    }
-    elsif( $cmd eq 'tests' ) {
-        if( $arg ) {
-            return $self->expected_tests($arg);
-        }
-        elsif( !defined $arg ) {
-            die "Got an undefined number of tests.  Looks like you tried to ".
-                "say how many tests you plan to run but made a mistake.\n";
-        }
-        elsif( !$arg ) {
-            die "You said to run 0 tests!  You've got to run something.\n";
-        }
-    }
-    else {
-        require Carp;
-        my @args = grep { defined } ($cmd, $arg);
-        Carp::croak("plan() doesn't understand @args");
-    }
-
-    return 1;
-}
-
-=item B<expected_tests>
-
-    my $max = $Test->expected_tests;
-    $Test->expected_tests($max);
-
-Gets/sets the # of tests we expect this test to run and prints out
-the appropriate headers.
-
-=cut
-
-sub expected_tests {
-    my $self = shift;
-    my($max) = @_;
-
-    if( @_ ) {
-        die "Number of tests must be a postive integer.  You gave it '$max'.\n"
-          unless $max =~ /^\+?\d+$/ and $max > 0;
-
-        $self->{Expected_Tests} = $max;
-        $self->{Have_Plan}      = 1;
-
-        $self->_print("1..$max\n") unless $self->no_header;
-    }
-    return $self->{Expected_Tests};
-}
-
-
-=item B<no_plan>
-
-  $Test->no_plan;
-
-Declares that this test will run an indeterminate # of tests.
-
-=cut
-
-sub no_plan {
-    my $self = shift;
-
-    $self->{No_Plan}   = 1;
-    $self->{Have_Plan} = 1;
-}
-
-=item B<has_plan>
-
-  $plan = $Test->has_plan
-
-Find out whether a plan has been defined. $plan is either C<undef> (no plan has been set), C<no_plan> (indeterminate # of tests) or an integer (the number of expected tests).
-
-=cut
-
-sub has_plan {
-    my $self = shift;
-
-    return($self->{Expected_Tests}) if $self->{Expected_Tests};
-    return('no_plan') if $self->{No_Plan};
-    return(undef);
-};
-
-
-=item B<skip_all>
-
-  $Test->skip_all;
-  $Test->skip_all($reason);
-
-Skips all the tests, using the given $reason.  Exits immediately with 0.
-
-=cut
-
-sub skip_all {
-    my($self, $reason) = @_;
-
-    my $out = "1..0";
-    $out .= " # Skip $reason" if $reason;
-    $out .= "\n";
-
-    $self->{Skip_All} = 1;
-
-    $self->_print($out) unless $self->no_header;
-    exit(0);
-}
-
-=back
-
-=head2 Running tests
-
-These actually run the tests, analogous to the functions in
-Test::More.
-
-$name is always optional.
-
-=over 4
-
-=item B<ok>
-
-  $Test->ok($test, $name);
-
-Your basic test.  Pass if $test is true, fail if $test is false.  Just
-like Test::Simple's ok().
-
-=cut
-
-sub ok {
-    my($self, $test, $name) = @_;
-
-    # $test might contain an object which we don't want to accidentally
-    # store, so we turn it into a boolean.
-    $test = $test ? 1 : 0;
-
-    unless( $self->{Have_Plan} ) {
-        require Carp;
-        Carp::croak("You tried to run a test without a plan!  Gotta have a plan.");
-    }
-
-    lock $self->{Curr_Test};
-    $self->{Curr_Test}++;
-
-    # In case $name is a string overloaded object, force it to stringify.
-    $self->_unoverload(\$name);
-
-    $self->diag(<<ERR) if defined $name and $name =~ /^[\d\s]+$/;
-    You named your test '$name'.  You shouldn't use numbers for your test names.
-    Very confusing.
-ERR
-
-    my($pack, $file, $line) = $self->caller;
-
-    my $todo = $self->todo($pack);
-    $self->_unoverload(\$todo);
-
-    my $out;
-    my $result = &share({});
-
-    unless( $test ) {
-        $out .= "not ";
-        @$result{ 'ok', 'actual_ok' } = ( ( $todo ? 1 : 0 ), 0 );
-    }
-    else {
-        @$result{ 'ok', 'actual_ok' } = ( 1, $test );
-    }
-
-    $out .= "ok";
-    $out .= " $self->{Curr_Test}" if $self->use_numbers;
-
-    if( defined $name ) {
-        $name =~ s|#|\\#|g;     # # in a name can confuse Test::Harness.
-        $out   .= " - $name";
-        $result->{name} = $name;
-    }
-    else {
-        $result->{name} = '';
-    }
-
-    if( $todo ) {
-        $out   .= " # TODO $todo";
-        $result->{reason} = $todo;
-        $result->{type}   = 'todo';
-    }
-    else {
-        $result->{reason} = '';
-        $result->{type}   = '';
-    }
-
-    $self->{Test_Results}[$self->{Curr_Test}-1] = $result;
-    $out .= "\n";
-
-    $self->_print($out);
-
-    unless( $test ) {
-        my $msg = $todo ? "Failed (TODO)" : "Failed";
-        $self->_print_diag("\n") if $ENV{HARNESS_ACTIVE};
-        $self->diag("    $msg test ($file at line $line)\n");
-    } 
-
-    return $test ? 1 : 0;
-}
-
-
-sub _unoverload {
-    my $self  = shift;
-
-    local($@,$!);
-
-    eval { require overload } || return;
-
-    foreach my $thing (@_) {
-        eval { 
-            if( defined $$thing ) {
-                if( my $string_meth = overload::Method($$thing, '""') ) {
-                    $$thing = $$thing->$string_meth();
-                }
-            }
-        };
-    }
-}
-
-
-=item B<is_eq>
-
-  $Test->is_eq($got, $expected, $name);
-
-Like Test::More's is().  Checks if $got eq $expected.  This is the
-string version.
-
-=item B<is_num>
-
-  $Test->is_num($got, $expected, $name);
-
-Like Test::More's is().  Checks if $got == $expected.  This is the
-numeric version.
-
-=cut
-
-sub is_eq {
-    my($self, $got, $expect, $name) = @_;
-    local $Level = $Level + 1;
-
-    if( !defined $got || !defined $expect ) {
-        # undef only matches undef and nothing else
-        my $test = !defined $got && !defined $expect;
-
-        $self->ok($test, $name);
-        $self->_is_diag($got, 'eq', $expect) unless $test;
-        return $test;
-    }
-
-    return $self->cmp_ok($got, 'eq', $expect, $name);
-}
-
-sub is_num {
-    my($self, $got, $expect, $name) = @_;
-    local $Level = $Level + 1;
-
-    if( !defined $got || !defined $expect ) {
-        # undef only matches undef and nothing else
-        my $test = !defined $got && !defined $expect;
-
-        $self->ok($test, $name);
-        $self->_is_diag($got, '==', $expect) unless $test;
-        return $test;
-    }
-
-    return $self->cmp_ok($got, '==', $expect, $name);
-}
-
-sub _is_diag {
-    my($self, $got, $type, $expect) = @_;
-
-    foreach my $val (\$got, \$expect) {
-        if( defined $$val ) {
-            if( $type eq 'eq' ) {
-                # quote and force string context
-                $$val = "'$$val'"
-            }
-            else {
-                # force numeric context
-                $$val = $$val+0;
-            }
-        }
-        else {
-            $$val = 'undef';
-        }
-    }
-
-    return $self->diag(sprintf <<DIAGNOSTIC, $got, $expect);
-         got: %s
-    expected: %s
-DIAGNOSTIC
-
-}    
-
-=item B<isnt_eq>
-
-  $Test->isnt_eq($got, $dont_expect, $name);
-
-Like Test::More's isnt().  Checks if $got ne $dont_expect.  This is
-the string version.
-
-=item B<isnt_num>
-
-  $Test->is_num($got, $dont_expect, $name);
-
-Like Test::More's isnt().  Checks if $got ne $dont_expect.  This is
-the numeric version.
-
-=cut
-
-sub isnt_eq {
-    my($self, $got, $dont_expect, $name) = @_;
-    local $Level = $Level + 1;
-
-    if( !defined $got || !defined $dont_expect ) {
-        # undef only matches undef and nothing else
-        my $test = defined $got || defined $dont_expect;
-
-        $self->ok($test, $name);
-        $self->_cmp_diag($got, 'ne', $dont_expect) unless $test;
-        return $test;
-    }
-
-    return $self->cmp_ok($got, 'ne', $dont_expect, $name);
-}
-
-sub isnt_num {
-    my($self, $got, $dont_expect, $name) = @_;
-    local $Level = $Level + 1;
-
-    if( !defined $got || !defined $dont_expect ) {
-        # undef only matches undef and nothing else
-        my $test = defined $got || defined $dont_expect;
-
-        $self->ok($test, $name);
-        $self->_cmp_diag($got, '!=', $dont_expect) unless $test;
-        return $test;
-    }
-
-    return $self->cmp_ok($got, '!=', $dont_expect, $name);
-}
-
-
-=item B<like>
-
-  $Test->like($this, qr/$regex/, $name);
-  $Test->like($this, '/$regex/', $name);
-
-Like Test::More's like().  Checks if $this matches the given $regex.
-
-You'll want to avoid qr// if you want your tests to work before 5.005.
-
-=item B<unlike>
-
-  $Test->unlike($this, qr/$regex/, $name);
-  $Test->unlike($this, '/$regex/', $name);
-
-Like Test::More's unlike().  Checks if $this B<does not match> the
-given $regex.
-
-=cut
-
-sub like {
-    my($self, $this, $regex, $name) = @_;
-
-    local $Level = $Level + 1;
-    $self->_regex_ok($this, $regex, '=~', $name);
-}
-
-sub unlike {
-    my($self, $this, $regex, $name) = @_;
-
-    local $Level = $Level + 1;
-    $self->_regex_ok($this, $regex, '!~', $name);
-}
-
-=item B<maybe_regex>
-
-  $Test->maybe_regex(qr/$regex/);
-  $Test->maybe_regex('/$regex/');
-
-Convenience method for building testing functions that take regular
-expressions as arguments, but need to work before perl 5.005.
-
-Takes a quoted regular expression produced by qr//, or a string
-representing a regular expression.
-
-Returns a Perl value which may be used instead of the corresponding
-regular expression, or undef if it's argument is not recognised.
-
-For example, a version of like(), sans the useful diagnostic messages,
-could be written as:
-
-  sub laconic_like {
-      my ($self, $this, $regex, $name) = @_;
-      my $usable_regex = $self->maybe_regex($regex);
-      die "expecting regex, found '$regex'\n"
-          unless $usable_regex;
-      $self->ok($this =~ m/$usable_regex/, $name);
-  }
-
-=cut
-
-
-sub maybe_regex {
-    my ($self, $regex) = @_;
-    my $usable_regex = undef;
-
-    return $usable_regex unless defined $regex;
-
-    my($re, $opts);
-
-    # Check for qr/foo/
-    if( ref $regex eq 'Regexp' ) {
-        $usable_regex = $regex;
-    }
-    # Check for '/foo/' or 'm,foo,'
-    elsif( ($re, $opts)        = $regex =~ m{^ /(.*)/ (\w*) $ }sx           or
-           (undef, $re, $opts) = $regex =~ m,^ m([^\w\s]) (.+) \1 (\w*) $,sx
-         )
-    {
-        $usable_regex = length $opts ? "(?$opts)$re" : $re;
-    }
-
-    return $usable_regex;
-};
-
-sub _regex_ok {
-    my($self, $this, $regex, $cmp, $name) = @_;
-
-    local $Level = $Level + 1;
-
-    my $ok = 0;
-    my $usable_regex = $self->maybe_regex($regex);
-    unless (defined $usable_regex) {
-        $ok = $self->ok( 0, $name );
-        $self->diag("    '$regex' doesn't look much like a regex to me.");
-        return $ok;
-    }
-
-    {
-        local $^W = 0;
-        my $test = $this =~ /$usable_regex/ ? 1 : 0;
-        $test = !$test if $cmp eq '!~';
-        $ok = $self->ok( $test, $name );
-    }
-
-    unless( $ok ) {
-        $this = defined $this ? "'$this'" : 'undef';
-        my $match = $cmp eq '=~' ? "doesn't match" : "matches";
-        $self->diag(sprintf <<DIAGNOSTIC, $this, $match, $regex);
-                  %s
-    %13s '%s'
-DIAGNOSTIC
-
-    }
-
-    return $ok;
-}
-
-=item B<cmp_ok>
-
-  $Test->cmp_ok($this, $type, $that, $name);
-
-Works just like Test::More's cmp_ok().
-
-    $Test->cmp_ok($big_num, '!=', $other_big_num);
-
-=cut
-
-sub cmp_ok {
-    my($self, $got, $type, $expect, $name) = @_;
-
-    my $test;
-    {
-        local $^W = 0;
-        local($@,$!);   # don't interfere with $@
-                        # eval() sometimes resets $!
-        $test = eval "\$got $type \$expect";
-    }
-    local $Level = $Level + 1;
-    my $ok = $self->ok($test, $name);
-
-    unless( $ok ) {
-        if( $type =~ /^(eq|==)$/ ) {
-            $self->_is_diag($got, $type, $expect);
-        }
-        else {
-            $self->_cmp_diag($got, $type, $expect);
-        }
-    }
-    return $ok;
-}
-
-sub _cmp_diag {
-    my($self, $got, $type, $expect) = @_;
-    
-    $got    = defined $got    ? "'$got'"    : 'undef';
-    $expect = defined $expect ? "'$expect'" : 'undef';
-    return $self->diag(sprintf <<DIAGNOSTIC, $got, $type, $expect);
-    %s
-        %s
-    %s
-DIAGNOSTIC
-}
-
-=item B<BAILOUT>
-
-    $Test->BAILOUT($reason);
-
-Indicates to the Test::Harness that things are going so badly all
-testing should terminate.  This includes running any additional test
-scripts.
-
-It will exit with 255.
-
-=cut
-
-sub BAILOUT {
-    my($self, $reason) = @_;
-
-    $self->_print("Bail out!  $reason");
-    exit 255;
-}
-
-=item B<skip>
-
-    $Test->skip;
-    $Test->skip($why);
-
-Skips the current test, reporting $why.
-
-=cut
-
-sub skip {
-    my($self, $why) = @_;
-    $why ||= '';
-    $self->_unoverload(\$why);
-
-    unless( $self->{Have_Plan} ) {
-        require Carp;
-        Carp::croak("You tried to run tests without a plan!  Gotta have a plan.");
-    }
-
-    lock($self->{Curr_Test});
-    $self->{Curr_Test}++;
-
-    $self->{Test_Results}[$self->{Curr_Test}-1] = &share({
-        'ok'      => 1,
-        actual_ok => 1,
-        name      => '',
-        type      => 'skip',
-        reason    => $why,
-    });
-
-    my $out = "ok";
-    $out   .= " $self->{Curr_Test}" if $self->use_numbers;
-    $out   .= " # skip";
-    $out   .= " $why"       if length $why;
-    $out   .= "\n";
-
-    $self->_print($out);
-
-    return 1;
-}
-
-
-=item B<todo_skip>
-
-  $Test->todo_skip;
-  $Test->todo_skip($why);
-
-Like skip(), only it will declare the test as failing and TODO.  Similar
-to
-
-    print "not ok $tnum # TODO $why\n";
-
-=cut
-
-sub todo_skip {
-    my($self, $why) = @_;
-    $why ||= '';
-
-    unless( $self->{Have_Plan} ) {
-        require Carp;
-        Carp::croak("You tried to run tests without a plan!  Gotta have a plan.");
-    }
-
-    lock($self->{Curr_Test});
-    $self->{Curr_Test}++;
-
-    $self->{Test_Results}[$self->{Curr_Test}-1] = &share({
-        'ok'      => 1,
-        actual_ok => 0,
-        name      => '',
-        type      => 'todo_skip',
-        reason    => $why,
-    });
-
-    my $out = "not ok";
-    $out   .= " $self->{Curr_Test}" if $self->use_numbers;
-    $out   .= " # TODO & SKIP $why\n";
-
-    $self->_print($out);
-
-    return 1;
-}
-
-
-=begin _unimplemented
-
-=item B<skip_rest>
-
-  $Test->skip_rest;
-  $Test->skip_rest($reason);
-
-Like skip(), only it skips all the rest of the tests you plan to run
-and terminates the test.
-
-If you're running under no_plan, it skips once and terminates the
-test.
-
-=end _unimplemented
-
-=back
-
-
-=head2 Test style
-
-=over 4
-
-=item B<level>
-
-    $Test->level($how_high);
-
-How far up the call stack should $Test look when reporting where the
-test failed.
-
-Defaults to 1.
-
-Setting $Test::Builder::Level overrides.  This is typically useful
-localized:
-
-    {
-        local $Test::Builder::Level = 2;
-        $Test->ok($test);
-    }
-
-=cut
-
-sub level {
-    my($self, $level) = @_;
-
-    if( defined $level ) {
-        $Level = $level;
-    }
-    return $Level;
-}
-
-
-=item B<use_numbers>
-
-    $Test->use_numbers($on_or_off);
-
-Whether or not the test should output numbers.  That is, this if true:
-
-  ok 1
-  ok 2
-  ok 3
-
-or this if false
-
-  ok
-  ok
-  ok
-
-Most useful when you can't depend on the test output order, such as
-when threads or forking is involved.
-
-Test::Harness will accept either, but avoid mixing the two styles.
-
-Defaults to on.
-
-=cut
-
-sub use_numbers {
-    my($self, $use_nums) = @_;
-
-    if( defined $use_nums ) {
-        $self->{Use_Nums} = $use_nums;
-    }
-    return $self->{Use_Nums};
-}
-
-=item B<no_header>
-
-    $Test->no_header($no_header);
-
-If set to true, no "1..N" header will be printed.
-
-=item B<no_ending>
-
-    $Test->no_ending($no_ending);
-
-Normally, Test::Builder does some extra diagnostics when the test
-ends.  It also changes the exit code as described below.
-
-If this is true, none of that will be done.
-
-=cut
-
-sub no_header {
-    my($self, $no_header) = @_;
-
-    if( defined $no_header ) {
-        $self->{No_Header} = $no_header;
-    }
-    return $self->{No_Header};
-}
-
-sub no_ending {
-    my($self, $no_ending) = @_;
-
-    if( defined $no_ending ) {
-        $self->{No_Ending} = $no_ending;
-    }
-    return $self->{No_Ending};
-}
-
-
-=back
-
-=head2 Output
-
-Controlling where the test output goes.
-
-It's ok for your test to change where STDOUT and STDERR point to,
-Test::Builder's default output settings will not be affected.
-
-=over 4
-
-=item B<diag>
-
-    $Test->diag(@msgs);
-
-Prints out the given @msgs.  Like C<print>, arguments are simply
-appended together.
-
-Normally, it uses the failure_output() handle, but if this is for a
-TODO test, the todo_output() handle is used.
-
-Output will be indented and marked with a # so as not to interfere
-with test output.  A newline will be put on the end if there isn't one
-already.
-
-We encourage using this rather than calling print directly.
-
-Returns false.  Why?  Because diag() is often used in conjunction with
-a failing test (C<ok() || diag()>) it "passes through" the failure.
-
-    return ok(...) || diag(...);
-
-=for blame transfer
-Mark Fowler <mark@twoshortplanks.com>
-
-=cut
-
-sub diag {
-    my($self, @msgs) = @_;
-    return unless @msgs;
-
-    # Prevent printing headers when compiling (i.e. -c)
-    return if $^C;
-
-    # Smash args together like print does.
-    # Convert undef to 'undef' so its readable.
-    my $msg = join '', map { defined($_) ? $_ : 'undef' } @msgs;
-
-    # Escape each line with a #.
-    $msg =~ s/^/# /gm;
-
-    # Stick a newline on the end if it needs it.
-    $msg .= "\n" unless $msg =~ /\n\Z/;
-
-    local $Level = $Level + 1;
-    $self->_print_diag($msg);
-
-    return 0;
-}
-
-=begin _private
-
-=item B<_print>
-
-    $Test->_print(@msgs);
-
-Prints to the output() filehandle.
-
-=end _private
-
-=cut
-
-sub _print {
-    my($self, @msgs) = @_;
-
-    # Prevent printing headers when only compiling.  Mostly for when
-    # tests are deparsed with B::Deparse
-    return if $^C;
-
-    my $msg = join '', @msgs;
-
-    local($\, $", $,) = (undef, ' ', '');
-    my $fh = $self->output;
-
-    # Escape each line after the first with a # so we don't
-    # confuse Test::Harness.
-    $msg =~ s/\n(.)/\n# $1/sg;
-
-    # Stick a newline on the end if it needs it.
-    $msg .= "\n" unless $msg =~ /\n\Z/;
-
-    print $fh $msg;
-}
-
-
-=item B<_print_diag>
-
-    $Test->_print_diag(@msg);
-
-Like _print, but prints to the current diagnostic filehandle.
-
-=cut
-
-sub _print_diag {
-    my $self = shift;
-
-    local($\, $", $,) = (undef, ' ', '');
-    my $fh = $self->todo ? $self->todo_output : $self->failure_output;
-    print $fh @_;
-}    
-
-=item B<output>
-
-    $Test->output($fh);
-    $Test->output($file);
-
-Where normal "ok/not ok" test output should go.
-
-Defaults to STDOUT.
-
-=item B<failure_output>
-
-    $Test->failure_output($fh);
-    $Test->failure_output($file);
-
-Where diagnostic output on test failures and diag() should go.
-
-Defaults to STDERR.
-
-=item B<todo_output>
-
-    $Test->todo_output($fh);
-    $Test->todo_output($file);
-
-Where diagnostics about todo test failures and diag() should go.
-
-Defaults to STDOUT.
-
-=cut
-
-sub output {
-    my($self, $fh) = @_;
-
-    if( defined $fh ) {
-        $self->{Out_FH} = _new_fh($fh);
-    }
-    return $self->{Out_FH};
-}
-
-sub failure_output {
-    my($self, $fh) = @_;
-
-    if( defined $fh ) {
-        $self->{Fail_FH} = _new_fh($fh);
-    }
-    return $self->{Fail_FH};
-}
-
-sub todo_output {
-    my($self, $fh) = @_;
-
-    if( defined $fh ) {
-        $self->{Todo_FH} = _new_fh($fh);
-    }
-    return $self->{Todo_FH};
-}
-
-
-sub _new_fh {
-    my($file_or_fh) = shift;
-
-    my $fh;
-    if( _is_fh($file_or_fh) ) {
-        $fh = $file_or_fh;
-    }
-    else {
-        $fh = do { local *FH };
-        open $fh, ">$file_or_fh" or 
-            die "Can't open test output log $file_or_fh: $!";
-       _autoflush($fh);
-    }
-
-    return $fh;
-}
-
-
-sub _is_fh {
-    my $maybe_fh = shift;
-
-    return 1 if ref \$maybe_fh eq 'GLOB'; # its a glob
-
-    return UNIVERSAL::isa($maybe_fh,               'GLOB')       ||
-           UNIVERSAL::isa($maybe_fh,               'IO::Handle') ||
-
-           # 5.5.4's tied() and can() doesn't like getting undef
-           UNIVERSAL::can((tied($maybe_fh) || ''), 'TIEHANDLE');
-}
-
-
-sub _autoflush {
-    my($fh) = shift;
-    my $old_fh = select $fh;
-    $| = 1;
-    select $old_fh;
-}
-
-
-sub _dup_stdhandles {
-    my $self = shift;
-
-    $self->_open_testhandles;
-
-    # Set everything to unbuffered else plain prints to STDOUT will
-    # come out in the wrong order from our own prints.
-    _autoflush(\*TESTOUT);
-    _autoflush(\*STDOUT);
-    _autoflush(\*TESTERR);
-    _autoflush(\*STDERR);
-
-    $self->output(\*TESTOUT);
-    $self->failure_output(\*TESTERR);
-    $self->todo_output(\*TESTOUT);
-}
-
-
-my $Opened_Testhandles = 0;
-sub _open_testhandles {
-    return if $Opened_Testhandles;
-    # We dup STDOUT and STDERR so people can change them in their
-    # test suites while still getting normal test output.
-    open(TESTOUT, ">&STDOUT") or die "Can't dup STDOUT:  $!";
-    open(TESTERR, ">&STDERR") or die "Can't dup STDERR:  $!";
-    $Opened_Testhandles = 1;
-}
-
-
-=back
-
-
-=head2 Test Status and Info
-
-=over 4
-
-=item B<current_test>
-
-    my $curr_test = $Test->current_test;
-    $Test->current_test($num);
-
-Gets/sets the current test number we're on.  You usually shouldn't
-have to set this.
-
-If set forward, the details of the missing tests are filled in as 'unknown'.
-if set backward, the details of the intervening tests are deleted.  You
-can erase history if you really want to.
-
-=cut
-
-sub current_test {
-    my($self, $num) = @_;
-
-    lock($self->{Curr_Test});
-    if( defined $num ) {
-        unless( $self->{Have_Plan} ) {
-            require Carp;
-            Carp::croak("Can't change the current test number without a plan!");
-        }
-
-        $self->{Curr_Test} = $num;
-
-        # If the test counter is being pushed forward fill in the details.
-        my $test_results = $self->{Test_Results};
-        if( $num > @$test_results ) {
-            my $start = @$test_results ? @$test_results : 0;
-            for ($start..$num-1) {
-                $test_results->[$_] = &share({
-                    'ok'      => 1, 
-                    actual_ok => undef, 
-                    reason    => 'incrementing test number', 
-                    type      => 'unknown', 
-                    name      => undef 
-                });
-            }
-        }
-        # If backward, wipe history.  Its their funeral.
-        elsif( $num < @$test_results ) {
-            $#{$test_results} = $num - 1;
-        }
-    }
-    return $self->{Curr_Test};
-}
-
-
-=item B<summary>
-
-    my @tests = $Test->summary;
-
-A simple summary of the tests so far.  True for pass, false for fail.
-This is a logical pass/fail, so todos are passes.
-
-Of course, test #1 is $tests[0], etc...
-
-=cut
-
-sub summary {
-    my($self) = shift;
-
-    return map { $_->{'ok'} } @{ $self->{Test_Results} };
-}
-
-=item B<details>
-
-    my @tests = $Test->details;
-
-Like summary(), but with a lot more detail.
-
-    $tests[$test_num - 1] = 
-            { 'ok'       => is the test considered a pass?
-              actual_ok  => did it literally say 'ok'?
-              name       => name of the test (if any)
-              type       => type of test (if any, see below).
-              reason     => reason for the above (if any)
-            };
-
-'ok' is true if Test::Harness will consider the test to be a pass.
-
-'actual_ok' is a reflection of whether or not the test literally
-printed 'ok' or 'not ok'.  This is for examining the result of 'todo'
-tests.  
-
-'name' is the name of the test.
-
-'type' indicates if it was a special test.  Normal tests have a type
-of ''.  Type can be one of the following:
-
-    skip        see skip()
-    todo        see todo()
-    todo_skip   see todo_skip()
-    unknown     see below
-
-Sometimes the Test::Builder test counter is incremented without it
-printing any test output, for example, when current_test() is changed.
-In these cases, Test::Builder doesn't know the result of the test, so
-it's type is 'unkown'.  These details for these tests are filled in.
-They are considered ok, but the name and actual_ok is left undef.
-
-For example "not ok 23 - hole count # TODO insufficient donuts" would
-result in this structure:
-
-    $tests[22] =    # 23 - 1, since arrays start from 0.
-      { ok        => 1,   # logically, the test passed since it's todo
-        actual_ok => 0,   # in absolute terms, it failed
-        name      => 'hole count',
-        type      => 'todo',
-        reason    => 'insufficient donuts'
-      };
-
-=cut
-
-sub details {
-    my $self = shift;
-    return @{ $self->{Test_Results} };
-}
-
-=item B<todo>
-
-    my $todo_reason = $Test->todo;
-    my $todo_reason = $Test->todo($pack);
-
-todo() looks for a $TODO variable in your tests.  If set, all tests
-will be considered 'todo' (see Test::More and Test::Harness for
-details).  Returns the reason (ie. the value of $TODO) if running as
-todo tests, false otherwise.
-
-todo() is about finding the right package to look for $TODO in.  It
-uses the exported_to() package to find it.  If that's not set, it's
-pretty good at guessing the right package to look at based on $Level.
-
-Sometimes there is some confusion about where todo() should be looking
-for the $TODO variable.  If you want to be sure, tell it explicitly
-what $pack to use.
-
-=cut
-
-sub todo {
-    my($self, $pack) = @_;
-
-    $pack = $pack || $self->exported_to || $self->caller($Level);
-    return 0 unless $pack;
-
-    no strict 'refs';
-    return defined ${$pack.'::TODO'} ? ${$pack.'::TODO'}
-                                     : 0;
-}
-
-=item B<caller>
-
-    my $package = $Test->caller;
-    my($pack, $file, $line) = $Test->caller;
-    my($pack, $file, $line) = $Test->caller($height);
-
-Like the normal caller(), except it reports according to your level().
-
-=cut
-
-sub caller {
-    my($self, $height) = @_;
-    $height ||= 0;
-
-    my @caller = CORE::caller($self->level + $height + 1);
-    return wantarray ? @caller : $caller[0];
-}
-
-=back
-
-=cut
-
-=begin _private
-
-=over 4
-
-=item B<_sanity_check>
-
-  $self->_sanity_check();
-
-Runs a bunch of end of test sanity checks to make sure reality came
-through ok.  If anything is wrong it will die with a fairly friendly
-error message.
-
-=cut
-
-#'#
-sub _sanity_check {
-    my $self = shift;
-
-    _whoa($self->{Curr_Test} < 0,  'Says here you ran a negative number of tests!');
-    _whoa(!$self->{Have_Plan} and $self->{Curr_Test}, 
-          'Somehow your tests ran without a plan!');
-    _whoa($self->{Curr_Test} != @{ $self->{Test_Results} },
-          'Somehow you got a different number of results than tests ran!');
-}
-
-=item B<_whoa>
-
-  _whoa($check, $description);
-
-A sanity check, similar to assert().  If the $check is true, something
-has gone horribly wrong.  It will die with the given $description and
-a note to contact the author.
-
-=cut
-
-sub _whoa {
-    my($check, $desc) = @_;
-    if( $check ) {
-        die <<WHOA;
-WHOA!  $desc
-This should never happen!  Please contact the author immediately!
-WHOA
-    }
-}
-
-=item B<_my_exit>
-
-  _my_exit($exit_num);
-
-Perl seems to have some trouble with exiting inside an END block.  5.005_03
-and 5.6.1 both seem to do odd things.  Instead, this function edits $?
-directly.  It should ONLY be called from inside an END block.  It
-doesn't actually exit, that's your job.
-
-=cut
-
-sub _my_exit {
-    $? = $_[0];
-
-    return 1;
-}
-
-
-=back
-
-=end _private
-
-=cut
-
-$SIG{__DIE__} = sub {
-    # We don't want to muck with death in an eval, but $^S isn't
-    # totally reliable.  5.005_03 and 5.6.1 both do the wrong thing
-    # with it.  Instead, we use caller.  This also means it runs under
-    # 5.004!
-    my $in_eval = 0;
-    for( my $stack = 1;  my $sub = (CORE::caller($stack))[3];  $stack++ ) {
-        $in_eval = 1 if $sub =~ /^\(eval\)/;
-    }
-    $Test->{Test_Died} = 1 unless $in_eval;
-};
-
-sub _ending {
-    my $self = shift;
-
-    $self->_sanity_check();
-
-    # Don't bother with an ending if this is a forked copy.  Only the parent
-    # should do the ending.
-    # Exit if plan() was never called.  This is so "require Test::Simple" 
-    # doesn't puke.
-    if( ($self->{Original_Pid} != $$) or
-       (!$self->{Have_Plan} && !$self->{Test_Died}) )
-    {
-       _my_exit($?);
-       return;
-    }
-
-    # Figure out if we passed or failed and print helpful messages.
-    my $test_results = $self->{Test_Results};
-    if( @$test_results ) {
-        # The plan?  We have no plan.
-        if( $self->{No_Plan} ) {
-            $self->_print("1..$self->{Curr_Test}\n") unless $self->no_header;
-            $self->{Expected_Tests} = $self->{Curr_Test};
-        }
-
-        # Auto-extended arrays and elements which aren't explicitly
-        # filled in with a shared reference will puke under 5.8.0
-        # ithreads.  So we have to fill them in by hand. :(
-        my $empty_result = &share({});
-        for my $idx ( 0..$self->{Expected_Tests}-1 ) {
-            $test_results->[$idx] = $empty_result
-              unless defined $test_results->[$idx];
-        }
-
-        my $num_failed = grep !$_->{'ok'}, 
-                              @{$test_results}[0..$self->{Expected_Tests}-1];
-        $num_failed += abs($self->{Expected_Tests} - @$test_results);
-
-        if( $self->{Curr_Test} < $self->{Expected_Tests} ) {
-            my $s = $self->{Expected_Tests} == 1 ? '' : 's';
-            $self->diag(<<"FAIL");
-Looks like you planned $self->{Expected_Tests} test$s but only ran $self->{Curr_Test}.
-FAIL
-        }
-        elsif( $self->{Curr_Test} > $self->{Expected_Tests} ) {
-            my $num_extra = $self->{Curr_Test} - $self->{Expected_Tests};
-            my $s = $self->{Expected_Tests} == 1 ? '' : 's';
-            $self->diag(<<"FAIL");
-Looks like you planned $self->{Expected_Tests} test$s but ran $num_extra extra.
-FAIL
-        }
-        elsif ( $num_failed ) {
-            my $s = $num_failed == 1 ? '' : 's';
-            $self->diag(<<"FAIL");
-Looks like you failed $num_failed test$s of $self->{Expected_Tests}.
-FAIL
-        }
-
-        if( $self->{Test_Died} ) {
-            $self->diag(<<"FAIL");
-Looks like your test died just after $self->{Curr_Test}.
-FAIL
-
-            _my_exit( 255 ) && return;
-        }
-
-        _my_exit( $num_failed <= 254 ? $num_failed : 254  ) && return;
-    }
-    elsif ( $self->{Skip_All} ) {
-        _my_exit( 0 ) && return;
-    }
-    elsif ( $self->{Test_Died} ) {
-        $self->diag(<<'FAIL');
-Looks like your test died before it could output anything.
-FAIL
-        _my_exit( 255 ) && return;
-    }
-    else {
-        $self->diag("No tests run!\n");
-        _my_exit( 255 ) && return;
-    }
-}
-
-END {
-    $Test->_ending if defined $Test and !$Test->no_ending;
-}
-
-=head1 EXIT CODES
-
-If all your tests passed, Test::Builder will exit with zero (which is
-normal).  If anything failed it will exit with how many failed.  If
-you run less (or more) tests than you planned, the missing (or extras)
-will be considered failures.  If no tests were ever run Test::Builder
-will throw a warning and exit with 255.  If the test died, even after
-having successfully completed all its tests, it will still be
-considered a failure and will exit with 255.
-
-So the exit codes are...
-
-    0                   all tests successful
-    255                 test died
-    any other number    how many failed (including missing or extras)
-
-If you fail more than 254 tests, it will be reported as 254.
-
-
-=head1 THREADS
-
-In perl 5.8.0 and later, Test::Builder is thread-safe.  The test
-number is shared amongst all threads.  This means if one thread sets
-the test number using current_test() they will all be effected.
-
-Test::Builder is only thread-aware if threads.pm is loaded I<before>
-Test::Builder.
-
-=head1 EXAMPLES
-
-CPAN can provide the best examples.  Test::Simple, Test::More,
-Test::Exception and Test::Differences all use Test::Builder.
-
-=head1 SEE ALSO
-
-Test::Simple, Test::More, Test::Harness
-
-=head1 AUTHORS
-
-Original code by chromatic, maintained by Michael G Schwern
-E<lt>schwern@pobox.comE<gt>
-
-=head1 COPYRIGHT
-
-Copyright 2002, 2004 by chromatic E<lt>chromatic@wgz.orgE<gt> and
-                        Michael G Schwern E<lt>schwern@pobox.comE<gt>.
-
-This program is free software; you can redistribute it and/or 
-modify it under the same terms as Perl itself.
-
-See F<http://www.perl.com/perl/misc/Artistic.html>
-
-=cut
-
-1;
diff --git a/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/t/Test/More.pm b/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/t/Test/More.pm
deleted file mode 100644 (file)
index 74eaa42..0000000
+++ /dev/null
@@ -1,1493 +0,0 @@
-package Test::More;
-
-use 5.004;
-
-use strict;
-use Test::Builder;
-
-
-# Can't use Carp because it might cause use_ok() to accidentally succeed
-# even though the module being used forgot to use Carp.  Yes, this
-# actually happened.
-sub _carp {
-    my($file, $line) = (caller(1))[1,2];
-    warn @_, " at $file line $line\n";
-}
-
-
-
-require Exporter;
-our ($VERSION, @ISA, @EXPORT, %EXPORT_TAGS, $TODO);
-$VERSION = '0.60';
-$VERSION = eval $VERSION;    # make the alpha version come out as a number
-
-@ISA    = qw(Exporter);
-@EXPORT = qw(ok use_ok require_ok
-             is isnt like unlike is_deeply
-             cmp_ok
-             skip todo todo_skip
-             pass fail
-             eq_array eq_hash eq_set
-             $TODO
-             plan
-             can_ok  isa_ok
-             diag
-            );
-
-my $Test = Test::Builder->new;
-my $Show_Diag = 1;
-
-
-# 5.004's Exporter doesn't have export_to_level.
-sub _export_to_level
-{
-      my $pkg = shift;
-      my $level = shift;
-      (undef) = shift;                  # redundant arg
-      my $callpkg = caller($level);
-      $pkg->export($callpkg, @_);
-}
-
-
-=head1 NAME
-
-Test::More - yet another framework for writing test scripts
-
-=head1 SYNOPSIS
-
-  use Test::More tests => $Num_Tests;
-  # or
-  use Test::More qw(no_plan);
-  # or
-  use Test::More skip_all => $reason;
-
-  BEGIN { use_ok( 'Some::Module' ); }
-  require_ok( 'Some::Module' );
-
-  # Various ways to say "ok"
-  ok($this eq $that, $test_name);
-
-  is  ($this, $that,    $test_name);
-  isnt($this, $that,    $test_name);
-
-  # Rather than print STDERR "# here's what went wrong\n"
-  diag("here's what went wrong");
-
-  like  ($this, qr/that/, $test_name);
-  unlike($this, qr/that/, $test_name);
-
-  cmp_ok($this, '==', $that, $test_name);
-
-  is_deeply($complex_structure1, $complex_structure2, $test_name);
-
-  SKIP: {
-      skip $why, $how_many unless $have_some_feature;
-
-      ok( foo(),       $test_name );
-      is( foo(42), 23, $test_name );
-  };
-
-  TODO: {
-      local $TODO = $why;
-
-      ok( foo(),       $test_name );
-      is( foo(42), 23, $test_name );
-  };
-
-  can_ok($module, @methods);
-  isa_ok($object, $class);
-
-  pass($test_name);
-  fail($test_name);
-
-  # UNIMPLEMENTED!!!
-  my @status = Test::More::status;
-
-  # UNIMPLEMENTED!!!
-  BAIL_OUT($why);
-
-
-=head1 DESCRIPTION
-
-B<STOP!> If you're just getting started writing tests, have a look at
-Test::Simple first.  This is a drop in replacement for Test::Simple
-which you can switch to once you get the hang of basic testing.
-
-The purpose of this module is to provide a wide range of testing
-utilities.  Various ways to say "ok" with better diagnostics,
-facilities to skip tests, test future features and compare complicated
-data structures.  While you can do almost anything with a simple
-C<ok()> function, it doesn't provide good diagnostic output.
-
-
-=head2 I love it when a plan comes together
-
-Before anything else, you need a testing plan.  This basically declares
-how many tests your script is going to run to protect against premature
-failure.
-
-The preferred way to do this is to declare a plan when you C<use Test::More>.
-
-  use Test::More tests => $Num_Tests;
-
-There are rare cases when you will not know beforehand how many tests
-your script is going to run.  In this case, you can declare that you
-have no plan.  (Try to avoid using this as it weakens your test.)
-
-  use Test::More qw(no_plan);
-
-B<NOTE>: using no_plan requires a Test::Harness upgrade else it will
-think everything has failed.  See L<BUGS>)
-
-In some cases, you'll want to completely skip an entire testing script.
-
-  use Test::More skip_all => $skip_reason;
-
-Your script will declare a skip with the reason why you skipped and
-exit immediately with a zero (success).  See L<Test::Harness> for
-details.
-
-If you want to control what functions Test::More will export, you
-have to use the 'import' option.  For example, to import everything
-but 'fail', you'd do:
-
-  use Test::More tests => 23, import => ['!fail'];
-
-Alternatively, you can use the plan() function.  Useful for when you
-have to calculate the number of tests.
-
-  use Test::More;
-  plan tests => keys %Stuff * 3;
-
-or for deciding between running the tests at all:
-
-  use Test::More;
-  if( $^O eq 'MacOS' ) {
-      plan skip_all => 'Test irrelevant on MacOS';
-  }
-  else {
-      plan tests => 42;
-  }
-
-=cut
-
-sub plan {
-    my(@plan) = @_;
-
-    my $idx = 0;
-    my @cleaned_plan;
-    while( $idx <= $#plan ) {
-        my $item = $plan[$idx];
-
-        if( $item eq 'no_diag' ) {
-            $Show_Diag = 0;
-        }
-        else {
-            push @cleaned_plan, $item;
-        }
-
-        $idx++;
-    }
-
-    $Test->plan(@cleaned_plan);
-}
-
-sub import {
-    my($class) = shift;
-
-    my $caller = caller;
-
-    $Test->exported_to($caller);
-
-    my $idx = 0;
-    my @plan;
-    my @imports;
-    while( $idx <= $#_ ) {
-        my $item = $_[$idx];
-
-        if( $item eq 'import' ) {
-            push @imports, @{$_[$idx+1]};
-            $idx++;
-        }
-        else {
-            push @plan, $item;
-        }
-
-        $idx++;
-    }
-
-    plan(@plan);
-
-    __PACKAGE__->_export_to_level(1, __PACKAGE__, @imports);
-}
-
-
-=head2 Test names
-
-By convention, each test is assigned a number in order.  This is
-largely done automatically for you.  However, it's often very useful to
-assign a name to each test.  Which would you rather see:
-
-  ok 4
-  not ok 5
-  ok 6
-
-or
-
-  ok 4 - basic multi-variable
-  not ok 5 - simple exponential
-  ok 6 - force == mass * acceleration
-
-The later gives you some idea of what failed.  It also makes it easier
-to find the test in your script, simply search for "simple
-exponential".
-
-All test functions take a name argument.  It's optional, but highly
-suggested that you use it.
-
-
-=head2 I'm ok, you're not ok.
-
-The basic purpose of this module is to print out either "ok #" or "not
-ok #" depending on if a given test succeeded or failed.  Everything
-else is just gravy.
-
-All of the following print "ok" or "not ok" depending on if the test
-succeeded or failed.  They all also return true or false,
-respectively.
-
-=over 4
-
-=item B<ok>
-
-  ok($this eq $that, $test_name);
-
-This simply evaluates any expression (C<$this eq $that> is just a
-simple example) and uses that to determine if the test succeeded or
-failed.  A true expression passes, a false one fails.  Very simple.
-
-For example:
-
-    ok( $exp{9} == 81,                   'simple exponential' );
-    ok( Film->can('db_Main'),            'set_db()' );
-    ok( $p->tests == 4,                  'saw tests' );
-    ok( !grep !defined $_, @items,       'items populated' );
-
-(Mnemonic:  "This is ok.")
-
-$test_name is a very short description of the test that will be printed
-out.  It makes it very easy to find a test in your script when it fails
-and gives others an idea of your intentions.  $test_name is optional,
-but we B<very> strongly encourage its use.
-
-Should an ok() fail, it will produce some diagnostics:
-
-    not ok 18 - sufficient mucus
-    #     Failed test 18 (foo.t at line 42)
-
-This is actually Test::Simple's ok() routine.
-
-=cut
-
-sub ok ($;$) {
-    my($test, $name) = @_;
-    $Test->ok($test, $name);
-}
-
-=item B<is>
-
-=item B<isnt>
-
-  is  ( $this, $that, $test_name );
-  isnt( $this, $that, $test_name );
-
-Similar to ok(), is() and isnt() compare their two arguments
-with C<eq> and C<ne> respectively and use the result of that to
-determine if the test succeeded or failed.  So these:
-
-    # Is the ultimate answer 42?
-    is( ultimate_answer(), 42,          "Meaning of Life" );
-
-    # $foo isn't empty
-    isnt( $foo, '',     "Got some foo" );
-
-are similar to these:
-
-    ok( ultimate_answer() eq 42,        "Meaning of Life" );
-    ok( $foo ne '',     "Got some foo" );
-
-(Mnemonic:  "This is that."  "This isn't that.")
-
-So why use these?  They produce better diagnostics on failure.  ok()
-cannot know what you are testing for (beyond the name), but is() and
-isnt() know what the test was and why it failed.  For example this
-test:
-
-    my $foo = 'waffle';  my $bar = 'yarblokos';
-    is( $foo, $bar,   'Is foo the same as bar?' );
-
-Will produce something like this:
-
-    not ok 17 - Is foo the same as bar?
-    #     Failed test (foo.t at line 139)
-    #          got: 'waffle'
-    #     expected: 'yarblokos'
-
-So you can figure out what went wrong without rerunning the test.
-
-You are encouraged to use is() and isnt() over ok() where possible,
-however do not be tempted to use them to find out if something is
-true or false!
-
-  # XXX BAD!
-  is( exists $brooklyn{tree}, 1, 'A tree grows in Brooklyn' );
-
-This does not check if C<exists $brooklyn{tree}> is true, it checks if
-it returns 1.  Very different.  Similar caveats exist for false and 0.
-In these cases, use ok().
-
-  ok( exists $brooklyn{tree},    'A tree grows in Brooklyn' );
-
-For those grammatical pedants out there, there's an C<isn't()>
-function which is an alias of isnt().
-
-=cut
-
-sub is ($$;$) {
-    $Test->is_eq(@_);
-}
-
-sub isnt ($$;$) {
-    $Test->isnt_eq(@_);
-}
-
-*isn't = \&isnt;
-
-
-=item B<like>
-
-  like( $this, qr/that/, $test_name );
-
-Similar to ok(), like() matches $this against the regex C<qr/that/>.
-
-So this:
-
-    like($this, qr/that/, 'this is like that');
-
-is similar to:
-
-    ok( $this =~ /that/, 'this is like that');
-
-(Mnemonic "This is like that".)
-
-The second argument is a regular expression.  It may be given as a
-regex reference (i.e. C<qr//>) or (for better compatibility with older
-perls) as a string that looks like a regex (alternative delimiters are
-currently not supported):
-
-    like( $this, '/that/', 'this is like that' );
-
-Regex options may be placed on the end (C<'/that/i'>).
-
-Its advantages over ok() are similar to that of is() and isnt().  Better
-diagnostics on failure.
-
-=cut
-
-sub like ($$;$) {
-    $Test->like(@_);
-}
-
-
-=item B<unlike>
-
-  unlike( $this, qr/that/, $test_name );
-
-Works exactly as like(), only it checks if $this B<does not> match the
-given pattern.
-
-=cut
-
-sub unlike ($$;$) {
-    $Test->unlike(@_);
-}
-
-
-=item B<cmp_ok>
-
-  cmp_ok( $this, $op, $that, $test_name );
-
-Halfway between ok() and is() lies cmp_ok().  This allows you to
-compare two arguments using any binary perl operator.
-
-    # ok( $this eq $that );
-    cmp_ok( $this, 'eq', $that, 'this eq that' );
-
-    # ok( $this == $that );
-    cmp_ok( $this, '==', $that, 'this == that' );
-
-    # ok( $this && $that );
-    cmp_ok( $this, '&&', $that, 'this && that' );
-    ...etc...
-
-Its advantage over ok() is when the test fails you'll know what $this
-and $that were:
-
-    not ok 1
-    #     Failed test (foo.t at line 12)
-    #     '23'
-    #         &&
-    #     undef
-
-It's also useful in those cases where you are comparing numbers and
-is()'s use of C<eq> will interfere:
-
-    cmp_ok( $big_hairy_number, '==', $another_big_hairy_number );
-
-=cut
-
-sub cmp_ok($$$;$) {
-    $Test->cmp_ok(@_);
-}
-
-
-=item B<can_ok>
-
-  can_ok($module, @methods);
-  can_ok($object, @methods);
-
-Checks to make sure the $module or $object can do these @methods
-(works with functions, too).
-
-    can_ok('Foo', qw(this that whatever));
-
-is almost exactly like saying:
-
-    ok( Foo->can('this') && 
-        Foo->can('that') && 
-        Foo->can('whatever') 
-      );
-
-only without all the typing and with a better interface.  Handy for
-quickly testing an interface.
-
-No matter how many @methods you check, a single can_ok() call counts
-as one test.  If you desire otherwise, use:
-
-    foreach my $meth (@methods) {
-        can_ok('Foo', $meth);
-    }
-
-=cut
-
-sub can_ok ($@) {
-    my($proto, @methods) = @_;
-    my $class = ref $proto || $proto;
-
-    unless( @methods ) {
-        my $ok = $Test->ok( 0, "$class->can(...)" );
-        $Test->diag('    can_ok() called with no methods');
-        return $ok;
-    }
-
-    my @nok = ();
-    foreach my $method (@methods) {
-        local($!, $@);  # don't interfere with caller's $@
-                        # eval sometimes resets $!
-        eval { $proto->can($method) } || push @nok, $method;
-    }
-
-    my $name;
-    $name = @methods == 1 ? "$class->can('$methods[0]')" 
-                          : "$class->can(...)";
-    
-    my $ok = $Test->ok( !@nok, $name );
-
-    $Test->diag(map "    $class->can('$_') failed\n", @nok);
-
-    return $ok;
-}
-
-=item B<isa_ok>
-
-  isa_ok($object, $class, $object_name);
-  isa_ok($ref,    $type,  $ref_name);
-
-Checks to see if the given C<< $object->isa($class) >>.  Also checks to make
-sure the object was defined in the first place.  Handy for this sort
-of thing:
-
-    my $obj = Some::Module->new;
-    isa_ok( $obj, 'Some::Module' );
-
-where you'd otherwise have to write
-
-    my $obj = Some::Module->new;
-    ok( defined $obj && $obj->isa('Some::Module') );
-
-to safeguard against your test script blowing up.
-
-It works on references, too:
-
-    isa_ok( $array_ref, 'ARRAY' );
-
-The diagnostics of this test normally just refer to 'the object'.  If
-you'd like them to be more specific, you can supply an $object_name
-(for example 'Test customer').
-
-=cut
-
-sub isa_ok ($$;$) {
-    my($object, $class, $obj_name) = @_;
-
-    my $diag;
-    $obj_name = 'The object' unless defined $obj_name;
-    my $name = "$obj_name isa $class";
-    if( !defined $object ) {
-        $diag = "$obj_name isn't defined";
-    }
-    elsif( !ref $object ) {
-        $diag = "$obj_name isn't a reference";
-    }
-    else {
-        # We can't use UNIVERSAL::isa because we want to honor isa() overrides
-        local($@, $!);  # eval sometimes resets $!
-        my $rslt = eval { $object->isa($class) };
-        if( $@ ) {
-            if( $@ =~ /^Can't call method "isa" on unblessed reference/ ) {
-                if( !UNIVERSAL::isa($object, $class) ) {
-                    my $ref = ref $object;
-                    $diag = "$obj_name isn't a '$class' it's a '$ref'";
-                }
-            } else {
-                die <<WHOA;
-WHOA! I tried to call ->isa on your object and got some weird error.
-This should never happen.  Please contact the author immediately.
-Here's the error.
-$@
-WHOA
-            }
-        }
-        elsif( !$rslt ) {
-            my $ref = ref $object;
-            $diag = "$obj_name isn't a '$class' it's a '$ref'";
-        }
-    }
-            
-      
-
-    my $ok;
-    if( $diag ) {
-        $ok = $Test->ok( 0, $name );
-        $Test->diag("    $diag\n");
-    }
-    else {
-        $ok = $Test->ok( 1, $name );
-    }
-
-    return $ok;
-}
-
-
-=item B<pass>
-
-=item B<fail>
-
-  pass($test_name);
-  fail($test_name);
-
-Sometimes you just want to say that the tests have passed.  Usually
-the case is you've got some complicated condition that is difficult to
-wedge into an ok().  In this case, you can simply use pass() (to
-declare the test ok) or fail (for not ok).  They are synonyms for
-ok(1) and ok(0).
-
-Use these very, very, very sparingly.
-
-=cut
-
-sub pass (;$) {
-    $Test->ok(1, @_);
-}
-
-sub fail (;$) {
-    $Test->ok(0, @_);
-}
-
-=back
-
-=head2 Diagnostics
-
-If you pick the right test function, you'll usually get a good idea of
-what went wrong when it failed.  But sometimes it doesn't work out
-that way.  So here we have ways for you to write your own diagnostic
-messages which are safer than just C<print STDERR>.
-
-=over 4
-
-=item B<diag>
-
-  diag(@diagnostic_message);
-
-Prints a diagnostic message which is guaranteed not to interfere with
-test output.  Like C<print> @diagnostic_message is simply concatinated
-together.
-
-Handy for this sort of thing:
-
-    ok( grep(/foo/, @users), "There's a foo user" ) or
-        diag("Since there's no foo, check that /etc/bar is set up right");
-
-which would produce:
-
-    not ok 42 - There's a foo user
-    #     Failed test (foo.t at line 52)
-    # Since there's no foo, check that /etc/bar is set up right.
-
-You might remember C<ok() or diag()> with the mnemonic C<open() or
-die()>.
-
-All diag()s can be made silent by passing the "no_diag" option to
-Test::More.  C<use Test::More tests => 1, 'no_diag'>.  This is useful
-if you have diagnostics for personal testing but then wish to make
-them silent for release without commenting out each individual
-statement.
-
-B<NOTE> The exact formatting of the diagnostic output is still
-changing, but it is guaranteed that whatever you throw at it it won't
-interfere with the test.
-
-=cut
-
-sub diag {
-    return unless $Show_Diag;
-    $Test->diag(@_);
-}
-
-
-=back
-
-=head2 Module tests
-
-You usually want to test if the module you're testing loads ok, rather
-than just vomiting if its load fails.  For such purposes we have
-C<use_ok> and C<require_ok>.
-
-=over 4
-
-=item B<use_ok>
-
-   BEGIN { use_ok($module); }
-   BEGIN { use_ok($module, @imports); }
-
-These simply use the given $module and test to make sure the load
-happened ok.  It's recommended that you run use_ok() inside a BEGIN
-block so its functions are exported at compile-time and prototypes are
-properly honored.
-
-If @imports are given, they are passed through to the use.  So this:
-
-   BEGIN { use_ok('Some::Module', qw(foo bar)) }
-
-is like doing this:
-
-   use Some::Module qw(foo bar);
-
-Version numbers can be checked like so:
-
-   # Just like "use Some::Module 1.02"
-   BEGIN { use_ok('Some::Module', 1.02) }
-
-Don't try to do this:
-
-   BEGIN {
-       use_ok('Some::Module');
-
-       ...some code that depends on the use...
-       ...happening at compile time...
-   }
-
-because the notion of "compile-time" is relative.  Instead, you want:
-
-  BEGIN { use_ok('Some::Module') }
-  BEGIN { ...some code that depends on the use... }
-
-
-=cut
-
-sub use_ok ($;@) {
-    my($module, @imports) = @_;
-    @imports = () unless @imports;
-
-    my($pack,$filename,$line) = caller;
-
-    local($@,$!);   # eval sometimes interferes with $!
-
-    if( @imports == 1 and $imports[0] =~ /^\d+(?:\.\d+)?$/ ) {
-        # probably a version check.  Perl needs to see the bare number
-        # for it to work with non-Exporter based modules.
-        eval <<USE;
-package $pack;
-use $module $imports[0];
-USE
-    }
-    else {
-        eval <<USE;
-package $pack;
-use $module \@imports;
-USE
-    }
-
-    my $ok = $Test->ok( !$@, "use $module;" );
-
-    unless( $ok ) {
-        chomp $@;
-        $@ =~ s{^BEGIN failed--compilation aborted at .*$}
-                {BEGIN failed--compilation aborted at $filename line $line.}m;
-        $Test->diag(<<DIAGNOSTIC);
-    Tried to use '$module'.
-    Error:  $@
-DIAGNOSTIC
-
-    }
-
-    return $ok;
-}
-
-=item B<require_ok>
-
-   require_ok($module);
-   require_ok($file);
-
-Like use_ok(), except it requires the $module or $file.
-
-=cut
-
-sub require_ok ($) {
-    my($module) = shift;
-
-    my $pack = caller;
-
-    # Try to deterine if we've been given a module name or file.
-    # Module names must be barewords, files not.
-    $module = qq['$module'] unless _is_module_name($module);
-
-    local($!, $@); # eval sometimes interferes with $!
-    eval <<REQUIRE;
-package $pack;
-require $module;
-REQUIRE
-
-    my $ok = $Test->ok( !$@, "require $module;" );
-
-    unless( $ok ) {
-        chomp $@;
-        $Test->diag(<<DIAGNOSTIC);
-    Tried to require '$module'.
-    Error:  $@
-DIAGNOSTIC
-
-    }
-
-    return $ok;
-}
-
-
-sub _is_module_name {
-    my $module = shift;
-
-    # Module names start with a letter.
-    # End with an alphanumeric.
-    # The rest is an alphanumeric or ::
-    $module =~ s/\b::\b//g;
-    $module =~ /^[a-zA-Z]\w*$/;
-}
-
-=back
-
-=head2 Conditional tests
-
-Sometimes running a test under certain conditions will cause the
-test script to die.  A certain function or method isn't implemented
-(such as fork() on MacOS), some resource isn't available (like a 
-net connection) or a module isn't available.  In these cases it's
-necessary to skip tests, or declare that they are supposed to fail
-but will work in the future (a todo test).
-
-For more details on the mechanics of skip and todo tests see
-L<Test::Harness>.
-
-The way Test::More handles this is with a named block.  Basically, a
-block of tests which can be skipped over or made todo.  It's best if I
-just show you...
-
-=over 4
-
-=item B<SKIP: BLOCK>
-
-  SKIP: {
-      skip $why, $how_many if $condition;
-
-      ...normal testing code goes here...
-  }
-
-This declares a block of tests that might be skipped, $how_many tests
-there are, $why and under what $condition to skip them.  An example is
-the easiest way to illustrate:
-
-    SKIP: {
-        eval { require HTML::Lint };
-
-        skip "HTML::Lint not installed", 2 if $@;
-
-        my $lint = new HTML::Lint;
-        isa_ok( $lint, "HTML::Lint" );
-
-        $lint->parse( $html );
-        is( $lint->errors, 0, "No errors found in HTML" );
-    }
-
-If the user does not have HTML::Lint installed, the whole block of
-code I<won't be run at all>.  Test::More will output special ok's
-which Test::Harness interprets as skipped, but passing, tests.
-
-It's important that $how_many accurately reflects the number of tests
-in the SKIP block so the # of tests run will match up with your plan.
-If your plan is C<no_plan> $how_many is optional and will default to 1.
-
-It's perfectly safe to nest SKIP blocks.  Each SKIP block must have
-the label C<SKIP>, or Test::More can't work its magic.
-
-You don't skip tests which are failing because there's a bug in your
-program, or for which you don't yet have code written.  For that you
-use TODO.  Read on.
-
-=cut
-
-#'#
-sub skip {
-    my($why, $how_many) = @_;
-
-    unless( defined $how_many ) {
-        # $how_many can only be avoided when no_plan is in use.
-        _carp "skip() needs to know \$how_many tests are in the block"
-          unless $Test->has_plan eq 'no_plan';
-        $how_many = 1;
-    }
-
-    for( 1..$how_many ) {
-        $Test->skip($why);
-    }
-
-    local $^W = 0;
-    last SKIP;
-}
-
-
-=item B<TODO: BLOCK>
-
-    TODO: {
-        local $TODO = $why if $condition;
-
-        ...normal testing code goes here...
-    }
-
-Declares a block of tests you expect to fail and $why.  Perhaps it's
-because you haven't fixed a bug or haven't finished a new feature:
-
-    TODO: {
-        local $TODO = "URI::Geller not finished";
-
-        my $card = "Eight of clubs";
-        is( URI::Geller->your_card, $card, 'Is THIS your card?' );
-
-        my $spoon;
-        URI::Geller->bend_spoon;
-        is( $spoon, 'bent',    "Spoon bending, that's original" );
-    }
-
-With a todo block, the tests inside are expected to fail.  Test::More
-will run the tests normally, but print out special flags indicating
-they are "todo".  Test::Harness will interpret failures as being ok.
-Should anything succeed, it will report it as an unexpected success.
-You then know the thing you had todo is done and can remove the
-TODO flag.
-
-The nice part about todo tests, as opposed to simply commenting out a
-block of tests, is it's like having a programmatic todo list.  You know
-how much work is left to be done, you're aware of what bugs there are,
-and you'll know immediately when they're fixed.
-
-Once a todo test starts succeeding, simply move it outside the block.
-When the block is empty, delete it.
-
-B<NOTE>: TODO tests require a Test::Harness upgrade else it will
-treat it as a normal failure.  See L<BUGS>)
-
-
-=item B<todo_skip>
-
-    TODO: {
-        todo_skip $why, $how_many if $condition;
-
-        ...normal testing code...
-    }
-
-With todo tests, it's best to have the tests actually run.  That way
-you'll know when they start passing.  Sometimes this isn't possible.
-Often a failing test will cause the whole program to die or hang, even
-inside an C<eval BLOCK> with and using C<alarm>.  In these extreme
-cases you have no choice but to skip over the broken tests entirely.
-
-The syntax and behavior is similar to a C<SKIP: BLOCK> except the
-tests will be marked as failing but todo.  Test::Harness will
-interpret them as passing.
-
-=cut
-
-sub todo_skip {
-    my($why, $how_many) = @_;
-
-    unless( defined $how_many ) {
-        # $how_many can only be avoided when no_plan is in use.
-        _carp "todo_skip() needs to know \$how_many tests are in the block"
-          unless $Test->has_plan eq 'no_plan';
-        $how_many = 1;
-    }
-
-    for( 1..$how_many ) {
-        $Test->todo_skip($why);
-    }
-
-    local $^W = 0;
-    last TODO;
-}
-
-=item When do I use SKIP vs. TODO?
-
-B<If it's something the user might not be able to do>, use SKIP.
-This includes optional modules that aren't installed, running under
-an OS that doesn't have some feature (like fork() or symlinks), or maybe
-you need an Internet connection and one isn't available.
-
-B<If it's something the programmer hasn't done yet>, use TODO.  This
-is for any code you haven't written yet, or bugs you have yet to fix,
-but want to put tests in your testing script (always a good idea).
-
-
-=back
-
-=head2 Complex data structures
-
-Not everything is a simple eq check or regex.  There are times you
-need to see if two data structures are equivalent.  For these
-instances Test::More provides a handful of useful functions.
-
-B<NOTE> I'm not quite sure what will happen with filehandles.
-
-=over 4
-
-=item B<is_deeply>
-
-  is_deeply( $this, $that, $test_name );
-
-Similar to is(), except that if $this and $that are hash or array
-references, it does a deep comparison walking each data structure to
-see if they are equivalent.  If the two structures are different, it
-will display the place where they start differing.
-
-Test::Differences and Test::Deep provide more in-depth functionality
-along these lines.
-
-=back
-
-=cut
-
-our (@Data_Stack, %Refs_Seen);
-my $DNE = bless [], 'Does::Not::Exist';
-sub is_deeply {
-    unless( @_ == 2 or @_ == 3 ) {
-        my $msg = <<WARNING;
-is_deeply() takes two or three args, you gave %d.
-This usually means you passed an array or hash instead 
-of a reference to it
-WARNING
-        chop $msg;   # clip off newline so carp() will put in line/file
-
-        _carp sprintf $msg, scalar @_;
-
-       return $Test->ok(0);
-    }
-
-    my($this, $that, $name) = @_;
-
-    my $ok;
-    if( !ref $this and !ref $that ) {                  # neither is a reference
-        $ok = $Test->is_eq($this, $that, $name);
-    }
-    elsif( !ref $this xor !ref $that ) {       # one's a reference, one isn't
-        $ok = $Test->ok(0, $name);
-       $Test->diag( _format_stack({ vals => [ $this, $that ] }) );
-    }
-    else {                                     # both references
-        local @Data_Stack = ();
-        if( _deep_check($this, $that) ) {
-            $ok = $Test->ok(1, $name);
-        }
-        else {
-            $ok = $Test->ok(0, $name);
-            $Test->diag(_format_stack(@Data_Stack));
-        }
-    }
-
-    return $ok;
-}
-
-sub _format_stack {
-    my(@Stack) = @_;
-
-    my $var = '$FOO';
-    my $did_arrow = 0;
-    foreach my $entry (@Stack) {
-        my $type = $entry->{type} || '';
-        my $idx  = $entry->{'idx'};
-        if( $type eq 'HASH' ) {
-            $var .= "->" unless $did_arrow++;
-            $var .= "{$idx}";
-        }
-        elsif( $type eq 'ARRAY' ) {
-            $var .= "->" unless $did_arrow++;
-            $var .= "[$idx]";
-        }
-        elsif( $type eq 'REF' ) {
-            $var = "\${$var}";
-        }
-    }
-
-    my @vals = @{$Stack[-1]{vals}}[0,1];
-    my @vars = ();
-    ($vars[0] = $var) =~ s/\$FOO/     \$got/;
-    ($vars[1] = $var) =~ s/\$FOO/\$expected/;
-
-    my $out = "Structures begin differing at:\n";
-    foreach my $idx (0..$#vals) {
-        my $val = $vals[$idx];
-        $vals[$idx] = !defined $val ? 'undef'          :
-                      $val eq $DNE  ? "Does not exist" :
-                     ref $val      ? "$val"           :
-                                      "'$val'";
-    }
-
-    $out .= "$vars[0] = $vals[0]\n";
-    $out .= "$vars[1] = $vals[1]\n";
-
-    $out =~ s/^/    /msg;
-    return $out;
-}
-
-
-sub _type {
-    my $thing = shift;
-
-    return '' if !ref $thing;
-
-    for my $type (qw(ARRAY HASH REF SCALAR GLOB Regexp)) {
-        return $type if UNIVERSAL::isa($thing, $type);
-    }
-
-    return '';
-}
-
-
-=head2 Discouraged comparison functions
-
-The use of the following functions is discouraged as they are not
-actually testing functions and produce no diagnostics to help figure
-out what went wrong.  They were written before is_deeply() existed
-because I couldn't figure out how to display a useful diff of two
-arbitrary data structures.
-
-These functions are usually used inside an ok().
-
-    ok( eq_array(\@this, \@that) );
-
-C<is_deeply()> can do that better and with diagnostics.  
-
-    is_deeply( \@this, \@that );
-
-They may be deprecated in future versions.
-
-=over 4
-
-=item B<eq_array>
-
-  my $is_eq = eq_array(\@this, \@that);
-
-Checks if two arrays are equivalent.  This is a deep check, so
-multi-level structures are handled correctly.
-
-=cut
-
-#'#
-sub eq_array {
-    local @Data_Stack;
-    _deep_check(@_);
-}
-
-sub _eq_array  {
-    my($a1, $a2) = @_;
-
-    if( grep !_type($_) eq 'ARRAY', $a1, $a2 ) {
-        warn "eq_array passed a non-array ref";
-        return 0;
-    }
-
-    return 1 if $a1 eq $a2;
-
-    my $ok = 1;
-    my $max = $#$a1 > $#$a2 ? $#$a1 : $#$a2;
-    for (0..$max) {
-        my $e1 = $_ > $#$a1 ? $DNE : $a1->[$_];
-        my $e2 = $_ > $#$a2 ? $DNE : $a2->[$_];
-
-        push @Data_Stack, { type => 'ARRAY', idx => $_, vals => [$e1, $e2] };
-        $ok = _deep_check($e1,$e2);
-        pop @Data_Stack if $ok;
-
-        last unless $ok;
-    }
-
-    return $ok;
-}
-
-sub _deep_check {
-    my($e1, $e2) = @_;
-    my $ok = 0;
-
-    # Effectively turn %Refs_Seen into a stack.  This avoids picking up
-    # the same referenced used twice (such as [\$a, \$a]) to be considered
-    # circular.
-    local %Refs_Seen = %Refs_Seen;
-
-    {
-        # Quiet uninitialized value warnings when comparing undefs.
-        local $^W = 0; 
-
-        $Test->_unoverload(\$e1, \$e2);
-
-        # Either they're both references or both not.
-        my $same_ref = !(!ref $e1 xor !ref $e2);
-       my $not_ref  = (!ref $e1 and !ref $e2);
-
-        if( defined $e1 xor defined $e2 ) {
-            $ok = 0;
-        }
-        elsif ( $e1 == $DNE xor $e2 == $DNE ) {
-            $ok = 0;
-        }
-        elsif ( $same_ref and ($e1 eq $e2) ) {
-            $ok = 1;
-        }
-       elsif ( $not_ref ) {
-           push @Data_Stack, { type => '', vals => [$e1, $e2] };
-           $ok = 0;
-       }
-        else {
-            if( $Refs_Seen{$e1} ) {
-                return $Refs_Seen{$e1} eq $e2;
-            }
-            else {
-                $Refs_Seen{$e1} = "$e2";
-            }
-
-            my $type = _type($e1);
-            $type = 'DIFFERENT' unless _type($e2) eq $type;
-
-            if( $type eq 'DIFFERENT' ) {
-                push @Data_Stack, { type => $type, vals => [$e1, $e2] };
-                $ok = 0;
-            }
-            elsif( $type eq 'ARRAY' ) {
-                $ok = _eq_array($e1, $e2);
-            }
-            elsif( $type eq 'HASH' ) {
-                $ok = _eq_hash($e1, $e2);
-            }
-            elsif( $type eq 'REF' ) {
-                push @Data_Stack, { type => $type, vals => [$e1, $e2] };
-                $ok = _deep_check($$e1, $$e2);
-                pop @Data_Stack if $ok;
-            }
-            elsif( $type eq 'SCALAR' ) {
-                push @Data_Stack, { type => 'REF', vals => [$e1, $e2] };
-                $ok = _deep_check($$e1, $$e2);
-                pop @Data_Stack if $ok;
-            }
-           else {
-               _whoa(1, "No type in _deep_check");
-           }
-        }
-    }
-
-    return $ok;
-}
-
-
-sub _whoa {
-    my($check, $desc) = @_;
-    if( $check ) {
-        die <<WHOA;
-WHOA!  $desc
-This should never happen!  Please contact the author immediately!
-WHOA
-    }
-}
-
-
-=item B<eq_hash>
-
-  my $is_eq = eq_hash(\%this, \%that);
-
-Determines if the two hashes contain the same keys and values.  This
-is a deep check.
-
-=cut
-
-sub eq_hash {
-    local @Data_Stack;
-    return _deep_check(@_);
-}
-
-sub _eq_hash {
-    my($a1, $a2) = @_;
-
-    if( grep !_type($_) eq 'HASH', $a1, $a2 ) {
-        warn "eq_hash passed a non-hash ref";
-        return 0;
-    }
-
-    return 1 if $a1 eq $a2;
-
-    my $ok = 1;
-    my $bigger = keys %$a1 > keys %$a2 ? $a1 : $a2;
-    foreach my $k (keys %$bigger) {
-        my $e1 = exists $a1->{$k} ? $a1->{$k} : $DNE;
-        my $e2 = exists $a2->{$k} ? $a2->{$k} : $DNE;
-
-        push @Data_Stack, { type => 'HASH', idx => $k, vals => [$e1, $e2] };
-        $ok = _deep_check($e1, $e2);
-        pop @Data_Stack if $ok;
-
-        last unless $ok;
-    }
-
-    return $ok;
-}
-
-=item B<eq_set>
-
-  my $is_eq = eq_set(\@this, \@that);
-
-Similar to eq_array(), except the order of the elements is B<not>
-important.  This is a deep check, but the irrelevancy of order only
-applies to the top level.
-
-    ok( eq_set(\@this, \@that) );
-
-Is better written:
-
-    is_deeply( [sort @this], [sort @that] );
-
-B<NOTE> By historical accident, this is not a true set comparision.
-While the order of elements does not matter, duplicate elements do.
-
-Test::Deep contains much better set comparison functions.
-
-=cut
-
-sub eq_set  {
-    my($a1, $a2) = @_;
-    return 0 unless @$a1 == @$a2;
-
-    # There's faster ways to do this, but this is easiest.
-    local $^W = 0;
-
-    # We must make sure that references are treated neutrally.  It really
-    # doesn't matter how we sort them, as long as both arrays are sorted
-    # with the same algorithm.
-    # Have to inline the sort routine due to a threading/sort bug.
-    # See [rt.cpan.org 6782]
-    return eq_array(
-           [sort { ref $a ? -1 : ref $b ? 1 : $a cmp $b } @$a1],
-           [sort { ref $a ? -1 : ref $b ? 1 : $a cmp $b } @$a2]
-    );
-}
-
-=back
-
-
-=head2 Extending and Embedding Test::More
-
-Sometimes the Test::More interface isn't quite enough.  Fortunately,
-Test::More is built on top of Test::Builder which provides a single,
-unified backend for any test library to use.  This means two test
-libraries which both use Test::Builder B<can be used together in the
-same program>.
-
-If you simply want to do a little tweaking of how the tests behave,
-you can access the underlying Test::Builder object like so:
-
-=over 4
-
-=item B<builder>
-
-    my $test_builder = Test::More->builder;
-
-Returns the Test::Builder object underlying Test::More for you to play
-with.
-
-=cut
-
-sub builder {
-    return Test::Builder->new;
-}
-
-=back
-
-
-=head1 EXIT CODES
-
-If all your tests passed, Test::Builder will exit with zero (which is
-normal).  If anything failed it will exit with how many failed.  If
-you run less (or more) tests than you planned, the missing (or extras)
-will be considered failures.  If no tests were ever run Test::Builder
-will throw a warning and exit with 255.  If the test died, even after
-having successfully completed all its tests, it will still be
-considered a failure and will exit with 255.
-
-So the exit codes are...
-
-    0                   all tests successful
-    255                 test died
-    any other number    how many failed (including missing or extras)
-
-If you fail more than 254 tests, it will be reported as 254.
-
-B<NOTE>  This behavior may go away in future versions.
-
-
-=head1 CAVEATS and NOTES
-
-=over 4
-
-=item Backwards compatibility
-
-Test::More works with Perls as old as 5.004_05.
-
-
-=item Overloaded objects
-
-String overloaded objects are compared B<as strings>.  This prevents
-Test::More from piercing an object's interface allowing better blackbox
-testing.  So if a function starts returning overloaded objects instead of
-bare strings your tests won't notice the difference.  This is good.
-
-However, it does mean that functions like is_deeply() cannot be used to
-test the internals of string overloaded objects.  In this case I would
-suggest Test::Deep which contains more flexible testing functions for
-complex data structures.
-
-
-=item Threads
-
-Test::More will only be aware of threads if "use threads" has been done
-I<before> Test::More is loaded.  This is ok:
-
-    use threads;
-    use Test::More;
-
-This may cause problems:
-
-    use Test::More
-    use threads;
-
-
-=item Test::Harness upgrade
-
-no_plan and todo depend on new Test::Harness features and fixes.  If
-you're going to distribute tests that use no_plan or todo your
-end-users will have to upgrade Test::Harness to the latest one on
-CPAN.  If you avoid no_plan and TODO tests, the stock Test::Harness
-will work fine.
-
-Installing Test::More should also upgrade Test::Harness.
-
-=back
-
-
-=head1 HISTORY
-
-This is a case of convergent evolution with Joshua Pritikin's Test
-module.  I was largely unaware of its existence when I'd first
-written my own ok() routines.  This module exists because I can't
-figure out how to easily wedge test names into Test's interface (along
-with a few other problems).
-
-The goal here is to have a testing utility that's simple to learn,
-quick to use and difficult to trip yourself up with while still
-providing more flexibility than the existing Test.pm.  As such, the
-names of the most common routines are kept tiny, special cases and
-magic side-effects are kept to a minimum.  WYSIWYG.
-
-
-=head1 SEE ALSO
-
-L<Test::Simple> if all this confuses you and you just want to write
-some tests.  You can upgrade to Test::More later (it's forward
-compatible).
-
-L<Test> is the old testing module.  Its main benefit is that it has
-been distributed with Perl since 5.004_05.
-
-L<Test::Harness> for details on how your test results are interpreted
-by Perl.
-
-L<Test::Differences> for more ways to test complex data structures.
-And it plays well with Test::More.
-
-L<Test::Class> is like XUnit but more perlish.
-
-L<Test::Deep> gives you more powerful complex data structure testing.
-
-L<Test::Unit> is XUnit style testing.
-
-L<Test::Inline> shows the idea of embedded testing.
-
-L<Bundle::Test> installs a whole bunch of useful test modules.
-
-
-=head1 AUTHORS
-
-Michael G Schwern E<lt>schwern@pobox.comE<gt> with much inspiration
-from Joshua Pritikin's Test module and lots of help from Barrie
-Slaymaker, Tony Bowden, blackstar.co.uk, chromatic, Fergal Daly and
-the perl-qa gang.
-
-
-=head1 BUGS
-
-See F<http://rt.cpan.org> to report and view bugs.
-
-
-=head1 COPYRIGHT
-
-Copyright 2001, 2002, 2004 by Michael G Schwern E<lt>schwern@pobox.comE<gt>.
-
-This program is free software; you can redistribute it and/or 
-modify it under the same terms as Perl itself.
-
-See F<http://www.perl.com/perl/misc/Artistic.html>
-
-=cut
-
-1;
diff --git a/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/t/Test/Simple.pm b/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/t/Test/Simple.pm
deleted file mode 100644 (file)
index 2317f54..0000000
+++ /dev/null
@@ -1,236 +0,0 @@
-package Test::Simple;
-
-use 5.004;
-
-use strict 'vars';
-our ($VERSION);
-$VERSION = '0.60';
-$VERSION = eval $VERSION;    # make the alpha version come out as a number
-
-
-use Test::Builder;
-my $Test = Test::Builder->new;
-
-sub import {
-    my $self = shift;
-    my $caller = caller;
-    *{$caller.'::ok'} = \&ok;
-
-    $Test->exported_to($caller);
-    $Test->plan(@_);
-}
-
-
-=head1 NAME
-
-Test::Simple - Basic utilities for writing tests.
-
-=head1 SYNOPSIS
-
-  use Test::Simple tests => 1;
-
-  ok( $foo eq $bar, 'foo is bar' );
-
-
-=head1 DESCRIPTION
-
-** If you are unfamiliar with testing B<read Test::Tutorial> first! **
-
-This is an extremely simple, extremely basic module for writing tests
-suitable for CPAN modules and other pursuits.  If you wish to do more
-complicated testing, use the Test::More module (a drop-in replacement
-for this one).
-
-The basic unit of Perl testing is the ok.  For each thing you want to
-test your program will print out an "ok" or "not ok" to indicate pass
-or fail.  You do this with the ok() function (see below).
-
-The only other constraint is you must pre-declare how many tests you
-plan to run.  This is in case something goes horribly wrong during the
-test and your test program aborts, or skips a test or whatever.  You
-do this like so:
-
-    use Test::Simple tests => 23;
-
-You must have a plan.
-
-
-=over 4
-
-=item B<ok>
-
-  ok( $foo eq $bar, $name );
-  ok( $foo eq $bar );
-
-ok() is given an expression (in this case C<$foo eq $bar>).  If it's
-true, the test passed.  If it's false, it didn't.  That's about it.
-
-ok() prints out either "ok" or "not ok" along with a test number (it
-keeps track of that for you).
-
-  # This produces "ok 1 - Hell not yet frozen over" (or not ok)
-  ok( get_temperature($hell) > 0, 'Hell not yet frozen over' );
-
-If you provide a $name, that will be printed along with the "ok/not
-ok" to make it easier to find your test when if fails (just search for
-the name).  It also makes it easier for the next guy to understand
-what your test is for.  It's highly recommended you use test names.
-
-All tests are run in scalar context.  So this:
-
-    ok( @stuff, 'I have some stuff' );
-
-will do what you mean (fail if stuff is empty)
-
-=cut
-
-sub ok ($;$) {
-    $Test->ok(@_);
-}
-
-
-=back
-
-Test::Simple will start by printing number of tests run in the form
-"1..M" (so "1..5" means you're going to run 5 tests).  This strange
-format lets Test::Harness know how many tests you plan on running in
-case something goes horribly wrong.
-
-If all your tests passed, Test::Simple will exit with zero (which is
-normal).  If anything failed it will exit with how many failed.  If
-you run less (or more) tests than you planned, the missing (or extras)
-will be considered failures.  If no tests were ever run Test::Simple
-will throw a warning and exit with 255.  If the test died, even after
-having successfully completed all its tests, it will still be
-considered a failure and will exit with 255.
-
-So the exit codes are...
-
-    0                   all tests successful
-    255                 test died
-    any other number    how many failed (including missing or extras)
-
-If you fail more than 254 tests, it will be reported as 254.
-
-This module is by no means trying to be a complete testing system.
-It's just to get you started.  Once you're off the ground its
-recommended you look at L<Test::More>.
-
-
-=head1 EXAMPLE
-
-Here's an example of a simple .t file for the fictional Film module.
-
-    use Test::Simple tests => 5;
-
-    use Film;  # What you're testing.
-
-    my $btaste = Film->new({ Title    => 'Bad Taste',
-                             Director => 'Peter Jackson',
-                             Rating   => 'R',
-                             NumExplodingSheep => 1
-                           });
-    ok( defined($btaste) && ref $btaste eq 'Film,     'new() works' );
-
-    ok( $btaste->Title      eq 'Bad Taste',     'Title() get'    );
-    ok( $btaste->Director   eq 'Peter Jackson', 'Director() get' );
-    ok( $btaste->Rating     eq 'R',             'Rating() get'   );
-    ok( $btaste->NumExplodingSheep == 1,        'NumExplodingSheep() get' );
-
-It will produce output like this:
-
-    1..5
-    ok 1 - new() works
-    ok 2 - Title() get
-    ok 3 - Director() get
-    not ok 4 - Rating() get
-    #    Failed test (t/film.t at line 14)
-    ok 5 - NumExplodingSheep() get
-    # Looks like you failed 1 tests of 5
-
-Indicating the Film::Rating() method is broken.
-
-
-=head1 CAVEATS
-
-Test::Simple will only report a maximum of 254 failures in its exit
-code.  If this is a problem, you probably have a huge test script.
-Split it into multiple files.  (Otherwise blame the Unix folks for
-using an unsigned short integer as the exit status).
-
-Because VMS's exit codes are much, much different than the rest of the
-universe, and perl does horrible mangling to them that gets in my way,
-it works like this on VMS.
-
-    0     SS$_NORMAL        all tests successful
-    4     SS$_ABORT         something went wrong
-
-Unfortunately, I can't differentiate any further.
-
-
-=head1 NOTES
-
-Test::Simple is B<explicitly> tested all the way back to perl 5.004.
-
-Test::Simple is thread-safe in perl 5.8.0 and up.
-
-=head1 HISTORY
-
-This module was conceived while talking with Tony Bowden in his
-kitchen one night about the problems I was having writing some really
-complicated feature into the new Testing module.  He observed that the
-main problem is not dealing with these edge cases but that people hate
-to write tests B<at all>.  What was needed was a dead simple module
-that took all the hard work out of testing and was really, really easy
-to learn.  Paul Johnson simultaneously had this idea (unfortunately,
-he wasn't in Tony's kitchen).  This is it.
-
-
-=head1 SEE ALSO
-
-=over 4
-
-=item L<Test::More>
-
-More testing functions!  Once you outgrow Test::Simple, look at
-Test::More.  Test::Simple is 100% forward compatible with Test::More
-(i.e. you can just use Test::More instead of Test::Simple in your
-programs and things will still work).
-
-=item L<Test>
-
-The original Perl testing module.
-
-=item L<Test::Unit>
-
-Elaborate unit testing.
-
-=item L<Test::Inline>, L<SelfTest>
-
-Embed tests in your code!
-
-=item L<Test::Harness>
-
-Interprets the output of your test program.
-
-=back
-
-
-=head1 AUTHORS
-
-Idea by Tony Bowden and Paul Johnson, code by Michael G Schwern
-E<lt>schwern@pobox.comE<gt>, wardrobe by Calvin Klein.
-
-
-=head1 COPYRIGHT
-
-Copyright 2001, 2002, 2004 by Michael G Schwern E<lt>schwern@pobox.comE<gt>.
-
-This program is free software; you can redistribute it and/or 
-modify it under the same terms as Perl itself.
-
-See F<http://www.perl.com/perl/misc/Artistic.html>
-
-=cut
-
-1;
diff --git a/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/t/meta-json.t b/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/t/meta-json.t
deleted file mode 100644 (file)
index 3d505cf..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-BEGIN {
-    if ($ENV{PERL_CORE}) {
-        chdir 't' if -d 't';
-        @INC = ("../lib", "lib/compress");
-    }
-}
-
-use lib qw(t t/compress);
-use Test::More;
-eval "use Test::CPAN::Meta::JSON";
-plan skip_all => "Test::CPAN::Meta::JSON required for testing META.json" if $@;
-meta_json_ok();
\ No newline at end of file
diff --git a/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/t/meta-yaml.t b/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/t/meta-yaml.t
deleted file mode 100644 (file)
index d0924aa..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-BEGIN {
-    if ($ENV{PERL_CORE}) {
-        chdir 't' if -d 't';
-        @INC = ("../lib", "lib/compress");
-    }
-}
-
-use lib qw(t t/compress);
-use Test::More;
-eval "use Test::CPAN::Meta";
-plan skip_all => "Test::CPAN::Meta required for testing META.yml" if $@;
-meta_yaml_ok();
\ No newline at end of file
index 89b8c32..b79df1e 100644 (file)
 #  endif
 #endif
 
+/* If available, use the ARM processor CRC32 instruction. */
+#if defined(__aarch64__) && defined(__ARM_FEATURE_CRC32) && W == 8
+#  define ARMCRC32
+#endif
+
 /* Local functions. */
 local z_crc_t multmodp OF((z_crc_t a, z_crc_t b));
 local z_crc_t x2nmodp OF((z_off64_t n, unsigned k));
 
-/* If available, use the ARM processor CRC32 instruction. */
-#if defined(__aarch64__) && defined(__ARM_FEATURE_CRC32) && W == 8
-#  define ARMCRC32
+#if defined(W) && (!defined(ARMCRC32) || defined(DYNAMIC_CRC_TABLE))
+    local z_word_t byte_swap OF((z_word_t word));
+#endif
+
+#if defined(W) && !defined(ARMCRC32)
+    local z_crc_t crc_word OF((z_word_t data));
+    local z_word_t crc_word_big OF((z_word_t data));
 #endif
 
 #if defined(W) && (!defined(ARMCRC32) || defined(DYNAMIC_CRC_TABLE))
@@ -645,8 +654,8 @@ unsigned long ZEXPORT crc32_z(
     len &= 7;
 
     /* Do three interleaved CRCs to realize the throughput of one crc32x
-       instruction per cycle. Each CRC is calcuated on Z_BATCH words. The three
-       CRCs are combined into a single CRC after each set of batches. */
+       instruction per cycle. Each CRC is calculated on Z_BATCH words. The
+       three CRCs are combined into a single CRC after each set of batches. */
     while (num >= 3 * Z_BATCH) {
         crc1 = 0;
         crc2 = 0;
@@ -1086,7 +1095,7 @@ uLong ZEXPORT crc32_combine(
     uLong crc2,
     z_off_t len2)
 {
-    return crc32_combine64(crc1, crc2, len2);
+    return crc32_combine64(crc1, crc2, (z_off64_t)len2);
 }
 
 /* ========================================================================= */
@@ -1103,7 +1112,7 @@ uLong ZEXPORT crc32_combine_gen64(
 uLong ZEXPORT crc32_combine_gen(
     z_off_t len2)
 {
-    return crc32_combine_gen64(len2);
+    return crc32_combine_gen64((z_off64_t)len2);
 }
 
 /* ========================================================================= */
index a5fb525..abe6138 100644 (file)
@@ -52,7 +52,7 @@
 #include "deflate.h"
 
 const char deflate_copyright[] =
-   " deflate 1.2.12 Copyright 1995-2022 Jean-loup Gailly and Mark Adler ";
+   " deflate 1.2.13 Copyright 1995-2022 Jean-loup Gailly and Mark Adler ";
 /*
   If you use the zlib library in a product, an acknowledgment is welcome
   in the documentation of your product. If for some reason you cannot
@@ -87,13 +87,7 @@ local void lm_init        OF((deflate_state *s));
 local void putShortMSB    OF((deflate_state *s, uInt b));
 local void flush_pending  OF((z_streamp strm));
 local unsigned read_buf   OF((z_streamp strm, Bytef *buf, unsigned size));
-#ifdef ASMV
-#  pragma message("Assembler code may have bugs -- use at your own risk")
-      void match_init OF((void)); /* asm code initialization */
-      uInt longest_match  OF((deflate_state *s, IPos cur_match));
-#else
 local uInt longest_match  OF((deflate_state *s, IPos cur_match));
-#endif
 
 #ifdef ZLIB_DEBUG
 local  void check_match OF((deflate_state *s, IPos start, IPos match,
@@ -160,7 +154,7 @@ local const config configuration_table[10] = {
  *    characters, so that a running hash key can be computed from the previous
  *    key instead of complete recalculation each time.
  */
-#define UPDATE_HASH(s,h,c) (h = (((h)<<s->hash_shift) ^ (c)) & s->hash_mask)
+#define UPDATE_HASH(s,h,c) (h = (((h) << s->hash_shift) ^ (c)) & s->hash_mask)
 
 
 /* ===========================================================================
@@ -191,9 +185,9 @@ local const config configuration_table[10] = {
  */
 #define CLEAR_HASH(s) \
     do { \
-        s->head[s->hash_size-1] = NIL; \
+        s->head[s->hash_size - 1] = NIL; \
         zmemzero((Bytef *)s->head, \
-                 (unsigned)(s->hash_size-1)*sizeof(*s->head)); \
+                 (unsigned)(s->hash_size - 1)*sizeof(*s->head)); \
     } while (0)
 
 /* ===========================================================================
@@ -284,6 +278,8 @@ int ZEXPORT deflateInit2_(
 
     if (windowBits < 0) { /* suppress zlib wrapper */
         wrap = 0;
+        if (windowBits < -15)
+            return Z_STREAM_ERROR;
         windowBits = -windowBits;
     }
 #ifdef GZIP
@@ -313,7 +309,7 @@ int ZEXPORT deflateInit2_(
     s->hash_bits = (uInt)memLevel + 7;
     s->hash_size = 1 << s->hash_bits;
     s->hash_mask = s->hash_size - 1;
-    s->hash_shift =  ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH);
+    s->hash_shift =  ((s->hash_bits + MIN_MATCH-1) / MIN_MATCH);
 
     s->window = (Bytef *) ZALLOC(strm, s->w_size, 2*sizeof(Byte));
     s->prev   = (Posf *)  ZALLOC(strm, s->w_size, sizeof(Pos));
@@ -339,11 +335,11 @@ int ZEXPORT deflateInit2_(
      * sym_buf value to read moves forward three bytes. From that symbol, up to
      * 31 bits are written to pending_buf. The closest the written pending_buf
      * bits gets to the next sym_buf symbol to read is just before the last
-     * code is written. At that time, 31*(n-2) bits have been written, just
-     * after 24*(n-2) bits have been consumed from sym_buf. sym_buf starts at
-     * 8*n bits into pending_buf. (Note that the symbol buffer fills when n-1
+     * code is written. At that time, 31*(n - 2) bits have been written, just
+     * after 24*(n - 2) bits have been consumed from sym_buf. sym_buf starts at
+     * 8*n bits into pending_buf. (Note that the symbol buffer fills when n - 1
      * symbols are written.) The closest the writing gets to what is unread is
-     * then n+14 bits. Here n is lit_bufsize, which is 16384 by default, and
+     * then n + 14 bits. Here n is lit_bufsize, which is 16384 by default, and
      * can range from 128 to 32768.
      *
      * Therefore, at a minimum, there are 142 bits of space between what is
@@ -673,36 +669,50 @@ int ZEXPORT deflateTune(
 }
 
 /* =========================================================================
- * For the default windowBits of 15 and memLevel of 8, this function returns
- * a close to exact, as well as small, upper bound on the compressed size.
- * They are coded as constants here for a reason--if the #define's are
- * changed, then this function needs to be changed as well.  The return
- * value for 15 and 8 only works for those exact settings.
+ * For the default windowBits of 15 and memLevel of 8, this function returns a
+ * close to exact, as well as small, upper bound on the compressed size. This
+ * is an expansion of ~0.03%, plus a small constant.
+ *
+ * For any setting other than those defaults for windowBits and memLevel, one
+ * of two worst case bounds is returned. This is at most an expansion of ~4% or
+ * ~13%, plus a small constant.
  *
- * For any setting other than those defaults for windowBits and memLevel,
- * the value returned is a conservative worst case for the maximum expansion
- * resulting from using fixed blocks instead of stored blocks, which deflate
- * can emit on compressed data for some combinations of the parameters.
+ * Both the 0.03% and 4% derive from the overhead of stored blocks. The first
+ * one is for stored blocks of 16383 bytes (memLevel == 8), whereas the second
+ * is for stored blocks of 127 bytes (the worst case memLevel == 1). The
+ * expansion results from five bytes of header for each stored block.
  *
- * This function could be more sophisticated to provide closer upper bounds for
- * every combination of windowBits and memLevel.  But even the conservative
- * upper bound of about 14% expansion does not seem onerous for output buffer
- * allocation.
+ * The larger expansion of 13% results from a window size less than or equal to
+ * the symbols buffer size (windowBits <= memLevel + 7). In that case some of
+ * the data being compressed may have slid out of the sliding window, impeding
+ * a stored block from being emitted. Then the only choice is a fixed or
+ * dynamic block, where a fixed block limits the maximum expansion to 9 bits
+ * per 8-bit byte, plus 10 bits for every block. The smallest block size for
+ * which this can occur is 255 (memLevel == 2).
+ *
+ * Shifts are used to approximate divisions, for speed.
  */
 uLong ZEXPORT deflateBound(
     z_streamp strm,
     uLong sourceLen)
 {
     deflate_state *s;
-    uLong complen, wraplen;
+    uLong fixedlen, storelen, wraplen;
+
+    /* upper bound for fixed blocks with 9-bit literals and length 255
+       (memLevel == 2, which is the lowest that may not use stored blocks) --
+       ~13% overhead plus a small constant */
+    fixedlen = sourceLen + (sourceLen >> 3) + (sourceLen >> 8) +
+               (sourceLen >> 9) + 4;
 
-    /* conservative upper bound for compressed data */
-    complen = sourceLen +
-              ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 5;
+    /* upper bound for stored blocks with length 127 (memLevel == 1) --
+       ~4% overhead plus a small constant */
+    storelen = sourceLen + (sourceLen >> 5) + (sourceLen >> 7) +
+               (sourceLen >> 11) + 7;
 
-    /* if can't get parameters, return conservative bound plus zlib wrapper */
+    /* if can't get parameters, return larger bound plus a zlib wrapper */
     if (deflateStateCheck(strm))
-        return complen + 6;
+        return (fixedlen > storelen ? fixedlen : storelen) + 6;
 
     /* compute wrapper length */
     s = strm->state;
@@ -739,11 +749,12 @@ uLong ZEXPORT deflateBound(
         wraplen = 6;
     }
 
-    /* if not default parameters, return conservative bound */
+    /* if not default parameters, return one of the conservative bounds */
     if (s->w_bits != 15 || s->hash_bits != 8 + 7)
-        return complen + wraplen;
+        return (s->w_bits <= s->hash_bits ? fixedlen : storelen) + wraplen;
 
-    /* default settings: return tight bound for that case */
+    /* default settings: return tight bound for that case -- ~0.03% overhead
+       plus a small constant */
     return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) +
            (sourceLen >> 25) + 13 - 6 + wraplen;
 }
@@ -855,7 +866,7 @@ int ZEXPORT deflate (
         s->status = BUSY_STATE;
     if (s->status == INIT_STATE) {
         /* zlib header */
-        uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8;
+        uInt header = (Z_DEFLATED + ((s->w_bits - 8) << 4)) << 8;
         uInt level_flags;
 
         if (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2)
@@ -1251,11 +1262,6 @@ local void lm_init (
     s->match_length = s->prev_length = MIN_MATCH-1;
     s->match_available = 0;
     s->ins_h = 0;
-#ifndef FASTEST
-#ifdef ASMV
-    match_init(); /* initialize the asm code */
-#endif
-#endif
 }
 
 #ifndef FASTEST
@@ -1268,18 +1274,14 @@ local void lm_init (
  *   string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1
  * OUT assertion: the match length is not greater than s->lookahead.
  */
-#ifndef ASMV
-/* For 80x86 and 680x0, an optimized version will be provided in match.asm or
- * match.S. The code will be functionally equivalent.
- */
 local uInt longest_match(
     deflate_state *s,
     IPos cur_match)
 {
     unsigned chain_length = s->max_chain_length;/* max hash chain length */
-    register Bytef *scan = s->window + s->strstart; /* current string */
-    register Bytef *match;                      /* matched string */
-    register int len;                           /* length of current match */
+    Bytef *scan = s->window + s->strstart; /* current string */
+    Bytef *match;                      /* matched string */
+    int len;                           /* length of current match */
     int best_len = (int)s->prev_length;         /* best match length so far */
     int nice_match = s->nice_match;             /* stop if match long enough */
     IPos limit = s->strstart > (IPos)MAX_DIST(s) ?
@@ -1294,13 +1296,13 @@ local uInt longest_match(
     /* Compare two bytes at a time. Note: this is not always beneficial.
      * Try with and without -DUNALIGNED_OK to check.
      */
-    register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1;
-    register ush scan_start = *(ushf*)scan;
-    register ush scan_end   = *(ushf*)(scan+best_len-1);
+    Bytef *strend = s->window + s->strstart + MAX_MATCH - 1;
+    ush scan_start = *(ushf*)scan;
+    ush scan_end   = *(ushf*)(scan + best_len - 1);
 #else
-    register Bytef *strend = s->window + s->strstart + MAX_MATCH;
-    register Byte scan_end1  = scan[best_len-1];
-    register Byte scan_end   = scan[best_len];
+    Bytef *strend = s->window + s->strstart + MAX_MATCH;
+    Byte scan_end1  = scan[best_len - 1];
+    Byte scan_end   = scan[best_len];
 #endif
 
     /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.
@@ -1317,7 +1319,8 @@ local uInt longest_match(
      */
     if ((uInt)nice_match > s->lookahead) nice_match = (int)s->lookahead;
 
-    Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead");
+    Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD,
+           "need lookahead");
 
     do {
         Assert(cur_match < s->strstart, "no future");
@@ -1335,43 +1338,44 @@ local uInt longest_match(
         /* This code assumes sizeof(unsigned short) == 2. Do not use
          * UNALIGNED_OK if your compiler uses a different size.
          */
-        if (*(ushf*)(match+best_len-1) != scan_end ||
+        if (*(ushf*)(match + best_len - 1) != scan_end ||
             *(ushf*)match != scan_start) continue;
 
         /* It is not necessary to compare scan[2] and match[2] since they are
          * always equal when the other bytes match, given that the hash keys
          * are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at
-         * strstart+3, +5, ... up to strstart+257. We check for insufficient
+         * strstart + 3, + 5, up to strstart + 257. We check for insufficient
          * lookahead only every 4th comparison; the 128th check will be made
-         * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is
+         * at strstart + 257. If MAX_MATCH-2 is not a multiple of 8, it is
          * necessary to put more guard bytes at the end of the window, or
          * to check more often for insufficient lookahead.
          */
         Assert(scan[2] == match[2], "scan[2]?");
         scan++, match++;
         do {
-        } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
-                 *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
-                 *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
-                 *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
+        } while (*(ushf*)(scan += 2) == *(ushf*)(match += 2) &&
+                 *(ushf*)(scan += 2) == *(ushf*)(match += 2) &&
+                 *(ushf*)(scan += 2) == *(ushf*)(match += 2) &&
+                 *(ushf*)(scan += 2) == *(ushf*)(match += 2) &&
                  scan < strend);
         /* The funny "do {}" generates better code on most compilers */
 
-        /* Here, scan <= window+strstart+257 */
-        Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
+        /* Here, scan <= window + strstart + 257 */
+        Assert(scan <= s->window + (unsigned)(s->window_size - 1),
+               "wild scan");
         if (*scan == *match) scan++;
 
-        len = (MAX_MATCH - 1) - (int)(strend-scan);
+        len = (MAX_MATCH - 1) - (int)(strend - scan);
         scan = strend - (MAX_MATCH-1);
 
 #else /* UNALIGNED_OK */
 
-        if (match[best_len]   != scan_end  ||
-            match[best_len-1] != scan_end1 ||
-            *match            != *scan     ||
-            *++match          != scan[1])      continue;
+        if (match[best_len]     != scan_end  ||
+            match[best_len - 1] != scan_end1 ||
+            *match              != *scan     ||
+            *++match            != scan[1])      continue;
 
-        /* The check at best_len-1 can be removed because it will be made
+        /* The check at best_len - 1 can be removed because it will be made
          * again later. (This heuristic is not always a win.)
          * It is not necessary to compare scan[2] and match[2] since they
          * are always equal when the other bytes match, given that
@@ -1381,7 +1385,7 @@ local uInt longest_match(
         Assert(*scan == *match, "match[2]?");
 
         /* We check for insufficient lookahead only every 8th comparison;
-         * the 256th check will be made at strstart+258.
+         * the 256th check will be made at strstart + 258.
          */
         do {
         } while (*++scan == *++match && *++scan == *++match &&
@@ -1390,7 +1394,8 @@ local uInt longest_match(
                  *++scan == *++match && *++scan == *++match &&
                  scan < strend);
 
-        Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
+        Assert(scan <= s->window + (unsigned)(s->window_size - 1),
+               "wild scan");
 
         len = MAX_MATCH - (int)(strend - scan);
         scan = strend - MAX_MATCH;
@@ -1402,9 +1407,9 @@ local uInt longest_match(
             best_len = len;
             if (len >= nice_match) break;
 #ifdef UNALIGNED_OK
-            scan_end = *(ushf*)(scan+best_len-1);
+            scan_end = *(ushf*)(scan + best_len - 1);
 #else
-            scan_end1  = scan[best_len-1];
+            scan_end1  = scan[best_len - 1];
             scan_end   = scan[best_len];
 #endif
         }
@@ -1414,7 +1419,6 @@ local uInt longest_match(
     if ((uInt)best_len <= s->lookahead) return (uInt)best_len;
     return s->lookahead;
 }
-#endif /* ASMV */
 
 #else /* FASTEST */
 
@@ -1425,17 +1429,18 @@ local uInt longest_match(
     deflate_state *s,
     IPos cur_match)
 {
-    register Bytef *scan = s->window + s->strstart; /* current string */
-    register Bytef *match;                       /* matched string */
-    register int len;                           /* length of current match */
-    register Bytef *strend = s->window + s->strstart + MAX_MATCH;
+    Bytef *scan = s->window + s->strstart; /* current string */
+    Bytef *match;                       /* matched string */
+    int len;                           /* length of current match */
+    Bytef *strend = s->window + s->strstart + MAX_MATCH;
 
     /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.
      * It is easy to get rid of this optimization if necessary.
      */
     Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever");
 
-    Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead");
+    Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD,
+           "need lookahead");
 
     Assert(cur_match < s->strstart, "no future");
 
@@ -1445,7 +1450,7 @@ local uInt longest_match(
      */
     if (match[0] != scan[0] || match[1] != scan[1]) return MIN_MATCH-1;
 
-    /* The check at best_len-1 can be removed because it will be made
+    /* The check at best_len - 1 can be removed because it will be made
      * again later. (This heuristic is not always a win.)
      * It is not necessary to compare scan[2] and match[2] since they
      * are always equal when the other bytes match, given that
@@ -1455,7 +1460,7 @@ local uInt longest_match(
     Assert(*scan == *match, "match[2]?");
 
     /* We check for insufficient lookahead only every 8th comparison;
-     * the 256th check will be made at strstart+258.
+     * the 256th check will be made at strstart + 258.
      */
     do {
     } while (*++scan == *++match && *++scan == *++match &&
@@ -1464,7 +1469,7 @@ local uInt longest_match(
              *++scan == *++match && *++scan == *++match &&
              scan < strend);
 
-    Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
+    Assert(scan <= s->window + (unsigned)(s->window_size - 1), "wild scan");
 
     len = MAX_MATCH - (int)(strend - scan);
 
@@ -1501,7 +1506,7 @@ local void check_match(
         z_error("invalid match");
     }
     if (z_verbose > 1) {
-        fprintf(stderr,"\\[%d,%d]", start-match, length);
+        fprintf(stderr,"\\[%d,%d]", start - match, length);
         do { putc(s->window[start++], stderr); } while (--length != 0);
     }
 }
@@ -1547,9 +1552,9 @@ local void fill_window(
         /* If the window is almost full and there is insufficient lookahead,
          * move the upper half to the lower one to make room in the upper half.
          */
-        if (s->strstart >= wsize+MAX_DIST(s)) {
+        if (s->strstart >= wsize + MAX_DIST(s)) {
 
-            zmemcpy(s->window, s->window+wsize, (unsigned)wsize - more);
+            zmemcpy(s->window, s->window + wsize, (unsigned)wsize - more);
             s->match_start -= wsize;
             s->strstart    -= wsize; /* we now have strstart >= MAX_DIST */
             s->block_start -= (long) wsize;
@@ -1680,7 +1685,7 @@ local void fill_window(
  *
  * deflate_stored() is written to minimize the number of times an input byte is
  * copied. It is most efficient with large input and output buffers, which
- * maximizes the opportunites to have a single copy from next_in to next_out.
+ * maximizes the opportunities to have a single copy from next_in to next_out.
  */
 local block_state deflate_stored(
     deflate_state *s,
@@ -1890,7 +1895,7 @@ local block_state deflate_fast(
             if (s->lookahead == 0) break; /* flush the current block */
         }
 
-        /* Insert the string window[strstart .. strstart+2] in the
+        /* Insert the string window[strstart .. strstart + 2] in the
          * dictionary, and set hash_head to the head of the hash chain:
          */
         hash_head = NIL;
@@ -1938,7 +1943,7 @@ local block_state deflate_fast(
                 s->strstart += s->match_length;
                 s->match_length = 0;
                 s->ins_h = s->window[s->strstart];
-                UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]);
+                UPDATE_HASH(s, s->ins_h, s->window[s->strstart + 1]);
 #if MIN_MATCH != 3
                 Call UPDATE_HASH() MIN_MATCH-3 more times
 #endif
@@ -1949,7 +1954,7 @@ local block_state deflate_fast(
         } else {
             /* No match, output a literal byte */
             Tracevv((stderr,"%c", s->window[s->strstart]));
-            _tr_tally_lit (s, s->window[s->strstart], bflush);
+            _tr_tally_lit(s, s->window[s->strstart], bflush);
             s->lookahead--;
             s->strstart++;
         }
@@ -1993,7 +1998,7 @@ local block_state deflate_slow(
             if (s->lookahead == 0) break; /* flush the current block */
         }
 
-        /* Insert the string window[strstart .. strstart+2] in the
+        /* Insert the string window[strstart .. strstart + 2] in the
          * dictionary, and set hash_head to the head of the hash chain:
          */
         hash_head = NIL;
@@ -2035,17 +2040,17 @@ local block_state deflate_slow(
             uInt max_insert = s->strstart + s->lookahead - MIN_MATCH;
             /* Do not insert strings in hash table beyond this. */
 
-            check_match(s, s->strstart-1, s->prev_match, s->prev_length);
+            check_match(s, s->strstart - 1, s->prev_match, s->prev_length);
 
-            _tr_tally_dist(s, s->strstart -1 - s->prev_match,
+            _tr_tally_dist(s, s->strstart - 1 - s->prev_match,
                            s->prev_length - MIN_MATCH, bflush);
 
             /* Insert in hash table all strings up to the end of the match.
-             * strstart-1 and strstart are already inserted. If there is not
+             * strstart - 1 and strstart are already inserted. If there is not
              * enough lookahead, the last two strings are not inserted in
              * the hash table.
              */
-            s->lookahead -= s->prev_length-1;
+            s->lookahead -= s->prev_length - 1;
             s->prev_length -= 2;
             do {
                 if (++s->strstart <= max_insert) {
@@ -2063,8 +2068,8 @@ local block_state deflate_slow(
              * single literal. If there was a match but the current match
              * is longer, truncate the previous match to a single literal.
              */
-            Tracevv((stderr,"%c", s->window[s->strstart-1]));
-            _tr_tally_lit(s, s->window[s->strstart-1], bflush);
+            Tracevv((stderr,"%c", s->window[s->strstart - 1]));
+            _tr_tally_lit(s, s->window[s->strstart - 1], bflush);
             if (bflush) {
                 FLUSH_BLOCK_ONLY(s, 0);
             }
@@ -2082,8 +2087,8 @@ local block_state deflate_slow(
     }
     Assert (flush != Z_NO_FLUSH, "no flush?");
     if (s->match_available) {
-        Tracevv((stderr,"%c", s->window[s->strstart-1]));
-        _tr_tally_lit(s, s->window[s->strstart-1], bflush);
+        Tracevv((stderr,"%c", s->window[s->strstart - 1]));
+        _tr_tally_lit(s, s->window[s->strstart - 1], bflush);
         s->match_available = 0;
     }
     s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1;
@@ -2140,7 +2145,8 @@ local block_state deflate_rle(
                 if (s->match_length > s->lookahead)
                     s->match_length = s->lookahead;
             }
-            Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan");
+            Assert(scan <= s->window + (uInt)(s->window_size - 1),
+                   "wild scan");
         }
 
         /* Emit match if have run of MIN_MATCH or longer, else emit literal */
@@ -2155,7 +2161,7 @@ local block_state deflate_rle(
         } else {
             /* No match, output a literal byte */
             Tracevv((stderr,"%c", s->window[s->strstart]));
-            _tr_tally_lit (s, s->window[s->strstart], bflush);
+            _tr_tally_lit(s, s->window[s->strstart], bflush);
             s->lookahead--;
             s->strstart++;
         }
@@ -2195,7 +2201,7 @@ local block_state deflate_huff(
         /* Output a literal byte */
         s->match_length = 0;
         Tracevv((stderr,"%c", s->window[s->strstart]));
-        _tr_tally_lit (s, s->window[s->strstart], bflush);
+        _tr_tally_lit(s, s->window[s->strstart], bflush);
         s->lookahead--;
         s->strstart++;
         if (bflush) FLUSH_BLOCK(s, 0);
index 17c2261..1a06cd5 100644 (file)
@@ -329,8 +329,8 @@ void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf,
 # define _tr_tally_dist(s, distance, length, flush) \
   { uch len = (uch)(length); \
     ush dist = (ush)(distance); \
-    s->sym_buf[s->sym_next++] = dist; \
-    s->sym_buf[s->sym_next++] = dist >> 8; \
+    s->sym_buf[s->sym_next++] = (uch)dist; \
+    s->sym_buf[s->sym_next++] = (uch)(dist >> 8); \
     s->sym_buf[s->sym_next++] = len; \
     dist--; \
     s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \
index 390ceaf..910a061 100644 (file)
@@ -168,6 +168,8 @@ int ZEXPORT inflateReset2(
 
     /* extract wrap request from windowBits parameter */
     if (windowBits < 0) {
+        if (windowBits < -15)
+            return Z_STREAM_ERROR;
         wrap = 0;
         windowBits = -windowBits;
     }
@@ -764,8 +766,9 @@ int ZEXPORT inflate(
                 if (copy > have) copy = have;
                 if (copy) {
                     if (state->head != Z_NULL &&
-                        state->head->extra != Z_NULL) {
-                        len = state->head->extra_len - state->length;
+                        state->head->extra != Z_NULL &&
+                        (len = state->head->extra_len - state->length) <
+                            state->head->extra_max) {
                         zmemcpy(state->head->extra + len, next,
                                 len + copy > state->head->extra_max ?
                                 state->head->extra_max - len : copy);
index 658b868..20d3735 100644 (file)
@@ -1,3 +1,4 @@
+
 /* trees.c -- output deflated data using Huffman coding
  * Copyright (C) 1995-2021 Jean-loup Gailly
  * detect_data_type() function provided freely by Cosmin Truta, 2006
@@ -193,7 +194,7 @@ local void send_bits(
     s->bits_sent += (ulg)length;
 
     /* If not enough room in bi_buf, use (valid) bits from bi_buf and
-     * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid))
+     * (16 - bi_valid) bits from value, leaving (width - (16 - bi_valid))
      * unused bits in value.
      */
     if (s->bi_valid > (int)Buf_size - length) {
@@ -256,7 +257,7 @@ local void tr_static_init()
     length = 0;
     for (code = 0; code < LENGTH_CODES-1; code++) {
         base_length[code] = length;
-        for (n = 0; n < (1<<extra_lbits[code]); n++) {
+        for (n = 0; n < (1 << extra_lbits[code]); n++) {
             _length_code[length++] = (uch)code;
         }
     }
@@ -265,13 +266,13 @@ local void tr_static_init()
      * in two different ways: code 284 + 5 bits or code 285, so we
      * overwrite length_code[255] to use the best encoding:
      */
-    _length_code[length-1] = (uch)code;
+    _length_code[length - 1] = (uch)code;
 
     /* Initialize the mapping dist (0..32K) -> dist code (0..29) */
     dist = 0;
     for (code = 0 ; code < 16; code++) {
         base_dist[code] = dist;
-        for (n = 0; n < (1<<extra_dbits[code]); n++) {
+        for (n = 0; n < (1 << extra_dbits[code]); n++) {
             _dist_code[dist++] = (uch)code;
         }
     }
@@ -279,11 +280,11 @@ local void tr_static_init()
     dist >>= 7; /* from now on, all distances are divided by 128 */
     for ( ; code < D_CODES; code++) {
         base_dist[code] = dist << 7;
-        for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) {
+        for (n = 0; n < (1 << (extra_dbits[code] - 7)); n++) {
             _dist_code[256 + dist++] = (uch)code;
         }
     }
-    Assert (dist == 256, "tr_static_init: 256+dist != 512");
+    Assert (dist == 256, "tr_static_init: 256 + dist != 512");
 
     /* Construct the codes of the static literal tree */
     for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0;
@@ -312,7 +313,7 @@ local void tr_static_init()
 }
 
 /* ===========================================================================
- * Genererate the file trees.h describing the static trees.
+ * Generate the file trees.h describing the static trees.
  */
 #ifdef GEN_TREES_H
 #  ifndef ZLIB_DEBUG
@@ -321,7 +322,7 @@ local void tr_static_init()
 
 #  define SEPARATOR(i, last, width) \
       ((i) == (last)? "\n};\n\n" :    \
-       ((i) % (width) == (width)-1 ? ",\n" : ", "))
+       ((i) % (width) == (width) - 1 ? ",\n" : ", "))
 
 void gen_trees_header()
 {
@@ -458,7 +459,7 @@ local void pqdownheap(
     while (j <= s->heap_len) {
         /* Set j to the smallest of the two sons: */
         if (j < s->heap_len &&
-            smaller(tree, s->heap[j+1], s->heap[j], s->depth)) {
+            smaller(tree, s->heap[j + 1], s->heap[j], s->depth)) {
             j++;
         }
         /* Exit if v is smaller than both sons */
@@ -507,7 +508,7 @@ local void gen_bitlen(
      */
     tree[s->heap[s->heap_max]].Len = 0; /* root of the heap */
 
-    for (h = s->heap_max+1; h < HEAP_SIZE; h++) {
+    for (h = s->heap_max + 1; h < HEAP_SIZE; h++) {
         n = s->heap[h];
         bits = tree[tree[n].Dad].Len + 1;
         if (bits > max_length) bits = max_length, overflow++;
@@ -518,7 +519,7 @@ local void gen_bitlen(
 
         s->bl_count[bits]++;
         xbits = 0;
-        if (n >= base) xbits = extra[n-base];
+        if (n >= base) xbits = extra[n - base];
         f = tree[n].Freq;
         s->opt_len += (ulg)f * (unsigned)(bits + xbits);
         if (stree) s->static_len += (ulg)f * (unsigned)(stree[n].Len + xbits);
@@ -530,10 +531,10 @@ local void gen_bitlen(
 
     /* Find the first bit length which could increase: */
     do {
-        bits = max_length-1;
+        bits = max_length - 1;
         while (s->bl_count[bits] == 0) bits--;
-        s->bl_count[bits]--;      /* move one leaf down the tree */
-        s->bl_count[bits+1] += 2; /* move one overflow item as its brother */
+        s->bl_count[bits]--;        /* move one leaf down the tree */
+        s->bl_count[bits + 1] += 2; /* move one overflow item as its brother */
         s->bl_count[max_length]--;
         /* The brother of the overflow item also moves one step up,
          * but this does not affect bl_count[max_length]
@@ -583,13 +584,13 @@ local void gen_codes (
      * without bit reversal.
      */
     for (bits = 1; bits <= MAX_BITS; bits++) {
-        code = (code + bl_count[bits-1]) << 1;
+        code = (code + bl_count[bits - 1]) << 1;
         next_code[bits] = (ush)code;
     }
     /* Check that the bit counts in bl_count are consistent. The last code
      * must be all ones.
      */
-    Assert (code + bl_count[MAX_BITS]-1 == (1<<MAX_BITS)-1,
+    Assert (code + bl_count[MAX_BITS] - 1 == (1 << MAX_BITS) - 1,
             "inconsistent bit counts");
     Tracev((stderr,"\ngen_codes: max_code %d ", max_code));
 
@@ -600,7 +601,7 @@ local void gen_codes (
         tree[n].Code = (ush)bi_reverse(next_code[len]++, len);
 
         Tracecv(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ",
-             n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1));
+            n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len] - 1));
     }
 }
 
@@ -624,7 +625,7 @@ local void build_tree(
     int node;          /* new node being created */
 
     /* Construct the initial heap, with least frequent element in
-     * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1].
+     * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n + 1].
      * heap[0] is not used.
      */
     s->heap_len = 0, s->heap_max = HEAP_SIZE;
@@ -652,7 +653,7 @@ local void build_tree(
     }
     desc->max_code = max_code;
 
-    /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree,
+    /* The elements heap[heap_len/2 + 1 .. heap_len] are leaves of the tree,
      * establish sub-heaps of increasing lengths:
      */
     for (n = s->heap_len/2; n >= 1; n--) pqdownheap(s, tree, n);
@@ -714,10 +715,10 @@ local void scan_tree (
     int min_count = 4;         /* min repeat count */
 
     if (nextlen == 0) max_count = 138, min_count = 3;
-    tree[max_code+1].Len = (ush)0xffff; /* guard */
+    tree[max_code + 1].Len = (ush)0xffff; /* guard */
 
     for (n = 0; n <= max_code; n++) {
-        curlen = nextlen; nextlen = tree[n+1].Len;
+        curlen = nextlen; nextlen = tree[n + 1].Len;
         if (++count < max_count && curlen == nextlen) {
             continue;
         } else if (count < min_count) {
@@ -758,11 +759,11 @@ local void send_tree (
     int max_count = 7;         /* max repeat count */
     int min_count = 4;         /* min repeat count */
 
-    /* tree[max_code+1].Len = -1; */  /* guard already set */
+    /* tree[max_code + 1].Len = -1; */  /* guard already set */
     if (nextlen == 0) max_count = 138, min_count = 3;
 
     for (n = 0; n <= max_code; n++) {
-        curlen = nextlen; nextlen = tree[n+1].Len;
+        curlen = nextlen; nextlen = tree[n + 1].Len;
         if (++count < max_count && curlen == nextlen) {
             continue;
         } else if (count < min_count) {
@@ -773,13 +774,13 @@ local void send_tree (
                 send_code(s, curlen, s->bl_tree); count--;
             }
             Assert(count >= 3 && count <= 6, " 3_6?");
-            send_code(s, REP_3_6, s->bl_tree); send_bits(s, count-3, 2);
+            send_code(s, REP_3_6, s->bl_tree); send_bits(s, count - 3, 2);
 
         } else if (count <= 10) {
-            send_code(s, REPZ_3_10, s->bl_tree); send_bits(s, count-3, 3);
+            send_code(s, REPZ_3_10, s->bl_tree); send_bits(s, count - 3, 3);
 
         } else {
-            send_code(s, REPZ_11_138, s->bl_tree); send_bits(s, count-11, 7);
+            send_code(s, REPZ_11_138, s->bl_tree); send_bits(s, count - 11, 7);
         }
         count = 0; prevlen = curlen;
         if (nextlen == 0) {
@@ -807,8 +808,8 @@ local int build_bl_tree(
 
     /* Build the bit length tree: */
     build_tree(s, (tree_desc *)(&(s->bl_desc)));
-    /* opt_len now includes the length of the tree representations, except
-     * the lengths of the bit lengths codes and the 5+5+4 bits for the counts.
+    /* opt_len now includes the length of the tree representations, except the
+     * lengths of the bit lengths codes and the 5 + 5 + 4 bits for the counts.
      */
 
     /* Determine the number of bit length codes to send. The pkzip format
@@ -819,7 +820,7 @@ local int build_bl_tree(
         if (s->bl_tree[bl_order[max_blindex]].Len != 0) break;
     }
     /* Update opt_len to include the bit length tree and counts */
-    s->opt_len += 3*((ulg)max_blindex+1) + 5+5+4;
+    s->opt_len += 3*((ulg)max_blindex + 1) + 5 + 5 + 4;
     Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld",
             s->opt_len, s->static_len));
 
@@ -843,19 +844,19 @@ local void send_all_trees(
     Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES,
             "too many codes");
     Tracev((stderr, "\nbl counts: "));
-    send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */
-    send_bits(s, dcodes-1,   5);
-    send_bits(s, blcodes-4,  4); /* not -3 as stated in appnote.txt */
+    send_bits(s, lcodes - 257, 5);  /* not +255 as stated in appnote.txt */
+    send_bits(s, dcodes - 1,   5);
+    send_bits(s, blcodes - 4,  4);  /* not -3 as stated in appnote.txt */
     for (rank = 0; rank < blcodes; rank++) {
         Tracev((stderr, "\nbl code %2d ", bl_order[rank]));
         send_bits(s, s->bl_tree[bl_order[rank]].Len, 3);
     }
     Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent));
 
-    send_tree(s, (ct_data *)s->dyn_ltree, lcodes-1); /* literal tree */
+    send_tree(s, (ct_data *)s->dyn_ltree, lcodes - 1);  /* literal tree */
     Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent));
 
-    send_tree(s, (ct_data *)s->dyn_dtree, dcodes-1); /* distance tree */
+    send_tree(s, (ct_data *)s->dyn_dtree, dcodes - 1);  /* distance tree */
     Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent));
 }
 
@@ -868,7 +869,7 @@ void ZLIB_INTERNAL _tr_stored_block(
     ulg stored_len,
     int last)
 {
-    send_bits(s, (STORED_BLOCK<<1)+last, 3);    /* send block type */
+    send_bits(s, (STORED_BLOCK<<1) + last, 3);  /* send block type */
     bi_windup(s);        /* align on byte boundary */
     put_short(s, (ush)stored_len);
     put_short(s, (ush)~stored_len);
@@ -879,7 +880,7 @@ void ZLIB_INTERNAL _tr_stored_block(
     s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L;
     s->compressed_len += (stored_len + 4) << 3;
     s->bits_sent += 2*16;
-    s->bits_sent += stored_len<<3;
+    s->bits_sent += stored_len << 3;
 #endif
 }
 
@@ -945,14 +946,17 @@ void ZLIB_INTERNAL _tr_flush_block(
         max_blindex = build_bl_tree(s);
 
         /* Determine the best encoding. Compute the block lengths in bytes. */
-        opt_lenb = (s->opt_len+3+7)>>3;
-        static_lenb = (s->static_len+3+7)>>3;
+        opt_lenb = (s->opt_len + 3 + 7) >> 3;
+        static_lenb = (s->static_len + 3 + 7) >> 3;
 
         Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ",
                 opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len,
                 s->sym_next / 3));
 
-        if (static_lenb <= opt_lenb) opt_lenb = static_lenb;
+#ifndef FORCE_STATIC
+        if (static_lenb <= opt_lenb || s->strategy == Z_FIXED)
+#endif
+            opt_lenb = static_lenb;
 
     } else {
         Assert(buf != (char*)0, "lost buf");
@@ -962,7 +966,7 @@ void ZLIB_INTERNAL _tr_flush_block(
 #ifdef FORCE_STORED
     if (buf != (char*)0) { /* force stored block */
 #else
-    if (stored_len+4 <= opt_lenb && buf != (char*)0) {
+    if (stored_len + 4 <= opt_lenb && buf != (char*)0) {
                        /* 4: two words for the lengths */
 #endif
         /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE.
@@ -973,21 +977,17 @@ void ZLIB_INTERNAL _tr_flush_block(
          */
         _tr_stored_block(s, buf, stored_len, last);
 
-#ifdef FORCE_STATIC
-    } else if (static_lenb >= 0) { /* force static trees */
-#else
-    } else if (s->strategy == Z_FIXED || static_lenb == opt_lenb) {
-#endif
-        send_bits(s, (STATIC_TREES<<1)+last, 3);
+    } else if (static_lenb == opt_lenb) {
+        send_bits(s, (STATIC_TREES<<1) + last, 3);
         compress_block(s, (const ct_data *)static_ltree,
                        (const ct_data *)static_dtree);
 #ifdef ZLIB_DEBUG
         s->compressed_len += 3 + s->static_len;
 #endif
     } else {
-        send_bits(s, (DYN_TREES<<1)+last, 3);
-        send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1,
-                       max_blindex+1);
+        send_bits(s, (DYN_TREES<<1) + last, 3);
+        send_all_trees(s, s->l_desc.max_code + 1, s->d_desc.max_code + 1,
+                       max_blindex + 1);
         compress_block(s, (const ct_data *)s->dyn_ltree,
                        (const ct_data *)s->dyn_dtree);
 #ifdef ZLIB_DEBUG
@@ -1006,8 +1006,8 @@ void ZLIB_INTERNAL _tr_flush_block(
         s->compressed_len += 7;  /* align on byte boundary */
 #endif
     }
-    Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3,
-           s->compressed_len-7*last));
+    Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len >> 3,
+           s->compressed_len - 7*last));
 }
 
 /* ===========================================================================
@@ -1019,9 +1019,9 @@ int ZLIB_INTERNAL _tr_tally (
     unsigned dist,
     unsigned lc)
 {
-    s->sym_buf[s->sym_next++] = dist;
-    s->sym_buf[s->sym_next++] = dist >> 8;
-    s->sym_buf[s->sym_next++] = lc;
+    s->sym_buf[s->sym_next++] = (uch)dist;
+    s->sym_buf[s->sym_next++] = (uch)(dist >> 8);
+    s->sym_buf[s->sym_next++] = (uch)lc;
     if (dist == 0) {
         /* lc is the unmatched char */
         s->dyn_ltree[lc].Freq++;
@@ -1033,7 +1033,7 @@ int ZLIB_INTERNAL _tr_tally (
                (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) &&
                (ush)d_code(dist) < (ush)D_CODES,  "_tr_tally: bad match");
 
-        s->dyn_ltree[_length_code[lc]+LITERALS+1].Freq++;
+        s->dyn_ltree[_length_code[lc] + LITERALS + 1].Freq++;
         s->dyn_dtree[d_code(dist)].Freq++;
     }
     return (s->sym_next == s->sym_end);
@@ -1063,7 +1063,7 @@ local void compress_block(
         } else {
             /* Here, lc is the match length - MIN_MATCH */
             code = _length_code[lc];
-            send_code(s, code+LITERALS+1, ltree); /* send the length code */
+            send_code(s, code + LITERALS + 1, ltree);   /* send length code */
             extra = extra_lbits[code];
             if (extra != 0) {
                 lc -= base_length[code];
@@ -1140,7 +1140,7 @@ local unsigned bi_reverse(
     unsigned code,
     int len)
 {
-    register unsigned res = 0;
+    unsigned res = 0;
     do {
         res |= code & 1;
         code >>= 1, res <<= 1;
@@ -1179,6 +1179,6 @@ local void bi_windup(
     s->bi_buf = 0;
     s->bi_valid = 0;
 #ifdef ZLIB_DEBUG
-    s->bits_sent = (s->bits_sent+7) & ~7;
+    s->bits_sent = (s->bits_sent + 7) & ~7;
 #endif
 }
index 9d88473..3e60df6 100644 (file)
 #    ifdef FAR
 #      undef FAR
 #    endif
+#    ifndef WIN32_LEAN_AND_MEAN
+#      define WIN32_LEAN_AND_MEAN
+#    endif
 #    include <windows.h>
      /* No need for _export, use ZLIB.DEF instead. */
      /* For complete Windows compatibility, use WINAPI, not __stdcall. */
@@ -467,11 +470,18 @@ typedef uLong FAR uLongf;
 #  undef _LARGEFILE64_SOURCE
 #endif
 
-#if defined(__WATCOMC__) && !defined(Z_HAVE_UNISTD_H)
-#  define Z_HAVE_UNISTD_H
+#ifndef Z_HAVE_UNISTD_H
+#  ifdef __WATCOMC__
+#    define Z_HAVE_UNISTD_H
+#  endif
+#endif
+#ifndef Z_HAVE_UNISTD_H
+#  if defined(_LARGEFILE64_SOURCE) && !defined(_WIN32)
+#    define Z_HAVE_UNISTD_H
+#  endif
 #endif
 #ifndef Z_SOLO
-#  if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE)
+#  if defined(Z_HAVE_UNISTD_H)
 #    include <unistd.h>         /* for SEEK_*, off_t, and _LFS64_LARGEFILE */
 #    ifdef VMS
 #      include <unixio.h>       /* for off_t */
index a19ac2b..e7ea64e 100644 (file)
@@ -61,9 +61,11 @@ uLong ZEXPORT zlibCompileFlags()
 #ifdef ZLIB_DEBUG
     flags += 1 << 8;
 #endif
+    /*
 #if defined(ASMV) || defined(ASMINF)
     flags += 1 << 9;
 #endif
+     */
 #ifdef ZLIB_WINAPI
     flags += 1 << 10;
 #endif
@@ -214,7 +216,7 @@ local ptr_table table[MAX_PTR];
  * a protected system like OS/2. Use Microsoft C instead.
  */
 
-voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, unsigned items, unsigned size)
+voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, unsigned items, unsigned size)
 {
     voidpf buf;
     ulg bsize = (ulg)items*size;
@@ -240,7 +242,7 @@ voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, unsigned items, unsigned size)
     return buf;
 }
 
-void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr)
+void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr)
 {
     int n;
 
@@ -277,13 +279,13 @@ void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr)
 #  define _hfree   hfree
 #endif
 
-voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, uInt items, uInt size)
+voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, uInt items, uInt size)
 {
     (void)opaque;
     return _halloc((long)items, size);
 }
 
-void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr)
+void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr)
 {
     (void)opaque;
     _hfree(ptr);
index 2ee0791..d1ba8d9 100644 (file)
@@ -197,6 +197,7 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
     (!defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0)
     ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t));
     ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t));
+    ZEXTERN uLong ZEXPORT crc32_combine_gen64 OF((z_off_t));
 #endif
 
         /* common defaults */
index 774446a..d8fd2a8 100644 (file)
@@ -6,7 +6,7 @@ use warnings;
 use Config;
 use Exporter;
 use vars qw($VERSION @ISA @EXPORT_OK %EXPORT_TAGS);
-$VERSION     = "0.33";
+$VERSION     = "0.36";
 @ISA         = qw( Exporter );
 @EXPORT_OK   = qw( plv2hash summary myconfig signature );
 %EXPORT_TAGS = (
@@ -29,6 +29,8 @@ my %BTD = map {( $_ => 0 )} qw(
     DEBUGGING
     NO_HASH_SEED
     NO_MATHOMS
+    NO_PERL_INTERNAL_RAND_SEED
+    NO_PERL_RAND_SEED
     NO_TAINT_SUPPORT
     PERL_BOOL_AS_CHAR
     PERL_COPY_ON_WRITE
@@ -57,9 +59,11 @@ my %BTD = map {( $_ => 0 )} qw(
     PERL_PERTURB_KEYS_DISABLED
     PERL_PERTURB_KEYS_RANDOM
     PERL_PRESERVE_IVUV
+    PERL_RC_STACK
     PERL_RELOCATABLE_INCPUSH
     PERL_USE_DEVEL
     PERL_USE_SAFE_PUTENV
+    PERL_USE_UNSHARED_KEYS_IN_LARGE_HASHES
     SILENT_NO_TAINT_SUPPORT
     UNLINK_ALL_VERSIONS
     USE_ATTRIBUTES_FOR_PERLIO
@@ -81,10 +85,13 @@ my %BTD = map {( $_ => 0 )} qw(
     HAVE_INTERP_INTERN
     MULTIPLICITY
     MYMALLOC
+    NO_HASH_SEED
     PERL_DEBUG_READONLY_COW
     PERL_DEBUG_READONLY_OPS
     PERL_GLOBAL_STRUCT
     PERL_GLOBAL_STRUCT_PRIVATE
+    PERL_HASH_NO_SBOX32
+    PERL_HASH_USE_SBOX32
     PERL_IMPLICIT_CONTEXT
     PERL_IMPLICIT_SYS
     PERLIO_LAYERS
@@ -263,7 +270,10 @@ sub plv2hash {
        $config{$k} = $v;
        }
 
-    if (my %kv = ($pv =~ m{\b
+    my %kv;
+    if ($pv =~ m{\S,? (?:osvers|archname)=}) { # attr is not the first on the line
+       # up to and including 5.24, a line could have multiple kv pairs
+       %kv = ($pv =~ m{\b
            (\w+)               # key
            \s*=                # assign
            ( '\s*[^']*?\s*'    # quoted value
@@ -271,17 +281,27 @@ sub plv2hash {
            | \S+               # unquoted value
            | \s*\n             # empty
            )
-           (?:,?\s+|\s*\n)?    # separator (5.8.x reports did not have a ','
-           }gx)) {             # between every kv pair
-
-       while (my ($k, $v) = each %kv) {
-           $k =~ s{\s+$}       {};
-           $v =~ s{\s*\n\z}    {};
-           $v =~ s{,$}         {};
-           $v =~ m{^'(.*)'$} and $v = $1;
-           $v =~ s{\s+$}       {};
-           $config{$k} = $v;
-           }
+           (?:,?\s+|\s*\n)?    # optional separator (5.8.x reports did
+           }gx);               # not have a ',' between every kv pair)
+       }
+    else {
+       # as of 5.25, each kv pair is listed on its own line
+       %kv = ($pv =~ m{^
+           \s+
+           (\w+)               # key
+           \s*=\s*             # assign
+           (.*?)               # value
+           \s*,?\s*$
+           }gmx);
+       }
+
+    while (my ($k, $v) = each %kv) {
+       $k =~ s{\s+$}           {};
+       $v =~ s{\s*\n\z}        {};
+       $v =~ s{,$}             {};
+       $v =~ m{^'(.*)'$} and $v = $1;
+       $v =~ s{\s+$}   {};
+       $config{$k} = $v;
        }
 
     my $build = { %empty_build };
@@ -554,7 +574,7 @@ H.Merijn Brand <h.m.brand@xs4all.nl>
 
 =head1 COPYRIGHT AND LICENSE
 
-Copyright (C) 2009-2020 H.Merijn Brand
+Copyright (C) 2009-2023 H.Merijn Brand
 
 This library is free software; you can redistribute it and/or modify
 it under the same terms as Perl itself.
index 252a162..2306096 100644 (file)
@@ -5,7 +5,7 @@ use warnings;
 
 BEGIN {
     use Test::More;
-    my $tests = 100;
+    my $tests = 106;
     unless ($ENV{PERL_CORE}) {
        require Test::NoWarnings;
        Test::NoWarnings->import ();
@@ -39,7 +39,11 @@ foreach my $o (sort keys %$opt) {
 eval { require Digest::MD5; };
 my $md5 = $@ ? "0" x 32 : "9dc187182be100c1713f210a8c6d9f45";
 ok (my $sig = Config::Perl::V::signature ($conf), "Get signature");
-is ($sig, $md5, "MD5");
+
+SKIP: {
+    ord "A" == 65 or skip "ASCII-centric test", 1;
+    is ($sig, $md5, "MD5");
+    }
 
 __END__
 Summary of my perl5 (revision 5.0 version 6 subversion 2) configuration:
index b354e24..9ec8a9a 100644 (file)
@@ -5,7 +5,7 @@ use warnings;
 
 BEGIN {
     use Test::More;
-    my $tests = 100;
+    my $tests = 106;
     unless ($ENV{PERL_CORE}) {
        require Test::NoWarnings;
        Test::NoWarnings->import ();
@@ -42,7 +42,11 @@ foreach my $o (sort keys %$opt) {
 eval { require Digest::MD5; };
 my $md5 = $@ ? "0" x 32 : "df48dce1adaaf63855d8acd455c51818";
 ok (my $sig = Config::Perl::V::signature ($conf), "Get signature");
-is ($sig, $md5, "MD5");
+
+SKIP: {
+    ord "A" == 65 or skip "ASCII-centric test", 1;
+    is ($sig, $md5, "MD5");
+    }
 
 __END__
 Summary of my perl5 (revision 5 version 8 subversion 9) configuration:
index bec688c..55efc6a 100644 (file)
@@ -5,7 +5,7 @@ use warnings;
 
 BEGIN {
     use Test::More;
-    my $tests = 99;
+    my $tests = 105;
     unless ($ENV{PERL_CORE}) {
        require Test::NoWarnings;
        Test::NoWarnings->import ();
@@ -32,7 +32,11 @@ foreach my $o (sort keys %$opt) {
 eval { require Digest::MD5; };
 my $md5 = $@ ? "0" x 32 : "ce0a7871dfddbbed0a6c685c0f52dbf9";
 ok (my $sig = Config::Perl::V::signature ($conf), "Get signature");
-is ($sig, $md5, "MD5");
+
+SKIP: {
+    ord "A" == 65 or skip "ASCII-centric test", 1;
+    is ($sig, $md5, "MD5");
+    }
 
 __END__
 Summary of my perl5 (revision 5 version 10 subversion 0) configuration:
index 03c69cb..8b0cc37 100644 (file)
@@ -5,7 +5,7 @@ use warnings;
 
 BEGIN {
     use Test::More;
-    my $tests = 101;
+    my $tests = 107;
     unless ($ENV{PERL_CORE}) {
        require Test::NoWarnings;
        Test::NoWarnings->import ();
@@ -42,7 +42,11 @@ foreach my $o (sort keys %$opt) {
 eval { require Digest::MD5; };
 my $md5 = $@ ? "0" x 32 : "a2c38153cc47d340bc140d0bfe294afb";
 ok (my $sig = Config::Perl::V::signature ($conf), "Get signature");
-is ($sig, $md5, "MD5");
+
+SKIP: {
+    ord "A" == 65 or skip "ASCII-centric test", 1;
+    is ($sig, $md5, "MD5");
+    }
 
 __END__
 Summary of my perl5 (revision 5 version 12 subversion 2) configuration:
index 3377b41..7ac1c22 100644 (file)
@@ -5,7 +5,7 @@ use warnings;
 
 BEGIN {
     use Test::More;
-    my $tests = 101;
+    my $tests = 107;
     unless ($ENV{PERL_CORE}) {
        require Test::NoWarnings;
        Test::NoWarnings->import ();
@@ -43,7 +43,11 @@ foreach my $o (sort keys %$opt) {
 eval { require Digest::MD5; };
 my $md5 = $@ ? "0" x 32 : "778815a670c0c454738aedf0c88930ba";
 ok (my $sig = Config::Perl::V::signature ($conf), "Get signature");
-is ($sig, $md5, "MD5");
+
+SKIP: {
+    ord "A" == 65 or skip "ASCII-centric test", 1;
+    is ($sig, $md5, "MD5");
+    }
 
 __END__
 Summary of my perl5 (revision 5 version 14 subversion 2) configuration:
index 5505245..2dd1ab1 100644 (file)
@@ -5,7 +5,7 @@ use warnings;
 
 BEGIN {
     use Test::More;
-    my $tests = 100;
+    my $tests = 106;
     unless ($ENV{PERL_CORE}) {
        require Test::NoWarnings;
        Test::NoWarnings->import ();
@@ -43,7 +43,11 @@ foreach my $o (sort keys %$opt) {
 eval { require Digest::MD5; };
 my $md5 = $@ ? "0" x 32 : "7b00cf3b306d96fa802892e6ad4b070f";
 ok (my $sig = Config::Perl::V::signature ($conf), "Get signature");
-is ($sig, $md5, "MD5");
+
+SKIP: {
+    ord "A" == 65 or skip "ASCII-centric test", 1;
+    is ($sig, $md5, "MD5");
+    }
 
 __END__
 Summary of my perl5 (revision 5 version 16 subversion 3) configuration:
index 68d1596..9e534ba 100644 (file)
@@ -5,7 +5,7 @@ use warnings;
 
 BEGIN {
     use Test::More;
-    my $tests = 158;
+    my $tests = 164;
     unless ($ENV{PERL_CORE}) {
        require Test::NoWarnings;
        Test::NoWarnings->import ();
@@ -45,7 +45,11 @@ foreach my $o (sort keys %$opt) {
 eval { require Digest::MD5; };
 my $md5 = $@ ? "0" x 32 : "2917ca2a97b6db1ab8fb08798f53c0bb";
 ok (my $sig = Config::Perl::V::signature ($conf), "Get signature");
-is ($sig, $md5, "MD5");
+
+SKIP: {
+    ord "A" == 65 or skip "ASCII-centric test", 1;
+    is ($sig, $md5, "MD5");
+    }
 
 is_deeply ($conf->{build}{patches}, [
     "/Library/Perl/Updates/<version> comes before system perl directories",
index a255797..7d54c29 100644 (file)
@@ -5,7 +5,7 @@ use warnings;
 
 BEGIN {
     use Test::More;
-    my $tests = 119;
+    my $tests = 125;
     unless ($ENV{PERL_CORE}) {
        require Test::NoWarnings;
        Test::NoWarnings->import ();
@@ -43,7 +43,11 @@ foreach my $o (sort keys %$opt) {
 eval { require Digest::MD5; };
 my $md5 = $@ ? "0" x 32 : "8f46b07a7775e6a92347d4cd564b8f03";
 ok (my $sig = Config::Perl::V::signature ($conf), "Get signature");
-is ($sig, $md5, "MD5");
+
+SKIP: {
+    ord "A" == 65 or skip "ASCII-centric test", 1;
+    is ($sig, $md5, "MD5");
+    }
 
 is_deeply ($conf->{build}{patches}, [], "No local patches");
 
index 25e52bb..dd734b7 100644 (file)
@@ -5,7 +5,7 @@ use warnings;
 
 BEGIN {
     use Test::More;
-    my $tests = 119;
+    my $tests = 125;
     unless ($ENV{PERL_CORE}) {
        require Test::NoWarnings;
        Test::NoWarnings->import ();
@@ -43,7 +43,11 @@ foreach my $o (sort keys %$opt) {
 eval { require Digest::MD5; };
 my $md5 = $@ ? "0" x 32 : "874325856acfea3dab7e7c944660f398";
 ok (my $sig = Config::Perl::V::signature ($conf), "Get signature");
-is ($sig, $md5, "MD5");
+
+SKIP: {
+    ord "A" == 65 or skip "ASCII-centric test", 1;
+    is ($sig, $md5, "MD5");
+    }
 
 is_deeply ($conf->{build}{patches}, [], "No local patches");
 
index f44273d..6ba124f 100644 (file)
@@ -5,7 +5,7 @@ use warnings;
 
 BEGIN {
     use Test::More;
-    my $tests = 119;
+    my $tests = 125;
     unless ($ENV{PERL_CORE}) {
        require Test::NoWarnings;
        Test::NoWarnings->import ();
@@ -46,7 +46,11 @@ foreach my $o (sort keys %$opt) {
 eval { require Digest::MD5; };
 my $md5 = $@ ? "0" x 32 : "3e7b4513cd80c6ef00fcd77e5e16f8b4";
 ok (my $sig = Config::Perl::V::signature ($conf), "Get signature");
-is ($sig, $md5, "MD5");
+
+SKIP: {
+    ord "A" == 65 or skip "ASCII-centric test", 1;
+    is ($sig, $md5, "MD5");
+    }
 
 is_deeply ($conf->{build}{patches}, [], "No local patches");
 
index 83c3cb0..8c0ff48 100644 (file)
@@ -5,7 +5,7 @@ use warnings;
 
 BEGIN {
     use Test::More;
-    my $tests = 120;
+    my $tests = 126;
     unless ($ENV{PERL_CORE}) {
        require Test::NoWarnings;
        Test::NoWarnings->import ();
@@ -46,7 +46,11 @@ foreach my $o (sort keys %$opt) {
 eval { require Digest::MD5; };
 my $md5 = $@ ? "0" x 32 : "9f954ebc2be7b1d7e151ab28dbdf7062";
 ok (my $sig = Config::Perl::V::signature ($conf), "Get signature");
-is ($sig, $md5, "MD5");
+
+SKIP: {
+    ord "A" == 65 or skip "ASCII-centric test", 1;
+    is ($sig, $md5, "MD5");
+    }
 
 is_deeply ($conf->{build}{patches}, [], "No local patches");
 
index 885445b..a081074 100644 (file)
@@ -5,7 +5,7 @@ use warnings;
 
 BEGIN {
     use Test::More;
-    my $tests = 120;
+    my $tests = 126;
     unless ($ENV{PERL_CORE}) {
        require Test::NoWarnings;
        Test::NoWarnings->import ();
@@ -46,7 +46,11 @@ foreach my $o (sort keys %$opt) {
 eval { require Digest::MD5; };
 my $md5 = $@ ? "0" x 32 : "ddcc2d51e43bf18f5234ba66529068ef";
 ok (my $sig = Config::Perl::V::signature ($conf), "Get signature");
-is ($sig, $md5, "MD5");
+
+SKIP: {
+    ord "A" == 65 or skip "ASCII-centric test", 1;
+    is ($sig, $md5, "MD5");
+    }
 
 is_deeply ($conf->{build}{patches}, [], "No local patches");
 
index 6c74219..9cd2924 100644 (file)
@@ -5,7 +5,7 @@ use warnings;
 
 BEGIN {
     use Test::More;
-    my $tests = 120;
+    my $tests = 126;
     unless ($ENV{PERL_CORE}) {
        require Test::NoWarnings;
        Test::NoWarnings->import ();
@@ -46,7 +46,11 @@ foreach my $o (sort keys %$opt) {
 eval { require Digest::MD5; };
 my $md5 = $@ ? "0" x 32 : "dfb32b8299b66e8bdb2712934f700d94";
 ok (my $sig = Config::Perl::V::signature ($conf), "Get signature");
-is ($sig, $md5, "MD5");
+
+SKIP: {
+    ord "A" == 65 or skip "ASCII-centric test", 1;
+    is ($sig, $md5, "MD5");
+    }
 
 is_deeply ($conf->{build}{patches}, [], "No local patches");
 
index 22f2bdc..fe42cb8 100644 (file)
@@ -165,7 +165,7 @@ use Carp;
 # Module not thread safe, so don't clone
 sub CLONE_SKIP { 1 }
 
-$VERSION = "1.857" ;
+$VERSION = "1.858" ;
 $VERSION = eval $VERSION; # needed for dev releases
 
 {
@@ -2331,23 +2331,9 @@ same terms as Perl itself.
 
 Although B<DB_File> is covered by the Perl license, the library it
 makes use of, namely Berkeley DB, is not. Berkeley DB has its own
-copyright and its own license. Please take the time to read it.
-
-Here are a few words taken from the Berkeley DB FAQ (at
-L<http://www.oracle.com/technology/products/berkeley-db/db/index.html>) regarding the license:
-
-    Do I have to license DB to use it in Perl scripts?
-
-    No. The Berkeley DB license requires that software that uses
-    Berkeley DB be freely redistributable. In the case of Perl, that
-    software is Perl, and not your scripts. Any Perl scripts that you
-    write are your property, including scripts that make use of
-    Berkeley DB. Neither the Perl license nor the Berkeley DB license
-    place any restriction on what you may do with them.
-
-If you are in any doubt about the license situation, contact either the
-Berkeley DB authors or the author of DB_File. See L<"AUTHOR"> for details.
-
+copyright and its own license.
+See L<AGPL|https://www.oracle.com/downloads/licenses/berkeleydb-oslicense.html> for more details.
+Please take the time to read the Berkeley DB license and decide how it impacts your use of this Perl module.
 
 =head1 SEE ALSO
 
index 81e5142..65a86f4 100644 (file)
@@ -3,7 +3,7 @@ package Digest::MD5;
 use strict;
 use warnings;
 
-our $VERSION = '2.58';
+our $VERSION = '2.58_01';
 
 require Exporter;
 *import = \&Exporter::import;
index 61beeba..f42fd15 100644 (file)
  * documentation and/or software.
  */
 
-#ifdef __cplusplus
-extern "C" {
-#endif
 #define PERL_NO_GET_CONTEXT     /* we want efficiency */
 #include "EXTERN.h"
 #include "perl.h"
 #include "XSUB.h"
-#include <sys/types.h>
-#include <md5.h>
-#ifdef __cplusplus
-}
-#endif
 
 #ifndef PERL_UNUSED_VAR
 # define PERL_UNUSED_VAR(x) ((void)x)
@@ -90,6 +82,46 @@ static MAGIC *THX_sv_magicext(pTHX_ SV *sv, SV *obj, int type,
 # define SvPVbyte(sv, lp) (sv_utf8_downgrade((sv), 0), SvPV((sv), (lp)))
 #endif
 
+/* Perl does not guarantee that U32 is exactly 32 bits.  Some system
+ * has no integral type with exactly 32 bits.  For instance, A Cray has
+ * short, int and long all at 64 bits so we need to apply this macro
+ * to reduce U32 values to 32 bits at appropriate places. If U32
+ * really does have 32 bits then this is a no-op.
+ */
+#if BYTEORDER > 0x4321 || defined(TRUNCATE_U32)
+  #define TO32(x)    ((x) &  0xFFFFffff)
+  #define TRUNC32(x) ((x) &= 0xFFFFffff)
+#else
+  #define TO32(x)    (x)
+  #define TRUNC32(x) /*nothing*/
+#endif
+
+/* The MD5 algorithm is defined in terms of little endian 32-bit
+ * values.  The following macros (and functions) allow us to convert
+ * between native integers and such values.
+ */
+static void u2s(U32 u, U8* s)
+{
+    *s++ = (U8)(u         & 0xFF);
+    *s++ = (U8)((u >>  8) & 0xFF);
+    *s++ = (U8)((u >> 16) & 0xFF);
+    *s   = (U8)((u >> 24) & 0xFF);
+}
+
+#define s2u(s,u) ((u) =  (U32)(*s)            |  \
+                        ((U32)(*(s+1)) << 8)  |  \
+                        ((U32)(*(s+2)) << 16) |  \
+                        ((U32)(*(s+3)) << 24))
+
+/* This structure keeps the current state of algorithm.
+ */
+typedef struct {
+  U32 A, B, C, D;  /* current digest */
+  U32 bytes_low;   /* counts bytes in message */
+  U32 bytes_high;  /* turn it into a 64-bit counter */
+  U8 buffer[128];  /* collect complete 64 byte blocks */
+} MD5_CTX;
+
 #if defined(USE_ITHREADS) && defined(MGf_DUP)
 STATIC int dup_md5_ctx(pTHX_ MAGIC *mg, CLONE_PARAMS *params)
 {
@@ -126,6 +158,300 @@ STATIC const struct {
 };
 #endif
 
+
+/* Padding is added at the end of the message in order to fill a
+ * complete 64 byte block (- 8 bytes for the message length).  The
+ * padding is also the reason the buffer in MD5_CTX have to be
+ * 128 bytes.
+ */
+static const unsigned char PADDING[64] = {
+  0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+/* Constants for MD5Transform routine.
+ */
+#define S11 7
+#define S12 12
+#define S13 17
+#define S14 22
+#define S21 5
+#define S22 9
+#define S23 14
+#define S24 20
+#define S31 4
+#define S32 11
+#define S33 16
+#define S34 23
+#define S41 6
+#define S42 10
+#define S43 15
+#define S44 21
+
+/* F, G, H and I are basic MD5 functions.
+ */
+#define F(x, y, z) ((((x) & ((y) ^ (z))) ^ (z)))
+#define G(x, y, z) F(z, x, y)
+#define H(x, y, z) ((x) ^ (y) ^ (z))
+#define I(x, y, z) ((y) ^ ((x) | (~z)))
+
+/* ROTATE_LEFT rotates x left n bits.
+ */
+#define ROTATE_LEFT(x, n) (((x) << (n) | ((x) >> (32-(n)))))
+
+/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
+ * Rotation is separate from addition to prevent recomputation.
+ */
+#define FF(a, b, c, d, s, ac)                    \
+ (a) += F ((b), (c), (d)) + (NEXTx) + (U32)(ac); \
+ TRUNC32((a));                                   \
+ (a) = ROTATE_LEFT ((a), (s));                   \
+ (a) += (b);                                     \
+ TRUNC32((a));
+
+#define GG(a, b, c, d, x, s, ac)                 \
+ (a) += G ((b), (c), (d)) + X[x] + (U32)(ac);    \
+ TRUNC32((a));                                   \
+ (a) = ROTATE_LEFT ((a), (s));                   \
+ (a) += (b);                                     \
+ TRUNC32((a));
+
+#define HH(a, b, c, d, x, s, ac)                 \
+ (a) += H ((b), (c), (d)) + X[x] + (U32)(ac);    \
+ TRUNC32((a));                                   \
+ (a) = ROTATE_LEFT ((a), (s));                   \
+ (a) += (b);                                     \
+ TRUNC32((a));
+
+#define II(a, b, c, d, x, s, ac)                 \
+ (a) += I ((b), (c), (d)) + X[x] + (U32)(ac);    \
+ TRUNC32((a));                                   \
+ (a) = ROTATE_LEFT ((a), (s));                   \
+ (a) += (b);                                     \
+ TRUNC32((a));
+
+
+static void
+MD5Init(MD5_CTX *ctx)
+{
+  /* Start state */
+  ctx->A = 0x67452301;
+  ctx->B = 0xefcdab89;
+  ctx->C = 0x98badcfe;
+  ctx->D = 0x10325476;
+
+  /* message length */
+  ctx->bytes_low = ctx->bytes_high = 0;
+}
+
+
+static void
+MD5Transform(MD5_CTX* ctx, const U8* buf, STRLEN blocks)
+{
+#ifdef MD5_DEBUG
+    static int tcount = 0;
+#endif
+
+    U32 A = ctx->A;
+    U32 B = ctx->B;
+    U32 C = ctx->C;
+    U32 D = ctx->D;
+
+    do {
+       U32 a = A;
+       U32 b = B;
+       U32 c = C;
+       U32 d = D;
+
+       U32 X[16];      /* little-endian values, used in round 2-4 */
+       U32 *uptr = X;
+       U32 tmp;
+        #define NEXTx  (s2u(buf,tmp), buf += 4, *uptr++ = tmp)
+
+#ifdef MD5_DEBUG
+       if (buf == ctx->buffer)
+           fprintf(stderr,"%5d: Transform ctx->buffer", ++tcount);
+       else 
+           fprintf(stderr,"%5d: Transform %p (%d)", ++tcount, buf, blocks);
+
+       {
+           int i;
+           fprintf(stderr,"[");
+           for (i = 0; i < 16; i++) {
+               fprintf(stderr,"%x,", x[i]); /* FIXME */
+           }
+           fprintf(stderr,"]\n");
+       }
+#endif
+
+       /* Round 1 */
+       FF (a, b, c, d, S11, 0xd76aa478); /* 1 */
+       FF (d, a, b, c, S12, 0xe8c7b756); /* 2 */
+       FF (c, d, a, b, S13, 0x242070db); /* 3 */
+       FF (b, c, d, a, S14, 0xc1bdceee); /* 4 */
+       FF (a, b, c, d, S11, 0xf57c0faf); /* 5 */
+       FF (d, a, b, c, S12, 0x4787c62a); /* 6 */
+       FF (c, d, a, b, S13, 0xa8304613); /* 7 */
+       FF (b, c, d, a, S14, 0xfd469501); /* 8 */
+       FF (a, b, c, d, S11, 0x698098d8); /* 9 */
+       FF (d, a, b, c, S12, 0x8b44f7af); /* 10 */
+       FF (c, d, a, b, S13, 0xffff5bb1); /* 11 */
+       FF (b, c, d, a, S14, 0x895cd7be); /* 12 */
+       FF (a, b, c, d, S11, 0x6b901122); /* 13 */
+       FF (d, a, b, c, S12, 0xfd987193); /* 14 */
+       FF (c, d, a, b, S13, 0xa679438e); /* 15 */
+       FF (b, c, d, a, S14, 0x49b40821); /* 16 */
+
+       /* Round 2 */
+       GG (a, b, c, d,  1, S21, 0xf61e2562); /* 17 */
+       GG (d, a, b, c,  6, S22, 0xc040b340); /* 18 */
+       GG (c, d, a, b, 11, S23, 0x265e5a51); /* 19 */
+       GG (b, c, d, a,  0, S24, 0xe9b6c7aa); /* 20 */
+       GG (a, b, c, d,  5, S21, 0xd62f105d); /* 21 */
+       GG (d, a, b, c, 10, S22,  0x2441453); /* 22 */
+       GG (c, d, a, b, 15, S23, 0xd8a1e681); /* 23 */
+       GG (b, c, d, a,  4, S24, 0xe7d3fbc8); /* 24 */
+       GG (a, b, c, d,  9, S21, 0x21e1cde6); /* 25 */
+       GG (d, a, b, c, 14, S22, 0xc33707d6); /* 26 */
+       GG (c, d, a, b,  3, S23, 0xf4d50d87); /* 27 */
+       GG (b, c, d, a,  8, S24, 0x455a14ed); /* 28 */
+       GG (a, b, c, d, 13, S21, 0xa9e3e905); /* 29 */
+       GG (d, a, b, c,  2, S22, 0xfcefa3f8); /* 30 */
+       GG (c, d, a, b,  7, S23, 0x676f02d9); /* 31 */
+       GG (b, c, d, a, 12, S24, 0x8d2a4c8a); /* 32 */
+
+       /* Round 3 */
+       HH (a, b, c, d,  5, S31, 0xfffa3942); /* 33 */
+       HH (d, a, b, c,  8, S32, 0x8771f681); /* 34 */
+       HH (c, d, a, b, 11, S33, 0x6d9d6122); /* 35 */
+       HH (b, c, d, a, 14, S34, 0xfde5380c); /* 36 */
+       HH (a, b, c, d,  1, S31, 0xa4beea44); /* 37 */
+       HH (d, a, b, c,  4, S32, 0x4bdecfa9); /* 38 */
+       HH (c, d, a, b,  7, S33, 0xf6bb4b60); /* 39 */
+       HH (b, c, d, a, 10, S34, 0xbebfbc70); /* 40 */
+       HH (a, b, c, d, 13, S31, 0x289b7ec6); /* 41 */
+       HH (d, a, b, c,  0, S32, 0xeaa127fa); /* 42 */
+       HH (c, d, a, b,  3, S33, 0xd4ef3085); /* 43 */
+       HH (b, c, d, a,  6, S34,  0x4881d05); /* 44 */
+       HH (a, b, c, d,  9, S31, 0xd9d4d039); /* 45 */
+       HH (d, a, b, c, 12, S32, 0xe6db99e5); /* 46 */
+       HH (c, d, a, b, 15, S33, 0x1fa27cf8); /* 47 */
+       HH (b, c, d, a,  2, S34, 0xc4ac5665); /* 48 */
+
+       /* Round 4 */
+       II (a, b, c, d,  0, S41, 0xf4292244); /* 49 */
+       II (d, a, b, c,  7, S42, 0x432aff97); /* 50 */
+       II (c, d, a, b, 14, S43, 0xab9423a7); /* 51 */
+       II (b, c, d, a,  5, S44, 0xfc93a039); /* 52 */
+       II (a, b, c, d, 12, S41, 0x655b59c3); /* 53 */
+       II (d, a, b, c,  3, S42, 0x8f0ccc92); /* 54 */
+       II (c, d, a, b, 10, S43, 0xffeff47d); /* 55 */
+       II (b, c, d, a,  1, S44, 0x85845dd1); /* 56 */
+       II (a, b, c, d,  8, S41, 0x6fa87e4f); /* 57 */
+       II (d, a, b, c, 15, S42, 0xfe2ce6e0); /* 58 */
+       II (c, d, a, b,  6, S43, 0xa3014314); /* 59 */
+       II (b, c, d, a, 13, S44, 0x4e0811a1); /* 60 */
+       II (a, b, c, d,  4, S41, 0xf7537e82); /* 61 */
+       II (d, a, b, c, 11, S42, 0xbd3af235); /* 62 */
+       II (c, d, a, b,  2, S43, 0x2ad7d2bb); /* 63 */
+       II (b, c, d, a,  9, S44, 0xeb86d391); /* 64 */
+
+       A += a;  TRUNC32(A);
+       B += b;  TRUNC32(B);
+       C += c;  TRUNC32(C);
+       D += d;  TRUNC32(D);
+
+    } while (--blocks);
+    ctx->A = A;
+    ctx->B = B;
+    ctx->C = C;
+    ctx->D = D;
+}
+
+
+#ifdef MD5_DEBUG
+static char*
+ctx_dump(MD5_CTX* ctx)
+{
+    static char buf[1024];
+    sprintf(buf, "{A=%x,B=%x,C=%x,D=%x,%d,%d(%d)}",
+           ctx->A, ctx->B, ctx->C, ctx->D,
+           ctx->bytes_low, ctx->bytes_high, (ctx->bytes_low&0x3F));
+    return buf;
+}
+#endif
+
+
+static void
+MD5Update(MD5_CTX* ctx, const U8* buf, STRLEN len)
+{
+    STRLEN blocks;
+    STRLEN fill = ctx->bytes_low & 0x3F;
+
+#ifdef MD5_DEBUG  
+    static int ucount = 0;
+    fprintf(stderr,"%5i: Update(%s, %p, %d)\n", ++ucount, ctx_dump(ctx),
+                                               buf, len);
+#endif
+
+    ctx->bytes_low += len;
+    if (ctx->bytes_low < len) /* wrap around */
+       ctx->bytes_high++;
+
+    if (fill) {
+       STRLEN missing = 64 - fill;
+       if (len < missing) {
+           Copy(buf, ctx->buffer + fill, len, U8);
+           return;
+       }
+       Copy(buf, ctx->buffer + fill, missing, U8);
+       MD5Transform(ctx, ctx->buffer, 1);
+       buf += missing;
+       len -= missing;
+    }
+
+    blocks = len >> 6;
+    if (blocks)
+       MD5Transform(ctx, buf, blocks);
+    if ( (len &= 0x3F)) {
+       Copy(buf + (blocks << 6), ctx->buffer, len, U8);
+    }
+}
+
+
+static void
+MD5Final(U8* digest, MD5_CTX *ctx)
+{
+    STRLEN fill = ctx->bytes_low & 0x3F;
+    STRLEN padlen = (fill < 56 ? 56 : 120) - fill;
+    U32 bits_low, bits_high;
+#ifdef MD5_DEBUG
+    fprintf(stderr,"       Final:  %s\n", ctx_dump(ctx));
+#endif
+    Copy(PADDING, ctx->buffer + fill, padlen, U8);
+    fill += padlen;
+
+    bits_low = ctx->bytes_low << 3;
+    bits_high = (ctx->bytes_high << 3) | (ctx->bytes_low  >> 29);
+    u2s(bits_low,  ctx->buffer + fill);   fill += 4;
+    u2s(bits_high, ctx->buffer + fill);   fill += 4;
+
+    MD5Transform(ctx, ctx->buffer, fill >> 6);
+#ifdef MD5_DEBUG
+    fprintf(stderr,"       Result: %s\n", ctx_dump(ctx));
+#endif
+
+    u2s(ctx->A, digest);
+    u2s(ctx->B, digest+4);
+    u2s(ctx->C, digest+8);
+    u2s(ctx->D, digest+12);
+}
+
+#ifndef INT2PTR
+#define INT2PTR(any,d) (any)(d)
+#endif
+
 static MD5_CTX* get_md5_ctx(pTHX_ SV* sv)
 {
     MAGIC *mg;
@@ -306,7 +632,7 @@ addfile(self, fh)
        InputStream fh
     PREINIT:
        MD5_CTX* context = get_md5_ctx(aTHX_ self);
-       STRLEN fill = (context->count >> 3) & (MD5_BLOCK_LENGTH - 1);
+       STRLEN fill = context->bytes_low & 0x3F;
 #ifdef USE_HEAP_INSTEAD_OF_STACK
        unsigned char* buffer;
 #else
@@ -371,12 +697,14 @@ context(ctx, ...)
     PPCODE:
        if (items > 2) {
            STRLEN len;
-           ctx->count = SvUV(ST(1)) << 3;
+           unsigned long blocks = SvUV(ST(1));
            unsigned char *buf = (unsigned char *)(SvPV(ST(2), len));
-           ctx->state[0] = buf[ 0] | (buf[ 1]<<8) | (buf[ 2]<<16) | (buf[ 3]<<24);
-           ctx->state[1] = buf[ 4] | (buf[ 5]<<8) | (buf[ 6]<<16) | (buf[ 7]<<24);
-           ctx->state[2] = buf[ 8] | (buf[ 9]<<8) | (buf[10]<<16) | (buf[11]<<24);
-           ctx->state[3] = buf[12] | (buf[13]<<8) | (buf[14]<<16) | (buf[15]<<24);
+           ctx->A = buf[ 0] | (buf[ 1]<<8) | (buf[ 2]<<16) | (buf[ 3]<<24);
+           ctx->B = buf[ 4] | (buf[ 5]<<8) | (buf[ 6]<<16) | (buf[ 7]<<24);
+           ctx->C = buf[ 8] | (buf[ 9]<<8) | (buf[10]<<16) | (buf[11]<<24);
+           ctx->D = buf[12] | (buf[13]<<8) | (buf[14]<<16) | (buf[15]<<24);
+           ctx->bytes_low = blocks << 6;
+           ctx->bytes_high = blocks >> 26;
            if (items == 4) {
                buf = (unsigned char *)(SvPV(ST(3), len));
                MD5Update(ctx, buf, len);
@@ -386,22 +714,21 @@ context(ctx, ...)
            XSRETURN(0);
        }
 
-        w=ctx->state[0]; out[ 0]=(char)w; out[ 1]=(char)(w>>8); out[ 2]=(char)(w>>16); out[ 3]=(char)(w>>24);
-        w=ctx->state[0]; out[ 4]=(char)w; out[ 5]=(char)(w>>8); out[ 6]=(char)(w>>16); out[ 7]=(char)(w>>24);
-        w=ctx->state[0]; out[ 8]=(char)w; out[ 9]=(char)(w>>8); out[10]=(char)(w>>16); out[11]=(char)(w>>24);
-        w=ctx->state[0]; out[12]=(char)w; out[13]=(char)(w>>8); out[14]=(char)(w>>16); out[15]=(char)(w>>24);
+        w=ctx->A; out[ 0]=(char)w; out[ 1]=(char)(w>>8); out[ 2]=(char)(w>>16); out[ 3]=(char)(w>>24);
+        w=ctx->B; out[ 4]=(char)w; out[ 5]=(char)(w>>8); out[ 6]=(char)(w>>16); out[ 7]=(char)(w>>24);
+        w=ctx->C; out[ 8]=(char)w; out[ 9]=(char)(w>>8); out[10]=(char)(w>>16); out[11]=(char)(w>>24);
+        w=ctx->D; out[12]=(char)w; out[13]=(char)(w>>8); out[14]=(char)(w>>16); out[15]=(char)(w>>24);
 
        EXTEND(SP, 3);
-       ST(0) = sv_2mortal(newSViv((ctx->count >> 3)
-                               - ((ctx->count >> 3) % MD5_BLOCK_LENGTH)));
+       ST(0) = sv_2mortal(newSVuv(ctx->bytes_high << 26 |
+                                  ctx->bytes_low >> 6));
        ST(1) = sv_2mortal(newSVpv(out, 16));
 
-       if (((ctx->count >> 3) & (MD5_BLOCK_LENGTH - 1)) == 0)
-               XSRETURN(2);
+       if ((ctx->bytes_low & 0x3F) == 0)
+           XSRETURN(2);
 
        ST(2) = sv_2mortal(newSVpv((char *)ctx->buffer,
-           (ctx->count >> 3) & (MD5_BLOCK_LENGTH - 1)));
-
+                                  ctx->bytes_low & 0x3F));
        XSRETURN(3);
 
 void
index 3a22dce..01c7850 100755 (executable)
@@ -22,7 +22,7 @@ EOT
     # This is the output of: 'md5sum README MD5.xs rfc1321.txt'
     $EXPECT = <<EOT;
 2f93400875dbb56f36691d5f69f3eba5  README
-5956d385c276e47faebef391177ee1d3  MD5.xs
+f8549bd328fa712f4af41430738c285a  MD5.xs
 754b9db19f79dbc4992f7166eb0f37ce  rfc1321.txt
 EOT
 }
index dccc0e7..37a31e9 100644 (file)
@@ -6,9 +6,10 @@ use strict;
 use warnings;
 use vars qw($VERSION @ISA @EXPORT_OK $errmsg);
 use Fcntl qw(O_RDONLY O_RDWR);
+use Cwd qw(getcwd);
 use integer;
 
-$VERSION = '6.02';
+$VERSION = '6.04';
 
 require Exporter;
 @ISA = qw(Exporter);
@@ -120,9 +121,18 @@ sub addfile {
                ##      by attempting to open with mode O_RDWR
 
        local *FH;
-       $file eq '-' and open(FH, '< -')
-               or sysopen(FH, $file, -d $file ? O_RDWR : O_RDONLY)
+       if ($file eq '-') {
+               if (-d STDIN) {
+                       sysopen(FH, getcwd(), O_RDWR)
+                               or _bail('Open failed');
+               }
+               open(FH, '< -')
+                       or _bail('Open failed');
+       }
+       else {
+               sysopen(FH, $file, -d $file ? O_RDWR : O_RDONLY)
                        or _bail('Open failed');
+       }
 
        if ($BITS) {
                my ($n, $buf) = (0, "");
@@ -810,7 +820,7 @@ darkness and moored it in so perfect a calm and in so brilliant a light"
 
 =head1 COPYRIGHT AND LICENSE
 
-Copyright (C) 2003-2018 Mark Shelor
+Copyright (C) 2003-2022 Mark Shelor
 
 This library is free software; you can redistribute it and/or modify
 it under the same terms as Perl itself.
index 46a7162..3a1a9c4 100644 (file)
@@ -2,10 +2,10 @@
 
        ## shasum: filter for computing SHA digests (ref. sha1sum/md5sum)
        ##
-       ## Copyright (C) 2003-2018 Mark Shelor, All Rights Reserved
+       ## Copyright (C) 2003-2023 Mark Shelor, All Rights Reserved
        ##
-       ## Version: 6.02
-       ## Fri Apr 20 16:25:30 MST 2018
+       ## Version: 6.04
+       ## Sat Feb 25 12:00:50 PM MST 2023
 
        ## shasum SYNOPSIS adapted from GNU Coreutils sha1sum. Add
        ## "-a" option for algorithm selection,
@@ -97,7 +97,7 @@ the 7-bit message I<0001100>:
 
 =head1 AUTHOR
 
-Copyright (C) 2003-2018 Mark Shelor <mshelor@cpan.org>.
+Copyright (C) 2003-2023 Mark Shelor <mshelor@cpan.org>.
 
 =head1 SEE ALSO
 
@@ -107,7 +107,7 @@ I<shasum> is implemented using the Perl module L<Digest::SHA>.
 
 END_OF_POD
 
-my $VERSION = "6.02";
+my $VERSION = "6.04";
 
 sub usage {
        my($err, $msg) = @_;
index bc337eb..6464278 100644 (file)
@@ -3,10 +3,10 @@
  *
  * Ref: NIST FIPS PUB 180-4 Secure Hash Standard
  *
- * Copyright (C) 2003-2018 Mark Shelor, All Rights Reserved
+ * Copyright (C) 2003-2023 Mark Shelor, All Rights Reserved
  *
- * Version: 6.02
- * Fri Apr 20 16:25:30 MST 2018
+ * Version: 6.04
+ * Sat Feb 25 12:00:50 PM MST 2023
  *
  */
 
@@ -279,14 +279,11 @@ static UCHR *statecpy(SHA *s, UCHR *buf)
        return(buf);
 }
 
-#define SHA_INIT(s, algo, transform)                                   \
+#define SHA_INIT(s, algo, transform, state, state_t)                   \
        do {                                                            \
                Zero(s, 1, SHA);                                        \
                s->alg = algo; s->sha = sha ## transform;               \
-               if (s->alg <= SHA256)                                   \
-                       Copy(H0 ## algo, s->H32, 8, SHA32);             \
-               else                                                    \
-                       Copy(H0 ## algo, s->H64, 8, SHA64);             \
+               Copy(H0 ## algo, s->state, 8, state_t);                 \
                s->blocksize = SHA ## algo ## _BLOCK_BITS;              \
                s->digestlen = SHA ## algo ## _DIGEST_BITS >> 3;        \
        } while (0)
@@ -294,13 +291,13 @@ static UCHR *statecpy(SHA *s, UCHR *buf)
 /* sharewind: resets digest object */
 static void sharewind(SHA *s)
 {
-       if      (s->alg == SHA1)   SHA_INIT(s, 1, 1);
-       else if (s->alg == SHA224) SHA_INIT(s, 224, 256);
-       else if (s->alg == SHA256) SHA_INIT(s, 256, 256);
-       else if (s->alg == SHA384) SHA_INIT(s, 384, 512);
-       else if (s->alg == SHA512) SHA_INIT(s, 512, 512);
-       else if (s->alg == SHA512224) SHA_INIT(s, 512224, 512);
-       else if (s->alg == SHA512256) SHA_INIT(s, 512256, 512);
+       if      (s->alg == SHA1)   SHA_INIT(s, 1, 1, H32, SHA32);
+       else if (s->alg == SHA224) SHA_INIT(s, 224, 256, H32, SHA32);
+       else if (s->alg == SHA256) SHA_INIT(s, 256, 256, H32, SHA32);
+       else if (s->alg == SHA384) SHA_INIT(s, 384, 512, H64, SHA64);
+       else if (s->alg == SHA512) SHA_INIT(s, 512, 512, H64, SHA64);
+       else if (s->alg == SHA512224) SHA_INIT(s, 512224, 512, H64, SHA64);
+       else if (s->alg == SHA512256) SHA_INIT(s, 512256, 512, H64, SHA64);
 }
 
 /* shainit: initializes digest object */
index f659928..5146aef 100644 (file)
@@ -3,10 +3,10 @@
  *
  * Ref: NIST FIPS PUB 180-4 Secure Hash Standard
  *
- * Copyright (C) 2003-2018 Mark Shelor, All Rights Reserved
+ * Copyright (C) 2003-2023 Mark Shelor, All Rights Reserved
  *
- * Version: 6.02
- * Fri Apr 20 16:25:30 MST 2018
+ * Version: 6.04
+ * Sat Feb 25 12:00:50 PM MST 2023
  *
  */
 
index 146fb4c..10d7e49 100644 (file)
@@ -3,10 +3,10 @@
  *
  * Ref: NIST FIPS PUB 180-4 Secure Hash Standard
  *
- * Copyright (C) 2003-2018 Mark Shelor, All Rights Reserved
+ * Copyright (C) 2003-2023 Mark Shelor, All Rights Reserved
  *
- * Version: 6.02
- * Fri Apr 20 16:25:30 MST 2018
+ * Version: 6.04
+ * Sat Feb 25 12:00:50 PM MST 2023
  *
  */
 
index 8517993..f61d70d 100644 (file)
@@ -3,10 +3,10 @@
  *
  * Ref: NIST FIPS PUB 180-4 Secure Hash Standard
  *
- * Copyright (C) 2003-2018 Mark Shelor, All Rights Reserved
+ * Copyright (C) 2003-2023 Mark Shelor, All Rights Reserved
  *
- * Version: 6.02
- * Fri Apr 20 16:25:30 MST 2018
+ * Version: 6.04
+ * Sat Feb 25 12:00:50 PM MST 2023
  *
  * The following macros supply placeholder values that enable the
  * sha.c module to successfully compile when 64-bit integer types
index fc857f5..8a2727f 100644 (file)
@@ -1,5 +1,5 @@
 #
-# $Id: Encode.pm,v 3.17 2022/04/07 03:05:51 dankogai Exp $
+# $Id: Encode.pm,v 3.19 2022/08/04 04:42:30 dankogai Exp $
 #
 package Encode;
 use strict;
@@ -7,7 +7,7 @@ use warnings;
 use constant DEBUG => !!$ENV{PERL_ENCODE_DEBUG};
 our $VERSION;
 BEGIN {
-    $VERSION = sprintf "%d.%02d", q$Revision: 3.17 $ =~ /(\d+)/g;
+    $VERSION = sprintf "%d.%02d", q$Revision: 3.19 $ =~ /(\d+)/g;
     require XSLoader;
     XSLoader::load( __PACKAGE__, $VERSION );
 }
index 3cb95e8..fd3ebe3 100644 (file)
@@ -1,5 +1,5 @@
 #
-# $Id: Makefile.PL,v 2.24 2021/10/13 08:29:13 dankogai Exp $
+# $Id: Makefile.PL,v 2.25 2022/06/25 01:58:57 dankogai Exp $
 #
 use 5.007003;
 use strict;
@@ -17,6 +17,8 @@ $ENV{PERL_CORE} ||= $ARGV{PERL_CORE} if $ARGV{PERL_CORE};
 my $ccflags = $Config{ccflags};
 if (!$ENV{PERL_CORE}) {
   if (my $gccver = $Config{gccversion}) {
+    # no more 'Argument "Apple" isn't numeric in addition (+)'
+    no warnings 'numeric';
     $gccver =~ s/\.//g; $gccver =~ s/ .*//;
     $gccver .= "0" while length $gccver < 3;
     $gccver = 0+$gccver;
index dbfa01b..cca72a3 100644 (file)
@@ -1,7 +1,7 @@
 package Encode::Alias;
 use strict;
 use warnings;
-our $VERSION = do { my @r = ( q$Revision: 2.24 $ =~ /\d+/g ); sprintf "%d." . "%02d" x $#r, @r };
+our $VERSION = do { my @r = ( q$Revision: 2.25 $ =~ /\d+/g ); sprintf "%d." . "%02d" x $#r, @r };
 use constant DEBUG => !!$ENV{PERL_ENCODE_DEBUG};
 
 use Exporter 'import';
@@ -162,6 +162,10 @@ sub init_aliases {
     # Allow variants of iso-8859-1 etc.
     define_alias( qr/\biso[-_]?(\d+)[-_](\d+)$/i => '"iso-$1-$2"' );
 
+    # ISO-8859-8-I => ISO-8859-8
+    # https://en.wikipedia.org/wiki/ISO-8859-8-I
+    define_alias( qr/\biso[-_]8859[-_]8[-_]I$/i => '"iso-8859-8"' );
+
     # At least HP-UX has these.
     define_alias( qr/\biso8859(\d+)$/i => '"iso-8859-$1"' );
 
index 848de99..4d45744 100644 (file)
@@ -2,7 +2,7 @@ package Encode::MIME::Header;
 use strict;
 use warnings;
 
-our $VERSION = do { my @r = ( q$Revision: 2.28 $ =~ /\d+/g ); sprintf "%d." . "%02d" x $#r, @r };
+our $VERSION = do { my @r = ( q$Revision: 2.29 $ =~ /\d+/g ); sprintf "%d." . "%02d" x $#r, @r };
 
 use Carp ();
 use Encode ();
@@ -55,7 +55,7 @@ my $re_capture_encoded_word_split = qr/=\?($re_charset)((?:\*$re_language)?)\?($
 # in strict mode check also for valid base64 characters and also for valid quoted printable codes
 my $re_encoding_strict_b = qr/[Bb]/;
 my $re_encoding_strict_q = qr/[Qq]/;
-my $re_encoded_text_strict_b = qr/[0-9A-Za-z\+\/]*={0,2}/;
+my $re_encoded_text_strict_b = qr/(?:[0-9A-Za-z\+\/]{4})*(?:[0-9A-Za-z\+\/]{2}==|[0-9A-Za-z\+\/]{3}=|)/;
 my $re_encoded_text_strict_q = qr/(?:[\x21-\x3C\x3E\x40-\x7E]|=[0-9A-Fa-f]{2})*/; # NOTE: first part are printable US-ASCII except ?, =, SPACE and TAB
 my $re_encoded_word_strict = qr/=\?$re_charset(?:\*$re_language)?\?(?:$re_encoding_strict_b\?$re_encoded_text_strict_b|$re_encoding_strict_q\?$re_encoded_text_strict_q)\?=/;
 my $re_capture_encoded_word_strict = qr/=\?($re_charset)((?:\*$re_language)?)\?($re_encoding_strict_b\?$re_encoded_text_strict_b|$re_encoding_strict_q\?$re_encoded_text_strict_q)\?=/;
@@ -94,6 +94,10 @@ sub decode($$;$) {
 
         $stop = 1 unless length($line) or length($sep);
 
+        # in non strict mode append missing '=' padding characters for b words
+        # fixes below concatenation of consecutive encoded mime words
+        1 while not $STRICT_DECODE and $line =~ s/(=\?$re_charset(?:\*$re_language)?\?[Bb]\?)((?:[^\?]{4})*[^\?]{1,3})(\?=)/$1.$2.('='x(4-length($2)%4)).$3/se;
+
         # NOTE: this code partially could break $chk support
         # in non strict mode concat consecutive encoded mime words with same charset, language and encoding
         # fixes breaking inside multi-byte characters
index 8d4752b..23a1cd3 100755 (executable)
@@ -42,6 +42,7 @@ sub init_a2c{
         'arabic'   => 'iso-8859-6',
         'greek'    => 'iso-8859-7',
         'hebrew'   => 'iso-8859-8',
+        'iso-8859-8-I' => 'iso-8859-8',
         'thai'     => 'iso-8859-11',
         'tis620'   => 'iso-8859-11',
         'tis-620'   => 'iso-8859-11',
index f5ddaf7..19619ae 100755 (executable)
@@ -1,4 +1,4 @@
-# $Id: enc_data.t,v 2.6 2022/04/07 03:06:40 dankogai Exp dankogai $
+# $Id: enc_data.t,v 2.6 2022/04/07 03:06:40 dankogai Exp $
 
 BEGIN {
     require Config; import Config;
index 2d94e36..a96fc8d 100755 (executable)
@@ -1,4 +1,4 @@
-# $Id: enc_module.t,v 2.6 2022/04/07 03:06:40 dankogai Exp dankogai $
+# $Id: enc_module.t,v 2.6 2022/04/07 03:06:40 dankogai Exp $
 # This file is in euc-jp
 BEGIN {
     require Config; import Config;
index 27ce881..c49c6b8 100755 (executable)
@@ -1,5 +1,5 @@
 #
-# $Id: jperl.t,v 2.6 2022/04/07 03:06:40 dankogai Exp dankogai $
+# $Id: jperl.t,v 2.6 2022/04/07 03:06:40 dankogai Exp $
 #
 # This script is written in euc-jp
 
index bf48753..de74241 100755 (executable)
@@ -1,5 +1,5 @@
 #
-# $Id: mime-header.t,v 2.15 2017/07/18 07:15:29 dankogai Exp $
+# $Id: mime-header.t,v 2.16 2022/06/25 01:58:57 dankogai Exp $
 # This script is written in utf8
 #
 BEGIN {
@@ -24,7 +24,7 @@ use strict;
 use utf8;
 use charnames ":full";
 
-use Test::More tests => 266;
+use Test::More tests => 274;
 
 BEGIN {
     use_ok("Encode::MIME::Header");
@@ -138,6 +138,11 @@ my @decode_default_tests = (
     "=?utf-8-strict?Q?=C3=A1=f9=80=80=80=80?=" => "á�",
     # allow non-ASCII characters in q word
     "=?UTF-8?Q?\x{C3}\x{A1}?=" => "á",
+    # allow missing padding characters '=' in b word
+    "=?UTF-8?B?JQ?=" => "%",
+    "=?UTF-8?B?JQ?= =?UTF-8?B?JQ?=" => "%%",
+    "=?UTF-8?B?YWI?=" => "ab",
+    "=?UTF-8?B?YWI?= =?UTF-8?B?YWI?=" => "abab",
 );
 
 my @decode_strict_tests = (
@@ -159,6 +164,11 @@ my @decode_strict_tests = (
     "=?utf-8-strict?Q?=C3=A1?=" => "=?utf-8-strict?Q?=C3=A1?=",
     # do not allow non-ASCII characters in q word
     "=?UTF-8?Q?\x{C3}\x{A1}?=" => "=?UTF-8?Q?\x{C3}\x{A1}?=",
+    # do not allow missing padding characters '=' in b word
+    "=?UTF-8?B?JQ?=" => "=?UTF-8?B?JQ?=",
+    "=?UTF-8?B?JQ?= =?UTF-8?B?JQ?=" => "=?UTF-8?B?JQ?= =?UTF-8?B?JQ?=",
+    "=?UTF-8?B?YWI?=" => "=?UTF-8?B?YWI?=",
+    "=?UTF-8?B?YWI?= =?UTF-8?B?YWI?=" => "=?UTF-8?B?YWI?= =?UTF-8?B?YWI?=",
 );
 
 my @encode_tests = (
index 0a17f46..83db80d 100644 (file)
@@ -32,11 +32,11 @@ ExtUtils::Install - install files from here to there
 
 =head1 VERSION
 
-2.20
+2.22
 
 =cut
 
-our $VERSION = '2.20';  # <-- do not forget to update the POD section just above this line!
+our $VERSION = '2.22';  # <-- do not forget to update the POD section just above this line!
 $VERSION = eval $VERSION;
 
 =pod
@@ -104,7 +104,6 @@ $INSTALL_QUIET = 1
       $ENV{MAKEFLAGS} =~ /\b(s|silent|quiet)\b/);
 
 my $Curdir = File::Spec->curdir;
-my $Perm_Dir = $ENV{PERL_CORE} ? 0770 : 0755;
 
 sub _estr(@) {
     return join "\n",'!' x 72,@_,'!' x 72,'';
@@ -770,7 +769,7 @@ sub install { #XXX OS-SPECIFIC
         _chdir($cwd);
     }
     foreach my $targetdir (sort keys %check_dirs) {
-        _mkpath( $targetdir, 0, $Perm_Dir, $verbose, $dry_run );
+        _mkpath( $targetdir, 0, 0755, $verbose, $dry_run );
     }
     foreach my $found (@found_files) {
         my ($diff, $ffd, $origfile, $mode, $size, $atime, $mtime,
@@ -784,7 +783,7 @@ sub install { #XXX OS-SPECIFIC
                     $targetfile= _unlink_or_rename( $targetfile, 'tryhard', 'install' )
                         unless $dry_run;
                 } elsif ( ! -d $targetdir ) {
-                    _mkpath( $targetdir, 0, $Perm_Dir, $verbose, $dry_run );
+                    _mkpath( $targetdir, 0, 0755, $verbose, $dry_run );
                 }
                 print "Installing $targetfile\n";
 
@@ -824,7 +823,7 @@ sub install { #XXX OS-SPECIFIC
 
     if ($pack{'write'}) {
         $dir = install_rooted_dir(dirname($pack{'write'}));
-        _mkpath( $dir, 0, $Perm_Dir, $verbose, $dry_run );
+        _mkpath( $dir, 0, 0755, $verbose, $dry_run );
         print "Writing $pack{'write'}\n" if $verbose;
         $packlist->write(install_rooted_file($pack{'write'})) unless $dry_run;
     }
@@ -1162,7 +1161,7 @@ sub pm_to_blib {
     my($fromto,$autodir,$pm_filter) = @_;
 
     my %dirs;
-    _mkpath($autodir,0,$Perm_Dir) if defined $autodir;
+    _mkpath($autodir,0,0755) if defined $autodir;
     while(my($from, $to) = each %$fromto) {
         if( -f $to && -s $from == -s $to && -M $to < -M $from ) {
             print "Skip $to (unchanged)\n" unless $INSTALL_QUIET;
@@ -1187,7 +1186,7 @@ sub pm_to_blib {
         } else {
             my $dirname = dirname($to);
             if (!$dirs{$dirname}++) {
-                _mkpath($dirname,0,$Perm_Dir);
+                _mkpath($dirname,0,0755);
             }
         }
         if ($need_filtering) {
index 0cfd96b..c82861b 100644 (file)
@@ -15,7 +15,7 @@ my $DOSISH = ($^O =~ /^(MSWin\d\d|os2|dos|mint)$/);
 
 require VMS::Filespec if $Is_VMS;
 
-our $VERSION = '2.20';
+our $VERSION = '2.22';
 $VERSION = eval $VERSION;
 
 sub _is_prefix {
index 98d09e3..5fa93ff 100644 (file)
@@ -4,7 +4,7 @@ use strict;
 use Carp qw();
 use Config;
 our $Relocations;
-our $VERSION = '2.20';
+our $VERSION = '2.22';
 $VERSION = eval $VERSION;
 
 # Used for generating filehandle globs.  IO::File might not be available!
index 7396ed3..a50ed0a 100644 (file)
@@ -11,6 +11,7 @@ use TieOut;
 use File::Path;
 use File::Spec;
 use File::Temp qw[tempdir];
+use File::Compare;
 
 use Test::More tests => 70;
 
index d0b57a2..de49e58 100644 (file)
@@ -35,6 +35,7 @@ WriteMakefile(
     VERSION_FROM  => 'lib/Big/Dummy.pm',
     EXE_FILES     => [qw(bin/program)],
     PREREQ_PM     => { strict => 0 },
+    BUILD_REQUIRES => { warnings => 0 },
     ABSTRACT_FROM => 'lib/Big/Dummy.pm',
     AUTHOR        => 'Michael G Schwern <schwern@pobox.com>',
 );
@@ -104,12 +105,23 @@ END
 
             );
 
+my $tmpdir;
 
+# if given args, those are inserted as components in resulting path, eg:
+# setup_recurs('dir') means instead of creating Big-Dummy/*, dir/Big-Dummy/*
 sub setup_recurs {
-
-    while(my($file, $text) = each %Files) {
+    my @chrs = ( "A" .. "Z", 0 .. 9 );
+    # annoyingly we cant use File::Temp here as it drags in XS code
+    # and we run under blocks to prevent XS code loads. This is a minimal
+    # patch to fix the issue.
+    $tmpdir = join "", "./temp-$$-", map { $chrs[rand(@chrs)] } 1..8;
+    mkdir($tmpdir) or die "Failed to create '$tmpdir': $!";
+    chdir($tmpdir) or die "Failed to chdir '$tmpdir': $!";
+    foreach my $file (sort keys %Files) {
+        my $text = $Files{$file};
         # Convert to a relative, native file path.
-        $file = File::Spec->catfile(File::Spec->curdir, split m{\/}, $file);
+        $file = File::Spec->catfile(File::Spec->curdir, @_, split m{\/}, $file);
+        $file = File::Spec->rel2abs($file);
 
         my $dir = dirname($file);
         mkpath $dir;
@@ -126,13 +138,15 @@ sub setup_recurs {
     return 1;
 }
 
-sub teardown_recurs { 
+sub teardown_recurs {
     foreach my $file (keys %Files) {
         my $dir = dirname($file);
         if( -e $dir ) {
-            rmtree($dir) || return;
+            rmtree($dir) or next;
         }
     }
+    chdir("..");
+    rmtree($tmpdir);
     return 1;
 }
 
index 34b1dc1..39cf5f2 100644 (file)
@@ -4,11 +4,10 @@ use 5.00503;
 use strict;
 use warnings;
 require Exporter;
-use vars qw(@ISA @EXPORT @EXPORT_OK $VERSION);
-@ISA       = qw(Exporter);
-@EXPORT    = qw(cp rm_f rm_rf mv cat eqtime mkpath touch test_f test_d chmod
-                dos2unix);
-$VERSION = '7.64';
+our @ISA     = qw(Exporter);
+our @EXPORT  = qw(cp rm_f rm_rf mv cat eqtime mkpath touch test_f test_d chmod
+                  dos2unix);
+our $VERSION = '7.70';
 $VERSION =~ tr/_//d;
 
 my $Is_VMS   = $^O eq 'VMS';
index 348b675..5219885 100644 (file)
@@ -10,7 +10,7 @@ our @ISA = qw(Exporter);
 
 our @EXPORT  = qw(test_harness pod2man perllocal_install uninstall
                   warn_if_old_packlist test_s cp_nonempty);
-our $VERSION = '7.64';
+our $VERSION = '7.70';
 $VERSION =~ tr/_//d;
 
 my $Is_VMS = $^O eq 'VMS';
index cf68149..a21e16d 100644 (file)
@@ -3,7 +3,7 @@ package ExtUtils::Liblist;
 use strict;
 use warnings;
 
-our $VERSION = '7.64';
+our $VERSION = '7.70';
 $VERSION =~ tr/_//d;
 
 use File::Spec;
index 01a4a48..298a026 100644 (file)
@@ -11,7 +11,7 @@ use 5.006;
 
 use strict;
 use warnings;
-our $VERSION = '7.64';
+our $VERSION = '7.70';
 $VERSION =~ tr/_//d;
 
 use ExtUtils::MakeMaker::Config;
@@ -62,6 +62,7 @@ sub _unix_os2_ext {
                chomp(my @incpath = grep s/^ //, grep { /^#include </ .. /^End of search / } `$Config{cc} -E -v - </dev/null 2>&1 >/dev/null`);
                unshift @libpath, map { s{/include[^/]*}{/lib}; $_ } @incpath
        }
+       @libpath = grep -d, @libpath;
 
     if ( $^O eq 'darwin' or $^O eq 'next' )  {
         # 'escape' Mach-O ld -framework and -F flags, so they aren't dropped later on
index a9d8d26..554e6fb 100644 (file)
@@ -4,7 +4,7 @@ use strict;
 use warnings;
 use ExtUtils::MakeMaker::Config;
 
-our $VERSION = '7.64';
+our $VERSION = '7.70';
 $VERSION =~ tr/_//d;
 
 require ExtUtils::Liblist;
index b25adf5..d6519d2 100644 (file)
@@ -2,7 +2,7 @@ package ExtUtils::MM_AIX;
 
 use strict;
 use warnings;
-our $VERSION = '7.64';
+our $VERSION = '7.70';
 $VERSION =~ tr/_//d;
 
 use ExtUtils::MakeMaker::Config;
index 826a4a5..4513682 100644 (file)
@@ -2,7 +2,7 @@ package ExtUtils::MM_Any;
 
 use strict;
 use warnings;
-our $VERSION = '7.64';
+our $VERSION = '7.70';
 $VERSION =~ tr/_//d;
 
 use Carp;
index d00dea5..e544515 100644 (file)
@@ -27,7 +27,7 @@ require ExtUtils::MM_Any;
 require ExtUtils::MM_Unix;
 
 our @ISA = qw( ExtUtils::MM_Any ExtUtils::MM_Unix );
-our $VERSION = '7.64';
+our $VERSION = '7.70';
 $VERSION =~ tr/_//d;
 
 
index 91d2094..f44877b 100644 (file)
@@ -10,7 +10,7 @@ require ExtUtils::MM_Unix;
 require ExtUtils::MM_Win32;
 our @ISA = qw( ExtUtils::MM_Unix );
 
-our $VERSION = '7.64';
+our $VERSION = '7.70';
 $VERSION =~ tr/_//d;
 
 
index 4e1b86a..c23ec5d 100644 (file)
@@ -3,7 +3,7 @@ package ExtUtils::MM_DOS;
 use strict;
 use warnings;
 
-our $VERSION = '7.64';
+our $VERSION = '7.70';
 $VERSION =~ tr/_//d;
 
 require ExtUtils::MM_Any;
index 4e971c3..24f48d9 100644 (file)
@@ -8,7 +8,7 @@ BEGIN {
     our @ISA = qw( ExtUtils::MM_Unix );
 }
 
-our $VERSION = '7.64';
+our $VERSION = '7.70';
 $VERSION =~ tr/_//d;
 
 
index f914555..e186b91 100644 (file)
@@ -3,7 +3,7 @@ package ExtUtils::MM_MacOS;
 use strict;
 use warnings;
 
-our $VERSION = '7.64';
+our $VERSION = '7.70';
 $VERSION =~ tr/_//d;
 
 sub new {
index 052083d..e2ba1df 100644 (file)
@@ -23,7 +23,7 @@ use warnings;
 use ExtUtils::MakeMaker::Config;
 use File::Basename;
 
-our $VERSION = '7.64';
+our $VERSION = '7.70';
 $VERSION =~ tr/_//d;
 
 require ExtUtils::MM_Win32;
index 95583e2..2cbec89 100644 (file)
@@ -6,7 +6,7 @@ use warnings;
 use ExtUtils::MakeMaker qw(neatvalue);
 use File::Spec;
 
-our $VERSION = '7.64';
+our $VERSION = '7.70';
 $VERSION =~ tr/_//d;
 
 require ExtUtils::MM_Any;
index 071a2d5..ee06364 100644 (file)
@@ -2,7 +2,7 @@ package ExtUtils::MM_QNX;
 
 use strict;
 use warnings;
-our $VERSION = '7.64';
+our $VERSION = '7.70';
 $VERSION =~ tr/_//d;
 
 require ExtUtils::MM_Unix;
index 7bb41d0..64852a1 100644 (file)
@@ -2,7 +2,7 @@ package ExtUtils::MM_UWIN;
 
 use strict;
 use warnings;
-our $VERSION = '7.64';
+our $VERSION = '7.70';
 $VERSION =~ tr/_//d;
 
 require ExtUtils::MM_Unix;
index dec0a08..fe38598 100644 (file)
@@ -13,10 +13,11 @@ our %Config_Override;
 
 use ExtUtils::MakeMaker qw($Verbose neatvalue _sprintf562);
 
-# If we make $VERSION an our variable parse_version() breaks
-use vars qw($VERSION);
-$VERSION = '7.64';
+# If $VERSION is in scope, parse_version() breaks
+{
+our $VERSION = '7.70';
 $VERSION =~ tr/_//d;
+}
 
 require ExtUtils::MM_Any;
 our @ISA = qw(ExtUtils::MM_Any);
@@ -34,13 +35,16 @@ BEGIN {
     $Is{SunOS4}  = $^O eq 'sunos';
     $Is{Solaris} = $^O eq 'solaris';
     $Is{SunOS}   = $Is{SunOS4} || $Is{Solaris};
-    $Is{BSD}     = ($^O =~ /^(?:free|net|open)bsd$/ or
+    $Is{BSD}     = ($^O =~ /^(?:free|midnight|net|open)bsd$/ or
                    grep( $^O eq $_, qw(bsdos interix dragonfly) )
                   );
     $Is{Android} = $^O =~ /android/;
-    if ( $^O eq 'darwin' && $^X eq '/usr/bin/perl' ) {
+    if ( $^O eq 'darwin' ) {
       my @osvers = split /\./, $Config{osvers};
-      $Is{ApplCor} = ( $osvers[0] >= 18 );
+      if ( $^X eq '/usr/bin/perl' ) {
+        $Is{ApplCor} = ( $osvers[0] >= 18 );
+      }
+      $Is{AppleRPath} = ( $osvers[0] >= 9 );
     }
 }
 
@@ -1054,7 +1058,7 @@ sub xs_make_dynamic_lib {
         if ( $Is{IRIX} ) {
             $ldrun = qq{-rpath "$self->{LD_RUN_PATH}"};
         }
-        elsif ( $^O eq 'darwin' ) {
+        elsif ( $^O eq 'darwin' && $Is{AppleRPath} ) {
             # both clang and gcc support -Wl,-rpath, but only clang supports
             # -rpath so by using -Wl,-rpath we avoid having to check for the
             # type of compiler
@@ -2193,7 +2197,7 @@ Add MM_Unix_VERSION.
 sub init_platform {
     my($self) = shift;
 
-    $self->{MM_Unix_VERSION} = $VERSION;
+    $self->{MM_Unix_VERSION} = our $VERSION;
     $self->{PERL_MALLOC_DEF} = '-DPERL_EXTMALLOC_DEF -Dmalloc=Perl_malloc '.
                                '-Dfree=Perl_mfree -Drealloc=Perl_realloc '.
                                '-Dcalloc=Perl_calloc';
@@ -2225,8 +2229,7 @@ Called by init_main.  Initializes PERL_*
 sub init_PERM {
     my($self) = shift;
 
-    my $perm_dir = $self->{PERL_CORE} ? 770 : 755;
-    $self->{PERM_DIR} = $perm_dir  unless defined $self->{PERM_DIR};
+    $self->{PERM_DIR} = 755  unless defined $self->{PERM_DIR};
     $self->{PERM_RW}  = 644  unless defined $self->{PERM_RW};
     $self->{PERM_RWX} = 755  unless defined $self->{PERM_RWX};
 
index 8564bc7..4ed4e26 100644 (file)
@@ -16,7 +16,7 @@ BEGIN {
 
 use File::Basename;
 
-our $VERSION = '7.64';
+our $VERSION = '7.70';
 $VERSION =~ tr/_//d;
 
 require ExtUtils::MM_Any;
index 341750e..cdbd1af 100644 (file)
@@ -2,7 +2,7 @@ package ExtUtils::MM_VOS;
 
 use strict;
 use warnings;
-our $VERSION = '7.64';
+our $VERSION = '7.70';
 $VERSION =~ tr/_//d;
 
 require ExtUtils::MM_Unix;
index f6a1bc9..5d931b4 100644 (file)
@@ -27,7 +27,7 @@ use ExtUtils::MakeMaker qw(neatvalue _sprintf562);
 require ExtUtils::MM_Any;
 require ExtUtils::MM_Unix;
 our @ISA = qw( ExtUtils::MM_Any ExtUtils::MM_Unix );
-our $VERSION = '7.64';
+our $VERSION = '7.70';
 $VERSION =~ tr/_//d;
 
 $ENV{EMXSHELL} = 'sh'; # to run `commands`
index f7bc5f7..e907fb1 100644 (file)
@@ -3,7 +3,7 @@ package ExtUtils::MM_Win95;
 use strict;
 use warnings;
 
-our $VERSION = '7.64';
+our $VERSION = '7.70';
 $VERSION =~ tr/_//d;
 
 require ExtUtils::MM_Win32;
index 5c4cf77..4b24422 100644 (file)
@@ -3,7 +3,7 @@ package ExtUtils::MY;
 use strict;
 require ExtUtils::MM;
 
-our $VERSION = '7.64';
+our $VERSION = '7.70';
 $VERSION =~ tr/_//d;
 our @ISA = qw(ExtUtils::MM);
 
@@ -30,7 +30,7 @@ ExtUtils::MY - ExtUtils::MakeMaker subclass for customization
 
 B<FOR INTERNAL USE ONLY>
 
-ExtUtils::MY is a subclass of L<ExtUtils::MM>.  Its provided in your
+ExtUtils::MY is a subclass of L<ExtUtils::MM>.  It is provided in your
 Makefile.PL for you to add and override MakeMaker functionality.
 
 It also provides a convenient alias via the MY class.
index 8ee3ca8..e8c3808 100644 (file)
@@ -25,7 +25,7 @@ my %Recognized_Att_Keys;
 our %macro_fsentity; # whether a macro is a filesystem name
 our %macro_dep; # whether a macro is a dependency
 
-our $VERSION = '7.64';
+our $VERSION = '7.70';
 $VERSION =~ tr/_//d;
 
 # Emulate something resembling CVS $Revision$
@@ -525,7 +525,10 @@ sub new {
                     # simulate "use warnings FATAL => 'all'" for vintage perls
                     die @_;
                 };
-                version->new( $perl_version )->numify;
+                my $v = version->new($perl_version);
+                # we care about parse issues, not numify warnings
+                no warnings;
+                $v->numify;
             };
             $perl_version =~ tr/_//d
                 if defined $perl_version;
@@ -1151,19 +1154,20 @@ sub check_hints {
 }
 
 sub _run_hintfile {
-    my ($self, $hint_file) = @_;
+    our $self;
+    local($self) = shift;       # make $self available to the hint file.
+    my($hint_file) = shift;
 
     local($@, $!);
     print "Processing hints file $hint_file\n" if $Verbose;
 
-    if(open(my $fh, '<', $hint_file)) {
-        my $hints_content = do { local $/; <$fh> };
-        no strict;
-        eval $hints_content;
-        warn "Failed to run hint file $hint_file: $@" if $@;
-    }
-    else {
-        warn "Could not open $hint_file for read: $!";
+    # Just in case the ./ isn't on the hint file, which File::Spec can
+    # often strip off, we bung the curdir into @INC
+    local @INC = (File::Spec->curdir, @INC);
+    my $ret = do $hint_file;
+    if( !defined $ret ) {
+        my $error = $@ || $!;
+        warn $error;
     }
 }
 
@@ -1262,6 +1266,7 @@ sub write_file_via_tmp {
     die "write_file_via_tmp: 2nd arg must be ref" unless ref $contents;
     for my $chunk (@$contents) {
         my $to_write = $chunk;
+        $to_write = '' unless defined $to_write;
         utf8::encode $to_write if !$CAN_DECODE && "$]" > 5.008;
         print $fh "$to_write\n" or die "Can't write to MakeMaker.tmp: $!";
     }
@@ -1331,26 +1336,6 @@ sub neatvalue {
     return "{ ".join(', ',@m)." }";
 }
 
-sub _find_magic_vstring {
-    my $value = shift;
-    return $value if $UNDER_CORE;
-    my $tvalue = '';
-    require B;
-    my $sv = B::svref_2object(\$value);
-    my $magic = ref($sv) eq 'B::PVMG' ? $sv->MAGIC : undef;
-    while ( $magic ) {
-        if ( $magic->TYPE eq 'V' ) {
-            $tvalue = $magic->PTR;
-            $tvalue =~ s/^v?(.+)$/v$1/;
-            last;
-        }
-        else {
-            $magic = $magic->MOREMAGIC;
-        }
-    }
-    return $tvalue;
-}
-
 sub selfdocument {
     my($self) = @_;
     my(@m);
@@ -3297,7 +3282,7 @@ are generated when F<Makefile.PL> generates a F<Makefile> (if L<CPAN::Meta>
 is installed).  Clients like L<CPAN> or L<CPANPLUS> will read these
 files to see what prerequisites must be fulfilled before building or testing
 the distribution.  If you wish to shut this feature off, set the C<NO_MYMETA>
-C<WriteMakeFile()> flag to true.
+C<WriteMakefile()> flag to true.
 
 =head2 Disabling an extension
 
index 7b2498b..abc9db1 100644 (file)
@@ -3,7 +3,7 @@ package ExtUtils::MakeMaker::Config;
 use strict;
 use warnings;
 
-our $VERSION = '7.64';
+our $VERSION = '7.70';
 $VERSION =~ tr/_//d;
 
 use Config ();
index 1184841..76dca18 100644 (file)
@@ -1,6 +1,6 @@
 package ExtUtils::MakeMaker::FAQ;
 
-our $VERSION = '7.64';
+our $VERSION = '7.70';
 $VERSION =~ tr/_//d;
 
 1;
@@ -129,7 +129,7 @@ Let's take the following test directory structure:
     t/bar/othertest.t
     t/bar/baz/anothertest.t
 
-Now, inside of the C<WriteMakeFile()> function in your F<Makefile.PL>, specify
+Now, inside of the C<WriteMakefile()> function in your F<Makefile.PL>, specify
 where your tests are located with the C<test> directive:
 
     test => {TESTS => 't/*.t t/*/*.t t/*/*/*.t'}
@@ -536,8 +536,7 @@ And of course a very basic test:
 
   t/cool.t:
   --------
-  use Test;
-  BEGIN { plan tests => 1 };
+  use Test::More tests => 1;
   use Cool::Foo;
   use Cool::Bar;
   Cool::Foo::perl_rules();
index e4625e3..7a75411 100644 (file)
@@ -2,7 +2,7 @@ package ExtUtils::MakeMaker::Locale;
 
 use strict;
 use warnings;
-our $VERSION = "7.64";
+our $VERSION = "7.70";
 $VERSION =~ tr/_//d;
 
 use base 'Exporter';
index e476874..9e545b3 100644 (file)
@@ -1,6 +1,6 @@
 package ExtUtils::MakeMaker::Tutorial;
 
-our $VERSION = '7.64';
+our $VERSION = '7.70';
 $VERSION =~ tr/_//d;
 
 
@@ -112,7 +112,7 @@ example:
 
     t/foo/subdir_test.t
 
-To do this, you need to inform C<WriteMakeFile()> in your I<Makefile.PL> file
+To do this, you need to inform C<WriteMakefile()> in your I<Makefile.PL> file
 in the following fashion:
 
     test => {TESTS => 't/*.t t/*/*.t'}
index 726ac76..59fb20e 100644 (file)
@@ -16,7 +16,7 @@ use warnings;
 
 use vars qw(@ISA $VERSION $CLASS $STRICT $LAX *declare *qv);
 
-$VERSION = '7.64';
+$VERSION = '7.70';
 $VERSION =~ tr/_//d;
 $CLASS = 'version';
 
index 2f02cc9..a824a25 100644 (file)
@@ -11,7 +11,7 @@ use warnings;
 
 use vars qw($VERSION $CLASS $STRICT $LAX);
 
-$VERSION = '7.64';
+$VERSION = '7.70';
 $VERSION =~ tr/_//d;
 
 #--------------------------------------------------------------------------#
index 51b1add..9a490a6 100644 (file)
@@ -3,7 +3,7 @@ package ExtUtils::Mkbootstrap;
 use strict;
 use warnings;
 
-our $VERSION = '7.64';
+our $VERSION = '7.70';
 $VERSION =~ tr/_//d;
 
 require Exporter;
index 4498c39..ec074dc 100644 (file)
@@ -11,7 +11,7 @@ use Config;
 
 our @ISA = qw(Exporter);
 our @EXPORT = qw(&Mksymlists);
-our $VERSION = '7.64';
+our $VERSION = '7.70';
 $VERSION =~ tr/_//d;
 
 sub Mksymlists {
index de24aa3..2de0028 100644 (file)
@@ -3,7 +3,7 @@ package ExtUtils::testlib;
 use strict;
 use warnings;
 
-our $VERSION = '7.64';
+our $VERSION = '7.70';
 $VERSION =~ tr/_//d;
 
 use Cwd;
index 0233c2f..79ca6c3 100644 (file)
@@ -67,7 +67,14 @@ BEGIN {
 
     my ($now) = time;
     utime ($now, $now, $ARGV[0]);
-    sleep 2;
+
+    sleep 3; # note this affects the "newer file created"
+             # we used to sleep 2, but with the vagaries of sleep
+             # this meant that occasionally that test would fail
+             # on cygwin, by virtue of seeing only a one second
+             # difference. Sleeping 3 seconds should ensure
+             # that we get at least 2 seconds difference for
+             # that test.
 
     # Just checking modify time stamp, access time stamp is set
     # to the beginning of the day in Win95.
index cb138fc..c74af99 100755 (executable)
@@ -17,7 +17,7 @@ use ExtUtils::MM;
 use Test::More
     !MM->can_run(make()) && $ENV{PERL_CORE} && $Config{'usecrosscompile'}
     ? (skip_all => "cross-compiling and make not available")
-    : (tests => 35);
+    : (tests => 37);
 use File::Path;
 
 use ExtUtils::MakeMaker;
@@ -124,6 +124,17 @@ note "Argument verification"; {
     is( $@, '',        '  nor a hard failure' );
 
 
+    $warnings = '';
+    eval {
+        WriteMakefile(
+            NAME             => 'Min::PerlVers',
+            MIN_PERL_VERSION => '5.005_04',
+        );
+    };
+    is( $warnings, '', 'MIN_PERL_VERSION=5.005_04 does not trigger a warning' );
+    is( $@, '',        '  nor a hard failure' );
+
+
     $warnings = '';
     eval {
         WriteMakefile(
index 0805ae7..8652a40 100644 (file)
@@ -1,7 +1,7 @@
 # Call.pm
 #
 # Copyright (c) 1995-2011 Paul Marquess. All rights reserved.
-# Copyright (c) 2011-2014 Reini Urban. All rights reserved.
+# Copyright (c) 2011-2014, 2018-2022 Reini Urban. All rights reserved.
 # Copyright (c) 2014-2017 cPanel Inc. All rights reserved.
 #
 # This program is free software; you can redistribute it and/or
@@ -18,7 +18,7 @@ use warnings;
 
 our @ISA = qw(Exporter);
 our @EXPORT = qw( filter_add filter_del filter_read filter_read_exact) ;
-our $VERSION = "1.60" ;
+our $VERSION = "1.64" ;
 our $XS_VERSION = $VERSION;
 $VERSION = eval $VERSION;
 
@@ -528,7 +528,7 @@ Paul Marquess
 =head1 LICENSE
 
 Copyright (c) 1995-2011 Paul Marquess. All rights reserved.
-Copyright (c) 2011-2014 Reini Urban. All rights reserved.
+Copyright (c) 2011-2014, 2018-2022 Reini Urban. All rights reserved.
 Copyright (c) 2014-2017 cPanel Inc. All rights reserved.
 
 This program is free software; you can redistribute it and/or
index 2ac88e2..9521c0b 100644 (file)
@@ -1,12 +1,12 @@
 /* 
  * Filename : Call.xs
  * 
- * Author   : Paul Marquess 
- * Date     : 2014-12-09 02:48:44 rurban
- * Version  : 1.60
+ * Author   : Reini Urban
+ * Date     : Di 16. Aug 7:59:10 CEST 2022
+ * Version  : 1.64
  *
  *    Copyright (c) 1995-2011 Paul Marquess. All rights reserved.
- *    Copyright (c) 2011-2014 Reini Urban. All rights reserved.
+ *    Copyright (c) 2011-2014, 2018 Reini Urban. All rights reserved.
  *       This program is free software; you can redistribute it and/or
  *              modify it under the same terms as Perl itself.
  *
index 8263e21..fda1fc3 100644 (file)
@@ -4,12 +4,14 @@
 # Author          : Johan Vromans
 # Created On      : Tue Sep 11 15:00:12 1990
 # Last Modified By: Johan Vromans
-# Last Modified On: Tue Aug 18 14:48:05 2020
-# Update Count    : 1739
+# Last Modified On: Thu Nov 17 17:45:27 2022
+# Update Count    : 1777
 # Status          : Released
 
 ################ Module Preamble ################
 
+# There are no CPAN testers for very old versions of Perl.
+# Getopt::Long is reported to run under 5.8.
 use 5.004;
 
 use strict;
@@ -18,10 +20,10 @@ use warnings;
 package Getopt::Long;
 
 use vars qw($VERSION);
-$VERSION        =  2.52;
+$VERSION        =  2.54;
 # For testing versions only.
 use vars qw($VERSION_STRING);
-$VERSION_STRING = "2.52";
+$VERSION_STRING = "2.54";
 
 use Exporter;
 use vars qw(@ISA @EXPORT @EXPORT_OK);
@@ -258,9 +260,9 @@ use constant PAT_XINT  =>
   ")";
 use constant PAT_FLOAT =>
   "[-+]?".                     # optional sign
-  "(?=[0-9.])".                        # must start with digit or dec.point
+  "(?=\\.?[0-9])".             # must start with digit or dec.point
   "[0-9_]*".                   # digits before the dec.point
-  "(\.[0-9_]+)?".              # optional fraction
+  "(\\.[0-9_]*)?".             # optional fraction
   "([eE][-+]?[0-9_]+)?";       # optional exponent
 
 sub GetOptions(@) {
@@ -525,8 +527,9 @@ sub GetOptionsFromArray(@) {
        my $key;                # key (if hash type)
        my $arg;                # option argument
        my $ctl;                # the opctl entry
+       my $starter;            # the actual starter character(s)
 
-       ($found, $opt, $ctl, $arg, $key) =
+       ($found, $opt, $ctl, $starter, $arg, $key) =
          FindOption ($argv, $prefix, $argend, $opt, \%opctl);
 
        if ( $found ) {
@@ -606,12 +609,13 @@ sub GetOptionsFromArray(@) {
                            eval {
                                &{$linkage{$opt}}
                                  (Getopt::Long::CallBack->new
-                                  (name    => $opt,
-                                   given   => $given,
-                                   ctl     => $ctl,
-                                   opctl   => \%opctl,
-                                   linkage => \%linkage,
-                                   prefix  => $prefix,
+                                  (name     => $opt,
+                                   given    => $given,
+                                   ctl      => $ctl,
+                                   opctl    => \%opctl,
+                                   linkage  => \%linkage,
+                                   prefix   => $prefix,
+                                   starter  => $starter,
                                   ),
                                   $ctl->[CTL_DEST] == CTL_DEST_HASH ? ($key) : (),
                                   $arg);
@@ -818,7 +822,7 @@ sub ParseOptionSpec ($$) {
                     [=:] [ionfs] [@%]? (?: \{\d*,?\d*\} )?
                     |
                     # ... or an optional-with-default spec
-                    : (?: -?\d+ | \+ ) [@%]?
+                    : (?: 0[0-7]+ | 0[xX][0-9a-fA-F]+ | 0[bB][01]+ | -?\d+ | \+ ) [@%]?
                   )?
                   $;x ) {
        return (undef, "Error in option spec: \"$opt\"\n");
@@ -851,10 +855,23 @@ sub ParseOptionSpec ($$) {
        # Fields are hard-wired here.
        $entry = [$spec,$orig,undef,CTL_DEST_SCALAR,0,0];
     }
-    elsif ( $spec =~ /^:(-?\d+|\+)([@%])?$/ ) {
+    elsif ( $spec =~ /^:(0[0-7]+|0x[0-9a-f]+|0b[01]+|-?\d+|\+)([@%])?$/i ) {
        my $def = $1;
        my $dest = $2;
-       my $type = $def eq '+' ? 'I' : 'i';
+       my $type = 'i';         # assume integer
+       if ( $def eq '+' ) {
+           # Increment.
+           $type = 'I';
+       }
+       elsif ( $def =~ /^(0[0-7]+|0[xX][0-9a-fA-F]+|0[bB][01]+)$/ ) {
+           # Octal, binary or hex.
+           $type = 'o';
+           $def = oct($def);
+       }
+       elsif ( $def =~ /^-?\d+$/ ) {
+           # Integer.
+           $def = 0 + $def;
+       }
        $dest ||= '$';
        $dest = $dest eq '@' ? CTL_DEST_ARRAY
          : $dest eq '%' ? CTL_DEST_HASH : CTL_DEST_SCALAR;
@@ -923,7 +940,7 @@ sub ParseOptionSpec ($$) {
 # Option lookup.
 sub FindOption ($$$$$) {
 
-    # returns (1, $opt, $ctl, $arg, $key) if okay,
+    # returns (1, $opt, $ctl, $starter, $arg, $key) if okay,
     # returns (1, undef) if option in error,
     # returns (0) otherwise.
 
@@ -1104,7 +1121,7 @@ sub FindOption ($$$$$) {
            $arg = 0;           # supply explicit value
        }
        unshift (@$argv, $starter.$rest) if defined $rest;
-       return (1, $opt, $ctl, $arg);
+       return (1, $opt, $ctl, $starter, $arg);
     }
 
     # Get mandatory status and type info.
@@ -1127,15 +1144,15 @@ sub FindOption ($$$$$) {
                # Fake incremental type.
                my @c = @$ctl;
                $c[CTL_TYPE] = '+';
-               return (1, $opt, \@c, 1);
+               return (1, $opt, \@c, $starter, 1);
            }
            my $val
              = defined($ctl->[CTL_DEFAULT]) ? $ctl->[CTL_DEFAULT]
              : $type eq 's'                 ? ''
              :                                0;
-           return (1, $opt, $ctl, $val);
+           return (1, $opt, $ctl, $starter, $val);
        }
-       return (1, $opt, $ctl, $type eq 's' ? '' : 0)
+       return (1, $opt, $ctl, $starter, $type eq 's' ? '' : 0)
          if $optargtype == 1;  # --foo=  -> return nothing
     }
 
@@ -1155,9 +1172,9 @@ sub FindOption ($$$$$) {
            # Fake incremental type.
            my @c = @$ctl;
            $c[CTL_TYPE] = '+';
-           return (1, $opt, \@c, 1);
+           return (1, $opt, \@c, $starter, 1);
        }
-       return (1, $opt, $ctl,
+       return (1, $opt, $ctl, $starter,
                defined($ctl->[CTL_DEFAULT]) ? $ctl->[CTL_DEFAULT] :
                $type eq 's' ? '' : 0);
     }
@@ -1187,16 +1204,16 @@ sub FindOption ($$$$$) {
 
     if ( $type eq 's' ) {      # string
        # A mandatory string takes anything.
-       return (1, $opt, $ctl, $arg, $key) if $mand;
+       return (1, $opt, $ctl, $starter, $arg, $key) if $mand;
 
        # Same for optional string as a hash value
-       return (1, $opt, $ctl, $arg, $key)
+       return (1, $opt, $ctl, $starter, $arg, $key)
          if $ctl->[CTL_DEST] == CTL_DEST_HASH;
 
        # An optional string takes almost anything.
-       return (1, $opt, $ctl, $arg, $key)
+       return (1, $opt, $ctl, $starter, $arg, $key)
          if defined $optarg || defined $rest;
-       return (1, $opt, $ctl, $arg, $key) if $arg eq "-"; # ??
+       return (1, $opt, $ctl, $starter, $arg, $key) if $arg eq "-"; # ??
 
        # Check for option or option list terminator.
        if ($arg eq $argend ||
@@ -1248,7 +1265,7 @@ sub FindOption ($$$$$) {
                    # Fake incremental type.
                    my @c = @$ctl;
                    $c[CTL_TYPE] = '+';
-                   return (1, $opt, \@c, 1);
+                   return (1, $opt, \@c, $starter, 1);
                }
                # Supply default value.
                $arg = defined($ctl->[CTL_DEFAULT]) ? $ctl->[CTL_DEFAULT] : 0;
@@ -1293,7 +1310,7 @@ sub FindOption ($$$$$) {
     else {
        die("Getopt::Long internal error (Can't happen)\n");
     }
-    return (1, $opt, $ctl, $arg, $key);
+    return (1, $opt, $ctl, $starter, $arg, $key);
 }
 
 sub ValidValue ($$$$$) {
@@ -1529,8 +1546,9 @@ sub setup_pa_args($@) {
 
     if ( UNIVERSAL::isa($pa, 'HASH') ) {
        # Get rid of -msg vs. -message ambiguity.
-       $pa->{-message} = $pa->{-msg};
-       delete($pa->{-msg});
+       if (!defined $pa->{-message}) {
+           $pa->{-message} = delete($pa->{-msg});
+       }
     }
     elsif ( $pa =~ /^-?\d+$/ ) {
        $pa = { -exitval => $pa };
@@ -1714,6 +1732,9 @@ disable C<$verbose> by setting its value to C<0>. Using a suitable
 default value, the program can find out whether C<$verbose> is false
 by default, or disabled by using C<--noverbose>.
 
+(If both C<--verbose> and C<--noverbose> are given, whichever is given
+last takes precedence.)
+
 An incremental option is specified with a plus C<+> after the
 option name:
 
@@ -1766,6 +1787,10 @@ of the equals sign indicates that the option value is optional. In
 this case, if no suitable value is supplied, string valued options get
 an empty string C<''> assigned, while numeric options are set to C<0>.
 
+(If the same option appears more than once on the command line, the
+last given value is used.  If you want to take all the values, see
+below.)
+
 =head2 Options with multiple values
 
 Options sometimes take several values. For example, a program could
@@ -2010,6 +2035,8 @@ considered an option on itself.
 
 Like C<:i>, but if the value is omitted, the I<number> will be assigned.
 
+If the I<number> is octal, hexadecimal or binary, behaves like C<:o>.
+
 =item : + [ I<desttype> ]
 
 Like C<:i>, but if the value is omitted, the current value for the
index 83ca06d..8939b42 100644 (file)
@@ -4,7 +4,7 @@ use strict;
 use warnings;
 # ABSTRACT: A small, simple, correct HTTP/1.1 client
 
-our $VERSION = '0.080';
+our $VERSION = '0.086';
 
 sub _croak { require Carp; Carp::croak(@_) }
 
@@ -40,10 +40,15 @@ sub _croak { require Carp; Carp::croak(@_) }
 #pod * C<timeout> — Request timeout in seconds (default is 60) If a socket open,
 #pod   read or write takes longer than the timeout, the request response status code
 #pod   will be 599.
-#pod * C<verify_SSL> — A boolean that indicates whether to validate the SSL
-#pod   certificate of an C<https> — connection (default is false)
+#pod * C<verify_SSL> — A boolean that indicates whether to validate the TLS/SSL
+#pod   certificate of an C<https> — connection (default is true). Changed from false
+#pod   to true in version 0.083.
 #pod * C<SSL_options> — A hashref of C<SSL_*> — options to pass through to
 #pod   L<IO::Socket::SSL>
+#pod * C<$ENV{PERL_HTTP_TINY_SSL_INSECURE_BY_DEFAULT}> - Changes the default
+#pod   certificate verification behavior to not check server identity if set to 1.
+#pod   Only effective if C<verify_SSL> is not set. Added in version 0.083.
+#pod
 #pod
 #pod An accessor/mutator method exists for each attribute.
 #pod
@@ -111,11 +116,17 @@ sub timeout {
 sub new {
     my($class, %args) = @_;
 
+    # Support lower case verify_ssl argument, but only if verify_SSL is not
+    # true.
+    if ( exists $args{verify_ssl} ) {
+        $args{verify_SSL}  ||= $args{verify_ssl};
+    }
+
     my $self = {
         max_redirect => 5,
         timeout      => defined $args{timeout} ? $args{timeout} : 60,
         keep_alive   => 1,
-        verify_SSL   => $args{verify_SSL} || $args{verify_ssl} || 0, # no verification by default
+        verify_SSL   => defined $args{verify_SSL} ? $args{verify_SSL} : _verify_SSL_default(),
         no_proxy     => $ENV{no_proxy},
     };
 
@@ -134,6 +145,13 @@ sub new {
     return $self;
 }
 
+sub _verify_SSL_default {
+    my ($self) = @_;
+    # Check if insecure default certificate verification behaviour has been
+    # changed by the user by setting PERL_HTTP_TINY_SSL_INSECURE_BY_DEFAULT=1
+    return (($ENV{PERL_HTTP_TINY_SSL_INSECURE_BY_DEFAULT} || '') eq '1') ? 0 : 1;
+}
+
 sub _set_proxies {
     my ($self) = @_;
 
@@ -245,9 +263,10 @@ sub post_form {
     while ( my ($key, $value) = each %{$args->{headers} || {}} ) {
         $headers->{lc $key} = $value;
     }
-    delete $args->{headers};
 
     return $self->request('POST', $url, {
+            # Any existing 'headers' key in $args will be overridden with a
+            # normalized version below.
             %$args,
             content => $self->www_form_urlencode($data),
             headers => {
@@ -389,6 +408,10 @@ sub mirror {
 #pod customizing the action of the callback based on the C<status> or C<headers>
 #pod received prior to the content body.)
 #pod
+#pod Content data in the request/response is handled as "raw bytes".  Any
+#pod encoding/decoding (with associated headers) are the responsibility of the
+#pod caller.
+#pod
 #pod The C<request> method returns a hashref containing the response.  The hashref
 #pod will have the following keys:
 #pod
@@ -1055,7 +1078,7 @@ sub new {
         timeout          => 60,
         max_line_size    => 16384,
         max_header_lines => 64,
-        verify_SSL       => 0,
+        verify_SSL       => HTTP::Tiny::_verify_SSL_default(),
         SSL_options      => {},
         %args
     }, $class;
@@ -1704,7 +1727,7 @@ HTTP::Tiny - A small, simple, correct HTTP/1.1 client
 
 =head1 VERSION
 
-version 0.080
+version 0.086
 
 =head1 SYNOPSIS
 
@@ -1797,12 +1820,16 @@ C<timeout> — Request timeout in seconds (default is 60) If a socket open, read
 
 =item *
 
-C<verify_SSL> — A boolean that indicates whether to validate the SSL certificate of an C<https> — connection (default is false)
+C<verify_SSL> — A boolean that indicates whether to validate the TLS/SSL certificate of an C<https> — connection (default is true). Changed from false to true in version 0.083.
 
 =item *
 
 C<SSL_options> — A hashref of C<SSL_*> — options to pass through to L<IO::Socket::SSL>
 
+=item *
+
+C<$ENV{PERL_HTTP_TINY_SSL_INSECURE_BY_DEFAULT}> - Changes the default certificate verification behavior to not check server identity if set to 1. Only effective if C<verify_SSL> is not set. Added in version 0.083.
+
 =back
 
 An accessor/mutator method exists for each attribute.
@@ -1943,6 +1970,10 @@ in-progress response hash reference, as described below.  (This allows
 customizing the action of the callback based on the C<status> or C<headers>
 received prior to the content body.)
 
+Content data in the request/response is handled as "raw bytes".  Any
+encoding/decoding (with associated headers) are the responsibility of the
+caller.
+
 The C<request> method returns a hashref containing the response.  The hashref
 will have the following keys:
 
@@ -2043,11 +2074,11 @@ proxy
 timeout
 verify_SSL
 
-=head1 SSL SUPPORT
+=head1 TLS/SSL SUPPORT
 
 Direct C<https> connections are supported only if L<IO::Socket::SSL> 1.56 or
 greater and L<Net::SSLeay> 1.49 or greater are installed. An error will occur
-if new enough versions of these modules are not installed or if the SSL
+if new enough versions of these modules are not installed or if the TLS
 encryption fails. You can also use C<HTTP::Tiny::can_ssl()> utility function
 that returns boolean to see if the required modules are installed.
 
@@ -2055,7 +2086,7 @@ An C<https> connection may be made via an C<http> proxy that supports the CONNEC
 command (i.e. RFC 2817).  You may not proxy C<https> via a proxy that itself
 requires C<https> to communicate.
 
-SSL provides two distinct capabilities:
+TLS/SSL provides two distinct capabilities:
 
 =over 4
 
@@ -2069,24 +2100,17 @@ Verification of server identity
 
 =back
 
-B<By default, HTTP::Tiny does not verify server identity>.
+B<By default, HTTP::Tiny verifies server identity>.
 
-Server identity verification is controversial and potentially tricky because it
-depends on a (usually paid) third-party Certificate Authority (CA) trust model
-to validate a certificate as legitimate.  This discriminates against servers
-with self-signed certificates or certificates signed by free, community-driven
-CA's such as L<CAcert.org|http://cacert.org>.
+This was changed in version 0.083 due to security concerns. The previous default
+behavior can be enabled by setting C<$ENV{PERL_HTTP_TINY_SSL_INSECURE_BY_DEFAULT}>
+to 1.
 
-By default, HTTP::Tiny does not make any assumptions about your trust model,
-threat level or risk tolerance.  It just aims to give you an encrypted channel
-when you need one.
-
-Setting the C<verify_SSL> attribute to a true value will make HTTP::Tiny verify
-that an SSL connection has a valid SSL certificate corresponding to the host
-name of the connection and that the SSL certificate has been verified by a CA.
-Assuming you trust the CA, this will protect against a L<man-in-the-middle
-attack|http://en.wikipedia.org/wiki/Man-in-the-middle_attack>.  If you are
-concerned about security, you should enable this option.
+Verification is done by checking that that the TLS/SSL connection has a valid
+certificate corresponding to the host name of the connection and that the
+certificate has been verified by a CA. Assuming you trust the CA, this will
+protect against L<machine-in-the-middle
+attacks|http://en.wikipedia.org/wiki/Machine-in-the-middle_attack>.
 
 Certificate verification requires a file containing trusted CA certificates.
 
@@ -2094,9 +2118,7 @@ If the environment variable C<SSL_CERT_FILE> is present, HTTP::Tiny
 will try to find a CA certificate file in that location.
 
 If the L<Mozilla::CA> module is installed, HTTP::Tiny will use the CA file
-included with it as a source of trusted CA's.  (This means you trust Mozilla,
-the author of Mozilla::CA, the CPAN mirror where you got Mozilla::CA, the
-toolchain used to install it, and your operating system security, right?)
+included with it as a source of trusted CA's.
 
 If that module is not available, then HTTP::Tiny will search several
 system-specific default locations for a CA certificate file:
@@ -2115,13 +2137,33 @@ system-specific default locations for a CA certificate file:
 
 /etc/ssl/ca-bundle.pem
 
+=item *
+
+/etc/openssl/certs/ca-certificates.crt
+
+=item *
+
+/etc/ssl/cert.pem
+
+=item *
+
+/usr/local/share/certs/ca-root-nss.crt
+
+=item *
+
+/etc/pki/tls/cacert.pem
+
+=item *
+
+/etc/certs/ca-certificates.crt
+
 =back
 
 An error will be occur if C<verify_SSL> is true and no CA certificate file
 is available.
 
-If you desire complete control over SSL connections, the C<SSL_options> attribute
-lets you provide a hash reference that will be passed through to
+If you desire complete control over TLS/SSL connections, the C<SSL_options>
+attribute lets you provide a hash reference that will be passed through to
 C<IO::Socket::SSL::start_SSL()>, overriding any options set by HTTP::Tiny. For
 example, to provide your own trusted CA file:
 
@@ -2131,7 +2173,7 @@ example, to provide your own trusted CA file:
 
 The C<SSL_options> attribute could also be used for such things as providing a
 client certificate for authentication to a server or controlling the choice of
-cipher used for the SSL connection. See L<IO::Socket::SSL> documentation for
+cipher used for the TLS/SSL connection. See L<IO::Socket::SSL> documentation for
 details.
 
 =head1 PROXY SUPPORT
@@ -2337,7 +2379,7 @@ David Golden <dagolden@cpan.org>
 
 =head1 CONTRIBUTORS
 
-=for stopwords Alan Gardner Alessandro Ghedini A. Sinan Unur Brad Gilbert brian m. carlson Chris Nehren Weyl Claes Jakobsson Clinton Gormley Craig Berry David Golden Mitchell Dean Pearce Edward Zborowski Felipe Gasper Greg Kennedy James E Keenan Raspass Jeremy Mates Jess Robinson Karen Etheridge Lukas Eklund Martin J. Evans Martin-Louis Bright Matthew Horsfall Michael R. Davis Mike Doherty Nicolas Rochelemagne Olaf Alders Olivier Mengué Petr Písař sanjay-cpu Serguei Trouchelle Shoichi Kaji SkyMarshal Sören Kornetzki Steve Grazzini Syohei YOSHIDA Tatsuhiko Miyagawa Tom Hukins Tony Cook Xavier Guimard
+=for stopwords Alan Gardner Alessandro Ghedini A. Sinan Unur Brad Gilbert brian m. carlson Chris Nehren Weyl Claes Jakobsson Clinton Gormley Craig Berry David Golden Mitchell Dean Pearce Edward Zborowski Felipe Gasper Graham Knop Greg Kennedy James E Keenan Raspass Jeremy Mates Jess Robinson Karen Etheridge Lukas Eklund Martin J. Evans Martin-Louis Bright Matthew Horsfall Michael R. Davis Mike Doherty Nicolas Rochelemagne Olaf Alders Olivier Mengué Petr Písař sanjay-cpu Serguei Trouchelle Shoichi Kaji SkyMarshal Sören Kornetzki Steve Grazzini Stig Palmquist Syohei YOSHIDA Tatsuhiko Miyagawa Tom Hukins Tony Cook Xavier Guimard
 
 =over 4
 
@@ -2407,6 +2449,10 @@ Felipe Gasper <felipe@felipegasper.com>
 
 =item *
 
+Graham Knop <haarg@haarg.org>
+
+=item *
+
 Greg Kennedy <kennedy.greg@gmail.com>
 
 =item *
@@ -2495,6 +2541,10 @@ Steve Grazzini <steve.grazzini@grantstreet.com>
 
 =item *
 
+Stig Palmquist <git@stig.io>
+
+=item *
+
 Syohei YOSHIDA <syohex@gmail.com>
 
 =item *
@@ -2517,7 +2567,7 @@ Xavier Guimard <yadd@debian.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2021 by Christian Hansen.
+This software is copyright (c) 2023 by Christian Hansen.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
index 8e9acfe..96e9ad8 100644 (file)
@@ -3,8 +3,8 @@
 use strict ;
 require 5.006 ;
 
-$::VERSION = '2.106' ;
-$::DEP_VERSION = '2.103';
+$::VERSION = '2.204' ;
+$::DEP_VERSION = '2.204';
 
 use lib '.';
 use private::MakeUtil;
@@ -29,6 +29,7 @@ WriteMakefile(
                                    'Compress::Raw::Zlib'  => $::DEP_VERSION,
                                    'Scalar::Util'  => 0,
                             'Encode'        => 0,
+                            'Time::Local'   => 0,
                                    $] >= 5.005 && $] < 5.006
                                 ? ('File::BSDGlob' => 0)
                                 : () }
index 37aa051..68a5a51 100644 (file)
@@ -7,17 +7,17 @@ use Carp ;
 use IO::Handle ;
 use Scalar::Util qw(dualvar);
 
-use IO::Compress::Base::Common 2.106 ;
-use Compress::Raw::Zlib 2.103 ;
-use IO::Compress::Gzip 2.106 ;
-use IO::Uncompress::Gunzip 2.106 ;
+use IO::Compress::Base::Common 2.204 ;
+use Compress::Raw::Zlib 2.204 ;
+use IO::Compress::Gzip 2.204 ;
+use IO::Uncompress::Gunzip 2.204 ;
 
 use strict ;
 use warnings ;
 use bytes ;
 our ($VERSION, $XS_VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS);
 
-$VERSION = '2.106';
+$VERSION = '2.204';
 $XS_VERSION = $VERSION;
 $VERSION = eval $VERSION;
 
@@ -461,7 +461,7 @@ sub inflate
 
 package Compress::Zlib ;
 
-use IO::Compress::Gzip::Constants 2.106 ;
+use IO::Compress::Gzip::Constants 2.204 ;
 
 sub memGzip($)
 {
@@ -1494,6 +1494,9 @@ C<gzip@prep.ai.mit.edu> and Mark Adler C<madler@alumni.caltech.edu>.
 The primary site for the I<zlib> compression library is
 L<http://www.zlib.org>.
 
+The primary site for the I<zlib-ng> compression library is
+L<https://github.com/zlib-ng/zlib-ng>.
+
 The primary site for gzip is L<http://www.gzip.org>.
 
 =head1 AUTHOR
@@ -1506,7 +1509,7 @@ See the Changes file.
 
 =head1 COPYRIGHT AND LICENSE
 
-Copyright (c) 1995-2022 Paul Marquess. All rights reserved.
+Copyright (c) 1995-2023 Paul Marquess. All rights reserved.
 
 This program is free software; you can redistribute it and/or
 modify it under the same terms as Perl itself.
index cc1700a..e197551 100644 (file)
@@ -4,12 +4,12 @@ use strict;
 use warnings;
 use bytes;
 
-use IO::Compress::Base::Common  2.106 qw(:Status);
+use IO::Compress::Base::Common  2.204 qw(:Status);
 
-use Compress::Raw::Bzip2  2.103 ;
+use Compress::Raw::Bzip2  2.204 ;
 
 our ($VERSION);
-$VERSION = '2.106';
+$VERSION = '2.204';
 
 sub mkCompObject
 {
index 12f97cc..54696ff 100644 (file)
@@ -4,13 +4,13 @@ use strict;
 use warnings;
 use bytes;
 
-use IO::Compress::Base::Common 2.106 qw(:Status);
-use Compress::Raw::Zlib  2.103 qw( !crc32 !adler32 ) ;
+use IO::Compress::Base::Common 2.204 qw(:Status);
+use Compress::Raw::Zlib  2.204 qw( !crc32 !adler32 ) ;
 
 require Exporter;
 our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, @EXPORT, %DEFLATE_CONSTANTS);
 
-$VERSION = '2.106';
+$VERSION = '2.204';
 @ISA = qw(Exporter);
 @EXPORT_OK = @Compress::Raw::Zlib::DEFLATE_CONSTANTS;
 %EXPORT_TAGS = %Compress::Raw::Zlib::DEFLATE_CONSTANTS;
@@ -40,6 +40,29 @@ sub mkCompObject
                  } ;
 }
 
+sub mkCompObject1
+{
+    my $crc32    = shift ;
+    my $adler32  = shift ;
+    my $level    = shift ;
+    my $strategy = shift ;
+
+    my ($def, $status) = Compress::Raw::Zlib::Deflate->new(
+                                -AppendOutput   => 1,
+                                -CRC32          => $crc32,
+                                -ADLER32        => $adler32,
+                                -Level          => $level,
+                                -Strategy       => $strategy,
+                                -WindowBits     => MAX_WBITS);
+
+    return (undef, "Cannot create Deflate object: $status", $status)
+        if $status != Z_OK;
+
+    return bless {'Def'        => $def,
+                  'Error'      => '',
+                 } ;
+}
+
 sub compr
 {
     my $self = shift ;
index a21962e..5938d13 100644 (file)
@@ -4,10 +4,10 @@ use strict;
 use warnings;
 use bytes;
 
-use IO::Compress::Base::Common  2.106 qw(:Status);
+use IO::Compress::Base::Common  2.204 qw(:Status);
 our ($VERSION);
 
-$VERSION = '2.106';
+$VERSION = '2.204';
 
 sub mkCompObject
 {
index fdb169d..37a0df9 100644 (file)
@@ -6,7 +6,7 @@ require 5.006 ;
 use strict ;
 use warnings;
 
-use IO::Compress::Base::Common 2.106 ;
+use IO::Compress::Base::Common 2.204 ;
 
 use IO::File (); ;
 use Scalar::Util ();
@@ -20,7 +20,7 @@ use Symbol();
 our (@ISA, $VERSION);
 @ISA    = qw(IO::File Exporter);
 
-$VERSION = '2.106';
+$VERSION = '2.204';
 
 #Can't locate object method "SWASHNEW" via package "utf8" (perhaps you forgot to load "utf8"?) at .../ext/Compress-Zlib/Gzip/blib/lib/Compress/Zlib/Common.pm line 16.
 
@@ -1051,7 +1051,7 @@ See the Changes file.
 
 =head1 COPYRIGHT AND LICENSE
 
-Copyright (c) 2005-2022 Paul Marquess. All rights reserved.
+Copyright (c) 2005-2023 Paul Marquess. All rights reserved.
 
 This program is free software; you can redistribute it and/or
 modify it under the same terms as Perl itself.
index 39ac016..32c4aa3 100644 (file)
@@ -11,7 +11,7 @@ use File::GlobMapper;
 require Exporter;
 our ($VERSION, @ISA, @EXPORT, %EXPORT_TAGS, $HAS_ENCODE);
 @ISA = qw(Exporter);
-$VERSION = '2.106';
+$VERSION = '2.204';
 
 @EXPORT = qw( isaFilehandle isaFilename isaScalar
               whatIsInput whatIsOutput
index faf043b..6aa0ddd 100644 (file)
@@ -5,16 +5,16 @@ use warnings;
 use bytes;
 require Exporter ;
 
-use IO::Compress::Base 2.106 ;
+use IO::Compress::Base 2.204 ;
 
-use IO::Compress::Base::Common  2.106 qw();
-use IO::Compress::Adapter::Bzip2 2.106 ;
+use IO::Compress::Base::Common  2.204 qw();
+use IO::Compress::Adapter::Bzip2 2.204 ;
 
 
 
 our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, $Bzip2Error);
 
-$VERSION = '2.106';
+$VERSION = '2.204';
 $Bzip2Error = '';
 
 @ISA    = qw(IO::Compress::Base Exporter);
@@ -51,7 +51,7 @@ sub getExtraParams
 {
     my $self = shift ;
 
-    use IO::Compress::Base::Common  2.106 qw(:Parse);
+    use IO::Compress::Base::Common  2.204 qw(:Parse);
 
     return (
             'blocksize100k' => [IO::Compress::Base::Common::Parse_unsigned,  1],
@@ -818,7 +818,7 @@ See the Changes file.
 
 =head1 COPYRIGHT AND LICENSE
 
-Copyright (c) 2005-2022 Paul Marquess. All rights reserved.
+Copyright (c) 2005-2023 Paul Marquess. All rights reserved.
 
 This program is free software; you can redistribute it and/or
 modify it under the same terms as Perl itself.
index 0998952..a34a6ba 100644 (file)
@@ -8,16 +8,16 @@ use bytes;
 
 require Exporter ;
 
-use IO::Compress::RawDeflate 2.106 ();
-use IO::Compress::Adapter::Deflate 2.106 ;
+use IO::Compress::RawDeflate 2.204 ();
+use IO::Compress::Adapter::Deflate 2.204 ;
 
-use IO::Compress::Zlib::Constants 2.106 ;
-use IO::Compress::Base::Common  2.106 qw();
+use IO::Compress::Zlib::Constants 2.204 ;
+use IO::Compress::Base::Common  2.204 qw();
 
 
 our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, %DEFLATE_CONSTANTS, $DeflateError);
 
-$VERSION = '2.106';
+$VERSION = '2.204';
 $DeflateError = '';
 
 @ISA    = qw(IO::Compress::RawDeflate Exporter);
@@ -42,92 +42,35 @@ sub deflate
     return $obj->_def(@_);
 }
 
-
-sub bitmask($$$$)
-{
-    my $into  = shift ;
-    my $value  = shift ;
-    my $offset = shift ;
-    my $mask   = shift ;
-
-    return $into | (($value & $mask) << $offset ) ;
-}
-
-sub mkDeflateHdr($$$;$)
-{
-    my $method = shift ;
-    my $cinfo  = shift;
-    my $level  = shift;
-    my $fdict_adler = shift  ;
-
-    my $cmf = 0;
-    my $flg = 0;
-    my $fdict = 0;
-    $fdict = 1 if defined $fdict_adler;
-
-    $cmf = bitmask($cmf, $method, ZLIB_CMF_CM_OFFSET,    ZLIB_CMF_CM_BITS);
-    $cmf = bitmask($cmf, $cinfo,  ZLIB_CMF_CINFO_OFFSET, ZLIB_CMF_CINFO_BITS);
-
-    $flg = bitmask($flg, $fdict,  ZLIB_FLG_FDICT_OFFSET, ZLIB_FLG_FDICT_BITS);
-    $flg = bitmask($flg, $level,  ZLIB_FLG_LEVEL_OFFSET, ZLIB_FLG_LEVEL_BITS);
-
-    my $fcheck = 31 - ($cmf * 256 + $flg) % 31 ;
-    $flg = bitmask($flg, $fcheck, ZLIB_FLG_FCHECK_OFFSET, ZLIB_FLG_FCHECK_BITS);
-
-    my $hdr =  pack("CC", $cmf, $flg) ;
-    $hdr .= pack("N", $fdict_adler) if $fdict ;
-
-    return $hdr;
-}
-
-sub mkHeader
+sub mkComp
 {
     my $self = shift ;
-    my $param = shift ;
+    my $got = shift ;
 
-    my $level = $param->getValue('level');
-    my $strategy = $param->getValue('strategy');
+    my ($obj, $errstr, $errno) = IO::Compress::Adapter::Deflate::mkCompObject1(
+                                                 $got->getValue('crc32'),
+                                                 $got->getValue('adler32'),
+                                                 $got->getValue('level'),
+                                                 $got->getValue('strategy')
+                                                 );
 
-    my $lflag ;
-    $level = 6
-        if $level == Z_DEFAULT_COMPRESSION ;
+   return $self->saveErrorString(undef, $errstr, $errno)
+       if ! defined $obj;
 
-    if (ZLIB_VERNUM >= 0x1210)
-    {
-        if ($strategy >= Z_HUFFMAN_ONLY || $level < 2)
-         {  $lflag = ZLIB_FLG_LEVEL_FASTEST }
-        elsif ($level < 6)
-         {  $lflag = ZLIB_FLG_LEVEL_FAST }
-        elsif ($level == 6)
-         {  $lflag = ZLIB_FLG_LEVEL_DEFAULT }
-        else
-         {  $lflag = ZLIB_FLG_LEVEL_SLOWEST }
-    }
-    else
-    {
-        $lflag = ($level - 1) >> 1 ;
-        $lflag = 3 if $lflag > 3 ;
-    }
-
-     #my $wbits = (MAX_WBITS - 8) << 4 ;
-    my $wbits = 7;
-    mkDeflateHdr(ZLIB_CMF_CM_DEFLATED, $wbits, $lflag);
+   return $obj;
 }
 
-sub ckParams
+
+sub mkHeader
 {
     my $self = shift ;
-    my $got = shift;
-
-    $got->setValue('adler32' => 1);
-    return 1 ;
+    return '';
 }
 
-
 sub mkTrailer
 {
     my $self = shift ;
-    return pack("N", *$self->{Compress}->adler32()) ;
+    return '';
 }
 
 sub mkFinalTrailer
@@ -135,12 +78,6 @@ sub mkFinalTrailer
     return '';
 }
 
-#sub newHeader
-#{
-#    my $self = shift ;
-#    return *$self->{Header};
-#}
-
 sub getExtraParams
 {
     my $self = shift ;
@@ -940,6 +877,9 @@ C<gzip@prep.ai.mit.edu> and Mark Adler C<madler@alumni.caltech.edu>.
 The primary site for the I<zlib> compression library is
 L<http://www.zlib.org>.
 
+The primary site for the I<zlib-ng> compression library is
+L<https://github.com/zlib-ng/zlib-ng>.
+
 The primary site for gzip is L<http://www.gzip.org>.
 
 =head1 AUTHOR
@@ -952,7 +892,7 @@ See the Changes file.
 
 =head1 COPYRIGHT AND LICENSE
 
-Copyright (c) 2005-2022 Paul Marquess. All rights reserved.
+Copyright (c) 2005-2023 Paul Marquess. All rights reserved.
 
 This program is free software; you can redistribute it and/or
 modify it under the same terms as Perl itself.
index 466488b..549ea2a 100644 (file)
@@ -682,7 +682,7 @@ See the Changes file.
 
 =head1 COPYRIGHT AND LICENSE
 
-Copyright (c) 2005-2022 Paul Marquess. All rights reserved.
+Copyright (c) 2005-2023 Paul Marquess. All rights reserved.
 
 This program is free software; you can redistribute it and/or
 modify it under the same terms as Perl itself.
index 0471e33..6b142d4 100644 (file)
@@ -8,12 +8,12 @@ use bytes;
 
 require Exporter ;
 
-use IO::Compress::RawDeflate 2.106 () ;
-use IO::Compress::Adapter::Deflate 2.106 ;
+use IO::Compress::RawDeflate 2.204 () ;
+use IO::Compress::Adapter::Deflate 2.204 ;
 
-use IO::Compress::Base::Common  2.106 qw(:Status );
-use IO::Compress::Gzip::Constants 2.106 ;
-use IO::Compress::Zlib::Extra 2.106 ;
+use IO::Compress::Base::Common  2.204 qw(:Status );
+use IO::Compress::Gzip::Constants 2.204 ;
+use IO::Compress::Zlib::Extra 2.204 ;
 
 BEGIN
 {
@@ -25,7 +25,7 @@ BEGIN
 
 our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, %DEFLATE_CONSTANTS, $GzipError);
 
-$VERSION = '2.106';
+$VERSION = '2.204';
 $GzipError = '' ;
 
 @ISA    = qw(IO::Compress::RawDeflate Exporter);
@@ -1252,6 +1252,9 @@ C<gzip@prep.ai.mit.edu> and Mark Adler C<madler@alumni.caltech.edu>.
 The primary site for the I<zlib> compression library is
 L<http://www.zlib.org>.
 
+The primary site for the I<zlib-ng> compression library is
+L<https://github.com/zlib-ng/zlib-ng>.
+
 The primary site for gzip is L<http://www.gzip.org>.
 
 =head1 AUTHOR
@@ -1264,7 +1267,7 @@ See the Changes file.
 
 =head1 COPYRIGHT AND LICENSE
 
-Copyright (c) 2005-2022 Paul Marquess. All rights reserved.
+Copyright (c) 2005-2023 Paul Marquess. All rights reserved.
 
 This program is free software; you can redistribute it and/or
 modify it under the same terms as Perl itself.
index 8e32e17..f56612d 100644 (file)
@@ -9,7 +9,7 @@ require Exporter;
 our ($VERSION, @ISA, @EXPORT, %GZIP_OS_Names);
 our ($GZIP_FNAME_INVALID_CHAR_RE, $GZIP_FCOMMENT_INVALID_CHAR_RE);
 
-$VERSION = '2.106';
+$VERSION = '2.204';
 
 @ISA = qw(Exporter);
 
index de0f332..75ee62b 100644 (file)
@@ -6,16 +6,16 @@ use strict ;
 use warnings;
 use bytes;
 
-use IO::Compress::Base 2.106 ;
-use IO::Compress::Base::Common  2.106 qw(:Status :Parse);
-use IO::Compress::Adapter::Deflate 2.106 ;
-use Compress::Raw::Zlib  2.103 qw(Z_DEFLATED Z_DEFAULT_COMPRESSION Z_DEFAULT_STRATEGY);
+use IO::Compress::Base 2.204 ;
+use IO::Compress::Base::Common  2.204 qw(:Status :Parse);
+use IO::Compress::Adapter::Deflate 2.204 ;
+use Compress::Raw::Zlib  2.204 qw(Z_DEFLATED Z_DEFAULT_COMPRESSION Z_DEFAULT_STRATEGY);
 
 require Exporter ;
 
 our ($VERSION, @ISA, @EXPORT_OK, %DEFLATE_CONSTANTS, %EXPORT_TAGS, $RawDeflateError);
 
-$VERSION = '2.106';
+$VERSION = '2.204';
 $RawDeflateError = '';
 
 @ISA = qw(IO::Compress::Base Exporter);
@@ -995,6 +995,9 @@ C<gzip@prep.ai.mit.edu> and Mark Adler C<madler@alumni.caltech.edu>.
 The primary site for the I<zlib> compression library is
 L<http://www.zlib.org>.
 
+The primary site for the I<zlib-ng> compression library is
+L<https://github.com/zlib-ng/zlib-ng>.
+
 The primary site for gzip is L<http://www.gzip.org>.
 
 =head1 AUTHOR
@@ -1007,7 +1010,7 @@ See the Changes file.
 
 =head1 COPYRIGHT AND LICENSE
 
-Copyright (c) 2005-2022 Paul Marquess. All rights reserved.
+Copyright (c) 2005-2023 Paul Marquess. All rights reserved.
 
 This program is free software; you can redistribute it and/or
 modify it under the same terms as Perl itself.
index ecba767..856ae7b 100644 (file)
@@ -4,41 +4,41 @@ use strict ;
 use warnings;
 use bytes;
 
-use IO::Compress::Base::Common  2.106 qw(:Status );
-use IO::Compress::RawDeflate 2.106 ();
-use IO::Compress::Adapter::Deflate 2.106 ;
-use IO::Compress::Adapter::Identity 2.106 ;
-use IO::Compress::Zlib::Extra 2.106 ;
-use IO::Compress::Zip::Constants 2.106 ;
+use IO::Compress::Base::Common  2.204 qw(:Status );
+use IO::Compress::RawDeflate 2.204 ();
+use IO::Compress::Adapter::Deflate 2.204 ;
+use IO::Compress::Adapter::Identity 2.204 ;
+use IO::Compress::Zlib::Extra 2.204 ;
+use IO::Compress::Zip::Constants 2.204 ;
 
 use File::Spec();
 use Config;
 
-use Compress::Raw::Zlib  2.103 ();
+use Compress::Raw::Zlib  2.204 ();
 
 BEGIN
 {
     eval { require IO::Compress::Adapter::Bzip2 ;
-           IO::Compress::Adapter::Bzip2->import( 2.103 );
+           IO::Compress::Adapter::Bzip2->import( 2.201 );
            require IO::Compress::Bzip2 ;
-           IO::Compress::Bzip2->import( 2.103 );
+           IO::Compress::Bzip2->import( 2.201 );
          } ;
 
     eval { require IO::Compress::Adapter::Lzma ;
-           IO::Compress::Adapter::Lzma->import( 2.103 );
+           IO::Compress::Adapter::Lzma->import( 2.201 );
            require IO::Compress::Lzma ;
-           IO::Compress::Lzma->import( 2.103 );
+           IO::Compress::Lzma->import( 2.201 );
          } ;
 
     eval { require IO::Compress::Adapter::Xz ;
-           IO::Compress::Adapter::Xz->import( 2.103 );
+           IO::Compress::Adapter::Xz->import( 2.201 );
            require IO::Compress::Xz ;
-           IO::Compress::Xz->import( 2.103 );
+           IO::Compress::Xz->import( 2.201 );
          } ;
     eval { require IO::Compress::Adapter::Zstd ;
-           IO::Compress::Adapter::Zstd->import( 2.103 );
+           IO::Compress::Adapter::Zstd->import( 2.201 );
            require IO::Compress::Zstd ;
-           IO::Compress::Zstd->import( 2.103 );
+           IO::Compress::Zstd->import( 2.201 );
          } ;
 }
 
@@ -47,7 +47,7 @@ require Exporter ;
 
 our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, %DEFLATE_CONSTANTS, $ZipError);
 
-$VERSION = '2.106';
+$VERSION = '2.204';
 $ZipError = '';
 
 @ISA = qw(IO::Compress::RawDeflate Exporter);
@@ -85,20 +85,24 @@ sub isMethodAvailable
         if $method == ZIP_CM_STORE || $method == ZIP_CM_DEFLATE ;
 
     return 1
-        if $method == ZIP_CM_BZIP2 and
-           defined $IO::Compress::Adapter::Bzip2::VERSION;
+        if $method == ZIP_CM_BZIP2 &&
+           defined $IO::Compress::Adapter::Bzip2::VERSION &&
+           defined &{ "IO::Compress::Adapter::Bzip2::mkRawZipCompObject" };
 
     return 1
-        if $method == ZIP_CM_LZMA and
-           defined $IO::Compress::Adapter::Lzma::VERSION;
+        if $method == ZIP_CM_LZMA &&
+           defined $IO::Compress::Adapter::Lzma::VERSION &&
+           defined &{ "IO::Compress::Adapter::Lzma::mkRawZipCompObject" };
 
     return 1
-        if $method == ZIP_CM_XZ and
-           defined $IO::Compress::Adapter::Xz::VERSION;
+        if $method == ZIP_CM_XZ &&
+           defined $IO::Compress::Adapter::Xz::VERSION &&
+           defined &{ "IO::Compress::Adapter::Xz::mkRawZipCompObject" };
 
     return 1
-        if $method == ZIP_CM_ZSTD and
-           defined $IO::Compress::Adapter::ZSTD::VERSION;
+        if $method == ZIP_CM_ZSTD &&
+           defined $IO::Compress::Adapter::ZSTD::VERSION &&
+           defined &{ "IO::Compress::Adapter::ZSTD::mkRawZipCompObject" };
 
     return 0;
 }
@@ -566,6 +570,8 @@ sub mkFinalTrailer
         $z64e .= U64::pack_V64 $entries   ; # entries in central dir
         $z64e .= U64::pack_V64 $cd_len    ; # size of central dir
         $z64e .= *$self->{ZipData}{Offset}->getPacked_V64() ; # offset to start central dir
+        $z64e .= *$self->{ZipData}{extrafieldzip64}  # otional extra field
+            if defined *$self->{ZipData}{extrafieldzip64} ;
 
         $z64e  = pack("V", ZIP64_END_CENTRAL_REC_HDR_SIG) # signature
               .  U64::pack_V64(length $z64e)
@@ -638,7 +644,7 @@ sub ckParams
     }
 
     *$self->{ZipData}{AnyZip64} = 1
-        if $got->getValue('zip64');
+        if $got->getValue('zip64') || $got->getValue('extrafieldzip64') ;
     *$self->{ZipData}{Zip64} = $got->getValue('zip64');
     *$self->{ZipData}{Stream} = $got->getValue('stream');
 
@@ -658,7 +664,7 @@ sub ckParams
 
     *$self->{ZipData}{ZipComment} = $got->getValue('zipcomment') ;
 
-    for my $name (qw( extrafieldlocal extrafieldcentral ))
+    for my $name (qw( extrafieldlocal extrafieldcentral extrafieldzip64))
     {
         my $data = $got->getValue($name) ;
         if (defined $data) {
@@ -667,6 +673,7 @@ sub ckParams
                 if $bad ;
 
             $got->setValue($name, $data) ;
+            *$self->{ZipData}{$name} = $data;
         }
     }
 
@@ -731,6 +738,7 @@ our %PARAMS = (
             'textflag'  => [IO::Compress::Base::Common::Parse_boolean,   0],
             'extrafieldlocal'  => [IO::Compress::Base::Common::Parse_any,    undef],
             'extrafieldcentral'=> [IO::Compress::Base::Common::Parse_any,    undef],
+            'extrafieldzip64'  => [IO::Compress::Base::Common::Parse_any,    undef],
 
             # Lzma
             'preset'   => [IO::Compress::Base::Common::Parse_unsigned, 6],
@@ -1053,12 +1061,24 @@ See L<File::GlobMapper|File::GlobMapper> for more details.
 If the C<$input_filename_or_reference> parameter is any other type,
 C<undef> will be returned.
 
-In addition, if C<$input_filename_or_reference> is a simple filename,
-the default values for
-the C<Name>, C<Time>, C<TextFlag>, C<ExtAttr>, C<exUnixN> and C<exTime> options will be sourced from that file.
+In addition, if C<$input_filename_or_reference> corresponds to a filename
+from the filesystem, a number of zip file header fields will be populated by default
+using the following attributes from the input file
+
+=over 5
+
+=item * the full filename contained in C<$input_filename_or_reference>
+
+=item * the file protection attributes
+
+=item * the UID/GID for the file
+
+=item * the file timestamps
+
+=back
 
 If you do not want to use these defaults they can be overridden by
-explicitly setting the C<Name>, C<Time>, C<TextFlag>, C<ExtAttr>, C<exUnixN> and C<exTime> options or by setting the
+explicitly setting one, or more, of the C<Name>, C<Time>, C<TextFlag>, C<ExtAttr>, C<exUnixN> and C<exTime> options or by setting the
 C<Minimal> parameter.
 
 =head3 The C<$output_filename_or_reference> parameter
@@ -2131,6 +2151,9 @@ C<gzip@prep.ai.mit.edu> and Mark Adler C<madler@alumni.caltech.edu>.
 The primary site for the I<zlib> compression library is
 L<http://www.zlib.org>.
 
+The primary site for the I<zlib-ng> compression library is
+L<https://github.com/zlib-ng/zlib-ng>.
+
 The primary site for gzip is L<http://www.gzip.org>.
 
 =head1 AUTHOR
@@ -2143,7 +2166,7 @@ See the Changes file.
 
 =head1 COPYRIGHT AND LICENSE
 
-Copyright (c) 2005-2022 Paul Marquess. All rights reserved.
+Copyright (c) 2005-2023 Paul Marquess. All rights reserved.
 
 This program is free software; you can redistribute it and/or
 modify it under the same terms as Perl itself.
index 7cfe431..b6e0d35 100644 (file)
@@ -7,7 +7,7 @@ require Exporter;
 
 our ($VERSION, @ISA, @EXPORT, %ZIP_CM_MIN_VERSIONS);
 
-$VERSION = '2.106';
+$VERSION = '2.204';
 
 @ISA = qw(Exporter);
 
index 1d1dab5..b0eb4cf 100644 (file)
@@ -9,7 +9,7 @@ require Exporter;
 
 our ($VERSION, @ISA, @EXPORT);
 
-$VERSION = '2.106';
+$VERSION = '2.204';
 
 @ISA = qw(Exporter);
 
index 24204fa..9767fe1 100644 (file)
@@ -8,9 +8,9 @@ use bytes;
 
 our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS);
 
-$VERSION = '2.106';
+$VERSION = '2.204';
 
-use IO::Compress::Gzip::Constants 2.106 ;
+use IO::Compress::Gzip::Constants 2.204 ;
 
 sub ExtraFieldError
 {
index 0d0707b..229f8fa 100644 (file)
@@ -4,12 +4,12 @@ use strict;
 use warnings;
 use bytes;
 
-use IO::Compress::Base::Common 2.106 qw(:Status);
+use IO::Compress::Base::Common 2.204 qw(:Status);
 
-use Compress::Raw::Bzip2 2.103 ;
+use Compress::Raw::Bzip2 2.204 ;
 
 our ($VERSION, @ISA);
-$VERSION = '2.106';
+$VERSION = '2.204';
 
 sub mkUncompObject
 {
index dd12483..bf64a79 100644 (file)
@@ -4,14 +4,14 @@ use warnings;
 use strict;
 use bytes;
 
-use IO::Compress::Base::Common  2.106 qw(:Status);
+use IO::Compress::Base::Common  2.204 qw(:Status);
 use IO::Compress::Zip::Constants ;
 
 our ($VERSION);
 
-$VERSION = '2.106';
+$VERSION = '2.204';
 
-use Compress::Raw::Zlib  2.103 ();
+use Compress::Raw::Zlib  2.204 ();
 
 sub mkUncompObject
 {
index 05f6de2..7469c36 100644 (file)
@@ -4,11 +4,11 @@ use strict;
 use warnings;
 use bytes;
 
-use IO::Compress::Base::Common  2.106 qw(:Status);
-use Compress::Raw::Zlib  2.103 qw(Z_OK Z_BUF_ERROR Z_STREAM_END Z_FINISH MAX_WBITS);
+use IO::Compress::Base::Common  2.204 qw(:Status);
+use Compress::Raw::Zlib  2.204 qw(Z_OK Z_BUF_ERROR Z_STREAM_END Z_FINISH MAX_WBITS);
 
 our ($VERSION);
-$VERSION = '2.106';
+$VERSION = '2.204';
 
 
 
index 4d99439..5c54295 100644 (file)
@@ -6,22 +6,22 @@ use strict;
 use warnings;
 use bytes;
 
-use IO::Compress::Base::Common  2.106 qw(:Parse);
+use IO::Compress::Base::Common  2.204 qw(:Parse);
 
-use IO::Uncompress::Adapter::Inflate  2.106 ();
+use IO::Uncompress::Adapter::Inflate  2.204 ();
 
 
-use IO::Uncompress::Base  2.106 ;
-use IO::Uncompress::Gunzip  2.106 ;
-use IO::Uncompress::Inflate  2.106 ;
-use IO::Uncompress::RawInflate  2.106 ;
-use IO::Uncompress::Unzip  2.106 ;
+use IO::Uncompress::Base  2.204 ;
+use IO::Uncompress::Gunzip  2.204 ;
+use IO::Uncompress::Inflate  2.204 ;
+use IO::Uncompress::RawInflate  2.204 ;
+use IO::Uncompress::Unzip  2.204 ;
 
 require Exporter ;
 
 our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, $AnyInflateError);
 
-$VERSION = '2.106';
+$VERSION = '2.204';
 $AnyInflateError = '';
 
 @ISA = qw(IO::Uncompress::Base Exporter);
@@ -986,6 +986,9 @@ C<gzip@prep.ai.mit.edu> and Mark Adler C<madler@alumni.caltech.edu>.
 The primary site for the I<zlib> compression library is
 L<http://www.zlib.org>.
 
+The primary site for the I<zlib-ng> compression library is
+L<https://github.com/zlib-ng/zlib-ng>.
+
 The primary site for gzip is L<http://www.gzip.org>.
 
 =head1 AUTHOR
@@ -998,7 +1001,7 @@ See the Changes file.
 
 =head1 COPYRIGHT AND LICENSE
 
-Copyright (c) 2005-2022 Paul Marquess. All rights reserved.
+Copyright (c) 2005-2023 Paul Marquess. All rights reserved.
 
 This program is free software; you can redistribute it and/or
 modify it under the same terms as Perl itself.
index ed192ca..2e2d83c 100644 (file)
@@ -4,16 +4,16 @@ use strict;
 use warnings;
 use bytes;
 
-use IO::Compress::Base::Common 2.106 ();
+use IO::Compress::Base::Common 2.204 ();
 
-use IO::Uncompress::Base 2.106 ;
+use IO::Uncompress::Base 2.204 ;
 
 
 require Exporter ;
 
 our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, $AnyUncompressError);
 
-$VERSION = '2.106';
+$VERSION = '2.204';
 $AnyUncompressError = '';
 
 @ISA = qw(IO::Uncompress::Base Exporter);
@@ -33,26 +33,26 @@ BEGIN
    # Don't trigger any __DIE__ Hooks.
    local $SIG{__DIE__};
 
-   eval ' use IO::Uncompress::Adapter::Inflate 2.103 ;';
-   eval ' use IO::Uncompress::Adapter::Bunzip2 2.103 ;';
-   eval ' use IO::Uncompress::Adapter::LZO 2.103 ;';
-   eval ' use IO::Uncompress::Adapter::Lzf 2.103 ;';
-   eval ' use IO::Uncompress::Adapter::UnLzma 2.103 ;';
-   eval ' use IO::Uncompress::Adapter::UnXz 2.103 ;';
-   eval ' use IO::Uncompress::Adapter::UnZstd 2.103 ;';
-   eval ' use IO::Uncompress::Adapter::UnLzip 2.103 ;';
-
-   eval ' use IO::Uncompress::Bunzip2 2.103 ;';
-   eval ' use IO::Uncompress::UnLzop 2.103 ;';
-   eval ' use IO::Uncompress::Gunzip 2.103 ;';
-   eval ' use IO::Uncompress::Inflate 2.103 ;';
-   eval ' use IO::Uncompress::RawInflate 2.103 ;';
-   eval ' use IO::Uncompress::Unzip 2.103 ;';
-   eval ' use IO::Uncompress::UnLzf 2.103 ;';
-   eval ' use IO::Uncompress::UnLzma 2.103 ;';
-   eval ' use IO::Uncompress::UnXz 2.103 ;';
-   eval ' use IO::Uncompress::UnZstd 2.103 ;';
-   eval ' use IO::Uncompress::UnLzip 2.103 ;';
+   eval ' use IO::Uncompress::Adapter::Inflate 2.204 ;';
+   eval ' use IO::Uncompress::Adapter::Bunzip2 2.204 ;';
+   eval ' use IO::Uncompress::Adapter::LZO 2.204 ;';
+   eval ' use IO::Uncompress::Adapter::Lzf 2.204 ;';
+   eval ' use IO::Uncompress::Adapter::UnLzma 2.204 ;';
+   eval ' use IO::Uncompress::Adapter::UnXz 2.204 ;';
+   eval ' use IO::Uncompress::Adapter::UnZstd 2.204 ;';
+   eval ' use IO::Uncompress::Adapter::UnLzip 2.204 ;';
+
+   eval ' use IO::Uncompress::Bunzip2 2.204 ;';
+   eval ' use IO::Uncompress::UnLzop 2.204 ;';
+   eval ' use IO::Uncompress::Gunzip 2.204 ;';
+   eval ' use IO::Uncompress::Inflate 2.204 ;';
+   eval ' use IO::Uncompress::RawInflate 2.204 ;';
+   eval ' use IO::Uncompress::Unzip 2.204 ;';
+   eval ' use IO::Uncompress::UnLzf 2.204 ;';
+   eval ' use IO::Uncompress::UnLzma 2.204 ;';
+   eval ' use IO::Uncompress::UnXz 2.204 ;';
+   eval ' use IO::Uncompress::UnZstd 2.204 ;';
+   eval ' use IO::Uncompress::UnLzip 2.204 ;';
 
 }
 
@@ -1077,7 +1077,7 @@ See the Changes file.
 
 =head1 COPYRIGHT AND LICENSE
 
-Copyright (c) 2005-2022 Paul Marquess. All rights reserved.
+Copyright (c) 2005-2023 Paul Marquess. All rights reserved.
 
 This program is free software; you can redistribute it and/or
 modify it under the same terms as Perl itself.
index a922a5b..2ad0a76 100644 (file)
@@ -9,12 +9,12 @@ our (@ISA, $VERSION, @EXPORT_OK, %EXPORT_TAGS);
 @ISA    = qw(IO::File Exporter);
 
 
-$VERSION = '2.106';
+$VERSION = '2.204';
 
 use constant G_EOF => 0 ;
 use constant G_ERR => -1 ;
 
-use IO::Compress::Base::Common 2.106 ;
+use IO::Compress::Base::Common 2.204 ;
 
 use IO::File ;
 use Symbol;
@@ -1567,7 +1567,7 @@ See the Changes file.
 
 =head1 COPYRIGHT AND LICENSE
 
-Copyright (c) 2005-2022 Paul Marquess. All rights reserved.
+Copyright (c) 2005-2023 Paul Marquess. All rights reserved.
 
 This program is free software; you can redistribute it and/or
 modify it under the same terms as Perl itself.
index e72b36f..d234c46 100644 (file)
@@ -4,15 +4,15 @@ use strict ;
 use warnings;
 use bytes;
 
-use IO::Compress::Base::Common 2.106 qw(:Status );
+use IO::Compress::Base::Common 2.204 qw(:Status );
 
-use IO::Uncompress::Base 2.106 ;
-use IO::Uncompress::Adapter::Bunzip2 2.106 ;
+use IO::Uncompress::Base 2.204 ;
+use IO::Uncompress::Adapter::Bunzip2 2.204 ;
 
 require Exporter ;
 our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, $Bunzip2Error);
 
-$VERSION = '2.106';
+$VERSION = '2.204';
 $Bunzip2Error = '';
 
 @ISA    = qw(IO::Uncompress::Base Exporter);
@@ -909,7 +909,7 @@ See the Changes file.
 
 =head1 COPYRIGHT AND LICENSE
 
-Copyright (c) 2005-2022 Paul Marquess. All rights reserved.
+Copyright (c) 2005-2023 Paul Marquess. All rights reserved.
 
 This program is free software; you can redistribute it and/or
 modify it under the same terms as Perl itself.
index b7d4ae5..eeadb21 100644 (file)
@@ -9,12 +9,12 @@ use strict ;
 use warnings;
 use bytes;
 
-use IO::Uncompress::RawInflate 2.106 ;
+use IO::Uncompress::RawInflate 2.204 ;
 
-use Compress::Raw::Zlib 2.103 () ;
-use IO::Compress::Base::Common 2.106 qw(:Status );
-use IO::Compress::Gzip::Constants 2.106 ;
-use IO::Compress::Zlib::Extra 2.106 ;
+use Compress::Raw::Zlib 2.204 () ;
+use IO::Compress::Base::Common 2.204 qw(:Status );
+use IO::Compress::Gzip::Constants 2.204 ;
+use IO::Compress::Zlib::Extra 2.204 ;
 
 require Exporter ;
 
@@ -28,7 +28,7 @@ Exporter::export_ok_tags('all');
 
 $GunzipError = '';
 
-$VERSION = '2.106';
+$VERSION = '2.204';
 
 sub new
 {
@@ -1110,6 +1110,9 @@ C<gzip@prep.ai.mit.edu> and Mark Adler C<madler@alumni.caltech.edu>.
 The primary site for the I<zlib> compression library is
 L<http://www.zlib.org>.
 
+The primary site for the I<zlib-ng> compression library is
+L<https://github.com/zlib-ng/zlib-ng>.
+
 The primary site for gzip is L<http://www.gzip.org>.
 
 =head1 AUTHOR
@@ -1122,7 +1125,7 @@ See the Changes file.
 
 =head1 COPYRIGHT AND LICENSE
 
-Copyright (c) 2005-2022 Paul Marquess. All rights reserved.
+Copyright (c) 2005-2023 Paul Marquess. All rights reserved.
 
 This program is free software; you can redistribute it and/or
 modify it under the same terms as Perl itself.
index d762364..1573ba3 100644 (file)
@@ -5,15 +5,15 @@ use strict ;
 use warnings;
 use bytes;
 
-use IO::Compress::Base::Common  2.106 qw(:Status );
-use IO::Compress::Zlib::Constants 2.106 ;
+use IO::Compress::Base::Common  2.204 qw(:Status );
+use IO::Compress::Zlib::Constants 2.204 ;
 
-use IO::Uncompress::RawInflate  2.106 ;
+use IO::Uncompress::RawInflate  2.204 ;
 
 require Exporter ;
 our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, $InflateError);
 
-$VERSION = '2.106';
+$VERSION = '2.204';
 $InflateError = '';
 
 @ISA    = qw(IO::Uncompress::RawInflate Exporter);
@@ -982,6 +982,9 @@ C<gzip@prep.ai.mit.edu> and Mark Adler C<madler@alumni.caltech.edu>.
 The primary site for the I<zlib> compression library is
 L<http://www.zlib.org>.
 
+The primary site for the I<zlib-ng> compression library is
+L<https://github.com/zlib-ng/zlib-ng>.
+
 The primary site for gzip is L<http://www.gzip.org>.
 
 =head1 AUTHOR
@@ -994,7 +997,7 @@ See the Changes file.
 
 =head1 COPYRIGHT AND LICENSE
 
-Copyright (c) 2005-2022 Paul Marquess. All rights reserved.
+Copyright (c) 2005-2023 Paul Marquess. All rights reserved.
 
 This program is free software; you can redistribute it and/or
 modify it under the same terms as Perl itself.
index 6e957f3..80ff3f1 100644 (file)
@@ -5,16 +5,16 @@ use strict ;
 use warnings;
 use bytes;
 
-use Compress::Raw::Zlib  2.103 ;
-use IO::Compress::Base::Common  2.106 qw(:Status );
+use Compress::Raw::Zlib  2.204 ;
+use IO::Compress::Base::Common  2.204 qw(:Status );
 
-use IO::Uncompress::Base  2.106 ;
-use IO::Uncompress::Adapter::Inflate  2.106 ;
+use IO::Uncompress::Base  2.204 ;
+use IO::Uncompress::Adapter::Inflate  2.204 ;
 
 require Exporter ;
 our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, %DEFLATE_CONSTANTS, $RawInflateError);
 
-$VERSION = '2.106';
+$VERSION = '2.204';
 $RawInflateError = '';
 
 @ISA    = qw(IO::Uncompress::Base Exporter);
@@ -1110,6 +1110,9 @@ C<gzip@prep.ai.mit.edu> and Mark Adler C<madler@alumni.caltech.edu>.
 The primary site for the I<zlib> compression library is
 L<http://www.zlib.org>.
 
+The primary site for the I<zlib-ng> compression library is
+L<https://github.com/zlib-ng/zlib-ng>.
+
 The primary site for gzip is L<http://www.gzip.org>.
 
 =head1 AUTHOR
@@ -1122,7 +1125,7 @@ See the Changes file.
 
 =head1 COPYRIGHT AND LICENSE
 
-Copyright (c) 2005-2022 Paul Marquess. All rights reserved.
+Copyright (c) 2005-2023 Paul Marquess. All rights reserved.
 
 This program is free software; you can redistribute it and/or
 modify it under the same terms as Perl itself.
index cfe56d3..f1d806b 100644 (file)
@@ -9,14 +9,14 @@ use warnings;
 use bytes;
 
 use IO::File;
-use IO::Uncompress::RawInflate  2.106 ;
-use IO::Compress::Base::Common  2.106 qw(:Status );
-use IO::Uncompress::Adapter::Inflate  2.106 ;
-use IO::Uncompress::Adapter::Identity 2.106 ;
-use IO::Compress::Zlib::Extra 2.106 ;
-use IO::Compress::Zip::Constants 2.106 ;
+use IO::Uncompress::RawInflate  2.204 ;
+use IO::Compress::Base::Common  2.204 qw(:Status );
+use IO::Uncompress::Adapter::Inflate  2.204 ;
+use IO::Uncompress::Adapter::Identity 2.204 ;
+use IO::Compress::Zlib::Extra 2.204 ;
+use IO::Compress::Zip::Constants 2.204 ;
 
-use Compress::Raw::Zlib  2.103 () ;
+use Compress::Raw::Zlib  2.204 () ;
 
 BEGIN
 {
@@ -38,7 +38,7 @@ require Exporter ;
 
 our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, $UnzipError, %headerLookup);
 
-$VERSION = '2.106';
+$VERSION = '2.204';
 $UnzipError = '';
 
 @ISA    = qw(IO::Uncompress::RawInflate Exporter);
@@ -812,12 +812,11 @@ sub _dosToUnixTime
        my $min  = ( ( $dt >> 5 ) & 0x3f );
        my $sec  = ( ( $dt << 1 ) & 0x3e );
 
-
-    use POSIX 'mktime';
-
-    my $time_t = mktime( $sec, $min, $hour, $mday, $mon, $year, 0, 0, -1 );
+    use Time::Local ;
+    my $time_t = Time::Local::timelocal( $sec, $min, $hour, $mday, $mon, $year);
     return 0 if ! defined $time_t;
-       return $time_t;
+    return $time_t;
+
 }
 
 #sub scanCentralDirectory
@@ -1953,6 +1952,9 @@ C<gzip@prep.ai.mit.edu> and Mark Adler C<madler@alumni.caltech.edu>.
 The primary site for the I<zlib> compression library is
 L<http://www.zlib.org>.
 
+The primary site for the I<zlib-ng> compression library is
+L<https://github.com/zlib-ng/zlib-ng>.
+
 The primary site for gzip is L<http://www.gzip.org>.
 
 =head1 AUTHOR
@@ -1965,7 +1967,7 @@ See the Changes file.
 
 =head1 COPYRIGHT AND LICENSE
 
-Copyright (c) 2005-2022 Paul Marquess. All rights reserved.
+Copyright (c) 2005-2023 Paul Marquess. All rights reserved.
 
 This program is free software; you can redistribute it and/or
 modify it under the same terms as Perl itself.
index e763cba..aa540c6 100644 (file)
@@ -35,8 +35,7 @@ sub MY::libscan
     my $path = shift;
 
     return undef
-        if $path =~ /^(?:RCS|CVS|SCCS|\.svn|_darcs)$/ ||
-           $path =~ /(~|\.bak|_bak)$/ ||
+        if $path =~ /(~|\.bak|_bak)$/ ||
            $path =~ /\..*\.sw(o|p)$/  ||
            $path =~ /\B\.svn\b/;
 
index a7fe036..8afef5a 100755 (executable)
@@ -25,7 +25,7 @@ BEGIN
         if eval { require Test::NoWarnings ;  import Test::NoWarnings; 1 };
 
 
-    my $VERSION = '2.103';
+    my $VERSION = '2.204';
     my @NAMES = qw(
                        Compress::Raw::Bzip2
                        Compress::Raw::Zlib
@@ -86,9 +86,9 @@ BEGIN
         }
     }
 
-    # need zlib 1.2.0 or better
+    # need zlib 1.2.0 or better or zlib-ng
 
-    cmp_ok Compress::Raw::Zlib::ZLIB_VERNUM(), ">=", 0x1200
+    ok Compress::Raw::Zlib::is_zlibng() || Compress::Raw::Zlib::ZLIB_VERNUM() >= 0x1200
         or diag "IO::Compress needs zlib 1.2.0 or better, you have " . Compress::Raw::Zlib::zlib_version();
 
     use_ok('Scalar::Util') ;
index 371ed5c..6151c6a 100755 (executable)
@@ -11,6 +11,8 @@ use warnings;
 
 use Test::More ;
 
+use Compress::Raw::Zlib;
+
 BEGIN {
     plan skip_all => "Lengthy Tests Disabled\n" .
                      "set COMPRESS_ZLIB_RUN_ALL or COMPRESS_ZLIB_RUN_MOST to run this test suite"
@@ -21,8 +23,8 @@ BEGIN {
     $extra = 1
         if eval { require Test::NoWarnings ;  import Test::NoWarnings; 1 };
 
-    plan tests => 625 + $extra;
-
+    my $tests = Compress::Raw::Zlib::is_zlibng() ? 615 : 625;
+    plan tests => $tests + $extra;
 };
 
 
index 3158ef5..2601c71 100644 (file)
@@ -12,7 +12,8 @@ use warnings;
 # $VERSION needs to be set before  use base 'IO::Socket'
 #  - https://rt.cpan.org/Ticket/Display.html?id=92107
 BEGIN {
-   our $VERSION = '0.41';
+   our $VERSION = '0.41_01';
+   $VERSION = eval $VERSION;
 }
 
 use base qw( IO::Socket );
@@ -154,6 +155,12 @@ sub import
          die "Cannot socket(PF_INET6) - $!";
 
       if( setsockopt $testsock, IPPROTO_IPV6, IPV6_V6ONLY, 0 ) {
+         if ($^O eq "dragonfly") {
+            # dragonflybsd 6.4 lies about successfully turning this off
+            if (getsockopt $testsock, IPPROTO_IPV6, IPV6_V6ONLY) {
+               return $can_disable_v6only = 0;
+            }
+         }
          return $can_disable_v6only = 1;
       }
       elsif( $! == EINVAL || $! == EOPNOTSUPP ) {
index ff23fc7..fc8fcbc 100644 (file)
@@ -2,21 +2,22 @@ package JSON::PP;
 
 # JSON-2.0
 
-use 5.005;
+use 5.008;
 use strict;
 
 use Exporter ();
-BEGIN { @JSON::PP::ISA = ('Exporter') }
+BEGIN { our @ISA = ('Exporter') }
 
 use overload ();
 use JSON::PP::Boolean;
 
 use Carp ();
+use Scalar::Util qw(blessed reftype refaddr);
 #use Devel::Peek;
 
-$JSON::PP::VERSION = '4.07';
+our $VERSION = '4.16';
 
-@JSON::PP::EXPORT = qw(encode_json decode_json from_json to_json);
+our @EXPORT = qw(encode_json decode_json from_json to_json);
 
 # instead of hash-access, i tried index-access for speed.
 # but this method is not faster than what i expected. so it will be changed.
@@ -44,8 +45,19 @@ use constant P_AS_NONBLESSED        => 17;
 use constant P_ALLOW_UNKNOWN        => 18;
 use constant P_ALLOW_TAGS           => 19;
 
-use constant OLD_PERL => $] < 5.008 ? 1 : 0;
 use constant USE_B => $ENV{PERL_JSON_PP_USE_B} || 0;
+use constant CORE_BOOL => defined &builtin::is_bool;
+
+my $invalid_char_re;
+
+BEGIN {
+    $invalid_char_re = "[";
+    for my $i (0 .. 0x01F, 0x22, 0x5c) { # '/' is ok
+        $invalid_char_re .= quotemeta chr utf8::unicode_to_native($i);
+    }
+
+    $invalid_char_re = qr/$invalid_char_re]/;
+}
 
 BEGIN {
     if (USE_B) {
@@ -64,14 +76,6 @@ BEGIN {
             allow_barekey escape_slash as_nonblessed
     );
 
-    # Perl version check, Unicode handling is enabled?
-    # Helper module sets @JSON::PP::_properties.
-    if ( OLD_PERL ) {
-        my $helper = $] >= 5.006 ? 'JSON::PP::Compat5006' : 'JSON::PP::Compat5005';
-        eval qq| require $helper |;
-        if ($@) { Carp::croak $@; }
-    }
-
     for my $name (@xs_compati_bit_properties, @pp_bit_properties) {
         my $property_id = 'P_' . uc($name);
 
@@ -201,13 +205,54 @@ sub boolean_values {
         my ($false, $true) = @_;
         $self->{false} = $false;
         $self->{true} = $true;
+        if (CORE_BOOL) {
+            BEGIN { CORE_BOOL and warnings->unimport(qw(experimental::builtin)) }
+            if (builtin::is_bool($true) && builtin::is_bool($false) && $true && !$false) {
+                $self->{core_bools} = !!1;
+            }
+            else {
+                delete $self->{core_bools};
+            }
+        }
     } else {
         delete $self->{false};
         delete $self->{true};
+        delete $self->{core_bools};
     }
     return $self;
 }
 
+sub core_bools {
+    my $self = shift;
+    my $core_bools = defined $_[0] ? $_[0] : 1;
+    if ($core_bools) {
+        $self->{true} = !!1;
+        $self->{false} = !!0;
+        $self->{core_bools} = !!1;
+    }
+    else {
+        $self->{true} = $JSON::PP::true;
+        $self->{false} = $JSON::PP::false;
+        $self->{core_bools} = !!0;
+    }
+    return $self;
+}
+
+sub get_core_bools {
+    my $self = shift;
+    return !!$self->{core_bools};
+}
+
+sub unblessed_bool {
+    my $self = shift;
+    return $self->core_bools(@_);
+}
+
+sub get_unblessed_bool {
+    my $self = shift;
+    return $self->get_core_bools(@_);
+}
+
 sub get_boolean_values {
     my $self = shift;
     if (exists $self->{true} and exists $self->{false}) {
@@ -326,14 +371,6 @@ sub allow_bigint {
 
         $str .= "\n" if ( $indent ); # JSON::XS 2.26 compatible
 
-        unless ($ascii or $latin1 or $utf8) {
-            utf8::upgrade($str);
-        }
-
-        if ($props->[ P_SHRINK ]) {
-            utf8::downgrade($str, 1);
-        }
-
         return $str;
     }
 
@@ -412,7 +449,6 @@ sub allow_bigint {
         my $del = ($space_before ? ' ' : '') . ':' . ($space_after ? ' ' : '');
 
         for my $k ( _sort( $obj ) ) {
-            if ( OLD_PERL ) { utf8::decode($k) } # key for Perl 5.6 / be optimized
             push @res, $self->string_to_json( $k )
                           .  $del
                           . ( ref $obj->{$k} ? $self->object_to_json( $obj->{$k} ) : $self->value_to_json( $obj->{$k} ) );
@@ -476,7 +512,11 @@ sub allow_bigint {
         my $type = ref($value);
 
         if (!$type) {
-            if (_looks_like_number($value)) {
+            BEGIN { CORE_BOOL and warnings->unimport('experimental::builtin') }
+            if (CORE_BOOL && builtin::is_bool($value)) {
+                return $value ? 'true' : 'false';
+            }
+            elsif (_looks_like_number($value)) {
                 return $value;
             }
             return $self->string_to_json($value);
@@ -527,16 +567,18 @@ sub allow_bigint {
     sub string_to_json {
         my ($self, $arg) = @_;
 
-        $arg =~ s/([\x22\x5c\n\r\t\f\b])/$esc{$1}/g;
+        $arg =~ s/(["\\\n\r\t\f\b])/$esc{$1}/g;
         $arg =~ s/\//\\\//g if ($escape_slash);
-        $arg =~ s/([\x00-\x08\x0b\x0e-\x1f])/'\\u00' . unpack('H2', $1)/eg;
+
+        # On ASCII platforms, matches [\x00-\x08\x0b\x0e-\x1f]
+        $arg =~ s/([^\n\t\c?[:^cntrl:][:^ascii:]])/'\\u00' . unpack('H2', $1)/eg;
 
         if ($ascii) {
-            $arg = JSON_PP_encode_ascii($arg);
+            $arg = _encode_ascii($arg);
         }
 
         if ($latin1) {
-            $arg = JSON_PP_encode_latin1($arg);
+            $arg = _encode_latin1($arg);
         }
 
         if ($utf8) {
@@ -604,7 +646,7 @@ sub allow_bigint {
 sub _encode_ascii {
     join('',
         map {
-            $_ <= 127 ?
+            chr($_) =~ /[[:ascii:]]/ ?
                 chr($_) :
             $_ <= 65535 ?
                 sprintf('\u%04x', $_) : sprintf('\u%x\u%x', _encode_surrogates($_));
@@ -658,11 +700,11 @@ BEGIN {
 { # PARSE 
 
     my %escapes = ( #  by Jeremy Muhlich <jmuhlich [at] bitflood.org>
-        b    => "\x8",
-        t    => "\x9",
-        n    => "\xA",
-        f    => "\xC",
-        r    => "\xD",
+        b    => "\b",
+        t    => "\t",
+        n    => "\n",
+        f    => "\f",
+        r    => "\r",
         '\\' => '\\',
         '"'  => '"',
         '/'  => '/',
@@ -736,7 +778,6 @@ BEGIN {
             }
         }
         else {
-            utf8::upgrade( $text );
             utf8::encode( $text );
         }
 
@@ -845,7 +886,7 @@ BEGIN {
                                 decode_error("missing high surrogate character in surrogate pair");
                             }
                             $is_utf8 = 1;
-                            $s .= JSON_PP_decode_surrogates($utf16, $u) || next;
+                            $s .= _decode_surrogates($utf16, $u) || next;
                             $utf16 = undef;
                         }
                         else {
@@ -853,9 +894,10 @@ BEGIN {
                                 decode_error("surrogate pair expected");
                             }
 
-                            if ( ( my $hex = hex( $u ) ) > 127 ) {
+                            my $hex = hex( $u );
+                            if ( chr $u =~ /[[:^ascii:]]/ ) {
                                 $is_utf8 = 1;
-                                $s .= JSON_PP_decode_unicode($u) || next;
+                                $s .= _decode_unicode($u) || next;
                             }
                             else {
                                 $s .= chr $hex;
@@ -873,7 +915,7 @@ BEGIN {
                 }
                 else{
 
-                    if ( ord $ch  > 127 ) {
+                    if ( $ch =~ /[[:^ascii:]]/ ) {
                         unless( $ch = is_valid_utf8($ch) ) {
                             $at -= 1;
                             decode_error("malformed UTF-8 character in JSON string");
@@ -886,10 +928,12 @@ BEGIN {
                     }
 
                     if (!$loose) {
-                        if ($ch =~ /[\x00-\x1f\x22\x5c]/)  { # '/' ok
+                        if ($ch =~ $invalid_char_re)  { # '/' ok
                             if (!$relaxed or $ch ne "\t") {
                                 $at--;
-                                decode_error('invalid character encountered while parsing JSON string');
+                                decode_error(sprintf "invalid character 0x%X"
+                                   . " encountered while parsing JSON string",
+                                   ord $ch);
                             }
                         }
                     }
@@ -1102,7 +1146,7 @@ BEGIN {
 
     sub bareKey { # doesn't strictly follow Standard ECMA-262 3rd Edition
         my $key;
-        while($ch =~ /[^\x00-\x23\x25-\x2F\x3A-\x40\x5B-\x5E\x60\x7B-\x7F]/){
+        while($ch =~ /[\$\w[:^ascii:]]/){
             $key .= $ch;
             next_chr();
         }
@@ -1235,31 +1279,55 @@ BEGIN {
         return $is_dec ? $v/1.0 : 0+$v;
     }
 
+    # Compute how many bytes are in the longest legal official Unicode
+    # character
+    my $max_unicode_length = do {
+      no warnings 'utf8';
+      chr 0x10FFFF;
+    };
+    utf8::encode($max_unicode_length);
+    $max_unicode_length = length $max_unicode_length;
 
     sub is_valid_utf8 {
 
-        $utf8_len = $_[0] =~ /[\x00-\x7F]/  ? 1
-                  : $_[0] =~ /[\xC2-\xDF]/  ? 2
-                  : $_[0] =~ /[\xE0-\xEF]/  ? 3
-                  : $_[0] =~ /[\xF0-\xF4]/  ? 4
-                  : 0
-                  ;
-
-        return unless $utf8_len;
-
-        my $is_valid_utf8 = substr($text, $at - 1, $utf8_len);
-
-        return ( $is_valid_utf8 =~ /^(?:
-             [\x00-\x7F]
-            |[\xC2-\xDF][\x80-\xBF]
-            |[\xE0][\xA0-\xBF][\x80-\xBF]
-            |[\xE1-\xEC][\x80-\xBF][\x80-\xBF]
-            |[\xED][\x80-\x9F][\x80-\xBF]
-            |[\xEE-\xEF][\x80-\xBF][\x80-\xBF]
-            |[\xF0][\x90-\xBF][\x80-\xBF][\x80-\xBF]
-            |[\xF1-\xF3][\x80-\xBF][\x80-\xBF][\x80-\xBF]
-            |[\xF4][\x80-\x8F][\x80-\xBF][\x80-\xBF]
-        )$/x )  ? $is_valid_utf8 : '';
+        # Returns undef (setting $utf8_len to 0) unless the next bytes in $text
+        # comprise a well-formed UTF-8 encoded character, in which case,
+        # return those bytes, setting $utf8_len to their count.
+
+        my $start_point = substr($text, $at - 1);
+
+        # Look no further than the maximum number of bytes in a single
+        # character
+        my $limit = $max_unicode_length;
+        $limit = length($start_point) if $limit > length($start_point);
+
+        # Find the number of bytes comprising the first character in $text
+        # (without having to know the details of its internal representation).
+        # This loop will iterate just once on well-formed input.
+        while ($limit > 0) {    # Until we succeed or exhaust the input
+            my $copy = substr($start_point, 0, $limit);
+
+            # decode() will return true if all bytes are valid; false
+            # if any aren't.
+            if (utf8::decode($copy)) {
+
+                # Is valid: get the first character, convert back to bytes,
+                # and return those bytes.
+                $copy = substr($copy, 0, 1);
+                utf8::encode($copy);
+                $utf8_len = length $copy;
+                return substr($start_point, 0, $utf8_len);
+            }
+
+            # If it didn't work, it could be that there is a full legal character
+            # followed by a partial or malformed one.  Narrow the window and
+            # try again.
+            $limit--;
+        }
+
+        # Failed to find a legal UTF-8 character.
+        $utf8_len = 0;
+        return;
     }
 
 
@@ -1270,22 +1338,15 @@ BEGIN {
         my $mess   = '';
         my $type   = 'U*';
 
-        if ( OLD_PERL ) {
-            my $type   =  $] <  5.006           ? 'C*'
-                        : utf8::is_utf8( $str ) ? 'U*' # 5.6
-                        : 'C*'
-                        ;
-        }
-
         for my $c ( unpack( $type, $str ) ) { # emulate pv_uni_display() ?
-            $mess .=  $c == 0x07 ? '\a'
-                    : $c == 0x09 ? '\t'
-                    : $c == 0x0a ? '\n'
-                    : $c == 0x0d ? '\r'
-                    : $c == 0x0c ? '\f'
-                    : $c <  0x20 ? sprintf('\x{%x}', $c)
-                    : $c == 0x5c ? '\\\\'
-                    : $c <  0x80 ? chr($c)
+            my $chr_c = chr($c);
+            $mess .=  $chr_c eq '\\' ? '\\\\'
+                    : $chr_c =~ /[[:print:]]/ ? $chr_c
+                    : $chr_c eq '\a' ? '\a'
+                    : $chr_c eq '\t' ? '\t'
+                    : $chr_c eq '\n' ? '\n'
+                    : $chr_c eq '\r' ? '\r'
+                    : $chr_c eq '\f' ? '\f'
                     : sprintf('\x{%x}', $c)
                     ;
             if ( length $mess >= 20 ) {
@@ -1364,136 +1425,54 @@ sub _decode_unicode {
     return $un;
 }
 
-#
-# Setup for various Perl versions (the code from JSON::PP58)
-#
-
-BEGIN {
-
-    unless ( defined &utf8::is_utf8 ) {
-       require Encode;
-       *utf8::is_utf8 = *Encode::is_utf8;
-    }
-
-    if ( !OLD_PERL ) {
-        *JSON::PP::JSON_PP_encode_ascii      = \&_encode_ascii;
-        *JSON::PP::JSON_PP_encode_latin1     = \&_encode_latin1;
-        *JSON::PP::JSON_PP_decode_surrogates = \&_decode_surrogates;
-        *JSON::PP::JSON_PP_decode_unicode    = \&_decode_unicode;
-
-        if ($] < 5.008003) { # join() in 5.8.0 - 5.8.2 is broken.
-            package JSON::PP;
-            require subs;
-            subs->import('join');
-            eval q|
-                sub join {
-                    return '' if (@_ < 2);
-                    my $j   = shift;
-                    my $str = shift;
-                    for (@_) { $str .= $j . $_; }
-                    return $str;
-                }
-            |;
-        }
-    }
+sub incr_parse {
+    local $Carp::CarpLevel = 1;
+    ( $_[0]->{_incr_parser} ||= JSON::PP::IncrParser->new )->incr_parse( @_ );
+}
 
 
-    sub JSON::PP::incr_parse {
-        local $Carp::CarpLevel = 1;
-        ( $_[0]->{_incr_parser} ||= JSON::PP::IncrParser->new )->incr_parse( @_ );
-    }
+sub incr_skip {
+    ( $_[0]->{_incr_parser} ||= JSON::PP::IncrParser->new )->incr_skip;
+}
 
 
-    sub JSON::PP::incr_skip {
-        ( $_[0]->{_incr_parser} ||= JSON::PP::IncrParser->new )->incr_skip;
-    }
+sub incr_reset {
+    ( $_[0]->{_incr_parser} ||= JSON::PP::IncrParser->new )->incr_reset;
+}
 
+sub incr_text : lvalue {
+    $_[0]->{_incr_parser} ||= JSON::PP::IncrParser->new;
 
-    sub JSON::PP::incr_reset {
-        ( $_[0]->{_incr_parser} ||= JSON::PP::IncrParser->new )->incr_reset;
+    if ( $_[0]->{_incr_parser}->{incr_pos} ) {
+        Carp::croak("incr_text cannot be called when the incremental parser already started parsing");
     }
-
-    eval q{
-        sub JSON::PP::incr_text : lvalue {
-            $_[0]->{_incr_parser} ||= JSON::PP::IncrParser->new;
-
-            if ( $_[0]->{_incr_parser}->{incr_pos} ) {
-                Carp::croak("incr_text cannot be called when the incremental parser already started parsing");
-            }
-            $_[0]->{_incr_parser}->{incr_text};
-        }
-    } if ( $] >= 5.006 );
-
-} # Setup for various Perl versions (the code from JSON::PP58)
+    $_[0]->{_incr_parser}->{incr_text};
+}
 
 
 ###############################
 # Utilities
 #
 
-BEGIN {
-    eval 'require Scalar::Util';
-    unless($@){
-        *JSON::PP::blessed = \&Scalar::Util::blessed;
-        *JSON::PP::reftype = \&Scalar::Util::reftype;
-        *JSON::PP::refaddr = \&Scalar::Util::refaddr;
-    }
-    else{ # This code is from Scalar::Util.
-        # warn $@;
-        eval 'sub UNIVERSAL::a_sub_not_likely_to_be_here { ref($_[0]) }';
-        *JSON::PP::blessed = sub {
-            local($@, $SIG{__DIE__}, $SIG{__WARN__});
-            ref($_[0]) ? eval { $_[0]->a_sub_not_likely_to_be_here } : undef;
-        };
-        require B;
-        my %tmap = qw(
-            B::NULL   SCALAR
-            B::HV     HASH
-            B::AV     ARRAY
-            B::CV     CODE
-            B::IO     IO
-            B::GV     GLOB
-            B::REGEXP REGEXP
-        );
-        *JSON::PP::reftype = sub {
-            my $r = shift;
-
-            return undef unless length(ref($r));
-
-            my $t = ref(B::svref_2object($r));
-
-            return
-                exists $tmap{$t} ? $tmap{$t}
-              : length(ref($$r)) ? 'REF'
-              :                    'SCALAR';
-        };
-        *JSON::PP::refaddr = sub {
-          return undef unless length(ref($_[0]));
-
-          my $addr;
-          if(defined(my $pkg = blessed($_[0]))) {
-            $addr .= bless $_[0], 'Scalar::Util::Fake';
-            bless $_[0], $pkg;
-          }
-          else {
-            $addr .= $_[0]
-          }
-
-          $addr =~ /0x(\w+)/;
-          local $^W;
-          #no warnings 'portable';
-          hex($1);
-        }
-    }
-}
-
-
 # shamelessly copied and modified from JSON::XS code.
 
 $JSON::PP::true  = do { bless \(my $dummy = 1), "JSON::PP::Boolean" };
 $JSON::PP::false = do { bless \(my $dummy = 0), "JSON::PP::Boolean" };
 
-sub is_bool { blessed $_[0] and ( $_[0]->isa("JSON::PP::Boolean") or $_[0]->isa("Types::Serialiser::BooleanBase") or $_[0]->isa("JSON::XS::Boolean") ); }
+sub is_bool {
+  if (blessed $_[0]) {
+    return (
+      $_[0]->isa("JSON::PP::Boolean")
+      or $_[0]->isa("Types::Serialiser::BooleanBase")
+      or $_[0]->isa("JSON::XS::Boolean")
+    );
+  }
+  elsif (CORE_BOOL) {
+    BEGIN { CORE_BOOL and warnings->unimport('experimental::builtin') }
+    return builtin::is_bool($_[0]);
+  }
+  return !!0;
+}
 
 sub true  { $JSON::PP::true  }
 sub false { $JSON::PP::false }
@@ -1514,7 +1493,7 @@ use constant INCR_M_C1   => 5;
 use constant INCR_M_TFN  => 6;
 use constant INCR_M_NUM  => 7;
 
-$JSON::PP::IncrParser::VERSION = '1.01';
+our $VERSION = '1.01';
 
 sub new {
     my ( $class ) = @_;
@@ -1534,10 +1513,6 @@ sub incr_parse {
     $self->{incr_text} = '' unless ( defined $self->{incr_text} );
 
     if ( defined $text ) {
-        if ( utf8::is_utf8( $text ) and !utf8::is_utf8( $self->{incr_text} ) ) {
-            utf8::upgrade( $self->{incr_text} ) ;
-            utf8::decode( $self->{incr_text} ) ;
-        }
         $self->{incr_text} .= $text;
     }
 
@@ -1564,7 +1539,6 @@ sub incr_parse {
                 }
 
                 unless ( $coder->get_utf8 ) {
-                    utf8::upgrade( $self->{incr_text} );
                     utf8::decode( $self->{incr_text} );
                 }
 
@@ -1605,7 +1579,7 @@ INCR_PARSE:
             while ( $len > $p ) {
                 $s = substr( $text, $p, 1 );
                 last INCR_PARSE unless defined $s;
-                if ( ord($s) > 0x20 ) {
+                if ( ord($s) > ord " " ) {
                     if ( $s eq '#' ) {
                         $self->{incr_mode} = INCR_M_C0;
                         redo INCR_PARSE;
@@ -1632,6 +1606,7 @@ INCR_PARSE:
             }
             next;
         } elsif ( $mode == INCR_M_TFN ) {
+            last INCR_PARSE if $p >= $len && $self->{incr_nest};
             while ( $len > $p ) {
                 $s = substr( $text, $p++, 1 );
                 next if defined $s and $s =~ /[rueals]/;
@@ -1643,6 +1618,7 @@ INCR_PARSE:
             last INCR_PARSE unless $self->{incr_nest};
             redo INCR_PARSE;
         } elsif ( $mode == INCR_M_NUM ) {
+            last INCR_PARSE if $p >= $len && $self->{incr_nest};
             while ( $len > $p ) {
                 $s = substr( $text, $p++, 1 );
                 next if defined $s and $s =~ /[0-9eE.+\-]/;
@@ -1679,7 +1655,7 @@ INCR_PARSE:
                 if ( $s eq "\x00" ) {
                     $p--;
                     last INCR_PARSE;
-                } elsif ( $s eq "\x09" or $s eq "\x0a" or $s eq "\x0d" or $s eq "\x20" ) {
+                } elsif ( $s =~ /^[\t\n\r ]$/) {
                     if ( !$self->{incr_nest} ) {
                         $p--; # do not eat the whitespace, let the next round do it
                         last INCR_PARSE;
@@ -1834,6 +1810,9 @@ Returns true if the passed scalar represents either JSON::PP::true or
 JSON::PP::false, two constants that act like C<1> and C<0> respectively
 and are also used to represent JSON C<true> and C<false> in Perl strings.
 
+On perl 5.36 and above, will also return true when given one of perl's
+standard boolean values, such as the result of a comparison.
+
 See L<MAPPING>, below, for more information on how JSON values are mapped to
 Perl.
 
@@ -2250,6 +2229,22 @@ to their default values.
 C<get_boolean_values> will return both C<$false> and C<$true> values, or
 the empty list when they are set to the default.
 
+=head2 core_bools
+
+    $json->core_bools([$enable]);
+
+If C<$enable> is true (or missing), then C<decode>, will produce standard
+perl boolean values. Equivalent to calling:
+
+    $json->boolean_values(!!1, !!0)
+
+C<get_core_bools> will return true if this has been set. On perl 5.36, it will
+also return true if the boolean values have been set to perl's core booleans
+using the C<boolean_values> method.
+
+The methods C<unblessed_bool> and C<get_unblessed_bool> are provided as aliases
+for compatibility with L<Cpanel::JSON::XS>.
+
 =head2 filter_json_object
 
     $json = $json->filter_json_object([$coderef])
diff --git a/gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary.t b/gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary.t
deleted file mode 100644 (file)
index a1bce5d..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-# copied over from JSON::XS and modified to use JSON::PP
-
-use strict;
-use warnings;
-use Test::More;
-BEGIN { plan tests => 24576 };
-
-BEGIN { $ENV{PERL_JSON_BACKEND} = 0; }
-
-use JSON::PP;
-
-
-sub test($) {
-   my $js;
-
-   $js = JSON::PP->new->allow_nonref(0)->utf8->ascii->shrink->encode ([$_[0]]);
-   ok ($_[0] eq ((decode_json $js)->[0]), " - 0");
-   $js = JSON::PP->new->allow_nonref(0)->utf8->ascii->encode ([$_[0]]);
-   ok ($_[0] eq (JSON::PP->new->utf8->shrink->decode($js))->[0], " - 1");
-
-   $js = JSON::PP->new->allow_nonref(0)->utf8->shrink->encode ([$_[0]]);
-   ok ($_[0] eq ((decode_json $js)->[0]), " - 2");
-   $js = JSON::PP->new->allow_nonref(1)->utf8->encode ([$_[0]]);
-   ok ($_[0] eq (JSON::PP->new->utf8->shrink->decode($js))->[0], " - 3");
-
-   $js = JSON::PP->new->allow_nonref(1)->ascii->encode ([$_[0]]);
-   ok ($_[0] eq JSON::PP->new->decode ($js)->[0], " - 4");
-   $js = JSON::PP->new->allow_nonref(0)->ascii->encode ([$_[0]]);
-   ok ($_[0] eq JSON::PP->new->shrink->decode ($js)->[0], " - 5");
-
-   $js = JSON::PP->new->allow_nonref(1)->shrink->encode ([$_[0]]);
-   ok ($_[0] eq JSON::PP->new->decode ($js)->[0], " - 6");
-   $js = JSON::PP->new->allow_nonref(0)->encode ([$_[0]]);
-   ok ($_[0] eq JSON::PP->new->shrink->decode ($js)->[0], " - 7");
-}
-
-srand 0; # doesn't help too much, but its at least more deterministic
-
-for (1..768) {
-   test join "", map chr ($_ & 255), 0..$_;
-   test join "", map chr rand 255, 0..$_;
-   test join "", map chr ($_ * 97 & ~0x4000), 0..$_;
-   test join "", map chr (rand (2**20) & ~0x800), 0..$_;
-}
-
index 308a75b..6a4c96a 100644 (file)
@@ -67,7 +67,7 @@ static const unsigned char index_64[256] = {
           ((SvFLAGS(sv) & (SVf_POK|SVf_UTF8)) == (SVf_POK) \
            ? ((lp = SvCUR(sv)), SvPVX(sv)) : my_sv_2pvbyte(aTHX_ sv, &lp))
        static char *
-       my_sv_2pvbyte(pTHX_ register SV *sv, STRLEN *lp)
+       my_sv_2pvbyte(pTHX_ SV *sv, STRLEN *lp)
        {   
            sv_utf8_downgrade(sv,0);
            return SvPV(sv,*lp);
@@ -180,7 +180,7 @@ decode_base64(sv)
 
        PREINIT:
        STRLEN len;
-       register unsigned char *str = (unsigned char*)SvPV(sv, len);
+       unsigned char *str = (unsigned char*)SvPV(sv, len);
        unsigned char const* end = str + len;
        char *r;
        unsigned char c[4];
@@ -276,7 +276,7 @@ decoded_base64_length(sv)
 
        PREINIT:
        STRLEN len;
-       register unsigned char *str = (unsigned char*)SvPV(sv, len);
+       unsigned char *str = (unsigned char*)SvPV(sv, len);
        unsigned char const* end = str + len;
        int i = 0;
 
index f20c8eb..ee2c29d 100644 (file)
@@ -12,7 +12,7 @@ BEGIN {
     our @ISA = qw< Math::BigInt::Calc >;
 }
 
-our $VERSION = '0.5012';
+our $VERSION = '0.5013';
 
 my $MAX_EXP_F;      # the maximum possible base 10 exponent with "no integer"
 my $MAX_EXP_I;      # the maximum possible base 10 exponent with "use integer"
index d404f66..66300a4 100644 (file)
@@ -20,7 +20,7 @@ use Carp          qw< carp croak >;
 use Scalar::Util  qw< blessed >;
 use Math::BigInt  qw< >;
 
-our $VERSION = '1.999830';
+our $VERSION = '1.999837';
 $VERSION =~ tr/_//d;
 
 require Exporter;
@@ -261,8 +261,7 @@ BEGIN {
     $rnd_mode   = 'even';
     tie $rnd_mode, 'Math::BigFloat';
 
-    # we need both of them in this package:
-    *as_int = \&as_number;
+    *as_number = \&as_int;
 }
 
 sub DESTROY {
@@ -272,7 +271,6 @@ sub DESTROY {
 sub AUTOLOAD {
     # make fxxx and bxxx both work by selectively mapping fxxx() to MBF::bxxx()
     my $name = $AUTOLOAD;
-
     $name =~ s/(.*):://;        # split package
     my $c = $1 || __PACKAGE__;
     no strict 'refs';
@@ -286,7 +284,8 @@ sub AUTOLOAD {
             # delayed load of Carp and avoid recursion
             croak("Can't call $c\-\>$name, not a valid method");
         }
-        # try one level up, but subst. bxxx() for fxxx() since MBI only got bxxx()
+        # try one level up, but subst. bxxx() for fxxx() since MBI only got
+        # bxxx()
         $name =~ s/^f/b/;
         return &{"Math::BigInt"."::$name"}(@_);
     }
@@ -353,7 +352,8 @@ sub config {
 ###############################################################################
 
 sub new {
-    # Create a new Math::BigFloat object from a string or another bigfloat object.
+    # Create a new Math::BigFloat object from a string or another bigfloat
+    # object.
     # _e: exponent
     # _m: mantissa
     # sign  => ("+", "-", "+inf", "-inf", or "NaN")
@@ -394,16 +394,19 @@ sub new {
 
     $self = bless {}, $class unless $selfref;
 
-    # The first following ought to work. However, it causes a 'Deep recursion on
-    # subroutine "Math::BigFloat::as_number"' in some tests. Fixme!
+    # Math::BigFloat or subclass
+
+    if (defined(blessed($wanted)) && $wanted -> isa($class)) {
+
+        # Don't copy the accuracy and precision, because a new object should get
+        # them from the global configuration.
 
-    if (defined(blessed($wanted)) && $wanted -> isa('Math::BigFloat')) {
-    #if (defined(blessed($wanted)) && UNIVERSAL::isa($wanted, 'Math::BigFloat')) {
         $self -> {sign} = $wanted -> {sign};
         $self -> {_m}   = $LIB -> _copy($wanted -> {_m});
         $self -> {_es}  = $wanted -> {_es};
         $self -> {_e}   = $LIB -> _copy($wanted -> {_e});
-        $self->round(@r) unless @r >= 2 && !defined($r[0]) && !defined($r[1]);
+        $self = $self->round(@r)
+          unless @r >= 2 && !defined($r[0]) && !defined($r[1]);
         return $self;
     }
 
@@ -427,43 +430,54 @@ sub new {
         }
     }
 
-    # Handle Infs.
+    # Shortcut for simple forms like '123' that have no trailing zeros. Trailing
+    # zeros would require a non-zero exponent.
 
-    if ($wanted =~ /^\s*([+-]?)inf(inity)?\s*\z/i) {
-        return $downgrade->new($wanted) if defined $downgrade;
-        my $sgn = $1 || '+';
-        $self = $class -> binf($sgn);
-        $self->round(@r) unless @r >= 2 && !defined($r[0]) && !defined($r[1]);
+    if ($wanted =~
+        / ^
+          \s*                           # optional leading whitespace
+          ( [+-]? )                     # optional sign
+          0*                            # optional leading zeros
+          ( [1-9] (?: [0-9]* [1-9] )? ) # significand
+          \s*                           # optional trailing whitespace
+          $
+        /x)
+    {
+        return $downgrade -> new($1 . $2) if defined $downgrade;
+        $self->{sign} = $1 || '+';
+        $self->{_m}   = $LIB -> _new($2);
+        $self->{_es}  = '+';
+        $self->{_e}   = $LIB -> _zero();
+        $self = $self->round(@r)
+          unless @r >= 2 && !defined $r[0] && !defined $r[1];
         return $self;
     }
 
-    # Handle explicit NaNs (not the ones returned due to invalid input).
+    # Handle Infs.
 
-    if ($wanted =~ /^\s*([+-]?)nan\s*\z/i) {
-        return $downgrade->new($wanted) if defined $downgrade;
-        $self = $class -> bnan();
-        $self->round(@r) unless @r >= 2 && !defined $r[0] && !defined $r[1];
-        return $self;
+    if ($wanted =~ / ^
+                     \s*
+                     ( [+-]? )
+                     inf (?: inity )?
+                     \s*
+                     \z
+                   /ix)
+    {
+        my $sgn = $1 || '+';
+        return $class -> binf($sgn, @r);
     }
 
-    # Shortcut for simple forms like '123' that have no trailing zeros.
+    # Handle explicit NaNs (not the ones returned due to invalid input).
 
     if ($wanted =~ / ^
-                     \s*                        # optional leading whitespace
-                     ( [+-]? )                  # optional sign
-                     0*                         # optional leading zeros
-                     ( [1-9] (?: [0-9]* [1-9] )? )  # significand
-                     \s*                        # optional trailing whitespace
-                     $
-                   /x)
+                     \s*
+                     ( [+-]? )
+                     nan
+                     \s*
+                     \z
+                   /ix)
     {
-        return $downgrade->new($1 . $2) if defined $downgrade;
-        $self->{sign} = $1 || '+';
-        $self->{_m}   = $LIB -> _new($2);
-        $self->{_es}  = '+';
-        $self->{_e}   = $LIB -> _zero();
-        $self->round(@r) unless @r >= 2 && !defined $r[0] && !defined $r[1];
-        return $self;
+        return $class -> bnan(@r);
     }
 
     my @parts;
@@ -473,7 +487,7 @@ sub new {
         # have a "0x", "0X", "x", or "X" prefix, cf. CORE::oct().
 
         $wanted =~ /^\s*[+-]?0?[Xx]/ and
-        @parts = $class -> _hex_str_to_lib_parts($wanted)
+        @parts = $class -> _hex_str_to_flt_lib_parts($wanted)
 
           or
 
@@ -481,7 +495,7 @@ sub new {
         # "0o", "0O", "o", "O" prefix, cf. CORE::oct().
 
         $wanted =~ /^\s*[+-]?0?[Oo]/ and
-        @parts = $class -> _oct_str_to_lib_parts($wanted)
+        @parts = $class -> _oct_str_to_flt_lib_parts($wanted)
 
           or
 
@@ -489,7 +503,7 @@ sub new {
         # "0b", "0B", "b", or "B" prefix, cf. CORE::oct().
 
         $wanted =~ /^\s*[+-]?0?[Bb]/ and
-        @parts = $class -> _bin_str_to_lib_parts($wanted)
+        @parts = $class -> _bin_str_to_flt_lib_parts($wanted)
 
           or
 
@@ -497,34 +511,33 @@ sub new {
         # above and octal floating point numbers that don't have any of the
         # "0o", "0O", "o", or "O" prefixes. First see if it is a decimal number.
 
-        @parts = $class -> _dec_str_to_lib_parts($wanted)
+        @parts = $class -> _dec_str_to_flt_lib_parts($wanted)
           or
 
         # See if it is an octal floating point number. The extra check is
-        # included because _oct_str_to_lib_parts() accepts octal numbers that
-        # don't have a prefix (this is needed to make it work with, e.g.,
+        # included because _oct_str_to_flt_lib_parts() accepts octal numbers
+        # that don't have a prefix (this is needed to make it work with, e.g.,
         # from_oct() that don't require a prefix). However, Perl requires a
         # prefix for octal floating point literals. For example, "1p+0" is not
         # valid, but "01p+0" and "0__1p+0" are.
 
         $wanted =~ /^\s*[+-]?0_*\d/ and
-        @parts = $class -> _oct_str_to_lib_parts($wanted))
+        @parts = $class -> _oct_str_to_flt_lib_parts($wanted))
     {
-        # The value is an integer iff the exponent is non-negative.
+        ($self->{sign}, $self->{_m}, $self->{_es}, $self->{_e}) = @parts;
 
-        if ($parts[2] eq '+' && $downgrade) {
-            return $downgrade->new($wanted, @r);
-        }
+        $self = $self->round(@r)
+          unless @r >= 2 && !defined($r[0]) && !defined($r[1]);
 
-        ($self->{sign}, $self->{_m}, $self->{_es}, $self->{_e}) = @parts;
-        $self->round(@r) unless @r >= 2 && !defined($r[0]) && !defined($r[1]);
+        return $downgrade -> new($self -> bdstr(), @r)
+          if defined($downgrade) && $self -> is_int();
         return $self;
     }
 
     # If we get here, the value is neither a valid decimal, binary, octal, or
     # hexadecimal number. It is not an explicit Inf or a NaN either.
 
-    return $class -> bnan();
+    return $class -> bnan(@r);
 }
 
 sub from_dec {
@@ -534,25 +547,23 @@ sub from_dec {
 
     # Don't modify constant (read-only) objects.
 
-    return if $selfref && $self->modify('from_dec');
+    return $self if $selfref && $self->modify('from_dec');
 
     my $str = shift;
     my @r = @_;
 
     # If called as a class method, initialize a new object.
 
-    $self = $class -> bzero() unless $selfref;
-
-    if (my @parts = $class -> _dec_str_to_lib_parts($str)) {
+    $self = bless {}, $class unless $selfref;
 
-        # The value is an integer iff the exponent is non-negative.
+    if (my @parts = $class -> _dec_str_to_flt_lib_parts($str)) {
+        ($self->{sign}, $self->{_m}, $self->{_es}, $self->{_e}) = @parts;
 
-        if ($parts[2] eq '+') {
-            return $downgrade->new($str, @r) if defined $downgrade;
-        }
+        $self = $self->round(@r)
+          unless @r >= 2 && !defined($r[0]) && !defined($r[1]);
 
-        ($self->{sign}, $self->{_m}, $self->{_es}, $self->{_e}) = @parts;
-        $self->round(@r) unless @r >= 2 && !defined($r[0]) && !defined($r[1]);
+        return $downgrade -> new($self -> bdstr(), @r)
+          if defined($downgrade) && $self -> is_int();
         return $self;
     }
 
@@ -566,25 +577,23 @@ sub from_hex {
 
     # Don't modify constant (read-only) objects.
 
-    return if $selfref && $self->modify('from_hex');
+    return $self if $selfref && $self->modify('from_hex');
 
     my $str = shift;
     my @r = @_;
 
     # If called as a class method, initialize a new object.
 
-    $self = $class -> bzero() unless $selfref;
-
-    if (my @parts = $class -> _hex_str_to_lib_parts($str)) {
+    $self = bless {}, $class unless $selfref;
 
-        # The value is an integer iff the exponent is non-negative.
+    if (my @parts = $class -> _hex_str_to_flt_lib_parts($str)) {
+        ($self->{sign}, $self->{_m}, $self->{_es}, $self->{_e}) = @parts;
 
-        if ($parts[2] eq '+' && defined $downgrade) {
-            return $downgrade -> from_hex($str, @r);
-        }
+        $self = $self->round(@r)
+          unless @r >= 2 && !defined($r[0]) && !defined($r[1]);
 
-        ($self->{sign}, $self->{_m}, $self->{_es}, $self->{_e}) = @parts;
-        $self->round(@r) unless @r >= 2 && !defined($r[0]) && !defined($r[1]);
+        return $downgrade -> new($self -> bdstr(), @r)
+          if defined($downgrade) && $self -> is_int();
         return $self;
     }
 
@@ -598,25 +607,23 @@ sub from_oct {
 
     # Don't modify constant (read-only) objects.
 
-    return if $selfref && $self->modify('from_oct');
+    return $self if $selfref && $self->modify('from_oct');
 
     my $str = shift;
     my @r = @_;
 
     # If called as a class method, initialize a new object.
 
-    $self = $class -> bzero() unless $selfref;
-
-    if (my @parts = $class -> _oct_str_to_lib_parts($str)) {
+    $self = bless {}, $class unless $selfref;
 
-        # The value is an integer iff the exponent is non-negative.
+    if (my @parts = $class -> _oct_str_to_flt_lib_parts($str)) {
+        ($self->{sign}, $self->{_m}, $self->{_es}, $self->{_e}) = @parts;
 
-        if ($parts[2] eq '+') {
-            return $downgrade -> from_oct($str, @r) if defined $downgrade;
-        }
+        $self = $self->round(@r)
+          unless @r >= 2 && !defined($r[0]) && !defined($r[1]);
 
-        ($self->{sign}, $self->{_m}, $self->{_es}, $self->{_e}) = @parts;
-        $self->round(@r) unless @r >= 2 && !defined($r[0]) && !defined($r[1]);
+        return $downgrade -> new($self -> bdstr(), @r)
+          if defined($downgrade) && $self -> is_int();
         return $self;
     }
 
@@ -630,25 +637,23 @@ sub from_bin {
 
     # Don't modify constant (read-only) objects.
 
-    return if $selfref && $self->modify('from_bin');
+    return $self if $selfref && $self->modify('from_bin');
 
     my $str = shift;
     my @r = @_;
 
     # If called as a class method, initialize a new object.
 
-    $self = $class -> bzero() unless $selfref;
-
-    if (my @parts = $class -> _bin_str_to_lib_parts($str)) {
+    $self = bless {}, $class unless $selfref;
 
-        # The value is an integer iff the exponent is non-negative.
+    if (my @parts = $class -> _bin_str_to_flt_lib_parts($str)) {
+        ($self->{sign}, $self->{_m}, $self->{_es}, $self->{_e}) = @parts;
 
-        if ($parts[2] eq '+') {
-            return $downgrade -> from_bin($str, @r) if defined $downgrade;
-        }
+        $self = $self->round(@r)
+          unless @r >= 2 && !defined($r[0]) && !defined($r[1]);
 
-        ($self->{sign}, $self->{_m}, $self->{_es}, $self->{_e}) = @parts;
-        $self->round(@r) unless @r >= 2 && !defined($r[0]) && !defined($r[1]);
+        return $downgrade -> new($self -> bdstr(), @r)
+          if defined($downgrade) && $self -> is_int();
         return $self;
     }
 
@@ -662,14 +667,14 @@ sub from_ieee754 {
 
     # Don't modify constant (read-only) objects.
 
-    return if $selfref && $self->modify('from_ieee754');
+    return $self if $selfref && $self->modify('from_ieee754');
 
     my $in     = shift;     # input string (or raw bytes)
     my $format = shift;     # format ("binary32", "decimal64" etc.)
     my $enc;                # significand encoding (applies only to decimal)
     my $k;                  # storage width in bits
     my $b;                  # base
-    my @r = @_;
+    my @r = @_;             # rounding parameters, if any
 
     if ($format =~ /^binary(\d+)\z/) {
         $k = $1;
@@ -730,7 +735,7 @@ sub from_ieee754 {
 
         # The maximum exponent, minimum exponent, and exponent bias.
 
-        my $emax = Math::BigInt -> new(2) -> bpow($w - 1) -> bdec();
+        my $emax = Math::BigFloat -> new(2) -> bpow($w - 1) -> bdec();
         my $emin = 1 - $emax;
         my $bias = $emax;
 
@@ -767,7 +772,7 @@ sub from_ieee754 {
 
         my $x;
 
-        $expo -> bsub($bias);                   # subtract bias
+        $expo = $expo -> bsub($bias);           # subtract bias
 
         if ($expo < $emin) {                    # zero and subnormals
             if ($mant == 0) {                   # zero
@@ -775,8 +780,8 @@ sub from_ieee754 {
             } else {                            # subnormals
                 # compute (1/$b)**(N) rather than ($b)**(-N)
                 $x = $class -> new("0.5");      # 1/$b
-                $x -> bpow($bias + $t - 1) -> bmul($mant);
-                $x -> bneg() if $sign eq '-';
+                $x = $x -> bpow($bias + $t - 1) -> bmul($mant);
+                $x = $x -> bneg() if $sign eq '-';
             }
         }
 
@@ -784,7 +789,7 @@ sub from_ieee754 {
             if ($mant == 0) {                   # inf
                 $x = $class -> binf($sign);
             } else {                            # nan
-                $x = $class -> bnan();
+                $x = $class -> bnan(@r);
             }
         }
 
@@ -793,12 +798,12 @@ sub from_ieee754 {
             if ($expo < $t) {
                 # compute (1/$b)**(N) rather than ($b)**(-N)
                 $x = $class -> new("0.5");      # 1/$b
-                $x -> bpow($t - $expo) -> bmul($mant);
+                $x = $x -> bpow($t - $expo) -> bmul($mant);
             } else {
                 $x = $class -> new(2);
-                $x -> bpow($expo - $t) -> bmul($mant);
+                $x = $x -> bpow($expo - $t) -> bmul($mant);
             }
-            $x -> bneg() if $sign eq '-';
+            $x = $x -> bneg() if $sign eq '-';
         }
 
         if ($selfref) {
@@ -810,8 +815,8 @@ sub from_ieee754 {
             $self = $x;
         }
 
-        return $downgrade -> new($x, @r)
-          if defined($downgrade) && $x -> is_int();
+        return $downgrade -> new($self -> bdstr(), @r)
+          if defined($downgrade) && $self -> is_int();
         return $self -> round(@r);
     }
 
@@ -821,9 +826,12 @@ sub from_ieee754 {
 sub bzero {
     # create/assign '+0'
 
-    if (@_ == 0) {
-        #carp("Using bone() as a function is deprecated;",
-        #           " use bone() as a method instead");
+    # Class::method(...) -> Class->method(...)
+    unless (@_ && (defined(blessed($_[0])) && $_[0] -> isa(__PACKAGE__) ||
+                   $_[0] =~ /^[a-z]\w*(?:::[a-z]\w*)*$/i))
+    {
+        #carp "Using ", (caller(0))[3], "() as a function is deprecated;",
+        #  " use is as a method instead";
         unshift @_, __PACKAGE__;
     }
 
@@ -832,9 +840,18 @@ sub bzero {
     my $class   = $selfref || $self;
 
     $self->import() if $IMPORT == 0;            # make require work
-    return if $selfref && $self->modify('bzero');
 
-    return $downgrade->bzero() if defined $downgrade;
+    # Don't modify constant (read-only) objects.
+
+    return $self if $selfref && $self->modify('bzero');
+
+    # Get the rounding parameters, if any.
+
+    my @r = @_;
+
+    return $downgrade -> bzero(@r) if defined $downgrade;
+
+    # If called as a class method, initialize a new object.
 
     $self = bless {}, $class unless $selfref;
 
@@ -847,11 +864,13 @@ sub bzero {
     # parameters are given, and if called as a class method initialize the new
     # instance with the class variables.
 
-    if (@_) {
+    #return $self -> round(@r);  # this should work, but doesnt; fixme!
+
+    if (@r) {
         croak "can't specify both accuracy and precision"
-          if @_ >= 2 && defined $_[0] && defined $_[1];
-        $self->{_a} = $_[0];
-        $self->{_p} = $_[1];
+          if @r >= 2 && defined($r[0]) && defined($r[1]);
+        $self->{_a} = $r[0];
+        $self->{_p} = $r[1];
     } else {
         unless($selfref) {
             $self->{_a} = $class -> accuracy();
@@ -865,9 +884,12 @@ sub bzero {
 sub bone {
     # Create or assign '+1' (or -1 if given sign '-').
 
-    if (@_ == 0 || (defined($_[0]) && ($_[0] eq '+' || $_[0] eq '-'))) {
-        #carp("Using bone() as a function is deprecated;",
-        #           " use bone() as a method instead");
+    # Class::method(...) -> Class->method(...)
+    unless (@_ && (defined(blessed($_[0])) && $_[0] -> isa(__PACKAGE__) ||
+                   $_[0] =~ /^[a-z]\w*(?:::[a-z]\w*)*$/i))
+    {
+        #carp "Using ", (caller(0))[3], "() as a function is deprecated;",
+        #  " use is as a method instead";
         unshift @_, __PACKAGE__;
     }
 
@@ -876,12 +898,26 @@ sub bone {
     my $class   = $selfref || $self;
 
     $self->import() if $IMPORT == 0;            # make require work
-    return if $selfref && $self->modify('bone');
 
-    return $downgrade->bone() if defined $downgrade;
+    # Don't modify constant (read-only) objects.
+
+    return $self if $selfref && $self->modify('bone');
+
+    return $downgrade -> bone(@_) if defined $downgrade;
 
-    my $sign = shift;
-    $sign = defined $sign && $sign =~ /^\s*-/ ? "-" : "+";
+    # Get the sign.
+
+    my $sign = '+';     # default is to return +1
+    if (defined($_[0]) && $_[0] =~ /^\s*([+-])\s*$/) {
+        $sign = $1;
+        shift;
+    }
+
+    # Get the rounding parameters, if any.
+
+    my @r = @_;
+
+    # If called as a class method, initialize a new object.
 
     $self = bless {}, $class unless $selfref;
 
@@ -894,9 +930,11 @@ sub bone {
     # parameters are given, and if called as a class method initialize the new
     # instance with the class variables.
 
-    if (@_) {
+    #return $self -> round(@r);  # this should work, but doesnt; fixme!
+
+    if (@r) {
         croak "can't specify both accuracy and precision"
-          if @_ >= 2 && defined $_[0] && defined $_[1];
+          if @r >= 2 && defined($r[0]) && defined($r[1]);
         $self->{_a} = $_[0];
         $self->{_p} = $_[1];
     } else {
@@ -912,16 +950,15 @@ sub bone {
 sub binf {
     # create/assign a '+inf' or '-inf'
 
-    if (@_ == 0 || (defined($_[0]) && !ref($_[0]) &&
-                    $_[0] =~ /^\s*[+-](inf(inity)?)?\s*$/))
+    # Class::method(...) -> Class->method(...)
+    unless (@_ && (defined(blessed($_[0])) && $_[0] -> isa(__PACKAGE__) ||
+                   $_[0] =~ /^[a-z]\w*(?:::[a-z]\w*)*$/i))
     {
-        #carp("Using binf() as a function is deprecated;",
-        #           " use binf() as a method instead");
+        #carp "Using ", (caller(0))[3], "() as a function is deprecated;",
+        #  " use is as a method instead";
         unshift @_, __PACKAGE__;
     }
 
-    return $downgrade->binf(@_) if defined $downgrade;
-
     my $self    = shift;
     my $selfref = ref $self;
     my $class   = $selfref || $self;
@@ -934,10 +971,26 @@ sub binf {
     }
 
     $self->import() if $IMPORT == 0;            # make require work
-    return if $selfref && $self->modify('binf');
 
-    my $sign = shift;
-    $sign = defined $sign && $sign =~ /^\s*-/ ? "-" : "+";
+    # Don't modify constant (read-only) objects.
+
+    return $self if $selfref && $self->modify('binf');
+
+    return $downgrade -> binf(@_) if $downgrade;
+
+    # Get the sign.
+
+    my $sign = '+';     # default is to return positive infinity
+    if (defined($_[0]) && $_[0] =~ /^\s*([+-])(inf|$)/i) {
+        $sign = $1;
+        shift;
+    }
+
+    # Get the rounding parameters, if any.
+
+    my @r = @_;
+
+    # If called as a class method, initialize a new object.
 
     $self = bless {}, $class unless $selfref;
 
@@ -950,11 +1003,13 @@ sub binf {
     # parameters are given, and if called as a class method initialize the new
     # instance with the class variables.
 
-    if (@_) {
+    #return $self -> round(@r);  # this should work, but doesnt; fixme!
+
+    if (@r) {
         croak "can't specify both accuracy and precision"
-          if @_ >= 2 && defined $_[0] && defined $_[1];
-        $self->{_a} = $_[0];
-        $self->{_p} = $_[1];
+          if @r >= 2 && defined($r[0]) && defined($r[1]);
+        $self->{_a} = $r[0];
+        $self->{_p} = $r[1];
     } else {
         unless($selfref) {
             $self->{_a} = $class -> accuracy();
@@ -968,14 +1023,15 @@ sub binf {
 sub bnan {
     # create/assign a 'NaN'
 
-    if (@_ == 0) {
-        #carp("Using bnan() as a function is deprecated;",
-        #           " use bnan() as a method instead");
+    # Class::method(...) -> Class->method(...)
+    unless (@_ && (defined(blessed($_[0])) && $_[0] -> isa(__PACKAGE__) ||
+                   $_[0] =~ /^[a-z]\w*(?:::[a-z]\w*)*$/i))
+    {
+        #carp "Using ", (caller(0))[3], "() as a function is deprecated;",
+        #  " use is as a method instead";
         unshift @_, __PACKAGE__;
     }
 
-    return $downgrade->bnan(@_) if defined $downgrade;
-
     my $self    = shift;
     my $selfref = ref $self;
     my $class   = $selfref || $self;
@@ -988,7 +1044,18 @@ sub bnan {
     }
 
     $self->import() if $IMPORT == 0;            # make require work
-    return if $selfref && $self->modify('bnan');
+
+    # Don't modify constant (read-only) objects.
+
+    return $self if $selfref && $self->modify('bnan');
+
+    return $downgrade -> bnan(@_) if defined $downgrade;
+
+    # Get the rounding parameters, if any.
+
+    my @r = @_;
+
+    # If called as a class method, initialize a new object.
 
     $self = bless {}, $class unless $selfref;
 
@@ -1001,11 +1068,13 @@ sub bnan {
     # parameters are given, and if called as a class method initialize the new
     # instance with the class variables.
 
-    if (@_) {
+    #return $self -> round(@r);  # this should work, but doesnt; fixme!
+
+    if (@r) {
         croak "can't specify both accuracy and precision"
-          if @_ >= 2 && defined $_[0] && defined $_[1];
-        $self->{_a} = $_[0];
-        $self->{_p} = $_[1];
+          if @r >= 2 && defined($r[0]) && defined($r[1]);
+        $self->{_a} = $r[0];
+        $self->{_p} = $r[1];
     } else {
         unless($selfref) {
             $self->{_a} = $class -> accuracy();
@@ -1018,6 +1087,15 @@ sub bnan {
 
 sub bpi {
 
+    # Class::method(...) -> Class->method(...)
+    unless (@_ && (defined(blessed($_[0])) && $_[0] -> isa(__PACKAGE__) ||
+                   $_[0] =~ /^[a-z]\w*(?:::[a-z]\w*)*$/i))
+    {
+        #carp "Using ", (caller(0))[3], "() as a function is deprecated;",
+        #  " use is as a method instead";
+        unshift @_, __PACKAGE__;
+    }
+
     # Called as                 Argument list
     # ---------                 -------------
     # Math::BigFloat->bpi()     ("Math::BigFloat")
@@ -1039,35 +1117,12 @@ sub bpi {
     my $self    = shift;
     my $selfref = ref $self;
     my $class   = $selfref || $self;
+    my @r       = @_;                   # rounding paramters
 
-    my @r;                      # rounding paramters
-
-    # If bpi() is called as a function ...
-    #
-    # This cludge is necessary because we still support bpi() as a function. If
-    # bpi() is called with either no argument or one argument, and that one
-    # argument is either undefined or a scalar that looks like a number, then
-    # we assume bpi() is called as a function.
-
-    if (@_ == 0 &&
-        (defined($self) && !ref($self) && $self =~ /^\s*[+-]?\d/)
-          ||
-        !defined($self))
-    {
-        $r[0]  = $self;
-        $class = __PACKAGE__;
-        $self  = bless {}, $class;              # initialize
-    }
-
-    # ... or if bpi() is called as a method ...
-
-    else {
-        @r = @_;
-        if ($selfref) {                     # bpi() called as instance method
-            return $self if $self -> modify('bpi');
-        } else {                            # bpi() called as class method
-            $self  = bless {}, $class;      # initialize
-        }
+    if ($selfref) {                     # bpi() called as an instance method
+        return $self if $self -> modify('bpi');
+    } else {                            # bpi() called as a class method
+        $self  = bless {}, $class;      # initialize new instance
     }
 
     ($self, @r) = $self -> _find_round_parameters(@r);
@@ -1142,13 +1197,19 @@ EOF
             if ($last_digit lt '9') {
                 substr($digits, -1, 1) = ++$last_digit;
             } else {
-                $digits =~ s/([0-8])(9+)$/ ($1 + 1) . ("0" x CORE::length($2)) /e;
+                $digits =~ s{([0-8])(9+)$}
+                            { ($1 + 1) . ("0" x CORE::length($2)) }e;
             }
         }
 
-        # Append the exponent and convert to an object.
+        # Convert to an object.
 
-        $pi = Math::BigFloat -> new($digits . 'e-' . ($n - 1));
+        $pi = bless {
+                     sign => '+',
+                     _m   => $LIB -> _new($digits),
+                     _es  => '-',
+                     _e   => $LIB -> _new($n - 1),
+                    }, $class;
 
     } else {
 
@@ -1159,20 +1220,21 @@ EOF
         $n += 8;
 
         $HALF = $class -> new($HALF) unless ref($HALF);
-        my ($an, $bn, $tn, $pn) = ($class -> bone, $HALF -> copy() -> bsqrt($n),
-                                   $HALF -> copy() -> bmul($HALF), $class -> bone);
+        my ($an, $bn, $tn, $pn)
+          = ($class -> bone, $HALF -> copy() -> bsqrt($n),
+             $HALF -> copy() -> bmul($HALF), $class -> bone);
         while ($pn < $n) {
             my $prev_an = $an -> copy();
-            $an -> badd($bn) -> bmul($HALF, $n);
-            $bn -> bmul($prev_an) -> bsqrt($n);
-            $prev_an -> bsub($an);
-            $tn -> bsub($pn * $prev_an * $prev_an);
-            $pn -> badd($pn);
+            $an = $an -> badd($bn) -> bmul($HALF, $n);
+            $bn = $bn -> bmul($prev_an) -> bsqrt($n);
+            $prev_an = $prev_an -> bsub($an);
+            $tn = $tn -> bsub($pn * $prev_an * $prev_an);
+            $pn = $pn -> badd($pn);
         }
-        $an -> badd($bn);
-        $an -> bmul($an, $n) -> bdiv(4 * $tn, $n);
+        $an = $an -> badd($bn);
+        $an = $an -> bmul($an, $n) -> bdiv(4 * $tn, $n);
 
-        $an -> round(@r);
+        $an = $an -> round(@r);
         $pi = $an;
     }
 
@@ -1186,54 +1248,95 @@ EOF
         $self -> {$key} = $pi -> {$key};
     }
 
+    return $downgrade -> new($self -> bdstr(), @r)
+      if defined($downgrade) && $self->is_int();
     return $self;
 }
 
 sub copy {
-    my $self    = shift;
-    my $selfref = ref $self;
-    my $class   = $selfref || $self;
-
-    # If called as a class method, the object to copy is the next argument.
+    my ($x, $class);
+    if (ref($_[0])) {           # $y = $x -> copy()
+        $x = shift;
+        $class = ref($x);
+    } else {                    # $y = Math::BigInt -> copy($y)
+        $class = shift;
+        $x = shift;
+    }
 
-    $self = shift() unless $selfref;
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @_;
 
     my $copy = bless {}, $class;
 
-    $copy->{sign} = $self->{sign};
-    $copy->{_es}  = $self->{_es};
-    $copy->{_m}   = $LIB->_copy($self->{_m});
-    $copy->{_e}   = $LIB->_copy($self->{_e});
-    $copy->{_a}   = $self->{_a} if exists $self->{_a};
-    $copy->{_p}   = $self->{_p} if exists $self->{_p};
+    $copy->{sign} = $x->{sign};
+    $copy->{_es}  = $x->{_es};
+    $copy->{_m}   = $LIB->_copy($x->{_m});
+    $copy->{_e}   = $LIB->_copy($x->{_e});
+    $copy->{_a}   = $x->{_a} if exists $x->{_a};
+    $copy->{_p}   = $x->{_p} if exists $x->{_p};
 
     return $copy;
 }
 
-sub as_number {
+sub as_int {
     # return copy as a bigint representation of this Math::BigFloat number
-    my ($class, $x) = ref($_[0]) ? (ref($_[0]), $_[0]) : objectify(1, @_);
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
 
-    return $x if $x->modify('as_number');
+    return $x -> copy() if $x -> isa("Math::BigInt");
 
-    if (!$x->isa('Math::BigFloat')) {
-        # if the object can as_number(), use it
-        return $x->as_number() if $x->can('as_number');
-        # otherwise, get us a float and then a number
-        $x = $x->can('as_float') ? $x->as_float() : $class->new(0+"$x");
-    }
+    # disable upgrading and downgrading
 
-    return Math::BigInt->binf($x->sign()) if $x->is_inf();
-    return Math::BigInt->bnan()           if $x->is_nan();
+    require Math::BigInt;
+    my $upg = Math::BigInt -> upgrade();
+    my $dng = Math::BigInt -> downgrade();
+    Math::BigInt -> upgrade(undef);
+    Math::BigInt -> downgrade(undef);
 
-    my $z = $LIB->_copy($x->{_m});
-    if ($x->{_es} eq '-') {                     # < 0
-        $z = $LIB->_rsft($z, $x->{_e}, 10);
-    } elsif (! $LIB->_is_zero($x->{_e})) {      # > 0
-        $z = $LIB->_lsft($z, $x->{_e}, 10);
+    my $y;
+    if ($x -> is_inf()) {
+        $y = Math::BigInt -> binf($x->sign());
+    } elsif ($x -> is_nan()) {
+        $y = Math::BigInt -> bnan();
+    } else {
+        $y = $LIB->_copy($x->{_m});
+        if ($x->{_es} eq '-') {                     # < 0
+            $y = $LIB->_rsft($y, $x->{_e}, 10);
+        } elsif (! $LIB->_is_zero($x->{_e})) {      # > 0
+            $y = $LIB->_lsft($y, $x->{_e}, 10);
+        }
+        $y = Math::BigInt->new($x->{sign} . $LIB->_str($y));
     }
-    $z = Math::BigInt->new($x->{sign} . $LIB->_str($z));
-    $z;
+
+    # reset upgrading and downgrading
+
+    Math::BigInt -> upgrade($upg);
+    Math::BigInt -> downgrade($dng);
+
+    return $y;
+}
+
+sub as_float {
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
+
+    return $x -> copy() if $x -> isa("Math::BigFloat");
+
+    # disable upgrading and downgrading
+
+    require Math::BigFloat;
+    my $upg = Math::BigFloat -> upgrade();
+    my $dng = Math::BigFloat -> downgrade();
+    Math::BigFloat -> upgrade(undef);
+    Math::BigFloat -> downgrade(undef);
+
+    my $y = Math::BigFloat -> new($x);
+
+    # reset upgrading and downgrading
+
+    Math::BigFloat -> upgrade($upg);
+    Math::BigFloat -> downgrade($dng);
+
+    return $y;
 }
 
 ###############################################################################
@@ -1242,14 +1345,14 @@ sub as_number {
 
 sub is_zero {
     # return true if arg (BFLOAT or num_str) is zero
-    my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_);
+    my (undef, $x) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
 
     ($x->{sign} eq '+' && $LIB->_is_zero($x->{_m})) ? 1 : 0;
 }
 
 sub is_one {
     # return true if arg (BFLOAT or num_str) is +1 or -1 if signis given
-    my ($class, $x, $sign) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
+    my (undef, $x, $sign) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
 
     $sign = '+' if !defined $sign || $sign ne '-';
 
@@ -1260,7 +1363,7 @@ sub is_one {
 
 sub is_odd {
     # return true if arg (BFLOAT or num_str) is odd or false if even
-    my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_);
+    my (undef, $x) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
 
     (($x->{sign} =~ /^[+-]$/) && # NaN & +-inf aren't
      ($LIB->_is_zero($x->{_e})) &&
@@ -1269,7 +1372,7 @@ sub is_odd {
 
 sub is_even {
     # return true if arg (BINT or num_str) is even or false if odd
-    my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_);
+    my (undef, $x) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
 
     (($x->{sign} =~ /^[+-]$/) &&        # NaN & +-inf aren't
      ($x->{_es} eq '+') &&              # 123.45 isn't
@@ -1278,7 +1381,7 @@ sub is_even {
 
 sub is_int {
     # return true if arg (BFLOAT or num_str) is an integer
-    my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_);
+    my (undef, $x) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
 
     (($x->{sign} =~ /^[+-]$/) && # NaN and +-inf aren't
      ($x->{_es} eq '+')) ? 1 : 0; # 1e-1 => no integer
@@ -1292,15 +1395,11 @@ sub bcmp {
     # Compares 2 values.  Returns one of undef, <0, =0, >0. (suitable for sort)
 
     # set up parameters
-    my ($class, $x, $y) = (ref($_[0]), @_);
-
-    # objectify is costly, so avoid it
-    if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) {
-        ($class, $x, $y) = objectify(2, @_);
-    }
+    my ($class, $x, $y, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+                            ? (ref($_[0]), @_)
+                            : objectify(2, @_);
 
-    return $upgrade->bcmp($x, $y) if defined $upgrade &&
-      ((!$x->isa($class)) || (!$y->isa($class)));
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
 
     # Handle all 'nan' cases.
 
@@ -1339,8 +1438,9 @@ sub bcmp {
     my $mxl = $LIB->_len($x->{_m});
     my $myl = $LIB->_len($y->{_m});
 
-    # If the mantissas have the same length, there is no point in normalizing the
-    # exponents by the length of the mantissas, so treat that as a special case.
+    # If the mantissas have the same length, there is no point in normalizing
+    # the exponents by the length of the mantissas, so treat that as a special
+    # case.
 
     if ($mxl == $myl) {
 
@@ -1378,8 +1478,8 @@ sub bcmp {
 
     if ($x->{_es} eq '+') {
 
-        # If the exponent of x is >= 0 and the exponent of y is >= 0, there is no
-        # need to do anything special.
+        # If the exponent of x is >= 0 and the exponent of y is >= 0, there is
+        # no need to do anything special.
 
         if ($y->{_es} eq '+') {
             $ex = $LIB->_copy($x->{_e});
@@ -1428,8 +1528,8 @@ sub bcmp {
     return $cmp if $cmp;
 
     # Compare the mantissas, but first normalize them by padding the shorter
-    # mantissa with zeros (shift left) until it has the same length as the longer
-    # mantissa.
+    # mantissa with zeros (shift left) until it has the same length as the
+    # longer mantissa.
 
     my $mx = $x->{_m};
     my $my = $y->{_m};
@@ -1451,14 +1551,11 @@ sub bacmp {
     # Returns one of undef, <0, =0, >0. (suitable for sort)
 
     # set up parameters
-    my ($class, $x, $y) = (ref($_[0]), @_);
-    # objectify is costly, so avoid it
-    if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) {
-        ($class, $x, $y) = objectify(2, @_);
-    }
+    my ($class, $x, $y, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+                            ? (ref($_[0]), @_)
+                            : objectify(2, @_);
 
-    return $upgrade->bacmp($x, $y) if defined $upgrade &&
-      ((!$x->isa($class)) || (!$y->isa($class)));
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
 
     # handle +-inf and NaN's
     if ($x->{sign} !~ /^[+-]$/ || $y->{sign} !~ /^[+-]$/) {
@@ -1509,25 +1606,33 @@ sub bacmp {
 sub bneg {
     # (BINT or num_str) return BINT
     # negate number or make a negated number from string
-    my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_);
+    my (undef, $x, @r) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
 
     return $x if $x->modify('bneg');
 
-    # for +0 do not negate (to have always normalized +0). Does nothing for 'NaN'
-    $x->{sign} =~ tr/+-/-+/ unless ($x->{sign} eq '+' && $LIB->_is_zero($x->{_m}));
+    return $x -> bnan(@r) if $x -> is_nan();
 
-    return $downgrade -> new($x)
-      if defined($downgrade) && ($x -> is_int() || $x -> is_inf() || $x -> is_nan());
-    return $x;
+    # For +0 do not negate (to have always normalized +0).
+    $x->{sign} =~ tr/+-/-+/
+      unless $x->{sign} eq '+' && $LIB->_is_zero($x->{_m});
+
+    return $downgrade -> new($x -> bdstr(), @r) if defined($downgrade)
+      && ($x -> is_int() || $x -> is_inf() || $x -> is_nan());
+    return $x -> round(@r);
 }
 
 sub bnorm {
+    # bnorm() can't support rounding, because bround() and bfround() call
+    # bnorm(), which would recurse indefinitely.
+
     # adjust m and e so that m is smallest possible
-    my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_);
+    my (undef, $x, @r) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
+
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
 
     # inf, nan etc
     if ($x->{sign} !~ /^[+-]$/) {
-        return $downgrade->new($x) if defined $downgrade;
+        return $downgrade -> new($x) if defined $downgrade;
         return $x;
     }
 
@@ -1548,13 +1653,17 @@ sub bnorm {
         }
     } else {
         # $x can only be 0Ey if there are no trailing zeros ('0' has 0 trailing
-        # zeros). So, for something like 0Ey, set y to 1, and -0 => +0
-        $x->{sign} = '+', $x->{_es} = '+', $x->{_e} = $LIB->_one()
-          if $LIB->_is_zero($x->{_m});
+        # zeros). So, for something like 0Ey, set y to 0, and -0 => +0
+        if ($LIB->_is_zero($x->{_m})) {
+            $x->{sign} = '+';
+            $x->{_es}  = '+';
+            $x->{_e}   = $LIB->_zero();
+        }
     }
 
-    return $downgrade->new($x) if defined($downgrade) && $x->is_int();
-    $x;
+    return $downgrade -> new($x)
+      if defined($downgrade) && $x->is_int();
+    return $x;
 }
 
 sub binc {
@@ -1563,19 +1672,28 @@ sub binc {
 
     return $x if $x->modify('binc');
 
+    # Inf and NaN
+
+    return $x -> bnan(@r)             if $x -> is_nan();
+    return $x -> binf($x->{sign}, @r) if $x -> is_inf();
+
+    # Non-integer
+
     if ($x->{_es} eq '-') {
-        return $x->badd($class->bone(), @r); #  digits after dot
+        return $x->badd($class->bone(), @r);
     }
 
-    if (!$LIB->_is_zero($x->{_e})) # _e == 0 for NaN, inf, -inf
-    {
-        # 1e2 => 100, so after the shift below _m has a '0' as last digit
+    # If the exponent is non-zero, convert the internal representation, so that,
+    # e.g., 12e+3 becomes 12000e+0 and we can easily increment the mantissa.
+
+    if (!$LIB->_is_zero($x->{_e})) {
         $x->{_m} = $LIB->_lsft($x->{_m}, $x->{_e}, 10); # 1e2 => 100
-        $x->{_e} = $LIB->_zero();                      # normalize
+        $x->{_e} = $LIB->_zero();                       # normalize
         $x->{_es} = '+';
         # we know that the last digit of $x will be '1' or '9', depending on the
         # sign
     }
+
     # now $x->{_e} == 0
     if ($x->{sign} eq '+') {
         $x->{_m} = $LIB->_inc($x->{_m});
@@ -1585,8 +1703,10 @@ sub binc {
         $x->{sign} = '+' if $LIB->_is_zero($x->{_m}); # -1 +1 => -0 => +0
         return $x->bnorm()->bround(@r);
     }
-    # inf, nan handling etc
-    $x->badd($class->bone(), @r); # badd() does round
+
+    return $downgrade -> new($x -> bdstr(), @r)
+      if defined($downgrade) && $x -> is_int();
+    return $x;
 }
 
 sub bdec {
@@ -1595,78 +1715,82 @@ sub bdec {
 
     return $x if $x->modify('bdec');
 
+    # Inf and NaN
+
+    return $x -> bnan(@r)             if $x -> is_nan();
+    return $x -> binf($x->{sign}, @r) if $x -> is_inf();
+
+    # Non-integer
+
     if ($x->{_es} eq '-') {
-        return $x->badd($class->bone('-'), @r); #  digits after dot
+        return $x->badd($class->bone('-'), @r);
     }
 
+    # If the exponent is non-zero, convert the internal representation, so that,
+    # e.g., 12e+3 becomes 12000e+0 and we can easily increment the mantissa.
+
     if (!$LIB->_is_zero($x->{_e})) {
         $x->{_m} = $LIB->_lsft($x->{_m}, $x->{_e}, 10); # 1e2 => 100
-        $x->{_e} = $LIB->_zero();                      # normalize
+        $x->{_e} = $LIB->_zero();                       # normalize
         $x->{_es} = '+';
     }
+
     # now $x->{_e} == 0
     my $zero = $x->is_zero();
-    # <= 0
-    if (($x->{sign} eq '-') || $zero) {
+    if (($x->{sign} eq '-') || $zero) {           # x <= 0
         $x->{_m} = $LIB->_inc($x->{_m});
         $x->{sign} = '-' if $zero;                # 0 => 1 => -1
         $x->{sign} = '+' if $LIB->_is_zero($x->{_m}); # -1 +1 => -0 => +0
         return $x->bnorm()->round(@r);
     }
-    # > 0
-    elsif ($x->{sign} eq '+') {
+    elsif ($x->{sign} eq '+') {                   # x > 0
         $x->{_m} = $LIB->_dec($x->{_m});
         return $x->bnorm()->round(@r);
     }
-    # inf, nan handling etc
-    $x->badd($class->bone('-'), @r); # does round
+
+    return $downgrade -> new($x -> bdstr(), @r)
+      if defined($downgrade) && $x -> is_int();
+    return $x -> round(@r);
 }
 
 sub badd {
-    # add second arg (BFLOAT or string) to first (BFLOAT) (modifies first)
-    # return result as BFLOAT
-
     # set up parameters
-    my ($class, $x, $y, @r) = (ref($_[0]), @_);
-
-    # objectify is costly, so avoid it
-    if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) {
-        ($class, $x, $y, @r) = objectify(2, @_);
-    }
+    my ($class, $x, $y, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+                            ? (ref($_[0]), @_)
+                            : objectify(2, @_);
 
     return $x if $x->modify('badd');
 
     # inf and NaN handling
     if ($x->{sign} !~ /^[+-]$/ || $y->{sign} !~ /^[+-]$/) {
 
-        # NaN first
+        # $x is NaN and/or $y is NaN
         if ($x->{sign} eq $nan || $y->{sign} eq $nan) {
-            $x->bnan();
+            $x = $x->bnan();
         }
 
-        # inf handling
+        # $x is Inf and $y is Inf
         elsif ($x->{sign} =~ /^[+-]inf$/ && $y->{sign} =~ /^[+-]inf$/) {
-            # +inf++inf or -inf+-inf => same, rest is NaN
-            $x->bnan() if $x->{sign} ne $y->{sign};
+            # +Inf + +Inf or -Inf + -Inf => same, rest is NaN
+            $x = $x->bnan() if $x->{sign} ne $y->{sign};
         }
 
-        # +-inf + something => +inf; something +-inf => +-inf
+        # +-inf + something => +-inf; something +-inf => +-inf
         elsif ($y->{sign} =~ /^[+-]inf$/) {
             $x->{sign} = $y->{sign};
         }
 
-        return $downgrade->new($x, @r) if defined $downgrade;
-        return $x;
+        return $downgrade -> new($x -> bdstr(), @r) if defined $downgrade;
+        return $x -> round(@r);
     }
 
-    return $upgrade->badd($x, $y, @r) if defined $upgrade &&
-      ((!$x->isa($class)) || (!$y->isa($class)));
+    return $upgrade->badd($x, $y, @r) if defined $upgrade;
 
     $r[3] = $y;                 # no push!
 
     # for speed: no add for $x + 0
     if ($y->is_zero()) {
-        $x->bround(@r);
+        $x = $x->round(@r);
     }
 
     # for speed: no add for 0 + $y
@@ -1676,9 +1800,10 @@ sub badd {
         $x->{_es} = $y->{_es};
         $x->{_m} = $LIB->_copy($y->{_m});
         $x->{sign} = $y->{sign} || $nan;
-        $x->round(@r);
+        $x = $x->round(@r);
     }
 
+    # both $x and $y are non-zero
     else {
 
         # take lower of the two e's and adapt m1 to it to match m2
@@ -1688,16 +1813,13 @@ sub badd {
 
         my $es;
 
-        ($e, $es) = _e_sub($e, $x->{_e}, $y->{_es} || '+', $x->{_es});
-        #($e, $es) = $LIB -> _ssub($e, $y->{_es} || '+', $x->{_e}, $x->{_es});
+        ($e, $es) = $LIB -> _ssub($e, $y->{_es} || '+', $x->{_e}, $x->{_es});
 
         my $add = $LIB->_copy($y->{_m});
 
         if ($es eq '-') {                       # < 0
             $x->{_m} = $LIB->_lsft($x->{_m}, $e, 10);
-            ($x->{_e}, $x->{_es}) = _e_add($x->{_e}, $e, $x->{_es}, $es);
-            #$x->{_m} = $LIB->_lsft($x->{_m}, $e, 10);
-            #($x->{_e}, $x->{_es}) = $LIB -> _sadd($x->{_e}, $x->{_es}, $e, $es);
+            ($x->{_e}, $x->{_es}) = $LIB -> _sadd($x->{_e}, $x->{_es}, $e, $es);
         } elsif (!$LIB->_is_zero($e)) {         # > 0
             $add = $LIB->_lsft($add, $e, 10);
         }
@@ -1708,38 +1830,28 @@ sub badd {
             $x->{_m} = $LIB->_add($x->{_m}, $add);
         } else {
             ($x->{_m}, $x->{sign}) =
-              _e_add($x->{_m}, $add, $x->{sign}, $y->{sign});
-            #($x->{_m}, $x->{sign}) =
-            #  $LIB -> _sadd($x->{_m}, $x->{sign}, $add, $y->{sign});
+              $LIB -> _sadd($x->{_m}, $x->{sign}, $add, $y->{sign});
         }
 
         # delete trailing zeros, then round
-        $x->bnorm()->round(@r);
+        $x = $x->bnorm()->round(@r);
     }
 
-    return $downgrade->new($x, @r) if defined($downgrade) && $x -> is_int();
-    return $x;
+    return $downgrade -> new($x -> bdstr(), @r)
+      if defined($downgrade) && $x -> is_int();
+    return $x;          # rounding already done above
 }
 
 sub bsub {
-    # (BINT or num_str, BINT or num_str) return BINT
-    # subtract second arg from first, modify first
-
     # set up parameters
-    my ($class, $x, $y, @r) = (ref($_[0]), @_);
-
-    # objectify is costly, so avoid it
-    if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) {
-        ($class, $x, $y, @r) = objectify(2, @_);
-    }
+    my ($class, $x, $y, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+                            ? (ref($_[0]), @_)
+                            : objectify(2, @_);
 
     return $x if $x -> modify('bsub');
 
-    return $upgrade -> new($x) -> bsub($upgrade -> new($y), @r)
-      if defined $upgrade && (!$x -> isa($class) || !$y -> isa($class));
-
     if ($y -> is_zero()) {
-        $x -> round(@r);
+        $x = $x -> round(@r);
     } else {
 
         # To correctly handle the special case $x -> bsub($x), we note the sign
@@ -1751,17 +1863,18 @@ sub bsub {
         if ($xsign ne $x -> {sign}) {
             # special case of $x -> bsub($x) results in 0
             if ($xsign =~ /^[+-]$/) {
-                $x -> bzero(@r);
+                $x = $x -> bzero(@r);
             } else {
-                $x -> bnan();           # NaN, -inf, +inf
+                $x = $x -> bnan();      # NaN, -inf, +inf
             }
-            return $downgrade->new($x, @r) if defined $downgrade;
-            return $x;
+            return $downgrade -> new($x -> bdstr(), @r) if defined $downgrade;
+            return $x -> round(@r);
         }
         $x = $x -> badd($y, @r);        # badd does not leave internal zeros
         $y -> {sign} =~ tr/+-/-+/;      # reset $y (does nothing for NaN)
     }
-    return $downgrade->new($x, @r)
+
+    return $downgrade -> new($x -> bdstr(), @r)
       if defined($downgrade) && ($x->is_int() || $x->is_inf() || $x->is_nan());
     $x;                         # already rounded by badd() or no rounding
 }
@@ -1770,72 +1883,73 @@ sub bmul {
     # multiply two numbers
 
     # set up parameters
-    my ($class, $x, $y, @r) = (ref($_[0]), @_);
-    # objectify is costly, so avoid it
-    if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) {
-        ($class, $x, $y, @r) = objectify(2, @_);
-    }
+    my ($class, $x, $y, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+                            ? (ref($_[0]), @_)
+                            : objectify(2, @_);
 
     return $x if $x->modify('bmul');
 
-    return $x->bnan() if (($x->{sign} eq $nan) || ($y->{sign} eq $nan));
+    return $x->bnan(@r) if ($x->{sign} eq $nan) || ($y->{sign} eq $nan);
 
     # inf handling
     if (($x->{sign} =~ /^[+-]inf$/) || ($y->{sign} =~ /^[+-]inf$/)) {
-        return $x->bnan() if $x->is_zero() || $y->is_zero();
+        return $x->bnan(@r) if $x->is_zero() || $y->is_zero();
         # result will always be +-inf:
         # +inf * +/+inf => +inf, -inf * -/-inf => +inf
         # +inf * -/-inf => -inf, -inf * +/+inf => -inf
-        return $x->binf() if ($x->{sign} =~ /^\+/ && $y->{sign} =~ /^\+/);
-        return $x->binf() if ($x->{sign} =~ /^-/ && $y->{sign} =~ /^-/);
-        return $x->binf('-');
+        return $x->binf(@r) if ($x->{sign} =~ /^\+/ && $y->{sign} =~ /^\+/);
+        return $x->binf(@r) if ($x->{sign} =~ /^-/ && $y->{sign} =~ /^-/);
+        return $x->binf('-', @r);
     }
 
-    return $upgrade->bmul($x, $y, @r) if defined $upgrade &&
-      ((!$x->isa($class)) || (!$y->isa($class)));
+    return $upgrade->bmul($x, $y, @r) if defined $upgrade;
 
     # aEb * cEd = (a*c)E(b+d)
     $x->{_m} = $LIB->_mul($x->{_m}, $y->{_m});
-    ($x->{_e}, $x->{_es}) = _e_add($x->{_e}, $y->{_e}, $x->{_es}, $y->{_es});
-    #($x->{_e}, $x->{_es}) = $LIB -> _sadd($x->{_e}, $x->{_es}, $y->{_e}, $y->{_es});
+    ($x->{_e}, $x->{_es})
+      = $LIB -> _sadd($x->{_e}, $x->{_es}, $y->{_e}, $y->{_es});
 
     $r[3] = $y;                 # no push!
 
     # adjust sign:
     $x->{sign} = $x->{sign} ne $y->{sign} ? '-' : '+';
-    $x->bnorm->round(@r);
+    $x = $x->bnorm->round(@r);
+
+    return $downgrade -> new($x -> bdstr(), @r)
+      if defined($downgrade) && ($x->is_int() || $x->is_inf() || $x->is_nan());
+    return $x;
 }
 
 sub bmuladd {
     # multiply two numbers and add the third to the result
 
     # set up parameters
-    my ($class, $x, $y, $z, @r) = objectify(3, @_);
+    my ($class, $x, $y, $z, @r)
+      = ref($_[0]) && ref($_[0]) eq ref($_[1]) && ref($_[1]) eq ref($_[2])
+      ? (ref($_[0]), @_)
+      : objectify(3, @_);
 
     return $x if $x->modify('bmuladd');
 
-    return $x->bnan() if (($x->{sign} eq $nan) ||
-                          ($y->{sign} eq $nan) ||
-                          ($z->{sign} eq $nan));
+    return $x->bnan(@r) if (($x->{sign} eq $nan) ||
+                            ($y->{sign} eq $nan) ||
+                            ($z->{sign} eq $nan));
 
     # inf handling
     if (($x->{sign} =~ /^[+-]inf$/) || ($y->{sign} =~ /^[+-]inf$/)) {
-        return $x->bnan() if $x->is_zero() || $y->is_zero();
+        return $x->bnan(@r) if $x->is_zero() || $y->is_zero();
         # result will always be +-inf:
         # +inf * +/+inf => +inf, -inf * -/-inf => +inf
         # +inf * -/-inf => -inf, -inf * +/+inf => -inf
-        return $x->binf() if ($x->{sign} =~ /^\+/ && $y->{sign} =~ /^\+/);
-        return $x->binf() if ($x->{sign} =~ /^-/ && $y->{sign} =~ /^-/);
-        return $x->binf('-');
+        return $x->binf(@r) if ($x->{sign} =~ /^\+/ && $y->{sign} =~ /^\+/);
+        return $x->binf(@r) if ($x->{sign} =~ /^-/ && $y->{sign} =~ /^-/);
+        return $x->binf('-', @r);
     }
 
-    return $upgrade->bmul($x, $y, @r) if defined $upgrade &&
-      ((!$x->isa($class)) || (!$y->isa($class)));
-
     # aEb * cEd = (a*c)E(b+d)
     $x->{_m} = $LIB->_mul($x->{_m}, $y->{_m});
-    ($x->{_e}, $x->{_es}) = _e_add($x->{_e}, $y->{_e}, $x->{_es}, $y->{_es});
-    #($x->{_e}, $x->{_es}) = $LIB -> _sadd($x->{_e}, $x->{_es}, $y->{_e}, $y->{_es});
+    ($x->{_e}, $x->{_es})
+      = $LIB -> _sadd($x->{_e}, $x->{_es}, $y->{_e}, $y->{_es});
 
     $r[3] = $y;                 # no push!
 
@@ -1845,8 +1959,8 @@ sub bmuladd {
     # z=inf handling (z=NaN handled above)
     if ($z->{sign} =~ /^[+-]inf$/) {
         $x->{sign} = $z->{sign};
-        return $downgrade->new($x) if defined $downgrade;
-        return $x;
+        return $downgrade -> new($x -> bdstr(), @r) if defined $downgrade;
+        return $x -> round(@r);
     }
 
     # take lower of the two e's and adapt m1 to it to match m2
@@ -1856,17 +1970,14 @@ sub bmuladd {
 
     my $es;
 
-    ($e, $es) = _e_sub($e, $x->{_e}, $z->{_es} || '+', $x->{_es});
-    #($e, $es) = $LIB -> _ssub($e, $z->{_es} || '+', $x->{_e}, $x->{_es});
+    ($e, $es) = $LIB -> _ssub($e, $z->{_es} || '+', $x->{_e}, $x->{_es});
 
     my $add = $LIB->_copy($z->{_m});
 
     if ($es eq '-')             # < 0
     {
         $x->{_m} = $LIB->_lsft($x->{_m}, $e, 10);
-        ($x->{_e}, $x->{_es}) = _e_add($x->{_e}, $e, $x->{_es}, $es);
-        #$x->{_m} = $LIB->_lsft($x->{_m}, $e, 10);
-        #($x->{_e}, $x->{_es}) = $LIB -> _sadd($x->{_e}, $x->{_es}, $e, $es);
+        ($x->{_e}, $x->{_es}) = $LIB -> _sadd($x->{_e}, $x->{_es}, $e, $es);
     } elsif (!$LIB->_is_zero($e)) # > 0
     {
         $add = $LIB->_lsft($add, $e, 10);
@@ -1878,13 +1989,15 @@ sub bmuladd {
         $x->{_m} = $LIB->_add($x->{_m}, $add);
     } else {
         ($x->{_m}, $x->{sign}) =
-          _e_add($x->{_m}, $add, $x->{sign}, $z->{sign});
-        #($x->{_m}, $x->{sign}) =
-        #  $LIB -> _sadd($x->{_m}, $x->{sign}, $add, $z->{sign});
+          $LIB -> _sadd($x->{_m}, $x->{sign}, $add, $z->{sign});
     }
 
     # delete trailing zeros, then round
-    $x->bnorm()->round(@r);
+    $x = $x->bnorm()->round(@r);
+
+    return $downgrade -> new($x -> bdstr(), @r)
+      if defined($downgrade) && ($x->is_int() || $x->is_inf() || $x->is_nan());
+    return $x;
 }
 
 sub bdiv {
@@ -1892,10 +2005,10 @@ sub bdiv {
     # (BFLOAT, BFLOAT) (quo, rem) or BFLOAT (only quo)
 
     # set up parameters
-    my ($class, $x, $y, $a, $p, $r) = (ref($_[0]), @_);
+    my ($class, $x, $y, @r) = (ref($_[0]), @_);
     # objectify is costly, so avoid it
     if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) {
-        ($class, $x, $y, $a, $p, $r) = objectify(2, @_);
+        ($class, $x, $y, @r) = objectify(2, @_);
     }
 
     return $x if $x->modify('bdiv');
@@ -1906,7 +2019,8 @@ sub bdiv {
     # Math::BigInt -> bdiv().
 
     if ($x -> is_nan() || $y -> is_nan()) {
-        return $wantarray ? ($x -> bnan(), $class -> bnan()) : $x -> bnan();
+        return $wantarray ? ($x -> bnan(@r), $class -> bnan(@r))
+                          : $x -> bnan(@r);
     }
 
     # Divide by zero and modulo zero. This is handled the same way as in
@@ -1916,12 +2030,14 @@ sub bdiv {
     if ($y -> is_zero()) {
         my ($quo, $rem);
         if ($wantarray) {
-            $rem = $x -> copy();
+            $rem = $x -> copy() -> round(@r);
+            $rem = $downgrade -> new($rem, @r)
+              if defined($downgrade) && $rem -> is_int();
         }
         if ($x -> is_zero()) {
-            $quo = $x -> bnan();
+            $quo = $x -> bnan(@r);
         } else {
-            $quo = $x -> binf($x -> {sign});
+            $quo = $x -> binf($x -> {sign}, @r);
         }
         return $wantarray ? ($quo, $rem) : $quo;
     }
@@ -1932,12 +2048,12 @@ sub bdiv {
 
     if ($x -> is_inf()) {
         my ($quo, $rem);
-        $rem = $class -> bnan() if $wantarray;
+        $rem = $class -> bnan(@r) if $wantarray;
         if ($y -> is_inf()) {
-            $quo = $x -> bnan();
+            $quo = $x -> bnan(@r);
         } else {
             my $sign = $x -> bcmp(0) == $y -> bcmp(0) ? '+' : '-';
-            $quo = $x -> binf($sign);
+            $quo = $x -> binf($sign, @r);
         }
         return $wantarray ? ($quo, $rem) : $quo;
     }
@@ -1952,19 +2068,21 @@ sub bdiv {
         my ($quo, $rem);
         if ($wantarray) {
             if ($x -> is_zero() || $x -> bcmp(0) == $y -> bcmp(0)) {
-                $rem = $x -> copy();
-                $quo = $x -> bzero();
+                $rem = $x -> copy() -> round(@r);
+                $rem = $downgrade -> new($rem, @r)
+                  if defined($downgrade) && $rem -> is_int();
+                $quo = $x -> bzero(@r);
             } else {
-                $rem = $class -> binf($y -> {sign});
-                $quo = $x -> bone('-');
+                $rem = $class -> binf($y -> {sign}, @r);
+                $quo = $x -> bone('-', @r);
             }
             return ($quo, $rem);
         } else {
             if ($y -> is_inf()) {
                 if ($x -> is_nan() || $x -> is_inf()) {
-                    return $x -> bnan();
+                    return $x -> bnan(@r);
                 } else {
-                    return $x -> bzero();
+                    return $x -> bzero(@r);
                 }
             }
         }
@@ -1974,21 +2092,37 @@ sub bdiv {
     # the denominator (divisor) is non-zero.
 
     # x == 0?
-    return wantarray ? ($x, $class->bzero()) : $x if $x->is_zero();
+    if ($x->is_zero()) {
+        my ($quo, $rem);
+        $quo = $x->round(@r);
+        $quo = $downgrade -> new($quo, @r)
+          if defined($downgrade) && $quo -> is_int();
+        if ($wantarray) {
+            $rem = $class -> bzero(@r);
+            return $quo, $rem;
+        }
+        return $quo;
+    }
+
+    # Division might return a value that we can not represent exactly, so
+    # upgrade, if upgrading is enabled.
+
+    return $upgrade -> bdiv($x, $y, @r)
+      if defined($upgrade) && !wantarray && !$LIB -> _is_one($y -> {_m});
 
     # we need to limit the accuracy to protect against overflow
     my $fallback = 0;
     my (@params, $scale);
-    ($x, @params) = $x->_find_round_parameters($a, $p, $r, $y);
+    ($x, @params) = $x->_find_round_parameters($r[0], $r[1], $r[2], $y);
 
-    return $x if $x->is_nan();  # error in _find_round_parameters?
+    return $x -> round(@r) if $x->is_nan();  # error in _find_round_parameters?
 
     # no rounding at all, so must use fallback
     if (scalar @params == 0) {
         # simulate old behaviour
         $params[0] = $class->div_scale(); # and round to it as accuracy
         $scale = $params[0]+4;            # at least four more for proper round
-        $params[2] = $r;                  # round mode by caller or undef
+        $params[2] = $r[2];               # round mode by caller or undef
         $fallback = 1;                    # to clear a/p afterwards
     } else {
         # the 4 below is empirical, and there might be cases where it is not
@@ -2001,7 +2135,8 @@ sub bdiv {
 
     $y = $class->new($y) unless $y->isa('Math::BigFloat');
 
-    my $lx = $LIB -> _len($x->{_m}); my $ly = $LIB -> _len($y->{_m});
+    my $lx = $LIB -> _len($x->{_m});
+    my $ly = $LIB -> _len($y->{_m});
     $scale = $lx if $lx > $scale;
     $scale = $ly if $ly > $scale;
     my $diff = $ly - $lx;
@@ -2017,13 +2152,14 @@ sub bdiv {
 
     if ($xsign ne $x->{sign}) {
         # special case of $x /= $x results in 1
-        $x->bone();             # "fixes" also sign of $y, since $x is $y
+        $x = $x->bone();        # "fixes" also sign of $y, since $x is $y
     } else {
         # correct $y's sign again
         $y->{sign} =~ tr/+-/-+/;
         # continue with normal div code:
 
-        # make copy of $x in case of list context for later remainder calculation
+        # make copy of $x in case of list context for later remainder
+        # calculation
         if (wantarray && $y_not_one) {
             $rem = $x->copy();
         }
@@ -2032,7 +2168,8 @@ sub bdiv {
 
         # check for / +-1 (+/- 1E0)
         if ($y_not_one) {
-            # promote BigInts and it's subclasses (except when already a Math::BigFloat)
+            # promote Math::BigInt and its subclasses (except when already a
+            # Math::BigFloat)
             $y = $class->new($y) unless $y->isa('Math::BigFloat');
 
             # calculate the result to $scale digits and then round it
@@ -2041,80 +2178,77 @@ sub bdiv {
             $x->{_m} = $LIB->_div($x->{_m}, $y->{_m}); # a/c
 
             # correct exponent of $x
-            ($x->{_e}, $x->{_es}) = _e_sub($x->{_e}, $y->{_e}, $x->{_es}, $y->{_es});
-            #($x->{_e}, $x->{_es})
-            #  = $LIB -> _ssub($x->{_e}, $x->{_es}, $y->{_e}, $y->{_es});
+            ($x->{_e}, $x->{_es})
+              = $LIB -> _ssub($x->{_e}, $x->{_es}, $y->{_e}, $y->{_es});
             # correct for 10**scale
-            ($x->{_e}, $x->{_es}) = _e_sub($x->{_e}, $LIB->_new($scale), $x->{_es}, '+');
-            #($x->{_e}, $x->{_es})
-            #  = $LIB -> _ssub($x->{_e}, $x->{_es}, $LIB->_new($scale), '+');
-            $x->bnorm();        # remove trailing 0's
+            ($x->{_e}, $x->{_es})
+              = $LIB -> _ssub($x->{_e}, $x->{_es}, $LIB->_new($scale), '+');
+            $x = $x->bnorm();   # remove trailing 0's
         }
     }                           # end else $x != $y
 
     # shortcut to not run through _find_round_parameters again
     if (defined $params[0]) {
         delete $x->{_a};               # clear before round
-        $x->bround($params[0], $params[2]); # then round accordingly
+        $x = $x->bround($params[0], $params[2]); # then round accordingly
     } else {
         delete $x->{_p};                # clear before round
-        $x->bfround($params[1], $params[2]); # then round accordingly
+        $x = $x->bfround($params[1], $params[2]); # then round accordingly
     }
     if ($fallback) {
         # clear a/p after round, since user did not request it
-        delete $x->{_a}; delete $x->{_p};
+        delete $x->{_a};
+        delete $x->{_p};
     }
 
     if (wantarray) {
         if ($y_not_one) {
-            $x -> bfloor();
-            $rem->bmod($y, @params); # copy already done
+            $x = $x -> bfloor();
+            $rem = $rem->bmod($y, @params); # copy already done
         }
         if ($fallback) {
             # clear a/p after round, since user did not request it
-            delete $rem->{_a}; delete $rem->{_p};
+            delete $rem->{_a};
+            delete $rem->{_p};
         }
-        $x = $downgrade -> new($x)
+        $x = $downgrade -> new($x -> bdstr(), @r)
           if defined($downgrade) && $x -> is_int();
-        $rem = $downgrade -> new($rem)
+        $rem = $downgrade -> new($rem -> bdstr(), @r)
           if defined($downgrade) && $rem -> is_int();
         return ($x, $rem);
     }
 
-    $x = $downgrade -> new($x) if defined($downgrade) && $x -> is_int();
-    $x;
+    $x = $downgrade -> new($x, @r)
+      if defined($downgrade) && $x -> is_int();
+    $x;         # rounding already done above
 }
 
 sub bmod {
     # (dividend: BFLOAT or num_str, divisor: BFLOAT or num_str) return remainder
 
     # set up parameters
-    my ($class, $x, $y, $a, $p, $r) = (ref($_[0]), @_);
-    # objectify is costly, so avoid it
-    if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) {
-        ($class, $x, $y, $a, $p, $r) = objectify(2, @_);
-    }
+    my ($class, $x, $y, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+                            ? (ref($_[0]), @_)
+                            : objectify(2, @_);
 
     return $x if $x->modify('bmod');
 
     # At least one argument is NaN. This is handled the same way as in
     # Math::BigInt -> bmod().
 
-    if ($x -> is_nan() || $y -> is_nan()) {
-        return $x -> bnan();
-    }
+    return $x -> bnan(@r) if $x -> is_nan() || $y -> is_nan();
 
     # Modulo zero. This is handled the same way as in Math::BigInt -> bmod().
 
     if ($y -> is_zero()) {
-        return $x;
+        return $x -> round(@r);
     }
 
     # Numerator (dividend) is +/-inf. This is handled the same way as in
     # Math::BigInt -> bmod().
 
     if ($x -> is_inf()) {
-        return $x -> bnan();
+        return $x -> bnan(@r);
     }
 
     # Denominator (divisor) is +/-inf. This is handled the same way as in
@@ -2122,20 +2256,20 @@ sub bmod {
 
     if ($y -> is_inf()) {
         if ($x -> is_zero() || $x -> bcmp(0) == $y -> bcmp(0)) {
-            return $x;
+            return $x -> round(@r);
         } else {
-            return $x -> binf($y -> sign());
+            return $x -> binf($y -> sign(), @r);
         }
     }
 
-    return $x->bzero() if $x->is_zero()
+    return $x->bzero(@r) if $x->is_zero()
       || ($x->is_int() &&
           # check that $y == +1 or $y == -1:
           ($LIB->_is_zero($y->{_e}) && $LIB->_is_one($y->{_m})));
 
     my $cmp = $x->bacmp($y);    # equal or $x < $y?
     if ($cmp == 0) {            # $x == $y => result 0
-        return $x -> bzero($a, $p);
+        return $x -> bzero(@r);
     }
 
     # only $y of the operands negative?
@@ -2143,7 +2277,7 @@ sub bmod {
 
     $x->{sign} = $y->{sign};     # calc sign first
     if ($cmp < 0 && $neg == 0) { # $x < $y => result $x
-        return $x -> round($a, $p, $r);
+        return $x -> round(@r);
     }
 
     my $ym = $LIB->_copy($y->{_m});
@@ -2158,7 +2292,8 @@ sub bmod {
     {
         # 123 % 2.5 => 1230 % 25 => 5 => 0.5
         $shifty = $LIB->_num($y->{_e});  # no more digits after dot
-        $x->{_m} = $LIB->_lsft($x->{_m}, $y->{_e}, 10); # 123 => 1230, $y->{_m} is already 25
+        # 123 => 1230, $y->{_m} is already 25
+        $x->{_m} = $LIB->_lsft($x->{_m}, $y->{_e}, 10);
     }
     # $ym is now mantissa of $y based on exponent 0
 
@@ -2184,48 +2319,60 @@ sub bmod {
     $x->{_m} = $LIB->_mod($x->{_m}, $ym);
 
     $x->{sign} = '+' if $LIB->_is_zero($x->{_m}); # fix sign for -0
-    $x->bnorm();
+    $x = $x->bnorm();
 
-    if ($neg != 0 && ! $x -> is_zero()) # one of them negative => correct in place
-    {
+    # if one of them negative => correct in place
+    if ($neg != 0 && ! $x -> is_zero()) {
         my $r = $y - $x;
         $x->{_m} = $r->{_m};
         $x->{_e} = $r->{_e};
         $x->{_es} = $r->{_es};
         $x->{sign} = '+' if $LIB->_is_zero($x->{_m}); # fix sign for -0
-        $x->bnorm();
+        $x = $x->bnorm();
     }
 
-    $x->round($a, $p, $r, $y);     # round and return
+    $x = $x->round($r[0], $r[1], $r[2], $y);
+    return $downgrade -> new($x -> bdstr(), @r)
+      if defined($downgrade) && ($x->is_int() || $x->is_inf() || $x->is_nan());
+    return $x;
 }
 
 sub bmodpow {
     # takes a very large number to a very large exponent in a given very
     # large modulus, quickly, thanks to binary exponentiation. Supports
     # negative exponents.
-    my ($class, $num, $exp, $mod) = objectify(3, @_);
+    my ($class, $num, $exp, $mod, @r)
+      = ref($_[0]) && ref($_[0]) eq ref($_[1]) && ref($_[1]) eq ref($_[2])
+      ? (ref($_[0]), @_)
+      : objectify(3, @_);
 
     return $num if $num->modify('bmodpow');
 
+    return $num -> bnan(@r)
+      if $mod->is_nan() || $exp->is_nan() || $mod->is_nan();
+
     # check modulus for valid values
-    return $num->bnan() if ($mod->{sign} ne '+' # NaN, -, -inf, +inf
-                            || $mod->is_zero());
+    return $num->bnan(@r) if $mod->{sign} ne '+' || $mod->is_zero();
 
     # check exponent for valid values
     if ($exp->{sign} =~ /\w/) {
         # i.e., if it's NaN, +inf, or -inf...
-        return $num->bnan();
+        return $num->bnan(@r);
     }
 
-    $num->bmodinv ($mod) if ($exp->{sign} eq '-');
+    $num = $num->bmodinv($mod, @r) if $exp->{sign} eq '-';
 
     # check num for valid values (also NaN if there was no inverse but $exp < 0)
-    return $num->bnan() if $num->{sign} !~ /^[+-]$/;
+    return $num->bnan(@r) if $num->{sign} !~ /^[+-]$/;
 
     # $mod is positive, sign on $exp is ignored, result also positive
 
     # XXX TODO: speed it up when all three numbers are integers
-    $num->bpow($exp)->bmod($mod);
+    $num = $num->bpow($exp)->bmod($mod);
+
+    return $downgrade -> new($num -> bdstr(), @r) if defined($downgrade)
+      && ($num->is_int() || $num->is_inf() || $num->is_nan());
+    return $num -> round(@r);
 }
 
 sub bpow {
@@ -2276,8 +2423,7 @@ sub bpow {
     # We don't support complex numbers, so upgrade or return NaN.
 
     if ($x -> is_negative() && !$y -> is_int()) {
-        return $upgrade -> bpow($upgrade -> new($x), $y, $a, $p, $r)
-          if defined $upgrade;
+        return $upgrade -> bpow($x, $y, $a, $p, $r) if defined $upgrade;
         return $x -> bnan();
     }
 
@@ -2302,19 +2448,23 @@ sub bpow {
     $x->{_e} = $LIB -> _mul($x->{_e}, $y1);
 
     $x->{sign} = $new_sign;
-    $x -> bnorm();
+    $x = $x -> bnorm();
 
     # x ** (-y) = 1 / (x ** y)
 
     if ($y->{sign} eq '-') {
         # modify $x in place!
         my $z = $x -> copy();
-        $x -> bone();
+        $x = $x -> bone();
         # round in one go (might ignore y's A!)
         return scalar $x -> bdiv($z, $a, $p, $r);
     }
 
-    $x -> round($a, $p, $r, $y);
+    $x = $x -> round($a, $p, $r, $y);
+
+    return $downgrade -> new($x)
+      if defined($downgrade) && ($x->is_int() || $x->is_inf() || $x->is_nan());
+    return $x;
 }
 
 sub blog {
@@ -2322,29 +2472,32 @@ sub blog {
     # value is used as the base, otherwise the base is assumed to be Euler's
     # constant.
 
-    my ($class, $x, $base, $a, $p, $r);
+    my ($class, $x, $base, @r);
 
-    # Don't objectify the base, since an undefined base, as in $x->blog() or
-    # $x->blog(undef) signals that the base is Euler's number.
+    # Only objectify the base if it is defined, since an undefined base, as in
+    # $x->blog() or $x->blog(undef) signals that the base is Euler's number.
 
     if (!ref($_[0]) && $_[0] =~ /^[A-Za-z]|::/) {
         # E.g., Math::BigFloat->blog(256, 2)
-        ($class, $x, $base, $a, $p, $r) =
+        ($class, $x, $base, @r) =
           defined $_[2] ? objectify(2, @_) : objectify(1, @_);
     } else {
         # E.g., Math::BigFloat::blog(256, 2) or $x->blog(2)
-        ($class, $x, $base, $a, $p, $r) =
+        ($class, $x, $base, @r) =
           defined $_[1] ? objectify(2, @_) : objectify(1, @_);
     }
 
     return $x if $x->modify('blog');
 
-    return $x -> bnan() if $x -> is_nan();
+    return $x -> bnan(@r) if $x -> is_nan();
+
+    return $upgrade -> blog($x, $base, @r)
+      if defined($upgrade) && $x -> is_neg();
 
     # we need to limit the accuracy to protect against overflow
     my $fallback = 0;
     my ($scale, @params);
-    ($x, @params) = $x->_find_round_parameters($a, $p, $r);
+    ($x, @params) = $x->_find_round_parameters(@r);
 
     # no rounding at all, so must use fallback
     if (scalar @params == 0) {
@@ -2352,7 +2505,7 @@ sub blog {
         $params[0] = $class->div_scale(); # and round to it as accuracy
         $params[1] = undef;               # P = undef
         $scale = $params[0]+4;            # at least four more for proper round
-        $params[2] = $r;                  # round mode by caller or undef
+        $params[2] = $r[2];               # round mode by caller or undef
         $fallback = 1;                    # to clear a/p afterwards
     } else {
         # the 4 below is empirical, and there might be cases where it is not
@@ -2362,28 +2515,29 @@ sub blog {
 
     my $done = 0;
     if (defined $base) {
-        $base = $class -> new($base) unless ref $base;
+        $base = $class -> new($base)
+          unless defined(blessed($base)) && $base -> isa($class);
         if ($base -> is_nan() || $base -> is_one()) {
-            $x -> bnan();
+            $x = $x -> bnan();
             $done = 1;
         } elsif ($base -> is_inf() || $base -> is_zero()) {
             if ($x -> is_inf() || $x -> is_zero()) {
-                $x -> bnan();
+                $x = $x -> bnan();
             } else {
-                $x -> bzero(@params);
+                $x = $x -> bzero(@params);
             }
             $done = 1;
         } elsif ($base -> is_negative()) { # -inf < base < 0
             if ($x -> is_one()) {          #     x = 1
-                $x -> bzero(@params);
+                $x = $x -> bzero(@params);
             } elsif ($x == $base) {
-                $x -> bone('+', @params); #     x = base
+                $x = $x -> bone('+', @params); #     x = base
             } else {
-                $x -> bnan();   #     otherwise
+                $x = $x -> bnan();   #     otherwise
             }
             $done = 1;
         } elsif ($x == $base) {
-            $x -> bone('+', @params); # 0 < base && 0 < x < inf
+            $x = $x -> bone('+', @params); # 0 < base && 0 < x < inf
             $done = 1;
         }
     }
@@ -2393,17 +2547,17 @@ sub blog {
     unless ($done) {
         if ($x -> is_inf()) {   #   x = +/-inf
             my $sign = defined $base && $base < 1 ? '-' : '+';
-            $x -> binf($sign);
+            $x = $x -> binf($sign);
             $done = 1;
         } elsif ($x -> is_neg()) { #   -inf < x < 0
-            $x -> bnan();
+            $x = $x -> bnan();
             $done = 1;
         } elsif ($x -> is_one()) { #   x = 1
-            $x -> bzero(@params);
+            $x = $x -> bzero(@params);
             $done = 1;
         } elsif ($x -> is_zero()) { #   x = 0
             my $sign = defined $base && $base < 1 ? '+' : '-';
-            $x -> binf($sign);
+            $x = $x -> binf($sign);
             $done = 1;
         }
     }
@@ -2414,69 +2568,61 @@ sub blog {
             delete $x->{_a};
             delete $x->{_p};
         }
+        return $downgrade -> new($x -> bdstr(), @r)
+          if defined($downgrade) && $x->is_int();
         return $x;
     }
 
     # when user set globals, they would interfere with our calculation, so
     # disable them and later re-enable them
     no strict 'refs';
-    my $abr = "$class\::accuracy"; my $ab = $$abr; $$abr = undef;
-    my $pbr = "$class\::precision"; my $pb = $$pbr; $$pbr = undef;
+    my $abr = "$class\::accuracy";
+    my $ab = $$abr;
+    $$abr = undef;
+    my $pbr = "$class\::precision";
+    my $pb = $$pbr;
+    $$pbr = undef;
     # we also need to disable any set A or P on $x (_find_round_parameters took
     # them already into account), since these would interfere, too
-    delete $x->{_a}; delete $x->{_p};
-    # need to disable $upgrade in BigInt, to avoid deep recursion
-    local $Math::BigInt::upgrade = undef;
-    local $Math::BigFloat::downgrade = undef;
-
-    # upgrade $x if $x is not a Math::BigFloat (handle BigInt input)
-    # XXX TODO: rebless!
-    if (!$x->isa('Math::BigFloat')) {
-        $x = Math::BigFloat->new($x);
-        $class = ref($x);
-    }
+    delete $x->{_a};
+    delete $x->{_p};
 
     $done = 0;
 
-    # If the base is defined and an integer, try to calculate integer result
-    # first. This is very fast, and in case the real result was found, we can
-    # stop right here.
-    if (defined $base && $base->is_int() && $x->is_int()) {
-        my $xint = Math::BigInt -> new($x    -> bdstr());
-        my $bint = Math::BigInt -> new($base -> bdstr());
-        $xint->blog($bint);
-
-        # if we found the exact result, we're done
-        if ($bint -> bpow($xint) == $x) {
-            my $xflt = Math::BigFloat -> new($xint -> bdstr());
-            $x->{sign} = $xflt->{sign};
-            $x->{_m}   = $xflt->{_m};
-            $x->{_es}  = $xflt->{_es};
-            $x->{_e}   = $xflt->{_e};
+    # If both the invocand and the base are integers, try to calculate integer
+    # result first. This is very fast, and in case the real result was found, we
+    # can stop right here.
+
+    if (defined($base) && $base -> is_int() && $x -> is_int()) {
+        my $x_lib = $LIB -> _new($x -> bdstr());
+        my $b_lib = $LIB -> _new($base -> bdstr());
+        ($x_lib, my $exact) = $LIB -> _log_int($x_lib, $b_lib);
+        if ($exact) {
+            $x->{_m} = $x_lib;
+            $x->{_e} = $LIB -> _zero();
+            $x = $x -> bnorm();
             $done = 1;
         }
     }
 
-    if ($done == 0) {
+    unless ($done) {
+
         # First calculate the log to base e (using reduction by 10 and possibly
-        # also by 2):
-        $x->_log_10($scale);
+        # also by 2), and if a different base was requested, convert the result.
 
-        # and if a different base was requested, convert it
+        $x = $x->_log_10($scale);
         if (defined $base) {
-            $base = Math::BigFloat->new($base)
-              unless $base->isa('Math::BigFloat');
             # log_b(x) = ln(x) / ln(b), so compute ln(b)
             my $base_log_e = $base->copy()->_log_10($scale);
-            $x->bdiv($base_log_e, $scale);
+            $x = $x->bdiv($base_log_e, $scale);
         }
     }
 
     # shortcut to not run through _find_round_parameters again
     if (defined $params[0]) {
-        $x->bround($params[0], $params[2]); # then round accordingly
+        $x = $x->bround($params[0], $params[2]); # then round accordingly
     } else {
-        $x->bfround($params[1], $params[2]); # then round accordingly
+        $x = $x->bfround($params[1], $params[2]); # then round accordingly
     }
     if ($fallback) {
         # clear a/p after round, since user did not request it
@@ -2487,25 +2633,28 @@ sub blog {
     $$abr = $ab;
     $$pbr = $pb;
 
-    $x;
+    return $downgrade -> new($x -> bdstr(), @r)
+      if defined($downgrade) && $x->is_int();
+    return $x;
 }
 
 sub bexp {
     # Calculate e ** X (Euler's number to the power of X)
-    my ($class, $x, $a, $p, $r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
 
     return $x if $x->modify('bexp');
 
-    return $x->binf() if $x->{sign} eq '+inf';
-    return $x->bzero() if $x->{sign} eq '-inf';
+    return $x->bnan(@r)  if $x -> is_nan();
+    return $x->binf(@r)  if $x->{sign} eq '+inf';
+    return $x->bzero(@r) if $x->{sign} eq '-inf';
 
     # we need to limit the accuracy to protect against overflow
     my $fallback = 0;
     my ($scale, @params);
-    ($x, @params) = $x->_find_round_parameters($a, $p, $r);
+    ($x, @params) = $x->_find_round_parameters(@r);
 
-    # also takes care of the "error in _find_round_parameters?" case
-    return $x if $x->{sign} eq 'NaN';
+    # error in _find_round_parameters?
+    return $x->bnan(@r) if $x->{sign} eq 'NaN';
 
     # no rounding at all, so must use fallback
     if (scalar @params == 0) {
@@ -2513,7 +2662,7 @@ sub bexp {
         $params[0] = $class->div_scale(); # and round to it as accuracy
         $params[1] = undef;               # P = undef
         $scale = $params[0]+4;            # at least four more for proper round
-        $params[2] = $r;                  # round mode by caller or undef
+        $params[2] = $r[2];               # round mode by caller or undef
         $fallback = 1;                    # to clear a/p afterwards
     } else {
         # the 4 below is empirical, and there might be cases where it's not
@@ -2531,13 +2680,21 @@ sub bexp {
     # when user set globals, they would interfere with our calculation, so
     # disable them and later re-enable them
     no strict 'refs';
-    my $abr = "$class\::accuracy"; my $ab = $$abr; $$abr = undef;
-    my $pbr = "$class\::precision"; my $pb = $$pbr; $$pbr = undef;
+    my $abr = "$class\::accuracy";
+    my $ab = $$abr;
+    $$abr = undef;
+    my $pbr = "$class\::precision";
+    my $pb = $$pbr;
+    $$pbr = undef;
     # we also need to disable any set A or P on $x (_find_round_parameters took
     # them already into account), since these would interfere, too
     delete $x->{_a};
     delete $x->{_p};
-    # need to disable $upgrade in BigInt, to avoid deep recursion
+
+    # Disabling upgrading and downgrading is no longer necessary to avoid an
+    # infinite recursion, but it avoids unnecessary upgrading and downgrading in
+    # the intermediate computations.
+
     local $Math::BigInt::upgrade = undef;
     local $Math::BigFloat::downgrade = undef;
 
@@ -2600,13 +2757,15 @@ sub bexp {
     } else {
         # compute A and B so that e = A / B.
 
-        # After some terms we end up with this, so we use it as a starting point:
+        # After some terms we end up with this, so we use it as a starting
+        # point:
         my $A = $LIB->_new("9093339520860578540197197" .
                            "0164779391644753259799242");
         my $F = $LIB->_new(42);
         my $step = 42;
 
-        # Compute how many steps we need to take to get $A and $B sufficiently big
+        # Compute how many steps we need to take to get $A and $B sufficiently
+        # big
         my $steps = _len_to_steps($scale - 4);
         #    print STDERR "# Doing $steps steps for ", $scale-4, " digits\n";
         while ($step++ <= $steps) {
@@ -2616,7 +2775,9 @@ sub bexp {
             # increment f
             $F = $LIB->_inc($F);
         }
-        # compute $B as factorial of $steps (this is faster than doing it manually)
+
+        # Compute $B as factorial of $steps (this is faster than doing it
+        # manually)
         my $B = $LIB->_fac($LIB->_new($steps));
 
         #  print "A ", $LIB->_str($A), "\nB ", $LIB->_str($B), "\n";
@@ -2631,7 +2792,8 @@ sub bexp {
         $x->{_e} = $LIB->_new($scale);
     }
 
-    # $x contains now an estimate of e, with some surplus digits, so we can round
+    # $x contains now an estimate of e, with some surplus digits, so we can
+    # round
     if (!$x_org->is_one()) {
         # Reduce size of fractional part, followup with integer power of two.
         my $lshift = 0;
@@ -2640,10 +2802,11 @@ sub bexp {
         }
         # Raise $x to the wanted power and round it.
         if ($lshift == 0) {
-            $x->bpow($x_org, @params);
+            $x = $x->bpow($x_org, @params);
         } else {
             my($mul, $rescale) = (1 << $lshift, $scale+1+$lshift);
-            $x->bpow(scalar $x_org->bdiv($mul, $rescale), $rescale)->bpow($mul, @params);
+            $x = $x -> bpow(scalar $x_org->bdiv($mul, $rescale), $rescale)
+                    -> bpow($mul, @params);
         }
     } else {
         # else just round the already computed result
@@ -2651,9 +2814,9 @@ sub bexp {
         delete $x->{_p};
         # shortcut to not run through _find_round_parameters again
         if (defined $params[0]) {
-            $x->bround($params[0], $params[2]); # then round accordingly
+            $x = $x->bround($params[0], $params[2]); # then round accordingly
         } else {
-            $x->bfround($params[1], $params[2]); # then round accordingly
+            $x = $x->bfround($params[1], $params[2]); # then round accordingly
         }
     }
     if ($fallback) {
@@ -2665,18 +2828,19 @@ sub bexp {
     $$abr = $ab;
     $$pbr = $pb;
 
-    $x;                         # return modified $x
+    return $downgrade -> new($x -> bdstr(), @r)
+      if defined($downgrade) && $x -> is_int();
+    $x;
 }
 
 sub bnok {
     # Calculate n over k (binomial coefficient or "choose" function) as integer.
     # set up parameters
-    my ($class, $x, $y, @r) = (ref($_[0]), @_);
+    my ($class, $x, $y, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+                            ? (ref($_[0]), @_)
+                            : objectify(2, @_);
 
-    # objectify is costly, so avoid it
-    if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) {
-        ($class, $x, $y, @r) = objectify(2, @_);
-    }
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
 
     return $x if $x->modify('bnok');
 
@@ -2686,7 +2850,10 @@ sub bnok {
 
     my $xint = Math::BigInt -> new($x -> bsstr());
     my $yint = Math::BigInt -> new($y -> bsstr());
-    $xint -> bnok($yint);
+    $xint = $xint -> bnok($yint);
+
+    return $xint if defined $downgrade;
+
     my $xflt = Math::BigFloat -> new($xint);
 
     $x->{_m}   = $xflt->{_m};
@@ -2705,15 +2872,18 @@ sub bsin {
     #    sin = x - --- + --- - --- + --- ...
     #               3!    5!    7!    9!
 
+    return $x if $x->modify('bsin');
+
+    return $x -> bzero(@r) if $x->is_zero();
+    return $x -> bnan(@r)  if $x->is_nan() || $x->is_inf();
+
     # we need to limit the accuracy to protect against overflow
     my $fallback = 0;
     my ($scale, @params);
     ($x, @params) = $x->_find_round_parameters(@r);
 
-    #         constant object       or error in _find_round_parameters?
-    return $x if $x->modify('bsin') || $x->is_nan();
-    return $x->bnan()    if $x->is_inf();
-    return $x->bzero(@r) if $x->is_zero();
+    # error in _find_round_parameters?
+    return $x->bnan(@r) if $x->is_nan();
 
     # no rounding at all, so must use fallback
     if (scalar @params == 0) {
@@ -2732,26 +2902,35 @@ sub bsin {
     # when user set globals, they would interfere with our calculation, so
     # disable them and later re-enable them
     no strict 'refs';
-    my $abr = "$class\::accuracy"; my $ab = $$abr; $$abr = undef;
-    my $pbr = "$class\::precision"; my $pb = $$pbr; $$pbr = undef;
+    my $abr = "$class\::accuracy";
+    my $ab = $$abr;
+    $$abr = undef;
+    my $pbr = "$class\::precision";
+    my $pb = $$pbr;
+    $$pbr = undef;
     # we also need to disable any set A or P on $x (_find_round_parameters took
     # them already into account), since these would interfere, too
     delete $x->{_a};
     delete $x->{_p};
-    # need to disable $upgrade in BigInt, to avoid deep recursion
+
+    # Disabling upgrading and downgrading is no longer necessary to avoid an
+    # infinite recursion, but it avoids unnecessary upgrading and downgrading in
+    # the intermediate computations.
+
     local $Math::BigInt::upgrade = undef;
+    local $Math::BigFloat::downgrade = undef;
 
     my $over = $x * $x;         # X ^ 2
     my $x2 = $over->copy();     # X ^ 2; difference between terms
-    $over->bmul($x);            # X ^ 3 as starting value
+    $over = $over->bmul($x);    # X ^ 3 as starting value
     my $sign = 1;               # start with -=
-    my $below = $class->new(6); my $factorial = $class->new(4);
+    my $below = $class->new(6);
+    my $factorial = $class->new(4);
     delete $x->{_a};
     delete $x->{_p};
 
     my $limit = $class->new("1E-". ($scale-1));
-    #my $steps = 0;
-    while (3 < 5) {
+    while (1) {
         # we calculate the next term, and add it to the last
         # when the next term is below our limit, it won't affect the outcome
         # anymore, so we stop:
@@ -2759,22 +2938,24 @@ sub bsin {
         last if $next->bacmp($limit) <= 0;
 
         if ($sign == 0) {
-            $x->badd($next);
+            $x = $x->badd($next);
         } else {
-            $x->bsub($next);
+            $x = $x->bsub($next);
         }
         $sign = 1-$sign;        # alternate
         # calculate things for the next term
-        $over->bmul($x2);                         # $x*$x
-        $below->bmul($factorial); $factorial->binc(); # n*(n+1)
-        $below->bmul($factorial); $factorial->binc(); # n*(n+1)
+        $over = $over->bmul($x2);                       # $x*$x
+        $below = $below->bmul($factorial);              # n*(n+1)
+        $factorial = $factorial->binc();
+        $below = $below -> bmul($factorial);              # n*(n+1)
+        $factorial = $factorial->binc();
     }
 
     # shortcut to not run through _find_round_parameters again
     if (defined $params[0]) {
-        $x->bround($params[0], $params[2]); # then round accordingly
+        $x = $x->bround($params[0], $params[2]); # then round accordingly
     } else {
-        $x->bfround($params[1], $params[2]); # then round accordingly
+        $x = $x->bfround($params[1], $params[2]); # then round accordingly
     }
     if ($fallback) {
         # clear a/p after round, since user did not request it
@@ -2784,6 +2965,9 @@ sub bsin {
     # restore globals
     $$abr = $ab;
     $$pbr = $pb;
+
+    return $downgrade -> new($x -> bdstr(), @r)
+      if defined($downgrade) && $x -> is_int();
     $x;
 }
 
@@ -2822,20 +3006,23 @@ sub bcos {
     # when user set globals, they would interfere with our calculation, so
     # disable them and later re-enable them
     no strict 'refs';
-    my $abr = "$class\::accuracy"; my $ab = $$abr; $$abr = undef;
-    my $pbr = "$class\::precision"; my $pb = $$pbr; $$pbr = undef;
+    my $abr = "$class\::accuracy";
+    my $ab = $$abr;
+    $$abr = undef;
+    my $pbr = "$class\::precision";
+    my $pb = $$pbr;
+    $$pbr = undef;
     # we also need to disable any set A or P on $x (_find_round_parameters took
     # them already into account), since these would interfere, too
-    delete $x->{_a}; delete $x->{_p};
-    # need to disable $upgrade in BigInt, to avoid deep recursion
-    local $Math::BigInt::upgrade = undef;
+    delete $x->{_a};
+    delete $x->{_p};
 
     my $over = $x * $x;         # X ^ 2
     my $x2 = $over->copy();     # X ^ 2; difference between terms
     my $sign = 1;               # start with -=
     my $below = $class->new(2);
     my $factorial = $class->new(3);
-    $x->bone();
+    $x = $x->bone();
     delete $x->{_a};
     delete $x->{_p};
 
@@ -2849,22 +3036,24 @@ sub bcos {
         last if $next->bacmp($limit) <= 0;
 
         if ($sign == 0) {
-            $x->badd($next);
+            $x = $x->badd($next);
         } else {
-            $x->bsub($next);
+            $x = $x->bsub($next);
         }
         $sign = 1-$sign;        # alternate
         # calculate things for the next term
-        $over->bmul($x2);                         # $x*$x
-        $below->bmul($factorial); $factorial->binc(); # n*(n+1)
-        $below->bmul($factorial); $factorial->binc(); # n*(n+1)
+        $over = $over->bmul($x2);                       # $x*$x
+        $below = $below->bmul($factorial);              # n*(n+1)
+        $factorial = $factorial -> binc();
+        $below = $below->bmul($factorial);              # n*(n+1)
+        $factorial = $factorial -> binc();
     }
 
     # shortcut to not run through _find_round_parameters again
     if (defined $params[0]) {
-        $x->bround($params[0], $params[2]); # then round accordingly
+        $x = $x->bround($params[0], $params[2]); # then round accordingly
     } else {
-        $x->bfround($params[1], $params[2]); # then round accordingly
+        $x = $x->bfround($params[1], $params[2]); # then round accordingly
     }
     if ($fallback) {
         # clear a/p after round, since user did not request it
@@ -2874,48 +3063,50 @@ sub bcos {
     # restore globals
     $$abr = $ab;
     $$pbr = $pb;
+
+    return $downgrade -> new($x -> bdstr(), @r)
+      if defined($downgrade) && $x -> is_int();
     $x;
 }
 
 sub batan {
     # Calculate a arcus tangens of x.
-
-    my $self    = shift;
-    my $selfref = ref $self;
-    my $class   = $selfref || $self;
-
-    my (@r) = @_;
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
 
     # taylor:       x^3   x^5   x^7   x^9
     #    atan = x - --- + --- - --- + --- ...
     #                3     5     7     9
 
+    return $x if $x->modify('batan');
+
+    return $x -> bnan(@r) if $x->is_nan();
+
     # We need to limit the accuracy to protect against overflow.
 
     my $fallback = 0;
     my ($scale, @params);
-    ($self, @params) = $self->_find_round_parameters(@r);
+    ($x, @params) = $x->_find_round_parameters(@r);
 
-    # Constant object or error in _find_round_parameters?
+    # Error in _find_round_parameters?
 
-    return $self if $self->modify('batan') || $self->is_nan();
+    return $x -> bnan(@r) if $x->is_nan();
 
-    if ($self->{sign} =~ /^[+-]inf\z/) {
+    if ($x->{sign} =~ /^[+-]inf\z/) {
         # +inf result is PI/2
         # -inf result is -PI/2
         # calculate PI/2
         my $pi = $class->bpi(@r);
-        # modify $self in place
-        $self->{_m} = $pi->{_m};
-        $self->{_e} = $pi->{_e};
-        $self->{_es} = $pi->{_es};
+        # modify $x in place
+        $x->{_m} = $pi->{_m};
+        $x->{_e} = $pi->{_e};
+        $x->{_es} = $pi->{_es};
         # -y => -PI/2, +y => PI/2
-        $self->{sign} = substr($self->{sign}, 0, 1); # "+inf" => "+"
-        $self -> {_m} = $LIB->_div($self->{_m}, $LIB->_new(2));
-        return $self;
+        $x->{sign} = substr($x->{sign}, 0, 1); # "+inf" => "+"
+        $x -> {_m} = $LIB->_div($x->{_m}, $LIB->_new(2));
+        return $x;
     }
 
-    return $self->bzero(@r) if $self->is_zero();
+    return $x->bzero(@r) if $x->is_zero();
 
     # no rounding at all, so must use fallback
     if (scalar @params == 0) {
@@ -2933,57 +3124,67 @@ sub batan {
 
     # 1 or -1 => PI/4
     # inlined is_one() && is_one('-')
-    if ($LIB->_is_one($self->{_m}) && $LIB->_is_zero($self->{_e})) {
+    if ($LIB->_is_one($x->{_m}) && $LIB->_is_zero($x->{_e})) {
         my $pi = $class->bpi($scale - 3);
-        # modify $self in place
-        $self->{_m} = $pi->{_m};
-        $self->{_e} = $pi->{_e};
-        $self->{_es} = $pi->{_es};
-        # leave the sign of $self alone (+1 => +PI/4, -1 => -PI/4)
-        $self->{_m} = $LIB->_div($self->{_m}, $LIB->_new(4));
-        return $self;
+        # modify $x in place
+        $x->{_m} = $pi->{_m};
+        $x->{_e} = $pi->{_e};
+        $x->{_es} = $pi->{_es};
+        # leave the sign of $x alone (+1 => +PI/4, -1 => -PI/4)
+        $x->{_m} = $LIB->_div($x->{_m}, $LIB->_new(4));
+        return $x;
     }
 
     # This series is only valid if -1 < x < 1, so for other x we need to
     # calculate PI/2 - atan(1/x):
     my $pi = undef;
-    if ($self->bacmp($self->copy()->bone) >= 0) {
+    if ($x->bacmp($x->copy()->bone) >= 0) {
         # calculate PI/2
         $pi = $class->bpi($scale - 3);
         $pi->{_m} = $LIB->_div($pi->{_m}, $LIB->_new(2));
-        # calculate 1/$self:
-        my $self_copy = $self->copy();
-        # modify $self in place
-        $self->bone();
-        $self->bdiv($self_copy, $scale);
+        # calculate 1/$x:
+        my $x_copy = $x->copy();
+        # modify $x in place
+        $x = $x->bone();
+        $x = $x->bdiv($x_copy, $scale);
     }
 
     my $fmul = 1;
     foreach (0 .. int($scale / 20)) {
         $fmul *= 2;
-        $self->bdiv($self->copy()->bmul($self)->binc->bsqrt($scale + 4)->binc, $scale + 4);
+        $x = $x->bdiv($x->copy()->bmul($x)->binc()->bsqrt($scale + 4)->binc(),
+                      $scale + 4);
     }
 
     # When user set globals, they would interfere with our calculation, so
     # disable them and later re-enable them.
     no strict 'refs';
-    my $abr = "$class\::accuracy";  my $ab = $$abr; $$abr = undef;
-    my $pbr = "$class\::precision"; my $pb = $$pbr; $$pbr = undef;
-    # We also need to disable any set A or P on $self (_find_round_parameters
+    my $abr = "$class\::accuracy";
+    my $ab = $$abr;
+    $$abr = undef;
+    my $pbr = "$class\::precision";
+    my $pb = $$pbr;
+    $$pbr = undef;
+    # We also need to disable any set A or P on $x (_find_round_parameters
     # took them already into account), since these would interfere, too
-    delete $self->{_a};
-    delete $self->{_p};
-    # Need to disable $upgrade in BigInt, to avoid deep recursion.
+    delete $x->{_a};
+    delete $x->{_p};
+
+    # Disabling upgrading and downgrading is no longer necessary to avoid an
+    # infinite recursion, but it avoids unnecessary upgrading and downgrading in
+    # the intermediate computations.
+
     local $Math::BigInt::upgrade = undef;
+    local $Math::BigFloat::downgrade = undef;
 
-    my $over = $self * $self;   # X ^ 2
-    my $self2 = $over->copy();  # X ^ 2; difference between terms
-    $over->bmul($self);         # X ^ 3 as starting value
+    my $over = $x * $x;   # X ^ 2
+    my $x2 = $over->copy();  # X ^ 2; difference between terms
+    $over = $over->bmul($x);         # X ^ 3 as starting value
     my $sign = 1;               # start with -=
     my $below = $class->new(3);
     my $two = $class->new(2);
-    delete $self->{_a};
-    delete $self->{_p};
+    delete $x->{_a};
+    delete $x->{_p};
 
     my $limit = $class->new("1E-". ($scale-1));
     #my $steps = 0;
@@ -2995,55 +3196,55 @@ sub batan {
         last if $next->bacmp($limit) <= 0;
 
         if ($sign == 0) {
-            $self->badd($next);
+            $x = $x->badd($next);
         } else {
-            $self->bsub($next);
+            $x = $x->bsub($next);
         }
         $sign = 1-$sign;        # alternatex
         # calculate things for the next term
-        $over->bmul($self2);    # $self*$self
-        $below->badd($two);     # n += 2
+        $over = $over->bmul($x2);    # $x*$x
+        $below = $below->badd($two);     # n += 2
     }
-    $self->bmul($fmul);
+    $x = $x->bmul($fmul);
 
     if (defined $pi) {
-        my $self_copy = $self->copy();
-        # modify $self in place
-        $self->{_m} = $pi->{_m};
-        $self->{_e} = $pi->{_e};
-        $self->{_es} = $pi->{_es};
-        # PI/2 - $self
-        $self->bsub($self_copy);
+        my $x_copy = $x->copy();
+        # modify $x in place
+        $x->{_m} = $pi->{_m};
+        $x->{_e} = $pi->{_e};
+        $x->{_es} = $pi->{_es};
+        # PI/2 - $x
+        $x = $x->bsub($x_copy);
     }
 
     # Shortcut to not run through _find_round_parameters again.
     if (defined $params[0]) {
-        $self->bround($params[0], $params[2]); # then round accordingly
+        $x = $x->bround($params[0], $params[2]); # then round accordingly
     } else {
-        $self->bfround($params[1], $params[2]); # then round accordingly
+        $x = $x->bfround($params[1], $params[2]); # then round accordingly
     }
     if ($fallback) {
         # Clear a/p after round, since user did not request it.
-        delete $self->{_a};
-        delete $self->{_p};
+        delete $x->{_a};
+        delete $x->{_p};
     }
 
     # restore globals
     $$abr = $ab;
     $$pbr = $pb;
-    $self;
+
+    return $downgrade -> new($x -> bdstr(), @r)
+      if defined($downgrade) && ($x -> is_int() || $x -> is_inf());
+    $x;
 }
 
 sub batan2 {
     # $y -> batan2($x) returns the arcus tangens of $y / $x.
 
     # Set up parameters.
-    my ($class, $y, $x, @r) = (ref($_[0]), @_);
-
-    # Objectify is costly, so avoid it if we can.
-    if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) {
-        ($class, $y, $x, @r) = objectify(2, @_);
-    }
+    my ($class, $y, $x, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+                            ? (ref($_[0]), @_)
+                            : objectify(2, @_);
 
     # Quick exit if $y is read-only.
     return $y if $y -> modify('batan2');
@@ -3073,52 +3274,52 @@ sub batan2 {
         $scale = abs($params[0] || $params[1]) + 4; # take whatever is defined
     }
 
-    if ($x -> is_inf("+")) {                    # x = inf
-        if ($y -> is_inf("+")) {                #    y = inf
-            $y -> bpi($scale) -> bmul("0.25");  #       pi/4
-        } elsif ($y -> is_inf("-")) {           #    y = -inf
-            $y -> bpi($scale) -> bmul("-0.25"); #       -pi/4
-        } else {                                #    -inf < y < inf
-            return $y -> bzero(@r);             #       0
+    if ($x -> is_inf("+")) {                          # x = inf
+        if ($y -> is_inf("+")) {                      #    y = inf
+            $y = $y -> bpi($scale) -> bmul("0.25");   #       pi/4
+        } elsif ($y -> is_inf("-")) {                 #    y = -inf
+            $y = $y -> bpi($scale) -> bmul("-0.25");  #       -pi/4
+        } else {                                      #    -inf < y < inf
+            return $y -> bzero(@r);                   #       0
         }
-    } elsif ($x -> is_inf("-")) {               # x = -inf
-        if ($y -> is_inf("+")) {                #    y = inf
-            $y -> bpi($scale) -> bmul("0.75");  #       3/4 pi
-        } elsif ($y -> is_inf("-")) {           #    y = -inf
-            $y -> bpi($scale) -> bmul("-0.75"); #       -3/4 pi
-        } elsif ($y >= 0) {                     #    y >= 0
-            $y -> bpi($scale);                  #       pi
-        } else {                                #    y < 0
-            $y -> bpi($scale) -> bneg();        #       -pi
+    } elsif ($x -> is_inf("-")) {                     # x = -inf
+        if ($y -> is_inf("+")) {                      #    y = inf
+            $y = $y -> bpi($scale) -> bmul("0.75");   #       3/4 pi
+        } elsif ($y -> is_inf("-")) {                 #    y = -inf
+            $y = $y -> bpi($scale) -> bmul("-0.75");  #       -3/4 pi
+        } elsif ($y >= 0) {                           #    y >= 0
+            $y = $y -> bpi($scale);                   #       pi
+        } else {                                      #    y < 0
+            $y = $y -> bpi($scale) -> bneg();         #       -pi
         }
-    } elsif ($x > 0) {                               # 0 < x < inf
-        if ($y -> is_inf("+")) {                     #    y = inf
-            $y -> bpi($scale) -> bmul("0.5");        #       pi/2
-        } elsif ($y -> is_inf("-")) {                #    y = -inf
-            $y -> bpi($scale) -> bmul("-0.5");       #       -pi/2
-        } else {                                     #   -inf < y < inf
-            $y -> bdiv($x, $scale) -> batan($scale); #       atan(y/x)
+    } elsif ($x > 0) {                                    # 0 < x < inf
+        if ($y -> is_inf("+")) {                          #    y = inf
+            $y = $y -> bpi($scale) -> bmul("0.5");        #       pi/2
+        } elsif ($y -> is_inf("-")) {                     #    y = -inf
+            $y = $y -> bpi($scale) -> bmul("-0.5");       #       -pi/2
+        } else {                                          #   -inf < y < inf
+            $y = $y -> bdiv($x, $scale) -> batan($scale); #       atan(y/x)
         }
-    } elsif ($x < 0) {                        # -inf < x < 0
+    } elsif ($x < 0) {                                # -inf < x < 0
         my $pi = $class -> bpi($scale);
-        if ($y >= 0) {                        #    y >= 0
-            $y -> bdiv($x, $scale) -> batan() #       atan(y/x) + pi
+        if ($y >= 0) {                                #    y >= 0
+            $y = $y -> bdiv($x, $scale) -> batan()    #       atan(y/x) + pi
                -> badd($pi);
-        } else {                              #    y < 0
-            $y -> bdiv($x, $scale) -> batan() #       atan(y/x) - pi
+        } else {                                      #    y < 0
+            $y = $y -> bdiv($x, $scale) -> batan()    #       atan(y/x) - pi
                -> bsub($pi);
         }
-    } else {                                   # x = 0
-        if ($y > 0) {                          #    y > 0
-            $y -> bpi($scale) -> bmul("0.5");  #       pi/2
-        } elsif ($y < 0) {                     #    y < 0
-            $y -> bpi($scale) -> bmul("-0.5"); #       -pi/2
-        } else {                               #    y = 0
-            return $y -> bzero(@r);            #       0
+    } else {                                          # x = 0
+        if ($y > 0) {                                 #    y > 0
+            $y = $y -> bpi($scale) -> bmul("0.5");    #       pi/2
+        } elsif ($y < 0) {                            #    y < 0
+            $y = $y -> bpi($scale) -> bmul("-0.5");   #       -pi/2
+        } else {                                      #    y = 0
+            return $y -> bzero(@r);                   #       0
         }
     }
 
-    $y -> round(@r);
+    $y = $y -> round(@r);
 
     if ($fallback) {
         delete $y->{_a};
@@ -3127,31 +3328,40 @@ sub batan2 {
 
     return $y;
 }
-##############################################################################
 
 sub bsqrt {
     # calculate square root
-    my ($class, $x, $a, $p, $r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
 
     return $x if $x->modify('bsqrt');
 
-    return $x->bnan() if $x->{sign} !~ /^\+/;  # NaN, -inf or < 0
-    return $x if $x->{sign} eq '+inf';         # sqrt(inf) == inf
-    return $x->round($a, $p, $r) if $x->is_zero() || $x->is_one();
+    # Handle trivial cases.
+
+    return $x -> bnan(@r)      if $x->is_nan();
+    return $x -> binf("+", @r) if $x->{sign} eq '+inf';
+    return $x -> round(@r)     if $x->is_zero() || $x->is_one();
+
+    # We don't support complex numbers.
+
+    if ($x -> is_neg()) {
+        return $upgrade -> bsqrt($x, @r) if defined($upgrade);
+        return $x -> bnan(@r);
+    }
 
     # we need to limit the accuracy to protect against overflow
     my $fallback = 0;
     my (@params, $scale);
-    ($x, @params) = $x->_find_round_parameters($a, $p, $r);
+    ($x, @params) = $x->_find_round_parameters(@r);
 
-    return $x if $x->is_nan();  # error in _find_round_parameters?
+    # error in _find_round_parameters?
+    return $x -> bnan(@r) if $x->is_nan();
 
     # no rounding at all, so must use fallback
     if (scalar @params == 0) {
         # simulate old behaviour
         $params[0] = $class->div_scale(); # and round to it as accuracy
         $scale = $params[0]+4;            # at least four more for proper round
-        $params[2] = $r;                  # round mode by caller or undef
+        $params[2] = $r[2];               # round mode by caller or undef
         $fallback = 1;                    # to clear a/p afterwards
     } else {
         # the 4 below is empirical, and there might be cases where it is not
@@ -3162,14 +3372,23 @@ sub bsqrt {
     # when user set globals, they would interfere with our calculation, so
     # disable them and later re-enable them
     no strict 'refs';
-    my $abr = "$class\::accuracy"; my $ab = $$abr; $$abr = undef;
-    my $pbr = "$class\::precision"; my $pb = $$pbr; $$pbr = undef;
+    my $abr = "$class\::accuracy";
+    my $ab = $$abr;
+    $$abr = undef;
+    my $pbr = "$class\::precision";
+    my $pb = $$pbr;
+    $$pbr = undef;
     # we also need to disable any set A or P on $x (_find_round_parameters took
     # them already into account), since these would interfere, too
     delete $x->{_a};
     delete $x->{_p};
-    # need to disable $upgrade in BigInt, to avoid deep recursion
-    local $Math::BigInt::upgrade = undef; # should be really parent class vs MBI
+
+    # Disabling upgrading and downgrading is no longer necessary to avoid an
+    # infinite recursion, but it avoids unnecessary upgrading and downgrading in
+    # the intermediate computations.
+
+    local $Math::BigInt::upgrade = undef;
+    local $Math::BigFloat::downgrade = undef;
 
     my $i = $LIB->_copy($x->{_m});
     $i = $LIB->_lsft($i, $x->{_e}, 10) unless $LIB->_is_zero($x->{_e});
@@ -3186,12 +3405,12 @@ sub bsqrt {
         $x->{_m} = $gs->{value};
         $x->{_e} = $LIB->_zero();
         $x->{_es} = '+';
-        $x->bnorm();
+        $x = $x->bnorm();
         # shortcut to not run through _find_round_parameters again
         if (defined $params[0]) {
-            $x->bround($params[0], $params[2]); # then round accordingly
+            $x = $x->bround($params[0], $params[2]); # then round accordingly
         } else {
-            $x->bfround($params[1], $params[2]); # then round accordingly
+            $x = $x->bfround($params[1], $params[2]); # then round accordingly
         }
         if ($fallback) {
             # clear a/p after round, since user did not request it
@@ -3204,9 +3423,10 @@ sub bsqrt {
         return $x;
     }
 
-    # sqrt(2) = 1.4 because sqrt(2*100) = 1.4*10; so we can increase the accuracy
-    # of the result by multiplying the input by 100 and then divide the integer
-    # result of sqrt(input) by 10. Rounding afterwards returns the real result.
+    # sqrt(2) = 1.4 because sqrt(2*100) = 1.4*10; so we can increase the
+    # accuracy of the result by multiplying the input by 100 and then divide the
+    # integer result of sqrt(input) by 10. Rounding afterwards returns the real
+    # result.
 
     # The following steps will transform 123.456 (in $x) into 123456 (in $y1)
     my $y1 = $LIB->_copy($x->{_m});
@@ -3266,13 +3486,13 @@ sub bsqrt {
         $x->{_es} = '+';
     }
     $x->{_m} = $y1;
-    $x->bnorm();
+    $x = $x->bnorm();
 
     # shortcut to not run through _find_round_parameters again
     if (defined $params[0]) {
-        $x->bround($params[0], $params[2]); # then round accordingly
+        $x = $x->bround($params[0], $params[2]); # then round accordingly
     } else {
-        $x->bfround($params[1], $params[2]); # then round accordingly
+        $x = $x->bfround($params[1], $params[2]); # then round accordingly
     }
     if ($fallback) {
         # clear a/p after round, since user did not request it
@@ -3282,6 +3502,9 @@ sub bsqrt {
     # restore globals
     $$abr = $ab;
     $$pbr = $pb;
+
+    return $downgrade -> new($x -> bdstr(), @r)
+      if defined($downgrade) && ($x -> is_int() || $x -> is_inf());
     $x;
 }
 
@@ -3289,14 +3512,24 @@ sub broot {
     # calculate $y'th root of $x
 
     # set up parameters
-    my ($class, $x, $y, $a, $p, $r) = (ref($_[0]), @_);
-    # objectify is costly, so avoid it
-    if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) {
-        ($class, $x, $y, $a, $p, $r) = objectify(2, @_);
-    }
+    my ($class, $x, $y, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+                            ? (ref($_[0]), @_)
+                            : objectify(2, @_);
 
     return $x if $x->modify('broot');
 
+    # Handle trivial cases.
+
+    return $x -> bnan(@r) if $x->is_nan() || $y->is_nan();
+
+    if ($x -> is_neg()) {
+        # -27 ** (1/3) = -3
+        return $x -> broot($y -> copy() -> bneg(), @r) -> bneg()
+          if $x -> is_int() && $y -> is_int() && $y -> is_neg();
+        return $upgrade -> broot($x, $y, @r) if defined $upgrade;
+        return $x -> bnan(@r);
+    }
+
     # NaN handling: $x ** 1/0, x or y NaN, or y inf/-inf or y == 0
     return $x->bnan() if $x->{sign} !~ /^\+/ || $y->is_zero() ||
       $y->{sign} !~ /^\+$/;
@@ -3306,7 +3539,7 @@ sub broot {
     # we need to limit the accuracy to protect against overflow
     my $fallback = 0;
     my (@params, $scale);
-    ($x, @params) = $x->_find_round_parameters($a, $p, $r);
+    ($x, @params) = $x->_find_round_parameters(@r);
 
     return $x if $x->is_nan();  # error in _find_round_parameters?
 
@@ -3315,7 +3548,7 @@ sub broot {
         # simulate old behaviour
         $params[0] = $class->div_scale(); # and round to it as accuracy
         $scale = $params[0]+4;            # at least four more for proper round
-        $params[2] = $r;                  # round mode by caller or undef
+        $params[2] = $r[2];               # round mode by caller or undef
         $fallback = 1;                    # to clear a/p afterwards
     } else {
         # the 4 below is empirical, and there might be cases where it is not
@@ -3326,14 +3559,23 @@ sub broot {
     # when user set globals, they would interfere with our calculation, so
     # disable them and later re-enable them
     no strict 'refs';
-    my $abr = "$class\::accuracy"; my $ab = $$abr; $$abr = undef;
-    my $pbr = "$class\::precision"; my $pb = $$pbr; $$pbr = undef;
+    my $abr = "$class\::accuracy";
+    my $ab = $$abr;
+    $$abr = undef;
+    my $pbr = "$class\::precision";
+    my $pb = $$pbr;
+    $$pbr = undef;
     # we also need to disable any set A or P on $x (_find_round_parameters took
     # them already into account), since these would interfere, too
     delete $x->{_a};
     delete $x->{_p};
-    # need to disable $upgrade in BigInt, to avoid deep recursion
-    local $Math::BigInt::upgrade = undef; # should be really parent class vs MBI
+
+    # Disabling upgrading and downgrading is no longer necessary to avoid an
+    # infinite recursion, but it avoids unnecessary upgrading and downgrading in
+    # the intermediate computations.
+
+    local $Math::BigInt::upgrade = undef;
+    local $Math::BigFloat::downgrade = undef;
 
     # remember sign and make $x positive, since -4 ** (1/2) => -2
     my $sign = 0;
@@ -3342,14 +3584,15 @@ sub broot {
 
     my $is_two = 0;
     if ($y->isa('Math::BigFloat')) {
-        $is_two = ($y->{sign} eq '+' && $LIB->_is_two($y->{_m}) && $LIB->_is_zero($y->{_e}));
+        $is_two = $y->{sign} eq '+' && $LIB->_is_two($y->{_m})
+                    && $LIB->_is_zero($y->{_e});
     } else {
-        $is_two = ($y == 2);
+        $is_two = $y == 2;
     }
 
     # normal square root if $y == 2:
     if ($is_two) {
-        $x->bsqrt($scale+4);
+        $x = $x->bsqrt($scale+4);
     } elsif ($y->is_one('-')) {
         # $x ** -1 => 1/$x
         my $u = $class->bone()->bdiv($x, $scale);
@@ -3367,30 +3610,31 @@ sub broot {
             $i = $LIB->_lsft($i, $x->{_e}, 10) unless $LIB->_is_zero($x->{_e});
             my $int = Math::BigInt->bzero();
             $int->{value} = $i;
-            $int->broot($y->as_number());
+            $int = $int->broot($y->as_number());
             # if ($exact)
             if ($int->copy()->bpow($y) == $x) {
                 # found result, return it
                 $x->{_m} = $int->{value};
                 $x->{_e} = $LIB->_zero();
                 $x->{_es} = '+';
-                $x->bnorm();
+                $x = $x->bnorm();
                 $done = 1;
             }
         }
         if ($done == 0) {
             my $u = $class->bone()->bdiv($y, $scale+4);
-            delete $u->{_a}; delete $u->{_p}; # otherwise it conflicts
-            $x->bpow($u, $scale+4);            # el cheapo
+            delete $u->{_a};
+            delete $u->{_p};
+            $x = $x->bpow($u, $scale+4);            # el cheapo
         }
     }
-    $x->bneg() if $sign == 1;
+    $x = $x->bneg() if $sign == 1;
 
     # shortcut to not run through _find_round_parameters again
     if (defined $params[0]) {
-        $x->bround($params[0], $params[2]); # then round accordingly
+        $x = $x->bround($params[0], $params[2]); # then round accordingly
     } else {
-        $x->bfround($params[1], $params[2]); # then round accordingly
+        $x = $x->bfround($params[1], $params[2]); # then round accordingly
     }
     if ($fallback) {
         # clear a/p after round, since user did not request it
@@ -3400,6 +3644,9 @@ sub broot {
     # restore globals
     $$abr = $ab;
     $$pbr = $pb;
+
+    return $downgrade -> new($x -> bdstr(), @r)
+      if defined($downgrade) && ($x -> is_int() || $x -> is_inf());
     $x;
 }
 
@@ -3408,16 +3655,19 @@ sub bfac {
     # compute factorial number, modifies first argument
 
     # set up parameters
-    my ($class, $x, @r) = (ref($_[0]), @_);
-    # objectify is costly, so avoid it
-    ($class, $x, @r) = objectify(1, @_) if !ref($x);
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
 
     # inf => inf
-    return $x if $x->modify('bfac') || $x->{sign} eq '+inf';
+    return $x if $x->modify('bfac');
+
+    return $x -> bnan(@r)      if $x->is_nan()  || $x->is_inf("-");
+    return $x -> binf("+", @r) if $x->is_inf("+");
+    return $x -> bone(@r)      if $x->is_zero() || $x->is_one();
 
-    return $x->bnan()
-      if (($x->{sign} ne '+') || # inf, NaN, <0 etc => NaN
-          ($x->{_es} ne '+'));   # digits after dot?
+    if ($x -> is_neg() || !$x -> is_int()) {
+        return $upgrade -> bfac($x, @r) if defined($upgrade);
+        return $x -> bnan(@r);
+    }
 
     if (! $LIB->_is_zero($x->{_e})) {
         $x->{_m} = $LIB->_lsft($x->{_m}, $x->{_e}, 10); # change 12e1 to 120e0
@@ -3425,23 +3675,30 @@ sub bfac {
         $x->{_es} = '+';
     }
     $x->{_m} = $LIB->_fac($x->{_m});       # calculate factorial
-    $x->bnorm()->round(@r);     # norm again and round result
+
+    $x = $x->bnorm()->round(@r);     # norm again and round result
+
+    return $downgrade -> new($x -> bdstr(), @r) if defined($downgrade)
+      && ($x -> is_int() || $x -> is_inf());
+    $x;
 }
 
 sub bdfac {
     # compute double factorial
 
     # set up parameters
-    my ($class, $x, @r) = (ref($_[0]), @_);
-    # objectify is costly, so avoid it
-    ($class, $x, @r) = objectify(1, @_) if !ref($x);
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
 
-    # inf => inf
-    return $x if $x->modify('bdfac') || $x->{sign} eq '+inf';
+    return $x if $x->modify('bdfac');
+
+    return $x -> bnan(@r)      if $x->is_nan()  || $x->is_inf("-");
+    return $x -> binf("+", @r) if $x->is_inf("+");
+
+    if ($x <= -2 || !$x -> is_int()) {
+        return $upgrade -> bdfac($x, @r) if defined($upgrade);
+        return $x -> bnan(@r);
+    }
 
-    return $x->bnan() if ($x->is_nan() ||
-                          $x->{_es} ne '+');    # digits after dot?
-    return $x->bnan() if $x <= -2;
     return $x->bone() if $x <= 1;
 
     croak("bdfac() requires a newer version of the $LIB library.")
@@ -3453,108 +3710,137 @@ sub bdfac {
         $x->{_es} = '+';
     }
     $x->{_m} = $LIB->_dfac($x->{_m});       # calculate factorial
-    $x->bnorm()->round(@r);     # norm again and round result
+
+    $x = $x->bnorm()->round(@r);     # norm again and round result
+
+    return $downgrade -> new($x -> bdstr(), @r)
+      if defined($downgrade) && $x -> is_int();
+    return $x;
 }
 
 sub btfac {
     # compute triple factorial
 
     # set up parameters
-    my ($class, $x, @r) = (ref($_[0]), @_);
-    # objectify is costly, so avoid it
-    ($class, $x, @r) = objectify(1, @_) if !ref($x);
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
 
-    # inf => inf
-    return $x if $x->modify('btfac') || $x->{sign} eq '+inf';
+    return $x if $x->modify('btfac');
 
-    return $x->bnan() if ($x->is_nan() ||
-                          $x->{_es} ne '+');    # digits after dot?
+    return $x -> bnan(@r)      if $x->is_nan()  || $x->is_inf("-");
+    return $x -> binf("+", @r) if $x->is_inf("+");
+
+    if ($x <= -3 || !$x -> is_int()) {
+        return $upgrade -> btfac($x, @r) if defined($upgrade);
+        return $x -> bnan(@r);
+    }
 
     my $k = $class -> new("3");
-    return $x->bnan() if $x <= -$k;
+    return $x->bnan(@r) if $x <= -$k;
 
     my $one = $class -> bone();
-    return $x->bone() if $x <= $one;
+    return $x->bone(@r) if $x <= $one;
 
     my $f = $x -> copy();
     while ($f -> bsub($k) > $one) {
-        $x -> bmul($f);
+        $x = $x -> bmul($f);
     }
-    $x->round(@r);
+
+    $x = $x->round(@r);
+
+    return $downgrade -> new($x -> bdstr(), @r)
+      if defined($downgrade) && $x -> is_int();
+    return $x;
 }
 
 sub bmfac {
-    my ($class, $x, $k, @r) = objectify(2, @_);
+    my ($class, $x, $k, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+                            ? (ref($_[0]), @_)
+                            : objectify(2, @_);
 
-    # inf => inf
-    return $x if $x->modify('bmfac') || $x->{sign} eq '+inf';
+    return $x if $x->modify('bmfac');
 
-    return $x->bnan() if ($x->is_nan() || $k->is_nan() ||
-                          $k < 1 || $x <= -$k ||
-                          $x->{_es} ne '+' || $k->{_es} ne '+');
+    return $x -> bnan(@r) if $x->is_nan() || $x->is_inf("-") || !$k->is_pos();
+    return $x -> binf("+", @r) if $x->is_inf("+");
 
-    return $x->bnan() if $x <= -$k;
+    if ($x <= -$k || !$x -> is_int() ||
+        ($k -> is_finite() && !$k -> is_int()))
+    {
+        return $upgrade -> bmfac($x, $k, @r) if defined($upgrade);
+        return $x -> bnan(@r);
+    }
 
     my $one = $class -> bone();
-    return $x->bone() if $x <= $one;
+    return $x->bone(@r) if $x <= $one;
 
     my $f = $x -> copy();
     while ($f -> bsub($k) > $one) {
-        $x -> bmul($f);
+        $x = $x -> bmul($f);
     }
-    $x->round(@r);
+
+    $x = $x->round(@r);
+
+    return $downgrade -> new($x -> bdstr(), @r)
+      if defined($downgrade) && $x -> is_int();
+    return $x;
 }
 
 sub blsft {
     # shift left by $y (multiply by $b ** $y)
 
     # set up parameters
-    my ($class, $x, $y, $b, $a, $p, $r) = (ref($_[0]), @_);
-
-    # objectify is costly, so avoid it
-    if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) {
-        ($class, $x, $y, $b, $a, $p, $r) = objectify(2, @_);
-    }
+    my ($class, $x, $y, $b, @r)
+      = ref($_[0]) && ref($_[0]) eq ref($_[1]) && ref($_[1]) eq ref($_[2])
+      ? (ref($_[0]), @_)
+      : objectify(2, @_);
 
     return $x if $x -> modify('blsft');
-    return $x if $x -> {sign} !~ /^[+-]$/; # nan, +inf, -inf
+
+    return $x -> bnan(@r) if $x -> is_nan() || $y -> is_nan();
 
     $b = 2 if !defined $b;
     $b = $class -> new($b) unless ref($b) && $b -> isa($class);
+    return $x -> bnan(@r) if $b -> is_nan();
 
-    return $x -> bnan() if $x -> is_nan() || $y -> is_nan() || $b -> is_nan();
+    # There needs to be more checking for special cases here. Fixme!
 
     # shift by a negative amount?
     return $x -> brsft($y -> copy() -> babs(), $b) if $y -> {sign} =~ /^-/;
 
-    $x -> bmul($b -> bpow($y), $a, $p, $r, $y);
+    $x = $x -> bmul($b -> bpow($y), $r[0], $r[1], $r[2], $y);
+
+    return $downgrade -> new($x -> bdstr(), @r) if defined($downgrade)
+      && ($x -> is_int() || $x -> is_inf() || $x -> is_nan());
+    return $x;
 }
 
 sub brsft {
     # shift right by $y (divide $b ** $y)
 
     # set up parameters
-    my ($class, $x, $y, $b, $a, $p, $r) = (ref($_[0]), @_);
-
-    # objectify is costly, so avoid it
-    if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) {
-        ($class, $x, $y, $b, $a, $p, $r) = objectify(2, @_);
-    }
+    my ($class, $x, $y, $b, @r)
+      = ref($_[0]) && ref($_[0]) eq ref($_[1]) && ref($_[1]) eq ref($_[2])
+      ? (ref($_[0]), @_)
+      : objectify(2, @_);
 
     return $x if $x -> modify('brsft');
-    return $x if $x -> {sign} !~ /^[+-]$/; # nan, +inf, -inf
+
+    return $x -> bnan(@r) if $x -> is_nan() || $y -> is_nan();
+
+    # There needs to be more checking for special cases here. Fixme!
 
     $b = 2 if !defined $b;
     $b = $class -> new($b) unless ref($b) && $b -> isa($class);
-
-    return $x -> bnan() if $x -> is_nan() || $y -> is_nan() || $b -> is_nan();
+    return $x -> bnan(@r) if $b -> is_nan();
 
     # shift by a negative amount?
     return $x -> blsft($y -> copy() -> babs(), $b) if $y -> {sign} =~ /^-/;
 
-    # the following call to bdiv() will return either quotient (scalar context)
-    # or quotient and remainder (list context).
-    $x -> bdiv($b -> bpow($y), $a, $p, $r, $y);
+    # call bdiv()
+    $x = $x -> bdiv($b -> bpow($y), $r[0], $r[1], $r[2], $y);
+
+    return $downgrade -> new($x -> bdstr(), @r) if defined($downgrade)
+      && ($x -> is_int() || $x -> is_inf() || $x -> is_nan());
+    return $x;
 }
 
 ###############################################################################
@@ -3562,24 +3848,20 @@ sub brsft {
 ###############################################################################
 
 sub band {
-    my $x     = shift;
-    my $xref  = ref($x);
-    my $class = $xref || $x;
-
-    croak 'band() is an instance method, not a class method' unless $xref;
-    croak 'Not enough arguments for band()' if @_ < 1;
+    my ($class, $x, $y, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+                            ? (ref($_[0]), @_)
+                            : objectify(2, @_);
 
     return if $x -> modify('band');
 
-    my $y = shift;
-    $y = $class -> new($y) unless ref($y);
-
-    my @r = @_;
+    return $x -> bnan(@r) if $x -> is_nan() || $y -> is_nan();
 
     my $xtmp = Math::BigInt -> new($x -> bint());   # to Math::BigInt
-    $xtmp -> band($y);
-    $xtmp = $class -> new($xtmp);                   # back to Math::BigFloat
+    $xtmp = $xtmp -> band($y);
+
+    return $xtmp -> round(@r) if defined $downgrade;
 
+    $xtmp = $class -> new($xtmp);                   # back to Math::BigFloat
     $x -> {sign} = $xtmp -> {sign};
     $x -> {_m}   = $xtmp -> {_m};
     $x -> {_es}  = $xtmp -> {_es};
@@ -3589,24 +3871,20 @@ sub band {
 }
 
 sub bior {
-    my $x     = shift;
-    my $xref  = ref($x);
-    my $class = $xref || $x;
-
-    croak 'bior() is an instance method, not a class method' unless $xref;
-    croak 'Not enough arguments for bior()' if @_ < 1;
+    my ($class, $x, $y, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+                            ? (ref($_[0]), @_)
+                            : objectify(2, @_);
 
     return if $x -> modify('bior');
 
-    my $y = shift;
-    $y = $class -> new($y) unless ref($y);
-
-    my @r = @_;
+    return $x -> bnan(@r) if $x -> is_nan() || $y -> is_nan();
 
     my $xtmp = Math::BigInt -> new($x -> bint());   # to Math::BigInt
-    $xtmp -> bior($y);
-    $xtmp = $class -> new($xtmp);                   # back to Math::BigFloat
+    $xtmp = $xtmp -> bior($y);
+
+    return $xtmp -> round(@r) if defined $downgrade;
 
+    $xtmp = $class -> new($xtmp);                   # back to Math::BigFloat
     $x -> {sign} = $xtmp -> {sign};
     $x -> {_m}   = $xtmp -> {_m};
     $x -> {_es}  = $xtmp -> {_es};
@@ -3616,24 +3894,20 @@ sub bior {
 }
 
 sub bxor {
-    my $x     = shift;
-    my $xref  = ref($x);
-    my $class = $xref || $x;
-
-    croak 'bxor() is an instance method, not a class method' unless $xref;
-    croak 'Not enough arguments for bxor()' if @_ < 1;
+    my ($class, $x, $y, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+                            ? (ref($_[0]), @_)
+                            : objectify(2, @_);
 
     return if $x -> modify('bxor');
 
-    my $y = shift;
-    $y = $class -> new($y) unless ref($y);
-
-    my @r = @_;
+    return $x -> bnan(@r) if $x -> is_nan() || $y -> is_nan();
 
     my $xtmp = Math::BigInt -> new($x -> bint());   # to Math::BigInt
-    $xtmp -> bxor($y);
-    $xtmp = $class -> new($xtmp);                   # back to Math::BigFloat
+    $xtmp = $xtmp -> bxor($y);
 
+    return $xtmp -> round(@r) if defined $downgrade;
+
+    $xtmp = $class -> new($xtmp);                   # back to Math::BigFloat
     $x -> {sign} = $xtmp -> {sign};
     $x -> {_m}   = $xtmp -> {_m};
     $x -> {_es}  = $xtmp -> {_es};
@@ -3643,20 +3917,18 @@ sub bxor {
 }
 
 sub bnot {
-    my $x     = shift;
-    my $xref  = ref($x);
-    my $class = $xref || $x;
-
-    croak 'bnot() is an instance method, not a class method' unless $xref;
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
 
     return if $x -> modify('bnot');
 
-    my @r = @_;
+    return $x -> bnan(@r) if $x -> is_nan();
 
     my $xtmp = Math::BigInt -> new($x -> bint());   # to Math::BigInt
-    $xtmp -> bnot();
-    $xtmp = $class -> new($xtmp);                   # back to Math::BigFloat
+    $xtmp = $xtmp -> bnot();
 
+    return $xtmp -> round(@r) if defined $downgrade;
+
+    $xtmp = $class -> new($xtmp);                   # back to Math::BigFloat
     $x -> {sign} = $xtmp -> {sign};
     $x -> {_m}   = $xtmp -> {_m};
     $x -> {_es}  = $xtmp -> {_es};
@@ -3671,19 +3943,18 @@ sub bnot {
 
 sub bround {
     # accuracy: preserve $N digits, and overwrite the rest with 0's
-    my $x = shift;
-    my $class = ref($x) || $x;
-    $x = $class->new(shift) if !ref($x);
 
-    if (($_[0] || 0) < 0) {
+    my ($class, $x, @a) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+    if (($a[0] || 0) < 0) {
         croak('bround() needs positive accuracy');
     }
 
     return $x if $x->modify('bround');
 
-    my ($scale, $mode) = $x->_scale_a(@_);
+    my ($scale, $mode) = $x->_scale_a(@a);
     if (!defined $scale) {         # no-op
-        return $downgrade->new($x) if defined($downgrade)
+        return $downgrade -> new($x) if defined($downgrade)
           && ($x->is_int() || $x->is_inf() || $x->is_nan());
         return $x;
     }
@@ -3694,7 +3965,7 @@ sub bround {
     # round a number with A=5 to 5 digits afterwards again
 
     if (defined $x->{_a} && $x->{_a} < $scale) {
-        return $downgrade->new($x) if defined($downgrade)
+        return $downgrade -> new($x) if defined($downgrade)
           && ($x->is_int() || $x->is_inf() || $x->is_nan());
         return $x;
     }
@@ -3704,7 +3975,7 @@ sub bround {
     # never round a +-inf, NaN
 
     if ($scale <= 0 || $x->{sign} !~ /^[+-]$/) {
-        return $downgrade->new($x) if defined($downgrade)
+        return $downgrade -> new($x) if defined($downgrade)
           && ($x->is_int() || $x->is_inf() || $x->is_nan());
         return $x;
     }
@@ -3713,7 +3984,7 @@ sub bround {
     # 2: if we should keep more digits than the mantissa has, do nothing
     if ($x->is_zero() || $LIB->_len($x->{_m}) <= $scale) {
         $x->{_a} = $scale if !defined $x->{_a} || $x->{_a} > $scale;
-        return $downgrade->new($x) if defined($downgrade)
+        return $downgrade -> new($x) if defined($downgrade)
           && ($x->is_int() || $x->is_inf() || $x->is_nan());
         return $x;
     }
@@ -3721,10 +3992,10 @@ sub bround {
     # pass sign to bround for '+inf' and '-inf' rounding modes
     my $m = bless { sign => $x->{sign}, value => $x->{_m} }, 'Math::BigInt';
 
-    $m->bround($scale, $mode);   # round mantissa
-    $x->{_m} = $m->{value};     # get our mantissa back
-    $x->{_a} = $scale;          # remember rounding
-    delete $x->{_p};            # and clear P
+    $m = $m->bround($scale, $mode);     # round mantissa
+    $x->{_m} = $m->{value};             # get our mantissa back
+    $x->{_a} = $scale;                  # remember rounding
+    delete $x->{_p};                    # and clear P
 
     # bnorm() downgrades if necessary, so no need to check whether to downgrade.
     $x->bnorm();                # del trailing zeros gen. by bround()
@@ -3734,15 +4005,14 @@ sub bfround {
     # precision: round to the $Nth digit left (+$n) or right (-$n) from the '.'
     # $n == 0 means round to integer
     # expects and returns normalized numbers!
-    my $x = shift;
-    my $class = ref($x) || $x;
-    $x = $class->new(shift) if !ref($x);
+
+    my ($class, $x, @p) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
 
     return $x if $x->modify('bfround'); # no-op
 
-    my ($scale, $mode) = $x->_scale_p(@_);
+    my ($scale, $mode) = $x->_scale_p(@p);
     if (!defined $scale) {
-        return $downgrade->new($x) if defined($downgrade)
+        return $downgrade -> new($x) if defined($downgrade)
           && ($x->is_int() || $x->is_inf() || $x->is_nan());
         return $x;
     }
@@ -3751,20 +4021,20 @@ sub bfround {
 
     if ($x->is_zero()) {
         $x->{_p} = $scale if !defined $x->{_p} || $x->{_p} < $scale; # -3 < -2
-        return $downgrade->new($x) if defined($downgrade)
+        return $downgrade -> new($x) if defined($downgrade)
           && ($x->is_int() || $x->is_inf() || $x->is_nan());
         return $x;
     }
 
     if ($x->{sign} !~ /^[+-]$/) {
-        return $downgrade->new($x) if defined($downgrade)
+        return $downgrade -> new($x) if defined($downgrade)
           && ($x->is_int() || $x->is_inf() || $x->is_nan());
         return $x;
     }
 
     # don't round if x already has lower precision
     if (defined $x->{_p} && $x->{_p} < 0 && $scale < $x->{_p}) {
-        return $downgrade->new($x) if defined($downgrade)
+        return $downgrade -> new($x) if defined($downgrade)
           && ($x->is_int() || $x->is_inf() || $x->is_nan());
         return $x;
     }
@@ -3775,7 +4045,7 @@ sub bfround {
         # round right from the '.'
 
         if ($x->{_es} eq '+') { # e >= 0 => nothing to round
-            return $downgrade->new($x) if defined($downgrade)
+            return $downgrade -> new($x) if defined($downgrade)
               && ($x->is_int() || $x->is_inf() || $x->is_nan());
             return $x;
         }
@@ -3800,15 +4070,16 @@ sub bfround {
         # do not round after/right of the $dad
 
         if ($scale > $dad) { # 0.123, scale >= 3 => exit
-            return $downgrade->new($x) if defined($downgrade)
+            return $downgrade -> new($x) if defined($downgrade)
               && ($x->is_int() || $x->is_inf() || $x->is_nan());
             return $x;
         }
 
         # round to zero if rounding inside the $zad, but not for last zero like:
-        # 0.0065, scale -2, round last '0' with following '65' (scale == zad case)
+        # 0.0065, scale -2, round last '0' with following '65' (scale == zad
+        # case)
         if ($scale < $zad) {
-            return $downgrade->new($x) if defined($downgrade)
+            return $downgrade -> new($x) if defined($downgrade)
               && ($x->is_int() || $x->is_inf() || $x->is_nan());
             return $x->bzero();
         }
@@ -3837,7 +4108,7 @@ sub bfround {
         $scale = 1 if $scale == 0;
         # shortcut if already integer
         if ($scale == 1 && $dbt <= $dbd) {
-            return $downgrade->new($x) if defined($downgrade)
+            return $downgrade -> new($x) if defined($downgrade)
               && ($x->is_int() || $x->is_inf() || $x->is_nan());
             return $x;
         }
@@ -3846,7 +4117,7 @@ sub bfround {
 
         if ($scale > $dbd) {
             # not enough digits before dot, so round to zero
-            return $downgrade->new($x) if defined($downgrade);
+            return $downgrade -> new($x) if defined($downgrade);
             return $x->bzero;
         } elsif ($scale == $dbd) {
             # maximum
@@ -3858,7 +4129,7 @@ sub bfround {
 
     # pass sign to bround for rounding modes '+inf' and '-inf'
     my $m = bless { sign => $x->{sign}, value => $x->{_m} }, 'Math::BigInt';
-    $m->bround($scale, $mode);
+    $m = $m->bround($scale, $mode);
     $x->{_m} = $m->{value};     # get our mantissa back
 
     # bnorm() downgrades if necessary, so no need to check whether to downgrade.
@@ -3871,6 +4142,8 @@ sub bfloor {
 
     return $x if $x->modify('bfloor');
 
+    return $x -> bnan(@r) if $x -> is_nan();
+
     if ($x->{sign} =~ /^[+-]$/) {
         # if $x has digits after dot, remove them
         if ($x->{_es} eq '-') {
@@ -3880,9 +4153,9 @@ sub bfloor {
             # increment if negative
             $x->{_m} = $LIB->_inc($x->{_m}) if $x->{sign} eq '-';
         }
-        $x->round(@r);
+        $x = $x->round(@r);
     }
-    return $downgrade->new($x, @r) if defined($downgrade);
+    return $downgrade -> new($x -> bdstr(), @r) if defined($downgrade);
     return $x;
 }
 
@@ -3892,6 +4165,8 @@ sub bceil {
 
     return $x if $x->modify('bceil');
 
+    return $x -> bnan(@r) if $x -> is_nan();
+
     # if $x has digits after dot, remove them
     if ($x->{sign} =~ /^[+-]$/) {
         if ($x->{_es} eq '-') {
@@ -3904,10 +4179,10 @@ sub bceil {
                 $x->{sign} = '+' if $LIB->_is_zero($x->{_m});   # avoid -0
             }
         }
-        $x->round(@r);
+        $x = $x->round(@r);
     }
 
-    return $downgrade->new($x, @r) if defined($downgrade);
+    return $downgrade -> new($x -> bdstr(), @r) if defined($downgrade);
     return $x;
 }
 
@@ -3917,18 +4192,20 @@ sub bint {
 
     return $x if $x->modify('bint');
 
+    return $x -> bnan(@r) if $x -> is_nan();
+
     if ($x->{sign} =~ /^[+-]$/) {
         # if $x has digits after the decimal point
         if ($x->{_es} eq '-') {
-            $x->{_m} = $LIB->_rsft($x->{_m}, $x->{_e}, 10); # remove fraction part
+            $x->{_m} = $LIB->_rsft($x->{_m}, $x->{_e}, 10); # remove frac part
             $x->{_e} = $LIB->_zero();                       # truncate/normalize
             $x->{_es} = '+';                                # abs e
             $x->{sign} = '+' if $LIB->_is_zero($x->{_m});   # avoid -0
         }
-        $x->round(@r);
+        $x = $x->round(@r);
     }
 
-    return $downgrade->new($x, @r) if defined($downgrade);
+    return $downgrade -> new($x -> bdstr(), @r) if defined($downgrade);
     return $x;
 }
 
@@ -3940,8 +4217,14 @@ sub bgcd {
     # (BINT or num_str, BINT or num_str) return BINT
     # does not modify arguments, but returns new object
 
-    unshift @_, __PACKAGE__
-      unless ref($_[0]) || $_[0] =~ /^[a-z]\w*(?:::[a-z]\w*)*$/i;
+    # Class::method(...) -> Class->method(...)
+    unless (@_ && (defined(blessed($_[0])) && $_[0] -> isa(__PACKAGE__) ||
+                   $_[0] =~ /^[a-z]\w*(?:::[a-z]\w*)*$/i))
+    {
+        #carp "Using ", (caller(0))[3], "() as a function is deprecated;",
+        #  " use is as a method instead";
+        unshift @_, __PACKAGE__;
+    }
 
     my ($class, @args) = objectify(0, @_);
 
@@ -3961,7 +4244,11 @@ sub bgcd {
 
         last if $x -> is_one();
     }
-    return $x -> babs();
+    $x = $x -> babs();
+
+    return $downgrade -> new($x)
+      if defined $downgrade && $x->is_int();
+    return $x;
 }
 
 sub blcm {
@@ -3969,8 +4256,14 @@ sub blcm {
     # does not modify arguments, but returns new object
     # Least Common Multiple
 
-    unshift @_, __PACKAGE__
-      unless ref($_[0]) || $_[0] =~ /^[a-z]\w*(?:::[a-z]\w*)*$/i;
+    # Class::method(...) -> Class->method(...)
+    unless (@_ && (defined(blessed($_[0])) && $_[0] -> isa(__PACKAGE__) ||
+                   $_[0] =~ /^[a-z]\w*(?:::[a-z]\w*)*$/i))
+    {
+        #carp "Using ", (caller(0))[3], "() as a function is deprecated;",
+        #  " use is as a method instead";
+        unshift @_, __PACKAGE__;
+    }
 
     my ($class, @args) = objectify(0, @_);
 
@@ -3983,10 +4276,14 @@ sub blcm {
         $y = $class -> new($y) unless ref($y) && $y -> isa($class);
         return $x->bnan() unless $y -> is_int();
         my $gcd = $x -> bgcd($y);
-        $x -> bdiv($gcd) -> bmul($y);
+        $x = $x -> bdiv($gcd) -> bmul($y);
     }
 
-    return $x -> babs();
+    $x = $x -> babs();
+
+    return $downgrade -> new($x)
+      if defined $downgrade && $x->is_int();
+    return $x;
 }
 
 ###############################################################################
@@ -3994,9 +4291,9 @@ sub blcm {
 ###############################################################################
 
 sub length {
-    my $x = shift;
-    my $class = ref($x) || $x;
-    $x = $class->new(shift) unless ref($x);
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
 
     return 1 if $LIB->_is_zero($x->{_m});
 
@@ -4012,7 +4309,13 @@ sub length {
 
 sub mantissa {
     # return a copy of the mantissa
-    my ($class, $x) = ref($_[0]) ? (ref($_[0]), $_[0]) : objectify(1, @_);
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+    # The following line causes a lot of noise in the test suits for
+    # the Math-BigRat and bignum distributions. Fixme!
+    #carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
+
+    return $x -> bnan(@r) if $x -> is_nan();
 
     if ($x->{sign} !~ /^[+-]$/) {
         my $s = $x->{sign};
@@ -4020,14 +4323,19 @@ sub mantissa {
         return Math::BigInt->new($s, undef, undef); # -inf, +inf => +inf
     }
     my $m = Math::BigInt->new($LIB->_str($x->{_m}), undef, undef);
-    $m->bneg() if $x->{sign} eq '-';
-
+    $m = $m->bneg() if $x->{sign} eq '-';
     $m;
 }
 
 sub exponent {
     # return a copy of the exponent
-    my ($class, $x) = ref($_[0]) ? (ref($_[0]), $_[0]) : objectify(1, @_);
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+    # The following line causes a lot of noise in the test suits for
+    # the Math-BigRat and bignum distributions. Fixme!
+    #carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
+
+    return $x -> bnan(@r) if $x -> is_nan();
 
     if ($x->{sign} !~ /^[+-]$/) {
         my $s = $x->{sign};
@@ -4039,32 +4347,37 @@ sub exponent {
 
 sub parts {
     # return a copy of both the exponent and the mantissa
-    my ($class, $x) = ref($_[0]) ? (ref($_[0]), $_[0]) : objectify(1, @_);
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
 
     if ($x->{sign} !~ /^[+-]$/) {
         my $s = $x->{sign};
         $s =~ s/^\+//;
         my $se = $s;
         $se =~ s/^-//;
-        return ($class->new($s), $class->new($se)); # +inf => inf and -inf, +inf => inf
+        # +inf => inf and -inf, +inf => inf
+        return ($class->new($s), $class->new($se));
     }
     my $m = Math::BigInt->bzero();
     $m->{value} = $LIB->_copy($x->{_m});
-    $m->bneg() if $x->{sign} eq '-';
+    $m = $m->bneg() if $x->{sign} eq '-';
     ($m, Math::BigInt->new($x->{_es} . $LIB->_num($x->{_e})));
 }
 
+# Parts used for scientific notation with significand/mantissa and exponent as
+# integers. E.g., "12345.6789" is returned as "123456789" (mantissa) and "-4"
+# (exponent).
+
 sub sparts {
-    my $self  = shift;
-    my $class = ref $self;
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
 
-    croak("sparts() is an instance method, not a class method")
-        unless $class;
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
 
     # Not-a-number.
 
-    if ($self -> is_nan()) {
-        my $mant = $self -> copy();             # mantissa
+    if ($x -> is_nan()) {
+        my $mant = $class -> bnan();            # mantissa
         return $mant unless wantarray;          # scalar context
         my $expo = $class -> bnan();            # exponent
         return ($mant, $expo);                  # list context
@@ -4072,8 +4385,8 @@ sub sparts {
 
     # Infinity.
 
-    if ($self -> is_inf()) {
-        my $mant = $self -> copy();             # mantissa
+    if ($x -> is_inf()) {
+        my $mant = $class -> binf($x->{sign});  # mantissa
         return $mant unless wantarray;          # scalar context
         my $expo = $class -> binf('+');         # exponent
         return ($mant, $expo);                  # list context
@@ -4081,56 +4394,46 @@ sub sparts {
 
     # Finite number.
 
-    my $mant = $self -> copy() -> bzero();
-    $mant -> {sign} = $self -> {sign};
-    $mant -> {_m}   = $LIB->_copy($self -> {_m});
+    my $mant = $x -> copy();
+    $mant->{_es} = '+';
+    $mant->{_e}  = $LIB->_zero();
+    $mant = $downgrade -> new($mant) if defined $downgrade;
     return $mant unless wantarray;
 
-    my $expo = $class -> bzero();
-    $expo -> {sign} = $self -> {_es};
-    $expo -> {_m}   = $LIB->_copy($self -> {_e});
-
+    my $expo = bless { sign => $x -> {_es},
+                       _m   => $LIB->_copy($x -> {_e}),
+                       _es  => '+',
+                       _e   => $LIB->_zero(),
+                     }, $class;
+    $expo = $downgrade -> new($expo) if defined $downgrade;
     return ($mant, $expo);
 }
 
-sub nparts {
-    my $self  = shift;
-    my $class = ref $self;
-
-    croak("nparts() is an instance method, not a class method")
-        unless $class;
+# Parts used for normalized notation with significand/mantissa as either 0 or a
+# number in the semi-open interval [1,10). E.g., "12345.6789" is returned as
+# "1.23456789" and "4".
 
-    # Not-a-number.
+sub nparts {
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
 
-    if ($self -> is_nan()) {
-        my $mant = $self -> copy();             # mantissa
-        return $mant unless wantarray;          # scalar context
-        my $expo = $class -> bnan();            # exponent
-        return ($mant, $expo);                  # list context
-    }
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
 
-    # Infinity.
+    # Not-a-number and Infinity.
 
-    if ($self -> is_inf()) {
-        my $mant = $self -> copy();             # mantissa
-        return $mant unless wantarray;          # scalar context
-        my $expo = $class -> binf('+');         # exponent
-        return ($mant, $expo);                  # list context
-    }
+    return $x -> sparts() if $x -> is_nan() || $x -> is_inf();
 
     # Finite number.
 
-    my ($mant, $expo) = $self -> sparts();
+    my ($mant, $expo) = $x -> sparts();
 
     if ($mant -> bcmp(0)) {
         my ($ndigtot, $ndigfrac) = $mant -> length();
         my $expo10adj = $ndigtot - $ndigfrac - 1;
 
-        if ($expo10adj != 0) {
-            my $factor  = "1e" . -$expo10adj;
-            $mant -> bmul($factor);
+        if ($expo10adj > 0) {          # if mantissa is not an integer
+            $mant = $mant -> brsft($expo10adj, 10);
             return $mant unless wantarray;
-            $expo -> badd($expo10adj);
+            $expo = $expo -> badd($expo10adj);
             return ($mant, $expo);
         }
     }
@@ -4139,113 +4442,139 @@ sub nparts {
     return ($mant, $expo);
 }
 
+# Parts used for engineering notation with significand/mantissa as either 0 or a
+# number in the semi-open interval [1,1000) and the exponent is a multiple of 3.
+# E.g., "12345.6789" is returned as "12.3456789" and "3".
+
 sub eparts {
-    my $self  = shift;
-    my $class = ref $self;
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
 
-    croak("eparts() is an instance method, not a class method")
-        unless $class;
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
 
     # Not-a-number and Infinity.
 
-    return $self -> sparts() if $self -> is_nan() || $self -> is_inf();
+    return $x -> sparts() if $x -> is_nan() || $x -> is_inf();
 
     # Finite number.
 
-    my ($mant, $expo) = $self -> nparts();
+    my ($mant, $expo) = $x -> nparts();
 
     my $c = $expo -> copy() -> bmod(3);
-    $mant -> blsft($c, 10);
+    $mant = $mant -> blsft($c, 10);
     return $mant unless wantarray;
 
-    $expo -> bsub($c);
+    $expo = $expo -> bsub($c);
     return ($mant, $expo);
 }
 
+# Parts used for decimal notation, e.g., "12345.6789" is returned as "12345"
+# (integer part) and "0.6789" (fraction part).
+
 sub dparts {
-    my $self  = shift;
-    my $class = ref $self;
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
 
-    croak("dparts() is an instance method, not a class method")
-        unless $class;
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
 
-    # Not-a-number and Infinity.
+    # Not-a-number.
 
-    if ($self -> is_nan() || $self -> is_inf()) {
-        my $int = $self -> copy();
+    if ($x -> is_nan()) {
+        my $int = $class -> bnan();
+        return $int unless wantarray;
+        my $frc = $class -> bzero();    # or NaN?
+        return ($int, $frc);
+    }
+
+    # Infinity.
+
+    if ($x -> is_inf()) {
+        my $int = $class -> binf($x->{sign});
         return $int unless wantarray;
         my $frc = $class -> bzero();
         return ($int, $frc);
     }
 
-    my $int = $self  -> copy();
-    my $frc = $class -> bzero();
+    # Finite number.
+
+    my $int = $x -> copy();
+    my $frc;
+
+    # If the input is an integer.
+
+    if ($int->{_es} eq '+') {
+        $frc = $class -> bzero();
+    }
 
-    # If the input has a fraction part.
+    # If the input has a fraction part
 
-    if ($int->{_es} eq '-') {
+    else {
         $int->{_m} = $LIB -> _rsft($int->{_m}, $int->{_e}, 10);
         $int->{_e} = $LIB -> _zero();
         $int->{_es} = '+';
         $int->{sign} = '+' if $LIB->_is_zero($int->{_m});   # avoid -0
-
         return $int unless wantarray;
-        $frc = $self -> copy() -> bsub($int);
+        $frc = $x -> copy() -> bsub($int);
         return ($int, $frc);
     }
 
+    $int = $downgrade -> new($int) if defined $downgrade;
     return $int unless wantarray;
-    return ($int, $frc);
+    return $int, $frc;
 }
 
+# Fractional parts with the numerator and denominator as integers. E.g.,
+# "123.4375" is returned as "1975" and "16".
+
 sub fparts {
-    my $x = shift;
-    my $class = ref $x;
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
 
-    croak("fparts() is an instance method") unless $class;
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
 
-    return ($class -> bnan(),
-            $class -> bnan()) if $x -> is_nan();
+    # NaN => NaN/NaN
 
-    return ($class -> binf($x -> sign()),
-            $class -> bone()) if $x -> is_inf();
+    if ($x -> is_nan()) {
+        return $class -> bnan() unless wantarray;
+        return $class -> bnan(), $class -> bnan();
+    }
 
-    return ($class -> bzero(),
-            $class -> bone()) if $x -> is_zero();
+    # ±Inf => ±Inf/1
 
-    if ($x -> {_es} eq '-') {                   # exponent < 0
-        my $numer_lib = $LIB -> _copy($x -> {_m});
-        my $denom_lib = $LIB -> _1ex($x -> {_e});
-        my $gcd_lib = $LIB -> _gcd($LIB -> _copy($numer_lib), $denom_lib);
-        $numer_lib = $LIB -> _div($numer_lib, $gcd_lib);
-        $denom_lib = $LIB -> _div($denom_lib, $gcd_lib);
-        return ($class -> new($x -> {sign} . $LIB -> _str($numer_lib)),
-                $class -> new($LIB -> _str($denom_lib)));
+    if ($x -> is_inf()) {
+        my $numer = $class -> binf($x->{sign});
+        return $numer unless wantarray;
+        my $denom = $class -> bone();
+        return $numer, $denom;
     }
 
-    elsif (! $LIB -> _is_zero($x -> {_e})) {    # exponent > 0
-        my $numer_lib = $LIB -> _copy($x -> {_m});
-        $numer_lib = $LIB -> _lsft($numer_lib, $x -> {_e}, 10);
-        return ($class -> new($x -> {sign} . $LIB -> _str($numer_lib)),
-                $class -> bone());
-    }
+    # Finite number.
 
-    else {                                      # exponent = 0
-        return ($class -> new($x -> {sign} . $LIB -> _str($x -> {_m})),
-                $class -> bone());
-    }
+    # If we get here, we know that the output is an integer.
+
+    $class = $downgrade if defined $downgrade;
+
+    my @flt_parts = ($x->{sign}, $x->{_m}, $x->{_es}, $x->{_e});
+    my @rat_parts = $class -> _flt_lib_parts_to_rat_lib_parts(@flt_parts);
+    my $num = $class -> new($LIB -> _str($rat_parts[1]));
+    my $den = $class -> new($LIB -> _str($rat_parts[2]));
+    $num = $num -> bneg() if $rat_parts[0] eq "-";
+    return $num unless wantarray;
+    return $num, $den;
 }
 
+# Given "123.4375", returns "1975", since "123.4375" is "1975/16".
+
 sub numerator {
-    my $x = shift;
-    my $class = ref $x;
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
 
-    croak("numerator() is an instance method") unless $class;
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
 
     return $class -> bnan()             if $x -> is_nan();
     return $class -> binf($x -> sign()) if $x -> is_inf();
     return $class -> bzero()            if $x -> is_zero();
 
+    # If we get here, we know that the output is an integer.
+
+    $class = $downgrade if defined $downgrade;
+
     if ($x -> {_es} eq '-') {                   # exponent < 0
         my $numer_lib = $LIB -> _copy($x -> {_m});
         my $denom_lib = $LIB -> _1ex($x -> {_e});
@@ -4265,14 +4594,19 @@ sub numerator {
     }
 }
 
+# Given "123.4375", returns "16", since "123.4375" is "1975/16".
+
 sub denominator {
-    my $x = shift;
-    my $class = ref $x;
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
 
-    croak("denominator() is an instance method") unless $class;
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
 
     return $class -> bnan() if $x -> is_nan();
 
+    # If we get here, we know that the output is an integer.
+
+    $class = $downgrade if defined $downgrade;
+
     if ($x -> {_es} eq '-') {                   # exponent < 0
         my $numer_lib = $LIB -> _copy($x -> {_m});
         my $denom_lib = $LIB -> _1ex($x -> {_e});
@@ -4294,13 +4628,19 @@ sub bstr {
     # (ref to BFLOAT or num_str) return num_str
     # Convert number from internal format to (non-scientific) string format.
     # internal format is always normalized (no leading zeros, "-0" => "+0")
-    my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_);
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
 
-    if ($x->{sign} !~ /^[+-]$/) {
-        return $x->{sign} unless $x->{sign} eq '+inf'; # -inf, NaN
-        return 'inf';                                  # +inf
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
+
+    # Inf and NaN
+
+    if ($x->{sign} ne '+' && $x->{sign} ne '-') {
+        return $x->{sign} unless $x->{sign} eq '+inf';  # -inf, NaN
+        return 'inf';                                   # +inf
     }
 
+    # Finite number
+
     my $es = '0';
     my $len = 1;
     my $cad = 0;
@@ -4348,91 +4688,243 @@ sub bstr {
     $es;
 }
 
-# Decimal notation, e.g., "12345.6789".
+# Decimal notation, e.g., "12345.6789" (no exponent).
 
 sub bdstr {
-    my $x = shift;
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
+
+    # Inf and NaN
 
     if ($x->{sign} ne '+' && $x->{sign} ne '-') {
-        return $x->{sign} unless $x->{sign} eq '+inf'; # -inf, NaN
-        return 'inf';                                  # +inf
+        return $x->{sign} unless $x->{sign} eq '+inf';  # -inf, NaN
+        return 'inf';                                   # +inf
     }
 
+    # Upgrade?
+
+    return $upgrade -> bdstr($x, @r)
+      if defined($upgrade) && !$x -> isa($class);
+
+    # Finite number
+
     my $mant = $LIB->_str($x->{_m});
-    my $expo = $x -> exponent();
+    my $esgn = $x->{_es};
+    my $eabs = $LIB -> _num($x->{_e});
+
+    my $uintmax = ~0;
 
     my $str = $mant;
-    if ($expo >= 0) {
-        $str .= "0" x $expo;
+    if ($esgn eq '+') {
+
+        croak("The absolute value of the exponent is too large")
+          if $eabs > $uintmax;
+
+        $str .= "0" x $eabs;
+
     } else {
-        my $mantlen = CORE::length($mant);
-        my $c = $mantlen + $expo;
+        my $mlen = CORE::length($mant);
+        my $c = $mlen - $eabs;
+
+        my $intmax = ($uintmax - 1) / 2;
+        croak("The absolute value of the exponent is too large")
+          if (1 - $c) > $intmax;
+
         $str = "0" x (1 - $c) . $str if $c <= 0;
-        substr($str, $expo, 0) = '.';
+        substr($str, -$eabs, 0) = '.';
     }
 
-    return $x->{sign} eq '-' ? "-$str" : $str;
+    return $x->{sign} eq '-' ? '-' . $str : $str;
 }
 
-# Scientific notation with significand/mantissa as an integer, e.g., "12345.6789"
-# is written as "123456789e-4".
+# Scientific notation with significand/mantissa and exponent as integers, e.g.,
+# "12345.6789" is written as "123456789e-4".
 
 sub bsstr {
-    my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_);
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
+
+    # Inf and NaN
 
     if ($x->{sign} ne '+' && $x->{sign} ne '-') {
-        return $x->{sign} unless $x->{sign} eq '+inf'; # -inf, NaN
-        return 'inf';                                  # +inf
+        return $x->{sign} unless $x->{sign} eq '+inf';  # -inf, NaN
+        return 'inf';                                   # +inf
     }
 
-    my $str = $LIB->_str($x->{_m}) . 'e' . $x->{_es}. $LIB->_str($x->{_e});
-    return $x->{sign} eq '-' ? "-$str" : $str;
+    # Upgrade?
+
+    return $upgrade -> bsstr($x, @r)
+      if defined($upgrade) && !$x -> isa($class);
+
+    # Finite number
+
+    ($x->{sign} eq '-' ? '-' : '') . $LIB->_str($x->{_m})
+      . 'e' . $x->{_es} . $LIB->_str($x->{_e});
 }
 
 # Normalized notation, e.g., "12345.6789" is written as "1.23456789e+4".
 
 sub bnstr {
-    my $x = shift;
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
+
+    # Inf and NaN
 
     if ($x->{sign} ne '+' && $x->{sign} ne '-') {
-        return $x->{sign} unless $x->{sign} eq '+inf'; # -inf, NaN
-        return 'inf';                                  # +inf
+        return $x->{sign} unless $x->{sign} eq '+inf';  # -inf, NaN
+        return 'inf';                                   # +inf
     }
 
-    my ($mant, $expo) = $x -> nparts();
+    # Upgrade?
+
+    return $upgrade -> bnstr($x, @r)
+      if defined($upgrade) && !$x -> isa($class);
+
+    # Finite number
+
+    my $str = $x->{sign} eq '-' ? '-' : '';
+
+    # Get the mantissa and the length of the mantissa.
+
+    my $mant = $LIB->_str($x->{_m});
+    my $mantlen = CORE::length($mant);
+
+    if ($mantlen == 1) {
+
+        # Not decimal point when the mantissa has length one, i.e., return the
+        # number 2 as the string "2", not "2.".
+
+        $str .= $mant . 'e' . $x->{_es} . $LIB->_str($x->{_e});
+
+    } else {
+
+        # Compute new exponent where the original exponent is adjusted by the
+        # length of the mantissa minus one (because the decimal point is after
+        # one digit).
 
-    my $esgn = $expo < 0 ? '-' : '+';
-    my $eabs = $expo -> babs() -> bfround(0) -> bstr();
-    #$eabs = '0' . $eabs if length($eabs) < 2;
+        my ($eabs, $esgn) = $LIB -> _sadd($LIB -> _copy($x->{_e}), $x->{_es},
+                                      $LIB -> _new($mantlen - 1), "+");
+        substr $mant, 1, 0, ".";
+        $str .= $mant . 'e' . $esgn . $LIB->_str($eabs);
+
+    }
 
-    return $mant . 'e' . $esgn . $eabs;
+    return $str;
 }
 
 # Engineering notation, e.g., "12345.6789" is written as "12.3456789e+3".
 
 sub bestr {
-    my $x = shift;
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
+
+    # Inf and NaN
+
+    if ($x->{sign} ne '+' && $x->{sign} ne '-') {
+        return $x->{sign} unless $x->{sign} eq '+inf';  # -inf, NaN
+        return 'inf';                                   # +inf
+    }
+
+    # Upgrade?
+
+    return $upgrade -> bestr($x, @r)
+      if defined($upgrade) && !$x -> isa($class);
+
+    # Finite number
+
+    my $str = $x->{sign} eq '-' ? '-' : '';
+
+    # Get the mantissa, the length of the mantissa, and adjust the exponent by
+    # the length of the mantissa minus 1 (because the dot is after one digit).
+
+    my $mant = $LIB->_str($x->{_m});
+    my $mantlen = CORE::length($mant);
+    my ($eabs, $esgn) = $LIB -> _sadd($LIB -> _copy($x->{_e}), $x->{_es},
+                                  $LIB -> _new($mantlen - 1), "+");
+
+    my $dotpos = 1;
+    my $mod = $LIB -> _mod($LIB -> _copy($eabs), $LIB -> _new("3"));
+    unless ($LIB -> _is_zero($mod)) {
+        if ($esgn eq '+') {
+            $eabs = $LIB -> _sub($eabs, $mod);
+            $dotpos += $LIB -> _num($mod);
+        } else {
+            my $delta = $LIB -> _sub($LIB -> _new("3"), $mod);
+            $eabs = $LIB -> _add($eabs, $delta);
+            $dotpos += $LIB -> _num($delta);
+        }
+    }
+
+    if ($dotpos < $mantlen) {
+        substr $mant, $dotpos, 0, ".";
+    } elsif ($dotpos > $mantlen) {
+        $mant .= "0" x ($dotpos - $mantlen);
+    }
+
+    $str .= $mant . 'e' . $esgn . $LIB->_str($eabs);
+
+    return $str;
+}
+
+# Fractional notation, e.g., "123.4375" is written as "1975/16".
+
+sub bfstr {
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), $_[0]) : objectify(1, @_);
+
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
+
+    # Inf and NaN
 
     if ($x->{sign} ne '+' && $x->{sign} ne '-') {
-        return $x->{sign} unless $x->{sign} eq '+inf'; # -inf, NaN
-        return 'inf';                                  # +inf
+        return $x->{sign} unless $x->{sign} eq '+inf';  # -inf, NaN
+        return 'inf';                                   # +inf
     }
 
-    my ($mant, $expo) = $x -> eparts();
+    # Upgrade?
+
+    return $upgrade -> bfstr($x, @r)
+      if defined($upgrade) && !$x -> isa($class);
 
-    my $esgn = $expo < 0 ? '-' : '+';
-    my $eabs = $expo -> babs() -> bfround(0) -> bstr();
-    #$eabs = '0' . $eabs if length($eabs) < 2;
+    # Finite number
 
-    return $mant . 'e' . $esgn . $eabs;
+    my $str = $x->{sign} eq '-' ? '-' : '';
+
+    if ($x->{_es} eq '+') {
+        $str .= $LIB -> _str($x->{_m}) . ("0" x $LIB -> _num($x->{_e}));
+    } else {
+        my @flt_parts = ($x->{sign}, $x->{_m}, $x->{_es}, $x->{_e});
+        my @rat_parts = $class -> _flt_lib_parts_to_rat_lib_parts(@flt_parts);
+        $str = $LIB -> _str($rat_parts[1]) . "/" . $LIB -> _str($rat_parts[2]);
+        $str = "-" . $str if $rat_parts[0] eq "-";
+    }
+
+    return $str;
 }
 
 sub to_hex {
     # return number as hexadecimal string (only for integers defined)
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), $_[0]) : objectify(1, @_);
 
-    my ($class, $x) = ref($_[0]) ? (ref($_[0]), $_[0]) : objectify(1, @_);
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
+
+    # Inf and NaN
+
+    if ($x->{sign} ne '+' && $x->{sign} ne '-') {
+        return $x->{sign} unless $x->{sign} eq '+inf';  # -inf, NaN
+        return 'inf';                                   # +inf
+    }
+
+    # Upgrade?
+
+    return $upgrade -> to_hex($x, @r)
+      if defined($upgrade) && !$x -> isa($class);
+
+    # Finite number
 
-    return $x->bstr() if $x->{sign} !~ /^[+-]$/; # inf, nan etc
     return '0' if $x->is_zero();
 
     return $nan if $x->{_es} ne '+';    # how to do 1e-1 in hex?
@@ -4447,10 +4939,24 @@ sub to_hex {
 
 sub to_oct {
     # return number as octal digit string (only for integers defined)
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), $_[0]) : objectify(1, @_);
 
-    my ($class, $x) = ref($_[0]) ? (ref($_[0]), $_[0]) : objectify(1, @_);
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
+
+    # Inf and NaN
+
+    if ($x->{sign} ne '+' && $x->{sign} ne '-') {
+        return $x->{sign} unless $x->{sign} eq '+inf';  # -inf, NaN
+        return 'inf';                                   # +inf
+    }
+
+    # Upgrade?
+
+    return $upgrade -> to_hex($x, @r)
+      if defined($upgrade) && !$x -> isa($class);
+
+    # Finite number
 
-    return $x->bstr() if $x->{sign} !~ /^[+-]$/; # inf, nan etc
     return '0' if $x->is_zero();
 
     return $nan if $x->{_es} ne '+';    # how to do 1e-1 in octal?
@@ -4465,10 +4971,24 @@ sub to_oct {
 
 sub to_bin {
     # return number as binary digit string (only for integers defined)
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), $_[0]) : objectify(1, @_);
 
-    my ($class, $x) = ref($_[0]) ? (ref($_[0]), $_[0]) : objectify(1, @_);
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
+
+    # Inf and NaN
+
+    if ($x->{sign} ne '+' && $x->{sign} ne '-') {
+        return $x->{sign} unless $x->{sign} eq '+inf';  # -inf, NaN
+        return 'inf';                                   # +inf
+    }
+
+    # Upgrade?
+
+    return $upgrade -> to_hex($x, @r)
+      if defined($upgrade) && !$x -> isa($class);
+
+    # Finite number
 
-    return $x->bstr() if $x->{sign} !~ /^[+-]$/; # inf, nan etc
     return '0' if $x->is_zero();
 
     return $nan if $x->{_es} ne '+';    # how to do 1e-1 in binary?
@@ -4482,9 +5002,9 @@ sub to_bin {
 }
 
 sub to_ieee754 {
-    my $x = shift;
-    my $format = shift;
-    my $class = ref $x;
+    my ($class, $x, $format, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
 
     my $enc;            # significand encoding (applies only to decimal)
     my $k;              # storage width in bits
@@ -4621,22 +5141,22 @@ sub to_ieee754 {
 
             $expo = $class -> new($expo_est);
             if ($expo_est > 0) {
-                $mant -> bmul($binv -> copy() -> bpow($expo));
+                $mant = $mant -> bmul($binv -> copy() -> bpow($expo));
             } elsif ($expo_est < 0) {
                 my $expo_abs = $expo -> copy() -> bneg();
-                $mant -> bmul($b -> copy() -> bpow($expo_abs));
+                $mant = $mant -> bmul($b -> copy() -> bpow($expo_abs));
             }
 
             # Final adjustment of the estimate above.
 
             while ($mant >= $b && $expo <= $emax) {
-                $mant -> bmul($binv);
-                $expo -> binc();
+                $mant = $mant -> bmul($binv);
+                $expo = $expo -> binc();
             }
 
             while ($mant < $one && $expo >= $emin) {
-                $mant -> bmul($b);
-                $expo -> bdec();
+                $mant = $mant -> bmul($b);
+                $expo = $expo -> bdec();
             }
 
             # This is when the magnitude is larger than what can be represented
@@ -4664,15 +5184,15 @@ sub to_ieee754 {
                 # Scale up the mantissa (significand), and round to integer.
 
                 my $const = $class -> new($b) -> bpow($t - 1);
-                $mant -> bmul($const);
-                $mant -> bfround(0);
+                $mant = $mant -> bmul($const);
+                $mant = $mant -> bfround(0);
 
                 # If the mantissa overflowed, encode as the smallest normal
                 # number.
 
                 if ($mant == $const -> bmul($b)) {
-                    $mant -> bzero();
-                    $expo -> binc();
+                    $mant = $mant -> bzero();
+                    $expo = $expo -> binc();
                 }
             }
 
@@ -4684,22 +5204,22 @@ sub to_ieee754 {
                 # Remove implicit leading bit, scale up the mantissa
                 # (significand) to an integer, and round.
 
-                $mant -> bdec();
+                $mant = $mant -> bdec();
                 my $const = $class -> new($b) -> bpow($t);
-                $mant -> bmul($const) -> bfround(0);
+                $mant = $mant -> bmul($const) -> bfround(0);
 
                 # If the mantissa overflowed, encode as the next larger value.
                 # This works correctly also when the next larger value is
                 # infinity.
 
                 if ($mant == $const) {
-                    $mant -> bzero();
-                    $expo -> binc();
+                    $mant = $mant -> bzero();
+                    $expo = $expo -> binc();
                 }
             }
         }
 
-        $expo -> badd($bias);                   # add bias
+        $expo = $expo -> badd($bias);           # add bias
 
         my $signbit = "$sign";
 
@@ -4719,7 +5239,9 @@ sub to_ieee754 {
 sub as_hex {
     # return number as hexadecimal string (only for integers defined)
 
-    my ($class, $x) = ref($_[0]) ? (ref($_[0]), $_[0]) : objectify(1, @_);
+    my (undef, $x, @r) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
+
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
 
     return $x->bstr() if $x->{sign} !~ /^[+-]$/; # inf, nan etc
     return '0x0' if $x->is_zero();
@@ -4737,7 +5259,9 @@ sub as_hex {
 sub as_oct {
     # return number as octal digit string (only for integers defined)
 
-    my ($class, $x) = ref($_[0]) ? (ref($_[0]), $_[0]) : objectify(1, @_);
+    my (undef, $x, @r) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
+
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
 
     return $x->bstr() if $x->{sign} !~ /^[+-]$/; # inf, nan etc
     return '00' if $x->is_zero();
@@ -4755,7 +5279,9 @@ sub as_oct {
 sub as_bin {
     # return number as binary digit string (only for integers defined)
 
-    my ($class, $x) = ref($_[0]) ? (ref($_[0]), $_[0]) : objectify(1, @_);
+    my (undef, $x, @r) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
+
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
 
     return $x->bstr() if $x->{sign} !~ /^[+-]$/; # inf, nan etc
     return '0b0' if $x->is_zero();
@@ -4772,7 +5298,10 @@ sub as_bin {
 
 sub numify {
     # Make a Perl scalar number from a Math::BigFloat object.
-    my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_);
+
+    my (undef, $x, @r) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
+
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
 
     if ($x -> is_nan()) {
         require Math::Complex;
@@ -4787,6 +5316,7 @@ sub numify {
     }
 
     # Create a string and let Perl's atoi()/atof() handle the rest.
+
     return 0 + $x -> bnstr();
 }
 
@@ -4904,17 +5434,20 @@ sub _len_to_steps {
     my $l = 40;
     my $r = $d;
 
-    # Otherwise this does not work under -Mbignum and we do not yet have "no bignum;" :(
+    # Otherwise this does not work under -Mbignum and we do not yet have "no
+    # bignum;" :(
     $l = $l->numify if ref($l);
     $r = $r->numify if ref($r);
     $lg2 = $lg2->numify if ref($lg2);
     $lg10 = $lg10->numify if ref($lg10);
 
-    # binary search for the right value (could this be written as the reverse of lg(n!)?)
+    # binary search for the right value (could this be written as the reverse of
+    # lg(n!)?)
     while ($r - $l > 1) {
         my $n = int(($r - $l) / 2) + $l;
-        my $ramanujan =
-          int(($n * log($n) - $n + log($n * (1 + 4*$n*(1+2*$n))) / 6 + $lg2) / $lg10);
+        my $ramanujan
+          = int(($n * log($n) - $n + log($n * (1 + 4*$n*(1+2*$n))) / 6 + $lg2)
+                / $lg10);
         $ramanujan > $d ? $r = $n : $l = $n;
     }
     $l;
@@ -4948,15 +5481,19 @@ sub _log {
 
     my ($limit, $v, $u, $below, $factor, $next, $over, $f);
 
-    $v = $x->copy(); $v->binc(); # v = x+1
-    $x->bdec(); $u = $x->copy(); # u = x-1; x = x-1
-    $x->bdiv($v, $scale);        # first term: u/v
+    $v = $x->copy();
+    $v = $v -> binc();                  # v = x+1
+    $x = $x->bdec();
+    $u = $x->copy();                    # u = x-1; x = x-1
+    $x = $x->bdiv($v, $scale);          # first term: u/v
     $below = $v->copy();
     $over = $u->copy();
-    $u *= $u; $v *= $v;         # u^2, v^2
-    $below->bmul($v);           # u^3, v^3
-    $over->bmul($u);
-    $factor = $class->new(3); $f = $class->new(2);
+    $u = $u -> bmul($u);                # u^2
+    $v = $v -> bmul($v);                # v^2
+    $below = $below->bmul($v);          # u^3, v^3
+    $over = $over->bmul($u);
+    $factor = $class->new(3);
+    $f = $class->new(2);
 
     $limit = $class->new("1E-". ($scale-1));
 
@@ -4972,27 +5509,24 @@ sub _log {
         # round $over and $below first, we save a lot of time for the division
         # (not with log(1.2345), but try log (123**123) to see what I mean. This
         # can introduce a rounding error if the division result would be f.i.
-        # 0.1234500000001 and we round it to 5 digits it would become 0.12346, but
-        # if we truncated $over and $below we might get 0.12345. Does this matter
-        # for the end result? So we give $over and $below 4 more digits to be
-        # on the safe side (unscientific error handling as usual... :+D
+        # 0.1234500000001 and we round it to 5 digits it would become 0.12346,
+        # but if we truncated $over and $below we might get 0.12345. Does this
+        # matter for the end result? So we give $over and $below 4 more digits
+        # to be on the safe side (unscientific error handling as usual... :+D
 
         $next = $over->copy()->bround($scale+4)
           ->bdiv($below->copy()->bmul($factor)->bround($scale+4),
                  $scale);
 
-        ## old version:
-        ##    $next = $over->copy()->bdiv($below->copy()->bmul($factor), $scale);
-
         last if $next->bacmp($limit) <= 0;
 
         delete $next->{_a};
         delete $next->{_p};
-        $x->badd($next);
+        $x = $x->badd($next);
         # calculate things for the next term
         $over *= $u;
         $below *= $v;
-        $factor->badd($f);
+        $factor = $factor->badd($f);
     }
     $x->bmul($f);               # $x *= 2
 }
@@ -5011,9 +5545,9 @@ sub _log_10 {
     # long, we make it faster by about a factor of 100 by dividing $x by 10.
 
     # The same observation is valid for numbers smaller than 0.1, e.g. computing
-    # log(1) is fastest, and the further away we get from 1, the longer it takes.
-    # So we also 'break' this down by multiplying $x with 10 and subtract the
-    # log(10) afterwards to get the correct result.
+    # log(1) is fastest, and the further away we get from 1, the longer it
+    # takes. So we also 'break' this down by multiplying $x with 10 and subtract
+    # the log(10) afterwards to get the correct result.
 
     # To get $x even closer to 1, we also divide by 2 and then use log(2) to
     # correct for this. For instance if $x is 2.4, we use the formula:
@@ -5044,8 +5578,8 @@ sub _log_10 {
         $dbd = 0;               # disable shortcut
         # we can use the cached value in these cases
         if ($scale <= $LOG_10_A) {
-            $x->bzero();
-            $x->badd($LOG_10); # modify $x in place
+            $x = $x->bzero();
+            $x = $x->badd($LOG_10); # modify $x in place
             $calc = 0;                      # no need to calc, but round
         }
         # if we can't use the shortcut, we continue normally
@@ -5057,8 +5591,8 @@ sub _log_10 {
             $dbd = 0;           # disable shortcut
             # we can use the cached value in these cases
             if ($scale <= $LOG_2_A) {
-                $x->bzero();
-                $x->badd($LOG_2); # modify $x in place
+                $x = $x->bzero();
+                $x = $x->badd($LOG_2); # modify $x in place
                 $calc = 0;                     # no need to calc, but round
             }
             # if we can't use the shortcut, we continue normally
@@ -5074,8 +5608,8 @@ sub _log_10 {
         $dbd = 0;               # disable shortcut
         # we can use the cached value in these cases
         if ($scale <= $LOG_10_A) {
-            $x->bzero();
-            $x->bsub($LOG_10);
+            $x = $x->bzero();
+            $x = $x->bsub($LOG_10);
             $calc = 0;          # no need to calc, but round
         }
     }
@@ -5096,8 +5630,8 @@ sub _log_10 {
         $LOG_10 = $class->new($LOG_10, undef, undef) unless ref $LOG_10;
 
         #print "x = $x, dbd = $dbd, calc = $calc\n";
-        # got more than one digit before the dot, or more than one zero after the
-        # dot, so do:
+        # got more than one digit before the dot, or more than one zero after
+        # the dot, so do:
         #  log(123)    == log(1.23) + log(10) * 2
         #  log(0.0123) == log(1.23) - log(10) * 2
 
@@ -5106,7 +5640,12 @@ sub _log_10 {
             $l_10 = $LOG_10->copy(); # copy for mul
         } else {
             # else: slower, compute and cache result
-            # also disable downgrade for this code path
+
+            # Disabling upgrading and downgrading is no longer necessary to
+            # avoid an infinite recursion, but it avoids unnecessary upgrading
+            # and downgrading in the intermediate computations.
+
+            local $Math::BigInt::upgrade = undef;
             local $Math::BigFloat::downgrade = undef;
 
             # shorten the time to calculate log(10) based on the following:
@@ -5121,7 +5660,7 @@ sub _log_10 {
             } else {
                 # else: slower, compute and cache result
                 $l_2 = $two->copy();
-                $l_2->_log($scale); # scale+4, actually
+                $l_2 = $l_2->_log($scale); # scale+4, actually
                 $LOG_2 = $l_2->copy(); # cache the result for later
                 # the copy() is for mul below
                 $LOG_2_A = $scale;
@@ -5129,27 +5668,25 @@ sub _log_10 {
 
             # now calculate log(1.25):
             $l_10 = $class->new('1.25');
-            $l_10->_log($scale); # scale+4, actually
+            $l_10 = $l_10->_log($scale); # scale+4, actually
 
             # log(1.25) + log(2) + log(2) + log(2):
-            $l_10->badd($l_2);
-            $l_10->badd($l_2);
-            $l_10->badd($l_2);
+            $l_10 = $l_10->badd($l_2);
+            $l_10 = $l_10->badd($l_2);
+            $l_10 = $l_10->badd($l_2);
             $LOG_10 = $l_10->copy(); # cache the result for later
             # the copy() is for mul below
             $LOG_10_A = $scale;
         }
         $dbd-- if ($dbd > 1);       # 20 => dbd=2, so make it dbd=1
-        $l_10->bmul($class->new($dbd)); # log(10) * (digits_before_dot-1)
+        $l_10 = $l_10->bmul($class->new($dbd)); # log(10) * (digits_before_dot-1)
         my $dbd_sign = '+';
         if ($dbd < 0) {
             $dbd = -$dbd;
             $dbd_sign = '-';
         }
         ($x->{_e}, $x->{_es}) =
-          _e_sub($x->{_e}, $LIB->_new($dbd), $x->{_es}, $dbd_sign); # 123 => 1.23
-        #($x->{_e}, $x->{_es}) =
-        #  $LIB -> _ssub($x->{_e}, $x->{_es}, $LIB->_new($dbd), $dbd_sign);
+          $LIB -> _ssub($x->{_e}, $x->{_es}, $LIB->_new($dbd), $dbd_sign);
     }
 
     # Now: 0.1 <= $x < 10 (and possible correction in l_10)
@@ -5162,13 +5699,13 @@ sub _log_10 {
     my $twos = 0;               # default: none (0 times)
     while ($x->bacmp($HALF) <= 0) { # X <= 0.5
         $twos--;
-        $x->bmul($two);
+        $x = $x->bmul($two);
     }
     while ($x->bacmp($two) >= 0) { # X >= 2
         $twos++;
-        $x->bdiv($two, $scale+4); # keep all digits
+        $x = $x->bdiv($two, $scale+4); # keep all digits
     }
-    $x->bround($scale+4);
+    $x = $x->bround($scale+4);
     # $twos > 0 => did mul 2, < 0 => did div 2 (but we never did both)
     # So calculate correction factor based on ln(2):
     if ($twos != 0) {
@@ -5178,70 +5715,33 @@ sub _log_10 {
             $l_2 = $LOG_2->copy(); # copy() for the mul below
         } else {
             # else: slower, compute and cache result
-            # also disable downgrade for this code path
+
+            # Disabling upgrading and downgrading is no longer necessary to
+            # avoid an infinite recursion, but it avoids unnecessary upgrading
+            # and downgrading in the intermediate computations.
+
+            local $Math::BigInt::upgrade = undef;
             local $Math::BigFloat::downgrade = undef;
+
             $l_2 = $two->copy();
-            $l_2->_log($scale); # scale+4, actually
+            $l_2 = $l_2->_log($scale); # scale+4, actually
             $LOG_2 = $l_2->copy(); # cache the result for later
             # the copy() is for mul below
             $LOG_2_A = $scale;
         }
-        $l_2->bmul($twos);      # * -2 => subtract, * 2 => add
+        $l_2 = $l_2->bmul($twos);      # * -2 => subtract, * 2 => add
     } else {
         undef $l_2;
     }
 
-    $x->_log($scale);       # need to do the "normal" way
-    $x->badd($l_10) if defined $l_10; # correct it by ln(10)
-    $x->badd($l_2) if defined $l_2;   # and maybe by ln(2)
+    $x = $x->_log($scale);       # need to do the "normal" way
+    $x = $x->badd($l_10) if defined $l_10; # correct it by ln(10)
+    $x = $x->badd($l_2) if defined $l_2;   # and maybe by ln(2)
 
     # all done, $x contains now the result
     $x;
 }
 
-sub _e_add {
-    # Internal helper sub to take two positive integers and their signs and
-    # then add them. Input ($LIB, $LIB, ('+'|'-'), ('+'|'-')), output
-    # ($LIB, ('+'|'-')).
-
-    my ($x, $y, $xs, $ys) = @_;
-
-    # if the signs are equal we can add them (-5 + -3 => -(5 + 3) => -8)
-    if ($xs eq $ys) {
-        $x = $LIB->_add($x, $y); # +a + +b or -a + -b
-    } else {
-        my $a = $LIB->_acmp($x, $y);
-        if ($a == 0) {
-            # This does NOT modify $x in-place. TODO: Fix this?
-            $x = $LIB->_zero(); # result is 0
-            $xs = '+';
-            return ($x, $xs);
-        }
-        if ($a > 0) {
-            $x = $LIB->_sub($x, $y);     # abs sub
-        } else {                         # a < 0
-            $x = $LIB->_sub ($y, $x, 1); # abs sub
-            $xs = $ys;
-        }
-    }
-
-    $xs = '+' if $xs eq '-' && $LIB->_is_zero($x); # no "-0"
-
-    return ($x, $xs);
-}
-
-sub _e_sub {
-    # Internal helper sub to take two positive integers and their signs and
-    # then subtract them. Input ($LIB, $LIB, ('+'|'-'), ('+'|'-')),
-    # output ($LIB, ('+'|'-'))
-    my ($x, $y, $xs, $ys) = @_;
-
-    # flip sign
-    $ys = $ys eq '+' ? '-' : '+'; # swap sign of second operand ...
-    _e_add($x, $y, $xs, $ys);     # ... and let _e_add() do the job
-    #$LIB -> _sadd($x, $xs, $y, $ys);     # ... and let $LIB -> _sadd() do the job
-}
-
 sub _pow {
     # Calculate a power where $y is a non-integer, like 2 ** 0.3
     my ($x, $y, @r) = @_;
@@ -5284,23 +5784,32 @@ sub _pow {
     # when user set globals, they would interfere with our calculation, so
     # disable them and later re-enable them
     no strict 'refs';
-    my $abr = "$class\::accuracy"; my $ab = $$abr; $$abr = undef;
-    my $pbr = "$class\::precision"; my $pb = $$pbr; $$pbr = undef;
+    my $abr = "$class\::accuracy";
+    my $ab = $$abr;
+    $$abr = undef;
+    my $pbr = "$class\::precision";
+    my $pb = $$pbr;
+    $$pbr = undef;
     # we also need to disable any set A or P on $x (_find_round_parameters took
     # them already into account), since these would interfere, too
     delete $x->{_a};
     delete $x->{_p};
-    # need to disable $upgrade in BigInt, to avoid deep recursion
+
+    # Disabling upgrading and downgrading is no longer necessary to avoid an
+    # infinite recursion, but it avoids unnecessary upgrading and downgrading in
+    # the intermediate computations.
+
     local $Math::BigInt::upgrade = undef;
+    local $Math::BigFloat::downgrade = undef;
 
     my ($limit, $v, $u, $below, $factor, $next, $over);
 
     $u = $x->copy()->blog(undef, $scale)->bmul($y);
     my $do_invert = ($u->{sign} eq '-');
-    $u->bneg()  if $do_invert;
+    $u = $u->bneg()  if $do_invert;
     $v = $class->bone();        # 1
     $factor = $class->new(2);   # 2
-    $x->bone();                 # first term: 1
+    $x = $x->bone();                 # first term: 1
 
     $below = $v->copy();
     $over = $u->copy();
@@ -5312,25 +5821,25 @@ sub _pow {
         # anymore, so we stop:
         $next = $over->copy()->bdiv($below, $scale);
         last if $next->bacmp($limit) <= 0;
-        $x->badd($next);
+        $x = $x->badd($next);
         # calculate things for the next term
         $over *= $u;
         $below *= $factor;
-        $factor->binc();
+        $factor = $factor->binc();
 
         last if $x->{sign} !~ /^[-+]$/;
     }
 
     if ($do_invert) {
         my $x_copy = $x->copy();
-        $x->bone->bdiv($x_copy, $scale);
+        $x = $x->bone->bdiv($x_copy, $scale);
     }
 
     # shortcut to not run through _find_round_parameters again
     if (defined $params[0]) {
-        $x->bround($params[0], $params[2]); # then round accordingly
+        $x = $x->bround($params[0], $params[2]); # then round accordingly
     } else {
-        $x->bfround($params[1], $params[2]); # then round accordingly
+        $x = $x->bfround($params[1], $params[2]); # then round accordingly
     }
     if ($fallback) {
         # clear a/p after round, since user did not request it
@@ -5343,6 +5852,19 @@ sub _pow {
     $x;
 }
 
+# These functions are only provided for backwards compabibility so that old
+# version of Math::BigRat etc. don't complain about missing them.
+
+sub _e_add {
+    my ($x, $y, $xs, $ys) = @_;
+    return $LIB -> _sadd($x, $xs, $y, $ys);
+}
+
+sub _e_sub {
+    my ($x, $y, $xs, $ys) = @_;
+    return $LIB -> _ssub($x, $xs, $y, $ys);
+}
+
 1;
 
 __END__
@@ -5395,6 +5917,8 @@ Math::BigFloat - arbitrary size floating point math package
 
   $y = $x->copy();        # make a copy (unlike $y = $x)
   $y = $x->as_int();      # return as BigInt
+  $y = $x->as_float();    # return as a Math::BigFloat
+  $y = $x->as_rat();      # return as a Math::BigRat
 
   # Boolean methods (these don't modify the invocand)
 
@@ -5516,6 +6040,8 @@ Math::BigFloat - arbitrary size floating point math package
   $x->bnstr();        # string in normalized notation
   $x->bestr();        # string in engineering notation
   $x->bdstr();        # string in decimal notation
+  $x->bfstr();        # string in fractional notation
+
   $x->as_hex();       # as signed hexadecimal string with prefixed 0x
   $x->as_bin();       # as signed binary string with prefixed 0b
   $x->as_oct();       # as signed octal string with prefixed 0
@@ -5921,10 +6447,11 @@ supplied to the operation after the I<scale>:
     Math::BigFloat->round_mode('zero');
     $y = $x->copy()->bdiv(3,6);               # will also give 0.666667
 
-Note that C<< Math::BigFloat->accuracy() >> and C<< Math::BigFloat->precision() >>
-set the global variables, and thus B<any> newly created number will be subject
-to the global rounding B<immediately>. This means that in the examples above, the
-C<3> as argument to C<bdiv()> will also get an accuracy of B<5>.
+Note that C<< Math::BigFloat->accuracy() >> and
+C<< Math::BigFloat->precision() >> set the global variables, and thus B<any>
+newly created number will be subject to the global rounding B<immediately>. This
+means that in the examples above, the C<3> as argument to C<bdiv()> will also
+get an accuracy of B<5>.
 
 It is less confusing to either calculate the result fully, and afterwards
 round it explicitly, or use the additional parameters to the math
@@ -6103,7 +6630,8 @@ math library for directly storing the number parts.
 
 =head1 EXPORTS
 
-C<Math::BigFloat> exports nothing by default, but can export the C<bpi()> method:
+C<Math::BigFloat> exports nothing by default, but can export the C<bpi()>
+method:
 
     use Math::BigFloat qw/bpi/;
 
@@ -6178,7 +6706,8 @@ a certain number of digits:
     print "$z\n";
     print $z->precision(),"\n";             # 4
 
-Replacing L</precision()> with L</accuracy()> is probably not what you want, either:
+Replacing L</precision()> with L</accuracy()> is probably not what you want,
+either:
 
     use Math::BigFloat;
 
index 489dbb6..65e1446 100644 (file)
@@ -21,9 +21,9 @@ use strict;
 use warnings;
 
 use Carp          qw< carp croak >;
-use Scalar::Util  qw< blessed >;
+use Scalar::Util  qw< blessed refaddr >;
 
-our $VERSION = '1.999830';
+our $VERSION = '1.999837';
 $VERSION =~ tr/_//d;
 
 require Exporter;
@@ -58,7 +58,6 @@ use overload
 
   '%'     =>      sub { $_[2] ? ref($_[0]) -> new($_[1]) -> bmod($_[0])
                               : $_[0] -> copy() -> bmod($_[1]); },
-
   '**'    =>      sub { $_[2] ? ref($_[0]) -> new($_[1]) -> bpow($_[0])
                               : $_[0] -> copy() -> bpow($_[1]); },
 
@@ -216,7 +215,8 @@ use overload
 # These vars are public, but their direct usage is not recommended, use the
 # accessor methods instead
 
-our $round_mode = 'even'; # one of 'even', 'odd', '+inf', '-inf', 'zero', 'trunc' or 'common'
+# $round_mode is 'even', 'odd', '+inf', '-inf', 'zero', 'trunc', or 'common'.
+our $round_mode = 'even';
 our $accuracy   = undef;
 our $precision  = undef;
 our $div_scale  = 40;
@@ -262,9 +262,9 @@ BEGIN {
     tie $rnd_mode, 'Math::BigInt';
 
     # set up some handy alias names
-    *as_int = \&as_number;
     *is_pos = \&is_positive;
     *is_neg = \&is_negative;
+    *as_number = \&as_int;
 }
 
 ###############################################################################
@@ -297,6 +297,7 @@ sub upgrade {
     # make Class->upgrade() work
     my $self = shift;
     my $class = ref($self) || $self || __PACKAGE__;
+
     # need to set new value?
     if (@_ > 0) {
         return ${"${class}::upgrade"} = $_[0];
@@ -361,11 +362,11 @@ sub accuracy {
 
         if (ref($x)) {
             # Set instance variable.
-            $x->bround($a) if $a; # not for undef, 0
+            $x = $x->bround($a) if $a; # not for undef, 0
             $x->{_a} = $a;        # set/overwrite, even if not rounded
             delete $x->{_p};      # clear P
             # Why return class variable here? Fixme!
-            $a = ${"${class}::accuracy"} unless defined $a; # proper return value
+            $a = ${"${class}::accuracy"} unless defined $a;
         } else {
             # Set class variable.
             ${"${class}::accuracy"} = $a; # set global A
@@ -376,7 +377,7 @@ sub accuracy {
     }
 
     # Return instance variable.
-    return $x->{_a} if ref($x) && (defined $x->{_a} || defined $x->{_p});
+    return $x->{_a} if ref($x) && (defined($x->{_a}) || defined($x->{_p}));
 
     # Return class variable.
     return ${"${class}::accuracy"};
@@ -403,11 +404,11 @@ sub precision {
 
         if (ref($x)) {
             # Set instance variable.
-            $x->bfround($p) if $p; # not for undef, 0
+            $x = $x->bfround($p) if $p; # not for undef, 0
             $x->{_p} = $p;         # set/overwrite, even if not rounded
             delete $x->{_a};       # clear A
             # Why return class variable here? Fixme!
-            $p = ${"${class}::precision"} unless defined $p; # proper return value
+            $p = ${"${class}::precision"} unless defined $p;
         } else {
             # Set class variable.
             ${"${class}::precision"} = $p; # set global P
@@ -418,7 +419,7 @@ sub precision {
     }
 
     # Return instance variable.
-    return $x->{_p} if ref($x) && (defined $x->{_a} || defined $x->{_p});
+    return $x->{_p} if ref($x) && (defined($x->{_a}) || defined($x->{_p}));
 
     # Return class variable.
     return ${"${class}::precision"};
@@ -551,26 +552,22 @@ sub new {
 
     $class -> import() if $IMPORT == 0;
 
-    # Although this use has been discouraged for more than 10 years, people
-    # apparently still use it, so we still support it.
+    # Calling new() with no input arguments has been discouraged for more than
+    # 10 years, but people apparently still use it, so we still support it.
 
     return $class -> bzero() unless @_;
 
     my ($wanted, @r) = @_;
 
     if (!defined($wanted)) {
-        #if (warnings::enabled("uninitialized")) {
-        #    warnings::warn("uninitialized",
-        #                   "Use of uninitialized value in new()");
-        #}
+        #carp("Use of uninitialized value in new()")
+        #  if warnings::enabled("uninitialized");
         return $class -> bzero(@r);
     }
 
     if (!ref($wanted) && $wanted eq "") {
-        #if (warnings::enabled("numeric")) {
-        #    warnings::warn("numeric",
-        #                   q|Argument "" isn't numeric in new()|);
-        #}
+        #carp(q|Argument "" isn't numeric in new()|)
+        #  if warnings::enabled("numeric");
         #return $class -> bzero(@r);
         return $class -> bnan(@r);
     }
@@ -583,48 +580,60 @@ sub new {
 
     if (defined(blessed($wanted)) && $wanted -> isa($class)) {
 
-        # We don't copy the accuracy and precision, because a new object should
-        # get them from the global configuration.
+        # Don't copy the accuracy and precision, because a new object should get
+        # them from the global configuration.
 
         $self -> {sign}  = $wanted -> {sign};
         $self -> {value} = $LIB -> _copy($wanted -> {value});
-        $self->round(@r) unless @r >= 2 && !defined($r[0]) && !defined($r[1]);
+        $self = $self->round(@r)
+          unless @r >= 2 && !defined($r[0]) && !defined($r[1]);
         return $self;
     }
 
     # Shortcut for non-zero scalar integers with no non-zero exponent.
 
-    if ($wanted =~ / ^
-                     ([+-]?)            # optional sign
-                     ([1-9][0-9]*)      # non-zero significand
-                     (\.0*)?            # ... with optional zero fraction
-                     ([Ee][+-]?0+)?     # optional zero exponent
-                     \z
-                   /x)
+    if ($wanted =~
+        / ^
+          ( [+-]? )             # optional sign
+          ( [1-9] [0-9]* )      # non-zero significand
+          ( \.0* )?             # ... with optional zero fraction
+          ( [Ee] [+-]? 0+ )?    # optional zero exponent
+          \z
+        /x)
     {
         my $sgn = $1;
         my $abs = $2;
         $self->{sign} = $sgn || '+';
         $self->{value} = $LIB->_new($abs);
-        $self->round(@r) unless @r >= 2 && !defined($r[0]) && !defined($r[1]);
+        $self = $self->round(@r);
         return $self;
     }
 
     # Handle Infs.
 
-    if ($wanted =~ /^\s*([+-]?)inf(inity)?\s*\z/i) {
+    if ($wanted =~ / ^
+                     \s*
+                     ( [+-]? )
+                     inf (?: inity )?
+                     \s*
+                     \z
+                   /ix)
+    {
         my $sgn = $1 || '+';
-        $self = $class -> binf($sgn);
-        $self->round(@r) unless @r >= 2 && !defined($r[0]) && !defined($r[1]);
-        return $self;
+        return $class -> binf($sgn, @r);
     }
 
     # Handle explicit NaNs (not the ones returned due to invalid input).
 
-    if ($wanted =~ /^\s*([+-]?)nan\s*\z/i) {
-        $self = $class -> bnan();
-        $self->round(@r) unless @r >= 2 && !defined($r[0]) && !defined($r[1]);
-        return $self;
+    if ($wanted =~ / ^
+                     \s*
+                     ( [+-]? )
+                     nan
+                     \s*
+                     \z
+                   /ix)
+    {
+        return $class -> bnan(@r);
     }
 
     my @parts;
@@ -634,7 +643,7 @@ sub new {
         # have a "0x", "0X", "x", or "X" prefix, cf. CORE::oct().
 
         $wanted =~ /^\s*[+-]?0?[Xx]/ and
-        @parts = $class -> _hex_str_to_lib_parts($wanted)
+        @parts = $class -> _hex_str_to_flt_lib_parts($wanted)
 
           or
 
@@ -642,7 +651,7 @@ sub new {
         # "0o", "0O", "o", "O" prefix, cf. CORE::oct().
 
         $wanted =~ /^\s*[+-]?0?[Oo]/ and
-        @parts = $class -> _oct_str_to_lib_parts($wanted)
+        @parts = $class -> _oct_str_to_flt_lib_parts($wanted)
 
           or
 
@@ -650,7 +659,7 @@ sub new {
         # "0b", "0B", "b", or "B" prefix, cf. CORE::oct().
 
         $wanted =~ /^\s*[+-]?0?[Bb]/ and
-        @parts = $class -> _bin_str_to_lib_parts($wanted)
+        @parts = $class -> _bin_str_to_flt_lib_parts($wanted)
 
           or
 
@@ -658,38 +667,38 @@ sub new {
         # above and octal floating point numbers that don't have any of the
         # "0o", "0O", "o", or "O" prefixes. First see if it is a decimal number.
 
-        @parts = $class -> _dec_str_to_lib_parts($wanted)
+        @parts = $class -> _dec_str_to_flt_lib_parts($wanted)
           or
 
         # See if it is an octal floating point number. The extra check is
-        # included because _oct_str_to_lib_parts() accepts octal numbers that
-        # don't have a prefix (this is needed to make it work with, e.g.,
+        # included because _oct_str_to_flt_lib_parts() accepts octal numbers
+        # that don't have a prefix (this is needed to make it work with, e.g.,
         # from_oct() that don't require a prefix). However, Perl requires a
         # prefix for octal floating point literals. For example, "1p+0" is not
         # valid, but "01p+0" and "0__1p+0" are.
 
         $wanted =~ /^\s*[+-]?0_*\d/ and
-        @parts = $class -> _oct_str_to_lib_parts($wanted))
+        @parts = $class -> _oct_str_to_flt_lib_parts($wanted))
     {
         # The value is an integer iff the exponent is non-negative.
 
         if ($parts[2] eq '+') {
             $self -> {sign}  = $parts[0];
             $self -> {value} = $LIB -> _lsft($parts[1], $parts[3], 10);
-            $self->round(@r) unless @r >= 2 && !defined($r[0]) && !defined($r[1]);
+            $self = $self->round(@r)
+              unless @r >= 2 && !defined($r[0]) && !defined($r[1]);
             return $self;
         }
 
-        # If we get here, the value is a valid number, but it is not an integer.
+        # The value is not an integer, so upgrade if upgrading is enabled.
 
         return $upgrade -> new($wanted, @r) if defined $upgrade;
-        return $class -> bnan();
     }
 
     # If we get here, the value is neither a valid decimal, binary, octal, or
     # hexadecimal number. It is not explicit an Inf or a NaN either.
 
-    return $class -> bnan();
+    return $class -> bnan(@r);
 }
 
 # Create a Math::BigInt from a decimal string. This is an equivalent to
@@ -703,16 +712,16 @@ sub from_dec {
 
     # Don't modify constant (read-only) objects.
 
-    return if $selfref && $self->modify('from_dec');
+    return $self if $selfref && $self->modify('from_dec');
 
     my $str = shift;
     my @r   = @_;
 
     # If called as a class method, initialize a new object.
 
-    $self = $class -> bzero() unless $selfref;
+    $self = $class -> bzero(@r) unless $selfref;
 
-    if (my @parts = $class -> _dec_str_to_lib_parts($str)) {
+    if (my @parts = $class -> _dec_str_to_flt_lib_parts($str)) {
 
         # The value is an integer iff the exponent is non-negative.
 
@@ -722,6 +731,8 @@ sub from_dec {
             return $self -> round(@r);
         }
 
+        # The value is not an integer, so upgrade if upgrading is enabled.
+
         return $upgrade -> new($str, @r) if defined $upgrade;
     }
 
@@ -737,16 +748,16 @@ sub from_hex {
 
     # Don't modify constant (read-only) objects.
 
-    return if $selfref && $self->modify('from_hex');
+    return $self if $selfref && $self->modify('from_hex');
 
     my $str = shift;
     my @r   = @_;
 
     # If called as a class method, initialize a new object.
 
-    $self = $class -> bzero() unless $selfref;
+    $self = $class -> bzero(@r) unless $selfref;
 
-    if (my @parts = $class -> _hex_str_to_lib_parts($str)) {
+    if (my @parts = $class -> _hex_str_to_flt_lib_parts($str)) {
 
         # The value is an integer iff the exponent is non-negative.
 
@@ -756,6 +767,8 @@ sub from_hex {
             return $self -> round(@r);
         }
 
+        # The value is not an integer, so upgrade if upgrading is enabled.
+
         return $upgrade -> new($str, @r) if defined $upgrade;
     }
 
@@ -771,16 +784,16 @@ sub from_oct {
 
     # Don't modify constant (read-only) objects.
 
-    return if $selfref && $self->modify('from_oct');
+    return $self if $selfref && $self->modify('from_oct');
 
     my $str = shift;
     my @r   = @_;
 
     # If called as a class method, initialize a new object.
 
-    $self = $class -> bzero() unless $selfref;
+    $self = $class -> bzero(@r) unless $selfref;
 
-    if (my @parts = $class -> _oct_str_to_lib_parts($str)) {
+    if (my @parts = $class -> _oct_str_to_flt_lib_parts($str)) {
 
         # The value is an integer iff the exponent is non-negative.
 
@@ -790,6 +803,8 @@ sub from_oct {
             return $self -> round(@r);
         }
 
+        # The value is not an integer, so upgrade if upgrading is enabled.
+
         return $upgrade -> new($str, @r) if defined $upgrade;
     }
 
@@ -805,16 +820,16 @@ sub from_bin {
 
     # Don't modify constant (read-only) objects.
 
-    return if $selfref && $self->modify('from_bin');
+    return $self if $selfref && $self->modify('from_bin');
 
     my $str = shift;
     my @r   = @_;
 
     # If called as a class method, initialize a new object.
 
-    $self = $class -> bzero() unless $selfref;
+    $self = $class -> bzero(@r) unless $selfref;
 
-    if (my @parts = $class -> _bin_str_to_lib_parts($str)) {
+    if (my @parts = $class -> _bin_str_to_flt_lib_parts($str)) {
 
         # The value is an integer iff the exponent is non-negative.
 
@@ -824,6 +839,8 @@ sub from_bin {
             return $self -> round(@r);
         }
 
+        # The value is not an integer, so upgrade if upgrading is enabled.
+
         return $upgrade -> new($str, @r) if defined $upgrade;
     }
 
@@ -839,7 +856,7 @@ sub from_bytes {
 
     # Don't modify constant (read-only) objects.
 
-    return if $selfref && $self->modify('from_bytes');
+    return $self if $selfref && $self->modify('from_bytes');
 
     croak("from_bytes() requires a newer version of the $LIB library.")
         unless $LIB->can('_from_bytes');
@@ -849,7 +866,7 @@ sub from_bytes {
 
     # If called as a class method, initialize a new object.
 
-    $self = $class -> bzero() unless $selfref;
+    $self = $class -> bzero(@r) unless $selfref;
     $self -> {sign}  = '+';
     $self -> {value} = $LIB -> _from_bytes($str);
     return $self -> round(@r);
@@ -862,11 +879,10 @@ sub from_base {
 
     # Don't modify constant (read-only) objects.
 
-    return if $selfref && $self->modify('from_base');
+    return $self if $selfref && $self->modify('from_base');
 
-    my $str = shift;
+    my ($str, $base, $cs, @r) = @_;     # $cs is the collation sequence
 
-    my $base = shift;
     $base = $class->new($base) unless ref($base);
 
     croak("the base must be a finite integer >= 2")
@@ -879,14 +895,15 @@ sub from_base {
     # If no collating sequence is given, pass some of the conversions to
     # methods optimized for those cases.
 
-    if (! @_) {
-        return $self -> from_bin($str) if $base == 2;
-        return $self -> from_oct($str) if $base == 8;
-        return $self -> from_hex($str) if $base == 16;
+    unless (defined $cs) {
+        return $self -> from_bin($str, @r) if $base == 2;
+        return $self -> from_oct($str, @r) if $base == 8;
+        return $self -> from_hex($str, @r) if $base == 16;
         if ($base == 10) {
-            my $tmp = $class -> new($str);
+            my $tmp = $class -> from_dec($str, @r);
             $self -> {value} = $tmp -> {value};
             $self -> {sign}  = '+';
+            return $self -> bround(@r);
         }
     }
 
@@ -895,8 +912,8 @@ sub from_base {
 
     $self -> {sign}  = '+';
     $self -> {value}
-      = $LIB->_from_base($str, $base -> {value}, @_ ? shift() : ());
-    return $self;
+      = $LIB->_from_base($str, $base -> {value}, defined($cs) ? $cs : ());
+    return $self -> bround(@r);
 }
 
 sub from_base_num {
@@ -906,7 +923,7 @@ sub from_base_num {
 
     # Don't modify constant (read-only) objects.
 
-    return if $selfref && $self->modify('from_base_num');
+    return $self if $selfref && $self->modify('from_base_num');
 
     # Make sure we have an array of non-negative, finite, numerical objects.
 
@@ -929,7 +946,7 @@ sub from_base_num {
 
     # If called as a class method, initialize a new object.
 
-    $self = $class -> bzero() unless $selfref;
+    $self = $class -> bzero(@r) unless $selfref;
 
     croak("from_base_num() requires a newer version of the $LIB library.")
       unless $LIB->can('_from_base_num');
@@ -944,9 +961,12 @@ sub from_base_num {
 sub bzero {
     # create/assign '+0'
 
-    if (@_ == 0) {
-        #carp("Using bzero() as a function is deprecated;",
-        #           " use bzero() as a method instead");
+    # Class::method(...) -> Class->method(...)
+    unless (@_ && (defined(blessed($_[0])) && $_[0] -> isa(__PACKAGE__) ||
+                   $_[0] =~ /^[a-z]\w*(?:::[a-z]\w*)*$/i))
+    {
+        #carp "Using ", (caller(0))[3], "() as a function is deprecated;",
+        #  " use is as a method instead";
         unshift @_, __PACKAGE__;
     }
 
@@ -958,7 +978,13 @@ sub bzero {
 
     # Don't modify constant (read-only) objects.
 
-    return if $selfref && $self->modify('bzero');
+    return $self if $selfref && $self->modify('bzero');
+
+    # Get the rounding parameters, if any.
+
+    my @r = @_;
+
+    # If called as a class method, initialize a new object.
 
     $self = bless {}, $class unless $selfref;
 
@@ -966,19 +992,17 @@ sub bzero {
     $self->{value} = $LIB->_zero();
 
     # If rounding parameters are given as arguments, use them. If no rounding
-    # parameters are given, and if called as a class method initialize the new
+    # parameters are given, and if called as a class method, initialize the new
     # instance with the class variables.
 
-    if (@_) {
+    if (@r) {
         croak "can't specify both accuracy and precision"
-          if @_ >= 2 && defined $_[0] && defined $_[1];
+          if @r >= 2 && defined($r[0]) && defined($r[1]);
         $self->{_a} = $_[0];
         $self->{_p} = $_[1];
-    } else {
-        unless($selfref) {
-            $self->{_a} = $class -> accuracy();
-            $self->{_p} = $class -> precision();
-        }
+    } elsif (!$selfref) {
+        $self->{_a} = $class -> accuracy();
+        $self->{_p} = $class -> precision();
     }
 
     return $self;
@@ -987,9 +1011,12 @@ sub bzero {
 sub bone {
     # Create or assign '+1' (or -1 if given sign '-').
 
-    if (@_ == 0 || (defined($_[0]) && ($_[0] eq '+' || $_[0] eq '-'))) {
-        #carp("Using bone() as a function is deprecated;",
-        #           " use bone() as a method instead");
+    # Class::method(...) -> Class->method(...)
+    unless (@_ && (defined(blessed($_[0])) && $_[0] -> isa(__PACKAGE__) ||
+                   $_[0] =~ /^[a-z]\w*(?:::[a-z]\w*)*$/i))
+    {
+        #carp "Using ", (caller(0))[3], "() as a function is deprecated;",
+        #  " use is as a method instead";
         unshift @_, __PACKAGE__;
     }
 
@@ -1001,33 +1028,38 @@ sub bone {
 
     # Don't modify constant (read-only) objects.
 
-    return if $selfref && $self->modify('bone');
+    return $self if $selfref && $self->modify('bone');
 
-    my $sign = '+';             # default
-    if (@_) {
-        $sign = shift;
-        $sign = $sign =~ /^\s*-/ ? "-" : "+";
+    my ($sign, @r) = @_;
+
+    # Get the sign.
+
+    if (defined($_[0]) && $_[0] =~ /^\s*([+-])\s*$/) {
+        $sign = $1;
+        shift;
+    } else {
+        $sign = '+';
     }
 
+    # If called as a class method, initialize a new object.
+
     $self = bless {}, $class unless $selfref;
 
     $self->{sign}  = $sign;
     $self->{value} = $LIB->_one();
 
     # If rounding parameters are given as arguments, use them. If no rounding
-    # parameters are given, and if called as a class method initialize the new
+    # parameters are given, and if called as a class method, initialize the new
     # instance with the class variables.
 
-    if (@_) {
+    if (@r) {
         croak "can't specify both accuracy and precision"
-          if @_ >= 2 && defined $_[0] && defined $_[1];
+          if @r >= 2 && defined($r[0]) && defined($r[1]);
         $self->{_a} = $_[0];
         $self->{_p} = $_[1];
-    } else {
-        unless($selfref) {
-            $self->{_a} = $class -> accuracy();
-            $self->{_p} = $class -> precision();
-        }
+    } elsif (!$selfref) {
+        $self->{_a} = $class -> accuracy();
+        $self->{_p} = $class -> precision();
     }
 
     return $self;
@@ -1036,11 +1068,12 @@ sub bone {
 sub binf {
     # create/assign a '+inf' or '-inf'
 
-    if (@_ == 0 || (defined($_[0]) && !ref($_[0]) &&
-                    $_[0] =~ /^\s*[+-](inf(inity)?)?\s*$/))
+    # Class::method(...) -> Class->method(...)
+    unless (@_ && (defined(blessed($_[0])) && $_[0] -> isa(__PACKAGE__) ||
+                   $_[0] =~ /^[a-z]\w*(?:::[a-z]\w*)*$/i))
     {
-        #carp("Using binf() as a function is deprecated;",
-        #           " use binf() as a method instead");
+        #carp "Using ", (caller(0))[3], "() as a function is deprecated;",
+        #  " use is as a method instead";
         unshift @_, __PACKAGE__;
     }
 
@@ -1059,10 +1092,21 @@ sub binf {
 
     # Don't modify constant (read-only) objects.
 
-    return if $selfref && $self->modify('binf');
+    return $self if $selfref && $self->modify('binf');
+
+    # Get the sign.
+
+    my $sign = '+';     # default is to return positive infinity
+    if (defined($_[0]) && $_[0] =~ /^\s*([+-])(inf|$)/i) {
+        $sign = $1;
+        shift;
+    }
+
+    # Get the rounding parameters, if any.
+
+    my @r = @_;
 
-    my $sign = shift;
-    $sign = defined $sign && $sign =~ /^\s*-/ ? "-" : "+";
+    # If called as a class method, initialize a new object.
 
     $self = bless {}, $class unless $selfref;
 
@@ -1070,19 +1114,17 @@ sub binf {
     $self -> {value} = $LIB -> _zero();
 
     # If rounding parameters are given as arguments, use them. If no rounding
-    # parameters are given, and if called as a class method initialize the new
+    # parameters are given, and if called as a class method, initialize the new
     # instance with the class variables.
 
-    if (@_) {
+    if (@r) {
         croak "can't specify both accuracy and precision"
-          if @_ >= 2 && defined $_[0] && defined $_[1];
+          if @r >= 2 && defined($r[0]) && defined($r[1]);
         $self->{_a} = $_[0];
         $self->{_p} = $_[1];
-    } else {
-        unless($selfref) {
-            $self->{_a} = $class -> accuracy();
-            $self->{_p} = $class -> precision();
-        }
+    } elsif (!$selfref) {
+        $self->{_a} = $class -> accuracy();
+        $self->{_p} = $class -> precision();
     }
 
     return $self;
@@ -1091,9 +1133,12 @@ sub binf {
 sub bnan {
     # create/assign a 'NaN'
 
-    if (@_ == 0) {
-        #carp("Using bnan() as a function is deprecated;",
-        #           " use bnan() as a method instead");
+    # Class::method(...) -> Class->method(...)
+    unless (@_ && (defined(blessed($_[0])) && $_[0] -> isa(__PACKAGE__) ||
+                   $_[0] =~ /^[a-z]\w*(?:::[a-z]\w*)*$/i))
+    {
+        #carp "Using ", (caller(0))[3], "() as a function is deprecated;",
+        #  " use is as a method instead";
         unshift @_, __PACKAGE__;
     }
 
@@ -1112,7 +1157,11 @@ sub bnan {
 
     # Don't modify constant (read-only) objects.
 
-    return if $selfref && $self->modify('bnan');
+    return $self if $selfref && $self->modify('bnan');
+
+    # Get the rounding parameters, if any.
+
+    my @r = @_;
 
     $self = bless {}, $class unless $selfref;
 
@@ -1120,19 +1169,17 @@ sub bnan {
     $self -> {value} = $LIB -> _zero();
 
     # If rounding parameters are given as arguments, use them. If no rounding
-    # parameters are given, and if called as a class method initialize the new
+    # parameters are given, and if called as a class method, initialize the new
     # instance with the class variables.
 
-    if (@_) {
+    if (@r) {
         croak "can't specify both accuracy and precision"
-          if @_ >= 2 && defined $_[0] && defined $_[1];
+          if @r >= 2 && defined($r[0]) && defined($r[1]);
         $self->{_a} = $_[0];
         $self->{_p} = $_[1];
-    } else {
-        unless($selfref) {
-            $self->{_a} = $class -> accuracy();
-            $self->{_p} = $class -> precision();
-        }
+    } elsif (!$selfref) {
+        $self->{_a} = $class -> accuracy();
+        $self->{_p} = $class -> precision();
     }
 
     return $self;
@@ -1140,19 +1187,28 @@ sub bnan {
 
 sub bpi {
 
-    # Called as               Argument list
-    # ---------               -------------
-    # Math::BigInt->bpi()     ("Math::BigInt")
-    # Math::BigInt->bpi(10)   ("Math::BigInt", 10)
-    # $x->bpi()               ($x)
-    # $x->bpi(10)             ($x, 10)
-    # Math::BigInt::bpi()     ()
-    # Math::BigInt::bpi(10)   (10)
+    # Class::method(...) -> Class->method(...)
+    unless (@_ && (defined(blessed($_[0])) && $_[0] -> isa(__PACKAGE__) ||
+                   $_[0] =~ /^[a-z]\w*(?:::[a-z]\w*)*$/i))
+    {
+        #carp "Using ", (caller(0))[3], "() as a function is deprecated;",
+        #  " use is as a method instead";
+        unshift @_, __PACKAGE__;
+    }
+
+    # Called as                 Argument list
+    # ---------                 -------------
+    # Math::BigFloat->bpi()     ("Math::BigFloat")
+    # Math::BigFloat->bpi(10)   ("Math::BigFloat", 10)
+    # $x->bpi()                 ($x)
+    # $x->bpi(10)               ($x, 10)
+    # Math::BigFloat::bpi()     ()
+    # Math::BigFloat::bpi(10)   (10)
     #
     # In ambiguous cases, we favour the OO-style, so the following case
     #
-    #   $n = Math::BigInt->new("10");
-    #   $x = Math::BigInt->bpi($n);
+    #   $n = Math::BigFloat->new("10");
+    #   $x = Math::BigFloat->bpi($n);
     #
     # which gives an argument list with the single element $n, is resolved as
     #
@@ -1161,35 +1217,12 @@ sub bpi {
     my $self    = shift;
     my $selfref = ref $self;
     my $class   = $selfref || $self;
+    my @r       = @_;                   # rounding paramters
 
-    my @r;                      # rounding paramters
-
-    # If bpi() is called as a function ...
-    #
-    # This cludge is necessary because we still support bpi() as a function. If
-    # bpi() is called with either no argument or one argument, and that one
-    # argument is either undefined or a scalar that looks like a number, then
-    # we assume bpi() is called as a function.
-
-    if (@_ == 0 &&
-        (defined($self) && !ref($self) && $self =~ /^\s*[+-]?\d/)
-          ||
-        !defined($self))
-    {
-        $r[0]  = $self;
-        $class = __PACKAGE__;
-        $self  = bless {}, $class;
-    }
-
-    # ... or if bpi() is called as a method ...
-
-    else {
-        @r = @_;
-        if ($selfref) {                     # bpi() called as instance method
-            return $self if $self -> modify('bpi');
-        } else {                            # bpi() called as class method
-            $self  = bless {}, $class;
-        }
+    if ($selfref) {                     # bpi() called as an instance method
+        return $self if $self -> modify('bpi');
+    } else {                            # bpi() called as a class method
+        $self = bless {}, $class;       # initialize new instance
     }
 
     return $upgrade -> bpi(@r) if defined $upgrade;
@@ -1197,34 +1230,100 @@ sub bpi {
     # hard-wired to "3"
     $self -> {sign}  = '+';
     $self -> {value} = $LIB -> _new("3");
-    $self -> round(@r) unless @r >= 2 && !defined($r[0]) && !defined($r[1]);
+    $self = $self -> round(@r);
     return $self;
 }
 
 sub copy {
-    my $self    = shift;
-    my $selfref = ref $self;
-    my $class   = $selfref || $self;
-
-    # If called as a class method, the object to copy is the next argument.
+    my ($x, $class);
+    if (ref($_[0])) {           # $y = $x -> copy()
+        $x = shift;
+        $class = ref($x);
+    } else {                    # $y = Math::BigInt -> copy($y)
+        $class = shift;
+        $x = shift;
+    }
 
-    $self = shift() unless $selfref;
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @_;
 
     my $copy = bless {}, $class;
 
-    $copy->{sign}  = $self->{sign};
-    $copy->{value} = $LIB->_copy($self->{value});
-    $copy->{_a}    = $self->{_a} if exists $self->{_a};
-    $copy->{_p}    = $self->{_p} if exists $self->{_p};
+    $copy->{sign}  = $x->{sign};
+    $copy->{value} = $LIB->_copy($x->{value});
+    $copy->{_a}    = $x->{_a} if exists $x->{_a};
+    $copy->{_p}    = $x->{_p} if exists $x->{_p};
 
     return $copy;
 }
 
-sub as_number {
-    # An object might be asked to return itself as bigint on certain overloaded
-    # operations. This does exactly this, so that sub classes can simple inherit
-    # it or override with their own integer conversion routine.
-    $_[0]->copy();
+sub as_int {
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
+
+    # If called as an instance method, and the instance class is something we
+    # upgrade to, $x might not be a Math::BigInt, so don't just call copy().
+
+    return $x -> copy() if $x -> isa("Math::BigInt");
+
+    # disable upgrading and downgrading
+
+    my $upg = Math::BigInt -> upgrade();
+    my $dng = Math::BigInt -> downgrade();
+    Math::BigInt -> upgrade(undef);
+    Math::BigInt -> downgrade(undef);
+
+    my $y = Math::BigInt -> new($x);
+
+    # reset upgrading and downgrading
+
+    Math::BigInt -> upgrade($upg);
+    Math::BigInt -> downgrade($dng);
+
+    return $y;
+}
+
+sub as_float {
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
+
+    # disable upgrading and downgrading
+
+    require Math::BigFloat;
+    my $upg = Math::BigFloat -> upgrade();
+    my $dng = Math::BigFloat -> downgrade();
+    Math::BigFloat -> upgrade(undef);
+    Math::BigFloat -> downgrade(undef);
+
+    my $y = Math::BigFloat -> new($x);
+
+    # reset upgrading and downgrading
+
+    Math::BigFloat -> upgrade($upg);
+    Math::BigFloat -> downgrade($dng);
+
+    return $y;
+}
+
+sub as_rat {
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
+
+    # disable upgrading and downgrading
+
+    require Math::BigRat;
+    my $upg = Math::BigRat -> upgrade();
+    my $dng = Math::BigRat -> downgrade();
+    Math::BigRat -> upgrade(undef);
+    Math::BigRat -> downgrade(undef);
+
+    my $y = Math::BigRat -> new($x);
+
+    # reset upgrading and downgrading
+
+    Math::BigRat -> upgrade($upg);
+    Math::BigRat -> downgrade($dng);
+
+    return $y;
 }
 
 ###############################################################################
@@ -1233,7 +1332,7 @@ sub as_number {
 
 sub is_zero {
     # return true if arg (BINT or num_str) is zero (array '+', '0')
-    my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_);
+    my (undef, $x) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
 
     return 0 if $x->{sign} !~ /^\+$/; # -, NaN & +-inf aren't
     $LIB->_is_zero($x->{value});
@@ -1241,22 +1340,22 @@ sub is_zero {
 
 sub is_one {
     # return true if arg (BINT or num_str) is +1, or -1 if sign is given
-    my ($class, $x, $sign) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
+    my (undef, $x, $sign) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
 
-    $sign = '+' if !defined $sign || $sign ne '-';
+    $sign = '+' if !defined($sign) || $sign ne '-';
 
     return 0 if $x->{sign} ne $sign; # -1 != +1, NaN, +-inf aren't either
     $LIB->_is_one($x->{value});
 }
 
 sub is_finite {
-    my $x = shift;
+    my (undef, $x) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
     return $x->{sign} eq '+' || $x->{sign} eq '-';
 }
 
 sub is_inf {
     # return true if arg (BINT or num_str) is +-inf
-    my ($class, $x, $sign) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
+    my (undef, $x, $sign) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
 
     if (defined $sign) {
         $sign = '[+-]inf' if $sign eq ''; # +- doesn't matter, only that's inf
@@ -1268,14 +1367,14 @@ sub is_inf {
 
 sub is_nan {
     # return true if arg (BINT or num_str) is NaN
-    my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_);
+    my (undef, $x) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
 
     $x->{sign} eq $nan ? 1 : 0;
 }
 
 sub is_positive {
     # return true when arg (BINT or num_str) is positive (> 0)
-    my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_);
+    my (undef, $x) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
 
     return 1 if $x->{sign} eq '+inf'; # +inf is positive
 
@@ -1285,14 +1384,14 @@ sub is_positive {
 
 sub is_negative {
     # return true when arg (BINT or num_str) is negative (< 0)
-    my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_);
+    my (undef, $x) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
 
     $x->{sign} =~ /^-/ ? 1 : 0; # -inf is negative, but NaN is not
 }
 
 sub is_non_negative {
     # Return true if argument is non-negative (>= 0).
-    my ($class, $x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
+    my (undef, $x) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
 
     return 1 if $x->{sign} =~ /^\+/;
     return 1 if $x -> is_zero();
@@ -1301,7 +1400,7 @@ sub is_non_negative {
 
 sub is_non_positive {
     # Return true if argument is non-positive (<= 0).
-    my ($class, $x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
+    my (undef, $x) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
 
     return 1 if $x->{sign} =~ /^\-/;
     return 1 if $x -> is_zero();
@@ -1310,7 +1409,7 @@ sub is_non_positive {
 
 sub is_odd {
     # return true when arg (BINT or num_str) is odd, false for even
-    my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_);
+    my (undef, $x) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
 
     return 0 if $x->{sign} !~ /^[+-]$/; # NaN & +-inf aren't
     $LIB->_is_odd($x->{value});
@@ -1318,7 +1417,7 @@ sub is_odd {
 
 sub is_even {
     # return true when arg (BINT or num_str) is even, false for odd
-    my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_);
+    my (undef, $x) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
 
     return 0 if $x->{sign} !~ /^[+-]$/; # NaN & +-inf aren't
     $LIB->_is_even($x->{value});
@@ -1326,8 +1425,7 @@ sub is_even {
 
 sub is_int {
     # return true when arg (BINT or num_str) is an integer
-    # always true for Math::BigInt, but different for Math::BigFloat objects
-    my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_);
+    my (undef, $x) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
 
     $x->{sign} =~ /^[+-]$/ ? 1 : 0; # inf/-inf/NaN aren't
 }
@@ -1341,12 +1439,14 @@ sub bcmp {
     # (BINT or num_str, BINT or num_str) return cond_code
 
     # set up parameters
-    my ($class, $x, $y) = ref($_[0]) && ref($_[0]) eq ref($_[1])
-                        ? (ref($_[0]), @_)
-                        : objectify(2, @_);
+    my ($class, $x, $y, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+                            ? (ref($_[0]), @_)
+                            : objectify(2, @_);
+
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
 
-    return $upgrade->bcmp($x, $y) if defined $upgrade &&
-      ((!$x->isa($class)) || (!$y->isa($class)));
+    return $upgrade->bcmp($x, $y)
+      if defined($upgrade) && (!$x->isa($class) || !$y->isa($class));
 
     if (($x->{sign} !~ /^[+-]$/) || ($y->{sign} !~ /^[+-]$/)) {
         # handle +-inf and NaN
@@ -1357,6 +1457,7 @@ sub bcmp {
         return -1 if $y->{sign} eq '+inf';
         return +1;
     }
+
     # check sign for speed first
     return 1 if $x->{sign} eq '+' && $y->{sign} eq '-'; # does also 0 <=> -y
     return -1 if $x->{sign} eq '-' && $y->{sign} eq '+'; # does also -x <=> 0
@@ -1381,12 +1482,14 @@ sub bacmp {
     # (BINT, BINT) return cond_code
 
     # set up parameters
-    my ($class, $x, $y) = ref($_[0]) && ref($_[0]) eq ref($_[1])
-                        ? (ref($_[0]), @_)
-                        : objectify(2, @_);
+    my ($class, $x, $y, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+                            ? (ref($_[0]), @_)
+                            : objectify(2, @_);
+
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
 
-    return $upgrade->bacmp($x, $y) if defined $upgrade &&
-      ((!$x->isa($class)) || (!$y->isa($class)));
+    return $upgrade->bacmp($x, $y)
+      if defined($upgrade) && (!$x->isa($class) || !$y->isa($class));
 
     if (($x->{sign} !~ /^[+-]$/) || ($y->{sign} !~ /^[+-]$/)) {
         # handle +-inf and NaN
@@ -1399,69 +1502,68 @@ sub bacmp {
 }
 
 sub beq {
-    my $self    = shift;
-    my $selfref = ref $self;
+    my (undef, $x, $y, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+                           ? (undef, @_)
+                           : objectify(2, @_);
 
-    croak 'beq() is an instance method, not a class method' unless $selfref;
-    croak 'Wrong number of arguments for beq()' unless @_ == 1;
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
 
-    my $cmp = $self -> bcmp(shift);
-    return defined($cmp) && ! $cmp;
+    my $cmp = $x -> bcmp($y);           # bcmp() upgrades if necessary
+    return defined($cmp) && !$cmp;
 }
 
 sub bne {
-    my $self    = shift;
-    my $selfref = ref $self;
+    my (undef, $x, $y, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+                           ? (undef, @_)
+                           : objectify(2, @_);
 
-    croak 'bne() is an instance method, not a class method' unless $selfref;
-    croak 'Wrong number of arguments for bne()' unless @_ == 1;
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
 
-    my $cmp = $self -> bcmp(shift);
-    return defined($cmp) && ! $cmp ? '' : 1;
+    my $cmp = $x -> bcmp($y);           # bcmp() upgrades if necessary
+    return defined($cmp) && !$cmp ? '' : 1;
 }
 
 sub blt {
-    my $self    = shift;
-    my $selfref = ref $self;
+    my (undef, $x, $y, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+                           ? (undef, @_)
+                           : objectify(2, @_);
 
-    croak 'blt() is an instance method, not a class method' unless $selfref;
-    croak 'Wrong number of arguments for blt()' unless @_ == 1;
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
 
-    my $cmp = $self -> bcmp(shift);
+    my $cmp = $x -> bcmp($y);           # bcmp() upgrades if necessary
     return defined($cmp) && $cmp < 0;
 }
 
 sub ble {
-    my $self    = shift;
-    my $selfref = ref $self;
+    my (undef, $x, $y, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+                           ? (undef, @_)
+                           : objectify(2, @_);
 
-    croak 'ble() is an instance method, not a class method' unless $selfref;
-    croak 'Wrong number of arguments for ble()' unless @_ == 1;
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
 
-    my $cmp = $self -> bcmp(shift);
+    my $cmp = $x -> bcmp($y);           # bcmp() upgrades if necessary
     return defined($cmp) && $cmp <= 0;
 }
 
 sub bgt {
-    my $self    = shift;
-    my $selfref = ref $self;
+    my (undef, $x, $y, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+                           ? (undef, @_)
+                           : objectify(2, @_);
 
-    croak 'bgt() is an instance method, not a class method' unless $selfref;
-    croak 'Wrong number of arguments for bgt()' unless @_ == 1;
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
 
-    my $cmp = $self -> bcmp(shift);
+    my $cmp = $x -> bcmp($y);           # bcmp() upgrades if necessary
     return defined($cmp) && $cmp > 0;
 }
 
 sub bge {
-    my $self    = shift;
-    my $selfref = ref $self;
+    my (undef, $x, $y, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+                           ? (undef, @_)
+                           : objectify(2, @_);
 
-    croak 'bge() is an instance method, not a class method'
-        unless $selfref;
-    croak 'Wrong number of arguments for bge()' unless @_ == 1;
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
 
-    my $cmp = $self -> bcmp(shift);
+    my $cmp = $x -> bcmp($y);           # bcmp() upgrades if necessary
     return defined($cmp) && $cmp >= 0;
 }
 
@@ -1472,84 +1574,104 @@ sub bge {
 sub bneg {
     # (BINT or num_str) return BINT
     # negate number or make a negated number from string
-    my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_);
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
 
     return $x if $x->modify('bneg');
 
-    # for +0 do not negate (to have always normalized +0). Does nothing for 'NaN'
-    $x->{sign} =~ tr/+-/-+/ unless ($x->{sign} eq '+' && $LIB->_is_zero($x->{value}));
-    $x;
+    return $upgrade -> bneg($x, @r) if defined($upgrade) && !$x->isa($class);
+
+    # Don't negate +0 so we always have the normalized form +0. Does nothing for
+    # 'NaN'.
+    $x->{sign} =~ tr/+-/-+/
+      unless $x->{sign} eq '+' && $LIB->_is_zero($x->{value});
+
+    $x -> round(@r);
 }
 
 sub babs {
     # (BINT or num_str) return BINT
     # make number absolute, or return absolute BINT from string
-    my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_);
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
 
     return $x if $x->modify('babs');
-    # post-normalized abs for internal use (does nothing for NaN)
+
+    return $upgrade -> babs($x, @r) if defined($upgrade) && !$x->isa($class);
+
     $x->{sign} =~ s/^-/+/;
-    $x;
+
+    $x -> round(@r);
 }
 
 sub bsgn {
     # Signum function.
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
 
-    my $self = shift;
+    return $x if $x->modify('bsgn');
+
+    return $upgrade -> bsgn($x, @r) if defined($upgrade) && !$x->isa($class);
 
-    return $self if $self->modify('bsgn');
+    return $x -> bone("+", @r) if $x -> is_pos();
+    return $x -> bone("-", @r) if $x -> is_neg();
 
-    return $self -> bone("+") if $self -> is_pos();
-    return $self -> bone("-") if $self -> is_neg();
-    return $self;               # zero or NaN
+    $x -> round(@r);
 }
 
 sub bnorm {
     # (numstr or BINT) return BINT
     # Normalize number -- no-op here
-    my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_);
+    my ($class, $x, @r) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_);
+
+    # This method is called from the rounding methods, so if this method
+    # supports rounding by calling the rounding methods, we get an infinite
+    # recursion.
+
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
+
     $x;
 }
 
 sub binc {
     # increment arg by one
-    my ($class, $x, $a, $p, $r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
     return $x if $x->modify('binc');
 
+    return $x->round(@r) if $x -> is_inf() || $x -> is_nan();
+
+    return $upgrade -> binc($x, @r) if defined($upgrade) && !$x -> isa($class);
+
     if ($x->{sign} eq '+') {
         $x->{value} = $LIB->_inc($x->{value});
-        return $x->round($a, $p, $r);
     } elsif ($x->{sign} eq '-') {
         $x->{value} = $LIB->_dec($x->{value});
         $x->{sign} = '+' if $LIB->_is_zero($x->{value}); # -1 +1 => -0 => +0
-        return $x->round($a, $p, $r);
     }
-    # inf, nan handling etc
-    $x->badd($class->bone(), $a, $p, $r); # badd does round
+
+    return $x->round(@r);
 }
 
 sub bdec {
     # decrement arg by one
     my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
     return $x if $x->modify('bdec');
 
+    return $x->round(@r) if $x -> is_inf() || $x -> is_nan();
+
+    return $upgrade -> bdec($x, @r) if defined($upgrade) && !$x -> isa($class);;
+
     if ($x->{sign} eq '-') {
-        # x already < 0
         $x->{value} = $LIB->_inc($x->{value});
-    } else {
-        return $x->badd($class->bone('-'), @r)
-          unless $x->{sign} eq '+'; # inf or NaN
-        # >= 0
-        if ($LIB->_is_zero($x->{value})) {
-            # == 0
+    } elsif ($x->{sign} eq '+') {
+        if ($LIB->_is_zero($x->{value})) {      # +1 - 1 => +0
             $x->{value} = $LIB->_one();
-            $x->{sign} = '-'; # 0 => -1
+            $x->{sign} = '-';
         } else {
-            # > 0
             $x->{value} = $LIB->_dec($x->{value});
         }
     }
-    $x->round(@r);
+
+    return $x->round(@r);
 }
 
 #sub bstrcmp {
@@ -1643,56 +1765,41 @@ sub bdec {
 #}
 
 sub badd {
-
     # add second arg (BINT or string) to first (BINT) (modifies first)
     # return result as BINT
 
     # set up parameters
-    my ($class, $x, $y, @r) = (ref($_[0]), @_);
-    # objectify is costly, so avoid it
-    if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) {
-        ($class, $x, $y, @r) = objectify(2, @_);
-    }
+    my ($class, $x, $y, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+                            ? (ref($_[0]), @_)
+                            : objectify(2, @_);
 
     return $x if $x->modify('badd');
-    return $upgrade->badd($upgrade->new($x), $upgrade->new($y), @r) if defined $upgrade &&
-      ((!$x->isa($class)) || (!$y->isa($class)));
 
     $r[3] = $y;                 # no push!
-    # inf and NaN handling
+
+    return $upgrade->badd($x, $y, @r)
+      if defined($upgrade) && (!$x->isa($class) || !$y->isa($class));
+
+    # Inf and NaN handling
     if ($x->{sign} !~ /^[+-]$/ || $y->{sign} !~ /^[+-]$/) {
         # NaN first
-        return $x->bnan() if (($x->{sign} eq $nan) || ($y->{sign} eq $nan));
-        # inf handling
+        return $x->bnan(@r) if (($x->{sign} eq $nan) || ($y->{sign} eq $nan));
+        # Inf handling
         if (($x->{sign} =~ /^[+-]inf$/) && ($y->{sign} =~ /^[+-]inf$/)) {
-            # +inf++inf or -inf+-inf => same, rest is NaN
-            return $x if $x->{sign} eq $y->{sign};
-            return $x->bnan();
+            # +Inf + +Inf or -Inf + -Inf => same, rest is NaN
+            return $x->round(@r) if $x->{sign} eq $y->{sign};
+            return $x->bnan(@r);
         }
-        # +-inf + something => +inf
-        # something +-inf => +-inf
-        $x->{sign} = $y->{sign}, return $x if $y->{sign} =~ /^[+-]inf$/;
-        return $x;
-    }
-
-    my ($sx, $sy) = ($x->{sign}, $y->{sign});  # get signs
-
-    if ($sx eq $sy) {
-        $x->{value} = $LIB->_add($x->{value}, $y->{value}); # same sign, abs add
-    } else {
-        my $a = $LIB->_acmp ($y->{value}, $x->{value}); # absolute compare
-        if ($a > 0) {
-            $x->{value} = $LIB->_sub($y->{value}, $x->{value}, 1); # abs sub w/ swap
-            $x->{sign} = $sy;
-        } elsif ($a == 0) {
-            # speedup, if equal, set result to 0
-            $x->{value} = $LIB->_zero();
-            $x->{sign} = '+';
-        } else                  # a < 0
-        {
-            $x->{value} = $LIB->_sub($x->{value}, $y->{value}); # abs sub
+        # ±Inf + something => ±Inf
+        # something + ±Inf => ±Inf
+        if ($y->{sign} =~ /^[+-]inf$/) {
+            $x->{sign} = $y->{sign};
         }
+        return $x -> round(@r);
     }
+
+    ($x->{value}, $x->{sign})
+      = $LIB -> _sadd($x->{value}, $x->{sign}, $y->{value}, $y->{sign});
     $x->round(@r);
 }
 
@@ -1701,17 +1808,14 @@ sub bsub {
     # subtract second arg from first, modify first
 
     # set up parameters
-    my ($class, $x, $y, @r) = (ref($_[0]), @_);
-
-    # objectify is costly, so avoid it
-    if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) {
-        ($class, $x, $y, @r) = objectify(2, @_);
-    }
+    my ($class, $x, $y, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+                            ? (ref($_[0]), @_)
+                            : objectify(2, @_);
 
     return $x if $x -> modify('bsub');
 
-    return $upgrade -> bsub($upgrade -> new($x), $upgrade -> new($y), @r)
-      if defined $upgrade && (!$x -> isa($class) || !$y -> isa($class));
+    return $upgrade -> bsub($x, $y, @r)
+      if defined($upgrade) && (!$x->isa($class) || !$y->isa($class));
 
     return $x -> round(@r) if $y -> is_zero();
 
@@ -1724,9 +1828,10 @@ sub bsub {
     if ($xsign ne $x -> {sign}) {
         # special case of $x -> bsub($x) results in 0
         return $x -> bzero(@r) if $xsign =~ /^[+-]$/;
-        return $x -> bnan();    # NaN, -inf, +inf
+        return $x -> bnan(@r);    # NaN, -inf, +inf
     }
-    $x -> badd($y, @r);         # badd does not leave internal zeros
+
+    $x = $x -> badd($y, @r);    # badd() does not leave internal zeros
     $y -> {sign} =~ tr/+-/-+/;  # refix $y (does nothing for NaN)
     $x;                         # already rounded by badd() or no rounding
 }
@@ -1736,29 +1841,27 @@ sub bmul {
     # (BINT or num_str, BINT or num_str) return BINT
 
     # set up parameters
-    my ($class, $x, $y, @r) = (ref($_[0]), @_);
-    # objectify is costly, so avoid it
-    if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) {
-        ($class, $x, $y, @r) = objectify(2, @_);
-    }
+    my ($class, $x, $y, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+                            ? (ref($_[0]), @_)
+                            : objectify(2, @_);
 
     return $x if $x->modify('bmul');
 
-    return $x->bnan() if (($x->{sign} eq $nan) || ($y->{sign} eq $nan));
+    return $x->bnan(@r) if (($x->{sign} eq $nan) || ($y->{sign} eq $nan));
 
     # inf handling
     if (($x->{sign} =~ /^[+-]inf$/) || ($y->{sign} =~ /^[+-]inf$/)) {
-        return $x->bnan() if $x->is_zero() || $y->is_zero();
+        return $x->bnan(@r) if $x->is_zero() || $y->is_zero();
         # result will always be +-inf:
         # +inf * +/+inf => +inf, -inf * -/-inf => +inf
         # +inf * -/-inf => -inf, -inf * +/+inf => -inf
-        return $x->binf() if ($x->{sign} =~ /^\+/ && $y->{sign} =~ /^\+/);
-        return $x->binf() if ($x->{sign} =~ /^-/ && $y->{sign} =~ /^-/);
-        return $x->binf('-');
+        return $x->binf(@r) if ($x->{sign} =~ /^\+/ && $y->{sign} =~ /^\+/);
+        return $x->binf(@r) if ($x->{sign} =~ /^-/ && $y->{sign} =~ /^-/);
+        return $x->binf('-', @r);
     }
 
-    return $upgrade->bmul($x, $upgrade->new($y), @r)
-      if defined $upgrade && !$y->isa($class);
+    return $upgrade->bmul($x, $y, @r)
+      if defined($upgrade) && (!$x->isa($class) || !$y->isa($class));
 
     $r[3] = $y;                 # no push here
 
@@ -1775,60 +1878,143 @@ sub bmuladd {
     # (BINT or num_str, BINT or num_str, BINT or num_str) return BINT
 
     # set up parameters
-    my ($class, $x, $y, $z, @r) = objectify(3, @_);
+    my ($class, $x, $y, $z, @r)
+      = ref($_[0]) && ref($_[0]) eq ref($_[1]) && ref($_[1]) eq ref($_[2])
+      ? (ref($_[0]), @_)
+      : objectify(3, @_);
 
     return $x if $x->modify('bmuladd');
 
-    return $x->bnan() if (($x->{sign} eq $nan) ||
-                          ($y->{sign} eq $nan) ||
-                          ($z->{sign} eq $nan));
+    # x, y, and z are finite numbers
 
-    # inf handling of x and y
-    if (($x->{sign} =~ /^[+-]inf$/) || ($y->{sign} =~ /^[+-]inf$/)) {
-        return $x->bnan() if $x->is_zero() || $y->is_zero();
-        # result will always be +-inf:
-        # +inf * +/+inf => +inf, -inf * -/-inf => +inf
-        # +inf * -/-inf => -inf, -inf * +/+inf => -inf
-        return $x->binf() if ($x->{sign} =~ /^\+/ && $y->{sign} =~ /^\+/);
-        return $x->binf() if ($x->{sign} =~ /^-/ && $y->{sign} =~ /^-/);
-        return $x->binf('-');
-    }
-    # inf handling x*y and z
-    if (($z->{sign} =~ /^[+-]inf$/)) {
-        # something +-inf => +-inf
-        $x->{sign} = $z->{sign}, return $x if $z->{sign} =~ /^[+-]inf$/;
+    if ($x->{sign} =~ /^[+-]$/ &&
+        $y->{sign} =~ /^[+-]$/ &&
+        $z->{sign} =~ /^[+-]$/)
+    {
+        return $upgrade->bmuladd($x, $y, $z, @r)
+          if defined($upgrade)
+               && (!$x->isa($class) || !$y->isa($class) || !$z->isa($class));
+
+        # TODO: what if $y and $z have A or P set?
+        $r[3] = $z;             # no push here
+
+        my $zs = $z->{sign};
+        my $zv = $z->{value};
+        $zv = $LIB -> _copy($zv) if refaddr($x) eq refaddr($z);
+
+        $x->{sign} = $x->{sign} eq $y->{sign} ? '+' : '-'; # +1 * +1 or -1 * -1 => +
+        $x->{value} = $LIB->_mul($x->{value}, $y->{value}); # do actual math
+        $x->{sign} = '+' if $LIB->_is_zero($x->{value});    # no -0
+
+        ($x->{value}, $x->{sign})
+          = $LIB -> _sadd($x->{value}, $x->{sign}, $zv, $zs);
+        return $x->round(@r);
     }
 
-    return $upgrade->bmuladd($x, $upgrade->new($y), $upgrade->new($z), @r)
-      if defined $upgrade && (!$y->isa($class) || !$z->isa($class) || !$x->isa($class));
+    # At least one of x, y, and z is a NaN
 
-    # TODO: what if $y and $z have A or P set?
-    $r[3] = $z;                 # no push here
+    return $x->bnan(@r) if (($x->{sign} eq $nan) ||
+                            ($y->{sign} eq $nan) ||
+                            ($z->{sign} eq $nan));
 
-    $x->{sign} = $x->{sign} eq $y->{sign} ? '+' : '-'; # +1 * +1 or -1 * -1 => +
+    # At least one of x, y, and z is an Inf
 
-    $x->{value} = $LIB->_mul($x->{value}, $y->{value}); # do actual math
-    $x->{sign} = '+' if $LIB->_is_zero($x->{value});   # no -0
+    if ($x->{sign} eq "-inf") {
 
-    my ($sx, $sz) = ( $x->{sign}, $z->{sign} ); # get signs
+        if ($y -> is_neg()) {               # x = -inf, y < 0
+            if ($z->{sign} eq "-inf") {
+                return $x->bnan(@r);
+            } else {
+                return $x->binf("+", @r);
+            }
+        } elsif ($y -> is_zero()) {         # x = -inf, y = 0
+            return $x->bnan(@r);
+        } else {                            # x = -inf, y > 0
+            if ($z->{sign} eq "+inf") {
+                return $x->bnan(@r);
+            } else {
+                return $x->binf("-", @r);
+            }
+        }
 
-    if ($sx eq $sz) {
-        $x->{value} = $LIB->_add($x->{value}, $z->{value}); # same sign, abs add
-    } else {
-        my $a = $LIB->_acmp ($z->{value}, $x->{value}); # absolute compare
-        if ($a > 0) {
-            $x->{value} = $LIB->_sub($z->{value}, $x->{value}, 1); # abs sub w/ swap
-            $x->{sign} = $sz;
-        } elsif ($a == 0) {
-            # speedup, if equal, set result to 0
-            $x->{value} = $LIB->_zero();
-            $x->{sign} = '+';
-        } else                  # a < 0
-        {
-            $x->{value} = $LIB->_sub($x->{value}, $z->{value}); # abs sub
+    } elsif ($x->{sign} eq "+inf") {
+
+        if ($y -> is_neg()) {               # x = +inf, y < 0
+            if ($z->{sign} eq "+inf") {
+                return $x->bnan(@r);
+            } else {
+                return $x->binf("-", @r);
+            }
+        } elsif ($y -> is_zero()) {         # x = +inf, y = 0
+            return $x->bnan(@r);
+        } else {                            # x = +inf, y > 0
+            if ($z->{sign} eq "-inf") {
+                return $x->bnan(@r);
+            } else {
+                return $x->binf("+", @r);
+            }
+        }
+
+    } elsif ($x -> is_neg()) {
+
+        if ($y->{sign} eq "-inf") {         # -inf < x < 0, y = -inf
+            if ($z->{sign} eq "-inf") {
+                return $x->bnan(@r);
+            } else {
+                return $x->binf("+", @r);
+            }
+        } elsif ($y->{sign} eq "+inf") {    # -inf < x < 0, y = +inf
+            if ($z->{sign} eq "+inf") {
+                return $x->bnan(@r);
+            } else {
+                return $x->binf("-", @r);
+            }
+        } else {                            # -inf < x < 0, -inf < y < +inf
+            if ($z->{sign} eq "-inf") {
+                return $x->binf("-", @r);
+            } elsif ($z->{sign} eq "+inf") {
+                return $x->binf("+", @r);
+            }
+        }
+
+    } elsif ($x -> is_zero()) {
+
+        if ($y->{sign} eq "-inf") {         # x = 0, y = -inf
+            return $x->bnan(@r);
+        } elsif ($y->{sign} eq "+inf") {    # x = 0, y = +inf
+            return $x->bnan(@r);
+        } else {                            # x = 0, -inf < y < +inf
+            if ($z->{sign} eq "-inf") {
+                return $x->binf("-", @r);
+            } elsif ($z->{sign} eq "+inf") {
+                return $x->binf("+", @r);
+            }
+        }
+
+    } elsif ($x -> is_pos()) {
+
+        if ($y->{sign} eq "-inf") {         # 0 < x < +inf, y = -inf
+            if ($z->{sign} eq "+inf") {
+                return $x->bnan(@r);
+            } else {
+                return $x->binf("-", @r);
+            }
+        } elsif ($y->{sign} eq "+inf") {    # 0 < x < +inf, y = +inf
+            if ($z->{sign} eq "-inf") {
+                return $x->bnan(@r);
+            } else {
+                return $x->binf("+", @r);
+            }
+        } else {                            # 0 < x < +inf, -inf < y < +inf
+            if ($z->{sign} eq "-inf") {
+                return $x->binf("-", @r);
+            } elsif ($z->{sign} eq "+inf") {
+                return $x->binf("+", @r);
+            }
         }
     }
-    $x->round(@r);
+
+    die;
 }
 
 sub bdiv {
@@ -1837,12 +2023,9 @@ sub bdiv {
     # sign as the divisor.
 
     # Set up parameters.
-    my ($class, $x, $y, @r) = (ref($_[0]), @_);
-
-    # objectify() is costly, so avoid it if we can.
-    if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) {
-        ($class, $x, $y, @r) = objectify(2, @_);
-    }
+    my ($class, $x, $y, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+                            ? (ref($_[0]), @_)
+                            : objectify(2, @_);
 
     return $x if $x -> modify('bdiv');
 
@@ -1852,7 +2035,8 @@ sub bdiv {
     # modulo/remainder.
 
     if ($x -> is_nan() || $y -> is_nan()) {
-        return $wantarray ? ($x -> bnan(), $class -> bnan()) : $x -> bnan();
+        return $wantarray ? ($x -> bnan(@r), $class -> bnan(@r))
+                          : $x -> bnan(@r);
     }
 
     # Divide by zero and modulo zero.
@@ -1875,12 +2059,12 @@ sub bdiv {
     if ($y -> is_zero()) {
         my $rem;
         if ($wantarray) {
-            $rem = $x -> copy();
+            $rem = $x -> copy() -> round(@r);
         }
         if ($x -> is_zero()) {
-            $x -> bnan();
+            $x = $x -> bnan(@r);
         } else {
-            $x -> binf($x -> {sign});
+            $x = $x -> binf($x -> {sign}, @r);
         }
         return $wantarray ? ($x, $rem) : $x;
     }
@@ -1901,12 +2085,12 @@ sub bdiv {
 
     if ($x -> is_inf()) {
         my $rem;
-        $rem = $class -> bnan() if $wantarray;
+        $rem = $class -> bnan(@r) if $wantarray;
         if ($y -> is_inf()) {
-            $x -> bnan();
+            $x = $x -> bnan(@r);
         } else {
             my $sign = $x -> bcmp(0) == $y -> bcmp(0) ? '+' : '-';
-            $x -> binf($sign);
+            $x = $x -> binf($sign, @r);
         }
         return $wantarray ? ($x, $rem) : $x;
     }
@@ -1927,11 +2111,11 @@ sub bdiv {
     if ($y -> is_inf()) {
         my $rem;
         if ($x -> is_zero() || $x -> bcmp(0) == $y -> bcmp(0)) {
-            $rem = $x -> copy() if $wantarray;
-            $x -> bzero();
+            $rem = $x -> copy() -> round(@r) if $wantarray;
+            $x = $x -> bzero(@r);
         } else {
-            $rem = $class -> binf($y -> {sign}) if $wantarray;
-            $x -> bone('-');
+            $rem = $class -> binf($y -> {sign}, @r) if $wantarray;
+            $x = $x -> bone('-', @r);
         }
         return $wantarray ? ($x, $rem) : $x;
     }
@@ -1939,8 +2123,10 @@ sub bdiv {
     # At this point, both the numerator and denominator are finite numbers, and
     # the denominator (divisor) is non-zero.
 
-    return $upgrade -> bdiv($upgrade -> new($x), $upgrade -> new($y), @r)
-      if defined $upgrade;
+    # Division might return a non-integer result, so upgrade unconditionally, if
+    # upgrading is enabled.
+
+    return $upgrade -> bdiv($x, $y, @r) if defined $upgrade;
 
     $r[3] = $y;                                   # no push!
 
@@ -1959,7 +2145,7 @@ sub bdiv {
     $y -> {sign} = $ysign;                # Re-insert the original sign.
 
     if ($same) {
-        $x -> bone();
+        $x = $x -> bone();
     } else {
         ($x -> {value}, $rem -> {value}) =
           $LIB -> _div($x -> {value}, $y -> {value});
@@ -1975,16 +2161,16 @@ sub bdiv {
                 $x -> {sign} = '+';
             } else {
                 if ($xsign eq '+') {
-                    $x -> badd(1);
+                    $x = $x -> badd(1);
                 } else {
-                    $x -> bsub(1);
+                    $x = $x -> bsub(1);
                 }
                 $x -> {sign} = '-';
             }
         }
     }
 
-    $x -> round(@r);
+    $x = $x -> round(@r);
 
     if ($wantarray) {
         unless ($LIB -> _is_zero($rem -> {value})) {
@@ -1995,7 +2181,7 @@ sub bdiv {
         }
         $rem -> {_a} = $x -> {_a};
         $rem -> {_p} = $x -> {_p};
-        $rem -> round(@r);
+        $rem = $rem -> round(@r);
         return ($x, $rem);
     }
 
@@ -2010,12 +2196,9 @@ sub btdiv {
     # and $q * $y + $r = $x.
 
     # Set up parameters
-    my ($class, $x, $y, @r) = (ref($_[0]), @_);
-
-    # objectify is costly, so avoid it if we can.
-    if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) {
-        ($class, $x, $y, @r) = objectify(2, @_);
-    }
+    my ($class, $x, $y, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+                            ? (ref($_[0]), @_)
+                            : objectify(2, @_);
 
     return $x if $x -> modify('btdiv');
 
@@ -2025,7 +2208,8 @@ sub btdiv {
     # modulo/remainder.
 
     if ($x -> is_nan() || $y -> is_nan()) {
-        return $wantarray ? ($x -> bnan(), $class -> bnan()) : $x -> bnan();
+        return $wantarray ? ($x -> bnan(@r), $class -> bnan(@r))
+                          : $x -> bnan(@r);
     }
 
     # Divide by zero and modulo zero.
@@ -2048,12 +2232,12 @@ sub btdiv {
     if ($y -> is_zero()) {
         my $rem;
         if ($wantarray) {
-            $rem = $x -> copy();
+            $rem = $x -> copy(@r);
         }
         if ($x -> is_zero()) {
-            $x -> bnan();
+            $x = $x -> bnan(@r);
         } else {
-            $x -> binf($x -> {sign});
+            $x = $x -> binf($x -> {sign}, @r);
         }
         return $wantarray ? ($x, $rem) : $x;
     }
@@ -2074,12 +2258,12 @@ sub btdiv {
 
     if ($x -> is_inf()) {
         my $rem;
-        $rem = $class -> bnan() if $wantarray;
+        $rem = $class -> bnan(@r) if $wantarray;
         if ($y -> is_inf()) {
-            $x -> bnan();
+            $x = $x -> bnan(@r);
         } else {
             my $sign = $x -> bcmp(0) == $y -> bcmp(0) ? '+' : '-';
-            $x -> binf($sign);
+            $x = $x -> binf($sign,@r );
         }
         return $wantarray ? ($x, $rem) : $x;
     }
@@ -2099,13 +2283,15 @@ sub btdiv {
 
     if ($y -> is_inf()) {
         my $rem;
-        $rem = $x -> copy() if $wantarray;
-        $x -> bzero();
+        $rem = $x -> copy() -> round(@r) if $wantarray;
+        $x = $x -> bzero(@r);
         return $wantarray ? ($x, $rem) : $x;
     }
 
-    return $upgrade -> btdiv($upgrade -> new($x), $upgrade -> new($y), @r)
-      if defined $upgrade;
+    # Division might return a non-integer result, so upgrade unconditionally, if
+    # upgrading is enabled.
+
+    return $upgrade -> btdiv($x, $y, @r) if defined $upgrade;
 
     $r[3] = $y;                 # no push!
 
@@ -2124,14 +2310,14 @@ sub btdiv {
     $y -> {sign} = $ysign;                # Re-insert the original sign.
 
     if ($same) {
-        $x -> bone();
+        $x = $x -> bone(@r);
     } else {
         ($x -> {value}, $rem -> {value}) =
           $LIB -> _div($x -> {value}, $y -> {value});
 
         $x -> {sign} = $xsign eq $ysign ? '+' : '-';
         $x -> {sign} = '+' if $LIB -> _is_zero($x -> {value});
-        $x -> round(@r);
+        $x = $x -> round(@r);
     }
 
     if (wantarray) {
@@ -2139,7 +2325,7 @@ sub btdiv {
         $rem -> {sign} = '+' if $LIB -> _is_zero($rem -> {value});
         $rem -> {_a} = $x -> {_a};
         $rem -> {_p} = $x -> {_p};
-        $rem -> round(@r);
+        $rem = $rem -> round(@r);
         return ($x, $rem);
     }
 
@@ -2150,44 +2336,45 @@ sub bmod {
     # This is the remainder after floored division.
 
     # Set up parameters.
-    my ($class, $x, $y, @r) = (ref($_[0]), @_);
-
-    # objectify is costly, so avoid it
-    if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) {
-        ($class, $x, $y, @r) = objectify(2, @_);
-    }
+    my ($class, $x, $y, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+                            ? (ref($_[0]), @_)
+                            : objectify(2, @_);
 
     return $x if $x -> modify('bmod');
+
     $r[3] = $y;                 # no push!
 
     # At least one argument is NaN.
 
     if ($x -> is_nan() || $y -> is_nan()) {
-        return $x -> bnan();
+        return $x -> bnan(@r);
     }
 
     # Modulo zero. See documentation for bdiv().
 
     if ($y -> is_zero()) {
-        return $x;
+        return $x -> round(@r);
     }
 
     # Numerator (dividend) is +/-inf.
 
     if ($x -> is_inf()) {
-        return $x -> bnan();
+        return $x -> bnan(@r);
     }
 
     # Denominator (divisor) is +/-inf.
 
     if ($y -> is_inf()) {
         if ($x -> is_zero() || $x -> bcmp(0) == $y -> bcmp(0)) {
-            return $x;
+            return $x -> round(@r);
         } else {
-            return $x -> binf($y -> sign());
+            return $x -> binf($y -> sign(), @r);
         }
     }
 
+    return $upgrade -> bmod($x, $y, @r)
+      if defined($upgrade) && (!$x -> isa($class) || !$y -> isa($class));
+
     # Calc new sign and in case $y == +/- 1, return $x.
 
     $x -> {value} = $LIB -> _mod($x -> {value}, $y -> {value});
@@ -2206,41 +2393,38 @@ sub btmod {
     # Remainder after truncated division.
 
     # set up parameters
-    my ($class, $x, $y, @r) = (ref($_[0]), @_);
-
-    # objectify is costly, so avoid it
-    if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) {
-        ($class, $x, $y, @r) = objectify(2, @_);
-    }
+    my ($class, $x, $y, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+                            ? (ref($_[0]), @_)
+                            : objectify(2, @_);
 
     return $x if $x -> modify('btmod');
 
     # At least one argument is NaN.
 
     if ($x -> is_nan() || $y -> is_nan()) {
-        return $x -> bnan();
+        return $x -> bnan(@r);
     }
 
     # Modulo zero. See documentation for btdiv().
 
     if ($y -> is_zero()) {
-        return $x;
+        return $x -> round(@r);
     }
 
     # Numerator (dividend) is +/-inf.
 
     if ($x -> is_inf()) {
-        return $x -> bnan();
+        return $x -> bnan(@r);
     }
 
     # Denominator (divisor) is +/-inf.
 
     if ($y -> is_inf()) {
-        return $x;
+        return $x -> round(@r);
     }
 
-    return $upgrade -> btmod($upgrade -> new($x), $upgrade -> new($y), @r)
-      if defined $upgrade;
+    return $upgrade -> btmod($x, $y, @r)
+      if defined($upgrade) && (!$x -> isa($class) || !$y -> isa($class));
 
     $r[3] = $y;                 # no push!
 
@@ -2251,7 +2435,6 @@ sub btmod {
     $x -> {sign} = $xsign;
     $x -> {sign} = '+' if $LIB -> _is_zero($x -> {value});
     $x -> round(@r);
-    return $x;
 }
 
 sub bmodinv {
@@ -2267,28 +2450,29 @@ sub bmodinv {
     # If no modular multiplicative inverse exists, NaN is returned.
 
     # set up parameters
-    my ($class, $x, $y, @r) = (undef, @_);
-    # objectify is costly, so avoid it
-    if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) {
-        ($class, $x, $y, @r) = objectify(2, @_);
-    }
+    my ($class, $x, $y, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+                            ? (ref($_[0]), @_)
+                            : objectify(2, @_);
 
     return $x if $x->modify('bmodinv');
 
     # Return NaN if one or both arguments is +inf, -inf, or nan.
 
-    return $x->bnan() if ($y->{sign} !~ /^[+-]$/ ||
-                          $x->{sign} !~ /^[+-]$/);
+    return $x->bnan(@r) if ($y->{sign} !~ /^[+-]$/ ||
+                            $x->{sign} !~ /^[+-]$/);
 
     # Return NaN if $y is zero; 1 % 0 makes no sense.
 
-    return $x->bnan() if $y->is_zero();
+    return $x->bnan(@r) if $y->is_zero();
 
     # Return 0 in the trivial case. $x % 1 or $x % -1 is zero for all finite
     # integers $x.
 
-    return $x->bzero() if ($y->is_one() ||
-                           $y->is_one('-'));
+    return $x->bzero(@r) if ($y->is_one('+') ||
+                             $y->is_one('-'));
+
+    return $upgrade -> bmodinv($x, $y, @r)
+      if defined($upgrade) && (!$x -> isa($class) || !$y -> isa($class));
 
     # Return NaN if $x = 0, or $x modulo $y is zero. The only valid case when
     # $x = 0 is when $y = 1 or $y = -1, but that was covered above.
@@ -2299,14 +2483,14 @@ sub bmodinv {
     # $y = 7, the values fed to _modinv() are $x = 2 (= -5 % 7) and $y = 7.
     # The value if $x is affected only when $x and $y have opposite signs.
 
-    $x->bmod($y);
-    return $x->bnan() if $x->is_zero();
+    $x = $x->bmod($y);
+    return $x->bnan(@r) if $x->is_zero();
 
     # Compute the modular multiplicative inverse of the absolute values. We'll
     # correct for the signs of $x and $y later. Return NaN if no GCD is found.
 
     ($x->{value}, $x->{sign}) = $LIB->_modinv($x->{value}, $y->{value});
-    return $x->bnan() if !defined $x->{value};
+    return $x->bnan(@r) if !defined($x->{value});
 
     # Library inconsistency workaround: _modinv() in Math::BigInt::GMP versions
     # <= 1.32 return undef rather than a "+" for the sign.
@@ -2325,20 +2509,23 @@ sub bmodinv {
     # inverse modulo. The net effect is that we must swap the sign of the
     # result if $y is negative.
 
-    $x -> bneg() if $y->{sign} eq '-';
+    $x = $x -> bneg() if $y->{sign} eq '-';
 
     # Compute $x modulo $y again after correcting the sign.
 
-    $x -> bmod($y) if $x->{sign} ne $y->{sign};
+    $x = $x -> bmod($y) if $x->{sign} ne $y->{sign};
 
-    return $x;
+    $x -> round(@r);
 }
 
 sub bmodpow {
-    # Modular exponentiation. Raises a very large number to a very large exponent
-    # in a given very large modulus quickly, thanks to binary exponentiation.
-    # Supports negative exponents.
-    my ($class, $num, $exp, $mod, @r) = objectify(3, @_);
+    # Modular exponentiation. Raises a very large number to a very large
+    # exponent in a given very large modulus quickly, thanks to binary
+    # exponentiation.  Supports negative exponents.
+    my ($class, $num, $exp, $mod, @r)
+      = ref($_[0]) && ref($_[0]) eq ref($_[1]) && ref($_[1]) eq ref($_[2])
+      ? (ref($_[0]), @_)
+      : objectify(3, @_);
 
     return $num if $num->modify('bmodpow');
 
@@ -2347,25 +2534,30 @@ sub bmodpow {
     #
     #    b^(-e) (mod m) = d^e (mod m) where b*d = 1 (mod m)
 
-    $num->bmodinv($mod) if ($exp->{sign} eq '-');
+    $num = $num -> bmodinv($mod) if ($exp->{sign} eq '-');
 
-    # Check for valid input. All operands must be finite, and the modulus must be
-    # non-zero.
+    # Check for valid input. All operands must be finite, and the modulus must
+    # be non-zero.
 
-    return $num->bnan() if ($num->{sign} =~ /NaN|inf/ || # NaN, -inf, +inf
-                            $exp->{sign} =~ /NaN|inf/ || # NaN, -inf, +inf
-                            $mod->{sign} =~ /NaN|inf/);  # NaN, -inf, +inf
+    return $num->bnan(@r) if ($num->{sign} =~ /NaN|inf/ ||  # NaN, -inf, +inf
+                              $exp->{sign} =~ /NaN|inf/ ||  # NaN, -inf, +inf
+                              $mod->{sign} =~ /NaN|inf/);   # NaN, -inf, +inf
 
     # Modulo zero. See documentation for Math::BigInt's bmod() method.
 
     if ($mod -> is_zero()) {
         if ($num -> is_zero()) {
-            return $class -> bnan();
+            return $class -> bnan(@r);
         } else {
-            return $num -> copy();
+            return $num -> copy(@r);
         }
     }
 
+    return $upgrade -> bmodinv($num, $exp, $mod, @r)
+      if defined($upgrade) && (!$num -> isa($class) ||
+                               !$exp -> isa($class) ||
+                               !$mod -> ($class));
+
     # Compute 'a (mod m)', ignoring the signs on 'a' and 'm'. If the resulting
     # value is zero, the output is also zero, regardless of the signs on 'a' and
     # 'm'.
@@ -2438,62 +2630,60 @@ sub bpow {
     # modifies first argument
 
     # set up parameters
-    my ($class, $x, $y, @r) = (ref($_[0]), @_);
-    # objectify is costly, so avoid it
-    if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) {
-        ($class, $x, $y, @r) = objectify(2, @_);
-    }
+    my ($class, $x, $y, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+                            ? (ref($_[0]), @_)
+                            : objectify(2, @_);
 
     return $x if $x -> modify('bpow');
 
     # $x and/or $y is a NaN
-    return $x -> bnan() if $x -> is_nan() || $y -> is_nan();
+    return $x -> bnan(@r) if $x -> is_nan() || $y -> is_nan();
 
     # $x and/or $y is a +/-Inf
     if ($x -> is_inf("-")) {
-        return $x -> bzero()   if $y -> is_negative();
-        return $x -> bnan()    if $y -> is_zero();
-        return $x            if $y -> is_odd();
-        return $x -> bneg();
+        return $x -> bzero(@r)      if $y -> is_negative();
+        return $x -> bnan(@r)       if $y -> is_zero();
+        return $x -> round(@r)      if $y -> is_odd();
+        return $x -> bneg(@r);
     } elsif ($x -> is_inf("+")) {
-        return $x -> bzero()   if $y -> is_negative();
-        return $x -> bnan()    if $y -> is_zero();
-        return $x;
+        return $x -> bzero(@r)      if $y -> is_negative();
+        return $x -> bnan(@r)       if $y -> is_zero();
+        return $x -> round(@r);
     } elsif ($y -> is_inf("-")) {
-        return $x -> bnan()    if $x -> is_one("-");
-        return $x -> binf("+") if $x -> is_zero();
-        return $x -> bone()    if $x -> is_one("+");
-        return $x -> bzero();
+        return $x -> bnan(@r)       if $x -> is_one("-");
+        return $x -> binf("+", @r)  if $x -> is_zero();
+        return $x -> bone(@r)       if $x -> is_one("+");
+        return $x -> bzero(@r);
     } elsif ($y -> is_inf("+")) {
-        return $x -> bnan()    if $x -> is_one("-");
-        return $x -> bzero()   if $x -> is_zero();
-        return $x -> bone()    if $x -> is_one("+");
-        return $x -> binf("+");
+        return $x -> bnan(@r)       if $x -> is_one("-");
+        return $x -> bzero(@r)      if $x -> is_zero();
+        return $x -> bone(@r)       if $x -> is_one("+");
+        return $x -> binf("+", @r);
     }
 
     if ($x -> is_zero()) {
-        return $x -> bone() if $y -> is_zero();
-        return $x -> binf() if $y -> is_negative();
-        return $x;
+        return $x -> bone(@r) if $y -> is_zero();
+        return $x -> binf(@r) if $y -> is_negative();
+        return $x -> round(@r);
     }
 
     if ($x -> is_one("+")) {
-        return $x;
+        return $x -> round(@r);
     }
 
     if ($x -> is_one("-")) {
-        return $x if $y -> is_odd();
-        return $x -> bneg();
+        return $x -> round(@r) if $y -> is_odd();
+        return $x -> bneg(@r);
     }
 
-    # We don't support finite non-integers, so upgrade or return zero. The
-    # reason for returning zero, not NaN, is that all output is in the open
-    # interval (0,1), and truncating that to integer gives zero.
+    return $upgrade -> bpow($x, $y, @r) if defined $upgrade;
+
+    # We don't support finite non-integers, so return zero. The reason for
+    # returning zero, not NaN, is that all output is in the open interval (0,1),
+    # and truncating that to integer gives zero.
 
     if ($y->{sign} eq '-' || !$y -> isa($class)) {
-        return $upgrade -> bpow($upgrade -> new($x), $y, @r)
-          if defined $upgrade;
-        return $x -> bzero();
+        return $x -> bzero(@r);
     }
 
     $r[3] = $y;                 # no push!
@@ -2513,12 +2703,12 @@ sub blog {
     # Don't objectify the base, since an undefined base, as in $x->blog() or
     # $x->blog(undef) signals that the base is Euler's number.
 
-    if (!ref($_[0]) && $_[0] =~ /^[A-Za-z]|::/) {
+    if (!ref($_[0]) && $_[0] =~ /^[a-z]\w*(?:::[a-z]\w*)*$/i) {
         # E.g., Math::BigInt->blog(256, 2)
         ($class, $x, $base, @r) =
           defined $_[2] ? objectify(2, @_) : objectify(1, @_);
     } else {
-        # E.g., Math::BigInt::blog(256, 2) or $x->blog(2)
+        # E.g., $x->blog(2) or the deprecated Math::BigInt::blog(256, 2)
         ($class, $x, $base, @r) =
           defined $_[1] ? objectify(2, @_) : objectify(1, @_);
     }
@@ -2528,80 +2718,70 @@ sub blog {
     # Handle all exception cases and all trivial cases. I have used Wolfram
     # Alpha (http://www.wolframalpha.com) as the reference for these cases.
 
-    return $x -> bnan() if $x -> is_nan();
+    return $x -> bnan(@r) if $x -> is_nan();
 
     if (defined $base) {
         $base = $class -> new($base) unless ref $base;
         if ($base -> is_nan() || $base -> is_one()) {
-            return $x -> bnan();
+            return $x -> bnan(@r);
         } elsif ($base -> is_inf() || $base -> is_zero()) {
-            return $x -> bnan() if $x -> is_inf() || $x -> is_zero();
-            return $x -> bzero();
-        } elsif ($base -> is_negative()) {        # -inf < base < 0
-            return $x -> bzero() if $x -> is_one(); #     x = 1
-            return $x -> bone()  if $x == $base;    #     x = base
-            return $x -> bnan();                    #     otherwise
+            return $x -> bnan(@r) if $x -> is_inf() || $x -> is_zero();
+            return $x -> bzero(@r);
+        } elsif ($base -> is_negative()) {              # -inf < base < 0
+            return $x -> bzero(@r) if $x -> is_one();   #     x = 1
+            return $x -> bone(@r)  if $x == $base;      #     x = base
+            return $x -> bnan(@r);                      #     otherwise
         }
-        return $x -> bone() if $x == $base; # 0 < base && 0 < x < inf
+        return $x -> bone(@r) if $x == $base;   # 0 < base && 0 < x < inf
     }
 
     # We now know that the base is either undefined or >= 2 and finite.
 
-    return $x -> binf('+') if $x -> is_inf(); #   x = +/-inf
-    return $x -> bnan()    if $x -> is_neg(); #   -inf < x < 0
-    return $x -> bzero()   if $x -> is_one(); #   x = 1
-    return $x -> binf('-') if $x -> is_zero(); #   x = 0
+    return $x -> binf('+', @r) if $x -> is_inf();       #   x = +/-inf
+    return $x -> bnan(@r)      if $x -> is_neg();       #   -inf < x < 0
+    return $x -> bzero(@r)     if $x -> is_one();       #   x = 1
+    return $x -> binf('-', @r) if $x -> is_zero();      #   x = 0
 
     # At this point we are done handling all exception cases and trivial cases.
 
-    return $upgrade -> blog($upgrade -> new($x), $base, @r) if defined $upgrade;
+    return $upgrade -> blog($x, $base, @r) if defined $upgrade;
 
     # fix for bug #24969:
     # the default base is e (Euler's number) which is not an integer
     if (!defined $base) {
         require Math::BigFloat;
-        my $u = Math::BigFloat->blog(Math::BigFloat->new($x))->as_int();
+        my $u = Math::BigFloat->blog($x)->as_int();
         # modify $x in place
         $x->{value} = $u->{value};
         $x->{sign} = $u->{sign};
-        return $x;
+        return $x -> round(@r);
     }
 
     my ($rc) = $LIB->_log_int($x->{value}, $base->{value});
-    return $x->bnan() unless defined $rc; # not possible to take log?
+    return $x->bnan(@r) unless defined $rc; # not possible to take log?
     $x->{value} = $rc;
-    $x->round(@r);
+    $x = $x -> round(@r);
 }
 
 sub bexp {
     # Calculate e ** $x (Euler's number to the power of X), truncated to
     # an integer value.
     my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
     return $x if $x->modify('bexp');
 
     # inf, -inf, NaN, <0 => NaN
-    return $x->bnan() if $x->{sign} eq 'NaN';
-    return $x->bone() if $x->is_zero();
-    return $x if $x->{sign} eq '+inf';
-    return $x->bzero() if $x->{sign} eq '-inf';
+    return $x -> bnan(@r)  if $x->{sign} eq 'NaN';
+    return $x -> bone(@r)  if $x->is_zero();
+    return $x -> round(@r) if $x->{sign} eq '+inf';
+    return $x -> bzero(@r) if $x->{sign} eq '-inf';
 
-    my $u;
-    {
-        # run through Math::BigFloat unless told otherwise
-        require Math::BigFloat unless defined $upgrade;
-        local $upgrade = 'Math::BigFloat' unless defined $upgrade;
-        # calculate result, truncate it to integer
-        $u = $upgrade->bexp($upgrade->new($x), @r);
-    }
+    return $upgrade -> bexp($x, @r) if defined $upgrade;
 
-    if (defined $upgrade) {
-        $x = $u;
-    } else {
-        $u = $u->as_int();
-        # modify $x in place
-        $x->{value} = $u->{value};
-        $x->round(@r);
-    }
+    require Math::BigFloat;
+    my $tmp = Math::BigFloat -> bexp($x, @r) -> as_int();
+    $x->{value} = $tmp->{value};
+    return $x -> round(@r);
 }
 
 sub bnok {
@@ -2609,49 +2789,51 @@ sub bnok {
     # integer.
 
     # Set up parameters.
-    my ($self, $n, $k, @r) = (ref($_[0]), @_);
+    my ($class, $n, $k, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+                            ? (ref($_[0]), @_)
+                            : objectify(2, @_);
 
-    # Objectify is costly, so avoid it.
-    if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) {
-        ($self, $n, $k, @r) = objectify(2, @_);
-    }
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
 
     return $n if $n->modify('bnok');
 
     # All cases where at least one argument is NaN.
 
-    return $n->bnan() if $n->{sign} eq 'NaN' || $k->{sign} eq 'NaN';
+    return $n->bnan(@r) if $n->{sign} eq 'NaN' || $k->{sign} eq 'NaN';
 
     # All cases where at least one argument is +/-inf.
 
     if ($n -> is_inf()) {
         if ($k -> is_inf()) {                   # bnok(+/-inf,+/-inf)
-            return $n -> bnan();
+            return $n -> bnan(@r);
         } elsif ($k -> is_neg()) {              # bnok(+/-inf,k), k < 0
-            return $n -> bzero();
+            return $n -> bzero(@r);
         } elsif ($k -> is_zero()) {             # bnok(+/-inf,k), k = 0
-            return $n -> bone();
+            return $n -> bone(@r);
         } else {
-            if ($n -> is_inf("+")) {            # bnok(+inf,k), 0 < k < +inf
+            if ($n -> is_inf("+", @r)) {        # bnok(+inf,k), 0 < k < +inf
                 return $n -> binf("+");
             } else {                            # bnok(-inf,k), k > 0
                 my $sign = $k -> is_even() ? "+" : "-";
-                return $n -> binf($sign);
+                return $n -> binf($sign, @r);
             }
         }
     }
 
     elsif ($k -> is_inf()) {            # bnok(n,+/-inf), -inf <= n <= inf
-        return $n -> bnan();
+        return $n -> bnan(@r);
     }
 
     # At this point, both n and k are real numbers.
 
+    return $upgrade -> bnok($n, $k, @r)
+      if defined($upgrade) && (!$n -> isa($class) || !$k -> isa($class));
+
     my $sign = 1;
 
     if ($n >= 0) {
         if ($k < 0 || $k > $n) {
-            return $n -> bzero();
+            return $n -> bzero(@r);
         }
     } else {
 
@@ -2660,7 +2842,7 @@ sub bnok {
             # n < 0 and k >= 0: bnok(n,k) = (-1)^k * bnok(-n+k-1,k)
 
             $sign = (-1) ** $k;
-            $n -> bneg() -> badd($k) -> bdec();
+            $n = $n -> bneg() -> badd($k) -> bdec();
 
         } elsif ($k <= $n) {
 
@@ -2668,22 +2850,22 @@ sub bnok {
 
             $sign = (-1) ** ($n - $k);
             my $x0 = $n -> copy();
-            $n -> bone() -> badd($k) -> bneg();
+            $n = $n -> bone() -> badd($k) -> bneg();
             $k = $k -> copy();
-            $k -> bneg() -> badd($x0);
+            $k = $k -> bneg() -> badd($x0);
 
         } else {
 
             # n < 0 and n < k < 0:
 
-            return $n -> bzero();
+            return $n -> bzero(@r);
         }
     }
 
     $n->{value} = $LIB->_nok($n->{value}, $k->{value});
-    $n -> bneg() if $sign == -1;
+    $n = $n -> bneg() if $sign == -1;
 
-    $n->round(@r);
+    $n -> round(@r);
 }
 
 sub buparrow {
@@ -2796,9 +2978,9 @@ sub ackermann {
         } elsif ($m == $three) {
             $n = $class -> bone() -> blsft($n + $three) -> bsub($three);
         } elsif ($m == $two) {
-            $n -> bmul($two) -> badd($three);
+            $n = $n -> bmul($two) -> badd($three);
         } elsif ($m >= 0) {
-            $n -> badd($m) -> binc();
+            $n = $n -> badd($m) -> binc();
         } else {
             die "negative m!";
         }
@@ -2807,109 +2989,102 @@ sub ackermann {
 }
 
 sub bsin {
-    # Calculate sinus(x) to N digits. Unless upgrading is in effect, returns the
+    # Calculate sin(x) to N digits. Unless upgrading is in effect, returns the
     # result truncated to an integer.
-    my ($class, $x, @r) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
 
     return $x if $x->modify('bsin');
 
-    return $x->bnan() if $x->{sign} !~ /^[+-]\z/; # -inf +inf or NaN => NaN
+    return $x->bnan(@r) if $x->{sign} !~ /^[+-]\z/; # -inf +inf or NaN => NaN
+    return $x->bzero(@r) if $x->is_zero();
 
-    return $upgrade -> bsin($upgrade -> new($x, @r)) if defined $upgrade;
+    return $upgrade -> bsin($x, @r) if defined $upgrade;
 
     require Math::BigFloat;
     # calculate the result and truncate it to integer
     my $t = Math::BigFloat->new($x)->bsin(@r)->as_int();
 
-    $x->bone() if $t->is_one();
-    $x->bzero() if $t->is_zero();
+    $x = $x->bone(@r)  if $t->is_one();
+    $x = $x->bzero(@r) if $t->is_zero();
     $x->round(@r);
 }
 
 sub bcos {
-    # Calculate cosinus(x) to N digits. Unless upgrading is in effect, returns the
+    # Calculate cos(x) to N digits. Unless upgrading is in effect, returns the
     # result truncated to an integer.
-    my ($class, $x, @r) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
 
     return $x if $x->modify('bcos');
 
-    return $x->bnan() if $x->{sign} !~ /^[+-]\z/; # -inf +inf or NaN => NaN
+    return $x->bnan(@r) if $x->{sign} !~ /^[+-]\z/; # -inf +inf or NaN => NaN
+    return $x->bone(@r) if $x->is_zero();
 
-    return $upgrade -> bcos($upgrade -> new($x), @r) if defined $upgrade;
+    return $upgrade -> bcos($x, @r) if defined $upgrade;
 
     require Math::BigFloat;
-    # calculate the result and truncate it to integer
-    my $t = Math::BigFloat -> bcos(Math::BigFloat -> new($x), @r) -> as_int();
-
-    $x->bone() if $t->is_one();
-    $x->bzero() if $t->is_zero();
-    $x->round(@r);
+    my $tmp = Math::BigFloat -> bcos($x, @r) -> as_int();
+    $x->{value} = $tmp->{value};
+    return $x -> round(@r);
 }
 
 sub batan {
-    # Calculate arcus tangens of x to N digits. Unless upgrading is in effect, returns the
-    # result truncated to an integer.
-    my ($class, $x, @r) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
+    # Calculate arctan(x) to N digits. Unless upgrading is in effect, returns
+    # the result truncated to an integer.
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
 
     return $x if $x->modify('batan');
 
-    return $x->bnan() if $x->{sign} !~ /^[+-]\z/; # -inf +inf or NaN => NaN
+    return $x -> bnan(@r)  if $x -> is_nan();
+    return $x -> bzero(@r) if $x -> is_zero();
 
-    return $upgrade->new($x)->batan(@r) if defined $upgrade;
+    return $upgrade -> batan($x, @r) if defined $upgrade;
 
-    # calculate the result and truncate it to integer
-    my $tmp = Math::BigFloat->new($x)->batan(@r);
+    return $x -> bone("+", @r) if $x -> bgt("1");
+    return $x -> bone("-", @r) if $x -> blt("-1");
 
-    $x->{value} = $LIB->_new($tmp->as_int()->bstr());
-    $x->round(@r);
+    $x -> bzero(@r);
 }
 
 sub batan2 {
     # calculate arcus tangens of ($y/$x)
 
-    # set up parameters
-    my ($class, $y, $x, @r) = (ref($_[0]), @_);
-    # objectify is costly, so avoid it
-    if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) {
-        ($class, $y, $x, @r) = objectify(2, @_);
-    }
+    my ($class, $y, $x, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+                            ? (ref($_[0]), @_) : objectify(2, @_);
 
     return $y if $y->modify('batan2');
 
     return $y->bnan() if ($y->{sign} eq $nan) || ($x->{sign} eq $nan);
 
+    return $upgrade->batan2($y, $x, @r) if defined $upgrade;
+
     # Y    X
     # != 0 -inf result is +- pi
     if ($x->is_inf() || $y->is_inf()) {
-        # upgrade to Math::BigFloat etc.
-        return $upgrade->new($y)->batan2($upgrade->new($x), @r) if defined $upgrade;
         if ($y->is_inf()) {
             if ($x->{sign} eq '-inf') {
                 # calculate 3 pi/4 => 2.3.. => 2
-                $y->bone(substr($y->{sign}, 0, 1));
-                $y->bmul($class->new(2));
+                $y = $y->bone(substr($y->{sign}, 0, 1));
+                $y = $y->bmul($class->new(2));
             } elsif ($x->{sign} eq '+inf') {
                 # calculate pi/4 => 0.7 => 0
-                $y->bzero();
+                $y = $y->bzero();
             } else {
                 # calculate pi/2 => 1.5 => 1
-                $y->bone(substr($y->{sign}, 0, 1));
+                $y = $y->bone(substr($y->{sign}, 0, 1));
             }
         } else {
             if ($x->{sign} eq '+inf') {
                 # calculate pi/4 => 0.7 => 0
-                $y->bzero();
+                $y = $y->bzero();
             } else {
                 # PI => 3.1415.. => 3
-                $y->bone(substr($y->{sign}, 0, 1));
-                $y->bmul($class->new(3));
+                $y = $y->bone(substr($y->{sign}, 0, 1));
+                $y = $y->bmul($class->new(3));
             }
         }
         return $y;
     }
 
-    return $upgrade->new($y)->batan2($upgrade->new($x), @r) if defined $upgrade;
-
     require Math::BigFloat;
     my $r = Math::BigFloat->new($y)
       ->batan2(Math::BigFloat->new($x), @r)
@@ -2918,17 +3093,17 @@ sub batan2 {
     $x->{value} = $r->{value};
     $x->{sign} = $r->{sign};
 
-    $x;
+    $x->round(@r);
 }
 
 sub bsqrt {
     # calculate square root of $x
-    my ($class, $x, @r) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
 
     return $x if $x->modify('bsqrt');
 
-    return $x->bnan() if $x->{sign} !~ /^\+/; # -x or -inf or NaN => NaN
-    return $x if $x->{sign} eq '+inf';        # sqrt(+inf) == inf
+    return $x->bnan(@r)  if $x->{sign} !~ /^\+/;    # -x or -inf or NaN => NaN
+    return $x->round(@r) if $x->{sign} eq '+inf';   # sqrt(+inf) == inf
 
     return $upgrade->bsqrt($x, @r) if defined $upgrade;
 
@@ -2940,25 +3115,22 @@ sub broot {
     # calculate $y'th root of $x
 
     # set up parameters
-    my ($class, $x, $y, @r) = (ref($_[0]), @_);
 
-    $y = $class->new(2) unless defined $y;
+    my ($class, $x, $y, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+                            ? (ref($_[0]), @_) : objectify(2, @_);
 
-    # objectify is costly, so avoid it
-    if ((!ref($x)) || (ref($x) ne ref($y))) {
-        ($class, $x, $y, @r) = objectify(2, $class || $class, @_);
-    }
+    $y = $class->new(2) unless defined $y;
 
     return $x if $x->modify('broot');
 
     # NaN handling: $x ** 1/0, x or y NaN, or y inf/-inf or y == 0
-    return $x->bnan() if $x->{sign} !~ /^\+/ || $y->is_zero() ||
-      $y->{sign} !~ /^\+$/;
+    return $x->bnan(@r) if $x->{sign} !~ /^\+/ || $y->is_zero() ||
+                           $y->{sign} !~ /^\+$/;
 
     return $x->round(@r)
       if $x->is_zero() || $x->is_one() || $x->is_inf() || $y->is_one();
 
-    return $upgrade->new($x)->broot($upgrade->new($y), @r) if defined $upgrade;
+    return $upgrade->broot($x, $y, @r) if defined $upgrade;
 
     $x->{value} = $LIB->_root($x->{value}, $y->{value});
     $x->round(@r);
@@ -2967,10 +3139,14 @@ sub broot {
 sub bfac {
     # (BINT or num_str, BINT or num_str) return BINT
     # compute factorial number from $x, modify $x in place
-    my ($class, $x, @r) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
 
     return $x if $x->modify('bfac') || $x->{sign} eq '+inf'; # inf => inf
-    return $x->bnan() if $x->{sign} ne '+'; # NaN, <0 => NaN
+
+    return $x->bnan(@r) if $x->{sign} ne '+'; # NaN, <0 => NaN
+
+    return $upgrade -> bfac($x, @r)
+      if defined($upgrade) && !$x -> isa($class);
 
     $x->{value} = $LIB->_fac($x->{value});
     $x->round(@r);
@@ -2978,11 +3154,15 @@ sub bfac {
 
 sub bdfac {
     # compute double factorial, modify $x in place
-    my ($class, $x, @r) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
 
     return $x if $x->modify('bdfac') || $x->{sign} eq '+inf'; # inf => inf
-    return $x->bnan() if $x->is_nan() || $x <= -2;
-    return $x->bone() if $x <= 1;
+
+    return $x->bnan(@r) if $x->is_nan() || $x <= -2;
+    return $x->bone(@r) if $x <= 1;
+
+    return $upgrade -> bdfac($x, @r)
+      if defined($upgrade) && !$x -> isa($class);
 
     croak("bdfac() requires a newer version of the $LIB library.")
         unless $LIB->can('_dfac');
@@ -2993,57 +3173,67 @@ sub bdfac {
 
 sub btfac {
     # compute triple factorial, modify $x in place
-    my ($class, $x, @r) = objectify(1, @_);
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
 
     return $x if $x->modify('btfac') || $x->{sign} eq '+inf'; # inf => inf
 
-    return $x->bnan() if $x->is_nan();
+    return $x->bnan(@r) if $x->is_nan();
+
+    return $upgrade -> btfac($x, @r) if defined($upgrade) && !$x -> isa($class);
 
     my $k = $class -> new("3");
-    return $x->bnan() if $x <= -$k;
+    return $x->bnan(@r) if $x <= -$k;
 
     my $one = $class -> bone();
-    return $x->bone() if $x <= $one;
+    return $x->bone(@r) if $x <= $one;
 
     my $f = $x -> copy();
     while ($f -> bsub($k) > $one) {
-        $x -> bmul($f);
+        $x = $x -> bmul($f);
     }
     $x->round(@r);
 }
 
 sub bmfac {
     # compute multi-factorial
-    my ($class, $x, $k, @r) = objectify(2, @_);
+
+    my ($class, $x, $k, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+                            ? (ref($_[0]), @_) : objectify(2, @_);
 
     return $x if $x->modify('bmfac') || $x->{sign} eq '+inf';
-    return $x->bnan() if $x->is_nan() || $k->is_nan() || $k < 1 || $x <= -$k;
+    return $x->bnan(@r) if $x->is_nan() || $k->is_nan() || $k < 1 || $x <= -$k;
+
+    return $upgrade -> bmfac($x, $k, @r)
+      if defined($upgrade) && !$x -> isa($class);
 
     my $one = $class -> bone();
-    return $x->bone() if $x <= $one;
+    return $x->bone(@r) if $x <= $one;
 
     my $f = $x -> copy();
     while ($f -> bsub($k) > $one) {
-        $x -> bmul($f);
+        $x = $x -> bmul($f);
     }
     $x->round(@r);
 }
 
 sub bfib {
     # compute Fibonacci number(s)
-    my ($class, $x, @r) = objectify(1, @_);
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
 
     croak("bfib() requires a newer version of the $LIB library.")
         unless $LIB->can('_fib');
 
     return $x if $x->modify('bfib');
 
+    return $upgrade -> bfib($x, @r)
+      if defined($upgrade) && !$x -> isa($class);
+
     # List context.
 
     if (wantarray) {
-        return () if $x ->  is_nan();
+        return () if $x -> is_nan();
         croak("bfib() can't return an infinitely long list of numbers")
-            if $x -> is_inf();
+          if $x -> is_inf();
 
         # Use the backend library to compute the first $x Fibonacci numbers.
 
@@ -3053,7 +3243,7 @@ sub bfib {
         # invocand.
 
         for (my $i = 0 ; $i < $#values ; ++ $i) {
-            my $fib =  $class -> bzero();
+            my $fib = $class -> bzero();
             $fib -> {value} = $values[$i];
             $values[$i] = $fib;
         }
@@ -3087,13 +3277,16 @@ sub bfib {
 
 sub blucas {
     # compute Lucas number(s)
-    my ($class, $x, @r) = objectify(1, @_);
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
 
     croak("blucas() requires a newer version of the $LIB library.")
         unless $LIB->can('_lucas');
 
     return $x if $x->modify('blucas');
 
+    return $upgrade -> blucas($x, @r)
+      if defined($upgrade) && !$x -> isa($class);
+
     # List context.
 
     if (wantarray) {
@@ -3164,8 +3357,19 @@ sub blsft {
     return $x -> bnan() if ($x -> {sign} !~ /^[+-]$/ ||
                             $y -> {sign} !~ /^[+-]$/);
     return $x -> round(@r) if $y -> is_zero();
+    return $x -> bzero(@r) if $x -> is_zero(); # 0 => 0
+
+    $b = 2 if !defined $b;
+    return $x -> bnan(@r) if $b <= 0 || $y -> {sign} eq '-';
+    $b = $class -> new($b) unless defined(blessed($b));
+
+    #return $upgrade -> blsft($x, $y, $b, @r)
+    #  if defined($upgrade) && (!$x -> isa($class) ||
+    #                           !$y -> isa($class) ||
+    #                           !$b -> isa($class));
 
-    $b = defined($b) ? $b -> numify() : 2;
+    # shift by a negative amount?
+    #return $x -> brsft($y -> copy() -> babs(), $b) if $y -> {sign} =~ /^-/;
 
     # While some of the libraries support an arbitrarily large base, not all of
     # them do, so rather than returning an incorrect result in those cases,
@@ -3174,6 +3378,8 @@ sub blsft {
     my $uintmax = ~0;
     croak("Base is too large.") if $b > $uintmax;
 
+    $b = $b -> numify();
+
     return $x -> bnan() if $b <= 0 || $y -> {sign} eq '-';
 
     $x -> {value} = $LIB -> _lsft($x -> {value}, $y -> {value}, $b);
@@ -3184,21 +3390,48 @@ sub brsft {
     # (BINT or num_str, BINT or num_str) return BINT
     # compute x >> y, base n, y >= 0
 
-    # set up parameters
     my ($class, $x, $y, $b, @r) = (ref($_[0]), @_);
 
-    # objectify is costly, so avoid it
-    if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) {
-        ($class, $x, $y, $b, @r) = objectify(2, @_);
+    # Objectify the base only when it is defined, since an undefined base, as
+    # in $x->blsft(3) or $x->blog(3, undef) means use the default base 2.
+
+    if (!ref($_[0]) && $_[0] =~ /^[A-Za-z]|::/) {
+        # E.g., Math::BigInt->blog(256, 5, 2)
+        ($class, $x, $y, $b, @r) =
+          defined $_[3] ? objectify(3, @_) : objectify(2, @_);
+    } else {
+        # E.g., Math::BigInt::blog(256, 5, 2) or $x->blog(5, 2)
+        ($class, $x, $y, $b, @r) =
+          defined $_[2] ? objectify(3, @_) : objectify(2, @_);
     }
 
     return $x if $x -> modify('brsft');
-    return $x -> bnan() if ($x -> {sign} !~ /^[+-]$/ || $y -> {sign} !~ /^[+-]$/);
+    return $x -> bnan(@r)  if $x -> {sign} !~ /^[+-]$/ ||
+                              $y -> {sign} !~ /^[+-]$/;
     return $x -> round(@r) if $y -> is_zero();
     return $x -> bzero(@r) if $x -> is_zero(); # 0 => 0
 
     $b = 2 if !defined $b;
-    return $x -> bnan() if $b <= 0 || $y -> {sign} eq '-';
+    return $x -> bnan(@r) if $b <= 0 || $y -> {sign} eq '-';
+    $b = $class -> new($b) unless defined(blessed($b));
+
+    # Shifting right by a positive amount might lead to a non-integer result, so
+    # include this case in the test.
+
+    return $upgrade -> brsft($x, $y, $b, @r)
+      if defined($upgrade) && (!$x -> isa($class) ||
+                               !$y -> isa($class) ||
+                               !$b -> isa($class) ||
+                               $y -> is_pos());
+
+    # While some of the libraries support an arbitrarily large base, not all of
+    # them do, so rather than returning an incorrect result in those cases,
+    # disallow bases that don't work with all libraries.
+
+    my $uintmax = ~0;
+    croak("Base is too large.") if $b > $uintmax;
+
+    $b = $b -> numify();
 
     # this only works for negative numbers when shifting in base 2
     if (($x -> {sign} eq '-') && ($b == 2)) {
@@ -3209,7 +3442,7 @@ sub brsft {
             # shift...
             # if $y != 1, we must simulate it by doing:
             # convert to bin, flip all bits, shift, and be done
-            $x -> binc();           # -3 => -2
+            $x = $x -> binc();           # -3 => -2
             my $bin = $x -> as_bin();
             $bin =~ s/^-0b//;       # strip '-0b' prefix
             $bin =~ tr/10/01/;      # flip bits
@@ -3225,13 +3458,13 @@ sub brsft {
                 $bin =~ tr/10/01/;  # flip bits back
             }
             my $res = $class -> new('0b' . $bin); # add prefix and convert back
-            $res -> binc();                       # remember to increment
+            $res = $res -> binc();                       # remember to increment
             $x -> {value} = $res -> {value};      # take over value
             return $x -> round(@r); # we are done now, magic, isn't?
         }
 
         # x < 0, n == 2, y == 1
-        $x -> bdec();           # n == 2, but $y == 1: this fixes it
+        $x = $x -> bdec();           # n == 2, but $y == 1: this fixes it
     }
 
     $x -> {value} = $LIB -> _rsft($x -> {value}, $y -> {value}, $b);
@@ -3246,18 +3479,18 @@ sub band {
     #(BINT or num_str, BINT or num_str) return BINT
     # compute x & y
 
-    # set up parameters
-    my ($class, $x, $y, @r) = (ref($_[0]), @_);
-    # objectify is costly, so avoid it
-    if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) {
-        ($class, $x, $y, @r) = objectify(2, @_);
-    }
+    my ($class, $x, $y, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+                            ? (ref($_[0]), @_) : objectify(2, @_);
 
     return $x if $x->modify('band');
 
+    return $upgrade -> band($x, $y, @r)
+      if defined($upgrade) && (!$x -> isa($class) ||
+                               !$y -> isa($class));
+
     $r[3] = $y;                 # no push!
 
-    return $x->bnan() if ($x->{sign} !~ /^[+-]$/ || $y->{sign} !~ /^[+-]$/);
+    return $x->bnan(@r) if $x->{sign} !~ /^[+-]$/ || $y->{sign} !~ /^[+-]$/;
 
     if ($x->{sign} eq '+' && $y->{sign} eq '+') {
         $x->{value} = $LIB->_and($x->{value}, $y->{value});
@@ -3272,15 +3505,15 @@ sub bior {
     #(BINT or num_str, BINT or num_str) return BINT
     # compute x | y
 
-    # set up parameters
-    my ($class, $x, $y, @r) = (ref($_[0]), @_);
-    # objectify is costly, so avoid it
-    if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) {
-        ($class, $x, $y, @r) = objectify(2, @_);
-    }
+    my ($class, $x, $y, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+                            ? (ref($_[0]), @_) : objectify(2, @_);
 
     return $x if $x->modify('bior');
 
+    return $upgrade -> bior($x, $y, @r)
+      if defined($upgrade) && (!$x -> isa($class) ||
+                               !$y -> isa($class));
+
     $r[3] = $y;                 # no push!
 
     return $x->bnan() if ($x->{sign} !~ /^[+-]$/ || $y->{sign} !~ /^[+-]$/);
@@ -3298,18 +3531,18 @@ sub bxor {
     #(BINT or num_str, BINT or num_str) return BINT
     # compute x ^ y
 
-    # set up parameters
-    my ($class, $x, $y, @r) = (ref($_[0]), @_);
-    # objectify is costly, so avoid it
-    if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) {
-        ($class, $x, $y, @r) = objectify(2, @_);
-    }
+    my ($class, $x, $y, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+                            ? (ref($_[0]), @_) : objectify(2, @_);
 
     return $x if $x->modify('bxor');
 
+    return $upgrade -> bxor($x, $y, @r)
+      if defined($upgrade) && (!$x -> isa($class) ||
+                               !$y -> isa($class));
+
     $r[3] = $y;                 # no push!
 
-    return $x->bnan() if ($x->{sign} !~ /^[+-]$/ || $y->{sign} !~ /^[+-]$/);
+    return $x->bnan(@r) if $x->{sign} !~ /^[+-]$/ || $y->{sign} !~ /^[+-]$/;
 
     if ($x->{sign} eq '+' && $y->{sign} eq '+') {
         $x->{value} = $LIB->_xor($x->{value}, $y->{value});
@@ -3323,11 +3556,14 @@ sub bxor {
 sub bnot {
     # (num_str or BINT) return BINT
     # represent ~x as twos-complement number
-    # we don't need $class, so undef instead of ref($_[0]) make it slightly faster
-    my ($class, $x) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
 
     return $x if $x->modify('bnot');
-    $x->binc()->bneg();         # binc already does round
+
+    return $upgrade -> bnot($x, @r)
+      if defined($upgrade) && !$x -> isa($class);
+
+    $x -> binc() -> bneg(@r);
 }
 
 ###############################################################################
@@ -3338,22 +3574,39 @@ sub round {
     # Round $self according to given parameters, or given second argument's
     # parameters or global defaults
 
-    # for speed reasons, _find_round_parameters is embedded here:
+    my ($class, $self, @args) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+    # $x->round(undef, undef) signals no rounding
+
+    if (@args >= 2 && @args <= 3 && !defined($args[0]) && !defined($args[1])) {
+        $self->{_a} = undef;
+        $self->{_p} = undef;
+        return $self;
+    }
+
+    my ($a, $p, $r) = splice @args, 0, 3;
 
-    my ($self, $a, $p, $r, @args) = @_;
     # $a accuracy, if given by caller
     # $p precision, if given by caller
     # $r round_mode, if given by caller
     # @args all 'other' arguments (0 for unary, 1 for binary ops)
 
-    my $class = ref($self);       # find out class of argument(s)
-    no strict 'refs';
+    if (defined $a) {
+        croak "accuracy must be a number, not '$a'"
+          unless $a =~/^[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:[Ee][+-]?\d+)?\z/;
+    }
+
+    if (defined $p) {
+        croak "precision must be a number, not '$p'"
+          unless $p =~/^[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:[Ee][+-]?\d+)?\z/;
+    }
 
     # now pick $a or $p, but only if we have got "arguments"
     if (!defined $a) {
         foreach ($self, @args) {
             # take the defined one, or if both defined, the one that is smaller
-            $a = $_->{_a} if (defined $_->{_a}) && (!defined $a || $_->{_a} < $a);
+            $a = $_->{_a}
+              if (defined $_->{_a}) && (!defined $a || $_->{_a} < $a);
         }
     }
     if (!defined $p) {
@@ -3361,10 +3614,13 @@ sub round {
         foreach ($self, @args) {
             # take the defined one, or if both defined, the one that is bigger
             # -2 > -3, and 3 > 2
-            $p = $_->{_p} if (defined $_->{_p}) && (!defined $p || $_->{_p} > $p);
+            $p = $_->{_p}
+              if (defined $_->{_p}) && (!defined $p || $_->{_p} > $p);
         }
     }
 
+    no strict 'refs';
+
     # if still none defined, use globals
     unless (defined $a || defined $p) {
         $a = ${"$class\::accuracy"};
@@ -3387,9 +3643,11 @@ sub round {
 
     # now round, by calling either bround or bfround:
     if (defined $a) {
-        $self->bround(int($a), $r) if !defined $self->{_a} || $self->{_a} >= $a;
+        $self = $self->bround(int($a), $r)
+          if !defined $self->{_a} || $self->{_a} >= $a;
     } else {                  # both can't be undefined due to early out
-        $self->bfround(int($p), $r) if !defined $self->{_p} || $self->{_p} <= $p;
+        $self = $self->bfround(int($p), $r)
+          if !defined $self->{_p} || $self->{_p} <= $p;
     }
 
     # bround() or bfround() already called bnorm() if nec.
@@ -3403,9 +3661,9 @@ sub bround {
     # and overwrite the rest with 0's, return normalized number
     # do not return $x->bnorm(), but $x
 
-    my $x = shift;
-    $x = __PACKAGE__->new($x) unless ref $x;
-    my ($scale, $mode) = $x->_scale_a(@_);
+    my ($class, $x, @a) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+    my ($scale, $mode) = $x->_scale_a(@a);
     return $x if !defined $scale || $x->modify('bround'); # no-op
 
     if ($x->is_zero() || $scale == 0) {
@@ -3417,8 +3675,8 @@ sub bround {
     # we have fewer digits than we want to scale to
     my $len = $x->length();
     # convert $scale to a scalar in case it is an object (put's a limit on the
-    # number length, but this would already limited by memory constraints), makes
-    # it faster
+    # number length, but this would already limited by memory constraints),
+    # makes it faster
     $scale = $scale->numify() if ref ($scale);
 
     # scale < 0, but > -len (not >=!)
@@ -3469,7 +3727,7 @@ sub bround {
         $xs =~ s/^0+(\d)/$1/;                  # "00000" -> "0"
         $put_back = 1;                         # need to put back
     } elsif ($pad > $len) {
-        $x->bzero();            # round to '0'
+        $x = $x->bzero();            # round to '0'
     }
 
     if ($round_up) {            # what gave test above?
@@ -3502,16 +3760,15 @@ sub bround {
 sub bfround {
     # precision: round to the $Nth digit left (+$n) or right (-$n) from the '.'
     # $n == 0 || $n == 1 => round to integer
-    my $x = shift;
-    my $class = ref($x) || $x;
-    $x = $class->new($x) unless ref $x;
 
-    my ($scale, $mode) = $x->_scale_p(@_);
+    my ($class, $x, @p) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+    my ($scale, $mode) = $x->_scale_p(@p);
 
     return $x if !defined $scale || $x->modify('bfround'); # no-op
 
     # no-op for Math::BigInt objects if $n <= 0
-    $x->bround($x->length()-$scale, $mode) if $scale > 0;
+    $x = $x->bround($x->length()-$scale, $mode) if $scale > 0;
 
     delete $x->{_a};            # delete to save memory
     $x->{_p} = $scale;          # store new _p
@@ -3528,21 +3785,30 @@ sub fround {
 
 sub bfloor {
     # round towards minus infinity; no-op since it's already integer
-    my ($class, $x, @r) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+    return $upgrade -> bfloor($x)
+      if defined($upgrade) && !$x -> isa($class);
 
     $x->round(@r);
 }
 
 sub bceil {
     # round towards plus infinity; no-op since it's already int
-    my ($class, $x, @r) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+    return $upgrade -> bceil($x)
+      if defined($upgrade) && !$x -> isa($class);
 
     $x->round(@r);
 }
 
 sub bint {
     # round towards zero; no-op since it's already integer
-    my ($class, $x, @r) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+    return $upgrade -> bint($x)
+      if defined($upgrade) && !$x -> isa($class);
 
     $x->round(@r);
 }
@@ -3556,8 +3822,30 @@ sub bgcd {
     # does not modify arguments, but returns new object
     # GCD -- Euclid's algorithm, variant C (Knuth Vol 3, pg 341 ff)
 
+    # Class::method(...) -> Class->method(...)
+    unless (@_ && (defined(blessed($_[0])) && $_[0] -> isa(__PACKAGE__) ||
+                   $_[0] =~ /^[a-z]\w*(?:::[a-z]\w*)*$/i))
+    {
+        #carp "Using ", (caller(0))[3], "() as a function is deprecated;",
+        #  " use is as a method instead";
+        unshift @_, __PACKAGE__;
+    }
+
     my ($class, @args) = objectify(0, @_);
 
+    # Upgrade?
+
+    if (defined $upgrade) {
+        my $do_upgrade = 0;
+        for my $arg (@args) {
+            unless ($arg -> isa($class)) {
+                $do_upgrade = 1;
+                last;
+            }
+        }
+        return $upgrade -> bgcd(@args) if $do_upgrade;
+    }
+
     my $x = shift @args;
     $x = ref($x) && $x -> isa($class) ? $x -> copy() : $class -> new($x);
 
@@ -3579,8 +3867,30 @@ sub blcm {
     # does not modify arguments, but returns new object
     # Least Common Multiple
 
+    # Class::method(...) -> Class->method(...)
+    unless (@_ && (defined(blessed($_[0])) && $_[0] -> isa(__PACKAGE__) ||
+                   $_[0] =~ /^[a-z]\w*(?:::[a-z]\w*)*$/i))
+    {
+        #carp "Using ", (caller(0))[3], "() as a function is deprecated;",
+        #  " use is as a method instead";
+        unshift @_, __PACKAGE__;
+    }
+
     my ($class, @args) = objectify(0, @_);
 
+    # Upgrade?
+
+    if (defined $upgrade) {
+        my $do_upgrade = 0;
+        for my $arg (@args) {
+            unless ($arg -> isa($class)) {
+                $do_upgrade = 1;
+                last;
+            }
+        }
+        return $upgrade -> blcm(@args) if $do_upgrade;
+    }
+
     my $x = shift @args;
     $x = ref($x) && $x -> isa($class) ? $x -> copy() : $class -> new($x);
     return $class->bnan() if $x->{sign} !~ /^[+-]$/;    # x NaN?
@@ -3601,14 +3911,18 @@ sub blcm {
 
 sub sign {
     # return the sign of the number: +/-/-inf/+inf/NaN
-    my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_);
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
 
     $x->{sign};
 }
 
 sub digit {
     # return the nth decimal digit, negative values count backward, 0 is right
-    my ($class, $x, $n) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
+    my (undef, $x, $n, @r) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
+
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
 
     $n = $n->numify() if ref($n);
     $LIB->_digit($x->{value}, $n || 0);
@@ -3616,7 +3930,9 @@ sub digit {
 
 sub bdigitsum {
     # like digitsum(), but assigns the result to the invocand
-    my $x = shift;
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
 
     return $x           if $x -> is_nan();
     return $x -> bnan() if $x -> is_inf();
@@ -3628,19 +3944,22 @@ sub bdigitsum {
 
 sub digitsum {
     # compute sum of decimal digits and return it
-    my $x = shift;
-    my $class = ref $x;
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
 
     return $class -> bnan() if $x -> is_nan();
     return $class -> bnan() if $x -> is_inf();
 
     my $y = $class -> bzero();
     $y -> {value} = $LIB -> _digitsum($x -> {value});
-    return $y;
+    $y -> round(@r);
 }
 
 sub length {
-    my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_);
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
 
     my $e = $LIB->_len($x->{value});
     wantarray ? ($e, 0) : $e;
@@ -3648,26 +3967,40 @@ sub length {
 
 sub exponent {
     # return a copy of the exponent (here always 0, NaN or 1 for $m == 0)
-    my ($class, $x) = ref($_[0]) ? (ref($_[0]), $_[0]) : objectify(1, @_);
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
+
+    # Upgrade?
+
+    return $upgrade -> exponent($x, @r)
+      if defined($upgrade) && !$x -> isa($class);
 
     if ($x->{sign} !~ /^[+-]$/) {
         my $s = $x->{sign};
         $s =~ s/^[+-]//; # NaN, -inf, +inf => NaN or inf
-        return $class->new($s);
+        return $class->new($s, @r);
     }
-    return $class->bzero() if $x->is_zero();
+    return $class->bzero(@r) if $x->is_zero();
 
     # 12300 => 2 trailing zeros => exponent is 2
-    $class->new($LIB->_zeros($x->{value}));
+    $class->new($LIB->_zeros($x->{value}), @r);
 }
 
-sub mantissa {
-    # return the mantissa (compatible to Math::BigFloat, e.g. reduced)
-    my ($class, $x) = ref($_[0]) ? (ref($_[0]), $_[0]) : objectify(1, @_);
+sub mantissa {
+    # return the mantissa (compatible to Math::BigFloat, e.g. reduced)
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
+
+    # Upgrade?
+
+    return $upgrade -> mantissa($x, @r)
+      if defined($upgrade) && !$x -> isa($class);
 
     if ($x->{sign} !~ /^[+-]$/) {
         # for NaN, +inf, -inf: keep the sign
-        return $class->new($x->{sign});
+        return $class->new($x->{sign}, @r);
     }
     my $m = $x->copy();
     delete $m->{_p};
@@ -3675,92 +4008,100 @@ sub mantissa {
 
     # that's a bit inefficient:
     my $zeros = $LIB->_zeros($m->{value});
-    $m->brsft($zeros, 10) if $zeros != 0;
-    $m;
+    $m = $m->brsft($zeros, 10) if $zeros != 0;
+    $m -> round(@r);
 }
 
 sub parts {
     # return a copy of both the exponent and the mantissa
-    my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_);
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
 
-    ($x->mantissa(), $x->exponent());
+    # Upgrade?
+
+    return $upgrade -> parts($x, @r)
+      if defined($upgrade) && !$x -> isa($class);
+
+    ($x->mantissa(@r), $x->exponent(@r));
 }
 
+# Parts used for scientific notation with significand/mantissa and exponent as
+# integers. E.g., "12345.6789" is returned as "123456789" (mantissa) and "-4"
+# (exponent).
+
 sub sparts {
-    my $self  = shift;
-    my $class = ref $self;
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
 
-    croak("sparts() is an instance method, not a class method")
-        unless $class;
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
 
     # Not-a-number.
 
-    if ($self -> is_nan()) {
-        my $mant = $self -> copy();             # mantissa
+    if ($x -> is_nan()) {
+        my $mant = $class -> bnan(@r);          # mantissa
         return $mant unless wantarray;          # scalar context
-        my $expo = $class -> bnan();            # exponent
+        my $expo = $class -> bnan(@r);          # exponent
         return ($mant, $expo);                  # list context
     }
 
     # Infinity.
 
-    if ($self -> is_inf()) {
-        my $mant = $self -> copy();             # mantissa
-        return $mant unless wantarray;          # scalar context
-        my $expo = $class -> binf('+');         # exponent
-        return ($mant, $expo);                  # list context
+    if ($x -> is_inf()) {
+        my $mant = $class -> binf($x->{sign}, @r);  # mantissa
+        return $mant unless wantarray;              # scalar context
+        my $expo = $class -> binf('+', @r);         # exponent
+        return ($mant, $expo);                      # list context
     }
 
+    # Upgrade?
+
+    return $upgrade -> sparts($x, @r)
+      if defined($upgrade) && !$x -> isa($class);
+
     # Finite number.
 
-    my $mant   = $self -> copy();
+    my $mant   = $x -> copy();
     my $nzeros = $LIB -> _zeros($mant -> {value});
 
-    $mant -> brsft($nzeros, 10) if $nzeros != 0;
+    $mant -> {value}
+      = $LIB -> _rsft($mant -> {value}, $LIB -> _new($nzeros), 10)
+        if $nzeros != 0;
     return $mant unless wantarray;
 
-    my $expo = $class -> new($nzeros);
+    my $expo = $class -> new($nzeros, @r);
     return ($mant, $expo);
 }
 
+# Parts used for normalized notation with significand/mantissa as either 0 or a
+# number in the semi-open interval [1,10). E.g., "12345.6789" is returned as
+# "1.23456789" and "4".
+
 sub nparts {
-    my $self  = shift;
-    my $class = ref $self;
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
 
-    croak("nparts() is an instance method, not a class method")
-        unless $class;
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
 
-    # Not-a-number.
+    # Not-a-Number and Infinity.
 
-    if ($self -> is_nan()) {
-        my $mant = $self -> copy();             # mantissa
-        return $mant unless wantarray;          # scalar context
-        my $expo = $class -> bnan();            # exponent
-        return ($mant, $expo);                  # list context
-    }
+    return $x -> sparts(@r) if $x -> is_nan() || $x -> is_inf();
 
-    # Infinity.
+    # Upgrade?
 
-    if ($self -> is_inf()) {
-        my $mant = $self -> copy();             # mantissa
-        return $mant unless wantarray;          # scalar context
-        my $expo = $class -> binf('+');         # exponent
-        return ($mant, $expo);                  # list context
-    }
+    return $upgrade -> nparts($x, @r)
+      if defined($upgrade) && !$x -> isa($class);
 
     # Finite number.
 
-    my ($mant, $expo) = $self -> sparts();
-
+    my ($mant, $expo) = $x -> sparts(@r);
     if ($mant -> bcmp(0)) {
         my ($ndigtot, $ndigfrac) = $mant -> length();
         my $expo10adj = $ndigtot - $ndigfrac - 1;
 
-        if ($expo10adj != 0) {
-            return $upgrade -> new($self) -> nparts() if $upgrade;
-            $mant -> bnan();
+        if ($expo10adj > 0) {          # if mantissa is not an integer
+            return $upgrade -> nparts($x, @r) if defined $upgrade;
+            $mant = $mant -> bnan(@r);
             return $mant unless wantarray;
-            $expo -> badd($expo10adj);
+            $expo = $expo -> badd($expo10adj, @r);
             return ($mant, $expo);
         }
     }
@@ -3769,85 +4110,149 @@ sub nparts {
     return ($mant, $expo);
 }
 
+# Parts used for engineering notation with significand/mantissa as either 0 or a
+# number in the semi-open interval [1,1000) and the exponent is a multiple of 3.
+# E.g., "12345.6789" is returned as "12.3456789" and "3".
+
 sub eparts {
-    my $self  = shift;
-    my $class = ref $self;
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
 
-    croak("eparts() is an instance method, not a class method")
-        unless $class;
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
 
     # Not-a-number and Infinity.
 
-    return $self -> sparts() if $self -> is_nan() || $self -> is_inf();
+    return $x -> sparts(@r) if $x -> is_nan() || $x -> is_inf();
+
+    # Upgrade?
+
+    return $upgrade -> eparts($x, @r)
+      if defined($upgrade) && !$x -> isa($class);
 
     # Finite number.
 
-    my ($mant, $expo) = $self -> sparts();
+    my ($mant, $expo) = $x -> sparts(@r);
 
     if ($mant -> bcmp(0)) {
         my $ndigmant  = $mant -> length();
-        $expo -> badd($ndigmant);
+        $expo = $expo -> badd($ndigmant, @r);
 
         # $c is the number of digits that will be in the integer part of the
         # final mantissa.
 
         my $c = $expo -> copy() -> bdec() -> bmod(3) -> binc();
-        $expo -> bsub($c);
+        $expo = $expo -> bsub($c);
 
         if ($ndigmant > $c) {
-            return $upgrade -> new($self) -> eparts() if $upgrade;
-            $mant -> bnan();
+            return $upgrade -> eparts($x, @r) if defined $upgrade;
+            $mant = $mant -> bnan(@r);
             return $mant unless wantarray;
             return ($mant, $expo);
         }
 
-        $mant -> blsft($c - $ndigmant, 10);
+        $mant = $mant -> blsft($c - $ndigmant, 10, @r);
     }
 
     return $mant unless wantarray;
     return ($mant, $expo);
 }
 
+# Parts used for decimal notation, e.g., "12345.6789" is returned as "12345"
+# (integer part) and "0.6789" (fraction part).
+
 sub dparts {
-    my $self  = shift;
-    my $class = ref $self;
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
 
-    croak("dparts() is an instance method, not a class method")
-        unless $class;
+    # Not-a-number.
+
+    if ($x -> is_nan()) {
+        my $int = $class -> bnan(@r);
+        return $int unless wantarray;
+        my $frc = $class -> bzero(@r);    # or NaN?
+        return ($int, $frc);
+    }
+
+    # Infinity.
+
+    if ($x -> is_inf()) {
+        my $int = $class -> binf($x->{sign}, @r);
+        return $int unless wantarray;
+        my $frc = $class -> bzero(@r);
+        return ($int, $frc);
+    }
+
+    # Upgrade?
+
+    return $upgrade -> dparts($x, @r)
+      if defined($upgrade) && !$x -> isa($class);
+
+    # Finite number.
 
-    my $int = $self -> copy();
+    my $int = $x -> copy() -> round(@r);
     return $int unless wantarray;
 
-    my $frc = $class -> bzero();
+    my $frc = $class -> bzero(@r);
     return ($int, $frc);
 }
 
+# Fractional parts with the numerator and denominator as integers. E.g.,
+# "123.4375" is returned as "1975" and "16".
+
 sub fparts {
-    my $x = shift;
-    my $class = ref $x;
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
 
-    croak("fparts() is an instance method") unless $class;
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
 
-    return ($x -> copy(),
-            $x -> is_nan() ? $class -> bnan() : $class -> bone());
+    # NaN => NaN/NaN
+
+    if ($x -> is_nan()) {
+        return $class -> bnan(@r) unless wantarray;
+        return $class -> bnan(@r), $class -> bnan(@r);
+    }
+
+    # ±Inf => ±Inf/1
+
+    if ($x -> is_inf()) {
+        my $numer = $class -> binf($x->{sign}, @r);
+        return $numer unless wantarray;
+        my $denom = $class -> bone(@r);
+        return $numer, $denom;
+    }
+
+    # Upgrade?
+
+    return $upgrade -> fparts($x, @r)
+      if defined($upgrade) && !$x -> isa($class);
+
+    # N => N/1
+
+    my $numer = $x -> copy() -> round(@r);
+    return $numer unless wantarray;
+    my $denom = $class -> bone(@r);
+    return $numer, $denom;
 }
 
 sub numerator {
-    my $x = shift;
-    my $class = ref $x;
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
 
-    croak("numerator() is an instance method") unless $class;
+    return $upgrade -> numerator($x, @r)
+      if defined($upgrade) && !$x -> isa($class);
 
-    return $x -> copy();
+    return $x -> copy() -> round(@r);
 }
 
 sub denominator {
-    my $x = shift;
-    my $class = ref $x;
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
 
-    croak("denominator() is an instance method") unless $class;
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
 
-    return $x -> is_nan() ? $class -> bnan() : $class -> bone();
+    return $upgrade -> denominator($x, @r)
+      if defined($upgrade) && !$x -> isa($class);
+
+    return $x -> is_nan() ? $class -> bnan(@r) : $class -> bone(@r);
 }
 
 ###############################################################################
@@ -3855,12 +4260,24 @@ sub denominator {
 ###############################################################################
 
 sub bstr {
-    my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_);
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
+
+    # Inf and NaN
 
     if ($x->{sign} ne '+' && $x->{sign} ne '-') {
         return $x->{sign} unless $x->{sign} eq '+inf'; # -inf, NaN
         return 'inf';                                  # +inf
     }
+
+    # Upgrade?
+
+    return $upgrade -> bstr($x, @r)
+      if defined($upgrade) && !$x -> isa($class);
+
+    # Finite number
+
     my $str = $LIB->_str($x->{value});
     return $x->{sign} eq '-' ? "-$str" : $str;
 }
@@ -3869,125 +4286,223 @@ sub bstr {
 # written as "1.2345e+4".
 
 sub bsstr {
-    my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_);
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
+
+    # Inf and NaN
 
     if ($x->{sign} ne '+' && $x->{sign} ne '-') {
         return $x->{sign} unless $x->{sign} eq '+inf';  # -inf, NaN
         return 'inf';                                   # +inf
     }
-    my ($m, $e) = $x -> parts();
-    my $str = $LIB->_str($m->{value}) . 'e+' . $LIB->_str($e->{value});
-    return $x->{sign} eq '-' ? "-$str" : $str;
+
+    # Upgrade?
+
+    return $upgrade -> bsstr($x, @r)
+      if defined($upgrade) && !$x -> isa($class);
+
+    # Finite number
+
+    my $expo = $LIB -> _zeros($x->{value});
+    my $mant = $LIB -> _str($x->{value});
+    $mant = substr($mant, 0, -$expo) if $expo;  # strip trailing zeros
+
+    ($x->{sign} eq '-' ? '-' : '') . $mant . 'e+' . $expo;
 }
 
-# Normalized notation, e.g., "12345" is written as "12345e+0".
+# Normalized notation, e.g., "12345" is written as "1.2345e+4".
 
 sub bnstr {
-    my $x = shift;
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
+
+    # Inf and NaN
 
     if ($x->{sign} ne '+' && $x->{sign} ne '-') {
         return $x->{sign} unless $x->{sign} eq '+inf';  # -inf, NaN
         return 'inf';                                   # +inf
     }
 
-    return $x -> bstr() if $x -> is_nan() || $x -> is_inf();
+    # Upgrade?
 
-    my ($mant, $expo) = $x -> parts();
+    return $upgrade -> bnstr($x, @r)
+      if defined($upgrade) && !$x -> isa($class);
 
-    # The "fraction posision" is the position (offset) for the decimal point
-    # relative to the end of the digit string.
+    # Finite number
 
-    my $fracpos = $mant -> length() - 1;
-    if ($fracpos == 0) {
-        my $str = $LIB->_str($mant->{value}) . "e+" . $LIB->_str($expo->{value});
-        return $x->{sign} eq '-' ? "-$str" : $str;
-    }
+    my $expo = $LIB -> _zeros($x->{value});
+    my $mant = $LIB -> _str($x->{value});
+    $mant = substr($mant, 0, -$expo) if $expo;  # strip trailing zeros
 
-    $expo += $fracpos;
-    my $mantstr = $LIB->_str($mant -> {value});
-    substr($mantstr, -$fracpos, 0) = '.';
+    my $mantlen = CORE::length($mant);
+    if ($mantlen > 1) {
+        $expo += $mantlen - 1;                  # adjust exponent
+        substr $mant, 1, 0, ".";                # insert decimal point
+    }
 
-    my $str = $mantstr . 'e+' . $LIB->_str($expo -> {value});
-    return $x->{sign} eq '-' ? "-$str" : $str;
+    ($x->{sign} eq '-' ? '-' : '') . $mant . 'e+' . $expo;
 }
 
 # Engineering notation, e.g., "12345" is written as "12.345e+3".
 
 sub bestr {
-    my $x = shift;
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
+
+    # Inf and NaN
 
     if ($x->{sign} ne '+' && $x->{sign} ne '-') {
         return $x->{sign} unless $x->{sign} eq '+inf';  # -inf, NaN
         return 'inf';                                   # +inf
     }
 
-    my ($mant, $expo) = $x -> parts();
+    # Upgrade?
 
-    my $sign = $mant -> sign();
-    $mant -> babs();
+    return $upgrade -> bestr($x, @r)
+      if defined($upgrade) && !$x -> isa($class);
 
-    my $mantstr = $LIB->_str($mant -> {value});
-    my $mantlen = CORE::length($mantstr);
+    # Finite number
 
-    my $dotidx = 1;
-    $expo += $mantlen - 1;
+    my $expo = $LIB -> _zeros($x->{value});     # number of trailing zeros
+    my $mant = $LIB -> _str($x->{value});       # mantissa as a string
+    $mant = substr($mant, 0, -$expo) if $expo;  # strip trailing zeros
+    my $mantlen = CORE::length($mant);          # length of mantissa
+    $expo += $mantlen;
 
-    my $c = $expo -> copy() -> bmod(3);
-    $expo   -= $c;
-    $dotidx += $c;
+    my $dotpos = ($expo - 1) % 3 + 1;           # offset of decimal point
+    $expo -= $dotpos;
 
-    if ($mantlen < $dotidx) {
-        $mantstr .= "0" x ($dotidx - $mantlen);
-    } elsif ($mantlen > $dotidx) {
-        substr($mantstr, $dotidx, 0) = ".";
+    if ($dotpos < $mantlen) {
+        substr $mant, $dotpos, 0, ".";          # insert decimal point
+    } elsif ($dotpos > $mantlen) {
+        $mant .= "0" x ($dotpos - $mantlen);    # append zeros
     }
 
-    my $str = $mantstr . 'e+' . $LIB->_str($expo -> {value});
-    return $sign eq "-" ? "-$str" : $str;
+    ($x->{sign} eq '-' ? '-' : '') . $mant . 'e+' . $expo;
 }
 
-# Decimal notation, e.g., "12345".
+# Decimal notation, e.g., "12345" (no exponent).
 
 sub bdstr {
-    my $x = shift;
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
+
+    # Inf and NaN
 
     if ($x->{sign} ne '+' && $x->{sign} ne '-') {
-        return $x->{sign} unless $x->{sign} eq '+inf'; # -inf, NaN
-        return 'inf';                                  # +inf
+        return $x->{sign} unless $x->{sign} eq '+inf';  # -inf, NaN
+        return 'inf';                                   # +inf
     }
 
-    my $str = $LIB->_str($x->{value});
-    return $x->{sign} eq '-' ? "-$str" : $str;
+    # Upgrade?
+
+    return $upgrade -> bdstr($x, @r)
+      if defined($upgrade) && !$x -> isa($class);
+
+    # Finite number
+
+    ($x->{sign} eq '-' ? '-' : '') . $LIB->_str($x->{value});
+}
+
+# Fraction notation, e.g., "123.4375" is written as "1975/16", but "123" is
+# written as "123", not "123/1".
+
+sub bfstr {
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
+
+    # Inf and NaN
+
+    if ($x->{sign} ne '+' && $x->{sign} ne '-') {
+        return $x->{sign} unless $x->{sign} eq '+inf';  # -inf, NaN
+        return 'inf';                                   # +inf
+    }
+
+    # Upgrade?
+
+    return $upgrade -> bfstr($x, @r)
+      if defined($upgrade) && !$x -> isa($class);
+
+    # Finite number
+
+    ($x->{sign} eq '-' ? '-' : '') . $LIB->_str($x->{value});
 }
 
 sub to_hex {
-    # return as hex string, with prefixed 0x
-    my $x = shift;
-    $x = __PACKAGE__->new($x) if !ref($x);
+    # return as hex string with no prefix
 
-    return $x->bstr() if $x->{sign} !~ /^[+-]$/; # inf, nan etc
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
+
+    # Inf and NaN
+
+    if ($x->{sign} ne '+' && $x->{sign} ne '-') {
+        return $x->{sign} unless $x->{sign} eq '+inf';  # -inf, NaN
+        return 'inf';                                   # +inf
+    }
+
+    # Upgrade?
+
+    return $upgrade -> to_hex($x, @r)
+      if defined($upgrade) && !$x -> isa($class);
+
+    # Finite number
 
     my $hex = $LIB->_to_hex($x->{value});
     return $x->{sign} eq '-' ? "-$hex" : $hex;
 }
 
 sub to_oct {
-    # return as octal string, with prefixed 0
-    my $x = shift;
-    $x = __PACKAGE__->new($x) if !ref($x);
+    # return as octal string with no prefix
 
-    return $x->bstr() if $x->{sign} !~ /^[+-]$/; # inf, nan etc
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
+
+    # Inf and NaN
+
+    if ($x->{sign} ne '+' && $x->{sign} ne '-') {
+        return $x->{sign} unless $x->{sign} eq '+inf';  # -inf, NaN
+        return 'inf';                                   # +inf
+    }
+
+    # Upgrade?
+
+    return $upgrade -> to_oct($x, @r)
+      if defined($upgrade) && !$x -> isa($class);
+
+    # Finite number
 
     my $oct = $LIB->_to_oct($x->{value});
     return $x->{sign} eq '-' ? "-$oct" : $oct;
 }
 
 sub to_bin {
-    # return as binary string, with prefixed 0b
-    my $x = shift;
-    $x = __PACKAGE__->new($x) if !ref($x);
+    # return as binary string with no prefix
 
-    return $x->bstr() if $x->{sign} !~ /^[+-]$/; # inf, nan etc
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
+
+    # Inf and NaN
+
+    if ($x->{sign} ne '+' && $x->{sign} ne '-') {
+        return $x->{sign} unless $x->{sign} eq '+inf';  # -inf, NaN
+        return 'inf';                                   # +inf
+    }
+
+    # Upgrade?
+
+    return $upgrade -> to_bin($x, @r)
+      if defined($upgrade) && !$x -> isa($class);
+
+    # Finite number
 
     my $bin = $LIB->_to_bin($x->{value});
     return $x->{sign} eq '-' ? "-$bin" : $bin;
@@ -3995,12 +4510,17 @@ sub to_bin {
 
 sub to_bytes {
     # return a byte string
-    my $x = shift;
-    $x = __PACKAGE__->new($x) if !ref($x);
+
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
 
     croak("to_bytes() requires a finite, non-negative integer")
         if $x -> is_neg() || ! $x -> is_int();
 
+    return $upgrade -> to_bytes($x, @r)
+      if defined($upgrade) && !$x -> isa($class);
+
     croak("to_bytes() requires a newer version of the $LIB library.")
         unless $LIB->can('_to_bytes');
 
@@ -4009,22 +4529,23 @@ sub to_bytes {
 
 sub to_base {
     # return a base anything string
-    my $x = shift;
-    $x = __PACKAGE__->new($x) if !ref($x);
+
+    # $cs is the collation sequence
+    my ($class, $x, $base, $cs, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+                                    ? (ref($_[0]), @_) : objectify(2, @_);
+
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
 
     croak("the value to convert must be a finite, non-negative integer")
       if $x -> is_neg() || !$x -> is_int();
 
-    my $base = shift;
-    $base = __PACKAGE__->new($base) unless ref($base);
-
     croak("the base must be a finite integer >= 2")
       if $base < 2 || ! $base -> is_int();
 
     # If no collating sequence is given, pass some of the conversions to
     # methods optimized for those cases.
 
-    if (! @_) {
+    unless (defined $cs) {
         return    $x -> to_bin() if $base == 2;
         return    $x -> to_oct() if $base == 8;
         return uc $x -> to_hex() if $base == 16;
@@ -4034,26 +4555,35 @@ sub to_base {
     croak("to_base() requires a newer version of the $LIB library.")
       unless $LIB->can('_to_base');
 
-    return $LIB->_to_base($x->{value}, $base -> {value}, @_ ? shift() : ());
+    return $upgrade -> to_base($x, $base, $cs, @r)
+      if defined($upgrade) && (!$x -> isa($class) || !$base -> isa($class));
+
+    return $LIB->_to_base($x->{value}, $base -> {value},
+                          defined($cs) ? $cs : ());
 }
 
 sub to_base_num {
-    my $x = shift;
-    my $class = ref $x;
+    # return a base anything array ref, e.g.,
+    # Math::BigInt -> new(255) -> to_base_num(10) returns [2, 5, 5];
+
+    # $cs is the collation sequence
+    my ($class, $x, $base, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+                               ? (ref($_[0]), @_) : objectify(2, @_);
+
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
 
-    # return a base anything string
     croak("the value to convert must be a finite non-negative integer")
       if $x -> is_neg() || !$x -> is_int();
 
-    my $base = shift;
-    $base = $class -> new($base) unless ref $base;
-
     croak("the base must be a finite integer >= 2")
       if $base < 2 || ! $base -> is_int();
 
     croak("to_base() requires a newer version of the $LIB library.")
       unless $LIB->can('_to_base');
 
+    return $upgrade -> to_base_num($x, $base, @r)
+      if defined($upgrade) && (!$x -> isa($class) || !$base -> isa($class));
+
     # Get a reference to an array of library thingies, and replace each element
     # with a Math::BigInt object using that thingy.
 
@@ -4070,33 +4600,48 @@ sub to_base_num {
 
 sub as_hex {
     # return as hex string, with prefixed 0x
-    my $x = shift;
-    $x = __PACKAGE__->new($x) if !ref($x);
+
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
 
     return $x->bstr() if $x->{sign} !~ /^[+-]$/; # inf, nan etc
 
+    return $upgrade -> as_hex($x, @r)
+      if defined($upgrade) && !$x -> isa($class);
+
     my $hex = $LIB->_as_hex($x->{value});
     return $x->{sign} eq '-' ? "-$hex" : $hex;
 }
 
 sub as_oct {
     # return as octal string, with prefixed 0
-    my $x = shift;
-    $x = __PACKAGE__->new($x) if !ref($x);
+
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
 
     return $x->bstr() if $x->{sign} !~ /^[+-]$/; # inf, nan etc
 
+    return $upgrade -> as_oct($x, @r)
+      if defined($upgrade) && !$x -> isa($class);
+
     my $oct = $LIB->_as_oct($x->{value});
     return $x->{sign} eq '-' ? "-$oct" : $oct;
 }
 
 sub as_bin {
     # return as binary string, with prefixed 0b
-    my $x = shift;
-    $x = __PACKAGE__->new($x) if !ref($x);
+
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
 
     return $x->bstr() if $x->{sign} !~ /^[+-]$/; # inf, nan etc
 
+    return $upgrade -> as_bin($x, @r)
+      if defined($upgrade) && !$x -> isa($class);
+
     my $bin = $LIB->_as_bin($x->{value});
     return $x->{sign} eq '-' ? "-$bin" : $bin;
 }
@@ -4109,8 +4654,9 @@ sub as_bin {
 
 sub numify {
     # Make a Perl scalar number from a Math::BigInt object.
-    my $x = shift;
-    $x = __PACKAGE__->new($x) unless ref $x;
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
 
     if ($x -> is_nan()) {
         require Math::Complex;
@@ -4124,6 +4670,9 @@ sub numify {
         return $x -> is_negative() ? -$inf : $inf;
     }
 
+    return $upgrade -> numify($x, @r)
+      if defined($upgrade) && !$x -> isa($class);
+
     my $num = 0 + $LIB->_num($x->{value});
     return $x->{sign} eq '-' ? -$num : $num;
 }
@@ -4481,116 +5030,6 @@ sub import {
     # import done
 }
 
-sub _split {
-    # input: num_str; output: undef for invalid or
-    # (\$mantissa_sign, \$mantissa_value, \$mantissa_fraction,
-    # \$exp_sign, \$exp_value)
-    # Internal, take apart a string and return the pieces.
-    # Strip leading/trailing whitespace, leading zeros, underscore and reject
-    # invalid input.
-    my $x = shift;
-
-    # strip white space at front, also extraneous leading zeros
-    $x =~ s/^\s*([-]?)0*([0-9])/$1$2/g; # will not strip '  .2'
-    $x =~ s/^\s+//;                     # but this will
-    $x =~ s/\s+$//g;                    # strip white space at end
-
-    # shortcut, if nothing to split, return early
-    if ($x =~ /^[+-]?[0-9]+\z/) {
-        $x =~ s/^([+-])0*([0-9])/$2/;
-        my $sign = $1 || '+';
-        return (\$sign, \$x, \'', \'', \0);
-    }
-
-    # invalid starting char?
-    return if $x !~ /^[+-]?(\.?[0-9]|0b[0-1]|0x[0-9a-fA-F])/;
-
-    return Math::BigInt->from_hex($x) if $x =~ /^[+-]?0x/; # hex string
-    return Math::BigInt->from_bin($x) if $x =~ /^[+-]?0b/; # binary string
-
-    # strip underscores between digits
-    $x =~ s/([0-9])_([0-9])/$1$2/g;
-    $x =~ s/([0-9])_([0-9])/$1$2/g; # do twice for 1_2_3
-
-    # some possible inputs:
-    # 2.1234 # 0.12        # 1          # 1E1 # 2.134E1 # 434E-10 # 1.02009E-2
-    # .2     # 1_2_3.4_5_6 # 1.4E1_2_3  # 1e3 # +.2     # 0e999
-
-    my ($m, $e, $last) = split /[Ee]/, $x;
-    return if defined $last;    # last defined => 1e2E3 or others
-    $e = '0' if !defined $e || $e eq "";
-
-    # sign, value for exponent, mantint, mantfrac
-    my ($es, $ev, $mis, $miv, $mfv);
-    # valid exponent?
-    if ($e =~ /^([+-]?)0*([0-9]+)$/) # strip leading zeros
-    {
-        $es = $1;
-        $ev = $2;
-        # valid mantissa?
-        return if $m eq '.' || $m eq '';
-        my ($mi, $mf, $lastf) = split /\./, $m;
-        return if defined $lastf; # lastf defined => 1.2.3 or others
-        $mi = '0' if !defined $mi;
-        $mi .= '0' if $mi =~ /^[\-\+]?$/;
-        $mf = '0' if !defined $mf || $mf eq '';
-        if ($mi =~ /^([+-]?)0*([0-9]+)$/) # strip leading zeros
-        {
-            $mis = $1 || '+';
-            $miv = $2;
-            return unless ($mf =~ /^([0-9]*?)0*$/); # strip trailing zeros
-            $mfv = $1;
-            # handle the 0e999 case here
-            $ev = 0 if $miv eq '0' && $mfv eq '';
-            return (\$mis, \$miv, \$mfv, \$es, \$ev);
-        }
-    }
-    return;                     # NaN, not a number
-}
-
-sub _e_add {
-    # Internal helper sub to take two positive integers and their signs and
-    # then add them. Input ($LIB, $LIB, ('+'|'-'), ('+'|'-')), output
-    # ($LIB, ('+'|'-')).
-
-    my ($x, $y, $xs, $ys) = @_;
-
-    # if the signs are equal we can add them (-5 + -3 => -(5 + 3) => -8)
-    if ($xs eq $ys) {
-        $x = $LIB->_add($x, $y); # +a + +b or -a + -b
-    } else {
-        my $a = $LIB->_acmp($x, $y);
-        if ($a == 0) {
-            # This does NOT modify $x in-place. TODO: Fix this?
-            $x = $LIB->_zero(); # result is 0
-            $xs = '+';
-            return ($x, $xs);
-        }
-        if ($a > 0) {
-            $x = $LIB->_sub($x, $y);     # abs sub
-        } else {                         # a < 0
-            $x = $LIB->_sub ($y, $x, 1); # abs sub
-            $xs = $ys;
-        }
-    }
-
-    $xs = '+' if $xs eq '-' && $LIB->_is_zero($x); # no "-0"
-
-    return ($x, $xs);
-}
-
-sub _e_sub {
-    # Internal helper sub to take two positive integers and their signs and
-    # then subtract them. Input ($LIB, $LIB, ('+'|'-'), ('+'|'-')),
-    # output ($LIB, ('+'|'-'))
-    my ($x, $y, $xs, $ys) = @_;
-
-    # flip sign
-    $ys = $ys eq '+' ? '-' : '+'; # swap sign of second operand ...
-    _e_add($x, $y, $xs, $ys);     # ... and let _e_add() do the job
-    #$LIB -> _sadd($x, $xs, $y, $ys);     # ... and let $LIB -> _sadd() do the job
-}
-
 sub _trailing_zeros {
     # return the amount of trailing zeros in $x (as scalar)
     my $x = shift;
@@ -4643,7 +5082,8 @@ sub _find_round_parameters {
     if (!defined $a) {
         foreach ($self, @args) {
             # take the defined one, or if both defined, the one that is smaller
-            $a = $_->{_a} if (defined $_->{_a}) && (!defined $a || $_->{_a} < $a);
+            $a = $_->{_a}
+              if (defined $_->{_a}) && (!defined $a || $_->{_a} < $a);
         }
     }
     if (!defined $p) {
@@ -4651,7 +5091,8 @@ sub _find_round_parameters {
         foreach ($self, @args) {
             # take the defined one, or if both defined, the one that is bigger
             # -2 > -3, and 3 > 2
-            $p = $_->{_p} if (defined $_->{_p}) && (!defined $p || $_->{_p} > $p);
+            $p = $_->{_p}
+              if (defined $_->{_p}) && (!defined $p || $_->{_p} > $p);
         }
     }
 
@@ -4679,13 +5120,29 @@ sub _find_round_parameters {
     ($self, $a, $p, $r);
 }
 
+# Return true if the input is numeric and false if it is a string.
+
+sub _is_numeric {
+    shift;              # class name
+    my $value = shift;
+    no warnings 'numeric';
+    # detect numbers
+    # string & "" -> ""
+    # number & "" -> 0 (with warning)
+    # nan and inf can detect as numbers, so check with * 0
+    return unless CORE::length((my $dummy = "") & $value);
+    return unless 0 + $value eq $value;
+    return 1 if $value * 0 == 0;
+    return -1;          # Inf/NaN
+}
+
 # Trims the sign of the significand, the (absolute value of the) significand,
 # the sign of the exponent, and the (absolute value of the) exponent. The
 # returned values have no underscores ("_") or unnecessary leading or trailing
 # zeros.
 
 sub _trim_split_parts {
-    shift;
+    shift;               # class name
 
     my $sig_sgn = shift() || '+';
     my $sig_str = shift() || '0';
@@ -4703,6 +5160,7 @@ sub _trim_split_parts {
     $exp_str =~ tr/_//d;                        # "01_234" -> "01234"
     $exp_str =~ s/^0+//;                        # "01234" -> "1234"
     $exp_str = '0' unless CORE::length($exp_str);
+    $exp_sgn = '+' if $exp_str eq '0';          # "+3e-0" -> "+3e+0"
 
     return $sig_sgn, $sig_str, $exp_sgn, $exp_str;
 }
@@ -4722,7 +5180,7 @@ sub _trim_split_parts {
 #
 #   "10.01e+01"
 
-sub _dec_str_to_str_parts {
+sub _dec_str_to_dec_str_parts {
     my $class = shift;
     my $str   = shift;
 
@@ -4785,7 +5243,7 @@ sub _dec_str_to_str_parts {
 #   "x_1_0"
 #   "_1_0"
 
-sub _hex_str_to_str_parts {
+sub _hex_str_to_hex_str_parts {
     my $class = shift;
     my $str   = shift;
 
@@ -4839,7 +5297,7 @@ sub _hex_str_to_str_parts {
 # the sign of the exponent, and the absolute value of the exponent. The
 # significand is in base 8, and the exponent is in base 2.
 
-sub _oct_str_to_str_parts {
+sub _oct_str_to_oct_str_parts {
     my $class = shift;
     my $str   = shift;
 
@@ -4893,7 +5351,7 @@ sub _oct_str_to_str_parts {
 # the sign of the exponent, and the absolute value of the exponent. The
 # significand is in base 2, and the exponent is in base 2.
 
-sub _bin_str_to_str_parts {
+sub _bin_str_to_bin_str_parts {
     my $class = shift;
     my $str   = shift;
 
@@ -4947,8 +5405,8 @@ sub _bin_str_to_str_parts {
 # libray thingy, the sign of the exponent, and the absolute value of the
 # exponent as a library thingy.
 
-sub _dec_parts_to_lib_parts {
-    shift;
+sub _dec_str_parts_to_flt_lib_parts {
+    shift;               # class name
 
     my ($sig_sgn, $sig_str, $exp_sgn, $exp_str) = @_;
 
@@ -4979,8 +5437,7 @@ sub _dec_parts_to_lib_parts {
         $delta = $LIB -> _sub($delta, $LIB -> _new($idx));
 
         # exponent - delta
-        ($exp_lib, $exp_sgn) = _e_sub($exp_lib, $delta, $exp_sgn, '+');
-        #($exp_lib, $exp_sgn) = $LIB -> _ssub($exp_lib, $exp_sgn, $delta, '+');
+        ($exp_lib, $exp_sgn) = $LIB -> _ssub($exp_lib, $exp_sgn, $delta, '+');
 
         $sig_str =~ s/^0+//;
     }
@@ -5017,8 +5474,8 @@ sub _dec_parts_to_lib_parts {
 # libray thingy, the sign of the exponent, and the absolute value of the
 # exponent as a library thingy.
 
-sub _bin_parts_to_lib_parts {
-    shift;
+sub _bin_str_parts_to_flt_lib_parts {
+    shift;               # class name
 
     my ($sig_sgn, $sig_str, $exp_sgn, $exp_str, $bpc) = @_;
     my $bpc_lib = $LIB -> _new($bpc);
@@ -5052,8 +5509,7 @@ sub _bin_parts_to_lib_parts {
         $delta = $LIB -> _mul($delta, $bpc_lib) if $bpc != 1;
 
         # exponent - delta
-        ($exp_lib, $exp_sgn) = _e_sub($exp_lib, $delta, $exp_sgn, '+');
-        #($exp_lib, $exp_sgn) = $LIB -> _ssub($exp_lib, $exp_sgn, $delta, '+');
+        ($exp_lib, $exp_sgn) = $LIB -> _ssub($exp_lib, $exp_sgn, $delta, '+');
 
         $sig_str =~ s/^0+//;
     }
@@ -5135,11 +5591,11 @@ sub _bin_parts_to_lib_parts {
 # as a libray thingy, the sign of the exponent, and the absolute value of the
 # exponent as a library thingy.
 
-sub _hex_str_to_lib_parts {
+sub _hex_str_to_flt_lib_parts {
     my $class = shift;
     my $str   = shift;
-    if (my @parts = $class -> _hex_str_to_str_parts($str)) {
-        return $class -> _bin_parts_to_lib_parts(@parts, 4);  # 4 bits pr. chr
+    if (my @parts = $class -> _hex_str_to_hex_str_parts($str)) {
+        return $class -> _bin_str_parts_to_flt_lib_parts(@parts, 4);  # 4 bits pr. chr
     }
     return;
 }
@@ -5149,11 +5605,11 @@ sub _hex_str_to_lib_parts {
 # libray thingy, the sign of the exponent, and the absolute value of the
 # exponent as a library thingy.
 
-sub _oct_str_to_lib_parts {
+sub _oct_str_to_flt_lib_parts {
     my $class = shift;
     my $str   = shift;
-    if (my @parts = $class -> _oct_str_to_str_parts($str)) {
-        return $class -> _bin_parts_to_lib_parts(@parts, 3);  # 3 bits pr. chr
+    if (my @parts = $class -> _oct_str_to_oct_str_parts($str)) {
+        return $class -> _bin_str_parts_to_flt_lib_parts(@parts, 3);  # 3 bits pr. chr
     }
     return;
 }
@@ -5163,11 +5619,11 @@ sub _oct_str_to_lib_parts {
 # libray thingy, the sign of the exponent, and the absolute value of the
 # exponent as a library thingy.
 
-sub _bin_str_to_lib_parts {
+sub _bin_str_to_flt_lib_parts {
     my $class = shift;
     my $str   = shift;
-    if (my @parts = $class -> _bin_str_to_str_parts($str)) {
-        return $class -> _bin_parts_to_lib_parts(@parts, 1);  # 1 bit pr. chr
+    if (my @parts = $class -> _bin_str_to_bin_str_parts($str)) {
+        return $class -> _bin_str_parts_to_flt_lib_parts(@parts, 1);  # 1 bit pr. chr
     }
     return;
 }
@@ -5176,11 +5632,11 @@ sub _bin_str_to_lib_parts {
 # the significand as library thingy, the sign of the exponent, and the absolute
 # value of the exponent as a a library thingy.
 
-sub _dec_str_to_lib_parts {
+sub _dec_str_to_flt_lib_parts {
     my $class = shift;
     my $str   = shift;
-    if (my @parts = $class -> _dec_str_to_str_parts($str)) {
-        return $class -> _dec_parts_to_lib_parts(@parts);
+    if (my @parts = $class -> _dec_str_to_dec_str_parts($str)) {
+        return $class -> _dec_str_parts_to_flt_lib_parts(@parts);
     }
     return;
 }
@@ -5190,8 +5646,8 @@ sub _dec_str_to_lib_parts {
 sub hex_str_to_dec_flt_str {
     my $class = shift;
     my $str   = shift;
-    if (my @parts = $class -> _hex_str_to_lib_parts($str)) {
-        return $class -> _lib_parts_to_flt_str(@parts);
+    if (my @parts = $class -> _hex_str_to_flt_lib_parts($str)) {
+        return $class -> _flt_lib_parts_to_flt_str(@parts);
     }
     return;
 }
@@ -5201,8 +5657,8 @@ sub hex_str_to_dec_flt_str {
 sub oct_str_to_dec_flt_str {
     my $class = shift;
     my $str   = shift;
-    if (my @parts = $class -> _oct_str_to_lib_parts($str)) {
-        return $class -> _lib_parts_to_flt_str(@parts);
+    if (my @parts = $class -> _oct_str_to_flt_lib_parts($str)) {
+        return $class -> _flt_lib_parts_to_flt_str(@parts);
     }
     return;
 }
@@ -5212,8 +5668,8 @@ sub oct_str_to_dec_flt_str {
 sub bin_str_to_dec_flt_str {
     my $class = shift;
     my $str   = shift;
-    if (my @parts = $class -> _bin_str_to_lib_parts($str)) {
-        return $class -> _lib_parts_to_flt_str(@parts);
+    if (my @parts = $class -> _bin_str_to_flt_lib_parts($str)) {
+        return $class -> _flt_lib_parts_to_flt_str(@parts);
     }
     return;
 }
@@ -5223,8 +5679,8 @@ sub bin_str_to_dec_flt_str {
 sub dec_str_to_dec_flt_str {
     my $class = shift;
     my $str   = shift;
-    if (my @parts = $class -> _dec_str_to_lib_parts($str)) {
-        return $class -> _lib_parts_to_flt_str(@parts);
+    if (my @parts = $class -> _dec_str_to_flt_lib_parts($str)) {
+        return $class -> _flt_lib_parts_to_flt_str(@parts);
     }
     return;
 }
@@ -5234,8 +5690,8 @@ sub dec_str_to_dec_flt_str {
 sub hex_str_to_dec_str {
     my $class = shift;
     my $str   = shift;
-    if (my @parts = $class -> _dec_str_to_lib_parts($str)) {
-        return $class -> _lib_parts_to_dec_str(@parts);
+    if (my @parts = $class -> _dec_str_to_flt_lib_parts($str)) {
+        return $class -> _flt_lib_parts_to_dec_str(@parts);
     }
     return;
 }
@@ -5245,8 +5701,8 @@ sub hex_str_to_dec_str {
 sub oct_str_to_dec_str {
     my $class = shift;
     my $str   = shift;
-    if (my @parts = $class -> _oct_str_to_lib_parts($str)) {
-        return $class -> _lib_parts_to_dec_str(@parts);
+    if (my @parts = $class -> _oct_str_to_flt_lib_parts($str)) {
+        return $class -> _flt_lib_parts_to_dec_str(@parts);
     }
     return;
 }
@@ -5256,8 +5712,8 @@ sub oct_str_to_dec_str {
 sub bin_str_to_dec_str {
     my $class = shift;
     my $str   = shift;
-    if (my @parts = $class -> _bin_str_to_lib_parts($str)) {
-        return $class -> _lib_parts_to_dec_str(@parts);
+    if (my @parts = $class -> _bin_str_to_flt_lib_parts($str)) {
+        return $class -> _flt_lib_parts_to_dec_str(@parts);
     }
     return;
 }
@@ -5267,20 +5723,20 @@ sub bin_str_to_dec_str {
 sub dec_str_to_dec_str {
     my $class = shift;
     my $str   = shift;
-    if (my @parts = $class -> _dec_str_to_lib_parts($str)) {
-        return $class -> _lib_parts_to_dec_str(@parts);
+    if (my @parts = $class -> _dec_str_to_flt_lib_parts($str)) {
+        return $class -> _flt_lib_parts_to_dec_str(@parts);
     }
     return;
 }
 
-sub _lib_parts_to_flt_str {
+sub _flt_lib_parts_to_flt_str {
     my $class = shift;
     my @parts = @_;
     return $parts[0] . $LIB -> _str($parts[1])
       . 'e' . $parts[2] . $LIB -> _str($parts[3]);
 }
 
-sub _lib_parts_to_dec_str {
+sub _flt_lib_parts_to_dec_str {
     my $class = shift;
     my @parts = @_;
 
@@ -5308,6 +5764,55 @@ sub _lib_parts_to_dec_str {
     }
 }
 
+# Takes four arguments, the sign of the significand, the absolute value of the
+# significand as a libray thingy, the sign of the exponent, and the absolute
+# value of the exponent as a library thingy, and returns three parts: the sign
+# of the rational number, the absolute value of the numerator as a libray
+# thingy, and the absolute value of the denominator as a library thingy.
+#
+# For example, to convert data representing the value "+12e-2", then
+#
+#   $sm = "+";
+#   $m  = $LIB -> _new("12");
+#   $se = "-";
+#   $e  = $LIB -> _new("2");
+#   ($sr, $n, $d) = $class -> _flt_lib_parts_to_rat_lib_parts($sm, $m, $se, $e);
+#
+# returns data representing the same value written as the fraction "+3/25"
+#
+#   $sr = "+"
+#   $n  = $LIB -> _new("3");
+#   $d  = $LIB -> _new("12");
+
+sub _flt_lib_parts_to_rat_lib_parts {
+    my $self = shift;
+    my ($msgn, $mabs, $esgn, $eabs) = @_;
+
+    if ($esgn eq '-') {                 # "12e-2" -> "12/100" -> "3/25"
+        my $num_lib = $LIB -> _copy($mabs);
+        my $den_lib = $LIB -> _1ex($LIB -> _num($eabs));
+        my $gcd_lib = $LIB -> _gcd($LIB -> _copy($num_lib), $den_lib);
+        $num_lib = $LIB -> _div($LIB -> _copy($num_lib), $gcd_lib);
+        $den_lib = $LIB -> _div($den_lib, $gcd_lib);
+        return $msgn, $num_lib, $den_lib;
+    }
+
+    elsif (!$LIB -> _is_zero($eabs)) {  # "12e+2" -> "1200" -> "1200/1"
+        return $msgn, $LIB -> _lsft($LIB -> _copy($mabs), $eabs, 10),
+                      $LIB -> _one();
+    }
+
+    else {                              # "12e+0" -> "12" -> "12/1"
+        return $msgn, $mabs, $LIB -> _one();
+    }
+}
+
+# Add the function _register_callback() to Math::BigInt. It is provided for
+# backwards compabibility so that old version of Math::BigRat etc. don't
+# complain about missing it.
+
+sub _register_callback { }
+
 ###############################################################################
 # this method returns 0 if the object can be modified, or 1 if not.
 # We use a fast constant sub() here, to avoid costly calls. Subclasses
@@ -5343,10 +5848,6 @@ Math::BigInt - arbitrary size integer math package
   # to die if Math::BigInt::GMP cannot be found, use
   # use Math::BigInt only => 'GMP';
 
-  my $str = '1234567890';
-  my @values = (64, 74, 18);
-  my $n = 1; my $sign = '-';
-
   # Configuration methods (may be used as class methods and instance methods)
 
   Math::BigInt->accuracy();     # get class accuracy
@@ -5378,8 +5879,10 @@ Math::BigInt - arbitrary size integer math package
   $x = Math::BigInt->bnan();                # create a Not-A-Number
   $x = Math::BigInt->bpi();                 # returns pi
 
-  $y = $x->copy();         # make a copy (unlike $y = $x)
-  $y = $x->as_int();       # return as a Math::BigInt
+  $y = $x->copy();        # make a copy (unlike $y = $x)
+  $y = $x->as_int();      # return as a Math::BigInt
+  $y = $x->as_float();    # return as a Math::BigFloat
+  $y = $x->as_rat();      # return as a Math::BigRat
 
   # Boolean methods (these don't modify the invocand)
 
@@ -5505,7 +6008,7 @@ Math::BigInt - arbitrary size integer math package
   $x->bsstr();        # string in scientific notation with integers
   $x->bnstr();        # string in normalized notation
   $x->bestr();        # string in engineering notation
-  $x->bdstr();        # string in decimal notation
+  $x->bfstr();        # string in fractional notation
 
   $x->to_hex();       # as signed hexadecimal string
   $x->to_bin();       # as signed binary string
@@ -6008,6 +6511,14 @@ v1.22, while C<as_int()> was introduced in v1.68.
 
 In Math::BigInt, C<as_int()> has the same effect as C<copy()>.
 
+=item as_float()
+
+Return the argument as a Math::BigFloat object.
+
+=item as_rat()
+
+Return the argument as a Math::BigRat object.
+
 =back
 
 =head2 Boolean methods
@@ -6895,6 +7406,17 @@ corresponds to the output from C<dparts()>.
     12000 is returned as "12000"
     10000 is returned as "10000"
 
+=item bfstr()
+
+Returns a string representing the number using fractional notation. The output
+corresponds to the output from C<fparts()>.
+
+        12.345 is returned as "2469/200"
+       123.45 is returned as "2469/20"
+      1234.5 is returned as "2469/2"
+     12345 is returned as "12345"
+    123450 is returned as "123450"
+
 =item to_hex()
 
     $x->to_hex();
@@ -6918,8 +7440,8 @@ Returns an octal string representation of the number. See also from_oct().
     $x = Math::BigInt->new("1667327589");
     $s = $x->to_bytes();                    # $s = "cafe"
 
-Returns a byte string representation of the number using big endian byte
-order. The invocand must be a non-negative, finite integer. See also from_bytes().
+Returns a byte string representation of the number using big endian byte order.
+The invocand must be a non-negative, finite integer. See also from_bytes().
 
 =item to_base()
 
@@ -7863,11 +8385,12 @@ strings:
     use Test::More tests => 3;
     use Math::BigInt;
 
-    $x = Math::BigInt->new('1e56'); $y = 1e56;
+    $x = Math::BigInt->new('1e56');
+    $y = 1e56;
     is($x,$y);                     # fails
-    is($x->bsstr(),$y);            # okay
+    is($x->bsstr(), $y);           # okay
     $y = Math::BigInt->new($y);
-    is($x,$y);                     # okay
+    is($x, $y);                    # okay
 
 Alternatively, simply use C<< <=> >> for comparisons, this always gets it
 right. There is not yet a way to get a number automatically represented as a
index c6cb703..a5429dc 100644 (file)
@@ -7,7 +7,7 @@ use warnings;
 use Carp qw< carp croak >;
 use Math::BigInt::Lib;
 
-our $VERSION = '1.999830';
+our $VERSION = '1.999837';
 $VERSION =~ tr/_//d;
 
 our @ISA = ('Math::BigInt::Lib');
@@ -2248,6 +2248,7 @@ sub _from_bin {
 # special modulus functions
 
 sub _modinv {
+
     # modular multiplicative inverse
     my ($c, $x, $y) = @_;
 
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/_bin_parts_to_lib_parts.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/_bin_parts_to_lib_parts.t
deleted file mode 100644 (file)
index 67edea9..0000000
+++ /dev/null
@@ -1,88 +0,0 @@
-# -*- mode: perl; -*-
-
-use strict;
-use warnings;
-
-use Test::More tests => 36;
-
-use Math::BigInt;
-
-my $LIB = Math::BigInt -> config('lib');
-
-sub try {
-    my ($in0, $in1, $in2, $in3, $in4, $out0, $out1, $out2, $out3) = @_;
-
-    my @out;
-    my $test = q|@out = Math::BigInt -> _bin_parts_to_lib_parts|
-             . qq|("$in0", "$in1", "$in2", "$in3", $in4)|;
-
-    eval $test;
-    die $@ if $@;       # this should never happen
-
-    subtest $test => sub {
-        plan tests => 5;
-
-        is(scalar(@out), 4, 'number of output arguments');
-        is($out[0], $out0, 'sign of the significand');
-        is($LIB -> _str($out[1]), $out1, 'absolute value of the significand');
-        is($out[2], $out2, 'sign of the exponent');
-        is($LIB -> _str($out[3]), $out3, 'absolute value of the exponent');
-    };
-}
-
-note("binary");
-
-try qw< + 0                + 0    >, 1, qw< + 0     + 0 >;
-try qw< + 00.000           - 0000 >, 1, qw< + 0     + 0 >;
-
-try qw< + 1010             + 0    >, 1, qw< + 1     + 1 >;
-try qw< + 1111             + 0    >, 1, qw< + 15    + 0 >;
-try qw< + 0.1              + 0    >, 1, qw< + 5     - 1 >;
-
-try qw< + 10               - 8    >, 1, qw< + 78125 - 7 >;
-try qw< + 10               + 8    >, 1, qw< + 512   + 0 >;
-
-try qw< + 11000000001100   - 0    >, 1, qw< + 123   + 2 >;
-try qw< + 1100000000110000 - 2    >, 1, qw< + 123   + 2 >;
-
-try qw< + .00110011        + 5    >, 1, qw< + 6375  - 3 >;
-
-try qw< - 1100.0011        + 2    >, 1, qw< - 4875  - 2 >;
-
-note("octal");
-
-try qw< + 0         + 0     >, 3, qw< + 0     + 0 >;
-try qw< + 00.000    - 0000  >, 3, qw< + 0     + 0 >;
-try qw< + 12        + 0     >, 3, qw< + 1     + 1 >;
-try qw< + 17        + 0     >, 3, qw< + 15    + 0 >;
-try qw< + 0.4       + 0     >, 3, qw< + 5     - 1 >;
-try qw< + 2         - 8     >, 3, qw< + 78125 - 7 >;
-try qw< + 2         + 8     >, 3, qw< + 512   + 0 >;
-try qw< + 30014     - 0     >, 3, qw< + 123   + 2 >;
-try qw< + 14006     + 1     >, 3, qw< + 123   + 2 >;
-try qw< + 12300     + 0     >, 3, qw< + 5312  + 0 >;
-
-note("hexadecimal");
-
-try qw< + 0         + 0     >, 4, qw<  + 0                       + 0  >;
-try qw< + 00.000    - 0000  >, 4, qw<  + 0                       + 0  >;
-
-try qw< + a         + 0     >, 4, qw<  + 1                       + 1  >;
-try qw< + f         + 0     >, 4, qw<  + 15                      + 0  >;
-try qw< + 0.8       + 0     >, 4, qw<  + 5                       - 1  >;
-
-try qw< + 2         - 8     >, 4, qw<  + 78125                   - 7  >;
-try qw< + 2         + 8     >, 4, qw<  + 512                     + 0  >;
-
-try qw< + 300c      - 0     >, 4, qw<  + 123                     + 2  >;
-try qw< + 1.806     + 13    >, 4, qw<  + 123                     + 2  >;
-try qw< + c030      - 2     >, 4, qw<  + 123                     + 2  >;
-
-try qw< + 0.0625    + 16    >, 4, qw<  + 1573                    + 0  >;
-
-try qw< + .0123     + 0     >, 4, qw<  + 44403076171875          - 16 >;
-try qw< + 12300     + 0     >, 4, qw<  + 74496                   + 0  >;
-
-try qw< + .00120034 + 5     >, 4, qw<  + 87894499301910400390625 - 25 >;
-
-try qw< - 1200.0034 + 2     >, 4, qw<  - 18432003173828125       - 12 >;
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/_bin_str_to_str_parts.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/_bin_str_to_str_parts.t
deleted file mode 100644 (file)
index f8faa76..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-# -*- mode: perl; -*-
-
-use strict;
-use warnings;
-
-use Test::More tests => 18;
-
-use Math::BigInt;
-
-while (<DATA>) {
-    s/#.*$//;                   # remove comments
-    s/\s+$//;                   # remove trailing whitespace
-    next unless length;         # skip empty lines
-
-    my ($in0, $out0, $out1, $out2, $out3) = split /:/;
-    my ($ss, $sa, $es, $ea);
-
-    my $test = q|($ss, $sa, $es, $ea) = |
-             . qq|Math::BigInt -> _bin_str_to_str_parts("$in0")|;
-
-    eval $test;
-    die $@ if $@;       # this should never happen
-
-    subtest $test => sub {
-        plan tests => 4;
-        is($ss, $out0, 'sign of the significand');
-        is($sa, $out1, 'absolute value of the significand');
-        is($es, $out2, 'sign of the exponent');
-        is($ea, $out3, 'absolute value of the exponent');
-    };
-}
-
-__DATA__
-
-0:+:0:+:0
-0p-0:+:0:+:0
-0p-7:+:0:+:0
-0p+7:+:0:+:0
-
-0.0110:+:.011:+:0
-0110.0:+:110:+:0
-0110.0110:+:110.011:+:0
-
-0b1.p0:+:1:+:0
-
-00.0011001100P0056007800:+:.00110011:+:56007800
-
-+1__1__.__1__1__p+5__6__:+:11.11:+:56
-+1__1__.__1__1__p-5__6__:+:11.11:-:56
--1__1__.__1__1__p+5__6__:-:11.11:+:56
--1__1__.__1__1__p-5__6__:-:11.11:-:56
-
-1__1__.__1__1__p5__6__:+:11.11:+:56
-1__1__.__1__1__p-5__6__:+:11.11:-:56
--1__1__.__1__1__p5__6__:-:11.11:+:56
-
--0b__1__1__.__1__1__p-1__1__:-:11.11:-:11
--0B__1__1__.__1__1__P-1__1__:-:11.11:-:11
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/_dec_parts_to_lib_parts.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/_dec_parts_to_lib_parts.t
deleted file mode 100644 (file)
index dd4f4a4..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-# -*- mode: perl; -*-
-
-use strict;
-use warnings;
-
-use Test::More tests => 30;
-
-use Math::BigInt;
-
-my $LIB = Math::BigInt -> config('lib');
-
-sub try {
-    my ($in0, $in1, $in2, $in3, $out0, $out1, $out2, $out3) = @_;
-
-    my @out;
-    my $test = q|@out = Math::BigInt -> _dec_parts_to_lib_parts|
-             . qq|("$in0", "$in1", "$in2", "$in3")|;
-
-    eval $test;
-    die $@ if $@;       # this should never happen
-
-    subtest $test => sub {
-        plan tests => 5;
-
-        is(scalar(@out), 4, 'number of output arguments');
-        is($out[0], $out0, 'sign of the significand');
-        is($LIB -> _str($out[1]), $out1, 'absolute value of the significand');
-        is($out[2], $out2, 'sign of the exponent');
-        is($LIB -> _str($out[3]), $out3, 'absolute value of the exponent');
-    };
-}
-
-try qw< + 0      + 0     >, qw< + 0 + 0 >;
-try qw< + 00.000 - 0000  >, qw< + 0 + 0 >;
-
-try qw<    + 0.01230 + 5 >, qw< + 123 + 1 >;
-try qw<    + 0.1230  + 5 >, qw< + 123 + 2 >;
-try qw<    + 1.230   + 5 >, qw< + 123 + 3 >;
-try qw<   + 12.30    + 5 >, qw< + 123 + 4 >;
-try qw<  + 123.0     + 5 >, qw< + 123 + 5 >;
-try qw< + 1230.0     + 5 >, qw< + 123 + 6 >;
-
-try qw<    + 0.01230 + 2 >, qw< + 123 - 2 >;
-try qw<    + 0.1230  + 2 >, qw< + 123 - 1 >;
-try qw<    + 1.230   + 2 >, qw< + 123 + 0 >;
-try qw<   + 12.30    + 2 >, qw< + 123 + 1 >;
-try qw<  + 123.0     + 2 >, qw< + 123 + 2 >;
-try qw< + 1230.0     + 2 >, qw< + 123 + 3 >;
-
-try qw<    + 0.01230 - 2 >, qw< + 123 - 6 >;
-try qw<    + 0.1230  - 2 >, qw< + 123 - 5 >;
-try qw<    + 1.230   - 2 >, qw< + 123 - 4 >;
-try qw<   + 12.30    - 2 >, qw< + 123 - 3 >;
-try qw<  + 123.0     - 2 >, qw< + 123 - 2 >;
-try qw< + 1230.0     - 2 >, qw< + 123 - 1 >;
-
-try qw<    + 0.01230 - 4 >, qw< + 123 - 8 >;
-try qw<    + 0.1230  - 4 >, qw< + 123 - 7 >;
-try qw<    + 1.230   - 4 >, qw< + 123 - 6 >;
-try qw<   + 12.30    - 4 >, qw< + 123 - 5 >;
-try qw<  + 123.0     - 4 >, qw< + 123 - 4 >;
-try qw< + 1230.0     - 4 >, qw< + 123 - 3 >;
-
-try qw< + .0123      + 0 >, qw< + 123 - 4 >;
-try qw< + 12300      + 0 >, qw< + 123 + 2 >;
-
-try qw< + .00120034  + 5 >, qw< + 120034 - 3 >;
-
-try qw< - 1200.0034  + 2 >, qw< - 12000034 - 2 >;
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/_dec_str_to_str_parts.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/_dec_str_to_str_parts.t
deleted file mode 100644 (file)
index d94d8cd..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-# -*- mode: perl; -*-
-
-use strict;
-use warnings;
-
-use Test::More tests => 16;
-
-use Math::BigInt;
-
-while (<DATA>) {
-    s/#.*$//;                   # remove comments
-    s/\s+$//;                   # remove trailing whitespace
-    next unless length;         # skip empty lines
-
-    my ($in0, $out0, $out1, $out2, $out3) = split /:/;
-    my ($ss, $sa, $es, $ea);
-
-    my $test = q|($ss, $sa, $es, $ea) = |
-             . qq|Math::BigInt -> _dec_str_to_str_parts("$in0")|;
-
-    eval $test;
-    die $@ if $@;       # this should never happen
-
-
-
-    subtest $test => sub {
-        plan tests => 4;
-        is($ss, $out0, 'sign of the significand');
-        is($sa, $out1, 'absolute value of the significand');
-        is($es, $out2, 'sign of the exponent');
-        is($ea, $out3, 'absolute value of the exponent');
-    };
-}
-
-__DATA__
-
-0:+:0:+:0
-0e-0:+:0:+:0
-0e-7:+:0:+:0
-0e+7:+:0:+:0
-
-0.0120:+:.012:+:0
-0120.0:+:120:+:0
-0120.0340:+:120.034:+:0
-
-1.e0:+:1:+:0
-
-00.0012003400E0056007800:+:.00120034:+:56007800
-
-+1__2__.__3__4__e+5__6__:+:12.34:+:56
-+1__2__.__3__4__e-5__6__:+:12.34:-:56
--1__2__.__3__4__e+5__6__:-:12.34:+:56
--1__2__.__3__4__e-5__6__:-:12.34:-:56
-
-1__2__.__3__4__e5__6__:+:12.34:+:56
-1__2__.__3__4__e-5__6__:+:12.34:-:56
--1__2__.__3__4__e5__6__:-:12.34:+:56
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/_e_math.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/_e_math.t
deleted file mode 100755 (executable)
index 3cf917b..0000000
+++ /dev/null
@@ -1,116 +0,0 @@
-# -*- mode: perl; -*-
-
-# test the helper math routines in Math::BigFloat
-
-use strict;
-use warnings;
-
-use Test::More tests => 26;
-
-use Math::BigFloat lib => 'Calc';
-
-#############################################################################
-# add
-
-{
-    my $a = Math::BigInt::Calc->_new("123");
-    my $b = Math::BigInt::Calc->_new("321");
-
-    test_add(123, 321, '+', '+');
-    test_add(123, 321, '+', '-');
-    test_add(123, 321, '-', '+');
-
-    test_add(321, 123, '-', '+');
-    test_add(321, 123, '+', '-');
-
-    test_add(10,  1, '+', '-');
-    test_add(10,  1, '-', '+');
-    test_add( 1, 10, '-', '+');
-
-  SKIP: {
-        skip q|$x -> _zero() does not (yet?) modify the first argument|, 2;
-
-        test_add(123, 123, '-', '+');
-        test_add(123, 123, '+', '-');
-    }
-
-    test_add(123, 123, '+', '+');
-    test_add(123, 123, '-', '-');
-
-    test_add(0, 0, '-', '+');
-    test_add(0, 0, '+', '-');
-    test_add(0, 0, '+', '+');
-    test_add(0, 0, '-', '-');          # gives "-0"! TODO: fix this!
-}
-
-#############################################################################
-# sub
-
-{
-    my $a = Math::BigInt::Calc->_new("123");
-    my $b = Math::BigInt::Calc->_new("321");
-
-    test_sub(123, 321, '+', '-');
-    test_sub(123, 321, '-', '+');
-
-    test_sub(123, 123, '-', '+');
-    test_sub(123, 123, '+', '-');
-
-  SKIP: {
-        skip q|$x -> _zero() does not (yet?) modify the first argument|, 2;
-
-        test_sub(123, 123, '+', '+');
-        test_sub(123, 123, '-', '-');
-    }
-
-    test_sub(0, 0, '-', '+');          # gives "-0"! TODO: fix this!
-    test_sub(0, 0, '+', '-');
-    test_sub(0, 0, '+', '+');
-    test_sub(0, 0, '-', '-');
-}
-
-###############################################################################
-
-sub test_add {
-    my ($a, $b, $as, $bs) = @_;
-
-    my $aa = Math::BigInt::Calc -> _new($a);
-    my $bb = Math::BigInt::Calc -> _new($b);
-    my ($x, $xs) = Math::BigFloat::_e_add($aa, $bb, "$as", "$bs");
-    my $got = $xs . Math::BigInt::Calc->_str($x);
-
-    my $expected = sprintf("%+d", "$as$a" + "$bs$b");
-
-    subtest qq|Math::BigFloat::_e_add($a, $b, "$as", "$bs");|
-      => sub {
-          plan tests => 2;
-
-          is($got, $expected, 'output has the correct value');
-          is(Math::BigInt::Calc->_str($x),
-             Math::BigInt::Calc->_str($aa),
-             'first operand to _e_add() is modified'
-            );
-      };
-}
-
-sub test_sub {
-    my ($a, $b, $as, $bs) = @_;
-
-    my $aa = Math::BigInt::Calc -> _new($a);
-    my $bb = Math::BigInt::Calc -> _new($b);
-    my ($x, $xs) = Math::BigFloat::_e_sub($aa, $bb, "$as", "$bs");
-    my $got = $xs . Math::BigInt::Calc->_str($x);
-
-    my $expected = sprintf("%+d", "$as$a" - "$bs$b");
-
-    subtest qq|Math::BigFloat::_e_sub($a, $b, "$as", "$bs");|
-      => sub {
-          plan tests => 2;
-
-          is($got, $expected, 'output has the correct value');
-          is(Math::BigInt::Calc->_str($x),
-             Math::BigInt::Calc->_str($aa),
-             'first operand to _e_sub() is modified'
-            );
-      };
-}
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/_hex_str_to_str_parts.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/_hex_str_to_str_parts.t
deleted file mode 100644 (file)
index 02bdd13..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-# -*- mode: perl; -*-
-
-use strict;
-use warnings;
-
-use Test::More tests => 18;
-
-use Math::BigInt;
-
-while (<DATA>) {
-    s/#.*$//;                   # remove comments
-    s/\s+$//;                   # remove trailing whitespace
-    next unless length;         # skip empty lines
-
-    my ($in0, $out0, $out1, $out2, $out3) = split /:/;
-    my ($ss, $sa, $es, $ea);
-
-    my $test = q|($ss, $sa, $es, $ea) = |
-             . qq|Math::BigInt -> _hex_str_to_str_parts("$in0")|;
-
-    eval $test;
-    die $@ if $@;       # this should never happen
-
-    subtest $test => sub {
-        plan tests => 4;
-        is($ss, $out0, 'sign of the significand');
-        is($sa, $out1, 'absolute value of the significand');
-        is($es, $out2, 'sign of the exponent');
-        is($ea, $out3, 'absolute value of the exponent');
-    };
-}
-
-__DATA__
-
-0:+:0:+:0
-0p-0:+:0:+:0
-0p-7:+:0:+:0
-0p+7:+:0:+:0
-
-0.0120:+:.012:+:0
-0120.0:+:120:+:0
-0120.0340:+:120.034:+:0
-
-0x1.p0:+:1:+:0
-
-00.0012003400P0056007800:+:.00120034:+:56007800
-
-+1__2__.__3__4__p+5__6__:+:12.34:+:56
-+1__2__.__3__4__p-5__6__:+:12.34:-:56
--1__2__.__3__4__p+5__6__:-:12.34:+:56
--1__2__.__3__4__p-5__6__:-:12.34:-:56
-
-1__2__.__3__4__p5__6__:+:12.34:+:56
-1__2__.__3__4__p-5__6__:+:12.34:-:56
--1__2__.__3__4__p5__6__:-:12.34:+:56
-
--0x__a__b__.__c__d__p-1__2__:-:ab.cd:-:12
--0X__A__B__.__C__D__P-1__2__:-:AB.CD:-:12
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/_oct_str_to_str_parts.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/_oct_str_to_str_parts.t
deleted file mode 100644 (file)
index c6431f2..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-# -*- mode: perl; -*-
-
-use strict;
-use warnings;
-
-use Test::More tests => 18;
-
-use Math::BigInt;
-
-while (<DATA>) {
-    s/#.*$//;                   # remove comments
-    s/\s+$//;                   # remove trailing whitespace
-    next unless length;         # skip empty lines
-
-    my ($in0, $out0, $out1, $out2, $out3) = split /:/;
-    my ($ss, $sa, $es, $ea);
-
-    my $test = q|($ss, $sa, $es, $ea) = |
-      . qq|Math::BigInt -> _oct_str_to_str_parts("$in0")|;
-
-    eval $test;
-    die $@ if $@;       # this should never happen
-
-    subtest $test => sub {
-        plan tests => 4;
-        is($ss, $out0, 'sign of the significand');
-        is($sa, $out1, 'absolute value of the significand');
-        is($es, $out2, 'sign of the exponent');
-        is($ea, $out3, 'absolute value of the exponent');
-    };
-}
-
-__DATA__
-
-0:+:0:+:0
-0p-0:+:0:+:0
-0p-7:+:0:+:0
-0p+7:+:0:+:0
-
-0.0120:+:.012:+:0
-0120.0:+:120:+:0
-0120.0340:+:120.034:+:0
-
-01.p0:+:1:+:0
-
-00.0012003400P0056007800:+:.00120034:+:56007800
-
-+0__1__2__.__3__4__p+5__6__:+:12.34:+:56
-+0__1__2__.__3__4__p-5__6__:+:12.34:-:56
--0__1__2__.__3__4__p+5__6__:-:12.34:+:56
--0__1__2__.__3__4__p-5__6__:-:12.34:-:56
-
-01__2__.__3__4__p5__6__:+:12.34:+:56
-1__2__.__3__4__p-5__6__:+:12.34:-:56
--1__2__.__3__4__p5__6__:-:12.34:+:56
-
--0o__1__2__.__3__4__p-5__6__:-:12.34:-:56
--0O__1__2__.__3__4__P-5__6__:-:12.34:-:56
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/backermann-mbi.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/backermann-mbi.t
deleted file mode 100644 (file)
index cc32dd1..0000000
+++ /dev/null
@@ -1,507 +0,0 @@
-# -*- mode: perl; -*-
-
-use strict;
-use warnings;
-
-use Test::More tests => 858;
-
-my $class;
-
-BEGIN {
-    $class = 'Math::BigInt';
-    use_ok($class);
-}
-
-can_ok($class, 'backermann', 'ackermann');
-
-while (<DATA>) {
-    s/#.*$//;                   # remove comments
-    s/\s+$//;                   # remove trailing whitespace
-    next unless length;         # skip empty lines
-
-    my ($m, $n, $expected) = split /:/;
-
-    # backermann() modifies the invocand.
-
-    {
-        my ($x, $y);
-        my $test = qq|\$x = $class->new("$m"); \$y = \$x->backermann("$n");|;
-
-        subtest $test,
-          sub {
-              plan tests => 4;
-
-              eval $test;
-              is($@, "", "'$test' gives emtpy \$\@");
-
-              is(ref($y), $class,
-                 "'$test' output arg is a $class");
-
-              is($y -> bstr(), $expected,
-                 "'$test' output arg has the right value");
-
-              is($x -> bstr(), $expected,
-                 "'$test' invocand has the right value");
-          };
-    }
-
-    # ackermann() does not modify the invocand.
-
-    {
-        my ($x, $y);
-        my $test = qq|\$x = $class->new("$m"); \$y = \$x->ackermann("$n");|;
-
-        subtest $test,
-          sub {
-              plan tests => 4;
-
-              eval $test;
-              is($@, "", "'$test' gives emtpy \$\@");
-
-              is(ref($y), $class,
-                 "'$test' output arg is a $class");
-
-              is($y -> bstr(), $expected,
-                 "'$test' output arg has the right value");
-
-              is($x -> bstr(), $m,
-                 "'$test' invocand has the right value");
-          };
-    }
-}
-
-__DATA__
-
-0:0:1
-0:1:2
-0:2:3
-0:3:4
-0:4:5
-0:5:6
-0:6:7
-0:7:8
-0:8:9
-0:9:10
-0:10:11
-0:11:12
-0:12:13
-0:13:14
-0:14:15
-0:15:16
-0:16:17
-0:17:18
-0:18:19
-0:19:20
-0:20:21
-0:21:22
-0:22:23
-0:23:24
-0:24:25
-0:25:26
-0:26:27
-0:27:28
-0:28:29
-0:29:30
-0:30:31
-0:31:32
-0:32:33
-0:33:34
-0:34:35
-0:35:36
-0:36:37
-0:37:38
-0:38:39
-0:39:40
-0:40:41
-0:41:42
-0:42:43
-0:43:44
-0:44:45
-0:45:46
-0:46:47
-0:47:48
-0:48:49
-0:49:50
-0:50:51
-0:51:52
-0:52:53
-0:53:54
-0:54:55
-0:55:56
-0:56:57
-0:57:58
-0:58:59
-0:59:60
-0:60:61
-0:61:62
-0:62:63
-0:63:64
-0:64:65
-0:65:66
-0:66:67
-0:67:68
-0:68:69
-0:69:70
-0:70:71
-0:71:72
-0:72:73
-0:73:74
-0:74:75
-0:75:76
-0:76:77
-0:77:78
-0:78:79
-0:79:80
-0:80:81
-0:81:82
-0:82:83
-0:83:84
-0:84:85
-0:85:86
-0:86:87
-0:87:88
-0:88:89
-0:89:90
-0:90:91
-0:91:92
-0:92:93
-0:93:94
-0:94:95
-0:95:96
-0:96:97
-0:97:98
-0:98:99
-0:99:100
-0:100:101
-0:1000:1001
-0:100000:100001
-0:10000000:10000001
-0:10000000000:10000000001
-0:10000000000000:10000000000001
-0:10000000000000000000000000000000000:10000000000000000000000000000000001
-0:12345678987654321012345678987654321:12345678987654321012345678987654322
-
-1:0:2
-1:1:3
-1:2:4
-1:3:5
-1:4:6
-1:5:7
-1:6:8
-1:7:9
-1:8:10
-1:9:11
-1:10:12
-1:11:13
-1:12:14
-1:13:15
-1:14:16
-1:15:17
-1:16:18
-1:17:19
-1:18:20
-1:19:21
-1:20:22
-1:21:23
-1:22:24
-1:23:25
-1:24:26
-1:25:27
-1:26:28
-1:27:29
-1:28:30
-1:29:31
-1:30:32
-1:31:33
-1:32:34
-1:33:35
-1:34:36
-1:35:37
-1:36:38
-1:37:39
-1:38:40
-1:39:41
-1:40:42
-1:41:43
-1:42:44
-1:43:45
-1:44:46
-1:45:47
-1:46:48
-1:47:49
-1:48:50
-1:49:51
-1:50:52
-1:51:53
-1:52:54
-1:53:55
-1:54:56
-1:55:57
-1:56:58
-1:57:59
-1:58:60
-1:59:61
-1:60:62
-1:61:63
-1:62:64
-1:63:65
-1:64:66
-1:65:67
-1:66:68
-1:67:69
-1:68:70
-1:69:71
-1:70:72
-1:71:73
-1:72:74
-1:73:75
-1:74:76
-1:75:77
-1:76:78
-1:77:79
-1:78:80
-1:79:81
-1:80:82
-1:81:83
-1:82:84
-1:83:85
-1:84:86
-1:85:87
-1:86:88
-1:87:89
-1:88:90
-1:89:91
-1:90:92
-1:91:93
-1:92:94
-1:93:95
-1:94:96
-1:95:97
-1:96:98
-1:97:99
-1:98:100
-1:99:101
-1:100:102
-1:1000:1002
-1:100000:100002
-1:10000000:10000002
-1:10000000000:10000000002
-1:10000000000000:10000000000002
-1:10000000000000000000000000000000000:10000000000000000000000000000000002
-1:12345678987654321012345678987654321:12345678987654321012345678987654323
-
-2:0:3
-2:1:5
-2:2:7
-2:3:9
-2:4:11
-2:5:13
-2:6:15
-2:7:17
-2:8:19
-2:9:21
-2:10:23
-2:11:25
-2:12:27
-2:13:29
-2:14:31
-2:15:33
-2:16:35
-2:17:37
-2:18:39
-2:19:41
-2:20:43
-2:21:45
-2:22:47
-2:23:49
-2:24:51
-2:25:53
-2:26:55
-2:27:57
-2:28:59
-2:29:61
-2:30:63
-2:31:65
-2:32:67
-2:33:69
-2:34:71
-2:35:73
-2:36:75
-2:37:77
-2:38:79
-2:39:81
-2:40:83
-2:41:85
-2:42:87
-2:43:89
-2:44:91
-2:45:93
-2:46:95
-2:47:97
-2:48:99
-2:49:101
-2:50:103
-2:51:105
-2:52:107
-2:53:109
-2:54:111
-2:55:113
-2:56:115
-2:57:117
-2:58:119
-2:59:121
-2:60:123
-2:61:125
-2:62:127
-2:63:129
-2:64:131
-2:65:133
-2:66:135
-2:67:137
-2:68:139
-2:69:141
-2:70:143
-2:71:145
-2:72:147
-2:73:149
-2:74:151
-2:75:153
-2:76:155
-2:77:157
-2:78:159
-2:79:161
-2:80:163
-2:81:165
-2:82:167
-2:83:169
-2:84:171
-2:85:173
-2:86:175
-2:87:177
-2:88:179
-2:89:181
-2:90:183
-2:91:185
-2:92:187
-2:93:189
-2:94:191
-2:95:193
-2:96:195
-2:97:197
-2:98:199
-2:99:201
-2:100:203
-2:1000:2003
-2:100000:200003
-2:10000000:20000003
-2:10000000000:20000000003
-2:10000000000000:20000000000003
-2:10000000000000000000000000000000000:20000000000000000000000000000000003
-2:12345678987654321012345678987654321:24691357975308642024691357975308645
-
-3:0:5
-3:1:13
-3:2:29
-3:3:61
-3:4:125
-3:5:253
-3:6:509
-3:7:1021
-3:8:2045
-3:9:4093
-3:10:8189
-3:11:16381
-3:12:32765
-3:13:65533
-3:14:131069
-3:15:262141
-3:16:524285
-3:17:1048573
-3:18:2097149
-3:19:4194301
-3:20:8388605
-3:21:16777213
-3:22:33554429
-3:23:67108861
-3:24:134217725
-3:25:268435453
-3:26:536870909
-3:27:1073741821
-3:28:2147483645
-3:29:4294967293
-3:30:8589934589
-3:31:17179869181
-3:32:34359738365
-3:33:68719476733
-3:34:137438953469
-3:35:274877906941
-3:36:549755813885
-3:37:1099511627773
-3:38:2199023255549
-3:39:4398046511101
-3:40:8796093022205
-3:41:17592186044413
-3:42:35184372088829
-3:43:70368744177661
-3:44:140737488355325
-3:45:281474976710653
-3:46:562949953421309
-3:47:1125899906842621
-3:48:2251799813685245
-3:49:4503599627370493
-3:50:9007199254740989
-3:51:18014398509481981
-3:52:36028797018963965
-3:53:72057594037927933
-3:54:144115188075855869
-3:55:288230376151711741
-3:56:576460752303423485
-3:57:1152921504606846973
-3:58:2305843009213693949
-3:59:4611686018427387901
-3:60:9223372036854775805
-3:61:18446744073709551613
-3:62:36893488147419103229
-3:63:73786976294838206461
-3:64:147573952589676412925
-3:65:295147905179352825853
-3:66:590295810358705651709
-3:67:1180591620717411303421
-3:68:2361183241434822606845
-3:69:4722366482869645213693
-3:70:9444732965739290427389
-3:71:18889465931478580854781
-3:72:37778931862957161709565
-3:73:75557863725914323419133
-3:74:151115727451828646838269
-3:75:302231454903657293676541
-3:76:604462909807314587353085
-3:77:1208925819614629174706173
-3:78:2417851639229258349412349
-3:79:4835703278458516698824701
-3:80:9671406556917033397649405
-3:81:19342813113834066795298813
-3:82:38685626227668133590597629
-3:83:77371252455336267181195261
-3:84:154742504910672534362390525
-3:85:309485009821345068724781053
-3:86:618970019642690137449562109
-3:87:1237940039285380274899124221
-3:88:2475880078570760549798248445
-3:89:4951760157141521099596496893
-3:90:9903520314283042199192993789
-3:91:19807040628566084398385987581
-3:92:39614081257132168796771975165
-3:93:79228162514264337593543950333
-3:94:158456325028528675187087900669
-3:95:316912650057057350374175801341
-3:96:633825300114114700748351602685
-3:97:1267650600228229401496703205373
-3:98:2535301200456458802993406410749
-3:99:5070602400912917605986812821501
-3:100:10141204801825835211973625643005
-
-4:0:13
-4:1:65533
-
-5:0:65533
index f3509cf..76c9069 100755 (executable)
@@ -3,7 +3,7 @@
 use strict;
 use warnings;
 
-use Test::More tests => 4280;           # tests in require'd file
+use Test::More tests => 4278;           # tests in require'd file
 
 use lib 't';
 
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/bdigitsum-mbi.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/bdigitsum-mbi.t
deleted file mode 100644 (file)
index 0991191..0000000
+++ /dev/null
@@ -1,113 +0,0 @@
-# -*- mode: perl; -*-
-
-use strict;
-use warnings;
-
-use Test::More tests => 48;
-
-use Math::BigInt;
-
-my $x;
-my $y;
-
-###############################################################################
-# bdigitsum()
-
-# Finite numbers.
-
-$x = Math::BigInt -> new("123");
-isa_ok($x, 'Math::BigInt');
-$y = $x -> bdigitsum();
-isa_ok($y, 'Math::BigInt');
-is($x, "6");
-is($y, "6");
-
-$x = Math::BigInt -> new("0");
-isa_ok($x, 'Math::BigInt');
-$y = $x -> bdigitsum();
-isa_ok($y, 'Math::BigInt');
-is($x, "0");
-is($y, "0");
-
-$x = Math::BigInt -> new("-123");
-isa_ok($x, 'Math::BigInt');
-$y = $x -> bdigitsum();
-isa_ok($y, 'Math::BigInt');
-is($x, "6");
-is($y, "6");
-
-# Infinity
-
-$x = Math::BigInt -> binf("+");
-isa_ok($x, 'Math::BigInt');
-$y = $x -> bdigitsum();
-isa_ok($y, 'Math::BigInt');
-is($x, "NaN");
-is($y, "NaN");
-
-$x = Math::BigInt -> binf("-");
-isa_ok($x, 'Math::BigInt');
-$y = $x -> bdigitsum();
-isa_ok($y, 'Math::BigInt');
-is($x, "NaN");
-is($y, "NaN");
-
-# NaN
-
-$x = Math::BigInt -> bnan();
-isa_ok($x, 'Math::BigInt');
-$y = $x -> bdigitsum();
-isa_ok($y, 'Math::BigInt');
-is($x, "NaN");
-is($y, "NaN");
-
-###############################################################################
-# digitsum()
-
-# Finite numbers.
-
-$x = Math::BigInt -> new("123");
-isa_ok($x, 'Math::BigInt');
-$y = $x -> digitsum();
-isa_ok($y, 'Math::BigInt');
-is($x, "123");
-is($y, "6");
-
-$x = Math::BigInt -> new("0");
-isa_ok($x, 'Math::BigInt');
-$y = $x -> digitsum();
-isa_ok($y, 'Math::BigInt');
-is($x, "0");
-is($y, "0");
-
-$x = Math::BigInt -> new("-123");
-isa_ok($x, 'Math::BigInt');
-$y = $x -> digitsum();
-isa_ok($y, 'Math::BigInt');
-is($x, "-123");
-is($y, "6");
-
-# Infinity
-
-$x = Math::BigInt -> binf("+");
-isa_ok($x, 'Math::BigInt');
-$y = $x -> digitsum();
-isa_ok($y, 'Math::BigInt');
-is($x, "inf");
-is($y, "NaN");
-
-$x = Math::BigInt -> binf("-");
-isa_ok($x, 'Math::BigInt');
-$y = $x -> digitsum();
-isa_ok($y, 'Math::BigInt');
-is($x, "-inf");
-is($y, "NaN");
-
-# NaN
-
-$x = Math::BigInt -> bnan();
-isa_ok($x, 'Math::BigInt');
-$y = $x -> digitsum();
-isa_ok($y, 'Math::BigInt');
-is($x, "NaN");
-is($y, "NaN");
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/bdstr-mbf.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/bdstr-mbf.t
deleted file mode 100644 (file)
index 950ae6f..0000000
+++ /dev/null
@@ -1,275 +0,0 @@
-# -*- mode: perl; -*-
-
-use strict;
-use warnings;
-
-use Test::More tests => 460;
-
-use Math::BigFloat;
-
-while (<DATA>) {
-    s/#.*$//;                   # remove comments
-    s/\s+$//;                   # remove trailing whitespace
-    next unless length;         # skip empty lines
-
-    my ($x_str, $expected) = split /:/;
-    my ($x, $str);
-
-    my $test = qq|\$x = Math::BigFloat -> new("$x_str");|
-             . qq| \$str = \$x -> bdstr();|;
-
-    note "\n$test\n\n";
-    eval $test;
-
-    is($str, $expected, qq|input value is "$x_str"|);
-    is($x,   $x_str, "input object is unmodified");
-}
-
-__DATA__
-
-NaN:NaN
-
-inf:inf
--inf:-inf
-
-0:0
-
-# positive numbers
-
-0.000000000001:0.000000000001
-0.00000000001:0.00000000001
-0.0000000001:0.0000000001
-0.000000001:0.000000001
-0.00000001:0.00000001
-0.0000001:0.0000001
-0.000001:0.000001
-0.00001:0.00001
-0.0001:0.0001
-0.001:0.001
-0.01:0.01
-0.1:0.1
-1:1
-10:10
-100:100
-1000:1000
-10000:10000
-100000:100000
-1000000:1000000
-10000000:10000000
-100000000:100000000
-1000000000:1000000000
-10000000000:10000000000
-100000000000:100000000000
-1000000000000:1000000000000
-
-0.0000000000012:0.0000000000012
-0.000000000012:0.000000000012
-0.00000000012:0.00000000012
-0.0000000012:0.0000000012
-0.000000012:0.000000012
-0.00000012:0.00000012
-0.0000012:0.0000012
-0.000012:0.000012
-0.00012:0.00012
-0.0012:0.0012
-0.012:0.012
-0.12:0.12
-1.2:1.2
-12:12
-120:120
-1200:1200
-12000:12000
-120000:120000
-1200000:1200000
-12000000:12000000
-120000000:120000000
-1200000000:1200000000
-12000000000:12000000000
-120000000000:120000000000
-1200000000000:1200000000000
-
-0.00000000000123:0.00000000000123
-0.0000000000123:0.0000000000123
-0.000000000123:0.000000000123
-0.00000000123:0.00000000123
-0.0000000123:0.0000000123
-0.000000123:0.000000123
-0.00000123:0.00000123
-0.0000123:0.0000123
-0.000123:0.000123
-0.00123:0.00123
-0.0123:0.0123
-0.123:0.123
-1.23:1.23
-12.3:12.3
-123:123
-1230:1230
-12300:12300
-123000:123000
-1230000:1230000
-12300000:12300000
-123000000:123000000
-1230000000:1230000000
-12300000000:12300000000
-123000000000:123000000000
-1230000000000:1230000000000
-
-0.000000000001234:0.000000000001234
-0.00000000001234:0.00000000001234
-0.0000000001234:0.0000000001234
-0.000000001234:0.000000001234
-0.00000001234:0.00000001234
-0.0000001234:0.0000001234
-0.000001234:0.000001234
-0.00001234:0.00001234
-0.0001234:0.0001234
-0.001234:0.001234
-0.01234:0.01234
-0.1234:0.1234
-1.234:1.234
-12.34:12.34
-123.4:123.4
-1234:1234
-12340:12340
-123400:123400
-1234000:1234000
-12340000:12340000
-123400000:123400000
-1234000000:1234000000
-12340000000:12340000000
-123400000000:123400000000
-1234000000000:1234000000000
-
-0.000003141592:0.000003141592
-0.00003141592:0.00003141592
-0.0003141592:0.0003141592
-0.003141592:0.003141592
-0.03141592:0.03141592
-0.3141592:0.3141592
-3.141592:3.141592
-31.41592:31.41592
-314.1592:314.1592
-3141.592:3141.592
-31415.92:31415.92
-314159.2:314159.2
-3141592:3141592
-
-# negative numbers
-
--0.000000000001:-0.000000000001
--0.00000000001:-0.00000000001
--0.0000000001:-0.0000000001
--0.000000001:-0.000000001
--0.00000001:-0.00000001
--0.0000001:-0.0000001
--0.000001:-0.000001
--0.00001:-0.00001
--0.0001:-0.0001
--0.001:-0.001
--0.01:-0.01
--0.1:-0.1
--1:-1
--10:-10
--100:-100
--1000:-1000
--10000:-10000
--100000:-100000
--1000000:-1000000
--10000000:-10000000
--100000000:-100000000
--1000000000:-1000000000
--10000000000:-10000000000
--100000000000:-100000000000
--1000000000000:-1000000000000
-
--0.0000000000012:-0.0000000000012
--0.000000000012:-0.000000000012
--0.00000000012:-0.00000000012
--0.0000000012:-0.0000000012
--0.000000012:-0.000000012
--0.00000012:-0.00000012
--0.0000012:-0.0000012
--0.000012:-0.000012
--0.00012:-0.00012
--0.0012:-0.0012
--0.012:-0.012
--0.12:-0.12
--1.2:-1.2
--12:-12
--120:-120
--1200:-1200
--12000:-12000
--120000:-120000
--1200000:-1200000
--12000000:-12000000
--120000000:-120000000
--1200000000:-1200000000
--12000000000:-12000000000
--120000000000:-120000000000
--1200000000000:-1200000000000
-
--0.00000000000123:-0.00000000000123
--0.0000000000123:-0.0000000000123
--0.000000000123:-0.000000000123
--0.00000000123:-0.00000000123
--0.0000000123:-0.0000000123
--0.000000123:-0.000000123
--0.00000123:-0.00000123
--0.0000123:-0.0000123
--0.000123:-0.000123
--0.00123:-0.00123
--0.0123:-0.0123
--0.123:-0.123
--1.23:-1.23
--12.3:-12.3
--123:-123
--1230:-1230
--12300:-12300
--123000:-123000
--1230000:-1230000
--12300000:-12300000
--123000000:-123000000
--1230000000:-1230000000
--12300000000:-12300000000
--123000000000:-123000000000
--1230000000000:-1230000000000
-
--0.000000000001234:-0.000000000001234
--0.00000000001234:-0.00000000001234
--0.0000000001234:-0.0000000001234
--0.000000001234:-0.000000001234
--0.00000001234:-0.00000001234
--0.0000001234:-0.0000001234
--0.000001234:-0.000001234
--0.00001234:-0.00001234
--0.0001234:-0.0001234
--0.001234:-0.001234
--0.01234:-0.01234
--0.1234:-0.1234
--1.234:-1.234
--12.34:-12.34
--123.4:-123.4
--1234:-1234
--12340:-12340
--123400:-123400
--1234000:-1234000
--12340000:-12340000
--123400000:-123400000
--1234000000:-1234000000
--12340000000:-12340000000
--123400000000:-123400000000
--1234000000000:-1234000000000
-
--0.000003141592:-0.000003141592
--0.00003141592:-0.00003141592
--0.0003141592:-0.0003141592
--0.003141592:-0.003141592
--0.03141592:-0.03141592
--0.3141592:-0.3141592
--3.141592:-3.141592
--31.41592:-31.41592
--314.1592:-314.1592
--3141.592:-3141.592
--31415.92:-31415.92
--314159.2:-314159.2
--3141592:-3141592
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/bdstr-mbi.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/bdstr-mbi.t
deleted file mode 100644 (file)
index 6867161..0000000
+++ /dev/null
@@ -1,155 +0,0 @@
-# -*- mode: perl; -*-
-
-use strict;
-use warnings;
-
-use Test::More tests => 220;
-
-use Math::BigInt;
-
-while (<DATA>) {
-    s/#.*$//;                   # remove comments
-    s/\s+$//;                   # remove trailing whitespace
-    next unless length;         # skip empty lines
-
-    my ($x_str, $expected) = split /:/;
-    my ($x, $str);
-
-    my $test = qq|\$x = Math::BigInt -> new("$x_str");|
-             . qq| \$str = \$x -> bdstr();|;
-
-    note "\n$test\n\n";
-    eval $test;
-
-    is($str, $expected, qq|input value is "$x_str"|);
-    is($x,   $x_str, "input object is unmodified");
-}
-
-__DATA__
-
-NaN:NaN
-
-inf:inf
--inf:-inf
-
-0:0
-
-# positive numbers
-
-1:1
-10:10
-100:100
-1000:1000
-10000:10000
-100000:100000
-1000000:1000000
-10000000:10000000
-100000000:100000000
-1000000000:1000000000
-10000000000:10000000000
-100000000000:100000000000
-1000000000000:1000000000000
-
-12:12
-120:120
-1200:1200
-12000:12000
-120000:120000
-1200000:1200000
-12000000:12000000
-120000000:120000000
-1200000000:1200000000
-12000000000:12000000000
-120000000000:120000000000
-1200000000000:1200000000000
-
-123:123
-1230:1230
-12300:12300
-123000:123000
-1230000:1230000
-12300000:12300000
-123000000:123000000
-1230000000:1230000000
-12300000000:12300000000
-123000000000:123000000000
-1230000000000:1230000000000
-
-1234:1234
-12340:12340
-123400:123400
-1234000:1234000
-12340000:12340000
-123400000:123400000
-1234000000:1234000000
-12340000000:12340000000
-123400000000:123400000000
-1234000000000:1234000000000
-
-3:3
-31:31
-314:314
-3141:3141
-31415:31415
-314159:314159
-3141592:3141592
-
-# negative numbers
-
--1:-1
--10:-10
--100:-100
--1000:-1000
--10000:-10000
--100000:-100000
--1000000:-1000000
--10000000:-10000000
--100000000:-100000000
--1000000000:-1000000000
--10000000000:-10000000000
--100000000000:-100000000000
--1000000000000:-1000000000000
-
--12:-12
--120:-120
--1200:-1200
--12000:-12000
--120000:-120000
--1200000:-1200000
--12000000:-12000000
--120000000:-120000000
--1200000000:-1200000000
--12000000000:-12000000000
--120000000000:-120000000000
--1200000000000:-1200000000000
-
--123:-123
--1230:-1230
--12300:-12300
--123000:-123000
--1230000:-1230000
--12300000:-12300000
--123000000:-123000000
--1230000000:-1230000000
--12300000000:-12300000000
--123000000000:-123000000000
--1230000000000:-1230000000000
-
--1234:-1234
--12340:-12340
--123400:-123400
--1234000:-1234000
--12340000:-12340000
--123400000:-123400000
--1234000000:-1234000000
--12340000000:-12340000000
--123400000000:-123400000000
--1234000000000:-1234000000000
-
--3:-3
--31:-31
--314:-314
--3141:-3141
--31415:-31415
--314159:-314159
--3141592:-3141592
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/bestr-mbf.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/bestr-mbf.t
deleted file mode 100644 (file)
index 12277a5..0000000
+++ /dev/null
@@ -1,275 +0,0 @@
-# -*- mode: perl; -*-
-
-use strict;
-use warnings;
-
-use Test::More tests => 460;
-
-use Math::BigFloat;
-
-while (<DATA>) {
-    s/#.*$//;                   # remove comments
-    s/\s+$//;                   # remove trailing whitespace
-    next unless length;         # skip empty lines
-
-    my ($x_str, $expected) = split /:/;
-    my ($x, $str);
-
-    my $test = qq|\$x = Math::BigFloat -> new("$x_str");|
-             . qq| \$str = \$x -> bestr();|;
-
-    note "\n$test\n\n";
-    eval $test;
-
-    is($str, $expected, qq|input value is "$x_str"|);
-    is($x,   $x_str, "input object is unmodified");
-}
-
-__DATA__
-
-NaN:NaN
-
-inf:inf
--inf:-inf
-
-0:0e+0
-
-# positive numbers
-
-0.000000000001:1e-12
-0.00000000001:10e-12
-0.0000000001:100e-12
-0.000000001:1e-9
-0.00000001:10e-9
-0.0000001:100e-9
-0.000001:1e-6
-0.00001:10e-6
-0.0001:100e-6
-0.001:1e-3
-0.01:10e-3
-0.1:100e-3
-1:1e+0
-10:10e+0
-100:100e+0
-1000:1e+3
-10000:10e+3
-100000:100e+3
-1000000:1e+6
-10000000:10e+6
-100000000:100e+6
-1000000000:1e+9
-10000000000:10e+9
-100000000000:100e+9
-1000000000000:1e+12
-
-0.0000000000012:1.2e-12
-0.000000000012:12e-12
-0.00000000012:120e-12
-0.0000000012:1.2e-9
-0.000000012:12e-9
-0.00000012:120e-9
-0.0000012:1.2e-6
-0.000012:12e-6
-0.00012:120e-6
-0.0012:1.2e-3
-0.012:12e-3
-0.12:120e-3
-1.2:1.2e+0
-12:12e+0
-120:120e+0
-1200:1.2e+3
-12000:12e+3
-120000:120e+3
-1200000:1.2e+6
-12000000:12e+6
-120000000:120e+6
-1200000000:1.2e+9
-12000000000:12e+9
-120000000000:120e+9
-1200000000000:1.2e+12
-
-0.00000000000123:1.23e-12
-0.0000000000123:12.3e-12
-0.000000000123:123e-12
-0.00000000123:1.23e-9
-0.0000000123:12.3e-9
-0.000000123:123e-9
-0.00000123:1.23e-6
-0.0000123:12.3e-6
-0.000123:123e-6
-0.00123:1.23e-3
-0.0123:12.3e-3
-0.123:123e-3
-1.23:1.23e+0
-12.3:12.3e+0
-123:123e+0
-1230:1.23e+3
-12300:12.3e+3
-123000:123e+3
-1230000:1.23e+6
-12300000:12.3e+6
-123000000:123e+6
-1230000000:1.23e+9
-12300000000:12.3e+9
-123000000000:123e+9
-1230000000000:1.23e+12
-
-0.000000000001234:1.234e-12
-0.00000000001234:12.34e-12
-0.0000000001234:123.4e-12
-0.000000001234:1.234e-9
-0.00000001234:12.34e-9
-0.0000001234:123.4e-9
-0.000001234:1.234e-6
-0.00001234:12.34e-6
-0.0001234:123.4e-6
-0.001234:1.234e-3
-0.01234:12.34e-3
-0.1234:123.4e-3
-1.234:1.234e+0
-12.34:12.34e+0
-123.4:123.4e+0
-1234:1.234e+3
-12340:12.34e+3
-123400:123.4e+3
-1234000:1.234e+6
-12340000:12.34e+6
-123400000:123.4e+6
-1234000000:1.234e+9
-12340000000:12.34e+9
-123400000000:123.4e+9
-1234000000000:1.234e+12
-
-0.000003141592:3.141592e-6
-0.00003141592:31.41592e-6
-0.0003141592:314.1592e-6
-0.003141592:3.141592e-3
-0.03141592:31.41592e-3
-0.3141592:314.1592e-3
-3.141592:3.141592e+0
-31.41592:31.41592e+0
-314.1592:314.1592e+0
-3141.592:3.141592e+3
-31415.92:31.41592e+3
-314159.2:314.1592e+3
-3141592:3.141592e+6
-
-# negative numbers
-
--0.000000000001:-1e-12
--0.00000000001:-10e-12
--0.0000000001:-100e-12
--0.000000001:-1e-9
--0.00000001:-10e-9
--0.0000001:-100e-9
--0.000001:-1e-6
--0.00001:-10e-6
--0.0001:-100e-6
--0.001:-1e-3
--0.01:-10e-3
--0.1:-100e-3
--1:-1e+0
--10:-10e+0
--100:-100e+0
--1000:-1e+3
--10000:-10e+3
--100000:-100e+3
--1000000:-1e+6
--10000000:-10e+6
--100000000:-100e+6
--1000000000:-1e+9
--10000000000:-10e+9
--100000000000:-100e+9
--1000000000000:-1e+12
-
--0.0000000000012:-1.2e-12
--0.000000000012:-12e-12
--0.00000000012:-120e-12
--0.0000000012:-1.2e-9
--0.000000012:-12e-9
--0.00000012:-120e-9
--0.0000012:-1.2e-6
--0.000012:-12e-6
--0.00012:-120e-6
--0.0012:-1.2e-3
--0.012:-12e-3
--0.12:-120e-3
--1.2:-1.2e+0
--12:-12e+0
--120:-120e+0
--1200:-1.2e+3
--12000:-12e+3
--120000:-120e+3
--1200000:-1.2e+6
--12000000:-12e+6
--120000000:-120e+6
--1200000000:-1.2e+9
--12000000000:-12e+9
--120000000000:-120e+9
--1200000000000:-1.2e+12
-
--0.00000000000123:-1.23e-12
--0.0000000000123:-12.3e-12
--0.000000000123:-123e-12
--0.00000000123:-1.23e-9
--0.0000000123:-12.3e-9
--0.000000123:-123e-9
--0.00000123:-1.23e-6
--0.0000123:-12.3e-6
--0.000123:-123e-6
--0.00123:-1.23e-3
--0.0123:-12.3e-3
--0.123:-123e-3
--1.23:-1.23e+0
--12.3:-12.3e+0
--123:-123e+0
--1230:-1.23e+3
--12300:-12.3e+3
--123000:-123e+3
--1230000:-1.23e+6
--12300000:-12.3e+6
--123000000:-123e+6
--1230000000:-1.23e+9
--12300000000:-12.3e+9
--123000000000:-123e+9
--1230000000000:-1.23e+12
-
--0.000000000001234:-1.234e-12
--0.00000000001234:-12.34e-12
--0.0000000001234:-123.4e-12
--0.000000001234:-1.234e-9
--0.00000001234:-12.34e-9
--0.0000001234:-123.4e-9
--0.000001234:-1.234e-6
--0.00001234:-12.34e-6
--0.0001234:-123.4e-6
--0.001234:-1.234e-3
--0.01234:-12.34e-3
--0.1234:-123.4e-3
--1.234:-1.234e+0
--12.34:-12.34e+0
--123.4:-123.4e+0
--1234:-1.234e+3
--12340:-12.34e+3
--123400:-123.4e+3
--1234000:-1.234e+6
--12340000:-12.34e+6
--123400000:-123.4e+6
--1234000000:-1.234e+9
--12340000000:-12.34e+9
--123400000000:-123.4e+9
--1234000000000:-1.234e+12
-
--0.000003141592:-3.141592e-6
--0.00003141592:-31.41592e-6
--0.0003141592:-314.1592e-6
--0.003141592:-3.141592e-3
--0.03141592:-31.41592e-3
--0.3141592:-314.1592e-3
--3.141592:-3.141592e+0
--31.41592:-31.41592e+0
--314.1592:-314.1592e+0
--3141.592:-3.141592e+3
--31415.92:-31.41592e+3
--314159.2:-314.1592e+3
--3141592:-3.141592e+6
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/bestr-mbi.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/bestr-mbi.t
deleted file mode 100644 (file)
index 8c4c0bd..0000000
+++ /dev/null
@@ -1,155 +0,0 @@
-# -*- mode: perl; -*-
-
-use strict;
-use warnings;
-
-use Test::More tests => 220;
-
-use Math::BigInt;
-
-while (<DATA>) {
-    s/#.*$//;                   # remove comments
-    s/\s+$//;                   # remove trailing whitespace
-    next unless length;         # skip empty lines
-
-    my ($x_str, $expected) = split /:/;
-    my ($x, $str);
-
-    my $test = qq|\$x = Math::BigInt -> new("$x_str");|
-             . qq| \$str = \$x -> bestr();|;
-
-    note "\n$test\n\n";
-    eval $test;
-
-    is($str, $expected, qq|input value is "$x_str"|);
-    is($x,   $x_str, "input object is unmodified");
-}
-
-__DATA__
-
-NaN:NaN
-
-inf:inf
--inf:-inf
-
-0:0e+0
-
-# positive numbers
-
-1:1e+0
-10:10e+0
-100:100e+0
-1000:1e+3
-10000:10e+3
-100000:100e+3
-1000000:1e+6
-10000000:10e+6
-100000000:100e+6
-1000000000:1e+9
-10000000000:10e+9
-100000000000:100e+9
-1000000000000:1e+12
-
-12:12e+0
-120:120e+0
-1200:1.2e+3
-12000:12e+3
-120000:120e+3
-1200000:1.2e+6
-12000000:12e+6
-120000000:120e+6
-1200000000:1.2e+9
-12000000000:12e+9
-120000000000:120e+9
-1200000000000:1.2e+12
-
-123:123e+0
-1230:1.23e+3
-12300:12.3e+3
-123000:123e+3
-1230000:1.23e+6
-12300000:12.3e+6
-123000000:123e+6
-1230000000:1.23e+9
-12300000000:12.3e+9
-123000000000:123e+9
-1230000000000:1.23e+12
-
-1234:1.234e+3
-12340:12.34e+3
-123400:123.4e+3
-1234000:1.234e+6
-12340000:12.34e+6
-123400000:123.4e+6
-1234000000:1.234e+9
-12340000000:12.34e+9
-123400000000:123.4e+9
-1234000000000:1.234e+12
-
-3:3e+0
-31:31e+0
-314:314e+0
-3141:3.141e+3
-31415:31.415e+3
-314159:314.159e+3
-3141592:3.141592e+6
-
-# negative numbers
-
--1:-1e+0
--10:-10e+0
--100:-100e+0
--1000:-1e+3
--10000:-10e+3
--100000:-100e+3
--1000000:-1e+6
--10000000:-10e+6
--100000000:-100e+6
--1000000000:-1e+9
--10000000000:-10e+9
--100000000000:-100e+9
--1000000000000:-1e+12
-
--12:-12e+0
--120:-120e+0
--1200:-1.2e+3
--12000:-12e+3
--120000:-120e+3
--1200000:-1.2e+6
--12000000:-12e+6
--120000000:-120e+6
--1200000000:-1.2e+9
--12000000000:-12e+9
--120000000000:-120e+9
--1200000000000:-1.2e+12
-
--123:-123e+0
--1230:-1.23e+3
--12300:-12.3e+3
--123000:-123e+3
--1230000:-1.23e+6
--12300000:-12.3e+6
--123000000:-123e+6
--1230000000:-1.23e+9
--12300000000:-12.3e+9
--123000000000:-123e+9
--1230000000000:-1.23e+12
-
--1234:-1.234e+3
--12340:-12.34e+3
--123400:-123.4e+3
--1234000:-1.234e+6
--12340000:-12.34e+6
--123400000:-123.4e+6
--1234000000:-1.234e+9
--12340000000:-12.34e+9
--123400000000:-123.4e+9
--1234000000000:-1.234e+12
-
--3:-3e+0
--31:-31e+0
--314:-314e+0
--3141:-3.141e+3
--31415:-31.415e+3
--314159:-314.159e+3
--3141592:-3.141592e+6
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/bfib-mbi.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/bfib-mbi.t
deleted file mode 100644 (file)
index 91e7aaf..0000000
+++ /dev/null
@@ -1,86 +0,0 @@
-# -*- mode: perl; -*-
-
-use strict;
-use warnings;
-
-use Test::More tests => 15;
-
-use Math::BigInt;
-
-my $x;
-
-###############################################################################
-# Scalar context.
-###############################################################################
-
-my $y;
-
-# Finite numbers.
-
-$x = Math::BigInt -> new("-20");
-$y = $x -> bfib();
-is($y, "-6765", "bfib(-20)");
-
-$x = Math::BigInt -> new("-15");
-$y = $x -> bfib();
-is($y, "610", "bfib(-15)");
-
-$x = Math::BigInt -> new("-2");
-$y = $x -> bfib();
-is($y, "-1", "bfib(-2)");
-
-$x = Math::BigInt -> new("-1");
-$y = $x -> bfib();
-is($y, "1", "bfib(-1)");
-
-$x = Math::BigInt -> new("0");
-$y = $x -> bfib();
-is($y, "0", "bfib(0)");
-
-$x = Math::BigInt -> new("1");
-$y = $x -> bfib();
-is($y, "1", "bfib(1)");
-
-$x = Math::BigInt -> new("2");
-$y = $x -> bfib();
-is($y, "1", "bfib(2)");
-
-$x = Math::BigInt -> new("15");
-$y = $x -> bfib();
-is($y, "610", "bfib(15)");
-
-$x = Math::BigInt -> new("20");
-$y = $x -> bfib();
-is($y, "6765", "bfib(20)");
-
-$x = Math::BigInt -> new("250");
-$y = $x -> bfib();
-is($y, "7896325826131730509282738943634332893686268675876375", "bfib(250)");
-
-# Infinites and NaN.
-
-$x = Math::BigInt -> binf("+");
-$y = $x -> bfib();
-is($y, "inf", "bfib(+inf)");
-
-$x = Math::BigInt -> binf("-");
-$y = $x -> bfib();
-is($y, "NaN", "bfib(-inf)");
-
-$x = Math::BigInt -> bnan();
-$y = $x -> bfib();
-is($y, "NaN", "bfib(NaN)");
-
-###############################################################################
-# List context.
-###############################################################################
-
-my @y;
-
-$x = Math::BigInt -> new("10");
-@y = $x -> bfib();
-is_deeply(\@y, [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55], "bfib(10)");
-
-$x = Math::BigInt -> new("-10");
-@y = $x -> bfib();
-is_deeply(\@y, [0, 1, -1, 2, -3, 5, -8, 13, -21, 34, -55], "bfib(-10)");
index 0b25505..bd7e285 100644 (file)
@@ -44,7 +44,8 @@ while (<DATA>) {
     } elsif ($f eq "binf") {
         $try .= qq| \$x->binf("$args[1]");|;
     } elsif ($f eq "bone") {
-        $try .= qq| \$x->bone("$args[1]");|;
+        $try .= length($args[1]) ? qq| \$x->bone("$args[1]");|
+                                 : qq| \$x->bone();|;
     } elsif ($f eq "bstr") {
         $try .= qq| \$x->accuracy($args[1]); \$x->precision($args[2]);|;
         $try .= ' $x->bstr();';
@@ -524,8 +525,8 @@ NaN:10:NaN
 -inf:10:NaN
 1.2:10:0.3623577545
 2.4:12:-0.737393715541
-0:10:1
-0:20:1
+0:10:1.000000000
+0:20:1.0000000000000000000
 1:10:0.5403023059
 1:12:0.540302305868
 
@@ -867,7 +868,7 @@ abc:NaN
 0::1
 -2::1
 abc::1
-2:abc:1
+2::1
 
 &bsstr
 +inf:inf
index 3090699..ae029a2 100644 (file)
@@ -1415,13 +1415,12 @@ abc:NaN
 2:-:-1
 invalid:-:-1
 invalid:+:1
-2:abc:1
 3::1
 
 &binf
 1:+:inf
 2:-:-inf
-3:abc:inf
+3:+inf:inf
 
 &is_nan
 123:0
index 3b78f2e..bc234e6 100755 (executable)
@@ -3,7 +3,7 @@
 use strict;
 use warnings;
 
-use Test::More tests => 4280            # tests in require'd file
+use Test::More tests => 4278            # tests in require'd file
                          + 20;          # tests in this file
 
 use Math::BigInt only => 'Calc';
index 6045a6f..79d8fdf 100755 (executable)
@@ -35,7 +35,6 @@ is($class->new(1)->bexp(), '2',  "$class->new(1)->bexp()");
 is($class->new(2)->bexp(), '7',  "$class->new(2)->bexp()");
 is($class->new(3)->bexp(), '20', "$class->new(3)->bexp()");
 
-###############################################################################
 ###############################################################################
 # Math::BigFloat tests
 
@@ -146,7 +145,7 @@ is($class->new("10")->bpow("0.6", 10), "3.981071706",
    qq|$class->new("10")->bpow("0.6", 10)|);
 
 # blog should handle bigint input
-is(Math::BigFloat::blog(Math::BigInt->new(100), 10), 2, "blog(100)");
+is(Math::BigFloat->blog(Math::BigInt->new(100), 10), 2, "blog(100)");
 
 ###############################################################################
 # some integer results
@@ -190,9 +189,9 @@ test_bpow('9.86902225', '0.5', undef, '3.1415');
 
 test_bpow('0.2', '0.41', 10, '0.5169187652');
 
-is($class->new("0.01")->bpow("28.4", 40)->bsstr(),
-   '1584893192461113485202101373391507013269e-96',
-   qq|$class->new("0.01")->bpow("28.4", 40)->bsstr()|);
+is($class->new("0.1")->bpow("28.4", 40)->bsstr(),
+   '3981071705534972507702523050877520434877e-68',
+   qq|$class->new("0.1")->bpow("28.4", 40)->bsstr()|);
 
 # The following test takes too long.
 #is($class->new("2")->bpow("-1034.5", 40)->bsstr(),
@@ -231,8 +230,6 @@ is($class->new("-394.84010945715266885")->bexp(20)->bsstr(),
 
 # all done
 
-1;
-
 ###############################################################################
 
 sub test_bpow {
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/blucas-mbi.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/blucas-mbi.t
deleted file mode 100644 (file)
index 9a92159..0000000
+++ /dev/null
@@ -1,86 +0,0 @@
-# -*- mode: perl; -*-
-
-use strict;
-use warnings;
-
-use Test::More tests => 15;
-
-use Math::BigInt;
-
-my $x;
-
-###############################################################################
-# Scalar context.
-###############################################################################
-
-my $y;
-
-# Finite numbers.
-
-$x = Math::BigInt -> new("-20");
-$y = $x -> blucas();
-is($y, "-15127", "blucas(-20)");
-
-$x = Math::BigInt -> new("-15");
-$y = $x -> blucas();
-is($y, "1364", "blucas(-15)");
-
-$x = Math::BigInt -> new("-2");
-$y = $x -> blucas();
-is($y, "-3", "blucas(-2)");
-
-$x = Math::BigInt -> new("-1");
-$y = $x -> blucas();
-is($y, "1", "blucas(-1)");
-
-$x = Math::BigInt -> new("0");
-$y = $x -> blucas();
-is($y, "2", "blucas(0)");
-
-$x = Math::BigInt -> new("1");
-$y = $x -> blucas();
-is($y, "1", "blucas(1)");
-
-$x = Math::BigInt -> new("2");
-$y = $x -> blucas();
-is($y, "3", "blucas(2)");
-
-$x = Math::BigInt -> new("15");
-$y = $x -> blucas();
-is($y, "1364", "blucas(15)");
-
-$x = Math::BigInt -> new("20");
-$y = $x -> blucas();
-is($y, "15127", "blucas(20)");
-
-$x = Math::BigInt -> new("250");
-$y = $x -> blucas();
-is($y, "17656721319717734662791328845675730903632844218828123", "blucas(250)");
-
-# Infinites and NaN.
-
-$x = Math::BigInt -> binf("+");
-$y = $x -> blucas();
-is($y, "inf", "blucas(+inf)");
-
-$x = Math::BigInt -> binf("-");
-$y = $x -> blucas();
-is($y, "NaN", "blucas(-inf)");
-
-$x = Math::BigInt -> bnan();
-$y = $x -> blucas();
-is($y, "NaN", "blucas(NaN)");
-
-###############################################################################
-# List context.
-###############################################################################
-
-my @y;
-
-$x = Math::BigInt -> new("10");
-@y = $x -> blucas();
-is_deeply(\@y, [2, 1, 3, 4, 7, 11, 18, 29, 47, 76, 123], "blucas(10)");
-
-$x = Math::BigInt -> new("-10");
-@y = $x -> blucas();
-is_deeply(\@y, [2, 1, -3, 4, -7, 11, -18, 29, -47, 76, -123], "blucas(-10)");
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/bnok-mbf.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/bnok-mbf.t
deleted file mode 100644 (file)
index d8b9151..0000000
+++ /dev/null
@@ -1,1451 +0,0 @@
-# -*- mode: perl; -*-
-
-use strict;
-use warnings;
-
-use Test::More tests => 4957;
-
-my $class;
-
-BEGIN {
-    $class = 'Math::BigFloat';
-    use_ok($class);
-}
-
-while (<DATA>) {
-    s/#.*$//;                   # remove comments
-    s/\s+$//;                   # remove trailing whitespace
-    next unless length;         # skip empty lines
-
-    my ($nval, $kval, $nokval) = split /:/;
-    my ($n, $k, $got, @got);
-
-    for my $context_is_scalar (0, 1) {
-        for my $k_is_scalar (0, 1) {
-
-            my $test = qq|\$n = $class -> new("$nval");|;
-
-            $test .= $k_is_scalar
-                     ? qq| \$k = "$kval";|
-                     : qq| \$k = $class -> new("$kval");|;
-
-            $test .= $context_is_scalar
-                     ? qq| \$got = \$n -> bnok(\$k);|
-                     : qq| \@got = \$n -> bnok(\$k);|;
-
-            my $desc = "bnok() in ";
-            $desc .= $context_is_scalar ? "scalar context" : "list context";
-            $desc .= $k_is_scalar ? " with k as scalar" : " with k as object";
-
-            subtest $desc,
-              sub {
-                  plan tests => $context_is_scalar ? 7 : 8;
-
-                  eval $test;
-                  is($@, "", "'$test' gives emtpy \$\@");
-
-                  if ($context_is_scalar) {
-
-                      # Check output.
-
-                      is(ref($got), $class,
-                         "'$test' output arg is a $class");
-
-                      is($got -> bstr(), $nokval,
-                         "'$test' output arg has the right value");
-
-                  } else {
-
-                      # Check number of output arguments.
-
-                      cmp_ok(scalar @got, '==', 1,
-                             "'$test' gives one output arg");
-
-                      # Check output.
-
-                      is(ref($got[0]), $class,
-                         "'$test' output arg is a $class");
-
-                      is($got[0] -> bstr(), $nokval,
-                         "'$test' output arg has the right value");
-                  }
-
-                  # Check the invocand.
-
-                  is(ref($n), $class,
-                     "'$test' invocand is still a $class");
-
-                  is($n -> bstr(), $nokval,
-                     "'$test' invocand has the right value");
-
-                  # Check the input argument.
-
-                  if ($k_is_scalar) {
-
-                      is(ref($k), '',
-                         "'$test' second input arg is still a scalar");
-
-                      is($k, $kval,
-                         "'$test' second input arg is unmodified");
-
-                  } else {
-
-                      is(ref($k), $class,
-                         "'$test' second input arg is still a $class");
-
-                      is($k -> bstr(), $kval,
-                         "'$test' second input arg is unmodified");
-                  }
-              };
-        }
-    }
-}
-
-__DATA__
-
-# n and/or k is NaN
-
-NaN:NaN:NaN
-NaN:0:NaN
-NaN:3:NaN
-3:NaN:NaN
-NaN:-3:NaN
--3:NaN:NaN
-
-# n = inf
-
-inf:-inf:NaN
-inf:-3:0
-inf:-2:0
-inf:-1:0
-inf:0:1
-inf:1:inf
-inf:2:inf
-inf:3:inf
-inf:inf:NaN
-
-# n = -inf
-
--inf:-inf:NaN
--inf:-3:0
--inf:-2:0
--inf:-1:0
--inf:0:1
--inf:1:-inf
--inf:2:inf
--inf:3:-inf
--inf:inf:NaN
-
-# k = inf
-
--3:inf:NaN
--2:inf:NaN
--1:inf:NaN
-0:inf:NaN
-1:inf:NaN
-2:inf:NaN
-3:inf:NaN
-
-# k = -inf
-
--3:-inf:NaN
--2:-inf:NaN
--1:-inf:NaN
-0:-inf:NaN
-1:-inf:NaN
-2:-inf:NaN
-3:-inf:NaN
-
-# n = -15, k = n - 15 ... n + 15
-
--15:-30:-77558760
--15:-29:40116600
--15:-28:-20058300
--15:-27:9657700
--15:-26:-4457400
--15:-25:1961256
--15:-24:-817190
--15:-23:319770
--15:-22:-116280
--15:-21:38760
--15:-20:-11628
--15:-19:3060
--15:-18:-680
--15:-17:120
--15:-16:-15
--15:-15:1
--15:-14:0
--15:-13:0
--15:-12:0
--15:-11:0
--15:-10:0
--15:-9:0
--15:-8:0
--15:-7:0
--15:-6:0
--15:-5:0
--15:-4:0
--15:-3:0
--15:-2:0
--15:-1:0
--15:0:1
--15:1:-15
--15:2:120
--15:3:-680
--15:4:3060
--15:5:-11628
--15:6:38760
--15:7:-116280
--15:8:319770
--15:9:-817190
--15:10:1961256
--15:11:-4457400
--15:12:9657700
--15:13:-20058300
--15:14:40116600
--15:15:-77558760
-
-# n = -14, k = n - 15 ... n + 15
-
--14:-29:-37442160
--14:-28:20058300
--14:-27:-10400600
--14:-26:5200300
--14:-25:-2496144
--14:-24:1144066
--14:-23:-497420
--14:-22:203490
--14:-21:-77520
--14:-20:27132
--14:-19:-8568
--14:-18:2380
--14:-17:-560
--14:-16:105
--14:-15:-14
--14:-14:1
--14:-13:0
--14:-12:0
--14:-11:0
--14:-10:0
--14:-9:0
--14:-8:0
--14:-7:0
--14:-6:0
--14:-5:0
--14:-4:0
--14:-3:0
--14:-2:0
--14:-1:0
--14:0:1
--14:1:-14
--14:2:105
--14:3:-560
--14:4:2380
--14:5:-8568
--14:6:27132
--14:7:-77520
--14:8:203490
--14:9:-497420
--14:10:1144066
--14:11:-2496144
--14:12:5200300
--14:13:-10400600
--14:14:20058300
--14:15:-37442160
-
-# n = -13, k = n - 15 ... n + 15
-
--13:-28:-17383860
--13:-27:9657700
--13:-26:-5200300
--13:-25:2704156
--13:-24:-1352078
--13:-23:646646
--13:-22:-293930
--13:-21:125970
--13:-20:-50388
--13:-19:18564
--13:-18:-6188
--13:-17:1820
--13:-16:-455
--13:-15:91
--13:-14:-13
--13:-13:1
--13:-12:0
--13:-11:0
--13:-10:0
--13:-9:0
--13:-8:0
--13:-7:0
--13:-6:0
--13:-5:0
--13:-4:0
--13:-3:0
--13:-2:0
--13:-1:0
--13:0:1
--13:1:-13
--13:2:91
--13:3:-455
--13:4:1820
--13:5:-6188
--13:6:18564
--13:7:-50388
--13:8:125970
--13:9:-293930
--13:10:646646
--13:11:-1352078
--13:12:2704156
--13:13:-5200300
--13:14:9657700
--13:15:-17383860
-
-# n = -12, k = n - 15 ... n + 15
-
--12:-27:-7726160
--12:-26:4457400
--12:-25:-2496144
--12:-24:1352078
--12:-23:-705432
--12:-22:352716
--12:-21:-167960
--12:-20:75582
--12:-19:-31824
--12:-18:12376
--12:-17:-4368
--12:-16:1365
--12:-15:-364
--12:-14:78
--12:-13:-12
--12:-12:1
--12:-11:0
--12:-10:0
--12:-9:0
--12:-8:0
--12:-7:0
--12:-6:0
--12:-5:0
--12:-4:0
--12:-3:0
--12:-2:0
--12:-1:0
--12:0:1
--12:1:-12
--12:2:78
--12:3:-364
--12:4:1365
--12:5:-4368
--12:6:12376
--12:7:-31824
--12:8:75582
--12:9:-167960
--12:10:352716
--12:11:-705432
--12:12:1352078
--12:13:-2496144
--12:14:4457400
--12:15:-7726160
-
-# n = -11, k = n - 15 ... n + 15
-
--11:-26:-3268760
--11:-25:1961256
--11:-24:-1144066
--11:-23:646646
--11:-22:-352716
--11:-21:184756
--11:-20:-92378
--11:-19:43758
--11:-18:-19448
--11:-17:8008
--11:-16:-3003
--11:-15:1001
--11:-14:-286
--11:-13:66
--11:-12:-11
--11:-11:1
--11:-10:0
--11:-9:0
--11:-8:0
--11:-7:0
--11:-6:0
--11:-5:0
--11:-4:0
--11:-3:0
--11:-2:0
--11:-1:0
--11:0:1
--11:1:-11
--11:2:66
--11:3:-286
--11:4:1001
--11:5:-3003
--11:6:8008
--11:7:-19448
--11:8:43758
--11:9:-92378
--11:10:184756
--11:11:-352716
--11:12:646646
--11:13:-1144066
--11:14:1961256
--11:15:-3268760
-
-# n = -10, k = n - 15 ... n + 15
-
--10:-25:-1307504
--10:-24:817190
--10:-23:-497420
--10:-22:293930
--10:-21:-167960
--10:-20:92378
--10:-19:-48620
--10:-18:24310
--10:-17:-11440
--10:-16:5005
--10:-15:-2002
--10:-14:715
--10:-13:-220
--10:-12:55
--10:-11:-10
--10:-10:1
--10:-9:0
--10:-8:0
--10:-7:0
--10:-6:0
--10:-5:0
--10:-4:0
--10:-3:0
--10:-2:0
--10:-1:0
--10:0:1
--10:1:-10
--10:2:55
--10:3:-220
--10:4:715
--10:5:-2002
--10:6:5005
--10:7:-11440
--10:8:24310
--10:9:-48620
--10:10:92378
--10:11:-167960
--10:12:293930
--10:13:-497420
--10:14:817190
--10:15:-1307504
-
-# n = -9, k = n - 15 ... n + 15
-
--9:-24:-490314
--9:-23:319770
--9:-22:-203490
--9:-21:125970
--9:-20:-75582
--9:-19:43758
--9:-18:-24310
--9:-17:12870
--9:-16:-6435
--9:-15:3003
--9:-14:-1287
--9:-13:495
--9:-12:-165
--9:-11:45
--9:-10:-9
--9:-9:1
--9:-8:0
--9:-7:0
--9:-6:0
--9:-5:0
--9:-4:0
--9:-3:0
--9:-2:0
--9:-1:0
--9:0:1
--9:1:-9
--9:2:45
--9:3:-165
--9:4:495
--9:5:-1287
--9:6:3003
--9:7:-6435
--9:8:12870
--9:9:-24310
--9:10:43758
--9:11:-75582
--9:12:125970
--9:13:-203490
--9:14:319770
--9:15:-490314
-
-# n = -8, k = n - 15 ... n + 15
-
--8:-23:-170544
--8:-22:116280
--8:-21:-77520
--8:-20:50388
--8:-19:-31824
--8:-18:19448
--8:-17:-11440
--8:-16:6435
--8:-15:-3432
--8:-14:1716
--8:-13:-792
--8:-12:330
--8:-11:-120
--8:-10:36
--8:-9:-8
--8:-8:1
--8:-7:0
--8:-6:0
--8:-5:0
--8:-4:0
--8:-3:0
--8:-2:0
--8:-1:0
--8:0:1
--8:1:-8
--8:2:36
--8:3:-120
--8:4:330
--8:5:-792
--8:6:1716
--8:7:-3432
--8:8:6435
--8:9:-11440
--8:10:19448
--8:11:-31824
--8:12:50388
--8:13:-77520
--8:14:116280
--8:15:-170544
-
-# n = -7, k = n - 15 ... n + 15
-
--7:-22:-54264
--7:-21:38760
--7:-20:-27132
--7:-19:18564
--7:-18:-12376
--7:-17:8008
--7:-16:-5005
--7:-15:3003
--7:-14:-1716
--7:-13:924
--7:-12:-462
--7:-11:210
--7:-10:-84
--7:-9:28
--7:-8:-7
--7:-7:1
--7:-6:0
--7:-5:0
--7:-4:0
--7:-3:0
--7:-2:0
--7:-1:0
--7:0:1
--7:1:-7
--7:2:28
--7:3:-84
--7:4:210
--7:5:-462
--7:6:924
--7:7:-1716
--7:8:3003
--7:9:-5005
--7:10:8008
--7:11:-12376
--7:12:18564
--7:13:-27132
--7:14:38760
--7:15:-54264
-
-# n = -6, k = n - 15 ... n + 15
-
--6:-21:-15504
--6:-20:11628
--6:-19:-8568
--6:-18:6188
--6:-17:-4368
--6:-16:3003
--6:-15:-2002
--6:-14:1287
--6:-13:-792
--6:-12:462
--6:-11:-252
--6:-10:126
--6:-9:-56
--6:-8:21
--6:-7:-6
--6:-6:1
--6:-5:0
--6:-4:0
--6:-3:0
--6:-2:0
--6:-1:0
--6:0:1
--6:1:-6
--6:2:21
--6:3:-56
--6:4:126
--6:5:-252
--6:6:462
--6:7:-792
--6:8:1287
--6:9:-2002
--6:10:3003
--6:11:-4368
--6:12:6188
--6:13:-8568
--6:14:11628
--6:15:-15504
-
-# n = -5, k = n - 15 ... n + 15
-
--5:-20:-3876
--5:-19:3060
--5:-18:-2380
--5:-17:1820
--5:-16:-1365
--5:-15:1001
--5:-14:-715
--5:-13:495
--5:-12:-330
--5:-11:210
--5:-10:-126
--5:-9:70
--5:-8:-35
--5:-7:15
--5:-6:-5
--5:-5:1
--5:-4:0
--5:-3:0
--5:-2:0
--5:-1:0
--5:0:1
--5:1:-5
--5:2:15
--5:3:-35
--5:4:70
--5:5:-126
--5:6:210
--5:7:-330
--5:8:495
--5:9:-715
--5:10:1001
--5:11:-1365
--5:12:1820
--5:13:-2380
--5:14:3060
--5:15:-3876
-
-# n = -4, k = n - 15 ... n + 15
-
--4:-19:-816
--4:-18:680
--4:-17:-560
--4:-16:455
--4:-15:-364
--4:-14:286
--4:-13:-220
--4:-12:165
--4:-11:-120
--4:-10:84
--4:-9:-56
--4:-8:35
--4:-7:-20
--4:-6:10
--4:-5:-4
--4:-4:1
--4:-3:0
--4:-2:0
--4:-1:0
--4:0:1
--4:1:-4
--4:2:10
--4:3:-20
--4:4:35
--4:5:-56
--4:6:84
--4:7:-120
--4:8:165
--4:9:-220
--4:10:286
--4:11:-364
--4:12:455
--4:13:-560
--4:14:680
--4:15:-816
-
-# n = -3, k = n - 15 ... n + 15
-
--3:-18:-136
--3:-17:120
--3:-16:-105
--3:-15:91
--3:-14:-78
--3:-13:66
--3:-12:-55
--3:-11:45
--3:-10:-36
--3:-9:28
--3:-8:-21
--3:-7:15
--3:-6:-10
--3:-5:6
--3:-4:-3
--3:-3:1
--3:-2:0
--3:-1:0
--3:0:1
--3:1:-3
--3:2:6
--3:3:-10
--3:4:15
--3:5:-21
--3:6:28
--3:7:-36
--3:8:45
--3:9:-55
--3:10:66
--3:11:-78
--3:12:91
--3:13:-105
--3:14:120
--3:15:-136
-
-# n = -2, k = n - 15 ... n + 15
-
--2:-17:-16
--2:-16:15
--2:-15:-14
--2:-14:13
--2:-13:-12
--2:-12:11
--2:-11:-10
--2:-10:9
--2:-9:-8
--2:-8:7
--2:-7:-6
--2:-6:5
--2:-5:-4
--2:-4:3
--2:-3:-2
--2:-2:1
--2:-1:0
--2:0:1
--2:1:-2
--2:2:3
--2:3:-4
--2:4:5
--2:5:-6
--2:6:7
--2:7:-8
--2:8:9
--2:9:-10
--2:10:11
--2:11:-12
--2:12:13
--2:13:-14
--2:14:15
--2:15:-16
-
-# n = -1, k = n - 15 ... n + 15
-
--1:-16:-1
--1:-15:1
--1:-14:-1
--1:-13:1
--1:-12:-1
--1:-11:1
--1:-10:-1
--1:-9:1
--1:-8:-1
--1:-7:1
--1:-6:-1
--1:-5:1
--1:-4:-1
--1:-3:1
--1:-2:-1
--1:-1:1
--1:0:1
--1:1:-1
--1:2:1
--1:3:-1
--1:4:1
--1:5:-1
--1:6:1
--1:7:-1
--1:8:1
--1:9:-1
--1:10:1
--1:11:-1
--1:12:1
--1:13:-1
--1:14:1
--1:15:-1
-
-# n = 0, k = n - 15 ... n + 15
-
-0:-15:0
-0:-14:0
-0:-13:0
-0:-12:0
-0:-11:0
-0:-10:0
-0:-9:0
-0:-8:0
-0:-7:0
-0:-6:0
-0:-5:0
-0:-4:0
-0:-3:0
-0:-2:0
-0:-1:0
-0:0:1
-0:1:0
-0:2:0
-0:3:0
-0:4:0
-0:5:0
-0:6:0
-0:7:0
-0:8:0
-0:9:0
-0:10:0
-0:11:0
-0:12:0
-0:13:0
-0:14:0
-0:15:0
-
-# n = 1, k = n - 15 ... n + 15
-
-1:-15:0
-1:-14:0
-1:-13:0
-1:-12:0
-1:-11:0
-1:-10:0
-1:-9:0
-1:-8:0
-1:-7:0
-1:-6:0
-1:-5:0
-1:-4:0
-1:-3:0
-1:-2:0
-1:-1:0
-1:0:1
-1:1:1
-1:2:0
-1:3:0
-1:4:0
-1:5:0
-1:6:0
-1:7:0
-1:8:0
-1:9:0
-1:10:0
-1:11:0
-1:12:0
-1:13:0
-1:14:0
-1:15:0
-1:16:0
-
-# n = 2, k = n - 15 ... n + 15
-
-2:-15:0
-2:-14:0
-2:-13:0
-2:-12:0
-2:-11:0
-2:-10:0
-2:-9:0
-2:-8:0
-2:-7:0
-2:-6:0
-2:-5:0
-2:-4:0
-2:-3:0
-2:-2:0
-2:-1:0
-2:0:1
-2:1:2
-2:2:1
-2:3:0
-2:4:0
-2:5:0
-2:6:0
-2:7:0
-2:8:0
-2:9:0
-2:10:0
-2:11:0
-2:12:0
-2:13:0
-2:14:0
-2:15:0
-2:16:0
-2:17:0
-
-# n = 3, k = n - 15 ... n + 15
-
-3:-15:0
-3:-14:0
-3:-13:0
-3:-12:0
-3:-11:0
-3:-10:0
-3:-9:0
-3:-8:0
-3:-7:0
-3:-6:0
-3:-5:0
-3:-4:0
-3:-3:0
-3:-2:0
-3:-1:0
-3:0:1
-3:1:3
-3:2:3
-3:3:1
-3:4:0
-3:5:0
-3:6:0
-3:7:0
-3:8:0
-3:9:0
-3:10:0
-3:11:0
-3:12:0
-3:13:0
-3:14:0
-3:15:0
-3:16:0
-3:17:0
-3:18:0
-
-# n = 4, k = n - 15 ... n + 15
-
-4:-15:0
-4:-14:0
-4:-13:0
-4:-12:0
-4:-11:0
-4:-10:0
-4:-9:0
-4:-8:0
-4:-7:0
-4:-6:0
-4:-5:0
-4:-4:0
-4:-3:0
-4:-2:0
-4:-1:0
-4:0:1
-4:1:4
-4:2:6
-4:3:4
-4:4:1
-4:5:0
-4:6:0
-4:7:0
-4:8:0
-4:9:0
-4:10:0
-4:11:0
-4:12:0
-4:13:0
-4:14:0
-4:15:0
-4:16:0
-4:17:0
-4:18:0
-4:19:0
-
-# n = 5, k = n - 15 ... n + 15
-
-5:-15:0
-5:-14:0
-5:-13:0
-5:-12:0
-5:-11:0
-5:-10:0
-5:-9:0
-5:-8:0
-5:-7:0
-5:-6:0
-5:-5:0
-5:-4:0
-5:-3:0
-5:-2:0
-5:-1:0
-5:0:1
-5:1:5
-5:2:10
-5:3:10
-5:4:5
-5:5:1
-5:6:0
-5:7:0
-5:8:0
-5:9:0
-5:10:0
-5:11:0
-5:12:0
-5:13:0
-5:14:0
-5:15:0
-5:16:0
-5:17:0
-5:18:0
-5:19:0
-5:20:0
-
-# n = 6, k = n - 15 ... n + 15
-
-6:-15:0
-6:-14:0
-6:-13:0
-6:-12:0
-6:-11:0
-6:-10:0
-6:-9:0
-6:-8:0
-6:-7:0
-6:-6:0
-6:-5:0
-6:-4:0
-6:-3:0
-6:-2:0
-6:-1:0
-6:0:1
-6:1:6
-6:2:15
-6:3:20
-6:4:15
-6:5:6
-6:6:1
-6:7:0
-6:8:0
-6:9:0
-6:10:0
-6:11:0
-6:12:0
-6:13:0
-6:14:0
-6:15:0
-6:16:0
-6:17:0
-6:18:0
-6:19:0
-6:20:0
-6:21:0
-
-# n = 7, k = n - 15 ... n + 15
-
-7:-15:0
-7:-14:0
-7:-13:0
-7:-12:0
-7:-11:0
-7:-10:0
-7:-9:0
-7:-8:0
-7:-7:0
-7:-6:0
-7:-5:0
-7:-4:0
-7:-3:0
-7:-2:0
-7:-1:0
-7:0:1
-7:1:7
-7:2:21
-7:3:35
-7:4:35
-7:5:21
-7:6:7
-7:7:1
-7:8:0
-7:9:0
-7:10:0
-7:11:0
-7:12:0
-7:13:0
-7:14:0
-7:15:0
-7:16:0
-7:17:0
-7:18:0
-7:19:0
-7:20:0
-7:21:0
-7:22:0
-
-# n = 8, k = n - 15 ... n + 15
-
-8:-15:0
-8:-14:0
-8:-13:0
-8:-12:0
-8:-11:0
-8:-10:0
-8:-9:0
-8:-8:0
-8:-7:0
-8:-6:0
-8:-5:0
-8:-4:0
-8:-3:0
-8:-2:0
-8:-1:0
-8:0:1
-8:1:8
-8:2:28
-8:3:56
-8:4:70
-8:5:56
-8:6:28
-8:7:8
-8:8:1
-8:9:0
-8:10:0
-8:11:0
-8:12:0
-8:13:0
-8:14:0
-8:15:0
-8:16:0
-8:17:0
-8:18:0
-8:19:0
-8:20:0
-8:21:0
-8:22:0
-8:23:0
-
-# n = 9, k = n - 15 ... n + 15
-
-9:-15:0
-9:-14:0
-9:-13:0
-9:-12:0
-9:-11:0
-9:-10:0
-9:-9:0
-9:-8:0
-9:-7:0
-9:-6:0
-9:-5:0
-9:-4:0
-9:-3:0
-9:-2:0
-9:-1:0
-9:0:1
-9:1:9
-9:2:36
-9:3:84
-9:4:126
-9:5:126
-9:6:84
-9:7:36
-9:8:9
-9:9:1
-9:10:0
-9:11:0
-9:12:0
-9:13:0
-9:14:0
-9:15:0
-9:16:0
-9:17:0
-9:18:0
-9:19:0
-9:20:0
-9:21:0
-9:22:0
-9:23:0
-9:24:0
-
-# n = 10, k = n - 15 ... n + 15
-
-10:-15:0
-10:-14:0
-10:-13:0
-10:-12:0
-10:-11:0
-10:-10:0
-10:-9:0
-10:-8:0
-10:-7:0
-10:-6:0
-10:-5:0
-10:-4:0
-10:-3:0
-10:-2:0
-10:-1:0
-10:0:1
-10:1:10
-10:2:45
-10:3:120
-10:4:210
-10:5:252
-10:6:210
-10:7:120
-10:8:45
-10:9:10
-10:10:1
-10:11:0
-10:12:0
-10:13:0
-10:14:0
-10:15:0
-10:16:0
-10:17:0
-10:18:0
-10:19:0
-10:20:0
-10:21:0
-10:22:0
-10:23:0
-10:24:0
-10:25:0
-
-# n = 11, k = n - 15 ... n + 15
-
-11:-15:0
-11:-14:0
-11:-13:0
-11:-12:0
-11:-11:0
-11:-10:0
-11:-9:0
-11:-8:0
-11:-7:0
-11:-6:0
-11:-5:0
-11:-4:0
-11:-3:0
-11:-2:0
-11:-1:0
-11:0:1
-11:1:11
-11:2:55
-11:3:165
-11:4:330
-11:5:462
-11:6:462
-11:7:330
-11:8:165
-11:9:55
-11:10:11
-11:11:1
-11:12:0
-11:13:0
-11:14:0
-11:15:0
-11:16:0
-11:17:0
-11:18:0
-11:19:0
-11:20:0
-11:21:0
-11:22:0
-11:23:0
-11:24:0
-11:25:0
-11:26:0
-
-# n = 12, k = n - 15 ... n + 15
-
-12:-15:0
-12:-14:0
-12:-13:0
-12:-12:0
-12:-11:0
-12:-10:0
-12:-9:0
-12:-8:0
-12:-7:0
-12:-6:0
-12:-5:0
-12:-4:0
-12:-3:0
-12:-2:0
-12:-1:0
-12:0:1
-12:1:12
-12:2:66
-12:3:220
-12:4:495
-12:5:792
-12:6:924
-12:7:792
-12:8:495
-12:9:220
-12:10:66
-12:11:12
-12:12:1
-12:13:0
-12:14:0
-12:15:0
-12:16:0
-12:17:0
-12:18:0
-12:19:0
-12:20:0
-12:21:0
-12:22:0
-12:23:0
-12:24:0
-12:25:0
-12:26:0
-12:27:0
-
-# n = 13, k = n - 15 ... n + 15
-
-13:-15:0
-13:-14:0
-13:-13:0
-13:-12:0
-13:-11:0
-13:-10:0
-13:-9:0
-13:-8:0
-13:-7:0
-13:-6:0
-13:-5:0
-13:-4:0
-13:-3:0
-13:-2:0
-13:-1:0
-13:0:1
-13:1:13
-13:2:78
-13:3:286
-13:4:715
-13:5:1287
-13:6:1716
-13:7:1716
-13:8:1287
-13:9:715
-13:10:286
-13:11:78
-13:12:13
-13:13:1
-13:14:0
-13:15:0
-13:16:0
-13:17:0
-13:18:0
-13:19:0
-13:20:0
-13:21:0
-13:22:0
-13:23:0
-13:24:0
-13:25:0
-13:26:0
-13:27:0
-13:28:0
-
-# n = 14, k = n - 15 ... n + 15
-
-14:-15:0
-14:-14:0
-14:-13:0
-14:-12:0
-14:-11:0
-14:-10:0
-14:-9:0
-14:-8:0
-14:-7:0
-14:-6:0
-14:-5:0
-14:-4:0
-14:-3:0
-14:-2:0
-14:-1:0
-14:0:1
-14:1:14
-14:2:91
-14:3:364
-14:4:1001
-14:5:2002
-14:6:3003
-14:7:3432
-14:8:3003
-14:9:2002
-14:10:1001
-14:11:364
-14:12:91
-14:13:14
-14:14:1
-14:15:0
-14:16:0
-14:17:0
-14:18:0
-14:19:0
-14:20:0
-14:21:0
-14:22:0
-14:23:0
-14:24:0
-14:25:0
-14:26:0
-14:27:0
-14:28:0
-14:29:0
-
-# n = 15, k = n - 15 ... n + 15
-
-15:-15:0
-15:-14:0
-15:-13:0
-15:-12:0
-15:-11:0
-15:-10:0
-15:-9:0
-15:-8:0
-15:-7:0
-15:-6:0
-15:-5:0
-15:-4:0
-15:-3:0
-15:-2:0
-15:-1:0
-15:0:1
-15:1:15
-15:2:105
-15:3:455
-15:4:1365
-15:5:3003
-15:6:5005
-15:7:6435
-15:8:6435
-15:9:5005
-15:10:3003
-15:11:1365
-15:12:455
-15:13:105
-15:14:15
-15:15:1
-15:16:0
-15:17:0
-15:18:0
-15:19:0
-15:20:0
-15:21:0
-15:22:0
-15:23:0
-15:24:0
-15:25:0
-15:26:0
-15:27:0
-15:28:0
-15:29:0
-15:30:0
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/bnok-mbi.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/bnok-mbi.t
deleted file mode 100644 (file)
index 26fe2ff..0000000
+++ /dev/null
@@ -1,1451 +0,0 @@
-# -*- mode: perl; -*-
-
-use strict;
-use warnings;
-
-use Test::More tests => 4957;
-
-my $class;
-
-BEGIN {
-    $class = 'Math::BigInt';
-    use_ok($class);
-}
-
-while (<DATA>) {
-    s/#.*$//;                   # remove comments
-    s/\s+$//;                   # remove trailing whitespace
-    next unless length;         # skip empty lines
-
-    my ($nval, $kval, $nokval) = split /:/;
-    my ($n, $k, $got, @got);
-
-    for my $context_is_scalar (0, 1) {
-        for my $k_is_scalar (0, 1) {
-
-            my $test = qq|\$n = $class -> new("$nval");|;
-
-            $test .= $k_is_scalar
-                     ? qq| \$k = "$kval";|
-                     : qq| \$k = $class -> new("$kval");|;
-
-            $test .= $context_is_scalar
-                     ? qq| \$got = \$n -> bnok(\$k);|
-                     : qq| \@got = \$n -> bnok(\$k);|;
-
-            my $desc = "bnok() in ";
-            $desc .= $context_is_scalar ? "scalar context" : "list context";
-            $desc .= $k_is_scalar ? " with k as scalar" : " with k as object";
-
-            subtest $desc,
-              sub {
-                  plan tests => $context_is_scalar ? 7 : 8;
-
-                  eval $test;
-                  is($@, "", "'$test' gives emtpy \$\@");
-
-                  if ($context_is_scalar) {
-
-                      # Check output.
-
-                      is(ref($got), $class,
-                         "'$test' output arg is a $class");
-
-                      is($got -> bstr(), $nokval,
-                         "'$test' output arg has the right value");
-
-                  } else {
-
-                      # Check number of output arguments.
-
-                      cmp_ok(scalar @got, '==', 1,
-                             "'$test' gives one output arg");
-
-                      # Check output.
-
-                      is(ref($got[0]), $class,
-                         "'$test' output arg is a $class");
-
-                      is($got[0] -> bstr(), $nokval,
-                         "'$test' output arg has the right value");
-                  }
-
-                  # Check the invocand.
-
-                  is(ref($n), $class,
-                     "'$test' invocand is still a $class");
-
-                  is($n -> bstr(), $nokval,
-                     "'$test' invocand has the right value");
-
-                  # Check the input argument.
-
-                  if ($k_is_scalar) {
-
-                      is(ref($k), '',
-                         "'$test' second input arg is still a scalar");
-
-                      is($k, $kval,
-                         "'$test' second input arg is unmodified");
-
-                  } else {
-
-                      is(ref($k), $class,
-                         "'$test' second input arg is still a $class");
-
-                      is($k -> bstr(), $kval,
-                         "'$test' second input arg is unmodified");
-                  }
-              };
-        }
-    }
-}
-
-__DATA__
-
-# n and/or k is NaN
-
-NaN:NaN:NaN
-NaN:0:NaN
-NaN:3:NaN
-3:NaN:NaN
-NaN:-3:NaN
--3:NaN:NaN
-
-# n = inf
-
-inf:-inf:NaN
-inf:-3:0
-inf:-2:0
-inf:-1:0
-inf:0:1
-inf:1:inf
-inf:2:inf
-inf:3:inf
-inf:inf:NaN
-
-# n = -inf
-
--inf:-inf:NaN
--inf:-3:0
--inf:-2:0
--inf:-1:0
--inf:0:1
--inf:1:-inf
--inf:2:inf
--inf:3:-inf
--inf:inf:NaN
-
-# k = inf
-
--3:inf:NaN
--2:inf:NaN
--1:inf:NaN
-0:inf:NaN
-1:inf:NaN
-2:inf:NaN
-3:inf:NaN
-
-# k = -inf
-
--3:-inf:NaN
--2:-inf:NaN
--1:-inf:NaN
-0:-inf:NaN
-1:-inf:NaN
-2:-inf:NaN
-3:-inf:NaN
-
-# n = -15, k = n - 15 ... n + 15
-
--15:-30:-77558760
--15:-29:40116600
--15:-28:-20058300
--15:-27:9657700
--15:-26:-4457400
--15:-25:1961256
--15:-24:-817190
--15:-23:319770
--15:-22:-116280
--15:-21:38760
--15:-20:-11628
--15:-19:3060
--15:-18:-680
--15:-17:120
--15:-16:-15
--15:-15:1
--15:-14:0
--15:-13:0
--15:-12:0
--15:-11:0
--15:-10:0
--15:-9:0
--15:-8:0
--15:-7:0
--15:-6:0
--15:-5:0
--15:-4:0
--15:-3:0
--15:-2:0
--15:-1:0
--15:0:1
--15:1:-15
--15:2:120
--15:3:-680
--15:4:3060
--15:5:-11628
--15:6:38760
--15:7:-116280
--15:8:319770
--15:9:-817190
--15:10:1961256
--15:11:-4457400
--15:12:9657700
--15:13:-20058300
--15:14:40116600
--15:15:-77558760
-
-# n = -14, k = n - 15 ... n + 15
-
--14:-29:-37442160
--14:-28:20058300
--14:-27:-10400600
--14:-26:5200300
--14:-25:-2496144
--14:-24:1144066
--14:-23:-497420
--14:-22:203490
--14:-21:-77520
--14:-20:27132
--14:-19:-8568
--14:-18:2380
--14:-17:-560
--14:-16:105
--14:-15:-14
--14:-14:1
--14:-13:0
--14:-12:0
--14:-11:0
--14:-10:0
--14:-9:0
--14:-8:0
--14:-7:0
--14:-6:0
--14:-5:0
--14:-4:0
--14:-3:0
--14:-2:0
--14:-1:0
--14:0:1
--14:1:-14
--14:2:105
--14:3:-560
--14:4:2380
--14:5:-8568
--14:6:27132
--14:7:-77520
--14:8:203490
--14:9:-497420
--14:10:1144066
--14:11:-2496144
--14:12:5200300
--14:13:-10400600
--14:14:20058300
--14:15:-37442160
-
-# n = -13, k = n - 15 ... n + 15
-
--13:-28:-17383860
--13:-27:9657700
--13:-26:-5200300
--13:-25:2704156
--13:-24:-1352078
--13:-23:646646
--13:-22:-293930
--13:-21:125970
--13:-20:-50388
--13:-19:18564
--13:-18:-6188
--13:-17:1820
--13:-16:-455
--13:-15:91
--13:-14:-13
--13:-13:1
--13:-12:0
--13:-11:0
--13:-10:0
--13:-9:0
--13:-8:0
--13:-7:0
--13:-6:0
--13:-5:0
--13:-4:0
--13:-3:0
--13:-2:0
--13:-1:0
--13:0:1
--13:1:-13
--13:2:91
--13:3:-455
--13:4:1820
--13:5:-6188
--13:6:18564
--13:7:-50388
--13:8:125970
--13:9:-293930
--13:10:646646
--13:11:-1352078
--13:12:2704156
--13:13:-5200300
--13:14:9657700
--13:15:-17383860
-
-# n = -12, k = n - 15 ... n + 15
-
--12:-27:-7726160
--12:-26:4457400
--12:-25:-2496144
--12:-24:1352078
--12:-23:-705432
--12:-22:352716
--12:-21:-167960
--12:-20:75582
--12:-19:-31824
--12:-18:12376
--12:-17:-4368
--12:-16:1365
--12:-15:-364
--12:-14:78
--12:-13:-12
--12:-12:1
--12:-11:0
--12:-10:0
--12:-9:0
--12:-8:0
--12:-7:0
--12:-6:0
--12:-5:0
--12:-4:0
--12:-3:0
--12:-2:0
--12:-1:0
--12:0:1
--12:1:-12
--12:2:78
--12:3:-364
--12:4:1365
--12:5:-4368
--12:6:12376
--12:7:-31824
--12:8:75582
--12:9:-167960
--12:10:352716
--12:11:-705432
--12:12:1352078
--12:13:-2496144
--12:14:4457400
--12:15:-7726160
-
-# n = -11, k = n - 15 ... n + 15
-
--11:-26:-3268760
--11:-25:1961256
--11:-24:-1144066
--11:-23:646646
--11:-22:-352716
--11:-21:184756
--11:-20:-92378
--11:-19:43758
--11:-18:-19448
--11:-17:8008
--11:-16:-3003
--11:-15:1001
--11:-14:-286
--11:-13:66
--11:-12:-11
--11:-11:1
--11:-10:0
--11:-9:0
--11:-8:0
--11:-7:0
--11:-6:0
--11:-5:0
--11:-4:0
--11:-3:0
--11:-2:0
--11:-1:0
--11:0:1
--11:1:-11
--11:2:66
--11:3:-286
--11:4:1001
--11:5:-3003
--11:6:8008
--11:7:-19448
--11:8:43758
--11:9:-92378
--11:10:184756
--11:11:-352716
--11:12:646646
--11:13:-1144066
--11:14:1961256
--11:15:-3268760
-
-# n = -10, k = n - 15 ... n + 15
-
--10:-25:-1307504
--10:-24:817190
--10:-23:-497420
--10:-22:293930
--10:-21:-167960
--10:-20:92378
--10:-19:-48620
--10:-18:24310
--10:-17:-11440
--10:-16:5005
--10:-15:-2002
--10:-14:715
--10:-13:-220
--10:-12:55
--10:-11:-10
--10:-10:1
--10:-9:0
--10:-8:0
--10:-7:0
--10:-6:0
--10:-5:0
--10:-4:0
--10:-3:0
--10:-2:0
--10:-1:0
--10:0:1
--10:1:-10
--10:2:55
--10:3:-220
--10:4:715
--10:5:-2002
--10:6:5005
--10:7:-11440
--10:8:24310
--10:9:-48620
--10:10:92378
--10:11:-167960
--10:12:293930
--10:13:-497420
--10:14:817190
--10:15:-1307504
-
-# n = -9, k = n - 15 ... n + 15
-
--9:-24:-490314
--9:-23:319770
--9:-22:-203490
--9:-21:125970
--9:-20:-75582
--9:-19:43758
--9:-18:-24310
--9:-17:12870
--9:-16:-6435
--9:-15:3003
--9:-14:-1287
--9:-13:495
--9:-12:-165
--9:-11:45
--9:-10:-9
--9:-9:1
--9:-8:0
--9:-7:0
--9:-6:0
--9:-5:0
--9:-4:0
--9:-3:0
--9:-2:0
--9:-1:0
--9:0:1
--9:1:-9
--9:2:45
--9:3:-165
--9:4:495
--9:5:-1287
--9:6:3003
--9:7:-6435
--9:8:12870
--9:9:-24310
--9:10:43758
--9:11:-75582
--9:12:125970
--9:13:-203490
--9:14:319770
--9:15:-490314
-
-# n = -8, k = n - 15 ... n + 15
-
--8:-23:-170544
--8:-22:116280
--8:-21:-77520
--8:-20:50388
--8:-19:-31824
--8:-18:19448
--8:-17:-11440
--8:-16:6435
--8:-15:-3432
--8:-14:1716
--8:-13:-792
--8:-12:330
--8:-11:-120
--8:-10:36
--8:-9:-8
--8:-8:1
--8:-7:0
--8:-6:0
--8:-5:0
--8:-4:0
--8:-3:0
--8:-2:0
--8:-1:0
--8:0:1
--8:1:-8
--8:2:36
--8:3:-120
--8:4:330
--8:5:-792
--8:6:1716
--8:7:-3432
--8:8:6435
--8:9:-11440
--8:10:19448
--8:11:-31824
--8:12:50388
--8:13:-77520
--8:14:116280
--8:15:-170544
-
-# n = -7, k = n - 15 ... n + 15
-
--7:-22:-54264
--7:-21:38760
--7:-20:-27132
--7:-19:18564
--7:-18:-12376
--7:-17:8008
--7:-16:-5005
--7:-15:3003
--7:-14:-1716
--7:-13:924
--7:-12:-462
--7:-11:210
--7:-10:-84
--7:-9:28
--7:-8:-7
--7:-7:1
--7:-6:0
--7:-5:0
--7:-4:0
--7:-3:0
--7:-2:0
--7:-1:0
--7:0:1
--7:1:-7
--7:2:28
--7:3:-84
--7:4:210
--7:5:-462
--7:6:924
--7:7:-1716
--7:8:3003
--7:9:-5005
--7:10:8008
--7:11:-12376
--7:12:18564
--7:13:-27132
--7:14:38760
--7:15:-54264
-
-# n = -6, k = n - 15 ... n + 15
-
--6:-21:-15504
--6:-20:11628
--6:-19:-8568
--6:-18:6188
--6:-17:-4368
--6:-16:3003
--6:-15:-2002
--6:-14:1287
--6:-13:-792
--6:-12:462
--6:-11:-252
--6:-10:126
--6:-9:-56
--6:-8:21
--6:-7:-6
--6:-6:1
--6:-5:0
--6:-4:0
--6:-3:0
--6:-2:0
--6:-1:0
--6:0:1
--6:1:-6
--6:2:21
--6:3:-56
--6:4:126
--6:5:-252
--6:6:462
--6:7:-792
--6:8:1287
--6:9:-2002
--6:10:3003
--6:11:-4368
--6:12:6188
--6:13:-8568
--6:14:11628
--6:15:-15504
-
-# n = -5, k = n - 15 ... n + 15
-
--5:-20:-3876
--5:-19:3060
--5:-18:-2380
--5:-17:1820
--5:-16:-1365
--5:-15:1001
--5:-14:-715
--5:-13:495
--5:-12:-330
--5:-11:210
--5:-10:-126
--5:-9:70
--5:-8:-35
--5:-7:15
--5:-6:-5
--5:-5:1
--5:-4:0
--5:-3:0
--5:-2:0
--5:-1:0
--5:0:1
--5:1:-5
--5:2:15
--5:3:-35
--5:4:70
--5:5:-126
--5:6:210
--5:7:-330
--5:8:495
--5:9:-715
--5:10:1001
--5:11:-1365
--5:12:1820
--5:13:-2380
--5:14:3060
--5:15:-3876
-
-# n = -4, k = n - 15 ... n + 15
-
--4:-19:-816
--4:-18:680
--4:-17:-560
--4:-16:455
--4:-15:-364
--4:-14:286
--4:-13:-220
--4:-12:165
--4:-11:-120
--4:-10:84
--4:-9:-56
--4:-8:35
--4:-7:-20
--4:-6:10
--4:-5:-4
--4:-4:1
--4:-3:0
--4:-2:0
--4:-1:0
--4:0:1
--4:1:-4
--4:2:10
--4:3:-20
--4:4:35
--4:5:-56
--4:6:84
--4:7:-120
--4:8:165
--4:9:-220
--4:10:286
--4:11:-364
--4:12:455
--4:13:-560
--4:14:680
--4:15:-816
-
-# n = -3, k = n - 15 ... n + 15
-
--3:-18:-136
--3:-17:120
--3:-16:-105
--3:-15:91
--3:-14:-78
--3:-13:66
--3:-12:-55
--3:-11:45
--3:-10:-36
--3:-9:28
--3:-8:-21
--3:-7:15
--3:-6:-10
--3:-5:6
--3:-4:-3
--3:-3:1
--3:-2:0
--3:-1:0
--3:0:1
--3:1:-3
--3:2:6
--3:3:-10
--3:4:15
--3:5:-21
--3:6:28
--3:7:-36
--3:8:45
--3:9:-55
--3:10:66
--3:11:-78
--3:12:91
--3:13:-105
--3:14:120
--3:15:-136
-
-# n = -2, k = n - 15 ... n + 15
-
--2:-17:-16
--2:-16:15
--2:-15:-14
--2:-14:13
--2:-13:-12
--2:-12:11
--2:-11:-10
--2:-10:9
--2:-9:-8
--2:-8:7
--2:-7:-6
--2:-6:5
--2:-5:-4
--2:-4:3
--2:-3:-2
--2:-2:1
--2:-1:0
--2:0:1
--2:1:-2
--2:2:3
--2:3:-4
--2:4:5
--2:5:-6
--2:6:7
--2:7:-8
--2:8:9
--2:9:-10
--2:10:11
--2:11:-12
--2:12:13
--2:13:-14
--2:14:15
--2:15:-16
-
-# n = -1, k = n - 15 ... n + 15
-
--1:-16:-1
--1:-15:1
--1:-14:-1
--1:-13:1
--1:-12:-1
--1:-11:1
--1:-10:-1
--1:-9:1
--1:-8:-1
--1:-7:1
--1:-6:-1
--1:-5:1
--1:-4:-1
--1:-3:1
--1:-2:-1
--1:-1:1
--1:0:1
--1:1:-1
--1:2:1
--1:3:-1
--1:4:1
--1:5:-1
--1:6:1
--1:7:-1
--1:8:1
--1:9:-1
--1:10:1
--1:11:-1
--1:12:1
--1:13:-1
--1:14:1
--1:15:-1
-
-# n = 0, k = n - 15 ... n + 15
-
-0:-15:0
-0:-14:0
-0:-13:0
-0:-12:0
-0:-11:0
-0:-10:0
-0:-9:0
-0:-8:0
-0:-7:0
-0:-6:0
-0:-5:0
-0:-4:0
-0:-3:0
-0:-2:0
-0:-1:0
-0:0:1
-0:1:0
-0:2:0
-0:3:0
-0:4:0
-0:5:0
-0:6:0
-0:7:0
-0:8:0
-0:9:0
-0:10:0
-0:11:0
-0:12:0
-0:13:0
-0:14:0
-0:15:0
-
-# n = 1, k = n - 15 ... n + 15
-
-1:-15:0
-1:-14:0
-1:-13:0
-1:-12:0
-1:-11:0
-1:-10:0
-1:-9:0
-1:-8:0
-1:-7:0
-1:-6:0
-1:-5:0
-1:-4:0
-1:-3:0
-1:-2:0
-1:-1:0
-1:0:1
-1:1:1
-1:2:0
-1:3:0
-1:4:0
-1:5:0
-1:6:0
-1:7:0
-1:8:0
-1:9:0
-1:10:0
-1:11:0
-1:12:0
-1:13:0
-1:14:0
-1:15:0
-1:16:0
-
-# n = 2, k = n - 15 ... n + 15
-
-2:-15:0
-2:-14:0
-2:-13:0
-2:-12:0
-2:-11:0
-2:-10:0
-2:-9:0
-2:-8:0
-2:-7:0
-2:-6:0
-2:-5:0
-2:-4:0
-2:-3:0
-2:-2:0
-2:-1:0
-2:0:1
-2:1:2
-2:2:1
-2:3:0
-2:4:0
-2:5:0
-2:6:0
-2:7:0
-2:8:0
-2:9:0
-2:10:0
-2:11:0
-2:12:0
-2:13:0
-2:14:0
-2:15:0
-2:16:0
-2:17:0
-
-# n = 3, k = n - 15 ... n + 15
-
-3:-15:0
-3:-14:0
-3:-13:0
-3:-12:0
-3:-11:0
-3:-10:0
-3:-9:0
-3:-8:0
-3:-7:0
-3:-6:0
-3:-5:0
-3:-4:0
-3:-3:0
-3:-2:0
-3:-1:0
-3:0:1
-3:1:3
-3:2:3
-3:3:1
-3:4:0
-3:5:0
-3:6:0
-3:7:0
-3:8:0
-3:9:0
-3:10:0
-3:11:0
-3:12:0
-3:13:0
-3:14:0
-3:15:0
-3:16:0
-3:17:0
-3:18:0
-
-# n = 4, k = n - 15 ... n + 15
-
-4:-15:0
-4:-14:0
-4:-13:0
-4:-12:0
-4:-11:0
-4:-10:0
-4:-9:0
-4:-8:0
-4:-7:0
-4:-6:0
-4:-5:0
-4:-4:0
-4:-3:0
-4:-2:0
-4:-1:0
-4:0:1
-4:1:4
-4:2:6
-4:3:4
-4:4:1
-4:5:0
-4:6:0
-4:7:0
-4:8:0
-4:9:0
-4:10:0
-4:11:0
-4:12:0
-4:13:0
-4:14:0
-4:15:0
-4:16:0
-4:17:0
-4:18:0
-4:19:0
-
-# n = 5, k = n - 15 ... n + 15
-
-5:-15:0
-5:-14:0
-5:-13:0
-5:-12:0
-5:-11:0
-5:-10:0
-5:-9:0
-5:-8:0
-5:-7:0
-5:-6:0
-5:-5:0
-5:-4:0
-5:-3:0
-5:-2:0
-5:-1:0
-5:0:1
-5:1:5
-5:2:10
-5:3:10
-5:4:5
-5:5:1
-5:6:0
-5:7:0
-5:8:0
-5:9:0
-5:10:0
-5:11:0
-5:12:0
-5:13:0
-5:14:0
-5:15:0
-5:16:0
-5:17:0
-5:18:0
-5:19:0
-5:20:0
-
-# n = 6, k = n - 15 ... n + 15
-
-6:-15:0
-6:-14:0
-6:-13:0
-6:-12:0
-6:-11:0
-6:-10:0
-6:-9:0
-6:-8:0
-6:-7:0
-6:-6:0
-6:-5:0
-6:-4:0
-6:-3:0
-6:-2:0
-6:-1:0
-6:0:1
-6:1:6
-6:2:15
-6:3:20
-6:4:15
-6:5:6
-6:6:1
-6:7:0
-6:8:0
-6:9:0
-6:10:0
-6:11:0
-6:12:0
-6:13:0
-6:14:0
-6:15:0
-6:16:0
-6:17:0
-6:18:0
-6:19:0
-6:20:0
-6:21:0
-
-# n = 7, k = n - 15 ... n + 15
-
-7:-15:0
-7:-14:0
-7:-13:0
-7:-12:0
-7:-11:0
-7:-10:0
-7:-9:0
-7:-8:0
-7:-7:0
-7:-6:0
-7:-5:0
-7:-4:0
-7:-3:0
-7:-2:0
-7:-1:0
-7:0:1
-7:1:7
-7:2:21
-7:3:35
-7:4:35
-7:5:21
-7:6:7
-7:7:1
-7:8:0
-7:9:0
-7:10:0
-7:11:0
-7:12:0
-7:13:0
-7:14:0
-7:15:0
-7:16:0
-7:17:0
-7:18:0
-7:19:0
-7:20:0
-7:21:0
-7:22:0
-
-# n = 8, k = n - 15 ... n + 15
-
-8:-15:0
-8:-14:0
-8:-13:0
-8:-12:0
-8:-11:0
-8:-10:0
-8:-9:0
-8:-8:0
-8:-7:0
-8:-6:0
-8:-5:0
-8:-4:0
-8:-3:0
-8:-2:0
-8:-1:0
-8:0:1
-8:1:8
-8:2:28
-8:3:56
-8:4:70
-8:5:56
-8:6:28
-8:7:8
-8:8:1
-8:9:0
-8:10:0
-8:11:0
-8:12:0
-8:13:0
-8:14:0
-8:15:0
-8:16:0
-8:17:0
-8:18:0
-8:19:0
-8:20:0
-8:21:0
-8:22:0
-8:23:0
-
-# n = 9, k = n - 15 ... n + 15
-
-9:-15:0
-9:-14:0
-9:-13:0
-9:-12:0
-9:-11:0
-9:-10:0
-9:-9:0
-9:-8:0
-9:-7:0
-9:-6:0
-9:-5:0
-9:-4:0
-9:-3:0
-9:-2:0
-9:-1:0
-9:0:1
-9:1:9
-9:2:36
-9:3:84
-9:4:126
-9:5:126
-9:6:84
-9:7:36
-9:8:9
-9:9:1
-9:10:0
-9:11:0
-9:12:0
-9:13:0
-9:14:0
-9:15:0
-9:16:0
-9:17:0
-9:18:0
-9:19:0
-9:20:0
-9:21:0
-9:22:0
-9:23:0
-9:24:0
-
-# n = 10, k = n - 15 ... n + 15
-
-10:-15:0
-10:-14:0
-10:-13:0
-10:-12:0
-10:-11:0
-10:-10:0
-10:-9:0
-10:-8:0
-10:-7:0
-10:-6:0
-10:-5:0
-10:-4:0
-10:-3:0
-10:-2:0
-10:-1:0
-10:0:1
-10:1:10
-10:2:45
-10:3:120
-10:4:210
-10:5:252
-10:6:210
-10:7:120
-10:8:45
-10:9:10
-10:10:1
-10:11:0
-10:12:0
-10:13:0
-10:14:0
-10:15:0
-10:16:0
-10:17:0
-10:18:0
-10:19:0
-10:20:0
-10:21:0
-10:22:0
-10:23:0
-10:24:0
-10:25:0
-
-# n = 11, k = n - 15 ... n + 15
-
-11:-15:0
-11:-14:0
-11:-13:0
-11:-12:0
-11:-11:0
-11:-10:0
-11:-9:0
-11:-8:0
-11:-7:0
-11:-6:0
-11:-5:0
-11:-4:0
-11:-3:0
-11:-2:0
-11:-1:0
-11:0:1
-11:1:11
-11:2:55
-11:3:165
-11:4:330
-11:5:462
-11:6:462
-11:7:330
-11:8:165
-11:9:55
-11:10:11
-11:11:1
-11:12:0
-11:13:0
-11:14:0
-11:15:0
-11:16:0
-11:17:0
-11:18:0
-11:19:0
-11:20:0
-11:21:0
-11:22:0
-11:23:0
-11:24:0
-11:25:0
-11:26:0
-
-# n = 12, k = n - 15 ... n + 15
-
-12:-15:0
-12:-14:0
-12:-13:0
-12:-12:0
-12:-11:0
-12:-10:0
-12:-9:0
-12:-8:0
-12:-7:0
-12:-6:0
-12:-5:0
-12:-4:0
-12:-3:0
-12:-2:0
-12:-1:0
-12:0:1
-12:1:12
-12:2:66
-12:3:220
-12:4:495
-12:5:792
-12:6:924
-12:7:792
-12:8:495
-12:9:220
-12:10:66
-12:11:12
-12:12:1
-12:13:0
-12:14:0
-12:15:0
-12:16:0
-12:17:0
-12:18:0
-12:19:0
-12:20:0
-12:21:0
-12:22:0
-12:23:0
-12:24:0
-12:25:0
-12:26:0
-12:27:0
-
-# n = 13, k = n - 15 ... n + 15
-
-13:-15:0
-13:-14:0
-13:-13:0
-13:-12:0
-13:-11:0
-13:-10:0
-13:-9:0
-13:-8:0
-13:-7:0
-13:-6:0
-13:-5:0
-13:-4:0
-13:-3:0
-13:-2:0
-13:-1:0
-13:0:1
-13:1:13
-13:2:78
-13:3:286
-13:4:715
-13:5:1287
-13:6:1716
-13:7:1716
-13:8:1287
-13:9:715
-13:10:286
-13:11:78
-13:12:13
-13:13:1
-13:14:0
-13:15:0
-13:16:0
-13:17:0
-13:18:0
-13:19:0
-13:20:0
-13:21:0
-13:22:0
-13:23:0
-13:24:0
-13:25:0
-13:26:0
-13:27:0
-13:28:0
-
-# n = 14, k = n - 15 ... n + 15
-
-14:-15:0
-14:-14:0
-14:-13:0
-14:-12:0
-14:-11:0
-14:-10:0
-14:-9:0
-14:-8:0
-14:-7:0
-14:-6:0
-14:-5:0
-14:-4:0
-14:-3:0
-14:-2:0
-14:-1:0
-14:0:1
-14:1:14
-14:2:91
-14:3:364
-14:4:1001
-14:5:2002
-14:6:3003
-14:7:3432
-14:8:3003
-14:9:2002
-14:10:1001
-14:11:364
-14:12:91
-14:13:14
-14:14:1
-14:15:0
-14:16:0
-14:17:0
-14:18:0
-14:19:0
-14:20:0
-14:21:0
-14:22:0
-14:23:0
-14:24:0
-14:25:0
-14:26:0
-14:27:0
-14:28:0
-14:29:0
-
-# n = 15, k = n - 15 ... n + 15
-
-15:-15:0
-15:-14:0
-15:-13:0
-15:-12:0
-15:-11:0
-15:-10:0
-15:-9:0
-15:-8:0
-15:-7:0
-15:-6:0
-15:-5:0
-15:-4:0
-15:-3:0
-15:-2:0
-15:-1:0
-15:0:1
-15:1:15
-15:2:105
-15:3:455
-15:4:1365
-15:5:3003
-15:6:5005
-15:7:6435
-15:8:6435
-15:9:5005
-15:10:3003
-15:11:1365
-15:12:455
-15:13:105
-15:14:15
-15:15:1
-15:16:0
-15:17:0
-15:18:0
-15:19:0
-15:20:0
-15:21:0
-15:22:0
-15:23:0
-15:24:0
-15:25:0
-15:26:0
-15:27:0
-15:28:0
-15:29:0
-15:30:0
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/bnstr-mbf.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/bnstr-mbf.t
deleted file mode 100644 (file)
index 9e03a5b..0000000
+++ /dev/null
@@ -1,278 +0,0 @@
-# -*- mode: perl; -*-
-
-use strict;
-use warnings;
-
-use Test::More tests => 460;
-
-use Math::BigFloat;
-
-while (<DATA>) {
-    s/#.*$//;                   # remove comments
-    s/\s+$//;                   # remove trailing whitespace
-    next unless length;         # skip empty lines
-
-    my ($x_str, $expected) = split /:/;
-    my ($x, $str);
-
-    {
-        my $test = qq|\$x = Math::BigFloat -> new("$x_str");|
-                 . qq| \$str = \$x -> bnstr();|;
-
-        note "\n$test\n\n";
-        eval $test;
-
-        is($str, $expected, qq|input value is "$x_str"|);
-        is($x,   $x_str, "input object is unmodified");
-    }
-
-}
-
-__DATA__
-
-NaN:NaN
-
-inf:inf
--inf:-inf
-
-0:0e+0
-
-# positive numbers
-
-0.000000000001:1e-12
-0.00000000001:1e-11
-0.0000000001:1e-10
-0.000000001:1e-9
-0.00000001:1e-8
-0.0000001:1e-7
-0.000001:1e-6
-0.00001:1e-5
-0.0001:1e-4
-0.001:1e-3
-0.01:1e-2
-0.1:1e-1
-1:1e+0
-10:1e+1
-100:1e+2
-1000:1e+3
-10000:1e+4
-100000:1e+5
-1000000:1e+6
-10000000:1e+7
-100000000:1e+8
-1000000000:1e+9
-10000000000:1e+10
-100000000000:1e+11
-1000000000000:1e+12
-
-0.0000000000012:1.2e-12
-0.000000000012:1.2e-11
-0.00000000012:1.2e-10
-0.0000000012:1.2e-9
-0.000000012:1.2e-8
-0.00000012:1.2e-7
-0.0000012:1.2e-6
-0.000012:1.2e-5
-0.00012:1.2e-4
-0.0012:1.2e-3
-0.012:1.2e-2
-0.12:1.2e-1
-1.2:1.2e+0
-12:1.2e+1
-120:1.2e+2
-1200:1.2e+3
-12000:1.2e+4
-120000:1.2e+5
-1200000:1.2e+6
-12000000:1.2e+7
-120000000:1.2e+8
-1200000000:1.2e+9
-12000000000:1.2e+10
-120000000000:1.2e+11
-1200000000000:1.2e+12
-
-0.00000000000123:1.23e-12
-0.0000000000123:1.23e-11
-0.000000000123:1.23e-10
-0.00000000123:1.23e-9
-0.0000000123:1.23e-8
-0.000000123:1.23e-7
-0.00000123:1.23e-6
-0.0000123:1.23e-5
-0.000123:1.23e-4
-0.00123:1.23e-3
-0.0123:1.23e-2
-0.123:1.23e-1
-1.23:1.23e+0
-12.3:1.23e+1
-123:1.23e+2
-1230:1.23e+3
-12300:1.23e+4
-123000:1.23e+5
-1230000:1.23e+6
-12300000:1.23e+7
-123000000:1.23e+8
-1230000000:1.23e+9
-12300000000:1.23e+10
-123000000000:1.23e+11
-1230000000000:1.23e+12
-
-0.000000000001234:1.234e-12
-0.00000000001234:1.234e-11
-0.0000000001234:1.234e-10
-0.000000001234:1.234e-9
-0.00000001234:1.234e-8
-0.0000001234:1.234e-7
-0.000001234:1.234e-6
-0.00001234:1.234e-5
-0.0001234:1.234e-4
-0.001234:1.234e-3
-0.01234:1.234e-2
-0.1234:1.234e-1
-1.234:1.234e+0
-12.34:1.234e+1
-123.4:1.234e+2
-1234:1.234e+3
-12340:1.234e+4
-123400:1.234e+5
-1234000:1.234e+6
-12340000:1.234e+7
-123400000:1.234e+8
-1234000000:1.234e+9
-12340000000:1.234e+10
-123400000000:1.234e+11
-1234000000000:1.234e+12
-
-0.000003141592:3.141592e-6
-0.00003141592:3.141592e-5
-0.0003141592:3.141592e-4
-0.003141592:3.141592e-3
-0.03141592:3.141592e-2
-0.3141592:3.141592e-1
-3.141592:3.141592e+0
-31.41592:3.141592e+1
-314.1592:3.141592e+2
-3141.592:3.141592e+3
-31415.92:3.141592e+4
-314159.2:3.141592e+5
-3141592:3.141592e+6
-
-# negative numbers
-
--0.000000000001:-1e-12
--0.00000000001:-1e-11
--0.0000000001:-1e-10
--0.000000001:-1e-9
--0.00000001:-1e-8
--0.0000001:-1e-7
--0.000001:-1e-6
--0.00001:-1e-5
--0.0001:-1e-4
--0.001:-1e-3
--0.01:-1e-2
--0.1:-1e-1
--1:-1e+0
--10:-1e+1
--100:-1e+2
--1000:-1e+3
--10000:-1e+4
--100000:-1e+5
--1000000:-1e+6
--10000000:-1e+7
--100000000:-1e+8
--1000000000:-1e+9
--10000000000:-1e+10
--100000000000:-1e+11
--1000000000000:-1e+12
-
--0.0000000000012:-1.2e-12
--0.000000000012:-1.2e-11
--0.00000000012:-1.2e-10
--0.0000000012:-1.2e-9
--0.000000012:-1.2e-8
--0.00000012:-1.2e-7
--0.0000012:-1.2e-6
--0.000012:-1.2e-5
--0.00012:-1.2e-4
--0.0012:-1.2e-3
--0.012:-1.2e-2
--0.12:-1.2e-1
--1.2:-1.2e+0
--12:-1.2e+1
--120:-1.2e+2
--1200:-1.2e+3
--12000:-1.2e+4
--120000:-1.2e+5
--1200000:-1.2e+6
--12000000:-1.2e+7
--120000000:-1.2e+8
--1200000000:-1.2e+9
--12000000000:-1.2e+10
--120000000000:-1.2e+11
--1200000000000:-1.2e+12
-
--0.00000000000123:-1.23e-12
--0.0000000000123:-1.23e-11
--0.000000000123:-1.23e-10
--0.00000000123:-1.23e-9
--0.0000000123:-1.23e-8
--0.000000123:-1.23e-7
--0.00000123:-1.23e-6
--0.0000123:-1.23e-5
--0.000123:-1.23e-4
--0.00123:-1.23e-3
--0.0123:-1.23e-2
--0.123:-1.23e-1
--1.23:-1.23e+0
--12.3:-1.23e+1
--123:-1.23e+2
--1230:-1.23e+3
--12300:-1.23e+4
--123000:-1.23e+5
--1230000:-1.23e+6
--12300000:-1.23e+7
--123000000:-1.23e+8
--1230000000:-1.23e+9
--12300000000:-1.23e+10
--123000000000:-1.23e+11
--1230000000000:-1.23e+12
-
--0.000000000001234:-1.234e-12
--0.00000000001234:-1.234e-11
--0.0000000001234:-1.234e-10
--0.000000001234:-1.234e-9
--0.00000001234:-1.234e-8
--0.0000001234:-1.234e-7
--0.000001234:-1.234e-6
--0.00001234:-1.234e-5
--0.0001234:-1.234e-4
--0.001234:-1.234e-3
--0.01234:-1.234e-2
--0.1234:-1.234e-1
--1.234:-1.234e+0
--12.34:-1.234e+1
--123.4:-1.234e+2
--1234:-1.234e+3
--12340:-1.234e+4
--123400:-1.234e+5
--1234000:-1.234e+6
--12340000:-1.234e+7
--123400000:-1.234e+8
--1234000000:-1.234e+9
--12340000000:-1.234e+10
--123400000000:-1.234e+11
--1234000000000:-1.234e+12
-
--0.000003141592:-3.141592e-6
--0.00003141592:-3.141592e-5
--0.0003141592:-3.141592e-4
--0.003141592:-3.141592e-3
--0.03141592:-3.141592e-2
--0.3141592:-3.141592e-1
--3.141592:-3.141592e+0
--31.41592:-3.141592e+1
--314.1592:-3.141592e+2
--3141.592:-3.141592e+3
--31415.92:-3.141592e+4
--314159.2:-3.141592e+5
--3141592:-3.141592e+6
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/bnstr-mbi.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/bnstr-mbi.t
deleted file mode 100644 (file)
index ee4eec3..0000000
+++ /dev/null
@@ -1,158 +0,0 @@
-# -*- mode: perl; -*-
-
-use strict;
-use warnings;
-
-use Test::More tests => 220;
-
-use Math::BigInt;
-
-while (<DATA>) {
-    s/#.*$//;                   # remove comments
-    s/\s+$//;                   # remove trailing whitespace
-    next unless length;         # skip empty lines
-
-    my ($x_str, $expected) = split /:/;
-    my ($x, $str);
-
-    {
-        my $test = qq|\$x = Math::BigInt -> new("$x_str");|
-                 . qq| \$str = \$x -> bnstr();|;
-
-        note "\n$test\n\n";
-        eval $test;
-
-        is($str, $expected, qq|input value is "$x_str"|);
-        is($x,   $x_str, "input object is unmodified");
-    }
-
-}
-
-__DATA__
-
-NaN:NaN
-
-inf:inf
--inf:-inf
-
-0:0e+0
-
-# positive numbers
-
-1:1e+0
-10:1e+1
-100:1e+2
-1000:1e+3
-10000:1e+4
-100000:1e+5
-1000000:1e+6
-10000000:1e+7
-100000000:1e+8
-1000000000:1e+9
-10000000000:1e+10
-100000000000:1e+11
-1000000000000:1e+12
-
-12:1.2e+1
-120:1.2e+2
-1200:1.2e+3
-12000:1.2e+4
-120000:1.2e+5
-1200000:1.2e+6
-12000000:1.2e+7
-120000000:1.2e+8
-1200000000:1.2e+9
-12000000000:1.2e+10
-120000000000:1.2e+11
-1200000000000:1.2e+12
-
-123:1.23e+2
-1230:1.23e+3
-12300:1.23e+4
-123000:1.23e+5
-1230000:1.23e+6
-12300000:1.23e+7
-123000000:1.23e+8
-1230000000:1.23e+9
-12300000000:1.23e+10
-123000000000:1.23e+11
-1230000000000:1.23e+12
-
-1234:1.234e+3
-12340:1.234e+4
-123400:1.234e+5
-1234000:1.234e+6
-12340000:1.234e+7
-123400000:1.234e+8
-1234000000:1.234e+9
-12340000000:1.234e+10
-123400000000:1.234e+11
-1234000000000:1.234e+12
-
-3:3e+0
-31:3.1e+1
-314:3.14e+2
-3141:3.141e+3
-31415:3.1415e+4
-314159:3.14159e+5
-3141592:3.141592e+6
-
-# negative numbers
-
--1:-1e+0
--10:-1e+1
--100:-1e+2
--1000:-1e+3
--10000:-1e+4
--100000:-1e+5
--1000000:-1e+6
--10000000:-1e+7
--100000000:-1e+8
--1000000000:-1e+9
--10000000000:-1e+10
--100000000000:-1e+11
--1000000000000:-1e+12
-
--12:-1.2e+1
--120:-1.2e+2
--1200:-1.2e+3
--12000:-1.2e+4
--120000:-1.2e+5
--1200000:-1.2e+6
--12000000:-1.2e+7
--120000000:-1.2e+8
--1200000000:-1.2e+9
--12000000000:-1.2e+10
--120000000000:-1.2e+11
--1200000000000:-1.2e+12
-
--123:-1.23e+2
--1230:-1.23e+3
--12300:-1.23e+4
--123000:-1.23e+5
--1230000:-1.23e+6
--12300000:-1.23e+7
--123000000:-1.23e+8
--1230000000:-1.23e+9
--12300000000:-1.23e+10
--123000000000:-1.23e+11
--1230000000000:-1.23e+12
-
--1234:-1.234e+3
--12340:-1.234e+4
--123400:-1.234e+5
--1234000:-1.234e+6
--12340000:-1.234e+7
--123400000:-1.234e+8
--1234000000:-1.234e+9
--12340000000:-1.234e+10
--123400000000:-1.234e+11
--1234000000000:-1.234e+12
-
--3:-3e+0
--31:-3.1e+1
--314:-3.14e+2
--3141:-3.141e+3
--31415:-3.1415e+4
--314159:-3.14159e+5
--3141592:-3.141592e+6
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/bpi-mbf.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/bpi-mbf.t
deleted file mode 100644 (file)
index 38b9350..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-# -*- mode: perl; -*-
-
-use strict;
-use warnings;
-
-use Test::More tests => 10;
-
-use Math::BigFloat;
-use Scalar::Util qw< refaddr >;
-
-my $x;
-
-################################################################################
-
-note('class method');
-
-# When no accuracy is specified, default accuracy shall be used.
-
-$x = Math::BigFloat -> bpi();
-is($x, '3.141592653589793238462643383279502884197',
-   '$x = Math::BigFloat -> bpi();');
-is(ref($x), "Math::BigFloat", '$x is a Math::BigFloat');
-
-# When accuracy is specified, it shall be used.
-
-$x = Math::BigFloat -> bpi(10);
-is($x, '3.141592654',
-   '$x = Math::BigFloat -> bpi(10);');
-is(ref($x), "Math::BigFloat", '$x is a Math::BigFloat');
-
-################################################################################
-
-note('instance method');
-
-my $y;
-
-# When no accuracy is specified, default accuracy shall be used.
-
-$x = Math::BigFloat -> new(100);
-$y = $x -> bpi();
-is($x, '3.141592653589793238462643383279502884197',
-   '$x = Math::BigFloat -> new(100); $y = $x -> bpi();');
-is(ref($x), "Math::BigFloat", '$x is a Math::BigFloat');
-is(refaddr($x), refaddr($y), '$x and $y are the same object');
-
-# When accuracy is specified, it shall be used.
-
-$x = Math::BigFloat -> new(100);
-$y = $x -> bpi(10);
-is($x, '3.141592654',
-   '$x = Math::BigFloat -> new(100); $y = $x -> bpi(10);');
-is(ref($x), "Math::BigFloat", '$x is a Math::BigFloat');
-is(refaddr($x), refaddr($y), '$x and $y are the same object');
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/bpi-mbi.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/bpi-mbi.t
deleted file mode 100644 (file)
index 6fa6668..0000000
+++ /dev/null
@@ -1,103 +0,0 @@
-# -*- mode: perl; -*-
-
-use strict;
-use warnings;
-
-use Test::More tests => 24;
-
-use Math::BigInt;
-use Scalar::Util qw< refaddr >;
-
-my $x;
-
-################################################################################
-
-note('class method, without upgrading');
-
-$x = Math::BigInt -> bpi();
-is($x, '3', '$x = Math::BigInt -> bpi()');
-is(ref($x), 'Math::BigInt',
-   '$x is a Math::BigInt');
-
-$x = Math::BigInt -> bpi(10);
-is($x, '3', '$x = Math::BigInt -> bpi(10)');
-is(ref($x), 'Math::BigInt',
-   '$x is a Math::BigInt');
-
-note('class method, with upgrading');
-
-require Math::BigFloat;
-Math::BigInt -> upgrade('Math::BigFloat');
-
-# When no accuracy is specified, default accuracy shall be used.
-
-$x = Math::BigInt -> bpi();
-is($x, '3.141592653589793238462643383279502884197', '$x = Math::BigInt -> bpi()');
-is(ref($x), "Math::BigFloat",
-   '$x is a Math::BigFloat');
-
-# When accuracy is specified, it shall be used.
-
-$x = Math::BigInt -> bpi(10);
-is($x, '3.141592654', '$x = Math::BigInt -> bpi(10)');
-is(ref($x), "Math::BigFloat",
-   '$x is a Math::BigFloat');
-
-################################################################################
-
-Math::BigInt -> upgrade(undef);
-
-note('instance method, without upgrading');
-
-my $y;
-
-$x = Math::BigInt -> new(100);
-$y = $x -> bpi();
-is($x, '3',
-   '$x = Math::BigInt -> new(100); $y = $x -> bpi();');
-is(ref($x), 'Math::BigInt',
-   '$x is a Math::BigInt');
-is(refaddr($x), refaddr($y), '$x and $y are the same object');
-
-$x = Math::BigInt -> new(100);
-$y = $x -> bpi(10);
-is($x, '3',
-   '$x = Math::BigInt -> new(100); $y = $x -> bpi(10);');
-is(ref($x), 'Math::BigInt',
-   '$x is a Math::BigInt');
-is(refaddr($x), refaddr($y), '$x and $y are the same object');
-
-note('instance method, with upgrading');
-
-require Math::BigFloat;
-Math::BigInt -> upgrade('Math::BigFloat');
-
-# When no accuracy is specified, default accuracy shall be used.
-
-# When upgrading is in effect, a new object is returned.
-
-$x = Math::BigInt -> new(100);
-$y = $x -> bpi();
-is($x, '100',
-   '$x = Math::BigInt -> new(100); $y = $x -> bpi();');
-is(ref($x), "Math::BigInt",
-   '$x is a Math::BigInt');
-is($y, '3.141592653589793238462643383279502884197',
-   '$x = Math::BigInt -> new(100); $y = $x -> bpi();');
-is(ref($y), "Math::BigFloat",
-   '$y is a Math::BigFloat');
-isnt(refaddr($x), refaddr($y), '$x and $y are not the same object');
-
-# When accuracy is specified, it shall be used.
-
-$x = Math::BigInt -> new(100);
-$y = $x -> bpi(10);
-is($x, '100',
-   '$x = Math::BigInt -> new(100); $y = $x -> bpi(10);');
-is(ref($x), "Math::BigInt",
-   '$x is a Math::BigInt');
-is($y, '3.141592654',
-   '$x = Math::BigInt -> new(100); $y = $x -> bpi();');
-is(ref($y), "Math::BigFloat",
-   '$y is a Math::BigFloat');
-isnt(refaddr($x), refaddr($y), '$x and $y are not the same object');
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/bpow-mbf.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/bpow-mbf.t
deleted file mode 100644 (file)
index 72ad4d9..0000000
+++ /dev/null
@@ -1,348 +0,0 @@
-# -*- mode: perl; -*-
-
-use strict;
-use warnings;
-
-use Test::More tests => 255;
-
-use Math::BigFloat;
-
-my $class = "Math::BigFloat";
-
-use Math::Complex ();
-
-my $inf = $Math::Complex::Inf;
-my $nan = $inf - $inf;
-
-# The following is used to compute the data at the end of this file.
-
-if (0) {
-    my @x = (-$inf, -64, -3, -2.5, -2, -1.5, -1, -0.5, 0,
-             0.5, 1, 1.5, 2, 2.5, 3, 64, $inf);
-    my @y = (-$inf, -3, -2.5, -2, -1.5, -1, -0.5, 0,
-             0.5, 1, 1.5, 2, 2.5, 3, $inf);
-    for my $x (@x) {
-        for my $y (@y) {
-
-            # The exceptions here are based on Wolfram Alpha,
-            # https://www.wolframalpha.com/
-
-            my $z = $x == -$inf && $y == 0     ? $nan
-                  : $x ==  $inf && $y == 0     ? $nan
-                  : $x == -1    && $y == -$inf ? $nan
-                  : $x == -1    && $y ==  $inf ? $nan
-                  :                              $x ** $y;
-
-            # Unfortunately, Math::Big* uses "inf", not "Inf" as Perl.
-
-            printf "%s\n", join ":", map {   $_ ==  $inf ?  "inf"
-                                           : $_ == -$inf ? "-inf"
-                                           : $_                   } $x, $y, $z;
-        }
-    }
-
-    exit;
-}
-
-while (<DATA>) {
-    s/#.*$//;                   # remove comments
-    s/\s+$//;                   # remove trailing whitespace
-    next unless length;         # skip empty lines
-
-    my @args = split /:/;
-    my $want = pop @args;
-
-    my ($x, $y, $z);
-
-    my $test = qq|\$x = $class -> new("$args[0]"); |
-             . qq|\$y = $class -> new("$args[1]"); |
-             . qq|\$z = \$x -> bpow(\$y)|;
-
-    eval "$test";
-    die $@ if $@;
-
-    subtest $test => sub {
-        plan tests => 5;
-
-        is(ref($x), $class, "\$x is still a $class");
-
-        is(ref($y), $class, "\$y is still a $class");
-        is($y, $args[1], "\$y is unmodified");
-
-        is(ref($z), $class, "\$z is a $class");
-
-        # If $want is a finite non-integer and $x is finite, measure the
-        # relative difference.
-
-        if ($want * 0 == 0 && $want != int $want && $x -> is_finite()) {
-            if (abs(($z -> numify() - $want) / $want) < 1e-8) {
-                pass("\$z has the right value");
-            } else {
-                fail("\$z has the right value");
-                diag(<<"EOF");
-         got: '$z'
-    expected: '$want'
-EOF
-            }
-        } else {
-            is($z, $want, "\$z has the right value");
-        }
-    };
-}
-
-__END__
--inf:-inf:0
--inf:-3:0
--inf:-2.5:0
--inf:-2:0
--inf:-1.5:0
--inf:-1:0
--inf:-0.5:0
--inf:0:NaN
--inf:0.5:inf
--inf:1:-inf
--inf:1.5:inf
--inf:2:inf
--inf:2.5:inf
--inf:3:-inf
--inf:inf:inf
--64:-inf:0
--64:-3:-3.814697265625e-06
--64:-2.5:NaN
--64:-2:0.000244140625
--64:-1.5:NaN
--64:-1:-0.015625
--64:-0.5:NaN
--64:0:1
--64:0.5:NaN
--64:1:-64
--64:1.5:NaN
--64:2:4096
--64:2.5:NaN
--64:3:-262144
--64:inf:inf
--3:-inf:0
--3:-3:-0.037037037037037
--3:-2.5:NaN
--3:-2:0.111111111111111
--3:-1.5:NaN
--3:-1:-0.333333333333333
--3:-0.5:NaN
--3:0:1
--3:0.5:NaN
--3:1:-3
--3:1.5:NaN
--3:2:9
--3:2.5:NaN
--3:3:-27
--3:inf:inf
--2.5:-inf:0
--2.5:-3:-0.064
--2.5:-2.5:NaN
--2.5:-2:0.16
--2.5:-1.5:NaN
--2.5:-1:-0.4
--2.5:-0.5:NaN
--2.5:0:1
--2.5:0.5:NaN
--2.5:1:-2.5
--2.5:1.5:NaN
--2.5:2:6.25
--2.5:2.5:NaN
--2.5:3:-15.625
--2.5:inf:inf
--2:-inf:0
--2:-3:-0.125
--2:-2.5:NaN
--2:-2:0.25
--2:-1.5:NaN
--2:-1:-0.5
--2:-0.5:NaN
--2:0:1
--2:0.5:NaN
--2:1:-2
--2:1.5:NaN
--2:2:4
--2:2.5:NaN
--2:3:-8
--2:inf:inf
--1.5:-inf:0
--1.5:-3:-0.296296296296296
--1.5:-2.5:NaN
--1.5:-2:0.444444444444444
--1.5:-1.5:NaN
--1.5:-1:-0.666666666666667
--1.5:-0.5:NaN
--1.5:0:1
--1.5:0.5:NaN
--1.5:1:-1.5
--1.5:1.5:NaN
--1.5:2:2.25
--1.5:2.5:NaN
--1.5:3:-3.375
--1.5:inf:inf
--1:-inf:NaN
--1:-3:-1
--1:-2.5:NaN
--1:-2:1
--1:-1.5:NaN
--1:-1:-1
--1:-0.5:NaN
--1:0:1
--1:0.5:NaN
--1:1:-1
--1:1.5:NaN
--1:2:1
--1:2.5:NaN
--1:3:-1
--1:inf:NaN
--0.5:-inf:inf
--0.5:-3:-8
--0.5:-2.5:NaN
--0.5:-2:4
--0.5:-1.5:NaN
--0.5:-1:-2
--0.5:-0.5:NaN
--0.5:0:1
--0.5:0.5:NaN
--0.5:1:-0.5
--0.5:1.5:NaN
--0.5:2:0.25
--0.5:2.5:NaN
--0.5:3:-0.125
--0.5:inf:0
-0:-inf:inf
-0:-3:inf
-0:-2.5:inf
-0:-2:inf
-0:-1.5:inf
-0:-1:inf
-0:-0.5:inf
-0:0:1
-0:0.5:0
-0:1:0
-0:1.5:0
-0:2:0
-0:2.5:0
-0:3:0
-0:inf:0
-0.5:-inf:inf
-0.5:-3:8
-0.5:-2.5:5.65685424949238
-0.5:-2:4
-0.5:-1.5:2.82842712474619
-0.5:-1:2
-0.5:-0.5:1.4142135623731
-0.5:0:1
-0.5:0.5:0.707106781186548
-0.5:1:0.5
-0.5:1.5:0.353553390593274
-0.5:2:0.25
-0.5:2.5:0.176776695296637
-0.5:3:0.125
-0.5:inf:0
-1:-inf:1
-1:-3:1
-1:-2.5:1
-1:-2:1
-1:-1.5:1
-1:-1:1
-1:-0.5:1
-1:0:1
-1:0.5:1
-1:1:1
-1:1.5:1
-1:2:1
-1:2.5:1
-1:3:1
-1:inf:1
-1.5:-inf:0
-1.5:-3:0.296296296296296
-1.5:-2.5:0.362887369301212
-1.5:-2:0.444444444444444
-1.5:-1.5:0.544331053951817
-1.5:-1:0.666666666666667
-1.5:-0.5:0.816496580927726
-1.5:0:1
-1.5:0.5:1.22474487139159
-1.5:1:1.5
-1.5:1.5:1.83711730708738
-1.5:2:2.25
-1.5:2.5:2.75567596063108
-1.5:3:3.375
-1.5:inf:inf
-2:-inf:0
-2:-3:0.125
-2:-2.5:0.176776695296637
-2:-2:0.25
-2:-1.5:0.353553390593274
-2:-1:0.5
-2:-0.5:0.707106781186548
-2:0:1
-2:0.5:1.4142135623731
-2:1:2
-2:1.5:2.82842712474619
-2:2:4
-2:2.5:5.65685424949238
-2:3:8
-2:inf:inf
-2.5:-inf:0
-2.5:-3:0.064
-2.5:-2.5:0.101192885125388
-2.5:-2:0.16
-2.5:-1.5:0.25298221281347
-2.5:-1:0.4
-2.5:-0.5:0.632455532033676
-2.5:0:1
-2.5:0.5:1.58113883008419
-2.5:1:2.5
-2.5:1.5:3.95284707521047
-2.5:2:6.25
-2.5:2.5:9.88211768802619
-2.5:3:15.625
-2.5:inf:inf
-3:-inf:0
-3:-3:0.037037037037037
-3:-2.5:0.0641500299099584
-3:-2:0.111111111111111
-3:-1.5:0.192450089729875
-3:-1:0.333333333333333
-3:-0.5:0.577350269189626
-3:0:1
-3:0.5:1.73205080756888
-3:1:3
-3:1.5:5.19615242270663
-3:2:9
-3:2.5:15.5884572681199
-3:3:27
-3:inf:inf
-64:-inf:0
-64:-3:3.814697265625e-06
-64:-2.5:3.0517578125e-05
-64:-2:0.000244140625
-64:-1.5:0.001953125
-64:-1:0.015625
-64:-0.5:0.125
-64:0:1
-64:0.5:8
-64:1:64
-64:1.5:512
-64:2:4096
-64:2.5:32768
-64:3:262144
-64:inf:inf
-inf:-inf:0
-inf:-3:0
-inf:-2.5:0
-inf:-2:0
-inf:-1.5:0
-inf:-1:0
-inf:-0.5:0
-inf:0:NaN
-inf:0.5:inf
-inf:1:inf
-inf:1.5:inf
-inf:2:inf
-inf:2.5:inf
-inf:3:inf
-inf:inf:inf
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/bpow-mbi.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/bpow-mbi.t
deleted file mode 100644 (file)
index 6fbf270..0000000
+++ /dev/null
@@ -1,172 +0,0 @@
-# -*- mode: perl; -*-
-
-use strict;
-use warnings;
-
-use Test::More tests => 99;
-
-use Math::BigInt;
-
-my $class = "Math::BigInt";
-
-use Math::Complex ();
-
-my $inf = $Math::Complex::Inf;
-my $nan = $inf - $inf;
-
-# The following is used to compute the data at the end of this file.
-
-if (0) {
-    for my $x (-$inf, -64, -3, -2, -1, 0, 1, 2, 3, 64, $inf) {
-        for my $y (-$inf, -3, -2, -1, 0, 1, 2, 3, $inf) {
-
-            # The exceptions here are based on Wolfram Alpha,
-            # https://www.wolframalpha.com/
-
-            my $z = $x == -$inf && $y == 0     ? $nan
-                  : $x ==  $inf && $y == 0     ? $nan
-                  : $x == -1    && $y == -$inf ? $nan
-                  : $x == -1    && $y ==  $inf ? $nan
-                  :                              int($x ** $y);
-
-            # Unfortunately, Math::Big* uses "inf", not "Inf" as Perl.
-
-            printf "%s\n", join ":", map {   $_ ==  $inf ?  "inf"
-                                           : $_ == -$inf ? "-inf"
-                                           : $_                   } $x, $y, $z;
-        }
-    }
-
-    exit;
-}
-
-while (<DATA>) {
-    s/#.*$//;                   # remove comments
-    s/\s+$//;                   # remove trailing whitespace
-    next unless length;         # skip empty lines
-
-    my @args = split /:/;
-    my $want = pop @args;
-
-    my ($x, $y, $z);
-
-    my $test = qq|\$x = $class -> new("$args[0]"); |
-             . qq|\$y = $class -> new("$args[1]"); |
-             . qq|\$z = \$x -> bpow(\$y)|;
-
-    eval "$test";
-    die $@ if $@;
-
-    subtest $test => sub {
-        plan tests => 5;
-
-        is(ref($x), $class, "\$x is still a $class");
-
-        is(ref($y), $class, "\$y is still a $class");
-        is($y, $args[1], "\$y is unmodified");
-
-        is(ref($z), $class, "\$z is a $class");
-        is($z, $want, "\$z has the right value");
-    };
-}
-
-__DATA__
--inf:-inf:0
--inf:-3:0
--inf:-2:0
--inf:-1:0
--inf:0:NaN
--inf:1:-inf
--inf:2:inf
--inf:3:-inf
--inf:inf:inf
--64:-inf:0
--64:-3:0
--64:-2:0
--64:-1:0
--64:0:1
--64:1:-64
--64:2:4096
--64:3:-262144
--64:inf:inf
--3:-inf:0
--3:-3:0
--3:-2:0
--3:-1:0
--3:0:1
--3:1:-3
--3:2:9
--3:3:-27
--3:inf:inf
--2:-inf:0
--2:-3:0
--2:-2:0
--2:-1:0
--2:0:1
--2:1:-2
--2:2:4
--2:3:-8
--2:inf:inf
--1:-inf:NaN
--1:-3:-1
--1:-2:1
--1:-1:-1
--1:0:1
--1:1:-1
--1:2:1
--1:3:-1
--1:inf:NaN
-0:-inf:inf
-0:-3:inf
-0:-2:inf
-0:-1:inf
-0:0:1
-0:1:0
-0:2:0
-0:3:0
-0:inf:0
-1:-inf:1
-1:-3:1
-1:-2:1
-1:-1:1
-1:0:1
-1:1:1
-1:2:1
-1:3:1
-1:inf:1
-2:-inf:0
-2:-3:0
-2:-2:0
-2:-1:0
-2:0:1
-2:1:2
-2:2:4
-2:3:8
-2:inf:inf
-3:-inf:0
-3:-3:0
-3:-2:0
-3:-1:0
-3:0:1
-3:1:3
-3:2:9
-3:3:27
-3:inf:inf
-64:-inf:0
-64:-3:0
-64:-2:0
-64:-1:0
-64:0:1
-64:1:64
-64:2:4096
-64:3:262144
-64:inf:inf
-inf:-inf:0
-inf:-3:0
-inf:-2:0
-inf:-1:0
-inf:0:NaN
-inf:1:inf
-inf:2:inf
-inf:3:inf
-inf:inf:inf
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/bsstr-mbf.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/bsstr-mbf.t
deleted file mode 100644 (file)
index 3c18e6c..0000000
+++ /dev/null
@@ -1,275 +0,0 @@
-# -*- mode: perl; -*-
-
-use strict;
-use warnings;
-
-use Test::More tests => 460;
-
-use Math::BigFloat;
-
-while (<DATA>) {
-    s/#.*$//;                   # remove comments
-    s/\s+$//;                   # remove trailing whitespace
-    next unless length;         # skip empty lines
-
-    my ($x_str, $expected) = split /:/;
-    my ($x, $str);
-
-        my $test = qq|\$x = Math::BigFloat -> new("$x_str");|
-                 . qq| \$str = \$x -> bsstr();|;
-
-        note "\n$test\n\n";
-        eval $test;
-
-        is($str, $expected, qq|input value is "$x_str"|);
-        is($x,   $x_str, "input object is unmodified");
-}
-
-__DATA__
-
-NaN:NaN
-
-inf:inf
--inf:-inf
-
-0:0e+0
-
-# positive numbers
-
-0.000000000001:1e-12
-0.00000000001:1e-11
-0.0000000001:1e-10
-0.000000001:1e-9
-0.00000001:1e-8
-0.0000001:1e-7
-0.000001:1e-6
-0.00001:1e-5
-0.0001:1e-4
-0.001:1e-3
-0.01:1e-2
-0.1:1e-1
-1:1e+0
-10:1e+1
-100:1e+2
-1000:1e+3
-10000:1e+4
-100000:1e+5
-1000000:1e+6
-10000000:1e+7
-100000000:1e+8
-1000000000:1e+9
-10000000000:1e+10
-100000000000:1e+11
-1000000000000:1e+12
-
-0.0000000000012:12e-13
-0.000000000012:12e-12
-0.00000000012:12e-11
-0.0000000012:12e-10
-0.000000012:12e-9
-0.00000012:12e-8
-0.0000012:12e-7
-0.000012:12e-6
-0.00012:12e-5
-0.0012:12e-4
-0.012:12e-3
-0.12:12e-2
-1.2:12e-1
-12:12e+0
-120:12e+1
-1200:12e+2
-12000:12e+3
-120000:12e+4
-1200000:12e+5
-12000000:12e+6
-120000000:12e+7
-1200000000:12e+8
-12000000000:12e+9
-120000000000:12e+10
-1200000000000:12e+11
-
-0.00000000000123:123e-14
-0.0000000000123:123e-13
-0.000000000123:123e-12
-0.00000000123:123e-11
-0.0000000123:123e-10
-0.000000123:123e-9
-0.00000123:123e-8
-0.0000123:123e-7
-0.000123:123e-6
-0.00123:123e-5
-0.0123:123e-4
-0.123:123e-3
-1.23:123e-2
-12.3:123e-1
-123:123e+0
-1230:123e+1
-12300:123e+2
-123000:123e+3
-1230000:123e+4
-12300000:123e+5
-123000000:123e+6
-1230000000:123e+7
-12300000000:123e+8
-123000000000:123e+9
-1230000000000:123e+10
-
-0.000000000001234:1234e-15
-0.00000000001234:1234e-14
-0.0000000001234:1234e-13
-0.000000001234:1234e-12
-0.00000001234:1234e-11
-0.0000001234:1234e-10
-0.000001234:1234e-9
-0.00001234:1234e-8
-0.0001234:1234e-7
-0.001234:1234e-6
-0.01234:1234e-5
-0.1234:1234e-4
-1.234:1234e-3
-12.34:1234e-2
-123.4:1234e-1
-1234:1234e+0
-12340:1234e+1
-123400:1234e+2
-1234000:1234e+3
-12340000:1234e+4
-123400000:1234e+5
-1234000000:1234e+6
-12340000000:1234e+7
-123400000000:1234e+8
-1234000000000:1234e+9
-
-0.000003141592:3141592e-12
-0.00003141592:3141592e-11
-0.0003141592:3141592e-10
-0.003141592:3141592e-9
-0.03141592:3141592e-8
-0.3141592:3141592e-7
-3.141592:3141592e-6
-31.41592:3141592e-5
-314.1592:3141592e-4
-3141.592:3141592e-3
-31415.92:3141592e-2
-314159.2:3141592e-1
-3141592:3141592e+0
-
-# negative numbers
-
--0.000000000001:-1e-12
--0.00000000001:-1e-11
--0.0000000001:-1e-10
--0.000000001:-1e-9
--0.00000001:-1e-8
--0.0000001:-1e-7
--0.000001:-1e-6
--0.00001:-1e-5
--0.0001:-1e-4
--0.001:-1e-3
--0.01:-1e-2
--0.1:-1e-1
--1:-1e+0
--10:-1e+1
--100:-1e+2
--1000:-1e+3
--10000:-1e+4
--100000:-1e+5
--1000000:-1e+6
--10000000:-1e+7
--100000000:-1e+8
--1000000000:-1e+9
--10000000000:-1e+10
--100000000000:-1e+11
--1000000000000:-1e+12
-
--0.0000000000012:-12e-13
--0.000000000012:-12e-12
--0.00000000012:-12e-11
--0.0000000012:-12e-10
--0.000000012:-12e-9
--0.00000012:-12e-8
--0.0000012:-12e-7
--0.000012:-12e-6
--0.00012:-12e-5
--0.0012:-12e-4
--0.012:-12e-3
--0.12:-12e-2
--1.2:-12e-1
--12:-12e+0
--120:-12e+1
--1200:-12e+2
--12000:-12e+3
--120000:-12e+4
--1200000:-12e+5
--12000000:-12e+6
--120000000:-12e+7
--1200000000:-12e+8
--12000000000:-12e+9
--120000000000:-12e+10
--1200000000000:-12e+11
-
--0.00000000000123:-123e-14
--0.0000000000123:-123e-13
--0.000000000123:-123e-12
--0.00000000123:-123e-11
--0.0000000123:-123e-10
--0.000000123:-123e-9
--0.00000123:-123e-8
--0.0000123:-123e-7
--0.000123:-123e-6
--0.00123:-123e-5
--0.0123:-123e-4
--0.123:-123e-3
--1.23:-123e-2
--12.3:-123e-1
--123:-123e+0
--1230:-123e+1
--12300:-123e+2
--123000:-123e+3
--1230000:-123e+4
--12300000:-123e+5
--123000000:-123e+6
--1230000000:-123e+7
--12300000000:-123e+8
--123000000000:-123e+9
--1230000000000:-123e+10
-
--0.000000000001234:-1234e-15
--0.00000000001234:-1234e-14
--0.0000000001234:-1234e-13
--0.000000001234:-1234e-12
--0.00000001234:-1234e-11
--0.0000001234:-1234e-10
--0.000001234:-1234e-9
--0.00001234:-1234e-8
--0.0001234:-1234e-7
--0.001234:-1234e-6
--0.01234:-1234e-5
--0.1234:-1234e-4
--1.234:-1234e-3
--12.34:-1234e-2
--123.4:-1234e-1
--1234:-1234e+0
--12340:-1234e+1
--123400:-1234e+2
--1234000:-1234e+3
--12340000:-1234e+4
--123400000:-1234e+5
--1234000000:-1234e+6
--12340000000:-1234e+7
--123400000000:-1234e+8
--1234000000000:-1234e+9
-
--0.000003141592:-3141592e-12
--0.00003141592:-3141592e-11
--0.0003141592:-3141592e-10
--0.003141592:-3141592e-9
--0.03141592:-3141592e-8
--0.3141592:-3141592e-7
--3.141592:-3141592e-6
--31.41592:-3141592e-5
--314.1592:-3141592e-4
--3141.592:-3141592e-3
--31415.92:-3141592e-2
--314159.2:-3141592e-1
--3141592:-3141592e+0
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/bsstr-mbi.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/bsstr-mbi.t
deleted file mode 100644 (file)
index 1093aa2..0000000
+++ /dev/null
@@ -1,158 +0,0 @@
-# -*- mode: perl; -*-
-
-use strict;
-use warnings;
-
-use Test::More tests => 220;
-
-use Math::BigInt;
-
-while (<DATA>) {
-    s/#.*$//;                   # remove comments
-    s/\s+$//;                   # remove trailing whitespace
-    next unless length;         # skip empty lines
-
-    my ($x_str, $expected) = split /:/;
-    my ($x, $str);
-
-    {
-        my $test = qq|\$x = Math::BigInt -> new("$x_str");|
-                 . qq| \$str = \$x -> bsstr();|;
-
-        note "\n$test\n\n";
-        eval $test;
-
-        is($str, $expected, qq|input value is "$x_str"|);
-        is($x,   $x_str, "input object is unmodified");
-    }
-
-}
-
-__DATA__
-
-NaN:NaN
-
-inf:inf
--inf:-inf
-
-0:0e+0
-
-# positive numbers
-
-1:1e+0
-10:1e+1
-100:1e+2
-1000:1e+3
-10000:1e+4
-100000:1e+5
-1000000:1e+6
-10000000:1e+7
-100000000:1e+8
-1000000000:1e+9
-10000000000:1e+10
-100000000000:1e+11
-1000000000000:1e+12
-
-12:12e+0
-120:12e+1
-1200:12e+2
-12000:12e+3
-120000:12e+4
-1200000:12e+5
-12000000:12e+6
-120000000:12e+7
-1200000000:12e+8
-12000000000:12e+9
-120000000000:12e+10
-1200000000000:12e+11
-
-123:123e+0
-1230:123e+1
-12300:123e+2
-123000:123e+3
-1230000:123e+4
-12300000:123e+5
-123000000:123e+6
-1230000000:123e+7
-12300000000:123e+8
-123000000000:123e+9
-1230000000000:123e+10
-
-1234:1234e+0
-12340:1234e+1
-123400:1234e+2
-1234000:1234e+3
-12340000:1234e+4
-123400000:1234e+5
-1234000000:1234e+6
-12340000000:1234e+7
-123400000000:1234e+8
-1234000000000:1234e+9
-
-3:3e+0
-31:31e+0
-314:314e+0
-3141:3141e+0
-31415:31415e+0
-314159:314159e+0
-3141592:3141592e+0
-
-# negative numbers
-
--1:-1e+0
--10:-1e+1
--100:-1e+2
--1000:-1e+3
--10000:-1e+4
--100000:-1e+5
--1000000:-1e+6
--10000000:-1e+7
--100000000:-1e+8
--1000000000:-1e+9
--10000000000:-1e+10
--100000000000:-1e+11
--1000000000000:-1e+12
-
--12:-12e+0
--120:-12e+1
--1200:-12e+2
--12000:-12e+3
--120000:-12e+4
--1200000:-12e+5
--12000000:-12e+6
--120000000:-12e+7
--1200000000:-12e+8
--12000000000:-12e+9
--120000000000:-12e+10
--1200000000000:-12e+11
-
--123:-123e+0
--1230:-123e+1
--12300:-123e+2
--123000:-123e+3
--1230000:-123e+4
--12300000:-123e+5
--123000000:-123e+6
--1230000000:-123e+7
--12300000000:-123e+8
--123000000000:-123e+9
--1230000000000:-123e+10
-
--1234:-1234e+0
--12340:-1234e+1
--123400:-1234e+2
--1234000:-1234e+3
--12340000:-1234e+4
--123400000:-1234e+5
--1234000000:-1234e+6
--12340000000:-1234e+7
--123400000000:-1234e+8
--1234000000000:-1234e+9
-
--3:-3e+0
--31:-31e+0
--314:-314e+0
--3141:-3141e+0
--31415:-31415e+0
--314159:-314159e+0
--3141592:-3141592e+0
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/buparrow-mbi.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/buparrow-mbi.t
deleted file mode 100644 (file)
index f258341..0000000
+++ /dev/null
@@ -1,581 +0,0 @@
-# -*- mode: perl; -*-
-
-use strict;
-use warnings;
-
-use Test::More tests => 1021;
-
-my $class;
-
-BEGIN {
-    $class = 'Math::BigInt';
-    use_ok($class);
-}
-
-while (<DATA>) {
-    s/#.*$//;                   # remove comments
-    s/\s+$//;                   # remove trailing whitespace
-    next unless length;         # skip empty lines
-
-    my ($a, $n, $b, $expected) = split /:/;
-
-    # buparrow() modifies the invocand.
-
-    {
-        my ($x, $y);
-        my $test = qq|\$x = $class->new("$a"); \$y = \$x->buparrow($n, $b);|;
-
-        subtest $test,
-          sub {
-              plan tests => 4;
-
-              eval $test;
-              is($@, "", "'$test' gives emtpy \$\@");
-
-              is(ref($y), $class,
-                 "'$test' output arg is a $class");
-
-              is($y -> bstr(), $expected,
-                 "'$test' output arg has the right value");
-
-              is($x -> bstr(), $expected,
-                 "'$test' invocand has the right value");
-          };
-    }
-
-    # uparrow() does not modify the invocand.
-
-    {
-        my ($x, $y);
-        my $test = qq|\$x = $class->new("$a"); \$y = \$x->uparrow($n, $b);|;
-
-        subtest $test,
-          sub {
-              plan tests => 4;
-
-              eval $test;
-              is($@, "", "'$test' gives emtpy \$\@");
-
-              is(ref($y), $class,
-                 "'$test' output arg is a $class");
-
-              is($y -> bstr(), $expected,
-                 "'$test' output arg has the right value");
-
-              is($x -> bstr(), $a,
-                 "'$test' invocand has the right value");
-          };
-    }
-}
-
-__DATA__
-0:0:0:0
-0:0:1:0
-0:0:2:0
-0:0:3:0
-0:0:4:0
-0:0:5:0
-0:0:6:0
-0:0:7:0
-0:0:8:0
-0:0:9:0
-0:1:0:1
-0:1:1:0
-0:1:2:0
-0:1:3:0
-0:1:4:0
-0:1:5:0
-0:1:6:0
-0:1:7:0
-0:1:8:0
-0:1:9:0
-0:2:0:1
-0:2:1:0
-0:2:2:1
-0:2:3:0
-0:2:4:1
-0:2:5:0
-0:2:6:1
-0:2:7:0
-0:2:8:1
-0:2:9:0
-0:3:0:1
-0:3:1:0
-0:3:2:1
-0:3:3:0
-0:3:4:1
-0:3:5:0
-0:3:6:1
-0:3:7:0
-0:3:8:1
-0:3:9:0
-0:4:0:1
-0:4:1:0
-0:4:2:1
-0:4:3:0
-0:4:4:1
-0:4:5:0
-0:4:6:1
-0:4:7:0
-0:4:8:1
-0:4:9:0
-0:5:0:1
-0:5:1:0
-0:5:2:1
-0:5:3:0
-0:5:4:1
-0:5:5:0
-0:5:6:1
-0:5:7:0
-0:5:8:1
-0:5:9:0
-0:6:0:1
-0:6:1:0
-0:6:2:1
-0:6:3:0
-0:6:4:1
-0:6:5:0
-0:6:6:1
-0:6:7:0
-0:6:8:1
-0:6:9:0
-0:7:0:1
-0:7:1:0
-0:7:2:1
-0:7:3:0
-0:7:4:1
-0:7:5:0
-0:7:6:1
-0:7:7:0
-0:7:8:1
-0:7:9:0
-0:8:0:1
-0:8:1:0
-0:8:2:1
-0:8:3:0
-0:8:4:1
-0:8:5:0
-0:8:6:1
-0:8:7:0
-0:8:8:1
-0:8:9:0
-0:9:0:1
-0:9:1:0
-0:9:2:1
-0:9:3:0
-0:9:4:1
-0:9:5:0
-0:9:6:1
-0:9:7:0
-0:9:8:1
-0:9:9:0
-1:0:0:0
-1:0:1:1
-1:0:2:2
-1:0:3:3
-1:0:4:4
-1:0:5:5
-1:0:6:6
-1:0:7:7
-1:0:8:8
-1:0:9:9
-1:1:0:1
-1:1:1:1
-1:1:2:1
-1:1:3:1
-1:1:4:1
-1:1:5:1
-1:1:6:1
-1:1:7:1
-1:1:8:1
-1:1:9:1
-1:2:0:1
-1:2:1:1
-1:2:2:1
-1:2:3:1
-1:2:4:1
-1:2:5:1
-1:2:6:1
-1:2:7:1
-1:2:8:1
-1:2:9:1
-1:3:0:1
-1:3:1:1
-1:3:2:1
-1:3:3:1
-1:3:4:1
-1:3:5:1
-1:3:6:1
-1:3:7:1
-1:3:8:1
-1:3:9:1
-1:4:0:1
-1:4:1:1
-1:4:2:1
-1:4:3:1
-1:4:4:1
-1:4:5:1
-1:4:6:1
-1:4:7:1
-1:4:8:1
-1:4:9:1
-1:5:0:1
-1:5:1:1
-1:5:2:1
-1:5:3:1
-1:5:4:1
-1:5:5:1
-1:5:6:1
-1:5:7:1
-1:5:8:1
-1:5:9:1
-1:6:0:1
-1:6:1:1
-1:6:2:1
-1:6:3:1
-1:6:4:1
-1:6:5:1
-1:6:6:1
-1:6:7:1
-1:6:8:1
-1:6:9:1
-1:7:0:1
-1:7:1:1
-1:7:2:1
-1:7:3:1
-1:7:4:1
-1:7:5:1
-1:7:6:1
-1:7:7:1
-1:7:8:1
-1:7:9:1
-1:8:0:1
-1:8:1:1
-1:8:2:1
-1:8:3:1
-1:8:4:1
-1:8:5:1
-1:8:6:1
-1:8:7:1
-1:8:8:1
-1:8:9:1
-1:9:0:1
-1:9:1:1
-1:9:2:1
-1:9:3:1
-1:9:4:1
-1:9:5:1
-1:9:6:1
-1:9:7:1
-1:9:8:1
-1:9:9:1
-2:0:0:0
-2:0:1:2
-2:0:2:4
-2:0:3:6
-2:0:4:8
-2:0:5:10
-2:0:6:12
-2:0:7:14
-2:0:8:16
-2:0:9:18
-2:1:0:1
-2:1:1:2
-2:1:2:4
-2:1:3:8
-2:1:4:16
-2:1:5:32
-2:1:6:64
-2:1:7:128
-2:1:8:256
-2:1:9:512
-2:2:0:1
-2:2:1:2
-2:2:2:4
-2:2:3:16
-2:2:4:65536
-2:3:0:1
-2:3:1:2
-2:3:2:4
-2:3:3:65536
-2:4:0:1
-2:4:1:2
-2:4:2:4
-2:5:0:1
-2:5:1:2
-2:5:2:4
-2:6:0:1
-2:6:1:2
-2:6:2:4
-2:7:0:1
-2:7:1:2
-2:7:2:4
-2:8:0:1
-2:8:1:2
-2:8:2:4
-2:9:0:1
-2:9:1:2
-2:9:2:4
-3:0:0:0
-3:0:1:3
-3:0:2:6
-3:0:3:9
-3:0:4:12
-3:0:5:15
-3:0:6:18
-3:0:7:21
-3:0:8:24
-3:0:9:27
-3:1:0:1
-3:1:1:3
-3:1:2:9
-3:1:3:27
-3:1:4:81
-3:1:5:243
-3:1:6:729
-3:1:7:2187
-3:1:8:6561
-3:1:9:19683
-3:2:0:1
-3:2:1:3
-3:2:2:27
-3:2:3:7625597484987
-3:3:0:1
-3:3:1:3
-3:3:2:7625597484987
-3:4:0:1
-3:4:1:3
-3:5:0:1
-3:5:1:3
-3:6:0:1
-3:6:1:3
-3:7:0:1
-3:7:1:3
-3:8:0:1
-3:8:1:3
-3:9:0:1
-3:9:1:3
-4:0:0:0
-4:0:1:4
-4:0:2:8
-4:0:3:12
-4:0:4:16
-4:0:5:20
-4:0:6:24
-4:0:7:28
-4:0:8:32
-4:0:9:36
-4:1:0:1
-4:1:1:4
-4:1:2:16
-4:1:3:64
-4:1:4:256
-4:1:5:1024
-4:1:6:4096
-4:1:7:16384
-4:1:8:65536
-4:1:9:262144
-4:2:0:1
-4:2:1:4
-4:2:2:256
-4:2:3:13407807929942597099574024998205846127479365820592393377723561443721764030073546976801874298166903427690031858186486050853753882811946569946433649006084096
-4:3:0:1
-4:3:1:4
-4:4:0:1
-4:4:1:4
-4:5:0:1
-4:5:1:4
-4:6:0:1
-4:6:1:4
-4:7:0:1
-4:7:1:4
-4:8:0:1
-4:8:1:4
-4:9:0:1
-4:9:1:4
-5:0:0:0
-5:0:1:5
-5:0:2:10
-5:0:3:15
-5:0:4:20
-5:0:5:25
-5:0:6:30
-5:0:7:35
-5:0:8:40
-5:0:9:45
-5:1:0:1
-5:1:1:5
-5:1:2:25
-5:1:3:125
-5:1:4:625
-5:1:5:3125
-5:1:6:15625
-5:1:7:78125
-5:1:8:390625
-5:1:9:1953125
-5:2:0:1
-5:2:1:5
-5:2:2:3125
-5:2:3:1911012597945477520356404559703964599198081048990094337139512789246520530242615803012059386519739850265586440155794462235359212788673806972288410146915986602087961896757195701839281660338047611225975533626101001482651123413147768252411493094447176965282756285196737514395357542479093219206641883011787169122552421070050709064674382870851449950256586194461543183511379849133691779928127433840431549236855526783596374102105331546031353725325748636909159778690328266459182983815230286936572873691422648131291743762136325730321645282979486862576245362218017673224940567642819360078720713837072355305446356153946401185348493792719514594505508232749221605848912910945189959948686199543147666938013037176163592594479746164220050885079469804487133205133160739134230540198872570038329801246050197013467397175909027389493923817315786996845899794781068042822436093783946335265422815704302832442385515082316490967285712171708123232790481817268327510112746782317410985888683708522000711733492253913322300756147180429007527677793352306200618286012455254243061006894805446584704820650982664319360960388736258510747074340636286976576702699258649953557976318173902550891331223294743930343956161328334072831663498258145226862004307799084688103804187368324800903873596212919633602583120781673673742533322879296907205490595621406888825991244581842379597863476484315673760923625090371511798941424262270220066286486867868710182980872802560693101949280830825044198424796792058908817112327192301455582916746795197430548026404646854002733993860798594465961501752586965811447568510041568687730903712482535343839285397598749458497050038225012489284001826590056251286187629938044407340142347062055785305325034918189589707199305662188512963187501743535960282201038211616048545121039313312256332260766436236688296850208839496142830484739113991669622649948563685234712873294796680884509405893951104650944137909502276545653133018670633521323028460519434381399810561400652595300731790772711065783494174642684720956134647327748584238274899668755052504394218232191357223054066715373374248543645663782045701654593218154053548393614250664498585403307466468541890148134347714650315037954175778622811776585876941680908203125
-5:3:0:1
-5:3:1:5
-5:4:0:1
-5:4:1:5
-5:5:0:1
-5:5:1:5
-5:6:0:1
-5:6:1:5
-5:7:0:1
-5:7:1:5
-5:8:0:1
-5:8:1:5
-5:9:0:1
-5:9:1:5
-6:0:0:0
-6:0:1:6
-6:0:2:12
-6:0:3:18
-6:0:4:24
-6:0:5:30
-6:0:6:36
-6:0:7:42
-6:0:8:48
-6:0:9:54
-6:1:0:1
-6:1:1:6
-6:1:2:36
-6:1:3:216
-6:1:4:1296
-6:1:5:7776
-6:1:6:46656
-6:1:7:279936
-6:1:8:1679616
-6:1:9:10077696
-6:2:0:1
-6:2:1:6
-6:2:2:46656
-6:3:0:1
-6:3:1:6
-6:4:0:1
-6:4:1:6
-6:5:0:1
-6:5:1:6
-6:6:0:1
-6:6:1:6
-6:7:0:1
-6:7:1:6
-6:8:0:1
-6:8:1:6
-6:9:0:1
-6:9:1:6
-7:0:0:0
-7:0:1:7
-7:0:2:14
-7:0:3:21
-7:0:4:28
-7:0:5:35
-7:0:6:42
-7:0:7:49
-7:0:8:56
-7:0:9:63
-7:1:0:1
-7:1:1:7
-7:1:2:49
-7:1:3:343
-7:1:4:2401
-7:1:5:16807
-7:1:6:117649
-7:1:7:823543
-7:1:8:5764801
-7:1:9:40353607
-7:2:0:1
-7:2:1:7
-7:2:2:823543
-7:3:0:1
-7:3:1:7
-7:4:0:1
-7:4:1:7
-7:5:0:1
-7:5:1:7
-7:6:0:1
-7:6:1:7
-7:7:0:1
-7:7:1:7
-7:8:0:1
-7:8:1:7
-7:9:0:1
-7:9:1:7
-8:0:0:0
-8:0:1:8
-8:0:2:16
-8:0:3:24
-8:0:4:32
-8:0:5:40
-8:0:6:48
-8:0:7:56
-8:0:8:64
-8:0:9:72
-8:1:0:1
-8:1:1:8
-8:1:2:64
-8:1:3:512
-8:1:4:4096
-8:1:5:32768
-8:1:6:262144
-8:1:7:2097152
-8:1:8:16777216
-8:1:9:134217728
-8:2:0:1
-8:2:1:8
-8:2:2:16777216
-8:3:0:1
-8:3:1:8
-8:4:0:1
-8:4:1:8
-8:5:0:1
-8:5:1:8
-8:6:0:1
-8:6:1:8
-8:7:0:1
-8:7:1:8
-8:8:0:1
-8:8:1:8
-8:9:0:1
-8:9:1:8
-9:0:0:0
-9:0:1:9
-9:0:2:18
-9:0:3:27
-9:0:4:36
-9:0:5:45
-9:0:6:54
-9:0:7:63
-9:0:8:72
-9:0:9:81
-9:1:0:1
-9:1:1:9
-9:1:2:81
-9:1:3:729
-9:1:4:6561
-9:1:5:59049
-9:1:6:531441
-9:1:7:4782969
-9:1:8:43046721
-9:1:9:387420489
-9:2:0:1
-9:2:1:9
-9:2:2:387420489
-9:3:0:1
-9:3:1:9
-9:4:0:1
-9:4:1:9
-9:5:0:1
-9:5:1:9
-9:6:0:1
-9:6:1:9
-9:7:0:1
-9:7:1:9
-9:8:0:1
-9:8:1:9
-9:9:0:1
-9:9:1:9
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/const-mbf.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/const-mbf.t
deleted file mode 100644 (file)
index d6231ae..0000000
+++ /dev/null
@@ -1,314 +0,0 @@
-# -*- mode: perl; -*-
-
-# Binary, octal, and hexadecimal floating point literals were introduced in
-# v5.22.0.
-#
-# - It wasn't until v5.28.0 that binary, octal, and hexadecimal floating point
-#   literals were converted to the correct value on perls compiled with quadmath
-#   support.
-#
-# - It wasn't until v5.32.0 that binary and octal floating point literals worked
-#   correctly with constant overloading. Before v5.32.0, it seems like the
-#   second character is always silently converted to an "x", so, e.g., "0b1.1p8"
-#   is passed to the overload::constant subroutine as "0x1.1p8", and "01.1p+8"
-#   is passed as "0x.1p+8".
-#
-# - Octal floating point literals using the "0o" prefix were introduced in
-#   v5.34.0.
-
-# Note that all numeric literals that should not be overloaded must be quoted.
-
-use strict;
-use warnings;
-
-use Test::More tests => "170";
-
-use Math::BigFloat ":constant";
-
-my $class = "Math::BigFloat";
-my $x;
-
-################################################################################
-# The following tests should be identical for Math::BigInt, Math::BigFloat and
-# Math::BigRat.
-
-# These are handled by "binary".
-
-$x = 0xff;
-is($x, "255", "hexadecimal integer literal 0xff");
-is(ref($x), $class, "value is a $class");
-
-SKIP: {
-    # Hexadecimal literals using the "0X" prefix require v5.14.0.
-    skip "perl v5.14.0 required for hexadecimal integer literals"
-      . " with '0X' prefix", "2" if $] < "5.014";
-
-    $x = eval "0XFF";
-    is($x, "255", "hexadecimal integer literal 0XFF");
-    is(ref($x), $class, "value is a $class");
-}
-
-$x = 0377;
-is($x, "255", "octal integer literal 0377");
-is(ref($x), $class, "value is a $class");
-
-SKIP: {
-    # Octal literals using the "0o" prefix require v5.34.0.
-    skip "perl v5.34.0 required for octal floating point literals"
-      . " with '0o' prefix", "4" if $] < "5.034";
-
-    for my $str (qw/ 0o377 0O377 /) {
-        $x = eval $str;
-        is($x, "255", "octal integer literal $str");
-        is(ref($x), $class, "value is a $class");
-    }
-}
-
-$x = 0b11111111;
-is($x, "255", "binary integer literal 0b11111111");
-is(ref($x), $class, "value is a $class");
-
-SKIP: {
-    # Binary literals using the "0B" prefix require v5.14.0.
-    skip "perl v5.14.0 required for binary integer literals"
-      . " with '0B' prefix", "2" if $] < "5.014";
-
-    $x = eval "0B11111111";
-    is($x, "255", "binary integer literal 0B11111111");
-    is(ref($x), $class, "value is a $class");
-}
-
-# These are handled by "float".
-
-$x = 999999999999999999999999999999999999999999999999999999999999999999999999;
-is($x,
-   "999999999999999999999999999999999999999999999999999999999999999999999999",
-   "decimal integer literal " . ("9" x 72));
-is(ref($x), $class, "value is a $class");
-
-$x = 1e72 - 1;
-is($x,
-   "999999999999999999999999999999999999999999999999999999999999999999999999",
-   "literal 1e72 - 1");
-is(ref($x), $class, "value is a $class");
-
-# These are handled by "float".
-
-SKIP: {
-    # Hexadecimal floating point literals require v5.28.0.
-    skip "perl v5.28.0 required for hexadecimal floating point literals",
-      "6" * "2" + "2" * "2" if $] < "5.028";
-
-    for my $str (qw/ 0x1.3ap+8 0X1.3AP+8
-                     0x1.3ap8  0X1.3AP8
-                     0x13a0p-4 0X13A0P-4 /)
-    {
-        $x = eval $str;
-        is($x, "314", "hexadecimal floating point literal $str");
-        is(ref($x), $class, "value is a $class");
-    }
-
-    for my $str (qw/ 0x0.0p+8 0X0.0P+8 /)
-    {
-        $x = eval $str;
-        is($x, "0", "hexadecimal floating point literal $str");
-        is(ref($x), $class, "value is a $class");
-    }
-}
-
-SKIP: {
-    # Octal floating point literals using the "0o" prefix require v5.34.0.
-    skip "perl v5.34.0 required for octal floating point literals"
-      . " with '0o' prefix", "6" * "2" + "6" * "2" if $] < "5.034";
-
-    for my $str (qw/ 0o1.164p+8 0O1.164P+8
-                     0o1.164p8  0O1.164P8
-                     0o11640p-4 0O11640P-4 /)
-    {
-        $x = eval $str;
-        is($x, "314", "octal floating point literal $str");
-        is(ref($x), $class, "value is a $class");
-    }
-
-    for my $str (qw/ 0o0.0p+8 0O0.0P+8
-                     0o0.0p8  0O0.0P8
-                     0o0.0p-8 0O0.0P-8 /)
-    {
-        $x = eval $str;
-        is($x, "0", "octal floating point literal $str");
-        is(ref($x), $class, "value is a $class");
-    }
-}
-
-SKIP: {
-    # Octal floating point literals using the "0" prefix require v5.32.0.
-    skip "perl v5.32.0 required for octal floating point literals",
-      "6" * "2" + "6" * "2" if $] < "5.032";
-
-    for my $str (qw/ 01.164p+8 01.164P+8
-                     01.164p8  01.164P8
-                     011640p-4 011640P-4 /)
-    {
-        $x = eval $str;
-        is($x, "314", "octal floating point literal $str");
-        is(ref($x), $class, "value is a $class");
-    }
-
-    for my $str (qw/ 00.0p+8 00.0P+8
-                     00.0p8 00.0P8
-                     00.0p-8 00.0P-8 /)
-    {
-        $x = eval $str;
-        is($x, "0", "octal floating point literal $str");
-        is(ref($x), $class, "value is a $class");
-    }
-}
-
-SKIP: {
-    # Binary floating point literals require v5.32.0.
-    skip "perl v5.32.0 required for binary floating point literals",
-      "6" * "2" + "6" * "2" if $] < "5.032";
-
-    for my $str (qw/ 0b1.0011101p+8   0B1.0011101P+8
-                     0b1.0011101p8    0B1.0011101P8
-                     0b10011101000p-2 0B10011101000P-2 /)
-    {
-        $x = eval $str;
-        is($x, "314", "binary floating point literal $str");
-        is(ref($x), $class, "value is a $class");
-    }
-
-    for my $str (qw/ 0b0p+8 0B0P+8
-                     0b0p8 0B0P8
-                     0b0p-8 0B0P-8
-                   /)
-    {
-        $x = eval $str;
-        is($x, "0", "binary floating point literal $str");
-        is(ref($x), $class, "value is a $class");
-    }
-}
-
-# These are handled by "integer".
-
-$x = 314;
-is($x, "314", "integer literal 314");
-is(ref($x), $class, "value is a $class");
-
-$x = 0;
-is($x, "0", "integer literal 0");
-is(ref($x), $class, "value is a $class");
-
-$x = 2 ** 255;
-is($x,
-   "578960446186580977117854925043439539266"
-   . "34992332820282019728792003956564819968",
-   "2 ** 255");
-is(ref($x), $class, "value is a $class");
-
-# These are handled by "binary".
-
-{
-    no warnings "portable";     # protect against "non-portable" warnings
-
-    # hexadecimal constant
-    $x = 0x123456789012345678901234567890;
-    is($x,
-       "94522879687365475552814062743484560",
-       "hexadecimal constant 0x123456789012345678901234567890");
-    is(ref($x), $class, "value is a $class");
-
-    # octal constant
-    $x = 012345676543210123456765432101234567654321;
-    is($x,
-       "1736132869400711976876385488263403729",
-       "octal constant 012345676543210123456765432101234567654321");
-    is(ref($x), $class, "value is a $class");
-
-    # binary constant
-    $x = 0b01010100011001010110110001110011010010010110000101101101;
-    is($x,
-       "23755414508757357",
-       "binary constant 0b0101010001100101011011000111"
-       . "0011010010010110000101101101");
-    is(ref($x), $class, "value is a $class");
-}
-
-################################################################################
-# The following tests are unique to $class.
-
-# These are handled by "float".
-
-$x = 0.999999999999999999999999999999999999999999999999999999999999999999999999;
-is($x,
-   "0.999999999999999999999999999999999999999999999999999999999999999999999999",
-   "decimal floating point literal 0." . ("9" x 72));
-is(ref($x), $class, "value is a $class");
-
-$x = 1e72 - 0.1;
-is($x,
-   "999999999999999999999999999999999999999999999999999999999999999999999999.9",
-   "literal 1e72 - 0.1");
-is(ref($x), $class, "value is a $class");
-
-# These are handled by "float".
-
-SKIP: {
-    # Hexadecimal floating point literals require v5.28.0.
-    skip "perl v5.28.0 required for hexadecimal floating point literals",
-      "6" * "2" if $] < "5.028";
-
-    for my $str (qw/ 0x1.92p+1 0X1.92P+1
-                     0x1.92p1 0X1.92P1
-                     0x19.2p-3 0X19.2P-3 /)
-    {
-        $x = eval $str;
-        is($x, "3.140625", "hexadecimal floating point literal $str");
-        is(ref($x), $class, "value is a $class");
-    }
-}
-
-SKIP: {
-    # Octal floating point literals using the "0o" prefix require v5.34.0.
-    skip "perl v5.34.0 required for octal floating point literals"
-      . " with '0o' prefix", "6" * "2" if $] < "5.034";
-
-    for my $str (qw/ 0o1.444p+1 0O1.444P+1
-                     0o1.444p1  0O1.444P1
-                     0o14.44p-2 0O14.44P-2 /)
-    {
-        $x = eval $str;
-        is($x, "3.140625", "octal floating point literal $str");
-        is(ref($x), $class, "value is a $class");
-    }
-}
-
-SKIP: {
-    # Octal floating point literals using the "0" prefix require v5.32.0.
-    skip "perl v5.32.0 required for octal floating point literals",
-      "6" * "2" if $] < "5.032";
-
-    for my $str (qw/ 01.444p+1 01.444P+1
-                     01.444p1  01.444P1
-                     014.44p-2 014.44P-2 /)
-    {
-        $x = eval $str;
-        is($x, "3.140625", "octal floating point literal $str");
-        is(ref($x), $class, "value is a $class");
-    }
-}
-
-SKIP: {
-    # Binary floating point literals require v5.32.0.
-    skip "perl v5.32.0 required for binary floating point literals",
-      "6" * "2" if $] < "5.032";
-
-    for my $str (qw/ 0b1.1001001p+1 0B1.1001001P+1
-                     0b1.1001001p1  0B1.1001001P1
-                     0b110.01001p-1 0B110.01001P-1 /)
-    {
-        $x = eval $str;
-        is($x, "3.140625", "binary floating point literal $str");
-        is(ref($x), $class, "value is a $class");
-    }
-}
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/const-mbi.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/const-mbi.t
deleted file mode 100644 (file)
index 17c30c2..0000000
+++ /dev/null
@@ -1,235 +0,0 @@
-# -*- mode: perl; -*-
-
-# Binary, octal, and hexadecimal floating point literals were introduced in
-# v5.22.0.
-#
-# - It wasn't until v5.28.0 that binary, octal, and hexadecimal floating point
-#   literals were converted to the correct value on perls compiled with quadmath
-#   support.
-#
-# - It wasn't until v5.34.0 that binary and octal floating point literals worked
-#   correctly with constant overloading. Before v5.34.0, it seems like the
-#   second character is always silently converted to an "x", so, e.g., "0b1.1p8"
-#   is passed to the overload::constant subroutine as "0x1.1p8", and "01.1p+8"
-#   is passed as "0x.1p+8".
-#
-# - Octal floating point literals using the "0o" prefix were introduced in
-#   v5.34.0.
-
-# Note that all numeric literals that should not be overloaded must be quoted.
-
-use strict;
-use warnings;
-
-use Test::More tests => "118";
-
-use Math::BigInt ":constant";
-
-my $class = "Math::BigInt";
-my $x;
-
-################################################################################
-# The following tests should be identical for Math::BigInt, Math::BigFloat and
-# Math::BigRat.
-
-# These are handled by "binary".
-
-$x = 0xff;
-is($x, "255", "hexadecimal integer literal 0xff");
-is(ref($x), $class, "value is a $class");
-
-SKIP: {
-    # Hexadecimal literals using the "0X" prefix require v5.14.0.
-    skip "perl v5.14.0 required for hexadecimal integer literals"
-      . " with '0X' prefix", "2" if $] < "5.014";
-
-    $x = eval "0XFF";
-    is($x, "255", "hexadecimal integer literal 0XFF");
-    is(ref($x), $class, "value is a $class");
-}
-
-$x = 0377;
-is($x, "255", "octal integer literal 0377");
-is(ref($x), $class, "value is a $class");
-
-SKIP: {
-    # Octal literals using the "0o" prefix were introduced in v5.34.0.
-    skip "perl v5.34.0 required for octal floating point literals"
-      . " with '0o' prefix", "4" if $] < "5.034";
-
-    for my $str (qw/ 0o377 0O377 /) {
-        $x = eval $str;
-        is($x, "255", "octal integer literal $str");
-        is(ref($x), $class, "value is a $class");
-    }
-}
-
-$x = 0b11111111;
-is($x, "255", "binary integer literal 0b11111111");
-is(ref($x), $class, "value is a $class");
-
-SKIP: {
-    # Binary literals using the "0B" prefix require v5.14.0.
-    skip "perl v5.14.0 required for binary integer literals"
-      . " with '0B' prefix", "2" if $] < "5.014";
-
-    $x = eval "0B11111111";
-    is($x, "255", "binary integer literal 0B11111111");
-    is(ref($x), $class, "value is a $class");
-}
-
-# These are handled by "float".
-
-$x = 999999999999999999999999999999999999999999999999999999999999999999999999;
-is($x,
-   "999999999999999999999999999999999999999999999999999999999999999999999999",
-   "decimal integer literal " . ("9" x 72));
-is(ref($x), $class, "value is a $class");
-
-$x = 1e72 - 1;
-is($x,
-   "999999999999999999999999999999999999999999999999999999999999999999999999",
-   "literal 1e72 - 1");
-is(ref($x), $class, "value is a $class");
-
-# These are handled by "float".
-
-SKIP: {
-    # Hexadecimal floating point literals require v5.28.0.
-    skip "perl v5.28.0 required for hexadecimal floating point literals",
-      "6" * "2" + "2" * "2" if $] < "5.028";
-
-    for my $str (qw/ 0x1.3ap+8 0X1.3AP+8
-                     0x1.3ap8  0X1.3AP8
-                     0x13a0p-4 0X13A0P-4 /)
-    {
-        $x = eval $str;
-        is($x, "314", "hexadecimal floating point literal $str");
-        is(ref($x), $class, "value is a $class");
-    }
-
-    for my $str (qw/ 0x0.0p+8 0X0.0P+8 /)
-    {
-        $x = eval $str;
-        is($x, "0", "hexadecimal floating point literal $str");
-        is(ref($x), $class, "value is a $class");
-    }
-}
-
-SKIP: {
-    # Octal floating point literals using the "0o" prefix require v5.34.0.
-    skip "perl v5.34.0 required for octal floating point literals"
-      . " with '0o' prefix", "6" * "2" + "6" * "2" if $] < "5.034";
-
-    for my $str (qw/ 0o1.164p+8 0O1.164P+8
-                     0o1.164p8  0O1.164P8
-                     0o11640p-4 0O11640P-4 /)
-    {
-        $x = eval $str;
-        is($x, "314", "octal floating point literal $str");
-        is(ref($x), $class, "value is a $class");
-    }
-
-    for my $str (qw/ 0o0.0p+8 0O0.0P+8
-                     0o0.0p8  0O0.0P8
-                     0o0.0p-8 0O0.0P-8 /)
-    {
-        $x = eval $str;
-        is($x, "0", "octal floating point literal $str");
-        is(ref($x), $class, "value is a $class");
-    }
-}
-
-SKIP: {
-    # Octal floating point literals using the "0" prefix require v5.32.0.
-    skip "perl v5.32.0 required for octal floating point literals",
-      "6" * "2" + "6" * "2" if $] < "5.032";
-
-    for my $str (qw/ 01.164p+8 01.164P+8
-                     01.164p8  01.164P8
-                     011640p-4 011640P-4 /)
-    {
-        $x = eval $str;
-        is($x, "314", "octal floating point literal $str");
-        is(ref($x), $class, "value is a $class");
-    }
-
-    for my $str (qw/ 00.0p+8 00.0P+8
-                     00.0p8 00.0P8
-                     00.0p-8 00.0P-8 /)
-    {
-        $x = eval $str;
-        is($x, "0", "octal floating point literal $str");
-        is(ref($x), $class, "value is a $class");
-    }
-}
-
-SKIP: {
-    # Binary floating point literals require v5.32.0.
-    skip "perl v5.32.0 required for binary floating point literals",
-      "6" * "2" + "6" * "2" if $] < "5.032";
-
-    for my $str (qw/ 0b1.0011101p+8   0B1.0011101P+8
-                     0b1.0011101p8    0B1.0011101P8
-                     0b10011101000p-2 0B10011101000P-2 /)
-    {
-        $x = eval $str;
-        is($x, "314", "binary floating point literal $str");
-        is(ref($x), $class, "value is a $class");
-    }
-
-    for my $str (qw/ 0b0p+8 0B0P+8
-                     0b0p8 0B0P8
-                     0b0p-8 0B0P-8
-                   /)
-    {
-        $x = eval $str;
-        is($x, "0", "binary floating point literal $str");
-        is(ref($x), $class, "value is a $class");
-    }
-}
-
-# These are handled by "integer".
-
-$x = 314;
-is($x, "314", "integer literal 314");
-is(ref($x), $class, "value is a $class");
-
-$x = 0;
-is($x, "0", "integer literal 0");
-is(ref($x), $class, "value is a $class");
-
-$x = 2 ** 255;
-is($x,
-   "578960446186580977117854925043439539266"
-   . "34992332820282019728792003956564819968",
-   "2 ** 255");
-is(ref($x), $class, "value is a $class");
-
-# These are handled by "binary".
-
-{
-    no warnings "portable";     # protect against "non-portable" warnings
-
-    # hexadecimal constant
-    $x = 0x123456789012345678901234567890;
-    is($x,
-       "94522879687365475552814062743484560",
-       "hexadecimal constant 0x123456789012345678901234567890");
-    is(ref($x), $class, "value is a $class");
-
-    # octal constant
-    $x = 012345676543210123456765432101234567654321;
-    is($x,
-       "1736132869400711976876385488263403729",
-       "octal constant 012345676543210123456765432101234567654321");
-    is(ref($x), $class, "value is a $class");
-
-    # binary constant
-    $x = 0b01010100011001010110110001110011010010010110000101101101;
-    is($x,
-       "23755414508757357",
-       "binary constant 0b0101010001100101011011000111"
-       . "0011010010010110000101101101");
-    is(ref($x), $class, "value is a $class");
-}
index c5f3440..1d76a76 100755 (executable)
 use strict;
 use warnings;
 
-use Test::More tests => 164;
+use Test::More tests => 93;
 
 use Math::BigInt   upgrade   => 'Math::BigFloat';
 use Math::BigFloat downgrade => 'Math::BigInt';
 
-# simplistic test for now
 is(Math::BigFloat->downgrade(), 'Math::BigInt', 'Math::BigFloat->downgrade()');
 is(Math::BigInt->upgrade(), 'Math::BigFloat', 'Math::BigInt->upgrade()');
 
 # bug until v1.67:
-is(Math::BigFloat->new("0.2E0"), "0.2", qq|Math::BigFloat->new("0.2E0")|);
-is(Math::BigFloat->new("0.2E1"), "2",   qq|Math::BigFloat->new("0.2E1")|);
-# until v1.67 resulted in 200:
-is(Math::BigFloat->new("0.2E2"), "20",  qq|Math::BigFloat->new("0.2E2")|);
-
-# disable, otherwise it screws calculations
-Math::BigFloat->upgrade(undef);
-is(Math::BigFloat->upgrade() || "", "", qq/Math::BigFloat->upgrade() || ""/);
-
-Math::BigFloat->div_scale(20);  # make it a bit faster
-my $x = Math::BigFloat->new(2);    # downgrades
-# the following test upgrade for bsqrt() and also makes new() NOT downgrade
-# for the bpow() side
-is(Math::BigFloat->bpow("2", "0.5"), $x->bsqrt(),
-   qq|Math::BigFloat->bpow("2", "0.5")|);
+
+subtest 'Math::BigFloat->new("0.2E0")' => sub {
+    plan tests => 2;
+    my $x = Math::BigFloat->new("0.2E0");
+    is($x, "0.2", 'value of $x');
+    is(ref($x), "Math::BigFloat", '$x is a Math::BigFloat');
+};
+
+subtest 'Math::BigFloat->new("0.2E1")' => sub {
+    plan tests => 2;
+    my $x = Math::BigFloat->new("2");
+    is($x, "2", 'value of $x');
+    is(ref($x), "Math::BigInt", '$x is downgraded to a Math::BigInt');
+};
+
+subtest 'Math::BigFloat->new("0.2E2")' => sub {
+    plan tests => 2;
+    my $x = Math::BigFloat->new("20");
+    is($x, "20", 'value of $x');
+    is(ref($x), "Math::BigInt", '$x is downgraded to a Math::BigInt');
+};
+
+# $x is a downgraded to a Math::BigInt, but bpow() and bsqrt() upgrades to
+# Math::BigFloat.
+
+Math::BigFloat -> div_scale(20);        # make it a bit faster
+
+my ($x, $y, $z);
+subtest '$x = Math::BigFloat -> new(2);' => sub {
+    plan tests => 2;
+    $x = Math::BigFloat -> new(2);     # downgrades
+    is(ref($x), 'Math::BigInt', '$x is downgraded to a Math::BigInt');
+    cmp_ok($x, "==", 2, 'value of $x');
+};
+
+subtest '$y = Math::BigFloat -> bpow("2", "0.5");' => sub {
+    plan tests => 2;
+    $y = Math::BigFloat -> bpow("2", "0.5");
+    is(ref($y), 'Math::BigFloat', '$y is a Math::BigFloat');
+    cmp_ok($y, "==", "1.4142135623730950488", 'value of $y');
+};
+
+subtest '$z = $x -> bsqrt();' => sub {
+    plan tests => 2;
+    $z = $x -> bsqrt();
+    is(ref($z), 'Math::BigFloat', '$y is a Math::BigFloat');
+    cmp_ok($z, "==", "1.4142135623730950488", 'value of $z');
+};
+
+# log_2(16) = 4
+
+subtest '$x = Math::BigFloat -> new(16); $y = $x -> blog(2);' => sub {
+    plan tests => 4;
+    $x = Math::BigFloat -> new(16);
+    is(ref($x), 'Math::BigInt', '$x is downgraded to a Math::BigInt');
+    cmp_ok($x, "==", 16, 'value of $x');
+    $y = $x -> blog(2);
+    is(ref($y), 'Math::BigInt', '$y is downgraded to a Math::BigInt');
+    cmp_ok($y, "==", 4, 'value of $y');
+};
+
+# log_16(2) = 1/4
+
+subtest '$x = Math::BigFloat -> new(2); $y = $x -> blog(16);' => sub {
+    plan tests => 4;
+    $x = Math::BigFloat -> new(2);
+    is(ref($x), 'Math::BigInt', '$x is downgraded to a Math::BigInt');
+    cmp_ok($x, "==", 2, 'value of $x');
+    $y = $x -> blog(16);
+    is(ref($y), 'Math::BigFloat', '$y is a Math::BigFloat');
+    cmp_ok($y, "==", 0.25, 'value of $y');
+};
 
 ################################################################################
 # Verify that constructors downgrade when they should.
 
 note("Enable downgrading, and see if constructors downgrade");
 
-Math::BigFloat -> downgrade("Math::BigInt");
-
-# new()
+note("testing new()");
 
 $x = Math::BigFloat -> new("0.5");
-cmp_ok($x, "==", 0.5);
-is(ref $x, "Math::BigFloat", "Creating a 0.5 does not downgrade");
+subtest '$x = Math::BigFloat -> new("0.5")' => sub {
+    plan tests => 2;
+    cmp_ok($x, "==", 0.5, 'value of $x');
+    is(ref $x, "Math::BigFloat", "does not downgrade from Math::BigFloat");
+};
 
 $x = Math::BigFloat -> new("4");
-cmp_ok($x, "==", 4, 'new("4")');
-is(ref $x, "Math::BigInt", "Creating a 4 downgrades to Math::BigInt");
+subtest '$x = Math::BigFloat -> new("4")' => sub {
+    plan tests => 2;
+    cmp_ok($x, "==", 4, 'value of $x');
+    is(ref $x, "Math::BigInt", "downgrades to Math::BigInt");
+};
 
 $x = Math::BigFloat -> new("0");
-cmp_ok($x, "==", 0, 'new("0")');
-is(ref $x, "Math::BigInt", "Creating a 0 downgrades to Math::BigInt");
+subtest '$x = Math::BigFloat -> new("0")' => sub {
+    plan tests => 2;
+    cmp_ok($x, "==", 0, 'value of $x');
+    is(ref $x, "Math::BigInt", "downgrades to Math::BigInt");
+};
 
 $x = Math::BigFloat -> new("1");
-cmp_ok($x, "==", 1, 'new("1")');
-is(ref $x, "Math::BigInt", "Creating a 1 downgrades to Math::BigInt");
+subtest '$x = Math::BigFloat -> new("1")' => sub {
+    plan tests => 2;
+    cmp_ok($x, "==", 1, 'value of $x');
+    is(ref $x, "Math::BigInt", "downgrades to Math::BigInt");
+};
 
 $x = Math::BigFloat -> new("Inf");
-cmp_ok($x, "==", "Inf", 'new("inf")');
-is(ref $x, "Math::BigInt", "Creating an Inf downgrades to Math::BigInt");
+subtest '$x = Math::BigFloat -> new("inf")' => sub {
+    plan tests => 2;
+    cmp_ok($x, "==", "Inf", 'value of $x');
+    is(ref $x, "Math::BigInt", "downgrades to Math::BigInt");
+};
 
 $x = Math::BigFloat -> new("NaN");
-is($x, "NaN", 'new("NaN")');
-is(ref $x, "Math::BigInt", "Creating a NaN downgrades to Math::BigInt");
+subtest '$x = Math::BigFloat -> new("NaN")' => sub {
+    plan tests => 2;
+    is($x, "NaN", );
+    is(ref $x, "Math::BigInt", "downgrades to Math::BigInt");
+};
 
-# bzero()
+note("testing bzero()");
 
 $x = Math::BigFloat -> bzero();
-cmp_ok($x, "==", 0, "bzero()");
-is(ref $x, "Math::BigInt", "Creating a 0 downgrades to Math::BigInt");
+subtest '$x = Math::BigFloat -> bzero()' => sub {
+    plan tests => 2;
+    cmp_ok($x, '==', 0, 'value of $x');
+    is(ref $x, 'Math::BigInt', 'downgrades to Math::BigInt');
+};
 
-# bone()
+note("testing bone()");
 
 $x = Math::BigFloat -> bone();
-cmp_ok($x, "==", 1, "bone()");
-is(ref $x, "Math::BigInt", "Creating a 1 downgrades to Math::BigInt");
+subtest '$x = Math::BigFloat -> bone()' => sub {
+    plan tests => 2;
+    cmp_ok($x, '==', 1, 'value of $x');
+    is(ref $x, 'Math::BigInt', 'downgrades to Math::BigInt');
+};
 
-# binf()
+note("testing binf()");
 
 $x = Math::BigFloat -> binf();
-cmp_ok($x, "==", "Inf", "binf()");
-is(ref $x, "Math::BigInt", "Creating an Inf downgrades to Math::BigInt");
+subtest '$x = Math::BigFloat -> binf()' => sub {
+    plan tests => 2;
+    cmp_ok($x, '==', 'Inf', 'value of $x');
+    is(ref $x, 'Math::BigInt', 'downgrades to Math::BigInt');
+};
 
-# bnan()
+note("testing bnan()");
 
 $x = Math::BigFloat -> bnan();
-is($x, "NaN", "bnan()");
-is(ref $x, "Math::BigInt", "Creating a NaN downgrades to Math::BigInt");
-
-# from_dec()
-
-$x = Math::BigFloat -> from_dec("3.14e2");
-cmp_ok($x, "==", 314, 'from_dec("3.14e2")');
-is(ref $x, "Math::BigInt", 'from_dec("3.14e2") downgrades to Math::BigInt');
-
-# from_hex()
-
-$x = Math::BigFloat -> from_hex("0x1.3ap+8");
-cmp_ok($x, "==", 314, 'from_hex("3.14e2")');
-is(ref $x, "Math::BigInt", 'from_hex("3.14e2") downgrades to Math::BigInt');
-
-# from_oct()
-
-$x = Math::BigFloat -> from_oct("0o1.164p+8");
-cmp_ok($x, "==", 314, 'from_oct("0o1.164p+8")');
-is(ref $x, "Math::BigInt", 'from_oct("0o1.164p+8") downgrades to Math::BigInt');
-
-# from_bin()
-
-$x = Math::BigFloat -> from_bin("0b1.0011101p+8");
-cmp_ok($x, "==", 314, 'from_bin("0b1.0011101p+8")');
-is(ref $x, "Math::BigInt",
-   'from_bin("0b1.0011101p+8") downgrades to Math::BigInt');
-
-# from_ieee754()
+subtest '$x = Math::BigFloat -> bnan()' => sub {
+    plan tests => 2;
+    is($x, 'NaN', 'value of $x');
+    is(ref $x, 'Math::BigInt', 'downgrades to Math::BigInt');
+};
+
+note("testing from_dec()");
+
+$x = Math::BigFloat -> from_dec('3.14e2');
+subtest '$x = Math::BigFloat -> from_dec("3.14e2")' => sub {
+    plan tests => 2;
+    cmp_ok($x, '==', 314, 'value of $x');
+    is(ref $x, 'Math::BigInt', 'downgrades to Math::BigInt');
+};
+
+note("testing from_hex()");
+
+$x = Math::BigFloat -> from_hex('0x1.3ap+8');
+subtest '$x = Math::BigFloat -> from_hex("3.14e2")' => sub {
+    plan tests => 2;
+    cmp_ok($x, '==', 314, 'value of $x');
+    is(ref $x, 'Math::BigInt', 'downgrades to Math::BigInt');
+};
+
+note("testing from_oct()");
+
+$x = Math::BigFloat -> from_oct('0o1.164p+8');
+subtest '$x = Math::BigFloat -> from_oct("0o1.164p+8")' => sub {
+    plan tests => 2;
+    cmp_ok($x, '==', 314, 'value of $x');
+    is(ref $x, 'Math::BigInt', 'downgrades to Math::BigInt');
+};
+
+note("testing from_bin()");
+
+$x = Math::BigFloat -> from_bin('0b1.0011101p+8');
+subtest '$x = Math::BigFloat -> from_bin("0b1.0011101p+8")' => sub {
+    plan tests => 2;
+    cmp_ok($x, '==', 314, 'value of $x');
+    is(ref $x, 'Math::BigInt', 'downgrades to Math::BigInt');
+};
+
+note("testing from_ieee754()");
 
 $x = Math::BigFloat -> from_ieee754("\x43\x9d\x00\x00", "binary32");
-cmp_ok($x, "==", 314, 'from_ieee754("\x43\x9d\x00\x00", "binary32")');
-is(ref $x, "Math::BigInt",
-   'from_ieee754("\x43\x9d\x00\x00", "binary32") downgrades to Math::BigInt');
+subtest '$x = Math::BigFloat -> from_ieee754("\x43\x9d\x00\x00", "binary32")' => sub {
+    plan tests => 2;
+    cmp_ok($x, "==", 314, 'value of $x');
+    is(ref $x, "Math::BigInt", 'downgrades to Math::BigInt');
+};
 
 note("Disable downgrading, and see if constructors downgrade");
 
 Math::BigFloat -> downgrade(undef);
 
+my $zero = Math::BigFloat -> bzero();
 my $half = Math::BigFloat -> new("0.5");
+my $one  = Math::BigFloat -> bone();
 my $four = Math::BigFloat -> new("4");
-my $zero = Math::BigFloat -> bzero();
 my $inf  = Math::BigFloat -> binf();
 my $nan  = Math::BigFloat -> bnan();
 
+is(ref $zero, "Math::BigFloat", "Creating a 0 does not downgrade");
 is(ref $half, "Math::BigFloat", "Creating a 0.5 does not downgrade");
+is(ref $one,  "Math::BigFloat", "Creating a 1 does not downgrade");
 is(ref $four, "Math::BigFloat", "Creating a 4 does not downgrade");
-is(ref $zero, "Math::BigFloat", "Creating a 0 does not downgrade");
 is(ref $inf,  "Math::BigFloat", "Creating an Inf does not downgrade");
 is(ref $nan,  "Math::BigFloat", "Creating a NaN does not downgrade");
 
@@ -141,352 +240,536 @@ is(ref $nan,  "Math::BigFloat", "Creating a NaN does not downgrade");
 
 Math::BigFloat -> downgrade("Math::BigInt");
 
-# This shouldn't be necessary, but it is. Fixme!
-
-Math::BigInt -> upgrade(undef);
-
-# bneg()
+note("testing bneg()");
 
 $x = $zero -> copy() -> bneg();
-cmp_ok($x, "==", 0, "-(0) = 0");
-is(ref($x), "Math::BigInt", "-(0) => Math::BigInt");
+subtest '$x = $zero -> copy() -> bneg();' => sub {
+    plan tests => 2;
+    cmp_ok($x, '==', 0, '-(0) = 0');
+    is(ref($x), 'Math::BigInt', '-(0) => Math::BigInt');
+};
 
 $x = $four -> copy() -> bneg();
-cmp_ok($x, "==", -4, "-(4) = -4");
-is(ref($x), "Math::BigInt", "-(4) => Math::BigInt");
+subtest '$x = $four -> copy() -> bneg();' => sub {
+    plan tests => 2;
+    cmp_ok($x, '==', -4, '-(4) = -4');
+    is(ref($x), 'Math::BigInt', '-(4) => Math::BigInt');
+};
 
 $x = $inf -> copy() -> bneg();
-cmp_ok($x, "==", "-inf", "-(Inf) = -Inf");
-is(ref($x), "Math::BigInt", "-(Inf) => Math::BigInt");
+subtest '$x = $inf -> copy() -> bneg();' => sub {
+    plan tests => 2;
+    cmp_ok($x, '==', '-inf', '-(Inf) = -Inf');
+    is(ref($x), 'Math::BigInt', '-(Inf) => Math::BigInt');
+};
 
 $x = $nan -> copy() -> bneg();
-is($x, "NaN", "-(NaN) = NaN");
-is(ref($x), "Math::BigInt", "-(NaN) => Math::BigInt");
+subtest '$x = $nan -> copy() -> bneg();' => sub {
+    plan tests => 2;
+    is($x, 'NaN', '-(NaN) = NaN');
+    is(ref($x), 'Math::BigInt', '-(NaN) => Math::BigInt');
+};
 
-# bnorm()
+note("testing bnorm()");
 
 $x = $zero -> copy() -> bnorm();
-cmp_ok($x, "==", 0, "bnorm(0)");
-is(ref($x), "Math::BigInt", "bnorm(0) => Math::BigInt");
+subtest '$x = $zero -> copy() -> bnorm();' => sub {
+    plan tests => 2;
+    cmp_ok($x, '==', 0, 'value of $x');
+    is(ref($x), 'Math::BigInt', 'bnorm(0) => Math::BigInt');
+};
 
 $x = $four -> copy() -> bnorm();
-cmp_ok($x, "==", 4, "bnorm(4)");
-is(ref($x), "Math::BigInt", "bnorm(4) => Math::BigInt");
+subtest '$x = $four -> copy() -> bnorm();' => sub {
+    plan tests => 2;
+    cmp_ok($x, '==', 4, 'value of $x');
+    is(ref($x), 'Math::BigInt', 'bnorm(4) => Math::BigInt');
+};
 
 $x = $inf -> copy() -> bnorm();
-cmp_ok($x, "==", "inf", "bnorm(Inf)");
-is(ref($x), "Math::BigInt", "bnorm(Inf) => Math::BigInt");
+subtest '$x = $inf -> copy() -> bnorm();' => sub {
+    plan tests => 2;
+    cmp_ok($x, '==', 'inf', 'value of $x');
+    is(ref($x), 'Math::BigInt', 'bnorm(Inf) => Math::BigInt');
+};
 
 $x = $nan -> copy() -> bnorm();
-is($x, "NaN", "bnorm(NaN)");
-is(ref($x), "Math::BigInt", "bnorm(NaN) => Math::BigInt");
+subtest '$x = $nan -> copy() -> bnorm();' => sub {
+    plan tests => 2;
+    is($x, 'NaN', 'bnorm(NaN)');
+    is(ref($x), 'Math::BigInt', 'bnorm(NaN) => Math::BigInt');
+};
 
-# binc()
+note("testing binc()");
 
 $x = $zero -> copy() -> binc();
-cmp_ok($x, "==", 1, "binc(0)");
-is(ref($x), "Math::BigInt", "binc(0) => Math::BigInt");
+subtest '$x = $zero -> copy() -> binc();' => sub {
+    plan tests => 2;
+    cmp_ok($x, '==', 1, 'binc(0)');
+    is(ref($x), 'Math::BigInt', 'binc(0) => Math::BigInt');
+};
 
 $x = $four -> copy() -> binc();
-cmp_ok($x, "==", 5, "binc(4)");
-is(ref($x), "Math::BigInt", "binc(4) => Math::BigInt");
+subtest '$x = $four -> copy() -> binc();' => sub {
+    plan tests => 2;
+    cmp_ok($x, '==', 5, 'binc(4)');
+    is(ref($x), 'Math::BigInt', 'binc(4) => Math::BigInt');
+};
 
 $x = $inf -> copy() -> binc();
-cmp_ok($x, "==", "inf", "binc(Inf)");
-is(ref($x), "Math::BigInt", "binc(Inf) => Math::BigInt");
+subtest '$x = $inf -> copy() -> binc();' => sub {
+    plan tests => 2;
+    cmp_ok($x, '==', 'inf', 'binc(Inf)');
+    is(ref($x), 'Math::BigInt', 'binc(Inf) => Math::BigInt');
+};
 
 $x = $nan -> copy() -> binc();
-is($x, "NaN", "binc(NaN)");
-is(ref($x), "Math::BigInt", "binc(NaN) => Math::BigInt");
+subtest '$x = $nan -> copy() -> binc();' => sub {
+    plan tests => 2;
+    is($x, 'NaN', 'binc(NaN)');
+    is(ref($x), 'Math::BigInt', 'binc(NaN) => Math::BigInt');
+};
 
-# bdec()
+note("testing bdec()");
 
 $x = $zero -> copy() -> bdec();
-cmp_ok($x, "==", -1, "bdec(0)");
-is(ref($x), "Math::BigInt", "bdec(0) => Math::BigInt");
+subtest '$x = $zero -> copy() -> bdec();' => sub {
+    plan tests => 2;
+    cmp_ok($x, '==', -1, 'bdec(0)');
+    is(ref($x), 'Math::BigInt', 'bdec(0) => Math::BigInt');
+};
 
 $x = $four -> copy() -> bdec();
-cmp_ok($x, "==", 3, "bdec(4)");
-is(ref($x), "Math::BigInt", "bdec(4) => Math::BigInt");
+subtest '$x = $four -> copy() -> bdec();' => sub {
+    plan tests => 2;
+    cmp_ok($x, '==', 3, 'bdec(4)');
+    is(ref($x), 'Math::BigInt', 'bdec(4) => Math::BigInt');
+};
 
 $x = $inf -> copy() -> bdec();
-cmp_ok($x, "==", "inf", "bdec(Inf)");
-is(ref($x), "Math::BigInt", "bdec(Inf) => Math::BigInt");
+subtest '$x = $inf -> copy() -> bdec();' => sub {
+    plan tests => 2;
+    cmp_ok($x, '==', 'inf', 'bdec(Inf)');
+    is(ref($x), 'Math::BigInt', 'bdec(Inf) => Math::BigInt');
+};
 
 $x = $nan -> copy() -> bdec();
-is($x, "NaN", "bdec(NaN)");
-is(ref($x), "Math::BigInt", "bdec(NaN) => Math::BigInt");
+subtest '' => sub {
+    plan tests => 2;
+    is($x, 'NaN', 'bdec(NaN)');
+    is(ref($x), 'Math::BigInt', 'bdec(NaN) => Math::BigInt');
+};
 
-# badd()
+note("testing badd()");
 
 $x = $half -> copy() -> badd($nan);
-is($x, "NaN", "0.5 + NaN = NaN");
-is(ref($x), "Math::BigInt", "0.5 + NaN => Math::BigInt");
+subtest '$x = $half -> copy() -> badd($nan);' => sub {
+    plan tests => 2;
+    is($x, 'NaN', '0.5 + NaN = NaN');
+    is(ref($x), 'Math::BigInt', '0.5 + NaN => Math::BigInt');
+};
 
 $x = $half -> copy() -> badd($inf);
-cmp_ok($x, "==", "+Inf", "0.5 + Inf = Inf");
-is(ref($x), "Math::BigInt", "2.5 + Inf => Math::BigInt");
+subtest '$x = $half -> copy() -> badd($inf);' => sub {
+    plan tests => 2;
+    cmp_ok($x, '==', '+Inf', '0.5 + Inf = Inf');
+    is(ref($x), 'Math::BigInt', '2.5 + Inf => Math::BigInt');
+};
 
 $x = $half -> copy() -> badd($half);
-cmp_ok($x, "==", 1, "0.5 + 0.5 = 1");
-is(ref($x), "Math::BigInt", "0.5 + 0.5 => Math::BigInt");
+subtest '$x = $half -> copy() -> badd($half);' => sub {
+    plan tests => 2;
+    cmp_ok($x, '==', 1, '0.5 + 0.5 = 1');
+    is(ref($x), 'Math::BigInt', '0.5 + 0.5 => Math::BigInt');
+};
 
 $x = $half -> copy() -> badd($half -> copy() -> bneg());
-cmp_ok($x, "==", 0, "0.5 + -0.5 = 0");
-is(ref($x), "Math::BigInt", "0.5 + -0.5 => Math::BigInt");
+subtest '$x = $half -> copy() -> badd($half -> copy() -> bneg());' => sub {
+    plan tests => 2;
+    cmp_ok($x, '==', 0, '0.5 + -0.5 = 0');
+    is(ref($x), 'Math::BigInt', '0.5 + -0.5 => Math::BigInt');
+};
 
 $x = $four -> copy() -> badd($zero);
-cmp_ok($x, "==", 4, "4 + 0 = 4");
-is(ref($x), "Math::BigInt", "4 + 0 => Math::BigInt");
+subtest '$x = $four -> copy() -> badd($zero);' => sub {
+    plan tests => 2;
+    cmp_ok($x, '==', 4, '4 + 0 = 4');
+    is(ref($x), 'Math::BigInt', '4 + 0 => Math::BigInt');
+};
 
 $x = $zero -> copy() -> badd($four);
-cmp_ok($x, "==", 4, "0 + 4 = 4");
-is(ref($x), "Math::BigInt", "0 + 4 => Math::BigInt");
+subtest '$x = $zero -> copy() -> badd($four);' => sub {
+    plan tests => 2;
+    cmp_ok($x, '==', 4, '0 + 4 = 4');
+    is(ref($x), 'Math::BigInt', '0 + 4 => Math::BigInt');
+};
 
 $x = $inf -> copy() -> badd($four);
-cmp_ok($x, "==", "+Inf", "Inf + 4 = Inf");
-is(ref($x), "Math::BigInt", "Inf + 4 => Math::BigInt");
+subtest '$x = $inf -> copy() -> badd($four);' => sub {
+    plan tests => 2;
+    cmp_ok($x, '==', '+Inf', 'Inf + 4 = Inf');
+    is(ref($x), 'Math::BigInt', 'Inf + 4 => Math::BigInt');
+};
 
 $x = $nan -> copy() -> badd($four);
-is($x, "NaN", "NaN + 4 = NaN");
-is(ref($x), "Math::BigInt", "NaN + 4 => Math::BigInt");
+subtest '$x = $nan -> copy() -> badd($four);' => sub {
+    plan tests => 2;
+    is($x, 'NaN', 'NaN + 4 = NaN');
+    is(ref($x), 'Math::BigInt', 'NaN + 4 => Math::BigInt');
+};
 
-# bsub()
+note("testing bsub()");
 
 $x = $half -> copy() -> bsub($nan);
-is($x, "NaN", "0.5 - NaN = NaN");
-is(ref($x), "Math::BigInt", "0.5 - NaN => Math::BigInt");
+subtest '$x = $half -> copy() -> bsub($nan);' => sub {
+    plan tests => 2;
+    is($x, 'NaN', '0.5 - NaN = NaN');
+    is(ref($x), 'Math::BigInt', '0.5 - NaN => Math::BigInt');
+};
 
 $x = $half -> copy() -> bsub($inf);
-cmp_ok($x, "==", "-Inf", "2.5 - Inf = -Inf");
-is(ref($x), "Math::BigInt", "2.5 - Inf => Math::BigInt");
+subtest '$x = $half -> copy() -> bsub($inf);' => sub {
+    plan tests => 2;
+    cmp_ok($x, '==', '-Inf', '2.5 - Inf = -Inf');
+    is(ref($x), 'Math::BigInt', '2.5 - Inf => Math::BigInt');
+};
 
 $x = $half -> copy() -> bsub($half);
-cmp_ok($x, "==", 0, "0.5 + 0.5 = 0");
-is(ref($x), "Math::BigInt", "0.5 - 0.5 => Math::BigInt");
+subtest '$x = $half -> copy() -> bsub($half);' => sub {
+    plan tests => 2;
+    cmp_ok($x, '==', 0, '0.5 + 0.5 = 0');
+    is(ref($x), 'Math::BigInt', '0.5 - 0.5 => Math::BigInt');
+};
 
 $x = $half -> copy() -> bsub($half -> copy() -> bneg());
-cmp_ok($x, "==", 1, "0.5 - -0.5 = 1");
-is(ref($x), "Math::BigInt", "0.5 - -0.5 => Math::BigInt");
+subtest '$x = $half -> copy() -> bsub($half -> copy() -> bneg());' => sub {
+    plan tests => 2;
+    cmp_ok($x, '==', 1, '0.5 - -0.5 = 1');
+    is(ref($x), 'Math::BigInt', '0.5 - -0.5 => Math::BigInt');
+};
 
 $x = $four -> copy() -> bsub($zero);
-cmp_ok($x, "==", 4, "4 - 0 = 4");
-is(ref($x), "Math::BigInt", "4 - 0 => Math::BigInt");
+subtest '$x = $four -> copy() -> bsub($zero);' => sub {
+    plan tests => 2;
+    cmp_ok($x, '==', 4, '4 - 0 = 4');
+    is(ref($x), 'Math::BigInt', '4 - 0 => Math::BigInt');
+};
 
 $x = $zero -> copy() -> bsub($four);
-cmp_ok($x, "==", -4, "0 - 4 = -4");
-is(ref($x), "Math::BigInt", "0 - 4 => Math::BigInt");
+subtest '$x = $zero -> copy() -> bsub($four);' => sub {
+    plan tests => 2;
+    cmp_ok($x, '==', -4, '0 - 4 = -4');
+    is(ref($x), 'Math::BigInt', '0 - 4 => Math::BigInt');
+};
 
 $x = $inf -> copy() -> bsub($four);
-cmp_ok($x, "==", "Inf", "Inf - 4 = Inf");
-is(ref($x), "Math::BigInt", "Inf - 4 => Math::BigInt");
+subtest '$x = $inf -> copy() -> bsub($four);' => sub {
+    plan tests => 2;
+    cmp_ok($x, '==', 'Inf', 'Inf - 4 = Inf');
+    is(ref($x), 'Math::BigInt', 'Inf - 4 => Math::BigInt');
+};
 
 $x = $nan -> copy() -> bsub($four);
-is($x, "NaN", "NaN - 4 = NaN");
-is(ref($x), "Math::BigInt", "NaN - 4 => Math::BigInt");
+subtest '$x = $nan -> copy() -> bsub($four);' => sub {
+    plan tests => 2;
+    is($x, 'NaN', 'NaN - 4 = NaN');
+    is(ref($x), 'Math::BigInt', 'NaN - 4 => Math::BigInt');
+};
 
-# bmul()
+note("testing bmul()");
 
 $x = $zero -> copy() -> bmul($four);
-cmp_ok($x, "==", 0, "bmul(0, 4) = 0");
-is(ref($x), "Math::BigInt", "bmul(0, 4) => Math::BigInt");
+subtest '$x = $zero -> copy() -> bmul($four);' => sub {
+    plan tests => 2;
+    cmp_ok($x, '==', 0, 'bmul(0, 4) = 0');
+    is(ref($x), 'Math::BigInt', 'bmul(0, 4) => Math::BigInt');
+};
 
 $x = $four -> copy() -> bmul($four);
-cmp_ok($x, "==", 16, "bmul(4, 4) = 16");
-is(ref($x), "Math::BigInt", "bmul(4, 4) => Math::BigInt");
+subtest '$x = $four -> copy() -> bmul($four);' => sub {
+    plan tests => 2;
+    cmp_ok($x, '==', 16, 'bmul(4, 4) = 16');
+    is(ref($x), 'Math::BigInt', 'bmul(4, 4) => Math::BigInt');
+};
 
 $x = $inf -> copy() -> bmul($four);
-cmp_ok($x, "==", "inf", "bmul(Inf, 4) = Inf");
-is(ref($x), "Math::BigInt", "bmul(Inf, 4) => Math::BigInt");
+subtest '$x = $inf -> copy() -> bmul($four);' => sub {
+    plan tests => 2;
+    cmp_ok($x, '==', 'inf', 'bmul(Inf, 4) = Inf');
+    is(ref($x), 'Math::BigInt', 'bmul(Inf, 4) => Math::BigInt');
+};
 
 $x = $nan -> copy() -> bmul($four);
-is($x, "NaN", "bmul(NaN, 4) = NaN");
-is(ref($x), "Math::BigInt", "bmul(NaN, 4) => Math::BigInt");
+subtest '$x = $nan -> copy() -> bmul($four);' => sub {
+    plan tests => 2;
+    is($x, 'NaN', 'bmul(NaN, 4) = NaN');
+    is(ref($x), 'Math::BigInt', 'bmul(NaN, 4) => Math::BigInt');
+};
 
-$x = $four -> copy() -> bmul("0.5");
-cmp_ok($x, "==", 2, "bmul(4, 0.5) = 2");
-is(ref($x), "Math::BigInt", "bmul(4, 0.5) => Math::BigInt");
+$x = $four -> copy() -> bmul('0.5');
+subtest '' => sub {
+    plan tests => 2;
+    cmp_ok($x, '==', 2, 'bmul(4, 0.5) = 2');
+    is(ref($x), 'Math::BigInt', 'bmul(4, 0.5) => Math::BigInt');
+};
 
-# bmuladd()
+note("testing bmuladd()");
 
 $x = $zero -> copy() -> bmuladd($four, $four);
-cmp_ok($x, "==", 4, "bmuladd(0, 4, 4) = 4");
-is(ref($x), "Math::BigInt", "bmuladd(0, 4, 4) => Math::BigInt");
+subtest '$x = $zero -> copy() -> bmuladd($four, $four);' => sub {
+    plan tests => 2;
+    cmp_ok($x, '==', 4, 'bmuladd(0, 4, 4) = 4');
+    is(ref($x), 'Math::BigInt', 'bmuladd(0, 4, 4) => Math::BigInt');
+};
 
 $x = $four -> copy() -> bmuladd($four, $four);
-cmp_ok($x, "==", 20, "bmuladd(4, 4, 4) = 20");
-is(ref($x), "Math::BigInt", "bmuladd(4, 4, 4) => Math::BigInt");
+subtest '$x = $four -> copy() -> bmuladd($four, $four);' => sub {
+    plan tests => 2;
+    cmp_ok($x, '==', 20, 'bmuladd(4, 4, 4) = 20');
+    is(ref($x), 'Math::BigInt', 'bmuladd(4, 4, 4) => Math::BigInt');
+};
 
 $x = $four -> copy() -> bmuladd($four, $inf);
-cmp_ok($x, "==", "inf", "bmuladd(4, 4, Inf) = Inf");
-is(ref($x), "Math::BigInt", "bmuladd(4, 4, Inf) => Math::BigInt");
+subtest '$x = $four -> copy() -> bmuladd($four, $inf);' => sub {
+    plan tests => 2;
+    cmp_ok($x, '==', 'inf', 'bmuladd(4, 4, Inf) = Inf');
+    is(ref($x), 'Math::BigInt', 'bmuladd(4, 4, Inf) => Math::BigInt');
+};
 
 $x = $inf -> copy() -> bmuladd($four, $four);
-cmp_ok($x, "==", "inf", "bmuladd(Inf, 4, 4) = Inf");
-is(ref($x), "Math::BigInt", "bmuladd(Inf, 4, 4) => Math::BigInt");
+subtest '$x = $inf -> copy() -> bmuladd($four, $four);' => sub {
+    plan tests => 2;
+    cmp_ok($x, '==', 'inf', 'bmuladd(Inf, 4, 4) = Inf');
+    is(ref($x), 'Math::BigInt', 'bmuladd(Inf, 4, 4) => Math::BigInt');
+};
 
 $x = $inf -> copy() -> bmuladd($four, $four);
-cmp_ok($x, "==", "inf", "bmuladd(Inf, 4, 4) = Inf");
-is(ref($x), "Math::BigInt", "bmuladd(Inf, 4, 4) => Math::BigInt");
+subtest '$x = $inf -> copy() -> bmuladd($four, $four);' => sub {
+    plan tests => 2;
+    cmp_ok($x, '==', 'inf', 'bmuladd(Inf, 4, 4) = Inf');
+    is(ref($x), 'Math::BigInt', 'bmuladd(Inf, 4, 4) => Math::BigInt');
+};
 
 $x = $nan -> copy() -> bmuladd($four, $four);
-is($x, "NaN", "bmuladd(NaN, 4, 4) = NaN");
-is(ref($x), "Math::BigInt", "bmuladd(NaN, 4, 4) => Math::BigInt");
+subtest '$x = $nan -> copy() -> bmuladd($four, $four);' => sub {
+    plan tests => 2;
+    is($x, 'NaN', 'bmuladd(NaN, 4, 4) = NaN');
+    is(ref($x), 'Math::BigInt', 'bmuladd(NaN, 4, 4) => Math::BigInt');
+};
 
 $x = $four -> copy() -> bmuladd("0.5", $four);
-cmp_ok($x, "==", 6, "bmuladd(4, 0.5, 4) = 6");
-is(ref($x), "Math::BigInt", "bmuladd(4, 0.5, 4) => Math::BigInt");
+subtest '$x = $four -> copy() -> bmuladd("0.5", $four);' => sub {
+    plan tests => 2;
+    cmp_ok($x, '==', 6, 'bmuladd(4, 0.5, 4) = 6');
+    is(ref($x), 'Math::BigInt', 'bmuladd(4, 0.5, 4) => Math::BigInt');
+};
 
-# bdiv()
+note("testing bdiv()");
 
-# bmod()
+$x = $zero -> copy() -> bdiv($one);
+subtest '$x = $zero -> copy() -> bdiv($one);' => sub {
+    plan tests => 2;
+    cmp_ok($x, '==', 0, 'bdiv(0, 1) = 0');
+    is(ref($x), 'Math::BigInt', 'bdiv(0, 1) => Math::BigInt');
+};
 
-# bmodpow()
+note("testing bmod()");
 
-# bpow()
+note("testing bmodpow()");
 
-# blog()
+note("testing bpow()");
 
-# bexp()
+note("testing blog()");
 
-# bnok()
+note("testing bexp()");
 
-# bsin()
+note("testing bnok()");
 
-# bcos()
+note("testing bsin()");
 
-# batan()
+note("testing bcos()");
 
-# batan()
+note("testing batan()");
 
-# bsqrt()
+note("testing batan()");
 
-# broot()
+note("testing bsqrt()");
 
-# bfac()
+note("testing broot()");
 
-# bdfac()
+note("testing bfac()");
 
-# btfac()
+note("testing bdfac()");
 
-# bmfac()
+note("testing btfac()");
 
-# blsft()
+note("testing bmfac()");
 
-# brsft()
+note("testing blsft()");
 
-# band()
+note("testing brsft()");
 
-# bior()
+note("testing band()");
 
-# bxor()
+note("testing bior()");
 
-# bnot()
+note("testing bxor()");
 
-# bround()
+note("testing bnot()");
 
-# Add tests for rounding a non-integer to an integer. Fixme!
+note("testing bround()");
+
+note("testing Add tests for rounding a non-integer to an integer. Fixme!");
 
 $x = $zero -> copy() -> bround();
-cmp_ok($x, "==", 0, "bround(0)");
-is(ref($x), "Math::BigInt", "bround(0) => Math::BigInt");
+subtest '$x = $zero -> copy() -> bround();' => sub {
+    plan tests => 2;
+    cmp_ok($x, '==', 0, 'bround(0)');
+    is(ref($x), 'Math::BigInt', 'bround(0) => Math::BigInt');
+};
 
 $x = $four -> copy() -> bround();
-cmp_ok($x, "==", 4, "bround(4)");
-is(ref($x), "Math::BigInt", "bround(4) => Math::BigInt");
+subtest '$x = $four -> copy() -> bround();' => sub {
+    plan tests => 2;
+    cmp_ok($x, '==', 4, 'bround(4)');
+    is(ref($x), 'Math::BigInt', 'bround(4) => Math::BigInt');
+};
 
 $x = $inf -> copy() -> bround();
-cmp_ok($x, "==", "inf", "bround(Inf)");
-is(ref($x), "Math::BigInt", "bround(Inf) => Math::BigInt");
+subtest '$x = $inf -> copy() -> bround();' => sub {
+    plan tests => 2;
+    cmp_ok($x, '==', 'inf', 'bround(Inf)');
+    is(ref($x), 'Math::BigInt', 'bround(Inf) => Math::BigInt');
+};
 
 $x = $nan -> copy() -> bround();
-is($x, "NaN", "bround(NaN)");
-is(ref($x), "Math::BigInt", "bround(NaN) => Math::BigInt");
+subtest '$x = $nan -> copy() -> bround();' => sub {
+    plan tests => 2;
+    is($x, 'NaN', 'bround(NaN)');
+    is(ref($x), 'Math::BigInt', 'bround(NaN) => Math::BigInt');
+};
 
-# bfround()
+note("testing bfround()");
 
-# Add tests for rounding a non-integer to an integer. Fixme!
+note("testing Add tests for rounding a non-integer to an integer. Fixme!");
 
 $x = $zero -> copy() -> bfround();
-cmp_ok($x, "==", 0, "bfround(0)");
-is(ref($x), "Math::BigInt", "bfround(0) => Math::BigInt");
+subtest '$x = $zero -> copy() -> bfround();' => sub {
+    plan tests => 2;
+    cmp_ok($x, '==', 0, 'bfround(0)');
+    is(ref($x), 'Math::BigInt', 'bfround(0) => Math::BigInt');
+};
 
 $x = $four -> copy() -> bfround();
-cmp_ok($x, "==", 4, "bfround(4)");
-is(ref($x), "Math::BigInt", "bfround(4) => Math::BigInt");
+subtest '$x = $four -> copy() -> bfround();' => sub {
+    plan tests => 2;
+    cmp_ok($x, '==', 4, 'bfround(4)');
+    is(ref($x), 'Math::BigInt', 'bfround(4) => Math::BigInt');
+};
 
 $x = $inf -> copy() -> bfround();
-cmp_ok($x, "==", "inf", "bfround(Inf)");
-is(ref($x), "Math::BigInt", "bfround(Inf) => Math::BigInt");
+subtest '$x = $inf -> copy() -> bfround();' => sub {
+    plan tests => 2;
+    cmp_ok($x, '==', 'inf', 'bfround(Inf)');
+    is(ref($x), 'Math::BigInt', 'bfround(Inf) => Math::BigInt');
+};
 
 $x = $nan -> copy() -> bfround();
-is($x, "NaN", "bfround(NaN)");
-is(ref($x), "Math::BigInt", "bfround(NaN) => Math::BigInt");
+subtest '$x = $nan -> copy() -> bfround();' => sub {
+    plan tests => 2;
+    is($x, 'NaN', 'bfround(NaN)');
+    is(ref($x), 'Math::BigInt', 'bfround(NaN) => Math::BigInt');
+};
 
-# bfloor()
+note("testing bfloor()");
 
 $x = $half -> copy() -> bfloor();
-cmp_ok($x, "==", 0, "bfloor(0)");
-is(ref($x), "Math::BigInt", "bfloor(0) => Math::BigInt");
+subtest '$x = $half -> copy() -> bfloor();' => sub {
+    plan tests => 2;
+    cmp_ok($x, '==', 0, 'bfloor(0)');
+    is(ref($x), 'Math::BigInt', 'bfloor(0) => Math::BigInt');
+};
 
 $x = $inf -> copy() -> bfloor();
-cmp_ok($x, "==", "Inf", "bfloor(Inf)");
-is(ref($x), "Math::BigInt", "bfloor(Inf) => Math::BigInt");
+subtest '$x = $inf -> copy() -> bfloor();' => sub {
+    plan tests => 2;
+    cmp_ok($x, '==', 'Inf', 'bfloor(Inf)');
+    is(ref($x), 'Math::BigInt', 'bfloor(Inf) => Math::BigInt');
+};
 
 $x = $nan -> copy() -> bfloor();
-is($x, "NaN", "bfloor(NaN)");
-is(ref($x), "Math::BigInt", "bfloor(NaN) => Math::BigInt");
+subtest '$x = $nan -> copy() -> bfloor();' => sub {
+    plan tests => 2;
+    is($x, 'NaN', 'bfloor(NaN)');
+    is(ref($x), 'Math::BigInt', 'bfloor(NaN) => Math::BigInt');
+};
 
-# bceil()
+note("testing bceil()");
 
 $x = $half -> copy() -> bceil();
-cmp_ok($x, "==", 1, "bceil(0)");
-is(ref($x), "Math::BigInt", "bceil(0) => Math::BigInt");
+subtest '$x = $half -> copy() -> bceil();' => sub {
+    plan tests => 2;
+    cmp_ok($x, '==', 1, 'bceil(0)');
+    is(ref($x), 'Math::BigInt', 'bceil(0) => Math::BigInt');
+};
 
 $x = $inf -> copy() -> bceil();
-cmp_ok($x, "==", "Inf", "bceil(Inf)");
-is(ref($x), "Math::BigInt", "bceil(Inf) => Math::BigInt");
+subtest '$x = $inf -> copy() -> bceil();' => sub {
+    plan tests => 2;
+    cmp_ok($x, '==', 'Inf', 'bceil(Inf)');
+    is(ref($x), 'Math::BigInt', 'bceil(Inf) => Math::BigInt');
+};
 
 $x = $nan -> copy() -> bceil();
-is($x, "NaN", "bceil(NaN)");
-is(ref($x), "Math::BigInt", "bceil(NaN) => Math::BigInt");
+subtest '$x = $nan -> copy() -> bceil();' => sub {
+    plan tests => 2;
+    is($x, 'NaN', 'bceil(NaN)');
+    is(ref($x), 'Math::BigInt', 'bceil(NaN) => Math::BigInt');
+};
 
-# bint()
+note("testing bint()");
 
 $x = $half -> copy() -> bint();
-cmp_ok($x, "==", 0, "bint(0)");
-is(ref($x), "Math::BigInt", "bint(0) => Math::BigInt");
+subtest '$x = $half -> copy() -> bint();' => sub {
+    plan tests => 2;
+    cmp_ok($x, '==', 0, 'bint(0)');
+    is(ref($x), 'Math::BigInt', 'bint(0) => Math::BigInt');
+};
 
 $x = $inf -> copy() -> bint();
-cmp_ok($x, "==", "Inf", "bint(Inf)");
-is(ref($x), "Math::BigInt", "bint(Inf) => Math::BigInt");
+subtest '$x = $inf -> copy() -> bint();' => sub {
+    plan tests => 2;
+    cmp_ok($x, '==', 'Inf', 'bint(Inf)');
+    is(ref($x), 'Math::BigInt', 'bint(Inf) => Math::BigInt');
+};
 
 $x = $nan -> copy() -> bint();
-is($x, "NaN", "bint(NaN)");
-is(ref($x), "Math::BigInt", "bint(NaN) => Math::BigInt");
-
-# bgcd()
+subtest '$x = $nan -> copy() -> bint();' => sub {
+    plan tests => 2;
+    is($x, 'NaN', 'bint(NaN)');
+    is(ref($x), 'Math::BigInt', 'bint(NaN) => Math::BigInt');
+};
 
-# blcm()
+note("testing bgcd()");
 
-# mantissa() ?
+note("testing blcm()");
 
-# exponent() ?
+note("testing mantissa()");
 
-# parts() ?
+note("testing exponent()");
 
-# sparts()
+note("testing parts()");
 
-# nparts()
+note("testing sparts()");
 
-# eparts()
+note("testing nparts()");
 
-# dparts()
+note("testing eparts()");
 
-# fparts()
+note("testing dparts()");
 
-# numerator()
+note("testing fparts()");
 
-# denominator()
+note("testing numerator()");
 
-#require 'upgrade.inc'; # all tests here for sharing
+note("testing denominator()");
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/dparts-mbf.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/dparts-mbf.t
deleted file mode 100644 (file)
index 43bdd22..0000000
+++ /dev/null
@@ -1,294 +0,0 @@
-# -*- mode: perl; -*-
-
-use strict;
-use warnings;
-
-use Test::More tests => 1840;
-
-use Math::BigFloat;
-
-while (<DATA>) {
-    s/#.*$//;                   # remove comments
-    s/\s+$//;                   # remove trailing whitespace
-    next unless length;         # skip empty lines
-
-    my ($x_str, $int_str, $frc_str) = split /:/;
-
-    note(qq|\n\$x = Math::BigFloat -> new("$x_str");|,
-         qq| (\$i, \$f) = \$x -> dparts();\n\n|);
-
-    {
-        my $x = Math::BigFloat -> new($x_str);
-        my ($int_got, $frc_got) = $x -> dparts();
-
-        isa_ok($int_got, "Math::BigFloat");
-        isa_ok($frc_got, "Math::BigFloat");
-
-        is($int_got, $int_str, "value of integer part");
-        is($frc_got, $frc_str, "value of fraction part");
-        is($x,       $x_str,   "input is unmodified");
-    }
-
-    note(qq|\n\$x = Math::BigFloat -> new("$x_str");|,
-         qq| \$i = \$x -> dparts();\n\n|);
-
-    {
-        my $x = Math::BigFloat -> new($x_str);
-        my $int_got = $x -> dparts();
-
-        isa_ok($int_got, "Math::BigFloat");
-
-        is($int_got, $int_str, "value of integer part");
-        is($x,       $x_str,   "input is unmodified");
-    }
-
-}
-
-__DATA__
-
-NaN:NaN:0
-
-inf:inf:0
--inf:-inf:0
-
-0:0:0
-
-# positive numbers
-
-0.000000000001:0:0.000000000001
-0.00000000001:0:0.00000000001
-0.0000000001:0:0.0000000001
-0.000000001:0:0.000000001
-0.00000001:0:0.00000001
-0.0000001:0:0.0000001
-0.000001:0:0.000001
-0.00001:0:0.00001
-0.0001:0:0.0001
-0.001:0:0.001
-0.01:0:0.01
-0.1:0:0.1
-1:1:0
-10:10:0
-100:100:0
-1000:1000:0
-10000:10000:0
-100000:100000:0
-1000000:1000000:0
-10000000:10000000:0
-100000000:100000000:0
-1000000000:1000000000:0
-10000000000:10000000000:0
-100000000000:100000000000:0
-1000000000000:1000000000000:0
-
-0.0000000000012:0:0.0000000000012
-0.000000000012:0:0.000000000012
-0.00000000012:0:0.00000000012
-0.0000000012:0:0.0000000012
-0.000000012:0:0.000000012
-0.00000012:0:0.00000012
-0.0000012:0:0.0000012
-0.000012:0:0.000012
-0.00012:0:0.00012
-0.0012:0:0.0012
-0.012:0:0.012
-0.12:0:0.12
-1.2:1:0.2
-12:12:0
-120:120:0
-1200:1200:0
-12000:12000:0
-120000:120000:0
-1200000:1200000:0
-12000000:12000000:0
-120000000:120000000:0
-1200000000:1200000000:0
-12000000000:12000000000:0
-120000000000:120000000000:0
-1200000000000:1200000000000:0
-
-0.00000000000123:0:0.00000000000123
-0.0000000000123:0:0.0000000000123
-0.000000000123:0:0.000000000123
-0.00000000123:0:0.00000000123
-0.0000000123:0:0.0000000123
-0.000000123:0:0.000000123
-0.00000123:0:0.00000123
-0.0000123:0:0.0000123
-0.000123:0:0.000123
-0.00123:0:0.00123
-0.0123:0:0.0123
-0.123:0:0.123
-1.23:1:0.23
-12.3:12:0.3
-123:123:0
-1230:1230:0
-12300:12300:0
-123000:123000:0
-1230000:1230000:0
-12300000:12300000:0
-123000000:123000000:0
-1230000000:1230000000:0
-12300000000:12300000000:0
-123000000000:123000000000:0
-1230000000000:1230000000000:0
-
-0.000000000001234:0:0.000000000001234
-0.00000000001234:0:0.00000000001234
-0.0000000001234:0:0.0000000001234
-0.000000001234:0:0.000000001234
-0.00000001234:0:0.00000001234
-0.0000001234:0:0.0000001234
-0.000001234:0:0.000001234
-0.00001234:0:0.00001234
-0.0001234:0:0.0001234
-0.001234:0:0.001234
-0.01234:0:0.01234
-0.1234:0:0.1234
-1.234:1:0.234
-12.34:12:0.34
-123.4:123:0.4
-1234:1234:0
-12340:12340:0
-123400:123400:0
-1234000:1234000:0
-12340000:12340000:0
-123400000:123400000:0
-1234000000:1234000000:0
-12340000000:12340000000:0
-123400000000:123400000000:0
-1234000000000:1234000000000:0
-
-0.000003141592:0:0.000003141592
-0.00003141592:0:0.00003141592
-0.0003141592:0:0.0003141592
-0.003141592:0:0.003141592
-0.03141592:0:0.03141592
-0.3141592:0:0.3141592
-3.141592:3:0.141592
-31.41592:31:0.41592
-314.1592:314:0.1592
-3141.592:3141:0.592
-31415.92:31415:0.92
-314159.2:314159:0.2
-3141592:3141592:0
-
-# negative numbers
-
--0.000000000001:0:-0.000000000001
--0.00000000001:0:-0.00000000001
--0.0000000001:0:-0.0000000001
--0.000000001:0:-0.000000001
--0.00000001:0:-0.00000001
--0.0000001:0:-0.0000001
--0.000001:0:-0.000001
--0.00001:0:-0.00001
--0.0001:0:-0.0001
--0.001:0:-0.001
--0.01:0:-0.01
--0.1:0:-0.1
--1:-1:0
--10:-10:0
--100:-100:0
--1000:-1000:0
--10000:-10000:0
--100000:-100000:0
--1000000:-1000000:0
--10000000:-10000000:0
--100000000:-100000000:0
--1000000000:-1000000000:0
--10000000000:-10000000000:0
--100000000000:-100000000000:0
--1000000000000:-1000000000000:0
-
--0.0000000000012:0:-0.0000000000012
--0.000000000012:0:-0.000000000012
--0.00000000012:0:-0.00000000012
--0.0000000012:0:-0.0000000012
--0.000000012:0:-0.000000012
--0.00000012:0:-0.00000012
--0.0000012:0:-0.0000012
--0.000012:0:-0.000012
--0.00012:0:-0.00012
--0.0012:0:-0.0012
--0.012:0:-0.012
--0.12:0:-0.12
--1.2:-1:-0.2
--12:-12:0
--120:-120:0
--1200:-1200:0
--12000:-12000:0
--120000:-120000:0
--1200000:-1200000:0
--12000000:-12000000:0
--120000000:-120000000:0
--1200000000:-1200000000:0
--12000000000:-12000000000:0
--120000000000:-120000000000:0
--1200000000000:-1200000000000:0
-
--0.00000000000123:0:-0.00000000000123
--0.0000000000123:0:-0.0000000000123
--0.000000000123:0:-0.000000000123
--0.00000000123:0:-0.00000000123
--0.0000000123:0:-0.0000000123
--0.000000123:0:-0.000000123
--0.00000123:0:-0.00000123
--0.0000123:0:-0.0000123
--0.000123:0:-0.000123
--0.00123:0:-0.00123
--0.0123:0:-0.0123
--0.123:0:-0.123
--1.23:-1:-0.23
--12.3:-12:-0.3
--123:-123:0
--1230:-1230:0
--12300:-12300:0
--123000:-123000:0
--1230000:-1230000:0
--12300000:-12300000:0
--123000000:-123000000:0
--1230000000:-1230000000:0
--12300000000:-12300000000:0
--123000000000:-123000000000:0
--1230000000000:-1230000000000:0
-
--0.000000000001234:0:-0.000000000001234
--0.00000000001234:0:-0.00000000001234
--0.0000000001234:0:-0.0000000001234
--0.000000001234:0:-0.000000001234
--0.00000001234:0:-0.00000001234
--0.0000001234:0:-0.0000001234
--0.000001234:0:-0.000001234
--0.00001234:0:-0.00001234
--0.0001234:0:-0.0001234
--0.001234:0:-0.001234
--0.01234:0:-0.01234
--0.1234:0:-0.1234
--1.234:-1:-0.234
--12.34:-12:-0.34
--123.4:-123:-0.4
--1234:-1234:0
--12340:-12340:0
--123400:-123400:0
--1234000:-1234000:0
--12340000:-12340000:0
--123400000:-123400000:0
--1234000000:-1234000000:0
--12340000000:-12340000000:0
--123400000000:-123400000000:0
--1234000000000:-1234000000000:0
-
--0.000003141592:0:-0.000003141592
--0.00003141592:0:-0.00003141592
--0.0003141592:0:-0.0003141592
--0.003141592:0:-0.003141592
--0.03141592:0:-0.03141592
--0.3141592:0:-0.3141592
--3.141592:-3:-0.141592
--31.41592:-31:-0.41592
--314.1592:-314:-0.1592
--3141.592:-3141:-0.592
--31415.92:-31415:-0.92
--314159.2:-314159:-0.2
--3141592:-3141592:0
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/dparts-mbi.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/dparts-mbi.t
deleted file mode 100644 (file)
index 0b4ba38..0000000
+++ /dev/null
@@ -1,162 +0,0 @@
-# -*- mode: perl; -*-
-
-use strict;
-use warnings;
-
-use Test::More tests => 784;
-
-use Math::BigInt;
-
-while (<DATA>) {
-    s/#.*$//;                   # remove comments
-    s/\s+$//;                   # remove trailing whitespace
-    next unless length;         # skip empty lines
-
-    my ($x_str, $int_str, $frc_str) = split /:/;
-
-    note(qq|\n\$x = Math::BigInt -> new("$x_str");|,
-         qq| (\$i, \$f) = \$x -> dparts();\n\n|);
-
-    {
-        my $x = Math::BigInt -> new($x_str);
-        my ($int_got, $frc_got) = $x -> dparts();
-
-        isa_ok($int_got, "Math::BigInt");
-        isa_ok($frc_got, "Math::BigInt");
-
-        is($int_got, $int_str, "value of integer part");
-        is($frc_got, $frc_str, "value of fraction part");
-        is($x,       $x_str,   "input is unmodified");
-    }
-
-    note(qq|\n\$x = Math::BigInt -> new("$x_str");|,
-         qq| \$i = \$x -> dparts();\n\n|);
-
-    {
-        my $x = Math::BigInt -> new($x_str);
-        my $int_got = $x -> dparts();
-
-        isa_ok($int_got, "Math::BigInt");
-
-        is($int_got, $int_str, "value of integer part");
-        is($x,       $x_str,   "input is unmodified");
-    }
-
-}
-
-__DATA__
-
-NaN:NaN:0
-
-inf:inf:0
--inf:-inf:0
-
-0:0:0
-
-# positive numbers
-
-1:1:0
-10:10:0
-100:100:0
-1000:1000:0
-10000:10000:0
-100000:100000:0
-1000000:1000000:0
-10000000:10000000:0
-100000000:100000000:0
-1000000000:1000000000:0
-10000000000:10000000000:0
-100000000000:100000000000:0
-1000000000000:1000000000000:0
-
-12:12:0
-120:120:0
-1200:1200:0
-12000:12000:0
-120000:120000:0
-1200000:1200000:0
-12000000:12000000:0
-120000000:120000000:0
-1200000000:1200000000:0
-12000000000:12000000000:0
-120000000000:120000000000:0
-1200000000000:1200000000000:0
-
-123:123:0
-1230:1230:0
-12300:12300:0
-123000:123000:0
-1230000:1230000:0
-12300000:12300000:0
-123000000:123000000:0
-1230000000:1230000000:0
-12300000000:12300000000:0
-123000000000:123000000000:0
-1230000000000:1230000000000:0
-
-1234:1234:0
-12340:12340:0
-123400:123400:0
-1234000:1234000:0
-12340000:12340000:0
-123400000:123400000:0
-1234000000:1234000000:0
-12340000000:12340000000:0
-123400000000:123400000000:0
-1234000000000:1234000000000:0
-
-3141592:3141592:0
-
-# negative numbers
-
--1:-1:0
--10:-10:0
--100:-100:0
--1000:-1000:0
--10000:-10000:0
--100000:-100000:0
--1000000:-1000000:0
--10000000:-10000000:0
--100000000:-100000000:0
--1000000000:-1000000000:0
--10000000000:-10000000000:0
--100000000000:-100000000000:0
--1000000000000:-1000000000000:0
-
--12:-12:0
--120:-120:0
--1200:-1200:0
--12000:-12000:0
--120000:-120000:0
--1200000:-1200000:0
--12000000:-12000000:0
--120000000:-120000000:0
--1200000000:-1200000000:0
--12000000000:-12000000000:0
--120000000000:-120000000000:0
--1200000000000:-1200000000000:0
-
--123:-123:0
--1230:-1230:0
--12300:-12300:0
--123000:-123000:0
--1230000:-1230000:0
--12300000:-12300000:0
--123000000:-123000000:0
--1230000000:-1230000000:0
--12300000000:-12300000000:0
--123000000000:-123000000000:0
--1230000000000:-1230000000000:0
-
--1234:-1234:0
--12340:-12340:0
--123400:-123400:0
--1234000:-1234000:0
--12340000:-12340000:0
--123400000:-123400000:0
--1234000000:-1234000000:0
--12340000000:-12340000000:0
--123400000000:-123400000000:0
--1234000000000:-1234000000000:0
-
--3141592:-3141592:0
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/eparts-mbf.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/eparts-mbf.t
deleted file mode 100644 (file)
index a612461..0000000
+++ /dev/null
@@ -1,294 +0,0 @@
-# -*- mode: perl; -*-
-
-use strict;
-use warnings;
-
-use Test::More tests => 1840;
-
-use Math::BigFloat;
-
-while (<DATA>) {
-    s/#.*$//;                   # remove comments
-    s/\s+$//;                   # remove trailing whitespace
-    next unless length;         # skip empty lines
-
-    my ($x_str, $mant_str, $expo_str) = split /:/;
-
-    note(qq|\n\$x = Math::BigFloat -> new("$x_str");|,
-         qq| (\$m, \$e) = \$x -> eparts();\n\n|);
-
-    {
-        my $x = Math::BigFloat -> new($x_str);
-        my ($mant_got, $expo_got) = $x -> eparts();
-
-        isa_ok($mant_got, "Math::BigFloat");
-        isa_ok($expo_got, "Math::BigFloat");
-
-        is($mant_got, $mant_str, "value of mantissa");
-        is($expo_got, $expo_str, "value of exponent");
-        is($x,        $x_str,    "input is unmodified");
-    }
-
-    note(qq|\n\$x = Math::BigFloat -> new("$x_str");|,
-         qq| \$m = \$x -> eparts();\n\n|);
-
-    {
-        my $x = Math::BigFloat -> new($x_str);
-        my $mant_got = $x -> eparts();
-
-        isa_ok($mant_got, "Math::BigFloat");
-
-        is($mant_got, $mant_str, "value of mantissa");
-        is($x,        $x_str,    "input is unmodified");
-    }
-
-}
-
-__DATA__
-
-NaN:NaN:NaN
-
-inf:inf:inf
--inf:-inf:inf
-
-0:0:0
-
-# positive numbers
-
-0.000000000001:1:-12
-0.00000000001:10:-12
-0.0000000001:100:-12
-0.000000001:1:-9
-0.00000001:10:-9
-0.0000001:100:-9
-0.000001:1:-6
-0.00001:10:-6
-0.0001:100:-6
-0.001:1:-3
-0.01:10:-3
-0.1:100:-3
-1:1:0
-10:10:0
-100:100:0
-1000:1:3
-10000:10:3
-100000:100:3
-1000000:1:6
-10000000:10:6
-100000000:100:6
-1000000000:1:9
-10000000000:10:9
-100000000000:100:9
-1000000000000:1:12
-
-0.0000000000012:1.2:-12
-0.000000000012:12:-12
-0.00000000012:120:-12
-0.0000000012:1.2:-9
-0.000000012:12:-9
-0.00000012:120:-9
-0.0000012:1.2:-6
-0.000012:12:-6
-0.00012:120:-6
-0.0012:1.2:-3
-0.012:12:-3
-0.12:120:-3
-1.2:1.2:0
-12:12:0
-120:120:0
-1200:1.2:3
-12000:12:3
-120000:120:3
-1200000:1.2:6
-12000000:12:6
-120000000:120:6
-1200000000:1.2:9
-12000000000:12:9
-120000000000:120:9
-1200000000000:1.2:12
-
-0.00000000000123:1.23:-12
-0.0000000000123:12.3:-12
-0.000000000123:123:-12
-0.00000000123:1.23:-9
-0.0000000123:12.3:-9
-0.000000123:123:-9
-0.00000123:1.23:-6
-0.0000123:12.3:-6
-0.000123:123:-6
-0.00123:1.23:-3
-0.0123:12.3:-3
-0.123:123:-3
-1.23:1.23:0
-12.3:12.3:0
-123:123:0
-1230:1.23:3
-12300:12.3:3
-123000:123:3
-1230000:1.23:6
-12300000:12.3:6
-123000000:123:6
-1230000000:1.23:9
-12300000000:12.3:9
-123000000000:123:9
-1230000000000:1.23:12
-
-0.000000000001234:1.234:-12
-0.00000000001234:12.34:-12
-0.0000000001234:123.4:-12
-0.000000001234:1.234:-9
-0.00000001234:12.34:-9
-0.0000001234:123.4:-9
-0.000001234:1.234:-6
-0.00001234:12.34:-6
-0.0001234:123.4:-6
-0.001234:1.234:-3
-0.01234:12.34:-3
-0.1234:123.4:-3
-1.234:1.234:0
-12.34:12.34:0
-123.4:123.4:0
-1234:1.234:3
-12340:12.34:3
-123400:123.4:3
-1234000:1.234:6
-12340000:12.34:6
-123400000:123.4:6
-1234000000:1.234:9
-12340000000:12.34:9
-123400000000:123.4:9
-1234000000000:1.234:12
-
-0.000003141592:3.141592:-6
-0.00003141592:31.41592:-6
-0.0003141592:314.1592:-6
-0.003141592:3.141592:-3
-0.03141592:31.41592:-3
-0.3141592:314.1592:-3
-3.141592:3.141592:0
-31.41592:31.41592:0
-314.1592:314.1592:0
-3141.592:3.141592:3
-31415.92:31.41592:3
-314159.2:314.1592:3
-3141592:3.141592:6
-
-# negativ: numbers
-
--0.000000000001:-1:-12
--0.00000000001:-10:-12
--0.0000000001:-100:-12
--0.000000001:-1:-9
--0.00000001:-10:-9
--0.0000001:-100:-9
--0.000001:-1:-6
--0.00001:-10:-6
--0.0001:-100:-6
--0.001:-1:-3
--0.01:-10:-3
--0.1:-100:-3
--1:-1:0
--10:-10:0
--100:-100:0
--1000:-1:3
--10000:-10:3
--100000:-100:3
--1000000:-1:6
--10000000:-10:6
--100000000:-100:6
--1000000000:-1:9
--10000000000:-10:9
--100000000000:-100:9
--1000000000000:-1:12
-
--0.0000000000012:-1.2:-12
--0.000000000012:-12:-12
--0.00000000012:-120:-12
--0.0000000012:-1.2:-9
--0.000000012:-12:-9
--0.00000012:-120:-9
--0.0000012:-1.2:-6
--0.000012:-12:-6
--0.00012:-120:-6
--0.0012:-1.2:-3
--0.012:-12:-3
--0.12:-120:-3
--1.2:-1.2:0
--12:-12:0
--120:-120:0
--1200:-1.2:3
--12000:-12:3
--120000:-120:3
--1200000:-1.2:6
--12000000:-12:6
--120000000:-120:6
--1200000000:-1.2:9
--12000000000:-12:9
--120000000000:-120:9
--1200000000000:-1.2:12
-
--0.00000000000123:-1.23:-12
--0.0000000000123:-12.3:-12
--0.000000000123:-123:-12
--0.00000000123:-1.23:-9
--0.0000000123:-12.3:-9
--0.000000123:-123:-9
--0.00000123:-1.23:-6
--0.0000123:-12.3:-6
--0.000123:-123:-6
--0.00123:-1.23:-3
--0.0123:-12.3:-3
--0.123:-123:-3
--1.23:-1.23:0
--12.3:-12.3:0
--123:-123:0
--1230:-1.23:3
--12300:-12.3:3
--123000:-123:3
--1230000:-1.23:6
--12300000:-12.3:6
--123000000:-123:6
--1230000000:-1.23:9
--12300000000:-12.3:9
--123000000000:-123:9
--1230000000000:-1.23:12
-
--0.000000000001234:-1.234:-12
--0.00000000001234:-12.34:-12
--0.0000000001234:-123.4:-12
--0.000000001234:-1.234:-9
--0.00000001234:-12.34:-9
--0.0000001234:-123.4:-9
--0.000001234:-1.234:-6
--0.00001234:-12.34:-6
--0.0001234:-123.4:-6
--0.001234:-1.234:-3
--0.01234:-12.34:-3
--0.1234:-123.4:-3
--1.234:-1.234:0
--12.34:-12.34:0
--123.4:-123.4:0
--1234:-1.234:3
--12340:-12.34:3
--123400:-123.4:3
--1234000:-1.234:6
--12340000:-12.34:6
--123400000:-123.4:6
--1234000000:-1.234:9
--12340000000:-12.34:9
--123400000000:-123.4:9
--1234000000000:-1.234:12
-
--0.000003141592:-3.141592:-6
--0.00003141592:-31.41592:-6
--0.0003141592:-314.1592:-6
--0.003141592:-3.141592:-3
--0.03141592:-31.41592:-3
--0.3141592:-314.1592:-3
--3.141592:-3.141592:0
--31.41592:-31.41592:0
--314.1592:-314.1592:0
--3141.592:-3.141592:3
--31415.92:-31.41592:3
--314159.2:-314.1592:3
--3141592:-3.141592:6
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/eparts-mbi.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/eparts-mbi.t
deleted file mode 100644 (file)
index 783f716..0000000
+++ /dev/null
@@ -1,162 +0,0 @@
-# -*- mode: perl; -*-
-
-use strict;
-use warnings;
-
-use Test::More tests => 784;
-
-use Math::BigInt;
-
-while (<DATA>) {
-    s/#.*$//;                   # remove comments
-    s/\s+$//;                   # remove trailing whitespace
-    next unless length;         # skip empty lines
-
-    my ($x_str, $mant_str, $expo_str) = split /:/;
-
-    note(qq|\n\$x = Math::BigInt -> new("$x_str");|,
-         qq| (\$m, \$e) = \$x -> eparts();\n\n|);
-
-    {
-        my $x = Math::BigInt -> new($x_str);
-        my ($mant_got, $expo_got) = $x -> eparts();
-
-        isa_ok($mant_got, "Math::BigInt");
-        isa_ok($expo_got, "Math::BigInt");
-
-        is($mant_got, $mant_str, "value of mantissa");
-        is($expo_got, $expo_str, "value of exponent");
-        is($x,        $x_str,    "input is unmodified");
-    }
-
-    note(qq|\n\$x = Math::BigInt -> new("$x_str");|,
-         qq| \$m = \$x -> eparts();\n\n|);
-
-    {
-        my $x = Math::BigInt -> new($x_str);
-        my $mant_got = $x -> eparts();
-
-        isa_ok($mant_got, "Math::BigInt");
-
-        is($mant_got, $mant_str, "value of mantissa");
-        is($x,        $x_str,    "input is unmodified");
-    }
-
-}
-
-__DATA__
-
-NaN:NaN:NaN
-
-inf:inf:inf
--inf:-inf:inf
-
-0:0:0
-
-# positive numbers
-
-1:1:0
-10:10:0
-100:100:0
-1000:1:3
-10000:10:3
-100000:100:3
-1000000:1:6
-10000000:10:6
-100000000:100:6
-1000000000:1:9
-10000000000:10:9
-100000000000:100:9
-1000000000000:1:12
-
-12:12:0
-120:120:0
-1200:NaN:3
-12000:12:3
-120000:120:3
-1200000:NaN:6
-12000000:12:6
-120000000:120:6
-1200000000:NaN:9
-12000000000:12:9
-120000000000:120:9
-1200000000000:NaN:12
-
-123:123:0
-1230:NaN:3
-12300:NaN:3
-123000:123:3
-1230000:NaN:6
-12300000:NaN:6
-123000000:123:6
-1230000000:NaN:9
-12300000000:NaN:9
-123000000000:123:9
-1230000000000:NaN:12
-
-1234:NaN:3
-12340:NaN:3
-123400:NaN:3
-1234000:NaN:6
-12340000:NaN:6
-123400000:NaN:6
-1234000000:NaN:9
-12340000000:NaN:9
-123400000000:NaN:9
-1234000000000:NaN:12
-
-3141592:NaN:6
-
-# negativ: numbers
-
--1:-1:0
--10:-10:0
--100:-100:0
--1000:-1:3
--10000:-10:3
--100000:-100:3
--1000000:-1:6
--10000000:-10:6
--100000000:-100:6
--1000000000:-1:9
--10000000000:-10:9
--100000000000:-100:9
--1000000000000:-1:12
-
--12:-12:0
--120:-120:0
--1200:NaN:3
--12000:-12:3
--120000:-120:3
--1200000:NaN:6
--12000000:-12:6
--120000000:-120:6
--1200000000:NaN:9
--12000000000:-12:9
--120000000000:-120:9
--1200000000000:NaN:12
-
--123:-123:0
--1230:NaN:3
--12300:NaN:3
--123000:-123:3
--1230000:NaN:6
--12300000:NaN:6
--123000000:-123:6
--1230000000:NaN:9
--12300000000:NaN:9
--123000000000:-123:9
--1230000000000:NaN:12
-
--1234:NaN:3
--12340:NaN:3
--123400:NaN:3
--1234000:NaN:6
--12340000:NaN:6
--123400000:NaN:6
--1234000000:NaN:9
--12340000000:NaN:9
--123400000000:NaN:9
--1234000000000:NaN:12
-
--3141592:NaN:6
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/fparts-mbf.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/fparts-mbf.t
deleted file mode 100644 (file)
index 8d555bd..0000000
+++ /dev/null
@@ -1,97 +0,0 @@
-# -*- mode: perl; -*-
-
-# test fparts(), numerator(), denominator()
-
-use strict;
-use warnings;
-
-use Test::More tests => 43;
-
-my $class;
-
-BEGIN {
-    $class = 'Math::BigFloat';
-    use_ok($class);
-}
-
-while (<DATA>) {
-    s/#.*$//;                   # remove comments
-    s/\s+$//;                   # remove trailing whitespace
-    next unless length;         # skip empty lines
-
-    my ($x_str, $n_str, $d_str) = split /:/;
-    my $test;
-
-    # test fparts()
-
-    $test = qq|\$x = $class -> new("$x_str");|
-          . qq| (\$n, \$d) = \$x -> fparts();|;
-
-    subtest $test => sub {
-        plan tests => 5;
-
-        my $x = $class -> new($x_str);
-        my ($n, $d) = $x -> fparts();
-
-        is(ref($n), $class, "class of numerator");
-        is(ref($d), $class, "class of denominator");
-
-        is($n, $n_str, "value of numerator");
-        is($d, $d_str, "value of denominator");
-        is($x, $x_str, "input is unmodified");
-    };
-
-    # test numerator()
-
-    $test = qq|\$x = $class -> new("$x_str");|
-          . qq| \$n = \$x -> numerator();|;
-
-    subtest $test => sub {
-        plan tests => 3;
-
-        my $x = $class -> new($x_str);
-        my $n = $x -> numerator();
-
-        is(ref($n), $class, "class of numerator");
-
-        is($n, $n_str, "value of numerator");
-        is($x, $x_str, "input is unmodified");
-    };
-
-    # test denominator()
-
-    $test = qq|\$x = $class -> new("$x_str");|
-          . qq| \$d = \$x -> denominator();|;
-
-    subtest $test => sub {
-        plan tests => 3;
-
-        my $x = $class -> new($x_str);
-        my $d = $x -> denominator();
-
-        is(ref($d), $class, "class of denominator");
-
-        is($d, $d_str, "value of denominator");
-        is($x, $x_str, "input is unmodified");
-    };
-}
-
-__DATA__
-
-NaN:NaN:NaN
-
-inf:inf:1
--inf:-inf:1
-
--30:-30:1
--3:-3:1
--1:-1:1
-0:0:1
-1:1:1
-3:3:1
-30:30:1
-
--31400:-31400:1
--3.14:-157:50
-3.14:157:50
-31400:31400:1
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/fparts-mbi.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/fparts-mbi.t
deleted file mode 100644 (file)
index 449d6d8..0000000
+++ /dev/null
@@ -1,92 +0,0 @@
-# -*- mode: perl; -*-
-
-# test fparts(), numerator(), denominator()
-
-use strict;
-use warnings;
-
-use Test::More tests => 31;
-
-my $class;
-
-BEGIN {
-    $class = 'Math::BigInt';
-    use_ok($class);
-}
-
-while (<DATA>) {
-    s/#.*$//;                   # remove comments
-    s/\s+$//;                   # remove trailing whitespace
-    next unless length;         # skip empty lines
-
-    my ($x_str, $n_str, $d_str) = split /:/;
-    my $test;
-
-    # test fparts()
-
-    $test = qq|\$x = $class -> new("$x_str");|
-          . qq| (\$n, \$d) = \$x -> fparts();|;
-
-    subtest $test => sub {
-        plan tests => 5;
-
-        my $x = $class -> new($x_str);
-        my ($n, $d) = $x -> fparts();
-
-        is(ref($n), $class, "class of numerator");
-        is(ref($d), $class, "class of denominator");
-
-        is($n, $n_str, "value of numerator");
-        is($d, $d_str, "value of denominator");
-        is($x, $x_str, "input is unmodified");
-    };
-
-    # test numerator()
-
-    $test = qq|\$x = $class -> new("$x_str");|
-          . qq| \$n = \$x -> numerator();|;
-
-    subtest $test => sub {
-        plan tests => 3;
-
-        my $x = $class -> new($x_str);
-        my $n = $x -> numerator();
-
-        is(ref($n), $class, "class of numerator");
-
-        is($n, $n_str, "value of numerator");
-        is($x, $x_str, "input is unmodified");
-    };
-
-    # test denominator()
-
-    $test = qq|\$x = $class -> new("$x_str");|
-          . qq| \$d = \$x -> denominator();|;
-
-    subtest $test => sub {
-        plan tests => 3;
-
-        my $x = $class -> new($x_str);
-        my $d = $x -> denominator();
-
-        is(ref($d), $class, "class of denominator");
-
-        is($d, $d_str, "value of denominator");
-        is($x, $x_str, "input is unmodified");
-    };
-}
-
-__DATA__
-
-NaN:NaN:NaN
-
-inf:inf:1
--inf:-inf:1
-
--30:-30:1
--3:-3:1
--1:-1:1
-0:0:1
-1:1:1
-3:3:1
-30:30:1
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/from_base-mbi.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/from_base-mbi.t
deleted file mode 100644 (file)
index 1f664e1..0000000
+++ /dev/null
@@ -1,126 +0,0 @@
-# -*- mode: perl; -*-
-
-use strict;
-use warnings;
-
-use Test::More tests => 176;
-
-my $class;
-
-BEGIN { $class = 'Math::BigInt'; }
-BEGIN { use_ok($class); }
-
-my @data;
-
-while (<DATA>) {
-    s/#.*$//;           # remove comments
-    s/\s+$//;           # remove trailing whitespace
-    next unless length; # skip empty lines
-
-    my @in = split /:/;
-    my $out = pop @in;
-
-    # As class method.
-
-    {
-        my $x;
-        my $test = qq|\$x = $class -> from_base("$in[0]", $in[1]|;
-        $test .= qq|, "$in[2]"| if @in == 3;
-        $test .= qq|);|;
-
-        eval $test;
-        #die $@ if $@;           # this should never happen
-        die "\nThe following test died when eval()'ed. This indicates a ",
-          "broken test\n\n    $test\n\nThe error message was\n\n    $@\n"
-          if $@;
-
-        subtest $test, sub {
-            plan tests => 2,
-
-            is(ref($x), $class, "output arg is a $class");
-            is($x, $out, 'output arg has the right value');
-        };
-    }
-
-    # As instance method.
-
-    {
-        for my $str ("-1", "0", "1", "-inf", "+inf", "NaN") {
-            my $x;
-            my $test = qq|\$x = $class -> new("$str");|;
-            $test .= qq| \$x -> from_base("$in[0]", $in[1]|;
-            $test .= qq|, "$in[2]"| if @in == 3;
-            $test .= qq|);|;
-
-            eval $test;
-            #die $@ if $@;       # this should never happen
-            die "\nThe following test died when eval()'ed. This indicates a ",
-              "broken test\n\n    $test\n\nThe error message was\n\n    $@\n"
-              if $@;
-
-            subtest $test, sub {
-                plan tests => 2,
-
-                is(ref($x), $class, "output arg is a $class");
-                is($x, $out, 'output arg has the right value');
-            };
-        }
-    }
-}
-
-__END__
-
-# Base 2
-
-11111010:2:250
-11111010:2:01:250
-
-# Base 8
-
-372:8:250
-372:8:01234567:250
-
-# Base 10 (in the last case, use a truncted collation sequence that does not
-# include unused characters)
-
-250:10:250
-250:10:0123456789:250
-250:10:012345:250
-
-# Base 16
-
-fa:16:250
-FA:16:250
-fa:16:0123456789abcdef:250
-
-# Base 3
-
-100021:3:250
-100021:3:012:250
-
-/|-:3:-/|:15
-
-# Base 4
-
-3322:4:250
-3322:4:0123:250
-
-# Base 5
-
-2000:5:250
-2000:5:01234:250
-caaa:5:abcde:250
-
-# when base is less than or equal to 36, case is ignored
-
-6Y:36:250
-6y:36:250
-
-6S:37:250
-7H:37:276
-
-121:3:16
-
-XYZ:36:44027
-
-Why:62:125734
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/from_base_num-mbi.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/from_base_num-mbi.t
deleted file mode 100644 (file)
index aad7c6d..0000000
+++ /dev/null
@@ -1,119 +0,0 @@
-# -*- mode: perl; -*-
-
-use strict;
-use warnings;
-
-use Test::More tests => 365;
-
-my $class;
-
-BEGIN { $class = 'Math::BigInt'; }
-BEGIN { use_ok($class); }
-
-# For simplicity, we use the same data in the test programs for to_base_num() and
-# from_base_num().
-
-my @data =
-  (
-   [ 0, 2, [ 0 ] ],
-   [ 1, 2, [ 1 ] ],
-   [ 2, 2, [ 1, 0 ] ],
-   [ 3, 2, [ 1, 1, ] ],
-   [ 4, 2, [ 1, 0, 0 ] ],
-
-   [ 0, 10, [ 0 ] ],
-   [ 1, 10, [ 1 ] ],
-   [ 12, 10, [ 1, 2 ] ],
-   [ 123, 10, [ 1, 2, 3 ] ],
-   [ 1230, 10, [ 1, 2, 3, 0 ] ],
-
-   [ "123456789", 100, [ 1, 23, 45, 67, 89 ] ],
-
-   [ "1234567890" x 3,
-     "987654321",
-     [ "128", "142745769", "763888804", "574845669" ]],
-
-   [ "1234567890" x 5,
-     "987654321" x 3,
-     [ "12499999874843750102814", "447551941015330718793208596" ]],
-  );
-
-for (my $i = 0 ; $i <= $#data ; ++ $i) {
-    my @in = ($data[$i][2], $data[$i][1]);
-    my $out = $data[$i][0];
-
-    # As class method.
-
-    {
-        for my $base_as_scalar (1, 0) {
-            for my $elements_as_scalar (1, 0) {
-
-                my $x;
-                my $test = "\$x = $class -> from_base_num([";
-                if ($elements_as_scalar) {
-                    $test .= join ", ", map qq|"$_"|, @{ $in[0] };
-                } else {
-                    $test .= join ", ", map qq|$class -> new("$_")|, @{ $in[0] };
-                }
-                $test .= "], ";
-                if ($base_as_scalar) {
-                    $test .= qq|"$in[1]"|;
-                } else {
-                    $test .= qq|$class -> new("$in[1]")|;
-                }
-                $test .= ")";
-
-                eval $test;
-                die "\nThe following test died when eval()'ed. This",
-                  "indicates a broken test\n\n    $test\n\nThe error",
-                  " message was\n\n    $@\n" if $@;
-
-                subtest $test, sub {
-                    plan tests => 2,
-
-                    is(ref($x), $class, "output arg is a $class");
-                    is($x, $out, 'output arg has the right value');
-                };
-            }
-        }
-    }
-
-    # As instance method.
-
-    {
-        for my $base_as_scalar (1, 0) {
-            for my $elements_as_scalar (1, 0) {
-                for my $str ("-1", "0", "1", "-inf", "+inf", "NaN") {
-
-                    my $x;
-                    my $test = qq|\$x = $class -> new("$str");|;
-                    $test .= " \$x -> from_base_num([";
-                    if ($elements_as_scalar) {
-                        $test .= join ", ", map qq|"$_"|, @{ $in[0] };
-                    } else {
-                        $test .= join ", ", map qq|$class -> new("$_")|, @{ $in[0] };
-                    }
-                    $test .= "], ";
-                    if ($base_as_scalar) {
-                        $test .= qq|"$in[1]"|;
-                    } else {
-                        $test .= qq|$class -> new("$in[1]")|;
-                    }
-                    $test .= ")";
-
-                    eval $test;
-                    die "\nThe following test died when eval()'ed. This",
-                      "indicates a broken test\n\n    $test\n\nThe error",
-                      " message was\n\n    $@\n" if $@;
-
-                    subtest $test, sub {
-                        plan tests => 2,
-
-                        is(ref($x), $class, "output arg is a $class");
-                        is($x, $out, 'output arg has the right value');
-                    };
-                }
-            }
-        }
-    }
-}
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/from_bin-mbf.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/from_bin-mbf.t
deleted file mode 100644 (file)
index a24f1bf..0000000
+++ /dev/null
@@ -1,105 +0,0 @@
-# -*- mode: perl; -*-
-
-use strict;
-use warnings;
-
-use Test::More tests => 785;
-
-my $class;
-
-BEGIN { $class = 'Math::BigFloat'; }
-BEGIN { use_ok($class, '1.999710'); }
-
-my @data;
-my $space = "\t\r\n ";
-
-while (<DATA>) {
-    s/#.*$//;           # remove comments
-    s/\s+$//;           # remove trailing whitespace
-    next unless length; # skip empty lines
-
-    my ($in0, $out0) = split /:/;
-
-    push @data, [ $in0, $out0 ],
-                [ $in0 . $space, $out0 ],
-                [ $space . $in0, $out0 ],
-                [ $space . $in0 . $space, $out0 ];
-}
-
-for my $entry (@data) {
-    my ($in0, $out0) = @$entry;
-
-    # As class method.
-
-    {
-        my $x;
-        my $test = qq|\$x = $class -> from_bin("$in0");|;
-
-        eval $test;
-        die $@ if $@;           # this should never happen
-
-        subtest $test, sub {
-            plan tests => 2,
-
-            is(ref($x), $class, "output arg is a $class");
-            is($x, $out0, 'output arg has the right value');
-        };
-    }
-
-    # As instance method.
-
-    {
-        for my $str ("-1", "0", "1", "-inf", "+inf", "NaN") {
-            my $x;
-            my $test = qq|\$x = $class -> new("$str");|
-                     . qq| \$x -> from_bin("$in0");|;
-
-            eval $test;
-            die $@ if $@;       # this should never happen
-
-            subtest $test, sub {
-                plan tests => 2,
-
-                is(ref($x), $class, "output arg is a $class");
-                is($x, $out0, 'output arg has the right value');
-            };
-        }
-    }
-}
-
-__END__
-
-0b1p+0:1
-0b.1p+1:1
-0b.01p+2:1
-0b.001p+3:1
-0b.0001p+4:1
-0b10p-1:1
-0b100p-2:1
-0b1000p-3:1
-
--0b1p+0:-1
-
-0b0p+0:0
-0b0p+7:0
-0b0p-7:0
-0b0.p+0:0
-0b.0p+0:0
-0b0.0p+0:0
-
-0b1100101011111110:51966
-0B1100101011111110:51966
-b1100101011111110:51966
-B1100101011111110:51966
-1100101011111110:51966
-
-0b1.1001p+3:12.5
-0b10010.001101p-1:9.1015625
--0b.11110001001101010111100110111101111p+31:-2023406814.9375
-0b10.0100011010001010110011110001001101p+34:39093746765
-
-0b.p+0:NaN
-
-NaN:NaN
-+inf:NaN
--inf:NaN
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/from_bin-mbi.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/from_bin-mbi.t
deleted file mode 100644 (file)
index da83007..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-# -*- mode: perl; -*-
-
-use strict;
-use warnings;
-
-use Test::More tests => 1457;
-
-my $class;
-
-BEGIN { $class = 'Math::BigInt'; }
-BEGIN { use_ok($class); }
-
-my @data;
-my $space = "\t\r\n ";
-
-while (<DATA>) {
-    s/#.*$//;           # remove comments
-    s/\s+$//;           # remove trailing whitespace
-    next unless length; # skip empty lines
-
-    my ($in0, $out0) = split /:/;
-
-    push @data, [ $in0, $out0 ],
-                [ $in0 . $space, $out0 ],
-                [ $space . $in0, $out0 ],
-                [ $space . $in0 . $space, $out0 ];
-}
-
-for my $entry (@data) {
-    my ($in0, $out0) = @$entry;
-
-    # As class method.
-
-    {
-        my $x;
-        my $test = qq|\$x = $class -> from_bin("$in0");|;
-
-        eval $test;
-        die $@ if $@;           # this should never happen
-
-        subtest $test, sub {
-            plan tests => 2,
-
-            is(ref($x), $class, "output arg is a $class");
-            is($x, $out0, 'output arg has the right value');
-        };
-    }
-
-    # As instance method.
-
-    {
-        for my $str ("-1", "0", "1", "-inf", "+inf", "NaN") {
-            my $x;
-            my $test = qq|\$x = $class -> new("$str");|
-                     . qq| \$x -> from_bin("$in0");|;
-
-            eval $test;
-            die $@ if $@;       # this should never happen
-
-            subtest $test, sub {
-                plan tests => 2,
-
-                is(ref($x), $class, "output arg is a $class");
-                is($x, $out0, 'output arg has the right value');
-            };
-        }
-    }
-}
-
-__END__
-
-0b0:0
-0b1:1
-0b10:2
-0b11:3
-0b100:4
-0b101:5
-0b110:6
-0b111:7
-0b1000:8
-0b1001:9
-0b1010:10
-0b1011:11
-0b1100:12
-0b1101:13
-0b1110:14
-0b1111:15
-0b10000:16
-0b10001:17
-
-0b11111110:254
-0b11111111:255
-0b100000000:256
-0b100000001:257
-
-0b1111111111111110:65534
-0b1111111111111111:65535
-0b10000000000000000:65536
-0b10000000000000001:65537
-
-0b111111111111111111111110:16777214
-0b111111111111111111111111:16777215
-0b1000000000000000000000000:16777216
-0b1000000000000000000000001:16777217
-
-0b11111111111111111111111111111110:4294967294
-0b11111111111111111111111111111111:4294967295
-0b100000000000000000000000000000000:4294967296
-0b100000000000000000000000000000001:4294967297
-
-0b1111111111111111111111111111111111111110:1099511627774
-0b1111111111111111111111111111111111111111:1099511627775
-0b10000000000000000000000000000000000000000:1099511627776
-0b10000000000000000000000000000000000000001:1099511627777
-
-0b111111111111111111111111111111111111111111111110:281474976710654
-0b111111111111111111111111111111111111111111111111:281474976710655
-0b1000000000000000000000000000000000000000000000000:281474976710656
-0b1000000000000000000000000000000000000000000000001:281474976710657
-
-0b11111111111111111111111111111111111111111111111111111110:72057594037927934
-0b11111111111111111111111111111111111111111111111111111111:72057594037927935
-0b100000000000000000000000000000000000000000000000000000000:72057594037927936
-0b100000000000000000000000000000000000000000000000000000001:72057594037927937
-
-0B10:2
-b10:2
-B10:2
-
-NaN:NaN
-+inf:NaN
--inf:NaN
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/from_hex-mbf.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/from_hex-mbf.t
deleted file mode 100644 (file)
index 8a9f3cf..0000000
+++ /dev/null
@@ -1,105 +0,0 @@
-# -*- mode: perl; -*-
-
-use strict;
-use warnings;
-
-use Test::More tests => 785;
-
-my $class;
-
-BEGIN { $class = 'Math::BigFloat'; }
-BEGIN { use_ok($class, '1.999821'); }
-
-my @data;
-my $space = "\t\r\n ";
-
-while (<DATA>) {
-    s/#.*$//;           # remove comments
-    s/\s+$//;           # remove trailing whitespace
-    next unless length; # skip empty lines
-
-    my ($in0, $out0) = split /:/;
-
-    push @data, [ $in0, $out0 ],
-                [ $in0 . $space, $out0 ],
-                [ $space . $in0, $out0 ],
-                [ $space . $in0 . $space, $out0 ];
-}
-
-for my $entry (@data) {
-    my ($in0, $out0) = @$entry;
-
-    # As class method.
-
-    {
-        my $x;
-        my $test = qq|\$x = $class -> from_hex("$in0");|;
-
-        eval $test;
-        die $@ if $@;           # this should never happen
-
-        subtest $test, sub {
-            plan tests => 2,
-
-            is(ref($x), $class, "output arg is a $class");
-            is($x, $out0, 'output arg has the right value');
-        };
-    }
-
-    # As instance method.
-
-    {
-        for my $str ("-1", "0", "1", "-inf", "+inf", "NaN") {
-            my $x;
-            my $test = qq|\$x = $class -> new("$str");|
-                     . qq| \$x -> from_hex("$in0");|;
-
-            eval $test;
-            die $@ if $@;       # this should never happen
-
-            subtest $test, sub {
-                plan tests => 2,
-
-                is(ref($x), $class, "output arg is a $class");
-                is($x, $out0, 'output arg has the right value');
-            };
-        }
-    }
-}
-
-__END__
-
-0x1p+0:1
-0x.8p+1:1
-0x.4p+2:1
-0x.2p+3:1
-0x.1p+4:1
-0x2p-1:1
-0x4p-2:1
-0x8p-3:1
-
--0x1p+0:-1
-
-0x0p+0:0
-0x0p+7:0
-0x0p-7:0
-0x0.p+0:0
-0x.0p+0:0
-0x0.0p+0:0
-
-0xcafe:51966
-0Xcafe:51966
-xcafe:51966
-Xcafe:51966
-cafe:51966
-
-0x1.9p+3:12.5
-0x12.34p-1:9.1015625
--0x.789abcdefp+32:-2023406814.9375
-0x12.3456789ap+31:39093746765
-
-0x.p+0:NaN
-
-NaN:NaN
-+inf:NaN
--inf:NaN
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/from_hex-mbi.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/from_hex-mbi.t
deleted file mode 100644 (file)
index 2002531..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-# -*- mode: perl; -*-
-
-use strict;
-use warnings;
-
-use Test::More tests => 1457;
-
-my $class;
-
-BEGIN { $class = 'Math::BigInt'; }
-BEGIN { use_ok($class); }
-
-my @data;
-my $space = "\t\r\n ";
-
-while (<DATA>) {
-    s/#.*$//;           # remove comments
-    s/\s+$//;           # remove trailing whitespace
-    next unless length; # skip empty lines
-
-    my ($in0, $out0) = split /:/;
-
-    push @data, [ $in0, $out0 ],
-                [ $in0 . $space, $out0 ],
-                [ $space . $in0, $out0 ],
-                [ $space . $in0 . $space, $out0 ];
-}
-
-for my $entry (@data) {
-    my ($in0, $out0) = @$entry;
-
-    # As class method.
-
-    {
-        my $x;
-        my $test = qq|\$x = $class -> from_hex("$in0");|;
-
-        eval $test;
-        die $@ if $@;           # this should never happen
-
-        subtest $test, sub {
-            plan tests => 2,
-
-            is(ref($x), $class, "output arg is a $class");
-            is($x, $out0, 'output arg has the right value');
-        };
-    }
-
-    # As instance method.
-
-    {
-        for my $str ("-1", "0", "1", "-inf", "+inf", "NaN") {
-            my $x;
-            my $test = qq|\$x = $class -> new("$str");|
-                     . qq| \$x -> from_hex("$in0");|;
-
-            eval $test;
-            die $@ if $@;       # this should never happen
-
-            subtest $test, sub {
-                plan tests => 2,
-
-                is(ref($x), $class, "output arg is a $class");
-                is($x, $out0, 'output arg has the right value');
-            };
-        }
-    }
-}
-
-__END__
-
-0x0:0
-0x1:1
-0x2:2
-0x3:3
-0x4:4
-0x5:5
-0x6:6
-0x7:7
-0x8:8
-0x9:9
-0xa:10
-0xb:11
-0xc:12
-0xd:13
-0xe:14
-0xf:15
-0x10:16
-0x11:17
-
-0xfe:254
-0xff:255
-0x100:256
-0x101:257
-
-0xfffe:65534
-0xffff:65535
-0x10000:65536
-0x10001:65537
-
-0xfffffe:16777214
-0xffffff:16777215
-0x1000000:16777216
-0x1000001:16777217
-
-0xfffffffe:4294967294
-0xffffffff:4294967295
-0x100000000:4294967296
-0x100000001:4294967297
-
-0xfffffffffe:1099511627774
-0xffffffffff:1099511627775
-0x10000000000:1099511627776
-0x10000000001:1099511627777
-
-0xfffffffffffe:281474976710654
-0xffffffffffff:281474976710655
-0x1000000000000:281474976710656
-0x1000000000001:281474976710657
-
-0xfffffffffffffe:72057594037927934
-0xffffffffffffff:72057594037927935
-0x100000000000000:72057594037927936
-0x100000000000001:72057594037927937
-
-0X10:16
-x10:16
-X10:16
-
-NaN:NaN
-+inf:NaN
--inf:NaN
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/from_ieee754-mbf.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/from_ieee754-mbf.t
deleted file mode 100644 (file)
index 8edb904..0000000
+++ /dev/null
@@ -1,257 +0,0 @@
-# -*- mode: perl; -*-
-
-use strict;
-use warnings;
-
-use Test::More tests => 230;
-
-use Math::BigFloat;
-
-my @k = (16, 32, 64, 128);
-
-sub stringify {
-    my $x = shift;
-    return "$x" unless $x -> is_finite();
-    my $nstr = $x -> bnstr();
-    my $sstr = $x -> bsstr();
-    return length($nstr) < length($sstr) ? $nstr : $sstr;
-}
-
-for my $k (@k) {
-
-    # Parameters specific to this format:
-
-    my $b = 2;
-    my $p = $k == 16 ? 11
-          : $k == 32 ? 24
-          : $k == 64 ? 53
-          : $k - sprintf("%.0f", 4 * log($k)/log(2)) + 13;
-
-    $b = Math::BigFloat -> new($b);
-    $k = Math::BigFloat -> new($k);
-    $p = Math::BigFloat -> new($p);
-    my $w = $k - $p;
-
-    my $emax = 2 ** ($w - 1) - 1;
-    my $emin = 1 - $emax;
-
-    my $format = sprintf 'binary%u', $k;
-
-    my $binv = Math::BigFloat -> new("0.5");
-
-    my $data =
-      [
-
-       {
-        dsc => "smallest positive subnormal number",
-        bin => "0"
-             . ("0" x $w)
-             . ("0" x ($p - 2)) . "1",
-        asc => "$b ** ($emin) * $b ** (" . (1 - $p) . ") "
-             . "= $b ** (" . ($emin + 1 - $p) . ")",
-        mbf => $binv ** ($p - 1 - $emin),
-       },
-
-       {
-        dsc => "largest subnormal number",
-        bin => "0"
-             . ("0" x $w)
-             . ("1" x ($p - 1)),
-        asc => "$b ** ($emin) * (1 - $b ** (" . (1 - $p) . "))",
-        mbf => $binv ** (-$emin) * (1 - $binv ** ($p - 1)),
-       },
-
-       {
-        dsc => "smallest positive normal number",
-        bin => "0"
-             . ("0" x ($w - 1)) . "1"
-             . ("0" x ($p - 1)),
-        asc => "$b ** ($emin)",
-        mbf => $binv ** (-$emin),
-       },
-
-       {
-        dsc => "largest normal number",
-        bin => "0"
-             . ("1" x ($w - 1)) . "0"
-             . "1" x ($p - 1),
-        asc => "$b ** $emax * ($b - $b ** (" . (1 - $p) . "))",
-        mbf => $b ** $emax * ($b - $binv ** ($p - 1)),
-       },
-
-       {
-        dsc => "largest number less than one",
-        bin => "0"
-             . "0" . ("1" x ($w - 2)) . "0"
-             . "1" x ($p - 1),
-        asc => "1 - $b ** (-$p)",
-        mbf => 1 - $binv ** $p,
-       },
-
-       {
-        dsc => "smallest number larger than one",
-        bin => "0"
-             . "0" . ("1" x ($w - 1))
-             . ("0" x ($p - 2)) . "1",
-        asc => "1 + $b ** (" . (1 - $p) . ")",
-        mbf => 1 + $binv ** ($p - 1),
-       },
-
-       {
-        dsc => "second smallest number larger than one",
-        bin => "0"
-             . "0" . ("1" x ($w - 1))
-             . ("0" x ($p - 3)) . "10",
-        asc => "1 + $b ** (" . (2 - $p) . ")",
-        mbf => 1 + $binv ** ($p - 2),
-       },
-
-       {
-        dsc => "one",
-        bin => "0"
-             . "0" . ("1" x ($w - 1))
-             . "0" x ($p - 1),
-        asc => "1",
-        mbf => Math::BigFloat -> new("1"),
-       },
-
-       {
-        dsc => "minus one",
-        bin => "1"
-             . "0" . ("1" x ($w - 1))
-             . "0" x ($p - 1),
-        asc => "-1",
-        mbf => Math::BigFloat -> new("-1"),
-       },
-
-       {
-        dsc => "two",
-        bin => "0"
-             . "1" . ("0" x ($w - 1))
-             . ("0" x ($p - 1)),
-        asc => "2",
-        mbf => Math::BigFloat -> new("2"),
-       },
-
-       {
-        dsc => "minus two",
-        bin => "1"
-             . "1" . ("0" x ($w - 1))
-             . ("0" x ($p - 1)),
-        asc => "-2",
-        mbf => Math::BigFloat -> new("-2"),
-       },
-
-       {
-        dsc => "positive zero",
-        bin => "0"
-             . ("0" x $w)
-             . ("0" x ($p - 1)),
-        asc => "+0",
-        mbf => Math::BigFloat -> new("0"),
-       },
-
-       {
-        dsc => "negative zero",
-        bin => "1"
-             . ("0" x $w)
-             . ("0" x ($p - 1)),
-        asc => "-0",
-        mbf => Math::BigFloat -> new("0"),
-       },
-
-       {
-        dsc => "positive infinity",
-        bin => "0"
-             . ("1" x $w)
-             . ("0" x ($p - 1)),
-        asc => "+inf",
-        mbf => Math::BigFloat -> new("inf"),
-       },
-
-       {
-        dsc => "negative infinity",
-        bin =>  "1"
-             . ("1" x $w)
-             . ("0" x ($p - 1)),
-        asc => "-inf",
-        mbf => Math::BigFloat -> new("-inf"),
-       },
-
-       {
-        dsc => "NaN (sNaN on most processors, such as x86 and ARM)",
-        bin => "0"
-             . ("1" x $w)
-             . ("0" x ($p - 2)) . "1",
-        asc => "sNaN",
-        mbf => Math::BigFloat -> new("NaN"),
-       },
-
-       {
-        dsc => "NaN (qNaN on most processors, such as x86 and ARM)",
-        bin => "0"
-             . ("1" x $w)
-             . "1" . ("0" x ($p - 3)) . "1",
-        asc => "qNaN",
-        mbf => Math::BigFloat -> new("NaN"),
-       },
-
-       {
-        dsc => "NaN (an alternative encoding)",
-        bin => "0"
-             . ("1" x $w)
-             . ("1" x ($p - 1)),
-        asc => "NaN",
-        mbf => Math::BigFloat -> new("NaN"),
-       },
-
-       {
-        dsc => "NaN (encoding used by Perl on Cygwin)",
-        bin => "1"
-             . ("1" x $w)
-             . ("1" . ("0" x ($p - 2))),
-        asc => "NaN",
-        mbf => Math::BigFloat -> new("NaN"),
-       },
-
-      ];
-
-    for my $entry (@$data) {
-        my $bin   = $entry -> {bin};
-        my $bytes = pack "B*", $bin;
-        my $hex   = unpack "H*", $bytes;
-
-        note("\n", $entry -> {dsc }, " (k = $k)\n\n");
-
-        my $expected = stringify($entry -> {mbf});
-        my ($got, $test);
-
-        $got = Math::BigFloat -> from_ieee754($bin, $format);
-        $got = stringify($got);
-        $test = qq|Math::BigFloat->from_ieee754("$bin")|;
-        is($got, $expected, $test);
-
-        $got = Math::BigFloat -> from_ieee754($hex, $format);
-        $got = stringify($got);
-        $test = qq|Math::BigFloat->from_ieee754("$hex")|;
-        is($got, $expected, $test);
-
-        $got = Math::BigFloat -> from_ieee754($bytes, $format);
-        $got = stringify($got);
-        (my $str = $hex) =~ s/(..)/\\x$1/g;
-        $test = qq|Math::BigFloat->from_ieee754("$str")|;
-        is($got, $expected, $test);
-    }
-}
-
-note("\nTest as class method vs. instance method.\n\n");
-
-# As class method.
-
-my $x = Math::BigFloat -> from_ieee754("4000000000000000", "binary64");
-is($x, 2, "class method");
-
-# As instance method, the invocand should be modified.
-
-$x -> from_ieee754("4008000000000000", "binary64");
-is($x, 3, "instance method modifies invocand");
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/from_oct-mbf.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/from_oct-mbf.t
deleted file mode 100644 (file)
index 2fff2a0..0000000
+++ /dev/null
@@ -1,137 +0,0 @@
-# -*- mode: perl; -*-
-
-use strict;
-use warnings;
-
-use Test::More tests => 1401;
-
-my $class;
-
-BEGIN { $class = 'Math::BigFloat'; }
-BEGIN { use_ok($class, '1.999710'); }
-
-my @data;
-my $space = "\t\r\n ";
-
-while (<DATA>) {
-    s/#.*$//;           # remove comments
-    s/\s+$//;           # remove trailing whitespace
-    next unless length; # skip empty lines
-
-    my ($in0, $out0) = split /:/;
-
-    push @data, [ $in0, $out0 ],
-                [ $in0 . $space, $out0 ],
-                [ $space . $in0, $out0 ],
-                [ $space . $in0 . $space, $out0 ];
-}
-
-for my $entry (@data) {
-    my ($in0, $out0) = @$entry;
-
-    # As class method.
-
-    {
-        my $x;
-        my $test = qq|\$x = $class -> from_oct("$in0");|;
-
-        eval $test;
-        die $@ if $@;           # this should never happen
-
-        subtest $test, sub {
-            plan tests => 2,
-
-            is(ref($x), $class, "output arg is a $class");
-            is($x, $out0, 'output arg has the right value');
-        };
-    }
-
-    # As instance method.
-
-    {
-        for my $str ("-1", "0", "1", "-inf", "+inf", "NaN") {
-            my $x;
-            my $test = qq|\$x = $class -> new("$str");|
-                     . qq| \$x -> from_oct("$in0");|;
-
-            eval $test;
-            die $@ if $@;       # this should never happen
-
-            subtest $test, sub {
-                plan tests => 2,
-
-                is(ref($x), $class, "output arg is a $class");
-                is($x, $out0, 'output arg has the right value');
-            };
-        }
-    }
-}
-
-__END__
-
-# Without "0o" prefix.
-
-01p+0:1
-0.4p+1:1
-0.2p+2:1
-0.1p+3:1
-0.04p+4:1
-02p-1:1
-04p-2:1
-010p-3:1
-
--1p+0:-1
-
-0p+0:0
-0p+7:0
-0p-7:0
-0.p+0:0
-.0p+0:0
-0.0p+0:0
-
-145376:51966
-0145376:51966
-00145376:51966
-
-3.1p+2:12.5
-22.15p-1:9.1015625
--0.361152746757p+32:-2023406814.9375
-44.3212636115p+30:39093746765
-
-.p+0:NaN
-
-# With "0o" prefix.
-
-0o01p+0:1
-0o0.4p+1:1
-0o0.2p+2:1
-0o0.1p+3:1
-0o0.04p+4:1
-0o02p-1:1
-0o04p-2:1
-0o010p-3:1
-
--0o1p+0:-1
-
-0o0p+0:0
-0o0p+7:0
-0o0p-7:0
-0o0.p+0:0
-0o.0p+0:0
-0o0.0p+0:0
-
-0o145376:51966
-0O145376:51966
-o145376:51966
-O145376:51966
-
-0o3.1p+2:12.5
-0o22.15p-1:9.1015625
--0o0.361152746757p+32:-2023406814.9375
-0o44.3212636115p+30:39093746765
-
-0o.p+0:NaN
-
-NaN:NaN
-+inf:NaN
--inf:NaN
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/from_oct-mbi.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/from_oct-mbi.t
deleted file mode 100644 (file)
index 3ec700e..0000000
+++ /dev/null
@@ -1,186 +0,0 @@
-# -*- mode: perl; -*-
-
-use strict;
-use warnings;
-
-use Test::More tests => 2745;
-
-my $class;
-
-BEGIN { $class = 'Math::BigInt'; }
-BEGIN { use_ok($class); }
-
-my @data;
-my $space = "\t\r\n ";
-
-while (<DATA>) {
-    s/#.*$//;           # remove comments
-    s/\s+$//;           # remove trailing whitespace
-    next unless length; # skip empty lines
-
-    my ($in0, $out0) = split /:/;
-
-    push @data, [ $in0, $out0 ],
-                [ $in0 . $space, $out0 ],
-                [ $space . $in0, $out0 ],
-                [ $space . $in0 . $space, $out0 ];
-}
-
-for my $entry (@data) {
-    my ($in0, $out0) = @$entry;
-
-    # As class method.
-
-    {
-        my $x;
-        my $test = qq|\$x = $class -> from_oct("$in0");|;
-
-        eval $test;
-        die $@ if $@;           # this should never happen
-
-        subtest $test, sub {
-            plan tests => 2,
-
-            is(ref($x), $class, "output arg is a $class");
-            is($x, $out0, 'output arg has the right value');
-        };
-    }
-
-    # As instance method.
-
-    {
-        for my $str ("-1", "0", "1", "-inf", "+inf", "NaN") {
-            my $x;
-            my $test = qq|\$x = $class -> new("$str");|
-                     . qq| \$x -> from_oct("$in0");|;
-
-            eval $test;
-            die $@ if $@;       # this should never happen
-
-            subtest $test, sub {
-                plan tests => 2,
-
-                is(ref($x), $class, "output arg is a $class");
-                is($x, $out0, 'output arg has the right value');
-            };
-        }
-    }
-}
-
-__END__
-
-0:0
-1:1
-2:2
-3:3
-4:4
-5:5
-6:6
-7:7
-10:8
-11:9
-12:10
-13:11
-14:12
-15:13
-16:14
-17:15
-20:16
-21:17
-
-376:254
-377:255
-400:256
-401:257
-
-177776:65534
-177777:65535
-200000:65536
-200001:65537
-
-77777776:16777214
-77777777:16777215
-100000000:16777216
-100000001:16777217
-
-37777777776:4294967294
-37777777777:4294967295
-40000000000:4294967296
-40000000001:4294967297
-
-17777777777776:1099511627774
-17777777777777:1099511627775
-20000000000000:1099511627776
-20000000000001:1099511627777
-
-7777777777777776:281474976710654
-7777777777777777:281474976710655
-10000000000000000:281474976710656
-10000000000000001:281474976710657
-
-3777777777777777776:72057594037927934
-3777777777777777777:72057594037927935
-4000000000000000000:72057594037927936
-4000000000000000001:72057594037927937
-
-0o0:0
-0o1:1
-0o2:2
-0o3:3
-0o4:4
-0o5:5
-0o6:6
-0o7:7
-0o10:8
-0o11:9
-0o12:10
-0o13:11
-0o14:12
-0o15:13
-0o16:14
-0o17:15
-0o20:16
-0o21:17
-
-0o376:254
-0o377:255
-0o400:256
-0o401:257
-
-0o177776:65534
-0o177777:65535
-0o200000:65536
-0o200001:65537
-
-0o77777776:16777214
-0o77777777:16777215
-0o100000000:16777216
-0o100000001:16777217
-
-0o37777777776:4294967294
-0o37777777777:4294967295
-0o40000000000:4294967296
-0o40000000001:4294967297
-
-0o17777777777776:1099511627774
-0o17777777777777:1099511627775
-0o20000000000000:1099511627776
-0o20000000000001:1099511627777
-
-0o7777777777777776:281474976710654
-0o7777777777777777:281474976710655
-0o10000000000000000:281474976710656
-0o10000000000000001:281474976710657
-
-0o3777777777777777776:72057594037927934
-0o3777777777777777777:72057594037927935
-0o4000000000000000000:72057594037927936
-0o4000000000000000001:72057594037927937
-
-0O10:8
-o10:8
-O10:8
-
-NaN:NaN
-+inf:NaN
--inf:NaN
index 9634396..b8c792d 100755 (executable)
@@ -1,13 +1,12 @@
 # -*- mode: perl; -*-
 
 # test inf/NaN handling all in one place
-# Thanx to Jarkko for the excellent explanations and the tables
 
 use strict;
 use warnings;
 use lib 't';
 
-use Test::More tests => 2052;
+use Test::More tests => 1044;
 
 use Math::BigInt;
 use Math::BigFloat;
@@ -17,7 +16,7 @@ use Math::BigFloat::Subclass;
 my @biclasses = qw/ Math::BigInt   Math::BigInt::Subclass   /;
 my @bfclasses = qw/ Math::BigFloat Math::BigFloat::Subclass /;
 
-my (@args, $x, $y, $z);
+my (@args, $x, $y, $z, $test);
 
 # +
 
@@ -75,13 +74,25 @@ foreach (qw/
 {
     @args = split /:/, $_;
     for my $class (@biclasses, @bfclasses) {
+        $args[2] = '0' if $args[2] eq '-0';     # Math::Big* has no -0
         $x = $class->new($args[0]);
         $y = $class->new($args[1]);
-        $args[2] = '0' if $args[2] eq '-0'; # Math::Big(Int|Float) has no -0
-        my $r = $x->badd($y);
-
-        is($x->bstr(), $args[2], "x $class $args[0] + $args[1]");
-        is($x->bstr(), $args[2], "r $class $args[0] + $args[1]");
+        $z = $x->badd($y);
+
+        $test = qq|\$x = $class->new("$args[0]"); |
+              . qq|\$y = $class->new("$args[1]"); |
+              . qq|\$z = \$x->badd(\$y);|;
+
+        subtest $test => sub {
+            plan tests => 6;
+
+            is(ref($x), $class, "\$x is a $class");
+            is(ref($y), $class, "\$y is still a $class");
+            is(ref($z), $class, "\$z is a $class");
+            is($x->bstr(), $args[2], 'value of $x');
+            is($y->bstr(), $args[1], 'value of $y');
+            is($z->bstr(), $args[2], 'value of $z');
+        };
     }
 }
 
@@ -141,13 +152,25 @@ foreach (qw/
 {
     @args = split /:/, $_;
     for my $class (@biclasses, @bfclasses) {
+        $args[2] = '0' if $args[2] eq '-0';     # Math::Big* has no -0
         $x = $class->new($args[0]);
         $y = $class->new($args[1]);
-        $args[2] = '0' if $args[2] eq '-0'; # Math::Big(Int|Float) has no -0
-        my $r = $x->bsub($y);
-
-        is($x->bstr(), $args[2], "x $class $args[0] - $args[1]");
-        is($r->bstr(), $args[2], "r $class $args[0] - $args[1]");
+        $z = $x->bsub($y);
+
+        $test = qq|\$x = $class->new("$args[0]"); |
+              . qq|\$y = $class->new("$args[1]"); |
+              . qq|\$z = \$x->bsub(\$y);|;
+
+        subtest $test => sub {
+            plan tests => 6;
+
+            is(ref($x), $class, "\$x is a $class");
+            is(ref($y), $class, "\$y is still a $class");
+            is(ref($z), $class, "\$z is a $class");
+            is($x->bstr(), $args[2], 'value of $x');
+            is($y->bstr(), $args[1], 'value of $y');
+            is($z->bstr(), $args[2], 'value of $z');
+        };
     }
 }
 
@@ -207,13 +230,25 @@ foreach (qw/
 {
     @args = split /:/, $_;
     for my $class (@biclasses, @bfclasses) {
+        $args[2] = '0' if $args[2] eq '-0';     # Math::Big* has no -0
         $x = $class->new($args[0]);
         $y = $class->new($args[1]);
-        $args[2] = '0' if $args[2] eq '-0'; # Math::Big(Int|Float) has no -0
-        my $r = $x->bmul($y);
-
-        is($x->bstr(), $args[2], "x $class $args[0] * $args[1]");
-        is($r->bstr(), $args[2], "r $class $args[0] * $args[1]");
+        $z = $x->bmul($y);
+
+        $test = qq|\$x = $class->new("$args[0]"); |
+              . qq|\$y = $class->new("$args[1]"); |
+              . qq|\$z = \$x->bmul(\$y);|;
+
+        subtest $test => sub {
+            plan tests => 6;
+
+            is(ref($x), $class, "\$x is a $class");
+            is(ref($y), $class, "\$y is still a $class");
+            is(ref($z), $class, "\$z is a $class");
+            is($x->bstr(), $args[2], 'value of $x');
+            is($y->bstr(), $args[1], 'value of $y');
+            is($z->bstr(), $args[2], 'value of $z');
+        };
     }
 }
 
@@ -273,34 +308,80 @@ foreach (qw/
 {
     @args = split /:/, $_;
     for my $class (@biclasses, @bfclasses) {
-        $x = $class->new($args[0]);
-        $y = $class->new($args[1]);
-        $args[2] = '0' if $args[2] eq '-0'; # Math::Big(Int|Float) has no -0
+        $args[2] = '0' if $args[2] eq '-0';     # Math::Big* has no -0
 
-        my $t = $x->copy();
-        my $tmod = $t->copy();
+        my ($q, $r);
 
         # bdiv in scalar context
+
+        $x = $class->new($args[0]);
+        $y = $class->new($args[1]);
+
         unless ($class =~ /^Math::BigFloat/) {
-            my $r = $x->bdiv($y);
-            is($x->bstr(), $args[2], "x $class $args[0] / $args[1]");
-            is($r->bstr(), $args[2], "r $class $args[0] / $args[1]");
+            $q = $x->bdiv($y);
+
+            $test = qq|\$x = $class->new("$args[0]"); |
+                  . qq|\$y = $class->new("$args[1]"); |
+                  . qq|\$q = \$x->bdiv(\$y);|;
+
+            subtest $test => sub {
+                plan tests => 6;
+
+                is(ref($x), $class, "\$x is a $class");
+                is(ref($y), $class, "\$y is still a $class");
+                is(ref($q), $class, "\$q is a $class");
+                is($x->bstr(), $args[2], 'value of $x');
+                is($y->bstr(), $args[1], 'value of $y');
+                is($q->bstr(), $args[2], 'value of $q');
+            };
         }
 
         # bmod and bdiv in list context
-        my ($d, $rem) = $t->bdiv($y);
+
+        $x = $class->new($args[0]);
+        $y = $class->new($args[1]);
+
+        ($q, $r) = $x->bdiv($y);
 
         # bdiv in list context
-        is($t->bstr(), $args[2], "t $class $args[0] / $args[1]");
-        is($d->bstr(), $args[2], "d $class $args[0] / $args[1]");
+
+        $test = qq|\$x = $class->new("$args[0]"); |
+              . qq|\$y = $class->new("$args[1]"); |
+              . qq|(\$q, \$r) = \$x->bdiv(\$y);|;
+
+        subtest $test => sub {
+            plan tests => 7;
+
+            is(ref($x), $class, "\$x is a $class");
+            is(ref($y), $class, "\$y is still a $class");
+            is(ref($q), $class, "\$q is a $class");
+            is(ref($r), $class, "\$r is a $class");
+            is($x->bstr(), $args[2], 'value of $x');
+            is($y->bstr(), $args[1], 'value of $y');
+            is($q->bstr(), $args[2], 'value of $q');
+        };
 
         # bmod
-        my $m = $tmod->bmod($y);
 
-        # bmod() agrees with bdiv?
-        is($m->bstr(), $rem->bstr(), "m $class $args[0] % $args[1]");
-        # bmod() return agrees with set value?
-        is($tmod->bstr(), $m->bstr(), "o $class $args[0] % $args[1]");
+        $x = $class->new($args[0]);
+        $y = $class->new($args[1]);
+
+        my $m = $x->bmod($y);
+
+        $test = qq|\$x = $class->new("$args[0]"); |
+              . qq|\$y = $class->new("$args[1]"); |
+              . qq|\$m = \$x->bmod(\$y);|;
+
+        subtest $test => sub {
+            plan tests => 6;
+
+            is(ref($x), $class, "\$x is a $class");
+            is(ref($y), $class, "\$y is still a $class");
+            is(ref($m), $class, "\$m is a $class");
+            is($x->bstr(), $r->bstr(), 'value of $x');
+            is($y->bstr(), $args[1], 'value of $y');
+            is($m->bstr(), $r->bstr(), 'value of $m');
+        };
     }
 }
 
@@ -360,17 +441,25 @@ foreach (qw/
 {
     @args = split /:/, $_;
     for my $class (@bfclasses) {
+        $args[2] = '0' if $args[2] eq '-0';     # Math::Big* has no -0
         $x = $class->new($args[0]);
         $y = $class->new($args[1]);
-        $args[2] = '0' if $args[2] eq '-0'; # Math::Big(Int|Float) has no -0
-
-        my $t = $x->copy();
-        my $tmod = $t->copy();
-
-        # bdiv in scalar context
-        my $r = $x->bdiv($y);
-        is($x->bstr(), $args[2], "x $class $args[0] / $args[1]");
-        is($r->bstr(), $args[2], "r $class $args[0] / $args[1]");
+        $z = $x->bdiv($y);
+
+        $test = qq|\$x = $class->new("$args[0]"); |
+              . qq|\$y = $class->new("$args[1]"); |
+              . qq|\$z = \$x->bdiv(\$y);|;
+
+        subtest $test => sub {
+            plan tests => 6;
+
+            is(ref($x), $class, "\$x is a $class");
+            is(ref($y), $class, "\$y is still a $class");
+            is(ref($z), $class, "\$z is a $class");
+            is($x->bstr(), $args[2], 'value of $x');
+            is($y->bstr(), $args[1], 'value of $y');
+            is($z->bstr(), $args[2], 'value of $z');
+        };
     }
 }
 
@@ -378,9 +467,9 @@ foreach (qw/
 # overloaded comparisons
 
 foreach my $c (@biclasses, @bfclasses) {
-    my $x = $c->bnan();
-    my $y = $c->bnan();         # test with two different objects, too
-    my $z = $c->bzero();
+    $x = $c->bnan();
+    $y = $c->bnan();            # test with two different objects, too
+    $z = $c->bzero();
 
     is($x == $y, '', 'NaN == NaN: ""');
     is($x != $y, 1,  'NaN != NaN: 1');
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/lib_load-mbf-mbi.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/lib_load-mbf-mbi.t
deleted file mode 100644 (file)
index e18476e..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-# -*- mode: perl; -*-
-
-use strict;
-use warnings;
-
-use Test::More tests => 10;
-
-use lib "t";
-
-# First load Math::BigFloat with Math::BigInt::Calc.
-
-use Math::BigFloat lib => "Calc";
-
-is(Math::BigFloat -> config("lib"), "Math::BigInt::Calc",
-   'Math::BigFloat -> config("lib")');
-
-is(ref Math::BigFloat -> bzero() -> {_m}, "Math::BigInt::Calc",
-   'ref Math::BigFloat -> bzero() -> {_m}');
-
-# Math::BigInt will know that we loaded Math::BigInt::Calc.
-
-require Math::BigInt;
-
-is(Math::BigInt -> config("lib"), "Math::BigInt::Calc",
-   'Math::BigInt -> config("lib")');
-
-is(ref Math::BigInt -> bzero() -> {value}, "Math::BigInt::Calc",
-   "ref Math::BigInt -> bzero() -> {value}");
-
-# Now load Math::BigFloat again with a different lib.
-
-Math::BigFloat -> import(lib => "BareCalc");
-
-is(Math::BigFloat -> config("lib"), "Math::BigInt::Calc",
-   'Math::BigFloat -> config("lib")');
-
-is(ref Math::BigFloat -> bzero() -> {_m}, "Math::BigInt::Calc",
-   'ref Math::BigFloat -> bzero() -> {_m}');
-
-# See if Math::BigInt knows about Math::BigInt::BareCalc.
-
-is(Math::BigInt -> config("lib"), "Math::BigInt::Calc",
-   "Math::BigInt is using library Math::BigInt::Calc");
-
-is(ref Math::BigInt -> bzero() -> {value}, "Math::BigInt::Calc",
-   "ref Math::BigInt -> bzero() -> {value}");
-
-# See that Math::BigInt supports "only".
-
-eval { Math::BigInt -> import("only" => "Calc") };
-subtest 'Math::BigInt -> import("only" => "Calc")' => sub {
-    plan tests => 3;
-
-    is($@, "", '$@ is empty');
-    is(Math::BigInt -> config("lib"), "Math::BigInt::Calc",
-       'Math::BigInt -> config("lib")');
-    is(ref Math::BigInt -> bzero() -> {value}, "Math::BigInt::Calc",
-       "ref Math::BigInt -> bzero() -> {value}");
-};
-
-# See that Math::BigInt supports "try".
-
-eval { Math::BigInt -> import("try" => "BareCalc") };
-subtest 'Math::BigInt -> import("try" => "BareCalc")' => sub {
-    plan tests => 3;
-
-    is($@, "", '$@ is empty');
-    is(Math::BigInt -> config("lib"), "Math::BigInt::Calc",
-       'Math::BigInt -> config("lib")');
-    is(ref Math::BigInt -> bzero() -> {value}, "Math::BigInt::Calc",
-       "ref Math::BigInt -> bzero() -> {value}");
-}
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/lib_load-mbi-mbf.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/lib_load-mbi-mbf.t
deleted file mode 100644 (file)
index 8868667..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-# -*- mode: perl; -*-
-
-use strict;
-use warnings;
-
-use Test::More tests => 10;
-
-use lib "t";
-
-# First load Math::BigInt with Math::BigInt::Calc.
-
-use Math::BigInt lib => "Calc";
-
-is(Math::BigInt -> config("lib"), "Math::BigInt::Calc",
-   'Math::BigInt -> config("lib")');
-
-is(ref Math::BigInt -> bzero() -> {value}, "Math::BigInt::Calc",
-   'ref Math::BigInt -> bzero() -> {value}');
-
-# Math::BigFloat will know that we loaded Math::BigInt::Calc.
-
-require Math::BigFloat;
-
-is(Math::BigFloat -> config("lib"), "Math::BigInt::Calc",
-   'Math::BigFloat -> config("lib")');
-
-is(ref Math::BigFloat -> bzero() -> {_m}, "Math::BigInt::Calc",
-   "ref Math::BigFloat -> bzero() -> {_m}");
-
-# Now load Math::BigInt again with a different lib.
-
-Math::BigInt -> import(lib => "BareCalc");
-
-is(Math::BigInt -> config("lib"), "Math::BigInt::Calc",
-   'Math::BigInt -> config("lib")');
-
-is(ref Math::BigInt -> bzero() -> {value}, "Math::BigInt::Calc",
-   'ref Math::BigInt -> bzero() -> {value}');
-
-# See if Math::BigFloat knows about Math::BigInt::BareCalc.
-
-is(Math::BigFloat -> config("lib"), "Math::BigInt::Calc",
-   "Math::BigFloat is using library Math::BigInt::Calc");
-
-is(ref Math::BigFloat -> bzero() -> {_m}, "Math::BigInt::Calc",
-   "ref Math::BigFloat -> bzero() -> {_m}");
-
-# See that Math::BigFloat supports "only".
-
-eval { Math::BigFloat -> import("only" => "Calc") };
-subtest 'Math::BigFloat -> import("only" => "Calc")' => sub {
-    plan tests => 3;
-
-    is($@, "", '$@ is empty');
-    is(Math::BigFloat -> config("lib"), "Math::BigInt::Calc",
-       'Math::BigFloat -> config("lib")');
-    is(ref Math::BigFloat -> bzero() -> {_m}, "Math::BigInt::Calc",
-       "ref Math::BigFloat -> bzero() -> {_m}");
-};
-
-# See that Math::BigFloat supports "try".
-
-eval { Math::BigFloat -> import("try" => "BareCalc") };
-subtest 'Math::BigFloat -> import("try" => "BareCalc")' => sub {
-    plan tests => 3;
-
-    is($@, "", '$@ is empty');
-    is(Math::BigFloat -> config("lib"), "Math::BigInt::Calc",
-       'Math::BigFloat -> config("lib")');
-    is(ref Math::BigFloat -> bzero() -> {_m}, "Math::BigInt::Calc",
-       "ref Math::BigFloat -> bzero() -> {_m}");
-}
index 7a52d73..c3b458f 100644 (file)
@@ -417,17 +417,15 @@ $x = $mbi->new(123400);
 $x->{_a} = 4;
 is($x->bnot(), -123400, q|$x->bnot()|);         # not -1234001
 
-# both babs() and bneg() don't need to round, since the input will already
-# be rounded (either as $x or via new($string)), and they don't change the
-# value. The two tests below peek at this by using _a (illegally) directly
+# to be consistent with other methods, babs() and bneg() also support rounding
 
 $x = $mbi->new(-123401);
 $x->{_a} = 4;
-is($x->babs(), 123401, q|$x->babs()|);
+is($x->babs(), 123400, q|$x->babs()|);
 
 $x = $mbi->new(-123401);
 $x->{_a} = 4;
-is($x->bneg(), 123401, q|$x->bneg()|);
+is($x->bneg(), 123400, q|$x->bneg()|);
 
 # test bdiv rounding to A and R (bug in v1.48 and maybe earlier versions)
 
@@ -1293,7 +1291,7 @@ while (<DATA>) {
     $try .= qq| \$y->accuracy($ya);|  if $ya ne '';
     $try .= qq| \$y->precision($yp);| if $yp ne '';
 
-    $try .= ' $x->$f($y);';
+    $try .= ' $x->' . $f . '($y);';
 
     # print "trying $try\n";
     $rc = eval $try;
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/new-mbf.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/new-mbf.t
deleted file mode 100644 (file)
index d4fa8b6..0000000
+++ /dev/null
@@ -1,303 +0,0 @@
-# -*- mode: perl; -*-
-
-use strict;
-use warnings;
-
-use Test::More tests => 112;
-
-use Scalar::Util qw< refaddr >;
-
-my $class;
-
-BEGIN { $class = 'Math::BigFloat'; }
-BEGIN { use_ok($class, '1.999821'); }
-
-while (<DATA>) {
-    s/#.*$//;           # remove comments
-    s/\s+$//;           # remove trailing whitespace
-    next unless length; # skip empty lines
-
-    my ($in0, $out0) = split /:/;
-    my $x;
-
-    my $test = qq|\$x = $class -> new("$in0");|;
-    my $desc = $test;
-
-    eval $test;
-    die $@ if $@;       # this should never happen
-
-    subtest $desc, sub {
-        plan tests => 2,
-
-        # Check output.
-
-        is(ref($x), $class, "output arg is a $class");
-        is($x, $out0, 'output arg has the right value');
-    };
-
-}
-
-# new()
-
-{
-    my $x = $class -> new();
-    subtest qq|\$x = $class -> new();|, => sub {
-        plan tests => 2;
-
-        is(ref($x), $class, "output arg is a $class");
-        is($x, "0", 'output arg has the right value');
-    };
-}
-
-# new("")
-
-{
-    no warnings "numeric";
-    my $x = $class -> new("");
-    subtest qq|\$x = $class -> new("");|, => sub {
-        plan tests => 2;
-
-        is(ref($x), $class, "output arg is a $class");
-#        is($x, "0", 'output arg has the right value');
-        is($x, "NaN", 'output arg has the right value');
-    };
-}
-
-# new(undef)
-
-{
-    no warnings "uninitialized";
-    my $x = $class -> new(undef);
-    subtest qq|\$x = $class -> new(undef);|, => sub {
-        plan tests => 2;
-
-        is(ref($x), $class, "output arg is a $class");
-        is($x, "0", 'output arg has the right value');
-    };
-}
-
-# new($x)
-#
-# In this case, when $x isa Math::BigFloat, only the sign and value should be
-# copied from $x, not the accuracy or precision.
-
-SKIP: {
-    skip "This test reveals a bug that has not been fixed yet", 2;
-
-    my ($a, $p, $x, $y);
-
-    $a = $class -> accuracy();          # get original
-    $class -> accuracy(4711);           # set new global value
-    $x = $class -> new("314");          # create object
-    $x -> accuracy(41);                 # set instance value
-    $y = $class -> new($x);             # create new object
-    is($y -> accuracy(), 4711, 'object has the global accuracy');
-    $class -> accuracy($a);             # reset
-
-    $p = $class -> precision();         # get original
-    $class -> precision(4711);          # set new global value
-    $x = $class -> new("314");          # create object
-    $x -> precision(41);                # set instance value
-    $y = $class -> new($x);             # create new object
-    is($y -> precision(), 4711, 'object has the global precision');
-    $class -> precision($p);            # reset
-}
-
-# Make sure that library thingies are indeed copied.
-
-{
-    my ($x, $y);
-
-    $x = $class -> new("314");          # create object
-    $y = $class -> new($x);             # create new object
-    subtest 'library thingy is copied' => sub {
-        my @keys = ('_m', '_e');
-        plan tests => scalar @keys;
-        for my $key (@keys) {
-            isnt(refaddr($y -> {$key}), refaddr($x -> {$key}),
-                 'library thingy is a copy');
-        }
-    };
-}
-
-# Other tests where we must use the scientific notation in the output.
-
-for my $str (qw/
-                   1e+4294967296
-                   1e+18446744073709551616
-                   1e+79228162514264337593543950336
-                   1e+340282366920938463463374607431768211456
-                   1e+1461501637330902918203684832716283019655932542976
-                   1e+6277101735386680763835789423207666416102355444464034512896
-               /)
-{
-    my $x;
-    $x = $class -> new($str);
-    subtest $str, sub {
-        plan tests => 2,
-
-        is(ref($x), $class, "output arg is a $class");
-        is($x -> bnstr(), $str, 'output arg has the right value');
-    }
-}
-
-__END__
-
-NaN:NaN
-inf:inf
-infinity:inf
-+inf:inf
-+infinity:inf
--inf:-inf
--infinity:-inf
-
-# This is the same data as in from_bin-mbf.t, except that some of them are
-# commented out, since new() only treats input as binary if it has a "0b" or
-# "0B" prefix, possibly with a leading "+" or "-" sign. Duplicates from above
-# are also commented out.
-
-0b1p+0:1
-0b.1p+1:1
-0b.01p+2:1
-0b.001p+3:1
-0b.0001p+4:1
-0b10p-1:1
-0b100p-2:1
-0b1000p-3:1
-
--0b1p+0:-1
-
-0b0p+0:0
-0b0p+7:0
-0b0p-7:0
-0b0.p+0:0
-0b.0p+0:0
-0b0.0p+0:0
-
-0b1100101011111110:51966
-0B1100101011111110:51966
-b1100101011111110:51966
-B1100101011111110:51966
-#1100101011111110:51966
-
-0b1.1001p+3:12.5
-0b10010.001101p-1:9.1015625
--0b.11110001001101010111100110111101111p+31:-2023406814.9375
-0b10.0100011010001010110011110001001101p+34:39093746765
-
-0b.p+0:NaN
-
-#NaN:NaN
-#+inf:NaN
-#-inf:NaN
-
-# This is more or less the same data as in from_oct-mbf.t, except that some of
-# them are commented out, since new() does not consider a number with just a
-# leading zero to be an octal number. Duplicates from above are also commented
-# out.
-
-# Without "0o" prefix.
-
-001p+0:1
-00.4p+1:1
-00.2p+2:1
-00.1p+3:1
-00.04p+4:1
-02p-1:1
-04p-2:1
-010p-3:1
-
--01p+0:-1
-
-00p+0:0
-00p+7:0
-00p-7:0
-00.p+0:0
-00.0p+0:0
-
-#145376:51966
-#0145376:51966
-#00145376:51966
-
-03.1p+2:12.5
-022.15p-1:9.1015625
--00.361152746757p+32:-2023406814.9375
-044.3212636115p+30:39093746765
-
-0.p+0:NaN
-.p+0:NaN
-
-# With "0o" prefix.
-
-0o01p+0:1
-0o0.4p+1:1
-0o0.2p+2:1
-0o0.1p+3:1
-0o0.04p+4:1
-0o02p-1:1
-0o04p-2:1
-0o010p-3:1
-
--0o1p+0:-1
-
-0o0p+0:0
-0o0p+7:0
-0o0p-7:0
-0o0.p+0:0
-0o.0p+0:0
-0o0.0p+0:0
-
-0o145376:51966
-0O145376:51966
-o145376:51966
-O145376:51966
-
-0o3.1p+2:12.5
-0o22.15p-1:9.1015625
--0o0.361152746757p+32:-2023406814.9375
-0o44.3212636115p+30:39093746765
-
-0o.p+0:NaN
-
-#NaN:NaN
-#+inf:NaN
-#-inf:NaN
-
-# This is the same data as in from_hex-mbf.t, except that some of them are
-# commented out, since new() only treats input as hexadecimal if it has a "0x"
-# or "0X" prefix, possibly with a leading "+" or "-" sign.
-
-0x1p+0:1
-0x.8p+1:1
-0x.4p+2:1
-0x.2p+3:1
-0x.1p+4:1
-0x2p-1:1
-0x4p-2:1
-0x8p-3:1
-
--0x1p+0:-1
-
-0x0p+0:0
-0x0p+7:0
-0x0p-7:0
-0x0.p+0:0
-0x.0p+0:0
-0x0.0p+0:0
-
-0xcafe:51966
-0Xcafe:51966
-xcafe:51966
-Xcafe:51966
-#cafe:51966
-
-0x1.9p+3:12.5
-0x12.34p-1:9.1015625
--0x.789abcdefp+32:-2023406814.9375
-0x12.3456789ap+31:39093746765
-
-0x.p+0:NaN
-
-#NaN:NaN
-#+inf:NaN
-#-inf:NaN
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/new-mbi.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/new-mbi.t
deleted file mode 100644 (file)
index 07d826d..0000000
+++ /dev/null
@@ -1,279 +0,0 @@
-# -*- mode: perl; -*-
-
-use strict;
-use warnings;
-
-use Test::More tests => 106;
-
-use Scalar::Util qw< refaddr >;
-
-my $class;
-
-BEGIN { $class = 'Math::BigInt'; }
-BEGIN { use_ok($class); }
-
-while (<DATA>) {
-    s/#.*$//;           # remove comments
-    s/\s+$//;           # remove trailing whitespace
-    next unless length; # skip empty lines
-
-    my ($in0, $out0) = split /:/;
-    my $x;
-    my $test = qq|\$x = $class -> new("$in0");|;
-    my $desc = $test;
-
-    eval $test;
-    die $@ if $@;       # this should never happen
-
-    subtest $desc, sub {
-        plan tests => 2,
-
-        # Check output.
-
-        is(ref($x), $class, "output arg is a $class");
-        is($x, $out0, 'output arg has the right value');
-    };
-
-}
-
-# new()
-
-{
-    my $x = $class -> new();
-    subtest qq|\$x = $class -> new();|, => sub {
-        plan tests => 2;
-
-        is(ref($x), $class, "output arg is a $class");
-        is($x, "0", 'output arg has the right value');
-    };
-}
-
-# new("")
-
-{
-    no warnings "numeric";
-    my $x = $class -> new("");
-    subtest qq|\$x = $class -> new("");|, => sub {
-        plan tests => 2;
-
-        is(ref($x), $class, "output arg is a $class");
-        #is($x, "0", 'output arg has the right value');
-        is($x, "NaN", 'output arg has the right value');
-    };
-}
-
-# new(undef)
-
-{
-    no warnings "uninitialized";
-    my $x = $class -> new(undef);
-    subtest qq|\$x = $class -> new(undef);|, => sub {
-        plan tests => 2;
-
-        is(ref($x), $class, "output arg is a $class");
-        is($x, "0", 'output arg has the right value');
-    };
-}
-
-# new($x)
-#
-# In this case, when $x isa Math::BigInt, only the sign and value should be
-# copied from $x, not the accuracy or precision.
-
-{
-    my ($a, $p, $x, $y);
-
-    $a = $class -> accuracy();          # get original
-    $class -> accuracy(4711);           # set new global value
-    $x = $class -> new("314");          # create object
-    $x -> accuracy(41);                 # set instance value
-    $y = $class -> new($x);             # create new object
-    is($y -> accuracy(), 4711, 'object has the global accuracy');
-    $class -> accuracy($a);             # reset
-
-    $p = $class -> precision();         # get original
-    $class -> precision(4711);          # set new global value
-    $x = $class -> new("314");          # create object
-    $x -> precision(41);                # set instance value
-    $y = $class -> new($x);             # create new object
-    is($y -> precision(), 4711, 'object has the global precision');
-    $class -> precision($p);            # reset
-}
-
-# Make sure that library thingies are indeed copied.
-
-{
-    my ($x, $y);
-
-    $x = $class -> new("314");          # create object
-    $y = $class -> new($x);             # create new object
-    subtest 'library thingy is copied' => sub {
-        my @keys = ('value');
-        plan tests => scalar @keys;
-        for my $key (@keys) {
-            isnt(refaddr($y -> {$key}), refaddr($x -> {$key}),
-                 'library thingy is a copy');
-        }
-    };
-}
-
-__END__
-
-NaN:NaN
-inf:inf
-infinity:inf
-+inf:inf
-+infinity:inf
--inf:-inf
--infinity:-inf
-
-# This is the same data as in from_bin-mbf.t, except that some of them are
-# commented out, since new() only treats input as binary if it has a "0b" or
-# "0B" prefix, possibly with a leading "+" or "-" sign. Duplicates from above
-# are also commented out.
-
-0b1p+0:1
-0b.1p+1:1
-0b.01p+2:1
-0b.001p+3:1
-0b.0001p+4:1
-0b10p-1:1
-0b100p-2:1
-0b1000p-3:1
-
--0b1p+0:-1
-
-0b0p+0:0
-0b0p+7:0
-0b0p-7:0
-0b0.p+0:0
-0b.0p+0:0
-0b0.0p+0:0
-
-0b1100101011111110:51966
-0B1100101011111110:51966
-b1100101011111110:51966
-B1100101011111110:51966
-#1100101011111110:51966
-
-0b1.1001p+3:NaN
-0b10010.001101p-1:NaN
--0b.11110001001101010111100110111101111p+31:NaN
-0b10.0100011010001010110011110001001101p+34:39093746765
-
-0b.p+0:NaN
-
-#NaN:NaN
-#+inf:NaN
-#-inf:NaN
-
-# This is more or less the same data as in from_oct-mbf.t, except that some of
-# them are commented out, since new() does not consider a number with just a
-# leading zero to be an octal number. Duplicates from above are also commented
-# out.
-
-# Without "0o" prefix.
-
-001p+0:1
-00.4p+1:1
-00.2p+2:1
-00.1p+3:1
-00.04p+4:1
-02p-1:1
-04p-2:1
-010p-3:1
-
--01p+0:-1
-
-00p+0:0
-00p+7:0
-00p-7:0
-00.p+0:0
-00.0p+0:0
-
-#145376:51966
-#0145376:51966
-#00145376:51966
-
-03.1p+2:NaN
-022.15p-1:NaN
--00.361152746757p+32:NaN
-044.3212636115p+30:39093746765
-
-0.p+0:NaN
-.p+0:NaN
-
-# With "0o" prefix.
-
-0o01p+0:1
-0o0.4p+1:1
-0o0.2p+2:1
-0o0.1p+3:1
-0o0.04p+4:1
-0o02p-1:1
-0o04p-2:1
-0o010p-3:1
-
--0o1p+0:-1
-
-0o0p+0:0
-0o0p+7:0
-0o0p-7:0
-0o0.p+0:0
-0o.0p+0:0
-0o0.0p+0:0
-
-0o145376:51966
-0O145376:51966
-o145376:51966
-O145376:51966
-
-0o3.1p+2:NaN
-0o22.15p-1:NaN
--0o0.361152746757p+32:NaN
-0o44.3212636115p+30:39093746765
-
-0o.p+0:NaN
-
-#NaN:NaN
-#+inf:NaN
-#-inf:NaN
-
-# This is the same data as in from_hex-mbf.t, except that some of them are
-# commented out, since new() only treats input as hexadecimal if it has a "0x"
-# or "0X" prefix, possibly with a leading "+" or "-" sign.
-
-0x1p+0:1
-0x.8p+1:1
-0x.4p+2:1
-0x.2p+3:1
-0x.1p+4:1
-0x2p-1:1
-0x4p-2:1
-0x8p-3:1
-
--0x1p+0:-1
-
-0x0p+0:0
-0x0p+7:0
-0x0p-7:0
-0x0.p+0:0
-0x.0p+0:0
-0x0.0p+0:0
-
-0xcafe:51966
-0Xcafe:51966
-xcafe:51966
-Xcafe:51966
-#cafe:51966
-
-0x1.9p+3:NaN
-0x12.34p-1:NaN
--0x.789abcdefp+32:NaN
-0x12.3456789ap+31:39093746765
-
-0x.p+0:NaN
-
-#NaN:NaN
-#+inf:NaN
-#-inf:NaN
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/nparts-mbf.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/nparts-mbf.t
deleted file mode 100644 (file)
index 0c558ad..0000000
+++ /dev/null
@@ -1,294 +0,0 @@
-# -*- mode: perl; -*-
-
-use strict;
-use warnings;
-
-use Test::More tests => 1840;
-
-use Math::BigFloat;
-
-while (<DATA>) {
-    s/#.*$//;                   # remove comments
-    s/\s+$//;                   # remove trailing whitespace
-    next unless length;         # skip empty lines
-
-    my ($x_str, $mant_str, $expo_str) = split /:/;
-
-    note(qq|\n\$x = Math::BigFloat -> new("$x_str");|,
-         qq| (\$m, \$e) = \$x -> nparts();\n\n|);
-
-    {
-        my $x = Math::BigFloat -> new($x_str);
-        my ($mant_got, $expo_got) = $x -> nparts();
-
-        isa_ok($mant_got, "Math::BigFloat");
-        isa_ok($expo_got, "Math::BigFloat");
-
-        is($mant_got, $mant_str, "value of mantissa");
-        is($expo_got, $expo_str, "value of exponent");
-        is($x,        $x_str,    "input is unmodified");
-    }
-
-    note(qq|\n\$x = Math::BigFloat -> new("$x_str");|,
-         qq| \$m = \$x -> nparts();\n\n|);
-
-    {
-        my $x = Math::BigFloat -> new($x_str);
-        my $mant_got = $x -> nparts();
-
-        isa_ok($mant_got, "Math::BigFloat");
-
-        is($mant_got, $mant_str, "value of mantissa");
-        is($x,        $x_str,    "input is unmodified");
-    }
-
-}
-
-__DATA__
-
-NaN:NaN:NaN
-
-inf:inf:inf
--inf:-inf:inf
-
-0:0:0
-
-# positive numbers
-
-0.000000000001:1:-12
-0.00000000001:1:-11
-0.0000000001:1:-10
-0.000000001:1:-9
-0.00000001:1:-8
-0.0000001:1:-7
-0.000001:1:-6
-0.00001:1:-5
-0.0001:1:-4
-0.001:1:-3
-0.01:1:-2
-0.1:1:-1
-1:1:0
-10:1:1
-100:1:2
-1000:1:3
-10000:1:4
-100000:1:5
-1000000:1:6
-10000000:1:7
-100000000:1:8
-1000000000:1:9
-10000000000:1:10
-100000000000:1:11
-1000000000000:1:12
-
-0.0000000000012:1.2:-12
-0.000000000012:1.2:-11
-0.00000000012:1.2:-10
-0.0000000012:1.2:-9
-0.000000012:1.2:-8
-0.00000012:1.2:-7
-0.0000012:1.2:-6
-0.000012:1.2:-5
-0.00012:1.2:-4
-0.0012:1.2:-3
-0.012:1.2:-2
-0.12:1.2:-1
-1.2:1.2:0
-12:1.2:1
-120:1.2:2
-1200:1.2:3
-12000:1.2:4
-120000:1.2:5
-1200000:1.2:6
-12000000:1.2:7
-120000000:1.2:8
-1200000000:1.2:9
-12000000000:1.2:10
-120000000000:1.2:11
-1200000000000:1.2:12
-
-0.00000000000123:1.23:-12
-0.0000000000123:1.23:-11
-0.000000000123:1.23:-10
-0.00000000123:1.23:-9
-0.0000000123:1.23:-8
-0.000000123:1.23:-7
-0.00000123:1.23:-6
-0.0000123:1.23:-5
-0.000123:1.23:-4
-0.00123:1.23:-3
-0.0123:1.23:-2
-0.123:1.23:-1
-1.23:1.23:0
-12.3:1.23:1
-123:1.23:2
-1230:1.23:3
-12300:1.23:4
-123000:1.23:5
-1230000:1.23:6
-12300000:1.23:7
-123000000:1.23:8
-1230000000:1.23:9
-12300000000:1.23:10
-123000000000:1.23:11
-1230000000000:1.23:12
-
-0.000000000001234:1.234:-12
-0.00000000001234:1.234:-11
-0.0000000001234:1.234:-10
-0.000000001234:1.234:-9
-0.00000001234:1.234:-8
-0.0000001234:1.234:-7
-0.000001234:1.234:-6
-0.00001234:1.234:-5
-0.0001234:1.234:-4
-0.001234:1.234:-3
-0.01234:1.234:-2
-0.1234:1.234:-1
-1.234:1.234:0
-12.34:1.234:1
-123.4:1.234:2
-1234:1.234:3
-12340:1.234:4
-123400:1.234:5
-1234000:1.234:6
-12340000:1.234:7
-123400000:1.234:8
-1234000000:1.234:9
-12340000000:1.234:10
-123400000000:1.234:11
-1234000000000:1.234:12
-
-0.000003141592:3.141592:-6
-0.00003141592:3.141592:-5
-0.0003141592:3.141592:-4
-0.003141592:3.141592:-3
-0.03141592:3.141592:-2
-0.3141592:3.141592:-1
-3.141592:3.141592:0
-31.41592:3.141592:1
-314.1592:3.141592:2
-3141.592:3.141592:3
-31415.92:3.141592:4
-314159.2:3.141592:5
-3141592:3.141592:6
-
-# negativ: numbers
-
--0.000000000001:-1:-12
--0.00000000001:-1:-11
--0.0000000001:-1:-10
--0.000000001:-1:-9
--0.00000001:-1:-8
--0.0000001:-1:-7
--0.000001:-1:-6
--0.00001:-1:-5
--0.0001:-1:-4
--0.001:-1:-3
--0.01:-1:-2
--0.1:-1:-1
--1:-1:0
--10:-1:1
--100:-1:2
--1000:-1:3
--10000:-1:4
--100000:-1:5
--1000000:-1:6
--10000000:-1:7
--100000000:-1:8
--1000000000:-1:9
--10000000000:-1:10
--100000000000:-1:11
--1000000000000:-1:12
-
--0.0000000000012:-1.2:-12
--0.000000000012:-1.2:-11
--0.00000000012:-1.2:-10
--0.0000000012:-1.2:-9
--0.000000012:-1.2:-8
--0.00000012:-1.2:-7
--0.0000012:-1.2:-6
--0.000012:-1.2:-5
--0.00012:-1.2:-4
--0.0012:-1.2:-3
--0.012:-1.2:-2
--0.12:-1.2:-1
--1.2:-1.2:0
--12:-1.2:1
--120:-1.2:2
--1200:-1.2:3
--12000:-1.2:4
--120000:-1.2:5
--1200000:-1.2:6
--12000000:-1.2:7
--120000000:-1.2:8
--1200000000:-1.2:9
--12000000000:-1.2:10
--120000000000:-1.2:11
--1200000000000:-1.2:12
-
--0.00000000000123:-1.23:-12
--0.0000000000123:-1.23:-11
--0.000000000123:-1.23:-10
--0.00000000123:-1.23:-9
--0.0000000123:-1.23:-8
--0.000000123:-1.23:-7
--0.00000123:-1.23:-6
--0.0000123:-1.23:-5
--0.000123:-1.23:-4
--0.00123:-1.23:-3
--0.0123:-1.23:-2
--0.123:-1.23:-1
--1.23:-1.23:0
--12.3:-1.23:1
--123:-1.23:2
--1230:-1.23:3
--12300:-1.23:4
--123000:-1.23:5
--1230000:-1.23:6
--12300000:-1.23:7
--123000000:-1.23:8
--1230000000:-1.23:9
--12300000000:-1.23:10
--123000000000:-1.23:11
--1230000000000:-1.23:12
-
--0.000000000001234:-1.234:-12
--0.00000000001234:-1.234:-11
--0.0000000001234:-1.234:-10
--0.000000001234:-1.234:-9
--0.00000001234:-1.234:-8
--0.0000001234:-1.234:-7
--0.000001234:-1.234:-6
--0.00001234:-1.234:-5
--0.0001234:-1.234:-4
--0.001234:-1.234:-3
--0.01234:-1.234:-2
--0.1234:-1.234:-1
--1.234:-1.234:0
--12.34:-1.234:1
--123.4:-1.234:2
--1234:-1.234:3
--12340:-1.234:4
--123400:-1.234:5
--1234000:-1.234:6
--12340000:-1.234:7
--123400000:-1.234:8
--1234000000:-1.234:9
--12340000000:-1.234:10
--123400000000:-1.234:11
--1234000000000:-1.234:12
-
--0.000003141592:-3.141592:-6
--0.00003141592:-3.141592:-5
--0.0003141592:-3.141592:-4
--0.003141592:-3.141592:-3
--0.03141592:-3.141592:-2
--0.3141592:-3.141592:-1
--3.141592:-3.141592:0
--31.41592:-3.141592:1
--314.1592:-3.141592:2
--3141.592:-3.141592:3
--31415.92:-3.141592:4
--314159.2:-3.141592:5
--3141592:-3.141592:6
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/nparts-mbi.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/nparts-mbi.t
deleted file mode 100644 (file)
index a970535..0000000
+++ /dev/null
@@ -1,162 +0,0 @@
-# -*- mode: perl; -*-
-
-use strict;
-use warnings;
-
-use Test::More tests => 784;
-
-use Math::BigInt;
-
-while (<DATA>) {
-    s/#.*$//;                   # remove comments
-    s/\s+$//;                   # remove trailing whitespace
-    next unless length;         # skip empty lines
-
-    my ($x_str, $mant_str, $expo_str) = split /:/;
-
-    note(qq|\n\$x = Math::BigInt -> new("$x_str");|,
-         qq| (\$m, \$e) = \$x -> nparts();\n\n|);
-
-    {
-        my $x = Math::BigInt -> new($x_str);
-        my ($mant_got, $expo_got) = $x -> nparts();
-
-        isa_ok($mant_got, "Math::BigInt");
-        isa_ok($expo_got, "Math::BigInt");
-
-        is($mant_got, $mant_str, "value of mantissa");
-        is($expo_got, $expo_str, "value of exponent");
-        is($x,        $x_str,    "input is unmodified");
-    }
-
-    note(qq|\n\$x = Math::BigInt -> new("$x_str");|,
-         qq| \$m = \$x -> nparts();\n\n|);
-
-    {
-        my $x = Math::BigInt -> new($x_str);
-        my $mant_got = $x -> nparts();
-
-        isa_ok($mant_got, "Math::BigInt");
-
-        is($mant_got, $mant_str, "value of mantissa");
-        is($x,        $x_str,    "input is unmodified");
-    }
-
-}
-
-__DATA__
-
-NaN:NaN:NaN
-
-inf:inf:inf
--inf:-inf:inf
-
-0:0:0
-
-# positive numbers
-
-1:1:0
-10:1:1
-100:1:2
-1000:1:3
-10000:1:4
-100000:1:5
-1000000:1:6
-10000000:1:7
-100000000:1:8
-1000000000:1:9
-10000000000:1:10
-100000000000:1:11
-1000000000000:1:12
-
-12:NaN:1
-120:NaN:2
-1200:NaN:3
-12000:NaN:4
-120000:NaN:5
-1200000:NaN:6
-12000000:NaN:7
-120000000:NaN:8
-1200000000:NaN:9
-12000000000:NaN:10
-120000000000:NaN:11
-1200000000000:NaN:12
-
-123:NaN:2
-1230:NaN:3
-12300:NaN:4
-123000:NaN:5
-1230000:NaN:6
-12300000:NaN:7
-123000000:NaN:8
-1230000000:NaN:9
-12300000000:NaN:10
-123000000000:NaN:11
-1230000000000:NaN:12
-
-1234:NaN:3
-12340:NaN:4
-123400:NaN:5
-1234000:NaN:6
-12340000:NaN:7
-123400000:NaN:8
-1234000000:NaN:9
-12340000000:NaN:10
-123400000000:NaN:11
-1234000000000:NaN:12
-
-3141592:NaN:6
-
-# negativ: numbers
-
--1:-1:0
--10:-1:1
--100:-1:2
--1000:-1:3
--10000:-1:4
--100000:-1:5
--1000000:-1:6
--10000000:-1:7
--100000000:-1:8
--1000000000:-1:9
--10000000000:-1:10
--100000000000:-1:11
--1000000000000:-1:12
-
--12:NaN:1
--120:NaN:2
--1200:NaN:3
--12000:NaN:4
--120000:NaN:5
--1200000:NaN:6
--12000000:NaN:7
--120000000:NaN:8
--1200000000:NaN:9
--12000000000:NaN:10
--120000000000:NaN:11
--1200000000000:NaN:12
-
--123:NaN:2
--1230:NaN:3
--12300:NaN:4
--123000:NaN:5
--1230000:NaN:6
--12300000:NaN:7
--123000000:NaN:8
--1230000000:NaN:9
--12300000000:NaN:10
--123000000000:NaN:11
--1230000000000:NaN:12
-
--1234:NaN:3
--12340:NaN:4
--123400:NaN:5
--1234000:NaN:6
--12340000:NaN:7
--123400000:NaN:8
--1234000000:NaN:9
--12340000000:NaN:10
--123400000000:NaN:11
--1234000000000:NaN:12
-
--3141592:NaN:6
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/objectify_mbf.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/objectify_mbf.t
deleted file mode 100644 (file)
index 8ea7abe..0000000
+++ /dev/null
@@ -1,99 +0,0 @@
-# -*- mode: perl; -*-
-#
-# Verify that objectify() is able to convert a "foreign" object into what we
-# want, when what we want is Math::BigFloat or subclass thereof.
-
-use strict;
-use warnings;
-
-package main;
-
-use Test::More tests => 6;
-
-use Math::BigFloat;
-
-###############################################################################
-
-for my $class ('Math::BigFloat', 'Math::BigFloat::Subclass') {
-
-    # This object defines what we want.
-
-    my $float = $class -> new(10);
-
-    # Create various objects that should work with the object above after
-    # objectify() has done its thing.
-
-    my $float_percent1 = My::Percent::Float1 -> new(100);
-    is($float * $float_percent1, 10,
-       qq|\$float = $class -> new(10);|
-       . q| $float_percent1 = My::Percent::Float1 -> new(100);|
-       . q| $float * $float_percent1;|);
-
-    my $float_percent2 = My::Percent::Float2 -> new(100);
-    is($float * $float_percent2, 10,
-       qq|\$float = $class -> new(10);|
-       . q| $float_percent2 = My::Percent::Float2 -> new(100);|
-       . q| $float * $float_percent2;|);
-
-    my $float_percent3 = My::Percent::Float3 -> new(100);
-    is($float * $float_percent3, 10,
-       qq|\$float = $class -> new(10);|
-       . q| $float_percent3 = My::Percent::Float3 -> new(100);|
-       . q| $float * $float_percent3;|);
-}
-
-###############################################################################
-# Class supports as_float(), which returns a Math::BigFloat.
-
-package My::Percent::Float1;
-
-sub new {
-    my $class = shift;
-    my $num = shift;
-    return bless \$num, $class;
-}
-
-sub as_float {
-    my $self = shift;
-    return Math::BigFloat -> new($$self / 100);
-}
-
-###############################################################################
-# Class supports as_float(), which returns a scalar.
-
-package My::Percent::Float2;
-
-sub new {
-    my $class = shift;
-    my $num = shift;
-    return bless \$num, $class;
-}
-
-sub as_float {
-    my $self = shift;
-    return $$self / 100;
-}
-
-###############################################################################
-# Class does not support as_float().
-
-package My::Percent::Float3;
-
-use overload '""' => sub { $_[0] -> as_string(); };
-
-sub new {
-    my $class = shift;
-    my $num = shift;
-    return bless \$num, $class;
-}
-
-sub as_string {
-    my $self = shift;
-    return $$self / 100;
-}
-
-###############################################################################
-
-package Math::BigFloat::Subclass;
-
-use base 'Math::BigFloat';
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/objectify_mbi.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/objectify_mbi.t
deleted file mode 100644 (file)
index 8efb452..0000000
+++ /dev/null
@@ -1,145 +0,0 @@
-# -*- mode: perl; -*-
-#
-# Verify that objectify() is able to convert a "foreign" object into what we
-# want, when what we want is Math::BigInt or subclass thereof.
-
-use strict;
-use warnings;
-
-package main;
-
-use Test::More tests => 10;
-
-use Math::BigInt;
-
-###############################################################################
-
-for my $class ('Math::BigInt', 'Math::BigInt::Subclass') {
-
-    # This object defines what we want.
-
-    my $int = $class -> new(10);
-
-    # Create various objects that should work with the object above after
-    # objectify() has done its thing.
-
-    my $int_percent1 = My::Percent::Int1 -> new(100);
-    is($int * $int_percent1, 10,
-       qq|\$class -> new(10);|
-       . q| $int_percent1 = My::Percent::Int1 -> new(100);|
-       . q| $int * $int_percent1|);
-
-    my $int_percent2 = My::Percent::Int2 -> new(100);
-    is($int * $int_percent2, 10,
-       qq|\$class -> new(10);|
-       . q| $int_percent2 = My::Percent::Int2 -> new(100);|
-       . q| $int * $int_percent2|);
-
-    my $int_percent3 = My::Percent::Int3 -> new(100);
-    is($int * $int_percent3, 10,
-       qq|\$class -> new(10);|
-       . q| $int_percent3 = My::Percent::Int3 -> new(100);|
-       . q| $int * $int_percent3|);
-
-    my $int_percent4 = My::Percent::Int4 -> new(100);
-    is($int * $int_percent4, 10,
-       qq|\$class -> new(10);|
-       . q| $int_percent4 = My::Percent::Int4 -> new(100);|
-       . q| $int * $int_percent4|);
-
-    my $int_percent5 = My::Percent::Int5 -> new(100);
-    is($int * $int_percent5, 10,
-       qq|\$class -> new(10);|
-       . q| $int_percent5 = My::Percent::Int5 -> new(100);|
-       . q| $int * $int_percent5|);
-}
-
-###############################################################################
-# Class supports as_int(), which returns a Math::BigInt.
-
-package My::Percent::Int1;
-
-sub new {
-    my $class = shift;
-    my $num = shift;
-    return bless \$num, $class;
-}
-
-sub as_int {
-    my $self = shift;
-    return Math::BigInt -> new($$self / 100);
-}
-
-###############################################################################
-# Class supports as_int(), which returns a scalar.
-
-package My::Percent::Int2;
-
-sub new {
-    my $class = shift;
-    my $num = shift;
-    return bless \$num, $class;
-}
-
-sub as_int {
-    my $self = shift;
-    return $$self / 100;
-}
-
-###############################################################################
-# Class does not support as_int(), but supports as_number(), which returns a
-# Math::BigInt.
-
-package My::Percent::Int3;
-
-sub new {
-    my $class = shift;
-    my $num = shift;
-    return bless \$num, $class;
-}
-
-sub as_number {
-    my $self = shift;
-    return Math::BigInt -> new($$self / 100);
-}
-
-###############################################################################
-# Class does  not support as_int(),  but supports as_number(), which  returns a
-# scalar.
-
-package My::Percent::Int4;
-
-sub new {
-    my $class = shift;
-    my $num = shift;
-    return bless \$num, $class;
-}
-
-sub as_number {
-    my $self = shift;
-    return $$self / 100;
-}
-
-###############################################################################
-# Class supports neither as_int() or as_number().
-
-package My::Percent::Int5;
-
-use overload '""' => sub { $_[0] -> as_string(); };
-
-sub new {
-    my $class = shift;
-    my $num = shift;
-    return bless \$num, $class;
-}
-
-sub as_string {
-    my $self = shift;
-    return $$self / 100;
-}
-
-###############################################################################
-
-package Math::BigInt::Subclass;
-
-use base 'Math::BigInt';
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/sparts-mbf.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/sparts-mbf.t
deleted file mode 100644 (file)
index b1a7a4a..0000000
+++ /dev/null
@@ -1,325 +0,0 @@
-# -*- mode: perl; -*-
-
-use strict;
-use warnings;
-
-use Test::More tests => 1848;
-
-use Math::BigFloat;
-
-while (<DATA>) {
-    s/#.*$//;                   # remove comments
-    s/\s+$//;                   # remove trailing whitespace
-    next unless length;         # skip empty lines
-
-    my ($x_str, $mant_str, $expo_str) = split /:/;
-
-    note(qq|\n\$x = Math::BigFloat -> new("$x_str");|,
-         qq| (\$m, \$e) = \$x -> sparts();\n\n|);
-
-    {
-        my $x = Math::BigFloat -> new($x_str);
-        my ($mant_got, $expo_got) = $x -> sparts();
-
-        isa_ok($mant_got, "Math::BigFloat");
-        isa_ok($expo_got, "Math::BigFloat");
-
-        is($mant_got, $mant_str, "value of mantissa");
-        is($expo_got, $expo_str, "value of exponent");
-        is($x,        $x_str,    "input is unmodified");
-    }
-
-    note(qq|\n\$x = Math::BigFloat -> new("$x_str");|,
-         qq| \$m = \$x -> sparts();\n\n|);
-
-    {
-        my $x = Math::BigFloat -> new($x_str);
-        my $mant_got = $x -> sparts();
-
-        isa_ok($mant_got, "Math::BigFloat");
-
-        is($mant_got, $mant_str, "value of mantissa");
-        is($x,        $x_str,    "input is unmodified");
-    }
-
-}
-
-# Verify that the accuracy of the significand and the exponent depends on the
-# accuracy of the invocand, if set, not the class.
-
-note(qq|\nVerify that accuracy depends on invocand, not class.\n\n|);
-
-{
-    Math::BigFloat -> accuracy(20);
-    my $x = Math::BigFloat -> new("3"); # accuray is 20
-    $x -> accuracy(10);                 # reduce accuray to 10
-
-    my ($mant, $expo) = $x -> sparts();
-    cmp_ok($mant, '==', 3, "value of significand");
-    cmp_ok($expo, '==', 0, "value of exponent");
-    cmp_ok($mant -> accuracy(), '==', 10, "accuracy of significand");
-    cmp_ok($expo -> accuracy(), '==', 20, "accuracy of exponent");
-}
-
-note(qq|\nVerify that precision depends on invocand, not class.\n\n|);
-
-{
-    Math::BigFloat -> precision(20);
-    my $x = Math::BigFloat -> new("3"); # precision is 20
-    $x -> precision(10);                # reduce precision to 10
-
-    my ($mant, $expo) = $x -> sparts();
-    cmp_ok($mant, '==', 3, "value of significand");
-    cmp_ok($expo, '==', 0, "value of exponent");
-    cmp_ok($mant -> precision(), '==', 10, "precision of significand");
-    cmp_ok($expo -> precision(), '==', 20, "precision of exponent");
-}
-
-__DATA__
-
-NaN:NaN:NaN
-
-inf:inf:inf
--inf:-inf:inf
-
-0:0:0
-
-# positive numbers
-
-0.000000000001:1:-12
-0.00000000001:1:-11
-0.0000000001:1:-10
-0.000000001:1:-9
-0.00000001:1:-8
-0.0000001:1:-7
-0.000001:1:-6
-0.00001:1:-5
-0.0001:1:-4
-0.001:1:-3
-0.01:1:-2
-0.1:1:-1
-1:1:0
-10:1:1
-100:1:2
-1000:1:3
-10000:1:4
-100000:1:5
-1000000:1:6
-10000000:1:7
-100000000:1:8
-1000000000:1:9
-10000000000:1:10
-100000000000:1:11
-1000000000000:1:12
-
-0.0000000000012:12:-13
-0.000000000012:12:-12
-0.00000000012:12:-11
-0.0000000012:12:-10
-0.000000012:12:-9
-0.00000012:12:-8
-0.0000012:12:-7
-0.000012:12:-6
-0.00012:12:-5
-0.0012:12:-4
-0.012:12:-3
-0.12:12:-2
-1.2:12:-1
-12:12:0
-120:12:1
-1200:12:2
-12000:12:3
-120000:12:4
-1200000:12:5
-12000000:12:6
-120000000:12:7
-1200000000:12:8
-12000000000:12:9
-120000000000:12:10
-1200000000000:12:11
-
-0.00000000000123:123:-14
-0.0000000000123:123:-13
-0.000000000123:123:-12
-0.00000000123:123:-11
-0.0000000123:123:-10
-0.000000123:123:-9
-0.00000123:123:-8
-0.0000123:123:-7
-0.000123:123:-6
-0.00123:123:-5
-0.0123:123:-4
-0.123:123:-3
-1.23:123:-2
-12.3:123:-1
-123:123:0
-1230:123:1
-12300:123:2
-123000:123:3
-1230000:123:4
-12300000:123:5
-123000000:123:6
-1230000000:123:7
-12300000000:123:8
-123000000000:123:9
-1230000000000:123:10
-
-0.000000000001234:1234:-15
-0.00000000001234:1234:-14
-0.0000000001234:1234:-13
-0.000000001234:1234:-12
-0.00000001234:1234:-11
-0.0000001234:1234:-10
-0.000001234:1234:-9
-0.00001234:1234:-8
-0.0001234:1234:-7
-0.001234:1234:-6
-0.01234:1234:-5
-0.1234:1234:-4
-1.234:1234:-3
-12.34:1234:-2
-123.4:1234:-1
-1234:1234:0
-12340:1234:1
-123400:1234:2
-1234000:1234:3
-12340000:1234:4
-123400000:1234:5
-1234000000:1234:6
-12340000000:1234:7
-123400000000:1234:8
-1234000000000:1234:9
-
-0.000003141592:3141592:-12
-0.00003141592:3141592:-11
-0.0003141592:3141592:-10
-0.003141592:3141592:-9
-0.03141592:3141592:-8
-0.3141592:3141592:-7
-3.141592:3141592:-6
-31.41592:3141592:-5
-314.1592:3141592:-4
-3141.592:3141592:-3
-31415.92:3141592:-2
-314159.2:3141592:-1
-3141592:3141592:0
-
-# negativ: numbers
-
--0.000000000001:-1:-12
--0.00000000001:-1:-11
--0.0000000001:-1:-10
--0.000000001:-1:-9
--0.00000001:-1:-8
--0.0000001:-1:-7
--0.000001:-1:-6
--0.00001:-1:-5
--0.0001:-1:-4
--0.001:-1:-3
--0.01:-1:-2
--0.1:-1:-1
--1:-1:0
--10:-1:1
--100:-1:2
--1000:-1:3
--10000:-1:4
--100000:-1:5
--1000000:-1:6
--10000000:-1:7
--100000000:-1:8
--1000000000:-1:9
--10000000000:-1:10
--100000000000:-1:11
--1000000000000:-1:12
-
--0.0000000000012:-12:-13
--0.000000000012:-12:-12
--0.00000000012:-12:-11
--0.0000000012:-12:-10
--0.000000012:-12:-9
--0.00000012:-12:-8
--0.0000012:-12:-7
--0.000012:-12:-6
--0.00012:-12:-5
--0.0012:-12:-4
--0.012:-12:-3
--0.12:-12:-2
--1.2:-12:-1
--12:-12:0
--120:-12:1
--1200:-12:2
--12000:-12:3
--120000:-12:4
--1200000:-12:5
--12000000:-12:6
--120000000:-12:7
--1200000000:-12:8
--12000000000:-12:9
--120000000000:-12:10
--1200000000000:-12:11
-
--0.00000000000123:-123:-14
--0.0000000000123:-123:-13
--0.000000000123:-123:-12
--0.00000000123:-123:-11
--0.0000000123:-123:-10
--0.000000123:-123:-9
--0.00000123:-123:-8
--0.0000123:-123:-7
--0.000123:-123:-6
--0.00123:-123:-5
--0.0123:-123:-4
--0.123:-123:-3
--1.23:-123:-2
--12.3:-123:-1
--123:-123:0
--1230:-123:1
--12300:-123:2
--123000:-123:3
--1230000:-123:4
--12300000:-123:5
--123000000:-123:6
--1230000000:-123:7
--12300000000:-123:8
--123000000000:-123:9
--1230000000000:-123:10
-
--0.000000000001234:-1234:-15
--0.00000000001234:-1234:-14
--0.0000000001234:-1234:-13
--0.000000001234:-1234:-12
--0.00000001234:-1234:-11
--0.0000001234:-1234:-10
--0.000001234:-1234:-9
--0.00001234:-1234:-8
--0.0001234:-1234:-7
--0.001234:-1234:-6
--0.01234:-1234:-5
--0.1234:-1234:-4
--1.234:-1234:-3
--12.34:-1234:-2
--123.4:-1234:-1
--1234:-1234:0
--12340:-1234:1
--123400:-1234:2
--1234000:-1234:3
--12340000:-1234:4
--123400000:-1234:5
--1234000000:-1234:6
--12340000000:-1234:7
--123400000000:-1234:8
--1234000000000:-1234:9
-
--0.000003141592:-3141592:-12
--0.00003141592:-3141592:-11
--0.0003141592:-3141592:-10
--0.003141592:-3141592:-9
--0.03141592:-3141592:-8
--0.3141592:-3141592:-7
--3.141592:-3141592:-6
--31.41592:-3141592:-5
--314.1592:-3141592:-4
--3141.592:-3141592:-3
--31415.92:-3141592:-2
--314159.2:-3141592:-1
--3141592:-3141592:0
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/sparts-mbi.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/sparts-mbi.t
deleted file mode 100644 (file)
index 5d1dab3..0000000
+++ /dev/null
@@ -1,193 +0,0 @@
-# -*- mode: perl; -*-
-
-use strict;
-use warnings;
-
-use Test::More tests => 792;
-
-use Math::BigInt;
-
-while (<DATA>) {
-    s/#.*$//;                   # remove comments
-    s/\s+$//;                   # remove trailing whitespace
-    next unless length;         # skip empty lines
-
-    my ($x_str, $mant_str, $expo_str) = split /:/;
-
-    note(qq|\n\$x = Math::BigInt -> new("$x_str");|,
-         qq| (\$m, \$e) = \$x -> sparts();\n\n|);
-
-    {
-        my $x = Math::BigInt -> new($x_str);
-        my ($mant_got, $expo_got) = $x -> sparts();
-
-        isa_ok($mant_got, "Math::BigInt");
-        isa_ok($expo_got, "Math::BigInt");
-
-        is($mant_got, $mant_str, "value of mantissa");
-        is($expo_got, $expo_str, "value of exponent");
-        is($x,        $x_str,    "input is unmodified");
-    }
-
-    note(qq|\n\$x = Math::BigInt -> new("$x_str");|,
-         qq| \$m = \$x -> sparts();\n\n|);
-
-    {
-        my $x = Math::BigInt -> new($x_str);
-        my $mant_got = $x -> sparts();
-
-        isa_ok($mant_got, "Math::BigInt");
-
-        is($mant_got, $mant_str, "value of mantissa");
-        is($x,        $x_str,    "input is unmodified");
-    }
-
-}
-
-# Verify that the accuracy of the significand and the exponent depends on the
-# accuracy of the invocand, if set, not the class.
-
-note(qq|\nVerify that accuracy depends on invocand, not class.\n\n|);
-
-{
-    Math::BigInt -> accuracy(20);
-    my $x = Math::BigInt -> new("3");   # accuracy is 20
-    $x -> accuracy(10);                 # reduce accuracy to 10
-
-    my ($mant, $expo) = $x -> sparts();
-    cmp_ok($mant, '==', 3, "value of significand");
-    cmp_ok($expo, '==', 0, "value of exponent");
-    cmp_ok($mant -> accuracy(), '==', 10, "accuracy of significand");
-    cmp_ok($expo -> accuracy(), '==', 20, "accuracy of exponent");
-}
-
-note(qq|\nVerify that precision depends on invocand, not class.\n\n|);
-
-{
-    Math::BigInt -> precision(20);
-    my $x = Math::BigInt -> new("3");   # precision is 20
-    $x -> precision(10);                # reduce precision to 10
-
-    my ($mant, $expo) = $x -> sparts();
-    cmp_ok($mant, '==', 3, "value of significand");
-    cmp_ok($expo, '==', 0, "value of exponent");
-    cmp_ok($mant -> precision(), '==', 10, "precision of significand");
-    cmp_ok($expo -> precision(), '==', 20, "precision of exponent");
-}
-
-__DATA__
-
-NaN:NaN:NaN
-
-inf:inf:inf
--inf:-inf:inf
-
-0:0:0
-
-# positive numbers
-
-1:1:0
-10:1:1
-100:1:2
-1000:1:3
-10000:1:4
-100000:1:5
-1000000:1:6
-10000000:1:7
-100000000:1:8
-1000000000:1:9
-10000000000:1:10
-100000000000:1:11
-1000000000000:1:12
-
-12:12:0
-120:12:1
-1200:12:2
-12000:12:3
-120000:12:4
-1200000:12:5
-12000000:12:6
-120000000:12:7
-1200000000:12:8
-12000000000:12:9
-120000000000:12:10
-1200000000000:12:11
-
-123:123:0
-1230:123:1
-12300:123:2
-123000:123:3
-1230000:123:4
-12300000:123:5
-123000000:123:6
-1230000000:123:7
-12300000000:123:8
-123000000000:123:9
-1230000000000:123:10
-
-1234:1234:0
-12340:1234:1
-123400:1234:2
-1234000:1234:3
-12340000:1234:4
-123400000:1234:5
-1234000000:1234:6
-12340000000:1234:7
-123400000000:1234:8
-1234000000000:1234:9
-
-3141592:3141592:0
-
-# negativ: numbers
-
--1:-1:0
--10:-1:1
--100:-1:2
--1000:-1:3
--10000:-1:4
--100000:-1:5
--1000000:-1:6
--10000000:-1:7
--100000000:-1:8
--1000000000:-1:9
--10000000000:-1:10
--100000000000:-1:11
--1000000000000:-1:12
-
--12:-12:0
--120:-12:1
--1200:-12:2
--12000:-12:3
--120000:-12:4
--1200000:-12:5
--12000000:-12:6
--120000000:-12:7
--1200000000:-12:8
--12000000000:-12:9
--120000000000:-12:10
--1200000000000:-12:11
-
--123:-123:0
--1230:-123:1
--12300:-123:2
--123000:-123:3
--1230000:-123:4
--12300000:-123:5
--123000000:-123:6
--1230000000:-123:7
--12300000000:-123:8
--123000000000:-123:9
--1230000000000:-123:10
-
--1234:-1234:0
--12340:-1234:1
--123400:-1234:2
--1234000:-1234:3
--12340000:-1234:4
--123400000:-1234:5
--1234000000:-1234:6
--12340000000:-1234:7
--123400000000:-1234:8
--1234000000000:-1234:9
-
--3141592:-3141592:0
index cf2788e..242b947 100755 (executable)
@@ -25,7 +25,7 @@ is($ms->{_custom}, 1, '$ms has custom attribute \$ms->{_custom}');
 # Check that subclass is a Math::BigFloat, but not a Math::Bigint
 isa_ok($ms, 'Math::BigFloat');
 ok(!$ms->isa('Math::BigInt'),
-   "An object of class '" . ref($ms) . "' isn't a 'Math::BigFloat'");
+   "An object of class '" . ref($ms) . "' isn't a 'Math::BigInt'");
 
 use Math::BigFloat;
 
index d4553e8..10fffd1 100755 (executable)
@@ -3,7 +3,7 @@
 use strict;
 use warnings;
 
-use Test::More tests => 4280            # tests in require'd file
+use Test::More tests => 4278            # tests in require'd file
                          + 7;           # tests in this file
 
 use lib 't';
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/to_base-mbi.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/to_base-mbi.t
deleted file mode 100644 (file)
index 61f2ae7..0000000
+++ /dev/null
@@ -1,100 +0,0 @@
-# -*- mode: perl; -*-
-
-use strict;
-use warnings;
-
-use Test::More tests => 30;
-
-my $class;
-
-BEGIN { $class = 'Math::BigInt'; }
-BEGIN { use_ok($class); }
-
-while (<DATA>) {
-    s/#.*$//;           # remove comments
-    s/\s+$//;           # remove trailing whitespace
-    next unless length; # skip empty lines
-
-    my @in = split /:/;
-    my $out = pop @in;
-
-    my ($x, $xo, $y);
-    my $test = qq|\$x = $class -> new("$in[0]");|;
-    $test .= qq| \$xo = \$x -> copy();|;
-    $test .= qq| \$y = \$x -> to_base($in[1]|;
-    $test .= qq|, "$in[2]"| if @in == 3;
-    $test .= qq|);|;
-
-    eval $test;
-    #die $@ if $@;       # this should never happen
-    die "\nThe following test died when eval()'ed. This indicates a ",
-      "broken test\n\n    $test\n\nThe error message was\n\n    $@\n"
-      if $@;
-
-    subtest $test, sub {
-        plan tests => 2,
-
-        is($x, $xo, "invocand object was not changed");
-        is($y, $out, 'output arg has the right value');
-    };
-}
-
-__END__
-
-# Base 2
-
-0:2:0
-1:2:1
-2:2:10
-0:2:ab:a
-1:2:ab:b
-2:2:ab:ba
-
-250:2:11111010
-250:2:01:11111010
-
-# Base 8
-
-250:8:372
-250:8:01234567:372
-
-# Base 10 (in the last case, use a truncted collation sequence that does not
-# include unused characters)
-
-250:10:250
-250:10:0123456789:250
-250:10:012345:250
-
-# Base 16
-
-250:16:FA
-250:16:0123456789abcdef:fa
-250:16:0123456789abcdef:fa
-
-# Base 3
-
-250:3:100021
-250:3:012:100021
-
-15:3:-/|:/|-
-
-# Base 4
-
-250:4:3322
-250:4:0123:3322
-
-# Base 5
-
-250:5:2000
-250:5:01234:2000
-250:5:abcde:caaa
-
-# Other bases
-
-250:36:6Y
-
-250:37:6S
-
-16:3:121
-44027:36:XYZ
-125734:62:Why
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/to_base_num-mbi.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/to_base_num-mbi.t
deleted file mode 100644 (file)
index 821aefb..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-# -*- mode: perl; -*-
-
-use strict;
-use warnings;
-
-use Test::More tests => 14;
-
-my $class;
-
-BEGIN { $class = 'Math::BigInt'; }
-BEGIN { use_ok($class); }
-
-# For simplicity, we use the same data in the test programs for to_base_num() and
-# from_base_num().
-
-my @data =
-  (
-   [ 0, 2, [ 0 ] ],
-   [ 1, 2, [ 1 ] ],
-   [ 2, 2, [ 1, 0 ] ],
-   [ 3, 2, [ 1, 1, ] ],
-   [ 4, 2, [ 1, 0, 0 ] ],
-
-   [ 0, 10, [ 0 ] ],
-   [ 1, 10, [ 1 ] ],
-   [ 12, 10, [ 1, 2 ] ],
-   [ 123, 10, [ 1, 2, 3 ] ],
-   [ 1230, 10, [ 1, 2, 3, 0 ] ],
-
-   [ "123456789", 100, [ 1, 23, 45, 67, 89 ] ],
-
-   [ "1234567890" x 3,
-     "987654321",
-     [ "128", "142745769", "763888804", "574845669" ]],
-
-   [ "1234567890" x 5,
-     "987654321" x 3,
-     [ "12499999874843750102814", "447551941015330718793208596" ]],
-  );
-
-for (my $i = 0 ; $i <= $#data ; ++ $i) {
-    my @in = ($data[$i][0], $data[$i][1]);
-    my $out = $data[$i][2];
-
-    my ($x, $xo, $y);
-    my $test = qq|\$x = $class -> new("$in[0]");|;
-    $test .= qq| \$xo = \$x -> copy();|;
-    $test .= qq| \$y = \$x -> to_base_num("$in[1]")|;
-
-    eval $test;
-    die "\nThe following test died when eval()'ed. This indicates a ",
-      "broken test\n\n    $test\n\nThe error message was\n\n    $@\n"
-      if $@;
-
-    subtest $test, sub {
-        plan tests => 4,
-
-        is($x, $xo, "invocand object was not changed");
-        is(ref($y), 'ARRAY', "output arg is an ARRAY ref");
-        ok(! grep(ref() ne $class, @$y), "every array element is a $class");
-        is_deeply($y, $out, 'every array element has the right value');
-    };
-}
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/to_ieee754-mbf.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/to_ieee754-mbf.t
deleted file mode 100644 (file)
index 9dbfa09..0000000
+++ /dev/null
@@ -1,303 +0,0 @@
-# -*- mode: perl; -*-
-
-use strict;
-use warnings;
-
-use Test::More tests => 66;
-
-use Math::BigFloat;
-
-my @k = (16, 32, 64, 128);
-
-sub stringify {
-    my $x = shift;
-    return "$x" unless $x -> is_finite();
-    my $nstr = $x -> bnstr();
-    my $sstr = $x -> bsstr();
-    return length($nstr) < length($sstr) ? $nstr : $sstr;
-}
-
-for my $k (@k) {
-
-    # Parameters specific to this format:
-
-    my $b = 2;
-    my $p = $k == 16 ? 11
-          : $k == 32 ? 24
-          : $k == 64 ? 53
-          : $k - sprintf("%.0f", 4 * log($k)/log(2)) + 13;
-
-    $b = Math::BigFloat -> new($b);
-    $k = Math::BigFloat -> new($k);
-    $p = Math::BigFloat -> new($p);
-    my $w = $k - $p;
-
-    my $emax = 2 ** ($w - 1) - 1;
-    my $emin = 1 - $emax;
-
-    my $format = 'binary' . $k;
-
-    note("\nComputing test data for k = $k ...\n\n");
-
-    my $binv = Math::BigFloat -> new("0.5");
-
-    my $data =
-      [
-
-       {
-        dsc => "smallest positive subnormal number",
-        bin => "0"
-             . ("0" x $w)
-             . ("0" x ($p - 2)) . "1",
-        asc => "$b ** ($emin) * $b ** (" . (1 - $p) . ") "
-             . "= $b ** (" . ($emin + 1 - $p) . ")",
-        mbf => $binv ** ($p - 1 - $emin),
-       },
-
-       {
-        dsc => "largest subnormal number",
-        bin => "0"
-             . ("0" x $w)
-             . ("1" x ($p - 1)),
-        asc => "$b ** ($emin) * (1 - $b ** (" . (1 - $p) . "))",
-        mbf => $binv ** (-$emin) * (1 - $binv ** ($p - 1)),
-       },
-
-       {
-        dsc => "smallest positive normal number",
-        bin => "0"
-             . ("0" x ($w - 1)) . "1"
-             . ("0" x ($p - 1)),
-        asc => "$b ** ($emin)",
-        mbf => $binv ** (-$emin),
-       },
-
-       {
-        dsc => "largest normal number",
-        bin => "0"
-             . ("1" x ($w - 1)) . "0"
-             . "1" x ($p - 1),
-        asc => "$b ** $emax * ($b - $b ** (" . (1 - $p) . "))",
-        mbf => $b ** $emax * ($b - $binv ** ($p - 1)),
-       },
-
-       {
-        dsc => "largest number less than one",
-        bin => "0"
-             . "0" . ("1" x ($w - 2)) . "0"
-             . "1" x ($p - 1),
-        asc => "1 - $b ** (-$p)",
-        mbf => 1 - $binv ** $p,
-       },
-
-       {
-        dsc => "smallest number larger than one",
-        bin => "0"
-             . "0" . ("1" x ($w - 1))
-             . ("0" x ($p - 2)) . "1",
-        asc => "1 + $b ** (" . (1 - $p) . ")",
-        mbf => 1 + $binv ** ($p - 1),
-       },
-
-       {
-        dsc => "second smallest number larger than one",
-        bin => "0"
-             . "0" . ("1" x ($w - 1))
-             . ("0" x ($p - 3)) . "10",
-        asc => "1 + $b ** (" . (2 - $p) . ")",
-        mbf => 1 + $binv ** ($p - 2),
-       },
-
-       {
-        dsc => "one",
-        bin => "0"
-             . "0" . ("1" x ($w - 1))
-             . "0" x ($p - 1),
-        asc => "1",
-        mbf => Math::BigFloat -> new("1"),
-       },
-
-       {
-        dsc => "minus one",
-        bin => "1"
-             . "0" . ("1" x ($w - 1))
-             . "0" x ($p - 1),
-        asc => "-1",
-        mbf => Math::BigFloat -> new("-1"),
-       },
-
-       {
-        dsc => "two",
-        bin => "0"
-             . "1" . ("0" x ($w - 1))
-             . ("0" x ($p - 1)),
-        asc => "2",
-        mbf => Math::BigFloat -> new("2"),
-       },
-
-       {
-        dsc => "minus two",
-        bin => "1"
-             . "1" . ("0" x ($w - 1))
-             . ("0" x ($p - 1)),
-        asc => "-2",
-        mbf => Math::BigFloat -> new("-2"),
-       },
-
-       {
-        dsc => "positive zero",
-        bin => "0"
-             . ("0" x $w)
-             . ("0" x ($p - 1)),
-        asc => "+0",
-        mbf => Math::BigFloat -> new("0"),
-       },
-
-       {
-        dsc => "positive infinity",
-        bin => "0"
-             . ("1" x $w)
-             . ("0" x ($p - 1)),
-        asc => "+inf",
-        mbf => Math::BigFloat -> new("inf"),
-       },
-
-       {
-        dsc => "negative infinity",
-        bin =>  "1"
-             . ("1" x $w)
-             . ("0" x ($p - 1)),
-        asc => "-inf",
-        mbf => Math::BigFloat -> new("-inf"),
-       },
-
-       {
-        dsc => "NaN (encoding used by Perl on Cygwin)",
-        bin => "1"
-             . ("1" x $w)
-             . ("1" . ("0" x ($p - 2))),
-        asc => "NaN",
-        mbf => Math::BigFloat -> new("NaN"),
-       },
-
-      ];
-
-    for my $entry (@$data) {
-        my $bin   = $entry -> {bin};
-        my $bytes = pack "B*", $bin;
-        my $hex   = unpack "H*", $bytes;
-
-        note("\n", $entry -> {dsc}, " (k = $k): ", $entry -> {asc}, "\n\n");
-
-        my $x = $entry -> {mbf};
-
-        my $test = qq|Math::BigFloat -> new("| . stringify($x)
-                 . qq|") -> to_ieee754("$format")|;
-
-        my $got_bytes = $x -> to_ieee754($format);
-        my $got_hex = unpack "H*", $got_bytes;
-        $got_hex =~ s/(..)/\\x$1/g;
-
-        my $expected_hex = $hex;
-        $expected_hex =~ s/(..)/\\x$1/g;
-
-        is($got_hex, $expected_hex);
-    }
-}
-
-# These tests verify fixing CPAN RT #139960.
-
-# binary16
-
-{
-    # largest subnormal number
-    my $lo = Math::BigFloat -> from_ieee754("03ff", "binary16");
-
-    # smallest normal number
-    my $hi = Math::BigFloat -> from_ieee754("0400", "binary16");
-
-    # compute an average weighted towards the larger of the two
-    my $x = 0.25 * $lo + 0.75 * $hi;
-
-    my $got = unpack "H*", $x -> to_ieee754("binary16");
-    is($got, "0400",
-       "6.102025508880615234375e-5 -> 0x0400");
-}
-
-{
-    # largest number smaller than one
-    my $lo = Math::BigFloat -> from_ieee754("3bff", "binary16");
-
-    # one
-    my $hi = Math::BigFloat -> from_ieee754("3c00", "binary16");
-
-    # compute an average weighted towards the larger of the two
-    my $x = 0.25 * $lo + 0.75 * $hi;
-
-    my $got = unpack "H*", $x -> to_ieee754("binary16");
-    is($got, "3c00", "9.998779296875e-1 -> 0x3c00");
-}
-
-# binary32
-
-{
-    # largest subnormal number
-    my $lo = Math::BigFloat -> from_ieee754("007fffff", "binary32");
-
-    # smallest normal number
-    my $hi = Math::BigFloat -> from_ieee754("00800000", "binary32");
-
-    # compute an average weighted towards the larger of the two
-    my $x = 0.25 * $lo + 0.75 * $hi;
-
-    my $got = unpack "H*", $x -> to_ieee754("binary32");
-    is($got, "00800000",
-       "1.1754943157898258998483097641290060955707622747...e-38 -> 0x00800000");
-}
-
-{
-    # largest number smaller than one
-    my $lo = Math::BigFloat -> from_ieee754("3f7fffff", "binary32");
-
-    # one
-    my $hi = Math::BigFloat -> from_ieee754("3f800000", "binary32");
-
-    # compute an average weighted towards the larger of the two
-    my $x = 0.25 * $lo + 0.75 * $hi;
-
-    my $got = unpack "H*", $x -> to_ieee754("binary32");
-    is($got, "3f800000",
-       "9.9999998509883880615234375e-1 -> 0x3f800000");
-}
-
-# binary64
-
-{
-    # largest subnormal number
-    my $lo = Math::BigFloat -> from_ieee754("000fffffffffffff", "binary64");
-
-    # smallest normal number
-    my $hi = Math::BigFloat -> from_ieee754("0010000000000000", "binary64");
-
-    # compute an average weighted towards the larger of the two
-    my $x = 0.25 * $lo + 0.75 * $hi;
-
-    my $got = unpack "H*", $x -> to_ieee754("binary64");
-    is($got, "0010000000000000",
-       "2.2250738585072012595738212570207680200...e-308 -> 0x0010000000000000");
-}
-
-{
-    # largest number smaller than one
-    my $lo = Math::BigFloat -> from_ieee754("3fefffffffffffff", "binary64");
-
-    # one
-    my $hi = Math::BigFloat -> from_ieee754("3ff0000000000000", "binary64");
-
-    # compute an average weighted towards the larger of the two
-    my $x = 0.25 * $lo + 0.75 * $hi;
-
-    my $got = unpack "H*", $x -> to_ieee754("binary64");
-    is($got, "3ff0000000000000",
-       "9.999999999999999722444243843710864894092...e-1 -> 0x3ff0000000000000");
-}
index 3cef711..d8bd119 100644 (file)
@@ -25,7 +25,7 @@ our ($CLASS, $LIB, $EXPECTED_CLASS);
 package Math::Foo;
 
 use Math::BigInt lib => $main::LIB;
-our @ISA = (qw/Math::BigInt/);
+our @ISA = ('Math::BigInt');
 
 use overload
   # customized overload for sub, since original does not use swap there
@@ -573,7 +573,7 @@ boneNaN:+:1
 &binf
 1:+:inf
 2:-:-inf
-3:abc:inf
+3:+inf:inf
 
 &is_nan
 123:0
@@ -620,14 +620,14 @@ abc:abc:NaN
 -1234:0:10:-1234
 +1234:0:10:1234
 +200:2:10:2
-+1234:3:10:1
-+1234:2:10:12
++1234:3:10:1.234
++1234:2:10:12.34
 +1234:-3:10:NaN
 310000:4:10:31
 12300000:5:10:123
 1230000000000:10:10:123
-09876123456789067890:12:10:9876123
-1234561234567890123:13:10:123456
+09876123456789067890:12:10:9876123.45678906789
+1234561234567890123:13:10:123456.1234567890123
 
 &bsstr
 1e+34:1e+34
index 94f7e8a..132c9c5 100755 (executable)
@@ -33,8 +33,8 @@ $EXPECTED_CLASS = "Math::BigFloat";
 $LIB            = "Math::BigInt::Calc";         # backend
 
 is(Math::BigInt->upgrade(), "Math::BigFloat",
-   qq/Math::BigInt->upgrade()/);
-is(Math::BigInt->downgrade() || "", "",
-   qq/Math::BigInt->downgrade() || ""/);
+   "Math::BigInt->upgrade()");
+is(Math::BigInt->downgrade(), undef,
+   "Math::BigInt->downgrade()");
 
 require './t/upgrade.inc';      # all tests here for sharing
index 8b8c036..28ecdbb 100644 (file)
@@ -12,6 +12,7 @@ use Math::BigFloat upgrade => 'Math::BigMouse';
 
 no warnings 'once';
 @Math::BigMouse::ISA = 'Math::BigFloat';
+sub Math::BigMouse::bsqrt {};
 
 () = sqrt Math::BigInt->new(2);
 pass('sqrt on a big int does not segv if there are 2 upgrade levels');
index 391e6d0..0d0f246 100644 (file)
@@ -21,7 +21,7 @@ use Scalar::Util qw< blessed >;
 
 use Math::BigFloat ();
 
-our $VERSION = '0.2621';
+our $VERSION = '0.2624';
 
 our @ISA = qw(Math::BigFloat);
 
@@ -200,12 +200,6 @@ use overload
 BEGIN {
     *objectify = \&Math::BigInt::objectify;  # inherit this from BigInt
     *AUTOLOAD  = \&Math::BigFloat::AUTOLOAD; # can't inherit AUTOLOAD
-    # We inherit these from BigFloat because currently it is not possible that
-    # Math::BigFloat has a different $LIB variable than we, because
-    # Math::BigFloat also uses Math::BigInt::config->('lib') (there is always
-    # only one library loaded)
-    *_e_add = \&Math::BigFloat::_e_add;
-    *_e_sub = \&Math::BigFloat::_e_sub;
     *as_number = \&as_int;
     *is_pos = \&is_positive;
     *is_neg = \&is_negative;
@@ -307,7 +301,8 @@ sub new {
     unless (defined $d) {
         #return $n -> copy($n)               if $n -> isa('Math::BigRat');
         if ($n -> isa('Math::BigRat')) {
-            return $downgrade -> new($n) if defined($downgrade) && $n -> is_int();
+            return $downgrade -> new($n)
+              if defined($downgrade) && $n -> is_int();
             return $class -> copy($n);
         }
 
@@ -320,7 +315,8 @@ sub new {
         }
 
         if ($n -> isa('Math::BigInt')) {
-            $self -> {_n}   = $LIB -> _new($n -> copy() -> babs() -> bstr());
+            $self -> {_n}   = $LIB -> _new($n -> copy() -> babs(undef, undef)
+                                              -> bstr());
             $self -> {_d}   = $LIB -> _one();
             $self -> {sign} = $n -> sign();
             return $downgrade -> new($n) if defined $downgrade;
@@ -328,8 +324,8 @@ sub new {
         }
 
         if ($n -> isa('Math::BigFloat')) {
-            my $m = $n -> mantissa() -> babs();
-            my $e = $n -> exponent();
+            my $m = $n -> mantissa(undef, undef) -> babs(undef, undef);
+            my $e = $n -> exponent(undef, undef);
             $self -> {_n} = $LIB -> _new($m -> bstr());
             $self -> {_d} = $LIB -> _one();
 
@@ -340,7 +336,8 @@ sub new {
                 $self -> {_d} = $LIB -> _lsft($self -> {_d},
                                               $LIB -> _new(-$e -> bstr()), 10);
 
-                my $gcd = $LIB -> _gcd($LIB -> _copy($self -> {_n}), $self -> {_d});
+                my $gcd = $LIB -> _gcd($LIB -> _copy($self -> {_n}),
+                                       $self -> {_d});
                 if (!$LIB -> _is_one($gcd)) {
                     $self -> {_n} = $LIB -> _div($self->{_n}, $gcd);
                     $self -> {_d} = $LIB -> _div($self->{_d}, $gcd);
@@ -348,7 +345,8 @@ sub new {
             }
 
             $self -> {sign} = $n -> sign();
-            return $downgrade -> new($n) if defined($downgrade) && $n -> is_int();
+            return $downgrade -> new($n, undef, undef)
+              if defined($downgrade) && $n -> is_int();
             return $self;
         }
 
@@ -677,36 +675,86 @@ sub config {
     $cfg;
 }
 
-##############################################################################
+###############################################################################
+# String conversion methods
+###############################################################################
 
 sub bstr {
-    my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_);
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), $_[0]) : objectify(1, @_);
+
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
+
+    # Inf and NaN
 
-    if ($x->{sign} !~ /^[+-]$/) {               # inf, NaN etc
-        my $s = $x->{sign};
-        $s =~ s/^\+//;                          # +inf => inf
-        return $s;
+    if ($x->{sign} ne '+' && $x->{sign} ne '-') {
+        return $x->{sign} unless $x->{sign} eq '+inf'; # -inf, NaN
+        return 'inf';                                  # +inf
     }
 
+    # Upgrade?
+
+    return $upgrade -> bstr($x, @r)
+      if defined($upgrade) && !$x -> isa($class);
+
+    # Finite number
+
     my $s = '';
     $s = $x->{sign} if $x->{sign} ne '+';       # '+3/2' => '3/2'
 
-    return $s . $LIB->_str($x->{_n}) if $LIB->_is_one($x->{_d});
-    $s . $LIB->_str($x->{_n}) . '/' . $LIB->_str($x->{_d});
+    my $str = $x->{sign} eq '-' ? '-' : '';
+    $str .= $LIB->_str($x->{_n});
+    $str .= '/' . $LIB->_str($x->{_d}) unless $LIB -> _is_one($x->{_d});
+    return $str;
 }
 
 sub bsstr {
-    my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_);
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), $_[0]) : objectify(1, @_);
 
-    if ($x->{sign} !~ /^[+-]$/) {               # inf, NaN etc
-        my $s = $x->{sign};
-        $s =~ s/^\+//;                          # +inf => inf
-        return $s;
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
+
+    # Inf and NaN
+
+    if ($x->{sign} ne '+' && $x->{sign} ne '-') {
+        return $x->{sign} unless $x->{sign} eq '+inf';  # -inf, NaN
+        return 'inf';                                   # +inf
     }
 
-    my $s = '';
-    $s = $x->{sign} if $x->{sign} ne '+';       # +3 vs 3
-    $s . $LIB->_str($x->{_n}) . '/' . $LIB->_str($x->{_d});
+    # Upgrade?
+
+    return $upgrade -> bsstr($x, @r)
+      if defined($upgrade) && !$x -> isa($class);
+
+    # Finite number
+
+    my $str = $x->{sign} eq '-' ? '-' : '';
+    $str .= $LIB->_str($x->{_n});
+    $str .= '/' . $LIB->_str($x->{_d}) unless $LIB -> _is_one($x->{_d});
+    return $str;
+}
+
+sub bfstr {
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), $_[0]) : objectify(1, @_);
+
+    carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
+
+    # Inf and NaN
+
+    if ($x->{sign} ne '+' && $x->{sign} ne '-') {
+        return $x->{sign} unless $x->{sign} eq '+inf';  # -inf, NaN
+        return 'inf';                                   # +inf
+    }
+
+    # Upgrade?
+
+    return $upgrade -> bfstr($x, @r)
+      if defined($upgrade) && !$x -> isa($class);
+
+    # Finite number
+
+    my $str = $x->{sign} eq '-' ? '-' : '';
+    $str .= $LIB->_str($x->{_n});
+    $str .= '/' . $LIB->_str($x->{_d}) unless $LIB -> _is_one($x->{_d});
+    return $str;
 }
 
 sub bnorm {
@@ -737,7 +785,7 @@ sub bnorm {
 
     # n/1
     if ($LIB->_is_one($x->{_d})) {
-        return $downgrade -> new($LIB -> _str($x->{_d})) if defined($downgrade);
+        return $downgrade -> new($x) if defined($downgrade);
         return $x;               # no need to reduce
     }
 
@@ -765,60 +813,11 @@ sub bneg {
     $x->{sign} =~ tr/+-/-+/
       unless ($x->{sign} eq '+' && $LIB->_is_zero($x->{_n}));
 
-    return $downgrade -> new($LIB -> _str($x->{_n}))
+    return $downgrade -> new($x)
       if defined($downgrade) && $LIB -> _is_one($x->{_d});
     $x;
 }
 
-##############################################################################
-# special values
-
-sub _bnan {
-    # used by parent class bnan() to initialize number to NaN
-    my $self = shift;
-
-    if ($_trap_nan) {
-        my $class = ref($self);
-        # "$self" below will stringify the object, this blows up if $self is a
-        # partial object (happens under trap_nan), so fix it beforehand
-        $self->{_d} = $LIB->_zero() unless defined $self->{_d};
-        $self->{_n} = $LIB->_zero() unless defined $self->{_n};
-        croak ("Tried to set $self to NaN in $class\::_bnan()");
-    }
-    $self->{_n} = $LIB->_zero();
-    $self->{_d} = $LIB->_zero();
-}
-
-sub _binf {
-    # used by parent class bone() to initialize number to +inf/-inf
-    my $self = shift;
-
-    if ($_trap_inf) {
-        my $class = ref($self);
-        # "$self" below will stringify the object, this blows up if $self is a
-        # partial object (happens under trap_nan), so fix it beforehand
-        $self->{_d} = $LIB->_zero() unless defined $self->{_d};
-        $self->{_n} = $LIB->_zero() unless defined $self->{_n};
-        croak ("Tried to set $self to inf in $class\::_binf()");
-    }
-    $self->{_n} = $LIB->_zero();
-    $self->{_d} = $LIB->_zero();
-}
-
-sub _bone {
-    # used by parent class bone() to initialize number to +1/-1
-    my $self = shift;
-    $self->{_n} = $LIB->_one();
-    $self->{_d} = $LIB->_one();
-}
-
-sub _bzero {
-    # used by parent class bzero() to initialize number to 0
-    my $self = shift;
-    $self->{_n} = $LIB->_zero();
-    $self->{_d} = $LIB->_one();
-}
-
 ##############################################################################
 # mul/add/div etc
 
@@ -866,7 +865,7 @@ sub badd {
     my $m = $LIB->_mul($LIB->_copy($y->{_n}), $x->{_d});
 
     # 5 * 3 + 7 * 4
-    ($x->{_n}, $x->{sign}) = _e_add($x->{_n}, $m, $x->{sign}, $y->{sign});
+    ($x->{_n}, $x->{sign}) = $LIB -> _sadd($x->{_n}, $x->{sign}, $m, $y->{sign});
 
     # 4 * 3
     $x->{_d} = $LIB->_mul($x->{_d}, $y->{_d});
@@ -887,10 +886,10 @@ sub bsub {
 
     # flip sign of $x, call badd(), then flip sign of result
     $x->{sign} =~ tr/+-/-+/
-      unless $x->{sign} eq '+' && $LIB->_is_zero($x->{_n}); # not -0
-    $x->badd($y, @r);           # does norm and round
+      unless $x->{sign} eq '+' && $x -> is_zero();      # not -0
+    $x = $x->badd($y, @r);           # does norm and round
     $x->{sign} =~ tr/+-/-+/
-      unless $x->{sign} eq '+' && $LIB->_is_zero($x->{_n}); # not -0
+      unless $x->{sign} eq '+' && $x -> is_zero();      # not -0
 
     $x->bnorm();
 }
@@ -919,10 +918,13 @@ sub bmul {
     }
 
     # x == 0  # also: or y == 1 or y == -1
-    return wantarray ? ($x, $class->bzero()) : $x if $x -> is_zero();
+    if ($x -> is_zero()) {
+        $x = $downgrade -> bzero($x) if defined $downgrade;
+        return wantarray ? ($x, $class->bzero()) : $x;
+    }
 
     if ($y -> is_zero()) {
-        $x -> bzero();
+        $x = defined($downgrade) ? $downgrade -> bzero($x) : $x -> bzero();
         return wantarray ? ($x, $class->bzero()) : $x;
     }
 
@@ -971,11 +973,11 @@ sub bdiv {
     if ($x -> is_nan() || $y -> is_nan()) {
         if ($wantarray) {
             return $downgrade -> bnan(), $downgrade -> bnan()
-              if defined($downgrade) && $LIB -> _is_one($x->{_d});
+              if defined($downgrade);
             return $x -> bnan(), $class -> bnan();
         } else {
             return $downgrade -> bnan()
-              if defined($downgrade) && $LIB -> _is_one($x->{_d});
+              if defined($downgrade);
             return $x -> bnan();
         }
     }
@@ -1387,6 +1389,7 @@ sub bceil {
     $x->{_d} = $LIB->_one();                    # d => 1
     $x->{_n} = $LIB->_inc($x->{_n}) if $x->{sign} eq '+';   # +22/7 => 4/1
     $x->{sign} = '+' if $x->{sign} eq '-' && $LIB->_is_zero($x->{_n}); # -0 => 0
+    return $downgrade -> new($x) if defined $downgrade;
     $x;
 }
 
@@ -1403,6 +1406,7 @@ sub bfloor {
     $x->{_n} = $LIB->_div($x->{_n}, $x->{_d});  # 22/7 => 3/1 w/ truncate
     $x->{_d} = $LIB->_one();                    # d => 1
     $x->{_n} = $LIB->_inc($x->{_n}) if $x->{sign} eq '-';   # -22/7 => -4/1
+    return $downgrade -> new($x) if defined $downgrade;
     $x;
 }
 
@@ -1419,6 +1423,7 @@ sub bint {
     $x->{_n} = $LIB->_div($x->{_n}, $x->{_d});  # 22/7 => 3/1 w/ truncate
     $x->{_d} = $LIB->_one();                    # d => 1
     $x->{sign} = '+' if $x->{sign} eq '-' && $LIB -> _is_zero($x->{_n});
+    return $downgrade -> new($x) if defined $downgrade;
     return $x;
 }
 
@@ -1587,18 +1592,30 @@ sub blog {
         }
     }
 
+    # disable upgrading and downgrading
+
+    require Math::BigFloat;
+    my $upg = Math::BigFloat -> upgrade();
+    my $dng = Math::BigFloat -> downgrade();
+    Math::BigFloat -> upgrade(undef);
+    Math::BigFloat -> downgrade(undef);
+
     # At this point we are done handling all exception cases and trivial cases.
 
     $base = Math::BigFloat -> new($base) if defined $base;
+    my $xnum = Math::BigFloat -> new($LIB -> _str($x->{_n}));
+    my $xden = Math::BigFloat -> new($LIB -> _str($x->{_d}));
+    my $xstr = $xnum -> bdiv($xden) -> blog($base, @r) -> bsstr();
 
-    my $xn = Math::BigFloat -> new($LIB -> _str($x->{_n}));
-    my $xd = Math::BigFloat -> new($LIB -> _str($x->{_d}));
+    # reset upgrading and downgrading
 
-    my $xtmp = Math::BigRat -> new($xn -> bdiv($xd) -> blog($base, @r) -> bsstr());
+    Math::BigFloat -> upgrade($upg);
+    Math::BigFloat -> downgrade($dng);
 
-    $x -> {sign} = $xtmp -> {sign};
-    $x -> {_n}   = $xtmp -> {_n};
-    $x -> {_d}   = $xtmp -> {_d};
+    my $xobj = Math::BigRat -> new($xstr);
+    $x -> {sign} = $xobj -> {sign};
+    $x -> {_n}   = $xobj -> {_n};
+    $x -> {_d}   = $xobj -> {_d};
 
     return $neg ? $x -> bneg() : $x;
 }
@@ -1976,19 +1993,22 @@ sub bnot {
 
 sub round {
     my $x = shift;
-    $x = $downgrade -> new($x) if defined($downgrade) && $x -> is_int();
+    return $downgrade -> new($x) if defined($downgrade) &&
+      ($x -> is_int() || $x -> is_inf() || $x -> is_nan());
     $x;
 }
 
 sub bround {
     my $x = shift;
-    $x = $downgrade -> new($x) if defined($downgrade) && $x -> is_int();
+    return $downgrade -> new($x) if defined($downgrade) &&
+      ($x -> is_int() || $x -> is_inf() || $x -> is_nan());
     $x;
 }
 
 sub bfround {
     my $x = shift;
-    $x = $downgrade -> new($x) if defined($downgrade) && $x -> is_int();
+    return $downgrade -> new($x) if defined($downgrade) &&
+      ($x -> is_int() || $x -> is_inf() || $x -> is_nan());
     $x;
 }
 
@@ -2171,37 +2191,70 @@ sub numify {
 }
 
 sub as_int {
-    my ($self, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_);
+    my ($class, $x) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+    return $x -> copy() if $x -> isa("Math::BigInt");
 
-    # NaN, inf etc
-    return Math::BigInt->new($x->{sign}) if $x->{sign} !~ /^[+-]$/;
+    # disable upgrading and downgrading
 
-    my $u = Math::BigInt->bzero();
-    $u->{value} = $LIB->_div($LIB->_copy($x->{_n}), $x->{_d}); # 22/7 => 3
-    $u->bneg if $x->{sign} eq '-'; # no negative zero
-    $u;
+    require Math::BigInt;
+    my $upg = Math::BigInt -> upgrade();
+    my $dng = Math::BigInt -> downgrade();
+    Math::BigInt -> upgrade(undef);
+    Math::BigInt -> downgrade(undef);
+
+    my $y;
+    if ($x -> is_inf()) {
+        $y = Math::BigInt -> binf($x->sign());
+    } elsif ($x -> is_nan()) {
+        $y = Math::BigInt -> bnan();
+    } else {
+        my $int = $LIB -> _div($LIB -> _copy($x->{_n}), $x->{_d});  # 22/7 => 3
+        $y = Math::BigInt -> new($LIB -> _str($int));
+        $y = $y -> bneg() if $x -> is_neg();
+    }
+
+    # reset upgrading and downgrading
+
+    Math::BigInt -> upgrade($upg);
+    Math::BigInt -> downgrade($dng);
+
+    return $y;
 }
 
 sub as_float {
-    # return N/D as Math::BigFloat
+    my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
 
-    # set up parameters
-    my ($class, $x, @r) = (ref($_[0]), @_);
-    # objectify is costly, so avoid it
-    ($class, $x, @r) = objectify(1, @_) unless ref $_[0];
+    return $x -> copy() if $x -> isa("Math::BigFloat");
 
-    # NaN, inf etc
-    return Math::BigFloat->new($x->{sign}) if $x->{sign} !~ /^[+-]$/;
+    # disable upgrading and downgrading
 
-    my $xflt = Math::BigFloat -> new($LIB -> _str($x->{_n}));
-    $xflt -> {sign} = $x -> {sign};
+    require Math::BigFloat;
+    my $upg = Math::BigFloat -> upgrade();
+    my $dng = Math::BigFloat -> downgrade();
+    Math::BigFloat -> upgrade(undef);
+    Math::BigFloat -> downgrade(undef);
 
-    unless ($LIB -> _is_one($x->{_d})) {
-        my $xd = Math::BigFloat -> new($LIB -> _str($x->{_d}));
-        $xflt -> bdiv($xd, @r);
+    my $y;
+    if ($x -> is_inf()) {
+        $y = Math::BigFloat -> binf($x->sign());
+    } elsif ($x -> is_nan()) {
+        $y = Math::BigFloat -> bnan();
+    } else {
+        $y = Math::BigFloat -> new($LIB -> _str($x->{_n}));
+        $y -> {sign} = $x -> {sign};
+        unless ($LIB -> _is_one($x->{_d})) {
+            my $xd = Math::BigFloat -> new($LIB -> _str($x->{_d}));
+            $y -> bdiv($xd, @r);
+        }
     }
 
-    return $xflt;
+    # reset upgrading and downgrading
+
+    Math::BigFloat -> upgrade($upg);
+    Math::BigFloat -> downgrade($dng);
+
+    return $y;
 }
 
 sub as_bin {
index 41fcd2d..bd49ea1 100755 (executable)
@@ -19,90 +19,92 @@ my $mbf = 'Math::BigFloat';
 my ($x, $y, $z);
 
 $x = Math::BigRat->new(1234);
-is($x, 1234);
+is($x, 1234, 'value of $x');
 isa_ok($x, 'Math::BigRat');
-is($x->isa('Math::BigFloat'), 0);
-is($x->isa('Math::BigInt'), 0);
+ok(!$x->isa('Math::BigInt'),
+   "An object of class '" . ref($x) . "' isn't a 'Math::BigInt'");
+ok(!$x->isa('Math::BigFloat'),
+   "An object of class '" . ref($x) . "' isn't a 'Math::BigFloat'");
 
 ##############################################################################
 # new and bnorm()
 
-foreach my $func (qw/ new bnorm /) {
-    $x = $mbr->$func(1234);
-    is($x, 1234, qq|\$x = $mbr->$func(1234)|);
+foreach my $method (qw/ new bnorm /) {
+    $x = $mbr->$method(1234);
+    is($x, 1234, qq|\$x = $mbr->$method(1234)|);
 
-    $x = $mbr->$func("1234/1");
-    is($x, 1234, qq|\$x = $mbr->$func("1234/1")|);
+    $x = $mbr->$method("1234/1");
+    is($x, 1234, qq|\$x = $mbr->$method("1234/1")|);
 
-    $x = $mbr->$func("1234/2");
-    is($x, 617, qq|\$x = $mbr->$func("1234/2")|);
+    $x = $mbr->$method("1234/2");
+    is($x, 617, qq|\$x = $mbr->$method("1234/2")|);
 
-    $x = $mbr->$func("100/1.0");
-    is($x, 100, qq|\$x = $mbr->$func("100/1.0")|);
+    $x = $mbr->$method("100/1.0");
+    is($x, 100, qq|\$x = $mbr->$method("100/1.0")|);
 
-    $x = $mbr->$func("10.0/1.0");
-    is($x, 10, qq|\$x = $mbr->$func("10.0/1.0")|);
+    $x = $mbr->$method("10.0/1.0");
+    is($x, 10, qq|\$x = $mbr->$method("10.0/1.0")|);
 
-    $x = $mbr->$func("0.1/10");
-    is($x, "1/100", qq|\$x = $mbr->$func("0.1/10")|);
+    $x = $mbr->$method("0.1/10");
+    is($x, "1/100", qq|\$x = $mbr->$method("0.1/10")|);
 
-    $x = $mbr->$func("0.1/0.1");
-    is($x, "1", qq|\$x = $mbr->$func("0.1/0.1")|);
+    $x = $mbr->$method("0.1/0.1");
+    is($x, "1", qq|\$x = $mbr->$method("0.1/0.1")|);
 
-    $x = $mbr->$func("1e2/10");
-    is($x, 10, qq|\$x = $mbr->$func("1e2/10")|);
+    $x = $mbr->$method("1e2/10");
+    is($x, 10, qq|\$x = $mbr->$method("1e2/10")|);
 
-    $x = $mbr->$func("5/1e2");
-    is($x, "1/20", qq|\$x = $mbr->$func("5/1e2")|);
+    $x = $mbr->$method("5/1e2");
+    is($x, "1/20", qq|\$x = $mbr->$method("5/1e2")|);
 
-    $x = $mbr->$func("1e2/1e1");
-    is($x, 10, qq|\$x = $mbr->$func("1e2/1e1")|);
+    $x = $mbr->$method("1e2/1e1");
+    is($x, 10, qq|\$x = $mbr->$method("1e2/1e1")|);
 
-    $x = $mbr->$func("1 / 3");
-    is($x, "1/3", qq|\$x = $mbr->$func("1 / 3")|);
+    $x = $mbr->$method("1 / 3");
+    is($x, "1/3", qq|\$x = $mbr->$method("1 / 3")|);
 
-    $x = $mbr->$func("-1 / 3");
-    is($x, "-1/3", qq|\$x = $mbr->$func("-1 / 3")|);
+    $x = $mbr->$method("-1 / 3");
+    is($x, "-1/3", qq|\$x = $mbr->$method("-1 / 3")|);
 
-    $x = $mbr->$func("NaN");
-    is($x, "NaN", qq|\$x = $mbr->$func("NaN")|);
+    $x = $mbr->$method("NaN");
+    is($x, "NaN", qq|\$x = $mbr->$method("NaN")|);
 
-    $x = $mbr->$func("inf");
-    is($x, "inf", qq|\$x = $mbr->$func("inf")|);
+    $x = $mbr->$method("inf");
+    is($x, "inf", qq|\$x = $mbr->$method("inf")|);
 
-    $x = $mbr->$func("-inf");
-    is($x, "-inf", qq|\$x = $mbr->$func("-inf")|);
+    $x = $mbr->$method("-inf");
+    is($x, "-inf", qq|\$x = $mbr->$method("-inf")|);
 
-    $x = $mbr->$func("1/");
-    is($x, "NaN", qq|\$x = $mbr->$func("1/")|);
+    $x = $mbr->$method("1/");
+    is($x, "NaN", qq|\$x = $mbr->$method("1/")|);
 
-    $x = $mbr->$func("0x7e");
-    is($x, 126, qq|\$x = $mbr->$func("0x7e")|);
+    $x = $mbr->$method("0x7e");
+    is($x, 126, qq|\$x = $mbr->$method("0x7e")|);
 
     # input ala "1+1/3" isn"t parsed ok yet
-    $x = $mbr->$func("1+1/3");
-    is($x, "NaN", qq|\$x = $mbr->$func("1+1/3")|);
+    $x = $mbr->$method("1+1/3");
+    is($x, "NaN", qq|\$x = $mbr->$method("1+1/3")|);
 
-    $x = $mbr->$func("1/1.2");
-    is($x, "5/6", qq|\$x = $mbr->$func("1/1.2")|);
+    $x = $mbr->$method("1/1.2");
+    is($x, "5/6", qq|\$x = $mbr->$method("1/1.2")|);
 
-    $x = $mbr->$func("1.3/1.2");
-    is($x, "13/12", qq|\$x = $mbr->$func("1.3/1.2")|);
+    $x = $mbr->$method("1.3/1.2");
+    is($x, "13/12", qq|\$x = $mbr->$method("1.3/1.2")|);
 
-    $x = $mbr->$func("1.2/1");
-    is($x, "6/5", qq|\$x = $mbr->$func("1.2/1")|);
+    $x = $mbr->$method("1.2/1");
+    is($x, "6/5", qq|\$x = $mbr->$method("1.2/1")|);
 
     ############################################################################
     # other classes as input
 
-    $x = $mbr->$func($mbi->new(1231));
-    is($x, "1231", qq|\$x = $mbr->$func($mbi->new(1231))|);
+    $x = $mbr->$method($mbi->new(1231));
+    is($x, "1231", qq|\$x = $mbr->$method($mbi->new(1231))|);
 
-    $x = $mbr->$func($mbf->new(1232));
-    is($x, "1232", qq|\$x = $mbr->$func($mbf->new(1232))|);
+    $x = $mbr->$method($mbf->new(1232));
+    is($x, "1232", qq|\$x = $mbr->$method($mbf->new(1232))|);
 
-    $x = $mbr->$func($mbf->new(1232.3));
-    is($x, "12323/10", qq|\$x = $mbr->$func($mbf->new(1232.3))|);
+    $x = $mbr->$method($mbf->new(1232.3));
+    is($x, "12323/10", qq|\$x = $mbr->$method($mbf->new(1232.3))|);
 }
 
 my $n = 'numerator';
@@ -322,14 +324,19 @@ is($x, 'NaN');
 ##############################################################################
 # binc/bdec
 
+note("binc()");
 $x = $mbr->new('3/2');
 is($x->binc(), '5/2');
+
+note("bdec()");
+
 $x = $mbr->new('15/6');
 is($x->bdec(), '3/2');
 
 ##############################################################################
-# bfloor/bceil
+# bfloor
 
+note("bfloor()");
 $x = $mbr->new('-7/7');
 is($x->$n(), '-1');
 is($x->$d(), '1');
@@ -426,6 +433,8 @@ subtest qq|$mbr -> new("NaN") -> numify()| => sub {
 ##############################################################################
 # as_hex(), as_bin(), as_oct()
 
+note("as_hex(), as_bin(), as_oct()");
+
 $x = $mbr->new('8/8');
 is($x->as_hex(), '0x1');
 is($x->as_bin(), '0b1');
@@ -439,32 +448,36 @@ is($x->as_oct(), '012');
 ##############################################################################
 # broot(), blog(), bmodpow() and bmodinv()
 
+note("broot(), blog(), bmodpow(), bmodinv()");
+
 $x = $mbr->new(2) ** 32;
 $y = $mbr->new(4);
 $z = $mbr->new(3);
 
 is($x->copy()->broot($y), 2 ** 8);
-is(ref($x->copy()->broot($y)), $mbr);
+is(ref($x->copy()->broot($y)), $mbr, "\$x is a $mbr");
 
 is($x->copy()->bmodpow($y, $z), 1);
-is(ref($x->copy()->bmodpow($y, $z)), $mbr);
+is(ref($x->copy()->bmodpow($y, $z)), $mbr, "\$x is a $mbr");
 
 $x = $mbr->new(8);
 $y = $mbr->new(5033);
 $z = $mbr->new(4404);
 
 is($x->copy()->bmodinv($y), $z);
-is(ref($x->copy()->bmodinv($y)), $mbr);
+is(ref($x->copy()->bmodinv($y)), $mbr, "\$x is a $mbr");
 
 # square root with exact result
 $x = $mbr->new('1.44');
 is($x->copy()->broot(2), '6/5');
-is(ref($x->copy()->broot(2)), $mbr);
+is(ref($x->copy()->broot(2)), $mbr, "\$x is a $mbr");
 
 # log with exact result
 $x = $mbr->new('256.1');
-is($x->copy()->blog(2), '8000563442710106079310294693803606983661/1000000000000000000000000000000000000000');
-is(ref($x->copy()->blog(2)), $mbr);
+is($x->copy()->blog(2),
+   '8000563442710106079310294693803606983661/1000000000000000000000000000000000000000',
+   "\$x = $mbr->new('256.1')->blog(2)");
+is(ref($x->copy()->blog(2)), $mbr, "\$x is a $mbr");
 
 $x = $mbr->new(144);
 is($x->copy()->broot('2'), 12, 'v/144 = 12');
@@ -475,6 +488,8 @@ is($x->copy()->broot('3'), 12, '(12*12*12) ** 1/3 = 12');
 ##############################################################################
 # from_hex(), from_bin(), from_oct()
 
+note("from_hex(), from_bin(), from_oct()");
+
 $x = Math::BigRat->from_hex('0x100');
 is($x, '256', 'from_hex');
 
index 9d5f77e..4c2f270 100644 (file)
@@ -339,8 +339,8 @@ abc::1
 +inf:inf
 -inf:-inf
 abcfsstr:NaN
-1:1/1
-3/1:3/1
+1:1
+3/1:3
 0.1:1/10
 
 &bnorm
diff --git a/gnu/usr.bin/perl/cpan/Math-Complex/lib/Math/Complex.pm b/gnu/usr.bin/perl/cpan/Math-Complex/lib/Math/Complex.pm
deleted file mode 100644 (file)
index 6cab268..0000000
+++ /dev/null
@@ -1,2132 +0,0 @@
-#
-# Complex numbers and associated mathematical functions
-# -- Raphael Manfredi  Since Sep 1996
-# -- Jarkko Hietaniemi Since Mar 1997
-# -- Daniel S. Lewart  Since Sep 1997
-#
-
-package Math::Complex;
-
-{ use 5.006; }
-use strict;
-
-our $VERSION = 1.59_02;
-
-use Config;
-
-our ($Inf, $ExpInf);
-our ($vax_float, $has_inf, $has_nan);
-
-BEGIN {
-    $vax_float = (pack("d",1) =~ /^[\x80\x10]\x40/);
-    $has_inf   = !$vax_float;
-    $has_nan   = !$vax_float;
-
-    unless ($has_inf) {
-      # For example in vax, there is no Inf,
-      # and just mentioning the DBL_MAX (1.70141183460469229e+38)
-      # causes SIGFPE.
-
-      # These are pretty useless without a real infinity,
-      # but setting them makes for less warnings about their
-      # undefined values.
-      $Inf = "Inf";
-      $ExpInf = "Inf";
-      return;
-    }
-
-    my %DBL_MAX =  # These are IEEE 754 maxima.
-       (
-         4  => '1.70141183460469229e+38',
-         8  => '1.7976931348623157e+308',
-        # AFAICT the 10, 12, and 16-byte long doubles
-        # all have the same maximum.
-        10 => '1.1897314953572317650857593266280070162E+4932',
-        12 => '1.1897314953572317650857593266280070162E+4932',
-        16 => '1.1897314953572317650857593266280070162E+4932',
-       );
-
-    my $nvsize = $Config{nvsize} ||
-               ($Config{uselongdouble} && $Config{longdblsize}) ||
-                 $Config{doublesize};
-    die "Math::Complex: Could not figure out nvsize\n"
-       unless defined $nvsize;
-    die "Math::Complex: Cannot not figure out max nv (nvsize = $nvsize)\n"
-       unless defined $DBL_MAX{$nvsize};
-    my $DBL_MAX = eval $DBL_MAX{$nvsize};
-    die "Math::Complex: Could not figure out max nv (nvsize = $nvsize)\n"
-       unless defined $DBL_MAX;
-    my $BIGGER_THAN_THIS = 1e30;  # Must find something bigger than this.
-    if ($^O eq 'unicosmk') {
-       $Inf = $DBL_MAX;
-    } else {
-       local $SIG{FPE} = sub { };
-        local $!;
-       # We do want an arithmetic overflow, Inf INF inf Infinity.
-       for my $t (
-           'exp(99999)',  # Enough even with 128-bit long doubles.
-           'inf',
-           'Inf',
-           'INF',
-           'infinity',
-           'Infinity',
-           'INFINITY',
-           '1e99999',
-           ) {
-           local $^W = 0;
-           my $i = eval "$t+1.0";
-           if (defined $i && $i > $BIGGER_THAN_THIS) {
-               $Inf = $i;
-               last;
-           }
-          }
-       $Inf = $DBL_MAX unless defined $Inf;  # Oh well, close enough.
-       die "Math::Complex: Could not get Infinity"
-           unless $Inf > $BIGGER_THAN_THIS;
-       $ExpInf = eval 'exp(99999)';
-      }
-    # print "# On this machine, Inf = '$Inf'\n";
-}
-
-use Scalar::Util qw(set_prototype);
-
-use warnings;
-no warnings 'syntax';  # To avoid the (_) warnings.
-
-BEGIN {
-    # For certain functions that we override, in 5.10 or better
-    # we can set a smarter prototype that will handle the lexical $_
-    # (also a 5.10+ feature).
-    if ($] >= 5.010000) {
-        set_prototype \&abs, '_';
-        set_prototype \&cos, '_';
-        set_prototype \&exp, '_';
-        set_prototype \&log, '_';
-        set_prototype \&sin, '_';
-        set_prototype \&sqrt, '_';
-    }
-}
-
-my $i;
-my %LOGN;
-
-# Regular expression for floating point numbers.
-# These days we could use Scalar::Util::lln(), I guess.
-my $gre = qr'\s*([\+\-]?(?:(?:(?:\d+(?:_\d+)*(?:\.\d*(?:_\d+)*)?|\.\d+(?:_\d+)*)(?:[eE][\+\-]?\d+(?:_\d+)*)?))|inf)'i;
-
-require Exporter;
-
-our @ISA = qw(Exporter);
-
-my @trig = qw(
-             pi
-             tan
-             csc cosec sec cot cotan
-             asin acos atan
-             acsc acosec asec acot acotan
-             sinh cosh tanh
-             csch cosech sech coth cotanh
-             asinh acosh atanh
-             acsch acosech asech acoth acotanh
-            );
-
-our @EXPORT = (qw(
-            i Re Im rho theta arg
-            sqrt log ln
-            log10 logn cbrt root
-            cplx cplxe
-            atan2
-            ),
-          @trig);
-
-my @pi = qw(pi pi2 pi4 pip2 pip4 Inf);
-
-our @EXPORT_OK = @pi;
-
-our %EXPORT_TAGS = (
-    'trig' => [@trig],
-    'pi' => [@pi],
-);
-
-use overload
-       '='     => \&_copy,
-       '+='    => \&_plus,
-       '+'     => \&_plus,
-       '-='    => \&_minus,
-       '-'     => \&_minus,
-       '*='    => \&_multiply,
-       '*'     => \&_multiply,
-       '/='    => \&_divide,
-       '/'     => \&_divide,
-       '**='   => \&_power,
-       '**'    => \&_power,
-       '=='    => \&_numeq,
-       '<=>'   => \&_spaceship,
-       'neg'   => \&_negate,
-       '~'     => \&_conjugate,
-       'abs'   => \&abs,
-       'sqrt'  => \&sqrt,
-       'exp'   => \&exp,
-       'log'   => \&log,
-       'sin'   => \&sin,
-       'cos'   => \&cos,
-       'atan2' => \&atan2,
-        '""'    => \&_stringify;
-
-#
-# Package "privates"
-#
-
-my %DISPLAY_FORMAT = ('style' => 'cartesian',
-                     'polar_pretty_print' => 1);
-my $eps            = 1e-14;            # Epsilon
-
-#
-# Object attributes (internal):
-#      cartesian       [real, imaginary] -- cartesian form
-#      polar           [rho, theta] -- polar form
-#      c_dirty         cartesian form not up-to-date
-#      p_dirty         polar form not up-to-date
-#      display         display format (package's global when not set)
-#
-
-# Die on bad *make() arguments.
-
-sub _cannot_make {
-    die "@{[(caller(1))[3]]}: Cannot take $_[0] of '$_[1]'.\n";
-}
-
-sub _make {
-    my $arg = shift;
-    my ($p, $q);
-
-    if ($arg =~ /^$gre$/) {
-       ($p, $q) = ($1, 0);
-    } elsif ($arg =~ /^(?:$gre)?$gre\s*i\s*$/) {
-       ($p, $q) = ($1 || 0, $2);
-    } elsif ($arg =~ /^\s*\(\s*$gre\s*(?:,\s*$gre\s*)?\)\s*$/) {
-       ($p, $q) = ($1, $2 || 0);
-    }
-
-    if (defined $p) {
-       $p =~ s/^\+//;
-       $p =~ s/^(-?)inf$/"${1}9**9**9"/e if $has_inf;
-       $q =~ s/^\+//;
-       $q =~ s/^(-?)inf$/"${1}9**9**9"/e if $has_inf;
-    }
-
-    return ($p, $q);
-}
-
-sub _emake {
-    my $arg = shift;
-    my ($p, $q);
-
-    if ($arg =~ /^\s*\[\s*$gre\s*(?:,\s*$gre\s*)?\]\s*$/) {
-       ($p, $q) = ($1, $2 || 0);
-    } elsif ($arg =~ m!^\s*\[\s*$gre\s*(?:,\s*([-+]?\d*\s*)?pi(?:/\s*(\d+))?\s*)?\]\s*$!) {
-       ($p, $q) = ($1, ($2 eq '-' ? -1 : ($2 || 1)) * pi() / ($3 || 1));
-    } elsif ($arg =~ /^\s*\[\s*$gre\s*\]\s*$/) {
-       ($p, $q) = ($1, 0);
-    } elsif ($arg =~ /^\s*$gre\s*$/) {
-       ($p, $q) = ($1, 0);
-    }
-
-    if (defined $p) {
-       $p =~ s/^\+//;
-       $q =~ s/^\+//;
-       $p =~ s/^(-?)inf$/"${1}9**9**9"/e if $has_inf;
-       $q =~ s/^(-?)inf$/"${1}9**9**9"/e if $has_inf;
-    }
-
-    return ($p, $q);
-}
-
-sub _copy {
-    my $self = shift;
-    my $clone = {%$self};
-    if ($self->{'cartesian'}) {
-       $clone->{'cartesian'} = [@{$self->{'cartesian'}}];
-    }
-    if ($self->{'polar'}) {
-       $clone->{'polar'} = [@{$self->{'polar'}}];
-    }
-    bless $clone,__PACKAGE__;
-    return $clone;
-}
-
-#
-# ->make
-#
-# Create a new complex number (cartesian form)
-#
-sub make {
-    my $self = bless {}, shift;
-    my ($re, $im);
-    if (@_ == 0) {
-       ($re, $im) = (0, 0);
-    } elsif (@_ == 1) {
-       return (ref $self)->emake($_[0])
-           if ($_[0] =~ /^\s*\[/);
-       ($re, $im) = _make($_[0]);
-    } elsif (@_ == 2) {
-       ($re, $im) = @_;
-    }
-    if (defined $re) {
-       _cannot_make("real part",      $re) unless $re =~ /^$gre$/;
-    }
-    $im ||= 0;
-    _cannot_make("imaginary part", $im) unless $im =~ /^$gre$/;
-    $self->_set_cartesian([$re, $im ]);
-    $self->display_format('cartesian');
-
-    return $self;
-}
-
-#
-# ->emake
-#
-# Create a new complex number (exponential form)
-#
-sub emake {
-    my $self = bless {}, shift;
-    my ($rho, $theta);
-    if (@_ == 0) {
-       ($rho, $theta) = (0, 0);
-    } elsif (@_ == 1) {
-       return (ref $self)->make($_[0])
-           if ($_[0] =~ /^\s*\(/ || $_[0] =~ /i\s*$/);
-       ($rho, $theta) = _emake($_[0]);
-    } elsif (@_ == 2) {
-       ($rho, $theta) = @_;
-    }
-    if (defined $rho && defined $theta) {
-       if ($rho < 0) {
-           $rho   = -$rho;
-           $theta = ($theta <= 0) ? $theta + pi() : $theta - pi();
-       }
-    }
-    if (defined $rho) {
-       _cannot_make("rho",   $rho)   unless $rho   =~ /^$gre$/;
-    }
-    $theta ||= 0;
-    _cannot_make("theta", $theta) unless $theta =~ /^$gre$/;
-    $self->_set_polar([$rho, $theta]);
-    $self->display_format('polar');
-
-    return $self;
-}
-
-sub new { &make }              # For backward compatibility only.
-
-#
-# cplx
-#
-# Creates a complex number from a (re, im) tuple.
-# This avoids the burden of writing Math::Complex->make(re, im).
-#
-sub cplx {
-       return __PACKAGE__->make(@_);
-}
-
-#
-# cplxe
-#
-# Creates a complex number from a (rho, theta) tuple.
-# This avoids the burden of writing Math::Complex->emake(rho, theta).
-#
-sub cplxe {
-       return __PACKAGE__->emake(@_);
-}
-
-#
-# pi
-#
-# The number defined as pi = 180 degrees
-#
-sub pi () { 4 * CORE::atan2(1, 1) }
-
-#
-# pi2
-#
-# The full circle
-#
-sub pi2 () { 2 * pi }
-
-#
-# pi4
-#
-# The full circle twice.
-#
-sub pi4 () { 4 * pi }
-
-#
-# pip2
-#
-# The quarter circle
-#
-sub pip2 () { pi / 2 }
-
-#
-# pip4
-#
-# The eighth circle.
-#
-sub pip4 () { pi / 4 }
-
-#
-# _uplog10
-#
-# Used in log10().
-#
-sub _uplog10 () { 1 / CORE::log(10) }
-
-#
-# i
-#
-# The number defined as i*i = -1;
-#
-sub i () {
-        return $i if ($i);
-       $i = bless {};
-       $i->{'cartesian'} = [0, 1];
-       $i->{'polar'}     = [1, pip2];
-       $i->{c_dirty} = 0;
-       $i->{p_dirty} = 0;
-       return $i;
-}
-
-#
-# _ip2
-#
-# Half of i.
-#
-sub _ip2 () { i / 2 }
-
-#
-# Attribute access/set routines
-#
-
-sub _cartesian {$_[0]->{c_dirty} ?
-                  $_[0]->_update_cartesian : $_[0]->{'cartesian'}}
-sub _polar     {$_[0]->{p_dirty} ?
-                  $_[0]->_update_polar : $_[0]->{'polar'}}
-
-sub _set_cartesian { $_[0]->{p_dirty}++; $_[0]->{c_dirty} = 0;
-                    $_[0]->{'cartesian'} = $_[1] }
-sub _set_polar     { $_[0]->{c_dirty}++; $_[0]->{p_dirty} = 0;
-                    $_[0]->{'polar'} = $_[1] }
-
-#
-# ->_update_cartesian
-#
-# Recompute and return the cartesian form, given accurate polar form.
-#
-sub _update_cartesian {
-       my $self = shift;
-       my ($r, $t) = @{$self->{'polar'}};
-       $self->{c_dirty} = 0;
-       return $self->{'cartesian'} = [$r * CORE::cos($t), $r * CORE::sin($t)];
-}
-
-#
-#
-# ->_update_polar
-#
-# Recompute and return the polar form, given accurate cartesian form.
-#
-sub _update_polar {
-       my $self = shift;
-       my ($x, $y) = @{$self->{'cartesian'}};
-       $self->{p_dirty} = 0;
-       return $self->{'polar'} = [0, 0] if $x == 0 && $y == 0;
-       return $self->{'polar'} = [CORE::sqrt($x*$x + $y*$y),
-                                  CORE::atan2($y, $x)];
-}
-
-#
-# (_plus)
-#
-# Computes z1+z2.
-#
-sub _plus {
-       my ($z1, $z2, $regular) = @_;
-       my ($re1, $im1) = @{$z1->_cartesian};
-       $z2 = cplx($z2) unless ref $z2;
-       my ($re2, $im2) = ref $z2 ? @{$z2->_cartesian} : ($z2, 0);
-       unless (defined $regular) {
-               $z1->_set_cartesian([$re1 + $re2, $im1 + $im2]);
-               return $z1;
-       }
-       return (ref $z1)->make($re1 + $re2, $im1 + $im2);
-}
-
-#
-# (_minus)
-#
-# Computes z1-z2.
-#
-sub _minus {
-       my ($z1, $z2, $inverted) = @_;
-       my ($re1, $im1) = @{$z1->_cartesian};
-       $z2 = cplx($z2) unless ref $z2;
-       my ($re2, $im2) = @{$z2->_cartesian};
-       unless (defined $inverted) {
-               $z1->_set_cartesian([$re1 - $re2, $im1 - $im2]);
-               return $z1;
-       }
-       return $inverted ?
-               (ref $z1)->make($re2 - $re1, $im2 - $im1) :
-               (ref $z1)->make($re1 - $re2, $im1 - $im2);
-
-}
-
-#
-# (_multiply)
-#
-# Computes z1*z2.
-#
-sub _multiply {
-        my ($z1, $z2, $regular) = @_;
-       if ($z1->{p_dirty} == 0 and ref $z2 and $z2->{p_dirty} == 0) {
-           # if both polar better use polar to avoid rounding errors
-           my ($r1, $t1) = @{$z1->_polar};
-           my ($r2, $t2) = @{$z2->_polar};
-           my $t = $t1 + $t2;
-           if    ($t >   pi()) { $t -= pi2 }
-           elsif ($t <= -pi()) { $t += pi2 }
-           unless (defined $regular) {
-               $z1->_set_polar([$r1 * $r2, $t]);
-               return $z1;
-           }
-           return (ref $z1)->emake($r1 * $r2, $t);
-       } else {
-           my ($x1, $y1) = @{$z1->_cartesian};
-           if (ref $z2) {
-               my ($x2, $y2) = @{$z2->_cartesian};
-               return (ref $z1)->make($x1*$x2-$y1*$y2, $x1*$y2+$y1*$x2);
-           } else {
-               return (ref $z1)->make($x1*$z2, $y1*$z2);
-           }
-       }
-}
-
-#
-# _divbyzero
-#
-# Die on division by zero.
-#
-sub _divbyzero {
-    my $mess = "$_[0]: Division by zero.\n";
-
-    if (defined $_[1]) {
-       $mess .= "(Because in the definition of $_[0], the divisor ";
-       $mess .= "$_[1] " unless ("$_[1]" eq '0');
-       $mess .= "is 0)\n";
-    }
-
-    my @up = caller(1);
-
-    $mess .= "Died at $up[1] line $up[2].\n";
-
-    die $mess;
-}
-
-#
-# (_divide)
-#
-# Computes z1/z2.
-#
-sub _divide {
-       my ($z1, $z2, $inverted) = @_;
-       if ($z1->{p_dirty} == 0 and ref $z2 and $z2->{p_dirty} == 0) {
-           # if both polar better use polar to avoid rounding errors
-           my ($r1, $t1) = @{$z1->_polar};
-           my ($r2, $t2) = @{$z2->_polar};
-           my $t;
-           if ($inverted) {
-               _divbyzero "$z2/0" if ($r1 == 0);
-               $t = $t2 - $t1;
-               if    ($t >   pi()) { $t -= pi2 }
-               elsif ($t <= -pi()) { $t += pi2 }
-               return (ref $z1)->emake($r2 / $r1, $t);
-           } else {
-               _divbyzero "$z1/0" if ($r2 == 0);
-               $t = $t1 - $t2;
-               if    ($t >   pi()) { $t -= pi2 }
-               elsif ($t <= -pi()) { $t += pi2 }
-               return (ref $z1)->emake($r1 / $r2, $t);
-           }
-       } else {
-           my ($d, $x2, $y2);
-           if ($inverted) {
-               ($x2, $y2) = @{$z1->_cartesian};
-               $d = $x2*$x2 + $y2*$y2;
-               _divbyzero "$z2/0" if $d == 0;
-               return (ref $z1)->make(($x2*$z2)/$d, -($y2*$z2)/$d);
-           } else {
-               my ($x1, $y1) = @{$z1->_cartesian};
-               if (ref $z2) {
-                   ($x2, $y2) = @{$z2->_cartesian};
-                   $d = $x2*$x2 + $y2*$y2;
-                   _divbyzero "$z1/0" if $d == 0;
-                   my $u = ($x1*$x2 + $y1*$y2)/$d;
-                   my $v = ($y1*$x2 - $x1*$y2)/$d;
-                   return (ref $z1)->make($u, $v);
-               } else {
-                   _divbyzero "$z1/0" if $z2 == 0;
-                   return (ref $z1)->make($x1/$z2, $y1/$z2);
-               }
-           }
-       }
-}
-
-#
-# (_power)
-#
-# Computes z1**z2 = exp(z2 * log z1)).
-#
-sub _power {
-       my ($z1, $z2, $inverted) = @_;
-       if ($inverted) {
-           return 1 if $z1 == 0 || $z2 == 1;
-           return 0 if $z2 == 0 && Re($z1) > 0;
-       } else {
-           return 1 if $z2 == 0 || $z1 == 1;
-           return 0 if $z1 == 0 && Re($z2) > 0;
-       }
-       my $w = $inverted ? &exp($z1 * &log($z2))
-                         : &exp($z2 * &log($z1));
-       # If both arguments cartesian, return cartesian, else polar.
-       return $z1->{c_dirty} == 0 &&
-              (not ref $z2 or $z2->{c_dirty} == 0) ?
-              cplx(@{$w->_cartesian}) : $w;
-}
-
-#
-# (_spaceship)
-#
-# Computes z1 <=> z2.
-# Sorts on the real part first, then on the imaginary part. Thus 2-4i < 3+8i.
-#
-sub _spaceship {
-       my ($z1, $z2, $inverted) = @_;
-       my ($re1, $im1) = ref $z1 ? @{$z1->_cartesian} : ($z1, 0);
-       my ($re2, $im2) = ref $z2 ? @{$z2->_cartesian} : ($z2, 0);
-       my $sgn = $inverted ? -1 : 1;
-       return $sgn * ($re1 <=> $re2) if $re1 != $re2;
-       return $sgn * ($im1 <=> $im2);
-}
-
-#
-# (_numeq)
-#
-# Computes z1 == z2.
-#
-# (Required in addition to _spaceship() because of NaNs.)
-sub _numeq {
-       my ($z1, $z2, $inverted) = @_;
-       my ($re1, $im1) = ref $z1 ? @{$z1->_cartesian} : ($z1, 0);
-       my ($re2, $im2) = ref $z2 ? @{$z2->_cartesian} : ($z2, 0);
-       return $re1 == $re2 && $im1 == $im2 ? 1 : 0;
-}
-
-#
-# (_negate)
-#
-# Computes -z.
-#
-sub _negate {
-       my ($z) = @_;
-       if ($z->{c_dirty}) {
-               my ($r, $t) = @{$z->_polar};
-               $t = ($t <= 0) ? $t + pi : $t - pi;
-               return (ref $z)->emake($r, $t);
-       }
-       my ($re, $im) = @{$z->_cartesian};
-       return (ref $z)->make(-$re, -$im);
-}
-
-#
-# (_conjugate)
-#
-# Compute complex's _conjugate.
-#
-sub _conjugate {
-       my ($z) = @_;
-       if ($z->{c_dirty}) {
-               my ($r, $t) = @{$z->_polar};
-               return (ref $z)->emake($r, -$t);
-       }
-       my ($re, $im) = @{$z->_cartesian};
-       return (ref $z)->make($re, -$im);
-}
-
-#
-# (abs)
-#
-# Compute or set complex's norm (rho).
-#
-sub abs {
-       my ($z, $rho) = @_ ? @_ : $_;
-       unless (ref $z) {
-           if (@_ == 2) {
-               $_[0] = $_[1];
-           } else {
-               return CORE::abs($z);
-           }
-       }
-       if (defined $rho) {
-           $z->{'polar'} = [ $rho, ${$z->_polar}[1] ];
-           $z->{p_dirty} = 0;
-           $z->{c_dirty} = 1;
-           return $rho;
-       } else {
-           return ${$z->_polar}[0];
-       }
-}
-
-sub _theta {
-    my $theta = $_[0];
-
-    if    ($$theta >   pi()) { $$theta -= pi2 }
-    elsif ($$theta <= -pi()) { $$theta += pi2 }
-}
-
-#
-# arg
-#
-# Compute or set complex's argument (theta).
-#
-sub arg {
-       my ($z, $theta) = @_;
-       return $z unless ref $z;
-       if (defined $theta) {
-           _theta(\$theta);
-           $z->{'polar'} = [ ${$z->_polar}[0], $theta ];
-           $z->{p_dirty} = 0;
-           $z->{c_dirty} = 1;
-       } else {
-           $theta = ${$z->_polar}[1];
-           _theta(\$theta);
-       }
-       return $theta;
-}
-
-#
-# (sqrt)
-#
-# Compute sqrt(z).
-#
-# It is quite tempting to use wantarray here so that in list context
-# sqrt() would return the two solutions.  This, however, would
-# break things like
-#
-#      print "sqrt(z) = ", sqrt($z), "\n";
-#
-# The two values would be printed side by side without no intervening
-# whitespace, quite confusing.
-# Therefore if you want the two solutions use the root().
-#
-sub sqrt {
-       my ($z) = @_ ? $_[0] : $_;
-       my ($re, $im) = ref $z ? @{$z->_cartesian} : ($z, 0);
-       return $re < 0 ? cplx(0, CORE::sqrt(-$re)) : CORE::sqrt($re)
-           if $im == 0;
-       my ($r, $t) = @{$z->_polar};
-       return (ref $z)->emake(CORE::sqrt($r), $t/2);
-}
-
-#
-# cbrt
-#
-# Compute cbrt(z) (cubic root).
-#
-# Why are we not returning three values?  The same answer as for sqrt().
-#
-sub cbrt {
-       my ($z) = @_;
-       return $z < 0 ?
-           -CORE::exp(CORE::log(-$z)/3) :
-               ($z > 0 ? CORE::exp(CORE::log($z)/3): 0)
-           unless ref $z;
-       my ($r, $t) = @{$z->_polar};
-       return 0 if $r == 0;
-       return (ref $z)->emake(CORE::exp(CORE::log($r)/3), $t/3);
-}
-
-#
-# _rootbad
-#
-# Die on bad root.
-#
-sub _rootbad {
-    my $mess = "Root '$_[0]' illegal, root rank must be positive integer.\n";
-
-    my @up = caller(1);
-
-    $mess .= "Died at $up[1] line $up[2].\n";
-
-    die $mess;
-}
-
-#
-# root
-#
-# Computes all nth root for z, returning an array whose size is n.
-# `n' must be a positive integer.
-#
-# The roots are given by (for k = 0..n-1):
-#
-# z^(1/n) = r^(1/n) (cos ((t+2 k pi)/n) + i sin ((t+2 k pi)/n))
-#
-sub root {
-       my ($z, $n, $k) = @_;
-       _rootbad($n) if ($n < 1 or int($n) != $n);
-       my ($r, $t) = ref $z ?
-           @{$z->_polar} : (CORE::abs($z), $z >= 0 ? 0 : pi);
-       my $theta_inc = pi2 / $n;
-       my $rho = $r ** (1/$n);
-       my $cartesian = ref $z && $z->{c_dirty} == 0;
-       if (@_ == 2) {
-           my @root;
-           for (my $i = 0, my $theta = $t / $n;
-                $i < $n;
-                $i++, $theta += $theta_inc) {
-               my $w = cplxe($rho, $theta);
-               # Yes, $cartesian is loop invariant.
-               push @root, $cartesian ? cplx(@{$w->_cartesian}) : $w;
-           }
-           return @root;
-       } elsif (@_ == 3) {
-           my $w = cplxe($rho, $t / $n + $k * $theta_inc);
-           return $cartesian ? cplx(@{$w->_cartesian}) : $w;
-       }
-}
-
-#
-# Re
-#
-# Return or set Re(z).
-#
-sub Re {
-       my ($z, $Re) = @_;
-       return $z unless ref $z;
-       if (defined $Re) {
-           $z->{'cartesian'} = [ $Re, ${$z->_cartesian}[1] ];
-           $z->{c_dirty} = 0;
-           $z->{p_dirty} = 1;
-       } else {
-           return ${$z->_cartesian}[0];
-       }
-}
-
-#
-# Im
-#
-# Return or set Im(z).
-#
-sub Im {
-       my ($z, $Im) = @_;
-       return 0 unless ref $z;
-       if (defined $Im) {
-           $z->{'cartesian'} = [ ${$z->_cartesian}[0], $Im ];
-           $z->{c_dirty} = 0;
-           $z->{p_dirty} = 1;
-       } else {
-           return ${$z->_cartesian}[1];
-       }
-}
-
-#
-# rho
-#
-# Return or set rho(w).
-#
-sub rho {
-    Math::Complex::abs(@_);
-}
-
-#
-# theta
-#
-# Return or set theta(w).
-#
-sub theta {
-    Math::Complex::arg(@_);
-}
-
-#
-# (exp)
-#
-# Computes exp(z).
-#
-sub exp {
-    my ($z) = @_ ? @_ : $_;
-    return CORE::exp($z) unless ref $z;
-    my ($x, $y) = @{$z->_cartesian};
-    return (ref $z)->emake(CORE::exp($x), $y);
-}
-
-#
-# _logofzero
-#
-# Die on logarithm of zero.
-#
-sub _logofzero {
-    my $mess = "$_[0]: Logarithm of zero.\n";
-
-    if (defined $_[1]) {
-       $mess .= "(Because in the definition of $_[0], the argument ";
-       $mess .= "$_[1] " unless ($_[1] eq '0');
-       $mess .= "is 0)\n";
-    }
-
-    my @up = caller(1);
-
-    $mess .= "Died at $up[1] line $up[2].\n";
-
-    die $mess;
-}
-
-#
-# (log)
-#
-# Compute log(z).
-#
-sub log {
-       my ($z) = @_ ? @_ : $_;
-       unless (ref $z) {
-           _logofzero("log") if $z == 0;
-           return $z > 0 ? CORE::log($z) : cplx(CORE::log(-$z), pi);
-       }
-       my ($r, $t) = @{$z->_polar};
-       _logofzero("log") if $r == 0;
-       if    ($t >   pi()) { $t -= pi2 }
-       elsif ($t <= -pi()) { $t += pi2 }
-       return (ref $z)->make(CORE::log($r), $t);
-}
-
-#
-# ln
-#
-# Alias for log().
-#
-sub ln { Math::Complex::log(@_) }
-
-#
-# log10
-#
-# Compute log10(z).
-#
-
-sub log10 {
-       return Math::Complex::log($_[0]) * _uplog10;
-}
-
-#
-# logn
-#
-# Compute logn(z,n) = log(z) / log(n)
-#
-sub logn {
-       my ($z, $n) = @_;
-       $z = cplx($z, 0) unless ref $z;
-       my $logn = $LOGN{$n};
-       $logn = $LOGN{$n} = CORE::log($n) unless defined $logn; # Cache log(n)
-       return &log($z) / $logn;
-}
-
-#
-# (cos)
-#
-# Compute cos(z) = (exp(iz) + exp(-iz))/2.
-#
-sub cos {
-       my ($z) = @_ ? @_ : $_;
-       return CORE::cos($z) unless ref $z;
-       my ($x, $y) = @{$z->_cartesian};
-       my $ey = CORE::exp($y);
-       my $sx = CORE::sin($x);
-       my $cx = CORE::cos($x);
-       my $ey_1 = $ey ? 1 / $ey : Inf();
-       return (ref $z)->make($cx * ($ey + $ey_1)/2,
-                             $sx * ($ey_1 - $ey)/2);
-}
-
-#
-# (sin)
-#
-# Compute sin(z) = (exp(iz) - exp(-iz))/2.
-#
-sub sin {
-       my ($z) = @_ ? @_ : $_;
-       return CORE::sin($z) unless ref $z;
-       my ($x, $y) = @{$z->_cartesian};
-       my $ey = CORE::exp($y);
-       my $sx = CORE::sin($x);
-       my $cx = CORE::cos($x);
-       my $ey_1 = $ey ? 1 / $ey : Inf();
-       return (ref $z)->make($sx * ($ey + $ey_1)/2,
-                             $cx * ($ey - $ey_1)/2);
-}
-
-#
-# tan
-#
-# Compute tan(z) = sin(z) / cos(z).
-#
-sub tan {
-       my ($z) = @_;
-       my $cz = &cos($z);
-       _divbyzero "tan($z)", "cos($z)" if $cz == 0;
-       return &sin($z) / $cz;
-}
-
-#
-# sec
-#
-# Computes the secant sec(z) = 1 / cos(z).
-#
-sub sec {
-       my ($z) = @_;
-       my $cz = &cos($z);
-       _divbyzero "sec($z)", "cos($z)" if ($cz == 0);
-       return 1 / $cz;
-}
-
-#
-# csc
-#
-# Computes the cosecant csc(z) = 1 / sin(z).
-#
-sub csc {
-       my ($z) = @_;
-       my $sz = &sin($z);
-       _divbyzero "csc($z)", "sin($z)" if ($sz == 0);
-       return 1 / $sz;
-}
-
-#
-# cosec
-#
-# Alias for csc().
-#
-sub cosec { Math::Complex::csc(@_) }
-
-#
-# cot
-#
-# Computes cot(z) = cos(z) / sin(z).
-#
-sub cot {
-       my ($z) = @_;
-       my $sz = &sin($z);
-       _divbyzero "cot($z)", "sin($z)" if ($sz == 0);
-       return &cos($z) / $sz;
-}
-
-#
-# cotan
-#
-# Alias for cot().
-#
-sub cotan { Math::Complex::cot(@_) }
-
-#
-# acos
-#
-# Computes the arc cosine acos(z) = -i log(z + sqrt(z*z-1)).
-#
-sub acos {
-       my $z = $_[0];
-       return CORE::atan2(CORE::sqrt(1-$z*$z), $z)
-           if (! ref $z) && CORE::abs($z) <= 1;
-       $z = cplx($z, 0) unless ref $z;
-       my ($x, $y) = @{$z->_cartesian};
-       return 0 if $x == 1 && $y == 0;
-       my $t1 = CORE::sqrt(($x+1)*($x+1) + $y*$y);
-       my $t2 = CORE::sqrt(($x-1)*($x-1) + $y*$y);
-       my $alpha = ($t1 + $t2)/2;
-       my $beta  = ($t1 - $t2)/2;
-       $alpha = 1 if $alpha < 1;
-       if    ($beta >  1) { $beta =  1 }
-       elsif ($beta < -1) { $beta = -1 }
-       my $u = CORE::atan2(CORE::sqrt(1-$beta*$beta), $beta);
-       my $v = CORE::log($alpha + CORE::sqrt($alpha*$alpha-1));
-       $v = -$v if $y > 0 || ($y == 0 && $x < -1);
-       return (ref $z)->make($u, $v);
-}
-
-#
-# asin
-#
-# Computes the arc sine asin(z) = -i log(iz + sqrt(1-z*z)).
-#
-sub asin {
-       my $z = $_[0];
-       return CORE::atan2($z, CORE::sqrt(1-$z*$z))
-           if (! ref $z) && CORE::abs($z) <= 1;
-       $z = cplx($z, 0) unless ref $z;
-       my ($x, $y) = @{$z->_cartesian};
-       return 0 if $x == 0 && $y == 0;
-       my $t1 = CORE::sqrt(($x+1)*($x+1) + $y*$y);
-       my $t2 = CORE::sqrt(($x-1)*($x-1) + $y*$y);
-       my $alpha = ($t1 + $t2)/2;
-       my $beta  = ($t1 - $t2)/2;
-       $alpha = 1 if $alpha < 1;
-       if    ($beta >  1) { $beta =  1 }
-       elsif ($beta < -1) { $beta = -1 }
-       my $u =  CORE::atan2($beta, CORE::sqrt(1-$beta*$beta));
-       my $v = -CORE::log($alpha + CORE::sqrt($alpha*$alpha-1));
-       $v = -$v if $y > 0 || ($y == 0 && $x < -1);
-       return (ref $z)->make($u, $v);
-}
-
-#
-# atan
-#
-# Computes the arc tangent atan(z) = i/2 log((i+z) / (i-z)).
-#
-sub atan {
-       my ($z) = @_;
-       return CORE::atan2($z, 1) unless ref $z;
-       my ($x, $y) = ref $z ? @{$z->_cartesian} : ($z, 0);
-       return 0 if $x == 0 && $y == 0;
-       _divbyzero "atan(i)"  if ( $z == i);
-       _logofzero "atan(-i)" if (-$z == i); # -i is a bad file test...
-       my $log = &log((i + $z) / (i - $z));
-       return _ip2 * $log;
-}
-
-#
-# asec
-#
-# Computes the arc secant asec(z) = acos(1 / z).
-#
-sub asec {
-       my ($z) = @_;
-       _divbyzero "asec($z)", $z if ($z == 0);
-       return acos(1 / $z);
-}
-
-#
-# acsc
-#
-# Computes the arc cosecant acsc(z) = asin(1 / z).
-#
-sub acsc {
-       my ($z) = @_;
-       _divbyzero "acsc($z)", $z if ($z == 0);
-       return asin(1 / $z);
-}
-
-#
-# acosec
-#
-# Alias for acsc().
-#
-sub acosec { Math::Complex::acsc(@_) }
-
-#
-# acot
-#
-# Computes the arc cotangent acot(z) = atan(1 / z)
-#
-sub acot {
-       my ($z) = @_;
-       _divbyzero "acot(0)"  if $z == 0;
-       return ($z >= 0) ? CORE::atan2(1, $z) : CORE::atan2(-1, -$z)
-           unless ref $z;
-       _divbyzero "acot(i)"  if ($z - i == 0);
-       _logofzero "acot(-i)" if ($z + i == 0);
-       return atan(1 / $z);
-}
-
-#
-# acotan
-#
-# Alias for acot().
-#
-sub acotan { Math::Complex::acot(@_) }
-
-#
-# cosh
-#
-# Computes the hyperbolic cosine cosh(z) = (exp(z) + exp(-z))/2.
-#
-sub cosh {
-       my ($z) = @_;
-       my $ex;
-       unless (ref $z) {
-           $ex = CORE::exp($z);
-            return $ex ? ($ex == $ExpInf ? Inf() : ($ex + 1/$ex)/2) : Inf();
-       }
-       my ($x, $y) = @{$z->_cartesian};
-       $ex = CORE::exp($x);
-       my $ex_1 = $ex ? 1 / $ex : Inf();
-       return (ref $z)->make(CORE::cos($y) * ($ex + $ex_1)/2,
-                             CORE::sin($y) * ($ex - $ex_1)/2);
-}
-
-#
-# sinh
-#
-# Computes the hyperbolic sine sinh(z) = (exp(z) - exp(-z))/2.
-#
-sub sinh {
-       my ($z) = @_;
-       my $ex;
-       unless (ref $z) {
-           return 0 if $z == 0;
-           $ex = CORE::exp($z);
-            return $ex ? ($ex == $ExpInf ? Inf() : ($ex - 1/$ex)/2) : -Inf();
-       }
-       my ($x, $y) = @{$z->_cartesian};
-       my $cy = CORE::cos($y);
-       my $sy = CORE::sin($y);
-       $ex = CORE::exp($x);
-       my $ex_1 = $ex ? 1 / $ex : Inf();
-       return (ref $z)->make(CORE::cos($y) * ($ex - $ex_1)/2,
-                             CORE::sin($y) * ($ex + $ex_1)/2);
-}
-
-#
-# tanh
-#
-# Computes the hyperbolic tangent tanh(z) = sinh(z) / cosh(z).
-#
-sub tanh {
-       my ($z) = @_;
-       my $cz = cosh($z);
-       _divbyzero "tanh($z)", "cosh($z)" if ($cz == 0);
-       my $sz = sinh($z);
-       return  1 if $cz ==  $sz;
-       return -1 if $cz == -$sz;
-       return $sz / $cz;
-}
-
-#
-# sech
-#
-# Computes the hyperbolic secant sech(z) = 1 / cosh(z).
-#
-sub sech {
-       my ($z) = @_;
-       my $cz = cosh($z);
-       _divbyzero "sech($z)", "cosh($z)" if ($cz == 0);
-       return 1 / $cz;
-}
-
-#
-# csch
-#
-# Computes the hyperbolic cosecant csch(z) = 1 / sinh(z).
-#
-sub csch {
-       my ($z) = @_;
-       my $sz = sinh($z);
-       _divbyzero "csch($z)", "sinh($z)" if ($sz == 0);
-       return 1 / $sz;
-}
-
-#
-# cosech
-#
-# Alias for csch().
-#
-sub cosech { Math::Complex::csch(@_) }
-
-#
-# coth
-#
-# Computes the hyperbolic cotangent coth(z) = cosh(z) / sinh(z).
-#
-sub coth {
-       my ($z) = @_;
-       my $sz = sinh($z);
-       _divbyzero "coth($z)", "sinh($z)" if $sz == 0;
-       my $cz = cosh($z);
-       return  1 if $cz ==  $sz;
-       return -1 if $cz == -$sz;
-       return $cz / $sz;
-}
-
-#
-# cotanh
-#
-# Alias for coth().
-#
-sub cotanh { Math::Complex::coth(@_) }
-
-#
-# acosh
-#
-# Computes the area/inverse hyperbolic cosine acosh(z) = log(z + sqrt(z*z-1)).
-#
-sub acosh {
-       my ($z) = @_;
-       unless (ref $z) {
-           $z = cplx($z, 0);
-       }
-       my ($re, $im) = @{$z->_cartesian};
-       if ($im == 0) {
-           return CORE::log($re + CORE::sqrt($re*$re - 1))
-               if $re >= 1;
-           return cplx(0, CORE::atan2(CORE::sqrt(1 - $re*$re), $re))
-               if CORE::abs($re) < 1;
-       }
-       my $t = &sqrt($z * $z - 1) + $z;
-       # Try Taylor if looking bad (this usually means that
-       # $z was large negative, therefore the sqrt is really
-       # close to abs(z), summing that with z...)
-       $t = 1/(2 * $z) - 1/(8 * $z**3) + 1/(16 * $z**5) - 5/(128 * $z**7)
-           if $t == 0;
-       my $u = &log($t);
-       $u->Im(-$u->Im) if $re < 0 && $im == 0;
-       return $re < 0 ? -$u : $u;
-}
-
-#
-# asinh
-#
-# Computes the area/inverse hyperbolic sine asinh(z) = log(z + sqrt(z*z+1))
-#
-sub asinh {
-       my ($z) = @_;
-       unless (ref $z) {
-           my $t = $z + CORE::sqrt($z*$z + 1);
-           return CORE::log($t) if $t;
-       }
-       my $t = &sqrt($z * $z + 1) + $z;
-       # Try Taylor if looking bad (this usually means that
-       # $z was large negative, therefore the sqrt is really
-       # close to abs(z), summing that with z...)
-       $t = 1/(2 * $z) - 1/(8 * $z**3) + 1/(16 * $z**5) - 5/(128 * $z**7)
-           if $t == 0;
-       return &log($t);
-}
-
-#
-# atanh
-#
-# Computes the area/inverse hyperbolic tangent atanh(z) = 1/2 log((1+z) / (1-z)).
-#
-sub atanh {
-       my ($z) = @_;
-       unless (ref $z) {
-           return CORE::log((1 + $z)/(1 - $z))/2 if CORE::abs($z) < 1;
-           $z = cplx($z, 0);
-       }
-       _divbyzero 'atanh(1)',  "1 - $z" if (1 - $z == 0);
-       _logofzero 'atanh(-1)'           if (1 + $z == 0);
-       return 0.5 * &log((1 + $z) / (1 - $z));
-}
-
-#
-# asech
-#
-# Computes the area/inverse hyperbolic secant asech(z) = acosh(1 / z).
-#
-sub asech {
-       my ($z) = @_;
-       _divbyzero 'asech(0)', "$z" if ($z == 0);
-       return acosh(1 / $z);
-}
-
-#
-# acsch
-#
-# Computes the area/inverse hyperbolic cosecant acsch(z) = asinh(1 / z).
-#
-sub acsch {
-       my ($z) = @_;
-       _divbyzero 'acsch(0)', $z if ($z == 0);
-       return asinh(1 / $z);
-}
-
-#
-# acosech
-#
-# Alias for acosh().
-#
-sub acosech { Math::Complex::acsch(@_) }
-
-#
-# acoth
-#
-# Computes the area/inverse hyperbolic cotangent acoth(z) = 1/2 log((1+z) / (z-1)).
-#
-sub acoth {
-       my ($z) = @_;
-       _divbyzero 'acoth(0)'            if ($z == 0);
-       unless (ref $z) {
-           return CORE::log(($z + 1)/($z - 1))/2 if CORE::abs($z) > 1;
-           $z = cplx($z, 0);
-       }
-       _divbyzero 'acoth(1)',  "$z - 1" if ($z - 1 == 0);
-       _logofzero 'acoth(-1)', "1 + $z" if (1 + $z == 0);
-       return &log((1 + $z) / ($z - 1)) / 2;
-}
-
-#
-# acotanh
-#
-# Alias for acot().
-#
-sub acotanh { Math::Complex::acoth(@_) }
-
-#
-# (atan2)
-#
-# Compute atan(z1/z2), minding the right quadrant.
-#
-sub atan2 {
-       my ($z1, $z2, $inverted) = @_;
-       my ($re1, $im1, $re2, $im2);
-       if ($inverted) {
-           ($re1, $im1) = ref $z2 ? @{$z2->_cartesian} : ($z2, 0);
-           ($re2, $im2) = ref $z1 ? @{$z1->_cartesian} : ($z1, 0);
-       } else {
-           ($re1, $im1) = ref $z1 ? @{$z1->_cartesian} : ($z1, 0);
-           ($re2, $im2) = ref $z2 ? @{$z2->_cartesian} : ($z2, 0);
-       }
-       if ($im1 || $im2) {
-           # In MATLAB the imaginary parts are ignored.
-           # warn "atan2: Imaginary parts ignored";
-           # http://documents.wolfram.com/mathematica/functions/ArcTan
-           # NOTE: Mathematica ArcTan[x,y] while atan2(y,x)
-           my $s = $z1 * $z1 + $z2 * $z2;
-           _divbyzero("atan2") if $s == 0;
-           my $i = &i;
-           my $r = $z2 + $z1 * $i;
-           return -$i * &log($r / &sqrt( $s ));
-       }
-       return CORE::atan2($re1, $re2);
-}
-
-#
-# display_format
-# ->display_format
-#
-# Set (get if no argument) the display format for all complex numbers that
-# don't happen to have overridden it via ->display_format
-#
-# When called as an object method, this actually sets the display format for
-# the current object.
-#
-# Valid object formats are 'c' and 'p' for cartesian and polar. The first
-# letter is used actually, so the type can be fully spelled out for clarity.
-#
-sub display_format {
-       my $self  = shift;
-       my %display_format = %DISPLAY_FORMAT;
-
-       if (ref $self) {                        # Called as an object method
-           if (exists $self->{display_format}) {
-               my %obj = %{$self->{display_format}};
-               @display_format{keys %obj} = values %obj;
-           }
-       }
-       if (@_ == 1) {
-           $display_format{style} = shift;
-       } else {
-           my %new = @_;
-           @display_format{keys %new} = values %new;
-       }
-
-       if (ref $self) { # Called as an object method
-           $self->{display_format} = { %display_format };
-           return
-               wantarray ?
-                   %{$self->{display_format}} :
-                   $self->{display_format}->{style};
-       }
-
-        # Called as a class method
-       %DISPLAY_FORMAT = %display_format;
-       return
-           wantarray ?
-               %DISPLAY_FORMAT :
-                   $DISPLAY_FORMAT{style};
-}
-
-#
-# (_stringify)
-#
-# Show nicely formatted complex number under its cartesian or polar form,
-# depending on the current display format:
-#
-# . If a specific display format has been recorded for this object, use it.
-# . Otherwise, use the generic current default for all complex numbers,
-#   which is a package global variable.
-#
-sub _stringify {
-       my ($z) = shift;
-
-       my $style = $z->display_format;
-
-       $style = $DISPLAY_FORMAT{style} unless defined $style;
-
-       return $z->_stringify_polar if $style =~ /^p/i;
-       return $z->_stringify_cartesian;
-}
-
-#
-# ->_stringify_cartesian
-#
-# Stringify as a cartesian representation 'a+bi'.
-#
-sub _stringify_cartesian {
-       my $z  = shift;
-       my ($x, $y) = @{$z->_cartesian};
-       my ($re, $im);
-
-       my %format = $z->display_format;
-       my $format = $format{format};
-
-       if ($x) {
-           if ($x =~ /^NaN[QS]?$/i) {
-               $re = $x;
-           } else {
-               if ($x =~ /^-?\Q$Inf\E$/oi) {
-                   $re = $x;
-               } else {
-                   $re = defined $format ? sprintf($format, $x) : $x;
-               }
-           }
-       } else {
-           undef $re;
-       }
-
-       if ($y) {
-           if ($y =~ /^(NaN[QS]?)$/i) {
-               $im = $y;
-           } else {
-               if ($y =~ /^-?\Q$Inf\E$/oi) {
-                   $im = $y;
-               } else {
-                   $im =
-                       defined $format ?
-                           sprintf($format, $y) :
-                           ($y == 1 ? "" : ($y == -1 ? "-" : $y));
-               }
-           }
-           $im .= "i";
-       } else {
-           undef $im;
-       }
-
-       my $str = $re;
-
-       if (defined $im) {
-           if ($y < 0) {
-               $str .= $im;
-           } elsif ($y > 0 || $im =~ /^NaN[QS]?i$/i)  {
-               $str .= "+" if defined $re;
-               $str .= $im;
-           }
-       } elsif (!defined $re) {
-           $str = "0";
-       }
-
-       return $str;
-}
-
-
-#
-# ->_stringify_polar
-#
-# Stringify as a polar representation '[r,t]'.
-#
-sub _stringify_polar {
-       my $z  = shift;
-       my ($r, $t) = @{$z->_polar};
-       my $theta;
-
-       my %format = $z->display_format;
-       my $format = $format{format};
-
-       if ($t =~ /^NaN[QS]?$/i || $t =~ /^-?\Q$Inf\E$/oi) {
-           $theta = $t; 
-       } elsif ($t == pi) {
-           $theta = "pi";
-       } elsif ($r == 0 || $t == 0) {
-           $theta = defined $format ? sprintf($format, $t) : $t;
-       }
-
-       return "[$r,$theta]" if defined $theta;
-
-       #
-       # Try to identify pi/n and friends.
-       #
-
-       $t -= int(CORE::abs($t) / pi2) * pi2;
-
-       if ($format{polar_pretty_print} && $t) {
-           my ($a, $b);
-           for $a (2..9) {
-               $b = $t * $a / pi;
-               if ($b =~ /^-?\d+$/) {
-                   $b = $b < 0 ? "-" : "" if CORE::abs($b) == 1;
-                   $theta = "${b}pi/$a";
-                   last;
-               }
-           }
-       }
-
-        if (defined $format) {
-           $r     = sprintf($format, $r);
-           $theta = sprintf($format, $t) unless defined $theta;
-       } else {
-           $theta = $t unless defined $theta;
-       }
-
-       return "[$r,$theta]";
-}
-
-sub Inf {
-    return $Inf;
-}
-
-1;
-__END__
-
-=pod
-
-=head1 NAME
-
-Math::Complex - complex numbers and associated mathematical functions
-
-=head1 SYNOPSIS
-
-       use Math::Complex;
-
-       $z = Math::Complex->make(5, 6);
-       $t = 4 - 3*i + $z;
-       $j = cplxe(1, 2*pi/3);
-
-=head1 DESCRIPTION
-
-This package lets you create and manipulate complex numbers. By default,
-I<Perl> limits itself to real numbers, but an extra C<use> statement brings
-full complex support, along with a full set of mathematical functions
-typically associated with and/or extended to complex numbers.
-
-If you wonder what complex numbers are, they were invented to be able to solve
-the following equation:
-
-       x*x = -1
-
-and by definition, the solution is noted I<i> (engineers use I<j> instead since
-I<i> usually denotes an intensity, but the name does not matter). The number
-I<i> is a pure I<imaginary> number.
-
-The arithmetics with pure imaginary numbers works just like you would expect
-it with real numbers... you just have to remember that
-
-       i*i = -1
-
-so you have:
-
-       5i + 7i = i * (5 + 7) = 12i
-       4i - 3i = i * (4 - 3) = i
-       4i * 2i = -8
-       6i / 2i = 3
-       1 / i = -i
-
-Complex numbers are numbers that have both a real part and an imaginary
-part, and are usually noted:
-
-       a + bi
-
-where C<a> is the I<real> part and C<b> is the I<imaginary> part. The
-arithmetic with complex numbers is straightforward. You have to
-keep track of the real and the imaginary parts, but otherwise the
-rules used for real numbers just apply:
-
-       (4 + 3i) + (5 - 2i) = (4 + 5) + i(3 - 2) = 9 + i
-       (2 + i) * (4 - i) = 2*4 + 4i -2i -i*i = 8 + 2i + 1 = 9 + 2i
-
-A graphical representation of complex numbers is possible in a plane
-(also called the I<complex plane>, but it's really a 2D plane).
-The number
-
-       z = a + bi
-
-is the point whose coordinates are (a, b). Actually, it would
-be the vector originating from (0, 0) to (a, b). It follows that the addition
-of two complex numbers is a vectorial addition.
-
-Since there is a bijection between a point in the 2D plane and a complex
-number (i.e. the mapping is unique and reciprocal), a complex number
-can also be uniquely identified with polar coordinates:
-
-       [rho, theta]
-
-where C<rho> is the distance to the origin, and C<theta> the angle between
-the vector and the I<x> axis. There is a notation for this using the
-exponential form, which is:
-
-       rho * exp(i * theta)
-
-where I<i> is the famous imaginary number introduced above. Conversion
-between this form and the cartesian form C<a + bi> is immediate:
-
-       a = rho * cos(theta)
-       b = rho * sin(theta)
-
-which is also expressed by this formula:
-
-       z = rho * exp(i * theta) = rho * (cos theta + i * sin theta)
-
-In other words, it's the projection of the vector onto the I<x> and I<y>
-axes. Mathematicians call I<rho> the I<norm> or I<modulus> and I<theta>
-the I<argument> of the complex number. The I<norm> of C<z> is
-marked here as C<abs(z)>.
-
-The polar notation (also known as the trigonometric representation) is
-much more handy for performing multiplications and divisions of
-complex numbers, whilst the cartesian notation is better suited for
-additions and subtractions. Real numbers are on the I<x> axis, and
-therefore I<y> or I<theta> is zero or I<pi>.
-
-All the common operations that can be performed on a real number have
-been defined to work on complex numbers as well, and are merely
-I<extensions> of the operations defined on real numbers. This means
-they keep their natural meaning when there is no imaginary part, provided
-the number is within their definition set.
-
-For instance, the C<sqrt> routine which computes the square root of
-its argument is only defined for non-negative real numbers and yields a
-non-negative real number (it is an application from B<R+> to B<R+>).
-If we allow it to return a complex number, then it can be extended to
-negative real numbers to become an application from B<R> to B<C> (the
-set of complex numbers):
-
-       sqrt(x) = x >= 0 ? sqrt(x) : sqrt(-x)*i
-
-It can also be extended to be an application from B<C> to B<C>,
-whilst its restriction to B<R> behaves as defined above by using
-the following definition:
-
-       sqrt(z = [r,t]) = sqrt(r) * exp(i * t/2)
-
-Indeed, a negative real number can be noted C<[x,pi]> (the modulus
-I<x> is always non-negative, so C<[x,pi]> is really C<-x>, a negative
-number) and the above definition states that
-
-       sqrt([x,pi]) = sqrt(x) * exp(i*pi/2) = [sqrt(x),pi/2] = sqrt(x)*i
-
-which is exactly what we had defined for negative real numbers above.
-The C<sqrt> returns only one of the solutions: if you want the both,
-use the C<root> function.
-
-All the common mathematical functions defined on real numbers that
-are extended to complex numbers share that same property of working
-I<as usual> when the imaginary part is zero (otherwise, it would not
-be called an extension, would it?).
-
-A I<new> operation possible on a complex number that is
-the identity for real numbers is called the I<conjugate>, and is noted
-with a horizontal bar above the number, or C<~z> here.
-
-        z = a + bi
-       ~z = a - bi
-
-Simple... Now look:
-
-       z * ~z = (a + bi) * (a - bi) = a*a + b*b
-
-We saw that the norm of C<z> was noted C<abs(z)> and was defined as the
-distance to the origin, also known as:
-
-       rho = abs(z) = sqrt(a*a + b*b)
-
-so
-
-       z * ~z = abs(z) ** 2
-
-If z is a pure real number (i.e. C<b == 0>), then the above yields:
-
-       a * a = abs(a) ** 2
-
-which is true (C<abs> has the regular meaning for real number, i.e. stands
-for the absolute value). This example explains why the norm of C<z> is
-noted C<abs(z)>: it extends the C<abs> function to complex numbers, yet
-is the regular C<abs> we know when the complex number actually has no
-imaginary part... This justifies I<a posteriori> our use of the C<abs>
-notation for the norm.
-
-=head1 OPERATIONS
-
-Given the following notations:
-
-       z1 = a + bi = r1 * exp(i * t1)
-       z2 = c + di = r2 * exp(i * t2)
-       z = <any complex or real number>
-
-the following (overloaded) operations are supported on complex numbers:
-
-       z1 + z2 = (a + c) + i(b + d)
-       z1 - z2 = (a - c) + i(b - d)
-       z1 * z2 = (r1 * r2) * exp(i * (t1 + t2))
-       z1 / z2 = (r1 / r2) * exp(i * (t1 - t2))
-       z1 ** z2 = exp(z2 * log z1)
-       ~z = a - bi
-       abs(z) = r1 = sqrt(a*a + b*b)
-       sqrt(z) = sqrt(r1) * exp(i * t/2)
-       exp(z) = exp(a) * exp(i * b)
-       log(z) = log(r1) + i*t
-       sin(z) = 1/2i (exp(i * z1) - exp(-i * z))
-       cos(z) = 1/2 (exp(i * z1) + exp(-i * z))
-       atan2(y, x) = atan(y / x) # Minding the right quadrant, note the order.
-
-The definition used for complex arguments of atan2() is
-
-       -i log((x + iy)/sqrt(x*x+y*y))
-
-Note that atan2(0, 0) is not well-defined.
-
-The following extra operations are supported on both real and complex
-numbers:
-
-       Re(z) = a
-       Im(z) = b
-       arg(z) = t
-       abs(z) = r
-
-       cbrt(z) = z ** (1/3)
-       log10(z) = log(z) / log(10)
-       logn(z, n) = log(z) / log(n)
-
-       tan(z) = sin(z) / cos(z)
-
-       csc(z) = 1 / sin(z)
-       sec(z) = 1 / cos(z)
-       cot(z) = 1 / tan(z)
-
-       asin(z) = -i * log(i*z + sqrt(1-z*z))
-       acos(z) = -i * log(z + i*sqrt(1-z*z))
-       atan(z) = i/2 * log((i+z) / (i-z))
-
-       acsc(z) = asin(1 / z)
-       asec(z) = acos(1 / z)
-       acot(z) = atan(1 / z) = -i/2 * log((i+z) / (z-i))
-
-       sinh(z) = 1/2 (exp(z) - exp(-z))
-       cosh(z) = 1/2 (exp(z) + exp(-z))
-       tanh(z) = sinh(z) / cosh(z) = (exp(z) - exp(-z)) / (exp(z) + exp(-z))
-
-       csch(z) = 1 / sinh(z)
-       sech(z) = 1 / cosh(z)
-       coth(z) = 1 / tanh(z)
-
-       asinh(z) = log(z + sqrt(z*z+1))
-       acosh(z) = log(z + sqrt(z*z-1))
-       atanh(z) = 1/2 * log((1+z) / (1-z))
-
-       acsch(z) = asinh(1 / z)
-       asech(z) = acosh(1 / z)
-       acoth(z) = atanh(1 / z) = 1/2 * log((1+z) / (z-1))
-
-I<arg>, I<abs>, I<log>, I<csc>, I<cot>, I<acsc>, I<acot>, I<csch>,
-I<coth>, I<acosech>, I<acotanh>, have aliases I<rho>, I<theta>, I<ln>,
-I<cosec>, I<cotan>, I<acosec>, I<acotan>, I<cosech>, I<cotanh>,
-I<acosech>, I<acotanh>, respectively.  C<Re>, C<Im>, C<arg>, C<abs>,
-C<rho>, and C<theta> can be used also as mutators.  The C<cbrt>
-returns only one of the solutions: if you want all three, use the
-C<root> function.
-
-The I<root> function is available to compute all the I<n>
-roots of some complex, where I<n> is a strictly positive integer.
-There are exactly I<n> such roots, returned as a list. Getting the
-number mathematicians call C<j> such that:
-
-       1 + j + j*j = 0;
-
-is a simple matter of writing:
-
-       $j = ((root(1, 3))[1];
-
-The I<k>th root for C<z = [r,t]> is given by:
-
-       (root(z, n))[k] = r**(1/n) * exp(i * (t + 2*k*pi)/n)
-
-You can return the I<k>th root directly by C<root(z, n, k)>,
-indexing starting from I<zero> and ending at I<n - 1>.
-
-The I<spaceship> numeric comparison operator, E<lt>=E<gt>, is also
-defined. In order to ensure its restriction to real numbers is conform
-to what you would expect, the comparison is run on the real part of
-the complex number first, and imaginary parts are compared only when
-the real parts match.
-
-=head1 CREATION
-
-To create a complex number, use either:
-
-       $z = Math::Complex->make(3, 4);
-       $z = cplx(3, 4);
-
-if you know the cartesian form of the number, or
-
-       $z = 3 + 4*i;
-
-if you like. To create a number using the polar form, use either:
-
-       $z = Math::Complex->emake(5, pi/3);
-       $x = cplxe(5, pi/3);
-
-instead. The first argument is the modulus, the second is the angle
-(in radians, the full circle is 2*pi).  (Mnemonic: C<e> is used as a
-notation for complex numbers in the polar form).
-
-It is possible to write:
-
-       $x = cplxe(-3, pi/4);
-
-but that will be silently converted into C<[3,-3pi/4]>, since the
-modulus must be non-negative (it represents the distance to the origin
-in the complex plane).
-
-It is also possible to have a complex number as either argument of the
-C<make>, C<emake>, C<cplx>, and C<cplxe>: the appropriate component of
-the argument will be used.
-
-       $z1 = cplx(-2,  1);
-       $z2 = cplx($z1, 4);
-
-The C<new>, C<make>, C<emake>, C<cplx>, and C<cplxe> will also
-understand a single (string) argument of the forms
-
-       2-3i
-       -3i
-       [2,3]
-       [2,-3pi/4]
-       [2]
-
-in which case the appropriate cartesian and exponential components
-will be parsed from the string and used to create new complex numbers.
-The imaginary component and the theta, respectively, will default to zero.
-
-The C<new>, C<make>, C<emake>, C<cplx>, and C<cplxe> will also
-understand the case of no arguments: this means plain zero or (0, 0).
-
-=head1 DISPLAYING
-
-When printed, a complex number is usually shown under its cartesian
-style I<a+bi>, but there are legitimate cases where the polar style
-I<[r,t]> is more appropriate.  The process of converting the complex
-number into a string that can be displayed is known as I<stringification>.
-
-By calling the class method C<Math::Complex::display_format> and
-supplying either C<"polar"> or C<"cartesian"> as an argument, you
-override the default display style, which is C<"cartesian">. Not
-supplying any argument returns the current settings.
-
-This default can be overridden on a per-number basis by calling the
-C<display_format> method instead. As before, not supplying any argument
-returns the current display style for this number. Otherwise whatever you
-specify will be the new display style for I<this> particular number.
-
-For instance:
-
-       use Math::Complex;
-
-       Math::Complex::display_format('polar');
-       $j = (root(1, 3))[1];
-       print "j = $j\n";               # Prints "j = [1,2pi/3]"
-       $j->display_format('cartesian');
-       print "j = $j\n";               # Prints "j = -0.5+0.866025403784439i"
-
-The polar style attempts to emphasize arguments like I<k*pi/n>
-(where I<n> is a positive integer and I<k> an integer within [-9, +9]),
-this is called I<polar pretty-printing>.
-
-For the reverse of stringifying, see the C<make> and C<emake>.
-
-=head2 CHANGED IN PERL 5.6
-
-The C<display_format> class method and the corresponding
-C<display_format> object method can now be called using
-a parameter hash instead of just a one parameter.
-
-The old display format style, which can have values C<"cartesian"> or
-C<"polar">, can be changed using the C<"style"> parameter.
-
-       $j->display_format(style => "polar");
-
-The one parameter calling convention also still works.
-
-       $j->display_format("polar");
-
-There are two new display parameters.
-
-The first one is C<"format">, which is a sprintf()-style format string
-to be used for both numeric parts of the complex number(s).  The is
-somewhat system-dependent but most often it corresponds to C<"%.15g">.
-You can revert to the default by setting the C<format> to C<undef>.
-
-       # the $j from the above example
-
-       $j->display_format('format' => '%.5f');
-       print "j = $j\n";               # Prints "j = -0.50000+0.86603i"
-       $j->display_format('format' => undef);
-       print "j = $j\n";               # Prints "j = -0.5+0.86603i"
-
-Notice that this affects also the return values of the
-C<display_format> methods: in list context the whole parameter hash
-will be returned, as opposed to only the style parameter value.
-This is a potential incompatibility with earlier versions if you
-have been calling the C<display_format> method in list context.
-
-The second new display parameter is C<"polar_pretty_print">, which can
-be set to true or false, the default being true.  See the previous
-section for what this means.
-
-=head1 USAGE
-
-Thanks to overloading, the handling of arithmetics with complex numbers
-is simple and almost transparent.
-
-Here are some examples:
-
-       use Math::Complex;
-
-       $j = cplxe(1, 2*pi/3);  # $j ** 3 == 1
-       print "j = $j, j**3 = ", $j ** 3, "\n";
-       print "1 + j + j**2 = ", 1 + $j + $j**2, "\n";
-
-       $z = -16 + 0*i;                 # Force it to be a complex
-       print "sqrt($z) = ", sqrt($z), "\n";
-
-       $k = exp(i * 2*pi/3);
-       print "$j - $k = ", $j - $k, "\n";
-
-       $z->Re(3);                      # Re, Im, arg, abs,
-       $j->arg(2);                     # (the last two aka rho, theta)
-                                       # can be used also as mutators.
-
-=head1 CONSTANTS
-
-=head2 PI
-
-The constant C<pi> and some handy multiples of it (pi2, pi4,
-and pip2 (pi/2) and pip4 (pi/4)) are also available if separately
-exported:
-
-    use Math::Complex ':pi'; 
-    $third_of_circle = pi2 / 3;
-
-=head2 Inf
-
-The floating point infinity can be exported as a subroutine Inf():
-
-    use Math::Complex qw(Inf sinh);
-    my $AlsoInf = Inf() + 42;
-    my $AnotherInf = sinh(1e42);
-    print "$AlsoInf is $AnotherInf\n" if $AlsoInf == $AnotherInf;
-
-Note that the stringified form of infinity varies between platforms:
-it can be for example any of
-
-   inf
-   infinity
-   INF
-   1.#INF
-
-or it can be something else. 
-
-Also note that in some platforms trying to use the infinity in
-arithmetic operations may result in Perl crashing because using
-an infinity causes SIGFPE or its moral equivalent to be sent.
-The way to ignore this is
-
-  local $SIG{FPE} = sub { };
-
-=head1 ERRORS DUE TO DIVISION BY ZERO OR LOGARITHM OF ZERO
-
-The division (/) and the following functions
-
-       log     ln      log10   logn
-       tan     sec     csc     cot
-       atan    asec    acsc    acot
-       tanh    sech    csch    coth
-       atanh   asech   acsch   acoth
-
-cannot be computed for all arguments because that would mean dividing
-by zero or taking logarithm of zero. These situations cause fatal
-runtime errors looking like this
-
-       cot(0): Division by zero.
-       (Because in the definition of cot(0), the divisor sin(0) is 0)
-       Died at ...
-
-or
-
-       atanh(-1): Logarithm of zero.
-       Died at...
-
-For the C<csc>, C<cot>, C<asec>, C<acsc>, C<acot>, C<csch>, C<coth>,
-C<asech>, C<acsch>, the argument cannot be C<0> (zero).  For the
-logarithmic functions and the C<atanh>, C<acoth>, the argument cannot
-be C<1> (one).  For the C<atanh>, C<acoth>, the argument cannot be
-C<-1> (minus one).  For the C<atan>, C<acot>, the argument cannot be
-C<i> (the imaginary unit).  For the C<atan>, C<acoth>, the argument
-cannot be C<-i> (the negative imaginary unit).  For the C<tan>,
-C<sec>, C<tanh>, the argument cannot be I<pi/2 + k * pi>, where I<k>
-is any integer.  atan2(0, 0) is undefined, and if the complex arguments
-are used for atan2(), a division by zero will happen if z1**2+z2**2 == 0.
-
-Note that because we are operating on approximations of real numbers,
-these errors can happen when merely `too close' to the singularities
-listed above.
-
-=head1 ERRORS DUE TO INDIGESTIBLE ARGUMENTS
-
-The C<make> and C<emake> accept both real and complex arguments.
-When they cannot recognize the arguments they will die with error
-messages like the following
-
-    Math::Complex::make: Cannot take real part of ...
-    Math::Complex::make: Cannot take real part of ...
-    Math::Complex::emake: Cannot take rho of ...
-    Math::Complex::emake: Cannot take theta of ...
-
-=head1 BUGS
-
-Saying C<use Math::Complex;> exports many mathematical routines in the
-caller environment and even overrides some (C<sqrt>, C<log>, C<atan2>).
-This is construed as a feature by the Authors, actually... ;-)
-
-All routines expect to be given real or complex numbers. Don't attempt to
-use BigFloat, since Perl has currently no rule to disambiguate a '+'
-operation (for instance) between two overloaded entities.
-
-In Cray UNICOS there is some strange numerical instability that results
-in root(), cos(), sin(), cosh(), sinh(), losing accuracy fast.  Beware.
-The bug may be in UNICOS math libs, in UNICOS C compiler, in Math::Complex.
-Whatever it is, it does not manifest itself anywhere else where Perl runs.
-
-=head1 SEE ALSO
-
-L<Math::Trig>
-
-=head1 AUTHORS
-
-Daniel S. Lewart <F<lewart!at!uiuc.edu>>,
-Jarkko Hietaniemi <F<jhi!at!iki.fi>>,
-Raphael Manfredi <F<Raphael_Manfredi!at!pobox.com>>,
-Zefram <zefram@fysh.org>
-
-=head1 LICENSE
-
-This library is free software; you can redistribute it and/or modify
-it under the same terms as Perl itself. 
-
-=cut
-
-1;
-
-# eof
diff --git a/gnu/usr.bin/perl/cpan/Math-Complex/lib/Math/Trig.pm b/gnu/usr.bin/perl/cpan/Math-Complex/lib/Math/Trig.pm
deleted file mode 100644 (file)
index 1d9612a..0000000
+++ /dev/null
@@ -1,761 +0,0 @@
-#
-# Trigonometric functions, mostly inherited from Math::Complex.
-# -- Jarkko Hietaniemi, since April 1997
-# -- Raphael Manfredi, September 1996 (indirectly: because of Math::Complex)
-#
-
-package Math::Trig;
-
-{ use 5.006; }
-use strict;
-
-use Math::Complex 1.59;
-use Math::Complex qw(:trig :pi);
-require Exporter;
-
-our @ISA = qw(Exporter);
-
-our $VERSION = 1.23;
-
-my @angcnv = qw(rad2deg rad2grad
-               deg2rad deg2grad
-               grad2rad grad2deg);
-
-my @areal = qw(asin_real acos_real);
-
-our @EXPORT = (@{$Math::Complex::EXPORT_TAGS{'trig'}},
-          @angcnv, @areal);
-
-my @rdlcnv = qw(cartesian_to_cylindrical
-               cartesian_to_spherical
-               cylindrical_to_cartesian
-               cylindrical_to_spherical
-               spherical_to_cartesian
-               spherical_to_cylindrical);
-
-my @greatcircle = qw(
-                    great_circle_distance
-                    great_circle_direction
-                    great_circle_bearing
-                    great_circle_waypoint
-                    great_circle_midpoint
-                    great_circle_destination
-                   );
-
-my @pi = qw(pi pi2 pi4 pip2 pip4);
-
-our @EXPORT_OK = (@rdlcnv, @greatcircle, @pi, 'Inf');
-
-# See e.g. the following pages:
-# http://www.movable-type.co.uk/scripts/LatLong.html
-# http://williams.best.vwh.net/avform.htm
-
-our %EXPORT_TAGS = ('radial' => [ @rdlcnv ],
-               'great_circle' => [ @greatcircle ],
-               'pi'     => [ @pi ]);
-
-sub _DR  () { pi2/360 }
-sub _RD  () { 360/pi2 }
-sub _DG  () { 400/360 }
-sub _GD  () { 360/400 }
-sub _RG  () { 400/pi2 }
-sub _GR  () { pi2/400 }
-
-#
-# Truncating remainder.
-#
-
-sub _remt ($$) {
-    # Oh yes, POSIX::fmod() would be faster. Possibly. If it is available.
-    $_[0] - $_[1] * int($_[0] / $_[1]);
-}
-
-#
-# Angle conversions.
-#
-
-sub rad2rad($)     { _remt($_[0], pi2) }
-
-sub deg2deg($)     { _remt($_[0], 360) }
-
-sub grad2grad($)   { _remt($_[0], 400) }
-
-sub rad2deg ($;$)  { my $d = _RD * $_[0]; $_[1] ? $d : deg2deg($d) }
-
-sub deg2rad ($;$)  { my $d = _DR * $_[0]; $_[1] ? $d : rad2rad($d) }
-
-sub grad2deg ($;$) { my $d = _GD * $_[0]; $_[1] ? $d : deg2deg($d) }
-
-sub deg2grad ($;$) { my $d = _DG * $_[0]; $_[1] ? $d : grad2grad($d) }
-
-sub rad2grad ($;$) { my $d = _RG * $_[0]; $_[1] ? $d : grad2grad($d) }
-
-sub grad2rad ($;$) { my $d = _GR * $_[0]; $_[1] ? $d : rad2rad($d) }
-
-#
-# acos and asin functions which always return a real number
-#
-
-sub acos_real {
-    return 0  if $_[0] >=  1;
-    return pi if $_[0] <= -1;
-    return acos($_[0]);
-}
-
-sub asin_real {
-    return  &pip2 if $_[0] >=  1;
-    return -&pip2 if $_[0] <= -1;
-    return asin($_[0]);
-}
-
-sub cartesian_to_spherical {
-    my ( $x, $y, $z ) = @_;
-
-    my $rho = sqrt( $x * $x + $y * $y + $z * $z );
-
-    return ( $rho,
-             atan2( $y, $x ),
-             $rho ? acos_real( $z / $rho ) : 0 );
-}
-
-sub spherical_to_cartesian {
-    my ( $rho, $theta, $phi ) = @_;
-
-    return ( $rho * cos( $theta ) * sin( $phi ),
-             $rho * sin( $theta ) * sin( $phi ),
-             $rho * cos( $phi   ) );
-}
-
-sub spherical_to_cylindrical {
-    my ( $x, $y, $z ) = spherical_to_cartesian( @_ );
-
-    return ( sqrt( $x * $x + $y * $y ), $_[1], $z );
-}
-
-sub cartesian_to_cylindrical {
-    my ( $x, $y, $z ) = @_;
-
-    return ( sqrt( $x * $x + $y * $y ), atan2( $y, $x ), $z );
-}
-
-sub cylindrical_to_cartesian {
-    my ( $rho, $theta, $z ) = @_;
-
-    return ( $rho * cos( $theta ), $rho * sin( $theta ), $z );
-}
-
-sub cylindrical_to_spherical {
-    return ( cartesian_to_spherical( cylindrical_to_cartesian( @_ ) ) );
-}
-
-sub great_circle_distance {
-    my ( $theta0, $phi0, $theta1, $phi1, $rho ) = @_;
-
-    $rho = 1 unless defined $rho; # Default to the unit sphere.
-
-    my $lat0 = pip2 - $phi0;
-    my $lat1 = pip2 - $phi1;
-
-    return $rho *
-       acos_real( cos( $lat0 ) * cos( $lat1 ) * cos( $theta0 - $theta1 ) +
-                  sin( $lat0 ) * sin( $lat1 ) );
-}
-
-sub great_circle_direction {
-    my ( $theta0, $phi0, $theta1, $phi1 ) = @_;
-
-    my $lat0 = pip2 - $phi0;
-    my $lat1 = pip2 - $phi1;
-
-    return rad2rad(pi2 -
-       atan2(sin($theta0-$theta1) * cos($lat1),
-               cos($lat0) * sin($lat1) -
-                   sin($lat0) * cos($lat1) * cos($theta0-$theta1)));
-}
-
-*great_circle_bearing         = \&great_circle_direction;
-
-sub great_circle_waypoint {
-    my ( $theta0, $phi0, $theta1, $phi1, $point ) = @_;
-
-    $point = 0.5 unless defined $point;
-
-    my $d = great_circle_distance( $theta0, $phi0, $theta1, $phi1 );
-
-    return undef if $d == pi;
-
-    my $sd = sin($d);
-
-    return ($theta0, $phi0) if $sd == 0;
-
-    my $A = sin((1 - $point) * $d) / $sd;
-    my $B = sin(     $point  * $d) / $sd;
-
-    my $lat0 = pip2 - $phi0;
-    my $lat1 = pip2 - $phi1;
-
-    my $x = $A * cos($lat0) * cos($theta0) + $B * cos($lat1) * cos($theta1);
-    my $y = $A * cos($lat0) * sin($theta0) + $B * cos($lat1) * sin($theta1);
-    my $z = $A * sin($lat0)                + $B * sin($lat1);
-
-    my $theta = atan2($y, $x);
-    my $phi   = acos_real($z);
-
-    return ($theta, $phi);
-}
-
-sub great_circle_midpoint {
-    great_circle_waypoint(@_[0..3], 0.5);
-}
-
-sub great_circle_destination {
-    my ( $theta0, $phi0, $dir0, $dst ) = @_;
-
-    my $lat0 = pip2 - $phi0;
-
-    my $phi1   = asin_real(sin($lat0)*cos($dst) +
-                          cos($lat0)*sin($dst)*cos($dir0));
-
-    my $theta1 = $theta0 + atan2(sin($dir0)*sin($dst)*cos($lat0),
-                                cos($dst)-sin($lat0)*sin($phi1));
-
-    my $dir1 = great_circle_bearing($theta1, $phi1, $theta0, $phi0) + pi;
-
-    $dir1 -= pi2 if $dir1 > pi2;
-
-    return ($theta1, $phi1, $dir1);
-}
-
-1;
-
-__END__
-=pod
-
-=head1 NAME
-
-Math::Trig - trigonometric functions
-
-=head1 SYNOPSIS
-
-    use Math::Trig;
-
-    $x = tan(0.9);
-    $y = acos(3.7);
-    $z = asin(2.4);
-
-    $halfpi = pi/2;
-
-    $rad = deg2rad(120);
-
-    # Import constants pi2, pip2, pip4 (2*pi, pi/2, pi/4).
-    use Math::Trig ':pi';
-
-    # Import the conversions between cartesian/spherical/cylindrical.
-    use Math::Trig ':radial';
-
-        # Import the great circle formulas.
-    use Math::Trig ':great_circle';
-
-=head1 DESCRIPTION
-
-C<Math::Trig> defines many trigonometric functions not defined by the
-core Perl which defines only the C<sin()> and C<cos()>.  The constant
-B<pi> is also defined as are a few convenience functions for angle
-conversions, and I<great circle formulas> for spherical movement.
-
-=head1 TRIGONOMETRIC FUNCTIONS
-
-The tangent
-
-=over 4
-
-=item B<tan>
-
-=back
-
-The cofunctions of the sine, cosine, and tangent (cosec/csc and cotan/cot
-are aliases)
-
-B<csc>, B<cosec>, B<sec>, B<sec>, B<cot>, B<cotan>
-
-The arcus (also known as the inverse) functions of the sine, cosine,
-and tangent
-
-B<asin>, B<acos>, B<atan>
-
-The principal value of the arc tangent of y/x
-
-B<atan2>(y, x)
-
-The arcus cofunctions of the sine, cosine, and tangent (acosec/acsc
-and acotan/acot are aliases).  Note that atan2(0, 0) is not well-defined.
-
-B<acsc>, B<acosec>, B<asec>, B<acot>, B<acotan>
-
-The hyperbolic sine, cosine, and tangent
-
-B<sinh>, B<cosh>, B<tanh>
-
-The cofunctions of the hyperbolic sine, cosine, and tangent (cosech/csch
-and cotanh/coth are aliases)
-
-B<csch>, B<cosech>, B<sech>, B<coth>, B<cotanh>
-
-The area (also known as the inverse) functions of the hyperbolic
-sine, cosine, and tangent
-
-B<asinh>, B<acosh>, B<atanh>
-
-The area cofunctions of the hyperbolic sine, cosine, and tangent
-(acsch/acosech and acoth/acotanh are aliases)
-
-B<acsch>, B<acosech>, B<asech>, B<acoth>, B<acotanh>
-
-The trigonometric constant B<pi> and some of handy multiples
-of it are also defined.
-
-B<pi, pi2, pi4, pip2, pip4>
-
-=head2 ERRORS DUE TO DIVISION BY ZERO
-
-The following functions
-
-    acoth
-    acsc
-    acsch
-    asec
-    asech
-    atanh
-    cot
-    coth
-    csc
-    csch
-    sec
-    sech
-    tan
-    tanh
-
-cannot be computed for all arguments because that would mean dividing
-by zero or taking logarithm of zero. These situations cause fatal
-runtime errors looking like this
-
-    cot(0): Division by zero.
-    (Because in the definition of cot(0), the divisor sin(0) is 0)
-    Died at ...
-
-or
-
-    atanh(-1): Logarithm of zero.
-    Died at...
-
-For the C<csc>, C<cot>, C<asec>, C<acsc>, C<acot>, C<csch>, C<coth>,
-C<asech>, C<acsch>, the argument cannot be C<0> (zero).  For the
-C<atanh>, C<acoth>, the argument cannot be C<1> (one).  For the
-C<atanh>, C<acoth>, the argument cannot be C<-1> (minus one).  For the
-C<tan>, C<sec>, C<tanh>, C<sech>, the argument cannot be I<pi/2 + k *
-pi>, where I<k> is any integer.
-
-Note that atan2(0, 0) is not well-defined.
-
-=head2 SIMPLE (REAL) ARGUMENTS, COMPLEX RESULTS
-
-Please note that some of the trigonometric functions can break out
-from the B<real axis> into the B<complex plane>. For example
-C<asin(2)> has no definition for plain real numbers but it has
-definition for complex numbers.
-
-In Perl terms this means that supplying the usual Perl numbers (also
-known as scalars, please see L<perldata>) as input for the
-trigonometric functions might produce as output results that no more
-are simple real numbers: instead they are complex numbers.
-
-The C<Math::Trig> handles this by using the C<Math::Complex> package
-which knows how to handle complex numbers, please see L<Math::Complex>
-for more information. In practice you need not to worry about getting
-complex numbers as results because the C<Math::Complex> takes care of
-details like for example how to display complex numbers. For example:
-
-    print asin(2), "\n";
-
-should produce something like this (take or leave few last decimals):
-
-    1.5707963267949-1.31695789692482i
-
-That is, a complex number with the real part of approximately C<1.571>
-and the imaginary part of approximately C<-1.317>.
-
-=head1 PLANE ANGLE CONVERSIONS
-
-(Plane, 2-dimensional) angles may be converted with the following functions.
-
-=over
-
-=item deg2rad
-
-    $radians  = deg2rad($degrees);
-
-=item grad2rad
-
-    $radians  = grad2rad($gradians);
-
-=item rad2deg
-
-    $degrees  = rad2deg($radians);
-
-=item grad2deg
-
-    $degrees  = grad2deg($gradians);
-
-=item deg2grad
-
-    $gradians = deg2grad($degrees);
-
-=item rad2grad
-
-    $gradians = rad2grad($radians);
-
-=back
-
-The full circle is 2 I<pi> radians or I<360> degrees or I<400> gradians.
-The result is by default wrapped to be inside the [0, {2pi,360,400}[ circle.
-If you don't want this, supply a true second argument:
-
-    $zillions_of_radians  = deg2rad($zillions_of_degrees, 1);
-    $negative_degrees     = rad2deg($negative_radians, 1);
-
-You can also do the wrapping explicitly by rad2rad(), deg2deg(), and
-grad2grad().
-
-=over 4
-
-=item rad2rad
-
-    $radians_wrapped_by_2pi = rad2rad($radians);
-
-=item deg2deg
-
-    $degrees_wrapped_by_360 = deg2deg($degrees);
-
-=item grad2grad
-
-    $gradians_wrapped_by_400 = grad2grad($gradians);
-
-=back
-
-=head1 RADIAL COORDINATE CONVERSIONS
-
-B<Radial coordinate systems> are the B<spherical> and the B<cylindrical>
-systems, explained shortly in more detail.
-
-You can import radial coordinate conversion functions by using the
-C<:radial> tag:
-
-    use Math::Trig ':radial';
-
-    ($rho, $theta, $z)     = cartesian_to_cylindrical($x, $y, $z);
-    ($rho, $theta, $phi)   = cartesian_to_spherical($x, $y, $z);
-    ($x, $y, $z)           = cylindrical_to_cartesian($rho, $theta, $z);
-    ($rho_s, $theta, $phi) = cylindrical_to_spherical($rho_c, $theta, $z);
-    ($x, $y, $z)           = spherical_to_cartesian($rho, $theta, $phi);
-    ($rho_c, $theta, $z)   = spherical_to_cylindrical($rho_s, $theta, $phi);
-
-B<All angles are in radians>.
-
-=head2 COORDINATE SYSTEMS
-
-B<Cartesian> coordinates are the usual rectangular I<(x, y, z)>-coordinates.
-
-Spherical coordinates, I<(rho, theta, pi)>, are three-dimensional
-coordinates which define a point in three-dimensional space.  They are
-based on a sphere surface.  The radius of the sphere is B<rho>, also
-known as the I<radial> coordinate.  The angle in the I<xy>-plane
-(around the I<z>-axis) is B<theta>, also known as the I<azimuthal>
-coordinate.  The angle from the I<z>-axis is B<phi>, also known as the
-I<polar> coordinate.  The North Pole is therefore I<0, 0, rho>, and
-the Gulf of Guinea (think of the missing big chunk of Africa) I<0,
-pi/2, rho>.  In geographical terms I<phi> is latitude (northward
-positive, southward negative) and I<theta> is longitude (eastward
-positive, westward negative).
-
-B<BEWARE>: some texts define I<theta> and I<phi> the other way round,
-some texts define the I<phi> to start from the horizontal plane, some
-texts use I<r> in place of I<rho>.
-
-Cylindrical coordinates, I<(rho, theta, z)>, are three-dimensional
-coordinates which define a point in three-dimensional space.  They are
-based on a cylinder surface.  The radius of the cylinder is B<rho>,
-also known as the I<radial> coordinate.  The angle in the I<xy>-plane
-(around the I<z>-axis) is B<theta>, also known as the I<azimuthal>
-coordinate.  The third coordinate is the I<z>, pointing up from the
-B<theta>-plane.
-
-=head2 3-D ANGLE CONVERSIONS
-
-Conversions to and from spherical and cylindrical coordinates are
-available.  Please notice that the conversions are not necessarily
-reversible because of the equalities like I<pi> angles being equal to
-I<-pi> angles.
-
-=over 4
-
-=item cartesian_to_cylindrical
-
-    ($rho, $theta, $z) = cartesian_to_cylindrical($x, $y, $z);
-
-=item cartesian_to_spherical
-
-    ($rho, $theta, $phi) = cartesian_to_spherical($x, $y, $z);
-
-=item cylindrical_to_cartesian
-
-    ($x, $y, $z) = cylindrical_to_cartesian($rho, $theta, $z);
-
-=item cylindrical_to_spherical
-
-    ($rho_s, $theta, $phi) = cylindrical_to_spherical($rho_c, $theta, $z);
-
-Notice that when C<$z> is not 0 C<$rho_s> is not equal to C<$rho_c>.
-
-=item spherical_to_cartesian
-
-    ($x, $y, $z) = spherical_to_cartesian($rho, $theta, $phi);
-
-=item spherical_to_cylindrical
-
-    ($rho_c, $theta, $z) = spherical_to_cylindrical($rho_s, $theta, $phi);
-
-Notice that when C<$z> is not 0 C<$rho_c> is not equal to C<$rho_s>.
-
-=back
-
-=head1 GREAT CIRCLE DISTANCES AND DIRECTIONS
-
-A great circle is section of a circle that contains the circle
-diameter: the shortest distance between two (non-antipodal) points on
-the spherical surface goes along the great circle connecting those two
-points.
-
-=head2 great_circle_distance
-
-You can compute spherical distances, called B<great circle distances>,
-by importing the great_circle_distance() function:
-
-  use Math::Trig 'great_circle_distance';
-
-  $distance = great_circle_distance($theta0, $phi0, $theta1, $phi1, [, $rho]);
-
-The I<great circle distance> is the shortest distance between two
-points on a sphere.  The distance is in C<$rho> units.  The C<$rho> is
-optional, it defaults to 1 (the unit sphere), therefore the distance
-defaults to radians.
-
-If you think geographically the I<theta> are longitudes: zero at the
-Greenwhich meridian, eastward positive, westward negative -- and the
-I<phi> are latitudes: zero at the North Pole, northward positive,
-southward negative.  B<NOTE>: this formula thinks in mathematics, not
-geographically: the I<phi> zero is at the North Pole, not at the
-Equator on the west coast of Africa (Bay of Guinea).  You need to
-subtract your geographical coordinates from I<pi/2> (also known as 90
-degrees).
-
-  $distance = great_circle_distance($lon0, pi/2 - $lat0,
-                                    $lon1, pi/2 - $lat1, $rho);
-
-=head2 great_circle_direction
-
-The direction you must follow the great circle (also known as I<bearing>)
-can be computed by the great_circle_direction() function:
-
-  use Math::Trig 'great_circle_direction';
-
-  $direction = great_circle_direction($theta0, $phi0, $theta1, $phi1);
-
-=head2 great_circle_bearing
-
-Alias 'great_circle_bearing' for 'great_circle_direction' is also available.
-
-  use Math::Trig 'great_circle_bearing';
-
-  $direction = great_circle_bearing($theta0, $phi0, $theta1, $phi1);
-
-The result of great_circle_direction is in radians, zero indicating
-straight north, pi or -pi straight south, pi/2 straight west, and
--pi/2 straight east.
-
-=head2 great_circle_destination
-
-You can inversely compute the destination if you know the
-starting point, direction, and distance:
-
-  use Math::Trig 'great_circle_destination';
-
-  # $diro is the original direction,
-  # for example from great_circle_bearing().
-  # $distance is the angular distance in radians,
-  # for example from great_circle_distance().
-  # $thetad and $phid are the destination coordinates,
-  # $dird is the final direction at the destination.
-
-  ($thetad, $phid, $dird) =
-    great_circle_destination($theta, $phi, $diro, $distance);
-
-or the midpoint if you know the end points:
-
-=head2 great_circle_midpoint
-
-  use Math::Trig 'great_circle_midpoint';
-
-  ($thetam, $phim) =
-    great_circle_midpoint($theta0, $phi0, $theta1, $phi1);
-
-The great_circle_midpoint() is just a special case of
-
-=head2 great_circle_waypoint
-
-  use Math::Trig 'great_circle_waypoint';
-
-  ($thetai, $phii) =
-    great_circle_waypoint($theta0, $phi0, $theta1, $phi1, $way);
-
-Where the $way is a value from zero ($theta0, $phi0) to one ($theta1,
-$phi1).  Note that antipodal points (where their distance is I<pi>
-radians) do not have waypoints between them (they would have an an
-"equator" between them), and therefore C<undef> is returned for
-antipodal points.  If the points are the same and the distance
-therefore zero and all waypoints therefore identical, the first point
-(either point) is returned.
-
-The thetas, phis, direction, and distance in the above are all in radians.
-
-You can import all the great circle formulas by
-
-  use Math::Trig ':great_circle';
-
-Notice that the resulting directions might be somewhat surprising if
-you are looking at a flat worldmap: in such map projections the great
-circles quite often do not look like the shortest routes --  but for
-example the shortest possible routes from Europe or North America to
-Asia do often cross the polar regions.  (The common Mercator projection
-does B<not> show great circles as straight lines: straight lines in the
-Mercator projection are lines of constant bearing.)
-
-=head1 EXAMPLES
-
-To calculate the distance between London (51.3N 0.5W) and Tokyo
-(35.7N 139.8E) in kilometers:
-
-    use Math::Trig qw(great_circle_distance deg2rad);
-
-    # Notice the 90 - latitude: phi zero is at the North Pole.
-    sub NESW { deg2rad($_[0]), deg2rad(90 - $_[1]) }
-    my @L = NESW( -0.5, 51.3);
-    my @T = NESW(139.8, 35.7);
-    my $km = great_circle_distance(@L, @T, 6378); # About 9600 km.
-
-The direction you would have to go from London to Tokyo (in radians,
-straight north being zero, straight east being pi/2).
-
-    use Math::Trig qw(great_circle_direction);
-
-    my $rad = great_circle_direction(@L, @T); # About 0.547 or 0.174 pi.
-
-The midpoint between London and Tokyo being
-
-    use Math::Trig qw(great_circle_midpoint);
-
-    my @M = great_circle_midpoint(@L, @T);
-
-or about 69 N 89 E, in the frozen wastes of Siberia.
-
-B<NOTE>: you B<cannot> get from A to B like this:
-
-   Dist = great_circle_distance(A, B)
-   Dir  = great_circle_direction(A, B)
-   C    = great_circle_destination(A, Dist, Dir)
-
-and expect C to be B, because the bearing constantly changes when
-going from A to B (except in some special case like the meridians or
-the circles of latitudes) and in great_circle_destination() one gives
-a B<constant> bearing to follow.
-
-=head2 CAVEAT FOR GREAT CIRCLE FORMULAS
-
-The answers may be off by few percentages because of the irregular
-(slightly aspherical) form of the Earth.  The errors are at worst
-about 0.55%, but generally below 0.3%.
-
-=head2 Real-valued asin and acos
-
-For small inputs asin() and acos() may return complex numbers even
-when real numbers would be enough and correct, this happens because of
-floating-point inaccuracies.  You can see these inaccuracies for
-example by trying theses:
-
-  print cos(1e-6)**2+sin(1e-6)**2 - 1,"\n";
-  printf "%.20f", cos(1e-6)**2+sin(1e-6)**2,"\n";
-
-which will print something like this
-
-  -1.11022302462516e-16
-  0.99999999999999988898
-
-even though the expected results are of course exactly zero and one.
-The formulas used to compute asin() and acos() are quite sensitive to
-this, and therefore they might accidentally slip into the complex
-plane even when they should not.  To counter this there are two
-interfaces that are guaranteed to return a real-valued output.
-
-=over 4
-
-=item asin_real
-
-    use Math::Trig qw(asin_real);
-
-    $real_angle = asin_real($input_sin);
-
-Return a real-valued arcus sine if the input is between [-1, 1],
-B<inclusive> the endpoints.  For inputs greater than one, pi/2
-is returned.  For inputs less than minus one, -pi/2 is returned.
-
-=item acos_real
-
-    use Math::Trig qw(acos_real);
-
-    $real_angle = acos_real($input_cos);
-
-Return a real-valued arcus cosine if the input is between [-1, 1],
-B<inclusive> the endpoints.  For inputs greater than one, zero
-is returned.  For inputs less than minus one, pi is returned.
-
-=back
-
-=head1 BUGS
-
-Saying C<use Math::Trig;> exports many mathematical routines in the
-caller environment and even overrides some (C<sin>, C<cos>).  This is
-construed as a feature by the Authors, actually... ;-)
-
-The code is not optimized for speed, especially because we use
-C<Math::Complex> and thus go quite near complex numbers while doing
-the computations even when the arguments are not. This, however,
-cannot be completely avoided if we want things like C<asin(2)> to give
-an answer instead of giving a fatal runtime error.
-
-Do not attempt navigation using these formulas.
-
-L<Math::Complex>
-
-=head1 AUTHORS
-
-Jarkko Hietaniemi <F<jhi!at!iki.fi>>,
-Raphael Manfredi <F<Raphael_Manfredi!at!pobox.com>>,
-Zefram <zefram@fysh.org>
-
-=head1 LICENSE
-
-This library is free software; you can redistribute it and/or modify
-it under the same terms as Perl itself. 
-
-=cut
-
-# eof
diff --git a/gnu/usr.bin/perl/cpan/Math-Complex/t/Complex.t b/gnu/usr.bin/perl/cpan/Math-Complex/t/Complex.t
deleted file mode 100755 (executable)
index c4fd96f..0000000
+++ /dev/null
@@ -1,1160 +0,0 @@
-#!./perl
-
-#
-# Regression tests for the Math::Complex pacakge
-# -- Raphael Manfredi  since Sep 1996
-# -- Jarkko Hietaniemi since Mar 1997
-# -- Daniel S. Lewart  since Sep 1997
-
-use strict;
-use warnings;
-
-use Math::Complex 1.54;
-
-# they are used later in the test and not exported by Math::Complex
-*_stringify_cartesian = \&Math::Complex::_stringify_cartesian;
-*_stringify_polar     = \&Math::Complex::_stringify_polar;
-
-our $vax_float = (pack("d",1) =~ /^[\x80\x10]\x40/);
-our $has_inf   = !$vax_float;
-
-my ($args, $op, $target, $test, $test_set, $try, $val, $zvalue, @set, @val);
-my ($bad, $z);
-
-$test = 0;
-$| = 1;
-my @script = (
-    'my ($res, $s0,$s1,$s2,$s3,$s4,$s5,$s6,$s7,$s8,$s9,$s10,$z0,$z1,$z2);' .
-       "\n\n"
-);
-my $eps = 1e-13;
-
-if ($^O eq 'unicos') {         # For some reason root() produces very inaccurate
-    $eps = 1e-10;      # results in Cray UNICOS, and occasionally also
-}                      # cos(), sin(), cosh(), sinh().  The division
-                       # of doubles is the current suspect.
-
-$test++;
-push @script, "{ my \$t=$test; ".q{
-    my $a = Math::Complex->new(1);
-    my $b = $a;
-    $a += 2;
-    print "not " unless "$a" eq "3" && "$b" eq "1";
-    print "ok $t\n";
-}."}";
-
-while (<DATA>) {
-       s/^\s+//;
-       next if $_ eq '' || /^\#/;
-       chomp;
-       $test_set = 0;          # Assume not a test over a set of values
-       if (/^&(.+)/) {
-               $op = $1;
-               next;
-       }
-       elsif (/^\{(.+)\}/) {
-               set($1, \@set, \@val);
-               next;
-       }
-       elsif (s/^\|//) {
-               $test_set = 1;  # Requests we loop over the set...
-       }
-       my @args = split(/:/);
-       if ($test_set == 1) {
-               my $i;
-               for ($i = 0; $i < @set; $i++) {
-                       # complex number
-                       $target = $set[$i];
-                       # textual value as found in set definition
-                       $zvalue = $val[$i];
-                       test($zvalue, $target, @args);
-               }
-       } else {
-               test($op, undef, @args);
-       }
-}
-
-#
-
-sub test_mutators {
-    my $op;
-
-    $test++;
-push(@script, <<'EOT');
-{
-    my $z = cplx(  1,  1);
-    $z->Re(2);
-    $z->Im(3);
-    print "# $test Re(z) = ",$z->Re(), " Im(z) = ", $z->Im(), " z = $z\n";
-    print 'not ' unless Re($z) == 2 and Im($z) == 3;
-EOT
-    push(@script, qq(print "ok $test\\n"}\n));
-
-    $test++;
-push(@script, <<'EOT');
-{
-    my $z = cplx(  1,  1);
-    $z->abs(3 * sqrt(2));
-    print "# $test Re(z) = ",$z->Re(), " Im(z) = ", $z->Im(), " z = $z\n";
-    print 'not ' unless (abs($z) - 3 * sqrt(2)) < $eps and
-                        (arg($z) - pi / 4     ) < $eps and
-                        (Re($z) - 3           ) < $eps and
-                        (Im($z) - 3           ) < $eps;
-EOT
-    push(@script, qq(print "ok $test\\n"}\n));
-
-    $test++;
-push(@script, <<'EOT');
-{
-    my $z = cplx(  1,  1);
-    $z->arg(-3 / 4 * pi);
-    print "# $test Re(z) = ",$z->Re(), " Im(z) = ", $z->Im(), " z = $z\n";
-    print 'not ' unless (arg($z) + 3 / 4 * pi) < $eps and
-                        (abs($z) - sqrt(2)   ) < $eps and
-                        (Re($z) + 1          ) < $eps and
-                        (Im($z) + 1          ) < $eps;
-EOT
-    push(@script, qq(print "ok $test\\n"}\n));
-}
-
-test_mutators();
-
-my $constants = '
-my $i    = cplx(0,  1);
-my $pi   = cplx(pi, 0);
-my $pii  = cplx(0, pi);
-my $pip2 = cplx(pi/2, 0);
-my $pip4 = cplx(pi/4, 0);
-my $zero = cplx(0, 0);
-';
-
-if ($has_inf) {
-    $constants .= <<'EOF';
-my $inf  = 9**9**9;
-EOF
-}
-
-push(@script, $constants);
-
-
-# test the divbyzeros
-
-sub test_dbz {
-    for my $op (@_) {
-       $test++;
-       push(@script, <<EOT);
-       eval '$op';
-       (\$bad) = (\$@ =~ /(.+)/);
-       print "# $test op = $op divbyzero? \$bad...\n";
-       print 'not ' unless (\$@ =~ /Division by zero/);
-EOT
-        push(@script, qq(print "ok $test\\n";\n));
-    }
-}
-
-# test the logofzeros
-
-sub test_loz {
-    for my $op (@_) {
-       $test++;
-       push(@script, <<EOT);
-       eval '$op';
-       (\$bad) = (\$@ =~ /(.+)/);
-       print "# $test op = $op logofzero? \$bad...\n";
-       print 'not ' unless (\$@ =~ /Logarithm of zero/);
-EOT
-        push(@script, qq(print "ok $test\\n";\n));
-    }
-}
-
-test_dbz(
-        'i/0',
-        'acot(0)',
-        'acot(+$i)',
-#       'acoth(-1)',   # Log of zero.
-        'acoth(0)',
-        'acoth(+1)',
-        'acsc(0)',
-        'acsch(0)',
-        'asec(0)',
-        'asech(0)',
-        'atan($i)',
-#       'atanh(-1)',   # Log of zero.
-        'atanh(+1)',
-        'cot(0)',
-        'coth(0)',
-        'csc(0)',
-        'csch(0)',
-        'atan(cplx(0, 1), cplx(1, 0))',
-       );
-
-test_loz(
-        'log($zero)',
-        'atan(-$i)',
-        'acot(-$i)',
-        'atanh(-1)',
-        'acoth(-1)',
-       );
-
-# test the bad roots
-
-sub test_broot {
-    for my $op (@_) {
-       $test++;
-       push(@script, <<EOT);
-       eval 'root(2, $op)';
-       (\$bad) = (\$@ =~ /(.+)/);
-       print "# $test op = $op badroot? \$bad...\n";
-       print 'not ' unless (\$@ =~ /root rank must be/);
-EOT
-        push(@script, qq(print "ok $test\\n";\n));
-    }
-}
-
-test_broot(qw(-3 -2.1 0 0.99));
-
-sub test_display_format {
-    $test++;
-    push @script, <<EOS;
-    print "# package display_format cartesian?\n";
-    print "not " unless Math::Complex->display_format eq 'cartesian';
-    print "ok $test\n";
-EOS
-
-    push @script, <<EOS;
-    my \$j = (root(1,3))[1];
-
-    \$j->display_format('polar');
-EOS
-
-    $test++;
-    push @script, <<EOS;
-    print "# j display_format polar?\n";
-    print "not " unless \$j->display_format eq 'polar';
-    print "ok $test\n";
-EOS
-
-    $test++;
-    push @script, <<EOS;
-    print "# j = \$j\n";
-    print "not " unless "\$j" eq "[1,2pi/3]";
-    print "ok $test\n";
-
-    my %display_format;
-
-    %display_format = \$j->display_format;
-EOS
-
-    $test++;
-    push @script, <<EOS;
-    print "# display_format{style} polar?\n";
-    print "not " unless \$display_format{style} eq 'polar';
-    print "ok $test\n";
-EOS
-
-    $test++;
-    push @script, <<EOS;
-    print "# keys %display_format == 2?\n";
-    print "not " unless keys %display_format == 2;
-    print "ok $test\n";
-
-    \$j->display_format('style' => 'cartesian', 'format' => '%.5f');
-EOS
-
-    $test++;
-    push @script, <<EOS;
-    print "# j = \$j\n";
-    print "not " unless "\$j" eq "-0.50000+0.86603i";
-    print "ok $test\n";
-
-    %display_format = \$j->display_format;
-EOS
-
-    $test++;
-    push @script, <<EOS;
-    print "# display_format{format} %.5f?\n";
-    print "not " unless \$display_format{format} eq '%.5f';
-    print "ok $test\n";
-EOS
-
-    $test++;
-    push @script, <<EOS;
-    print "# keys %display_format == 3?\n";
-    print "not " unless keys %display_format == 3;
-    print "ok $test\n";
-
-    \$j->display_format('format' => undef);
-EOS
-
-    $test++;
-    push @script, <<EOS;
-    print "# j = \$j\n";
-    print "not " unless "\$j" =~ /^-0(?:\\.5(?:0000\\d+)?|\\.49999\\d+)\\+0.86602540\\d+i\$/;
-    print "ok $test\n";
-
-    \$j->display_format('style' => 'polar', 'polar_pretty_print' => 0);
-EOS
-
-    $test++;
-    push @script, <<EOS;
-    print "# j = \$j\n";
-    print "not " unless "\$j" =~ /^\\[1,2\\.09439510\\d+\\]\$/;
-    print "ok $test\n";
-
-    \$j->display_format('style' => 'polar', 'format' => "%.4g");
-EOS
-
-    $test++;
-    push @script, <<EOS;
-    print "# j = \$j\n";
-    print "not " unless "\$j" =~ /^\\[1,2\\.094\\]\$/;
-    print "ok $test\n";
-
-    \$j->display_format('style' => 'cartesian', 'format' => '(%.5g)');
-EOS
-
-    $test++;
-    push @script, <<EOS;
-    print "# j = \$j\n";
-    print "not " unless "\$j" eq "(-0.5)+(0.86603)i";
-    print "ok $test\n";
-EOS
-
-    $test++;
-    push @script, <<EOS;
-    print "# j display_format cartesian?\n";
-    print "not " unless \$j->display_format eq 'cartesian';
-    print "ok $test\n";
-EOS
-}
-
-test_display_format();
-
-sub test_remake {
-    $test++;
-    push @script, <<EOS;
-    print "# remake 2+3i\n";
-    \$z = cplx('2+3i');
-    print "not " unless \$z == Math::Complex->make(2,3);
-    print "ok $test\n";
-EOS
-
-    $test++;
-    push @script, <<EOS;
-    print "# make 3i\n";
-    \$z = Math::Complex->make('3i');
-    print "not " unless \$z == cplx(0,3);
-    print "ok $test\n";
-EOS
-
-    $test++;
-    push @script, <<EOS;
-    print "# emake [2,3]\n";
-    \$z = Math::Complex->emake('[2,3]');
-    print "not " unless \$z == cplxe(2,3);
-    print "ok $test\n";
-EOS
-
-    $test++;
-    push @script, <<EOS;
-    print "# make (2,3)\n";
-    \$z = Math::Complex->make('(2,3)');
-    print "not " unless \$z == cplx(2,3);
-    print "ok $test\n";
-EOS
-
-    $test++;
-    push @script, <<EOS;
-    print "# emake [2,3pi/8]\n";
-    \$z = Math::Complex->emake('[2,3pi/8]');
-    print "not " unless \$z == cplxe(2,3*\$pi/8);
-    print "ok $test\n";
-EOS
-
-    $test++;
-    push @script, <<EOS;
-    print "# emake [2]\n";
-    \$z = Math::Complex->emake('[2]');
-    print "not " unless \$z == cplxe(2);
-    print "ok $test\n";
-EOS
-}
-
-sub test_no_args {
-    push @script, <<'EOS';
-{
-    print "# cplx, cplxe, make, emake without arguments\n";
-EOS
-
-    $test++;
-    push @script, <<EOS;
-    my \$z0 = cplx();
-    print ((\$z0->Re()  == 0) ? "ok $test\n" : "not ok $test\n");
-EOS
-
-    $test++;
-    push @script, <<EOS;
-    print ((\$z0->Im()  == 0) ? "ok $test\n" : "not ok $test\n");
-EOS
-
-    $test++;
-    push @script, <<EOS;
-    my \$z1 = cplxe();
-    print ((\$z1->rho()   == 0) ? "ok $test\n" : "not ok $test\n");
-EOS
-
-    $test++;
-    push @script, <<EOS;
-    print ((\$z1->theta() == 0) ? "ok $test\n" : "not ok $test\n");
-EOS
-
-    $test++;
-    push @script, <<EOS;
-    my \$z2 = Math::Complex->make();
-    print ((\$z2->Re()  == 0) ? "ok $test\n" : "not ok $test\n");
-EOS
-
-    $test++;
-    push @script, <<EOS;
-    print ((\$z2->Im()  == 0) ? "ok $test\n" : "not ok $test\n");
-EOS
-
-    $test++;
-    push @script, <<EOS;
-    my \$z3 = Math::Complex->emake();
-    print ((\$z3->rho()   == 0) ? "ok $test\n" : "not ok $test\n");
-EOS
-
-    $test++;
-    push @script, <<EOS;
-    print ((\$z3->theta() == 0) ? "ok $test\n" : "not ok $test\n");
-}
-EOS
-}
-
-sub test_atan2 {
-    push @script, <<'EOS';
-print "# atan2() with some real arguments\n";
-EOS
-    my @real = (-1, 0, 1);
-    for my $x (@real) {
-       for my $y (@real) {
-           next if $x == 0 && $y == 0;
-           $test++;
-           push @script, <<EOS;
-print ((Math::Complex::atan2($y, $x) == CORE::atan2($y, $x)) ? "ok $test\n" : "not ok $test\n");
-EOS
-        }
-    }
-    push @script, <<'EOS';
-    print "# atan2() with some complex arguments\n";
-EOS
-    $test++;
-    push @script, <<EOS;
-    print (abs(atan2(0, cplx(0, 1))) < $eps ? "ok $test\n" : "not ok $test\n");
-EOS
-    $test++;
-    push @script, <<EOS;
-    print (abs(atan2(cplx(0, 1), 0) - \$pip2) < $eps ? "ok $test\n" : "not ok $test\n");
-EOS
-    $test++;
-    push @script, <<EOS;
-    print (abs(atan2(cplx(0, 1), cplx(0, 1)) - \$pip4) < $eps ? "ok $test\n" : "not ok $test\n");
-EOS
-    $test++;
-    push @script, <<EOS;
-    print (abs(atan2(cplx(0, 1), cplx(1, 1)) - cplx(0.553574358897045, 0.402359478108525)) < $eps ? "ok $test\n" : "not ok $test\n");
-EOS
-}
-
-sub test_decplx {
-}
-
-test_remake();
-
-test_no_args();
-
-test_atan2();
-
-test_decplx();
-
-print "1..$test\n";
-#print @script, "\n";
-eval join '', @script;
-die $@ if $@;
-
-sub abop {
-       my ($op) = @_;
-
-       push(@script, qq(print "# $op=\n";));
-}
-
-sub test {
-       my ($op, $z, @args) = @_;
-       my ($baop) = 0;
-       $test++;
-       my $i;
-       $baop = 1 if ($op =~ s/;=$//);
-       for ($i = 0; $i < @args; $i++) {
-               $val = value($args[$i]);
-               push @script, "\$z$i = $val;\n";
-       }
-       if (defined $z) {
-               $args = "'$op'";                # Really the value
-               $try = "abs(\$z0 - \$z1) <= $eps ? \$z1 : \$z0";
-               push @script, "\$res = $try; ";
-               push @script, "check($test, $args[0], \$res, \$z$#args, $args);\n";
-       } else {
-               my ($try, $args);
-               if (@args == 2) {
-                       $try = "$op \$z0";
-                       $args = "'$args[0]'";
-               } else {
-                       $try = ($op =~ /^\w/) ? "$op(\$z0, \$z1)" : "\$z0 $op \$z1";
-                       $args = "'$args[0]', '$args[1]'";
-               }
-               push @script, "\$res = $try; ";
-               push @script, "check($test, '$try', \$res, \$z$#args, $args);\n";
-               if (@args > 2 and $baop) { # binary assignment ops
-                       $test++;
-                       # check the op= works
-                       push @script, <<EOB;
-{
-       my \$za = cplx(ref \$z0 ? \@{\$z0->_cartesian} : (\$z0, 0));
-
-       my (\$z1r, \$z1i) = ref \$z1 ? \@{\$z1->_cartesian} : (\$z1, 0);
-
-       my \$zb = cplx(\$z1r, \$z1i);
-
-       \$za $op= \$zb;
-       my (\$zbr, \$zbi) = \@{\$zb->_cartesian};
-
-       check($test, '\$z0 $op= \$z1', \$za, \$z$#args, $args);
-EOB
-                       $test++;
-                       # check that the rhs has not changed
-                       push @script, qq(print "not " unless (\$zbr == \$z1r and \$zbi == \$z1i););
-                       push @script, qq(print "ok $test\\n";\n);
-                       push @script, "}\n";
-               }
-       }
-}
-
-sub set {
-       my ($set, $setref, $valref) = @_;
-       @{$setref} = ();
-       @{$valref} = ();
-       my @set = split(/;\s*/, $set);
-       my @res;
-       my $i;
-       for ($i = 0; $i < @set; $i++) {
-               push(@{$valref}, $set[$i]);
-               my $val = value($set[$i]);
-               push @script, "\$s$i = $val;\n";
-               push @{$setref}, "\$s$i";
-       }
-}
-
-sub value {
-       local ($_) = @_;
-       if (/^\s*\((.*),(.*)\)/) {
-               return "cplx($1,$2)";
-       }
-       elsif (/^\s*([\-\+]?(?:\d+(\.\d+)?|\.\d+)(?:[e[\-\+]\d+])?)/) {
-               return "cplx($1,0)";
-       }
-       elsif (/^\s*\[(.*),(.*)\]/) {
-               return "cplxe($1,$2)";
-       }
-       elsif (/^\s*'(.*)'/) {
-               my $ex = $1;
-               $ex =~ s/\bz\b/$target/g;
-               $ex =~ s/\br\b/abs($target)/g;
-               $ex =~ s/\bt\b/arg($target)/g;
-               $ex =~ s/\ba\b/Re($target)/g;
-               $ex =~ s/\bb\b/Im($target)/g;
-               return $ex;
-       }
-       elsif (/^\s*"(.*)"/) {
-               return "\"$1\"";
-       }
-       return $_;
-}
-
-sub check {
-       my ($test, $try, $got, $expected, @z) = @_;
-
-       print "# @_\n";
-
-       if ("$got" eq "$expected"
-           ||
-           ($expected =~ /^-?\d/ && $got == $expected)
-           ||
-           (abs(Math::Complex->make($got) - Math::Complex->make($expected)) < $eps)
-           ||
-           (abs($got - $expected) < $eps)
-           ) {
-               print "ok $test\n";
-       } else {
-               print "not ok $test\n";
-               my $args = (@z == 1) ? "z = $z[0]" : "z0 = $z[0], z1 = $z[1]";
-               print "# '$try' expected: '$expected' got: '$got' for $args\n";
-       }
-}
-
-sub addsq {
-    my ($z1, $z2) = @_;
-    return ($z1 + i*$z2) * ($z1 - i*$z2);
-}
-
-sub subsq {
-    my ($z1, $z2) = @_;
-    return ($z1 + $z2) * ($z1 - $z2);
-}
-
-__END__
-&+;=
-(3,4):(3,4):(6,8)
-(-3,4):(3,-4):(0,0)
-(3,4):-3:(0,4)
-1:(4,2):(5,2)
-[2,0]:[2,pi]:(0,0)
-
-&++
-(2,1):(3,1)
-
-&-;=
-(2,3):(-2,-3)
-[2,pi/2]:[2,-(pi)/2]
-2:[2,0]:(0,0)
-[3,0]:2:(1,0)
-3:(4,5):(-1,-5)
-(4,5):3:(1,5)
-(2,1):(3,5):(-1,-4)
-
-&--
-(1,2):(0,2)
-[2,pi]:[3,pi]
-
-&*;=
-(0,1):(0,1):(-1,0)
-(4,5):(1,0):(4,5)
-[2,2*pi/3]:(1,0):[2,2*pi/3]
-2:(0,1):(0,2)
-(0,1):3:(0,3)
-(0,1):(4,1):(-1,4)
-(2,1):(4,-1):(9,2)
-
-&/;=
-(3,4):(3,4):(1,0)
-(4,-5):1:(4,-5)
-1:(0,1):(0,-1)
-(0,6):(0,2):(3,0)
-(9,2):(4,-1):(2,1)
-[4,pi]:[2,pi/2]:[2,pi/2]
-[2,pi/2]:[4,pi]:[0.5,-(pi)/2]
-
-&**;=
-(2,0):(3,0):(8,0)
-(3,0):(2,0):(9,0)
-(2,3):(4,0):(-119,-120)
-(0,0):(1,0):(0,0)
-(0,0):(2,3):(0,0)
-(1,0):(0,0):(1,0)
-(1,0):(1,0):(1,0)
-(1,0):(2,3):(1,0)
-(2,3):(0,0):(1,0)
-(2,3):(1,0):(2,3)
-(0,0):(0,0):(1,0)
-
-&Re
-(3,4):3
-(-3,4):-3
-[1,pi/2]:0
-
-&Im
-(3,4):4
-(3,-4):-4
-[1,pi/2]:1
-
-&abs
-(3,4):5
-(-3,4):5
-
-&arg
-[2,0]:0
-[-2,0]:pi
-
-&~
-(4,5):(4,-5)
-(-3,4):(-3,-4)
-[2,pi/2]:[2,-(pi)/2]
-
-&<
-(3,4):(1,2):0
-(3,4):(3,2):0
-(3,4):(3,8):1
-(4,4):(5,129):1
-
-&==
-(3,4):(4,5):0
-(3,4):(3,5):0
-(3,4):(2,4):0
-(3,4):(3,4):1
-
-&sqrt
--9:(0,3)
-(-100,0):(0,10)
-(16,-30):(5,-3)
-
-&_stringify_cartesian
-(-100,0):"-100"
-(0,1):"i"
-(4,-3):"4-3i"
-(4,0):"4"
-(-4,0):"-4"
-(-2,4):"-2+4i"
-(-2,-1):"-2-i"
-
-&_stringify_polar
-[-1, 0]:"[1,pi]"
-[1, pi/3]:"[1,pi/3]"
-[6, -2*pi/3]:"[6,-2pi/3]"
-[0.5, -9*pi/11]:"[0.5,-9pi/11]"
-[1, 0.5]:"[1, 0.5]"
-
-{ (4,3); [3,2]; (-3,4); (0,2); [2,1] }
-
-|'z + ~z':'2*Re(z)'
-|'z - ~z':'2*i*Im(z)'
-|'z * ~z':'abs(z) * abs(z)'
-
-{ (0.5, 0); (-0.5, 0); (2,3); [3,2]; (-3,2); (0,2); 3; 1.2; (-3, 0); (-2, -1); [2,1] }
-
-|'(root(z, 4))[1] ** 4':'z'
-|'(root(z, 5))[3] ** 5':'z'
-|'(root(z, 8))[7] ** 8':'z'
-|'(root(z, 8, 0)) ** 8':'z'
-|'(root(z, 8, 7)) ** 8':'z'
-|'abs(z)':'r'
-|'acot(z)':'acotan(z)'
-|'acsc(z)':'acosec(z)'
-|'acsc(z)':'asin(1 / z)'
-|'asec(z)':'acos(1 / z)'
-|'cbrt(z)':'cbrt(r) * exp(i * t/3)'
-|'cos(acos(z))':'z'
-|'addsq(cos(z), sin(z))':1
-|'cos(z)':'cosh(i*z)'
-|'subsq(cosh(z), sinh(z))':1
-|'cot(acot(z))':'z'
-|'cot(z)':'1 / tan(z)'
-|'cot(z)':'cotan(z)'
-|'csc(acsc(z))':'z'
-|'csc(z)':'1 / sin(z)'
-|'csc(z)':'cosec(z)'
-|'exp(log(z))':'z'
-|'exp(z)':'exp(a) * exp(i * b)'
-|'ln(z)':'log(z)'
-|'log(exp(z))':'z'
-|'log(z)':'log(r) + i*t'
-|'log10(z)':'log(z) / log(10)'
-|'logn(z, 2)':'log(z) / log(2)'
-|'logn(z, 3)':'log(z) / log(3)'
-|'sec(asec(z))':'z'
-|'sec(z)':'1 / cos(z)'
-|'sin(asin(z))':'z'
-|'sin(i * z)':'i * sinh(z)'
-|'sqrt(z) * sqrt(z)':'z'
-|'sqrt(z)':'sqrt(r) * exp(i * t/2)'
-|'tan(atan(z))':'z'
-|'z**z':'exp(z * log(z))'
-
-{ (1,1); [1,0.5]; (-2, -1); 2; -3; (-1,0.5); (0,0.5); 0.5; (2, 0); (-1, -2) }
-
-|'cosh(acosh(z))':'z'
-|'coth(acoth(z))':'z'
-|'coth(z)':'1 / tanh(z)'
-|'coth(z)':'cotanh(z)'
-|'csch(acsch(z))':'z'
-|'csch(z)':'1 / sinh(z)'
-|'csch(z)':'cosech(z)'
-|'sech(asech(z))':'z'
-|'sech(z)':'1 / cosh(z)'
-|'sinh(asinh(z))':'z'
-|'tanh(atanh(z))':'z'
-
-{ (0.2,-0.4); [1,0.5]; -1.2; (-1,0.5); 0.5; (1.1, 0) }
-
-|'acos(cos(z)) ** 2':'z * z'
-|'acosh(cosh(z)) ** 2':'z * z'
-|'acoth(z)':'acotanh(z)'
-|'acoth(z)':'atanh(1 / z)'
-|'acsch(z)':'acosech(z)'
-|'acsch(z)':'asinh(1 / z)'
-|'asech(z)':'acosh(1 / z)'
-|'asin(sin(z))':'z'
-|'asinh(sinh(z))':'z'
-|'atan(tan(z))':'z'
-|'atanh(tanh(z))':'z'
-
-&log
-(-2.0,0):(   0.69314718055995,  3.14159265358979)
-(-1.0,0):(   0               ,  3.14159265358979)
-(-0.5,0):(  -0.69314718055995,  3.14159265358979)
-( 0.5,0):(  -0.69314718055995,  0               )
-( 1.0,0):(   0               ,  0               )
-( 2.0,0):(   0.69314718055995,  0               )
-
-&log
-( 2, 3):(    1.28247467873077,  0.98279372324733)
-(-2, 3):(    1.28247467873077,  2.15879893034246)
-(-2,-3):(    1.28247467873077, -2.15879893034246)
-( 2,-3):(    1.28247467873077, -0.98279372324733)
-
-&sin
-(-2.0,0):(  -0.90929742682568,  0               )
-(-1.0,0):(  -0.84147098480790,  0               )
-(-0.5,0):(  -0.47942553860420,  0               )
-( 0.0,0):(   0               ,  0               )
-( 0.5,0):(   0.47942553860420,  0               )
-( 1.0,0):(   0.84147098480790,  0               )
-( 2.0,0):(   0.90929742682568,  0               )
-
-&sin
-( 2, 3):(  9.15449914691143, -4.16890695996656)
-(-2, 3):( -9.15449914691143, -4.16890695996656)
-(-2,-3):( -9.15449914691143,  4.16890695996656)
-( 2,-3):(  9.15449914691143,  4.16890695996656)
-
-&cos
-(-2.0,0):(  -0.41614683654714,  0               )
-(-1.0,0):(   0.54030230586814,  0               )
-(-0.5,0):(   0.87758256189037,  0               )
-( 0.0,0):(   1               ,  0               )
-( 0.5,0):(   0.87758256189037,  0               )
-( 1.0,0):(   0.54030230586814,  0               )
-( 2.0,0):(  -0.41614683654714,  0               )
-
-&cos
-( 2, 3):( -4.18962569096881, -9.10922789375534)
-(-2, 3):( -4.18962569096881,  9.10922789375534)
-(-2,-3):( -4.18962569096881, -9.10922789375534)
-( 2,-3):( -4.18962569096881,  9.10922789375534)
-
-&tan
-(-2.0,0):(   2.18503986326152,  0               )
-(-1.0,0):(  -1.55740772465490,  0               )
-(-0.5,0):(  -0.54630248984379,  0               )
-( 0.0,0):(   0               ,  0               )
-( 0.5,0):(   0.54630248984379,  0               )
-( 1.0,0):(   1.55740772465490,  0               )
-( 2.0,0):(  -2.18503986326152,  0               )
-
-&tan
-( 2, 3):( -0.00376402564150,  1.00323862735361)
-(-2, 3):(  0.00376402564150,  1.00323862735361)
-(-2,-3):(  0.00376402564150, -1.00323862735361)
-( 2,-3):( -0.00376402564150, -1.00323862735361)
-
-&sec
-(-2.0,0):(  -2.40299796172238,  0               )
-(-1.0,0):(   1.85081571768093,  0               )
-(-0.5,0):(   1.13949392732455,  0               )
-( 0.0,0):(   1               ,  0               )
-( 0.5,0):(   1.13949392732455,  0               )
-( 1.0,0):(   1.85081571768093,  0               )
-( 2.0,0):(  -2.40299796172238,  0               )
-
-&sec
-( 2, 3):( -0.04167496441114,  0.09061113719624)
-(-2, 3):( -0.04167496441114, -0.09061113719624)
-(-2,-3):( -0.04167496441114,  0.09061113719624)
-( 2,-3):( -0.04167496441114, -0.09061113719624)
-
-&csc
-(-2.0,0):(  -1.09975017029462,  0               )
-(-1.0,0):(  -1.18839510577812,  0               )
-(-0.5,0):(  -2.08582964293349,  0               )
-( 0.5,0):(   2.08582964293349,  0               )
-( 1.0,0):(   1.18839510577812,  0               )
-( 2.0,0):(   1.09975017029462,  0               )
-
-&csc
-( 2, 3):(  0.09047320975321,  0.04120098628857)
-(-2, 3):( -0.09047320975321,  0.04120098628857)
-(-2,-3):( -0.09047320975321, -0.04120098628857)
-( 2,-3):(  0.09047320975321, -0.04120098628857)
-
-&cot
-(-2.0,0):(   0.45765755436029,  0               )
-(-1.0,0):(  -0.64209261593433,  0               )
-(-0.5,0):(  -1.83048772171245,  0               )
-( 0.5,0):(   1.83048772171245,  0               )
-( 1.0,0):(   0.64209261593433,  0               )
-( 2.0,0):(  -0.45765755436029,  0               )
-
-&cot
-( 2, 3):( -0.00373971037634, -0.99675779656936)
-(-2, 3):(  0.00373971037634, -0.99675779656936)
-(-2,-3):(  0.00373971037634,  0.99675779656936)
-( 2,-3):( -0.00373971037634,  0.99675779656936)
-
-&asin
-(-2.0,0):(  -1.57079632679490,  1.31695789692482)
-(-1.0,0):(  -1.57079632679490,  0               )
-(-0.5,0):(  -0.52359877559830,  0               )
-( 0.0,0):(   0               ,  0               )
-( 0.5,0):(   0.52359877559830,  0               )
-( 1.0,0):(   1.57079632679490,  0               )
-( 2.0,0):(   1.57079632679490, -1.31695789692482)
-
-&asin
-( 2, 3):(  0.57065278432110,  1.98338702991654)
-(-2, 3):( -0.57065278432110,  1.98338702991654)
-(-2,-3):( -0.57065278432110, -1.98338702991654)
-( 2,-3):(  0.57065278432110, -1.98338702991654)
-
-&acos
-(-2.0,0):(   3.14159265358979, -1.31695789692482)
-(-1.0,0):(   3.14159265358979,  0               )
-(-0.5,0):(   2.09439510239320,  0               )
-( 0.0,0):(   1.57079632679490,  0               )
-( 0.5,0):(   1.04719755119660,  0               )
-( 1.0,0):(   0               ,  0               )
-( 2.0,0):(   0               ,  1.31695789692482)
-
-&acos
-( 2, 3):(  1.00014354247380, -1.98338702991654)
-(-2, 3):(  2.14144911111600, -1.98338702991654)
-(-2,-3):(  2.14144911111600,  1.98338702991654)
-( 2,-3):(  1.00014354247380,  1.98338702991654)
-
-&atan
-(-2.0,0):(  -1.10714871779409,  0               )
-(-1.0,0):(  -0.78539816339745,  0               )
-(-0.5,0):(  -0.46364760900081,  0               )
-( 0.0,0):(   0               ,  0               )
-( 0.5,0):(   0.46364760900081,  0               )
-( 1.0,0):(   0.78539816339745,  0               )
-( 2.0,0):(   1.10714871779409,  0               )
-
-&atan
-( 2, 3):(  1.40992104959658,  0.22907268296854)
-(-2, 3):( -1.40992104959658,  0.22907268296854)
-(-2,-3):( -1.40992104959658, -0.22907268296854)
-( 2,-3):(  1.40992104959658, -0.22907268296854)
-
-&asec
-(-2.0,0):(   2.09439510239320,  0               )
-(-1.0,0):(   3.14159265358979,  0               )
-(-0.5,0):(   3.14159265358979, -1.31695789692482)
-( 0.5,0):(   0               ,  1.31695789692482)
-( 1.0,0):(   0               ,  0               )
-( 2.0,0):(   1.04719755119660,  0               )
-
-&asec
-( 2, 3):(  1.42041072246703,  0.23133469857397)
-(-2, 3):(  1.72118193112276,  0.23133469857397)
-(-2,-3):(  1.72118193112276, -0.23133469857397)
-( 2,-3):(  1.42041072246703, -0.23133469857397)
-
-&acsc
-(-2.0,0):(  -0.52359877559830,  0               )
-(-1.0,0):(  -1.57079632679490,  0               )
-(-0.5,0):(  -1.57079632679490,  1.31695789692482)
-( 0.5,0):(   1.57079632679490, -1.31695789692482)
-( 1.0,0):(   1.57079632679490,  0               )
-( 2.0,0):(   0.52359877559830,  0               )
-
-&acsc
-( 2, 3):(  0.15038560432786, -0.23133469857397)
-(-2, 3):( -0.15038560432786, -0.23133469857397)
-(-2,-3):( -0.15038560432786,  0.23133469857397)
-( 2,-3):(  0.15038560432786,  0.23133469857397)
-
-&acot
-(-2.0,0):(  -0.46364760900081,  0               )
-(-1.0,0):(  -0.78539816339745,  0               )
-(-0.5,0):(  -1.10714871779409,  0               )
-( 0.5,0):(   1.10714871779409,  0               )
-( 1.0,0):(   0.78539816339745,  0               )
-( 2.0,0):(   0.46364760900081,  0               )
-
-&acot
-( 2, 3):(  0.16087527719832, -0.22907268296854)
-(-2, 3):( -0.16087527719832, -0.22907268296854)
-(-2,-3):( -0.16087527719832,  0.22907268296854)
-( 2,-3):(  0.16087527719832,  0.22907268296854)
-
-&sinh
-(-2.0,0):(  -3.62686040784702,  0               )
-(-1.0,0):(  -1.17520119364380,  0               )
-(-0.5,0):(  -0.52109530549375,  0               )
-( 0.0,0):(   0               ,  0               )
-( 0.5,0):(   0.52109530549375,  0               )
-( 1.0,0):(   1.17520119364380,  0               )
-( 2.0,0):(   3.62686040784702,  0               )
-
-&sinh
-( 2, 3):( -3.59056458998578,  0.53092108624852)
-(-2, 3):(  3.59056458998578,  0.53092108624852)
-(-2,-3):(  3.59056458998578, -0.53092108624852)
-( 2,-3):( -3.59056458998578, -0.53092108624852)
-
-&cosh
-(-2.0,0):(   3.76219569108363,  0               )
-(-1.0,0):(   1.54308063481524,  0               )
-(-0.5,0):(   1.12762596520638,  0               )
-( 0.0,0):(   1               ,  0               )
-( 0.5,0):(   1.12762596520638,  0               )
-( 1.0,0):(   1.54308063481524,  0               )
-( 2.0,0):(   3.76219569108363,  0               )
-
-&cosh
-( 2, 3):( -3.72454550491532,  0.51182256998738)
-(-2, 3):( -3.72454550491532, -0.51182256998738)
-(-2,-3):( -3.72454550491532,  0.51182256998738)
-( 2,-3):( -3.72454550491532, -0.51182256998738)
-
-&tanh
-(-2.0,0):(  -0.96402758007582,  0               )
-(-1.0,0):(  -0.76159415595576,  0               )
-(-0.5,0):(  -0.46211715726001,  0               )
-( 0.0,0):(   0               ,  0               )
-( 0.5,0):(   0.46211715726001,  0               )
-( 1.0,0):(   0.76159415595576,  0               )
-( 2.0,0):(   0.96402758007582,  0               )
-
-&tanh
-( 2, 3):(  0.96538587902213, -0.00988437503832)
-(-2, 3):( -0.96538587902213, -0.00988437503832)
-(-2,-3):( -0.96538587902213,  0.00988437503832)
-( 2,-3):(  0.96538587902213,  0.00988437503832)
-
-&sech
-(-2.0,0):(   0.26580222883408,  0               )
-(-1.0,0):(   0.64805427366389,  0               )
-(-0.5,0):(   0.88681888397007,  0               )
-( 0.0,0):(   1               ,  0               )
-( 0.5,0):(   0.88681888397007,  0               )
-( 1.0,0):(   0.64805427366389,  0               )
-( 2.0,0):(   0.26580222883408,  0               )
-
-&sech
-( 2, 3):( -0.26351297515839, -0.03621163655877)
-(-2, 3):( -0.26351297515839,  0.03621163655877)
-(-2,-3):( -0.26351297515839, -0.03621163655877)
-( 2,-3):( -0.26351297515839,  0.03621163655877)
-
-&csch
-(-2.0,0):(  -0.27572056477178,  0               )
-(-1.0,0):(  -0.85091812823932,  0               )
-(-0.5,0):(  -1.91903475133494,  0               )
-( 0.5,0):(   1.91903475133494,  0               )
-( 1.0,0):(   0.85091812823932,  0               )
-( 2.0,0):(   0.27572056477178,  0               )
-
-&csch
-( 2, 3):( -0.27254866146294, -0.04030057885689)
-(-2, 3):(  0.27254866146294, -0.04030057885689)
-(-2,-3):(  0.27254866146294,  0.04030057885689)
-( 2,-3):( -0.27254866146294,  0.04030057885689)
-
-&coth
-(-2.0,0):(  -1.03731472072755,  0               )
-(-1.0,0):(  -1.31303528549933,  0               )
-(-0.5,0):(  -2.16395341373865,  0               )
-( 0.5,0):(   2.16395341373865,  0               )
-( 1.0,0):(   1.31303528549933,  0               )
-( 2.0,0):(   1.03731472072755,  0               )
-
-&coth
-( 2, 3):(  1.03574663776500,  0.01060478347034)
-(-2, 3):( -1.03574663776500,  0.01060478347034)
-(-2,-3):( -1.03574663776500, -0.01060478347034)
-( 2,-3):(  1.03574663776500, -0.01060478347034)
-
-&asinh
-(-2.0,0):(  -1.44363547517881,  0               )
-(-1.0,0):(  -0.88137358701954,  0               )
-(-0.5,0):(  -0.48121182505960,  0               )
-( 0.0,0):(   0               ,  0               )
-( 0.5,0):(   0.48121182505960,  0               )
-( 1.0,0):(   0.88137358701954,  0               )
-( 2.0,0):(   1.44363547517881,  0               )
-
-&asinh
-( 2, 3):(  1.96863792579310,  0.96465850440760)
-(-2, 3):( -1.96863792579310,  0.96465850440761)
-(-2,-3):( -1.96863792579310, -0.96465850440761)
-( 2,-3):(  1.96863792579310, -0.96465850440760)
-
-&acosh
-(-2.0,0):(   1.31695789692482,  3.14159265358979)
-(-1.0,0):(   0,                 3.14159265358979)
-(-0.5,0):(   0,                 2.09439510239320)
-( 0.0,0):(   0,                 1.57079632679490)
-( 0.5,0):(   0,                 1.04719755119660)
-( 1.0,0):(   0               ,  0               )
-( 2.0,0):(   1.31695789692482,  0               )
-
-&acosh
-( 2, 3):(  1.98338702991654,  1.00014354247380)
-(-2, 3):(  1.98338702991653,  2.14144911111600)
-(-2,-3):(  1.98338702991653, -2.14144911111600)
-( 2,-3):(  1.98338702991654, -1.00014354247380)
-
-&atanh
-(-2.0,0):(  -0.54930614433405,  1.57079632679490)
-(-0.5,0):(  -0.54930614433405,  0               )
-( 0.0,0):(   0               ,  0               )
-( 0.5,0):(   0.54930614433405,  0               )
-( 2.0,0):(   0.54930614433405,  1.57079632679490)
-
-&atanh
-( 2, 3):(  0.14694666622553,  1.33897252229449)
-(-2, 3):( -0.14694666622553,  1.33897252229449)
-(-2,-3):( -0.14694666622553, -1.33897252229449)
-( 2,-3):(  0.14694666622553, -1.33897252229449)
-
-&asech
-(-2.0,0):(   0               , 2.09439510239320)
-(-1.0,0):(   0               , 3.14159265358979)
-(-0.5,0):(   1.31695789692482, 3.14159265358979)
-( 0.5,0):(   1.31695789692482, 0               )
-( 1.0,0):(   0               , 0               )
-( 2.0,0):(   0               , 1.04719755119660)
-
-&asech
-( 2, 3):(  0.23133469857397, -1.42041072246703)
-(-2, 3):(  0.23133469857397, -1.72118193112276)
-(-2,-3):(  0.23133469857397,  1.72118193112276)
-( 2,-3):(  0.23133469857397,  1.42041072246703)
-
-&acsch
-(-2.0,0):(  -0.48121182505960, 0               )
-(-1.0,0):(  -0.88137358701954, 0               )
-(-0.5,0):(  -1.44363547517881, 0               )
-( 0.5,0):(   1.44363547517881, 0               )
-( 1.0,0):(   0.88137358701954, 0               )
-( 2.0,0):(   0.48121182505960, 0               )
-
-&acsch
-( 2, 3):(  0.15735549884499, -0.22996290237721)
-(-2, 3):( -0.15735549884499, -0.22996290237721)
-(-2,-3):( -0.15735549884499,  0.22996290237721)
-( 2,-3):(  0.15735549884499,  0.22996290237721)
-
-&acoth
-(-2.0,0):(  -0.54930614433405, 0               )
-(-0.5,0):(  -0.54930614433405, 1.57079632679490)
-( 0.5,0):(   0.54930614433405, 1.57079632679490)
-( 2.0,0):(   0.54930614433405, 0               )
-
-&acoth
-( 2, 3):(  0.14694666622553, -0.23182380450040)
-(-2, 3):( -0.14694666622553, -0.23182380450040)
-(-2,-3):( -0.14694666622553,  0.23182380450040)
-( 2,-3):(  0.14694666622553,  0.23182380450040)
-
-# eof
diff --git a/gnu/usr.bin/perl/cpan/Math-Complex/t/Trig.t b/gnu/usr.bin/perl/cpan/Math-Complex/t/Trig.t
deleted file mode 100755 (executable)
index a9a1255..0000000
+++ /dev/null
@@ -1,387 +0,0 @@
-#!./perl
-
-#
-# Regression tests for the Math::Trig package
-#
-# The tests here are quite modest as the Math::Complex tests exercise
-# these interfaces quite vigorously.
-# 
-# -- Jarkko Hietaniemi, April 1997
-
-use strict;
-use warnings;
-use Test::More tests => 153;
-
-use Math::Trig 1.18;
-use Math::Trig 1.18 qw(:pi Inf);
-
-our $vax_float = (pack("d",1) =~ /^[\x80\x10]\x40/);
-our $has_inf   = !$vax_float;
-
-my $pip2 = pi / 2;
-
-use strict;
-
-our($x, $y, $z);
-
-my $eps = 1e-11;
-
-if ($^O eq 'unicos') { # See lib/Math/Complex.pm and t/lib/complex.t.
-    $eps = 1e-10;
-}
-
-sub near {
-    my $e = defined $_[2] ? $_[2] : $eps;
-    my $d = $_[1] ? abs($_[0]/$_[1] - 1) : abs($_[0]);
-    print "# near? $_[0] $_[1] : $d : $e\n";
-    $_[1] ? ($d < $e) : abs($_[0]) < $e;
-}
-
-print "# Sanity checks\n";
-
-ok(near(sin(1), 0.841470984807897));
-ok(near(cos(1), 0.54030230586814));
-ok(near(tan(1), 1.5574077246549));
-
-ok(near(sec(1), 1.85081571768093));
-ok(near(csc(1), 1.18839510577812));
-ok(near(cot(1), 0.642092615934331));
-
-ok(near(asin(1), 1.5707963267949));
-ok(near(acos(1), 0));
-ok(near(atan(1), 0.785398163397448));
-
-ok(near(asec(1), 0));
-ok(near(acsc(1), 1.5707963267949));
-ok(near(acot(1), 0.785398163397448));
-
-ok(near(sinh(1), 1.1752011936438));
-ok(near(cosh(1), 1.54308063481524));
-ok(near(tanh(1), 0.761594155955765));
-
-ok(near(sech(1), 0.648054273663885));
-ok(near(csch(1), 0.850918128239322));
-ok(near(coth(1), 1.31303528549933));
-
-ok(near(asinh(1), 0.881373587019543));
-ok(near(acosh(1), 0));
-ok(near(atanh(0.9), 1.47221948958322)); # atanh(1.0) would be an error.
-
-ok(near(asech(0.9), 0.467145308103262));
-ok(near(acsch(2), 0.481211825059603));
-ok(near(acoth(2), 0.549306144334055));
-
-print "# Basics\n";
-
-$x = 0.9;
-ok(near(tan($x), sin($x) / cos($x)));
-
-ok(near(sinh(2), 3.62686040784702));
-
-ok(near(acsch(0.1), 2.99822295029797));
-
-$x = asin(2);
-is(ref $x, 'Math::Complex');
-
-# avoid using Math::Complex here
-$x =~ /^([^-]+)(-[^i]+)i$/;
-($y, $z) = ($1, $2);
-ok(near($y,  1.5707963267949));
-ok(near($z, -1.31695789692482));
-
-ok(near(deg2rad(90), pi/2));
-
-ok(near(rad2deg(pi), 180));
-
-use Math::Trig ':radial';
-
-{
-    my ($r,$t,$z) = cartesian_to_cylindrical(1,1,1);
-
-    ok(near($r, sqrt(2)));
-    ok(near($t, deg2rad(45)));
-    ok(near($z, 1));
-
-    ($x,$y,$z) = cylindrical_to_cartesian($r, $t, $z);
-
-    ok(near($x, 1));
-    ok(near($y, 1));
-    ok(near($z, 1));
-
-    ($r,$t,$z) = cartesian_to_cylindrical(1,1,0);
-
-    ok(near($r, sqrt(2)));
-    ok(near($t, deg2rad(45)));
-    ok(near($z, 0));
-
-    ($x,$y,$z) = cylindrical_to_cartesian($r, $t, $z);
-
-    ok(near($x, 1));
-    ok(near($y, 1));
-    ok(near($z, 0));
-}
-
-{
-    my ($r,$t,$f) = cartesian_to_spherical(1,1,1);
-
-    ok(near($r, sqrt(3)));
-    ok(near($t, deg2rad(45)));
-    ok(near($f, atan2(sqrt(2), 1)));
-
-    ($x,$y,$z) = spherical_to_cartesian($r, $t, $f);
-
-    ok(near($x, 1));
-    ok(near($y, 1));
-    ok(near($z, 1));
-       
-    ($r,$t,$f) = cartesian_to_spherical(1,1,0);
-
-    ok(near($r, sqrt(2)));
-    ok(near($t, deg2rad(45)));
-    ok(near($f, deg2rad(90)));
-
-    ($x,$y,$z) = spherical_to_cartesian($r, $t, $f);
-
-    ok(near($x, 1));
-    ok(near($y, 1));
-    ok(near($z, 0));
-}
-
-{
-    my ($r,$t,$z) = cylindrical_to_spherical(spherical_to_cylindrical(1,1,1));
-
-    ok(near($r, 1));
-    ok(near($t, 1));
-    ok(near($z, 1));
-
-    ($r,$t,$z) = spherical_to_cylindrical(cylindrical_to_spherical(1,1,1));
-
-    ok(near($r, 1));
-    ok(near($t, 1));
-    ok(near($z, 1));
-}
-
-{
-    use Math::Trig 'great_circle_distance';
-
-    ok(near(great_circle_distance(0, 0, 0, pi/2), pi/2));
-
-    ok(near(great_circle_distance(0, 0, pi, pi), pi));
-
-    # London to Tokyo.
-    my @L = (deg2rad(-0.5),  deg2rad(90 - 51.3));
-    my @T = (deg2rad(139.8), deg2rad(90 - 35.7));
-
-    my $km = great_circle_distance(@L, @T, 6378);
-
-    ok(near($km, 9605.26637021388));
-}
-
-{
-    my $R2D = 57.295779513082320876798154814169;
-
-    sub frac { $_[0] - int($_[0]) }
-
-    my $lotta_radians = deg2rad(1E+20, 1);
-    ok(near($lotta_radians,  1E+20/$R2D));
-
-    my $negat_degrees = rad2deg(-1E20, 1);
-    ok(near($negat_degrees, -1E+20*$R2D));
-
-    my $posit_degrees = rad2deg(-10000, 1);
-    ok(near($posit_degrees, -10000*$R2D));
-}
-
-{
-    use Math::Trig 'great_circle_direction';
-
-    ok(near(great_circle_direction(0, 0, 0, pi/2), pi));
-
-# Retired test: Relies on atan2(0, 0), which is not portable.
-#      ok(near(great_circle_direction(0, 0, pi, pi), -pi()/2));
-
-    my @London  = (deg2rad(  -0.167), deg2rad(90 - 51.3));
-    my @Tokyo   = (deg2rad( 139.5),   deg2rad(90 - 35.7));
-    my @Berlin  = (deg2rad ( 13.417), deg2rad(90 - 52.533));
-    my @Paris   = (deg2rad (  2.333), deg2rad(90 - 48.867));
-
-    ok(near(rad2deg(great_circle_direction(@London, @Tokyo)),
-           31.791945393073));
-
-    ok(near(rad2deg(great_circle_direction(@Tokyo, @London)),
-           336.069766430326));
-
-    ok(near(rad2deg(great_circle_direction(@Berlin, @Paris)),
-           246.800348034667));
-    
-    ok(near(rad2deg(great_circle_direction(@Paris, @Berlin)),
-           58.2079877553156));
-
-    use Math::Trig 'great_circle_bearing';
-
-    ok(near(rad2deg(great_circle_bearing(@Paris, @Berlin)),
-           58.2079877553156));
-
-    use Math::Trig 'great_circle_waypoint';
-    use Math::Trig 'great_circle_midpoint';
-
-    my ($lon, $lat);
-
-    ($lon, $lat) = great_circle_waypoint(@London, @Tokyo, 0.0);
-
-    ok(near($lon, $London[0]));
-
-    ok(near($lat, $London[1]));
-
-    ($lon, $lat) = great_circle_waypoint(@London, @Tokyo, 1.0);
-
-    ok(near($lon, $Tokyo[0]));
-
-    ok(near($lat, $Tokyo[1]));
-
-    ($lon, $lat) = great_circle_waypoint(@London, @Tokyo, 0.5);
-
-    ok(near($lon, 1.55609593577679)); # 89.16 E
-
-    ok(near($lat, 0.36783532946162)); # 68.93 N
-
-    ($lon, $lat) = great_circle_midpoint(@London, @Tokyo);
-
-    ok(near($lon, 1.55609593577679)); # 89.16 E
-
-    ok(near($lat, 0.367835329461615)); # 68.93 N
-
-    ($lon, $lat) = great_circle_waypoint(@London, @Tokyo, 0.25);
-
-    ok(near($lon, 0.516073562850837)); # 29.57 E
-
-    ok(near($lat, 0.400231313403387)); # 67.07 N
-
-    ($lon, $lat) = great_circle_waypoint(@London, @Tokyo, 0.75);
-
-    ok(near($lon, 2.17494903805952)); # 124.62 E
-
-    ok(near($lat, 0.617809294053591)); # 54.60 N
-
-    use Math::Trig 'great_circle_destination';
-
-    my $dir1 = great_circle_direction(@London, @Tokyo);
-    my $dst1 = great_circle_distance(@London,  @Tokyo);
-
-    ($lon, $lat) = great_circle_destination(@London, $dir1, $dst1);
-
-    ok(near($lon, $Tokyo[0]));
-
-    ok(near($lat, $pip2 - $Tokyo[1]));
-
-    my $dir2 = great_circle_direction(@Tokyo, @London);
-    my $dst2 = great_circle_distance(@Tokyo,  @London);
-
-    ($lon, $lat) = great_circle_destination(@Tokyo, $dir2, $dst2);
-
-    ok(near($lon, $London[0]));
-
-    ok(near($lat, $pip2 - $London[1]));
-
-    my $dir3 = (great_circle_destination(@London, $dir1, $dst1))[2];
-
-    ok(near($dir3, 2.69379263839118)); # about 154.343 deg
-
-    my $dir4 = (great_circle_destination(@Tokyo,  $dir2, $dst2))[2];
-
-    ok(near($dir4, 3.6993902625701)); # about 211.959 deg
-
-    ok(near($dst1, $dst2));
-}
-
-SKIP: {
-# With netbsd-vax (or any vax) there is neither Inf, nor 1e40.
-skip("different float range", 42) if $vax_float;
-skip("no inf",                42) unless $has_inf;
-
-print "# Infinity\n";
-
-my $BigDouble = eval '1e40';
-
-# E.g. netbsd-alpha core dumps on Inf arith without this.
-local $SIG{FPE} = sub { };
-
-ok(Inf() > $BigDouble);  # This passes in netbsd-alpha.
-ok(Inf() + $BigDouble > $BigDouble); # This coredumps in netbsd-alpha.
-ok(Inf() + $BigDouble == Inf());
-ok(Inf() - $BigDouble > $BigDouble);
-ok(Inf() - $BigDouble == Inf());
-ok(Inf() * $BigDouble > $BigDouble);
-ok(Inf() * $BigDouble == Inf());
-ok(Inf() / $BigDouble > $BigDouble);
-ok(Inf() / $BigDouble == Inf());
-
-ok(-Inf() < -$BigDouble);
-ok(-Inf() + $BigDouble < $BigDouble);
-ok(-Inf() + $BigDouble == -Inf());
-ok(-Inf() - $BigDouble < -$BigDouble);
-ok(-Inf() - $BigDouble == -Inf());
-ok(-Inf() * $BigDouble < -$BigDouble);
-ok(-Inf() * $BigDouble == -Inf());
-ok(-Inf() / $BigDouble < -$BigDouble);
-ok(-Inf() / $BigDouble == -Inf());
-
-print "# sinh/sech/cosh/csch/tanh/coth unto infinity\n";
-
-ok(near(sinh(100), eval '1.3441e+43', 1e-3));
-ok(near(sech(100), eval '7.4402e-44', 1e-3));
-ok(near(cosh(100), eval '1.3441e+43', 1e-3));
-ok(near(csch(100), eval '7.4402e-44', 1e-3));
-ok(near(tanh(100), 1));
-ok(near(coth(100), 1));
-
-ok(near(sinh(-100), eval '-1.3441e+43', 1e-3));
-ok(near(sech(-100), eval ' 7.4402e-44', 1e-3));
-ok(near(cosh(-100), eval ' 1.3441e+43', 1e-3));
-ok(near(csch(-100), eval '-7.4402e-44', 1e-3));
-ok(near(tanh(-100), -1));
-ok(near(coth(-100), -1));
-
-cmp_ok(sinh(1e5), '==', Inf());
-cmp_ok(sech(1e5), '==', 0);
-cmp_ok(cosh(1e5), '==', Inf());
-cmp_ok(csch(1e5), '==', 0);
-cmp_ok(tanh(1e5), '==', 1);
-cmp_ok(coth(1e5), '==', 1);
-
-cmp_ok(sinh(-1e5), '==', -Inf());
-cmp_ok(sech(-1e5), '==', 0);
-cmp_ok(cosh(-1e5), '==', Inf());
-cmp_ok(csch(-1e5), '==', 0);
-cmp_ok(tanh(-1e5), '==', -1);
-cmp_ok(coth(-1e5), '==', -1);
-
-}
-
-print "# great_circle_distance with small angles\n";
-
-for my $e (qw(1e-2 1e-3 1e-4 1e-5)) {
-    # Can't assume == 0 because of floating point fuzz,
-    # but let's hope for at least < $e.
-    cmp_ok(great_circle_distance(0, $e, 0, $e), '<', $e);
-}
-
-print "# asin_real, acos_real\n";
-
-is(acos_real(-2.0), pi);
-is(acos_real(-1.0), pi);
-is(acos_real(-0.5), acos(-0.5));
-is(acos_real( 0.0), acos( 0.0));
-is(acos_real( 0.5), acos( 0.5));
-is(acos_real( 1.0), 0);
-is(acos_real( 2.0), 0);
-
-is(asin_real(-2.0), -&pip2);
-is(asin_real(-1.0), -&pip2);
-is(asin_real(-0.5), asin(-0.5));
-is(asin_real( 0.0), asin( 0.0));
-is(asin_real( 0.5), asin( 0.5));
-is(asin_real( 1.0),  pip2);
-is(asin_real( 2.0),  pip2);
-
-# eof
diff --git a/gnu/usr.bin/perl/cpan/Math-Complex/t/underbar.t b/gnu/usr.bin/perl/cpan/Math-Complex/t/underbar.t
deleted file mode 100755 (executable)
index 809e880..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-#
-# Tests that the standard Perl 5 functions that we override
-# that operate on the $_ will work correctly [perl #62412]
-#
-
-use Test::More;
-
-use strict;
-use warnings;
-
-my @f = qw(abs cos exp log sin sqrt);
-
-plan tests => scalar @f;
-
-use Math::Complex;
-
-my %CORE;
-
-for my $f (@f) {
-    local $_ = 0.5;
-    $CORE{$f} = eval "CORE::$f";
-}
-
-for my $f (@f) {
-    local $_ = 0.5;
-    is(eval "Math::Complex::$f", $CORE{$f}, $f);
-}
-
index f4e6522..845e0b0 100644 (file)
 # -*- mode: perl; perl-indent-level: 2; -*-
+# vim: ts=8 sw=2 sts=2 noexpandtab
+
 # Memoize.pm
 #
-# Transparent memoization of idempotent functions
-#
 # Copyright 1998, 1999, 2000, 2001, 2012 M. J. Dominus.
 # You may copy and distribute this program under the
-# same terms as Perl itself.  If in doubt, 
-# write to mjd-perl-memoize+@plover.com for a license.
-
-package Memoize;
-$VERSION = '1.03_01';
-
-# Compile-time constants
-sub SCALAR () { 0 } 
-sub LIST () { 1 } 
+# same terms as Perl itself.
 
+use strict; use warnings;
 
-#
-# Usage memoize(functionname/ref,
-#               { NORMALIZER => coderef, INSTALL => name,
-#                 LIST_CACHE => descriptor, SCALAR_CACHE => descriptor }
-#
+package Memoize;
+our $VERSION = '1.16';
 
 use Carp;
-use Exporter;
-use vars qw($DEBUG);
-use Config;                     # Dammit.
-@ISA = qw(Exporter);
-@EXPORT = qw(memoize);
-@EXPORT_OK = qw(unmemoize flush_cache);
-use strict;
+use Scalar::Util 1.11 (); # for set_prototype
 
-my %memotable;
-my %revmemotable;
-my @CONTEXT_TAGS = qw(MERGE TIE MEMORY FAULT HASH);
-my %IS_CACHE_TAG = map {($_ => 1)} @CONTEXT_TAGS;
+BEGIN { require Exporter; *import = \&Exporter::import }
+our @EXPORT = qw(memoize);
+our @EXPORT_OK = qw(unmemoize flush_cache);
 
-# Raise an error if the user tries to specify one of thesepackage as a
-# tie for LIST_CACHE
+my %memotable;
 
-my %scalar_only = map {($_ => 1)} qw(DB_File GDBM_File SDBM_File ODBM_File NDBM_File);
+sub CLONE {
+  my @info = values %memotable;
+  %memotable = map +($_->{WRAPPER} => $_), @info;
+}
 
 sub memoize {
   my $fn = shift;
   my %options = @_;
-  my $options = \%options;
-  
+
   unless (defined($fn) && 
          (ref $fn eq 'CODE' || ref $fn eq '')) {
     croak "Usage: memoize 'functionname'|coderef {OPTIONS}";
   }
 
   my $uppack = caller;         # TCL me Elmo!
-  my $cref;                    # Code reference to original function
   my $name = (ref $fn ? undef : $fn);
-
-  # Convert function names to code references
-  $cref = &_make_cref($fn, $uppack);
-
-  # Locate function prototype, if any
-  my $proto = prototype $cref;
-  if (defined $proto) { $proto = "($proto)" }
-  else { $proto = "" }
-
-  # I would like to get rid of the eval, but there seems not to be any
-  # other way to set the prototype properly.  The switch here for
-  # 'usethreads' works around a bug in threadperl having to do with
-  # magic goto.  It would be better to fix the bug and use the magic
-  # goto version everywhere.
-  my $wrapper = 
-      $Config{usethreads} 
-        ? eval "sub $proto { &_memoizer(\$cref, \@_); }" 
-        : eval "sub $proto { unshift \@_, \$cref; goto &_memoizer; }";
+  my $cref = _make_cref($fn, $uppack);
 
   my $normalizer = $options{NORMALIZER};
   if (defined $normalizer  && ! ref $normalizer) {
     $normalizer = _make_cref($normalizer, $uppack);
   }
-  
-  my $install_name;
-  if (defined $options->{INSTALL}) {
-    # INSTALL => name
-    $install_name = $options->{INSTALL};
-  } elsif (! exists $options->{INSTALL}) {
-    # No INSTALL option provided; use original name if possible
-    $install_name = $name;
-  } else {
-    # INSTALL => undef  means don't install
-  }
+
+  my $install_name = exists $options{INSTALL}
+    ? $options{INSTALL} # use given name (or, if undef: do not install)
+    : $name; # no INSTALL option provided: default to original name if possible
 
   if (defined $install_name) {
     $install_name = $uppack . '::' . $install_name
        unless $install_name =~ /::/;
-    no strict;
-    local($^W) = 0;           # ``Subroutine $install_name redefined at ...''
-    *{$install_name} = $wrapper; # Install memoized version
   }
 
-  $revmemotable{$wrapper} = "" . $cref; # Turn code ref into hash key
+  # convert LIST_CACHE => MERGE to SCALAR_CACHE => MERGE
+  # to ensure TIE/HASH will always be checked by _check_suitable
+  if (($options{LIST_CACHE} || '') eq 'MERGE') {
+    $options{LIST_CACHE} = $options{SCALAR_CACHE};
+    $options{SCALAR_CACHE} = 'MERGE';
+  }
 
   # These will be the caches
   my %caches;
-  for my $context (qw(SCALAR LIST)) {
-    # suppress subsequent 'uninitialized value' warnings
-    $options{"${context}_CACHE"} ||= ''; 
-
-    my $cache_opt = $options{"${context}_CACHE"};
-    my @cache_opt_args;
-    if (ref $cache_opt) {
-      @cache_opt_args = @$cache_opt;
-      $cache_opt = shift @cache_opt_args;
-    }
+  for my $context (qw(LIST SCALAR)) { # SCALAR_CACHE must be last, to process MERGE
+    my $fullopt = $options{"${context}_CACHE"} ||= 'MEMORY';
+    my ($cache_opt, @cache_opt_args) = ref $fullopt ? @$fullopt : $fullopt;
     if ($cache_opt eq 'FAULT') { # no cache
       $caches{$context} = undef;
     } elsif ($cache_opt eq 'HASH') { # user-supplied hash
       my $cache = $cache_opt_args[0];
-      my $package = ref(tied %$cache);
-      if ($context eq 'LIST' && $scalar_only{$package}) {
-        croak("You can't use $package for LIST_CACHE because it can only store scalars");
-      }
+      _check_suitable($context, ref tied %$cache);
       $caches{$context} = $cache;
-    } elsif ($cache_opt eq '' ||  $IS_CACHE_TAG{$cache_opt}) {
-      # default is that we make up an in-memory hash
+    } elsif ($cache_opt eq 'TIE') {
+      carp("TIE option to memoize() is deprecated; use HASH instead")
+        if warnings::enabled('all');
+      my $module = shift(@cache_opt_args) || '';
+      _check_suitable($context, $module);
+      my $hash = $caches{$context} = {};
+      (my $modulefile = $module . '.pm') =~ s{::}{/}g;
+      require $modulefile;
+      tie(%$hash, $module, @cache_opt_args)
+        or croak "Couldn't tie memoize hash to `$module': $!";
+    } elsif ($cache_opt eq 'MEMORY') {
       $caches{$context} = {};
-      # (this might get tied later, or MERGEd away)
+    } elsif ($cache_opt eq 'MERGE' and not ref $fullopt) { # ['MERGE'] was never supported
+      die "cannot MERGE $context\_CACHE" if $context ne 'SCALAR'; # should never happen
+      die 'bad cache setup order' if not exists $caches{LIST}; # should never happen
+      $options{MERGED} = 1;
+      $caches{SCALAR} = $caches{LIST};
     } else {
-      croak "Unrecognized option to `${context}_CACHE': `$cache_opt' should be one of (@CONTEXT_TAGS); aborting";
+      croak "Unrecognized option to `${context}_CACHE': `$cache_opt' should be one of (MERGE TIE MEMORY FAULT HASH)";
     }
   }
 
-  # Perhaps I should check here that you didn't supply *both* merge
-  # options.  But if you did, it does do something reasonable: They
-  # both get merged to the same in-memory hash.
-  if ($options{SCALAR_CACHE} eq 'MERGE' || $options{LIST_CACHE} eq 'MERGE') {
-    $options{MERGED} = 1;
-    $caches{SCALAR} = $caches{LIST};
-  }
+  my $wrapper = _wrap($install_name, $cref, $normalizer, $options{MERGED}, \%caches);
 
-  # Now deal with the TIE options
-  {
-    my $context;
-    foreach $context (qw(SCALAR LIST)) {
-      # If the relevant option wasn't `TIE', this call does nothing.
-      _my_tie($context, $caches{$context}, $options);  # Croaks on failure
-    }
+  if (defined $install_name) {
+    no strict;
+    no warnings 'redefine';
+    *{$install_name} = $wrapper;
   }
-  
-  # We should put some more stuff in here eventually.
-  # We've been saying that for serveral versions now.
-  # And you know what?  More stuff keeps going in!
-  $memotable{$cref} = 
-  {
-    O => $options,  # Short keys here for things we need to access frequently
-    N => $normalizer,
+
+  $memotable{$wrapper} = {
+    L => $caches{LIST},
+    S => $caches{SCALAR},
     U => $cref,
-    MEMOIZED => $wrapper,
-    PACKAGE => $uppack,
     NAME => $install_name,
-    S => $caches{SCALAR},
-    L => $caches{LIST},
+    WRAPPER => $wrapper,
   };
 
   $wrapper                     # Return just memoized version
 }
 
-# This function tries to load a tied hash class and tie the hash to it.
-sub _my_tie {
-  my ($context, $hash, $options) = @_;
-  my $fullopt = $options->{"${context}_CACHE"};
-
-  # We already checked to make sure that this works.
-  my $shortopt = (ref $fullopt) ? $fullopt->[0] : $fullopt;
-  
-  return unless defined $shortopt && $shortopt eq 'TIE';
-  carp("TIE option to memoize() is deprecated; use HASH instead")
-      if $^W;
-
-  my @args = ref $fullopt ? @$fullopt : ();
-  shift @args;
-  my $module = shift @args;
-  if ($context eq 'LIST' && $scalar_only{$module}) {
-    croak("You can't use $module for LIST_CACHE because it can only store scalars");
-  }
-  my $modulefile = $module . '.pm';
-  $modulefile =~ s{::}{/}g;
-  eval {
-    local @INC = @INC;
-    pop @INC if $INC[-1] eq '.';
-    require $modulefile
-  };
-  if ($@) {
-    croak "Memoize: Couldn't load hash tie module `$module': $@; aborting";
-  }
-  my $rc = (tie %$hash => $module, @args);
-  unless ($rc) {
-    croak "Memoize: Couldn't tie hash to `$module': $!; aborting";
-  }
-  1;
-}
-
 sub flush_cache {
   my $func = _make_cref($_[0], scalar caller);
-  my $info = $memotable{$revmemotable{$func}};
+  my $info = $memotable{$func};
   die "$func not memoized" unless defined $info;
   for my $context (qw(S L)) {
     my $cache = $info->{$context};
@@ -216,58 +129,39 @@ sub flush_cache {
   }
 }
 
-# This is the function that manages the memo tables.
-sub _memoizer {
-  my $orig = shift;            # stringized version of ref to original func.
-  my $info = $memotable{$orig};
-  my $normalizer = $info->{N};
-  
-  my $argstr;
-  my $context = (wantarray() ? LIST : SCALAR);
-
-  if (defined $normalizer) { 
-    no strict;
-    if ($context == SCALAR) {
-      $argstr = &{$normalizer}(@_);
-    } elsif ($context == LIST) {
-      ($argstr) = &{$normalizer}(@_);
-    } else {
-      croak "Internal error \#41; context was neither LIST nor SCALAR\n";
-    }
-  } else {                      # Default normalizer
-    local $^W = 0;
-    $argstr = join chr(28),@_;  
-  }
-
-  if ($context == SCALAR) {
-    my $cache = $info->{S};
-    _crap_out($info->{NAME}, 'scalar') unless $cache;
-    if (exists $cache->{$argstr}) { 
-      return $info->{O}{MERGED}
-        ? $cache->{$argstr}[0] : $cache->{$argstr};
-    } else {
-      my $val = &{$info->{U}}(@_);
-      # Scalars are considered to be lists; store appropriately
-      if ($info->{O}{MERGED}) {
-       $cache->{$argstr} = [$val];
-      } else {
-       $cache->{$argstr} = $val;
-      }
-      $val;
-    }
-  } elsif ($context == LIST) {
-    my $cache = $info->{L};
-    _crap_out($info->{NAME}, 'list') unless $cache;
-    if (exists $cache->{$argstr}) {
-      return @{$cache->{$argstr}};
+sub _wrap {
+  my ($name, $orig, $normalizer, $merged, $caches) = @_;
+  my ($cache_L, $cache_S) = @$caches{qw(LIST SCALAR)};
+  undef $caches; # keep the pad from keeping the hash alive forever
+  Scalar::Util::set_prototype(sub {
+    my $argstr = do {
+      no warnings 'uninitialized';
+      defined $normalizer
+        ? ( wantarray ? ( $normalizer->( @_ ) )[0] : $normalizer->( @_ ) )
+          . '' # coerce undef to string while the warning is off
+        : join chr(28), @_;
+    };
+
+    if (wantarray) {
+      _crap_out($name, 'list') unless $cache_L;
+      exists $cache_L->{$argstr} ? (
+        @{$cache_L->{$argstr}}
+      ) : do {
+        my @q = do { no warnings 'recursion'; &$orig };
+        $cache_L->{$argstr} = \@q;
+        @q;
+      };
     } else {
-      my @q = &{$info->{U}}(@_);
-      $cache->{$argstr} = \@q;
-      @q;
+      _crap_out($name, 'scalar') unless $cache_S;
+      exists $cache_S->{$argstr} ? (
+        $merged ? $cache_S->{$argstr}[0] : $cache_S->{$argstr}
+      ) : do {
+        my $val = do { no warnings 'recursion'; &$orig };
+        $cache_S->{$argstr} = $merged ? [$val] : $val;
+        $val;
+      };
     }
-  } else {
-    croak "Internal error \#42; context was neither LIST nor SCALAR\n";
-  }
+  }, prototype $orig);
 }
 
 sub unmemoize {
@@ -275,35 +169,21 @@ sub unmemoize {
   my $uppack = caller;
   my $cref = _make_cref($f, $uppack);
 
-  unless (exists $revmemotable{$cref}) {
+  unless (exists $memotable{$cref}) {
     croak "Could not unmemoize function `$f', because it was not memoized to begin with";
   }
-  
-  my $tabent = $memotable{$revmemotable{$cref}};
+
+  my $tabent = $memotable{$cref};
   unless (defined $tabent) {
     croak "Could not figure out how to unmemoize function `$f'";
   }
   my $name = $tabent->{NAME};
   if (defined $name) {
     no strict;
-    local($^W) = 0;           # ``Subroutine $install_name redefined at ...''
+    no warnings 'redefine';
     *{$name} = $tabent->{U}; # Replace with original function
   }
-  undef $memotable{$revmemotable{$cref}};
-  undef $revmemotable{$cref};
-
-  # This removes the last reference to the (possibly tied) memo tables
-  # my ($old_function, $memotabs) = @{$tabent}{'U','S','L'};
-  # undef $tabent; 
-
-#  # Untie the memo tables if they were tied.
-#  my $i;
-#  for $i (0,1) {
-#    if (tied %{$memotabs->[$i]}) {
-#      warn "Untying hash #$i\n";
-#      untie %{$memotabs->[$i]};
-#    }
-#  }
+  delete $memotable{$cref};
 
   $tabent->{U};
 }
@@ -332,7 +212,7 @@ sub _make_cref {
     my $parent = (caller(1))[3]; # Function that called _make_cref
     croak "Usage: argument 1 to `$parent' must be a function name or reference.\n";
   }
-  $DEBUG and warn "${name}($fn) => $cref in _make_cref\n";
+  our $DEBUG and warn "${name}($fn) => $cref in _make_cref\n";
   $cref;
 }
 
@@ -345,11 +225,20 @@ sub _crap_out {
   }
 }
 
-1;
-
+# Raise an error if the user tries to specify one of these packages as a
+# tie for LIST_CACHE
+my %scalar_only = map {($_ => 1)} qw(DB_File GDBM_File SDBM_File ODBM_File), map +($_, "Memoize::$_"), qw(AnyDBM_File NDBM_File);
+sub _check_suitable {
+  my ($context, $package) = @_;
+  croak "You can't use $package for LIST_CACHE because it can only store scalars"
+    if $context eq 'LIST' and $scalar_only{$package};
+}
 
+1;
 
+__END__
 
+=pod
 
 =head1 NAME
 
@@ -357,7 +246,6 @@ Memoize - Make functions faster by trading space for time
 
 =head1 SYNOPSIS
 
-        # This is the documentation for Memoize 1.03
        use Memoize;
        memoize('slow_function');
        slow_function(arguments);    # Is faster than it was before
@@ -384,12 +272,14 @@ Options include:
 
 =head1 DESCRIPTION
 
-`Memoizing' a function makes it faster by trading space for time.  It
+I<Memoizing> a function makes it faster by trading space for time. It
 does this by caching the return values of the function in a table.
 If you call the function again with the same arguments, C<memoize>
 jumps in and gives you the value out of the table, instead of letting
 the function compute the value all over again.
 
+=head1 EXAMPLE
+
 Here is an extreme example.  Consider the Fibonacci sequence, defined
 by the following function:
 
@@ -412,14 +302,14 @@ run---fib(14) makes 1,200 extra recursive calls to itself, to compute
 and recompute things that it already computed.
 
 This function is a good candidate for memoization.  If you memoize the
-`fib' function above, it will compute fib(14) exactly once, the first
+C<fib> function above, it will compute fib(14) exactly once, the first
 time it needs to, and then save the result in a table.  Then if you
 ask for fib(14) again, it gives you the result out of the table.
 While computing fib(14), instead of computing fib(12) twice, it does
 it once; the second time it needs the value it gets it from the table.
 It doesn't compute fib(11) four times; it computes it once, getting it
 from the table the next three times.  Instead of making 1,200
-recursive calls to `fib', it makes 15.  This makes the function about
+recursive calls to C<fib>, it makes 15. This makes the function about
 150 times faster.
 
 You could do the memoization yourself, by rewriting the function, like
@@ -446,8 +336,8 @@ This makes it easy to turn memoizing on and off.
 
 Here's an even simpler example: I wrote a simple ray tracer; the
 program would look in a certain direction, figure out what it was
-looking at, and then convert the `color' value (typically a string
-like `red') of that object to a red, green, and blue pixel value, like
+looking at, and then convert the C<color> value (typically a string
+like C<red>) of that object to a red, green, and blue pixel value, like
 this:
 
     for ($direction = 0; $direction < 300; $direction++) {
@@ -718,7 +608,7 @@ should abort the program.  The error message is one of
 =item C<MERGE>
 
 C<MERGE> normally means that the memoized function does not
-distinguish between list and sclar context, and that return values in
+distinguish between list and scalar context, and that return values in
 both contexts should be stored together.  Both C<LIST_CACHE =E<gt>
 MERGE> and C<SCALAR_CACHE =E<gt> MERGE> mean the same thing.
 
@@ -740,7 +630,7 @@ if C<complicated> is memoized:
     $z = complicated(142);
 
 The first call will cache the result, say 37, in the scalar cache; the
-second will cach the list C<(37)> in the list cache.  The third call
+second will cache the list C<(37)> in the list cache.  The third call
 doesn't call the real C<complicated> function; it gets the value 37
 from the scalar cache.
 
@@ -749,9 +639,11 @@ storing its return value is a waste of space.  Specifying C<LIST_CACHE
 =E<gt> MERGE> will make C<memoize> use the same cache for scalar and
 list context return values, so that the second call uses the scalar
 cache that was populated by the first call.  C<complicated> ends up
-being called only once, and both subsequent calls return C<3> from the
+being called only once, and both subsequent calls return C<37> from the
 cache, regardless of the calling context.
 
+=back
+
 =head3 List values in scalar context
 
 Consider this function:
@@ -783,7 +675,8 @@ stored in the same disk file; this saves you from having to deal with
 two disk files instead of one.  You can use a normalizer function to
 keep the two sets of return values separate.  For example:
 
-        tie my %cache => 'MLDBM', 'DB_File', $filename, ...;
+        local $MLDBM::UseDB = 'DB_File';
+        tie my %cache => 'MLDBM', $filename, ...;
 
        memoize 'myfunc',
          NORMALIZER => 'n',
@@ -801,8 +694,6 @@ This normalizer function will store scalar context return values in
 the disk file under keys that begin with C<S:>, and list context
 return values under keys that begin with C<L:>.
 
-=back
-
 =head1 OTHER FACILITIES
 
 =head2 C<unmemoize>
@@ -877,7 +768,7 @@ Do not memoize a function with side effects.
        }
 
 This function accepts two arguments, adds them, and prints their sum.
-Its return value is the numuber of characters it printed, but you
+Its return value is the number of characters it printed, but you
 probably didn't care about that.  But C<Memoize> doesn't understand
 that.  If you memoize this function, you will get the result you
 expect the first time you ask it to print the sum of 2 and 3, but
@@ -984,8 +875,8 @@ function (or when your program exits):
         tie my %cache => 'Memoize::Storable', $filename, 'nstore';
        memoize 'function', SCALAR_CACHE => [HASH => \%cache];
 
-Include the `nstore' option to have the C<Storable> database written
-in `network order'.  (See L<Storable> for more details about this.)
+Include the C<nstore> option to have the C<Storable> database written
+in I<network order>. (See L<Storable> for more details about this.)
 
 The C<flush_cache()> function will raise a run-time error unless the
 tied package provides a C<CLEAR> method.
@@ -1016,38 +907,17 @@ C<f()> (C<f> called with no arguments) will not be memoized.  If this
 is a big problem, you can supply a normalizer function that prepends
 C<"x"> to every key.
 
-=head1 MAILING LIST
-
-To join a very low-traffic mailing list for announcements about
-C<Memoize>, send an empty note to C<mjd-perl-memoize-request@plover.com>.
-
-=head1 AUTHOR
+=head1 SEE ALSO
 
-Mark-Jason Dominus (C<mjd-perl-memoize+@plover.com>), Plover Systems co.
-
-See the C<Memoize.pm> Page at http://perl.plover.com/Memoize/
-for news and upgrades.  Near this page, at
-http://perl.plover.com/MiniMemoize/ there is an article about
+At L<https://perl.plover.com/MiniMemoize/> there is an article about
 memoization and about the internals of Memoize that appeared in The
-Perl Journal, issue #13.  (This article is also included in the
-Memoize distribution as `article.html'.)
+Perl Journal, issue #13.
 
-The author's book I<Higher-Order Perl> (2005, ISBN 1558607013, published
+Mark-Jason Dominus's book I<Higher-Order Perl> (2005, ISBN 1558607013,
+published
 by Morgan Kaufmann) discusses memoization (and many other 
 topics) in tremendous detail. It is available on-line for free.
-For more information, visit http://hop.perl.plover.com/ .
-
-To join a mailing list for announcements about C<Memoize>, send an
-empty message to C<mjd-perl-memoize-request@plover.com>.  This mailing
-list is for announcements only and has extremely low traffic---fewer than
-two messages per year.
-
-=head1 COPYRIGHT AND LICENSE
-
-Copyright 1998, 1999, 2000, 2001, 2012  by Mark Jason Dominus
-
-This library is free software; you may redistribute it and/or modify
-it under the same terms as Perl itself.
+For more information, visit L<https://hop.perl.plover.com/>.
 
 =head1 THANK YOU
 
@@ -1074,4 +944,15 @@ Special thanks to Jarkko Hietaniemi, the 5.8.0 pumpking, for including
 this module in the core and for his patient and helpful guidance
 during the integration process.
 
+=head1 AUTHOR
+
+Mark Jason Dominus
+
+=head1 COPYRIGHT AND LICENSE
+
+This software is copyright (c) 2012 by Mark Jason Dominus.
+
+This is free software; you can redistribute it and/or modify it under
+the same terms as the Perl 5 programming language system itself.
+
 =cut
index cf5f7f5..c0aa5e6 100644 (file)
@@ -1,31 +1,37 @@
+use strict; use warnings;
+
 package Memoize::AnyDBM_File;
+our $VERSION = '1.16';
 
-=head1 NAME
+our @ISA = qw(DB_File GDBM_File Memoize::NDBM_File SDBM_File ODBM_File) unless @ISA;
 
-Memoize::AnyDBM_File - glue to provide EXISTS for AnyDBM_File for Storable use
+for my $mod (@ISA) {
+  if (eval "require $mod") {
+    $mod = 'NDBM_File'
+               if $mod eq 'Memoize::NDBM_File'
+               and eval { NDBM_File->VERSION( '1.16' ) };
+    print STDERR "AnyDBM_File => Selected $mod.\n" if our $Verbose;
+    @ISA = $mod;
+    return 1;
+  }
+}
 
-=head1 DESCRIPTION
+die "No DBM package was successfully found or installed";
 
-See L<Memoize>.
+__END__
 
-=cut
+=pod
 
-use vars qw(@ISA $VERSION);
-$VERSION = '1.03';
-@ISA = qw(DB_File GDBM_File Memoize::NDBM_File Memoize::SDBM_File ODBM_File) unless @ISA;
+=head1 NAME
 
-my $verbose = 1;
+Memoize::AnyDBM_File - glue to provide EXISTS for AnyDBM_File for Storable use
 
-my $mod;
-for $mod (@ISA) {
-#  (my $truemod = $mod) =~ s/^Memoize:://;
-#  my $file = "$mod.pm";
-#  $file =~ s{::}{/}g;
-  if (eval "require $mod") {
-    print STDERR "AnyDBM_File => Selected $mod.\n" if $Verbose;
-    @ISA = ($mod);     # if we leave @ISA alone, warnings abound
-    return 1;
-  }
-}
+=head1 DESCRIPTION
 
-die "No DBM package was successfully found or installed";
+This class does the same thing as L<AnyDBM_File>, except that instead of
+L<NDBM_File> itself it loads L<Memoize::NDBM_File> if L<NDBM_File> lacks
+L<EXISTS|perltie/C<EXISTS>> support.
+
+Code which requires perl 5.37.3 or newer should simply use L<AnyBDM_File> directly.
+
+=cut
index 9b3b944..0683ecd 100644 (file)
@@ -1,23 +1,16 @@
+use strict; use warnings;
 
 package Memoize::Expire;
-# require 5.00556;
+our $VERSION = '1.16';
+
 use Carp;
-$DEBUG = 0;
-$VERSION = '1.03';
+our $DEBUG;
 
-# This package will implement expiration by prepending a fixed-length header
-# to the font of the cached data.  The format of the header will be:
+# The format of the metadata is:
 # (4-byte number of last-access-time)  (For LRU when I implement it)
 # (4-byte expiration time: unsigned seconds-since-unix-epoch)
 # (2-byte number-of-uses-before-expire)
 
-sub _header_fmt () { "N N n" }
-sub _header_size () { length(_header_fmt) }
-
-# Usage:  memoize func 
-#         TIE => [Memoize::Expire, LIFETIME => sec, NUM_USES => n,
-#                 TIE => [...] ]
-
 BEGIN {
   eval {require Time::HiRes};
   unless ($@) {
@@ -43,7 +36,7 @@ sub TIEHASH {
   }
   $args{LIFETIME} ||= 0;
   $args{NUM_USES} ||= 0;
-  $args{C} = \%cache;
+  $args{C} = delete $args{HASH} || \%cache;
   bless \%args => $package;
 }
 
@@ -54,27 +47,25 @@ sub STORE {
   # The call that results in a value to store into the cache is the
   # first of the NUM_USES allowed calls.
   my $header = _make_header(time, $expire_time, $self->{NUM_USES}-1);
-  $self->{C}{$key} = $header . $value;
+  @{$self->{C}}{"H$key", "V$key"} = ($header, $value);
   $value;
 }
 
 sub FETCH {
   $DEBUG and print STDERR " >> Fetch cached value for $_[1]\n";
-  my ($data, $last_access, $expire_time, $num_uses_left) = _get_item($_[0]{C}{$_[1]});
+  my ($last_access, $expire_time, $num_uses_left) = _get_header($_[0]{C}{"H$_[1]"});
   $DEBUG and print STDERR " >>   (ttl: ", ($expire_time-time()), ", nuses: $num_uses_left)\n";
-  $num_uses_left--;
-  $last_access = time;
-  _set_header(@_, $data, $last_access, $expire_time, $num_uses_left);
-  $data;
+  $_[0]{C}{"H$_[1]"} = _make_header(time, $expire_time, --$num_uses_left);
+  $_[0]{C}{"V$_[1]"};
 }
 
 sub EXISTS {
   $DEBUG and print STDERR " >> Exists $_[1]\n";
-  unless (exists $_[0]{C}{$_[1]}) {
+  unless (exists $_[0]{C}{"V$_[1]"}) {
     $DEBUG and print STDERR "    Not in underlying hash at all.\n";
     return 0;
   }
-  my $item = $_[0]{C}{$_[1]};
+  my $item = $_[0]{C}{"H$_[1]"};
   my ($last_access, $expire_time, $num_uses_left) = _get_header($item);
   my $ttl = $expire_time - time;
   if ($DEBUG) {
@@ -91,26 +82,21 @@ sub EXISTS {
   }
 }
 
-# Arguments: last access time, expire time, number of uses remaining
-sub _make_header {
-  pack "N N n", @_;
+sub FIRSTKEY {
+  scalar keys %{$_[0]{C}};
+  &NEXTKEY;
 }
 
-sub _strip_header {
-  substr($_[0], 10);
+sub NEXTKEY {
+  while (defined(my $key = each %{$_[0]{C}})) {
+    return substr $key, 1 if 'V' eq substr $key, 0, 1;
+  }
+  undef;
 }
 
 # Arguments: last access time, expire time, number of uses remaining
-sub _set_header {
-  my ($self, $key, $data, @header) = @_;
-  $self->{C}{$key} = _make_header(@header) . $data;
-}
-
-sub _get_item {
-  my $data = substr($_[0], 10);
-  my @header = unpack "N N n", substr($_[0], 0, 10);
-#  print STDERR " >> _get_item: $data => $data @header\n";
-  ($data, @header);
+sub _make_header {
+  pack "N N n", @_;
 }
 
 # Return last access time, expire time, number of uses remaining
@@ -120,6 +106,10 @@ sub _get_header  {
 
 1;
 
+__END__
+
+=pod
+
 =head1 NAME 
 
 Memoize::Expire - Plug-in module for automatic expiration of memoized values
@@ -249,7 +239,7 @@ the cache, and it should return the cache object to the caller.
 For example, MyExpirePolicy::TIEHASH might create an object that
 contains a regular Perl hash (which it will to store the cached
 values) and some extra information about the arguments and how old the
-data is and things like that.  Let us call this object `C'.
+data is and things like that. Let us call this object I<C<C>>.
 
 When Memoize needs to check to see if an entry is in the cache
 already, it will invoke C<< C->EXISTS(key) >>.  C<key> is the normalized
@@ -282,7 +272,7 @@ cache item after ten seconds.
               $cache->{$key}{EXPIRE_TIME} > time) {
            return 1
          } else {
-           return 0;  # Do NOT return `undef' here.
+           return 0;  # Do NOT return undef here
          }
        }
 
@@ -318,11 +308,10 @@ See the documentation for details.
 
 =head1 ALTERNATIVES
 
-Brent Powers has a C<Memoize::ExpireLRU> module that was designed to
+Brent Powers has a L<Memoize::ExpireLRU> module that was designed to
 work with Memoize and provides expiration of least-recently-used data.
 The cache is held at a fixed number of entries, and when new data
-comes in, the least-recently used data is expired.  See
-L<http://search.cpan.org/search?mode=module&query=ExpireLRU>.
+comes in, the least-recently used data is expired.
 
 Joshua Chamas's Tie::Cache module may be useful as an expiration
 manager.  (If you try this, let me know how it works out.)
@@ -349,7 +338,7 @@ C<Time::HiRes> installed.
 
 =head1 AUTHOR
 
-Mark-Jason Dominus (mjd-perl-memoize+@plover.com)
+Mark-Jason Dominus
 
 Mike Cariaso provided valuable insight into the best way to solve this
 problem.
@@ -360,11 +349,4 @@ perl(1)
 
 The Memoize man page.
 
-http://www.plover.com/~mjd/perl/Memoize/  (for news and updates)
-
-I maintain a mailing list on which I occasionally announce new
-versions of Memoize.  The list is for announcements only, not
-discussion.  To join, send an empty message to
-mjd-perl-memoize-request@Plover.com.
-
 =cut
diff --git a/gnu/usr.bin/perl/cpan/Memoize/Memoize/ExpireFile.pm b/gnu/usr.bin/perl/cpan/Memoize/Memoize/ExpireFile.pm
deleted file mode 100644 (file)
index 06b72f8..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-package Memoize::ExpireFile;
-
-=head1 NAME
-
-Memoize::ExpireFile - test for Memoize expiration semantics
-
-=head1 DESCRIPTION
-
-See L<Memoize::Expire>.
-
-=cut
-
-$VERSION = '1.03';
-use Carp;
-
-my $Zero = pack("N", 0);
-
-sub TIEHASH {
-  my ($package, %args) = @_;
-  my $cache = $args{HASH} || {};
-  bless {ARGS => \%args, C => $cache} => $package;
-}
-
-
-sub STORE {
-#  print "Expiry manager STORE handler\n";
-  my ($self, $key, $data) = @_;
-  my $cache = $self->{C};
-  my $cur_date = pack("N", (stat($key))[9]);
-  $cache->{"C$key"} = $data;
-  $cache->{"T$key"} = $cur_date;
-}
-
-sub FETCH {
-  my ($self, $key) = @_;
-  $self->{C}{"C$key"};
-}
-
-sub EXISTS {
-#  print "Expiry manager EXISTS handler\n";
-  my ($self, $key) = @_;
-  my $cache_date = $self->{C}{"T$key"} || $Zero;
-  my $file_date = pack("N", (stat($key))[9]);#
-#  if ($self->{ARGS}{CHECK_DATE} && $old_date gt $cur_date) {
-#    return $self->{ARGS}{CHECK_DATE}->($key, $old_date, $cur_date);
-#  } 
-  my $res = $cache_date ge $file_date;
-#  print $res ? "... still good\n" : "... expired\n";
-  $res;
-}
-
-1;
diff --git a/gnu/usr.bin/perl/cpan/Memoize/Memoize/ExpireTest.pm b/gnu/usr.bin/perl/cpan/Memoize/Memoize/ExpireTest.pm
deleted file mode 100644 (file)
index 7f7dd28..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-package Memoize::ExpireTest;
-
-=head1 NAME
-
-Memoize::ExpireTest - test for Memoize expiration semantics
-
-=head1 DESCRIPTION
-
-This module is just for testing expiration semantics.  It's not a very
-good example of how to write an expiration module.
-
-If you are looking for an example, I recommend that you look at the
-simple example in the Memoize::Expire documentation, or at the code
-for Memoize::Expire itself.
-
-If you have questions, I will be happy to answer them if you send them
-to mjd-perl-memoize+@plover.com.
-
-=cut
-
-$VERSION = '1.03';
-my %cache;
-
-sub TIEHASH {  
-  my ($pack) = @_;
-  bless \%cache => $pack;
-}
-
-sub EXISTS {
-  my ($cache, $key) = @_;
-  exists $cache->{$key} ? 1 : 0;
-}
-
-sub FETCH {
-  my ($cache, $key) = @_;
-  $cache->{$key};
-}
-
-sub STORE {
-  my ($cache, $key, $val) = @_;
-  $cache->{$key} = $val;
-}
-
-sub expire {
-  my ($key) = @_;
-  delete $cache{$key};
-}
-
-1;
index ff934c6..fc29f79 100644 (file)
@@ -1,77 +1,38 @@
-package Memoize::NDBM_File;
-
-=head1 NAME
-
-Memoize::NDBM_File - glue to provide EXISTS for NDBM_File for Storable use
-
-=head1 DESCRIPTION
+use strict; use warnings;
 
-See L<Memoize>.
-
-=cut
+package Memoize::NDBM_File;
+our $VERSION = '1.16';
 
 use NDBM_File;
-@ISA = qw(NDBM_File);
-$VERSION = '1.03';
-
-$Verbose = 0;
+our @ISA = qw(NDBM_File);
 
-sub AUTOLOAD {
-  warn "Nonexistent function $AUTOLOAD invoked in Memoize::NDBM_File\n";
-}
-
-sub import {
-  warn "Importing Memoize::NDBM_File\n" if $Verbose;
+# NDBM_File cannot store undef and will store an empty string if you try
+# but it does return undef if you try to read a non-existent key
+# so we can emulate exists() using defined()
+sub EXISTS {
+       defined shift->FETCH(@_);
 }
 
+# Perl 5.37.3 adds this EXISTS emulation to NDBM_File itself
+delete $Memoize::NDBM_File::{'EXISTS'}
+       if eval { NDBM_File->VERSION( '1.16' ) };
 
-my %keylist;
-
-# This is so ridiculous...
-sub _backhash {
-  my $self = shift;
-  my %fakehash;
-  my $k; 
-  for ($k = $self->FIRSTKEY(); defined $k; $k = $self->NEXTKEY($k)) {
-    $fakehash{$k} = undef;
-  }
-  $keylist{$self} = \%fakehash;
-}
-
-sub EXISTS {
-  warn "Memoize::NDBM_File EXISTS (@_)\n" if $Verbose;
-  my $self = shift;
-  _backhash($self)  unless exists $keylist{$self};
-  my $r = exists $keylist{$self}{$_[0]};
-  warn "Memoize::NDBM_File EXISTS (@_) ==> $r\n" if $Verbose;
-  $r;
-}
+1;
 
-sub DEFINED {
-  warn "Memoize::NDBM_File DEFINED (@_)\n" if $Verbose;
-  my $self = shift;
-  _backhash($self)  unless exists $keylist{$self};
-  defined $keylist{$self}{$_[0]};
-}
+__END__
 
-sub DESTROY {
-  warn "Memoize::NDBM_File DESTROY (@_)\n" if $Verbose;
-  my $self = shift;
-  delete $keylist{$self};   # So much for reference counting...
-  $self->SUPER::DESTROY(@_);
-}
+=pod
 
-# Maybe establish the keylist at TIEHASH time instead?
+=head1 NAME
 
-sub STORE {
-  warn "Memoize::NDBM_File STORE (@_)\n" if $VERBOSE;
-  my $self = shift;
-  $keylist{$self}{$_[0]} = undef;
-  $self->SUPER::STORE(@_);
-}
+Memoize::NDBM_File - glue to provide EXISTS for NDBM_File for Storable use
 
+=head1 DESCRIPTION
 
+This class provides L<EXISTS|perltie/C<EXISTS>> support for L<NDBM_File>.
 
-# Inherit FETCH and TIEHASH
+L<In Perl 5.37.3|https://github.com/Perl/perl5/commit/c0a1a377c02ed789f5eff667f46a2314a05c5a4c>,
+support for C<EXISTS> was added to L<NDBM_File> itself.
+Code which requires such a perl should simply use L<NBDM_File> directly.
 
-1;
+=cut
index 7cfaa4a..87ef28e 100644 (file)
@@ -1,75 +1,27 @@
-package Memoize::SDBM_File;
-
-=head1 NAME
-
-Memoize::SDBM_File - glue to provide EXISTS for SDBM_File for Storable use
-
-=head1 DESCRIPTION
-
-See L<Memoize>.
-
-=cut
+use strict; use warnings;
 
-use SDBM_File;
-@ISA = qw(SDBM_File);
-$VERSION = '1.03';
-
-$Verbose = 0;
-
-sub AUTOLOAD {
-  warn "Nonexistent function $AUTOLOAD invoked in Memoize::SDBM_File\n";
-}
-
-sub import {
-  warn "Importing Memoize::SDBM_File\n" if $Verbose;
-}
+package Memoize::SDBM_File;
+our $VERSION = '1.16';
 
+use SDBM_File 1.01; # for EXISTS support
+our @ISA = qw(SDBM_File);
 
-my %keylist;
+1;
 
-# This is so ridiculous...
-sub _backhash {
-  my $self = shift;
-  my %fakehash;
-  my $k; 
-  for ($k = $self->FIRSTKEY(); defined $k; $k = $self->NEXTKEY($k)) {
-    $fakehash{$k} = undef;
-  }
-  $keylist{$self} = \%fakehash;
-}
+__END__
 
-sub EXISTS {
-  warn "Memoize::SDBM_File EXISTS (@_)\n" if $Verbose;
-  my $self = shift;
-  _backhash($self)  unless exists $keylist{$self};
-  my $r = exists $keylist{$self}{$_[0]};
-  warn "Memoize::SDBM_File EXISTS (@_) ==> $r\n" if $Verbose;
-  $r;
-}
+=pod
 
-sub DEFINED {
-  warn "Memoize::SDBM_File DEFINED (@_)\n" if $Verbose;
-  my $self = shift;
-  _backhash($self)  unless exists $keylist{$self};
-  defined $keylist{$self}{$_[0]};
-}
+=head1 NAME
 
-sub DESTROY {
-  warn "Memoize::SDBM_File DESTROY (@_)\n" if $Verbose;
-  my $self = shift;
-  delete $keylist{$self};   # So much for reference counting...
-  $self->SUPER::DESTROY(@_);
-}
+Memoize::SDBM_File - DEPRECATED compability shim
 
-# Maybe establish the keylist at TIEHASH time instead?
+=head1 DESCRIPTION
 
-sub STORE {
-  warn "Memoize::SDBM_File STORE (@_)\n" if $VERBOSE;
-  my $self = shift;
-  $keylist{$self}{$_[0]} = undef;
-  $self->SUPER::STORE(@_);
-}
+This class used to provide L<EXISTS|perltie/C<EXISTS>> support for L<SDBM_File>
+before support for C<EXISTS> was added to L<SDBM_File> itself
+L<in Perl 5.6.0|perl56delta/SDBM_File>.
 
-# Inherit FETCH and TIEHASH
+Any code still using this class should be rewritten to use L<SBDM_File> directly.
 
-1;
+=cut
index 1314797..923e57d 100644 (file)
@@ -1,27 +1,19 @@
-package Memoize::Storable;
-
-=head1 NAME
-
-Memoize::Storable - store Memoized data in Storable database
-
-=head1 DESCRIPTION
+use strict; use warnings;
 
-See L<Memoize>.
+package Memoize::Storable;
+our $VERSION = '1.16';
 
-=cut
+use Storable 1.002 (); # for lock_* function variants
 
-use Storable ();
-$VERSION = '1.03';
-$Verbose = 0;
+our $Verbose;
 
 sub TIEHASH {
-  require Carp if $Verbose;
   my $package = shift;
   my $filename = shift;
-  my $truehash = (-e $filename) ? Storable::retrieve($filename) : {};
+  my $truehash = (-e $filename) ? Storable::lock_retrieve($filename) : {};
   my %options;
   print STDERR "Memoize::Storable::TIEHASH($filename, @_)\n" if $Verbose;
-  @options{@_} = ();
+  @options{@_} = (1) x @_;
   my $self = 
     {FILENAME => $filename, 
      H => $truehash, 
@@ -31,34 +23,30 @@ sub TIEHASH {
 }
 
 sub STORE {
-  require Carp if $Verbose;
   my $self = shift;
   print STDERR "Memoize::Storable::STORE(@_)\n" if $Verbose;
   $self->{H}{$_[0]} = $_[1];
 }
 
 sub FETCH {
-  require Carp if $Verbose;
   my $self = shift;
   print STDERR "Memoize::Storable::FETCH(@_)\n" if $Verbose;
   $self->{H}{$_[0]};
 }
 
 sub EXISTS {
-  require Carp if $Verbose;
   my $self = shift;
   print STDERR "Memoize::Storable::EXISTS(@_)\n" if $Verbose;
   exists $self->{H}{$_[0]};
 }
 
 sub DESTROY {
-  require Carp if $Verbose;
   my $self= shift;
   print STDERR "Memoize::Storable::DESTROY(@_)\n" if $Verbose;
   if ($self->{OPTIONS}{'nstore'}) {
-    Storable::nstore($self->{H}, $self->{FILENAME});
+    Storable::lock_nstore($self->{H}, $self->{FILENAME});
   } else {
-    Storable::store($self->{H}, $self->{FILENAME});
+    Storable::lock_store($self->{H}, $self->{FILENAME});
   }
 }
 
@@ -69,4 +57,19 @@ sub FIRSTKEY {
 sub NEXTKEY {
   undef;
 }
+
 1;
+
+__END__
+
+=pod
+
+=head1 NAME
+
+Memoize::Storable - store Memoized data in Storable database
+
+=head1 DESCRIPTION
+
+See L<Memoize>.
+
+=cut
diff --git a/gnu/usr.bin/perl/cpan/Memoize/t/array.t b/gnu/usr.bin/perl/cpan/Memoize/t/array.t
deleted file mode 100755 (executable)
index b7057ea..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-#!/usr/bin/perl
-
-use lib '..';
-use Memoize;
-
-
-print "1..11\n";
-
-sub timelist {
-  return (time) x $_[0];
-}
-
-memoize('timelist');
-
-@t1 = &timelist(1);
-sleep 2;
-@u1 = &timelist(1);
-print ((("@t1" eq "@u1") ? '' : 'not '), "ok 1\n");
-
-@t7 = &timelist(7);
-print (((@t7 == 7) ? '' : 'not '), "ok 2\n");
-$BAD = 0;
-for ($i = 1; $i < 7; $i++) {
-  $BAD++ unless $t7[$i-1] == $t7[$i];
-}
-print (($BAD ? 'not ' : ''), "ok 3\n");
-
-sleep 2;
-@u7 = &timelist(7);
-print (((@u7 == 7) ? '' : 'not '), "ok 4\n");
-$BAD = 0;
-for ($i = 1; $i < 7; $i++) {
-  $BAD++ unless $u7[$i-1] == $u7[$i];
-}
-print (($BAD ? 'not ' : ''), "ok 5\n");
-# Properly memoized?
-print ((("@t7" eq "@u7") ? '' : 'not '), "ok 6\n");
-
-sub con {
-  return wantarray()
-}
-
-# Same arguments yield different results in different contexts?
-memoize('con');
-$s = con(1);
-@a = con(1);
-print ((($s == $a[0]) ? 'not ' : ''), "ok 7\n");
-
-# Context propagated correctly?
-print ((($s eq '') ? '' : 'not '), "ok 8\n"); # Scalar context
-print ((("@a" eq '1' && @a == 1) ? '' : 'not '), "ok 9\n"); # List context
-
-# Context propagated correctly to normalizer?
-sub n {
-  my $arg = shift;
-  my $test = shift;
-  if (wantarray) {
-    print ((($arg eq ARRAY) ? '' : 'not '), "ok $test\n"); # List context
-  } else {
-    print ((($arg eq SCALAR) ? '' : 'not '), "ok $test\n"); # Scalar context
-  }
-}
-
-sub f { 1 }
-memoize('f', NORMALIZER => 'n');
-$s = f('SCALAR', 10);          # Test 10
-@a = f('ARRAY' , 11);          # Test 11
-
diff --git a/gnu/usr.bin/perl/cpan/Memoize/t/array_confusion.t b/gnu/usr.bin/perl/cpan/Memoize/t/array_confusion.t
deleted file mode 100755 (executable)
index 4ad6c96..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-#!/usr/bin/perl
-
-use lib '..';
-use Memoize 'memoize', 'unmemoize';
-use Test::More;
-
-sub reff {
-  return [1,2,3];
-
-}
-
-sub listf {
-  return (1,2,3);
-}
-
-sub f17 { return 17 }
-
-plan tests => 7;
-
-memoize 'reff', LIST_CACHE => 'MERGE';
-memoize 'listf';
-
-$s = reff();
-@a = reff();
-is(scalar(@a), 1, "reff list context");
-
-$s = listf();
-@a = listf();
-is(scalar(@a), 3, "listf list context");
-
-unmemoize 'reff';
-memoize 'reff', LIST_CACHE => 'MERGE';
-unmemoize 'listf';
-memoize 'listf';
-
-@a = reff();
-$s = reff();
-is(scalar @a, 1, "reff list context");
-
-@a = listf();
-$s = listf();
-is(scalar @a, 3, "listf list context");
-
-memoize 'f17', SCALAR_CACHE => 'MERGE';
-is(f17(), 17, "f17 first call");
-is(f17(), 17, "f17 second call");
-is(scalar(f17()), 17, "f17 scalar context call");
diff --git a/gnu/usr.bin/perl/cpan/Memoize/t/errors.t b/gnu/usr.bin/perl/cpan/Memoize/t/errors.t
deleted file mode 100755 (executable)
index 90bc298..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-#!/usr/bin/perl
-
-use lib '..';
-use Memoize;
-use Config;
-
-$|=1;
-print "1..11\n";
-
-eval { memoize({}) };
-print $@ ? "ok 1\n" : "not ok 1 # $@\n";
-
-eval { memoize([]) };
-print $@ ? "ok 2\n" : "not ok 2 # $@\n";
-
-eval { my $x; memoize(\$x) };
-print $@ ? "ok 3\n" : "not ok 3 # $@\n";
-
-# 4--8
-$n = 4;
-my $dummyfile = './dummydb';
-use Fcntl;
-my %args = ( DB_File => [],
-             GDBM_File => [$dummyfile, \&GDBM_File::GDBM_NEWDB, 0666],
-             ODBM_File => [$dummyfile, O_RDWR|O_CREAT, 0666],
-             NDBM_File => [$dummyfile, O_RDWR|O_CREAT, 0666],
-             SDBM_File => [$dummyfile, O_RDWR|O_CREAT, 0666],
-           );
-for $mod (qw(DB_File GDBM_File SDBM_File ODBM_File NDBM_File)) {
-  eval {
-    require "$mod.pm";
-    tie my %cache => $mod, map { (ref($_) eq 'CODE') ? &$_ : $_ } @{$args{$mod}};
-    memoize(sub {}, LIST_CACHE => [HASH => \%cache ]);
-  };
-  print $@ =~ /can only store scalars/
-     || $@ =~ /Can't locate.*in \@INC/
-     || $@ =~ /Can't load '.*?' for module/ ? "ok $n\n" : "not ok $n # $@\n";
-  1 while unlink $dummyfile, "$dummyfile.dir", "$dummyfile.pag", "$dummyfile.db";
-  $n++;
-}
-
-# 9
-eval { local $^W = 0;
-       memoize(sub {}, LIST_CACHE => ['TIE', 'WuggaWugga']) 
-     };
-print $@ ? "ok 9\n" : "not ok 9 # $@\n";
-
-# 10
-eval { memoize(sub {}, LIST_CACHE => 'YOB GORGLE') };
-print $@ ? "ok 10\n" : "not ok 10 # $@\n";
-
-# 11
-eval { memoize(sub {}, SCALAR_CACHE => ['YOB GORGLE']) };
-print $@ ? "ok 11\n" : "not ok 11 # $@\n";
-
diff --git a/gnu/usr.bin/perl/cpan/Memoize/t/expfile.t b/gnu/usr.bin/perl/cpan/Memoize/t/expfile.t
deleted file mode 100755 (executable)
index c81bfd4..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-#!/usr/bin/perl
-
-use lib '..';
-use Memoize;
-
-my $n = 0;
-$|=1;
-
-
-if (-e '.fast') {
-  print "1..0\n";
-  exit 0;
-}
-
-print "1..12\n";
-# (1)
-++$n; print "ok $n\n";
-
-my $READFILE_CALLS = 0;
-my $FILE = './TESTFILE';
-
-sub writefile {
-  my $FILE = shift;
-  open F, "> $FILE" or die "Couldn't write temporary file $FILE: $!";
-  print F scalar(localtime), "\n";
-  close F;
-}
-
-sub readfile {
-  $READFILE_CALLS++;
-  my $FILE = shift;
-  open F, "< $FILE" or die "Couldn't write temporary file $FILE: $!";
-  my $data = <F>;
-  close F;
-  $data;
-}
-
-require Memoize::ExpireFile;
-# (2)
-++$n; print "ok $n\n";
-
-tie my %cache => 'Memoize::ExpireFile';
-memoize 'readfile',
-    SCALAR_CACHE => [HASH => \%cache],
-    LIST_CACHE => 'FAULT'
-    ;
-
-# (3)
-++$n; print "ok $n\n";
-
-# (4)
-writefile($FILE);
-++$n; print "ok $n\n";
-sleep 4;
-
-# (5-6)
-my $t1 = readfile($FILE);
-++$n; print "ok $n\n";
-++$n; print ((($READFILE_CALLS == 1) ? '' : 'not '), "ok $n\n");
-
-# (7-9)
-my $t2 = readfile($FILE);
-++$n; print "ok $n\n";  
-++$n; print ((($READFILE_CALLS == 1) ? '' : 'not '), "ok $n\n");
-++$n; print ((($t1 eq $t2) ? '' : 'not '), "ok $n\n");
-
-# (10-12)
-sleep 4;
-writefile($FILE);
-my $t3 = readfile($FILE);
-++$n; print "ok $n\n";
-++$n; print ((($READFILE_CALLS == 2) ? '' : 'not '), "ok $n\n");
-++$n; print ((($t1 ne $t3) ? '' : 'not '), "ok $n\n");
-
-END { 1 while unlink $FILE }
diff --git a/gnu/usr.bin/perl/cpan/Memoize/t/expire.t b/gnu/usr.bin/perl/cpan/Memoize/t/expire.t
deleted file mode 100755 (executable)
index 497e7a9..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-#!/usr/bin/perl
-
-use lib '..';
-use Memoize;
-use Memoize::ExpireTest;
-
-my $n = 0;
-
-print "1..17\n";
-
-$n++; print "ok $n\n";
-
-my %CALLS;
-sub id {       
-  my($arg) = @_;
-  ++$CALLS{$arg};
-  $arg;
-}
-
-tie my %cache => 'Memoize::ExpireTest';
-memoize 'id', 
-  SCALAR_CACHE => [HASH => \%cache], 
-  LIST_CACHE => 'FAULT';
-$n++; print "ok $n\n";
-
-for $i (1, 2, 3, 1, 2, 1) {
-  $n++;
-  unless ($i == id($i)) {
-    print "not ";
-  }
-  print "ok $n\n";
-}
-
-for $i (1, 2, 3) {
-  $n++;
-  unless ($CALLS{$i} == 1) {
-    print "not ";
-  }
-  print "ok $n\n";
-}
-
-Memoize::ExpireTest::expire(1);
-
-for $i (1, 2, 3) {
-  my $v = id($i);
-}
-
-for $i (1, 2, 3) {
-  $n++;
-  unless ($CALLS{$i} == 1 + ($i == 1)) {
-    print "not ";
-  }
-  print "ok $n\n";
-}
-
-Memoize::ExpireTest::expire(1);
-Memoize::ExpireTest::expire(2);
-
-for $i (1, 2, 3) {
-  my $v = id($i);
-}
-
-for $i (1, 2, 3) {
-  $n++;
-  unless ($CALLS{$i} == 4 - $i) {
-    print "not ";
-  }
-  print "ok $n\n";
-}
-
-exit 0;
-
diff --git a/gnu/usr.bin/perl/cpan/Memoize/t/expmod_n.t b/gnu/usr.bin/perl/cpan/Memoize/t/expmod_n.t
deleted file mode 100755 (executable)
index 7e5505a..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-#!/usr/bin/perl
-
-use lib '..';
-use Memoize;
-
-my $n = 0;
-
-
-print "1..22\n";
-
-++$n; print "ok $n\n";
-
-$RETURN = 1;
-
-%CALLS = ();
-sub call {
-#  print "CALL $_[0] => $RETURN\n";
-  ++$CALLS{$_[0]};
-  $RETURN;
-}
-
-require Memoize::Expire;
-++$n; print "ok $n\n";
-
-tie my %cache => 'Memoize::Expire', NUM_USES => 2;
-memoize 'call',
-    SCALAR_CACHE => [HASH => \%cache],
-    LIST_CACHE => 'FAULT';
-
-# $Memoize::Expire::DEBUG = 1;
-++$n; print "ok $n\n";
-
-# 3--6
-for (0,1,2,3) {
-  print "not " unless call($_) == 1;
-  ++$n; print "ok $n\n";
-}
-
-# 7--10
-for (keys %CALLS) {
-  print "not " unless $CALLS{$_} == (1,1,1,1)[$_];
-  ++$n; print "ok $n\n";
-}
-
-# 11--13
-$RETURN = 2;
-++$n; print ((call(1) == 1 ? '' : 'not '), "ok $n\n"); # 1 expires
-++$n; print ((call(1) == 2 ? '' : 'not '), "ok $n\n"); # 1 gets new val
-++$n; print ((call(2) == 1 ? '' : 'not '), "ok $n\n"); # 2 expires
-
-# 14--17
-$RETURN = 3;
-for (0,1,2,3) {
-  # 0 expires, 1 expires, 2 gets new val, 3 expires
-  print "not " unless call($_) == (1,2,3,1)[$_];
-  ++$n; print "ok $n\n";
-}
-
-for (0,1,2,3) {
-  print "not " unless $CALLS{$_} == (1,2,2,1)[$_];
-  ++$n; print "ok $n\n";
-}
diff --git a/gnu/usr.bin/perl/cpan/Memoize/t/prototype.t b/gnu/usr.bin/perl/cpan/Memoize/t/prototype.t
deleted file mode 100755 (executable)
index f3859e3..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-#!/usr/bin/perl
-
-use lib '..';
-use Memoize;
-$EXPECTED_WARNING = '(no warning expected)';
-
-
-print "1..4\n";
-
-sub q1 ($) { $_[0] + 1 }
-sub q2 ()  { time }
-sub q3     { join "--", @_ }
-
-$SIG{__WARN__} = \&handle_warnings;
-
-$RES = 'ok';
-memoize 'q1';
-print "$RES 1\n";
-
-$RES = 'ok';
-memoize 'q2';
-print "$RES 2\n";
-
-$RES = 'ok';
-memoize 'q3';
-print "$RES 3\n";
-
-# Let's see if the prototype is actually honored
-@q = (1..5);
-$r = q1(@q); 
-print (($r == 6) ? '' : 'not ', "ok 4\n");
-
-sub handle_warnings {
-  print $_[0];
-  $RES = 'not ok' unless $_[0] eq $EXPECTED_WARNING;
-}
diff --git a/gnu/usr.bin/perl/cpan/Memoize/t/speed.t b/gnu/usr.bin/perl/cpan/Memoize/t/speed.t
deleted file mode 100755 (executable)
index c4b8381..0000000
+++ /dev/null
@@ -1,108 +0,0 @@
-#!/usr/bin/perl
-
-use lib '..';
-use Memoize;
-
-if (-e '.fast') {
-  print "1..0\n";
-  exit 0;
-}
-$| = 1;
-
-# If we don't say anything, maybe nobody will notice.
-# print STDERR "\nWarning: I'm testing the speedup.  This might take up to thirty seconds.\n                    ";
-
-my $COARSE_TIME = 1;
-
-sub times_to_time { my ($u) = times; $u; }
-if ($^O eq 'riscos') {
-  eval {require Time::HiRes; *my_time = \&Time::HiRes::time };
-  if ($@) { *my_time = sub { time }; $COARSE_TIME = 1 }
-} else {
-  *my_time = \&times_to_time;
-}
-
-
-print "1..6\n";
-
-
-
-# This next test finds an example that takes a long time to run, then
-# checks to make sure that the run is actually speeded up by memoization.
-# In some sense, this is the most essential correctness test in the package.  
-#
-# We do this by running the fib() function with successfily larger
-# arguments until we find one that tales at least $LONG_RUN seconds
-# to execute.  Then we memoize fib() and run the same call cagain.  If
-# it doesn't produce the same test in less than one-tenth the time,
-# something is seriously wrong.
-#
-# $LONG_RUN is the number of seconds that the function call must last
-# in order for the call to be considered sufficiently long.
-
-
-sub fib {
-  my $n = shift;
-  $COUNT++;
-  return $n if $n < 2;
-  fib($n-1) + fib($n-2);
-}
-
-sub max { $_[0] > $_[1] ? 
-          $_[0] : $_[1] 
-        }
-
-$N = 1;
-
-$ELAPSED = 0;
-
-my $LONG_RUN = 11;
-
-while (1) {
-  my $start = time;
-  $COUNT=0;
-  $RESULT = fib($N);
-  $ELAPSED = time - $start;
-  last if $ELAPSED >= $LONG_RUN;
-  if ($ELAPSED > 1) {
-      print "# fib($N) took $ELAPSED seconds.\n" if $N % 1 == 0;
-      # we'd expect that fib(n+1) takes about 1.618 times as long as fib(n)
-      # so now that we have a longish run, let's estimate the value of $N
-      # that will get us a sufficiently long run.
-      $N += 1 + int(log($LONG_RUN/$ELAPSED)/log(1.618));
-      print "# OK, N=$N ought to do it.\n";
-      # It's important not to overshoot here because the running time
-      # is exponential in $N.  If we increase $N too aggressively,
-      # the user will be forced to wait a very long time.
-  } else {
-      $N++; 
-  }
-}
-
-print "# OK, fib($N) was slow enough; it took $ELAPSED seconds.\n";
-print "# Total calls: $COUNT.\n";
-
-&memoize('fib');
-
-$COUNT=0;
-$start = time;
-$RESULT2 = fib($N);
-$ELAPSED2 = time - $start + .001; # prevent division by 0 errors
-print (($RESULT == $RESULT2) ? "ok 1\n" : "not ok 1\n");
-# If it's not ten times as fast, something is seriously wrong.
-print "# ELAPSED2=$ELAPSED2 seconds.\n";
-print (($ELAPSED/$ELAPSED2 > 10) ? "ok 2\n" : "not ok 2\n");
-
-# If it called the function more than $N times, it wasn't memoized properly
-print (($COUNT > $N) ? "ok 3\n" : "not ok 3\n");
-
-# Do it again. Should be even faster this time.
-$COUNT = 0;
-$start = time;
-$RESULT2 = fib($N);
-$ELAPSED2 = time - $start + .001; # prevent division by 0 errors
-print (($RESULT == $RESULT2) ? "ok 4\n" : "not ok 4\n");
-print "# ELAPSED2=$ELAPSED2 seconds.\n";
-print (($ELAPSED/$ELAPSED2 > 10) ? "ok 5\n" : "not ok 5\n");
-# This time it shouldn't have called the function at all.
-print ($COUNT == 0 ? "ok 6\n" : "not ok 6\n");
diff --git a/gnu/usr.bin/perl/cpan/Memoize/t/tiefeatures.t b/gnu/usr.bin/perl/cpan/Memoize/t/tiefeatures.t
deleted file mode 100755 (executable)
index 7306d9f..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-#!/usr/bin/perl
-
-use lib 'blib/lib';
-use Memoize 0.45 qw(memoize unmemoize);
-use Fcntl;
-
-# print STDERR $INC{'Memoize.pm'}, "\n";
-
-print "1..10\n";
-
-# Test MERGE
-sub xx {
-  wantarray();
-}
-
-my $s = xx();
-print ((!$s) ? "ok 1\n" : "not ok 1\n");
-my ($a) = xx();
-print (($a) ? "ok 2\n" : "not ok 2\n");
-memoize 'xx', LIST_CACHE => MERGE;
-$s = xx();
-print ((!$s) ? "ok 3\n" : "not ok 3\n");
-($a) = xx();  # Should return cached false value from previous invocation
-print ((!$a) ? "ok 4\n" : "not ok 4\n");
-
-
-# Test FAULT
-sub ns {}
-sub na {}
-memoize 'ns', SCALAR_CACHE => FAULT;
-memoize 'na', LIST_CACHE => FAULT;
-eval { my $s = ns() };  # Should fault
-print (($@) ?  "ok 5\n" : "not ok 5\n");
-eval { my ($a) = na() };  # Should fault
-print (($@) ?  "ok 6\n" : "not ok 6\n");
-
-
-# Test HASH
-my (%s, %l);
-sub nul {}
-memoize 'nul', SCALAR_CACHE => [HASH => \%s], LIST_CACHE => [HASH => \%l];
-nul('x');
-nul('y');
-print ((join '', sort keys %s) eq 'xy' ? "ok 7\n" : "not ok 7\n");
-print ((join '', sort keys %l) eq ''   ? "ok 8\n" : "not ok 8\n");
-() = nul('p');
-() = nul('q');
-print ((join '', sort keys %s) eq 'xy' ? "ok 9\n" : "not ok 9\n");
-print ((join '', sort keys %l) eq 'pq' ? "ok 10\n" : "not ok 10\n");
-
index d02ec68..6a407da 100644 (file)
@@ -12,7 +12,7 @@ use 5.008001;
 # be as strict as possible
 use strict;
 
-our $VERSION = '0.09';
+our $VERSION = '0.10';
 
 # modules that we need
 use MIME::QuotedPrint (); # no need to pollute this namespace
@@ -163,11 +163,11 @@ Public License or the Artistic License, as specified in the F<LICENCE> file.
 
 =head1 VERSION
 
-Version 0.09
+Version 0.10
 
 =head1 DATE
 
-08 Dec 2020
+22 May 2022
 
 =head1 HISTORY
 
index 42ed4b4..bb6ffc8 100644 (file)
@@ -486,8 +486,6 @@ sub init_formatter_class_list {
 
   $self->opt_M_with('Pod::Perldoc::ToPod');   # the always-there fallthru
   $self->opt_o_with('text');
-  $self->opt_o_with('man')
-    if $ENV{TERM} && $ENV{TERM} !~ /dumb|emacs|none|unknown/i;
 
   return;
 }
index d8e42b1..bfcb5c4 100644 (file)
@@ -144,9 +144,7 @@ sub _get_podman_switches {
     #
     # See RT #77465
     #
-    # Then again, do *not* comment it out on OpenBSD:
-    # mandoc handles UTF-8 input just fine.
-    push @switches, 'utf8' => 1;
+    #push @switches, 'utf8' => 1;
 
        $self->debug( "Pod::Man switches are [@switches]\n" );
 
@@ -211,6 +209,12 @@ sub _have_groff_with_utf8 {
        $version ge $minimum_groff_version;
        }
 
+sub _have_mandoc_with_utf8 {
+       my( $self ) = @_;
+
+       $self->_is_mandoc and not system 'mandoc -Tlocale -V > /dev/null 2>&1';
+       }
+
 sub _collect_nroff_switches {
        my( $self ) = shift;
 
@@ -223,10 +227,6 @@ sub _collect_nroff_switches {
                push @render_switches, '-rLL=' . (int $c) . 'n' if $cols > 80;
                }
 
-       if( $self->_is_mandoc ) {
-               push @render_switches, '-Owidth=' . $self->_get_columns;
-               }
-
        # I hear persistent reports that adding a -c switch to $render
        # solves many people's problems.  But I also hear that some mans
        # don't have a -c switch, so that unconditionally adding it here
@@ -242,6 +242,7 @@ sub _get_device_switches {
           if( $self->_is_nroff  )             { qw()              }
        elsif( $self->_have_groff_with_utf8 )  { qw(-Kutf8 -Tutf8) }
        elsif( $self->_is_ebcdic )             { qw(-Tcp1047)      }
+       elsif( $self->_have_mandoc_with_utf8 ) { qw(-Tlocale)      }
        elsif( $self->_is_mandoc )             { qw()              }
        else                                   { qw(-Tlatin1)      }
        }
@@ -357,9 +358,6 @@ sub _filter_through_nroff {
                length $done
                );
 
-       # wait for it to exit
-       waitpid( $pid, 0 );
-
        if( $? ) {
                $self->warn( "Error from pipe to $render!\n" );
                $self->debug( 'Error: ' . do { local $/; <$err> } );
index c290f2b..0ed3a60 100644 (file)
@@ -18,7 +18,7 @@ use Config;
 use Exporter;
 use File::Spec;
 
-our $VERSION = '2.01';
+our $VERSION = '2.03';
 
 our @EXPORT = qw(&pod2usage);
 our @ISA;
index 8616422..0ed928c 100644 (file)
@@ -361,6 +361,7 @@ like ($text, qr/frobnicate - do what I mean/, "Output test pod2usage with relati
   *Pod::Usage::initialize = sub { 1; };
 }
 
+our $TODO;
 SKIP: {
     my $perldoc = $^X . 'doc';
     skip "Missing perldoc binary", 2 unless -x $perldoc;
@@ -378,8 +379,10 @@ SKIP: {
       } );
     is ($exit, 0,                 "Exit status pod2usage with special perldoc case");
     # output went to devnull
-    like ($text, qr/^\s*$/s, "Output test pod2usage with special perldoc case") or diag "Got:\n$text\n";
-
+    TODO: {
+        local $TODO = q[Can get output from stty view #14];
+        is( length($text), 0, "Output test pod2usage with special perldoc case") or diag "Got:\n$text\n";
+    }
 }
 
 # bad regexp syntax
index 16a34ec..a4790dd 100644 (file)
@@ -800,12 +800,12 @@ PPCODE:
         }
     }
 
-    if ( end < start ) {
+    if ( end <= start ) {
         XSRETURN(0);
     }
     else {
         EXTEND( SP, end - start );
-        for ( i = start; i <= end; i++ ) {
+        for ( i = start; i < end; i++ ) {
             PUSHs( sv_2mortal( newSVsv( ST(i) ) ) );
         }
         XSRETURN( end - start );
index a03b298..3766b06 100644 (file)
@@ -16,7 +16,7 @@ our @EXPORT_OK  = qw(
   sample shuffle uniq uniqint uniqnum uniqstr zip zip_longest zip_shortest mesh mesh_longest mesh_shortest
   head tail pairs unpairs pairkeys pairvalues pairmap pairgrep pairfirst
 );
-our $VERSION    = "1.62";
+our $VERSION    = "1.63";
 our $XS_VERSION = $VERSION;
 $VERSION =~ tr/_//d;
 
index 1be1960..28cf692 100644 (file)
@@ -3,7 +3,7 @@ use strict;
 use warnings;
 use List::Util;
 
-our $VERSION = "1.62";       # FIXUP
+our $VERSION = "1.63";       # FIXUP
 $VERSION =~ tr/_//d;         # FIXUP
 
 1;
index 984ccdd..760e641 100644 (file)
@@ -17,7 +17,7 @@ our @EXPORT_OK = qw(
   dualvar isdual isvstring looks_like_number openhandle readonly set_prototype
   tainted
 );
-our $VERSION    = "1.62";
+our $VERSION    = "1.63";
 $VERSION =~ tr/_//d;
 
 require List::Util; # List::Util loads the XS
@@ -145,7 +145,7 @@ on these but C<reftype()> will return the underlying C structure type of
 C<"REGEXP"> in all capitals.
 
 I<Since Perl version 5.35.7> an equivalent function is available as
-C<builtin::refaddr>.
+C<builtin::reftype>.
 
 =head2 weaken
 
@@ -230,7 +230,7 @@ B<NOTE>: Copying a weak reference creates a normal, strong, reference.
     $weak = isweak($copy);              # false
 
 I<Since Perl version 5.35.7> an equivalent function is available as
-C<builtin::isweak>.
+C<builtin::is_weak>.
 
 =head1 OTHER FUNCTIONS
 
index 573d920..f96e857 100644 (file)
@@ -15,7 +15,7 @@ our @EXPORT_OK = qw(
   subname set_subname
 );
 
-our $VERSION    = "1.62";
+our $VERSION    = "1.63";
 $VERSION =~ tr/_//d;
 
 require List::Util; # as it has the XS
index f7c6bd2..d241fd5 100644 (file)
@@ -219,13 +219,14 @@ my @names = (
        SO_ACCEPTCONN SO_ATTACH_FILTER SO_BACKLOG SO_BINDTODEVICE SO_BROADCAST
        SO_BSDCOMPAT SO_BUSY_POLL SO_CHAMELEON SO_DEBUG SO_DETACH_FILTER
        SO_DGRAM_ERRIND SO_DOMAIN SO_DONTLINGER SO_DONTROUTE SO_ERROR SO_FAMILY
-       SO_KEEPALIVE SO_LINGER SO_LOCK_FILTER SO_MARK SO_OOBINLINE SO_PASSCRED
-       SO_PASSIFNAME SO_PEEK_OFF SO_PEERCRED SO_PRIORITY SO_PROTOCOL
-       SO_PROTOTYPE SO_RCVBUF SO_RCVBUFFORCE SO_RCVLOWAT SO_RCVTIMEO
-       SO_REUSEADDR SO_REUSEPORT SO_RXQ_OVFL SO_SECURITY_AUTHENTICATION
-       SO_SECURITY_ENCRYPTION_NETWORK SO_SECURITY_ENCRYPTION_TRANSPORT
-       SO_SNDBUF SO_SNDBUFFORCE SO_SNDLOWAT SO_SNDTIMEO SO_STATE SO_TIMESTAMP
-       SO_TYPE SO_USELOOPBACK SO_XOPEN SO_XSE
+       SO_INCOMING_CPU SO_INCOMING_NAPI_ID SO_KEEPALIVE SO_LINGER
+       SO_LOCK_FILTER SO_MARK SO_OOBINLINE SO_PASSCRED SO_PASSIFNAME
+       SO_PEEK_OFF SO_PEERCRED SO_PRIORITY SO_PROTOCOL SO_PROTOTYPE SO_RCVBUF
+       SO_RCVBUFFORCE SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT
+       SO_RXQ_OVFL SO_SECURITY_AUTHENTICATION SO_SECURITY_ENCRYPTION_NETWORK
+       SO_SECURITY_ENCRYPTION_TRANSPORT SO_SNDBUF SO_SNDBUFFORCE SO_SNDLOWAT
+       SO_SNDTIMEO SO_STATE SO_TIMESTAMP SO_TYPE SO_USELOOPBACK SO_XOPEN
+       SO_XSE
 
        TCP_CONGESTION TCP_CONNECTIONTIMEOUT TCP_CORK TCP_DEFER_ACCEPT
        TCP_FASTOPEN TCP_INFO TCP_INIT_CWND TCP_KEEPALIVE TCP_KEEPCNT
index 5087ffc..6b01256 100644 (file)
@@ -3,7 +3,7 @@ package Socket;
 use strict;
 { use v5.6.1; }
 
-our $VERSION = '2.033';
+our $VERSION = '2.036';
 
 =head1 NAME
 
@@ -793,7 +793,8 @@ our @EXPORT_OK = qw(
        IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_RECVERR IPV6_ROUTER_ALERT
        IPV6_UNICAST_HOPS IPV6_V6ONLY
 
-       SO_LOCK_FILTER SO_RCVBUFFORCE SO_SNDBUFFORCE
+       SO_INCOMING_CPU SO_INCOMING_NAPI_ID SO_LOCK_FILTER SO_RCVBUFFORCE
+       SO_SNDBUFFORCE
 
        pack_ip_mreq unpack_ip_mreq pack_ip_mreq_source unpack_ip_mreq_source
 
index b4bccb7..d14d83a 100644 (file)
@@ -98,6 +98,14 @@ struct sockaddr_un
 
 #endif
 
+/*
+ * The Windows implementations of inet_ntop and inet_pton are available
+ * whenever (and only when) InetNtopA is defined.
+ * Use those implementations whenever they are available.
+ * Else use the implementations provided below.
+*/
+#ifndef InetNtopA
+
 static int inet_pton(int af, const char *src, void *dst)
 {
   struct sockaddr_storage ss;
@@ -146,6 +154,8 @@ static const char *inet_ntop(int af, const void *src, char *dst, socklen_t size)
     return dst;
 }
 
+#endif /* InetNtopA  not defined */
+
 #define HAS_INETPTON
 #define HAS_INETNTOP
 #endif
@@ -224,10 +234,6 @@ static SV *my_newSVpvn_flags(pTHX_ const char *s, STRLEN len, U32 flags)
 }
 #endif /* !newSVpvn_flags */
 
-#ifndef SvRV_set
-# define SvRV_set(sv, val) (SvRV(sv) = (val))
-#endif /* !SvRV_set */
-
 #ifndef SvPVbyte_nomg
 # define SvPVbyte_nomg SvPV
 #endif /* !SvPVbyte_nomg */
@@ -1191,13 +1197,14 @@ inet_ntop(af, ip_address_sv)
            break;
 #endif
          default:
-               croak("Bad address family for %s, got %d, should be"
 #ifdef AF_INET6
-                     " either AF_INET or AF_INET6",
+#    define WANT_FAMILY "either AF_INET or AF_INET6"
 #else
-                     " AF_INET",
+#    define WANT_FAMILY "AF_INET"
 #endif
+               croak("Bad address family for %s, got %d, should be " WANT_FAMILY,
                      "Socket::inet_ntop", af);
+#undef WANT_FAMILY
        }
 
        if(addrlen < sizeof(addr)) {
@@ -1240,13 +1247,13 @@ inet_pton(af, host)
            break;
 #endif
          default:
-               croak("Bad address family for %s, got %d, should be"
 #ifdef AF_INET6
-                     " either AF_INET or AF_INET6",
+#    define WANT_FAMILY "either AF_INET or AF_INET6"
 #else
-                     " AF_INET",
+#    define WANT_FAMILY "AF_INET"
 #endif
-                     "Socket::inet_pton", af);
+               croak("Bad address family for %s, got %d, should be " WANT_FAMILY, "Socket::inet_pton", af);
+#undef WANT_FAMILY
        }
        ok = (*host != '\0') && inet_pton(af, host, &ip_address);
 
index 9441fb4..9bc0ab1 100644 (file)
@@ -19,8 +19,8 @@ is( $host, undef, '$host is undef for NIx_NOHOST' );
 is( $service, "80", '$service is 80 for NS, NIx_NOHOST' );
 
 ( $err, $host, $service ) = getnameinfo( pack_sockaddr_in( 80, inet_aton( "127.0.0.1" ) ), NI_NUMERICHOST|NI_NUMERICSERV, NIx_NOSERV );
-is( $host, "127.0.0.1", '$host is undef for NIx_NOSERV' );
-is( $service, undef, '$service is 80 for NS, NIx_NOSERV' );
+is( $host, "127.0.0.1", '$host is 127.0.0.1 for NIx_NOSERV' );
+is( $service, undef, '$service is undef for NS, NIx_NOSERV' );
 
 ( $err, $host, $service ) = getnameinfo( pack_sockaddr_in( 80, inet_aton( "127.0.0.1" ) ), NI_NUMERICSERV );
 cmp_ok( $err, "==", 0, '$err == 0 for {family=AF_INET,port=80,sinaddr=127.0.0.1}/NI_NUMERICSERV' );
index c76963d..d09ba69 100644 (file)
@@ -14,7 +14,7 @@ if ($] < 5.008) {
 }
 
 # create a lib/ dir in order to avoid warnings in Test::Distribution
-mkdir "lib", $ENV{PERL_CORE} ? 0770 : 0755;
+mkdir "lib", 0755;
 
 # virtual paths given to EU::MM
 my %virtual_path = ( 'Syslog.pm' => '$(INST_LIBDIR)/Syslog.pm' );
index fa1a9a8..54ee178 100644 (file)
@@ -17,6 +17,7 @@ sub croak
 use strict;
 
 use vars qw($VERSION $VMS_TERMCAP);
+use vars qw($termpat $state $first $entry);
 
 $VERSION = '1.18';
 
@@ -169,8 +170,8 @@ sub Tgetent
     $self = {} unless defined $self;
     bless $self, $class;
 
-    my ( $term, $cap, $search, $field, $tmp_term, $TERMCAP );
-    my ( $state, $first, $entry ); 
+    my ( $term, $cap, $search, $field, $max, $tmp_term, $TERMCAP );
+    local ( $termpat, $state, $first, $entry );    # used inside eval
     local $_;
 
     # Compute PADDING factor from OSPEED (to be used by Tpad)
@@ -220,25 +221,67 @@ sub Tgetent
 
     # $tmp_term is always the next term (possibly :tc=...:) we are looking for
     $tmp_term = $self->{TERM};
-    my $seen = {};
 
-    if (exists $ENV{TERMCAP}) {
-       local $_ = $ENV{TERMCAP};
-       if ( !m:^/:s && m/(^|\|)\Q$tmp_term\E[:|]/s ) {
-           $entry = $_;
-           $seen->{$tmp_term} = 1;
-       }
+    # protect any pattern metacharacters in $tmp_term
+    $termpat = $tmp_term;
+    $termpat =~ s/(\W)/\\$1/g;
+
+    my $foo = ( exists $ENV{TERMCAP} ? $ENV{TERMCAP} : '' );
+
+    # $entry is the extracted termcap entry
+    if ( ( $foo !~ m:^/:s ) && ( $foo =~ m/(^|\|)${termpat}[:|]/s ) )
+    {
+        $entry = $foo;
     }
 
     my @termcap_path = termcap_path();
 
+    if ( !@termcap_path && !$entry )
+    {
+
+        # last resort--fake up a termcap from terminfo
+        local $ENV{TERM} = $term;
+
+        if ( $^O eq 'VMS' )
+        {
+            $entry = $VMS_TERMCAP;
+        }
+        else
+        {
+            if ( grep { -x "$_/infocmp" } split /:/, $ENV{PATH} )
+            {
+                eval {
+                    my $tmp = `infocmp -C 2>/dev/null`;
+                    $tmp =~ s/^#.*\n//gm;    # remove comments
+                    if (   ( $tmp !~ m%^/%s )
+                        && ( $tmp =~ /(^|\|)${termpat}[:|]/s ) )
+                    {
+                        $entry = $tmp;
+                    }
+                };
+                warn "Can't run infocmp to get a termcap entry: $@" if $@;
+            }
+            else
+            {
+               # this is getting desperate now
+               if ( $self->{TERM} eq 'dumb' )
+               {
+                  $entry = 'dumb|80-column dumb tty::am::co#80::bl=^G:cr=^M:do=^J:sf=^J:';
+               }
+            }
+        }
+    }
+
+    croak "Can't find a valid termcap file" unless @termcap_path || $entry;
+
     $state = 1;    # 0 == finished
                    # 1 == next file
                    # 2 == search again
-                  # 3 == try infocmp
 
     $first = 0;    # first entry (keeps term name)
 
+    $max = 32;     # max :tc=...:'s
+
     if ($entry)
     {
 
@@ -248,6 +291,10 @@ sub Tgetent
         if ( $entry =~ s/:tc=([^:]+):/:/ )
         {
             $tmp_term = $1;
+
+            # protect any pattern metacharacters in $tmp_term
+            $termpat = $tmp_term;
+            $termpat =~ s/(\W)/\\$1/g;
         }
         else
         {
@@ -255,76 +302,57 @@ sub Tgetent
         }
     }
 
-
-    while ( $state != 0 )
-    {
-        if ( $state == 1 ) {
-            # get the next TERMCAP
-            $TERMCAP = shift @termcap_path or $state = 3;
-       } elsif ($state == 3) {
-           croak "failed termcap lookup on $tmp_term";
-        } else {
-            # do the same file again
-            $state = 1;    # ok, maybe do a new file next time
-        }
-
-       my ($fh, $child);
-       if ($state == 3) {
-           # need to do a proper fork, so that we can pass tmp_term
-           # without having to quote it.
-           $child = open($fh, "-|");
-           warn "cannot run infocmp: $!" if !defined $child;
-           if (!$child) {
-               open(STDERR, ">", "/dev/null");
-               exec('infocmp', '-CTrx', '--', $tmp_term);
-               exit(1);
-           }
-       } else {
-           open($fh, '<', $TERMCAP) || croak "open $TERMCAP: $!";
-       }
-       while (<$fh>) {
-           next if /^\t/ || /^#/;
-           if (m/(^|\|)\Q$tmp_term\E[:|]/) {
+    # This is eval'ed inside the while loop for each file
+    $search = q{
+       while (<TERMCAP>) {
+           next if /^\\t/ || /^#/;
+           if ($_ =~ m/(^|\\|)${termpat}[:|]/o) {
                chomp;
                s/^[^:]*:// if $first++;
                $state = 0;
-               $seen->{$tmp_term} = 1;
-               while (s/\\$//) {
-                   defined(my $x = <$fh>) or last;
+               while ($_ =~ s/\\\\$//) {
+                   defined(my $x = <TERMCAP>) or last;
                    $_ .= $x; chomp;
                }
-               if (defined $entry) {
-                   $entry .= $_;
-               } else {
-                   $entry = $_;
-               }
                last;
            }
        }
-        close $fh;
-       waitpid($child, 0) if defined $child;
+       defined $entry or $entry = '';
+       $entry .= $_ if $_;
+    };
 
-       next if $state != 0;
+    while ( $state != 0 )
+    {
+        if ( $state == 1 )
+        {
+
+            # get the next TERMCAP
+            $TERMCAP = shift @termcap_path
+              || croak "failed termcap lookup on $tmp_term";
+        }
+        else
+        {
+
+            # do the same file again
+            # prevent endless recursion
+            $max-- || croak "failed termcap loop at $tmp_term";
+            $state = 1;    # ok, maybe do a new file next time
+        }
+
+        open( TERMCAP, "< $TERMCAP\0" ) || croak "open $TERMCAP: $!";
+        eval $search;
+        die $@ if $@;
+        close TERMCAP;
 
         # If :tc=...: found then search this file again
-       while ($entry =~ s/:tc=([^:]+):/:/) {
-           $tmp_term = $1;
-           next if $seen->{$tmp_term};
-           $state = 2;
-           last;
-       }
-    }
+        $entry =~ s/:tc=([^:]+):/:/ && ( $tmp_term = $1, $state = 2 );
 
-    if ( !defined $entry ) {
-        if ( $^O eq 'VMS' ) {
-            $entry = $VMS_TERMCAP;
-       # this is getting desperate now
-        } elsif ( $self->{TERM} eq 'dumb' ){
-         $entry = 'dumb|80-column dumb tty::am::co#80::bl=^G:cr=^M:do=^J:sf=^J:';
-       }
+        # protect any pattern metacharacters in $tmp_term
+        $termpat = $tmp_term;
+        $termpat =~ s/(\W)/\\$1/g;
     }
 
-    croak "Can't find $term" if !defined $entry;
+    croak "Can't find $term" if $entry eq '';
     $entry =~ s/:+\s*:+/:/g;    # cleanup $entry
     $entry =~ s/:+/:/g;         # cleanup $entry
     $self->{TERMCAP} = $entry;  # save it
index 59782fe..60059ab 100755 (executable)
@@ -25,7 +25,7 @@ unless( $files || $terminfo || $^O eq 'VMS' ) {
     plan skip_all => 'no termcap available to test';
 }
 else {
-    plan tests => 44;
+    plan tests => 45;
 }
 
 use_ok( 'Term::Cap' );
@@ -135,10 +135,10 @@ SKIP: {
 
        # it shouldn't try to read one file more than 32(!) times
        # see __END__ for a really awful termcap example
-#      $ENV{TERMPATH} = join(' ', ('tcout') x 33);
-#      $vals->{TERM} = 'bar';
-#      eval { $t = Term::Cap->Tgetent($vals) };
-#      like( $@, qr/failed termcap loop/, 'Tgetent() should catch deep recursion');
+       $ENV{TERMPATH} = join(' ', ('tcout') x 33);
+       $vals->{TERM} = 'bar';
+       eval { $t = Term::Cap->Tgetent($vals) };
+       like( $@, qr/failed termcap loop/, 'Tgetent() should catch deep recursion');
 
        # now let it read a fake termcap file, and see if it sets properties 
        $ENV{TERMPATH} = 'tcout';
index 4e630f8..4c14dc4 100644 (file)
@@ -4,7 +4,7 @@ use 5.006;
 use strict;
 use warnings;
 
-our $VERSION = '1.302190';
+our $VERSION = '1.302194';
 
 BEGIN {
     if( $] < 5.008 ) {
@@ -1002,15 +1002,7 @@ END
             $self->_is_diag( $got, $type, $expect );
         }
         elsif( $type =~ /^(ne|!=)$/ ) {
-            no warnings;
-            my $eq = ($got eq $expect || $got == $expect)
-                && (
-                    (defined($got) xor defined($expect))
-                 || (length($got)  !=  length($expect))
-                );
-            use warnings;
-
-            if ($eq) {
+            if (defined($got) xor defined($expect)) {
                 $self->_cmp_diag( $got, $type, $expect );
             }
             else {
index 0123188..c5a24e6 100644 (file)
@@ -7,7 +7,7 @@ use Test::Builder;
 require Exporter;
 our @ISA = qw(Exporter);
 
-our $VERSION = '1.302190';
+our $VERSION = '1.302194';
 
 
 =head1 NAME
index bbd6140..a171b01 100644 (file)
@@ -1,7 +1,7 @@
 package Test::Builder::Tester;
 
 use strict;
-our $VERSION = '1.302190';
+our $VERSION = '1.302194';
 
 use Test::Builder;
 use Symbol;
index 9252488..31a4c28 100644 (file)
@@ -1,7 +1,7 @@
 package Test::Builder::Tester::Color;
 
 use strict;
-our $VERSION = '1.302190';
+our $VERSION = '1.302194';
 
 require Test::Builder::Tester;
 
index 488a1f1..f1f9e37 100644 (file)
@@ -17,7 +17,7 @@ sub _carp {
     return warn @_, " at $file line $line\n";
 }
 
-our $VERSION = '1.302190';
+our $VERSION = '1.302194';
 
 use Test::Builder::Module;
 our @ISA    = qw(Test::Builder::Module);
@@ -394,8 +394,13 @@ different from some other value:
 
   isnt $obj, $clone, "clone() produces a different object";
 
-For those grammatical pedants out there, there's an C<isn't()>
-function which is an alias of C<isnt()>.
+Historically we supported an C<isn't()> function as an alias of
+C<isnt()>, however in Perl 5.37.9 support for the use of aprostrophe as
+a package separator was deprecated and by Perl 5.42.0 support for it
+will have been removed completely. Accordingly use of C<isn't()> is also
+deprecated, and will produce warnings when used unless 'deprecated'
+warnings are specifically disabled in the scope where it is used. You
+are strongly advised to migrate to using C<isnt()> instead.
 
 =cut
 
@@ -411,8 +416,25 @@ sub isnt ($$;$) {
     return $tb->isnt_eq(@_);
 }
 
-# make this available as isn't()
-*isn::t = \&isnt;
+# Historically it was possible to use apostrophes as a package
+# separator. make this available as isn't() for perl's that support it.
+# However in 5.37.9 the apostrophe as a package separator was
+# deprecated, so warn users of isn't() that they should use isnt()
+# instead. We assume that if they are calling isn::t() they are doing so
+# via isn't() as we have no way to be sure that they aren't spelling it
+# with a double colon. We only trigger the warning if deprecation
+# warnings are enabled, so the user can silence the warning if they
+# wish.
+sub isn::t {
+    local ($@, $!, $?);
+    if (warnings::enabled("deprecated")) {
+        _carp
+        "Use of apostrophe as package separator was deprecated in Perl 5.37.9,\n",
+        "and will be removed in Perl 5.42.0.  You should change code that uses\n",
+        "Test::More::isn't() to use Test::More::isnt() as a replacement";
+    }
+    goto &isnt;
+}
 
 =item B<like>
 
@@ -1770,8 +1792,8 @@ sub eq_set {
 Sometimes the Test::More interface isn't quite enough.  Fortunately,
 Test::More is built on top of L<Test::Builder> which provides a single,
 unified backend for any test library to use.  This means two test
-libraries which both use <Test::Builder> B<can> be used together in the
-same program>.
+libraries which both use L<Test::Builder> B<can> be used together in the
+same program.
 
 If you simply want to do a little tweaking of how the tests behave,
 you can access the underlying L<Test::Builder> object like so:
index 210f867..a7649f4 100644 (file)
@@ -4,7 +4,7 @@ use 5.006;
 
 use strict;
 
-our $VERSION = '1.302190';
+our $VERSION = '1.302194';
 
 use Test::Builder::Module;
 our @ISA    = qw(Test::Builder::Module);
index 7ddc3cf..9e91222 100644 (file)
@@ -18,7 +18,7 @@ require Exporter;
 
 use vars qw( @ISA @EXPORT );
 
-our $VERSION = '1.302190';
+our $VERSION = '1.302194';
 
 @EXPORT = qw( run_tests check_tests check_test cmp_results show_space );
 @ISA = qw( Exporter );
index 846f1d2..7c7e854 100644 (file)
@@ -2,7 +2,7 @@ use strict;
 
 package Test::Tester::Capture;
 
-our $VERSION = '1.302190';
+our $VERSION = '1.302194';
 
 
 use Test::Builder;
index dff28a6..574de86 100644 (file)
@@ -3,7 +3,7 @@ use strict;
 
 package Test::Tester::CaptureRunner;
 
-our $VERSION = '1.302190';
+our $VERSION = '1.302194';
 
 
 use Test::Tester::Capture;
index 20738f8..1c8d873 100644 (file)
@@ -3,7 +3,7 @@ use warnings;
 
 package Test::Tester::Delegate;
 
-our $VERSION = '1.302190';
+our $VERSION = '1.302194';
 
 use Scalar::Util();
 
index 5f0e686..757e168 100644 (file)
@@ -1,7 +1,7 @@
 package Test::use::ok;
 use 5.005;
 
-our $VERSION = '1.302190';
+our $VERSION = '1.302194';
 
 
 __END__
index a300a73..437c938 100644 (file)
@@ -1,5 +1,5 @@
 package ok;
-our $VERSION = '1.302190';
+our $VERSION = '1.302194';
 
 use strict;
 use Test::More ();
index 324a023..49f3d89 100644 (file)
@@ -1,6 +1,7 @@
 # Copyright (C) 1997-2001 Damian Conway.  All rights reserved.
 # Copyright (C) 2009 Adam Kennedy.
-# Copyright (C) 2015 Steve Hay.  All rights reserved.
+# Copyright (C) 2015, 2022 Steve Hay and other contributors.  All rights
+# reserved.
 
 # This module is free software; you can redistribute it and/or modify it under
 # the same terms as Perl itself, i.e. under the terms of either the GNU General
@@ -17,7 +18,7 @@ use Exporter ();
 
 use vars qw { $VERSION @ISA %EXPORT_TAGS };
 BEGIN {
-    $VERSION     = '2.04';
+    $VERSION     = '2.06';
     @ISA         = 'Exporter';
     %EXPORT_TAGS = (
         ALL => [ qw{
@@ -37,14 +38,22 @@ BEGIN {
 
 Exporter::export_ok_tags('ALL');
 
-## no critic (Subroutines::ProhibitSubroutinePrototypes)
-
-# PROTOTYPES
-
-sub _match_bracketed($$$$$$);
-sub _match_variable($$);
-sub _match_codeblock($$$$$$$);
-sub _match_quotelike($$$$);
+our $RE_PREREGEX_PAT = qr#(
+    [!=]~
+    | split|grep|map
+    | not|and|or|xor
+)#x;
+our $RE_EXPR_PAT = qr#(
+    (?:\*\*|&&|\|\||<<|>>|//|[-+*x%^&|.])=?
+    | /(?:[^/])
+    | =(?!>)
+    | return
+    | [\(\[]
+)#x;
+our $RE_NUM = qr/\s*[+\-.0-9][+\-.0-9e]*/i; # numerical constant
+
+our %ref2slashvalid; # is quotelike /.../ pattern valid here for given textref?
+our %ref2qmarkvalid; # is quotelike ?...? pattern valid here for given textref?
 
 # HANDLE RETURN VALUES IN VARIOUS CONTEXTS
 
@@ -99,6 +108,7 @@ sub _succeed {
 }
 
 # BUILD A PATTERN MATCHING A SIMPLE DELIMITED STRING
+## no critic (Subroutines::ProhibitSubroutinePrototypes)
 
 sub gen_delimited_pat($;$)  # ($delimiters;$escapes)
 {
@@ -132,6 +142,7 @@ sub gen_delimited_pat($;$)  # ($delimiters;$escapes)
 sub extract_delimited (;$$$$)
 {
     my $textref = defined $_[0] ? \$_[0] : \$_;
+    $ref2slashvalid{$textref} = 1, $ref2qmarkvalid{$textref} = 0 if !pos($$textref); # reset
     my $wantarray = wantarray;
     my $del  = defined $_[1] ? $_[1] : qq{\'\"\`};
     my $pre  = defined $_[2] ? $_[2] : '\s*';
@@ -149,33 +160,45 @@ sub extract_delimited (;$$$$)
                     $startpos, $prelen;                         # PREFIX
 }
 
-sub extract_bracketed (;$$$)
-{
-    my $textref = defined $_[0] ? \$_[0] : \$_;
-    my $ldel = defined $_[1] ? $_[1] : '{([<';
-    my $pre  = defined $_[2] ? $_[2] : '\s*';
-    my $wantarray = wantarray;
+my %eb_delim_cache;
+sub _eb_delims {
+    my ($ldel_orig) = @_;
+    return @{ $eb_delim_cache{$ldel_orig} } if $eb_delim_cache{$ldel_orig};
     my $qdel = "";
     my $quotelike;
+    my $ldel = $ldel_orig;
     $ldel =~ s/'//g and $qdel .= q{'};
     $ldel =~ s/"//g and $qdel .= q{"};
     $ldel =~ s/`//g and $qdel .= q{`};
     $ldel =~ s/q//g and $quotelike = 1;
     $ldel =~ tr/[](){}<>\0-\377/[[(({{<</ds;
     my $rdel = $ldel;
-    unless ($rdel =~ tr/[({</])}>/)
+    return @{ $eb_delim_cache{$ldel_orig} = [] } unless $rdel =~ tr/[({</])}>/;
+    my $posbug = pos;
+    $ldel = join('|', map { quotemeta $_ } split('', $ldel));
+    $rdel = join('|', map { quotemeta $_ } split('', $rdel));
+    pos = $posbug;
+    @{ $eb_delim_cache{$ldel_orig} = [
+        qr/\G($ldel)/, $qdel && qr/\G([$qdel])/, $quotelike, qr/\G($rdel)/
+    ] };
+}
+sub extract_bracketed (;$$$)
+{
+    my $textref = defined $_[0] ? \$_[0] : \$_;
+    $ref2slashvalid{$textref} = 1, $ref2qmarkvalid{$textref} = 0 if !pos($$textref); # reset
+    my $ldel = defined $_[1] ? $_[1] : '{([<';
+    my $pre  = defined $_[2] ? qr/\G$_[2]/ : qr/\G\s*/;
+    my $wantarray = wantarray;
+    my @ret = _eb_delims($ldel);
+    unless (@ret)
     {
         return _fail $wantarray, $textref,
                      "Did not find a suitable bracket in delimiter: \"$_[1]\"",
                      0;
     }
-    my $posbug = pos;
-    $ldel = join('|', map { quotemeta $_ } split('', $ldel));
-    $rdel = join('|', map { quotemeta $_ } split('', $rdel));
-    pos = $posbug;
 
     my $startpos = pos $$textref || 0;
-    my @match = _match_bracketed($textref,$pre, $ldel, $qdel, $quotelike, $rdel);
+    my @match = _match_bracketed($textref, $pre, @ret);
 
     return _fail ($wantarray, $textref) unless @match;
 
@@ -186,11 +209,11 @@ sub extract_bracketed (;$$$)
                     );
 }
 
-sub _match_bracketed($$$$$$)    # $textref, $pre, $ldel, $qdel, $quotelike, $rdel
+sub _match_bracketed    # $textref, $pre, $ldel, $qdel, $quotelike, $rdel
 {
     my ($textref, $pre, $ldel, $qdel, $quotelike, $rdel) = @_;
     my ($startpos, $ldelpos, $endpos) = (pos $$textref = pos $$textref||0);
-    unless ($$textref =~ m/\G$pre/gc)
+    unless ($$textref =~ m/$pre/gc)
     {
         _failmsg "Did not find prefix: /$pre/", $startpos;
         return;
@@ -198,7 +221,7 @@ sub _match_bracketed($$$$$$)    # $textref, $pre, $ldel, $qdel, $quotelike, $rde
 
     $ldelpos = pos $$textref;
 
-    unless ($$textref =~ m/\G($ldel)/gc)
+    unless ($$textref =~ m/$ldel/gc)
     {
         _failmsg "Did not find opening bracket after prefix: \"$pre\"",
                  pos $$textref;
@@ -212,11 +235,11 @@ sub _match_bracketed($$$$$$)    # $textref, $pre, $ldel, $qdel, $quotelike, $rde
     {
         next if $$textref =~ m/\G\\./gcs;
 
-        if ($$textref =~ m/\G($ldel)/gc)
+        if ($$textref =~ m/$ldel/gc)
         {
             push @nesting, $1;
         }
-        elsif ($$textref =~ m/\G($rdel)/gc)
+        elsif ($$textref =~ m/$rdel/gc)
         {
             my ($found, $brackettype) = ($1, $1);
             if ($#nesting < 0)
@@ -237,7 +260,7 @@ sub _match_bracketed($$$$$$)    # $textref, $pre, $ldel, $qdel, $quotelike, $rde
             }
             last if $#nesting < 0;
         }
-        elsif ($qdel && $$textref =~ m/\G([$qdel])/gc)
+        elsif ($qdel && $$textref =~ m/$qdel/gc)
         {
             $$textref =~ m/\G[^\\$1]*(?:\\.[^\\$1]*)*(\Q$1\E)/gsc and next;
             _failmsg "Unmatched embedded quote ($1)",
@@ -245,8 +268,9 @@ sub _match_bracketed($$$$$$)    # $textref, $pre, $ldel, $qdel, $quotelike, $rde
             pos $$textref = $startpos;
             return;
         }
-        elsif ($quotelike && _match_quotelike($textref,"",1,0))
+        elsif ($quotelike && _match_quotelike($textref,qr/\G()/,$ref2slashvalid{$textref},$ref2qmarkvalid{$textref}))
         {
+            $ref2slashvalid{$textref} = $ref2qmarkvalid{$textref} = 1; # back-compat
             next;
         }
 
@@ -281,12 +305,14 @@ sub _revbracket($)
 
 my $XMLNAME = q{[a-zA-Z_:][a-zA-Z0-9_:.-]*};
 
+my $et_default_ldel = '<\w+(?:' . gen_delimited_pat(q{'"}) . '|[^>])*>';
 sub extract_tagged (;$$$$$) # ($text, $opentag, $closetag, $pre, \%options)
 {
     my $textref = defined $_[0] ? \$_[0] : \$_;
+    $ref2slashvalid{$textref} = 1, $ref2qmarkvalid{$textref} = 0 if !pos($$textref); # reset
     my $ldel    = $_[1];
     my $rdel    = $_[2];
-    my $pre     = defined $_[3] ? $_[3] : '\s*';
+    my $pre     = defined $_[3] ? qr/\G$_[3]/ : qr/\G\s*/;
     my %options = defined $_[4] ? %{$_[4]} : ();
     my $omode   = defined $options{fail} ? $options{fail} : '';
     my $bad     = ref($options{reject}) eq 'ARRAY' ? join('|', @{$options{reject}})
@@ -298,7 +324,7 @@ sub extract_tagged (;$$$$$) # ($text, $opentag, $closetag, $pre, \%options)
                 :                                    ''
                 ;
 
-    if (!defined $ldel) { $ldel = '<\w+(?:' . gen_delimited_pat(q{'"}) . '|[^>])*>'; }
+    $ldel = $et_default_ldel if !defined $ldel;
     $@ = undef;
 
     my @match = _match_tagged($textref, $pre, $ldel, $rdel, $omode, $bad, $ignore);
@@ -316,7 +342,7 @@ sub _match_tagged       # ($$$$$$$)
 
     my ($startpos, $opentagpos, $textpos, $parapos, $closetagpos, $endpos) = ( pos($$textref) = pos($$textref)||0 );
 
-    unless ($$textref =~ m/\G($pre)/gc)
+    unless ($$textref =~ m/$pre/gc)
     {
         _failmsg "Did not find prefix: /$pre/", pos $$textref;
         goto failed;
@@ -433,7 +459,8 @@ sub extract_variable (;$$)
 {
     my $textref = defined $_[0] ? \$_[0] : \$_;
     return ("","","") unless defined $$textref;
-    my $pre  = defined $_[1] ? $_[1] : '\s*';
+    $ref2slashvalid{$textref} = 1, $ref2qmarkvalid{$textref} = 0 if !pos($$textref); # reset
+    my $pre  = defined $_[1] ? qr/\G$_[1]/ : qr/\G\s*/;
 
     my @match = _match_variable($textref,$pre);
 
@@ -443,14 +470,14 @@ sub extract_variable (;$$)
                     @match[2..3,4..5,0..1];        # MATCH, REMAINDER, PREFIX
 }
 
-sub _match_variable($$)
+sub _match_variable
 {
 #  $#
 #  $^
 #  $$
     my ($textref, $pre) = @_;
     my $startpos = pos($$textref) = pos($$textref)||0;
-    unless ($$textref =~ m/\G($pre)/gc)
+    unless ($$textref =~ m/$pre/gc)
     {
         _failmsg "Did not find prefix: /$pre/", pos $$textref;
         return;
@@ -467,8 +494,9 @@ sub _match_variable($$)
         my $deref = $1;
 
         unless ($$textref =~ m/\G\s*(?:::|')?(?:[_a-z]\w*(?:::|'))*[_a-z]\w*/gci
-            or _match_codeblock($textref, "", '\{', '\}', '\{', '\}', 0)
-            or $deref eq '$#' or $deref eq '$$' )
+            or _match_codeblock($textref, qr/\G()/, '\{', qr/\G\s*(\})/, '\{', '\}', 0, 1)
+            or $deref eq '$#' or $deref eq '$$'
+            or pos($$textref) == length $$textref )
         {
             _failmsg "Bad identifier after dereferencer", pos $$textref;
             pos $$textref = $startpos;
@@ -480,16 +508,17 @@ sub _match_variable($$)
     {
         next if $$textref =~ m/\G\s*(?:->)?\s*[{]\w+[}]/gc;
         next if _match_codeblock($textref,
-                                 qr/\s*->\s*(?:[_a-zA-Z]\w+\s*)?/,
-                                 qr/[({[]/, qr/[)}\]]/,
-                                 qr/[({[]/, qr/[)}\]]/, 0);
+                                 qr/\G\s*->\s*(?:[_a-zA-Z]\w+\s*)?/,
+                                 qr/[({[]/, qr/\G\s*([)}\]])/,
+                                 qr/[({[]/, qr/[)}\]]/, 0, 1);
         next if _match_codeblock($textref,
-                                 qr/\s*/, qr/[{[]/, qr/[}\]]/,
-                                 qr/[{[]/, qr/[}\]]/, 0);
-        next if _match_variable($textref,'\s*->\s*');
+                                 qr/\G\s*/, qr/[{[]/, qr/\G\s*([}\]])/,
+                                 qr/[{[]/, qr/[}\]]/, 0, 1);
+        next if _match_variable($textref,qr/\G\s*->\s*/);
         next if $$textref =~ m/\G\s*->\s*\w+(?![{([])/gc;
         last;
     }
+    $ref2slashvalid{$textref} = $ref2qmarkvalid{$textref} = 0;
 
     my $endpos = pos($$textref);
     return ($startpos, $varpos-$startpos,
@@ -498,14 +527,11 @@ sub _match_variable($$)
     );
 }
 
-sub extract_codeblock (;$$$$$)
-{
-    my $textref = defined $_[0] ? \$_[0] : \$_;
-    my $wantarray = wantarray;
-    my $ldel_inner = defined $_[1] ? $_[1] : '{';
-    my $pre        = defined $_[2] ? $_[2] : '\s*';
-    my $ldel_outer = defined $_[3] ? $_[3] : $ldel_inner;
-    my $rd         = $_[4];
+my %ec_delim_cache;
+sub _ec_delims {
+    my ($ldel_inner, $ldel_outer) = @_;
+    return @{ $ec_delim_cache{$ldel_outer}{$ldel_inner} }
+        if $ec_delim_cache{$ldel_outer}{$ldel_inner};
     my $rdel_inner = $ldel_inner;
     my $rdel_outer = $ldel_outer;
     my $posbug = pos;
@@ -516,23 +542,34 @@ sub extract_codeblock (;$$$$$)
         $_ = '('.join('|',map { quotemeta $_ } split('',$_)).')'
     }
     pos = $posbug;
+    @{ $ec_delim_cache{$ldel_outer}{$ldel_inner} = [
+        $ldel_outer, qr/\G\s*($rdel_outer)/, $ldel_inner, $rdel_inner
+    ] };
+}
+sub extract_codeblock (;$$$$$)
+{
+    my $textref = defined $_[0] ? \$_[0] : \$_;
+    $ref2slashvalid{$textref} = 1, $ref2qmarkvalid{$textref} = 0 if !pos($$textref); # reset
+    my $wantarray = wantarray;
+    my $ldel_inner = defined $_[1] ? $_[1] : '{';
+    my $pre = !defined $_[2] ? qr/\G\s*/ : qr/\G$_[2]/;
+    my $ldel_outer = defined $_[3] ? $_[3] : $ldel_inner;
+    my $rd         = $_[4];
+    my @delims = _ec_delims($ldel_inner, $ldel_outer);
 
-    my @match = _match_codeblock($textref, $pre,
-                                 $ldel_outer, $rdel_outer,
-                                 $ldel_inner, $rdel_inner,
-                                 $rd);
+    my @match = _match_codeblock($textref, $pre, @delims, $rd, 1);
     return _fail($wantarray, $textref) unless @match;
     return _succeed($wantarray, $textref,
                     @match[2..3,4..5,0..1]    # MATCH, REMAINDER, PREFIX
     );
-
 }
 
-sub _match_codeblock($$$$$$$)
+sub _match_codeblock
 {
-    my ($textref, $pre, $ldel_outer, $rdel_outer, $ldel_inner, $rdel_inner, $rd) = @_;
+    my ($textref, $pre, $ldel_outer, $rdel_outer, $ldel_inner, $rdel_inner, $rd, $no_backcompat) = @_;
+    $rdel_outer = qr/\G\s*($rdel_outer)/ if !$no_backcompat; # Switch calls this func directly
     my $startpos = pos($$textref) = pos($$textref) || 0;
-    unless ($$textref =~ m/\G($pre)/gc)
+    unless ($$textref =~ m/$pre/gc)
     {
         _failmsg qq{Did not match prefix /$pre/ at"} .
                      substr($$textref,pos($$textref),20) .
@@ -553,13 +590,13 @@ sub _match_codeblock($$$$$$$)
     my $closing = $1;
        $closing =~ tr/([<{/)]>}/;
     my $matched;
-    my $patvalid = 1;
+    $ref2slashvalid{$textref} = 1, $ref2qmarkvalid{$textref} = 0
+      if !pos($$textref) or !defined $ref2slashvalid{$textref}; # default, or reset
     while (pos($$textref) < length($$textref))
     {
-        $matched = '';
         if ($rd && $$textref =~ m#\G(\Q(?)\E|\Q(s?)\E|\Q(s)\E)#gc)
         {
-            $patvalid = 0;
+            $ref2slashvalid{$textref} = $ref2qmarkvalid{$textref} = 0;
             next;
         }
 
@@ -568,7 +605,7 @@ sub _match_codeblock($$$$$$$)
             next;
         }
 
-        if ($$textref =~ m/\G\s*($rdel_outer)/gc)
+        if ($$textref =~ m/$rdel_outer/gc)
         {
             unless ($matched = ($closing && $1 eq $closing) )
             {
@@ -581,31 +618,22 @@ sub _match_codeblock($$$$$$$)
             last;
         }
 
-        if (_match_variable($textref,'\s*') ||
-            _match_quotelike($textref,'\s*',$patvalid,$patvalid) )
+        if (_match_variable($textref,qr/\G\s*/) ||
+            _match_quotelike($textref,qr/\G\s*/,$ref2slashvalid{$textref},$ref2qmarkvalid{$textref}) )
         {
-            $patvalid = 0;
+            $ref2slashvalid{$textref} = $ref2qmarkvalid{$textref} = 0;
             next;
         }
 
-
-        # NEED TO COVER MANY MORE CASES HERE!!!
-        if ($$textref =~ m#\G\s*(?!$ldel_inner)
-                                ( [-+*x/%^&|.]=?
-                                | [!=]~
-                                | =(?!>)
-                                | (\*\*|&&|\|\||<<|>>)=?
-                                | split|grep|map|return
-                                | [([]
-                                )#gcx)
+        if ($$textref =~ m#\G\s*(?!$ldel_inner)(?:$RE_PREREGEX_PAT|$RE_EXPR_PAT)#gc)
         {
-            $patvalid = 1;
+            $ref2slashvalid{$textref} = $ref2qmarkvalid{$textref} = 1;
             next;
         }
 
-        if ( _match_codeblock($textref, '\s*', $ldel_inner, $rdel_inner, $ldel_inner, $rdel_inner, $rd) )
+        if ( _match_codeblock($textref, qr/\G\s*/, $ldel_inner, qr/\G\s*($rdel_inner)/, $ldel_inner, $rdel_inner, $rd, 1) )
         {
-            $patvalid = 1;
+            $ref2slashvalid{$textref} = $ref2qmarkvalid{$textref} = 1;
             next;
         }
 
@@ -618,7 +646,7 @@ sub _match_codeblock($$$$$$$)
             last;
         }
 
-        $patvalid = 0;
+        $ref2slashvalid{$textref} = $ref2qmarkvalid{$textref} = 0;
         $$textref =~ m/\G\s*(\w+|[-=>]>|.|\Z)/gc;
     }
     continue { $@ = undef }
@@ -630,6 +658,7 @@ sub _match_codeblock($$$$$$$)
         return;
     }
 
+    $ref2slashvalid{$textref} = $ref2qmarkvalid{$textref} = undef;
     my $endpos = pos($$textref);
     return ( $startpos, $codepos-$startpos,
              $codepos, $endpos-$codepos,
@@ -654,10 +683,11 @@ my %mods   = (
 sub extract_quotelike (;$$)
 {
     my $textref = $_[0] ? \$_[0] : \$_;
+    $ref2slashvalid{$textref} = 1, $ref2qmarkvalid{$textref} = 0 if !pos($$textref); # reset
     my $wantarray = wantarray;
-    my $pre  = defined $_[1] ? $_[1] : '\s*';
+    my $pre  = defined $_[1] ? qr/\G$_[1]/ : qr/\G\s*/;
 
-    my @match = _match_quotelike($textref,$pre,1,0);
+    my @match = _match_quotelike($textref,$pre,$ref2slashvalid{$textref},$ref2qmarkvalid{$textref});
     return _fail($wantarray, $textref) unless @match;
     return _succeed($wantarray, $textref,
                     $match[2], $match[18]-$match[2],    # MATCH
@@ -668,17 +698,19 @@ sub extract_quotelike (;$$)
     );
 };
 
-sub _match_quotelike($$$$)      # ($textref, $prepat, $allow_raw_match)
+my %maybe_quote = map +($_=>1), qw(" ' `);
+sub _match_quotelike
 {
-    my ($textref, $pre, $rawmatch, $qmark) = @_;
+    my ($textref, $pre, $allow_slash_match, $allow_qmark_match) = @_;
+    $ref2slashvalid{$textref} = 1, $ref2qmarkvalid{$textref} = 0
+      if !pos($$textref) or !defined $ref2slashvalid{$textref}; # default, or reset
 
     my ($textlen,$startpos,
-        $oppos,
         $preld1pos,$ld1pos,$str1pos,$rd1pos,
         $preld2pos,$ld2pos,$str2pos,$rd2pos,
         $modpos) = ( length($$textref), pos($$textref) = pos($$textref) || 0 );
 
-    unless ($$textref =~ m/\G($pre)/gc)
+    unless ($$textref =~ m/$pre/gc)
     {
         _failmsg qq{Did not find prefix /$pre/ at "} .
                      substr($$textref, pos($$textref), 20) .
@@ -686,15 +718,13 @@ sub _match_quotelike($$$$)      # ($textref, $prepat, $allow_raw_match)
                  pos $$textref;
         return;
     }
-    $oppos = pos($$textref);
-
+    my $oppos = pos($$textref);
     my $initial = substr($$textref,$oppos,1);
-
-    if ($initial && $initial =~ m|^[\"\'\`]|
-                 || $rawmatch && $initial =~ m|^/|
-                 || $qmark && $initial =~ m|^\?|)
+    if ($initial && $maybe_quote{$initial}
+                 || $allow_slash_match && $initial eq '/'
+                 || $allow_qmark_match && $initial eq '?')
     {
-        unless ($$textref =~ m/ \Q$initial\E [^\\$initial]* (\\.[^\\$initial]*)* \Q$initial\E /gcsx)
+        unless ($$textref =~ m/\G \Q$initial\E [^\\$initial]* (\\.[^\\$initial]*)* \Q$initial\E /gcsx)
         {
             _failmsg qq{Did not find closing delimiter to match '$initial' at "} .
                          substr($$textref, $oppos, 20) .
@@ -712,6 +742,7 @@ sub _match_quotelike($$$$)      # ($textref, $prepat, $allow_raw_match)
         }
 
         my $endpos = pos($$textref);
+        $ref2qmarkvalid{$textref} = $ref2slashvalid{$textref} = 0;
         return (
             $startpos,  $oppos-$startpos,       # PREFIX
             $oppos,     0,                      # NO OPERATOR
@@ -726,7 +757,7 @@ sub _match_quotelike($$$$)      # ($textref, $prepat, $allow_raw_match)
         );
     }
 
-    unless ($$textref =~ m{\G(\b(?:m|s|qq|qx|qw|q|qr|tr|y)\b(?=\s*\S)|<<)}gc)
+    unless ($$textref =~ m{\G(\b(?:m|s|qq|qx|qw|q|qr|tr|y)\b(?=\s*\S)|<<(?=[a-zA-Z]|\s*['"`;,]))}gc)
     {
         _failmsg q{No quotelike operator found after prefix at "} .
                      substr($$textref, pos($$textref), 20) .
@@ -767,6 +798,7 @@ sub _match_quotelike($$$$)      # ($textref, $prepat, $allow_raw_match)
         $rd1pos = pos($$textref);
         $$textref =~ m{\Q$label\E\n}gc;
         $ld2pos = pos($$textref);
+        $ref2qmarkvalid{$textref} = $ref2slashvalid{$textref} = 0;
         return (
             $startpos,  $oppos-$startpos,       # PREFIX
             $oppos,     length($op),            # OPERATOR
@@ -786,19 +818,26 @@ sub _match_quotelike($$$$)      # ($textref, $prepat, $allow_raw_match)
     $ld1pos = pos($$textref);
     $str1pos = $ld1pos+1;
 
-    unless ($$textref =~ m/\G(\S)/gc)   # SHOULD USE LOOKAHEAD
+    if ($$textref !~ m/\G(\S)/gc)   # SHOULD USE LOOKAHEAD
     {
         _failmsg "No block delimiter found after quotelike $op",
                  pos $$textref;
         pos $$textref = $startpos;
         return;
     }
+    elsif (substr($$textref, $ld1pos, 2) eq '=>')
+    {
+        _failmsg "quotelike $op was actually quoted by '=>'",
+                 pos $$textref;
+        pos $$textref = $startpos;
+        return;
+    }
     pos($$textref) = $ld1pos;   # HAVE TO DO THIS BECAUSE LOOKAHEAD BROKEN
     my ($ldel1, $rdel1) = ("\Q$1","\Q$1");
     if ($ldel1 =~ /[[(<{]/)
     {
         $rdel1 =~ tr/[({</])}>/;
-        defined(_match_bracketed($textref,"",$ldel1,"","",$rdel1))
+        defined(_match_bracketed($textref,qr/\G/,qr/\G($ldel1)/,"","",qr/\G($rdel1)/))
             || do { pos $$textref = $startpos; return };
         $ld2pos = pos($$textref);
         $rd1pos = $ld2pos-1;
@@ -835,7 +874,7 @@ sub _match_quotelike($$$$)      # ($textref, $prepat, $allow_raw_match)
         if ($ldel2 =~ /[[(<{]/)
         {
             pos($$textref)--;   # OVERCOME BROKEN LOOKAHEAD
-            defined(_match_bracketed($textref,"",$ldel2,"","",$rdel2))
+            defined(_match_bracketed($textref,qr/\G/,qr/\G($ldel2)/,"","",qr/\G($rdel2)/))
                 || do { pos $$textref = $startpos; return };
         }
         else
@@ -854,6 +893,7 @@ sub _match_quotelike($$$$)      # ($textref, $prepat, $allow_raw_match)
 
     $$textref =~ m/\G($mods{$op})/gc;
     my $endpos = pos $$textref;
+    $ref2qmarkvalid{$textref} = $ref2slashvalid{$textref} = undef;
 
     return (
         $startpos,      $oppos-$startpos,       # PREFIX
@@ -874,10 +914,26 @@ my $def_func = [
     sub { extract_quotelike($_[0],'') },
     sub { extract_codeblock($_[0],'{}','') },
 ];
+my %ref_not_regex = map +($_=>1), qw(CODE Text::Balanced::Extractor);
 
+sub _update_patvalid {
+    my ($textref, $text) = @_;
+    if ($ref2slashvalid{$textref} && $text =~ m/(?:$RE_NUM|[\)\]])\s*$/)
+    {
+        $ref2slashvalid{$textref} = $ref2qmarkvalid{$textref} = 0;
+    } elsif (!$ref2slashvalid{$textref} && $text =~ m/$RE_PREREGEX_PAT\s*$/)
+    {
+        $ref2slashvalid{$textref} = $ref2qmarkvalid{$textref} = 1;
+    } elsif (!$ref2slashvalid{$textref} && $text =~ m/$RE_EXPR_PAT\s*$/)
+    {
+        $ref2slashvalid{$textref} = 1;
+        $ref2qmarkvalid{$textref} = 0;
+    }
+}
 sub extract_multiple (;$$$$)    # ($text, $functions_ref, $max_fields, $ignoreunknown)
 {
     my $textref = defined($_[0]) ? \$_[0] : \$_;
+    $ref2slashvalid{$textref} = 1, $ref2qmarkvalid{$textref} = 0 if !pos($$textref); # reset
     my $posbug = pos;
     my ($lastpos, $firstpos);
     my @fields = ();
@@ -898,39 +954,28 @@ sub extract_multiple (;$$$$)    # ($text, $functions_ref, $max_fields, $ignoreun
             $max = 1
         }
 
-        my $unkpos;
-        my $class;
-
         my @class;
         foreach my $func ( @func )
         {
-            if (ref($func) eq 'HASH')
-            {
-                push @class, (keys %$func)[0];
-                $func = (values %$func)[0];
-            }
-            else
-            {
-                push @class, undef;
-            }
+            push @class, undef;
+            ($class[-1], $func) = %$func if ref($func) eq 'HASH';
+            $func = qr/\G$func/ if !$ref_not_regex{ref $func};
         }
 
+        my $unkpos;
         FIELD: while (pos($$textref) < length($$textref))
         {
-            my ($field, $rem);
-            my @bits;
             foreach my $i ( 0..$#func )
             {
-                my $pref;
-                my $func = $func[$i];
-                $class = $class[$i];
+                my ($field, $pref);
+                my ($class, $func) = ($class[$i], $func[$i]);
                 $lastpos = pos $$textref;
                 if (ref($func) eq 'CODE')
-                    { ($field,$rem,$pref) = @bits = $func->($$textref) }
+                    { ($field,undef,$pref) = $func->($$textref) }
                 elsif (ref($func) eq 'Text::Balanced::Extractor')
-                    { @bits = $field = $func->extract($$textref) }
-                elsif( $$textref =~ m/\G$func/gc )
-                    { @bits = $field = defined($1)
+                    { $field = $func->extract($$textref) }
+                elsif( $$textref =~ m/$func[$i]/gc )
+                    { $field = defined($1)
                         ? $1
                         : substr($$textref, $-[0], $+[0] - $-[0])
                     }
@@ -948,9 +993,8 @@ sub extract_multiple (;$$$$)    # ($text, $functions_ref, $max_fields, $ignoreun
                             last FIELD if @fields == $max;
                         }
                     }
-                    push @fields, $class
-                            ? bless (\$field, $class)
-                            : $field;
+                    push @fields, $class ? bless(\$field, $class) : $field;
+                    _update_patvalid($textref, $fields[-1]);
                     $firstpos = $lastpos unless defined $firstpos;
                     $lastpos = pos $$textref;
                     last FIELD if @fields == $max;
@@ -961,6 +1005,7 @@ sub extract_multiple (;$$$$)    # ($text, $functions_ref, $max_fields, $ignoreun
             {
                 $unkpos = pos($$textref)-1
                     unless $igunk || defined $unkpos;
+                _update_patvalid($textref, substr $$textref, $unkpos, pos($$textref)-$unkpos);
             }
         }
 
@@ -986,7 +1031,7 @@ sub gen_extract_tagged # ($opentag, $closetag, $pre, \%options)
 {
     my $ldel    = $_[0];
     my $rdel    = $_[1];
-    my $pre     = defined $_[2] ? $_[2] : '\s*';
+    my $pre     = defined $_[2] ? qr/\G$_[2]/ : qr/\G\s*/;
     my %options = defined $_[3] ? %{$_[3]} : ();
     my $omode   = defined $options{fail} ? $options{fail} : '';
     my $bad     = ref($options{reject}) eq 'ARRAY' ? join('|', @{$options{reject}})
@@ -998,16 +1043,16 @@ sub gen_extract_tagged # ($opentag, $closetag, $pre, \%options)
                 :                                    ''
                 ;
 
-    if (!defined $ldel) { $ldel = '<\w+(?:' . gen_delimited_pat(q{'"}) . '|[^>])*>'; }
+    $ldel = $et_default_ldel if !defined $ldel;
 
     my $posbug = pos;
-    for ($ldel, $pre, $bad, $ignore) { $_ = qr/$_/ if $_ }
+    for ($ldel, $bad, $ignore) { $_ = qr/$_/ if $_ }
     pos = $posbug;
 
     my $closure = sub
     {
         my $textref = defined $_[0] ? \$_[0] : \$_;
-        my @match = Text::Balanced::_match_tagged($textref, $pre, $ldel, $rdel, $omode, $bad, $ignore);
+        my @match = _match_tagged($textref, $pre, $ldel, $rdel, $omode, $bad, $ignore);
 
         return _fail(wantarray, $textref) unless @match;
         return _succeed wantarray, $textref,
@@ -1027,7 +1072,9 @@ sub extract($$) # ($self, $text)
 
 package Text::Balanced::ErrorMsg;
 
-use overload '""' => sub { "$_[0]->{error}, detected at offset $_[0]->{pos}" };
+use overload
+    '""' => sub { "$_[0]->{error}, detected at offset $_[0]->{pos}" },
+    fallback => 1;
 
 1;
 
@@ -1450,7 +1497,7 @@ A string to be processed (C<$_> if the string is omitted or C<undef>)
 
 =item 2.
 
-A string specifying a pattern to be matched as the opening tag.
+A string specifying a pattern (i.e. regex) to be matched as the opening tag.
 If the pattern string is omitted (or C<undef>) then a pattern
 that matches any standard XML tag is used.
 
@@ -1854,7 +1901,8 @@ C<"extract_quotelike">.
 C<extract_codeblock> takes the same initial three parameters as C<extract_bracketed>:
 a text to process, a set of delimiter brackets to look for, and a prefix to
 match first. It also takes an optional fourth parameter, which allows the
-outermost delimiter brackets to be specified separately (see below).
+outermost delimiter brackets to be specified separately (see below),
+and a fifth parameter used only by L<Parse::RecDescent>.
 
 Omitting the first argument (input text) means process C<$_> instead.
 Omitting the second argument (delimiter brackets) indicates that only C<'{'> is to be used.
@@ -2063,12 +2111,14 @@ operator (and removes it from $text):
 
 Finally, here is yet another way to do comma-separated value parsing:
 
+        $csv_text = "a,'x b',c";
         @fields = extract_multiple($csv_text,
                                   [
                                         sub { extract_delimited($_[0],q{'"}) },
-                                        qr/([^,]+)(.*)/,
+                                        qr/([^,]+)/,
                                   ],
                                   undef,1);
+        # @fields is now ('a', "'x b'", 'c')
 
 The list in the second argument means:
 I<"Try and extract a ' or " delimited string, otherwise extract anything up to a comma...">.
@@ -2084,7 +2134,7 @@ just make the last parameter undefined (or remove it).
 =item C<gen_delimited_pat>
 
 The C<gen_delimited_pat> subroutine takes a single (string) argument and
-   > builds a Friedl-style optimized regex that matches a string delimited
+builds a Friedl-style optimized regex that matches a string delimited
 by any one of the characters in the single argument. For example:
 
         gen_delimited_pat(q{'"})
@@ -2360,7 +2410,8 @@ Copyright (C) 1997-2001 Damian Conway.  All rights reserved.
 
 Copyright (C) 2009 Adam Kennedy.
 
-Copyright (C) 2015, 2020 Steve Hay.  All rights reserved.
+Copyright (C) 2015, 2020, 2022 Steve Hay and other contributors.  All rights
+reserved.
 
 =head1 LICENCE
 
@@ -2370,11 +2421,11 @@ License or the Artistic License, as specified in the F<LICENCE> file.
 
 =head1 VERSION
 
-Version 2.04
+Version 2.06
 
 =head1 DATE
 
-11 Dec 2020
+05 Jun 2022
 
 =head1 HISTORY
 
index f5d87cd..58dc5af 100644 (file)
@@ -19,7 +19,7 @@ our %EXPORT_TAGS = (
     ':override' => 'internal',
     );
 
-our $VERSION = '1.3401';
+our $VERSION = '1.3401_01';
 
 XSLoader::load( 'Time::Piece', $VERSION );
 
index 8164cdd..757c1af 100644 (file)
@@ -1,15 +1,8 @@
-#ifdef __cplusplus
-extern "C" {
-#endif
 #define PERL_NO_GET_CONTEXT
 #include "EXTERN.h"
 #include "perl.h"
 #include "XSUB.h"
 #include <time.h>
-#ifdef __cplusplus
-}
-#endif
-
 
 #define    DAYS_PER_YEAR    365
 #define    DAYS_PER_QYEAR    (4*DAYS_PER_YEAR+1)
index 744ca72..debfc2d 100644 (file)
@@ -55,7 +55,7 @@ use constant ERROR_58_HINTS => q{Non-subroutine %s hints for %s are not supporte
 
 use constant MIN_IPC_SYS_SIMPLE_VER => 0.12;
 
-our $VERSION = '2.34'; # VERSION: Generated by DZP::OurPkg::Version
+our $VERSION = '2.36'; # VERSION: Generated by DZP::OurPkg::Version
 
 our $Debug ||= 0;
 
@@ -170,6 +170,8 @@ my %TAGS = (
     ':2.32'  => [qw(:default)],
     ':2.33'  => [qw(:default)],
     ':2.34'  => [qw(:default)],
+    ':2.35'  => [qw(:default)],
+    ':2.36'  => [qw(:default)],
 );
 
 
@@ -1088,6 +1090,7 @@ sub _one_invocation {
     my $code = qq[
         no warnings qw(unopened uninitialized numeric);
         no if \$\] >= 5.017011, warnings => "experimental::smartmatch";
+        no if \$warnings::Offsets{"deprecated::smartmatch"}, warnings => "deprecated";
 
         if (wantarray) {
             my \@results = $call(@argv);
index 0c1b9ac..61e8940 100644 (file)
@@ -9,7 +9,7 @@ our $VERSION;
 # ABSTRACT: Replace functions with ones that succeed or die with lexical scope
 
 BEGIN {
-    our $VERSION = '2.34'; # VERSION: Generated by DZP::OurPkg::Version
+    our $VERSION = '2.36'; # VERSION: Generated by DZP::OurPkg::Version
 }
 
 use constant ERROR_WRONG_FATAL => q{
index 2be221d..1ee8a46 100644 (file)
@@ -4,7 +4,7 @@ use strict;
 use warnings;
 
 # ABSTRACT: Wrapper class for calling subs at end of scope
-our $VERSION = '2.34'; # VERSION
+our $VERSION = '2.36'; # VERSION
 
 # This code schedules the cleanup of subroutines at the end of
 # scope.  It's directly inspired by chocolateboy's excellent
index 8cb1be1..8365b16 100644 (file)
@@ -6,7 +6,7 @@ use warnings;
 use autodie::Scope::Guard;
 
 # ABSTRACT: Hook stack for managing scopes via %^H
-our $VERSION = '2.34'; # VERSION
+our $VERSION = '2.36'; # VERSION
 
 my $H_KEY_STEM = __PACKAGE__ . '/guard';
 my $COUNTER = 0;
index 95de13e..9988b59 100644 (file)
@@ -14,7 +14,7 @@ our @EXPORT_OK = qw(
   on_end_of_compile_scope
 );
 
-our $VERSION = '2.34'; # VERSION: Generated by DZP::OurPkg:Version
+our $VERSION = '2.36'; # VERSION: Generated by DZP::OurPkg:Version
 
 # ABSTRACT: Internal Utility subroutines for autodie and Fatal
 
@@ -179,7 +179,7 @@ autodie::Util - Internal Utility subroutines for autodie and Fatal
 
 =head1 DESCRIPTION
 
-Interal Utilities for autodie and Fatal!  This module is not a part of
+Internal Utilities for autodie and Fatal!  This module is not a part of
 autodie's public API.
 
 This module contains utility subroutines for abstracting away the
@@ -237,7 +237,7 @@ this subroutine.
 Given a package name and a hashref mapping names to a subroutine
 reference (or C<undef>), this subroutine will install said subroutines
 on their given name in that module.  If a name mapes to C<undef>, any
-subroutine with that name in the target module will be remove
+subroutine with that name in the target module will be removed
 (possibly "unshadowing" a CORE sub of same name).
 
 =head1 AUTHOR
index f4035d2..36439d2 100644 (file)
@@ -6,7 +6,7 @@ use Carp qw(croak);
 
 use Scalar::Util qw(blessed);
 
-our $VERSION = '2.34'; # VERSION: Generated by DZP::OurPkg:Version
+our $VERSION = '2.36'; # VERSION: Generated by DZP::OurPkg:Version
 # ABSTRACT: Exceptions from autodying functions.
 
 our $DEBUG = 0;
index afe1617..0a1ada6 100644 (file)
@@ -5,7 +5,7 @@ use warnings;
 use parent 'autodie::exception';
 use Carp qw(croak);
 
-our $VERSION = '2.34'; # VERSION: Generated by DZP::OurPkg:Version
+our $VERSION = '2.36'; # VERSION: Generated by DZP::OurPkg:Version
 
 # ABSTRACT: Exceptions from autodying system().
 
index 3778cc7..42e6e9b 100644 (file)
@@ -5,7 +5,7 @@ use warnings;
 
 use constant PERL58 => ( $] < 5.009 );
 
-our $VERSION = '2.34'; # VERSION: Generated by DZP::OurPkg:Version
+our $VERSION = '2.36'; # VERSION: Generated by DZP::OurPkg:Version
 
 # ABSTRACT: Provide hints about user subroutines to autodie
 
index 32aba04..4df6891 100644 (file)
@@ -2,7 +2,7 @@ package autodie::skip;
 use strict;
 use warnings;
 
-our $VERSION = '2.34'; # VERSION
+our $VERSION = '2.36'; # VERSION
 
 # This package exists purely so people can inherit from it,
 # which isn't at all how roles are supposed to work, but it's
index ab6f07d..54d3b16 100755 (executable)
@@ -8,8 +8,11 @@ BEGIN { plan skip_all => "Perl 5.10 only tests" if $] < 5.010; }
 # Basic tests should go in basic_exceptions.t
 
 use 5.010;
+use warnings ();
 use constant NO_SUCH_FILE => 'this_file_had_better_not_exist_xyzzy';
 no if $] >= 5.017011, warnings => "experimental::smartmatch";
+no if exists $warnings::Offsets{"deprecated::smartmatch"},
+  warnings => "deprecated";
 
 plan 'no_plan';
 
index 530c781..82bc732 100644 (file)
@@ -1,4 +1,4 @@
-package pujHa'ghach;
+package pujHa::ghach;
 
 # Translator notes: reH Hegh is Kligon for "always dying".
 # It was the original name for this testing pragma, but
@@ -20,7 +20,7 @@ use warnings;
 use parent qw(autodie);
 
 sub exception_class {
-    return "pujHa'ghach::Dotlh";      # Dotlh - status
+    return "pujHa::ghach::Dotlh";      # Dotlh - status
 }
 
 1;
index 2fbf3db..b55bee5 100644 (file)
@@ -1,4 +1,4 @@
-package pujHa'ghach::Dotlh;
+package pujHa::ghach::Dotlh;
 
 # Translator notes: Dotlh = status
 
index 8fc67e9..14baa9f 100644 (file)
@@ -10,7 +10,7 @@ use Math::BigFloat;
 
 our @ISA = qw(Exporter Math::BigFloat);
 
-our $VERSION = '0.65';
+our $VERSION = '0.66';
 
 use overload;                   # inherit overload from Math::BigFloat
 
index 8808ee6..16ac187 100644 (file)
@@ -10,7 +10,7 @@ use Math::BigInt;
 
 our @ISA = qw(Exporter Math::BigInt);
 
-our $VERSION = '0.65';
+our $VERSION = '0.66';
 
 use overload;                   # inherit overload from Math::BigInt
 
index bb68d51..d5038f4 100644 (file)
@@ -5,7 +5,7 @@ use warnings;
 
 use Carp qw< carp croak >;
 
-our $VERSION = '0.65';
+our $VERSION = '0.66';
 
 use Exporter;
 our @ISA            = qw( Exporter );
@@ -553,8 +553,8 @@ Load a different math lib, see L<Math Library>.
 
 Override the built-in hex() method with a version that can handle big numbers.
 This overrides it by exporting it to the current package. Under Perl v5.10.0 and
-higher, this is not so necessary, as hex() is lexically overridden in the
-current scope whenever the C<bigint> pragma is active.
+higher, this is not necessary, as hex() is lexically overridden in the current
+scope whenever the C<bigint> pragma is active.
 
 =item oct
 
@@ -800,8 +800,8 @@ Some cool command line examples to impress the Python crowd ;) You might want
 to compare them to the results under -Mbigfloat or -Mbigrat:
 
     perl -Mbigint -le 'print sqrt(33)'
-    perl -Mbigint -le 'print 2*255'
-    perl -Mbigint -le 'print 4.5+2*255'
+    perl -Mbigint -le 'print 2**255'
+    perl -Mbigint -le 'print 4.5+2**255'
     perl -Mbigint -le 'print 123->is_odd()'
     perl -Mbigint=l,GMP -le 'print 7 ** 7777'
 
index a0ef30b..d738d6d 100644 (file)
@@ -5,7 +5,7 @@ use warnings;
 
 use Carp qw< carp croak >;
 
-our $VERSION = '0.65';
+our $VERSION = '0.66';
 
 use Exporter;
 our @ISA            = qw( Exporter );
index 371138d..8dabb93 100644 (file)
@@ -5,7 +5,7 @@ use warnings;
 
 use Carp qw< carp croak >;
 
-our $VERSION = '0.65';
+our $VERSION = '0.66';
 
 use Exporter;
 our @ISA            = qw( Exporter );
diff --git a/gnu/usr.bin/perl/cpan/bignum/t/infnan-bignum.t b/gnu/usr.bin/perl/cpan/bignum/t/infnan-bignum.t
deleted file mode 100644 (file)
index 9224b82..0000000
+++ /dev/null
@@ -1,100 +0,0 @@
-# -*- mode: perl; -*-
-
-use strict;
-use warnings;
-
-use Test::More tests => 66;
-
-use bignum downgrade => undef;
-
-my $class = "Math::BigInt";
-my $x;
-
-###############################################################################
-
-note("inf tests");
-
-$x = 1 + inf;
-note("\n\n" . $x . "\n\n");
-
-$x = 1 + inf;
-is(ref($x), $class, "\$x = 1 + inf makes a $class");
-is($x->bstr(), "inf", '$x = 1 + inf; $x->bstr() = "inf"');
-
-$x = 1 * inf;
-is(ref($x), $class, "\$x = 1 * inf makes a $class");
-is($x->bstr(), "inf", '$x = 1 * inf; $x->bstr() = "inf"');
-
-# these don't work without exporting inf()
-$x = inf;
-is(ref($x), $class, "\$x = inf makes a $class");
-is($x->bstr(), "inf", '$x = inf; $x->bstr() = "inf"');
-
-$x = inf + inf;
-is(ref($x), $class, "\$x = inf + inf makes a $class");
-is($x->bstr(), "inf", '$x = inf + inf; $x->bstr() = "inf"');
-
-$x = inf * inf;
-is(ref($x), $class, "\$x = inf * inf makes a $class");
-is($x->bstr(), "inf", '$x = inf * inf; $x->bstr() = "inf"');
-
-###############################################################################
-
-note("NaN tests");
-
-$x = 1 + NaN;
-is(ref($x), $class, "\$x = 1 + NaN makes a $class");
-is($x->bstr(), "NaN", '$x = 1 + NaN; $x->bstr() = "NaN"');
-
-$x = 1 * NaN;
-is(ref($x), $class, "\$x = 1 * NaN makes a $class");
-is($x->bstr(), "NaN", '$x = 1 * NaN; $x->bstr() = "NaN"');
-
-# these don't work without exporting NaN()
-$x = NaN;
-is(ref($x), $class, "\$x = NaN makes a $class");
-is($x->bstr(), "NaN", '$x = NaN; $x->bstr() = "NaN"');
-
-$x = NaN + NaN;
-is(ref($x), $class, "\$x = NaN + NaN makes a $class");
-is($x->bstr(), "NaN", '$x = NaN + NaN; $x->bstr() = "NaN"');
-
-$x = NaN * NaN;
-is(ref($x), $class, "\$x = NaN * NaN makes a $class");
-is($x->bstr(), "NaN", '$x = NaN * NaN; $x->bstr() = "NaN"');
-
-###############################################################################
-
-note("mixed tests");
-
-# these don't work without exporting NaN() or inf()
-
-$x = NaN + inf;
-is(ref($x), $class, "\$x = NaN + inf makes a $class");
-is($x->bstr(), "NaN", '$x = NaN + inf; $x->bstr() = "NaN"');
-
-$x = NaN * inf;
-is(ref($x), $class, "\$x = NaN * inf makes a $class");
-is($x->bstr(), "NaN", '$x = NaN * inf; $x->bstr() = "NaN"');
-
-$x = inf * NaN;
-is(ref($x), $class, "\$x = inf * NaN makes a $class");
-is($x->bstr(), "NaN", '$x = inf * NaN; $x->bstr() = "NaN"');
-
-###############################################################################
-# inf and NaN as strings.
-
-for my $nan (qw/ nan naN nAn nAN Nan NaN NAn NAN /) {
-    my $x = 1 + $nan;
-    is($x->bstr(), "NaN", qq|\$x = 1 + "$nan"|);
-    is(ref($x), $class, "\$x is a $class");
-}
-
-for my $inf (qw/ inf inF iNf iNF Inf InF INf INF
-                 infinity Infinity InFiNiTy iNfInItY
-               /)
-{
-    my $x = 1 + $inf;
-    is($x->bstr(), "inf", qq|\$x = 1 + "$inf"|);
-    is(ref($x), $class, "\$x is a $class");
-}
index ab8a2f0..3d89cbd 100644 (file)
@@ -1,5 +1,5 @@
 package experimental;
-$experimental::VERSION = '0.028';
+$experimental::VERSION = '0.031';
 use strict;
 use warnings;
 use version ();
@@ -8,6 +8,7 @@ BEGIN { eval { require feature } };
 use Carp qw/croak carp/;
 
 my %warnings = map { $_ => 1 } grep { /^experimental::/ } keys %warnings::Offsets;
+my %removed_warnings = map { $_ => 1 } grep { /^experimental::/ } keys %warnings::NoOp;
 my %features = map { $_ => 1 } $] > 5.015006 ? keys %feature::feature : do {
        my @features;
        if ($] >= 5.010) {
@@ -28,7 +29,7 @@ my %min_version = (
        declared_refs   => '5.26.0',
        defer           => '5.35.4',
        evalbytes       => '5.16.0',
-        extra_paired_delims => '5.35.9',
+       extra_paired_delimiters => '5.35.9',
        fc              => '5.16.0',
        for_list        => '5.35.5',
        isa             => '5.31.7',
@@ -73,6 +74,9 @@ sub _enable {
                feature->import($pragma);
                _enable(@{ $additional{$pragma} }) if $additional{$pragma};
        }
+       elsif ($removed_warnings{"experimental::$pragma"}) {
+               _enable(@{ $additional{$pragma} }) if $additional{$pragma};
+       }
        elsif (not exists $min_version{$pragma}) {
                croak "Can't enable unknown feature $pragma";
        }
@@ -136,7 +140,7 @@ experimental - Experimental features made easy
 
 =head1 VERSION
 
-version 0.027
+version 0.031
 
 =head1 SYNOPSIS
 
@@ -201,6 +205,11 @@ This was added in perl 5.26.0.
 
 This was added in perl 5.36.0
 
+=item * C<extra_paired_delimiters> - enables the use of more paired string delimiters than the
+traditional four, S<C<< <  > >>>, S<C<( )>>, S<C<{ }>>, and S<C<[ ]>>.
+
+This was added in perl 5.36.
+
 =item * C<for_list> - allows iterating over multiple values at a time with C<for>
 
 This was added in perl 5.36.0
@@ -215,7 +224,7 @@ This was added in perl 5.10.0 and removed in perl 5.24.0.
 
 =item * C<lexical_subs> - allow the use of lexical subroutines.
 
-This was added in 5.18.0.
+This was added in 5.18.0, and became non-experimental (and always enabled) in 5.26.0.
 
 =item * C<postderef> - allow the use of postfix dereferencing expressions
 
@@ -246,10 +255,14 @@ This was added in perl 5.20.0.
 This was added in perl 5.10.0, but it should be noted there are significant
 incompatibilities between 5.10.0 and 5.10.1.
 
+The feature is going to be deprecated in perl 5.38.0, and removed in 5.42.0.
+
 =item * C<switch> - allow the use of C<~~>, given, and when
 
 This was added in perl 5.10.0.
 
+The feature is going to be deprecated in perl 5.38.0, and removed in 5.42.0.
+
 =item * C<try> - allow the use of C<try> and C<catch>
 
 This was added in perl 5.34.0
index 248b56c..50a2c3d 100644 (file)
@@ -18,7 +18,9 @@ if ($] >= 5.010000) {
 END
 }
 
-if ($] >= 5.010001) {
+use warnings ();
+if ( $] >= 5.010001
+    && ( $] < 5.017011 || exists $warnings::Offsets{"experimental::smartmatch"} ) ) {
        is (eval <<'END', 1, 'switch compiles') or diag $@;
        use experimental 'switch';
        sub bar { 1 };
@@ -34,7 +36,8 @@ if ($] >= 5.010001) {
 END
 }
 
-if ($] >= 5.010001) {
+if ( $] >= 5.010001
+    && ( $] < 5.017011 || exists $warnings::Offsets{"experimental::smartmatch"} ) ) {
        is (eval <<'END', 1, 'smartmatch compiles') or diag $@;
        use experimental 'smartmatch';
        sub baz { 1 };
index df52526..141b276 100644 (file)
@@ -66,7 +66,7 @@ MAIN: {
         ABSTRACT => 'Collection of network protocol modules',
         AUTHOR   => 'Graham Barr <gbarr@pobox.com>, Steve Hay <shay@cpan.org>',
         LICENSE  => 'perl_5',
-        VERSION  => '3.13',
+        VERSION  => '3.15',
 
         META_MERGE => {
             'meta-spec' => {
index b8dc728..f10df74 100644 (file)
@@ -1,7 +1,7 @@
 # Net::Cmd.pm
 #
 # Copyright (C) 1995-2006 Graham Barr.  All rights reserved.
-# Copyright (C) 2013-2016, 2020 Steve Hay.  All rights reserved.
+# Copyright (C) 2013-2016, 2020, 2022 Steve Hay.  All rights reserved.
 # This module is free software; you can redistribute it and/or modify it under
 # the same terms as Perl itself, i.e. under the terms of either the GNU General
 # Public License or the Artistic License, as specified in the F<LICENCE> file.
@@ -26,7 +26,7 @@ BEGIN {
   }
 }
 
-our $VERSION = "3.14";
+our $VERSION = "3.15";
 our @ISA     = qw(Exporter);
 our @EXPORT  = qw(CMD_INFO CMD_OK CMD_MORE CMD_REJECT CMD_ERROR CMD_PENDING);
 
@@ -887,7 +887,7 @@ libnet as of version 1.22_02.
 
 Copyright (C) 1995-2006 Graham Barr.  All rights reserved.
 
-Copyright (C) 2013-2016, 2020 Steve Hay.  All rights reserved.
+Copyright (C) 2013-2016, 2020, 2022 Steve Hay.  All rights reserved.
 
 =head1 LICENCE
 
@@ -897,11 +897,11 @@ License or the Artistic License, as specified in the F<LICENCE> file.
 
 =head1 VERSION
 
-Version 3.14
+Version 3.15
 
 =head1 DATE
 
-23 Dec 2020
+20 March 2023
 
 =head1 HISTORY
 
index b9eb827..bdbd003 100644 (file)
@@ -18,7 +18,7 @@ use Socket qw(inet_aton inet_ntoa);
 
 our @EXPORT  = qw(%NetConfig);
 our @ISA     = qw(Net::LocalCfg Exporter);
-our $VERSION = "3.14";
+our $VERSION = "3.15";
 
 our($CONFIGURE, $LIBNET_CFG);
 
@@ -368,11 +368,11 @@ License or the Artistic License, as specified in the F<LICENCE> file.
 
 =head1 VERSION
 
-Version 3.14
+Version 3.15
 
 =head1 DATE
 
-23 Dec 2020
+20 March 2023
 
 =head1 HISTORY
 
index 7c017f2..bf1ad25 100644 (file)
@@ -19,7 +19,7 @@ use Net::Config;
 
 our @ISA       = qw(Exporter);
 our @EXPORT_OK = qw(hostname hostdomain hostfqdn domainname);
-our $VERSION = "3.14";
+our $VERSION = "3.15";
 
 my ($host, $domain, $fqdn) = (undef, undef, undef);
 
@@ -395,11 +395,11 @@ License or the Artistic License, as specified in the F<LICENCE> file.
 
 =head1 VERSION
 
-Version 3.14
+Version 3.15
 
 =head1 DATE
 
-23 Dec 2020
+20 March 2023
 
 =head1 HISTORY
 
index b6b220d..cee0b28 100644 (file)
@@ -1,7 +1,7 @@
 # Net::FTP.pm
 #
 # Copyright (C) 1995-2004 Graham Barr.  All rights reserved.
-# Copyright (C) 2013-2017, 2020 Steve Hay.  All rights reserved.
+# Copyright (C) 2013-2017, 2020, 2022 Steve Hay.  All rights reserved.
 # This module is free software; you can redistribute it and/or modify it under
 # the same terms as Perl itself, i.e. under the terms of either the GNU General
 # Public License or the Artistic License, as specified in the F<LICENCE> file.
@@ -23,7 +23,7 @@ use Net::Config;
 use Socket;
 use Time::Local;
 
-our $VERSION = '3.14';
+our $VERSION = '3.15';
 
 our $IOCLASS;
 my $family_key;
@@ -1052,14 +1052,7 @@ sub _dataconn {
       Timeout   => $ftp->timeout,
       can_ssl() ? (
         SSL_startHandshake => 0,
-        $ftp->is_SSL ? (
-          SSL_reuse_ctx => $ftp,
-          SSL_verifycn_name => ${*$ftp}{net_ftp_tlsargs}{SSL_verifycn_name},
-          # This will cause the use of SNI if supported by IO::Socket::SSL.
-          $ftp->can_client_sni ? (
-            SSL_hostname  => ${*$ftp}{net_ftp_tlsargs}{SSL_hostname}
-          ):(),
-        ) :( %{${*$ftp}{net_ftp_tlsargs}} ),
+        %{${*$ftp}{net_ftp_tlsargs}},
       ):(),
     ) or return;
   } elsif (my $listen =  delete ${*$ftp}{net_ftp_listen}) {
@@ -1966,19 +1959,6 @@ Reinitialize the connection, flushing all I/O and account information.
 
 =back
 
-=head1 EXAMPLES
-
-For an example of the use of Net::FTP see
-
-=over 4
-
-=item L<https://www.csh.rit.edu/~adam/Progs/>
-
-C<autoftp> is a program that can retrieve, send, or list files via
-the FTP protocol in a non-interactive manner.
-
-=back
-
 =head1 EXPORTS
 
 I<None>.
@@ -2034,7 +2014,7 @@ libnet as of version 1.22_02.
 
 Copyright (C) 1995-2004 Graham Barr.  All rights reserved.
 
-Copyright (C) 2013-2017, 2020 Steve Hay.  All rights reserved.
+Copyright (C) 2013-2017, 2020, 2022 Steve Hay.  All rights reserved.
 
 =head1 LICENCE
 
@@ -2044,11 +2024,11 @@ License or the Artistic License, as specified in the F<LICENCE> file.
 
 =head1 VERSION
 
-Version 3.14
+Version 3.15
 
 =head1 DATE
 
-23 Dec 2020
+20 March 2023
 
 =head1 HISTORY
 
index 1ea4831..9b93e16 100644 (file)
@@ -13,7 +13,7 @@ use Carp;
 use Net::FTP::dataconn;
 
 our @ISA     = qw(Net::FTP::dataconn);
-our $VERSION = "3.14";
+our $VERSION = "3.15";
 
 our $buf;
 
index 7b8c2ea..a10b972 100644 (file)
@@ -8,6 +8,6 @@ use warnings;
 use Net::FTP::I;
 
 our @ISA = qw(Net::FTP::I);
-our $VERSION = "3.14";
+our $VERSION = "3.15";
 
 1;
index afcc51f..1c2b8a6 100644 (file)
@@ -13,7 +13,7 @@ use Carp;
 use Net::FTP::dataconn;
 
 our @ISA     = qw(Net::FTP::dataconn);
-our $VERSION = "3.14";
+our $VERSION = "3.15";
 
 our $buf;
 
index 9dfe491..d04fd92 100644 (file)
@@ -8,6 +8,6 @@ use warnings;
 use Net::FTP::I;
 
 our @ISA = qw(Net::FTP::I);
-our $VERSION = "3.14";
+our $VERSION = "3.15";
 
 1;
index 979be7c..3db008d 100644 (file)
@@ -13,7 +13,7 @@ use Carp;
 use Errno;
 use Net::Cmd;
 
-our $VERSION = '3.14';
+our $VERSION = '3.15';
 
 $Net::FTP::IOCLASS or die "please load Net::FTP before Net::FTP::dataconn";
 our @ISA = $Net::FTP::IOCLASS;
@@ -224,11 +224,11 @@ License or the Artistic License, as specified in the F<LICENCE> file.
 
 =head1 VERSION
 
-Version 3.14
+Version 3.15
 
 =head1 DATE
 
-23 Dec 2020
+20 March 2023
 
 =head1 HISTORY
 
index bbdc884..59ed0ef 100644 (file)
@@ -19,7 +19,7 @@ use Net::Cmd;
 use Net::Config;
 use Time::Local;
 
-our $VERSION = "3.14";
+our $VERSION = "3.15";
 
 # Code for detecting if we can use SSL
 my $ssl_class = eval {
@@ -1308,11 +1308,11 @@ License or the Artistic License, as specified in the F<LICENCE> file.
 
 =head1 VERSION
 
-Version 3.14
+Version 3.15
 
 =head1 DATE
 
-23 Dec 2020
+20 March 2023
 
 =head1 HISTORY
 
index 3dec11e..fe9abb9 100644 (file)
@@ -16,7 +16,7 @@ use warnings;
 use Carp;
 use FileHandle;
 
-our $VERSION = "3.14";
+our $VERSION = "3.15";
 
 our $TESTING;
 
@@ -353,11 +353,11 @@ License or the Artistic License, as specified in the F<LICENCE> file.
 
 =head1 VERSION
 
-Version 3.14
+Version 3.15
 
 =head1 DATE
 
-23 Dec 2020
+20 March 2023
 
 =head1 HISTORY
 
index a4ed8eb..e6239c7 100644 (file)
@@ -18,7 +18,7 @@ use IO::Socket;
 use Net::Cmd;
 use Net::Config;
 
-our $VERSION = "3.14";
+our $VERSION = "3.15";
 
 # Code for detecting if we can use SSL
 my $ssl_class = eval {
@@ -869,11 +869,11 @@ License or the Artistic License, as specified in the F<LICENCE> file.
 
 =head1 VERSION
 
-Version 3.14
+Version 3.15
 
 =head1 DATE
 
-23 Dec 2020
+20 March 2023
 
 =head1 HISTORY
 
index c04a362..e592bb5 100644 (file)
@@ -19,7 +19,7 @@ use Net::Cmd;
 use Net::Config;
 use Socket;
 
-our $VERSION = "3.14";
+our $VERSION = "3.15";
 
 # Code for detecting if we can use SSL
 my $ssl_class = eval {
@@ -1052,11 +1052,11 @@ License or the Artistic License, as specified in the F<LICENCE> file.
 
 =head1 VERSION
 
-Version 3.14
+Version 3.15
 
 =head1 DATE
 
-23 Dec 2020
+20 March 2023
 
 =head1 HISTORY
 
index 7906c1a..237c174 100644 (file)
@@ -22,7 +22,7 @@ use Net::Config;
 our @ISA       = qw(Exporter);
 our @EXPORT_OK = qw(inet_time inet_daytime);
 
-our $VERSION = "3.14";
+our $VERSION = "3.15";
 
 our $TIMEOUT = 120;
 
@@ -190,11 +190,11 @@ License or the Artistic License, as specified in the F<LICENCE> file.
 
 =head1 VERSION
 
-Version 3.14
+Version 3.15
 
 =head1 DATE
 
-23 Dec 2020
+20 March 2023
 
 =head1 HISTORY
 
index f2405ef..483aa3e 100644 (file)
@@ -1,7 +1,7 @@
 package parent;
 use strict;
 
-our $VERSION = '0.238';
+our $VERSION = '0.241';
 
 sub import {
     my $class = shift;
index a29a3f3..51fee12 100755 (executable)
@@ -56,8 +56,8 @@ is( $Eval1::VERSION, '1.01' );
 
 is( $Eval2::VERSION, '1.02' );
 
-my $expected= q{/^Can't locate reallyReAlLyNotexists.pm in \@INC \(\@INC contains:/};
-$expected= q{/^Can't locate reallyReAlLyNotexists.pm in \@INC \(you may need to install the reallyReAlLyNotexists module\) \(\@INC contains:/}
+my $expected= q{/^Can't locate reallyReAlLyNotexists.pm in \@INC \(\@INC[\w ]+:/};
+$expected= q{/^Can't locate reallyReAlLyNotexists.pm in \@INC \(you may need to install the reallyReAlLyNotexists module\) \(\@INC[\w ]+:/}
     if 5.017005 <= $];
 
 eval q{use parent 'reallyReAlLyNotexists'};
@@ -74,4 +74,3 @@ like( $@, $expected, '  still failing on 2nd load');
     use parent -norequire, 'Has::Version_0';
     ::is( $Has::Version_0::VERSION, 0, '$VERSION==0 preserved' );
 }
-
index ff76df5..36e47ab 100644 (file)
@@ -4,7 +4,7 @@
 # which only supports that build method, and because it is a dependency of
 # other build systems like Module::Build.
 #
-# Copyright 1999-2001, 2008, 2010, 2012, 2014-2016, 2018-2019
+# Copyright 1999-2001, 2008, 2010, 2012, 2014-2016, 2018-2019, 2022
 #     Russ Allbery <rra@cpan.org>
 #
 # This program is free software; you may redistribute it and/or modify it
@@ -30,7 +30,7 @@ sub dist_version {
     open(my $fh, '<', File::Spec->catfile('lib', 'Pod', 'Man.pm'))
       or die "$0: cannot open lib/Pod/Man.pm: $!\n";
     while (defined(my $line = <$fh>)) {
-        if ($line =~ m{ \A \$VERSION \s+ = \s+ '([^\']+)' }xms) {
+        if ($line =~ m{ \A (?:our \s+)? \$VERSION \s+ = \s+ '([^\']+)' }xms) {
             close($fh) or die "$0: cannot close lib/Pod/Man.pm\n";
             return $1;
         }
@@ -81,7 +81,8 @@ sub man1pod {
 # The hash of all the metadata.  This will be modified before WriteMakefile to
 # remove keys not supported by the local version of ExtUtils::MakeMaker.
 my $dist_version = dist_version();
-my %metadata     = (
+my %metadata = (
+    #<<<
     NAME             => 'Pod',
     DISTNAME         => 'podlators',
     ABSTRACT         => 'Convert POD data to various other formats',
@@ -89,7 +90,8 @@ my %metadata     = (
     LICENSE          => 'perl_5',
     EXE_FILES        => [scripts('pod2text', 'pod2man')],
     VERSION_FROM     => 'lib/Pod/Man.pm',
-    MIN_PERL_VERSION => '5.008',
+    MIN_PERL_VERSION => '5.010',
+    #>>>
 
     # Use *.PL files to generate the driver scripts so that we get the correct
     # invocation of Perl on non-UNIX platforms.
@@ -107,11 +109,11 @@ my %metadata     = (
     },
 
     # Clean some additional files.
-    clean     => { FILES => File::Spec->catdir('t',    'tmp') },
+    clean => { FILES => File::Spec->catdir('t', 'tmp') },
     realclean => { FILES => scalar(scripts('pod2text', 'pod2man')) },
 
     # Dependencies on other modules.
-    PREREQ_PM => { 'Pod::Simple' => 3.06 },
+    PREREQ_PM => { 'Pod::Simple' => 3.26 },
 
     # Older versions of ExtUtils::MakeMaker don't pick up nested test
     # directories by default.
@@ -125,41 +127,40 @@ my %metadata     = (
     # Additional metadata.
     META_ADD => {
         'meta-spec' => { version => 2 },
-        provides    => {
+        provides => {
             'Pod::Man' => {
-                file    => 'lib/Pod/Man.pm',
+                file => 'lib/Pod/Man.pm',
                 version => $dist_version,
             },
             'Pod::ParseLink' => {
-                file    => 'lib/Pod/ParseLink.pm',
+                file => 'lib/Pod/ParseLink.pm',
                 version => $dist_version,
             },
             'Pod::Text' => {
-                file    => 'lib/Pod/Text.pm',
+                file => 'lib/Pod/Text.pm',
                 version => $dist_version,
             },
             'Pod::Text::Color' => {
-                file    => 'lib/Pod/Text/Color.pm',
+                file => 'lib/Pod/Text/Color.pm',
                 version => $dist_version,
             },
             'Pod::Text::Overstrike' => {
-                file    => 'lib/Pod/Text/Overstrike.pm',
+                file => 'lib/Pod/Text/Overstrike.pm',
                 version => $dist_version,
             },
             'Pod::Text::Termcap' => {
-                file    => 'lib/Pod/Text/Termcap.pm',
+                file => 'lib/Pod/Text/Termcap.pm',
                 version => $dist_version,
             },
         },
         resources => {
             bugtracker => {
-                mailto => 'bug-podlators@rt.cpan.org',
-                web => 'https://rt.cpan.org/Dist/Display.html?Name=podlators',
+                web => 'https://github.com/rra/podlators/issues',
             },
-            homepage   => 'https://www.eyrie.org/~eagle/software/podlators/',
+            homepage => 'https://www.eyrie.org/~eagle/software/podlators/',
             repository => {
-                url  => 'https://github.com/rra/podlators.git',
-                web  => 'https://github.com/rra/podlators',
+                url => 'https://github.com/rra/podlators.git',
+                web => 'https://github.com/rra/podlators',
                 type => 'git',
             },
         },
@@ -169,8 +170,8 @@ my %metadata     = (
 # Remove keys that aren't supported by this version of ExtUtils::MakeMaker.
 # This hash maps keys to the minimum supported version.
 my %supported = (
-    LICENSE          => 6.31,
-    META_ADD         => 6.46,
+    LICENSE => 6.31,
+    META_ADD => 6.46,
     MIN_PERL_VERSION => 6.48,
 );
 for my $key (keys(%supported)) {
index 45fd9bc..5ed95bb 100644 (file)
 
 package Pod::Man;
 
-use 5.008;
+use 5.010;
 use strict;
 use warnings;
 
-use subs qw(makespace);
-use vars qw(@ISA %ESCAPES $PREAMBLE $VERSION);
-
 use Carp qw(carp croak);
 use Pod::Simple ();
 
 # Conditionally import Encode and set $HAS_ENCODE if it is available.  This is
 # required to support building as part of Perl core, since podlators is built
 # before Encode is.
-our $HAS_ENCODE;
+my $HAS_ENCODE;
 BEGIN {
     $HAS_ENCODE = eval { require Encode };
 }
 
-@ISA = qw(Pod::Simple);
-
-$VERSION = '4.14';
-
-# Set the debugging level.  If someone has inserted a debug function into this
-# class already, use that.  Otherwise, use any Pod::Simple debug function
-# that's defined, and failing that, define a debug level of 10.
-BEGIN {
-    my $parent = defined (&Pod::Simple::DEBUG) ? \&Pod::Simple::DEBUG : undef;
-    unless (defined &DEBUG) {
-        *DEBUG = $parent || sub () { 10 };
-    }
+our @ISA = qw(Pod::Simple);
+our $VERSION = '5.01';
+
+# Ensure that $Pod::Simple::nbsp and $Pod::Simple::shy are available.  Code
+# taken from Pod::Simple 3.32, but was only added in 3.30.
+my ($NBSP, $SHY);
+if ($Pod::Simple::VERSION ge 3.30) {
+    $NBSP = $Pod::Simple::nbsp;
+    $SHY  = $Pod::Simple::shy;
+} else {
+    $NBSP = chr utf8::unicode_to_native(0xA0);
+    $SHY  = chr utf8::unicode_to_native(0xAD);
 }
 
 # Import the ASCII constant from Pod::Simple.  This is true iff we're in an
@@ -51,15 +48,12 @@ BEGIN {
 # generally only false for EBCDIC.
 BEGIN { *ASCII = \&Pod::Simple::ASCII }
 
-# Pretty-print a data structure.  Only used for debugging.
-BEGIN { *pretty = \&Pod::Simple::pretty }
-
 # Formatting instructions for various types of blocks.  cleanup makes hyphens
 # hard, adds spaces between consecutive underscores, and escapes backslashes.
 # convert translates characters into escapes.  guesswork means to apply the
-# transformations done by the guesswork sub.  literal says to protect literal
-# quotes from being turned into UTF-8 quotes.  By default, all transformations
-# are on except literal, but some elements override.
+# transformations done by the guesswork sub (if enabled).  literal says to
+# protect literal quotes from being turned into UTF-8 quotes.  By default, all
+# transformations are on except literal, but some elements override.
 #
 # DEFAULT specifies the default settings.  All other elements should list only
 # those settings that they are overriding.  Data indicates =for roff blocks,
@@ -75,6 +69,98 @@ my %FORMATTING = (
     X        => { cleanup => 0,               guesswork => 0               },
 );
 
+# Try to map an encoding as understood by Perl Encode to an encoding
+# understood by groff's preconv.  Encode doesn't care about hyphens or
+# capitalization, but preconv does.  The key is the canonicalized Encode
+# encoding, and the value is something preconv might understand.
+#
+# FreeBSD mandoc only understands utf-8 and iso-latin-1 as of 2022-09-24.
+# groff preconv prefers iso-8859-1, but also understands iso-latin-1, so
+# convert ISO-8859-1 to iso-latin-1 for FreeBSD.
+my %ENCODINGS = (
+    ascii     => 'us-ascii',
+    big5      => 'big5',
+    big5eten  => 'big5',
+    cp950     => 'big5',
+    cp1047    => 'cp1047',
+    euccn     => 'gb2312',
+    eucjp     => 'euc-jp',
+    euckr     => 'euc-kr',
+    gb2312    => 'gb2312',
+    gb2312raw => 'gb2312',
+    iso88591  => 'iso-latin-1',
+    iso88592  => 'iso-8859-2',
+    iso88595  => 'iso-8859-5',
+    iso88597  => 'iso-8859-7',
+    iso88599  => 'iso-8859-9',
+    iso885913 => 'iso-8859-13',
+    iso885915 => 'iso-8859-15',
+    koi8r     => 'koi8-r',
+    latin1    => 'iso-8859-1',
+    usascii   => 'us-ascii',
+    utf8      => 'utf-8',
+    utf16     => 'utf-16',
+    utf16be   => 'utf-16be',
+    utf16le   => 'utf-16le',
+);
+
+##############################################################################
+# Translation tables
+##############################################################################
+
+# The following table is adapted from Tom Christiansen's pod2man.  It is only
+# used with roff output.  It assumes that the standard preamble has already
+# been printed, since that's what defines all of the accent marks.  We really
+# want to do something better than this when *roff actually supports other
+# character sets itself, since these results are pretty poor.
+#
+# This only works in an ASCII world.  What to do in a non-ASCII world is very
+# unclear, so we just output what we get and hope for the best.
+my %ESCAPES;
+@ESCAPES{0xA0 .. 0xFF} = (
+    $NBSP, undef, undef, undef,            undef, undef, undef, undef,
+    undef, undef, undef, undef,            undef, $SHY,  undef, undef,
+
+    undef, undef, undef, undef,            undef, undef, undef, undef,
+    undef, undef, undef, undef,            undef, undef, undef, undef,
+
+    "A\\*`",  "A\\*'", "A\\*^", "A\\*~",   "A\\*:", "A\\*o", "\\*(Ae", "C\\*,",
+    "E\\*`",  "E\\*'", "E\\*^", "E\\*:",   "I\\*`", "I\\*'", "I\\*^",  "I\\*:",
+
+    "\\*(D-", "N\\*~", "O\\*`", "O\\*'",   "O\\*^", "O\\*~", "O\\*:",  undef,
+    "O\\*/",  "U\\*`", "U\\*'", "U\\*^",   "U\\*:", "Y\\*'", "\\*(Th", "\\*8",
+
+    "a\\*`",  "a\\*'", "a\\*^", "a\\*~",   "a\\*:", "a\\*o", "\\*(ae", "c\\*,",
+    "e\\*`",  "e\\*'", "e\\*^", "e\\*:",   "i\\*`", "i\\*'", "i\\*^",  "i\\*:",
+
+    "\\*(d-", "n\\*~", "o\\*`", "o\\*'",   "o\\*^", "o\\*~", "o\\*:",  undef,
+    "o\\*/" , "u\\*`", "u\\*'", "u\\*^",   "u\\*:", "y\\*'", "\\*(th", "y\\*:",
+) if ASCII;
+
+##############################################################################
+# Utility functions
+##############################################################################
+
+# Quote an argument to a macro.
+#
+# $arg - Intended argument to the macro
+#
+# Returns: $arg suitably escaped and quoted
+sub _quote_macro_argument {
+    my ($arg) = @_;
+    if (length($arg) > 0 && $arg !~ m{ [\s\"] }xms) {
+        return $arg;
+    }
+    $arg =~ s{ \" }{""}xmsg;
+    return qq("$arg");
+}
+
+# Returns whether the given encoding needs a call to Encode::encode.
+sub _needs_encode {
+    my ($encoding) = @_;
+    return $encoding ne 'roff' && $encoding ne 'groff';
+}
+
 ##############################################################################
 # Object initialization
 ##############################################################################
@@ -88,9 +174,6 @@ sub new {
     my $class = shift;
     my $self = $class->SUPER::new;
 
-    # Tell Pod::Simple not to handle S<> by automatically inserting &nbsp;.
-    $self->nbsp_for_S (1);
-
     # Tell Pod::Simple to keep whitespace whenever possible.
     if (my $preserve_whitespace = $self->can ('preserve_whitespace')) {
         $self->$preserve_whitespace (1);
@@ -109,63 +192,84 @@ sub new {
     # to put them in our object as hash keys and values.  This could cause
     # problems if we ever clash with Pod::Simple's own internal class
     # variables.
-    %$self = (%$self, @_);
+    my %opts = @_;
+    my @opts = map { ("opt_$_", $opts{$_}) } keys %opts;
+    %$self = (%$self, @opts);
+
+    # Pod::Simple uses encoding internally, so we need to store it as
+    # ENCODING.  Set the default to UTF-8 if not specified.
+    #
+    # Degrade to the old roff encoding if Encode is not available.
+    #
+    # Suppress the warning message when PERL_CORE is set, indicating this is
+    # running as part of the core Perl build.  Perl builds podlators (and all
+    # pure Perl modules) before Encode and other XS modules, so Encode won't
+    # yet be available.  Rely on the Perl core build to generate man pages
+    # later, after all the modules are available, so that UTF-8 handling will
+    # be correct.
+    my %options = @_;
+    if (defined $self->{opt_encoding}) {
+        $$self{ENCODING} = $self->{opt_encoding};
+    } elsif (ASCII) {
+        $$self{ENCODING} = 'UTF-8';
+    } else {
+        $$self{ENCODING} = 'groff';
+    }
+    if (_needs_encode($$self{ENCODING}) && !$HAS_ENCODE) {
+        if (!$ENV{PERL_CORE}) {
+            carp ('encoding requested but Encode module not available,'
+                    . ' falling back to groff escapes');
+        }
+        $$self{ENCODING} = 'groff';
+    }
 
     # Send errors to stderr if requested.
-    if ($$self{stderr} and not $$self{errors}) {
-        $$self{errors} = 'stderr';
+    if ($self->{opt_stderr} and not $self->{opt_errors}) {
+        $self->{opt_errors} = 'stderr';
     }
-    delete $$self{stderr};
+    delete $self->{opt_stderr};
 
     # Validate the errors parameter and act on it.
-    if (not defined $$self{errors}) {
-        $$self{errors} = 'pod';
-    }
-    if ($$self{errors} eq 'stderr' || $$self{errors} eq 'die') {
+    $self->{opt_errors} //= 'pod';
+    if ($self->{opt_errors} eq 'stderr' || $self->{opt_errors} eq 'die') {
         $self->no_errata_section (1);
         $self->complain_stderr (1);
-        if ($$self{errors} eq 'die') {
-            $$self{complain_die} = 1;
+        if ($self->{opt_errors} eq 'die') {
+            $self->{complain_die} = 1;
         }
-    } elsif ($$self{errors} eq 'pod') {
+    } elsif ($self->{opt_errors} eq 'pod') {
         $self->no_errata_section (0);
         $self->complain_stderr (0);
-    } elsif ($$self{errors} eq 'none') {
+    } elsif ($self->{opt_errors} eq 'none') {
         $self->no_errata_section (1);
         $self->no_whining (1);
     } else {
-        croak (qq(Invalid errors setting: "$$self{errors}"));
-    }
-    delete $$self{errors};
-
-    # Degrade back to non-utf8 if Encode is not available.
-    #
-    # Suppress the warning message when PERL_CORE is set, indicating this is
-    # running as part of the core Perl build.  Perl builds podlators (and all
-    # pure Perl modules) before Encode and other XS modules, so Encode won't
-    # yet be available.  Rely on the Perl core build to generate man pages
-    # later, after all the modules are available, so that UTF-8 handling will
-    # be correct.
-    if ($$self{utf8} and !$HAS_ENCODE) {
-        if (!$ENV{PERL_CORE}) {
-            carp ('utf8 mode requested but Encode module not available,'
-                    . ' falling back to non-utf8');
-        }
-        delete $$self{utf8};
+        croak (qq(Invalid errors setting: "$self->{opt_errors}"));
     }
+    delete $self->{opt_errors};
 
     # Initialize various other internal constants based on our arguments.
     $self->init_fonts;
     $self->init_quotes;
     $self->init_page;
 
-    # For right now, default to turning on all of the magic.
-    $$self{MAGIC_CPP}       = 1;
-    $$self{MAGIC_EMDASH}    = 1;
-    $$self{MAGIC_FUNC}      = 1;
-    $$self{MAGIC_MANREF}    = 1;
-    $$self{MAGIC_SMALLCAPS} = 1;
-    $$self{MAGIC_VARS}      = 1;
+    # Configure guesswork based on options.
+    my $guesswork = $self->{opt_guesswork} || q{};
+    my %guesswork = map { $_ => 1 } split(m{,}xms, $guesswork);
+    if (!%guesswork || $guesswork{all}) {
+        #<<<
+        $$self{GUESSWORK} = {
+            functions => 1,
+            manref    => 1,
+            quoting   => 1,
+            variables => 1,
+        };
+        #>>>
+    } elsif ($guesswork{none}) {
+        $$self{GUESSWORK} = {};
+    } else {
+        $$self{GUESSWORK} = {%guesswork};
+    }
 
     return $self;
 }
@@ -182,29 +286,41 @@ sub init_fonts {
 
     # Figure out the fixed-width font.  If user-supplied, make sure that they
     # are the right length.
-    for (qw/fixed fixedbold fixeditalic fixedbolditalic/) {
-        my $font = $$self{$_};
-        if (defined ($font) && (length ($font) < 1 || length ($font) > 2)) {
-            croak qq(roff font should be 1 or 2 chars, not "$font");
+    for (qw(fixed fixedbold fixeditalic fixedbolditalic)) {
+        my $font = $self->{"opt_$_"};
+        if (defined($font) && (length($font) < 1 || length($font) > 2)) {
+            croak(qq(roff font should be 1 or 2 chars, not "$font"));
         }
     }
 
     # Set the default fonts.  We can't be sure portably across different
     # implementations what fixed bold-italic may be called (if it's even
     # available), so default to just bold.
-    $$self{fixed}           ||= 'CW';
-    $$self{fixedbold}       ||= 'CB';
-    $$self{fixeditalic}     ||= 'CI';
-    $$self{fixedbolditalic} ||= 'CB';
+    #<<<
+    $self->{opt_fixed}           ||= 'CW';
+    $self->{opt_fixedbold}       ||= 'CB';
+    $self->{opt_fixeditalic}     ||= 'CI';
+    $self->{opt_fixedbolditalic} ||= 'CB';
+    #>>>
 
     # Set up a table of font escapes.  First number is fixed-width, second is
     # bold, third is italic.
-    $$self{FONTS} = { '000' => '\fR', '001' => '\fI',
-                      '010' => '\fB', '011' => '\f(BI',
-                      '100' => toescape ($$self{fixed}),
-                      '101' => toescape ($$self{fixeditalic}),
-                      '110' => toescape ($$self{fixedbold}),
-                      '111' => toescape ($$self{fixedbolditalic}) };
+    $self->{FONTS} = {
+        '000' => '\fR',
+        '001' => '\fI',
+        '010' => '\fB',
+        '011' => '\f(BI',
+        '100' => toescape($self->{opt_fixed}),
+        '101' => toescape($self->{opt_fixeditalic}),
+        '110' => toescape($self->{opt_fixedbold}),
+        '111' => toescape($self->{opt_fixedbolditalic}),
+    };
+
+    # Precalculate a regex that matches all fixed-width fonts, which will be
+    # used later by switchquotes.
+    my @fixedpat = map { quotemeta($self->{FONTS}{$_}) } qw(100 101 110 111);
+    my $fixedpat = join('|', @fixedpat);
+    $self->{FIXEDPAT} = qr{ $fixedpat }xms;
 }
 
 # Initialize the quotes that we'll be using for C<> text.  This requires some
@@ -215,32 +331,28 @@ sub init_quotes {
     my ($self) = (@_);
 
     # Handle the quotes option first, which sets both quotes at once.
-    $$self{quotes} ||= '"';
-    if ($$self{quotes} eq 'none') {
+    $self->{opt_quotes} ||= '"';
+    if ($self->{opt_quotes} eq 'none') {
         $$self{LQUOTE} = $$self{RQUOTE} = '';
-    } elsif (length ($$self{quotes}) == 1) {
-        $$self{LQUOTE} = $$self{RQUOTE} = $$self{quotes};
-    } elsif (length ($$self{quotes}) % 2 == 0) {
-        my $length = length ($$self{quotes}) / 2;
-        $$self{LQUOTE} = substr ($$self{quotes}, 0, $length);
-        $$self{RQUOTE} = substr ($$self{quotes}, $length);
+    } elsif (length ($self->{opt_quotes}) == 1) {
+        $$self{LQUOTE} = $$self{RQUOTE} = $self->{opt_quotes};
+    } elsif (length ($self->{opt_quotes}) % 2 == 0) {
+        my $length = length ($self->{opt_quotes}) / 2;
+        $$self{LQUOTE} = substr ($self->{opt_quotes}, 0, $length);
+        $$self{RQUOTE} = substr ($self->{opt_quotes}, $length);
     } else {
-        croak(qq(Invalid quote specification "$$self{quotes}"))
+        croak(qq(Invalid quote specification "$self->{opt_quotes}"))
     }
 
     # Now handle the lquote and rquote options.
-    if (defined $$self{lquote}) {
-        $$self{LQUOTE} = $$self{lquote} eq 'none' ? q{} : $$self{lquote};
+    if (defined($self->{opt_lquote})) {
+        $self->{opt_lquote} = q{} if $self->{opt_lquote} eq 'none';
+        $$self{LQUOTE} = $self->{opt_lquote};
     }
-    if (defined $$self{rquote}) {
-        $$self{RQUOTE} = $$self{rquote} eq 'none' ? q{} : $$self{rquote};
+    if (defined $self->{opt_rquote}) {
+        $self->{opt_rquote} = q{} if $self->{opt_rquote} eq 'none';
+        $$self{RQUOTE} = $self->{opt_rquote};
     }
-
-    # Double the first quote; note that this should not be s///g as two double
-    # quotes is represented in *roff as three double quotes, not four.  Weird,
-    # I know.
-    $$self{LQUOTE} =~ s/\"/\"\"/;
-    $$self{RQUOTE} =~ s/\"/\"\"/;
 }
 
 # Initialize the page title information and indentation from our arguments.
@@ -254,17 +366,9 @@ sub init_page {
 
     # Set the defaults for page titles and indentation if the user didn't
     # override anything.
-    $$self{center} = 'User Contributed Perl Documentation'
-        unless defined $$self{center};
-    $$self{release} = 'perl v' . $version
-        unless defined $$self{release};
-    $$self{indent} = 4
-        unless defined $$self{indent};
-
-    # Double quotes in things that will be quoted.
-    for (qw/center release/) {
-        $$self{$_} =~ s/\"/\"\"/g if $$self{$_};
-    }
+    $self->{opt_center}  //= 'User Contributed Perl Documentation';
+    $self->{opt_release} //= 'perl v' . $version;
+    $self->{opt_indent}  //= 4;
 }
 
 ##############################################################################
@@ -289,7 +393,6 @@ sub init_page {
 # according to the current formatting instructions as we do.
 sub _handle_text {
     my ($self, $text) = @_;
-    DEBUG > 3 and print "== $text\n";
     my $tag = $$self{PENDING}[-1];
     $$tag[2] .= $self->format_text ($$tag[1], $text);
 }
@@ -308,7 +411,6 @@ sub method_for_element {
 # text and nested elements.  Otherwise, if start_element is defined, call it.
 sub _handle_element_start {
     my ($self, $element, $attrs) = @_;
-    DEBUG > 3 and print "++ $element (<", join ('> <', %$attrs), ">)\n";
     my $method = $self->method_for_element ($element);
 
     # If we have a command handler, we need to accumulate the contents of the
@@ -316,7 +418,6 @@ sub _handle_element_start {
     # <Para> and the formatting codes so that IN_NAME isn't still set for the
     # first heading after the NAME heading.
     if ($self->can ("cmd_$method")) {
-        DEBUG > 2 and print "<$element> starts saving a tag\n";
         $$self{IN_NAME} = 0 if ($element ne 'Para' && length ($element) > 1);
 
         # How we're going to format embedded text blocks depends on the tag
@@ -328,11 +429,8 @@ sub _handle_element_start {
             %{ $FORMATTING{$element} || {} },
         };
         push (@{ $$self{PENDING} }, [ $attrs, $formatting, '' ]);
-        DEBUG > 4 and print "Pending: [", pretty ($$self{PENDING}), "]\n";
     } elsif (my $start_method = $self->can ("start_$method")) {
         $self->$start_method ($attrs, '');
-    } else {
-        DEBUG > 2 and print "No $method start method, skipping\n";
     }
 }
 
@@ -341,16 +439,12 @@ sub _handle_element_start {
 # an end_ method for the element, call that.
 sub _handle_element_end {
     my ($self, $element) = @_;
-    DEBUG > 3 and print "-- $element\n";
     my $method = $self->method_for_element ($element);
 
     # If we have a command handler, pull off the pending text and pass it to
     # the handler along with the saved attribute hash.
     if (my $cmd_method = $self->can ("cmd_$method")) {
-        DEBUG > 2 and print "</$element> stops saving a tag\n";
         my $tag = pop @{ $$self{PENDING} };
-        DEBUG > 4 and print "Popped: [", pretty ($tag), "]\n";
-        DEBUG > 4 and print "Pending: [", pretty ($$self{PENDING}), "]\n";
         my $text = $self->$cmd_method ($$tag[0], $$tag[2]);
         if (defined $text) {
             if (@{ $$self{PENDING} } > 1) {
@@ -361,8 +455,6 @@ sub _handle_element_end {
         }
     } elsif (my $end_method = $self->can ("end_$method")) {
         $self->$end_method ();
-    } else {
-        DEBUG > 2 and print "No $method end method, skipping\n";
     }
 }
 
@@ -381,31 +473,40 @@ sub format_text {
     my $literal = $$options{literal};
 
     # Cleanup just tidies up a few things, telling *roff that the hyphens are
-    # hard, putting a bit of space between consecutive underscores, and
-    # escaping backslashes.  Be careful not to mangle our character
-    # translations by doing this before processing character translation.
+    # hard, putting a bit of space between consecutive underscores, escaping
+    # backslashes, and converting zero-width spaces to zero-width break
+    # points.
     if ($cleanup) {
         $text =~ s/\\/\\e/g;
         $text =~ s/-/\\-/g;
         $text =~ s/_(?=_)/_\\|/g;
+        $text =~ s/\x{200B}/\\:/g;
     }
 
-    # Normally we do character translation, but we won't even do that in
-    # <Data> blocks or if UTF-8 output is desired.
-    if ($convert && !$$self{utf8} && ASCII) {
-        $text =~ s/([^\x00-\x7F])/$ESCAPES{ord ($1)} || "X"/eg;
+    # Except in <Data> blocks, if groff or roff encoding is requested and
+    # we're in an ASCII environment, do the encoding.  For EBCDIC, we just
+    # write what we get and hope for the best.  Leave non-breaking spaces and
+    # soft hyphens alone; we'll convert those at the last minute.
+    if ($convert) {
+        if (ASCII) {
+            if ($$self{ENCODING} eq 'groff') {
+                $text =~ s{ ([^\x00-\x7F\xA0\xAD]) }{
+                    '\\[u' . sprintf('%04X', ord($1)) . ']'
+                }xmsge;
+            } elsif ($$self{ENCODING} eq 'roff') {
+                $text =~ s/([^\x00-\x7F\xA0\xAD])/$ESCAPES{ord ($1)} || "X"/eg;
+            }
+        }
     }
 
     # Ensure that *roff doesn't convert literal quotes to UTF-8 single quotes,
-    # but don't mess up our accept escapes.
+    # but don't mess up accent escapes.
     if ($literal) {
         $text =~ s/(?<!\\\*)\'/\\*\(Aq/g;
         $text =~ s/(?<!\\\*)\`/\\\`/g;
     }
 
-    # If guesswork is asked for, do that.  This involves more substantial
-    # formatting based on various heuristics that may only be appropriate for
-    # particular documents.
+    # If guesswork is is viable for this block, do that.
     if ($guesswork) {
         $text = $self->guesswork ($text);
     }
@@ -420,31 +521,45 @@ sub quote_literal {
     my $self = shift;
     local $_ = shift;
 
+    # If in NAME section, just return an ASCII quoted string to avoid
+    # confusing tools like whatis.
+    if ($$self{IN_NAME}) {
+        return $self->{LQUOTE} . $_ . $self->{RQUOTE};
+    }
+
     # A regex that matches the portion of a variable reference that's the
     # array or hash index, separated out just because we want to use it in
     # several places in the following regex.
-    my $index = '(?: \[.*\] | \{.*\} )?';
-
-    # If in NAME section, just return an ASCII quoted string to avoid
-    # confusing tools like whatis.
-    return qq{"$_"} if $$self{IN_NAME};
+    my $index = '(?: \[[^]]+\] | \{[^}]+\} )?';
 
     # Check for things that we don't want to quote, and if we find any of
     # them, return the string with just a font change and no quoting.
+    #
+    # Traditionally, Pod::Man has not quoted Perl variables, functions,
+    # numbers, or hex constants, but this is not always desirable.  Make this
+    # optional on the quoting guesswork flag.
+    my $extra = qr{(?!)}xms;    # never matches
+    if ($$self{GUESSWORK}{quoting}) {
+        $extra = qr{
+             \$+ [\#^]? \S $index                    # special ($^F, $")
+           | [\$\@%&*]+ \#? [:\'\w]+ $index          # plain var or func
+           | [\$\@%&*]* [:\'\w]+
+             (?: \\-> )? \(\s*[^\s,\)]*\s*\)         # 0/1-arg func call
+           | (?: [+] || \\- )? ( \d[\d.]* | \.\d+ )
+             (?: [eE] (?: [+] || \\- )? \d+ )?       # a number
+           | 0x [a-fA-F\d]+                          # a hex constant
+         }xms;
+    }
     m{
       ^\s*
       (?:
-         ( [\'\`\"] ) .* \1                             # already quoted
-       | \\\*\(Aq .* \\\*\(Aq                           # quoted and escaped
-       | \\?\` .* ( \' | \\\*\(Aq )                     # `quoted'
-       | \$+ [\#^]? \S $index                           # special ($^Foo, $")
-       | [\$\@%&*]+ \#? [:\'\w]+ $index                 # plain var or func
-       | [\$\@%&*]* [:\'\w]+ (?: -> )? \(\s*[^\s,]\s*\) # 0/1-arg func call
-       | [-+]? ( \d[\d.]* | \.\d+ ) (?: [eE][-+]?\d+ )? # a number
-       | 0x [a-fA-F\d]+                                 # a hex constant
+         ( [\'\"] ) .* \1                    # already quoted
+       | \\\*\(Aq .* \\\*\(Aq                # quoted and escaped
+       | \\?\` .* ( \' | \\?\` | \\\*\(Aq )  # `quoted' or `quoted`
+       | $extra
       )
       \s*\z
-     }xso and return '\f(FS' . $_ . '\f(FE';
+     }xms and return '\f(FS' . $_ . '\f(FE';
 
     # If we didn't return, go ahead and quote the text.
     return '\f(FS\*(C`' . $_ . "\\*(C'\\f(FE";
@@ -453,10 +568,8 @@ sub quote_literal {
 # Takes a text block to perform guesswork on.  Returns the text block with
 # formatting codes added.  This is the code that marks up various Perl
 # constructs and things commonly used in man pages without requiring the user
-# to add any explicit markup, and is applied to all non-literal text.  We're
-# guaranteed that the text we're applying guesswork to does not contain any
-# *roff formatting codes.  Note that the inserted font sequences must be
-# treated later with mapfonts or textmapfonts.
+# to add any explicit markup, and is applied to all non-literal text.  Note
+# that the inserted font sequences must be treated later with mapfonts.
 #
 # This method is very fragile, both in the regular expressions it uses and in
 # the ordering of those modifications.  Care and testing is required when
@@ -464,7 +577,6 @@ sub quote_literal {
 sub guesswork {
     my $self = shift;
     local $_ = shift;
-    DEBUG > 5 and print "   Guesswork called on [$_]\n";
 
     # By the time we reach this point, all hyphens will be escaped by adding a
     # backslash.  We want to undo that escaping if they're part of regular
@@ -475,9 +587,9 @@ sub guesswork {
     # Note that this is not user-controllable; we pretty much have to do this
     # transformation or *roff will mangle the output in unacceptable ways.
     s{
-        ( (?:\G|^|\s) [\(\"]* [a-zA-Z] ) ( \\- )?
+        ( (?:\G|^|\s|$NBSP) [\(\"]* [a-zA-Z] ) ( \\- )?
         ( (?: [a-zA-Z\']+ \\-)+ )
-        ( [a-zA-Z\']+ ) (?= [\)\".?!,;:]* (?:\s|\Z|\\\ ) )
+        ( [a-zA-Z\']+ ) (?= [\)\".?!,;:]* (?:\s|$NBSP|\Z|\\\ ) )
         \b
     } {
         my ($prefix, $hyphen, $main, $suffix) = ($1, $2, $3, $4);
@@ -486,52 +598,17 @@ sub guesswork {
         $prefix . $hyphen . $main . $suffix;
     }egx;
 
-    # Translate "--" into a real em-dash if it's used like one.  This means
-    # that it's either surrounded by whitespace, it follows a regular word, or
-    # it occurs between two regular words.
-    if ($$self{MAGIC_EMDASH}) {
-        s{          (\s) \\-\\- (\s)                } { $1 . '\*(--' . $2 }egx;
-        s{ (\b[a-zA-Z]+) \\-\\- (\s|\Z|[a-zA-Z]+\b) } { $1 . '\*(--' . $2 }egx;
-    }
-
-    # Make words in all-caps a little bit smaller; they look better that way.
-    # However, we don't want to change Perl code (like @ARGV), nor do we want
-    # to fix the MIME in MIME-Version since it looks weird with the
-    # full-height V.
-    #
-    # We change only a string of all caps (2) either at the beginning of the
-    # line or following regular punctuation (like quotes) or whitespace (1),
-    # and followed by either similar punctuation, an em-dash, or the end of
-    # the line (3).
-    #
-    # Allow the text we're changing to small caps to include double quotes,
-    # commas, newlines, and periods as long as it doesn't otherwise interrupt
-    # the string of small caps and still fits the criteria.  This lets us turn
-    # entire warranty disclaimers in man page output into small caps.
-    if ($$self{MAGIC_SMALLCAPS}) {
-        s{
-            ( ^ | [\s\(\"\'\`\[\{<>] | \\[ ]  )                           # (1)
-            ( [A-Z] [A-Z] (?: \s? [/A-Z+:\d_\$&] | \\- | \s? [.,\"] )* )  # (2)
-            (?= [\s>\}\]\(\)\'\".?!,;] | \\*\(-- | \\[ ] | $ )            # (3)
-        } {
-            $1 . '\s-1' . $2 . '\s0'
-        }egx;
-    }
-
-    # Note that from this point forward, we have to adjust for \s-1 and \s-0
-    # strings inserted around things that we've made small-caps if later
-    # transforms should work on those strings.
-
     # Embolden functions in the form func(), including functions that are in
-    # all capitals, but don't embolden if there's anything between the parens.
+    # all capitals, but don't embolden if there's anything inside the parens.
     # The function must start with an alphabetic character or underscore and
     # then consist of word characters or colons.
-    if ($$self{MAGIC_FUNC}) {
+    if ($$self{GUESSWORK}{functions}) {
         s{
-            ( \b | \\s-1 )
-            ( [A-Za-z_] ([:\w] | \\s-?[01])+ \(\) )
+            (?<! \\ )
+            \b
+            ( [A-Za-z_] [:\w]+ \(\) )
         } {
-            $1 . '\f(BS' . $2 . '\f(BE'
+            '\f(BS' . $1 . '\f(BE'
         }egx;
     }
 
@@ -542,21 +619,21 @@ sub guesswork {
     # configuration file man pages), or colons, and n is a single digit,
     # optionally followed by some number of lowercase letters.  Note that this
     # does not recognize man page references like perl(l) or socket(3SOCKET).
-    if ($$self{MAGIC_MANREF}) {
+    if ($$self{GUESSWORK}{manref}) {
         s{
-            ( \b | \\s-1 )
-            (?<! \\ )                                   # rule out \s0(1)
-            ( [A-Za-z_] (?:[.:\w] | \\- | \\s-?[01])+ )
+            \b
+            (?<! \\ )                                   # rule out \e0(1)
+            ( [A-Za-z_] (?:[.:\w] | \\-)+ )
             ( \( \d [a-z]* \) )
         } {
-            $1 . '\f(BS' . $2 . '\f(BE\|' . $3
+            '\f(BS' . $1 . '\f(BE\|' . $2
         }egx;
     }
 
     # Convert simple Perl variable references to a fixed-width font.  Be
     # careful not to convert functions, though; there are too many subtleties
     # with them to want to perform this transformation.
-    if ($$self{MAGIC_VARS}) {
+    if ($$self{GUESSWORK}{variables}) {
         s{
            ( ^ | \s+ )
            ( [\$\@%] [\w:]+ )
@@ -566,19 +643,7 @@ sub guesswork {
         }egx;
     }
 
-    # Fix up double quotes.  Unfortunately, we miss this transformation if the
-    # quoted text contains any code with formatting codes and there's not much
-    # we can effectively do about that, which makes it somewhat unclear if
-    # this is really a good idea.
-    s{ \" ([^\"]+) \" } { '\*(L"' . $1 . '\*(R"' }egx;
-
-    # Make C++ into \*(C+, which is a squinched version.
-    if ($$self{MAGIC_CPP}) {
-        s{ \b C\+\+ } {\\*\(C+}gx;
-    }
-
     # Done.
-    DEBUG > 5 and print "   Guesswork returning [$_]\n";
     return $_;
 }
 
@@ -592,111 +657,106 @@ sub guesswork {
 # the right start and end codes.
 #
 # We add this level of complexity because the old pod2man didn't get code like
-# B<someI<thing> else> right; after I<> it switched back to normal text rather
-# than bold.  We take care of this by using variables that state whether bold,
-# italic, or fixed are turned on as a combined pointer to our current font
-# sequence, and set each to the number of current nestings of start tags for
-# that font.
+# B<< someI<thing> else>> right.  After I<> it switched back to normal text
+# rather than bold.  We take care of this by using variables that state
+# whether bold, italic, or fixed are turned on as a combined pointer to our
+# current font sequence, and set each to the number of current nestings of
+# start tags for that font.
+#
+# The base font must be either \fP or \fR.  \fP changes to the previous font,
+# but only one previous font is kept.  Unfortunately, there is a bug in
+# Solaris 2.6 nroff (not present in GNU groff) where the sequence
+# \fB\fP\f(CW\fP leaves the font set to B rather than R, presumably because
+# \f(CW doesn't actually do a font change.  Because of this, we prefer to use
+# \fR where possible.
 #
-# \fP changes to the previous font, but only one previous font is kept.  We
-# don't know what the outside level font is; normally it's R, but if we're
-# inside a heading it could be something else.  So arrange things so that the
-# outside font is always the "previous" font and end with \fP instead of \fR.
-# Idea from Zack Weinberg.
+# Unfortunately, this isn't possible for arguments to heading macros, since
+# there we don't know what the outside level font is.  In that case, arrange
+# things so that the outside font is always the "previous" font and end with
+# \fP instead of \fR.  Idea from Zack Weinberg.
+#
+# This function used to be much simpler outside of macro arguments because it
+# went directly from \fB to \f(CW and relied on \f(CW clearing bold since it
+# wasn't \f(CB.  Unfortunately, while this works for mandoc, this is not how
+# groff works; \fBfoo\f(CWbar still prints bar in bold.  Therefore, we force
+# the font back to the base font before each font change.
 sub mapfonts {
-    my ($self, $text) = @_;
+    my ($self, $text, $base) = @_;
+
+    # The closure used to process each font escape, expected to be called from
+    # the right-hand side of an s/// expression.
     my ($fixed, $bold, $italic) = (0, 0, 0);
     my %magic = (F => \$fixed, B => \$bold, I => \$italic);
     my $last = '\fR';
-    $text =~ s<
-        \\f\((.)(.)
-    > <
-        my $sequence = '';
-        my $f;
-        if ($last ne '\fR') { $sequence = '\fP' }
-        ${ $magic{$1} } += ($2 eq 'S') ? 1 : -1;
-        $f = $$self{FONTS}{ ($fixed && 1) . ($bold && 1) . ($italic && 1) };
-        if ($f eq $last) {
-            '';
-        } else {
-            if ($f ne '\fR') { $sequence .= $f }
-            $last = $f;
-            $sequence;
+    my $process = sub {
+        my ($style, $start_stop) = @_;
+        my $sequence = ($last ne '\fR') ? $base : q{};
+        ${ $magic{$style} } += ($start_stop eq 'S') ? 1 : -1;
+        my $f = $self->{FONTS}{($fixed && 1) . ($bold && 1) . ($italic && 1)};
+        return q{} if ($f eq $last);
+        if ($f ne '\fR') {
+            $sequence .= $f;
         }
-    >gxe;
-    return $text;
-}
+        $last = $f;
+        return $sequence;
+    };
+
+    # Now, do the actual work.
+    $text =~ s{ \\f\((.)(.) }{$process->($1, $2)}xmsge;
+
+    # We can do a bit of cleanup by collapsing sequences like \fR\fB\fR\fI
+    # into just \fI.
+    $text =~ s{ (?: \\fR )? (?: \\f (.|\(..) \\fR )+ }{\\fR}xms;
 
-# Unfortunately, there is a bug in Solaris 2.6 nroff (not present in GNU
-# groff) where the sequence \fB\fP\f(CW\fP leaves the font set to B rather
-# than R, presumably because \f(CW doesn't actually do a font change.  To work
-# around this, use a separate textmapfonts for text blocks where the default
-# font is always R and only use the smart mapfonts for headings.
-sub textmapfonts {
-    my ($self, $text) = @_;
-    my ($fixed, $bold, $italic) = (0, 0, 0);
-    my %magic = (F => \$fixed, B => \$bold, I => \$italic);
-    $text =~ s<
-        \\f\((.)(.)
-    > <
-        ${ $magic{$1} } += ($2 eq 'S') ? 1 : -1;
-        $$self{FONTS}{ ($fixed && 1) . ($bold && 1) . ($italic && 1) };
-    >gxe;
     return $text;
 }
 
 # Given a command and a single argument that may or may not contain double
-# quotes, handle double-quote formatting for it.  If there are no double
-# quotes, just return the command followed by the argument in double quotes.
-# If there are double quotes, use an if statement to test for nroff, and for
-# nroff output the command followed by the argument in double quotes with
-# embedded double quotes doubled.  For other formatters, remap paired double
-# quotes to LQUOTE and RQUOTE.
+# quotes and fixed-width text, handle double-quote formatting for it.  If
+# there is no fixed-width text, just return the command followed by the
+# argument with proper quoting.  If there is fixed-width text, work around a
+# Solaris nroff bug with fixed-width fonts by converting fixed-width to
+# regular fonts (nroff sees no difference).
 sub switchquotes {
     my ($self, $command, $text, $extra) = @_;
-    $text =~ s/\\\*\([LR]\"/\"/g;
-
-    # We also have to deal with \*C` and \*C', which are used to add the
-    # quotes around C<> text, since they may expand to " and if they do this
-    # confuses the .SH macros and the like no end.  Expand them ourselves.
-    # Also separate troff from nroff if there are any fixed-width fonts in use
-    # to work around problems with Solaris nroff.
-    my $c_is_quote = ($$self{LQUOTE} =~ /\"/) || ($$self{RQUOTE} =~ /\"/);
-    my $fixedpat = join '|', @{ $$self{FONTS} }{'100', '101', '110', '111'};
-    $fixedpat =~ s/\\/\\\\/g;
-    $fixedpat =~ s/\(/\\\(/g;
-    if ($text =~ m/\"/ || $text =~ m/$fixedpat/) {
-        $text =~ s/\"/\"\"/g;
+
+    # Separate troff from nroff if there are any fixed-width fonts in use to
+    # work around problems with Solaris nroff.
+    if ($text =~ $self->{FIXEDPAT}) {
         my $nroff = $text;
         my $troff = $text;
-        $troff =~ s/\"\"([^\"]*)\"\"/\`\`$1\'\'/g;
-        if ($c_is_quote and $text =~ m/\\\*\(C[\'\`]/) {
-            $nroff =~ s/\\\*\(C\`/$$self{LQUOTE}/g;
-            $nroff =~ s/\\\*\(C\'/$$self{RQUOTE}/g;
-            $troff =~ s/\\\*\(C[\'\`]//g;
-        }
-        $nroff = qq("$nroff") . ($extra ? " $extra" : '');
-        $troff = qq("$troff") . ($extra ? " $extra" : '');
 
         # Work around the Solaris nroff bug where \f(CW\fP leaves the font set
         # to Roman rather than the actual previous font when used in headings.
         # troff output may still be broken, but at least we can fix nroff by
         # just switching the font changes to the non-fixed versions.
-        my $font_end = "(?:\\f[PR]|\Q$$self{FONTS}{100}\E)";
-        $nroff =~ s/\Q$$self{FONTS}{100}\E(.*?)\\f([PR])/$1/g;
-        $nroff =~ s/\Q$$self{FONTS}{101}\E(.*?)$font_end/\\fI$1\\fP/g;
-        $nroff =~ s/\Q$$self{FONTS}{110}\E(.*?)$font_end/\\fB$1\\fP/g;
-        $nroff =~ s/\Q$$self{FONTS}{111}\E(.*?)$font_end/\\f\(BI$1\\fP/g;
+        my $font_end = qr{ (?: \\f[PR] | \Q$self->{FONTS}{100}\E ) }xms;
+        $nroff =~ s{\Q$self->{FONTS}{100}\E(.*?)\\f([PR])}{$1}xmsg;
+        $nroff =~ s{\Q$self->{FONTS}{101}\E}{\\fI}xmsg;
+        $nroff =~ s{\Q$self->{FONTS}{110}\E}{\\fB}xmsg;
+        $nroff =~ s{\Q$self->{FONTS}{111}\E}{\\f\(BI}xmsg;
+
+        # We have to deal with \*C` and \*C', which are used to add the quotes
+        # around C<> text, since they may expand to " and if they do this
+        # confuses the .SH macros and the like no end.  Expand them ourselves.
+        my $c_is_quote = index("$self->{LQUOTE}$self->{RQUOTE}", qq(\")) != -1;
+        if ($c_is_quote && $text =~ m{ \\[*]\(C[\'\`] }xms) {
+            $nroff =~ s{ \\[*]\(C\` }{$self->{LQUOTE}}xmsg;
+            $nroff =~ s{ \\[*]\(C\' }{$self->{RQUOTE}}xmsg;
+            $troff =~ s{ \\[*]\(C[\'\`] }{}xmsg;
+        }
 
         # Now finally output the command.  Bother with .ie only if the nroff
         # and troff output aren't the same.
+        $nroff = _quote_macro_argument($nroff) . ($extra ? " $extra" : '');
+        $troff = _quote_macro_argument($troff) . ($extra ? " $extra" : '');
         if ($nroff ne $troff) {
             return ".ie n $command $nroff\n.el $command $troff\n";
         } else {
             return "$command $nroff\n";
         }
     } else {
-        $text = qq("$text") . ($extra ? " $extra" : '');
+        $text = _quote_macro_argument($text) . ($extra ? " $extra" : '');
         return "$command $text\n";
     }
 }
@@ -761,10 +821,22 @@ sub outindex {
 # Output some text, without any additional changes.
 sub output {
     my ($self, @text) = @_;
-    if ($$self{ENCODE}) {
-        print { $$self{output_fh} } Encode::encode ('UTF-8', join ('', @text));
+    my $text = join('', @text);
+    $text =~ s{$NBSP}{\\ }g;
+    $text =~ s{$SHY}{\\%}g;
+
+    if ($$self{ENCODE} && _needs_encode($$self{ENCODING})) {
+        my $check = sub {
+            my ($char) = @_;
+            my $display = '"\x{' . hex($char) . '}"';
+            my $error = "$display does not map to $$self{ENCODING}";
+            $self->whine ($self->line_count(), $error);
+            return Encode::encode ($$self{ENCODING}, chr($char));
+        };
+        my $output = Encode::encode ($$self{ENCODING}, $text, $check);
+        print { $$self{output_fh} } $output;
     } else {
-        print { $$self{output_fh} } @text;
+        print { $$self{output_fh} } $text;
     }
 }
 
@@ -777,21 +849,20 @@ sub output {
 sub start_document {
     my ($self, $attrs) = @_;
     if ($$attrs{contentless} && !$$self{ALWAYS_EMIT_SOMETHING}) {
-        DEBUG and print "Document is contentless\n";
         $$self{CONTENTLESS} = 1;
     } else {
         delete $$self{CONTENTLESS};
     }
 
-    # When UTF-8 output is set, check whether our output file handle already
-    # has a PerlIO encoding layer set.  If it does not, we'll need to encode
-    # our output before printing it (handled in the output() sub).  Wrap the
-    # check in an eval to handle versions of Perl without PerlIO.
+    # When an encoding is requested, check whether our output file handle
+    # already has a PerlIO encoding layer set.  If it does not, we'll need to
+    # encode our output before printing it (handled in the output() sub).
+    # Wrap the check in an eval to handle versions of Perl without PerlIO.
     #
     # PerlIO::get_layers still requires its argument be a glob, so coerce the
     # file handle to a glob.
     $$self{ENCODE} = 0;
-    if ($$self{utf8}) {
+    if ($$self{ENCODING}) {
         $$self{ENCODE} = 1;
         eval {
             my @options = (output => 1, details => 1);
@@ -806,15 +877,15 @@ sub start_document {
     # document was content-free.
     if (!$$self{CONTENTLESS}) {
         my ($name, $section);
-        if (defined $$self{name}) {
-            $name = $$self{name};
-            $section = $$self{section} || 1;
+        if (defined $self->{opt_name}) {
+            $name = $self->{opt_name};
+            $section = $self->{opt_section} || 1;
         } else {
             ($name, $section) = $self->devise_title;
         }
-        my $date = defined($$self{date}) ? $$self{date} : $self->devise_date;
+        my $date = $self->{opt_date} // $self->devise_date();
         $self->preamble ($name, $section, $date)
-            unless $self->bare_output or DEBUG > 9;
+            unless $self->bare_output;
     }
 
     # Initialize a few per-document variables.
@@ -839,7 +910,6 @@ sub end_document {
     }
     return if $self->bare_output;
     return if ($$self{CONTENTLESS} && !$$self{ALWAYS_EMIT_SOMETHING});
-    $self->output (q(.\" [End document]) . "\n") if DEBUG;
 }
 
 # Try to figure out the name and section from the file name and return them as
@@ -848,8 +918,8 @@ sub end_document {
 sub devise_title {
     my ($self) = @_;
     my $name = $self->source_filename || '';
-    my $section = $$self{section} || 1;
-    $section = 3 if (!$$self{section} && $name =~ /\.pm\z/i);
+    my $section = $self->{opt_section} || 1;
+    $section = 3 if (!$self->{opt_section} && $name =~ /\.pm\z/i);
     $name =~ s/\.p(od|[lm])\z//i;
 
     # If Pod::Parser gave us an IO::File reference as the source file name,
@@ -900,8 +970,6 @@ sub devise_title {
                     $cut = $i + 1;
                     $cut++ if ($dirs[$i + 1] && $dirs[$i + 1] eq 'lib');
                     last;
-                } elsif ($dirs[$i] eq 'lib' && $dirs[$i + 1] && $dirs[0] eq 'ext') {
-                    $cut = $i + 1;
                 }
             }
             if ($cut > 0) {
@@ -983,34 +1051,53 @@ sub devise_date {
 # module, but this order is correct for both Solaris and Linux.
 sub preamble {
     my ($self, $name, $section, $date) = @_;
-    my $preamble = $self->preamble_template (!$$self{utf8});
+    my $preamble = $self->preamble_template();
 
-    # Build the index line and make sure that it will be syntactically valid.
-    my $index = "$name $section";
-    $index =~ s/\"/\"\"/g;
-
-    # If name or section contain spaces, quote them (section really never
-    # should, but we may as well be cautious).
-    for ($name, $section) {
-        if (/\s/) {
-            s/\"/\"\"/g;
-            $_ = '"' . $_ . '"';
+    # groff's preconv script will use this line to correctly determine the
+    # input encoding if the encoding is one of the ones it recognizes.  It
+    # must be the first or second line.
+    #
+    # If the output encoding is some version of Unicode, we could also add a
+    # Unicode Byte Order Mark to the start of the file, but the BOM is now
+    # deprecated and I am concerned that may break a *roff implementation that
+    # might otherwise cope with Unicode.  Revisit this if someone files a bug
+    # report about it.
+    if (_needs_encode($$self{ENCODING})) {
+        my $normalized = lc($$self{ENCODING});
+        $normalized =~ s{-}{}g;
+        my $coding = $ENCODINGS{$normalized} || lc($$self{ENCODING});
+        if ($coding ne 'us-ascii') {
+            $self->output(qq{.\\\" -*- mode: troff; coding: $coding -*-\n});
         }
     }
 
-    # Double quotes in date, since it will be quoted.
-    $date =~ s/\"/\"\"/g;
-
-    # Substitute into the preamble the configuration options.
-    $preamble =~ s/\@CFONT\@/$$self{fixed}/;
-    $preamble =~ s/\@LQUOTE\@/$$self{LQUOTE}/;
-    $preamble =~ s/\@RQUOTE\@/$$self{RQUOTE}/;
-    chomp $preamble;
+    # Substitute into the preamble the configuration options.  Because it's
+    # used as the argument to defining a string, any leading double quote (but
+    # no other double quotes) in LQUOTE and RQUOTE has to be doubled.
+    $preamble =~ s{ [@] CFONT [@] }{$self->{opt_fixed}}xms;
+    my $lquote = $self->{LQUOTE};
+    my $rquote = $self->{RQUOTE};
+    $lquote =~ s{ \A \" }{""}xms;
+    $rquote =~ s{ \A \" }{""}xms;
+    $preamble =~ s{ [@] LQUOTE [@] }{$lquote}xms;
+    $preamble =~ s{ [@] RQUOTE [@] }{$rquote}xms;
+    chomp($preamble);
 
     # Get the version information.
-    my $version = $self->version_report;
+    my $version = $self->version_report();
 
-    # Finally output everything.
+    # Build the index line and make sure that it will be syntactically valid.
+    my $index = _quote_macro_argument("$name $section");
+
+    # Quote the arguments to the .TH macro.  (Section should never require
+    # this, but we may as well be cautious.)
+    $name = _quote_macro_argument($name);
+    $section = _quote_macro_argument($section);
+    $date = _quote_macro_argument($date);
+    my $center = _quote_macro_argument($self->{opt_center});
+    my $release = _quote_macro_argument($self->{opt_release});
+
+    # Output the majority of the preamble.
     $self->output (<<"----END OF HEADER----");
 .\\" Automatically generated by $version
 .\\"
@@ -1019,14 +1106,19 @@ sub preamble {
 $preamble
 .\\" ========================================================================
 .\\"
-.IX Title "$index"
-.TH $name $section "$date" "$$self{release}" "$$self{center}"
+.IX Title $index
+.TH $name $section $date $release $center
 .\\" For nroff, turn off justification.  Always turn off hyphenation; it makes
 .\\" way too many mistakes in technical documents.
 .if n .ad l
 .nh
 ----END OF HEADER----
-    $self->output (".\\\" [End of preamble]\n") if DEBUG;
+
+    # If the language was specified, output the language configuration.
+    if ($self->{opt_language}) {
+        $self->output(".mso $self->{opt_language}.tmac\n");
+        $self->output(".hla $self->{opt_language}\n");
+    }
 }
 
 ##############################################################################
@@ -1051,11 +1143,6 @@ sub cmd_para {
         $$self{SHIFTWAIT} = 0;
     }
 
-    # Add the line number for debugging, but not in the NAME section just in
-    # case the comment would confuse apropos.
-    $self->output (".\\\" [At source line $line]\n")
-        if defined ($line) && DEBUG && !$$self{IN_NAME};
-
     # Force exactly one newline at the end and strip unwanted trailing
     # whitespace at the end, but leave "\ " backslashed space from an S< > at
     # the end of a line.  Reverse the text first, to avoid having to scan the
@@ -1065,8 +1152,8 @@ sub cmd_para {
     $text = reverse $text;
 
     # Output the paragraph.
-    $self->output ($self->protect ($self->textmapfonts ($text)));
-    $self->outindex;
+    $self->output($self->protect($self->mapfonts($text, '\fR')));
+    $self->outindex();
     $$self{NEEDSPACE} = 1;
     return '';
 }
@@ -1078,45 +1165,44 @@ sub cmd_verbatim {
     my ($self, $attrs, $text) = @_;
 
     # Ignore an empty verbatim paragraph.
-    return unless $text =~ /\S/;
+    return if $text !~ m{ \S }xms;
 
     # Force exactly one newline at the end and strip unwanted trailing
-    # whitespace at the end.  Reverse the text first, to avoid having to scan
-    # the entire paragraph.
-    $text = reverse $text;
-    $text =~ s/\A\s*/\n/;
-    $text = reverse $text;
+    # whitespace at the end.
+    $text =~ s{ \s* \z }{\n}xms;
 
     # Get a count of the number of lines before the first blank line, which
     # we'll pass to .Vb as its parameter.  This tells *roff to keep that many
     # lines together.  We don't want to tell *roff to keep huge blocks
     # together.
-    my @lines = split (/\n/, $text);
+    my @lines = split (m{ \n }xms, $text);
     my $unbroken = 0;
-    for (@lines) {
-        last if /^\s*$/;
+    for my $line (@lines) {
+        last if $line =~ m{ \A \s* \z }xms;
         $unbroken++;
     }
-    $unbroken = 10 if ($unbroken > 12 && !$$self{MAGIC_VNOPAGEBREAK_LIMIT});
+    if ($unbroken > 12) {
+        $unbroken = 10;
+    }
 
-    # Prepend a null token to each line.
-    $text =~ s/^/\\&/gm;
+    # Prepend a null token to each line to preserve indentation.
+    $text =~ s{ ^ }{\\&}xmsg;
 
     # Output the results.
-    $self->makespace;
-    $self->output (".Vb $unbroken\n$text.Ve\n");
+    $self->makespace();
+    $self->output(".Vb $unbroken\n$text.Ve\n");
     $$self{NEEDSPACE} = 1;
-    return '';
+    return q{};
 }
 
 # Handle literal text (produced by =for and similar constructs).  Just output
 # it with the minimum of changes.
 sub cmd_data {
     my ($self, $attrs, $text) = @_;
-    $text =~ s/^\n+//;
-    $text =~ s/\n{0,2}$/\n/;
-    $self->output ($text);
-    return '';
+    $text =~ s{ \A \n+ }{}xms;
+    $text =~ s{ \n{0,2} \z }{\n}xms;
+    $self->output($text);
+    return q{};
 }
 
 ##############################################################################
@@ -1138,9 +1224,6 @@ sub heading_common {
         $self->output (".PD\n");
     }
 
-    # Output the current source line.
-    $self->output ( ".\\\" [At source line $line]\n" )
-        if defined ($line) && DEBUG;
     return $text;
 }
 
@@ -1153,7 +1236,7 @@ sub cmd_head1 {
     $text =~ s/\\s-?\d//g;
     $text = $self->heading_common ($text, $$attrs{start_line});
     my $isname = ($text eq 'NAME' || $text =~ /\(NAME\)/);
-    $self->output ($self->switchquotes ('.SH', $self->mapfonts ($text)));
+    $self->output($self->switchquotes('.SH', $self->mapfonts($text, '\fP')));
     $self->outindex ('Header', $text) unless $isname;
     $$self{NEEDSPACE} = 0;
     $$self{IN_NAME} = $isname;
@@ -1164,7 +1247,7 @@ sub cmd_head1 {
 sub cmd_head2 {
     my ($self, $attrs, $text) = @_;
     $text = $self->heading_common ($text, $$attrs{start_line});
-    $self->output ($self->switchquotes ('.SS', $self->mapfonts ($text)));
+    $self->output($self->switchquotes('.SS', $self->mapfonts($text, '\fP')));
     $self->outindex ('Subsection', $text);
     $$self{NEEDSPACE} = 0;
     return '';
@@ -1176,7 +1259,7 @@ sub cmd_head3 {
     my ($self, $attrs, $text) = @_;
     $text = $self->heading_common ($text, $$attrs{start_line});
     $self->makespace;
-    $self->output ($self->textmapfonts ('\f(IS' . $text . '\f(IE') . "\n");
+    $self->output($self->mapfonts('\f(IS' . $text . '\f(IE', '\fR') . "\n");
     $self->outindex ('Subsection', $text);
     $$self{NEEDSPACE} = 1;
     return '';
@@ -1188,7 +1271,7 @@ sub cmd_head4 {
     my ($self, $attrs, $text) = @_;
     $text = $self->heading_common ($text, $$attrs{start_line});
     $self->makespace;
-    $self->output ($self->textmapfonts ($text) . "\n");
+    $self->output($self->mapfonts($text, '\fR') . "\n");
     $self->outindex ('Subsection', $text);
     $$self{NEEDSPACE} = 1;
     return '';
@@ -1205,6 +1288,13 @@ sub cmd_i { return $_[0]->{IN_NAME} ? $_[2] : '\f(IS' . $_[2] . '\f(IE' }
 sub cmd_f { return $_[0]->{IN_NAME} ? $_[2] : '\f(IS' . $_[2] . '\f(IE' }
 sub cmd_c { return $_[0]->quote_literal ($_[2]) }
 
+# Convert all internal whitespace to $NBSP.
+sub cmd_s {
+    my ($self, $attrs, $text) = @_;
+    $text =~ s{ \s }{$NBSP}xmsg;
+    return $text;
+}
+
 # Index entries are just added to the pending entries.
 sub cmd_x {
     my ($self, $attrs, $text) = @_;
@@ -1226,7 +1316,7 @@ sub cmd_l {
         }
         if (not defined ($to) or $to eq $text) {
             return "<$text>";
-        } elsif ($$self{nourls}) {
+        } elsif ($self->{opt_nourls}) {
             return $text;
         } else {
             return "$text <$$attrs{to}>";
@@ -1247,12 +1337,10 @@ sub over_common_start {
     my ($self, $type, $attrs) = @_;
     my $line = $$attrs{start_line};
     my $indent = $$attrs{indent};
-    DEBUG > 3 and print " Starting =over $type (line $line, indent ",
-        ($indent || '?'), "\n";
 
     # Find the indentation level.
     unless (defined ($indent) && $indent =~ /^[-+]?\d{1,4}\s*$/) {
-        $indent = $$self{indent};
+        $indent = $self->{opt_indent};
     }
 
     # If we've gotten multiple indentations in a row, we need to emit the
@@ -1281,7 +1369,6 @@ sub over_common_start {
 # .RE and then a new .RS to unconfuse *roff.
 sub over_common_end {
     my ($self) = @_;
-    DEBUG > 3 and print " Ending =over\n";
     $$self{INDENT} = pop @{ $$self{INDENTS} };
     pop @{ $$self{ITEMTYPES} };
 
@@ -1320,7 +1407,6 @@ sub end_over_block  { $_[0]->over_common_end }
 sub item_common {
     my ($self, $type, $attrs, $text) = @_;
     my $line = $$attrs{start_line};
-    DEBUG > 3 and print "  $type item (line $line): $text\n";
 
     # Clean up the text.  We want to end up with two variables, one ($text)
     # which contains any body text after taking out the item portion, and
@@ -1352,8 +1438,8 @@ sub item_common {
     $self->output (".PD 0\n") if ($$self{ITEMS} == 1);
 
     # Now, output the item tag itself.
-    $item = $self->textmapfonts ($item);
-    $self->output ($self->switchquotes ('.IP', $item, $$self{INDENT}));
+    $item = $self->mapfonts($item, '\fR');
+    $self->output($self->switchquotes('.IP', $item, $$self{INDENT}));
     $$self{NEEDSPACE} = 0;
     $$self{ITEMS}++;
     $$self{SHIFTWAIT} = 0;
@@ -1362,7 +1448,7 @@ sub item_common {
     if ($text) {
         $text =~ s/\s*$/\n/;
         $self->makespace;
-        $self->output ($self->protect ($self->textmapfonts ($text)));
+        $self->output($self->protect($self->mapfonts($text, '\fR')));
         $$self{NEEDSPACE} = 1;
     }
     $self->outindex ($index ? ('Item', $index) : ());
@@ -1449,49 +1535,16 @@ sub parse_string_document {
     return $self->SUPER::parse_string_document ($doc);
 }
 
-##############################################################################
-# Translation tables
-##############################################################################
-
-# The following table is adapted from Tom Christiansen's pod2man.  It assumes
-# that the standard preamble has already been printed, since that's what
-# defines all of the accent marks.  We really want to do something better than
-# this when *roff actually supports other character sets itself, since these
-# results are pretty poor.
-#
-# This only works in an ASCII world.  What to do in a non-ASCII world is very
-# unclear -- hopefully we can assume UTF-8 and just leave well enough alone.
-@ESCAPES{0xA0 .. 0xFF} = (
-    "\\ ", undef, undef, undef,            undef, undef, undef, undef,
-    undef, undef, undef, undef,            undef, "\\%", undef, undef,
-
-    undef, undef, undef, undef,            undef, undef, undef, undef,
-    undef, undef, undef, undef,            undef, undef, undef, undef,
-
-    "A\\*`",  "A\\*'", "A\\*^", "A\\*~",   "A\\*:", "A\\*o", "\\*(Ae", "C\\*,",
-    "E\\*`",  "E\\*'", "E\\*^", "E\\*:",   "I\\*`", "I\\*'", "I\\*^",  "I\\*:",
-
-    "\\*(D-", "N\\*~", "O\\*`", "O\\*'",   "O\\*^", "O\\*~", "O\\*:",  undef,
-    "O\\*/",  "U\\*`", "U\\*'", "U\\*^",   "U\\*:", "Y\\*'", "\\*(Th", "\\*8",
-
-    "a\\*`",  "a\\*'", "a\\*^", "a\\*~",   "a\\*:", "a\\*o", "\\*(ae", "c\\*,",
-    "e\\*`",  "e\\*'", "e\\*^", "e\\*:",   "i\\*`", "i\\*'", "i\\*^",  "i\\*:",
-
-    "\\*(d-", "n\\*~", "o\\*`", "o\\*'",   "o\\*^", "o\\*~", "o\\*:",  undef,
-    "o\\*/" , "u\\*`", "u\\*'", "u\\*^",   "u\\*:", "y\\*'", "\\*(th", "y\\*:",
-) if ASCII;
-
 ##############################################################################
 # Premable
 ##############################################################################
 
-# The following is the static preamble which starts all *roff output we
-# generate.  Most is static except for the font to use as a fixed-width font,
-# which is designed by @CFONT@, and the left and right quotes to use for C<>
-# text, designated by @LQOUTE@ and @RQUOTE@.  However, the second part, which
-# defines the accent marks, is only used if $escapes is set to true.
+# The preamble which starts all *roff output we generate.  Most is static
+# except for the font to use as a fixed-width font (designed by @CFONT@), and
+# the left and right quotes to use for C<> text (designated by @LQOUTE@ and
+# @RQUOTE@).  Accent marks are only defined if the output encoding is roff.
 sub preamble_template {
-    my ($self, $accents) = @_;
+    my ($self) = @_;
     my $preamble = <<'----END OF PREAMBLE----';
 .de Sp \" Vertical space (when we can't use .PP)
 .if t .sp .5v
@@ -1506,29 +1559,12 @@ sub preamble_template {
 .ft R
 .fi
 ..
-.\" Set up some character translations and predefined strings.  \*(-- will
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
-.\" double quote, and \*(R" will give a right double quote.  \*(C+ will
-.\" give a nicer C++.  Capital omega is used to do unbreakable dashes and
-.\" therefore won't be available.  \*(C` and \*(C' expand to `' in nroff,
-.\" nothing in troff, for use with C<>.
-.tr \(*W-
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
+.\" \*(C` and \*(C' are quotes in nroff, nothing in troff, for use with C<>.
 .ie n \{\
-.    ds -- \(*W-
-.    ds PI pi
-.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
-.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
-.    ds L" ""
-.    ds R" ""
 .    ds C` @LQUOTE@
 .    ds C' @RQUOTE@
 'br\}
 .el\{\
-.    ds -- \|\(em\|
-.    ds PI \(*p
-.    ds L" ``
-.    ds R" ''
 .    ds C`
 .    ds C'
 'br\}
@@ -1562,7 +1598,7 @@ sub preamble_template {
 ----END OF PREAMBLE----
 #'# for cperl-mode
 
-    if ($accents) {
+    if ($$self{ENCODING} eq 'roff') {
         $preamble .= <<'----END OF PREAMBLE----'
 .\"
 .\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
@@ -1592,7 +1628,7 @@ sub preamble_template {
 .    ds /
 .\}
 .if t \{\
-.    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
+.    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h'|\\n:u'
 .    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
 .    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
 .    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
@@ -1639,10 +1675,13 @@ sub preamble_template {
 1;
 __END__
 
+=encoding UTF-8
+
 =for stopwords
 en em ALLCAPS teeny fixedbold fixeditalic fixedbolditalic stderr utf8 UTF-8
 Allbery Sean Burke Ossanna Solaris formatters troff uppercased Christiansen
-nourls parsers Kernighan lquote rquote
+nourls parsers Kernighan lquote rquote unrepresentable mandoc NetBSD PostScript
+SMP macOS EBCDIC fallbacks manref reflowed reflowing FH overridable
 
 =head1 NAME
 
@@ -1668,100 +1707,197 @@ using L<nroff(1)>, normally via L<man(1)>, or printing using L<troff(1)>.
 It is conventionally invoked using the driver script B<pod2man>, but it can
 also be used directly.
 
-As a derived class from Pod::Simple, Pod::Man supports the same methods and
-interfaces.  See L<Pod::Simple> for all the details.
-
-new() can take options, in the form of key/value pairs that control the
-behavior of the parser.  See below for details.
-
-If no options are given, Pod::Man uses the name of the input file with any
-trailing C<.pod>, C<.pm>, or C<.pl> stripped as the man page title, to
-section 1 unless the file ended in C<.pm> in which case it defaults to
-section 3, to a centered title of "User Contributed Perl Documentation", to
-a centered footer of the Perl version it is run with, and to a left-hand
-footer of the modification date of its input (or the current date if given
-C<STDIN> for input).
-
-Pod::Man assumes that your *roff formatters have a fixed-width font named
-C<CW>.  If yours is called something else (like C<CR>), use the C<fixed>
-option to specify it.  This generally only matters for troff output for
-printing.  Similarly, you can set the fonts used for bold, italic, and
-bold italic fixed-width output.
-
-Besides the obvious pod conversions, Pod::Man also takes care of
-formatting func(), func(3), and simple variable references like $foo or
-@bar so you don't have to use code escapes for them; complex expressions
-like C<$fred{'stuff'}> will still need to be escaped, though.  It also
-translates dashes that aren't used as hyphens into en dashes, makes long
-dashes--like this--into proper em dashes, fixes "paired quotes," makes C++
-look right, puts a little space between double underscores, makes ALLCAPS
-a teeny bit smaller in B<troff>, and escapes stuff that *roff treats as
-special so that you don't have to.
-
-The recognized options to new() are as follows.  All options take a single
-argument.
+By default (on non-EBCDIC systems), Pod::Man outputs UTF-8.  Its output should
+work with the B<man> program on systems that use B<groff> (most Linux
+distributions) or B<mandoc> (most BSD variants), but may result in mangled
+output on older UNIX systems.  To choose a different, possibly more
+backward-compatible output mangling on such systems, set the C<encoding>
+option to C<roff> (the default in earlier Pod::Man versions).  See the
+C<encoding> option and L</ENCODING> for more details.
+
+See L</COMPATIBILTY> for the versions of Pod::Man with significant
+backward-incompatible changes (other than constructor options, whose versions
+are documented below), and the versions of Perl that included them.
+
+=head1 CLASS METHODS
+
+=over 4
+
+=item new(ARGS)
+
+Create a new Pod::Man object.  ARGS should be a list of key/value pairs, where
+the keys are chosen from the following.  Each option is annotated with the
+version of Pod::Man in which that option was added with its current meaning.
 
 =over 4
 
 =item center
 
-Sets the centered page header for the C<.TH> macro.  The default, if this
-option is not specified, is "User Contributed Perl Documentation".
+[1.00] Sets the centered page header for the C<.TH> macro.  The default, if
+this option is not specified, is C<User Contributed Perl Documentation>.
 
 =item date
 
-Sets the left-hand footer for the C<.TH> macro.  If this option is not set,
-the contents of the environment variable POD_MAN_DATE, if set, will be used.
-Failing that, the value of SOURCE_DATE_EPOCH, the modification date of the
-input file, or the current time if stat() can't find that file (which will be
-the case if the input is from C<STDIN>) will be used.  If obtained from the
-file modification date or the current time, the date will be formatted as
-C<YYYY-MM-DD> and will be based on UTC (so that the output will be
-reproducible regardless of local time zone).
+[4.00] Sets the left-hand footer for the C<.TH> macro.  If this option is not
+set, the contents of the environment variable POD_MAN_DATE, if set, will be
+used.  Failing that, the value of SOURCE_DATE_EPOCH, the modification date of
+the input file, or the current time if stat() can't find that file (which will
+be the case if the input is from C<STDIN>) will be used.  If taken from any
+source other than POD_MAN_DATE (which is used verbatim), the date will be
+formatted as C<YYYY-MM-DD> and will be based on UTC (so that the output will
+be reproducible regardless of local time zone).
+
+=item encoding
+
+[5.00] Specifies the encoding of the output.  The value must be an encoding
+recognized by the L<Encode> module (see L<Encode::Supported>), or the special
+values C<roff> or C<groff>.  The default on non-EBCDIC systems is UTF-8.
+
+If the output contains characters that cannot be represented in this encoding,
+that is an error that will be reported as configured by the C<errors> option.
+If error handling is other than C<die>, the unrepresentable character will be
+replaced with the Encode substitution character (normally C<?>).
+
+If the C<encoding> option is set to the special value C<groff> (the default on
+EBCDIC systems), or if the Encode module is not available and the encoding is
+set to anything other than C<roff>, Pod::Man will translate all non-ASCII
+characters to C<\[uNNNN]> Unicode escapes.  These are not traditionally part
+of the *roff language, but are supported by B<groff> and B<mandoc> and thus by
+the majority of manual page processors in use today.
+
+If the C<encoding> option is set to the special value C<roff>, Pod::Man will
+do its historic transformation of (some) ISO 8859-1 characters into *roff
+escapes that may be adequate in troff and may be readable (if ugly) in nroff.
+This was the default behavior of versions of Pod::Man before 5.00.  With this
+encoding, all other non-ASCII characters will be replaced with C<X>.  It may
+be required for very old troff and nroff implementations that do not support
+UTF-8, but its representation of any non-ASCII character is very poor and
+often specific to European languages.
+
+If the output file handle has a PerlIO encoding layer set, setting C<encoding>
+to anything other than C<groff> or C<roff> will be ignored and no encoding
+will be done by Pod::Man.  It will instead rely on the encoding layer to make
+whatever output encoding transformations are desired.
+
+WARNING: The input encoding of the POD source is independent from the output
+encoding, and setting this option does not affect the interpretation of the
+POD input.  Unless your POD source is US-ASCII, its encoding should be
+declared with the C<=encoding> command in the source.  If this is not done,
+Pod::Simple will will attempt to guess the encoding and may be successful if
+it's Latin-1 or UTF-8, but it will produce warnings.  See L<perlpod(1)> for
+more information.
 
 =item errors
 
-How to report errors.  C<die> says to throw an exception on any POD
-formatting error.  C<stderr> says to report errors on standard error, but
-not to throw an exception.  C<pod> says to include a POD ERRORS section
-in the resulting documentation summarizing the errors.  C<none> ignores
-POD errors entirely, as much as possible.
+[2.27] How to report errors.  C<die> says to throw an exception on any POD
+formatting error.  C<stderr> says to report errors on standard error, but not
+to throw an exception.  C<pod> says to include a POD ERRORS section in the
+resulting documentation summarizing the errors.  C<none> ignores POD errors
+entirely, as much as possible.
 
 The default is C<pod>.
 
 =item fixed
 
-The fixed-width font to use for verbatim text and code.  Defaults to
-C<CW>.  Some systems may want C<CR> instead.  Only matters for B<troff>
-output.
+[1.00] The fixed-width font to use for verbatim text and code.  Defaults to
+C<CW>.  Some systems prefer C<CR> instead.  Only matters for B<troff> output.
 
 =item fixedbold
 
-Bold version of the fixed-width font.  Defaults to C<CB>.  Only matters
+[1.00] Bold version of the fixed-width font.  Defaults to C<CB>.  Only matters
 for B<troff> output.
 
 =item fixeditalic
 
-Italic version of the fixed-width font (actually, something of a misnomer,
-since most fixed-width fonts only have an oblique version, not an italic
-version).  Defaults to C<CI>.  Only matters for B<troff> output.
+[1.00] Italic version of the fixed-width font (something of a misnomer, since
+most fixed-width fonts only have an oblique version, not an italic version).
+Defaults to C<CI>.  Only matters for B<troff> output.
 
 =item fixedbolditalic
 
-Bold italic (probably actually oblique) version of the fixed-width font.
-Pod::Man doesn't assume you have this, and defaults to C<CB>.  Some
-systems (such as Solaris) have this font available as C<CX>.  Only matters
-for B<troff> output.
+[1.00] Bold italic (in theory, probably oblique in practice) version of the
+fixed-width font.  Pod::Man doesn't assume you have this, and defaults to
+C<CB>.  Some systems (such as Solaris) have this font available as C<CX>.
+Only matters for B<troff> output.
+
+=item guesswork
+
+[5.00] By default, Pod::Man applies some default formatting rules based on
+guesswork and regular expressions that are intended to make writing Perl
+documentation easier and require less explicit markup.  These rules may not
+always be appropriate, particularly for documentation that isn't about Perl.
+This option allows turning all or some of it off.
+
+The special value C<all> enables all guesswork.  This is also the default for
+backward compatibility reasons.  The special value C<none> disables all
+guesswork.  Otherwise, the value of this option should be a comma-separated
+list of one or more of the following keywords:
+
+=over 4
+
+=item functions
+
+Convert function references like C<foo()> to bold even if they have no markup.
+The function name accepts valid Perl characters for function names (including
+C<:>), and the trailing parentheses must be present and empty.
+
+=item manref
+
+Make the first part (before the parentheses) of manual page references like
+C<foo(1)> bold even if they have no markup.  The section must be a single
+number optionally followed by lowercase letters.
+
+=item quoting
+
+If no guesswork is enabled, any text enclosed in CZ<><> is surrounded by
+double quotes in nroff (terminal) output unless the contents are already
+quoted.  When this guesswork is enabled, quote marks will also be suppressed
+for Perl variables, function names, function calls, numbers, and hex
+constants.
+
+=item variables
+
+Convert Perl variable names to a fixed-width font even if they have no markup.
+This transformation will only be apparent in troff output, or some other
+output format (unlike nroff terminal output) that supports fixed-width fonts.
+
+=back
+
+Any unknown guesswork name is silently ignored (for potential future
+compatibility), so be careful about spelling.
+
+=item language
+
+[5.00] Add commands telling B<groff> that the input file is in the given
+language.  The value of this setting must be a language abbreviation for which
+B<groff> provides supplemental configuration, such as C<ja> (for Japanese) or
+C<zh> (for Chinese).
+
+Specifically, this adds:
+
+    .mso <language>.tmac
+    .hla <language>
+
+to the start of the file, which configure correct line breaking for the
+specified language.  Without these commands, groff may not know how to add
+proper line breaks for Chinese and Japanese text if the manual page is
+installed into the normal manual page directory, such as F</usr/share/man>.
+
+On many systems, this will be done automatically if the manual page is
+installed into a language-specific manual page directory, such as
+F</usr/share/man/zh_CN>.  In that case, this option is not required.
+
+Unfortunately, the commands added with this option are specific to B<groff>
+and will not work with other B<troff> and B<nroff> implementations.
 
 =item lquote
 
 =item rquote
 
-Sets the quote marks used to surround CE<lt>> text.  C<lquote> sets the
-left quote mark and C<rquote> sets the right quote mark.  Either may also
-be set to the special value C<none>, in which case no quote mark is added
-on that side of CE<lt>> text (but the font is still changed for troff
-output).
+[4.08] Sets the quote marks used to surround CE<lt>> text.  C<lquote> sets the
+left quote mark and C<rquote> sets the right quote mark.  Either may also be
+set to the special value C<none>, in which case no quote mark is added on that
+side of CE<lt>> text (but the font is still changed for troff output).
 
 Also see the C<quotes> option, which can be used to set both quotes at once.
 If both C<quotes> and one of the other options is set, C<lquote> or C<rquote>
@@ -1769,21 +1905,21 @@ overrides C<quotes>.
 
 =item name
 
-Set the name of the manual page for the C<.TH> macro.  Without this
-option, the manual name is set to the uppercased base name of the file
-being converted unless the manual section is 3, in which case the path is
-parsed to see if it is a Perl module path.  If it is, a path like
-C<.../lib/Pod/Man.pm> is converted into a name like C<Pod::Man>.  This
-option, if given, overrides any automatic determination of the name.
+[4.08] Set the name of the manual page for the C<.TH> macro.  Without this
+option, the manual name is set to the uppercased base name of the file being
+converted unless the manual section is 3, in which case the path is parsed to
+see if it is a Perl module path.  If it is, a path like C<.../lib/Pod/Man.pm>
+is converted into a name like C<Pod::Man>.  This option, if given, overrides
+any automatic determination of the name.
 
 If generating a manual page from standard input, the name will be set to
-C<STDIN> if this option is not provided.  Providing this option is strongly
-recommended to set a meaningful manual page name.
+C<STDIN> if this option is not provided.  In this case, providing this option
+is strongly recommended to set a meaningful manual page name.
 
 =item nourls
 
-Normally, LZ<><> formatting codes with a URL but anchor text are formatted
-to show both the anchor text and the URL.  In other words:
+[2.27] Normally, LZ<><> formatting codes with a URL but anchor text are
+formatted to show both the anchor text and the URL.  In other words:
 
     L<foo|http://example.com/>
 
@@ -1798,10 +1934,10 @@ important.
 
 =item quotes
 
-Sets the quote marks used to surround CE<lt>> text.  If the value is a
-single character, it is used as both the left and right quote.  Otherwise,
-it is split in half, and the first half of the string is used as the left
-quote and the second is used as the right quote.
+[4.00] Sets the quote marks used to surround CE<lt>> text.  If the value is a
+single character, it is used as both the left and right quote.  Otherwise, it
+is split in half, and the first half of the string is used as the left quote
+and the second is used as the right quote.
 
 This may also be set to the special value C<none>, in which case no quote
 marks are added around CE<lt>> text (but the font is still changed for troff
@@ -1813,82 +1949,258 @@ options is set, C<lquote> or C<rquote> overrides C<quotes>.
 
 =item release
 
-Set the centered footer for the C<.TH> macro.  By default, this is set to
-the version of Perl you run Pod::Man under.  Setting this to the empty
-string will cause some *roff implementations to use the system default
-value.
+[1.00] Set the centered footer for the C<.TH> macro.  By default, this is set
+to the version of Perl you run Pod::Man under.  Setting this to the empty
+string will cause some *roff implementations to use the system default value.
 
-Note that some system C<an> macro sets assume that the centered footer
-will be a modification date and will prepend something like "Last
-modified: ".  If this is the case for your target system, you may want to
-set C<release> to the last modified date and C<date> to the version
-number.
+Note that some system C<an> macro sets assume that the centered footer will be
+a modification date and will prepend something like C<Last modified: >.  If
+this is the case for your target system, you may want to set C<release> to the
+last modified date and C<date> to the version number.
 
 =item section
 
-Set the section for the C<.TH> macro.  The standard section numbering
-convention is to use 1 for user commands, 2 for system calls, 3 for
-functions, 4 for devices, 5 for file formats, 6 for games, 7 for
-miscellaneous information, and 8 for administrator commands.  There is a lot
-of variation here, however; some systems (like Solaris) use 4 for file
-formats, 5 for miscellaneous information, and 7 for devices.  Still others
-use 1m instead of 8, or some mix of both.  About the only section numbers
-that are reliably consistent are 1, 2, and 3.
+[1.00] Set the section for the C<.TH> macro.  The standard section numbering
+convention is to use 1 for user commands, 2 for system calls, 3 for functions,
+4 for devices, 5 for file formats, 6 for games, 7 for miscellaneous
+information, and 8 for administrator commands.  There is a lot of variation
+here, however; some systems (like Solaris) use 4 for file formats, 5 for
+miscellaneous information, and 7 for devices.  Still others use 1m instead of
+8, or some mix of both.  About the only section numbers that are reliably
+consistent are 1, 2, and 3.
 
 By default, section 1 will be used unless the file ends in C<.pm> in which
 case section 3 will be selected.
 
 =item stderr
 
-Send error messages about invalid POD to standard error instead of
-appending a POD ERRORS section to the generated *roff output.  This is
-equivalent to setting C<errors> to C<stderr> if C<errors> is not already
-set.  It is supported for backward compatibility.
+[2.19] If set to a true value, send error messages about invalid POD to
+standard error instead of appending a POD ERRORS section to the generated
+*roff output.  This is equivalent to setting C<errors> to C<stderr> if
+C<errors> is not already set.
+
+This option is for backward compatibility with Pod::Man versions that did not
+support C<errors>.  Normally, the C<errors> option should be used instead.
 
 =item utf8
 
-By default, Pod::Man produces the most conservative possible *roff output
-to try to ensure that it will work with as many different *roff
-implementations as possible.  Many *roff implementations cannot handle
-non-ASCII characters, so this means all non-ASCII characters are converted
-either to a *roff escape sequence that tries to create a properly accented
-character (at least for troff output) or to C<X>.
-
-If this option is set, Pod::Man will instead output UTF-8.  If your *roff
-implementation can handle it, this is the best output format to use and
-avoids corruption of documents containing non-ASCII characters.  However,
-be warned that *roff source with literal UTF-8 characters is not supported
-by many implementations and may even result in segfaults and other bad
-behavior.
-
-Be aware that, when using this option, the input encoding of your POD
-source should be properly declared unless it's US-ASCII.  Pod::Simple will
-attempt to guess the encoding and may be successful if it's Latin-1 or
-UTF-8, but it will produce warnings.  Use the C<=encoding> command to
-declare the encoding.  See L<perlpod(1)> for more information.
+[2.21] This option used to set the output encoding to UTF-8.  Since this is
+now the default, it is ignored and does nothing.
+
+=back
 
 =back
 
-The standard Pod::Simple method parse_file() takes one argument naming the
-POD file to read from.  By default, the output is sent to C<STDOUT>, but
-this can be changed with the output_fh() method.
+=head1 INSTANCE METHODS
+
+As a derived class from Pod::Simple, Pod::Man supports the same methods and
+interfaces.  See L<Pod::Simple> for all the details.  This section summarizes
+the most-frequently-used methods and the ones added by Pod::Man.
+
+=over 4
+
+=item output_fh(FH)
+
+Direct the output from parse_file(), parse_lines(), or parse_string_document()
+to the file handle FH instead of C<STDOUT>.
+
+=item output_string(REF)
+
+Direct the output from parse_file(), parse_lines(), or parse_string_document()
+to the scalar variable pointed to by REF, rather than C<STDOUT>.  For example:
+
+    my $man = Pod::Man->new();
+    my $output;
+    $man->output_string(\$output);
+    $man->parse_file('/some/input/file');
 
-The standard Pod::Simple method parse_from_file() takes up to two
-arguments, the first being the input file to read POD from and the second
-being the file to write the formatted output to.
+Be aware that the output in that variable will already be encoded in UTF-8.
 
-You can also call parse_lines() to parse an array of lines or
-parse_string_document() to parse a document already in memory.  As with
-parse_file(), parse_lines() and parse_string_document() default to sending
-their output to C<STDOUT> unless changed with the output_fh() method.  Be
-aware that parse_lines() and parse_string_document() both expect raw bytes,
-not decoded characters.
+=item parse_file(PATH)
 
-To put the output from any parse method into a string instead of a file
-handle, call the output_string() method instead of output_fh().
+Read the POD source from PATH and format it.  By default, the output is sent
+to C<STDOUT>, but this can be changed with the output_fh() or output_string()
+methods.
 
-See L<Pod::Simple> for more specific details on the methods available to
-all derived parsers.
+=item parse_from_file(INPUT, OUTPUT)
+
+=item parse_from_filehandle(FH, OUTPUT)
+
+Read the POD source from INPUT, format it, and output the results to OUTPUT.
+
+parse_from_filehandle() is provided for backward compatibility with older
+versions of Pod::Man.  parse_from_file() should be used instead.
+
+=item parse_lines(LINES[, ...[, undef]])
+
+Parse the provided lines as POD source, writing the output to either C<STDOUT>
+or the file handle set with the output_fh() or output_string() methods.  This
+method can be called repeatedly to provide more input lines.  An explicit
+C<undef> should be passed to indicate the end of input.
+
+This method expects raw bytes, not decoded characters.
+
+=item parse_string_document(INPUT)
+
+Parse the provided scalar variable as POD source, writing the output to either
+C<STDOUT> or the file handle set with the output_fh() or output_string()
+methods.
+
+This method expects raw bytes, not decoded characters.
+
+=back
+
+=head1 ENCODING
+
+As of Pod::Man 5.00, the default output encoding for Pod::Man is UTF-8.  This
+should work correctly on any modern system that uses either B<groff> (most
+Linux distributions) or B<mandoc> (Alpine Linux and most BSD variants,
+including macOS).
+
+The user will probably have to use a UTF-8 locale to see correct output.  This
+may be done by default; if not, set the LANG or LC_CTYPE environment variables
+to an appropriate local.  The locale C<C.UTF-8> is available on most systems
+if one wants correct output without changing the other things locales affect,
+such as collation.
+
+The backward-compatible output format used in Pod::Man versions before 5.00 is
+available by setting the C<encoding> option to C<roff>.  This may produce
+marginally nicer results on older UNIX versions that do not use B<groff> or
+B<mandoc>, but none of the available options will correctly render Unicode
+characters on those systems.
+
+Below are some additional details about how this choice was made and some
+discussion of alternatives.
+
+=head2 History
+
+The default output encoding for Pod::Man has been a long-standing problem.
+B<troff> and B<nroff> predate Unicode by a significant margin, and their
+implementations for many UNIX systems reflect that legacy.  It's common for
+Unicode to not be supported in any form.
+
+Because of this, versions of Pod::Man prior to 5.00 maintained the highly
+conservative output of the original pod2man, which output pure ASCII with
+complex macros to simulate common western European accented characters when
+processed with troff.  The nroff output was awkward and sometimes incorrect,
+and characters not used in western European scripts were replaced with C<X>.
+This choice maximized backwards compatibility with B<man> and
+B<nroff>/B<troff> implementations at the cost of incorrect rendering of many
+POD documents, particularly those containing people's names.
+
+The modern implementations, B<groff> (used in most Linux distributions) and
+B<mandoc> (used by most BSD variants), do now support Unicode.  Other UNIX
+systems often do not, but they're now a tiny minority of the systems people
+use on a daily basis.  It's increasingly common (for very good reasons) to use
+Unicode characters for POD documents rather than using ASCII conversions of
+people's names or avoiding non-English text, making the limitations in the old
+output format more apparent.
+
+Four options have been proposed to fix this:
+
+=over 2
+
+=item * 
+
+Optionally support UTF-8 output but don't change the default.  This is the
+approach taken since Pod::Man 2.1.0, which added the C<utf8> option.  Some
+Pod::Man users use this option for better output on platforms known to support
+Unicode, but since the defaults have not changed, people continued to
+encounter (and file bug reports about) the poor default rendering.
+
+=item *
+
+Convert characters to troff C<\(xx> escapes.  This requires maintaining a
+large translation table and addresses only a tiny part of the problem, since
+many Unicode characters have no standard troff name.  B<groff> has the largest
+list, but if one is willing to assume B<groff> is the formatter, the next
+option is better.
+
+=item *
+
+Convert characters to groff C<\[uNNNN]> escapes.  This is implemented as the
+C<groff> encoding for those who want to use it, and is supported by both
+B<groff> and B<mandoc>.  However, it is no better than UTF-8 output for
+portability to other implementations.  See L</Testing results> for more
+details.
+
+=item *
+
+Change the default output format to UTF-8 and ask those who want maximum
+backward compatibility to explicitly select the old encoding.  This fixes the
+issue for most users at the cost of backwards compatibility.  While the
+rendering of non-ASCII characters is different on older systems that don't
+support UTF-8, it's not always worse than the old output.
+
+=back
+
+Pod::Man 5.00 and later makes the last choice.  This arguably produces worse
+output when manual pages are formatted with B<troff> into PostScript or PDF,
+but doing this is rare and normally manual, so the encoding can be changed in
+those cases.  The older output encoding is available by setting C<encoding> to
+C<roff>.
+
+=head2 Testing results
+
+Here is the results of testing C<encoding> values of C<utf-8> and C<groff> on
+various operating systems.  The testing methodology was to create F<man/man1>
+in the current directory, copy F<encoding.utf8> or F<encoding.groff> from the
+podlators 5.00 distribution to F<man/man1/encoding.1>, and then run:
+
+    LANG=C.UTF-8 MANPATH=$(pwd)/man man 1 encoding
+
+If the locale is not explicitly set to one that includes UTF-8, the Unicode
+characters were usually converted to ASCII (by, for example, dropping an
+accent) or deleted or replaced with C<< <?> >> if there was no conversion.
+
+Tested on 2022-09-25.  Many thanks to the GCC Compile Farm project for access
+to testing hosts.
+
+    OS                   UTF-8      groff
+    ------------------   -------    -------
+    AIX 7.1              no [1]     no [2]
+    Alpine 3.15.0        yes        yes
+    CentOS 7.9           yes        yes
+    Debian 7             yes        yes
+    FreeBSD 13.0         yes        yes
+    NetBSD 9.2           yes        yes
+    OpenBSD 7.1          yes        yes
+    openSUSE Leap 15.4   yes        yes
+    Solaris 10           yes        no [2]
+    Solaris 11           no [3]     no [3]
+
+I did not have access to a macOS system for testing, but since it uses
+B<mandoc>, it's behavior is probably the same as the BSD hosts.
+
+Notes:
+
+=over 4
+
+=item [1]
+
+Unicode characters were converted to one or two random ASCII characters
+unrelated to the original character.
+
+=item [2]
+
+Unicode characters were shown as the body of the groff escape rather than the
+indicated character (in other words, text like C<[u00EF]>).
+
+=item [3]
+
+Unicode characters were deleted entirely, as if they weren't there.  Using
+C<nroff -man> instead of B<man> to format the page showed the same results as
+Solaris 10.  Using C<groff -k -man -Tutf8> to format the page produced the
+correct output.
+
+=back
+
+PostScript and PDF output using groff on a Debian 12 system do not support
+combining accent marks or SMP characters due to a lack of support in the
+default output font.
+
+Testing on additional platforms is welcome.  Please let the author know if you
+have additional results.
 
 =head1 DIAGNOSTICS
 
@@ -1924,9 +2236,9 @@ option was set to C<die>.
 
 =item PERL_CORE
 
-If set and Encode is not available, silently fall back to non-UTF-8 mode
-without complaining to standard error.  This environment variable is set
-during Perl core builds, which build Encode after podlators.  Encode is
+If set and Encode is not available, silently fall back to an encoding of
+C<groff> without complaining to standard error.  This environment variable is
+set during Perl core builds, which build Encode after podlators.  Encode is
 expected to not (yet) be available in that case.
 
 =item POD_MAN_DATE
@@ -1955,65 +2267,104 @@ reliable if this variable overrode the timestamp of the input file.)
 
 =back
 
-=head1 BUGS
+=head1 COMPATIBILITY
 
-Encoding handling assumes that PerlIO is available and does not work
-properly if it isn't.  The C<utf8> option is therefore not supported
-unless Perl is built with PerlIO support.
+Pod::Man 1.02 (based on L<Pod::Parser>) was the first version included with
+Perl, in Perl 5.6.0.
 
-There is currently no way to turn off the guesswork that tries to format
-unmarked text appropriately, and sometimes it isn't wanted (particularly
-when using POD to document something other than Perl).  Most of the work
-toward fixing this has now been done, however, and all that's still needed
-is a user interface.
+The current API based on L<Pod::Simple> was added in Pod::Man 2.00.  Pod::Man
+2.04 was included in Perl 5.9.3, the first version of Perl to incorporate
+those changes.  This is the first version that correctly supports all modern
+POD syntax.  The parse_from_filehandle() method was re-added for backward
+compatibility in Pod::Man 2.09, included in Perl 5.9.4.
 
-The NAME section should be recognized specially and index entries emitted
-for everything in that section.  This would have to be deferred until the
-next section, since extraneous things in NAME tends to confuse various man
-page processors.  Currently, no index entries are emitted for anything in
-NAME.
+Support for anchor text in LZ<><> links of type URL was added in Pod::Man
+2.23, included in Perl 5.11.5.
 
-Pod::Man doesn't handle font names longer than two characters.  Neither do
-most B<troff> implementations, but GNU troff does as an extension.  It would
-be nice to support as an option for those who want to use it.
+parse_lines(), parse_string_document(), and parse_file() set a default output
+file handle of C<STDOUT> if one was not already set as of Pod::Man 2.28,
+included in Perl 5.19.5.
+
+Support for SOURCE_DATE_EPOCH and POD_MAN_DATE was added in Pod::Man 4.00,
+included in Perl 5.23.7, and generated dates were changed to use UTC instead
+of the local time zone.  This is also the first release that aligned the
+module version and the version of the podlators distribution.  All modules
+included in podlators, and the podlators distribution itself, share the same
+version number from this point forward.
 
-The preamble added to each output file is rather verbose, and most of it
-is only necessary in the presence of non-ASCII characters.  It would
-ideally be nice if all of those definitions were only output if needed,
-perhaps on the fly as the characters are used.
+Pod::Man 4.10, included in Perl 5.27.8, changed the formatting for manual page
+references and function names to bold instead of italic, following the current
+Linux manual page standard.
 
-Pod::Man is excessively slow.
+Pod::Man 5.00 changed the default output encoding to UTF-8, overridable with
+the new C<encoding> option.  It also fixed problems with bold or italic
+extending too far when used with CZ<><> escapes, and began converting Unicode
+zero-width spaces (U+200B) to the C<\:> *roff escape.  It also dropped
+attempts to add subtle formatting corrections in the output that would only be
+visible when typeset with B<troff>, which had previously been a significant
+source of bugs.
+
+=head1 BUGS
+
+There are numerous bugs and language-specific assumptions in the nroff
+fallbacks for accented characters in the C<roff> encoding.  Since the point of
+this encoding is backward compatibility with the output from earlier versions
+of Pod::Man, and it is deprecated except when necessary to support old
+systems, those bugs are unlikely to ever be fixed.
+
+Pod::Man doesn't handle font names longer than two characters.  Neither do
+most B<troff> implementations, but groff does as an extension.  It would be
+nice to support as an option for those who want to use it.
 
 =head1 CAVEATS
 
-If Pod::Man is given the C<utf8> option, the encoding of its output file
-handle will be forced to UTF-8 if possible, overriding any existing
-encoding.  This will be done even if the file handle is not created by
-Pod::Man and was passed in from outside.  This maintains consistency
-regardless of PERL_UNICODE and other settings.
+=head2 Sentence spacing
+
+Pod::Man copies the input spacing verbatim to the output *roff document.  This
+means your output will be affected by how B<nroff> generally handles sentence
+spacing.
+
+B<nroff> dates from an era in which it was standard to use two spaces after
+sentences, and will always add two spaces after a line-ending period (or
+similar punctuation) when reflowing text.  For example, the following input:
+
+    =pod
 
-The handling of hyphens and em dashes is somewhat fragile, and one may get
-the wrong one under some circumstances.  This should only matter for
-B<troff> output.
+    One sentence.
+    Another sentence.
 
-When and whether to use small caps is somewhat tricky, and Pod::Man doesn't
-necessarily get it right.
+will result in two spaces after the period when the text is reflowed.  If you
+use two spaces after sentences anyway, this will be consistent, although you
+will have to be careful to not end a line with an abbreviation such as C<e.g.>
+or C<Ms.>.  Output will also be consistent if you use the *roff style guide
+(and L<XKCD 1285|https://xkcd.com/1285/>) recommendation of putting a line
+break after each sentence, although that will consistently produce two spaces
+after each sentence, which may not be what you want.
 
-Converting neutral double quotes to properly matched double quotes doesn't
-work unless there are no formatting codes between the quote marks.  This
-only matters for troff output.
+If you prefer one space after sentences (which is the more modern style), you
+will unfortunately need to ensure that no line in the middle of a paragraph
+ends in a period or similar sentence-ending paragraph.  Otherwise, B<nroff>
+will add a two spaces after that sentence when reflowing, and your output
+document will have inconsistent spacing.
+
+=head2 Hyphens
+
+The handling of hyphens versus dashes is somewhat fragile, and one may get a
+the wrong one under some circumstances.  This will normally only matter for
+line breaking and possibly for troff output.
 
 =head1 AUTHOR
 
-Russ Allbery <rra@cpan.org>, based I<very> heavily on the original B<pod2man>
-by Tom Christiansen <tchrist@mox.perl.com>.  The modifications to work with
-Pod::Simple instead of Pod::Parser were originally contributed by Sean Burke
-<sburke@cpan.org> (but I've since hacked them beyond recognition and all bugs
-are mine).
+Written by Russ Allbery <rra@cpan.org>, based on the original B<pod2man> by
+Tom Christiansen <tchrist@mox.perl.com>.
+
+The modifications to work with Pod::Simple instead of Pod::Parser were
+contributed by Sean Burke <sburke@cpan.org>, but I've since hacked them beyond
+recognition and all bugs are mine.
 
 =head1 COPYRIGHT AND LICENSE
 
-Copyright 1999-2010, 2012-2019 Russ Allbery <rra@cpan.org>
+Copyright 1999-2010, 2012-2020, 2022 Russ Allbery <rra@cpan.org>
 
 Substantial contributions by Sean Burke <sburke@cpan.org>.
 
@@ -2022,18 +2373,19 @@ under the same terms as Perl itself.
 
 =head1 SEE ALSO
 
-L<Pod::Simple>, L<perlpod(1)>, L<pod2man(1)>, L<nroff(1)>, L<troff(1)>,
-L<man(1)>, L<man(7)>
+L<Encode::Supported>, L<Pod::Simple>, L<perlpod(1)>, L<pod2man(1)>,
+L<nroff(1)>, L<troff(1)>, L<man(1)>, L<man(7)>
 
 Ossanna, Joseph F., and Brian W. Kernighan.  "Troff User's Manual,"
 Computing Science Technical Report No. 54, AT&T Bell Laboratories.  This is
 the best documentation of standard B<nroff> and B<troff>.  At the time of
 this writing, it's available at L<http://www.troff.org/54.pdf>.
 
-The man page documenting the man macro set may be L<man(5)> instead of
-L<man(7)> on your system.  Also, please see L<pod2man(1)> for extensive
-documentation on writing manual pages if you've not done it before and
-aren't familiar with the conventions.
+The manual page documenting the man macro set may be L<man(5)> instead of
+L<man(7)> on your system.
+
+See L<perlpodstyle(1)> for documentation on writing manual pages in POD if
+you've not done it before and aren't familiar with the conventions.
 
 The current version of this module is always available from its web site at
 L<https://www.eyrie.org/~eagle/software/podlators/>.  It is also part of the
index 273c958..83bc3f7 100644 (file)
 
 package Pod::ParseLink;
 
-use 5.008;
+use 5.010;
 use strict;
 use warnings;
 
-use vars qw(@EXPORT @ISA $VERSION);
-
 use Exporter;
-@ISA    = qw(Exporter);
-@EXPORT = qw(parselink);
 
-$VERSION = '4.14';
+our @ISA = qw(Exporter);
+our @EXPORT = qw(parselink);
+our $VERSION = '5.01';
 
 ##############################################################################
 # Implementation
@@ -171,7 +169,7 @@ Russ Allbery <rra@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-Copyright 2001, 2008, 2009, 2014, 2018-2019 Russ Allbery <rra@cpan.org>
+Copyright 2001, 2008, 2009, 2014, 2018-2019, 2022 Russ Allbery <rra@cpan.org>
 
 This program is free software; you may redistribute it and/or modify it
 under the same terms as Perl itself.
index 56e6e78..83a7ce2 100644 (file)
 
 package Pod::Text;
 
-use 5.008;
+use 5.010;
 use strict;
 use warnings;
 
-use vars qw(@ISA @EXPORT %ESCAPES $VERSION);
-
 use Carp qw(carp croak);
 use Encode qw(encode);
 use Exporter ();
 use Pod::Simple ();
 
-@ISA = qw(Pod::Simple Exporter);
+our @ISA = qw(Pod::Simple Exporter);
+our $VERSION = '5.01';
 
 # We have to export pod2text for backward compatibility.
-@EXPORT = qw(pod2text);
-
-$VERSION = '4.14';
+our @EXPORT = qw(pod2text);
 
 # Ensure that $Pod::Simple::nbsp and $Pod::Simple::shy are available.  Code
 # taken from Pod::Simple 3.32, but was only added in 3.30.
@@ -43,6 +40,11 @@ if ($Pod::Simple::VERSION ge 3.30) {
     $SHY  = chr utf8::unicode_to_native(0xAD);
 }
 
+# Import the ASCII constant from Pod::Simple.  This is true iff we're in an
+# ASCII-based universe (including such things as ISO 8859-1 and UTF-8), and is
+# generally only false for EBCDIC.
+BEGIN { *ASCII = \&Pod::Simple::ASCII }
+
 ##############################################################################
 # Initialization
 ##############################################################################
@@ -64,9 +66,6 @@ sub new {
     my $class = shift;
     my $self = $class->SUPER::new;
 
-    # Tell Pod::Simple to handle S<> by automatically inserting &nbsp;.
-    $self->nbsp_for_S (1);
-
     # Tell Pod::Simple to keep whitespace whenever possible.
     if ($self->can ('preserve_whitespace')) {
         $self->preserve_whitespace (1);
@@ -89,16 +88,20 @@ sub new {
     my @opts = map { ("opt_$_", $opts{$_}) } keys %opts;
     %$self = (%$self, @opts);
 
-    # Send errors to stderr if requested.
+    # Backwards-compatibility support for the stderr option.
     if ($$self{opt_stderr} and not $$self{opt_errors}) {
         $$self{opt_errors} = 'stderr';
     }
     delete $$self{opt_stderr};
 
-    # Validate the errors parameter and act on it.
-    if (not defined $$self{opt_errors}) {
-        $$self{opt_errors} = 'pod';
+    # Backwards-compatibility support for the utf8 option.
+    if ($$self{opt_utf8} && !$$self{opt_encoding}) {
+        $$self{opt_encoding} = 'UTF-8';
     }
+    delete $$self{opt_utf8};
+
+    # Validate the errors parameter and act on it.
+    $$self{opt_errors} //= 'pod';
     if ($$self{opt_errors} eq 'stderr' || $$self{opt_errors} eq 'die') {
         $self->no_errata_section (1);
         $self->complain_stderr (1);
@@ -117,12 +120,12 @@ sub new {
     delete $$self{errors};
 
     # Initialize various things from our parameters.
-    $$self{opt_alt}      = 0  unless defined $$self{opt_alt};
-    $$self{opt_indent}   = 4  unless defined $$self{opt_indent};
-    $$self{opt_margin}   = 0  unless defined $$self{opt_margin};
-    $$self{opt_loose}    = 0  unless defined $$self{opt_loose};
-    $$self{opt_sentence} = 0  unless defined $$self{opt_sentence};
-    $$self{opt_width}    = 76 unless defined $$self{opt_width};
+    $$self{opt_alt}      //= 0;
+    $$self{opt_indent}   //= 4;
+    $$self{opt_margin}   //= 0;
+    $$self{opt_loose}    //= 0;
+    $$self{opt_sentence} //= 0;
+    $$self{opt_width}    //= 76;
 
     # Figure out what quotes we'll be using for C<> text.
     $$self{opt_quotes} ||= '"';
@@ -138,6 +141,17 @@ sub new {
         croak qq(Invalid quote specification "$$self{opt_quotes}");
     }
 
+    # Configure guesswork based on options.
+    my $guesswork = $self->{opt_guesswork} || q{};
+    my %guesswork = map { $_ => 1 } split(m{,}xms, $guesswork);
+    if (!%guesswork || $guesswork{all}) {
+        $$self{GUESSWORK} = {quoting => 1};
+    } elsif ($guesswork{none}) {
+        $$self{GUESSWORK} = {};
+    } else {
+        $$self{GUESSWORK} = {%guesswork};
+    }
+
     # If requested, do something with the non-POD text.
     $self->code_handler (\&handle_code) if $$self{opt_code};
 
@@ -272,9 +286,7 @@ sub reformat {
 }
 
 # Output text to the output device.  Replace non-breaking spaces with spaces
-# and soft hyphens with nothing, and then try to fix the output encoding if
-# necessary to match the input encoding unless UTF-8 output is forced.  This
-# preserves the traditional pass-through behavior of Pod::Text.
+# and soft hyphens with nothing, and then determine the output encoding.
 sub output {
     my ($self, @text) = @_;
     my $text = join ('', @text);
@@ -284,15 +296,39 @@ sub output {
     if ($SHY) {
         $text =~ s/$SHY//g;
     }
-    unless ($$self{opt_utf8}) {
-        my $encoding = $$self{encoding} || '';
-        if ($encoding && $encoding ne $$self{ENCODING}) {
-            $$self{ENCODING} = $encoding;
-            eval { binmode ($$self{output_fh}, ":encoding($encoding)") };
-        }
-    }
+
+    # The logic used here is described in the POD documentation.  Prefer the
+    # configured encoding, then the pass-through option of using the same
+    # encoding as the input, and then UTF-8, but commit to an encoding for the
+    # document.
+    #
+    # ENCODE says whether to encode or not and is turned off if there is a
+    # PerlIO encoding layer (in start_document).  ENCODING is the encoding
+    # that we previously committed to and is cleared at the start of each
+    # document.
     if ($$self{ENCODE}) {
-        print { $$self{output_fh} } encode ('UTF-8', $text);
+        my $encoding = $$self{ENCODING};
+        if (!$encoding) {
+            $encoding = $self->encoding();
+            if (!$encoding && ASCII && $text =~ /[^\x00-\x7F]/) {
+                $encoding = 'UTF-8';
+            }
+            if ($encoding) {
+                $$self{ENCODING} = $encoding;
+            }
+        }
+        if ($encoding) {
+            my $check = sub {
+                my ($char) = @_;
+                my $display = '"\x{' . hex($char) . '}"';
+                my $error = "$display does not map to $$self{ENCODING}";
+                $self->whine ($self->line_count(), $error);
+                return Encode::encode ($$self{ENCODING}, chr($char));
+            };
+            print { $$self{output_fh} } encode ($encoding, $text, $check);
+        } else {
+            print { $$self{output_fh} } $text;
+        }
     } else {
         print { $$self{output_fh} } $text;
     }
@@ -322,24 +358,18 @@ sub start_document {
     $$self{MARGIN}  = $margin;  # Default left margin.
     $$self{PENDING} = [[]];     # Pending output.
 
-    # We have to redo encoding handling for each document.
-    $$self{ENCODING} = '';
-
-    # When UTF-8 output is set, check whether our output file handle already
-    # has a PerlIO encoding layer set.  If it does not, we'll need to encode
-    # our output before printing it (handled in the output() sub).
-    $$self{ENCODE} = 0;
-    if ($$self{opt_utf8}) {
-        $$self{ENCODE} = 1;
-        eval {
-            my @options = (output => 1, details => 1);
-            my $flag = (PerlIO::get_layers ($$self{output_fh}, @options))[-1];
-            if ($flag && ($flag & PerlIO::F_UTF8 ())) {
-                $$self{ENCODE} = 0;
-                $$self{ENCODING} = 'UTF-8';
-            }
-        };
-    }
+    # We have to redo encoding handling for each document.  Check whether the
+    # output file handle already has a PerlIO encoding layer set and, if so,
+    # disable encoding.
+    $$self{ENCODE} = 1;
+    eval {
+        my @options = (output => 1, details => 1);
+        my $flag = (PerlIO::get_layers ($$self{output_fh}, @options))[-1];
+        if ($flag && ($flag & PerlIO::F_UTF8 ())) {
+            $$self{ENCODE} = 0;
+        }
+    };
+    $$self{ENCODING} = $$self{opt_encoding};
 
     return '';
 }
@@ -383,8 +413,7 @@ sub item {
 
     # Calculate the indentation and margin.  $fits is set to true if the tag
     # will fit into the margin of the paragraph given our indentation level.
-    my $indent = $$self{INDENTS}[-1];
-    $indent = $$self{opt_indent} unless defined $indent;
+    my $indent = $$self{INDENTS}[-1] // $$self{opt_indent};
     my $margin = ' ' x $$self{opt_margin};
     my $tag_length = length ($self->strip_format ($tag));
     my $fits = ($$self{MARGIN} - $indent >= $tag_length + 1);
@@ -588,6 +617,13 @@ sub cmd_f { return $_[0]{alt} ? "\"$_[2]\"" : $_[2] }
 sub cmd_i { return '*' . $_[2] . '*' }
 sub cmd_x { return '' }
 
+# Convert all internal whitespace to $NBSP.
+sub cmd_s {
+    my ($self, $attrs, $text) = @_;
+    $text =~ s{ \s }{$NBSP}xmsg;
+    return $text;
+}
+
 # Apply a whole bunch of messy heuristics to not quote things that don't
 # benefit from being quoted.  These originally come from Barrie Slaymaker and
 # largely duplicate code in Pod::Man.
@@ -597,23 +633,35 @@ sub cmd_c {
     # A regex that matches the portion of a variable reference that's the
     # array or hash index, separated out just because we want to use it in
     # several places in the following regex.
-    my $index = '(?: \[.*\] | \{.*\} )?';
+    my $index = '(?: \[[^]]+\] | \{[^}]+\} )?';
 
     # Check for things that we don't want to quote, and if we find any of
     # them, return the string with just a font change and no quoting.
+    #
+    # Traditionally, Pod::Text has not quoted Perl variables, functions,
+    # numbers, or hex constants, but this is not always desirable.  Make this
+    # optional on the quoting guesswork flag.
+    my $extra = qr{(?!)}xms;    # never matches
+    if ($$self{GUESSWORK}{quoting}) {
+        $extra = qr{
+             \$+ [\#^]? \S $index            # special ($^F, $")
+           | [\$\@%&*]+ \#? [:\'\w]+ $index  # plain var or func
+           | [\$\@%&*]* [:\'\w]+
+             (?: -> )? \(\s*[^\s,\)]*\s*\)   # 0/1-arg func call
+           | [+-]? ( \d[\d.]* | \.\d+ )
+             (?: [eE][+-]?\d+ )?             # a number
+           | 0x [a-fA-F\d]+                  # a hex constant
+         }xms;
+    }
     $text =~ m{
       ^\s*
       (?:
-         ( [\'\`\"] ) .* \1                             # already quoted
-       | \` .* \'                                       # `quoted'
-       | \$+ [\#^]? \S $index                           # special ($^Foo, $")
-       | [\$\@%&*]+ \#? [:\'\w]+ $index                 # plain var or func
-       | [\$\@%&*]* [:\'\w]+ (?: -> )? \(\s*[^\s,]\s*\) # 0/1-arg func call
-       | [+-]? ( \d[\d.]* | \.\d+ ) (?: [eE][+-]?\d+ )? # a number
-       | 0x [a-fA-F\d]+                                 # a hex constant
+         ( [\'\`\"] ) .* \1                  # already quoted
+       | \` .* \'                            # `quoted'
+       | $extra
       )
       \s*\z
-     }xo && return $text;
+     }xms and return $text;
 
     # If we didn't return, go ahead and quote the text.
     return $$self{opt_alt}
@@ -766,7 +814,7 @@ __END__
 
 =for stopwords
 alt stderr Allbery Sean Burke's Christiansen UTF-8 pre-Unicode utf8 nourls
-parsers
+parsers EBCDIC autodetecting superset unrepresentable FH NNN
 
 =head1 NAME
 
@@ -785,67 +833,180 @@ Pod::Text - Convert POD data to formatted text
 
 =head1 DESCRIPTION
 
-Pod::Text is a module that can convert documentation in the POD format
-(the preferred language for documenting Perl) into formatted text.  It
-uses no special formatting controls or codes whatsoever, and its output is
-therefore suitable for nearly any device.
+Pod::Text is a module that can convert documentation in the POD format (the
+preferred language for documenting Perl) into formatted text.  It uses no
+special formatting controls or codes, and its output is therefore suitable for
+nearly any device.
 
-As a derived class from Pod::Simple, Pod::Text supports the same methods and
-interfaces.  See L<Pod::Simple> for all the details; briefly, one creates a
-new parser with C<< Pod::Text->new() >> and then normally calls parse_file().
+=head2 Encoding
 
-new() can take options, in the form of key/value pairs, that control the
-behavior of the parser.  The currently recognized options are:
+Pod::Text uses the following logic to choose an output encoding, in order:
+
+=over 4
+
+=item 1.
+
+If a PerlIO encoding layer is set on the output file handle, do not do any
+output encoding and will instead rely on the PerlIO encoding layer.
+
+=item 2.
+
+If the C<encoding> or C<utf8> options are set, use the output encoding
+specified by those options.
+
+=item 3.
+
+If the input encoding of the POD source file was explicitly specified (using
+C<=encoding>) or automatically detected by Pod::Simple, use that as the output
+encoding as well.
+
+=item 4.
+
+Otherwise, if running on a non-EBCDIC system, use UTF-8 as the output
+encoding.  Since this is a superset of ASCII, this will result in ASCII output
+unless the POD input contains non-ASCII characters without declaring or
+autodetecting an encoding (usually via EZ<><> escapes).
+
+=item 5.
+
+Otherwise, for EBCDIC systems, output without doing any encoding and hope
+this works.
+
+=back
+
+One caveat: Pod::Text has to commit to an output encoding the first time it
+outputs a non-ASCII character, and then has to stick with it for consistency.
+However, C<=encoding> commands don't have to be at the beginning of a POD
+document.  If someone uses a non-ASCII character early in a document with an
+escape, such as EZ<><0xEF>, and then puts C<=encoding iso-8859-1> later,
+ideally Pod::Text would follow rule 3 and output the entire document as ISO
+8859-1.  Instead, it will commit to UTF-8 following rule 4 as soon as it sees
+that escape, and then stick with that encoding for the rest of the document.
+
+Unfortunately, there's no universally good choice for an output encoding.
+Each choice will be incorrect in some circumstances.  This approach was chosen
+primarily for backwards compatibility.  Callers should consider forcing the
+output encoding via C<encoding> if they have any knowledge about what encoding
+the user may expect.
+
+In particular, consider importing the L<Encode::Locale> module, if available,
+and setting C<encoding> to C<locale> to use an output encoding appropriate to
+the user's locale.  But be aware that if the user is not using locales or is
+using a locale of C<C>, Encode::Locale will set the output encoding to
+US-ASCII.  This will cause all non-ASCII characters will be replaced with C<?>
+and produce a flurry of warnings about unsupported characters, which may or
+may not be what you want.
+
+=head1 CLASS METHODS
+
+=over 4
+
+=item new(ARGS)
+
+Create a new Pod::Text object.  ARGS should be a list of key/value pairs,
+where the keys are chosen from the following.  Each option is annotated with
+the version of Pod::Text in which that option was added with its current
+meaning.
 
 =over 4
 
 =item alt
 
-If set to a true value, selects an alternate output format that, among other
-things, uses a different heading style and marks C<=item> entries with a
+[2.00] If set to a true value, selects an alternate output format that, among
+other things, uses a different heading style and marks C<=item> entries with a
 colon in the left margin.  Defaults to false.
 
 =item code
 
-If set to a true value, the non-POD parts of the input file will be included
-in the output.  Useful for viewing code documented with POD blocks with the
-POD rendered and the code left intact.
+[2.13] If set to a true value, the non-POD parts of the input file will be
+included in the output.  Useful for viewing code documented with POD blocks
+with the POD rendered and the code left intact.
+
+=item encoding
+
+[5.00] Specifies the encoding of the output.  The value must be an encoding
+recognized by the L<Encode> module (see L<Encode::Supported>).  If the output
+contains characters that cannot be represented in this encoding, that is an
+error that will be reported as configured by the C<errors> option.  If error
+handling is other than C<die>, the unrepresentable character will be replaced
+with the Encode substitution character (normally C<?>).
+
+If the output file handle has a PerlIO encoding layer set, this parameter will
+be ignored and no encoding will be done by Pod::Man.  It will instead rely on
+the encoding layer to make whatever output encoding transformations are
+desired.
+
+WARNING: The input encoding of the POD source is independent from the output
+encoding, and setting this option does not affect the interpretation of the
+POD input.  Unless your POD source is US-ASCII, its encoding should be
+declared with the C<=encoding> command in the source, as near to the top of
+the file as possible.  If this is not done, Pod::Simple will will attempt to
+guess the encoding and may be successful if it's Latin-1 or UTF-8, but it will
+produce warnings.  See L<perlpod(1)> for more information.
 
 =item errors
 
-How to report errors.  C<die> says to throw an exception on any POD
-formatting error.  C<stderr> says to report errors on standard error, but
-not to throw an exception.  C<pod> says to include a POD ERRORS section
-in the resulting documentation summarizing the errors.  C<none> ignores
-POD errors entirely, as much as possible.
+[3.17] How to report errors.  C<die> says to throw an exception on any POD
+formatting error.  C<stderr> says to report errors on standard error, but not
+to throw an exception.  C<pod> says to include a POD ERRORS section in the
+resulting documentation summarizing the errors.  C<none> ignores POD errors
+entirely, as much as possible.
 
 The default is C<pod>.
 
+=item guesswork
+
+[5.01] By default, Pod::Text applies some default formatting rules based on
+guesswork and regular expressions that are intended to make writing Perl
+documentation easier and require less explicit markup.  These rules may not
+always be appropriate, particularly for documentation that isn't about Perl.
+This option allows turning all or some of it off.
+
+The special value C<all> enables all guesswork.  This is also the default for
+backward compatibility reasons.  The special value C<none> disables all
+guesswork.  Otherwise, the value of this option should be a comma-separated
+list of one or more of the following keywords:
+
+=over 4
+
+=item quoting
+
+If no guesswork is enabled, any text enclosed in CZ<><> is surrounded by
+double quotes in nroff (terminal) output unless the contents are already
+quoted.  When this guesswork is enabled, quote marks will also be suppressed
+for Perl variables, function names, function calls, numbers, and hex
+constants.
+
+=back
+
+Any unknown guesswork name is silently ignored (for potential future
+compatibility), so be careful about spelling.
+
 =item indent
 
-The number of spaces to indent regular text, and the default indentation for
-C<=over> blocks.  Defaults to 4.
+[2.00] The number of spaces to indent regular text, and the default
+indentation for C<=over> blocks.  Defaults to 4.
 
 =item loose
 
-If set to a true value, a blank line is printed after a C<=head1> heading.
-If set to false (the default), no blank line is printed after C<=head1>,
-although one is still printed after C<=head2>.  This is the default because
-it's the expected formatting for manual pages; if you're formatting
+[2.00] If set to a true value, a blank line is printed after a C<=head1>
+heading.  If set to false (the default), no blank line is printed after
+C<=head1>, although one is still printed after C<=head2>.  This is the default
+because it's the expected formatting for manual pages; if you're formatting
 arbitrary text documents, setting this to true may result in more pleasing
 output.
 
 =item margin
 
-The width of the left margin in spaces.  Defaults to 0.  This is the margin
-for all text, including headings, not the amount by which regular text is
-indented; for the latter, see the I<indent> option.  To set the right
+[2.21] The width of the left margin in spaces.  Defaults to 0.  This is the
+margin for all text, including headings, not the amount by which regular text
+is indented; for the latter, see the I<indent> option.  To set the right
 margin, see the I<width> option.
 
 =item nourls
 
-Normally, LZ<><> formatting codes with a URL but anchor text are formatted
-to show both the anchor text and the URL.  In other words:
+[3.17] Normally, LZ<><> formatting codes with a URL but anchor text are
+formatted to show both the anchor text and the URL.  In other words:
 
     L<foo|http://example.com/>
 
@@ -853,74 +1014,131 @@ is formatted as:
 
     foo <http://example.com/>
 
-This option, if set to a true value, suppresses the URL when anchor text
-is given, so this example would be formatted as just C<foo>.  This can
-produce less cluttered output in cases where the URLs are not particularly
-important.
+This option, if set to a true value, suppresses the URL when anchor text is
+given, so this example would be formatted as just C<foo>.  This can produce
+less cluttered output in cases where the URLs are not particularly important.
 
 =item quotes
 
-Sets the quote marks used to surround CE<lt>> text.  If the value is a
-single character, it is used as both the left and right quote.  Otherwise,
-it is split in half, and the first half of the string is used as the left
-quote and the second is used as the right quote.
+[4.00] Sets the quote marks used to surround CE<lt>> text.  If the value is a
+single character, it is used as both the left and right quote.  Otherwise, it
+is split in half, and the first half of the string is used as the left quote
+and the second is used as the right quote.
 
 This may also be set to the special value C<none>, in which case no quote
 marks are added around CE<lt>> text.
 
 =item sentence
 
-If set to a true value, Pod::Text will assume that each sentence ends in two
-spaces, and will try to preserve that spacing.  If set to false, all
-consecutive whitespace in non-verbatim paragraphs is compressed into a
-single space.  Defaults to false.
+[3.00] If set to a true value, Pod::Text will assume that each sentence ends
+in two spaces, and will try to preserve that spacing.  If set to false, all
+consecutive whitespace in non-verbatim paragraphs is compressed into a single
+space.  Defaults to false.
 
 =item stderr
 
-Send error messages about invalid POD to standard error instead of
-appending a POD ERRORS section to the generated output.  This is
-equivalent to setting C<errors> to C<stderr> if C<errors> is not already
-set.  It is supported for backward compatibility.
+[3.10] Send error messages about invalid POD to standard error instead of
+appending a POD ERRORS section to the generated output.  This is equivalent to
+setting C<errors> to C<stderr> if C<errors> is not already set.  It is
+supported for backward compatibility.
 
 =item utf8
 
-By default, Pod::Text uses the same output encoding as the input encoding
-of the POD source (provided that Perl was built with PerlIO; otherwise, it
-doesn't encode its output).  If this option is given, the output encoding
-is forced to UTF-8.
-
-Be aware that, when using this option, the input encoding of your POD
-source should be properly declared unless it's US-ASCII.  Pod::Simple will
-attempt to guess the encoding and may be successful if it's Latin-1 or
-UTF-8, but it will produce warnings.  Use the C<=encoding> command to
-declare the encoding.  See L<perlpod(1)> for more information.
+[3.12] If this option is set to a true value, the output encoding is set to
+UTF-8.  This is equivalent to setting C<encoding> to C<UTF-8> if C<encoding>
+is not already set.  It is supported for backward compatibility.
 
 =item width
 
-The column at which to wrap text on the right-hand side.  Defaults to 76.
+[2.00] The column at which to wrap text on the right-hand side.  Defaults to
+76.
+
+=back
+
+=back
+
+=head1 INSTANCE METHODS
+
+As a derived class from Pod::Simple, Pod::Text supports the same methods and
+interfaces.  See L<Pod::Simple> for all the details.  This section summarizes
+the most-frequently-used methods and the ones added by Pod::Text.
+
+=over 4
+
+=item output_fh(FH)
+
+Direct the output from parse_file(), parse_lines(), or parse_string_document()
+to the file handle FH instead of C<STDOUT>.
+
+=item output_string(REF)
+
+Direct the output from parse_file(), parse_lines(), or parse_string_document()
+to the scalar variable pointed to by REF, rather than C<STDOUT>.  For example:
+
+    my $man = Pod::Man->new();
+    my $output;
+    $man->output_string(\$output);
+    $man->parse_file('/some/input/file');
+
+Be aware that the output in that variable will already be encoded (see
+L</Encoding>).
+
+=item parse_file(PATH)
+
+Read the POD source from PATH and format it.  By default, the output is sent
+to C<STDOUT>, but this can be changed with the output_fh() or output_string()
+methods.
+
+=item parse_from_file(INPUT, OUTPUT)
+
+=item parse_from_filehandle(FH, OUTPUT)
+
+Read the POD source from INPUT, format it, and output the results to OUTPUT.
+
+parse_from_filehandle() is provided for backward compatibility with older
+versions of Pod::Man.  parse_from_file() should be used instead.
+
+=item parse_lines(LINES[, ...[, undef]])
+
+Parse the provided lines as POD source, writing the output to either C<STDOUT>
+or the file handle set with the output_fh() or output_string() methods.  This
+method can be called repeatedly to provide more input lines.  An explicit
+C<undef> should be passed to indicate the end of input.
+
+This method expects raw bytes, not decoded characters.
+
+=item parse_string_document(INPUT)
+
+Parse the provided scalar variable as POD source, writing the output to either
+C<STDOUT> or the file handle set with the output_fh() or output_string()
+methods.
+
+This method expects raw bytes, not decoded characters.
 
 =back
 
-The standard Pod::Simple method parse_file() takes one argument naming the
-POD file to read from.  By default, the output is sent to C<STDOUT>, but
-this can be changed with the output_fh() method.
+=head1 FUNCTIONS
 
-The standard Pod::Simple method parse_from_file() takes up to two
-arguments, the first being the input file to read POD from and the second
-being the file to write the formatted output to.
+Pod::Text exports one function for backward compatibility with older versions.
+This function is deprecated; instead, use the object-oriented interface
+described above.
 
-You can also call parse_lines() to parse an array of lines or
-parse_string_document() to parse a document already in memory.  As with
-parse_file(), parse_lines() and parse_string_document() default to sending
-their output to C<STDOUT> unless changed with the output_fh() method.  Be
-aware that parse_lines() and parse_string_document() both expect raw bytes,
-not decoded characters.
+=over 4
+
+=item pod2text([[-a,] [-NNN,]] INPUT[, OUTPUT])
+
+Convert the POD source from INPUT to text and write it to OUTPUT.  If OUTPUT
+is not given, defaults to C<STDOUT>.  INPUT can be any expression supported as
+the second argument to two-argument open().
 
-To put the output from any parse method into a string instead of a file
-handle, call the output_string() method instead of output_fh().
+If C<-a> is given as an initial argument, pass the C<alt> option to the
+Pod::Text constructor.  This enables alternative formatting.
 
-See L<Pod::Simple> for more specific details on the methods available to
-all derived parsers.
+If C<-NNN> is given as an initial argument, pass the C<width> option to the
+Pod::Text constructor with the number C<NNN> as its argument.  This sets the
+wrap line width to NNN.
+
+=back
 
 =head1 DIAGNOSTICS
 
@@ -955,61 +1173,66 @@ option was set to C<die>.
 
 =back
 
-=head1 BUGS
+=head1 COMPATIBILITY
 
-Encoding handling assumes that PerlIO is available and does not work
-properly if it isn't.  The C<utf8> option is therefore not supported
-unless Perl is built with PerlIO support.
+Pod::Text 2.03 (based on L<Pod::Parser>) was the first version of this module
+included with Perl, in Perl 5.6.0.  Earlier versions of Perl had a different
+Pod::Text module, with a different API.
 
-=head1 CAVEATS
+The current API based on L<Pod::Simple> was added in Pod::Text 3.00.
+Pod::Text 3.01 was included in Perl 5.9.3, the first version of Perl to
+incorporate those changes.  This is the first version that correctly supports
+all modern POD syntax.  The parse_from_filehandle() method was re-added for
+backward compatibility in Pod::Text 3.07, included in Perl 5.9.4.
 
-If Pod::Text is given the C<utf8> option, the encoding of its output file
-handle will be forced to UTF-8 if possible, overriding any existing
-encoding.  This will be done even if the file handle is not created by
-Pod::Text and was passed in from outside.  This maintains consistency
-regardless of PERL_UNICODE and other settings.
+Pod::Text 3.12, included in Perl 5.10.1, first implemented the current
+practice of attempting to match the default output encoding with the input
+encoding of the POD source, unless overridden by the C<utf8> option or (added
+later) the C<encoding> option.
 
-If the C<utf8> option is not given, the encoding of its output file handle
-will be forced to the detected encoding of the input POD, which preserves
-whatever the input text is.  This ensures backward compatibility with
-earlier, pre-Unicode versions of this module, without large numbers of
-Perl warnings.
+Support for anchor text in LZ<><> links of type URL was added in Pod::Text
+3.14, included in Perl 5.11.5.
 
-This is not ideal, but it seems to be the best compromise.  If it doesn't
-work for you, please let me know the details of how it broke.
+parse_lines(), parse_string_document(), and parse_file() set a default output
+file handle of C<STDOUT> if one was not already set as of Pod::Text 3.18,
+included in Perl 5.19.5.
 
-=head1 NOTES
+Pod::Text 4.00, included in Perl 5.23.7, aligned the module version and the
+version of the podlators distribution.  All modules included in podlators, and
+the podlators distribution itself, share the same version number from this
+point forward.
 
-This is a replacement for an earlier Pod::Text module written by Tom
-Christiansen.  It has a revamped interface, since it now uses Pod::Simple,
-but an interface roughly compatible with the old Pod::Text::pod2text()
-function is still available.  Please change to the new calling convention,
-though.
+Pod::Text 4.09, included in Perl 5.25.7, fixed a serious bug on EBCDIC
+systems, present in all versions back to 3.00, that would cause opening
+brackets to disappear.
 
-The original Pod::Text contained code to do formatting via termcap
-sequences, although it wasn't turned on by default and it was problematic to
-get it to work at all.  This rewrite doesn't even try to do that, but a
-subclass of it does.  Look for L<Pod::Text::Termcap>.
+Pod::Text 5.00 now defaults, on non-EBCDIC systems, to UTF-8 encoding if it
+sees a non-ASCII character in the input and the input encoding is not
+specified.  It also commits to an encoding with the first non-ASCII character
+and does not change the output encoding if the input encoding changes.  The
+L<Encode> module is now used for all output encoding rather than PerlIO
+layers, which fixes earlier problems with output to scalars.
 
 =head1 AUTHOR
 
-Russ Allbery <rra@cpan.org>, based I<very> heavily on the original
-Pod::Text by Tom Christiansen <tchrist@mox.perl.com> and its conversion to
-Pod::Parser by Brad Appleton <bradapp@enteract.com>.  Sean Burke's initial
-conversion of Pod::Man to use Pod::Simple provided much-needed guidance on
-how to use Pod::Simple.
+Russ Allbery <rra@cpan.org>, based I<very> heavily on the original Pod::Text
+by Tom Christiansen <tchrist@mox.perl.com> and its conversion to Pod::Parser
+by Brad Appleton <bradapp@enteract.com>.  Sean Burke's initial conversion of
+Pod::Man to use Pod::Simple provided much-needed guidance on how to use
+Pod::Simple.
 
 =head1 COPYRIGHT AND LICENSE
 
-Copyright 1999-2002, 2004, 2006, 2008-2009, 2012-2016, 2018-2019 Russ Allbery
-<rra@cpan.org>
+Copyright 1999-2002, 2004, 2006, 2008-2009, 2012-2016, 2018-2019, 2022 Russ
+Allbery <rra@cpan.org>
 
 This program is free software; you may redistribute it and/or modify it
 under the same terms as Perl itself.
 
 =head1 SEE ALSO
 
-L<Pod::Simple>, L<Pod::Text::Termcap>, L<perlpod(1)>, L<pod2text(1)>
+L<Encode::Locale>, L<Encode::Supproted>, L<Pod::Simple>,
+L<Pod::Text::Termcap>, L<perlpod(1)>, L<pod2text(1)>
 
 The current version of this module is always available from its web site at
 L<https://www.eyrie.org/~eagle/software/podlators/>.  It is also part of the
index 5d47c5e..2d656d6 100644 (file)
 
 package Pod::Text::Color;
 
-use 5.008;
+use 5.010;
 use strict;
 use warnings;
 
 use Pod::Text ();
 use Term::ANSIColor qw(color colored);
 
-use vars qw(@ISA $VERSION);
-
-@ISA = qw(Pod::Text);
-
-$VERSION = '4.14';
+our @ISA = qw(Pod::Text);
+our $VERSION = '5.01';
 
 ##############################################################################
 # Overrides
@@ -170,11 +167,22 @@ options.
 Term::ANSIColor is used to get colors and therefore must be installed to use
 this module.
 
-=head1 BUGS
+=head1 COMPATIBILITY
+
+Pod::Text::Color 0.05 (based on L<Pod::Parser>) was the first version of this
+module included with Perl, in Perl 5.6.0.
+
+The current API based on L<Pod::Simple> was added in Pod::Text::Color 2.00.
+Pod::Text::Color 2.01 was included in Perl 5.9.3, the first version of Perl to
+incorporate those changes.
+
+Several problems with wrapping and line length were fixed as recently as
+Pod::Text::Color 4.11, included in Perl 5.29.1.
 
-This is just a basic proof of concept.  It should be seriously expanded to
-support configurable coloration via options passed to the constructor, and
-B<pod2text> should be taught about those.
+This module inherits its API and most behavior from Pod::Text, so the details
+in L<Pod::Text/COMPATIBILITY> also apply.  Pod::Text and Pod::Text::Color have
+had the same module version since 4.00, included in Perl 5.23.7.  (They
+unfortunately diverge in confusing ways prior to that.)
 
 =head1 AUTHOR
 
@@ -182,7 +190,7 @@ Russ Allbery <rra@cpan.org>.
 
 =head1 COPYRIGHT AND LICENSE
 
-Copyright 1999, 2001, 2004, 2006, 2008, 2009, 2018-2019 Russ Allbery
+Copyright 1999, 2001, 2004, 2006, 2008, 2009, 2018-2019, 2022 Russ Allbery
 <rra@cpan.org>
 
 This program is free software; you may redistribute it and/or modify it
index 53bc6af..3135c88 100644 (file)
 
 package Pod::Text::Overstrike;
 
-use 5.008;
+use 5.010;
 use strict;
 use warnings;
 
-use vars qw(@ISA $VERSION);
-
 use Pod::Text ();
 
-@ISA = qw(Pod::Text);
-
-$VERSION = '4.14';
+our @ISA = qw(Pod::Text);
+our $VERSION = '5.01';
 
 ##############################################################################
 # Overrides
@@ -176,6 +173,22 @@ Currently, the outermost formatting instruction wins, so for example
 underlined text inside a region of bold text is displayed as simply bold.
 There may be some better approach possible.
 
+=head1 COMPATIBILITY
+
+Pod::Text::Overstrike 1.01 (based on L<Pod::Parser>) was the first version of
+this module included with Perl, in Perl 5.6.1.
+
+The current API based on L<Pod::Simple> was added in Pod::Text::Overstrike
+2.00, included in Perl 5.9.3.
+
+Several problems with wrapping and line length were fixed as recently as
+Pod::Text::Overstrike 2.04, included in Perl 5.11.5.
+
+This module inherits its API and most behavior from Pod::Text, so the details
+in L<Pod::Text/COMPATIBILITY> also apply.  Pod::Text and Pod::Text::Overstrike
+have had the same module version since 4.00, included in Perl 5.23.7.  (They
+unfortunately diverge in confusing ways prior to that.)
+
 =head1 AUTHOR
 
 Originally written by Joe Smith <Joe.Smith@inwap.com>, using the framework
@@ -185,7 +198,7 @@ created by Russ Allbery <rra@cpan.org>.  Subsequently updated by Russ Allbery.
 
 Copyright 2000 by Joe Smith <Joe.Smith@inwap.com>
 
-Copyright 2001, 2004, 2008, 2014, 2018-2019 by Russ Allbery <rra@cpan.org>
+Copyright 2001, 2004, 2008, 2014, 2018-2019, 2022 by Russ Allbery <rra@cpan.org>
 
 This program is free software; you may redistribute it and/or modify it
 under the same terms as Perl itself.
index be218f0..d4b7487 100644 (file)
@@ -12,7 +12,7 @@
 
 package Pod::Text::Termcap;
 
-use 5.008;
+use 5.010;
 use strict;
 use warnings;
 
@@ -20,11 +20,8 @@ use Pod::Text ();
 use POSIX ();
 use Term::Cap;
 
-use vars qw(@ISA $VERSION);
-
-@ISA = qw(Pod::Text);
-
-$VERSION = '4.14';
+our @ISA = qw(Pod::Text);
+our $VERSION = '5.01';
 
 ##############################################################################
 # Overrides
@@ -204,13 +201,13 @@ sub wrap {
 1;
 __END__
 
+=for stopwords
+ECMA-48 VT100 Allbery Solaris TERMPATH unformatted
+
 =head1 NAME
 
 Pod::Text::Termcap - Convert POD data to ASCII text with format escapes
 
-=for stopwords
-ECMA-48 VT100 Allbery Solaris TERMPATH
-
 =head1 SYNOPSIS
 
     use Pod::Text::Termcap;
@@ -235,14 +232,37 @@ and how to override that behavior if necessary.  If unable to find control
 strings for bold and underscore formatting, that formatting is skipped,
 resulting in the same output as Pod::Text.
 
+=head1 COMPATIBILITY
+
+Pod::Text::Termcap 0.04 (based on L<Pod::Parser>) was the first version of
+this module included with Perl, in Perl 5.6.0.
+
+The current API based on L<Pod::Simple> was added in Pod::Text::Termcap 2.00.
+Pod::Text::Termcap 2.01 was included in Perl 5.9.3, the first version of Perl
+to incorporate those changes.
+
+Several problems with wrapping and line length were fixed as recently as
+Pod::Text::Termcap 4.11, included in Perl 5.29.1.
+
+Pod::Text::Termcap 4.13 stopped setting the TERMPATH environment variable
+during module load.  It also stopped falling back on VT100 escape sequences if
+Term::Cap was not able to find usable escape sequences, instead producing
+unformatted output for better results on dumb terminals.  The next version to
+be incorporated into Perl, 4.14, was included in Perl 5.31.8.
+
+This module inherits its API and most behavior from Pod::Text, so the details
+in L<Pod::Text/COMPATIBILITY> also apply.  Pod::Text and Pod::Text::Termcap
+have had the same module version since 4.00, included in Perl 5.23.7.  (They
+unfortunately diverge in confusing ways prior to that.)
+
 =head1 AUTHOR
 
 Russ Allbery <rra@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-Copyright 1999, 2001-2002, 2004, 2006, 2008-2009, 2014-2015, 2018-2019 Russ
-Allbery <rra@cpan.org>
+Copyright 1999, 2001-2002, 2004, 2006, 2008-2009, 2014-2015, 2018-2019, 2022
+Russ Allbery <rra@cpan.org>
 
 This program is free software; you may redistribute it and/or modify it
 under the same terms as Perl itself.
index abaa108..ba3de23 100644 (file)
@@ -38,7 +38,7 @@ print "Extracting $file (with variable substitutions)\n";
 print {$out} <<"PREAMBLE" or die "Cannot write to $file: $!\n";
 $Config{startperl}
     eval 'exec $Config{perlpath} -S \$0 \${1+"\$@"}'
-        if \$running_under_some_shell;
+        if 0; # ^ Run only under a shell
 PREAMBLE
 
 # In the following, Perl variables are not expanded during extraction.
@@ -71,13 +71,12 @@ my $stdin;
 # Parse our options, trying to retain backward compatibility with pod2man but
 # allowing short forms as well.  --lax is currently ignored.
 my %options;
-$options{utf8} = 1;
 Getopt::Long::config ('bundling_override');
-GetOptions (\%options, 'center|c=s', 'date|d=s', 'errors=s', 'fixed=s',
-            'fixedbold=s', 'fixeditalic=s', 'fixedbolditalic=s', 'help|h',
-            'lax|l', 'lquote=s', 'name|n=s', 'nourls', 'official|o',
-            'quotes|q=s', 'release|r=s', 'rquote=s', 'section|s=s', 'stderr',
-            'verbose|v', 'utf8|u!')
+GetOptions (\%options, 'center|c=s', 'date|d=s', 'encoding|e=s', 'errors=s',
+            'fixed=s', 'fixedbold=s', 'fixeditalic=s', 'fixedbolditalic=s',
+            'guesswork=s', 'help|h', 'lax|l', 'language=s', 'lquote=s',
+            'name|n=s', 'nourls', 'official|o', 'quotes|q=s', 'release|r=s',
+            'rquote=s', 'section|s=s', 'stderr', 'verbose|v', 'utf8|u')
     or exit 1;
 pod2usage (0) if $options{help};
 
@@ -127,9 +126,9 @@ exit $status;
 __END__
 
 =for stopwords
-en em --stderr stderr --no-utf8 UTF-8 overdo markup MT-LEVEL Allbery Solaris URL
+en em --stderr stderr --utf8 UTF-8 overdo markup MT-LEVEL Allbery Solaris URL
 troff troff-specific formatters uppercased Christiansen --nourls UTC prepend
-lquote rquote
+lquote rquote unrepresentable mandoc manref EBCDIC
 
 =head1 NAME
 
@@ -137,118 +136,221 @@ pod2man - Convert POD data to formatted *roff input
 
 =head1 SYNOPSIS
 
-pod2man [B<--center>=I<string>] [B<--date>=I<string>] [B<--errors>=I<style>]
-    [B<--fixed>=I<font>] [B<--fixedbold>=I<font>] [B<--fixeditalic>=I<font>]
-    [B<--fixedbolditalic>=I<font>] [B<--name>=I<name>] [B<--nourls>]
-    [B<--official>] [B<--release>=I<version>] [B<--section>=I<manext>]
+pod2man [B<--center>=I<string>] [B<--date>=I<string>]
+    [B<--encoding>=I<encoding>] [B<--errors>=I<style>] [B<--fixed>=I<font>]
+    [B<--fixedbold>=I<font>] [B<--fixeditalic>=I<font>]
+    [B<--fixedbolditalic>=I<font>] [B<--guesswork>=I<rule>[,I<rule>...]]
+    [B<--name>=I<name>] [B<--nourls>] [B<--official>]
+    [B<--release>=I<version>] [B<--section>=I<manext>]
     [B<--quotes>=I<quotes>] [B<--lquote>=I<quote>] [B<--rquote>=I<quote>]
-    [B<--stderr>] [B<--no-utf8>] [B<--verbose>] [I<input> [I<output>] ...]
+    [B<--stderr>] [B<--utf8>] [B<--verbose>] [I<input> [I<output>] ...]
 
 pod2man B<--help>
 
 =head1 DESCRIPTION
 
-B<pod2man> is a front-end for Pod::Man, using it to generate *roff input
-from POD source.  The resulting *roff code is suitable for display on a
-terminal using nroff(1), normally via man(1), or printing using troff(1).
-
-I<input> is the file to read for POD source (the POD can be embedded in
-code).  If I<input> isn't given, it defaults to C<STDIN>.  I<output>, if
-given, is the file to which to write the formatted output.  If I<output>
-isn't given, the formatted output is written to C<STDOUT>.  Several POD
-files can be processed in the same B<pod2man> invocation (saving module
-load and compile times) by providing multiple pairs of I<input> and
-I<output> files on the command line.
-
-B<--section>, B<--release>, B<--center>, B<--date>, and B<--official> can
-be used to set the headers and footers to use; if not given, Pod::Man will
-assume various defaults.  See below or L<Pod::Man> for details.
-
-B<pod2man> assumes that your *roff formatters have a fixed-width font
-named C<CW>.  If yours is called something else (like C<CR>), use
-B<--fixed> to specify it.  This generally only matters for troff output
-for printing.  Similarly, you can set the fonts used for bold, italic, and
-bold italic fixed-width output.
-
-Besides the obvious pod conversions, Pod::Man, and therefore pod2man also
-takes care of formatting func(), func(n), and simple variable references
-like $foo or @bar so you don't have to use code escapes for them; complex
-expressions like C<$fred{'stuff'}> will still need to be escaped, though.
-It also translates dashes that aren't used as hyphens into en dashes, makes
-long dashes--like this--into proper em dashes, fixes "paired quotes," and
-takes care of several other troff-specific tweaks.  See L<Pod::Man> for
-complete information.
+B<pod2man> is a wrapper script around the L<Pod::Man> module, using it to
+generate *roff input from POD source.  The resulting *roff code is suitable
+for display on a terminal using L<nroff(1)>, normally via L<man(1)>, or
+printing using L<troff(1)>.
+
+By default (on non-EBCDIC systems), B<pod2man> outputs UTF-8 manual pages.
+Its output should work with the B<man> program on systems that use B<groff>
+(most Linux distributions) or B<mandoc> (most BSD variants), but may result in
+mangled output on older UNIX systems.  To choose a different, possibly more
+backward-compatible output mangling on such systems, use C<--encoding=roff>
+(the default in earlier Pod::Man versions).  See the B<--encoding> option and
+L<Pod::Man/ENCODING> for more details.
+
+I<input> is the file to read for POD source (the POD can be embedded in code).
+If I<input> isn't given, it defaults to C<STDIN>.  I<output>, if given, is the
+file to which to write the formatted output.  If I<output> isn't given, the
+formatted output is written to C<STDOUT>.  Several POD files can be processed
+in the same B<pod2man> invocation (saving module load and compile times) by
+providing multiple pairs of I<input> and I<output> files on the command line.
+
+B<--section>, B<--release>, B<--center>, B<--date>, and B<--official> can be
+used to set the headers and footers to use.  If not given, Pod::Man will
+assume various defaults.  See below for details.
 
 =head1 OPTIONS
 
+Each option is annotated with the version of podlators in which that option
+was added with its current meaning.
+
 =over 4
 
 =item B<-c> I<string>, B<--center>=I<string>
 
-Sets the centered page header for the C<.TH> macro to I<string>.  The
-default is "User Contributed Perl Documentation", but also see
-B<--official> below.
+[1.00] Sets the centered page header for the C<.TH> macro to I<string>.  The
+default is C<User Contributed Perl Documentation>, but also see B<--official>
+below.
 
 =item B<-d> I<string>, B<--date>=I<string>
 
-Set the left-hand footer string for the C<.TH> macro to I<string>.  By
-default, the modification date of the input file will be used, or the
-current date if input comes from C<STDIN>, and will be based on UTC (so
-that the output will be reproducible regardless of local time zone).
+[4.00] Set the left-hand footer string for the C<.TH> macro to I<string>.  By
+default, the first of POD_MAN_DATE, SOURCE_DATE_EPOCH, the modification date
+of the input file, or the current date (if input comes from C<STDIN>) will be
+used, and the date will be in UTC.  See L<Pod::Man/CLASS METHODS> for more
+details.
+
+=item B<-e> I<encoding>, B<--encoding>=I<encoding>
+
+[5.00] Specifies the encoding of the output.  I<encoding> must be an encoding
+recognized by the L<Encode> module (see L<Encode::Supported>).  The default on
+non-EBCDIC systems is UTF-8.
+
+If the output contains characters that cannot be represented in this encoding,
+that is an error that will be reported as configured by the B<--errors>
+option.  If error handling is other than C<die>, the unrepresentable character
+will be replaced with the Encode substitution character (normally C<?>).
+
+If the C<encoding> option is set to the special value C<groff> (the default on
+EBCDIC systems), or if the Encode module is not available and the encoding is
+set to anything other than C<roff> (see below), Pod::Man will translate all
+non-ASCII characters to C<\[uNNNN]> Unicode escapes.  These are not
+traditionally part of the *roff language, but are supported by B<groff> and
+B<mandoc> and thus by the majority of manual page processors in use today.
+
+If I<encoding> is set to the special value C<roff>, B<pod2man> will do its
+historic transformation of (some) ISO 8859-1 characters into *roff escapes
+that may be adequate in troff and may be readable (if ugly) in nroff.  This
+was the default behavior of versions of B<pod2man> before 5.00.  With this
+encoding, all other non-ASCII characters will be replaced with C<X>.  It may
+be required for very old troff and nroff implementations that do not support
+UTF-8, but its representation of any non-ASCII character is very poor and
+often specific to European languages.  Its use is discouraged.
+
+WARNING: The input encoding of the POD source is independent from the output
+encoding, and setting this option does not affect the interpretation of the
+POD input.  Unless your POD source is US-ASCII, its encoding should be
+declared with the C<=encoding> command in the source.  If this is not done,
+Pod::Simple will will attempt to guess the encoding and may be successful if
+it's Latin-1 or UTF-8, but it will produce warnings.  See L<perlpod(1)> for
+more information.
 
 =item B<--errors>=I<style>
 
-Set the error handling style.  C<die> says to throw an exception on any
-POD formatting error.  C<stderr> says to report errors on standard error,
-but not to throw an exception.  C<pod> says to include a POD ERRORS
-section in the resulting documentation summarizing the errors.  C<none>
-ignores POD errors entirely, as much as possible.
+[2.5.0] Set the error handling style.  C<die> says to throw an exception on
+any POD formatting error.  C<stderr> says to report errors on standard error,
+but not to throw an exception.  C<pod> says to include a POD ERRORS section in
+the resulting documentation summarizing the errors.  C<none> ignores POD
+errors entirely, as much as possible.
 
 The default is C<die>.
 
 =item B<--fixed>=I<font>
 
-The fixed-width font to use for verbatim text and code.  Defaults to
-C<CW>.  Some systems may want C<CR> instead.  Only matters for troff(1)
+[1.0] The fixed-width font to use for verbatim text and code.  Defaults to
+C<CW>.  Some systems may want C<CR> instead.  Only matters for B<troff>
 output.
 
 =item B<--fixedbold>=I<font>
 
-Bold version of the fixed-width font.  Defaults to C<CB>.  Only matters
-for troff(1) output.
+[1.0] Bold version of the fixed-width font.  Defaults to C<CB>.  Only matters
+for B<troff> output.
 
 =item B<--fixeditalic>=I<font>
 
-Italic version of the fixed-width font (actually, something of a misnomer,
-since most fixed-width fonts only have an oblique version, not an italic
-version).  Defaults to C<CI>.  Only matters for troff(1) output.
+[1.0] Italic version of the fixed-width font (something of a misnomer, since
+most fixed-width fonts only have an oblique version, not an italic version).
+Defaults to C<CI>.  Only matters for B<troff> output.
 
 =item B<--fixedbolditalic>=I<font>
 
-Bold italic (probably actually oblique) version of the fixed-width font.
-Pod::Man doesn't assume you have this, and defaults to C<CB>.  Some
-systems (such as Solaris) have this font available as C<CX>.  Only matters
-for troff(1) output.
+[1.0] Bold italic (in theory, probably oblique in practice) version of the
+fixed-width font.  Pod::Man doesn't assume you have this, and defaults to
+C<CB>.  Some systems (such as Solaris) have this font available as C<CX>.
+Only matters for B<troff> output.
+
+=item B<--guesswork>=I<rule>[,I<rule>...]
+
+[5.00] By default, B<pod2man> applies some default formatting rules based on
+guesswork and regular expressions that are intended to make writing Perl
+documentation easier and require less explicit markup.  These rules may not
+always be appropriate, particularly for documentation that isn't about Perl.
+This option allows turning all or some of it off.
+
+The special rule C<all> enables all guesswork.  This is also the default for
+backward compatibility reasons.  The special rule C<none> disables all
+guesswork.  Otherwise, the value of this option should be a comma-separated
+list of one or more of the following keywords:
+
+=over 4
+
+=item functions
+
+Convert function references like C<foo()> to bold even if they have no markup.
+The function name accepts valid Perl characters for function names (including
+C<:>), and the trailing parentheses must be present and empty.
+
+=item manref
+
+Make the first part (before the parentheses) of man page references like
+C<foo(1)> bold even if they have no markup.  The section must be a single
+number optionally followed by lowercase letters.
+
+=item quoting
+
+If no guesswork is enabled, any text enclosed in CZ<><> is surrounded by
+double quotes in nroff (terminal) output unless the contents are already
+quoted.  When this guesswork is enabled, quote marks will also be suppressed
+for Perl variables, function names, function calls, numbers, and hex
+constants.
+
+=item variables
+
+Convert Perl variable names to a fixed-width font even if they have no markup.
+This transformation will only be apparent in troff output, or some other
+output format (unlike nroff terminal output) that supports fixed-width fonts.
+
+=back
+
+Any unknown guesswork name is silently ignored (for potential future
+compatibility), so be careful about spelling.
 
 =item B<-h>, B<--help>
 
-Print out usage information.
+[1.00] Print out usage information.
 
 =item B<-l>, B<--lax>
 
-No longer used.  B<pod2man> used to check its input for validity as a
+[1.00] No longer used.  B<pod2man> used to check its input for validity as a
 manual page, but this should now be done by L<podchecker(1)> instead.
 Accepted for backward compatibility; this option no longer does anything.
 
+=item B<--language>=I<language>
+
+[5.00] Add commands telling B<groff> that the input file is in the given
+language.  The value of this setting must be a language abbreviation for which
+B<groff> provides supplemental configuration, such as C<ja> (for Japanese) or
+C<zh> (for Chinese).
+
+This adds:
+
+    .mso <language>.tmac
+    .hla <language>
+
+to the start of the file, which configure correct line breaking for the
+specified language.  Without these commands, groff may not know how to add
+proper line breaks for Chinese and Japanese text if the man page is installed
+into the normal man page directory, such as F</usr/share/man>.
+
+On many systems, this will be done automatically if the man page is installed
+into a language-specific man page directory, such as F</usr/share/man/zh_CN>.
+In that case, this option is not required.
+
+Unfortunately, the commands added with this option are specific to B<groff>
+and will not work with other B<troff> and B<nroff> implementations.
+
 =item B<--lquote>=I<quote>
 
 =item B<--rquote>=I<quote>
 
-Sets the quote marks used to surround CE<lt>> text.  B<--lquote> sets the
-left quote mark and B<--rquote> sets the right quote mark.  Either may also
-be set to the special value C<none>, in which case no quote mark is added
-on that side of CE<lt>> text (but the font is still changed for troff
-output).
+[4.08] Sets the quote marks used to surround CE<lt>> text.  B<--lquote> sets
+the left quote mark and B<--rquote> sets the right quote mark.  Either may
+also be set to the special value C<none>, in which case no quote mark is added
+on that side of CE<lt>> text (but the font is still changed for troff output).
 
 Also see the B<--quotes> option, which can be used to set both quotes at once.
 If both B<--quotes> and one of the other options is set, B<--lquote> or
@@ -256,19 +358,19 @@ B<--rquote> overrides B<--quotes>.
 
 =item B<-n> I<name>, B<--name>=I<name>
 
-Set the name of the manual page for the C<.TH> macro to I<name>.  Without
-this option, the manual name is set to the uppercased base name of the
-file being converted unless the manual section is 3, in which case the
-path is parsed to see if it is a Perl module path.  If it is, a path like
-C<.../lib/Pod/Man.pm> is converted into a name like C<Pod::Man>.  This
-option, if given, overrides any automatic determination of the name.
+[4.08] Set the name of the manual page for the C<.TH> macro to I<name>.
+Without this option, the manual name is set to the uppercased base name of the
+file being converted unless the manual section is 3, in which case the path is
+parsed to see if it is a Perl module path.  If it is, a path like
+C<.../lib/Pod/Man.pm> is converted into a name like C<Pod::Man>.  This option,
+if given, overrides any automatic determination of the name.
 
 Although one does not have to follow this convention, be aware that the
-convention for UNIX man pages for commands is for the man page title to be
-in all-uppercase, even if the command isn't.
+convention for UNIX manual pages is for the title to be in all-uppercase, even
+if the command isn't.  (Perl modules traditionally use mixed case for the
+manual page title, however.)
 
-This option is probably not useful when converting multiple POD files at
-once.
+This option is probably not useful when converting multiple POD files at once.
 
 When converting POD source from standard input, the name will be set to
 C<STDIN> if this option is not provided.  Providing this option is strongly
@@ -276,8 +378,8 @@ recommended to set a meaningful manual page name.
 
 =item B<--nourls>
 
-Normally, LZ<><> formatting codes with a URL but anchor text are formatted
-to show both the anchor text and the URL.  In other words:
+[2.5.0] Normally, LZ<><> formatting codes with a URL but anchor text are
+formatted to show both the anchor text and the URL.  In other words:
 
     L<foo|http://example.com/>
 
@@ -291,19 +393,19 @@ cluttered output in cases where the URLs are not particularly important.
 
 =item B<-o>, B<--official>
 
-Set the default header to indicate that this page is part of the standard
-Perl release, if B<--center> is not also given.
+[1.00] Set the default header to indicate that this page is part of the
+standard Perl release, if B<--center> is not also given.
 
 =item B<-q> I<quotes>, B<--quotes>=I<quotes>
 
-Sets the quote marks used to surround CE<lt>> text to I<quotes>.  If
-I<quotes> is a single character, it is used as both the left and right
-quote.  Otherwise, it is split in half, and the first half of the string
-is used as the left quote and the second is used as the right quote.
+[4.00] Sets the quote marks used to surround CE<lt>> text to I<quotes>.  If
+I<quotes> is a single character, it is used as both the left and right quote.
+Otherwise, it is split in half, and the first half of the string is used as
+the left quote and the second is used as the right quote.
 
-I<quotes> may also be set to the special value C<none>, in which case no
-quote marks are added around CE<lt>> text (but the font is still changed for
-troff output).
+I<quotes> may also be set to the special value C<none>, in which case no quote
+marks are added around CE<lt>> text (but the font is still changed for troff
+output).
 
 Also see the B<--lquote> and B<--rquote> options, which can be used to set the
 left and right quotes independently.  If both B<--quotes> and one of the other
@@ -311,67 +413,57 @@ options is set, B<--lquote> or B<--rquote> overrides B<--quotes>.
 
 =item B<-r> I<version>, B<--release>=I<version>
 
-Set the centered footer for the C<.TH> macro to I<version>.  By default,
-this is set to the version of Perl you run B<pod2man> under.  Setting this
-to the empty string will cause some *roff implementations to use the
+[1.00] Set the centered footer for the C<.TH> macro to I<version>.  By
+default, this is set to the version of Perl you run B<pod2man> under.  Setting
+this to the empty string will cause some *roff implementations to use the
 system default value.
 
-Note that some system C<an> macro sets assume that the centered footer
-will be a modification date and will prepend something like "Last
-modified: ".  If this is the case for your target system, you may want to
-set B<--release> to the last modified date and B<--date> to the version
-number.
+Note that some system C<an> macro sets assume that the centered footer will be
+a modification date and will prepend something like C<Last modified: >.  If
+this is the case for your target system, you may want to set B<--release> to
+the last modified date and B<--date> to the version number.
 
 =item B<-s> I<string>, B<--section>=I<string>
 
-Set the section for the C<.TH> macro.  The standard section numbering
-convention is to use 1 for user commands, 2 for system calls, 3 for
-functions, 4 for devices, 5 for file formats, 6 for games, 7 for
-miscellaneous information, and 8 for administrator commands.  There is a lot
-of variation here, however; some systems (like Solaris) use 4 for file
-formats, 5 for miscellaneous information, and 7 for devices.  Still others
-use 1m instead of 8, or some mix of both.  About the only section numbers
-that are reliably consistent are 1, 2, and 3.
+[1.00] Set the section for the C<.TH> macro.  The standard section numbering
+convention is to use 1 for user commands, 2 for system calls, 3 for functions,
+4 for devices, 5 for file formats, 6 for games, 7 for miscellaneous
+information, and 8 for administrator commands.  There is a lot of variation
+here, however; some systems (like Solaris) use 4 for file formats, 5 for
+miscellaneous information, and 7 for devices.  Still others use 1m instead of
+8, or some mix of both.  About the only section numbers that are reliably
+consistent are 1, 2, and 3.
 
-By default, section 1 will be used unless the file ends in C<.pm>, in
-which case section 3 will be selected.
+By default, section 1 will be used unless the file ends in C<.pm>, in which
+case section 3 will be selected.
 
 =item B<--stderr>
 
-By default, B<pod2man> dies if any errors are detected in the POD input.
-If B<--stderr> is given and no B<--errors> flag is present, errors are
-sent to standard error, but B<pod2man> does not abort.  This is equivalent
-to C<--errors=stderr> and is supported for backward compatibility.
+[2.1.3] By default, B<pod2man> dies if any errors are detected in the POD
+input.  If B<--stderr> is given and no B<--errors> flag is present, errors are
+sent to standard error, but B<pod2man> does not abort.  This is equivalent to
+C<--errors=stderr> and is supported for backward compatibility.
 
 =item B<-u>, B<--utf8>
 
-This option allows B<pod2man> to output literal UTF-8 characters.
-On OpenBSD, it is enabled by default and can be disabled with
-B<--no-utf8>, in which case non-ASCII characters are converted
-either to *roff escape sequences or to C<X>.
-
-Be aware that, when using this option, the input encoding of your POD
-source should be properly declared unless it's US-ASCII.  Pod::Simple will
-attempt to guess the encoding and may be successful if it's Latin-1 or
-UTF-8, but it will warn, which by default results in a B<pod2man> failure.
-Use the C<=encoding> command to declare the encoding.  See L<perlpod(1)>
-for more information.
+[2.1.0] This option used to tell B<pod2man> to produce UTF-8 output.  Since
+this is now the default as of version 5.00, it is ignored and does nothing.
 
 =item B<-v>, B<--verbose>
 
-Print out the name of each output file as it is being generated.
+[1.11] Print out the name of each output file as it is being generated.
 
 =back
 
 =head1 EXIT STATUS
 
-As long as all documents processed result in some output, even if that
-output includes errata (a C<POD ERRORS> section generated with
-C<--errors=pod>), B<pod2man> will exit with status 0.  If any of the
-documents being processed do not result in an output document, B<pod2man>
-will exit with status 1.  If there are syntax errors in a POD document
-being processed and the error handling style is set to the default of
-C<die>, B<pod2man> will abort immediately with exit status 255.
+As long as all documents processed result in some output, even if that output
+includes errata (a C<POD ERRORS> section generated with C<--errors=pod>),
+B<pod2man> will exit with status 0.  If any of the documents being processed
+do not result in an output document, B<pod2man> will exit with status 1.  If
+there are syntax errors in a POD document being processed and the error
+handling style is set to the default of C<die>, B<pod2man> will abort
+immediately with exit status 255.
 
 =head1 DIAGNOSTICS
 
@@ -394,22 +486,17 @@ To get index entries on C<STDERR>, turn on the F register, as in:
 
     troff -man -rF1 perl.1
 
-The indexing merely outputs messages via C<.tm> for each major page,
-section, subsection, item, and any C<XE<lt>E<gt>> directives.  See
-L<Pod::Man> for more details.
-
-=head1 BUGS
-
-Lots of this documentation is duplicated from L<Pod::Man>.
+The indexing merely outputs messages via C<.tm> for each major page, section,
+subsection, item, and any C<XE<lt>E<gt>> directives.
 
 =head1 AUTHOR
 
-Russ Allbery <rra@cpan.org>, based I<very> heavily on the original
-B<pod2man> by Larry Wall and Tom Christiansen.
+Russ Allbery <rra@cpan.org>, based on the original B<pod2man> by Larry Wall
+and Tom Christiansen.
 
 =head1 COPYRIGHT AND LICENSE
 
-Copyright 1999-2001, 2004, 2006, 2008, 2010, 2012-2019 Russ Allbery
+Copyright 1999-2001, 2004, 2006, 2008, 2010, 2012-2019, 2022 Russ Allbery
 <rra@cpan.org>
 
 This program is free software; you may redistribute it and/or modify it
index be06960..50088bf 100644 (file)
@@ -38,7 +38,7 @@ print "Extracting $file (with variable substitutions)\n";
 print {$out} <<"PREAMBLE" or die "Cannot write to $file: $!\n";
 $Config{startperl}
     eval 'exec $Config{perlpath} -S \$0 \${1+"\$@"}'
-        if \$running_under_some_shell;
+        if 0; # ^ Run only under a shell
 PREAMBLE
 
 # In the following, Perl variables are not expanded during extraction.
@@ -81,10 +81,10 @@ my $stdin;
 # Parse our options.  Use the same names as Pod::Text for simplicity.
 my %options;
 Getopt::Long::config ('bundling');
-GetOptions (\%options, 'alt|a', 'code', 'color|c', 'errors=s', 'help|h',
-            'indent|i=i', 'loose|l', 'margin|left-margin|m=i', 'nourls',
-            'overstrike|o', 'quotes|q=s', 'sentence|s', 'stderr', 'termcap|t',
-            'utf8|u', 'width|w=i')
+GetOptions (\%options, 'alt|a', 'code', 'color|c', 'encoding|e=s', 'errors=s',
+            'guesswork=s', 'help|h', 'indent|i=i', 'loose|l',
+            'margin|left-margin|m=i', 'nourls', 'overstrike|o', 'quotes|q=s',
+            'sentence|s', 'stderr', 'termcap|t', 'utf8|u', 'width|w=i')
     or exit 1;
 pod2usage (1) if $options{help};
 
@@ -133,7 +133,7 @@ __END__
 
 =for stopwords
 -aclostu --alt --stderr Allbery --overstrike overstrike --termcap --utf8
-UTF-8 subclasses --nourls
+UTF-8 subclasses --nourls EBCDIC unrepresentable
 
 =head1 NAME
 
@@ -141,82 +141,138 @@ pod2text - Convert POD data to formatted ASCII text
 
 =head1 SYNOPSIS
 
-pod2text [B<-aclostu>] [B<--code>] [B<--errors>=I<style>] [B<-i> I<indent>]
-    S<[B<-q> I<quotes>]> [B<--nourls>] [B<--stderr>] S<[B<-w> I<width>]>
-    [I<input> [I<output> ...]]
+pod2text [B<-aclostu>] [B<--code>] S<[B<-e> I<encoding>]>
+    [B<--errors>=I<style>] [B<--guesswork>=I<rule>[,I<rule>...]]
+    S<[B<-i> I<indent>]> S<[B<-q> I<quotes>]>
+    [B<--nourls>] [B<--stderr>] S<[B<-w> I<width>]> [I<input> [I<output> ...]]
 
 pod2text B<-h>
 
 =head1 DESCRIPTION
 
-B<pod2text> is a front-end for Pod::Text and its subclasses.  It uses them
-to generate formatted ASCII text from POD source.  It can optionally use
-either termcap sequences or ANSI color escape sequences to format the text.
+B<pod2text> is a wrapper script around the L<Pod::Text> and its subclasses.
+It uses them to generate formatted text from POD source.  It can optionally
+use either termcap sequences or ANSI color escape sequences to format the
+text.
 
-I<input> is the file to read for POD source (the POD can be embedded in
-code).  If I<input> isn't given, it defaults to C<STDIN>.  I<output>, if
-given, is the file to which to write the formatted output.  If I<output>
-isn't given, the formatted output is written to C<STDOUT>.  Several POD
-files can be processed in the same B<pod2text> invocation (saving module
-load and compile times) by providing multiple pairs of I<input> and
-I<output> files on the command line.
+I<input> is the file to read for POD source (the POD can be embedded in code).
+If I<input> isn't given, it defaults to C<STDIN>.  I<output>, if given, is the
+file to which to write the formatted output.  If I<output> isn't given, the
+formatted output is written to C<STDOUT>.  Several POD files can be processed
+in the same B<pod2text> invocation (saving module load and compile times) by
+providing multiple pairs of I<input> and I<output> files on the command line.
+
+By default, the output encoding is the same as the encoding of the input file,
+or UTF-8 if that encoding is not set (except on EBCDIC systems).  See the
+B<-e> option to explicitly set the output encoding and L<Pod::Text/Encoding>
+for more discussion.
 
 =head1 OPTIONS
 
+Each option is annotated with the version of podlators in which that option
+was added with its current meaning.
+
 =over 4
 
 =item B<-a>, B<--alt>
 
-Use an alternate output format that, among other things, uses a different
-heading style and marks C<=item> entries with a colon in the left margin.
+[1.00] Use an alternate output format that, among other things, uses a
+different heading style and marks C<=item> entries with a colon in the left
+margin.
 
 =item B<--code>
 
-Include any non-POD text from the input file in the output as well.  Useful
-for viewing code documented with POD blocks with the POD rendered and the
-code left intact.
+[1.11] Include any non-POD text from the input file in the output as well.
+Useful for viewing code documented with POD blocks with the POD rendered and
+the code left intact.
 
 =item B<-c>, B<--color>
 
-Format the output with ANSI color escape sequences.  Using this option
+[1.00] Format the output with ANSI color escape sequences.  Using this option
 requires that Term::ANSIColor be installed on your system.
 
+=item B<-e> I<encoding>, B<--encoding>=I<encoding>
+
+[5.00] Specifies the encoding of the output.  I<encoding> must be an encoding
+recognized by the L<Encode> module (see L<Encode::Supported>).  If the output
+contains characters that cannot be represented in this encoding, that is an
+error that will be reported as configured by the C<errors> option.  If error
+handling is other than C<die>, the unrepresentable character will be replaced
+with the Encode substitution character (normally C<?>).
+
+WARNING: The input encoding of the POD source is independent from the output
+encoding, and setting this option does not affect the interpretation of the
+POD input.  Unless your POD source is US-ASCII, its encoding should be
+declared with the C<=encoding> command in the source, as near to the top of
+the file as possible.  If this is not done, Pod::Simple will will attempt to
+guess the encoding and may be successful if it's Latin-1 or UTF-8, but it will
+produce warnings.  See L<perlpod(1)> for more information.
+
 =item B<--errors>=I<style>
 
-Set the error handling style.  C<die> says to throw an exception on any
-POD formatting error.  C<stderr> says to report errors on standard error,
-but not to throw an exception.  C<pod> says to include a POD ERRORS
-section in the resulting documentation summarizing the errors.  C<none>
-ignores POD errors entirely, as much as possible.
+[2.5.0] Set the error handling style.  C<die> says to throw an exception on
+any POD formatting error.  C<stderr> says to report errors on standard error,
+but not to throw an exception.  C<pod> says to include a POD ERRORS section in
+the resulting documentation summarizing the errors.  C<none> ignores POD
+errors entirely, as much as possible.
 
 The default is C<die>.
 
+=item B<--guesswork>=I<rule>[,I<rule>...]
+
+[5.01] By default, B<pod2text> applies some default formatting rules based on
+guesswork and regular expressions that are intended to make writing Perl
+documentation easier and require less explicit markup.  These rules may not
+always be appropriate, particularly for documentation that isn't about Perl.
+This option allows turning all or some of it off.
+
+The special rule C<all> enables all guesswork.  This is also the default for
+backward compatibility reasons.  The special rule C<none> disables all
+guesswork.  Otherwise, the value of this option should be a comma-separated
+list of one or more of the following keywords:
+
+=over 4
+
+=item quoting
+
+If no guesswork is enabled, any text enclosed in CZ<><> is surrounded by
+double quotes in nroff (terminal) output unless the contents are already
+quoted.  When this guesswork is enabled, quote marks will also be suppressed
+for Perl variables, function names, function calls, numbers, and hex
+constants.
+
+=back
+
+Any unknown guesswork name is silently ignored (for potential future
+compatibility), so be careful about spelling.
+
 =item B<-i> I<indent>, B<--indent=>I<indent>
 
-Set the number of spaces to indent regular text, and the default indentation
-for C<=over> blocks.  Defaults to 4 spaces if this option isn't given.
+[1.00] Set the number of spaces to indent regular text, and the default
+indentation for C<=over> blocks.  Defaults to 4 spaces if this option isn't
+given.
 
 =item B<-h>, B<--help>
 
-Print out usage information and exit.
+[1.00] Print out usage information and exit.
 
 =item B<-l>, B<--loose>
 
-Print a blank line after a C<=head1> heading.  Normally, no blank line is
-printed after C<=head1>, although one is still printed after C<=head2>,
-because this is the expected formatting for manual pages; if you're
-formatting arbitrary text documents, using this option is recommended.
+[1.00] Print a blank line after a C<=head1> heading.  Normally, no blank line
+is printed after C<=head1>, although one is still printed after C<=head2>,
+because this is the expected formatting for manual pages; if you're formatting
+arbitrary text documents, using this option is recommended.
 
 =item B<-m> I<width>, B<--left-margin>=I<width>, B<--margin>=I<width>
 
-The width of the left margin in spaces.  Defaults to 0.  This is the margin
-for all text, including headings, not the amount by which regular text is
-indented; for the latter, see B<-i> option.
+[1.24] The width of the left margin in spaces.  Defaults to 0.  This is the
+margin for all text, including headings, not the amount by which regular text
+is indented; for the latter, see B<-i> option.
 
 =item B<--nourls>
 
-Normally, LZ<><> formatting codes with a URL but anchor text are formatted
-to show both the anchor text and the URL.  In other words:
+[2.5.0] Normally, LZ<><> formatting codes with a URL but anchor text are
+formatted to show both the anchor text and the URL.  In other words:
 
     L<foo|http://example.com/>
 
@@ -225,80 +281,71 @@ is formatted as:
     foo <http://example.com/>
 
 This flag, if given, suppresses the URL when anchor text is given, so this
-example would be formatted as just C<foo>.  This can produce less
-cluttered output in cases where the URLs are not particularly important.
+example would be formatted as just C<foo>.  This can produce less cluttered
+output in cases where the URLs are not particularly important.
 
 =item B<-o>, B<--overstrike>
 
-Format the output with overstrike printing.  Bold text is rendered as
+[1.06] Format the output with overstrike printing.  Bold text is rendered as
 character, backspace, character.  Italics and file names are rendered as
-underscore, backspace, character.  Many pagers, such as B<less>, know how
-to convert this to bold or underlined text.
+underscore, backspace, character.  Many pagers, such as B<less>, know how to
+convert this to bold or underlined text.
 
 =item B<-q> I<quotes>, B<--quotes>=I<quotes>
 
-Sets the quote marks used to surround CE<lt>> text to I<quotes>.  If
-I<quotes> is a single character, it is used as both the left and right
-quote.  Otherwise, it is split in half, and the first half of the string
-is used as the left quote and the second is used as the right quote.
+[4.00] Sets the quote marks used to surround CE<lt>> text to I<quotes>.  If
+I<quotes> is a single character, it is used as both the left and right quote.
+Otherwise, it is split in half, and the first half of the string is used as
+the left quote and the second is used as the right quote.
 
-I<quotes> may also be set to the special value C<none>, in which case no
-quote marks are added around CE<lt>> text.
+I<quotes> may also be set to the special value C<none>, in which case no quote
+marks are added around CE<lt>> text.
 
 =item B<-s>, B<--sentence>
 
-Assume each sentence ends with two spaces and try to preserve that spacing.
-Without this option, all consecutive whitespace in non-verbatim paragraphs
-is compressed into a single space.
+[1.00] Assume each sentence ends with two spaces and try to preserve that
+spacing.  Without this option, all consecutive whitespace in non-verbatim
+paragraphs is compressed into a single space.
 
 =item B<--stderr>
 
-By default, B<pod2text> dies if any errors are detected in the POD input.
-If B<--stderr> is given and no B<--errors> flag is present, errors are
-sent to standard error, but B<pod2text> does not abort.  This is
-equivalent to C<--errors=stderr> and is supported for backward
-compatibility.
+[2.1.3] By default, B<pod2text> dies if any errors are detected in the POD
+input.  If B<--stderr> is given and no B<--errors> flag is present, errors are
+sent to standard error, but B<pod2text> does not abort.  This is equivalent to
+C<--errors=stderr> and is supported for backward compatibility.
 
 =item B<-t>, B<--termcap>
 
-Try to determine the width of the screen and the bold and underline
+[1.00] Try to determine the width of the screen and the bold and underline
 sequences for the terminal from termcap, and use that information in
 formatting the output.  Output will be wrapped at two columns less than the
 width of your terminal device.  Using this option requires that your system
 have a termcap file somewhere where Term::Cap can find it and requires that
-your system support termios.  With this option, the output of B<pod2text>
-will contain terminal control sequences for your current terminal type.
+your system support termios.  With this option, the output of B<pod2text> will
+contain terminal control sequences for your current terminal type.
 
 =item B<-u>, B<--utf8>
 
-By default, B<pod2text> tries to use the same output encoding as its input
-encoding (to be backward-compatible with older versions).  This option
-says to instead force the output encoding to UTF-8.
-
-Be aware that, when using this option, the input encoding of your POD
-source should be properly declared unless it's US-ASCII.  Pod::Simple
-will attempt to guess the encoding and may be successful if it's
-Latin-1 or UTF-8, but it will warn, which by default results in a
-B<pod2text> failure.  Use the C<=encoding> command to declare the
-encoding.  See L<perlpod(1)> for more information.
+[2.2.0] Set the output encoding to UTF-8.  This is equivalent to
+C<--encoding=UTF-8> and is supported for backward compatibility.
 
 =item B<-w>, B<--width=>I<width>, B<->I<width>
 
-The column at which to wrap text on the right-hand side.  Defaults to 76,
-unless B<-t> is given, in which case it's two columns less than the width of
-your terminal device.
+[1.00] The column at which to wrap text on the right-hand side.  Defaults to
+76, unless B<-t> is given, in which case it's two columns less than the width
+of your terminal device.
 
 =back
 
 =head1 EXIT STATUS
 
-As long as all documents processed result in some output, even if that
-output includes errata (a C<POD ERRORS> section generated with
-C<--errors=pod>), B<pod2text> will exit with status 0.  If any of the
-documents being processed do not result in an output document, B<pod2text>
-will exit with status 1.  If there are syntax errors in a POD document
-being processed and the error handling style is set to the default of
-C<die>, B<pod2text> will abort immediately with exit status 255.
+As long as all documents processed result in some output, even if that output
+includes errata (a C<POD ERRORS> section generated with C<--errors=pod>),
+B<pod2text> will exit with status 0.  If any of the documents being processed
+do not result in an output document, B<pod2text> will exit with status 1.  If
+there are syntax errors in a POD document being processed and the error
+handling style is set to the default of C<die>, B<pod2text> will abort
+immediately with exit status 255.
 
 =head1 DIAGNOSTICS
 
@@ -310,8 +357,7 @@ produce the following diagnostics:
 
 =item -c (--color) requires Term::ANSIColor be installed
 
-(F) B<-c> or B<--color> were given, but Term::ANSIColor could not be
-loaded.
+(F) B<-c> or B<--color> were given, but Term::ANSIColor could not be loaded.
 
 =item Unknown option: %s
 
@@ -328,8 +374,8 @@ command-line options.
 
 =item COLUMNS
 
-If B<-t> is given, B<pod2text> will take the current width of your screen
-from this environment variable, if available.  It overrides terminal width
+If B<-t> is given, B<pod2text> will take the current width of your screen from
+this environment variable, if available.  It overrides terminal width
 information in TERMCAP.
 
 =item TERMCAP
@@ -346,7 +392,7 @@ Russ Allbery <rra@cpan.org>.
 
 =head1 COPYRIGHT AND LICENSE
 
-Copyright 1999-2001, 2004, 2006, 2008, 2010, 2012-2019 Russ Allbery
+Copyright 1999-2001, 2004, 2006, 2008, 2010, 2012-2019, 2022 Russ Allbery
 <rra@cpan.org>
 
 This program is free software; you may redistribute it and/or modify it
@@ -354,8 +400,8 @@ under the same terms as Perl itself.
 
 =head1 SEE ALSO
 
-L<Pod::Text>, L<Pod::Text::Color>, L<Pod::Text::Overstrike>,
-L<Pod::Text::Termcap>, L<Pod::Simple>, L<perlpod(1)>
+L<Encode::Supported>, L<Pod::Text>, L<Pod::Text::Color>,
+L<Pod::Text::Overstrike>, L<Pod::Text::Termcap>, L<Pod::Simple>, L<perlpod(1)>
 
 The current version of this script is always available from its web site at
 L<https://www.eyrie.org/~eagle/software/podlators/>.  It is also part of the
index 3d1451d..02d8b22 100644 (file)
 \e[1mFORMATTING CODES\e[m
     Another test taken from Pod::Parser.
 
-    This is a test to see if I can do not only $self and "method()", but also
+    This is a test to see if I can do not only $self and method(), but also
     "$self->method()" and "$self->{FIELDNAME}" and "$Foo <=> $Bar" without
     resorting to escape sequences. If I want to refer to the right-shift
     operator I can do something like "$x >> 3" or even "$y >> 5".
index db17142..c87f4bd 100644 (file)
 \e[1mFORMATTING CODES\e[0m
     Another test taken from Pod::Parser.
 
-    This is a test to see if I can do not only $self and "method()", but
-    also "$self->method()" and "$self->{FIELDNAME}" and "$Foo <=> $Bar"
-    without resorting to escape sequences. If I want to refer to the
-    right-shift operator I can do something like "$x >> 3" or even "$y >>
-    5".
+    This is a test to see if I can do not only $self and method(), but also
+    "$self->method()" and "$self->{FIELDNAME}" and "$Foo <=> $Bar" without
+    resorting to escape sequences. If I want to refer to the right-shift
+    operator I can do something like "$x >> 3" or even "$y >> 5".
 
     Now for the grand finale of "$self->method()->{FIELDNAME} = {FOO=>BAR}".
     And I also want to make sure that newlines work like this
index e2fe978..bbfffc0 100644 (file)
@@ -1,15 +1,15 @@
-.SH "NAME"
+.SH NAME
 basic.pod \- Test of various basic POD features in translators.
-.SH "HEADINGS"
+.SH HEADINGS
 .IX Header "HEADINGS"
 Try a few different levels of headings, with embedded formatting codes and
 other interesting bits.
 .ie n .SH "This ""is"" a ""level 1"" heading"
-.el .SH "This \f(CWis\fP a ``level 1'' heading"
-.IX Header "This is a level 1 heading"
+.el .SH "This \f(CWis\fP a ""level 1"" heading"
+.IX Header "This is a ""level 1"" heading"
 .SS "``Level'' ""2 \fIheading\fP"
 .IX Subsection "``Level'' ""2 heading"
-\fILevel 3 \f(BIheading \f(BIwith \f(CB\*(C`weird \f(CBstuff "" (double quote)\f(CB\*(C'\f(BI\f(BI\fI\fR
+\fILevel 3 \fR\f(BIheading with \fR\f(CB\*(C`weird stuff "" (double quote)\*(C'\fR
 .IX Subsection "Level 3 heading with weird stuff """" (double quote)"
 .PP
 Level "4 \f(CW\*(C`heading\*(C'\fR
@@ -17,14 +17,14 @@ Level "4 \f(CW\*(C`heading\*(C'\fR
 .PP
 Now try again with \fBintermixed\fR \fItext\fR.
 .ie n .SH "This ""is"" a ""level 1"" heading"
-.el .SH "This \f(CWis\fP a ``level 1'' heading"
-.IX Header "This is a level 1 heading"
+.el .SH "This \f(CWis\fP a ""level 1"" heading"
+.IX Header "This is a ""level 1"" heading"
 Text.
 .SS "``Level'' 2 \fIheading\fP"
 .IX Subsection "``Level'' 2 heading"
 Text.
 .PP
-\fILevel 3 \f(BIheading \f(BIwith \f(CB\*(C`weird \f(CBstuff\f(CB\*(C'\f(BI\f(BI\fI\fR
+\fILevel 3 \fR\f(BIheading with \fR\f(CB\*(C`weird stuff\*(C'\fR
 .IX Subsection "Level 3 heading with weird stuff"
 .PP
 Text.
@@ -33,19 +33,19 @@ Level "4 \f(CW\*(C`heading\*(C'\fR
 .IX Subsection "Level ""4 heading"
 .PP
 Text.
-.SH "LINKS"
+.SH LINKS
 .IX Header "LINKS"
 These are all taken from the Pod::Parser tests.
 .PP
-Try out \fI\s-1LOTS\s0\fR of different ways of specifying references:
+Try out \fILOTS\fR of different ways of specifying references:
 .PP
-Reference the \*(L"section\*(R" in manpage
+Reference the "section" in manpage
 .PP
-Reference the \*(L"section\*(R" in \*(L"manpage\*(R"
+Reference the "section" in "manpage"
 .PP
-Reference the \*(L"section\*(R" in manpage
+Reference the "section" in manpage
 .PP
-Now try it using the new \*(L"|\*(R" stuff ...
+Now try it using the new "|" stuff ...
 .PP
 Reference the thistext|
 .PP
@@ -65,23 +65,23 @@ foo
 .PP
 foo
 .PP
-\&\*(L"bar\*(R" in foo
+"bar" in foo
 .PP
-\&\*(L"baz boo\*(R" in foo
+"baz boo" in foo
 .PP
-\&\*(L"bar\*(R"
+"bar"
 .PP
-\&\*(L"baz boo\*(R"
+"baz boo"
 .PP
-\&\*(L"baz boo\*(R"
+"baz boo"
 .PP
-\&\*(L"baz boo\*(R" in foo bar
+"baz boo" in foo bar
 .PP
-\&\*(L"boo var baz\*(R"
+"boo var baz"
 .PP
-\&\*(L"bar baz\*(R"
+"bar baz"
 .PP
-\&\*(L"boo\*(R", \*(L"bar\*(R", and \*(L"baz\*(R"
+"boo", "bar", and "baz"
 .PP
 foobar
 .PP
@@ -89,7 +89,7 @@ Testing \fIitalics\fR
 .PP
 "\fIItalic\fR text" in foo
 .PP
-"Section \f(CW\*(C`with\*(C'\fR \fI\f(BIother\fI markup\fR" in foo|bar
+"Section \f(CW\*(C`with\*(C'\fR \fR\f(BIother\fR\fI markup\fR" in foo|bar
 .SH "OVER AND ITEMS"
 .IX Header "OVER AND ITEMS"
 Taken from Pod::Parser tests, this is a test to ensure that multiline
@@ -101,31 +101,31 @@ There should be whitespace now before this line.
 .PP
 Taken from Pod::Parser tests, this is a test to ensure the nested =item
 paragraphs get indented appropriately.
-.IP "1." 2
+.IP 1. 2
 First section.
 .RS 2
-.IP "a" 2
+.IP a 2
 .IX Item "a"
 this is item a
-.IP "b" 2
+.IP b 2
 .IX Item "b"
 this is item b
 .RE
 .RS 2
 .RE
-.IP "2." 2
+.IP 2. 2
 Second section.
 .RS 2
-.IP "a" 2
+.IP a 2
 .IX Item "a"
 this is item a
-.IP "b" 2
+.IP b 2
 .IX Item "b"
 this is item b
-.IP "c" 2
+.IP c 2
 .IX Item "c"
 .PD 0
-.IP "d" 2
+.IP d 2
 .IX Item "d"
 .PD
 This is item c & d.
@@ -135,14 +135,13 @@ This is item c & d.
 .PP
 Now some additional weirdness of our own.  Make sure that multiple tags
 for one paragraph are properly compacted.
-.ie n .IP """foo""" 4
-.el .IP "``foo''" 4
-.IX Item "foo"
+.IP """foo""" 4
+.IX Item """foo"""
 .PD 0
-.IP "\fBbar\fR" 4
+.IP \fBbar\fR 4
 .IX Item "bar"
 .ie n .IP """baz""" 4
-.el .IP "\f(CWbaz\fR" 4
+.el .IP \f(CWbaz\fR 4
 .IX Item "baz"
 .PD
 There shouldn't be any spaces between any of these item tags; this idiom
@@ -155,7 +154,7 @@ few lines).
 .Sp
 Let's also make it multiple paragraphs to be sure that works.
 .PP
-Test use of =over without =item as a block \*(L"quote\*(R" or block paragraph.
+Test use of =over without =item as a block "quote" or block paragraph.
 .Sp
 .RS 4
 This should be indented four spaces but otherwise formatted the same as
@@ -174,9 +173,9 @@ This paragraph should be doubly indented.
 .RS 4
 .Sp
 This paragraph should only be singly indented.
-.IP "\(bu" 4
+.IP \(bu 4
 This is an item in the middle of a block-quote, which should be allowed.
-.IP "\(bu" 4
+.IP \(bu 4
 We're also testing tagless item commands.
 .RE
 .RS 4
@@ -187,22 +186,22 @@ Should be back to the single level of indentation.
 Should be back to regular indentation.
 .PP
 Now also check the transformation of * into real bullets for man pages.
-.IP "\(bu" 4
+.IP \(bu 4
 An item.  We're also testing using =over without a number, and making sure
 that item text wraps properly.
-.IP "\(bu" 4
+.IP \(bu 4
 Another item.
 .PP
 and now test the numbering of item blocks.
-.IP "1." 4
+.IP 1. 4
 First item.
-.IP "2." 4
+.IP 2. 4
 Second item.
 .SH "FORMATTING CODES"
 .IX Header "FORMATTING CODES"
 Another test taken from Pod::Parser.
 .PP
-This is a test to see if I can do not only \f(CW$self\fR and \f(CW\*(C`method()\*(C'\fR, but
+This is a test to see if I can do not only \f(CW$self\fR and \f(CWmethod()\fR, but
 also \f(CW\*(C`$self\->method()\*(C'\fR and \f(CW\*(C`$self\->{FIELDNAME}\*(C'\fR and
 \&\f(CW\*(C`$Foo <=> $Bar\*(C'\fR without resorting to escape sequences. If 
 I want to refer to the right-shift operator I can do something
@@ -221,14 +220,14 @@ Don't forget \f(CW\*(C`$self\->method()\->{FIELDNAME} = {FOO=>BAR}\*(C'\fR.
 And make sure that \f(CW0\fR works too!
 .PP
 Now, if I use << or >> as my delimiters, then I have to use whitespace.
-So things like \f(CW\*(C`<$self\-\*(C'\fR\fBmethod()\fR>> and \f(CW\*(C`<$self\-\*(C'\fR{\s-1FIELDNAME\s0}>> won't end
+So things like \f(CW\*(C`<$self\-\*(C'\fR\fBmethod()\fR>> and \f(CW\*(C`<$self\-\*(C'\fR{FIELDNAME}>> won't end
 up doing what you might expect since the first > will still terminate
 the first < seen.
 .PP
 Lets make sure these work for empty ones too, like \f(CW\*(C`\*(C'\fR and \f(CW\*(C`>>\*(C'\fR
 (just to be obnoxious)
 .PP
-The statement: \f(CW\*(C`This is dog kind\*(Aqs \f(CIfinest\f(CW hour!\*(C'\fR is a parody of a
+The statement: \f(CW\*(C`This is dog kind\*(Aqs \fR\f(CIfinest\fR\f(CW hour!\*(C'\fR is a parody of a
 quotation from Winston Churchill.
 .PP
 The following tests are added to those:
@@ -236,17 +235,17 @@ The following tests are added to those:
 Make sure that a few other odd \fIthings\fR still work.  This should be
 a vertical bar:  |.  Here's a test of a few more special escapes
 that have to be supported:
-.IP "&" 3
+.IP & 3
 An ampersand.
-.IP "'" 3
+.IP ' 3
 An apostrophe.
-.IP "<" 3
+.IP < 3
 A less-than sign.
-.IP ">" 3
+.IP > 3
 A greater-than sign.
 .IP """" 3
 A double quotation mark.
-.IP "/" 3
+.IP / 3
 A forward slash.
 .PP
 Try to get this bit of text over towards the edge so |that\ all\ of\ this\ text\ inside\ S<>\ won't| be wrapped.  Also test the
@@ -256,7 +255,7 @@ There is a soft hy\%phen in hyphen at hy-phen.
 .PP
 This is a test of an index entry.
 .IX Xref "index entry"
-.SH "VERBATIM"
+.SH VERBATIM
 .IX Header "VERBATIM"
 Throw in a few verbatim paragraphs.
 .PP
@@ -314,7 +313,7 @@ up.)
 \&    visually inspect the nroff output when run on the generated *roff
 \&    text, unfortunately.)
 .Ve
-.SH "CONCLUSION"
+.SH CONCLUSION
 .IX Header "CONCLUSION"
 That's all, folks!
 .SH "COPYRIGHT AND LICENSE"
@@ -326,4 +325,4 @@ permitted in any medium without royalty provided the copyright notice and
 this notice are preserved.  This file is offered as-is, without any
 warranty.
 .PP
-SPDX-License-Identifier: \s-1FSFAP\s0
+SPDX-License-Identifier: FSFAP
index c55ab07..4a2c4cc 100644 (file)
@@ -160,11 +160,10 @@ O\bOV\bVE\bER\b\b A\bAN\bND\b\b I\bIT\bTE\bEM\bMS\bS
 F\bFO\bOR\bRM\bMA\bAT\bTT\bTI\bIN\bNG\b\b C\bCO\bOD\bDE\bES\bS
     Another test taken from Pod::Parser.
 
-    This is a test to see if I can do not only $self and "method()", but
-    also "$self->method()" and "$self->{FIELDNAME}" and "$Foo <=> $Bar"
-    without resorting to escape sequences. If I want to refer to the
-    right-shift operator I can do something like "$x >> 3" or even "$y >>
-    5".
+    This is a test to see if I can do not only $self and method(), but also
+    "$self->method()" and "$self->{FIELDNAME}" and "$Foo <=> $Bar" without
+    resorting to escape sequences. If I want to refer to the right-shift
+    operator I can do something like "$x >> 3" or even "$y >> 5".
 
     Now for the grand finale of "$self->method()->{FIELDNAME} = {FOO=>BAR}".
     And I also want to make sure that newlines work like this
index 6228b24..a8c1fb2 100644 (file)
@@ -160,11 +160,10 @@ OVER AND ITEMS
 FORMATTING CODES
     Another test taken from Pod::Parser.
 
-    This is a test to see if I can do not only $self and "method()", but
-    also "$self->method()" and "$self->{FIELDNAME}" and "$Foo <=> $Bar"
-    without resorting to escape sequences. If I want to refer to the
-    right-shift operator I can do something like "$x >> 3" or even "$y >>
-    5".
+    This is a test to see if I can do not only $self and method(), but also
+    "$self->method()" and "$self->{FIELDNAME}" and "$Foo <=> $Bar" without
+    resorting to escape sequences. If I want to refer to the right-shift
+    operator I can do something like "$x >> 3" or even "$y >> 5".
 
     Now for the grand finale of "$self->method()->{FIELDNAME} = {FOO=>BAR}".
     And I also want to make sure that newlines work like this
index ca05568..4f70cad 100644 (file)
@@ -1,7 +1,20 @@
 # Configuration for Perl tests.  -*- perl -*-
 
+# Not all of the modules have been converted to my current coding standard
+# yet.
+@CRITIC_IGNORE = qw(
+    blib/lib/Pod/Man.pm
+    blib/lib/Pod/ParseLink.pm
+    blib/lib/Pod/Text.pm
+    blib/lib/Pod/Text/Color.pm
+    blib/lib/Pod/Text/Overstrike.pm
+    blib/lib/Pod/Text/Termcap.pm
+    blib/script/pod2man
+    blib/script/pod2text
+);
+
 # Default minimum version requirement.
-$MINIMUM_VERSION = '5.008';
+$MINIMUM_VERSION = '5.010';
 
 # File must end with this line.
 1;
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/README b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/README
deleted file mode 100644 (file)
index 3429595..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-The files in this directory are used by the test suite to exercise various
-behavior of Pod::Man or Pod::Text.  They use a pseudo-ini-file syntax with
-free-form sections, normally an input and an output section and possibly
-others.
-
-Sections start with the section type in [].  The contents are normally
-just free-form.  The exception is an [options] section, where the contents
-are key/value pairs, where the key is separated from the value with
-whitespace.
-
-Valid sections are:
-
-    [name]
-    The name of this test for status reporting
-    
-    [options]
-    key value
-    key value
-    
-    [input]
-    POD input source.
-    
-    [output]
-    The results of running some formatter on the input.
-    
-    [errors]
-    Errors reported to standard error when running some formatter on the
-    input.
-    
-    [exception]
-    The text of an exception (with the file and line number information
-    stripped) thrown by running some formatter on the input.
-
-Files are organized into subdirectories named after the formatter, namely
-man (Pod::Man), text (Pod::Text), color (Pod::Text::Color), overstrike
-(Pod::Text::Overstrike), and termcap (Pod::Text::Termcap).
-
------
-
-Copyright 2015, 2018 Russ Allbery <rra@cpan.org>
-
-Copying and distribution of this file, with or without modification, are
-permitted in any medium without royalty provided the copyright notice and
-this notice are preserved.  This file is offered as-is, without any
-warranty.
-
-SPDX-License-Identifier: FSFAP
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/paired-quotes b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/paired-quotes
deleted file mode 100644 (file)
index f81ed8a..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-[name]
-Paired quotes
-
-[input]
-=head1 SEQS
-
-"=over ... Z<>=back"
-
-"SE<lt>...E<gt>"
-
-The quotes should be converted in the above to paired quotes.
-
-[output]
-.SH "SEQS"
-.IX Header "SEQS"
-\&\*(L"=over ... =back\*(R"
-.PP
-\&\*(L"S<...>\*(R"
-.PP
-The quotes should be converted in the above to paired quotes.
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/small-caps-magic b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/small-caps-magic
deleted file mode 100644 (file)
index bb5fea6..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-[name]
-Small caps and unbreakable magic
-
-[input]
-=head1 SE<lt>E<gt> MAGIC
-
-Magic should be applied S<RISC OS> to that.
-
-[output]
-.SH "S<> MAGIC"
-.IX Header "S<> MAGIC"
-Magic should be applied \s-1RISC\s0\ \s-1OS\s0 to that.
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/uppercase-license b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/uppercase-license
deleted file mode 100644 (file)
index f49baa3..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-[name]
-Uppercase license text
-
-[input]
-=head1 Uppercase License
-
-Permission is hereby granted, free of charge, to any person obtaining a
-copy of this software and associated documentation files (the "Software"),
-to deal in the Software without restriction, including without limitation
-the rights to use, copy, modify, merge, publish, distribute, sublicense,
-and/or sell copies of the Software, and to permit persons to whom the
-Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-SPDX-License-Identifier: MIT
-
-[output]
-.SH "Uppercase License"
-.IX Header "Uppercase License"
-Permission is hereby granted, free of charge, to any person obtaining a
-copy of this software and associated documentation files (the \*(L"Software\*(R"),
-to deal in the Software without restriction, including without limitation
-the rights to use, copy, modify, merge, publish, distribute, sublicense,
-and/or sell copies of the Software, and to permit persons to whom the
-Software is furnished to do so, subject to the following conditions:
-.PP
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-.PP
-\&\s-1THE SOFTWARE IS PROVIDED \*(L"AS IS\*(R", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\s0
-.PP
-SPDX-License-Identifier: \s-1MIT\s0
index 819aa69..497dce3 100644 (file)
@@ -6,7 +6,7 @@
 # which can be found at <https://www.eyrie.org/~eagle/software/rra-c-util/>.
 #
 # Written by Russ Allbery <eagle@eyrie.org>
-# Copyright 2019 Russ Allbery <eagle@eyrie.org>
+# Copyright 2019, 2021 Russ Allbery <eagle@eyrie.org>
 # Copyright 2013-2014
 #     The Board of Trustees of the Leland Stanford Junior University
 #
@@ -30,7 +30,7 @@
 #
 # SPDX-License-Identifier: MIT
 
-use 5.008;
+use 5.010;
 use strict;
 use warnings;
 
@@ -47,13 +47,16 @@ skip_unless_author('Spelling tests');
 # Load prerequisite modules.
 use_prereq('Test::Spelling');
 
-# Check all POD in the Perl distribution.  Add the examples directory if it
-# exists.  Also add any files in usr/bin or usr/sbin, which are widely used in
-# Stanford-internal packages.
+# Check all POD in the Perl distribution.  Add the examples and t/lib
+# directories if they exist.  Also add any files in usr/bin or usr/sbin, which
+# are widely used in Stanford-internal packages.
 my @files = all_pod_files();
 if (-d 'examples') {
     push(@files, all_pod_files('examples'));
 }
+if (-d File::Spec->catfile('t', 'lib')) {
+    push(@files, all_pod_files(File::Spec->catfile('t', 'lib')));
+}
 for my $dir (qw(usr/bin usr/sbin)) {
     if (-d $dir) {
         push(@files, glob("$dir/*"));
index e7d0231..85974d8 100644 (file)
@@ -6,7 +6,7 @@
 # which can be found at <https://www.eyrie.org/~eagle/software/rra-c-util/>.
 #
 # Written by Russ Allbery <eagle@eyrie.org>
-# Copyright 2019 Russ Allbery <eagle@eyrie.org>
+# Copyright 2019, 2021 Russ Allbery <eagle@eyrie.org>
 # Copyright 2012-2014
 #     The Board of Trustees of the Leland Stanford Junior University
 #
@@ -30,7 +30,7 @@
 #
 # SPDX-License-Identifier: MIT
 
-use 5.008;
+use 5.010;
 use strict;
 use warnings;
 
@@ -46,13 +46,16 @@ skip_unless_automated('POD syntax tests');
 # Load prerequisite modules.
 use_prereq('Test::Pod');
 
-# Check all POD in the Perl distribution.  Add the examples directory if it
-# exists.  Also add any files in usr/bin or usr/sbin, which are widely used in
-# Stanford-internal packages.
+# Check all POD in the Perl distribution.  Add the examples and t/lib
+# directories if they exist.  Also add any files in usr/bin or usr/sbin,
+# which are widely used in Stanford-internal packages.
 my @files = all_pod_files();
 if (-d 'examples') {
     push(@files, all_pod_files('examples'));
 }
+if (-d File::Spec->catfile('t', 'lib')) {
+    push(@files, all_pod_files(File::Spec->catfile('t', 'lib')));
+}
 for my $dir (qw(usr/bin usr/sbin)) {
     if (-d $dir) {
         push(@files, glob("$dir/*"));
index 1a2fbf1..b19b4dd 100644 (file)
@@ -6,7 +6,7 @@
 # which can be found at <https://www.eyrie.org/~eagle/software/rra-c-util/>.
 #
 # Written by Russ Allbery <eagle@eyrie.org>
-# Copyright 2019 Russ Allbery <eagle@eyrie.org>
+# Copyright 2019, 2021 Russ Allbery <eagle@eyrie.org>
 # Copyright 2013-2014
 #     The Board of Trustees of the Leland Stanford Junior University
 #
@@ -30,7 +30,7 @@
 #
 # SPDX-License-Identifier: MIT
 
-use 5.008;
+use 5.010;
 use strict;
 use warnings;
 
index 0feb6a6..a0c84e9 100644 (file)
@@ -12,7 +12,7 @@
 # the machinery to run small POD snippets through the specific formatter being
 # tested should probably be used instead.
 #
-# Copyright 2001-2002, 2004, 2006, 2009, 2012, 2014-2015, 2018-2019
+# Copyright 2001-2002, 2004, 2006, 2009, 2012, 2014-2015, 2018-2019, 2022
 #     Russ Allbery <rra@cpan.org>
 #
 # This program is free software; you may redistribute it and/or modify it
@@ -43,27 +43,31 @@ BEGIN {
 local $| = 1;
 
 # Hard-code configuration for Term::Cap to get predictable results.
+#<<<
 local $ENV{COLUMNS}  = 80;
 local $ENV{TERM}     = 'xterm';
 local $ENV{TERMPATH} = File::Spec->catfile('t', 'data', 'termcap');
 local $ENV{TERMCAP}  = 'xterm:co=#80:do=^J:md=\\E[1m:us=\\E[4m:me=\\E[m';
+#>>>
 
 # Find the source of the test file.
-my $INPUT = File::Spec->catfile('t', 'data', 'basic.pod');
+my $input = File::Spec->catfile('t', 'data', 'basic.pod');
 
 # Map of translators to the file containing the formatted output to compare
 # against.
-my %OUTPUT = (
+#<<<
+my %output = (
     'Pod::Man'              => File::Spec->catfile('t', 'data', 'basic.man'),
     'Pod::Text'             => File::Spec->catfile('t', 'data', 'basic.txt'),
     'Pod::Text::Color'      => File::Spec->catfile('t', 'data', 'basic.clr'),
     'Pod::Text::Overstrike' => File::Spec->catfile('t', 'data', 'basic.ovr'),
     'Pod::Text::Termcap'    => File::Spec->catfile('t', 'data', 'basic.cap'),
 );
+#>>>
 
 # Walk through teach of the modules and format the sample file, checking to
 # ensure the results match the pre-generated file.
-for my $module (sort keys %OUTPUT) {
+for my $module (sort keys %output) {
     my $parser = $module->new();
     isa_ok($parser, $module, 'parser object');
 
@@ -71,7 +75,7 @@ for my $module (sort keys %OUTPUT) {
     # instead of a file.
     my $got;
     $parser->output_string(\$got);
-    $parser->parse_file($INPUT);
+    $parser->parse_file($input);
 
     # If the test module is Pod::Man, strip off the header.  This test does
     # not attempt to compare it, since it contains version numbers that
@@ -81,15 +85,15 @@ for my $module (sort keys %OUTPUT) {
     }
 
     # Try to convert on EBCDIC boxes so that the test still works.
-    if (ord "A" == 193 && $module eq 'Pod::Text::Termcap') {
+    if (ord('A') == 193 && $module eq 'Pod::Text::Termcap') {
         $got =~ tr{\033}{\047};
     }
 
     # Check the output.  If it doesn't match, save the erroneous output in a
     # file for later inspection.
-    my $expected = slurp($OUTPUT{$module});
+    my $expected = slurp($output{$module});
     if (!ok($got eq $expected, "$module output is correct")) {
-        my ($suffix) = ($OUTPUT{$module} =~ m{ [.] ([^.]+) \z }xms);
+        my ($suffix) = ($output{$module} =~ m{ [.] ([^.]+) \z }xms);
         my $tmpdir = File::Spec->catdir('t', 'tmp');
         if (!-d $tmpdir) {
             mkdir($tmpdir, 0777);
index 3c5d753..7cd766a 100644 (file)
@@ -38,7 +38,7 @@ if (!-d $tmpdir) {
 }
 
 # Load the tests.
-my $man_data_ref  = read_snippet('man/cpp');
+my $man_data_ref = read_snippet('man/cpp');
 my $text_data_ref = read_snippet('text/cpp');
 
 # Write the POD source to a temporary file for the input file handle.
@@ -50,11 +50,11 @@ close($input) or BAIL_OUT("cannot write to $infile: $!");
 
 # Write the Pod::Man output to a file.
 my $outfile = File::Spec->catfile('t', 'tmp', "tmp$$.man");
-open($input,     '<', $infile)  or BAIL_OUT("cannot open $infile: $!");
+open($input, '<', $infile) or BAIL_OUT("cannot open $infile: $!");
 open(my $output, '>', $outfile) or BAIL_OUT("cannot open $outfile: $!");
 my $parser = Pod::Man->new;
 $parser->parse_from_filehandle($input, $output);
-close($input)  or BAIL_OUT("cannot read from $infile: $!");
+close($input) or BAIL_OUT("cannot read from $infile: $!");
 close($output) or BAIL_OUT("cannot write to $outfile: $!");
 
 # Read the output back in and compare it.
@@ -66,11 +66,11 @@ unlink($outfile);
 
 # Now, do the same drill with Pod::Text.  Parse the input to a temporary file.
 $outfile = File::Spec->catfile('t', 'tmp', "tmp$$.txt");
-open($input,  '<', $infile)  or BAIL_OUT("cannot open $infile: $!");
+open($input, '<', $infile) or BAIL_OUT("cannot open $infile: $!");
 open($output, '>', $outfile) or BAIL_OUT("cannot open $outfile: $!");
 $parser = Pod::Text->new;
 $parser->parse_from_filehandle($input, $output);
-close($input)  or BAIL_OUT("cannot read from $infile: $!");
+close($input) or BAIL_OUT("cannot read from $infile: $!");
 close($output) or BAIL_OUT("cannot write to $outfile: $!");
 
 # Read the output back in and compare it.  Pod::Text adds a trailing blank
index c008499..e5f398f 100644 (file)
@@ -71,8 +71,8 @@ close($input) or BAIL_OUT("cannot write to $infile: $!");
 
 # Now test the pod2text function with a single output.  This will send the
 # results to standard output, so we need to redirect that to a file.
-open($output,         '>',  $outfile) or BAIL_OUT("cannot open $outfile: $!");
-open(my $save_stdout, '>&', STDOUT)   or BAIL_OUT("cannot dup stdout: $!");
+open($output, '>', $outfile) or BAIL_OUT("cannot open $outfile: $!");
+open(my $save_stdout, '>&', STDOUT) or BAIL_OUT("cannot dup stdout: $!");
 open(STDOUT, '>&', $output) or BAIL_OUT("cannot redirect stdout: $!");
 pod2text($infile);
 close($output) or BAIL_OUT("cannot write to $outfile: $!");
index 9254f26..5efacba 100644 (file)
@@ -8,7 +8,8 @@
 
 package Test::Podlators;
 
-use 5.008;
+use 5.010;
+use base qw(Exporter);
 use strict;
 use warnings;
 
@@ -17,22 +18,12 @@ use Exporter;
 use File::Spec;
 use Test::More;
 
-# For Perl 5.006 compatibility.
-## no critic (ClassHierarchies::ProhibitExplicitISA)
+our $VERSION = '2.01';
 
-# Declare variables that should be set in BEGIN for robustness.
-our (@EXPORT_OK, @ISA, $VERSION);
-
-# Set $VERSION and everything export-related in a BEGIN block for robustness
-# against circular module loading (not that we load any modules, but
-# consistency is good).
-BEGIN {
-    @ISA       = qw(Exporter);
-    $VERSION   = '2.01';
-    @EXPORT_OK = qw(
-      read_snippet read_test_data slurp test_snippet test_snippet_with_io
-    );
-}
+# Export the test helper functions.
+our @EXPORT_OK = qw(
+    read_snippet read_test_data slurp test_snippet test_snippet_with_io
+);
 
 # The file handle used to capture STDERR while we mess with file descriptors.
 my $OLD_STDERR;
@@ -45,7 +36,7 @@ my $SAVED_STDERR;
 # scripts trying to create the temporary directory when running tests in
 # parallel.
 sub _stderr_cleanup {
-    if ($SAVED_STDERR && -f $SAVED_STDERR) {
+    if ($SAVED_STDERR && -e $SAVED_STDERR) {
         unlink($SAVED_STDERR);
     }
     return;
@@ -64,12 +55,8 @@ sub _stderr_save {
         mkdir($tmpdir, 0777) or BAIL_OUT("cannot create $tmpdir: $!");
     }
     my $path = File::Spec->catfile($tmpdir, "out$$.err");
-
-    ## no critic(InputOutput::RequireBriefOpen)
     open($OLD_STDERR, '>&', STDERR) or BAIL_OUT("cannot dup STDERR: $!");
     open(STDERR, '>', $path) or BAIL_OUT("cannot redirect STDERR: $!");
-    ## use critic
-
     $SAVED_STDERR = $path;
     return;
 }
@@ -88,7 +75,7 @@ sub _stderr_restore {
 }
 
 # Read one test snippet from the provided relative file name and return it.
-# For the format, see t/data/snippets/README.
+# For the format, see t/data/snippets/README.md.
 #
 # $path     - Relative path to read test data from
 #
@@ -249,13 +236,10 @@ sub slurp {
 sub test_snippet {
     my ($class, $snippet, $options_ref) = @_;
     my $data_ref = read_snippet($snippet);
+    $options_ref //= {};
 
     # Determine the encoding to expect for the output portion of the snippet.
-    my $encoding;
-    if (defined($options_ref)) {
-        $encoding = $options_ref->{encoding};
-    }
-    $encoding ||= 'UTF-8';
+    my $encoding = $options_ref->{encoding} // 'UTF-8';
 
     # Create the formatter object.
     my $parser = $class->new(%{ $data_ref->{options} }, name => 'TEST');
@@ -268,7 +252,7 @@ sub test_snippet {
     $parser->output_string(\$got);
     eval { $parser->parse_string_document($data_ref->{input}) };
     my $exception = $@;
-    my $stderr    = _stderr_restore();
+    my $stderr = _stderr_restore();
 
     # If we were testing Pod::Man, strip off everything prior to .nh from the
     # output so that we aren't testing the generated header.
@@ -280,8 +264,7 @@ sub test_snippet {
     $got =~ s{ \n\s+ \z }{\n}xms;
 
     # Check the output, errors, and any exception.
-    my $expected = decode($encoding, $data_ref->{output});
-    is($got, $expected, "$data_ref->{name}: output");
+    is($got, $data_ref->{output}, "$data_ref->{name}: output");
     if ($data_ref->{errors} || $stderr) {
         is($stderr, $data_ref->{errors} || q{}, "$data_ref->{name}: errors");
     }
@@ -294,6 +277,45 @@ sub test_snippet {
     return;
 }
 
+# Helper function to check the preamble of Pod::Man output.
+#
+# $name     - Name of the test
+# $fh       - File handle with results
+# $encoding - Expected encoding
+#
+# Returns: True if the preamble contains accent definitions
+sub _check_man_preamble {
+    my ($name, $fh, $encoding) = @_;
+    $encoding = lc($encoding);
+
+    # Check the encoding line.
+    my $line = <$fh>;
+    if ($encoding eq 'ascii') {
+        unlike(
+            $line, qr{ mode: [ ] troff }xms,
+            "$name: no preconv coding line",
+        );
+    } else {
+        is(
+            $line,
+            ".\\\" -*- mode: troff; coding: $encoding -*-\n",
+            "$name: preconv coding line",
+        );
+    }
+
+    # Consume the rest of the preamble and check for accent definitions.
+    my $saw_accents;
+    while (defined($line = <$fh>)) {
+        $line = decode($encoding, $line);
+        if ($line =~ m{ Accent [ ] mark [ ] definitions }xms) {
+            $saw_accents = 1;
+        }
+        last if $line =~ m{ \A [.]nh }xms;
+    }
+
+    return $saw_accents;
+}
+
 # Test a formatter with I/O streams on a particular POD snippet.  This does
 # all the work of loading the snippet, creating the formatter, running it, and
 # checking the results, and reports those results with Test::More.  It's
@@ -304,17 +326,25 @@ sub test_snippet {
 # $snippet     - Path to the snippet file defining the test
 # $options_ref - Hash of options with the following keys:
 #   encoding    - Expect the snippet to be in this non-standard encoding
-#   perlio_utf8 - Set to 1 to set a PerlIO UTF-8 encoding on the output file
+#   perlio_utf8 - Set to 1 to set PerlIO UTF-8 encoding on the output file
+#   perlio_iso  - Set to 1 to set PerlIO ISO 8859-1 encoding on the output file
+#   output      - Expect the output to be in this non-standard encoding
 sub test_snippet_with_io {
     my ($class, $snippet, $options_ref) = @_;
+    $options_ref //= {};
     my $data_ref = read_snippet($snippet);
 
     # Determine the encoding to expect for the output portion of the snippet.
-    my $encoding;
-    if (defined($options_ref)) {
-        $encoding = $options_ref->{encoding};
+    my $encoding = $options_ref->{encoding} // 'UTF-8';
+
+    # Determine the encoding to expect for the actual output.
+    my $outencoding = $options_ref->{output} // 'UTF-8';
+
+    # Additional test output based on whether we're using PerlIO.
+    my $perlio = q{};
+    if ($options_ref->{perlio_utf8} || $options_ref->{perlio_iso}) {
+        $perlio = ' (PerlIO)';
     }
-    $encoding ||= 'UTF-8';
 
     # Create the formatter object.
     my $parser = $class->new(%{ $data_ref->{options} }, name => 'TEST');
@@ -342,28 +372,29 @@ sub test_snippet_with_io {
         ## no critic (ValuesAndExpressions::RequireInterpolationOfMetachars)
         eval 'binmode($output, ":encoding(utf-8)")';
         ## use critic
+    } elsif ($options_ref->{perlio_iso}) {
+        ## no critic (BuiltinFunctions::ProhibitStringyEval)
+        ## no critic (ValuesAndExpressions::RequireInterpolationOfMetachars)
+        eval 'binmode($output, ":encoding(iso-8859-1)")';
+        ## use critic
     }
 
     # Parse the input file into the output file.
     $parser->parse_from_file($input_file, $output);
     close($output) or BAIL_OUT("cannot flush output to $output_file: $!");
 
-    # Read back in the results.  For Pod::Man, also ensure that we didn't
-    # output the accent definitions if we wrote UTF-8 output.
+    # Read back in the results.  For Pod::Man, also check the coding line, and
+    # ensure that we didn't output the accent definitions if we wrote UTF-8
+    # output.
     open(my $results, '<', $output_file)
       or BAIL_OUT("cannot open $output_file: $!");
-    my ($line, $saw_accents);
+    my $saw_accents;
     if ($class eq 'Pod::Man') {
-        while (defined($line = <$results>)) {
-            $line = decode('UTF-8', $line);
-            if ($line =~ m{ Accent [ ] mark [ ] definitions }xms) {
-                $saw_accents = 1;
-            }
-            last if $line =~ m{ \A [.]nh }xms;
-        }
+        my $name = $data_ref->{name};
+        $saw_accents = _check_man_preamble($name, $results, $outencoding);
     }
     my $saw = do { local $/ = undef; <$results> };
-    $saw = decode('UTF-8', $saw);
+    $saw = decode($outencoding, $saw);
     $saw =~ s{ \n\s+ \z }{\n}xms;
     close($results) or BAIL_OUT("cannot close output file: $!");
 
@@ -371,18 +402,17 @@ sub test_snippet_with_io {
     unlink($input_file, $output_file);
 
     # Check the accent definitions and the output.
-    my $perlio = $options_ref->{perlio_utf8} ? ' (PerlIO)' : q{};
     if ($class eq 'Pod::Man') {
         is(
             $saw_accents,
-            $data_ref->{options}{utf8} ? undef : 1,
-            "$data_ref->{name}: accent definitions$perlio"
+            ($data_ref->{options}{encoding} || q{}) eq 'roff' ? 1 : undef,
+            "$data_ref->{name}: accent definitions$perlio",
         );
     }
     is(
         $saw,
         decode($encoding, $data_ref->{output}),
-        "$data_ref->{name}: output$perlio"
+        "$data_ref->{name}: output$perlio",
     );
     return;
 }
@@ -513,11 +543,34 @@ the output portion of the snippet.
 
 The same as test_snippet(), except, rather than parsing the input into a
 string buffer, this function uses real, temporary input and output files.
-This can be used to test I/O layer handling and proper encoding.
+This can be used to test I/O layer handling and proper encoding.  It also
+does additional tests for the preamble to the *roff output.
+
+OPTIONS, if present, is a reference to a hash of options chosen from the
+following:
+
+=over 4
+
+=item encoding
 
-OPTIONS, if present, is a reference to a hash of options.  Currently, only one
-key is supported: C<perlio_utf8>, which, if set to true, will set a PerlIO
-UTF-8 encoding layer on the output file before writing to it.
+The encoding to expect from the snippet file.  Default if not specified is
+UTF-8.
+
+=item output
+
+The encoding to expect from the output.  Default if not specified is UTF-8.
+
+=item perlio_iso
+
+If set to true, set a PerlIO ISO-8859-1 encoding layer on the output file
+before writing to it.
+
+=item perlio_utf8
+
+If set to true, set a PerlIO UTF-8 encoding layer on the output file before
+writing to it.
+
+=back
 
 =back
 
@@ -527,7 +580,7 @@ Russ Allbery <rra@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-Copyright 2015-2016, 2018-2020 Russ Allbery <rra@cpan.org>
+Copyright 2015-2016, 2018-2020, 2022 Russ Allbery <rra@cpan.org>
 
 This program is free software; you may redistribute it and/or modify it
 under the same terms as Perl itself.
index 1d5e4db..a66ef4d 100644 (file)
@@ -10,7 +10,7 @@
 
 package Test::RRA;
 
-use 5.008;
+use 5.010;
 use base qw(Exporter);
 use strict;
 use warnings;
@@ -46,13 +46,13 @@ our (@EXPORT_OK, $VERSION);
 # consistency is good).
 BEGIN {
     @EXPORT_OK = qw(
-      is_file_contents skip_unless_author skip_unless_automated use_prereq
+        is_file_contents skip_unless_author skip_unless_automated use_prereq
     );
 
     # This version should match the corresponding rra-c-util release, but with
     # two digits for the minor version, including a leading zero if necessary,
     # so that it will sort properly.
-    $VERSION = '8.01';
+    $VERSION = '10.03';
 }
 
 # Compare a string to the contents of a file, similar to the standard is()
@@ -83,11 +83,11 @@ sub is_file_contents {
     eval {
         require IPC::System::Simple;
 
-        my $tmp     = File::Temp->new();
+        my $tmp = File::Temp->new();
         my $tmpname = $tmp->filename;
         print {$tmp} $got or BAIL_OUT("Cannot write to $tmpname: $!\n");
         my @command = ('diff', '-u', $expected, $tmpname);
-        my $diff    = IPC::System::Simple::capturex([0 .. 1], @command);
+        my $diff = IPC::System::Simple::capturex([0 .. 1], @command);
         diag($diff);
     };
     if ($@) {
@@ -165,15 +165,15 @@ sub use_prereq {
     ## no critic (ValuesAndExpressions::ProhibitImplicitNewlines)
     my ($result, $error, $sigdie);
     {
-        local $@            = undef;
-        local $!            = undef;
+        local $@ = undef;
+        local $! = undef;
         local $SIG{__DIE__} = undef;
         $result = eval qq{
             package $package;
             use $module $version \@imports;
             1;
         };
-        $error  = $@;
+        $error = $@;
         $sigdie = $SIG{__DIE__} || undef;
     }
 
@@ -196,7 +196,7 @@ __END__
 
 =for stopwords
 Allbery Allbery's DESC bareword sublicense MERCHANTABILITY NONINFRINGEMENT
-rra-c-util CPAN
+rra-c-util CPAN diff
 
 =head1 NAME
 
@@ -238,6 +238,14 @@ should be explicitly imported.
 
 =over 4
 
+=item is_file_contents(GOT, EXPECTED, MESSAGE)
+
+Check a string against the contents of a file, showing the differences if any
+using diff (if IPC::System::Simple and diff are available).  GOT is the output
+the test received.  EXPECTED is the path to a file containing the expected
+output (not the output itself).  MESSAGE is a message to display alongside the
+test results.
+
 =item skip_unless_author(DESC)
 
 Checks whether AUTHOR_TESTING is set in the environment and skips the whole
@@ -275,7 +283,7 @@ Russ Allbery <eagle@eyrie.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-Copyright 2016, 2018-2019 Russ Allbery <eagle@eyrie.org>
+Copyright 2016, 2018-2019, 2021 Russ Allbery <eagle@eyrie.org>
 
 Copyright 2013-2014 The Board of Trustees of the Leland Stanford Junior
 University
index 80a1573..3c44442 100644 (file)
@@ -9,7 +9,7 @@
 
 package Test::RRA::Config;
 
-use 5.008;
+use 5.010;
 use base qw(Exporter);
 use strict;
 use warnings;
@@ -24,15 +24,15 @@ our (@EXPORT_OK, $VERSION);
 # consistency is good).
 BEGIN {
     @EXPORT_OK = qw(
-      $COVERAGE_LEVEL @COVERAGE_SKIP_TESTS @CRITIC_IGNORE $LIBRARY_PATH
-      $MINIMUM_VERSION %MINIMUM_VERSION @MODULE_VERSION_IGNORE
-      @POD_COVERAGE_EXCLUDE @STRICT_IGNORE @STRICT_PREREQ
+        $COVERAGE_LEVEL @COVERAGE_SKIP_TESTS @CRITIC_IGNORE $LIBRARY_PATH
+        $MINIMUM_VERSION %MINIMUM_VERSION @MODULE_VERSION_IGNORE
+        @POD_COVERAGE_EXCLUDE @STRICT_IGNORE @STRICT_PREREQ
     );
 
     # This version should match the corresponding rra-c-util release, but with
     # two digits for the minor version, including a leading zero if necessary,
     # so that it will sort properly.
-    $VERSION = '8.01';
+    $VERSION = '10.03';
 }
 
 # If C_TAP_BUILD or C_TAP_SOURCE are set in the environment, look for
@@ -58,7 +58,7 @@ our $COVERAGE_LEVEL = 100;
 our @COVERAGE_SKIP_TESTS;
 our @CRITIC_IGNORE;
 our $LIBRARY_PATH;
-our $MINIMUM_VERSION = '5.008';
+our $MINIMUM_VERSION = '5.010';
 our %MINIMUM_VERSION;
 our @MODULE_VERSION_IGNORE;
 our @POD_COVERAGE_EXCLUDE;
@@ -121,9 +121,9 @@ this setting.
 
 =item @CRITIC_IGNORE
 
-Additional directories to ignore when doing recursive perlcritic testing.  The
-contents of this directory must be either top-level directory names or
-directory names starting with F<tests/>.
+Additional files or directories to ignore when doing recursive perlcritic
+testing.  To ignore files that will be installed, the path should start with
+F<blib>.
 
 =item $LIBRARY_PATH
 
@@ -135,7 +135,7 @@ that Perl scripts can pass a syntax check.
 =item $MINIMUM_VERSION
 
 Default minimum version requirement for included Perl scripts.  If not given,
-defaults to 5.008.
+defaults to 5.010.
 
 =item %MINIMUM_VERSION
 
@@ -183,7 +183,7 @@ Russ Allbery <eagle@eyrie.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-Copyright 2015-2016, 2019 Russ Allbery <eagle@eyrie.org>
+Copyright 2015-2016, 2019, 2021 Russ Allbery <eagle@eyrie.org>
 
 Copyright 2013-2014 The Board of Trustees of the Leland Stanford Junior
 University
index fc8bfbc..db75829 100644 (file)
@@ -8,7 +8,7 @@
 
 package Test::RRA::ModuleVersion;
 
-use 5.008;
+use 5.010;
 use base qw(Exporter);
 use strict;
 use warnings;
@@ -29,7 +29,7 @@ BEGIN {
     # This version should match the corresponding rra-c-util release, but with
     # two digits for the minor version, including a leading zero if necessary,
     # so that it will sort properly.
-    $VERSION = '8.01';
+    $VERSION = '10.03';
 }
 
 # A regular expression matching the version string for a module using the
@@ -103,9 +103,7 @@ sub _module_version {
     my ($file) = @_;
     open(my $data, q{<}, $file) or die "$0: cannot open $file: $!\n";
     while (defined(my $line = <$data>)) {
-        if (   $line =~ $REGEX_VERSION_PACKAGE
-            || $line =~ $REGEX_VERSION_OLD)
-        {
+        if ($line =~ $REGEX_VERSION_PACKAGE || $line =~ $REGEX_VERSION_OLD) {
             my ($prefix, $version, $suffix) = ($1, $2, $3);
             close($data) or die "$0: error reading from $file: $!\n";
             return $version;
@@ -135,13 +133,13 @@ sub _update_module_version {
     }
 
     # Scan for the version and replace it.
-    open(my $in,  q{<}, $file) or die "$0: cannot open $file: $!\n";
+    open(my $in, q{<}, $file) or die "$0: cannot open $file: $!\n";
     open(my $out, q{>}, "$file.new")
       or die "$0: cannot create $file.new: $!\n";
   SCAN:
     while (defined(my $line = <$in>)) {
-        if (   $line =~ s{ $REGEX_VERSION_PACKAGE }{$1$version$3}xms
-            || $line =~ s{ $REGEX_VERSION_OLD     }{$1$old_version$3}xms)
+        if ($line =~ s{ $REGEX_VERSION_PACKAGE }{$1$version$3}xms
+            || $line =~ s{ $REGEX_VERSION_OLD }{$1$old_version$3}xms)
         {
             print {$out} $line or die "$0: cannot write to $file.new: $!\n";
             last SCAN;
@@ -151,8 +149,8 @@ sub _update_module_version {
 
     # Copy the rest of the input file to the output file.
     print {$out} <$in> or die "$0: cannot write to $file.new: $!\n";
-    close($out)        or die "$0: cannot flush $file.new: $!\n";
-    close($in)         or die "$0: error reading from $file: $!\n";
+    close($out) or die "$0: cannot flush $file.new: $!\n";
+    close($in) or die "$0: error reading from $file: $!\n";
 
     # All done.  Rename the new file over top of the old file.
     rename("$file.new", $file)
@@ -265,7 +263,7 @@ Russ Allbery <eagle@eyrie.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-Copyright 2016, 2018-2019 Russ Allbery <eagle@eyrie.org>
+Copyright 2016, 2018-2020, 2022 Russ Allbery <eagle@eyrie.org>
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal
index 4729e0b..f211dcc 100644 (file)
@@ -5,7 +5,7 @@
 # that it's identical.  It also tests special handling of the POD_MAN_DATE
 # and SOURCE_DATE_EPOCH environment variables.
 #
-# Copyright 2009, 2014-2015, 2018-2019 Russ Allbery <rra@cpan.org>
+# Copyright 2009, 2014-2015, 2018-2019, 2022 Russ Allbery <rra@cpan.org>
 #
 # This program is free software; you may redistribute it and/or modify it
 # under the same terms as Perl itself.
@@ -22,8 +22,8 @@ use POSIX qw(strftime);
 use Test::More tests => 6;
 
 # Start with environment variables affecting the date stripped.
-local $ENV{SOURCE_DATE_EPOCH};
-local $ENV{POD_MAN_DATE};
+local $ENV{SOURCE_DATE_EPOCH} = undef;
+local $ENV{POD_MAN_DATE} = undef;
 
 # Check that the results of device_date matches strftime.  There is no input
 # file name, so this will use the current time.
@@ -31,7 +31,7 @@ my $parser = Pod::Man->new;
 is(
     $parser->devise_date,
     strftime('%Y-%m-%d', gmtime()),
-    'devise_date matches strftime'
+    'devise_date matches strftime',
 );
 
 # Set the override environment variable and ensure that it's honored.
@@ -43,21 +43,23 @@ local $ENV{POD_MAN_DATE} = q{};
 is($parser->devise_date, q{}, 'devise_date honors empty POD_MAN_DATE');
 
 # Set another environment variable and ensure that it's honored.
-local $ENV{POD_MAN_DATE};
+local $ENV{POD_MAN_DATE} = undef;
 local $ENV{SOURCE_DATE_EPOCH} = 1439390140;
 is($parser->devise_date, '2015-08-12', 'devise_date honors SOURCE_DATE_EPOCH');
 
 # Check that POD_MAN_DATE overrides SOURCE_DATE_EPOCH
-local $ENV{POD_MAN_DATE}      = '2013-01-01';
+local $ENV{POD_MAN_DATE} = '2013-01-01';
 local $ENV{SOURCE_DATE_EPOCH} = 1482676620;
-is($parser->devise_date, '2013-01-01',
-   'devise_date honors POD_MAN_DATE over SOURCE_DATE_EPOCH');
+is(
+    $parser->devise_date, '2013-01-01',
+    'devise_date honors POD_MAN_DATE over SOURCE_DATE_EPOCH',
+);
 
 # Check that an invalid SOURCE_DATE_EPOCH is not accepted
-local $ENV{POD_MAN_DATE};
+local $ENV{POD_MAN_DATE} = undef;
 local $ENV{SOURCE_DATE_EPOCH} = '1482676620B';
 is(
     $parser->devise_date,
     strftime('%Y-%m-%d', gmtime()),
-    'devise_date ignores invalid SOURCE_DATE_EPOCH'
+    'devise_date ignores invalid SOURCE_DATE_EPOCH',
 );
index c38254e..3c6ef23 100644 (file)
@@ -2,14 +2,14 @@
 #
 # Test Pod::Man with a document that produces only errors.
 #
-# Copyright 2013, 2016, 2018-2019 Russ Allbery <rra@cpan.org>
+# Copyright 2013, 2016, 2018-2019, 2022 Russ Allbery <rra@cpan.org>
 #
 # This program is free software; you may redistribute it and/or modify it
 # under the same terms as Perl itself.
 #
 # SPDX-License-Identifier: GPL-1.0-or-later OR Artistic-1.0-Perl
 
-use 5.008;
+use 5.010;
 use strict;
 use warnings;
 
@@ -31,12 +31,12 @@ local $SIG{__WARN__} = sub { croak($_[0]) };
 
 # Try a POD document where the only command is invalid.  Make sure it succeeds
 # and doesn't throw an exception.
-## no critic (ValuesAndExpressions::ProhibitEscapedCharacters)
-my $invalid_char = chr utf8::unicode_to_native(0xa0);
-ok(eval { $parser->parse_string_document("=$invalid_char") },
-    'Parsed invalid document');
+my $invalid_char = chr(utf8::unicode_to_native(0xa0));
+ok(
+    eval { $parser->parse_string_document("=$invalid_char") },
+    'Parsed invalid document',
+);
 is($@, q{}, '...with no errors');
-## use critic
 
 # With recent Pod::Simple, there will be a POD ERRORS section.  With older
 # versions of Pod::Simple, we have to skip the test since it doesn't trigger
@@ -48,7 +48,7 @@ SKIP: {
     like(
         $output,
         qr{ [.]SH [ ] "POD [ ] ERRORS" }xms,
-        '...and output contains a POD ERRORS section'
+        '...and output contains a POD ERRORS section',
     );
 }
 
@@ -64,6 +64,6 @@ SKIP: {
     like(
         $output,
         qr{ [.]SH [ ] "POD [ ] ERRORS" }xms,
-        '...and output contains a POD ERRORS section'
+        '...and output contains a POD ERRORS section',
     );
 }
index f896402..dea3176 100644 (file)
@@ -2,7 +2,7 @@
 #
 # Additional tests for Pod::Man heading generation.
 #
-# Copyright 2002, 2004, 2006, 2008-2009, 2012, 2015, 2018-2019
+# Copyright 2002, 2004, 2006, 2008-2009, 2012, 2015, 2018-2019, 2022
 #     Russ Allbery <rra@cpan.org>
 #
 # This program is free software; you may redistribute it and/or modify it
@@ -16,7 +16,7 @@ use warnings;
 
 use lib 't/lib';
 
-use Test::More tests => 9;
+use Test::More tests => 11;
 use Test::Podlators qw(read_test_data);
 
 BEGIN {
@@ -25,6 +25,7 @@ BEGIN {
 
 # Loop through all the test data, generate output, and compare it to the
 # desired output data.
+my $testnum = 1;
 while (defined(my $data = read_test_data(\*DATA, { options => 1 }))) {
     my $parser = Pod::Man->new(%{ $data->{options} });
     isa_ok($parser, 'Pod::Man', 'Parser object');
@@ -38,7 +39,8 @@ while (defined(my $data = read_test_data(\*DATA, { options => 1 }))) {
     my ($heading) = ($got =~ m{^ ([.]TH [^\n]+ \n)}xms);
 
     # Compare the results.
-    is($heading, $data->{output});
+    is($heading, $data->{output}, "Test $testnum");
+    $testnum++;
 }
 
 # Below the marker are sets of options, the input data, and the corresponding
@@ -55,7 +57,7 @@ release 1.0
 
 test - Test man page
 ###
-.TH STDIN 1 "2009-01-17" "1.0" "User Contributed Perl Documentation"
+.TH STDIN 1 2009-01-17 1.0 "User Contributed Perl Documentation"
 ###
 
 ###
@@ -68,7 +70,7 @@ release 2.0-beta
 
 test - Test man page
 ###
-.TH TEST 8 "2009-01-17" "2.0-beta" "User Contributed Perl Documentation"
+.TH TEST 8 2009-01-17 2.0-beta "User Contributed Perl Documentation"
 ###
 
 ###
@@ -80,7 +82,7 @@ center Testing Documentation
 
 test - Test man page
 ###
-.TH STDIN 1 "2009-01-17" "1.0" "Testing Documentation"
+.TH STDIN 1 2009-01-17 1.0 "Testing Documentation"
 ###
 
 ###
@@ -94,3 +96,17 @@ test - Test man page
 ###
 .TH STDIN 1 "" "" ""
 ###
+
+###
+date foo ""bar""
+release "quoted"
+section 4"
+name "BAR
+center Something
+###
+=head1 NAME
+
+test - Test man page
+###
+.TH """BAR" "4""" "foo """"bar""""" """quoted""" Something
+###
index 209509f..108e0b3 100644 (file)
@@ -1,20 +1,22 @@
 #!/usr/bin/perl
 #
-# Test for graceful degradation to non-utf8 output without Encode module.
+# Test for graceful degradation to non-UTF-8 output without Encode module.
 #
 # Copyright 2016 Niko Tyni <ntyni@iki.fi>
-# Copyright 2016, 2018-2019 Russ Allbery <rra@cpan.org>
+# Copyright 2016, 2018-2019, 2022 Russ Allbery <rra@cpan.org>
 #
 # This program is free software; you may redistribute it and/or modify it
 # under the same terms as Perl itself.
 #
 # SPDX-License-Identifier: GPL-1.0-or-later OR Artistic-1.0-Perl
 
-use 5.008;
+use 5.010;
 use strict;
 use warnings;
 
-use Test::More tests => 5;
+use Carp qw(croak);
+
+use Test::More tests => 8;
 
 # Remove the record of the Encode module being loaded if it already was (it
 # may have been loaded before the test suite runs), and then make it
@@ -24,7 +26,7 @@ BEGIN {
     delete $INC{'Encode.pm'};
     my $reject_encode = sub {
         if ($_[1] eq 'Encode.pm') {
-            die "refusing to load Encode\n";
+            croak('refusing to load Encode');
         }
     };
     unshift(@INC, $reject_encode);
@@ -38,41 +40,70 @@ BEGIN {
 
 # Ensure we don't get warnings by throwing an exception if we see any.  This
 # is overridden below when we enable utf8 and do expect a warning.
-local $SIG{__WARN__} = sub { die join("\n",
-                                      "No warnings expected; instead got:",
-                                      @_);
-                           };
-# First, check that everything works properly when utf8 isn't set.  We expect
-# to get accent-mangled ASCII output.  Don't use Test::Podlators, since it
-# wants to import Encode.
-#
-## no critic (ValuesAndExpressions::ProhibitEscapedCharacters)
-my $pod = "=encoding latin1\n\n=head1 NAME\n\nBeyonc"
-        . chr(utf8::unicode_to_native(0xE9))
-        . "!";
-my $parser = Pod::Man->new(utf8 => 0, name => 'test');
+local $SIG{__WARN__} = sub {
+    my @warnings = @_;
+    croak(join("\n", 'No warnings expected; instead got:', @warnings));
+};
+
+# First, check that everything works properly if an encoding of roff is set.
+# We expect to get accent-mangled ASCII output.  Don't use Test::Podlators,
+# since it wants to import Encode.
+my $invalid_char = chr(utf8::unicode_to_native(0xE9));
+my $pod = "=encoding latin1\n\n=head1 NAME\n\nBeyonc${invalid_char}!";
+my $parser = Pod::Man->new(name => 'test', encoding => 'roff');
 my $output;
 $parser->output_string(\$output);
 $parser->parse_string_document($pod);
 like(
     $output,
     qr{ Beyonce\\[*]\' }xms,
-    'Works without Encode for non-utf8 output'
+    'Works without Encode for roff encoding',
+);
+
+# Likewise for an encoding of groff.
+$parser = Pod::Man->new(name => 'test', encoding => 'groff');
+my $output_groff = q{};
+$parser->output_string(\$output_groff);
+$parser->parse_string_document($pod);
+like(
+    $output_groff,
+    qr{ Beyonc\\\[u00E9\] }xms,
+    'Works without Encode for groff encoding',
 );
 
-# Now, try with the utf8 option set.  We should then get a warning that we're
-# falling back to non-utf8 output.
+# The default output format is UTF-8, so it should produce an error message
+# and then degrade to groff.
 {
     local $SIG{__WARN__} = sub {
         like(
             $_[0],
-            qr{ falling [ ] back [ ] to [ ] non-utf8 }xms,
-            'Pod::Man warns on utf8 option with no Encode module'
+            qr{ falling [ ] back [ ] to [ ] groff [ ] escapes }xms,
+            'Pod::Man warns with no Encode module',
         );
     };
-    $parser = Pod::Man->new(utf8 => 1, name => 'test');
+    $parser = Pod::Man->new(name => 'test');
 }
-my $output_fallback;
-$parser->output_string(\$output_fallback);
+$output = q{};
+$parser->output_string(\$output);
 $parser->parse_string_document($pod);
-is($output_fallback, $output, 'Degraded gracefully to non-utf8 output');
+is($output, $output_groff, 'Degraded gracefull to groff output');
+
+# Now try with an explicit output encoding, which should produce an error
+# message and then degrade to groff.
+{
+    local $SIG{__WARN__} = sub {
+        like(
+            $_[0],
+            qr{ falling [ ] back [ ] to [ ] groff [ ] escapes }xms,
+            'Pod::Man warns with no Encode module',
+        );
+    };
+    $parser = Pod::Man->new(name => 'test', encoding => 'iso-8859-1');
+}
+$output = q{};
+$parser->output_string(\$output);
+$parser->parse_string_document($pod);
+is(
+    $output, $output_groff,
+    'Explicit degraded gracefully to groff output',
+);
index 76e21b9..a3a401f 100644 (file)
@@ -2,7 +2,7 @@
 #
 # Test Pod::Man UTF-8 handling, with and without PerlIO.
 #
-# Copyright 2002, 2004, 2006, 2008-2010, 2012, 2014-2015, 2018-2020
+# Copyright 2002, 2004, 2006, 2008-2010, 2012, 2014-2015, 2018-2020, 2022
 #     Russ Allbery <rra@cpan.org>
 #
 # This program is free software; you may redistribute it and/or modify it
@@ -16,7 +16,7 @@ use warnings;
 
 use lib 't/lib';
 
-use Test::More tests => 13;
+use Test::More tests => 17;
 use Test::Podlators qw(test_snippet_with_io);
 
 # Load the module.
index 0f39e56..7b7edee 100644 (file)
@@ -2,7 +2,7 @@
 #
 # Tests for Pod::ParseLink.
 #
-# Copyright 2001, 2009, 2018, 2020 by Russ Allbery <rra@cpan.org>
+# Copyright 2001, 2009, 2018, 2020, 2022 by Russ Allbery <rra@cpan.org>
 #
 # This program is free software; you may redistribute it and/or modify it
 # under the same terms as Perl itself.
@@ -21,6 +21,7 @@ BEGIN {
 
 # The format of each entry in this array is the L<> text followed by the
 # five-element parse returned by parselink.
+#<<<
 our @TESTS = (
     ['foo'           => (undef, 'foo',              'foo', undef,     'pod')],
     ['foo|bar'       => ('foo', 'foo',              'bar', undef,     'pod')],
@@ -28,18 +29,18 @@ our @TESTS = (
     ['foo/"baz boo"' => (undef, '"baz boo" in foo', 'foo', 'baz boo', 'pod')],
     ['/bar'          => (undef, '"bar"',            undef, 'bar',     'pod')],
     ['/"baz boo"'    => (undef, '"baz boo"',        undef, 'baz boo', 'pod')],
-    ['/baz boo',     => (undef, '"baz boo"',        undef, 'baz boo', 'pod')],
+    ['/baz boo'      => (undef, '"baz boo"',        undef, 'baz boo', 'pod')],
     [
         'foo bar/baz boo' =>
-          (undef, '"baz boo" in foo bar', 'foo bar', 'baz boo', 'pod')
+          (undef, '"baz boo" in foo bar', 'foo bar', 'baz boo', 'pod'),
     ],
     [
         'foo bar  /  baz boo' =>
-          (undef, '"baz boo" in foo bar', 'foo bar', 'baz boo', 'pod')
+          (undef, '"baz boo" in foo bar', 'foo bar', 'baz boo', 'pod'),
     ],
     [
         "foo\nbar\nbaz\n/\nboo" =>
-          (undef, '"boo" in foo bar baz', 'foo bar baz', 'boo', 'pod')
+          (undef, '"boo" in foo bar baz', 'foo bar baz', 'boo', 'pod'),
     ],
     ['anchor|name/section' => qw(anchor anchor name section pod)],
     ['"boo var baz"' => (undef, '"boo var baz"', undef, 'boo var baz', 'pod')],
@@ -49,16 +50,16 @@ our @TESTS = (
             undef, '"boo bar baz / baz boo"',
             undef, 'boo bar baz / baz boo',
             'pod',
-        )
+        ),
     ],
     ['fooZ<>bar' => (undef, 'fooZ<>bar', 'fooZ<>bar', undef, 'pod')],
     [
         'Testing I<italics>|foo/bar' =>
-          ('Testing I<italics>', 'Testing I<italics>', 'foo', 'bar', 'pod')
+          ('Testing I<italics>', 'Testing I<italics>', 'foo', 'bar', 'pod'),
     ],
     [
         'foo/I<Italic> text' =>
-          (undef, '"I<Italic> text" in foo', 'foo', 'I<Italic> text', 'pod')
+          (undef, '"I<Italic> text" in foo', 'foo', 'I<Italic> text', 'pod'),
     ],
     [
         'fooE<verbar>barZ<>/Section C<with> I<B<other> markup' => (
@@ -67,29 +68,29 @@ our @TESTS = (
             'fooE<verbar>barZ<>',
             'Section C<with> I<B<other> markup',
             'pod',
-        )
+        ),
     ],
     [
         'Nested L<http://www.perl.org/>|fooE<sol>bar' => (
             'Nested L<http://www.perl.org/>',
             'Nested L<http://www.perl.org/>',
             'fooE<sol>bar', undef, 'pod',
-        )
+        ),
     ],
     ['ls(1)' => (undef, 'ls(1)', 'ls(1)', undef, 'man')],
     [
         '  perlfunc(1)/open  ' =>
-          (undef, '"open" in perlfunc(1)', 'perlfunc(1)', 'open', 'man')
+          (undef, '"open" in perlfunc(1)', 'perlfunc(1)', 'open', 'man'),
     ],
     [
         'some manual page|perl(1)' =>
-          ('some manual page', 'some manual page', 'perl(1)', undef, 'man')
+          ('some manual page', 'some manual page', 'perl(1)', undef, 'man'),
     ],
     [
         'http://www.perl.org/' => (
             undef, 'http://www.perl.org/', 'http://www.perl.org/', undef,
             'url',
-        )
+        ),
     ],
     [
         'news:yld72axzc8.fsf@windlord.stanford.edu' => (
@@ -97,24 +98,25 @@ our @TESTS = (
             'news:yld72axzc8.fsf@windlord.stanford.edu',
             'news:yld72axzc8.fsf@windlord.stanford.edu',
             undef, 'url',
-        )
+        ),
     ],
     [
         'link|http://www.perl.org/' =>
-          ('link', 'link', 'http://www.perl.org/', undef, 'url')
+          ('link', 'link', 'http://www.perl.org/', undef, 'url'),
     ],
     [
         '0|http://www.perl.org/' =>
-          ('0', '0', 'http://www.perl.org/', undef, 'url')
+          ('0', '0', 'http://www.perl.org/', undef, 'url'),
     ],
     ['0|Pod::Parser' => ('0', '0', 'Pod::Parser', undef, 'pod')],
 );
+#>>>
 
 # Run all of the tests.
 for my $test (@TESTS) {
     my ($link, @expected) = @$test;
     my @results = parselink($link);
-    my $pretty  = $link;
+    my $pretty = $link;
     $pretty =~ s{\n}{\\n}xmsg;
     is_deeply(\@results, \@expected, $pretty);
 }
index 861367d..6a5aa89 100644 (file)
@@ -6,7 +6,7 @@
 # which can be found at <https://www.eyrie.org/~eagle/software/rra-c-util/>.
 #
 # Written by Russ Allbery <eagle@eyrie.org>
-# Copyright 2019 Russ Allbery <eagle@eyrie.org>
+# Copyright 2019, 2021 Russ Allbery <eagle@eyrie.org>
 # Copyright 2013-2014
 #     The Board of Trustees of the Leland Stanford Junior University
 #
@@ -30,7 +30,7 @@
 #
 # SPDX-License-Identifier: MIT
 
-use 5.008;
+use 5.010;
 use strict;
 use warnings;
 
index 035b596..2601f81 100644 (file)
@@ -11,7 +11,7 @@
 #
 # SPDX-License-Identifier: MIT
 
-use 5.008;
+use 5.010;
 use strict;
 use warnings;
 
@@ -42,9 +42,9 @@ if (@ARGV) {
 # Throws: Text exception if MYMETA.json is not found or doesn't contain a
 #         version
 sub dist_version {
-    my $json     = JSON::PP->new->utf8(1);
+    my $json = JSON::PP->new->utf8(1);
     my $metadata = $json->decode(scalar(slurp('MYMETA.json')));
-    my $version  = $metadata->{version};
+    my $version = $metadata->{version};
     if (!defined($version)) {
         die "$0: cannot find version number in MYMETA.json\n";
     }
@@ -81,9 +81,9 @@ B<module-version.t> [B<--update>]
 
 =head1 REQUIREMENTS
 
-Perl 5.6.0 or later, the Perl6::Slurp module, and the JSON::PP Perl module,
-both of which are available from CPAN.  JSON::PP is also included in Perl core
-in Perl 5.14 and later.
+Perl 5.8 or later, the Perl6::Slurp module, and the JSON::PP Perl module, both
+of which are available from CPAN.  JSON::PP is also included in Perl core in
+Perl 5.14 and later.
 
 =head1 DESCRIPTION
 
@@ -121,7 +121,7 @@ Russ Allbery <eagle@eyrie.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-Copyright 2014-2016, 2019 Russ Allbery <eagle@eyrie.org>
+Copyright 2014-2016, 2019-2021 Russ Allbery <eagle@eyrie.org>
 
 Copyright 2013-2014 The Board of Trustees of the Leland Stanford Junior
 University
index a87c1fa..a2f5b99 100644 (file)
@@ -6,7 +6,7 @@
 # which can be found at <https://www.eyrie.org/~eagle/software/rra-c-util/>.
 #
 # Written by Russ Allbery <eagle@eyrie.org>
-# Copyright 2016, 2018-2019 Russ Allbery <eagle@eyrie.org>
+# Copyright 2016, 2018-2021 Russ Allbery <eagle@eyrie.org>
 # Copyright 2013-2014
 #     The Board of Trustees of the Leland Stanford Junior University
 #
@@ -30,7 +30,7 @@
 #
 # SPDX-License-Identifier: MIT
 
-use 5.008;
+use 5.010;
 use strict;
 use warnings;
 
@@ -59,7 +59,7 @@ my %EXCLUDE = map { $_ => 1 } qw(.git blib);
 # Returns: 1 if it should be checked, undef otherwise.
 sub should_check {
     my ($file) = @_;
-    return   if $EXCLUDE{$file};
+    return if $EXCLUDE{$file};
     return 1 if -d $file;
     return 1 if $file =~ m{ [.] PL \z }xms;
     return;
index 598e0b5..33ce757 100644 (file)
@@ -2,7 +2,7 @@
 #
 # Test Pod::Text::Termcap behavior with various snippets.
 #
-# Copyright 2002, 2004, 2006, 2009, 2012-2014, 2018-2019
+# Copyright 2002, 2004, 2006, 2009, 2012-2014, 2018-2019, 2022
 #     Russ Allbery <rra@cpan.org>
 #
 # This program is free software; you may redistribute it and/or modify it
@@ -25,10 +25,10 @@ BEGIN {
 }
 
 # Hard-code a few values to try to get reproducible results.
-$ENV{COLUMNS}  = 80;
-$ENV{TERM}     = 'xterm';
-$ENV{TERMPATH} = File::Spec->catfile('t', 'data', 'termcap');
-$ENV{TERMCAP}  = 'xterm:co=#80:do=^J:md=\E[1m:us=\E[4m:me=\E[m';
+local $ENV{COLUMNS} = 80;
+local $ENV{TERM} = 'xterm';
+local $ENV{TERMPATH} = File::Spec->catfile('t', 'data', 'termcap');
+local $ENV{TERMCAP} = 'xterm:co=#80:do=^J:md=\\E[1m:us=\\E[4m:me=\\E[m';
 
 # Check the regex that matches a single formatting character.
 my $parser = Pod::Text::Termcap->new();
@@ -43,13 +43,13 @@ for my $snippet (@snippets) {
 }
 
 # Now test with an unknown terminal type.
-$ENV{TERM}    = 'unknown';
-$ENV{TERMCAP} = 'unknown:co=#80:do=^J';
+local $ENV{TERM} = 'unknown';
+local $ENV{TERMCAP} = 'unknown:co=#80:do=^J';
 test_snippet('Pod::Text::Termcap', 'termcap/term-unknown');
 
 # Test the character regex with a fake terminal type that only provides bold
 # and normal, not underline.
-$ENV{TERM}    = 'fake-test-terminal';
-$ENV{TERMCAP} = 'fake-test-terminal:md=\E[1m:me=\E[m';
+local $ENV{TERM} = 'fake-test-terminal';
+local $ENV{TERMCAP} = 'fake-test-terminal:md=\\E[1m:me=\\E[m';
 $parser = Pod::Text::Termcap->new();
 is($parser->format_regex(), "\\\e\\[1m|\\\e\\[m", 'Limited character regex');
index eb68d74..31a3fcc 100644 (file)
@@ -18,6 +18,8 @@ SKIP: {
        skip 'No locale testing for Perl < 5.6.0', 7 if $] < 5.006;
        skip 'No locale testing without d_setlocale', 7
            if(!$Config{d_setlocale});
+       skip 'No locale testing without LC_NUMERIC', 7
+           if($Config{ccflags}) =~ /-DNO_LOCALE_NUMERIC\b/;
 
        # test locale handling
        my $warning = '';
index 4076eec..7a813f6 100644 (file)
@@ -38,7 +38,7 @@ See L<perlguts/Autoloading with XSUBs>.
 #  define Nullcv Null(CV*)
 #endif
 
-#define CvSTASH(sv)    (0+((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_stash)
+#define CvSTASH(sv)    (MUTABLE_HV(((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_stash))
 #define CvSTASH_set(cv,st) Perl_cvstash_set(aTHX_ cv, st)
 #define CvSTART(sv)    ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_start_u.xcv_start
 #define CvROOT(sv)     ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_root_u.xcv_root
@@ -107,7 +107,10 @@ See L<perlguts/Autoloading with XSUBs>.
           : 0                                           \
         )
 
-#define CVf_METHOD     0x0001  /* CV is explicitly marked as a method */
+/* CV has the `:method` attribute. This used to be called CVf_METHOD but is
+ * renamed to avoid collision with CVf_IsMETHOD */
+#define CVf_NOWARN_AMBIGUOUS   0x0001
+
 #define CVf_LVALUE     0x0002  /* CV return value can be used as lvalue */
 #define CVf_CONST      0x0004  /* inlinable sub */
 #define CVf_ISXSUB     0x0008  /* CV is an XSUB, not pure perl.  */
@@ -117,7 +120,7 @@ See L<perlguts/Autoloading with XSUBs>.
 #define CVf_CLONED     0x0040  /* a clone of one of those */
 #define CVf_ANON       0x0080  /* CV is not pointed to by a GV */
 #define CVf_UNIQUE     0x0100  /* sub is only called once (eg PL_main_cv,
-                                 * require, eval). */
+                                   require, eval). */
 #define CVf_NODEBUG    0x0200  /* no DB::sub indirection for this CV
                                    (esp. useful for special XSUBs) */
 #define CVf_CVGV_RC    0x0400  /* CvGV is reference counted */
@@ -131,9 +134,13 @@ See L<perlguts/Autoloading with XSUBs>.
 #define CVf_LEXICAL    0x10000 /* Omit package from name */
 #define CVf_ANONCONST  0x20000 /* :const - create anonconst op */
 #define CVf_SIGNATURE   0x40000 /* CV uses a signature */
+#define CVf_REFCOUNTED_ANYSV 0x80000 /* CvXSUBANY().any_sv is refcounted */
+#define CVf_IsMETHOD    0x100000 /* CV is a (real) method of a real class. Not
+                                   to be confused with what used to be called
+                                   CVf_METHOD; now CVf_NOWARN_AMBIGUOUS */
 
 /* This symbol for optimised communication between toke.c and op.c: */
-#define CVf_BUILTIN_ATTRS      (CVf_METHOD|CVf_LVALUE|CVf_ANONCONST)
+#define CVf_BUILTIN_ATTRS      (CVf_NOWARN_AMBIGUOUS|CVf_LVALUE|CVf_ANONCONST)
 
 #define CvCLONE(cv)            (CvFLAGS(cv) & CVf_CLONE)
 #define CvCLONE_on(cv)         (CvFLAGS(cv) |= CVf_CLONE)
@@ -156,9 +163,9 @@ See L<perlguts/Autoloading with XSUBs>.
 #define CvNODEBUG_on(cv)       (CvFLAGS(cv) |= CVf_NODEBUG)
 #define CvNODEBUG_off(cv)      (CvFLAGS(cv) &= ~CVf_NODEBUG)
 
-#define CvMETHOD(cv)           (CvFLAGS(cv) & CVf_METHOD)
-#define CvMETHOD_on(cv)                (CvFLAGS(cv) |= CVf_METHOD)
-#define CvMETHOD_off(cv)       (CvFLAGS(cv) &= ~CVf_METHOD)
+#define CvNOWARN_AMBIGUOUS(cv)         (CvFLAGS(cv) & CVf_NOWARN_AMBIGUOUS)
+#define CvNOWARN_AMBIGUOUS_on(cv)      (CvFLAGS(cv) |= CVf_NOWARN_AMBIGUOUS)
+#define CvNOWARN_AMBIGUOUS_off(cv)     (CvFLAGS(cv) &= ~CVf_NOWARN_AMBIGUOUS)
 
 #define CvLVALUE(cv)           (CvFLAGS(cv) & CVf_LVALUE)
 #define CvLVALUE_on(cv)                (CvFLAGS(cv) |= CVf_LVALUE)
@@ -224,6 +231,47 @@ See L<perlguts/Autoloading with XSUBs>.
 #define CvSIGNATURE_on(cv)     (CvFLAGS(cv) |= CVf_SIGNATURE)
 #define CvSIGNATURE_off(cv)    (CvFLAGS(cv) &= ~CVf_SIGNATURE)
 
+/*
+
+=for apidoc m|bool|CvREFCOUNTED_ANYSV|CV *cv
+
+If true, indicates that the C<CvXSUBANY(cv).any_sv> member contains an SV
+pointer whose reference count should be decremented when the CV itself is
+freed.  In addition, C<cv_clone()> will increment the reference count, and
+C<sv_dup()> will duplicate the entire pointed-to SV if this flag is set.
+
+Any CV that wraps an XSUB has an C<ANY> union that the XSUB function is free
+to use for its own purposes.  It may be the case that the code wishes to store
+an SV in the C<any_sv> member of this union.  By setting this flag, this SV
+reference will be properly reclaimed or duplicated when the CV itself is.
+
+=for apidoc m|void|CvREFCOUNTED_ANYSV_on|CV *cv
+
+Helper macro to turn on the C<CvREFCOUNTED_ANYSV> flag.
+
+=for apidoc m|void|CvREFCOUNTED_ANYSV_off|CV *cv
+
+Helper macro to turn off the C<CvREFCOUNTED_ANYSV> flag.
+
+=cut
+*/
+
+#define CvREFCOUNTED_ANYSV(cv)          (CvFLAGS(cv) & CVf_REFCOUNTED_ANYSV)
+#define CvREFCOUNTED_ANYSV_on(cv)       (CvFLAGS(cv) |= CVf_REFCOUNTED_ANYSV)
+#define CvREFCOUNTED_ANYSV_off(cv)      (CvFLAGS(cv) &= ~CVf_REFCOUNTED_ANYSV)
+
+#define CvIsMETHOD(cv)         (CvFLAGS(cv) & CVf_IsMETHOD)
+#define CvIsMETHOD_on(cv)      (CvFLAGS(cv) |= CVf_IsMETHOD)
+#define CvIsMETHOD_off(cv)     (CvFLAGS(cv) &= ~CVf_IsMETHOD)
+
+/* Back-compat */
+#ifndef PERL_CORE
+#  define CVf_METHOD            CVf_NOWARN_AMBIGUOUS
+#  define CvMETHOD(cv)          CvNOWARN_AMBIGUOUS(cv)
+#  define CvMETHOD_on(cv)       CvNOWARN_AMBIGUOUS_on(cv)
+#  define CvMETHOD_off(cv)      CvNOWARN_AMBIGUOUS_off(cv)
+#endif
+
 /* Flags for newXS_flags  */
 #define XS_DYNAMIC_FILENAME    0x01    /* The filename isn't static  */
 
index 53b04c6..7c3d5dc 100644 (file)
@@ -19,6 +19,8 @@
 #include <wchar.h>
 #endif
 
+#define PATH_LEN_GUESS (260 + 1001)
+
 /*
  * pp_system() implemented via spawn()
  * - more efficient and useful when embedding Perl in non-Cygwin apps
@@ -158,57 +160,50 @@ leave:
 
 #if (CYGWIN_VERSION_API_MINOR >= 181)
 char*
-wide_to_utf8(const wchar_t *wbuf)
+wide_to_utf8(const wchar_t *wsrc)
 {
-    char *buf;
-    int wlen = 0;
-    char *oldlocale;
-
-    /* Here and elsewhere in this file, we have a critical section to prevent
-     * another thread from changing the locale out from under us.  XXX But why
-     * not just use uvchr_to_utf8? */
-    SETLOCALE_LOCK;
-
-    oldlocale = setlocale(LC_CTYPE, NULL);
-    setlocale(LC_CTYPE, "utf-8");
+    dTHX;
+    const Size_t wlen = (wcslen(wsrc) + 1) * sizeof(wchar_t);
 
-    /* uvchr_to_utf8(buf, chr) or Encoding::_bytes_to_utf8(sv, "UCS-2BE"); */
-    wlen = wcsrtombs(NULL, (const wchar_t **)&wbuf, wlen, NULL);
-    buf = (char *) safemalloc(wlen+1);
-    wcsrtombs(buf, (const wchar_t **)&wbuf, wlen, NULL);
+    /* Max expansion factor is 3/2 */
+    Size_t blen = wlen * 3 / 2;
 
-    if (oldlocale) setlocale(LC_CTYPE, oldlocale);
-    else setlocale(LC_CTYPE, "C");
+    char *buf = (char *) safemalloc(blen);
 
-    SETLOCALE_UNLOCK;
+    utf16_to_utf8((U8 *) wsrc, buf, wlen, &blen);
 
     return buf;
 }
 
 wchar_t*
-utf8_to_wide(const char *buf)
+utf8_to_wide_extra_len(const char *buf, Size_t *extra_len)
 {
-    wchar_t *wbuf;
-    mbstate_t mbs;
-    char *oldlocale;
-    int wlen = sizeof(wchar_t)*strlen(buf);
+    /* Return the conversion to UTF-16 of the UTF-8 string 'buf'
+     * (terminated by a NUL), making sure to have space for at least *extra_len
+     * extra (wide) characters in the result.  The result must be freed by the
+     * caller when no longer needed */
 
-    SETLOCALE_LOCK;
+    dTHX;
+    Size_t len = strlen(buf) + extra_len + 1;
 
-    oldlocale = setlocale(LC_CTYPE, NULL);
+    /* Max expansion factor is sizeof(wchar_t) */
+    Size_t wlen = sizeof(wchar_t) * len;
 
-    setlocale(LC_CTYPE, "utf-8");
-    wbuf = (wchar_t *) safemalloc(wlen);
-    /* utf8_to_uvchr_buf(pathname, pathname + wlen, wpath) or Encoding::_utf8_to_bytes(sv, "UCS-2BE"); */
-    wlen = mbsrtowcs(wbuf, (const char**)&buf, wlen, &mbs);
+    wchar_t* wsrc = (wchar_t *) safemalloc(wlen);
 
-    if (oldlocale) setlocale(LC_CTYPE, oldlocale);
-    else setlocale(LC_CTYPE, "C");
+    utf8_to_utf16(buf, (U8 *) wsrc, len, &wlen);
 
-    SETLOCALE_UNLOCK;
+    return wsrc;
+}
 
-    return wbuf;
+wchar_t*
+utf8_to_wide(const char *buf)
+{
+    Size_t extra_len = 0;
+
+    return utf8_to_wide_extra_len(buf, &extra_len);
 }
+
 #endif /* cygwin 1.7 */
 
 /* see also Cwd.pm */
@@ -272,21 +267,35 @@ XS(XS_Cygwin_winpid_to_pid)
     XSRETURN_UNDEF;
 }
 
-XS(XS_Cygwin_win_to_posix_path)
-
+/* The conversion between Posix and Windows paths is essentially the same in
+ * either direction, so a common function is used, with which direction passed
+ * in.
+ *
+ * These numbers are chosen so can be or'd with absolute flag to get 0..3 */
+typedef enum {
+    to_posix = 0,
+    to_win   = 2
+} direction_t;
+
+static void
+S_convert_path_common(pTHX_ const direction_t direction)
 {
     dXSARGS;
-    int absolute_flag = 0;
+    bool absolute_flag = 0;
     STRLEN len;
     int err = 0;
     char *src_path;
-    char *posix_path;
+    char *converted_path;
     int isutf8 = 0;
 
-    if (items < 1 || items > 2)
-        Perl_croak(aTHX_ "Usage: Cygwin::win_to_posix_path(pathname, [absolute])");
+    if (items < 1 || items > 2) {
+        char *name = (direction == to_posix)
+                     ? "win::win_to_posix_path"
+                     : "posix_to_win_path";
+        Perl_croak(aTHX_ "Usage: Cygwin::%s(pathname, [absolute])", name);
+    }
 
-    src_path = SvPV(ST(0), len);
+    src_path = SvPVx(ST(0), len);
     if (items == 2)
         absolute_flag = SvTRUE(ST(1));
 
@@ -299,163 +308,100 @@ XS(XS_Cygwin_win_to_posix_path)
        Size calculation: On overflow let cygwin_conv_path calculate the final size.
      */
     if (isutf8) {
-        int what = absolute_flag ? CCP_WIN_W_TO_POSIX : CCP_WIN_W_TO_POSIX | CCP_RELATIVE;
-        STRLEN wlen = sizeof(wchar_t)*(len + 260 + 1001);
-        wchar_t *wpath = (wchar_t *) safemalloc(sizeof(wchar_t)*len);
-        wchar_t *wbuf = (wchar_t *) safemalloc(wlen);
-        if (!IN_BYTES) {
-            mbstate_t mbs;
-            char *oldlocale;
-
-            SETLOCALE_LOCK;
-
-            oldlocale = setlocale(LC_CTYPE, NULL);
-            setlocale(LC_CTYPE, "utf-8");
-            /* utf8_to_uvchr_buf(src_path, src_path + wlen, wpath) or Encoding::_utf8_to_bytes(sv, "UCS-2BE"); */
-            wlen = mbsrtowcs(wpath, (const char**)&src_path, wlen, &mbs);
-            if (wlen > 0)
-                err = cygwin_conv_path(what, wpath, wbuf, wlen);
-            if (oldlocale) setlocale(LC_CTYPE, oldlocale);
-            else setlocale(LC_CTYPE, "C");
-
-            SETLOCALE_UNLOCK;
-        } else { /* use bytes; assume already ucs-2 encoded bytestream */
-            err = cygwin_conv_path(what, src_path, wbuf, wlen);
+        int what =  ((absolute_flag) ? 0 : CCP_RELATIVE)
+                  | ((direction == to_posix)
+                     ? CCP_WIN_W_TO_POSIX
+                     : CCP_POSIX_TO_WIN_W);
+        STRLEN wlen;
+        wchar_t *wsrc = NULL;       /* The source, as a wchar_t */
+        wchar_t *wconverted = NULL; /* wsrc, converted to the destination */
+
+        /* ptr to either wsrc, or under BYTES, the src_path so can have common
+         * code below */
+        wchar_t *which_src = (wchar_t *) src_path;
+
+        if (LIKELY(! IN_BYTES)) {    /* Normal case, convert UTF-8 to UTF-16 */
+            wlen = PATH_LEN_GUESS;
+            wsrc = utf8_to_wide_extra_len(src_path, &wlen);
+            which_src = wsrc;
+        }
+        else { /* use bytes; assume already UTF-16 encoded bytestream */
+            wlen = sizeof(wchar_t) * (len + PATH_LEN_GUESS);
         }
+
+        if (LIKELY(wlen > 0)) { /* Make sure didn't get an error */
+            wconverted = (wchar_t *) safemalloc(wlen);
+            err = cygwin_conv_path(what, which_src, wconverted, wlen);
+        }
+
         if (err == ENOSPC) { /* our space assumption was wrong, not enough space */
-            int newlen = cygwin_conv_path(what, wpath, wbuf, 0);
-            wbuf = (wchar_t *) realloc(&wbuf, newlen);
-            err = cygwin_conv_path(what, wpath, wbuf, newlen);
-            wlen = newlen;
+            int newlen = cygwin_conv_path(what, which_src, wconverted, 0);
+            wconverted = (wchar_t *) realloc(&wconverted, newlen);
+            err = cygwin_conv_path(what, which_src, wconverted, newlen);
         }
-        /* utf16_to_utf8(*p, *d, bytlen, *newlen) */
-        posix_path = (char *) safemalloc(wlen*3);
-        Perl_utf16_to_utf8(aTHX_ (U8*)&wpath, (U8*)posix_path, wlen*2, &len);
-        /*
-        wlen = wcsrtombs(NULL, (const wchar_t **)&wbuf, wlen, NULL);
-        posix_path = (char *) safemalloc(wlen+1);
-        wcsrtombs(posix_path, (const wchar_t **)&wbuf, wlen, NULL);
-        */
+
+        converted_path = wide_to_utf8(wconverted);
+
+        safefree(wconverted);
+        safefree(wsrc);
     } else {
-        int what = absolute_flag ? CCP_WIN_A_TO_POSIX : CCP_WIN_A_TO_POSIX | CCP_RELATIVE;
-        posix_path = (char *) safemalloc (len + 260 + 1001);
-        err = cygwin_conv_path(what, src_path, posix_path, len + 260 + 1001);
+        int what =  ((absolute_flag) ? 0 : CCP_RELATIVE)
+                  | ((direction == to_posix)
+                     ? CCP_WIN_A_TO_POSIX
+                     : CCP_POSIX_TO_WIN_A);
+
+        converted_path = (char *) safemalloc (len + PATH_LEN_GUESS);
+        err = cygwin_conv_path(what, src_path, converted_path, len + PATH_LEN_GUESS);
         if (err == ENOSPC) { /* our space assumption was wrong, not enough space */
-            int newlen = cygwin_conv_path(what, src_path, posix_path, 0);
-            posix_path = (char *) realloc(&posix_path, newlen);
-            err = cygwin_conv_path(what, src_path, posix_path, newlen);
+            int newlen = cygwin_conv_path(what, src_path, converted_path, 0);
+            converted_path = (char *) realloc(&converted_path, newlen);
+            err = cygwin_conv_path(what, src_path, converted_path, newlen);
         }
     }
+
 #else
-    posix_path = (char *) safemalloc (len + 260 + 1001);
-    if (absolute_flag)
-        err = cygwin_conv_to_full_posix_path(src_path, posix_path);
-    else
-        err = cygwin_conv_to_posix_path(src_path, posix_path);
+    converted_path = (char *) safemalloc (len + PATH_LEN_GUESS);
+
+    switch (absolute_flag | direction) {
+      case (1|to_posix):
+        err = cygwin_conv_to_full_posix_path(src_path, converted_path);
+        break;
+      case (0|to_posix):
+        err = cygwin_conv_to_posix_path(src_path, converted_path);
+        break;
+      case (1|to_win):
+        err = cygwin_conv_to_full_win32_path(src_path, converted_path);
+        break;
+      case (0|to_win):
+        err = cygwin_conv_to_win32_path(src_path, converted_path);
+        break;
+    }
+
 #endif
+
     if (!err) {
         EXTEND(SP, 1);
-        ST(0) = sv_2mortal(newSVpv(posix_path, 0));
+        ST(0) = sv_2mortal(newSVpv(converted_path, 0));
         if (isutf8) { /* src was utf-8, so result should also */
             /* TODO: convert ANSI (local windows encoding) to utf-8 on cygwin-1.5 */
             SvUTF8_on(ST(0));
         }
-        safefree(posix_path);
+        safefree(converted_path);
         XSRETURN(1);
     } else {
-        safefree(posix_path);
+        safefree(converted_path);
         XSRETURN_UNDEF;
     }
 }
 
-XS(XS_Cygwin_posix_to_win_path)
+XS(XS_Cygwin_win_to_posix_path)
 {
-    dXSARGS;
-    int absolute_flag = 0;
-    STRLEN len;
-    int err = 0;
-    char *src_path, *win_path;
-    int isutf8 = 0;
-
-    if (items < 1 || items > 2)
-        Perl_croak(aTHX_ "Usage: Cygwin::posix_to_win_path(pathname, [absolute])");
-
-    src_path = SvPVx(ST(0), len);
-    if (items == 2)
-        absolute_flag = SvTRUE(ST(1));
+    S_convert_path_common(aTHX_ to_posix);
+}
 
-    if (!len)
-        Perl_croak(aTHX_ "can't convert empty path");
-    isutf8 = SvUTF8(ST(0));
-#if (CYGWIN_VERSION_API_MINOR >= 181)
-    /* Check utf8 flag and use wide api then.
-       Size calculation: On overflow let cygwin_conv_path calculate the final size.
-     */
-    if (isutf8) {
-        int what = absolute_flag ? CCP_POSIX_TO_WIN_W : CCP_POSIX_TO_WIN_W | CCP_RELATIVE;
-        int wlen = sizeof(wchar_t)*(len + 260 + 1001);
-        wchar_t *wpath = (wchar_t *) safemalloc(sizeof(wchar_t)*len);
-        wchar_t *wbuf = (wchar_t *) safemalloc(wlen);
-        char *oldlocale;
-
-        SETLOCALE_LOCK;
-
-        oldlocale = setlocale(LC_CTYPE, NULL);
-        setlocale(LC_CTYPE, "utf-8");
-        if (!IN_BYTES) {
-            mbstate_t mbs;
-            /* utf8_to_uvchr_buf(src_path, src_path + wlen, wpath) or Encoding::_utf8_to_bytes(sv, "UCS-2BE"); */
-            wlen = mbsrtowcs(wpath, (const char**)&src_path, wlen, &mbs);
-            if (wlen > 0)
-                err = cygwin_conv_path(what, wpath, wbuf, wlen);
-        } else { /* use bytes; assume already ucs-2 encoded bytestream */
-            err = cygwin_conv_path(what, src_path, wbuf, wlen);
-        }
-        if (err == ENOSPC) { /* our space assumption was wrong, not enough space */
-            int newlen = cygwin_conv_path(what, wpath, wbuf, 0);
-            wbuf = (wchar_t *) realloc(&wbuf, newlen);
-            err = cygwin_conv_path(what, wpath, wbuf, newlen);
-            wlen = newlen;
-        }
-        /* also see utf8.c: Perl_utf16_to_utf8() or Encoding::_bytes_to_utf8(sv, "UCS-2BE"); */
-        wlen = wcsrtombs(NULL, (const wchar_t **)&wbuf, wlen, NULL);
-        win_path = (char *) safemalloc(wlen+1);
-        wcsrtombs(win_path, (const wchar_t **)&wbuf, wlen, NULL);
-        if (oldlocale) setlocale(LC_CTYPE, oldlocale);
-        else setlocale(LC_CTYPE, "C");
-
-        SETLOCALE_UNLOCK;
-    } else {
-        int what = absolute_flag ? CCP_POSIX_TO_WIN_A : CCP_POSIX_TO_WIN_A | CCP_RELATIVE;
-        win_path = (char *) safemalloc(len + 260 + 1001);
-        err = cygwin_conv_path(what, src_path, win_path, len + 260 + 1001);
-        if (err == ENOSPC) { /* our space assumption was wrong, not enough space */
-            int newlen = cygwin_conv_path(what, src_path, win_path, 0);
-            win_path = (char *) realloc(&win_path, newlen);
-            err = cygwin_conv_path(what, src_path, win_path, newlen);
-        }
-    }
-#else
-    if (isutf8)
-        Perl_warn(aTHX_ "can't convert utf8 path");
-    win_path = (char *) safemalloc(len + 260 + 1001);
-    if (absolute_flag)
-        err = cygwin_conv_to_full_win32_path(src_path, win_path);
-    else
-        err = cygwin_conv_to_win32_path(src_path, win_path);
-#endif
-    if (!err) {
-        EXTEND(SP, 1);
-        ST(0) = sv_2mortal(newSVpv(win_path, 0));
-        if (isutf8) {
-            SvUTF8_on(ST(0));
-        }
-        safefree(win_path);
-        XSRETURN(1);
-    } else {
-        safefree(win_path);
-        XSRETURN_UNDEF;
-    }
+XS(XS_Cygwin_posix_to_win_path)
+{
+    S_convert_path_common(aTHX_ to_win);
 }
 
 XS(XS_Cygwin_mount_table)
index 2cd81dc..0814478 100644 (file)
@@ -87,15 +87,18 @@ Perl_vdeb(pTHX_ const char *pat, va_list *args)
 #ifdef DEBUGGING
     const char* const file = PL_curcop ? OutCopFILE(PL_curcop) : "<null>";
     const char* const display_file = file ? file : "<free>";
-    const long line = PL_curcop ? (long)CopLINE(PL_curcop) : 0;
+    line_t line = PL_curcop ? CopLINE(PL_curcop) : NOLINE;
+    if (line == NOLINE)
+        line = 0;
 
     PERL_ARGS_ASSERT_VDEB;
 
     if (DEBUG_v_TEST)
-        PerlIO_printf(Perl_debug_log, "(%ld:%s:%ld)\t",
+        PerlIO_printf(Perl_debug_log, "(%ld:%s:%" LINE_Tf ")\t",
                       (long)PerlProc_getpid(), display_file, line);
     else
-        PerlIO_printf(Perl_debug_log, "(%s:%ld)\t", display_file, line);
+        PerlIO_printf(Perl_debug_log, "(%s:%" LINE_Tf ")\t",
+                      display_file, line);
     (void) PerlIO_vprintf(Perl_debug_log, pat, *args);
 #else
     PERL_UNUSED_CONTEXT;
@@ -317,7 +320,10 @@ Perl_deb_stack_all(pTHX)
                     }
                     if (CxTYPE(&(si_n->si_cxstack[i])) == CXt_SUBST)
                         continue;
-                    cx_n = &(si_n->si_cxstack[i]);
+                    if (si_n->si_cxix >= 0)
+                        cx_n = &(si_n->si_cxstack[i]);
+                    else
+                        cx_n = NULL;
                     break;
                 }
 
index 21f657d..861ea2f 100644 (file)
@@ -4,9 +4,9 @@ use Carp;
 use warnings;
 use strict;
 our $AUTOLOAD;
-our $VERSION = '1.02'; # remember to update version in POD!
+our $VERSION = '1.03'; # remember to update version in POD!
 # $DB::single=1;
-
+my $debug= $ENV{DEBUG_ATTRIBUTE_HANDLERS} || 0;
 my %symcache;
 sub findsym {
        my ($pkg, $ref, $type) = @_;
@@ -241,7 +241,8 @@ sub _apply_handler_AH_ {
        my ($declaration, $phase) = @_;
        my ($pkg, $ref, $attr, $data, $raw, $handlerphase, $filename, $linenum) = @$declaration;
        return unless $handlerphase->{$phase};
-       # print STDERR "Handling $attr on $ref in $phase with [$data]\n";
+        print STDERR "Handling $attr on $ref in $phase with [$data]\n"
+            if $debug;
        my $type = ref $ref;
        my $handler = "_ATTR_${type}_${attr}";
        my $sym = findsym($pkg, $ref);
@@ -249,12 +250,29 @@ sub _apply_handler_AH_ {
        no warnings;
        if (!$raw && defined($data)) {
            if ($data ne '') {
-               my $evaled = eval("package $pkg; no warnings; no strict;
-                                  local \$SIG{__WARN__}=sub{die}; [$data]");
-               $data = $evaled unless $@;
+                # keeping the minimum amount of code inside the eval string
+                # makes debugging perl internals issues with this logic easier.
+                my $code= "package $pkg; my \$ref= [$data]; \$data= \$ref; 1";
+                print STDERR "Evaling: '$code'\n"
+                    if $debug;
+                local $SIG{__WARN__} = sub{ die };
+                no strict;
+                no warnings;
+                # Note in production we do not need to use the return value from
+                # the eval or even consult $@ after the eval - if the evaled code
+                # compiles and runs successfully then it will update $data with
+                # the compiled form, if it fails then $data stays unchanged. The
+                # return value and $@ are only used for debugging purposes.
+                # IOW we could just replace the following with eval($code);
+                eval($code) or do {
+                    print STDERR "Eval failed: $@"
+                        if $debug;
+                };
            }
            else { $data = undef }
        }
+
+        # now call the handler with the $data decoded (maybe)
        $pkg->$handler($sym,
                       (ref $sym eq 'GLOB' ? *{$sym}{ref $ref}||$ref : $ref),
                       $attr,
@@ -300,7 +318,7 @@ Attribute::Handlers - Simpler definition of attribute handlers
 
 =head1 VERSION
 
-This document describes version 1.02 of Attribute::Handlers.
+This document describes version 1.03 of Attribute::Handlers.
 
 =head1 SYNOPSIS
 
index df563d0..20b9708 100644 (file)
@@ -179,7 +179,7 @@ BEGIN {
             ? do { require "overload.pm"; _fetch_sub overload => 'mycan' }
             : \&UNIVERSAL::can;
 
-        # _blessed is either UNIVERAL::isa(...), or, in the presence of an
+        # _blessed is either UNIVERSAL::isa(...), or, in the presence of an
         # override, a hideous, but fairly reliable, workaround.
         *_blessed = $isa
             ? sub { &$isa($_[0], "UNIVERSAL") }
@@ -211,7 +211,7 @@ BEGIN {
 }
 
 
-our $VERSION = '1.52';
+our $VERSION = '1.54';
 $VERSION =~ tr/_//d;
 
 our $MaxEvalLen = 0;
@@ -776,8 +776,8 @@ Carp - alternative warn and die for modules
     # cluck, longmess and shortmess not exported by default
     use Carp qw(cluck longmess shortmess);
     cluck "This is how we got here!"; # warn with stack backtrace
-    $long_message   = longmess( "message from cluck() or confess()" );
-    $short_message  = shortmess( "message from carp() or croak()" );
+    my $long_message   = longmess( "message from cluck() or confess()" );
+    my $short_message  = shortmess( "message from carp() or croak()" );
 
 =head1 DESCRIPTION
 
@@ -802,7 +802,7 @@ Of course, C<Carp> can't guarantee the latter.
 
 You can also alter the way the output and logic of C<Carp> works, by
 changing some global variables in the C<Carp> namespace. See the
-section on C<GLOBAL VARIABLES> below.
+section on L</GLOBAL VARIABLES> below.
 
 Here is a more complete description of how C<carp> and C<croak> work.
 What they do is search the call-stack for a function call stack where
@@ -868,7 +868,7 @@ or by including the string C<-MCarp=verbose> in the PERL5OPT
 environment variable.
 
 Alternately, you can set the global variable C<$Carp::Verbose> to true.
-See the C<GLOBAL VARIABLES> section below.
+See the L</GLOBAL VARIABLES> section below.
 
 =head2 Stack Trace formatting
 
index fdb3e52..043e345 100644 (file)
@@ -2,7 +2,7 @@ package Carp::Heavy;
 
 use Carp ();
 
-our $VERSION = '1.52';
+our $VERSION = '1.54';
 $VERSION =~ tr/_//d;
 
 # Carp::Heavy was merged into Carp in version 1.12.  Any mismatched versions
index ba61ffe..bb6d3ca 100644 (file)
@@ -18,6 +18,7 @@ use 5.008_001;
 require Exporter;
 
 use constant IS_PRE_516_PERL => $] < 5.016;
+use constant SUPPORTS_CORE_BOOLS => defined &builtin::is_bool;
 
 use Carp ();
 
@@ -29,7 +30,7 @@ our ( $Indent, $Trailingcomma, $Purity, $Pad, $Varname, $Useqq, $Terse, $Freezer
 our ( @ISA, @EXPORT, @EXPORT_OK, $VERSION );
 
 BEGIN {
-    $VERSION = '2.184'; # Don't forget to set version and release
+    $VERSION = '2.188'; # Don't forget to set version and release
                         # date in POD below!
 
     @ISA = qw(Exporter);
@@ -551,6 +552,12 @@ sub _dump {
     elsif (!defined($val)) {
       $out .= "undef";
     }
+    elsif (SUPPORTS_CORE_BOOLS && do {
+      BEGIN { SUPPORTS_CORE_BOOLS and warnings->unimport("experimental::builtin") }
+      builtin::is_bool($val)
+    }) {
+      $out .= $val ? '!!1' : '!!0';
+    }
     # This calls the XSUB _vstring (if the XS code is loaded). I'm not *sure* if
     # if belongs in the "Pure Perl" implementation. It sort of depends on what
     # was meant by "Pure Perl", as this subroutine already relies Scalar::Util
@@ -859,7 +866,7 @@ Data::Dumper - stringified perl data structures, suitable for both printing and
     }
 
     # OO usage
-    $d = Data::Dumper->new([$foo, $bar], [qw(foo *ary)]);
+    my $d = Data::Dumper->new([$foo, $bar], [qw(foo *ary)]);
        ...
     print $d->Dump;
        ...
@@ -884,7 +891,7 @@ to substructures within C<$VAR>I<n> will be appropriately labeled using arrow
 notation.  You can specify names for individual values to be dumped if you
 use the C<Dump()> method, or you can change the default C<$VAR> prefix to
 something else.  See C<$Data::Dumper::Varname> and C<$Data::Dumper::Terse>
-below.
+in L</Configuration Variables or Methods> below.
 
 The default output of self-referential structures can be C<eval>ed, but the
 nested references to C<$VAR>I<n> will be undefined, since a recursive
@@ -1448,7 +1455,7 @@ modify it under the same terms as Perl itself.
 
 =head1 VERSION
 
-Version 2.184
+Version 2.188
 
 =head1 SEE ALSO
 
index 8bd6397..4d54ba1 100644 (file)
@@ -2,13 +2,11 @@
 #include "EXTERN.h"
 #include "perl.h"
 #include "XSUB.h"
-#ifdef USE_PPPORT_H
-#  define NEED_my_snprintf
-#  define NEED_my_sprintf
-#  define NEED_sv_2pv_flags
-#  define NEED_utf8_to_uvchr_buf
-#  include "ppport.h"
-#endif
+#define NEED_my_snprintf
+#define NEED_my_sprintf
+#define NEED_sv_2pv_flags
+#define NEED_utf8_to_uvchr_buf
+#include "ppport.h"
 
 #ifndef strlcpy
 #  ifdef my_strlcpy
@@ -1279,6 +1277,17 @@ DD_dump(pTHX_ SV *val, const char *name, STRLEN namelen, SV *retval, HV *seenhv,
            }
        }
 
+#ifdef SvIsBOOL
+       if (SvIsBOOL(val)) {
+               if (SvTRUE(val)) {
+                       sv_catpvs(retval, "!!1");
+               }
+               else {
+                       sv_catpvs(retval, "!!0");
+               }
+       }
+    else
+#endif
         if (DD_is_integer(val)) {
             STRLEN len;
            if (SvIsUV(val))
@@ -1315,7 +1324,7 @@ DD_dump(pTHX_ SV *val, const char *name, STRLEN namelen, SV *retval, HV *seenhv,
                SvCUR_set(retval, SvCUR(retval)+2);
                 i = 3 + esc_q_utf8(aTHX_ retval, c, i,
 #ifdef GvNAMEUTF8
-                       !!GvNAMEUTF8(val), style->useqq
+                       cBOOL(GvNAMEUTF8(val)), style->useqq
 #else
                        0, style->useqq || globname_supra_ascii(c, i)
 #endif
index 80b2c8e..55a997c 100755 (executable)
@@ -1522,6 +1522,26 @@ EOT
             $want);
 }
 
+#############
+{
+  if (!Data::Dumper::SUPPORTS_CORE_BOOLS) {
+      SKIP_BOTH("Core booleans not supported on older perls");
+      last;
+  }
+  my $want = <<'EOT';
+#$VAR1 = [
+#  !!1,
+#  !!0
+#];
+EOT
+
+  $foo = [ !!1, !!0 ];
+  TEST_BOTH(q(Data::Dumper::DumperX($foo)),
+            'Booleans',
+            $want);
+}
+
+
 #############
 {
   # If XS cannot load, the pure-Perl version cannot deparse vstrings with
index cfbfaeb..00fd926 100644 (file)
@@ -747,7 +747,7 @@ modify it under the same terms as Perl itself.
 
 =head1 SEE ALSO
 
-See L<h2xs>, L<ppport.h>.
+See L<h2xs>, F<ppport.h>.
 
 =cut
 
@@ -756,7 +756,7 @@ package Devel::PPPort;
 use strict;
 use vars qw($VERSION $data);
 
-$VERSION = '3.68';
+$VERSION = '3.71';
 
 sub _init_data
 {
index 5b82727..18c38f6 100644 (file)
@@ -962,7 +962,7 @@ newSVsv                        # T
 newUNOP                        # T
 Newz                           # Z added by devel/scanprov
 nextargv                       # F added by devel/scanprov
-NEXTOPER                       # Z added by devel/scanprov
+REGNODE_AFTER                       # Z added by devel/scanprov
 ninstr                         # T
 NofAMmeth                      # Z added by devel/scanprov
 no_fh_allowed                  # F added by devel/scanprov
@@ -1113,7 +1113,7 @@ pop_scope                      # T
 PP                             # Z added by devel/scanprov
 pregexec                       # T
 pregfree                       # T
-PREVOPER                       # Z added by devel/scanprov
+REGNODE_BEFORE                       # Z added by devel/scanprov
 printf                         # Z added by devel/scanprov
 PRIVLIB                        # K added by devel/scanprov
 PRIVLIB_EXP                    # K added by devel/scanprov
index 90d44b6..e4b9a31 100644 (file)
 :
 :   U  autodoc.pl will not output a usage example
 :
-:   W  Add a _pDEPTH argument to function prototypes, and an _aDEPTH
+:   W  Add a comma_pDEPTH argument to function prototypes, and a comma_aDEPTH
 :      argument to the function calls. This means that under DEBUGGING
 :      a depth argument is added to the functions, which is used for
 :      example by the regex engine for debugging and trace output.
@@ -1943,7 +1943,7 @@ Apd       |bool   |sv_streq_flags |NULLOK SV* sv1|NULLOK SV* sv2|const U32 flags
 CpMdb  |void   |sv_taint       |NN SV* sv
 CpdR   |bool   |sv_tainted     |NN SV *const sv
 Apd    |int    |sv_unmagic     |NN SV *const sv|const int type
-Apd    |int    |sv_unmagicext  |NN SV *const sv|const int type|NULLOK MGVTBL *vtbl
+Apd    |int    |sv_unmagicext  |NN SV *const sv|const int type|NULLOK const MGVTBL *vtbl
 ApdMb  |void   |sv_unref       |NN SV* sv
 Apd    |void   |sv_unref_flags |NN SV *const ref|const U32 flags
 Cpd    |void   |sv_untaint     |NN SV *const sv
index 806aa18..4772ab3 100644 (file)
@@ -211,7 +211,7 @@ mg_findext(const SV * sv, int type, const MGVTBL *vtbl) {
 #if { NEED sv_unmagicext }
 
 int
-sv_unmagicext(pTHX_ SV *const sv, const int type, MGVTBL *vtbl)
+sv_unmagicext(pTHX_ SV *const sv, const int type, const MGVTBL *vtbl)
 {
     MAGIC* mg;
     MAGIC** mgp;
index 523480f..dbd41b0 100644 (file)
@@ -58,17 +58,18 @@ NEED_vmess
 #  else
 #    define D_PPP_FIX_UTF8_ERRSV_FOR_SV(sv) STMT_START {} STMT_END
 #  endif
-#  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
+PERL_STATIC_INLINE void D_PPP_croak_sv(SV *sv) {
+    dTHX;
+    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));
+    }
+}
+#  define croak_sv(sv) D_PPP_croak_sv(sv)
 #elif { VERSION >= 5.4.0 }
 #  define croak_sv(sv) croak("%" SVf, SVfARG(sv))
 #else
index 72b7e72..86d7fde 100644 (file)
@@ -299,17 +299,12 @@ __UNDEF_NOT_PROVIDED__  PERL_GCC_BRACE_GROUPS_FORBIDDEN
 
 #undef STMT_START
 #undef STMT_END
-#if defined(VOIDFLAGS) && defined(PERL_USE_GCC_BRACE_GROUPS)
-#  define STMT_START    (void)( /* gcc supports ``({ STATEMENTS; })'' */
-#  define STMT_END      )
-#else
-#  if defined(VOIDFLAGS) && (VOIDFLAGS) && (defined(sun) || defined(__sun__)) && !defined(__GNUC__)
+#if defined(VOIDFLAGS) && (VOIDFLAGS) && (defined(sun) || defined(__sun__)) && !defined(__GNUC__)
 #    define STMT_START  if (1)
 #    define STMT_END    else (void)0
-#  else
+#else
 #    define STMT_START  do
 #    define STMT_END    while (0)
-#  endif
 #endif
 
 __UNDEFINED__  boolSV(b)    ((b) ? &PL_sv_yes : &PL_sv_no)
@@ -1180,10 +1175,10 @@ newXS("Devel::PPPort::dAXMARK", XS_Devel__PPPort_dAXMARK, file);
 int
 OpSIBLING_tests()
        PREINIT:
-               OP *x;
-               OP *kid;
-               OP *middlekid;
-               OP *lastkid;
+               OP *x = NULL;
+               OP *kid = NULL;
+               OP *middlekid = NULL;
+               OP *lastkid = NULL;
                int count = 0;
                int failures = 0;
                int i;
@@ -1439,8 +1434,8 @@ check_HeUTF8(utf8_key)
                 hash = newHV();
 
                 key = SvPV(utf8_key, klen);
-                if (SvUTF8(utf8_key)) klen *= -1;
-                hv_store(hash, key, klen, newSVpvs("string"), 0);
+                hv_store(hash, key, SvUTF8(utf8_key) ? -klen : klen,
+                    newSVpvs("string"), 0);
                 hv_iterinit(hash);
                 ent = hv_iternext(hash);
                 assert(ent);
index 2ee209a..5c5c7ce 100644 (file)
@@ -1,5 +1,19 @@
 Revision history for Perl extension ExtUtils::CBuilder.
 
+0.280238
+
+  Fix:
+
+  - use -isyswithroot option for the CORE directory for the system perl on darwin.
+    The compiler would fail to find EXTERN.h with -I.
+    Came up while working on a fix for the similar issue in
+    https://github.com/Perl/perl5/issues/20362
+
+0.280237 - 2022-05-09
+
+  - when not set to quiet, print commands being run in a usable form.
+    https://github.com/Perl/perl5/pull/19701
+
 0.280236 - 2021-02-12
 
   Fix:
index e470d41..705d30a 100644 (file)
@@ -7,7 +7,7 @@ use Perl::OSType qw/os_type/;
 
 use warnings;
 use strict;
-our $VERSION = '0.280236'; # VERSION
+our $VERSION = '0.280238'; # VERSION
 our @ISA;
 
 # We only use this once - don't waste a symbol table entry on it.
index 8ee248d..0494caf 100644 (file)
@@ -9,7 +9,7 @@ use Text::ParseWords;
 use IPC::Cmd qw(can_run);
 use File::Temp qw(tempfile);
 
-our $VERSION = '0.280236'; # VERSION
+our $VERSION = '0.280238'; # VERSION
 
 # More details about C/C++ compilers:
 # http://developers.sun.com/sunstudio/documentation/product/compiler.jsp
@@ -335,10 +335,24 @@ sub _do_link {
   return wantarray ? ($out, @temp_files) : $out;
 }
 
+sub quote_literal {
+  my ($self, $string) = @_;
+
+  if (length $string && $string !~ /[^a-zA-Z0-9,._+@%\/-]/) {
+    return $string;
+  }
+
+  $string =~ s{'}{'\\''}g;
+
+  return "'$string'";
+}
 
 sub do_system {
   my ($self, @cmd) = @_;
-  print "@cmd\n" if !$self->{quiet};
+  if (!$self->{quiet}) {
+    my $full = join ' ', map $self->quote_literal($_), @cmd;
+    print $full . "\n";
+  }
   return !system(@cmd);
 }
 
index 590068c..2eaf591 100644 (file)
@@ -4,7 +4,7 @@ use warnings;
 use strict;
 use ExtUtils::CBuilder::Base;
 
-our $VERSION = '0.280236'; # VERSION
+our $VERSION = '0.280238'; # VERSION
 our @ISA = qw(ExtUtils::CBuilder::Base);
 
 sub link_executable {
index d9b1fbd..d09a608 100644 (file)
@@ -4,7 +4,7 @@ use warnings;
 use strict;
 use ExtUtils::CBuilder::Base;
 
-our $VERSION = '0.280236'; # VERSION
+our $VERSION = '0.280238'; # VERSION
 our @ISA = qw(ExtUtils::CBuilder::Base);
 
 use File::Spec::Functions qw(catfile catdir);
index b81384f..2fffc83 100644 (file)
@@ -8,7 +8,7 @@ use File::Spec;
 use ExtUtils::CBuilder::Base;
 use IO::File;
 
-our $VERSION = '0.280236'; # VERSION
+our $VERSION = '0.280238'; # VERSION
 our @ISA = qw(ExtUtils::CBuilder::Base);
 
 =begin comment
@@ -51,6 +51,22 @@ sub _compiler_type {
          : 'GCC');
 }
 
+# native quoting, not shell quoting
+sub quote_literal {
+  my ($self, $string) = @_;
+
+  # some of these characters don't need to be quoted for "native" quoting, but
+  # quote them anyway so they are more likely to make it through cmd.exe
+  if (length $string && $string !~ /[ \t\n\x0b"|<>%]/) {
+    return $string;
+  }
+
+  $string =~ s{(\\*)(?="|\z)}{$1$1}g;
+  $string =~ s{"}{\\"}g;
+
+  return qq{"$string"};
+}
+
 sub split_like_shell {
   # Since Windows will pass the whole command string (not an argument
   # array) to the target program and make the program parse it itself,
@@ -65,10 +81,15 @@ sub split_like_shell {
 sub do_system {
   # See above
   my $self = shift;
-  my $cmd = join(" ",
-                grep length,
-                map {$a=$_;$a=~s/\t/ /g;$a=~s/^\s+|\s+$//;$a}
-                grep defined, @_);
+  my $cmd = join ' ',
+    grep length,
+    map {$a=$_;$a=~s/\t/ /g;$a=~s/^\s+|\s+$//;$a}
+    grep defined, @_;
+
+  if (!$self->{quiet}) {
+    print $cmd . "\n";
+  }
+  local $self->{quiet} = 1;
   return $self->SUPER::do_system($cmd);
 }
 
index 2ef8b38..35de7fa 100644 (file)
@@ -5,7 +5,7 @@ use strict;
 use ExtUtils::CBuilder::Platform::Unix;
 use File::Spec;
 
-our $VERSION = '0.280236'; # VERSION
+our $VERSION = '0.280238'; # VERSION
 our @ISA = qw(ExtUtils::CBuilder::Platform::Unix);
 
 sub need_prelink { 1 }
index 8500ab9..44ad646 100644 (file)
@@ -6,7 +6,7 @@ use File::Spec;
 use ExtUtils::CBuilder::Platform::Unix;
 use Config;
 
-our $VERSION = '0.280236'; # VERSION
+our $VERSION = '0.280238'; # VERSION
 our @ISA = qw(ExtUtils::CBuilder::Platform::Unix);
 
 # The Android linker will not recognize symbols from
index 3c8beac..14d814c 100644 (file)
@@ -5,7 +5,7 @@ use strict;
 use File::Spec;
 use ExtUtils::CBuilder::Platform::Unix;
 
-our $VERSION = '0.280236'; # VERSION
+our $VERSION = '0.280238'; # VERSION
 our @ISA = qw(ExtUtils::CBuilder::Platform::Unix);
 
 # TODO: If a specific exe_file name is requested, if the exe created
index e050e32..7e8ae7a 100644 (file)
@@ -3,10 +3,14 @@ package ExtUtils::CBuilder::Platform::darwin;
 use warnings;
 use strict;
 use ExtUtils::CBuilder::Platform::Unix;
+use Config;
 
-our $VERSION = '0.280236'; # VERSION
+our $VERSION = '0.280238'; # VERSION
 our @ISA = qw(ExtUtils::CBuilder::Platform::Unix);
 
+my ($osver) = split /\./, $Config{osvers};
+my $apple_cor = $^X eq "/usr/bin/perl" && $osver >= 18;
+
 sub compile {
   my $self = shift;
   my $cf = $self->{config};
@@ -22,5 +26,18 @@ sub compile {
   $self->SUPER::compile(@_);
 }
 
+sub arg_include_dirs {
+    my $self = shift;
+
+    if ($apple_cor) {
+        my $perl_inc = $self->perl_inc;
+        return map {
+           $_ eq $perl_inc ? ("-iwithsysroot", $_ ) : "-I$_"
+        } @_;
+    }
+    else {
+        return $self->SUPER::arg_include_dirs(@_);
+    }
+}
 
 1;
index 971cf93..6b97095 100644 (file)
@@ -5,7 +5,7 @@ use strict;
 use ExtUtils::CBuilder::Platform::Unix;
 use File::Spec;
 
-our $VERSION = '0.280236'; # VERSION
+our $VERSION = '0.280238'; # VERSION
 our @ISA = qw(ExtUtils::CBuilder::Platform::Unix);
 
 sub link_executable {
index 58d316b..a7d11dc 100644 (file)
@@ -4,7 +4,7 @@ use warnings;
 use strict;
 use ExtUtils::CBuilder::Platform::Unix;
 
-our $VERSION = '0.280236'; # VERSION
+our $VERSION = '0.280238'; # VERSION
 our @ISA = qw(ExtUtils::CBuilder::Platform::Unix);
 
 sub need_prelink { 1 }
index b9a9a79..0721582 100644 (file)
@@ -11,7 +11,7 @@ use Symbol;
 
 our $VERSION;
 BEGIN {
-  $VERSION = '3.45';
+  $VERSION = '3.51';
   require ExtUtils::ParseXS::Constants; ExtUtils::ParseXS::Constants->VERSION($VERSION);
   require ExtUtils::ParseXS::CountLines; ExtUtils::ParseXS::CountLines->VERSION($VERSION);
   require ExtUtils::ParseXS::Utilities; ExtUtils::ParseXS::Utilities->VERSION($VERSION);
@@ -31,6 +31,7 @@ use ExtUtils::ParseXS::Utilities qw(
   analyze_preprocessor_statements
   set_cond
   Warn
+  WarnHint
   current_line_number
   blurt
   death
@@ -47,7 +48,10 @@ our @EXPORT_OK = qw(
 
 ##############################
 # A number of "constants"
-
+our $DIE_ON_ERROR;
+our $AUTHOR_WARNINGS;
+$AUTHOR_WARNINGS = ($ENV{AUTHOR_WARNINGS} || 0)
+    unless defined $AUTHOR_WARNINGS;
 our ($C_group_rex, $C_arg);
 # Group in C (no support for comments or literals)
 $C_group_rex = qr/ [({\[]
@@ -103,6 +107,8 @@ sub process_file {
     typemap         => [],
     versioncheck    => 1,
     FH              => Symbol::gensym(),
+    die_on_error    => $DIE_ON_ERROR, # if true we die() and not exit() after errors
+    author_warnings    => $AUTHOR_WARNINGS,
     %options,
   );
   $args{except} = $args{except} ? ' TRY' : '';
@@ -133,6 +139,9 @@ sub process_file {
   $self->{WantLineNumbers} = $args{linenumbers};
   $self->{IncludedFiles} = {};
 
+  $self->{die_on_error} = $args{die_on_error};
+  $self->{author_warnings} = $args{author_warnings};
+
   die "Missing required parameter 'filename'" unless $args{filename};
   $self->{filepathname} = $args{filename};
   ($self->{dir}, $self->{filename}) =
@@ -627,7 +636,16 @@ EOF
           $self->print_section();
           $self->death("PPCODE must be last thing") if @{ $self->{line} };
           print "\tLEAVE;\n" if $self->{ScopeThisXSUB};
+          print "#if defined(__HP_cc) || defined(__HP_aCC)\n",
+                "#pragma diag_suppress 2111\n",
+                "#endif\n"
+            if $^O eq "hpux";
           print "\tPUTBACK;\n\treturn;\n";
+          print "#if defined(__HP_cc) || defined(__HP_aCC)\n",
+                "#pragma diag_default 2111\n",
+                "#endif\n"
+            if $^O eq "hpux";
+
         }
         elsif ($self->check_keyword("CODE")) {
           my $consumed_code = $self->print_section();
@@ -789,6 +807,10 @@ EOF
 #    if (errbuf[0])
 #    Perl_croak(aTHX_ errbuf);
 EOF
+    print "#if defined(__HP_cc) || defined(__HP_aCC)\n",
+          "#pragma diag_suppress 2128\n",
+          "#endif\n"
+      if $^O eq "hpux";
 
     if ($xsreturn) {
       print Q(<<"EOF") unless $PPCODE;
@@ -800,6 +822,10 @@ EOF
 #    XSRETURN_EMPTY;
 EOF
     }
+    print "#if defined(__HP_cc) || defined(__HP_aCC)\n",
+          "#pragma diag_default 2128\n",
+          "#endif\n"
+      if $^O eq "hpux";
 
     print Q(<<"EOF");
 #]]
@@ -873,7 +899,7 @@ EOF
        "        (void)$self->{newXS}(\"$self->{pname}\", XS_$self->{Full_func_name}$self->{file}$self->{proto});\n");
     }
 
-    for my $operator (keys %{ $self->{OverloadsThisXSUB} }) {
+    for my $operator (sort keys %{ $self->{OverloadsThisXSUB} }) {
       $self->{Overloaded}->{$self->{Package}} = $self->{Packid};
       my $overload = "$self->{Package}\::($operator";
       push(@{ $self->{InitFileCode} },
@@ -881,7 +907,7 @@ EOF
     }
   } # END 'PARAGRAPH' 'while' loop
 
-  for my $package (keys %{ $self->{Overloaded} }) { # make them findable with fetchmethod
+  for my $package (sort keys %{ $self->{Overloaded} }) { # make them findable with fetchmethod
     my $packid = $self->{Overloaded}->{$package};
     print Q(<<"EOF");
 #XS_EUPXS(XS_${packid}_nil); /* prototype to pass -Wmissing-prototypes */
@@ -905,7 +931,7 @@ MAKE_FETCHMETHOD_WORK
 
   print Q(<<"EOF");
 ##ifdef __cplusplus
-#extern "C"
+#extern "C" {
 ##endif
 EOF
 
@@ -968,7 +994,7 @@ EOF
 #
 EOF
 
-  if (%{ $self->{Overloaded} }) {
+  if (keys %{ $self->{Overloaded} }) {
     # once if any overloads
     print Q(<<"EOF");
 #    /* register the overloading (type 'A') magic */
@@ -976,7 +1002,7 @@ EOF
 #    PL_amagic_generation++;
 ##endif
 EOF
-    for my $package (keys %{ $self->{Overloaded} }) {
+    for my $package (sort keys %{ $self->{Overloaded} }) {
       # once for each package with overloads
       my $fallback = $self->{Fallback}->{$package} || "&PL_sv_undef";
       print Q(<<"EOF");
@@ -1016,6 +1042,9 @@ EOF
 ##endif
 #]]
 #
+##ifdef __cplusplus
+#}
+##endif
 EOF
 
   warn("Please specify prototyping behavior for $self->{filename} (see perlxs manual)\n")
@@ -1310,26 +1339,89 @@ sub get_aliases {
   my ($line) = @_;
   my ($orig) = $line;
 
+  # we use this later for symbolic aliases
+  my $fname = $self->{Packprefix} . $self->{func_name};
+
   # Parse alias definitions
   # format is
-  #    alias = value alias = value ...
-
-  while ($line =~ s/^\s*([\w:]+)\s*=\s*(\w+)\s*//) {
-    my ($alias, $value) = ($1, $2);
+  #    alias = value Pack::alias = value ...
+  # or
+  #    alias => other
+  # or
+  #    alias => Pack::other
+  # or
+  #    Pack::alias => Other::alias
+
+  while ($line =~ s/^\s*([\w:]+)\s*=(>?)\s*([\w:]+)\s*//) {
+    my ($alias, $is_symbolic, $value) = ($1, $2, $3);
     my $orig_alias = $alias;
 
+    blurt( $self, "Error: In alias definition for '$alias' the value may not"
+                  . " contain ':' unless it is symbolic.")
+        if !$is_symbolic and $value=~/:/;
+
     # check for optional package definition in the alias
     $alias = $self->{Packprefix} . $alias if $alias !~ /::/;
 
+    if ($is_symbolic) {
+      my $orig_value = $value;
+      $value = $self->{Packprefix} . $value if $value !~ /::/;
+      if (defined $self->{XsubAliases}->{$value}) {
+        $value = $self->{XsubAliases}->{$value};
+      } elsif ($value eq $fname) {
+        $value = 0;
+      } else {
+        blurt( $self, "Error: Unknown alias '$value' in symbolic definition for '$orig_alias'");
+      }
+    }
+
     # check for duplicate alias name & duplicate value
-    Warn( $self, "Warning: Ignoring duplicate alias '$orig_alias'")
-      if defined $self->{XsubAliases}->{$alias};
+    my $prev_value = $self->{XsubAliases}->{$alias};
+    if (defined $prev_value) {
+      if ($prev_value eq $value) {
+        Warn( $self, "Warning: Ignoring duplicate alias '$orig_alias'")
+      } else {
+        Warn( $self, "Warning: Conflicting duplicate alias '$orig_alias'"
+                     . " changes definition from '$prev_value' to '$value'");
+        delete $self->{XsubAliasValues}->{$prev_value}{$alias};
+      }
+    }
 
-    Warn( $self, "Warning: Aliases '$orig_alias' and '$self->{XsubAliasValues}->{$value}' have identical values")
-      if $self->{XsubAliasValues}->{$value};
+    # Check and see if this alias results in two aliases having the same
+    # value, we only check non-symbolic definitions as the whole point of
+    # symbolic definitions is to say we want to duplicate the value and
+    # it is NOT a mistake.
+    unless ($is_symbolic) {
+      my @keys= sort keys %{$self->{XsubAliasValues}->{$value}||{}};
+      # deal with an alias of 0, which might not be in the XsubAlias dataset
+      # yet as 0 is the default for the base function ($fname)
+      push @keys, $fname
+        if $value eq "0" and !defined $self->{XsubAlias}{$fname};
+      if (@keys and $self->{author_warnings}) {
+        # We do not warn about value collisions unless author_warnings
+        # are enabled. They aren't helpful to a module consumer, only
+        # the module author.
+        @keys= map { "'$_'" }
+               map { my $copy= $_;
+                     $copy=~s/^$self->{Packprefix}//;
+                     $copy
+                   } @keys;
+        WarnHint( $self,
+                  "Warning: Aliases '$orig_alias' and "
+                  . join(", ", @keys)
+                  . " have identical values of $value"
+                  . ( $value eq "0"
+                      ? " - the base function"
+                      : "" ),
+                  !$self->{XsubAliasValueClashHinted}++
+                  ? "If this is deliberate use a symbolic alias instead."
+                  : undef
+        );
+      }
+    }
 
     $self->{XsubAliases}->{$alias} = $value;
-    $self->{XsubAliasValues}->{$value} = $orig_alias;
+    $self->{XsubAliasValues}->{$value}{$alias}++;
   }
 
   blurt( $self, "Error: Cannot parse ALIAS definitions from '$orig'")
@@ -1800,11 +1892,17 @@ sub fetch_para {
     $self->_process_module_xs_line($1, $2, $3);
   }
 
+  # count how many #ifdef levels we see in this paragraph
+  # decrementing when we see an endif. if we see an elsif
+  # or endif without a corresponding #ifdef then we dont
+  # consider it part of this paragraph.
+  my $if_level = 0;
   for (;;) {
     $self->_maybe_skip_pod;
 
     $self->_maybe_parse_typemap_block;
 
+    my $final;
     if ($self->{lastline} !~ /^\s*#/ # not a CPP directive
         # CPP directives:
         #    ANSI:    if ifdef ifndef elif else endif define undef
@@ -1814,7 +1912,7 @@ sub fetch_para {
         #   others:    ident (gcc notes that some cpps have this one)
         || $self->{lastline} =~ /^\#[ \t]*
                                   (?:
-                                        (?:if|ifn?def|elif|else|endif|
+                                        (?:if|ifn?def|elif|else|endif|elifn?def|
                                            define|undef|pragma|error|
                                            warning|line\s+\d+|ident)
                                         \b
@@ -1825,6 +1923,31 @@ sub fetch_para {
     )
     {
       last if $self->{lastline} =~ /^\S/ && @{ $self->{line} } && $self->{line}->[-1] eq "";
+      if ($self->{lastline}=~/^#[ \t]*(if|ifn?def|elif|else|endif|elifn?def)\b/) {
+        my $type = $1; # highest defined capture buffer, "if" for any if like condition
+        if ($type =~ /^if/) {
+          if (@{$self->{line}}) {
+            # increment level
+            $if_level++;
+          } else {
+            $final = 1;
+          }
+        } elsif ($type eq "endif") {
+          if ($if_level) { # are we in an if that was started in this paragraph?
+            $if_level--;   # yep- so decrement to end this if block
+          } else {
+            $final = 1;
+          }
+        } elsif (!$if_level) {
+          # not in an #ifdef from this paragraph, thus
+          # this directive should not be part of this paragraph.
+          $final = 1;
+        }
+      }
+      if ($final and @{$self->{line}}) {
+        return 1;
+      }
+
       push(@{ $self->{line} }, $self->{lastline});
       push(@{ $self->{line_no} }, $self->{lastline_no});
     }
@@ -1838,6 +1961,9 @@ sub fetch_para {
 
     chomp $self->{lastline};
     $self->{lastline} =~ s/^\s+$//;
+    if ($final) {
+      last;
+    }
   }
 
   # Nuke trailing "line" entries until there's one that's not empty
@@ -2043,8 +2169,9 @@ sub generate_output {
     (my $ntype = $type) =~ s/\s*\*/Ptr/g;
     $ntype =~ s/\(\)//g;
     (my $subtype = $ntype) =~ s/(?:Array)?(?:Ptr)?$//;
+    $type =~ tr/:/_/ unless $self->{RetainCplusplusHierarchicalTypes};
 
-    my $eval_vars = {%$argsref, subtype => $subtype, ntype => $ntype, arg => $arg};
+    my $eval_vars = {%$argsref, subtype => $subtype, ntype => $ntype, arg => $arg, type => $type };
     my $expr = $outputmap->cleaned_code;
     if ($expr =~ /DO_ARRAY_ELEM/) {
       my $subtypemap = $typemaps->get_typemap(ctype => $subtype);
index c01c5ea..a7c3920 100644 (file)
@@ -2,7 +2,7 @@ package ExtUtils::ParseXS::Eval;
 use strict;
 use warnings;
 
-our $VERSION = '3.45';
+our $VERSION = '3.51';
 
 =head1 NAME
 
index c5f2b67..b2674b3 100644 (file)
@@ -5,7 +5,7 @@ use Exporter;
 use File::Spec;
 use ExtUtils::ParseXS::Constants ();
 
-our $VERSION = '3.45';
+our $VERSION = '3.51';
 
 our (@ISA, @EXPORT_OK);
 @ISA = qw(Exporter);
@@ -21,6 +21,7 @@ our (@ISA, @EXPORT_OK);
   analyze_preprocessor_statements
   set_cond
   Warn
+  WarnHint
   current_line_number
   blurt
   death
@@ -654,18 +655,85 @@ sub current_line_number {
 
 =item * Purpose
 
+Print warnings with line number details at the end.
+
 =item * Arguments
 
+List of text to output.
+
 =item * Return Value
 
+None.
+
 =back
 
 =cut
 
 sub Warn {
+  my ($self)=shift;
+  $self->WarnHint(@_,undef);
+}
+
+=head2 C<WarnHint()>
+
+=over 4
+
+=item * Purpose
+
+Prints warning with line number details. The last argument is assumed
+to be a hint string.
+
+=item * Arguments
+
+List of strings to warn, followed by one argument representing a hint.
+If that argument is defined then it will be split on newlines and output
+line by line after the main warning.
+
+=item * Return Value
+
+None.
+
+=back
+
+=cut
+
+sub WarnHint {
+  warn _MsgHint(@_);
+}
+
+=head2 C<_MsgHint()>
+
+=over 4
+
+=item * Purpose
+
+Constructs an exception message with line number details. The last argument is
+assumed to be a hint string.
+
+=item * Arguments
+
+List of strings to warn, followed by one argument representing a hint.
+If that argument is defined then it will be split on newlines and concatenated
+line by line (parenthesized) after the main message.
+
+=item * Return Value
+
+The constructed string.
+
+=back
+
+=cut
+
+
+sub _MsgHint {
   my $self = shift;
+  my $hint = pop;
   my $warn_line_number = $self->current_line_number();
-  print STDERR "@_ in $self->{filename}, line $warn_line_number\n";
+  my $ret = join("",@_) . " in $self->{filename}, line $warn_line_number\n";
+  if ($hint) {
+    $ret .= "    ($_)\n" for split /\n/, $hint;
+  }
+  return $ret;
 }
 
 =head2 C<blurt()>
@@ -703,8 +771,13 @@ sub blurt {
 =cut
 
 sub death {
-  my $self = shift;
-  $self->Warn(@_);
+  my ($self) = (@_);
+  my $message = _MsgHint(@_,"");
+  if ($self->{die_on_error}) {
+    die $message;
+  } else {
+    warn $message;
+  }
   exit 1;
 }
 
index 12d5902..2a324a6 100644 (file)
@@ -2,7 +2,7 @@ package ExtUtils::Typemaps;
 use 5.006001;
 use strict;
 use warnings;
-our $VERSION = '3.45';
+our $VERSION = '3.51';
 
 require ExtUtils::ParseXS;
 require ExtUtils::ParseXS::Constants;
@@ -378,7 +378,7 @@ sub remove_inputmap {
   return $self->_remove($xstype, $self->{input_section}, $self->{input_lookup});
 }
 
-=head2 remove_inputmap
+=head2 remove_outputmap
 
 Removes an C<OUTPUT> entry from the typemap.
 
index 7bfa29c..73f8b71 100644 (file)
@@ -2,7 +2,7 @@ package ExtUtils::Typemaps::Cmd;
 use 5.006001;
 use strict;
 use warnings;
-our $VERSION = '3.45';
+our $VERSION = '3.51';
 
 use ExtUtils::Typemaps;
 
index a10f527..5b18021 100644 (file)
@@ -2,7 +2,7 @@ package ExtUtils::Typemaps::InputMap;
 use 5.006001;
 use strict;
 use warnings;
-our $VERSION = '3.45';
+our $VERSION = '3.51';
 
 =head1 NAME
 
index 990901b..d5aacdb 100644 (file)
@@ -2,7 +2,7 @@ package ExtUtils::Typemaps::OutputMap;
 use 5.006001;
 use strict;
 use warnings;
-our $VERSION = '3.45';
+our $VERSION = '3.51';
 
 =head1 NAME
 
index 94f2345..9970281 100644 (file)
@@ -4,7 +4,7 @@ use strict;
 use warnings;
 require ExtUtils::Typemaps;
 
-our $VERSION = '3.45';
+our $VERSION = '3.51';
 
 =head1 NAME
 
index f1bd408..aa7ccad 100644 (file)
@@ -1332,6 +1332,46 @@ C<BAR::getit()> for this function.
         OUTPUT:
           timep
 
+A warning will be produced when you create more than one alias to the same
+value. This may be worked around in a backwards compatible way by creating
+multiple defines which resolve to the same value, or with a modern version
+of ExtUtils::ParseXS you can use a symbolic alias, which are denoted with
+a C<< => >> instead of a C<< = >>. For instance you could change the above
+so that the alias section looked like this:
+
+       ALIAS:
+           FOO::gettime = 1
+           BAR::getit = 2
+            BAZ::gettime => FOO::gettime
+
+this would have the same effect as this:
+
+       ALIAS:
+           FOO::gettime = 1
+           BAR::getit = 2
+            BAZ::gettime = 1
+
+except that the latter will produce warnings during the build process. A
+mechanism that would work in a backwards compatible way with older
+versions of our tool chain would be to do this:
+
+    #define FOO_GETTIME 1
+    #define BAR_GETIT 2
+    #define BAZ_GETTIME 1
+
+    bool_t
+    rpcb_gettime(host,timep)
+          char *host
+          time_t &timep
+       ALIAS:
+           FOO::gettime = FOO_GETTIME
+           BAR::getit = BAR_GETIT
+            BAZ::gettime = BAZ_GETTIME
+       INIT:
+         printf("# ix = %d\n", ix );
+        OUTPUT:
+          timep
+
 =head2 The OVERLOAD: Keyword
 
 Instead of writing an overloaded interface using pure Perl, you
@@ -2369,7 +2409,18 @@ or use the methods given in L<perlcall>.
 =head1 XS VERSION
 
 This document covers features supported by C<ExtUtils::ParseXS>
-(also known as C<xsubpp>) 3.13_01.
+(also known as C<xsubpp>) 3.51
+
+=head1 AUTHOR DIAGNOSTICS
+
+As of version 3.49 certain warnings are disabled by default. While developing
+you can set C<$ENV{AUTHOR_WARNINGS}> to true in your environment or in your
+Makefile.PL, or set C<$ExtUtils::ParseXS::AUTHOR_WARNINGS> to true via code, or
+pass C<< author_warnings=>1 >> into process_file() explicitly.  Currently this will
+enable stricter alias checking but more warnings might be added in the future.
+The kind of warnings this will enable are only helpful to the author of the XS
+file, and the diagnostics produced will not include installation specific
+details so they are only useful to the maintainer of the XS code itself.
 
 =head1 AUTHOR
 
diff --git a/gnu/usr.bin/perl/dist/Filter-Simple/Changes b/gnu/usr.bin/perl/dist/Filter-Simple/Changes
new file mode 100644 (file)
index 0000000..d7b8e3c
--- /dev/null
@@ -0,0 +1,158 @@
+Revision history for Perl extension Filter::Simple
+
+0.01  Tue Sep 19 20:18:44 2000
+       - original version; created by h2xs 1.18
+
+0.01   Tue Sep 26 09:30:14 2000
+
+       - Changed module name to Filter::Simple
+
+
+0.60   Wed May  2 07:38:18 2001
+
+       - Fixed POD nit (thanks Dean)
+
+       - Added optional second argument to import to allow
+         terminator to be changed (thanks Brad)
+
+       - Fixed bug when empty filtered text was appended to (thanks Brad)
+
+       - Added FILTER as the normal mechanism for specifying filters
+
+
+0.61   Mon Sep  3 08:25:21 2001
+
+       - Added a real test suite (thanks Jarkko)
+
+       - Changed licence to facilitate inclusion in
+         core distribution
+
+       - Added documentation for using F::S and Exporter together
+
+
+0.70   Wed Nov 14 23:36:18 2001
+
+       - Added FILTER_ONLY for fine-grained filtering of code,
+         strings, or regexes
+
+       - Fixed document snafu regarding optional terminators
+
+       - Fixed bug so that FILTER now receives *all* import args
+         (i.e. including the class name in $_[0])
+
+       - Allowed default terminator to allow comments embedded in it
+         (thanks, Christian) and to handle __DATA__ and __END__
+
+       - Fixed handling of __DATA__ and *DATA
+
+
+0.75   Fri Nov 16 14:36:07 2001
+
+       - Corified tests (thanks Jarkko)
+
+       - Added automatic preservation of existing &import subroutines
+
+       - Added automatic preservation of Exporter semantics 
+
+
+0.76   Fri Nov 16 15:08:42 2001
+
+       - Modified call to explicit &import so as to be invoked in original 
+         call context
+
+
+0.77   Sat Nov 24 06:48:47 2001
+
+       - Re-allowed user-defined terminators to be regexes
+
+
+0.78   Fri May 17 09:38:56 2002
+
+       - Re-corified test modules in line with Jarkko's new scheme
+
+       - Various POD nits unknitted (thanks Autrijus)
+
+       - Added the missing DotsForArrows.pm demo file (thanks Autrijus)
+
+       - Added support for Perl 5.005
+
+       - added prereq for Text::Balanced in Makefile.PL
+
+       - Added note about use of /m flag when using ^ or $ in filter regexes
+
+0.79    Sat Sep 20 21:56:24 2003
+
+        - Fixed tests to use t/lib modules so F::S is testable without
+          a previous version of F::S installed. (schwern)
+
+0.80    Sun May 29 23:19:54 2005
+
+    - Added Sarathy's patch for \r\n newlinery (thanks Jarkko)
+
+    - Added recognition of comments as whitespace (thanks Jeff)
+    
+    - Added @components variable (thanks Dean)
+
+    - Fixed handling of vars in FILTER_ONLY code=>... (thanks Lasse)
+
+    - Fixed spurious extra filter at end of file (thanks Dean)
+
+    - Added INSTALLDIRS=>core to Makefile.PL
+
+    
+0.82    Mon Jun 27 02:31:06 GMT 2005
+    
+    - Fixed INSTALLDIRS=>perl in Makefile.PL (thanks all)
+
+    - Fixed other problems caused by de-schwernification
+
+
+0.83    Sat Oct 18 18:51:51 CET 2008
+    
+    - Updated contact details: Maintained by the Perl5-Porters.
+    - Some tiny distribution fixes.
+
+
+0.84    Tue Jan  6 12:58:12 CET 2009
+
+    - Explicit dependency on Text::Balanced 1.97 because that fixed
+      a problem with HERE-docs. (RT #27326)
+
+0.85    Sun Sep  5 16:03:00 CET 2010
+
+    - Port changes from core: Remove unnecessary PERL_CORE check
+      from tests.
+
+0.86
+    - Never released to CPAN (only part of the perl core 5.14.0)
+
+0.87    Fri May 20 20:00:00 CET 2011
+
+    - Port changes from core: Whitespace fix that is significant for
+      POD correctness.
+
+0.88    Mon Dec 19 18:26:00 CET 2011
+
+    - [perl #92436] Make Filter::Simple match variables better
+      (Father Chrysostomos)
+
+    - [perl #92436] Filter::Simple can’t find end of POD
+      (Father Chrysostomos)
+
+0.91    Fri Mar  7 08:30:00 CET 2014
+
+    - Various small documentation fixes.
+
+    - Swap out base.pm use for parent.pm.
+
+0.94    Thu Aug  3 18:00:00 CET 2017
+
+    - Remove use of deprecated \C regex feature.
+
+    - Filter::Simple was erroneously signalling eof if it encountered a
+      ‘no MyFilter’ right after ‘use’:
+        use MyFilter;
+        no MyFilter;
+      In this case it should simply not filter anything.
+
+
index 5eef8ee..17ac9b1 100644 (file)
@@ -4,7 +4,7 @@ package I18N::LangTags::List;
 #  Time-stamp: "2004-10-06 23:26:21 ADT"
 use strict;
 our (%Name, %Is_Disrec, $Debug);
-our $VERSION = '0.40';
+our $VERSION = '0.41';
 # POD at the end.
 
 #----------------------------------------------------------------------
@@ -353,9 +353,9 @@ eq Zend
 eq Azeri
 
 Notable forms:
-{az-Arab} Azerbaijani in Arabic script;
-{az-Cyrl} Azerbaijani in Cyrillic script;
-{az-Latn} Azerbaijani in Latin script.
+{az-arab} Azerbaijani in Arabic script;
+{az-cyrl} Azerbaijani in Cyrillic script;
+{az-latn} Azerbaijani in Latin script.
 
 =item {ban} : Balinese
 
@@ -473,8 +473,8 @@ eq Nyanja.  eq Chinyanja.
 
 Many forms are mutually un-intelligible in spoken media.
 Notable forms:
-{zh-Hans} Chinese, in simplified script;
-{zh-Hant} Chinese, in traditional script;
+{zh-hans} Chinese, in simplified script;
+{zh-hant} Chinese, in traditional script;
 {zh-tw} Taiwan Chinese;
 {zh-cn} PRC Chinese;
 {zh-sg} Singapore Chinese;
@@ -1370,8 +1370,8 @@ NOT Scots Gaelic!
 eq Serb.  NOT Sorbian.
 
 Notable forms:
-{sr-Cyrl} : Serbian in Cyrillic script;
-{sr-Latn} : Serbian in Latin script.
+{sr-cyrl} : Serbian in Cyrillic script;
+{sr-latn} : Serbian in Latin script.
 
 =item {srr} : Serer
 
@@ -1612,8 +1612,8 @@ Not a tag for normal use.
 eq E<Ouml>zbek
 
 Notable forms:
-{uz-Cyrl} Uzbek in Cyrillic script;
-{uz-Latn} Uzbek in Latin script.
+{uz-cyrl} Uzbek in Cyrillic script;
+{uz-latn} Uzbek in Latin script.
 
 =item {vai} : Vai
 
index be11906..256f375 100644 (file)
@@ -7,7 +7,7 @@ use Carp;
 use strict;
 use warnings;
 
-our $VERSION = "1.50";
+our $VERSION = "1.52";
 XSLoader::load 'IO', $VERSION;
 
 sub import {
index a471577..72cbed3 100644 (file)
@@ -18,7 +18,7 @@ use File::stat;
 use File::Spec;
 
 our @ISA = qw(Tie::Hash Exporter);
-our $VERSION = "1.49";
+our $VERSION = "1.52";
 
 our @EXPORT_OK = qw(DIR_UNLINK);
 
@@ -153,7 +153,7 @@ IO::Dir - supply object methods for directory handles
 =head1 SYNOPSIS
 
     use IO::Dir;
-    $d = IO::Dir->new(".");
+    my $d = IO::Dir->new(".");
     if (defined $d) {
         while (defined($_ = $d->read)) { something($_); }
         $d->rewind;
@@ -161,7 +161,7 @@ IO::Dir - supply object methods for directory handles
         undef $d;
     }
 
-    tie %dir, 'IO::Dir', ".";
+    tie my %dir, 'IO::Dir', ".";
     foreach (keys %dir) {
        print $_, " " , $dir{$_}->size,"\n";
     }
index 15ac635..a3ff37a 100644 (file)
@@ -10,29 +10,29 @@ IO::File - supply object methods for filehandles
 
     use IO::File;
 
-    $fh = IO::File->new();
+    my $fh = IO::File->new();
     if ($fh->open("< file")) {
         print <$fh>;
         $fh->close;
     }
 
-    $fh = IO::File->new("> file");
+    my $fh = IO::File->new("> file");
     if (defined $fh) {
         print $fh "bar\n";
         $fh->close;
     }
 
-    $fh = IO::File->new("file", "r");
+    my $fh = IO::File->new("file", "r");
     if (defined $fh) {
         print <$fh>;
         undef $fh;       # automatically closes the file
     }
 
-    $fh = IO::File->new("file", O_WRONLY|O_APPEND);
+    my $fh = IO::File->new("file", O_WRONLY|O_APPEND);
     if (defined $fh) {
         print $fh "corge\n";
 
-        $pos = $fh->getpos;
+        my $pos = $fh->getpos;
         $fh->setpos($pos);
 
         undef $fh;       # automatically closes the file
@@ -135,7 +135,7 @@ require Exporter;
 
 our @ISA = qw(IO::Handle IO::Seekable Exporter);
 
-our $VERSION = "1.48";
+our $VERSION = "1.52";
 
 our @EXPORT = @IO::Seekable::EXPORT;
 
index edaacff..18fe714 100644 (file)
@@ -8,20 +8,20 @@ IO::Handle - supply object methods for I/O handles
 
     use IO::Handle;
 
-    $io = IO::Handle->new();
+    my $io = IO::Handle->new();
     if ($io->fdopen(fileno(STDIN),"r")) {
         print $io->getline;
         $io->close;
     }
 
-    $io = IO::Handle->new();
+    my $io = IO::Handle->new();
     if ($io->fdopen(fileno(STDOUT),"w")) {
         $io->print("Some text\n");
     }
 
     # setvbuf is not available by default on Perls 5.8.0 and later.
     use IO::Handle '_IOLBF';
-    $io->setvbuf($buffer_var, _IOLBF, 1024);
+    $io->setvbuf(my $buffer_var, _IOLBF, 1024);
 
     undef $io;       # automatically closes the file if it's open
 
@@ -234,7 +234,7 @@ the taint-clean flag failed. (eg invalid handle)
 =head1 NOTE
 
 An C<IO::Handle> object is a reference to a symbol/GLOB reference (see
-the C<Symbol> package).  Some modules that
+the L<Symbol> package).  Some modules that
 inherit from C<IO::Handle> may want to keep object related variables
 in the hash table part of the GLOB. In an attempt to prevent modules
 trampling on each other I propose the that any such module should prefix
@@ -270,7 +270,7 @@ use IO ();  # Load the XS module
 require Exporter;
 our @ISA = qw(Exporter);
 
-our $VERSION = "1.48";
+our $VERSION = "1.52";
 
 our @EXPORT_OK = qw(
     autoflush
index 8b712da..a99391e 100644 (file)
@@ -13,7 +13,7 @@ use strict;
 use Carp;
 use Symbol;
 
-our $VERSION = "1.49";
+our $VERSION = "1.52";
 
 sub new {
     my $type = shift;
@@ -203,7 +203,7 @@ processes.
 =item new ( [READER, WRITER] )
 
 Creates an C<IO::Pipe>, which is a reference to a newly created symbol
-(see the C<Symbol> package). C<IO::Pipe::new> optionally takes two
+(see the L<Symbol> package). C<IO::Pipe::new> optionally takes two
 arguments, which should be objects blessed into C<IO::Handle>, or a
 subclass thereof. These two objects will be used for the system call
 to C<pipe>. If no arguments are given then method C<handles> is called
index b028e75..091461f 100644 (file)
@@ -12,7 +12,7 @@ use IO::Handle;
 use Exporter ();
 
 our @ISA = qw(Exporter);
-our $VERSION = "1.49";
+our $VERSION = "1.52";
 
 our @EXPORT = qw( POLLIN
              POLLOUT
index 4339fd9..c2a1b30 100644 (file)
@@ -106,7 +106,7 @@ require Exporter;
 our @EXPORT = qw(SEEK_SET SEEK_CUR SEEK_END);
 our @ISA = qw(Exporter);
 
-our $VERSION = "1.48";
+our $VERSION = "1.52";
 
 sub seek {
     @_ == 3 or croak 'usage: $io->seek(POS, WHENCE)';
index 4568b49..7eb99bd 100644 (file)
@@ -10,7 +10,7 @@ use     strict;
 use warnings::register;
 require Exporter;
 
-our $VERSION = "1.49";
+our $VERSION = "1.52";
 
 our @ISA = qw(Exporter); # This is only so we can do version checking
 
index 5153920..7c2540b 100644 (file)
@@ -23,7 +23,7 @@ require IO::Socket::UNIX if ($^O ne 'epoc' && $^O ne 'symbian');
 
 our @ISA = qw(IO::Handle);
 
-our $VERSION = "1.49";
+our $VERSION = "1.52";
 
 our @EXPORT_OK = qw(sockatmark);
 
index a2de00e..97d4450 100644 (file)
@@ -14,7 +14,7 @@ use Exporter;
 use Errno;
 
 our @ISA = qw(IO::Socket);
-our $VERSION = "1.49";
+our $VERSION = "1.52";
 
 my $EINVAL = exists(&Errno::EINVAL) ? Errno::EINVAL() : 1;
 
@@ -330,7 +330,7 @@ inherits all the methods defined by L<IO::Socket>.
 =item new ( [ARGS] )
 
 Creates an C<IO::Socket::INET> object, which is a reference to a
-newly created symbol (see the C<Symbol> package). C<new>
+newly created symbol (see the L<Symbol> package). C<new>
 optionally takes arguments, these arguments are in key-value pairs.
 
 In addition to the key-value pairs accepted by L<IO::Socket>,
index 60bdc04..89deec2 100644 (file)
@@ -11,7 +11,7 @@ use IO::Socket;
 use Carp;
 
 our @ISA = qw(IO::Socket);
-our $VERSION = "1.49";
+our $VERSION = "1.52";
 
 IO::Socket::UNIX->register_domain( AF_UNIX );
 
@@ -111,7 +111,7 @@ inherits all the methods defined by L<IO::Socket>.
 =item new ( [ARGS] )
 
 Creates an C<IO::Socket::UNIX> object, which is a reference to a
-newly created symbol (see the C<Symbol> package). C<new>
+newly created symbol (see the L<Symbol> package). C<new>
 optionally takes arguments, these arguments are in key-value pairs.
 
 In addition to the key-value pairs accepted by L<IO::Socket>,
index 08de250..78b5ba6 100644 (file)
@@ -10,7 +10,7 @@
 #ifndef POLL_H
 #  define POLL_H
 
-#if (defined(HAS_POLL) && defined(I_POLL)) || defined(POLLWRBAND)
+#if (defined(HAS_POLL) && defined(I_POLL)) || (defined(POLLWRBAND) && !defined(_WIN32))
 #  include <poll.h>
 #elif (defined(HAS_POLL) && defined(I_SYS_POLL))
 #  include <sys/poll.h>
 
 #define EMULATE_POLL_WITH_SELECT
 
+#ifdef _WIN32
+#  include <winsock2.h>
+#endif
+
 #ifdef poll
 # undef poll
 #endif
 #define poll Perl_my_poll
 
+#if WINVER < 0x0600
 typedef struct pollfd {
     int fd;
     short events;
     short revents;
 } pollfd_t;
 
-#define        POLLIN          0x0001
-#define        POLLPRI         0x0002
-#define        POLLOUT         0x0004
-#define        POLLRDNORM      0x0040
-#define        POLLWRNORM      POLLOUT
-#define        POLLRDBAND      0x0080
-#define        POLLWRBAND      0x0100
-#define        POLLNORM        POLLRDNORM
+#define POLLIN          0x0001
+#define POLLPRI         0x0002
+#define POLLOUT         0x0004
+#define POLLRDNORM      0x0040
+#define POLLWRNORM      POLLOUT
+#define POLLRDBAND      0x0080
+#define POLLWRBAND      0x0100
+#define POLLNORM        POLLRDNORM
 
 /* Return ONLY events (NON testable) */
 
-#define        POLLERR         0x0008
-#define        POLLHUP         0x0010
-#define        POLLNVAL        0x0020
+#define POLLERR         0x0008
+#define POLLHUP         0x0010
+#define POLLNVAL        0x0020
+
+#endif
 
 int poll (struct pollfd *, unsigned long, int);
 
index 122c4ae..718d01d 100644 (file)
@@ -120,8 +120,6 @@ SKIP: {
       skip "no Socket::SO_PROTOCOL", 1 if !defined(eval { Socket::SO_PROTOCOL });
       skip "SO_PROTOCOL defined but not implemented", 1
          if !defined $new->sockopt(Socket::SO_PROTOCOL);
-      skip "SO_PROTOCOL returns chosen protocol on OpenBSD", 1
-         if $^O eq 'openbsd';
       is($new->protocol(), $p, 'protocol match');
     }
     SKIP: {
index 6051e1c..986c896 100644 (file)
@@ -1,5 +1,9 @@
 Revision history for Perl suite Locale::Maketext
 
+2022-08-22
+   * Release 1.32 to CPAN
+   * Fix Makefile.PL logic for default install destination on 5.008 up to 5.011
+
 2022-04-14
    * Release 1.31 to CPAN
    * White space cleanup.
index 7ad09b7..8979c20 100644 (file)
@@ -25,7 +25,7 @@ BEGIN {
 }
 
 
-our $VERSION = '1.31';
+our $VERSION = '1.33';
 our @ISA = ();
 
 our $MATCH_SUPERS = 1;
index 19bb51e..b4c8f2f 100644 (file)
@@ -22,7 +22,7 @@ use Time::HiRes;
 @ISA = qw(Exporter);
 @EXPORT = qw(pingecho);
 @EXPORT_OK = qw(wakeonlan);
-$VERSION = "2.74";
+$VERSION = "2.76";
 
 # Globals
 
@@ -1081,8 +1081,7 @@ sub tcp_connect
 
 sub DESTROY {
   my $self = shift;
-  if ($self->{'proto'} eq 'tcp' &&
-      $self->{'tcp_chld'}) {
+  if ($self->{'proto'} && ($self->{'proto'} eq 'tcp') && $self->{'tcp_chld'}) {
     # Put that choking client out of its misery
     kill "KILL", $self->{'tcp_chld'};
     # Clean off the zombie
@@ -2004,13 +2003,13 @@ Net::Ping - check a remote host for reachability
 
     use Net::Ping;
 
-    $p = Net::Ping->new();
+    my $p = Net::Ping->new();
     print "$host is alive.\n" if $p->ping($host);
     $p->close();
 
-    $p = Net::Ping->new("icmp");
+    my $p = Net::Ping->new("icmp");
     $p->bind($my_addr); # Specify source interface of pings
-    foreach $host (@host_array)
+    foreach my $host (@host_array)
     {
         print "$host is ";
         print "NOT " unless $p->ping($host, 2);
@@ -2019,11 +2018,11 @@ Net::Ping - check a remote host for reachability
     }
     $p->close();
 
-    $p = Net::Ping->new("icmpv6");
-    $ip = "[fd00:dead:beef::4e]";
+    my $p = Net::Ping->new("icmpv6");
+    my $ip = "[fd00:dead:beef::4e]";
     print "$ip is alive.\n" if $p->ping($ip);
 
-    $p = Net::Ping->new("tcp", 2);
+    my $p = Net::Ping->new("tcp", 2);
     # Try connecting to the www port instead of the echo port
     $p->port_number(scalar(getservbyname("http", "tcp")));
     while ($stop_time > time())
@@ -2035,19 +2034,19 @@ Net::Ping - check a remote host for reachability
     undef($p);
 
     # Like tcp protocol, but with many hosts
-    $p = Net::Ping->new("syn");
+    my $p = Net::Ping->new("syn");
     $p->port_number(getservbyname("http", "tcp"));
-    foreach $host (@host_array) {
+    foreach my $host (@host_array) {
       $p->ping($host);
     }
-    while (($host,$rtt,$ip) = $p->ack) {
+    while (my ($host, $rtt, $ip) = $p->ack) {
       print "HOST: $host [$ip] ACKed in $rtt seconds.\n";
     }
 
     # High precision syntax (requires Time::HiRes)
-    $p = Net::Ping->new();
+    my $p = Net::Ping->new();
     $p->hires();
-    ($ret, $duration, $ip) = $p->ping($host, 5.5);
+    my ($ret, $duration, $ip) = $p->ping($host, 5.5);
     printf("$host [ip: $ip] is alive (packet return time: %.2f ms)\n",
             1000 * $duration)
       if $ret;
index 203d86b..8bfd91e 100755 (executable)
@@ -78,7 +78,7 @@ is($p->ping("127.0.0.1"), 1, 'first port is reachable');
 $p->{port_num} = $port2;
 
 {
-    local $TODO = "Believed not to work on $^O" if $^O =~ /^(?:hpux|MSWin32|os390|freebsd)$/;
+    local $TODO = "Believed not to work on $^O" if $^O =~ /^(?:MSWin32|os390)$/;
     is($p->ping("127.0.0.1"), 1, 'second port is reachable');
 }
 
@@ -133,7 +133,7 @@ SKIP: {
 
   {
     local $TODO = "Believed not to work on $^O"
-      if $^O =~ /^(?:hpux|MSWin32|os390|freebsd)$/;
+      if $^O =~ /^(?:MSWin32|os390)$/;
     is($p->ack(), '127.0.0.1', 'IP should be reachable');
   }
 }
index 9533c1f..47e172a 100644 (file)
@@ -1,5 +1,29 @@
 Revision history for Perl distribution PathTools.
 
+3.87-3.88
+
+- Fix handling of empty path, VMS fixes.
+
+3.86
+
+- Fix compilation warning on illumos based platforms
+
+3.85
+
+- Fix issue related to tainting empty PATH
+
+3.84
+
+- Add PerlIO_readlink backcompat defines to Cws.xs
+
+3.83
+
+- More bugtracker changes, document maintainer is the Perl-5 Porters
+
+3.82
+
+- Change to build so bugreports go to GitHub
+
 3.81
 
 - compare inode numbers as strings (github #18788)
index 0683583..dbf08a6 100644 (file)
@@ -3,7 +3,7 @@ use strict;
 use Exporter;
 
 
-our $VERSION = '3.84';
+our $VERSION = '3.89';
 my $xs_version = $VERSION;
 $VERSION =~ tr/_//d;
 
@@ -192,8 +192,14 @@ sub _backtick_pwd {
     # Localize %ENV entries in a way that won't create new hash keys.
     # Under AmigaOS we don't want to localize as it stops perl from
     # finding 'sh' in the PATH.
-    my @localize = grep exists $ENV{$_}, qw(PATH IFS CDPATH ENV BASH_ENV) if $^O ne "amigaos";
+    my @localize = grep exists $ENV{$_}, qw(IFS CDPATH ENV BASH_ENV) if $^O ne "amigaos";
     local @ENV{@localize} if @localize;
+    # empty PATH is the same as "." on *nix, so localize it to /something/
+    # we won't *use* the path as code above turns $pwd_cmd into a specific
+    # executable, but it will blow up anyway under taint. We could set it to
+    # anything absolute. Perhaps "/" would be better.
+    local $ENV{PATH}= "/usr/bin"
+        if $^O ne "amigaos";
     
     my $cwd = `$pwd_cmd`;
     # Belt-and-suspenders in case someone said "undef $/".
index 4fda057..ca8639d 100644 (file)
@@ -7,13 +7,11 @@
 #include "EXTERN.h"
 #include "perl.h"
 #include "XSUB.h"
-#ifndef NO_PPPORT_H
-#  define NEED_croak_xs_usage
-#  define NEED_sv_2pv_flags
-#  define NEED_my_strlcpy
-#  define NEED_my_strlcat
-#  include "ppport.h"
-#endif
+#define NEED_croak_xs_usage
+#define NEED_sv_2pv_flags
+#define NEED_my_strlcpy
+#define NEED_my_strlcat
+#include "ppport.h"
 
 #if defined(HAS_READLINK) && !defined(PerlLIO_readlink)
 #define PerlLIO_readlink readlink
 #endif
 
 /* For special handling of os390 sysplexed systems */
+#ifdef OS390
 #define SYSNAME "$SYSNAME"
 #define SYSNAME_LEN (sizeof(SYSNAME) - 1)
+#endif
 
 /* The realpath() implementation from OpenBSD 3.9 to 4.2 (realpath.c 1.13)
  * Renamed here to bsd_realpath() to avoid library conflicts.
@@ -202,7 +202,7 @@ bsd_realpath(const char *path, char resolved[MAXPATHLEN])
                     if (slen < 0)
                         return (NULL);
                     symlink[slen] = '\0';
-#  ifdef EBCDIC /* XXX Probably this should be only os390 */
+#  ifdef OS390
                     /* Replace all instances of $SYSNAME/foo simply by /foo */
                     if (slen > SYSNAME_LEN + strlen(next_token)
                         && strnEQ(symlink, SYSNAME, SYSNAME_LEN)
@@ -245,7 +245,7 @@ bsd_realpath(const char *path, char resolved[MAXPATHLEN])
                     }
                     remaining_len = my_strlcpy(remaining, symlink, sizeof(remaining));
                 }
-#  ifdef EBCDIC
+#  ifdef OS390
               not_symlink: ;
 #  endif
             }
index 0311708..754acbe 100644 (file)
@@ -29,10 +29,7 @@ WriteMakefile
           'VERSION_FROM' => 'Cwd.pm',
           'ABSTRACT' => 'Tools for working with directory and file names',
           'AUTHOR' => 'Perl 5 Porters',
-          'DEFINE' => join(" ",
-                "-DDOUBLE_SLASHES_SPECIAL=@{[$^O eq q(qnx) || $^O eq q(nto) ? 1 : 0]}",
-                ((grep { $_ eq 'PERL_CORE=1' } @ARGV) ? '-DNO_PPPORT_H' : ()),
-          ),
+          'DEFINE' => "-DDOUBLE_SLASHES_SPECIAL=@{[$^O eq q(qnx) || $^O eq q(nto) ? 1 : 0]}",
           'PREREQ_PM' => {
                            'Carp' => '0',
                            'File::Basename' => '0',
index e0a49ed..fc10c0f 100644 (file)
@@ -2,7 +2,7 @@ package File::Spec;
 
 use strict;
 
-our $VERSION = '3.84';
+our $VERSION = '3.88';
 $VERSION =~ tr/_//d;
 
 my %module = (
@@ -33,13 +33,13 @@ File::Spec - portably perform operations on file names
 
        use File::Spec;
 
-       $x=File::Spec->catfile('a', 'b', 'c');
+       my $x = File::Spec->catfile('a', 'b', 'c');
 
 which returns 'a/b/c' under Unix. Or:
 
        use File::Spec::Functions;
 
-       $x = catfile('a', 'b', 'c');
+       my $x = catfile('a', 'b', 'c');
 
 =head1 DESCRIPTION
 
index a29617c..3fc3c98 100644 (file)
@@ -3,7 +3,7 @@ package File::Spec::AmigaOS;
 use strict;
 require File::Spec::Unix;
 
-our $VERSION = '3.84';
+our $VERSION = '3.88';
 $VERSION =~ tr/_//d;
 
 our @ISA = qw(File::Spec::Unix);
index e21c0bb..fb3eaaa 100644 (file)
@@ -3,7 +3,7 @@ package File::Spec::Cygwin;
 use strict;
 require File::Spec::Unix;
 
-our $VERSION = '3.84';
+our $VERSION = '3.88';
 $VERSION =~ tr/_//d;
 
 our @ISA = qw(File::Spec::Unix);
index 2429bb2..9391f3a 100644 (file)
@@ -2,7 +2,7 @@ package File::Spec::Epoc;
 
 use strict;
 
-our $VERSION = '3.84';
+our $VERSION = '3.88';
 $VERSION =~ tr/_//d;
 
 require File::Spec::Unix;
index a09150c..a0d8641 100644 (file)
@@ -3,7 +3,7 @@ package File::Spec::Functions;
 use File::Spec;
 use strict;
 
-our $VERSION = '3.84';
+our $VERSION = '3.88';
 $VERSION =~ tr/_//d;
 
 require Exporter;
index 369d1f0..5f5cca9 100644 (file)
@@ -4,7 +4,7 @@ use strict;
 use Cwd ();
 require File::Spec::Unix;
 
-our $VERSION = '3.84';
+our $VERSION = '3.88';
 $VERSION =~ tr/_//d;
 
 our @ISA = qw(File::Spec::Unix);
index 604e2e3..eea5328 100644 (file)
@@ -4,7 +4,7 @@ use strict;
 use Cwd ();
 require File::Spec::Unix;
 
-our $VERSION = '3.84';
+our $VERSION = '3.88';
 $VERSION =~ tr/_//d;
 
 our @ISA = qw(File::Spec::Unix);
index 52904b4..2d5af10 100644 (file)
@@ -3,7 +3,7 @@ package File::Spec::Unix;
 use strict;
 use Cwd ();
 
-our $VERSION = '3.84';
+our $VERSION = '3.88';
 $VERSION =~ tr/_//d;
 
 =head1 NAME
index 69a39bb..e5d5a38 100644 (file)
@@ -4,7 +4,7 @@ use strict;
 use Cwd ();
 require File::Spec::Unix;
 
-our $VERSION = '3.84';
+our $VERSION = '3.88';
 $VERSION =~ tr/_//d;
 
 our @ISA = qw(File::Spec::Unix);
index b05b535..292c2f8 100644 (file)
@@ -5,7 +5,7 @@ use strict;
 use Cwd ();
 require File::Spec::Unix;
 
-our $VERSION = '3.84';
+our $VERSION = '3.88';
 $VERSION =~ tr/_//d;
 
 our @ISA = qw(File::Spec::Unix);
index 38791ce..32eb3eb 100644 (file)
@@ -3,7 +3,7 @@ package Safe;
 use 5.003_11;
 use Scalar::Util qw(reftype refaddr);
 
-$Safe::VERSION = "2.43";
+$Safe::VERSION = "2.44";
 
 # *** Don't declare any lexicals above this point ***
 #
index ea15931..57c46b6 100755 (executable)
@@ -453,7 +453,7 @@ dor         $x // $y
 dorassign      $x //= $y
 once           SKIP {use feature 'state'; state $foo = 42;}
 say            SKIP {use feature 'say'; say "foo";}
-smartmatch     no warnings 'experimental::smartmatch'; $x ~~ $y
+smartmatch     no warnings 'deprecated'; $x ~~ $y
 aeach          SKIP each @t
 akeys          SKIP keys @t
 avalues                SKIP values @t
index b1f4790..6619543 100644 (file)
@@ -1,3 +1,32 @@
+2023-05-26 21:36:00 demerphq
+    version 3.32
+        * Update security advisory to be more clear
+
+2023-02-26 00:31:32 demerphq
+    version 3.31
+        * Fixup for ppport fix in 3.30
+
+2023-02-22 09:56:27 leont
+    version 3.30
+        * Use ppport for all modules in dist.
+
+2023-01-04 17:33:24 iabyn
+    version 3.29
+        * Store code fixes identified from refcounted stack patch
+
+2022-11-08 10:12:46 tony
+    version 3.28
+        * Store hook error reporting improvements
+       * Store hook handles regex objects properly.
+
+2022-06-20 20:32:29 toddr
+    version 3.27
+        * Use cBOOL instead of !! in xs code
+
+2022-04-18 17:36:00 toddr
+    version 3.26
+        * Conform to ppport.h 3.68 recommendations
+
 2021-08-30 07:46:52 nwclark
     version 3.25
         * No changes from previous version
index ef417c6..d531f2b 100644 (file)
@@ -28,7 +28,7 @@ our @EXPORT_OK = qw(
 our ($canonical, $forgive_me);
 
 BEGIN {
-  our $VERSION = '3.26';
+  our $VERSION = '3.32';
 }
 
 our $recursion_limit;
@@ -1197,11 +1197,16 @@ compartment:
 
 =head1 SECURITY WARNING
 
-B<Do not accept Storable documents from untrusted sources!>
+B<Do not accept Storable documents from untrusted sources!> There is
+B<no> way to configure Storable so that it can be used safely to process
+untrusted data.  While there I<are> various options that can be used to
+mitigate specific security issues these options do I<not> comprise a
+complete safety net for the user, and processing untrusted data may
+result in segmentation faults, remote code execution, or privilege
+escalation.  The following lists some known features which represent
+security issues that should be considered by users of this module.
 
-Some features of Storable can lead to security vulnerabilities if you
-accept Storable documents from untrusted sources with the default
-flags. Most obviously, the optional (off by default) CODE reference
+Most obviously, the optional (off by default) CODE reference
 serialization feature allows transfer of code to the deserializing
 process. Furthermore, any serialized object will cause Storable to
 helpfully load the module corresponding to the class of the object in
@@ -1224,12 +1229,15 @@ With the default setting of C<$Storable::flags> = 6, creating or destroying
 random objects, even renamed objects can be controlled by an attacker.
 See CVE-2015-1592 and its metasploit module.
 
-If your application requires accepting data from untrusted sources,
-you are best off with a less powerful and more-likely safe
-serialization format and implementation. If your data is sufficiently
-simple, L<Cpanel::JSON::XS>, L<Data::MessagePack> or L<Sereal> are the best
-choices and offer maximum interoperability, but note that Sereal is
-L<unsafe by default|Sereal::Decoder/ROBUSTNESS>.
+If your application requires accepting data from untrusted sources, you
+are best off with a less powerful and more-likely safe serialization
+format and implementation.  If your data is sufficiently simple,
+L<Cpanel::JSON::XS> or L<Data::MessagePack> are fine alternatives.  For
+more complex data structures containing various Perl specific data types
+like regular expressions or aliased data L<Sereal> is the best
+alternative and offers maximum interoperability.  Note that Sereal is
+L<unsafe by default|Sereal::Decoder/ROBUSTNESS>, but you can configure
+the encoder and decoder to mitigate any security issues.
 
 =head1 WARNING
 
index 53c838c..a558dd7 100644 (file)
 #include <perl.h>
 #include <XSUB.h>
 
-#ifndef PERL_VERSION_LT
-# if !defined(PERL_VERSION) || !defined(PERL_REVISION) || ( PERL_REVISION == 5 && ( PERL_VERSION < 10 || (PERL_VERSION == 10 && PERL_SUBVERSION < 1) ) )
-#   define NEED_PL_parser
-#   define NEED_sv_2pv_flags
-#   define NEED_load_module
-#   define NEED_vload_module
-#   define NEED_newCONSTSUB
-#   define NEED_newSVpvn_flags
-#   define NEED_newRV_noinc
-# endif
+#define NEED_sv_2pv_flags
+#define NEED_load_module
+#define NEED_vload_module
+#define NEED_newCONSTSUB
+#define NEED_newSVpvn_flags
+#define NEED_newRV_noinc
 #include "ppport.h"             /* handle old perls */
-#endif
 
 #ifdef DEBUGGING
 #define DEBUGME /* Debug mode, turns assertions on as well */
 #define SX_SVUNDEF_ELEM        C(31)   /* array element set to &PL_sv_undef */
 #define SX_REGEXP      C(32)   /* Regexp */
 #define SX_LOBJECT     C(33)   /* Large object: string, array or hash (size >2G) */
-#define SX_LAST                C(34)   /* invalid. marker only */
+#define SX_BOOLEAN_TRUE        C(34)   /* Boolean true */
+#define SX_BOOLEAN_FALSE       C(35)   /* Boolean false */
+#define SX_LAST                C(36)   /* invalid. marker only */
 
 /*
  * Those are only used to retrieve "old" pre-0.6 binary images.
@@ -975,7 +972,7 @@ static const char byteorderstr_56[] = {BYTEORDER_BYTES_56, 0};
 #endif
 
 #define STORABLE_BIN_MAJOR     2               /* Binary major "version" */
-#define STORABLE_BIN_MINOR     11              /* Binary minor "version" */
+#define STORABLE_BIN_MINOR     12              /* Binary minor "version" */
 
 #if !defined (SvVOK)
 /*
@@ -1454,6 +1451,8 @@ static const sv_retrieve_t sv_old_retrieve[] = {
     (sv_retrieve_t)retrieve_other,     /* SX_SVUNDEF_ELEM not supported */
     (sv_retrieve_t)retrieve_other,     /* SX_REGEXP */
     (sv_retrieve_t)retrieve_other,     /* SX_LOBJECT not supported */
+    (sv_retrieve_t)retrieve_other,     /* SX_BOOLEAN_TRUE not supported */
+    (sv_retrieve_t)retrieve_other,     /* SX_BOOLEAN_FALSE not supported */
     (sv_retrieve_t)retrieve_other,     /* SX_LAST */
 };
 
@@ -1477,6 +1476,8 @@ static SV *retrieve_weakoverloaded(pTHX_ stcxt_t *cxt, const char *cname);
 static SV *retrieve_vstring(pTHX_ stcxt_t *cxt, const char *cname);
 static SV *retrieve_lvstring(pTHX_ stcxt_t *cxt, const char *cname);
 static SV *retrieve_svundef_elem(pTHX_ stcxt_t *cxt, const char *cname);
+static SV *retrieve_boolean_true(pTHX_ stcxt_t *cxt, const char *cname);
+static SV *retrieve_boolean_false(pTHX_ stcxt_t *cxt, const char *cname);
 
 static const sv_retrieve_t sv_retrieve[] = {
     0,                                 /* SX_OBJECT -- entry unused dynamically */
@@ -1513,6 +1514,8 @@ static const sv_retrieve_t sv_retrieve[] = {
     (sv_retrieve_t)retrieve_svundef_elem,/* SX_SVUNDEF_ELEM */
     (sv_retrieve_t)retrieve_regexp,    /* SX_REGEXP */
     (sv_retrieve_t)retrieve_lobject,   /* SX_LOBJECT */
+    (sv_retrieve_t)retrieve_boolean_true,      /* SX_BOOLEAN_TRUE */
+    (sv_retrieve_t)retrieve_boolean_false,     /* SX_BOOLEAN_FALSE */
     (sv_retrieve_t)retrieve_other,     /* SX_LAST */
 };
 
@@ -2454,6 +2457,16 @@ static int store_scalar(pTHX_ stcxt_t *cxt, SV *sv)
             pv = SvPV(sv, len);                /* We know it's SvPOK */
             goto string;                       /* Share code below */
         }
+#ifdef SvIsBOOL
+    } else if (SvIsBOOL(sv)) {
+        TRACEME(("mortal boolean"));
+        if (SvTRUE_nomg_NN(sv)) {
+            PUTMARK(SX_BOOLEAN_TRUE);
+        }
+        else {
+            PUTMARK(SX_BOOLEAN_FALSE);
+        }
+#endif
     } else if (flags & SVf_POK) {
         /* public string - go direct to string read.  */
         goto string_readlen;
@@ -3250,6 +3263,7 @@ static int store_code(pTHX_ stcxt_t *cxt, CV *cv)
         CROAK(("Unexpected return value from B::Deparse::coderef2text\n"));
 
     text = POPs;
+    PUTBACK;
     len = SvCUR(text);
     reallen = strlen(SvPV_nolen(text));
 
@@ -3567,7 +3581,10 @@ static int store_hook(
     int need_large_oids = 0;
 #endif
 
-    TRACEME(("store_hook, classname \"%s\", tagged #%d", HvNAME_get(pkg), (int)cxt->tagnum));
+    classname = HvNAME_get(pkg);
+    len = strlen(classname);
+
+    TRACEME(("store_hook, classname \"%s\", tagged #%d", classname, (int)cxt->tagnum));
 
     /*
      * Determine object type on 2 bits.
@@ -3576,6 +3593,7 @@ static int store_hook(
     switch (type) {
     case svis_REF:
     case svis_SCALAR:
+    case svis_REGEXP:
         obj_type = SHT_SCALAR;
         break;
     case svis_ARRAY:
@@ -3615,13 +3633,20 @@ static int store_hook(
         }
         break;
     default:
-        CROAK(("Unexpected object type (%d) in store_hook()", type));
+        {
+            /* pkg_can() always returns a ref to a CV on success */
+            CV *cv = (CV*)SvRV(hook);
+            const GV * const gv = CvGV(cv);
+            const char *gvname = GvNAME(gv);
+            const HV * const stash = GvSTASH(gv);
+            const char *hvname = stash ? HvNAME(stash) : NULL;
+
+            CROAK(("Unexpected object type (%s) of class '%s' in store_hook() calling %s::%s",
+                   sv_reftype(sv, FALSE), classname, hvname, gvname));
+        }
     }
     flags = SHF_NEED_RECURSE | obj_type;
 
-    classname = HvNAME_get(pkg);
-    len = strlen(classname);
-
     /*
      * To call the hook, we need to fake a call like:
      *
@@ -5882,6 +5907,50 @@ static SV *retrieve_integer(pTHX_ stcxt_t *cxt, const char *cname)
     return sv;
 }
 
+/*
+ * retrieve_boolean_true
+ *
+ * Retrieve boolean true copy.
+ */
+static SV *retrieve_boolean_true(pTHX_ stcxt_t *cxt, const char *cname)
+{
+    SV *sv;
+    HV *stash;
+
+    TRACEME(("retrieve_boolean_true (#%d)", (int)cxt->tagnum));
+
+    sv = newSVsv(&PL_sv_yes);
+    stash = cname ? gv_stashpv(cname, GV_ADD) : 0;
+    SEEN_NN(sv, stash, 0);  /* Associate this new scalar with tag "tagnum" */
+
+    TRACEME(("boolean true"));
+    TRACEME(("ok (retrieve_boolean_true at 0x%" UVxf ")", PTR2UV(sv)));
+
+    return sv;
+}
+
+/*
+ * retrieve_boolean_false
+ *
+ * Retrieve boolean false copy.
+ */
+static SV *retrieve_boolean_false(pTHX_ stcxt_t *cxt, const char *cname)
+{
+    SV *sv;
+    HV *stash;
+
+    TRACEME(("retrieve_boolean_false (#%d)", (int)cxt->tagnum));
+
+    sv = newSVsv(&PL_sv_no);
+    stash = cname ? gv_stashpv(cname, GV_ADD) : 0;
+    SEEN_NN(sv, stash, 0);  /* Associate this new scalar with tag "tagnum" */
+
+    TRACEME(("boolean false"));
+    TRACEME(("ok (retrieve_boolean_false at 0x%" UVxf ")", PTR2UV(sv)));
+
+    return sv;
+}
+
 /*
  * retrieve_lobject
  *
@@ -7774,7 +7843,7 @@ CODE:
         assert(cxt);
         result = cxt->entry && (cxt->optype & ix) ? TRUE : FALSE;
     } else {
-        result = !!last_op_in_netorder(aTHX);
+        result = cBOOL(last_op_in_netorder(aTHX));
     }
     ST(0) = boolSV(result);
 
index 8247893..13d4fa6 100644 (file)
@@ -11,7 +11,7 @@ use Fcntl 'O_CREAT', 'O_RDWR', 'LOCK_EX', 'LOCK_SH', 'O_WRONLY', 'O_RDONLY';
 sub O_ACCMODE () { O_RDONLY | O_RDWR | O_WRONLY }
 
 
-our $VERSION = "1.06";
+our $VERSION = "1.07";
 my $DEFAULT_MEMORY_SIZE = 1<<21;    # 2 megabytes
 my $DEFAULT_AUTODEFER_THRESHHOLD = 3; # 3 records
 my $DEFAULT_AUTODEFER_FILELEN_THRESHHOLD = 65536; # 16 disk blocksful
index 96f058a..2b681e9 100644 (file)
@@ -4,6 +4,19 @@ Revision history for the Perl extension Time::HiRes.
 
  - Remove obsolete vms code
  - Use core version compare
+ - Use GIMME_V instead of the deprecated GIMME
+ - t/utime.t: dragonflybsd has only microsecond precision
+ - t/utime.t: dragonflybsd is noatime by default
+ - t/stat.t: skip testing access times on HaikuOS, it doesn't support
+   atime
+ - darwin: make sure the compiler can find the system perl headers
+   https://github.com/Perl/perl5/issues/20362
+ - darwin: make sure PERL_DARWIN is defined on darwin.
+ - don't compare stat and lstat atime if PERL_FILE_ATIME_CHANGES is set in
+   the environment.
+   https://github.com/Perl/perl5/issues/19321
+ - don't use C++ guards around the perl header files, it caused C++
+   build failures with MSVC.
 
 1.9764 [2020-08-10]
  - Fix a bunch of repeated-word typos
index 7e21047..b8cd263 100644 (file)
@@ -50,7 +50,7 @@ our @EXPORT_OK = qw (usleep sleep ualarm alarm gettimeofday time tv_interval
                  stat lstat utime
                 );
 
-our $VERSION = '1.9770';
+our $VERSION = '1.9775';
 our $XS_VERSION = $VERSION;
 $VERSION = eval $VERSION;
 
index 1eb7de3..7320cb8 100644 (file)
  * it under the same terms as Perl itself.
  */
 
-#ifdef __cplusplus
-extern "C" {
-#endif
 #define PERL_NO_GET_CONTEXT
 #include "EXTERN.h"
 #include "perl.h"
 #include "XSUB.h"
 #include "reentr.h"
-#ifdef USE_PPPORT_H
+#if !defined(IS_SAFE_PATHNAME) && defined(TIME_HIRES_UTIME) && defined(HAS_UTIMENSAT)
 #define NEED_ck_warner
-#  include "ppport.h"
 #endif
+#include "ppport.h"
 #if defined(__CYGWIN__) && defined(HAS_W32API_WINDOWS_H)
 #  include <w32api/windows.h>
 #  define CYGWIN_WITH_W32API
@@ -40,9 +37,6 @@ extern "C" {
 #if defined(TIME_HIRES_CLOCK_GETTIME_SYSCALL) || defined(TIME_HIRES_CLOCK_GETRES_SYSCALL)
 #  include <syscall.h>
 #endif
-#ifdef __cplusplus
-}
-#endif
 
 #ifndef GCC_DIAG_IGNORE
 #  define GCC_DIAG_IGNORE(x)
@@ -263,8 +257,6 @@ _gettimeofday(pTHX_ struct timeval *tp, void *not_used)
 static int
 _clock_gettime(pTHX_ clockid_t clock_id, struct timespec *tp)
 {
-    FT_t ft;
-
     switch (clock_id) {
     case CLOCK_REALTIME: {
         FT_t ft;
@@ -1193,7 +1185,7 @@ gettimeofday()
         int status;
         status = gettimeofday (&Tp, NULL);
         if (status == 0) {
-            if (GIMME == G_LIST) {
+            if (GIMME_V == G_LIST) {
                 EXTEND(sp, 2);
                 PUSHs(sv_2mortal(newSViv(Tp.tv_sec)));
                 PUSHs(sv_2mortal(newSViv(Tp.tv_usec)));
@@ -1250,7 +1242,7 @@ setitimer(which, seconds, interval = 0)
         if (setitimer(which, &newit, &oldit) == 0) {
             EXTEND(sp, 1);
             PUSHs(sv_2mortal(newSVnv(TV2NV(oldit.it_value))));
-            if (GIMME == G_LIST) {
+            if (GIMME_V == G_LIST) {
                 EXTEND(sp, 1);
                 PUSHs(sv_2mortal(newSVnv(TV2NV(oldit.it_interval))));
             }
@@ -1270,7 +1262,7 @@ getitimer(which)
         if (getitimer(which, &nowit) == 0) {
             EXTEND(sp, 1);
             PUSHs(sv_2mortal(newSVnv(TV2NV(nowit.it_value))));
-            if (GIMME == G_LIST) {
+            if (GIMME_V == G_LIST) {
                 EXTEND(sp, 1);
                 PUSHs(sv_2mortal(newSVnv(TV2NV(nowit.it_interval))));
             }
index e5ba503..ac56d8d 100644 (file)
@@ -68,11 +68,20 @@ __EOD__
             }
         }
 
-        my $ccflags = $Config{'ccflags'} . ' ' . "-I$COREincdir"
-         . ' -DPERL_NO_INLINE_FUNCTIONS';
+        my $ccflags = $Config{'ccflags'} . ' ';
+        my @osvers = split /\./, $Config{osvers};
+        if ($^O eq "darwin"
+            && $^X eq "/usr/bin/perl"
+            && $osvers[0] >= 18) {
+            $ccflags .= qq(-iwithsysroot "$COREincdir");
+        }
+        else {
+            $ccflags .= "-I$COREincdir"
+        }
+        $ccflags .= ' -DPERL_NO_INLINE_FUNCTIONS';
 
         if ($^O eq 'VMS') {
-            $cccmd = "$Config{'cc'} /include=($COREincdir) $tmp.c";
+            $cccmd = "$Config{'cc'} $Config{'ccflags'} /include=($COREincdir) $tmp.c";
         }
 
         if ($args{silent} || !$VERBOSE) {
@@ -841,6 +850,11 @@ EOM
             print "NOT found.\n";
         }
     }
+    if ($^O eq "darwin") {
+        # the system perl on darwin doesn't seem to include -DPERL_DARWIN
+        # which breaks setting up emulation
+        DEFINE("PERL_DARWIN");
+    }
 
     if ($DEFINE) {
         $DEFINE =~ s/^\s+//;
@@ -854,8 +868,6 @@ EOM
 sub doMakefile {
     my @makefileopts = ();
 
-    DEFINE('USE_PPPORT_H') unless $ENV{PERL_CORE};
-
     push (@makefileopts,
         'NAME'  => 'Time::HiRes',
         'AUTHOR'    => 'Jarkko Hietaniemi <jhi@iki.fi>',
index 1f1fa96..2f72fdc 100644 (file)
@@ -36,7 +36,11 @@ for (1..5) {
     SKIP: {
         if($^O eq "haiku") {
             skip "testing stat access time on Haiku", 2;
-        }  
+        }
+        if ($ENV{PERL_FILE_ATIME_CHANGES}) {
+            # something else might access the file, changing atime
+            $lstat->[8] = $stat->[8];
+        }
         is_deeply $lstat, $stat, "write: stat and lstat returned same values";
         Time::HiRes::sleep(rand(0.1) + 0.1);
         open(X, '<', $$);
index af5586a..ff5ca31 100644 (file)
@@ -16,7 +16,7 @@ no strict 'refs';
 
 package XSLoader;
 
-our $VERSION = "0.31"; # remember to update version in POD!
+our $VERSION = "0.32"; # remember to update version in POD!
 
 package DynaLoader;
 
@@ -207,7 +207,7 @@ XSLoader - Dynamically load C libraries into Perl code
 
 =head1 VERSION
 
-Version 0.31
+Version 0.32
 
 =head1 SYNOPSIS
 
index 2103db2..7e312e4 100755 (executable)
@@ -7,11 +7,6 @@ use Config;
 
 my $db_file;
 BEGIN {
-    if (not eval "use Test::More; 1") {
-        print "1..0 # Skip: Test::More not available\n";
-        die "Test::More not available\n";
-    }
-
     use Config;
     foreach (qw/SDBM_File GDBM_File ODBM_File NDBM_File DB_File/) {
         if ($Config{extensions} =~ /\b$_\b/) {
@@ -21,6 +16,106 @@ BEGIN {
     }
 }
 
+# mini test implementation. We're going to be playing with the XS bits of
+# various modules that may be used by Test::More, so it's best to avoid. Since
+# XSLoader is dual life, we can't use something like perl's t/test.pl
+my $planned_tests;
+my $tests;
+my $passed_tests;
+sub ok ($;$) {
+    my ($ok, $name) = @_;
+    $tests++;
+    $passed_tests += 1 if $ok;
+    print STDOUT "not "
+        if !$ok;
+    print STDOUT "ok $tests";
+    print STDOUT " - $name"
+        if defined $name;
+    print "\n";
+    return $ok;
+}
+sub is ($$;$) {
+    my ($got, $want, $name) = @_;
+
+    my $ok
+        = !defined $want && !defined $got
+        || defined $want && defined $got && $got eq $want;
+
+    defined $_ or $_ = '[undef]'
+        for $got, $want;
+
+    ok($ok, $name)
+        or diag("Got: $got\nExpected: $want");
+
+    return $ok;
+}
+sub can_ok ($@) {
+    my ($inv, @methods) = @_;
+    die "only supports one method"
+        if @methods != 1;
+    ok $inv->can($methods[0]), "$inv->can('$methods[0]')";
+}
+sub skip ($$) {
+    my ($message, $count) = @_;
+    die "bad skip"
+        if !$count || $count =~ /[^0-9]/;
+    for (1..$count) {
+        $tests++;
+        print STDOUT "ok $tests # skip $message\n";
+    }
+    $passed_tests += $count;
+    no warnings 'exiting';
+    last SKIP;
+}
+sub like ($$;$) {
+    my ($got, $want_re, $name) = @_;
+    if (!ref $want_re) {
+        $want_re =~ m{\A/(.*)/([a-z]*)\z}
+            or die "bad regex $want_re";
+        $want_re = (length $2 ? "(?$2)" : '') . $1;
+    }
+    my $ok = $got =~ $want_re;
+    ok($ok, $name)
+        or diag("Got: $got\nExpected: $want_re");
+    return $ok;
+}
+sub diag {
+    my ($message) = @_;
+    $message =~ s/\n?\z/\n/;
+    $message =~ s/^/# /gm;
+    print STDERR $message;
+}
+END {
+    if (!defined $planned_tests) {
+        print STDERR "# No plan was declared!\n";
+        $? = 254;
+        return;
+    }
+
+    if ($tests != $planned_tests) {
+        print STDERR "# Looks like you planned $planned_tests test but ran $tests.\n";
+        $? = abs($planned_tests - $tests);
+    }
+    elsif ($passed_tests != $tests) {
+        my $failed = $tests - $passed_tests;
+        print STDERR "# Looks like you failed $failed test but ran $tests.\n";
+    }
+}
+sub plan {
+    my %opts = @_;
+    die "already planned"
+        if defined $planned_tests;
+    if (my $skip_all = $opts{skip_all}) {
+        print STDOUT "1..0 # SKIP $skip_all\n";
+        $planned_tests = 0;
+        exit 0;
+    }
+    elsif ($planned_tests = $opts{tests}) {
+        print STDOUT "1..$planned_tests\n";
+    }
+}
+
+###
 
 my %modules = (
     # ModuleName  => q|code to check that it was loaded|,
@@ -33,10 +128,9 @@ my %modules = (
     'Time::HiRes'=> q| ::can_ok( 'Time::HiRes' => 'usleep'  ) |,  # 5.7.3
 );
 
-plan tests => keys(%modules) * 3 + 10;
+plan tests => keys(%modules) * 3 + 9;
 
-# Try to load the module
-use_ok( 'XSLoader' );
+use XSLoader;
 
 # Check functions
 can_ok( 'XSLoader' => 'load' );
index d75277e..e09836d 100644 (file)
@@ -1,5 +1,5 @@
 package encoding::warnings;
-$encoding::warnings::VERSION = '0.13';
+$encoding::warnings::VERSION = '0.14';
 
 use strict;
 use 5.007;
@@ -32,7 +32,7 @@ thereafter.
     use encoding::warnings; # or 'FATAL' to raise fatal exceptions
 
     utf8::encode($a = chr(20000));  # a byte-string (raw bytes)
-    $b = chr(20000);               # a unicode-string (wide characters)
+    $b = chr(20000);                # a unicode-string (wide characters)
 
     # "Bytes implicitly upgraded into wide characters as iso-8859-1"
     $c = $a . $b;
@@ -133,9 +133,9 @@ some people:
     use encoding 'big5';
 
     my $byte_string = pack("C*", 0xA4, 0x40);
-    print length $a;   # 2 here.
-    $a .= "";          # concatenating with a unicode string...
-    print length $a;   # 1 here!
+    print length $a;    # 2 here.
+    $a .= "";           # concatenating with a unicode string...
+    print length $a;    # 1 here!
 
 In other words, do not C<use encoding> unless you are certain that the
 program will not deal with any raw, 8-bit binary data at all.
@@ -162,11 +162,11 @@ sub FATAL  () { 2 }
 
 sub import {
     if ($] >= 5.025003) {
-       require Carp;
-       Carp::cluck(
-           "encoding::warnings is not supported on Perl 5.26.0 and later"
-       );
-       return;
+        require Carp;
+        Carp::cluck(
+            "encoding::warnings is not supported on Perl 5.26.0 and later"
+        );
+        return;
     }
 
     # Install a ${^ENCODING} handler if no other one are already in place.
@@ -185,11 +185,11 @@ sub import {
 
     # Install a warning handler for decode()
     my $decoder = bless(
-       [
-           $ascii,
-           $latin1,
-           (($fatal eq 'FATAL') ? 'Carp::croak' : 'Carp::carp'),
-       ], $class,
+        [
+            $ascii,
+            $latin1,
+            (($fatal eq 'FATAL') ? 'Carp::croak' : 'Carp::carp'),
+        ], $class,
     );
 
     no warnings 'deprecated';
index fa0bb6e..713b2b5 100644 (file)
@@ -4,30 +4,31 @@
 
 BEGIN {
     if (ord("A") != 65) {
-      print "1..0 # Skip: Encode not working on EBCDIC\n";
-      exit 0;
+        print "1..0 # Skip: Encode not working on EBCDIC\n";
+        exit 0;
     }
     unless (eval { require Encode } ) {
-       print "1..0 # Skip: no Encode\n";
-       exit 0;
+        print "1..0 # Skip: no Encode\n";
+        exit 0;
     }
 }
 
-use Test;
 use strict;
+use warnings;
+use Test::More;
 
 BEGIN {
     if ("$]" >= 5.025) {
-       # Test the new almost-noop behaviour in new perls.
-       plan tests => 3;
-       my $w;
-       $SIG{__WARN__} = sub { $w .= shift };
-       require encoding::warnings;
-       ok $w, undef, 'no warning from requiring encoding::warnings';
-       ok(encoding::warnings->VERSION);
-       encoding::warnings->import;
-       ok $w, qr/^encoding::warnings is not supported /, 'import warning';
-       exit;
+        # Test the new almost-noop behaviour in new perls.
+        plan tests => 3;
+        my $w;
+        $SIG{__WARN__} = sub { $w .= shift };
+        require encoding::warnings;
+        is $w, undef, 'no warning from requiring encoding::warnings';
+        ok(encoding::warnings->VERSION);
+        encoding::warnings->import;
+        like $w, qr/^encoding::warnings is not supported /, 'import warning';
+        exit;
     }
     # else continue with your usual scheduled testing...
     plan tests => 2;
index d2928cd..856870b 100644 (file)
@@ -4,23 +4,23 @@
 
 BEGIN {
     if ("$]" >= 5.025) {
-      print "1..0 # Skip: encoding::warnings not supported on perl 5.26\n";
-      exit 0;
+        print "1..0 # Skip: encoding::warnings not supported on perl 5.26\n";
+        exit 0;
     }
     if (ord("A") != 65) {
-      print "1..0 # Skip: Encode not working on EBCDIC\n";
-      exit 0;
+        print "1..0 # Skip: Encode not working on EBCDIC\n";
+        exit 0;
     }
     unless (eval { require Encode } ) {
-       print "1..0 # Skip: no Encode\n";
-       exit 0;
+        print "1..0 # Skip: no Encode\n";
+        exit 0;
     }
 }
 
-use Test;
-BEGIN { plan tests => 2 }
+use Test::More tests => 2;
 
 use strict;
+use warnings;
 use encoding::warnings 'FATAL';
 ok(encoding::warnings->VERSION);
 
index a66798b..4aaea83 100644 (file)
@@ -1,14 +1,14 @@
 BEGIN {
     if ("$]" >= 5.025) {
-      print "1..0 # Skip: encoding::warnings not supported on perl 5.26\n";
-      exit 0;
+        print "1..0 # Skip: encoding::warnings not supported on perl 5.26\n";
+        exit 0;
     }
 }
 
-use Test;
-BEGIN { plan tests => 2 }
+use Test::More tests => 2;
 
 use strict;
+use warnings;
 use encoding::warnings 'FATAL';
 ok(encoding::warnings->VERSION);
 
index 0f6b4c1..89a1a86 100644 (file)
@@ -1,23 +1,24 @@
 use strict;
-use Test;
+use warnings;
 BEGIN {
     if ("$]" >= 5.025) {
-      print "1..0 # Skip: encoding::warnings not supported on perl 5.26\n";
-      exit 0;
+        print "1..0 # Skip: encoding::warnings not supported on perl 5.26\n";
+        exit 0;
     }
     if (ord("A") != 65) {
-      print "1..0 # Skip: Encode not working on EBCDIC\n";
-      exit 0;
+        print "1..0 # Skip: Encode not working on EBCDIC\n";
+        exit 0;
     }
     use Config;
     if ($Config::Config{'extensions'} !~ /\bEncode\b/) {
-      print "1..0 # Skip: Encode was not built\n";
-      exit 0;
+        print "1..0 # Skip: Encode was not built\n";
+        exit 0;
     }
 
-    plan tests => 3;
 }
 
+use Test::More tests => 3;
+
 {
     use encoding::warnings;
     ok(encoding::warnings->VERSION);
index 1fd2899..6e67acd 100644 (file)
@@ -8,7 +8,7 @@ use Config;
 
 use Scalar::Util qw(reftype refaddr blessed);
 
-our $VERSION = '1.64'; # Please update the pod, too.
+our $VERSION = '1.68'; # 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.64
+This document describes threads::shared version 1.68
 
 =head1 SYNOPSIS
 
index 6a7f03c..f78542d 100644 (file)
@@ -40,7 +40,7 @@
  * proxy PVLV element with attached element magic.
  *
  * Pointers to the shared SV are squirrelled away in the mg->mg_ptr field
- * of magic (with mg_len == 0), and in the IV2PTR(SvIV(sv)) field of tied
+ * of magic (with mg_len == 0), and in the INT2PTR(SvIV(sv)) field of tied
  * object SVs. These pointers have to be hidden like this because they
  * cross interpreter boundaries, and we don't want sv_clear() and friends
  * following them.
 #include "EXTERN.h"
 #include "perl.h"
 #include "XSUB.h"
-#ifdef HAS_PPPORT_H
-#  define NEED_sv_2pv_flags
-#  define NEED_vnewSVpvf
-#  define NEED_warner
-#  define NEED_newSVpvn_flags
-#  include "ppport.h"
-#  include "shared.h"
-#endif
+#define NEED_sv_2pv_flags
+#define NEED_vnewSVpvf
+#define NEED_warner
+#define NEED_newSVpvn_flags
+#include "ppport.h"
 
 #ifndef CLANG_DIAG_IGNORE
 # define CLANG_DIAG_IGNORE(x)
@@ -704,10 +701,10 @@ Perl_sharedsv_cond_timedwait(perl_cond *cond, perl_mutex *mut, double abs)
     abs -= (NV)ts.tv_sec;
     ts.tv_nsec = (long)(abs * 1000000000.0);
 
-    CLANG_DIAG_IGNORE_STMT(-Wthread-safety);
+    CLANG_DIAG_IGNORE(-Wthread-safety)
     /* warning: calling function 'pthread_cond_timedwait' requires holding mutex 'mut' exclusively [-Wthread-safety-analysis] */
     switch (pthread_cond_timedwait(cond, mut, &ts)) {
-       CLANG_DIAG_RESTORE_STMT;
+       CLANG_DIAG_RESTORE
 
         case 0:         got_it = 1; break;
         case ETIMEDOUT:             break;
@@ -1145,7 +1142,7 @@ sharedsv_array_mg_CLEAR(pTHX_ SV *sv, MAGIC *mg)
             I32 items = isav ? AvFILLp((AV *)ssv) + 1 : 0;
             HE *iter;
             if (!isav) hv_iterinit((HV *)ssv);
-            while (isav ? items-- : !!(iter = hv_iternext((HV *)ssv))) {
+            while (isav ? items-- : cBOOL(iter = hv_iternext((HV *)ssv))) {
                 SV *sv = isav ? *svp++ : HeVAL(iter);
                 if (!sv) continue;
                 if ( (SvOBJECT(sv) || (SvROK(sv) && (sv = SvRV(sv))))
index 42b0228..ccdeb0e 100755 (executable)
@@ -83,7 +83,7 @@ use threads::shared;
         print "# Looping for $busycount iterations should take about 0.025s\n";
     }
 
-    my $TIMEOUT = 600;
+    my $TIMEOUT = 60;
 
     my $mutex = 1;
     share($mutex);
index f84a294..ecf025d 100644 (file)
@@ -5,7 +5,7 @@ use 5.008;
 use strict;
 use warnings;
 
-our $VERSION = '2.27';      # remember to update version in POD!
+our $VERSION = '2.36';      # remember to update version in POD!
 my $XS_VERSION = $VERSION;
 $VERSION = eval $VERSION;
 
@@ -134,7 +134,7 @@ threads - Perl interpreter-based threads
 
 =head1 VERSION
 
-This document describes threads version 2.27
+This document describes threads version 2.36
 
 =head1 WARNING
 
@@ -1026,7 +1026,7 @@ signalling behavior is only in effect in the following situations:
 
 =over 4
 
-=item * Perl has been built with C<PERL_OLD_SIGNALS> (see C<perl -V>).
+=item * Perl has been built with C<PERL_OLD_SIGNALS> (see S<C<perl -V>>).
 
 =item * The environment variable C<PERL_SIGNALS> is set to C<unsafe>
 (see L<perlrun/"PERL_SIGNALS">).
index 4dc1a29..8a56bb6 100755 (executable)
@@ -11,6 +11,7 @@ BEGIN {
 }
 
 use ExtUtils::testlib;
+use Data::Dumper;
 
 use threads;
 
@@ -156,7 +157,8 @@ package main;
     rand(10);
     threads->create( sub { $rand{int(rand(10000000000))}++ } ) foreach 1..25;
     $_->join foreach threads->list;
-    ok((keys %rand >= 23), "Check that rand() is randomized in new threads");
+    ok((keys %rand >= 23), "Check that rand() is randomized in new threads")
+        or diag Dumper(\%rand);
 }
 
 # bugid #24165
index 9c8072d..25fec16 100644 (file)
 #    define setjmp(x) _setjmp(x)
 #  endif
 #  if defined(__MINGW64__)
+#    include <intrin.h>
 #    define setjmp(x) _setjmpex((x), mingw_getsp())
 #  endif
 #endif
-#ifdef HAS_PPPORT_H
-#  define NEED_PL_signals
-#  define NEED_sv_2pv_flags
-#  include "ppport.h"
-#  include "threads.h"
-#endif
+#define NEED_PL_signals
+#define NEED_sv_2pv_flags
+#include "ppport.h"
+#include "threads.h"
 #ifndef sv_dup_inc
 #  define sv_dup_inc(s,t) SvREFCNT_inc(sv_dup(s,t))
 #endif
+#ifndef SvREFCNT_dec_NN
+#  define SvREFCNT_dec_NN(x)  SvREFCNT_dec(x)
+#endif
 #ifndef PERL_UNUSED_RESULT
 #  if defined(__GNUC__) && defined(HASATTRIBUTE_WARN_UNUSED_RESULT)
 #    define PERL_UNUSED_RESULT(v) STMT_START { __typeof__(v) z = (v); (void)sizeof(z); } STMT_END
@@ -91,8 +93,8 @@ typedef perl_os_thread pthread_t;
 typedef struct _ithread {
     struct _ithread *next;      /* Next thread in the list */
     struct _ithread *prev;      /* Prev thread in the list */
-    PerlInterpreter *interp;    /* The threads interpreter */
-    UV tid;                     /* Threads module's thread id */
+    PerlInterpreter *interp;    /* The thread's interpreter */
+    UV tid;                     /* Thread's module's thread id */
     perl_mutex mutex;           /* Mutex for updating things in this struct */
     int count;                  /* Reference count. See S_ithread_create. */
     int state;                  /* Detached, joined, finished, etc. */
@@ -203,6 +205,9 @@ S_ithread_set(pTHX_ ithread *thread)
 {
     dMY_CXT;
     MY_CXT.context = thread;
+#ifdef PERL_SET_NON_tTHX_CONTEXT
+    PERL_SET_NON_tTHX_CONTEXT(thread->interp);
+#endif
 }
 
 STATIC ithread *
@@ -241,18 +246,31 @@ S_ithread_clear(pTHX_ ithread *thread)
     S_block_most_signals(&origmask);
 #endif
 
+#if PERL_VERSION_GE(5, 37, 5)
+    int save_veto = PL_veto_switch_non_tTHX_context;
+#endif
+
     interp = thread->interp;
     if (interp) {
         dTHXa(interp);
 
+        /* We will pretend to be a thread that we are not by switching tTHX,
+         * which doesn't work with things that don't rely on tTHX during
+         * tear-down, as they will tend to rely on a mapping from the tTHX
+         * structure, and that structure is being destroyed. */
+#if PERL_VERSION_GE(5, 37, 5)
+        PL_veto_switch_non_tTHX_context = true;
+#endif
+
         PERL_SET_CONTEXT(interp);
+
         S_ithread_set(aTHX_ thread);
 
         SvREFCNT_dec(thread->params);
         thread->params = NULL;
 
         if (thread->err) {
-            SvREFCNT_dec(thread->err);
+            SvREFCNT_dec_NN(thread->err);
             thread->err = Nullsv;
         }
 
@@ -262,6 +280,10 @@ S_ithread_clear(pTHX_ ithread *thread)
     }
 
     PERL_SET_CONTEXT(aTHX);
+#if PERL_VERSION_GE(5, 37, 5)
+    PL_veto_switch_non_tTHX_context = save_veto;
+#endif
+
 #ifdef THREAD_SIGNAL_BLOCKING
     S_set_sigmask(&origmask);
 #endif
@@ -807,6 +829,7 @@ S_ithread_create(
     thread->gimme = gimme;
     thread->state = exit_opt;
 
+
     /* "Clone" our interpreter into the thread's interpreter.
      * This gives thread access to "static data" and code.
      */
@@ -1034,10 +1057,10 @@ S_ithread_create(
     MUTEX_UNLOCK(&my_pool->create_destruct_mutex);
     return (thread);
 
-    CLANG_DIAG_IGNORE_STMT(-Wthread-safety);
+    CLANG_DIAG_IGNORE(-Wthread-safety)
     /* warning: mutex 'thread->mutex' is not held on every path through here [-Wthread-safety-analysis] */
 }
-CLANG_DIAG_RESTORE_DECL;
+CLANG_DIAG_RESTORE
 
 #endif /* USE_ITHREADS */
 
@@ -1171,6 +1194,7 @@ ithread_create(...)
         if (! thread) {
             XSRETURN_UNDEF;     /* Mutex already unlocked */
         }
+        PERL_SRAND_OVERRIDE_NEXT_PARENT();
         ST(0) = sv_2mortal(S_ithread_to_SV(aTHX_ Nullsv, thread, classname, FALSE));
 
         /* Let thread run. */
@@ -1179,7 +1203,6 @@ ithread_create(...)
         /* warning: releasing mutex 'thread->mutex' that was not held [-Wthread-safety-analysis] */
         MUTEX_UNLOCK(&thread->mutex);
         CLANG_DIAG_RESTORE_STMT;
-
         /* XSRETURN(1); - implied */
 
 
index f0d451a..48deb13 100644 (file)
@@ -1632,7 +1632,7 @@ S_dir_unchanged(pTHX_ const char *orig_pv, MAGIC *mg) {
     S_dir_unchanged(aTHX_ (orig_psv), (mg))
 
 STATIC bool
-S_argvout_final(pTHX_ MAGIC *mg, IO *io, bool not_implicit) {
+S_argvout_final(pTHX_ MAGIC *mg, IO *io, bool is_explict) {
     bool retval;
 
     /* ensure args are checked before we start using them */
@@ -1679,7 +1679,7 @@ S_argvout_final(pTHX_ MAGIC *mg, IO *io, bool not_implicit) {
 #endif
         }
 
-        retval = io_close(io, NULL, not_implicit, FALSE);
+        retval = io_close(io, NULL, is_explict, FALSE);
 
         if (SvIV(*pid_psv) != (IV)PerlProc_getpid()) {
             /* this is a child process, don't duplicate our rename() etc
@@ -1724,7 +1724,7 @@ S_argvout_final(pTHX_ MAGIC *mg, IO *io, bool not_implicit) {
                         PerlLIO_rename(orig_pv, SvPVX(*back_psv)) < 0
 #  endif
                         ) {
-                        if (!not_implicit) {
+                        if (!is_explict) {
 #  ifdef ARGV_USE_ATFUNCTIONS
                             if (unlinkat(dfd, SvPVX_const(*temp_psv), 0) < 0 &&
                                 UNLIKELY(NotSupported(errno)) &&
@@ -1742,7 +1742,7 @@ S_argvout_final(pTHX_ MAGIC *mg, IO *io, bool not_implicit) {
 #else
                     (void)UNLINK(SvPVX(*back_psv));
                     if (link(orig_pv, SvPVX(*back_psv))) {
-                        if (!not_implicit) {
+                        if (!is_explict) {
                             Perl_croak(aTHX_ "Can't rename %s to %s: %s, skipping file",
                                        SvPVX(*orig_psv), SvPVX(*back_psv), Strerror(errno));
                         }
@@ -1771,7 +1771,7 @@ S_argvout_final(pTHX_ MAGIC *mg, IO *io, bool not_implicit) {
                 PerlLIO_rename(SvPVX(*temp_psv), orig_pv) < 0
 #endif
                 ) {
-                if (!not_implicit) {
+                if (!is_explict) {
 #ifdef ARGV_USE_ATFUNCTIONS
                     if (unlinkat(dfd, SvPVX_const(*temp_psv), 0) < 0 &&
                         NotSupported(errno))
@@ -1800,7 +1800,7 @@ S_argvout_final(pTHX_ MAGIC *mg, IO *io, bool not_implicit) {
 #else
             UNLINK(SvPVX_const(*temp_psv));
 #endif
-            if (!not_implicit) {
+            if (!is_explict) {
                 Perl_croak(aTHX_ "Failed to close in-place work file %s: %s",
                            SvPVX(*temp_psv), Strerror(errno));
             }
@@ -1811,9 +1811,25 @@ S_argvout_final(pTHX_ MAGIC *mg, IO *io, bool not_implicit) {
     return retval;
 }
 
-/* explicit renamed to avoid C++ conflict    -- kja */
+/*
+=for apidoc do_close
+
+Close an I/O stream.  This implements Perl L<perlfunc/C<close>>.
+
+C<gv> is the glob associated with the stream.
+
+C<is_explict> is C<true> if this is an explicit close of the stream; C<false>
+if it is part of another operation, such as closing a pipe (which involves
+implicitly closing both ends).
+
+Returns C<true> if successful; otherwise returns C<false> and sets C<errno> to
+indicate the cause.
+
+=cut
+*/
+
 bool
-Perl_do_close(pTHX_ GV *gv, bool not_implicit)
+Perl_do_close(pTHX_ GV *gv, bool is_explict)
 {
     bool retval;
     IO *io;
@@ -1822,13 +1838,13 @@ Perl_do_close(pTHX_ GV *gv, bool not_implicit)
     if (!gv)
         gv = PL_argvgv;
     if (!gv || !isGV_with_GP(gv)) {
-        if (not_implicit)
+        if (is_explict)
             SETERRNO(EBADF,SS_IVCHAN);
         return FALSE;
     }
     io = GvIO(gv);
     if (!io) {         /* never opened */
-        if (not_implicit) {
+        if (is_explict) {
             report_evil_fh(gv);
             SETERRNO(EBADF,SS_IVCHAN);
         }
@@ -1836,13 +1852,13 @@ Perl_do_close(pTHX_ GV *gv, bool not_implicit)
     }
     if ((mg = mg_findext((SV*)io, PERL_MAGIC_uvar, &argvout_vtbl))
         && mg->mg_obj) {
-        retval = argvout_final(mg, io, not_implicit);
+        retval = argvout_final(mg, io, is_explict);
         mg_freeext((SV*)io, PERL_MAGIC_uvar, &argvout_vtbl);
     }
     else {
-        retval = io_close(io, NULL, not_implicit, FALSE);
+        retval = io_close(io, NULL, is_explict, FALSE);
     }
-    if (not_implicit) {
+    if (is_explict) {
         IoLINES(io) = 0;
         IoPAGE(io) = 0;
         IoLINES_LEFT(io) = IoPAGE_LEN(io);
@@ -1852,7 +1868,7 @@ Perl_do_close(pTHX_ GV *gv, bool not_implicit)
 }
 
 bool
-Perl_io_close(pTHX_ IO *io, GV *gv, bool not_implicit, bool warn_on_fail)
+Perl_io_close(pTHX_ IO *io, GV *gv, bool is_explict, bool warn_on_fail)
 {
     bool retval = FALSE;
 
@@ -1871,7 +1887,7 @@ Perl_io_close(pTHX_ IO *io, GV *gv, bool not_implicit, bool warn_on_fail)
             */
             IoOFP(io) = IoIFP(io) = NULL;
             status = PerlProc_pclose(fh);
-            if (not_implicit) {
+            if (is_explict) {
                 STATUS_NATIVE_CHILD_SET(status);
                 retval = (STATUS_UNIX == 0);
             }
@@ -1916,7 +1932,7 @@ Perl_io_close(pTHX_ IO *io, GV *gv, bool not_implicit, bool warn_on_fail)
                                  SVfARG(get_sv("!",GV_ADD)));
         }
     }
-    else if (not_implicit) {
+    else if (is_explict) {
         SETERRNO(EBADF,SS_IVCHAN);
     }
 
@@ -2778,7 +2794,7 @@ nothing in the core.
                         {
                                 /* Under AmigaOS4 unlink only 'fails' if the filename is invalid */
                                 /* It may not remove the file if it's Locked, so check if it's still */
-                                /* arround */
+                                /* around */
                                 if((access(s,F_OK) != -1))
                                 {
                                         tot--;
index 37d7ea4..3928427 100644 (file)
@@ -1183,8 +1183,7 @@ Perl_do_vop(pTHX_ I32 optype, SV *sv, SV *left, SV *right)
  * values, or key-value pairs, depending on PL_op.
  */
 
-OP *
-Perl_do_kv(pTHX)
+PP(do_kv)
 {
     dSP;
     HV * const keys = MUTABLE_HV(POPs);
index 9122851..8a1ce98 100644 (file)
 #  define BIT_BUCKET "\\dev\\nul" /* "wanna be like, umm, Newlined, or somethin?" */
 #endif
 
+/* Generally add things last-in first-terminated.  IO and memory terminations
+ * need to be generally last
+ *
+ * BEWARE that using PerlIO in these will be using freed memory, so may appear
+ * to work, but must NOT be retained in production code. */
 #ifndef PERL_SYS_TERM_BODY
 #  define PERL_SYS_TERM_BODY()                         \
+    ENV_TERM; USER_PROP_MUTEX_TERM; LOCALE_TERM;       \
     HINTS_REFCNT_TERM; KEYWORD_PLUGIN_MUTEX_TERM;      \
-    OP_CHECK_MUTEX_TERM; OP_REFCNT_TERM; PERLIO_TERM;  \
-    MALLOC_TERM; LOCALE_TERM; USER_PROP_MUTEX_TERM;    \
-    ENV_TERM;
+    OP_CHECK_MUTEX_TERM; OP_REFCNT_TERM;               \
+    PERLIO_TERM; MALLOC_TERM; 
 #endif
 #define dXSUB_SYS dNOOP
 
 /* Don't go reading from /dev/urandom */
 #define PERL_NO_DEV_RANDOM
 
+#ifdef WIN32
+#  define NO_ENVIRON_ARRAY
+#endif
+
 /*
  * ex: set ts=8 sts=4 sw=4 et:
  */
index e0c5622..e2c03f6 100644 (file)
@@ -46,7 +46,7 @@ Perl_grok_bslash_c(pTHX_ const char   source,
         const char control = toCTRL('{');
         if (isPRINT_A(control)) {
             /* diag_listed_as: Use "%s" instead of "%s" */
-            *message = Perl_form(aTHX_ "Use \"%c\" instead of \"\\c{\"", control);
+            *message = Perl_form(aTHX_ PERL_DIAG_DIE_SYNTAX("Use \"%c\" instead of \"\\c{\""), control);
         }
         else {
             *message = "Sequence \"\\c{\" invalid";
@@ -58,7 +58,7 @@ Perl_grok_bslash_c(pTHX_ const char   source,
     if (isPRINT_A(*result) && ckWARN(WARN_SYNTAX)) {
         U8 clearer[3];
         U8 i = 0;
-        char format[] = "\"\\c%c\" is more clearly written simply as \"%s\"";
+        char format[] = PERL_DIAG_WARN_SYNTAX("\"\\c%c\" is more clearly written simply as \"%s\"");
 
         if (! isWORDCHAR(*result)) {
             clearer[i++] = '\\';
index 6887ec3..a082848 100644 (file)
@@ -45,7 +45,8 @@ static const char* const svtypenames[SVt_LAST] = {
     "PVHV",
     "PVCV",
     "PVFM",
-    "PVIO"
+    "PVIO",
+    "PVOBJ",
 };
 
 
@@ -65,7 +66,8 @@ static const char* const svshorttypenames[SVt_LAST] = {
     "HV",
     "CV",
     "FM",
-    "IO"
+    "IO",
+    "OBJ",
 };
 
 struct flag_to_name {
@@ -110,28 +112,31 @@ will also be escaped.
 Normally the SV will be cleared before the escaped string is prepared,
 but when C<PERL_PV_ESCAPE_NOCLEAR> is set this will not occur.
 
-If C<PERL_PV_ESCAPE_UNI> is set then the input string is treated as UTF-8
-if C<PERL_PV_ESCAPE_UNI_DETECT> is set then the input string is scanned
+If C<PERL_PV_ESCAPE_UNI> is set then the input string is treated as UTF-8.
+If C<PERL_PV_ESCAPE_UNI_DETECT> is set then the input string is scanned
 using C<is_utf8_string()> to determine if it is UTF-8.
 
 If C<PERL_PV_ESCAPE_ALL> is set then all input chars will be output
-using C<\x01F1> style escapes, otherwise if C<PERL_PV_ESCAPE_NONASCII> is set, only
-non-ASCII chars will be escaped using this style; otherwise, only chars above
-255 will be so escaped; other non printable chars will use octal or
-common escaped patterns like C<\n>.
-Otherwise, if C<PERL_PV_ESCAPE_NOBACKSLASH>
-then all chars below 255 will be treated as printable and
-will be output as literals.
+using C<\x01F1> style escapes, otherwise if C<PERL_PV_ESCAPE_NONASCII>
+is set, only non-ASCII chars will be escaped using this style;
+otherwise, only chars above 255 will be so escaped; other non printable
+chars will use octal or common escaped patterns like C<\n>. Otherwise,
+if C<PERL_PV_ESCAPE_NOBACKSLASH> then all chars below 255 will be
+treated as printable and will be output as literals. The
+C<PERL_PV_ESCAPE_NON_WC> modifies the previous rules to cause word
+chars, unicode or otherwise, to be output as literals, note this uses
+the *unicode* rules for deciding on word characters.
 
 If C<PERL_PV_ESCAPE_FIRSTCHAR> is set then only the first char of the
-string will be escaped, regardless of max.  If the output is to be in hex,
-then it will be returned as a plain hex
-sequence.  Thus the output will either be a single char,
-an octal escape sequence, a special escape like C<\n> or a hex value.
+string will be escaped, regardless of max. If the output is to be in
+hex, then it will be returned as a plain hex sequence. Thus the output
+will either be a single char, an octal escape sequence, a special escape
+like C<\n> or a hex value.
 
-If C<PERL_PV_ESCAPE_RE> is set then the escape char used will be a C<"%"> and
-not a C<"\\">.  This is because regexes very often contain backslashed
-sequences, whereas C<"%"> is not a particularly common character in patterns.
+If C<PERL_PV_ESCAPE_RE> is set then the escape char used will be a
+C<"%"> and not a C<"\\">. This is because regexes very often contain
+backslashed sequences, whereas C<"%"> is not a particularly common
+character in patterns.
 
 Returns a pointer to the escaped text as held by C<dsv>.
 
@@ -144,6 +149,7 @@ Returns a pointer to the escaped text as held by C<dsv>.
 =for apidoc Amnh||PERL_PV_ESCAPE_RE
 =for apidoc Amnh||PERL_PV_ESCAPE_UNI
 =for apidoc Amnh||PERL_PV_ESCAPE_UNI_DETECT
+=for apidoc Amnh||PERL_PV_ESCAPE_NON_WC
 
 =cut
 
@@ -161,7 +167,7 @@ Unused or not for public use
 
 char *
 Perl_pv_escape( pTHX_ SV *dsv, char const * const str, 
-                const STRLEN count, const STRLEN max, 
+                const STRLEN count, STRLEN max,
                 STRLEN * const escaped, U32 flags )
 {
 
@@ -173,13 +179,45 @@ Perl_pv_escape( pTHX_ SV *dsv, char const * const str,
 
     const char esc = (flags & PERL_PV_ESCAPE_RE) ? '%' : '\\';
     const char dq = (flags & PERL_PV_ESCAPE_QUOTE) ? '"' : esc;
+    const char *qs;
+    const char *qe;
+
     char octbuf[PV_ESCAPE_OCTBUFSIZE] = "%123456789ABCDF";
     STRLEN wrote = 0;    /* chars written so far */
     STRLEN chsize = 0;   /* size of data to be written */
     STRLEN readsize = 1; /* size of data just read */
-    bool isuni= flags & PERL_PV_ESCAPE_UNI ? 1 : 0; /* is this UTF-8 */
+    bool isuni= (flags & PERL_PV_ESCAPE_UNI)
+                ? TRUE : FALSE; /* is this UTF-8 */
     const char *pv  = str;
     const char * const end = pv + count; /* end of string */
+    const char *restart = NULL;
+    STRLEN extra_len = 0;
+    STRLEN tail = 0;
+    if ((flags & PERL_PV_ESCAPE_TRUNC_MIDDLE) && max > 3) {
+        if (flags & PERL_PV_ESCAPE_QUOTE) {
+            qs = qe = "\"";
+            extra_len = 5;
+        } else if (flags & PERL_PV_PRETTY_LTGT) {
+            qs = "<";
+            qe = ">";
+            extra_len = 5;
+        } else {
+            qs = qe = "";
+            extra_len = 3;
+        }
+        tail = max / 2;
+        restart = isuni ? (char *)utf8_hop_back((U8*)end,-tail,(U8*)pv) : end - tail;
+        if (restart > pv) {
+            max -= tail;
+        } else {
+            tail = 0;
+            restart = NULL;
+        }
+    }
+    else {
+        qs = qe = "";
+    }
+
     octbuf[0] = esc;
 
     PERL_ARGS_ASSERT_PV_ESCAPE;
@@ -192,9 +230,10 @@ Perl_pv_escape( pTHX_ SV *dsv, char const * const str,
     if ((flags & PERL_PV_ESCAPE_UNI_DETECT) && is_utf8_string((U8*)pv, count))
         isuni = 1;
     
-    for ( ; (pv < end && (!max || (wrote < max))) ; pv += readsize ) {
+    for ( ; pv < end ; pv += readsize ) {
         const UV u= (isuni) ? utf8_to_uvchr_buf((U8*)pv, (U8*) end, &readsize) : (U8)*pv;
         const U8 c = (U8)u;
+        const char *source_buf = octbuf;
         
         if ( ( u > 255 )
           || (flags & PERL_PV_ESCAPE_ALL)
@@ -203,6 +242,11 @@ Perl_pv_escape( pTHX_ SV *dsv, char const * const str,
             if (flags & PERL_PV_ESCAPE_FIRSTCHAR) 
                 chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE, 
                                       "%" UVxf, u);
+            else
+            if ((flags & PERL_PV_ESCAPE_NON_WC) && isWORDCHAR_uvchr(u)) {
+                chsize = readsize;
+                source_buf = pv;
+            }
             else
                 chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE, 
                                       ((flags & PERL_PV_ESCAPE_DWIM) && !isuni)
@@ -251,11 +295,22 @@ Perl_pv_escape( pTHX_ SV *dsv, char const * const str,
                 chsize = 1;
             }
         }
-        if ( max && (wrote + chsize > max) ) {
-            break;
+        if (max && (wrote + chsize > max)) {
+            if (restart) {
+                /* this only happens with PERL_PV_ESCAPE_TRUNC_MIDDLE */
+                if (dsv)
+                    Perl_sv_catpvf( aTHX_ dsv,"%s...%s", qe, qs);
+                wrote += extra_len;
+                pv = restart;
+                max = tail;
+                wrote = tail = 0;
+                restart = NULL;
+            } else {
+                break;
+            }
         } else if (chsize > 1) {
             if (dsv)
-                sv_catpvn(dsv, octbuf, chsize);
+                sv_catpvn(dsv, source_buf, chsize);
             wrote += chsize;
         } else {
             /* If PERL_PV_ESCAPE_NOBACKSLASH is set then non-ASCII bytes
@@ -481,10 +536,12 @@ Perl_sv_peek(pTHX_ SV *sv)
                 break;
             }
         }
-        if (is_tmp || SvREFCNT(sv) > 1) {
+        if (is_tmp || SvREFCNT(sv) > 1 || SvPADTMP(sv)) {
             Perl_sv_catpvf(aTHX_ t, "<");
             if (SvREFCNT(sv) > 1)
                 Perl_sv_catpvf(aTHX_ t, "%" UVuf, (UV)SvREFCNT(sv));
+            if (SvPADTMP(sv))
+                Perl_sv_catpvf(aTHX_ t, "%s",  "P");
             if (is_tmp)
                 Perl_sv_catpvf(aTHX_ t, "%s", SvTEMP(t) ? "T" : "t");
             Perl_sv_catpvf(aTHX_ t, ">");
@@ -751,8 +808,7 @@ Perl_dump_sub_perl(pTHX_ const GV *gv, bool justperl)
 
     PERL_ARGS_ASSERT_DUMP_SUB_PERL;
 
-    cv = isGV_with_GP(gv) ? GvCV(gv) :
-            (assert(SvROK((SV*)gv)), (CV*)SvRV((SV*)gv));
+    cv = isGV_with_GP(gv) ? GvCV(gv) : CV_FROM_REF((SV*)gv);
     if (justperl && (CvISXSUB(cv) || !CvROOT(cv)))
         return;
 
@@ -824,10 +880,8 @@ S_gv_display(pTHX_ GV *gv)
         if (isGV_with_GP(gv))
             gv_fullname3(raw, gv, NULL);
         else {
-            assert(SvROK(gv));
-            assert(SvTYPE(SvRV(gv)) == SVt_PVCV);
             Perl_sv_catpvf(aTHX_ raw, "cv ref: %s",
-                    SvPV_nolen_const(cv_name((CV *)SvRV(gv), name, 0)));
+                    SvPV_nolen_const(cv_name(CV_FROM_REF((SV*)gv), name, 0)));
         }
         rawpv = SvPV_const(raw, len);
         generic_pv_escape(name, rawpv, len, SvUTF8(raw));
@@ -1255,7 +1309,7 @@ S_do_op_dump_bar(pTHX_ I32 level, UV bar, PerlIO *file, const OP *o)
         /* with ITHREADS, consts are stored in the pad, and the right pad
          * may not be active here, so skip */
         S_opdump_indent(aTHX_ o, level, bar, file, "SV = %s\n",
-                        SvPEEK(cMETHOPx_meth(o)));
+                        SvPEEK(cMETHOPo_meth));
 #endif
         break;
     case OP_NULL:
@@ -1265,8 +1319,8 @@ S_do_op_dump_bar(pTHX_ I32 level, UV bar, PerlIO *file, const OP *o)
     case OP_NEXTSTATE:
     case OP_DBSTATE:
         if (CopLINE(cCOPo))
-            S_opdump_indent(aTHX_ o, level, bar, file, "LINE = %" UVuf "\n",
-                             (UV)CopLINE(cCOPo));
+            S_opdump_indent(aTHX_ o, level, bar, file, "LINE = %" LINE_Tf "\n",
+                            CopLINE(cCOPo));
 
         if (CopSTASHPV(cCOPo)) {
             SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
@@ -1288,6 +1342,11 @@ S_do_op_dump_bar(pTHX_ I32 level, UV bar, PerlIO *file, const OP *o)
                                 generic_pv_escape( tmpsv, label, label_len,
                                            (label_flags & SVf_UTF8)));
         }
+        /* add hints and features if set */
+        if (cCOPo->cop_hints)
+            S_opdump_indent(aTHX_ o, level, bar, file, "HINTS = %08x\n",cCOPo->cop_hints);
+        if (cCOPo->cop_features)
+            S_opdump_indent(aTHX_ o, level, bar, file, "FEATS = %08x\n",cCOPo->cop_features);
 
         S_opdump_indent(aTHX_ o, level, bar, file, "SEQ = %u\n",
                          (unsigned int)cCOPo->cop_seq);
@@ -1647,7 +1706,7 @@ Perl_do_gv_dump(pTHX_ I32 level, PerlIO *file, const char *name, GV *sv)
     PERL_ARGS_ASSERT_DO_GV_DUMP;
 
     Perl_dump_indent(aTHX_ level, file, "%s = 0x%" UVxf, name, PTR2UV(sv));
-    if (sv && GvNAME(sv)) {
+    if (sv) {
         SV * const tmpsv = newSVpvs("");
         PerlIO_printf(file, "\t\"%s\"\n",
                               generic_pv_escape( tmpsv, GvNAME(sv), GvNAMELEN(sv), GvNAMEUTF8(sv) ));
@@ -1662,7 +1721,7 @@ Perl_do_gvgv_dump(pTHX_ I32 level, PerlIO *file, const char *name, GV *sv)
     PERL_ARGS_ASSERT_DO_GVGV_DUMP;
 
     Perl_dump_indent(aTHX_ level, file, "%s = 0x%" UVxf, name, PTR2UV(sv));
-    if (sv && GvNAME(sv)) {
+    if (sv) {
        SV *tmp = newSVpvs_flags("", SVs_TEMP);
         const char *hvname;
         HV * const stash = GvSTASH(sv);
@@ -1710,7 +1769,7 @@ const struct flag_to_name cv_flags_names[] = {
     {CVf_CONST, "CONST,"},
     {CVf_NODEBUG, "NODEBUG,"},
     {CVf_LVALUE, "LVALUE,"},
-    {CVf_METHOD, "METHOD,"},
+    {CVf_NOWARN_AMBIGUOUS, "NOWARN_AMBIGUOUS,"},
     {CVf_WEAKOUTSIDE, "WEAKOUTSIDE,"},
     {CVf_CVGV_RC, "CVGV_RC,"},
     {CVf_DYNFILE, "DYNFILE,"},
@@ -1719,7 +1778,12 @@ const struct flag_to_name cv_flags_names[] = {
     {CVf_SLABBED, "SLABBED,"},
     {CVf_NAMED, "NAMED,"},
     {CVf_LEXICAL, "LEXICAL,"},
-    {CVf_ISXSUB, "ISXSUB,"}
+    {CVf_ISXSUB, "ISXSUB,"},
+    {CVf_ANONCONST,        "ANONCONST,"},
+    {CVf_SIGNATURE,        "SIGNATURE,"},
+    {CVf_REFCOUNTED_ANYSV, "REFCOUNTED_ANYSV,"},
+    {CVf_IsMETHOD,         "IsMETHOD,"}
+
 };
 
 const struct flag_to_name hv_flags_names[] = {
@@ -1949,8 +2013,7 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bo
 
     /* Dump general SV fields */
 
-    if ((type >= SVt_PVIV && type != SVt_PVAV && type != SVt_PVHV
-         && type != SVt_PVCV && type != SVt_PVFM && type != SVt_PVIO
+    if ((type >= SVt_PVIV && type <= SVt_PVLV
          && type != SVt_REGEXP && !isGV_with_GP(sv) && !SvVALID(sv))
         || (type == SVt_IV && !SvROK(sv))) {
         if (SvIsUV(sv)
@@ -1961,9 +2024,8 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bo
         (void)PerlIO_putc(file, '\n');
     }
 
-    if ((type >= SVt_PVNV && type != SVt_PVAV && type != SVt_PVHV
-                && type != SVt_PVCV && type != SVt_PVFM  && type != SVt_REGEXP
-                && type != SVt_PVIO && !isGV_with_GP(sv) && !SvVALID(sv))
+    if ((type >= SVt_PVNV && type <= SVt_PVLV
+         && type != SVt_REGEXP && !isGV_with_GP(sv) && !SvVALID(sv))
                || type == SVt_NV) {
         DECLARATION_FOR_LC_NUMERIC_MANIPULATION;
         STORE_LC_NUMERIC_SET_STANDARD();
@@ -2091,7 +2153,7 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bo
         break;
     case SVt_PVHV: {
         U32 totalkeys;
-        if (SvOOK(sv)) {
+        if (HvHasAUX(sv)) {
             struct xpvhv_aux *const aux = HvAUX(sv);
             Perl_dump_indent(aTHX_ level, file, "  AUX_FLAGS = %" UVuf "\n",
                              (UV)aux->xhv_aux_flags);
@@ -2175,7 +2237,7 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bo
         }
         Perl_dump_indent(aTHX_ level, file, "  MAX = %" IVdf "\n",
                                (IV)HvMAX(sv));
-        if (SvOOK(sv)) {
+        if (HvHasAUX(sv)) {
             Perl_dump_indent(aTHX_ level, file, "  RITER = %" IVdf "\n",
                                    (IV)HvRITER_get(sv));
             Perl_dump_indent(aTHX_ level, file, "  EITER = 0x%" UVxf "\n",
@@ -2205,7 +2267,7 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bo
                                            HvNAMELEN(sv), HvNAMEUTF8(sv)));
         }
         }
-        if (SvOOK(sv)) {
+        if (HvHasAUX(sv)) {
             AV * const backrefs
                 = *Perl_hv_backreferences_p(aTHX_ MUTABLE_HV(sv));
             struct mro_meta * const meta = HvAUX(sv)->xhv_mro_meta;
@@ -2470,7 +2532,7 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bo
                                             " (%s)\n",
                                (UV)GvGPFLAGS(sv),
                                "");
-        Perl_dump_indent(aTHX_ level, file, "    LINE = %" IVdf "\n", (IV)GvLINE(sv));
+        Perl_dump_indent(aTHX_ level, file, "    LINE = %" LINE_Tf "\n", (line_t)GvLINE(sv));
         Perl_dump_indent(aTHX_ level, file, "    FILE = \"%s\"\n", GvFILE(sv));
         do_gv_dump (level, file, "    EGV", GvEGV(sv));
         break;
@@ -2548,55 +2610,128 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bo
                 Perl_dump_indent(aTHX_ level, file, "  INTFLAGS = 0x%" UVxf " (%s)\n",
                                 (UV)(r->intflags), SvPVX_const(d));
             } else {
-                Perl_dump_indent(aTHX_ level, file, "  INTFLAGS = 0x%" UVxf "\n",
+                Perl_dump_indent(aTHX_ level, file, "  INTFLAGS = 0x%" UVxf "(Plug in)\n",
                                 (UV)(r->intflags));
             }
 #undef SV_SET_STRINGIFY_REGEXP_FLAGS
             Perl_dump_indent(aTHX_ level, file, "  NPARENS = %" UVuf "\n",
                                 (UV)(r->nparens));
+            Perl_dump_indent(aTHX_ level, file, "  LOGICAL_NPARENS = %" UVuf "\n",
+                                (UV)(r->logical_nparens));
+
+#define SV_SET_STRINGIFY_I32_PAREN_ARRAY(d,count,ary)     \
+    STMT_START {                                    \
+        U32 n;                                      \
+        sv_setpv(d,"{ ");                           \
+        /* 0 element is irrelevant */               \
+        for(n=0; n <= count; n++)                   \
+            sv_catpvf(d,"%" IVdf "%s",              \
+                (IV)ary[n],                         \
+                n == count ? "" : ", ");            \
+        sv_catpvs(d," }\n");                        \
+    } STMT_END
+
+            Perl_dump_indent(aTHX_ level, file, "  LOGICAL_TO_PARNO = 0x%" UVxf "\n",
+                                PTR2UV(r->logical_to_parno));
+            if (r->logical_to_parno) {
+                SV_SET_STRINGIFY_I32_PAREN_ARRAY(d, r->logical_nparens, r->logical_to_parno);
+                Perl_dump_indent(aTHX_ level, file, "    %" SVf, d);
+            }
+            Perl_dump_indent(aTHX_ level, file, "  PARNO_TO_LOGICAL = 0x%" UVxf "\n",
+                                PTR2UV(r->parno_to_logical));
+            if (r->parno_to_logical) {
+                SV_SET_STRINGIFY_I32_PAREN_ARRAY(d, r->nparens, r->parno_to_logical);
+                Perl_dump_indent(aTHX_ level, file, "    %" SVf, d);
+            }
+
+            Perl_dump_indent(aTHX_ level, file, "  PARNO_TO_LOGICAL_NEXT = 0x%" UVxf "\n",
+                                PTR2UV(r->parno_to_logical_next));
+            if (r->parno_to_logical_next) {
+                SV_SET_STRINGIFY_I32_PAREN_ARRAY(d, r->nparens, r->parno_to_logical_next);
+                Perl_dump_indent(aTHX_ level, file, "    %" SVf, d);
+            }
+#undef SV_SET_STRINGIFY_I32_ARRAY
+
             Perl_dump_indent(aTHX_ level, file, "  LASTPAREN = %" UVuf "\n",
-                                (UV)(r->lastparen));
+                                (UV)(RXp_LASTPAREN(r)));
             Perl_dump_indent(aTHX_ level, file, "  LASTCLOSEPAREN = %" UVuf "\n",
-                                (UV)(r->lastcloseparen));
+                                (UV)(RXp_LASTCLOSEPAREN(r)));
             Perl_dump_indent(aTHX_ level, file, "  MINLEN = %" IVdf "\n",
-                                (IV)(r->minlen));
+                                (IV)(RXp_MINLEN(r)));
             Perl_dump_indent(aTHX_ level, file, "  MINLENRET = %" IVdf "\n",
-                                (IV)(r->minlenret));
+                                (IV)(RXp_MINLENRET(r)));
             Perl_dump_indent(aTHX_ level, file, "  GOFS = %" UVuf "\n",
-                                (UV)(r->gofs));
+                                (UV)(RXp_GOFS(r)));
             Perl_dump_indent(aTHX_ level, file, "  PRE_PREFIX = %" UVuf "\n",
-                                (UV)(r->pre_prefix));
+                                (UV)(RXp_PRE_PREFIX(r)));
             Perl_dump_indent(aTHX_ level, file, "  SUBLEN = %" IVdf "\n",
-                                (IV)(r->sublen));
+                                (IV)(RXp_SUBLEN(r)));
             Perl_dump_indent(aTHX_ level, file, "  SUBOFFSET = %" IVdf "\n",
-                                (IV)(r->suboffset));
+                                (IV)(RXp_SUBOFFSET(r)));
             Perl_dump_indent(aTHX_ level, file, "  SUBCOFFSET = %" IVdf "\n",
-                                (IV)(r->subcoffset));
-            if (r->subbeg)
+                                (IV)(RXp_SUBCOFFSET(r)));
+            if (RXp_SUBBEG(r))
                 Perl_dump_indent(aTHX_ level, file, "  SUBBEG = 0x%" UVxf " %s\n",
-                            PTR2UV(r->subbeg),
-                            pv_display(d, r->subbeg, r->sublen, 50, pvlim));
+                            PTR2UV(RXp_SUBBEG(r)),
+                            pv_display(d, RXp_SUBBEG(r), RXp_SUBLEN(r), 50, pvlim));
             else
                 Perl_dump_indent(aTHX_ level, file, "  SUBBEG = 0x0\n");
-            Perl_dump_indent(aTHX_ level, file, "  MOTHER_RE = 0x%" UVxf "\n",
-                                PTR2UV(r->mother_re));
-            if (nest < maxnest && r->mother_re)
-                do_sv_dump(level+1, file, (SV *)r->mother_re, nest+1,
-                           maxnest, dumpops, pvlim);
             Perl_dump_indent(aTHX_ level, file, "  PAREN_NAMES = 0x%" UVxf "\n",
-                                PTR2UV(r->paren_names));
+                                PTR2UV(RXp_PAREN_NAMES(r)));
             Perl_dump_indent(aTHX_ level, file, "  SUBSTRS = 0x%" UVxf "\n",
-                                PTR2UV(r->substrs));
+                                PTR2UV(RXp_SUBSTRS(r)));
             Perl_dump_indent(aTHX_ level, file, "  PPRIVATE = 0x%" UVxf "\n",
-                                PTR2UV(r->pprivate));
+                                PTR2UV(RXp_PPRIVATE(r)));
             Perl_dump_indent(aTHX_ level, file, "  OFFS = 0x%" UVxf "\n",
-                                PTR2UV(r->offs));
+                                PTR2UV(RXp_OFFSp(r)));
+            if (RXp_OFFSp(r)) {
+                U32 n;
+                sv_setpvs(d,"[ ");
+                /* note offs[0] is for the whole match, and
+                 * the data for $1 is in offs[1]. Thus we have to
+                 * show one more than we have nparens. */
+                for(n = 0; n <= r->nparens; n++) {
+                    sv_catpvf(d,"%" IVdf ":%" IVdf "%s",
+                        (IV)RXp_OFFSp(r)[n].start, (IV)RXp_OFFSp(r)[n].end,
+                        n+1 > r->nparens ? " ]\n" : ", ");
+                }
+                Perl_dump_indent(aTHX_ level, file, "    %" SVf, d);
+            }
             Perl_dump_indent(aTHX_ level, file, "  QR_ANONCV = 0x%" UVxf "\n",
-                                PTR2UV(r->qr_anoncv));
+                                PTR2UV(RXp_QR_ANONCV(r)));
 #ifdef PERL_ANY_COW
             Perl_dump_indent(aTHX_ level, file, "  SAVED_COPY = 0x%" UVxf "\n",
-                                PTR2UV(r->saved_copy));
+                                PTR2UV(RXp_SAVED_COPY(r)));
 #endif
+            /* this should go LAST or the output gets really confusing */
+            Perl_dump_indent(aTHX_ level, file, "  MOTHER_RE = 0x%" UVxf "\n",
+                                PTR2UV(RXp_MOTHER_RE(r)));
+            if (nest < maxnest && RXp_MOTHER_RE(r))
+                do_sv_dump(level+1, file, (SV *)RXp_MOTHER_RE(r), nest+1,
+                           maxnest, dumpops, pvlim);
+        }
+        break;
+    case SVt_PVOBJ:
+        Perl_dump_indent(aTHX_ level, file, "  MAXFIELD = %" IVdf "\n",
+                (IV)ObjectMAXFIELD(sv));
+        Perl_dump_indent(aTHX_ level, file, "  FIELDS = 0x%" UVxf "\n",
+                PTR2UV(ObjectFIELDS(sv)));
+        if (nest < maxnest && ObjectFIELDS(sv)) {
+            SSize_t count;
+            SV **svp = ObjectFIELDS(sv);
+            PADNAME **pname = PadnamelistARRAY(HvAUX(SvSTASH(sv))->xhv_class_fields);
+            for (count = 0;
+                 count <= ObjectMAXFIELD(sv) && count < maxnest;
+                 count++, svp++)
+            {
+                SV *const field = *svp;
+                PADNAME *pn = pname[count];
+
+                Perl_dump_indent(aTHX_ level + 1, file, "Field No. %" IVdf " (%s)\n",
+                        (IV)count, PadnamePV(pn));
+
+                do_sv_dump(level+1, file, field, nest+1, maxnest, dumpops, pvlim);
+            }
         }
         break;
     }
@@ -2608,7 +2743,38 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bo
 
 Dumps the contents of an SV to the C<STDERR> filehandle.
 
-For an example of its output, see L<Devel::Peek>.
+For an example of its output, see L<Devel::Peek>. If
+the item is an SvROK it will dump items to a depth of 4,
+otherwise it will dump only the top level item, which
+means that it will not dump the contents of an AV * or
+HV *. For that use C<av_dump()> or C<hv_dump()>.
+
+=for apidoc sv_dump_depth
+
+Dumps the contents of an SV to the C<STDERR> filehandle
+to the depth requested. This function can be used on any
+SV derived type (GV, HV, AV) with an appropriate cast.
+This is a more flexible variant of sv_dump(). For example
+
+    HV *hv = ...;
+    sv_dump_depth((SV*)hv, 2);
+
+would dump the hv, its keys and values, but would not recurse
+into any RV values.
+
+=for apidoc av_dump
+
+Dumps the contents of an AV to the C<STDERR> filehandle,
+Similar to using Devel::Peek on an arrayref but does not
+expect an RV wrapper. Dumps contents to a depth of 3 levels
+deep.
+
+=for apidoc hv_dump
+
+Dumps the contents of an HV to the C<STDERR> filehandle.
+Similar to using Devel::Peek on an hashref but does not
+expect an RV wrapper. Dumps contents to a depth of 3 levels
+deep.
 
 =cut
 */
@@ -2617,9 +2783,27 @@ void
 Perl_sv_dump(pTHX_ SV *sv)
 {
     if (sv && SvROK(sv))
-        do_sv_dump(0, Perl_debug_log, sv, 0, 4, 0, 0);
+        sv_dump_depth(sv, 4);
     else
-        do_sv_dump(0, Perl_debug_log, sv, 0, 0, 0, 0);
+        sv_dump_depth(sv, 0);
+}
+
+void
+Perl_sv_dump_depth(pTHX_ SV *sv, I32 depth)
+{
+    do_sv_dump(0, Perl_debug_log, sv, 0, depth, 0, 0);
+}
+
+void
+Perl_av_dump(pTHX_ AV *av)
+{
+    sv_dump_depth((SV*)av, 3);
+}
+
+void
+Perl_hv_dump(pTHX_ HV *hv)
+{
+    sv_dump_depth((SV*)hv, 3);
 }
 
 int
index 9182d50..fe00759 100644 (file)
@@ -1,4 +1,4 @@
-/* -*- buffer-read-only: t -*-
+/* -*- mode: C; buffer-read-only: t -*-
  * !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!!
  * This file is built by regen/ebcdic.pl.
  * Any changes made here will be lost!
@@ -258,31 +258,6 @@ SOFTWARE.
 };
 #  endif
 
-#  ifndef DOINIT
-    EXT U8 PL_fold_locale[256];
-#  else
-    EXT U8 PL_fold_locale[256] = {
-/*      _0   _1   _2   _3   _4   _5   _6   _7   _8   _9   _A   _B   _C   _D   _E  _F*/
-/*0_*/0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,
-/*1_*/0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,
-/*2_*/0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,
-/*3_*/0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F,
-/*4_*/0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,
-/*5_*/0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,
-/*6_*/0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,
-/*7_*/0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F,
-/*8_*/0x80,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,
-/*9_*/0x90,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F,
-/*A_*/0xA0,0xA1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,
-/*B_*/0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF,
-/*C_*/0xC0,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,
-/*D_*/0xD0,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,
-/*E_*/0xE0,0xE1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,
-/*F_*/0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF
-/*      _0   _1   _2   _3   _4   _5   _6   _7   _8   _9   _A   _B   _C   _D   _E  _F*/
-};
-#  endif
-
 /* Index is EBCDIC 1047 code point; value is its other fold-pair equivalent
  * (A => a; a => A, etc) in the 0-255 range.  If no such equivalent, value is
  * the code point itself */
@@ -661,31 +636,6 @@ SOFTWARE.
 };
 #  endif
 
-#  ifndef DOINIT
-    EXT U8 PL_fold_locale[256];
-#  else
-    EXT U8 PL_fold_locale[256] = {
-/*      _0   _1   _2   _3   _4   _5   _6   _7   _8   _9   _A   _B   _C   _D   _E  _F*/
-/*0_*/0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,
-/*1_*/0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,
-/*2_*/0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,
-/*3_*/0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F,
-/*4_*/0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,
-/*5_*/0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,
-/*6_*/0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,
-/*7_*/0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F,
-/*8_*/0x80,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,
-/*9_*/0x90,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F,
-/*A_*/0xA0,0xA1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,
-/*B_*/0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF,
-/*C_*/0xC0,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,
-/*D_*/0xD0,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,
-/*E_*/0xE0,0xE1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,
-/*F_*/0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF
-/*      _0   _1   _2   _3   _4   _5   _6   _7   _8   _9   _A   _B   _C   _D   _E  _F*/
-};
-#  endif
-
 /* Index is EBCDIC 037 code point; value is its other fold-pair equivalent
  * (A => a; a => A, etc) in the 0-255 range.  If no such equivalent, value is
  * the code point itself */
@@ -845,4 +795,4 @@ SOFTWARE.
 
 #endif /* PERL_EBCDIC_TABLES_H_ */
 
-/* ex: set ro: */
+/* ex: set ro ft=c: */
index 4d39cb6..8b28647 100644 (file)
 : macros can't be generated in such situations.
 :
 : WARNING: Any macro created in a header file is visible to XS code, unless
-: care is taken to wrap it within something like #ifdef PERL_CORE..#endif.
-: This has had to be done with things like MAX and MIN, but nearly everything
-: else has been created without regard to the namespace pollution problem.
-:
-: Here's what else you need to know about using this file with regards to name
-: space pollution:
-:
-: The A flag is used to make a function and its short name visible everywhere
-:           on all platforms.  This should be used to make it part of Perl's
-:           API contract with XS developers.  The documentation for these is
-:           usually placed in perlapi.  If no documentation exists, that fact
-:           is also noted in perlapi.
-:
-: The C flag is used instead for functions and their short names that need to
-:            be accessible everywhere, typically because they are called from a
-:            publicly available macro or inline function, but they are not for
-:            public use by themselves.  The documentation for these is placed
-:            in perlintern.  If no documentation exists, that fact is also
-:            noted in perlintern.
-:
-:            These really need the 'p' flag to avoid name space collisions.
-:
-:           Some of these have been constructed so that the wrapper macro
-:           names begin with an underscore to lessen the chances of a name
-:           collision.  However, this is contrary to the C standard, and those
-:           should be changed.
-:
-: The E flag is used instead for a function and its short name that is supposed
-:            to be used only in the core plus extensions compiled with the
-:            PERL_EXT symbol defined.  Again, on some platforms, the function
-:            will be visible everywhere, so one of the 'p' or 'S' flags is
-:            generally needed.  Also note that an XS writer can always cheat
-:            and pretend to be an extension by #defining PERL_EXT.
-:
-: The X flag is similar to the C flag in that the function (whose entry better
-:           have the 'p' flag) is accessible everywhere on all platforms.
-:           However the short name macro that normally gets generated is
-:           suppressed outside the core.  (Except it is also visible in
-:           PERL_EXT extensions if the E flag is also specified.)  This flag
-:           is used for functions that are called from a public macro, the
-:           name of which isn't derived from the function name.  You'll have
-:           to write the macro yourself, and from within it, refer to the
-:           function in its full 'Perl_' form with any necessary thread
-:           context parameter.
+: care is taken to wrap it within C preprocessor guards like the following
+:
+:    #if defined(PERL_CORE)
+:    ...
+:    #endif
+:
+: A common pattern is to use defines like 'PERL_IN_FILE_C' (with FILE_C being
+: appropriately replaced with the real filename).  Most, if not all, of the
+: perl core C files define such a symbol before importing perl.h. Some groups
+: of files define more generalized flags which are referenced in this file and
+: the files generated from it.
+:
+: In general you should restrict the exposure of your exports as much as
+: possible, although older code may not do so.  Be aware that non-static
+: exports can be "over exported" and things will likely work out fine, but
+: inline and static macros will cause errors unless restricted to the specific
+: file they are intended for, and the generated PERL_ARGS_ macros will only
+: be available to inline functions in the appropriate context.
+:
+: From time to time it may be necessary to change or expand which files can
+: see a function, therefore we prefer the '#if defined()' form of condition
+: instead of the '#ifdef' form as the latter only works with one symbol and
+: the former can be combined with more than one.  It is also why you may see
+: functions with an 's' or 'i' export type grouped together into a single
+: conditional block separate from most of the other functions from the same
+: file with 'p' in them.
+:
+: The 'A' flag is used to make a function and its short name visible everywhere
+:         on all platforms.  This should be used to make it part of Perl's API
+:         contract with XS developers.  The documentation for these is usually
+:         placed in perlapi.  If no documentation exists, that fact is also
+:         noted in perlapi.
+:
+: The 'C' flag is used instead for functions and their short names that need to
+:         be accessible everywhere, typically because they are called from a
+:         publicly available macro or inline function, but they are not for
+:         public use by themselves.  The documentation for these is placed in
+:         perlintern.  If no documentation exists, that fact is also noted in
+:         perlintern.
+:
+:         These really need the 'p' flag to avoid name space collisions.
+:
+:         Some of these have been constructed so that the wrapper macro names
+:         begin with an underscore to lessen the chances of a name collision.
+:         However, this is contrary to the C standard, and those should be
+:         changed.
+:
+: The 'E' flag is used instead for a function and its short name that is
+:         supposed to be used only in the core plus extensions compiled with
+:         the PERL_EXT symbol defined.  Again, on some platforms, the function
+:         will be visible everywhere, so one of the 'p' or 'S' flags is
+:         generally needed.  Also note that an XS writer can always cheat and
+:         pretend to be an extension by #defining PERL_EXT.
+:
+: The 'X' flag is similar to the 'C' flag in that the function (whose entry
+:         better have the 'p' flag) is accessible everywhere on all platforms.
+:         However the short name macro that normally gets generated is
+:         suppressed outside the core.  (Except it is also visible in PERL_EXT
+:         extensions if the 'E' flag is also specified.)  This flag is used for
+:         functions that are called from a public macro, the name of which
+:         isn't derived from the function name.  You'll have to write the macro
+:         yourself, and from within it, refer to the function in its full
+:         'Perl_' form with any necessary thread context parameter.
 :
 : Just below is a description of the relevant parts of the automatic
 : documentation generation system which heavily involves this file.  Below that
 : the same entry.  This avoids needless repetition, making the pod shorter, and
 : makes it easier to compare and contrast the different forms, and less jumping
 : around the pod file for the person reading it.  The apidoc_item lines must
-: all come after the apidoc line and before the pod for the entry.
+: all come after the apidoc line and before the pod for the entry.  There need
+: not be empty lines between the apidoc line and any of its apidoc_item lines.
 :
 : The entries in this file that have corresponding '=for apidoc' entries must
 : have the 'd' flag set in this file.
 :
 : The remainder of these introductory comments detail all the possible flags:
 :
-:   A  Both long and short names are accessible fully everywhere (usually part
-:      of the public API).  If the function is not part of the public API,
-:      instead use C, E, or X.
-:
-:         add entry to the list of symbols available on all platforms
-:          unless e or m are also specified;
-:         any doc entry goes in perlapi.pod rather than perlintern.pod.  If
-:          there isn't a doc entry, autodoc.pl lists this in perlapi as
-:          existing and being undocumented; unless x is also specified, in
-:          which case it simply isn't listed.
-:         makes the short name defined for everywhere, not just for
-:          PERL_CORE/PERL_EXT
-:
-:   a  Allocates memory a la malloc/calloc.  Also implies "R".  This flag
-:      should only be on a function which returns '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'.
-:
-:         proto.h: add __attribute__malloc__
-:
-:   b  Binary backward compatibility.  This is used for functions which are
-:      kept only to not have to change legacy applications that call them.  If
-:      there are no such legacy applications in a Perl installation for all
-:      functions flagged with this, the installation can run Configure with the
-:      -Accflags='-DNO_MATHOMS' parameter to not even compile them.
-:
-:      Sometimes the function has been subsumed by a more general one (say, by
-:      adding a flags parameter), and a macro exists with the original short
-:      name API, and it calls the new function, bypassing this one, and the
-:      original 'Perl_' form is being deprecated.  In this case also specify
-:      the 'M' flag.
-:
-:      Without the M flag, these functions should be deprecated, and it is an
-:      error to not also specify the 'D' flag.
-:
-:      The 'b' functions are normally moved to mathoms.c, but if circumstances
-:      dictate otherwise, they can be anywhere, provided the whole function is
-:      wrapped with
+:   'A'  Both long and short names are accessible fully everywhere (usually
+:        part of the public API). If the function is not part of the public
+:        API, instead use 'C', 'E', or 'X'.
+:
+:        * adds entry to the list of symbols available on all platforms unless
+:          'e' or 'm' are also specified;
+:        * any doc entry goes in perlapi.pod rather than perlintern.pod. If
+:          there isn't a doc entry, autodoc.pl lists this in perlapi as
+:          existing and being undocumented; unless 'x' is also specified, in
+:          which case it simply isn't listed.
+:        * makes the short name defined for everywhere, not just for PERL_CORE
+:          or PERL_EXT
+:
+:   'a'  Allocates memory a la malloc/calloc. Also implies 'R'. This flag
+:        should only be on a function which returns "empty" memory which has no
+:        other pointers to it, and which does not contain any pointers to other
+:        things. So for example realloc() can not be 'a'.
+:
+:          proto.h: add __attribute__malloc__
+:
+:   'b'  Binary backward compatibility. This is used for functions which are
+:        kept only to not have to change legacy applications that call them. If
+:        there are no such legacy applications in a Perl installation for all
+:        functions flagged with this, the installation can run Configure with
+:        the -Accflags='-DNO_MATHOMS' parameter to not even compile them.
+:
+:        Sometimes the function has been subsumed by a more general one (say,
+:        by adding a flags parameter), and a macro exists with the original
+:        short name API, and it calls the new function, bypassing this one, and
+:        the original 'Perl_' form is being deprecated. In this case also
+:        specify the 'M' flag.
+:
+:        Without the M flag, these functions should be deprecated, and it is an
+:        error to not also specify the 'D' flag.
+:
+:        The 'b' functions are normally moved to mathoms.c, but if
+:        circumstances dictate otherwise, they can be anywhere, provided the
+:        whole function is wrapped with
+:
 :          #ifndef NO_MATHOMS
 :          ...
 :          #endif
 :
-:      Note that this flag no longer automatically adds a 'Perl_' prefix to the
-:      name.  Additionally specify 'p' to do that.
+:        Note that this flag no longer automatically adds a 'Perl_' prefix to
+:        the name. Additionally specify 'p' to do that.
+:
+:        This flag effectively causes nothing to happen if the perl interpreter
+:        is compiled with -DNO_MATHOMS (which causes any functions with this
+:        flag to not be compiled); otherwise these happen:
 :
-:      This flag effectively causes nothing to happen if the perl interpreter
-:      is compiled with -DNO_MATHOMS (which causes any functions with this flag
-:      to not be compiled); otherwise these happen:
-:         add entry to the list of symbols available on all platforms;
-:         create PERL_ARGS_ASSERT_foo;
-:        add embed.h entry (unless overridden by the 'M' or 'o' flags)
+:        * add entry to the list of symbols available on all platforms;
+:        * create PERL_ARGS_ASSERT_foo;
+:        * add embed.h entry (unless overridden by the 'M' or 'o' flags)
 :
-:   C  Intended for core use only.  This indicates to XS writers that they
-:      shouldn't be using this function.  Devel::PPPort informs them of this,
-:      for example.  Some functions have to be accessible everywhere even if
-:      they are not intended for public use.  An example is helper functions
-:      that are called from inline ones that are publicly available.
+:   'C'  Intended for core use only. This indicates to XS writers that they
+:        shouldn't be using this function. Devel::PPPort informs them of this,
+:        for example. Some functions have to be accessible everywhere even if
+:        they are not intended for public use. An example is helper functions
+:        that are called from inline ones that are publicly available.
 :
-:         add entry to the list of symbols available on all platforms
-:          unless e or m are also specified;
-:         any doc entry goes in perlintern.pod rather than perlapi.pod.  If
-:          there isn't a doc entry, autodoc.pl lists this in perlintern as
-:          existing and being undocumented
-:         makes the short name defined for everywhere, not just for
-:          PERL_CORE/PERL_EXT
+:        * add entry to the list of symbols available on all platforms unless e
+:          or m are also specified;
+:        * any doc entry goes in perlintern.pod rather than perlapi.pod. If
+:          there isn't a doc entry, autodoc.pl lists this in perlintern as
+:          existing and being undocumented
+:        * makes the short name defined for everywhere, not just for PERL_CORE
+:          or PERL_EXT
 :
-:   D  Function is deprecated:
+:   'D'  Function is deprecated:
 :
-:         proto.h: add __attribute__deprecated__
-:         autodoc.pl adds a note to this effect in the doc entry
+:        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:
+:   'd'  Function has documentation (somewhere) in the source:
 :
-:         enables 'no docs for foo" warning in autodoc.pl if the documentation
-:         isn't found.
+:        Enables 'no docs for foo" warning in autodoc.pl if the documentation
+:        isn't found.
 :
-:   E  Visible to extensions included in the Perl core:
+:   '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) it must be static to its containing file ("i" or "S" flag); or
-:         2) be combined with the "X" flag.
+:        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
+:   'e'  Not exported
 :
 :         suppress entry in the list of symbols available on all platforms
 :
-:   f  Function takes a format string. If the function name =~ qr/strftime/
-:      then it is assumed to take a strftime-style format string as the 1st
-:      arg; otherwise it's assumed to take a printf style format string, not
-:      necessarily the 1st arg.  All the arguments following it (including
-:      possibly '...') are assumed to be for the format.
+:   'f'  Function takes a format string. If the function name =~ qr/strftime/
+:        then it is assumed to take a strftime-style format string as the 1st
+:        arg; otherwise it's assumed to take a printf style format string, not
+:        necessarily the 1st arg.  All the arguments following the second form
+:       (including possibly '...') are assumed to be for the format.
 :
-:         embed.h: any entry in here is suppressed because of varargs
+:         embed.h: any entry in here for the second form is suppressed because
+:                 of varargs
 :         proto.h: add __attribute__format__ (or ...null_ok__)
 :
-:   F  Function has a '...' parameter, but don't assume it is a format.  This
-:      is to make sure that new functions with formats can't be added without
-:      considering if they are format functions or not.  A reason to use this
-:      flag even on a format function is if the format would generate
-:          error: format string argument is not a string type
-:
-:   G  Suppress empty PERL_ARGS_ASSERT_foo macro.  Normally such a macro is
-:      generated for all entries for functions 'foo' in this file.  If there is
-:      a pointer argument to 'foo', it needs to be declared in this file as
-:      either NN or NULLOK, and the function definition must call its
-:      corresponding PERL_ARGS_ASSERT_foo macro (a porting test ensures this)
-:      which asserts at runtime (under DEBUGGING builds) that NN arguments are
-:      not NULL.  If there aren't NN arguments, use of this macro is optional.
-:      Rarely, a function will define its own PERL_ARGS_ASSERT_foo macro, and
-:      in those cases, adding this flag to its entry in this file will suppress
-:      the normal one.  It is not possible to suppress the generated macro if
-:      it isn't optional, that is, if there is at least one NN argument.
-:
-:         proto.h: PERL_ARGS_ASSERT macro is not defined unless the function
+:   'F'  Function has a '...' parameter, but don't assume it is a format. This
+:        is to make sure that new functions with formats can't be added without
+:        considering if they are format functions or not. A reason to use this
+:        flag even on a format function is if the format would generate error:
+:        format string argument is not a string type
+:
+:   'G'  Suppress empty PERL_ARGS_ASSERT_foo macro. Normally such a macro is
+:        generated for all entries for functions 'foo' in this file. If there
+:        is a pointer argument to 'foo', it needs to be declared in this file
+:        as either NN or NULLOK, and the function definition must call its
+:        corresponding PERL_ARGS_ASSERT_foo macro (a porting test ensures this)
+:        which asserts at runtime (under DEBUGGING builds) that NN arguments
+:        are not NULL. If there aren't NN arguments, use of this macro is
+:        optional. Rarely, a function will define its own PERL_ARGS_ASSERT_foo
+:        macro, and in those cases, adding this flag to its entry in this file
+:        will suppress the normal one. It is not possible to suppress the
+:        generated macro if it isn't optional, that is, if there is at least
+:        one NN argument.
+:
+:          proto.h: PERL_ARGS_ASSERT macro is not defined unless the function
 :                 has NN arguments
 :
-:   h  Hide any documentation that would normally go into perlapi or
-:      perlintern.  This is typically used when the documentation is actually
-:      in another pod.  If you don't use the 'h', that documentation is
-:      displayed in both places; with the flag, it stays in the pod, and a
-:      link to that pod is instead placed in perlapi or perlintern.  This
-:      allows one to browse perlapi or perlintern and see all the potentially
-:      relevant elements.  A good example is perlapio.  It has documentation
-:      about PerlIO functions with other text giving context.  There's no point
-:      in writing a second entry for perlapi, but it would be good if someone
-:      browsing perlapi knew about the function and where it is documented.  By
-:      adding '=for apidoc' lines in perlapio, the appropriate text could be
-:      simply copied into perlapi if deemed appropriate, or just a link added
-:      there when the 'h' flag is specified.
-:      This flag is useful for symbolic names for flags.  A single =for apidoc
-:      line can be added to the pod where the meaning is discussed, and perlapi
-:      will list the name, with a link to the pod.  Another use would be if
-:      there are a bunch of macros which follow a common paradigm in their
-:      naming, so rather than having an entry for each slight variation, there
-:      is an overarching one.  This flag is useful for downstream programs,
-:      such as Devel::PPPort.
-:
-:   i  inline static.  This is used for functions that the compiler is being
-:      requested to inline.  If the function is in a header file its
-:      definition will be visible (unless guarded by #if..#endif) to all
-:      XS code.  (A typical guard will be that it is being included in a
-:      particular C file(s) or in the perl core.)  Therefore, all
-:      non-guarded functions should also have the 'p' flag specified to avoid
-:      polluting the XS code name space.  Otherwise an error is generated if
-:      the 'S' flag is not also specified.
-:
-:         proto.h: function is declared as PERL_STATIC_INLINE
-:
-:   I  This flag works exactly the same as 'i' but it also adds
-:      __attribute__((always_inline)) or __forceinline if either of them is
-:      supported by the compiler.
-:
-:         proto.h: function is declared as PERL_STATIC_FORCE_INLINE and
+:   'h'  Hide any documentation that would normally go into perlapi or
+:        perlintern. This is typically used when the documentation is actually
+:        in another pod. If you don't use the 'h', that documentation is
+:        displayed in both places; with the flag, it stays in the pod, and a
+:        link to that pod is instead placed in perlapi or perlintern. This
+:        allows one to browse perlapi or perlintern and see all the potentially
+:        relevant elements. A good example is perlapio. It has documentation
+:        about PerlIO functions with other text giving context. There's no
+:        point in writing a second entry for perlapi, but it would be good if
+:        someone browsing perlapi knew about the function and where it is
+:        documented. By adding '=for apidoc' lines in perlapio, the appropriate
+:        text could be simply copied into perlapi if deemed appropriate, or
+:        just a link added there when the 'h' flag is specified.
+:
+:        This flag is useful for symbolic names for flags. A single =for apidoc
+:        line can be added to the pod where the meaning is discussed, and
+:        perlapi will list the name, with a link to the pod. Another use would
+:        be if there are a bunch of macros which follow a common paradigm in
+:        their naming, so rather than having an entry for each slight
+:        variation, there is an overarching one. This flag is useful for
+:        downstream programs, such as Devel::PPPort.
+:
+:   'i'  inline static. This is used for functions that the compiler is being
+:        requested to inline. If the function is in a header file its
+:        definition will be visible (unless guarded by #if..#endif) to all XS
+:        code. (A typical guard will be that it is being included in a
+:        particular C file(s) or in the perl core.) Therefore, all non-guarded
+:        functions should also have the 'p' flag specified to avoid polluting
+:        the XS code name space. Otherwise an error is generated if the 'S'
+:        flag is not also specified.
+:
+:          proto.h: function is declared as PERL_STATIC_INLINE
+:
+:   'I'  This flag works exactly the same as 'i' but it also adds
+:        __attribute__((always_inline)) or __forceinline if either of them is
+:        supported by the compiler.
+:
+:          proto.h: function is declared as PERL_STATIC_FORCE_INLINE and
 :                  __attribute__always_inline__ is added
 :
-:   m  Implemented as a macro; there is no function associated with this name,
-:      and hence no long Perl_ or S_ name.  However, if the macro name itself
-:      begins with 'Perl_', autodoc.pl will show a thread context parameter
-:      unless the 'T' flag is specified.
+:   'm'  Implemented as a macro; there is no function associated with this
+:        name, and hence no long Perl_ or S_ name. However, if the macro name
+:        itself begins with 'Perl_', autodoc.pl will show a thread context
+:        parameter unless the 'T' flag is specified.
 :
 :         suppress proto.h entry (actually, not suppressed, but commented out)
 :         suppress entry in the list of exported symbols available on all platforms
 :         suppress embed.h entry, as the implementation should furnish the macro
 :
-:   M  The implementation is furnishing its own macro instead of relying on the
-:      default short name macro that simply expands to call the real name
-:      function.  This is used if the parameters need to be cast from what the
-:      caller has, or if there is a macro that bypasses this function (whose
-:      long name is being retained for backward compatibility for those who
-:      call it with that name).  An example is when a new function is created
-:      with an extra parameter and a wrapper macro is added that has the old
-:      API, but calls the new one with the exta parameter set to a default.
+:   'M'  The implementation is furnishing its own macro instead of relying on
+:        the automatically generated short name macro (which simply expands to
+:        call the real name function). One reason to do this is if the
+:        parameters need to be cast from what the caller has, or if there is a
+:        macro that bypasses this function (whose long name is being retained
+:        for backward compatibility for those who call it with that name). An
+:        example is when a new function is created with an extra parameter and
+:        a wrapper macro is added that has the old API, but calls the new one
+:        with the exta parameter set to a default.
 :
-:      This flag requires the 'p' flag to be specified, as there would be no
-:      need to do this if the function weren't publicly accessible before.
+:        This flag requires the 'p' flag to be specified, as there would be no
+:        need to do this if the function weren't publicly accessible before.
 :
-:      The entry is processed based on the other flags, but the:
-:         embed.h entry is suppressed
+:        The entry is processed based on the other flags, but the:
+:           embed.h entry is suppressed
 :
-:   N  The name in the entry isn't strictly a name
+:   'N'  The name in the entry isn't strictly a name
 :
-:      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
+:        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.  Perhaps a better name would have been '0'. (used only
-:      in =for apidoc entries)
+:   'n'  Has no arguments. Perhaps a better name would have been '0'. (used
+:        only in =for apidoc entries)
 :
-:      The macro (it can't be a function) is used without any parameters nor
-:      empty parentheses.
+:        The macro (it can't be a function) is used without any parameters nor
+:        empty parentheses.
 :
-:      Perhaps a better name for this flag would have been '0'.  The reason the
-:      flag was not changed to that from 'n', is if D:P were to be regenerated
-:      on an older perl, it still would use the new embed.fnc shipped with it,
-:      but would be using the flags from the older perl source code.
+:        Perhaps a better name for this flag would have been '0'. The reason
+:        the flag was not changed to that from 'n', is if D:P were to be
+:        regenerated on an older perl, it still would use the new embed.fnc
+:        shipped with it, but would be using the flags from the older perl
+:        source code.
 :
-:   O  Has a perl_ compatibility macro.
+:   '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.
+:        autodoc.pl adds a note that the perl_ form of this function is
+:        deprecated.
 :
-:   o  Has no Perl_foo or S_foo compatibility macro:
+:   'o'  Has no Perl_foo or S_foo compatibility macro:
 :
-:      This is used for whatever reason to force the function to be called
-:      with the long name.  Perhaps there is a varargs issue.  Use the 'M'
-:      flag instead for wrapper macros, and legacy-only functions should
-:      also use 'b'.
+:       This is used for whatever reason to force the function to be called
+:       with the long name.  Perhaps there is a varargs issue.  Use the 'M'
+:       flag instead for wrapper macros, and legacy-only functions should
+:       also use 'b'.
 :
-:         embed.h: suppress "#define foo Perl_foo"
+:          embed.h: suppress "#define foo Perl_foo"
 :
-:      autodoc.pl adds a note that this function must be explicitly called as
-:      Perl_$name, and with an aTHX_ parameter unless the 'T' flag is also
-:      specified.
-
-:      mnemonic: 'omit' generated macro
+:        autodoc.pl adds a note that this function must be explicitly called as
+:        Perl_$name, and with an aTHX_ parameter unless the 'T' flag is also
+:        specified.
+:
+:        mnemonic: 'omit' generated macro
 :
-:   P  Pure function:
+:   'P'  Pure function:
 :
-:      A pure function has no effects except the return value, and the return
-:       value depends only on params and/or globals.  This is a hint to the
-:      compiler that it can optimize calls to this function out of common
-:      subexpressions.  Consequently if this flag is wrongly specified, it can
-:      lead to subtle bugs that vary by platform, compiler, compiler version,
-:      and optimization level.  Also, a future commit could easily change a
-:      currently-pure function without even noticing this flag.  So it should
-:      be used sparingly, only for functions that are unlikely to ever become
-:      not pure by future commits.  It should not be used for static
-:      functions, as the compiler already has the information needed to make
-:      the 'pure' determination and doesn't need any hint; so it doesn't add
-:      value in those cases, and could be dangerous if it causes the compiler
-:      to skip doing its own checks.  It should not be used on functions that
-:      touch SVs, as those can trigger unexpected magic.  Also implies "R":
+:        A pure function has no effects except the return value, and the return
+:        value depends only on params and/or globals. This is a hint to the
+:        compiler that it can optimize calls to this function out of common
+:        subexpressions. Consequently if this flag is wrongly specified, it can
+:        lead to subtle bugs that vary by platform, compiler, compiler version,
+:        and optimization level. Also, a future commit could easily change a
+:        currently-pure function without even noticing this flag. So it should
+:        be used sparingly, only for functions that are unlikely to ever become
+:        not pure by future commits. It should not be used for static
+:        functions, as the compiler already has the information needed to make
+:        the 'pure' determination and doesn't need any hint; so it doesn't add
+:        value in those cases, and could be dangerous if it causes the compiler
+:        to skip doing its own checks. It should not be used on functions that
+:        touch SVs, as those can trigger unexpected magic. Also implies "R":
 :
-:         proto.h: add __attribute__pure__
+:          proto.h: add __attribute__pure__
 :
-:   p  Function in source code has a Perl_ prefix:
+:   'p'  Function in source code has a Perl_ prefix:
 :
-:         proto.h: function is declared as Perl_foo rather than foo
-:         embed.h: "#define foo Perl_foo" entries added
+:          proto.h: function is declared as Perl_foo rather than foo
+:          embed.h: "#define foo Perl_foo" entries added
 :
-:   R  Return value must not be ignored (also implied by 'a' and 'P' flags):
+:   'R'  Return value must not be ignored (also implied by 'a' and 'P' flags):
 :
-:      gcc has a bug (which they claim is a feature) in which casting the
-:       result of one of these to (void) doesn't silence the warning that the
-:      result is ignored.  (Perl has a workaround for this bug, see
-:       PERL_UNUSED_RESULT docs)
+:        gcc has a bug (which they claim is a feature) in which casting the
+:        result of one of these to (void) doesn't silence the warning that the
+:        result is ignored. (Perl has a workaround for this bug, see
+:        PERL_UNUSED_RESULT docs)
 :
-:        proto.h: add __attribute__warn_unused_result__
+:          proto.h: add __attribute__warn_unused_result__
 :
-:   r  Function never returns:
+:   'r'  Function never returns:
 :
-:        proto.h: add __attribute__noreturn__
+:          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,
+:          proto.h: function is declared as S_foo rather than foo,
 :                STATIC is added to declaration;
-:         embed.h: "#define foo S_foo" entries added
+:          embed.h: "#define foo S_foo" entries added
 :
-:   s  autodoc.pl adds a terminating semi-colon to the usage example in the
-:      documentation.
+:   's'  Static function, but function in source code has a Perl_ prefix:
 :
-:   T  Has no implicit interpreter/thread context argument:
+:       This is used for functions that have always had a Perl_ prefix, but
+:       have been moved to a header file and declared static.
 :
-:         suppress the pTHX part of "foo(pTHX...)" in proto.h;
-:         In the PERL_IMPLICIT_SYS branch of embed.h, generates
+:          proto.h: function is declared as Perl_foo rather than foo
+:                STATIC is added to declaration;
+:          embed.h: "#define foo Perl_foo" entries added
+:
+:   '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  The macro's (it has to be a macro) return value or parameters are
-:      unorthodox, and aren't in the list above of recognized weird ones.   For
-:      example, they aren't C parameters, or the macro expands to something
-:      that isn't a symbol.
+:   'u'  The macro's (it has to be a macro) return value or parameters are
+:        unorthodox, and aren't in the list above of recognized weird ones. For
+:        example, they aren't C parameters, or the macro expands to something
+:        that isn't a symbol.
+:
+:        For example, the expansion of STR_WITH_LEN is a comma separated pair
+:        of values, so would have this flag; or some macros take preprocessor
+:        tokens, so would have this flag.
 :
-:      For example, the expansion of STR_WITH_LEN is a comma separated pair of
-:      values, so would have this flag; or some macros take preprocessor
-:      tokens, so would have this flag.
+:        This also is used for entries that require processing for use, such as
+:        being compiled by xsubpp. This flag is an indication to downstream
+:        tools, such as Devel::PPPort, that this requires special handling.
 :
-:      This also is used for entries that require processing for use, such as
-:      being compiled by xsubpp.  This flag is an indication to downstream
-:      tools, such as Devel::PPPort, that this requires special handling.
+:   'U'  autodoc.pl will not output a usage example
 :
-:   U  autodoc.pl will not output a usage example
+:   'W'  Add a comma_pDEPTH argument to function prototypes, and a comma_aDEPTH argument
+:        to the function calls. This means that under DEBUGGING a depth
+:        argument is added to the functions, which is used for example by the
+:        regex engine for debugging and trace output. A non DEBUGGING build
+:        will not pass the unused argument. Currently restricted to functions
+:        with at least one argument.
 :
-:   W  Add a _pDEPTH argument to function prototypes, and an _aDEPTH
-:      argument to the function calls. This means that under DEBUGGING
-:      a depth argument is added to the functions, which is used for
-:      example by the regex engine for debugging and trace output.
-:      A non DEBUGGING build will not pass the unused argument.
-:      Currently restricted to functions with at least one argument.
+:   'X'  Explicitly exported:
 :
-:   X  Explicitly exported:
+:          add entry to the list of symbols available on all platforms, unless
+:          'e' or 'm'
 :
-:         add entry to the list of symbols available on all platforms, 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_ ...)).
 :
-:      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'  Experimental, may change:
 :
-:   x  Experimental, may change:
+:          Any doc entry is marked that it may change. An undocumented
+:          experimental function is listed in perlintern rather than perlapi,
+:          even if it is allegedly API.
 :
-:         Any doc entry is marked that it may change.  An undocumented
-:         experimental function is listed in perlintern rather than perlapi,
-:         even if it is allegedly API.
+:   'y'  Typedef.  The element names a type rather than being a macro
 :
-:   y  Typedef.  The element names a type rather than being a macro
+:   ';'  autodoc.pl adds a terminating semi-colon to the usage example in the
+:        documentation.
+:
+:   '#'  The number sign flag indicates that this is a pre-processor symbol
+:        that is just #define'd or #undef'd. Must NOT be the first symbol on
+:        the line.
+:
+:   '?'  The question mark flag is used internally by Devel::PPPort to
+:        indicate that it does not have enough information to generate a
+:        proper test case.
 :
 : In this file, pointer parameters that must not be passed NULLs should be
 : prefixed with NN.
 : 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 non-tab whitespace.
-
-CipRTX |char * |mortal_getenv  |NN const char * str
-
-#if defined(PERL_IMPLICIT_SYS)
-CTo    |PerlInterpreter*|perl_alloc_using \
-                               |NN struct IPerlMem *ipM \
-                               |NN struct IPerlMem *ipMS \
-                               |NN struct IPerlMem *ipMP \
-                               |NN struct IPerlEnv *ipE \
-                               |NN struct IPerlStdIO *ipStd \
-                               |NN struct IPerlLIO *ipLIO \
-                               |NN struct IPerlDir *ipD \
-                               |NN struct IPerlSock *ipS \
-                               |NN struct IPerlProc *ipP
-#endif
-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
-CTpR   |bool   |doing_taint    |int argc|NULLOK char** argv|NULLOK char** env
-#if defined(USE_ITHREADS)
-ATod   |PerlInterpreter*|perl_clone|NN PerlInterpreter *proto_perl|UV flags
-#  if defined(PERL_IMPLICIT_SYS)
-CTo    |PerlInterpreter*|perl_clone_using \
-                               |NN PerlInterpreter *proto_perl \
-                               |UV flags \
-                               |NN struct IPerlMem* ipM \
-                               |NN struct IPerlMem* ipMS \
-                               |NN struct IPerlMem* ipMP \
-                               |NN struct IPerlEnv* ipE \
-                               |NN struct IPerlStdIO* ipStd \
-                               |NN struct IPerlLIO* ipLIO \
-                               |NN struct IPerlDir* ipD \
-                               |NN struct IPerlSock* ipS \
-                               |NN struct IPerlProc* ipP
-#  endif
-#endif
-
-CaTopd |Malloc_t|malloc        |MEM_SIZE nbytes
-CaTopd |Malloc_t|calloc        |MEM_SIZE elements|MEM_SIZE size
-CRTopd |Malloc_t|realloc       |Malloc_t where|MEM_SIZE nbytes
-CTopd  |Free_t |mfree          |Malloc_t where
-#if defined(MYMALLOC)
-TpR    |MEM_SIZE|malloced_size |NN void *p
-TpR    |MEM_SIZE|malloc_good_size      |size_t nbytes
-#endif
-#if defined(PERL_IN_MALLOC_C)
-ST     |int    |adjust_size_and_find_bucket    |NN size_t *nbytes_p
-#endif
+: Numeric arguments may also be prefixed with NZ, which will cause the
+: appropriate asserts to be generated to validate that this is the case.
+:
+: Flags should be sorted asciibetically.
+:
+: Please keep the next line *BLANK*
 
-CTpdR  |void*  |get_context
-CTpd   |void   |set_context    |NN void *t
+pr     |void   |abort_execution|NULLOK SV *msg_sv                      \
+                               |NN const char * const name
+px     |LOGOP *|alloc_LOGOP    |I32 type                               \
+                               |NULLOK OP *first                       \
+                               |NULLOK OP *other
+: Used in toke.c and perly.y
+p      |PADOFFSET|allocmy      |NN const char * const name             \
+                               |const STRLEN len                       \
+                               |const U32 flags
+Xdp    |bool   |amagic_applies |NN SV *sv                              \
+                               |int method                             \
+                               |int flags
+Adp    |SV *   |amagic_call    |NN SV *left                            \
+                               |NN SV *right                           \
+                               |int method                             \
+                               |int dir
+Adp    |SV *   |amagic_deref_call                                      \
+                               |NN SV *ref                             \
+                               |int method
+p      |bool   |amagic_is_enabled                                      \
+                               |int method
 
-XEop   |bool   |try_amagic_bin |int method|int flags
-XEop   |bool   |try_amagic_un  |int method|int flags
-Apd    |SV*    |amagic_call    |NN SV* left|NN SV* right|int method|int dir
-Apd    |SV *   |amagic_deref_call|NN SV *ref|int method
-p      |bool   |amagic_is_enabled|int method
-Apd    |int    |Gv_AMupdate    |NN HV* stash|bool destructing
-CpdR   |CV*    |gv_handler     |NULLOK HV* stash|I32 id
-Apd    |OP*    |op_append_elem |I32 optype|NULLOK OP* first|NULLOK OP* last
-Apd    |OP*    |op_append_list |I32 optype|NULLOK OP* first|NULLOK OP* last
-Apd    |OP*    |op_linklist    |NN OP *o
-Apd    |OP*    |op_prepend_elem|I32 optype|NULLOK OP* first|NULLOK OP* last
+ETXip  |void   |append_utf8_from_native_byte                           \
+                               |const U8 byte                          \
+                               |NN U8 **dest
 : FIXME - this is only called by pp_chown. They should be merged.
-p      |I32    |apply          |I32 type|NN SV** mark|NN SV** sp
-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
-Apd    |void   |av_extend      |NN AV *av|SSize_t key
-p      |void   |av_extend_guts |NULLOK AV *av|SSize_t key \
-                               |NN SSize_t *maxp \
-                               |NN SV ***allocp|NN SV ***arrayp
-ApdR   |SV**   |av_fetch       |NN AV *av|SSize_t key|I32 lval
-CipdR  |SV**   |av_fetch_simple|NN AV *av|SSize_t key|I32 lval
-Apd    |void   |av_fill        |NN AV *av|SSize_t fill
-ApdR   |SSize_t|av_len         |NN AV *av
-ApdR   |AV*    |av_make        |SSize_t size|NN SV **strp
-CpdR   |AV*    |av_new_alloc   |SSize_t size|bool zeroflag
-p      |SV*    |av_nonelem     |NN AV *av|SSize_t ix
-Apd    |SV*    |av_pop         |NN AV *av
-Apdoe  |void   |av_create_and_push|NN AV **const avp|NN SV *const val
-Apd    |void   |av_push        |NN AV *av|NN SV *val
+p      |I32    |apply          |I32 type                               \
+                               |NN SV **mark                           \
+                               |NN SV **sp
+Apx    |void   |apply_attrs_string                                     \
+                               |NN const char *stashpv                 \
+                               |NN CV *cv                              \
+                               |NN const char *attrstr                 \
+                               |STRLEN len
+Adp    |OP *   |apply_builtin_cv_attributes                            \
+                               |NN CV *cv                              \
+                               |NULLOK OP *attrlist
+CTp    |void   |atfork_lock
+CTp    |void   |atfork_unlock
+Cop    |SV **  |av_arylen_p    |NN AV *av
+Adp    |void   |av_clear       |NN AV *av
+ARdip  |Size_t |av_count       |NN AV *av
+Adeop  |void   |av_create_and_push                                     \
+                               |NN AV ** const avp                     \
+                               |NN SV * const val
+Adeop  |SV **  |av_create_and_unshift_one                              \
+                               |NN AV ** const avp                     \
+                               |NN SV * const val
+Adp    |SV *   |av_delete      |NN AV *av                              \
+                               |SSize_t key                            \
+                               |I32 flags
+Adp    |void   |av_dump        |NULLOK AV *av
+ARdp   |bool   |av_exists      |NN AV *av                              \
+                               |SSize_t key
+Adp    |void   |av_extend      |NN AV *av                              \
+                               |SSize_t key
+p      |void   |av_extend_guts |NULLOK AV *av                          \
+                               |SSize_t key                            \
+                               |NN SSize_t *maxp                       \
+                               |NN SV ***allocp                        \
+                               |NN SV ***arrayp
+ARdp   |SV **  |av_fetch       |NN AV *av                              \
+                               |SSize_t key                            \
+                               |I32 lval
+CRdip  |SV **  |av_fetch_simple|NN AV *av                              \
+                               |SSize_t key                            \
+                               |I32 lval
+Adp    |void   |av_fill        |NN AV *av                              \
+                               |SSize_t fill
+Cop    |IV *   |av_iter_p      |NN AV *av
+ARdp   |SSize_t|av_len         |NN AV *av
+ARdp   |AV *   |av_make        |SSize_t size                           \
+                               |NN SV **strp
+CRdip  |AV *   |av_new_alloc   |SSize_t size                           \
+                               |bool zeroflag
+p      |SV *   |av_nonelem     |NN AV *av                              \
+                               |SSize_t ix
+Adp    |SV *   |av_pop         |NN AV *av
+Adp    |void   |av_push        |NN AV *av                              \
+                               |NN SV *val
+Adip   |void   |av_push_simple |NN AV *av                              \
+                               |NN SV *val
 : Used in scope.c, and by Data::Alias
 EXp    |void   |av_reify       |NN AV *av
-ApdR   |SV*    |av_shift       |NN AV *av
-Apd    |SV**   |av_store       |NN AV *av|SSize_t key|NULLOK SV *val
-Cipd   |SV**   |av_store_simple|NN AV *av|SSize_t key|NULLOK SV *val
-AmdR   |SSize_t|av_top_index   |NN AV *av
-AidRp  |Size_t |av_count       |NN AV *av
-AmdR   |SSize_t|av_tindex      |NN AV *av
-Apd    |void   |av_undef       |NN AV *av
-Apdoe  |SV**   |av_create_and_unshift_one|NN AV **const avp|NN SV *const val
-Apd    |void   |av_unshift     |NN AV *av|SSize_t num
-Cpo    |SV**   |av_arylen_p    |NN AV *av
-Cpo    |IV*    |av_iter_p      |NN AV *av
-#if defined(PERL_IN_AV_C)
-S      |MAGIC* |get_aux_mg     |NN AV *av
-#endif
+ARdp   |SV *   |av_shift       |NN AV *av
+Adp    |SV **  |av_store       |NN AV *av                              \
+                               |SSize_t key                            \
+                               |NULLOK SV *val
+Cdip   |SV **  |av_store_simple|NN AV *av                              \
+                               |SSize_t key                            \
+                               |NULLOK SV *val
+ARdm   |SSize_t|av_tindex      |NN AV *av
+ARdm   |SSize_t|av_top_index   |NN AV *av
+Adp    |void   |av_undef       |NN AV *av
+Adp    |void   |av_unshift     |NN AV *av                              \
+                               |SSize_t num
 : Used in perly.y
-pR     |OP*    |bind_match     |I32 type|NN OP *left|NN OP *right
+Rp     |OP *   |bind_match     |I32 type                               \
+                               |NN OP *left                            \
+                               |NN OP *right
 : Used in perly.y
-ApdR   |OP*    |block_end      |I32 floor|NULLOK OP* seq
-CpR    |U8     |block_gimme
+ARdp   |OP *   |block_end      |I32 floor                              \
+                               |NULLOK OP *seq
+CRp    |U8     |block_gimme
+Adopx  |void   |blockhook_register                                     \
+                               |NN BHK *hk
 : Used in perly.y
-ApdR   |int    |block_start    |int full
-Aodxp  |void   |blockhook_register |NN BHK *hk
+ARdp   |int    |block_start    |int full
 p      |void   |boot_core_builtin
-: Used in perl.c
-p      |void   |boot_core_UNIVERSAL
+: Only used in perl.c
+p      |void   |boot_core_mro
 : Used in perl.c
 p      |void   |boot_core_PerlIO
-Cp     |void   |call_list      |I32 oldscope|NN AV *paramList
-Apd    |const PERL_CONTEXT *   |caller_cx|I32 level \
+: Used in perl.c
+p      |void   |boot_core_UNIVERSAL
+p      |OP *   |build_infix_plugin                                     \
+                               |NN OP *lhs                             \
+                               |NN OP *rhs                             \
+                               |NN void *tokendata
+EXp    |char * |_byte_dump_string                                      \
+                               |NN const U8 * const start              \
+                               |const STRLEN len                       \
+                               |const bool format
+Adp    |int    |bytes_cmp_utf8 |NN const U8 *b                         \
+                               |STRLEN blen                            \
+                               |NN const U8 *u                         \
+                               |STRLEN ulen
+AMdpx  |U8 *   |bytes_from_utf8|NN const U8 *s                         \
+                               |NN STRLEN *lenp                        \
+                               |NN bool *is_utf8p
+CTdpx  |U8 *   |bytes_from_utf8_loc                                    \
+                               |NN const U8 *s                         \
+                               |NN STRLEN *lenp                        \
+                               |NN bool *is_utf8p                      \
+                               |NULLOK const U8 **first_unconverted
+Adpx   |U8 *   |bytes_to_utf8  |NN const U8 *s                         \
+                               |NN STRLEN *lenp
+AOdp   |I32    |call_argv      |NN const char *sub_name                \
+                               |I32 flags                              \
+                               |NN char **argv
+
+: "Very" special - can't use the O flag for this one:
+: (The rename from perl_atexit to Perl_call_atexit was in 864dbfa3ca8032ef)
+Adp    |void   |call_atexit    |ATEXIT_t fn                            \
+                               |NULLOK void *ptr
+Adp    |const PERL_CONTEXT *|caller_cx                                 \
+                               |I32 level                              \
                                |NULLOK const PERL_CONTEXT **dbcxp
+Cp     |void   |call_list      |I32 oldscope                           \
+                               |NN AV *paramList
+AOdp   |I32    |call_method    |NN const char *methname                \
+                               |I32 flags
+CTadop |Malloc_t|calloc        |MEM_SIZE elements                      \
+                               |MEM_SIZE size
+AOdp   |I32    |call_pv        |NN const char *sub_name                \
+                               |I32 flags
+AOdp   |I32    |call_sv        |NN SV *sv                              \
+                               |volatile I32 flags
 : Used in several source files
-pR     |bool   |cando          |Mode_t mode|bool effective|NN const Stat_t* statbufp
-CpRT   |U32    |cast_ulong     |NV f
-CpRT   |I32    |cast_i32       |NV f
-CpRT   |IV     |cast_iv        |NV f
-CpRT   |UV     |cast_uv        |NV f
-#if !defined(HAS_TRUNCATE) && !defined(HAS_CHSIZE) && defined(F_FREESP)
-ApdR   |I32    |my_chsize      |int fd|Off_t length
-#endif
-p      |const COP*|closest_cop |NN const COP *cop|NULLOK const OP *o \
-                               |NULLOK const OP *curop|bool opnext
-: Used in perly.y
-ApdR   |OP*    |op_convert_list        |I32 optype|I32 flags|NULLOK OP* o
-: Used in op.c and perl.c
-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
-ATprd  |void   |croak_no_modify
-ATprd  |void   |croak_xs_usage |NN const CV *const cv \
-                               |NN const char *const params
-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)
-Tore   |void   |win32_croak_not_implemented|NN const char * fname
-#endif
-#if defined(MULTIPLICITY)
-AdfTrp |void   |croak_nocontext|NULLOK const char* pat|...
-AdfTrp |OP*    |die_nocontext  |NULLOK const char* pat|...
-AfTpd  |void   |deb_nocontext  |NN const char* pat|...
-AdfTp  |char*  |form_nocontext |NN const char* pat|...
-AdFTp  |void   |load_module_nocontext|U32 flags|NN SV* name|NULLOK SV* ver|...
-AdfTp  |SV*    |mess_nocontext |NN const char* pat|...
-AdfTp  |void   |warn_nocontext |NN const char* pat|...
-AdfTp  |void   |warner_nocontext|U32 err|NN const char* pat|...
-AdfTp  |SV*    |newSVpvf_nocontext|NN const char *const pat|...
-AdfTp  |void   |sv_catpvf_nocontext|NN SV *const sv|NN const char *const pat|...
-AdfTp  |void   |sv_setpvf_nocontext|NN SV *const sv|NN const char *const pat|...
-AdfTp  |void   |sv_catpvf_mg_nocontext|NN SV *const sv|NN const char *const pat|...
-AdfTp  |void   |sv_setpvf_mg_nocontext|NN SV *const sv|NN const char *const pat|...
-AbfTpD |int    |fprintf_nocontext|NN PerlIO *stream|NN const char *format|...
-AbfTpD |int    |printf_nocontext|NN const char *format|...
-#endif
+Rp     |bool   |cando          |Mode_t mode                            \
+                               |bool effective                         \
+                               |NN const Stat_t *statbufp
+CRTp   |I32    |cast_i32       |NV f
+CRTp   |IV     |cast_iv        |NV f
+CRTp   |U32    |cast_ulong     |NV f
+CRTp   |UV     |cast_uv        |NV f
+p      |bool   |check_utf8_print                                       \
+                               |NN const U8 *s                         \
+                               |const STRLEN len
+op     |OP *   |ck_entersub_args_core                                  \
+                               |NN OP *entersubop                      \
+                               |NN GV *namegv                          \
+                               |NN SV *protosv
+Adp    |OP *   |ck_entersub_args_list                                  \
+                               |NN OP *entersubop
+Adp    |OP *   |ck_entersub_args_proto                                 \
+                               |NN OP *entersubop                      \
+                               |NN GV *namegv                          \
+                               |NN SV *protosv
+Adp    |OP *   |ck_entersub_args_proto_or_list                         \
+                               |NN OP *entersubop                      \
+                               |NN GV *namegv                          \
+                               |NN SV *protosv
+
+CPop   |bool   |ckwarn         |U32 w
+CPop   |bool   |ckwarn_d       |U32 w
+Adfp   |void   |ck_warner      |U32 err                                \
+                               |NN const char *pat                     \
+                               |...
+Adfp   |void   |ck_warner_d    |U32 err                                \
+                               |NN const char *pat                     \
+                               |...
+
+: Some static inline functions need predeclaration because they are used
+: inside other static inline functions.
+
+Cp     |void   |clear_defarray |NN AV *av                              \
+                               |bool abandon
+p      |const COP *|closest_cop|NN const COP *cop                      \
+                               |NULLOK const OP *o                     \
+                               |NULLOK const OP *curop                 \
+                               |bool opnext
+Rp     |OP *   |cmpchain_extend|I32 type                               \
+                               |NN OP *ch                              \
+                               |NULLOK OP *right
+Rp     |OP *   |cmpchain_finish|NN OP *ch
+Rp     |OP *   |cmpchain_start |I32 type                               \
+                               |NULLOK OP *left                        \
+                               |NULLOK OP *right
+ERTXp  |const char *|cntrl_to_mnemonic                                 \
+                               |const U8 c
+Adpx   |const char *|cop_fetch_label                                   \
+                               |NN COP * const cop                     \
+                               |NULLOK STRLEN *len                     \
+                               |NULLOK U32 *flags
+: Only used  in op.c and the perl compiler
+Adpx   |void   |cop_store_label|NN COP * const cop                     \
+                               |NN const char *label                   \
+                               |STRLEN len                             \
+                               |U32 flags
 : Used in pp.c
-pd     |SV *   |core_prototype |NULLOK SV *sv|NN const char *name \
-                               |const int code|NULLOK int * const opnum
+dp     |SV *   |core_prototype |NULLOK SV *sv                          \
+                               |NN const char *name                    \
+                               |const int code                         \
+                               |NULLOK int * const opnum
 : Used in gv.c
-p      |OP *   |coresub_op     |NN SV *const coreargssv|const int code \
+p      |OP *   |coresub_op     |NN SV * const coreargssv               \
+                               |const int code                         \
                                |const int opnum
+: Used in op.c and perl.c
+px     |void   |create_eval_scope                                      \
+                               |NULLOK OP *retop                       \
+                               |U32 flags
+: croak()'s first parm can be NULL.  Otherwise, mod_perl breaks.
+Adfpr  |void   |croak          |NULLOK const char *pat                 \
+                               |...
+Tfpr   |void   |croak_caller   |NULLOK const char *pat                 \
+                               |...
+CTrs   |void   |croak_memory_wrap
+Tpr    |void   |croak_no_mem
+ATdpr  |void   |croak_no_modify
+TXpr   |void   |croak_popstack
+Adpr   |void   |croak_sv       |NN SV *baseex
+ATdpr  |void   |croak_xs_usage |NN const CV * const cv                 \
+                               |NN const char * const params
+CTp    |Signal_t|csighandler1  |int sig
+CTp    |Signal_t|csighandler3  |int sig                                \
+                               |NULLOK Siginfo_t *info                 \
+                               |NULLOK void *uap
+EXp    |regexp_engine const *|current_re_engine
+RXp    |XOPRETANY|custom_op_get_field                                  \
+                               |NN const OP *o                         \
+                               |const xop_flags_enum field
+Adop   |void   |custom_op_register                                     \
+                               |NN Perl_ppaddr_t ppaddr                \
+                               |NN const XOP *xop
 : Used in sv.c
-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
-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
-pd     |void   |cv_forget_slab |NULLOK CV *cv
-Cp     |void   |cx_dump        |NN PERL_CONTEXT* cx
-AiMpd  |GV *   |CvGV           |NN CV *sv
-AdiMTp |I32 *  |CvDEPTH        |NN const CV * const sv
-Aphd   |SV*    |filter_add     |NULLOK filter_t funcp|NULLOK SV* datasv
-Apd    |void   |filter_del     |NN filter_t funcp
-ApRhd  |I32    |filter_read    |int idx|NN SV *buf_sv|int maxlen
-ApPRx  |char** |get_op_descs
-ApPRx  |char** |get_op_names
-: FIXME discussion on p5p
-pPR    |const char*    |get_no_modify
-: FIXME discussion on p5p
-pPRx   |U32*   |get_opargs
-CpPRx  |PPADDR_t*|get_ppaddr
+EXpx   |void   |cv_ckproto_len_flags                                   \
+                               |NN const CV *cv                        \
+                               |NULLOK const GV *gv                    \
+                               |NULLOK const char *p                   \
+                               |const STRLEN len                       \
+                               |const U32 flags
+Adp    |CV *   |cv_clone       |NN CV *proto
+p      |CV *   |cv_clone_into  |NN CV *proto                           \
+                               |NN CV *target
+ARTdp  |SV *   |cv_const_sv    |NULLOK const CV * const cv
+RTp    |SV *   |cv_const_sv_or_av                                      \
+                               |NULLOK const CV * const cv
+AMTdip |I32 *  |CvDEPTH        |NN const CV * const sv
+dp     |void   |cv_forget_slab |NULLOK CV *cv
+Adp    |void   |cv_get_call_checker                                    \
+                               |NN CV *cv                              \
+                               |NN Perl_call_checker *ckfun_p          \
+                               |NN SV **ckobj_p
+Adp    |void   |cv_get_call_checker_flags                              \
+                               |NN CV *cv                              \
+                               |U32 gflags                             \
+                               |NN Perl_call_checker *ckfun_p          \
+                               |NN SV **ckobj_p                        \
+                               |NN U32 *ckflags_p
+AMdip  |GV *   |CvGV           |NN CV *sv
+Xop    |GV *   |cvgv_from_hek  |NN CV *cv
+Xp     |void   |cvgv_set       |NN CV *cv                              \
+                               |NULLOK GV *gv
+Adp    |SV *   |cv_name        |NN CV *cv                              \
+                               |NULLOK SV *sv                          \
+                               |U32 flags
+Adp    |void   |cv_set_call_checker                                    \
+                               |NN CV *cv                              \
+                               |NN Perl_call_checker ckfun             \
+                               |NN SV *ckobj
+Adp    |void   |cv_set_call_checker_flags                              \
+                               |NN CV *cv                              \
+                               |NN Perl_call_checker ckfun             \
+                               |NN SV *ckobj                           \
+                               |U32 ckflags
+Xp     |void   |cvstash_set    |NN CV *cv                              \
+                               |NULLOK HV *stash
+Adp    |void   |cv_undef       |NN CV *cv
+p      |void   |cv_undef_flags |NN CV *cv                              \
+                               |U32 flags
+Cp     |void   |cx_dump        |NN PERL_CONTEXT *cx
 : Used by CXINC, which appears to be in widespread use
-CpR    |I32    |cxinc
-Afpd   |void   |deb            |NN const char* pat|...
-Apd    |void   |vdeb           |NN const char* pat|NULLOK va_list* args
-Cpd    |void   |debprofdump
-EXp    |SV*    |multideref_stringify   |NN const OP* o|NULLOK CV *cv
-EXp    |SV*    |multiconcat_stringify  |NN const OP* o
-Cpd    |I32    |debop          |NN const OP* o
-Apd    |I32    |debstack
+CRp    |I32    |cxinc
+Adfp   |void   |deb            |NN const char *pat                     \
+                               |...
+Cdp    |I32    |debop          |NN const OP *o
+Cdp    |void   |debprofdump
+Adp    |I32    |debstack
+
+: Only used in dump.c
+p      |void   |deb_stack_all
 Cp     |I32    |debstackptrs
-pR     |SV *   |defelem_target |NN SV *sv|NULLOK MAGIC *mg
-ATpd   |char*  |delimcpy|NN char* to|NN const char* to_end             \
-                        |NN const char* from|NN const char* from_end   \
-                        |const int delim|NN I32* retlen
-EXTpd  |char*  |delimcpy_no_escape|NN char* to|NN const char* to_end   \
-                                  |NN const char* from                 \
-                                  |NN const char* from_end             \
-                                  |const int delim|NN I32* retlen
+p      |void   |debug_hash_seed|bool via_debug_h
+Rp     |SV *   |defelem_target |NN SV *sv                              \
+                               |NULLOK MAGIC *mg
 : Used in op.c, perl.c
 px     |void   |delete_eval_scope
-Aprd   |OP*    |die_sv         |NN SV *baseex
-Afrpd  |OP*    |die            |NULLOK const char* pat|...
+ATdp   |char * |delimcpy       |NN char *to                            \
+                               |NN const char *to_end                  \
+                               |NN const char *from                    \
+                               |NN const char *from_end                \
+                               |const int delim                        \
+                               |NN I32 *retlen
+ETXdp  |char * |delimcpy_no_escape                                     \
+                               |NN char *to                            \
+                               |NN const char *to_end                  \
+                               |NN const char *from                    \
+                               |NN const char *from_end                \
+                               |const int delim                        \
+                               |NN I32 *retlen
+Cp     |void   |despatch_signals
+Adfpr  |OP *   |die            |NULLOK const char *pat                 \
+                               |...
+Adpr   |OP *   |die_sv         |NN SV *baseex
 : Used in util.c
-pr     |void   |die_unwind     |NN SV* msv
-Cpdh   |void   |dounwind       |I32 cxix
+pr     |void   |die_unwind     |NN SV *msv
 : FIXME
-pMb    |bool|do_aexec  |NULLOK SV* really|NN SV** mark|NN SV** sp
+Mbp    |bool   |do_aexec       |NULLOK SV *really                      \
+                               |NN SV **mark                           \
+                               |NN SV **sp
 : Used in pp_sys.c
-p      |bool|do_aexec5 |NULLOK SV* really|NN SV** mark|NN SV** sp|int fd|int do_report
-AbpD   |int    |do_binmode     |NN PerlIO *fp|int iotype|int mode
+p      |bool   |do_aexec5      |NULLOK SV *really                      \
+                               |NN SV **mark                           \
+                               |NN SV **sp                             \
+                               |int fd                                 \
+                               |int do_report
 : Used in pp.c
-Ap     |bool   |do_close       |NULLOK GV* gv|bool not_implicit
+Adp    |bool   |do_close       |NULLOK GV *gv                          \
+                               |bool is_explicit
+dp     |void   |do_dump_pad    |I32 level                              \
+                               |NN PerlIO *file                        \
+                               |NULLOK PADLIST *padlist                \
+                               |int full
 : Defined in doio.c, used only in pp_sys.c
-p      |bool   |do_eof         |NN GV* gv
-
-#ifdef PERL_DEFAULT_DO_EXEC3_IMPLEMENTATION
-pM     |bool|do_exec   |NN const char* cmd
-#else
-p      |bool|do_exec   |NN const char* cmd
-#endif
+p      |bool   |do_eof         |NN GV *gv
+: Used in perly.y
+p      |OP *   |dofile         |NN OP *term                            \
+                               |I32 force_builtin
+Cp     |void   |do_gv_dump     |I32 level                              \
+                               |NN PerlIO *file                        \
+                               |NN const char *name                    \
+                               |NULLOK GV *sv
+Cp     |void   |do_gvgv_dump   |I32 level                              \
+                               |NN PerlIO *file                        \
+                               |NN const char *name                    \
+                               |NULLOK GV *sv
+Cp     |void   |do_hv_dump     |I32 level                              \
+                               |NN PerlIO *file                        \
+                               |NN const char *name                    \
+                               |NULLOK HV *sv
+CRTp   |bool   |doing_taint    |int argc                               \
+                               |NULLOK char **argv                     \
+                               |NULLOK char **env
 
-#if defined(WIN32) || defined(VMS)
-Cp     |int    |do_aspawn      |NULLOK SV* really|NN SV** mark|NN SV** sp
-Cp     |int    |do_spawn       |NN char* cmd
-Cp     |int    |do_spawn_nowait|NN char* cmd
-#endif
-#if !defined(WIN32)
-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
-#endif
-#if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
-: Defined in doio.c, used only in pp_sys.c
-p      |I32    |do_ipcctl      |I32 optype|NN SV** mark|NN SV** sp
-: Defined in doio.c, used only in pp_sys.c
-p      |I32    |do_ipcget      |I32 optype|NN SV** mark|NN SV** sp
-: Defined in doio.c, used only in pp_sys.c
-p      |I32    |do_msgrcv      |NN SV** mark|NN SV** sp
-: Defined in doio.c, used only in pp_sys.c
-p      |I32    |do_msgsnd      |NN SV** mark|NN SV** sp
-: Defined in doio.c, used only in pp_sys.c
-p      |I32    |do_semop       |NN SV** mark|NN SV** sp
-: Defined in doio.c, used only in pp_sys.c
-p      |I32    |do_shmio       |I32 optype|NN SV** mark|NN SV** sp
-#endif
-Apd    |void   |do_join        |NN SV *sv|NN SV *delim|NN SV **mark|NN SV **sp
+Adp    |void   |do_join        |NN SV *sv                              \
+                               |NN SV *delim                           \
+                               |NN SV **mark                           \
+                               |NN SV **sp
+Cp     |void   |do_magic_dump  |I32 level                              \
+                               |NN PerlIO *file                        \
+                               |NULLOK const MAGIC *mg                 \
+                               |I32 nest                               \
+                               |I32 maxnest                            \
+                               |bool dumpops                           \
+                               |STRLEN pvlim
 : Used in pp.c and pp_hot.c, prototype generated by regen/opcode.pl
 : p    |OP*    |do_kv
 : used in pp.c, pp_hot.c
-pR     |I32    |do_ncmp        |NN SV *const left|NN SV *const right
-ApMb   |bool   |do_open        |NN GV* gv|NN const char* name|I32 len|int as_raw \
-                               |int rawmode|int rawperm|NULLOK PerlIO* supplied_fp
-AbpD   |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
-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
-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
-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
-#ifdef HAS_SOCKET
-pR     |int    |PerlSock_socket_cloexec|int domain|int type|int protocol
-pR     |int    |PerlSock_accept_cloexec|int listenfd \
-                               |NULLOK struct sockaddr *addr \
-                               |NULLOK Sock_size_t *addrlen
-#endif
-#if defined (HAS_SOCKETPAIR) || \
-    (defined (HAS_SOCKET) && defined(SOCK_DGRAM) && \
-       defined(AF_INET) && defined(PF_INET))
-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 \
-                               |NN PerlIO **saveofp|NN int *savefd \
-                                |NN char *savetype
-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 \
-                                |bool was_fdopen|NULLOK const char *type \
-                                |NULLOK Stat_t *statbufp
-#endif
-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
-xp     |bool   |do_open_raw    |NN GV *gv|NN const char *oname|STRLEN len \
-                               |int rawmode|int rawperm|NULLOK Stat_t *statbufp
-xp     |bool   |do_open6       |NN GV *gv|NN const char *oname|STRLEN len \
-                               |NULLOK PerlIO *supplied_fp|NULLOK SV **svp \
+Rp     |I32    |do_ncmp        |NN SV * const left                     \
+                               |NN SV * const right
+Cp     |void   |do_op_dump     |I32 level                              \
+                               |NN PerlIO *file                        \
+                               |NULLOK const OP *o
+AMbp   |bool   |do_open        |NN GV *gv                              \
+                               |NN const char *name                    \
+                               |I32 len                                \
+                               |int as_raw                             \
+                               |int rawmode                            \
+                               |int rawperm                            \
+                               |NULLOK PerlIO *supplied_fp
+px     |bool   |do_open6       |NN GV *gv                              \
+                               |NN const char *oname                   \
+                               |STRLEN len                             \
+                               |NULLOK PerlIO *supplied_fp             \
+                               |NULLOK SV **svp                        \
                                |U32 num
+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
+px     |bool   |do_open_raw    |NN GV *gv                              \
+                               |NN const char *oname                   \
+                               |STRLEN len                             \
+                               |int rawmode                            \
+                               |int rawperm                            \
+                               |NULLOK Stat_t *statbufp
+Cp     |void   |do_pmop_dump   |I32 level                              \
+                               |NN PerlIO *file                        \
+                               |NULLOK const PMOP *pm
 : Used in pp_hot.c and pp_sys.c
-p      |bool   |do_print       |NULLOK SV* sv|NN PerlIO* fp
+p      |bool   |do_print       |NULLOK SV *sv                          \
+                               |NN PerlIO *fp
 : Used in pp_sys.c
-pR     |OP*    |do_readline
+Rp     |OP *   |do_readline
+Cp     |OP *   |doref          |NN OP *o                               \
+                               |I32 type                               \
+                               |bool set_op_ref
 : Defined in doio.c, used only in pp_sys.c
-p      |bool   |do_seek        |NULLOK GV* gv|Off_t pos|int whence
-Apd    |void   |do_sprintf     |NN SV* sv|SSize_t len|NN SV** sarg
+p      |bool   |do_seek        |NULLOK GV *gv                          \
+                               |Off_t pos                              \
+                               |int whence
+Adp    |void   |do_sprintf     |NN SV *sv                              \
+                               |SSize_t len                            \
+                               |NN SV **sarg
+Cp     |void   |do_sv_dump     |I32 level                              \
+                               |NN PerlIO *file                        \
+                               |NULLOK SV *sv                          \
+                               |I32 nest                               \
+                               |I32 maxnest                            \
+                               |bool dumpops                           \
+                               |STRLEN pvlim
 : Defined in doio.c, used only in pp_sys.c
-p      |Off_t  |do_sysseek     |NN GV* gv|Off_t pos|int whence
+p      |Off_t  |do_sysseek     |NN GV *gv                              \
+                               |Off_t pos                              \
+                               |int whence
 : Defined in doio.c, used only in pp_sys.c
-pR     |Off_t  |do_tell        |NN GV* gv
+Rp     |Off_t  |do_tell        |NN GV *gv
 : Defined in doop.c, used only in pp.c
-p      |Size_t |do_trans       |NN SV* sv
+p      |Size_t |do_trans       |NN SV *sv
+ERTXp  |I16    |do_uniprop_match                                       \
+                               |NN const char * const key              \
+                               |const U16 key_len
+Cdhp   |void   |dounwind       |I32 cxix
 : Used in my.c and pp.c
-p      |UV     |do_vecget      |NN SV* sv|STRLEN offset|int size
+p      |UV     |do_vecget      |NN SV *sv                              \
+                               |STRLEN offset                          \
+                               |int size
 : Defined in doop.c, used only in mg.c (with /* XXX slurp this routine */)
-p      |void   |do_vecset      |NN SVsv
+p      |void   |do_vecset      |NN SV *sv
 : Defined in doop.c, used only in pp.c
-p      |void   |do_vop         |I32 optype|NN SV* sv|NN SV* left|NN SV* right
-: Used in perly.y
-p      |OP*    |dofile         |NN OP* term|I32 force_builtin
-CdpR   |U8     |dowantarray
+p      |void   |do_vop         |I32 optype                             \
+                               |NN SV *sv                              \
+                               |NN SV *left                            \
+                               |NN SV *right
+CDRdp  |U8     |dowantarray
+TXop   |void   |drand48_init_r |NN perl_drand48_t *random_state        \
+                               |U32 seed
+TXop   |double |drand48_r      |NN perl_drand48_t *random_state
 Adp    |void   |dump_all
 p      |void   |dump_all_perl  |bool justperl
-Apdh   |void   |dump_eval
-Apd    |void   |dump_form      |NN const GV* gv
-Apd    |void   |gv_dump        |NULLOK GV* gv
-Apd    |OPclass|op_class       |NULLOK const OP *o
-Apd    |void   |op_dump        |NN const OP *o
-Apd    |void   |pmop_dump      |NULLOK PMOP* pm
-Apd    |void   |dump_packsubs  |NN const HV* stash
-p      |void   |dump_packsubs_perl     |NN const HV* stash|bool justperl
-Apdh   |void   |dump_sub       |NN const GV* gv
-p      |void   |dump_sub_perl  |NN const GV* gv|bool justperl
-Apd    |void   |fbm_compile    |NN SV* sv|U32 flags
-ApdR   |char*  |fbm_instr      |NN unsigned char* big|NN unsigned char* bigend \
-                               |NN SV* littlestr|U32 flags
-pEXTR  |const char *|cntrl_to_mnemonic|const U8 c
+Adhp   |void   |dump_eval
+Adp    |void   |dump_form      |NN const GV *gv
+Cfp    |void   |dump_indent    |I32 level                              \
+                               |NN PerlIO *file                        \
+                               |NN const char *pat                     \
+                               |...
+Adp    |void   |dump_packsubs  |NN const HV *stash
+p      |void   |dump_packsubs_perl                                     \
+                               |NN const HV *stash                     \
+                               |bool justperl
+Adhp   |void   |dump_sub       |NN const GV *gv
+p      |void   |dump_sub_perl  |NN const GV *gv                        \
+                               |bool justperl
+Cp     |void   |dump_vindent   |I32 level                              \
+                               |NN PerlIO *file                        \
+                               |NN const char *pat                     \
+                               |NULLOK va_list *args
+
+EXop   |char  *|dup_warnings   |NULLOK char *warnings
+
+: Used by B
+EXopx  |void   |emulate_cop_io |NN const COP * const c                 \
+                               |NN SV * const sv
+AOdp   |SV *   |eval_pv        |NN const char *p                       \
+                               |I32 croak_on_error
+AOdp   |I32    |eval_sv        |NN SV *sv                              \
+                               |I32 flags
+Adp    |void   |fbm_compile    |NN SV *sv                              \
+                               |U32 flags
+ARdp   |char * |fbm_instr      |NN unsigned char *big                  \
+                               |NN unsigned char *bigend               \
+                               |NN SV *littlestr                       \
+                               |U32 flags
+Adhp   |SV *   |filter_add     |NULLOK filter_t funcp                  \
+                               |NULLOK SV *datasv
+Adp    |void   |filter_del     |NN filter_t funcp
+ARdhp  |I32    |filter_read    |int idx                                \
+                               |NN SV *buf_sv                          \
+                               |int maxlen
 p      |CV *   |find_lexical_cv|PADOFFSET off
+
+ARdp   |CV *   |find_runcv     |NULLOK U32 *db_seqp
+Rp     |CV *   |find_runcv_where                                       \
+                               |U8 cond                                \
+                               |IV arg                                 \
+                               |NULLOK U32 *db_seqp
+Adp    |SV *   |find_rundefsv
 : Defined in util.c, used only in perl.c
-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
-i      |OP*    |op_integerize  |NN OP *o
-i      |OP*    |op_std_init    |NN OP *o
-#if defined(USE_ITHREADS)
-i      |void   |op_relocate_sv |NN SV** svp|NN PADOFFSET* targp
-#endif
-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
-Sd     |OP*    |traverse_op_tree|NN OP* top|NN OP* o
-#endif
-Afpd   |char*  |form           |NN const char* pat|...
-Adp    |char*  |vform          |NN const char* pat|NULLOK va_list* args
+p      |char * |find_script    |NN const char *scriptname                      \
+                               |bool dosearch                                  \
+                               |NULLOK const char * const * const search_ext   \
+                               |I32 flags
+Adip   |I32    |foldEQ         |NN const char *a                       \
+                               |NN const char *b                       \
+                               |I32 len
+Cip    |I32    |foldEQ_latin1  |NN const char *a                       \
+                               |NN const char *b                       \
+                               |I32 len
+Adip   |I32    |foldEQ_locale  |NN const char *a                       \
+                               |NN const char *b                       \
+                               |I32 len
+Adm    |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
+Cp     |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
+Adpx   |void   |forbid_outofblock_ops                                  \
+                               |NN OP *o                               \
+                               |NN const char *blockname
+Tp     |void   |force_locale_unlock
+Cp     |void   |_force_out_malformed_utf8_message                      \
+                               |NN const U8 * const p                  \
+                               |NN const U8 * const e                  \
+                               |const U32 flags                        \
+                               |const bool die_here
+Adfp   |char * |form           |NN const char *pat                     \
+                               |...
+: Only used in perl.c
+p      |void   |free_tied_hv_pool
 Cp     |void   |free_tmps
-#if defined(PERL_IN_OP_C)
-S      |void   |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
+ERXp   |SV *   |get_and_check_backslash_N_name                         \
+                               |NN const char *s                       \
+                               |NN const char *e                       \
+                               |const bool is_utf8                     \
+                               |NN const char **error_msg
+AOdp   |AV *   |get_av         |NN const char *name                    \
+                               |I32 flags
+AOdp   |CV *   |get_cv         |NN const char *name                    \
+                               |I32 flags
+Adp    |CV *   |get_cvn_flags  |NN const char *name                    \
+                               |STRLEN len                             \
+                               |I32 flags
+Adp    |int    |getcwd_sv      |NN SV *sv
 : Used in pp_ctl.c and pp_hot.c
-poe    |void   |get_db_sub     |NULLOK SV **svp|NN CV *cv
-Cp     |void   |gp_free        |NULLOK GV* gv
-Cp     |GP*    |gp_ref         |NULLOK GP* gp
-Apd    |GV*    |gv_add_by_type |NULLOK GV *gv|svtype type
-ApdMb  |GV*    |gv_AVadd       |NULLOK GV *gv
-ApdMb  |GV*    |gv_HVadd       |NULLOK GV *gv
-ApdMb  |GV*    |gv_IOadd       |NULLOK GV* gv
-AdmR   |GV*    |gv_autoload4   |NULLOK HV* stash|NN const char* name \
-                               |STRLEN len|I32 method
-ApR    |GV*    |gv_autoload_sv |NULLOK HV* stash|NN SV* namesv|U32 flags
-ApR    |GV*    |gv_autoload_pv |NULLOK HV* stash|NN const char* namepv \
-                                |U32 flags
-ApR    |GV*    |gv_autoload_pvn        |NULLOK HV* stash|NN const char* name \
-                                        |STRLEN len|U32 flags
-Cp     |void   |gv_check       |NN HV* stash
-AbpD   |void   |gv_efullname   |NN SV* sv|NN const GV* gv
-ApdMb  |void   |gv_efullname3  |NN SV* sv|NN const GV* gv|NULLOK const char* prefix
-Apd    |void   |gv_efullname4  |NN SV* sv|NN const GV* gv|NULLOK const char* prefix|bool keepmain
-Adp    |GV*    |gv_fetchfile   |NN const char* name
-Adp    |GV*    |gv_fetchfile_flags|NN const char *const name|const STRLEN len\
+eop    |void   |get_db_sub     |NULLOK SV **svp                        \
+                               |NN CV *cv
+ERTXp  |const char *|get_deprecated_property_msg                       \
+                               |const Size_t warning_offset
+: Used in mg.c
+Tp     |int    |get_extended_os_errno
+: Only used in perl.c
+p      |void   |get_hash_seed  |NN unsigned char * const seed_buffer
+AOdp   |HV *   |get_hv         |NN const char *name                    \
+                               |I32 flags
+DPRp   |const char *|get_no_modify
+DPRp   |U32 *  |get_opargs
+ADPRdp |char **|get_op_descs
+ADPRdp |char **|get_op_names
+CDPRp  |PPADDR_t *|get_ppaddr
+ERXp   |SV *   |get_prop_definition                                    \
+                               |const int table_index
+ERTXp  |const char * const *|get_prop_values                           \
+                               |const int table_index
+: Used by SvRX and SvRXOK
+EXopx  |REGEXP *|get_re_arg    |NULLOK SV *sv
+AOdp   |SV *   |get_sv         |NN const char *name                    \
+                               |I32 flags
+CRipx  |MGVTBL *|get_vtbl      |int vtbl_id
+Cp     |void   |gp_free        |NULLOK GV *gv
+Cp     |GP *   |gp_ref         |NULLOK GP *gp
+ATdp   |bool   |grok_atoUV     |NN const char *pv                      \
+                               |NN UV *valptr                          \
+                               |NULLOK const char **endptr
+AMdp   |UV     |grok_bin       |NN const char *start                   \
+                               |NN STRLEN *len_p                       \
+                               |NN I32 *flags                          \
+                               |NULLOK NV *result
+Cp     |UV     |grok_bin_oct_hex                                       \
+                               |NN const char *start                   \
+                               |NN STRLEN *len_p                       \
+                               |NN I32 *flags                          \
+                               |NULLOK NV *result                      \
+                               |const unsigned shift                   \
+                               |const U8 lookup_bit                    \
+                               |const char prefix
+AMdp   |UV     |grok_hex       |NN const char *start                   \
+                               |NN STRLEN *len_p                       \
+                               |NN I32 *flags                          \
+                               |NULLOK NV *result
+Adp    |int    |grok_infnan    |NN const char **sp                     \
+                               |NN const char *send
+Adp    |int    |grok_number    |NN const char *pv                      \
+                               |STRLEN len                             \
+                               |NULLOK UV *valuep
+Adp    |int    |grok_number_flags                                      \
+                               |NN const char *pv                      \
+                               |STRLEN len                             \
+                               |NULLOK UV *valuep                      \
+                               |U32 flags
+ARdp   |bool   |grok_numeric_radix                                     \
+                               |NN const char **sp                     \
+                               |NN const char *send
+AMdp   |UV     |grok_oct       |NN const char *start                   \
+                               |NN STRLEN *len_p                       \
+                               |NN I32 *flags                          \
+                               |NULLOK NV *result
+Adp    |GV *   |gv_add_by_type |NULLOK GV *gv                          \
+                               |svtype type
+Adp    |int    |Gv_AMupdate    |NN HV *stash                           \
+                               |bool destructing
+ARdm   |GV *   |gv_autoload4   |NULLOK HV *stash                       \
+                               |NN const char *name                    \
+                               |STRLEN len                             \
+                               |I32 method
+ARdp   |GV *   |gv_autoload_pv |NULLOK HV *stash                       \
+                               |NN const char *namepv                  \
+                               |U32 flags
+ARdp   |GV *   |gv_autoload_pvn|NULLOK HV *stash                       \
+                               |NN const char *name                    \
+                               |STRLEN len                             \
+                               |U32 flags
+ARdp   |GV *   |gv_autoload_sv |NULLOK HV *stash                       \
+                               |NN SV *namesv                          \
+                               |U32 flags
+AMbdp  |GV *   |gv_AVadd       |NULLOK GV *gv
+Cp     |void   |gv_check       |NN HV *stash
+: Used in pp.c and pp_sys.c
+ARdp   |SV *   |gv_const_sv    |NN GV *gv
+Adp    |void   |gv_dump        |NULLOK GV *gv
+AMbdp  |void   |gv_efullname3  |NN SV *sv                              \
+                               |NN const GV *gv                        \
+                               |NULLOK const char *prefix
+Adp    |void   |gv_efullname4  |NN SV *sv                              \
+                               |NN const GV *gv                        \
+                               |NULLOK const char *prefix              \
+                               |bool keepmain
+Adp    |GV *   |gv_fetchfile   |NN const char *name
+Adp    |GV *   |gv_fetchfile_flags                                     \
+                               |NN const char * const name             \
+                               |const STRLEN len                       \
                                |const U32 flags
-Amd    |GV*    |gv_fetchmeth   |NULLOK HV* stash|NN const char* name \
-                               |STRLEN len|I32 level
-Apd    |GV*    |gv_fetchmeth_sv        |NULLOK HV* stash|NN SV* namesv|I32 level|U32 flags
-Apd    |GV*    |gv_fetchmeth_pv        |NULLOK HV* stash|NN const char* name \
-                                        |I32 level|U32 flags
-Apd    |GV*    |gv_fetchmeth_pvn       |NULLOK HV* stash|NN const char* name \
-                                        |STRLEN len|I32 level|U32 flags
-Amd    |GV*    |gv_fetchmeth_autoload  |NULLOK HV* stash \
-                                       |NN const char* name|STRLEN len \
-                                       |I32 level
-Apd    |GV*    |gv_fetchmeth_sv_autoload       |NULLOK HV* stash|NN SV* namesv|I32 level|U32 flags
-Apd    |GV*    |gv_fetchmeth_pv_autoload       |NULLOK HV* stash|NN const char* name \
-                                        |I32 level|U32 flags
-Apd    |GV*    |gv_fetchmeth_pvn_autoload      |NULLOK HV* stash|NN const char* name \
-                                        |STRLEN len|I32 level|U32 flags
-ApdMb  |GV*    |gv_fetchmethod |NN HV* stash|NN const char* name
-Apd    |GV*    |gv_fetchmethod_autoload|NN HV* stash|NN const char* name \
+Adm    |GV *   |gv_fetchmeth   |NULLOK HV *stash                       \
+                               |NN const char *name                    \
+                               |STRLEN len                             \
+                               |I32 level
+Adm    |GV *   |gv_fetchmeth_autoload                                  \
+                               |NULLOK HV *stash                       \
+                               |NN const char *name                    \
+                               |STRLEN len                             \
+                               |I32 level
+AMbdp  |GV *   |gv_fetchmethod |NN HV *stash                           \
+                               |NN const char *name
+Adp    |GV *   |gv_fetchmethod_autoload                                \
+                               |NN HV *stash                           \
+                               |NN const char *name                    \
                                |I32 autoload
-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
-Apx    |GV*    |gv_fetchmethod_pvn_flags|NN HV* stash|NN const char* name \
-                               |const STRLEN len|U32 flags
-Adp    |GV*    |gv_fetchpv     |NN const char *nambeg|I32 flags|const svtype sv_type
-AbpD   |void   |gv_fullname    |NN SV* sv|NN const GV* gv
-ApdMb  |void   |gv_fullname3   |NN SV* sv|NN const GV* gv|NULLOK const char* prefix
-Apd    |void   |gv_fullname4   |NN SV* sv|NN const GV* gv|NULLOK const char* prefix|bool keepmain
-: Used in scope.c
-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
-Amd    |void   |gv_init        |NN GV* gv|NULLOK HV* stash \
-                                |NN const char* name|STRLEN len|int multi
-Apd    |void   |gv_init_sv     |NN GV* gv|NULLOK HV* stash|NN SV* namesv|U32 flags
-Apd    |void   |gv_init_pv     |NN GV* gv|NULLOK HV* stash|NN const char* name \
-                                |U32 flags
-Apd    |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
-pe     |GV *   |gv_override    |NN const char * const name \
+Apx    |GV *   |gv_fetchmethod_pv_flags                                \
+                               |NN HV *stash                           \
+                               |NN const char *name                    \
+                               |U32 flags
+Apx    |GV *   |gv_fetchmethod_pvn_flags                               \
+                               |NN HV *stash                           \
+                               |NN const char *name                    \
+                               |const STRLEN len                       \
+                               |U32 flags
+Apx    |GV *   |gv_fetchmethod_sv_flags                                \
+                               |NN HV *stash                           \
+                               |NN SV *namesv                          \
+                               |U32 flags
+Adp    |GV *   |gv_fetchmeth_pv|NULLOK HV *stash                       \
+                               |NN const char *name                    \
+                               |I32 level                              \
+                               |U32 flags
+Adp    |GV *   |gv_fetchmeth_pv_autoload                               \
+                               |NULLOK HV *stash                       \
+                               |NN const char *name                    \
+                               |I32 level                              \
+                               |U32 flags
+Adp    |GV *   |gv_fetchmeth_pvn                                       \
+                               |NULLOK HV *stash                       \
+                               |NN const char *name                    \
+                               |STRLEN len                             \
+                               |I32 level                              \
+                               |U32 flags
+Adp    |GV *   |gv_fetchmeth_pvn_autoload                              \
+                               |NULLOK HV *stash                       \
+                               |NN const char *name                    \
+                               |STRLEN len                             \
+                               |I32 level                              \
+                               |U32 flags
+Adp    |GV *   |gv_fetchmeth_sv|NULLOK HV *stash                       \
+                               |NN SV *namesv                          \
+                               |I32 level                              \
+                               |U32 flags
+Adp    |GV *   |gv_fetchmeth_sv_autoload                               \
+                               |NULLOK HV *stash                       \
+                               |NN SV *namesv                          \
+                               |I32 level                              \
+                               |U32 flags
+Adp    |GV *   |gv_fetchpv     |NN const char *nambeg                  \
+                               |I32 flags                              \
+                               |const svtype sv_type
+
+Adp    |GV *   |gv_fetchpvn_flags                                      \
+                               |NN const char *name                    \
+                               |STRLEN len                             \
+                               |I32 flags                              \
+                               |const svtype sv_type
+Adp    |GV *   |gv_fetchsv     |NN SV *name                            \
+                               |I32 flags                              \
+                               |const svtype sv_type
+AMbdp  |void   |gv_fullname3   |NN SV *sv                              \
+                               |NN const GV *gv                        \
+                               |NULLOK const char *prefix
+Adp    |void   |gv_fullname4   |NN SV *sv                              \
+                               |NN const GV *gv                        \
+                               |NULLOK const char *prefix              \
+                               |bool keepmain
+CRdp   |CV *   |gv_handler     |NULLOK HV *stash                       \
+                               |I32 id
+AMbdp  |GV *   |gv_HVadd       |NULLOK GV *gv
+Adm    |void   |gv_init        |NN GV *gv                              \
+                               |NULLOK HV *stash                       \
+                               |NN const char *name                    \
+                               |STRLEN len                             \
+                               |int multi
+Adp    |void   |gv_init_pv     |NN GV *gv                              \
+                               |NULLOK HV *stash                       \
+                               |NN const char *name                    \
+                               |U32 flags
+Adp    |void   |gv_init_pvn    |NN GV *gv                              \
+                               |NULLOK HV *stash                       \
+                               |NN const char *name                    \
+                               |STRLEN len                             \
+                               |U32 flags
+Adp    |void   |gv_init_sv     |NN GV *gv                              \
+                               |NULLOK HV *stash                       \
+                               |NN SV *namesv                          \
+                               |U32 flags
+AMbdp  |GV *   |gv_IOadd       |NULLOK GV *gv
+Adp    |void   |gv_name_set    |NN GV *gv                              \
+                               |NN const char *name                    \
+                               |U32 len                                \
+                               |U32 flags
+ep     |GV *   |gv_override    |NN const char * const name             \
                                |const STRLEN len
-Xxpd   |void   |gv_try_downgrade|NN GV* gv
-p      |void   |gv_setref      |NN SV *const dsv|NN SV *const ssv
-Apd    |HV*    |gv_stashpv     |NN const char* name|I32 flags
-Apd    |HV*    |gv_stashpvn    |NN const char* name|U32 namelen|I32 flags
-#if defined(PERL_IN_GV_C) || defined(PERL_IN_UNIVERSAL_C)
-EpGd   |HV*    |gv_stashsvpvn_cached|SV *namesv|const char* name|U32 namelen|I32 flags
-#endif
-#if defined(PERL_IN_GV_C)
-i      |HV*    |gv_stashpvn_internal   |NN const char* name|U32 namelen|I32 flags
-i      |GV*    |gv_fetchmeth_internal  |NULLOK HV* stash|NULLOK SV* meth|NULLOK const char* name \
-                                       |STRLEN len|I32 level|U32 flags
-#endif
-Apd    |HV*    |gv_stashsv     |NN SV* sv|I32 flags
-po     |struct xpvhv_aux*|hv_auxalloc|NN HV *hv
-Apd    |void   |hv_clear       |NULLOK HV *hv
+p      |void   |gv_setref      |NN SV * const dsv                      \
+                               |NN SV * const ssv
+Adp    |HV *   |gv_stashpv     |NN const char *name                    \
+                               |I32 flags
+Adp    |HV *   |gv_stashpvn    |NN const char *name                    \
+                               |U32 namelen                            \
+                               |I32 flags
+Adp    |HV *   |gv_stashsv     |NN SV *sv                              \
+                               |I32 flags
+Xdpx   |void   |gv_try_downgrade                                       \
+                               |NN GV *gv
+op     |struct xpvhv_aux *|hv_auxalloc                                 \
+                               |NN HV *hv
+: Used in dump.c and hv.c
+opx    |AV **  |hv_backreferences_p                                    \
+                               |NN HV *hv
+ARdpx  |SV *   |hv_bucket_ratio|NN HV *hv
+Adp    |void   |hv_clear       |NULLOK HV *hv
+Adp    |void   |hv_clear_placeholders                                  \
+                               |NN HV *hv
+Cp     |void * |hv_common      |NULLOK HV *hv                          \
+                               |NULLOK SV *keysv                       \
+                               |NULLOK const char *key                 \
+                               |STRLEN klen                            \
+                               |int flags                              \
+                               |int action                             \
+                               |NULLOK SV *val                         \
+                               |U32 hash
+Cp     |void * |hv_common_key_len                                      \
+                               |NULLOK HV *hv                          \
+                               |NN const char *key                     \
+                               |I32 klen_i32                           \
+                               |const int action                       \
+                               |NULLOK SV *val                         \
+                               |const U32 hash
 : used in SAVEHINTS() and op.c
-ApdR   |HV *   |hv_copy_hints_hv|NULLOK HV *const ohv
-Cp     |void   |hv_delayfree_ent|NULLOK HV *notused|NULLOK HE *entry
-AbMdp  |SV*    |hv_delete      |NULLOK HV *hv|NN const char *key|I32 klen \
+ARdp   |HV *   |hv_copy_hints_hv                                       \
+                               |NULLOK HV * const ohv
+Cp     |void   |hv_delayfree_ent                                       \
+                               |NULLOK HV *notused                     \
+                               |NULLOK HE *entry
+AMbdp  |SV *   |hv_delete      |NULLOK HV *hv                          \
+                               |NN const char *key                     \
+                               |I32 klen                               \
                                |I32 flags
-AbMdp  |SV*    |hv_delete_ent  |NULLOK HV *hv|NN SV *keysv|I32 flags|U32 hash
-AbMdRp |bool   |hv_exists      |NULLOK HV *hv|NN const char *key|I32 klen
-AbMdRp |bool   |hv_exists_ent  |NULLOK HV *hv|NN SV *keysv|U32 hash
-AbMdp  |SV**   |hv_fetch       |NULLOK HV *hv|NN const char *key|I32 klen \
+AMbdp  |SV *   |hv_delete_ent  |NULLOK HV *hv                          \
+                               |NN SV *keysv                           \
+                               |I32 flags                              \
+                               |U32 hash
+Adp    |void   |hv_dump        |NULLOK HV *hv
+CRdop  |HE **  |hv_eiter_p     |NN HV *hv
+Cdop   |void   |hv_eiter_set   |NN HV *hv                              \
+                               |NULLOK HE *eiter
+dp     |void   |hv_ename_add   |NN HV *hv                              \
+                               |NN const char *name                    \
+                               |U32 len                                \
+                               |U32 flags
+dp     |void   |hv_ename_delete|NN HV *hv                              \
+                               |NN const char *name                    \
+                               |U32 len                                \
+                               |U32 flags
+AMRbdp |bool   |hv_exists      |NULLOK HV *hv                          \
+                               |NN const char *key                     \
+                               |I32 klen
+AMRbdp |bool   |hv_exists_ent  |NULLOK HV *hv                          \
+                               |NN SV *keysv                           \
+                               |U32 hash
+AMbdp  |SV **  |hv_fetch       |NULLOK HV *hv                          \
+                               |NN const char *key                     \
+                               |I32 klen                               \
                                |I32 lval
-AbMdp  |HE*    |hv_fetch_ent   |NULLOK HV *hv|NN SV *keysv|I32 lval|U32 hash
-Cp     |void*  |hv_common      |NULLOK HV *hv|NULLOK SV *keysv \
-                               |NULLOK const char* key|STRLEN klen|int flags \
-                               |int action|NULLOK SV *val|U32 hash
-Cp     |void*  |hv_common_key_len|NULLOK HV *hv|NN const char *key \
-                               |I32 klen_i32|const int action|NULLOK SV *val \
-                               |const U32 hash
-Cpod   |STRLEN |hv_fill        |NN HV *const hv
-Ap     |void   |hv_free_ent    |NULLOK HV *notused|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
-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
-#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 \
-                               |NN const char *keypv|STRLEN keylen|U32 hash|U32 flags
-Xpd    |SV *   |refcounted_he_fetch_pv|NULLOK const struct refcounted_he *chain \
-                               |NN const char *key|U32 hash|U32 flags
-Xpd    |SV *   |refcounted_he_fetch_sv|NULLOK const struct refcounted_he *chain \
-                               |NN SV *key|U32 hash|U32 flags
-Xpd    |struct refcounted_he *|refcounted_he_new_pvn \
-                               |NULLOK struct refcounted_he *parent \
-                               |NN const char *keypv|STRLEN keylen \
-                               |U32 hash|NULLOK SV *value|U32 flags
-Xpd    |struct refcounted_he *|refcounted_he_new_pv \
-                               |NULLOK struct refcounted_he *parent \
-                               |NN const char *key \
-                               |U32 hash|NULLOK SV *value|U32 flags
-Xpd    |struct refcounted_he *|refcounted_he_new_sv \
-                               |NULLOK struct refcounted_he *parent \
-                               |NN SV *key \
-                               |U32 hash|NULLOK SV *value|U32 flags
-Xpd    |void   |refcounted_he_free|NULLOK struct refcounted_he *he
-Xpd    |struct refcounted_he *|refcounted_he_inc|NULLOK struct refcounted_he *he
-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\
+AMbdp  |HE *   |hv_fetch_ent   |NULLOK HV *hv                          \
+                               |NN SV *keysv                           \
+                               |I32 lval                               \
                                |U32 hash
-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
-AdmP   |I32    |ibcmp          |NN const char* a|NN const char* b|I32 len
-AdiTp  |I32    |foldEQ         |NN const char* a|NN const char* b|I32 len
-AdmP   |I32    |ibcmp_locale   |NN const char* a|NN const char* b|I32 len
-AiTpd  |I32    |foldEQ_locale  |NN const char* a|NN const char* b|I32 len
-Adm    |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
-Cp     |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
-CiTp   |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
-#endif
+Cdop   |STRLEN |hv_fill        |NN HV * const hv
+Cp     |void   |hv_free_ent    |NULLOK HV *notused                     \
+                               |NULLOK HE *entry
+Adp    |I32    |hv_iterinit    |NN HV *hv
+ARdp   |char * |hv_iterkey     |NN HE *entry                           \
+                               |NN I32 *retlen
+ARdp   |SV *   |hv_iterkeysv   |NN HE *entry
+AMRbdp |HE *   |hv_iternext    |NN HV *hv
+ARdpx  |HE *   |hv_iternext_flags                                      \
+                               |NN HV *hv                              \
+                               |I32 flags
+ARdp   |SV *   |hv_iternextsv  |NN HV *hv                              \
+                               |NN char **key                          \
+                               |NN I32 *retlen
+ARdp   |SV *   |hv_iterval     |NN HV *hv                              \
+                               |NN HE *entry
+Adp    |void   |hv_ksplit      |NN HV *hv                              \
+                               |IV newmax
+AMbdp  |void   |hv_magic       |NN HV *hv                              \
+                               |NULLOK GV *gv                          \
+                               |int how
+Adp    |void   |hv_name_set    |NN HV *hv                              \
+                               |NULLOK const char *name                \
+                               |U32 len                                \
+                               |U32 flags
+CRdop  |I32    |hv_placeholders_get                                    \
+                               |NN const HV *hv
+RXop   |SSize_t *|hv_placeholders_p                                    \
+                               |NN HV *hv
+Cdop   |void   |hv_placeholders_set                                    \
+                               |NN HV *hv                              \
+                               |I32 ph
+p      |void   |hv_pushkv      |NN HV *hv                              \
+                               |U32 flags
+Cp     |void   |hv_rand_set    |NN HV *hv                              \
+                               |U32 new_xhv_rand
+CRdop  |I32 *  |hv_riter_p     |NN HV *hv
+Cdop   |void   |hv_riter_set   |NN HV *hv                              \
+                               |I32 riter
+
+ARdp   |SV *   |hv_scalar      |NN HV *hv
+AMbdp  |SV **  |hv_store       |NULLOK HV *hv                          \
+                               |NULLOK const char *key                 \
+                               |I32 klen                               \
+                               |NULLOK SV *val                         \
+                               |U32 hash
+AMbdp  |HE *   |hv_store_ent   |NULLOK HV *hv                          \
+                               |NULLOK SV *key                         \
+                               |NULLOK SV *val                         \
+                               |U32 hash
+AMbpx  |SV **  |hv_store_flags |NULLOK HV *hv                          \
+                               |NULLOK const char *key                 \
+                               |I32 klen                               \
+                               |NULLOK SV *val                         \
+                               |U32 hash                               \
+                               |int flags
+Adm    |SV **  |hv_stores      |NULLOK HV *hv                          \
+                               |"key"                                  \
+                               |NULLOK SV *val
+Adm    |void   |hv_undef       |NULLOK HV *hv
+Xop    |void   |hv_undef_flags |NULLOK HV *hv                          \
+                               |U32 flags
+APdm   |I32    |ibcmp          |NN const char *a                       \
+                               |NN const char *b                       \
+                               |I32 len
+APdm   |I32    |ibcmp_locale   |NN const char *a                       \
+                               |NN const char *b                       \
+                               |I32 len
+Adm    |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
+
+eop    |STRLEN |infix_plugin_standard                                  \
+                               |NN char *operator_ptr                  \
+                               |STRLEN operator_len                    \
+                               |NN struct Perl_custom_infix **def
 : Used in toke.c
-p      |void   |init_argv_symbols|int argc|NN char **argv
+p      |void   |init_argv_symbols                                      \
+                               |int argc                               \
+                               |NN char **argv
+p      |void   |init_constants
 : Used in pp_ctl.c
-po     |void   |init_dbargs
+op     |void   |init_dbargs
 : Used in mg.c
 p      |void   |init_debugger
+COp    |int    |init_i18nl10n  |int printwarn
+Xp     |void   |init_named_cv  |NN CV *cv                              \
+                               |NN OP *nameop
 Cp     |void   |init_stacks
 Cp     |void   |init_tm        |NN struct tm *ptm
+p      |void   |init_uniprops
 : Used in perly.y
-AbMTpPRd|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
+AMPRTbdp|char * |instr         |NN const char *big                     \
+                               |NN const char *little
+Adp    |U32    |intro_my
+ERXp   |Size_t |_inverse_folds |const UV cp                            \
+                               |NN U32 *first_folds_to                 \
+                               |NN const U32 **remaining_folds_to
 : Used in perly.y
-pR     |OP*    |invert         |NULLOK OP* cmd
-pR     |OP*    |cmpchain_start |I32 type|NULLOK OP* left \
-                               |NULLOK OP* right
-pR     |OP*    |cmpchain_extend|I32 type|NN OP* ch|NULLOK OP* right
-pR     |OP*    |cmpchain_finish|NN OP* ch
-ApdR   |I32    |is_lvalue_sub
-: Used in cop.h
-XopR   |I32    |was_lvalue_sub
-CpRTP  |STRLEN |is_utf8_char_helper_|NN const U8 * const s|NN const U8 * e|const U32 flags
-CpRTP  |Size_t |is_utf8_FF_helper_|NN const U8 * const s0                  \
-                               |NN const U8 * const e                      \
+Rp     |OP *   |invert         |NULLOK OP *cmd
+p      |void   |invmap_dump    |NN SV *invlist                         \
+                               |NN UV *map
+: Used in sv.c
+p      |bool   |io_close       |NN IO *io                              \
+                               |NULLOK GV *gv                          \
+                               |bool is_explicit                       \
+                               |bool warn_on_fail
+APRTdm |bool   |is_ascii_string|NN const U8 * const s                  \
+                               |STRLEN len
+ARTdip |Size_t |isC9_STRICT_UTF8_CHAR                                  \
+                               |NN const U8 * const s0                 \
+                               |NN const U8 * const e
+ARTdm  |bool   |is_c9strict_utf8_string                                \
+                               |NN const U8 *s                         \
+                               |STRLEN len
+ATdm   |bool   |is_c9strict_utf8_string_loc                            \
+                               |NN const U8 *s                         \
+                               |STRLEN len                             \
+                               |NN const U8 **ep
+ATdip  |bool   |is_c9strict_utf8_string_loclen                         \
+                               |NN const U8 *s                         \
+                               |STRLEN len                             \
+                               |NULLOK const U8 **ep                   \
+                               |NULLOK STRLEN *el
+
+APTdp  |bool   |isinfnan       |NV nv
+dp     |bool   |isinfnansv     |NN SV *sv
+Cp     |bool   |_is_in_locale_category                                 \
+                               |const bool compiling                   \
+                               |const int category
+APRTdm |bool   |is_invariant_string                                    \
+                               |NN const U8 * const s                  \
+                               |STRLEN len
+ARdp   |I32    |is_lvalue_sub
+: used to check for NULs in pathnames and other names
+ARdip  |bool   |is_safe_syscall|NN const char *pv                      \
+                               |STRLEN len                             \
+                               |NN const char *what                    \
+                               |NN const char *op_name
+ARTdip |Size_t |isSTRICT_UTF8_CHAR                                     \
+                               |NN const U8 * const s0                 \
+                               |NN const U8 * const e
+ARTdm  |bool   |is_strict_utf8_string                                  \
+                               |NN const U8 *s                         \
+                               |STRLEN len
+ATdm   |bool   |is_strict_utf8_string_loc                              \
+                               |NN const U8 *s                         \
+                               |STRLEN len                             \
+                               |NN const U8 **ep
+ATdip  |bool   |is_strict_utf8_string_loclen                           \
+                               |NN const U8 *s                         \
+                               |STRLEN len                             \
+                               |NULLOK const U8 **ep                   \
+                               |NULLOK STRLEN *el
+CRp    |bool   |_is_uni_FOO    |const U8 classnum                      \
+                               |const UV c
+CRp    |bool   |_is_uni_perl_idcont                                    \
+                               |UV c
+CRp    |bool   |_is_uni_perl_idstart                                   \
+                               |UV c
+ARTdip |Size_t |isUTF8_CHAR    |NN const U8 * const s0                 \
+                               |NN const U8 * const e
+AMTbdp |STRLEN |is_utf8_char_buf                                       \
+                               |NN const U8 *buf                       \
+                               |NN const U8 *buf_end
+ARTdip |Size_t |isUTF8_CHAR_flags                                      \
+                               |NN const U8 * const s0                 \
+                               |NN const U8 * const e                  \
+                               |const U32 flags
+CPRTp  |STRLEN |is_utf8_char_helper_                                   \
+                               |NN const U8 * const s                  \
+                               |NN const U8 *e                         \
+                               |const U32 flags
+CPRTp  |Size_t |is_utf8_FF_helper_                                     \
+                               |NN const U8 * const s0                 \
+                               |NN const U8 * const e                  \
                                |const bool require_partial
-Cp     |UV     |to_uni_upper   |UV c|NN U8 *p|NN STRLEN *lenp
-Cp     |UV     |to_uni_title   |UV c|NN U8 *p|NN STRLEN *lenp
-p      |void   |init_uniprops
-#ifdef PERL_IN_UTF8_C
-STR    |U8     |to_lower_latin1|const U8 c|NULLOK U8 *p|NULLOK STRLEN *lenp  \
-               |const char dummy
-#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
-Cp     |UV     |to_uni_lower   |UV c|NN U8 *p|NN STRLEN *lenp
-Cm     |UV     |to_uni_fold    |UV c|NN U8 *p|NN STRLEN *lenp
-Cp     |UV     |_to_uni_fold_flags|UV c|NN U8 *p|NN STRLEN *lenp|U8 flags
-CpR    |bool   |_is_uni_perl_idcont|UV c
-CpR    |bool   |_is_uni_perl_idstart|UV c
-ATdmoR |bool   |is_utf8_invariant_string|NN const U8* const s              \
-               |STRLEN len
-ATidRp |bool   |is_utf8_invariant_string_loc|NN const U8* const s          \
-               |STRLEN len                                                 \
-               |NULLOK const U8 ** ep
-CTiRp  |unsigned|single_1bit_pos32|U32 word
-CTiRp  |unsigned|lsbit_pos32|U32 word
-CTiRp  |unsigned|msbit_pos32|U32 word
-#ifdef U64TYPE /* HAS_QUAD undefined outside of core */
-CTiRp  |unsigned|single_1bit_pos64|U64 word
-CTiRp  |unsigned|lsbit_pos64|U64 word
-CTiRp  |unsigned|msbit_pos64|U64 word
-#endif
-#ifndef EBCDIC
-CTiRp  |unsigned int|variant_byte_number|PERL_UINTMAX_T word
-#endif
-#if defined(PERL_CORE) || defined(PERL_EXT)
-EiTRd  |Size_t |variant_under_utf8_count|NN const U8* const s              \
-               |NN const U8* const e
-#endif
-AmTdRP |bool   |is_ascii_string|NN const U8* const s|STRLEN len
-AmTdRP |bool   |is_invariant_string|NN const U8* const s|STRLEN len
-#if defined(PERL_CORE) || defined (PERL_EXT)
-EXTidRp        |bool   |is_utf8_non_invariant_string|NN const U8* const s          \
-               |STRLEN len
-#endif
-AbTpdD |STRLEN |is_utf8_char   |NN const U8 *s
-AbMTpd |STRLEN |is_utf8_char_buf|NN const U8 *buf|NN const U8 *buf_end
-ATidRp |Size_t |isUTF8_CHAR|NN const U8 * const s0                         \
-                           |NN const U8 * const e
-ATidRp |Size_t |isUTF8_CHAR_flags|NN const U8 * const s0                   \
-                           |NN const U8 * const e                          \
-                           |const U32 flags
-ATidRp |Size_t |isSTRICT_UTF8_CHAR |NN const U8 * const s0                 \
-                                   |NN const U8 * const e
-ATidRp |Size_t |isC9_STRICT_UTF8_CHAR |NN const U8 * const s0              \
-                                      |NN const U8 * const e
-ATmdR  |bool   |is_utf8_string |NN const U8 *s|STRLEN len
-ATidRp |bool   |is_utf8_string_flags                                       \
-               |NN const U8 *s|STRLEN len|const U32 flags
-ATmdR  |bool   |is_strict_utf8_string|NN const U8 *s|STRLEN len
-ATmdR  |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
-ATdm   |bool   |is_utf8_string_loc_flags                                   \
-               |NN const U8 *s|STRLEN len|NN const U8 **ep                 \
-               |const U32 flags
-ATdm   |bool   |is_strict_utf8_string_loc                                  \
-               |NN const U8 *s|STRLEN len|NN const U8 **ep
-ATdm   |bool   |is_c9strict_utf8_string_loc                                \
-               |NN const U8 *s|STRLEN len|NN const U8 **ep
-ATipd  |bool   |is_utf8_string_loclen                                      \
-               |NN const U8 *s|STRLEN len|NULLOK const U8 **ep             \
-               |NULLOK STRLEN *el
-ATidp  |bool   |is_utf8_string_loclen_flags                                \
-               |NN const U8 *s|STRLEN len|NULLOK const U8 **ep             \
-               |NULLOK STRLEN *el|const U32 flags
-ATidp  |bool   |is_strict_utf8_string_loclen                               \
-               |NN const U8 *s|STRLEN len|NULLOK const U8 **ep     \
-               |NULLOK STRLEN *el
-ATidp  |bool   |is_c9strict_utf8_string_loclen                             \
-               |NN const U8 *s|STRLEN len|NULLOK const U8 **ep     \
-               |NULLOK STRLEN *el
-AmTd   |bool   |is_utf8_fixed_width_buf_flags                              \
-               |NN const U8 * const s|STRLEN len|const U32 flags
-AmTd   |bool   |is_utf8_fixed_width_buf_loc_flags                          \
-               |NN const U8 * const s|STRLEN len                           \
-               |NULLOK const U8 **ep|const U32 flags
-ATidp  |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
-AmTdP  |bool   |is_utf8_valid_partial_char                                 \
-               |NN const U8 * const s0|NN const U8 * const e
-ATidRp |bool   |is_utf8_valid_partial_char_flags                           \
-               |NN const U8 * const s0|NN const U8 * const e|const U32 flags
-CpR     |bool   |_is_uni_FOO|const U8 classnum|const UV c
-CpR     |bool   |_is_utf8_FOO|const U8 classnum|NN const U8 *p     \
-               |NN const U8 * const e
-CpR     |bool   |_is_utf8_perl_idcont|NN const U8 *p|NN const U8 * const e
-CpR     |bool   |_is_utf8_perl_idstart|NN const U8 *p|NN const U8 * const e
+ATdm   |bool   |is_utf8_fixed_width_buf_flags                          \
+                               |NN const U8 * const s                  \
+                               |STRLEN len                             \
+                               |const U32 flags
+ATdm   |bool   |is_utf8_fixed_width_buf_loc_flags                      \
+                               |NN const U8 * const s                  \
+                               |STRLEN len                             \
+                               |NULLOK const U8 **ep                   \
+                               |const U32 flags
+ATdip  |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
+CRp    |bool   |_is_utf8_FOO   |const U8 classnum                      \
+                               |NN const U8 *p                         \
+                               |NN const U8 * const e
+ARTdmo |bool   |is_utf8_invariant_string                               \
+                               |NN const U8 * const s                  \
+                               |STRLEN len
+ARTdip |bool   |is_utf8_invariant_string_loc                           \
+                               |NN const U8 * const s                  \
+                               |STRLEN len                             \
+                               |NULLOK const U8 **ep
+CRp    |bool   |_is_utf8_perl_idcont                                   \
+                               |NN const U8 *p                         \
+                               |NN const U8 * const e
+CRp    |bool   |_is_utf8_perl_idstart                                  \
+                               |NN const U8 *p                         \
+                               |NN const U8 * const e
+ARTdm  |bool   |is_utf8_string |NN const U8 *s                         \
+                               |STRLEN len
+ARTdip |bool   |is_utf8_string_flags                                   \
+                               |NN const U8 *s                         \
+                               |STRLEN len                             \
+                               |const U32 flags
+AMTbdp |bool   |is_utf8_string_loc                                     \
+                               |NN const U8 *s                         \
+                               |const STRLEN len                       \
+                               |NN const U8 **ep
+ATdm   |bool   |is_utf8_string_loc_flags                               \
+                               |NN const U8 *s                         \
+                               |STRLEN len                             \
+                               |NN const U8 **ep                       \
+                               |const U32 flags
+ATdip  |bool   |is_utf8_string_loclen                                  \
+                               |NN const U8 *s                         \
+                               |STRLEN len                             \
+                               |NULLOK const U8 **ep                   \
+                               |NULLOK STRLEN *el
+ATdip  |bool   |is_utf8_string_loclen_flags                            \
+                               |NN const U8 *s                         \
+                               |STRLEN len                             \
+                               |NULLOK const U8 **ep                   \
+                               |NULLOK STRLEN *el                      \
+                               |const U32 flags
+APTdm  |bool   |is_utf8_valid_partial_char                             \
+                               |NN const U8 * const s0                 \
+                               |NN const U8 * const e
+ARTdip |bool   |is_utf8_valid_partial_char_flags                       \
+                               |NN const U8 * const s0                 \
+                               |NN const U8 * const e                  \
+                               |const U32 flags
 
-#if defined(PERL_CORE) || defined(PERL_EXT)
-EXdpR  |bool   |isSCRIPT_RUN   |NN const U8 *s|NN const U8 *send   \
-                               |const bool utf8_target
-#endif
 : Used in perly.y
-p      |OP   |jmaybe         |NN OP *o
+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
-#endif
-Cpd    |void   |leave_scope    |I32 base
-p      |void   |notify_parser_that_changed_to_utf8
+Pp     |I32    |keyword        |NN const char *name                    \
+                               |I32 len                                \
+                               |bool all_keywords
+
+eop    |int    |keyword_plugin_standard                                \
+                               |NN char *keyword_ptr                   \
+                               |STRLEN keyword_len                     \
+                               |NN OP **op_ptr
+
+Apx    |void   |leave_adjust_stacks                                    \
+                               |NN SV **from_sp                        \
+                               |NN SV **to_sp                          \
+                               |U8 gimme                               \
+                               |int filter
+Cdp    |void   |leave_scope    |I32 base
+Adpx   |bool   |lex_bufutf8
+Adpx   |void   |lex_discard_to |NN char *ptr
+Adpx   |char * |lex_grow_linestr                                       \
+                               |STRLEN len
+Adpx   |bool   |lex_next_chunk |U32 flags
+Adpx   |I32    |lex_peek_unichar                                       \
+                               |U32 flags
+Adpx   |void   |lex_read_space |U32 flags
+Adpx   |void   |lex_read_to    |NN char *ptr
+Adpx   |I32    |lex_read_unichar                                       \
+                               |U32 flags
 : Public lexer API
-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
-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
-Axpd   |OP*    |parse_subsignature|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
-Cpd    |void   |op_refcnt_lock
-Cpd    |void   |op_refcnt_unlock
-ApdT   |OP*    |op_sibling_splice|NULLOK OP *parent|NULLOK OP *start \
-               |int del_count|NULLOK OP* insert
-ApdT   |OP*    |op_parent|NN OP *o
-#if defined(PERL_IN_OP_C)
-S      |OP*    |listkids       |NULLOK OP* o
-#endif
-p      |OP*    |list           |NULLOK OP* o
-AFpd   |void   |load_module|U32 flags|NN SV* name|NULLOK SV* ver|...
-Adp    |void   |vload_module|U32 flags|NN SV* name|NULLOK SV* ver|NULLOK va_list* args
+Adpx   |void   |lex_start      |NULLOK SV *line                        \
+                               |NULLOK PerlIO *rsfp                    \
+                               |U32 flags
+Adpx   |void   |lex_stuff_pv   |NN const char *pv                      \
+                               |U32 flags
+Adpx   |void   |lex_stuff_pvn  |NN const char *pv                      \
+                               |STRLEN len                             \
+                               |U32 flags
+Adpx   |void   |lex_stuff_sv   |NN SV *sv                              \
+                               |U32 flags
+Adpx   |void   |lex_unstuff    |NN char *ptr
+p      |OP *   |list           |NULLOK OP *o
+ERXp   |HV *   |load_charnames |NN SV *char_name                       \
+                               |NN const char *context                 \
+                               |const STRLEN context_len               \
+                               |NN const char **error_msg
+AFdp   |void   |load_module    |U32 flags                              \
+                               |NN SV *name                            \
+                               |NULLOK SV *ver                         \
+                               |...
+CTopr  |void   |locale_panic   |NN const char *msg                     \
+                               |NN const char *file_name               \
+                               |const line_t line                      \
+                               |const int errnum
 : Used in perly.y
-p      |OP*    |localize       |NN OP *o|I32 lex
-ApdR   |I32    |looks_like_number|NN SV *const sv
-AMpd   |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
-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
-ApMd   |UV     |grok_oct       |NN const char* start|NN STRLEN* len_p|NN I32* flags|NULLOK NV *result
-ApMd   |UV     |grok_bin       |NN const char* start|NN STRLEN* len_p|NN I32* flags|NULLOK NV *result
-Cp     |UV     |grok_bin_oct_hex|NN const char* start                      \
-                                |NN STRLEN* len_p                          \
-                                |NN I32* flags                             \
-                                |NULLOK NV *result                         \
-                                |const unsigned shift                      \
-                                |const U8 lookup_bit                       \
-                                |const char prefix
-#ifdef PERL_IN_NUMERIC_C
-S      |void   |output_non_portable|const U8 shift
-#endif
-ApdT   |bool   |grok_atoUV     |NN const char* pv|NN UV* valptr|NULLOK const char** endptr
+p      |OP *   |localize       |NN OP *o                               \
+                               |I32 lex
+ARdp   |I32    |looks_like_number                                      \
+                               |NN SV * const sv
+CRTip  |unsigned|lsbit_pos32   |U32 word
+p      |int    |magic_clear_all_env                                    \
+                               |NN SV *sv                              \
+                               |NN MAGIC *mg
+p      |int    |magic_cleararylen_p                                    \
+                               |NN SV *sv                              \
+                               |NN MAGIC *mg
 : 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
-dp     |int    |magic_clearhint|NN SV* sv|NN MAGIC* mg
-dp     |int    |magic_clearhints|NN SV* sv|NN MAGIC* mg
-p      |int    |magic_clearisa |NULLOK SV* sv|NN MAGIC* mg
-p      |int    |magic_clearpack|NN SV* sv|NN MAGIC* mg
-p      |int    |magic_clearsig |NN SV* sv|NN MAGIC* mg
-p      |int    |magic_copycallchecker|NN SV* sv|NN MAGIC *mg|NN SV *nsv \
-                                     |NULLOK const char *name|I32 namlen
-p      |int    |magic_existspack|NN SV* sv|NN const MAGIC* mg
-p      |int    |magic_freeovrld|NN SV* sv|NN MAGIC* mg
-p      |int    |magic_get      |NN SV* sv|NN MAGIC* mg
-p      |int    |magic_getarylen|NN SV* sv|NN const MAGIC* mg
-p      |int    |magic_getdefelem|NN SV* sv|NN MAGIC* mg
-p      |int    |magic_getdebugvar|NN SV* sv|NN MAGIC* mg
-p      |int    |magic_getnkeys |NN SV* sv|NN MAGIC* mg
-p      |int    |magic_getpack  |NN SV* sv|NN MAGIC* mg
-p      |int    |magic_getpos   |NN SV* sv|NN MAGIC* mg
-p      |int    |magic_getsig   |NN SV* sv|NN MAGIC* mg
-p      |int    |magic_getsubstr|NN SV* sv|NN MAGIC* mg
-p      |int    |magic_gettaint |NN SV* sv|NN MAGIC* mg
-p      |int    |magic_getuvar  |NN SV* sv|NN MAGIC* mg
-p      |int    |magic_getvec   |NN SV* sv|NN MAGIC* mg
-p      |int    |magic_nextpack |NN SV *sv|NN MAGIC *mg|NN SV *key
-p      |U32    |magic_regdata_cnt|NN SV* sv|NN MAGIC* mg
-p      |int    |magic_regdatum_get|NN SV* sv|NN MAGIC* mg
+p      |int    |magic_clearenv |NN SV *sv                              \
+                               |NN MAGIC *mg
+dp     |int    |magic_clearhint|NN SV *sv                              \
+                               |NN MAGIC *mg
+dp     |int    |magic_clearhints                                       \
+                               |NN SV *sv                              \
+                               |NN MAGIC *mg
+p      |int    |magic_clearhook|NULLOK SV *sv                          \
+                               |NN MAGIC *mg
+p      |int    |magic_clearhookall                                     \
+                               |NULLOK SV *sv                          \
+                               |NN MAGIC *mg
+p      |int    |magic_clearisa |NULLOK SV *sv                          \
+                               |NN MAGIC *mg
+p      |int    |magic_clearpack|NN SV *sv                              \
+                               |NN MAGIC *mg
+p      |int    |magic_clearsig |NN SV *sv                              \
+                               |NN MAGIC *mg
+p      |int    |magic_copycallchecker                                  \
+                               |NN SV *sv                              \
+                               |NN MAGIC *mg                           \
+                               |NN SV *nsv                             \
+                               |NULLOK const char *name                \
+                               |I32 namlen
+Adp    |void   |magic_dump     |NULLOK const MAGIC *mg
+p      |int    |magic_existspack                                       \
+                               |NN SV *sv                              \
+                               |NN const MAGIC *mg
+p      |int    |magic_freearylen_p                                     \
+                               |NN SV *sv                              \
+                               |NN MAGIC *mg
+dp     |int    |magic_freedestruct                                     \
+                               |NN SV *sv                              \
+                               |NN MAGIC *mg
+p      |int    |magic_freemglob|NN SV *sv                              \
+                               |NN MAGIC *mg
+p      |int    |magic_freeovrld|NN SV *sv                              \
+                               |NN MAGIC *mg
+p      |int    |magic_freeutf8 |NN SV *sv                              \
+                               |NN MAGIC *mg
+p      |int    |magic_get      |NN SV *sv                              \
+                               |NN MAGIC *mg
+p      |int    |magic_getarylen|NN SV *sv                              \
+                               |NN const MAGIC *mg
+p      |int    |magic_getdebugvar                                      \
+                               |NN SV *sv                              \
+                               |NN MAGIC *mg
+p      |int    |magic_getdefelem                                       \
+                               |NN SV *sv                              \
+                               |NN MAGIC *mg
+p      |int    |magic_getnkeys |NN SV *sv                              \
+                               |NN MAGIC *mg
+p      |int    |magic_getpack  |NN SV *sv                              \
+                               |NN MAGIC *mg
+p      |int    |magic_getpos   |NN SV *sv                              \
+                               |NN MAGIC *mg
+p      |int    |magic_getsig   |NN SV *sv                              \
+                               |NN MAGIC *mg
+p      |int    |magic_getsubstr|NN SV *sv                              \
+                               |NN MAGIC *mg
+p      |int    |magic_gettaint |NN SV *sv                              \
+                               |NN MAGIC *mg
+p      |int    |magic_getuvar  |NN SV *sv                              \
+                               |NN MAGIC *mg
+p      |int    |magic_getvec   |NN SV *sv                              \
+                               |NN MAGIC *mg
+: This is indirectly referenced by globals.c. This is somewhat annoying.
+p      |int    |magic_killbackrefs                                     \
+                               |NN SV *sv                              \
+                               |NN MAGIC *mg
+Fdop   |SV *   |magic_methcall |NN SV *sv                              \
+                               |NN const MAGIC *mg                     \
+                               |NN SV *meth                            \
+                               |U32 flags                              \
+                               |U32 argc                               \
+                               |...
+p      |int    |magic_nextpack |NN SV *sv                              \
+                               |NN MAGIC *mg                           \
+                               |NN SV *key
+p      |U32    |magic_regdata_cnt                                      \
+                               |NN SV *sv                              \
+                               |NN MAGIC *mg
+p      |int    |magic_regdatum_get                                     \
+                               |NN SV *sv                              \
+                               |NN MAGIC *mg
+
+: This is indirectly referenced by globals.c. This is somewhat annoying.
+p      |SV *   |magic_scalarpack                                       \
+                               |NN HV *hv                              \
+                               |NN MAGIC *mg
 :removing noreturn to silence a warning for this function resulted in no
 :change to the interpreter DLL image under VS 2003 -O1 -GL 32 bits only because
 :this is used in a magic vtable, do not use this on conventionally called funcs
-#ifdef _MSC_VER
-p      |int    |magic_regdatum_set|NN SV* sv|NN MAGIC* mg
-#else
-pr     |int    |magic_regdatum_set|NN SV* sv|NN MAGIC* mg
-#endif
-p      |int    |magic_set      |NN SV* sv|NN MAGIC* mg
-p      |int    |magic_setarylen|NN SV* sv|NN MAGIC* mg
-p      |int    |magic_cleararylen_p|NN SV* sv|NN MAGIC* mg
-p      |int    |magic_freearylen_p|NN SV* sv|NN MAGIC* mg
-p      |int    |magic_setdbline|NN SV* sv|NN MAGIC* mg
-p      |int    |magic_setdebugvar|NN SV* sv|NN MAGIC* mg
-p      |int    |magic_setdefelem|NN SV* sv|NN MAGIC* mg
-p      |int    |magic_setnonelem|NN SV* sv|NN MAGIC* mg
-p      |int    |magic_setenv   |NN SV* sv|NN MAGIC* mg
-dp     |int    |magic_sethint  |NN SV* sv|NN MAGIC* mg
-p      |int    |magic_setisa   |NN SV* sv|NN MAGIC* mg
-p      |int    |magic_setlvref |NN SV* sv|NN MAGIC* mg
-p      |int    |magic_setmglob |NN SV* sv|NN MAGIC* mg
-p      |int    |magic_freemglob|NN SV* sv|NN MAGIC* mg
-p      |int    |magic_setnkeys |NN SV* sv|NN MAGIC* mg
-p      |int    |magic_setpack  |NN SV* sv|NN MAGIC* mg
-p      |int    |magic_setpos   |NN SV* sv|NN MAGIC* mg
-p      |int    |magic_setregexp|NN SV* sv|NN MAGIC* mg
-p      |int    |magic_setsigall|NN SV* sv|NN MAGIC* mg
-p      |int    |magic_setsig   |NULLOK SV* sv|NN MAGIC* mg
-p      |int    |magic_setsubstr|NN SV* sv|NN MAGIC* mg
-p      |int    |magic_settaint |NN SV* sv|NN MAGIC* mg
-p      |int    |magic_setuvar  |NN SV* sv|NN MAGIC* mg
-p      |int    |magic_setvec   |NN SV* sv|NN MAGIC* mg
-p      |int    |magic_setutf8  |NN SV* sv|NN MAGIC* mg
-p      |int    |magic_freeutf8 |NN SV* sv|NN MAGIC* mg
-p      |int    |magic_set_all_env|NN SV* sv|NN MAGIC* mg
-p      |U32    |magic_sizepack |NN SV* sv|NN MAGIC* mg
-p      |int    |magic_wipepack |NN SV* sv|NN MAGIC* mg
-Fpod   |SV*    |magic_methcall |NN SV *sv|NN const MAGIC *mg \
-                               |NN SV *meth|U32 flags \
-                               |U32 argc|...
+p      |int    |magic_set      |NN SV *sv                              \
+                               |NN MAGIC *mg
+p      |int    |magic_set_all_env                                      \
+                               |NN SV *sv                              \
+                               |NN MAGIC *mg
+p      |int    |magic_setarylen|NN SV *sv                              \
+                               |NN MAGIC *mg
+p      |int    |magic_setdbline|NN SV *sv                              \
+                               |NN MAGIC *mg
+p      |int    |magic_setdebugvar                                      \
+                               |NN SV *sv                              \
+                               |NN MAGIC *mg
+p      |int    |magic_setdefelem                                       \
+                               |NN SV *sv                              \
+                               |NN MAGIC *mg
+p      |int    |magic_setenv   |NN SV *sv                              \
+                               |NN MAGIC *mg
+dp     |int    |magic_sethint  |NN SV *sv                              \
+                               |NN MAGIC *mg
+p      |int    |magic_sethook  |NULLOK SV *sv                          \
+                               |NN MAGIC *mg
+p      |int    |magic_sethookall                                       \
+                               |NN SV *sv                              \
+                               |NN MAGIC *mg
+p      |int    |magic_setisa   |NN SV *sv                              \
+                               |NN MAGIC *mg
+p      |int    |magic_setlvref |NN SV *sv                              \
+                               |NN MAGIC *mg
+p      |int    |magic_setmglob |NN SV *sv                              \
+                               |NN MAGIC *mg
+p      |int    |magic_setnkeys |NN SV *sv                              \
+                               |NN MAGIC *mg
+p      |int    |magic_setnonelem                                       \
+                               |NN SV *sv                              \
+                               |NN MAGIC *mg
+p      |int    |magic_setpack  |NN SV *sv                              \
+                               |NN MAGIC *mg
+p      |int    |magic_setpos   |NN SV *sv                              \
+                               |NN MAGIC *mg
+p      |int    |magic_setregexp|NN SV *sv                              \
+                               |NN MAGIC *mg
+p      |int    |magic_setsig   |NULLOK SV *sv                          \
+                               |NN MAGIC *mg
+p      |int    |magic_setsigall|NN SV *sv                              \
+                               |NN MAGIC *mg
+p      |int    |magic_setsubstr|NN SV *sv                              \
+                               |NN MAGIC *mg
+p      |int    |magic_settaint |NN SV *sv                              \
+                               |NN MAGIC *mg
+p      |int    |magic_setutf8  |NN SV *sv                              \
+                               |NN MAGIC *mg
+p      |int    |magic_setuvar  |NN SV *sv                              \
+                               |NN MAGIC *mg
+p      |int    |magic_setvec   |NN SV *sv                              \
+                               |NN MAGIC *mg
+p      |U32    |magic_sizepack |NN SV *sv                              \
+                               |NN MAGIC *mg
+p      |int    |magic_wipepack |NN SV *sv                              \
+                               |NN MAGIC *mg
+
+CTadop |Malloc_t|malloc        |MEM_SIZE nbytes
 Cp     |I32 *  |markstack_grow
-#if defined(USE_LOCALE_COLLATE)
-p      |int    |magic_setcollxfrm|NN SV* sv|NN MAGIC* mg
-p      |int    |magic_freecollxfrm|NN SV* sv|NN MAGIC* mg
-pbD    |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)
-p      |char*  |_mem_collxfrm  |NN const char* input_string    \
-                               |STRLEN len                     \
-                               |NN STRLEN* xlen                \
-                               |bool utf8
-#   endif
-#endif
-Afpd   |SV*    |mess           |NN const char* pat|...
-Apd    |SV*    |mess_sv        |NN SV* basemsg|bool consume
-Apd    |SV*    |vmess          |NN const char* pat|NULLOK va_list* args
-: FIXME - either make it public, or stop exporting it. (Data::Alias uses this)
-: Used in gv.c, op.c, toke.c
-EXp    |void   |qerror         |NN SV* err
-Apd    |void   |sortsv         |NULLOK SV** array|size_t num_elts|NN SVCOMPARE_t cmp
-Apd    |void   |sortsv_flags   |NULLOK SV** array|size_t num_elts|NN SVCOMPARE_t cmp|U32 flags
-Apd    |int    |mg_clear       |NN SV* sv
-Apd    |int    |mg_copy        |NN SV *sv|NN SV *nsv|NULLOK const char *key \
+EXp    |int    |mbtowc_        |NULLOK const wchar_t *pwc              \
+                               |NULLOK const char *s                   \
+                               |const Size_t len
+Adfp   |SV *   |mess           |NN const char *pat                     \
+                               |...
+Adp    |SV *   |mess_sv        |NN SV *basemsg                         \
+                               |bool consume
+CTdop  |Free_t |mfree          |Malloc_t where
+Adp    |int    |mg_clear       |NN SV *sv
+Adp    |int    |mg_copy        |NN SV *sv                              \
+                               |NN SV *nsv                             \
+                               |NULLOK const char *key                 \
                                |I32 klen
-: 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
-ApdRT  |MAGIC* |mg_find        |NULLOK const SV* sv|int type
-ApdRT  |MAGIC* |mg_findext     |NULLOK const SV* sv|int type|NULLOK const MGVTBL *vtbl
+ARTdp  |MAGIC *|mg_find        |NULLOK const SV *sv                    \
+                               |int type
+ARTdp  |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
-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
-ApdT   |void   |mg_magical     |NN SV* sv
-Apd    |int    |mg_set         |NN SV* sv
-Cp     |I32    |mg_size        |NN SV* sv
-AdpT   |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
-pd     |void   |finalize_optree                |NN OP* o
-pd     |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 \
-                               |NN const GV *name|bool curstash
-#endif
+ERXp   |MAGIC *|mg_find_mglob  |NN SV *sv
+Adp    |int    |mg_free        |NN SV *sv
+Adp    |void   |mg_freeext     |NN SV *sv                              \
+                               |int how                                \
+                               |NULLOK const MGVTBL *vtbl
+Adp    |void   |mg_free_type   |NN SV *sv                              \
+                               |int how
+Adp    |int    |mg_get         |NN SV *sv
+: Defined in mg.c, used only in scope.c
+dp     |void   |mg_localize    |NN SV *sv                              \
+                               |NN SV *nsv                             \
+                               |bool setmagic
+ATdp   |void   |mg_magical     |NN SV *sv
+Adp    |int    |mg_set         |NN SV *sv
+Cp     |I32    |mg_size        |NN SV *sv
+ATdp   |void   |mini_mktime    |NN struct tm *ptm
 : Used in op.c and pp_sys.c
-p      |int    |mode_from_discipline|NULLOK const char* s|STRLEN len
-Cp     |const char*    |moreswitches   |NN const char* s
-Apd    |NV     |my_atof        |NN const char *s
-ATdpR  |NV     |my_strtod      |NN const char * const s|NULLOK char ** e
-Aprd   |void   |my_exit        |U32 status
-Apr    |void   |my_failure_exit
-Cpd    |I32    |my_fflush_all
-CTpd   |Pid_t  |my_fork
-CTp    |void   |atfork_lock
-CTp    |void   |atfork_unlock
-m      |I32    |my_lstat
-pX     |I32    |my_lstat_flags |NULLOK const U32 flags
-#if ! defined(HAS_MEMRCHR) && (defined(PERL_CORE) || defined(PERL_EXT))
-EeiT   |void * |my_memrchr     |NN const char * s|const char c|const STRLEN len
-#endif
-#if !defined(PERL_IMPLICIT_SYS)
-Adp    |I32    |my_pclose      |NULLOK PerlIO* ptr
-Adp    |PerlIO*|my_popen       |NN const char* cmd|NN const char* mode
-#endif
-Cpd    |PerlIO*|my_popen_list  |NN const char* mode|int n|NN SV ** args
-Apd    |void   |my_setenv      |NULLOK const char* nam|NULLOK const char* val
-m      |I32    |my_stat
-pX     |I32    |my_stat_flags  |NULLOK const U32 flags
-Adfp   |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
-CbDTPR |UV     |NATIVE_TO_NEED |const UV enc|const UV ch
-CbDTPR |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
-ApdR   |OP*    |newASSIGNOP    |I32 flags|NULLOK OP* left|I32 optype|NULLOK OP* right
-ApdR   |OP*    |newCONDOP      |I32 flags|NN OP* first|NULLOK OP* trueop|NULLOK OP* falseop
-Apd    |CV*    |newCONSTSUB    |NULLOK HV* stash|NULLOK const char* name|NULLOK SV* sv
-Apd    |CV*    |newCONSTSUB_flags|NULLOK HV* stash \
-                                 |NULLOK const char* name|STRLEN len \
-                                 |U32 flags|NULLOK SV* sv
-Cp     |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
-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
-ApdR   |OP*    |newOP          |I32 optype|I32 flags
-Cp     |void   |newPROG        |NN OP* o
-ApdR   |OP*    |newRANGE       |I32 flags|NN OP* left|NN OP* right
-ApdR   |OP*    |newSLICEOP     |I32 flags|NULLOK OP* subscript|NULLOK OP* listop
-ApdR   |OP*    |newSTATEOP     |I32 flags|NULLOK char* label|NULLOK OP* o
-AdpbM  |CV*    |newSUB         |I32 floor|NULLOK OP* o|NULLOK OP* proto \
-                               |NULLOK OP* block
-ApdRx  |OP*    |newTRYCATCHOP  |I32 flags|NN OP* tryblock|NN OP *catchvar|NN OP* catchblock
-ApdRx  |OP*    |newDEFEROP     |I32 flags|NN OP *block
-pd     |CV *   |newXS_len_flags|NULLOK const char *name|STRLEN len \
-                               |NN XSUBADDR_t subaddr\
-                               |NULLOK const char *const filename \
-                               |NULLOK const char *const proto \
-                               |NULLOK SV **const_svp|U32 flags
-pX     |CV *   |newXS_deffile  |NN 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
-ApdU   |CV*    |newXS          |NULLOK const char *name|NN XSUBADDR_t subaddr\
-                               |NN const char *filename
-ApMdbR |AV*    |newAV
-AmdR   |AV*    |newAV_alloc_x  |SSize_t size
-AmdR   |AV*    |newAV_alloc_xz |SSize_t size
-ApR    |OP*    |newAVREF       |NN OP* o
-ApdR   |OP*    |newBINOP       |I32 type|I32 flags|NULLOK OP* first|NULLOK OP* last
-ApR    |OP*    |newCVREF       |I32 flags|NULLOK OP* o
-ApdR   |OP*    |newGVOP        |I32 type|I32 flags|NN GV* gv
-Amd    |GV*    |newGVgen       |NN const char* pack
-ApdR   |GV*    |newGVgen_flags |NN const char* pack|U32 flags
-ApR    |OP*    |newGVREF       |I32 type|NULLOK OP* o
-ApR    |OP*    |newHVREF       |NN OP* o
-ApMdbR |HV*    |newHV
-ApRd   |HV*    |newHVhv        |NULLOK HV *hv
-ApRbMd |IO*    |newIO
-ApdR   |OP*    |newLISTOP      |I32 type|I32 flags|NULLOK OP* first|NULLOK OP* last
-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
-ApdR   |OP*    |newPMOP        |I32 type|I32 flags
-ApdR   |OP*    |newPVOP        |I32 type|I32 flags|NULLOK char* pv
-ApdR   |SV*    |newRV          |NN SV *const sv
-ApdR   |SV*    |newRV_noinc    |NN SV *const tmpRef
-ApdR   |SV*    |newSV          |const STRLEN len
-ApR    |OP*    |newSVREF       |NN OP* o
-ApdR   |OP*    |newSVOP        |I32 type|I32 flags|NN SV* sv
-ApdR   |OP*    |newDEFSVOP
-pR     |SV*    |newSVavdefelem |NN AV *av|SSize_t ix|bool extendible
-ApdR   |SV*    |newSViv        |const IV i
-ApdR   |SV*    |newSVuv        |const UV u
-ApdR   |SV*    |newSVnv        |const NV n
-ApdR   |SV*    |newSVpv        |NULLOK const char *const s|const STRLEN len
-ApdR   |SV*    |newSVpvn       |NULLOK const char *const buffer|const STRLEN len
-ApdR   |SV*    |newSVpvn_flags |NULLOK const char *const s|const STRLEN len|const U32 flags
-ApdR   |SV*    |newSVhek       |NULLOK const HEK *const hek
-ApdR   |SV*    |newSVpvn_share |NULLOK const char* s|I32 len|U32 hash
-ApdR   |SV*    |newSVpv_share  |NULLOK const char* s|U32 hash
-AfpdR  |SV*    |newSVpvf       |NN const char *const pat|...
-ApRd   |SV*    |vnewSVpvf      |NN const char *const pat|NULLOK va_list *const args
-Apd    |SV*    |newSVrv        |NN SV *const rv|NULLOK const char *const classname
-ApMbdR |SV*    |newSVsv        |NULLOK SV *const old
-AmdR   |SV*    |newSVsv_nomg   |NULLOK SV *const old
-AdpR   |SV*    |newSVsv_flags  |NULLOK SV *const old|I32 flags
-ApdiR  |SV*    |newSV_type     |const svtype type
-ApdIR  |SV*    |newSV_type_mortal|const svtype type
-ApdR   |OP*    |newUNOP        |I32 type|I32 flags|NULLOK OP* first
-ApdR   |OP*    |newUNOP_AUX    |I32 type|I32 flags|NULLOK OP* first \
-                               |NULLOK UNOP_AUX_item *aux
-ApdR   |OP*    |newWHENOP      |NULLOK OP* cond|NN OP* block
-ApdR   |OP*    |newWHILEOP     |I32 flags|I32 debuggable|NULLOK LOOP* loop \
-                               |NULLOK OP* expr|NULLOK OP* block|NULLOK OP* cont \
-                               |I32 has_my
-ApdR   |OP*    |newMETHOP      |I32 type|I32 flags|NN OP* dynamic_meth
-ApdR   |OP*    |newMETHOP_named|I32 type|I32 flags|NN SV* const_meth
-Apd    |CV*    |rv2cv_op_cv    |NN OP *cvop|U32 flags
-Apd    |OP*    |ck_entersub_args_list|NN OP *entersubop
-Apd    |OP*    |ck_entersub_args_proto|NN OP *entersubop|NN GV *namegv|NN SV *protosv
-Apd    |OP*    |ck_entersub_args_proto_or_list|NN OP *entersubop|NN GV *namegv|NN SV *protosv
-po     |OP*    |ck_entersub_args_core|NN OP *entersubop|NN GV *namegv \
-                                     |NN SV *protosv
-Apd    |void   |cv_get_call_checker|NN CV *cv|NN Perl_call_checker *ckfun_p|NN SV **ckobj_p
-Apd    |void   |cv_get_call_checker_flags|NN CV *cv|U32 gflags|NN Perl_call_checker *ckfun_p|NN SV **ckobj_p|NN U32 *ckflags_p
-Apd    |void   |cv_set_call_checker|NN CV *cv|NN Perl_call_checker ckfun|NN SV *ckobj
-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
-Axpd   |void   |wrap_keyword_plugin|NN Perl_keyword_plugin_t new_plugin|NN Perl_keyword_plugin_t *old_plugin_p
-CpR    |PERL_SI*|new_stackinfo|I32 stitems|I32 cxitems
-Apd    |char*  |scan_vstring   |NN const char *s|NN const char *const e \
-                               |NN SV *sv
-Apd    |const char*    |scan_version   |NN const char *s|NN SV *rv|bool qv
-Apd    |const char*    |prescan_version        |NN const char *s\
-       |bool strict|NULLOK const char** errstr|NULLOK bool *sqv\
-       |NULLOK int *ssaw_decimal|NULLOK int *swidth|NULLOK bool *salpha
-Apd    |SV*    |new_version    |NN SV *ver
-Apd    |SV*    |upg_version    |NN SV *ver|bool qv
-Apd    |SV*    |vverify        |NN SV *vs
-Apd    |SV*    |vnumify        |NN SV *vs
-Apd    |SV*    |vnormal        |NN SV *vs
-Apd    |SV*    |vstringify     |NN SV *vs
-Apd    |int    |vcmp           |NN SV *lhv|NN SV *rhv
+p      |int    |mode_from_discipline                                   \
+                               |NULLOK const char *s                   \
+                               |STRLEN len
+
+: Used in sv.c and hv.c
+Cop    |void * |more_bodies    |const svtype sv_type                   \
+                               |const size_t body_size                 \
+                               |const size_t arena_size
+Cp     |const char *|moreswitches                                      \
+                               |NN const char *s
+Adp    |void   |mortal_destructor_sv                                   \
+                               |NN SV *coderef                         \
+                               |NULLOK SV *args
+CRTXip |char * |mortal_getenv  |NN const char *str
+Cdp    |void   |mortal_svfunc_x|SVFUNC_t f                             \
+                               |NULLOK SV *p
+Adop   |const struct mro_alg *|mro_get_from_name                       \
+                               |NN SV *name
+Adp    |AV *   |mro_get_linear_isa                                     \
+                               |NN HV *stash
+
+Chop   |SV *   |mro_get_private_data                                   \
+                               |NN struct mro_meta * const smeta       \
+                               |NN const struct mro_alg * const which
+: Used in hv.c, mg.c, pp.c, sv.c
+dp     |void   |mro_isa_changed_in                                     \
+                               |NN HV *stash
+: Used in HvMROMETA(), which is public.
+Xop    |struct mro_meta *|mro_meta_init                                \
+                               |NN HV *stash
+Adp    |void   |mro_method_changed_in                                  \
+                               |NN HV *stash
+dep    |void   |mro_package_moved                                      \
+                               |NULLOK HV * const stash                \
+                               |NULLOK HV * const oldstash             \
+                               |NN const GV * const gv                 \
+                               |U32 flags
+Adop   |void   |mro_register   |NN const struct mro_alg *mro
+Adop   |void   |mro_set_mro    |NN struct mro_meta * const meta        \
+                               |NN SV * const name
+Adhop  |SV *   |mro_set_private_data                                   \
+                               |NN struct mro_meta * const smeta       \
+                               |NN const struct mro_alg * const which  \
+                               |NN SV * const data
+CRTip  |unsigned|msbit_pos32   |U32 word
+EXp    |SV *   |multiconcat_stringify                                  \
+                               |NN const OP *o
+EXp    |SV *   |multideref_stringify                                   \
+                               |NN const OP *o                         \
+                               |NULLOK CV *cv
+Adp    |NV     |my_atof        |NN const char *s
+Cop    |char * |my_atof2       |NN const char *orig                    \
+                               |NN NV *value
+Cp     |char * |my_atof3       |NN const char *orig                    \
+                               |NN NV *value                           \
+                               |const STRLEN len
+: Used in perly.y
+p      |OP *   |my_attrs       |NN OP *o                               \
+                               |NULLOK OP *attrs
+
+: Used in mg.c, sv.c
+ep     |void   |my_clearenv
+ATdp   |int    |my_dirfd       |NULLOK DIR *dir
+Adpr   |void   |my_exit        |U32 status
+Adpr   |void   |my_failure_exit
+Cdp    |I32    |my_fflush_all
+CTdp   |Pid_t  |my_fork
+m      |I32    |my_lstat
+Xp     |I32    |my_lstat_flags |NULLOK const U32 flags
+RTop   |int    |my_mkostemp_cloexec                                    \
+                               |NN char *templte                       \
+                               |int flags
+RTop   |int    |my_mkstemp_cloexec                                     \
+                               |NN char *templte
+Cdp    |PerlIO *|my_popen_list |NN const char *mode                    \
+                               |int n                                  \
+                               |NN SV **args
+Adp    |void   |my_setenv      |NULLOK const char *nam                 \
+                               |NULLOK const char *val
+
+AMTdfp |int    |my_snprintf    |NN char *buffer                        \
+                               |const Size_t len                       \
+                               |NN const char *format                  \
+                               |...
+CTdp   |int    |my_socketpair  |int family                             \
+                               |int type                               \
+                               |int protocol                           \
+                               |int fd[2]
+m      |I32    |my_stat
+Xp     |I32    |my_stat_flags  |NULLOK const U32 flags
+p      |const char *|my_strerror                                       \
+                               |const int errnum                       \
+                               |NN utf8ness_t *utf8ness
+Adfp   |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
+EXfp   |char * |my_strftime8_temp                                      \
+                               |NN const char *fmt                     \
+                               |int sec                                \
+                               |int min                                \
+                               |int hour                               \
+                               |int mday                               \
+                               |int mon                                \
+                               |int year                               \
+                               |int wday                               \
+                               |int yday                               \
+                               |int isdst                              \
+                               |NULLOK utf8ness_t *utf8ness
+ARTdp  |NV     |my_strtod      |NN const char * const s                \
+                               |NULLOK char **e
+: Used in pp_ctl.c
+p      |void   |my_unexec
+AMTdp  |int    |my_vsnprintf   |NN char *buffer                        \
+                               |const Size_t len                       \
+                               |NN const char *format                  \
+                               |va_list ap
+Ap     |OP *   |newANONATTRSUB |I32 floor                              \
+                               |NULLOK OP *proto                       \
+                               |NULLOK OP *attrs                       \
+                               |NULLOK OP *block
+ARp    |OP *   |newANONHASH    |NULLOK OP *o
+ARp    |OP *   |newANONLIST    |NULLOK OP *o
+Ap     |OP *   |newANONSUB     |I32 floor                              \
+                               |NULLOK OP *proto                       \
+                               |NULLOK OP *block
+ARdp   |OP *   |newARGDEFELEMOP|I32 flags                              \
+                               |NN OP *expr                            \
+                               |I32 argindex
+ARdp   |OP *   |newASSIGNOP    |I32 flags                              \
+                               |NULLOK OP *left                        \
+                               |I32 optype                             \
+                               |NULLOK OP *right
+Adm    |CV *   |newATTRSUB     |I32 floor                              \
+                               |NULLOK OP *o                           \
+                               |NULLOK OP *proto                       \
+                               |NULLOK OP *attrs                       \
+                               |NULLOK OP *block
+Xdp    |CV *   |newATTRSUB_x   |I32 floor                              \
+                               |NULLOK OP *o                           \
+                               |NULLOK OP *proto                       \
+                               |NULLOK OP *attrs                       \
+                               |NULLOK OP *block                       \
+                               |bool o_is_gv
+AMRbdp |AV *   |newAV
+ARdm   |AV *   |newAV_alloc_x  |SSize_t size
+ARdm   |AV *   |newAV_alloc_xz |SSize_t size
+ARdp   |AV *   |newAVav        |NULLOK AV *oav
+ARdp   |AV *   |newAVhv        |NULLOK HV *ohv
+ARp    |OP *   |newAVREF       |NN OP *o
+ARdp   |OP *   |newBINOP       |I32 type                               \
+                               |I32 flags                              \
+                               |NULLOK OP *first                       \
+                               |NULLOK OP *last
+ARdp   |OP *   |newCONDOP      |I32 flags                              \
+                               |NN OP *first                           \
+                               |NULLOK OP *trueop                      \
+                               |NULLOK OP *falseop
+Adp    |CV *   |newCONSTSUB    |NULLOK HV *stash                       \
+                               |NULLOK const char *name                \
+                               |NULLOK SV *sv
+Adp    |CV *   |newCONSTSUB_flags                                      \
+                               |NULLOK HV *stash                       \
+                               |NULLOK const char *name                \
+                               |STRLEN len                             \
+                               |U32 flags                              \
+                               |NULLOK SV *sv
+ARp    |OP *   |newCVREF       |I32 flags                              \
+                               |NULLOK OP *o
+ARdpx  |OP *   |newDEFEROP     |I32 flags                              \
+                               |NN OP *block
+ARdp   |OP *   |newDEFSVOP
+Cp     |void   |newFORM        |I32 floor                              \
+                               |NULLOK OP *o                           \
+                               |NULLOK OP *block
+ARdp   |OP *   |newFOROP       |I32 flags                              \
+                               |NULLOK OP *sv                          \
+                               |NN OP *expr                            \
+                               |NULLOK OP *block                       \
+                               |NULLOK OP *cont
+ARdp   |OP *   |newGIVENOP     |NN OP *cond                            \
+                               |NN OP *block                           \
+                               |PADOFFSET defsv_off
+: Used in scope.c
+eopx   |GP *   |newGP          |NN GV * const gv
+Adm    |GV *   |newGVgen       |NN const char *pack
+ARdp   |GV *   |newGVgen_flags |NN const char *pack                    \
+                               |U32 flags
+ARdp   |OP *   |newGVOP        |I32 type                               \
+                               |I32 flags                              \
+                               |NN GV *gv
+ARp    |OP *   |newGVREF       |I32 type                               \
+                               |NULLOK OP *o
+AMRbdp |HV *   |newHV
+ARdp   |HV *   |newHVhv        |NULLOK HV *hv
+ARp    |OP *   |newHVREF       |NN OP *o
+AMRbdp |IO *   |newIO
+ARdp   |OP *   |newLISTOP      |I32 type                               \
+                               |I32 flags                              \
+                               |NULLOK OP *first                       \
+                               |NULLOK OP *last
+ARdp   |OP *   |newLOGOP       |I32 optype                             \
+                               |I32 flags                              \
+                               |NN OP *first                           \
+                               |NN OP *other
+ARdp   |OP *   |newLOOPEX      |I32 type                               \
+                               |NN OP *label
+ARdp   |OP *   |newLOOPOP      |I32 flags                              \
+                               |I32 debuggable                         \
+                               |NN OP *expr                            \
+                               |NULLOK OP *block
+ARdp   |OP *   |newMETHOP      |I32 type                               \
+                               |I32 flags                              \
+                               |NN OP *dynamic_meth
+ARdp   |OP *   |newMETHOP_named|I32 type                               \
+                               |I32 flags                              \
+                               |NN SV * const_meth
+Cp     |CV *   |newMYSUB       |I32 floor                              \
+                               |NN OP *o                               \
+                               |NULLOK OP *proto                       \
+                               |NULLOK OP *attrs                       \
+                               |NULLOK OP *block
+ARdp   |OP *   |newNULLLIST
+ARdp   |OP *   |newOP          |I32 optype                             \
+                               |I32 flags
+ARTdpx |PADNAMELIST *|newPADNAMELIST                                   \
+                               |size_t max
+ARTdpx |PADNAME *|newPADNAMEouter                                      \
+                               |NN PADNAME *outer
+ARTdpx |PADNAME *|newPADNAMEpvn|NN const char *s                       \
+                               |STRLEN len
+ARdip  |OP *   |newPADxVOP     |I32 type                               \
+                               |I32 flags                              \
+                               |PADOFFSET padix
+ARdp   |OP *   |newPMOP        |I32 type                               \
+                               |I32 flags
+Cp     |void   |newPROG        |NN OP *o
+ARdp   |OP *   |newPVOP        |I32 type                               \
+                               |I32 flags                              \
+                               |NULLOK char *pv
+ARdp   |OP *   |newRANGE       |I32 flags                              \
+                               |NN OP *left                            \
+                               |NN OP *right
+ARdp   |SV *   |newRV          |NN SV * const sv
+ARdip  |SV *   |newRV_noinc    |NN SV * const tmpRef
+ARdp   |OP *   |newSLICEOP     |I32 flags                              \
+                               |NULLOK OP *subscript                   \
+                               |NULLOK OP *listop
+CRp    |PERL_SI *|new_stackinfo|I32 stitems                            \
+                               |I32 cxitems
+ARdp   |OP *   |newSTATEOP     |I32 flags                              \
+                               |NULLOK char *label                     \
+                               |NULLOK OP *o
+p      |CV *   |newSTUB        |NN GV *gv                              \
+                               |bool fake
+AMbdp  |CV *   |newSUB         |I32 floor                              \
+                               |NULLOK OP *o                           \
+                               |NULLOK OP *proto                       \
+                               |NULLOK OP *block
+ARdp   |SV *   |newSV          |const STRLEN len
+Rp     |SV *   |newSVavdefelem |NN AV *av                              \
+                               |SSize_t ix                             \
+                               |bool extendible
+ARdp   |SV *   |newSVbool      |const bool bool_val
+ARdp   |SV *   |newSV_false
+ARdp   |SV *   |newSVhek       |NULLOK const HEK * const hek
+ARdp   |SV *   |newSVhek_mortal|NULLOK const HEK * const hek
+ARdp   |SV *   |newSViv        |const IV i
+ARdp   |SV *   |newSVnv        |const NV n
+ARdp   |OP *   |newSVOP        |I32 type                               \
+                               |I32 flags                              \
+                               |NN SV *sv
+ARdp   |SV *   |newSVpv        |NULLOK const char * const s            \
+                               |const STRLEN len
+ARdfp  |SV *   |newSVpvf       |NN const char * const pat              \
+                               |...
+ARdp   |SV *   |newSVpvn       |NULLOK const char * const buffer       \
+                               |const STRLEN len
+ARdp   |SV *   |newSVpvn_flags |NULLOK const char * const s            \
+                               |const STRLEN len                       \
+                               |const U32 flags
+ARdp   |SV *   |newSVpvn_share |NULLOK const char *s                   \
+                               |I32 len                                \
+                               |U32 hash
+ARdp   |SV *   |newSVpv_share  |NULLOK const char *s                   \
+                               |U32 hash
+ARp    |OP *   |newSVREF       |NN OP *o
+Adp    |SV *   |newSVrv        |NN SV * const rv                       \
+                               |NULLOK const char * const classname
+AMRbdp |SV *   |newSVsv        |NULLOK SV * const old
+ARdp   |SV *   |newSVsv_flags  |NULLOK SV * const old                  \
+                               |I32 flags
+ARdm   |SV *   |newSVsv_nomg   |NULLOK SV * const old
+ARdp   |SV *   |newSV_true
+ARdip  |SV *   |newSV_type     |const svtype type
+AIRdp  |SV *   |newSV_type_mortal                                      \
+                               |const svtype type
+ARdp   |SV *   |newSVuv        |const UV u
+ARdpx  |OP *   |newTRYCATCHOP  |I32 flags                              \
+                               |NN OP *tryblock                        \
+                               |NN OP *catchvar                        \
+                               |NN OP *catchblock
+ARdp   |OP *   |newUNOP        |I32 type                               \
+                               |I32 flags                              \
+                               |NULLOK OP *first
+ARdp   |OP *   |newUNOP_AUX    |I32 type                               \
+                               |I32 flags                              \
+                               |NULLOK OP *first                       \
+                               |NULLOK UNOP_AUX_item *aux
+Adp    |SV *   |new_version    |NN SV *ver
+: FIXME - exported for ByteLoader - public or private?
+ERXopx |char * |new_warnings_bitfield                                  \
+                               |NULLOK char *buffer                    \
+                               |NN const char * const bits             \
+                               |STRLEN size
+ARdp   |OP *   |newWHENOP      |NULLOK OP *cond                        \
+                               |NN OP *block
+ARdp   |OP *   |newWHILEOP     |I32 flags                              \
+                               |I32 debuggable                         \
+                               |NULLOK LOOP *loop                      \
+                               |NULLOK OP *expr                        \
+                               |NULLOK OP *block                       \
+                               |NULLOK OP *cont                        \
+                               |I32 has_my
+AUdp   |CV *   |newXS          |NULLOK const char *name                \
+                               |NN XSUBADDR_t subaddr                  \
+                               |NN const char *filename
+Xp     |CV *   |newXS_deffile  |NN 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
+dp     |CV *   |newXS_len_flags|NULLOK const char *name                \
+                               |STRLEN len                             \
+                               |NN XSUBADDR_t subaddr                  \
+                               |NULLOK const char * const filename     \
+                               |NULLOK const char * const proto        \
+                               |NULLOK SV ** const_svp                 \
+                               |U32 flags
 : Used in pp_hot.c and pp_sys.c
-p      |PerlIO*|nextargv       |NN GV* gv|bool nomagicopen
-AdMTpP |char*  |ninstr         |NN const char* big|NN const char* bigend \
-                               |NN const char* little|NN const char* lend
-Apd    |void   |op_free        |NULLOK OP* arg
-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
-p      |void   |opslab_force_free|NN OPSLAB *slab
-#endif
+p      |PerlIO *|nextargv      |NN GV *gv                              \
+                               |bool nomagicopen
+AMPTdp |char * |ninstr         |NN const char *big                     \
+                               |NN const char *bigend                  \
+                               |NN const char *little                  \
+                               |NN const char *lend
+
+p      |void   |no_bareword_filehandle                                 \
+                               |NN const char *fhname
+Tefpr  |void   |noperl_die     |NN const char *pat                     \
+                               |...
+Adp    |int    |nothreadhook
+p      |void   |notify_parser_that_changed_to_utf8
 : Used in perly.y
-p      |void   |package        |NN OP* o
+Rp     |OP *   |oopsAV         |NN OP *o
 : Used in perly.y
-p      |void   |package_version|NN OP* v
-: Used in toke.c and perly.y
-p      |PADOFFSET|allocmy      |NN const char *const name|const STRLEN len\
-                               |const U32 flags
-#ifdef USE_ITHREADS
-Adxp   |PADOFFSET|alloccopstash|NN HV *hv
-#endif
+Rp     |OP *   |oopsHV         |NN OP *o
+Adp    |OP *   |op_append_elem |I32 optype                             \
+                               |NULLOK OP *first                       \
+                               |NULLOK OP *last
+Adp    |OP *   |op_append_list |I32 optype                             \
+                               |NULLOK OP *first                       \
+                               |NULLOK OP *last
+Adp    |OPclass|op_class       |NULLOK const OP *o
+: FIXME. Used by Data::Alias
+EXp    |void   |op_clear       |NN OP *o
+Adp    |OP *   |op_contextualize                                       \
+                               |NN OP *o                               \
+                               |I32 context
+: Used in perly.y
+ARdp   |OP *   |op_convert_list|I32 optype                             \
+                               |I32 flags                              \
+                               |NULLOK OP *o
+Adp    |void   |op_dump        |NN const OP *o
+; Used in op.c and class.c
+Adp    |OP *   |op_force_list  |NULLOK OP *o
+Adp    |void   |op_free        |NULLOK OP *arg
+Adp    |OP *   |op_linklist    |NN OP *o
+Admx   |OP *   |op_lvalue      |NULLOK OP *o                           \
+                               |I32 type
+Xop    |OP *   |op_lvalue_flags|NULLOK OP *o                           \
+                               |I32 type                               \
+                               |U32 flags
+: Used in various files
+Adp    |void   |op_null        |NN OP *o
+ATdp   |OP *   |op_parent      |NN OP *o
+Adp    |OP *   |op_prepend_elem|I32 optype                             \
+                               |NULLOK OP *first                       \
+                               |NULLOK OP *last
+Cdp    |void   |op_refcnt_lock
+Cdp    |void   |op_refcnt_unlock
+Adpx   |OP *   |op_scope       |NULLOK OP *o
+ATdp   |OP *   |op_sibling_splice                                      \
+                               |NULLOK OP *parent                      \
+                               |NULLOK OP *start                       \
+                               |int del_count                          \
+                               |NULLOK OP *insert
+px     |OP *   |op_unscope     |NULLOK OP *o
+ARdpx  |OP *   |op_wrap_finally|NN OP *block                           \
+                               |NN OP *finally
 : Used in perly.y
-pR     |OP*    |oopsAV         |NN OP* o
+p      |void   |package        |NN OP *o
 : Used in perly.y
-pR     |OP*    |oopsHV         |NN OP* o
+p      |void   |package_version|NN OP *v
+Adp    |void   |packlist       |NN SV *cat                             \
+                               |NN const char *pat                     \
+                               |NN const char *patend                  \
+                               |NN SV **beglist                        \
+                               |NN SV **endlist
+Adp    |PADOFFSET|pad_add_anon |NN CV *func                            \
+                               |I32 optype
+Adp    |PADOFFSET|pad_add_name_pv                                      \
+                               |NN const char *name                    \
+                               |const U32 flags                        \
+                               |NULLOK HV *typestash                   \
+                               |NULLOK HV *ourstash
+Adp    |PADOFFSET|pad_add_name_pvn                                     \
+                               |NN const char *namepv                  \
+                               |STRLEN namelen                         \
+                               |U32 flags                              \
+                               |NULLOK HV *typestash                   \
+                               |NULLOK HV *ourstash
+Adp    |PADOFFSET|pad_add_name_sv                                      \
+                               |NN SV *name                            \
+                               |U32 flags                              \
+                               |NULLOK HV *typestash                   \
+                               |NULLOK HV *ourstash
+p      |void   |pad_add_weakref|NN CV *func
+Adpx   |PADOFFSET|pad_alloc    |I32 optype                             \
+                               |U32 tmptype
+dp     |void   |pad_block_start|int full
+Adp    |PADOFFSET|pad_findmy_pv|NN const char *name                    \
+                               |U32 flags
+Adp    |PADOFFSET|pad_findmy_pvn                                       \
+                               |NN const char *namepv                  \
+                               |STRLEN namelen                         \
+                               |U32 flags
+Adp    |PADOFFSET|pad_findmy_sv|NN SV *name                            \
+                               |U32 flags
+dp     |void   |pad_fixup_inner_anons                                  \
+                               |NN PADLIST *padlist                    \
+                               |NN CV *old_cv                          \
+                               |NN CV *new_cv
+dp     |void   |pad_free       |PADOFFSET po
+dp     |OP *   |pad_leavemy
+p      |PAD ** |padlist_store  |NN PADLIST *padlist                    \
+                               |I32 key                                \
+                               |NULLOK PAD *val
+Xop    |void   |padname_free   |NN PADNAME *pn
+ARTdpx |PADNAME *|padnamelist_fetch                                    \
+                               |NN PADNAMELIST *pnl                    \
+                               |SSize_t key
+Xop    |void   |padnamelist_free                                       \
+                               |NN PADNAMELIST *pnl
+Adpx   |PADNAME **|padnamelist_store                                   \
+                               |NN PADNAMELIST *pnl                    \
+                               |SSize_t key                            \
+                               |NULLOK PADNAME *val
+
+: pad API
+ARdp   |PADLIST *|pad_new      |int flags
+Xdp    |void   |pad_push       |NN PADLIST *padlist                    \
+                               |int depth
+dp     |void   |pad_swipe      |PADOFFSET po                           \
+                               |bool refadjust
+Adpx   |void   |pad_tidy       |padtidy_type type
+: Public parser API
+Adpx   |OP *   |parse_arithexpr|U32 flags
+Adpx   |OP *   |parse_barestmt |U32 flags
+Adpx   |OP *   |parse_block    |U32 flags
+Adpx   |OP *   |parse_fullexpr |U32 flags
+Adpx   |OP *   |parse_fullstmt |U32 flags
+Adpx   |SV *   |parse_label    |U32 flags
+Adpx   |OP *   |parse_listexpr |U32 flags
+: Only used in scope.c
+p      |void   |parser_free    |NN const yy_parser *parser
+Adpx   |OP *   |parse_stmtseq  |U32 flags
+Adpx   |OP *   |parse_subsignature                                     \
+                               |U32 flags
+Adpx   |OP *   |parse_termexpr |U32 flags
+: Used in locale.c and perl.c
+p      |U32    |parse_unicode_opts                                     \
+                               |NN const char **popt
 
 : peephole optimiser
-p      |void   |peep           |NULLOK OP* o
-p      |void   |rpeep          |NULLOK OP* o
-: Defined in doio.c, used only in pp_hot.c
-dopx   |PerlIO*|start_glob     |NN SV *tmpglob|NN IO *io
+p      |void   |peep           |NULLOK OP *o
 
-Cp     |void   |reentrant_size
-Cp     |void   |reentrant_init
-Cp     |void   |reentrant_free
-CFTp   |void*  |reentrant_retry|NN const char *f|...
+ATdo   |PerlInterpreter *|perl_alloc
+ATdo   |void   |perl_construct |NN PerlInterpreter *my_perl
 
-: "Very" special - can't use the O flag for this one:
-: (The rename from perl_atexit to Perl_call_atexit was in 864dbfa3ca8032ef)
-Apd    |void   |call_atexit    |ATEXIT_t fn|NULLOK void *ptr
-ApdO   |I32    |call_argv      |NN const char* sub_name|I32 flags|NN char** argv
-ApdO   |I32    |call_method    |NN const char* methname|I32 flags
-ApdO   |I32    |call_pv        |NN const char* sub_name|I32 flags
-ApdO   |I32    |call_sv        |NN SV* sv|volatile I32 flags
-Cp     |void   |despatch_signals
-Cp     |OP *   |doref          |NN OP *o|I32 type|bool set_op_ref
-ApdO   |SV*    |eval_pv        |NN const char* p|I32 croak_on_error
-ApdO   |I32    |eval_sv        |NN SV* sv|I32 flags
-ApdO   |SV*    |get_sv         |NN const char *name|I32 flags
-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
-ATdo   |const char*|Perl_setlocale|const int category|NULLOK const char* locale
-#if defined(HAS_NL_LANGINFO) && defined(PERL_LANGINFO_H)
-ATdo   |const char*|Perl_langinfo|const nl_item item
-#else
-ATdo   |const char*|Perl_langinfo|const int item
-#endif
-CpO    |int    |init_i18nl10n  |int printwarn
-CbpOD  |int    |init_i18nl14n  |int printwarn
-p      |char*  |my_strerror    |const int errnum
-XpT    |void   |_warn_problematic_locale
-Xp     |void   |set_numeric_underlying
-Xp     |void   |set_numeric_standard
-Cp     |bool   |_is_in_locale_category|const bool compiling|const int category
-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
-AbpdD  |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
-#endif
+: The reason for the 'u' flag is that this passes "aTHX_ x" to its callee: not
+: a legal C parameter
+Admu   |const XOP *|Perl_custom_op_xop                                 \
+                               |NN const OP *o
+ATdo   |int    |perl_destruct  |NN PerlInterpreter *my_perl
+ATdo   |void   |perl_free      |NN PerlInterpreter *my_perl
+
+Cop    |const char *|PerlIO_context_layers                             \
+                               |NULLOK const char *mode
+p      |int    |PerlLIO_dup2_cloexec                                   \
+                               |int oldfd                              \
+                               |int newfd
+Rp     |int    |PerlLIO_dup_cloexec                                    \
+                               |int oldfd
+Rp     |int    |PerlLIO_open3_cloexec                                  \
+                               |NN const char *file                    \
+                               |int flag                               \
+                               |int perm
+Rp     |int    |PerlLIO_open_cloexec                                   \
+                               |NN const char *file                    \
+                               |int flag
+Ado    |HV *   |Perl_localeconv
+ATdo   |int    |perl_parse     |NN PerlInterpreter *my_perl            \
+                               |XSINIT_t xsinit                        \
+                               |int argc                               \
+                               |NULLOK char **argv                     \
+                               |NULLOK char **env
+ATdo   |int    |perl_run       |NN PerlInterpreter *my_perl
+ATdo   |const char *|Perl_setlocale                                    \
+                               |const int category                     \
+                               |NULLOK const char *locale
+CTp    |Signal_t|perly_sighandler                                      \
+                               |int sig                                \
+                               |NULLOK Siginfo_t *info                 \
+                               |NULLOK void *uap                       \
+                               |bool safe
+
+Adm    |const char * const|phase_name                                  \
+                               |enum perl_phase
+Adp    |void   |pmop_dump      |NULLOK PMOP *pm
 : 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
-#endif
-p      |void   |invmap_dump    |NN SV* invlist|NN UV * map
-Cpd    |void   |pop_scope
-Cpd    |void   |push_scope
-#if defined(PERL_IN_PERLY_C) || defined(PERL_IN_OP_C) || defined(PERL_IN_TOKE_C)
-pMb    |OP*    |ref            |NULLOK OP* o|I32 type
-#endif
-#if defined(PERL_IN_OP_C)
-S      |OP*    |refkids        |NULLOK OP* o|I32 type
-#endif
+p      |OP *   |pmruntime      |NN OP *o                               \
+                               |NN OP *expr                            \
+                               |NULLOK OP *repl                        \
+                               |UV flags                               \
+                               |I32 floor
+Xiop   |I32    |POPMARK
+Cdp    |void   |pop_scope
+
+: Used in perl.c and toke.c
+Fop    |void   |populate_isa   |NN const char *name                    \
+                               |STRLEN len                             \
+                               |...
+Adhp   |REGEXP *|pregcomp      |NN SV * const pattern                  \
+                               |const U32 flags
+Adhp   |I32    |pregexec       |NN REGEXP * const prog                 \
+                               |NN char *stringarg                     \
+                               |NN char *strend                        \
+                               |NN char *strbeg                        \
+                               |SSize_t minend                         \
+                               |NN SV *screamer                        \
+                               |U32 nosave
+Cp     |void   |pregfree       |NULLOK REGEXP *r
+Cp     |void   |pregfree2      |NN REGEXP *rx
+Adp    |const char *|prescan_version                                   \
+                               |NN const char *s                       \
+                               |bool strict                            \
+                               |NULLOK const char **errstr             \
+                               |NULLOK bool *sqv                       \
+                               |NULLOK int *ssaw_decimal               \
+                               |NULLOK int *swidth                     \
+                               |NULLOK bool *salpha
+ARdp   |void * |ptr_table_fetch|NN PTR_TBL_t * const tbl               \
+                               |NULLOK const void * const sv
+Adp    |void   |ptr_table_free |NULLOK PTR_TBL_t * const tbl
+ARdp   |PTR_TBL_t *|ptr_table_new
+Adp    |void   |ptr_table_split|NN PTR_TBL_t * const tbl
+Adp    |void   |ptr_table_store|NN PTR_TBL_t * const tbl               \
+                               |NULLOK const void * const oldsv        \
+                               |NN void * const newsv
+Cdp    |void   |push_scope
+Adp    |char * |pv_display     |NN SV *dsv                             \
+                               |NN const char *pv                      \
+                               |STRLEN cur                             \
+                               |STRLEN len                             \
+                               |STRLEN pvlim
+Adp    |char * |pv_escape      |NULLOK SV *dsv                         \
+                               |NN char const * const str              \
+                               |const STRLEN count                     \
+                               |STRLEN max                             \
+                               |NULLOK STRLEN * const escaped          \
+                               |U32 flags
+Adp    |char * |pv_pretty      |NN SV *dsv                             \
+                               |NN char const * const str              \
+                               |const STRLEN count                     \
+                               |const STRLEN max                       \
+                               |NULLOK char const * const start_color  \
+                               |NULLOK char const * const end_color    \
+                               |const U32 flags
+Adp    |char * |pv_uni_display |NN SV *dsv                             \
+                               |NN const U8 *spv                       \
+                               |STRLEN len                             \
+                               |STRLEN pvlim                           \
+                               |UV flags
+: FIXME - either make it public, or stop exporting it. (Data::Alias uses this)
+: Used in gv.c, op.c, toke.c
+EXp    |void   |qerror         |NULLOK SV *err
+Adp    |char * |rcpv_copy      |NULLOK char * const pv
+Adp    |char * |rcpv_free      |NULLOK char * const pv
+Aadp   |char * |rcpv_new       |NULLOK const char * const pv           \
+                               |STRLEN len                             \
+                               |U32 flags
+CRTdop |Malloc_t|realloc       |Malloc_t where                         \
+                               |MEM_SIZE nbytes
+CTiop  |struct regexp *|ReANY  |NN const REGEXP * const re
+Adp    |REGEXP *|re_compile    |NN SV * const pattern                  \
+                               |U32 orig_rx_flags
+Cp     |void   |reentrant_free
+Cp     |void   |reentrant_init
+CFTp   |void * |reentrant_retry|NN const char *f                       \
+                               |...
 
-ATpd   |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
-Apd    |Sighandler_t|rsignal   |int i|Sighandler_t t
+Cp     |void   |reentrant_size
+Xdp    |HV *   |refcounted_he_chain_2hv                                \
+                               |NULLOK const struct refcounted_he *c   \
+                               |U32 flags
+Xdp    |SV *   |refcounted_he_fetch_pv                                         \
+                               |NULLOK const struct refcounted_he *chain       \
+                               |NN const char *key                             \
+                               |U32 hash                                       \
+                               |U32 flags
+Xdp    |SV *   |refcounted_he_fetch_pvn                                        \
+                               |NULLOK const struct refcounted_he *chain       \
+                               |NN const char *keypv                           \
+                               |STRLEN keylen                                  \
+                               |U32 hash                                       \
+                               |U32 flags
+Xdp    |SV *   |refcounted_he_fetch_sv                                         \
+                               |NULLOK const struct refcounted_he *chain       \
+                               |NN SV *key                                     \
+                               |U32 hash                                       \
+                               |U32 flags
+Xdp    |void   |refcounted_he_free                                     \
+                               |NULLOK struct refcounted_he *he
+Xdp    |struct refcounted_he *|refcounted_he_inc                       \
+                               |NULLOK struct refcounted_he *he
+Xdp    |struct refcounted_he *|refcounted_he_new_pv                    \
+                               |NULLOK struct refcounted_he *parent    \
+                               |NN const char *key                     \
+                               |U32 hash                               \
+                               |NULLOK SV *value                       \
+                               |U32 flags
+Xdp    |struct refcounted_he *|refcounted_he_new_pvn                   \
+                               |NULLOK struct refcounted_he *parent    \
+                               |NN const char *keypv                   \
+                               |STRLEN keylen                          \
+                               |U32 hash                               \
+                               |NULLOK SV *value                       \
+                               |U32 flags
+Xdp    |struct refcounted_he *|refcounted_he_new_sv                    \
+                               |NULLOK struct refcounted_he *parent    \
+                               |NN SV *key                             \
+                               |U32 hash                               \
+                               |NULLOK SV *value                       \
+                               |U32 flags
+Cp     |void   |regdump        |NN const regexp *r
+Cp     |I32    |regexec_flags  |NN REGEXP * const rx                   \
+                               |NN char *stringarg                     \
+                               |NN char *strend                        \
+                               |NN char *strbeg                        \
+                               |SSize_t minend                         \
+                               |NN SV *sv                              \
+                               |NULLOK void *data                      \
+                               |U32 flags
+Cp     |void   |regfree_internal                                       \
+                               |NN REGEXP * const rx
+Cp     |void   |reginitcolors
+EXp    |SV *   |reg_named_buff |NN REGEXP * const rx                   \
+                               |NULLOK SV * const key                  \
+                               |NULLOK SV * const value                \
+                               |const U32 flags
+Cp     |SV *   |reg_named_buff_all                                     \
+                               |NN REGEXP * const rx                   \
+                               |const U32 flags
+Cp     |bool   |reg_named_buff_exists                                  \
+                               |NN REGEXP * const rx                   \
+                               |NN SV * const key                      \
+                               |const U32 flags
+Cp     |SV *   |reg_named_buff_fetch                                   \
+                               |NN REGEXP * const rx                   \
+                               |NN SV * const namesv                   \
+                               |const U32 flags
+Cp     |SV *   |reg_named_buff_firstkey                                \
+                               |NN REGEXP * const rx                   \
+                               |const U32 flags
+EXp    |SV *   |reg_named_buff_iter                                    \
+                               |NN REGEXP * const rx                   \
+                               |NULLOK const SV * const lastkey        \
+                               |const U32 flags
+Cp     |SV *   |reg_named_buff_nextkey                                 \
+                               |NN REGEXP * const rx                   \
+                               |const U32 flags
+Cp     |SV *   |reg_named_buff_scalar                                  \
+                               |NN REGEXP * const rx                   \
+                               |const U32 flags
+: FIXME - is anything in re using this now?
+EXp    |void   |reg_numbered_buff_fetch                                \
+                               |NN REGEXP * const re                   \
+                               |const I32 paren                        \
+                               |NULLOK SV * const sv
+
+: FIXME - is anything in re using this now?
+EXp    |void   |reg_numbered_buff_fetch_flags                          \
+                               |NN REGEXP * const re                   \
+                               |const I32 paren                        \
+                               |NULLOK SV * const sv                   \
+                               |U32 flags
+: FIXME - is anything in re using this now?
+EXp    |I32    |reg_numbered_buff_length                               \
+                               |NN REGEXP * const rx                   \
+                               |NN const SV * const sv                 \
+                               |const I32 paren
+: FIXME - is anything in re using this now?
+EXp    |void   |reg_numbered_buff_store                                \
+                               |NN REGEXP * const rx                   \
+                               |const I32 paren                        \
+                               |NULLOK SV const * const value
+
+: FIXME - is anything in re using this now?
+EXp    |SV *   |reg_qr_package |NN REGEXP * const rx
+: FIXME - is anything in re using this now?
+EXp    |REGEXP *|reg_temp_copy |NULLOK REGEXP *dsv                     \
+                               |NN REGEXP *ssv
+Cp     |char * |re_intuit_start|NN REGEXP * const rx                   \
+                               |NULLOK SV *sv                          \
+                               |NN const char * const strbeg           \
+                               |NN char *strpos                        \
+                               |NN char *strend                        \
+                               |const U32 flags                        \
+                               |NULLOK re_scream_pos_data *data
+Cp     |SV *   |re_intuit_string                                       \
+                               |NN REGEXP  * const r
+Xp     |REGEXP *|re_op_compile |NULLOK SV ** const patternp            \
+                               |int pat_count                          \
+                               |NULLOK OP *expr                        \
+                               |NN const regexp_engine *eng            \
+                               |NULLOK REGEXP *old_re                  \
+                               |NULLOK bool *is_bare_re                \
+                               |const U32 rx_flags                     \
+                               |const U32 pm_flags
+
+ATdp   |void   |repeatcpy      |NN char *to                            \
+                               |NN const char *from                    \
+                               |I32 len                                \
+                               |IV count
+: Used in doio.c, pp_hot.c, pp_sys.c
+p      |void   |report_evil_fh |NULLOK const GV *gv
+: Used in mg.c, pp.c, pp_hot.c, regcomp.c
+EXdp   |void   |report_uninit  |NULLOK const SV *uninit_sv
+: Used in doio.c, pp_hot.c, pp_sys.c
+p      |void   |report_wrongway_fh                                     \
+                               |NULLOK const GV *gv                    \
+                               |const char have
+AOdp   |void   |require_pv     |NN const char *pv
+AMp    |void   |resume_compcv  |NN struct suspended_compcv *buffer     \
+                               |bool save
+dm     |void   |resume_compcv_and_save                                 \
+                               |NN struct suspended_compcv *buffer
+dm     |void   |resume_compcv_final                                    \
+                               |NN struct suspended_compcv *buffer
+APTdp  |char * |rninstr        |NN const char *big                     \
+                               |NN const char *bigend                  \
+                               |NN const char *little                  \
+                               |NN const char *lend
+p      |void   |rpeep          |NULLOK OP *o
+Adp    |Sighandler_t|rsignal   |int i                                  \
+                               |Sighandler_t t
 : Used in pp_sys.c
-p      |int    |rsignal_restore|int i|NULLOK Sigsave_t* t
+p      |int    |rsignal_restore|int i                                  \
+                               |NULLOK Sigsave_t *t
 : Used in pp_sys.c
-p      |int    |rsignal_save   |int i|Sighandler_t t1|NN Sigsave_t* save
-Apd    |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
-#endif
+p      |int    |rsignal_save   |int i                                  \
+                               |Sighandler_t t1                        \
+                               |NN Sigsave_t *save
+Adp    |Sighandler_t|rsignal_state                                     \
+                               |int i
+Cdhp   |int    |runops_debug
+Cdhp   |int    |runops_standard
+Adp    |CV *   |rv2cv_op_cv    |NN OP *cvop                            \
+                               |U32 flags
 : Used in pp_hot.c
-p      |void   |rxres_save     |NN void **rsp|NN REGEXP *rx
-#if !defined(HAS_RENAME)
-: Used in pp_sys.c
-p      |I32    |same_dirent    |NN const char* a|NN const char* b
-#endif
-Apda   |char*  |savepv         |NULLOK const char* pv
-Apda   |char*  |savepvn        |NULLOK const char* pv|Size_t len
-Apda   |char*  |savesharedpv   |NULLOK const char* pv
-
-: NULLOK only to suppress a compiler warning
-Apda   |char*  |savesharedpvn  |NULLOK const char *const pv \
-                               |const STRLEN len
-Apda   |char*  |savesharedsvpv |NN SV *sv
-Apda   |char*  |savesvpv       |NN SV* sv
-Cp     |void   |savestack_grow
-Cp     |void   |savestack_grow_cnt     |I32 need
-Am     |void   |save_aelem     |NN AV* av|SSize_t idx|NN SV **sptr
-Ap     |void   |save_aelem_flags|NN AV* av|SSize_t idx|NN SV **sptr \
-                                |const U32 flags
-Cpd    |I32    |save_alloc     |I32 size|I32 pad
-Apdh   |void   |save_aptr      |NN AV** aptr
-Apdh   |AV*    |save_ary       |NN GV* gv
-Cp     |void   |save_bool      |NN bool* boolp
-Cp     |void   |save_clearsv   |NN SV** svp
-Cp     |void   |save_delete    |NN HV *hv|NN char *key|I32 klen
-Cpd    |void   |save_hdelete   |NN HV *hv|NN SV *keysv
-Cpd    |void   |save_adelete   |NN AV *av|SSize_t key
-Cp     |void   |save_destructor|DESTRUCTORFUNC_NOCONTEXT_t f|NN void* p
-Cp     |void   |save_destructor_x|DESTRUCTORFUNC_t f|NULLOK void* p
-CpMb   |void   |save_freesv    |NULLOK SV* sv
+p      |void   |rxres_save     |NN void **rsp                          \
+                               |NN REGEXP *rx
+ATadp  |Malloc_t|safesyscalloc |MEM_SIZE elements                      \
+                               |MEM_SIZE size
+ATdp   |Free_t |safesysfree    |Malloc_t where
+ATadp  |Malloc_t|safesysmalloc |MEM_SIZE nbytes
+ARTdp  |Malloc_t|safesysrealloc|Malloc_t where                         \
+                               |MEM_SIZE nbytes
+Cdp    |void   |save_adelete   |NN AV *av                              \
+                               |SSize_t key
+Adm    |void   |save_aelem     |NN AV *av                              \
+                               |SSize_t idx                            \
+                               |NN SV **sptr
+Adp    |void   |save_aelem_flags                                       \
+                               |NN AV *av                              \
+                               |SSize_t idx                            \
+                               |NN SV **sptr                           \
+                               |const U32 flags
+Cdp    |SSize_t|save_alloc     |SSize_t size                           \
+                               |I32 pad
+Adhp   |void   |save_aptr      |NN AV **aptr
+Adhp   |AV *   |save_ary       |NN GV *gv
+Cp     |void   |save_bool      |NN bool *boolp
+Cp     |void   |save_clearsv   |NN SV **svp
+Cp     |void   |save_delete    |NN HV *hv                              \
+                               |NN char *key                           \
+                               |I32 klen
+Cp     |void   |save_destructor|DESTRUCTORFUNC_NOCONTEXT_t f           \
+                               |NN void *p
+Cp     |void   |save_destructor_x                                      \
+                               |DESTRUCTORFUNC_t f                     \
+                               |NULLOK void *p
 : Used in SAVEFREOP(), used in op.c, pp_ctl.c
-CpMb   |void   |save_freeop    |NULLOK OP* o
-CpMb   |void   |save_freepv    |NULLOK char* pv
-Cpd    |void   |save_generic_svref|NN SV** sptr
-Cpd    |void   |save_generic_pvref|NN char** str
-Cpd    |void   |save_shared_pvref|NN char** str
-Adp    |void   |save_gp        |NN GV* gv|I32 empty
-Apdh   |HV*    |save_hash      |NN GV* gv
-Cpd    |void   |save_hints
-Am     |void   |save_helem     |NN HV *hv|NN SV *key|NN SV **sptr
-Ap     |void   |save_helem_flags|NN HV *hv|NN SV *key|NN SV **sptr|const U32 flags
-Apdh   |void   |save_hptr      |NN HV** hptr
-Cp     |void   |save_I16       |NN I16* intp
-Cp     |void   |save_I32       |NN I32* intp
-Cp     |void   |save_I8        |NN I8* bytep
-Cp     |void   |save_int       |NN int* intp
-Apdh   |void   |save_item      |NN SV* item
+CMbp   |void   |save_freeop    |NULLOK OP *o
+CMbp   |void   |save_freepv    |NULLOK char *pv
+Cdp    |void   |save_freercpv  |NN char *rcpv
+CMbp   |void   |save_freesv    |NULLOK SV *sv
+Cdp    |void   |save_generic_pvref                                     \
+                               |NN char **str
+Cdp    |void   |save_generic_svref                                     \
+                               |NN SV **sptr
+Adp    |void   |save_gp        |NN GV *gv                              \
+                               |I32 empty
+Adhp   |HV *   |save_hash      |NN GV *gv
+Cdp    |void   |save_hdelete   |NN HV *hv                              \
+                               |NN SV *keysv
+Adm    |void   |save_helem     |NN HV *hv                              \
+                               |NN SV *key                             \
+                               |NN SV **sptr
+Adp    |void   |save_helem_flags                                       \
+                               |NN HV *hv                              \
+                               |NN SV *key                             \
+                               |NN SV **sptr                           \
+                               |const U32 flags
+Cdp    |void   |save_hints
+Adhp   |void   |save_hptr      |NN HV **hptr
+Cp     |void   |save_I16       |NN I16 *intp
+Cp     |void   |save_I32       |NN I32 *intp
+Cp     |void   |save_I8        |NN I8 *bytep
+Cp     |void   |save_int       |NN int *intp
+Adhp   |void   |save_item      |NN SV *item
 Cp     |void   |save_iv        |NN IV *ivp
-AbpDdh |void   |save_list      |NN SV** sarg|I32 maxsarg
-CbpD   |void   |save_long      |NN long* longp
-CpMb   |void   |save_mortalizesv|NN SV* sv
-AbpD   |void   |save_nogv      |NN GV* gv
+CMbp   |void   |save_mortalizesv                                       \
+                               |NN SV *sv
 : Used in SAVEFREOP(), used in gv.c, op.c, perl.c, pp_ctl.c, pp_sort.c
-CpMbd  |void   |save_op
-Apdh   |SV*    |save_scalar    |NN GV* gv
-Cp     |void   |save_pptr      |NN char** pptr
-Cpd    |void   |save_vptr      |NN void *ptr
-Cp     |void   |save_re_context
-Cpd    |void   |save_padsv_and_mortalize|PADOFFSET off
-Cp     |void   |save_sptr      |NN SV** sptr
-Xp     |void   |save_strlen    |NN STRLEN* ptr
-Apdh   |SV*    |save_svref     |NN SV** sptr
-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
+CMbdp  |void   |save_op
+Cdp    |void   |save_padsv_and_mortalize                               \
+                               |PADOFFSET off
+Cp     |void   |save_pptr      |NN char **pptr
+Cp     |void   |save_pushi32ptr|const I32 i                            \
+                               |NULLOK void * const ptr                \
+                               |const int type
+Cdp    |void   |save_pushptr   |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 \
-                               |NULLOK void *const ptr2|const int type
-#endif
-Xiop   |I32    |TOPMARK
-Xiop   |I32    |POPMARK
+Cp     |void   |save_pushptrptr|NULLOK void * const ptr1               \
+                               |NULLOK void * const ptr2               \
+                               |const int type
+Aadip  |char * |savepv         |NULLOK const char *pv
+Aadip  |char * |savepvn        |NULLOK const char *pv                  \
+                               |Size_t len
+Cdp    |void   |save_rcpv      |NN char **prcpv
+Cp     |void   |save_re_context
+Adhp   |SV *   |save_scalar    |NN GV *gv
+Cdp    |void   |save_set_svflags                                       \
+                               |NN SV *sv                              \
+                               |U32 mask                               \
+                               |U32 val
+Aadp   |char * |savesharedpv   |NULLOK const char *pv
+
+: NULLOK only to suppress a compiler warning
+Aadp   |char * |savesharedpvn  |NULLOK const char * const pv           \
+                               |const STRLEN len
+Cdp    |void   |save_shared_pvref                                      \
+                               |NN char **str
+Aadip  |char * |savesharedsvpv |NN SV *sv
+Cp     |void   |save_sptr      |NN SV **sptr
+Cp     |void   |savestack_grow
+Cp     |void   |savestack_grow_cnt                                     \
+                               |I32 need
+Xp     |void   |save_strlen    |NN STRLEN *ptr
+Aadip  |char * |savesvpv       |NN SV *sv
+Adhp   |SV *   |save_svref     |NN SV **sptr
+Aopx   |void   |savetmps
+Cdp    |void   |save_vptr      |NN void *ptr
 : Used in perly.y
-p      |OP*    |sawparens      |NULLOK OP* o
-Apd    |OP*    |op_contextualize|NN OP* o|I32 context
+p      |OP *   |sawparens      |NULLOK OP *o
 : Used in perly.y
-p      |OP*    |scalar         |NULLOK OP* o
-#if defined(PERL_IN_OP_C)
-S      |OP*    |scalarkids     |NULLOK OP* o
-S      |OP*    |voidnonfinal   |NULLOK OP* o
-#endif
+p      |OP *   |scalar         |NULLOK OP *o
 : Used in pp_ctl.c
-p      |OP*    |scalarvoid     |NN OP* o
-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
-Cp     |char*  |scan_num       |NN const char* s|NN YYSTYPE *lvalp
-Apd    |NV     |scan_oct       |NN const char* start|STRLEN len|NN STRLEN* retlen
-Axpd   |OP*    |op_scope       |NULLOK OP* o
-ApdRx  |OP*    |op_wrap_finally|NN OP *block|NN OP *finally
+p      |OP *   |scalarvoid     |NN OP *o
+Adp    |NV     |scan_bin       |NN const char *start                   \
+                               |STRLEN len                             \
+                               |NN STRLEN *retlen
+Adp    |NV     |scan_hex       |NN const char *start                   \
+                               |STRLEN len                             \
+                               |NN STRLEN *retlen
+Cp     |char * |scan_num       |NN const char *s                       \
+                               |NN YYSTYPE *lvalp
+Adp    |NV     |scan_oct       |NN const char *start                   \
+                               |STRLEN len                             \
+                               |NN STRLEN *retlen
+
+: For use ONLY in B::Hooks::Parser, by special dispensation
+ERXpx  |char * |scan_str       |NN char *start                         \
+                               |int keep_quoted                        \
+                               |int keep_delims                        \
+                               |int re_reparse                         \
+                               |NULLOK char **delimp
+Adp    |const char *|scan_version                                      \
+                               |NN const char *s                       \
+                               |NN SV *rv                              \
+                               |bool qv
+Adp    |char * |scan_vstring   |NN const char *s                       \
+                               |NN const char * const e                \
+                               |NN SV *sv
+EXpx   |char * |scan_word      |NN char *s                             \
+                               |NN char *dest                          \
+                               |STRLEN destlen                         \
+                               |int allow_package                      \
+                               |NN STRLEN *slp
+EXpx   |char * |scan_word6     |NN char *s                             \
+                               |NN char *dest                          \
+                               |STRLEN destlen                         \
+                               |int allow_package                      \
+                               |NN STRLEN *slp                         \
+                               |bool warn_tick
+Cp     |U32    |seed
 : Only used by perl.c/miniperl.c, but defined in caretx.c
-pe     |void   |set_caret_X
-Apd    |void   |setdefout      |NN GV* gv
-Cp     |HEK*   |share_hek      |NN const char* str|SSize_t len|U32 hash
-#ifdef PERL_USE_3ARG_SIGHANDLER
-: Used in perl.c
-Tp     |Signal_t |sighandler   |int sig|NULLOK Siginfo_t *info|NULLOK void *uap
-CTp    |Signal_t |csighandler  |int sig|NULLOK Siginfo_t *info|NULLOK void *uap
-#else
-Tp     |Signal_t |sighandler   |int sig
-CTp    |Signal_t |csighandler  |int sig
-#endif
-Tp     |Signal_t |sighandler1  |int sig
-CTp    |Signal_t |csighandler1 |int sig
-Tp     |Signal_t |sighandler3  |int sig|NULLOK Siginfo_t *info|NULLOK void *uap
-CTp    |Signal_t |csighandler3 |int sig|NULLOK Siginfo_t *info|NULLOK void *uap
-CTp    |Signal_t |perly_sighandler     |int sig|NULLOK Siginfo_t *info|NULLOK void *uap|bool safe
-Cp     |SV**   |stack_grow     |NN SV** sp|NN SV** p|SSize_t n
-Ap     |I32    |start_subparse |I32 is_format|U32 flags
-Xp     |void   |init_named_cv  |NN CV *cv|NN OP *nameop
+ep     |void   |set_caret_X
+CTdp   |void   |set_context    |NN void *t
+Adp    |void   |setdefout      |NN GV *gv
+Tp     |void   |setfd_cloexec  |int fd
+p      |void   |setfd_cloexec_for_nonsysfd                             \
+                               |int fd
+p      |void   |setfd_cloexec_or_inhexec_by_sysfdness                  \
+                               |int fd
+Tp     |void   |setfd_inhexec  |int fd
+p      |void   |setfd_inhexec_for_sysfd                                \
+                               |int fd
+Xp     |void   |set_numeric_standard
+Xp     |void   |set_numeric_underlying
+Cp     |HEK *  |share_hek      |NN const char *str                     \
+                               |SSize_t len                            \
+                               |U32 hash
+Tp     |Signal_t|sighandler1   |int sig
+Tp     |Signal_t|sighandler3   |int sig                                \
+                               |NULLOK Siginfo_t *info                 \
+                               |NULLOK void *uap
+CRTip  |unsigned|single_1bit_pos32                                     \
+                               |U32 word
+ERXpx  |char * |skipspace_flags|NN char *s                             \
+                               |U32 flags
+RXp    |void * |Slab_Alloc     |size_t sz
+Xp     |void   |Slab_Free      |NN void *op
+Adp    |void   |sortsv         |NULLOK SV **array                      \
+                               |size_t num_elts                        \
+                               |NN SVCOMPARE_t cmp
+Adp    |void   |sortsv_flags   |NULLOK SV **array                      \
+                               |size_t num_elts                        \
+                               |NN SVCOMPARE_t cmp                     \
+                               |U32 flags
+Cp     |SV **  |stack_grow     |NN SV **sp                             \
+                               |NN SV **p                              \
+                               |SSize_t n
+: Defined in doio.c, used only in pp_hot.c
+dopx   |PerlIO *|start_glob    |NN SV *tmpglob                         \
+                               |NN IO *io
+Adp    |I32    |start_subparse |I32 is_format                          \
+                               |U32 flags
+CRp    |NV     |str_to_version |NN SV *sv
 : Used in pp_ctl.c
-p      |void   |sub_crush_depth|NN CV* cv
-CpbMd  |bool   |sv_2bool       |NN SV *const sv
-Cpd    |bool   |sv_2bool_flags |NN SV *sv|I32 flags
-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
-#endif
-CpMb   |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
-pxd    |SV*    |sv_2num        |NN SV *const sv
-ApdMb  |char*  |sv_2pv         |NN SV *sv|NULLOK STRLEN *lp
-Apd    |char*  |sv_2pv_flags   |NN SV *const sv|NULLOK STRLEN *const lp|const U32 flags
-ApdMb  |char*  |sv_2pvutf8     |NN SV *sv|NULLOK STRLEN *const lp
-Apd    |char*  |sv_2pvutf8_flags       |NN SV *sv|NULLOK STRLEN *const lp|const U32 flags
-ApdMb  |char*  |sv_2pvbyte     |NN SV *sv|NULLOK STRLEN *const lp
-Apd    |char*  |sv_2pvbyte_flags       |NN SV *sv|NULLOK STRLEN *const lp|const U32 flags
-AbpD   |char*  |sv_pvn_nomg    |NN SV* sv|NULLOK STRLEN* lp
-CpMb   |UV     |sv_2uv         |NN SV *sv
-Apd    |UV     |sv_2uv_flags   |NN SV *const sv|const I32 flags
-CbpdD  |IV     |sv_iv          |NN SV* sv
-CbpdD  |UV     |sv_uv          |NN SV* sv
-CbpdD  |NV     |sv_nv          |NN SV* sv
-CbpdD  |char*  |sv_pvn         |NN SV *sv|NN STRLEN *lp
-CbpdD  |char*  |sv_pvutf8n     |NN SV *sv|NN STRLEN *lp
-CbpdD  |char*  |sv_pvbyten     |NN SV *sv|NN STRLEN *lp
-Cpd    |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 \
-                               |const U32 flags
-#endif
-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
-# endif
-#endif
-Afpd   |void   |sv_catpvf      |NN SV *const sv|NN const char *const pat|...
-Apd    |void   |sv_vcatpvf     |NN SV *const sv|NN const char *const pat \
-                               |NULLOK va_list *const args
-Apd    |void   |sv_catpv       |NN SV *const dsv|NULLOK const char* sstr
-ApMdb  |void   |sv_catpvn      |NN SV *dsv|NN const char *sstr|STRLEN len
-ApMdb  |void   |sv_catsv       |NN SV *dsv|NULLOK SV *sstr
-Apd    |void   |sv_chop        |NN SV *const sv|NULLOK const char *const ptr
+p      |void   |sub_crush_depth|NN CV *cv
+Adp    |void   |suspend_compcv |NN struct suspended_compcv *buffer
+ATdip  |void   |SvAMAGIC_off   |NN SV *sv
+ATdip  |void   |SvAMAGIC_on    |NN SV *sv
+ATdp   |void   |sv_backoff     |NN SV * const sv
+Adp    |SV *   |sv_bless       |NN SV * const sv                       \
+                               |NN HV * const stash
+CMbdp  |bool   |sv_2bool       |NN SV * const sv
+Cdp    |bool   |sv_2bool_flags |NN SV *sv                              \
+                               |I32 flags
+Adp    |bool   |sv_cat_decode  |NN SV *dsv                             \
+                               |NN SV *encoding                        \
+                               |NN SV *ssv                             \
+                               |NN int *offset                         \
+                               |NN char *tstr                          \
+                               |int tlen
+Adp    |void   |sv_catpv       |NN SV * const dsv                      \
+                               |NULLOK const char *sstr
+Adfp   |void   |sv_catpvf      |NN SV * const sv                       \
+                               |NN const char * const pat              \
+                               |...
+Adp    |void   |sv_catpv_flags |NN SV *dsv                             \
+                               |NN const char *sstr                    \
+                               |const I32 flags
+Adfp   |void   |sv_catpvf_mg   |NN SV * const sv                       \
+                               |NN const char * const pat              \
+                               |...
+Adp    |void   |sv_catpv_mg    |NN SV * const dsv                      \
+                               |NULLOK const char * const sstr
+AMbdp  |void   |sv_catpvn      |NN SV *dsv                             \
+                               |NN const char *sstr                    \
+                               |STRLEN len
+Adp    |void   |sv_catpvn_flags|NN SV * const dsv                      \
+                               |NN const char *sstr                    \
+                               |const STRLEN len                       \
+                               |const I32 flags
+AMbdp  |void   |sv_catpvn_mg   |NN SV *dsv                             \
+                               |NN const char *sstr                    \
+                               |STRLEN len
+AMbdp  |void   |sv_catsv       |NN SV *dsv                             \
+                               |NULLOK SV *sstr
+Adp    |void   |sv_catsv_flags |NN SV * const dsv                      \
+                               |NULLOK SV * const sstr                 \
+                               |const I32 flags
+AMbdp  |void   |sv_catsv_mg    |NN SV *dsv                             \
+                               |NULLOK SV *sstr
+Adp    |void   |sv_chop        |NN SV * const sv                       \
+                               |NULLOK const char * const ptr
 : Used only in perl.c
-pd     |I32    |sv_clean_all
+dp     |I32    |sv_clean_all
 : Used only in perl.c
-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
-#endif
-AMpd   |I32    |sv_cmp         |NULLOK SV *const sv1|NULLOK SV *const sv2
-Apd    |I32    |sv_cmp_flags   |NULLOK SV *const sv1|NULLOK SV *const sv2 \
+dp     |void   |sv_clean_objs
+Adp    |void   |sv_clear       |NN SV * const orig_sv
+AMdp   |I32    |sv_cmp         |NULLOK SV * const sv1                  \
+                               |NULLOK SV * const sv2
+Adp    |I32    |sv_cmp_flags   |NULLOK SV * const sv1                  \
+                               |NULLOK SV * const sv2                  \
                                |const U32 flags
-AMpd   |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)
-ApbMd  |char*  |sv_collxfrm    |NN SV *const sv|NN STRLEN *const nxp
-Apd    |char*  |sv_collxfrm_flags      |NN SV *const sv|NN STRLEN *const nxp|I32 const flags
-#endif
-Apd    |int    |getcwd_sv      |NN SV* sv
-Apd    |void   |sv_dec         |NULLOK SV *const sv
-Apd    |void   |sv_dec_nomg    |NULLOK SV *const sv
-Apd    |void   |sv_dump        |NULLOK SV* sv
-ApdR   |bool   |sv_derived_from|NN SV* sv|NN const char *const name
-ApdR   |bool   |sv_derived_from_sv|NN SV* sv|NN SV *namesv|U32 flags
-ApdR   |bool   |sv_derived_from_pv|NN SV* sv|NN const char *const name|U32 flags
-ApdR   |bool   |sv_derived_from_pvn|NN SV* sv|NN const char *const name \
-                                    |const STRLEN len|U32 flags
-ApdRx  |bool   |sv_isa_sv      |NN SV* sv|NN SV* namesv
-ApdR   |bool   |sv_does        |NN SV* sv|NN const char *const name
-ApdR   |bool   |sv_does_sv     |NN SV* sv|NN SV* namesv|U32 flags
-ApdR   |bool   |sv_does_pv     |NN SV* sv|NN const char *const name|U32 flags
-ApdR   |bool   |sv_does_pvn    |NN SV* sv|NN const char *const name|const STRLEN len \
-                                |U32 flags
-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
-poxX   |void   |sv_free2       |NN SV *const sv|const U32 refcnt
+AMdp   |I32    |sv_cmp_locale  |NULLOK SV * const sv1                  \
+                               |NULLOK SV * const sv2
+Adp    |I32    |sv_cmp_locale_flags                                    \
+                               |NULLOK SV * const sv1                  \
+                               |NULLOK SV * const sv2                  \
+                               |const U32 flags
+AMbdp  |void   |sv_copypv      |NN SV * const dsv                      \
+                               |NN SV * const ssv
+Adp    |void   |sv_copypv_flags|NN SV * const dsv                      \
+                               |NN SV * const ssv                      \
+                               |const I32 flags
+Adm    |void   |sv_copypv_nomg |NN SV * const dsv                      \
+                               |NN SV * const ssv
+Adp    |CV *   |sv_2cv         |NULLOK SV *sv                          \
+                               |NN HV ** const st                      \
+                               |NN GV ** const gvp                     \
+                               |const I32 lref
+Adp    |void   |sv_dec         |NULLOK SV * const sv
+Adp    |void   |sv_dec_nomg    |NULLOK SV * const sv
+
+Xp     |void   |sv_del_backref |NN SV * const tsv                      \
+                               |NN SV * const sv
+ARdp   |bool   |sv_derived_from|NN SV *sv                              \
+                               |NN const char * const name
+ARdp   |bool   |sv_derived_from_hv                                     \
+                               |NN SV *sv                              \
+                               |NN HV *hv
+ARdp   |bool   |sv_derived_from_pv                                     \
+                               |NN SV *sv                              \
+                               |NN const char * const name             \
+                               |U32 flags
+ARdp   |bool   |sv_derived_from_pvn                                    \
+                               |NN SV *sv                              \
+                               |NN const char * const name             \
+                               |const STRLEN len                       \
+                               |U32 flags
+ARdp   |bool   |sv_derived_from_sv                                     \
+                               |NN SV *sv                              \
+                               |NN SV *namesv                          \
+                               |U32 flags
+Adp    |bool   |sv_destroyable |NULLOK SV *sv
+ARdp   |bool   |sv_does        |NN SV *sv                              \
+                               |NN const char * const name
+ARdp   |bool   |sv_does_pv     |NN SV *sv                              \
+                               |NN const char * const name             \
+                               |U32 flags
+ARdp   |bool   |sv_does_pvn    |NN SV *sv                              \
+                               |NN const char * const name             \
+                               |const STRLEN len                       \
+                               |U32 flags
+ARdp   |bool   |sv_does_sv     |NN SV *sv                              \
+                               |NN SV *namesv                          \
+                               |U32 flags
+Adp    |void   |sv_dump        |NULLOK SV *sv
+Adp    |void   |sv_dump_depth  |NULLOK SV *sv                          \
+                               |I32 depth
+AMbdp  |I32    |sv_eq          |NULLOK SV *sv1                         \
+                               |NULLOK SV *sv2
+Adp    |I32    |sv_eq_flags    |NULLOK SV *sv1                         \
+                               |NULLOK SV *sv2                         \
+                               |const U32 flags
+AMbdp  |void   |sv_force_normal|NN SV *sv
+Adp    |void   |sv_force_normal_flags                                  \
+                               |NN SV * const sv                       \
+                               |const U32 flags
+Adp    |void   |sv_free        |NULLOK SV * const sv
+Xopx   |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
-Cpd    |char*  |sv_grow        |NN SV *const sv|STRLEN newlen
-Cpd    |char*  |sv_grow_fresh  |NN SV *const sv|STRLEN newlen
-Apd    |void   |sv_inc         |NULLOK SV *const sv
-Apd    |void   |sv_inc_nomg    |NULLOK SV *const sv
-ApMdb  |void   |sv_insert      |NN SV *const bigstr|const STRLEN offset \
-                               |const STRLEN len|NN const char *const little \
+dp     |void   |sv_free_arenas
+ATdpx  |SV *   |sv_get_backrefs|NN SV * const sv
+Adip   |void   |SvGETMAGIC     |NN SV *sv
+Adp    |char * |sv_gets        |NN SV * const sv                       \
+                               |NN PerlIO * const fp                   \
+                               |I32 append
+Cdp    |char * |sv_grow        |NN SV * const sv                       \
+                               |STRLEN newlen
+Cdp    |char * |sv_grow_fresh  |NN SV * const sv                       \
+                               |STRLEN newlen
+Adp    |void   |sv_inc         |NULLOK SV * const sv
+Adp    |void   |sv_inc_nomg    |NULLOK SV * const sv
+AMbdp  |void   |sv_insert      |NN SV * const bigstr                   \
+                               |const STRLEN offset                    \
+                               |const STRLEN len                       \
+                               |NN const char * const little           \
                                |const STRLEN littlelen
-Apd    |void   |sv_insert_flags|NN SV *const bigstr|const STRLEN offset|const STRLEN len \
-                               |NN const char *little|const STRLEN littlelen|const U32 flags
-Apd    |int    |sv_isa         |NULLOK SV* sv|NN const char *const name
-Apd    |int    |sv_isobject    |NULLOK SV* sv
-Apd    |STRLEN |sv_len         |NULLOK SV *const sv
-Apd    |STRLEN |sv_len_utf8    |NULLOK SV *const sv
-Apd    |STRLEN |sv_len_utf8_nomg|NN SV *const sv
-Apd    |void   |sv_magic       |NN SV *const sv|NULLOK SV *const obj|const int how \
-                               |NULLOK const char *const name|const I32 namlen
-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 \
+Adp    |void   |sv_insert_flags|NN SV * const bigstr                   \
+                               |const STRLEN offset                    \
+                               |const STRLEN len                       \
+                               |NN const char *little                  \
+                               |const STRLEN littlelen                 \
+                               |const U32 flags
+Adp    |IO *   |sv_2io         |NN SV * const sv
+Adp    |int    |sv_isa         |NULLOK SV *sv                          \
+                               |NN const char * const name
+ARdpx  |bool   |sv_isa_sv      |NN SV *sv                              \
+                               |NN SV *namesv
+Adp    |int    |sv_isobject    |NULLOK SV *sv
+Adip   |IV     |SvIV           |NN SV *sv
+CMbp   |IV     |sv_2iv         |NN SV *sv
+Adp    |IV     |sv_2iv_flags   |NN SV * const sv                       \
+                               |const I32 flags
+Adip   |IV     |SvIV_nomg      |NN SV *sv
+Adp    |STRLEN |sv_len         |NULLOK SV * const sv
+Adp    |STRLEN |sv_len_utf8    |NULLOK SV * const sv
+Adp    |STRLEN |sv_len_utf8_nomg                                       \
+                               |NN SV * const sv
+Adp    |void   |sv_magic       |NN SV * const sv                       \
+                               |NULLOK SV * const obj                  \
+                               |const int how                          \
+                               |NULLOK const char * const name         \
+                               |const I32 namlen
+Adp    |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
-EiTp   |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
-ApdR   |SV*    |sv_mortalcopy_flags|NULLOK SV *const oldsv|U32 flags
-ApdR   |SV*    |sv_newmortal
-Cpd    |SV*    |sv_newref      |NULLOK SV *const sv
-Amd    |bool   |sv_numeq       |NULLOK SV* sv1|NULLOK SV* sv2
-Apd    |bool   |sv_numeq_flags |NULLOK SV* sv1|NULLOK SV* sv2|const U32 flags
-Cpd    |char*  |sv_peek        |NULLOK SV* sv
-Apd    |void   |sv_pos_u2b     |NULLOK SV *const sv|NN I32 *const offsetp|NULLOK I32 *const lenp
-Apd    |STRLEN |sv_pos_u2b_flags|NN SV *const sv|STRLEN uoffset \
-                               |NULLOK STRLEN *const lenp|U32 flags
-Apd    |void   |sv_pos_b2u     |NULLOK SV *const sv|NN I32 *const offsetp
-Apd    |STRLEN |sv_pos_b2u_flags|NN SV *const sv|STRLEN const offset \
-                                |U32 flags
-CpMdb  |char*  |sv_pvn_force   |NN SV* sv|NULLOK STRLEN* lp
-Cpd    |char*  |sv_pvutf8n_force|NN SV *const sv|NULLOK STRLEN *const lp
-Cpd    |char*  |sv_pvbyten_force|NN SV *const sv|NULLOK STRLEN *const lp
-Apd    |char*  |sv_recode_to_utf8      |NN SV* sv|NN SV *encoding
-Apd    |bool   |sv_cat_decode  |NN SV* dsv|NN SV *encoding|NN SV *ssv|NN int *offset \
-                               |NN char* tstr|int tlen
-ApdR   |const char*    |sv_reftype     |NN const SV *const sv|const int ob
-Apd    |SV*    |sv_ref |NULLOK SV *dst|NN const SV *const sv|const int ob
-Apd    |void   |sv_replace     |NN SV *const sv|NN SV *const nsv
-Apd    |void   |sv_report_used
-Apd    |void   |sv_reset       |NN const char* s|NULLOK HV *const stash
-p      |void   |sv_resetpvn    |NULLOK const char* s|STRLEN len \
-                               |NULLOK HV *const stash
-Afpd   |void   |sv_setpvf      |NN SV *const sv|NN const char *const pat|...
-Apd    |void   |sv_vsetpvf     |NN SV *const sv|NN const char *const pat|NULLOK va_list *const args
-Apd    |void   |sv_setiv       |NN SV *const sv|const IV num
-ApdbD  |void   |sv_setpviv     |NN SV *const sv|const IV num
-Apd    |void   |sv_setuv       |NN SV *const sv|const UV num
-Apd    |void   |sv_setnv       |NN SV *const sv|const NV num
-Apd    |SV*    |sv_setref_iv   |NN SV *const rv|NULLOK const char *const classname|const IV iv
-Apd    |SV*    |sv_setref_uv   |NN SV *const rv|NULLOK const char *const classname|const UV uv
-Apd    |SV*    |sv_setref_nv   |NN SV *const rv|NULLOK const char *const classname|const NV nv
-Apd    |SV*    |sv_setref_pv   |NN SV *const rv|NULLOK const char *const classname \
-                               |NULLOK void *const pv
-Apd    |SV*    |sv_setref_pvn  |NN SV *const rv|NULLOK const char *const classname \
-                               |NN const char *const pv|const STRLEN n
-Apd    |void   |sv_setpv       |NN SV *const sv|NULLOK const char *const ptr
-Apd    |void   |sv_setpvn      |NN SV *const sv|NULLOK const char *const ptr|const STRLEN len
-Apd    |void   |sv_setpvn_fresh|NN SV *const sv|NULLOK const char *const ptr|const STRLEN len
-Apd    |char  *|sv_setpv_bufsize|NN SV *const sv|const STRLEN cur|const STRLEN len
-Xp     |void   |sv_sethek      |NN SV *const sv|NULLOK const HEK *const hek
-Apd    |void   |sv_setrv_noinc |NN SV *const sv|NN SV *const ref
-Apd    |void   |sv_setrv_inc   |NN SV *const sv|NN SV *const ref
-Apd    |void   |sv_setrv_noinc_mg      |NN SV *const sv|NN SV *const ref
-Apd    |void   |sv_setrv_inc_mg        |NN SV *const sv|NN SV *const ref
-ApMdb  |void   |sv_setsv       |NN SV *dsv|NULLOK SV *ssv
-Amd    |bool   |sv_streq       |NULLOK SV* sv1|NULLOK SV* sv2
-Apd    |bool   |sv_streq_flags |NULLOK SV* sv1|NULLOK SV* sv2|const U32 flags
-CpMdb  |void   |sv_taint       |NN SV* sv
-CpdR   |bool   |sv_tainted     |NN SV *const sv
-Apd    |int    |sv_unmagic     |NN SV *const sv|const int type
-Apd    |int    |sv_unmagicext  |NN SV *const sv|const int type|NULLOK MGVTBL *vtbl
-ApdMb  |void   |sv_unref       |NN SV* sv
-Apd    |void   |sv_unref_flags |NN SV *const ref|const U32 flags
-Cpd    |void   |sv_untaint     |NN SV *const sv
-Apd    |void   |sv_upgrade     |NN SV *const sv|svtype new_type
-ApdMb  |void   |sv_usepvn      |NN SV* sv|NULLOK char* ptr|STRLEN len
-Apd    |void   |sv_usepvn_flags|NN SV *const sv|NULLOK char* ptr|const STRLEN len\
+EXp    |MAGIC *|sv_magicext_mglob                                      \
+                               |NN SV *sv
+Adp    |SV *   |sv_2mortal     |NULLOK SV * const sv
+AMRbdp |SV *   |sv_mortalcopy  |NULLOK SV * const oldsv
+ARdp   |SV *   |sv_mortalcopy_flags                                    \
+                               |NULLOK SV * const oldsv                \
+                               |U32 flags
+ARdp   |SV *   |sv_newmortal
+Cdp    |SV *   |sv_newref      |NULLOK SV * const sv
+ADbdp  |void   |sv_nolocking   |NULLOK SV *sv
+
+Adp    |void   |sv_nosharing   |NULLOK SV *sv
+ADbdp  |void   |sv_nounlocking |NULLOK SV *sv
+: Used in pp.c, pp_hot.c, sv.c
+dpx    |SV *   |sv_2num        |NN SV * const sv
+Adm    |bool   |sv_numeq       |NULLOK SV *sv1                         \
+                               |NULLOK SV *sv2
+Adp    |bool   |sv_numeq_flags |NULLOK SV *sv1                         \
+                               |NULLOK SV *sv2                         \
                                |const U32 flags
-Apd    |void   |sv_vcatpvfn    |NN SV *const sv|NN const char *const pat|const STRLEN patlen \
-                               |NULLOK va_list *const args|NULLOK SV **const svargs|const Size_t sv_count \
-                               |NULLOK bool *const maybe_tainted
-Apd    |void   |sv_vcatpvfn_flags|NN SV *const sv|NN const char *const pat|const STRLEN patlen \
-                               |NULLOK va_list *const args|NULLOK SV **const svargs|const Size_t sv_count \
-                               |NULLOK bool *const maybe_tainted|const U32 flags
-Apd    |void   |sv_vsetpvfn    |NN SV *const sv|NN const char *const pat|const STRLEN patlen \
-                               |NULLOK va_list *const args|NULLOK SV **const svargs \
-                               |const Size_t sv_count|NULLOK bool *const maybe_tainted
-CpR    |NV     |str_to_version |NN SV *sv
-Cp     |void   |regdump        |NN const regexp* r
-CiTop  |struct regexp *|ReANY  |NN const REGEXP * const re
-Apdh   |I32    |pregexec       |NN REGEXP * const prog|NN char* stringarg \
-                               |NN char* strend|NN char* strbeg \
-                               |SSize_t minend |NN SV* screamer|U32 nosave
-Cp     |void   |pregfree       |NULLOK REGEXP* r
-Cp     |void   |pregfree2      |NN REGEXP *rx
-: FIXME - is anything in re using this now?
-EXp    |REGEXP*|reg_temp_copy  |NULLOK REGEXP* dsv|NN REGEXP* ssv
-Cp     |void   |regfree_internal|NN REGEXP *const rx
-#if defined(USE_ITHREADS)
-Cp     |void*  |regdupe_internal|NN REGEXP * const r|NN CLONE_PARAMS* param
-#endif
-EXp    |regexp_engine const *|current_re_engine
-Apdh   |REGEXP*|pregcomp       |NN SV * const pattern|const U32 flags
-p      |REGEXP*|re_op_compile  |NULLOK SV ** const patternp \
-                               |int pat_count|NULLOK OP *expr \
-                               |NN const regexp_engine* eng \
-                               |NULLOK REGEXP *old_re \
-                               |NULLOK bool *is_bare_re \
-                               |const U32 rx_flags|const U32 pm_flags
-Apd    |REGEXP*|re_compile     |NN SV * const pattern|U32 orig_rx_flags
-Cp     |char*  |re_intuit_start|NN REGEXP * const rx \
-                               |NULLOK SV* sv \
-                               |NN const char* const strbeg \
-                               |NN char* strpos \
-                               |NN char* strend \
-                               |const U32 flags \
-                               |NULLOK re_scream_pos_data *data
-Cp     |SV*    |re_intuit_string|NN REGEXP  *const r
-Cp     |I32    |regexec_flags  |NN REGEXP *const rx|NN char *stringarg \
-                               |NN char *strend|NN char *strbeg \
-                               |SSize_t minend|NN SV *sv \
-                               |NULLOK void *data|U32 flags
-CpR    |regnode*|regnext       |NULLOK regnode* p
-EXp    |SV*|reg_named_buff          |NN REGEXP * const rx|NULLOK SV * const key \
-                                 |NULLOK SV * const value|const U32 flags
-EXp    |SV*|reg_named_buff_iter     |NN REGEXP * const rx|NULLOK const SV * const lastkey \
-                                 |const U32 flags
-Cp     |SV*|reg_named_buff_fetch    |NN REGEXP * const rx|NN SV * const namesv|const U32 flags
-Cp     |bool|reg_named_buff_exists  |NN REGEXP * const rx|NN SV * const key|const U32 flags
-Cp     |SV*|reg_named_buff_firstkey |NN REGEXP * const rx|const U32 flags
-Cp     |SV*|reg_named_buff_nextkey  |NN REGEXP * const rx|const U32 flags
-Cp     |SV*|reg_named_buff_scalar   |NN REGEXP * const rx|const U32 flags
-Cp     |SV*|reg_named_buff_all      |NN REGEXP * const rx|const U32 flags
+Adip   |NV     |SvNV           |NN SV *sv
+Adp    |NV     |sv_2nv_flags   |NN SV * const sv                       \
+                               |const I32 flags
+Adip   |NV     |SvNV_nomg      |NN SV *sv
+ETip   |bool   |sv_only_taint_gmagic                                   \
+                               |NN SV *sv
+Cdp    |char * |sv_peek        |NULLOK SV *sv
+Adp    |void   |sv_pos_b2u     |NULLOK SV * const sv                   \
+                               |NN I32 * const offsetp
+Adp    |STRLEN |sv_pos_b2u_flags                                       \
+                               |NN SV * const sv                       \
+                               |STRLEN const offset                    \
+                               |U32 flags
+Adp    |void   |sv_pos_u2b     |NULLOK SV * const sv                   \
+                               |NN I32 * const offsetp                 \
+                               |NULLOK I32 * const lenp
+Adp    |STRLEN |sv_pos_u2b_flags                                       \
+                               |NN SV * const sv                       \
+                               |STRLEN uoffset                         \
+                               |NULLOK STRLEN * const lenp             \
+                               |U32 flags
+AMbdp  |char * |sv_2pv         |NN SV *sv                              \
+                               |NULLOK STRLEN *lp
+CMRbdp |char * |sv_pv          |NN SV *sv
+AMbdp  |char * |sv_2pvbyte     |NN SV *sv                              \
+                               |NULLOK STRLEN * const lp
+CMRbdp |char * |sv_pvbyte      |NN SV *sv
+Adp    |char * |sv_2pvbyte_flags                                       \
+                               |NN SV *sv                              \
+                               |NULLOK STRLEN * const lp               \
+                               |const U32 flags
+Cdp    |char * |sv_pvbyten_force                                       \
+                               |NN SV * const sv                       \
+                               |NULLOK STRLEN * const lp
+ip     |char * |sv_pvbyten_force_wrapper                               \
+                               |NN SV * const sv                       \
+                               |NULLOK STRLEN * const lp               \
+                               |const U32 dummy
+CMRbdp |char * |sv_2pvbyte_nolen                                       \
+                               |NN SV *sv
+Adp    |char * |sv_2pv_flags   |NN SV * const sv                       \
+                               |NULLOK STRLEN * const lp               \
+                               |const U32 flags
+CMbdp  |char * |sv_pvn_force   |NN SV *sv                              \
+                               |NULLOK STRLEN *lp
+Adp    |char * |sv_pvn_force_flags                                     \
+                               |NN SV * const sv                       \
+                               |NULLOK STRLEN * const lp               \
+                               |const U32 flags
+CMRbdp |char * |sv_2pv_nolen   |NN SV *sv
+AMbdp  |char * |sv_2pvutf8     |NN SV *sv                              \
+                               |NULLOK STRLEN * const lp
+CMRbdp |char * |sv_pvutf8      |NN SV *sv
+Adp    |char * |sv_2pvutf8_flags                                       \
+                               |NN SV *sv                              \
+                               |NULLOK STRLEN * const lp               \
+                               |const U32 flags
+Cdp    |char * |sv_pvutf8n_force                                       \
+                               |NN SV * const sv                       \
+                               |NULLOK STRLEN * const lp
+ip     |char * |sv_pvutf8n_force_wrapper                               \
+                               |NN SV * const sv                       \
+                               |NULLOK STRLEN * const lp               \
+                               |const U32 dummy
+CMRbdp |char * |sv_2pvutf8_nolen                                       \
+                               |NN SV *sv
+AIdp   |bool   |SvPVXtrue      |NN SV *sv
+Adp    |char * |sv_recode_to_utf8                                      \
+                               |NN SV *sv                              \
+                               |NN SV *encoding
+Adp    |SV *   |sv_ref         |NULLOK SV *dst                         \
+                               |NN const SV * const sv                 \
+                               |const int ob
+AMdip  |void   |SvREFCNT_dec   |NULLOK SV *sv
+AMdip  |void   |SvREFCNT_dec_NN|NN SV *sv
+Adip   |SV *   |SvREFCNT_dec_ret_NULL                                  \
+                               |NULLOK SV *sv
+Adm    |void   |SvREFCNT_dec_set_NULL                                  \
+                               |NULLOK SV *sv
+AMTdip |SV *   |SvREFCNT_inc   |NULLOK SV *sv
+AMTdip |SV *   |SvREFCNT_inc_NN|NN SV *sv
+AMTdip |void   |SvREFCNT_inc_void                                      \
+                               |NULLOK SV *sv
+ARdp   |const char *|sv_reftype|NN const SV * const sv                 \
+                               |const int ob
+Adp    |void   |sv_replace     |NN SV * const sv                       \
+                               |NN SV * const nsv
+Adp    |void   |sv_report_used
+Adp    |void   |sv_reset       |NN const char *s                       \
+                               |NULLOK HV * const stash
+p      |void   |sv_resetpvn    |NULLOK const char *s                   \
+                               |STRLEN len                             \
+                               |NULLOK HV * const stash
+Adp    |SV *   |sv_rvunweaken  |NN SV * const sv
+Adp    |SV *   |sv_rvweaken    |NN SV * const sv
+Adp    |void   |sv_set_bool    |NN SV *sv                              \
+                               |const bool bool_val
+Adp    |void   |sv_set_false   |NN SV *sv
+Xp     |void   |sv_sethek      |NN SV * const sv                       \
+                               |NULLOK const HEK * const hek
+Adp    |void   |sv_setiv       |NN SV * const sv                       \
+                               |const IV num
+Adp    |void   |sv_setiv_mg    |NN SV * const sv                       \
+                               |const IV i
+Adp    |void   |sv_setnv       |NN SV * const sv                       \
+                               |const NV num
+Adp    |void   |sv_setnv_mg    |NN SV * const sv                       \
+                               |const NV num
+Adp    |void   |sv_setpv       |NN SV * const sv                       \
+                               |NULLOK const char * const ptr
+Adp    |char  *|sv_setpv_bufsize                                       \
+                               |NN SV * const sv                       \
+                               |const STRLEN cur                       \
+                               |const STRLEN len
+Adfp   |void   |sv_setpvf      |NN SV * const sv                       \
+                               |NN const char * const pat              \
+                               |...
+Adfp   |void   |sv_setpvf_mg   |NN SV * const sv                       \
+                               |NN const char * const pat              \
+                               |...
+Cipx   |char  *|sv_setpv_freshbuf                                      \
+                               |NN SV * const sv
+Adp    |void   |sv_setpv_mg    |NN SV * const sv                       \
+                               |NULLOK const char * const ptr
+Adp    |void   |sv_setpvn      |NN SV * const sv                       \
+                               |NULLOK const char * const ptr          \
+                               |const STRLEN len
+Adp    |void   |sv_setpvn_fresh|NN SV * const sv                       \
+                               |NULLOK const char * const ptr          \
+                               |const STRLEN len
+Adp    |void   |sv_setpvn_mg   |NN SV * const sv                       \
+                               |NN const char * const ptr              \
+                               |const STRLEN len
+Adp    |SV *   |sv_setref_iv   |NN SV * const rv                       \
+                               |NULLOK const char * const classname    \
+                               |const IV iv
+Adp    |SV *   |sv_setref_nv   |NN SV * const rv                       \
+                               |NULLOK const char * const classname    \
+                               |const NV nv
+Adp    |SV *   |sv_setref_pv   |NN SV * const rv                       \
+                               |NULLOK const char * const classname    \
+                               |NULLOK void * const pv
+Adp    |SV *   |sv_setref_pvn  |NN SV * const rv                       \
+                               |NULLOK const char * const classname    \
+                               |NN const char * const pv               \
+                               |const STRLEN n
+Adp    |SV *   |sv_setref_uv   |NN SV * const rv                       \
+                               |NULLOK const char * const classname    \
+                               |const UV uv
+Adp    |void   |sv_setrv_inc   |NN SV * const sv                       \
+                               |NN SV * const ref
+Adp    |void   |sv_setrv_inc_mg|NN SV * const sv                       \
+                               |NN SV * const ref
+Adp    |void   |sv_setrv_noinc |NN SV * const sv                       \
+                               |NN SV * const ref
+Adp    |void   |sv_setrv_noinc_mg                                      \
+                               |NN SV * const sv                       \
+                               |NN SV * const ref
+AMbdp  |void   |sv_setsv       |NN SV *dsv                             \
+                               |NULLOK SV *ssv
+Adp    |void   |sv_setsv_flags |NN SV *dsv                             \
+                               |NULLOK SV *ssv                         \
+                               |const I32 flags
+Adp    |void   |sv_setsv_mg    |NN SV * const dsv                      \
+                               |NULLOK SV * const ssv
+Adp    |void   |sv_set_true    |NN SV *sv
 
-: FIXME - is anything in re using this now?
-EXp    |void|reg_numbered_buff_fetch|NN REGEXP * const rx|const I32 paren|NULLOK SV * const sv
-: FIXME - is anything in re using this now?
-EXp    |void|reg_numbered_buff_store|NN REGEXP * const rx|const I32 paren|NULLOK SV const * const value
-: FIXME - is anything in re using this now?
-EXp    |I32|reg_numbered_buff_length|NN REGEXP * const rx|NN const SV * const sv|const I32 paren
+Adp    |void   |sv_set_undef   |NN SV *sv
+Adp    |void   |sv_setuv       |NN SV * const sv                       \
+                               |const UV num
+Adp    |void   |sv_setuv_mg    |NN SV * const sv                       \
+                               |const UV u
+Adm    |bool   |sv_streq       |NULLOK SV *sv1                         \
+                               |NULLOK SV *sv2
+Adp    |bool   |sv_streq_flags |NULLOK SV *sv1                         \
+                               |NULLOK SV *sv2                         \
+                               |const U32 flags
+Adp    |SV *   |sv_string_from_errnum                                  \
+                               |int errnum                             \
+                               |NULLOK SV *tgtsv
+CMbdp  |void   |sv_taint       |NN SV *sv
+CRdp   |bool   |sv_tainted     |NN SV * const sv
+Adip   |bool   |SvTRUE         |NULLOK SV *sv
+Cdp    |I32    |sv_true        |NULLOK SV * const sv
+Cip    |bool   |SvTRUE_common  |NN SV *sv                              \
+                               |const bool sv_2bool_is_fallback
+Adip   |bool   |SvTRUE_NN      |NN SV *sv
+Adip   |bool   |SvTRUE_nomg    |NULLOK SV *sv
+ARdp   |char * |sv_uni_display |NN SV *dsv                             \
+                               |NN SV *ssv                             \
+                               |STRLEN pvlim                           \
+                               |UV flags
+Adp    |int    |sv_unmagic     |NN SV * const sv                       \
+                               |const int type
+Adp    |int    |sv_unmagicext  |NN SV * const sv                       \
+                               |const int type                         \
+                               |NULLOK const MGVTBL *vtbl
+AMbdp  |void   |sv_unref       |NN SV *sv
+Adp    |void   |sv_unref_flags |NN SV * const ref                      \
+                               |const U32 flags
+Cdp    |void   |sv_untaint     |NN SV * const sv
+Adp    |void   |sv_upgrade     |NN SV * const sv                       \
+                               |svtype new_type
+AMbdp  |void   |sv_usepvn      |NN SV *sv                              \
+                               |NULLOK char *ptr                       \
+                               |STRLEN len
+Adp    |void   |sv_usepvn_flags|NN SV * const sv                       \
+                               |NULLOK char *ptr                       \
+                               |const STRLEN len                       \
+                               |const U32 flags
+AMbdp  |void   |sv_usepvn_mg   |NN SV *sv                              \
+                               |NULLOK char *ptr                       \
+                               |STRLEN len
+Adp    |bool   |sv_utf8_decode |NN SV * const sv
+AMbdp  |bool   |sv_utf8_downgrade                                      \
+                               |NN SV * const sv                       \
+                               |const bool fail_ok
+Adp    |bool   |sv_utf8_downgrade_flags                                \
+                               |NN SV * const sv                       \
+                               |const bool fail_ok                     \
+                               |const U32 flags
+Adm    |bool   |sv_utf8_downgrade_nomg                                 \
+                               |NN SV * const sv                       \
+                               |const bool fail_ok
+Adp    |void   |sv_utf8_encode |NN SV * const sv
+AMbdp  |STRLEN |sv_utf8_upgrade|NN SV *sv
+Adm    |STRLEN |sv_utf8_upgrade_flags                                  \
+                               |NN SV * const sv                       \
+                               |const I32 flags
+Adp    |STRLEN |sv_utf8_upgrade_flags_grow                             \
+                               |NN SV * const sv                       \
+                               |const I32 flags                        \
+                               |STRLEN extra
+Adm    |STRLEN |sv_utf8_upgrade_nomg                                   \
+                               |NN SV *sv
+Adip   |UV     |SvUV           |NN SV *sv
+CMbp   |UV     |sv_2uv         |NN SV *sv
+Adp    |UV     |sv_2uv_flags   |NN SV * const sv                       \
+                               |const I32 flags
+Adip   |UV     |SvUV_nomg      |NN SV *sv
+Adp    |void   |sv_vcatpvf     |NN SV * const sv                       \
+                               |NN const char * const pat              \
+                               |NULLOK va_list * const args
+Adp    |void   |sv_vcatpvf_mg  |NN SV * const sv                       \
+                               |NN const char * const pat              \
+                               |NULLOK va_list * const args
+Adp    |void   |sv_vcatpvfn    |NN SV * const sv                       \
+                               |NN const char * const pat              \
+                               |const STRLEN patlen                    \
+                               |NULLOK va_list * const args            \
+                               |NULLOK SV ** const svargs              \
+                               |const Size_t sv_count                  \
+                               |NULLOK bool * const maybe_tainted
+Adp    |void   |sv_vcatpvfn_flags                                      \
+                               |NN SV * const sv                       \
+                               |NN const char * const pat              \
+                               |const STRLEN patlen                    \
+                               |NULLOK va_list * const args            \
+                               |NULLOK SV ** const svargs              \
+                               |const Size_t sv_count                  \
+                               |NULLOK bool * const maybe_tainted      \
+                               |const U32 flags
+Adp    |void   |sv_vsetpvf     |NN SV * const sv                       \
+                               |NN const char * const pat              \
+                               |NULLOK va_list * const args
+Adp    |void   |sv_vsetpvf_mg  |NN SV * const sv                       \
+                               |NN const char * const pat              \
+                               |NULLOK va_list * const args
+Adp    |void   |sv_vsetpvfn    |NN SV * const sv                       \
+                               |NN const char * const pat              \
+                               |const STRLEN patlen                    \
+                               |NULLOK va_list * const args            \
+                               |NULLOK SV ** const svargs              \
+                               |const Size_t sv_count                  \
+                               |NULLOK bool * const maybe_tainted
+Adp    |void   |switch_to_global_locale
+Adp    |bool   |sync_locale
+CTop   |void   |sys_init       |NN int *argc                           \
+                               |NN char ***argv
+CTop   |void   |sys_init3      |NN int *argc                           \
+                               |NN char ***argv                        \
+                               |NN char ***env
+CTop   |void   |sys_term
 
-: FIXME - is anything in re using this now?
-EXp    |SV*|reg_qr_package|NN REGEXP * const rx
-EXpRT  |I16    |do_uniprop_match|NN const char * const key|const U16 key_len
-EXpRT  |const char * const *|get_prop_values|const int table_index
-EXpR   |SV *   |get_prop_definition|const int table_index
-EXpRT  |const char *|get_deprecated_property_msg|const Size_t warning_offset
-#if defined(PERL_IN_REGCOMP_C)
-EiRT   |bool   |invlist_is_iterating|NN const SV* const invlist
-EiR    |SV*    |invlist_contents|NN SV* const invlist              \
-                                |const bool traditional_style
-EixRT  |UV     |invlist_lowest|NN SV* const invlist
-ERS    |SV*    |make_exactf_invlist    |NN RExC_state_t *pRExC_state \
-                                       |NN regnode *node
-ES     |regnode_offset|reg_la_NOTHING  |NN RExC_state_t *pRExC_state \
-                                       |U32 flags|NN const char *type
-ES     |regnode_offset|reg_la_OPFAIL   |NN RExC_state_t *pRExC_state \
-                                       |U32 flags|NN const char *type
-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          \
-                               |const STRLEN extra_len
-#ifdef DEBUGGING
-ES     |regnode_offset|regnode_guts_debug|NN RExC_state_t *pRExC_state     \
-                               |const U8 op                                \
-                               |const STRLEN extra_len
-#endif
-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|regpnode|NN RExC_state_t *pRExC_state|U8 op \
-                               |NN SV * arg
-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 \
-                               |NN I32 *flagp|U32 depth
-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 \
-                               |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                                      \
-                               |NN RExC_state_t *pRExC_state               \
-                               |NN AV* posix_warnings
-EiT    |Size_t  |find_first_differing_byte_pos|NN const U8 * s1|NN const U8 * s2| const Size_t max
-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                 \
-                               |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     |U8|optimize_regclass   |NN RExC_state_t *pRExC_state               \
-                               |NULLOK SV* cp_list                         \
-                               |NULLOK SV* only_utf8_locale_list           \
-                               |NULLOK SV* upper_latin1_only_utf8_matches  \
-                               |const U32 has_runtime_dependency           \
-                               |const U32 posixl                           \
-                               |NN U8 * anyof_flags                        \
-                               |NN bool * invert                           \
-                               |NN regnode_offset * ret                    \
-                               |NN I32 *flagp
-ES     |SV *   |parse_uniprop_string|NN const char * const name            \
-                                    |Size_t name_len                       \
-                                    |const bool is_utf8                    \
-                                    |const bool to_fold                    \
-                                    |const bool runtime                    \
-                                    |const bool deferrable                 \
-                                    |NULLOK AV ** strings                  \
-                                    |NN bool * user_defined_ptr            \
-                                    |NN SV * msg                           \
-                                    |const STRLEN level
-ES     |SV *   |handle_user_defined_property|NN const char * name          \
-                                            |const STRLEN name_len         \
-                                            |const bool is_utf8            \
-                                            |const bool to_fold            \
-                                            |const bool runtime            \
-                                            |const bool deferrable         \
-                                            |NN SV* contents               \
-                                            |NN bool *user_defined_ptr     \
-                                            |NN SV * msg                   \
-                                            |const STRLEN level
-ERS    |REGEXP*|compile_wildcard|NN const char * subpattern|const STRLEN len\
-                                |const bool ignore_case
-ES     |I32    |execute_wildcard|NN REGEXP * const prog|NN char* stringarg \
-                               |NN char* strend|NN char* strbeg \
-                               |SSize_t minend |NN SV* screamer|U32 nosave
-ES     |bool   |handle_names_wildcard                                      \
-                               |NN const char * wname                      \
-                               |const STRLEN wname_len                     \
-                               |NN SV ** prop_definition                   \
-                               |NN AV ** strings
-ES     |void|add_above_Latin1_folds|NN RExC_state_t *pRExC_state|const U8 cp \
-                               |NN SV** invlist
-ES     |regnode_offset|handle_named_backref|NN RExC_state_t *pRExC_state   \
-                               |NN I32 *flagp                              \
-                               |NN char * backref_parse_start              \
-                               |char ch
-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
-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                                 \
-                               |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     |U32    |get_quantifier_value|NN RExC_state_t *pRExC_state          \
-                               |NN const char * start|NN const char * end
-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               \
-                               |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 \
-                               |const U8 op                                \
-                               |const regnode_offset operand               \
-                               |const U32 depth
-ESR    |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 \
-                               |U32 flags
-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
-EST    |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
-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
-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
-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 \
-                               |NN regnode_ssc *ssc                \
-                               |NN const regnode_charclass *and_with
-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                                 \
-                               |NN const RExC_state_t *pRExC_state \
-                               |NN const regnode_charclass* const node
-ES     |void   |ssc_intersection|NN regnode_ssc *ssc \
-                               |NN SV* const invlist|const bool invert_2nd
-ES     |void   |ssc_union      |NN regnode_ssc *ssc \
-                               |NN SV* const invlist|const bool invert_2nd
-ES     |void   |ssc_add_range  |NN regnode_ssc *ssc \
-                               |UV const start|UV const end
-ES     |void   |ssc_cp_and     |NN regnode_ssc *ssc \
-                               |UV const cp
-EST    |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 \
-                               |NN regnode_ssc *ssc
-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|bool was_mutate_ok
-ES     |void   |rck_elide_nothing|NN regnode *node
-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
-frS    |void   |re_croak       |bool utf8|NN const char* pat|...
-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 \
-                               |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 \
-                                |NN regnode *source|U32 depth
-ETSR   |int    |edit_distance  |NN const UV *src                   \
-                               |NN const UV *tgt                   \
-                               |const STRLEN x                     \
-                               |const STRLEN y                     \
-                               |const SSize_t maxDistance
-#  ifdef DEBUGGING
-EFp    |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 \
-                               |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             \
-                               |NULLOK char* bitmap                \
-                               |NULLOK SV* nonbitmap_invlist       \
-                               |NULLOK SV* only_utf8_locale_invlist\
-                               |NULLOK const regnode * const node  \
-                               |const U8 flags                     \
-                               |const bool force_as_is_display
-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               \
-                               |NN SV *sv                          \
-                               |NN SV* invlist
-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\
-                               |NULLOK HV* widecharmap|NN AV *revcharmap\
-                               |U32 depth
-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\
-                               |NULLOK HV* widecharmap|NN AV *revcharmap\
-                               |U32 next_alloc|U32 depth
-ESR    |bool   |regtail_study  |NN RExC_state_t *pRExC_state \
-                               |NN regnode_offset p|NN const regnode_offset val|U32 depth
-#  endif
-#  ifndef PERL_EXT_RE_BUILD
-EiRT   |UV*    |_invlist_array_init    |NN SV* const invlist|const bool will_have_0
-EiRT   |UV     |invlist_max    |NN const SV* const invlist
-EiRT   |IV*    |get_invlist_previous_index_addr|NN SV* invlist
-EiT    |void   |invlist_set_previous_index|NN SV* const invlist|const IV index
-EiRT   |IV     |invlist_previous_index|NN SV* const invlist
-EiT    |void   |invlist_trim   |NN SV* invlist
-Ei     |void   |invlist_clear  |NN SV* invlist
-ES     |void   |_append_range_to_invlist   |NN SV* const invlist|const UV start|const UV end
-ES     |void   |invlist_replace_list_destroys_src|NN SV *dest|NN SV *src
-S      |void   |initialize_invlist_guts|NN SV* invlist|const Size_t initial_size
-#  endif
-#endif
-#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_DOOP_C) || defined(PERL_IN_OP_C)
-EiR    |SV*    |add_cp_to_invlist      |NULLOK SV* invlist|const UV cp
-Ei     |void   |invlist_extend    |NN SV* const invlist|const UV len
-Ei     |void   |invlist_set_len|NN SV* const invlist|const UV len|const bool offset
-EiRT   |UV     |invlist_highest|NN SV* const invlist
-#endif
-#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_DOOP_C) || defined(PERL_IN_OP_C) || defined(PERL_IN_UTF8_C)
-m      |void   |_invlist_intersection  |NN SV* const a|NN SV* const b|NN SV** i
-EXp    |void   |_invlist_intersection_maybe_complement_2nd \
-               |NULLOK SV* const a|NN SV* const b          \
-               |const bool complement_b|NN SV** i
-Cm     |void   |_invlist_union |NULLOK SV* const a|NN SV* const b|NN SV** output
-EXp    |void   |_invlist_union_maybe_complement_2nd        \
-               |NULLOK SV* const a|NN SV* const b          \
-               |const bool complement_b|NN SV** output
-m      |void   |_invlist_subtract|NN SV* const a|NN SV* const b|NN SV** result
-EXp    |void   |_invlist_invert|NN SV* const invlist
-EXpR   |SV*    |_new_invlist   |IV initial_size
-EXpR   |SV*    |_add_range_to_invlist  |NULLOK SV* invlist|UV start|UV end
-EXpR   |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_DQUOTE_C) || defined(PERL_IN_TOKE_C)
-EpRX   |bool   |grok_bslash_x  |NN char** s                    \
-                               |NN const char* const send      \
-                               |NN UV* uv                      \
-                               |NN const char** message        \
-                               |NULLOK U32 * packed_warn       \
-                               |const bool strict              \
-                               |const bool allow_UV_MAX        \
-                               |const bool utf8
-EpRX   |bool   |grok_bslash_c  |const char source              \
-                               |NN U8 * result                 \
-                               |NN const char** message        \
-                               |NULLOK U32 * packed_warn
-EpRX   |bool   |grok_bslash_o  |NN char** s                    \
-                               |NN const char* const send      \
-                               |NN UV* uv                      \
-                               |NN const char** message        \
-                               |NULLOK U32 * packed_warn       \
-                               |const bool strict              \
-                               |const bool allow_UV_MAX        \
-                               |const bool utf8
-EpRX   |const char *|form_alien_digit_msg|const U8 which       \
-                               |const STRLEN valids_len        \
-                               |NN const char * const first_bad\
-                               |NN const char * const send     \
-                               |const bool UTF                 \
-                               |const bool braced
-#endif
-#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_DQUOTE_C) || defined(PERL_IN_TOKE_C) || defined(PERL_IN_UTF8_C)
-EpRX   |const char *|form_cp_too_large_msg|const U8 which      \
-                               |NULLOK const char * string     \
-                               |const Size_t len               \
-                               |const UV cp
-#endif
-#if defined(PERL_IN_REGCOMP_C) || defined (PERL_IN_DUMP_C) || defined(PERL_IN_OP_C)
-EXp    |void   |_invlist_dump  |NN PerlIO *file|I32 level   \
-                               |NN const char* const indent \
-                               |NN SV* const invlist
-#endif
-#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_OP_C)
-EiRT   |STRLEN*|get_invlist_iter_addr  |NN SV* invlist
-EiT    |void   |invlist_iterinit|NN SV* invlist
-EiRT   |bool   |invlist_iternext|NN SV* invlist|NN UV* start|NN UV* end
-EiT    |void   |invlist_iterfinish|NN SV* invlist
-#endif
-#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
-EXp    |bool   |_invlistEQ     |NN SV* const a|NN SV* const b|const bool complement_b
-#endif
-#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_PP_C) || defined(PERL_IN_TOKE_C) || defined(PERL_IN_UNIVERSAL_C)
-EiT    |const char *|get_regex_charset_name|const U32 flags|NN STRLEN* const lenp
-#endif
-#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C)   \
- || defined(PERL_IN_PP_C) || defined(PERL_IN_OP_C)             \
- || defined(PERL_IN_TOKE_C) || defined(PERL_IN_UTF8_C)         \
- || defined(PERL_IN_DOOP_C)
-EiRT   |UV*    |invlist_array  |NN SV* const invlist
-EiRT   |bool   |is_invlist     |NULLOK const SV* const invlist
-EiRT   |bool*  |get_invlist_offset_addr|NN SV* invlist
-EiRT   |UV     |_invlist_len   |NN SV* const invlist
-EiRT   |bool   |_invlist_contains_cp|NN SV* const invlist|const UV cp
-EXpRT  |SSize_t|_invlist_search        |NN SV* const invlist|const UV cp
-#endif
-#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C)
-#  ifndef PERL_EXT_RE_BUILD
-Ep     |SV*    |get_regclass_nonbitmap_data                               \
-                               |NULLOK const regexp *prog                 \
-                               |NN const struct regnode *node             \
-                               |bool doinit                               \
-                               |NULLOK SV **listsvp                       \
-                               |NULLOK SV **lonly_utf8_locale             \
-                               |NULLOK SV **output_invlist
-#  else
-Ep     |SV*    |get_re_gclass_nonbitmap_data                              \
-                               |NULLOK const regexp *prog                 \
-                               |NN const struct regnode *node             \
-                               |bool doinit                               \
-                               |NULLOK SV **listsvp                       \
-                               |NULLOK SV **lonly_utf8_locale             \
-                               |NULLOK SV **output_invlist
-#endif
-Ep     |void   |regprop        |NULLOK const regexp *prog|NN SV* sv|NN const regnode* o|NULLOK const regmatch_info *reginfo \
-                               |NULLOK const RExC_state_t *pRExC_state
-Efp    |int    |re_printf      |NN const char *fmt|...
-#endif
-#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C) || defined(PERL_IN_TOKE_C)
-ERp    |bool   |is_grapheme    |NN const U8 * strbeg|NN const U8 * s|NN const U8 *strend|const UV cp
-#endif
-#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C) || defined(PERL_IN_UTF8_C)
-EXTp   |UV     |_to_fold_latin1|const U8 c|NN U8 *p|NN STRLEN *lenp|const unsigned int flags
-#endif
-#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_SV_C)
-EpX    |SV*    |invlist_clone  |NN SV* const invlist|NULLOK SV* newlist
-#endif
-#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_TOKE_C)
-EXpRT  |bool   |regcurly       |NN const char *s|NN const char *e|NULLOK const char * result[5]
-#endif
-#if defined(PERL_IN_REGEXEC_C)
-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
-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 \
-                               |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  \
-                               |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\
-                               |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
-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
-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
-ERST   |I32    |reg_check_named_buff_matched   |NN const regexp *rex \
-                                               |NN const regnode *scan
-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                     \
-                               |NN U8 ** curpos                                \
-                               |const bool utf8_target
-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                                \
-                               |NN const U8 * const strend                     \
-                               |const bool utf8_target
-ESR    |LB_enum|backup_one_LB  |NN const U8 * const strbeg                     \
-                               |NN U8 ** curpos                                \
-                               |const bool utf8_target
-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                                \
-                               |NN const U8 * const strend                     \
-                               |const bool utf8_target
-ESR    |SB_enum|backup_one_SB  |NN const U8 * const strbeg                     \
-                               |NN U8 ** curpos                                \
-                               |const bool utf8_target
-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                                \
-                               |NN const U8 * const strend                     \
-                               |const bool utf8_target                         \
-                               |const bool skip_Extend_Format
-ESR    |WB_enum|backup_one_WB  |NN WB_enum * previous                  \
-                               |NN const U8 * const strbeg                     \
-                               |NN U8 ** curpos                                \
-                               |const bool utf8_target
-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\
-                               |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\
-                               |NN const char *start|NN const char *end\
-                               |NN const char *blurb
+Cdp    |void   |taint_env
+Cdp    |void   |taint_proper   |NULLOK const char *f                   \
+                               |NN const char * const s
+Apx    |void   |thread_locale_init
+Apx    |void   |thread_locale_term
 
-EFp    |int    |re_exec_indentf|NN const char *fmt|U32 depth|...
-#  endif
-#endif
-#if defined(PERL_IN_REGEXEC_C)
-ESR    |bool   |isFOO_lc       |const U8 classnum|const U8 character
-#endif
+Fp     |OP *   |tied_method    |NN SV *methname                        \
+                               |NN SV **sp                             \
+                               |NN SV * const sv                       \
+                               |NN const MAGIC * const mg              \
+                               |const U32 flags                        \
+                               |U32 argc                               \
+                               |...
+Xp     |SSize_t|tmps_grow_p    |SSize_t ix
+Xiop   |I32    |TOPMARK
+Cm     |UV     |to_uni_fold    |UV c                                   \
+                               |NN U8 *p                               \
+                               |NN STRLEN *lenp
+Cp     |UV     |_to_uni_fold_flags                                     \
+                               |UV c                                   \
+                               |NN U8 *p                               \
+                               |NN STRLEN *lenp                        \
+                               |U8 flags
+Cp     |UV     |to_uni_lower   |UV c                                   \
+                               |NN U8 *p                               \
+                               |NN STRLEN *lenp
+Cp     |UV     |to_uni_title   |UV c                                   \
+                               |NN U8 *p                               \
+                               |NN STRLEN *lenp
+Cp     |UV     |to_uni_upper   |UV c                                   \
+                               |NN U8 *p                               \
+                               |NN STRLEN *lenp
+Cp     |UV     |_to_utf8_fold_flags                                    \
+                               |NN const U8 *p                         \
+                               |NULLOK const U8 *e                     \
+                               |NN U8 *ustrp                           \
+                               |NULLOK STRLEN *lenp                    \
+                               |U8 flags
 
-Cpd    |void   |taint_env
-Cpd    |void   |taint_proper   |NULLOK const char* f|NN const char *const s
-EXp    |char * |_byte_dump_string                                      \
-                               |NN const U8 * const start              \
-                               |const STRLEN len                       \
-                               |const bool format
+Cp     |UV     |_to_utf8_lower_flags                                   \
+                               |NN const U8 *p                         \
+                               |NULLOK const U8 *e                     \
+                               |NN U8 *ustrp                           \
+                               |NULLOK STRLEN *lenp                    \
+                               |bool flags
+Cp     |UV     |_to_utf8_title_flags                                   \
+                               |NN const U8 *p                         \
+                               |NULLOK const U8 *e                     \
+                               |NN U8 *ustrp                           \
+                               |NULLOK STRLEN *lenp                    \
+                               |bool flags
+Cp     |UV     |_to_utf8_upper_flags                                   \
+                               |NN const U8 *p                         \
+                               |NULLOK const U8 *e                     \
+                               |NN U8 *ustrp                           \
+                               |NULLOK STRLEN *lenp                    \
+                               |bool flags
 
-#if defined(PERL_IN_UTF8_C)
-iTR    |int    |does_utf8_overflow|NN const U8 * const s               \
-                                  |NN const U8 * e                     \
-                                  |const bool consider_overlongs
-iTR    |int    |is_utf8_overlong|NN const U8 * const s                 \
-                               |const STRLEN len
-iTR    |int    |isFF_overlong  |NN const U8 * const s|const STRLEN len
-SR     |char * |unexpected_non_continuation_text                       \
-               |NN const U8 * const s                                  \
-               |STRLEN print_len                                       \
-               |const STRLEN non_cont_byte_pos                         \
-               |const STRLEN expect_len
-#if 0  /* Not currently used, but may be needed in the future */
-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
-#endif
-S      |UV     |to_case_cp_list|const UV original                              \
-                               |NULLOK const U32 ** const remaining_list       \
-                               |NULLOK Size_t * remaining_count                \
-                               |NN SV *invlist                                 \
-                               |NN const I32 * const invmap                    \
-                               |NULLOK const U32 * const * const aux_tables    \
-                               |NULLOK const U8 * const aux_table_lengths      \
-                               |NN const char * const normal
-S      |UV     |_to_utf8_case  |const UV original                              \
-                               |NULLOK const U8 *p                             \
-                               |NN U8* ustrp                                   \
-                               |NN STRLEN *lenp                                \
-                               |NN SV *invlist                                 \
-                               |NN const I32 * const invmap                    \
-                               |NULLOK const U32 * 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
-#endif
-Cp     |UV     |_to_utf8_lower_flags|NN const U8 *p|NULLOK const U8* e         \
-                               |NN U8* ustrp|NULLOK STRLEN *lenp|bool flags
-Cp     |UV     |_to_utf8_upper_flags   |NN const U8 *p|NULLOK const U8 *e      \
-                               |NN U8* ustrp|NULLOK STRLEN *lenp|bool flags
-Cp     |UV     |_to_utf8_title_flags   |NN const U8 *p|NULLOK const U8* e      \
-                               |NN U8* ustrp|NULLOK STRLEN *lenp|bool flags
-Cp     |UV     |_to_utf8_fold_flags|NN const U8 *p|NULLOK const U8 *e          \
-                               |NN U8* ustrp|NULLOK STRLEN *lenp|U8 flags
-#if defined(PERL_IN_MG_C) || defined(PERL_IN_PP_C)
-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
-#endif
-#if defined(UNLINK_ALL_VERSIONS)
-Cp     |I32    |unlnk          |NN const char* f
-#endif
-AbpdD  |SSize_t|unpack_str     |NN const char *pat|NN const char *patend|NN const char *s \
-                               |NULLOK const char *strbeg|NN const char *strend|NULLOK char **new_s \
-                               |I32 ocnt|U32 flags
-Apd    |SSize_t|unpackstring   |NN const char *pat|NN const char *patend|NN const char *s \
-                               |NN const char *strend|U32 flags
-Cpd    |void   |unsharepvn     |NULLOK const char* sv|I32 len|U32 hash
+EXop   |bool   |try_amagic_bin |int method                             \
+                               |int flags
+EXop   |bool   |try_amagic_un  |int method                             \
+                               |int flags
+Adp    |SSize_t|unpackstring   |NN const char *pat                     \
+                               |NN const char *patend                  \
+                               |NN const char *s                       \
+                               |NN const char *strend                  \
+                               |U32 flags
 : Used in gv.c, hv.c
-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
-Cp     |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_base|NN U8* p|NN U8 *d|Size_t bytelen|NN Size_t *newlen  \
-                               |const bool high|const bool low
-EMXp   |U8*    |utf16_to_utf8  |NN U8* p|NN U8 *d|Size_t bytelen|NN Size_t *newlen
-EMXp   |U8*    |utf16_to_utf8_reversed|NN U8* p|NN U8 *d|Size_t bytelen|NN Size_t *newlen
-EXpx   |U8*    |utf8_to_utf16_base|NN U8* s|NN U8 *d|Size_t bytelen|NN Size_t *newlen  \
-                               |const bool high|const bool low
-AdpR   |STRLEN |utf8_length    |NN const U8* s|NN const U8 *e
-AipdR  |IV     |utf8_distance  |NN const U8 *a|NN const U8 *b
-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
-AMxdp  |U8*    |bytes_from_utf8|NN const U8 *s|NN STRLEN *lenp|NN bool *is_utf8p
-CxTdp  |U8*    |bytes_from_utf8_loc|NN const U8 *s                         \
-                                   |NN STRLEN *lenp                        \
-                                   |NN bool *is_utf8p                      \
-                                   |NULLOK const U8 ** first_unconverted
-Apxd   |U8*    |bytes_to_utf8  |NN const U8 *s|NN STRLEN *lenp
-ApdDb  |UV     |utf8_to_uvchr  |NN const U8 *s|NULLOK STRLEN *retlen
-CbpdD  |UV     |utf8_to_uvuni  |NN const U8 *s|NULLOK STRLEN *retlen
-CbpD   |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
-Cip    |UV     |utf8_to_uvchr_buf_helper|NN const U8 *s|NN const U8 *send|NULLOK STRLEN *retlen
-CpdD   |UV     |utf8_to_uvuni_buf      |NN const U8 *s|NN const U8 *send|NULLOK STRLEN *retlen
-p      |bool   |check_utf8_print       |NN const U8 *s|const STRLEN len
+Cp     |void   |unshare_hek    |NULLOK HEK *hek
+Cdp    |void   |unsharepvn     |NULLOK const char *sv                  \
+                               |I32 len                                \
+                               |U32 hash
+Adp    |SV *   |upg_version    |NN SV *ver                             \
+                               |bool qv
+ARdip  |IV     |utf8_distance  |NN const U8 *a                         \
+                               |NN const U8 *b
+ARTdip |U8 *   |utf8_hop       |NN const U8 *s                         \
+                               |SSize_t off
+ARTdip |U8 *   |utf8_hop_back  |NN const U8 *s                         \
+                               |SSize_t off                            \
+                               |NN const U8 *start
+ARTdip |U8 *   |utf8_hop_forward                                       \
+                               |NN const U8 *s                         \
+                               |SSize_t off                            \
+                               |NN const U8 *end
+ARTdip |U8 *   |utf8_hop_safe  |NN const U8 *s                         \
+                               |SSize_t off                            \
+                               |NN const U8 *start                     \
+                               |NN const U8 *end
+ARdp   |STRLEN |utf8_length    |NN const U8 *s0                        \
+                               |NN const U8 *e
 
-AdMTp  |UV     |utf8n_to_uvchr |NN const U8 *s                             \
-                               |STRLEN curlen                              \
-                               |NULLOK STRLEN *retlen                      \
+AMTdp  |UV     |utf8n_to_uvchr |NN const U8 *s                         \
+                               |STRLEN curlen                          \
+                               |NULLOK STRLEN *retlen                  \
                                |const U32 flags
-AdMTp  |UV     |utf8n_to_uvchr_error|NN const U8 *s                        \
-                               |STRLEN curlen                              \
-                               |NULLOK STRLEN *retlen                      \
-                               |const U32 flags                            \
-                               |NULLOK U32 * errors
-ATdip  |UV     |utf8n_to_uvchr_msgs|NN const U8 *s                         \
-                               |STRLEN curlen                              \
-                               |NULLOK STRLEN *retlen                      \
-                               |const U32 flags                            \
-                               |NULLOK U32 * errors                        \
-                               |NULLOK AV ** msgs
-CTp    |UV     |_utf8n_to_uvchr_msgs_helper                                \
-                               |NN const U8 *s                             \
-                               |STRLEN curlen                              \
-                               |NULLOK STRLEN *retlen                      \
-                               |const U32 flags                            \
-                               |NULLOK U32 * errors                        \
-                               |NULLOK AV ** msgs
-CipTRd |UV     |valid_utf8_to_uvchr    |NN const U8 *s|NULLOK STRLEN *retlen
-CdbDp  |UV     |utf8n_to_uvuni|NN const U8 *s|STRLEN curlen|NULLOK STRLEN *retlen|U32 flags
+AMTdp  |UV     |utf8n_to_uvchr_error                                   \
+                               |NN const U8 *s                         \
+                               |STRLEN curlen                          \
+                               |NULLOK STRLEN *retlen                  \
+                               |const U32 flags                        \
+                               |NULLOK U32 *errors
+ATdip  |UV     |utf8n_to_uvchr_msgs                                    \
+                               |NN const U8 *s                         \
+                               |STRLEN curlen                          \
+                               |NULLOK STRLEN *retlen                  \
+                               |const U32 flags                        \
+                               |NULLOK U32 *errors                     \
+                               |NULLOK AV **msgs
+CTp    |UV     |_utf8n_to_uvchr_msgs_helper                            \
+                               |NN const U8 *s                         \
+                               |STRLEN curlen                          \
+                               |NULLOK STRLEN *retlen                  \
+                               |const U32 flags                        \
+                               |NULLOK U32 *errors                     \
+                               |NULLOK AV **msgs
+CDbdp  |UV     |utf8n_to_uvuni |NN const U8 *s                         \
+                               |STRLEN curlen                          \
+                               |NULLOK STRLEN *retlen                  \
+                               |U32 flags
+Adpx   |U8 *   |utf8_to_bytes  |NN U8 *s                               \
+                               |NN STRLEN *lenp
+EMXp   |U8 *   |utf16_to_utf8  |NN U8 *p                               \
+                               |NN U8 *d                               \
+                               |Size_t bytelen                         \
+                               |NN Size_t *newlen
+EXp    |U8 *   |utf16_to_utf8_base                                     \
+                               |NN U8 *p                               \
+                               |NN U8 *d                               \
+                               |Size_t bytelen                         \
+                               |NN Size_t *newlen                      \
+                               |const bool high                        \
+                               |const bool low
+EXpx   |U8 *   |utf8_to_utf16_base                                     \
+                               |NN U8 *s                               \
+                               |NN U8 *d                               \
+                               |Size_t bytelen                         \
+                               |NN Size_t *newlen                      \
+                               |const bool high                        \
+                               |const bool low
+EMXp   |U8 *   |utf16_to_utf8_reversed                                 \
+                               |NN U8 *p                               \
+                               |NN U8 *d                               \
+                               |Size_t bytelen                         \
+                               |NN Size_t *newlen
+ADbdp  |UV     |utf8_to_uvchr  |NN const U8 *s                         \
+                               |NULLOK STRLEN *retlen
+AMdp   |UV     |utf8_to_uvchr_buf                                      \
+                               |NN const U8 *s                         \
+                               |NN const U8 *send                      \
+                               |NULLOK STRLEN *retlen
+Cip    |UV     |utf8_to_uvchr_buf_helper                               \
+                               |NN const U8 *s                         \
+                               |NN const U8 *send                      \
+                               |NULLOK STRLEN *retlen
+CDbdp  |UV     |utf8_to_uvuni  |NN const U8 *s                         \
+                               |NULLOK STRLEN *retlen
+: Used in perly.y
+p      |void   |utilize        |int aver                               \
+                               |I32 floor                              \
+                               |NULLOK OP *version                     \
+                               |NN OP *idop                            \
+                               |NULLOK OP *arg
 
-Adm    |U8*    |uvchr_to_utf8  |NN U8 *d|UV uv
-Cp     |U8*    |uvuni_to_utf8  |NN U8 *d|UV uv
-Adm    |U8*    |uvchr_to_utf8_flags    |NN U8 *d|UV uv|UV flags
-Adm    |U8*    |uvchr_to_utf8_flags_msgs|NN U8 *d|UV uv|UV flags|NULLOK HV ** msgs
-CMpd   |U8*    |uvoffuni_to_utf8_flags |NN U8 *d|UV uv|UV flags
-Cp     |U8*    |uvoffuni_to_utf8_flags_msgs|NN U8 *d|UV input_uv|const UV flags|NULLOK HV** msgs
-CdpbD  |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
-EXpR   |Size_t |_inverse_folds |const UV cp                                \
-                               |NN U32 * first_folds_to                    \
-                               |NN const U32 ** remaining_folds_to
+Adm    |U8 *   |uvchr_to_utf8  |NN U8 *d                               \
+                               |UV uv
+Adm    |U8 *   |uvchr_to_utf8_flags                                    \
+                               |NN U8 *d                               \
+                               |UV uv                                  \
+                               |UV flags
+Adm    |U8 *   |uvchr_to_utf8_flags_msgs                               \
+                               |NN U8 *d                               \
+                               |UV uv                                  \
+                               |UV flags                               \
+                               |NULLOK HV **msgs
+CMdp   |U8 *   |uvoffuni_to_utf8_flags                                 \
+                               |NN U8 *d                               \
+                               |UV uv                                  \
+                               |UV flags
+Cp     |U8 *   |uvoffuni_to_utf8_flags_msgs                            \
+                               |NN U8 *d                               \
+                               |UV input_uv                            \
+                               |const UV flags                         \
+                               |NULLOK HV **msgs
+Cp     |U8 *   |uvuni_to_utf8  |NN U8 *d                               \
+                               |UV uv
+EXdpx  |bool   |validate_proto |NN SV *name                            \
+                               |NULLOK SV *proto                       \
+                               |bool warn                              \
+                               |bool curstash
+CRTdip |UV     |valid_utf8_to_uvchr                                    \
+                               |NN const U8 *s                         \
+                               |NULLOK STRLEN *retlen
+Adp    |int    |vcmp           |NN SV *lhv                             \
+                               |NN SV *rhv
+Adpr   |void   |vcroak         |NULLOK const char *pat                 \
+                               |NULLOK va_list *args
+Adp    |void   |vdeb           |NN const char *pat                     \
+                               |NULLOK va_list *args
+Adp    |char * |vform          |NN const char *pat                     \
+                               |NULLOK va_list *args
 : Used by Data::Alias
-EXp    |void   |vivify_defelem |NN SVsv
+EXp    |void   |vivify_defelem |NN SV *sv
 : Used in pp.c
-pR     |SV*    |vivify_ref     |NN SV* sv|U32 to_what
+Rp     |SV *   |vivify_ref     |NN SV *sv                              \
+                               |U32 to_what
+Adp    |void   |vload_module   |U32 flags                              \
+                               |NN SV *name                            \
+                               |NULLOK SV *ver                         \
+                               |NULLOK va_list *args
+Adp    |SV *   |vmess          |NN const char *pat                     \
+                               |NULLOK va_list *args
+ARdp   |SV *   |vnewSVpvf      |NN const char * const pat              \
+                               |NULLOK va_list * const args
+Adp    |SV *   |vnormal        |NN SV *vs
+Adp    |SV *   |vnumify        |NN SV *vs
+Adp    |SV *   |vstringify     |NN SV *vs
+Adp    |SV *   |vverify        |NN SV *vs
+Adp    |void   |vwarn          |NN const char *pat                     \
+                               |NULLOK va_list *args
+Adp    |void   |vwarner        |U32 err                                \
+                               |NN const char *pat                     \
+                               |NULLOK va_list *args
 : Used in pp_sys.c
-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
-Cp     |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
-p      |void   |debug_hash_seed|bool via_debug_h
-: Used in doio.c, pp_hot.c, pp_sys.c
-p      |void   |report_evil_fh |NULLOK const GV *gv
-: Used in doio.c, pp_hot.c, pp_sys.c
-p      |void   |report_wrongway_fh|NULLOK const GV *gv|const char have
-: Used in mg.c, pp.c, pp_hot.c, regcomp.c
-XEpd   |void   |report_uninit  |NULLOK const SV *uninit_sv
-#if defined(PERL_IN_OP_C) || defined(PERL_IN_SV_C)
-p      |void   |report_redefined_cv|NN const SV *name \
-                                   |NN const CV *old_cv \
-                                   |NULLOK SV * const *new_const_svp
-#endif
-Apd    |void   |warn_sv        |NN SV *baseex
-Afpd   |void   |warn           |NN const char* pat|...
-Apd    |void   |vwarn          |NN const char* pat|NULLOK va_list* args
-Adfp   |void   |warner         |U32 err|NN const char* pat|...
-Adfp   |void   |ck_warner      |U32 err|NN const char* pat|...
-Adfp   |void   |ck_warner_d    |U32 err|NN const char* pat|...
-Adp    |void   |vwarner        |U32 err|NN const char* pat|NULLOK va_list* args
-#ifdef USE_C_BACKTRACE
-pd     |Perl_c_backtrace*|get_c_backtrace|int max_depth|int skip
-dm     |void   |free_c_backtrace|NN Perl_c_backtrace* bt
-Apd    |SV*    |get_c_backtrace_dump|int max_depth|int skip
-Apd    |bool   |dump_c_backtrace|NN PerlIO* fp|int max_depth|int skip
-#endif
+p      |I32    |wait4pid       |Pid_t pid                              \
+                               |NN int *statusp                        \
+                               |int flags
+Adfp   |void   |warn           |NN const char *pat                     \
+                               |...
+Adfp   |void   |warner         |U32 err                                \
+                               |NN const char *pat                     \
+                               |...
+TXp    |void   |_warn_problematic_locale
+Adp    |void   |warn_sv        |NN SV *baseex
+: Used in cop.h
+RXop   |I32    |was_lvalue_sub
 : FIXME
-p      |void   |watch          |NN char** addr
-Amd    |I32    |whichsig       |NN const char* sig
-Apd    |I32    |whichsig_sv    |NN SV* sigsv
-Apd    |I32    |whichsig_pv    |NN const char* sig
-Apd    |I32    |whichsig_pvn   |NN const char* sig|STRLEN len
-: used to check for NULs in pathnames and other names
-AiRdp  |bool   |is_safe_syscall|NN const char *pv|STRLEN len|NN const char *what|NN const char *op_name
-#ifdef PERL_CORE
-iTR    |bool   |should_warn_nl|NN const char *pv
-#endif
+p      |void   |watch          |NN char **addr
+Adm    |I32    |whichsig       |NN const char *sig
+Adp    |I32    |whichsig_pv    |NN const char *sig
+Adp    |I32    |whichsig_pvn   |NN const char *sig                     \
+                               |STRLEN len
+Adp    |I32    |whichsig_sv    |NN SV *sigsv
+Adpx   |void   |wrap_infix_plugin                                      \
+                               |NN Perl_infix_plugin_t new_plugin      \
+                               |NN Perl_infix_plugin_t *old_plugin_p
+Adpx   |void   |wrap_keyword_plugin                                    \
+                               |NN Perl_keyword_plugin_t new_plugin    \
+                               |NN Perl_keyword_plugin_t *old_plugin_p
+Adp    |void   |wrap_op_checker|Optype opcode                          \
+                               |NN Perl_check_t new_checker            \
+                               |NN Perl_check_t *old_checker_p
 : Used in pp_ctl.c
-p      |void   |write_to_stderr|NN SV* msv
+p      |void   |write_to_stderr|NN SV *msv
+Xp     |void   |xs_boot_epilog |const I32 ax
+
+FTXop  |I32    |xs_handshake   |const U32 key                          \
+                               |NN void *v_my_perl                     \
+                               |NN const char *file                    \
+                               |...
 : Used in op.c
-p      |int    |yyerror        |NN const char *const s
-p      |void   |yyquit
-pr     |void   |abort_execution|NN const char * const msg|NN const char * const name
-p      |int    |yyerror_pv     |NN const char *const s|U32 flags
-p      |int    |yyerror_pvn    |NULLOK const char *const s|STRLEN len|U32 flags
+p      |int    |yyerror        |NN const char * const s
+p      |int    |yyerror_pv     |NN const char * const s                \
+                               |U32 flags
+p      |int    |yyerror_pvn    |NULLOK const char * const s            \
+                               |STRLEN len                             \
+                               |U32 flags
 : Used in perly.y, and by Data::Alias
 EXp    |int    |yylex
-p      |void   |yyunlex
 : Used in perl.c, pp_ctl.c
 p      |int    |yyparse        |int gramtype
-: Only used in scope.c
-p      |void   |parser_free    |NN const yy_parser *parser
-#ifdef PERL_CORE
-p      |void   |parser_free_nexttoke_ops|NN yy_parser *parser \
-                                        |NN OPSLAB *slab
+p      |void   |yyquit
+p      |void   |yyunlex
+#if defined(DEBUGGING)
+: Used in mg.c
+Rp     |int    |get_debug_opts |NN const char **s                      \
+                               |bool givehelp
+Adop   |void   |hv_assert      |NN HV *hv
+Cdp    |void   |pad_setsv      |PADOFFSET po                           \
+                               |NN SV *sv
+Cdp    |SV *   |pad_sv         |PADOFFSET po
+TXp    |void   |set_padlist    |NN CV *cv                              \
+                               |NULLOK PADLIST *padlist
 #endif
-#if defined(PERL_IN_TOKE_C)
-S      |int    |yywarn         |NN const char *const s|U32 flags
+#if defined(DEBUG_LEAKING_SCALARS_FORK_DUMP)
+: Used in sv.c
+p      |void   |dump_sv_child  |NN SV *sv
 #endif
-#if defined(MYMALLOC)
-Apd    |void   |dump_mstats    |NN const char* s
-Cp     |int    |get_mstats     |NN perl_mstats_t *buf|int buflen|int level
-#endif
-ATdpa  |Malloc_t|safesysmalloc |MEM_SIZE nbytes
-ATdpa  |Malloc_t|safesyscalloc |MEM_SIZE elements|MEM_SIZE size
-ATdpR  |Malloc_t|safesysrealloc|Malloc_t where|MEM_SIZE nbytes
-AdTp   |Free_t |safesysfree    |Malloc_t where
-CrTp   |void   |croak_memory_wrap
-Cpdh   |int    |runops_standard
-Cpdh   |int    |runops_debug
-Afpd   |void   |sv_catpvf_mg   |NN SV *const sv|NN const char *const pat|...
-Apd    |void   |sv_vcatpvf_mg  |NN SV *const sv|NN const char *const pat \
-                               |NULLOK va_list *const args
-Apd    |void   |sv_catpv_mg    |NN SV *const dsv|NULLOK const char *const sstr
-ApdbM  |void   |sv_catpvn_mg   |NN SV *dsv|NN const char *sstr|STRLEN len
-ApdbM  |void   |sv_catsv_mg    |NN SV *dsv|NULLOK SV *sstr
-Afpd   |void   |sv_setpvf_mg   |NN SV *const sv|NN const char *const pat|...
-Apd    |void   |sv_vsetpvf_mg  |NN SV *const sv|NN const char *const pat \
-                               |NULLOK va_list *const args
-Apd    |void   |sv_setiv_mg    |NN SV *const sv|const IV i
-ApdbD  |void   |sv_setpviv_mg  |NN SV *const sv|const IV iv
-Apd    |void   |sv_setuv_mg    |NN SV *const sv|const UV u
-Apd    |void   |sv_setnv_mg    |NN SV *const sv|const NV num
-Apd    |void   |sv_setpv_mg    |NN SV *const sv|NULLOK const char *const ptr
-Apd    |void   |sv_setpvn_mg   |NN SV *const sv|NN const char *const ptr|const STRLEN len
-Apd    |void   |sv_setsv_mg    |NN SV *const dsv|NULLOK SV *const ssv
-ApdbM  |void   |sv_usepvn_mg   |NN SV *sv|NULLOK char *ptr|STRLEN len
-CpRx   |MGVTBL*|get_vtbl       |int vtbl_id
-Apd    |char*  |pv_display     |NN SV *dsv|NN const char *pv|STRLEN cur|STRLEN len \
-                               |STRLEN pvlim
-Apd    |char*  |pv_escape      |NULLOK SV *dsv|NN char const * const str\
-                                |const STRLEN count|const STRLEN max\
-                                |NULLOK STRLEN * const escaped\
-                                |const U32 flags
-Apd    |char*  |pv_pretty      |NN SV *dsv|NN char const * const str\
-                                |const STRLEN count|const STRLEN max\
-                                |NULLOK char const * const start_color\
-                                |NULLOK char const * const end_color\
-                                |const U32 flags
-Cfp    |void   |dump_indent    |I32 level|NN PerlIO *file|NN const char* pat|...
-Cp     |void   |dump_vindent   |I32 level|NN PerlIO *file|NN const char* pat \
-                               |NULLOK va_list *args
-Cp     |void   |do_gv_dump     |I32 level|NN PerlIO *file|NN const char *name\
-                               |NULLOK GV *sv
-Cp     |void   |do_gvgv_dump   |I32 level|NN PerlIO *file|NN const char *name\
-                               |NULLOK GV *sv
-Cp     |void   |do_hv_dump     |I32 level|NN PerlIO *file|NN const char *name\
-                               |NULLOK HV *sv
-Cp     |void   |do_magic_dump  |I32 level|NN PerlIO *file|NULLOK const MAGIC *mg|I32 nest \
-                               |I32 maxnest|bool dumpops|STRLEN pvlim
-Cp     |void   |do_op_dump     |I32 level|NN PerlIO *file|NULLOK const OP *o
-Cp     |void   |do_pmop_dump   |I32 level|NN PerlIO *file|NULLOK const PMOP *pm
-Cp     |void   |do_sv_dump     |I32 level|NN PerlIO *file|NULLOK SV *sv|I32 nest \
-                               |I32 maxnest|bool dumpops|STRLEN pvlim
-Apd    |void   |magic_dump     |NULLOK const MAGIC *mg
-Cp     |void   |reginitcolors
-CpdRMb |char*  |sv_2pv_nolen   |NN SV* sv
-CpdRMb |char*  |sv_2pvutf8_nolen|NN SV* sv
-CpdRMb |char*  |sv_2pvbyte_nolen|NN SV* sv
-CpMdbR |char*  |sv_pv          |NN SV *sv
-CpMdbR |char*  |sv_pvutf8      |NN SV *sv
-CpMdbR |char*  |sv_pvbyte      |NN SV *sv
-ApMdb  |STRLEN |sv_utf8_upgrade|NN SV *sv
-Amd    |STRLEN |sv_utf8_upgrade_nomg|NN SV *sv
-ApdMb  |bool   |sv_utf8_downgrade|NN SV *const sv|const bool fail_ok
-Amd    |bool   |sv_utf8_downgrade_nomg|NN SV *const sv|const bool fail_ok
-Apd    |bool   |sv_utf8_downgrade_flags|NN SV *const sv|const bool fail_ok|const U32 flags
-Apd    |void   |sv_utf8_encode |NN SV *const sv
-Apd    |bool   |sv_utf8_decode |NN SV *const sv
-ApdMb  |void   |sv_force_normal|NN SV *sv
-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
-ATpxd  |SV*    |sv_get_backrefs|NN SV *const sv
-AiTMdp |SV *   |SvREFCNT_inc   |NULLOK SV *sv
-AiTMdp |SV *   |SvREFCNT_inc_NN|NN SV *sv
-AiTMdp |void   |SvREFCNT_inc_void|NULLOK SV *sv
-AiMdp  |void   |SvREFCNT_dec   |NULLOK SV *sv
-AiMdp  |void   |SvREFCNT_dec_NN|NN SV *sv
-AiTpd  |void   |SvAMAGIC_on    |NN SV *sv
-AiTpd  |void   |SvAMAGIC_off   |NN SV *sv
-Aipd   |bool   |SvTRUE         |NULLOK SV *sv
-Aipd   |bool   |SvTRUE_nomg    |NULLOK SV *sv
-Aipd   |bool   |SvTRUE_NN      |NN SV *sv
-Cip    |bool   |SvTRUE_common  |NN SV *sv|const bool sv_2bool_is_fallback
-: 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
-Adm    |CV*    |newATTRSUB     |I32 floor|NULLOK OP *o|NULLOK OP *proto|NULLOK OP *attrs|NULLOK OP *block
-pdX    |CV*    |newATTRSUB_x   |I32 floor|NULLOK OP *o|NULLOK OP *proto \
-                                |NULLOK OP *attrs|NULLOK OP *block \
-                                |bool o_is_gv
-Cp     |CV *   |newMYSUB       |I32 floor|NN OP *o|NULLOK OP *proto \
-                               |NULLOK OP *attrs|NULLOK OP *block
-p      |CV*    |newSTUB        |NN GV *gv|bool fake
-: Used in perly.y
-p      |OP *   |my_attrs       |NN OP *o|NULLOK OP *attrs
-#if defined(USE_ITHREADS)
-CpR    |PERL_CONTEXT*|cx_dup   |NULLOK PERL_CONTEXT* cx|I32 ix|I32 max|NN CLONE_PARAMS* param
-CpdR   |PERL_SI*|si_dup        |NULLOK PERL_SI* si|NN CLONE_PARAMS* param
-CpdR   |ANY*   |ss_dup         |NN PerlInterpreter* proto_perl|NN CLONE_PARAMS* param
-CpR    |void*  |any_dup        |NULLOK void* v|NN const PerlInterpreter* proto_perl
-CpR    |HE*    |he_dup         |NULLOK const HE* e|bool shared|NN CLONE_PARAMS* param
-CpR    |HEK*   |hek_dup        |NULLOK HEK* e|NN CLONE_PARAMS* param
-Adp    |void   |re_dup_guts    |NN const REGEXP *sstr|NN REGEXP *dstr \
-                               |NN CLONE_PARAMS* param
-Cpd    |PerlIO*|fp_dup         |NULLOK PerlIO *const fp|const char type|NN CLONE_PARAMS *const param
-CpdR   |DIR*   |dirp_dup       |NULLOK DIR *const dp|NN CLONE_PARAMS *const param
-CpdR   |GP*    |gp_dup         |NULLOK GP *const gp|NN CLONE_PARAMS *const param
-CpdR   |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 \
-                               |SSize_t items|NN CLONE_PARAMS *const param
-SR     |SV*    |sv_dup_common  |NN const SV *const ssv \
-                               |NN CLONE_PARAMS *const param
-#endif
-ApR    |SV*    |sv_dup         |NULLOK const SV *const ssv|NN CLONE_PARAMS *const param
-ApR    |SV*    |sv_dup_inc     |NULLOK const SV *const ssv \
-                               |NN CLONE_PARAMS *const param
-Cp     |void   |rvpv_dup       |NN SV *const dsv|NN const SV *const ssv|NN CLONE_PARAMS *const param
-Cp     |yy_parser*|parser_dup  |NULLOK const yy_parser *const proto|NN CLONE_PARAMS *const param
-#endif
-ApdR   |PTR_TBL_t*|ptr_table_new
-ApdR   |void*  |ptr_table_fetch|NN PTR_TBL_t *const tbl|NULLOK const void *const sv
-Apd    |void   |ptr_table_store|NN PTR_TBL_t *const tbl|NULLOK const void *const oldsv \
-                               |NN void *const newsv
-Apd    |void   |ptr_table_split|NN PTR_TBL_t *const tbl
-Apd    |void   |ptr_table_free|NULLOK PTR_TBL_t *const tbl
-#if defined(HAVE_INTERP_INTERN)
-Cp     |void   |sys_intern_clear
-Cp     |void   |sys_intern_init
-#  if defined(USE_ITHREADS)
-Cp     |void   |sys_intern_dup |NN struct interp_intern* src|NN struct interp_intern* dst
-#  endif
+#if !defined(EBCDIC)
+CRTip  |unsigned int|variant_byte_number                               \
+                               |PERL_UINTMAX_T word
 #endif
-
-: The reason for the 'u' flag is that this passes "aTHX_ x" to its callee: not
-: a legal C parameter
-Admu   |const XOP *    |Perl_custom_op_xop     |NN const OP *o
-AbpRdD |const char *   |custom_op_name |NN const OP *o
-AbpRdD |const char *   |custom_op_desc |NN const OP *o
-pRX    |XOPRETANY      |custom_op_get_field    |NN const OP *o|const xop_flags_enum field
-Adop   |void   |custom_op_register     |NN Perl_ppaddr_t ppaddr \
-                       |NN const XOP *xop
-
-Adp    |void   |sv_nosharing   |NULLOK SV *sv
-AdpbD  |void   |sv_nolocking   |NULLOK SV *sv
-Adp    |bool   |sv_destroyable |NULLOK SV *sv
-AdpbD  |void   |sv_nounlocking |NULLOK SV *sv
-Adp    |int    |nothreadhook
-p      |void   |init_constants
-
-#if defined(PERL_IN_DOOP_C)
-SR     |Size_t |do_trans_simple        |NN SV * const sv|NN const OPtrans_map * const tbl
-SR     |Size_t |do_trans_count         |NN SV * const sv|NN const OPtrans_map * const tbl
-SR     |Size_t |do_trans_complex       |NN SV * const sv|NN const OPtrans_map * const tbl
-SR     |Size_t |do_trans_invmap        |NN SV * const sv|NN AV * const map
-SR     |Size_t |do_trans_count_invmap  |NN SV * const sv|NN AV * const map
+#if defined(F_FREESP) && !defined(HAS_CHSIZE) && !defined(HAS_TRUNCATE)
+ARdp   |I32    |my_chsize      |int fd                                 \
+                               |Off_t length
 #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 \
-                     |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 \
-                     |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 \
-                     |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 \
-                      |const U32 is_utf8
-S      |void   |require_tie_mod|NN GV *gv|NN const char varname \
-                               |NN const char * name|STRLEN len \
-                               |const U32 flags
+#if !defined(HAS_GETENV_LEN)
+: Used in hv.c
+p      |char * |getenv_len     |NN const char *env_elem                \
+                               |NN unsigned long *len
 #endif
-
-#if defined(PERL_IN_HV_C) || defined(PERL_IN_SV_C)
-po     |SV*    |hfree_next_entry       |NN HV *hv|NN STRLEN *indexp
+#if !defined(HAS_MKOSTEMP)
+Tdop   |int    |my_mkostemp    |NN char *templte                       \
+                               |int flags
 #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 HE *entry
-#if !defined(PURIFY)
-SR     |HE*    |new_he
-#endif
-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
-S      |struct xpvhv_aux*|hv_auxinit|NN HV *hv
-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
-Sx     |void   |clear_placeholders     |NN HV *hv|U32 items
+#if !defined(HAS_MKSTEMP)
+Tdop   |int    |my_mkstemp     |NN char *templte
 #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 \
-                               |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
-
+#if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
+: Defined in doio.c, used only in pp_sys.c
+p      |I32    |do_ipcctl      |I32 optype                             \
+                               |NN SV **mark                           \
+                               |NN SV **sp
+: Defined in doio.c, used only in pp_sys.c
+p      |I32    |do_ipcget      |I32 optype                             \
+                               |NN SV **mark                           \
+                               |NN SV **sp
+: Defined in doio.c, used only in pp_sys.c
+p      |I32    |do_msgrcv      |NN SV **mark                           \
+                               |NN SV **sp
+: Defined in doio.c, used only in pp_sys.c
+p      |I32    |do_msgsnd      |NN SV **mark                           \
+                               |NN SV **sp
+: Defined in doio.c, used only in pp_sys.c
+p      |I32    |do_semop       |NN SV **mark                           \
+                               |NN SV **sp
+: Defined in doio.c, used only in pp_sys.c
+p      |I32    |do_shmio       |I32 optype                             \
+                               |NN SV **mark                           \
+                               |NN SV **sp
+#endif /* defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM) */
+#if defined(HAS_NL_LANGINFO) && defined(PERL_LANGINFO_H)
+ATdo   |const char *|Perl_langinfo                                     \
+                               |const nl_item item
+ATdo   |const char *|Perl_langinfo8                                    \
+                               |const nl_item item                     \
+                               |NULLOK utf8ness_t *utf8ness
+#else
+ATdo   |const char *|Perl_langinfo                                     \
+                               |const int item
+ATdo   |const char *|Perl_langinfo8                                    \
+                               |const int item                         \
+                               |NULLOK utf8ness_t *utf8ness
 #endif
-
-#if defined(USE_ITHREADS)
-Cip    |AV*    |cop_file_avn   |NN const COP *cop
+#if defined(HAS_PIPE)
+Rp     |int    |PerlProc_pipe_cloexec                                  \
+                               |NN int *pipefd
 #endif
-
-#if defined(PERL_IN_OP_C)
-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 \
-                                       |NN const char *const fullname\
-                                       |NN GV *const gv|NN CV *const cv
-S      |void   |clear_special_blocks   |NN const char *const fullname\
-                                       |NN GV *const gv|NN CV *const cv
-#endif
-p      |void   |no_bareword_filehandle|NN const char *fhname
-XpR    |void*  |Slab_Alloc     |size_t sz
-Xp     |void   |Slab_Free      |NN void *op
-#if defined(PERL_DEBUG_READONLY_OPS)
-#    if defined(PERL_CORE)
-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
-poex   |OP *   |op_refcnt_inc  |NULLOK OP *o
-: FIXME - can be static.
-poex   |PADOFFSET      |op_refcnt_dec  |NN OP *o
+#if !defined(HAS_RENAME)
+: Used in pp_sys.c
+p      |I32    |same_dirent    |NN const char *a                       \
+                               |NN const char *b
 #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 \
-                               |U32 flags
-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 \
-                               |NN bool *suidscript
-Sr     |void   |usage
-#ifndef SETUID_SCRIPTS_ARE_SECURE_NOW
-So     |void   |validate_suid  |NN PerlIO *rsfp
+#if !defined(HAS_SIGNBIT)
+APTdox |int    |Perl_signbit   |NV f
 #endif
-Sr     |void   |minus_v
-
-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
-#  endif
+#if defined(HAS_SOCKET)
+Rp     |int    |PerlSock_accept_cloexec                                \
+                               |int listenfd                           \
+                               |NULLOK struct sockaddr *addr           \
+                               |NULLOK Sock_size_t *addrlen
+Rp     |int    |PerlSock_socket_cloexec                                \
+                               |int domain                             \
+                               |int type                               \
+                               |int protocol
+#endif
+#if   defined(HAS_SOCKETPAIR) ||                                     \
+    ( defined(AF_INET) && defined(HAS_SOCKET) && defined(PF_INET) && \
+      defined(SOCK_DGRAM) )
+Rp     |int    |PerlSock_socketpair_cloexec                            \
+                               |int domain                             \
+                               |int type                               \
+                               |int protocol                           \
+                               |NN int *pairfd
 #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
+#if !defined(HAS_STRLCAT)
+ATdip  |Size_t |my_strlcat     |NULLOK char *dst                       \
+                               |NULLOK const char *src                 \
+                               |Size_t size
 #endif
-#if defined(PERL_IN_PP_C) || defined(PERL_IN_PP_HOT_C)
-: Used in pp_hot.c
-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
+#if !defined(HAS_STRLCPY)
+ATds   |Size_t |my_strlcpy     |NULLOK char *dst                       \
+                               |NULLOK const char *src                 \
+                               |Size_t size
 #endif
-#if defined(PERL_IN_PP_HOT_C)
-IR     |bool   |should_we_output_Debug_r|NN regexp * prog
+#if !defined(HAS_STRNLEN)
+ATdip  |Size_t |my_strnlen     |NN const char *str                     \
+                               |Size_t maxlen
 #endif
-
-#if defined(PERL_IN_PP_PACK_C)
-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 \
-                               |char ender
-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
+#if defined(HAVE_INTERP_INTERN)
+Cp     |void   |sys_intern_clear
+Cp     |void   |sys_intern_init
+# if defined(USE_ITHREADS)
+Cp     |void   |sys_intern_dup |NN struct interp_intern *src           \
+                               |NN struct interp_intern *dst
+# endif
 #endif
-
-#if defined(PERL_IN_PP_CTL_C)
-SdR    |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
-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
-#ifndef PERL_DISABLE_PMC
-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
+#if defined(_MSC_VER)
+p      |int    |magic_regdatum_set                                     \
+                               |NN SV *sv                              \
+                               |NN MAGIC *mg
+#else
+pr     |int    |magic_regdatum_set                                     \
+                               |NN SV *sv                              \
+                               |NN MAGIC *mg
 #endif
-
-#if defined(PERL_IN_PP_HOT_C)
-S      |void   |do_oddball     |NN SV **oddkey|NN SV **firstkey
-i      |HV*    |opmethod_stash |NN SV* meth
+#if defined(MULTIPLICITY)
+ATdfpr |void   |croak_nocontext|NULLOK const char *pat                 \
+                               |...
+ATdfp  |void   |deb_nocontext  |NN const char *pat                     \
+                               |...
+ATdfpr |OP *   |die_nocontext  |NULLOK const char *pat                 \
+                               |...
+ATdfp  |char * |form_nocontext |NN const char *pat                     \
+                               |...
+AFTdp  |void   |load_module_nocontext                                  \
+                               |U32 flags                              \
+                               |NN SV *name                            \
+                               |NULLOK SV *ver                         \
+                               |...
+ATdfp  |SV *   |mess_nocontext |NN const char *pat                     \
+                               |...
+Cdop   |void * |my_cxt_init    |NN int *indexp                         \
+                               |size_t size
+ATdfp  |SV *   |newSVpvf_nocontext                                     \
+                               |NN const char * const pat              \
+                               |...
+ATdfp  |void   |sv_catpvf_mg_nocontext                                 \
+                               |NN SV * const sv                       \
+                               |NN const char * const pat              \
+                               |...
+ATdfp  |void   |sv_catpvf_nocontext                                    \
+                               |NN SV * const sv                       \
+                               |NN const char * const pat              \
+                               |...
+ATdfp  |void   |sv_setpvf_mg_nocontext                                 \
+                               |NN SV * const sv                       \
+                               |NN const char * const pat              \
+                               |...
+ATdfp  |void   |sv_setpvf_nocontext                                    \
+                               |NN SV * const sv                       \
+                               |NN const char * const pat              \
+                               |...
+ATdfp  |void   |warner_nocontext                                       \
+                               |U32 err                                \
+                               |NN const char *pat                     \
+                               |...
+ATdfp  |void   |warn_nocontext |NN const char *pat                     \
+                               |...
+#endif /* defined(MULTIPLICITY) */
+#if defined(MYMALLOC)
+Adp    |void   |dump_mstats    |NN const char *s
+Cp     |int    |get_mstats     |NN perl_mstats_t *buf                  \
+                               |int buflen                             \
+                               |int level
+RTp    |MEM_SIZE|malloced_size |NN void *p
+RTp    |MEM_SIZE|malloc_good_size                                      \
+                               |size_t nbytes
+#endif
+#if defined(PERL_ANY_COW)
+: Used in regexec.c
+EXpx   |SV *   |sv_setsv_cow   |NULLOK SV *dsv                         \
+                               |NN SV *ssv
 #endif
-
-#if defined(PERL_IN_PP_SORT_C)
-i      |I32    |sv_ncmp        |NN SV *const a|NN SV *const b
-i      |I32    |sv_ncmp_desc   |NN SV *const a|NN SV *const b
-i      |I32    |sv_i_ncmp      |NN SV *const a|NN SV *const b
-i      |I32    |sv_i_ncmp_desc |NN SV *const a|NN SV *const b
-i      |I32    |amagic_ncmp    |NN SV *const a|NN SV *const b
-i      |I32    |amagic_ncmp_desc       |NN SV *const a|NN SV *const b
-i      |I32    |amagic_i_ncmp  |NN SV *const a|NN SV *const b
-i      |I32    |amagic_i_ncmp_desc     |NN SV *const a|NN SV *const b
-i      |I32    |amagic_cmp     |NN SV *const str1|NN SV *const str2
-i      |I32    |amagic_cmp_desc        |NN SV *const str1|NN SV *const str2
-i      |I32    |cmp_desc       |NN SV *const str1|NN SV *const str2
-#  ifdef USE_LOCALE_COLLATE
-i      |I32    |amagic_cmp_locale     |NN SV *const str1|NN SV *const str2
-i      |I32    |amagic_cmp_locale_desc|NN SV *const str1|NN SV *const str2
-i      |I32    |cmp_locale_desc|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
-I      |void   |sortsv_flags_impl      |NULLOK SV** array|size_t num_elts|NN SVCOMPARE_t cmp|U32 flags
+#if defined(PERL_CORE)
+p      |void   |opslab_force_free                                      \
+                               |NN OPSLAB *slab
+p      |void   |opslab_free    |NN OPSLAB *slab
+p      |void   |opslab_free_nopad                                      \
+                               |NN OPSLAB *slab
+p      |void   |parser_free_nexttoke_ops                               \
+                               |NN yy_parser *parser                   \
+                               |NN OPSLAB *slab
+RTi    |bool   |should_warn_nl |NN const char *pv
+# if defined(PERL_DEBUG_READONLY_OPS)
+ep     |void   |Slab_to_ro     |NN OPSLAB *slab
+ep     |void   |Slab_to_rw     |NN OPSLAB * const slab
+# endif
+#endif /* defined(PERL_CORE) */
+#if defined(PERL_CORE) || defined(PERL_EXT)
+ERXdp  |bool   |isSCRIPT_RUN   |NN const U8 *s                         \
+                               |NN const U8 *send                      \
+                               |const bool utf8_target
+ERTXdip |bool  |is_utf8_non_invariant_string                           \
+                               |NN const U8 * const s                  \
+                               |STRLEN len
+Ei     |STRLEN |sv_or_pv_pos_u2b                                       \
+                               |NN SV *sv                              \
+                               |NN const char *pv                      \
+                               |STRLEN pos                             \
+                               |NULLOK STRLEN *lenp
+ERTdi  |Size_t |variant_under_utf8_count                               \
+                               |NN const U8 * const s                  \
+                               |NN const U8 * const e
+# if !defined(HAS_MEMRCHR)
+ETei   |void * |my_memrchr     |NN const char *s                       \
+                               |const char c                           \
+                               |const STRLEN len
+# endif
 #endif
-
-#if defined(PERL_IN_PP_SYS_C)
-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
-#  endif
-S      |SV *   |space_join_names_mortal|NULLOK char *const *array
-#endif
-Fp     |OP *   |tied_method|NN SV *methname|NN SV **sp \
-                               |NN SV *const sv|NN const MAGIC *const mg \
-                               |const U32 flags|U32 argc|...
-
-#if defined(PERL_IN_DUMP_C)
-S      |CV*    |deb_curcv      |I32 ix
-Sd     |void   |debprof        |NN const OP *o
-S      |UV     |sequence_num   |NULLOK const OP *o
-S      |SV*    |pm_description |NN const PMOP *pm
+#if defined(PERL_CORE) || defined(PERL_USE_VOLATILE_API)
+Adp    |void   |finalize_optree|NN OP *o
+Adp    |void   |optimize_optree|NN OP *o
 #endif
-
-#if defined(PERL_IN_SCOPE_C)
-S      |SV*    |save_scalar_at |NN SV **sptr|const U32 flags
+#if defined(PERL_DEBUG_READONLY_COW)
+p      |void   |sv_buf_to_ro   |NN SV *sv
 #endif
-
-#if defined(PERL_IN_GV_C) || defined(PERL_IN_SV_C) || defined(PERL_IN_PAD_C) || defined(PERL_IN_OP_C)
-: Used in gv.c
-po     |void   |sv_add_backref |NN SV *const tsv|NN SV *const sv
+#if defined(PERL_DEBUG_READONLY_OPS)
+: FIXME - can be static.
+eopx   |PADOFFSET|op_refcnt_dec|NN OP *o
+: Used in OpREFCNT_inc() in sv.c
+eopx   |OP *   |op_refcnt_inc  |NULLOK OP *o
 #endif
-
-#if defined(PERL_IN_HV_C) || defined(PERL_IN_MG_C) || defined(PERL_IN_SV_C)
-: Used in hv.c and mg.c
-pox    |void   |sv_kill_backrefs       |NN SV *const sv|NULLOK AV *const av
+#if defined(PERL_DEFAULT_DO_EXEC3_IMPLEMENTATION)
+Mp     |bool   |do_exec        |NN const char *cmd
+#else
+p      |bool   |do_exec        |NN const char *cmd
 #endif
-
-#if defined(PERL_IN_SV_C) || defined (PERL_IN_OP_C)
-pR     |SV *   |varname        |NULLOK const GV *const gv|const char gvtype \
-                               |PADOFFSET targ|NULLOK const SV *const keyname \
-                               |SSize_t aindex|int subscript_type
+#if defined(PERL_DONT_CREATE_GVSV)
+AMbdp  |GV *   |gv_SVadd       |NULLOK GV *gv
 #endif
-
-pX     |void   |sv_del_backref |NN SV *const tsv|NN SV *const sv
-#if defined(PERL_IN_SV_C)
-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
-#  ifdef DEBUGGING
-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
-#    else
-S      |int    |sv_2iuv_non_preserve   |NN SV *const sv
-#    endif
-#  endif
-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|NN bool *canonical_position
-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 \
-               |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 \
-               |const STRLEN ulen
-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 \
-               |NN const U8 *end|STRLEN endu
-S      |void   |assert_uft8_cache_coherent|NN const char *const func \
-               |STRLEN from_cache|STRLEN real|NN SV *const sv
-ST     |char * |F0convert      |NV nv|NN char *const endbuf|NN STRLEN *const len
-Cp     |SV *   |more_sv
-S      |bool   |sv_2iuv_common |NN SV *const sv
-S      |void   |glob_assign_glob|NN SV *const dsv|NN SV *const ssv \
-               |const int dtype
-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
+#if defined(PERL_IMPLICIT_SYS)
+CTo    |PerlInterpreter *|perl_alloc_using                             \
+                               |NN struct IPerlMem *ipM                \
+                               |NN struct IPerlMem *ipMS               \
+                               |NN struct IPerlMem *ipMP               \
+                               |NN struct IPerlEnv *ipE                \
+                               |NN struct IPerlStdIO *ipStd            \
+                               |NN struct IPerlLIO *ipLIO              \
+                               |NN struct IPerlDir *ipD                \
+                               |NN struct IPerlSock *ipS               \
+                               |NN struct IPerlProc *ipP
+# if defined(USE_ITHREADS)
+CTo    |PerlInterpreter *|perl_clone_using                             \
+                               |NN PerlInterpreter *proto_perl         \
+                               |UV flags                               \
+                               |NN struct IPerlMem *ipM                \
+                               |NN struct IPerlMem *ipMS               \
+                               |NN struct IPerlMem *ipMP               \
+                               |NN struct IPerlEnv *ipE                \
+                               |NN struct IPerlStdIO *ipStd            \
+                               |NN struct IPerlLIO *ipLIO              \
+                               |NN struct IPerlDir *ipD                \
+                               |NN struct IPerlSock *ipS               \
+                               |NN struct IPerlProc *ipP
+# endif
+#else
+Adp    |I32    |my_pclose      |NULLOK PerlIO *ptr
+Adp    |PerlIO *|my_popen      |NN const char *cmd                     \
+                               |NN const char *mode
+# if defined(USE_ITHREADS)
+i      |bool   |PerlEnv_putenv |NN char *str
+# endif
 #endif
-
-: Used in sv.c and hv.c
-Cpo    |void * |more_bodies    |const svtype sv_type|const size_t body_size \
-                               |const size_t arena_size
-EXpR   |SV*    |get_and_check_backslash_N_name|NN const char* s        \
-                               |NN const char* e                       \
-                               |const bool is_utf8                     \
-                               |NN const char** error_msg
-EXpR   |HV*    |load_charnames |NN SV * char_name                      \
-                               |NN const char * context                \
-                               |const STRLEN context_len               \
-                               |NN const char ** error_msg
-
-: For use ONLY in B::Hooks::Parser, by special dispensation
-EXpxR  |char*  |scan_str       |NN char *start|int keep_quoted \
-                               |int keep_delims|int re_reparse \
-                               |NULLOK char **delimp
-EXpx   |char*  |scan_word      |NN char *s|NN char *dest|STRLEN destlen \
-                               |int allow_package|NN STRLEN *slp
-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 \
-                               |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 \
-                               |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       \
-                               |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 \
-                               |NULLOK const char *const buf|STRLEN len
-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
-#endif
-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            \
-                               |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 \
-                     |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
-#  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
-#  endif
-#endif
-EdXxp  |bool   |validate_proto |NN SV *name|NULLOK SV *proto|bool warn \
-               |bool curstash
-
-#if defined(PERL_IN_UNIVERSAL_C)
-SG     |bool   |isa_lookup     |NULLOK HV *stash|NULLOK SV *namesv|NULLOK const char * name \
-                                        |STRLEN len|U32 flags
-SG   |bool   |sv_derived_from_svpvn  |NULLOK SV *sv                    \
-                                    |NULLOK SV *namesv                 \
-                                    |NULLOK const char * name          \
-                                    |const STRLEN len                  \
-                                    |U32 flags
+#if defined(PERL_IN_AV_C)
+S      |MAGIC *|get_aux_mg     |NN AV *av
+#endif
+#if defined(PERL_IN_CLASS_C) || defined(PERL_IN_OP_C)    || \
+    defined(PERL_IN_PAD_C)   || defined(PERL_IN_PERLY_C) || \
+    defined(PERL_IN_TOKE_C)
+; Functions in class.c that are called by the parser (perly.c, toke.c, pad.c)
+Cp     |void   |class_add_ADJUST                                       \
+                               |NN HV *stash                           \
+                               |NN CV *cv
+Cp     |void   |class_add_field|NN HV *stash                           \
+                               |NN PADNAME *pn
+Cp     |void   |class_apply_attributes                                 \
+                               |NN HV *stash                           \
+                               |NULLOK OP *attrlist
+Cp     |void   |class_apply_field_attributes                           \
+                               |NN PADNAME *pn                         \
+                               |NULLOK OP *attrlist
+Cp     |void   |class_prepare_initfield_parse
+Cp     |void   |class_prepare_method_parse                             \
+                               |NN CV *cv
+Cp     |void   |class_seal_stash                                       \
+                               |NN HV *stash
+Cp     |void   |class_set_field_defop                                  \
+                               |NN PADNAME *pn                         \
+                               |OPCODE defmode                         \
+                               |NN OP *defop
+Cp     |void   |class_setup_stash                                      \
+                               |NN HV *stash
+Cp     |OP *   |class_wrap_method_body                                 \
+                               |NULLOK OP *o
+Cp     |void   |croak_kw_unless_class                                  \
+                               |NN const char *kw
+#endif /* defined(PERL_IN_CLASS_C) || defined(PERL_IN_OP_C)    ||
+          defined(PERL_IN_PAD_C)   || defined(PERL_IN_PERLY_C) ||
+          defined(PERL_IN_TOKE_C) */
+#if defined(PERL_IN_DEB_C)
+S      |void   |deb_stack_n    |NN SV **stack_base                     \
+                               |I32 stack_min                          \
+                               |I32 stack_max                          \
+                               |I32 mark_min                           \
+                               |I32 mark_max
 #endif
-
-#if defined(PERL_IN_LOCALE_C)
-#  ifdef USE_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
-ST     |const char*|my_nl_langinfo|const nl_item item|bool toggle
-#  else
-ST     |const char*|my_nl_langinfo|const int item|bool toggle
-#  endif
-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
-#    ifdef USE_POSIX_2008_LOCALE
-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
-#    endif
-#    ifdef DEBUGGING
-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        \
-                                       |NN const char * const e        \
-                                       |const bool is_utf8
-STR    |char * |setlocale_debug_string |const int category                 \
-                                       |NULLOK const char* const locale    \
-                                       |NULLOK const char* const retval
-#    endif
-#  endif
+#if defined(PERL_IN_DOIO_C)
+S      |bool   |argvout_final  |NN MAGIC *mg                           \
+                               |NN IO *io                              \
+                               |bool is_explicit
+S      |void   |exec_failed    |NN const char *cmd                     \
+                               |int fd                                 \
+                               |int do_report
+RS     |bool   |ingroup        |Gid_t testgid                          \
+                               |bool effective
+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                            \
+                               |bool was_fdopen                        \
+                               |NULLOK const char *type                \
+                               |NULLOK Stat_t *statbufp
+S      |IO *   |openn_setup    |NN GV *gv                              \
+                               |NN char *mode                          \
+                               |NN PerlIO **saveifp                    \
+                               |NN PerlIO **saveofp                    \
+                               |NN int *savefd                         \
+                               |NN char *savetype
 #endif
-
-#if        defined(USE_LOCALE)         \
-    && (   defined(PERL_IN_LOCALE_C)   \
-        || defined(PERL_IN_MG_C)       \
-       || defined (PERL_EXT_POSIX)     \
-       || defined (PERL_EXT_LANGINFO))
-Cp     |bool   |_is_cur_LC_category_utf8|int category
+#if defined(PERL_IN_DOOP_C)
+RS     |Size_t |do_trans_complex                                       \
+                               |NN SV * const sv                       \
+                               |NN const OPtrans_map * const tbl
+RS     |Size_t |do_trans_count |NN SV * const sv                       \
+                               |NN const OPtrans_map * const tbl
+RS     |Size_t |do_trans_count_invmap                                  \
+                               |NN SV * const sv                       \
+                               |NN AV * const map
+RS     |Size_t |do_trans_invmap|NN SV * const sv                       \
+                               |NN AV * const map
+RS     |Size_t |do_trans_simple|NN SV * const sv                       \
+                               |NN const OPtrans_map * const tbl
+#endif
+#if defined(PERL_IN_DOOP_C)    || defined(PERL_IN_OP_C)        || \
+    defined(PERL_IN_PP_C)      || defined(PERL_IN_REGCOMP_ANY) || \
+    defined(PERL_IN_REGEXEC_C) || defined(PERL_IN_TOKE_C)      || \
+    defined(PERL_IN_UTF8_C)
+ERTi   |bool * |get_invlist_offset_addr                                \
+                               |NN SV *invlist
+ERTi   |UV *   |invlist_array  |NN SV * const invlist
+ERTi   |bool   |_invlist_contains_cp                                   \
+                               |NN SV * const invlist                  \
+                               |const UV cp
+ERTi   |UV     |_invlist_len   |NN SV * const invlist
+ERTXp  |SSize_t|_invlist_search|NN SV * const invlist                  \
+                               |const UV cp
+ERTi   |bool   |is_invlist     |NULLOK const SV * const invlist
 #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
-#  if defined(PERL_MEM_LOG) && !defined(PERL_MEM_LOG_NOIMPL)
-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 \
-                               |NN const char *funcname
-#  endif
+#if defined(PERL_IN_DOOP_C) || defined(PERL_IN_OP_C) || \
+    defined(PERL_IN_REGCOMP_ANY)
+ERi    |SV *   |add_cp_to_invlist                                      \
+                               |NULLOK SV *invlist                     \
+                               |const UV cp
+Ei     |void   |invlist_extend |NN SV * const invlist                  \
+                               |const UV len
+ERTi   |UV     |invlist_highest|NN SV * const invlist
+Ei     |void   |invlist_set_len|NN SV * const invlist                  \
+                               |const UV len                           \
+                               |const bool offset
+#endif
+#if defined(PERL_IN_DOOP_C)      || defined(PERL_IN_OP_C) || \
+    defined(PERL_IN_REGCOMP_ANY) || defined(PERL_IN_UTF8_C)
+ERXp   |SV *   |_add_range_to_invlist                                  \
+                               |NULLOK SV *invlist                     \
+                               |UV start                               \
+                               |UV end
+m      |void   |_invlist_intersection                                  \
+                               |NN SV * const a                        \
+                               |NN SV * const b                        \
+                               |NN SV **i
+EXp    |void   |_invlist_intersection_maybe_complement_2nd             \
+                               |NULLOK SV * const a                    \
+                               |NN SV * const b                        \
+                               |const bool complement_b                \
+                               |NN SV **i
+EXp    |void   |_invlist_invert|NN SV * const invlist
+m      |void   |_invlist_subtract                                      \
+                               |NN SV * const a                        \
+                               |NN SV * const b                        \
+                               |NN SV **result
+Cm     |void   |_invlist_union |NULLOK SV * const a                    \
+                               |NN SV * const b                        \
+                               |NN SV **output
+EXp    |void   |_invlist_union_maybe_complement_2nd                    \
+                               |NULLOK SV * const a                    \
+                               |NN SV * const b                        \
+                               |const bool complement_b                \
+                               |NN SV **output
+ERXp   |SV *   |_new_invlist   |IV initial_size
+ERXp   |SV *   |_setup_canned_invlist                                  \
+                               |const STRLEN size                      \
+                               |const UV element0                      \
+                               |NN UV **other_elements_ptr
+#endif /* defined(PERL_IN_DOOP_C)      || defined(PERL_IN_OP_C) ||
+          defined(PERL_IN_REGCOMP_ANY) || defined(PERL_IN_UTF8_C) */
+#if defined(PERL_IN_DQUOTE_C) || defined(PERL_IN_REGCOMP_C) || \
+    defined(PERL_IN_TOKE_C)
+ERXp   |const char *|form_alien_digit_msg                              \
+                               |const U8 which                         \
+                               |const STRLEN valids_len                \
+                               |NN const char * const first_bad        \
+                               |NN const char * const send             \
+                               |const bool UTF                         \
+                               |const bool braced
+ERXp   |bool   |grok_bslash_c  |const char source                      \
+                               |NN U8 *result                          \
+                               |NN const char **message                \
+                               |NULLOK U32 *packed_warn
+ERXp   |bool   |grok_bslash_o  |NN char **s                            \
+                               |NN const char * const send             \
+                               |NN UV *uv                              \
+                               |NN const char **message                \
+                               |NULLOK U32 *packed_warn                \
+                               |const bool strict                      \
+                               |const bool allow_UV_MAX                \
+                               |const bool utf8
+ERXp   |bool   |grok_bslash_x  |NN char **s                            \
+                               |NN const char * const send             \
+                               |NN UV *uv                              \
+                               |NN const char **message                \
+                               |NULLOK U32 *packed_warn                \
+                               |const bool strict                      \
+                               |const bool allow_UV_MAX                \
+                               |const bool utf8
 #endif
-
-#if defined(PERL_MEM_LOG)
-CpT    |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
-CpT    |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
-CpT    |Malloc_t       |mem_log_free   |Malloc_t oldalloc|NN const char *filename|const int linenumber|NN const char *funcname
-CpT    |void           |mem_log_new_sv|NN const SV *sv|NN const char *filename|int linenumber|NN const char *funcname
-CpT    |void           |mem_log_del_sv|NN const SV *sv|NN const char *filename|int linenumber|NN const char *funcname
+#if defined(PERL_IN_DQUOTE_C) || defined(PERL_IN_REGCOMP_C) || \
+    defined(PERL_IN_TOKE_C)   || defined(PERL_IN_UTF8_C)
+ERXp   |const char *|form_cp_too_large_msg                             \
+                               |const U8 which                         \
+                               |NULLOK const char *string              \
+                               |const Size_t len                       \
+                               |const UV cp
 #endif
-
-#if defined(PERL_IN_UTF8_C)
-SR     |HV *   |new_msg_hv |NN const char * const message                  \
-                           |U32 categories                                 \
-                           |U32 flag
-SR     |UV     |check_locale_boundary_crossing                             \
-               |NN const U8* const p                                       \
-               |const UV result                                            \
-               |NN U8* const ustrp                                         \
-               |NN STRLEN *lenp
-iR     |bool   |is_utf8_common |NN const U8 *const p                       \
-                               |NN const U8 *const e                       \
-                               |NULLOK SV* const invlist
+#if defined(PERL_IN_DUMP_C)
+S      |CV *   |deb_curcv      |I32 ix
+Sd     |void   |debprof        |NN const OP *o
+S      |SV *   |pm_description |NN const PMOP *pm
+S      |UV     |sequence_num   |NULLOK const OP *o
 #endif
-
-EXiTp  |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 *dsv|NULLOK SV *ssv|const I32 flags
-Apd    |void   |sv_catpvn_flags|NN SV *const dsv|NN const char *sstr|const STRLEN len \
-                               |const I32 flags
-Apd    |void   |sv_catpv_flags |NN SV *dsv|NN const char *sstr \
-                               |const I32 flags
-Apd    |void   |sv_catsv_flags |NN SV *const dsv|NULLOK SV *const sstr|const I32 flags
-Amd    |STRLEN |sv_utf8_upgrade_flags|NN SV *const sv|const I32 flags
-Adp    |STRLEN |sv_utf8_upgrade_flags_grow|NN SV *const sv|const I32 flags|STRLEN extra
-Apd    |char*  |sv_pvn_force_flags|NN SV *const sv|NULLOK STRLEN *const lp|const U32 flags
-AdpMb  |void   |sv_copypv      |NN SV *const dsv|NN SV *const ssv
-Amd    |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
-Cpo    |char*  |my_atof2       |NN const char *orig|NN NV* value
-Cp     |char*  |my_atof3       |NN const char *orig|NN NV* value|const STRLEN len
-CpdT   |int    |my_socketpair  |int family|int type|int protocol|int fd[2]
-ApTd   |int    |my_dirfd       |NULLOK DIR* dir
-#ifdef PERL_ANY_COW
-: Used in regexec.c
-pxXE   |SV*    |sv_setsv_cow   |NULLOK SV* dsv|NN SV* ssv
+#if defined(PERL_IN_DUMP_C)  || defined(PERL_IN_HV_C) || \
+    defined(PERL_IN_SCOPE_C) || defined(PERL_IN_SV_C)
+opx    |void   |hv_kill_backrefs                                       \
+                               |NN HV *hv
 #endif
-
-Cop    |const char *|PerlIO_context_layers|NULLOK const char *mode
-
-#if defined(USE_PERLIO)
-Apdh   |void   |PerlIO_clearerr        |NULLOK PerlIO *f
-Apdh   |int    |PerlIO_close           |NULLOK PerlIO *f
-Apdh   |int    |PerlIO_eof             |NULLOK PerlIO *f
-Apdh   |int    |PerlIO_error           |NULLOK PerlIO *f
-Apdh   |int    |PerlIO_fileno          |NULLOK PerlIO *f
-Apd    |int    |PerlIO_fill            |NULLOK PerlIO *f
-Apdh   |int    |PerlIO_flush           |NULLOK PerlIO *f
-Apdh   |STDCHAR *|PerlIO_get_base      |NULLOK PerlIO *f
-ApRdh  |SSize_t  |PerlIO_get_bufsiz    |NULLOK PerlIO *f
-ApRdh  |SSize_t  |PerlIO_get_cnt       |NULLOK PerlIO *f
-Apdh   |STDCHAR *|PerlIO_get_ptr       |NULLOK PerlIO *f
-Apdh   |SSize_t|PerlIO_read            |NULLOK PerlIO *f|NN void *vbuf \
-       |Size_t count
-Xp     |void   |PerlIO_restore_errno   |NULLOK PerlIO *f
-Xp     |void   |PerlIO_save_errno      |NULLOK PerlIO *f
-Apdh   |int    |PerlIO_seek            |NULLOK PerlIO *f|Off_t offset|int whence
-Apdh   |void   |PerlIO_set_cnt         |NULLOK PerlIO *f|SSize_t cnt
-Apdh   |void   |PerlIO_setlinebuf      |NULLOK PerlIO *f
-Apdh   |void   |PerlIO_set_ptrcnt      |NULLOK PerlIO *f|NULLOK STDCHAR *ptr \
-       |SSize_t cnt
-ApRdh  |PerlIO *|PerlIO_stderr
-ApRdh  |PerlIO *|PerlIO_stdin
-ApRdh  |PerlIO *|PerlIO_stdout
-Apdh   |Off_t  |PerlIO_tell            |NULLOK PerlIO *f
-Apd    |SSize_t|PerlIO_unread          |NULLOK PerlIO *f|NN const void *vbuf \
-       |Size_t count
-Apdh   |SSize_t|PerlIO_write           |NULLOK PerlIO *f|NN const void *vbuf \
-       |Size_t count
-#endif /* USE_PERLIO */
-
-: 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 \
-                               |I32 stack_max|I32 mark_min|I32 mark_max
+#if defined(PERL_IN_DUMP_C) || defined(PERL_IN_OP_C) || \
+    defined(PERL_IN_REGCOMP_ANY)
+EXp    |void   |_invlist_dump  |NN PerlIO *file                        \
+                               |I32 level                              \
+                               |NN const char * const indent           \
+                               |NN SV * const invlist
 #endif
-
-: pad API
-ApdR   |PADLIST*|pad_new       |int flags
-#ifdef DEBUGGING
-pTX    |void|set_padlist| NN CV * cv | NULLOK PADLIST * padlist
+#if defined(PERL_IN_GV_C)
+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
+i      |GV *   |gv_fetchmeth_internal                                  \
+                               |NULLOK HV *stash                       \
+                               |NULLOK SV *meth                        \
+                               |NULLOK const char *name                \
+                               |STRLEN len                             \
+                               |I32 level                              \
+                               |U32 flags
+S      |void   |gv_init_svtype |NN GV *gv                              \
+                               |const svtype sv_type
+S      |bool   |gv_is_in_main  |NN const char *name                    \
+                               |STRLEN len                             \
+                               |const U32 is_utf8
+S      |bool   |gv_magicalize  |NN GV *gv                              \
+                               |NN HV *stash                           \
+                               |NN const char *name                    \
+                               |STRLEN len                             \
+                               |const svtype sv_type
+S      |void   |gv_magicalize_isa                                      \
+                               |NN GV *gv
+i      |HV *   |gv_stashpvn_internal                                   \
+                               |NN const char *name                    \
+                               |U32 namelen                            \
+                               |I32 flags
+S      |void   |maybe_multimagic_gv                                    \
+                               |NN GV *gv                              \
+                               |NN const char *name                    \
+                               |const svtype sv_type
+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      |void   |require_tie_mod|NN GV *gv                              \
+                               |NN const char varname                  \
+                               |NN const char *name                    \
+                               |STRLEN len                             \
+                               |const U32 flags
+#endif /* defined(PERL_IN_GV_C) */
+#if defined(PERL_IN_GV_C)  || defined(PERL_IN_OP_C) || \
+    defined(PERL_IN_PAD_C) || defined(PERL_IN_SV_C)
+: Used in gv.c
+op     |void   |sv_add_backref |NN SV * const tsv                      \
+                               |NN SV * const sv
 #endif
-#if defined(PERL_IN_PAD_C)
-Sd     |PADOFFSET|pad_alloc_name|NN PADNAME *name|U32 flags \
-                               |NULLOK HV *typestash|NULLOK HV *ourstash
+#if defined(PERL_IN_GV_C) || defined(PERL_IN_UNIVERSAL_C)
+EGdp   |HV *   |gv_stashsvpvn_cached                                   \
+                               |SV *namesv                             \
+                               |const char *name                       \
+                               |U32 namelen                            \
+                               |I32 flags
 #endif
-Apd    |PADOFFSET|pad_add_name_pvn|NN const char *namepv|STRLEN namelen\
-                               |U32 flags|NULLOK HV *typestash\
-                               |NULLOK HV *ourstash
-Apd    |PADOFFSET|pad_add_name_pv|NN const char *name\
-                               |const U32 flags|NULLOK HV *typestash\
-                               |NULLOK HV *ourstash
-Apd    |PADOFFSET|pad_add_name_sv|NN SV *name\
-                               |U32 flags|NULLOK HV *typestash\
-                               |NULLOK HV *ourstash
-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 \
-                               |NULLOK const HV *ourstash
+#if defined(PERL_IN_HV_C)
+Sx     |void   |clear_placeholders                                     \
+                               |NN HV *hv                              \
+                               |U32 items
+S      |void   |hsplit         |NN HV *hv                              \
+                               |STRLEN const oldsize                   \
+                               |STRLEN newsize
+S      |struct xpvhv_aux *|hv_auxinit                                  \
+                               |NN HV *hv
+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
+S      |SV *   |hv_free_ent_ret|NN HE *entry
+S      |void   |hv_free_entries|NN HV *hv
+ST     |void   |hv_magic_check |NN HV *hv                              \
+                               |NN bool *needs_copy                    \
+                               |NN bool *needs_store
+Sr     |void   |hv_notallowed  |int flags                              \
+                               |NN const char *key                     \
+                               |I32 klen                               \
+                               |NN const char *msg
+S      |SV *   |refcounted_he_value                                    \
+                               |NN const struct refcounted_he *he
+RSTa   |HEK *  |save_hek_flags |NN const char *str                     \
+                               |I32 len                                \
+                               |U32 hash                               \
+                               |int flags
+RS     |HEK *  |share_hek_flags|NN const char *str                     \
+                               |STRLEN len                             \
+                               |U32 hash                               \
+                               |int flags
+S      |void   |unshare_hek_or_pvn                                     \
+                               |NULLOK const HEK *hek                  \
+                               |NULLOK const char *str                 \
+                               |I32 len                                \
+                               |U32 hash
+# if !defined(PURIFY)
+RS     |HE *   |new_he
+# endif
+#endif /* defined(PERL_IN_HV_C) */
+#if defined(PERL_IN_HV_C) || defined(PERL_IN_MG_C) || defined(PERL_IN_SV_C)
+: Used in hv.c and mg.c
+opx    |void   |sv_kill_backrefs                                       \
+                               |NN SV * const sv                       \
+                               |NULLOK AV * const av
 #endif
-Apd    |PADOFFSET|pad_findmy_pvn|NN const char* namepv|STRLEN namelen|U32 flags
-Apd    |PADOFFSET|pad_findmy_pv|NN const char* name|U32 flags
-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 \
-                               |NN const CV* cv|U32 seq|int warn \
-                               |NULLOK SV** out_capture \
-                               |NN PADNAME** out_name|NN int *out_flags
-#endif
-#ifdef DEBUGGING
-Cpd    |SV*    |pad_sv         |PADOFFSET po
-Cpd    |void   |pad_setsv      |PADOFFSET po|NN SV* sv
-#endif
-pd     |void   |pad_block_start|int full
-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
+#if defined(PERL_IN_HV_C) || defined(PERL_IN_SV_C)
+op     |SV *   |hfree_next_entry                                       \
+                               |NN HV *hv                              \
+                               |NN STRLEN *indexp
 #endif
-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
-#  endif
-#endif
-#if defined(PERL_IN_PAD_C) || defined(PERL_IN_OP_C)
-iT     |bool   |PadnameIN_SCOPE|NN const PADNAME * const pn|const U32 seq
-#endif
-Apd    |CV*    |cv_clone       |NN CV* proto
-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
-ApbdDR |HV*    |pad_compname_type|const PADOFFSET po
-AxpdRT |PADNAME *|padnamelist_fetch|NN PADNAMELIST *pnl|SSize_t key
-Xop    |void   |padnamelist_free|NN PADNAMELIST *pnl
-Axpd   |PADNAME **|padnamelist_store|NN PADNAMELIST *pnl|SSize_t key \
-                                    |NULLOK PADNAME *val
-Xop    |void   |padname_free   |NN PADNAME *pn
-#if defined(USE_ITHREADS)
-pdR    |PADNAME *|padname_dup  |NN PADNAME *src|NN CLONE_PARAMS *param
-pdR    |PADNAMELIST *|padnamelist_dup|NN PADNAMELIST *srcpad \
-                                     |NN CLONE_PARAMS *param
-pdR    |PADLIST *|padlist_dup  |NN PADLIST *srcpad \
-                               |NN CLONE_PARAMS *param
+#if defined(PERL_IN_LOCALE_C)
+S      |utf8ness_t|get_locale_string_utf8ness_i                        \
+                               |NULLOK const char *string              \
+                               |const locale_utf8ness_t known_utf8     \
+                               |NULLOK const char *locale              \
+                               |const unsigned cat_index
+S      |bool   |is_locale_utf8 |NN const char *locale
+# if defined(HAS_LOCALECONV)
+S      |HV *   |my_localeconv  |const int item
+S      |void   |populate_hash_from_localeconv                          \
+                               |NN HV *hv                              \
+                               |NN const char *locale                  \
+                               |const U32 which_mask                   \
+                               |NN const lconv_offset_t *strings[2]    \
+                               |NULLOK const lconv_offset_t *integers
+# endif
+# if defined(USE_LOCALE)
+ST     |unsigned int|get_category_index                                \
+                               |const int category                     \
+                               |NULLOK const char *locale
+ST     |int    |get_category_index_nowarn                              \
+                               |const int category
+Ri     |const char *|mortalized_pv_copy                                \
+                               |NULLOK const char * const pv
+S      |void   |new_LC_ALL     |NULLOK const char *unused              \
+                               |bool force
+So     |void   |restore_toggled_locale_i                               \
+                               |const unsigned cat_index               \
+                               |NULLOK const char *original_locale     \
+                               |const line_t caller_line
+ST     |const char *|save_to_buffer                                    \
+                               |NULLOK const char *string              \
+                               |NULLOK const char **buf                \
+                               |NULLOK Size_t *buf_size
+Sr     |void   |setlocale_failure_panic_i                              \
+                               |const unsigned int cat_index           \
+                               |NULLOK const char *current             \
+                               |NN const char *failed                  \
+                               |const line_t caller_0_line             \
+                               |const line_t caller_1_line
+S      |const char *|stdize_locale                                     \
+                               |const int category                     \
+                               |NULLOK const char *input_locale        \
+                               |NULLOK const char **buf                \
+                               |NULLOK Size_t *buf_size                \
+                               |line_t caller_line
+So     |const char *|toggle_locale_i                                   \
+                               |const unsigned switch_cat_index        \
+                               |NN const char *new_locale              \
+                               |const line_t caller_line
+#   if defined(DEBUGGING)
+RS     |char * |my_setlocale_debug_string_i                            \
+                               |const unsigned cat_index               \
+                               |NULLOK const char *locale              \
+                               |NULLOK const char *retval              \
+                               |const line_t line
+#   endif
+#   if defined(HAS_NL_LANGINFO) || defined(HAS_NL_LANGINFO_L)
+S      |const char *|my_langinfo_i                                     \
+                               |const nl_item item                     \
+                               |const unsigned int cat_index           \
+                               |NN const char *locale                  \
+                               |NN const char **retbufp                \
+                               |NULLOK Size_t *retbuf_sizep            \
+                               |NULLOK utf8ness_t *utf8ness
+#   else
+S      |const char *|my_langinfo_i                                     \
+                               |const int item                         \
+                               |const unsigned int cat_index           \
+                               |NN const char *locale                  \
+                               |NN const char **retbufp                \
+                               |NULLOK Size_t *retbuf_sizep            \
+                               |NULLOK utf8ness_t *utf8ness
+#   endif
+#   if defined(USE_LOCALE_COLLATE)
+S      |void   |new_collate    |NN const char *newcoll                 \
+                               |bool force
+#     if defined(DEBUGGING)
+S      |void   |print_collxfrm_input_and_return                        \
+                               |NN const char *s                       \
+                               |NN const char *e                       \
+                               |NULLOK const char *xbuf                \
+                               |const STRLEN xlen                      \
+                               |const bool is_utf8
+#     endif
+#   endif
+#   if defined(USE_LOCALE_CTYPE)
+ST     |bool   |is_codeset_name_UTF8                                   \
+                               |NN const char *name
+S      |void   |new_ctype      |NN const char *newctype                \
+                               |bool force
+#   endif
+#   if defined(USE_LOCALE_NUMERIC)
+S      |void   |new_numeric    |NN const char *newnum                  \
+                               |bool force
+#   endif
+#   if defined(USE_PERL_SWITCH_LOCALE_CONTEXT) || defined(DEBUGGING)
+S      |const char *|get_LC_ALL_display
+#   endif
+#   if defined(USE_POSIX_2008_LOCALE)
+S      |const char *|emulate_setlocale_i                               \
+                               |const unsigned int index               \
+                               |NULLOK const char *new_locale          \
+                               |const recalc_lc_all_t recalc_LC_ALL    \
+                               |const line_t line
+S      |const char *|my_querylocale_i                                  \
+                               |const unsigned int index
+S      |const char *|setlocale_from_aggregate_LC_ALL                   \
+                               |NN const char *locale                  \
+                               |const line_t line
+S      |locale_t|use_curlocale_scratch
+#     if defined(USE_QUERYLOCALE)
+S      |const char *|calculate_LC_ALL                                  \
+                               |const locale_t cur_obj
+#     else
+S      |const char *|update_PL_curlocales_i                            \
+                               |const unsigned int index               \
+                               |NN const char *new_locale              \
+                               |recalc_lc_all_t recalc_LC_ALL
+#     endif
+#   elif  defined(USE_LOCALE_THREADS) &&                  \
+         !defined(USE_THREAD_SAFE_LOCALE) &&              \
+         !defined(USE_THREAD_SAFE_LOCALE_EMULATION) /* &&
+         !defined(USE_POSIX_2008_LOCALE) */
+S      |const char *|less_dicey_setlocale_r                            \
+                               |const int category                     \
+                               |NULLOK const char *locale
+: Not currently used
+S      |void   |less_dicey_void_setlocale_i                            \
+                               |const unsigned cat_index               \
+                               |NN const char *locale                  \
+                               |const line_t line
+#     if 0
+S      |bool   |less_dicey_bool_setlocale_r                            \
+                               |const int cat                          \
+                               |NN const char *locale
+#     endif
+#   endif
+#   if !(  defined(USE_POSIX_2008_LOCALE) && defined(USE_QUERYLOCALE) ) && \
+        ( !defined(LC_ALL) || defined(USE_POSIX_2008_LOCALE) ||            \
+           defined(WIN32) )
+S      |const char *|calculate_LC_ALL                                  \
+                               |NN const char **individ_locales
+#   endif
+#   if defined(WIN32)
+ST     |wchar_t *|Win_byte_string_to_wstring                           \
+                               |const UINT code_page                   \
+                               |NULLOK const char *byte_string
+S      |const char *|win32_setlocale                                   \
+                               |int category                           \
+                               |NULLOK const char *locale
+ST     |char * |Win_wstring_to_byte_string                             \
+                               |const UINT code_page                   \
+                               |NULLOK const wchar_t *wstring
+S      |const char *|wrap_wsetlocale                                   \
+                               |const int category                     \
+                               |NULLOK const char *locale
+#   endif
+#   if   defined(WIN32) || \
+       ( defined(USE_POSIX_2008_LOCALE) && !defined(USE_QUERYLOCALE) )
+S      |const char *|find_locale_from_environment                      \
+                               |const unsigned int index
+#   endif
+# endif /* defined(USE_LOCALE) */
+# if defined(USE_POSIX_2008_LOCALE) || defined(DEBUGGING)
+S      |const char *|get_displayable_string                            \
+                               |NN const char * const s                \
+                               |NN const char * const e                \
+                               |const bool is_utf8
+# endif
+#endif /* defined(PERL_IN_LOCALE_C) */
+#if defined(PERL_IN_MALLOC_C)
+ST     |int    |adjust_size_and_find_bucket                            \
+                               |NN size_t *nbytes_p
 #endif
-p      |PAD ** |padlist_store  |NN PADLIST *padlist|I32 key \
-                               |NULLOK PAD *val
+#if defined(PERL_IN_MATHOMS_C) || defined(PERL_IN_OP_C) || \
+    defined(PERL_IN_PERLY_C)   || defined(PERL_IN_TOKE_C)
+Mbp    |OP *   |ref            |NULLOK OP *o                           \
+                               |I32 type
+#endif
+#if defined(PERL_IN_MG_C)
 
-ApdR   |CV*    |find_runcv     |NULLOK U32 *db_seqp
-pR     |CV*    |find_runcv_where|U8 cond|IV arg \
-                                |NULLOK U32 *db_seqp
-: Only used in perl.c
-p      |void   |free_tied_hv_pool
-#if defined(DEBUGGING)
-: Used in mg.c
-pR     |int    |get_debug_opts |NN const char **s|bool givehelp
+S      |void   |fixup_errno_string                                     \
+                               |NN SV *sv
+S      |SV *   |magic_methcall1|NN SV *sv                              \
+                               |NN const MAGIC *mg                     \
+                               |NN SV *meth                            \
+                               |U32 flags                              \
+                               |int n                                  \
+                               |NULLOK SV *val
+S      |int    |magic_methpack |NN SV *sv                              \
+                               |NN const MAGIC *mg                     \
+                               |NN SV *meth
+S      |void   |restore_magic  |NULLOK const void *p
+S      |void   |save_magic_flags                                       \
+                               |SSize_t mgs_ix                         \
+                               |NN SV *sv                              \
+                               |U32 flags
+S      |void   |unwind_handler_stack                                   \
+                               |NULLOK const void *p
 #endif
-Cpd    |void   |save_set_svflags|NN SV *sv|U32 mask|U32 val
-#ifdef DEBUGGING
-Apod   |void   |hv_assert      |NN HV *hv
+#if defined(PERL_IN_MG_C) || defined(PERL_IN_PP_C)
+Tp     |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
 #endif
-
-ApdR   |SV*    |hv_scalar      |NN HV *hv
-p      |void   |hv_pushkv      |NN HV *hv|U32 flags
-ApdRx  |SV*    |hv_bucket_ratio|NN HV *hv
-CpdoR  |I32*   |hv_riter_p     |NN HV *hv
-CpdoR  |HE**   |hv_eiter_p     |NN HV *hv
-Cpdo   |void   |hv_riter_set   |NN HV *hv|I32 riter
-Cpdo   |void   |hv_eiter_set   |NN HV *hv|NULLOK HE *eiter
-Cp     |void   |hv_rand_set    |NN HV *hv|U32 new_xhv_rand
-Ap     |void   |hv_name_set    |NN HV *hv|NULLOK const char *name|U32 len|U32 flags
-pd     |void   |hv_ename_add   |NN HV *hv|NN const char *name|U32 len \
-                               |U32 flags
-pd     |void   |hv_ename_delete|NN HV *hv|NN const char *name|U32 len \
+#if defined(PERL_IN_MRO_C)
+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
-: Used in dump.c and hv.c
-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)
-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
-CpdoR  |I32    |hv_placeholders_get    |NN const HV *hv
-Cpdo   |void   |hv_placeholders_set    |NN HV *hv|I32 ph
-
-: This is indirectly referenced by globals.c. This is somewhat annoying.
-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 \
-               |NN const SV *const val
-S      |SSize_t|find_array_subscript|NULLOK const AV *const av \
-               |NN const SV *const val
-Sxd    |SV*    |find_uninit_var|NULLOK const OP *const obase \
-               |NULLOK const SV *const uninit_sv|bool match \
-               |NN const char **desc_p
+S      |void   |mro_gather_and_rename                                  \
+                               |NN HV * const stashes                  \
+                               |NN HV * const seen_stashes             \
+                               |NULLOK HV *stash                       \
+                               |NULLOK HV *oldstash                    \
+                               |NN SV *namesv
+Sd     |AV *   |mro_get_linear_isa_dfs                                 \
+                               |NN HV *stash                           \
+                               |U32 level
+#endif
+#if defined(PERL_IN_NUMERIC_C)
+S      |void   |output_non_portable                                    \
+                               |const U8 shift
 #endif
-
-Adp    |GV*    |gv_fetchpvn_flags|NN const char* name|STRLEN len|I32 flags|const svtype sv_type
-Adp    |GV*    |gv_fetchsv|NN SV *name|I32 flags|const svtype sv_type
-
-#ifdef DEBUG_LEAKING_SCALARS_FORK_DUMP
-: Used in sv.c
-p      |void   |dump_sv_child  |NN SV *sv
+#if defined(PERL_IN_OP_C)
+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
+RS     |I32    |assignment_type|NULLOK const OP *o
+S      |void   |bad_type_gv    |I32 n                                  \
+                               |NN GV *gv                              \
+                               |NN const OP *kid                       \
+                               |NN const char *t
+S      |void   |bad_type_pv    |I32 n                                  \
+                               |NN const char *t                       \
+                               |NN const OP *o                         \
+                               |NN const OP *kid
+S      |void   |clear_special_blocks                                   \
+                               |NN const char * const fullname         \
+                               |NN GV * const gv                       \
+                               |NN CV * const cv
+S      |void   |cop_free       |NN COP *cop
+S      |OP *   |dup_attrlist   |NN OP *o
+S      |void   |find_and_forget_pmops                                  \
+                               |NN OP *o
+: FIXME
+S      |OP *   |fold_constants |NN OP * const o
+S      |OP *   |force_list     |NULLOK OP *arg                         \
+                               |bool nullit
+S      |void   |forget_pmop    |NN PMOP * const o
+S      |void   |gen_constant_list                                      \
+                               |NULLOK OP *o
+S      |void   |inplace_aassign|NN OP *o
+RST    |bool   |is_handle_constructor                                  \
+                               |NN const OP *o                         \
+                               |I32 numargs
+S      |OP *   |listkids       |NULLOK OP *o
+S      |bool   |looks_like_bool|NN const OP *o
+S      |OP *   |modkids        |NULLOK OP *o                           \
+                               |I32 type
+S      |void   |move_proto_attr|NN OP **proto                          \
+                               |NN OP **attrs                          \
+                               |NN const GV *name                      \
+                               |bool curstash
+S      |OP *   |my_kid         |NULLOK OP *o                           \
+                               |NULLOK OP *attrs                       \
+                               |NN OP **imopsp
+S      |OP *   |newGIVWHENOP   |NULLOK OP *cond                        \
+                               |NN OP *block                           \
+                               |I32 enter_opcode                       \
+                               |I32 leave_opcode                       \
+                               |PADOFFSET entertarg
+RS     |OP *   |new_logop      |I32 type                               \
+                               |I32 flags                              \
+                               |NN OP **firstp                         \
+                               |NN OP **otherp
+i      |OP *   |newMETHOP_internal                                     \
+                               |I32 type                               \
+                               |I32 flags                              \
+                               |NULLOK OP *dynamic_meth                \
+                               |NULLOK SV * const_meth
+RS     |OP *   |no_fh_allowed  |NN OP *o
+i      |OP *   |op_integerize  |NN OP *o
+i      |OP *   |op_std_init    |NN OP *o
+S      |OP *   |pmtrans        |NN OP *o                               \
+                               |NN OP *expr                            \
+                               |NN OP *repl
+S      |bool   |process_special_blocks                                 \
+                               |I32 floor                              \
+                               |NN const char * const fullname         \
+                               |NN GV * const gv                       \
+                               |NN CV * const cv
+S      |OP *   |ref_array_or_hash                                      \
+                               |NULLOK OP *cond
+S      |OP *   |refkids        |NULLOK OP *o                           \
+                               |I32 type
+S      |OP *   |scalarboolean  |NN OP *o
+S      |OP *   |scalarkids     |NULLOK OP *o
+RST    |bool   |scalar_mod_type|NULLOK const OP *o                     \
+                               |I32 type
+RS     |OP *   |search_const   |NN OP *o
+S      |void   |simplify_sort  |NN OP *o
+RS     |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      |OP *   |voidnonfinal   |NULLOK OP *o
+#endif /* defined(PERL_IN_OP_C) */
+#if defined(PERL_IN_OP_C) || defined(PERL_IN_PAD_C)
+Ti     |bool   |PadnameIN_SCOPE|NN const PADNAME * const pn            \
+                               |const U32 seq
+#endif
+#if defined(PERL_IN_OP_C) || defined(PERL_IN_PEEP_C)
+p      |void   |check_hash_fields_and_hekify                           \
+                               |NULLOK UNOP *rop                       \
+                               |NULLOK SVOP *key_op                    \
+                               |int real
+p      |void   |no_bareword_allowed                                    \
+                               |NN OP *o
+Tp     |void   |op_prune_chain_head                                    \
+                               |NN OP **op_p
+p      |SV *   |op_varname     |NN const OP *o
+p      |void   |warn_elem_scalar_context                               \
+                               |NN const OP *o                         \
+                               |NN SV *name                            \
+                               |bool is_hash                           \
+                               |bool is_slice
+#endif
+#if defined(PERL_IN_OP_C) || defined(PERL_IN_REGCOMP_ANY)
+ERTi   |STRLEN *|get_invlist_iter_addr                                 \
+                               |NN SV *invlist
+ETi    |void   |invlist_iterfinish                                     \
+                               |NN SV *invlist
+ETi    |void   |invlist_iterinit                                       \
+                               |NN SV *invlist
+ERTi   |bool   |invlist_iternext                                       \
+                               |NN SV *invlist                         \
+                               |NN UV *start                           \
+                               |NN UV *end
 #endif
-
-#ifdef PERL_DONT_CREATE_GVSV
-ApdbM  |GV*    |gv_SVadd       |NULLOK GV *gv
+#if defined(PERL_IN_OP_C) || defined(PERL_IN_SV_C)
+p      |void   |report_redefined_cv                                    \
+                               |NN const SV *name                      \
+                               |NN const CV *old_cv                    \
+                               |NULLOK SV * const *new_const_svp
+Rp     |SV *   |varname        |NULLOK const GV * const gv             \
+                               |const char gvtype                      \
+                               |PADOFFSET targ                         \
+                               |NULLOK const SV * const keyname        \
+                               |SSize_t aindex                         \
+                               |int subscript_type
 #endif
-#if defined(PERL_IN_UTIL_C)
-S      |bool   |ckwarn_common  |U32 w
+#if defined(PERL_IN_PAD_C)
+Sd     |PADOFFSET|pad_alloc_name                                       \
+                               |NN PADNAME *name                       \
+                               |U32 flags                              \
+                               |NULLOK HV *typestash                   \
+                               |NULLOK HV *ourstash
+Sd     |void   |pad_check_dup  |NN PADNAME *name                       \
+                               |U32 flags                              \
+                               |NULLOK const HV *ourstash
+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
+Sd     |void   |pad_reset
+# if defined(DEBUGGING)
+Sd     |void   |cv_dump        |NN const CV *cv                        \
+                               |NN const char *title
+# endif
 #endif
-CpoP   |bool   |ckwarn         |U32 w
-CpoP   |bool   |ckwarn_d       |U32 w
-: FIXME - exported for ByteLoader - public or private?
-XEopxR |STRLEN *|new_warnings_bitfield|NULLOK STRLEN *buffer \
-                               |NN const char *const bits|STRLEN size
-
-AMpTdf |int    |my_snprintf    |NN char *buffer|const Size_t len|NN const char *format|...
-AMpTd  |int    |my_vsnprintf   |NN char *buffer|const Size_t len|NN const char *format|va_list ap
-#ifdef USE_QUADMATH
-pTd    |bool   |quadmath_format_valid|NN const char* format
-pTd    |bool|quadmath_format_needed|NN const char* format
+#if defined(PERL_IN_PEEP_C)
+S      |void   |finalize_op    |NN OP *o
+S      |void   |optimize_op    |NN OP *o
+Sd     |OP *   |traverse_op_tree                                       \
+                               |NN OP *top                             \
+                               |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                             \
+                               |U32 flags
+S      |void   |incpush_use_sep|NN const char *p                       \
+                               |STRLEN len                             \
+                               |U32 flags
+S      |void   |init_ids
+S      |void   |init_interp
+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
+S      |SV *   |mayberelocate  |NN const char * const dir              \
+                               |STRLEN len                             \
+                               |U32 flags
+Sr     |void   |minus_v
+Sr     |void   |my_exit_jump
+S      |void   |nuke_stacks
+S      |PerlIO *|open_script   |NN const char *scriptname              \
+                               |bool dosearch                          \
+                               |NN bool *suidscript
 
-: Used in mg.c, sv.c
-pe     |void   |my_clearenv
-
-#ifdef MULTIPLICITY
-Cpod   |void*  |my_cxt_init    |NN int *indexp|size_t size
+S      |void * |parse_body     |NULLOK char **env                      \
+                               |XSINIT_t xsinit
+Sr     |void   |run_body       |I32 oldscope
+Sr     |void   |usage
+# if !defined(PERL_IS_MINIPERL)
+S      |SV *   |incpush_if_exists                                      \
+                               |NN AV * const av                       \
+                               |NN SV *dir                             \
+                               |NN SV * const stem
+# endif
+# if !defined(SETUID_SCRIPTS_ARE_SECURE_NOW)
+So     |void   |validate_suid  |NN PerlIO *rsfp
+# endif
+#endif /* defined(PERL_IN_PERL_C) */
+#if defined(PERL_IN_PERL_C) || defined(PERL_IN_REGCOMP_ANY) || \
+    defined(PERL_IN_UTF8_C)
+EXp    |bool   |_invlistEQ     |NN SV * const a                        \
+                               |NN SV * const b                        \
+                               |const bool complement_b
+ERXp   |SV *   |_new_invlist_C_array                                   \
+                               |NN const UV * const list
 #endif
-#if defined(PERL_IN_UTIL_C)
-So     |void   |xs_version_bootcheck|U32 items|U32 ax|NN const char *xs_p \
-                               |STRLEN xs_len
+#if defined(PERL_IN_PP_C)
+S      |size_t |do_chomp       |NN SV *retval                          \
+                               |NN SV *sv                              \
+                               |bool chomping
+S      |OP *   |do_delete_local
+RS     |SV *   |refto          |NN SV *sv
 #endif
-FXpoT  |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
-ApTd   |Size_t |my_strlcat     |NULLOK char *dst|NULLOK const char *src|Size_t size
+#if defined(PERL_IN_PP_C) || defined(PERL_IN_PP_HOT_C)
+RTi    |bool   |lossless_NV_to_IV                                      \
+                               |const NV nv                            \
+                               |NN IV *ivp
+: Used in pp_hot.c
+Reop   |GV *   |softref2xv     |NN SV * const sv                       \
+                               |NN const char * const what             \
+                               |const svtype type                      \
+                               |NN SV ***spp
+#endif
+#if defined(PERL_IN_PP_C)   || defined(PERL_IN_REGCOMP_ANY) || \
+    defined(PERL_IN_TOKE_C) || defined(PERL_IN_UNIVERSAL_C)
+ETi    |const char *|get_regex_charset_name                            \
+                               |const U32 flags                        \
+                               |NN STRLEN * const lenp
+#endif
+#if defined(PERL_IN_PP_C) || defined(PERL_IN_UTF8_C)
+p      |UV     |_to_upper_title_latin1                                 \
+                               |const U8 c                             \
+                               |NN U8 *p                               \
+                               |NN STRLEN *lenp                        \
+                               |const char S_or_s
 #endif
-
-#ifndef HAS_STRLCPY
-ApTd   |Size_t |my_strlcpy     |NULLOK char *dst|NULLOK const char *src|Size_t size
+#if defined(PERL_IN_PP_CTL_C)
+RS     |PerlIO *|check_type_and_open                                   \
+                               |NN SV *name
+S      |void   |destroy_matcher|NN PMOP *matcher
+RSd    |OP *   |docatch        |Perl_ppaddr_t firstpp
+S      |bool   |doeval_compile |U8 gimme                               \
+                               |NULLOK CV *outside                     \
+                               |U32 seq                                \
+                               |NULLOK HV *hh
+RS     |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
+RS     |I32    |dopoptoeval    |I32 startingblock
+RS     |I32    |dopoptogivenfor|I32 startingblock
+RS     |I32    |dopoptolabel   |NN const char *label                   \
+                               |STRLEN len                             \
+                               |U32 flags
+RS     |I32    |dopoptoloop    |I32 startingblock
+RS     |I32    |dopoptosub_at  |NN const PERL_CONTEXT *cxstk           \
+                               |I32 startingblock
+RS     |I32    |dopoptowhen    |I32 startingblock
+S      |OP *   |do_smartmatch  |NULLOK HV *seen_this                   \
+                               |NULLOK HV *seen_other                  \
+                               |const bool copied
+RS     |PMOP * |make_matcher   |NN REGEXP *re
+RS     |bool   |matcher_matches_sv                                     \
+                               |NN PMOP *matcher                       \
+                               |NN SV *sv
+RST    |bool   |num_overflow   |NV value                               \
+                               |I32 fldsize                            \
+                               |I32 frcsize
+RTi    |bool   |path_is_searchable                                     \
+                               |NN const char *name
+RS     |I32    |run_user_filter|int idx                                \
+                               |NN SV *buf_sv                          \
+                               |int maxlen
+S      |void   |rxres_free     |NN void **rsp
+S      |void   |rxres_restore  |NN void **rsp                          \
+                               |NN REGEXP *rx
+S      |void   |save_lines     |NULLOK AV *array                       \
+                               |NN SV *sv
+# if !defined(PERL_DISABLE_PMC)
+RS     |PerlIO *|doopen_pm     |NN SV *name
+# endif
+#endif /* defined(PERL_IN_PP_CTL_C) */
+#if defined(PERL_IN_PP_CTL_C) || defined(PERL_IN_UTIL_C)
+p      |bool   |invoke_exception_hook                                  \
+                               |NULLOK SV *ex                          \
+                               |bool warn
 #endif
-
-#ifndef HAS_STRNLEN
-AipTd  |Size_t |my_strnlen     |NN const char *str|Size_t maxlen
+#if defined(PERL_IN_PP_HOT_C)
+S      |void   |do_oddball     |NN SV **oddkey                         \
+                               |NN SV **firstkey
+i      |HV *   |opmethod_stash |NN SV *meth
+IR     |bool   |should_we_output_Debug_r                               \
+                               |NN regexp *prog
 #endif
-
-#ifndef HAS_MKOSTEMP
-pTod   |int    |my_mkostemp    |NN char *templte|int flags
+#if defined(PERL_IN_PP_PACK_C)
+S      |int    |div128         |NN SV *pnum                            \
+                               |NN bool *done
+ST     |char   |first_symbol   |NN const char *pat                     \
+                               |NN const char *patend
+RS     |const char *|get_num   |NN const char *patptr                  \
+                               |NN SSize_t *lenptr
+S      |const char *|group_end |NN const char *patptr                  \
+                               |NN const char *patend                  \
+                               |char ender
+RS     |SV *   |is_an_int      |NN const char *s                       \
+                               |STRLEN l
+S      |SSize_t|measure_struct |NN struct tempsym *symptr
+S      |SV *   |mul128         |NN SV *sv                              \
+                               |U8 m
+RST    |char * |my_bytes_to_utf8                                       \
+                               |NN const U8 *start                     \
+                               |STRLEN len                             \
+                               |NN char *dest                          \
+                               |const bool needs_swap
+ST     |bool   |need_utf8      |NN const char *pat                     \
+                               |NN const char *patend
+S      |bool   |next_symbol    |NN struct tempsym *symptr
+S      |SV **  |pack_rec       |NN SV *cat                             \
+                               |NN struct tempsym *symptr              \
+                               |NN SV **beglist                        \
+                               |NN SV **endlist
+RS     |char * |sv_exp_grow    |NN SV *sv                              \
+                               |STRLEN needed
+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
+#endif /* defined(PERL_IN_PP_PACK_C) */
+#if defined(PERL_IN_PP_SORT_C)
+i      |I32    |amagic_cmp     |NN SV * const str1                     \
+                               |NN SV * const str2
+i      |I32    |amagic_cmp_desc|NN SV * const str1                     \
+                               |NN SV * const str2
+i      |I32    |amagic_i_ncmp  |NN SV * const a                        \
+                               |NN SV * const b
+i      |I32    |amagic_i_ncmp_desc                                     \
+                               |NN SV * const a                        \
+                               |NN SV * const b
+i      |I32    |amagic_ncmp    |NN SV * const a                        \
+                               |NN SV * const b
+i      |I32    |amagic_ncmp_desc                                       \
+                               |NN SV * const a                        \
+                               |NN SV * const b
+i      |I32    |cmp_desc       |NN SV * const str1                     \
+                               |NN SV * const str2
+S      |I32    |sortcv         |NN SV * const a                        \
+                               |NN SV * const b
+S      |I32    |sortcv_stacked |NN SV * const a                        \
+                               |NN SV * const b
+S      |I32    |sortcv_xsub    |NN SV * const a                        \
+                               |NN SV * const b
+I      |void   |sortsv_flags_impl                                      \
+                               |NULLOK SV **array                      \
+                               |size_t num_elts                        \
+                               |NN SVCOMPARE_t cmp                     \
+                               |U32 flags
+i      |I32    |sv_i_ncmp      |NN SV * const a                        \
+                               |NN SV * const b
+i      |I32    |sv_i_ncmp_desc |NN SV * const a                        \
+                               |NN SV * const b
+i      |I32    |sv_ncmp        |NN SV * const a                        \
+                               |NN SV * const b
+i      |I32    |sv_ncmp_desc   |NN SV * const a                        \
+                               |NN SV * const b
+# if defined(USE_LOCALE_COLLATE)
+i      |I32    |amagic_cmp_locale                                      \
+                               |NN SV * const str1                     \
+                               |NN SV * const str2
+i      |I32    |amagic_cmp_locale_desc                                 \
+                               |NN SV * const str1                     \
+                               |NN SV * const str2
+i      |I32    |cmp_locale_desc|NN SV * const str1                     \
+                               |NN SV * const str2
+# endif
+#endif /* defined(PERL_IN_PP_SORT_C) */
+#if defined(PERL_IN_PP_SYS_C)
+S      |OP *   |doform         |NN CV *cv                              \
+                               |NN GV *gv                              \
+                               |NULLOK OP *retop
+S      |SV *   |space_join_names_mortal                                \
+                               |NULLOK char * const *array
+# if !defined(HAS_MKDIR) || !defined(HAS_RMDIR)
+RS     |int    |dooneliner     |NN const char *cmd                     \
+                               |NN const char *filename
+# endif
+#endif
+#if defined(PERL_IN_REGCOMP_ANY)
+Ep     |void   |add_above_Latin1_folds                                 \
+                               |NN RExC_state_t *pRExC_state           \
+                               |const U8 cp                            \
+                               |NN SV **invlist
+Ep     |regnode *|construct_ahocorasick_from_trie                      \
+                               |NN RExC_state_t *pRExC_state           \
+                               |NN regnode *source                     \
+                               |U32 depth
+ERp    |SV *   |get_ANYOFHbbm_contents                                 \
+                               |NN const regnode *n
+ERp    |SV *   |get_ANYOFM_contents                                    \
+                               |NN const regnode *n
+ERi    |SV *   |invlist_contents                                       \
+                               |NN SV * const invlist                  \
+                               |const bool traditional_style
+ERTix  |UV     |invlist_highest_range_start                            \
+                               |NN SV * const invlist
+ERTi   |bool   |invlist_is_iterating                                   \
+                               |NN const SV * const invlist
+ERTix  |UV     |invlist_lowest |NN SV * const invlist
+ETp    |bool   |is_ssc_worth_it|NN const RExC_state_t *pRExC_state     \
+                               |NN const regnode_ssc *ssc
+Ep     |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
+Ep     |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
+Ep     |void   |populate_anyof_bitmap_from_invlist                     \
+                               |NN regnode *node                       \
+                               |NN SV **invlist_ptr
+ERTp   |U32    |reg_add_data   |NN RExC_state_t * const pRExC_state    \
+                               |NN const char * const s                \
+                               |const U32 n
+Ep     |void   |scan_commit    |NN const RExC_state_t *pRExC_state     \
+                               |NN struct scan_data_t *data            \
+                               |NN SSize_t *minlenp                    \
+                               |int is_inf
+Ep     |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
+Ep     |void   |ssc_finalize   |NN RExC_state_t *pRExC_state           \
+                               |NN regnode_ssc *ssc
+Ep     |void   |ssc_init       |NN const RExC_state_t *pRExC_state     \
+                               |NN regnode_ssc *ssc
+Ep     |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                              \
+                               |bool was_mutate_ok
+# if defined(PERL_IN_REGCOMP_TRIE_C) && defined(DEBUGGING)
+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   \
+                               |NULLOK HV *widecharmap                 \
+                               |NN AV *revcharmap                      \
+                               |U32 next_alloc                         \
+                               |U32 depth
+ES     |void   |dump_trie_interim_table                                \
+                               |NN const struct _reg_trie_data *trie   \
+                               |NULLOK HV *widecharmap                 \
+                               |NN AV *revcharmap                      \
+                               |U32 next_alloc                         \
+                               |U32 depth
+# endif
+#endif /* defined(PERL_IN_REGCOMP_ANY) */
+#if defined(PERL_IN_REGCOMP_ANY) || defined(PERL_IN_SV_C)
+EXp    |SV *   |invlist_clone  |NN SV * const invlist                  \
+                               |NULLOK SV *newlist
 #endif
-#ifndef HAS_MKSTEMP
-pTod   |int    |my_mkstemp     |NN char *templte
+#if defined(PERL_IN_REGCOMP_C)
+ES     |AV *   |add_multi_match|NULLOK AV *multi_char_matches          \
+                               |NN SV *multi_string                    \
+                               |const STRLEN cp_count
+ES     |void   |change_engine_size                                     \
+                               |NN RExC_state_t *pRExC_state           \
+                               |const Ptrdiff_t size
+ERS    |REGEXP *|compile_wildcard                                      \
+                               |NN const char *subpattern              \
+                               |const STRLEN len                       \
+                               |const bool ignore_case
+EST    |U8     |compute_EXACTish                                       \
+                               |NN RExC_state_t *pRExC_state
+ERST   |int    |edit_distance  |NN const UV *src                       \
+                               |NN const UV *tgt                       \
+                               |const STRLEN x                         \
+                               |const STRLEN y                         \
+                               |const SSize_t maxDistance
+ES     |I32    |execute_wildcard                                       \
+                               |NN REGEXP * const prog                 \
+                               |NN char *stringarg                     \
+                               |NN char *strend                        \
+                               |NN char *strbeg                        \
+                               |SSize_t minend                         \
+                               |NN SV *screamer                        \
+                               |U32 nosave
+ETi    |Size_t |find_first_differing_byte_pos                          \
+                               |NN const U8 *s1                        \
+                               |NN const U8 *s2                        \
+                               |const Size_t max
+ES     |U32    |get_quantifier_value                                   \
+                               |NN RExC_state_t *pRExC_state           \
+                               |NN const char *start                   \
+                               |NN const char *end
+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     |regnode_offset|handle_named_backref                            \
+                               |NN RExC_state_t *pRExC_state           \
+                               |NN I32 *flagp                          \
+                               |NN char *backref_parse_start           \
+                               |char ch
+ES     |bool   |handle_names_wildcard                                  \
+                               |NN const char *wname                   \
+                               |const STRLEN wname_len                 \
+                               |NN SV **prop_definition                \
+                               |NN AV **strings
+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     |regnode_offset|handle_regex_sets                               \
+                               |NN RExC_state_t *pRExC_state           \
+                               |NULLOK SV **return_invlist             \
+                               |NN I32 *flagp                          \
+                               |U32 depth
+ES     |SV *   |handle_user_defined_property                           \
+                               |NN const char *name                    \
+                               |const STRLEN name_len                  \
+                               |const bool is_utf8                     \
+                               |const bool to_fold                     \
+                               |const bool runtime                     \
+                               |const bool deferrable                  \
+                               |NN SV *contents                        \
+                               |NN bool *user_defined_ptr              \
+                               |NN SV *msg                             \
+                               |const STRLEN level
+ES     |void   |nextchar       |NN RExC_state_t *pRExC_state
+ES     |U8     |optimize_regclass                                              \
+                               |NN RExC_state_t *pRExC_state                   \
+                               |NULLOK SV *cp_list                             \
+                               |NULLOK SV *only_utf8_locale_list               \
+                               |NULLOK SV *upper_latin1_only_utf8_matches      \
+                               |const U32 has_runtime_dependency               \
+                               |const U32 posixl                               \
+                               |NN U8 *anyof_flags                             \
+                               |NN bool *invert                                \
+                               |NN regnode_offset *ret                         \
+                               |NN I32 *flagp
+ES     |void   |output_posix_warnings                                  \
+                               |NN RExC_state_t *pRExC_state           \
+                               |NN AV *posix_warnings
+ES     |void   |parse_lparen_question_flags                            \
+                               |NN RExC_state_t *pRExC_state
+ES     |SV *   |parse_uniprop_string                                   \
+                               |NN const char * const name             \
+                               |Size_t name_len                        \
+                               |const bool is_utf8                     \
+                               |const bool to_fold                     \
+                               |const bool runtime                     \
+                               |const bool deferrable                  \
+                               |NULLOK AV **strings                    \
+                               |NN bool *user_defined_ptr              \
+                               |NN SV *msg                             \
+                               |const STRLEN level
+Sfr    |void   |re_croak       |bool utf8                              \
+                               |NN const char *pat                     \
+                               |...
+ES     |regnode_offset|reg     |NN RExC_state_t *pRExC_state           \
+                               |I32 paren                              \
+                               |NN I32 *flagp                          \
+                               |U32 depth
+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           \
+                               |NN I32 *flagp                          \
+                               |I32 first                              \
+                               |U32 depth
+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
+ERST   |unsigned int|regex_set_precedence                              \
+                               |const U8 my_operator
+ES     |void   |reginsert      |NN RExC_state_t *pRExC_state           \
+                               |const U8 op                            \
+                               |const regnode_offset operand           \
+                               |const U32 depth
+ES     |regnode_offset|reg_la_NOTHING                                  \
+                               |NN RExC_state_t *pRExC_state           \
+                               |U32 flags                              \
+                               |NN const char *type
+ES     |regnode_offset|reg_la_OPFAIL                                   \
+                               |NN RExC_state_t *pRExC_state           \
+                               |U32 flags                              \
+                               |NN const char *type
+ES     |regnode_offset|reg1node|NN RExC_state_t *pRExC_state           \
+                               |U8 op                                  \
+                               |U32 arg
+ES     |regnode_offset|reg2node|NN RExC_state_t *pRExC_state           \
+                               |const U8 op                            \
+                               |const U32 arg1                         \
+                               |const I32 arg2
+ES     |regnode_offset|reg_node|NN RExC_state_t *pRExC_state           \
+                               |U8 op
+ES     |regnode_offset|regnode_guts                                    \
+                               |NN RExC_state_t *pRExC_state           \
+                               |const STRLEN extra_len
+ES     |regnode_offset|regpiece|NN RExC_state_t *pRExC_state           \
+                               |NN I32 *flagp                          \
+                               |U32 depth
+ES     |regnode_offset|regpnode|NN RExC_state_t *pRExC_state           \
+                               |U8 op                                  \
+                               |NN SV *arg
+ES     |SV *   |reg_scan_name  |NN RExC_state_t *pRExC_state           \
+                               |U32 flags
+ETi    |char * |reg_skipcomment|NN RExC_state_t *pRExC_state           \
+                               |NN char *p
+ERS    |bool   |regtail        |NN RExC_state_t *pRExC_state           \
+                               |NN const regnode_offset p              \
+                               |NN const regnode_offset val            \
+                               |const U32 depth
+ES     |void   |set_regex_pv   |NN RExC_state_t *pRExC_state           \
+                               |NN REGEXP *Rx
+ES     |void   |skip_to_be_ignored_text                                \
+                               |NN RExC_state_t *pRExC_state           \
+                               |NN char **p                            \
+                               |const bool force_to_xmod
+# if defined(DEBUGGING)
+ES     |regnode_offset|regnode_guts_debug                              \
+                               |NN RExC_state_t *pRExC_state           \
+                               |const U8 op                            \
+                               |const STRLEN extra_len
+ERS    |bool   |regtail_study  |NN RExC_state_t *pRExC_state           \
+                               |NN regnode_offset p                    \
+                               |NN const regnode_offset val            \
+                               |U32 depth
+#   if defined(ENABLE_REGEX_SETS_DEBUGGING)
+ES     |void   |dump_regex_sets_structures                             \
+                               |NN RExC_state_t *pRExC_state           \
+                               |NN AV *stack                           \
+                               |const IV fence                         \
+                               |NN AV *fence_stack
+#   endif
+# endif
+#endif /* defined(PERL_IN_REGCOMP_C) */
+#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGCOMP_INVLIST_C)
+Ep     |void   |populate_bitmap_from_invlist                           \
+                               |NN SV *invlist                         \
+                               |const UV offset                        \
+                               |NN const U8 *bitmap                    \
+                               |const Size_t len
+Ep     |void   |populate_invlist_from_bitmap                           \
+                               |NN const U8 *bitmap                    \
+                               |const Size_t bitmap_len                \
+                               |NN SV **invlist                        \
+                               |const UV offset
+#endif
+#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C) || \
+    defined(PERL_IN_TOKE_C)
+ERp    |bool   |is_grapheme    |NN const U8 *strbeg                    \
+                               |NN const U8 *s                         \
+                               |NN const U8 *strend                    \
+                               |const UV cp
 #endif
-
-APpdT  |bool   |isinfnan       |NV nv
-pd     |bool   |isinfnansv     |NN SV *sv
-
-#if !defined(HAS_SIGNBIT)
-AxdToP |int    |Perl_signbit   |NV f
+#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C) || \
+    defined(PERL_IN_UTF8_C)
+ETXp   |UV     |_to_fold_latin1|const U8 c                             \
+                               |NN U8 *p                               \
+                               |NN STRLEN *lenp                        \
+                               |const unsigned int flags
 #endif
+#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_TOKE_C)
+ERTXp  |bool   |regcurly       |NN const char *s                       \
+                               |NN const char *e                       \
+                               |NULLOK const char *result[5]
+#endif
+#if defined(PERL_IN_REGCOMP_DEBUG_C) && defined(DEBUGGING)
+ES     |U8     |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 U8 flags                         \
+                               |const bool force_as_is_display
+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                   \
+                               |NN SV *sv                              \
+                               |NN SV *invlist
+ES     |void   |put_code_point |NN SV *sv                              \
+                               |UV c
+ES     |void   |put_range      |NN SV *sv                              \
+                               |UV start                               \
+                               |const UV end                           \
+                               |const bool allow_literals
+ES     |void   |regdump_extflags                                       \
+                               |NULLOK const char *lead                \
+                               |const U32 flags
+ES     |void   |regdump_intflags                                       \
+                               |NULLOK const char *lead                \
+                               |const U32 flags
+#endif
+#if defined(PERL_IN_REGCOMP_INVLIST_C) && !defined(PERL_EXT_RE_BUILD)
+ES     |void   |_append_range_to_invlist                               \
+                               |NN SV * const invlist                  \
+                               |const UV start                         \
+                               |const UV end
+ERTi   |IV *   |get_invlist_previous_index_addr                        \
+                               |NN SV *invlist
+S      |void   |initialize_invlist_guts                                \
+                               |NN SV *invlist                         \
+                               |const Size_t initial_size
+ERTi   |UV *   |_invlist_array_init                                    \
+                               |NN SV * const invlist                  \
+                               |const bool will_have_0
+Ei     |void   |invlist_clear  |NN SV *invlist
+ERTi   |UV     |invlist_max    |NN const SV * const invlist
+ERTi   |IV     |invlist_previous_index                                 \
+                               |NN SV * const invlist
+ES     |void   |invlist_replace_list_destroys_src                      \
+                               |NN SV *dest                            \
+                               |NN SV *src
+ETi    |void   |invlist_set_previous_index                             \
+                               |NN SV * const invlist                  \
+                               |const IV index
+ETi    |void   |invlist_trim   |NN SV *invlist
+#endif /* defined(PERL_IN_REGCOMP_INVLIST_C) && !defined(PERL_EXT_RE_BUILD) */
+#if defined(PERL_IN_REGCOMP_STUDY_C)
+ES     |SV *   |get_ANYOF_cp_list_for_ssc                                      \
+                               |NN const RExC_state_t *pRExC_state             \
+                               |NN const regnode_charclass * const node
+ERS    |SV *   |make_exactf_invlist                                    \
+                               |NN RExC_state_t *pRExC_state           \
+                               |NN regnode *node
+ES     |void   |rck_elide_nothing                                      \
+                               |NN regnode *node
+ES     |void   |ssc_add_range  |NN regnode_ssc *ssc                    \
+                               |UV const start                         \
+                               |UV const end
+ES     |void   |ssc_and        |NN const RExC_state_t *pRExC_state     \
+                               |NN regnode_ssc *ssc                    \
+                               |NN const regnode_charclass *and_with
+ES     |void   |ssc_anything   |NN regnode_ssc *ssc
+EST    |void   |ssc_clear_locale                                       \
+                               |NN regnode_ssc *ssc
+ES     |void   |ssc_cp_and     |NN regnode_ssc *ssc                    \
+                               |UV const cp
+ES     |void   |ssc_intersection                                       \
+                               |NN regnode_ssc *ssc                    \
+                               |NN SV * const invlist                  \
+                               |const bool invert_2nd
+ERST   |int    |ssc_is_anything|NN const regnode_ssc *ssc
+ERST   |int    |ssc_is_cp_posixl_init                                  \
+                               |NN const RExC_state_t *pRExC_state     \
+                               |NN const regnode_ssc *ssc
+ES     |void   |ssc_or         |NN const RExC_state_t *pRExC_state     \
+                               |NN regnode_ssc *ssc                    \
+                               |NN const regnode_charclass *or_with
+ES     |void   |ssc_union      |NN regnode_ssc *ssc                    \
+                               |NN SV * const invlist                  \
+                               |const bool invert_2nd
+ES     |void   |unwind_scan_frames                                     \
+                               |NN const void *p
+#endif /* defined(PERL_IN_REGCOMP_STUDY_C) */
+#if defined(PERL_IN_REGEXEC_C)
+ERS    |LB_enum|advance_one_LB |NN U8 **curpos                         \
+                               |NN const U8 * const strend             \
+                               |const bool utf8_target
+ERS    |SB_enum|advance_one_SB |NN U8 **curpos                         \
+                               |NN const U8 * const strend             \
+                               |const bool utf8_target
+ERS    |WB_enum|advance_one_WB |NN U8 **curpos                         \
+                               |NN const U8 * const strend             \
+                               |const bool utf8_target                 \
+                               |const bool skip_Extend_Format
+ERS    |GCB_enum|backup_one_GCB|NN const U8 * const strbeg             \
+                               |NN U8 **curpos                         \
+                               |const bool utf8_target
+ERS    |LB_enum|backup_one_LB  |NN const U8 * const strbeg             \
+                               |NN U8 **curpos                         \
+                               |const bool utf8_target
+ERS    |SB_enum|backup_one_SB  |NN const U8 * const strbeg             \
+                               |NN U8 **curpos                         \
+                               |const bool utf8_target
+ERS    |WB_enum|backup_one_WB  |NN WB_enum *previous                   \
+                               |NN const U8 * const strbeg             \
+                               |NN U8 **curpos                         \
+                               |const bool utf8_target
+EWi    |void   |capture_clear  |NN regexp *rex                         \
+                               |U16 from_ix                            \
+                               |U16 to_ix                              \
+                               |NN const char *str
+ERS    |char * |find_byclass   |NN regexp *prog                        \
+                               |NN const regnode *c                    \
+                               |NN char *s                             \
+                               |NN const char *strend                  \
+                               |NULLOK regmatch_info *reginfo
+ERST   |U8 *   |find_next_masked                                       \
+                               |NN U8 *s                               \
+                               |NN const U8 *send                      \
+                               |const U8 byte                          \
+                               |const U8 mask
+ERST   |U8 *   |find_span_end  |NN U8 *s                               \
+                               |NN const U8 *send                      \
+                               |const U8 span_byte
+ERST   |U8 *   |find_span_end_mask                                     \
+                               |NN U8 *s                               \
+                               |NN const U8 *send                      \
+                               |const U8 span_byte                     \
+                               |const U8 mask
+Ei     |I32    |foldEQ_latin1_s2_folded                                \
+                               |NN const char *a                       \
+                               |NN const char *b                       \
+                               |I32 len
+ERS    |bool   |isFOO_lc       |const U8 classnum                      \
+                               |const U8 character
+ERS    |bool   |isFOO_utf8_lc  |const U8 classnum                      \
+                               |NN const U8 *character                 \
+                               |NN const U8 *e
+ERS    |bool   |isGCB          |const GCB_enum before                  \
+                               |const GCB_enum after                   \
+                               |NN const U8 * const strbeg             \
+                               |NN const U8 * const curpos             \
+                               |const bool utf8_target
+ERS    |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
+ERS    |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
+ERS    |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
+ERST   |I32    |reg_check_named_buff_matched                           \
+                               |NN const regexp *rex                   \
+                               |NN const regnode *scan
+ESW    |void   |regcppop       |NN regexp *rex                         \
+                               |NN U32 *maxopenparen_p
+ESW    |CHECKPOINT|regcppush   |NN const regexp *rex                   \
+                               |I32 parenfloor                         \
+                               |U32 maxopenparen
+ESW    |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
+ERST   |U8 *   |reghopmaybe3   |NN U8 *s                               \
+                               |SSize_t off                            \
+                               |NN const U8 * const lim
+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
+ERS    |SSize_t|regmatch       |NN regmatch_info *reginfo              \
+                               |NN char *startpos                      \
+                               |NN regnode *prog
+ERSW   |I32    |regrepeat      |NN regexp *prog                        \
+                               |NN char **startposp                    \
+                               |NN const regnode *p                    \
+                               |NN char *loceol                        \
+                               |NN regmatch_info * const reginfo       \
+                               |NZ I32 max
+ERS    |bool   |regtry         |NN regmatch_info *reginfo              \
+                               |NN char **startposp
+ES     |bool   |to_byte_substr |NN regexp *prog
+ES     |void   |to_utf8_substr |NN regexp *prog
+EWi    |void   |unwind_paren   |NN regexp *rex                         \
+                               |U32 lp                                 \
+                               |U32 lcp
+# if defined(DEBUGGING)
+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
+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
 
-: Used by B
-XExop  |void   |emulate_cop_io |NN const COP *const c|NN SV *const sv
-: Used by SvRX and SvRXOK
-XExop  |REGEXP *|get_re_arg|NULLOK SV *sv
-
-Coph   |SV*    |mro_get_private_data|NN struct mro_meta *const smeta \
-                                    |NN const struct mro_alg *const which
-Aopdh  |SV*    |mro_set_private_data|NN struct mro_meta *const smeta \
-                                    |NN const struct mro_alg *const which \
-                                    |NN SV *const data
-Aopd   |const struct mro_alg *|mro_get_from_name|NN SV *name
-Aopd   |void   |mro_register   |NN const struct mro_alg *mro
-Aopd   |void   |mro_set_mro    |NN struct mro_meta *const meta \
-                               |NN SV *const name
-: Used in HvMROMETA(), which is public.
-Xpo    |struct mro_meta*       |mro_meta_init  |NN HV* stash
-#if defined(USE_ITHREADS)
-: Only used in sv.c
-p      |struct mro_meta*       |mro_meta_dup   |NN struct mro_meta* smeta|NN CLONE_PARAMS* param
+EFp    |int    |re_exec_indentf|NN const char *fmt                     \
+                               |U32 depth                              \
+                               |...
+# endif
+#endif /* defined(PERL_IN_REGEXEC_C) */
+#if defined(PERL_IN_REGEX_ENGINE)
+CRip   |bool   |check_regnode_after                                    \
+                               |NULLOK const regnode *p                \
+                               |const STRLEN extra
+CRip   |regnode *|regnext      |NULLOK const regnode *p
+CRip   |regnode *|regnode_after|NULLOK const regnode *p                \
+                               |bool varies
+# if defined(DEBUGGING)
+Ep     |void   |debug_peep     |NN const char *str                     \
+                               |NN const RExC_state_t *pRExC_state     \
+                               |NULLOK regnode *scan                   \
+                               |U32 depth                              \
+                               |U32 flags
+Ep     |void   |debug_show_study_flags                                 \
+                               |U32 flags                              \
+                               |NN const char *open_str                \
+                               |NN const char *close_str
+Ep     |void   |debug_studydata|NN const char *where                   \
+                               |NULLOK scan_data_t *data               \
+                               |U32 depth                              \
+                               |int is_inf                             \
+                               |SSize_t min                            \
+                               |SSize_t stopmin                        \
+                               |SSize_t delta
+Ep     |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
+Ep     |void   |regprop        |NULLOK const regexp *prog              \
+                               |NN SV *sv                              \
+                               |NN const regnode *o                    \
+                               |NULLOK const regmatch_info *reginfo    \
+                               |NULLOK const RExC_state_t *pRExC_state
+EFp    |int    |re_indentf     |NN const char *fmt                     \
+                               |U32 depth                              \
+                               |...
+Efp    |int    |re_printf      |NN const char *fmt                     \
+                               |...
+# endif
+# if defined(PERL_EXT_RE_BUILD)
+Ep     |SV *   |get_re_gclass_aux_data                                 \
+                               |NULLOK const regexp *prog              \
+                               |NN const struct regnode *node          \
+                               |bool doinit                            \
+                               |NULLOK SV **listsvp                    \
+                               |NULLOK SV **lonly_utf8_locale          \
+                               |NULLOK SV **output_invlist
+# else
+Ep     |SV *   |get_regclass_aux_data                                  \
+                               |NULLOK const regexp *prog              \
+                               |NN const struct regnode *node          \
+                               |bool doinit                            \
+                               |NULLOK SV **listsvp                    \
+                               |NULLOK SV **lonly_utf8_locale          \
+                               |NULLOK SV **output_invlist
+# endif
+#endif /* defined(PERL_IN_REGEX_ENGINE) */
+#if defined(PERL_IN_SCOPE_C)
+S      |void   |save_pushptri32ptr                                     \
+                               |NULLOK void * const ptr1               \
+                               |const I32 i                            \
+                               |NULLOK void * const ptr2               \
+                               |const int type
+Sd     |SV *   |save_scalar_at |NN SV **sptr                           \
+                               |const U32 flags
 #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   \
-                                |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 \
-                                     |NN HV * const seen_stashes \
-                                     |NULLOK HV *stash \
-                                     |NULLOK HV *oldstash \
-                                     |NN SV *namesv
+#if defined(PERL_IN_SV_C)
+S      |void   |anonymise_cv_maybe                                     \
+                               |NN GV *gv                              \
+                               |NN CV *cv
+S      |void   |assert_uft8_cache_coherent                             \
+                               |NN const char * const func             \
+                               |STRLEN from_cache                      \
+                               |STRLEN real                            \
+                               |NN SV * const sv
+S      |bool   |curse          |NN SV * const sv                       \
+                               |const bool check_refcnt
+RS     |STRLEN |expect_number  |NN const char ** const pattern
+ST     |char * |F0convert      |NV nv                                  \
+                               |NN char * const endbuf                 \
+                               |NN STRLEN * const len
+S      |SSize_t|find_array_subscript                                   \
+                               |NULLOK const AV * const av             \
+                               |NN const SV * const val
+S      |SV *   |find_hash_subscript                                    \
+                               |NULLOK const HV * const hv             \
+                               |NN const SV * const val
+Sdx    |SV *   |find_uninit_var|NULLOK const OP * const obase          \
+                               |NULLOK const SV * const uninit_sv      \
+                               |bool match                             \
+                               |NN const char **desc_p
+S      |void   |glob_assign_glob                                       \
+                               |NN SV * const dsv                      \
+                               |NN SV * const ssv                      \
+                               |const int dtype
+S      |bool   |glob_2number   |NN GV * const gv
+Cp     |SV *   |more_sv
+S      |void   |not_a_number   |NN SV * const sv
+S      |void   |not_incrementable                                      \
+                               |NN SV * const sv
+RST    |PTR_TBL_ENT_t *|ptr_table_find                                 \
+                               |NN PTR_TBL_t * const tbl               \
+                               |NULLOK const void * const sv
+Sd     |void   |sv_add_arena   |NN char * const ptr                    \
+                               |const U32 size                         \
+                               |const U32 flags
+S      |const char *|sv_display|NN SV * const sv                       \
+                               |NN char *tmpbuf                        \
+                               |STRLEN tmpbuf_size
+S      |bool   |sv_2iuv_common |NN SV * const sv
+S      |STRLEN |sv_pos_b2u_midway                                      \
+                               |NN const U8 * const s                  \
+                               |NN const U8 * const target             \
+                               |NN const U8 *end                       \
+                               |STRLEN endu
+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
+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                 \
+                               |NN bool *canonical_position
+ST     |STRLEN |sv_pos_u2b_midway                                      \
+                               |NN const U8 * const start              \
+                               |NN const U8 *send                      \
+                               |STRLEN uoffset                         \
+                               |const STRLEN uend
+i      |void   |sv_unglob      |NN SV * const sv                       \
+                               |U32 flags
+RTi    |char * |uiv_2buf       |NN char * const buf                    \
+                               |const IV iv                            \
+                               |UV uv                                  \
+                               |const int is_uv                        \
+                               |NN char ** const peob
+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                  \
+                               |const STRLEN byte                      \
+                               |const STRLEN utf8                      \
+                               |const STRLEN blen
+S      |I32    |visit          |NN SVFUNC_t f                          \
+                               |const U32 flags                        \
+                               |const U32 mask
+# if defined(DEBUGGING)
+S      |void   |del_sv         |NN SV *p
+# endif
+# if !defined(NV_PRESERVES_UV)
+#   if defined(DEBUGGING)
+S      |int    |sv_2iuv_non_preserve                                   \
+                               |NN SV * const sv                       \
+                               |I32 numtype
+#   else
+S      |int    |sv_2iuv_non_preserve                                   \
+                               |NN SV * const sv
+#   endif
+# endif
+# if defined(PERL_DEBUG_READONLY_COW)
+S      |void   |sv_buf_to_rw   |NN SV *sv
+# endif
+# if defined(USE_ITHREADS)
+RS     |SV *   |sv_dup_common  |NN const SV * const ssv                \
+                               |NN CLONE_PARAMS * const param
+S      |void   |sv_dup_hvaux   |NN const SV * const ssv                \
+                               |NN SV *dsv                             \
+                               |NN CLONE_PARAMS * const param
+S      |SV **  |sv_dup_inc_multiple                                    \
+                               |NN SV * const *source                  \
+                               |NN SV **dest                           \
+                               |SSize_t items                          \
+                               |NN CLONE_PARAMS * const param
+S      |void   |unreferenced_to_tmp_stack                              \
+                               |NN AV * const unreferenced
+# endif
+#endif /* defined(PERL_IN_SV_C) */
+#if defined(PERL_IN_TOKE_C)
+S      |int    |ao             |int toketype
+S      |void   |checkcomma     |NN const char *s                       \
+                               |NN const char *name                    \
+                               |NN const char *what
+S      |void   |check_uni
+RS     |char * |filter_gets    |NN SV *sv                              \
+                               |STRLEN append
+RS     |HV *   |find_in_my_stash                                       \
+                               |NN const char *pkgname                 \
+                               |STRLEN len
+S      |void   |force_ident    |NN const char *s                       \
+                               |int kind
+S      |void   |force_ident_maybe_lex                                  \
+                               |char pit
+S      |void   |force_next     |I32 type
+S      |char * |force_strict_version                                   \
+                               |NN char *s
+S      |char * |force_version  |NN char *s                             \
+                               |int guessing
+S      |char * |force_word     |NN char *start                         \
+                               |int token                              \
+                               |int check_keyword                      \
+                               |int allow_pack
+RS     |SV *   |get_and_check_backslash_N_name_wrapper                 \
+                               |NN const char *s                       \
+                               |NN const char * const e
+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
+Sr     |void   |missingterm    |NULLOK char *s                         \
+                               |STRLEN len
+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      |void   |no_op          |NN const char * const what             \
+                               |NULLOK char *s
+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
+S      |int    |pending_ident
+RS     |char * |scan_const     |NN char *start
+RS     |char * |scan_formline  |NN char *s
+RS     |char * |scan_heredoc   |NN char *s
+S      |char * |scan_ident     |NN char *s                             \
+                               |NN char *dest                          \
+                               |STRLEN destlen                         \
+                               |I32 ck_uni
+RS     |char * |scan_inputsymbol                                       \
+                               |NN char *start
+RS     |char * |scan_pat       |NN char *start                         \
+                               |I32 type
+RS     |char * |scan_subst     |NN char *start
+RS     |char * |scan_trans     |NN char *start
+RS     |I32    |sublex_done
+RS     |I32    |sublex_push
+RS     |I32    |sublex_start
+RS     |char * |swallow_bom    |NN U8 *s
+RS     |char * |tokenize_use   |int is_use                             \
+                               |NN char *s
+S      |SV *   |tokeq          |NN SV *sv
+S      |void   |update_debugger_info                                   \
+                               |NULLOK SV *orig_sv                     \
+                               |NULLOK const char * const buf          \
+                               |STRLEN len
+S      |int    |yywarn         |NN const char * const s                \
+                               |U32 flags
+# if defined(DEBUGGING)
+Sf     |void   |printbuf       |NN const char * const fmt              \
+                               |NN const char * const s
+S      |int    |tokereport     |I32 rv                                 \
+                               |NN const YYSTYPE *lvalp
+# endif
+# if defined(PERL_CR_FILTER)
+S      |I32    |cr_textfilter  |int idx                                \
+                               |NULLOK SV *sv                          \
+                               |int maxlen
+S      |void   |strip_return   |NN SV *sv
+# endif
+# if !defined(PERL_NO_UTF16_FILTER)
+S      |U8 *   |add_utf16_textfilter                                   \
+                               |NN U8 * const s                        \
+                               |bool reversed
+S      |I32    |utf16_textfilter                                       \
+                               |int idx                                \
+                               |NN SV *sv                              \
+                               |int maxlen
+# endif
+#endif /* defined(PERL_IN_TOKE_C) */
+#if defined(PERL_IN_UNIVERSAL_C)
+GS     |bool   |isa_lookup     |NULLOK HV *stash                       \
+                               |NULLOK SV *namesv                      \
+                               |NULLOK const char *name                \
+                               |STRLEN len                             \
+                               |U32 flags
+GS     |bool   |sv_derived_from_svpvn                                  \
+                               |NULLOK SV *sv                          \
+                               |NULLOK SV *namesv                      \
+                               |NULLOK const char *name                \
+                               |const STRLEN len                       \
+                               |U32 flags
 #endif
-: 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
-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
-CpoT   |void   |sys_init       |NN int* argc|NN char*** argv
-CpoT   |void   |sys_init3      |NN int* argc|NN char*** argv|NN char*** env
-CpoT   |void   |sys_term
-Apxd   |const char *|cop_fetch_label|NN COP *const cop \
-               |NULLOK STRLEN *len|NULLOK U32 *flags
-: Only used  in op.c and the perl compiler
-Apxd   |void|cop_store_label \
-               |NN COP *const cop|NN const char *label|STRLEN len|U32 flags
-
-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
-#  endif
-ARTop  |CLONE_PARAMS *|clone_params_new|NN PerlInterpreter *const from \
-               |NN PerlInterpreter *const to
-ATop   |void   |clone_params_del|NN CLONE_PARAMS *param
+#if defined(PERL_IN_UTF8_C)
+RS     |UV     |check_locale_boundary_crossing                         \
+                               |NN const U8 * const p                  \
+                               |const UV result                        \
+                               |NN U8 * const ustrp                    \
+                               |NN STRLEN *lenp
+RTi    |int    |does_utf8_overflow                                     \
+                               |NN const U8 * const s                  \
+                               |NN const U8 *e                         \
+                               |const bool consider_overlongs
+RTi    |int    |isFF_overlong  |NN const U8 * const s                  \
+                               |const STRLEN len
+Ri     |bool   |is_utf8_common |NN const U8 * const p                  \
+                               |NN const U8 * const e                  \
+                               |NULLOK SV * const invlist
+RTi    |int    |is_utf8_overlong                                       \
+                               |NN const U8 * const s                  \
+                               |const STRLEN len
+RS     |HV *   |new_msg_hv     |NN const char * const message          \
+                               |U32 categories                         \
+                               |U32 flag
+S      |UV     |to_case_cp_list|const UV original                              \
+                               |NULLOK const U32 ** const remaining_list       \
+                               |NULLOK Size_t *remaining_count                 \
+                               |NN SV *invlist                                 \
+                               |NN const I32 * const invmap                    \
+                               |NULLOK const U32 * const * const aux_tables    \
+                               |NULLOK const U8 * const aux_table_lengths      \
+                               |NN const char * const normal
+RST    |U8     |to_lower_latin1|const U8 c                             \
+                               |NULLOK U8 *p                           \
+                               |NULLOK STRLEN *lenp                    \
+                               |const char dummy
+S      |UV     |_to_utf8_case  |const UV original                              \
+                               |NULLOK const U8 *p                             \
+                               |NN U8 *ustrp                                   \
+                               |NN STRLEN *lenp                                \
+                               |NN SV *invlist                                 \
+                               |NN const I32 * const invmap                    \
+                               |NULLOK const U32 * 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
+RS     |char * |unexpected_non_continuation_text                       \
+                               |NN const U8 * const s                  \
+                               |STRLEN print_len                       \
+                               |const STRLEN non_cont_byte_pos         \
+                               |const STRLEN expect_len
+# if 0
+S      |void   |warn_on_first_deprecated_use                           \
+                               |U32 category                           \
+                               |NN const char * const name             \
+                               |NN const char * const alternative      \
+                               |const bool use_locale                  \
+                               |NN const char * const file             \
+                               |const unsigned line
+# endif
+#endif /* defined(PERL_IN_UTF8_C) */
+#if defined(PERL_IN_UTIL_C)
+S      |bool   |ckwarn_common  |U32 w
+S      |SV *   |mess_alloc
+Ti     |U32    |ptr_hash       |PTRV u
+S      |SV *   |with_queued_errors                                     \
+                               |NN SV *ex
+So     |void   |xs_version_bootcheck                                   \
+                               |U32 items                              \
+                               |U32 ax                                 \
+                               |NN const char *xs_p                    \
+                               |STRLEN xs_len
+# if defined(PERL_MEM_LOG) && !defined(PERL_MEM_LOG_NOIMPL)
+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                   \
+                               |NN const char *funcname
+# endif
+# if defined(PERL_USES_PL_PIDSTATUS)
+S      |void   |pidgone        |Pid_t pid                              \
+                               |int status
+# endif
+#endif /* defined(PERL_IN_UTIL_C) */
+#if defined(PERL_MEM_LOG)
+CTp    |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
+CTp    |void   |mem_log_del_sv |NN const SV *sv                        \
+                               |NN const char *filename                \
+                               |int linenumber                         \
+                               |NN const char *funcname
+CTp    |Malloc_t|mem_log_free  |Malloc_t oldalloc                      \
+                               |NN const char *filename                \
+                               |const int linenumber                   \
+                               |NN const char *funcname
+CTp    |void   |mem_log_new_sv |NN const SV *sv                        \
+                               |NN const char *filename                \
+                               |int linenumber                         \
+                               |NN const char *funcname
+CTp    |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
 #endif
-
-: Used in perl.c and toke.c
-Fop    |void   |populate_isa   |NN const char *name|STRLEN len|...
-
-: Some static inline functions need predeclaration because they are used
-: inside other static inline functions.
-#if defined(PERL_CORE) || defined (PERL_EXT)
-Ei     |STRLEN |sv_or_pv_pos_u2b|NN SV *sv|NN const char *pv|STRLEN pos \
-                                |NULLOK STRLEN *lenp
+#if !defined(PERL_NO_INLINE_FUNCTIONS)
+Cipx   |void   |cx_popblock    |NN PERL_CONTEXT *cx
+Cipx   |void   |cx_popeval     |NN PERL_CONTEXT *cx
+Cipx   |void   |cx_popformat   |NN PERL_CONTEXT *cx
+Cipx   |void   |cx_popgiven    |NN PERL_CONTEXT *cx
+Cipx   |void   |cx_poploop     |NN PERL_CONTEXT *cx
+Cipx   |void   |cx_popsub      |NN PERL_CONTEXT *cx
+Cipx   |void   |cx_popsub_args |NN PERL_CONTEXT *cx
+Cipx   |void   |cx_popsub_common                                       \
+                               |NN PERL_CONTEXT *cx
+Cipx   |void   |cx_popwhen     |NN PERL_CONTEXT *cx
+Cipx   |PERL_CONTEXT *|cx_pushblock                                    \
+                               |U8 type                                \
+                               |U8 gimme                               \
+                               |NN SV **sp                             \
+                               |I32 saveix
+Cipx   |void   |cx_pusheval    |NN PERL_CONTEXT *cx                    \
+                               |NULLOK OP *retop                       \
+                               |NULLOK SV *namesv
+Cipx   |void   |cx_pushformat  |NN PERL_CONTEXT *cx                    \
+                               |NN CV *cv                              \
+                               |NULLOK OP *retop                       \
+                               |NULLOK GV *gv
+Cipx   |void   |cx_pushgiven   |NN PERL_CONTEXT *cx                    \
+                               |NULLOK SV *orig_defsv
+Cipx   |void   |cx_pushloop_for|NN PERL_CONTEXT *cx                    \
+                               |NN void *itervarp                      \
+                               |NULLOK SV *itersave
+Cipx   |void   |cx_pushloop_plain                                      \
+                               |NN PERL_CONTEXT *cx
+Cipx   |void   |cx_pushsub     |NN PERL_CONTEXT *cx                    \
+                               |NN CV *cv                              \
+                               |NULLOK OP *retop                       \
+                               |bool hasargs
+Cipx   |void   |cx_pushtry     |NN PERL_CONTEXT *cx                    \
+                               |NULLOK OP *retop
+Cipx   |void   |cx_pushwhen    |NN PERL_CONTEXT *cx
+Cipx   |void   |cx_topblock    |NN PERL_CONTEXT *cx
+Cipx   |U8     |gimme_V
+#endif /* !defined(PERL_NO_INLINE_FUNCTIONS) */
+#if defined(PERL_USE_3ARG_SIGHANDLER)
+CTp    |Signal_t|csighandler   |int sig                                \
+                               |NULLOK Siginfo_t *info                 \
+                               |NULLOK void *uap
+: Used in perl.c
+Tp     |Signal_t|sighandler    |int sig                                \
+                               |NULLOK Siginfo_t *info                 \
+                               |NULLOK void *uap
+#else
+CTp    |Signal_t|csighandler   |int sig
+Tp     |Signal_t|sighandler    |int sig
 #endif
-
-Cp     |void   |clear_defarray |NN AV* av|bool abandon
-
-Apx    |void   |leave_adjust_stacks|NN SV **from_sp|NN SV **to_sp \
-                |U8 gimme|int filter
-
-#ifndef PERL_NO_INLINE_FUNCTIONS
-Cixp   |U8     |gimme_V         |
-Cixp   |PERL_CONTEXT * |cx_pushblock|U8 type|U8 gimme|NN SV** sp|I32 saveix
-Cixp   |void   |cx_popblock|NN PERL_CONTEXT *cx
-Cixp   |void   |cx_topblock|NN PERL_CONTEXT *cx
-Cixp   |void   |cx_pushsub      |NN PERL_CONTEXT *cx|NN CV *cv \
-                                |NULLOK OP *retop|bool hasargs
-Cixp   |void   |cx_popsub_common|NN PERL_CONTEXT *cx
-Cixp   |void   |cx_popsub_args  |NN PERL_CONTEXT *cx
-Cixp   |void   |cx_popsub       |NN PERL_CONTEXT *cx
-Cixp   |void   |cx_pushformat   |NN PERL_CONTEXT *cx|NN CV *cv \
-                                |NULLOK OP *retop|NULLOK GV *gv
-Cixp   |void   |cx_popformat    |NN PERL_CONTEXT *cx
-Cixp   |void   |cx_pusheval     |NN PERL_CONTEXT *cx \
-                                |NULLOK OP *retop|NULLOK SV *namesv
-Cixp   |void   |cx_pushtry      |NN PERL_CONTEXT *cx|NULLOK OP *retop
-Cixp   |void   |cx_popeval      |NN PERL_CONTEXT *cx
-Cixp   |void   |cx_pushloop_plain|NN PERL_CONTEXT *cx
-Cixp   |void   |cx_pushloop_for |NN PERL_CONTEXT *cx \
-                                |NN void *itervarp|NULLOK SV *itersave
-Cixp   |void   |cx_poploop      |NN PERL_CONTEXT *cx
-Cixp   |void   |cx_pushwhen     |NN PERL_CONTEXT *cx
-Cixp   |void   |cx_popwhen      |NN PERL_CONTEXT *cx
-Cixp   |void   |cx_pushgiven    |NN PERL_CONTEXT *cx|NULLOK SV *orig_defsv
-Cixp   |void   |cx_popgiven     |NN PERL_CONTEXT *cx
+#if defined(U64TYPE)
+CRTip  |unsigned|lsbit_pos64   |U64 word
+CRTip  |unsigned|msbit_pos64   |U64 word
+CRTip  |unsigned|single_1bit_pos64                                     \
+                               |U64 word
 #endif
-
-#ifdef USE_DTRACE
-XEop   |void   |dtrace_probe_call |NN CV *cv|bool is_call
-XEop   |void   |dtrace_probe_load |NN const char *name|bool is_loading
-XEop   |void   |dtrace_probe_op   |NN const OP *op
-XEop   |void   |dtrace_probe_phase|enum perl_phase phase
+#if defined(UNLINK_ALL_VERSIONS)
+Cp     |I32    |unlnk          |NN const char *f
+#endif
+#if defined(USE_C_BACKTRACE)
+Adp    |bool   |dump_c_backtrace                                       \
+                               |NN PerlIO *fp                          \
+                               |int max_depth                          \
+                               |int skip
+dm     |void   |free_c_backtrace                                       \
+                               |NN Perl_c_backtrace *bt
+dp     |Perl_c_backtrace *|get_c_backtrace                             \
+                               |int max_depth                          \
+                               |int skip
+Adp    |SV *   |get_c_backtrace_dump                                   \
+                               |int max_depth                          \
+                               |int skip
+#endif
+#if defined(USE_DTRACE)
+EXop   |void   |dtrace_probe_call                                      \
+                               |NN CV *cv                              \
+                               |bool is_call
+EXop   |void   |dtrace_probe_load                                      \
+                               |NN const char *name                    \
+                               |bool is_loading
+EXop   |void   |dtrace_probe_op|NN const OP *op
+EXop   |void   |dtrace_probe_phase                                     \
+                               |enum perl_phase phase
 #endif
-
-XEop   |STRLEN*|dup_warnings   |NULLOK STRLEN* warnings
-
-#ifndef USE_ITHREADS
-Amd    |void   |CopFILEGV_set  |NN COP * c|NN GV * gv
+#if defined(USE_ITHREADS)
+Adpx   |PADOFFSET|alloccopstash|NN HV *hv
+CRp    |void * |any_dup        |NULLOK void *v                         \
+                               |NN const PerlInterpreter *proto_perl
+ATop   |void   |clone_params_del                                       \
+                               |NN CLONE_PARAMS *param
+ARTop  |CLONE_PARAMS *|clone_params_new                                \
+                               |NN PerlInterpreter * const from        \
+                               |NN PerlInterpreter * const to
+Cip    |AV *   |cop_file_avn   |NN const COP *cop
+CRp    |PERL_CONTEXT *|cx_dup  |NULLOK PERL_CONTEXT *cx                \
+                               |I32 ix                                 \
+                               |I32 max                                \
+                               |NN CLONE_PARAMS *param
+CRdp   |DIR *  |dirp_dup       |NULLOK DIR * const dp                  \
+                               |NN CLONE_PARAMS * const param
+Cdp    |PerlIO *|fp_dup        |NULLOK PerlIO * const fp               \
+                               |const char type                        \
+                               |NN CLONE_PARAMS * const param
+CRdp   |GP *   |gp_dup         |NULLOK GP * const gp                   \
+                               |NN CLONE_PARAMS * const param
+CRp    |HE *   |he_dup         |NULLOK const HE *e                     \
+                               |bool shared                            \
+                               |NN CLONE_PARAMS *param
+CRp    |HEK *  |hek_dup        |NULLOK HEK *e                          \
+                               |NN CLONE_PARAMS *param
+CRdp   |MAGIC *|mg_dup         |NULLOK MAGIC *mg                       \
+                               |NN CLONE_PARAMS * const param
+: Only used in sv.c
+p      |struct mro_meta *|mro_meta_dup                                 \
+                               |NN struct mro_meta *smeta              \
+                               |NN CLONE_PARAMS *param
+ARdp   |OP *   |newPADOP       |I32 type                               \
+                               |I32 flags                              \
+                               |NN SV *sv
+Rdp    |PADLIST *|padlist_dup  |NN PADLIST *srcpad                     \
+                               |NN CLONE_PARAMS *param
+Rdp    |PADNAME *|padname_dup  |NN PADNAME *src                        \
+                               |NN CLONE_PARAMS *param
+Rdp    |PADNAMELIST *|padnamelist_dup                                  \
+                               |NN PADNAMELIST *srcpad                 \
+                               |NN CLONE_PARAMS *param
+Cp     |yy_parser *|parser_dup |NULLOK const yy_parser * const proto   \
+                               |NN CLONE_PARAMS * const param
+ATdo   |PerlInterpreter *|perl_clone                                   \
+                               |NN PerlInterpreter *proto_perl         \
+                               |UV flags
+Adp    |void   |re_dup_guts    |NN const REGEXP *sstr                  \
+                               |NN REGEXP *dstr                        \
+                               |NN CLONE_PARAMS *param
+Cp     |void * |regdupe_internal                                       \
+                               |NN REGEXP * const r                    \
+                               |NN CLONE_PARAMS *param
+Cp     |void   |rvpv_dup       |NN SV * const dsv                      \
+                               |NN const SV * const ssv                \
+                               |NN CLONE_PARAMS * const param
+CRdp   |PERL_SI *|si_dup       |NULLOK PERL_SI *si                     \
+                               |NN CLONE_PARAMS *param
+CRdp   |ANY *  |ss_dup         |NN PerlInterpreter *proto_perl         \
+                               |NN CLONE_PARAMS *param
+ARp    |SV *   |sv_dup         |NULLOK const SV * const ssv            \
+                               |NN CLONE_PARAMS * const param
+ARp    |SV *   |sv_dup_inc     |NULLOK const SV * const ssv            \
+                               |NN CLONE_PARAMS * const param
+# if defined(PERL_IN_OP_C) || defined(PERL_IN_PEEP_C)
+p      |void   |op_relocate_sv |NN SV **svp                            \
+                               |NN PADOFFSET *targp
+# endif
+#else /* if !defined(USE_ITHREADS) */
+Adm    |void   |CopFILEGV_set  |NN COP *c                              \
+                               |NN GV *gv
+#endif
+#if defined(USE_LOCALE_COLLATE)
+p      |int    |magic_freecollxfrm                                     \
+                               |NN SV *sv                              \
+                               |NN MAGIC *mg
+p      |int    |magic_setcollxfrm                                      \
+                               |NN SV *sv                              \
+                               |NN MAGIC *mg
+EXop   |SV *   |strxfrm        |NN SV *src
+: Defined in locale.c, used only in sv.c
+AMbdp  |char * |sv_collxfrm    |NN SV * const sv                       \
+                               |NN STRLEN * const nxp
+Adp    |char * |sv_collxfrm_flags                                      \
+                               |NN SV * const sv                       \
+                               |NN STRLEN * const nxp                  \
+                               |I32 const flags
+# if defined(PERL_IN_LOCALE_C) || defined(PERL_IN_MATHOMS_C) || \
+     defined(PERL_IN_SV_C)
+Ep     |char * |mem_collxfrm_  |NN const char *input_string            \
+                               |STRLEN len                             \
+                               |NN STRLEN *xlen                        \
+                               |bool utf8
+# endif
+#endif /* defined(USE_LOCALE_COLLATE) */
+#if defined(USE_PERLIO)
+Adhp   |void   |PerlIO_clearerr|NULLOK PerlIO *f
+Adhp   |int    |PerlIO_close   |NULLOK PerlIO *f
+Adhp   |int    |PerlIO_eof     |NULLOK PerlIO *f
+Adhp   |int    |PerlIO_error   |NULLOK PerlIO *f
+Adhp   |int    |PerlIO_fileno  |NULLOK PerlIO *f
+Adp    |int    |PerlIO_fill    |NULLOK PerlIO *f
+Adhp   |int    |PerlIO_flush   |NULLOK PerlIO *f
+Adhp   |STDCHAR *|PerlIO_get_base                                      \
+                               |NULLOK PerlIO *f
+ARdhp  |SSize_t|PerlIO_get_bufsiz                                      \
+                               |NULLOK PerlIO *f
+ARdhp  |SSize_t|PerlIO_get_cnt |NULLOK PerlIO *f
+Adhp   |STDCHAR *|PerlIO_get_ptr                                       \
+                               |NULLOK PerlIO *f
+Adhp   |SSize_t|PerlIO_read    |NULLOK PerlIO *f                       \
+                               |NN void *vbuf                          \
+                               |Size_t count
+Xp     |void   |PerlIO_restore_errno                                   \
+                               |NULLOK PerlIO *f
+Xp     |void   |PerlIO_save_errno                                      \
+                               |NULLOK PerlIO *f
+Adhp   |int    |PerlIO_seek    |NULLOK PerlIO *f                       \
+                               |Off_t offset                           \
+                               |int whence
+Adhp   |void   |PerlIO_set_cnt |NULLOK PerlIO *f                       \
+                               |SSize_t cnt
+Adhp   |void   |PerlIO_setlinebuf                                      \
+                               |NULLOK PerlIO *f
+Adhp   |void   |PerlIO_set_ptrcnt                                      \
+                               |NULLOK PerlIO *f                       \
+                               |NULLOK STDCHAR *ptr                    \
+                               |SSize_t cnt
+ARdhp  |PerlIO *|PerlIO_stderr
+ARdhp  |PerlIO *|PerlIO_stdin
+ARdhp  |PerlIO *|PerlIO_stdout
+Adhp   |Off_t  |PerlIO_tell    |NULLOK PerlIO *f
+Adp    |SSize_t|PerlIO_unread  |NULLOK PerlIO *f                       \
+                               |NN const void *vbuf                    \
+                               |Size_t count
+Adhp   |SSize_t|PerlIO_write   |NULLOK PerlIO *f                       \
+                               |NN const void *vbuf                    \
+                               |Size_t count
+#endif /* defined(USE_PERLIO) */
+#if defined(USE_PERL_SWITCH_LOCALE_CONTEXT)
+CTop   |void   |switch_locale_context
+#endif
+#if defined(USE_QUADMATH)
+Tdp    |bool   |quadmath_format_needed                                 \
+                               |NN const char *format
+Tdp    |bool   |quadmath_format_valid                                  \
+                               |NN const char *format
+#endif
+#if defined(VMS) || defined(WIN32)
+Cp     |int    |do_aspawn      |NULLOK SV *really                      \
+                               |NN SV **mark                           \
+                               |NN SV **sp
+Cp     |int    |do_spawn       |NN char *cmd
+Cp     |int    |do_spawn_nowait|NN char *cmd
+#endif
+#if defined(WIN32)
+CRTdp  |void * |get_context
+p      |bool   |get_win32_message_utf8ness                             \
+                               |NULLOK const char *string
+Teor   |void   |win32_croak_not_implemented                            \
+                               |NN const char *fname
+#else
+p      |bool   |do_exec3       |NN const char *incmd                   \
+                               |int fd                                 \
+                               |int do_report
+CRTdip |void * |get_context
 #endif
-
-Amd|const char *const|phase_name|enum perl_phase
 
 : ex: set ts=8 sts=4 sw=4 noet:
index c061ab8..d3d9740 100644 (file)
@@ -1,16 +1,19 @@
-/* -*- buffer-read-only: t -*-
+/* -*- mode: C; buffer-read-only: t -*-
  *
  *    embed.h
  *
  *    Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
- *    2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by Larry Wall and others
+ *    2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013,
+ *    2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022
+ *    by Larry Wall and others
  *
  *    You may distribute under the terms of either the GNU General Public
  *    License or the Artistic License, as specified in the README file.
  *
  * !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!!
- * This file is built by regen/embed.pl from data in embed.fnc,
- * regen/embed.pl, regen/opcodes, intrpvar.h and perlvars.h.
+ * This file is built by regen/embed.pl from embed.fnc, intrpvar.h,
+ * perlvars.h, regen/opcodes, regen/embed.pl, regen/embed_lib.pl and
+ * regen/HeaderParser.pm.
  * Any changes made here will be lost!
  *
  * Edit those files and run 'make regen_headers' to effect changes.
  * BEWARE that a bunch of macros don't have long names, so either must be
  * added or don't use them if you define this symbol */
 
-#ifndef PERL_NO_SHORT_NAMES
-
-/* Hide global symbols */
-
-#define Gv_AMupdate(a,b)       Perl_Gv_AMupdate(aTHX_ a,b)
-#define SvAMAGIC_off           Perl_SvAMAGIC_off
-#define SvAMAGIC_on            Perl_SvAMAGIC_on
-#define SvTRUE(a)              Perl_SvTRUE(aTHX_ a)
-#define SvTRUE_NN(a)           Perl_SvTRUE_NN(aTHX_ a)
-#define SvTRUE_common(a,b)     Perl_SvTRUE_common(aTHX_ a,b)
-#define SvTRUE_nomg(a)         Perl_SvTRUE_nomg(aTHX_ a)
-#define _force_out_malformed_utf8_message(a,b,c,d)     Perl__force_out_malformed_utf8_message(aTHX_ a,b,c,d)
-#define _is_in_locale_category(a,b)    Perl__is_in_locale_category(aTHX_ a,b)
-#define _is_uni_FOO(a,b)       Perl__is_uni_FOO(aTHX_ a,b)
-#define _is_uni_perl_idcont(a) Perl__is_uni_perl_idcont(aTHX_ a)
-#define _is_uni_perl_idstart(a)        Perl__is_uni_perl_idstart(aTHX_ a)
-#define _is_utf8_FOO(a,b,c)    Perl__is_utf8_FOO(aTHX_ a,b,c)
-#define _is_utf8_perl_idcont(a,b)      Perl__is_utf8_perl_idcont(aTHX_ a,b)
-#define _is_utf8_perl_idstart(a,b)     Perl__is_utf8_perl_idstart(aTHX_ a,b)
-#define _to_uni_fold_flags(a,b,c,d)    Perl__to_uni_fold_flags(aTHX_ a,b,c,d)
-#define _to_utf8_fold_flags(a,b,c,d,e) Perl__to_utf8_fold_flags(aTHX_ a,b,c,d,e)
-#define _to_utf8_lower_flags(a,b,c,d,e)        Perl__to_utf8_lower_flags(aTHX_ a,b,c,d,e)
-#define _to_utf8_title_flags(a,b,c,d,e)        Perl__to_utf8_title_flags(aTHX_ a,b,c,d,e)
-#define _to_utf8_upper_flags(a,b,c,d,e)        Perl__to_utf8_upper_flags(aTHX_ a,b,c,d,e)
-#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)
-#define apply_attrs_string(a,b,c,d)    Perl_apply_attrs_string(aTHX_ a,b,c,d)
-#define atfork_lock            Perl_atfork_lock
-#define atfork_unlock          Perl_atfork_unlock
-#define av_clear(a)            Perl_av_clear(aTHX_ a)
-#define av_count(a)            Perl_av_count(aTHX_ a)
-#define av_delete(a,b,c)       Perl_av_delete(aTHX_ a,b,c)
-#define av_exists(a,b)         Perl_av_exists(aTHX_ a,b)
-#define av_extend(a,b)         Perl_av_extend(aTHX_ a,b)
-#define av_fetch(a,b,c)                Perl_av_fetch(aTHX_ a,b,c)
-#define av_fetch_simple(a,b,c) Perl_av_fetch_simple(aTHX_ a,b,c)
-#define av_fill(a,b)           Perl_av_fill(aTHX_ a,b)
-#define av_len(a)              Perl_av_len(aTHX_ a)
-#define av_make(a,b)           Perl_av_make(aTHX_ a,b)
-#define av_new_alloc(a,b)      Perl_av_new_alloc(aTHX_ a,b)
-#define av_pop(a)              Perl_av_pop(aTHX_ a)
-#define av_push(a,b)           Perl_av_push(aTHX_ a,b)
-#define av_shift(a)            Perl_av_shift(aTHX_ a)
-#define av_store(a,b,c)                Perl_av_store(aTHX_ a,b,c)
-#define av_store_simple(a,b,c) Perl_av_store_simple(aTHX_ a,b,c)
-#define av_undef(a)            Perl_av_undef(aTHX_ a)
-#define av_unshift(a,b)                Perl_av_unshift(aTHX_ a,b)
-#define block_end(a,b)         Perl_block_end(aTHX_ a,b)
-#define block_gimme()          Perl_block_gimme(aTHX)
-#define block_start(a)         Perl_block_start(aTHX_ a)
-#define bytes_cmp_utf8(a,b,c,d)        Perl_bytes_cmp_utf8(aTHX_ a,b,c,d)
-#define bytes_from_utf8_loc    Perl_bytes_from_utf8_loc
-#define bytes_to_utf8(a,b)     Perl_bytes_to_utf8(aTHX_ a,b)
-#define call_argv(a,b,c)       Perl_call_argv(aTHX_ a,b,c)
-#define call_atexit(a,b)       Perl_call_atexit(aTHX_ a,b)
-#define call_list(a,b)         Perl_call_list(aTHX_ a,b)
-#define call_method(a,b)       Perl_call_method(aTHX_ a,b)
-#define call_pv(a,b)           Perl_call_pv(aTHX_ a,b)
-#define call_sv(a,b)           Perl_call_sv(aTHX_ a,b)
-#define caller_cx(a,b)         Perl_caller_cx(aTHX_ a,b)
-#define cast_i32               Perl_cast_i32
-#define cast_iv                        Perl_cast_iv
-#define cast_ulong             Perl_cast_ulong
-#define cast_uv                        Perl_cast_uv
-#define ck_entersub_args_list(a)       Perl_ck_entersub_args_list(aTHX_ a)
-#define ck_entersub_args_proto(a,b,c)  Perl_ck_entersub_args_proto(aTHX_ a,b,c)
-#define ck_entersub_args_proto_or_list(a,b,c)  Perl_ck_entersub_args_proto_or_list(aTHX_ a,b,c)
-#ifndef MULTIPLICITY
-#define ck_warner              Perl_ck_warner
-#define ck_warner_d            Perl_ck_warner_d
-#endif
-#define clear_defarray(a,b)    Perl_clear_defarray(aTHX_ a,b)
-#define cop_fetch_label(a,b,c) Perl_cop_fetch_label(aTHX_ a,b,c)
-#define cop_store_label(a,b,c,d)       Perl_cop_store_label(aTHX_ a,b,c,d)
-#ifndef MULTIPLICITY
-#define croak                  Perl_croak
-#endif
-#define croak_memory_wrap      Perl_croak_memory_wrap
-#define croak_no_modify                Perl_croak_no_modify
-#define croak_sv(a)            Perl_croak_sv(aTHX_ a)
-#define croak_xs_usage         Perl_croak_xs_usage
-#define csighandler1           Perl_csighandler1
-#define csighandler3           Perl_csighandler3
-#ifndef NO_MATHOMS
-#define custom_op_desc(a)      Perl_custom_op_desc(aTHX_ a)
-#endif
-#ifndef NO_MATHOMS
-#define custom_op_name(a)      Perl_custom_op_name(aTHX_ a)
-#endif
-#define cv_clone(a)            Perl_cv_clone(aTHX_ a)
-#define cv_const_sv            Perl_cv_const_sv
-#define cv_get_call_checker(a,b,c)     Perl_cv_get_call_checker(aTHX_ a,b,c)
-#define cv_get_call_checker_flags(a,b,c,d,e)   Perl_cv_get_call_checker_flags(aTHX_ a,b,c,d,e)
-#define cv_name(a,b,c)         Perl_cv_name(aTHX_ a,b,c)
-#define cv_set_call_checker(a,b,c)     Perl_cv_set_call_checker(aTHX_ a,b,c)
-#define cv_set_call_checker_flags(a,b,c,d)     Perl_cv_set_call_checker_flags(aTHX_ a,b,c,d)
-#define cv_undef(a)            Perl_cv_undef(aTHX_ a)
-#define cx_dump(a)             Perl_cx_dump(aTHX_ a)
-#define cxinc()                        Perl_cxinc(aTHX)
-#ifndef MULTIPLICITY
-#define deb                    Perl_deb
-#endif
-#define debop(a)               Perl_debop(aTHX_ a)
-#define debprofdump()          Perl_debprofdump(aTHX)
-#define debstack()             Perl_debstack(aTHX)
-#define debstackptrs()         Perl_debstackptrs(aTHX)
-#define delimcpy               Perl_delimcpy
-#define despatch_signals()     Perl_despatch_signals(aTHX)
-#ifndef MULTIPLICITY
-#define die                    Perl_die
-#endif
-#define die_sv(a)              Perl_die_sv(aTHX_ a)
-#ifndef NO_MATHOMS
-#define do_binmode(a,b,c)      Perl_do_binmode(aTHX_ a,b,c)
-#endif
-#define do_close(a,b)          Perl_do_close(aTHX_ a,b)
-#define do_gv_dump(a,b,c,d)    Perl_do_gv_dump(aTHX_ a,b,c,d)
-#define do_gvgv_dump(a,b,c,d)  Perl_do_gvgv_dump(aTHX_ a,b,c,d)
-#define do_hv_dump(a,b,c,d)    Perl_do_hv_dump(aTHX_ a,b,c,d)
-#define do_join(a,b,c,d)       Perl_do_join(aTHX_ a,b,c,d)
-#define do_magic_dump(a,b,c,d,e,f,g)   Perl_do_magic_dump(aTHX_ a,b,c,d,e,f,g)
-#define do_op_dump(a,b,c)      Perl_do_op_dump(aTHX_ a,b,c)
-#ifndef NO_MATHOMS
-#define do_open9(a,b,c,d,e,f,g,h,i)    Perl_do_open9(aTHX_ a,b,c,d,e,f,g,h,i)
-#endif
-#define do_openn(a,b,c,d,e,f,g,h,i)    Perl_do_openn(aTHX_ a,b,c,d,e,f,g,h,i)
-#define do_pmop_dump(a,b,c)    Perl_do_pmop_dump(aTHX_ a,b,c)
-#define do_sprintf(a,b,c)      Perl_do_sprintf(aTHX_ a,b,c)
-#define do_sv_dump(a,b,c,d,e,f,g)      Perl_do_sv_dump(aTHX_ a,b,c,d,e,f,g)
-#define doing_taint            Perl_doing_taint
-#define doref(a,b,c)           Perl_doref(aTHX_ a,b,c)
-#define dounwind(a)            Perl_dounwind(aTHX_ a)
-#define dowantarray()          Perl_dowantarray(aTHX)
-#define dump_all()             Perl_dump_all(aTHX)
-#define dump_eval()            Perl_dump_eval(aTHX)
-#define dump_form(a)           Perl_dump_form(aTHX_ a)
-#ifndef MULTIPLICITY
-#define dump_indent            Perl_dump_indent
-#endif
-#define dump_packsubs(a)       Perl_dump_packsubs(aTHX_ a)
-#define dump_sub(a)            Perl_dump_sub(aTHX_ a)
-#define dump_vindent(a,b,c,d)  Perl_dump_vindent(aTHX_ a,b,c,d)
-#define eval_pv(a,b)           Perl_eval_pv(aTHX_ a,b)
-#define eval_sv(a,b)           Perl_eval_sv(aTHX_ a,b)
-#define fbm_compile(a,b)       Perl_fbm_compile(aTHX_ a,b)
-#define fbm_instr(a,b,c,d)     Perl_fbm_instr(aTHX_ a,b,c,d)
-#define filter_add(a,b)                Perl_filter_add(aTHX_ a,b)
-#define filter_del(a)          Perl_filter_del(aTHX_ a)
-#define filter_read(a,b,c)     Perl_filter_read(aTHX_ a,b,c)
-#define find_runcv(a)          Perl_find_runcv(aTHX_ a)
-#define find_rundefsv()                Perl_find_rundefsv(aTHX)
-#define find_rundefsvoffset()  Perl_find_rundefsvoffset(aTHX)
-#define foldEQ                 Perl_foldEQ
-#define foldEQ_latin1          Perl_foldEQ_latin1
-#define foldEQ_locale          Perl_foldEQ_locale
-#define foldEQ_utf8_flags(a,b,c,d,e,f,g,h,i)   Perl_foldEQ_utf8_flags(aTHX_ a,b,c,d,e,f,g,h,i)
-#ifndef MULTIPLICITY
-#define form                   Perl_form
-#endif
-#define free_tmps()            Perl_free_tmps(aTHX)
-#define get_av(a,b)            Perl_get_av(aTHX_ a,b)
-#define get_context            Perl_get_context
-#define get_cv(a,b)            Perl_get_cv(aTHX_ a,b)
-#define get_cvn_flags(a,b,c)   Perl_get_cvn_flags(aTHX_ a,b,c)
-#define get_hv(a,b)            Perl_get_hv(aTHX_ a,b)
-#define get_op_descs()         Perl_get_op_descs(aTHX)
-#define get_op_names()         Perl_get_op_names(aTHX)
-#define get_ppaddr()           Perl_get_ppaddr(aTHX)
-#define get_sv(a,b)            Perl_get_sv(aTHX_ a,b)
-#define get_vtbl(a)            Perl_get_vtbl(aTHX_ a)
-#define getcwd_sv(a)           Perl_getcwd_sv(aTHX_ a)
-#define gp_free(a)             Perl_gp_free(aTHX_ a)
-#define gp_ref(a)              Perl_gp_ref(aTHX_ a)
-#define grok_atoUV             Perl_grok_atoUV
-#define grok_bin_oct_hex(a,b,c,d,e,f,g)        Perl_grok_bin_oct_hex(aTHX_ a,b,c,d,e,f,g)
-#define grok_infnan(a,b)       Perl_grok_infnan(aTHX_ a,b)
-#define grok_number(a,b,c)     Perl_grok_number(aTHX_ a,b,c)
-#define grok_number_flags(a,b,c,d)     Perl_grok_number_flags(aTHX_ a,b,c,d)
-#define grok_numeric_radix(a,b)        Perl_grok_numeric_radix(aTHX_ a,b)
-#define gv_add_by_type(a,b)    Perl_gv_add_by_type(aTHX_ a,b)
-#define gv_autoload_pv(a,b,c)  Perl_gv_autoload_pv(aTHX_ a,b,c)
-#define gv_autoload_pvn(a,b,c,d)       Perl_gv_autoload_pvn(aTHX_ a,b,c,d)
-#define gv_autoload_sv(a,b,c)  Perl_gv_autoload_sv(aTHX_ a,b,c)
-#define gv_check(a)            Perl_gv_check(aTHX_ a)
-#define gv_const_sv(a)         Perl_gv_const_sv(aTHX_ a)
-#define gv_dump(a)             Perl_gv_dump(aTHX_ a)
-#ifndef NO_MATHOMS
-#define gv_efullname(a,b)      Perl_gv_efullname(aTHX_ a,b)
-#endif
-#define gv_efullname4(a,b,c,d) Perl_gv_efullname4(aTHX_ a,b,c,d)
-#define gv_fetchfile(a)                Perl_gv_fetchfile(aTHX_ a)
-#define gv_fetchfile_flags(a,b,c)      Perl_gv_fetchfile_flags(aTHX_ a,b,c)
-#define gv_fetchmeth_pv(a,b,c,d)       Perl_gv_fetchmeth_pv(aTHX_ a,b,c,d)
-#define gv_fetchmeth_pv_autoload(a,b,c,d)      Perl_gv_fetchmeth_pv_autoload(aTHX_ a,b,c,d)
-#define gv_fetchmeth_pvn(a,b,c,d,e)    Perl_gv_fetchmeth_pvn(aTHX_ a,b,c,d,e)
-#define gv_fetchmeth_pvn_autoload(a,b,c,d,e)   Perl_gv_fetchmeth_pvn_autoload(aTHX_ a,b,c,d,e)
-#define gv_fetchmeth_sv(a,b,c,d)       Perl_gv_fetchmeth_sv(aTHX_ a,b,c,d)
-#define gv_fetchmeth_sv_autoload(a,b,c,d)      Perl_gv_fetchmeth_sv_autoload(aTHX_ a,b,c,d)
-#define gv_fetchmethod_autoload(a,b,c) Perl_gv_fetchmethod_autoload(aTHX_ a,b,c)
-#define gv_fetchmethod_pv_flags(a,b,c) Perl_gv_fetchmethod_pv_flags(aTHX_ a,b,c)
-#define gv_fetchmethod_pvn_flags(a,b,c,d)      Perl_gv_fetchmethod_pvn_flags(aTHX_ a,b,c,d)
-#define gv_fetchmethod_sv_flags(a,b,c) Perl_gv_fetchmethod_sv_flags(aTHX_ a,b,c)
-#define gv_fetchpv(a,b,c)      Perl_gv_fetchpv(aTHX_ a,b,c)
-#define gv_fetchpvn_flags(a,b,c,d)     Perl_gv_fetchpvn_flags(aTHX_ a,b,c,d)
-#define gv_fetchsv(a,b,c)      Perl_gv_fetchsv(aTHX_ a,b,c)
-#ifndef NO_MATHOMS
-#define gv_fullname(a,b)       Perl_gv_fullname(aTHX_ a,b)
-#endif
-#define gv_fullname4(a,b,c,d)  Perl_gv_fullname4(aTHX_ a,b,c,d)
-#define gv_handler(a,b)                Perl_gv_handler(aTHX_ a,b)
-#define gv_init_pv(a,b,c,d)    Perl_gv_init_pv(aTHX_ a,b,c,d)
-#define gv_init_pvn(a,b,c,d,e) Perl_gv_init_pvn(aTHX_ a,b,c,d,e)
-#define gv_init_sv(a,b,c,d)    Perl_gv_init_sv(aTHX_ a,b,c,d)
-#define gv_name_set(a,b,c,d)   Perl_gv_name_set(aTHX_ a,b,c,d)
-#define gv_stashpv(a,b)                Perl_gv_stashpv(aTHX_ a,b)
-#define gv_stashpvn(a,b,c)     Perl_gv_stashpvn(aTHX_ a,b,c)
-#define gv_stashsv(a,b)                Perl_gv_stashsv(aTHX_ a,b)
-#define hv_bucket_ratio(a)     Perl_hv_bucket_ratio(aTHX_ a)
-#define hv_clear(a)            Perl_hv_clear(aTHX_ a)
-#define hv_clear_placeholders(a)       Perl_hv_clear_placeholders(aTHX_ a)
-#define hv_common(a,b,c,d,e,f,g,h)     Perl_hv_common(aTHX_ a,b,c,d,e,f,g,h)
-#define hv_common_key_len(a,b,c,d,e,f) Perl_hv_common_key_len(aTHX_ a,b,c,d,e,f)
-#define hv_copy_hints_hv(a)    Perl_hv_copy_hints_hv(aTHX_ a)
-#define hv_delayfree_ent(a,b)  Perl_hv_delayfree_ent(aTHX_ a,b)
-#define hv_free_ent(a,b)       Perl_hv_free_ent(aTHX_ a,b)
-#define hv_iterinit(a)         Perl_hv_iterinit(aTHX_ a)
-#define hv_iterkey(a,b)                Perl_hv_iterkey(aTHX_ a,b)
-#define hv_iterkeysv(a)                Perl_hv_iterkeysv(aTHX_ a)
-#define hv_iternext_flags(a,b) Perl_hv_iternext_flags(aTHX_ a,b)
-#define hv_iternextsv(a,b,c)   Perl_hv_iternextsv(aTHX_ a,b,c)
-#define hv_iterval(a,b)                Perl_hv_iterval(aTHX_ a,b)
-#define hv_ksplit(a,b)         Perl_hv_ksplit(aTHX_ a,b)
-#define hv_name_set(a,b,c,d)   Perl_hv_name_set(aTHX_ a,b,c,d)
-#define hv_rand_set(a,b)       Perl_hv_rand_set(aTHX_ a,b)
-#define hv_scalar(a)           Perl_hv_scalar(aTHX_ a)
-#define init_i18nl10n(a)       Perl_init_i18nl10n(aTHX_ a)
-#ifndef NO_MATHOMS
-#define init_i18nl14n(a)       Perl_init_i18nl14n(aTHX_ a)
-#endif
-#define init_stacks()          Perl_init_stacks(aTHX)
-#define init_tm(a)             Perl_init_tm(aTHX_ a)
-#define intro_my()             Perl_intro_my(aTHX)
-#define isC9_STRICT_UTF8_CHAR  Perl_isC9_STRICT_UTF8_CHAR
-#define isSTRICT_UTF8_CHAR     Perl_isSTRICT_UTF8_CHAR
-#define isUTF8_CHAR            Perl_isUTF8_CHAR
-#define isUTF8_CHAR_flags      Perl_isUTF8_CHAR_flags
-#define is_c9strict_utf8_string_loclen Perl_is_c9strict_utf8_string_loclen
-#define is_lvalue_sub()                Perl_is_lvalue_sub(aTHX)
-#define is_safe_syscall(a,b,c,d)       Perl_is_safe_syscall(aTHX_ a,b,c,d)
-#define is_strict_utf8_string_loclen   Perl_is_strict_utf8_string_loclen
-#define is_utf8_FF_helper_     Perl_is_utf8_FF_helper_
-#ifndef NO_MATHOMS
-#define is_utf8_char           Perl_is_utf8_char
-#endif
-#define is_utf8_char_helper_   Perl_is_utf8_char_helper_
-#define is_utf8_fixed_width_buf_loclen_flags   Perl_is_utf8_fixed_width_buf_loclen_flags
-#define is_utf8_invariant_string_loc   Perl_is_utf8_invariant_string_loc
-#define is_utf8_string_flags   Perl_is_utf8_string_flags
-#define is_utf8_string_loclen  Perl_is_utf8_string_loclen
-#define is_utf8_string_loclen_flags    Perl_is_utf8_string_loclen_flags
-#define is_utf8_valid_partial_char_flags       Perl_is_utf8_valid_partial_char_flags
-#define isinfnan               Perl_isinfnan
-#define leave_adjust_stacks(a,b,c,d)   Perl_leave_adjust_stacks(aTHX_ a,b,c,d)
-#define leave_scope(a)         Perl_leave_scope(aTHX_ a)
-#define lex_bufutf8()          Perl_lex_bufutf8(aTHX)
-#define lex_discard_to(a)      Perl_lex_discard_to(aTHX_ a)
-#define lex_grow_linestr(a)    Perl_lex_grow_linestr(aTHX_ a)
-#define lex_next_chunk(a)      Perl_lex_next_chunk(aTHX_ a)
-#define lex_peek_unichar(a)    Perl_lex_peek_unichar(aTHX_ a)
-#define lex_read_space(a)      Perl_lex_read_space(aTHX_ a)
-#define lex_read_to(a)         Perl_lex_read_to(aTHX_ a)
-#define lex_read_unichar(a)    Perl_lex_read_unichar(aTHX_ a)
-#define lex_start(a,b,c)       Perl_lex_start(aTHX_ a,b,c)
-#define lex_stuff_pv(a,b)      Perl_lex_stuff_pv(aTHX_ a,b)
-#define lex_stuff_pvn(a,b,c)   Perl_lex_stuff_pvn(aTHX_ a,b,c)
-#define lex_stuff_sv(a,b)      Perl_lex_stuff_sv(aTHX_ a,b)
-#define lex_unstuff(a)         Perl_lex_unstuff(aTHX_ a)
-#ifndef MULTIPLICITY
-#define load_module            Perl_load_module
-#endif
-#define looks_like_number(a)   Perl_looks_like_number(aTHX_ a)
-#define lsbit_pos32            Perl_lsbit_pos32
-#define magic_dump(a)          Perl_magic_dump(aTHX_ a)
-#define markstack_grow()       Perl_markstack_grow(aTHX)
-#ifndef MULTIPLICITY
-#define mess                   Perl_mess
-#endif
-#define mess_sv(a,b)           Perl_mess_sv(aTHX_ a,b)
-#define mg_clear(a)            Perl_mg_clear(aTHX_ a)
-#define mg_copy(a,b,c,d)       Perl_mg_copy(aTHX_ a,b,c,d)
-#define mg_find                        Perl_mg_find
-#define mg_findext             Perl_mg_findext
-#define mg_free(a)             Perl_mg_free(aTHX_ a)
-#define mg_free_type(a,b)      Perl_mg_free_type(aTHX_ a,b)
-#define mg_freeext(a,b,c)      Perl_mg_freeext(aTHX_ a,b,c)
-#define mg_get(a)              Perl_mg_get(aTHX_ a)
-#define mg_length(a)           Perl_mg_length(aTHX_ a)
-#define mg_magical             Perl_mg_magical
-#define mg_set(a)              Perl_mg_set(aTHX_ a)
-#define mg_size(a)             Perl_mg_size(aTHX_ a)
-#define mini_mktime            Perl_mini_mktime
-#define moreswitches(a)                Perl_moreswitches(aTHX_ a)
-#define mortal_getenv          Perl_mortal_getenv
-#define mro_get_linear_isa(a)  Perl_mro_get_linear_isa(aTHX_ a)
-#define mro_method_changed_in(a)       Perl_mro_method_changed_in(aTHX_ a)
-#define msbit_pos32            Perl_msbit_pos32
-#define my_atof(a)             Perl_my_atof(aTHX_ a)
-#define my_atof3(a,b,c)                Perl_my_atof3(aTHX_ a,b,c)
-#define my_dirfd               Perl_my_dirfd
-#define my_exit(a)             Perl_my_exit(aTHX_ a)
-#define my_failure_exit()      Perl_my_failure_exit(aTHX)
-#define my_fflush_all()                Perl_my_fflush_all(aTHX)
-#define my_fork                        Perl_my_fork
-#define my_popen_list(a,b,c)   Perl_my_popen_list(aTHX_ a,b,c)
-#define my_setenv(a,b)         Perl_my_setenv(aTHX_ a,b)
-#define my_socketpair          Perl_my_socketpair
-#define my_strftime(a,b,c,d,e,f,g,h,i,j)       Perl_my_strftime(aTHX_ a,b,c,d,e,f,g,h,i,j)
-#define my_strtod              Perl_my_strtod
-#define newANONATTRSUB(a,b,c,d)        Perl_newANONATTRSUB(aTHX_ a,b,c,d)
-#define newANONHASH(a)         Perl_newANONHASH(aTHX_ a)
-#define newANONLIST(a)         Perl_newANONLIST(aTHX_ a)
-#define newANONSUB(a,b,c)      Perl_newANONSUB(aTHX_ a,b,c)
-#define newASSIGNOP(a,b,c,d)   Perl_newASSIGNOP(aTHX_ a,b,c,d)
-#define newAVREF(a)            Perl_newAVREF(aTHX_ a)
-#define newBINOP(a,b,c,d)      Perl_newBINOP(aTHX_ a,b,c,d)
-#define newCONDOP(a,b,c,d)     Perl_newCONDOP(aTHX_ a,b,c,d)
-#define newCONSTSUB(a,b,c)     Perl_newCONSTSUB(aTHX_ a,b,c)
-#define newCONSTSUB_flags(a,b,c,d,e)   Perl_newCONSTSUB_flags(aTHX_ a,b,c,d,e)
-#define newCVREF(a,b)          Perl_newCVREF(aTHX_ a,b)
-#define newDEFEROP(a,b)                Perl_newDEFEROP(aTHX_ a,b)
-#define newDEFSVOP()           Perl_newDEFSVOP(aTHX)
-#define newFORM(a,b,c)         Perl_newFORM(aTHX_ a,b,c)
-#define newFOROP(a,b,c,d,e)    Perl_newFOROP(aTHX_ a,b,c,d,e)
-#define newGIVENOP(a,b,c)      Perl_newGIVENOP(aTHX_ a,b,c)
-#define newGVOP(a,b,c)         Perl_newGVOP(aTHX_ a,b,c)
-#define newGVREF(a,b)          Perl_newGVREF(aTHX_ a,b)
-#define newGVgen_flags(a,b)    Perl_newGVgen_flags(aTHX_ a,b)
-#define newHVREF(a)            Perl_newHVREF(aTHX_ a)
-#define newHVhv(a)             Perl_newHVhv(aTHX_ a)
-#define newLISTOP(a,b,c,d)     Perl_newLISTOP(aTHX_ a,b,c,d)
-#define newLOGOP(a,b,c,d)      Perl_newLOGOP(aTHX_ a,b,c,d)
-#define newLOOPEX(a,b)         Perl_newLOOPEX(aTHX_ a,b)
-#define newLOOPOP(a,b,c,d)     Perl_newLOOPOP(aTHX_ a,b,c,d)
-#define newMETHOP(a,b,c)       Perl_newMETHOP(aTHX_ a,b,c)
-#define newMETHOP_named(a,b,c) Perl_newMETHOP_named(aTHX_ a,b,c)
-#define newMYSUB(a,b,c,d,e)    Perl_newMYSUB(aTHX_ a,b,c,d,e)
-#define newNULLLIST()          Perl_newNULLLIST(aTHX)
-#define newOP(a,b)             Perl_newOP(aTHX_ a,b)
-#define newPADNAMELIST         Perl_newPADNAMELIST
-#define newPADNAMEouter                Perl_newPADNAMEouter
-#define newPADNAMEpvn          Perl_newPADNAMEpvn
-#define newPMOP(a,b)           Perl_newPMOP(aTHX_ a,b)
-#define newPROG(a)             Perl_newPROG(aTHX_ a)
-#define newPVOP(a,b,c)         Perl_newPVOP(aTHX_ a,b,c)
-#define newRANGE(a,b,c)                Perl_newRANGE(aTHX_ a,b,c)
-#define newRV(a)               Perl_newRV(aTHX_ a)
-#define newRV_noinc(a)         Perl_newRV_noinc(aTHX_ a)
-#define newSLICEOP(a,b,c)      Perl_newSLICEOP(aTHX_ a,b,c)
-#define newSTATEOP(a,b,c)      Perl_newSTATEOP(aTHX_ a,b,c)
-#define newSV(a)               Perl_newSV(aTHX_ a)
-#define newSVOP(a,b,c)         Perl_newSVOP(aTHX_ a,b,c)
-#define newSVREF(a)            Perl_newSVREF(aTHX_ a)
-#define newSV_type(a)          Perl_newSV_type(aTHX_ a)
-#define newSV_type_mortal(a)   Perl_newSV_type_mortal(aTHX_ a)
-#define newSVhek(a)            Perl_newSVhek(aTHX_ a)
-#define newSViv(a)             Perl_newSViv(aTHX_ a)
-#define newSVnv(a)             Perl_newSVnv(aTHX_ a)
-#define newSVpv(a,b)           Perl_newSVpv(aTHX_ a,b)
-#define newSVpv_share(a,b)     Perl_newSVpv_share(aTHX_ a,b)
-#ifndef MULTIPLICITY
-#define newSVpvf               Perl_newSVpvf
-#endif
-#define newSVpvn(a,b)          Perl_newSVpvn(aTHX_ a,b)
-#define newSVpvn_flags(a,b,c)  Perl_newSVpvn_flags(aTHX_ a,b,c)
-#define newSVpvn_share(a,b,c)  Perl_newSVpvn_share(aTHX_ a,b,c)
-#define newSVrv(a,b)           Perl_newSVrv(aTHX_ a,b)
-#define newSVsv_flags(a,b)     Perl_newSVsv_flags(aTHX_ a,b)
-#define newSVuv(a)             Perl_newSVuv(aTHX_ a)
-#define newTRYCATCHOP(a,b,c,d) Perl_newTRYCATCHOP(aTHX_ a,b,c,d)
-#define newUNOP(a,b,c)         Perl_newUNOP(aTHX_ a,b,c)
-#define newUNOP_AUX(a,b,c,d)   Perl_newUNOP_AUX(aTHX_ a,b,c,d)
-#define newWHENOP(a,b)         Perl_newWHENOP(aTHX_ a,b)
-#define newWHILEOP(a,b,c,d,e,f,g)      Perl_newWHILEOP(aTHX_ a,b,c,d,e,f,g)
-#define newXS(a,b,c)           Perl_newXS(aTHX_ a,b,c)
-#define newXS_flags(a,b,c,d,e) Perl_newXS_flags(aTHX_ a,b,c,d,e)
-#define new_stackinfo(a,b)     Perl_new_stackinfo(aTHX_ a,b)
-#define new_version(a)         Perl_new_version(aTHX_ a)
-#define nothreadhook()         Perl_nothreadhook(aTHX)
-#define op_append_elem(a,b,c)  Perl_op_append_elem(aTHX_ a,b,c)
-#define op_append_list(a,b,c)  Perl_op_append_list(aTHX_ a,b,c)
-#define op_class(a)            Perl_op_class(aTHX_ a)
-#define op_contextualize(a,b)  Perl_op_contextualize(aTHX_ a,b)
-#define op_convert_list(a,b,c) Perl_op_convert_list(aTHX_ a,b,c)
-#define op_dump(a)             Perl_op_dump(aTHX_ a)
-#define op_free(a)             Perl_op_free(aTHX_ a)
-#define op_linklist(a)         Perl_op_linklist(aTHX_ a)
-#define op_null(a)             Perl_op_null(aTHX_ a)
-#define op_parent              Perl_op_parent
-#define op_prepend_elem(a,b,c) Perl_op_prepend_elem(aTHX_ a,b,c)
-#define op_refcnt_lock()       Perl_op_refcnt_lock(aTHX)
-#define op_refcnt_unlock()     Perl_op_refcnt_unlock(aTHX)
-#define op_scope(a)            Perl_op_scope(aTHX_ a)
-#define op_sibling_splice      Perl_op_sibling_splice
-#define op_wrap_finally(a,b)   Perl_op_wrap_finally(aTHX_ a,b)
-#ifndef NO_MATHOMS
-#define pack_cat(a,b,c,d,e,f,g)        Perl_pack_cat(aTHX_ a,b,c,d,e,f,g)
-#endif
-#define packlist(a,b,c,d,e)    Perl_packlist(aTHX_ a,b,c,d,e)
-#define pad_add_anon(a,b)      Perl_pad_add_anon(aTHX_ a,b)
-#define pad_add_name_pv(a,b,c,d)       Perl_pad_add_name_pv(aTHX_ a,b,c,d)
-#define pad_add_name_pvn(a,b,c,d,e)    Perl_pad_add_name_pvn(aTHX_ a,b,c,d,e)
-#define pad_add_name_sv(a,b,c,d)       Perl_pad_add_name_sv(aTHX_ a,b,c,d)
-#define pad_alloc(a,b)         Perl_pad_alloc(aTHX_ a,b)
-#ifndef NO_MATHOMS
-#define pad_compname_type(a)   Perl_pad_compname_type(aTHX_ a)
-#endif
-#define pad_findmy_pv(a,b)     Perl_pad_findmy_pv(aTHX_ a,b)
-#define pad_findmy_pvn(a,b,c)  Perl_pad_findmy_pvn(aTHX_ a,b,c)
-#define pad_findmy_sv(a,b)     Perl_pad_findmy_sv(aTHX_ a,b)
-#define pad_new(a)             Perl_pad_new(aTHX_ a)
-#define pad_tidy(a)            Perl_pad_tidy(aTHX_ a)
-#define padnamelist_fetch      Perl_padnamelist_fetch
-#define padnamelist_store(a,b,c)       Perl_padnamelist_store(aTHX_ a,b,c)
-#define parse_arithexpr(a)     Perl_parse_arithexpr(aTHX_ a)
-#define parse_barestmt(a)      Perl_parse_barestmt(aTHX_ a)
-#define parse_block(a)         Perl_parse_block(aTHX_ a)
-#define parse_fullexpr(a)      Perl_parse_fullexpr(aTHX_ a)
-#define parse_fullstmt(a)      Perl_parse_fullstmt(aTHX_ a)
-#define parse_label(a)         Perl_parse_label(aTHX_ a)
-#define parse_listexpr(a)      Perl_parse_listexpr(aTHX_ a)
-#define parse_stmtseq(a)       Perl_parse_stmtseq(aTHX_ a)
-#define parse_subsignature(a)  Perl_parse_subsignature(aTHX_ a)
-#define parse_termexpr(a)      Perl_parse_termexpr(aTHX_ a)
-#define perly_sighandler       Perl_perly_sighandler
-#define pmop_dump(a)           Perl_pmop_dump(aTHX_ a)
-#define pop_scope()            Perl_pop_scope(aTHX)
-#define pregcomp(a,b)          Perl_pregcomp(aTHX_ a,b)
-#define pregexec(a,b,c,d,e,f,g)        Perl_pregexec(aTHX_ a,b,c,d,e,f,g)
-#define pregfree(a)            Perl_pregfree(aTHX_ a)
-#define pregfree2(a)           Perl_pregfree2(aTHX_ a)
-#define prescan_version(a,b,c,d,e,f,g) Perl_prescan_version(aTHX_ a,b,c,d,e,f,g)
-#define ptr_table_fetch(a,b)   Perl_ptr_table_fetch(aTHX_ a,b)
-#define ptr_table_free(a)      Perl_ptr_table_free(aTHX_ a)
-#define ptr_table_new()                Perl_ptr_table_new(aTHX)
-#define ptr_table_split(a)     Perl_ptr_table_split(aTHX_ a)
-#define ptr_table_store(a,b,c) Perl_ptr_table_store(aTHX_ a,b,c)
-#define push_scope()           Perl_push_scope(aTHX)
-#define pv_display(a,b,c,d,e)  Perl_pv_display(aTHX_ a,b,c,d,e)
-#define pv_escape(a,b,c,d,e,f) Perl_pv_escape(aTHX_ a,b,c,d,e,f)
-#define pv_pretty(a,b,c,d,e,f,g)       Perl_pv_pretty(aTHX_ a,b,c,d,e,f,g)
-#define pv_uni_display(a,b,c,d,e)      Perl_pv_uni_display(aTHX_ a,b,c,d,e)
-#define re_compile(a,b)                Perl_re_compile(aTHX_ a,b)
-#define re_intuit_start(a,b,c,d,e,f,g) Perl_re_intuit_start(aTHX_ a,b,c,d,e,f,g)
-#define re_intuit_string(a)    Perl_re_intuit_string(aTHX_ a)
-#define reentrant_free()       Perl_reentrant_free(aTHX)
-#define reentrant_init()       Perl_reentrant_init(aTHX)
-#define reentrant_retry                Perl_reentrant_retry
-#define reentrant_size()       Perl_reentrant_size(aTHX)
-#define reg_named_buff_all(a,b)        Perl_reg_named_buff_all(aTHX_ a,b)
-#define reg_named_buff_exists(a,b,c)   Perl_reg_named_buff_exists(aTHX_ a,b,c)
-#define reg_named_buff_fetch(a,b,c)    Perl_reg_named_buff_fetch(aTHX_ a,b,c)
-#define reg_named_buff_firstkey(a,b)   Perl_reg_named_buff_firstkey(aTHX_ a,b)
-#define reg_named_buff_nextkey(a,b)    Perl_reg_named_buff_nextkey(aTHX_ a,b)
-#define reg_named_buff_scalar(a,b)     Perl_reg_named_buff_scalar(aTHX_ a,b)
-#define regdump(a)             Perl_regdump(aTHX_ a)
-#define regexec_flags(a,b,c,d,e,f,g,h) Perl_regexec_flags(aTHX_ a,b,c,d,e,f,g,h)
-#define regfree_internal(a)    Perl_regfree_internal(aTHX_ a)
-#define reginitcolors()                Perl_reginitcolors(aTHX)
-#define regnext(a)             Perl_regnext(aTHX_ a)
-#define repeatcpy              Perl_repeatcpy
-#define require_pv(a)          Perl_require_pv(aTHX_ a)
-#define rninstr                        Perl_rninstr
-#define rsignal(a,b)           Perl_rsignal(aTHX_ a,b)
-#define rsignal_state(a)       Perl_rsignal_state(aTHX_ a)
-#define runops_debug()         Perl_runops_debug(aTHX)
-#define runops_standard()      Perl_runops_standard(aTHX)
-#define rv2cv_op_cv(a,b)       Perl_rv2cv_op_cv(aTHX_ a,b)
-#define safesyscalloc          Perl_safesyscalloc
-#define safesysfree            Perl_safesysfree
-#define safesysmalloc          Perl_safesysmalloc
-#define safesysrealloc         Perl_safesysrealloc
-#define save_I16(a)            Perl_save_I16(aTHX_ a)
-#define save_I32(a)            Perl_save_I32(aTHX_ a)
-#define save_I8(a)             Perl_save_I8(aTHX_ a)
-#define save_adelete(a,b)      Perl_save_adelete(aTHX_ a,b)
-#define save_aelem_flags(a,b,c,d)      Perl_save_aelem_flags(aTHX_ a,b,c,d)
-#define save_alloc(a,b)                Perl_save_alloc(aTHX_ a,b)
-#define save_aptr(a)           Perl_save_aptr(aTHX_ a)
-#define save_ary(a)            Perl_save_ary(aTHX_ a)
-#define save_bool(a)           Perl_save_bool(aTHX_ a)
-#define save_clearsv(a)                Perl_save_clearsv(aTHX_ a)
-#define save_delete(a,b,c)     Perl_save_delete(aTHX_ a,b,c)
-#define save_destructor(a,b)   Perl_save_destructor(aTHX_ a,b)
-#define save_destructor_x(a,b) Perl_save_destructor_x(aTHX_ a,b)
-#define save_generic_pvref(a)  Perl_save_generic_pvref(aTHX_ a)
-#define save_generic_svref(a)  Perl_save_generic_svref(aTHX_ a)
-#define save_gp(a,b)           Perl_save_gp(aTHX_ a,b)
-#define save_hash(a)           Perl_save_hash(aTHX_ a)
-#define save_hdelete(a,b)      Perl_save_hdelete(aTHX_ a,b)
-#define save_helem_flags(a,b,c,d)      Perl_save_helem_flags(aTHX_ a,b,c,d)
-#define save_hints()           Perl_save_hints(aTHX)
-#define save_hptr(a)           Perl_save_hptr(aTHX_ a)
-#define save_int(a)            Perl_save_int(aTHX_ a)
-#define save_item(a)           Perl_save_item(aTHX_ a)
-#define save_iv(a)             Perl_save_iv(aTHX_ a)
-#ifndef NO_MATHOMS
-#define save_list(a,b)         Perl_save_list(aTHX_ a,b)
-#endif
-#ifndef NO_MATHOMS
-#define save_long(a)           Perl_save_long(aTHX_ a)
-#endif
-#ifndef NO_MATHOMS
-#define save_nogv(a)           Perl_save_nogv(aTHX_ a)
-#endif
-#define save_padsv_and_mortalize(a)    Perl_save_padsv_and_mortalize(aTHX_ a)
-#define save_pptr(a)           Perl_save_pptr(aTHX_ a)
-#define save_pushi32ptr(a,b,c) Perl_save_pushi32ptr(aTHX_ a,b,c)
-#define save_pushptr(a,b)      Perl_save_pushptr(aTHX_ a,b)
-#define save_pushptrptr(a,b,c) Perl_save_pushptrptr(aTHX_ a,b,c)
-#define save_re_context()      Perl_save_re_context(aTHX)
-#define save_scalar(a)         Perl_save_scalar(aTHX_ a)
-#define save_set_svflags(a,b,c)        Perl_save_set_svflags(aTHX_ a,b,c)
-#define save_shared_pvref(a)   Perl_save_shared_pvref(aTHX_ a)
-#define save_sptr(a)           Perl_save_sptr(aTHX_ a)
-#define save_svref(a)          Perl_save_svref(aTHX_ a)
-#define save_vptr(a)           Perl_save_vptr(aTHX_ a)
-#define savepv(a)              Perl_savepv(aTHX_ a)
-#define savepvn(a,b)           Perl_savepvn(aTHX_ a,b)
-#define savesharedpv(a)                Perl_savesharedpv(aTHX_ a)
-#define savesharedpvn(a,b)     Perl_savesharedpvn(aTHX_ a,b)
-#define savesharedsvpv(a)      Perl_savesharedsvpv(aTHX_ a)
-#define savestack_grow()       Perl_savestack_grow(aTHX)
-#define savestack_grow_cnt(a)  Perl_savestack_grow_cnt(aTHX_ a)
-#define savesvpv(a)            Perl_savesvpv(aTHX_ a)
-#define scan_bin(a,b,c)                Perl_scan_bin(aTHX_ a,b,c)
-#define scan_hex(a,b,c)                Perl_scan_hex(aTHX_ a,b,c)
-#define scan_num(a,b)          Perl_scan_num(aTHX_ a,b)
-#define scan_oct(a,b,c)                Perl_scan_oct(aTHX_ a,b,c)
-#define scan_version(a,b,c)    Perl_scan_version(aTHX_ a,b,c)
-#define scan_vstring(a,b,c)    Perl_scan_vstring(aTHX_ a,b,c)
-#define seed()                 Perl_seed(aTHX)
-#define set_context            Perl_set_context
-#define setdefout(a)           Perl_setdefout(aTHX_ a)
-#define share_hek(a,b,c)       Perl_share_hek(aTHX_ a,b,c)
-#define single_1bit_pos32      Perl_single_1bit_pos32
-#define sortsv(a,b,c)          Perl_sortsv(aTHX_ a,b,c)
-#define sortsv_flags(a,b,c,d)  Perl_sortsv_flags(aTHX_ a,b,c,d)
-#define stack_grow(a,b,c)      Perl_stack_grow(aTHX_ a,b,c)
-#define start_subparse(a,b)    Perl_start_subparse(aTHX_ a,b)
-#define str_to_version(a)      Perl_str_to_version(aTHX_ a)
-#define sv_2bool_flags(a,b)    Perl_sv_2bool_flags(aTHX_ a,b)
-#define sv_2cv(a,b,c,d)                Perl_sv_2cv(aTHX_ a,b,c,d)
-#define sv_2io(a)              Perl_sv_2io(aTHX_ a)
-#define sv_2iv_flags(a,b)      Perl_sv_2iv_flags(aTHX_ a,b)
-#define sv_2mortal(a)          Perl_sv_2mortal(aTHX_ a)
-#define sv_2nv_flags(a,b)      Perl_sv_2nv_flags(aTHX_ a,b)
-#define sv_2pv_flags(a,b,c)    Perl_sv_2pv_flags(aTHX_ a,b,c)
-#define sv_2pvbyte_flags(a,b,c)        Perl_sv_2pvbyte_flags(aTHX_ a,b,c)
-#define sv_2pvutf8_flags(a,b,c)        Perl_sv_2pvutf8_flags(aTHX_ a,b,c)
-#define sv_2uv_flags(a,b)      Perl_sv_2uv_flags(aTHX_ a,b)
-#define sv_backoff             Perl_sv_backoff
-#define sv_bless(a,b)          Perl_sv_bless(aTHX_ a,b)
-#define sv_cat_decode(a,b,c,d,e,f)     Perl_sv_cat_decode(aTHX_ a,b,c,d,e,f)
-#define sv_catpv(a,b)          Perl_sv_catpv(aTHX_ a,b)
-#define sv_catpv_flags(a,b,c)  Perl_sv_catpv_flags(aTHX_ a,b,c)
-#define sv_catpv_mg(a,b)       Perl_sv_catpv_mg(aTHX_ a,b)
-#ifndef MULTIPLICITY
-#define sv_catpvf              Perl_sv_catpvf
-#define sv_catpvf_mg           Perl_sv_catpvf_mg
-#endif
-#define sv_catpvn_flags(a,b,c,d)       Perl_sv_catpvn_flags(aTHX_ a,b,c,d)
-#define sv_catsv_flags(a,b,c)  Perl_sv_catsv_flags(aTHX_ a,b,c)
-#define sv_chop(a,b)           Perl_sv_chop(aTHX_ a,b)
-#define sv_clear(a)            Perl_sv_clear(aTHX_ a)
-#define sv_cmp_flags(a,b,c)    Perl_sv_cmp_flags(aTHX_ a,b,c)
-#define sv_cmp_locale_flags(a,b,c)     Perl_sv_cmp_locale_flags(aTHX_ a,b,c)
-#define sv_copypv_flags(a,b,c) Perl_sv_copypv_flags(aTHX_ a,b,c)
-#define sv_dec(a)              Perl_sv_dec(aTHX_ a)
-#define sv_dec_nomg(a)         Perl_sv_dec_nomg(aTHX_ a)
-#define sv_derived_from(a,b)   Perl_sv_derived_from(aTHX_ a,b)
-#define sv_derived_from_pv(a,b,c)      Perl_sv_derived_from_pv(aTHX_ a,b,c)
-#define sv_derived_from_pvn(a,b,c,d)   Perl_sv_derived_from_pvn(aTHX_ a,b,c,d)
-#define sv_derived_from_sv(a,b,c)      Perl_sv_derived_from_sv(aTHX_ a,b,c)
-#define sv_destroyable(a)      Perl_sv_destroyable(aTHX_ a)
-#define sv_does(a,b)           Perl_sv_does(aTHX_ a,b)
-#define sv_does_pv(a,b,c)      Perl_sv_does_pv(aTHX_ a,b,c)
-#define sv_does_pvn(a,b,c,d)   Perl_sv_does_pvn(aTHX_ a,b,c,d)
-#define sv_does_sv(a,b,c)      Perl_sv_does_sv(aTHX_ a,b,c)
-#define sv_dump(a)             Perl_sv_dump(aTHX_ a)
-#define sv_eq_flags(a,b,c)     Perl_sv_eq_flags(aTHX_ a,b,c)
-#define sv_force_normal_flags(a,b)     Perl_sv_force_normal_flags(aTHX_ a,b)
-#define sv_free(a)             Perl_sv_free(aTHX_ a)
-#define sv_get_backrefs                Perl_sv_get_backrefs
-#define sv_gets(a,b,c)         Perl_sv_gets(aTHX_ a,b,c)
-#define sv_grow(a,b)           Perl_sv_grow(aTHX_ a,b)
-#define sv_grow_fresh(a,b)     Perl_sv_grow_fresh(aTHX_ a,b)
-#define sv_inc(a)              Perl_sv_inc(aTHX_ a)
-#define sv_inc_nomg(a)         Perl_sv_inc_nomg(aTHX_ a)
-#define sv_insert_flags(a,b,c,d,e,f)   Perl_sv_insert_flags(aTHX_ a,b,c,d,e,f)
-#define sv_isa(a,b)            Perl_sv_isa(aTHX_ a,b)
-#define sv_isa_sv(a,b)         Perl_sv_isa_sv(aTHX_ a,b)
-#define sv_isobject(a)         Perl_sv_isobject(aTHX_ a)
-#ifndef NO_MATHOMS
-#define sv_iv(a)               Perl_sv_iv(aTHX_ a)
-#endif
-#define sv_len(a)              Perl_sv_len(aTHX_ a)
-#define sv_len_utf8(a)         Perl_sv_len_utf8(aTHX_ a)
-#define sv_len_utf8_nomg(a)    Perl_sv_len_utf8_nomg(aTHX_ a)
-#define sv_magic(a,b,c,d,e)    Perl_sv_magic(aTHX_ a,b,c,d,e)
-#define sv_magicext(a,b,c,d,e,f)       Perl_sv_magicext(aTHX_ a,b,c,d,e,f)
-#define sv_mortalcopy_flags(a,b)       Perl_sv_mortalcopy_flags(aTHX_ a,b)
-#define sv_newmortal()         Perl_sv_newmortal(aTHX)
-#define sv_newref(a)           Perl_sv_newref(aTHX_ a)
-#ifndef NO_MATHOMS
-#define sv_nolocking(a)                Perl_sv_nolocking(aTHX_ a)
-#endif
-#define sv_nosharing(a)                Perl_sv_nosharing(aTHX_ a)
-#ifndef NO_MATHOMS
-#define sv_nounlocking(a)      Perl_sv_nounlocking(aTHX_ a)
-#endif
-#define sv_numeq_flags(a,b,c)  Perl_sv_numeq_flags(aTHX_ a,b,c)
-#ifndef NO_MATHOMS
-#define sv_nv(a)               Perl_sv_nv(aTHX_ a)
-#endif
-#define sv_peek(a)             Perl_sv_peek(aTHX_ a)
-#define sv_pos_b2u(a,b)                Perl_sv_pos_b2u(aTHX_ a,b)
-#define sv_pos_b2u_flags(a,b,c)        Perl_sv_pos_b2u_flags(aTHX_ a,b,c)
-#define sv_pos_u2b(a,b,c)      Perl_sv_pos_u2b(aTHX_ a,b,c)
-#define sv_pos_u2b_flags(a,b,c,d)      Perl_sv_pos_u2b_flags(aTHX_ a,b,c,d)
-#ifndef NO_MATHOMS
-#define sv_pvbyten(a,b)                Perl_sv_pvbyten(aTHX_ a,b)
-#endif
-#define sv_pvbyten_force(a,b)  Perl_sv_pvbyten_force(aTHX_ a,b)
-#ifndef NO_MATHOMS
-#define sv_pvn(a,b)            Perl_sv_pvn(aTHX_ a,b)
-#endif
-#define sv_pvn_force_flags(a,b,c)      Perl_sv_pvn_force_flags(aTHX_ a,b,c)
-#ifndef NO_MATHOMS
-#define sv_pvn_nomg(a,b)       Perl_sv_pvn_nomg(aTHX_ a,b)
-#endif
-#ifndef NO_MATHOMS
-#define sv_pvutf8n(a,b)                Perl_sv_pvutf8n(aTHX_ a,b)
-#endif
-#define sv_pvutf8n_force(a,b)  Perl_sv_pvutf8n_force(aTHX_ a,b)
-#define sv_recode_to_utf8(a,b) Perl_sv_recode_to_utf8(aTHX_ a,b)
-#define sv_ref(a,b,c)          Perl_sv_ref(aTHX_ a,b,c)
-#define sv_reftype(a,b)                Perl_sv_reftype(aTHX_ a,b)
-#define sv_replace(a,b)                Perl_sv_replace(aTHX_ a,b)
-#define sv_report_used()       Perl_sv_report_used(aTHX)
-#define sv_reset(a,b)          Perl_sv_reset(aTHX_ a,b)
-#define sv_rvunweaken(a)       Perl_sv_rvunweaken(aTHX_ a)
-#define sv_rvweaken(a)         Perl_sv_rvweaken(aTHX_ a)
-#define sv_set_undef(a)                Perl_sv_set_undef(aTHX_ a)
-#define sv_setiv(a,b)          Perl_sv_setiv(aTHX_ a,b)
-#define sv_setiv_mg(a,b)       Perl_sv_setiv_mg(aTHX_ a,b)
-#define sv_setnv(a,b)          Perl_sv_setnv(aTHX_ a,b)
-#define sv_setnv_mg(a,b)       Perl_sv_setnv_mg(aTHX_ a,b)
-#define sv_setpv(a,b)          Perl_sv_setpv(aTHX_ a,b)
-#define sv_setpv_bufsize(a,b,c)        Perl_sv_setpv_bufsize(aTHX_ a,b,c)
-#define sv_setpv_mg(a,b)       Perl_sv_setpv_mg(aTHX_ a,b)
-#ifndef MULTIPLICITY
-#define sv_setpvf              Perl_sv_setpvf
-#define sv_setpvf_mg           Perl_sv_setpvf_mg
-#endif
-#ifndef NO_MATHOMS
-#define sv_setpviv(a,b)                Perl_sv_setpviv(aTHX_ a,b)
-#endif
-#ifndef NO_MATHOMS
-#define sv_setpviv_mg(a,b)     Perl_sv_setpviv_mg(aTHX_ a,b)
-#endif
-#define sv_setpvn(a,b,c)       Perl_sv_setpvn(aTHX_ a,b,c)
-#define sv_setpvn_fresh(a,b,c) Perl_sv_setpvn_fresh(aTHX_ a,b,c)
-#define sv_setpvn_mg(a,b,c)    Perl_sv_setpvn_mg(aTHX_ a,b,c)
-#define sv_setref_iv(a,b,c)    Perl_sv_setref_iv(aTHX_ a,b,c)
-#define sv_setref_nv(a,b,c)    Perl_sv_setref_nv(aTHX_ a,b,c)
-#define sv_setref_pv(a,b,c)    Perl_sv_setref_pv(aTHX_ a,b,c)
-#define sv_setref_pvn(a,b,c,d) Perl_sv_setref_pvn(aTHX_ a,b,c,d)
-#define sv_setref_uv(a,b,c)    Perl_sv_setref_uv(aTHX_ a,b,c)
-#define sv_setrv_inc(a,b)      Perl_sv_setrv_inc(aTHX_ a,b)
-#define sv_setrv_inc_mg(a,b)   Perl_sv_setrv_inc_mg(aTHX_ a,b)
-#define sv_setrv_noinc(a,b)    Perl_sv_setrv_noinc(aTHX_ a,b)
-#define sv_setrv_noinc_mg(a,b) Perl_sv_setrv_noinc_mg(aTHX_ a,b)
-#define sv_setsv_flags(a,b,c)  Perl_sv_setsv_flags(aTHX_ a,b,c)
-#define sv_setsv_mg(a,b)       Perl_sv_setsv_mg(aTHX_ a,b)
-#define sv_setuv(a,b)          Perl_sv_setuv(aTHX_ a,b)
-#define sv_setuv_mg(a,b)       Perl_sv_setuv_mg(aTHX_ a,b)
-#define sv_streq_flags(a,b,c)  Perl_sv_streq_flags(aTHX_ a,b,c)
-#define sv_string_from_errnum(a,b)     Perl_sv_string_from_errnum(aTHX_ a,b)
-#define sv_tainted(a)          Perl_sv_tainted(aTHX_ a)
-#define sv_true(a)             Perl_sv_true(aTHX_ a)
-#define sv_uni_display(a,b,c,d)        Perl_sv_uni_display(aTHX_ a,b,c,d)
-#define sv_unmagic(a,b)                Perl_sv_unmagic(aTHX_ a,b)
-#define sv_unmagicext(a,b,c)   Perl_sv_unmagicext(aTHX_ a,b,c)
-#define sv_unref_flags(a,b)    Perl_sv_unref_flags(aTHX_ a,b)
-#define sv_untaint(a)          Perl_sv_untaint(aTHX_ a)
-#define sv_upgrade(a,b)                Perl_sv_upgrade(aTHX_ a,b)
-#define sv_usepvn_flags(a,b,c,d)       Perl_sv_usepvn_flags(aTHX_ a,b,c,d)
-#define sv_utf8_decode(a)      Perl_sv_utf8_decode(aTHX_ a)
-#define sv_utf8_downgrade_flags(a,b,c) Perl_sv_utf8_downgrade_flags(aTHX_ a,b,c)
-#define sv_utf8_encode(a)      Perl_sv_utf8_encode(aTHX_ a)
-#define sv_utf8_upgrade_flags_grow(a,b,c)      Perl_sv_utf8_upgrade_flags_grow(aTHX_ a,b,c)
-#ifndef NO_MATHOMS
-#define sv_uv(a)               Perl_sv_uv(aTHX_ a)
-#endif
-#define sv_vcatpvf(a,b,c)      Perl_sv_vcatpvf(aTHX_ a,b,c)
-#define sv_vcatpvf_mg(a,b,c)   Perl_sv_vcatpvf_mg(aTHX_ a,b,c)
-#define sv_vcatpvfn(a,b,c,d,e,f,g)     Perl_sv_vcatpvfn(aTHX_ a,b,c,d,e,f,g)
-#define sv_vcatpvfn_flags(a,b,c,d,e,f,g,h)     Perl_sv_vcatpvfn_flags(aTHX_ a,b,c,d,e,f,g,h)
-#define sv_vsetpvf(a,b,c)      Perl_sv_vsetpvf(aTHX_ a,b,c)
-#define sv_vsetpvf_mg(a,b,c)   Perl_sv_vsetpvf_mg(aTHX_ a,b,c)
-#define sv_vsetpvfn(a,b,c,d,e,f,g)     Perl_sv_vsetpvfn(aTHX_ a,b,c,d,e,f,g)
-#define switch_to_global_locale        Perl_switch_to_global_locale
-#define sync_locale            Perl_sync_locale
-#define taint_env()            Perl_taint_env(aTHX)
-#define taint_proper(a,b)      Perl_taint_proper(aTHX_ a,b)
-#define thread_locale_init     Perl_thread_locale_init
-#define thread_locale_term     Perl_thread_locale_term
-#define to_uni_lower(a,b,c)    Perl_to_uni_lower(aTHX_ a,b,c)
-#define to_uni_title(a,b,c)    Perl_to_uni_title(aTHX_ a,b,c)
-#define to_uni_upper(a,b,c)    Perl_to_uni_upper(aTHX_ a,b,c)
-#ifndef NO_MATHOMS
-#define unpack_str(a,b,c,d,e,f,g,h)    Perl_unpack_str(aTHX_ a,b,c,d,e,f,g,h)
-#endif
-#define unpackstring(a,b,c,d,e)        Perl_unpackstring(aTHX_ a,b,c,d,e)
-#define unsharepvn(a,b,c)      Perl_unsharepvn(aTHX_ a,b,c)
-#define upg_version(a,b)       Perl_upg_version(aTHX_ a,b)
-#define utf8_distance(a,b)     Perl_utf8_distance(aTHX_ a,b)
-#define utf8_hop               Perl_utf8_hop
-#define utf8_hop_back          Perl_utf8_hop_back
-#define utf8_hop_forward       Perl_utf8_hop_forward
-#define utf8_hop_safe          Perl_utf8_hop_safe
-#define utf8_length(a,b)       Perl_utf8_length(aTHX_ a,b)
-#define utf8_to_bytes(a,b)     Perl_utf8_to_bytes(aTHX_ a,b)
-#ifndef NO_MATHOMS
-#define utf8_to_uvchr(a,b)     Perl_utf8_to_uvchr(aTHX_ a,b)
-#endif
-#define utf8_to_uvchr_buf_helper(a,b,c)        Perl_utf8_to_uvchr_buf_helper(aTHX_ a,b,c)
-#ifndef NO_MATHOMS
-#define utf8_to_uvuni(a,b)     Perl_utf8_to_uvuni(aTHX_ a,b)
-#endif
-#define utf8_to_uvuni_buf(a,b,c)       Perl_utf8_to_uvuni_buf(aTHX_ a,b,c)
-#define utf8n_to_uvchr_msgs    Perl_utf8n_to_uvchr_msgs
-#ifndef NO_MATHOMS
-#define utf8n_to_uvuni(a,b,c,d)        Perl_utf8n_to_uvuni(aTHX_ a,b,c,d)
-#endif
-#define uvoffuni_to_utf8_flags_msgs(a,b,c,d)   Perl_uvoffuni_to_utf8_flags_msgs(aTHX_ a,b,c,d)
-#define uvuni_to_utf8(a,b)     Perl_uvuni_to_utf8(aTHX_ a,b)
-#ifndef NO_MATHOMS
-#define uvuni_to_utf8_flags(a,b,c)     Perl_uvuni_to_utf8_flags(aTHX_ a,b,c)
-#endif
-#define valid_utf8_to_uvchr    Perl_valid_utf8_to_uvchr
-#ifndef NO_MATHOMS
-#define valid_utf8_to_uvuni(a,b)       Perl_valid_utf8_to_uvuni(aTHX_ a,b)
-#endif
-#define vcmp(a,b)              Perl_vcmp(aTHX_ a,b)
-#define vcroak(a,b)            Perl_vcroak(aTHX_ a,b)
-#define vdeb(a,b)              Perl_vdeb(aTHX_ a,b)
-#define vform(a,b)             Perl_vform(aTHX_ a,b)
-#define vload_module(a,b,c,d)  Perl_vload_module(aTHX_ a,b,c,d)
-#define vmess(a,b)             Perl_vmess(aTHX_ a,b)
-#define vnewSVpvf(a,b)         Perl_vnewSVpvf(aTHX_ a,b)
-#define vnormal(a)             Perl_vnormal(aTHX_ a)
-#define vnumify(a)             Perl_vnumify(aTHX_ a)
-#define vstringify(a)          Perl_vstringify(aTHX_ a)
-#define vverify(a)             Perl_vverify(aTHX_ a)
-#define vwarn(a,b)             Perl_vwarn(aTHX_ a,b)
-#define vwarner(a,b,c)         Perl_vwarner(aTHX_ a,b,c)
-#ifndef MULTIPLICITY
-#define warn                   Perl_warn
-#endif
-#define warn_sv(a)             Perl_warn_sv(aTHX_ a)
-#ifndef MULTIPLICITY
-#define warner                 Perl_warner
-#endif
-#define whichsig_pv(a)         Perl_whichsig_pv(aTHX_ a)
-#define whichsig_pvn(a,b)      Perl_whichsig_pvn(aTHX_ a,b)
-#define whichsig_sv(a)         Perl_whichsig_sv(aTHX_ a)
-#define wrap_keyword_plugin(a,b)       Perl_wrap_keyword_plugin(aTHX_ a,b)
-#define wrap_op_checker(a,b,c) Perl_wrap_op_checker(aTHX_ a,b,c)
-#if !(defined(PERL_USE_3ARG_SIGHANDLER))
-#define csighandler            Perl_csighandler
-#endif
-#if !defined(EBCDIC)
-#define variant_byte_number    Perl_variant_byte_number
-#endif
-#if !defined(HAS_STRLCAT)
-#define my_strlcat             Perl_my_strlcat
-#endif
-#if !defined(HAS_STRLCPY)
-#define my_strlcpy             Perl_my_strlcpy
-#endif
-#if !defined(HAS_STRNLEN)
-#define my_strnlen             Perl_my_strnlen
-#endif
-#if !defined(HAS_TRUNCATE) && !defined(HAS_CHSIZE) && defined(F_FREESP)
-#define my_chsize(a,b)         Perl_my_chsize(aTHX_ a,b)
-#endif
-#if !defined(PERL_IMPLICIT_SYS)
-#define my_pclose(a)           Perl_my_pclose(aTHX_ a)
-#define my_popen(a,b)          Perl_my_popen(aTHX_ a,b)
-#endif
-#if !defined(PERL_NO_INLINE_FUNCTIONS)
-#define cx_popblock(a)         Perl_cx_popblock(aTHX_ a)
-#define cx_popeval(a)          Perl_cx_popeval(aTHX_ a)
-#define cx_popformat(a)                Perl_cx_popformat(aTHX_ a)
-#define cx_popgiven(a)         Perl_cx_popgiven(aTHX_ a)
-#define cx_poploop(a)          Perl_cx_poploop(aTHX_ a)
-#define cx_popsub(a)           Perl_cx_popsub(aTHX_ a)
-#define cx_popsub_args(a)      Perl_cx_popsub_args(aTHX_ a)
-#define cx_popsub_common(a)    Perl_cx_popsub_common(aTHX_ a)
-#define cx_popwhen(a)          Perl_cx_popwhen(aTHX_ a)
-#define cx_pushblock(a,b,c,d)  Perl_cx_pushblock(aTHX_ a,b,c,d)
-#define cx_pusheval(a,b,c)     Perl_cx_pusheval(aTHX_ a,b,c)
-#define cx_pushformat(a,b,c,d) Perl_cx_pushformat(aTHX_ a,b,c,d)
-#define cx_pushgiven(a,b)      Perl_cx_pushgiven(aTHX_ a,b)
-#define cx_pushloop_for(a,b,c) Perl_cx_pushloop_for(aTHX_ a,b,c)
-#define cx_pushloop_plain(a)   Perl_cx_pushloop_plain(aTHX_ a)
-#define cx_pushsub(a,b,c,d)    Perl_cx_pushsub(aTHX_ a,b,c,d)
-#define cx_pushtry(a,b)                Perl_cx_pushtry(aTHX_ a,b)
-#define cx_pushwhen(a)         Perl_cx_pushwhen(aTHX_ a)
-#define cx_topblock(a)         Perl_cx_topblock(aTHX_ a)
-#define gimme_V()              Perl_gimme_V(aTHX)
-#endif
-#if defined(DEBUGGING)
-#define pad_setsv(a,b)         Perl_pad_setsv(aTHX_ a,b)
-#define pad_sv(a)              Perl_pad_sv(aTHX_ a)
-#endif
-#if defined(HAVE_INTERP_INTERN)
-#define sys_intern_clear()     Perl_sys_intern_clear(aTHX)
-#define sys_intern_init()      Perl_sys_intern_init(aTHX)
-#  if defined(USE_ITHREADS)
-#define sys_intern_dup(a,b)    Perl_sys_intern_dup(aTHX_ a,b)
-#  endif
-#endif
-#if defined(MULTIPLICITY)
-#define croak_nocontext                Perl_croak_nocontext
-#define deb_nocontext          Perl_deb_nocontext
-#define die_nocontext          Perl_die_nocontext
-#define form_nocontext         Perl_form_nocontext
-#ifndef NO_MATHOMS
-#define fprintf_nocontext      Perl_fprintf_nocontext
-#endif
-#define load_module_nocontext  Perl_load_module_nocontext
-#define mess_nocontext         Perl_mess_nocontext
-#define newSVpvf_nocontext     Perl_newSVpvf_nocontext
-#ifndef NO_MATHOMS
-#define printf_nocontext       Perl_printf_nocontext
-#endif
-#define sv_catpvf_mg_nocontext Perl_sv_catpvf_mg_nocontext
-#define sv_catpvf_nocontext    Perl_sv_catpvf_nocontext
-#define sv_setpvf_mg_nocontext Perl_sv_setpvf_mg_nocontext
-#define sv_setpvf_nocontext    Perl_sv_setpvf_nocontext
-#define warn_nocontext         Perl_warn_nocontext
-#define warner_nocontext       Perl_warner_nocontext
-#endif
-#if defined(MYMALLOC)
-#define dump_mstats(a)         Perl_dump_mstats(aTHX_ a)
-#define get_mstats(a,b,c)      Perl_get_mstats(aTHX_ a,b,c)
-#endif
-#if defined(PERL_IN_SV_C)
-#define more_sv()              Perl_more_sv(aTHX)
-#endif
-#if defined(PERL_MEM_LOG)
-#define mem_log_alloc          Perl_mem_log_alloc
-#define mem_log_del_sv         Perl_mem_log_del_sv
-#define mem_log_free           Perl_mem_log_free
-#define mem_log_new_sv         Perl_mem_log_new_sv
-#define mem_log_realloc                Perl_mem_log_realloc
-#endif
-#if defined(PERL_USE_3ARG_SIGHANDLER)
-#define csighandler            Perl_csighandler
-#endif
-#if defined(U64TYPE)   /* HAS_QUAD undefined outside of core */
-#define lsbit_pos64            Perl_lsbit_pos64
-#define msbit_pos64            Perl_msbit_pos64
-#define single_1bit_pos64      Perl_single_1bit_pos64
-#endif
-#if defined(UNLINK_ALL_VERSIONS)
-#define unlnk(a)               Perl_unlnk(aTHX_ a)
-#endif
-#if defined(USE_C_BACKTRACE)
-#define dump_c_backtrace(a,b,c)        Perl_dump_c_backtrace(aTHX_ a,b,c)
-#define get_c_backtrace_dump(a,b)      Perl_get_c_backtrace_dump(aTHX_ a,b)
-#endif
-#if defined(USE_ITHREADS)
-#define alloccopstash(a)       Perl_alloccopstash(aTHX_ a)
-#define any_dup(a,b)           Perl_any_dup(aTHX_ a,b)
-#define cop_file_avn(a)                Perl_cop_file_avn(aTHX_ a)
-#define cx_dup(a,b,c,d)                Perl_cx_dup(aTHX_ a,b,c,d)
-#define dirp_dup(a,b)          Perl_dirp_dup(aTHX_ a,b)
-#define fp_dup(a,b,c)          Perl_fp_dup(aTHX_ a,b,c)
-#define gp_dup(a,b)            Perl_gp_dup(aTHX_ a,b)
-#define he_dup(a,b,c)          Perl_he_dup(aTHX_ a,b,c)
-#define hek_dup(a,b)           Perl_hek_dup(aTHX_ a,b)
-#define mg_dup(a,b)            Perl_mg_dup(aTHX_ a,b)
-#define newPADOP(a,b,c)                Perl_newPADOP(aTHX_ a,b,c)
-#define parser_dup(a,b)                Perl_parser_dup(aTHX_ a,b)
-#define re_dup_guts(a,b,c)     Perl_re_dup_guts(aTHX_ a,b,c)
-#define regdupe_internal(a,b)  Perl_regdupe_internal(aTHX_ a,b)
-#define rvpv_dup(a,b,c)                Perl_rvpv_dup(aTHX_ a,b,c)
-#define si_dup(a,b)            Perl_si_dup(aTHX_ a,b)
-#define ss_dup(a,b)            Perl_ss_dup(aTHX_ a,b)
-#define sv_dup(a,b)            Perl_sv_dup(aTHX_ a,b)
-#define sv_dup_inc(a,b)                Perl_sv_dup_inc(aTHX_ a,b)
-#endif
-#if defined(USE_LOCALE)                    && (   defined(PERL_IN_LOCALE_C)            || defined(PERL_IN_MG_C)                || defined (PERL_EXT_POSIX)             || defined (PERL_EXT_LANGINFO))
-#define _is_cur_LC_category_utf8(a)    Perl__is_cur_LC_category_utf8(aTHX_ a)
-#endif
-#if defined(USE_LOCALE_COLLATE)
-#define sv_collxfrm_flags(a,b,c)       Perl_sv_collxfrm_flags(aTHX_ a,b,c)
-#endif
-#if defined(USE_PERLIO)
-#define PerlIO_clearerr(a)     Perl_PerlIO_clearerr(aTHX_ a)
-#define PerlIO_close(a)                Perl_PerlIO_close(aTHX_ a)
-#define PerlIO_eof(a)          Perl_PerlIO_eof(aTHX_ a)
-#define PerlIO_error(a)                Perl_PerlIO_error(aTHX_ a)
-#define PerlIO_fileno(a)       Perl_PerlIO_fileno(aTHX_ a)
-#define PerlIO_fill(a)         Perl_PerlIO_fill(aTHX_ a)
-#define PerlIO_flush(a)                Perl_PerlIO_flush(aTHX_ a)
-#define PerlIO_get_base(a)     Perl_PerlIO_get_base(aTHX_ a)
-#define PerlIO_get_bufsiz(a)   Perl_PerlIO_get_bufsiz(aTHX_ a)
-#define PerlIO_get_cnt(a)      Perl_PerlIO_get_cnt(aTHX_ a)
-#define PerlIO_get_ptr(a)      Perl_PerlIO_get_ptr(aTHX_ a)
-#define PerlIO_read(a,b,c)     Perl_PerlIO_read(aTHX_ a,b,c)
-#define PerlIO_seek(a,b,c)     Perl_PerlIO_seek(aTHX_ a,b,c)
-#define PerlIO_set_cnt(a,b)    Perl_PerlIO_set_cnt(aTHX_ a,b)
-#define PerlIO_set_ptrcnt(a,b,c)       Perl_PerlIO_set_ptrcnt(aTHX_ a,b,c)
-#define PerlIO_setlinebuf(a)   Perl_PerlIO_setlinebuf(aTHX_ a)
-#define PerlIO_stderr()                Perl_PerlIO_stderr(aTHX)
-#define PerlIO_stdin()         Perl_PerlIO_stdin(aTHX)
-#define PerlIO_stdout()                Perl_PerlIO_stdout(aTHX)
-#define PerlIO_tell(a)         Perl_PerlIO_tell(aTHX_ a)
-#define PerlIO_unread(a,b,c)   Perl_PerlIO_unread(aTHX_ a,b,c)
-#define PerlIO_write(a,b,c)    Perl_PerlIO_write(aTHX_ a,b,c)
-#endif
-#if defined(WIN32) || defined(VMS)
-#define do_aspawn(a,b,c)       Perl_do_aspawn(aTHX_ a,b,c)
-#define do_spawn(a)            Perl_do_spawn(aTHX_ a)
-#define do_spawn_nowait(a)     Perl_do_spawn_nowait(aTHX_ a)
-#endif
-#if defined(PERL_CORE) || defined(PERL_EXT)
-#define _byte_dump_string(a,b,c)       Perl__byte_dump_string(aTHX_ a,b,c)
-#define _inverse_folds(a,b,c)  Perl__inverse_folds(aTHX_ a,b,c)
-#define append_utf8_from_native_byte   Perl_append_utf8_from_native_byte
-#define av_reify(a)            Perl_av_reify(aTHX_ a)
-#define cntrl_to_mnemonic      Perl_cntrl_to_mnemonic
-#define current_re_engine()    Perl_current_re_engine(aTHX)
-#define cv_ckproto_len_flags(a,b,c,d,e)        Perl_cv_ckproto_len_flags(aTHX_ a,b,c,d,e)
-#define delimcpy_no_escape     Perl_delimcpy_no_escape
-#define do_uniprop_match       Perl_do_uniprop_match
-#define get_and_check_backslash_N_name(a,b,c,d)        Perl_get_and_check_backslash_N_name(aTHX_ a,b,c,d)
-#define get_deprecated_property_msg    Perl_get_deprecated_property_msg
-#define get_prop_definition(a) Perl_get_prop_definition(aTHX_ a)
-#define get_prop_values                Perl_get_prop_values
-#define load_charnames(a,b,c,d)        Perl_load_charnames(aTHX_ a,b,c,d)
-#define mg_find_mglob(a)       Perl_mg_find_mglob(aTHX_ a)
-#define multiconcat_stringify(a)       Perl_multiconcat_stringify(aTHX_ a)
-#define multideref_stringify(a,b)      Perl_multideref_stringify(aTHX_ a,b)
-#define op_clear(a)            Perl_op_clear(aTHX_ a)
-#define qerror(a)              Perl_qerror(aTHX_ a)
-#define reg_named_buff(a,b,c,d)        Perl_reg_named_buff(aTHX_ a,b,c,d)
-#define reg_named_buff_iter(a,b,c)     Perl_reg_named_buff_iter(aTHX_ a,b,c)
-#define reg_numbered_buff_fetch(a,b,c) Perl_reg_numbered_buff_fetch(aTHX_ a,b,c)
-#define reg_numbered_buff_length(a,b,c)        Perl_reg_numbered_buff_length(aTHX_ a,b,c)
-#define reg_numbered_buff_store(a,b,c) Perl_reg_numbered_buff_store(aTHX_ a,b,c)
-#define reg_qr_package(a)      Perl_reg_qr_package(aTHX_ a)
-#define reg_temp_copy(a,b)     Perl_reg_temp_copy(aTHX_ a,b)
-#define report_uninit(a)       Perl_report_uninit(aTHX_ a)
-#define scan_str(a,b,c,d,e)    Perl_scan_str(aTHX_ a,b,c,d,e)
-#define scan_word(a,b,c,d,e)   Perl_scan_word(aTHX_ a,b,c,d,e)
-#define skipspace_flags(a,b)   Perl_skipspace_flags(aTHX_ a,b)
-#define sv_magicext_mglob(a)   Perl_sv_magicext_mglob(aTHX_ a)
-#define sv_only_taint_gmagic   Perl_sv_only_taint_gmagic
-#define utf16_to_utf8_base(a,b,c,d,e,f)        Perl_utf16_to_utf8_base(aTHX_ a,b,c,d,e,f)
-#define utf8_to_utf16_base(a,b,c,d,e,f)        Perl_utf8_to_utf16_base(aTHX_ a,b,c,d,e,f)
-#define validate_proto(a,b,c,d)        Perl_validate_proto(aTHX_ a,b,c,d)
-#define vivify_defelem(a)      Perl_vivify_defelem(aTHX_ a)
-#define yylex()                        Perl_yylex(aTHX)
-#  if ! defined(HAS_MEMRCHR) && (defined(PERL_CORE) || defined(PERL_EXT))
-#define my_memrchr             S_my_memrchr
-#  endif
-#  if !(!defined(PERL_EXT_RE_BUILD))
-#    if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C)
-#define get_re_gclass_nonbitmap_data(a,b,c,d,e,f)      Perl_get_re_gclass_nonbitmap_data(aTHX_ a,b,c,d,e,f)
-#    endif
-#  endif
-#  if !defined(PERL_EXT_RE_BUILD)
-#    if defined(PERL_IN_REGCOMP_C)
-#define _append_range_to_invlist(a,b,c)        S__append_range_to_invlist(aTHX_ a,b,c)
-#define _invlist_array_init    S__invlist_array_init
-#define get_invlist_previous_index_addr        S_get_invlist_previous_index_addr
-#define invlist_clear(a)       S_invlist_clear(aTHX_ a)
-#define invlist_max            S_invlist_max
-#define invlist_previous_index S_invlist_previous_index
-#define invlist_replace_list_destroys_src(a,b) S_invlist_replace_list_destroys_src(aTHX_ a,b)
-#define invlist_set_previous_index     S_invlist_set_previous_index
-#define invlist_trim           S_invlist_trim
-#    endif
-#    if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C)
-#define get_regclass_nonbitmap_data(a,b,c,d,e,f)       Perl_get_regclass_nonbitmap_data(aTHX_ a,b,c,d,e,f)
-#    endif
-#  endif
-#  if defined(DEBUGGING)
-#    if defined(PERL_IN_REGCOMP_C)
-#define dump_trie(a,b,c,d)     S_dump_trie(aTHX_ a,b,c,d)
-#define dump_trie_interim_list(a,b,c,d,e)      S_dump_trie_interim_list(aTHX_ a,b,c,d,e)
-#define dump_trie_interim_table(a,b,c,d,e)     S_dump_trie_interim_table(aTHX_ a,b,c,d,e)
-#define dumpuntil(a,b,c,d,e,f,g,h)     S_dumpuntil(aTHX_ a,b,c,d,e,f,g,h)
-#define put_charclass_bitmap_innards(a,b,c,d,e,f,g)    S_put_charclass_bitmap_innards(aTHX_ a,b,c,d,e,f,g)
-#define put_charclass_bitmap_innards_common(a,b,c,d,e,f)       S_put_charclass_bitmap_innards_common(aTHX_ a,b,c,d,e,f)
-#define put_charclass_bitmap_innards_invlist(a,b)      S_put_charclass_bitmap_innards_invlist(aTHX_ a,b)
-#define put_code_point(a,b)    S_put_code_point(aTHX_ a,b)
-#define put_range(a,b,c,d)     S_put_range(aTHX_ a,b,c,d)
-#ifndef MULTIPLICITY
-#define re_indentf             Perl_re_indentf
-#endif
-#define regdump_extflags(a,b)  S_regdump_extflags(aTHX_ a,b)
-#define regdump_intflags(a,b)  S_regdump_intflags(aTHX_ a,b)
-#define regnode_guts_debug(a,b,c)      S_regnode_guts_debug(aTHX_ a,b,c)
-#define regtail_study(a,b,c,d) S_regtail_study(aTHX_ a,b,c,d)
-#    endif
-#    if defined(PERL_IN_REGEXEC_C)
-#define debug_start_match(a,b,c,d,e)   S_debug_start_match(aTHX_ a,b,c,d,e)
-#define dump_exec_pos(a,b,c,d,e,f,g)   S_dump_exec_pos(aTHX_ a,b,c,d,e,f,g)
-#ifndef MULTIPLICITY
-#define re_exec_indentf                Perl_re_exec_indentf
-#endif
-#    endif
-#  endif
-#  if defined(DEBUGGING) && defined(ENABLE_REGEX_SETS_DEBUGGING)
-#    if defined(PERL_IN_REGCOMP_C)
-#define dump_regex_sets_structures(a,b,c,d)    S_dump_regex_sets_structures(aTHX_ a,b,c,d)
-#    endif
-#  endif
-#  if defined(PERL_ANY_COW)
-#define sv_setsv_cow(a,b)      Perl_sv_setsv_cow(aTHX_ a,b)
-#  endif
-#  if defined(PERL_CORE) || defined (PERL_EXT)
-#define is_utf8_non_invariant_string   Perl_is_utf8_non_invariant_string
-#define sv_or_pv_pos_u2b(a,b,c,d)      S_sv_or_pv_pos_u2b(aTHX_ a,b,c,d)
-#  endif
-#  if defined(PERL_CORE) || defined(PERL_EXT)
-#define isSCRIPT_RUN(a,b,c)    Perl_isSCRIPT_RUN(aTHX_ a,b,c)
-#define variant_under_utf8_count       S_variant_under_utf8_count
-#  endif
-#  if defined(PERL_IN_GV_C) || defined(PERL_IN_UNIVERSAL_C)
-#define gv_stashsvpvn_cached(a,b,c,d)  Perl_gv_stashsvpvn_cached(aTHX_ a,b,c,d)
-#  endif
-#  if defined(PERL_IN_REGCOMP_C)
-#define add_above_Latin1_folds(a,b,c)  S_add_above_Latin1_folds(aTHX_ a,b,c)
-#define add_data               S_add_data
-#define add_multi_match(a,b,c) S_add_multi_match(aTHX_ a,b,c)
-#define change_engine_size(a,b)        S_change_engine_size(aTHX_ a,b)
-#define compile_wildcard(a,b,c)        S_compile_wildcard(aTHX_ a,b,c)
-#define compute_EXACTish       S_compute_EXACTish
-#define construct_ahocorasick_from_trie(a,b,c) S_construct_ahocorasick_from_trie(aTHX_ a,b,c)
-#define edit_distance          S_edit_distance
-#define execute_wildcard(a,b,c,d,e,f,g)        S_execute_wildcard(aTHX_ a,b,c,d,e,f,g)
-#define find_first_differing_byte_pos  S_find_first_differing_byte_pos
-#define get_ANYOFM_contents(a) S_get_ANYOFM_contents(aTHX_ a)
-#define get_ANYOF_cp_list_for_ssc(a,b) S_get_ANYOF_cp_list_for_ssc(aTHX_ a,b)
-#define get_quantifier_value(a,b,c)    S_get_quantifier_value(aTHX_ a,b,c)
-#define grok_bslash_N(a,b,c,d,e,f,g)   S_grok_bslash_N(aTHX_ a,b,c,d,e,f,g)
-#define handle_named_backref(a,b,c,d)  S_handle_named_backref(aTHX_ a,b,c,d)
-#define handle_names_wildcard(a,b,c,d) S_handle_names_wildcard(aTHX_ a,b,c,d)
-#define handle_possible_posix(a,b,c,d,e)       S_handle_possible_posix(aTHX_ a,b,c,d,e)
-#define handle_regex_sets(a,b,c,d)     S_handle_regex_sets(aTHX_ a,b,c,d)
-#define handle_user_defined_property(a,b,c,d,e,f,g,h,i,j)      S_handle_user_defined_property(aTHX_ a,b,c,d,e,f,g,h,i,j)
-#define invlist_contents(a,b)  S_invlist_contents(aTHX_ a,b)
-#define invlist_is_iterating   S_invlist_is_iterating
-#define invlist_lowest         S_invlist_lowest
-#define is_ssc_worth_it                S_is_ssc_worth_it
-#define join_exact(a,b,c,d,e,f,g)      S_join_exact(aTHX_ a,b,c,d,e,f,g)
-#define make_exactf_invlist(a,b)       S_make_exactf_invlist(aTHX_ a,b)
-#define make_trie(a,b,c,d,e,f,g,h)     S_make_trie(aTHX_ a,b,c,d,e,f,g,h)
-#define nextchar(a)            S_nextchar(aTHX_ a)
-#define optimize_regclass(a,b,c,d,e,f,g,h,i,j) S_optimize_regclass(aTHX_ a,b,c,d,e,f,g,h,i,j)
-#define output_posix_warnings(a,b)     S_output_posix_warnings(aTHX_ a,b)
-#define parse_lparen_question_flags(a) S_parse_lparen_question_flags(aTHX_ a)
-#define parse_uniprop_string(a,b,c,d,e,f,g,h,i,j)      S_parse_uniprop_string(aTHX_ a,b,c,d,e,f,g,h,i,j)
-#define populate_ANYOF_from_invlist(a,b)       S_populate_ANYOF_from_invlist(aTHX_ a,b)
-#define rck_elide_nothing(a)   S_rck_elide_nothing(aTHX_ a)
-#define reg(a,b,c,d)           S_reg(aTHX_ a,b,c,d)
-#define reg2Lanode(a,b,c,d)    S_reg2Lanode(aTHX_ a,b,c,d)
-#define reg_la_NOTHING(a,b,c)  S_reg_la_NOTHING(aTHX_ a,b,c)
-#define reg_la_OPFAIL(a,b,c)   S_reg_la_OPFAIL(aTHX_ a,b,c)
-#define reg_node(a,b)          S_reg_node(aTHX_ a,b)
-#define reg_scan_name(a,b)     S_reg_scan_name(aTHX_ a,b)
-#define reg_skipcomment                S_reg_skipcomment
-#define reganode(a,b,c)                S_reganode(aTHX_ a,b,c)
-#define regatom(a,b,c)         S_regatom(aTHX_ a,b,c)
-#define regbranch(a,b,c,d)     S_regbranch(aTHX_ a,b,c,d)
-#define regclass(a,b,c,d,e,f,g,h,i)    S_regclass(aTHX_ a,b,c,d,e,f,g,h,i)
-#define regex_set_precedence   S_regex_set_precedence
-#define reginsert(a,b,c,d)     S_reginsert(aTHX_ a,b,c,d)
-#define regnode_guts(a,b)      S_regnode_guts(aTHX_ a,b)
-#define regpiece(a,b,c)                S_regpiece(aTHX_ a,b,c)
-#define regpnode(a,b,c)                S_regpnode(aTHX_ a,b,c)
-#define regtail(a,b,c,d)       S_regtail(aTHX_ a,b,c,d)
-#define scan_commit(a,b,c,d)   S_scan_commit(aTHX_ a,b,c,d)
-#define set_ANYOF_arg(a,b,c,d,e)       S_set_ANYOF_arg(aTHX_ a,b,c,d,e)
-#define set_regex_pv(a,b)      S_set_regex_pv(aTHX_ a,b)
-#define skip_to_be_ignored_text(a,b,c) S_skip_to_be_ignored_text(aTHX_ a,b,c)
-#define ssc_add_range(a,b,c)   S_ssc_add_range(aTHX_ a,b,c)
-#define ssc_and(a,b,c)         S_ssc_and(aTHX_ a,b,c)
-#define ssc_anything(a)                S_ssc_anything(aTHX_ a)
-#define ssc_clear_locale       S_ssc_clear_locale
-#define ssc_cp_and(a,b)                S_ssc_cp_and(aTHX_ a,b)
-#define ssc_finalize(a,b)      S_ssc_finalize(aTHX_ a,b)
-#define ssc_init(a,b)          S_ssc_init(aTHX_ a,b)
-#define ssc_intersection(a,b,c)        S_ssc_intersection(aTHX_ a,b,c)
-#define ssc_is_anything                S_ssc_is_anything
-#define ssc_is_cp_posixl_init  S_ssc_is_cp_posixl_init
-#define ssc_or(a,b,c)          S_ssc_or(aTHX_ a,b,c)
-#define ssc_union(a,b,c)       S_ssc_union(aTHX_ a,b,c)
-#define study_chunk(a,b,c,d,e,f,g,h,i,j,k,l)   S_study_chunk(aTHX_ a,b,c,d,e,f,g,h,i,j,k,l)
-#  endif
-#  if defined(PERL_IN_REGCOMP_C) || defined (PERL_IN_DUMP_C) || defined(PERL_IN_OP_C)
-#define _invlist_dump(a,b,c,d) Perl__invlist_dump(aTHX_ a,b,c,d)
-#  endif
-#  if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_DOOP_C) || defined(PERL_IN_OP_C)
-#define add_cp_to_invlist(a,b) S_add_cp_to_invlist(aTHX_ a,b)
-#define invlist_extend(a,b)    S_invlist_extend(aTHX_ a,b)
-#define invlist_highest                S_invlist_highest
-#define invlist_set_len(a,b,c) S_invlist_set_len(aTHX_ a,b,c)
-#  endif
-#  if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_DOOP_C) || defined(PERL_IN_OP_C) || defined(PERL_IN_UTF8_C)
-#define _add_range_to_invlist(a,b,c)   Perl__add_range_to_invlist(aTHX_ a,b,c)
-#define _invlist_intersection_maybe_complement_2nd(a,b,c,d)    Perl__invlist_intersection_maybe_complement_2nd(aTHX_ a,b,c,d)
-#define _invlist_invert(a)     Perl__invlist_invert(aTHX_ a)
-#define _invlist_union_maybe_complement_2nd(a,b,c,d)   Perl__invlist_union_maybe_complement_2nd(aTHX_ a,b,c,d)
-#define _new_invlist(a)                Perl__new_invlist(aTHX_ a)
-#define _setup_canned_invlist(a,b,c)   Perl__setup_canned_invlist(aTHX_ a,b,c)
-#  endif
-#  if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_DQUOTE_C) || defined(PERL_IN_TOKE_C)
-#define form_alien_digit_msg(a,b,c,d,e,f)      Perl_form_alien_digit_msg(aTHX_ a,b,c,d,e,f)
-#define grok_bslash_c(a,b,c,d) Perl_grok_bslash_c(aTHX_ a,b,c,d)
-#define grok_bslash_o(a,b,c,d,e,f,g,h) Perl_grok_bslash_o(aTHX_ a,b,c,d,e,f,g,h)
-#define grok_bslash_x(a,b,c,d,e,f,g,h) Perl_grok_bslash_x(aTHX_ a,b,c,d,e,f,g,h)
-#  endif
-#  if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_DQUOTE_C) || defined(PERL_IN_TOKE_C) || defined(PERL_IN_UTF8_C)
-#define form_cp_too_large_msg(a,b,c,d) Perl_form_cp_too_large_msg(aTHX_ a,b,c,d)
-#  endif
-#  if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_OP_C)
-#define get_invlist_iter_addr  S_get_invlist_iter_addr
-#define invlist_iterfinish     S_invlist_iterfinish
-#define invlist_iterinit       S_invlist_iterinit
-#define invlist_iternext       S_invlist_iternext
-#  endif
-#  if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_PERL_C) || defined(PERL_IN_UTF8_C)
-#define _invlistEQ(a,b,c)      Perl__invlistEQ(aTHX_ a,b,c)
-#define _new_invlist_C_array(a)        Perl__new_invlist_C_array(aTHX_ a)
-#  endif
-#  if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_PP_C) || defined(PERL_IN_TOKE_C) || defined(PERL_IN_UNIVERSAL_C)
-#define get_regex_charset_name S_get_regex_charset_name
-#  endif
-#  if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C)
-#ifndef MULTIPLICITY
-#define re_printf              Perl_re_printf
-#endif
-#define regprop(a,b,c,d,e)     Perl_regprop(aTHX_ a,b,c,d,e)
-#  endif
-#  if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C)  || defined(PERL_IN_PP_C) || defined(PERL_IN_OP_C)               || defined(PERL_IN_TOKE_C) || defined(PERL_IN_UTF8_C)           || defined(PERL_IN_DOOP_C)
-#define _invlist_contains_cp   S__invlist_contains_cp
-#define _invlist_len           S__invlist_len
-#define _invlist_search                Perl__invlist_search
-#define get_invlist_offset_addr        S_get_invlist_offset_addr
-#define invlist_array          S_invlist_array
-#define is_invlist             S_is_invlist
-#  endif
-#  if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C) || defined(PERL_IN_TOKE_C)
-#define is_grapheme(a,b,c,d)   Perl_is_grapheme(aTHX_ a,b,c,d)
-#  endif
-#  if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C) || defined(PERL_IN_UTF8_C)
-#define _to_fold_latin1                Perl__to_fold_latin1
-#  endif
-#  if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_SV_C)
-#define invlist_clone(a,b)     Perl_invlist_clone(aTHX_ a,b)
-#  endif
-#  if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_TOKE_C)
-#define regcurly               Perl_regcurly
-#  endif
-#  if defined(PERL_IN_REGEXEC_C)
-#define advance_one_LB(a,b,c)  S_advance_one_LB(aTHX_ a,b,c)
-#define advance_one_SB(a,b,c)  S_advance_one_SB(aTHX_ a,b,c)
-#define advance_one_WB(a,b,c,d)        S_advance_one_WB(aTHX_ a,b,c,d)
-#define backup_one_GCB(a,b,c)  S_backup_one_GCB(aTHX_ a,b,c)
-#define backup_one_LB(a,b,c)   S_backup_one_LB(aTHX_ a,b,c)
-#define backup_one_SB(a,b,c)   S_backup_one_SB(aTHX_ a,b,c)
-#define backup_one_WB(a,b,c,d) S_backup_one_WB(aTHX_ a,b,c,d)
-#define find_byclass(a,b,c,d,e)        S_find_byclass(aTHX_ a,b,c,d,e)
-#define find_next_masked       S_find_next_masked
-#define find_span_end          S_find_span_end
-#define find_span_end_mask     S_find_span_end_mask
-#define foldEQ_latin1_s2_folded        S_foldEQ_latin1_s2_folded
-#define isFOO_lc(a,b)          S_isFOO_lc(aTHX_ a,b)
-#define isFOO_utf8_lc(a,b,c)   S_isFOO_utf8_lc(aTHX_ a,b,c)
-#define isGCB(a,b,c,d,e)       S_isGCB(aTHX_ a,b,c,d,e)
-#define isLB(a,b,c,d,e,f)      S_isLB(aTHX_ a,b,c,d,e,f)
-#define isSB(a,b,c,d,e,f)      S_isSB(aTHX_ a,b,c,d,e,f)
-#define isWB(a,b,c,d,e,f,g)    S_isWB(aTHX_ a,b,c,d,e,f,g)
-#define reg_check_named_buff_matched   S_reg_check_named_buff_matched
-#define regcp_restore(a,b,c)   S_regcp_restore(aTHX_ a,b,c _aDEPTH)
-#define regcppop(a,b)          S_regcppop(aTHX_ a,b _aDEPTH)
-#define regcppush(a,b,c)       S_regcppush(aTHX_ a,b,c _aDEPTH)
-#define reghop3                        S_reghop3
-#define reghop4                        S_reghop4
-#define reghopmaybe3           S_reghopmaybe3
-#define reginclass(a,b,c,d,e)  S_reginclass(aTHX_ a,b,c,d,e)
-#define regmatch(a,b,c)                S_regmatch(aTHX_ a,b,c)
-#define regrepeat(a,b,c,d,e,f) S_regrepeat(aTHX_ a,b,c,d,e,f _aDEPTH)
-#define regtry(a,b)            S_regtry(aTHX_ a,b)
-#define to_byte_substr(a)      S_to_byte_substr(aTHX_ a)
-#define to_utf8_substr(a)      S_to_utf8_substr(aTHX_ a)
-#  endif
-#endif
-#ifdef PERL_CORE
-#define PerlLIO_dup2_cloexec(a,b)      Perl_PerlLIO_dup2_cloexec(aTHX_ a,b)
-#define PerlLIO_dup_cloexec(a) Perl_PerlLIO_dup_cloexec(aTHX_ a)
-#define PerlLIO_open3_cloexec(a,b,c)   Perl_PerlLIO_open3_cloexec(aTHX_ a,b,c)
-#define PerlLIO_open_cloexec(a,b)      Perl_PerlLIO_open_cloexec(aTHX_ a,b)
-#define Slab_Alloc(a)          Perl_Slab_Alloc(aTHX_ a)
-#define Slab_Free(a)           Perl_Slab_Free(aTHX_ a)
-#define _warn_problematic_locale       Perl__warn_problematic_locale
-#define abort_execution(a,b)   Perl_abort_execution(aTHX_ a,b)
-#define alloc_LOGOP(a,b,c)     Perl_alloc_LOGOP(aTHX_ a,b,c)
-#define allocmy(a,b,c)         Perl_allocmy(aTHX_ a,b,c)
-#define amagic_is_enabled(a)   Perl_amagic_is_enabled(aTHX_ a)
-#define apply(a,b,c)           Perl_apply(aTHX_ a,b,c)
-#define av_extend_guts(a,b,c,d,e)      Perl_av_extend_guts(aTHX_ a,b,c,d,e)
-#define av_nonelem(a,b)                Perl_av_nonelem(aTHX_ a,b)
-#define bind_match(a,b,c)      Perl_bind_match(aTHX_ a,b,c)
-#define boot_core_PerlIO()     Perl_boot_core_PerlIO(aTHX)
-#define boot_core_UNIVERSAL()  Perl_boot_core_UNIVERSAL(aTHX)
-#define boot_core_builtin()    Perl_boot_core_builtin(aTHX)
-#define boot_core_mro()                Perl_boot_core_mro(aTHX)
-#define cando(a,b,c)           Perl_cando(aTHX_ a,b,c)
-#define check_utf8_print(a,b)  Perl_check_utf8_print(aTHX_ a,b)
-#define ck_anoncode(a)         Perl_ck_anoncode(aTHX_ a)
-#define ck_backtick(a)         Perl_ck_backtick(aTHX_ a)
-#define ck_bitop(a)            Perl_ck_bitop(aTHX_ a)
-#define ck_cmp(a)              Perl_ck_cmp(aTHX_ a)
-#define ck_concat(a)           Perl_ck_concat(aTHX_ a)
-#define ck_defined(a)          Perl_ck_defined(aTHX_ a)
-#define ck_delete(a)           Perl_ck_delete(aTHX_ a)
-#define ck_each(a)             Perl_ck_each(aTHX_ a)
-#define ck_eof(a)              Perl_ck_eof(aTHX_ a)
-#define ck_eval(a)             Perl_ck_eval(aTHX_ a)
-#define ck_exec(a)             Perl_ck_exec(aTHX_ a)
-#define ck_exists(a)           Perl_ck_exists(aTHX_ a)
-#define ck_ftst(a)             Perl_ck_ftst(aTHX_ a)
-#define ck_fun(a)              Perl_ck_fun(aTHX_ a)
-#define ck_glob(a)             Perl_ck_glob(aTHX_ a)
-#define ck_grep(a)             Perl_ck_grep(aTHX_ a)
-#define ck_index(a)            Perl_ck_index(aTHX_ a)
-#define ck_isa(a)              Perl_ck_isa(aTHX_ a)
-#define ck_join(a)             Perl_ck_join(aTHX_ a)
-#define ck_length(a)           Perl_ck_length(aTHX_ a)
-#define ck_lfun(a)             Perl_ck_lfun(aTHX_ a)
-#define ck_listiob(a)          Perl_ck_listiob(aTHX_ a)
-#define ck_match(a)            Perl_ck_match(aTHX_ a)
-#define ck_method(a)           Perl_ck_method(aTHX_ a)
-#define ck_null(a)             Perl_ck_null(aTHX_ a)
-#define ck_open(a)             Perl_ck_open(aTHX_ a)
-#define ck_prototype(a)                Perl_ck_prototype(aTHX_ a)
-#define ck_readline(a)         Perl_ck_readline(aTHX_ a)
-#define ck_refassign(a)                Perl_ck_refassign(aTHX_ a)
-#define ck_repeat(a)           Perl_ck_repeat(aTHX_ a)
-#define ck_require(a)          Perl_ck_require(aTHX_ a)
-#define ck_return(a)           Perl_ck_return(aTHX_ a)
-#define ck_rfun(a)             Perl_ck_rfun(aTHX_ a)
-#define ck_rvconst(a)          Perl_ck_rvconst(aTHX_ a)
-#define ck_sassign(a)          Perl_ck_sassign(aTHX_ a)
-#define ck_select(a)           Perl_ck_select(aTHX_ a)
-#define ck_shift(a)            Perl_ck_shift(aTHX_ a)
-#define ck_smartmatch(a)       Perl_ck_smartmatch(aTHX_ a)
-#define ck_sort(a)             Perl_ck_sort(aTHX_ a)
-#define ck_spair(a)            Perl_ck_spair(aTHX_ a)
-#define ck_split(a)            Perl_ck_split(aTHX_ a)
-#define ck_stringify(a)                Perl_ck_stringify(aTHX_ a)
-#define ck_subr(a)             Perl_ck_subr(aTHX_ a)
-#define ck_substr(a)           Perl_ck_substr(aTHX_ a)
-#define ck_svconst(a)          Perl_ck_svconst(aTHX_ a)
-#define ck_tell(a)             Perl_ck_tell(aTHX_ a)
-#define ck_trunc(a)            Perl_ck_trunc(aTHX_ a)
-#define ck_trycatch(a)         Perl_ck_trycatch(aTHX_ a)
-#define closest_cop(a,b,c,d)   Perl_closest_cop(aTHX_ a,b,c,d)
-#define cmpchain_extend(a,b,c) Perl_cmpchain_extend(aTHX_ a,b,c)
-#define cmpchain_finish(a)     Perl_cmpchain_finish(aTHX_ a)
-#define cmpchain_start(a,b,c)  Perl_cmpchain_start(aTHX_ a,b,c)
-#define core_prototype(a,b,c,d)        Perl_core_prototype(aTHX_ a,b,c,d)
-#define coresub_op(a,b,c)      Perl_coresub_op(aTHX_ a,b,c)
-#define create_eval_scope(a,b) Perl_create_eval_scope(aTHX_ a,b)
-#define croak_caller           Perl_croak_caller
-#define croak_no_mem           Perl_croak_no_mem
-#define croak_popstack         Perl_croak_popstack
-#define custom_op_get_field(a,b)       Perl_custom_op_get_field(aTHX_ a,b)
-#define cv_clone_into(a,b)     Perl_cv_clone_into(aTHX_ a,b)
-#define cv_const_sv_or_av      Perl_cv_const_sv_or_av
-#define cv_forget_slab(a)      Perl_cv_forget_slab(aTHX_ a)
-#define cv_undef_flags(a,b)    Perl_cv_undef_flags(aTHX_ a,b)
-#define cvgv_set(a,b)          Perl_cvgv_set(aTHX_ a,b)
-#define cvstash_set(a,b)       Perl_cvstash_set(aTHX_ a,b)
-#define deb_stack_all()                Perl_deb_stack_all(aTHX)
-#define debug_hash_seed(a)     Perl_debug_hash_seed(aTHX_ a)
-#define defelem_target(a,b)    Perl_defelem_target(aTHX_ a,b)
-#define delete_eval_scope()    Perl_delete_eval_scope(aTHX)
-#define die_unwind(a)          Perl_die_unwind(aTHX_ a)
-#define do_aexec5(a,b,c,d,e)   Perl_do_aexec5(aTHX_ a,b,c,d,e)
-#define do_dump_pad(a,b,c,d)   Perl_do_dump_pad(aTHX_ a,b,c,d)
-#define do_eof(a)              Perl_do_eof(aTHX_ a)
-#define do_ncmp(a,b)           Perl_do_ncmp(aTHX_ a,b)
-#define do_open6(a,b,c,d,e,f)  Perl_do_open6(aTHX_ a,b,c,d,e,f)
-#define do_open_raw(a,b,c,d,e,f)       Perl_do_open_raw(aTHX_ a,b,c,d,e,f)
-#define do_print(a,b)          Perl_do_print(aTHX_ a,b)
-#define do_readline()          Perl_do_readline(aTHX)
-#define do_seek(a,b,c)         Perl_do_seek(aTHX_ a,b,c)
-#define do_sysseek(a,b,c)      Perl_do_sysseek(aTHX_ a,b,c)
-#define do_tell(a)             Perl_do_tell(aTHX_ a)
-#define do_trans(a)            Perl_do_trans(aTHX_ a)
-#define do_vecget(a,b,c)       Perl_do_vecget(aTHX_ a,b,c)
-#define do_vecset(a)           Perl_do_vecset(aTHX_ a)
-#define do_vop(a,b,c,d)                Perl_do_vop(aTHX_ a,b,c,d)
-#define dofile(a,b)            Perl_dofile(aTHX_ a,b)
-#define dump_all_perl(a)       Perl_dump_all_perl(aTHX_ a)
-#define dump_packsubs_perl(a,b)        Perl_dump_packsubs_perl(aTHX_ a,b)
-#define dump_sub_perl(a,b)     Perl_dump_sub_perl(aTHX_ a,b)
-#define finalize_optree(a)     Perl_finalize_optree(aTHX_ a)
-#define find_lexical_cv(a)     Perl_find_lexical_cv(aTHX_ a)
-#define find_runcv_where(a,b,c)        Perl_find_runcv_where(aTHX_ a,b,c)
-#define find_script(a,b,c,d)   Perl_find_script(aTHX_ a,b,c,d)
-#define free_tied_hv_pool()    Perl_free_tied_hv_pool(aTHX)
-#define get_hash_seed(a)       Perl_get_hash_seed(aTHX_ a)
-#define get_no_modify()                Perl_get_no_modify(aTHX)
-#define get_opargs()           Perl_get_opargs(aTHX)
-#define gv_override(a,b)       Perl_gv_override(aTHX_ a,b)
-#define gv_setref(a,b)         Perl_gv_setref(aTHX_ a,b)
-#define gv_try_downgrade(a)    Perl_gv_try_downgrade(aTHX_ a)
-#define hv_ename_add(a,b,c,d)  Perl_hv_ename_add(aTHX_ a,b,c,d)
-#define hv_ename_delete(a,b,c,d)       Perl_hv_ename_delete(aTHX_ a,b,c,d)
-#define hv_pushkv(a,b)         Perl_hv_pushkv(aTHX_ a,b)
-#define init_argv_symbols(a,b) Perl_init_argv_symbols(aTHX_ a,b)
-#define init_constants()       Perl_init_constants(aTHX)
-#define init_debugger()                Perl_init_debugger(aTHX)
-#define init_named_cv(a,b)     Perl_init_named_cv(aTHX_ a,b)
-#define init_uniprops()                Perl_init_uniprops(aTHX)
-#define invert(a)              Perl_invert(aTHX_ a)
-#define invmap_dump(a,b)       Perl_invmap_dump(aTHX_ a,b)
-#define io_close(a,b,c,d)      Perl_io_close(aTHX_ a,b,c,d)
-#define isinfnansv(a)          Perl_isinfnansv(aTHX_ a)
-#define jmaybe(a)              Perl_jmaybe(aTHX_ a)
-#define keyword(a,b,c)         Perl_keyword(aTHX_ a,b,c)
-#define list(a)                        Perl_list(aTHX_ a)
-#define localize(a,b)          Perl_localize(aTHX_ a,b)
-#define magic_clear_all_env(a,b)       Perl_magic_clear_all_env(aTHX_ a,b)
-#define magic_cleararylen_p(a,b)       Perl_magic_cleararylen_p(aTHX_ a,b)
-#define magic_clearenv(a,b)    Perl_magic_clearenv(aTHX_ a,b)
-#define magic_clearhint(a,b)   Perl_magic_clearhint(aTHX_ a,b)
-#define magic_clearhints(a,b)  Perl_magic_clearhints(aTHX_ a,b)
-#define magic_clearisa(a,b)    Perl_magic_clearisa(aTHX_ a,b)
-#define magic_clearpack(a,b)   Perl_magic_clearpack(aTHX_ a,b)
-#define magic_clearsig(a,b)    Perl_magic_clearsig(aTHX_ a,b)
-#define magic_copycallchecker(a,b,c,d,e)       Perl_magic_copycallchecker(aTHX_ a,b,c,d,e)
-#define magic_existspack(a,b)  Perl_magic_existspack(aTHX_ a,b)
-#define magic_freearylen_p(a,b)        Perl_magic_freearylen_p(aTHX_ a,b)
-#define magic_freemglob(a,b)   Perl_magic_freemglob(aTHX_ a,b)
-#define magic_freeovrld(a,b)   Perl_magic_freeovrld(aTHX_ a,b)
-#define magic_freeutf8(a,b)    Perl_magic_freeutf8(aTHX_ a,b)
-#define magic_get(a,b)         Perl_magic_get(aTHX_ a,b)
-#define magic_getarylen(a,b)   Perl_magic_getarylen(aTHX_ a,b)
-#define magic_getdebugvar(a,b) Perl_magic_getdebugvar(aTHX_ a,b)
-#define magic_getdefelem(a,b)  Perl_magic_getdefelem(aTHX_ a,b)
-#define magic_getnkeys(a,b)    Perl_magic_getnkeys(aTHX_ a,b)
-#define magic_getpack(a,b)     Perl_magic_getpack(aTHX_ a,b)
-#define magic_getpos(a,b)      Perl_magic_getpos(aTHX_ a,b)
-#define magic_getsig(a,b)      Perl_magic_getsig(aTHX_ a,b)
-#define magic_getsubstr(a,b)   Perl_magic_getsubstr(aTHX_ a,b)
-#define magic_gettaint(a,b)    Perl_magic_gettaint(aTHX_ a,b)
-#define magic_getuvar(a,b)     Perl_magic_getuvar(aTHX_ a,b)
-#define magic_getvec(a,b)      Perl_magic_getvec(aTHX_ a,b)
-#define magic_killbackrefs(a,b)        Perl_magic_killbackrefs(aTHX_ a,b)
-#define magic_nextpack(a,b,c)  Perl_magic_nextpack(aTHX_ a,b,c)
-#define magic_regdata_cnt(a,b) Perl_magic_regdata_cnt(aTHX_ a,b)
-#define magic_regdatum_get(a,b)        Perl_magic_regdatum_get(aTHX_ a,b)
-#define magic_scalarpack(a,b)  Perl_magic_scalarpack(aTHX_ a,b)
-#define magic_set(a,b)         Perl_magic_set(aTHX_ a,b)
-#define magic_set_all_env(a,b) Perl_magic_set_all_env(aTHX_ a,b)
-#define magic_setarylen(a,b)   Perl_magic_setarylen(aTHX_ a,b)
-#define magic_setdbline(a,b)   Perl_magic_setdbline(aTHX_ a,b)
-#define magic_setdebugvar(a,b) Perl_magic_setdebugvar(aTHX_ a,b)
-#define magic_setdefelem(a,b)  Perl_magic_setdefelem(aTHX_ a,b)
-#define magic_setenv(a,b)      Perl_magic_setenv(aTHX_ a,b)
-#define magic_sethint(a,b)     Perl_magic_sethint(aTHX_ a,b)
-#define magic_setisa(a,b)      Perl_magic_setisa(aTHX_ a,b)
-#define magic_setlvref(a,b)    Perl_magic_setlvref(aTHX_ a,b)
-#define magic_setmglob(a,b)    Perl_magic_setmglob(aTHX_ a,b)
-#define magic_setnkeys(a,b)    Perl_magic_setnkeys(aTHX_ a,b)
-#define magic_setnonelem(a,b)  Perl_magic_setnonelem(aTHX_ a,b)
-#define magic_setpack(a,b)     Perl_magic_setpack(aTHX_ a,b)
-#define magic_setpos(a,b)      Perl_magic_setpos(aTHX_ a,b)
-#define magic_setregexp(a,b)   Perl_magic_setregexp(aTHX_ a,b)
-#define magic_setsig(a,b)      Perl_magic_setsig(aTHX_ a,b)
-#define magic_setsigall(a,b)   Perl_magic_setsigall(aTHX_ a,b)
-#define magic_setsubstr(a,b)   Perl_magic_setsubstr(aTHX_ a,b)
-#define magic_settaint(a,b)    Perl_magic_settaint(aTHX_ a,b)
-#define magic_setutf8(a,b)     Perl_magic_setutf8(aTHX_ a,b)
-#define magic_setuvar(a,b)     Perl_magic_setuvar(aTHX_ a,b)
-#define magic_setvec(a,b)      Perl_magic_setvec(aTHX_ a,b)
-#define magic_sizepack(a,b)    Perl_magic_sizepack(aTHX_ a,b)
-#define magic_wipepack(a,b)    Perl_magic_wipepack(aTHX_ a,b)
-#define mg_localize(a,b,c)     Perl_mg_localize(aTHX_ a,b,c)
-#define mode_from_discipline(a,b)      Perl_mode_from_discipline(aTHX_ a,b)
-#define mro_isa_changed_in(a)  Perl_mro_isa_changed_in(aTHX_ a)
-#define mro_package_moved(a,b,c,d)     Perl_mro_package_moved(aTHX_ a,b,c,d)
-#define my_attrs(a,b)          Perl_my_attrs(aTHX_ a,b)
-#define my_clearenv()          Perl_my_clearenv(aTHX)
-#define my_lstat_flags(a)      Perl_my_lstat_flags(aTHX_ a)
-#define my_stat_flags(a)       Perl_my_stat_flags(aTHX_ a)
-#define my_strerror(a)         Perl_my_strerror(aTHX_ a)
-#define my_unexec()            Perl_my_unexec(aTHX)
-#define newATTRSUB_x(a,b,c,d,e,f)      Perl_newATTRSUB_x(aTHX_ a,b,c,d,e,f)
-#define newSTUB(a,b)           Perl_newSTUB(aTHX_ a,b)
-#define newSVavdefelem(a,b,c)  Perl_newSVavdefelem(aTHX_ a,b,c)
-#define newXS_deffile(a,b)     Perl_newXS_deffile(aTHX_ a,b)
-#define newXS_len_flags(a,b,c,d,e,f,g) Perl_newXS_len_flags(aTHX_ a,b,c,d,e,f,g)
-#define nextargv(a,b)          Perl_nextargv(aTHX_ a,b)
-#define no_bareword_filehandle(a)      Perl_no_bareword_filehandle(aTHX_ a)
-#define noperl_die             Perl_noperl_die
-#define notify_parser_that_changed_to_utf8()   Perl_notify_parser_that_changed_to_utf8(aTHX)
-#define oopsAV(a)              Perl_oopsAV(aTHX_ a)
-#define oopsHV(a)              Perl_oopsHV(aTHX_ a)
-#define op_unscope(a)          Perl_op_unscope(aTHX_ a)
-#define optimize_optree(a)     Perl_optimize_optree(aTHX_ a)
-#define package(a)             Perl_package(aTHX_ a)
-#define package_version(a)     Perl_package_version(aTHX_ a)
-#define pad_add_weakref(a)     Perl_pad_add_weakref(aTHX_ a)
-#define pad_block_start(a)     Perl_pad_block_start(aTHX_ a)
-#define pad_fixup_inner_anons(a,b,c)   Perl_pad_fixup_inner_anons(aTHX_ a,b,c)
-#define pad_free(a)            Perl_pad_free(aTHX_ a)
-#define pad_leavemy()          Perl_pad_leavemy(aTHX)
-#define pad_push(a,b)          Perl_pad_push(aTHX_ a,b)
-#define pad_swipe(a,b)         Perl_pad_swipe(aTHX_ a,b)
-#define padlist_store(a,b,c)   Perl_padlist_store(aTHX_ a,b,c)
-#define parse_unicode_opts(a)  Perl_parse_unicode_opts(aTHX_ a)
-#define parser_free(a)         Perl_parser_free(aTHX_ a)
-#define peep(a)                        Perl_peep(aTHX_ a)
-#define pmruntime(a,b,c,d,e)   Perl_pmruntime(aTHX_ a,b,c,d,e)
-#define re_op_compile(a,b,c,d,e,f,g,h) Perl_re_op_compile(aTHX_ a,b,c,d,e,f,g,h)
-#define refcounted_he_chain_2hv(a,b)   Perl_refcounted_he_chain_2hv(aTHX_ a,b)
-#define refcounted_he_fetch_pv(a,b,c,d)        Perl_refcounted_he_fetch_pv(aTHX_ a,b,c,d)
-#define refcounted_he_fetch_pvn(a,b,c,d,e)     Perl_refcounted_he_fetch_pvn(aTHX_ a,b,c,d,e)
-#define refcounted_he_fetch_sv(a,b,c,d)        Perl_refcounted_he_fetch_sv(aTHX_ a,b,c,d)
-#define refcounted_he_free(a)  Perl_refcounted_he_free(aTHX_ a)
-#define refcounted_he_inc(a)   Perl_refcounted_he_inc(aTHX_ a)
-#define refcounted_he_new_pv(a,b,c,d,e)        Perl_refcounted_he_new_pv(aTHX_ a,b,c,d,e)
-#define refcounted_he_new_pvn(a,b,c,d,e,f)     Perl_refcounted_he_new_pvn(aTHX_ a,b,c,d,e,f)
-#define refcounted_he_new_sv(a,b,c,d,e)        Perl_refcounted_he_new_sv(aTHX_ a,b,c,d,e)
-#define report_evil_fh(a)      Perl_report_evil_fh(aTHX_ a)
-#define report_wrongway_fh(a,b)        Perl_report_wrongway_fh(aTHX_ a,b)
-#define rpeep(a)               Perl_rpeep(aTHX_ a)
-#define rsignal_restore(a,b)   Perl_rsignal_restore(aTHX_ a,b)
-#define rsignal_save(a,b,c)    Perl_rsignal_save(aTHX_ a,b,c)
-#define rxres_save(a,b)                Perl_rxres_save(aTHX_ a,b)
-#define save_strlen(a)         Perl_save_strlen(aTHX_ a)
-#define sawparens(a)           Perl_sawparens(aTHX_ a)
-#define scalar(a)              Perl_scalar(aTHX_ a)
-#define scalarvoid(a)          Perl_scalarvoid(aTHX_ a)
-#define set_caret_X()          Perl_set_caret_X(aTHX)
-#define set_numeric_standard() Perl_set_numeric_standard(aTHX)
-#define set_numeric_underlying()       Perl_set_numeric_underlying(aTHX)
-#define setfd_cloexec          Perl_setfd_cloexec
-#define setfd_cloexec_for_nonsysfd(a)  Perl_setfd_cloexec_for_nonsysfd(aTHX_ a)
-#define setfd_cloexec_or_inhexec_by_sysfdness(a)       Perl_setfd_cloexec_or_inhexec_by_sysfdness(aTHX_ a)
-#define setfd_inhexec          Perl_setfd_inhexec
-#define setfd_inhexec_for_sysfd(a)     Perl_setfd_inhexec_for_sysfd(aTHX_ a)
-#define sighandler1            Perl_sighandler1
-#define sighandler3            Perl_sighandler3
-#define sub_crush_depth(a)     Perl_sub_crush_depth(aTHX_ a)
-#define sv_2num(a)             Perl_sv_2num(aTHX_ a)
-#define sv_clean_all()         Perl_sv_clean_all(aTHX)
-#define sv_clean_objs()                Perl_sv_clean_objs(aTHX)
-#define sv_del_backref(a,b)    Perl_sv_del_backref(aTHX_ a,b)
-#define sv_free_arenas()       Perl_sv_free_arenas(aTHX)
-#define sv_resetpvn(a,b,c)     Perl_sv_resetpvn(aTHX_ a,b,c)
-#define sv_sethek(a,b)         Perl_sv_sethek(aTHX_ a,b)
-#ifndef MULTIPLICITY
-#define tied_method            Perl_tied_method
-#endif
-#define tmps_grow_p(a)         Perl_tmps_grow_p(aTHX_ a)
-#define unshare_hek(a)         Perl_unshare_hek(aTHX_ a)
-#define utilize(a,b,c,d,e)     Perl_utilize(aTHX_ a,b,c,d,e)
-#define vivify_ref(a,b)                Perl_vivify_ref(aTHX_ a,b)
-#define wait4pid(a,b,c)                Perl_wait4pid(aTHX_ a,b,c)
-#define watch(a)               Perl_watch(aTHX_ a)
-#define write_to_stderr(a)     Perl_write_to_stderr(aTHX_ a)
-#define xs_boot_epilog(a)      Perl_xs_boot_epilog(aTHX_ a)
-#define yyerror(a)             Perl_yyerror(aTHX_ a)
-#define yyerror_pv(a,b)                Perl_yyerror_pv(aTHX_ a,b)
-#define yyerror_pvn(a,b,c)     Perl_yyerror_pvn(aTHX_ a,b,c)
-#define yyparse(a)             Perl_yyparse(aTHX_ a)
-#define yyquit()               Perl_yyquit(aTHX)
-#define yyunlex()              Perl_yyunlex(aTHX)
-#  if !(defined(DEBUGGING))
-#    if !defined(NV_PRESERVES_UV)
-#      if defined(PERL_IN_SV_C)
-#define sv_2iuv_non_preserve(a)        S_sv_2iuv_non_preserve(aTHX_ a)
-#      endif
-#    endif
-#  endif
-#  if !(defined(HAS_NL_LANGINFO))
-#    if defined(PERL_IN_LOCALE_C)
-#define my_nl_langinfo         S_my_nl_langinfo
-#    endif
-#  endif
-#  if !(defined(PERL_DEFAULT_DO_EXEC3_IMPLEMENTATION))
-#define do_exec(a)             Perl_do_exec(aTHX_ a)
-#  endif
-#  if !(defined(PERL_USE_3ARG_SIGHANDLER))
-#define sighandler             Perl_sighandler
-#  endif
-#  if !(defined(_MSC_VER))
-#define magic_regdatum_set(a,b)        Perl_magic_regdatum_set(aTHX_ a,b)
-#  endif
-#  if !defined(HAS_GETENV_LEN)
-#define getenv_len(a,b)                Perl_getenv_len(aTHX_ a,b)
-#  endif
-#  if !defined(HAS_MKDIR) || !defined(HAS_RMDIR)
-#    if defined(PERL_IN_PP_SYS_C)
-#define dooneliner(a,b)                S_dooneliner(aTHX_ a,b)
-#    endif
-#  endif
-#  if !defined(HAS_RENAME)
-#define same_dirent(a,b)       Perl_same_dirent(aTHX_ a,b)
-#  endif
-#  if !defined(NV_PRESERVES_UV)
-#    if defined(DEBUGGING)
-#      if defined(PERL_IN_SV_C)
-#define sv_2iuv_non_preserve(a,b)      S_sv_2iuv_non_preserve(aTHX_ a,b)
-#      endif
-#    endif
-#  endif
-#  if !defined(PERL_DISABLE_PMC)
-#    if defined(PERL_IN_PP_CTL_C)
-#define doopen_pm(a)           S_doopen_pm(aTHX_ a)
-#    endif
-#  endif
-#  if !defined(PERL_EXT_RE_BUILD)
-#    if defined(PERL_IN_REGCOMP_C)
-#define initialize_invlist_guts(a,b)   S_initialize_invlist_guts(aTHX_ a,b)
-#    endif
-#  endif
-#  if !defined(PERL_IS_MINIPERL)
-#    if defined(PERL_IN_PERL_C)
-#define incpush_if_exists(a,b,c)       S_incpush_if_exists(aTHX_ a,b,c)
-#    endif
-#  endif
-#  if !defined(PERL_NO_UTF16_FILTER)
-#    if defined(PERL_IN_TOKE_C)
-#define add_utf16_textfilter(a,b)      S_add_utf16_textfilter(aTHX_ a,b)
-#define utf16_textfilter(a,b,c)        S_utf16_textfilter(aTHX_ a,b,c)
-#    endif
-#  endif
-#  if !defined(PURIFY)
-#    if defined(PERL_IN_HV_C)
-#define new_he()               S_new_he(aTHX)
-#    endif
-#  endif
-#  if !defined(WIN32)
-#define do_exec3(a,b,c)                Perl_do_exec3(aTHX_ a,b,c)
-#  endif
-#  if 0        /* Not currently used, but may be needed in the future */
-#    if defined(PERL_IN_UTF8_C)
-#define warn_on_first_deprecated_use(a,b,c,d,e)        S_warn_on_first_deprecated_use(aTHX_ a,b,c,d,e)
-#    endif
-#  endif
-#  if defined (HAS_SOCKETPAIR) ||     (defined (HAS_SOCKET) && defined(SOCK_DGRAM) &&  defined(AF_INET) && defined(PF_INET))
-#define PerlSock_socketpair_cloexec(a,b,c,d)   Perl_PerlSock_socketpair_cloexec(aTHX_ a,b,c,d)
-#  endif
-#  if defined(DEBUGGING)
-#define get_debug_opts(a,b)    Perl_get_debug_opts(aTHX_ a,b)
-#define set_padlist            Perl_set_padlist
-#    if defined(PERL_IN_LOCALE_C)
-#      if defined(USE_LOCALE)
-#define print_bytes_for_locale(a,b,c)  S_print_bytes_for_locale(aTHX_ a,b,c)
-#define print_collxfrm_input_and_return(a,b,c,d)       S_print_collxfrm_input_and_return(aTHX_ a,b,c,d)
-#define setlocale_debug_string S_setlocale_debug_string
-#      endif
-#    endif
-#    if defined(PERL_IN_PAD_C)
-#define cv_dump(a,b)           S_cv_dump(aTHX_ a,b)
-#    endif
-#    if defined(PERL_IN_SV_C)
-#define del_sv(a)              S_del_sv(aTHX_ a)
-#    endif
-#    if defined(PERL_IN_TOKE_C)
-#define printbuf(a,b)          S_printbuf(aTHX_ a,b)
-#define tokereport(a,b)                S_tokereport(aTHX_ a,b)
-#    endif
-#  endif
-#  if defined(DEBUG_LEAKING_SCALARS_FORK_DUMP)
-#define dump_sv_child(a)       Perl_dump_sv_child(aTHX_ a)
-#  endif
-#  if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
-#define do_ipcctl(a,b,c)       Perl_do_ipcctl(aTHX_ a,b,c)
-#define do_ipcget(a,b,c)       Perl_do_ipcget(aTHX_ a,b,c)
-#define do_msgrcv(a,b)         Perl_do_msgrcv(aTHX_ a,b)
-#define do_msgsnd(a,b)         Perl_do_msgsnd(aTHX_ a,b)
-#define do_semop(a,b)          Perl_do_semop(aTHX_ a,b)
-#define do_shmio(a,b,c)                Perl_do_shmio(aTHX_ a,b,c)
-#  endif
-#  if defined(HAS_NL_LANGINFO)
-#    if defined(PERL_IN_LOCALE_C)
-#define my_nl_langinfo         S_my_nl_langinfo
-#    endif
-#  endif
-#  if defined(HAS_PIPE)
-#define PerlProc_pipe_cloexec(a)       Perl_PerlProc_pipe_cloexec(aTHX_ a)
-#  endif
-#  if defined(HAS_SOCKET)
-#define PerlSock_accept_cloexec(a,b,c) Perl_PerlSock_accept_cloexec(aTHX_ a,b,c)
-#define PerlSock_socket_cloexec(a,b,c) Perl_PerlSock_socket_cloexec(aTHX_ a,b,c)
-#  endif
-#  if defined(MYMALLOC)
-#define malloc_good_size       Perl_malloc_good_size
-#define malloced_size          Perl_malloced_size
-#  endif
-#  if defined(PERL_CORE)
-#define opslab_force_free(a)   Perl_opslab_force_free(aTHX_ a)
-#define opslab_free(a)         Perl_opslab_free(aTHX_ a)
-#define opslab_free_nopad(a)   Perl_opslab_free_nopad(aTHX_ a)
-#define parser_free_nexttoke_ops(a,b)  Perl_parser_free_nexttoke_ops(aTHX_ a,b)
-#define should_warn_nl         S_should_warn_nl
-#    if defined(PERL_DEBUG_READONLY_OPS)
-#define Slab_to_ro(a)          Perl_Slab_to_ro(aTHX_ a)
-#define Slab_to_rw(a)          Perl_Slab_to_rw(aTHX_ a)
-#    endif
-#  endif
-#  if defined(PERL_CR_FILTER)
-#    if defined(PERL_IN_TOKE_C)
-#define cr_textfilter(a,b,c)   S_cr_textfilter(aTHX_ a,b,c)
-#define strip_return(a)                S_strip_return(aTHX_ a)
-#    endif
-#  endif
-#  if defined(PERL_DEBUG_READONLY_COW)
-#define sv_buf_to_ro(a)                Perl_sv_buf_to_ro(aTHX_ a)
-#    if defined(PERL_IN_SV_C)
-#define sv_buf_to_rw(a)                S_sv_buf_to_rw(aTHX_ a)
-#    endif
-#  endif
-#  if defined(PERL_IN_AV_C)
-#define get_aux_mg(a)          S_get_aux_mg(aTHX_ a)
-#  endif
-#  if defined(PERL_IN_DEB_C)
-#define deb_stack_n(a,b,c,d,e) S_deb_stack_n(aTHX_ a,b,c,d,e)
-#  endif
-#  if defined(PERL_IN_DOIO_C)
-#define argvout_final(a,b,c)   S_argvout_final(aTHX_ a,b,c)
-#define exec_failed(a,b,c)     S_exec_failed(aTHX_ a,b,c)
-#define ingroup(a,b)           S_ingroup(aTHX_ a,b)
-#define openn_cleanup(a,b,c,d,e,f,g,h,i,j,k,l,m)       S_openn_cleanup(aTHX_ a,b,c,d,e,f,g,h,i,j,k,l,m)
-#define openn_setup(a,b,c,d,e,f)       S_openn_setup(aTHX_ a,b,c,d,e,f)
-#  endif
-#  if defined(PERL_IN_DOOP_C)
-#define do_trans_complex(a,b)  S_do_trans_complex(aTHX_ a,b)
-#define do_trans_count(a,b)    S_do_trans_count(aTHX_ a,b)
-#define do_trans_count_invmap(a,b)     S_do_trans_count_invmap(aTHX_ a,b)
-#define do_trans_invmap(a,b)   S_do_trans_invmap(aTHX_ a,b)
-#define do_trans_simple(a,b)   S_do_trans_simple(aTHX_ a,b)
-#  endif
-#  if defined(PERL_IN_DUMP_C)
-#define deb_curcv(a)           S_deb_curcv(aTHX_ a)
-#define debprof(a)             S_debprof(aTHX_ a)
-#define pm_description(a)      S_pm_description(aTHX_ a)
-#define sequence_num(a)                S_sequence_num(aTHX_ a)
-#  endif
-#  if defined(PERL_IN_GV_C)
-#define find_default_stash(a,b,c,d,e,f)        S_find_default_stash(aTHX_ a,b,c,d,e,f)
-#define gv_fetchmeth_internal(a,b,c,d,e,f)     S_gv_fetchmeth_internal(aTHX_ a,b,c,d,e,f)
-#define gv_init_svtype(a,b)    S_gv_init_svtype(aTHX_ a,b)
-#define gv_is_in_main(a,b,c)   S_gv_is_in_main(aTHX_ a,b,c)
-#define gv_magicalize(a,b,c,d,e)       S_gv_magicalize(aTHX_ a,b,c,d,e)
-#define gv_magicalize_isa(a)   S_gv_magicalize_isa(aTHX_ a)
-#define gv_stashpvn_internal(a,b,c)    S_gv_stashpvn_internal(aTHX_ a,b,c)
-#define maybe_multimagic_gv(a,b,c)     S_maybe_multimagic_gv(aTHX_ a,b,c)
-#define parse_gv_stash_name(a,b,c,d,e,f,g,h)   S_parse_gv_stash_name(aTHX_ a,b,c,d,e,f,g,h)
-#define require_tie_mod(a,b,c,d,e)     S_require_tie_mod(aTHX_ a,b,c,d,e)
-#  endif
-#  if defined(PERL_IN_HV_C)
-#define clear_placeholders(a,b)        S_clear_placeholders(aTHX_ a,b)
-#define hsplit(a,b,c)          S_hsplit(aTHX_ a,b,c)
-#define hv_auxinit(a)          S_hv_auxinit(aTHX_ a)
-#define hv_delete_common(a,b,c,d,e,f,g)        S_hv_delete_common(aTHX_ a,b,c,d,e,f,g)
-#define hv_free_ent_ret(a)     S_hv_free_ent_ret(aTHX_ a)
-#define hv_free_entries(a)     S_hv_free_entries(aTHX_ a)
-#define hv_magic_check         S_hv_magic_check
-#define hv_notallowed(a,b,c,d) S_hv_notallowed(aTHX_ a,b,c,d)
-#define refcounted_he_value(a) S_refcounted_he_value(aTHX_ a)
-#define save_hek_flags         S_save_hek_flags
-#define share_hek_flags(a,b,c,d)       S_share_hek_flags(aTHX_ a,b,c,d)
-#define unshare_hek_or_pvn(a,b,c,d)    S_unshare_hek_or_pvn(aTHX_ a,b,c,d)
-#  endif
-#  if defined(PERL_IN_LOCALE_C)
-#define save_to_buffer         S_save_to_buffer
-#    if defined(USE_LOCALE)
-#define category_name          S_category_name
-#define new_collate(a)         S_new_collate(aTHX_ a)
-#define new_ctype(a)           S_new_ctype(aTHX_ a)
-#define new_numeric(a)         S_new_numeric(aTHX_ a)
-#define restore_switched_locale(a,b)   S_restore_switched_locale(aTHX_ a,b)
-#define set_numeric_radix(a)   S_set_numeric_radix(aTHX_ a)
-#define stdize_locale(a)       S_stdize_locale(aTHX_ a)
-#define switch_category_locale_to_template(a,b,c)      S_switch_category_locale_to_template(aTHX_ a,b,c)
-#      if defined(USE_POSIX_2008_LOCALE)
-#define emulate_setlocale      S_emulate_setlocale
-#      endif
-#      if defined(WIN32)
-#define win32_setlocale(a,b)   S_win32_setlocale(aTHX_ a,b)
-#      endif
-#    endif
-#  endif
-#  if defined(PERL_IN_LOCALE_C) || defined(PERL_IN_SV_C) || defined(PERL_IN_MATHOMS_C)
-#    if defined(USE_LOCALE_COLLATE)
-#define _mem_collxfrm(a,b,c,d) Perl__mem_collxfrm(aTHX_ a,b,c,d)
-#    endif
-#  endif
-#  if defined(PERL_IN_MALLOC_C)
-#define adjust_size_and_find_bucket    S_adjust_size_and_find_bucket
-#  endif
-#  if defined(PERL_IN_MG_C)
-#define fixup_errno_string(a)  S_fixup_errno_string(aTHX_ a)
-#define magic_methcall1(a,b,c,d,e,f)   S_magic_methcall1(aTHX_ a,b,c,d,e,f)
-#define magic_methpack(a,b,c)  S_magic_methpack(aTHX_ a,b,c)
-#define restore_magic(a)       S_restore_magic(aTHX_ a)
-#define save_magic_flags(a,b,c)        S_save_magic_flags(aTHX_ a,b,c)
-#define unwind_handler_stack(a)        S_unwind_handler_stack(aTHX_ a)
-#  endif
-#  if defined(PERL_IN_MG_C) || defined(PERL_IN_PP_C)
-#define translate_substr_offsets       Perl_translate_substr_offsets
-#  endif
-#  if defined(PERL_IN_MRO_C)
-#define mro_clean_isarev(a,b,c,d,e,f)  S_mro_clean_isarev(aTHX_ a,b,c,d,e,f)
-#define mro_gather_and_rename(a,b,c,d,e)       S_mro_gather_and_rename(aTHX_ a,b,c,d,e)
-#define mro_get_linear_isa_dfs(a,b)    S_mro_get_linear_isa_dfs(aTHX_ a,b)
-#  endif
-#  if defined(PERL_IN_NUMERIC_C)
-#define output_non_portable(a) S_output_non_portable(aTHX_ a)
-#  endif
-#  if defined(PERL_IN_OP_C)
-#define apply_attrs(a,b,c)     S_apply_attrs(aTHX_ a,b,c)
-#define apply_attrs_my(a,b,c,d)        S_apply_attrs_my(aTHX_ a,b,c,d)
-#define assignment_type(a)     S_assignment_type(aTHX_ a)
-#define bad_type_gv(a,b,c,d)   S_bad_type_gv(aTHX_ a,b,c,d)
-#define bad_type_pv(a,b,c,d)   S_bad_type_pv(aTHX_ a,b,c,d)
-#define clear_special_blocks(a,b,c)    S_clear_special_blocks(aTHX_ a,b,c)
-#define cop_free(a)            S_cop_free(aTHX_ a)
-#define dup_attrlist(a)                S_dup_attrlist(aTHX_ a)
-#define finalize_op(a)         S_finalize_op(aTHX_ a)
-#define find_and_forget_pmops(a)       S_find_and_forget_pmops(aTHX_ a)
-#define fold_constants(a)      S_fold_constants(aTHX_ a)
-#define force_list(a,b)                S_force_list(aTHX_ a,b)
-#define forget_pmop(a)         S_forget_pmop(aTHX_ a)
-#define gen_constant_list(a)   S_gen_constant_list(aTHX_ a)
-#define inplace_aassign(a)     S_inplace_aassign(aTHX_ a)
-#define is_handle_constructor  S_is_handle_constructor
-#define listkids(a)            S_listkids(aTHX_ a)
-#define looks_like_bool(a)     S_looks_like_bool(aTHX_ a)
-#define modkids(a,b)           S_modkids(aTHX_ a,b)
-#define move_proto_attr(a,b,c,d)       S_move_proto_attr(aTHX_ a,b,c,d)
-#define my_kid(a,b,c)          S_my_kid(aTHX_ a,b,c)
-#define newGIVWHENOP(a,b,c,d,e)        S_newGIVWHENOP(aTHX_ a,b,c,d,e)
-#define newMETHOP_internal(a,b,c,d)    S_newMETHOP_internal(aTHX_ a,b,c,d)
-#define new_logop(a,b,c,d)     S_new_logop(aTHX_ a,b,c,d)
-#define no_bareword_allowed(a) S_no_bareword_allowed(aTHX_ a)
-#define no_fh_allowed(a)       S_no_fh_allowed(aTHX_ a)
-#define op_integerize(a)       S_op_integerize(aTHX_ a)
-#define op_std_init(a)         S_op_std_init(aTHX_ a)
-#define optimize_op(a)         S_optimize_op(aTHX_ a)
-#define pmtrans(a,b,c)         S_pmtrans(aTHX_ a,b,c)
-#define process_special_blocks(a,b,c,d)        S_process_special_blocks(aTHX_ a,b,c,d)
-#define ref_array_or_hash(a)   S_ref_array_or_hash(aTHX_ a)
-#define refkids(a,b)           S_refkids(aTHX_ a,b)
-#define scalar_mod_type                S_scalar_mod_type
-#define scalarboolean(a)       S_scalarboolean(aTHX_ a)
-#define scalarkids(a)          S_scalarkids(aTHX_ a)
-#define search_const(a)                S_search_const(aTHX_ a)
-#define simplify_sort(a)       S_simplify_sort(aTHX_ a)
-#define too_few_arguments_pv(a,b,c)    S_too_few_arguments_pv(aTHX_ a,b,c)
-#define too_many_arguments_pv(a,b,c)   S_too_many_arguments_pv(aTHX_ a,b,c)
-#define traverse_op_tree(a,b)  S_traverse_op_tree(aTHX_ a,b)
-#define voidnonfinal(a)                S_voidnonfinal(aTHX_ a)
-#    if defined(USE_ITHREADS)
-#define op_relocate_sv(a,b)    S_op_relocate_sv(aTHX_ a,b)
-#    endif
-#  endif
-#  if defined(PERL_IN_OP_C) || defined(PERL_IN_SV_C)
-#define report_redefined_cv(a,b,c)     Perl_report_redefined_cv(aTHX_ a,b,c)
-#  endif
-#  if defined(PERL_IN_PAD_C)
-#define pad_alloc_name(a,b,c,d)        S_pad_alloc_name(aTHX_ a,b,c,d)
-#define pad_check_dup(a,b,c)   S_pad_check_dup(aTHX_ a,b,c)
-#define pad_findlex(a,b,c,d,e,f,g,h,i) S_pad_findlex(aTHX_ a,b,c,d,e,f,g,h,i)
-#define pad_reset()            S_pad_reset(aTHX)
-#  endif
-#  if defined(PERL_IN_PAD_C) || defined(PERL_IN_OP_C)
-#define PadnameIN_SCOPE                S_PadnameIN_SCOPE
-#  endif
-#  if defined(PERL_IN_PERL_C)
-#define find_beginning(a,b)    S_find_beginning(aTHX_ a,b)
-#define forbid_setid(a,b)      S_forbid_setid(aTHX_ a,b)
-#define incpush(a,b,c)         S_incpush(aTHX_ a,b,c)
-#define incpush_use_sep(a,b,c) S_incpush_use_sep(aTHX_ a,b,c)
-#define init_ids()             S_init_ids(aTHX)
-#define init_interp()          S_init_interp(aTHX)
-#define init_main_stash()      S_init_main_stash(aTHX)
-#define init_perllib()         S_init_perllib(aTHX)
-#define init_postdump_symbols(a,b,c)   S_init_postdump_symbols(aTHX_ a,b,c)
-#define init_predump_symbols() S_init_predump_symbols(aTHX)
-#define mayberelocate(a,b,c)   S_mayberelocate(aTHX_ a,b,c)
-#define minus_v()              S_minus_v(aTHX)
-#define my_exit_jump()         S_my_exit_jump(aTHX)
-#define nuke_stacks()          S_nuke_stacks(aTHX)
-#define open_script(a,b,c)     S_open_script(aTHX_ a,b,c)
-#define parse_body(a,b)                S_parse_body(aTHX_ a,b)
-#define run_body(a)            S_run_body(aTHX_ a)
-#define usage()                        S_usage(aTHX)
-#  endif
-#  if defined(PERL_IN_PP_C)
-#define do_chomp(a,b,c)                S_do_chomp(aTHX_ a,b,c)
-#define do_delete_local()      S_do_delete_local(aTHX)
-#define refto(a)               S_refto(aTHX_ a)
-#  endif
-#  if defined(PERL_IN_PP_C) || defined(PERL_IN_PP_HOT_C)
-#define lossless_NV_to_IV      S_lossless_NV_to_IV
-#  endif
-#  if defined(PERL_IN_PP_CTL_C)
-#define check_type_and_open(a) S_check_type_and_open(aTHX_ a)
-#define destroy_matcher(a)     S_destroy_matcher(aTHX_ a)
-#define do_smartmatch(a,b,c)   S_do_smartmatch(aTHX_ a,b,c)
-#define docatch(a)             S_docatch(aTHX_ a)
-#define doeval_compile(a,b,c,d)        S_doeval_compile(aTHX_ a,b,c,d)
-#define dofindlabel(a,b,c,d,e,f)       S_dofindlabel(aTHX_ a,b,c,d,e,f)
-#define doparseform(a)         S_doparseform(aTHX_ a)
-#define dopoptoeval(a)         S_dopoptoeval(aTHX_ a)
-#define dopoptogivenfor(a)     S_dopoptogivenfor(aTHX_ a)
-#define dopoptolabel(a,b,c)    S_dopoptolabel(aTHX_ a,b,c)
-#define dopoptoloop(a)         S_dopoptoloop(aTHX_ a)
-#define dopoptosub_at(a,b)     S_dopoptosub_at(aTHX_ a,b)
-#define dopoptowhen(a)         S_dopoptowhen(aTHX_ a)
-#define make_matcher(a)                S_make_matcher(aTHX_ a)
-#define matcher_matches_sv(a,b)        S_matcher_matches_sv(aTHX_ a,b)
-#define num_overflow           S_num_overflow
-#define path_is_searchable     S_path_is_searchable
-#define run_user_filter(a,b,c) S_run_user_filter(aTHX_ a,b,c)
-#define rxres_free(a)          S_rxres_free(aTHX_ a)
-#define rxres_restore(a,b)     S_rxres_restore(aTHX_ a,b)
-#define save_lines(a,b)                S_save_lines(aTHX_ a,b)
-#  endif
-#  if defined(PERL_IN_PP_HOT_C)
-#define do_oddball(a,b)                S_do_oddball(aTHX_ a,b)
-#define opmethod_stash(a)      S_opmethod_stash(aTHX_ a)
-#define should_we_output_Debug_r(a)    S_should_we_output_Debug_r(aTHX_ a)
-#  endif
-#  if defined(PERL_IN_PP_PACK_C)
-#define div128(a,b)            S_div128(aTHX_ a,b)
-#define first_symbol           S_first_symbol
-#define get_num(a,b)           S_get_num(aTHX_ a,b)
-#define group_end(a,b,c)       S_group_end(aTHX_ a,b,c)
-#define is_an_int(a,b)         S_is_an_int(aTHX_ a,b)
-#define measure_struct(a)      S_measure_struct(aTHX_ a)
-#define mul128(a,b)            S_mul128(aTHX_ a,b)
-#define my_bytes_to_utf8       S_my_bytes_to_utf8
-#define need_utf8              S_need_utf8
-#define next_symbol(a)         S_next_symbol(aTHX_ a)
-#define pack_rec(a,b,c,d)      S_pack_rec(aTHX_ a,b,c,d)
-#define sv_exp_grow(a,b)       S_sv_exp_grow(aTHX_ a,b)
-#define unpack_rec(a,b,c,d,e)  S_unpack_rec(aTHX_ a,b,c,d,e)
-#  endif
-#  if defined(PERL_IN_PP_SORT_C)
-#define amagic_cmp(a,b)                S_amagic_cmp(aTHX_ a,b)
-#define amagic_cmp_desc(a,b)   S_amagic_cmp_desc(aTHX_ a,b)
-#define amagic_i_ncmp(a,b)     S_amagic_i_ncmp(aTHX_ a,b)
-#define amagic_i_ncmp_desc(a,b)        S_amagic_i_ncmp_desc(aTHX_ a,b)
-#define amagic_ncmp(a,b)       S_amagic_ncmp(aTHX_ a,b)
-#define amagic_ncmp_desc(a,b)  S_amagic_ncmp_desc(aTHX_ a,b)
-#define cmp_desc(a,b)          S_cmp_desc(aTHX_ a,b)
-#define sortcv(a,b)            S_sortcv(aTHX_ a,b)
-#define sortcv_stacked(a,b)    S_sortcv_stacked(aTHX_ a,b)
-#define sortcv_xsub(a,b)       S_sortcv_xsub(aTHX_ a,b)
-#define sortsv_flags_impl(a,b,c,d)     S_sortsv_flags_impl(aTHX_ a,b,c,d)
-#define sv_i_ncmp(a,b)         S_sv_i_ncmp(aTHX_ a,b)
-#define sv_i_ncmp_desc(a,b)    S_sv_i_ncmp_desc(aTHX_ a,b)
-#define sv_ncmp(a,b)           S_sv_ncmp(aTHX_ a,b)
-#define sv_ncmp_desc(a,b)      S_sv_ncmp_desc(aTHX_ a,b)
-#    if defined(USE_LOCALE_COLLATE)
-#define amagic_cmp_locale(a,b) S_amagic_cmp_locale(aTHX_ a,b)
-#define amagic_cmp_locale_desc(a,b)    S_amagic_cmp_locale_desc(aTHX_ a,b)
-#define cmp_locale_desc(a,b)   S_cmp_locale_desc(aTHX_ a,b)
-#    endif
-#  endif
-#  if defined(PERL_IN_PP_SYS_C)
-#define doform(a,b,c)          S_doform(aTHX_ a,b,c)
-#define space_join_names_mortal(a)     S_space_join_names_mortal(aTHX_ a)
-#  endif
-#  if defined(PERL_IN_SCOPE_C)
-#define save_pushptri32ptr(a,b,c,d)    S_save_pushptri32ptr(aTHX_ a,b,c,d)
-#define save_scalar_at(a,b)    S_save_scalar_at(aTHX_ a,b)
-#  endif
-#  if defined(PERL_IN_SV_C)
-#define F0convert              S_F0convert
-#define anonymise_cv_maybe(a,b)        S_anonymise_cv_maybe(aTHX_ a,b)
-#define assert_uft8_cache_coherent(a,b,c,d)    S_assert_uft8_cache_coherent(aTHX_ a,b,c,d)
-#define curse(a,b)             S_curse(aTHX_ a,b)
-#define expect_number(a)       S_expect_number(aTHX_ a)
-#define find_array_subscript(a,b)      S_find_array_subscript(aTHX_ a,b)
-#define find_hash_subscript(a,b)       S_find_hash_subscript(aTHX_ a,b)
-#define find_uninit_var(a,b,c,d)       S_find_uninit_var(aTHX_ a,b,c,d)
-#define glob_2number(a)                S_glob_2number(aTHX_ a)
-#define glob_assign_glob(a,b,c)        S_glob_assign_glob(aTHX_ a,b,c)
-#define not_a_number(a)                S_not_a_number(aTHX_ a)
-#define not_incrementable(a)   S_not_incrementable(aTHX_ a)
-#define ptr_table_find         S_ptr_table_find
-#define sv_2iuv_common(a)      S_sv_2iuv_common(aTHX_ a)
-#define sv_add_arena(a,b,c)    S_sv_add_arena(aTHX_ a,b,c)
-#define sv_display(a,b,c)      S_sv_display(aTHX_ a,b,c)
-#define sv_pos_b2u_midway(a,b,c,d)     S_sv_pos_b2u_midway(aTHX_ a,b,c,d)
-#define sv_pos_u2b_cached(a,b,c,d,e,f,g)       S_sv_pos_u2b_cached(aTHX_ a,b,c,d,e,f,g)
-#define sv_pos_u2b_forwards    S_sv_pos_u2b_forwards
-#define sv_pos_u2b_midway      S_sv_pos_u2b_midway
-#define sv_unglob(a,b)         S_sv_unglob(aTHX_ a,b)
-#define uiv_2buf               S_uiv_2buf
-#define utf8_mg_len_cache_update(a,b,c)        S_utf8_mg_len_cache_update(aTHX_ a,b,c)
-#define utf8_mg_pos_cache_update(a,b,c,d,e)    S_utf8_mg_pos_cache_update(aTHX_ a,b,c,d,e)
-#define visit(a,b,c)           S_visit(aTHX_ a,b,c)
-#    if defined(USE_ITHREADS)
-#define sv_dup_common(a,b)     S_sv_dup_common(aTHX_ a,b)
-#define sv_dup_inc_multiple(a,b,c,d)   S_sv_dup_inc_multiple(aTHX_ a,b,c,d)
-#define unreferenced_to_tmp_stack(a)   S_unreferenced_to_tmp_stack(aTHX_ a)
-#    endif
-#  endif
-#  if defined(PERL_IN_SV_C) || defined (PERL_IN_OP_C)
-#define varname(a,b,c,d,e,f)   Perl_varname(aTHX_ a,b,c,d,e,f)
-#  endif
-#  if defined(PERL_IN_TOKE_C)
-#define ao(a)                  S_ao(aTHX_ a)
-#define check_uni()            S_check_uni(aTHX)
-#define checkcomma(a,b,c)      S_checkcomma(aTHX_ a,b,c)
-#define filter_gets(a,b)       S_filter_gets(aTHX_ a,b)
-#define find_in_my_stash(a,b)  S_find_in_my_stash(aTHX_ a,b)
-#define force_ident(a,b)       S_force_ident(aTHX_ a,b)
-#define force_ident_maybe_lex(a)       S_force_ident_maybe_lex(aTHX_ a)
-#define force_next(a)          S_force_next(aTHX_ a)
-#define force_strict_version(a)        S_force_strict_version(aTHX_ a)
-#define force_version(a,b)     S_force_version(aTHX_ a,b)
-#define force_word(a,b,c,d)    S_force_word(aTHX_ a,b,c,d)
-#define get_and_check_backslash_N_name_wrapper(a,b)    S_get_and_check_backslash_N_name_wrapper(aTHX_ a,b)
-#define incline(a,b)           S_incline(aTHX_ a,b)
-#define intuit_method(a,b,c)   S_intuit_method(aTHX_ a,b,c)
-#define intuit_more(a,b)       S_intuit_more(aTHX_ a,b)
-#define lop(a,b,c)             S_lop(aTHX_ a,b,c)
-#define missingterm(a,b)       S_missingterm(aTHX_ a,b)
-#define no_op(a,b)             S_no_op(aTHX_ a,b)
-#define parse_ident(a,b,c,d,e,f,g)     S_parse_ident(aTHX_ a,b,c,d,e,f,g)
-#define pending_ident()                S_pending_ident(aTHX)
-#define scan_const(a)          S_scan_const(aTHX_ a)
-#define scan_formline(a)       S_scan_formline(aTHX_ a)
-#define scan_heredoc(a)                S_scan_heredoc(aTHX_ a)
-#define scan_ident(a,b,c,d)    S_scan_ident(aTHX_ a,b,c,d)
-#define scan_inputsymbol(a)    S_scan_inputsymbol(aTHX_ a)
-#define scan_pat(a,b)          S_scan_pat(aTHX_ a,b)
-#define scan_subst(a)          S_scan_subst(aTHX_ a)
-#define scan_trans(a)          S_scan_trans(aTHX_ a)
-#define sublex_done()          S_sublex_done(aTHX)
-#define sublex_push()          S_sublex_push(aTHX)
-#define sublex_start()         S_sublex_start(aTHX)
-#define swallow_bom(a)         S_swallow_bom(aTHX_ a)
-#define tokenize_use(a,b)      S_tokenize_use(aTHX_ a,b)
-#define tokeq(a)               S_tokeq(aTHX_ a)
-#define update_debugger_info(a,b,c)    S_update_debugger_info(aTHX_ a,b,c)
-#define yywarn(a,b)            S_yywarn(aTHX_ a,b)
-#  endif
-#  if defined(PERL_IN_UNIVERSAL_C)
-#define isa_lookup(a,b,c,d,e)  S_isa_lookup(aTHX_ a,b,c,d,e)
-#define sv_derived_from_svpvn(a,b,c,d,e)       S_sv_derived_from_svpvn(aTHX_ a,b,c,d,e)
-#  endif
-#  if defined(PERL_IN_UTF8_C)
-#define _to_utf8_case(a,b,c,d,e,f,g,h,i)       S__to_utf8_case(aTHX_ a,b,c,d,e,f,g,h,i)
-#define check_locale_boundary_crossing(a,b,c,d)        S_check_locale_boundary_crossing(aTHX_ a,b,c,d)
-#define does_utf8_overflow     S_does_utf8_overflow
-#define isFF_overlong          S_isFF_overlong
-#define is_utf8_common(a,b,c)  S_is_utf8_common(aTHX_ a,b,c)
-#define is_utf8_overlong       S_is_utf8_overlong
-#define new_msg_hv(a,b,c)      S_new_msg_hv(aTHX_ a,b,c)
-#define to_case_cp_list(a,b,c,d,e,f,g,h)       S_to_case_cp_list(aTHX_ a,b,c,d,e,f,g,h)
-#define to_lower_latin1                S_to_lower_latin1
-#define turkic_fc(a,b,c,d)     S_turkic_fc(aTHX_ a,b,c,d)
-#define turkic_lc(a,b,c,d)     S_turkic_lc(aTHX_ a,b,c,d)
-#define turkic_uc(a,b,c,d)     S_turkic_uc(aTHX_ a,b,c,d)
-#define unexpected_non_continuation_text(a,b,c,d)      S_unexpected_non_continuation_text(aTHX_ a,b,c,d)
-#  endif
-#  if defined(PERL_IN_UTF8_C) || defined(PERL_IN_PP_C)
-#define _to_upper_title_latin1(a,b,c,d)        Perl__to_upper_title_latin1(aTHX_ a,b,c,d)
-#  endif
-#  if defined(PERL_IN_UTIL_C)
-#define ckwarn_common(a)       S_ckwarn_common(aTHX_ a)
-#define invoke_exception_hook(a,b)     S_invoke_exception_hook(aTHX_ a,b)
-#define mess_alloc()           S_mess_alloc(aTHX)
-#define with_queued_errors(a)  S_with_queued_errors(aTHX_ a)
-#    if defined(PERL_MEM_LOG) && !defined(PERL_MEM_LOG_NOIMPL)
-#define mem_log_common         S_mem_log_common
-#    endif
-#  endif
-#  if defined(PERL_USES_PL_PIDSTATUS) && defined(PERL_IN_UTIL_C)
-#define pidgone(a,b)           S_pidgone(aTHX_ a,b)
-#  endif
-#  if defined(PERL_USE_3ARG_SIGHANDLER)
-#define sighandler             Perl_sighandler
-#  endif
-#  if defined(USE_C_BACKTRACE)
-#define get_c_backtrace(a,b)   Perl_get_c_backtrace(aTHX_ a,b)
-#  endif
-#  if defined(USE_ITHREADS)
-#define mro_meta_dup(a,b)      Perl_mro_meta_dup(aTHX_ a,b)
-#define padlist_dup(a,b)       Perl_padlist_dup(aTHX_ a,b)
-#define padname_dup(a,b)       Perl_padname_dup(aTHX_ a,b)
-#define padnamelist_dup(a,b)   Perl_padnamelist_dup(aTHX_ a,b)
-#  endif
-#  if defined(USE_LOCALE_COLLATE)
-#define magic_freecollxfrm(a,b)        Perl_magic_freecollxfrm(aTHX_ a,b)
-#define magic_setcollxfrm(a,b) Perl_magic_setcollxfrm(aTHX_ a,b)
-#ifndef NO_MATHOMS
-#define mem_collxfrm(a,b,c)    Perl_mem_collxfrm(aTHX_ a,b,c)
-#endif
-#  endif
-#  if defined(USE_PERLIO)
-#define PerlIO_restore_errno(a)        Perl_PerlIO_restore_errno(aTHX_ a)
-#define PerlIO_save_errno(a)   Perl_PerlIO_save_errno(aTHX_ a)
-#  endif
-#  if defined(USE_QUADMATH)
-#define quadmath_format_needed Perl_quadmath_format_needed
-#define quadmath_format_valid  Perl_quadmath_format_valid
-#  endif
-#  if defined(_MSC_VER)
-#define magic_regdatum_set(a,b)        Perl_magic_regdatum_set(aTHX_ a,b)
-#  endif
-#endif
-
-#endif /* #ifndef PERL_NO_SHORT_NAMES */
-
+#if !defined(MULTIPLICITY)
+/* undefined symbols, point them back at the usual ones */
+# define Perl_croak_nocontext                   Perl_croak
+# define Perl_deb_nocontext                     Perl_deb
+# define Perl_die_nocontext                     Perl_die
+# define Perl_form_nocontext                    Perl_form
+# define Perl_load_module_nocontext             Perl_load_module
+# define Perl_mess_nocontext                    Perl_mess
+# define Perl_newSVpvf_nocontext                Perl_newSVpvf
+# define Perl_sv_catpvf_nocontext               Perl_sv_catpvf
+# define Perl_sv_catpvf_mg_nocontext            Perl_sv_catpvf_mg
+# define Perl_sv_setpvf_nocontext               Perl_sv_setpvf
+# define Perl_sv_setpvf_mg_nocontext            Perl_sv_setpvf_mg
+# define Perl_warn_nocontext                    Perl_warn
+# define Perl_warner_nocontext                  Perl_warner
+#endif /* !defined(MULTIPLICITY) */
+#if !defined(PERL_CORE)
 /* Compatibility stubs.  Compile extensions with -DPERL_NOCOMPAT to
  disable them.
* disable them.
  */
-
-#if !defined(PERL_CORE)
-#  define sv_setptrobj(rv,ptr,name)    sv_setref_iv(rv,name,PTR2IV(ptr))
-#  define sv_setptrref(rv,ptr)         sv_setref_iv(rv,NULL,PTR2IV(ptr))
-#endif
-
-#if !defined(PERL_CORE) && !defined(PERL_NOCOMPAT)
+# define sv_setptrobj(rv,ptr,name)              sv_setref_iv(rv,name,PTR2IV(ptr))
+# define sv_setptrref(rv,ptr)                   sv_setref_iv(rv,NULL,PTR2IV(ptr))
+# if !defined(PERL_NOCOMPAT)
 
 /* Compatibility for various misnamed functions.  All functions
    in the API that begin with "perl_" (not "Perl_") take an explicit
    The following are not like that, but since they had a "perl_"
    prefix in previous versions, we provide compatibility macros.
  */
-#  define perl_atexit(a,b)             call_atexit(a,b)
-#  define perl_call_argv(a,b,c)                call_argv(a,b,c)
-#  define perl_call_method(a,b)                call_method(a,b)
-#  define perl_call_pv(a,b)            call_pv(a,b)
-#  define perl_call_sv(a,b)            call_sv(a,b)
-#  define perl_eval_pv(a,b)            eval_pv(a,b)
-#  define perl_eval_sv(a,b)            eval_sv(a,b)
-#  define perl_get_av(a,b)             get_av(a,b)
-#  define perl_get_cv(a,b)             get_cv(a,b)
-#  define perl_get_hv(a,b)             get_hv(a,b)
-#  define perl_get_sv(a,b)             get_sv(a,b)
-#  define perl_init_i18nl10n(a)                init_i18nl10n(a)
-#  define perl_init_i18nl14n(a)                init_i18nl14n(a)
-#  define perl_require_pv(a)           require_pv(a)
+#   define perl_atexit(a,b)                     call_atexit(a,b)
+#   define perl_call_argv(a,b,c)                call_argv(a,b,c)
+#   define perl_call_method(a,b)                call_method(a,b)
+#   define perl_call_pv(a,b)                    call_pv(a,b)
+#   define perl_call_sv(a,b)                    call_sv(a,b)
+#   define perl_eval_pv(a,b)                    eval_pv(a,b)
+#   define perl_eval_sv(a,b)                    eval_sv(a,b)
+#   define perl_get_av(a,b)                     get_av(a,b)
+#   define perl_get_cv(a,b)                     get_cv(a,b)
+#   define perl_get_hv(a,b)                     get_hv(a,b)
+#   define perl_get_sv(a,b)                     get_sv(a,b)
+#   define perl_init_i18nl10n(a)                init_i18nl10n(a)
+#   define perl_require_pv(a)                   require_pv(a)
 
 /* varargs functions can't be handled with CPP macros. :-(
    This provides a set of compatibility functions that don't take
    an extra argument but grab the context pointer using the macro
    dTHX.
  */
-#if defined(MULTIPLICITY) && !defined(PERL_NO_SHORT_NAMES)
-#  define croak                        Perl_croak_nocontext
-#  define deb                  Perl_deb_nocontext
-#  define die                  Perl_die_nocontext
-#  define form                 Perl_form_nocontext
-#  define load_module          Perl_load_module_nocontext
-#  define mess                 Perl_mess_nocontext
-#  define newSVpvf             Perl_newSVpvf_nocontext
-#  define sv_catpvf            Perl_sv_catpvf_nocontext
-#  define sv_catpvf_mg         Perl_sv_catpvf_mg_nocontext
-#  define sv_setpvf            Perl_sv_setpvf_nocontext
-#  define sv_setpvf_mg         Perl_sv_setpvf_mg_nocontext
-#  define warn                 Perl_warn_nocontext
-#  define warner               Perl_warner_nocontext
-#endif
 
-#endif /* !defined(PERL_CORE) && !defined(PERL_NOCOMPAT) */
+#   if defined(MULTIPLICITY) && !defined(PERL_NO_SHORT_NAMES)
+#     define croak                              Perl_croak_nocontext
+#     define deb                                Perl_deb_nocontext
+#     define die                                Perl_die_nocontext
+#     define form                               Perl_form_nocontext
+#     define load_module                        Perl_load_module_nocontext
+#     define mess                               Perl_mess_nocontext
+#     define newSVpvf                           Perl_newSVpvf_nocontext
+#     define sv_catpvf                          Perl_sv_catpvf_nocontext
+#     define sv_catpvf_mg                       Perl_sv_catpvf_mg_nocontext
+#     define sv_setpvf                          Perl_sv_setpvf_nocontext
+#     define sv_setpvf_mg                       Perl_sv_setpvf_mg_nocontext
+#     define warn                               Perl_warn_nocontext
+#     define warner                             Perl_warner_nocontext
+#   endif /* defined(MULTIPLICITY) && !defined(PERL_NO_SHORT_NAMES) */
+# endif /* !defined(PERL_NOCOMPAT) */
+#endif /* !defined(PERL_CORE) */
+#if !defined(PERL_NO_SHORT_NAMES)
 
-#if !defined(MULTIPLICITY)
-/* undefined symbols, point them back at the usual ones */
-#  define Perl_croak_nocontext Perl_croak
-#  define Perl_deb_nocontext   Perl_deb
-#  define Perl_die_nocontext   Perl_die
-#  define Perl_form_nocontext  Perl_form
-#  define Perl_load_module_nocontext   Perl_load_module
-#  define Perl_mess_nocontext  Perl_mess
-#  define Perl_newSVpvf_nocontext      Perl_newSVpvf
-#  define Perl_sv_catpvf_nocontext     Perl_sv_catpvf
-#  define Perl_sv_catpvf_mg_nocontext  Perl_sv_catpvf_mg
-#  define Perl_sv_setpvf_nocontext     Perl_sv_setpvf
-#  define Perl_sv_setpvf_mg_nocontext  Perl_sv_setpvf_mg
-#  define Perl_warn_nocontext  Perl_warn
-#  define Perl_warner_nocontext        Perl_warner
-#endif
+/* Hide global symbols */
+
+# define Gv_AMupdate(a,b)                       Perl_Gv_AMupdate(aTHX_ a,b)
+# define SvAMAGIC_off                           Perl_SvAMAGIC_off
+# define SvAMAGIC_on                            Perl_SvAMAGIC_on
+# define SvGETMAGIC(a)                          Perl_SvGETMAGIC(aTHX_ a)
+# define SvIV(a)                                Perl_SvIV(aTHX_ a)
+# define SvIV_nomg(a)                           Perl_SvIV_nomg(aTHX_ a)
+# define SvNV(a)                                Perl_SvNV(aTHX_ a)
+# define SvNV_nomg(a)                           Perl_SvNV_nomg(aTHX_ a)
+# define SvPVXtrue(a)                           Perl_SvPVXtrue(aTHX_ a)
+# define SvREFCNT_dec_ret_NULL(a)               Perl_SvREFCNT_dec_ret_NULL(aTHX_ a)
+# define SvTRUE(a)                              Perl_SvTRUE(aTHX_ a)
+# define SvTRUE_NN(a)                           Perl_SvTRUE_NN(aTHX_ a)
+# define SvTRUE_common(a,b)                     Perl_SvTRUE_common(aTHX_ a,b)
+# define SvTRUE_nomg(a)                         Perl_SvTRUE_nomg(aTHX_ a)
+# define SvUV(a)                                Perl_SvUV(aTHX_ a)
+# define SvUV_nomg(a)                           Perl_SvUV_nomg(aTHX_ a)
+# define _force_out_malformed_utf8_message(a,b,c,d) Perl__force_out_malformed_utf8_message(aTHX_ a,b,c,d)
+# define _is_in_locale_category(a,b)            Perl__is_in_locale_category(aTHX_ a,b)
+# define _is_uni_FOO(a,b)                       Perl__is_uni_FOO(aTHX_ a,b)
+# define _is_uni_perl_idcont(a)                 Perl__is_uni_perl_idcont(aTHX_ a)
+# define _is_uni_perl_idstart(a)                Perl__is_uni_perl_idstart(aTHX_ a)
+# define _is_utf8_FOO(a,b,c)                    Perl__is_utf8_FOO(aTHX_ a,b,c)
+# define _is_utf8_perl_idcont(a,b)              Perl__is_utf8_perl_idcont(aTHX_ a,b)
+# define _is_utf8_perl_idstart(a,b)             Perl__is_utf8_perl_idstart(aTHX_ a,b)
+# define _to_uni_fold_flags(a,b,c,d)            Perl__to_uni_fold_flags(aTHX_ a,b,c,d)
+# define _to_utf8_fold_flags(a,b,c,d,e)         Perl__to_utf8_fold_flags(aTHX_ a,b,c,d,e)
+# define _to_utf8_lower_flags(a,b,c,d,e)        Perl__to_utf8_lower_flags(aTHX_ a,b,c,d,e)
+# define _to_utf8_title_flags(a,b,c,d,e)        Perl__to_utf8_title_flags(aTHX_ a,b,c,d,e)
+# define _to_utf8_upper_flags(a,b,c,d,e)        Perl__to_utf8_upper_flags(aTHX_ a,b,c,d,e)
+# 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)
+# define apply_attrs_string(a,b,c,d)            Perl_apply_attrs_string(aTHX_ a,b,c,d)
+# define apply_builtin_cv_attributes(a,b)       Perl_apply_builtin_cv_attributes(aTHX_ a,b)
+# define atfork_lock                            Perl_atfork_lock
+# define atfork_unlock                          Perl_atfork_unlock
+# define av_clear(a)                            Perl_av_clear(aTHX_ a)
+# define av_count(a)                            Perl_av_count(aTHX_ a)
+# define av_delete(a,b,c)                       Perl_av_delete(aTHX_ a,b,c)
+# define av_dump(a)                             Perl_av_dump(aTHX_ a)
+# define av_exists(a,b)                         Perl_av_exists(aTHX_ a,b)
+# define av_extend(a,b)                         Perl_av_extend(aTHX_ a,b)
+# define av_fetch(a,b,c)                        Perl_av_fetch(aTHX_ a,b,c)
+# define av_fetch_simple(a,b,c)                 Perl_av_fetch_simple(aTHX_ a,b,c)
+# define av_fill(a,b)                           Perl_av_fill(aTHX_ a,b)
+# define av_len(a)                              Perl_av_len(aTHX_ a)
+# define av_make(a,b)                           Perl_av_make(aTHX_ a,b)
+# define av_new_alloc(a,b)                      Perl_av_new_alloc(aTHX_ a,b)
+# define av_pop(a)                              Perl_av_pop(aTHX_ a)
+# define av_push(a,b)                           Perl_av_push(aTHX_ a,b)
+# define av_push_simple(a,b)                    Perl_av_push_simple(aTHX_ a,b)
+# define av_shift(a)                            Perl_av_shift(aTHX_ a)
+# define av_store(a,b,c)                        Perl_av_store(aTHX_ a,b,c)
+# define av_store_simple(a,b,c)                 Perl_av_store_simple(aTHX_ a,b,c)
+# define av_undef(a)                            Perl_av_undef(aTHX_ a)
+# define av_unshift(a,b)                        Perl_av_unshift(aTHX_ a,b)
+# define block_end(a,b)                         Perl_block_end(aTHX_ a,b)
+# define block_gimme()                          Perl_block_gimme(aTHX)
+# define block_start(a)                         Perl_block_start(aTHX_ a)
+# define bytes_cmp_utf8(a,b,c,d)                Perl_bytes_cmp_utf8(aTHX_ a,b,c,d)
+# define bytes_from_utf8_loc                    Perl_bytes_from_utf8_loc
+# define bytes_to_utf8(a,b)                     Perl_bytes_to_utf8(aTHX_ a,b)
+# define call_argv(a,b,c)                       Perl_call_argv(aTHX_ a,b,c)
+# define call_atexit(a,b)                       Perl_call_atexit(aTHX_ a,b)
+# define call_list(a,b)                         Perl_call_list(aTHX_ a,b)
+# define call_method(a,b)                       Perl_call_method(aTHX_ a,b)
+# define call_pv(a,b)                           Perl_call_pv(aTHX_ a,b)
+# define call_sv(a,b)                           Perl_call_sv(aTHX_ a,b)
+# define caller_cx(a,b)                         Perl_caller_cx(aTHX_ a,b)
+# define cast_i32                               Perl_cast_i32
+# define cast_iv                                Perl_cast_iv
+# define cast_ulong                             Perl_cast_ulong
+# define cast_uv                                Perl_cast_uv
+# define ck_entersub_args_list(a)               Perl_ck_entersub_args_list(aTHX_ a)
+# define ck_entersub_args_proto(a,b,c)          Perl_ck_entersub_args_proto(aTHX_ a,b,c)
+# define ck_entersub_args_proto_or_list(a,b,c)  Perl_ck_entersub_args_proto_or_list(aTHX_ a,b,c)
+# define clear_defarray(a,b)                    Perl_clear_defarray(aTHX_ a,b)
+# define cop_fetch_label(a,b,c)                 Perl_cop_fetch_label(aTHX_ a,b,c)
+# define cop_store_label(a,b,c,d)               Perl_cop_store_label(aTHX_ a,b,c,d)
+# define croak_memory_wrap                      Perl_croak_memory_wrap
+# define croak_no_modify                        Perl_croak_no_modify
+# define croak_sv(a)                            Perl_croak_sv(aTHX_ a)
+# define croak_xs_usage                         Perl_croak_xs_usage
+# define csighandler1                           Perl_csighandler1
+# define csighandler3                           Perl_csighandler3
+# define cv_clone(a)                            Perl_cv_clone(aTHX_ a)
+# define cv_const_sv                            Perl_cv_const_sv
+# define cv_get_call_checker(a,b,c)             Perl_cv_get_call_checker(aTHX_ a,b,c)
+# define cv_get_call_checker_flags(a,b,c,d,e)   Perl_cv_get_call_checker_flags(aTHX_ a,b,c,d,e)
+# define cv_name(a,b,c)                         Perl_cv_name(aTHX_ a,b,c)
+# define cv_set_call_checker(a,b,c)             Perl_cv_set_call_checker(aTHX_ a,b,c)
+# define cv_set_call_checker_flags(a,b,c,d)     Perl_cv_set_call_checker_flags(aTHX_ a,b,c,d)
+# define cv_undef(a)                            Perl_cv_undef(aTHX_ a)
+# define cx_dump(a)                             Perl_cx_dump(aTHX_ a)
+# define cxinc()                                Perl_cxinc(aTHX)
+# define debop(a)                               Perl_debop(aTHX_ a)
+# define debprofdump()                          Perl_debprofdump(aTHX)
+# define debstack()                             Perl_debstack(aTHX)
+# define debstackptrs()                         Perl_debstackptrs(aTHX)
+# define delimcpy                               Perl_delimcpy
+# define despatch_signals()                     Perl_despatch_signals(aTHX)
+# define die_sv(a)                              Perl_die_sv(aTHX_ a)
+# define do_close(a,b)                          Perl_do_close(aTHX_ a,b)
+# define do_gv_dump(a,b,c,d)                    Perl_do_gv_dump(aTHX_ a,b,c,d)
+# define do_gvgv_dump(a,b,c,d)                  Perl_do_gvgv_dump(aTHX_ a,b,c,d)
+# define do_hv_dump(a,b,c,d)                    Perl_do_hv_dump(aTHX_ a,b,c,d)
+# define do_join(a,b,c,d)                       Perl_do_join(aTHX_ a,b,c,d)
+# define do_magic_dump(a,b,c,d,e,f,g)           Perl_do_magic_dump(aTHX_ a,b,c,d,e,f,g)
+# define do_op_dump(a,b,c)                      Perl_do_op_dump(aTHX_ a,b,c)
+# define do_openn(a,b,c,d,e,f,g,h,i)            Perl_do_openn(aTHX_ a,b,c,d,e,f,g,h,i)
+# define do_pmop_dump(a,b,c)                    Perl_do_pmop_dump(aTHX_ a,b,c)
+# define do_sprintf(a,b,c)                      Perl_do_sprintf(aTHX_ a,b,c)
+# define do_sv_dump(a,b,c,d,e,f,g)              Perl_do_sv_dump(aTHX_ a,b,c,d,e,f,g)
+# define doing_taint                            Perl_doing_taint
+# define doref(a,b,c)                           Perl_doref(aTHX_ a,b,c)
+# define dounwind(a)                            Perl_dounwind(aTHX_ a)
+# define dowantarray()                          Perl_dowantarray(aTHX)
+# define dump_all()                             Perl_dump_all(aTHX)
+# define dump_eval()                            Perl_dump_eval(aTHX)
+# define dump_form(a)                           Perl_dump_form(aTHX_ a)
+# define dump_packsubs(a)                       Perl_dump_packsubs(aTHX_ a)
+# define dump_sub(a)                            Perl_dump_sub(aTHX_ a)
+# define dump_vindent(a,b,c,d)                  Perl_dump_vindent(aTHX_ a,b,c,d)
+# define eval_pv(a,b)                           Perl_eval_pv(aTHX_ a,b)
+# define eval_sv(a,b)                           Perl_eval_sv(aTHX_ a,b)
+# define fbm_compile(a,b)                       Perl_fbm_compile(aTHX_ a,b)
+# define fbm_instr(a,b,c,d)                     Perl_fbm_instr(aTHX_ a,b,c,d)
+# define filter_add(a,b)                        Perl_filter_add(aTHX_ a,b)
+# define filter_del(a)                          Perl_filter_del(aTHX_ a)
+# define filter_read(a,b,c)                     Perl_filter_read(aTHX_ a,b,c)
+# define find_runcv(a)                          Perl_find_runcv(aTHX_ a)
+# define find_rundefsv()                        Perl_find_rundefsv(aTHX)
+# define foldEQ(a,b,c)                          Perl_foldEQ(aTHX_ a,b,c)
+# define foldEQ_latin1(a,b,c)                   Perl_foldEQ_latin1(aTHX_ a,b,c)
+# define foldEQ_locale(a,b,c)                   Perl_foldEQ_locale(aTHX_ a,b,c)
+# define foldEQ_utf8_flags(a,b,c,d,e,f,g,h,i)   Perl_foldEQ_utf8_flags(aTHX_ a,b,c,d,e,f,g,h,i)
+# define forbid_outofblock_ops(a,b)             Perl_forbid_outofblock_ops(aTHX_ a,b)
+# define free_tmps()                            Perl_free_tmps(aTHX)
+# define get_av(a,b)                            Perl_get_av(aTHX_ a,b)
+# define get_cv(a,b)                            Perl_get_cv(aTHX_ a,b)
+# define get_cvn_flags(a,b,c)                   Perl_get_cvn_flags(aTHX_ a,b,c)
+# define get_hv(a,b)                            Perl_get_hv(aTHX_ a,b)
+# define get_op_descs()                         Perl_get_op_descs(aTHX)
+# define get_op_names()                         Perl_get_op_names(aTHX)
+# define get_ppaddr()                           Perl_get_ppaddr(aTHX)
+# define get_sv(a,b)                            Perl_get_sv(aTHX_ a,b)
+# define get_vtbl(a)                            Perl_get_vtbl(aTHX_ a)
+# define getcwd_sv(a)                           Perl_getcwd_sv(aTHX_ a)
+# define gp_free(a)                             Perl_gp_free(aTHX_ a)
+# define gp_ref(a)                              Perl_gp_ref(aTHX_ a)
+# define grok_atoUV                             Perl_grok_atoUV
+# define grok_bin_oct_hex(a,b,c,d,e,f,g)        Perl_grok_bin_oct_hex(aTHX_ a,b,c,d,e,f,g)
+# define grok_infnan(a,b)                       Perl_grok_infnan(aTHX_ a,b)
+# define grok_number(a,b,c)                     Perl_grok_number(aTHX_ a,b,c)
+# define grok_number_flags(a,b,c,d)             Perl_grok_number_flags(aTHX_ a,b,c,d)
+# define grok_numeric_radix(a,b)                Perl_grok_numeric_radix(aTHX_ a,b)
+# define gv_add_by_type(a,b)                    Perl_gv_add_by_type(aTHX_ a,b)
+# define gv_autoload_pv(a,b,c)                  Perl_gv_autoload_pv(aTHX_ a,b,c)
+# define gv_autoload_pvn(a,b,c,d)               Perl_gv_autoload_pvn(aTHX_ a,b,c,d)
+# define gv_autoload_sv(a,b,c)                  Perl_gv_autoload_sv(aTHX_ a,b,c)
+# define gv_check(a)                            Perl_gv_check(aTHX_ a)
+# define gv_const_sv(a)                         Perl_gv_const_sv(aTHX_ a)
+# define gv_dump(a)                             Perl_gv_dump(aTHX_ a)
+# define gv_efullname4(a,b,c,d)                 Perl_gv_efullname4(aTHX_ a,b,c,d)
+# define gv_fetchfile(a)                        Perl_gv_fetchfile(aTHX_ a)
+# define gv_fetchfile_flags(a,b,c)              Perl_gv_fetchfile_flags(aTHX_ a,b,c)
+# define gv_fetchmeth_pv(a,b,c,d)               Perl_gv_fetchmeth_pv(aTHX_ a,b,c,d)
+# define gv_fetchmeth_pv_autoload(a,b,c,d)      Perl_gv_fetchmeth_pv_autoload(aTHX_ a,b,c,d)
+# define gv_fetchmeth_pvn(a,b,c,d,e)            Perl_gv_fetchmeth_pvn(aTHX_ a,b,c,d,e)
+# define gv_fetchmeth_pvn_autoload(a,b,c,d,e)   Perl_gv_fetchmeth_pvn_autoload(aTHX_ a,b,c,d,e)
+# define gv_fetchmeth_sv(a,b,c,d)               Perl_gv_fetchmeth_sv(aTHX_ a,b,c,d)
+# define gv_fetchmeth_sv_autoload(a,b,c,d)      Perl_gv_fetchmeth_sv_autoload(aTHX_ a,b,c,d)
+# define gv_fetchmethod_autoload(a,b,c)         Perl_gv_fetchmethod_autoload(aTHX_ a,b,c)
+# define gv_fetchmethod_pv_flags(a,b,c)         Perl_gv_fetchmethod_pv_flags(aTHX_ a,b,c)
+# define gv_fetchmethod_pvn_flags(a,b,c,d)      Perl_gv_fetchmethod_pvn_flags(aTHX_ a,b,c,d)
+# define gv_fetchmethod_sv_flags(a,b,c)         Perl_gv_fetchmethod_sv_flags(aTHX_ a,b,c)
+# define gv_fetchpv(a,b,c)                      Perl_gv_fetchpv(aTHX_ a,b,c)
+# define gv_fetchpvn_flags(a,b,c,d)             Perl_gv_fetchpvn_flags(aTHX_ a,b,c,d)
+# define gv_fetchsv(a,b,c)                      Perl_gv_fetchsv(aTHX_ a,b,c)
+# define gv_fullname4(a,b,c,d)                  Perl_gv_fullname4(aTHX_ a,b,c,d)
+# define gv_handler(a,b)                        Perl_gv_handler(aTHX_ a,b)
+# define gv_init_pv(a,b,c,d)                    Perl_gv_init_pv(aTHX_ a,b,c,d)
+# define gv_init_pvn(a,b,c,d,e)                 Perl_gv_init_pvn(aTHX_ a,b,c,d,e)
+# define gv_init_sv(a,b,c,d)                    Perl_gv_init_sv(aTHX_ a,b,c,d)
+# define gv_name_set(a,b,c,d)                   Perl_gv_name_set(aTHX_ a,b,c,d)
+# define gv_stashpv(a,b)                        Perl_gv_stashpv(aTHX_ a,b)
+# define gv_stashpvn(a,b,c)                     Perl_gv_stashpvn(aTHX_ a,b,c)
+# define gv_stashsv(a,b)                        Perl_gv_stashsv(aTHX_ a,b)
+# define hv_bucket_ratio(a)                     Perl_hv_bucket_ratio(aTHX_ a)
+# define hv_clear(a)                            Perl_hv_clear(aTHX_ a)
+# define hv_clear_placeholders(a)               Perl_hv_clear_placeholders(aTHX_ a)
+# define hv_common(a,b,c,d,e,f,g,h)             Perl_hv_common(aTHX_ a,b,c,d,e,f,g,h)
+# define hv_common_key_len(a,b,c,d,e,f)         Perl_hv_common_key_len(aTHX_ a,b,c,d,e,f)
+# define hv_copy_hints_hv(a)                    Perl_hv_copy_hints_hv(aTHX_ a)
+# define hv_delayfree_ent(a,b)                  Perl_hv_delayfree_ent(aTHX_ a,b)
+# define hv_dump(a)                             Perl_hv_dump(aTHX_ a)
+# define hv_free_ent(a,b)                       Perl_hv_free_ent(aTHX_ a,b)
+# define hv_iterinit(a)                         Perl_hv_iterinit(aTHX_ a)
+# define hv_iterkey(a,b)                        Perl_hv_iterkey(aTHX_ a,b)
+# define hv_iterkeysv(a)                        Perl_hv_iterkeysv(aTHX_ a)
+# define hv_iternext_flags(a,b)                 Perl_hv_iternext_flags(aTHX_ a,b)
+# define hv_iternextsv(a,b,c)                   Perl_hv_iternextsv(aTHX_ a,b,c)
+# define hv_iterval(a,b)                        Perl_hv_iterval(aTHX_ a,b)
+# define hv_ksplit(a,b)                         Perl_hv_ksplit(aTHX_ a,b)
+# define hv_name_set(a,b,c,d)                   Perl_hv_name_set(aTHX_ a,b,c,d)
+# define hv_rand_set(a,b)                       Perl_hv_rand_set(aTHX_ a,b)
+# define hv_scalar(a)                           Perl_hv_scalar(aTHX_ a)
+# define init_i18nl10n(a)                       Perl_init_i18nl10n(aTHX_ a)
+# define init_stacks()                          Perl_init_stacks(aTHX)
+# define init_tm(a)                             Perl_init_tm(aTHX_ a)
+# define intro_my()                             Perl_intro_my(aTHX)
+# define isC9_STRICT_UTF8_CHAR                  Perl_isC9_STRICT_UTF8_CHAR
+# define isSTRICT_UTF8_CHAR                     Perl_isSTRICT_UTF8_CHAR
+# define isUTF8_CHAR                            Perl_isUTF8_CHAR
+# define isUTF8_CHAR_flags                      Perl_isUTF8_CHAR_flags
+# define is_c9strict_utf8_string_loclen         Perl_is_c9strict_utf8_string_loclen
+# define is_lvalue_sub()                        Perl_is_lvalue_sub(aTHX)
+# define is_safe_syscall(a,b,c,d)               Perl_is_safe_syscall(aTHX_ a,b,c,d)
+# define is_strict_utf8_string_loclen           Perl_is_strict_utf8_string_loclen
+# define is_utf8_FF_helper_                     Perl_is_utf8_FF_helper_
+# define is_utf8_char_helper_                   Perl_is_utf8_char_helper_
+# define is_utf8_fixed_width_buf_loclen_flags   Perl_is_utf8_fixed_width_buf_loclen_flags
+# define is_utf8_invariant_string_loc           Perl_is_utf8_invariant_string_loc
+# define is_utf8_string_flags                   Perl_is_utf8_string_flags
+# define is_utf8_string_loclen                  Perl_is_utf8_string_loclen
+# define is_utf8_string_loclen_flags            Perl_is_utf8_string_loclen_flags
+# define is_utf8_valid_partial_char_flags       Perl_is_utf8_valid_partial_char_flags
+# define isinfnan                               Perl_isinfnan
+# define leave_adjust_stacks(a,b,c,d)           Perl_leave_adjust_stacks(aTHX_ a,b,c,d)
+# define leave_scope(a)                         Perl_leave_scope(aTHX_ a)
+# define lex_bufutf8()                          Perl_lex_bufutf8(aTHX)
+# define lex_discard_to(a)                      Perl_lex_discard_to(aTHX_ a)
+# define lex_grow_linestr(a)                    Perl_lex_grow_linestr(aTHX_ a)
+# define lex_next_chunk(a)                      Perl_lex_next_chunk(aTHX_ a)
+# define lex_peek_unichar(a)                    Perl_lex_peek_unichar(aTHX_ a)
+# define lex_read_space(a)                      Perl_lex_read_space(aTHX_ a)
+# define lex_read_to(a)                         Perl_lex_read_to(aTHX_ a)
+# define lex_read_unichar(a)                    Perl_lex_read_unichar(aTHX_ a)
+# define lex_start(a,b,c)                       Perl_lex_start(aTHX_ a,b,c)
+# define lex_stuff_pv(a,b)                      Perl_lex_stuff_pv(aTHX_ a,b)
+# define lex_stuff_pvn(a,b,c)                   Perl_lex_stuff_pvn(aTHX_ a,b,c)
+# define lex_stuff_sv(a,b)                      Perl_lex_stuff_sv(aTHX_ a,b)
+# define lex_unstuff(a)                         Perl_lex_unstuff(aTHX_ a)
+# define looks_like_number(a)                   Perl_looks_like_number(aTHX_ a)
+# define lsbit_pos32                            Perl_lsbit_pos32
+# define magic_dump(a)                          Perl_magic_dump(aTHX_ a)
+# define markstack_grow()                       Perl_markstack_grow(aTHX)
+# define mess_sv(a,b)                           Perl_mess_sv(aTHX_ a,b)
+# define mg_clear(a)                            Perl_mg_clear(aTHX_ a)
+# define mg_copy(a,b,c,d)                       Perl_mg_copy(aTHX_ a,b,c,d)
+# define mg_find                                Perl_mg_find
+# define mg_findext                             Perl_mg_findext
+# define mg_free(a)                             Perl_mg_free(aTHX_ a)
+# define mg_free_type(a,b)                      Perl_mg_free_type(aTHX_ a,b)
+# define mg_freeext(a,b,c)                      Perl_mg_freeext(aTHX_ a,b,c)
+# define mg_get(a)                              Perl_mg_get(aTHX_ a)
+# define mg_magical                             Perl_mg_magical
+# define mg_set(a)                              Perl_mg_set(aTHX_ a)
+# define mg_size(a)                             Perl_mg_size(aTHX_ a)
+# define mini_mktime                            Perl_mini_mktime
+# define moreswitches(a)                        Perl_moreswitches(aTHX_ a)
+# define mortal_destructor_sv(a,b)              Perl_mortal_destructor_sv(aTHX_ a,b)
+# define mortal_getenv                          Perl_mortal_getenv
+# define mortal_svfunc_x(a,b)                   Perl_mortal_svfunc_x(aTHX_ a,b)
+# define mro_get_linear_isa(a)                  Perl_mro_get_linear_isa(aTHX_ a)
+# define mro_method_changed_in(a)               Perl_mro_method_changed_in(aTHX_ a)
+# define msbit_pos32                            Perl_msbit_pos32
+# define my_atof(a)                             Perl_my_atof(aTHX_ a)
+# define my_atof3(a,b,c)                        Perl_my_atof3(aTHX_ a,b,c)
+# define my_dirfd                               Perl_my_dirfd
+# define my_exit(a)                             Perl_my_exit(aTHX_ a)
+# define my_failure_exit()                      Perl_my_failure_exit(aTHX)
+# define my_fflush_all()                        Perl_my_fflush_all(aTHX)
+# define my_fork                                Perl_my_fork
+# define my_popen_list(a,b,c)                   Perl_my_popen_list(aTHX_ a,b,c)
+# define my_setenv(a,b)                         Perl_my_setenv(aTHX_ a,b)
+# define my_socketpair                          Perl_my_socketpair
+# define my_strftime(a,b,c,d,e,f,g,h,i,j)       Perl_my_strftime(aTHX_ a,b,c,d,e,f,g,h,i,j)
+# define my_strtod                              Perl_my_strtod
+# define newANONATTRSUB(a,b,c,d)                Perl_newANONATTRSUB(aTHX_ a,b,c,d)
+# define newANONHASH(a)                         Perl_newANONHASH(aTHX_ a)
+# define newANONLIST(a)                         Perl_newANONLIST(aTHX_ a)
+# define newANONSUB(a,b,c)                      Perl_newANONSUB(aTHX_ a,b,c)
+# define newARGDEFELEMOP(a,b,c)                 Perl_newARGDEFELEMOP(aTHX_ a,b,c)
+# define newASSIGNOP(a,b,c,d)                   Perl_newASSIGNOP(aTHX_ a,b,c,d)
+# define newAVREF(a)                            Perl_newAVREF(aTHX_ a)
+# define newAVav(a)                             Perl_newAVav(aTHX_ a)
+# define newAVhv(a)                             Perl_newAVhv(aTHX_ a)
+# define newBINOP(a,b,c,d)                      Perl_newBINOP(aTHX_ a,b,c,d)
+# define newCONDOP(a,b,c,d)                     Perl_newCONDOP(aTHX_ a,b,c,d)
+# define newCONSTSUB(a,b,c)                     Perl_newCONSTSUB(aTHX_ a,b,c)
+# define newCONSTSUB_flags(a,b,c,d,e)           Perl_newCONSTSUB_flags(aTHX_ a,b,c,d,e)
+# define newCVREF(a,b)                          Perl_newCVREF(aTHX_ a,b)
+# define newDEFEROP(a,b)                        Perl_newDEFEROP(aTHX_ a,b)
+# define newDEFSVOP()                           Perl_newDEFSVOP(aTHX)
+# define newFORM(a,b,c)                         Perl_newFORM(aTHX_ a,b,c)
+# define newFOROP(a,b,c,d,e)                    Perl_newFOROP(aTHX_ a,b,c,d,e)
+# define newGIVENOP(a,b,c)                      Perl_newGIVENOP(aTHX_ a,b,c)
+# define newGVOP(a,b,c)                         Perl_newGVOP(aTHX_ a,b,c)
+# define newGVREF(a,b)                          Perl_newGVREF(aTHX_ a,b)
+# define newGVgen_flags(a,b)                    Perl_newGVgen_flags(aTHX_ a,b)
+# define newHVREF(a)                            Perl_newHVREF(aTHX_ a)
+# define newHVhv(a)                             Perl_newHVhv(aTHX_ a)
+# define newLISTOP(a,b,c,d)                     Perl_newLISTOP(aTHX_ a,b,c,d)
+# define newLOGOP(a,b,c,d)                      Perl_newLOGOP(aTHX_ a,b,c,d)
+# define newLOOPEX(a,b)                         Perl_newLOOPEX(aTHX_ a,b)
+# define newLOOPOP(a,b,c,d)                     Perl_newLOOPOP(aTHX_ a,b,c,d)
+# define newMETHOP(a,b,c)                       Perl_newMETHOP(aTHX_ a,b,c)
+# define newMETHOP_named(a,b,c)                 Perl_newMETHOP_named(aTHX_ a,b,c)
+# define newMYSUB(a,b,c,d,e)                    Perl_newMYSUB(aTHX_ a,b,c,d,e)
+# define newNULLLIST()                          Perl_newNULLLIST(aTHX)
+# define newOP(a,b)                             Perl_newOP(aTHX_ a,b)
+# define newPADNAMELIST                         Perl_newPADNAMELIST
+# define newPADNAMEouter                        Perl_newPADNAMEouter
+# define newPADNAMEpvn                          Perl_newPADNAMEpvn
+# define newPADxVOP(a,b,c)                      Perl_newPADxVOP(aTHX_ a,b,c)
+# define newPMOP(a,b)                           Perl_newPMOP(aTHX_ a,b)
+# define newPROG(a)                             Perl_newPROG(aTHX_ a)
+# define newPVOP(a,b,c)                         Perl_newPVOP(aTHX_ a,b,c)
+# define newRANGE(a,b,c)                        Perl_newRANGE(aTHX_ a,b,c)
+# define newRV(a)                               Perl_newRV(aTHX_ a)
+# define newRV_noinc(a)                         Perl_newRV_noinc(aTHX_ a)
+# define newSLICEOP(a,b,c)                      Perl_newSLICEOP(aTHX_ a,b,c)
+# define newSTATEOP(a,b,c)                      Perl_newSTATEOP(aTHX_ a,b,c)
+# define newSV(a)                               Perl_newSV(aTHX_ a)
+# define newSVOP(a,b,c)                         Perl_newSVOP(aTHX_ a,b,c)
+# define newSVREF(a)                            Perl_newSVREF(aTHX_ a)
+# define newSV_false()                          Perl_newSV_false(aTHX)
+# define newSV_true()                           Perl_newSV_true(aTHX)
+# define newSV_type(a)                          Perl_newSV_type(aTHX_ a)
+# define newSV_type_mortal(a)                   Perl_newSV_type_mortal(aTHX_ a)
+# define newSVbool(a)                           Perl_newSVbool(aTHX_ a)
+# define newSVhek(a)                            Perl_newSVhek(aTHX_ a)
+# define newSVhek_mortal(a)                     Perl_newSVhek_mortal(aTHX_ a)
+# define newSViv(a)                             Perl_newSViv(aTHX_ a)
+# define newSVnv(a)                             Perl_newSVnv(aTHX_ a)
+# define newSVpv(a,b)                           Perl_newSVpv(aTHX_ a,b)
+# define newSVpv_share(a,b)                     Perl_newSVpv_share(aTHX_ a,b)
+# define newSVpvn(a,b)                          Perl_newSVpvn(aTHX_ a,b)
+# define newSVpvn_flags(a,b,c)                  Perl_newSVpvn_flags(aTHX_ a,b,c)
+# define newSVpvn_share(a,b,c)                  Perl_newSVpvn_share(aTHX_ a,b,c)
+# define newSVrv(a,b)                           Perl_newSVrv(aTHX_ a,b)
+# define newSVsv_flags(a,b)                     Perl_newSVsv_flags(aTHX_ a,b)
+# define newSVuv(a)                             Perl_newSVuv(aTHX_ a)
+# define newTRYCATCHOP(a,b,c,d)                 Perl_newTRYCATCHOP(aTHX_ a,b,c,d)
+# define newUNOP(a,b,c)                         Perl_newUNOP(aTHX_ a,b,c)
+# define newUNOP_AUX(a,b,c,d)                   Perl_newUNOP_AUX(aTHX_ a,b,c,d)
+# define newWHENOP(a,b)                         Perl_newWHENOP(aTHX_ a,b)
+# define newWHILEOP(a,b,c,d,e,f,g)              Perl_newWHILEOP(aTHX_ a,b,c,d,e,f,g)
+# define newXS(a,b,c)                           Perl_newXS(aTHX_ a,b,c)
+# define newXS_flags(a,b,c,d,e)                 Perl_newXS_flags(aTHX_ a,b,c,d,e)
+# define new_stackinfo(a,b)                     Perl_new_stackinfo(aTHX_ a,b)
+# define new_version(a)                         Perl_new_version(aTHX_ a)
+# define nothreadhook()                         Perl_nothreadhook(aTHX)
+# define op_append_elem(a,b,c)                  Perl_op_append_elem(aTHX_ a,b,c)
+# define op_append_list(a,b,c)                  Perl_op_append_list(aTHX_ a,b,c)
+# define op_class(a)                            Perl_op_class(aTHX_ a)
+# define op_contextualize(a,b)                  Perl_op_contextualize(aTHX_ a,b)
+# define op_convert_list(a,b,c)                 Perl_op_convert_list(aTHX_ a,b,c)
+# define op_dump(a)                             Perl_op_dump(aTHX_ a)
+# define op_force_list(a)                       Perl_op_force_list(aTHX_ a)
+# define op_free(a)                             Perl_op_free(aTHX_ a)
+# define op_linklist(a)                         Perl_op_linklist(aTHX_ a)
+# define op_null(a)                             Perl_op_null(aTHX_ a)
+# define op_parent                              Perl_op_parent
+# define op_prepend_elem(a,b,c)                 Perl_op_prepend_elem(aTHX_ a,b,c)
+# define op_refcnt_lock()                       Perl_op_refcnt_lock(aTHX)
+# define op_refcnt_unlock()                     Perl_op_refcnt_unlock(aTHX)
+# define op_scope(a)                            Perl_op_scope(aTHX_ a)
+# define op_sibling_splice                      Perl_op_sibling_splice
+# define op_wrap_finally(a,b)                   Perl_op_wrap_finally(aTHX_ a,b)
+# define packlist(a,b,c,d,e)                    Perl_packlist(aTHX_ a,b,c,d,e)
+# define pad_add_anon(a,b)                      Perl_pad_add_anon(aTHX_ a,b)
+# define pad_add_name_pv(a,b,c,d)               Perl_pad_add_name_pv(aTHX_ a,b,c,d)
+# define pad_add_name_pvn(a,b,c,d,e)            Perl_pad_add_name_pvn(aTHX_ a,b,c,d,e)
+# define pad_add_name_sv(a,b,c,d)               Perl_pad_add_name_sv(aTHX_ a,b,c,d)
+# define pad_alloc(a,b)                         Perl_pad_alloc(aTHX_ a,b)
+# define pad_findmy_pv(a,b)                     Perl_pad_findmy_pv(aTHX_ a,b)
+# define pad_findmy_pvn(a,b,c)                  Perl_pad_findmy_pvn(aTHX_ a,b,c)
+# define pad_findmy_sv(a,b)                     Perl_pad_findmy_sv(aTHX_ a,b)
+# define pad_new(a)                             Perl_pad_new(aTHX_ a)
+# define pad_tidy(a)                            Perl_pad_tidy(aTHX_ a)
+# define padnamelist_fetch                      Perl_padnamelist_fetch
+# define padnamelist_store(a,b,c)               Perl_padnamelist_store(aTHX_ a,b,c)
+# define parse_arithexpr(a)                     Perl_parse_arithexpr(aTHX_ a)
+# define parse_barestmt(a)                      Perl_parse_barestmt(aTHX_ a)
+# define parse_block(a)                         Perl_parse_block(aTHX_ a)
+# define parse_fullexpr(a)                      Perl_parse_fullexpr(aTHX_ a)
+# define parse_fullstmt(a)                      Perl_parse_fullstmt(aTHX_ a)
+# define parse_label(a)                         Perl_parse_label(aTHX_ a)
+# define parse_listexpr(a)                      Perl_parse_listexpr(aTHX_ a)
+# define parse_stmtseq(a)                       Perl_parse_stmtseq(aTHX_ a)
+# define parse_subsignature(a)                  Perl_parse_subsignature(aTHX_ a)
+# define parse_termexpr(a)                      Perl_parse_termexpr(aTHX_ a)
+# define perly_sighandler                       Perl_perly_sighandler
+# define pmop_dump(a)                           Perl_pmop_dump(aTHX_ a)
+# define pop_scope()                            Perl_pop_scope(aTHX)
+# define pregcomp(a,b)                          Perl_pregcomp(aTHX_ a,b)
+# define pregexec(a,b,c,d,e,f,g)                Perl_pregexec(aTHX_ a,b,c,d,e,f,g)
+# define pregfree(a)                            Perl_pregfree(aTHX_ a)
+# define pregfree2(a)                           Perl_pregfree2(aTHX_ a)
+# define prescan_version(a,b,c,d,e,f,g)         Perl_prescan_version(aTHX_ a,b,c,d,e,f,g)
+# define ptr_table_fetch(a,b)                   Perl_ptr_table_fetch(aTHX_ a,b)
+# define ptr_table_free(a)                      Perl_ptr_table_free(aTHX_ a)
+# define ptr_table_new()                        Perl_ptr_table_new(aTHX)
+# define ptr_table_split(a)                     Perl_ptr_table_split(aTHX_ a)
+# define ptr_table_store(a,b,c)                 Perl_ptr_table_store(aTHX_ a,b,c)
+# define push_scope()                           Perl_push_scope(aTHX)
+# define pv_display(a,b,c,d,e)                  Perl_pv_display(aTHX_ a,b,c,d,e)
+# define pv_escape(a,b,c,d,e,f)                 Perl_pv_escape(aTHX_ a,b,c,d,e,f)
+# define pv_pretty(a,b,c,d,e,f,g)               Perl_pv_pretty(aTHX_ a,b,c,d,e,f,g)
+# define pv_uni_display(a,b,c,d,e)              Perl_pv_uni_display(aTHX_ a,b,c,d,e)
+# define rcpv_copy(a)                           Perl_rcpv_copy(aTHX_ a)
+# define rcpv_free(a)                           Perl_rcpv_free(aTHX_ a)
+# define rcpv_new(a,b,c)                        Perl_rcpv_new(aTHX_ a,b,c)
+# define re_compile(a,b)                        Perl_re_compile(aTHX_ a,b)
+# define re_intuit_start(a,b,c,d,e,f,g)         Perl_re_intuit_start(aTHX_ a,b,c,d,e,f,g)
+# define re_intuit_string(a)                    Perl_re_intuit_string(aTHX_ a)
+# define reentrant_free()                       Perl_reentrant_free(aTHX)
+# define reentrant_init()                       Perl_reentrant_init(aTHX)
+# define reentrant_retry                        Perl_reentrant_retry
+# define reentrant_size()                       Perl_reentrant_size(aTHX)
+# define reg_named_buff_all(a,b)                Perl_reg_named_buff_all(aTHX_ a,b)
+# define reg_named_buff_exists(a,b,c)           Perl_reg_named_buff_exists(aTHX_ a,b,c)
+# define reg_named_buff_fetch(a,b,c)            Perl_reg_named_buff_fetch(aTHX_ a,b,c)
+# define reg_named_buff_firstkey(a,b)           Perl_reg_named_buff_firstkey(aTHX_ a,b)
+# define reg_named_buff_nextkey(a,b)            Perl_reg_named_buff_nextkey(aTHX_ a,b)
+# define reg_named_buff_scalar(a,b)             Perl_reg_named_buff_scalar(aTHX_ a,b)
+# define regdump(a)                             Perl_regdump(aTHX_ a)
+# define regexec_flags(a,b,c,d,e,f,g,h)         Perl_regexec_flags(aTHX_ a,b,c,d,e,f,g,h)
+# define regfree_internal(a)                    Perl_regfree_internal(aTHX_ a)
+# define reginitcolors()                        Perl_reginitcolors(aTHX)
+# define repeatcpy                              Perl_repeatcpy
+# define require_pv(a)                          Perl_require_pv(aTHX_ a)
+# define rninstr                                Perl_rninstr
+# define rsignal(a,b)                           Perl_rsignal(aTHX_ a,b)
+# define rsignal_state(a)                       Perl_rsignal_state(aTHX_ a)
+# define runops_debug()                         Perl_runops_debug(aTHX)
+# define runops_standard()                      Perl_runops_standard(aTHX)
+# define rv2cv_op_cv(a,b)                       Perl_rv2cv_op_cv(aTHX_ a,b)
+# define safesyscalloc                          Perl_safesyscalloc
+# define safesysfree                            Perl_safesysfree
+# define safesysmalloc                          Perl_safesysmalloc
+# define safesysrealloc                         Perl_safesysrealloc
+# define save_I16(a)                            Perl_save_I16(aTHX_ a)
+# define save_I32(a)                            Perl_save_I32(aTHX_ a)
+# define save_I8(a)                             Perl_save_I8(aTHX_ a)
+# define save_adelete(a,b)                      Perl_save_adelete(aTHX_ a,b)
+# define save_aelem_flags(a,b,c,d)              Perl_save_aelem_flags(aTHX_ a,b,c,d)
+# define save_alloc(a,b)                        Perl_save_alloc(aTHX_ a,b)
+# define save_aptr(a)                           Perl_save_aptr(aTHX_ a)
+# define save_ary(a)                            Perl_save_ary(aTHX_ a)
+# define save_bool(a)                           Perl_save_bool(aTHX_ a)
+# define save_clearsv(a)                        Perl_save_clearsv(aTHX_ a)
+# define save_delete(a,b,c)                     Perl_save_delete(aTHX_ a,b,c)
+# define save_destructor(a,b)                   Perl_save_destructor(aTHX_ a,b)
+# define save_destructor_x(a,b)                 Perl_save_destructor_x(aTHX_ a,b)
+# define save_freercpv(a)                       Perl_save_freercpv(aTHX_ a)
+# define save_generic_pvref(a)                  Perl_save_generic_pvref(aTHX_ a)
+# define save_generic_svref(a)                  Perl_save_generic_svref(aTHX_ a)
+# define save_gp(a,b)                           Perl_save_gp(aTHX_ a,b)
+# define save_hash(a)                           Perl_save_hash(aTHX_ a)
+# define save_hdelete(a,b)                      Perl_save_hdelete(aTHX_ a,b)
+# define save_helem_flags(a,b,c,d)              Perl_save_helem_flags(aTHX_ a,b,c,d)
+# define save_hints()                           Perl_save_hints(aTHX)
+# define save_hptr(a)                           Perl_save_hptr(aTHX_ a)
+# define save_int(a)                            Perl_save_int(aTHX_ a)
+# define save_item(a)                           Perl_save_item(aTHX_ a)
+# define save_iv(a)                             Perl_save_iv(aTHX_ a)
+# define save_padsv_and_mortalize(a)            Perl_save_padsv_and_mortalize(aTHX_ a)
+# define save_pptr(a)                           Perl_save_pptr(aTHX_ a)
+# define save_pushi32ptr(a,b,c)                 Perl_save_pushi32ptr(aTHX_ a,b,c)
+# define save_pushptr(a,b)                      Perl_save_pushptr(aTHX_ a,b)
+# define save_pushptrptr(a,b,c)                 Perl_save_pushptrptr(aTHX_ a,b,c)
+# define save_rcpv(a)                           Perl_save_rcpv(aTHX_ a)
+# define save_re_context()                      Perl_save_re_context(aTHX)
+# define save_scalar(a)                         Perl_save_scalar(aTHX_ a)
+# define save_set_svflags(a,b,c)                Perl_save_set_svflags(aTHX_ a,b,c)
+# define save_shared_pvref(a)                   Perl_save_shared_pvref(aTHX_ a)
+# define save_sptr(a)                           Perl_save_sptr(aTHX_ a)
+# define save_svref(a)                          Perl_save_svref(aTHX_ a)
+# define save_vptr(a)                           Perl_save_vptr(aTHX_ a)
+# define savepv(a)                              Perl_savepv(aTHX_ a)
+# define savepvn(a,b)                           Perl_savepvn(aTHX_ a,b)
+# define savesharedpv(a)                        Perl_savesharedpv(aTHX_ a)
+# define savesharedpvn(a,b)                     Perl_savesharedpvn(aTHX_ a,b)
+# define savesharedsvpv(a)                      Perl_savesharedsvpv(aTHX_ a)
+# define savestack_grow()                       Perl_savestack_grow(aTHX)
+# define savestack_grow_cnt(a)                  Perl_savestack_grow_cnt(aTHX_ a)
+# define savesvpv(a)                            Perl_savesvpv(aTHX_ a)
+# define scan_bin(a,b,c)                        Perl_scan_bin(aTHX_ a,b,c)
+# define scan_hex(a,b,c)                        Perl_scan_hex(aTHX_ a,b,c)
+# define scan_num(a,b)                          Perl_scan_num(aTHX_ a,b)
+# define scan_oct(a,b,c)                        Perl_scan_oct(aTHX_ a,b,c)
+# define scan_version(a,b,c)                    Perl_scan_version(aTHX_ a,b,c)
+# define scan_vstring(a,b,c)                    Perl_scan_vstring(aTHX_ a,b,c)
+# define seed()                                 Perl_seed(aTHX)
+# define set_context                            Perl_set_context
+# define setdefout(a)                           Perl_setdefout(aTHX_ a)
+# define share_hek(a,b,c)                       Perl_share_hek(aTHX_ a,b,c)
+# define single_1bit_pos32                      Perl_single_1bit_pos32
+# define sortsv(a,b,c)                          Perl_sortsv(aTHX_ a,b,c)
+# define sortsv_flags(a,b,c,d)                  Perl_sortsv_flags(aTHX_ a,b,c,d)
+# define stack_grow(a,b,c)                      Perl_stack_grow(aTHX_ a,b,c)
+# define start_subparse(a,b)                    Perl_start_subparse(aTHX_ a,b)
+# define str_to_version(a)                      Perl_str_to_version(aTHX_ a)
+# define suspend_compcv(a)                      Perl_suspend_compcv(aTHX_ a)
+# define sv_2bool_flags(a,b)                    Perl_sv_2bool_flags(aTHX_ a,b)
+# define sv_2cv(a,b,c,d)                        Perl_sv_2cv(aTHX_ a,b,c,d)
+# define sv_2io(a)                              Perl_sv_2io(aTHX_ a)
+# define sv_2iv_flags(a,b)                      Perl_sv_2iv_flags(aTHX_ a,b)
+# define sv_2mortal(a)                          Perl_sv_2mortal(aTHX_ a)
+# define sv_2nv_flags(a,b)                      Perl_sv_2nv_flags(aTHX_ a,b)
+# define sv_2pv_flags(a,b,c)                    Perl_sv_2pv_flags(aTHX_ a,b,c)
+# define sv_2pvbyte_flags(a,b,c)                Perl_sv_2pvbyte_flags(aTHX_ a,b,c)
+# define sv_2pvutf8_flags(a,b,c)                Perl_sv_2pvutf8_flags(aTHX_ a,b,c)
+# define sv_2uv_flags(a,b)                      Perl_sv_2uv_flags(aTHX_ a,b)
+# define sv_backoff                             Perl_sv_backoff
+# define sv_bless(a,b)                          Perl_sv_bless(aTHX_ a,b)
+# define sv_cat_decode(a,b,c,d,e,f)             Perl_sv_cat_decode(aTHX_ a,b,c,d,e,f)
+# define sv_catpv(a,b)                          Perl_sv_catpv(aTHX_ a,b)
+# define sv_catpv_flags(a,b,c)                  Perl_sv_catpv_flags(aTHX_ a,b,c)
+# define sv_catpv_mg(a,b)                       Perl_sv_catpv_mg(aTHX_ a,b)
+# define sv_catpvn_flags(a,b,c,d)               Perl_sv_catpvn_flags(aTHX_ a,b,c,d)
+# define sv_catsv_flags(a,b,c)                  Perl_sv_catsv_flags(aTHX_ a,b,c)
+# define sv_chop(a,b)                           Perl_sv_chop(aTHX_ a,b)
+# define sv_clear(a)                            Perl_sv_clear(aTHX_ a)
+# define sv_cmp_flags(a,b,c)                    Perl_sv_cmp_flags(aTHX_ a,b,c)
+# define sv_cmp_locale_flags(a,b,c)             Perl_sv_cmp_locale_flags(aTHX_ a,b,c)
+# define sv_copypv_flags(a,b,c)                 Perl_sv_copypv_flags(aTHX_ a,b,c)
+# define sv_dec(a)                              Perl_sv_dec(aTHX_ a)
+# define sv_dec_nomg(a)                         Perl_sv_dec_nomg(aTHX_ a)
+# define sv_derived_from(a,b)                   Perl_sv_derived_from(aTHX_ a,b)
+# define sv_derived_from_hv(a,b)                Perl_sv_derived_from_hv(aTHX_ a,b)
+# define sv_derived_from_pv(a,b,c)              Perl_sv_derived_from_pv(aTHX_ a,b,c)
+# define sv_derived_from_pvn(a,b,c,d)           Perl_sv_derived_from_pvn(aTHX_ a,b,c,d)
+# define sv_derived_from_sv(a,b,c)              Perl_sv_derived_from_sv(aTHX_ a,b,c)
+# define sv_destroyable(a)                      Perl_sv_destroyable(aTHX_ a)
+# define sv_does(a,b)                           Perl_sv_does(aTHX_ a,b)
+# define sv_does_pv(a,b,c)                      Perl_sv_does_pv(aTHX_ a,b,c)
+# define sv_does_pvn(a,b,c,d)                   Perl_sv_does_pvn(aTHX_ a,b,c,d)
+# define sv_does_sv(a,b,c)                      Perl_sv_does_sv(aTHX_ a,b,c)
+# define sv_dump(a)                             Perl_sv_dump(aTHX_ a)
+# define sv_dump_depth(a,b)                     Perl_sv_dump_depth(aTHX_ a,b)
+# define sv_eq_flags(a,b,c)                     Perl_sv_eq_flags(aTHX_ a,b,c)
+# define sv_force_normal_flags(a,b)             Perl_sv_force_normal_flags(aTHX_ a,b)
+# define sv_free(a)                             Perl_sv_free(aTHX_ a)
+# define sv_get_backrefs                        Perl_sv_get_backrefs
+# define sv_gets(a,b,c)                         Perl_sv_gets(aTHX_ a,b,c)
+# define sv_grow(a,b)                           Perl_sv_grow(aTHX_ a,b)
+# define sv_grow_fresh(a,b)                     Perl_sv_grow_fresh(aTHX_ a,b)
+# define sv_inc(a)                              Perl_sv_inc(aTHX_ a)
+# define sv_inc_nomg(a)                         Perl_sv_inc_nomg(aTHX_ a)
+# define sv_insert_flags(a,b,c,d,e,f)           Perl_sv_insert_flags(aTHX_ a,b,c,d,e,f)
+# define sv_isa(a,b)                            Perl_sv_isa(aTHX_ a,b)
+# define sv_isa_sv(a,b)                         Perl_sv_isa_sv(aTHX_ a,b)
+# define sv_isobject(a)                         Perl_sv_isobject(aTHX_ a)
+# define sv_len(a)                              Perl_sv_len(aTHX_ a)
+# define sv_len_utf8(a)                         Perl_sv_len_utf8(aTHX_ a)
+# define sv_len_utf8_nomg(a)                    Perl_sv_len_utf8_nomg(aTHX_ a)
+# define sv_magic(a,b,c,d,e)                    Perl_sv_magic(aTHX_ a,b,c,d,e)
+# define sv_magicext(a,b,c,d,e,f)               Perl_sv_magicext(aTHX_ a,b,c,d,e,f)
+# define sv_mortalcopy_flags(a,b)               Perl_sv_mortalcopy_flags(aTHX_ a,b)
+# define sv_newmortal()                         Perl_sv_newmortal(aTHX)
+# define sv_newref(a)                           Perl_sv_newref(aTHX_ a)
+# define sv_nosharing(a)                        Perl_sv_nosharing(aTHX_ a)
+# define sv_numeq_flags(a,b,c)                  Perl_sv_numeq_flags(aTHX_ a,b,c)
+# define sv_peek(a)                             Perl_sv_peek(aTHX_ a)
+# define sv_pos_b2u(a,b)                        Perl_sv_pos_b2u(aTHX_ a,b)
+# define sv_pos_b2u_flags(a,b,c)                Perl_sv_pos_b2u_flags(aTHX_ a,b,c)
+# define sv_pos_u2b(a,b,c)                      Perl_sv_pos_u2b(aTHX_ a,b,c)
+# define sv_pos_u2b_flags(a,b,c,d)              Perl_sv_pos_u2b_flags(aTHX_ a,b,c,d)
+# define sv_pvbyten_force(a,b)                  Perl_sv_pvbyten_force(aTHX_ a,b)
+# define sv_pvn_force_flags(a,b,c)              Perl_sv_pvn_force_flags(aTHX_ a,b,c)
+# define sv_pvutf8n_force(a,b)                  Perl_sv_pvutf8n_force(aTHX_ a,b)
+# define sv_recode_to_utf8(a,b)                 Perl_sv_recode_to_utf8(aTHX_ a,b)
+# define sv_ref(a,b,c)                          Perl_sv_ref(aTHX_ a,b,c)
+# define sv_reftype(a,b)                        Perl_sv_reftype(aTHX_ a,b)
+# define sv_replace(a,b)                        Perl_sv_replace(aTHX_ a,b)
+# define sv_report_used()                       Perl_sv_report_used(aTHX)
+# define sv_reset(a,b)                          Perl_sv_reset(aTHX_ a,b)
+# define sv_rvunweaken(a)                       Perl_sv_rvunweaken(aTHX_ a)
+# define sv_rvweaken(a)                         Perl_sv_rvweaken(aTHX_ a)
+# define sv_set_bool(a,b)                       Perl_sv_set_bool(aTHX_ a,b)
+# define sv_set_false(a)                        Perl_sv_set_false(aTHX_ a)
+# define sv_set_true(a)                         Perl_sv_set_true(aTHX_ a)
+# define sv_set_undef(a)                        Perl_sv_set_undef(aTHX_ a)
+# define sv_setiv(a,b)                          Perl_sv_setiv(aTHX_ a,b)
+# define sv_setiv_mg(a,b)                       Perl_sv_setiv_mg(aTHX_ a,b)
+# define sv_setnv(a,b)                          Perl_sv_setnv(aTHX_ a,b)
+# define sv_setnv_mg(a,b)                       Perl_sv_setnv_mg(aTHX_ a,b)
+# define sv_setpv(a,b)                          Perl_sv_setpv(aTHX_ a,b)
+# define sv_setpv_bufsize(a,b,c)                Perl_sv_setpv_bufsize(aTHX_ a,b,c)
+# define sv_setpv_freshbuf(a)                   Perl_sv_setpv_freshbuf(aTHX_ a)
+# define sv_setpv_mg(a,b)                       Perl_sv_setpv_mg(aTHX_ a,b)
+# define sv_setpvn(a,b,c)                       Perl_sv_setpvn(aTHX_ a,b,c)
+# define sv_setpvn_fresh(a,b,c)                 Perl_sv_setpvn_fresh(aTHX_ a,b,c)
+# define sv_setpvn_mg(a,b,c)                    Perl_sv_setpvn_mg(aTHX_ a,b,c)
+# define sv_setref_iv(a,b,c)                    Perl_sv_setref_iv(aTHX_ a,b,c)
+# define sv_setref_nv(a,b,c)                    Perl_sv_setref_nv(aTHX_ a,b,c)
+# define sv_setref_pv(a,b,c)                    Perl_sv_setref_pv(aTHX_ a,b,c)
+# define sv_setref_pvn(a,b,c,d)                 Perl_sv_setref_pvn(aTHX_ a,b,c,d)
+# define sv_setref_uv(a,b,c)                    Perl_sv_setref_uv(aTHX_ a,b,c)
+# define sv_setrv_inc(a,b)                      Perl_sv_setrv_inc(aTHX_ a,b)
+# define sv_setrv_inc_mg(a,b)                   Perl_sv_setrv_inc_mg(aTHX_ a,b)
+# define sv_setrv_noinc(a,b)                    Perl_sv_setrv_noinc(aTHX_ a,b)
+# define sv_setrv_noinc_mg(a,b)                 Perl_sv_setrv_noinc_mg(aTHX_ a,b)
+# define sv_setsv_flags(a,b,c)                  Perl_sv_setsv_flags(aTHX_ a,b,c)
+# define sv_setsv_mg(a,b)                       Perl_sv_setsv_mg(aTHX_ a,b)
+# define sv_setuv(a,b)                          Perl_sv_setuv(aTHX_ a,b)
+# define sv_setuv_mg(a,b)                       Perl_sv_setuv_mg(aTHX_ a,b)
+# define sv_streq_flags(a,b,c)                  Perl_sv_streq_flags(aTHX_ a,b,c)
+# define sv_string_from_errnum(a,b)             Perl_sv_string_from_errnum(aTHX_ a,b)
+# define sv_tainted(a)                          Perl_sv_tainted(aTHX_ a)
+# define sv_true(a)                             Perl_sv_true(aTHX_ a)
+# define sv_uni_display(a,b,c,d)                Perl_sv_uni_display(aTHX_ a,b,c,d)
+# define sv_unmagic(a,b)                        Perl_sv_unmagic(aTHX_ a,b)
+# define sv_unmagicext(a,b,c)                   Perl_sv_unmagicext(aTHX_ a,b,c)
+# define sv_unref_flags(a,b)                    Perl_sv_unref_flags(aTHX_ a,b)
+# define sv_untaint(a)                          Perl_sv_untaint(aTHX_ a)
+# define sv_upgrade(a,b)                        Perl_sv_upgrade(aTHX_ a,b)
+# define sv_usepvn_flags(a,b,c,d)               Perl_sv_usepvn_flags(aTHX_ a,b,c,d)
+# define sv_utf8_decode(a)                      Perl_sv_utf8_decode(aTHX_ a)
+# define sv_utf8_downgrade_flags(a,b,c)         Perl_sv_utf8_downgrade_flags(aTHX_ a,b,c)
+# define sv_utf8_encode(a)                      Perl_sv_utf8_encode(aTHX_ a)
+# define sv_utf8_upgrade_flags_grow(a,b,c)      Perl_sv_utf8_upgrade_flags_grow(aTHX_ a,b,c)
+# define sv_vcatpvf(a,b,c)                      Perl_sv_vcatpvf(aTHX_ a,b,c)
+# define sv_vcatpvf_mg(a,b,c)                   Perl_sv_vcatpvf_mg(aTHX_ a,b,c)
+# define sv_vcatpvfn(a,b,c,d,e,f,g)             Perl_sv_vcatpvfn(aTHX_ a,b,c,d,e,f,g)
+# define sv_vcatpvfn_flags(a,b,c,d,e,f,g,h)     Perl_sv_vcatpvfn_flags(aTHX_ a,b,c,d,e,f,g,h)
+# define sv_vsetpvf(a,b,c)                      Perl_sv_vsetpvf(aTHX_ a,b,c)
+# define sv_vsetpvf_mg(a,b,c)                   Perl_sv_vsetpvf_mg(aTHX_ a,b,c)
+# define sv_vsetpvfn(a,b,c,d,e,f,g)             Perl_sv_vsetpvfn(aTHX_ a,b,c,d,e,f,g)
+# define switch_to_global_locale()              Perl_switch_to_global_locale(aTHX)
+# define sync_locale()                          Perl_sync_locale(aTHX)
+# define taint_env()                            Perl_taint_env(aTHX)
+# define taint_proper(a,b)                      Perl_taint_proper(aTHX_ a,b)
+# define thread_locale_init()                   Perl_thread_locale_init(aTHX)
+# define thread_locale_term()                   Perl_thread_locale_term(aTHX)
+# define to_uni_lower(a,b,c)                    Perl_to_uni_lower(aTHX_ a,b,c)
+# define to_uni_title(a,b,c)                    Perl_to_uni_title(aTHX_ a,b,c)
+# define to_uni_upper(a,b,c)                    Perl_to_uni_upper(aTHX_ a,b,c)
+# define unpackstring(a,b,c,d,e)                Perl_unpackstring(aTHX_ a,b,c,d,e)
+# define unshare_hek(a)                         Perl_unshare_hek(aTHX_ a)
+# define unsharepvn(a,b,c)                      Perl_unsharepvn(aTHX_ a,b,c)
+# define upg_version(a,b)                       Perl_upg_version(aTHX_ a,b)
+# define utf8_distance(a,b)                     Perl_utf8_distance(aTHX_ a,b)
+# define utf8_hop                               Perl_utf8_hop
+# define utf8_hop_back                          Perl_utf8_hop_back
+# define utf8_hop_forward                       Perl_utf8_hop_forward
+# define utf8_hop_safe                          Perl_utf8_hop_safe
+# define utf8_length(a,b)                       Perl_utf8_length(aTHX_ a,b)
+# define utf8_to_bytes(a,b)                     Perl_utf8_to_bytes(aTHX_ a,b)
+# define utf8_to_uvchr_buf_helper(a,b,c)        Perl_utf8_to_uvchr_buf_helper(aTHX_ a,b,c)
+# define utf8n_to_uvchr_msgs                    Perl_utf8n_to_uvchr_msgs
+# define uvoffuni_to_utf8_flags_msgs(a,b,c,d)   Perl_uvoffuni_to_utf8_flags_msgs(aTHX_ a,b,c,d)
+# define uvuni_to_utf8(a,b)                     Perl_uvuni_to_utf8(aTHX_ a,b)
+# define valid_utf8_to_uvchr                    Perl_valid_utf8_to_uvchr
+# define vcmp(a,b)                              Perl_vcmp(aTHX_ a,b)
+# define vcroak(a,b)                            Perl_vcroak(aTHX_ a,b)
+# define vdeb(a,b)                              Perl_vdeb(aTHX_ a,b)
+# define vform(a,b)                             Perl_vform(aTHX_ a,b)
+# define vload_module(a,b,c,d)                  Perl_vload_module(aTHX_ a,b,c,d)
+# define vmess(a,b)                             Perl_vmess(aTHX_ a,b)
+# define vnewSVpvf(a,b)                         Perl_vnewSVpvf(aTHX_ a,b)
+# define vnormal(a)                             Perl_vnormal(aTHX_ a)
+# define vnumify(a)                             Perl_vnumify(aTHX_ a)
+# define vstringify(a)                          Perl_vstringify(aTHX_ a)
+# define vverify(a)                             Perl_vverify(aTHX_ a)
+# define vwarn(a,b)                             Perl_vwarn(aTHX_ a,b)
+# define vwarner(a,b,c)                         Perl_vwarner(aTHX_ a,b,c)
+# define warn_sv(a)                             Perl_warn_sv(aTHX_ a)
+# define whichsig_pv(a)                         Perl_whichsig_pv(aTHX_ a)
+# define whichsig_pvn(a,b)                      Perl_whichsig_pvn(aTHX_ a,b)
+# define whichsig_sv(a)                         Perl_whichsig_sv(aTHX_ a)
+# define wrap_infix_plugin(a,b)                 Perl_wrap_infix_plugin(aTHX_ a,b)
+# define wrap_keyword_plugin(a,b)               Perl_wrap_keyword_plugin(aTHX_ a,b)
+# define wrap_op_checker(a,b,c)                 Perl_wrap_op_checker(aTHX_ a,b,c)
+
+# if defined(DEBUGGING)
+#   define pad_setsv(a,b)                       Perl_pad_setsv(aTHX_ a,b)
+#   define pad_sv(a)                            Perl_pad_sv(aTHX_ a)
+# endif
+# if !defined(EBCDIC)
+#   define variant_byte_number                  Perl_variant_byte_number
+# endif
+# if defined(F_FREESP) && !defined(HAS_CHSIZE) && !defined(HAS_TRUNCATE)
+#   define my_chsize(a,b)                       Perl_my_chsize(aTHX_ a,b)
+# endif
+# if !defined(HAS_STRLCAT)
+#   define my_strlcat                           Perl_my_strlcat
+# endif
+# if !defined(HAS_STRLCPY)
+#   define my_strlcpy                           Perl_my_strlcpy
+# endif
+# if !defined(HAS_STRNLEN)
+#   define my_strnlen                           Perl_my_strnlen
+# endif
+# if defined(HAVE_INTERP_INTERN)
+#   define sys_intern_clear()                   Perl_sys_intern_clear(aTHX)
+#   define sys_intern_init()                    Perl_sys_intern_init(aTHX)
+#   if defined(USE_ITHREADS)
+#     define sys_intern_dup(a,b)                Perl_sys_intern_dup(aTHX_ a,b)
+#   endif
+# endif
+# if defined(MULTIPLICITY)
+#   define croak_nocontext                      Perl_croak_nocontext
+#   define deb_nocontext                        Perl_deb_nocontext
+#   define die_nocontext                        Perl_die_nocontext
+#   define form_nocontext                       Perl_form_nocontext
+#   define load_module_nocontext                Perl_load_module_nocontext
+#   define mess_nocontext                       Perl_mess_nocontext
+#   define newSVpvf_nocontext                   Perl_newSVpvf_nocontext
+#   define sv_catpvf_mg_nocontext               Perl_sv_catpvf_mg_nocontext
+#   define sv_catpvf_nocontext                  Perl_sv_catpvf_nocontext
+#   define sv_setpvf_mg_nocontext               Perl_sv_setpvf_mg_nocontext
+#   define sv_setpvf_nocontext                  Perl_sv_setpvf_nocontext
+#   define warn_nocontext                       Perl_warn_nocontext
+#   define warner_nocontext                     Perl_warner_nocontext
+# endif /* defined(MULTIPLICITY) */
+# if !defined(MULTIPLICITY) || defined(PERL_CORE)
+#   define ck_warner(a,...)                     Perl_ck_warner(aTHX_ a,__VA_ARGS__)
+#   define ck_warner_d(a,...)                   Perl_ck_warner_d(aTHX_ a,__VA_ARGS__)
+#   define croak(...)                           Perl_croak(aTHX_ __VA_ARGS__)
+#   define deb(...)                             Perl_deb(aTHX_ __VA_ARGS__)
+#   define die(...)                             Perl_die(aTHX_ __VA_ARGS__)
+#   define dump_indent(a,b,...)                 Perl_dump_indent(aTHX_ a,b,__VA_ARGS__)
+#   define form(...)                            Perl_form(aTHX_ __VA_ARGS__)
+#   define load_module(a,b,...)                 Perl_load_module(aTHX_ a,b,__VA_ARGS__)
+#   define mess(...)                            Perl_mess(aTHX_ __VA_ARGS__)
+#   define newSVpvf(...)                        Perl_newSVpvf(aTHX_ __VA_ARGS__)
+#   define sv_catpvf(a,...)                     Perl_sv_catpvf(aTHX_ a,__VA_ARGS__)
+#   define sv_catpvf_mg(a,...)                  Perl_sv_catpvf_mg(aTHX_ a,__VA_ARGS__)
+#   define sv_setpvf(a,...)                     Perl_sv_setpvf(aTHX_ a,__VA_ARGS__)
+#   define sv_setpvf_mg(a,...)                  Perl_sv_setpvf_mg(aTHX_ a,__VA_ARGS__)
+#   define warn(...)                            Perl_warn(aTHX_ __VA_ARGS__)
+#   define warner(a,...)                        Perl_warner(aTHX_ a,__VA_ARGS__)
+# endif /* !defined(MULTIPLICITY) || defined(PERL_CORE) */
+# if defined(MYMALLOC)
+#   define dump_mstats(a)                       Perl_dump_mstats(aTHX_ a)
+#   define get_mstats(a,b,c)                    Perl_get_mstats(aTHX_ a,b,c)
+#   if defined(PERL_CORE)
+#     define malloc_good_size                   Perl_malloc_good_size
+#     define malloced_size                      Perl_malloced_size
+#   endif
+# endif
+# if !defined(NO_MATHOMS)
+#   define sv_nolocking(a)                      Perl_sv_nolocking(aTHX_ a)
+#   define sv_nounlocking(a)                    Perl_sv_nounlocking(aTHX_ a)
+#   define utf8_to_uvchr(a,b)                   Perl_utf8_to_uvchr(aTHX_ a,b)
+#   define utf8_to_uvuni(a,b)                   Perl_utf8_to_uvuni(aTHX_ a,b)
+#   define utf8n_to_uvuni(a,b,c,d)              Perl_utf8n_to_uvuni(aTHX_ a,b,c,d)
+# endif
+# if defined(PERL_CORE)
+#   define PerlLIO_dup2_cloexec(a,b)            Perl_PerlLIO_dup2_cloexec(aTHX_ a,b)
+#   define PerlLIO_dup_cloexec(a)               Perl_PerlLIO_dup_cloexec(aTHX_ a)
+#   define PerlLIO_open3_cloexec(a,b,c)         Perl_PerlLIO_open3_cloexec(aTHX_ a,b,c)
+#   define PerlLIO_open_cloexec(a,b)            Perl_PerlLIO_open_cloexec(aTHX_ a,b)
+#   define Slab_Alloc(a)                        Perl_Slab_Alloc(aTHX_ a)
+#   define Slab_Free(a)                         Perl_Slab_Free(aTHX_ a)
+#   define _warn_problematic_locale             Perl__warn_problematic_locale
+#   define abort_execution(a,b)                 Perl_abort_execution(aTHX_ a,b)
+#   define alloc_LOGOP(a,b,c)                   Perl_alloc_LOGOP(aTHX_ a,b,c)
+#   define allocmy(a,b,c)                       Perl_allocmy(aTHX_ a,b,c)
+#   define amagic_applies(a,b,c)                Perl_amagic_applies(aTHX_ a,b,c)
+#   define amagic_is_enabled(a)                 Perl_amagic_is_enabled(aTHX_ a)
+#   define apply(a,b,c)                         Perl_apply(aTHX_ a,b,c)
+#   define av_extend_guts(a,b,c,d,e)            Perl_av_extend_guts(aTHX_ a,b,c,d,e)
+#   define av_nonelem(a,b)                      Perl_av_nonelem(aTHX_ a,b)
+#   define bind_match(a,b,c)                    Perl_bind_match(aTHX_ a,b,c)
+#   define boot_core_PerlIO()                   Perl_boot_core_PerlIO(aTHX)
+#   define boot_core_UNIVERSAL()                Perl_boot_core_UNIVERSAL(aTHX)
+#   define boot_core_builtin()                  Perl_boot_core_builtin(aTHX)
+#   define boot_core_mro()                      Perl_boot_core_mro(aTHX)
+#   define build_infix_plugin(a,b,c)            Perl_build_infix_plugin(aTHX_ a,b,c)
+#   define cando(a,b,c)                         Perl_cando(aTHX_ a,b,c)
+#   define check_utf8_print(a,b)                Perl_check_utf8_print(aTHX_ a,b)
+#   define closest_cop(a,b,c,d)                 Perl_closest_cop(aTHX_ a,b,c,d)
+#   define cmpchain_extend(a,b,c)               Perl_cmpchain_extend(aTHX_ a,b,c)
+#   define cmpchain_finish(a)                   Perl_cmpchain_finish(aTHX_ a)
+#   define cmpchain_start(a,b,c)                Perl_cmpchain_start(aTHX_ a,b,c)
+#   define core_prototype(a,b,c,d)              Perl_core_prototype(aTHX_ a,b,c,d)
+#   define coresub_op(a,b,c)                    Perl_coresub_op(aTHX_ a,b,c)
+#   define create_eval_scope(a,b)               Perl_create_eval_scope(aTHX_ a,b)
+#   define croak_caller                         Perl_croak_caller
+#   define croak_no_mem                         Perl_croak_no_mem
+#   define croak_popstack                       Perl_croak_popstack
+#   define custom_op_get_field(a,b)             Perl_custom_op_get_field(aTHX_ a,b)
+#   define cv_clone_into(a,b)                   Perl_cv_clone_into(aTHX_ a,b)
+#   define cv_const_sv_or_av                    Perl_cv_const_sv_or_av
+#   define cv_forget_slab(a)                    Perl_cv_forget_slab(aTHX_ a)
+#   define cv_undef_flags(a,b)                  Perl_cv_undef_flags(aTHX_ a,b)
+#   define cvgv_set(a,b)                        Perl_cvgv_set(aTHX_ a,b)
+#   define cvstash_set(a,b)                     Perl_cvstash_set(aTHX_ a,b)
+#   define deb_stack_all()                      Perl_deb_stack_all(aTHX)
+#   define debug_hash_seed(a)                   Perl_debug_hash_seed(aTHX_ a)
+#   define defelem_target(a,b)                  Perl_defelem_target(aTHX_ a,b)
+#   define delete_eval_scope()                  Perl_delete_eval_scope(aTHX)
+#   define die_unwind(a)                        Perl_die_unwind(aTHX_ a)
+#   define do_aexec5(a,b,c,d,e)                 Perl_do_aexec5(aTHX_ a,b,c,d,e)
+#   define do_dump_pad(a,b,c,d)                 Perl_do_dump_pad(aTHX_ a,b,c,d)
+#   define do_eof(a)                            Perl_do_eof(aTHX_ a)
+#   define do_ncmp(a,b)                         Perl_do_ncmp(aTHX_ a,b)
+#   define do_open6(a,b,c,d,e,f)                Perl_do_open6(aTHX_ a,b,c,d,e,f)
+#   define do_open_raw(a,b,c,d,e,f)             Perl_do_open_raw(aTHX_ a,b,c,d,e,f)
+#   define do_print(a,b)                        Perl_do_print(aTHX_ a,b)
+#   define do_readline()                        Perl_do_readline(aTHX)
+#   define do_seek(a,b,c)                       Perl_do_seek(aTHX_ a,b,c)
+#   define do_sysseek(a,b,c)                    Perl_do_sysseek(aTHX_ a,b,c)
+#   define do_tell(a)                           Perl_do_tell(aTHX_ a)
+#   define do_trans(a)                          Perl_do_trans(aTHX_ a)
+#   define do_vecget(a,b,c)                     Perl_do_vecget(aTHX_ a,b,c)
+#   define do_vecset(a)                         Perl_do_vecset(aTHX_ a)
+#   define do_vop(a,b,c,d)                      Perl_do_vop(aTHX_ a,b,c,d)
+#   define dofile(a,b)                          Perl_dofile(aTHX_ a,b)
+#   define dump_all_perl(a)                     Perl_dump_all_perl(aTHX_ a)
+#   define dump_packsubs_perl(a,b)              Perl_dump_packsubs_perl(aTHX_ a,b)
+#   define dump_sub_perl(a,b)                   Perl_dump_sub_perl(aTHX_ a,b)
+#   define find_lexical_cv(a)                   Perl_find_lexical_cv(aTHX_ a)
+#   define find_runcv_where(a,b,c)              Perl_find_runcv_where(aTHX_ a,b,c)
+#   define find_script(a,b,c,d)                 Perl_find_script(aTHX_ a,b,c,d)
+#   define force_locale_unlock                  Perl_force_locale_unlock
+#   define free_tied_hv_pool()                  Perl_free_tied_hv_pool(aTHX)
+#   define get_extended_os_errno                Perl_get_extended_os_errno
+#   define get_hash_seed(a)                     Perl_get_hash_seed(aTHX_ a)
+#   define get_no_modify()                      Perl_get_no_modify(aTHX)
+#   define get_opargs()                         Perl_get_opargs(aTHX)
+#   define gv_override(a,b)                     Perl_gv_override(aTHX_ a,b)
+#   define gv_setref(a,b)                       Perl_gv_setref(aTHX_ a,b)
+#   define gv_try_downgrade(a)                  Perl_gv_try_downgrade(aTHX_ a)
+#   define hv_ename_add(a,b,c,d)                Perl_hv_ename_add(aTHX_ a,b,c,d)
+#   define hv_ename_delete(a,b,c,d)             Perl_hv_ename_delete(aTHX_ a,b,c,d)
+#   define hv_pushkv(a,b)                       Perl_hv_pushkv(aTHX_ a,b)
+#   define init_argv_symbols(a,b)               Perl_init_argv_symbols(aTHX_ a,b)
+#   define init_constants()                     Perl_init_constants(aTHX)
+#   define init_debugger()                      Perl_init_debugger(aTHX)
+#   define init_named_cv(a,b)                   Perl_init_named_cv(aTHX_ a,b)
+#   define init_uniprops()                      Perl_init_uniprops(aTHX)
+#   define invert(a)                            Perl_invert(aTHX_ a)
+#   define invmap_dump(a,b)                     Perl_invmap_dump(aTHX_ a,b)
+#   define io_close(a,b,c,d)                    Perl_io_close(aTHX_ a,b,c,d)
+#   define isinfnansv(a)                        Perl_isinfnansv(aTHX_ a)
+#   define jmaybe(a)                            Perl_jmaybe(aTHX_ a)
+#   define keyword(a,b,c)                       Perl_keyword(aTHX_ a,b,c)
+#   define list(a)                              Perl_list(aTHX_ a)
+#   define localize(a,b)                        Perl_localize(aTHX_ a,b)
+#   define magic_clear_all_env(a,b)             Perl_magic_clear_all_env(aTHX_ a,b)
+#   define magic_cleararylen_p(a,b)             Perl_magic_cleararylen_p(aTHX_ a,b)
+#   define magic_clearenv(a,b)                  Perl_magic_clearenv(aTHX_ a,b)
+#   define magic_clearhint(a,b)                 Perl_magic_clearhint(aTHX_ a,b)
+#   define magic_clearhints(a,b)                Perl_magic_clearhints(aTHX_ a,b)
+#   define magic_clearhook(a,b)                 Perl_magic_clearhook(aTHX_ a,b)
+#   define magic_clearhookall(a,b)              Perl_magic_clearhookall(aTHX_ a,b)
+#   define magic_clearisa(a,b)                  Perl_magic_clearisa(aTHX_ a,b)
+#   define magic_clearpack(a,b)                 Perl_magic_clearpack(aTHX_ a,b)
+#   define magic_clearsig(a,b)                  Perl_magic_clearsig(aTHX_ a,b)
+#   define magic_copycallchecker(a,b,c,d,e)     Perl_magic_copycallchecker(aTHX_ a,b,c,d,e)
+#   define magic_existspack(a,b)                Perl_magic_existspack(aTHX_ a,b)
+#   define magic_freearylen_p(a,b)              Perl_magic_freearylen_p(aTHX_ a,b)
+#   define magic_freedestruct(a,b)              Perl_magic_freedestruct(aTHX_ a,b)
+#   define magic_freemglob(a,b)                 Perl_magic_freemglob(aTHX_ a,b)
+#   define magic_freeovrld(a,b)                 Perl_magic_freeovrld(aTHX_ a,b)
+#   define magic_freeutf8(a,b)                  Perl_magic_freeutf8(aTHX_ a,b)
+#   define magic_get(a,b)                       Perl_magic_get(aTHX_ a,b)
+#   define magic_getarylen(a,b)                 Perl_magic_getarylen(aTHX_ a,b)
+#   define magic_getdebugvar(a,b)               Perl_magic_getdebugvar(aTHX_ a,b)
+#   define magic_getdefelem(a,b)                Perl_magic_getdefelem(aTHX_ a,b)
+#   define magic_getnkeys(a,b)                  Perl_magic_getnkeys(aTHX_ a,b)
+#   define magic_getpack(a,b)                   Perl_magic_getpack(aTHX_ a,b)
+#   define magic_getpos(a,b)                    Perl_magic_getpos(aTHX_ a,b)
+#   define magic_getsig(a,b)                    Perl_magic_getsig(aTHX_ a,b)
+#   define magic_getsubstr(a,b)                 Perl_magic_getsubstr(aTHX_ a,b)
+#   define magic_gettaint(a,b)                  Perl_magic_gettaint(aTHX_ a,b)
+#   define magic_getuvar(a,b)                   Perl_magic_getuvar(aTHX_ a,b)
+#   define magic_getvec(a,b)                    Perl_magic_getvec(aTHX_ a,b)
+#   define magic_killbackrefs(a,b)              Perl_magic_killbackrefs(aTHX_ a,b)
+#   define magic_nextpack(a,b,c)                Perl_magic_nextpack(aTHX_ a,b,c)
+#   define magic_regdata_cnt(a,b)               Perl_magic_regdata_cnt(aTHX_ a,b)
+#   define magic_regdatum_get(a,b)              Perl_magic_regdatum_get(aTHX_ a,b)
+#   define magic_scalarpack(a,b)                Perl_magic_scalarpack(aTHX_ a,b)
+#   define magic_set(a,b)                       Perl_magic_set(aTHX_ a,b)
+#   define magic_set_all_env(a,b)               Perl_magic_set_all_env(aTHX_ a,b)
+#   define magic_setarylen(a,b)                 Perl_magic_setarylen(aTHX_ a,b)
+#   define magic_setdbline(a,b)                 Perl_magic_setdbline(aTHX_ a,b)
+#   define magic_setdebugvar(a,b)               Perl_magic_setdebugvar(aTHX_ a,b)
+#   define magic_setdefelem(a,b)                Perl_magic_setdefelem(aTHX_ a,b)
+#   define magic_setenv(a,b)                    Perl_magic_setenv(aTHX_ a,b)
+#   define magic_sethint(a,b)                   Perl_magic_sethint(aTHX_ a,b)
+#   define magic_sethook(a,b)                   Perl_magic_sethook(aTHX_ a,b)
+#   define magic_sethookall(a,b)                Perl_magic_sethookall(aTHX_ a,b)
+#   define magic_setisa(a,b)                    Perl_magic_setisa(aTHX_ a,b)
+#   define magic_setlvref(a,b)                  Perl_magic_setlvref(aTHX_ a,b)
+#   define magic_setmglob(a,b)                  Perl_magic_setmglob(aTHX_ a,b)
+#   define magic_setnkeys(a,b)                  Perl_magic_setnkeys(aTHX_ a,b)
+#   define magic_setnonelem(a,b)                Perl_magic_setnonelem(aTHX_ a,b)
+#   define magic_setpack(a,b)                   Perl_magic_setpack(aTHX_ a,b)
+#   define magic_setpos(a,b)                    Perl_magic_setpos(aTHX_ a,b)
+#   define magic_setregexp(a,b)                 Perl_magic_setregexp(aTHX_ a,b)
+#   define magic_setsig(a,b)                    Perl_magic_setsig(aTHX_ a,b)
+#   define magic_setsigall(a,b)                 Perl_magic_setsigall(aTHX_ a,b)
+#   define magic_setsubstr(a,b)                 Perl_magic_setsubstr(aTHX_ a,b)
+#   define magic_settaint(a,b)                  Perl_magic_settaint(aTHX_ a,b)
+#   define magic_setutf8(a,b)                   Perl_magic_setutf8(aTHX_ a,b)
+#   define magic_setuvar(a,b)                   Perl_magic_setuvar(aTHX_ a,b)
+#   define magic_setvec(a,b)                    Perl_magic_setvec(aTHX_ a,b)
+#   define magic_sizepack(a,b)                  Perl_magic_sizepack(aTHX_ a,b)
+#   define magic_wipepack(a,b)                  Perl_magic_wipepack(aTHX_ a,b)
+#   define mg_localize(a,b,c)                   Perl_mg_localize(aTHX_ a,b,c)
+#   define mode_from_discipline(a,b)            Perl_mode_from_discipline(aTHX_ a,b)
+#   define mro_isa_changed_in(a)                Perl_mro_isa_changed_in(aTHX_ a)
+#   define mro_package_moved(a,b,c,d)           Perl_mro_package_moved(aTHX_ a,b,c,d)
+#   define my_attrs(a,b)                        Perl_my_attrs(aTHX_ a,b)
+#   define my_clearenv()                        Perl_my_clearenv(aTHX)
+#   define my_lstat_flags(a)                    Perl_my_lstat_flags(aTHX_ a)
+#   define my_stat_flags(a)                     Perl_my_stat_flags(aTHX_ a)
+#   define my_strerror(a,b)                     Perl_my_strerror(aTHX_ a,b)
+#   define my_unexec()                          Perl_my_unexec(aTHX)
+#   define newATTRSUB_x(a,b,c,d,e,f)            Perl_newATTRSUB_x(aTHX_ a,b,c,d,e,f)
+#   define newSTUB(a,b)                         Perl_newSTUB(aTHX_ a,b)
+#   define newSVavdefelem(a,b,c)                Perl_newSVavdefelem(aTHX_ a,b,c)
+#   define newXS_deffile(a,b)                   Perl_newXS_deffile(aTHX_ a,b)
+#   define newXS_len_flags(a,b,c,d,e,f,g)       Perl_newXS_len_flags(aTHX_ a,b,c,d,e,f,g)
+#   define nextargv(a,b)                        Perl_nextargv(aTHX_ a,b)
+#   define no_bareword_filehandle(a)            Perl_no_bareword_filehandle(aTHX_ a)
+#   define noperl_die                           Perl_noperl_die
+#   define notify_parser_that_changed_to_utf8() Perl_notify_parser_that_changed_to_utf8(aTHX)
+#   define oopsAV(a)                            Perl_oopsAV(aTHX_ a)
+#   define oopsHV(a)                            Perl_oopsHV(aTHX_ a)
+#   define op_unscope(a)                        Perl_op_unscope(aTHX_ a)
+#   define package(a)                           Perl_package(aTHX_ a)
+#   define package_version(a)                   Perl_package_version(aTHX_ a)
+#   define pad_add_weakref(a)                   Perl_pad_add_weakref(aTHX_ a)
+#   define pad_block_start(a)                   Perl_pad_block_start(aTHX_ a)
+#   define pad_fixup_inner_anons(a,b,c)         Perl_pad_fixup_inner_anons(aTHX_ a,b,c)
+#   define pad_free(a)                          Perl_pad_free(aTHX_ a)
+#   define pad_leavemy()                        Perl_pad_leavemy(aTHX)
+#   define pad_push(a,b)                        Perl_pad_push(aTHX_ a,b)
+#   define pad_swipe(a,b)                       Perl_pad_swipe(aTHX_ a,b)
+#   define padlist_store(a,b,c)                 Perl_padlist_store(aTHX_ a,b,c)
+#   define parse_unicode_opts(a)                Perl_parse_unicode_opts(aTHX_ a)
+#   define parser_free(a)                       Perl_parser_free(aTHX_ a)
+#   define peep(a)                              Perl_peep(aTHX_ a)
+#   define pmruntime(a,b,c,d,e)                 Perl_pmruntime(aTHX_ a,b,c,d,e)
+#   define re_op_compile(a,b,c,d,e,f,g,h)       Perl_re_op_compile(aTHX_ a,b,c,d,e,f,g,h)
+#   define refcounted_he_chain_2hv(a,b)         Perl_refcounted_he_chain_2hv(aTHX_ a,b)
+#   define refcounted_he_fetch_pv(a,b,c,d)      Perl_refcounted_he_fetch_pv(aTHX_ a,b,c,d)
+#   define refcounted_he_fetch_pvn(a,b,c,d,e)   Perl_refcounted_he_fetch_pvn(aTHX_ a,b,c,d,e)
+#   define refcounted_he_fetch_sv(a,b,c,d)      Perl_refcounted_he_fetch_sv(aTHX_ a,b,c,d)
+#   define refcounted_he_free(a)                Perl_refcounted_he_free(aTHX_ a)
+#   define refcounted_he_inc(a)                 Perl_refcounted_he_inc(aTHX_ a)
+#   define refcounted_he_new_pv(a,b,c,d,e)      Perl_refcounted_he_new_pv(aTHX_ a,b,c,d,e)
+#   define refcounted_he_new_pvn(a,b,c,d,e,f)   Perl_refcounted_he_new_pvn(aTHX_ a,b,c,d,e,f)
+#   define refcounted_he_new_sv(a,b,c,d,e)      Perl_refcounted_he_new_sv(aTHX_ a,b,c,d,e)
+#   define report_evil_fh(a)                    Perl_report_evil_fh(aTHX_ a)
+#   define report_wrongway_fh(a,b)              Perl_report_wrongway_fh(aTHX_ a,b)
+#   define rpeep(a)                             Perl_rpeep(aTHX_ a)
+#   define rsignal_restore(a,b)                 Perl_rsignal_restore(aTHX_ a,b)
+#   define rsignal_save(a,b,c)                  Perl_rsignal_save(aTHX_ a,b,c)
+#   define rxres_save(a,b)                      Perl_rxres_save(aTHX_ a,b)
+#   define save_strlen(a)                       Perl_save_strlen(aTHX_ a)
+#   define sawparens(a)                         Perl_sawparens(aTHX_ a)
+#   define scalar(a)                            Perl_scalar(aTHX_ a)
+#   define scalarvoid(a)                        Perl_scalarvoid(aTHX_ a)
+#   define set_caret_X()                        Perl_set_caret_X(aTHX)
+#   define set_numeric_standard()               Perl_set_numeric_standard(aTHX)
+#   define set_numeric_underlying()             Perl_set_numeric_underlying(aTHX)
+#   define setfd_cloexec                        Perl_setfd_cloexec
+#   define setfd_cloexec_for_nonsysfd(a)        Perl_setfd_cloexec_for_nonsysfd(aTHX_ a)
+#   define setfd_cloexec_or_inhexec_by_sysfdness(a) Perl_setfd_cloexec_or_inhexec_by_sysfdness(aTHX_ a)
+#   define setfd_inhexec                        Perl_setfd_inhexec
+#   define setfd_inhexec_for_sysfd(a)           Perl_setfd_inhexec_for_sysfd(aTHX_ a)
+#   define sighandler1                          Perl_sighandler1
+#   define sighandler3                          Perl_sighandler3
+#   define sub_crush_depth(a)                   Perl_sub_crush_depth(aTHX_ a)
+#   define sv_2num(a)                           Perl_sv_2num(aTHX_ a)
+#   define sv_clean_all()                       Perl_sv_clean_all(aTHX)
+#   define sv_clean_objs()                      Perl_sv_clean_objs(aTHX)
+#   define sv_del_backref(a,b)                  Perl_sv_del_backref(aTHX_ a,b)
+#   define sv_free_arenas()                     Perl_sv_free_arenas(aTHX)
+#   define sv_pvbyten_force_wrapper(a,b,c)      Perl_sv_pvbyten_force_wrapper(aTHX_ a,b,c)
+#   define sv_pvutf8n_force_wrapper(a,b,c)      Perl_sv_pvutf8n_force_wrapper(aTHX_ a,b,c)
+#   define sv_resetpvn(a,b,c)                   Perl_sv_resetpvn(aTHX_ a,b,c)
+#   define sv_sethek(a,b)                       Perl_sv_sethek(aTHX_ a,b)
+#   define tmps_grow_p(a)                       Perl_tmps_grow_p(aTHX_ a)
+#   define utilize(a,b,c,d,e)                   Perl_utilize(aTHX_ a,b,c,d,e)
+#   define vivify_ref(a,b)                      Perl_vivify_ref(aTHX_ a,b)
+#   define wait4pid(a,b,c)                      Perl_wait4pid(aTHX_ a,b,c)
+#   define watch(a)                             Perl_watch(aTHX_ a)
+#   define write_to_stderr(a)                   Perl_write_to_stderr(aTHX_ a)
+#   define xs_boot_epilog(a)                    Perl_xs_boot_epilog(aTHX_ a)
+#   define yyerror(a)                           Perl_yyerror(aTHX_ a)
+#   define yyerror_pv(a,b)                      Perl_yyerror_pv(aTHX_ a,b)
+#   define yyerror_pvn(a,b,c)                   Perl_yyerror_pvn(aTHX_ a,b,c)
+#   define yyparse(a)                           Perl_yyparse(aTHX_ a)
+#   define yyquit()                             Perl_yyquit(aTHX)
+#   define yyunlex()                            Perl_yyunlex(aTHX)
+#   define opslab_force_free(a)                 Perl_opslab_force_free(aTHX_ a)
+#   define opslab_free(a)                       Perl_opslab_free(aTHX_ a)
+#   define opslab_free_nopad(a)                 Perl_opslab_free_nopad(aTHX_ a)
+#   define parser_free_nexttoke_ops(a,b)        Perl_parser_free_nexttoke_ops(aTHX_ a,b)
+#   define should_warn_nl                       S_should_warn_nl
+#   if defined(DEBUGGING)
+#     define get_debug_opts(a,b)                Perl_get_debug_opts(aTHX_ a,b)
+#     define set_padlist                        Perl_set_padlist
+#   endif
+#   if defined(DEBUG_LEAKING_SCALARS_FORK_DUMP)
+#     define dump_sv_child(a)                   Perl_dump_sv_child(aTHX_ a)
+#   endif
+#   if !defined(HAS_GETENV_LEN)
+#     define getenv_len(a,b)                    Perl_getenv_len(aTHX_ a,b)
+#   endif
+#   if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
+#     define do_ipcctl(a,b,c)                   Perl_do_ipcctl(aTHX_ a,b,c)
+#     define do_ipcget(a,b,c)                   Perl_do_ipcget(aTHX_ a,b,c)
+#     define do_msgrcv(a,b)                     Perl_do_msgrcv(aTHX_ a,b)
+#     define do_msgsnd(a,b)                     Perl_do_msgsnd(aTHX_ a,b)
+#     define do_semop(a,b)                      Perl_do_semop(aTHX_ a,b)
+#     define do_shmio(a,b,c)                    Perl_do_shmio(aTHX_ a,b,c)
+#   endif
+#   if defined(HAS_PIPE)
+#     define PerlProc_pipe_cloexec(a)           Perl_PerlProc_pipe_cloexec(aTHX_ a)
+#   endif
+#   if !defined(HAS_RENAME)
+#     define same_dirent(a,b)                   Perl_same_dirent(aTHX_ a,b)
+#   endif
+#   if defined(HAS_SOCKET)
+#     define PerlSock_accept_cloexec(a,b,c)     Perl_PerlSock_accept_cloexec(aTHX_ a,b,c)
+#     define PerlSock_socket_cloexec(a,b,c)     Perl_PerlSock_socket_cloexec(aTHX_ a,b,c)
+#   endif
+#   if   defined(HAS_SOCKETPAIR) ||                                     \
+       ( defined(AF_INET) && defined(HAS_SOCKET) && defined(PF_INET) && \
+         defined(SOCK_DGRAM) )
+#     define PerlSock_socketpair_cloexec(a,b,c,d) Perl_PerlSock_socketpair_cloexec(aTHX_ a,b,c,d)
+#   endif
+#   if defined(_MSC_VER)
+#     define magic_regdatum_set(a,b)            Perl_magic_regdatum_set(aTHX_ a,b)
+#   else
+#     define magic_regdatum_set(a,b)            Perl_magic_regdatum_set(aTHX_ a,b)
+#   endif
+#   if !defined(MULTIPLICITY) || defined(PERL_CORE)
+#     define tied_method(a,b,c,d,e,...)         Perl_tied_method(aTHX_ a,b,c,d,e,__VA_ARGS__)
+#     if defined(PERL_IN_REGCOMP_C)
+#       define re_croak(a,...)                  S_re_croak(aTHX_ a,__VA_ARGS__)
+#     endif
+#   endif
+#   if defined(PERL_DEBUG_READONLY_COW)
+#     define sv_buf_to_ro(a)                    Perl_sv_buf_to_ro(aTHX_ a)
+#   endif
+#   if defined(PERL_DEBUG_READONLY_OPS)
+#     define Slab_to_ro(a)                      Perl_Slab_to_ro(aTHX_ a)
+#     define Slab_to_rw(a)                      Perl_Slab_to_rw(aTHX_ a)
+#   endif
+#   if !defined(PERL_DEFAULT_DO_EXEC3_IMPLEMENTATION)
+#     define do_exec(a)                         Perl_do_exec(aTHX_ a)
+#   endif
+#   if defined(PERL_IN_AV_C)
+#     define get_aux_mg(a)                      S_get_aux_mg(aTHX_ a)
+#   endif
+#   if defined(PERL_IN_DEB_C)
+#     define deb_stack_n(a,b,c,d,e)             S_deb_stack_n(aTHX_ a,b,c,d,e)
+#   endif
+#   if defined(PERL_IN_DOIO_C)
+#     define argvout_final(a,b,c)               S_argvout_final(aTHX_ a,b,c)
+#     define exec_failed(a,b,c)                 S_exec_failed(aTHX_ a,b,c)
+#     define ingroup(a,b)                       S_ingroup(aTHX_ a,b)
+#     define openn_cleanup(a,b,c,d,e,f,g,h,i,j,k,l,m) S_openn_cleanup(aTHX_ a,b,c,d,e,f,g,h,i,j,k,l,m)
+#     define openn_setup(a,b,c,d,e,f)           S_openn_setup(aTHX_ a,b,c,d,e,f)
+#   endif
+#   if defined(PERL_IN_DOOP_C)
+#     define do_trans_complex(a,b)              S_do_trans_complex(aTHX_ a,b)
+#     define do_trans_count(a,b)                S_do_trans_count(aTHX_ a,b)
+#     define do_trans_count_invmap(a,b)         S_do_trans_count_invmap(aTHX_ a,b)
+#     define do_trans_invmap(a,b)               S_do_trans_invmap(aTHX_ a,b)
+#     define do_trans_simple(a,b)               S_do_trans_simple(aTHX_ a,b)
+#   endif
+#   if defined(PERL_IN_DUMP_C)
+#     define deb_curcv(a)                       S_deb_curcv(aTHX_ a)
+#     define debprof(a)                         S_debprof(aTHX_ a)
+#     define pm_description(a)                  S_pm_description(aTHX_ a)
+#     define sequence_num(a)                    S_sequence_num(aTHX_ a)
+#   endif
+#   if defined(PERL_IN_GLOBALS_C) || defined(PERL_IN_OP_C) || \
+       defined(PERL_IN_PEEP_C)
+#     define ck_anoncode(a)                     Perl_ck_anoncode(aTHX_ a)
+#     define ck_backtick(a)                     Perl_ck_backtick(aTHX_ a)
+#     define ck_bitop(a)                        Perl_ck_bitop(aTHX_ a)
+#     define ck_cmp(a)                          Perl_ck_cmp(aTHX_ a)
+#     define ck_concat(a)                       Perl_ck_concat(aTHX_ a)
+#     define ck_defined(a)                      Perl_ck_defined(aTHX_ a)
+#     define ck_delete(a)                       Perl_ck_delete(aTHX_ a)
+#     define ck_each(a)                         Perl_ck_each(aTHX_ a)
+#     define ck_eof(a)                          Perl_ck_eof(aTHX_ a)
+#     define ck_eval(a)                         Perl_ck_eval(aTHX_ a)
+#     define ck_exec(a)                         Perl_ck_exec(aTHX_ a)
+#     define ck_exists(a)                       Perl_ck_exists(aTHX_ a)
+#     define ck_ftst(a)                         Perl_ck_ftst(aTHX_ a)
+#     define ck_fun(a)                          Perl_ck_fun(aTHX_ a)
+#     define ck_glob(a)                         Perl_ck_glob(aTHX_ a)
+#     define ck_grep(a)                         Perl_ck_grep(aTHX_ a)
+#     define ck_helemexistsor(a)                Perl_ck_helemexistsor(aTHX_ a)
+#     define ck_index(a)                        Perl_ck_index(aTHX_ a)
+#     define ck_isa(a)                          Perl_ck_isa(aTHX_ a)
+#     define ck_join(a)                         Perl_ck_join(aTHX_ a)
+#     define ck_length(a)                       Perl_ck_length(aTHX_ a)
+#     define ck_lfun(a)                         Perl_ck_lfun(aTHX_ a)
+#     define ck_listiob(a)                      Perl_ck_listiob(aTHX_ a)
+#     define ck_match(a)                        Perl_ck_match(aTHX_ a)
+#     define ck_method(a)                       Perl_ck_method(aTHX_ a)
+#     define ck_null(a)                         Perl_ck_null(aTHX_ a)
+#     define ck_open(a)                         Perl_ck_open(aTHX_ a)
+#     define ck_prototype(a)                    Perl_ck_prototype(aTHX_ a)
+#     define ck_readline(a)                     Perl_ck_readline(aTHX_ a)
+#     define ck_refassign(a)                    Perl_ck_refassign(aTHX_ a)
+#     define ck_repeat(a)                       Perl_ck_repeat(aTHX_ a)
+#     define ck_require(a)                      Perl_ck_require(aTHX_ a)
+#     define ck_return(a)                       Perl_ck_return(aTHX_ a)
+#     define ck_rfun(a)                         Perl_ck_rfun(aTHX_ a)
+#     define ck_rvconst(a)                      Perl_ck_rvconst(aTHX_ a)
+#     define ck_sassign(a)                      Perl_ck_sassign(aTHX_ a)
+#     define ck_select(a)                       Perl_ck_select(aTHX_ a)
+#     define ck_shift(a)                        Perl_ck_shift(aTHX_ a)
+#     define ck_smartmatch(a)                   Perl_ck_smartmatch(aTHX_ a)
+#     define ck_sort(a)                         Perl_ck_sort(aTHX_ a)
+#     define ck_spair(a)                        Perl_ck_spair(aTHX_ a)
+#     define ck_split(a)                        Perl_ck_split(aTHX_ a)
+#     define ck_stringify(a)                    Perl_ck_stringify(aTHX_ a)
+#     define ck_subr(a)                         Perl_ck_subr(aTHX_ a)
+#     define ck_substr(a)                       Perl_ck_substr(aTHX_ a)
+#     define ck_svconst(a)                      Perl_ck_svconst(aTHX_ a)
+#     define ck_tell(a)                         Perl_ck_tell(aTHX_ a)
+#     define ck_trunc(a)                        Perl_ck_trunc(aTHX_ a)
+#     define ck_trycatch(a)                     Perl_ck_trycatch(aTHX_ a)
+#   endif /* defined(PERL_IN_GLOBALS_C) || defined(PERL_IN_OP_C) ||
+             defined(PERL_IN_PEEP_C) */
+#   if defined(PERL_IN_GV_C)
+#     define find_default_stash(a,b,c,d,e,f)    S_find_default_stash(aTHX_ a,b,c,d,e,f)
+#     define gv_fetchmeth_internal(a,b,c,d,e,f) S_gv_fetchmeth_internal(aTHX_ a,b,c,d,e,f)
+#     define gv_init_svtype(a,b)                S_gv_init_svtype(aTHX_ a,b)
+#     define gv_is_in_main(a,b,c)               S_gv_is_in_main(aTHX_ a,b,c)
+#     define gv_magicalize(a,b,c,d,e)           S_gv_magicalize(aTHX_ a,b,c,d,e)
+#     define gv_magicalize_isa(a)               S_gv_magicalize_isa(aTHX_ a)
+#     define gv_stashpvn_internal(a,b,c)        S_gv_stashpvn_internal(aTHX_ a,b,c)
+#     define maybe_multimagic_gv(a,b,c)         S_maybe_multimagic_gv(aTHX_ a,b,c)
+#     define parse_gv_stash_name(a,b,c,d,e,f,g,h) S_parse_gv_stash_name(aTHX_ a,b,c,d,e,f,g,h)
+#     define require_tie_mod(a,b,c,d,e)         S_require_tie_mod(aTHX_ a,b,c,d,e)
+#   endif /* defined(PERL_IN_GV_C) */
+#   if defined(PERL_IN_HV_C)
+#     define clear_placeholders(a,b)            S_clear_placeholders(aTHX_ a,b)
+#     define hsplit(a,b,c)                      S_hsplit(aTHX_ a,b,c)
+#     define hv_auxinit(a)                      S_hv_auxinit(aTHX_ a)
+#     define hv_delete_common(a,b,c,d,e,f,g)    S_hv_delete_common(aTHX_ a,b,c,d,e,f,g)
+#     define hv_free_ent_ret(a)                 S_hv_free_ent_ret(aTHX_ a)
+#     define hv_free_entries(a)                 S_hv_free_entries(aTHX_ a)
+#     define hv_magic_check                     S_hv_magic_check
+#     define hv_notallowed(a,b,c,d)             S_hv_notallowed(aTHX_ a,b,c,d)
+#     define refcounted_he_value(a)             S_refcounted_he_value(aTHX_ a)
+#     define save_hek_flags                     S_save_hek_flags
+#     define share_hek_flags(a,b,c,d)           S_share_hek_flags(aTHX_ a,b,c,d)
+#     define unshare_hek_or_pvn(a,b,c,d)        S_unshare_hek_or_pvn(aTHX_ a,b,c,d)
+#     if !defined(PURIFY)
+#       define new_he()                         S_new_he(aTHX)
+#     endif
+#   endif /* defined(PERL_IN_HV_C) */
+#   if defined(PERL_IN_LOCALE_C)
+#     define get_locale_string_utf8ness_i(a,b,c,d) S_get_locale_string_utf8ness_i(aTHX_ a,b,c,d)
+#     define is_locale_utf8(a)                  S_is_locale_utf8(aTHX_ a)
+#     if defined(HAS_LOCALECONV)
+#       define my_localeconv(a)                 S_my_localeconv(aTHX_ a)
+#       define populate_hash_from_localeconv(a,b,c,d,e) S_populate_hash_from_localeconv(aTHX_ a,b,c,d,e)
+#     endif
+#     if defined(USE_LOCALE)
+#       define get_category_index               S_get_category_index
+#       define get_category_index_nowarn        S_get_category_index_nowarn
+#       define mortalized_pv_copy(a)            S_mortalized_pv_copy(aTHX_ a)
+#       define new_LC_ALL(a,b)                  S_new_LC_ALL(aTHX_ a,b)
+#       define save_to_buffer                   S_save_to_buffer
+#       define setlocale_failure_panic_i(a,b,c,d,e) S_setlocale_failure_panic_i(aTHX_ a,b,c,d,e)
+#       define stdize_locale(a,b,c,d,e)         S_stdize_locale(aTHX_ a,b,c,d,e)
+#       if defined(DEBUGGING)
+#         define my_setlocale_debug_string_i(a,b,c,d) S_my_setlocale_debug_string_i(aTHX_ a,b,c,d)
+#       endif
+#       if defined(HAS_NL_LANGINFO) || defined(HAS_NL_LANGINFO_L)
+#         define my_langinfo_i(a,b,c,d,e,f)     S_my_langinfo_i(aTHX_ a,b,c,d,e,f)
+#       else
+#         define my_langinfo_i(a,b,c,d,e,f)     S_my_langinfo_i(aTHX_ a,b,c,d,e,f)
+#       endif
+#       if defined(USE_LOCALE_COLLATE)
+#         define new_collate(a,b)               S_new_collate(aTHX_ a,b)
+#         if defined(DEBUGGING)
+#           define print_collxfrm_input_and_return(a,b,c,d,e) S_print_collxfrm_input_and_return(aTHX_ a,b,c,d,e)
+#         endif
+#       endif
+#       if defined(USE_LOCALE_CTYPE)
+#         define is_codeset_name_UTF8           S_is_codeset_name_UTF8
+#         define new_ctype(a,b)                 S_new_ctype(aTHX_ a,b)
+#       endif
+#       if defined(USE_LOCALE_NUMERIC)
+#         define new_numeric(a,b)               S_new_numeric(aTHX_ a,b)
+#       endif
+#       if defined(USE_PERL_SWITCH_LOCALE_CONTEXT) || defined(DEBUGGING)
+#         define get_LC_ALL_display()           S_get_LC_ALL_display(aTHX)
+#       endif
+#       if defined(USE_POSIX_2008_LOCALE)
+#         define emulate_setlocale_i(a,b,c,d)   S_emulate_setlocale_i(aTHX_ a,b,c,d)
+#         define my_querylocale_i(a)            S_my_querylocale_i(aTHX_ a)
+#         define setlocale_from_aggregate_LC_ALL(a,b) S_setlocale_from_aggregate_LC_ALL(aTHX_ a,b)
+#         define use_curlocale_scratch()        S_use_curlocale_scratch(aTHX)
+#         if defined(USE_QUERYLOCALE)
+#           define calculate_LC_ALL(a)          S_calculate_LC_ALL(aTHX_ a)
+#         else
+#           define update_PL_curlocales_i(a,b,c) S_update_PL_curlocales_i(aTHX_ a,b,c)
+#         endif
+#       elif  defined(USE_LOCALE_THREADS) &&                  \
+             !defined(USE_THREAD_SAFE_LOCALE) &&              \
+             !defined(USE_THREAD_SAFE_LOCALE_EMULATION) /* &&
+             !defined(USE_POSIX_2008_LOCALE) */
+#         define less_dicey_setlocale_r(a,b)    S_less_dicey_setlocale_r(aTHX_ a,b)
+#         define less_dicey_void_setlocale_i(a,b,c) S_less_dicey_void_setlocale_i(aTHX_ a,b,c)
+#         if 0
+#           define less_dicey_bool_setlocale_r(a,b) S_less_dicey_bool_setlocale_r(aTHX_ a,b)
+#         endif
+#       endif
+#       if !(  defined(USE_POSIX_2008_LOCALE) && defined(USE_QUERYLOCALE) ) && \
+            ( !defined(LC_ALL) || defined(USE_POSIX_2008_LOCALE) ||            \
+               defined(WIN32) )
+#         define calculate_LC_ALL(a)            S_calculate_LC_ALL(aTHX_ a)
+#       endif
+#       if defined(WIN32)
+#         define Win_byte_string_to_wstring     S_Win_byte_string_to_wstring
+#         define Win_wstring_to_byte_string     S_Win_wstring_to_byte_string
+#         define win32_setlocale(a,b)           S_win32_setlocale(aTHX_ a,b)
+#         define wrap_wsetlocale(a,b)           S_wrap_wsetlocale(aTHX_ a,b)
+#       endif
+#       if   defined(WIN32) || \
+           ( defined(USE_POSIX_2008_LOCALE) && !defined(USE_QUERYLOCALE) )
+#         define find_locale_from_environment(a) S_find_locale_from_environment(aTHX_ a)
+#       endif
+#     endif /* defined(USE_LOCALE) */
+#     if defined(USE_POSIX_2008_LOCALE) || defined(DEBUGGING)
+#       define get_displayable_string(a,b,c)    S_get_displayable_string(aTHX_ a,b,c)
+#     endif
+#   endif /* defined(PERL_IN_LOCALE_C) */
+#   if defined(PERL_IN_MALLOC_C)
+#     define adjust_size_and_find_bucket        S_adjust_size_and_find_bucket
+#   endif
+#   if defined(PERL_IN_MG_C)
+#     define fixup_errno_string(a)              S_fixup_errno_string(aTHX_ a)
+#     define magic_methcall1(a,b,c,d,e,f)       S_magic_methcall1(aTHX_ a,b,c,d,e,f)
+#     define magic_methpack(a,b,c)              S_magic_methpack(aTHX_ a,b,c)
+#     define restore_magic(a)                   S_restore_magic(aTHX_ a)
+#     define save_magic_flags(a,b,c)            S_save_magic_flags(aTHX_ a,b,c)
+#     define unwind_handler_stack(a)            S_unwind_handler_stack(aTHX_ a)
+#   endif
+#   if defined(PERL_IN_MG_C) || defined(PERL_IN_PP_C)
+#     define translate_substr_offsets           Perl_translate_substr_offsets
+#   endif
+#   if defined(PERL_IN_MRO_C)
+#     define mro_clean_isarev(a,b,c,d,e,f)      S_mro_clean_isarev(aTHX_ a,b,c,d,e,f)
+#     define mro_gather_and_rename(a,b,c,d,e)   S_mro_gather_and_rename(aTHX_ a,b,c,d,e)
+#     define mro_get_linear_isa_dfs(a,b)        S_mro_get_linear_isa_dfs(aTHX_ a,b)
+#   endif
+#   if defined(PERL_IN_NUMERIC_C)
+#     define output_non_portable(a)             S_output_non_portable(aTHX_ a)
+#   endif
+#   if defined(PERL_IN_OP_C)
+#     define apply_attrs(a,b,c)                 S_apply_attrs(aTHX_ a,b,c)
+#     define apply_attrs_my(a,b,c,d)            S_apply_attrs_my(aTHX_ a,b,c,d)
+#     define assignment_type(a)                 S_assignment_type(aTHX_ a)
+#     define bad_type_gv(a,b,c,d)               S_bad_type_gv(aTHX_ a,b,c,d)
+#     define bad_type_pv(a,b,c,d)               S_bad_type_pv(aTHX_ a,b,c,d)
+#     define clear_special_blocks(a,b,c)        S_clear_special_blocks(aTHX_ a,b,c)
+#     define cop_free(a)                        S_cop_free(aTHX_ a)
+#     define dup_attrlist(a)                    S_dup_attrlist(aTHX_ a)
+#     define find_and_forget_pmops(a)           S_find_and_forget_pmops(aTHX_ a)
+#     define fold_constants(a)                  S_fold_constants(aTHX_ a)
+#     define force_list(a,b)                    S_force_list(aTHX_ a,b)
+#     define forget_pmop(a)                     S_forget_pmop(aTHX_ a)
+#     define gen_constant_list(a)               S_gen_constant_list(aTHX_ a)
+#     define inplace_aassign(a)                 S_inplace_aassign(aTHX_ a)
+#     define is_handle_constructor              S_is_handle_constructor
+#     define listkids(a)                        S_listkids(aTHX_ a)
+#     define looks_like_bool(a)                 S_looks_like_bool(aTHX_ a)
+#     define modkids(a,b)                       S_modkids(aTHX_ a,b)
+#     define move_proto_attr(a,b,c,d)           S_move_proto_attr(aTHX_ a,b,c,d)
+#     define my_kid(a,b,c)                      S_my_kid(aTHX_ a,b,c)
+#     define newGIVWHENOP(a,b,c,d,e)            S_newGIVWHENOP(aTHX_ a,b,c,d,e)
+#     define newMETHOP_internal(a,b,c,d)        S_newMETHOP_internal(aTHX_ a,b,c,d)
+#     define new_logop(a,b,c,d)                 S_new_logop(aTHX_ a,b,c,d)
+#     define no_fh_allowed(a)                   S_no_fh_allowed(aTHX_ a)
+#     define op_integerize(a)                   S_op_integerize(aTHX_ a)
+#     define op_std_init(a)                     S_op_std_init(aTHX_ a)
+#     define pmtrans(a,b,c)                     S_pmtrans(aTHX_ a,b,c)
+#     define process_special_blocks(a,b,c,d)    S_process_special_blocks(aTHX_ a,b,c,d)
+#     define ref_array_or_hash(a)               S_ref_array_or_hash(aTHX_ a)
+#     define refkids(a,b)                       S_refkids(aTHX_ a,b)
+#     define scalar_mod_type                    S_scalar_mod_type
+#     define scalarboolean(a)                   S_scalarboolean(aTHX_ a)
+#     define scalarkids(a)                      S_scalarkids(aTHX_ a)
+#     define search_const(a)                    S_search_const(aTHX_ a)
+#     define simplify_sort(a)                   S_simplify_sort(aTHX_ a)
+#     define too_few_arguments_pv(a,b,c)        S_too_few_arguments_pv(aTHX_ a,b,c)
+#     define too_many_arguments_pv(a,b,c)       S_too_many_arguments_pv(aTHX_ a,b,c)
+#     define voidnonfinal(a)                    S_voidnonfinal(aTHX_ a)
+#   endif /* defined(PERL_IN_OP_C) */
+#   if defined(PERL_IN_OP_C) || defined(PERL_IN_PAD_C)
+#     define PadnameIN_SCOPE                    S_PadnameIN_SCOPE
+#   endif
+#   if defined(PERL_IN_OP_C) || defined(PERL_IN_PEEP_C)
+#     define check_hash_fields_and_hekify(a,b,c) Perl_check_hash_fields_and_hekify(aTHX_ a,b,c)
+#     define no_bareword_allowed(a)             Perl_no_bareword_allowed(aTHX_ a)
+#     define op_prune_chain_head                Perl_op_prune_chain_head
+#     define op_varname(a)                      Perl_op_varname(aTHX_ a)
+#     define warn_elem_scalar_context(a,b,c,d)  Perl_warn_elem_scalar_context(aTHX_ a,b,c,d)
+#   endif
+#   if defined(PERL_IN_OP_C) || defined(PERL_IN_SV_C)
+#     define report_redefined_cv(a,b,c)         Perl_report_redefined_cv(aTHX_ a,b,c)
+#     define varname(a,b,c,d,e,f)               Perl_varname(aTHX_ a,b,c,d,e,f)
+#   endif
+#   if defined(PERL_IN_PAD_C)
+#     define pad_alloc_name(a,b,c,d)            S_pad_alloc_name(aTHX_ a,b,c,d)
+#     define pad_check_dup(a,b,c)               S_pad_check_dup(aTHX_ a,b,c)
+#     define pad_findlex(a,b,c,d,e,f,g,h,i)     S_pad_findlex(aTHX_ a,b,c,d,e,f,g,h,i)
+#     define pad_reset()                        S_pad_reset(aTHX)
+#     if defined(DEBUGGING)
+#       define cv_dump(a,b)                     S_cv_dump(aTHX_ a,b)
+#     endif
+#   endif
+#   if defined(PERL_IN_PEEP_C)
+#     define finalize_op(a)                     S_finalize_op(aTHX_ a)
+#     define optimize_op(a)                     S_optimize_op(aTHX_ a)
+#     define traverse_op_tree(a,b)              S_traverse_op_tree(aTHX_ a,b)
+#   endif
+#   if defined(PERL_IN_PERL_C)
+#     define find_beginning(a,b)                S_find_beginning(aTHX_ a,b)
+#     define forbid_setid(a,b)                  S_forbid_setid(aTHX_ a,b)
+#     define incpush(a,b,c)                     S_incpush(aTHX_ a,b,c)
+#     define incpush_use_sep(a,b,c)             S_incpush_use_sep(aTHX_ a,b,c)
+#     define init_ids()                         S_init_ids(aTHX)
+#     define init_interp()                      S_init_interp(aTHX)
+#     define init_main_stash()                  S_init_main_stash(aTHX)
+#     define init_perllib()                     S_init_perllib(aTHX)
+#     define init_postdump_symbols(a,b,c)       S_init_postdump_symbols(aTHX_ a,b,c)
+#     define init_predump_symbols()             S_init_predump_symbols(aTHX)
+#     define mayberelocate(a,b,c)               S_mayberelocate(aTHX_ a,b,c)
+#     define minus_v()                          S_minus_v(aTHX)
+#     define my_exit_jump()                     S_my_exit_jump(aTHX)
+#     define nuke_stacks()                      S_nuke_stacks(aTHX)
+#     define open_script(a,b,c)                 S_open_script(aTHX_ a,b,c)
+#     define parse_body(a,b)                    S_parse_body(aTHX_ a,b)
+#     define run_body(a)                        S_run_body(aTHX_ a)
+#     define usage()                            S_usage(aTHX)
+#     if !defined(PERL_IS_MINIPERL)
+#       define incpush_if_exists(a,b,c)         S_incpush_if_exists(aTHX_ a,b,c)
+#     endif
+#   endif /* defined(PERL_IN_PERL_C) */
+#   if defined(PERL_IN_PP_C)
+#     define do_chomp(a,b,c)                    S_do_chomp(aTHX_ a,b,c)
+#     define do_delete_local()                  S_do_delete_local(aTHX)
+#     define refto(a)                           S_refto(aTHX_ a)
+#   endif
+#   if defined(PERL_IN_PP_C) || defined(PERL_IN_PP_HOT_C)
+#     define lossless_NV_to_IV                  S_lossless_NV_to_IV
+#   endif
+#   if defined(PERL_IN_PP_C) || defined(PERL_IN_UTF8_C)
+#     define _to_upper_title_latin1(a,b,c,d)    Perl__to_upper_title_latin1(aTHX_ a,b,c,d)
+#   endif
+#   if defined(PERL_IN_PP_CTL_C)
+#     define check_type_and_open(a)             S_check_type_and_open(aTHX_ a)
+#     define destroy_matcher(a)                 S_destroy_matcher(aTHX_ a)
+#     define do_smartmatch(a,b,c)               S_do_smartmatch(aTHX_ a,b,c)
+#     define docatch(a)                         S_docatch(aTHX_ a)
+#     define doeval_compile(a,b,c,d)            S_doeval_compile(aTHX_ a,b,c,d)
+#     define dofindlabel(a,b,c,d,e,f)           S_dofindlabel(aTHX_ a,b,c,d,e,f)
+#     define doparseform(a)                     S_doparseform(aTHX_ a)
+#     define dopoptoeval(a)                     S_dopoptoeval(aTHX_ a)
+#     define dopoptogivenfor(a)                 S_dopoptogivenfor(aTHX_ a)
+#     define dopoptolabel(a,b,c)                S_dopoptolabel(aTHX_ a,b,c)
+#     define dopoptoloop(a)                     S_dopoptoloop(aTHX_ a)
+#     define dopoptosub_at(a,b)                 S_dopoptosub_at(aTHX_ a,b)
+#     define dopoptowhen(a)                     S_dopoptowhen(aTHX_ a)
+#     define make_matcher(a)                    S_make_matcher(aTHX_ a)
+#     define matcher_matches_sv(a,b)            S_matcher_matches_sv(aTHX_ a,b)
+#     define num_overflow                       S_num_overflow
+#     define path_is_searchable                 S_path_is_searchable
+#     define run_user_filter(a,b,c)             S_run_user_filter(aTHX_ a,b,c)
+#     define rxres_free(a)                      S_rxres_free(aTHX_ a)
+#     define rxres_restore(a,b)                 S_rxres_restore(aTHX_ a,b)
+#     define save_lines(a,b)                    S_save_lines(aTHX_ a,b)
+#     if !defined(PERL_DISABLE_PMC)
+#       define doopen_pm(a)                     S_doopen_pm(aTHX_ a)
+#     endif
+#   endif /* defined(PERL_IN_PP_CTL_C) */
+#   if defined(PERL_IN_PP_CTL_C) || defined(PERL_IN_UTIL_C)
+#     define invoke_exception_hook(a,b)         Perl_invoke_exception_hook(aTHX_ a,b)
+#   endif
+#   if defined(PERL_IN_PP_HOT_C)
+#     define do_oddball(a,b)                    S_do_oddball(aTHX_ a,b)
+#     define opmethod_stash(a)                  S_opmethod_stash(aTHX_ a)
+#     define should_we_output_Debug_r(a)        S_should_we_output_Debug_r(aTHX_ a)
+#   endif
+#   if defined(PERL_IN_PP_PACK_C)
+#     define div128(a,b)                        S_div128(aTHX_ a,b)
+#     define first_symbol                       S_first_symbol
+#     define get_num(a,b)                       S_get_num(aTHX_ a,b)
+#     define group_end(a,b,c)                   S_group_end(aTHX_ a,b,c)
+#     define is_an_int(a,b)                     S_is_an_int(aTHX_ a,b)
+#     define measure_struct(a)                  S_measure_struct(aTHX_ a)
+#     define mul128(a,b)                        S_mul128(aTHX_ a,b)
+#     define my_bytes_to_utf8                   S_my_bytes_to_utf8
+#     define need_utf8                          S_need_utf8
+#     define next_symbol(a)                     S_next_symbol(aTHX_ a)
+#     define pack_rec(a,b,c,d)                  S_pack_rec(aTHX_ a,b,c,d)
+#     define sv_exp_grow(a,b)                   S_sv_exp_grow(aTHX_ a,b)
+#     define unpack_rec(a,b,c,d,e)              S_unpack_rec(aTHX_ a,b,c,d,e)
+#   endif /* defined(PERL_IN_PP_PACK_C) */
+#   if defined(PERL_IN_PP_SORT_C)
+#     define amagic_cmp(a,b)                    S_amagic_cmp(aTHX_ a,b)
+#     define amagic_cmp_desc(a,b)               S_amagic_cmp_desc(aTHX_ a,b)
+#     define amagic_i_ncmp(a,b)                 S_amagic_i_ncmp(aTHX_ a,b)
+#     define amagic_i_ncmp_desc(a,b)            S_amagic_i_ncmp_desc(aTHX_ a,b)
+#     define amagic_ncmp(a,b)                   S_amagic_ncmp(aTHX_ a,b)
+#     define amagic_ncmp_desc(a,b)              S_amagic_ncmp_desc(aTHX_ a,b)
+#     define cmp_desc(a,b)                      S_cmp_desc(aTHX_ a,b)
+#     define sortcv(a,b)                        S_sortcv(aTHX_ a,b)
+#     define sortcv_stacked(a,b)                S_sortcv_stacked(aTHX_ a,b)
+#     define sortcv_xsub(a,b)                   S_sortcv_xsub(aTHX_ a,b)
+#     define sortsv_flags_impl(a,b,c,d)         S_sortsv_flags_impl(aTHX_ a,b,c,d)
+#     define sv_i_ncmp(a,b)                     S_sv_i_ncmp(aTHX_ a,b)
+#     define sv_i_ncmp_desc(a,b)                S_sv_i_ncmp_desc(aTHX_ a,b)
+#     define sv_ncmp(a,b)                       S_sv_ncmp(aTHX_ a,b)
+#     define sv_ncmp_desc(a,b)                  S_sv_ncmp_desc(aTHX_ a,b)
+#     if defined(USE_LOCALE_COLLATE)
+#       define amagic_cmp_locale(a,b)           S_amagic_cmp_locale(aTHX_ a,b)
+#       define amagic_cmp_locale_desc(a,b)      S_amagic_cmp_locale_desc(aTHX_ a,b)
+#       define cmp_locale_desc(a,b)             S_cmp_locale_desc(aTHX_ a,b)
+#     endif
+#   endif /* defined(PERL_IN_PP_SORT_C) */
+#   if defined(PERL_IN_PP_SYS_C)
+#     define doform(a,b,c)                      S_doform(aTHX_ a,b,c)
+#     define space_join_names_mortal(a)         S_space_join_names_mortal(aTHX_ a)
+#     if !defined(HAS_MKDIR) || !defined(HAS_RMDIR)
+#       define dooneliner(a,b)                  S_dooneliner(aTHX_ a,b)
+#     endif
+#   endif
+#   if defined(PERL_IN_REGCOMP_INVLIST_C) && !defined(PERL_EXT_RE_BUILD)
+#     define initialize_invlist_guts(a,b)       S_initialize_invlist_guts(aTHX_ a,b)
+#   endif
+#   if defined(PERL_IN_SCOPE_C)
+#     define save_pushptri32ptr(a,b,c,d)        S_save_pushptri32ptr(aTHX_ a,b,c,d)
+#     define save_scalar_at(a,b)                S_save_scalar_at(aTHX_ a,b)
+#   endif
+#   if defined(PERL_IN_TOKE_C)
+#     define ao(a)                              S_ao(aTHX_ a)
+#     define check_uni()                        S_check_uni(aTHX)
+#     define checkcomma(a,b,c)                  S_checkcomma(aTHX_ a,b,c)
+#     define filter_gets(a,b)                   S_filter_gets(aTHX_ a,b)
+#     define find_in_my_stash(a,b)              S_find_in_my_stash(aTHX_ a,b)
+#     define force_ident(a,b)                   S_force_ident(aTHX_ a,b)
+#     define force_ident_maybe_lex(a)           S_force_ident_maybe_lex(aTHX_ a)
+#     define force_next(a)                      S_force_next(aTHX_ a)
+#     define force_strict_version(a)            S_force_strict_version(aTHX_ a)
+#     define force_version(a,b)                 S_force_version(aTHX_ a,b)
+#     define force_word(a,b,c,d)                S_force_word(aTHX_ a,b,c,d)
+#     define get_and_check_backslash_N_name_wrapper(a,b) S_get_and_check_backslash_N_name_wrapper(aTHX_ a,b)
+#     define incline(a,b)                       S_incline(aTHX_ a,b)
+#     define intuit_method(a,b,c)               S_intuit_method(aTHX_ a,b,c)
+#     define intuit_more(a,b)                   S_intuit_more(aTHX_ a,b)
+#     define lop(a,b,c)                         S_lop(aTHX_ a,b,c)
+#     define missingterm(a,b)                   S_missingterm(aTHX_ a,b)
+#     define no_op(a,b)                         S_no_op(aTHX_ a,b)
+#     define parse_ident(a,b,c,d,e,f,g)         S_parse_ident(aTHX_ a,b,c,d,e,f,g)
+#     define pending_ident()                    S_pending_ident(aTHX)
+#     define scan_const(a)                      S_scan_const(aTHX_ a)
+#     define scan_formline(a)                   S_scan_formline(aTHX_ a)
+#     define scan_heredoc(a)                    S_scan_heredoc(aTHX_ a)
+#     define scan_ident(a,b,c,d)                S_scan_ident(aTHX_ a,b,c,d)
+#     define scan_inputsymbol(a)                S_scan_inputsymbol(aTHX_ a)
+#     define scan_pat(a,b)                      S_scan_pat(aTHX_ a,b)
+#     define scan_subst(a)                      S_scan_subst(aTHX_ a)
+#     define scan_trans(a)                      S_scan_trans(aTHX_ a)
+#     define sublex_done()                      S_sublex_done(aTHX)
+#     define sublex_push()                      S_sublex_push(aTHX)
+#     define sublex_start()                     S_sublex_start(aTHX)
+#     define swallow_bom(a)                     S_swallow_bom(aTHX_ a)
+#     define tokenize_use(a,b)                  S_tokenize_use(aTHX_ a,b)
+#     define tokeq(a)                           S_tokeq(aTHX_ a)
+#     define update_debugger_info(a,b,c)        S_update_debugger_info(aTHX_ a,b,c)
+#     define yywarn(a,b)                        S_yywarn(aTHX_ a,b)
+#     if defined(DEBUGGING)
+#       define printbuf(a,b)                    S_printbuf(aTHX_ a,b)
+#       define tokereport(a,b)                  S_tokereport(aTHX_ a,b)
+#     endif
+#     if defined(PERL_CR_FILTER)
+#       define cr_textfilter(a,b,c)             S_cr_textfilter(aTHX_ a,b,c)
+#       define strip_return(a)                  S_strip_return(aTHX_ a)
+#     endif
+#     if !defined(PERL_NO_UTF16_FILTER)
+#       define add_utf16_textfilter(a,b)        S_add_utf16_textfilter(aTHX_ a,b)
+#       define utf16_textfilter(a,b,c)          S_utf16_textfilter(aTHX_ a,b,c)
+#     endif
+#   endif /* defined(PERL_IN_TOKE_C) */
+#   if defined(PERL_IN_UNIVERSAL_C)
+#     define isa_lookup(a,b,c,d,e)              S_isa_lookup(aTHX_ a,b,c,d,e)
+#     define sv_derived_from_svpvn(a,b,c,d,e)   S_sv_derived_from_svpvn(aTHX_ a,b,c,d,e)
+#   endif
+#   if defined(PERL_IN_UTF8_C)
+#     define _to_utf8_case(a,b,c,d,e,f,g,h,i)   S__to_utf8_case(aTHX_ a,b,c,d,e,f,g,h,i)
+#     define check_locale_boundary_crossing(a,b,c,d) S_check_locale_boundary_crossing(aTHX_ a,b,c,d)
+#     define does_utf8_overflow                 S_does_utf8_overflow
+#     define isFF_overlong                      S_isFF_overlong
+#     define is_utf8_common(a,b,c)              S_is_utf8_common(aTHX_ a,b,c)
+#     define is_utf8_overlong                   S_is_utf8_overlong
+#     define new_msg_hv(a,b,c)                  S_new_msg_hv(aTHX_ a,b,c)
+#     define to_case_cp_list(a,b,c,d,e,f,g,h)   S_to_case_cp_list(aTHX_ a,b,c,d,e,f,g,h)
+#     define to_lower_latin1                    S_to_lower_latin1
+#     define turkic_fc(a,b,c,d)                 S_turkic_fc(aTHX_ a,b,c,d)
+#     define turkic_lc(a,b,c,d)                 S_turkic_lc(aTHX_ a,b,c,d)
+#     define turkic_uc(a,b,c,d)                 S_turkic_uc(aTHX_ a,b,c,d)
+#     define unexpected_non_continuation_text(a,b,c,d) S_unexpected_non_continuation_text(aTHX_ a,b,c,d)
+#     if 0
+#       define warn_on_first_deprecated_use(a,b,c,d,e,f) S_warn_on_first_deprecated_use(aTHX_ a,b,c,d,e,f)
+#     endif
+#   endif /* defined(PERL_IN_UTF8_C) */
+#   if defined(PERL_IN_UTIL_C)
+#     define ckwarn_common(a)                   S_ckwarn_common(aTHX_ a)
+#     define mess_alloc()                       S_mess_alloc(aTHX)
+#     define ptr_hash                           S_ptr_hash
+#     define with_queued_errors(a)              S_with_queued_errors(aTHX_ a)
+#     if defined(PERL_MEM_LOG) && !defined(PERL_MEM_LOG_NOIMPL)
+#       define mem_log_common                   S_mem_log_common
+#     endif
+#     if defined(PERL_USES_PL_PIDSTATUS)
+#       define pidgone(a,b)                     S_pidgone(aTHX_ a,b)
+#     endif
+#   endif /* defined(PERL_IN_UTIL_C) */
+#   if defined(PERL_USE_3ARG_SIGHANDLER)
+#     define sighandler                         Perl_sighandler
+#   else
+#     define sighandler                         Perl_sighandler
+#   endif
+#   if defined(USE_C_BACKTRACE)
+#     define get_c_backtrace(a,b)               Perl_get_c_backtrace(aTHX_ a,b)
+#   endif
+#   if defined(USE_ITHREADS)
+#     define mro_meta_dup(a,b)                  Perl_mro_meta_dup(aTHX_ a,b)
+#     define padlist_dup(a,b)                   Perl_padlist_dup(aTHX_ a,b)
+#     define padname_dup(a,b)                   Perl_padname_dup(aTHX_ a,b)
+#     define padnamelist_dup(a,b)               Perl_padnamelist_dup(aTHX_ a,b)
+#     if !defined(PERL_IMPLICIT_SYS)
+#       define PerlEnv_putenv(a)                S_PerlEnv_putenv(aTHX_ a)
+#     endif
+#     if defined(PERL_IN_OP_C) || defined(PERL_IN_PEEP_C)
+#       define op_relocate_sv(a,b)              Perl_op_relocate_sv(aTHX_ a,b)
+#     endif
+#   endif /* defined(USE_ITHREADS) */
+#   if defined(USE_LOCALE_COLLATE)
+#     define magic_freecollxfrm(a,b)            Perl_magic_freecollxfrm(aTHX_ a,b)
+#     define magic_setcollxfrm(a,b)             Perl_magic_setcollxfrm(aTHX_ a,b)
+#   endif
+#   if defined(USE_PERLIO)
+#     define PerlIO_restore_errno(a)            Perl_PerlIO_restore_errno(aTHX_ a)
+#     define PerlIO_save_errno(a)               Perl_PerlIO_save_errno(aTHX_ a)
+#   endif
+#   if defined(USE_QUADMATH)
+#     define quadmath_format_needed             Perl_quadmath_format_needed
+#     define quadmath_format_valid              Perl_quadmath_format_valid
+#   endif
+#   if defined(WIN32)
+#     define get_win32_message_utf8ness(a)      Perl_get_win32_message_utf8ness(aTHX_ a)
+#   else
+#     define do_exec3(a,b,c)                    Perl_do_exec3(aTHX_ a,b,c)
+#   endif
+# endif /* defined(PERL_CORE) */
+# if defined(PERL_CORE) || defined(PERL_EXT)
+#   define _byte_dump_string(a,b,c)             Perl__byte_dump_string(aTHX_ a,b,c)
+#   define _inverse_folds(a,b,c)                Perl__inverse_folds(aTHX_ a,b,c)
+#   define append_utf8_from_native_byte         Perl_append_utf8_from_native_byte
+#   define av_reify(a)                          Perl_av_reify(aTHX_ a)
+#   define cntrl_to_mnemonic                    Perl_cntrl_to_mnemonic
+#   define current_re_engine()                  Perl_current_re_engine(aTHX)
+#   define cv_ckproto_len_flags(a,b,c,d,e)      Perl_cv_ckproto_len_flags(aTHX_ a,b,c,d,e)
+#   define delimcpy_no_escape                   Perl_delimcpy_no_escape
+#   define do_uniprop_match                     Perl_do_uniprop_match
+#   define get_and_check_backslash_N_name(a,b,c,d) Perl_get_and_check_backslash_N_name(aTHX_ a,b,c,d)
+#   define get_deprecated_property_msg          Perl_get_deprecated_property_msg
+#   define get_prop_definition(a)               Perl_get_prop_definition(aTHX_ a)
+#   define get_prop_values                      Perl_get_prop_values
+#   define load_charnames(a,b,c,d)              Perl_load_charnames(aTHX_ a,b,c,d)
+#   define mbtowc_(a,b,c)                       Perl_mbtowc_(aTHX_ a,b,c)
+#   define mg_find_mglob(a)                     Perl_mg_find_mglob(aTHX_ a)
+#   define multiconcat_stringify(a)             Perl_multiconcat_stringify(aTHX_ a)
+#   define multideref_stringify(a,b)            Perl_multideref_stringify(aTHX_ a,b)
+#   define my_strftime8_temp(a,b,c,d,e,f,g,h,i,j,k) Perl_my_strftime8_temp(aTHX_ a,b,c,d,e,f,g,h,i,j,k)
+#   define op_clear(a)                          Perl_op_clear(aTHX_ a)
+#   define qerror(a)                            Perl_qerror(aTHX_ a)
+#   define reg_named_buff(a,b,c,d)              Perl_reg_named_buff(aTHX_ a,b,c,d)
+#   define reg_named_buff_iter(a,b,c)           Perl_reg_named_buff_iter(aTHX_ a,b,c)
+#   define reg_numbered_buff_fetch(a,b,c)       Perl_reg_numbered_buff_fetch(aTHX_ a,b,c)
+#   define reg_numbered_buff_fetch_flags(a,b,c,d) Perl_reg_numbered_buff_fetch_flags(aTHX_ a,b,c,d)
+#   define reg_numbered_buff_length(a,b,c)      Perl_reg_numbered_buff_length(aTHX_ a,b,c)
+#   define reg_numbered_buff_store(a,b,c)       Perl_reg_numbered_buff_store(aTHX_ a,b,c)
+#   define reg_qr_package(a)                    Perl_reg_qr_package(aTHX_ a)
+#   define reg_temp_copy(a,b)                   Perl_reg_temp_copy(aTHX_ a,b)
+#   define report_uninit(a)                     Perl_report_uninit(aTHX_ a)
+#   define scan_str(a,b,c,d,e)                  Perl_scan_str(aTHX_ a,b,c,d,e)
+#   define scan_word(a,b,c,d,e)                 Perl_scan_word(aTHX_ a,b,c,d,e)
+#   define scan_word6(a,b,c,d,e,f)              Perl_scan_word6(aTHX_ a,b,c,d,e,f)
+#   define skipspace_flags(a,b)                 Perl_skipspace_flags(aTHX_ a,b)
+#   define sv_magicext_mglob(a)                 Perl_sv_magicext_mglob(aTHX_ a)
+#   define sv_only_taint_gmagic                 Perl_sv_only_taint_gmagic
+#   define utf16_to_utf8_base(a,b,c,d,e,f)      Perl_utf16_to_utf8_base(aTHX_ a,b,c,d,e,f)
+#   define utf8_to_utf16_base(a,b,c,d,e,f)      Perl_utf8_to_utf16_base(aTHX_ a,b,c,d,e,f)
+#   define validate_proto(a,b,c,d)              Perl_validate_proto(aTHX_ a,b,c,d)
+#   define vivify_defelem(a)                    Perl_vivify_defelem(aTHX_ a)
+#   define yylex()                              Perl_yylex(aTHX)
+#   define isSCRIPT_RUN(a,b,c)                  Perl_isSCRIPT_RUN(aTHX_ a,b,c)
+#   define is_utf8_non_invariant_string         Perl_is_utf8_non_invariant_string
+#   define sv_or_pv_pos_u2b(a,b,c,d)            S_sv_or_pv_pos_u2b(aTHX_ a,b,c,d)
+#   define variant_under_utf8_count             S_variant_under_utf8_count
+#   if !defined(HAS_MEMRCHR)
+#     define my_memrchr                         S_my_memrchr
+#   endif
+#   if defined(PERL_ANY_COW)
+#     define sv_setsv_cow(a,b)                  Perl_sv_setsv_cow(aTHX_ a,b)
+#   endif
+#   if defined(PERL_IN_DOOP_C)    || defined(PERL_IN_OP_C)        || \
+       defined(PERL_IN_PP_C)      || defined(PERL_IN_REGCOMP_ANY) || \
+       defined(PERL_IN_REGEXEC_C) || defined(PERL_IN_TOKE_C)      || \
+       defined(PERL_IN_UTF8_C)
+#     define _invlist_contains_cp               S__invlist_contains_cp
+#     define _invlist_len                       S__invlist_len
+#     define _invlist_search                    Perl__invlist_search
+#     define get_invlist_offset_addr            S_get_invlist_offset_addr
+#     define invlist_array                      S_invlist_array
+#     define is_invlist                         S_is_invlist
+#   endif
+#   if defined(PERL_IN_DOOP_C) || defined(PERL_IN_OP_C) || \
+       defined(PERL_IN_REGCOMP_ANY)
+#     define add_cp_to_invlist(a,b)             S_add_cp_to_invlist(aTHX_ a,b)
+#     define invlist_extend(a,b)                S_invlist_extend(aTHX_ a,b)
+#     define invlist_highest                    S_invlist_highest
+#     define invlist_set_len(a,b,c)             S_invlist_set_len(aTHX_ a,b,c)
+#   endif
+#   if defined(PERL_IN_DOOP_C)      || defined(PERL_IN_OP_C) || \
+       defined(PERL_IN_REGCOMP_ANY) || defined(PERL_IN_UTF8_C)
+#     define _add_range_to_invlist(a,b,c)       Perl__add_range_to_invlist(aTHX_ a,b,c)
+#     define _invlist_intersection_maybe_complement_2nd(a,b,c,d) Perl__invlist_intersection_maybe_complement_2nd(aTHX_ a,b,c,d)
+#     define _invlist_invert(a)                 Perl__invlist_invert(aTHX_ a)
+#     define _invlist_union_maybe_complement_2nd(a,b,c,d) Perl__invlist_union_maybe_complement_2nd(aTHX_ a,b,c,d)
+#     define _new_invlist(a)                    Perl__new_invlist(aTHX_ a)
+#     define _setup_canned_invlist(a,b,c)       Perl__setup_canned_invlist(aTHX_ a,b,c)
+#   endif
+#   if defined(PERL_IN_DQUOTE_C) || defined(PERL_IN_REGCOMP_C) || \
+       defined(PERL_IN_TOKE_C)
+#     define form_alien_digit_msg(a,b,c,d,e,f)  Perl_form_alien_digit_msg(aTHX_ a,b,c,d,e,f)
+#     define grok_bslash_c(a,b,c,d)             Perl_grok_bslash_c(aTHX_ a,b,c,d)
+#     define grok_bslash_o(a,b,c,d,e,f,g,h)     Perl_grok_bslash_o(aTHX_ a,b,c,d,e,f,g,h)
+#     define grok_bslash_x(a,b,c,d,e,f,g,h)     Perl_grok_bslash_x(aTHX_ a,b,c,d,e,f,g,h)
+#   endif
+#   if defined(PERL_IN_DQUOTE_C) || defined(PERL_IN_REGCOMP_C) || \
+       defined(PERL_IN_TOKE_C)   || defined(PERL_IN_UTF8_C)
+#     define form_cp_too_large_msg(a,b,c,d)     Perl_form_cp_too_large_msg(aTHX_ a,b,c,d)
+#   endif
+#   if defined(PERL_IN_DUMP_C) || defined(PERL_IN_OP_C) || \
+       defined(PERL_IN_REGCOMP_ANY)
+#     define _invlist_dump(a,b,c,d)             Perl__invlist_dump(aTHX_ a,b,c,d)
+#   endif
+#   if defined(PERL_IN_GV_C) || defined(PERL_IN_UNIVERSAL_C)
+#     define gv_stashsvpvn_cached(a,b,c,d)      Perl_gv_stashsvpvn_cached(aTHX_ a,b,c,d)
+#   endif
+#   if defined(PERL_IN_OP_C) || defined(PERL_IN_REGCOMP_ANY)
+#     define get_invlist_iter_addr              S_get_invlist_iter_addr
+#     define invlist_iterfinish                 S_invlist_iterfinish
+#     define invlist_iterinit                   S_invlist_iterinit
+#     define invlist_iternext                   S_invlist_iternext
+#   endif
+#   if defined(PERL_IN_PERL_C) || defined(PERL_IN_REGCOMP_ANY) || \
+       defined(PERL_IN_UTF8_C)
+#     define _invlistEQ(a,b,c)                  Perl__invlistEQ(aTHX_ a,b,c)
+#     define _new_invlist_C_array(a)            Perl__new_invlist_C_array(aTHX_ a)
+#   endif
+#   if defined(PERL_IN_PP_C)   || defined(PERL_IN_REGCOMP_ANY) || \
+       defined(PERL_IN_TOKE_C) || defined(PERL_IN_UNIVERSAL_C)
+#     define get_regex_charset_name             S_get_regex_charset_name
+#   endif
+#   if defined(PERL_IN_REGCOMP_ANY)
+#     define add_above_Latin1_folds(a,b,c)      Perl_add_above_Latin1_folds(aTHX_ a,b,c)
+#     define construct_ahocorasick_from_trie(a,b,c) Perl_construct_ahocorasick_from_trie(aTHX_ a,b,c)
+#     define get_ANYOFHbbm_contents(a)          Perl_get_ANYOFHbbm_contents(aTHX_ a)
+#     define get_ANYOFM_contents(a)             Perl_get_ANYOFM_contents(aTHX_ a)
+#     define invlist_contents(a,b)              S_invlist_contents(aTHX_ a,b)
+#     define invlist_highest_range_start        S_invlist_highest_range_start
+#     define invlist_is_iterating               S_invlist_is_iterating
+#     define invlist_lowest                     S_invlist_lowest
+#     define is_ssc_worth_it                    Perl_is_ssc_worth_it
+#     define join_exact(a,b,c,d,e,f,g)          Perl_join_exact(aTHX_ a,b,c,d,e,f,g)
+#     define make_trie(a,b,c,d,e,f,g,h)         Perl_make_trie(aTHX_ a,b,c,d,e,f,g,h)
+#     define populate_anyof_bitmap_from_invlist(a,b) Perl_populate_anyof_bitmap_from_invlist(aTHX_ a,b)
+#     define reg_add_data                       Perl_reg_add_data
+#     define scan_commit(a,b,c,d)               Perl_scan_commit(aTHX_ a,b,c,d)
+#     define set_ANYOF_arg(a,b,c,d,e)           Perl_set_ANYOF_arg(aTHX_ a,b,c,d,e)
+#     define ssc_finalize(a,b)                  Perl_ssc_finalize(aTHX_ a,b)
+#     define ssc_init(a,b)                      Perl_ssc_init(aTHX_ a,b)
+#     define study_chunk(a,b,c,d,e,f,g,h,i,j,k,l) Perl_study_chunk(aTHX_ a,b,c,d,e,f,g,h,i,j,k,l)
+#     if defined(PERL_IN_REGCOMP_TRIE_C) && defined(DEBUGGING)
+#       define dump_trie(a,b,c,d)               S_dump_trie(aTHX_ a,b,c,d)
+#       define dump_trie_interim_list(a,b,c,d,e) S_dump_trie_interim_list(aTHX_ a,b,c,d,e)
+#       define dump_trie_interim_table(a,b,c,d,e) S_dump_trie_interim_table(aTHX_ a,b,c,d,e)
+#     endif
+#   endif /* defined(PERL_IN_REGCOMP_ANY) */
+#   if defined(PERL_IN_REGCOMP_ANY) || defined(PERL_IN_SV_C)
+#     define invlist_clone(a,b)                 Perl_invlist_clone(aTHX_ a,b)
+#   endif
+#   if defined(PERL_IN_REGCOMP_C)
+#     define add_multi_match(a,b,c)             S_add_multi_match(aTHX_ a,b,c)
+#     define change_engine_size(a,b)            S_change_engine_size(aTHX_ a,b)
+#     define compile_wildcard(a,b,c)            S_compile_wildcard(aTHX_ a,b,c)
+#     define compute_EXACTish                   S_compute_EXACTish
+#     define edit_distance                      S_edit_distance
+#     define execute_wildcard(a,b,c,d,e,f,g)    S_execute_wildcard(aTHX_ a,b,c,d,e,f,g)
+#     define find_first_differing_byte_pos      S_find_first_differing_byte_pos
+#     define get_quantifier_value(a,b,c)        S_get_quantifier_value(aTHX_ a,b,c)
+#     define grok_bslash_N(a,b,c,d,e,f,g)       S_grok_bslash_N(aTHX_ a,b,c,d,e,f,g)
+#     define handle_named_backref(a,b,c,d)      S_handle_named_backref(aTHX_ a,b,c,d)
+#     define handle_names_wildcard(a,b,c,d)     S_handle_names_wildcard(aTHX_ a,b,c,d)
+#     define handle_possible_posix(a,b,c,d,e)   S_handle_possible_posix(aTHX_ a,b,c,d,e)
+#     define handle_regex_sets(a,b,c,d)         S_handle_regex_sets(aTHX_ a,b,c,d)
+#     define handle_user_defined_property(a,b,c,d,e,f,g,h,i,j) S_handle_user_defined_property(aTHX_ a,b,c,d,e,f,g,h,i,j)
+#     define nextchar(a)                        S_nextchar(aTHX_ a)
+#     define optimize_regclass(a,b,c,d,e,f,g,h,i,j) S_optimize_regclass(aTHX_ a,b,c,d,e,f,g,h,i,j)
+#     define output_posix_warnings(a,b)         S_output_posix_warnings(aTHX_ a,b)
+#     define parse_lparen_question_flags(a)     S_parse_lparen_question_flags(aTHX_ a)
+#     define parse_uniprop_string(a,b,c,d,e,f,g,h,i,j) S_parse_uniprop_string(aTHX_ a,b,c,d,e,f,g,h,i,j)
+#     define reg(a,b,c,d)                       S_reg(aTHX_ a,b,c,d)
+#     define reg1node(a,b,c)                    S_reg1node(aTHX_ a,b,c)
+#     define reg2node(a,b,c,d)                  S_reg2node(aTHX_ a,b,c,d)
+#     define reg_la_NOTHING(a,b,c)              S_reg_la_NOTHING(aTHX_ a,b,c)
+#     define reg_la_OPFAIL(a,b,c)               S_reg_la_OPFAIL(aTHX_ a,b,c)
+#     define reg_node(a,b)                      S_reg_node(aTHX_ a,b)
+#     define reg_scan_name(a,b)                 S_reg_scan_name(aTHX_ a,b)
+#     define reg_skipcomment                    S_reg_skipcomment
+#     define regatom(a,b,c)                     S_regatom(aTHX_ a,b,c)
+#     define regbranch(a,b,c,d)                 S_regbranch(aTHX_ a,b,c,d)
+#     define regclass(a,b,c,d,e,f,g,h,i)        S_regclass(aTHX_ a,b,c,d,e,f,g,h,i)
+#     define regex_set_precedence               S_regex_set_precedence
+#     define reginsert(a,b,c,d)                 S_reginsert(aTHX_ a,b,c,d)
+#     define regnode_guts(a,b)                  S_regnode_guts(aTHX_ a,b)
+#     define regpiece(a,b,c)                    S_regpiece(aTHX_ a,b,c)
+#     define regpnode(a,b,c)                    S_regpnode(aTHX_ a,b,c)
+#     define regtail(a,b,c,d)                   S_regtail(aTHX_ a,b,c,d)
+#     define set_regex_pv(a,b)                  S_set_regex_pv(aTHX_ a,b)
+#     define skip_to_be_ignored_text(a,b,c)     S_skip_to_be_ignored_text(aTHX_ a,b,c)
+#     if defined(DEBUGGING)
+#       define regnode_guts_debug(a,b,c)        S_regnode_guts_debug(aTHX_ a,b,c)
+#       define regtail_study(a,b,c,d)           S_regtail_study(aTHX_ a,b,c,d)
+#       if defined(ENABLE_REGEX_SETS_DEBUGGING)
+#         define dump_regex_sets_structures(a,b,c,d) S_dump_regex_sets_structures(aTHX_ a,b,c,d)
+#       endif
+#     endif
+#   endif /* defined(PERL_IN_REGCOMP_C) */
+#   if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGCOMP_INVLIST_C)
+#     define populate_bitmap_from_invlist(a,b,c,d) Perl_populate_bitmap_from_invlist(aTHX_ a,b,c,d)
+#     define populate_invlist_from_bitmap(a,b,c,d) Perl_populate_invlist_from_bitmap(aTHX_ a,b,c,d)
+#   endif
+#   if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C) || \
+       defined(PERL_IN_TOKE_C)
+#     define is_grapheme(a,b,c,d)               Perl_is_grapheme(aTHX_ a,b,c,d)
+#   endif
+#   if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C) || \
+       defined(PERL_IN_UTF8_C)
+#     define _to_fold_latin1                    Perl__to_fold_latin1
+#   endif
+#   if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_TOKE_C)
+#     define regcurly                           Perl_regcurly
+#   endif
+#   if defined(PERL_IN_REGCOMP_DEBUG_C) && defined(DEBUGGING)
+#     define put_charclass_bitmap_innards(a,b,c,d,e,f,g) S_put_charclass_bitmap_innards(aTHX_ a,b,c,d,e,f,g)
+#     define put_charclass_bitmap_innards_common(a,b,c,d,e,f) S_put_charclass_bitmap_innards_common(aTHX_ a,b,c,d,e,f)
+#     define put_charclass_bitmap_innards_invlist(a,b) S_put_charclass_bitmap_innards_invlist(aTHX_ a,b)
+#     define put_code_point(a,b)                S_put_code_point(aTHX_ a,b)
+#     define put_range(a,b,c,d)                 S_put_range(aTHX_ a,b,c,d)
+#     define regdump_extflags(a,b)              S_regdump_extflags(aTHX_ a,b)
+#     define regdump_intflags(a,b)              S_regdump_intflags(aTHX_ a,b)
+#   endif
+#   if defined(PERL_IN_REGCOMP_INVLIST_C) && !defined(PERL_EXT_RE_BUILD)
+#     define _append_range_to_invlist(a,b,c)    S__append_range_to_invlist(aTHX_ a,b,c)
+#     define _invlist_array_init                S__invlist_array_init
+#     define get_invlist_previous_index_addr    S_get_invlist_previous_index_addr
+#     define invlist_clear(a)                   S_invlist_clear(aTHX_ a)
+#     define invlist_max                        S_invlist_max
+#     define invlist_previous_index             S_invlist_previous_index
+#     define invlist_replace_list_destroys_src(a,b) S_invlist_replace_list_destroys_src(aTHX_ a,b)
+#     define invlist_set_previous_index         S_invlist_set_previous_index
+#     define invlist_trim                       S_invlist_trim
+#   endif /*  defined(PERL_IN_REGCOMP_INVLIST_C) &&
+             !defined(PERL_EXT_RE_BUILD) */
+#   if defined(PERL_IN_REGCOMP_STUDY_C)
+#     define get_ANYOF_cp_list_for_ssc(a,b)     S_get_ANYOF_cp_list_for_ssc(aTHX_ a,b)
+#     define make_exactf_invlist(a,b)           S_make_exactf_invlist(aTHX_ a,b)
+#     define rck_elide_nothing(a)               S_rck_elide_nothing(aTHX_ a)
+#     define ssc_add_range(a,b,c)               S_ssc_add_range(aTHX_ a,b,c)
+#     define ssc_and(a,b,c)                     S_ssc_and(aTHX_ a,b,c)
+#     define ssc_anything(a)                    S_ssc_anything(aTHX_ a)
+#     define ssc_clear_locale                   S_ssc_clear_locale
+#     define ssc_cp_and(a,b)                    S_ssc_cp_and(aTHX_ a,b)
+#     define ssc_intersection(a,b,c)            S_ssc_intersection(aTHX_ a,b,c)
+#     define ssc_is_anything                    S_ssc_is_anything
+#     define ssc_is_cp_posixl_init              S_ssc_is_cp_posixl_init
+#     define ssc_or(a,b,c)                      S_ssc_or(aTHX_ a,b,c)
+#     define ssc_union(a,b,c)                   S_ssc_union(aTHX_ a,b,c)
+#     define unwind_scan_frames(a)              S_unwind_scan_frames(aTHX_ a)
+#   endif /* defined(PERL_IN_REGCOMP_STUDY_C) */
+#   if defined(PERL_IN_REGEXEC_C)
+#     define advance_one_LB(a,b,c)              S_advance_one_LB(aTHX_ a,b,c)
+#     define advance_one_SB(a,b,c)              S_advance_one_SB(aTHX_ a,b,c)
+#     define advance_one_WB(a,b,c,d)            S_advance_one_WB(aTHX_ a,b,c,d)
+#     define backup_one_GCB(a,b,c)              S_backup_one_GCB(aTHX_ a,b,c)
+#     define backup_one_LB(a,b,c)               S_backup_one_LB(aTHX_ a,b,c)
+#     define backup_one_SB(a,b,c)               S_backup_one_SB(aTHX_ a,b,c)
+#     define backup_one_WB(a,b,c,d)             S_backup_one_WB(aTHX_ a,b,c,d)
+#     define capture_clear(a,b,c,d)             S_capture_clear(aTHX_ a,b,c,d comma_aDEPTH)
+#     define find_byclass(a,b,c,d,e)            S_find_byclass(aTHX_ a,b,c,d,e)
+#     define find_next_masked                   S_find_next_masked
+#     define find_span_end                      S_find_span_end
+#     define find_span_end_mask                 S_find_span_end_mask
+#     define foldEQ_latin1_s2_folded(a,b,c)     S_foldEQ_latin1_s2_folded(aTHX_ a,b,c)
+#     define isFOO_lc(a,b)                      S_isFOO_lc(aTHX_ a,b)
+#     define isFOO_utf8_lc(a,b,c)               S_isFOO_utf8_lc(aTHX_ a,b,c)
+#     define isGCB(a,b,c,d,e)                   S_isGCB(aTHX_ a,b,c,d,e)
+#     define isLB(a,b,c,d,e,f)                  S_isLB(aTHX_ a,b,c,d,e,f)
+#     define isSB(a,b,c,d,e,f)                  S_isSB(aTHX_ a,b,c,d,e,f)
+#     define isWB(a,b,c,d,e,f,g)                S_isWB(aTHX_ a,b,c,d,e,f,g)
+#     define reg_check_named_buff_matched       S_reg_check_named_buff_matched
+#     define regcp_restore(a,b,c)               S_regcp_restore(aTHX_ a,b,c comma_aDEPTH)
+#     define regcppop(a,b)                      S_regcppop(aTHX_ a,b comma_aDEPTH)
+#     define regcppush(a,b,c)                   S_regcppush(aTHX_ a,b,c comma_aDEPTH)
+#     define reghop3                            S_reghop3
+#     define reghop4                            S_reghop4
+#     define reghopmaybe3                       S_reghopmaybe3
+#     define reginclass(a,b,c,d,e)              S_reginclass(aTHX_ a,b,c,d,e)
+#     define regmatch(a,b,c)                    S_regmatch(aTHX_ a,b,c)
+#     define regrepeat(a,b,c,d,e,f)             S_regrepeat(aTHX_ a,b,c,d,e,f comma_aDEPTH)
+#     define regtry(a,b)                        S_regtry(aTHX_ a,b)
+#     define to_byte_substr(a)                  S_to_byte_substr(aTHX_ a)
+#     define to_utf8_substr(a)                  S_to_utf8_substr(aTHX_ a)
+#     define unwind_paren(a,b,c)                S_unwind_paren(aTHX_ a,b,c comma_aDEPTH)
+#     if defined(DEBUGGING)
+#       define debug_start_match(a,b,c,d,e)     S_debug_start_match(aTHX_ a,b,c,d,e)
+#       define dump_exec_pos(a,b,c,d,e,f,g)     S_dump_exec_pos(aTHX_ a,b,c,d,e,f,g)
+#       if !defined(MULTIPLICITY) || defined(PERL_CORE)
+#         define re_exec_indentf(a,...)         Perl_re_exec_indentf(aTHX_ a,__VA_ARGS__)
+#       endif
+#     endif
+#   endif /* defined(PERL_IN_REGEXEC_C) */
+# endif /* defined(PERL_CORE) || defined(PERL_EXT) */
+# if defined(PERL_CORE) || defined(PERL_USE_VOLATILE_API)
+#   define finalize_optree(a)                   Perl_finalize_optree(aTHX_ a)
+#   define optimize_optree(a)                   Perl_optimize_optree(aTHX_ a)
+# endif
+# if !defined(PERL_IMPLICIT_SYS)
+#   define my_pclose(a)                         Perl_my_pclose(aTHX_ a)
+#   define my_popen(a,b)                        Perl_my_popen(aTHX_ a,b)
+# endif
+# if defined(PERL_IN_CLASS_C) || defined(PERL_IN_OP_C)    || \
+     defined(PERL_IN_PAD_C)   || defined(PERL_IN_PERLY_C) || \
+     defined(PERL_IN_TOKE_C)
+#   define class_add_ADJUST(a,b)                Perl_class_add_ADJUST(aTHX_ a,b)
+#   define class_add_field(a,b)                 Perl_class_add_field(aTHX_ a,b)
+#   define class_apply_attributes(a,b)          Perl_class_apply_attributes(aTHX_ a,b)
+#   define class_apply_field_attributes(a,b)    Perl_class_apply_field_attributes(aTHX_ a,b)
+#   define class_prepare_initfield_parse()      Perl_class_prepare_initfield_parse(aTHX)
+#   define class_prepare_method_parse(a)        Perl_class_prepare_method_parse(aTHX_ a)
+#   define class_seal_stash(a)                  Perl_class_seal_stash(aTHX_ a)
+#   define class_set_field_defop(a,b,c)         Perl_class_set_field_defop(aTHX_ a,b,c)
+#   define class_setup_stash(a)                 Perl_class_setup_stash(aTHX_ a)
+#   define class_wrap_method_body(a)            Perl_class_wrap_method_body(aTHX_ a)
+#   define croak_kw_unless_class(a)             Perl_croak_kw_unless_class(aTHX_ a)
+# endif /* defined(PERL_IN_CLASS_C) || defined(PERL_IN_OP_C)    ||
+           defined(PERL_IN_PAD_C)   || defined(PERL_IN_PERLY_C) ||
+           defined(PERL_IN_TOKE_C) */
+# if defined(PERL_IN_REGEX_ENGINE)
+#   define check_regnode_after(a,b)             Perl_check_regnode_after(aTHX_ a,b)
+#   define regnext(a)                           Perl_regnext(aTHX_ a)
+#   define regnode_after(a,b)                   Perl_regnode_after(aTHX_ a,b)
+#   if defined(DEBUGGING)
+#     if ( !defined(MULTIPLICITY) || defined(PERL_CORE) ) && \
+         (  defined(PERL_CORE)    || defined(PERL_EXT) )
+#       define re_indentf(a,...)                Perl_re_indentf(aTHX_ a,__VA_ARGS__)
+#       define re_printf(...)                   Perl_re_printf(aTHX_ __VA_ARGS__)
+#     endif
+#     if defined(PERL_CORE) || defined(PERL_EXT)
+#       define debug_peep(a,b,c,d,e)            Perl_debug_peep(aTHX_ a,b,c,d,e)
+#       define debug_show_study_flags(a,b,c)    Perl_debug_show_study_flags(aTHX_ a,b,c)
+#       define debug_studydata(a,b,c,d,e,f,g)   Perl_debug_studydata(aTHX_ a,b,c,d,e,f,g)
+#       define dumpuntil(a,b,c,d,e,f,g,h)       Perl_dumpuntil(aTHX_ a,b,c,d,e,f,g,h)
+#       define regprop(a,b,c,d,e)               Perl_regprop(aTHX_ a,b,c,d,e)
+#     endif
+#   endif /* defined(DEBUGGING) */
+#   if defined(PERL_EXT_RE_BUILD)
+#     if defined(PERL_CORE) || defined(PERL_EXT)
+#       define get_re_gclass_aux_data(a,b,c,d,e,f) Perl_get_re_gclass_aux_data(aTHX_ a,b,c,d,e,f)
+#     endif
+#   elif defined(PERL_CORE) || defined(PERL_EXT)
+#     define get_regclass_aux_data(a,b,c,d,e,f) Perl_get_regclass_aux_data(aTHX_ a,b,c,d,e,f)
+#   endif
+# endif /* defined(PERL_IN_REGEX_ENGINE) */
+# if defined(PERL_IN_SV_C)
+#   define more_sv()                            Perl_more_sv(aTHX)
+#   if defined(PERL_CORE)
+#     define F0convert                          S_F0convert
+#     define anonymise_cv_maybe(a,b)            S_anonymise_cv_maybe(aTHX_ a,b)
+#     define assert_uft8_cache_coherent(a,b,c,d) S_assert_uft8_cache_coherent(aTHX_ a,b,c,d)
+#     define curse(a,b)                         S_curse(aTHX_ a,b)
+#     define expect_number(a)                   S_expect_number(aTHX_ a)
+#     define find_array_subscript(a,b)          S_find_array_subscript(aTHX_ a,b)
+#     define find_hash_subscript(a,b)           S_find_hash_subscript(aTHX_ a,b)
+#     define find_uninit_var(a,b,c,d)           S_find_uninit_var(aTHX_ a,b,c,d)
+#     define glob_2number(a)                    S_glob_2number(aTHX_ a)
+#     define glob_assign_glob(a,b,c)            S_glob_assign_glob(aTHX_ a,b,c)
+#     define not_a_number(a)                    S_not_a_number(aTHX_ a)
+#     define not_incrementable(a)               S_not_incrementable(aTHX_ a)
+#     define ptr_table_find                     S_ptr_table_find
+#     define sv_2iuv_common(a)                  S_sv_2iuv_common(aTHX_ a)
+#     define sv_add_arena(a,b,c)                S_sv_add_arena(aTHX_ a,b,c)
+#     define sv_display(a,b,c)                  S_sv_display(aTHX_ a,b,c)
+#     define sv_pos_b2u_midway(a,b,c,d)         S_sv_pos_b2u_midway(aTHX_ a,b,c,d)
+#     define sv_pos_u2b_cached(a,b,c,d,e,f,g)   S_sv_pos_u2b_cached(aTHX_ a,b,c,d,e,f,g)
+#     define sv_pos_u2b_forwards                S_sv_pos_u2b_forwards
+#     define sv_pos_u2b_midway                  S_sv_pos_u2b_midway
+#     define sv_unglob(a,b)                     S_sv_unglob(aTHX_ a,b)
+#     define uiv_2buf                           S_uiv_2buf
+#     define utf8_mg_len_cache_update(a,b,c)    S_utf8_mg_len_cache_update(aTHX_ a,b,c)
+#     define utf8_mg_pos_cache_update(a,b,c,d,e) S_utf8_mg_pos_cache_update(aTHX_ a,b,c,d,e)
+#     define visit(a,b,c)                       S_visit(aTHX_ a,b,c)
+#     if defined(DEBUGGING)
+#       define del_sv(a)                        S_del_sv(aTHX_ a)
+#     endif
+#     if !defined(NV_PRESERVES_UV)
+#       if defined(DEBUGGING)
+#         define sv_2iuv_non_preserve(a,b)      S_sv_2iuv_non_preserve(aTHX_ a,b)
+#       else
+#         define sv_2iuv_non_preserve(a)        S_sv_2iuv_non_preserve(aTHX_ a)
+#       endif
+#     endif
+#     if defined(PERL_DEBUG_READONLY_COW)
+#       define sv_buf_to_rw(a)                  S_sv_buf_to_rw(aTHX_ a)
+#     endif
+#     if defined(USE_ITHREADS)
+#       define sv_dup_common(a,b)               S_sv_dup_common(aTHX_ a,b)
+#       define sv_dup_hvaux(a,b,c)              S_sv_dup_hvaux(aTHX_ a,b,c)
+#       define sv_dup_inc_multiple(a,b,c,d)     S_sv_dup_inc_multiple(aTHX_ a,b,c,d)
+#       define unreferenced_to_tmp_stack(a)     S_unreferenced_to_tmp_stack(aTHX_ a)
+#     endif
+#   endif /* defined(PERL_CORE) */
+# endif /* defined(PERL_IN_SV_C) */
+# if defined(PERL_MEM_LOG)
+#   define mem_log_alloc                        Perl_mem_log_alloc
+#   define mem_log_del_sv                       Perl_mem_log_del_sv
+#   define mem_log_free                         Perl_mem_log_free
+#   define mem_log_new_sv                       Perl_mem_log_new_sv
+#   define mem_log_realloc                      Perl_mem_log_realloc
+# endif
+# if !defined(PERL_NO_INLINE_FUNCTIONS)
+#   define cx_popblock(a)                       Perl_cx_popblock(aTHX_ a)
+#   define cx_popeval(a)                        Perl_cx_popeval(aTHX_ a)
+#   define cx_popformat(a)                      Perl_cx_popformat(aTHX_ a)
+#   define cx_popgiven(a)                       Perl_cx_popgiven(aTHX_ a)
+#   define cx_poploop(a)                        Perl_cx_poploop(aTHX_ a)
+#   define cx_popsub(a)                         Perl_cx_popsub(aTHX_ a)
+#   define cx_popsub_args(a)                    Perl_cx_popsub_args(aTHX_ a)
+#   define cx_popsub_common(a)                  Perl_cx_popsub_common(aTHX_ a)
+#   define cx_popwhen(a)                        Perl_cx_popwhen(aTHX_ a)
+#   define cx_pushblock(a,b,c,d)                Perl_cx_pushblock(aTHX_ a,b,c,d)
+#   define cx_pusheval(a,b,c)                   Perl_cx_pusheval(aTHX_ a,b,c)
+#   define cx_pushformat(a,b,c,d)               Perl_cx_pushformat(aTHX_ a,b,c,d)
+#   define cx_pushgiven(a,b)                    Perl_cx_pushgiven(aTHX_ a,b)
+#   define cx_pushloop_for(a,b,c)               Perl_cx_pushloop_for(aTHX_ a,b,c)
+#   define cx_pushloop_plain(a)                 Perl_cx_pushloop_plain(aTHX_ a)
+#   define cx_pushsub(a,b,c,d)                  Perl_cx_pushsub(aTHX_ a,b,c,d)
+#   define cx_pushtry(a,b)                      Perl_cx_pushtry(aTHX_ a,b)
+#   define cx_pushwhen(a)                       Perl_cx_pushwhen(aTHX_ a)
+#   define cx_topblock(a)                       Perl_cx_topblock(aTHX_ a)
+#   define gimme_V()                            Perl_gimme_V(aTHX)
+# endif /* !defined(PERL_NO_INLINE_FUNCTIONS) */
+# if defined(PERL_USE_3ARG_SIGHANDLER)
+#   define csighandler                          Perl_csighandler
+# else
+#   define csighandler                          Perl_csighandler
+# endif
+# if defined(U64TYPE)
+#   define lsbit_pos64                          Perl_lsbit_pos64
+#   define msbit_pos64                          Perl_msbit_pos64
+#   define single_1bit_pos64                    Perl_single_1bit_pos64
+# endif
+# if defined(UNLINK_ALL_VERSIONS)
+#   define unlnk(a)                             Perl_unlnk(aTHX_ a)
+# endif
+# if defined(USE_C_BACKTRACE)
+#   define dump_c_backtrace(a,b,c)              Perl_dump_c_backtrace(aTHX_ a,b,c)
+#   define get_c_backtrace_dump(a,b)            Perl_get_c_backtrace_dump(aTHX_ a,b)
+# endif
+# if defined(USE_ITHREADS)
+#   define alloccopstash(a)                     Perl_alloccopstash(aTHX_ a)
+#   define any_dup(a,b)                         Perl_any_dup(aTHX_ a,b)
+#   define cop_file_avn(a)                      Perl_cop_file_avn(aTHX_ a)
+#   define cx_dup(a,b,c,d)                      Perl_cx_dup(aTHX_ a,b,c,d)
+#   define dirp_dup(a,b)                        Perl_dirp_dup(aTHX_ a,b)
+#   define fp_dup(a,b,c)                        Perl_fp_dup(aTHX_ a,b,c)
+#   define gp_dup(a,b)                          Perl_gp_dup(aTHX_ a,b)
+#   define he_dup(a,b,c)                        Perl_he_dup(aTHX_ a,b,c)
+#   define hek_dup(a,b)                         Perl_hek_dup(aTHX_ a,b)
+#   define mg_dup(a,b)                          Perl_mg_dup(aTHX_ a,b)
+#   define newPADOP(a,b,c)                      Perl_newPADOP(aTHX_ a,b,c)
+#   define parser_dup(a,b)                      Perl_parser_dup(aTHX_ a,b)
+#   define re_dup_guts(a,b,c)                   Perl_re_dup_guts(aTHX_ a,b,c)
+#   define regdupe_internal(a,b)                Perl_regdupe_internal(aTHX_ a,b)
+#   define rvpv_dup(a,b,c)                      Perl_rvpv_dup(aTHX_ a,b,c)
+#   define si_dup(a,b)                          Perl_si_dup(aTHX_ a,b)
+#   define ss_dup(a,b)                          Perl_ss_dup(aTHX_ a,b)
+#   define sv_dup(a,b)                          Perl_sv_dup(aTHX_ a,b)
+#   define sv_dup_inc(a,b)                      Perl_sv_dup_inc(aTHX_ a,b)
+# endif /* defined(USE_ITHREADS) */
+# if defined(USE_LOCALE_COLLATE)
+#   define sv_collxfrm_flags(a,b,c)             Perl_sv_collxfrm_flags(aTHX_ a,b,c)
+#   if ( defined(PERL_CORE)        || defined(PERL_EXT) ) &&        \
+       ( defined(PERL_IN_LOCALE_C) || defined(PERL_IN_MATHOMS_C) || \
+         defined(PERL_IN_SV_C) )
+#     define mem_collxfrm_(a,b,c,d)             Perl_mem_collxfrm_(aTHX_ a,b,c,d)
+#   endif
+# endif
+# if defined(USE_PERLIO)
+#   define PerlIO_clearerr(a)                   Perl_PerlIO_clearerr(aTHX_ a)
+#   define PerlIO_close(a)                      Perl_PerlIO_close(aTHX_ a)
+#   define PerlIO_eof(a)                        Perl_PerlIO_eof(aTHX_ a)
+#   define PerlIO_error(a)                      Perl_PerlIO_error(aTHX_ a)
+#   define PerlIO_fileno(a)                     Perl_PerlIO_fileno(aTHX_ a)
+#   define PerlIO_fill(a)                       Perl_PerlIO_fill(aTHX_ a)
+#   define PerlIO_flush(a)                      Perl_PerlIO_flush(aTHX_ a)
+#   define PerlIO_get_base(a)                   Perl_PerlIO_get_base(aTHX_ a)
+#   define PerlIO_get_bufsiz(a)                 Perl_PerlIO_get_bufsiz(aTHX_ a)
+#   define PerlIO_get_cnt(a)                    Perl_PerlIO_get_cnt(aTHX_ a)
+#   define PerlIO_get_ptr(a)                    Perl_PerlIO_get_ptr(aTHX_ a)
+#   define PerlIO_read(a,b,c)                   Perl_PerlIO_read(aTHX_ a,b,c)
+#   define PerlIO_seek(a,b,c)                   Perl_PerlIO_seek(aTHX_ a,b,c)
+#   define PerlIO_set_cnt(a,b)                  Perl_PerlIO_set_cnt(aTHX_ a,b)
+#   define PerlIO_set_ptrcnt(a,b,c)             Perl_PerlIO_set_ptrcnt(aTHX_ a,b,c)
+#   define PerlIO_setlinebuf(a)                 Perl_PerlIO_setlinebuf(aTHX_ a)
+#   define PerlIO_stderr()                      Perl_PerlIO_stderr(aTHX)
+#   define PerlIO_stdin()                       Perl_PerlIO_stdin(aTHX)
+#   define PerlIO_stdout()                      Perl_PerlIO_stdout(aTHX)
+#   define PerlIO_tell(a)                       Perl_PerlIO_tell(aTHX_ a)
+#   define PerlIO_unread(a,b,c)                 Perl_PerlIO_unread(aTHX_ a,b,c)
+#   define PerlIO_write(a,b,c)                  Perl_PerlIO_write(aTHX_ a,b,c)
+# endif /* defined(USE_PERLIO) */
+# if defined(VMS) || defined(WIN32)
+#   define do_aspawn(a,b,c)                     Perl_do_aspawn(aTHX_ a,b,c)
+#   define do_spawn(a)                          Perl_do_spawn(aTHX_ a)
+#   define do_spawn_nowait(a)                   Perl_do_spawn_nowait(aTHX_ a)
+# endif
+# if defined(WIN32)
+#   define get_context                          Perl_get_context
+# else
+#   define get_context                          Perl_get_context
+# endif
+#endif /* !defined(PERL_NO_SHORT_NAMES) */
 
-/* ex: set ro: */
+/* ex: set ro ft=c: */
index 11989eb..b2f7da6 100644 (file)
-/* -*- buffer-read-only: t -*-
+/* -*- mode: C; buffer-read-only: t -*-
  *
  *    embedvar.h
  *
  *    Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
- *    2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by Larry Wall and others
+ *    2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013,
+ *    2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022
+ *    by Larry Wall and others
  *
  *    You may distribute under the terms of either the GNU General Public
  *    License or the Artistic License, as specified in the README file.
  *
  * !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!!
- * This file is built by regen/embed.pl from data in embed.fnc,
- * regen/embed.pl, regen/opcodes, intrpvar.h and perlvars.h.
+ * This file is built by regen/embed.pl from embed.fnc, intrpvar.h,
+ * perlvars.h, regen/opcodes, regen/embed.pl, regen/embed_lib.pl and
+ * regen/HeaderParser.pm.
  * Any changes made here will be lost!
  *
  * Edit those files and run 'make regen_headers' to effect changes.
  */
 
 #if defined(MULTIPLICITY)
-#  define vTHX aTHX
-#define PL_AboveLatin1         (vTHX->IAboveLatin1)
-#define PL_Assigned_invlist    (vTHX->IAssigned_invlist)
-#define PL_CCC_non0_non230     (vTHX->ICCC_non0_non230)
-#define PL_DBcontrol           (vTHX->IDBcontrol)
-#define PL_DBcv                        (vTHX->IDBcv)
-#define PL_DBgv                        (vTHX->IDBgv)
-#define PL_DBline              (vTHX->IDBline)
-#define PL_DBsignal            (vTHX->IDBsignal)
-#define PL_DBsingle            (vTHX->IDBsingle)
-#define PL_DBsub               (vTHX->IDBsub)
-#define PL_DBtrace             (vTHX->IDBtrace)
-#define PL_Dir                 (vTHX->IDir)
-#define PL_Env                 (vTHX->IEnv)
-#define PL_GCB_invlist         (vTHX->IGCB_invlist)
-#define PL_HasMultiCharFold    (vTHX->IHasMultiCharFold)
-#define PL_InBitmap            (vTHX->IInBitmap)
-#define PL_InMultiCharFold     (vTHX->IInMultiCharFold)
-#define PL_LB_invlist          (vTHX->ILB_invlist)
-#define PL_LIO                 (vTHX->ILIO)
-#define PL_Latin1              (vTHX->ILatin1)
-#define PL_Mem                 (vTHX->IMem)
-#define PL_MemParse            (vTHX->IMemParse)
-#define PL_MemShared           (vTHX->IMemShared)
-#define PL_Posix_ptrs          (vTHX->IPosix_ptrs)
-#define PL_Private_Use         (vTHX->IPrivate_Use)
-#define PL_Proc                        (vTHX->IProc)
-#define PL_SB_invlist          (vTHX->ISB_invlist)
-#define PL_SCX_invlist         (vTHX->ISCX_invlist)
-#define PL_Sock                        (vTHX->ISock)
-#define PL_StdIO               (vTHX->IStdIO)
-#define PL_Sv                  (vTHX->ISv)
-#define PL_TR_SPECIAL_HANDLING_UTF8    (vTHX->ITR_SPECIAL_HANDLING_UTF8)
-#define PL_UpperLatin1         (vTHX->IUpperLatin1)
-#define PL_WB_invlist          (vTHX->IWB_invlist)
-#define PL_XPosix_ptrs         (vTHX->IXPosix_ptrs)
-#define PL_Xpv                 (vTHX->IXpv)
-#define PL_an                  (vTHX->Ian)
-#define PL_argvgv              (vTHX->Iargvgv)
-#define PL_argvout_stack       (vTHX->Iargvout_stack)
-#define PL_argvoutgv           (vTHX->Iargvoutgv)
-#define PL_basetime            (vTHX->Ibasetime)
-#define PL_beginav             (vTHX->Ibeginav)
-#define PL_beginav_save                (vTHX->Ibeginav_save)
-#define PL_blockhooks          (vTHX->Iblockhooks)
-#define PL_body_arenas         (vTHX->Ibody_arenas)
-#define PL_body_roots          (vTHX->Ibody_roots)
-#define PL_bodytarget          (vTHX->Ibodytarget)
-#define PL_breakable_sub_gen   (vTHX->Ibreakable_sub_gen)
-#define PL_checkav             (vTHX->Icheckav)
-#define PL_checkav_save                (vTHX->Icheckav_save)
-#define PL_chopset             (vTHX->Ichopset)
-#define PL_clocktick           (vTHX->Iclocktick)
-#define PL_collation_ix                (vTHX->Icollation_ix)
-#define PL_collation_name      (vTHX->Icollation_name)
-#define PL_collation_standard  (vTHX->Icollation_standard)
-#define PL_collxfrm_base       (vTHX->Icollxfrm_base)
-#define PL_collxfrm_mult       (vTHX->Icollxfrm_mult)
-#define PL_colors              (vTHX->Icolors)
-#define PL_colorset            (vTHX->Icolorset)
-#define PL_compcv              (vTHX->Icompcv)
-#define PL_compiling           (vTHX->Icompiling)
-#define PL_comppad             (vTHX->Icomppad)
-#define PL_comppad_name                (vTHX->Icomppad_name)
-#define PL_comppad_name_fill   (vTHX->Icomppad_name_fill)
-#define PL_comppad_name_floor  (vTHX->Icomppad_name_floor)
-#define PL_constpadix          (vTHX->Iconstpadix)
-#define PL_cop_seqmax          (vTHX->Icop_seqmax)
-#define PL_curcop              (vTHX->Icurcop)
-#define PL_curcopdb            (vTHX->Icurcopdb)
-#define PL_curlocales          (vTHX->Icurlocales)
-#define PL_curpad              (vTHX->Icurpad)
-#define PL_curpm               (vTHX->Icurpm)
-#define PL_curpm_under         (vTHX->Icurpm_under)
-#define PL_curstack            (vTHX->Icurstack)
-#define PL_curstackinfo                (vTHX->Icurstackinfo)
-#define PL_curstash            (vTHX->Icurstash)
-#define PL_curstname           (vTHX->Icurstname)
-#define PL_custom_op_descs     (vTHX->Icustom_op_descs)
-#define PL_custom_op_names     (vTHX->Icustom_op_names)
-#define PL_custom_ops          (vTHX->Icustom_ops)
-#define PL_cv_has_eval         (vTHX->Icv_has_eval)
-#define PL_dbargs              (vTHX->Idbargs)
-#define PL_debstash            (vTHX->Idebstash)
-#define PL_debug               (vTHX->Idebug)
-#define PL_debug_pad           (vTHX->Idebug_pad)
-#define PL_def_layerlist       (vTHX->Idef_layerlist)
-#define PL_defgv               (vTHX->Idefgv)
-#define PL_defoutgv            (vTHX->Idefoutgv)
-#define PL_defstash            (vTHX->Idefstash)
-#define PL_delaymagic          (vTHX->Idelaymagic)
-#define PL_delaymagic_egid     (vTHX->Idelaymagic_egid)
-#define PL_delaymagic_euid     (vTHX->Idelaymagic_euid)
-#define PL_delaymagic_gid      (vTHX->Idelaymagic_gid)
-#define PL_delaymagic_uid      (vTHX->Idelaymagic_uid)
-#define PL_destroyhook         (vTHX->Idestroyhook)
-#define PL_diehook             (vTHX->Idiehook)
-#define PL_doswitches          (vTHX->Idoswitches)
-#define PL_dowarn              (vTHX->Idowarn)
-#define PL_dump_re_max_len     (vTHX->Idump_re_max_len)
-#define PL_dumper_fd           (vTHX->Idumper_fd)
-#define PL_dumpindent          (vTHX->Idumpindent)
-#define PL_e_script            (vTHX->Ie_script)
-#define PL_efloatbuf           (vTHX->Iefloatbuf)
-#define PL_efloatsize          (vTHX->Iefloatsize)
-#define PL_endav               (vTHX->Iendav)
-#define PL_envgv               (vTHX->Ienvgv)
-#define PL_errgv               (vTHX->Ierrgv)
-#define PL_errors              (vTHX->Ierrors)
-#define PL_eval_root           (vTHX->Ieval_root)
-#define PL_eval_start          (vTHX->Ieval_start)
-#define PL_evalseq             (vTHX->Ievalseq)
-#define PL_exit_flags          (vTHX->Iexit_flags)
-#define PL_exitlist            (vTHX->Iexitlist)
-#define PL_exitlistlen         (vTHX->Iexitlistlen)
-#define PL_fdpid               (vTHX->Ifdpid)
-#define PL_filemode            (vTHX->Ifilemode)
-#define PL_firstgv             (vTHX->Ifirstgv)
-#define PL_forkprocess         (vTHX->Iforkprocess)
-#define PL_formtarget          (vTHX->Iformtarget)
-#define PL_generation          (vTHX->Igeneration)
-#define PL_gensym              (vTHX->Igensym)
-#define PL_globalstash         (vTHX->Iglobalstash)
-#define PL_globhook            (vTHX->Iglobhook)
-#define PL_hash_rand_bits      (vTHX->Ihash_rand_bits)
-#define PL_hash_rand_bits_enabled      (vTHX->Ihash_rand_bits_enabled)
-#define PL_hintgv              (vTHX->Ihintgv)
-#define PL_hv_fetch_ent_mh     (vTHX->Ihv_fetch_ent_mh)
-#define PL_in_clean_all                (vTHX->Iin_clean_all)
-#define PL_in_clean_objs       (vTHX->Iin_clean_objs)
-#define PL_in_eval             (vTHX->Iin_eval)
-#define PL_in_load_module      (vTHX->Iin_load_module)
-#define PL_in_some_fold                (vTHX->Iin_some_fold)
-#define PL_in_utf8_COLLATE_locale      (vTHX->Iin_utf8_COLLATE_locale)
-#define PL_in_utf8_CTYPE_locale        (vTHX->Iin_utf8_CTYPE_locale)
-#define PL_in_utf8_turkic_locale       (vTHX->Iin_utf8_turkic_locale)
-#define PL_incgv               (vTHX->Iincgv)
-#define PL_initav              (vTHX->Iinitav)
-#define PL_inplace             (vTHX->Iinplace)
-#define PL_internal_random_state       (vTHX->Iinternal_random_state)
-#define PL_isarev              (vTHX->Iisarev)
-#define PL_known_layers                (vTHX->Iknown_layers)
-#define PL_langinfo_buf                (vTHX->Ilanginfo_buf)
-#define PL_langinfo_bufsize    (vTHX->Ilanginfo_bufsize)
-#define PL_last_in_gv          (vTHX->Ilast_in_gv)
-#define PL_lastfd              (vTHX->Ilastfd)
-#define PL_lastgotoprobe       (vTHX->Ilastgotoprobe)
-#define PL_laststatval         (vTHX->Ilaststatval)
-#define PL_laststype           (vTHX->Ilaststype)
-#define PL_lc_numeric_mutex_depth      (vTHX->Ilc_numeric_mutex_depth)
-#define PL_locale_utf8ness     (vTHX->Ilocale_utf8ness)
-#define PL_localizing          (vTHX->Ilocalizing)
-#define PL_localpatches                (vTHX->Ilocalpatches)
-#define PL_lockhook            (vTHX->Ilockhook)
-#define PL_main_cv             (vTHX->Imain_cv)
-#define PL_main_root           (vTHX->Imain_root)
-#define PL_main_start          (vTHX->Imain_start)
-#define PL_mainstack           (vTHX->Imainstack)
-#define PL_markstack           (vTHX->Imarkstack)
-#define PL_markstack_max       (vTHX->Imarkstack_max)
-#define PL_markstack_ptr       (vTHX->Imarkstack_ptr)
-#define PL_max_intro_pending   (vTHX->Imax_intro_pending)
-#define PL_maxsysfd            (vTHX->Imaxsysfd)
-#define PL_mbrlen_ps           (vTHX->Imbrlen_ps)
-#define PL_mbrtowc_ps          (vTHX->Imbrtowc_ps)
-#define PL_mem_log             (vTHX->Imem_log)
-#define PL_memory_debug_header (vTHX->Imemory_debug_header)
-#define PL_mess_sv             (vTHX->Imess_sv)
-#define PL_min_intro_pending   (vTHX->Imin_intro_pending)
-#define PL_minus_E             (vTHX->Iminus_E)
-#define PL_minus_F             (vTHX->Iminus_F)
-#define PL_minus_a             (vTHX->Iminus_a)
-#define PL_minus_c             (vTHX->Iminus_c)
-#define PL_minus_l             (vTHX->Iminus_l)
-#define PL_minus_n             (vTHX->Iminus_n)
-#define PL_minus_p             (vTHX->Iminus_p)
-#define PL_modcount            (vTHX->Imodcount)
-#define PL_modglobal           (vTHX->Imodglobal)
-#define PL_multideref_pc       (vTHX->Imultideref_pc)
-#define PL_my_cxt_list         (vTHX->Imy_cxt_list)
-#define PL_my_cxt_size         (vTHX->Imy_cxt_size)
-#define PL_na                  (vTHX->Ina)
-#define PL_nomemok             (vTHX->Inomemok)
-#define PL_numeric_name                (vTHX->Inumeric_name)
-#define PL_numeric_radix_sv    (vTHX->Inumeric_radix_sv)
-#define PL_numeric_standard    (vTHX->Inumeric_standard)
-#define PL_numeric_underlying  (vTHX->Inumeric_underlying)
-#define PL_numeric_underlying_is_standard      (vTHX->Inumeric_underlying_is_standard)
-#define PL_ofsgv               (vTHX->Iofsgv)
-#define PL_oldname             (vTHX->Ioldname)
-#define PL_op                  (vTHX->Iop)
-#define PL_op_exec_cnt         (vTHX->Iop_exec_cnt)
-#define PL_op_mask             (vTHX->Iop_mask)
-#define PL_opfreehook          (vTHX->Iopfreehook)
-#define PL_origalen            (vTHX->Iorigalen)
-#define PL_origargc            (vTHX->Iorigargc)
-#define PL_origargv            (vTHX->Iorigargv)
-#define PL_origenviron         (vTHX->Iorigenviron)
-#define PL_origfilename                (vTHX->Iorigfilename)
-#define PL_ors_sv              (vTHX->Iors_sv)
-#define PL_osname              (vTHX->Iosname)
-#define PL_pad_reset_pending   (vTHX->Ipad_reset_pending)
-#define PL_padix               (vTHX->Ipadix)
-#define PL_padix_floor         (vTHX->Ipadix_floor)
-#define PL_padlist_generation  (vTHX->Ipadlist_generation)
-#define PL_padname_const       (vTHX->Ipadname_const)
-#define PL_padname_undef       (vTHX->Ipadname_undef)
-#define PL_parser              (vTHX->Iparser)
-#define PL_patchlevel          (vTHX->Ipatchlevel)
-#define PL_peepp               (vTHX->Ipeepp)
-#define PL_perl_destruct_level (vTHX->Iperl_destruct_level)
-#define PL_perldb              (vTHX->Iperldb)
-#define PL_perlio              (vTHX->Iperlio)
-#define PL_phase               (vTHX->Iphase)
-#define PL_pidstatus           (vTHX->Ipidstatus)
-#define PL_preambleav          (vTHX->Ipreambleav)
-#define PL_prevailing_version  (vTHX->Iprevailing_version)
-#define PL_profiledata         (vTHX->Iprofiledata)
-#define PL_psig_name           (vTHX->Ipsig_name)
-#define PL_psig_pend           (vTHX->Ipsig_pend)
-#define PL_psig_ptr            (vTHX->Ipsig_ptr)
-#define PL_ptr_table           (vTHX->Iptr_table)
-#define PL_random_state                (vTHX->Irandom_state)
-#define PL_reentrant_buffer    (vTHX->Ireentrant_buffer)
-#define PL_reentrant_retint    (vTHX->Ireentrant_retint)
-#define PL_reg_curpm           (vTHX->Ireg_curpm)
-#define PL_regex_pad           (vTHX->Iregex_pad)
-#define PL_regex_padav         (vTHX->Iregex_padav)
-#define PL_registered_mros     (vTHX->Iregistered_mros)
-#define PL_regmatch_slab       (vTHX->Iregmatch_slab)
-#define PL_regmatch_state      (vTHX->Iregmatch_state)
-#define PL_replgv              (vTHX->Ireplgv)
-#define PL_restartjmpenv       (vTHX->Irestartjmpenv)
-#define PL_restartop           (vTHX->Irestartop)
-#define PL_rpeepp              (vTHX->Irpeepp)
-#define PL_rs                  (vTHX->Irs)
-#define PL_runops              (vTHX->Irunops)
-#define PL_savebegin           (vTHX->Isavebegin)
-#define PL_savestack           (vTHX->Isavestack)
-#define PL_savestack_ix                (vTHX->Isavestack_ix)
-#define PL_savestack_max       (vTHX->Isavestack_max)
-#ifndef PL_sawampersand
-#define PL_sawampersand                (vTHX->Isawampersand)
-#endif
-#define PL_scopestack          (vTHX->Iscopestack)
-#define PL_scopestack_ix       (vTHX->Iscopestack_ix)
-#define PL_scopestack_max      (vTHX->Iscopestack_max)
-#define PL_scopestack_name     (vTHX->Iscopestack_name)
-#define PL_secondgv            (vTHX->Isecondgv)
-#define PL_setlocale_buf       (vTHX->Isetlocale_buf)
-#define PL_setlocale_bufsize   (vTHX->Isetlocale_bufsize)
-#define PL_sharehook           (vTHX->Isharehook)
-#define PL_sig_pending         (vTHX->Isig_pending)
-#define PL_sighandler1p                (vTHX->Isighandler1p)
-#define PL_sighandler3p                (vTHX->Isighandler3p)
-#define PL_sighandlerp         (vTHX->Isighandlerp)
-#define PL_signalhook          (vTHX->Isignalhook)
-#define PL_signals             (vTHX->Isignals)
-#define PL_sortcop             (vTHX->Isortcop)
-#define PL_sortstash           (vTHX->Isortstash)
-#define PL_splitstr            (vTHX->Isplitstr)
-#define PL_srand_called                (vTHX->Isrand_called)
-#define PL_stack_base          (vTHX->Istack_base)
-#define PL_stack_max           (vTHX->Istack_max)
-#define PL_stack_sp            (vTHX->Istack_sp)
-#define PL_start_env           (vTHX->Istart_env)
-#define PL_stashcache          (vTHX->Istashcache)
-#define PL_stashpad            (vTHX->Istashpad)
-#define PL_stashpadix          (vTHX->Istashpadix)
-#define PL_stashpadmax         (vTHX->Istashpadmax)
-#define PL_statcache           (vTHX->Istatcache)
-#define PL_statgv              (vTHX->Istatgv)
-#define PL_statname            (vTHX->Istatname)
-#define PL_statusvalue         (vTHX->Istatusvalue)
-#define PL_statusvalue_posix   (vTHX->Istatusvalue_posix)
-#define PL_statusvalue_vms     (vTHX->Istatusvalue_vms)
-#define PL_stderrgv            (vTHX->Istderrgv)
-#define PL_stdingv             (vTHX->Istdingv)
-#define PL_strtab              (vTHX->Istrtab)
-#define PL_strxfrm_NUL_replacement     (vTHX->Istrxfrm_NUL_replacement)
-#define PL_strxfrm_is_behaved  (vTHX->Istrxfrm_is_behaved)
-#define PL_strxfrm_max_cp      (vTHX->Istrxfrm_max_cp)
-#define PL_sub_generation      (vTHX->Isub_generation)
-#define PL_subline             (vTHX->Isubline)
-#define PL_subname             (vTHX->Isubname)
-#define PL_sv_arenaroot                (vTHX->Isv_arenaroot)
-#define PL_sv_consts           (vTHX->Isv_consts)
-#define PL_sv_count            (vTHX->Isv_count)
-#define PL_sv_immortals                (vTHX->Isv_immortals)
-#define PL_sv_no               (vTHX->Isv_no)
-#define PL_sv_root             (vTHX->Isv_root)
-#define PL_sv_serial           (vTHX->Isv_serial)
-#define PL_sv_undef            (vTHX->Isv_undef)
-#define PL_sv_yes              (vTHX->Isv_yes)
-#define PL_sv_zero             (vTHX->Isv_zero)
-#define PL_sys_intern          (vTHX->Isys_intern)
-#define PL_taint_warn          (vTHX->Itaint_warn)
-#define PL_tainted             (vTHX->Itainted)
-#define PL_tainting            (vTHX->Itainting)
-#define PL_threadhook          (vTHX->Ithreadhook)
-#define PL_tmps_floor          (vTHX->Itmps_floor)
-#define PL_tmps_ix             (vTHX->Itmps_ix)
-#define PL_tmps_max            (vTHX->Itmps_max)
-#define PL_tmps_stack          (vTHX->Itmps_stack)
-#define PL_top_env             (vTHX->Itop_env)
-#define PL_toptarget           (vTHX->Itoptarget)
-#define PL_underlying_numeric_obj      (vTHX->Iunderlying_numeric_obj)
-#define PL_unicode             (vTHX->Iunicode)
-#define PL_unitcheckav         (vTHX->Iunitcheckav)
-#define PL_unitcheckav_save    (vTHX->Iunitcheckav_save)
-#define PL_unlockhook          (vTHX->Iunlockhook)
-#define PL_unsafe              (vTHX->Iunsafe)
-#define PL_utf8_charname_begin (vTHX->Iutf8_charname_begin)
-#define PL_utf8_charname_continue      (vTHX->Iutf8_charname_continue)
-#define PL_utf8_foldclosures   (vTHX->Iutf8_foldclosures)
-#define PL_utf8_idcont         (vTHX->Iutf8_idcont)
-#define PL_utf8_idstart                (vTHX->Iutf8_idstart)
-#define PL_utf8_mark           (vTHX->Iutf8_mark)
-#define PL_utf8_perl_idcont    (vTHX->Iutf8_perl_idcont)
-#define PL_utf8_perl_idstart   (vTHX->Iutf8_perl_idstart)
-#define PL_utf8_tofold         (vTHX->Iutf8_tofold)
-#define PL_utf8_tolower                (vTHX->Iutf8_tolower)
-#define PL_utf8_tosimplefold   (vTHX->Iutf8_tosimplefold)
-#define PL_utf8_totitle                (vTHX->Iutf8_totitle)
-#define PL_utf8_toupper                (vTHX->Iutf8_toupper)
-#define PL_utf8_xidcont                (vTHX->Iutf8_xidcont)
-#define PL_utf8_xidstart       (vTHX->Iutf8_xidstart)
-#define PL_utf8cache           (vTHX->Iutf8cache)
-#define PL_utf8locale          (vTHX->Iutf8locale)
-#define PL_warn_locale         (vTHX->Iwarn_locale)
-#define PL_warnhook            (vTHX->Iwarnhook)
-#define PL_watchaddr           (vTHX->Iwatchaddr)
-#define PL_watchok             (vTHX->Iwatchok)
-#define PL_wcrtomb_ps          (vTHX->Iwcrtomb_ps)
-#define PL_xsubfilename                (vTHX->Ixsubfilename)
+# define vTHX                                   aTHX
+# define PL_AboveLatin1                         (vTHX->IAboveLatin1)
+# define PL_an                                  (vTHX->Ian)
+# define PL_argvgv                              (vTHX->Iargvgv)
+# define PL_argvout_stack                       (vTHX->Iargvout_stack)
+# define PL_argvoutgv                           (vTHX->Iargvoutgv)
+# define PL_Assigned_invlist                    (vTHX->IAssigned_invlist)
+# define PL_basetime                            (vTHX->Ibasetime)
+# define PL_beginav                             (vTHX->Ibeginav)
+# define PL_beginav_save                        (vTHX->Ibeginav_save)
+# define PL_blockhooks                          (vTHX->Iblockhooks)
+# define PL_body_arenas                         (vTHX->Ibody_arenas)
+# define PL_body_roots                          (vTHX->Ibody_roots)
+# define PL_bodytarget                          (vTHX->Ibodytarget)
+# define PL_breakable_sub_gen                   (vTHX->Ibreakable_sub_gen)
+# define PL_CCC_non0_non230                     (vTHX->ICCC_non0_non230)
+# define PL_checkav                             (vTHX->Icheckav)
+# define PL_checkav_save                        (vTHX->Icheckav_save)
+# define PL_chopset                             (vTHX->Ichopset)
+# define PL_clocktick                           (vTHX->Iclocktick)
+# define PL_collation_ix                        (vTHX->Icollation_ix)
+# define PL_collation_name                      (vTHX->Icollation_name)
+# define PL_collation_standard                  (vTHX->Icollation_standard)
+# define PL_collxfrm_base                       (vTHX->Icollxfrm_base)
+# define PL_collxfrm_mult                       (vTHX->Icollxfrm_mult)
+# define PL_colors                              (vTHX->Icolors)
+# define PL_colorset                            (vTHX->Icolorset)
+# define PL_compcv                              (vTHX->Icompcv)
+# define PL_compiling                           (vTHX->Icompiling)
+# define PL_comppad                             (vTHX->Icomppad)
+# define PL_comppad_name                        (vTHX->Icomppad_name)
+# define PL_comppad_name_fill                   (vTHX->Icomppad_name_fill)
+# define PL_comppad_name_floor                  (vTHX->Icomppad_name_floor)
+# define PL_constpadix                          (vTHX->Iconstpadix)
+# define PL_cop_seqmax                          (vTHX->Icop_seqmax)
+# define PL_ctype_name                          (vTHX->Ictype_name)
+# define PL_cur_LC_ALL                          (vTHX->Icur_LC_ALL)
+# define PL_cur_locale_obj                      (vTHX->Icur_locale_obj)
+# define PL_curcop                              (vTHX->Icurcop)
+# define PL_curcopdb                            (vTHX->Icurcopdb)
+# define PL_curlocales                          (vTHX->Icurlocales)
+# define PL_curpad                              (vTHX->Icurpad)
+# define PL_curpm                               (vTHX->Icurpm)
+# define PL_curpm_under                         (vTHX->Icurpm_under)
+# define PL_curstack                            (vTHX->Icurstack)
+# define PL_curstackinfo                        (vTHX->Icurstackinfo)
+# define PL_curstash                            (vTHX->Icurstash)
+# define PL_curstname                           (vTHX->Icurstname)
+# define PL_custom_op_descs                     (vTHX->Icustom_op_descs)
+# define PL_custom_op_names                     (vTHX->Icustom_op_names)
+# define PL_custom_ops                          (vTHX->Icustom_ops)
+# define PL_cv_has_eval                         (vTHX->Icv_has_eval)
+# define PL_dbargs                              (vTHX->Idbargs)
+# define PL_DBcontrol                           (vTHX->IDBcontrol)
+# define PL_DBcv                                (vTHX->IDBcv)
+# define PL_DBgv                                (vTHX->IDBgv)
+# define PL_DBline                              (vTHX->IDBline)
+# define PL_DBsignal                            (vTHX->IDBsignal)
+# define PL_DBsingle                            (vTHX->IDBsingle)
+# define PL_DBsub                               (vTHX->IDBsub)
+# define PL_DBtrace                             (vTHX->IDBtrace)
+# define PL_debstash                            (vTHX->Idebstash)
+# define PL_debug                               (vTHX->Idebug)
+# define PL_debug_pad                           (vTHX->Idebug_pad)
+# define PL_def_layerlist                       (vTHX->Idef_layerlist)
+# define PL_defgv                               (vTHX->Idefgv)
+# define PL_defoutgv                            (vTHX->Idefoutgv)
+# define PL_defstash                            (vTHX->Idefstash)
+# define PL_delaymagic                          (vTHX->Idelaymagic)
+# define PL_delaymagic_egid                     (vTHX->Idelaymagic_egid)
+# define PL_delaymagic_euid                     (vTHX->Idelaymagic_euid)
+# define PL_delaymagic_gid                      (vTHX->Idelaymagic_gid)
+# define PL_delaymagic_uid                      (vTHX->Idelaymagic_uid)
+# define PL_destroyhook                         (vTHX->Idestroyhook)
+# define PL_diehook                             (vTHX->Idiehook)
+# define PL_Dir                                 (vTHX->IDir)
+# define PL_doswitches                          (vTHX->Idoswitches)
+# define PL_dowarn                              (vTHX->Idowarn)
+# define PL_dump_re_max_len                     (vTHX->Idump_re_max_len)
+# define PL_dumper_fd                           (vTHX->Idumper_fd)
+# define PL_dumpindent                          (vTHX->Idumpindent)
+# define PL_e_script                            (vTHX->Ie_script)
+# define PL_efloatbuf                           (vTHX->Iefloatbuf)
+# define PL_efloatsize                          (vTHX->Iefloatsize)
+# define PL_endav                               (vTHX->Iendav)
+# define PL_Env                                 (vTHX->IEnv)
+# define PL_envgv                               (vTHX->Ienvgv)
+# define PL_errgv                               (vTHX->Ierrgv)
+# define PL_errors                              (vTHX->Ierrors)
+# define PL_eval_begin_nest_depth               (vTHX->Ieval_begin_nest_depth)
+# define PL_eval_root                           (vTHX->Ieval_root)
+# define PL_eval_start                          (vTHX->Ieval_start)
+# define PL_evalseq                             (vTHX->Ievalseq)
+# define PL_exit_flags                          (vTHX->Iexit_flags)
+# define PL_exitlist                            (vTHX->Iexitlist)
+# define PL_exitlistlen                         (vTHX->Iexitlistlen)
+# define PL_fdpid                               (vTHX->Ifdpid)
+# define PL_filemode                            (vTHX->Ifilemode)
+# define PL_firstgv                             (vTHX->Ifirstgv)
+# define PL_fold_locale                         (vTHX->Ifold_locale)
+# define PL_forkprocess                         (vTHX->Iforkprocess)
+# define PL_formtarget                          (vTHX->Iformtarget)
+# define PL_GCB_invlist                         (vTHX->IGCB_invlist)
+# define PL_generation                          (vTHX->Igeneration)
+# define PL_gensym                              (vTHX->Igensym)
+# define PL_globalstash                         (vTHX->Iglobalstash)
+# define PL_globhook                            (vTHX->Iglobhook)
+# define PL_hash_rand_bits                      (vTHX->Ihash_rand_bits)
+# define PL_hash_rand_bits_enabled              (vTHX->Ihash_rand_bits_enabled)
+# define PL_HasMultiCharFold                    (vTHX->IHasMultiCharFold)
+# define PL_hintgv                              (vTHX->Ihintgv)
+# define PL_hook__require__after                (vTHX->Ihook__require__after)
+# define PL_hook__require__before               (vTHX->Ihook__require__before)
+# define PL_hv_fetch_ent_mh                     (vTHX->Ihv_fetch_ent_mh)
+# define PL_in_clean_all                        (vTHX->Iin_clean_all)
+# define PL_in_clean_objs                       (vTHX->Iin_clean_objs)
+# define PL_in_eval                             (vTHX->Iin_eval)
+# define PL_in_load_module                      (vTHX->Iin_load_module)
+# define PL_in_some_fold                        (vTHX->Iin_some_fold)
+# define PL_in_utf8_COLLATE_locale              (vTHX->Iin_utf8_COLLATE_locale)
+# define PL_in_utf8_CTYPE_locale                (vTHX->Iin_utf8_CTYPE_locale)
+# define PL_in_utf8_turkic_locale               (vTHX->Iin_utf8_turkic_locale)
+# define PL_InBitmap                            (vTHX->IInBitmap)
+# define PL_incgv                               (vTHX->Iincgv)
+# define PL_initav                              (vTHX->Iinitav)
+# define PL_InMultiCharFold                     (vTHX->IInMultiCharFold)
+# define PL_inplace                             (vTHX->Iinplace)
+# define PL_internal_random_state               (vTHX->Iinternal_random_state)
+# define PL_isarev                              (vTHX->Iisarev)
+# define PL_known_layers                        (vTHX->Iknown_layers)
+# define PL_langinfo_buf                        (vTHX->Ilanginfo_buf)
+# define PL_langinfo_bufsize                    (vTHX->Ilanginfo_bufsize)
+# define PL_last_in_gv                          (vTHX->Ilast_in_gv)
+# define PL_lastfd                              (vTHX->Ilastfd)
+# define PL_lastgotoprobe                       (vTHX->Ilastgotoprobe)
+# define PL_laststatval                         (vTHX->Ilaststatval)
+# define PL_laststype                           (vTHX->Ilaststype)
+# define PL_Latin1                              (vTHX->ILatin1)
+# define PL_LB_invlist                          (vTHX->ILB_invlist)
+# define PL_LIO                                 (vTHX->ILIO)
+# define PL_locale_mutex_depth                  (vTHX->Ilocale_mutex_depth)
+# define PL_localizing                          (vTHX->Ilocalizing)
+# define PL_localpatches                        (vTHX->Ilocalpatches)
+# define PL_lockhook                            (vTHX->Ilockhook)
+# define PL_main_cv                             (vTHX->Imain_cv)
+# define PL_main_root                           (vTHX->Imain_root)
+# define PL_main_start                          (vTHX->Imain_start)
+# define PL_mainstack                           (vTHX->Imainstack)
+# define PL_markstack                           (vTHX->Imarkstack)
+# define PL_markstack_max                       (vTHX->Imarkstack_max)
+# define PL_markstack_ptr                       (vTHX->Imarkstack_ptr)
+# define PL_max_intro_pending                   (vTHX->Imax_intro_pending)
+# define PL_maxsysfd                            (vTHX->Imaxsysfd)
+# define PL_mbrlen_ps                           (vTHX->Imbrlen_ps)
+# define PL_mbrtowc_ps                          (vTHX->Imbrtowc_ps)
+# define PL_Mem                                 (vTHX->IMem)
+# define PL_mem_log                             (vTHX->Imem_log)
+# define PL_memory_debug_header                 (vTHX->Imemory_debug_header)
+# define PL_MemParse                            (vTHX->IMemParse)
+# define PL_MemShared                           (vTHX->IMemShared)
+# define PL_mess_sv                             (vTHX->Imess_sv)
+# define PL_min_intro_pending                   (vTHX->Imin_intro_pending)
+# define PL_minus_a                             (vTHX->Iminus_a)
+# define PL_minus_c                             (vTHX->Iminus_c)
+# define PL_minus_E                             (vTHX->Iminus_E)
+# define PL_minus_F                             (vTHX->Iminus_F)
+# define PL_minus_l                             (vTHX->Iminus_l)
+# define PL_minus_n                             (vTHX->Iminus_n)
+# define PL_minus_p                             (vTHX->Iminus_p)
+# define PL_modcount                            (vTHX->Imodcount)
+# define PL_modglobal                           (vTHX->Imodglobal)
+# define PL_multideref_pc                       (vTHX->Imultideref_pc)
+# define PL_my_cxt_list                         (vTHX->Imy_cxt_list)
+# define PL_my_cxt_size                         (vTHX->Imy_cxt_size)
+# define PL_na                                  (vTHX->Ina)
+# define PL_nomemok                             (vTHX->Inomemok)
+# define PL_numeric_name                        (vTHX->Inumeric_name)
+# define PL_numeric_radix_sv                    (vTHX->Inumeric_radix_sv)
+# define PL_numeric_standard                    (vTHX->Inumeric_standard)
+# define PL_numeric_underlying                  (vTHX->Inumeric_underlying)
+# define PL_numeric_underlying_is_standard      (vTHX->Inumeric_underlying_is_standard)
+# define PL_ofsgv                               (vTHX->Iofsgv)
+# define PL_oldname                             (vTHX->Ioldname)
+# define PL_op                                  (vTHX->Iop)
+# define PL_op_exec_cnt                         (vTHX->Iop_exec_cnt)
+# define PL_op_mask                             (vTHX->Iop_mask)
+# define PL_opfreehook                          (vTHX->Iopfreehook)
+# define PL_origalen                            (vTHX->Iorigalen)
+# define PL_origargc                            (vTHX->Iorigargc)
+# define PL_origargv                            (vTHX->Iorigargv)
+# define PL_origfilename                        (vTHX->Iorigfilename)
+# define PL_ors_sv                              (vTHX->Iors_sv)
+# define PL_osname                              (vTHX->Iosname)
+# define PL_pad_reset_pending                   (vTHX->Ipad_reset_pending)
+# define PL_padix                               (vTHX->Ipadix)
+# define PL_padix_floor                         (vTHX->Ipadix_floor)
+# define PL_padlist_generation                  (vTHX->Ipadlist_generation)
+# define PL_padname_const                       (vTHX->Ipadname_const)
+# define PL_padname_undef                       (vTHX->Ipadname_undef)
+# define PL_parser                              (vTHX->Iparser)
+# define PL_patchlevel                          (vTHX->Ipatchlevel)
+# define PL_peepp                               (vTHX->Ipeepp)
+# define PL_perl_destruct_level                 (vTHX->Iperl_destruct_level)
+# define PL_perldb                              (vTHX->Iperldb)
+# define PL_perlio                              (vTHX->Iperlio)
+# define PL_phase                               (vTHX->Iphase)
+# define PL_pidstatus                           (vTHX->Ipidstatus)
+# define PL_Posix_ptrs                          (vTHX->IPosix_ptrs)
+# define PL_preambleav                          (vTHX->Ipreambleav)
+# define PL_prevailing_version                  (vTHX->Iprevailing_version)
+# define PL_Private_Use                         (vTHX->IPrivate_Use)
+# define PL_Proc                                (vTHX->IProc)
+# define PL_profiledata                         (vTHX->Iprofiledata)
+# define PL_psig_name                           (vTHX->Ipsig_name)
+# define PL_psig_pend                           (vTHX->Ipsig_pend)
+# define PL_psig_ptr                            (vTHX->Ipsig_ptr)
+# define PL_ptr_table                           (vTHX->Iptr_table)
+# define PL_random_state                        (vTHX->Irandom_state)
+# define PL_reentrant_buffer                    (vTHX->Ireentrant_buffer)
+# define PL_reentrant_retint                    (vTHX->Ireentrant_retint)
+# define PL_reg_curpm                           (vTHX->Ireg_curpm)
+# define PL_regex_pad                           (vTHX->Iregex_pad)
+# define PL_regex_padav                         (vTHX->Iregex_padav)
+# define PL_registered_mros                     (vTHX->Iregistered_mros)
+# define PL_regmatch_slab                       (vTHX->Iregmatch_slab)
+# define PL_regmatch_state                      (vTHX->Iregmatch_state)
+# define PL_replgv                              (vTHX->Ireplgv)
+# define PL_restartjmpenv                       (vTHX->Irestartjmpenv)
+# define PL_restartop                           (vTHX->Irestartop)
+# define PL_rpeepp                              (vTHX->Irpeepp)
+# define PL_rs                                  (vTHX->Irs)
+# define PL_runops                              (vTHX->Irunops)
+# define PL_savebegin                           (vTHX->Isavebegin)
+# define PL_savestack                           (vTHX->Isavestack)
+# define PL_savestack_ix                        (vTHX->Isavestack_ix)
+# define PL_savestack_max                       (vTHX->Isavestack_max)
+# define PL_SB_invlist                          (vTHX->ISB_invlist)
+# define PL_scopestack                          (vTHX->Iscopestack)
+# define PL_scopestack_ix                       (vTHX->Iscopestack_ix)
+# define PL_scopestack_max                      (vTHX->Iscopestack_max)
+# define PL_scopestack_name                     (vTHX->Iscopestack_name)
+# define PL_scratch_locale_obj                  (vTHX->Iscratch_locale_obj)
+# define PL_SCX_invlist                         (vTHX->ISCX_invlist)
+# define PL_secondgv                            (vTHX->Isecondgv)
+# define PL_setlocale_buf                       (vTHX->Isetlocale_buf)
+# define PL_setlocale_bufsize                   (vTHX->Isetlocale_bufsize)
+# define PL_sharehook                           (vTHX->Isharehook)
+# define PL_sig_pending                         (vTHX->Isig_pending)
+# define PL_sighandler1p                        (vTHX->Isighandler1p)
+# define PL_sighandler3p                        (vTHX->Isighandler3p)
+# define PL_sighandlerp                         (vTHX->Isighandlerp)
+# define PL_signalhook                          (vTHX->Isignalhook)
+# define PL_signals                             (vTHX->Isignals)
+# define PL_Sock                                (vTHX->ISock)
+# define PL_sortcop                             (vTHX->Isortcop)
+# define PL_sortstash                           (vTHX->Isortstash)
+# define PL_splitstr                            (vTHX->Isplitstr)
+# define PL_srand_called                        (vTHX->Isrand_called)
+# define PL_srand_override                      (vTHX->Isrand_override)
+# define PL_srand_override_next                 (vTHX->Isrand_override_next)
+# define PL_stack_base                          (vTHX->Istack_base)
+# define PL_stack_max                           (vTHX->Istack_max)
+# define PL_stack_sp                            (vTHX->Istack_sp)
+# define PL_start_env                           (vTHX->Istart_env)
+# define PL_stashcache                          (vTHX->Istashcache)
+# define PL_stashpad                            (vTHX->Istashpad)
+# define PL_stashpadix                          (vTHX->Istashpadix)
+# define PL_stashpadmax                         (vTHX->Istashpadmax)
+# define PL_statcache                           (vTHX->Istatcache)
+# define PL_statgv                              (vTHX->Istatgv)
+# define PL_statname                            (vTHX->Istatname)
+# define PL_statusvalue                         (vTHX->Istatusvalue)
+# define PL_statusvalue_posix                   (vTHX->Istatusvalue_posix)
+# define PL_statusvalue_vms                     (vTHX->Istatusvalue_vms)
+# define PL_stderrgv                            (vTHX->Istderrgv)
+# define PL_stdingv                             (vTHX->Istdingv)
+# define PL_StdIO                               (vTHX->IStdIO)
+# define PL_stdize_locale_buf                   (vTHX->Istdize_locale_buf)
+# define PL_stdize_locale_bufsize               (vTHX->Istdize_locale_bufsize)
+# define PL_strtab                              (vTHX->Istrtab)
+# define PL_strxfrm_is_behaved                  (vTHX->Istrxfrm_is_behaved)
+# define PL_strxfrm_max_cp                      (vTHX->Istrxfrm_max_cp)
+# define PL_strxfrm_NUL_replacement             (vTHX->Istrxfrm_NUL_replacement)
+# define PL_sub_generation                      (vTHX->Isub_generation)
+# define PL_subline                             (vTHX->Isubline)
+# define PL_subname                             (vTHX->Isubname)
+# define PL_Sv                                  (vTHX->ISv)
+# define PL_sv_arenaroot                        (vTHX->Isv_arenaroot)
+# define PL_sv_consts                           (vTHX->Isv_consts)
+# define PL_sv_count                            (vTHX->Isv_count)
+# define PL_sv_immortals                        (vTHX->Isv_immortals)
+# define PL_sv_no                               (vTHX->Isv_no)
+# define PL_sv_root                             (vTHX->Isv_root)
+# define PL_sv_serial                           (vTHX->Isv_serial)
+# define PL_sv_undef                            (vTHX->Isv_undef)
+# define PL_sv_yes                              (vTHX->Isv_yes)
+# define PL_sv_zero                             (vTHX->Isv_zero)
+# define PL_sys_intern                          (vTHX->Isys_intern)
+# define PL_taint_warn                          (vTHX->Itaint_warn)
+# define PL_tainted                             (vTHX->Itainted)
+# define PL_tainting                            (vTHX->Itainting)
+# define PL_threadhook                          (vTHX->Ithreadhook)
+# define PL_tmps_floor                          (vTHX->Itmps_floor)
+# define PL_tmps_ix                             (vTHX->Itmps_ix)
+# define PL_tmps_max                            (vTHX->Itmps_max)
+# define PL_tmps_stack                          (vTHX->Itmps_stack)
+# define PL_top_env                             (vTHX->Itop_env)
+# define PL_toptarget                           (vTHX->Itoptarget)
+# define PL_TR_SPECIAL_HANDLING_UTF8            (vTHX->ITR_SPECIAL_HANDLING_UTF8)
+# define PL_underlying_numeric_obj              (vTHX->Iunderlying_numeric_obj)
+# define PL_underlying_radix_sv                 (vTHX->Iunderlying_radix_sv)
+# define PL_unicode                             (vTHX->Iunicode)
+# define PL_unitcheckav                         (vTHX->Iunitcheckav)
+# define PL_unitcheckav_save                    (vTHX->Iunitcheckav_save)
+# define PL_unlockhook                          (vTHX->Iunlockhook)
+# define PL_unsafe                              (vTHX->Iunsafe)
+# define PL_UpperLatin1                         (vTHX->IUpperLatin1)
+# define PL_utf8_charname_begin                 (vTHX->Iutf8_charname_begin)
+# define PL_utf8_charname_continue              (vTHX->Iutf8_charname_continue)
+# define PL_utf8_foldclosures                   (vTHX->Iutf8_foldclosures)
+# define PL_utf8_idcont                         (vTHX->Iutf8_idcont)
+# define PL_utf8_idstart                        (vTHX->Iutf8_idstart)
+# define PL_utf8_mark                           (vTHX->Iutf8_mark)
+# define PL_utf8_perl_idcont                    (vTHX->Iutf8_perl_idcont)
+# define PL_utf8_perl_idstart                   (vTHX->Iutf8_perl_idstart)
+# define PL_utf8_tofold                         (vTHX->Iutf8_tofold)
+# define PL_utf8_tolower                        (vTHX->Iutf8_tolower)
+# define PL_utf8_tosimplefold                   (vTHX->Iutf8_tosimplefold)
+# define PL_utf8_totitle                        (vTHX->Iutf8_totitle)
+# define PL_utf8_toupper                        (vTHX->Iutf8_toupper)
+# define PL_utf8_xidcont                        (vTHX->Iutf8_xidcont)
+# define PL_utf8_xidstart                       (vTHX->Iutf8_xidstart)
+# define PL_utf8cache                           (vTHX->Iutf8cache)
+# define PL_utf8locale                          (vTHX->Iutf8locale)
+# define PL_warn_locale                         (vTHX->Iwarn_locale)
+# define PL_warnhook                            (vTHX->Iwarnhook)
+# define PL_watchaddr                           (vTHX->Iwatchaddr)
+# define PL_watchok                             (vTHX->Iwatchok)
+# define PL_WB_invlist                          (vTHX->IWB_invlist)
+# define PL_wcrtomb_ps                          (vTHX->Iwcrtomb_ps)
+# define PL_XPosix_ptrs                         (vTHX->IXPosix_ptrs)
+# define PL_Xpv                                 (vTHX->IXpv)
+# define PL_xsubfilename                        (vTHX->Ixsubfilename)
+# if !defined(PL_sawampersand)
+#   define PL_sawampersand                      (vTHX->Isawampersand)
+# endif
+#endif /* defined(MULTIPLICITY) */
 
-#endif /* MULTIPLICITY */
-
-/* ex: set ro: */
+/* ex: set ro ft=c: */
index 9e6f289..d0a04c6 100644 (file)
@@ -20,7 +20,7 @@ sub import {
 # walkoptree comes from B.xs
 
 BEGIN {
-    $B::VERSION = '1.83';
+    $B::VERSION = '1.88';
     @B::EXPORT_OK = ();
 
     # Our BOOT code needs $VERSION set, and will append to @EXPORT_OK.
@@ -62,6 +62,7 @@ push @B::EXPORT_OK, (qw(minus_c ppname save_BEGINs
 @B::CV::ISA = 'B::PVMG';
 @B::IO::ISA = 'B::PVMG';
 @B::FM::ISA = 'B::CV';
+@B::OBJ::ISA = 'B::PVMG';
 
 @B::OP::ISA = 'B::OBJECT';
 @B::UNOP::ISA = 'B::OP';
@@ -88,6 +89,12 @@ our @specialsv_name = qw(Nullsv &PL_sv_undef &PL_sv_yes &PL_sv_no
                        (SV*)pWARN_ALL (SV*)pWARN_NONE (SV*)pWARN_STD
                         &PL_sv_zero);
 
+# Back-compat
+{
+    no warnings 'once';
+    *CVf_METHOD = \&CVf_NOWARN_AMBIGUOUS;
+}
+
 {
     # Stop "-w" from complaining about the lack of a real B::OBJECT class
     package B::OBJECT;
@@ -299,7 +306,7 @@ B - The Perl Compiler Backend
 The C<B> module supplies classes which allow a Perl program to delve
 into its own innards.  It is the module used to implement the
 "backends" of the Perl compiler.  Usage of the compiler does not
-require knowledge of this module: see the F<O> module for the
+require knowledge of this module: see the L<O> module for the
 user-visible part.  The C<B> module is of use to those who want to
 write new compiler backends.  This documentation assumes that the
 reader knows a fair amount about perl's internals including such
@@ -593,6 +600,26 @@ C<REFCNT> (corresponding to the C function C<SvREFCNT>).
 
 =item FLAGS
 
+=item IsBOOL
+
+Returns true if the SV is a boolean (true or false).
+You can then use C<TRUE> to check if the value is true or false.
+
+    my $something = ( 1 == 1 ) # boolean true
+                 || ( 1 == 0 ) # boolean false
+                 || 42         # IV true
+                 || 0;         # IV false
+    my $sv = B::svref_2object(\$something);
+
+    say q[Not a boolean value]
+        if ! $sv->IsBOOL;
+
+    say q[This is a boolean with value: true]
+        if   $sv->IsBOOL && $sv->TRUE_nomg;
+
+    say q[This is a boolean with value: false]
+        if   $sv->IsBOOL && ! $sv->TRUE_nomg;
+
 =item object_2svref
 
 Returns a reference to the regular scalar corresponding to this
@@ -601,6 +628,24 @@ to the svref_2object() subroutine.  This scalar and other data it points
 at should be considered read-only: modifying them is neither safe nor
 guaranteed to have a sensible effect.
 
+=item TRUE
+
+Returns a boolean indicating hether Perl would evaluate the SV as true or
+false.
+
+B<Warning> this call performs 'get' magic. If you only want to check the
+nature of this SV use C<TRUE_nomg> helper.
+
+This is an alias for C<SvTRUE($sv)>.
+
+=item TRUE_nomg
+
+Check if the value is true (do not perform 'get' magic).
+Returns a boolean indicating whether Perl would evaluate the SV as true or
+false.
+
+This is an alias for C<SvTRUE_nomg($sv)>.
+
 =back
 
 =head2 B::IV Methods
@@ -1313,6 +1358,8 @@ pointers and B::PADNAME objects otherwise.
 
 =item REFCNT
 
+=item GEN
+
 =item FLAGS
 
 For backward-compatibility, if the PADNAMEt_OUTER flag is set, the FLAGS
@@ -1349,6 +1396,10 @@ Only meaningful if PADNAMEt_OUTER is set.
 
 Only meaningful if PADNAMEt_OUTER is set.
 
+=item IsUndef
+
+Returns a boolean value to check if the padname is PL_padname_undef.
+
 =back
 
 =head2 $B::overlay
index 7cdd0f9..49b35cb 100644 (file)
@@ -40,6 +40,7 @@ static const char* const svclassnames[] = {
     "B::CV",
     "B::FM",
     "B::IO",
+    "B::OBJ",
 };
 
 
@@ -188,7 +189,7 @@ make_temp_object(pTHX_ SV *temp)
 static SV *
 make_warnings_object(pTHX_ const COP *const cop)
 {
-    const STRLEN *const warnings = cop->cop_warnings;
+    const char *const warnings = cop->cop_warnings;
     const char *type = 0;
     dMY_CXT;
     IV iv = sizeof(specialsv_list)/sizeof(SV*);
@@ -210,7 +211,7 @@ make_warnings_object(pTHX_ const COP *const cop)
     } else {
        /* B assumes that warnings are a regular SV. Seems easier to keep it
           happy by making them into a regular SV.  */
-       return make_temp_object(aTHX_ newSVpvn((char *)(warnings + 1), *warnings));
+        return make_temp_object(aTHX_ newSVpvn(warnings, RCPV_LEN(warnings)));
     }
 }
 
@@ -547,7 +548,7 @@ static const struct OP_methods {
 #ifdef USE_ITHREADS
   { STR_WITH_LEN("pmoffset"),IVp,     STRUCT_OFFSET(struct pmop, op_pmoffset),},/*20*/
   { STR_WITH_LEN("filegv"),  op_offset_special, 0,                     },/*21*/
-  { STR_WITH_LEN("file"),    char_pp, STRUCT_OFFSET(struct cop, cop_file),  },/*22*/
+  { STR_WITH_LEN("file"),    char_pp, STRUCT_OFFSET(struct cop, cop_file),  }, /*22*/
   { STR_WITH_LEN("stash"),   op_offset_special, 0,                     },/*23*/
   { STR_WITH_LEN("stashpv"), op_offset_special, 0,                     },/*24*/
   { STR_WITH_LEN("stashoff"),PADOFFSETp,STRUCT_OFFSET(struct cop,cop_stashoff),},/*25*/
@@ -703,8 +704,8 @@ walkoptree_debug(...)
     CODE:
        dMY_CXT;
        RETVAL = walkoptree_debug;
-       if (items > 0 && SvTRUE(ST(1)))
-           walkoptree_debug = 1;
+       if (items > 0)
+           walkoptree_debug = SvTRUE(ST(0));
     OUTPUT:
        RETVAL
 
@@ -902,11 +903,9 @@ next(o)
                ret = make_sv_object(aTHX_ (SV *)CopFILEGV((COP*)o));
                break;
 #endif
-#ifndef USE_ITHREADS
            case 22: /* B::COP::file */
                ret = sv_2mortal(newSVpv(CopFILE((COP*)o), 0));
                break;
-#endif
 #ifdef USE_ITHREADS
            case 23: /* B::COP::stash */
                ret = make_sv_object(aTHX_ (SV *)CopSTASH((COP*)o));
@@ -1072,13 +1071,13 @@ next(o)
                  */
                ret = make_op_object(aTHX_
                             o->op_type == OP_METHOD
-                                ? cMETHOPx(o)->op_u.op_first : NULL);
+                                ? cMETHOPo->op_u.op_first : NULL);
                break;
            case 54: /* B::METHOP::meth_sv */
                 /* see comment above about METHOP */
                ret = make_sv_object(aTHX_
                             o->op_type == OP_METHOD
-                                ? NULL : cMETHOPx(o)->op_u.op_meth_sv);
+                                ? NULL : cMETHOPo->op_u.op_meth_sv);
                break;
            case 55: /* B::PMOP::pmregexp */
                ret = make_sv_object(aTHX_ (SV *)PM_GETRE(cPMOPo));
@@ -1088,13 +1087,13 @@ next(o)
                ret = sv_2mortal(newSVuv(
                    (o->op_type == OP_METHOD_REDIR ||
                     o->op_type == OP_METHOD_REDIR_SUPER) ?
-                     cMETHOPx(o)->op_rclass_targ : 0
+                     cMETHOPo->op_rclass_targ : 0
                ));
 #else
                ret = make_sv_object(aTHX_
                    (o->op_type == OP_METHOD_REDIR ||
                     o->op_type == OP_METHOD_REDIR_SUPER) ?
-                     cMETHOPx(o)->op_rclass_sv : NULL
+                     cMETHOPo->op_rclass_sv : NULL
                );
 #endif
                break;
@@ -1398,12 +1397,12 @@ aux_list(o, cv)
 
 
 
-MODULE = B     PACKAGE = B::SV
+MODULE = B     PACKAGE = B::SV         PREFIX = Sv
 
 #define MAGICAL_FLAG_BITS (SVs_GMG|SVs_SMG|SVs_RMG)
 
 U32
-REFCNT(sv)
+SvREFCNT(sv)
        B::SV   sv
     ALIAS:
        FLAGS = 0xFFFFFFFF
@@ -1417,11 +1416,23 @@ REFCNT(sv)
        RETVAL
 
 void
-object_2svref(sv)
+Svobject_2svref(sv)
        B::SV   sv
     PPCODE:
        ST(0) = sv_2mortal(newRV(sv));
        XSRETURN(1);
+
+bool
+SvIsBOOL(sv)
+    B::SV   sv
+
+bool
+SvTRUE(sv)
+    B::SV   sv
+
+bool
+SvTRUE_nomg(sv)
+    B::SV   sv
        
 MODULE = B     PACKAGE = B::IV         PREFIX = Sv
 
@@ -2252,6 +2263,8 @@ MODULE = B        PACKAGE = B::PADNAME    PREFIX = Padname
        sv_U32p | STRUCT_OFFSET(struct padname, xpadn_low)
 #define PN_cop_seq_range_high_ix \
        sv_U32p | STRUCT_OFFSET(struct padname, xpadn_high)
+#define PN_xpadn_gen_ix \
+       sv_I32p | STRUCT_OFFSET(struct padname, xpadn_gen)
 #define PNL_refcnt_ix \
        sv_U32p | STRUCT_OFFSET(struct padnamelist, xpadnl_refcnt)
 #define PL_id_ix \
@@ -2259,7 +2272,6 @@ MODULE = B        PACKAGE = B::PADNAME    PREFIX = Padname
 #define PL_outid_ix \
        sv_U32p | STRUCT_OFFSET(struct padlist, xpadl_outid)
 
-
 void
 PadnameTYPE(pn)
        B::PADNAME      pn
@@ -2270,6 +2282,7 @@ PadnameTYPE(pn)
        B::PADNAME::REFCNT      = PN_refcnt_ix
        B::PADNAME::COP_SEQ_RANGE_LOW    = PN_cop_seq_range_low_ix
        B::PADNAME::COP_SEQ_RANGE_HIGH   = PN_cop_seq_range_high_ix
+       B::PADNAME::GEN         = PN_xpadn_gen_ix
        B::PADNAMELIST::REFCNT  = PNL_refcnt_ix
        B::PADLIST::id          = PL_id_ix
        B::PADLIST::outid       = PL_outid_ix
@@ -2305,6 +2318,14 @@ PadnamePV(pn)
        SvUTF8_on(TARG);
        XPUSHTARG;
 
+bool
+PadnameIsUndef(padn)
+       B::PADNAME      padn
+    CODE:
+        RETVAL = padn == &PL_padname_undef;
+    OUTPUT:
+       RETVAL
+
 BOOT:
 {
     /* Uses less memory than an ALIAS.  */
@@ -2329,7 +2350,7 @@ PadnameFLAGS(pn)
        RETVAL = PadnameFLAGS(pn);
        /* backward-compatibility hack, which should be removed if the
           flags field becomes large enough to hold SVf_FAKE (and
-          PADNAMEt_OUTER should be renumbered to match SVf_FAKE) */
+          PADNAMEf_OUTER should be renumbered to match SVf_FAKE) */
        STATIC_ASSERT_STMT(SVf_FAKE >= 1<<(sizeof(PadnameFLAGS((B__PADNAME)NULL)) * 8));
        if (PadnameOUTER(pn))
            RETVAL |= SVf_FAKE;
index a7419d7..73d4045 100644 (file)
@@ -14,7 +14,7 @@ use warnings; # uses #3 and #4, since warnings uses Carp
 
 use Exporter 'import'; # use #5
 
-our $VERSION   = "1.006";
+our $VERSION   = "1.007";
 our @EXPORT_OK = qw( set_style set_style_standard add_callback
                     concise_subref concise_cv concise_main
                     add_style walk_output compile reset_sequence );
@@ -1489,6 +1489,11 @@ They're opcode specific, and occur less often than the public ones, so
 they're represented by short mnemonics instead of single-chars; see
 B::Op_private and F<regen/op_private> for more details.
 
+Note that a number after a '/' often indicates the number of arguments.
+In the I<sassign> example above, the OP takes 2 arguments. These values
+are sometimes used at runtime: in particular, the MAXARG macro makes use
+of them.
+
 =head1 FORMATTING SPECIFICATIONS
 
 For each line-style ('concise', 'terse', 'linenoise', etc.) there are
index 1b30ffd..0ff4f4e 100644 (file)
@@ -30,7 +30,7 @@ foreach my $tuple (['cop.h'],
                    ['op.h'],
                    ['opcode.h', 'OPp'],
                    ['op_reg_common.h','(?:(?:RXf_)?PMf_)'],
-                   ['pad.h','PADNAMEt_'],
+                   ['pad.h','PADNAMEf_'],
                    ['regexp.h','RXf_'],
                    ['sv.h', 'SV(?:[fps]|pad)_'],
                   ) {
index aa67fd3..bdf8318 100644 (file)
@@ -306,7 +306,7 @@ is(B::opnumber("pp_null"), 0, "Testing opnumber with opname (pp_null)");
 
 is(B::class(bless {}, "Wibble::Bibble"), "Bibble", "Testing B::class()");
 is(B::cast_I32(3.14), 3, "Testing B::cast_I32()");
-is(B::opnumber("chop"), 38, "Testing opnumber with opname (chop)");
+is(B::opnumber("chop"), 39, "Testing opnumber with opname (chop)");
 
 {
     no warnings 'once';
index cf93bd1..b3227c6 100755 (executable)
@@ -178,13 +178,13 @@ checkOptree ( name        => "terse basic",
 UNOP (0x82b0918) leavesub [1] 
     LISTOP (0x82b08d8) lineseq 
         COP (0x82b0880) nextstate 
-        UNOP (0x82b0860) null [14
+        UNOP (0x82b0860) null [15
             PADOP (0x82b0840) gvsv  GV (0x82a818c) *a 
 EOT_EOT
 # UNOP (0x8282310) leavesub [1] 
 #     LISTOP (0x82822f0) lineseq 
 #         COP (0x82822b8) nextstate 
-#         UNOP (0x812fc20) null [14
+#         UNOP (0x812fc20) null [15
 #             SVOP (0x812fc00) gvsv  GV (0x814692c) *a 
 EONT_EONT
 
index 5e489d6..329a85b 100755 (executable)
@@ -67,49 +67,49 @@ checkOptree ( name  => '-basic (see above, with my $a = shift)',
                             },
              strip_open_hints => 1,
              expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
-# b  <1> leavesub[1 ref] K/REFC,1 ->(end)
-# -     <@> lineseq KP ->b
+# a  <1> leavesub[1 ref] K/REFC,1 ->(end)
+# -     <@> lineseq KP ->a
 # 1        <;> nextstate(main 666 optree_samples.t:70) v:>,<,% ->2
-# 4        <2> sassign vKS/2 ->5
+# 3        <1> padsv_store[$a:666,670] vKS/LVINTRO ->4
 # 2           <0> shift s* ->3
-# 3           <0> padsv[$a:666,670] sRM*/LVINTRO ->4
-# 5        <;> nextstate(main 670 optree_samples.t:71) v:>,<,% ->6
+# -           <0> ex-padsv sRM*/LVINTRO ->3
+# 4        <;> nextstate(main 670 optree_samples.t:71) v:>,<,% ->5
 # -        <1> null K/1 ->-
-# 7           <|> cond_expr(other->8) K/1 ->c
-# 6              <0> padsv[$a:666,670] s ->7
+# 6           <|> cond_expr(other->7) K/1 ->b
+# 5              <0> padsv[$a:666,670] s ->6
 # -              <@> scope K ->-
-# -                 <;> ex-nextstate(main 1603 optree_samples.t:70) v:>,<,% ->8
-# a                 <@> print sK ->b
-# 8                    <0> pushmark s ->9
-# 9                    <$> const[PV "foo"] s ->a
-# h              <@> leave KP ->b
-# c                 <0> enter ->d
-# d                 <;> nextstate(main 668 optree_samples.t:72) v:>,<,% ->e
-# g                 <@> print sK ->h
-# e                    <0> pushmark s ->f
-# f                    <$> const[PV "bar"] s ->g
+# -                 <;> ex-nextstate(main 1510 optree_samples.t:66) v:>,<,% ->7
+# 9                 <@> print sK ->a
+# 7                    <0> pushmark s ->8
+# 8                    <$> const[PV "foo"] s ->9
+# g              <@> leave KP ->a
+# b                 <0> enter ->c
+# c                 <;> nextstate(main 1510 optree_samples.t:66) v:>,<,% ->d
+# f                 <@> print sK ->g
+# d                    <0> pushmark s ->e
+# e                    <$> const[PV "bar"] s ->f
 EOT_EOT
-# b  <1> leavesub[1 ref] K/REFC,1 ->(end)
-# -     <@> lineseq KP ->b
-# 1        <;> nextstate(main 666 optree_samples.t:72) v:>,<,% ->2
-# 4        <2> sassign vKS/2 ->5
+# a  <1> leavesub[1 ref] K/REFC,1 ->(end)
+# -     <@> lineseq KP ->a
+# 1        <;> nextstate(main 666 optree_samples.t:70) v:>,<,% ->2
+# 3        <1> padsv_store[$a:666,670] vKS/LVINTRO ->4
 # 2           <0> shift s* ->3
-# 3           <0> padsv[$a:666,670] sRM*/LVINTRO ->4
-# 5        <;> nextstate(main 670 optree_samples.t:73) v:>,<,% ->6
+# -           <0> ex-padsv sRM*/LVINTRO ->3
+# 4        <;> nextstate(main 670 optree_samples.t:71) v:>,<,% ->5
 # -        <1> null K/1 ->-
-# 7           <|> cond_expr(other->8) K/1 ->c
-# 6              <0> padsv[$a:666,670] s ->7
+# 6           <|> cond_expr(other->7) K/1 ->b
+# 5              <0> padsv[$a:666,670] s ->6
 # -              <@> scope K ->-
-# -                 <;> ex-nextstate(main 1603 optree_samples.t:70) v:>,<,% ->8
-# a                 <@> print sK ->b
-# 8                    <0> pushmark s ->9
-# 9                    <$> const(PV "foo") s ->a
-# h              <@> leave KP ->b
-# c                 <0> enter ->d
-# d                 <;> nextstate(main 668 optree_samples.t:74) v:>,<,% ->e
-# g                 <@> print sK ->h
-# e                    <0> pushmark s ->f
-# f                    <$> const(PV "bar") s ->g
+# -                 <;> ex-nextstate(main 1510 optree_samples.t:70) v:>,<,% ->7
+# 9                 <@> print sK ->a
+# 7                    <0> pushmark s ->8
+# 8                    <$> const(PV "foo") s ->9
+# g              <@> leave KP ->a
+# b                 <0> enter ->c
+# c                 <;> nextstate(main 668 optree_samples.t:72) v:>,<,% ->d
+# f                 <@> print sK ->g
+# d                    <0> pushmark s ->e
+# e                    <$> const(PV "bar") s ->f
 EONT_EONT
 
 checkOptree ( name     => '-exec sub {if shift print then,else}',
@@ -160,41 +160,39 @@ checkOptree ( name        => '-exec (see above, with my $a = shift)',
              expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
 # 1  <;> nextstate(main 675 optree_samples.t:165) v:>,<,%
 # 2  <0> shift s*
-# 3  <0> padsv[$a:675,679] sRM*/LVINTRO
-# 4  <2> sassign vKS/2
-# 5  <;> nextstate(main 679 optree_samples.t:166) v:>,<,%
-# 6  <0> padsv[$a:675,679] s
-# 7  <|> cond_expr(other->8) K/1
-# 8      <0> pushmark s
-# 9      <$> const[PV "foo"] s
-# a      <@> print sK
-#            goto b
-# c  <0> enter 
-# d  <;> nextstate(main 677 optree_samples.t:167) v:>,<,%
-# e  <0> pushmark s
-# f  <$> const[PV "bar"] s
-# g  <@> print sK
-# h  <@> leave KP
-# b  <1> leavesub[1 ref] K/REFC,1
+# 3  <1> padsv_store[$a:1522,1529] vKS/LVINTRO
+# 4  <;> nextstate(main 679 optree_samples.t:166) v:>,<,%
+# 5  <0> padsv[$a:675,679] s
+# 6  <|> cond_expr(other->7) K/1
+# 7      <0> pushmark s
+# 8      <$> const[PV "foo"] s
+# 9      <@> print sK
+#            goto a
+# b  <0> enter 
+# c  <;> nextstate(main 677 optree_samples.t:167) v:>,<,%
+# d  <0> pushmark s
+# e  <$> const[PV "bar"] s
+# f  <@> print sK
+# g  <@> leave KP
+# a  <1> leavesub[1 ref] K/REFC,1
 EOT_EOT
 # 1  <;> nextstate(main 675 optree_samples.t:171) v:>,<,%
 # 2  <0> shift s*
-# 3  <0> padsv[$a:675,679] sRM*/LVINTRO
-# 4  <2> sassign vKS/2
-# 5  <;> nextstate(main 679 optree_samples.t:172) v:>,<,%
-# 6  <0> padsv[$a:675,679] s
-# 7  <|> cond_expr(other->8) K/1
-# 8      <0> pushmark s
-# 9      <$> const(PV "foo") s
-# a      <@> print sK
-#            goto b
-# c  <0> enter 
-# d  <;> nextstate(main 677 optree_samples.t:173) v:>,<,%
-# e  <0> pushmark s
-# f  <$> const(PV "bar") s
-# g  <@> print sK
-# h  <@> leave KP
-# b  <1> leavesub[1 ref] K/REFC,1
+# 3  <1> padsv_store[$a:1522,1529] vKS/LVINTRO
+# 4  <;> nextstate(main 679 optree_samples.t:172) v:>,<,%
+# 5  <0> padsv[$a:675,679] s
+# 6  <|> cond_expr(other->7) K/1
+# 7      <0> pushmark s
+# 8      <$> const(PV "foo") s
+# 9      <@> print sK
+#            goto a
+# b  <0> enter 
+# c  <;> nextstate(main 677 optree_samples.t:173) v:>,<,%
+# d  <0> pushmark s
+# e  <$> const(PV "bar") s
+# f  <@> print sK
+# g  <@> leave KP
+# a  <1> leavesub[1 ref] K/REFC,1
 EONT_EONT
 
 checkOptree ( name     => '-exec sub { print (shift) ? "foo" : "bar" }',
index a6dc206..6207ab6 100755 (executable)
@@ -53,7 +53,7 @@ checkOptree ( name    => 'BEGIN',
 # -        <;> ex-nextstate(Exporter::Heavy -1410 Heavy.pm:4) v:*,&,{,x*,x&,x$,$ ->4
 # -        <@> lineseq K ->-
 # 4           <;> nextstate(Exporter::Heavy -1410 Heavy.pm:4) :*,&,{,x*,x&,x$,$ ->5
-# 9           <1> entersub[t1] KRS*/TARG,STRICT ->a
+# 9           <1> entersub[t1] KRS/TARG,STRICT ->a
 # 5              <0> pushmark s ->6
 # 6              <$> const[PV "strict"] sM ->7
 # 7              <$> const[PV "refs"] sM ->8
@@ -67,7 +67,7 @@ checkOptree ( name    => 'BEGIN',
 # -        <;> ex-nextstate(Exporter::Heavy -1251 Heavy.pm:202) v:*,&,{,x*,x&,x$ ->e
 # -        <@> lineseq K ->-
 # e           <;> nextstate(Exporter::Heavy -1251 Heavy.pm:202) :*,&,{,x*,x&,x$ ->f
-# j           <1> entersub[t1] KRS*/TARG ->k
+# j           <1> entersub[t1] KRS/TARG ->k
 # f              <0> pushmark s ->g
 # g              <$> const[PV "warnings"] sM ->h
 # h              <$> const[PV "once"] sM ->i
@@ -92,7 +92,7 @@ checkOptree ( name    => 'BEGIN',
 # -        <;> ex-nextstate(B::Concise -1134 Concise.pm:183) v:*,&,x*,x&,x$,$ ->v
 # -        <@> lineseq K ->-
 # v           <;> nextstate(B::Concise -1134 Concise.pm:183) :*,&,x*,x&,x$,$ ->w
-# 10          <1> entersub[t1] KRS*/TARG,STRICT ->11
+# 10          <1> entersub[t1] KRS/TARG,STRICT ->11
 # w              <0> pushmark s ->x
 # x              <$> const[PV "strict"] sM ->y
 # y              <$> const[PV "refs"] sM ->z
@@ -106,7 +106,7 @@ checkOptree ( name  => 'BEGIN',
 # -        <;> ex-nextstate(B::Concise -1031 Concise.pm:305) v:*,&,x*,x&,x$,$ ->15
 # -        <@> lineseq K ->-
 # 15          <;> nextstate(B::Concise -1031 Concise.pm:305) :*,&,x*,x&,x$,$ ->16
-# 1a          <1> entersub[t1] KRS*/TARG,STRICT ->1b
+# 1a          <1> entersub[t1] KRS/TARG,STRICT ->1b
 # 16             <0> pushmark s ->17
 # 17             <$> const[PV "strict"] sM ->18
 # 18             <$> const[PV "refs"] sM ->19
@@ -120,7 +120,7 @@ checkOptree ( name  => 'BEGIN',
 # -        <;> ex-nextstate(B::Concise -984 Concise.pm:370) v:*,&,{,x*,x&,x$,$ ->1f
 # -        <@> lineseq K ->-
 # 1f          <;> nextstate(B::Concise -984 Concise.pm:370) :*,&,{,x*,x&,x$,$ ->1g
-# 1k          <1> entersub[t1] KRS*/TARG,STRICT ->1l
+# 1k          <1> entersub[t1] KRS/TARG,STRICT ->1l
 # 1g             <0> pushmark s ->1h
 # 1h             <$> const[PV "strict"] sM ->1i
 # 1i             <$> const[PV "refs"] sM ->1j
@@ -134,7 +134,7 @@ checkOptree ( name  => 'BEGIN',
 # -        <;> ex-nextstate(B::Concise -959 Concise.pm:390) v:*,&,x*,x&,x$,$ ->1p
 # -        <@> lineseq K ->-
 # 1p          <;> nextstate(B::Concise -959 Concise.pm:390) :*,&,x*,x&,x$,$ ->1q
-# 1u          <1> entersub[t1] KRS*/TARG,STRICT ->1v
+# 1u          <1> entersub[t1] KRS/TARG,STRICT ->1v
 # 1q             <0> pushmark s ->1r
 # 1r             <$> const[PV "strict"] sM ->1s
 # 1s             <$> const[PV "refs"] sM ->1t
@@ -148,7 +148,7 @@ checkOptree ( name  => 'BEGIN',
 # -        <;> ex-nextstate(B::Concise -945 Concise.pm:410) v:*,&,{,x*,x&,x$,$ ->1z
 # -        <@> lineseq K ->-
 # 1z          <;> nextstate(B::Concise -945 Concise.pm:410) :*,&,{,x*,x&,x$,$ ->20
-# 24          <1> entersub[t1] KRS*/TARG,STRICT ->25
+# 24          <1> entersub[t1] KRS/TARG,STRICT ->25
 # 20             <0> pushmark s ->21
 # 21             <$> const[PV "warnings"] sM ->22
 # 22             <$> const[PV "qw"] sM ->23
@@ -170,7 +170,7 @@ EOT_EOT
 # -        <;> ex-nextstate(Exporter::Heavy -1410 Heavy.pm:4) v:*,&,{,x*,x&,x$,$ ->4
 # -        <@> lineseq K ->-
 # 4           <;> nextstate(Exporter::Heavy -1410 Heavy.pm:4) :*,&,{,x*,x&,x$,$ ->5
-# 9           <1> entersub[t1] KRS*/TARG,STRICT ->a
+# 9           <1> entersub[t1] KRS/TARG,STRICT ->a
 # 5              <0> pushmark s ->6
 # 6              <$> const(PV "strict") sM ->7
 # 7              <$> const(PV "refs") sM ->8
@@ -184,7 +184,7 @@ EOT_EOT
 # -        <;> ex-nextstate(Exporter::Heavy -1251 Heavy.pm:202) v:*,&,{,x*,x&,x$ ->e
 # -        <@> lineseq K ->-
 # e           <;> nextstate(Exporter::Heavy -1251 Heavy.pm:202) :*,&,{,x*,x&,x$ ->f
-# j           <1> entersub[t1] KRS*/TARG ->k
+# j           <1> entersub[t1] KRS/TARG ->k
 # f              <0> pushmark s ->g
 # g              <$> const(PV "warnings") sM ->h
 # h              <$> const(PV "once") sM ->i
@@ -209,7 +209,7 @@ EOT_EOT
 # -        <;> ex-nextstate(B::Concise -1134 Concise.pm:183) v:*,&,x*,x&,x$,$ ->v
 # -        <@> lineseq K ->-
 # v           <;> nextstate(B::Concise -1134 Concise.pm:183) :*,&,x*,x&,x$,$ ->w
-# 10          <1> entersub[t1] KRS*/TARG,STRICT ->11
+# 10          <1> entersub[t1] KRS/TARG,STRICT ->11
 # w              <0> pushmark s ->x
 # x              <$> const(PV "strict") sM ->y
 # y              <$> const(PV "refs") sM ->z
@@ -223,7 +223,7 @@ EOT_EOT
 # -        <;> ex-nextstate(B::Concise -1031 Concise.pm:305) v:*,&,x*,x&,x$,$ ->15
 # -        <@> lineseq K ->-
 # 15          <;> nextstate(B::Concise -1031 Concise.pm:305) :*,&,x*,x&,x$,$ ->16
-# 1a          <1> entersub[t1] KRS*/TARG,STRICT ->1b
+# 1a          <1> entersub[t1] KRS/TARG,STRICT ->1b
 # 16             <0> pushmark s ->17
 # 17             <$> const(PV "strict") sM ->18
 # 18             <$> const(PV "refs") sM ->19
@@ -237,7 +237,7 @@ EOT_EOT
 # -        <;> ex-nextstate(B::Concise -984 Concise.pm:370) v:*,&,{,x*,x&,x$,$ ->1f
 # -        <@> lineseq K ->-
 # 1f          <;> nextstate(B::Concise -984 Concise.pm:370) :*,&,{,x*,x&,x$,$ ->1g
-# 1k          <1> entersub[t1] KRS*/TARG,STRICT ->1l
+# 1k          <1> entersub[t1] KRS/TARG,STRICT ->1l
 # 1g             <0> pushmark s ->1h
 # 1h             <$> const(PV "strict") sM ->1i
 # 1i             <$> const(PV "refs") sM ->1j
@@ -251,7 +251,7 @@ EOT_EOT
 # -        <;> ex-nextstate(B::Concise -959 Concise.pm:390) v:*,&,x*,x&,x$,$ ->1p
 # -        <@> lineseq K ->-
 # 1p          <;> nextstate(B::Concise -959 Concise.pm:390) :*,&,x*,x&,x$,$ ->1q
-# 1u          <1> entersub[t1] KRS*/TARG,STRICT ->1v
+# 1u          <1> entersub[t1] KRS/TARG,STRICT ->1v
 # 1q             <0> pushmark s ->1r
 # 1r             <$> const(PV "strict") sM ->1s
 # 1s             <$> const(PV "refs") sM ->1t
@@ -265,7 +265,7 @@ EOT_EOT
 # -        <;> ex-nextstate(B::Concise -945 Concise.pm:410) v:*,&,{,x*,x&,x$,$ ->1z
 # -        <@> lineseq K ->-
 # 1z          <;> nextstate(B::Concise -945 Concise.pm:410) :*,&,{,x*,x&,x$,$ ->20
-# 24          <1> entersub[t1] KRS*/TARG,STRICT ->25
+# 24          <1> entersub[t1] KRS/TARG,STRICT ->25
 # 20             <0> pushmark s ->21
 # 21             <$> const(PV "warnings") sM ->22
 # 22             <$> const(PV "qw") sM ->23
@@ -382,7 +382,7 @@ checkOptree ( name  => 'all of BEGIN END INIT CHECK UNITCHECK -exec',
 # 6  <$> const[PV "strict"] sM
 # 7  <$> const[PV "refs"] sM
 # 8  <.> method_named[PV "unimport"] 
-# 9  <1> entersub[t1] KRS*/TARG,STRICT
+# 9  <1> entersub[t1] KRS/TARG,STRICT
 # a  <1> leavesub[1 ref] K/REFC,1
 # BEGIN 2:
 # b  <;> nextstate(Exporter::Heavy -1251 Heavy.pm:202) v:*,&,{,x*,x&,x$
@@ -393,7 +393,7 @@ checkOptree ( name  => 'all of BEGIN END INIT CHECK UNITCHECK -exec',
 # g  <$> const[PV "warnings"] sM
 # h  <$> const[PV "once"] sM
 # i  <.> method_named[PV "unimport"] 
-# j  <1> entersub[t1] KRS*/TARG
+# j  <1> entersub[t1] KRS/TARG
 # k  <1> leavesub[1 ref] K/REFC,1
 # BEGIN 3:
 # l  <;> nextstate(B::Concise -1175 Concise.pm:117) v:*,&,{,x*,x&,x$,$
@@ -412,7 +412,7 @@ checkOptree ( name  => 'all of BEGIN END INIT CHECK UNITCHECK -exec',
 # x  <$> const[PV "strict"] sM
 # y  <$> const[PV "refs"] sM
 # z  <.> method_named[PV "unimport"] 
-# 10 <1> entersub[t1] KRS*/TARG,STRICT
+# 10 <1> entersub[t1] KRS/TARG,STRICT
 # 11 <1> leavesub[1 ref] K/REFC,1
 # BEGIN 5:
 # 12 <;> nextstate(B::Concise -1031 Concise.pm:305) v:*,&,x*,x&,x$,$
@@ -423,7 +423,7 @@ checkOptree ( name  => 'all of BEGIN END INIT CHECK UNITCHECK -exec',
 # 17 <$> const[PV "strict"] sM
 # 18 <$> const[PV "refs"] sM
 # 19 <.> method_named[PV "unimport"] 
-# 1a <1> entersub[t1] KRS*/TARG,STRICT
+# 1a <1> entersub[t1] KRS/TARG,STRICT
 # 1b <1> leavesub[1 ref] K/REFC,1
 # BEGIN 6:
 # 1c <;> nextstate(B::Concise -984 Concise.pm:370) v:*,&,{,x*,x&,x$,$
@@ -434,7 +434,7 @@ checkOptree ( name  => 'all of BEGIN END INIT CHECK UNITCHECK -exec',
 # 1h <$> const[PV "strict"] sM
 # 1i <$> const[PV "refs"] sM
 # 1j <.> method_named[PV "unimport"] 
-# 1k <1> entersub[t1] KRS*/TARG,STRICT
+# 1k <1> entersub[t1] KRS/TARG,STRICT
 # 1l <1> leavesub[1 ref] K/REFC,1
 # BEGIN 7:
 # 1m <;> nextstate(B::Concise -959 Concise.pm:390) v:*,&,x*,x&,x$,$
@@ -445,7 +445,7 @@ checkOptree ( name  => 'all of BEGIN END INIT CHECK UNITCHECK -exec',
 # 1r <$> const[PV "strict"] sM
 # 1s <$> const[PV "refs"] sM
 # 1t <.> method_named[PV "unimport"] 
-# 1u <1> entersub[t1] KRS*/TARG,STRICT
+# 1u <1> entersub[t1] KRS/TARG,STRICT
 # 1v <1> leavesub[1 ref] K/REFC,1
 # BEGIN 8:
 # 1w <;> nextstate(B::Concise -945 Concise.pm:410) v:*,&,{,x*,x&,x$,$
@@ -456,7 +456,7 @@ checkOptree ( name  => 'all of BEGIN END INIT CHECK UNITCHECK -exec',
 # 21 <$> const[PV "warnings"] sM
 # 22 <$> const[PV "qw"] sM
 # 23 <.> method_named[PV "unimport"] 
-# 24 <1> entersub[t1] KRS*/TARG,STRICT
+# 24 <1> entersub[t1] KRS/TARG,STRICT
 # 25 <1> leavesub[1 ref] K/REFC,1
 # BEGIN 9:
 # 26 <;> nextstate(main 3 -e:1) v:{
@@ -493,7 +493,7 @@ EOT_EOT
 # 6  <$> const(PV "strict") sM
 # 7  <$> const(PV "refs") sM
 # 8  <.> method_named(PV "unimport") 
-# 9  <1> entersub[t1] KRS*/TARG,STRICT
+# 9  <1> entersub[t1] KRS/TARG,STRICT
 # a  <1> leavesub[1 ref] K/REFC,1
 # BEGIN 2:
 # b  <;> nextstate(Exporter::Heavy -1251 Heavy.pm:202) v:*,&,{,x*,x&,x$
@@ -504,7 +504,7 @@ EOT_EOT
 # g  <$> const(PV "warnings") sM
 # h  <$> const(PV "once") sM
 # i  <.> method_named(PV "unimport") 
-# j  <1> entersub[t1] KRS*/TARG
+# j  <1> entersub[t1] KRS/TARG
 # k  <1> leavesub[1 ref] K/REFC,1
 # BEGIN 3:
 # l  <;> nextstate(B::Concise -1175 Concise.pm:117) v:*,&,{,x*,x&,x$,$
@@ -523,7 +523,7 @@ EOT_EOT
 # x  <$> const(PV "strict") sM
 # y  <$> const(PV "refs") sM
 # z  <.> method_named(PV "unimport") 
-# 10 <1> entersub[t1] KRS*/TARG,STRICT
+# 10 <1> entersub[t1] KRS/TARG,STRICT
 # 11 <1> leavesub[1 ref] K/REFC,1
 # BEGIN 5:
 # 12 <;> nextstate(B::Concise -1031 Concise.pm:305) v:*,&,x*,x&,x$,$
@@ -534,7 +534,7 @@ EOT_EOT
 # 17 <$> const(PV "strict") sM
 # 18 <$> const(PV "refs") sM
 # 19 <.> method_named(PV "unimport") 
-# 1a <1> entersub[t1] KRS*/TARG,STRICT
+# 1a <1> entersub[t1] KRS/TARG,STRICT
 # 1b <1> leavesub[1 ref] K/REFC,1
 # BEGIN 6:
 # 1c <;> nextstate(B::Concise -984 Concise.pm:370) v:*,&,{,x*,x&,x$,$
@@ -545,7 +545,7 @@ EOT_EOT
 # 1h <$> const(PV "strict") sM
 # 1i <$> const(PV "refs") sM
 # 1j <.> method_named(PV "unimport") 
-# 1k <1> entersub[t1] KRS*/TARG,STRICT
+# 1k <1> entersub[t1] KRS/TARG,STRICT
 # 1l <1> leavesub[1 ref] K/REFC,1
 # BEGIN 7:
 # 1m <;> nextstate(B::Concise -959 Concise.pm:390) v:*,&,x*,x&,x$,$
@@ -556,7 +556,7 @@ EOT_EOT
 # 1r <$> const(PV "strict") sM
 # 1s <$> const(PV "refs") sM
 # 1t <.> method_named(PV "unimport") 
-# 1u <1> entersub[t1] KRS*/TARG,STRICT
+# 1u <1> entersub[t1] KRS/TARG,STRICT
 # 1v <1> leavesub[1 ref] K/REFC,1
 # BEGIN 8:
 # 1w <;> nextstate(B::Concise -945 Concise.pm:410) v:*,&,{,x*,x&,x$,$
@@ -567,7 +567,7 @@ EOT_EOT
 # 21 <$> const(PV "warnings") sM
 # 22 <$> const(PV "qw") sM
 # 23 <.> method_named(PV "unimport") 
-# 24 <1> entersub[t1] KRS*/TARG,STRICT
+# 24 <1> entersub[t1] KRS/TARG,STRICT
 # 25 <1> leavesub[1 ref] K/REFC,1
 # BEGIN 9:
 # 26 <;> nextstate(main 3 -e:1) v:{
@@ -611,7 +611,7 @@ checkOptree ( name  => 'regression test for patch 25352',
 # 6  <$> const[PV "strict"] sM
 # 7  <$> const[PV "refs"] sM
 # 8  <.> method_named[PV "unimport"] 
-# 9  <1> entersub[t1] KRS*/TARG,STRICT
+# 9  <1> entersub[t1] KRS/TARG,STRICT
 # a  <1> leavesub[1 ref] K/REFC,1
 # BEGIN 2:
 # b  <;> nextstate(Exporter::Heavy -1251 Heavy.pm:202) v:*,&,{,x*,x&,x$
@@ -622,7 +622,7 @@ checkOptree ( name  => 'regression test for patch 25352',
 # g  <$> const[PV "warnings"] sM
 # h  <$> const[PV "once"] sM
 # i  <.> method_named[PV "unimport"] 
-# j  <1> entersub[t1] KRS*/TARG
+# j  <1> entersub[t1] KRS/TARG
 # k  <1> leavesub[1 ref] K/REFC,1
 # BEGIN 3:
 # l  <;> nextstate(B::Concise -1175 Concise.pm:117) v:*,&,{,x*,x&,x$,$
@@ -641,7 +641,7 @@ checkOptree ( name  => 'regression test for patch 25352',
 # x  <$> const[PV "strict"] sM
 # y  <$> const[PV "refs"] sM
 # z  <.> method_named[PV "unimport"] 
-# 10 <1> entersub[t1] KRS*/TARG,STRICT
+# 10 <1> entersub[t1] KRS/TARG,STRICT
 # 11 <1> leavesub[1 ref] K/REFC,1
 # BEGIN 5:
 # 12 <;> nextstate(B::Concise -1031 Concise.pm:305) v:*,&,x*,x&,x$,$
@@ -652,7 +652,7 @@ checkOptree ( name  => 'regression test for patch 25352',
 # 17 <$> const[PV "strict"] sM
 # 18 <$> const[PV "refs"] sM
 # 19 <.> method_named[PV "unimport"] 
-# 1a <1> entersub[t1] KRS*/TARG,STRICT
+# 1a <1> entersub[t1] KRS/TARG,STRICT
 # 1b <1> leavesub[1 ref] K/REFC,1
 # BEGIN 6:
 # 1c <;> nextstate(B::Concise -984 Concise.pm:370) v:*,&,{,x*,x&,x$,$
@@ -663,7 +663,7 @@ checkOptree ( name  => 'regression test for patch 25352',
 # 1h <$> const[PV "strict"] sM
 # 1i <$> const[PV "refs"] sM
 # 1j <.> method_named[PV "unimport"] 
-# 1k <1> entersub[t1] KRS*/TARG,STRICT
+# 1k <1> entersub[t1] KRS/TARG,STRICT
 # 1l <1> leavesub[1 ref] K/REFC,1
 # BEGIN 7:
 # 1m <;> nextstate(B::Concise -959 Concise.pm:390) v:*,&,x*,x&,x$,$
@@ -674,7 +674,7 @@ checkOptree ( name  => 'regression test for patch 25352',
 # 1r <$> const[PV "strict"] sM
 # 1s <$> const[PV "refs"] sM
 # 1t <.> method_named[PV "unimport"] 
-# 1u <1> entersub[t1] KRS*/TARG,STRICT
+# 1u <1> entersub[t1] KRS/TARG,STRICT
 # 1v <1> leavesub[1 ref] K/REFC,1
 # BEGIN 8:
 # 1w <;> nextstate(B::Concise -945 Concise.pm:410) v:*,&,{,x*,x&,x$,$
@@ -685,7 +685,7 @@ checkOptree ( name  => 'regression test for patch 25352',
 # 21 <$> const[PV "warnings"] sM
 # 22 <$> const[PV "qw"] sM
 # 23 <.> method_named[PV "unimport"] 
-# 24 <1> entersub[t1] KRS*/TARG,STRICT
+# 24 <1> entersub[t1] KRS/TARG,STRICT
 # 25 <1> leavesub[1 ref] K/REFC,1
 EOT_EOT
 # BEGIN 1:
@@ -697,7 +697,7 @@ EOT_EOT
 # 6  <$> const(PV "strict") sM
 # 7  <$> const(PV "refs") sM
 # 8  <.> method_named(PV "unimport") 
-# 9  <1> entersub[t1] KRS*/TARG,STRICT
+# 9  <1> entersub[t1] KRS/TARG,STRICT
 # a  <1> leavesub[1 ref] K/REFC,1
 # BEGIN 2:
 # b  <;> nextstate(Exporter::Heavy -1251 Heavy.pm:202) v:*,&,{,x*,x&,x$
@@ -708,7 +708,7 @@ EOT_EOT
 # g  <$> const(PV "warnings") sM
 # h  <$> const(PV "once") sM
 # i  <.> method_named(PV "unimport") 
-# j  <1> entersub[t1] KRS*/TARG
+# j  <1> entersub[t1] KRS/TARG
 # k  <1> leavesub[1 ref] K/REFC,1
 # BEGIN 3:
 # l  <;> nextstate(B::Concise -1175 Concise.pm:117) v:*,&,{,x*,x&,x$,$
@@ -727,7 +727,7 @@ EOT_EOT
 # x  <$> const(PV "strict") sM
 # y  <$> const(PV "refs") sM
 # z  <.> method_named(PV "unimport") 
-# 10 <1> entersub[t1] KRS*/TARG,STRICT
+# 10 <1> entersub[t1] KRS/TARG,STRICT
 # 11 <1> leavesub[1 ref] K/REFC,1
 # BEGIN 5:
 # 12 <;> nextstate(B::Concise -1031 Concise.pm:305) v:*,&,x*,x&,x$,$
@@ -738,7 +738,7 @@ EOT_EOT
 # 17 <$> const(PV "strict") sM
 # 18 <$> const(PV "refs") sM
 # 19 <.> method_named(PV "unimport") 
-# 1a <1> entersub[t1] KRS*/TARG,STRICT
+# 1a <1> entersub[t1] KRS/TARG,STRICT
 # 1b <1> leavesub[1 ref] K/REFC,1
 # BEGIN 6:
 # 1c <;> nextstate(B::Concise -984 Concise.pm:370) v:*,&,{,x*,x&,x$,$
@@ -749,7 +749,7 @@ EOT_EOT
 # 1h <$> const(PV "strict") sM
 # 1i <$> const(PV "refs") sM
 # 1j <.> method_named(PV "unimport") 
-# 1k <1> entersub[t1] KRS*/TARG,STRICT
+# 1k <1> entersub[t1] KRS/TARG,STRICT
 # 1l <1> leavesub[1 ref] K/REFC,1
 # BEGIN 7:
 # 1m <;> nextstate(B::Concise -959 Concise.pm:390) v:*,&,x*,x&,x$,$
@@ -760,7 +760,7 @@ EOT_EOT
 # 1r <$> const(PV "strict") sM
 # 1s <$> const(PV "refs") sM
 # 1t <.> method_named(PV "unimport") 
-# 1u <1> entersub[t1] KRS*/TARG,STRICT
+# 1u <1> entersub[t1] KRS/TARG,STRICT
 # 1v <1> leavesub[1 ref] K/REFC,1
 # BEGIN 8:
 # 1w <;> nextstate(B::Concise -945 Concise.pm:410) v:*,&,{,x*,x&,x$,$
@@ -771,6 +771,6 @@ EOT_EOT
 # 21 <$> const(PV "warnings") sM
 # 22 <$> const(PV "qw") sM
 # 23 <.> method_named(PV "unimport") 
-# 24 <1> entersub[t1] KRS*/TARG,STRICT
+# 24 <1> entersub[t1] KRS/TARG,STRICT
 # 25 <1> leavesub[1 ref] K/REFC,1
 EONT_EONT
index d89afc2..3931602 100755 (executable)
@@ -129,19 +129,19 @@ checkOptree ( name        => 'sub {my $a=undef}',
              bcopts    => '-basic',
              strip_open_hints => 1,
              expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
-5  <1> leavesub[1 ref] K/REFC,1 ->(end)
--     <@> lineseq KP ->5
-1        <;> nextstate(main 641 optree_varinit.t:130) v:>,<,% ->2
-4        <2> sassign sKS/2 ->5
-2           <0> undef s ->3
-3           <0> padsv[$a:641,642] sRM*/LVINTRO ->4
+3  <1> leavesub[1 ref] K/REFC,1 ->(end)
+-     <@> lineseq KP ->3
+1        <;> nextstate(main 1517 optree_varinit.t:128) v ->2
+-        <1> ex-sassign sKS/2 ->-
+2           <0> undef[$a:1517,1518] s/LVINTRO,KEEP_PV,TARGMY ->3
+-           <0> ex-padsv sRM*/LVINTRO ->-
 EOT_EOT
-# 5  <1> leavesub[1 ref] K/REFC,1 ->(end)
-# -     <@> lineseq KP ->5
-# 1        <;> nextstate(main 641 optree_varinit.t:130) v:>,<,% ->2
-# 4        <2> sassign sKS/2 ->5
-# 2           <0> undef s ->3
-# 3           <0> padsv[$a:641,642] sRM*/LVINTRO ->4
+# 3  <1> leavesub[1 ref] K/REFC,1 ->(end)
+# -     <@> lineseq KP ->3
+# 1        <;> nextstate(main 1517 optree_varinit.t:128) v ->2
+# -        <1> ex-sassign sKS/2 ->-
+# 2           <0> undef[$a:1517,1518] s/LVINTRO,KEEP_PV,TARGMY ->3
+# -           <0> ex-padsv sRM*/LVINTRO ->-
 EONT_EONT
 
 checkOptree ( name     => 'sub {our $a=undef}',
@@ -152,7 +152,7 @@ checkOptree ( name  => 'sub {our $a=undef}',
              expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
 5  <1> leavesub[1 ref] K/REFC,1 ->(end)
 -     <@> lineseq KP ->5
-1        <;> nextstate(main 26 optree.t:109) v:>,<,%,{ ->2
+1        <;> nextstate(main 1520 optree_varinit.t:148) v:{ ->2
 4        <2> sassign sKS/2 ->5
 2           <0> undef s ->3
 -           <1> ex-rv2sv sKRM*/OURINTR,1 ->4
@@ -160,7 +160,7 @@ checkOptree ( name  => 'sub {our $a=undef}',
 EOT_EOT
 # 5  <1> leavesub[1 ref] K/REFC,1 ->(end)
 # -     <@> lineseq KP ->5
-# 1        <;> nextstate(main 446 optree_varinit.t:137) v:>,<,%,{ ->2
+# 1        <;> nextstate(main 1520 optree_varinit.t:148) v:{ ->2
 # 4        <2> sassign sKS/2 ->5
 # 2           <0> undef s ->3
 # -           <1> ex-rv2sv sKRM*/OURINTR,1 ->4
@@ -175,7 +175,7 @@ checkOptree ( name  => 'sub {local $a=undef}',
              expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
 5  <1> leavesub[1 ref] K/REFC,1 ->(end)
 -     <@> lineseq KP ->5
-1        <;> nextstate(main 28 optree.t:122) v:>,<,%,{ ->2
+1        <;> nextstate(main 1523 optree_varinit.t:171) v:{ ->2
 4        <2> sassign sKS/2 ->5
 2           <0> undef s ->3
 -           <1> ex-rv2sv sKRM*/LVINTRO,1 ->4
@@ -183,7 +183,7 @@ checkOptree ( name  => 'sub {local $a=undef}',
 EOT_EOT
 # 5  <1> leavesub[1 ref] K/REFC,1 ->(end)
 # -     <@> lineseq KP ->5
-# 1        <;> nextstate(main 58 optree.t:141) v:>,<,%,{ ->2
+# 1        <;> nextstate(main 1523 optree_varinit.t:171) v:{ ->2
 # 4        <2> sassign sKS/2 ->5
 # 2           <0> undef s ->3
 # -           <1> ex-rv2sv sKRM*/LVINTRO,1 ->4
@@ -195,19 +195,19 @@ checkOptree ( name        => 'my $a=undef',
              bcopts    => '-basic',
              strip_open_hints => 1,
              expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
-6  <@> leave[1 ref] vKP/REFC ->(end)
+4  <@> leave[1 ref] vKP/REFC ->(end)
 1     <0> enter v ->2
-2     <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3
-5     <2> sassign vKS/2 ->6
-3        <0> undef s ->4
-4        <0> padsv[$a:1,2] sRM*/LVINTRO ->5
+2     <;> nextstate(main 1 -e:1) v:{ ->3
+-     <1> ex-sassign vKS/2 ->4
+3        <0> undef[$a:1,2] s/LVINTRO,KEEP_PV,TARGMY ->4
+-        <0> ex-padsv sRM*/LVINTRO ->-
 EOT_EOT
-# 6  <@> leave[1 ref] vKP/REFC ->(end)
+# 4  <@> leave[1 ref] vKP/REFC ->(end)
 # 1     <0> enter v ->2
-# 2     <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3
-# 5     <2> sassign vKS/2 ->6
-# 3        <0> undef s ->4
-# 4        <0> padsv[$a:1,2] sRM*/LVINTRO ->5
+# 2     <;> nextstate(main 1 -e:1) v:{ ->3
+# -     <1> ex-sassign vKS/2 ->4
+# 3        <0> undef[$a:1,2] s/LVINTRO,KEEP_PV,TARGMY ->4
+# -        <0> ex-padsv sRM*/LVINTRO ->-
 EONT_EONT
 
 checkOptree ( name     => 'our $a=undef',
@@ -218,7 +218,7 @@ checkOptree ( name  => 'our $a=undef',
              expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
 6  <@> leave[1 ref] vKP/REFC ->(end)
 1     <0> enter v ->2
-2     <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3
+2     <;> nextstate(main 1 -e:1) v:{ ->3
 5     <2> sassign vKS/2 ->6
 3        <0> undef s ->4
 -        <1> ex-rv2sv sKRM*/OURINTR,1 ->5
@@ -226,7 +226,7 @@ checkOptree ( name  => 'our $a=undef',
 EOT_EOT
 # 6  <@> leave[1 ref] vKP/REFC ->(end)
 # 1     <0> enter v ->2
-# 2     <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3
+# 2     <;> nextstate(main 1 -e:1) v:{ ->3
 # 5     <2> sassign vKS/2 ->6
 # 3        <0> undef s ->4
 # -        <1> ex-rv2sv sKRM*/OURINTR,1 ->5
@@ -242,7 +242,7 @@ checkOptree ( name  => 'local $c=undef',
              expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
 6  <@> leave[1 ref] vKP/REFC ->(end)
 1     <0> enter v ->2
-2     <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3
+2     <;> nextstate(main 1 -e:1) v:{ ->3
 5     <2> sassign vKS/2 ->6
 3        <0> undef s ->4
 -        <1> ex-rv2sv sKRM*/LVINTRO,1 ->5
@@ -250,7 +250,7 @@ checkOptree ( name  => 'local $c=undef',
 EOT_EOT
 # 6  <@> leave[1 ref] vKP/REFC ->(end)
 # 1     <0> enter v ->2
-# 2     <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3
+# 2     <;> nextstate(main 1 -e:1) v:{ ->3
 # 5     <2> sassign vKS/2 ->6
 # 3        <0> undef s ->4
 # -        <1> ex-rv2sv sKRM*/LVINTRO,1 ->5
@@ -264,15 +264,13 @@ checkOptree ( name        => 'sub {my $a=()}',
              expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
 1  <;> nextstate(main -439 optree.t:105) v:>,<,%
 2  <0> stub sP
-3  <0> padsv[$a:-439,-438] sRM*/LVINTRO
-4  <2> sassign sKS/2
-5  <1> leavesub[1 ref] K/REFC,1
+3  <1> padsv_store[$a:1516,1517] sKS/LVINTRO
+4  <1> leavesub[1 ref] K/REFC,1
 EOT_EOT
 # 1  <;> nextstate(main 438 optree_varinit.t:247) v:>,<,%
 # 2  <0> stub sP
-# 3  <0> padsv[$a:438,439] sRM*/LVINTRO
-# 4  <2> sassign sKS/2
-# 5  <1> leavesub[1 ref] K/REFC,1
+# 3  <1> padsv_store[$a:1516,1517] sKS/LVINTRO
+# 4  <1> leavesub[1 ref] K/REFC,1
 EONT_EONT
 
 checkOptree ( name     => 'sub {our $a=()}',
@@ -321,16 +319,14 @@ checkOptree ( name        => 'my $a=()',
 1  <0> enter v
 2  <;> nextstate(main 1 -e:1) v:>,<,%,{
 3  <0> stub sP
-4  <0> padsv[$a:1,2] sRM*/LVINTRO
-5  <2> sassign vKS/2
-6  <@> leave[1 ref] vKP/REFC
+4  <1> padsv_store[$a:1516,1517] vKS/LVINTRO
+5  <@> leave[1 ref] vKP/REFC
 EOT_EOT
 # 1  <0> enter v
 # 2  <;> nextstate(main 1 -e:1) v:>,<,%,{
 # 3  <0> stub sP
-# 4  <0> padsv[$a:1,2] sRM*/LVINTRO
-# 5  <2> sassign vKS/2
-# 6  <@> leave[1 ref] vKP/REFC
+# 4  <1> padsv_store[$a:1516,1517] vKS/LVINTRO
+# 5  <@> leave[1 ref] vKP/REFC
 EONT_EONT
 
 checkOptree ( name     => 'our $a=()',
index 68e6768..f539650 100644 (file)
@@ -3,7 +3,7 @@
 
 package Devel::Peek;
 
-$VERSION = '1.32';
+$VERSION = '1.33';
 $XS_VERSION = $VERSION;
 $VERSION = eval $VERSION;
 
index 6ad1087..d6267e1 100755 (executable)
@@ -392,7 +392,6 @@ do_test('reference to named subroutine without prototype',
       \\d+\\. $ADDR<\\d+> \\(\\d+,\\d+\\) "\\$dump2"
     OUTSIDE = $ADDR \\(MAIN\\)');
 
-if ($] >= 5.011) {
 # note the conditionals on ENGINE and INTFLAGS were introduced in 5.19.9
 do_test('reference to regexp',
         qr(tic),
@@ -406,14 +405,16 @@ do_test('reference to regexp',
     PV = $ADDR "\\(\\?\\^:tic\\)"
     CUR = 8
     LEN = 0
-    STASH = $ADDR\\t"Regexp"'
-. ($] < 5.013 ? '' :
-'
-    COMPFLAGS = 0x0 \(\)
-    EXTFLAGS = 0x680000 \(CHECK_ALL,USE_INTUIT_NOML,USE_INTUIT_ML\)
-(?:    ENGINE = $ADDR \(STANDARD\)
-)?    INTFLAGS = 0x0(?: \(\))?
+    STASH = $ADDR\\s+"Regexp"
+    COMPFLAGS = 0x0 \\(\\)
+    EXTFLAGS = 0x680000 \\(CHECK_ALL,USE_INTUIT_NOML,USE_INTUIT_ML\\)
+    ENGINE = $ADDR \\(STANDARD\\)
+    INTFLAGS = 0x0 \\(\\)
     NPARENS = 0
+    LOGICAL_NPARENS = 0
+    LOGICAL_TO_PARNO = 0x0
+    PARNO_TO_LOGICAL = 0x0
+    PARNO_TO_LOGICAL_NEXT = 0x0
     LASTPAREN = 0
     LASTCLOSEPAREN = 0
     MINLEN = 3
@@ -424,20 +425,29 @@ do_test('reference to regexp',
     SUBOFFSET = 0
     SUBCOFFSET = 0
     SUBBEG = 0x0
-(?:    ENGINE = $ADDR
-)?    MOTHER_RE = $ADDR'
-. ($] < 5.019003 ? '' : '
-    SV = REGEXP\($ADDR\) at $ADDR
+    PAREN_NAMES = 0x0
+    SUBSTRS = $ADDR
+    PPRIVATE = $ADDR
+    OFFS = $ADDR
+      \\[ 0:0 \\]
+    QR_ANONCV = 0x0
+    SAVED_COPY = 0x0
+    MOTHER_RE = $ADDR
+    SV = REGEXP\\($ADDR\\) at $ADDR
       REFCNT = 2
-      FLAGS = \(POK,pPOK\)
-      PV = $ADDR "\(\?\^:tic\)"
+      FLAGS = \\(POK,pPOK\\)
+      PV = $ADDR "\\(\\?\\^:tic\\)"
       CUR = 8
-      LEN = \d+
-      COMPFLAGS = 0x0 \(\)
-      EXTFLAGS = 0x680000 \(CHECK_ALL,USE_INTUIT_NOML,USE_INTUIT_ML\)
-(?:      ENGINE = $ADDR \(STANDARD\)
-)?      INTFLAGS = 0x0(?: \(\))?
+      LEN = \\d+
+      COMPFLAGS = 0x0 \\(\\)
+      EXTFLAGS = 0x680000 \\(CHECK_ALL,USE_INTUIT_NOML,USE_INTUIT_ML\\)
+      ENGINE = $ADDR \\(STANDARD\\)
+      INTFLAGS = 0x0 \\(\\)
       NPARENS = 0
+      LOGICAL_NPARENS = 0
+      LOGICAL_TO_PARNO = 0x0
+      PARNO_TO_LOGICAL = 0x0
+      PARNO_TO_LOGICAL_NEXT = 0x0
       LASTPAREN = 0
       LASTCLOSEPAREN = 0
       MINLEN = 3
@@ -448,42 +458,15 @@ do_test('reference to regexp',
       SUBOFFSET = 0
       SUBCOFFSET = 0
       SUBBEG = 0x0
-(?:    ENGINE = $ADDR
-)?      MOTHER_RE = 0x0
       PAREN_NAMES = 0x0
       SUBSTRS = $ADDR
       PPRIVATE = $ADDR
       OFFS = $ADDR
-      QR_ANONCV = 0x0(?:
-      SAVED_COPY = 0x0)?') . '
-    PAREN_NAMES = 0x0
-    SUBSTRS = $ADDR
-    PPRIVATE = $ADDR
-    OFFS = $ADDR
-    QR_ANONCV = 0x0(?:
-    SAVED_COPY = 0x0)?'
-));
-} else {
-do_test('reference to regexp',
-        qr(tic),
-'SV = $RV\\($ADDR\\) at $ADDR
-  REFCNT = 1
-  FLAGS = \\(ROK\\)
-  RV = $ADDR
-  SV = PVMG\\($ADDR\\) at $ADDR
-    REFCNT = 1
-    FLAGS = \\(OBJECT,SMG\\)
-    IV = 0
-    NV = 0
-    PV = 0
-    MAGIC = $ADDR
-      MG_VIRTUAL = $ADDR
-      MG_TYPE = PERL_MAGIC_qr\(r\)
-      MG_OBJ = $ADDR
-        PAT = "\(\?^:tic\)"
-        REFCNT = 2
-    STASH = $ADDR\\t"Regexp"');
-}
+        \\[ 0:0 \\]
+      QR_ANONCV = 0x0
+      SAVED_COPY = 0x0
+      MOTHER_RE = 0x0
+');
 
 do_test('reference to blessed hash',
         (bless {}, "Tac"),
@@ -1200,22 +1183,26 @@ unless ($Config{useithreads}) {
 # note the conditionals on ENGINE and INTFLAGS were introduced in 5.19.9
 do_test('UTF-8 in a regular expression',
         qr/\x{100}/,
-'SV = IV\($ADDR\) at $ADDR
+'SV = IV\\($ADDR\\) at $ADDR
   REFCNT = 1
-  FLAGS = \(ROK\)
+  FLAGS = \\(ROK\\)
   RV = $ADDR
-  SV = REGEXP\($ADDR\) at $ADDR
+  SV = REGEXP\\($ADDR\\) at $ADDR
     REFCNT = 1
     FLAGS = \(OBJECT,POK,FAKE,pPOK,UTF8\)
-    PV = $ADDR "\(\?\^u:\\\\\\\\x\{100\}\)" \[UTF8 "\(\?\^u:\\\\\\\\x\{100\}\)"\]
+    PV = $ADDR "\\(\\?\\^u:\\\\\\\\x\\{100\\}\\)" \\[UTF8 "\\(\\?\\^u:\\\\\\\\x\\{100\\}\\)"\\]
     CUR = 13
     LEN = 0
-    STASH = $ADDR      "Regexp"
-    COMPFLAGS = 0x0 \(\)
-    EXTFLAGS = $ADDR \(CHECK_ALL,USE_INTUIT_NOML,USE_INTUIT_ML\)
-(?:    ENGINE = $ADDR \(STANDARD\)
-)?    INTFLAGS = 0x0(?: \(\))?
+    STASH = $ADDR\\s+"Regexp"
+    COMPFLAGS = 0x0 \\(\\)
+    EXTFLAGS = $ADDR \\(CHECK_ALL,USE_INTUIT_NOML,USE_INTUIT_ML\\)
+(?:    ENGINE = $ADDR \\(STANDARD\\)
+)?    INTFLAGS = 0x0(?: \\(\\))?
     NPARENS = 0
+    LOGICAL_NPARENS = 0
+    LOGICAL_TO_PARNO = 0x0
+    PARNO_TO_LOGICAL = 0x0
+    PARNO_TO_LOGICAL_NEXT = 0x0
     LASTPAREN = 0
     LASTCLOSEPAREN = 0
     MINLEN = 1
@@ -1226,20 +1213,29 @@ do_test('UTF-8 in a regular expression',
     SUBOFFSET = 0
     SUBCOFFSET = 0
     SUBBEG = 0x0
-(?:    ENGINE = $ADDR
-)?    MOTHER_RE = $ADDR'
-. ($] < 5.019003 ? '' : '
-    SV = REGEXP\($ADDR\) at $ADDR
+    PAREN_NAMES = 0x0
+    SUBSTRS = $ADDR
+    PPRIVATE = $ADDR
+    OFFS = $ADDR
+      \\[ 0:0 \\]
+    QR_ANONCV = 0x0
+    SAVED_COPY = 0x0
+    MOTHER_RE = $ADDR
+    SV = REGEXP\\($ADDR\\) at $ADDR
       REFCNT = 2
-      FLAGS = \(POK,pPOK,UTF8\)
-      PV = $ADDR "\(\?\^u:\\\\\\\\x\{100\}\)" \[UTF8 "\(\?\^u:\\\\\\\\x\{100\}\)"\]
+      FLAGS = \\(POK,pPOK,UTF8\\)
+      PV = $ADDR "\\(\\?\\^u:\\\\\\\\x\\{100\\}\\)" \\[UTF8 "\\(\\?\\^u:\\\\\\\\x\\{100\\}\\)"\\]
       CUR = 13
-      LEN = \d+
-      COMPFLAGS = 0x0 \(\)
-      EXTFLAGS = $ADDR \(CHECK_ALL,USE_INTUIT_NOML,USE_INTUIT_ML\)
-(?:      ENGINE = $ADDR \(STANDARD\)
-)?      INTFLAGS = 0x0(?: \(\))?
+      LEN = \\d+
+      COMPFLAGS = 0x0 \\(\\)
+      EXTFLAGS = 0x680100 \\(CHECK_ALL,USE_INTUIT_NOML,USE_INTUIT_ML\\)
+      ENGINE = $ADDR \\(STANDARD\\)
+      INTFLAGS = 0x0 \\(\\)
       NPARENS = 0
+      LOGICAL_NPARENS = 0
+      LOGICAL_TO_PARNO = 0x0
+      PARNO_TO_LOGICAL = 0x0
+      PARNO_TO_LOGICAL_NEXT = 0x0
       LASTPAREN = 0
       LASTCLOSEPAREN = 0
       MINLEN = 1
@@ -1250,22 +1246,98 @@ do_test('UTF-8 in a regular expression',
       SUBOFFSET = 0
       SUBCOFFSET = 0
       SUBBEG = 0x0
-(?:    ENGINE = $ADDR
-)?      MOTHER_RE = 0x0
       PAREN_NAMES = 0x0
       SUBSTRS = $ADDR
       PPRIVATE = $ADDR
       OFFS = $ADDR
-      QR_ANONCV = 0x0(?:
-      SAVED_COPY = 0x0)?') . '
+        \\[ 0:0 \\]
+      QR_ANONCV = 0x0
+      SAVED_COPY = 0x0
+      MOTHER_RE = 0x0
+');
+
+do_test('Branch Reset regexp',
+        qr/(?|(foo)|(bar))(?|(baz)|(bop))/,
+'SV = IV\\($ADDR\\) at $ADDR
+  REFCNT = 1
+  FLAGS = \\(ROK\\)
+  RV = $ADDR
+  SV = REGEXP\\($ADDR\\) at $ADDR
+    REFCNT = 1
+    FLAGS = \\(OBJECT,POK,FAKE,pPOK\\)
+    PV = $ADDR "\\(\\?\\^:\\(\\?\\|\\(foo\\)\\|\\(bar\\)\\)\\(\\?\\|\\(baz\\)\\|\\(bop\\)\\)\\)"
+    CUR = 35
+    LEN = 0
+    STASH = $ADDR\\s+"Regexp"
+    COMPFLAGS = 0x0 \\(\\)
+    EXTFLAGS = 0x0 \\(\\)
+    ENGINE = $ADDR \\(STANDARD\\)
+    INTFLAGS = 0x0 \\(\\)
+    NPARENS = 4
+    LOGICAL_NPARENS = 2
+    LOGICAL_TO_PARNO = $ADDR
+      \\{ 0, 1, 3 \\}
+    PARNO_TO_LOGICAL = $ADDR
+      \\{ 0, 1, 1, 2, 2 \\}
+    PARNO_TO_LOGICAL_NEXT = $ADDR
+      \\{ 0, 2, 0, 4, 0 \\}
+    LASTPAREN = 0
+    LASTCLOSEPAREN = 0
+    MINLEN = 6
+    MINLENRET = 6
+    GOFS = 0
+    PRE_PREFIX = 4
+    SUBLEN = 0
+    SUBOFFSET = 0
+    SUBCOFFSET = 0
+    SUBBEG = 0x0
     PAREN_NAMES = 0x0
     SUBSTRS = $ADDR
     PPRIVATE = $ADDR
     OFFS = $ADDR
-    QR_ANONCV = 0x0(?:
-    SAVED_COPY = 0x0)?
+      \\[ 0:0, 0:0, 0:0, 0:0, 0:0 \\]
+    QR_ANONCV = 0x0
+    SAVED_COPY = 0x0
+    MOTHER_RE = $ADDR
+    SV = REGEXP\\($ADDR\\) at $ADDR
+      REFCNT = 2
+      FLAGS = \\(POK,pPOK\\)
+      PV = $ADDR "\\(\\?\\^:\\(\\?\\|\\(foo\\)\\|\\(bar\\)\\)\\(\\?\\|\\(baz\\)\\|\\(bop\\)\\)\\)"
+      CUR = 35
+      LEN = \\d+
+      COMPFLAGS = 0x0 \\(\\)
+      EXTFLAGS = 0x0 \\(\\)
+      ENGINE = $ADDR \\(STANDARD\\)
+      INTFLAGS = 0x0 \\(\\)
+      NPARENS = 4
+      LOGICAL_NPARENS = 2
+      LOGICAL_TO_PARNO = $ADDR
+        \\{ 0, 1, 3 \\}
+      PARNO_TO_LOGICAL = $ADDR
+        \\{ 0, 1, 1, 2, 2 \\}
+      PARNO_TO_LOGICAL_NEXT = $ADDR
+        \\{ 0, 2, 0, 4, 0 \\}
+      LASTPAREN = 0
+      LASTCLOSEPAREN = 0
+      MINLEN = 6
+      MINLENRET = 6
+      GOFS = 0
+      PRE_PREFIX = 4
+      SUBLEN = 0
+      SUBOFFSET = 0
+      SUBCOFFSET = 0
+      SUBBEG = 0x0
+      PAREN_NAMES = 0x0
+      SUBSTRS = $ADDR
+      PPRIVATE = $ADDR
+      OFFS = $ADDR
+        \\[ 0:0, 0:0, 0:0, 0:0, 0:0 \\]
+      QR_ANONCV = 0x0
+      SAVED_COPY = 0x0
+      MOTHER_RE = 0x0
 ');
 
+
 { # perl #117793: Extend SvREFCNT* to work on any perl variable type
   my %hash;
   my $base_count = Devel::Peek::SvREFCNT(%hash);
@@ -1516,6 +1588,7 @@ dumpindent is 4 at -e line 1.
      |   FLAGS = (VOID,SLABBED,MORESIB)
      |   LINE = 1
      |   PACKAGE = "t"
+     |   HINTS = 00000100
      |     |   
 5    +--entersub UNOP(0xNNN) ===> 1 [leave 0xNNN]
          TARG = 1
index 93a858a..f428472 100644 (file)
@@ -90,7 +90,7 @@ package DynaLoader;
 # Tim.Bunce@ig.co.uk, August 1994
 
 BEGIN {
-    our $VERSION = '1.52';
+    our $VERSION = '1.54';
 }
 
 # Note: in almost any other piece of code "our" would have been a better
index 38a3840..716c6ea 100644 (file)
@@ -104,7 +104,7 @@ static void TranslateError
     sv_setpv(MY_CXT.x_dl_last_error, error);
 }
 
-static char *dlopen(char *path, int mode /* mode is ignored */)
+static char *dlopen(char *path)
 {
     int dyld_result;
     NSObjectFileImage ofile;
@@ -159,13 +159,11 @@ void *
 dl_load_file(filename, flags=0)
     char *     filename
     int                flags
-    PREINIT:
-    int mode = 1;
     CODE:
     DLDEBUG(1,PerlIO_printf(Perl_debug_log, "dl_load_file(%s,%x):\n", filename,flags));
     if (flags & 0x01)
        Perl_warn(aTHX_ "Can't make loaded symbols global on this platform while loading %s",filename);
-    RETVAL = dlopen(filename, mode) ;
+    RETVAL = dlopen(filename);
     DLDEBUG(2,PerlIO_printf(Perl_debug_log, " libref=%x\n", RETVAL));
     ST(0) = sv_newmortal() ;
     if (RETVAL == NULL)
index b076f21..32249c9 100644 (file)
@@ -188,7 +188,7 @@ void
 dl_install_xsub(perl_name, symref, filename="$Package")
     char *             perl_name
     void *             symref 
-    char *             filename
+    const char *       filename
     CODE:
     DLDEBUG(2,PerlIO_printf(Perl_debug_log,"dl_install_xsub(name=%s, symref=%x)\n",
                      perl_name, symref));
index ee2f4a3..ae647d5 100644 (file)
@@ -2,7 +2,7 @@ use ExtUtils::MakeMaker;
 use Config;
 use strict;
 
-our $VERSION = "1.36";
+our $VERSION = "1.37";
 
 my %err = ();
 
@@ -18,18 +18,11 @@ if ($Config{gccversion} ne '' && $^O eq 'MSWin32') {
     # MinGW complains "warning: #pragma system_header ignored outside include
     # file" if the header files are processed individually, so include them
     # all in .c file and process that instead.
-    my %seen;
     open INCS, '>', 'includes.c' or
        die "Cannot open includes.c";
     foreach $file (@files) {
        next if $file eq 'errno.c';
        next unless -f $file;
-       if ( $file eq 'avx512vpopcntdqvlintrin.h' || $file eq 'avx512bwintrin.h' ) {
-               # "Never use <avx512bwintrin.h> directly; include <immintrin.h> instead."
-               # "Never use <avx512vpopcntdqvlintrin.h> directly; include <immintrin.h> instead."
-               $file = 'immintrin.h';
-       }
-       next if ++$seen{$file} > 1;
        print INCS qq[#include "$file"\n];
     }
     close INCS;
@@ -114,7 +107,7 @@ sub default_cpp {
 }
 
 sub get_files {
-    my %file = ();
+    my @file;
     # When cross-compiling we may store a path for gcc's "sysroot" option:
     my $sysroot = $Config{sysroot} || '';
     my $linux_errno_h;
@@ -128,19 +121,19 @@ sub get_files {
 
     # VMS keeps its include files in system libraries
     if ($^O eq 'VMS') {
-       $file{'Sys$Library:DECC$RTLDEF.TLB'} = 1;
+       push(@file, 'Sys$Library:DECC$RTLDEF.TLB');
     } elsif ($^O eq 'os390') {
        # OS/390 C compiler doesn't generate #file or #line directives
         # and it does not tag the header as 1047 (EBCDIC), so make a local
         # copy and tag it
         my $cp = `cp /usr/include/errno.h ./errno.h`;
         my $chtag = `chtag -t -cIBM-1047 ./errno.h`;
-       $file{'./errno.h'} = 1;
+       push(@file, './errno.h');
     } elsif ($Config{archname} eq 'arm-riscos') {
        # Watch out for cross compiling for RISC OS
        my $dep = `echo "#include <errno.h>" | gcc -E -M -`;
        if ($dep =~ /(\S+errno\.h)/) {
-            $file{$1} = 1;
+            push(@file, $1);
        }
     } elsif ($^O eq 'linux' &&
              $Config{gccversion} ne '' && 
@@ -148,14 +141,14 @@ sub get_files {
              # might be using, say, Intel's icc
              $linux_errno_h
             ) {
-       $file{$linux_errno_h} = 1;
+       push(@file, $linux_errno_h);
     } elsif ($^O eq 'haiku') {
        # hidden in a special place
-       $file{'/boot/system/develop/headers/posix/errno.h'} = 1;
+       push(@file, '/boot/system/develop/headers/posix/errno.h');
 
     } elsif ($^O eq 'vos') {
        # avoid problem where cpp returns non-POSIX pathnames
-       $file{'/system/include_library/errno.h'} = 1;
+       push(@file, '/system/include_library/errno.h');
     } else {
        open(CPPI, '>', 'errno.c') or
            die "Cannot open errno.c";
@@ -183,16 +176,28 @@ sub get_files {
                if (/$pat/o) {
                   my $f = $1;
                   $f =~ s,\\\\,/,g;
-                  $file{$f} = 1;
+                  push(@file, $f);
                }
            }
            else {
-               $file{$1} = 1 if /$pat/o;
+               push(@file, $1) if /$pat/o;
            }
        }
        close(CPPO);
     }
-    return keys %file;
+    return uniq(@file);
+}
+
+# 
+#
+sub uniq
+{
+       # At this point List::Util::uniq appears not to be usable so
+       # roll our own.
+       #
+       # Returns a list with unique values, while keeping the order
+       #
+       return do { my %seen; grep { !$seen{$_}++ } @_ };
 }
 
 sub write_errno_pm {
@@ -364,7 +369,7 @@ ESQ
 
     if ($IsMSWin32) {
        print "    WINSOCK => [qw(\n";
-       $k = join(" ", grep { /^WSAE/ } keys %err);
+       $k = join(" ", grep { /^WSAE/ } sort keys %err);
        $k =~ s/(.{50,70})\s/$1\n\t/g;
        print "\t",$k,"\n    )],\n";
     }
index e90b4ae..18627f8 100644 (file)
@@ -5,7 +5,7 @@ use Exporter 'import';
 use ExtUtils::Embed 1.31, qw(xsi_header xsi_protos xsi_body);
 
 our @EXPORT = qw(writemain);
-our $VERSION = '1.11';
+our $VERSION = '1.13';
 
 # blead will run this with miniperl, hence we can't use autodie or File::Temp
 my $temp;
@@ -99,9 +99,6 @@ main(int argc, char **argv, char **env)
 #ifndef NO_ENV_ARRAY_IN_MAIN
     PERL_UNUSED_ARG(env);
 #endif
-#ifndef PERL_USE_SAFE_PUTENV
-    PL_use_safe_putenv = FALSE;
-#endif /* PERL_USE_SAFE_PUTENV */
 
     /* if user wants control of gprof profiling off by default */
     /* noop unless Configure is given -Accflags=-DPERL_GPROF_CONTROL */
@@ -138,8 +135,29 @@ main(int argc, char **argv, char **env)
        PL_perl_destruct_level = 0;
     }
     PL_exit_flags |= PERL_EXIT_DESTRUCT_END;
-    if (!perl_parse(my_perl, xs_init, argc, argv, (char **)NULL))
+    if (!perl_parse(my_perl, xs_init, argc, argv, (char **)NULL)) {
+
+        /* perl_parse() may end up starting its own run loops, which
+         * might end up "leaking" PL_restartop from the parse phase into
+         * the run phase which then ends up confusing run_body(). This
+         * leakage shouldn't happen and if it does its a bug.
+         *
+         * Note we do not do this assert in perl_run() or perl_parse()
+         * as there are modules out there which explicitly set
+         * PL_restartop before calling perl_run() directly from XS code
+         * (Coro), and it is conceivable PL_restartop could be set prior
+         * to calling perl_parse() by XS code as well.
+         *
+         * What we want to check is that the top level perl_parse(),
+         * perl_run() pairing does not allow a leaking PL_restartop, as
+         * that indicates a bug in perl. By putting the assert here we
+         * can validate that Perl itself is operating correctly without
+         * risking breakage to XS code under DEBUGGING. - Yves
+         */
+        assert(!PL_restartop);
+
         perl_run(my_perl);
+    }
 
 #ifndef PERL_MICRO
     /* Unregister our signal handler before destroying my_perl */
@@ -154,19 +172,6 @@ main(int argc, char **argv, char **env)
 
     perl_free(my_perl);
 
-#if defined(USE_ENVIRON_ARRAY) && defined(PERL_TRACK_MEMPOOL) && !defined(NO_ENV_ARRAY_IN_MAIN)
-    /*
-     * The old environment may have been freed by perl_free()
-     * when PERL_TRACK_MEMPOOL is defined, but without having
-     * been restored by perl_destruct() before (this is only
-     * done if destruct_level > 0).
-     *
-     * It is important to have a valid environment for atexit()
-     * routines that are eventually called.
-     */
-    environ = env;
-#endif
-
     PERL_SYS_TERM();
 
     exit(exitstatus);
index ae58d00..a41a6f5 100644 (file)
@@ -3,7 +3,7 @@ use 5.006;
 use strict;
 use warnings;
 use warnings::register;
-our $VERSION = '1.40';
+our $VERSION = '1.43';
 use Exporter 'import';
 require Cwd;
 
@@ -43,25 +43,35 @@ sub contract_name {
     return $abs_name;
 }
 
+sub _is_absolute {
+    return $_[0] =~ m|^(?:[A-Za-z]:)?/| if $Is_Win32;
+    return substr($_[0], 0, 1) eq '/';
+}
+
+sub _is_root {
+    return $_[0] =~ m|^(?:[A-Za-z]:)?/\z| if $Is_Win32;
+    return $_[0] eq '/';
+}
+
 sub PathCombine($$) {
     my ($Base,$Name) = @_;
     my $AbsName;
 
-    if (substr($Name,0,1) eq '/') {
-       $AbsName= $Name;
+    if (_is_absolute($Name)) {
+        $AbsName= $Name;
     }
     else {
-       $AbsName= contract_name($Base,$Name);
+        $AbsName= contract_name($Base,$Name);
     }
 
     # (simple) check for recursion
     my $newlen= length($AbsName);
     if ($newlen <= length($Base)) {
-       if (($newlen == length($Base) || substr($Base,$newlen,1) eq '/')
-           && $AbsName eq substr($Base,0,$newlen))
-       {
-           return undef;
-       }
+        if (($newlen == length($Base) || substr($Base,$newlen,1) eq '/')
+            && $AbsName eq substr($Base,0,$newlen))
+        {
+            return undef;
+        }
     }
     return $AbsName;
 }
@@ -73,37 +83,40 @@ sub Follow_SymLink($) {
     ($DEV, $INO)= lstat $AbsName;
 
     while (-l _) {
-       if ($SLnkSeen{$DEV, $INO}++) {
-           if ($follow_skip < 2) {
-               die "$AbsName is encountered a second time";
-           }
-           else {
-               return undef;
-           }
-       }
-       $NewName= PathCombine($AbsName, readlink($AbsName));
-       unless(defined $NewName) {
-           if ($follow_skip < 2) {
-               die "$AbsName is a recursive symbolic link";
-           }
-           else {
-               return undef;
-           }
-       }
-       else {
-           $AbsName= $NewName;
-       }
-       ($DEV, $INO) = lstat($AbsName);
-       return undef unless defined $DEV;  #  dangling symbolic link
+        if ($SLnkSeen{$DEV, $INO}++) {
+            if ($follow_skip < 2) {
+                die "$AbsName is encountered a second time";
+            }
+            else {
+                return undef;
+            }
+        }
+        my $Link = readlink($AbsName);
+        # canonicalize directory separators
+        $Link =~ s|\\|/|g if $Is_Win32;
+        $NewName= PathCombine($AbsName, $Link);
+        unless(defined $NewName) {
+            if ($follow_skip < 2) {
+                die "$AbsName is a recursive symbolic link";
+            }
+            else {
+                return undef;
+            }
+        }
+        else {
+            $AbsName= $NewName;
+        }
+        ($DEV, $INO) = lstat($AbsName);
+        return undef unless defined $DEV;  #  dangling symbolic link
     }
 
     if ($full_check && defined $DEV && $SLnkSeen{$DEV, $INO}++) {
-       if ( ($follow_skip < 1) || ((-d _) && ($follow_skip < 2)) ) {
-           die "$AbsName encountered a second time";
-       }
-       else {
-           return undef;
-       }
+        if ( ($follow_skip < 1) || ((-d _) && ($follow_skip < 2)) ) {
+            die "$AbsName encountered a second time";
+        }
+        else {
+            return undef;
+        }
     }
 
     return $AbsName;
@@ -123,6 +136,7 @@ sub is_tainted_pp {
     return length($@) != 0;
 }
 
+
 sub _find_opt {
     my $wanted = shift;
     return unless @_;
@@ -133,25 +147,25 @@ sub _find_opt {
 
     local %SLnkSeen;
     local ($wanted_callback, $avoid_nlink, $bydepth, $no_chdir, $follow,
-       $follow_skip, $full_check, $untaint, $untaint_skip, $untaint_pat,
-       $pre_process, $post_process, $dangling_symlinks);
+        $follow_skip, $full_check, $untaint, $untaint_skip, $untaint_pat,
+        $pre_process, $post_process, $dangling_symlinks);
     local($dir, $name, $fullname, $prune);
     local *_ = \my $a;
 
     my $cwd            = $wanted->{bydepth} ? Cwd::fastcwd() : Cwd::getcwd();
     if ($Is_VMS) {
-       # VMS returns this by default in VMS format which just doesn't
-       # work for the rest of this module.
-       $cwd = VMS::Filespec::unixpath($cwd);
-
-       # Apparently this is not expected to have a trailing space.
-       # To attempt to make VMS/UNIX conversions mostly reversible,
-       # a trailing slash is needed.  The run-time functions ignore the
-       # resulting double slash, but it causes the perl tests to fail.
+        # VMS returns this by default in VMS format which just doesn't
+        # work for the rest of this module.
+        $cwd = VMS::Filespec::unixpath($cwd);
+
+        # Apparently this is not expected to have a trailing space.
+        # To attempt to make VMS/UNIX conversions mostly reversible,
+        # a trailing slash is needed.  The run-time functions ignore the
+        # resulting double slash, but it causes the perl tests to fail.
         $cwd =~ s#/\z##;
 
-       # This comes up in upper case now, but should be lower.
-       # In the future this could be exact case, no need to change.
+        # This comes up in upper case now, but should be lower.
+        # In the future this could be exact case, no need to change.
     }
     my $cwd_untainted  = $cwd;
     my $check_t_cwd    = 1;
@@ -178,109 +192,107 @@ sub _find_opt {
 
     Proc_Top_Item:
     foreach my $TOP (@_) {
-       my $top_item = $TOP;
-       $top_item = VMS::Filespec::unixify($top_item) if $Is_VMS;
-
-       ($topdev,$topino,$topmode,$topnlink) = $follow ? stat $top_item : lstat $top_item;
-
-       if ($Is_Win32) {
-           $top_item =~ s|[/\\]\z||
-             unless $top_item =~ m{^(?:\w:)?[/\\]$};
-       }
-       else {
-           $top_item =~ s|/\z|| unless $top_item eq '/';
-       }
-
-       $Is_Dir= 0;
-
-       if ($follow) {
-
-           if (substr($top_item,0,1) eq '/') {
-               $abs_dir = $top_item;
-           }
-           elsif ($top_item eq $File::Find::current_dir) {
-               $abs_dir = $cwd;
-           }
-           else {  # care about any  ../
-               $top_item =~ s/\.dir\z//i if $Is_VMS;
-               $abs_dir = contract_name("$cwd/",$top_item);
-           }
-           $abs_dir= Follow_SymLink($abs_dir);
-           unless (defined $abs_dir) {
-               if ($dangling_symlinks) {
-                   if (ref $dangling_symlinks eq 'CODE') {
-                       $dangling_symlinks->($top_item, $cwd);
-                   } else {
-                       warnings::warnif "$top_item is a dangling symbolic link\n";
-                   }
-               }
-               next Proc_Top_Item;
-           }
-
-           if (-d _) {
-               $top_item =~ s/\.dir\z//i if $Is_VMS;
-               _find_dir_symlnk($wanted, $abs_dir, $top_item);
-               $Is_Dir= 1;
-           }
-       }
-       else { # no follow
-           $topdir = $top_item;
-           unless (defined $topnlink) {
-               warnings::warnif "Can't stat $top_item: $!\n";
-               next Proc_Top_Item;
-           }
-           if (-d _) {
-               $top_item =~ s/\.dir\z//i if $Is_VMS;
-               _find_dir($wanted, $top_item, $topnlink);
-               $Is_Dir= 1;
-           }
-           else {
-               $abs_dir= $top_item;
-           }
-       }
-
-       unless ($Is_Dir) {
-           unless (($_,$dir) = File::Basename::fileparse($abs_dir)) {
-               ($dir,$_) = ('./', $top_item);
-           }
-
-           $abs_dir = $dir;
-           if (( $untaint ) && (is_tainted($dir) )) {
-               ( $abs_dir ) = $dir =~ m|$untaint_pat|;
-               unless (defined $abs_dir) {
-                   if ($untaint_skip == 0) {
-                       die "directory $dir is still tainted";
-                   }
-                   else {
-                       next Proc_Top_Item;
-                   }
-               }
-           }
-
-           unless ($no_chdir || chdir $abs_dir) {
-               warnings::warnif "Couldn't chdir $abs_dir: $!\n";
-               next Proc_Top_Item;
-           }
-
-           $name = $abs_dir . $_; # $File::Find::name
-           $_ = $name if $no_chdir;
-
-           { $wanted_callback->() }; # protect against wild "next"
-
-       }
-
-       unless ( $no_chdir ) {
-           if ( ($check_t_cwd) && (($untaint) && (is_tainted($cwd) )) ) {
-               ( $cwd_untainted ) = $cwd =~ m|$untaint_pat|;
-               unless (defined $cwd_untainted) {
-                   die "insecure cwd in find(depth)";
-               }
-               $check_t_cwd = 0;
-           }
-           unless (chdir $cwd_untainted) {
-               die "Can't cd to $cwd: $!\n";
-           }
-       }
+        my $top_item = $TOP;
+        $top_item = VMS::Filespec::unixify($top_item) if $Is_VMS;
+
+        ($topdev,$topino,$topmode,$topnlink) = $follow ? stat $top_item : lstat $top_item;
+
+        # canonicalize directory separators
+        $top_item =~ s|[/\\]|/|g if $Is_Win32;
+
+        # no trailing / unless path is root
+        $top_item =~ s|/\z|| unless _is_root($top_item);
+
+        $Is_Dir= 0;
+
+        if ($follow) {
+
+            if (_is_absolute($top_item)) {
+                $abs_dir = $top_item;
+            }
+            elsif ($top_item eq $File::Find::current_dir) {
+                $abs_dir = $cwd;
+            }
+            else {  # care about any  ../
+                $top_item =~ s/\.dir\z//i if $Is_VMS;
+                $abs_dir = contract_name("$cwd/",$top_item);
+            }
+            $abs_dir= Follow_SymLink($abs_dir);
+            unless (defined $abs_dir) {
+                if ($dangling_symlinks) {
+                    if (ref $dangling_symlinks eq 'CODE') {
+                        $dangling_symlinks->($top_item, $cwd);
+                    } else {
+                        warnings::warnif "$top_item is a dangling symbolic link\n";
+                    }
+                }
+                next Proc_Top_Item;
+            }
+
+            if (-d _) {
+                $top_item =~ s/\.dir\z//i if $Is_VMS;
+                _find_dir_symlnk($wanted, $abs_dir, $top_item);
+                $Is_Dir= 1;
+            }
+        }
+        else { # no follow
+            $topdir = $top_item;
+            unless (defined $topnlink) {
+                warnings::warnif "Can't stat $top_item: $!\n";
+                next Proc_Top_Item;
+            }
+            if (-d _) {
+                $top_item =~ s/\.dir\z//i if $Is_VMS;
+                _find_dir($wanted, $top_item, $topnlink);
+                $Is_Dir= 1;
+            }
+            else {
+                $abs_dir= $top_item;
+            }
+        }
+
+        unless ($Is_Dir) {
+            unless (($_,$dir) = File::Basename::fileparse($abs_dir)) {
+                ($dir,$_) = ('./', $top_item);
+            }
+
+            $abs_dir = $dir;
+            if (( $untaint ) && (is_tainted($dir) )) {
+                ( $abs_dir ) = $dir =~ m|$untaint_pat|;
+                unless (defined $abs_dir) {
+                    if ($untaint_skip == 0) {
+                        die "directory $dir is still tainted";
+                    }
+                    else {
+                        next Proc_Top_Item;
+                    }
+                }
+            }
+
+            unless ($no_chdir || chdir $abs_dir) {
+                warnings::warnif "Couldn't chdir $abs_dir: $!\n";
+                next Proc_Top_Item;
+            }
+
+            $name = $abs_dir . $_; # $File::Find::name
+            $_ = $name if $no_chdir;
+
+            { $wanted_callback->() }; # protect against wild "next"
+
+        }
+
+        unless ( $no_chdir ) {
+            if ( ($check_t_cwd) && (($untaint) && (is_tainted($cwd) )) ) {
+                ( $cwd_untainted ) = $cwd =~ m|$untaint_pat|;
+                unless (defined $cwd_untainted) {
+                    die "insecure cwd in find(depth)";
+                }
+                $check_t_cwd = 0;
+            }
+            unless (chdir $cwd_untainted) {
+                die "Can't cd to $cwd: $!\n";
+            }
+        }
     }
 }
 
@@ -304,179 +316,170 @@ sub _find_dir($$$) {
     my $tainted = 0;
     my $no_nlink;
 
-    if ($Is_Win32) {
-       $dir_pref
-         = ($p_dir =~ m{^(?:\w:[/\\]?|[/\\])$} ? $p_dir : "$p_dir/" );
-    } elsif ($Is_VMS) {
-
-       #       VMS is returning trailing .dir on directories
-       #       and trailing . on files and symbolic links
-       #       in UNIX syntax.
-       #
+    if ($Is_VMS) {
+        # VMS is returning trailing .dir on directories
+        # and trailing . on files and symbolic links
+        # in UNIX syntax.
+        #
 
-       $p_dir =~ s/\.(dir)?$//i unless $p_dir eq '.';
+        $p_dir =~ s/\.(dir)?$//i unless $p_dir eq '.';
 
-       $dir_pref = ($p_dir =~ m/[\]>]+$/ ? $p_dir : "$p_dir/" );
+        $dir_pref = ($p_dir =~ m/[\]>]+$/ ? $p_dir : "$p_dir/" );
     }
     else {
-       $dir_pref= ( $p_dir eq '/' ? '/' : "$p_dir/" );
+        $dir_pref = _is_root($p_dir) ? $p_dir : "$p_dir/";
     }
 
     local ($dir, $name, $prune);
 
     unless ( $no_chdir || ($p_dir eq $File::Find::current_dir)) {
-       my $udir = $p_dir;
-       if (( $untaint ) && (is_tainted($p_dir) )) {
-           ( $udir ) = $p_dir =~ m|$untaint_pat|;
-           unless (defined $udir) {
-               if ($untaint_skip == 0) {
-                   die "directory $p_dir is still tainted";
-               }
-               else {
-                   return;
-               }
-           }
-       }
-       unless (chdir ($Is_VMS && $udir !~ /[\/\[<]+/ ? "./$udir" : $udir)) {
-           warnings::warnif "Can't cd to $udir: $!\n";
-           return;
-       }
+        my $udir = $p_dir;
+        if (( $untaint ) && (is_tainted($p_dir) )) {
+            ( $udir ) = $p_dir =~ m|$untaint_pat|;
+            unless (defined $udir) {
+                if ($untaint_skip == 0) {
+                    die "directory $p_dir is still tainted";
+                }
+                else {
+                    return;
+                }
+            }
+        }
+        unless (chdir ($Is_VMS && $udir !~ /[\/\[<]+/ ? "./$udir" : $udir)) {
+            warnings::warnif "Can't cd to $udir: $!\n";
+            return;
+        }
     }
 
     # push the starting directory
     push @Stack,[$CdLvl,$p_dir,$dir_rel,-1]  if  $bydepth;
 
     while (defined $SE) {
-       unless ($bydepth) {
-           $dir= $p_dir; # $File::Find::dir
-           $name= $dir_name; # $File::Find::name
-           $_= ($no_chdir ? $dir_name : $dir_rel ); # $_
-           # prune may happen here
-           $prune= 0;
-           { $wanted_callback->() };   # protect against wild "next"
-           next if $prune;
-       }
-
-       # change to that directory
-       unless ($no_chdir || ($dir_rel eq $File::Find::current_dir)) {
-           my $udir= $dir_rel;
-           if ( ($untaint) && (($tainted) || ($tainted = is_tainted($dir_rel) )) ) {
-               ( $udir ) = $dir_rel =~ m|$untaint_pat|;
-               unless (defined $udir) {
-                   if ($untaint_skip == 0) {
-                       die "directory (" . ($p_dir ne '/' ? $p_dir : '') . "/) $dir_rel is still tainted";
-                   } else { # $untaint_skip == 1
-                       next;
-                   }
-               }
-           }
-           unless (chdir ($Is_VMS && $udir !~ /[\/\[<]+/ ? "./$udir" : $udir)) {
-               warnings::warnif "Can't cd to (" .
-                   ($p_dir ne '/' ? $p_dir : '') . "/) $udir: $!\n";
-               next;
-           }
-           $CdLvl++;
-       }
-
-       $dir= $dir_name; # $File::Find::dir
-
-       # Get the list of files in the current directory.
-    my $dh;
-       unless (opendir $dh, ($no_chdir ? $dir_name : $File::Find::current_dir)) {
-           warnings::warnif "Can't opendir($dir_name): $!\n";
-           next;
-       }
-       @filenames = readdir $dh;
-       closedir($dh);
-       @filenames = $pre_process->(@filenames) if $pre_process;
-       push @Stack,[$CdLvl,$dir_name,"",-2]   if $post_process;
-
-       # default: use whatever was specified
+        unless ($bydepth) {
+            $dir= $p_dir; # $File::Find::dir
+            $name= $dir_name; # $File::Find::name
+            $_= ($no_chdir ? $dir_name : $dir_rel ); # $_
+            # prune may happen here
+            $prune= 0;
+            { $wanted_callback->() };   # protect against wild "next"
+            next if $prune;
+        }
+
+        # change to that directory
+        unless ($no_chdir || ($dir_rel eq $File::Find::current_dir)) {
+            my $udir= $dir_rel;
+            if ( ($untaint) && (($tainted) || ($tainted = is_tainted($dir_rel) )) ) {
+                ( $udir ) = $dir_rel =~ m|$untaint_pat|;
+                unless (defined $udir) {
+                    if ($untaint_skip == 0) {
+                        die "directory (" . ($p_dir ne '/' ? $p_dir : '') . "/) $dir_rel is still tainted";
+                    } else { # $untaint_skip == 1
+                        next;
+                    }
+                }
+            }
+            unless (chdir ($Is_VMS && $udir !~ /[\/\[<]+/ ? "./$udir" : $udir)) {
+                warnings::warnif "Can't cd to (" .
+                    ($p_dir ne '/' ? $p_dir : '') . "/) $udir: $!\n";
+                next;
+            }
+            $CdLvl++;
+        }
+
+        $dir= $dir_name; # $File::Find::dir
+
+        # Get the list of files in the current directory.
+        my $dh;
+        unless (opendir $dh, ($no_chdir ? $dir_name : $File::Find::current_dir)) {
+            warnings::warnif "Can't opendir($dir_name): $!\n";
+            next;
+        }
+        @filenames = readdir $dh;
+        closedir($dh);
+        @filenames = $pre_process->(@filenames) if $pre_process;
+        push @Stack,[$CdLvl,$dir_name,"",-2]   if $post_process;
+
+        # default: use whatever was specified
         # (if $nlink >= 2, and $avoid_nlink == 0, this will switch back)
         $no_nlink = $avoid_nlink;
         # if dir has wrong nlink count, force switch to slower stat method
         $no_nlink = 1 if ($nlink < 2);
 
-       if ($nlink == 2 && !$no_nlink) {
-           # This dir has no subdirectories.
-           for my $FN (@filenames) {
-               if ($Is_VMS) {
-               # Big hammer here - Compensate for VMS trailing . and .dir
-               # No win situation until this is changed, but this
-               # will handle the majority of the cases with breaking the fewest
-
-                   $FN =~ s/\.dir\z//i;
-                   $FN =~ s#\.$## if ($FN ne '.');
-               }
-               next if $FN =~ $File::Find::skip_pattern;
-               
-               $name = $dir_pref . $FN; # $File::Find::name
-               $_ = ($no_chdir ? $name : $FN); # $_
-               { $wanted_callback->() }; # protect against wild "next"
-           }
-
-       }
-       else {
-           # This dir has subdirectories.
-           $subcount = $nlink - 2;
-
-           # HACK: insert directories at this position, so as to preserve
-           # the user pre-processed ordering of files (thus ensuring
-           # directory traversal is in user sorted order, not at random).
+        if ($nlink == 2 && !$no_nlink) {
+            # This dir has no subdirectories.
+            for my $FN (@filenames) {
+                if ($Is_VMS) {
+                    # Big hammer here - Compensate for VMS trailing . and .dir
+                    # No win situation until this is changed, but this
+                    # will handle the majority of the cases with breaking the fewest
+
+                    $FN =~ s/\.dir\z//i;
+                    $FN =~ s#\.$## if ($FN ne '.');
+                }
+                next if $FN =~ $File::Find::skip_pattern;
+
+                $name = $dir_pref . $FN; # $File::Find::name
+                $_ = ($no_chdir ? $name : $FN); # $_
+                { $wanted_callback->() }; # protect against wild "next"
+            }
+
+        }
+        else {
+            # This dir has subdirectories.
+            $subcount = $nlink - 2;
+
+            # HACK: insert directories at this position, so as to preserve
+            # the user pre-processed ordering of files (thus ensuring
+            # directory traversal is in user sorted order, not at random).
             my $stack_top = @Stack;
 
-           for my $FN (@filenames) {
-               next if $FN =~ $File::Find::skip_pattern;
-               if ($subcount > 0 || $no_nlink) {
-                   # Seen all the subdirs?
-                   # check for directoriness.
-                   # stat is faster for a file in the current directory
-                   $sub_nlink = (lstat ($no_chdir ? $dir_pref . $FN : $FN))[3];
-
-                   if (-d _) {
-                       --$subcount;
-                       $FN =~ s/\.dir\z//i if $Is_VMS;
-                       # HACK: replace push to preserve dir traversal order
-                       #push @Stack,[$CdLvl,$dir_name,$FN,$sub_nlink];
-                       splice @Stack, $stack_top, 0,
-                                [$CdLvl,$dir_name,$FN,$sub_nlink];
-                   }
-                   else {
-                       $name = $dir_pref . $FN; # $File::Find::name
-                       $_= ($no_chdir ? $name : $FN); # $_
-                       { $wanted_callback->() }; # protect against wild "next"
-                   }
-               }
-               else {
-                   $name = $dir_pref . $FN; # $File::Find::name
-                   $_= ($no_chdir ? $name : $FN); # $_
-                   { $wanted_callback->() }; # protect against wild "next"
-               }
-           }
-       }
+            for my $FN (@filenames) {
+                next if $FN =~ $File::Find::skip_pattern;
+                if ($subcount > 0 || $no_nlink) {
+                    # Seen all the subdirs?
+                    # check for directoriness.
+                    # stat is faster for a file in the current directory
+                    $sub_nlink = (lstat ($no_chdir ? $dir_pref . $FN : $FN))[3];
+
+                    if (-d _) {
+                        --$subcount;
+                        $FN =~ s/\.dir\z//i if $Is_VMS;
+                        # HACK: replace push to preserve dir traversal order
+                        #push @Stack,[$CdLvl,$dir_name,$FN,$sub_nlink];
+                        splice @Stack, $stack_top, 0,
+                                 [$CdLvl,$dir_name,$FN,$sub_nlink];
+                    }
+                    else {
+                        $name = $dir_pref . $FN; # $File::Find::name
+                        $_= ($no_chdir ? $name : $FN); # $_
+                        { $wanted_callback->() }; # protect against wild "next"
+                    }
+                }
+                else {
+                    $name = $dir_pref . $FN; # $File::Find::name
+                    $_= ($no_chdir ? $name : $FN); # $_
+                    { $wanted_callback->() }; # protect against wild "next"
+                }
+            }
+        }
     }
     continue {
-       while ( defined ($SE = pop @Stack) ) {
-           ($Level, $p_dir, $dir_rel, $nlink) = @$SE;
-           if ($CdLvl > $Level && !$no_chdir) {
-               my $tmp;
-               if ($Is_VMS) {
-                   $tmp = '[' . ('-' x ($CdLvl-$Level)) . ']';
-               }
-               else {
-                   $tmp = join('/',('..') x ($CdLvl-$Level));
-               }
-               die "Can't cd to $tmp from $dir_name: $!"
-                   unless chdir ($tmp);
-               $CdLvl = $Level;
-           }
-
-           if ($Is_Win32) {
-               $dir_name = ($p_dir =~ m{^(?:\w:[/\\]?|[/\\])$}
-                   ? "$p_dir$dir_rel" : "$p_dir/$dir_rel");
-               $dir_pref = "$dir_name/";
-           }
-           elsif ($^O eq 'VMS') {
+        while ( defined ($SE = pop @Stack) ) {
+            ($Level, $p_dir, $dir_rel, $nlink) = @$SE;
+            if ($CdLvl > $Level && !$no_chdir) {
+                my $tmp;
+                if ($Is_VMS) {
+                    $tmp = '[' . ('-' x ($CdLvl-$Level)) . ']';
+                }
+                else {
+                    $tmp = join('/',('..') x ($CdLvl-$Level));
+                }
+                die "Can't cd to $tmp from $dir_name: $!"
+                    unless chdir ($tmp);
+                $CdLvl = $Level;
+            }
+
+            if ($^O eq 'VMS') {
                 if ($p_dir =~ m/[\]>]+$/) {
                     $dir_name = $p_dir;
                     $dir_name =~ s/([\]>]+)$/.$dir_rel$1/;
@@ -486,34 +489,34 @@ sub _find_dir($$$) {
                     $dir_name = "$p_dir/$dir_rel";
                     $dir_pref = "$dir_name/";
                 }
-           }
-           else {
-               $dir_name = ($p_dir eq '/' ? "/$dir_rel" : "$p_dir/$dir_rel");
-               $dir_pref = "$dir_name/";
-           }
-
-           if ( $nlink == -2 ) {
-               $name = $dir = $p_dir; # $File::Find::name / dir
+            }
+            else {
+                $dir_name = _is_root($p_dir) ? "$p_dir$dir_rel" : "$p_dir/$dir_rel";
+                $dir_pref = "$dir_name/";
+            }
+
+            if ( $nlink == -2 ) {
+                $name = $dir = $p_dir; # $File::Find::name / dir
                 $_ = $File::Find::current_dir;
-               $post_process->();              # End-of-directory processing
-           }
-           elsif ( $nlink < 0 ) {  # must be finddepth, report dirname now
-               $name = $dir_name;
-               if ( substr($name,-2) eq '/.' ) {
-                   substr($name, length($name) == 2 ? -1 : -2) = '';
-               }
-               $dir = $p_dir;
-               $_ = ($no_chdir ? $dir_name : $dir_rel );
-               if ( substr($_,-2) eq '/.' ) {
-                   substr($_, length($_) == 2 ? -1 : -2) = '';
-               }
-               { $wanted_callback->() }; # protect against wild "next"
-            }
-            else {
-               push @Stack,[$CdLvl,$p_dir,$dir_rel,-1]  if  $bydepth;
-               last;
-           }
-       }
+                $post_process->();              # End-of-directory processing
+            }
+            elsif ( $nlink < 0 ) {  # must be finddepth, report dirname now
+                $name = $dir_name;
+                if ( substr($name,-2) eq '/.' ) {
+                    substr($name, length($name) == 2 ? -1 : -2) = '';
+                }
+                $dir = $p_dir;
+                $_ = ($no_chdir ? $dir_name : $dir_rel );
+                if ( substr($_,-2) eq '/.' ) {
+                    substr($_, length($_) == 2 ? -1 : -2) = '';
+                }
+                { $wanted_callback->() }; # protect against wild "next"
+             }
+             else {
+                push @Stack,[$CdLvl,$p_dir,$dir_rel,-1]  if  $bydepth;
+                last;
+            }
+        }
     }
 }
 
@@ -540,172 +543,172 @@ sub _find_dir_symlnk($$$) {
     my $tainted = 0;
     my $ok = 1;
 
-    $dir_pref = ( $p_dir   eq '/' ? '/' : "$p_dir/" );
-    $loc_pref = ( $dir_loc eq '/' ? '/' : "$dir_loc/" );
+    $dir_pref = _is_root($p_dir) ? $p_dir : "$p_dir/";
+    $loc_pref = _is_root($dir_loc) ? $dir_loc : "$dir_loc/";
 
     local ($dir, $name, $fullname, $prune);
 
     unless ($no_chdir) {
-       # untaint the topdir
-       if (( $untaint ) && (is_tainted($dir_loc) )) {
-           ( $updir_loc ) = $dir_loc =~ m|$untaint_pat|; # parent dir, now untainted
-            # once untainted, $updir_loc is pushed on the stack (as parent directory);
-           # hence, we don't need to untaint the parent directory every time we chdir
-           # to it later
-           unless (defined $updir_loc) {
-               if ($untaint_skip == 0) {
-                   die "directory $dir_loc is still tainted";
-               }
-               else {
-                   return;
-               }
-           }
-       }
-       $ok = chdir($updir_loc) unless ($p_dir eq $File::Find::current_dir);
-       unless ($ok) {
-           warnings::warnif "Can't cd to $updir_loc: $!\n";
-           return;
-       }
+        # untaint the topdir
+        if (( $untaint ) && (is_tainted($dir_loc) )) {
+            ( $updir_loc ) = $dir_loc =~ m|$untaint_pat|; # parent dir, now untainted
+            # once untainted, $updir_loc is pushed on the stack (as parent directory);
+            # hence, we don't need to untaint the parent directory every time we chdir
+            # to it later
+            unless (defined $updir_loc) {
+                if ($untaint_skip == 0) {
+                    die "directory $dir_loc is still tainted";
+                }
+                else {
+                    return;
+                }
+            }
+        }
+        $ok = chdir($updir_loc) unless ($p_dir eq $File::Find::current_dir);
+        unless ($ok) {
+            warnings::warnif "Can't cd to $updir_loc: $!\n";
+            return;
+        }
     }
 
     push @Stack,[$dir_loc,$updir_loc,$p_dir,$dir_rel,-1]  if  $bydepth;
 
     while (defined $SE) {
 
-       unless ($bydepth) {
-           # change (back) to parent directory (always untainted)
-           unless ($no_chdir) {
-               unless (chdir $updir_loc) {
-                   warnings::warnif "Can't cd to $updir_loc: $!\n";
-                   next;
-               }
-           }
-           $dir= $p_dir; # $File::Find::dir
-           $name= $dir_name; # $File::Find::name
-           $_= ($no_chdir ? $dir_name : $dir_rel ); # $_
-           $fullname= $dir_loc; # $File::Find::fullname
-           # prune may happen here
-           $prune= 0;
-           lstat($_); # make sure  file tests with '_' work
-           { $wanted_callback->() }; # protect against wild "next"
-           next if $prune;
-       }
-
-       # change to that directory
-       unless ($no_chdir || ($dir_rel eq $File::Find::current_dir)) {
-           $updir_loc = $dir_loc;
-           if ( ($untaint) && (($tainted) || ($tainted = is_tainted($dir_loc) )) ) {
-               # untaint $dir_loc, what will be pushed on the stack as (untainted) parent dir
-               ( $updir_loc ) = $dir_loc =~ m|$untaint_pat|;
-               unless (defined $updir_loc) {
-                   if ($untaint_skip == 0) {
-                       die "directory $dir_loc is still tainted";
-                   }
-                   else {
-                       next;
-                   }
-               }
-           }
-           unless (chdir $updir_loc) {
-               warnings::warnif "Can't cd to $updir_loc: $!\n";
-               next;
-           }
-       }
-
-       $dir = $dir_name; # $File::Find::dir
-
-       # Get the list of files in the current directory.
-    my $dh;
-       unless (opendir $dh, ($no_chdir ? $dir_loc : $File::Find::current_dir)) {
-           warnings::warnif "Can't opendir($dir_loc): $!\n";
-           next;
-       }
-       @filenames = readdir $dh;
-       closedir($dh);
-
-       for my $FN (@filenames) {
-           if ($Is_VMS) {
-           # Big hammer here - Compensate for VMS trailing . and .dir
-           # No win situation until this is changed, but this
-           # will handle the majority of the cases with breaking the fewest.
-
-               $FN =~ s/\.dir\z//i;
-               $FN =~ s#\.$## if ($FN ne '.');
-           }
-           next if $FN =~ $File::Find::skip_pattern;
-
-           # follow symbolic links / do an lstat
-           $new_loc = Follow_SymLink($loc_pref.$FN);
-
-           # ignore if invalid symlink
-           unless (defined $new_loc) {
-               if (!defined -l _ && $dangling_symlinks) {
+        unless ($bydepth) {
+            # change (back) to parent directory (always untainted)
+            unless ($no_chdir) {
+                unless (chdir $updir_loc) {
+                    warnings::warnif "Can't cd to $updir_loc: $!\n";
+                    next;
+                }
+            }
+            $dir= $p_dir; # $File::Find::dir
+            $name= $dir_name; # $File::Find::name
+            $_= ($no_chdir ? $dir_name : $dir_rel ); # $_
+            $fullname= $dir_loc; # $File::Find::fullname
+            # prune may happen here
+            $prune= 0;
+            lstat($_); # make sure  file tests with '_' work
+            { $wanted_callback->() }; # protect against wild "next"
+            next if $prune;
+        }
+
+        # change to that directory
+        unless ($no_chdir || ($dir_rel eq $File::Find::current_dir)) {
+            $updir_loc = $dir_loc;
+            if ( ($untaint) && (($tainted) || ($tainted = is_tainted($dir_loc) )) ) {
+                # untaint $dir_loc, what will be pushed on the stack as (untainted) parent dir
+                ( $updir_loc ) = $dir_loc =~ m|$untaint_pat|;
+                unless (defined $updir_loc) {
+                    if ($untaint_skip == 0) {
+                        die "directory $dir_loc is still tainted";
+                    }
+                    else {
+                        next;
+                    }
+                }
+            }
+            unless (chdir $updir_loc) {
+                warnings::warnif "Can't cd to $updir_loc: $!\n";
+                next;
+            }
+        }
+
+        $dir = $dir_name; # $File::Find::dir
+
+        # Get the list of files in the current directory.
+        my $dh;
+        unless (opendir $dh, ($no_chdir ? $dir_loc : $File::Find::current_dir)) {
+            warnings::warnif "Can't opendir($dir_loc): $!\n";
+            next;
+        }
+        @filenames = readdir $dh;
+        closedir($dh);
+
+        for my $FN (@filenames) {
+            if ($Is_VMS) {
+                # Big hammer here - Compensate for VMS trailing . and .dir
+                # No win situation until this is changed, but this
+                # will handle the majority of the cases with breaking the fewest.
+
+                $FN =~ s/\.dir\z//i;
+                $FN =~ s#\.$## if ($FN ne '.');
+            }
+            next if $FN =~ $File::Find::skip_pattern;
+
+            # follow symbolic links / do an lstat
+            $new_loc = Follow_SymLink($loc_pref.$FN);
+
+            # ignore if invalid symlink
+            unless (defined $new_loc) {
+                if (!defined -l _ && $dangling_symlinks) {
                 $fullname = undef;
-                   if (ref $dangling_symlinks eq 'CODE') {
-                       $dangling_symlinks->($FN, $dir_pref);
-                   } else {
-                       warnings::warnif "$dir_pref$FN is a dangling symbolic link\n";
-                   }
-               }
+                    if (ref $dangling_symlinks eq 'CODE') {
+                        $dangling_symlinks->($FN, $dir_pref);
+                    } else {
+                        warnings::warnif "$dir_pref$FN is a dangling symbolic link\n";
+                    }
+                }
             else {
                 $fullname = $loc_pref . $FN;
             }
-               $name = $dir_pref . $FN;
-               $_ = ($no_chdir ? $name : $FN);
-               { $wanted_callback->() };
-               next;
-           }
-
-           if (-d _) {
-               if ($Is_VMS) {
-                   $FN =~ s/\.dir\z//i;
-                   $FN =~ s#\.$## if ($FN ne '.');
-                   $new_loc =~ s/\.dir\z//i;
-                   $new_loc =~ s#\.$## if ($new_loc ne '.');
-               }
-               push @Stack,[$new_loc,$updir_loc,$dir_name,$FN,1];
-           }
-           else {
-               $fullname = $new_loc; # $File::Find::fullname
-               $name = $dir_pref . $FN; # $File::Find::name
-               $_ = ($no_chdir ? $name : $FN); # $_
-               { $wanted_callback->() }; # protect against wild "next"
-           }
-       }
+                $name = $dir_pref . $FN;
+                $_ = ($no_chdir ? $name : $FN);
+                { $wanted_callback->() };
+                next;
+            }
+
+            if (-d _) {
+                if ($Is_VMS) {
+                    $FN =~ s/\.dir\z//i;
+                    $FN =~ s#\.$## if ($FN ne '.');
+                    $new_loc =~ s/\.dir\z//i;
+                    $new_loc =~ s#\.$## if ($new_loc ne '.');
+                }
+                push @Stack,[$new_loc,$updir_loc,$dir_name,$FN,1];
+            }
+            else {
+                $fullname = $new_loc; # $File::Find::fullname
+                $name = $dir_pref . $FN; # $File::Find::name
+                $_ = ($no_chdir ? $name : $FN); # $_
+                { $wanted_callback->() }; # protect against wild "next"
+            }
+        }
 
     }
     continue {
-       while (defined($SE = pop @Stack)) {
-           ($dir_loc, $updir_loc, $p_dir, $dir_rel, $byd_flag) = @$SE;
-           $dir_name = ($p_dir eq '/' ? "/$dir_rel" : "$p_dir/$dir_rel");
-           $dir_pref = "$dir_name/";
-           $loc_pref = "$dir_loc/";
-           if ( $byd_flag < 0 ) {  # must be finddepth, report dirname now
-               unless ($no_chdir || ($dir_rel eq $File::Find::current_dir)) {
-                   unless (chdir $updir_loc) { # $updir_loc (parent dir) is always untainted
-                       warnings::warnif "Can't cd to $updir_loc: $!\n";
-                       next;
-                   }
-               }
-               $fullname = $dir_loc; # $File::Find::fullname
-               $name = $dir_name; # $File::Find::name
-               if ( substr($name,-2) eq '/.' ) {
-                   substr($name, length($name) == 2 ? -1 : -2) = ''; # $File::Find::name
-               }
-               $dir = $p_dir; # $File::Find::dir
-               $_ = ($no_chdir ? $dir_name : $dir_rel); # $_
-               if ( substr($_,-2) eq '/.' ) {
-                   substr($_, length($_) == 2 ? -1 : -2) = '';
-               }
-
-               lstat($_); # make sure file tests with '_' work
-               { $wanted_callback->() }; # protect against wild "next"
-           }
-           else {
-               push @Stack,[$dir_loc, $updir_loc, $p_dir, $dir_rel,-1]  if  $bydepth;
-               last;
-           }
-       }
+        while (defined($SE = pop @Stack)) {
+            ($dir_loc, $updir_loc, $p_dir, $dir_rel, $byd_flag) = @$SE;
+            $dir_name = _is_root($p_dir) ? "$p_dir$dir_rel" : "$p_dir/$dir_rel";
+            $dir_pref = "$dir_name/";
+            $loc_pref = "$dir_loc/";
+            if ( $byd_flag < 0 ) {  # must be finddepth, report dirname now
+                unless ($no_chdir || ($dir_rel eq $File::Find::current_dir)) {
+                    unless (chdir $updir_loc) { # $updir_loc (parent dir) is always untainted
+                        warnings::warnif "Can't cd to $updir_loc: $!\n";
+                        next;
+                    }
+                }
+                $fullname = $dir_loc; # $File::Find::fullname
+                $name = $dir_name; # $File::Find::name
+                if ( substr($name,-2) eq '/.' ) {
+                    substr($name, length($name) == 2 ? -1 : -2) = ''; # $File::Find::name
+                }
+                $dir = $p_dir; # $File::Find::dir
+                $_ = ($no_chdir ? $dir_name : $dir_rel); # $_
+                if ( substr($_,-2) eq '/.' ) {
+                    substr($_, length($_) == 2 ? -1 : -2) = '';
+                }
+
+                lstat($_); # make sure file tests with '_' work
+                { $wanted_callback->() }; # protect against wild "next"
+            }
+            else {
+                push @Stack,[$dir_loc, $updir_loc, $p_dir, $dir_rel,-1]  if  $bydepth;
+                last;
+            }
+        }
     }
 }
 
@@ -913,8 +916,6 @@ a dangling symbolic link, then fullname will be set to C<undef>.
 
 =back
 
-This is a no-op on Win32.
-
 =item C<follow_fast>
 
 This is similar to I<follow> except that it may report some files more
@@ -923,8 +924,6 @@ have to be hashed, this is much cheaper both in space and time.  If
 processing a file more than once (by the user's C<wanted()> function)
 is worse than just taking time, the option I<follow> should be used.
 
-This is also a no-op on Win32.
-
 =item C<follow_skip>
 
 C<follow_skip==1>, which is the default, causes all files which are
index add20c2..b6359d8 100644 (file)
@@ -33,15 +33,21 @@ use Testing qw(
     symlink_ok
     dir_path
     file_path
+    _cleanup_start
 );
 use Errno ();
+use File::Temp qw(tempdir);
 
 my %Expect_File = (); # what we expect for $_
 my %Expect_Name = (); # what we expect for $File::Find::name/fullname
 my %Expect_Dir  = (); # what we expect for $File::Find::dir
 my (@files);
 
-my $orig_dir = cwd();
+my $test_root_dir = cwd();
+ok($test_root_dir,"We were able to determine our starting directory");
+my $test_temp_dir = tempdir("FF_find_t_XXXXXX",CLEANUP=>1);
+ok($test_temp_dir,"We were able to set up a temp directory");
+
 
 # Uncomment this to see where File::Find is chdir-ing to.  Helpful for
 # debugging its little jaunts around the filesystem.
@@ -59,8 +65,6 @@ my $orig_dir = cwd();
 #     };
 # }
 
-cleanup();
-
 ##### Sanity checks #####
 # Do find() and finddepth() work correctly with an empty list of
 # directories?
@@ -73,23 +77,34 @@ cleanup();
 }
 
 # Do find() and finddepth() work correctly in the directory
-# from which we start?  (Test presumes the presence of 'taint.t' in same
+# from which we start?  (Test presumes the presence of 'find.t' in same
 # directory as this test file.)
 
-$::count_taint = 0;
-find({wanted => sub { ++$::count_taint if $_ eq 'taint.t'; } },
+my $count_found = 0;
+find({wanted => sub { ++$count_found if $_ eq 'find.t'; } },
    File::Spec->curdir);
-is($::count_taint, 1, "'find' found exactly 1 file named 'taint.t'");
+is($count_found, 1, "'find' found exactly 1 file named 'find.t'");
 
-$::count_taint = 0;
-finddepth({wanted => sub { ++$::count_taint if $_ eq 'taint.t'; } },
+$count_found = 0;
+finddepth({wanted => sub { ++$count_found if $_ eq 'find.t'; } },
     File::Spec->curdir);
-is($::count_taint, 1, "'finddepth' found exactly 1 file named 'taint.t'");
+is($count_found, 1, "'finddepth' found exactly 1 file named 'find.t'");
 
 my $FastFileTests_OK = 0;
 
+my $chdir_error = "";
+chdir($test_temp_dir)
+    or $chdir_error = "Failed to chdir to '$test_temp_dir': $!";
+is($chdir_error,"","chdir to temp dir '$test_temp_dir' successful")
+    or die $chdir_error;
+
 sub cleanup {
-    chdir($orig_dir);
+    # the following chdirs into $test_root_dir/$test_temp_dir but
+    # handles various possible edge case errors cleanly. If it returns
+    # false then we bail out of the cleanup.
+    _cleanup_start($test_root_dir, $test_temp_dir)
+        or return;
+
     my $need_updir = 0;
     if (-d dir_path('for_find')) {
         $need_updir = 1 if chdir(dir_path('for_find'));
@@ -138,6 +153,7 @@ sub cleanup {
     if (-d dir_path('for_find')) {
         rmdir dir_path('for_find') or print "# Can't rmdir for_find: $!\n";
     }
+    chdir($test_root_dir) or die "Failed to chdir to '$test_root_dir': $!";
 }
 
 END {
@@ -235,7 +251,6 @@ sub my_postprocess {
 *file_path_name = \&file_path;
 
 ##### Create directories, files and symlinks used in testing #####
-
 mkdir_ok( dir_path('for_find'), 0770 );
 ok( chdir( dir_path('for_find')), "Able to chdir to 'for_find'")
     or die("Unable to chdir to 'for_find'");
@@ -865,7 +880,7 @@ if ( $symlink_exists ) {
 
 if ($^O eq 'MSWin32') {
     require File::Spec::Win32;
-    my ($volume) = File::Spec::Win32->splitpath($orig_dir, 1);
+    my ($volume) = File::Spec::Win32->splitpath($test_root_dir, 1);
     print STDERR "VOLUME = $volume\n";
 
     ##### #####
@@ -1023,7 +1038,7 @@ if ($^O eq 'MSWin32') {
     # Check F:F:f correctly handles a root directory path.
     # Rather than processing the entire drive (!), simply test that the
     # first file passed to the wanted routine is correct and then bail out.
-    $orig_dir =~ /^(\w:)/ or die "expected a drive: $orig_dir";
+    $test_root_dir =~ /^(\w:)/ or die "expected a drive: $test_root_dir";
     my $drive = $1;
 
     # Determine the file in the root directory which would be
@@ -1050,7 +1065,7 @@ if ($^O eq 'MSWin32') {
         # Run F:F:f with/without no_chdir for each possible style of root path.
         # NB. If HOME were "/", then an inadvertent chdir('') would fluke the
         # expected result, so ensure it is something else:
-        local $ENV{HOME} = $orig_dir;
+        local $ENV{HOME} = $test_root_dir;
         foreach my $no_chdir (0, 1) {
             foreach my $root_dir ("/", "\\", "$drive/", "$drive\\") {
                 eval {
@@ -1060,7 +1075,7 @@ if ($^O eq 'MSWin32') {
                             'wanted' => sub {
                                 -f or return; # the first call is for $root_dir itself.
                                 my $got = $File::Find::name;
-                                my $exp = "$root_dir$expected_first_file";
+                                (my $exp = "$root_dir$expected_first_file") =~ s|\\|/|g;
                                 print "# no_chdir=$no_chdir $root_dir '$got'\n";
                                 is($got, $exp,
                                    "Win32: Run 'find' with 'no_chdir' set to $no_chdir" );
@@ -1111,5 +1126,4 @@ if ($^O eq 'MSWin32') {
     like($@, qr/invalid top directory/,
         "find() correctly died due to undefined top directory");
 }
-
 done_testing();
index 74b6af7..f7b89f4 100644 (file)
@@ -33,7 +33,7 @@ $EXPORT_TAGS{bsd_glob} = [@{$EXPORT_TAGS{glob}}];
 
 our @EXPORT_OK   = (@{$EXPORT_TAGS{'glob'}}, 'csh_glob');
 
-our $VERSION = '1.37';
+our $VERSION = '1.40';
 
 sub import {
     require Exporter;
index 4e1ae80..a65337e 100644 (file)
@@ -99,7 +99,7 @@ iterate(pTHX_ bool(*globber)(pTHX_ AV *entries, const char *pat, STRLEN len, boo
         }
         else {
             pat = SvPV_nomg(patsv,len);
-            is_utf8 = !!SvUTF8(patsv);
+            is_utf8 = cBOOL(SvUTF8(patsv));
             /* the lower-level code expects a null-terminated string */
             if (!SvPOK(patsv) || pat != SvPVX(patsv) || pat[len] != '\0') {
                 SV *newpatsv = newSVpvn_flags(pat, len, SVs_TEMP);
@@ -451,11 +451,13 @@ BOOT:
     {
        dMY_CXT;
        MY_CXT.x_GLOB_ENTRIES = NULL;
-       MY_CXT.x_GLOB_OLD_OPHOOK = PL_opfreehook;
 #ifdef USE_ITHREADS
         MY_CXT.interp = aTHX;
 #endif
-       PL_opfreehook = glob_ophook;
+       if(!MY_CXT.x_GLOB_OLD_OPHOOK) {
+           MY_CXT.x_GLOB_OLD_OPHOOK = PL_opfreehook;
+           PL_opfreehook = glob_ophook;
+       }
     }  
 }
 
index 8fab443..3d402e0 100644 (file)
@@ -81,9 +81,9 @@ static char sscsid[]=  "$OpenBSD: glob.c,v 1.8.10.1 2001/04/10 jason Exp $";
 
 #ifndef MAXPATHLEN
 #  ifdef PATH_MAX
-#    define    MAXPATHLEN      PATH_MAX
+#    define MAXPATHLEN  PATH_MAX
 #  else
-#    define    MAXPATHLEN      1024
+#    define MAXPATHLEN  1024
 #  endif
 #endif
 
@@ -91,71 +91,71 @@ static char sscsid[]=  "$OpenBSD: glob.c,v 1.8.10.1 2001/04/10 jason Exp $";
 
 #ifndef ARG_MAX
 #  ifdef _SC_ARG_MAX
-#    define            ARG_MAX         (sysconf(_SC_ARG_MAX))
+#    define     ARG_MAX         (sysconf(_SC_ARG_MAX))
 #  else
 #    ifdef _POSIX_ARG_MAX
-#      define          ARG_MAX         _POSIX_ARG_MAX
+#      define   ARG_MAX         _POSIX_ARG_MAX
 #    else
 #      ifdef WIN32
-#        define        ARG_MAX         14500   /* from VC's limits.h */
+#        define ARG_MAX         14500   /* from VC's limits.h */
 #      else
-#        define        ARG_MAX         4096    /* from POSIX, be conservative */
+#        define ARG_MAX         4096    /* from POSIX, be conservative */
 #      endif
 #    endif
 #  endif
 #endif
 
-#define        BG_DOLLAR       '$'
-#define        BG_DOT          '.'
-#define        BG_EOS          '\0'
-#define        BG_LBRACKET     '['
-#define        BG_NOT          '!'
-#define        BG_QUESTION     '?'
-#define        BG_QUOTE        '\\'
-#define        BG_RANGE        '-'
-#define        BG_RBRACKET     ']'
-#define        BG_SEP  '/'
+#define BG_DOLLAR       '$'
+#define BG_DOT          '.'
+#define BG_EOS          '\0'
+#define BG_LBRACKET     '['
+#define BG_NOT          '!'
+#define BG_QUESTION     '?'
+#define BG_QUOTE        '\\'
+#define BG_RANGE        '-'
+#define BG_RBRACKET     ']'
+#define BG_SEP  '/'
 #ifdef DOSISH
 #define BG_SEP2                '\\'
 #endif
-#define        BG_STAR         '*'
-#define        BG_TILDE        '~'
-#define        BG_UNDERSCORE   '_'
-#define        BG_LBRACE       '{'
-#define        BG_RBRACE       '}'
-#define        BG_SLASH        '/'
-#define        BG_COMMA        ','
+#define BG_STAR         '*'
+#define BG_TILDE        '~'
+#define BG_UNDERSCORE   '_'
+#define BG_LBRACE       '{'
+#define BG_RBRACE       '}'
+#define BG_SLASH        '/'
+#define BG_COMMA        ','
 
 #ifndef GLOB_DEBUG
 
-#define        M_QUOTE         0x8000
-#define        M_PROTECT       0x4000
-#define        M_MASK          0xffff
-#define        M_ASCII         0x00ff
+#define M_QUOTE         0x8000
+#define M_PROTECT       0x4000
+#define M_MASK          0xffff
+#define M_ASCII         0x00ff
 
 typedef U16 Char;
 
 #else
 
-#define        M_QUOTE         0x80
-#define        M_PROTECT       0x40
-#define        M_MASK          0xff
-#define        M_ASCII         0x7f
+#define M_QUOTE         0x80
+#define M_PROTECT       0x40
+#define M_MASK          0xff
+#define M_ASCII         0x7f
 
 typedef U8 Char;
 
 #endif /* !GLOB_DEBUG */
 
 
-#define        CHAR(c)         ((Char)((c)&M_ASCII))
-#define        META(c)         ((Char)((c)|M_QUOTE))
-#define        M_ALL           META('*')
-#define        M_END           META(']')
-#define        M_NOT           META('!')
-#define        M_ONE           META('?')
-#define        M_RNG           META('-')
-#define        M_SET           META('[')
-#define        ismeta(c)       (((c)&M_QUOTE) != 0)
+#define CHAR(c)         ((Char)((c)&M_ASCII))
+#define META(c)         ((Char)((c)|M_QUOTE))
+#define M_ALL           META('*')
+#define M_END           META(']')
+#define M_NOT           META('!')
+#define M_ONE           META('?')
+#define M_RNG           META('-')
+#define M_SET           META('[')
+#define ismeta(c)       (((c)&M_QUOTE) != 0)
 
 
 static int      compare(const void *, const void *);
@@ -204,7 +204,7 @@ my_readdir(DIR *d)
 }
 #   else
 
-#       define my_readdir      readdir
+#       define my_readdir       readdir
 
 #   endif
 
index fe422a5..45a1a93 100644 (file)
@@ -733,7 +733,7 @@ require XSLoader;
 );
 
 # This module isn't dual life, so no need for dev version numbers.
-$VERSION = '1.23';
+$VERSION = '1.24';
 
 our $gdbm_errno;
 
index 4e49a09..b266f4a 100644 (file)
@@ -115,7 +115,7 @@ hash_traversal_mask(rhv, ...)
         if (items>1) {
             hv_rand_set(hv, SvUV(ST(1)));
         }
-        if (SvOOK(hv)) {
+        if (HvHasAUX(hv)) {
             XSRETURN_UV(HvRAND_get(hv));
         } else {
             XSRETURN_UNDEF;
index 0b42922..a0da8ba 100644 (file)
@@ -42,7 +42,7 @@ our @EXPORT_OK  = qw(
 BEGIN {
     # make sure all our XS routines are available early so their prototypes
     # are correctly applied in the following code.
-    our $VERSION = '0.28';
+    our $VERSION = '0.30';
     require XSLoader;
     XSLoader::load();
 }
@@ -92,7 +92,7 @@ Hash::Util - A selection of general-utility hash subroutines
                      hash_traversal_mask
                    );
 
-  %hash = (foo => 42, bar => 23);
+  my %hash = (foo => 42, bar => 23);
   # Ways to restrict a hash
   lock_keys(%hash);
   lock_keys(%hash, @keyset);
index fd34a8a..8ff6eda 100644 (file)
@@ -70,7 +70,7 @@ our @EXPORT_OK = qw(
        YESSTR
 );
 
-our $VERSION = '0.21';
+our $VERSION = '0.22';
 
 XSLoader::load();
 
@@ -180,8 +180,11 @@ For the eras based on typically some ruler, such as the Japanese Emperor
 
 =head2 For systems without C<nl_langinfo>
 
-Starting in Perl 5.28, this module is available even on systems that lack a
-native C<nl_langinfo>.  On such systems, it uses various methods to construct
+This module originally was just a wrapper for the libc C<nl_langinfo>
+function, and did not work on systems lacking it, such as Windows.
+
+Starting in Perl 5.28, this module works on all platforms.  When
+C<nl_langinfo> is not available, it uses various methods to construct
 what that function, if present, would return.  But there are potential
 glitches.  These are the items that could be different:
 
@@ -193,8 +196,11 @@ Unimplemented, so returns C<"">.
 
 =item C<CODESET>
 
-Unimplemented, except on Windows, due to the vagaries of vendor locale names,
-returning C<""> on non-Windows.
+This should work properly for Windows platforms.  On almost all other modern
+platforms, it will reliably return "UTF-8" if that is the code set.
+Otherwise, it depends on the locale's name.  If that is of the form
+C<foo.bar>, it will assume C<bar> is the code set; and it also knows about the
+two locales "C" and "POSIX".  If none of those apply it returns C<"">.
 
 =item C<YESEXPR>
 
@@ -272,8 +278,6 @@ workaround for this; patches welcome: see L<perlapi/switch_to_global_locale>.
 
 L<perllocale>, L<POSIX/localeconv>, L<POSIX/setlocale>, L<nl_langinfo(3)>.
 
-The langinfo() function is just a wrapper for the C nl_langinfo() interface.
-
 =head1 AUTHOR
 
 Jarkko Hietaniemi, E<lt>jhi@hut.fiE<gt>.  Now maintained by Perl 5 porters.
index 904b424..3b05e9f 100644 (file)
@@ -25,8 +25,8 @@ SV*
 langinfo(code)
        int     code
   PREINIT:
-        const   char * value;
-        STRLEN  len;
+        const char * value;
+        utf8ness_t   is_utf8;
   PROTOTYPE: _
   CODE:
 #ifdef HAS_NL_LANGINFO
@@ -36,64 +36,8 @@ langinfo(code)
        } else
 #endif
         {
-            value = Perl_langinfo(code);
-            len = strlen(value);
-            RETVAL = newSVpvn(Perl_langinfo(code), len);
-
-            /* Now see if the UTF-8 flag should be turned on */
-#ifdef USE_LOCALE_CTYPE     /* No utf8 strings if not using LC_CTYPE */
-
-            /* If 'value' is ASCII or not legal UTF-8, the flag doesn't get
-             * turned on, so skip the followin code */
-            if (is_utf8_non_invariant_string((U8 *) value, len)) {
-                int category;
-
-                /* Check if the locale is a UTF-8 one.  The returns from
-                 * Perl_langinfo() are in different locale categories, so check the
-                 * category corresponding to this item */
-                switch (code) {
-
-                    /* This should always return ASCII, so we could instead
-                     * legitimately panic here, but soldier on */
-                    case CODESET:
-                        category = LC_CTYPE;
-                        break;
-
-                    case RADIXCHAR:
-                    case THOUSEP:
-#  ifdef USE_LOCALE_NUMERIC
-                        category = LC_NUMERIC;
-#  else
-                        /* Not ideal, but the best we can do on such a platform */
-                        category = LC_CTYPE;
-#  endif
-                        break;
-
-                    case CRNCYSTR:
-#  ifdef USE_LOCALE_MONETARY
-                        category = LC_MONETARY;
-#  else
-                        category = LC_CTYPE;
-#  endif
-                        break;
-
-                    default:
-#  ifdef USE_LOCALE_TIME
-                        category = LC_TIME;
-#  else
-                        category = LC_CTYPE;
-#  endif
-                        break;
-                }
-
-                /* Here the return is legal UTF-8.  Turn on that flag if the
-                 * locale is UTF-8.  (Otherwise, could just be a coincidence.)
-                 * */
-                if (_is_cur_LC_category_utf8(category)) {
-                    SvUTF8_on(RETVAL);
-                }
-            }
-#endif /* USE_LOCALE_CTYPE */
+            value = Perl_langinfo8(code, &is_utf8);
+            RETVAL = newSVpvn_utf8(value, strlen(value), is_utf8 == UTF8NESS_YES);
         }
 
   OUTPUT:
index 539a377..fe2cb40 100644 (file)
@@ -1,7 +1,7 @@
 use ExtUtils::MakeMaker;
 WriteMakefile(
     NAME       => 'NDBM_File',
-    #LIBS => ["-L/usr/local/lib -lndbm", "-ldbm -lucb"],
+    LIBS => ["-L/usr/local/lib -lndbm", "-ldbm -lucb"],
     XSPROTOARG => '-noprototypes',             # XXX remove later?
     VERSION_FROM => 'NDBM_File.pm',
 );
index ead745d..316c92d 100644 (file)
@@ -7,7 +7,7 @@ require Tie::Hash;
 require XSLoader;
 
 our @ISA = qw(Tie::Hash);
-our $VERSION = "1.15";
+our $VERSION = "1.16";
 
 XSLoader::load();
 
index eed671a..243a618 100644 (file)
@@ -97,6 +97,12 @@ ndbm_FETCH(db, key)
        NDBM_File       db
        datum_key       key
 
+#define ndbm_EXISTS(db,key)                    dbm_fetch(db->dbp,key).dptr
+bool
+ndbm_EXISTS(db, key)
+       NDBM_File       db
+       datum_key       key
+
 #define ndbm_STORE(db,key,value,flags)         dbm_store(db->dbp,key,value,flags)
 int
 ndbm_STORE(db, key, value, flags = DBM_REPLACE)
index 1b49440..874ccf0 100644 (file)
@@ -7,7 +7,7 @@ require Tie::Hash;
 require XSLoader;
 
 our @ISA = qw(Tie::Hash);
-our $VERSION = "1.17";
+our $VERSION = "1.18";
 
 XSLoader::load();
 
index 38e6dbf..2675f7e 100644 (file)
@@ -28,13 +28,13 @@ datum       nextkey(datum key);
 
 #ifdef DBM_BUG_DUPLICATE_FREE 
 /*
- * DBM on at least Ultrix and HPUX call dbmclose() from dbminit(),
+ * DBM on at least HPUX call dbmclose() from dbminit(),
  * resulting in duplicate free() because dbmclose() does *not*
  * check if it has already been called for this DBM.
  * If some malloc/free calls have been done between dbmclose() and
  * the next dbminit(), the memory might be used for something else when
  * it is freed.
- * Verified to work on ultrix4.3.  Probably will work on HP/UX.
+ * Probably will work on HP/UX.
  * Set DBM_BUG_DUPLICATE_FREE in the extension hint file.
  */
 /* Close the previous dbm, and fail to open a new dbm */
diff --git a/gnu/usr.bin/perl/ext/ODBM_File/hints/ultrix.pl b/gnu/usr.bin/perl/ext/ODBM_File/hints/ultrix.pl
deleted file mode 100644 (file)
index b9b99ab..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-#  Try to work around "bad free" messages.  See note in ODBM_File.xs.
-#   Andy Dougherty  <doughera@lafayette.edu>
-#   Sun Sep  8 12:57:52 EDT 1996
-$self->{CCFLAGS} = $Config{ccflags} . ' -DDBM_BUG_DUPLICATE_FREE' ;
index 051fad7..b4aead9 100644 (file)
@@ -1,31 +1,21 @@
-package Opcode;
-
-use 5.006_001;
+package Opcode 1.64;
 
 use strict;
 
-our($VERSION, @ISA, @EXPORT_OK);
-
-$VERSION = "1.57";
-
 use Carp;
 use Exporter 'import';
 use XSLoader;
 
-BEGIN {
-    @EXPORT_OK = qw(
+sub opset (;@);
+sub opset_to_hex ($);
+sub opdump (;$);
+use subs our @EXPORT_OK = qw(
        opset ops_to_opset
        opset_to_ops opset_to_hex invert_opset
        empty_opset full_opset
        opdesc opcodes opmask define_optag
        opmask_add verify_opset opdump
-    );
-}
-
-sub opset (;@);
-sub opset_to_hex ($);
-sub opdump (;$);
-use subs @EXPORT_OK;
+);
 
 XSLoader::load();
 
@@ -312,10 +302,10 @@ invert_opset function.
 
     null stub scalar pushmark wantarray const defined undef
 
-    rv2sv sassign
+    rv2sv sassign padsv_store
 
     rv2av aassign aelem aelemfast aelemfast_lex aslice kvaslice
-    av2arylen
+    av2arylen aelemfastlex_store
 
     rv2hv helem hslice kvhslice each values keys exists delete
     aeach akeys avalues multideref argelem argdefelem argcheck
@@ -342,10 +332,12 @@ invert_opset function.
     list lslice splice push pop shift unshift reverse
 
     cond_expr flip flop andassign orassign dorassign and or dor xor
+    helemexistsor
 
     warn die lineseq nextstate scope enter leave
 
     rv2cv anoncode prototype coreargs avhvswitch anonconst
+    emptyavhv
 
     entersub leavesub leavesublv return method method_named
     method_super method_redir method_redir_super
@@ -359,6 +351,8 @@ invert_opset function.
     leaveeval -- needed for Safe to operate, is safe
                 without entereval
 
+    methstart initfield
+
 =item :base_mem
 
 These memory related ops are not included in :base_core because they
@@ -451,6 +445,8 @@ These are a hotchpotch of opcodes still waiting to be considered
 
     ceil floor
 
+    is_tainted
+
 =item :base_math
 
 These ops are not included in :base_core because of the risk of them being
index 44a6d7c..bdd192f 100644 (file)
@@ -12,7 +12,6 @@
 typedef struct {
     HV *       x_op_named_bits;        /* cache shared for whole process */
     SV *       x_opset_all;            /* mask with all bits set       */
-    IV         x_opset_len;            /* length of opmasks in bytes   */
 #ifdef OPCODE_DEBUG
     int                x_opcode_debug;         /* unused warn() emitting debugging code */
 #endif
@@ -20,9 +19,11 @@ typedef struct {
 
 START_MY_CXT
 
+/* length of opmasks in bytes */
+static const STRLEN opset_len = (PL_maxo + 7) / 8;
+
 #define op_named_bits          (MY_CXT.x_op_named_bits)
 #define opset_all              (MY_CXT.x_opset_all)
-#define opset_len              (MY_CXT.x_opset_len)
 #ifdef OPCODE_DEBUG
 #  define opcode_debug         (MY_CXT.x_opcode_debug)
 #else
@@ -50,13 +51,13 @@ op_names_init(pTHX)
 {
     int i;
     STRLEN len;
-    char **op_names;
+    const char *const *op_names;
     U8 *bitmap;
     dMY_CXT;
 
     op_named_bits = newHV();
     hv_ksplit(op_named_bits, PL_maxo);
-    op_names = get_op_names();
+    op_names = PL_op_name;
     for(i=0; i < PL_maxo; ++i) {
        SV * const sv = newSViv(i);
        SvREADONLY_on(sv);
@@ -128,7 +129,6 @@ static SV *
 new_opset(pTHX_ SV *old_opset)
 {
     SV *opset;
-    dMY_CXT;
 
     if (old_opset) {
        verify_opset(aTHX_ old_opset,1);
@@ -149,11 +149,10 @@ static int
 verify_opset(pTHX_ SV *opset, int fatal)
 {
     const char *err = NULL;
-    dMY_CXT;
 
     if      (!SvOK(opset))              err = "undefined";
     else if (!SvPOK(opset))             err = "wrong type";
-    else if (SvCUR(opset) != (STRLEN)opset_len) err = "wrong size";
+    else if (SvCUR(opset) != opset_len) err = "wrong size";
     if (err && fatal) {
        croak("Invalid opset: %s", err);
     }
@@ -164,8 +163,6 @@ verify_opset(pTHX_ SV *opset, int fatal)
 static void
 set_opset_bits(pTHX_ char *bitmap, SV *bitspec, int on, const char *opname)
 {
-    dMY_CXT;
-
     if (SvIOK(bitspec)) {
        const int myopcode = SvIV(bitspec);
        const int offset = myopcode >> 3;
@@ -180,7 +177,7 @@ set_opset_bits(pTHX_ char *bitmap, SV *bitspec, int on, const char *opname)
        else
            bitmap[offset] &= ~(1 << bit);
     }
-    else if (SvPOK(bitspec) && SvCUR(bitspec) == (STRLEN)opset_len) {
+    else if (SvPOK(bitspec) && SvCUR(bitspec) == opset_len) {
 
        STRLEN len;
        const char * const specbits = SvPV(bitspec, len);
@@ -200,11 +197,10 @@ set_opset_bits(pTHX_ char *bitmap, SV *bitspec, int on, const char *opname)
 static void
 opmask_add(pTHX_ SV *opset)    /* THE ONLY FUNCTION TO EDIT PL_op_mask ITSELF  */
 {
-    int i,j;
+    int j;
     char *bitmask;
     STRLEN len;
     int myopcode = 0;
-    dMY_CXT;
 
     verify_opset(aTHX_ opset,1);               /* croaks on bad opset  */
 
@@ -214,7 +210,7 @@ opmask_add(pTHX_ SV *opset) /* THE ONLY FUNCTION TO EDIT PL_op_mask ITSELF  */
     /* OPCODES ALREADY MASKED ARE NEVER UNMASKED. See opmask_addlocal()        */
 
     bitmask = SvPV(opset, len);
-    for (i=0; i < opset_len; i++) {
+    for (STRLEN i=0; i < opset_len; i++) {
        const U16 bits = bitmask[i];
        if (!bits) {    /* optimise for sparse masks */
            myopcode += 8;
@@ -258,7 +254,6 @@ BOOT:
 {
     MY_CXT_INIT;
     STATIC_ASSERT_STMT(PL_maxo < OP_MASK_BUF_SIZE);
-    opset_len = (PL_maxo + 7) / 8;
     if (opcode_debug >= 1)
        warn("opset_len %ld\n", (long)opset_len);
     op_names_init(aTHX);
@@ -353,7 +348,6 @@ invert_opset(opset)
 CODE:
     {
     char *bitmap;
-    dMY_CXT;
     STRLEN len = opset_len;
 
     opset = sv_2mortal(new_opset(aTHX_ opset));        /* verify and clone opset */
@@ -374,10 +368,10 @@ opset_to_ops(opset, desc = 0)
 PPCODE:
     {
     STRLEN len;
-    int i, j, myopcode;
+    STRLEN i;
+    int j, myopcode;
     const char * const bitmap = SvPV(opset, len);
-    char **names = (desc) ? get_op_descs() : get_op_names();
-    dMY_CXT;
+    const char *const *names = (desc) ? PL_op_desc : PL_op_name;
 
     verify_opset(aTHX_ opset,1);
     for (myopcode=0, i=0; i < opset_len; i++) {
@@ -467,8 +461,7 @@ PPCODE:
     int i;
     STRLEN len;
     SV **args;
-    char **op_desc = get_op_descs(); 
-    dMY_CXT;
+    const char *const *op_desc = PL_op_desc;
 
     /* copy args to a scratch area since we may push output values onto        */
     /* the stack faster than we read values off it if masks are used.  */
@@ -483,8 +476,9 @@ PPCODE:
            XPUSHs(newSVpvn_flags(op_desc[myopcode], strlen(op_desc[myopcode]),
                                  SVs_TEMP));
        }
-       else if (SvPOK(bitspec) && SvCUR(bitspec) == (STRLEN)opset_len) {
-           int b, j;
+        else if (SvPOK(bitspec) && SvCUR(bitspec) == opset_len) {
+            STRLEN b;
+            int j;
            const char * const bitmap = SvPV_nolen_const(bitspec);
            int myopcode = 0;
            for (b=0; b < opset_len; b++) {
index 462b8ed..cc6011d 100644 (file)
@@ -51,7 +51,7 @@ my @names =
       EUSERS EWOULDBLOCK EXDEV FILENAME_MAX F_OK HUPCL ICANON ICRNL IEXTEN
       IGNBRK IGNCR IGNPAR INLCR INPCK INT_MAX INT_MIN ISIG ISTRIP IXOFF IXON
       LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION LC_MEASUREMENT
-      LC_MESSAGES LC_MONETARY LC_NUMERIC LC_PAPER LC_TELEPHONE LC_TIME
+      LC_MESSAGES LC_MONETARY LC_NUMERIC LC_PAPER LC_TELEPHONE LC_TIME LC_NAME
       LINK_MAX LONG_MAX LONG_MIN L_ctermid L_cuserid MAX_CANON
       MAX_INPUT MB_LEN_MAX MSG_CTRUNC MSG_DONTROUTE MSG_EOR MSG_OOB MSG_PEEK
       MSG_TRUNC MSG_WAITALL NAME_MAX NCCS NGROUPS_MAX NOFLSH OPEN_MAX OPOST
index 0f004cb..90c8fcf 100644 (file)
@@ -1,6 +1,9 @@
 #define PERL_EXT_POSIX
 #define PERL_EXT
 
+#if defined(_WIN32) && defined(__GNUC__) /* mingw compiler */
+#define _POSIX_
+#endif
 #define PERL_NO_GET_CONTEXT
 
 #include "EXTERN.h"
@@ -1018,7 +1021,7 @@ static NV my_log2(NV x)
 /* XXX nexttoward */
 
 /* GCC's FLT_ROUNDS is (wrongly) hardcoded to 1 (at least up to 11.x) */
-#if defined(PERL_IS_GCC) /* && __GNUC__ < XXX */
+#if defined(PERL_IS_GCC) /* && __GNUC__ < XXX */ || (defined(__clang__) && defined(__s390x__))
 #  define BROKEN_FLT_ROUNDS
 #endif
 
@@ -1341,9 +1344,6 @@ static NV_PAYLOAD_TYPE S_getpayload(NV nv)
 #include <termios.h>
 #endif
 #include <stdlib.h>
-#ifndef __ultrix__
-#include <string.h>
-#endif
 #include <sys/stat.h>
 #include <sys/types.h>
 #include <time.h>
@@ -1560,77 +1560,6 @@ END_EXTERN_C
 #endif
 #endif
 
-#if ! defined(HAS_LOCALECONV) && ! defined(HAS_LOCALECONV_L)
-#   define localeconv() not_here("localeconv")
-#else
-struct lconv_offset {
-    const char *name;
-    size_t offset;
-};
-
-static const struct lconv_offset lconv_strings[] = {
-#ifdef USE_LOCALE_NUMERIC
-    {"decimal_point",     STRUCT_OFFSET(struct lconv, decimal_point)},
-    {"thousands_sep",     STRUCT_OFFSET(struct lconv, thousands_sep)},
-#  ifndef NO_LOCALECONV_GROUPING
-    {"grouping",          STRUCT_OFFSET(struct lconv, grouping)},
-#  endif
-#endif
-#ifdef USE_LOCALE_MONETARY
-    {"int_curr_symbol",   STRUCT_OFFSET(struct lconv, int_curr_symbol)},
-    {"currency_symbol",   STRUCT_OFFSET(struct lconv, currency_symbol)},
-    {"mon_decimal_point", STRUCT_OFFSET(struct lconv, mon_decimal_point)},
-#  ifndef NO_LOCALECONV_MON_THOUSANDS_SEP
-    {"mon_thousands_sep", STRUCT_OFFSET(struct lconv, mon_thousands_sep)},
-#  endif
-#  ifndef NO_LOCALECONV_MON_GROUPING
-    {"mon_grouping",      STRUCT_OFFSET(struct lconv, mon_grouping)},
-#  endif
-    {"positive_sign",     STRUCT_OFFSET(struct lconv, positive_sign)},
-    {"negative_sign",     STRUCT_OFFSET(struct lconv, negative_sign)},
-#endif
-    {NULL, 0}
-};
-
-#ifdef USE_LOCALE_NUMERIC
-
-/* The Linux man pages say these are the field names for the structure
- * components that are LC_NUMERIC; the rest being LC_MONETARY */
-#   define isLC_NUMERIC_STRING(name) (   strEQ(name, "decimal_point")   \
-                                      || strEQ(name, "thousands_sep")   \
-                                                                        \
-                                      /* There should be no harm done   \
-                                       * checking for this, even if     \
-                                       * NO_LOCALECONV_GROUPING */      \
-                                      || strEQ(name, "grouping"))
-#else
-#   define isLC_NUMERIC_STRING(name) (0)
-#endif
-
-static const struct lconv_offset lconv_integers[] = {
-#ifdef USE_LOCALE_MONETARY
-    {"int_frac_digits",   STRUCT_OFFSET(struct lconv, int_frac_digits)},
-    {"frac_digits",       STRUCT_OFFSET(struct lconv, frac_digits)},
-    {"p_cs_precedes",     STRUCT_OFFSET(struct lconv, p_cs_precedes)},
-    {"p_sep_by_space",    STRUCT_OFFSET(struct lconv, p_sep_by_space)},
-    {"n_cs_precedes",     STRUCT_OFFSET(struct lconv, n_cs_precedes)},
-    {"n_sep_by_space",    STRUCT_OFFSET(struct lconv, n_sep_by_space)},
-    {"p_sign_posn",       STRUCT_OFFSET(struct lconv, p_sign_posn)},
-    {"n_sign_posn",       STRUCT_OFFSET(struct lconv, n_sign_posn)},
-#ifdef HAS_LC_MONETARY_2008
-    {"int_p_cs_precedes",  STRUCT_OFFSET(struct lconv, int_p_cs_precedes)},
-    {"int_p_sep_by_space", STRUCT_OFFSET(struct lconv, int_p_sep_by_space)},
-    {"int_n_cs_precedes",  STRUCT_OFFSET(struct lconv, int_n_cs_precedes)},
-    {"int_n_sep_by_space", STRUCT_OFFSET(struct lconv, int_n_sep_by_space)},
-    {"int_p_sign_posn",    STRUCT_OFFSET(struct lconv, int_p_sign_posn)},
-    {"int_n_sign_posn",    STRUCT_OFFSET(struct lconv, int_n_sign_posn)},
-#endif
-#endif
-    {NULL, 0}
-};
-
-#endif /* HAS_LOCALECONV */
-
 #ifdef HAS_LONG_DOUBLE
 #  if LONG_DOUBLESIZE > NVSIZE
 #    undef HAS_LONG_DOUBLE  /* XXX until we figure out how to use them */
@@ -1819,7 +1748,12 @@ my_tzset(pTHX)
 #endif
         fix_win32_tzenv();
 #endif
+    TZSET_LOCK;
     tzset();
+    TZSET_UNLOCK;
+    /* After the unlock, another thread could change things, but this is a
+     * problem with the Posix API generally, not Perl; and the result will be
+     * self-consistent */
 }
 
 MODULE = SigSet                PACKAGE = POSIX::SigSet         PREFIX = sig
@@ -2124,138 +2058,10 @@ HV *
 localeconv()
     CODE:
 #ifndef HAS_LOCALECONV
-       localeconv(); /* A stub to call not_here(). */
-#else
-       struct lconv *lcbuf;
-#  if defined(USE_ITHREADS)                                             \
-   && defined(HAS_POSIX_2008_LOCALE)                                    \
-   && defined(HAS_LOCALECONV_L) /* Prefer this thread-safe version */
-        bool do_free = FALSE;
-        locale_t cur = NULL;
-#  elif defined(TS_W32_BROKEN_LOCALECONV)
-        const char * save_global;
-        const char * save_thread;
-#  endif
-        DECLARATION_FOR_LC_NUMERIC_MANIPULATION;
-
-        /* localeconv() deals with both LC_NUMERIC and LC_MONETARY, but
-         * LC_MONETARY is already in the correct locale */
-#  ifdef USE_LOCALE_MONETARY
-
-        const bool is_monetary_utf8 = _is_cur_LC_category_utf8(LC_MONETARY);
-#  endif
-#  ifdef USE_LOCALE_NUMERIC
-
-        bool is_numeric_utf8;
-
-        STORE_LC_NUMERIC_FORCE_TO_UNDERLYING();
-
-        is_numeric_utf8 = _is_cur_LC_category_utf8(LC_NUMERIC);
-#  endif
-
-       RETVAL = newHV();
-       sv_2mortal((SV*)RETVAL);
-#  if defined(USE_ITHREADS)                         \
-   && defined(HAS_POSIX_2008_LOCALE)                \
-   && defined(HAS_LOCALECONV_L)
-
-        cur = uselocale((locale_t) 0);
-        if (cur == LC_GLOBAL_LOCALE) {
-            cur = duplocale(LC_GLOBAL_LOCALE);
-            do_free = TRUE;
-        }
-
-        lcbuf = localeconv_l(cur);
-#  else
-        LOCALECONV_LOCK;    /* Prevent interference with other threads using
-                               localeconv() */
-#    ifdef TS_W32_BROKEN_LOCALECONV
-        /* This is a workaround for a Windows bug prior to VS 15, in which
-         * localeconv only looks at the global locale.  We toggle to the global
-         * locale; populate the return; then toggle back.  We have to use
-         * LC_ALL instead of the individual ones because of another bug in
-         * Windows */
-
-        save_thread  = savepv(Perl_setlocale(LC_NUMERIC, NULL));
-
-        _configthreadlocale(_DISABLE_PER_THREAD_LOCALE);
-
-        save_global  = savepv(Perl_setlocale(LC_ALL, NULL));
-
-        Perl_setlocale(LC_ALL,  save_thread);
-#    endif
-        lcbuf = localeconv();
-#  endif
-       if (lcbuf) {
-           const struct lconv_offset *strings = lconv_strings;
-           const struct lconv_offset *integers = lconv_integers;
-           const char *ptr = (const char *) lcbuf;
-
-           while (strings->name) {
-                /* This string may be controlled by either LC_NUMERIC, or
-                 * LC_MONETARY */
-                const bool is_utf8_locale =
-#  if defined(USE_LOCALE_NUMERIC) && defined(USE_LOCALE_MONETARY)
-                                        (isLC_NUMERIC_STRING(strings->name))
-                                        ? is_numeric_utf8
-                                        : is_monetary_utf8;
-#  elif defined(USE_LOCALE_NUMERIC)
-                                        is_numeric_utf8;
-#  elif defined(USE_LOCALE_MONETARY)
-                                        is_monetary_utf8;
-#  else
-                                        FALSE;
-#  endif
-
-               const char *value = *((const char **)(ptr + strings->offset));
-
-               if (value && *value) {
-                    const STRLEN value_len = strlen(value);
-
-                    /* We mark it as UTF-8 if a utf8 locale and is valid and
-                     * variant under UTF-8 */
-                    const bool is_utf8 = is_utf8_locale
-                                     &&  is_utf8_non_invariant_string(
-                                                                (U8*) value,
-                                                                value_len);
-                   (void) hv_store(RETVAL,
-                                    strings->name,
-                                    strlen(strings->name),
-                                    newSVpvn_utf8(value, value_len, is_utf8),
-                                    0);
-            }
-                strings++;
-           }
-
-           while (integers->name) {
-               const char value = *((const char *)(ptr + integers->offset));
-
-               if (value != CHAR_MAX)
-                   (void) hv_store(RETVAL, integers->name,
-                                   strlen(integers->name), newSViv(value), 0);
-                integers++;
-            }
-       }
-#  if defined(USE_ITHREADS)                         \
-   && defined(HAS_POSIX_2008_LOCALE)                \
-   && defined(HAS_LOCALECONV_L)
-        if (do_free) {
-            freelocale(cur);
-        }
-#  else
-#    ifdef TS_W32_BROKEN_LOCALECONV
-        Perl_setlocale(LC_ALL, save_global);
-
-        _configthreadlocale(_ENABLE_PER_THREAD_LOCALE);
-
-        Perl_setlocale(LC_ALL, save_thread);
-
-        Safefree(save_global);
-        Safefree(save_thread);
-#    endif
-        LOCALECONV_UNLOCK;
-#  endif
-        RESTORE_LC_NUMERIC();
+        RETVAL = NULL;
+        not_here("localeconv");
+#else
+        RETVAL = Perl_localeconv(aTHX);
 #endif  /* HAS_LOCALECONV */
     OUTPUT:
        RETVAL
@@ -3383,9 +3189,9 @@ mblen(s, n = ~0)
             memzero(&PL_mbrlen_ps, sizeof(PL_mbrlen_ps));
             RETVAL = 0;
 #else
-            MBLEN_LOCK;
+            MBLEN_LOCK_;
             RETVAL = mblen(NULL, 0);
-            MBLEN_UNLOCK;
+            MBLEN_UNLOCK_;
 #endif
         }
         else {  /* Not resetting state */
@@ -3396,51 +3202,45 @@ mblen(s, n = ~0)
             }
             else {
                 size_t len;
-                char * string = SvPV(byte_s, len);
+                char * string = SvPVbyte(byte_s, len);
                 if (n < len) len = n;
 #ifdef USE_MBRLEN
+                MBRLEN_LOCK_;
                 RETVAL = (SSize_t) mbrlen(string, len, &PL_mbrlen_ps);
+                MBRLEN_UNLOCK_;
                 if (RETVAL < 0) RETVAL = -1;    /* Use mblen() ret code for
                                                    transparency */
 #else
                 /* Locking prevents races, but locales can be switched out
                  * without locking, so this isn't a cure all */
-                MBLEN_LOCK;
+                MBLEN_LOCK_;
                 RETVAL = mblen(string, len);
-                MBLEN_UNLOCK;
+                MBLEN_UNLOCK_;
 #endif
             }
         }
     OUTPUT:
         RETVAL
 
-#if defined(HAS_MBRTOWC) && (defined(USE_ITHREADS) || ! defined(HAS_MBTOWC))
-#  define USE_MBRTOWC
-#else
-#  undef USE_MBRTOWC
-#endif
-
 int
 mbtowc(pwc, s, n = ~0)
        SV *            pwc
        SV *            s
        size_t          n
     CODE:
+        RETVAL = -1;
+#if ! defined(HAS_MBTOWC) && ! defined(HAS_MBRTOWC)
+        PERL_UNUSED_ARG(pwc);
+        PERL_UNUSED_ARG(s);
+        PERL_UNUSED_ARG(n);
+#else
         errno = 0;
         SvGETMAGIC(s);
         if (! SvOK(s)) { /* Initialize state */
-#ifdef USE_MBRTOWC
-            /* Initialize the shift state to all zeros in PL_mbrtowc_ps. */
-            memzero(&PL_mbrtowc_ps, sizeof(PL_mbrtowc_ps));
-            RETVAL = 0;
-#else
-            MBTOWC_LOCK;
-            RETVAL = mbtowc(NULL, NULL, 0);
-            MBTOWC_UNLOCK;
-#endif
+            mbtowc_(NULL, NULL, 0);
         }
         else {  /* Not resetting state */
-            wchar_t wc;
+            wchar_t wc = 0;
             SV * byte_s = sv_2mortal(newSVsv_nomg(s));
             if (! sv_utf8_downgrade_nomg(byte_s, TRUE)) {
                 SETERRNO(EINVAL, LIB_INVARG);
@@ -3448,17 +3248,9 @@ mbtowc(pwc, s, n = ~0)
             }
             else {
                 size_t len;
-                char * string = SvPV(byte_s, len);
+                char * string = SvPVbyte(byte_s, len);
                 if (n < len) len = n;
-#ifdef USE_MBRTOWC
-                RETVAL = (SSize_t) mbrtowc(&wc, string, len, &PL_mbrtowc_ps);
-#else
-                /* Locking prevents races, but locales can be switched out
-                 * without locking, so this isn't a cure all */
-                MBTOWC_LOCK;
-                RETVAL = mbtowc(&wc, string, len);
-                MBTOWC_UNLOCK;
-#endif
+                RETVAL = mbtowc_(&wc, string, len);
                 if (RETVAL >= 0) {
                     sv_setiv_mg(pwc, wc);
                 }
@@ -3467,6 +3259,7 @@ mbtowc(pwc, s, n = ~0)
                 }
             }
         }
+#endif
     OUTPUT:
         RETVAL
 
@@ -3487,23 +3280,27 @@ wctomb(s, wchar)
 #ifdef USE_WCRTOMB
             /* The man pages khw looked at are in agreement that this works.
              * But probably memzero would too */
+            WCRTOMB_LOCK_;
             RETVAL = wcrtomb(NULL, L'\0', &PL_wcrtomb_ps);
+            WCRTOMB_UNLOCK_;
 #else
-            WCTOMB_LOCK;
+            WCTOMB_LOCK_;
             RETVAL = wctomb(NULL, L'\0');
-            WCTOMB_UNLOCK;
+            WCTOMB_UNLOCK_;
 #endif
         }
         else {  /* Not resetting state */
             char buffer[MB_LEN_MAX];
 #ifdef USE_WCRTOMB
+            WCRTOMB_LOCK_;
             RETVAL = wcrtomb(buffer, wchar, &PL_wcrtomb_ps);
+            WCRTOMB_UNLOCK_;
 #else
             /* Locking prevents races, but locales can be switched out without
              * locking, so this isn't a cure all */
-            WCTOMB_LOCK;
+            WCTOMB_LOCK_;
             RETVAL = wctomb(buffer, wchar);
-            WCTOMB_UNLOCK;
+            WCTOMB_UNLOCK_;
 #endif
             if (RETVAL >= 0) {
                 sv_setpvn_mg(s, buffer, RETVAL);
@@ -3516,6 +3313,12 @@ int
 strcoll(s1, s2)
        char *          s1
        char *          s2
+    CODE:
+        LC_COLLATE_LOCK;
+        RETVAL = strcoll(s1, s2);
+        LC_COLLATE_UNLOCK;
+    OUTPUT:
+        RETVAL
 
 void
 strtod(str)
@@ -3631,24 +3434,11 @@ void
 strxfrm(src)
        SV *            src
     CODE:
-       {
-          STRLEN srclen;
-          STRLEN dstlen;
-          STRLEN buflen;
-          char *p = SvPV(src,srclen);
-          srclen++;
-          buflen = srclen * 4 + 1;
-          ST(0) = sv_2mortal(newSV(buflen));
-          dstlen = strxfrm(SvPVX(ST(0)), p, (size_t)buflen);
-          if (dstlen >= buflen) {
-              dstlen++;
-              SvGROW(ST(0), dstlen);
-              strxfrm(SvPVX(ST(0)), p, (size_t)dstlen);
-              dstlen--;
-          }
-          SvCUR_set(ST(0), dstlen);
-           SvPOK_only(ST(0));
-       }
+#ifdef USE_LOCALE_COLLATE
+      ST(0) = Perl_strxfrm(aTHX_ src);
+#else
+      ST(0) = src;
+#endif
 
 SysRet
 mkfifo(filename, mode)
@@ -3730,7 +3520,10 @@ asctime(sec, min, hour, mday, mon, year, wday = 0, yday = 0, isdst = -1)
            mytm.tm_yday = yday;
            mytm.tm_isdst = isdst;
            if (ix) {
-               const time_t result = mktime(&mytm);
+               time_t result;
+                MKTIME_LOCK;
+               result = mktime(&mytm);
+                MKTIME_UNLOCK;
                if (result == (time_t)-1)
                    SvOK_off(TARG);
                else if (result == 0)
@@ -3738,7 +3531,9 @@ asctime(sec, min, hour, mday, mon, year, wday = 0, yday = 0, isdst = -1)
                else
                    sv_setiv(TARG, (IV)result);
            } else {
+                ASCTIME_LOCK;
                sv_setpv(TARG, asctime(&mytm));
+                ASCTIME_UNLOCK;
            }
            ST(0) = TARG;
            XSRETURN(1);
@@ -3788,29 +3583,19 @@ strftime(fmt, sec, min, hour, mday, mon, year, wday = -1, yday = -1, isdst = -1)
        {
            char *buf;
             SV *sv;
+            utf8ness_t is_utf8;
 
             /* allowing user-supplied (rather than literal) formats
              * is normally frowned upon as a potential security risk;
              * but this is part of the API so we have to allow it */
             GCC_DIAG_IGNORE_STMT(-Wformat-nonliteral);
-           buf = my_strftime(SvPV_nolen(fmt), sec, min, hour, mday, mon, year, wday, yday, isdst);
+           buf = my_strftime8_temp(SvPV_nolen(fmt), sec, min, hour, mday, mon, year, wday, yday, isdst, &is_utf8);
             GCC_DIAG_RESTORE_STMT;
             sv = sv_newmortal();
            if (buf) {
                 STRLEN len = strlen(buf);
                sv_usepvn_flags(sv, buf, len, SV_HAS_TRAILING_NUL);
-               if (       SvUTF8(fmt)
-                    || (   is_utf8_non_invariant_string((U8*) buf, len)
-#ifdef USE_LOCALE_TIME
-                        && _is_cur_LC_category_utf8(LC_TIME)
-#else   /* If can't check directly, at least can see if script is consistent,
-           under UTF-8, which gives us an extra measure of confidence. */
-
-                        && isSCRIPT_RUN((const U8 *) buf,
-                                        (const U8 *) buf + len,
-                                        TRUE) /* Means assume UTF-8 */
-#endif
-                )) {
+               if (SvUTF8(fmt) || is_utf8 == UTF8NESS_YES) {
                    SvUTF8_on(sv);
                }
             }
@@ -3835,8 +3620,12 @@ void
 tzname()
     PPCODE:
        EXTEND(SP,2);
+        /* It is undefined behavior if another thread is changing this while
+         * its being read */
+        ENVr_LOCALEr_LOCK;
        PUSHs(newSVpvn_flags(tzname[0], strlen(tzname[0]), SVs_TEMP));
        PUSHs(newSVpvn_flags(tzname[1], strlen(tzname[1]), SVs_TEMP));
+        ENVr_LOCALEr_UNLOCK;
 
 char *
 ctermid(s = 0)
index b8a6257..48b224a 100644 (file)
@@ -4,7 +4,7 @@ use warnings;
 
 our ($AUTOLOAD, %SIGRT);
 
-our $VERSION = '2.03';
+our $VERSION = '2.13';
 
 require XSLoader;
 
@@ -12,7 +12,7 @@ use Fcntl qw(FD_CLOEXEC F_DUPFD F_GETFD F_GETFL F_GETLK F_RDLCK F_SETFD
             F_SETFL F_SETLK F_SETLKW F_UNLCK F_WRLCK O_ACCMODE O_APPEND
             O_CREAT O_EXCL O_NOCTTY O_NONBLOCK O_RDONLY O_RDWR O_TRUNC
             O_WRONLY SEEK_CUR SEEK_END SEEK_SET
-            S_ISBLK S_ISCHR S_ISDIR S_ISFIFO S_ISREG
+            S_ISBLK S_ISCHR S_ISDIR S_ISFIFO S_ISLNK S_ISREG S_ISSOCK
             S_IRGRP S_IROTH S_IRUSR S_IRWXG S_IRWXO S_IRWXU S_ISGID S_ISUID
             S_IWGRP S_IWOTH S_IWUSR S_IXGRP S_IXOTH S_IXUSR);
 
@@ -278,7 +278,7 @@ my %default_export_tags = ( # cf. exports policy below
                creat
                SEEK_CUR SEEK_END SEEK_SET
                S_IRGRP S_IROTH S_IRUSR S_IRWXG S_IRWXO S_IRWXU
-               S_ISBLK S_ISCHR S_ISDIR S_ISFIFO S_ISGID S_ISREG S_ISUID
+               S_ISBLK S_ISCHR S_ISDIR S_ISFIFO S_ISGID S_ISLNK S_ISREG S_ISSOCK S_ISUID
                S_IWGRP S_IWOTH S_IWUSR)],
 
     float_h => [qw(DBL_DIG DBL_EPSILON DBL_MANT_DIG
@@ -307,7 +307,7 @@ my %default_export_tags = ( # cf. exports policy below
 
     locale_h =>        [qw(LC_ALL LC_COLLATE LC_CTYPE LC_MESSAGES
                    LC_MONETARY LC_NUMERIC LC_TIME LC_IDENTIFICATION
-                    LC_MEASUREMENT LC_PAPER LC_TELEPHONE LC_ADDRESS
+                    LC_MEASUREMENT LC_PAPER LC_TELEPHONE LC_ADDRESS LC_NAME
                     LC_SYNTAX LC_TOD NULL
                    localeconv setlocale)],
 
@@ -357,7 +357,7 @@ my %default_export_tags = ( # cf. exports policy below
                strtok strxfrm)],
 
     sys_stat_h => [qw(S_IRGRP S_IROTH S_IRUSR S_IRWXG S_IRWXO S_IRWXU
-               S_ISBLK S_ISCHR S_ISDIR S_ISFIFO S_ISGID S_ISREG
+               S_ISBLK S_ISCHR S_ISDIR S_ISFIFO S_ISGID S_ISLNK S_ISREG S_ISSOCK
                S_ISUID S_IWGRP S_IWOTH S_IWUSR S_IXGRP S_IXOTH S_IXUSR
                fstat mkfifo)],
 
index 75113b1..d3720da 100644 (file)
@@ -10,9 +10,9 @@ POSIX - Perl interface to IEEE Std 1003.1
 
     printf "EINTR is %d\n", EINTR;
 
-    $sess_id = POSIX::setsid();
+    my $sess_id = POSIX::setsid();
 
-    $fd = POSIX::open($path, O_CREAT|O_EXCL|O_WRONLY, 0644);
+    my $fd = POSIX::open($path, O_CREAT|O_EXCL|O_WRONLY, 0644);
        # note: that's a filedescriptor, *NOT* a filehandle
 
 =head1 DESCRIPTION
@@ -501,7 +501,7 @@ than the explicit two operations [C99].  Added in Perl v5.22.
 Maximum of C<x> and C<y>, except when either is C<NaN>, returns the other [C99].
 Added in Perl v5.22.
 
- my $min = POSIX::fmax($x, $y);
+ my $max = POSIX::fmax($x, $y);
 
 =item C<fmin>
 
@@ -1015,6 +1015,18 @@ Here is how to query the database for the B<de> (Deutsch or German) locale.
 The members whose names begin with C<int_p_> and C<int_n_> were added by
 POSIX.1-2008 and are only available on systems that support them.
 
+A value of -1 returned for numeric entries indicates that the field is
+not applicable to the locale.  This is rare except in the C and related
+locales, which don't have most monetary values defined.  It can also
+happen, quirkily, in fields that are otherwise boolean to indicate that
+the value is kind of neither true nor false.  This happens in C<p_cs_precedes>
+and C<int_p_cs_precedes> when the currency symbol neither precedes nor
+succeeds a positive value but is infixed, by replacing the radix
+character.
+
+Prior to Perl v5.37.7, empty string fields and numeric fields with value
+-1 were omittted from the returned hash.
+
 =item C<localtime>
 
 This is identical to Perl's builtin C<localtime()> function for
@@ -1134,9 +1146,10 @@ parameter is stored.  The optional third parameter is ignored if it is
 larger than the actual length of the second parameter string.
 
 Use C<undef> as the second parameter to this function to get the effect
-of passing NULL as the second parameter to C<mbtowc>.  This resets any
-shift state to its initial value.  The return value is undefined if
-C<mbrtowc> was substituted, so you should never rely on it.
+of passing NULL as the second parameter to C<mbtowc>.  This ignores the
+first parameter, and resets any shift state to its initial value.  The
+return value is undefined if C<mbrtowc> was substituted, so you should
+never rely on it.
 
 When the second parameter is a scalar containing a value that either is
 a PV string or can be forced into one, the return value is the number of
@@ -1827,7 +1840,7 @@ about these and the other arguments.
 
 If you want your code to be portable, your format (C<fmt>) argument
 should use only the conversion specifiers defined by the ANSI C
-standard (C89, to play safe).  These are C<aAbBcdHIjmMpSUwWxXyYZ%>.
+standard (C99, to play safe).  These are C<aAbBcdHIjmMpSUwWxXyYZ%>.
 But even then, the B<results> of some of the conversion specifiers are
 non-portable.  For example, the specifiers C<aAbBcpZ> change according
 to the locale settings of the user, and both how to set locales (the
@@ -1972,9 +1985,14 @@ Used with C<eq> or C<cmp> as an alternative to C<L</strcoll>>.
 Not really needed since Perl can do this transparently, see
 L<perllocale>.
 
-Beware that in a UTF-8 locale, anything you pass to this function must
-be in UTF-8; and when not in a UTF-8 locale, anything passed must not be
-UTF-8 encoded.
+Unlike the libc C<strxfrm>, this allows NUL characters in the input
+C<$src>.
+
+It doesn't make sense for a string to be encoded in one locale (say,
+ISO-8859-6, Arabic) and to collate it based on another (like ISO-8859-7,
+Greek).  Perl assumes that the current C<LC_CTYPE> locale correctly
+represents the encoding of C<$src>, and ignores the value of
+C<LC_COLLATE>.
 
 =item C<sysconf>
 
@@ -2197,9 +2215,10 @@ L</mblen> and L</mbtowc> may be used to roll your own decoding/encoding
 of other types of multi-byte locales.
 
 Use C<undef> as the first parameter to this function to get the effect
-of passing NULL as the first parameter to C<wctomb>.  This resets any
-shift state to its initial value.  The return value is undefined if
-C<wcrtomb> was substituted, so you should never rely on it.
+of passing NULL as the first parameter to C<wctomb>.  This ignores the
+second parameter, and resets any shift state to its initial value.  The
+return value is undefined if C<wcrtomb> was substituted, so you should
+never rely on it.
 
 When the first parameter is a scalar, the code point contained in the
 scalar second parameter is converted into a multi-byte string and stored
@@ -2740,7 +2759,7 @@ C<S_IWUSR> C<S_IXGRP> C<S_IXOTH> C<S_IXUSR>
 
 =item Macros
 
-C<S_ISBLK> C<S_ISCHR> C<S_ISDIR> C<S_ISFIFO> C<S_ISREG>
+C<S_ISBLK> C<S_ISCHR> C<S_ISDIR> C<S_ISFIFO> C<S_ISLNK> C<S_ISREG> C<S_ISSOCK>
 
 =back
 
index 12eac2d..1f9ff7b 100644 (file)
@@ -48,7 +48,7 @@ my %expect = (
             INT_MAX INT_MIN ISIG ISTRIP IXOFF IXON
             LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION
             LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NUMERIC LC_PAPER
-            LC_TELEPHONE LC_TIME LC_SYNTAX LC_TOD LDBL_DIG
+            LC_TELEPHONE LC_TIME LC_NAME LC_SYNTAX LC_TOD LDBL_DIG
             LDBL_EPSILON LDBL_MANT_DIG LDBL_MAX LDBL_MAX_10_EXP
             LDBL_MAX_EXP LDBL_MIN LDBL_MIN_10_EXP LDBL_MIN_EXP LINK_MAX
             LONG_MAX LONG_MIN L_ctermid L_cuserid MAX_CANON
@@ -66,7 +66,7 @@ my %expect = (
             SIG_IGN SIG_SETMASK SIG_UNBLOCK SSIZE_MAX STDERR_FILENO
             STDIN_FILENO STDOUT_FILENO STREAM_MAX S_IRGRP S_IROTH S_IRUSR
             S_IRWXG S_IRWXO S_IRWXU S_ISBLK S_ISCHR S_ISDIR S_ISFIFO
-            S_ISGID S_ISREG S_ISUID S_IWGRP S_IWOTH S_IWUSR S_IXGRP
+            S_ISGID S_ISLNK S_ISREG S_ISSOCK S_ISUID S_IWGRP S_IWOTH S_IWUSR S_IXGRP
             S_IXOTH S_IXUSR TCIFLUSH TCIOFF TCIOFLUSH TCION TCOFLUSH
             TCOOFF TCOON TCSADRAIN TCSAFLUSH TCSANOW TMP_MAX TOSTOP
             TZNAME_MAX UCHAR_MAX UINT_MAX ULONG_MAX USHRT_MAX VEOF VEOL
index f200a89..117fa5e 100644 (file)
@@ -373,10 +373,9 @@ SKIP: {
                currency_symbol mon_decimal_point mon_thousands_sep
                mon_grouping positive_sign negative_sign)) {
     SKIP: {
-           skip("localeconv has no result for $_", 1)
-               unless exists $conv->{$_};
-           unlike(delete $conv->{$_}, qr/\A\z/,
-                  "localeconv returned a non-empty string for $_");
+           my $value = delete $conv->{$_};
+           skip("localeconv '$_' may be empty", 1) if $_ ne 'decimal_point';
+           isnt($value, "", "localeconv returned a non-empty string for $_");
        }
     }
 
@@ -399,8 +398,6 @@ SKIP: {
 
     foreach (@lconv) {
     SKIP: {
-           skip("localeconv has no result for $_", 1)
-               unless exists $conv->{$_};
            like(delete $conv->{$_}, qr/\A-?\d+\z/,
                 "localeconv returned an integer for $_");
        }
index 959bff4..089569d 100644 (file)
@@ -115,10 +115,11 @@ Functions for filehandles, files, or directories:
 Keywords related to the control flow of your Perl program:
      __FILE__, __LINE__, __PACKAGE__, __SUB__, break, caller,
      continue, die, do, dump, eval, evalbytes, exit, goto,
-     last, next, redo, return, sub, wantarray
+     last, method, next, redo, return, sub, wantarray
 
 Keywords related to scoping:
-     caller, import, local, my, our, package, state, use
+     caller, class, field, import, local, my, our, package,
+     state, use
 
 Miscellaneous functions:
      defined, formline, lock, prototype, reset, scalar, undef
@@ -132,8 +133,8 @@ Keywords related to Perl modules:
      do, import, no, package, require, use
 
 Keywords related to classes and object-orientation:
-     bless, dbmclose, dbmopen, package, ref, tie, tied, untie,
-     use
+     bless, class, dbmclose, dbmopen, field, method, package,
+     ref, tie, tied, untie, use
 
 Low-level socket functions:
      accept, bind, connect, getpeername, getsockname,
index 7d1d232..e93b102 100644 (file)
@@ -25,6 +25,43 @@ pod2html takes the following arguments:
 
 =over 4
 
+=item backlink
+
+  --backlink
+  --nobacklink
+
+Turn =head1 directives into links pointing to the top of the HTML file.
+--nobacklink (which is the default behavior) does not create these backlinks.
+
+=item cachedir
+
+  --cachedir=name
+
+Specify which directory is used for storing cache. Default directory is the
+current working directory.
+
+=item css
+
+  --css=URL
+
+Specify the URL of cascading style sheet to link from resulting HTML file.
+Default is none style sheet.
+
+=item flush
+
+  --flush
+
+Flush the cache.
+
+=item header
+
+  --header
+  --noheader
+
+Create header and footer blocks containing the text of the "NAME" section.
+--noheader -- which is the default behavior -- does not create header or footer
+blocks.
+
 =item help
 
   --help
@@ -53,6 +90,22 @@ Do not use this if relative links are desired: use --htmldir instead.
 
 Do not pass both this and --htmldir to pod2html; they are mutually exclusive.
 
+=item index
+
+  --index
+
+Generate an index at the top of the HTML file (default behaviour).
+
+=over 4
+
+=item noindex
+
+  --noindex
+
+Do not generate an index at the top of the HTML file.
+
+=back
+
 =item infile
 
   --infile=name
@@ -67,11 +120,14 @@ infile is specified.
 Specify the HTML file to create.  Output goes to STDOUT if no outfile
 is specified.
 
-=item podroot
+=item poderrors
 
-  --podroot=name
+  --poderrors
+  --nopoderrors
 
-Specify the base directory for finding library pods.
+Include a "POD ERRORS" section in the outfile if there were any POD errors in
+the infile (default behaviour).  --nopoderrors does not create this "POD
+ERRORS" section.
 
 =item podpath
 
@@ -80,90 +136,28 @@ Specify the base directory for finding library pods.
 Specify which subdirectories of the podroot contain pod files whose
 HTML converted forms can be linked-to in cross-references.
 
-=item cachedir
-
-  --cachedir=name
-
-Specify which directory is used for storing cache. Default directory is the
-current working directory.
-
-=item flush
-
-  --flush
-
-Flush the cache.
-
-=item backlink
-
-  --backlink
-
-Turn =head1 directives into links pointing to the top of the HTML file.
-
-=item nobacklink
-
-  --nobacklink
-
-Do not turn =head1 directives into links pointing to the top of the HTML file
-(default behaviour).
-
-=item header
-
-  --header
-
-Create header and footer blocks containing the text of the "NAME" section.
-
-=item noheader
-
-  --noheader
-
-Do not create header and footer blocks containing the text of the "NAME"
-section (default behaviour).
-
-=item poderrors
-
-  --poderrors
-
-Include a "POD ERRORS" section in the outfile if there were any POD errors in
-the infile (default behaviour).
-
-=item nopoderrors
-
-  --nopoderrors
-
-Do not include a "POD ERRORS" section in the outfile if there were any POD
-errors in the infile.
-
-=item index
-
-  --index
+=item podroot
 
-Generate an index at the top of the HTML file (default behaviour).
+  --podroot=name
 
-=item noindex
+Specify the base directory for finding library pods.
 
-  --noindex
+=item quiet
 
-Do not generate an index at the top of the HTML file.
+  --quiet
+  --noquiet
 
+Don't display mostly harmless warning messages.  --noquiet -- which is the
+default behavior -- I<does> display these mostly harmless warning messages (but
+this is not the same as "verbose" mode).
 
 =item recurse
 
   --recurse
-
-Recurse into subdirectories specified in podpath (default behaviour).
-
-=item norecurse
-
   --norecurse
 
-Do not recurse into subdirectories specified in podpath.
-
-=item css
-
-  --css=URL
-
-Specify the URL of cascading style sheet to link from resulting HTML file.
-Default is none style sheet.
+Recurse into subdirectories specified in podpath (default behaviour).
+--norecurse does not recurse into these subdirectories.
 
 =item title
 
@@ -171,30 +165,13 @@ Default is none style sheet.
 
 Specify the title of the resulting HTML file.
 
-=item quiet
-
-  --quiet
-
-Don't display mostly harmless warning messages.
-
-=item noquiet
-
-  --noquiet
-
-Display mostly harmless warning messages (default behaviour). But this is not
-the same as "verbose" mode.
-
 =item verbose
 
   --verbose
-
-Display progress messages.
-
-=item noverbose
-
   --noverbose
 
-Do not display progress messages (default behaviour).
+Display progress messages. --noverbose -- which is the default behavior --
+does not display these progress messages.
 
 =back
 
index a9b0d5e..7c568f9 100644 (file)
@@ -2,10 +2,9 @@ package Pod::Html;
 use strict;
 use Exporter 'import';
 
-our $VERSION = 1.33;
+our $VERSION = 1.34;
 $VERSION = eval $VERSION;
-our @EXPORT = qw(pod2html htmlify);
-our @EXPORT_OK = qw(anchorify relativize_url);
+our @EXPORT = qw(pod2html);
 
 use Config;
 use Cwd;
@@ -195,7 +194,7 @@ Display progress messages.  By default, they won't be displayed.
 
 =back
 
-=head2 Auxiliary Functions
+=head2 Formerly Exported Auxiliary Functions
 
 Prior to perl-5.36, the following three functions were exported by
 F<Pod::Html>, either by default or on request:
@@ -213,10 +212,8 @@ F<Pod::Html>, either by default or on request:
 The definition and documentation of these functions have been moved to
 F<Pod::Html::Util>, viewable via C<perldoc Pod::Html::Util>.
 
-In perl-5.36, these functions will be importable from either F<Pod::Html> or
-F<Pod::Html::Util>.  However, beginning with perl-5.38 they will only be
-importable, upon request, from F<Pod::Html::Util>.  Please modify your code as
-needed.
+Beginning with perl-5.38 these functions must be explicitly imported from
+F<Pod::Html::Util>.  Please modify your code as needed.
 
 =head1 ENVIRONMENT
 
diff --git a/gnu/usr.bin/perl/ext/Pod-Html/t/anchorify-536.t b/gnu/usr.bin/perl/ext/Pod-Html/t/anchorify-536.t
deleted file mode 100644 (file)
index e8e01ea..0000000
+++ /dev/null
@@ -1,114 +0,0 @@
-use strict;
-use warnings;
-use Pod::Html qw( anchorify relativize_url );
-my ($revision,$version,$subversion) = split /\./, sprintf("%vd",$^V);
-use Test::More;
-unless ($version == 35 or $version == 36) {
-    plan skip_all => "Needed only during 5.36";
-}
-
-my @filedata;
-{
-    local $/ = '';
-    @filedata = <DATA>;
-}
-
-my (@poddata, $i, $j);
-for ($i = 0, $j = -1; $i <= $#filedata; $i++) {
-    $j++ if ($filedata[$i] =~ /^\s*=head[1-6]/);
-    if ($j >= 0) {
-        $poddata[$j]  = "" unless defined $poddata[$j];
-        $poddata[$j] .= "\n$filedata[$i]" if $j >= 0;
-    }
-}
-
-my %heads = ();
-foreach $i (0..$#poddata) {
-    $heads{anchorify($1)} = 1 if $poddata[$i] =~ /=head[1-6]\s+(.*)/;
-}
-my %expected = map { $_ => 1 } qw(
-    NAME
-    DESCRIPTION
-    Subroutine
-    Error
-    Method
-    Has_A_Wordspace
-    HasTrailingWordspace
-    HasLeadingWordspace
-    Has_Extra_InternalWordspace
-    Has_Quotes
-    Has_QuestionMark
-    Has_Hyphen_And_Space
-);
-is_deeply(
-    \%heads,
-    \%expected,
-    "Got expected POD heads"
-);
-
-{
-    # adapted from 'installhtml'
-    my $file = '/home/username/tmp/installhtml/pod/perlipc';
-    my $capture = 'NAME';
-    my $expected_url = '/home/username/tmp/installhtml/pod/perlipc/NAME.html';
-    my $expected_relativized_url = 'perlipc/NAME.html';
-    my $url = "$file/@{[anchorify(qq($capture))]}.html" ;
-    is($url, $expected_url, "anchorify() returned expected value");
-    my $relativized_url = relativize_url( $url, "$file.html" );
-    is($relativized_url, $expected_relativized_url, "relativize_url() returned expected value");
-}
-
-done_testing;
-
-__DATA__
-=head1 NAME
-
-anchorify - Test C<Pod::Html::Util::anchorify()>
-
-=head1 DESCRIPTION
-
-alpha
-
-=head2 Subroutine
-
-beta
-
-=head3 Error
-
-gamma
-
-=head4 Method
-
-delta
-
-=head4 Has A Wordspace
-
-delta
-
-=head4 HasTrailingWordspace  
-
-epsilon
-
-=head4    HasLeadingWordspace
-
-zeta
-
-=head4 Has     Extra  InternalWordspace
-
-eta
-
-=head4 Has"Quotes"
-
-theta
-
-=head4 Has?QuestionMark
-
-iota
-
-=head4 Has-Hyphen And Space
-
-kappa
-
-=cut
-
-__END__
index 30e380a..6ba1ab8 100644 (file)
@@ -7,7 +7,7 @@ require Tie::Hash;
 require XSLoader;
 
 our @ISA = qw(Tie::Hash);
-our $VERSION = "1.15";
+our $VERSION = "1.17";
 
 our @EXPORT_OK = qw(PAGFEXT DIRFEXT PAIRMAX);
 use Exporter "import";
index 9cf48fa..9962e0c 100644 (file)
@@ -20,7 +20,7 @@ static char *usage = "%s [-R] cat | look |... dbmname";
 #define DLOOK  1
 #define DINSERT        2
 #define DDELETE 3
-#define        DCAT    4
+#define DCAT    4
 #define DBUILD 5
 #define DPRESS 6
 #define DCREAT 7
index 7cf07d7..c27c535 100644 (file)
@@ -43,6 +43,11 @@ extern Free_t free(Malloc_t);
 
 const datum nullitem = {0, 0};
 
+#ifdef WIN32
+#  undef lseek
+#  define lseek _lseeki64
+#endif
+
 /*
  * forward
  */
@@ -59,8 +64,8 @@ static int makroom(DBM *, long, int);
 #define exhash(item)   sdbm_hash((item).dptr, (item).dsize)
 #define ioerr(db)      ((db)->flags |= DBM_IOERR)
 
-#define OFF_PAG(off)   (long) (off) * PBLKSIZ
-#define OFF_DIR(off)   (long) (off) * DBLKSIZ
+#define OFF_PAG(off)   (Off_t) (off) * PBLKSIZ
+#define OFF_DIR(off)   (Off_t) (off) * DBLKSIZ
 
 static const long masks[] = {
         000000000000, 000000000001, 000000000003, 000000000007,
@@ -291,7 +296,7 @@ makroom(DBM *db, long int hash, int need)
         char twin[PBLKSIZ];
 #if defined(DOSISH) || defined(WIN32)
         char zer[PBLKSIZ];
-        long oldtail;
+        Off_t oldtail;
 #endif
         char *pag = db->pagbuf;
         char *New = twin;
index ffecefd..8e4f41f 100644 (file)
@@ -15,7 +15,7 @@ use warnings ();
 our $host;
 
 BEGIN {
-    $VERSION = '1.24';
+    $VERSION = '1.25';
     {
        local $SIG{__DIE__};
        eval {
@@ -131,7 +131,7 @@ Sys::Hostname - Try every conceivable way to get hostname
 =head1 SYNOPSIS
 
     use Sys::Hostname;
-    $host = hostname;
+    my $host = hostname;
 
 =head1 DESCRIPTION
 
index 85787d1..fb0aa47 100644 (file)
@@ -4,7 +4,7 @@ use strict;
 use warnings;
 use Carp;
 
-our $VERSION = '1.22';
+our $VERSION = '1.32';
 
 require XSLoader;
 
index 4cdcc2a..bb6eaa1 100644 (file)
@@ -23,6 +23,16 @@ typedef PerlIO * OutputStream;
 #define croak_fail_nep(h, w) croak("fail %p!=%p at " __FILE__ " line %d", (h), (w), __LINE__)
 #define croak_fail_nei(h, w) croak("fail %d!=%d at " __FILE__ " line %d", (int)(h), (int)(w), __LINE__)
 
+/* assumes that there is a 'failed' variable in scope */
+#define TEST_EXPR(s) STMT_START {           \
+    if (s) {                                \
+        printf("# ok: %s\n", #s);           \
+    } else {                                \
+        printf("# not ok: %s\n", #s);       \
+        failed++;                           \
+    }                                       \
+} STMT_END
+
 #if IVSIZE == 8
 #  define TEST_64BIT 1
 #else
@@ -115,8 +125,19 @@ S_myset_set(pTHX_ SV* sv, MAGIC* mg)
     return 0;
 }
 
+static int
+S_myset_set_dies(pTHX_ SV* sv, MAGIC* mg)
+{
+    PERL_UNUSED_ARG(sv);
+    PERL_UNUSED_ARG(mg);
+    croak("in S_myset_set_dies");
+    return 0;
+}
+
+
 static MGVTBL vtbl_foo, vtbl_bar;
 static MGVTBL vtbl_myset = { 0, S_myset_set, 0, 0, 0, 0, 0, 0 };
+static MGVTBL vtbl_myset_dies = { 0, S_myset_set_dies, 0, 0, 0, 0, 0, 0 };
 
 static int
 S_mycopy_copy(pTHX_ SV *sv, MAGIC* mg, SV *nsv, const char *name, I32 namlen) {
@@ -1443,8 +1464,62 @@ my_ck_rv2cv(pTHX_ OP *o)
     return old_ck_rv2cv(aTHX_ o);
 }
 
+#define test_bool_internals_macro(true_sv, false_sv) \
+    test_bool_internals_func(true_sv, false_sv,\
+        #true_sv " and " #false_sv)
+
+U32
+test_bool_internals_func(SV *true_sv, SV *false_sv, const char *msg) {
+    U32 failed = 0;
+    printf("# Testing '%s'\n", msg);
+    TEST_EXPR(SvCUR(true_sv) == 1);
+    TEST_EXPR(SvCUR(false_sv) == 0);
+    TEST_EXPR(SvLEN(true_sv) == 0);
+    TEST_EXPR(SvLEN(false_sv) == 0);
+    TEST_EXPR(SvIV(true_sv) == 1);
+    TEST_EXPR(SvIV(false_sv) == 0);
+    TEST_EXPR(SvIsCOW(true_sv));
+    TEST_EXPR(SvIsCOW(false_sv));
+    TEST_EXPR(strEQ(SvPV_nolen(true_sv),"1"));
+    TEST_EXPR(strEQ(SvPV_nolen(false_sv),""));
+    TEST_EXPR(SvIOK(true_sv));
+    TEST_EXPR(SvIOK(false_sv));
+    TEST_EXPR(SvPOK(true_sv));
+    TEST_EXPR(SvPOK(false_sv));
+    TEST_EXPR(SvBoolFlagsOK(true_sv));
+    TEST_EXPR(SvBoolFlagsOK(false_sv));
+    TEST_EXPR(SvTYPE(true_sv) >= SVt_PVNV);
+    TEST_EXPR(SvTYPE(false_sv) >= SVt_PVNV);
+    TEST_EXPR(SvBoolFlagsOK(true_sv) && BOOL_INTERNALS_sv_isbool(true_sv));
+    TEST_EXPR(SvBoolFlagsOK(false_sv) && BOOL_INTERNALS_sv_isbool(false_sv));
+    TEST_EXPR(SvBoolFlagsOK(true_sv) && BOOL_INTERNALS_sv_isbool_true(true_sv));
+    TEST_EXPR(SvBoolFlagsOK(false_sv) && BOOL_INTERNALS_sv_isbool_false(false_sv));
+    TEST_EXPR(SvBoolFlagsOK(true_sv) && !BOOL_INTERNALS_sv_isbool_false(true_sv));
+    TEST_EXPR(SvBoolFlagsOK(false_sv) && !BOOL_INTERNALS_sv_isbool_true(false_sv));
+    TEST_EXPR(SvTRUE(true_sv));
+    TEST_EXPR(!SvTRUE(false_sv));
+    if (failed) {
+        PerlIO_printf(Perl_debug_log, "# '%s' the tested true_sv:\n", msg);
+        sv_dump(true_sv);
+        PerlIO_printf(Perl_debug_log, "# PL_sv_yes:\n");
+        sv_dump(&PL_sv_yes);
+        PerlIO_printf(Perl_debug_log, "# '%s' tested false_sv:\n",msg);
+        sv_dump(false_sv);
+        PerlIO_printf(Perl_debug_log, "# PL_sv_no:\n");
+        sv_dump(&PL_sv_no);
+    }
+    fflush(stdout);
+    SvREFCNT_dec(true_sv);
+    SvREFCNT_dec(false_sv);
+    return failed;
+}
 #include "const-c.inc"
 
+void
+destruct_test(pTHX_ void *p) {
+    warn("In destruct_test: %" SVf "\n", (SV*)p);
+}
+
 MODULE = XS::APItest            PACKAGE = XS::APItest
 
 INCLUDE: const-xs.inc
@@ -1657,6 +1732,18 @@ test_uvchr_to_utf8_flags_msgs(uv, flags)
 
 MODULE = XS::APItest:Overload   PACKAGE = XS::APItest::Overload
 
+void
+does_amagic_apply(sv, method, flags)
+    SV *sv
+    int method
+    int flags
+    PPCODE:
+        if(Perl_amagic_applies(aTHX_ sv, method, flags))
+            XSRETURN_YES;
+        else
+            XSRETURN_NO;
+
+
 void
 amagic_deref_call(sv, what)
         SV *sv
@@ -2404,7 +2491,7 @@ mpushp()
         EXTEND(SP, 3);
         mPUSHp("one", 3);
         mPUSHp("two", 3);
-        mPUSHp("three", 5);
+        mPUSHpvs("three");
         XSRETURN(3);
 
 void
@@ -2439,7 +2526,7 @@ mxpushp()
         PPCODE:
         mXPUSHp("one", 3);
         mXPUSHp("two", 3);
-        mXPUSHp("three", 5);
+        mXPUSHpvs("three");
         XSRETURN(3);
 
 void
@@ -2484,19 +2571,27 @@ test_EXTEND(max_offset, nsv, use_ss)
     SV  *nsv;
     bool use_ss;
 PREINIT:
-    SV **sp = PL_stack_max + max_offset;
+    SV **new_sp = PL_stack_max + max_offset;
+    SSize_t new_offset = new_sp - PL_stack_base;
 PPCODE:
     if (use_ss) {
         SSize_t n = (SSize_t)SvIV(nsv);
-        EXTEND(sp, n);
-        *(sp + n) = NULL;
+        EXTEND(new_sp, n);
+        new_sp = PL_stack_base + new_offset;
+        assert(new_sp + n <= PL_stack_max);
+        if ((new_sp + n) > PL_stack_sp)
+            *(new_sp + n) = NULL;
     }
     else {
         IV n = SvIV(nsv);
-        EXTEND(sp, n);
-        *(sp + n) = NULL;
+        EXTEND(new_sp, n);
+        new_sp = PL_stack_base + new_offset;
+        assert(new_sp + n <= PL_stack_max);
+        if ((new_sp + n) > PL_stack_sp)
+            *(new_sp + n) = NULL;
     }
-    *PL_stack_max = NULL;
+    if (PL_stack_max > PL_stack_sp)
+        *PL_stack_max = NULL;
 
 
 void
@@ -4251,7 +4346,7 @@ CODE:
 SV *
 HvENAME(HV *hv)
 CODE:
-    RETVAL = hv && HvENAME(hv)
+    RETVAL = hv && HvHasENAME(hv)
               ? newSVpvn_flags(
                   HvENAME(hv),HvENAMELEN(hv),
                   (HvENAMEUTF8(hv) ? SVf_UTF8 : 0)
@@ -4281,30 +4376,44 @@ OUTPUT:
     RETVAL
 
 char *
-SvPVbyte(SV *sv)
+SvPVbyte(SV *sv, OUT STRLEN len)
+CODE:
+    RETVAL = SvPVbyte(sv, len);
+OUTPUT:
+    RETVAL
+
+char *
+SvPVbyte_nolen(SV *sv)
 CODE:
     RETVAL = SvPVbyte_nolen(sv);
 OUTPUT:
     RETVAL
 
 char *
-SvPVbyte_nomg(SV *sv)
+SvPVbyte_nomg(SV *sv, OUT STRLEN len)
+CODE:
+    RETVAL = SvPVbyte_nomg(sv, len);
+OUTPUT:
+    RETVAL
+
+char *
+SvPVutf8(SV *sv, OUT STRLEN len)
 CODE:
-    RETVAL = SvPVbyte_nomg(sv, PL_na);
+    RETVAL = SvPVutf8(sv, len);
 OUTPUT:
     RETVAL
 
 char *
-SvPVutf8(SV *sv)
+SvPVutf8_nolen(SV *sv)
 CODE:
     RETVAL = SvPVutf8_nolen(sv);
 OUTPUT:
     RETVAL
 
 char *
-SvPVutf8_nomg(SV *sv)
+SvPVutf8_nomg(SV *sv, OUT STRLEN len)
 CODE:
-    RETVAL = SvPVutf8_nomg(sv, PL_na);
+    RETVAL = SvPVutf8_nomg(sv, len);
 OUTPUT:
     RETVAL
 
@@ -4418,6 +4527,20 @@ sv_mortalcopy(SV *sv)
 SV *
 newRV(SV *sv)
 
+SV *
+newAVav(AV *av)
+    CODE:
+        RETVAL = newRV_noinc((SV *)newAVav(av));
+    OUTPUT:
+        RETVAL
+
+SV *
+newAVhv(HV *hv)
+    CODE:
+        RETVAL = newRV_noinc((SV *)newAVhv(hv));
+    OUTPUT:
+        RETVAL
+
 void
 alias_av(AV *av, IV ix, SV *sv)
     CODE:
@@ -4577,6 +4700,27 @@ test_MAX_types()
     OUTPUT:
         RETVAL
 
+SV *
+test_HvNAMEf(sv)
+    SV *sv
+    CODE:
+        if (!sv_isobject(sv)) XSRETURN_UNDEF;
+        HV *pkg = SvSTASH(SvRV(sv));
+        RETVAL = newSVpvf("class='%" HvNAMEf "'", pkg);
+    OUTPUT:
+        RETVAL
+
+SV *
+test_HvNAMEf_QUOTEDPREFIX(sv)
+    SV *sv
+    CODE:
+        if (!sv_isobject(sv)) XSRETURN_UNDEF;
+        HV *pkg = SvSTASH(SvRV(sv));
+        RETVAL = newSVpvf("class=%" HvNAMEf_QUOTEDPREFIX, pkg);
+    OUTPUT:
+        RETVAL
+
+
 bool
 sv_numeq(SV *sv1, SV *sv2)
     CODE:
@@ -4637,16 +4781,22 @@ void
 sv_magic_foo(SV *sv, SV *thingy)
 ALIAS:
     sv_magic_bar = 1
+    sv_magic_baz = 2
 CODE:
-    sv_magicext(SvRV(sv), NULL, PERL_MAGIC_ext, ix ? &vtbl_bar : &vtbl_foo, (const char *)thingy, 0);
+    sv_magicext(sv, NULL, ix == 2 ? PERL_MAGIC_extvalue : PERL_MAGIC_ext, ix ? &vtbl_bar : &vtbl_foo, (const char *)thingy, 0);
 
 SV *
 mg_find_foo(SV *sv)
 ALIAS:
     mg_find_bar = 1
+    mg_find_baz = 2
 CODE:
-    MAGIC *mg = mg_findext(SvRV(sv), PERL_MAGIC_ext, ix ? &vtbl_bar : &vtbl_foo);
-    RETVAL = mg ? SvREFCNT_inc((SV *)mg->mg_ptr) : &PL_sv_undef;
+       RETVAL = &PL_sv_undef;
+       if (SvTYPE(sv) >= SVt_PVMG) {
+               MAGIC *mg = mg_findext(sv, ix == 2 ? PERL_MAGIC_extvalue : PERL_MAGIC_ext, ix ? &vtbl_bar : &vtbl_foo);
+               if (mg)
+                       RETVAL = SvREFCNT_inc((SV *)mg->mg_ptr);
+       }
 OUTPUT:
     RETVAL
 
@@ -4654,13 +4804,14 @@ void
 sv_unmagic_foo(SV *sv)
 ALIAS:
     sv_unmagic_bar = 1
+    sv_unmagic_baz = 2
 CODE:
-    sv_unmagicext(SvRV(sv), PERL_MAGIC_ext, ix ? &vtbl_bar : &vtbl_foo);
+    sv_unmagicext(sv, ix == 2 ? PERL_MAGIC_extvalue : PERL_MAGIC_ext, ix ? &vtbl_bar : &vtbl_foo);
 
 void
 sv_magic(SV *sv, SV *thingy)
 CODE:
-    sv_magic(SvRV(sv), NULL, PERL_MAGIC_ext, (const char *)thingy, 0);
+    sv_magic(sv, NULL, PERL_MAGIC_ext, (const char *)thingy, 0);
 
 UV
 test_get_vtbl()
@@ -4711,6 +4862,13 @@ test_get_vtbl()
     # attach ext magic to the SV pointed to by rsv that only has set magic,
     # where that magic's job is to increment thingy
 
+void
+sv_magic_myset_dies(SV *rsv, SV *thingy)
+CODE:
+    sv_magicext(SvRV(rsv), NULL, PERL_MAGIC_ext, &vtbl_myset_dies,
+        (const char *)thingy, 0);
+
+
 void
 sv_magic_myset(SV *rsv, SV *thingy)
 CODE:
@@ -4736,6 +4894,43 @@ sv_magic_mycopy_count(SV *rsv)
     OUTPUT:
         RETVAL
 
+int
+my_av_store(SV *rsv, IV i, SV *sv)
+    CODE:
+        if (av_store((AV*)SvRV(rsv), i, sv)) {
+            SvREFCNT_inc(sv);
+            RETVAL = 1;
+        } else {
+            RETVAL = 0;
+        }
+    OUTPUT:
+        RETVAL
+
+STRLEN
+sv_refcnt(SV *sv)
+    CODE:
+        RETVAL = SvREFCNT(sv);
+    OUTPUT:
+        RETVAL
+
+void
+test_mortal_destructor_sv(SV *coderef, SV *args)
+    CODE:
+        MORTALDESTRUCTOR_SV(coderef,args);
+
+void
+test_mortal_destructor_av(SV *coderef, AV *args)
+    CODE:
+        /* passing in an AV cast to SV is different from a SV ref to an AV */
+        MORTALDESTRUCTOR_SV(coderef, (SV *)args);
+
+void
+test_mortal_svfunc_x(SV *args)
+    CODE:
+        MORTALSVFUNC_X(&destruct_test,args);
+
+
+
 
 MODULE = XS::APItest            PACKAGE = XS::APItest
 
@@ -6553,14 +6748,14 @@ test_is_utf8_fixed_width_buf_loclen_flags(char *s, STRLEN len, U32 flags)
         RETVAL
 
 IV
-test_utf8_hop_safe(SV *s_sv, STRLEN s_off, IV off)
+test_utf8_hop_safe(SV *s_sv, STRLEN s_off, IV hop)
     PREINIT:
         STRLEN len;
         U8 *p;
         U8 *r;
     CODE:
         p = (U8 *)SvPV(s_sv, len);
-        r = utf8_hop_safe(p + s_off, off, p, p + len);
+        r = utf8_hop_safe(p + s_off, hop, p, p + len);
         RETVAL = r - p;
     OUTPUT:
         RETVAL
@@ -6992,6 +7187,19 @@ test_Perl_langinfo(SV * item)
     OUTPUT:
         RETVAL
 
+SV *
+gimme()
+    CODE:
+        /* facilitate tests that GIMME_V gives the right result
+         * in XS calls */
+        int gimme = GIMME_V;
+        SV* sv = get_sv("XS::APItest::GIMME_V", GV_ADD);
+        sv_setiv_mg(sv, (IV)gimme);
+        RETVAL = &PL_sv_undef;
+    OUTPUT:
+        RETVAL
+
+
 MODULE = XS::APItest            PACKAGE = XS::APItest::Backrefs
 
 void
@@ -7432,9 +7640,9 @@ test_siphash24()
             if (hash32 != vectors_32[i]) {
                 failed++;
                 printf( "Error in 32 bit result on test vector of length %d for siphash24\n"
-                        "    have: 0x%08x\n"
-                        "    want: 0x%08x\n",
-                    i, hash32, vectors_32[i]);
+                        "    have: 0x%08" UVxf "\n"
+                        "    want: 0x%08" UVxf "\n",
+                    i, (UV)hash32, (UV)vectors_32[i]);
             }
         }
         RETVAL= failed;
@@ -7653,9 +7861,9 @@ test_siphash13()
             if (hash32 != vectors_32[i]) {
                 failed++;
                 printf( "Error in 32 bit result on test vector of length %d for siphash13\n"
-                        "    have: 0x%08x\n"
-                        "    want: 0x%08x\n",
-                    i, hash32, vectors_32[i]);
+                        "    have: 0x%08" UVxf"\n"
+                        "    want: 0x%08" UVxf"\n",
+                    i, (UV)hash32, (UV)vectors_32[i]);
             }
         }
         RETVAL= failed;
@@ -7663,4 +7871,103 @@ test_siphash13()
     OUTPUT:
         RETVAL
 
-#endif
+#endif /* END 64 BIT SIPHASH TESTS */
+
+MODULE = XS::APItest            PACKAGE = XS::APItest::BoolInternals
+
+UV
+test_bool_internals()
+    CODE:
+    {
+        U32 failed = 0;
+        SV *true_sv_setsv = newSV(0);
+        SV *false_sv_setsv = newSV(0);
+        SV *true_sv_set_true = newSV(0);
+        SV *false_sv_set_false = newSV(0);
+        SV *true_sv_set_bool = newSV(0);
+        SV *false_sv_set_bool = newSV(0);
+        SV *sviv = newSViv(1);
+        SV *svpv = newSVpvs("whatever");
+        TEST_EXPR(SvIOK(sviv) && !SvIandPOK(sviv));
+        TEST_EXPR(SvPOK(svpv) && !SvIandPOK(svpv));
+        TEST_EXPR(SvIOK(sviv) && !SvBoolFlagsOK(sviv));
+        TEST_EXPR(SvPOK(svpv) && !SvBoolFlagsOK(svpv));
+        sv_setsv(true_sv_setsv, &PL_sv_yes);
+        sv_setsv(false_sv_setsv, &PL_sv_no);
+        sv_set_true(true_sv_set_true);
+        sv_set_false(false_sv_set_false);
+        sv_set_bool(true_sv_set_bool, true);
+        sv_set_bool(false_sv_set_bool, false);
+        /* note that test_bool_internals_macro() SvREFCNT_dec's its arguments
+         * after the tests */
+        failed += test_bool_internals_macro(newSVsv(&PL_sv_yes), newSVsv(&PL_sv_no));
+        failed += test_bool_internals_macro(newSV_true(), newSV_false());
+        failed += test_bool_internals_macro(newSVbool(1), newSVbool(0));
+        failed += test_bool_internals_macro(true_sv_setsv, false_sv_setsv);
+        failed += test_bool_internals_macro(true_sv_set_true, false_sv_set_false);
+        failed += test_bool_internals_macro(true_sv_set_bool, false_sv_set_bool);
+        SvREFCNT_dec(sviv);
+        SvREFCNT_dec(svpv);
+        RETVAL = failed;
+    }
+    OUTPUT:
+        RETVAL
+
+MODULE = XS::APItest            PACKAGE = XS::APItest::CvREFCOUNTED_ANYSV
+
+UV
+test_CvREFCOUNTED_ANYSV()
+    CODE:
+    {
+        U32 failed = 0;
+
+        /* Doesn't matter what actual function we wrap because we're never
+         * actually going to call it. */
+        CV *cv = newXS("XS::APItest::(test-cv-1)", XS_XS__APItest__XSUB_XS_VERSION_undef, __FILE__);
+        SV *sv = newSV(0);
+        CvXSUBANY(cv).any_sv = SvREFCNT_inc(sv);
+        CvREFCOUNTED_ANYSV_on(cv);
+        TEST_EXPR(SvREFCNT(sv) == 2);
+
+        SvREFCNT_dec((SV *)cv);
+        TEST_EXPR(SvREFCNT(sv) == 1);
+
+        SvREFCNT_dec(sv);
+
+        RETVAL = failed;
+    }
+    OUTPUT:
+        RETVAL
+
+MODULE = XS::APItest            PACKAGE = XS::APItest::global_locale
+
+char *
+switch_to_global_and_setlocale(int category, const char * locale)
+    CODE:
+        switch_to_global_locale();
+        RETVAL = setlocale(category, locale);
+    OUTPUT:
+        RETVAL
+
+bool
+sync_locale()
+    CODE:
+        RETVAL = sync_locale();
+    OUTPUT:
+        RETVAL
+
+NV
+newSvNV(const char * string)
+    CODE:
+        RETVAL = SvNV(newSVpv(string, 0));
+    OUTPUT:
+        RETVAL
+
+MODULE = XS::APItest            PACKAGE = XS::APItest::savestack
+
+IV
+get_savestack_ix()
+    CODE:
+        RETVAL = PL_savestack_ix;
+    OUTPUT:
+        RETVAL
index 074fe60..d942f90 100644 (file)
@@ -24,7 +24,7 @@ CAT2(sv_setsv_cow_hashkey_, SUFFIX) () {
 
     sv_setsv(destination, source);
 
-    result = !!SvIsCOW(destination);
+    result = cBOOL(SvIsCOW(destination));
 
     SvREFCNT_dec(source);
     SvREFCNT_dec(destination);
index 390ed8d..1116f28 100755 (executable)
@@ -14,7 +14,7 @@ BEGIN {
     plan(538);
     use_ok('XS::APItest')
 };
-
+use Config;
 #########################
 
 # f(): general test sub to be called by call_sv() etc.
@@ -343,8 +343,11 @@ for my $fn_type (qw(eval_pv eval_sv call_sv)) {
 # DAPM 9-Aug-04. A taint test in eval_sv() could die after setting up
 # a new jump level but before pushing an eval context, leading to
 # stack corruption
+SKIP: {
+    skip("Your perl was built without taint support", 1)
+        unless $Config{taint_support};
 
-fresh_perl_is(<<'EOF', "x=2", { switches => ['-T', '-I../../lib'] }, 'eval_sv() taint');
+    fresh_perl_is(<<'EOF', "x=2", { switches => ['-T', '-I../../lib'] }, 'eval_sv() taint');
 use XS::APItest;
 
 my $x = 0;
@@ -357,4 +360,4 @@ sub f {
 eval { my @a = sort f 2, 1;  $x++};
 print "x=$x\n";
 EOF
-
+}
index 2827b36..c727df1 100644 (file)
@@ -6,30 +6,61 @@ BEGIN {
 use XS::APItest;
 use Config;
 
-skip_all("locales not available") unless locales_enabled('LC_NUMERIC');
+skip_all("locales not available") unless locales_enabled();
 
 my @locales = eval { find_locales( &LC_NUMERIC ) };
-skip_all("no LC_NUMERIC locales available") unless @locales;
-
-my $non_dot_locale;
-for (@locales) {
+my $comma_locale;
+for my $locale (@locales) {
+    use POSIX;
     use locale;
-    setlocale(LC_NUMERIC, $_) or next;
+    setlocale(LC_NUMERIC, $locale) or next;
     my $in = 4.2; # avoid any constant folding bugs
-    if (sprintf("%g", $in) ne "4.2") {
-        $non_dot_locale = $_;
+    my $s = sprintf("%g", $in);
+    if ($s eq "4,2")  {
+        $comma_locale = $locale;
         last;
     }
 }
 
-
 SKIP: {
-      if ($Config{usequadmath}) {
-            skip "no gconvert with usequadmath", 2;
+          if ($Config{usequadmath}) {
+              skip "no gconvert with usequadmath", 2;
+          }
+          is(test_Gconvert(4.179, 2), "4.2", "Gconvert doesn't recognize underlying locale outside 'use locale'");
+          use locale;
+          is(test_Gconvert(4.179, 2), "4.2", "Gconvert doesn't recognize underlying locale inside 'use locale'");
       }
-      is(test_Gconvert(4.179, 2), "4.2", "Gconvert doesn't recognize underlying locale outside 'use locale'");
-      use locale;
-      is(test_Gconvert(4.179, 2), "4.2", "Gconvert doesn't recognize underlying locale inside 'use locale'");
+
+sub check_in_bounds($$$) {
+    my ($value, $lower, $upper) = @_;
+
+    $value >= $lower && $value <= $upper
+}
+
+SKIP: {
+    # This checks that when switching to the global locale, the service that
+    # Perl provides of transparently dealing with locales that have a non-dot
+    # radix is turned off, but gets turned on again after a sync_locale();
+
+    skip "no locale with a comma radix available", 5 unless $comma_locale;
+
+    my $global_locale = switch_to_global_and_setlocale(LC_NUMERIC,
+                                                       $comma_locale);
+    # Can't do a compare of $global_locale and $comma_locale because what the
+    # system returns may be an alias.  ALl we can do is test for
+    # success/failure
+    ok($global_locale, "Successfully switched to $comma_locale");
+    is(newSvNV("4.888"), 4, "dot not recognized in global comma locale for SvNV");
+
+    no warnings 'numeric';  # Otherwise get "Argument isn't numeric in
+                            # subroutine entry"
+
+    is(check_in_bounds(newSvNV("4,888"), 4.88, 4.89), 1,
+       "comma recognized in global comma locale for SvNV");
+    isnt(sync_locale, 0, "sync_locale() returns that was in the global locale");
+
+    is(check_in_bounds(newSvNV("4.888"), 4.88, 4.89), 1,
+    "dot recognized in perl-controlled comma locale for SvNV");
 }
 
 my %correct_C_responses = (
@@ -98,7 +129,7 @@ open my $fh, "<", $hdr;
 $|=1;
 
 SKIP: {
-    skip "No LC_ALL", 1 unless find_locales( &LC_ALL );
+    skip "No LC_ALL", 1 unless locales_enabled('LC_ALL');
 
     use POSIX;
     setlocale(LC_ALL, "C");
@@ -118,7 +149,7 @@ SKIP: {
         chomp;
         next unless / - \d+ $ /x;
         s/ ^ \# \s* define \s*//x;
-        m/ (.*) \  (.*) /x;
+        m/ (\S+) \s+ (.*) /x;
         $items{$1} = ($has_nl_langinfo)
                      ? $1       # Yields 'YESSTR'
                      : $2;      # Yields -54
@@ -148,4 +179,25 @@ SKIP: {
     }
 }
 
+@locales = eval { find_locales( &LC_TIME ) };
+
+SKIP: {
+    skip("no LC_TIME locales available") unless @locales;
+
+    for my $locale (@locales) {
+        use POSIX 'strftime';
+        use locale;
+        setlocale(LC_TIME, $locale) or next;
+
+        # This isn't guaranteed to find failing locales, as it is impractical
+        # to test all possible dates.  But it is much better than no test at
+        # all
+        if (strftime('%c', 0, 0, , 12, 18, 11, 87) eq "") {
+            fail('strftime() built-in expansion factor works for all locales');
+            diag("Failed for locale $locale");
+            last;
+        }
+    }
+}
+
 done_testing();
index 46feb7a..18e0d3e 100644 (file)
@@ -4,7 +4,7 @@ use Test::More;
 
 use XS::APItest;
 
-my $sv = bless {}, 'Moo';
+our $sv = 'Moo';
 my $foo = 'affe';
 my $bar = 'tiger';
 
@@ -15,6 +15,13 @@ sv_magic_foo($sv, $foo);
 is mg_find_foo($sv), $foo, 'foo magic attached';
 ok !mg_find_bar($sv), '... but still no bar magic';
 
+{
+       local $sv = 'Emu';
+       sv_magic_foo($sv, $foo);
+       is mg_find_foo($sv), $foo, 'foo magic attached to localized value';
+       ok !mg_find_bar($sv), '... but still no bar magic to localized value';
+}
+
 sv_magic_bar($sv, $bar);
 is mg_find_foo($sv), $foo, 'foo magic still attached';
 is mg_find_bar($sv), $bar, '... and bar magic is there too';
@@ -27,6 +34,14 @@ sv_unmagic_bar($sv);
 ok !mg_find_foo($sv), 'foo magic still removed';
 ok !mg_find_bar($sv), '... and bar magic is removed too';
 
+sv_magic_baz($sv, $bar);
+is mg_find_baz($sv), $bar, 'baz magic attached';
+ok !mg_find_bar($sv), '';
+{
+       local $sv = 'Emu';
+       ok !mg_find_baz($sv), '';
+}
+
 is(test_get_vtbl(), 0, 'get_vtbl(-1) returns NULL');
 
 eval { sv_magic(\!0, $foo) };
@@ -61,4 +76,59 @@ is $@, "", 'PERL_MAGIC_ext is permitted on read-only things';
     is($i, 0, "hash () with set magic");
 }
 
+{
+    # check if set magic triggered by av_store() via aassign results in
+    # unreferenced scalars being freed. IOW, results in a double store
+    # without a corresponding refcount bump. If things work properly this
+    # should not warn. If there is an issue it will.
+    my @warn;
+    local $SIG{__WARN__}= sub { push @warn, $_[0] };
+    {
+        my (@a, $i);
+        sv_magic_myset_dies(\@a, $i);
+        eval {
+            $i = 0;
+            @a = (1);
+        };
+    }
+    is(0+@warn, 0,
+        "If AV set magic dies via aassign it should not warn about double free");
+    @warn = ();
+    {
+        my (@a, $i, $j);
+        sv_magic_myset_dies(\@a, $i);
+        eval {
+            $j = "blorp";
+            my_av_store(\@a,0,$j);
+        };
+
+        # Evaluate this boolean as a separate statement, so the two
+        # temporary \ refs are freed before we start comparing reference
+        # counts
+        my $is_same_SV = \$a[0] == \$j;
+
+        if ($is_same_SV) {
+            # in this case we expect to have 2 refcounts,
+            # one from $a[0] and one from $j itself.
+            is( sv_refcnt($j), 2,
+                "\$a[0] is \$j, so refcount(\$j) should be 2");
+        } else {
+            # Note this branch isn't exercised. Whether by design
+            # or not. I leave it here because it is a possible valid
+            # outcome. It is marked TODO so if we start going down
+            # this path we do so knowingly.
+            diag "av_store has changed behavior - please review this test";
+            TODO:{
+                local $TODO = "av_store bug stores even if it dies during magic";
+                # in this case we expect to have only 1 refcount,
+                # from $j itself.
+                is( sv_refcnt($j), 1,
+                    "\$a[0] is not \$j, so refcount(\$j) should be 1");
+            }
+        }
+    }
+    is(0+@warn, 0,
+        "AV set magic that dies via av_store should not warn about double free");
+}
+
 done_testing;
index 865020d..b6cce12 100644 (file)
@@ -1,7 +1,7 @@
 use strict;
 use warnings;
 
-use Test::More tests => 4;
+use Test::More tests => 6;
 
 use XS::APItest;
 
@@ -19,3 +19,13 @@ for my $case (@cases) {
     like($exn, qr/\b\QCannot yet reorder sv_vcatpvfn() arguments from va_list\E\b/,
          "explicit $what index forbidden in va_list arguments");
 }
+
+# these actually test newSVpvf() but it is the same underlying logic.
+is(test_HvNAMEf(bless {}, "Whatever::You::Like"),
+    "class='Whatever::You::Like'");
+is(test_HvNAMEf_QUOTEDPREFIX(bless {}, "x" x 1000),
+    'class="xxxxxxxxxxxxxxxxxxxxxxxxxx'.
+    'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'.
+    'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"..."xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'.
+    'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'.
+    'xxxxxxxxxxxxxxxxxxxxx"');
index 00edb91..ed109b9 100644 (file)
@@ -33,7 +33,7 @@ is(eval { XS::APItest::first_byte($1) } || $@, 0303,
 sub TIESCALAR { bless [], shift }
 sub FETCH { ++$f; *{chr utf8::unicode_to_native(255)} }
 tie $t, "main";
-is SvPVutf8($t), "*main::" . byte_utf8a_to_utf8n("\xc3\xbf"),
+is SvPVutf8_nolen($t), "*main::" . byte_utf8a_to_utf8n("\xc3\xbf"),
   'SvPVutf8 works with get-magic changing the SV type';
 is $f, 1, 'SvPVutf8 calls get-magic once';
 
@@ -44,7 +44,7 @@ package t {
 }
 tie $t, "t";
 undef $f;
-is SvPVutf8($t), byte_utf8a_to_utf8n("\xc3\xbf"),
+is SvPVutf8_nolen($t), byte_utf8a_to_utf8n("\xc3\xbf"),
   'SvPVutf8 works with get-magic downgrading the SV';
 is $f, 1, 'SvPVutf8 calls get-magic once';
 ()="$t";
index 50d1a4e..f4af4c4 100644 (file)
@@ -1183,10 +1183,9 @@ for my $restriction (sort keys %restriction_types) {
 
 SKIP:
 {
-    isASCII
-      or skip "These tests probably break on non-ASCII", 1;
     my $simple = join "", "A" .. "J";
-    my $utf_ch = "\x{7fffffff}";
+    my $utf_ch = "\x{3f_ffff}";     # Highest code point that is same number
+                                    # of bytes on ASCII and EBCDIC: 5
     utf8::encode($utf_ch);
     my $utf_ch_len = length $utf_ch;
     note "utf_ch_len $utf_ch_len";
@@ -1195,10 +1194,9 @@ SKIP:
     # $bad_end ends with a start byte and a single continuation
     my $bad_end = substr($utf, 0, length($utf)-$utf_ch_len+2);
 
-    # WARNING: all offsets are *byte* offsets
     my @hop_tests =
-      (
-       # string      s                off        expected         name
+      (  #           start byte      chars
+       # string      in 'string'     to hop      expected         name
        [ $simple,    0,               5,         5,               "simple in range, forward" ],
        [ $simple,    10,              -5,        5,               "simple in range, backward" ],
        [ $simple,    5,               10,        10,              "simple out of range, forward" ],
@@ -1209,9 +1207,10 @@ SKIP:
        [ $utf,       $utf_ch_len * 5, -4,        $utf_ch_len,     "utf in range b, backward" ],
        [ $utf,       $utf_ch_len * 5, 6,         length($utf),    "utf out of range, forward" ],
        [ $utf,       $utf_ch_len * 5, -6,        0,               "utf out of range, backward"  ],
-       [ $bad_start, 0,               1,         1,               "bad start, forward 1 from 0" ],
-       [ $bad_start, 0,               $utf_ch_len-1, $utf_ch_len-1, "bad start, forward ch_len-1 from 0" ],
-       [ $bad_start, 0,               $utf_ch_len, $utf_ch_len*2-1, "bad start, forward ch_len from 0" ],
+       [ $bad_start, 0,               1,         $utf_ch_len-1,   "bad start, forward 1 from 0" ],
+       [ $bad_start, 0,               5,         5 * $utf_ch_len-1, "bad start, forward 5 chars from 0" ],
+       [ $bad_start, 0,                9,        length($bad_start)-$utf_ch_len, "bad start, forward 9 chars from 0" ],
+       [ $bad_start, 0,               10,        length $bad_start, "bad start, forward 10 chars from 0" ],
        [ $bad_start, $utf_ch_len-1,   -1,        0,                "bad start, back 1 from first start byte" ],
        [ $bad_start, $utf_ch_len-2,   -1,        0,                "bad start, back 1 from before first start byte" ],
        [ $bad_start, 0,               -1,        0,                "bad start, back 1 from 0" ],
@@ -1221,8 +1220,8 @@ SKIP:
        );
 
     for my $test (@hop_tests) {
-        my ($str, $s_off, $off, $want, $name) = @$test;
-        my $result = test_utf8_hop_safe($str, $s_off, $off);
+        my ($str, $s_off, $hop, $want, $name) = @$test;
+        my $result = test_utf8_hop_safe($str, $s_off, $hop);
         is($result, $want, "utf8_hop_safe: $name");
     }
 }
index 4f613f4..313763c 100644 (file)
@@ -1,6 +1,6 @@
 package attributes;
 
-our $VERSION = 0.34;
+our $VERSION = 0.35;
 
 @EXPORT_OK = qw(get reftype);
 @EXPORT = ();
index f2f28df..e7d4ee4 100644 (file)
@@ -78,9 +78,9 @@ modify_SV_attributes(pTHX_ SV *sv, SV **retlist, SV **attrlist, int numattrs)
                case 'h':
                    if (memEQs(name, 6, "method")) {
                        if (negated)
-                           CvFLAGS(MUTABLE_CV(sv)) &= ~CVf_METHOD;
+                           CvFLAGS(MUTABLE_CV(sv)) &= ~CVf_NOWARN_AMBIGUOUS;
                        else
-                           CvFLAGS(MUTABLE_CV(sv)) |= CVf_METHOD;
+                           CvFLAGS(MUTABLE_CV(sv)) |= CVf_NOWARN_AMBIGUOUS;
                        continue;
                    }
                    break;
@@ -173,7 +173,7 @@ usage:
        cvflags = CvFLAGS((const CV *)sv);
        if (cvflags & CVf_LVALUE)
            XPUSHs(newSVpvs_flags("lvalue", SVs_TEMP));
-       if (cvflags & CVf_METHOD)
+       if (cvflags & CVf_NOWARN_AMBIGUOUS)
            XPUSHs(newSVpvs_flags("method", SVs_TEMP));
        break;
     default:
index 39ade22..6637ea8 100644 (file)
@@ -12,7 +12,7 @@ use warnings;
 
 # mro.pm versions < 1.00 reserved for MRO::Compat
 #  for partial back-compat to 5.[68].x
-our $VERSION = '1.26';
+our $VERSION = '1.28';
 
 require XSLoader;
 XSLoader::load('mro');
index 6bedd03..ba9921f 100644 (file)
@@ -14,7 +14,8 @@ static const struct mro_alg c3_alg =
 =for apidoc mro_get_linear_isa_c3
 
 Returns the C3 linearization of C<@ISA>
-the given stash.  The return value is a read-only AV*.
+the given stash.  The return value is a read-only AV*
+whose values are string SVs giving class names.
 C<level> should be 0 (it is used internally in this
 function's recursion).
 
@@ -504,7 +505,6 @@ mro__nextcan(...)
         cxix = __dopoptosub_at(ccstack, cxix);
         for (;;) {
            GV* cvgv;
-           STRLEN fq_subname_len;
 
             /* we may be in a higher stacklevel, so dig down deeper */
             while (cxix < 0) {
@@ -545,19 +545,14 @@ mro__nextcan(...)
 
            if(SvPOK(sv)) {
                fq_subname = SvPVX(sv);
-               fq_subname_len = SvCUR(sv);
-
-                subname_utf8 = SvUTF8(sv) ? 1 : 0;
                subname = strrchr(fq_subname, ':');
-           } else {
-               subname = NULL;
-           }
-
+            }
             if(!subname)
                 Perl_croak(aTHX_ "next::method/next::can/maybe::next::method cannot find enclosing method");
 
+            subname_utf8 = SvUTF8(sv) ? 1 : 0;
             subname++;
-            subname_len = fq_subname_len - (subname - fq_subname);
+            subname_len = SvCUR(sv) - (subname - fq_subname);
             if(memEQs(subname, subname_len, "__ANON__")) {
                 cxix = __dopoptosub_at(ccstack, cxix - 1);
                 continue;
index f3bdcfd..8d4a576 100644 (file)
@@ -1,8 +1,31 @@
+use strict;
+use warnings;
 use ExtUtils::MakeMaker;
 use File::Spec;
 use Config;
+#   [ src => @deps ]
+our @files = (
+    # compiler files ########################################
+    ['regcomp.c'        => 'dquote.c', 'invlist_inline.h'   ],
+    ['regcomp_invlist.c' => 'invlist_inline.h'              ],
+    ['regcomp_study.c'                                      ],
+    ['regcomp_trie.c'                                       ],
+    ['regcomp_debug.c'                                      ],
+    # execution engine files ################################
+    ['regexec.c'        => 'invlist_inline.h'               ],
+    # misc files ############################################
+    ['dquote.c'                                             ],
+    ['invlist_inline.h'                                     ],
+    #########################################################
+);
 
-my $object = 're_exec$(OBJ_EXT) re_comp$(OBJ_EXT) re$(OBJ_EXT)';
+my @objects = 're$(OBJ_EXT)';
+foreach my $tuple (@files) {
+    my $src_file = $tuple->[0];
+    if ($src_file=~s/reg/re_/ and $src_file=~s/\.c/\$(OBJ_EXT)/) {
+        push @objects, $src_file;
+    }
+}
 
 my $defines = '-DPERL_EXT_RE_BUILD -DPERL_EXT_RE_DEBUG -DPERL_EXT';
 
@@ -15,45 +38,41 @@ WriteMakefile(
     @libs ? ( 'LIBS' => [ join(" ", map { "-l$_" } @libs) ] ) : (),
     VERSION_FROM       => 're.pm',
     XSPROTOARG         => '-noprototypes',
-    OBJECT             => $object,
+    OBJECT             => "@objects",
     DEFINE             => $defines,
     clean              => { FILES => '*$(OBJ_EXT) invlist_inline.h *.c ../../lib/re.pm' },
 );
 
 package MY;
-
 sub upupfile {
     File::Spec->catfile(File::Spec->updir, File::Spec->updir, $_[0]);
 }
 
 sub postamble {
-    my $regcomp_c = upupfile('regcomp.c');
-    my $regexec_c = upupfile('regexec.c');
-    my $dquote_c = upupfile('dquote.c');
-    my $invlist_inline_h = upupfile('invlist_inline.h');
+    my $postamble = "";
 
+    foreach my $tuple (@::files) {
+        my ($file, @deps) = @$tuple;
+        my $src_file = upupfile($file);
+        my $target = $file;
+        $target =~ s/^reg/re_/;
+        $postamble .=
     <<EOF;
-re_comp.c : $regcomp_c
-       - \$(RM_F) re_comp.c
-       \$(CP) $regcomp_c re_comp.c
-
-re_comp\$(OBJ_EXT) : re_comp.c dquote.c invlist_inline.h
+$target : $src_file
+       - \$(RM_F) $target
+       \$(CP) $src_file $target
 
-re_exec.c : $regexec_c
-       - \$(RM_F) re_exec.c
-       \$(CP) $regexec_c re_exec.c
-
-re_exec\$(OBJ_EXT) : re_exec.c invlist_inline.h
-
-dquote.c : $dquote_c
-       - \$(RM_F) dquote.c
-       \$(CP) $dquote_c dquote.c
-
-invlist_inline.h : $invlist_inline_h
-       - \$(RM_F) invlist_inline.h
-       \$(CP) $invlist_inline_h invlist_inline.h
+EOF
+        next if $target eq $file;
+        my $base_name = $target;
+        if ($base_name=~s/\.c\z//) {
+            $postamble .= <<EOF
+$base_name\$(OBJ_EXT) : $target @deps
 
 EOF
+        }
+    }
+    return $postamble
 }
 
 sub MY::c_o {
index cf1f742..6da4e02 100644 (file)
@@ -4,7 +4,7 @@ package re;
 use strict;
 use warnings;
 
-our $VERSION     = "0.43";
+our $VERSION     = "0.44";
 our @ISA         = qw(Exporter);
 our @EXPORT_OK   = qw{
        is_regexp regexp_pattern
index b2570f0..4c8b47d 100644 (file)
@@ -11,7 +11,7 @@ BEGIN {
 use strict;
 
 # must use a BEGIN or the prototypes wont be respected meaning 
-    # tests could pass that shouldn't
+# tests could pass that shouldn't
 BEGIN { require "../../t/test.pl"; }
 my $out = runperl(progfile => "t/lexical_debug.pl", stderr => 1 );
 
index 53be5b3..c862864 100644 (file)
@@ -1,4 +1,4 @@
-/* -*- buffer-read-only: t -*-
+/* -*- mode: C; buffer-read-only: t -*-
    !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!!
    This file is built by regen/feature.pl.
    Any changes made here will be lost!
 
 #define FEATURE_BAREWORD_FILEHANDLES_BIT    0x0001
 #define FEATURE_BITWISE_BIT                 0x0002
-#define FEATURE___SUB___BIT                 0x0004
-#define FEATURE_MYREF_BIT                   0x0008
-#define FEATURE_DEFER_BIT                   0x0010
-#define FEATURE_EVALBYTES_BIT               0x0020
-#define FEATURE_MORE_DELIMS_BIT             0x0040
-#define FEATURE_FC_BIT                      0x0080
-#define FEATURE_INDIRECT_BIT                0x0100
-#define FEATURE_ISA_BIT                     0x0200
-#define FEATURE_MULTIDIMENSIONAL_BIT        0x0400
-#define FEATURE_POSTDEREF_QQ_BIT            0x0800
-#define FEATURE_REFALIASING_BIT             0x1000
-#define FEATURE_SAY_BIT                     0x2000
-#define FEATURE_SIGNATURES_BIT              0x4000
-#define FEATURE_STATE_BIT                   0x8000
-#define FEATURE_SWITCH_BIT                  0x10000
-#define FEATURE_TRY_BIT                     0x20000
-#define FEATURE_UNIEVAL_BIT                 0x40000
-#define FEATURE_UNICODE_BIT                 0x80000
+#define FEATURE_CLASS_BIT                   0x0004
+#define FEATURE___SUB___BIT                 0x0008
+#define FEATURE_MYREF_BIT                   0x0010
+#define FEATURE_DEFER_BIT                   0x0020
+#define FEATURE_EVALBYTES_BIT               0x0040
+#define FEATURE_MORE_DELIMS_BIT             0x0080
+#define FEATURE_FC_BIT                      0x0100
+#define FEATURE_INDIRECT_BIT                0x0200
+#define FEATURE_ISA_BIT                     0x0400
+#define FEATURE_MODULE_TRUE_BIT             0x0800
+#define FEATURE_MULTIDIMENSIONAL_BIT        0x1000
+#define FEATURE_POSTDEREF_QQ_BIT            0x2000
+#define FEATURE_REFALIASING_BIT             0x4000
+#define FEATURE_SAY_BIT                     0x8000
+#define FEATURE_SIGNATURES_BIT              0x10000
+#define FEATURE_STATE_BIT                   0x20000
+#define FEATURE_SWITCH_BIT                  0x40000
+#define FEATURE_TRY_BIT                     0x80000
+#define FEATURE_UNIEVAL_BIT                 0x100000
+#define FEATURE_UNICODE_BIT                 0x200000
 
 #define FEATURE_BUNDLE_DEFAULT 0
 #define FEATURE_BUNDLE_510     1
 #define FEATURE_BUNDLE_523     4
 #define FEATURE_BUNDLE_527     5
 #define FEATURE_BUNDLE_535     6
+#define FEATURE_BUNDLE_537     7
 #define FEATURE_BUNDLE_CUSTOM  (HINT_FEATURE_MASK >> HINT_FEATURE_SHIFT)
 
-#define CURRENT_HINTS \
+/* this is preserved for testing and asserts */
+#define OLD_CURRENT_HINTS \
     (PL_curcop == &PL_compiling ? PL_hints : PL_curcop->cop_hints)
+/* this is the same thing, but simpler (no if) as PL_hints expands
+   to PL_compiling.cop_hints */
+#define CURRENT_HINTS \
+    PL_curcop->cop_hints
 #define CURRENT_FEATURE_BUNDLE \
     ((CURRENT_HINTS & HINT_FEATURE_MASK) >> HINT_FEATURE_SHIFT)
 
 #define FEATURE_FC_IS_ENABLED \
     ( \
        (CURRENT_FEATURE_BUNDLE >= FEATURE_BUNDLE_515 && \
-        CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_535) \
+        CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_537) \
      || (CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \
         FEATURE_IS_ENABLED_MASK(FEATURE_FC_BIT)) \
     )
 
 #define FEATURE_ISA_IS_ENABLED \
     ( \
-       CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_535 \
+       (CURRENT_FEATURE_BUNDLE >= FEATURE_BUNDLE_535 && \
+        CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_537) \
      || (CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \
         FEATURE_IS_ENABLED_MASK(FEATURE_ISA_BIT)) \
     )
@@ -72,7 +81,7 @@
 #define FEATURE_SAY_IS_ENABLED \
     ( \
        (CURRENT_FEATURE_BUNDLE >= FEATURE_BUNDLE_510 && \
-        CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_535) \
+        CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_537) \
      || (CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \
         FEATURE_IS_ENABLED_MASK(FEATURE_SAY_BIT)) \
     )
         FEATURE_IS_ENABLED_MASK(FEATURE_TRY_BIT) \
     )
 
+#define FEATURE_CLASS_IS_ENABLED \
+    ( \
+       CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \
+        FEATURE_IS_ENABLED_MASK(FEATURE_CLASS_BIT) \
+    )
+
 #define FEATURE_DEFER_IS_ENABLED \
     ( \
        CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \
 #define FEATURE_STATE_IS_ENABLED \
     ( \
        (CURRENT_FEATURE_BUNDLE >= FEATURE_BUNDLE_510 && \
-        CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_535) \
+        CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_537) \
      || (CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \
         FEATURE_IS_ENABLED_MASK(FEATURE_STATE_BIT)) \
     )
 #define FEATURE_BITWISE_IS_ENABLED \
     ( \
        (CURRENT_FEATURE_BUNDLE >= FEATURE_BUNDLE_527 && \
-        CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_535) \
+        CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_537) \
      || (CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \
         FEATURE_IS_ENABLED_MASK(FEATURE_BITWISE_BIT)) \
     )
 #define FEATURE_EVALBYTES_IS_ENABLED \
     ( \
        (CURRENT_FEATURE_BUNDLE >= FEATURE_BUNDLE_515 && \
-        CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_535) \
+        CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_537) \
      || (CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \
         FEATURE_IS_ENABLED_MASK(FEATURE_EVALBYTES_BIT)) \
     )
 
 #define FEATURE_SIGNATURES_IS_ENABLED \
     ( \
-       CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_535 \
+       (CURRENT_FEATURE_BUNDLE >= FEATURE_BUNDLE_535 && \
+        CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_537) \
      || (CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \
         FEATURE_IS_ENABLED_MASK(FEATURE_SIGNATURES_BIT)) \
     )
 #define FEATURE___SUB___IS_ENABLED \
     ( \
        (CURRENT_FEATURE_BUNDLE >= FEATURE_BUNDLE_515 && \
-        CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_535) \
+        CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_537) \
      || (CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \
         FEATURE_IS_ENABLED_MASK(FEATURE___SUB___BIT)) \
     )
 
+#define FEATURE_MODULE_TRUE_IS_ENABLED \
+    ( \
+       CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_537 \
+     || (CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \
+        FEATURE_IS_ENABLED_MASK(FEATURE_MODULE_TRUE_BIT)) \
+    )
+
 #define FEATURE_REFALIASING_IS_ENABLED \
     ( \
        CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \
 #define FEATURE_POSTDEREF_QQ_IS_ENABLED \
     ( \
        (CURRENT_FEATURE_BUNDLE >= FEATURE_BUNDLE_523 && \
-        CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_535) \
+        CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_537) \
      || (CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \
         FEATURE_IS_ENABLED_MASK(FEATURE_POSTDEREF_QQ_BIT)) \
     )
 #define FEATURE_UNIEVAL_IS_ENABLED \
     ( \
        (CURRENT_FEATURE_BUNDLE >= FEATURE_BUNDLE_515 && \
-        CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_535) \
+        CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_537) \
      || (CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \
         FEATURE_IS_ENABLED_MASK(FEATURE_UNIEVAL_BIT)) \
     )
 #define FEATURE_UNICODE_IS_ENABLED \
     ( \
        (CURRENT_FEATURE_BUNDLE >= FEATURE_BUNDLE_511 && \
-        CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_535) \
+        CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_537) \
      || (CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \
         FEATURE_IS_ENABLED_MASK(FEATURE_UNICODE_BIT)) \
     )
@@ -222,6 +245,9 @@ S_enable_feature_bundle(pTHX_ SV *ver)
     SV *comp_ver = sv_newmortal();
     PL_hints = (PL_hints &~ HINT_FEATURE_MASK)
             | (
+                 (sv_setnv(comp_ver, 5.037),
+                  vcmp(ver, upg_version(comp_ver, FALSE)) >= 0)
+                       ? FEATURE_BUNDLE_537 :
                  (sv_setnv(comp_ver, 5.035),
                   vcmp(ver, upg_version(comp_ver, FALSE)) >= 0)
                        ? FEATURE_BUNDLE_535 :
@@ -284,6 +310,14 @@ S_magic_sethint_feature(pTHX_ SV *keysv, const char *keypv, STRLEN keylen,
             }
             return;
 
+        case 'c':
+            if (keylen == sizeof("feature_class")-1
+                 && memcmp(subf+1, "lass", keylen - sizeof("feature_")) == 0) {
+                mask = FEATURE_CLASS_BIT;
+                break;
+            }
+            return;
+
         case 'd':
             if (keylen == sizeof("feature_defer")-1
                  && memcmp(subf+1, "efer", keylen - sizeof("feature_")) == 0) {
@@ -322,7 +356,12 @@ S_magic_sethint_feature(pTHX_ SV *keysv, const char *keypv, STRLEN keylen,
             return;
 
         case 'm':
-            if (keylen == sizeof("feature_more_delims")-1
+            if (keylen == sizeof("feature_module_true")-1
+                 && memcmp(subf+1, "odule_true", keylen - sizeof("feature_")) == 0) {
+                mask = FEATURE_MODULE_TRUE_BIT;
+                break;
+            }
+            else if (keylen == sizeof("feature_more_delims")-1
                  && memcmp(subf+1, "ore_delims", keylen - sizeof("feature_")) == 0) {
                 mask = FEATURE_MORE_DELIMS_BIT;
                 break;
@@ -412,4 +451,4 @@ S_magic_sethint_feature(pTHX_ SV *keysv, const char *keypv, STRLEN keylen,
 
 #endif /* PERL_FEATURE_H_ */
 
-/* ex: set ro: */
+/* ex: set ro ft=c: */
index 22e353f..e086612 100644 (file)
@@ -19,7 +19,6 @@ PL_EXACT_REQ8_bitmask
 PL_extended_utf8_dfa_tab
 PL_fold
 PL_fold_latin1
-PL_fold_locale
 PL_hexdigit
 PL_inf
 PL_interp_size
@@ -58,8 +57,8 @@ PL_phase_names
 PL_ppaddr
 PL_reg_extflags_name
 PL_reg_intflags_name
-PL_reg_name
-PL_regkind
+PL_regnode_info
+PL_regnode_name
 PL_revision
 PL_runops_dbg
 PL_runops_std
index 8158fb4..6b9803b 100644 (file)
@@ -79,7 +79,6 @@ Perl_gv_add_by_type(pTHX_ GV *gv, svtype type)
         } else {
             what = type == SVt_PVAV ? "array" : "scalar";
         }
-        /* diag_listed_as: Bad symbol for filehandle */
         Perl_croak(aTHX_ "Bad symbol for %s", what);
     }
 
@@ -207,9 +206,6 @@ Perl_newGP(pTHX_ GV *const gv)
     U32 hash;
     const char *file;
     STRLEN len;
-#ifndef USE_ITHREADS
-    GV *filegv;
-#endif
 
     PERL_ARGS_ASSERT_NEWGP;
     Newxz(gp, 1, GP);
@@ -223,19 +219,13 @@ Perl_newGP(pTHX_ GV *const gv)
        frees INIT before looking up DESTROY (and creating *DESTROY)
     */
     if (PL_curcop) {
+        char *tmp= CopFILE(PL_curcop);
         gp->gp_line = CopLINE(PL_curcop); /* 0 otherwise Newxz */
-#ifdef USE_ITHREADS
-        if (CopFILE(PL_curcop)) {
-            file = CopFILE(PL_curcop);
-            len = strlen(file);
-        }
-#else
-        filegv = CopFILEGV(PL_curcop);
-        if (filegv) {
-            file = GvNAME(filegv)+2;
-            len = GvNAMELEN(filegv)-2;
+
+        if (tmp) {
+            file = tmp;
+            len = CopFILE_LEN(PL_curcop);
         }
-#endif
         else goto no_file;
     }
     else {
@@ -311,7 +301,7 @@ Perl_cvgv_from_hek(pTHX_ CV *cv)
     if (!isGV(gv))
         gv_init_pvn(gv, CvSTASH(cv), HEK_KEY(CvNAME_HEK(cv)),
                 HEK_LEN(CvNAME_HEK(cv)),
-                SVf_UTF8 * !!HEK_UTF8(CvNAME_HEK(cv)));
+                SVf_UTF8 * cBOOL(HEK_UTF8(CvNAME_HEK(cv))));
     if (!CvNAMED(cv)) { /* gv_init took care of it */
         assert (SvANY(cv)->xcv_gv_u.xcv_gv == gv);
         return gv;
@@ -615,23 +605,28 @@ S_maybe_add_coresub(pTHX_ HV * const stash, GV *gv,
     switch (code < 0 ? -code : code) {
      /* no support for \&CORE::infix;
         no support for funcs that do not parse like funcs */
-    case KEY___DATA__: case KEY___END__: case KEY_and: case KEY_AUTOLOAD:
-    case KEY_BEGIN   : case KEY_CHECK  : case KEY_catch : case KEY_cmp:
-    case KEY_default : case KEY_defer  : case KEY_DESTROY:
+    case KEY___DATA__: case KEY___END__ :
+    case KEY_ADJUST  : case KEY_AUTOLOAD: case KEY_BEGIN : case KEY_CHECK :
+    case KEY_DESTROY : case KEY_END     : case KEY_INIT  : case KEY_UNITCHECK:
+    case KEY_and     : case KEY_catch  : case KEY_class  :
+    case KEY_cmp     : case KEY_default: case KEY_defer :
     case KEY_do      : case KEY_dump   : case KEY_else  : case KEY_elsif  :
-    case KEY_END     : case KEY_eq     : case KEY_eval  : case KEY_finally:
+    case KEY_eq     : case KEY_eval  : case KEY_field  :
+    case KEY_finally:
     case KEY_for     : case KEY_foreach: case KEY_format: case KEY_ge     :
     case KEY_given   : case KEY_goto   : case KEY_grep  : case KEY_gt     :
-    case KEY_if      : case KEY_isa    : case KEY_INIT  : case KEY_last   :
+    case KEY_if      : case KEY_isa    : 
+    case KEY_last   :
     case KEY_le      : case KEY_local  : case KEY_lt    : case KEY_m      :
-    case KEY_map     : case KEY_my:
+    case KEY_map     : case KEY_method : case KEY_my    :
     case KEY_ne   : case KEY_next : case KEY_no: case KEY_or: case KEY_our:
     case KEY_package: case KEY_print: case KEY_printf:
     case KEY_q    : case KEY_qq   : case KEY_qr     : case KEY_qw    :
     case KEY_qx   : case KEY_redo : case KEY_require: case KEY_return:
     case KEY_s    : case KEY_say  : case KEY_sort   :
     case KEY_state: case KEY_sub  :
-    case KEY_tr   : case KEY_try  : case KEY_UNITCHECK: case KEY_unless:
+    case KEY_tr   : case KEY_try  :
+    case KEY_unless:
     case KEY_until: case KEY_use  : case KEY_when     : case KEY_while :
     case KEY_x    : case KEY_xor  : case KEY_y        :
         return NULL;
@@ -725,14 +720,56 @@ S_maybe_add_coresub(pTHX_ HV * const stash, GV *gv,
 }
 
 /*
-=for apidoc gv_fetchmeth
+=for apidoc      gv_fetchmeth
+=for apidoc_item gv_fetchmeth_pv
+=for apidoc_item gv_fetchmeth_pvn
+=for apidoc_item gv_fetchmeth_sv
 
-Like L</gv_fetchmeth_pvn>, but lacks a flags parameter.
+These each look for a glob with name C<name>, containing a defined subroutine,
+returning the GV of that glob if found, or C<NULL> if not.
 
-=for apidoc gv_fetchmeth_sv
+C<stash> is always searched (first), unless it is C<NULL>.
 
-Exactly like L</gv_fetchmeth_pvn>, but takes the name string in the form
-of an SV instead of a string/length pair.
+If C<stash> is NULL, or was searched but nothing was found in it, and the
+C<GV_SUPER> bit is set in C<flags>, stashes accessible via C<@ISA> are searched
+next.  Searching is conducted according to L<C<MRO> order|perlmroapi>.
+
+Finally, if no matches were found so far, and the C<GV_NOUNIVERSAL> flag in
+C<flags> is not set,  C<UNIVERSAL::> is searched.
+
+The argument C<level> should be either 0 or -1.  If -1, the function will
+return without any side effects or caching.  If 0, the function makes sure
+there is a glob named C<name> in C<stash>, creating one if necessary.
+The subroutine slot in the glob will be set to any subroutine found in the
+C<stash> and C<SUPER::> search, hence caching any C<SUPER::> result.  Note that
+subroutines found in C<UNIVERSAL::> are not cached.
+
+The GV returned from these may be a method cache entry, which is not visible to
+Perl code.  So when calling C<call_sv>, you should not use the GV directly;
+instead, you should use the method's CV, which can be obtained from the GV with
+the C<GvCV> macro.
+
+The only other significant value for C<flags> is C<SVf_UTF8>, indicating that
+C<name> is to be treated as being encoded in UTF-8.
+
+Plain C<gv_fetchmeth> lacks a C<flags> parameter, hence always searches in
+C<stash>, then C<UNIVERSAL::>, and C<name> is never UTF-8.  Otherwise it is
+exactly like C<gv_fetchmeth_pvn>.
+
+The other forms do have a C<flags> parameter, and differ only in how the glob
+name is specified.
+
+In C<gv_fetchmeth_pv>, C<name> is a C language NUL-terminated string.
+
+In C<gv_fetchmeth_pvn>, C<name> points to the first byte of the name, and an
+additional parameter, C<len>, specifies its length in bytes.  Hence, the name
+may contain embedded-NUL characters.
+
+In C<gv_fetchmeth_sv>, C<*name> is an SV, and the name is the PV extracted from
+that, using L</C<SvPV>>.  If the SV is marked as being in UTF-8, the extracted
+PV will also be.
+
+=for apidoc Amnh||GV_SUPER
 
 =cut
 */
@@ -751,14 +788,6 @@ Perl_gv_fetchmeth_sv(pTHX_ HV *stash, SV *namesv, I32 level, U32 flags)
     return gv_fetchmeth_pvn(stash, namepv, namelen, level, flags);
 }
 
-/*
-=for apidoc gv_fetchmeth_pv
-
-Exactly like L</gv_fetchmeth_pvn>, but takes a nul-terminated string
-instead of a string/length pair.
-
-=cut
-*/
 
 GV *
 Perl_gv_fetchmeth_pv(pTHX_ HV *stash, const char *name, I32 level, U32 flags)
@@ -767,38 +796,6 @@ Perl_gv_fetchmeth_pv(pTHX_ HV *stash, const char *name, I32 level, U32 flags)
     return gv_fetchmeth_internal(stash, NULL, name, strlen(name), level, flags);
 }
 
-/*
-=for apidoc gv_fetchmeth_pvn
-
-Returns the glob with the given C<name> and a defined subroutine or
-C<NULL>.  The glob lives in the given C<stash>, or in the stashes
-accessible via C<@ISA> and C<UNIVERSAL::>.
-
-The argument C<level> should be either 0 or -1.  If C<level==0>, as a
-side-effect creates a glob with the given C<name> in the given C<stash>
-which in the case of success contains an alias for the subroutine, and sets
-up caching info for this glob.
-
-The only significant values for C<flags> are C<GV_SUPER>, C<GV_NOUNIVERSAL>, and
-C<SVf_UTF8>.
-
-C<GV_SUPER> indicates that we want to look up the method in the superclasses
-of the C<stash>.
-
-C<GV_NOUNIVERSAL> indicates that we do not want to look up the method in
-the stash accessible by C<UNIVERSAL::>.
-
-The
-GV returned from C<gv_fetchmeth> may be a method cache entry, which is not
-visible to Perl code.  So when calling C<call_sv>, you should not use
-the GV directly; instead, you should use the method's CV, which can be
-obtained from the GV with the C<GvCV> macro.
-
-=for apidoc Amnh||GV_SUPER
-
-=cut
-*/
-
 /* NOTE: No support for tied ISA */
 
 PERL_STATIC_INLINE GV*
@@ -915,8 +912,8 @@ S_gv_fetchmeth_internal(pTHX_ HV* stash, SV* meth, const char* name, STRLEN len,
                 } else {
                     Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
                         "While trying to resolve method call %.*s->%.*s()"
-                        " can not locate package \"%" SVf "\" yet it is mentioned in @%.*s::ISA"
-                        " (perhaps you forgot to load \"%" SVf "\"?)",
+                        " can not locate package %" SVf_QUOTEDPREFIX " yet it is mentioned in @%.*s::ISA"
+                        " (perhaps you forgot to load %" SVf_QUOTEDPREFIX "?)",
                          (int) hvnamelen, hvname,
                          (int) len, name,
                         SVfARG(linear_sv),
@@ -1202,12 +1199,12 @@ Perl_gv_fetchmethod_pvn_flags(pTHX_ HV *stash, const char *name, const STRLEN le
         }
         else if ( sep_len >= 7 &&
                  strBEGINs(last_separator - 7, "::SUPER")) {
-            /* don't autovifify if ->NoSuchStash::SUPER::method */
+            /* don't autovivify if ->NoSuchStash::SUPER::method */
             stash = gv_stashpvn(origname, sep_len - 7, is_utf8);
             if (stash) flags |= GV_SUPER;
         }
         else {
-            /* don't autovifify if ->NoSuchStash::method */
+            /* don't autovivify if ->NoSuchStash::method */
             stash = gv_stashpvn(origname, sep_len, is_utf8);
         }
         ostash = stash;
@@ -1244,8 +1241,8 @@ Perl_gv_fetchmethod_pvn_flags(pTHX_ HV *stash, const char *name, const STRLEN le
                         return gv;
                 }
                 Perl_croak(aTHX_
-                           "Can't locate object method \"%" UTF8f
-                           "\" via package \"%" HEKf "\"",
+                           "Can't locate object method %" UTF8f_QUOTEDPREFIX ""
+                           " via package %" HEKf_QUOTEDPREFIX,
                                     UTF8fARG(is_utf8, name_end - name, name),
                                     HEKfARG(HvNAME_HEK(stash)));
             }
@@ -1260,9 +1257,9 @@ Perl_gv_fetchmethod_pvn_flags(pTHX_ HV *stash, const char *name, const STRLEN le
                 }
 
                 Perl_croak(aTHX_
-                           "Can't locate object method \"%" UTF8f
-                           "\" via package \"%" SVf "\""
-                           " (perhaps you forgot to load \"%" SVf "\"?)",
+                           "Can't locate object method %" UTF8f_QUOTEDPREFIX ""
+                           " via package %" SVf_QUOTEDPREFIX ""
+                           " (perhaps you forgot to load %" SVf_QUOTEDPREFIX "?)",
                            UTF8fARG(is_utf8, name_end - name, name),
                            SVfARG(packnamesv), SVfARG(packnamesv));
             }
@@ -1293,6 +1290,36 @@ Perl_gv_fetchmethod_pvn_flags(pTHX_ HV *stash, const char *name, const STRLEN le
     return gv;
 }
 
+
+/*
+=for apidoc      gv_autoload_pv
+=for apidoc_item gv_autoload_pvn
+=for apidoc_item gv_autoload_sv
+
+These each search for an C<AUTOLOAD> method, returning NULL if not found, or
+else returning a pointer to its GV, while setting the package
+L<C<$AUTOLOAD>|perlobj/AUTOLOAD> variable to C<name> (fully qualified).  Also,
+if found and the GV's CV is an XSUB, the CV's PV will be set to C<name>, and
+its stash will be set to the stash of the GV.
+
+Searching is done in L<C<MRO> order|perlmroapi>, as specified in
+L</C<gv_fetchmeth>>, beginning with C<stash> if it isn't NULL.
+
+The forms differ only in how C<name> is specified.
+
+In C<gv_autoload_pv>, C<namepv> is a C language NUL-terminated string.
+
+In C<gv_autoload_pvn>, C<name> points to the first byte of the name, and an
+additional parameter, C<len>, specifies its length in bytes.  Hence, C<*name>
+may contain embedded-NUL characters.
+
+In C<gv_autoload_sv>, C<*namesv> is an SV, and the name is the PV extracted
+from that using L</C<SvPV>>.  If the SV is marked as being in UTF-8, the
+extracted PV will also be.
+
+=cut
+*/
+
 GV*
 Perl_gv_autoload_sv(pTHX_ HV *stash, SV* namesv, U32 flags)
 {
@@ -1336,7 +1363,7 @@ Perl_gv_autoload_pvn(pTHX_ HV *stash, const char *name, STRLEN len, U32 flags)
             stash = NULL;
         }
         else
-            packname = sv_2mortal(newSVhek(HvNAME_HEK(stash)));
+            packname = newSVhek_mortal(HvNAME_HEK(stash));
         if (flags & GV_SUPER) sv_catpvs(packname, "::SUPER");
     }
     if (!(gv = gv_fetchmeth_pvn(stash, S_autoload, S_autolen, FALSE,
@@ -1360,15 +1387,15 @@ Perl_gv_autoload_pvn(pTHX_ HV *stash, const char *name, STRLEN len, U32 flags)
                          UTF8fARG(is_utf8, len, name));
 
     if (CvISXSUB(cv)) {
-        /* Instead of forcing the XSUB do another lookup for $AUTOLOAD
+        /* Instead of forcing the XSUB to do another lookup for $AUTOLOAD
          * and split that value on the last '::', pass along the same data
          * via the SvPVX field in the CV, and the stash in CvSTASH.
          *
          * Due to an unfortunate accident of history, the SvPVX field
-         * serves two purposes.  It is also used for the subroutine's pro-
-         * type.  Since SvPVX has been documented as returning the sub name
-         * for a long time, but not as returning the prototype, we have
-         * to preserve the SvPVX AUTOLOAD behaviour and put the prototype
+         * serves two purposes.  It is also used for the subroutine's
+         * prototype.  Since SvPVX has been documented as returning the sub
+         * name for a long time, but not as returning the prototype, we have to
+         * preserve the SvPVX AUTOLOAD behaviour and put the prototype
          * elsewhere.
          *
          * We put the prototype in the same allocated buffer, but after
@@ -1606,7 +1633,7 @@ S_gv_stashpvn_internal(pTHX_ const char *name, U32 namelen, I32 flags)
     stash = GvHV(tmpgv);
     if (!(flags & ~GV_NOADD_MASK) && !stash) return NULL;
     assert(stash);
-    if (!HvNAME_get(stash)) {
+    if (!HvHasNAME(stash)) {
         hv_name_set(stash, name, namelen, flags & SVf_UTF8 ? SVf_UTF8 : 0 );
 
         /* FIXME: This is a repeat of logic in gv_fetchpvn_flags */
@@ -1736,6 +1763,14 @@ S_gv_magicalize_isa(pTHX_ GV *gv)
     GvMULTI_on(gv);
     sv_magic(MUTABLE_SV(av), MUTABLE_SV(gv), PERL_MAGIC_isa,
              NULL, 0);
+
+    if(HvSTASH_IS_CLASS(GvSTASH(gv))) {
+        /* Don't permit modification of @ISA outside of the class management
+         * code. This is temporarily undone by class.c when fiddling with the
+         * array, so it knows it can be done safely.
+         */
+        SvREADONLY_on((SV *)av);
+    }
 }
 
 /* This function grabs name and tries to split a stash and glob
@@ -1812,7 +1847,7 @@ S_parse_gv_stash_name(pTHX_ HV **stash, GV **gv, const char **name,
 
                 if (!(*stash = GvHV(*gv))) {
                     *stash = GvHV(*gv) = newHV();
-                    if (!HvNAME_get(*stash)) {
+                    if (!HvHasNAME(*stash)) {
                         if (GvSTASH(*gv) == PL_defstash && *len == 6
                             && strBEGINs(*name, "CORE"))
                             hv_name_sets(*stash, "CORE", 0);
@@ -1826,7 +1861,7 @@ S_parse_gv_stash_name(pTHX_ HV **stash, GV **gv, const char **name,
                         mro_package_moved(*stash, NULL, *gv, 1);
                     }
                 }
-                else if (!HvNAME_get(*stash))
+                else if (!HvHasNAME(*stash))
                     hv_name_set(*stash, nambeg, name_cursor - nambeg, is_utf8);
             }
 
@@ -2176,29 +2211,37 @@ S_gv_magicalize(pTHX_ GV *gv, HV *stash, const char *name, STRLEN len,
                     require_tie_mod_s(gv, '-', "Tie::Hash::NamedCapture",0);
                 }
                 break;
-            case '\005':       /* $^ENCODING */
+            case '\005':        /* ${^ENCODING} */
                 if (memEQs(name, len, "\005NCODING"))
                     goto magicalize;
                 break;
-            case '\007':       /* $^GLOBAL_PHASE */
+            case '\007':        /* ${^GLOBAL_PHASE} */
                 if (memEQs(name, len, "\007LOBAL_PHASE"))
                     goto ro_magicalize;
                 break;
-            case '\014':       /* $^LAST_FH */
-                if (memEQs(name, len, "\014AST_FH"))
+            case '\010':        /* %{^HOOK} */
+                if (memEQs(name, len, "\010OOK")) {
+                    GvMULTI_on(gv);
+                    HV *hv = GvHVn(gv);
+                    hv_magic(hv, NULL, PERL_MAGIC_hook);
+                }
+                break;
+            case '\014':
+                if ( memEQs(name, len, "\014AST_FH") ||               /* ${^LAST_FH} */
+                     memEQs(name, len, "\014AST_SUCCESSFUL_PATTERN")) /* ${^LAST_SUCCESSFUL_PATTERN} */
                     goto ro_magicalize;
                 break;
-            case '\015':        /* $^MATCH */
+            case '\015':        /* ${^MATCH} */
                 if (memEQs(name, len, "\015ATCH")) {
                     paren = RX_BUFF_IDX_CARET_FULLMATCH;
                     goto storeparen;
                 }
                 break;
-            case '\017':       /* $^OPEN */
+            case '\017':        /* ${^OPEN} */
                 if (memEQs(name, len, "\017PEN"))
                     goto magicalize;
                 break;
-            case '\020':        /* $^PREMATCH  $^POSTMATCH */
+            case '\020':        /* ${^PREMATCH}  ${^POSTMATCH} */
                 if (memEQs(name, len, "\020REMATCH")) {
                     paren = RX_BUFF_IDX_CARET_PREMATCH;
                     goto storeparen;
@@ -2532,8 +2575,8 @@ to C<gv_fetchsv> makes it behave identically to C<gv_fetchsv_nomg>.
 =for apidoc Amnh||GV_ADDMG
 =for apidoc Amnh||GV_ADDMULTI
 =for apidoc Amnh||GV_ADDWARN
-=for apidoc Amnh||GV_NOADD_NOINIT
 =for apidoc Amnh||GV_NOINIT
+=for apidoc Amnh||GV_NOADD_NOINIT
 =for apidoc Amnh||GV_NOTQUAL
 =for apidoc Amnh||GV_NO_SVGMAGIC
 =for apidoc Amnh||SVf_UTF8
@@ -2677,10 +2720,10 @@ Perl_gv_fetchpvn_flags(pTHX_ const char *nambeg, STRLEN full_len, I32 flags,
 }
 
 /*
-=for apidoc      gv_fullname3
-=for apidoc_item gv_fullname4
-=for apidoc_item gv_efullname3
+=for apidoc      gv_efullname3
 =for apidoc_item gv_efullname4
+=for apidoc_item gv_fullname3
+=for apidoc_item gv_fullname4
 
 Place the full package name of C<gv> into C<sv>.  The C<gv_e*> forms return
 instead the effective package name (see L</HvENAME>).
@@ -2713,7 +2756,7 @@ Perl_gv_fullname4(pTHX_ SV *sv, const GV *gv, const char *prefix, bool keepmain)
       }
     }
     else sv_catpvs(sv,"__ANON__::");
-    sv_catsv(sv,sv_2mortal(newSVhek(GvNAME_HEK(gv))));
+    sv_catsv(sv,newSVhek_mortal(GvNAME_HEK(gv)));
 }
 
 void
@@ -2738,7 +2781,7 @@ Perl_gv_check(pTHX_ HV *stash)
 
     PERL_ARGS_ASSERT_GV_CHECK;
 
-    if (!SvOOK(stash))
+    if (!HvHasAUX(stash))
         return;
 
     assert(HvARRAY(stash));
@@ -2757,7 +2800,7 @@ Perl_gv_check(pTHX_ HV *stash)
                 (gv = MUTABLE_GV(HeVAL(entry))) && isGV(gv) && (hv = GvHV(gv)))
             {
                 if (hv != PL_defstash && hv != stash
-                    && !(SvOOK(hv)
+                    && !(HvHasAUX(hv)
                         && (HvAUX(hv)->xhv_aux_flags & HvAUXf_SCAN_STASH))
                 )
                      gv_check(hv);              /* nested package */
@@ -2773,9 +2816,11 @@ Perl_gv_check(pTHX_ HV *stash)
                 if (SvTYPE(gv) != SVt_PVGV || GvMULTI(gv))
                     continue;
                 file = GvFILE(gv);
+                assert(PL_curcop == &PL_compiling);
                 CopLINE_set(PL_curcop, GvLINE(gv));
 #ifdef USE_ITHREADS
-                CopFILE(PL_curcop) = (char *)file;     /* set for warning */
+                SAVECOPFILE_FREE(PL_curcop);
+                CopFILE_set(PL_curcop, (char *)file);  /* set for warning */
 #else
                 CopFILEGV(PL_curcop)
                     = gv_fetchfile_flags(file, HEK_LEN(GvFILE_HEK(gv)), 0);
@@ -2915,12 +2960,12 @@ Perl_gp_free(pTHX_ GV *gv)
          simple problems likely found by fuzzers but never written by humans,
          whilst leaving working code unchanged. */
       if (sv) {
-          SV *referant;
+          SV *referent;
           if (SvREFCNT(sv) > 1 || SvOBJECT(sv) || UNLIKELY(in_global_destruction)) {
               SvREFCNT_dec_NN(sv);
               sv = NULL;
-          } else if (SvROK(sv) && (referant = SvRV(sv))
-                     && (SvREFCNT(referant) > 1 || SvOBJECT(referant))) {
+          } else if (SvROK(sv) && (referent = SvRV(sv))
+                     && (SvREFCNT(referent) > 1 || SvOBJECT(referent))) {
               SvREFCNT_dec_NN(sv);
               sv = NULL;
           } else {
@@ -3110,7 +3155,7 @@ Perl_Gv_AMupdate(pTHX_ HV *stash, bool destructing)
       sv_unmagic(MUTABLE_SV(stash), PERL_MAGIC_overload_table);
   }
 
-  DEBUG_o( Perl_deb(aTHX_ "Recalcing overload magic in package %s\n",HvNAME_get(stash)) );
+  DEBUG_o( Perl_deb(aTHX_ "Recalculating overload magic in package %s\n",HvNAME_get(stash)) );
 
   Zero(&amt,1,AMT);
   amt.was_ok_sub = newgen;
@@ -3152,7 +3197,7 @@ Perl_Gv_AMupdate(pTHX_ HV *stash, bool destructing)
         filled = 1;
     }
 
-    assert(SvOOK(stash));
+    assert(HvHasAUX(stash));
     /* initially assume the worst */
     HvAUX(stash)->xhv_aux_flags &= ~HvAUXf_NO_DEREF;
 
@@ -3274,7 +3319,7 @@ Perl_gv_handler(pTHX_ HV *stash, I32 id)
     U32 newgen;
     struct mro_meta* stash_meta;
 
-    if (!stash || !HvNAME_get(stash))
+    if (!stash || !HvHasNAME(stash))
         return NULL;
 
     stash_meta = HvMROMETA(stash);
@@ -3353,6 +3398,153 @@ Perl_try_amagic_un(pTHX_ int method, int flags) {
 }
 
 
+/*
+=for apidoc amagic_applies
+
+Check C<sv> to see if the overloaded (active magic) operation C<method>
+applies to it. If the sv is not SvROK or it is not an object then returns
+false, otherwise checks if the object is blessed into a class supporting
+overloaded operations, and returns true if a call to amagic_call() with
+this SV and the given method would trigger an amagic operation, including
+via the overload fallback rules or via nomethod. Thus a call like:
+
+    amagic_applies(sv, string_amg, AMG_unary)
+
+would return true for an object with overloading set up in any of the
+following ways:
+
+    use overload q("") => sub { ... };
+    use overload q(0+) => sub { ... }, fallback => 1;
+
+and could be used to tell if a given object would stringify to something
+other than the normal default ref stringification.
+
+Note that the fact that this function returns TRUE does not mean you
+can succesfully perform the operation with amagic_call(), for instance
+any overloaded method might throw a fatal exception,  however if this
+function returns FALSE you can be confident that it will NOT perform
+the given overload operation.
+
+C<method> is an integer enum, one of the values found in F<overload.h>,
+for instance C<string_amg>.
+
+C<flags> should be set to AMG_unary for unary operations.
+
+=cut
+*/
+bool
+Perl_amagic_applies(pTHX_ SV *sv, int method, int flags)
+{
+    PERL_ARGS_ASSERT_AMAGIC_APPLIES;
+    PERL_UNUSED_VAR(flags);
+
+    assert(method >= 0 && method < NofAMmeth);
+
+    if (!SvAMAGIC(sv))
+        return FALSE;
+
+    HV *stash = SvSTASH(SvRV(sv));
+    if (!Gv_AMG(stash))
+        return FALSE;
+
+    MAGIC *mg = mg_find((const SV *)stash, PERL_MAGIC_overload_table);
+    if (!mg)
+        return FALSE;
+
+    CV **cvp = NULL;
+    AMT *amtp = NULL;
+    if (AMT_AMAGIC((AMT *)mg->mg_ptr)) {
+        amtp = (AMT *)mg->mg_ptr;
+        cvp = amtp->table;
+    }
+    if (!cvp)
+        return FALSE;
+
+    if (cvp[method])
+        return TRUE;
+
+    /* Note this logic should be kept in sync with amagic_call() */
+    if (amtp->fallback > AMGfallNEVER && flags & AMGf_unary) {
+         CV *cv;       /* This makes it easier to kee ... */
+         int off,off1; /* ... in sync with amagic_call() */
+
+      /* look for substituted methods */
+      /* In all the covered cases we should be called with assign==0. */
+         switch (method) {
+         case inc_amg:
+           if ((cv = cvp[off=add_ass_amg]) || ((cv = cvp[off = add_amg])))
+               return TRUE;
+           break;
+         case dec_amg:
+           if((cv = cvp[off = subtr_ass_amg]) || ((cv = cvp[off = subtr_amg])))
+               return TRUE;
+           break;
+         case bool__amg:
+           if ((cv = cvp[off=numer_amg]) || (cv = cvp[off=string_amg]))
+               return TRUE;
+           break;
+         case numer_amg:
+           if((cv = cvp[off=string_amg]) || (cv = cvp[off=bool__amg]))
+               return TRUE;
+           break;
+         case string_amg:
+           if((cv = cvp[off=numer_amg]) || (cv = cvp[off=bool__amg]))
+               return TRUE;
+           break;
+         case not_amg:
+           if((cv = cvp[off=bool__amg])
+                  || (cv = cvp[off=numer_amg])
+                  || (cv = cvp[off=string_amg]))
+               return TRUE;
+           break;
+         case abs_amg:
+           if((cvp[off1=lt_amg] || cvp[off1=ncmp_amg])
+               && ((cv = cvp[off=neg_amg]) || (cv = cvp[off=subtr_amg])))
+               return TRUE;
+           break;
+         case neg_amg:
+           if ((cv = cvp[off=subtr_amg]))
+               return TRUE;
+           break;
+         }
+    } else if (((cvp && amtp->fallback > AMGfallNEVER))
+               && !(flags & AMGf_unary)) {
+                                /* We look for substitution for
+                                 * comparison operations and
+                                 * concatenation */
+      if (method==concat_amg || method==concat_ass_amg
+          || method==repeat_amg || method==repeat_ass_amg) {
+        return FALSE;            /* Delegate operation to string conversion */
+      }
+      switch (method) {
+         case lt_amg:
+         case le_amg:
+         case gt_amg:
+         case ge_amg:
+         case eq_amg:
+         case ne_amg:
+             if (cvp[ncmp_amg])
+                 return TRUE;
+             break;
+         case slt_amg:
+         case sle_amg:
+         case sgt_amg:
+         case sge_amg:
+         case seq_amg:
+         case sne_amg:
+             if (cvp[scmp_amg])
+                 return TRUE;
+             break;
+      }
+    }
+
+    if (cvp[nomethod_amg])
+        return TRUE;
+
+    return FALSE;
+}
+
+
 /* Implement tryAMAGICbin_MG macro.
    Do get magic, then see if the two stack args are overloaded and if so
    call it.
@@ -3448,7 +3640,7 @@ Perl_amagic_deref_call(pTHX_ SV *ref, int method) {
         return ref;
     /* return quickly if none of the deref ops are overloaded */
     stash = SvSTASH(SvRV(ref));
-    assert(SvOOK(stash));
+    assert(HvHasAUX(stash));
     if (HvAUX(stash)->xhv_aux_flags & HvAUXf_NO_DEREF)
         return ref;
 
@@ -3560,9 +3752,11 @@ Perl_amagic_call(pTHX_ SV *left, SV *right, int method, int flags)
 #ifdef DEBUGGING
                    fl = 1,
 #endif
-                   cv = cvp[off=method])))) {
+                   cv = cvp[off=method]))))
+  {
     lr = -1;                   /* Call method for left argument */
   } else {
+    /* Note this logic should be kept in sync with amagic_applies() */
     if (cvp && amtp->fallback > AMGfallNEVER && flags & AMGf_unary) {
       int logic;
 
@@ -3756,7 +3950,7 @@ Perl_amagic_call(pTHX_ SV *left, SV *right, int method, int flags)
                         "in overloaded package ":
                         "has no overloaded magic",
                       SvAMAGIC(left)?
-                        SVfARG(sv_2mortal(newSVhek(HvNAME_HEK(SvSTASH(SvRV(left)))))):
+                        SVfARG(newSVhek_mortal(HvNAME_HEK(SvSTASH(SvRV(left))))):
                         SVfARG(&PL_sv_no),
                       SvAMAGIC(right)?
                         ",\n\tright argument in overloaded package ":
@@ -3764,7 +3958,7 @@ Perl_amagic_call(pTHX_ SV *left, SV *right, int method, int flags)
                          ? ""
                          : ",\n\tright argument has no overloaded magic"),
                       SvAMAGIC(right)?
-                        SVfARG(sv_2mortal(newSVhek(HvNAME_HEK(SvSTASH(SvRV(right)))))):
+                        SVfARG(newSVhek_mortal(HvNAME_HEK(SvSTASH(SvRV(right))))):
                         SVfARG(&PL_sv_no)));
         if (use_default_op) {
           DEBUG_o( Perl_deb(aTHX_ "%" SVf, SVfARG(msg)) );
@@ -3850,12 +4044,12 @@ Perl_amagic_call(pTHX_ SV *left, SV *right, int method, int flags)
                      flags & AMGf_unary? "" :
                      lr==1 ? " for right argument": " for left argument",
                      flags & AMGf_unary? " for argument" : "",
-                     stash ? SVfARG(sv_2mortal(newSVhek(HvNAME_HEK(stash)))) : SVfARG(newSVpvs_flags("null", SVs_TEMP)),
+                     stash ? SVfARG(newSVhek_mortal(HvNAME_HEK(stash))) : SVfARG(newSVpvs_flags("null", SVs_TEMP)),
                      fl? ",\n\tassignment variant used": "") );
   }
 #endif
     /* Since we use shallow copy during assignment, we need
-     * to dublicate the contents, probably calling user-supplied
+     * to duplicate the contents, probably calling user-supplied
      * version of copy operator
      */
     /* We need to copy in following cases:
@@ -3893,7 +4087,7 @@ Perl_amagic_call(pTHX_ SV *left, SV *right, int method, int flags)
 
   {
     dSP;
-    BINOP myop;
+    UNOP myop;
     SV* res;
     const bool oldcatch = CATCH_GET;
     I32 oldmark, nret;
@@ -3905,10 +4099,11 @@ Perl_amagic_call(pTHX_ SV *left, SV *right, int method, int flags)
                     ? G_SCALAR : GIMME_V;
 
     CATCH_SET(TRUE);
-    Zero(&myop, 1, BINOP);
-    myop.op_last = (OP *) &myop;
-    myop.op_next = NULL;
+    Zero(&myop, 1, UNOP);
     myop.op_flags = OPf_STACKED;
+    myop.op_ppaddr = PL_ppaddr[OP_ENTERSUB];
+    myop.op_type = OP_ENTERSUB;
+
 
     switch (gimme) {
         case G_VOID:
@@ -3948,9 +4143,7 @@ Perl_amagic_call(pTHX_ SV *left, SV *right, int method, int flags)
     PUSHs(MUTABLE_SV(cv));
     PUTBACK;
     oldmark = TOPMARK;
-
-    if ((PL_op = PL_ppaddr[OP_ENTERSUB](aTHX)))
-      CALLRUNOPS(aTHX);
+    CALLRUNOPS(aTHX);
     LEAVE;
     SPAGAIN;
     nret = SP - (PL_stack_base + oldmark);
@@ -4022,6 +4215,18 @@ Perl_amagic_call(pTHX_ SV *left, SV *right, int method, int flags)
   }
 }
 
+/*
+=for apidoc gv_name_set
+
+Set the name for GV C<gv> to C<name> which is C<len> bytes long.  Thus it may
+contain embedded NUL characters.
+
+If C<flags> contains C<SVf_UTF8>, the name is treated as being encoded in
+UTF-8; otherwise not.
+
+=cut
+*/
+
 void
 Perl_gv_name_set(pTHX_ GV *gv, const char *name, U32 len, U32 flags)
 {
@@ -4099,13 +4304,13 @@ Perl_gv_try_downgrade(pTHX_ GV *gv)
     } else if (GvMULTI(gv) && cv && SvREFCNT(cv) == 1 &&
             !SvOBJECT(cv) && !SvMAGICAL(cv) && !SvREADONLY(cv) &&
             CvSTASH(cv) == stash && !CvNAMED(cv) && CvGV(cv) == gv &&
-            CvCONST(cv) && !CvMETHOD(cv) && !CvLVALUE(cv) && !CvUNIQUE(cv) &&
+            CvCONST(cv) && !CvNOWARN_AMBIGUOUS(cv) && !CvLVALUE(cv) && !CvUNIQUE(cv) &&
             !CvNODEBUG(cv) && !CvCLONE(cv) && !CvCLONED(cv) && !CvANON(cv) &&
             (namehek = GvNAME_HEK(gv)) &&
             (gvp = hv_fetchhek(stash, namehek, 0)) &&
             *gvp == (SV*)gv) {
         SV *value = SvREFCNT_inc(CvXSUBANY(cv).any_ptr);
-        const bool imported = !!GvIMPORTED_CV(gv);
+        const bool imported = cBOOL(GvIMPORTED_CV(gv));
         SvREFCNT(gv) = 0;
         sv_clear((SV*)gv);
         SvREFCNT(gv) = 1;
index f3dbaab..68865b9 100644 (file)
@@ -28,7 +28,7 @@ struct gp {
 
 #if defined (DEBUGGING) && defined(PERL_USE_GCC_BRACE_GROUPS) && !defined(__INTEL_COMPILER)
 #  define GvGP(gv)                                                     \
-        (0+(*({GV *const _gvgp = (GV *) (gv);                          \
+        ((GP *)(*({GV *const _gvgp = (GV *) (gv);                              \
             assert(SvTYPE(_gvgp) == SVt_PVGV || SvTYPE(_gvgp) == SVt_PVLV); \
             assert(isGV_with_GP(_gvgp));                               \
             &((_gvgp)->sv_u.svu_gp);})))
@@ -134,7 +134,7 @@ Return the CV from the GV.
                          GvGP(gv)->gp_hv : \
                          GvGP(gv_HVadd(gv))->gp_hv)
 
-#define GvCV(gv)       (0+GvGP(gv)->gp_cv)
+#define GvCV(gv)       ((CV*)GvGP(gv)->gp_cv)
 #define GvCV_set(gv,cv)        (GvGP(gv)->gp_cv = (cv))
 #define GvCVGEN(gv)    (GvGP(gv)->gp_cvgen)
 #define GvCVu(gv)      (GvGP(gv)->gp_cvgen ? NULL : GvGP(gv)->gp_cv)
@@ -162,7 +162,7 @@ Return the CV from the GV.
 #define GVf_INTRO      0x01
 #define GVf_MULTI      0x02
 #define GVf_ASSUMECV   0x04
-/*     UNUSED          0x08 */
+#define GVf_RESERVED    0x08   /* unused */
 #define GVf_IMPORTED   0xF0
 #define GVf_IMPORTED_SV          0x10
 #define GVf_IMPORTED_AV          0x20
@@ -269,7 +269,7 @@ Return the CV from the GV.
 #define gv_fetchmethod(stash, name) gv_fetchmethod_autoload(stash, name, TRUE)
 #define gv_fetchsv_nomg(n,f,t) gv_fetchsv(n,(f)|GV_NO_SVGMAGIC,t)
 #define gv_init(gv,stash,name,len,multi) \
-        gv_init_pvn(gv,stash,name,len,GV_ADDMULTI*!!(multi))
+        gv_init_pvn(gv,stash,name,len,GV_ADDMULTI*cBOOL(multi))
 #define gv_fetchmeth(stash,name,len,level) gv_fetchmeth_pvn(stash, name, len, level, 0)
 #define gv_fetchmeth_autoload(stash,name,len,level) gv_fetchmeth_pvn_autoload(stash, name, len, level, 0)
 #define gv_fetchmethod_flags(stash,name,flags) gv_fetchmethod_pv_flags(stash, name, flags)
@@ -281,7 +281,7 @@ Equivalent to C<L</gv_autoload_pvn>>.
 =cut
 */
 #define gv_autoload4(stash, name, len, autoload) \
-        gv_autoload_pvn(stash, name, len, !!(autoload))
+        gv_autoload_pvn(stash, name, len, cBOOL(autoload))
 #define newGVgen(pack)  newGVgen_flags(pack, 0)
 #define gv_method_changed(gv)              \
     (                                       \
index e314d33..1714584 100644 (file)
@@ -70,13 +70,13 @@ from it, and are very unlikely to change
 
 /*
 =for apidoc_section $SV
-=for apidoc Am|void *|MUTABLE_PTR|void * p
-=for apidoc_item |AV *|MUTABLE_AV|AV * p
-=for apidoc_item |CV *|MUTABLE_CV|CV * p
-=for apidoc_item |GV *|MUTABLE_GV|GV * p
-=for apidoc_item |HV *|MUTABLE_HV|HV * p
-=for apidoc_item |IO *|MUTABLE_IO|IO * p
-=for apidoc_item |SV *|MUTABLE_SV|SV * p
+=for apidoc   Am |AV *  |MUTABLE_AV |AV * p
+=for apidoc_item |CV *  |MUTABLE_CV |CV * p
+=for apidoc_item |GV *  |MUTABLE_GV |GV * p
+=for apidoc_item |HV *  |MUTABLE_HV |HV * p
+=for apidoc_item |IO *  |MUTABLE_IO |IO * p
+=for apidoc_item |void *|MUTABLE_PTR|void * p
+=for apidoc_item |SV *  |MUTABLE_SV |SV * p
 
 The C<MUTABLE_I<*>>() macros cast pointers to the types shown, in such a way
 (compiler permitting) that casting away const-ness will give a warning;
@@ -91,8 +91,10 @@ C<MUTABLE_PTR> is the base macro used to derive new casts.  The other
 already-built-in ones return pointers to what their names indicate.
 
 =cut
- */
 
+The brace group version will raise a diagnostic if 'p' is const; the other
+blindly casts away const.
+ */
 #if defined(PERL_USE_GCC_BRACE_GROUPS)
 #  define MUTABLE_PTR(p) ({ void *p_ = (p); p_; })
 #else
@@ -106,6 +108,34 @@ already-built-in ones return pointers to what their names indicate.
 #define MUTABLE_IO(p)  ((IO *)MUTABLE_PTR(p))
 #define MUTABLE_SV(p)  ((SV *)MUTABLE_PTR(p))
 
+/*
+=for apidoc_section $SV
+=for apidoc   Am |AV *|AV_FROM_REF|SV * ref
+=for apidoc_item |CV *|CV_FROM_REF|SV * ref
+=for apidoc_item |HV *|HV_FROM_REF|SV * ref
+
+The C<I<*>V_FROM_REF> macros extract the C<SvRV()> from a given reference SV
+and return a suitably-cast to pointer to the referenced SV. When running
+under C<-DDEBUGGING>, assertions are also applied that check that I<ref> is
+definitely a reference SV that refers to an SV of the right type.
+
+=cut
+*/
+
+#if defined(DEBUGGING) && defined(PERL_USE_GCC_BRACE_GROUPS)
+#  define xV_FROM_REF(XV, ref)  \
+    ({ SV *_ref = ref; \
+       assert(SvROK(_ref)); \
+       assert(SvTYPE(SvRV(_ref)) == SVt_PV ## XV); \
+       (XV *)(SvRV(_ref)); })
+#else
+#  define xV_FROM_REF(XV, ref)  ((XV *)(SvRV(ref)))
+#endif
+
+#define AV_FROM_REF(ref)  xV_FROM_REF(AV, ref)
+#define CV_FROM_REF(ref)  xV_FROM_REF(CV, ref)
+#define HV_FROM_REF(ref)  xV_FROM_REF(HV, ref)
+
 #ifndef __cplusplus
 #  include <stdbool.h>
 #endif
@@ -130,10 +160,13 @@ required, but is kept for backwards compatibility.
  * XXX Similarly, a Configure probe for __FILE__ and __LINE__ is needed. */
 #if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || (defined(__SUNPRO_C)) /* C99 or close enough. */
 #  define FUNCTION__ __func__
-#elif (defined(__DECC_VER)) /* Tru64 or VMS, and strict C89 being used, but not modern enough cc (in Tur64, -c99 not known, only -std1). */
-#  define FUNCTION__ ""
+#  define SAFE_FUNCTION__ __func__
+#elif (defined(__DECC_VER)) /* Tru64 or VMS, and strict C89 being used, but not modern enough cc (in Tru64, -c99 not known, only -std1). */
+#  define FUNCTION__ ("")
+#  define SAFE_FUNCTION__ ("UNKNOWN")
 #else
 #  define FUNCTION__ __FUNCTION__ /* Common extension. */
+#  define SAFE_FUNCTION__ __FUNCTION__ /* Common extension. */
 #endif
 
 /* XXX A note on the perl source internal type system.  The
@@ -270,17 +303,17 @@ don't, so that you can portably take advantage of this C99 feature.
 
 =cut
 */
-#  ifdef I_STDINT
+#ifdef I_STDINT
     typedef  int_fast8_t  PERL_INT_FAST8_T;
     typedef uint_fast8_t  PERL_UINT_FAST8_T;
     typedef  int_fast16_t PERL_INT_FAST16_T;
     typedef uint_fast16_t PERL_UINT_FAST16_T;
-#  else
+#else
     typedef int           PERL_INT_FAST8_T;
     typedef unsigned int  PERL_UINT_FAST8_T;
     typedef int           PERL_INT_FAST16_T;
     typedef unsigned int  PERL_UINT_FAST16_T;
-#  endif
+#endif
 
 /* log(2) (i.e., log base 10 of 2) is pretty close to 0.30103, just in case
  * anyone is grepping for it.  So BIT_DIGITS gives the number of decimal digits
@@ -395,12 +428,6 @@ string/length pair.
 =for apidoc Am|SV**|hv_fetchs|HV* tb|"key"|I32 lval
 Like C<hv_fetch>, but takes a literal string instead of a
 string/length pair.
-
-=for apidoc Am|SV**|hv_stores|HV* tb|"key"|SV* val
-Like C<hv_store>, but takes a literal string instead of a
-string/length pair
-and omits the hash parameter.
-
 =for apidoc_section $lexer
 
 =for apidoc Amx|void|lex_stuff_pvs|"pv"|U32 flags
@@ -454,8 +481,6 @@ Perl_xxx(aTHX_ ...) form for any API calls where it's used.
 #define gv_fetchpvs(namebeg, flags, sv_type) \
     Perl_gv_fetchpvn_flags(aTHX_ STR_WITH_LEN(namebeg), flags, sv_type)
 #define  gv_fetchpvn  gv_fetchpvn_flags
-#define sv_catxmlpvs(dsv, str, utf8) \
-    Perl_sv_catxmlpvn(aTHX_ dsv, STR_WITH_LEN(str), utf8)
 
 
 #define lex_stuff_pvs(pv,flags) Perl_lex_stuff_pvn(aTHX_ STR_WITH_LEN(pv), flags)
@@ -491,11 +516,11 @@ Perl_xxx(aTHX_ ...) form for any API calls where it's used.
 /*
 =for apidoc_section $versioning
 =for apidoc AmR|bool|PERL_VERSION_EQ|const U8 major|const U8 minor|const U8 patch
-=for apidoc_item PERL_VERSION_NE
-=for apidoc_item PERL_VERSION_LT
-=for apidoc_item PERL_VERSION_LE
-=for apidoc_item PERL_VERSION_GT
 =for apidoc_item PERL_VERSION_GE
+=for apidoc_item PERL_VERSION_GT
+=for apidoc_item PERL_VERSION_LE
+=for apidoc_item PERL_VERSION_LT
+=for apidoc_item PERL_VERSION_NE
 
 Returns whether or not the perl currently being compiled has the specified
 relationship to the perl given by the parameters.  For example,
@@ -618,7 +643,7 @@ C<l1> gives the number of bytes in C<s1>.
 Returns true or false.
 
 =for apidoc Am|bool|memCHRs|"list"|char c
-Returns the position of the first occurence of the byte C<c> in the literal
+Returns the position of the first occurrence of the byte C<c> in the literal
 string C<"list">, or NULL if C<c> doesn't appear in C<"list">.  All bytes are
 treated as unsigned char.  Thus this macro can be used to determine if C<c> is
 in a set of particular characters.  Unlike L<strchr(3)>, it works even if C<c>
@@ -725,12 +750,12 @@ based on the underlying C library functions):
  * it comes to /\w+/ with tainting enabled, we *must* be able
  * to trust our character classes.
  *
- * Therefore, the default tests in the text of Perl will be
- * independent of locale.  Any code that wants to depend on
- * the current locale will use the tests that begin with "lc".
+ * Therefore, the default tests in the text of Perl will be independent of
+ * locale.  Any code that wants to depend on the current locale will use the
+ * macros that contain _LC in their names
  */
 
-#ifdef USE_LOCALE
+#ifdef USE_LOCALE_CTYPE
 #  ifndef CTYPE256
 #    define CTYPE256
 #  endif
@@ -814,13 +839,13 @@ future releases.
 
 =for apidoc Am|bool|isALPHA|UV ch
 =for apidoc_item ||isALPHA_A|UV ch
-=for apidoc_item ||isALPHA_L1|UV ch
-=for apidoc_item ||isALPHA_uvchr|UV ch
-=for apidoc_item ||isALPHA_utf8_safe|U8 * s|U8 * end
-=for apidoc_item ||isALPHA_utf8|U8 * s|U8 * end
 =for apidoc_item ||isALPHA_LC|UV ch
-=for apidoc_item ||isALPHA_LC_uvchr|UV ch
 =for apidoc_item ||isALPHA_LC_utf8_safe|U8 * s| U8 *end
+=for apidoc_item ||isALPHA_LC_uvchr|UV ch
+=for apidoc_item ||isALPHA_L1|UV ch
+=for apidoc_item ||isALPHA_utf8|U8 * s|U8 * end
+=for apidoc_item ||isALPHA_utf8_safe|U8 * s|U8 * end
+=for apidoc_item ||isALPHA_uvchr|UV ch
 Returns a boolean indicating whether the specified input is one of C<[A-Za-z]>,
 analogous to C<m/[[:alpha:]]/>.
 See the L<top of this section|/Character classification> for an explanation of
@@ -833,38 +858,39 @@ that would be interested in them, such as Devel::PPPort
 
 =for apidoc Am|bool|isALPHANUMERIC|UV ch
 =for apidoc_item ||isALPHANUMERIC_A|UV ch
-=for apidoc_item ||isALPHANUMERIC_L1|UV ch
-=for apidoc_item ||isALPHANUMERIC_uvchr|UV ch
-=for apidoc_item ||isALPHANUMERIC_utf8_safe|U8 * s|U8 * end
-=for apidoc_item ||isALPHANUMERIC_utf8|U8 * s|U8 * end
 =for apidoc_item ||isALPHANUMERIC_LC|UV ch
-=for apidoc_item ||isALPHANUMERIC_LC_uvchr|UV ch
 =for apidoc_item ||isALPHANUMERIC_LC_utf8_safe|U8 * s| U8 *end
-=for apidoc_item ||isALNUMC|UV ch
-=for apidoc_item ||isALNUMC_A|UV ch
-=for apidoc_item ||isALNUMC_L1|UV ch
-=for apidoc_item ||isALNUMC_LC|UV ch
-=for apidoc_item ||isALNUMC_LC_uvchr|UV ch
+=for apidoc_item ||isALPHANUMERIC_LC_uvchr|UV ch
+=for apidoc_item ||isALPHANUMERIC_L1|UV ch
+=for apidoc_item ||isALPHANUMERIC_utf8|U8 * s|U8 * end
+=for apidoc_item ||isALPHANUMERIC_utf8_safe|U8 * s|U8 * end
+=for apidoc_item ||isALPHANUMERIC_uvchr|UV ch
 Returns a boolean indicating whether the specified character is one of
 C<[A-Za-z0-9]>, analogous to C<m/[[:alnum:]]/>.
 See the L<top of this section|/Character classification> for an explanation of
 the variants.
 
-A (discouraged from use) synonym is C<isALNUMC> (where the C<C> suffix means
-this corresponds to the C language alphanumeric definition).  Also
-there are the variants
-C<isALNUMC_A>, C<isALNUMC_L1>
-C<isALNUMC_LC>, and C<isALNUMC_LC_uvchr>.
+=for apidoc Am|bool|isALNUMC|UV ch
+=for apidoc_item  ||isALNUMC_A|UV ch
+=for apidoc_item  ||isALNUMC_LC|UV ch
+=for apidoc_item  ||isALNUMC_LC_uvchr|UV ch
+=for apidoc_item  ||isALNUMC_L1|UV ch
+These are discouraged, backward compatibility macros for L</C<isALPHANUMERIC>>.
+That is, each returns a boolean indicating whether the specified character is
+one of C<[A-Za-z0-9]>, analogous to C<m/[[:alnum:]]/>.
+
+The C<C> suffix in the names was meant to indicate that they correspond to the
+C language L<C<isalnum(3)>>.
 
 =for apidoc Am|bool|isASCII|UV ch
 =for apidoc_item ||isASCII_A|UV ch
-=for apidoc_item ||isASCII_L1|UV ch
-=for apidoc_item ||isASCII_uvchr|UV ch
-=for apidoc_item ||isASCII_utf8_safe|U8 * s|U8 * end
-=for apidoc_item ||isASCII_utf8|U8 * s|U8 * end
 =for apidoc_item ||isASCII_LC|UV ch
-=for apidoc_item ||isASCII_LC_uvchr|UV ch
 =for apidoc_item ||isASCII_LC_utf8_safe|U8 * s| U8 *end
+=for apidoc_item ||isASCII_LC_uvchr|UV ch
+=for apidoc_item ||isASCII_L1|UV ch
+=for apidoc_item ||isASCII_utf8|U8 * s|U8 * end
+=for apidoc_item ||isASCII_utf8_safe|U8 * s|U8 * end
+=for apidoc_item ||isASCII_uvchr|UV ch
 Returns a boolean indicating whether the specified character is one of the 128
 characters in the ASCII character set, analogous to C<m/[[:ascii:]]/>.
 On non-ASCII platforms, it returns TRUE iff this
@@ -884,13 +910,13 @@ C<isASCII_utf8_safe> will work properly on any string encoded or not in UTF-8.
 
 =for apidoc Am|bool|isBLANK|UV ch
 =for apidoc_item ||isBLANK_A|UV ch
-=for apidoc_item ||isBLANK_L1|UV ch
-=for apidoc_item ||isBLANK_uvchr|UV ch
-=for apidoc_item ||isBLANK_utf8_safe|U8 * s|U8 * end
-=for apidoc_item ||isBLANK_utf8|U8 * s|U8 * end
 =for apidoc_item ||isBLANK_LC|UV ch
-=for apidoc_item ||isBLANK_LC_uvchr|UV ch
 =for apidoc_item ||isBLANK_LC_utf8_safe|U8 * s| U8 *end
+=for apidoc_item ||isBLANK_LC_uvchr|UV ch
+=for apidoc_item ||isBLANK_L1|UV ch
+=for apidoc_item ||isBLANK_utf8|U8 * s|U8 * end
+=for apidoc_item ||isBLANK_utf8_safe|U8 * s|U8 * end
+=for apidoc_item ||isBLANK_uvchr|UV ch
 Returns a boolean indicating whether the specified character is a
 character considered to be a blank, analogous to C<m/[[:blank:]]/>.
 See the L<top of this section|/Character classification> for an explanation of
@@ -902,13 +928,13 @@ the same as the corresponding ones without.
 
 =for apidoc Am|bool|isCNTRL|UV ch
 =for apidoc_item ||isCNTRL_A|UV ch
-=for apidoc_item ||isCNTRL_L1|UV ch
-=for apidoc_item ||isCNTRL_uvchr|UV ch
-=for apidoc_item ||isCNTRL_utf8_safe|U8 * s|U8 * end
-=for apidoc_item ||isCNTRL_utf8|U8 * s|U8 * end
 =for apidoc_item ||isCNTRL_LC|UV ch
-=for apidoc_item ||isCNTRL_LC_uvchr|UV ch
 =for apidoc_item ||isCNTRL_LC_utf8_safe|U8 * s| U8 *end
+=for apidoc_item ||isCNTRL_LC_uvchr|UV ch
+=for apidoc_item ||isCNTRL_L1|UV ch
+=for apidoc_item ||isCNTRL_utf8|U8 * s|U8 * end
+=for apidoc_item ||isCNTRL_utf8_safe|U8 * s|U8 * end
+=for apidoc_item ||isCNTRL_uvchr|UV ch
 
 Returns a boolean indicating whether the specified character is a
 control character, analogous to C<m/[[:cntrl:]]/>.
@@ -918,13 +944,13 @@ On EBCDIC platforms, you almost always want to use the C<isCNTRL_L1> variant.
 
 =for apidoc Am|bool|isDIGIT|UV ch
 =for apidoc_item ||isDIGIT_A|UV ch
-=for apidoc_item ||isDIGIT_L1|UV ch
-=for apidoc_item ||isDIGIT_uvchr|UV ch
-=for apidoc_item ||isDIGIT_utf8_safe|U8 * s|U8 * end
-=for apidoc_item ||isDIGIT_utf8|U8 * s|U8 * end
 =for apidoc_item ||isDIGIT_LC|UV ch
-=for apidoc_item ||isDIGIT_LC_uvchr|UV ch
 =for apidoc_item ||isDIGIT_LC_utf8_safe|U8 * s| U8 *end
+=for apidoc_item ||isDIGIT_LC_uvchr|UV ch
+=for apidoc_item ||isDIGIT_L1|UV ch
+=for apidoc_item ||isDIGIT_utf8|U8 * s|U8 * end
+=for apidoc_item ||isDIGIT_utf8_safe|U8 * s|U8 * end
+=for apidoc_item ||isDIGIT_uvchr|UV ch
 
 Returns a boolean indicating whether the specified character is a
 digit, analogous to C<m/[[:digit:]]/>.
@@ -934,13 +960,13 @@ the variants.
 
 =for apidoc Am|bool|isGRAPH|UV ch
 =for apidoc_item ||isGRAPH_A|UV ch
-=for apidoc_item ||isGRAPH_L1|UV ch
-=for apidoc_item ||isGRAPH_uvchr|UV ch
-=for apidoc_item ||isGRAPH_utf8_safe|U8 * s|U8 * end
-=for apidoc_item ||isGRAPH_utf8|U8 * s|U8 * end
 =for apidoc_item ||isGRAPH_LC|UV ch
-=for apidoc_item ||isGRAPH_LC_uvchr|UV ch
 =for apidoc_item ||isGRAPH_LC_utf8_safe|U8 * s| U8 *end
+=for apidoc_item ||isGRAPH_LC_uvchr|UV ch
+=for apidoc_item ||isGRAPH_L1|UV ch
+=for apidoc_item ||isGRAPH_utf8|U8 * s|U8 * end
+=for apidoc_item ||isGRAPH_utf8_safe|U8 * s|U8 * end
+=for apidoc_item ||isGRAPH_uvchr|UV ch
 Returns a boolean indicating whether the specified character is a
 graphic character, analogous to C<m/[[:graph:]]/>.
 See the L<top of this section|/Character classification> for an explanation of
@@ -948,13 +974,13 @@ the variants.
 
 =for apidoc Am|bool|isLOWER|UV ch
 =for apidoc_item ||isLOWER_A|UV ch
-=for apidoc_item ||isLOWER_L1|UV ch
-=for apidoc_item ||isLOWER_uvchr|UV ch
-=for apidoc_item ||isLOWER_utf8_safe|U8 * s|U8 * end
-=for apidoc_item ||isLOWER_utf8|U8 * s|U8 * end
 =for apidoc_item ||isLOWER_LC|UV ch
-=for apidoc_item ||isLOWER_LC_uvchr|UV ch
 =for apidoc_item ||isLOWER_LC_utf8_safe|U8 * s| U8 *end
+=for apidoc_item ||isLOWER_LC_uvchr|UV ch
+=for apidoc_item ||isLOWER_L1|UV ch
+=for apidoc_item ||isLOWER_utf8|U8 * s|U8 * end
+=for apidoc_item ||isLOWER_utf8_safe|U8 * s|U8 * end
+=for apidoc_item ||isLOWER_uvchr|UV ch
 Returns a boolean indicating whether the specified character is a
 lowercase character, analogous to C<m/[[:lower:]]/>.
 See the L<top of this section|/Character classification> for an explanation of
@@ -970,13 +996,13 @@ C<isOCTAL>.
 
 =for apidoc Am|bool|isPUNCT|UV ch
 =for apidoc_item ||isPUNCT_A|UV ch
-=for apidoc_item ||isPUNCT_L1|UV ch
-=for apidoc_item ||isPUNCT_uvchr|UV ch
-=for apidoc_item ||isPUNCT_utf8_safe|U8 * s|U8 * end
-=for apidoc_item ||isPUNCT_utf8|U8 * s|U8 * end
 =for apidoc_item ||isPUNCT_LC|UV ch
-=for apidoc_item ||isPUNCT_LC_uvchr|UV ch
 =for apidoc_item ||isPUNCT_LC_utf8_safe|U8 * s| U8 *end
+=for apidoc_item ||isPUNCT_LC_uvchr|UV ch
+=for apidoc_item ||isPUNCT_L1|UV ch
+=for apidoc_item ||isPUNCT_utf8|U8 * s|U8 * end
+=for apidoc_item ||isPUNCT_utf8_safe|U8 * s|U8 * end
+=for apidoc_item ||isPUNCT_uvchr|UV ch
 Returns a boolean indicating whether the specified character is a
 punctuation character, analogous to C<m/[[:punct:]]/>.
 Note that the definition of what is punctuation isn't as
@@ -987,13 +1013,13 @@ the variants.
 
 =for apidoc Am|bool|isSPACE|UV ch
 =for apidoc_item ||isSPACE_A|UV ch
-=for apidoc_item ||isSPACE_L1|UV ch
-=for apidoc_item ||isSPACE_uvchr|UV ch
-=for apidoc_item ||isSPACE_utf8_safe|U8 * s|U8 * end
-=for apidoc_item ||isSPACE_utf8|U8 * s|U8 * end
 =for apidoc_item ||isSPACE_LC|UV ch
-=for apidoc_item ||isSPACE_LC_uvchr|UV ch
 =for apidoc_item ||isSPACE_LC_utf8_safe|U8 * s| U8 *end
+=for apidoc_item ||isSPACE_LC_uvchr|UV ch
+=for apidoc_item ||isSPACE_L1|UV ch
+=for apidoc_item ||isSPACE_utf8|U8 * s|U8 * end
+=for apidoc_item ||isSPACE_utf8_safe|U8 * s|U8 * end
+=for apidoc_item ||isSPACE_uvchr|UV ch
 Returns a boolean indicating whether the specified character is a
 whitespace character.  This is analogous
 to what C<m/\s/> matches in a regular expression.  Starting in Perl 5.18
@@ -1007,13 +1033,13 @@ the variants.
 
 =for apidoc Am|bool|isPSXSPC|UV ch
 =for apidoc_item ||isPSXSPC_A|UV ch
-=for apidoc_item ||isPSXSPC_L1|UV ch
-=for apidoc_item ||isPSXSPC_uvchr|UV ch
-=for apidoc_item ||isPSXSPC_utf8_safe|U8 * s|U8 * end
-=for apidoc_item ||isPSXSPC_utf8|U8 * s|U8 * end
 =for apidoc_item ||isPSXSPC_LC|UV ch
-=for apidoc_item ||isPSXSPC_LC_uvchr|UV ch
 =for apidoc_item ||isPSXSPC_LC_utf8_safe|U8 * s| U8 *end
+=for apidoc_item ||isPSXSPC_LC_uvchr|UV ch
+=for apidoc_item ||isPSXSPC_L1|UV ch
+=for apidoc_item ||isPSXSPC_utf8|U8 * s|U8 * end
+=for apidoc_item ||isPSXSPC_utf8_safe|U8 * s|U8 * end
+=for apidoc_item ||isPSXSPC_uvchr|UV ch
 (short for Posix Space)
 Starting in 5.18, this is identical in all its forms to the
 corresponding C<isSPACE()> macros.
@@ -1028,13 +1054,13 @@ the variants.
 
 =for apidoc Am|bool|isUPPER|UV ch
 =for apidoc_item ||isUPPER_A|UV ch
-=for apidoc_item ||isUPPER_L1|UV ch
-=for apidoc_item ||isUPPER_uvchr|UV ch
-=for apidoc_item ||isUPPER_utf8_safe|U8 * s|U8 * end
-=for apidoc_item ||isUPPER_utf8|U8 * s|U8 * end
 =for apidoc_item ||isUPPER_LC|UV ch
-=for apidoc_item ||isUPPER_LC_uvchr|UV ch
 =for apidoc_item ||isUPPER_LC_utf8_safe|U8 * s| U8 *end
+=for apidoc_item ||isUPPER_LC_uvchr|UV ch
+=for apidoc_item ||isUPPER_L1|UV ch
+=for apidoc_item ||isUPPER_utf8|U8 * s|U8 * end
+=for apidoc_item ||isUPPER_utf8_safe|U8 * s|U8 * end
+=for apidoc_item ||isUPPER_uvchr|UV ch
 Returns a boolean indicating whether the specified character is an
 uppercase character, analogous to C<m/[[:upper:]]/>.
 See the L<top of this section|/Character classification> for an explanation of
@@ -1042,13 +1068,13 @@ the variants.
 
 =for apidoc Am|bool|isPRINT|UV ch
 =for apidoc_item ||isPRINT_A|UV ch
-=for apidoc_item ||isPRINT_L1|UV ch
-=for apidoc_item ||isPRINT_uvchr|UV ch
-=for apidoc_item ||isPRINT_utf8_safe|U8 * s|U8 * end
-=for apidoc_item ||isPRINT_utf8|U8 * s|U8 * end
 =for apidoc_item ||isPRINT_LC|UV ch
-=for apidoc_item ||isPRINT_LC_uvchr|UV ch
 =for apidoc_item ||isPRINT_LC_utf8_safe|U8 * s| U8 *end
+=for apidoc_item ||isPRINT_LC_uvchr|UV ch
+=for apidoc_item ||isPRINT_L1|UV ch
+=for apidoc_item ||isPRINT_utf8|U8 * s|U8 * end
+=for apidoc_item ||isPRINT_utf8_safe|U8 * s|U8 * end
+=for apidoc_item ||isPRINT_uvchr|UV ch
 Returns a boolean indicating whether the specified character is a
 printable character, analogous to C<m/[[:print:]]/>.
 See the L<top of this section|/Character classification> for an explanation of
@@ -1056,41 +1082,48 @@ the variants.
 
 =for apidoc Am|bool|isWORDCHAR|UV ch
 =for apidoc_item ||isWORDCHAR_A|UV ch
-=for apidoc_item ||isWORDCHAR_L1|UV ch
-=for apidoc_item ||isWORDCHAR_uvchr|UV ch
-=for apidoc_item ||isWORDCHAR_utf8_safe|U8 * s|U8 * end
-=for apidoc_item ||isWORDCHAR_utf8|U8 * s|U8 * end
 =for apidoc_item ||isWORDCHAR_LC|UV ch
-=for apidoc_item ||isWORDCHAR_LC_uvchr|UV ch
 =for apidoc_item ||isWORDCHAR_LC_utf8_safe|U8 * s| U8 *end
-=for apidoc_item ||isALNUM|UV ch
-=for apidoc_item ||isALNUM_A|UV ch
-=for apidoc_item ||isALNUM_LC|UV ch
-=for apidoc_item ||isALNUM_LC_uvchr|UV ch
+=for apidoc_item ||isWORDCHAR_LC_uvchr|UV ch
+=for apidoc_item ||isWORDCHAR_L1|UV ch
+=for apidoc_item ||isWORDCHAR_utf8|U8 * s|U8 * end
+=for apidoc_item ||isWORDCHAR_utf8_safe|U8 * s|U8 * end
+=for apidoc_item ||isWORDCHAR_uvchr|UV ch
 Returns a boolean indicating whether the specified character is a character
 that is a word character, analogous to what C<m/\w/> and C<m/[[:word:]]/> match
 in a regular expression.  A word character is an alphabetic character, a
 decimal digit, a connecting punctuation character (such as an underscore), or
 a "mark" character that attaches to one of those (like some sort of accent).
-C<isALNUM()> is a synonym provided for backward compatibility, even though a
-word character includes more than the standard C language meaning of
-alphanumeric.
+
 See the L<top of this section|/Character classification> for an explanation of
 the variants.
+
 C<isWORDCHAR_A>, C<isWORDCHAR_L1>, C<isWORDCHAR_uvchr>,
 C<isWORDCHAR_LC>, C<isWORDCHAR_LC_uvchr>, C<isWORDCHAR_LC_utf8>, and
 C<isWORDCHAR_LC_utf8_safe> are also as described there, but additionally
 include the platform's native underscore.
 
+=for apidoc Am|bool|isALNUM         |UV ch
+=for apidoc_item  ||isALNUM_A       |UV ch
+=for apidoc_item  ||isALNUM_LC      |UV ch
+=for apidoc_item  ||isALNUM_LC_uvchr|UV ch
+These are each a synonym for their respectively named L</C<isWORDCHAR>>
+variant.
+
+They are provided for backward compatibility, even though a word character
+includes more than the standard C language meaning of alphanumeric.
+To get the C language definition, use the corresponding L</C<isALPHANUMERIC>>
+variant.
+
 =for apidoc Am|bool|isXDIGIT|UV ch
 =for apidoc_item ||isXDIGIT_A|UV ch
-=for apidoc_item ||isXDIGIT_L1|UV ch
-=for apidoc_item ||isXDIGIT_uvchr|UV ch
-=for apidoc_item ||isXDIGIT_utf8_safe|U8 * s|U8 * end
-=for apidoc_item ||isXDIGIT_utf8|U8 * s|U8 * end
 =for apidoc_item ||isXDIGIT_LC|UV ch
-=for apidoc_item ||isXDIGIT_LC_uvchr|UV ch
 =for apidoc_item ||isXDIGIT_LC_utf8_safe|U8 * s| U8 *end
+=for apidoc_item ||isXDIGIT_LC_uvchr|UV ch
+=for apidoc_item ||isXDIGIT_L1|UV ch
+=for apidoc_item ||isXDIGIT_utf8|U8 * s|U8 * end
+=for apidoc_item ||isXDIGIT_utf8_safe|U8 * s|U8 * end
+=for apidoc_item ||isXDIGIT_uvchr|UV ch
 Returns a boolean indicating whether the specified character is a hexadecimal
 digit.  In the ASCII range these are C<[0-9A-Fa-f]>.  Variants C<isXDIGIT_A()>
 and C<isXDIGIT_L1()> are identical to C<isXDIGIT()>.
@@ -1099,13 +1132,13 @@ the variants.
 
 =for apidoc Am|bool|isIDFIRST|UV ch
 =for apidoc_item ||isIDFIRST_A|UV ch
-=for apidoc_item ||isIDFIRST_L1|UV ch
-=for apidoc_item ||isIDFIRST_uvchr|UV ch
-=for apidoc_item ||isIDFIRST_utf8_safe|U8 * s|U8 * end
-=for apidoc_item ||isIDFIRST_utf8|U8 * s|U8 * end
 =for apidoc_item ||isIDFIRST_LC|UV ch
-=for apidoc_item ||isIDFIRST_LC_uvchr|UV ch
 =for apidoc_item ||isIDFIRST_LC_utf8_safe|U8 * s| U8 *end
+=for apidoc_item ||isIDFIRST_LC_uvchr|UV ch
+=for apidoc_item ||isIDFIRST_L1|UV ch
+=for apidoc_item ||isIDFIRST_utf8|U8 * s|U8 * end
+=for apidoc_item ||isIDFIRST_utf8_safe|U8 * s|U8 * end
+=for apidoc_item ||isIDFIRST_uvchr|UV ch
 Returns a boolean indicating whether the specified character can be the first
 character of an identifier.  This is very close to, but not quite the same as
 the official Unicode property C<XID_Start>.  The difference is that this
@@ -1115,13 +1148,13 @@ the variants.
 
 =for apidoc Am|bool|isIDCONT|UV ch
 =for apidoc_item ||isIDCONT_A|UV ch
-=for apidoc_item ||isIDCONT_L1|UV ch
-=for apidoc_item ||isIDCONT_uvchr|UV ch
-=for apidoc_item ||isIDCONT_utf8_safe|U8 * s|U8 * end
-=for apidoc_item ||isIDCONT_utf8|U8 * s|U8 * end
 =for apidoc_item ||isIDCONT_LC|UV ch
-=for apidoc_item ||isIDCONT_LC_uvchr|UV ch
 =for apidoc_item ||isIDCONT_LC_utf8_safe|U8 * s| U8 *end
+=for apidoc_item ||isIDCONT_LC_uvchr|UV ch
+=for apidoc_item ||isIDCONT_L1|UV ch
+=for apidoc_item ||isIDCONT_utf8|U8 * s|U8 * end
+=for apidoc_item ||isIDCONT_utf8_safe|U8 * s|U8 * end
+=for apidoc_item ||isIDCONT_uvchr|UV ch
 Returns a boolean indicating whether the specified character can be the
 second or succeeding character of an identifier.  This is very close to, but
 not quite the same as the official Unicode property C<XID_Continue>.  The
@@ -1149,9 +1182,9 @@ results for the full range of possible inputs has been implemented here.
 
 =for apidoc Am|UV|toUPPER|UV cp
 =for apidoc_item |UV|toUPPER_A|UV cp
-=for apidoc_item |UV|toUPPER_uvchr|UV cp|U8* s|STRLEN* lenp
 =for apidoc_item |UV|toUPPER_utf8|U8* p|U8* e|U8* s|STRLEN* lenp
 =for apidoc_item |UV|toUPPER_utf8_safe|U8* p|U8* e|U8* s|STRLEN* lenp
+=for apidoc_item |UV|toUPPER_uvchr|UV cp|U8* s|STRLEN* lenp
 
 These all return the uppercase of a character.  The differences are what domain
 they operate on, and whether the input is specified as a code point (those
@@ -1198,9 +1231,9 @@ change in future releases.
 
 =for apidoc Am|UV|toFOLD|UV cp
 =for apidoc_item |UV|toFOLD_A|UV cp
-=for apidoc_item |UV|toFOLD_uvchr|UV cp|U8* s|STRLEN* lenp
 =for apidoc_item |UV|toFOLD_utf8|U8* p|U8* e|U8* s|STRLEN* lenp
 =for apidoc_item |UV|toFOLD_utf8_safe|U8* p|U8* e|U8* s|STRLEN* lenp
+=for apidoc_item |UV|toFOLD_uvchr|UV cp|U8* s|STRLEN* lenp
 
 These all return the foldcase of a character.  "foldcase" is an internal case
 for C</i> pattern matching. If the foldcase of character A and the foldcase of
@@ -1252,12 +1285,12 @@ change in future releases.
 
 =for apidoc Am|UV|toLOWER|UV cp
 =for apidoc_item |UV|toLOWER_A|UV cp
-=for apidoc_item |UV|toLOWER_L1|UV cp
 =for apidoc_item |UV|toLOWER_LATIN1|UV cp
 =for apidoc_item |UV|toLOWER_LC|UV cp
-=for apidoc_item |UV|toLOWER_uvchr|UV cp|U8* s|STRLEN* lenp
+=for apidoc_item |UV|toLOWER_L1|UV cp
 =for apidoc_item |UV|toLOWER_utf8|U8* p|U8* e|U8* s|STRLEN* lenp
 =for apidoc_item |UV|toLOWER_utf8_safe|U8* p|U8* e|U8* s|STRLEN* lenp
+=for apidoc_item |UV|toLOWER_uvchr|UV cp|U8* s|STRLEN* lenp
 
 These all return the lowercase of a character.  The differences are what domain
 they operate on, and whether the input is specified as a code point (those
@@ -1309,9 +1342,9 @@ change in future releases.
 
 =for apidoc Am|UV|toTITLE|UV cp
 =for apidoc_item |UV|toTITLE_A|UV cp
-=for apidoc_item |UV|toTITLE_uvchr|UV cp|U8* s|STRLEN* lenp
 =for apidoc_item |UV|toTITLE_utf8|U8* p|U8* e|U8* s|STRLEN* lenp
 =for apidoc_item |UV|toTITLE_utf8_safe|U8* p|U8* e|U8* s|STRLEN* lenp
+=for apidoc_item |UV|toTITLE_uvchr|UV cp|U8* s|STRLEN* lenp
 
 These all return the titlecase of a character.  The differences are what domain
 they operate on, and whether the input is specified as a code point (those
@@ -1362,6 +1395,7 @@ change in future releases.
 XXX Still undocumented isVERTWS_uvchr and _utf8; it's unclear what their names
 really should be.  Also toUPPER_LC and toFOLD_LC, which are subject to change,
 and aren't general purpose as they don't work on U+DF, and assert against that.
+and isCASED_LC, as it really is more of an internal thing.
 
 Note that these macros are repeated in Devel::PPPort, so should also be
 patched there.  The file as of this writing is cpan/Devel-PPPort/parts/inc/misc
@@ -1385,11 +1419,7 @@ or casts
 =cut
 
 */
-#ifdef QUADKIND
-#   define WIDEST_UTYPE U64
-#else
-#   define WIDEST_UTYPE U32
-#endif
+#define WIDEST_UTYPE PERL_UINTMAX_T
 
 /* Where there could be some confusion, use this as a static assert in macros
  * to make sure that a parameter isn't a pointer.  But some compilers can't
@@ -1403,7 +1433,10 @@ or casts
 #endif
 
 /* Likewise, this is effectively a static assert to be used to guarantee the
- * parameter is a pointer */
+ * parameter is a pointer
+ *
+ * NOT suitable for void* 
+ */
 #define ASSERT_IS_PTR(x) (__ASSERT_(sizeof(*(x))) (x))
 
 /* FITS_IN_8_BITS(c) returns true if c doesn't have  a bit set other than in
@@ -1489,7 +1522,7 @@ or casts
 
 /* Character class numbers.  For internal core Perl use only.  The ones less
  * than 32 are used in PL_charclass[] and the ones up through the one that
- * corresponds to <_HIGHEST_REGCOMP_DOT_H_SYNC> are used by regcomp.h and
+ * corresponds to <HIGHEST_REGCOMP_DOT_H_SYNC_> are used by regcomp.h and
  * related files.  PL_charclass ones use names used in l1_char_class_tab.h but
  * their actual definitions are here.  If that file has a name not used here,
  * it won't compile.
@@ -1503,37 +1536,37 @@ or casts
  * to group these which have no members that match above Latin1, (or above
  * ASCII in the latter case) */
 
-#  define _CC_WORDCHAR           0      /* \w and [:word:] */
-#  define _CC_DIGIT              1      /* \d and [:digit:] */
-#  define _CC_ALPHA              2      /* [:alpha:] */
-#  define _CC_LOWER              3      /* [:lower:] */
-#  define _CC_UPPER              4      /* [:upper:] */
-#  define _CC_PUNCT              5      /* [:punct:] */
-#  define _CC_PRINT              6      /* [:print:] */
-#  define _CC_ALPHANUMERIC       7      /* [:alnum:] */
-#  define _CC_GRAPH              8      /* [:graph:] */
-#  define _CC_CASED              9      /* [:lower:] or [:upper:] under /i */
-#  define _CC_SPACE             10      /* \s, [:space:] */
-#  define _CC_BLANK             11      /* [:blank:] */
-#  define _CC_XDIGIT            12      /* [:xdigit:] */
-#  define _CC_CNTRL             13      /* [:cntrl:] */
-#  define _CC_ASCII             14      /* [:ascii:] */
-#  define _CC_VERTSPACE         15      /* \v */
-
-#  define _HIGHEST_REGCOMP_DOT_H_SYNC _CC_VERTSPACE
+#  define CC_WORDCHAR_           0      /* \w and [:word:] */
+#  define CC_DIGIT_              1      /* \d and [:digit:] */
+#  define CC_ALPHA_              2      /* [:alpha:] */
+#  define CC_LOWER_              3      /* [:lower:] */
+#  define CC_UPPER_              4      /* [:upper:] */
+#  define CC_PUNCT_              5      /* [:punct:] */
+#  define CC_PRINT_              6      /* [:print:] */
+#  define CC_ALPHANUMERIC_       7      /* [:alnum:] */
+#  define CC_GRAPH_              8      /* [:graph:] */
+#  define CC_CASED_              9      /* [:lower:] or [:upper:] under /i */
+#  define CC_SPACE_             10      /* \s, [:space:] */
+#  define CC_BLANK_             11      /* [:blank:] */
+#  define CC_XDIGIT_            12      /* [:xdigit:] */
+#  define CC_CNTRL_             13      /* [:cntrl:] */
+#  define CC_ASCII_             14      /* [:ascii:] */
+#  define CC_VERTSPACE_         15      /* \v */
+
+#  define HIGHEST_REGCOMP_DOT_H_SYNC_ CC_VERTSPACE_
 
 /* The members of the third group below do not need to be coordinated with data
  * structures in regcomp.[ch] and regexec.c. */
-#  define _CC_IDFIRST                  16
-#  define _CC_CHARNAME_CONT            17
-#  define _CC_NONLATIN1_FOLD           18
-#  define _CC_NONLATIN1_SIMPLE_FOLD    19
-#  define _CC_QUOTEMETA                20
-#  define _CC_NON_FINAL_FOLD           21
-#  define _CC_IS_IN_SOME_FOLD          22
-#  define _CC_BINDIGIT                 23
-#  define _CC_OCTDIGIT                 24
-#  define _CC_MNEMONIC_CNTRL           25
+#  define CC_IDFIRST_                  16
+#  define CC_CHARNAME_CONT_            17
+#  define CC_NONLATIN1_FOLD_           18
+#  define CC_NONLATIN1_SIMPLE_FOLD_    19
+#  define CC_QUOTEMETA_                20
+#  define CC_NON_FINAL_FOLD_           21
+#  define CC_IS_IN_SOME_FOLD_          22
+#  define CC_BINDIGIT_                 23
+#  define CC_OCTDIGIT_                 24
+#  define CC_MNEMONIC_CNTRL_           25
 
 /* Unused: 26-31
  * If more bits are needed, one could add a second word for non-64bit
@@ -1550,26 +1583,26 @@ or casts
 /* An enum version of the character class numbers, to help compilers
  * optimize */
 typedef enum {
-    _CC_ENUM_ALPHA          = _CC_ALPHA,
-    _CC_ENUM_ALPHANUMERIC   = _CC_ALPHANUMERIC,
-    _CC_ENUM_ASCII          = _CC_ASCII,
-    _CC_ENUM_BLANK          = _CC_BLANK,
-    _CC_ENUM_CASED          = _CC_CASED,
-    _CC_ENUM_CNTRL          = _CC_CNTRL,
-    _CC_ENUM_DIGIT          = _CC_DIGIT,
-    _CC_ENUM_GRAPH          = _CC_GRAPH,
-    _CC_ENUM_LOWER          = _CC_LOWER,
-    _CC_ENUM_PRINT          = _CC_PRINT,
-    _CC_ENUM_PUNCT          = _CC_PUNCT,
-    _CC_ENUM_SPACE          = _CC_SPACE,
-    _CC_ENUM_UPPER          = _CC_UPPER,
-    _CC_ENUM_VERTSPACE      = _CC_VERTSPACE,
-    _CC_ENUM_WORDCHAR       = _CC_WORDCHAR,
-    _CC_ENUM_XDIGIT         = _CC_XDIGIT
-} _char_class_number;
+    CC_ENUM_ALPHA_          = CC_ALPHA_,
+    CC_ENUM_ALPHANUMERIC_   = CC_ALPHANUMERIC_,
+    CC_ENUM_ASCII_          = CC_ASCII_,
+    CC_ENUM_BLANK_          = CC_BLANK_,
+    CC_ENUM_CASED_          = CC_CASED_,
+    CC_ENUM_CNTRL_          = CC_CNTRL_,
+    CC_ENUM_DIGIT_          = CC_DIGIT_,
+    CC_ENUM_GRAPH_          = CC_GRAPH_,
+    CC_ENUM_LOWER_          = CC_LOWER_,
+    CC_ENUM_PRINT_          = CC_PRINT_,
+    CC_ENUM_PUNCT_          = CC_PUNCT_,
+    CC_ENUM_SPACE_          = CC_SPACE_,
+    CC_ENUM_UPPER_          = CC_UPPER_,
+    CC_ENUM_VERTSPACE_      = CC_VERTSPACE_,
+    CC_ENUM_WORDCHAR_       = CC_WORDCHAR_,
+    CC_ENUM_XDIGIT_         = CC_XDIGIT_
+} char_class_number_;
 #endif
 
-#define POSIX_CC_COUNT    (_HIGHEST_REGCOMP_DOT_H_SYNC + 1)
+#define POSIX_CC_COUNT    (HIGHEST_REGCOMP_DOT_H_SYNC_ + 1)
 
 START_EXTERN_C
 #  ifdef DOINIT
@@ -1583,32 +1616,32 @@ EXTCONST U32 PL_charclass[];
 END_EXTERN_C
 
     /* The 1U keeps Solaris from griping when shifting sets the uppermost bit */
-#   define _CC_mask(classnum) (1U << (classnum))
+#   define CC_mask_(classnum) (1U << (classnum))
 
     /* For internal core Perl use only: the base macro for defining macros like
      * isALPHA */
-#   define _generic_isCC(c, classnum) cBOOL(FITS_IN_8_BITS(c)    \
-                && (PL_charclass[(U8) (c)] & _CC_mask(classnum)))
+#   define generic_isCC_(c, classnum) cBOOL(FITS_IN_8_BITS(c)    \
+                && (PL_charclass[(U8) (c)] & CC_mask_(classnum)))
 
     /* The mask for the _A versions of the macros; it just adds in the bit for
      * ASCII. */
-#   define _CC_mask_A(classnum) (_CC_mask(classnum) | _CC_mask(_CC_ASCII))
+#   define CC_mask_A_(classnum) (CC_mask_(classnum) | CC_mask_(CC_ASCII_))
 
     /* For internal core Perl use only: the base macro for defining macros like
      * isALPHA_A.  The foo_A version makes sure that both the desired bit and
      * the ASCII bit are present */
-#   define _generic_isCC_A(c, classnum) (FITS_IN_8_BITS(c)      \
-        && ((PL_charclass[(U8) (c)] & _CC_mask_A(classnum))     \
-                                   == _CC_mask_A(classnum)))
+#   define generic_isCC_A_(c, classnum) (FITS_IN_8_BITS(c)      \
+        && ((PL_charclass[(U8) (c)] & CC_mask_A_(classnum))     \
+                                   == CC_mask_A_(classnum)))
 
 /* On ASCII platforms certain classes form a single range.  It's faster to
  * special case these.  isDIGIT is a single range on all platforms */
 #   ifdef EBCDIC
-#     define isALPHA_A(c)  _generic_isCC_A(c, _CC_ALPHA)
-#     define isGRAPH_A(c)  _generic_isCC_A(c, _CC_GRAPH)
-#     define isLOWER_A(c)  _generic_isCC_A(c, _CC_LOWER)
-#     define isPRINT_A(c)  _generic_isCC_A(c, _CC_PRINT)
-#     define isUPPER_A(c)  _generic_isCC_A(c, _CC_UPPER)
+#     define isALPHA_A(c)  generic_isCC_A_(c, CC_ALPHA_)
+#     define isGRAPH_A(c)  generic_isCC_A_(c, CC_GRAPH_)
+#     define isLOWER_A(c)  generic_isCC_A_(c, CC_LOWER_)
+#     define isPRINT_A(c)  generic_isCC_A_(c, CC_PRINT_)
+#     define isUPPER_A(c)  generic_isCC_A_(c, CC_UPPER_)
 #   else
       /* By folding the upper and lowercase, we can use a single range */
 #     define isALPHA_A(c)  inRANGE((~('A' ^ 'a') & (c)), 'A', 'Z')
@@ -1617,58 +1650,57 @@ END_EXTERN_C
 #     define isPRINT_A(c)  inRANGE(c, ' ', 0x7e)
 #     define isUPPER_A(c)  inRANGE(c, 'A', 'Z')
 #   endif
-#   define isALPHANUMERIC_A(c) _generic_isCC_A(c, _CC_ALPHANUMERIC)
-#   define isBLANK_A(c)  _generic_isCC_A(c, _CC_BLANK)
-#   define isCNTRL_A(c)  _generic_isCC_A(c, _CC_CNTRL)
+#   define isALPHANUMERIC_A(c) generic_isCC_A_(c, CC_ALPHANUMERIC_)
+#   define isBLANK_A(c)  generic_isCC_A_(c, CC_BLANK_)
+#   define isCNTRL_A(c)  generic_isCC_A_(c, CC_CNTRL_)
 #   define isDIGIT_A(c)  inRANGE(c, '0', '9')
-#   define isPUNCT_A(c)  _generic_isCC_A(c, _CC_PUNCT)
-#   define isSPACE_A(c)  _generic_isCC_A(c, _CC_SPACE)
-#   define isWORDCHAR_A(c) _generic_isCC_A(c, _CC_WORDCHAR)
-#   define isXDIGIT_A(c)  _generic_isCC(c, _CC_XDIGIT) /* No non-ASCII xdigits
-                                                        */
-#   define isIDFIRST_A(c) _generic_isCC_A(c, _CC_IDFIRST)
-#   define isALPHA_L1(c)  _generic_isCC(c, _CC_ALPHA)
-#   define isALPHANUMERIC_L1(c) _generic_isCC(c, _CC_ALPHANUMERIC)
-#   define isBLANK_L1(c)  _generic_isCC(c, _CC_BLANK)
+#   define isPUNCT_A(c)  generic_isCC_A_(c, CC_PUNCT_)
+#   define isSPACE_A(c)  generic_isCC_A_(c, CC_SPACE_)
+#   define isWORDCHAR_A(c) generic_isCC_A_(c, CC_WORDCHAR_)
+#   define isXDIGIT_A(c)  generic_isCC_(c, CC_XDIGIT_) /* No non-ASCII xdigits */
+#   define isIDFIRST_A(c) generic_isCC_A_(c, CC_IDFIRST_)
+#   define isALPHA_L1(c)  generic_isCC_(c, CC_ALPHA_)
+#   define isALPHANUMERIC_L1(c) generic_isCC_(c, CC_ALPHANUMERIC_)
+#   define isBLANK_L1(c)  generic_isCC_(c, CC_BLANK_)
 
     /* continuation character for legal NAME in \N{NAME} */
-#   define isCHARNAME_CONT(c) _generic_isCC(c, _CC_CHARNAME_CONT)
+#   define isCHARNAME_CONT(c) generic_isCC_(c, CC_CHARNAME_CONT_)
 
-#   define isCNTRL_L1(c)  _generic_isCC(c, _CC_CNTRL)
-#   define isGRAPH_L1(c)  _generic_isCC(c, _CC_GRAPH)
-#   define isLOWER_L1(c)  _generic_isCC(c, _CC_LOWER)
-#   define isPRINT_L1(c)  _generic_isCC(c, _CC_PRINT)
+#   define isCNTRL_L1(c)  generic_isCC_(c, CC_CNTRL_)
+#   define isGRAPH_L1(c)  generic_isCC_(c, CC_GRAPH_)
+#   define isLOWER_L1(c)  generic_isCC_(c, CC_LOWER_)
+#   define isPRINT_L1(c)  generic_isCC_(c, CC_PRINT_)
 #   define isPSXSPC_L1(c)  isSPACE_L1(c)
-#   define isPUNCT_L1(c)  _generic_isCC(c, _CC_PUNCT)
-#   define isSPACE_L1(c)  _generic_isCC(c, _CC_SPACE)
-#   define isUPPER_L1(c)  _generic_isCC(c, _CC_UPPER)
-#   define isWORDCHAR_L1(c) _generic_isCC(c, _CC_WORDCHAR)
-#   define isIDFIRST_L1(c) _generic_isCC(c, _CC_IDFIRST)
+#   define isPUNCT_L1(c)  generic_isCC_(c, CC_PUNCT_)
+#   define isSPACE_L1(c)  generic_isCC_(c, CC_SPACE_)
+#   define isUPPER_L1(c)  generic_isCC_(c, CC_UPPER_)
+#   define isWORDCHAR_L1(c) generic_isCC_(c, CC_WORDCHAR_)
+#   define isIDFIRST_L1(c) generic_isCC_(c, CC_IDFIRST_)
 
 #   ifdef EBCDIC
-#       define isASCII(c) _generic_isCC(c, _CC_ASCII)
+#       define isASCII(c) generic_isCC_(c, CC_ASCII_)
 #   endif
 
     /* Participates in a single-character fold with a character above 255 */
-#   if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C)
-#     define HAS_NONLATIN1_SIMPLE_FOLD_CLOSURE(c)                          \
+#   if defined(PERL_IN_REGCOMP_ANY) || defined(PERL_IN_REGEXEC_C)
+#     define HAS_NONLATIN1_SIMPLE_FOLD_CLOSURE(c)                           \
         ((   ! cBOOL(FITS_IN_8_BITS(c)))                                    \
-          || (PL_charclass[(U8) (c)] & _CC_mask(_CC_NONLATIN1_SIMPLE_FOLD)))
+          || (PL_charclass[(U8) (c)] & CC_mask_(CC_NONLATIN1_SIMPLE_FOLD_)))
 
-#   define IS_NON_FINAL_FOLD(c)   _generic_isCC(c, _CC_NON_FINAL_FOLD)
-#   define IS_IN_SOME_FOLD_L1(c)  _generic_isCC(c, _CC_IS_IN_SOME_FOLD)
+#   define IS_NON_FINAL_FOLD(c)   generic_isCC_(c, CC_NON_FINAL_FOLD_)
+#   define IS_IN_SOME_FOLD_L1(c)  generic_isCC_(c, CC_IS_IN_SOME_FOLD_)
 #  endif
 
     /* Like the above, but also can be part of a multi-char fold */
 #   define HAS_NONLATIN1_FOLD_CLOSURE(c)                                    \
       (   (! cBOOL(FITS_IN_8_BITS(c)))                                      \
-       || (PL_charclass[(U8) (c)] & _CC_mask(_CC_NONLATIN1_FOLD)))
+       || (PL_charclass[(U8) (c)] & CC_mask_(CC_NONLATIN1_FOLD_)))
 
-#   define _isQUOTEMETA(c) _generic_isCC(c, _CC_QUOTEMETA)
+#   define _isQUOTEMETA(c) generic_isCC_(c, CC_QUOTEMETA_)
 
 /* is c a control character for which we have a mnemonic? */
 #  if defined(PERL_CORE) || defined(PERL_EXT)
-#     define isMNEMONIC_CNTRL(c) _generic_isCC(c, _CC_MNEMONIC_CNTRL)
+#     define isMNEMONIC_CNTRL(c) generic_isCC_(c, CC_MNEMONIC_CNTRL_)
 #  endif
 #else   /* else we don't have perl.h H_PERL */
 
@@ -1795,14 +1827,7 @@ END_EXTERN_C
     /* The following are not fully accurate in the above-ASCII range.  I (khw)
      * don't think it's necessary to be so for the purposes where this gets
      * compiled */
-#   define _isQUOTEMETA(c)      (FITS_IN_8_BITS(c) && ! isWORDCHAR_L1(c))
-#   define _IS_IN_SOME_FOLD_ONLY_FOR_USE_BY_REGCOMP_DOT_C(c) isALPHA_L1(c)
-
-    /*  And these aren't accurate at all.  They are useful only for above
-     *  Latin1, which utilities and bootstrapping don't deal with */
-#   define _IS_NON_FINAL_FOLD_ONLY_FOR_USE_BY_REGCOMP_DOT_C(c) 0
-#   define _HAS_NONLATIN1_SIMPLE_FOLD_CLOSURE_ONLY_FOR_USE_BY_REGCOMP_DOT_C_AND_REGEXEC_DOT_C(c) 0
-#   define _HAS_NONLATIN1_FOLD_CLOSURE_ONLY_FOR_USE_BY_REGCOMP_DOT_C_AND_REGEXEC_DOT_C(c) 0
+#   define isQUOTEMETA_(c)      (FITS_IN_8_BITS(c) && ! isWORDCHAR_L1(c))
 
     /* Many of the macros later in this file are defined in terms of these.  By
      * implementing them with a function, which converts the class number into
@@ -1811,9 +1836,9 @@ END_EXTERN_C
      * perl.h), and so a compiler error will be generated if one is attempted
      * to be used.  And the above-Latin1 code points require Unicode tables to
      * be present, something unlikely to be the case when bootstrapping */
-#   define _generic_isCC(c, classnum)                                        \
+#   define generic_isCC_(c, classnum)                                        \
          (FITS_IN_8_BITS(c) && S_bootstrap_ctype((U8) (c), (classnum), TRUE))
-#   define _generic_isCC_A(c, classnum)                                      \
+#   define generic_isCC_A_(c, classnum)                                      \
          (FITS_IN_8_BITS(c) && S_bootstrap_ctype((U8) (c), (classnum), FALSE))
 #endif  /* End of no perl.h H_PERL */
 
@@ -1873,181 +1898,242 @@ END_EXTERN_C
 #define toUPPER_LATIN1_MOD(c) ((! FITS_IN_8_BITS(c))                       \
                                ? (c)                                       \
                                : PL_mod_latin1_uc[ (U8) (c) ])
-#define IN_UTF8_CTYPE_LOCALE PL_in_utf8_CTYPE_locale
+#ifdef USE_LOCALE_CTYPE
+#  define IN_UTF8_CTYPE_LOCALE   PL_in_utf8_CTYPE_locale
+#  define IN_UTF8_TURKIC_LOCALE  PL_in_utf8_turkic_locale
+#else
+#  define IN_UTF8_CTYPE_LOCALE   false
+#  define IN_UTF8_TURKIC_LOCALE  false
+#endif
 
 /* Use foo_LC_uvchr() instead  of these for beyond the Latin1 range */
 
 /* For internal core Perl use only: the base macro for defining macros like
  * isALPHA_LC, which uses the current LC_CTYPE locale.  'c' is the code point
  * (0-255) to check.  In a UTF-8 locale, the result is the same as calling
- * isFOO_L1(); the 'utf8_locale_classnum' parameter is something like
- * _CC_UPPER, which gives the class number for doing this.  For non-UTF-8
- * locales, the code to actually do the test this is passed in 'non_utf8'.  If
- * 'c' is above 255, 0 is returned.  For accessing the full range of possible
- * code points under locale rules, use the macros based on _generic_LC_uvchr
- * instead of this. */
-#define _generic_LC_base(c, utf8_locale_classnum, non_utf8)                    \
-           (! FITS_IN_8_BITS(c)                                                \
-           ? 0                                                                 \
-           : IN_UTF8_CTYPE_LOCALE                                              \
-             ? cBOOL(PL_charclass[(U8) (c)] & _CC_mask(utf8_locale_classnum))  \
-             : cBOOL(non_utf8))
-
-/* For internal core Perl use only: a helper macro for defining macros like
- * isALPHA_LC.  'c' is the code point (0-255) to check.  The function name to
- * actually do this test is passed in 'non_utf8_func', which is called on 'c',
- * casting 'c' to the macro _LC_CAST, which should not be parenthesized.  See
- * _generic_LC_base for more info */
-#define _generic_LC(c, utf8_locale_classnum, non_utf8_func)                    \
-                        _generic_LC_base(c,utf8_locale_classnum,               \
-                                         non_utf8_func( (_LC_CAST) (c)))
-
-/* For internal core Perl use only: like _generic_LC, but also returns TRUE if
- * 'c' is the platform's native underscore character */
-#define _generic_LC_underscore(c,utf8_locale_classnum,non_utf8_func)           \
-                        _generic_LC_base(c, utf8_locale_classnum,              \
-                                         (non_utf8_func( (_LC_CAST) (c))       \
-                                          || (char)(c) == '_'))
-
-/* These next three are also for internal core Perl use only: case-change
- * helper macros.  The reason for using the PL_latin arrays is in case the
- * system function is defective; it ensures uniform results that conform to the
- * Unicod standard.   It does not handle the anomalies in UTF-8 Turkic locales */
-#define _generic_toLOWER_LC(c, function, cast)  (! FITS_IN_8_BITS(c)           \
-                                                ? (c)                          \
-                                                : (IN_UTF8_CTYPE_LOCALE)       \
-                                                  ? PL_latin1_lc[ (U8) (c) ]   \
-                                                  : (cast)function((cast)(c)))
-
-/* Note that the result can be larger than a byte in a UTF-8 locale.  It
- * returns a single value, so can't adequately return the upper case of LATIN
- * SMALL LETTER SHARP S in a UTF-8 locale (which should be a string of two
- * values "SS");  instead it asserts against that under DEBUGGING, and
- * otherwise returns its input.  It does not handle the anomalies in UTF-8
- * Turkic locales. */
-#define _generic_toUPPER_LC(c, function, cast)                                 \
-                    (! FITS_IN_8_BITS(c)                                       \
-                    ? (c)                                                      \
-                    : ((! IN_UTF8_CTYPE_LOCALE)                                \
-                      ? (cast)function((cast)(c))                              \
-                      : ((((U8)(c)) == MICRO_SIGN)                             \
-                        ? GREEK_CAPITAL_LETTER_MU                              \
-                        : ((((U8)(c)) == LATIN_SMALL_LETTER_Y_WITH_DIAERESIS)  \
-                          ? LATIN_CAPITAL_LETTER_Y_WITH_DIAERESIS              \
-                          : ((((U8)(c)) == LATIN_SMALL_LETTER_SHARP_S)         \
-                            ? (__ASSERT_(0) (c))                               \
-                            : PL_mod_latin1_uc[ (U8) (c) ])))))
-
-/* Note that the result can be larger than a byte in a UTF-8 locale.  It
- * returns a single value, so can't adequately return the fold case of LATIN
- * SMALL LETTER SHARP S in a UTF-8 locale (which should be a string of two
- * values "ss"); instead it asserts against that under DEBUGGING, and
- * otherwise returns its input.  It does not handle the anomalies in UTF-8
- * Turkic locales */
-#define _generic_toFOLD_LC(c, function, cast)                                  \
-                    ((UNLIKELY((c) == MICRO_SIGN) && IN_UTF8_CTYPE_LOCALE)     \
-                      ? GREEK_SMALL_LETTER_MU                                  \
-                      : (__ASSERT_(! IN_UTF8_CTYPE_LOCALE                      \
-                                   || (c) != LATIN_SMALL_LETTER_SHARP_S)       \
-                         _generic_toLOWER_LC(c, function, cast)))
-
-/* Use the libc versions for these if available. */
+ * isFOO_L1(); 'classnum' is something like CC_UPPER_, which gives the class
+ * number for doing this.  For non-UTF-8 locales, the code to actually do the
+ * test this is passed in 'non_utf8'.  If 'c' is above 255, 0 is returned.  For
+ * accessing the full range of possible code points under locale rules, use the
+ * macros based on generic_LC_uvchr_ instead of this. */
+#define generic_LC_base_(c, classnum, non_utf8_func)                        \
+       (! FITS_IN_8_BITS(c)                                                 \
+       ? 0                                                                  \
+       : IN_UTF8_CTYPE_LOCALE                                               \
+         ? cBOOL(PL_charclass[(U8) (c)] & CC_mask_(classnum))               \
+         : cBOOL(non_utf8_func(c)))
+
+/* A helper macro for defining macros like isALPHA_LC.  On systems without
+ * proper locales, these reduce to, e.g., isALPHA_A */
+#ifdef CTYPE256
+#  define generic_LC_(c, classnum, non_utf8_func)   \
+     generic_LC_base_(c, classnum, non_utf8_func)
+#else
+# define generic_LC_(c, classnum, non_utf8_func)    \
+     generic_isCC_A_(c, classnum)
+#endif
+
+/* Below are the definitions for the locale-sensitive character classification
+ * macros whose input domain is a byte, and the locale isn't UTF-8.  These are
+ * as close as possible to the bare versions on the platform and still yield
+ * POSIX Standard-compliant results.
+ *
+ * There is currently only one place these definitions should be used, in
+ * certain function calls like Perl_iswordchar_() in inline.h.
+ *
+ * Most likely you want to use the macros a ways below with names like
+ * isALPHA_LC().  Rarely, you may want isU8_ALPHA_LC(), somewhat below.
+ *
+ * The first two aren't in C89, so the fallback is to use the non-locale
+ * sensitive versions; these are the same for all platforms */
 #if defined(HAS_ISASCII)
-#   define isASCII_LC(c) (FITS_IN_8_BITS(c) && isascii( (U8) (c)))
+#   define is_posix_ASCII(c) isascii((U8) (c))
 #else
-#   define isASCII_LC(c) isASCII(c)
+#   define is_posix_ASCII(c) isASCII(c)
 #endif
 
 #if defined(HAS_ISBLANK)
-#   define isBLANK_LC(c) _generic_LC(c, _CC_BLANK, isblank)
-#else /* Unlike isASCII, varies if in a UTF-8 locale */
-#   define isBLANK_LC(c) ((IN_UTF8_CTYPE_LOCALE) ? isBLANK_L1(c) : isBLANK(c))
+#   define is_posix_BLANK(c) isblank((U8) (c))
+#else
+#   define is_posix_BLANK(c) isBLANK(c)
 #endif
 
-#define _LC_CAST U8
+/* The next few are the same in all platforms. */
+#define is_posix_CNTRL(c)     iscntrl((U8) (c))
+#define is_posix_IDFIRST(c)  (UNLIKELY((c) == '_') || is_posix_ALPHA(c))
+#define is_posix_SPACE(c)     isspace((U8) (c))
+#define is_posix_WORDCHAR(c) (UNLIKELY((c) == '_') || is_posix_ALPHANUMERIC(c))
+
+/* The base-level case changing macros are also the same in all platforms */
+#define to_posix_LOWER(c)     tolower((U8) (c))
+#define to_posix_UPPER(c)     toupper((U8) (c))
+#define to_posix_FOLD(c)      to_posix_LOWER(c)
 
 #ifdef WIN32
-    /* The Windows functions don't bother to follow the POSIX standard, which
-     * for example says that something can't both be a printable and a control.
-     * But Windows treats the \t control as a printable, and does such things
-     * as making superscripts into both digits and punctuation.  This tames
-     * these flaws by assuming that the definitions of both controls and space
-     * are correct, and then making sure that other definitions don't have
-     * weirdnesses, by making sure that isalnum() isn't also ispunct(), etc.
-     * Not all possible weirdnesses are checked for, just the ones that were
-     * detected on actual Microsoft code pages */
-
-#  define isCNTRL_LC(c)  _generic_LC(c, _CC_CNTRL, iscntrl)
-#  define isSPACE_LC(c)  _generic_LC(c, _CC_SPACE, isspace)
-
-#  define isALPHA_LC(c)  (_generic_LC(c, _CC_ALPHA, isalpha)                  \
-                                                    && isALPHANUMERIC_LC(c))
-#  define isALPHANUMERIC_LC(c)  (_generic_LC(c, _CC_ALPHANUMERIC, isalnum) && \
-                                                              ! isPUNCT_LC(c))
-#  define isDIGIT_LC(c)  (_generic_LC(c, _CC_DIGIT, isdigit) &&               \
-                                                         isALPHANUMERIC_LC(c))
-#  define isGRAPH_LC(c)  (_generic_LC(c, _CC_GRAPH, isgraph) && isPRINT_LC(c))
-#  define isIDFIRST_LC(c) (((c) == '_')                                       \
-                 || (_generic_LC(c, _CC_IDFIRST, isalpha) && ! isPUNCT_LC(c)))
-#  define isLOWER_LC(c)  (_generic_LC(c, _CC_LOWER, islower) && isALPHA_LC(c))
-#  define isPRINT_LC(c)  (_generic_LC(c, _CC_PRINT, isprint) && ! isCNTRL_LC(c))
-#  define isPUNCT_LC(c)  (_generic_LC(c, _CC_PUNCT, ispunct) && ! isCNTRL_LC(c))
-#  define isUPPER_LC(c)  (_generic_LC(c, _CC_UPPER, isupper) && isALPHA_LC(c))
-#  define isWORDCHAR_LC(c) (((c) == '_') || isALPHANUMERIC_LC(c))
-#  define isXDIGIT_LC(c) (_generic_LC(c, _CC_XDIGIT, isxdigit)                \
-                                                    && isALPHANUMERIC_LC(c))
-
-#  define toLOWER_LC(c) _generic_toLOWER_LC((c), tolower, U8)
-#  define toUPPER_LC(c) _generic_toUPPER_LC((c), toupper, U8)
-#  define toFOLD_LC(c)  _generic_toFOLD_LC((c), tolower, U8)
-
-#elif defined(CTYPE256) || (!defined(isascii) && !defined(HAS_ISASCII))
-    /* For most other platforms */
-
-#  define isALPHA_LC(c)   _generic_LC(c, _CC_ALPHA, isalpha)
-#  define isALPHANUMERIC_LC(c)  _generic_LC(c, _CC_ALPHANUMERIC, isalnum)
-#  define isCNTRL_LC(c)    _generic_LC(c, _CC_CNTRL, iscntrl)
-#  define isDIGIT_LC(c)    _generic_LC(c, _CC_DIGIT, isdigit)
-#  ifdef OS390  /* This system considers NBSP to be a graph */
-#    define isGRAPH_LC(c)    _generic_LC(c, _CC_GRAPH, isgraph)             \
-                        && ! isSPACE_LC(c)
+
+/* The Windows functions don't bother to follow the POSIX standard, which for
+ * example says that something can't both be a printable and a control.  But
+ * Windows treats \t as both a control and a printable, and does such things as
+ * making superscripts into both digits and punctuation.  These #defines tame
+ * these flaws by assuming that the definitions of controls (and the other few
+ * ones defined above) are correct, and then making sure that other definitions
+ * don't have weirdnesses, by adding a check that \w and its subsets aren't
+ * ispunct(), and things that are \W, like ispunct(), arent't controls.  Not
+ * all possible weirdnesses are checked for, just ones that were detected on
+ * actual Microsoft code pages */
+#  define is_posix_ALPHA(c)                                          \
+                          (isalpha((U8) (c)) && ! is_posix_PUNCT(c))
+#  define is_posix_ALPHANUMERIC(c)                                   \
+                          (isalnum((U8) (c)) && ! is_posix_PUNCT(c))
+#  define is_posix_CASED(c)                                          \
+   ((isupper((U8) (c)) || islower((U8) (c))) && ! is_posix_PUNCT(c))
+#  define is_posix_DIGIT(c)                                          \
+                          (isdigit((U8) (c)) && ! is_posix_PUNCT(c))
+#  define is_posix_GRAPH(c)                                          \
+                          (isgraph((U8) (c)) && ! is_posix_CNTRL(c))
+#  define is_posix_LOWER(c)                                          \
+                          (islower((U8) (c)) && ! is_posix_PUNCT(c))
+#  define is_posix_PRINT(c)                                          \
+                          (isprint((U8) (c)) && ! is_posix_CNTRL(c))
+#  define is_posix_PUNCT(c)                                          \
+                          (ispunct((U8) (c)) && ! is_posix_CNTRL(c))
+#  define is_posix_UPPER(c)                                          \
+                          (isupper((U8) (c)) && ! is_posix_PUNCT(c))
+#  define is_posix_XDIGIT(c)                                         \
+                         (isxdigit((U8) (c)) && ! is_posix_PUNCT(c))
+#else
+
+/* For all other platforms, as far as we know, isdigit(), etc. work sanely
+ * enough */
+#  define is_posix_ALPHA(c)         isalpha((U8) (c))
+#  define is_posix_ALPHANUMERIC(c)  isalnum((U8) (c))
+#  define is_posix_CASED(c)        (islower((U8) (c)) || isupper((U8) (c)))
+#  define is_posix_DIGIT(c)         isdigit((U8) (c))
+
+     /* ... But it seems that IBM products treat NBSP as both a space and a
+      * graphic; these are the two platforms that we have active test beds for.
+      */
+#  if defined(OS390) || defined(_AIX)
+#    define is_posix_GRAPH(c)      (isgraph((U8) (c)) && ! isspace((U8) (c)))
 #  else
-#    define isGRAPH_LC(c)    _generic_LC(c, _CC_GRAPH, isgraph)
+#    define is_posix_GRAPH(c)       isgraph((U8) (c))
 #  endif
-#  define isIDFIRST_LC(c)  _generic_LC_underscore(c, _CC_IDFIRST, isalpha)
-#  define isLOWER_LC(c)    _generic_LC(c, _CC_LOWER, islower)
-#  define isPRINT_LC(c)    _generic_LC(c, _CC_PRINT, isprint)
-#  define isPUNCT_LC(c)    _generic_LC(c, _CC_PUNCT, ispunct)
-#  define isSPACE_LC(c)    _generic_LC(c, _CC_SPACE, isspace)
-#  define isUPPER_LC(c)    _generic_LC(c, _CC_UPPER, isupper)
-#  define isWORDCHAR_LC(c) _generic_LC_underscore(c, _CC_WORDCHAR, isalnum)
-#  define isXDIGIT_LC(c)   _generic_LC(c, _CC_XDIGIT, isxdigit)
-
-
-#  define toLOWER_LC(c) _generic_toLOWER_LC((c), tolower, U8)
-#  define toUPPER_LC(c) _generic_toUPPER_LC((c), toupper, U8)
-#  define toFOLD_LC(c)  _generic_toFOLD_LC((c), tolower, U8)
-
-#else  /* The final fallback position */
-
-#  define isALPHA_LC(c)                (isascii(c) && isalpha(c))
-#  define isALPHANUMERIC_LC(c)  (isascii(c) && isalnum(c))
-#  define isCNTRL_LC(c)                (isascii(c) && iscntrl(c))
-#  define isDIGIT_LC(c)                (isascii(c) && isdigit(c))
-#  define isGRAPH_LC(c)                (isascii(c) && isgraph(c))
-#  define isIDFIRST_LC(c)      (isascii(c) && (isalpha(c) || (c) == '_'))
-#  define isLOWER_LC(c)                (isascii(c) && islower(c))
-#  define isPRINT_LC(c)                (isascii(c) && isprint(c))
-#  define isPUNCT_LC(c)                (isascii(c) && ispunct(c))
-#  define isSPACE_LC(c)                (isascii(c) && isspace(c))
-#  define isUPPER_LC(c)                (isascii(c) && isupper(c))
-#  define isWORDCHAR_LC(c)     (isascii(c) && (isalnum(c) || (c) == '_'))
-#  define isXDIGIT_LC(c)        (isascii(c) && isxdigit(c))
-
-#  define toLOWER_LC(c)        (isascii(c) ? tolower(c) : (c))
-#  define toUPPER_LC(c)        (isascii(c) ? toupper(c) : (c))
-#  define toFOLD_LC(c) (isascii(c) ? tolower(c) : (c))
+#  define is_posix_LOWER(c)         islower((U8) (c))
+#  define is_posix_PRINT(c)         isprint((U8) (c))
+#  define is_posix_PUNCT(c)         ispunct((U8) (c))
+#  define is_posix_UPPER(c)         isupper((U8) (c))
+#  define is_posix_XDIGIT(c)        isxdigit((U8) (c))
+#endif
+
+/* Below is the next level up, which currently expands to nothing more
+ * than the previous layer.  These are the macros to use if you really need
+ * something whose input domain is a byte, and the locale isn't UTF-8; that is,
+ * where you normally would have to use things like bare isalnum().
+ *
+ * But most likely you should instead use the layer defined further below which
+ * has names like isALPHA_LC.  They deal with larger-than-byte inputs, and
+ * UTF-8 locales.
+ *
+ * (Note, proper general operation of the bare libc functions requires you to
+ * cast to U8.  These do that for you automatically.) */
+
+#  define WRAP_U8_LC_(c, classnum, posix)  posix(c)
+
+#define isU8_ALPHANUMERIC_LC(c)                                                \
+              WRAP_U8_LC_((c), CC_ALPHANUMERIC_, is_posix_ALPHANUMERIC)
+#define isU8_ALPHA_LC(c)    WRAP_U8_LC_((c), CC_ALPHA_, is_posix_ALPHA)
+#define isU8_ASCII_LC(c)    WRAP_U8_LC_((c), CC_ASCII_, is_posix_ASCII)
+#define isU8_BLANK_LC(c)    WRAP_U8_LC_((c), CC_BLANK_, is_posix_BLANK)
+#define isU8_CASED_LC(c)    WRAP_U8_LC_((c), CC_CASED_, is_posix_CASED)
+#define isU8_CNTRL_LC(c)    WRAP_U8_LC_((c), CC_CNTRL_, is_posix_CNTRL)
+#define isU8_DIGIT_LC(c)    WRAP_U8_LC_((c), CC_DIGIT_, is_posix_DIGIT)
+#define isU8_GRAPH_LC(c)    WRAP_U8_LC_((c), CC_GRAPH_, is_posix_GRAPH)
+#define isU8_IDFIRST_LC(c)  WRAP_U8_LC_((c), CC_IDFIRST_, is_posix_IDFIRST)
+#define isU8_LOWER_LC(c)    WRAP_U8_LC_((c), CC_LOWER_, is_posix_LOWER)
+#define isU8_PRINT_LC(c)    WRAP_U8_LC_((c), CC_PRINT_, is_posix_PRINT)
+#define isU8_PUNCT_LC(c)    WRAP_U8_LC_((c), CC_PUNCT_, is_posix_PUNCT)
+#define isU8_SPACE_LC(c)    WRAP_U8_LC_((c), CC_SPACE_, is_posix_SPACE)
+#define isU8_UPPER_LC(c)    WRAP_U8_LC_((c), CC_UPPER_, is_posix_UPPER)
+#define isU8_WORDCHAR_LC(c) WRAP_U8_LC_((c), CC_WORDCHAR_, is_posix_WORDCHAR)
+#define isU8_XDIGIT_LC(c)   WRAP_U8_LC_((c), CC_XDIGIT_, is_posix_XDIGIT)
+
+#define toU8_LOWER_LC(c)    WRAP_U8_LC_((c), CC_TOLOWER_, to_posix_LOWER)
+#define toU8_UPPER_LC(c)    WRAP_U8_LC_((c), CC_TOUPPER_, to_posix_UPPER)
+#define toU8_FOLD_LC(c)     toU8_LOWER_LC(c)
+
+/* The definitions below use the ones above to create versions in which the
+ * input domain isn't restricted to bytes (though always returning false if the
+ * input doesn't fit in a byte), and to behave properly should the locale be
+ * UTF-8.  These are the documented ones, suitable for general use (though
+ * toUPPER_LC and toFOLD_LC aren't documented because they need special
+ * handling to deal with SHARP S expanding to two characters). */
+
+#define isASCII_LC(c)               (FITS_IN_8_BITS(c) && isU8_ASCII_LC(c))
+#define isALPHA_LC(c)               generic_LC_(c, CC_ALPHA_, isU8_ALPHA_LC)
+#define isALPHANUMERIC_LC(c)                                                \
+                      generic_LC_(c, CC_ALPHANUMERIC_, isU8_ALPHANUMERIC_LC)
+#define isBLANK_LC(c)               generic_LC_(c, CC_BLANK_, isU8_BLANK_LC)
+#define isCASED_LC(c)               generic_LC_(c, CC_CASED_, isU8_CASED_LC)
+#define isCNTRL_LC(c)               generic_LC_(c, CC_CNTRL_, isU8_CNTRL_LC)
+#define isDIGIT_LC(c)               generic_LC_(c, CC_DIGIT_, isU8_DIGIT_LC)
+#define isGRAPH_LC(c)               generic_LC_(c, CC_GRAPH_, isU8_GRAPH_LC)
+#define isIDFIRST_LC(c)         generic_LC_(c, CC_IDFIRST_, isU8_IDFIRST_LC)
+#define isLOWER_LC(c)               generic_LC_(c, CC_LOWER_, isU8_LOWER_LC)
+#define isPRINT_LC(c)               generic_LC_(c, CC_PRINT_, isU8_PRINT_LC)
+#define isPUNCT_LC(c)               generic_LC_(c, CC_PUNCT_, isU8_PUNCT_LC)
+#define isSPACE_LC(c)               generic_LC_(c, CC_SPACE_, isU8_SPACE_LC)
+#define isUPPER_LC(c)               generic_LC_(c, CC_UPPER_, isU8_UPPER_LC)
+#define isWORDCHAR_LC(c)      generic_LC_(c, CC_WORDCHAR_, isU8_WORDCHAR_LC)
+#define isXDIGIT_LC(c)            generic_LC_(c, CC_XDIGIT_, isU8_XDIGIT_LC)
+
+#ifndef CTYPE256
+#  define toLOWER_LC(c)             toLOWER_A(c)
+#  define toUPPER_LC(c)             toUPPER_A(c)
+#  define toFOLD_LC(c)              toFOLD_A(c)
+#else
 
+/* In the next three macros, the reason for using the PL_latin arrays is in
+ * case the system function is defective; it ensures uniform results that
+ * conform to the Unicode standard. */
+
+/* This does not handle the anomalies in UTF-8 Turkic locales. */
+#  define toLOWER_LC(c)  ((! FITS_IN_8_BITS(c))                             \
+                          ? (c)                                             \
+                          : ((IN_UTF8_CTYPE_LOCALE)                         \
+                             ? PL_latin1_lc[ (U8) (c) ]                     \
+                             : ((U8) toU8_LOWER_LC(c))))
+
+/* In this macro, note that the result can be larger than a byte in a UTF-8
+ * locale.  It returns a single value, so can't adequately return the upper
+ * case of LATIN SMALL LETTER SHARP S in a UTF-8 locale (which should be a
+ * string of two values "SS");  instead it asserts against that under
+ * DEBUGGING, and otherwise returns its input.  It does not handle the
+ * anomalies in UTF-8 Turkic locales. */
+#  define toUPPER_LC(c)                                                     \
+    ((! FITS_IN_8_BITS(c))                                                  \
+     ? (c)                                                                  \
+     : ((! IN_UTF8_CTYPE_LOCALE)                                            \
+        ? ((U8) toU8_UPPER_LC(c))                                           \
+        : (UNLIKELY(((U8)(c)) == MICRO_SIGN)                                \
+           ? GREEK_CAPITAL_LETTER_MU                                        \
+           : ((UNLIKELY(((U8) (c)) == LATIN_SMALL_LETTER_Y_WITH_DIAERESIS)  \
+              ? LATIN_CAPITAL_LETTER_Y_WITH_DIAERESIS                       \
+              : (UNLIKELY(((U8)(c)) == LATIN_SMALL_LETTER_SHARP_S)          \
+                ? (__ASSERT_(0) (c)) /* Fail on Sharp S in DEBUGGING */     \
+                : PL_mod_latin1_uc[ (U8) (c) ]))))))
+
+/* In this macro, note that the result can be larger than a byte in a UTF-8
+ * locale.  It returns a single value, so can't adequately return the fold case
+ * of LATIN SMALL LETTER SHARP S in a UTF-8 locale (which should be a string of
+ * two values "ss"); instead it asserts against that under DEBUGGING, and
+ * otherwise returns its input.  It does not handle the anomalies in UTF-8
+ * Turkic locales */
+#  define toFOLD_LC(c)                                                      \
+                ((UNLIKELY((c) == MICRO_SIGN) && IN_UTF8_CTYPE_LOCALE)      \
+                 ? GREEK_SMALL_LETTER_MU                                    \
+                 : (__ASSERT_(   ! IN_UTF8_CTYPE_LOCALE                     \
+                              || LIKELY((c) != LATIN_SMALL_LETTER_SHARP_S)) \
+                    toLOWER_LC(c)))
 #endif
 
 #define isIDCONT(c)             isWORDCHAR(c)
@@ -2058,46 +2144,46 @@ END_EXTERN_C
 
 /* For internal core Perl use only: the base macros for defining macros like
  * isALPHA_uvchr.  'c' is the code point to check.  'classnum' is the POSIX class
- * number defined earlier in this file.  _generic_uvchr() is used for POSIX
+ * number defined earlier in this file.  generic_uvchr_() is used for POSIX
  * classes where there is a macro or function 'above_latin1' that takes the
  * single argument 'c' and returns the desired value.  These exist for those
  * classes which have simple definitions, avoiding the overhead of an inversion
- * list binary search.  _generic_invlist_uvchr() can be used
+ * list binary search.  generic_invlist_uvchr_() can be used
  * for classes where that overhead is faster than a direct lookup.
- * _generic_uvchr() won't compile if 'c' isn't unsigned, as it won't match the
- * 'above_latin1' prototype. _generic_isCC() macro does bounds checking, so
+ * generic_uvchr_() won't compile if 'c' isn't unsigned, as it won't match the
+ * 'above_latin1' prototype. generic_isCC_() macro does bounds checking, so
  * have duplicate checks here, so could create versions of the macros that
  * don't, but experiments show that gcc optimizes them out anyway. */
 
 /* Note that all ignore 'use bytes' */
-#define _generic_uvchr(classnum, above_latin1, c) ((c) < 256                \
-                                             ? _generic_isCC(c, classnum)   \
+#define generic_uvchr_(classnum, above_latin1, c) ((c) < 256                \
+                                             ? generic_isCC_(c, classnum)   \
                                              : above_latin1(c))
-#define _generic_invlist_uvchr(classnum, c) ((c) < 256                        \
-                                             ? _generic_isCC(c, classnum)   \
+#define generic_invlist_uvchr_(classnum, c) ((c) < 256                      \
+                                             ? generic_isCC_(c, classnum)   \
                                              : _is_uni_FOO(classnum, c))
-#define isALPHA_uvchr(c)      _generic_invlist_uvchr(_CC_ALPHA, c)
-#define isALPHANUMERIC_uvchr(c) _generic_invlist_uvchr(_CC_ALPHANUMERIC, c)
+#define isALPHA_uvchr(c)      generic_invlist_uvchr_(CC_ALPHA_, c)
+#define isALPHANUMERIC_uvchr(c) generic_invlist_uvchr_(CC_ALPHANUMERIC_, c)
 #define isASCII_uvchr(c)      isASCII(c)
-#define isBLANK_uvchr(c)      _generic_uvchr(_CC_BLANK, is_HORIZWS_cp_high, c)
+#define isBLANK_uvchr(c)      generic_uvchr_(CC_BLANK_, is_HORIZWS_cp_high, c)
 #define isCNTRL_uvchr(c)      isCNTRL_L1(c) /* All controls are in Latin1 */
-#define isDIGIT_uvchr(c)      _generic_invlist_uvchr(_CC_DIGIT, c)
-#define isGRAPH_uvchr(c)      _generic_invlist_uvchr(_CC_GRAPH, c)
+#define isDIGIT_uvchr(c)      generic_invlist_uvchr_(CC_DIGIT_, c)
+#define isGRAPH_uvchr(c)      generic_invlist_uvchr_(CC_GRAPH_, c)
 #define isIDCONT_uvchr(c)                                                   \
-                    _generic_uvchr(_CC_WORDCHAR, _is_uni_perl_idcont, c)
+                    generic_uvchr_(CC_WORDCHAR_, _is_uni_perl_idcont, c)
 #define isIDFIRST_uvchr(c)                                                  \
-                    _generic_uvchr(_CC_IDFIRST, _is_uni_perl_idstart, c)
-#define isLOWER_uvchr(c)      _generic_invlist_uvchr(_CC_LOWER, c)
-#define isPRINT_uvchr(c)      _generic_invlist_uvchr(_CC_PRINT, c)
+                    generic_uvchr_(CC_IDFIRST_, _is_uni_perl_idstart, c)
+#define isLOWER_uvchr(c)      generic_invlist_uvchr_(CC_LOWER_, c)
+#define isPRINT_uvchr(c)      generic_invlist_uvchr_(CC_PRINT_, c)
 
-#define isPUNCT_uvchr(c)      _generic_invlist_uvchr(_CC_PUNCT, c)
-#define isSPACE_uvchr(c)      _generic_uvchr(_CC_SPACE, is_XPERLSPACE_cp_high, c)
+#define isPUNCT_uvchr(c)      generic_invlist_uvchr_(CC_PUNCT_, c)
+#define isSPACE_uvchr(c)      generic_uvchr_(CC_SPACE_, is_XPERLSPACE_cp_high, c)
 #define isPSXSPC_uvchr(c)     isSPACE_uvchr(c)
 
-#define isUPPER_uvchr(c)      _generic_invlist_uvchr(_CC_UPPER, c)
-#define isVERTWS_uvchr(c)     _generic_uvchr(_CC_VERTSPACE, is_VERTWS_cp_high, c)
-#define isWORDCHAR_uvchr(c)   _generic_invlist_uvchr(_CC_WORDCHAR, c)
-#define isXDIGIT_uvchr(c)     _generic_uvchr(_CC_XDIGIT, is_XDIGIT_cp_high, c)
+#define isUPPER_uvchr(c)      generic_invlist_uvchr_(CC_UPPER_, c)
+#define isVERTWS_uvchr(c)     generic_uvchr_(CC_VERTSPACE_, is_VERTWS_cp_high, c)
+#define isWORDCHAR_uvchr(c)   generic_invlist_uvchr_(CC_WORDCHAR_, c)
+#define isXDIGIT_uvchr(c)     generic_uvchr_(CC_XDIGIT_, is_XDIGIT_cp_high, c)
 
 #define toFOLD_uvchr(c,s,l)    to_uni_fold(c,s,l)
 #define toLOWER_uvchr(c,s,l)   to_uni_lower(c,s,l)
@@ -2131,37 +2217,37 @@ END_EXTERN_C
 
 /* For internal core Perl use only: the base macros for defining macros like
  * isALPHA_LC_uvchr.  These are like isALPHA_LC, but the input can be any code
- * point, not just 0-255.  Like _generic_uvchr, there are two versions, one for
+ * point, not just 0-255.  Like generic_uvchr_, there are two versions, one for
  * simple class definitions; the other for more complex.  These are like
- * _generic_uvchr, so see it for more info. */
-#define _generic_LC_uvchr(latin1, above_latin1, c)                            \
+ * generic_uvchr_, so see it for more info. */
+#define generic_LC_uvchr_(latin1, above_latin1, c)                            \
                                     (c < 256 ? latin1(c) : above_latin1(c))
-#define _generic_LC_invlist_uvchr(latin1, classnum, c)                          \
+#define generic_LC_invlist_uvchr_(latin1, classnum, c)                        \
                             (c < 256 ? latin1(c) : _is_uni_FOO(classnum, c))
 
-#define isALPHA_LC_uvchr(c)  _generic_LC_invlist_uvchr(isALPHA_LC, _CC_ALPHA, c)
-#define isALPHANUMERIC_LC_uvchr(c)  _generic_LC_invlist_uvchr(isALPHANUMERIC_LC, \
-                                                         _CC_ALPHANUMERIC, c)
+#define isALPHA_LC_uvchr(c)  generic_LC_invlist_uvchr_(isALPHA_LC, CC_ALPHA_, c)
+#define isALPHANUMERIC_LC_uvchr(c)  generic_LC_invlist_uvchr_(isALPHANUMERIC_LC, \
+                                                         CC_ALPHANUMERIC_, c)
 #define isASCII_LC_uvchr(c)   isASCII_LC(c)
-#define isBLANK_LC_uvchr(c)  _generic_LC_uvchr(isBLANK_LC,                    \
+#define isBLANK_LC_uvchr(c)  generic_LC_uvchr_(isBLANK_LC,                    \
                                                         is_HORIZWS_cp_high, c)
 #define isCNTRL_LC_uvchr(c)  (c < 256 ? isCNTRL_LC(c) : 0)
-#define isDIGIT_LC_uvchr(c)  _generic_LC_invlist_uvchr(isDIGIT_LC, _CC_DIGIT, c)
-#define isGRAPH_LC_uvchr(c)  _generic_LC_invlist_uvchr(isGRAPH_LC, _CC_GRAPH, c)
-#define isIDCONT_LC_uvchr(c) _generic_LC_uvchr(isIDCONT_LC,                   \
+#define isDIGIT_LC_uvchr(c)  generic_LC_invlist_uvchr_(isDIGIT_LC, CC_DIGIT_, c)
+#define isGRAPH_LC_uvchr(c)  generic_LC_invlist_uvchr_(isGRAPH_LC, CC_GRAPH_, c)
+#define isIDCONT_LC_uvchr(c) generic_LC_uvchr_(isIDCONT_LC,                   \
                                                   _is_uni_perl_idcont, c)
-#define isIDFIRST_LC_uvchr(c) _generic_LC_uvchr(isIDFIRST_LC,                 \
+#define isIDFIRST_LC_uvchr(c) generic_LC_uvchr_(isIDFIRST_LC,                 \
                                                   _is_uni_perl_idstart, c)
-#define isLOWER_LC_uvchr(c)  _generic_LC_invlist_uvchr(isLOWER_LC, _CC_LOWER, c)
-#define isPRINT_LC_uvchr(c)  _generic_LC_invlist_uvchr(isPRINT_LC, _CC_PRINT, c)
+#define isLOWER_LC_uvchr(c)  generic_LC_invlist_uvchr_(isLOWER_LC, CC_LOWER_, c)
+#define isPRINT_LC_uvchr(c)  generic_LC_invlist_uvchr_(isPRINT_LC, CC_PRINT_, c)
 #define isPSXSPC_LC_uvchr(c)  isSPACE_LC_uvchr(c)
-#define isPUNCT_LC_uvchr(c)  _generic_LC_invlist_uvchr(isPUNCT_LC, _CC_PUNCT, c)
-#define isSPACE_LC_uvchr(c)  _generic_LC_uvchr(isSPACE_LC,                    \
+#define isPUNCT_LC_uvchr(c)  generic_LC_invlist_uvchr_(isPUNCT_LC, CC_PUNCT_, c)
+#define isSPACE_LC_uvchr(c)  generic_LC_uvchr_(isSPACE_LC,                    \
                                                     is_XPERLSPACE_cp_high, c)
-#define isUPPER_LC_uvchr(c)  _generic_LC_invlist_uvchr(isUPPER_LC, _CC_UPPER, c)
-#define isWORDCHAR_LC_uvchr(c) _generic_LC_invlist_uvchr(isWORDCHAR_LC,         \
-                                                           _CC_WORDCHAR, c)
-#define isXDIGIT_LC_uvchr(c) _generic_LC_uvchr(isXDIGIT_LC,                  \
+#define isUPPER_LC_uvchr(c)  generic_LC_invlist_uvchr_(isUPPER_LC, CC_UPPER_, c)
+#define isWORDCHAR_LC_uvchr(c) generic_LC_invlist_uvchr_(isWORDCHAR_LC,       \
+                                                           CC_WORDCHAR_, c)
+#define isXDIGIT_LC_uvchr(c) generic_LC_uvchr_(isXDIGIT_LC,                   \
                                                        is_XDIGIT_cp_high, c)
 
 #define isBLANK_LC_uni(c)    isBLANK_LC_uvchr(UNI_TO_NATIVE(c))
@@ -2189,41 +2275,41 @@ END_EXTERN_C
 #  define _utf8_safe_assert(p,e) ((e) > (p))
 #endif
 
-#define _generic_utf8_safe(classnum, p, e, above_latin1)                    \
+#define generic_utf8_safe_(classnum, p, e, above_latin1)                    \
     ((! _utf8_safe_assert(p, e))                                            \
       ? (_force_out_malformed_utf8_message((U8 *) (p), (U8 *) (e), 0, 1), 0)\
       : (UTF8_IS_INVARIANT(*(p)))                                           \
-          ? _generic_isCC(*(p), classnum)                                   \
+          ? generic_isCC_(*(p), classnum)                                   \
           : (UTF8_IS_DOWNGRADEABLE_START(*(p))                              \
              ? ((LIKELY((e) - (p) > 1 && UTF8_IS_CONTINUATION(*((p)+1))))   \
-                ? _generic_isCC(EIGHT_BIT_UTF8_TO_NATIVE(*(p), *((p)+1 )),  \
+                ? generic_isCC_(EIGHT_BIT_UTF8_TO_NATIVE(*(p), *((p)+1 )),  \
                                 classnum)                                   \
                 : (_force_out_malformed_utf8_message(                       \
                                         (U8 *) (p), (U8 *) (e), 0, 1), 0))  \
              : above_latin1))
 /* Like the above, but calls 'above_latin1(p)' to get the utf8 value.
  * 'above_latin1' can be a macro */
-#define _generic_func_utf8_safe(classnum, above_latin1, p, e)               \
-                    _generic_utf8_safe(classnum, p, e, above_latin1(p, e))
-#define _generic_non_invlist_utf8_safe(classnum, above_latin1, p, e)          \
-          _generic_utf8_safe(classnum, p, e,                                \
+#define generic_func_utf8_safe_(classnum, above_latin1, p, e)               \
+                    generic_utf8_safe_(classnum, p, e, above_latin1(p, e))
+#define generic_non_invlist_utf8_safe_(classnum, above_latin1, p, e)        \
+          generic_utf8_safe_(classnum, p, e,                                \
                              (UNLIKELY((e) - (p) < UTF8SKIP(p))             \
                               ? (_force_out_malformed_utf8_message(         \
                                       (U8 *) (p), (U8 *) (e), 0, 1), 0)     \
                               : above_latin1(p)))
 /* Like the above, but passes classnum to _isFOO_utf8(), instead of having an
  * 'above_latin1' parameter */
-#define _generic_invlist_utf8_safe(classnum, p, e)                            \
-            _generic_utf8_safe(classnum, p, e, _is_utf8_FOO(classnum, p, e))
+#define generic_invlist_utf8_safe_(classnum, p, e)                          \
+            generic_utf8_safe_(classnum, p, e, _is_utf8_FOO(classnum, p, e))
 
 /* Like the above, but should be used only when it is known that there are no
  * characters in the upper-Latin1 range (128-255 on ASCII platforms) which the
  * class is TRUE for.  Hence it can skip the tests for this range.
  * 'above_latin1' should include its arguments */
-#define _generic_utf8_safe_no_upper_latin1(classnum, p, e, above_latin1)    \
+#define generic_utf8_safe_no_upper_latin1_(classnum, p, e, above_latin1)    \
          (__ASSERT_(_utf8_safe_assert(p, e))                                \
          (isASCII(*(p)))                                                    \
-          ? _generic_isCC(*(p), classnum)                                   \
+          ? generic_isCC_(*(p), classnum)                                   \
           : (UTF8_IS_DOWNGRADEABLE_START(*(p)))                             \
              ? 0 /* Note that doesn't check validity for latin1 */          \
              : above_latin1)
@@ -2248,15 +2334,15 @@ END_EXTERN_C
 #define isWORDCHAR_utf8(p, e)      isWORDCHAR_utf8_safe(p, e)
 #define isXDIGIT_utf8(p, e)        isXDIGIT_utf8_safe(p, e)
 
-#define isALPHA_utf8_safe(p, e)  _generic_invlist_utf8_safe(_CC_ALPHA, p, e)
+#define isALPHA_utf8_safe(p, e)  generic_invlist_utf8_safe_(CC_ALPHA_, p, e)
 #define isALPHANUMERIC_utf8_safe(p, e)                                      \
-                        _generic_invlist_utf8_safe(_CC_ALPHANUMERIC, p, e)
+                        generic_invlist_utf8_safe_(CC_ALPHANUMERIC_, p, e)
 #define isASCII_utf8_safe(p, e)                                             \
     /* Because ASCII is invariant under utf8, the non-utf8 macro            \
     * works */                                                              \
     (__ASSERT_(_utf8_safe_assert(p, e)) isASCII(*(p)))
 #define isBLANK_utf8_safe(p, e)                                             \
-        _generic_non_invlist_utf8_safe(_CC_BLANK, is_HORIZWS_high, p, e)
+        generic_non_invlist_utf8_safe_(CC_BLANK_, is_HORIZWS_high, p, e)
 
 #ifdef EBCDIC
     /* Because all controls are UTF-8 invariants in EBCDIC, we can use this
@@ -2264,14 +2350,14 @@ END_EXTERN_C
 #   define isCNTRL_utf8_safe(p, e)                                          \
                     (__ASSERT_(_utf8_safe_assert(p, e)) isCNTRL_L1(*(p)))
 #else
-#   define isCNTRL_utf8_safe(p, e)  _generic_utf8_safe(_CC_CNTRL, p, e, 0)
+#   define isCNTRL_utf8_safe(p, e)  generic_utf8_safe_(CC_CNTRL_, p, e, 0)
 #endif
 
 #define isDIGIT_utf8_safe(p, e)                                             \
-            _generic_utf8_safe_no_upper_latin1(_CC_DIGIT, p, e,             \
-                                            _is_utf8_FOO(_CC_DIGIT, p, e))
-#define isGRAPH_utf8_safe(p, e)    _generic_invlist_utf8_safe(_CC_GRAPH, p, e)
-#define isIDCONT_utf8_safe(p, e)   _generic_func_utf8_safe(_CC_WORDCHAR,    \
+            generic_utf8_safe_no_upper_latin1_(CC_DIGIT_, p, e,             \
+                                            _is_utf8_FOO(CC_DIGIT_, p, e))
+#define isGRAPH_utf8_safe(p, e)    generic_invlist_utf8_safe_(CC_GRAPH_, p, e)
+#define isIDCONT_utf8_safe(p, e)   generic_func_utf8_safe_(CC_WORDCHAR_,    \
                                                  _is_utf8_perl_idcont, p, e)
 
 /* To prevent S_scan_word in toke.c from hanging, we have to make sure that
@@ -2281,22 +2367,22 @@ END_EXTERN_C
  * This used to be not the XID version, but we decided to go with the more
  * modern Unicode definition */
 #define isIDFIRST_utf8_safe(p, e)                                           \
-    _generic_func_utf8_safe(_CC_IDFIRST,                                    \
+    generic_func_utf8_safe_(CC_IDFIRST_,                                    \
                             _is_utf8_perl_idstart, (U8 *) (p), (U8 *) (e))
 
-#define isLOWER_utf8_safe(p, e)     _generic_invlist_utf8_safe(_CC_LOWER, p, e)
-#define isPRINT_utf8_safe(p, e)     _generic_invlist_utf8_safe(_CC_PRINT, p, e)
+#define isLOWER_utf8_safe(p, e)     generic_invlist_utf8_safe_(CC_LOWER_, p, e)
+#define isPRINT_utf8_safe(p, e)     generic_invlist_utf8_safe_(CC_PRINT_, p, e)
 #define isPSXSPC_utf8_safe(p, e)     isSPACE_utf8_safe(p, e)
-#define isPUNCT_utf8_safe(p, e)     _generic_invlist_utf8_safe(_CC_PUNCT, p, e)
+#define isPUNCT_utf8_safe(p, e)     generic_invlist_utf8_safe_(CC_PUNCT_, p, e)
 #define isSPACE_utf8_safe(p, e)                                             \
-    _generic_non_invlist_utf8_safe(_CC_SPACE, is_XPERLSPACE_high, p, e)
-#define isUPPER_utf8_safe(p, e)  _generic_invlist_utf8_safe(_CC_UPPER, p, e)
+    generic_non_invlist_utf8_safe_(CC_SPACE_, is_XPERLSPACE_high, p, e)
+#define isUPPER_utf8_safe(p, e)  generic_invlist_utf8_safe_(CC_UPPER_, p, e)
 #define isVERTWS_utf8_safe(p, e)                                            \
-        _generic_non_invlist_utf8_safe(_CC_VERTSPACE, is_VERTWS_high, p, e)
+        generic_non_invlist_utf8_safe_(CC_VERTSPACE_, is_VERTWS_high, p, e)
 #define isWORDCHAR_utf8_safe(p, e)                                          \
-                             _generic_invlist_utf8_safe(_CC_WORDCHAR, p, e)
+                             generic_invlist_utf8_safe_(CC_WORDCHAR_, p, e)
 #define isXDIGIT_utf8_safe(p, e)                                            \
-                   _generic_utf8_safe_no_upper_latin1(_CC_XDIGIT, p, e,     \
+                   generic_utf8_safe_no_upper_latin1_(CC_XDIGIT_, p, e,     \
                              (UNLIKELY((e) - (p) < UTF8SKIP(p))             \
                               ? (_force_out_malformed_utf8_message(         \
                                       (U8 *) (p), (U8 *) (e), 0, 1), 0)     \
@@ -2337,10 +2423,10 @@ END_EXTERN_C
 #define isXDIGIT_LC_utf8(p, e)        isXDIGIT_LC_utf8_safe(p, e)
 
 /* For internal core Perl use only: the base macros for defining macros like
- * isALPHA_LC_utf8_safe.  These are like _generic_utf8, but if the first code
+ * isALPHA_LC_utf8_safe.  These are like generic_utf8_, but if the first code
  * point in 'p' is within the 0-255 range, it uses locale rules from the
  * passed-in 'macro' parameter */
-#define _generic_LC_utf8_safe(macro, p, e, above_latin1)                    \
+#define generic_LC_utf8_safe_(macro, p, e, above_latin1)                    \
          (__ASSERT_(_utf8_safe_assert(p, e))                                \
          (UTF8_IS_INVARIANT(*(p)))                                          \
           ? macro(*(p))                                                     \
@@ -2351,56 +2437,56 @@ END_EXTERN_C
                                         (U8 *) (p), (U8 *) (e), 0, 1), 0))  \
               : above_latin1))
 
-#define _generic_LC_invlist_utf8_safe(macro, classnum, p, e)                  \
-            _generic_LC_utf8_safe(macro, p, e,                              \
+#define generic_LC_invlist_utf8_safe_(macro, classnum, p, e)                  \
+            generic_LC_utf8_safe_(macro, p, e,                              \
                                             _is_utf8_FOO(classnum, p, e))
 
-#define _generic_LC_func_utf8_safe(macro, above_latin1, p, e)               \
-            _generic_LC_utf8_safe(macro, p, e, above_latin1(p, e))
+#define generic_LC_func_utf8_safe_(macro, above_latin1, p, e)               \
+            generic_LC_utf8_safe_(macro, p, e, above_latin1(p, e))
 
-#define _generic_LC_non_invlist_utf8_safe(classnum, above_latin1, p, e)       \
-          _generic_LC_utf8_safe(classnum, p, e,                             \
+#define generic_LC_non_invlist_utf8_safe_(classnum, above_latin1, p, e)       \
+          generic_LC_utf8_safe_(classnum, p, e,                             \
                              (UNLIKELY((e) - (p) < UTF8SKIP(p))             \
                               ? (_force_out_malformed_utf8_message(         \
                                       (U8 *) (p), (U8 *) (e), 0, 1), 0)     \
                               : above_latin1(p)))
 
 #define isALPHANUMERIC_LC_utf8_safe(p, e)                                   \
-            _generic_LC_invlist_utf8_safe(isALPHANUMERIC_LC,                  \
-                                        _CC_ALPHANUMERIC, p, e)
+            generic_LC_invlist_utf8_safe_(isALPHANUMERIC_LC,                \
+                                        CC_ALPHANUMERIC_, p, e)
 #define isALPHA_LC_utf8_safe(p, e)                                          \
-            _generic_LC_invlist_utf8_safe(isALPHA_LC, _CC_ALPHA, p, e)
+            generic_LC_invlist_utf8_safe_(isALPHA_LC, CC_ALPHA_, p, e)
 #define isASCII_LC_utf8_safe(p, e)                                          \
                     (__ASSERT_(_utf8_safe_assert(p, e)) isASCII_LC(*(p)))
 #define isBLANK_LC_utf8_safe(p, e)                                          \
-        _generic_LC_non_invlist_utf8_safe(isBLANK_LC, is_HORIZWS_high, p, e)
+        generic_LC_non_invlist_utf8_safe_(isBLANK_LC, is_HORIZWS_high, p, e)
 #define isCNTRL_LC_utf8_safe(p, e)                                          \
-            _generic_LC_utf8_safe(isCNTRL_LC, p, e, 0)
+            generic_LC_utf8_safe_(isCNTRL_LC, p, e, 0)
 #define isDIGIT_LC_utf8_safe(p, e)                                          \
-            _generic_LC_invlist_utf8_safe(isDIGIT_LC, _CC_DIGIT, p, e)
+            generic_LC_invlist_utf8_safe_(isDIGIT_LC, CC_DIGIT_, p, e)
 #define isGRAPH_LC_utf8_safe(p, e)                                          \
-            _generic_LC_invlist_utf8_safe(isGRAPH_LC, _CC_GRAPH, p, e)
+            generic_LC_invlist_utf8_safe_(isGRAPH_LC, CC_GRAPH_, p, e)
 #define isIDCONT_LC_utf8_safe(p, e)                                         \
-            _generic_LC_func_utf8_safe(isIDCONT_LC,                         \
+            generic_LC_func_utf8_safe_(isIDCONT_LC,                         \
                                                 _is_utf8_perl_idcont, p, e)
 #define isIDFIRST_LC_utf8_safe(p, e)                                        \
-            _generic_LC_func_utf8_safe(isIDFIRST_LC,                        \
+            generic_LC_func_utf8_safe_(isIDFIRST_LC,                        \
                                                _is_utf8_perl_idstart, p, e)
 #define isLOWER_LC_utf8_safe(p, e)                                          \
-            _generic_LC_invlist_utf8_safe(isLOWER_LC, _CC_LOWER, p, e)
+            generic_LC_invlist_utf8_safe_(isLOWER_LC, CC_LOWER_, p, e)
 #define isPRINT_LC_utf8_safe(p, e)                                          \
-            _generic_LC_invlist_utf8_safe(isPRINT_LC, _CC_PRINT, p, e)
+            generic_LC_invlist_utf8_safe_(isPRINT_LC, CC_PRINT_, p, e)
 #define isPSXSPC_LC_utf8_safe(p, e)    isSPACE_LC_utf8_safe(p, e)
 #define isPUNCT_LC_utf8_safe(p, e)                                          \
-            _generic_LC_invlist_utf8_safe(isPUNCT_LC, _CC_PUNCT, p, e)
+            generic_LC_invlist_utf8_safe_(isPUNCT_LC, CC_PUNCT_, p, e)
 #define isSPACE_LC_utf8_safe(p, e)                                          \
-    _generic_LC_non_invlist_utf8_safe(isSPACE_LC, is_XPERLSPACE_high, p, e)
+    generic_LC_non_invlist_utf8_safe_(isSPACE_LC, is_XPERLSPACE_high, p, e)
 #define isUPPER_LC_utf8_safe(p, e)                                          \
-            _generic_LC_invlist_utf8_safe(isUPPER_LC, _CC_UPPER, p, e)
+            generic_LC_invlist_utf8_safe_(isUPPER_LC, CC_UPPER_, p, e)
 #define isWORDCHAR_LC_utf8_safe(p, e)                                       \
-            _generic_LC_invlist_utf8_safe(isWORDCHAR_LC, _CC_WORDCHAR, p, e)
+            generic_LC_invlist_utf8_safe_(isWORDCHAR_LC, CC_WORDCHAR_, p, e)
 #define isXDIGIT_LC_utf8_safe(p, e)                                         \
-        _generic_LC_non_invlist_utf8_safe(isXDIGIT_LC, is_XDIGIT_high, p, e)
+        generic_LC_non_invlist_utf8_safe_(isXDIGIT_LC, is_XDIGIT_high, p, e)
 
 /* Macros for backwards compatibility and for completeness when the ASCII and
  * Latin1 values are identical */
@@ -2460,6 +2546,7 @@ The typedef to use to declare variables that are to hold line numbers.
   Line numbers are unsigned, 32 bits.
 */
 typedef U32 line_t;
+#define LINE_Tf  U32uf
 #define NOLINE ((line_t) 4294967295UL)  /* = FFFFFFFF */
 
 /* Helpful alias for version prescan */
@@ -2585,6 +2672,10 @@ C<CopyD> is like C<Copy> but returns C<dest>.  Useful
 for encouraging compilers to tail-call
 optimise.
 
+=for apidoc    Am|void  |NewCopy |void* src|void* dest|int nitems|type
+Combines Newx() and Copy() into a single macro. Dest will be allocated
+using Newx() and then src will be copied into it.
+
 =for apidoc    Am|void  |Zero |void* dest|int nitems|type
 =for apidoc_item |void *|ZeroD|void* dest|int nitems|type
 
@@ -2639,6 +2730,7 @@ PoisonWith(0xEF) for catching access to freed memory.
  *    max(n) * sizeof(t) > MEM_SIZE_MAX
  */
 
+
 #  define _MEM_WRAP_NEEDS_RUNTIME_CHECK(n,t) \
     (  sizeof(MEM_SIZE) < sizeof(n) \
     || sizeof(t) > ((MEM_SIZE)1 << 8*(sizeof(MEM_SIZE) - sizeof(n))))
@@ -2677,17 +2769,17 @@ PoisonWith(0xEF) for catching access to freed memory.
         (   (void) (UNLIKELY(_MEM_WRAP_WILL_WRAP(n,t))          \
          && (Perl_croak_nocontext(ASSERT_IS_LITERAL(a)), 0)))
 
-#define MEM_WRAP_CHECK_(n,t) MEM_WRAP_CHECK(n,t),
+#  define MEM_WRAP_CHECK_(n,t) MEM_WRAP_CHECK(n,t),
 
-#define PERL_STRLEN_ROUNDUP(n) ((void)(((n) > MEM_SIZE_MAX - 2 * PERL_STRLEN_ROUNDUP_QUANTUM) ? (croak_memory_wrap(),0) : 0), _PERL_STRLEN_ROUNDUP_UNCHECKED(n))
+#  define PERL_STRLEN_ROUNDUP(n) ((void)(((n) > MEM_SIZE_MAX - 2 * PERL_STRLEN_ROUNDUP_QUANTUM) ? (croak_memory_wrap(),0) : 0), _PERL_STRLEN_ROUNDUP_UNCHECKED(n))
 #else
 
-#define MEM_WRAP_CHECK(n,t)
-#define MEM_WRAP_CHECK_1(n,t,a)
-#define MEM_WRAP_CHECK_s(n,t,a)
-#define MEM_WRAP_CHECK_(n,t)
+#  define MEM_WRAP_CHECK(n,t)
+#  define MEM_WRAP_CHECK_1(n,t,a)
+#  define MEM_WRAP_CHECK_s(n,t,a)
+#  define MEM_WRAP_CHECK_(n,t)
 
-#define PERL_STRLEN_ROUNDUP(n) _PERL_STRLEN_ROUNDUP_UNCHECKED(n)
+#  define PERL_STRLEN_ROUNDUP(n) _PERL_STRLEN_ROUNDUP_UNCHECKED(n)
 
 #endif
 
@@ -2792,6 +2884,11 @@ enum mem_log_type {
 #define CopyD(s,d,n,t) (MEM_WRAP_CHECK_(n,t) perl_assert_ptr(d), perl_assert_ptr(s), memcpy((char*)(d),(const char*)(s), (n) * sizeof(t)))
 #define ZeroD(d,n,t)   (MEM_WRAP_CHECK_(n,t) perl_assert_ptr(d), memzero((char*)(d), (n) * sizeof(t)))
 
+#define NewCopy(s,d,n,t) STMT_START {   \
+    Newx(d,n,t);                        \
+    Copy(s,d,n,t);                      \
+} STMT_END
+
 #define PoisonWith(d,n,t,b)    (MEM_WRAP_CHECK_(n,t) (void)memset((char*)(d), (U8)(b), (n) * sizeof(t)))
 #define PoisonNew(d,n,t)       PoisonWith(d,n,t,0xAB)
 #define PoisonFree(d,n,t)      PoisonWith(d,n,t,0xEF)
@@ -2826,6 +2923,12 @@ last-inclusive range.
 #define C_ARRAY_LENGTH(a)      (sizeof(a)/sizeof((a)[0]))
 #define C_ARRAY_END(a)         ((a) + C_ARRAY_LENGTH(a))
 
+#if defined(PERL_CORE) || defined(PERL_EXT_RE_BUILD)
+/* strlen() of a literal string constant.  Restricting this to core, in part
+ * because it can generate compiler warnings about comparing unlike signs */
+#  define STRLENs(s)  (sizeof("" s "") - 1)
+#endif
+
 #ifdef NEED_VA_COPY
 # ifdef va_copy
 #  define Perl_va_copy(s, d) va_copy(d, s)
@@ -2853,18 +2956,53 @@ last-inclusive range.
 #define pTHX__VALUE
 #endif /* USE_ITHREADS */
 
-/* Perl_deprecate was not part of the public API, and did not have a deprecate()
-   shortcut macro defined without -DPERL_CORE. Neither codesearch.google.com nor
-   CPAN::Unpack show any users outside the core.  */
+/*
+ Perl_deprecate was not part of the public API, and did not have a deprecate()
+ shortcut macro defined without -DPERL_CORE. Neither codesearch.google.com nor
+ CPAN::Unpack show any users outside the core.
+
+=for apidoc_section $warning
+=for apidoc Cdm||deprecate|U32 category|"message"
+Wrapper around Perl_ck_warner_d() to produce a deprecated warning in the
+given category with an appropriate message. The C<message> argument must
+be a C string. The string " is deprecated" will automatically be added
+to the end of the C<message>.
+
+=for apidoc Cdm||deprecate_disappears_in|U32 category|"when"|"message"
+Wrapper around Perl_ck_warner_d() to produce a deprecated warning in the
+given category with an appropriate message that the construct referred
+to by the message will disappear in a specific release.  The C<when> and
+C<message> arguments must be a C string.  The C<when> string is expected
+to be of the form "5.40", with no minor element in the version.  The actual
+message output will be the result of the following expression C<message
+" is deprecated, and will disappear in Perl " when> which is why C<message>
+and C<when> must be literal C strings.
+
+=for apidoc Cdm||deprecate_fatal_in|U32 category|"when"|"message"
+Wrapper around Perl_ck_warner_d() to produce a deprecated warning in the
+given category with an appropriate message that the construct referred
+to by the message will become fatal in a specific release.  The C<when>
+and C<message> arguments must be a C string.  The C<when> string is expected
+to be of the form "5.40", with no minor element in the version.  The actual
+message output will be the result of the following expression C<message " is
+deprecated, and will become fatal in Perl " when> which is why C<message>
+and C<when> must be literal C strings.
+
+=cut
+*/
+
 #ifdef PERL_CORE
-#  define deprecate(s) Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED),    \
-                                            "Use of " s " is deprecated")
-#  define deprecate_disappears_in(when,message) \
-              Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED),    \
-                               message " is deprecated, and will disappear in Perl " when)
-#  define deprecate_fatal_in(when,message) \
-              Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED),    \
-                               message " is deprecated, and will become fatal in Perl " when)
+#  define deprecate(category,message)                       \
+    Perl_ck_warner_d(aTHX_ packWARN(category),              \
+        message " is deprecated")
+
+#  define deprecate_disappears_in(category,when,message)    \
+    Perl_ck_warner_d(aTHX_ packWARN(category),              \
+        message " is deprecated, and will disappear in Perl " when)
+
+#  define deprecate_fatal_in(category,when,message)         \
+    Perl_ck_warner_d(aTHX_ packWARN(category),              \
+        message " is deprecated, and will become fatal in Perl " when)
 #endif
 
 /* Internal macros to deal with gids and uids */
@@ -2894,6 +3032,85 @@ last-inclusive range.
 
 #endif
 
+/* These are simple Marsaglia XOR-SHIFT RNG's for 64 and 32 bits. These
+ * RNG's are of reasonable quality, very fast, and have the interesting
+ * property that provided 'x' is non-zero they create a cycle of 2^32-1
+ * or 2^64-1 "random" like numbers, with the exception of 0. Thus they
+ * are very useful when you want an integer to "dance" in a random way,
+ * but you also never want it to become 0 and thus false.
+ *
+ * Obviously they leave x unchanged if it starts out as 0.
+ *
+ * We have two variants just because that can be helpful in certain
+ * places. There is no advantage to either, they are equally bad as each
+ * other as far RNG's go. Sufficiently random for many purposes, but
+ * insufficiently random for serious use as they fail important tests in
+ * the Test01 BigCrush RNG test suite by L’Ecuyer and Simard. (Note
+ * that Drand48 also fails BigCrush). The main point is they produce
+ * different sequences and in places where we want some randomlike
+ * behavior they are cheap and easy.
+ *
+ * Marsaglia was one of the early researchers into RNG testing and wrote
+ * the Diehard RNG test suite, which after his death become the
+ * Dieharder RNG suite, and was generally supplanted by the Test01 suite
+ * by L'Ecruyer and associates.
+ *
+ * There are dozens of shift parameters that create a pseudo random ring
+ * of integers 1..2^N-1, if you need a different sequence just read the
+ * paper and select a set of parameters. In fact, simply reversing the
+ * shift order from L/R/L to R/L/R should result in another valid
+ * example, but read the paper before you do that.
+ *
+ * PDF of the original paper:
+ *  https://www.jstatsoft.org/article/download/v008i14/916
+ * Wikipedia:
+ *  https://en.wikipedia.org/wiki/Xorshift
+ * Criticism:
+ *  https://www.iro.umontreal.ca/~lecuyer/myftp/papers/xorshift.pdf
+ * Test01:
+ *  http://simul.iro.umontreal.ca/testu01/tu01.html
+ * Diehard:
+ *  https://en.wikipedia.org/wiki/Diehard_tests
+ * Dieharder:
+ *  https://webhome.phy.duke.edu/~rgb/General/rand_rate/rand_rate.abs
+ *
+ */
+
+/* 32 bit version */
+#define PERL_XORSHIFT32_A(x)    \
+STMT_START {                    \
+    (x) ^= ((x) << 13);         \
+    (x) ^= ((x) >> 17);         \
+    (x) ^= ((x) << 5);          \
+} STMT_END
+
+/* 64 bit version */
+#define PERL_XORSHIFT64_A(x)    \
+STMT_START {                    \
+    (x) ^= ((x) << 13);         \
+    (x) ^= ((x) >> 7);          \
+    (x) ^= ((x) << 17);         \
+} STMT_END
+
+/* 32 bit version */
+#define PERL_XORSHIFT32_B(x)    \
+STMT_START {                    \
+    (x) ^= ((x) << 5);          \
+    (x) ^= ((x) >> 27);         \
+    (x) ^= ((x) << 8);          \
+} STMT_END
+
+/* 64 bit version - currently this is unused,
+ * it is provided here to complement the 32 bit _B
+ * variant which IS used. */
+#define PERL_XORSHIFT64_B(x)    \
+STMT_START {                    \
+    (x) ^= ((x) << 15);         \
+    (x) ^= ((x) >> 49);         \
+    (x) ^= ((x) << 26);         \
+} STMT_END
+
+
 #endif  /* PERL_HANDY_H_ */
 
 /*
index e8ff5ee..56840ea 100644 (file)
@@ -1,3 +1,5 @@
+# vim: syntax=pod
+
 =head1 NAME
 
 README.hints - hint files used by Configure
index 9f9b32c..86fff48 100644 (file)
@@ -670,7 +670,7 @@ EOF
            $cc -q64 -qlongdouble -o fmodl$$ fmodl$$.c -lm
            case `./fmodl$$` in
            2147483648)
-             echo "The -q64 did the trick, will use it." >& 4
+             echo "The -q64 did the trick, will use it." >&4
              ccflags="`echo $ccflags | sed -e 's@-q32@@g'`"
              ldflags="`echo $ldflags | sed -e 's@-q32@@g'`"
              ccflags="$ccflags -q64"
index a10f265..48c309f 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.36.3
+# mkdir -p /opt/perl-catamount/lib/perl5/5.38.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.36.3
+# cp -pr lib/* /opt/perl-catamount/lib/perl5/5.38.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 ea52100..72bdfb6 100644 (file)
@@ -357,6 +357,9 @@ EOM
         esac
     fi
 
+    # The OS is buggy with respect to this.
+    ccflags="$ccflags -DNO_POSIX_2008_LOCALE"
+
    lddlflags="${ldflags} -bundle -undefined dynamic_lookup"
    ;;
 esac
@@ -509,16 +512,6 @@ esac
 # the problem.
 firstmakefile=GNUmakefile;
 
-# Parts of the system call setenv(), in particular in an atfork handler.
-# This causes problems when the child tries to clean up environ[], so
-# let libc manage environ[].
-cat >> config.over <<'EOOVER'
-if test "$d_unsetenv" = "$define" -a \
-    `expr "$ccflags" : '.*-DPERL_USE_SAFE_PUTENV'` -eq 0; then
-        ccflags="$ccflags -DPERL_USE_SAFE_PUTENV"
-fi
-EOOVER
-
 # if you use a newer toolchain before OS X 10.9 these functions may be
 # incorrectly detected, so disable them
 # OS X 10.10.x corresponds to kernel 14.x
index 4f3baef..064d17c 100644 (file)
@@ -487,7 +487,7 @@ esac
 for p in $loclibpth
 do
        if test -d $p; then
-           echo "Appending $p to LD_LIBRARY_PATH." >& 4
+           echo "Appending $p to LD_LIBRARY_PATH." >&4
            case "$LD_LIBRARY_PATH" in
            '') LD_LIBRARY_PATH=$p                  ;;
            *)  LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$p ;;
@@ -496,7 +496,7 @@ do
 done
 case "$LD_LIBRARY_PATH" in
 "$old_LD_LIBRARY_PATH") ;;
-*) echo "LD_LIBRARY_PATH is now $LD_LIBRARY_PATH." >& 4 ;;
+*) echo "LD_LIBRARY_PATH is now $LD_LIBRARY_PATH." >&4 ;;
 esac
 case "$LD_LIBRARY_PATH" in
 '') ;;
index 72db521..4d26835 100644 (file)
@@ -352,3 +352,25 @@ arm|mips)
   test "$optimize" || optimize='-O2'
   ;;
 esac
+
+# don't modify a supplied -Darchname
+case "$archname" in
+'')
+  cat > UU/archname.cbu <<'EOCBU'
+unamem=`uname -m`
+case "$archname" in
+"$unamem"-*)
+  arch=`uname -p`
+  archname=`echo "$archname" | sed -e "s/^$unamem-/$arch-/"`
+  ;;
+esac
+EOCBU
+  ;;
+esac
+
+# This function on this box has weird behavior.  See
+# https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=255646
+d_querylocale='undef'
+
+# See https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=265950
+d_duplocale='undef'
index da5f81d..2b3cb1f 100644 (file)
@@ -805,13 +805,15 @@ case "$d_oldpthreads" in
 # and it seems to be buggy in HP-UX anyway.
 i_dbm=undef
 
-# In HP-UXes prior to 11.23 strtold() returned a HP-UX
-# specific union called long_double, not a C99 long double.
-case "`grep 'double strtold.const' /usr/include/stdlib.h`" in
-*"long double strtold"*) ;; # strtold should be safe.
-*) echo "Looks like your strtold() is non-standard..." >&4
-   d_strtold=undef ;;
-esac
+if [ "$xxOsRevMajor" -lt 11 ] || [ "$xxOsRevMajor" -eq 11 ] && [ "$xxOsRevMinor" -lt 23 ]; then
+    # In HP-UXes prior to 11.23 strtold() returned a HP-UX
+    # specific union called long_double, not a C99 long double.
+    case "`grep 'double strtold.const' /usr/include/stdlib.h`" in
+        *"long double strtold"*) ;; # strtold should be safe.
+        *) echo "Looks like your strtold() is non-standard..." >&4
+        d_strtold=undef ;;
+    esac
+fi
 
 # In pre-11 HP-UXes there really isn't isfinite(), despite what
 # Configure might think. (There is finite(), though.)
index c749f0f..e1508c7 100644 (file)
@@ -154,7 +154,7 @@ esac
 # (such as -lm) in /lib or /usr/lib.  So we have to ask gcc to tell us
 # where to look.  We don't want gcc's own libraries, however, so we
 # filter those out.
-# This could be conditional on Unbuntu, but other distributions may
+# This could be conditional on Ubuntu, but other distributions may
 # follow suit, and this scheme seems to work even on rather old gcc's.
 # This unconditionally uses gcc because even if the user is using another
 # compiler, we still need to find the math library and friends, and I don't
index 05252d1..dd8df2f 100644 (file)
@@ -31,14 +31,6 @@ case "$osvers" in
        d_setruid=$undef
 esac
 
-# OpenBSD 5.5 on has 64 bit time_t
-case "$osvers" in
-[0-4].*|5.[0-4]) ;;
-*)
-       cppflags="$cppflags -DBIG_TIME"
-       ;;
-esac
-
 #
 # Not all platforms support dynamic loading...
 # For the case of "$openbsd_distribution", the hints file
@@ -55,11 +47,7 @@ alpha-2.[0-8]|mips-2.[0-8]|powerpc-2.[0-7]|m88k-[2-4].*|m88k-5.[0-2]|hppa-3.[0-5
        test -z "$usedl" && usedl=$define
        # We use -fPIC here because -fpic is *NOT* enough for some of the
        # extensions like Tk on some OpenBSD platforms (ie: sparc)
-       PICFLAG=-fPIC
-       if [ -e /usr/share/mk/bsd.own.mk ]; then
-               PICFLAG=`make -f /usr/share/mk/bsd.own.mk -V PICFLAG`
-       fi
-       cccdlflags="-DPIC ${PICFLAG} $cccdlflags"
+       cccdlflags="-DPIC -fPIC $cccdlflags"
        case "$osvers" in
        [01].*|2.[0-7]|2.[0-7].*)
                lddlflags="-Bshareable $lddlflags"
@@ -70,7 +58,7 @@ alpha-2.[0-8]|mips-2.[0-8]|powerpc-2.[0-7]|m88k-[2-4].*|m88k-5.[0-2]|hppa-3.[0-5
                ;;
        *) # from 3.1 onwards
                ld=${cc:-cc}
-               lddlflags="-shared ${PICFLAG} $lddlflags"
+               lddlflags="-shared -fPIC $lddlflags"
                libswanted=`echo $libswanted | sed 's/ dl / /'`
                ;;
        esac
@@ -96,9 +84,6 @@ esac
 # around for old NetBSD binaries.
 libswanted=`echo $libswanted | sed 's/ crypt / /'`
 
-# OpenBSD hasn't ever needed linking to libutil
-libswanted=`echo $libswanted | sed 's/ util / /'`
-
 # Configure can't figure this out non-interactively
 d_suidsafe=$define
 
@@ -116,25 +101,6 @@ m88k-3.4)
    ;;
 esac
 
-#
-# Unaligned access on alpha with -ftree-ter
-# http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59679
-# More details
-# https://rt.perl.org/Public/Bug/Display.html?id=120888
-#
-case "${ARCH}-${osvers}" in
-    alpha-*)
-    ccflags="-fno-tree-ter $ccflags"
-    ;;
-esac
-
-# Special per-arch specific ccflags
-case "${ARCH}-${osvers}" in
-    vax-*)
-    ccflags="-DUSE_PERL_ATOF=0 $ccflags"
-    ;;
-esac
-
 # This script UU/usethreads.cbu will get 'called-back' by Configure 
 # after it has prompted the user for whether to use threads.
 cat > UU/usethreads.cbu <<'EOCBU'
@@ -156,9 +122,6 @@ $define|true|[yY]*)
                # Broken up to OpenBSD 3.6, fixed in OpenBSD 3.7
                d_getservbyname_r=$undef ;;
        esac
-       ;;
-*)
-       libswanted=`echo $libswanted | sed 's/ pthread / /'`
 esac
 EOCBU
 
@@ -177,12 +140,12 @@ case "$openbsd_distribution" in
        siteprefix='/usr/local'
        siteprefixexp='/usr/local'
        # Ports installs non-std libs in /usr/local/lib so look there too
-       locincpth=''
-       loclibpth=''
+       locincpth='/usr/local/include'
+       loclibpth='/usr/local/lib'
        # Link perl with shared libperl
-       if [ "$usedl" = "$define" -a -r $src/shlib_version ]; then
+       if [ "$usedl" = "$define" -a -r shlib_version ]; then
                useshrplib=true
-               libperl=`. $src/shlib_version; echo libperl.so.${major}.${minor}`
+               libperl=`. ./shlib_version; echo libperl.so.${major}.${minor}`
        fi
        ;;
 esac
@@ -192,9 +155,6 @@ esac
 # which is being fixed.  In the meantime, forbid POSIX 2008 locales
 d_newlocale="$undef"
 
-# OpenBSD's locale support is not that complete yet
-ccflags="-DNO_LOCALE_NUMERIC -DNO_LOCALE_COLLATE $ccflags"
-
 # Seems that OpenBSD returns bogus values in _Thread_local variables in code in
 # shared objects, so we need to disable it. See GH #19109
 d_thread_local=undef
index 8995d8c..56f247b 100644 (file)
@@ -63,8 +63,6 @@ myfirstchar=$(od -A n -N 1 -t x $me | xargs | tr [:lower:] [:upper:] | tr -d 0)
 if [ "${myfirstchar}" = "23" ]; then # 23 is '#' in ASCII
   unset ebcdic
   def_os390_cflags="$def_os390_cflags -qascii"
-  # ensure that 'safe' putenv is used and avoid direct environ manipulation
-  def_os390_defs="$def_os390_defs -DPERL_USE_SAFE_PUTENV";
 else
   ebcdic=true
 fi
index e50d9d8..15928c7 100644 (file)
@@ -63,6 +63,10 @@ esac
 set `echo " $libswanted " | sed -e 's@ ld @ @' -e 's@ malloc @ @' -e 's@ ucb @ @' -e 's@ sec @ @' -e 's@ crypt @ @'`
 libswanted="$*"
 
+# Add libnsl for networking support
+set `echo " $libswanted " | sed -e 's@ inet @ inet nsl @'`
+libswanted="$*"
+
 # Look for architecture name.  We want to suggest a useful default.
 case "$archname" in
 '')
@@ -694,21 +698,6 @@ EOM
 esac
 EOCBU
 
-#
-# If unsetenv is available, use it in conjunction with PERL_USE_SAFE_PUTENV to
-# work around Sun bugid 6333830.  Both unsetenv and 6333830 only appear in
-# Solaris 10, so we don't need to probe explicitly for an OS version.  We have
-# to append this test to the end of config.over as it needs to run after
-# Configure has probed for unsetenv, and this hints file is processed before
-# that has happened.
-#
-cat >> config.over <<'EOOVER'
-if test "$d_unsetenv" = "$define" -a \
-    `expr "$ccflags" : '.*-DPERL_USE_SAFE_PUTENV'` -eq 0; then
-        ccflags="$ccflags -DPERL_USE_SAFE_PUTENV"
-fi
-EOOVER
-
 rm -f try.c try.o try a.out
 
 # If using C++, the Configure scan for dlopen() will fail in Solaris
diff --git a/gnu/usr.bin/perl/hints/ultrix_4.sh b/gnu/usr.bin/perl/hints/ultrix_4.sh
deleted file mode 100644 (file)
index f32f06d..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-# hints/ultrix_4.sh
-# Last updated by Andy Dougherty  <doughera@lafayette.edu>
-# Fri Feb 10 10:04:51 EST 1995
-#
-# Use   Configure -Dcc=gcc   to use gcc.
-#
-# This used to use -g, but that pulls in -DDEBUGGING by default.
-case "$optimize" in
-'')
-       # recent versions have a working compiler.
-       case "$osvers" in
-       *4.[45]*)       optimize='-O2' ;;
-       *)              optimize='none' ;;
-       esac
-       ;;
-esac
-
-# Some users have reported Configure runs *much* faster if you 
-# replace all occurrences of /bin/sh by /bin/sh5
-# Something like:
-#   sed 's!/bin/sh!/bin/sh5!g' Configure > Configure.sh5
-# Then run "sh5 Configure.sh5 [your options]"
-
-case "$myuname" in
-*risc*) cat <<EOF >&4
-Note that there is a bug in some versions of NFS on the DECStation that
-may cause utime() to work incorrectly.  If so, regression test io/fs
-may fail if run under NFS.  Ignore the failure.
-EOF
-esac
-
-# Compiler flags that depend on osversion:
-case "$cc" in
-*gcc*) ;;
-*)
-    case "$osvers" in
-    *4.1*)     ccflags="$ccflags -DLANGUAGE_C -Olimit 3800" ;;
-    *4.2*)     ccflags="$ccflags -DLANGUAGE_C -Olimit 3800"
-               # Prototypes sometimes cause compilation errors in 4.2.
-               prototype=undef   
-    *4.3*)     ccflags="$ccflags -std1 -DLANGUAGE_C -Olimit 3800" ;;
-    *) ccflags="$ccflags -std -Olimit 3800" ;;
-    esac
-    ;;
-esac
-
-# Other settings that depend on $osvers:
-case "$osvers" in
-*4.1*) ;;
-*4.2*) libswanted=`echo $libswanted | sed 's/ malloc / /'` ;;
-*4.3*) ;;
-*)     ranlib='ranlib' ;;
-esac
-
-# Settings that don't depend on $osvers:
-
-util_cflags='ccflags="$ccflags -DLOCALE_ENVIRON_REQUIRED"'
-groupstype='int'
-# The configure test should be beefed up to try using the field when
-# it can't find any of the standardly-named fields.
-d_dirnamlen='define'
-
-# Ultrix can mmap only character devices, not regular files,
-# which is rather useless state of things for Perl.
-d_mmap='undef'
-
-# There simply isn't dynaloading in Ultrix.
-usedl='undef'
-
index 93b1474..6d1f37f 100644 (file)
@@ -56,20 +56,10 @@ static const char S_strtab_error[]
  */
 #if IVSIZE == 8
 /* 64 bit version */
-#define XORSHIFT_RAND_BITS(x)   \
-STMT_START {                    \
-    (x) ^= (x) << 13;           \
-    (x) ^= (x) >> 17;           \
-    (x) ^= (x) << 5;            \
-} STMT_END
+#define XORSHIFT_RAND_BITS(x)   PERL_XORSHIFT64_A(x)
 #else
 /* 32 bit version */
-#define XORSHIFT_RAND_BITS(x)   \
-STMT_START {                    \
-    (x) ^= (x) << 13;           \
-    (x) ^= (x) >> 7;            \
-    (x) ^= (x) << 17;           \
-} STMT_END
+#define XORSHIFT_RAND_BITS(x)   PERL_XORSHIFT32_A(x)
 #endif
 
 #define UPDATE_HASH_RAND_BITS_KEY(key,klen)                             \
@@ -337,28 +327,44 @@ S_hv_notallowed(pTHX_ int flags, const char *key, I32 klen,
  * contains an SV* */
 
 /*
-=for apidoc hv_store
+=for apidoc      hv_store
+=for apidoc_item hv_stores
 
-Stores an SV in a hash.  The hash key is specified as C<key> and the
-absolute value of C<klen> is the length of the key.  If C<klen> is
-negative the key is assumed to be in UTF-8-encoded Unicode.  The
-C<hash> parameter is the precomputed hash value; if it is zero then
-Perl will compute it.
+These each store SV C<val> with the specified key in hash C<hv>, returning NULL
+if the operation failed or if the value did not need to be actually stored
+within the hash (as in the case of tied hashes).  Otherwise it can be
+dereferenced to get the original C<SV*>.
 
-The return value will be
-C<NULL> if the operation failed or if the value did not need to be actually
-stored within the hash (as in the case of tied hashes).  Otherwise it can
-be dereferenced to get the original C<SV*>.  Note that the caller is
+They differ only in how the hash key is specified.
+
+In C<hv_stores>, the key is a C language string literal, enclosed in double
+quotes.  It is never treated as being in UTF-8.
+
+In C<hv_store>, C<key> is either NULL or points to the first byte of the string
+specifying the key, and its length in bytes is given by the absolute value of
+an additional parameter, C<klen>.  A NULL key indicates the key is to be
+treated as C<undef>, and C<klen> is ignored; otherwise the key string may
+contain embedded-NUL bytes.  If C<klen> is negative, the string is treated as
+being encoded in UTF-8; otherwise not.
+
+C<hv_store> has another extra parameter, C<hash>, a precomputed hash of the key
+string, or zero if it has not been precomputed.  This parameter is omitted from
+C<hv_stores>, as it is computed automatically at compile time.
+
+If <hv> is NULL, NULL is returned and no action is taken.
+
+If C<val> is NULL, it is treated as being C<undef>; otherwise the caller is
 responsible for suitably incrementing the reference count of C<val> before
 the call, and decrementing it if the function returned C<NULL>.  Effectively
 a successful C<hv_store> takes ownership of one reference to C<val>.  This is
 usually what you want; a newly created SV has a reference count of one, so
 if all your code does is create SVs then store them in a hash, C<hv_store>
 will own the only reference to the new SV, and your code doesn't need to do
-anything further to tidy up.  C<hv_store> is not implemented as a call to
-C<hv_store_ent>, and does not create a temporary SV for the key, so if your
-key data is not already in SV form then use C<hv_store> in preference to
-C<hv_store_ent>.
+anything further to tidy up.
+
+C<hv_store> is not implemented as a call to L</C<hv_store_ent>>, and does not
+create a temporary SV for the key, so if your key data is not already in SV
+form then use C<hv_store> in preference to C<hv_store_ent>.
 
 See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for more
 information on how to use this function on tied hashes.
@@ -474,7 +480,7 @@ Perl_hv_common(pTHX_ HV *hv, SV *keysv, const char *key, STRLEN klen,
 
     if (!hv)
         return NULL;
-    if (SvTYPE(hv) == (svtype)SVTYPEMASK)
+    if (SvIS_FREED(hv))
         return NULL;
 
     assert(SvTYPE(hv) == SVt_PVHV);
@@ -587,7 +593,7 @@ Perl_hv_common(pTHX_ HV *hv, SV *keysv, const char *key, STRLEN klen,
                 for (i = 0; i < klen; ++i)
                     if (isLOWER(key[i])) {
                         /* Would be nice if we had a routine to do the
-                           copy and upercase in a single pass through.  */
+                           copy and uppercase in a single pass through.  */
                         const char * const nkey = strupr(savepvn(key,klen));
                         /* Note that this fetch is for nkey (the uppercased
                            key) whereas the store is for key (the original)  */
@@ -1000,7 +1006,7 @@ Perl_hv_common(pTHX_ HV *hv, SV *keysv, const char *key, STRLEN klen,
         *oentry = entry;
     }
 #ifdef PERL_HASH_RANDOMIZE_KEYS
-    if (SvOOK(hv)) {
+    if (HvHasAUX(hv)) {
         /* Currently this makes various tests warn in annoying ways.
          * So Silenced for now. - Yves | bogus end of comment =>* /
         if (HvAUX(hv)->xhv_riter != -1) {
@@ -1416,11 +1422,11 @@ S_hv_delete_common(pTHX_ HV *hv, SV *keysv, const char *key, STRLEN klen,
         else {
             HeVAL(entry) = NULL;
             *oentry = HeNEXT(entry);
-            if (SvOOK(hv) && entry == HvAUX(hv)->xhv_eiter /* HvEITER(hv) */) {
+            if (HvHasAUX(hv) && entry == HvAUX(hv)->xhv_eiter /* HvEITER(hv) */) {
                 HvLAZYDEL_on(hv);
             }
             else {
-                if (SvOOK(hv) && HvLAZYDEL(hv) &&
+                if (HvHasAUX(hv) && HvLAZYDEL(hv) &&
                     entry == HeNEXT(HvAUX(hv)->xhv_eiter))
                     HeNEXT(HvAUX(hv)->xhv_eiter) = HeNEXT(entry);
                 hv_free_ent(NULL, entry);
@@ -1433,7 +1439,7 @@ S_hv_delete_common(pTHX_ HV *hv, SV *keysv, const char *key, STRLEN klen,
         /* If this is a stash and the key ends with ::, then someone is 
          * deleting a package.
          */
-        if (sv && SvTYPE(sv) == SVt_PVGV && HvENAME_get(hv)) {
+        if (sv && SvTYPE(sv) == SVt_PVGV && HvHasENAME(hv)) {
                 gv = (GV *)sv;
                 if ((
                      (klen > 1 && key[klen-2] == ':' && key[klen-1] == ':')
@@ -1442,7 +1448,7 @@ S_hv_delete_common(pTHX_ HV *hv, SV *keysv, const char *key, STRLEN klen,
                     )
                  && (klen != 6 || hv!=PL_defstash || memNE(key,"main::",6))
                  && (stash = GvHV((GV *)gv))
-                 && HvENAME_get(stash)) {
+                 && HvHasENAME(stash)) {
                         /* A previous version of this code checked that the
                          * GV was still in the symbol table by fetching the
                          * GV with its name. That is not necessary (and
@@ -1470,11 +1476,13 @@ S_hv_delete_common(pTHX_ HV *hv, SV *keysv, const char *key, STRLEN klen,
                             SV **svp, **end;
                         strip_magic:
                             svp = AvARRAY(isa);
-                            end = svp + (AvFILLp(isa)+1);
-                            while (svp < end) {
-                                if (*svp)
-                                    mg_free_type(*svp, PERL_MAGIC_isaelem);
-                                ++svp;
+                            if (svp) {
+                                end = svp + (AvFILLp(isa)+1);
+                                while (svp < end) {
+                                    if (*svp)
+                                        mg_free_type(*svp, PERL_MAGIC_isaelem);
+                                    ++svp;
+                                }
                             }
                             mg_free_type((SV*)GvAV(gv), PERL_MAGIC_isa);
                         }
@@ -1529,7 +1537,7 @@ S_hv_delete_common(pTHX_ HV *hv, SV *keysv, const char *key, STRLEN klen,
         if (sv) {
             /* deletion of method from stash */
             if (isGV(sv) && isGV_with_GP(sv) && GvCVu(sv)
-             && HvENAME_get(hv))
+             && HvHasENAME(hv))
                 mro_method_changed_in(hv);
 
             if (d_flags & G_DISCARD) {
@@ -1586,7 +1594,7 @@ static bool
 S_large_hash_heuristic(pTHX_ HV *hv, STRLEN size) {
     if (size > 42
         && !SvOBJECT(hv)
-        && !(SvOOK(hv) && HvENAME_get(hv))) {
+        && !(HvHasAUX(hv) && HvENAME_get(hv))) {
         /* This hash appears to be growing quite large.
            We gamble that it is not sharing keys with other hashes. */
         return TRUE;
@@ -1679,6 +1687,19 @@ S_hsplit(pTHX_ HV *hv, STRLEN const oldsize, STRLEN newsize)
     } while (i++ < oldsize);
 }
 
+/*
+=for apidoc hv_ksplit
+
+Attempt to grow the hash C<hv> so it has at least C<newmax> buckets available.
+Perl chooses the actual number for its convenience.
+
+This is the same as doing the following in Perl code:
+
+ keys %hv = newmax;
+
+=cut
+*/
+
 void
 Perl_hv_ksplit(pTHX_ HV *hv, IV newmax)
 {
@@ -1716,11 +1737,11 @@ Perl_hv_ksplit(pTHX_ HV *hv, IV newmax)
     a = (char *) HvARRAY(hv);
     if (a) {
 #ifdef PERL_HASH_RANDOMIZE_KEYS
-        U32 was_ook = SvOOK(hv);
+        U32 was_ook = HvHasAUX(hv);
 #endif
         hsplit(hv, oldsize, newsize);
 #ifdef PERL_HASH_RANDOMIZE_KEYS
-        if (was_ook && SvOOK(hv) && HvTOTALKEYS(hv)) {
+        if (was_ook && HvHasAUX(hv) && HvTOTALKEYS(hv)) {
             MAYBE_UPDATE_HASH_RAND_BITS();
             HvAUX(hv)->xhv_rand = (U32)PL_hash_rand_bits;
         }
@@ -2018,7 +2039,7 @@ Perl_hv_clear(pTHX_ HV *hv)
 
         HvHASKFLAGS_off(hv);
     }
-    if (SvOOK(hv)) {
+    if (HvHasAUX(hv)) {
         if(HvENAME_get(hv))
             mro_isa_changed_in(hv);
         HvEITER_set(hv, NULL);
@@ -2079,7 +2100,7 @@ S_clear_placeholders(pTHX_ HV *hv, const U32 placeholders)
                 if (entry == HvEITER_get(hv))
                     HvLAZYDEL_on(hv);
                 else {
-                    if (SvOOK(hv) && HvLAZYDEL(hv) &&
+                    if (HvHasAUX(hv) && HvLAZYDEL(hv) &&
                         entry == HeNEXT(HvAUX(hv)->xhv_eiter))
                         HeNEXT(HvAUX(hv)->xhv_eiter) = HeNEXT(entry);
                     hv_free_ent(NULL, entry);
@@ -2138,7 +2159,7 @@ Perl_hfree_next_entry(pTHX_ HV *hv, STRLEN *indexp)
 
     PERL_ARGS_ASSERT_HFREE_NEXT_ENTRY;
 
-    if (SvOOK(hv) && ((iter = HvAUX(hv)))) {
+    if (HvHasAUX(hv) && ((iter = HvAUX(hv)))) {
         if ((entry = iter->xhv_eiter)) {
             /* the iterator may get resurrected after each
              * destructor call, so check each time */
@@ -2169,9 +2190,9 @@ Perl_hfree_next_entry(pTHX_ HV *hv, STRLEN *indexp)
     array[*indexp] = HeNEXT(entry);
     ((XPVHV*) SvANY(hv))->xhv_keys--;
 
-    if (   PL_phase != PERL_PHASE_DESTRUCT && HvENAME(hv)
+    if (   PL_phase != PERL_PHASE_DESTRUCT && HvHasENAME(hv)
         && HeVAL(entry) && isGV(HeVAL(entry))
-        && GvHV(HeVAL(entry)) && HvENAME(GvHV(HeVAL(entry)))
+        && GvHV(HeVAL(entry)) && HvHasENAME(GvHV(HeVAL(entry)))
     ) {
         STRLEN klen;
         const char * const key = HePV(entry,klen);
@@ -2205,7 +2226,7 @@ void
 Perl_hv_undef_flags(pTHX_ HV *hv, U32 flags)
 {
     bool save;
-    SSize_t orig_ix = PL_tmps_ix; /* silence compiler warning about unitialized vars */
+    SSize_t orig_ix = PL_tmps_ix; /* silence compiler warning about uninitialized vars */
 
     if (!hv)
         return;
@@ -2222,7 +2243,7 @@ Perl_hv_undef_flags(pTHX_ HV *hv, U32 flags)
        if they will be freed anyway. */
     /* note that the code following prior to hv_free_entries is duplicated
      * in sv_clear(), and changes here should be done there too */
-    if (PL_phase != PERL_PHASE_DESTRUCT && HvNAME(hv)) {
+    if (PL_phase != PERL_PHASE_DESTRUCT && HvHasNAME(hv)) {
         if (PL_stashcache) {
             DEBUG_o(Perl_deb(aTHX_ "hv_undef_flags clearing PL_stashcache for '%"
                              HEKf "'\n", HEKfARG(HvNAME_HEK(hv))));
@@ -2243,7 +2264,7 @@ Perl_hv_undef_flags(pTHX_ HV *hv, U32 flags)
        HE* that needs to be explicitly freed. */
     hv_free_entries(hv);
 
-    /* SvOOK() is true for a hash if it has struct xpvhv_aux allocated. That
+    /* HvHasAUX() is true for a hash if it has struct xpvhv_aux allocated. That
        structure has several other pieces of allocated memory - hence those must
        be freed before the structure itself can be freed. Some can be freed when
        a hash is "undefined" (this function), but some must persist until it is
@@ -2256,32 +2277,36 @@ Perl_hv_undef_flags(pTHX_ HV *hv, U32 flags)
        must remain consistent, because this code can no longer clear SVf_OOK,
        meaning that this structure might be read again at any point in the
        future without further checks or reinitialisation. */
-    if (SvOOK(hv)) {
+    if (HvHasAUX(hv)) {
+      struct xpvhv_aux *aux = HvAUX(hv);
       struct mro_meta *meta;
       const char *name;
 
-      if (HvENAME_get(hv)) {
+      if (HvHasENAME(hv)) {
         if (PL_phase != PERL_PHASE_DESTRUCT)
             mro_isa_changed_in(hv);
         if (PL_stashcache) {
             DEBUG_o(Perl_deb(aTHX_ "hv_undef_flags clearing PL_stashcache for effective name '%"
-                             HEKf "'\n", HEKfARG(HvENAME_HEK(hv))));
-            (void)hv_deletehek(PL_stashcache, HvENAME_HEK(hv), G_DISCARD);
+                             HEKf "'\n", HEKfARG(HvENAME_HEK_NN(hv))));
+            (void)hv_deletehek(PL_stashcache, HvENAME_HEK_NN(hv), G_DISCARD);
         }
       }
 
       /* If this call originated from sv_clear, then we must check for
        * effective names that need freeing, as well as the usual name. */
       name = HvNAME(hv);
-      if (flags & HV_NAME_SETALL ? !!HvAUX(hv)->xhv_name_u.xhvnameu_name : !!name) {
+      if (flags & HV_NAME_SETALL
+          ? cBOOL(aux->xhv_name_u.xhvnameu_name)
+          : cBOOL(name))
+      {
         if (name && PL_stashcache) {
             DEBUG_o(Perl_deb(aTHX_ "hv_undef_flags clearing PL_stashcache for name '%"
-                             HEKf "'\n", HEKfARG(HvNAME_HEK(hv))));
-            (void)hv_deletehek(PL_stashcache, HvNAME_HEK(hv), G_DISCARD);
+                             HEKf "'\n", HEKfARG(HvNAME_HEK_NN(hv))));
+            (void)hv_deletehek(PL_stashcache, HvNAME_HEK_NN(hv), G_DISCARD);
         }
         hv_name_set(hv, NULL, 0, flags);
       }
-      if((meta = HvAUX(hv)->xhv_mro_meta)) {
+      if((meta = aux->xhv_mro_meta)) {
         if (meta->mro_linear_all) {
             SvREFCNT_dec_NN(meta->mro_linear_all);
             /* mro_linear_current is just acting as a shortcut pointer,
@@ -2295,7 +2320,20 @@ Perl_hv_undef_flags(pTHX_ HV *hv, U32 flags)
         SvREFCNT_dec(meta->isa);
         SvREFCNT_dec(meta->super);
         Safefree(meta);
-        HvAUX(hv)->xhv_mro_meta = NULL;
+        aux->xhv_mro_meta = NULL;
+      }
+
+      if(HvSTASH_IS_CLASS(hv)) {
+          SvREFCNT_dec(aux->xhv_class_superclass);
+          SvREFCNT_dec(aux->xhv_class_initfields_cv);
+          SvREFCNT_dec(aux->xhv_class_adjust_blocks);
+          if(aux->xhv_class_fields)
+            PadnamelistREFCNT_dec(aux->xhv_class_fields);
+          SvREFCNT_dec(aux->xhv_class_param_map);
+          Safefree(aux->xhv_class_suspended_initfields_compcv);
+          aux->xhv_class_suspended_initfields_compcv = NULL;
+
+          aux->xhv_aux_flags &= ~HvAUXf_IS_CLASS;
       }
     }
 
@@ -2375,7 +2413,7 @@ S_hv_auxinit(pTHX_ HV *hv) {
 
     PERL_ARGS_ASSERT_HV_AUXINIT;
 
-    if (!SvOOK(hv)) {
+    if (!HvHasAUX(hv)) {
         char *array = (char *) HvARRAY(hv);
         if (!array) {
             Newxz(array, PERL_HV_ARRAY_ALLOC_BYTES(HvMAX(hv) + 1), char);
@@ -2423,7 +2461,7 @@ Perl_hv_iterinit(pTHX_ HV *hv)
 {
     PERL_ARGS_ASSERT_HV_ITERINIT;
 
-    if (SvOOK(hv)) {
+    if (HvHasAUX(hv)) {
         struct xpvhv_aux * iter = HvAUX(hv);
         HE * const entry = iter->xhv_eiter; /* HvEITER(hv) */
         if (entry && HvLAZYDEL(hv)) {  /* was deleted earlier? */
@@ -2457,7 +2495,7 @@ Perl_hv_riter_p(pTHX_ HV *hv) {
 
     PERL_ARGS_ASSERT_HV_RITER_P;
 
-    iter = SvOOK(hv) ? HvAUX(hv) : hv_auxinit(hv);
+    iter = HvHasAUX(hv) ? HvAUX(hv) : hv_auxinit(hv);
     return &(iter->xhv_riter);
 }
 
@@ -2475,7 +2513,7 @@ Perl_hv_eiter_p(pTHX_ HV *hv) {
 
     PERL_ARGS_ASSERT_HV_EITER_P;
 
-    iter = SvOOK(hv) ? HvAUX(hv) : hv_auxinit(hv);
+    iter = HvHasAUX(hv) ? HvAUX(hv) : hv_auxinit(hv);
     return &(iter->xhv_eiter);
 }
 
@@ -2493,7 +2531,7 @@ Perl_hv_riter_set(pTHX_ HV *hv, I32 riter) {
 
     PERL_ARGS_ASSERT_HV_RITER_SET;
 
-    if (SvOOK(hv)) {
+    if (HvHasAUX(hv)) {
         iter = HvAUX(hv);
     } else {
         if (riter == -1)
@@ -2511,7 +2549,7 @@ Perl_hv_rand_set(pTHX_ HV *hv, U32 new_xhv_rand) {
     PERL_ARGS_ASSERT_HV_RAND_SET;
 
 #ifdef PERL_HASH_RANDOMIZE_KEYS
-    if (SvOOK(hv)) {
+    if (HvHasAUX(hv)) {
         iter = HvAUX(hv);
     } else {
         iter = hv_auxinit(hv);
@@ -2536,7 +2574,7 @@ Perl_hv_eiter_set(pTHX_ HV *hv, HE *eiter) {
 
     PERL_ARGS_ASSERT_HV_EITER_SET;
 
-    if (SvOOK(hv)) {
+    if (HvHasAUX(hv)) {
         iter = HvAUX(hv);
     } else {
         /* 0 is the default so don't go malloc()ing a new structure just to
@@ -2549,6 +2587,31 @@ Perl_hv_eiter_set(pTHX_ HV *hv, HE *eiter) {
     iter->xhv_eiter = eiter;
 }
 
+/*
+=for apidoc        hv_name_set
+=for apidoc_item ||hv_name_sets|HV *hv|"name"|U32 flags
+
+These each set the name of stash C<hv> to the specified name.
+
+They differ only in how the name is specified.
+
+In C<hv_name_sets>, the name is a literal C string, enclosed in double quotes.
+
+In C<hv_name_set>, C<name> points to the first byte of the name, and an
+additional parameter, C<len>, specifies its length in bytes.  Hence, the name
+may contain embedded-NUL characters.
+
+If C<SVf_UTF8> is set in C<flags>, the name is treated as being in UTF-8;
+otherwise not.
+
+If C<HV_NAME_SETALL> is set in C<flags>, both the name and the effective name
+are set.
+
+=for apidoc Amnh||HV_NAME_SETALL
+
+=cut
+*/
+
 void
 Perl_hv_name_set(pTHX_ HV *hv, const char *name, U32 len, U32 flags)
 {
@@ -2561,7 +2624,7 @@ Perl_hv_name_set(pTHX_ HV *hv, const char *name, U32 len, U32 flags)
     if (len > I32_MAX)
         Perl_croak(aTHX_ "panic: hv name too long (%" UVuf ")", (UV) len);
 
-    if (SvOOK(hv)) {
+    if (HvHasAUX(hv)) {
         iter = HvAUX(hv);
         if (iter->xhv_name_u.xhvnameu_name) {
             if(iter->xhv_name_count) {
@@ -2657,7 +2720,7 @@ table.
 void
 Perl_hv_ename_add(pTHX_ HV *hv, const char *name, U32 len, U32 flags)
 {
-    struct xpvhv_aux *aux = SvOOK(hv) ? HvAUX(hv) : hv_auxinit(hv);
+    struct xpvhv_aux *aux = HvHasAUX(hv) ? HvAUX(hv) : hv_auxinit(hv);
     U32 hash;
 
     PERL_ARGS_ASSERT_HV_ENAME_ADD;
@@ -2727,7 +2790,7 @@ Perl_hv_ename_delete(pTHX_ HV *hv, const char *name, U32 len, U32 flags)
     if (len > I32_MAX)
         Perl_croak(aTHX_ "panic: hv name too long (%" UVuf ")", (UV) len);
 
-    if (!SvOOK(hv)) return;
+    if (!HvHasAUX(hv)) return;
 
     aux = HvAUX(hv);
     if (!aux->xhv_name_u.xhvnameu_name) return;
@@ -2787,7 +2850,7 @@ Perl_hv_backreferences_p(pTHX_ HV *hv) {
     PERL_ARGS_ASSERT_HV_BACKREFERENCES_P;
     /* See also Perl_sv_get_backrefs in sv.c where this logic is unrolled */
     {
-        struct xpvhv_aux * const iter = SvOOK(hv) ? HvAUX(hv) : hv_auxinit(hv);
+        struct xpvhv_aux * const iter = HvHasAUX(hv) ? HvAUX(hv) : hv_auxinit(hv);
         return &(iter->xhv_backreferences);
     }
 }
@@ -2798,7 +2861,7 @@ Perl_hv_kill_backrefs(pTHX_ HV *hv) {
 
     PERL_ARGS_ASSERT_HV_KILL_BACKREFS;
 
-    if (!SvOOK(hv))
+    if (!HvHasAUX(hv))
         return;
 
     av = HvAUX(hv)->xhv_backreferences;
@@ -2853,7 +2916,7 @@ Perl_hv_iternext_flags(pTHX_ HV *hv, I32 flags)
 
     PERL_ARGS_ASSERT_HV_ITERNEXT_FLAGS;
 
-    if (!SvOOK(hv)) {
+    if (!HvHasAUX(hv)) {
         /* Too many things (well, pp_each at least) merrily assume that you can
            call hv_iternext without calling hv_iterinit, so we'll have to deal
            with it.  */
@@ -3068,7 +3131,7 @@ Perl_hv_iterkeysv(pTHX_ HE *entry)
 {
     PERL_ARGS_ASSERT_HV_ITERKEYSV;
 
-    return sv_2mortal(newSVhek(HeKEY_hek(entry)));
+    return newSVhek_mortal(HeKEY_hek(entry));
 }
 
 /*
@@ -3316,7 +3379,7 @@ S_share_hek_flags(pTHX_ const char *str, STRLEN len, U32 hash, int flags)
     if (!entry) {
         /* What used to be head of the list.
            If this is NULL, then we're the first entry for this slot, which
-           means we need to increate fill.  */
+           means we need to increase fill.  */
         struct shared_he *new_entry;
         HEK *hek;
         char *k;
@@ -3521,8 +3584,8 @@ Perl_refcounted_he_chain_2hv(pTHX_ const struct refcounted_he *chain, U32 flags)
                 const STRLEN klen = HeKLEN(entry);
                 const char *const key = HeKEY(entry);
                 if (klen == chain->refcounted_he_keylen
-                    && (!!HeKUTF8(entry)
-                        == !!(chain->refcounted_he_data[0] & HVhek_UTF8))
+                    && (cBOOL(HeKUTF8(entry))
+                        == cBOOL((chain->refcounted_he_data[0] & HVhek_UTF8)))
                     && memEQ(key, REF_HE_KEY(chain), klen))
                     goto next_please;
 #else
@@ -3967,7 +4030,7 @@ Upon return, C<*flags> will be set to either C<SVf_UTF8> or 0.
 Alternatively, use the macro C<L</CopLABEL_len_flags>>;
 or if you don't need to know if the label is UTF-8 or not, the macro
 C<L</CopLABEL_len>>;
-or if you additionally dont need to know the length, C<L</CopLABEL>>.
+or if you additionally don't need to know the length, C<L</CopLABEL>>.
 
 =cut
 */
index 82e9c83..ba9f9e4 100644 (file)
@@ -112,6 +112,9 @@ union _xhvnameu {
     HEK **xhvnameu_names;      /* When xhv_name_count is non-0 */
 };
 
+/* A struct defined by pad.h and used within class.c */
+struct suspended_compcv;
+
 struct xpvhv_aux {
     union _xhvnameu xhv_name_u;        /* name, if a symbol table */
     AV         *xhv_backreferences; /* back references for weak references */
@@ -132,10 +135,25 @@ struct xpvhv_aux {
                                    used to detect each() after insert for warnings */
 #endif
     U32         xhv_aux_flags;      /* assorted extra flags */
+
+    /* The following fields are only valid if we have the flag HvAUXf_IS_CLASS */
+    HV          *xhv_class_superclass;         /* STASH of the :isa() base class */
+    CV          *xhv_class_initfields_cv;      /* CV for running initfields */
+    AV          *xhv_class_adjust_blocks;      /* CVs containing the ADJUST blocks */
+    PADNAMELIST *xhv_class_fields;             /* PADNAMEs with PadnameIsFIELD() */
+    PADOFFSET    xhv_class_next_fieldix;
+    HV          *xhv_class_param_map;          /* Maps param names to field index stored in UV */
+
+    struct suspended_compcv
+                *xhv_class_suspended_initfields_compcv;
 };
 
 #define HvAUXf_SCAN_STASH   0x1   /* stash is being scanned by gv_check */
 #define HvAUXf_NO_DEREF     0x2   /* @{}, %{} etc (and nomethod) not present */
+#define HvAUXf_IS_CLASS     0x4   /* the package is a 'class' */
+
+#define HvSTASH_IS_CLASS(hv) \
+    (HvHasAUX(hv) && HvAUX(hv)->xhv_aux_flags & HvAUXf_IS_CLASS)
 
 /* hash structure: */
 /* This structure must match the beginning of struct xpvmg in sv.h. */
@@ -280,19 +298,33 @@ hash.
 =cut
 
 */
+
 #define HvFILL(hv)     Perl_hv_fill(aTHX_ MUTABLE_HV(hv))
 #define HvMAX(hv)      ((XPVHV*)  SvANY(hv))->xhv_max
+
+/*
+
+=for apidoc Am|bool|HvHasAUX|HV *const hv
+
+Returns true if the HV has a C<struct xpvhv_aux> extension. Use this to check
+whether it is valid to call C<HvAUX()>.
+
+=cut
+
+*/
+#define HvHasAUX(hv)   (SvFLAGS(hv) & SVphv_HasAUX)
+
 /* This quite intentionally does no flag checking first. That's your
-   responsibility.  */
+   responsibility. Use HvHasAUX() first */
 #define HvAUX(hv)       (&(((struct xpvhv_with_aux*)  SvANY(hv))->xhv_aux))
 #define HvRITER(hv)    (*Perl_hv_riter_p(aTHX_ MUTABLE_HV(hv)))
 #define HvEITER(hv)    (*Perl_hv_eiter_p(aTHX_ MUTABLE_HV(hv)))
 #define HvRITER_set(hv,r)      Perl_hv_riter_set(aTHX_ MUTABLE_HV(hv), r)
 #define HvEITER_set(hv,e)      Perl_hv_eiter_set(aTHX_ MUTABLE_HV(hv), e)
-#define HvRITER_get(hv)        (SvOOK(hv) ? HvAUX(hv)->xhv_riter : -1)
-#define HvEITER_get(hv)        (SvOOK(hv) ? HvAUX(hv)->xhv_eiter : NULL)
-#define HvRAND_get(hv) (SvOOK(hv) ? HvAUX(hv)->xhv_rand : 0)
-#define HvLASTRAND_get(hv)     (SvOOK(hv) ? HvAUX(hv)->xhv_last_rand : 0)
+#define HvRITER_get(hv)        (HvHasAUX(hv) ? HvAUX(hv)->xhv_riter : -1)
+#define HvEITER_get(hv)        (HvHasAUX(hv) ? HvAUX(hv)->xhv_eiter : NULL)
+#define HvRAND_get(hv) (HvHasAUX(hv) ? HvAUX(hv)->xhv_rand : 0)
+#define HvLASTRAND_get(hv)     (HvHasAUX(hv) ? HvAUX(hv)->xhv_last_rand : 0)
 
 #define HvNAME(hv)     HvNAME_get(hv)
 #define HvNAMELEN(hv)   HvNAMELEN_get(hv)
@@ -313,15 +345,16 @@ hash.
  )
 /* This macro may go away without notice.  */
 #define HvNAME_HEK(hv) \
-        (SvOOK(hv) && HvAUX(hv)->xhv_name_u.xhvnameu_name ? HvNAME_HEK_NN(hv) : NULL)
+        (HvHasAUX(hv) && HvAUX(hv)->xhv_name_u.xhvnameu_name ? HvNAME_HEK_NN(hv) : NULL)
+#define HvHasNAME(hv) \
+        (HvHasAUX(hv) && HvAUX(hv)->xhv_name_u.xhvnameu_name && HvNAME_HEK_NN(hv))
 #define HvNAME_get(hv) \
-        ((SvOOK(hv) && HvAUX(hv)->xhv_name_u.xhvnameu_name && HvNAME_HEK_NN(hv)) \
-                         ? HEK_KEY(HvNAME_HEK_NN(hv)) : NULL)
+        (HvHasNAME(hv) ? HEK_KEY(HvNAME_HEK_NN(hv)) : NULL)
 #define HvNAMELEN_get(hv) \
-        ((SvOOK(hv) && HvAUX(hv)->xhv_name_u.xhvnameu_name && HvNAME_HEK_NN(hv)) \
+        ((HvHasAUX(hv) && HvAUX(hv)->xhv_name_u.xhvnameu_name && HvNAME_HEK_NN(hv)) \
                                  ? HEK_LEN(HvNAME_HEK_NN(hv)) : 0)
 #define HvNAMEUTF8(hv) \
-        ((SvOOK(hv) && HvAUX(hv)->xhv_name_u.xhvnameu_name && HvNAME_HEK_NN(hv)) \
+        ((HvHasAUX(hv) && HvAUX(hv)->xhv_name_u.xhvnameu_name && HvNAME_HEK_NN(hv)) \
                                  ? HEK_UTF8(HvNAME_HEK_NN(hv)) : 0)
 #define HvENAME_HEK_NN(hv)                                             \
  (                                                                      \
@@ -330,17 +363,18 @@ hash.
   HvAUX(hv)->xhv_name_count == -1 ? NULL                              : \
                                     HvAUX(hv)->xhv_name_u.xhvnameu_name \
  )
+#define HvHasENAME_HEK(hv) \
+        (HvHasAUX(hv) && HvAUX(hv)->xhv_name_u.xhvnameu_name)
 #define HvENAME_HEK(hv) \
-        (SvOOK(hv) && HvAUX(hv)->xhv_name_u.xhvnameu_name ? HvENAME_HEK_NN(hv) : NULL)
+        (HvHasENAME_HEK(hv) ? HvENAME_HEK_NN(hv) : NULL)
+#define HvHasENAME(hv) \
+        (HvHasENAME_HEK(hv) && HvAUX(hv)->xhv_name_count != -1)
 #define HvENAME_get(hv) \
-   ((SvOOK(hv) && HvAUX(hv)->xhv_name_u.xhvnameu_name && HvAUX(hv)->xhv_name_count != -1) \
-                         ? HEK_KEY(HvENAME_HEK_NN(hv)) : NULL)
+        (HvHasENAME(hv) ? HEK_KEY(HvENAME_HEK_NN(hv)) : NULL)
 #define HvENAMELEN_get(hv) \
-   ((SvOOK(hv) && HvAUX(hv)->xhv_name_u.xhvnameu_name && HvAUX(hv)->xhv_name_count != -1) \
-                                 ? HEK_LEN(HvENAME_HEK_NN(hv)) : 0)
+        (HvHasENAME(hv) ? HEK_LEN(HvENAME_HEK_NN(hv)) : 0)
 #define HvENAMEUTF8(hv) \
-   ((SvOOK(hv) && HvAUX(hv)->xhv_name_u.xhvnameu_name && HvAUX(hv)->xhv_name_count != -1) \
-                                 ? HEK_UTF8(HvENAME_HEK_NN(hv)) : 0)
+        (HvHasENAME(hv) ? HEK_UTF8(HvENAME_HEK_NN(hv)) : 0)
 
 /*
  * HvKEYS gets the number of keys that actually exist(), and is provided
index 340d94a..a4e70d5 100644 (file)
 #endif
 
 #ifndef PERL_HASH_USE_SBOX32_ALSO
-#define PERL_HASH_USE_SBOX32_ALSO 1
+#  if defined(PERL_HASH_USE_SBOX32) || !defined(PERL_HASH_NO_SBOX32)
+#    define PERL_HASH_USE_SBOX32_ALSO 1
+#  else
+#    define PERL_HASH_USE_SBOX32_ALSO 0
+#  endif
+#endif
+
+#undef PERL_HASH_USE_SBOX32
+#undef PERL_HASH_NO_SBOX32
+#if PERL_HASH_USE_SBOX32_ALSO != 0
+#  define PERL_HASH_USE_SBOX32
+#else
+#  define PERL_HASH_NO_SBOX32
 #endif
 
 #ifndef SBOX32_MAX_LEN
 #include "sbox32_hash.h"
 
 #if defined(PERL_HASH_FUNC_SIPHASH)
-# define __PERL_HASH_FUNC "SIPHASH_2_4"
-# define __PERL_HASH_WORD_TYPE U64
-# define __PERL_HASH_WORD_SIZE sizeof(__PERL_HASH_WORD_TYPE)
-# define __PERL_HASH_SEED_BYTES (__PERL_HASH_WORD_SIZE * 2)
-# define __PERL_HASH_STATE_BYTES (__PERL_HASH_WORD_SIZE * 4)
-# define __PERL_HASH_SEED_STATE(seed,state) S_perl_siphash_seed_state(seed,state)
-# define __PERL_HASH_WITH_STATE(state,str,len) S_perl_hash_siphash_2_4_with_state((state),(U8*)(str),(len))
+# define PERL_HASH_FUNC_DEFINE "PERL_HASH_FUNC_SIPHASH"
+# define PVT__PERL_HASH_FUNC "SIPHASH_2_4"
+# define PVT__PERL_HASH_WORD_TYPE U64
+# define PVT__PERL_HASH_WORD_SIZE sizeof(PVT__PERL_HASH_WORD_TYPE)
+# define PVT__PERL_HASH_SEED_BYTES (PVT__PERL_HASH_WORD_SIZE * 2)
+# define PVT__PERL_HASH_STATE_BYTES (PVT__PERL_HASH_WORD_SIZE * 4)
+# define PVT__PERL_HASH_SEED_STATE(seed,state) S_perl_siphash_seed_state(seed,state)
+# define PVT__PERL_HASH_WITH_STATE(state,str,len) S_perl_hash_siphash_2_4_with_state((state),(U8*)(str),(len))
 #elif defined(PERL_HASH_FUNC_SIPHASH13)
-# define __PERL_HASH_FUNC "SIPHASH_1_3"
-# define __PERL_HASH_WORD_TYPE U64
-# define __PERL_HASH_WORD_SIZE sizeof(__PERL_HASH_WORD_TYPE)
-# define __PERL_HASH_SEED_BYTES (__PERL_HASH_WORD_SIZE * 2)
-# define __PERL_HASH_STATE_BYTES (__PERL_HASH_WORD_SIZE * 4)
-# define __PERL_HASH_SEED_STATE(seed,state) S_perl_siphash_seed_state(seed,state)
-# define __PERL_HASH_WITH_STATE(state,str,len) S_perl_hash_siphash_1_3_with_state((state),(U8*)(str),(len))
+# define PERL_HASH_FUNC_DEFINE "PERL_HASH_FUNC_SIPHASH13"
+# define PVT__PERL_HASH_FUNC "SIPHASH_1_3"
+# define PVT__PERL_HASH_WORD_TYPE U64
+# define PVT__PERL_HASH_WORD_SIZE sizeof(PVT__PERL_HASH_WORD_TYPE)
+# define PVT__PERL_HASH_SEED_BYTES (PVT__PERL_HASH_WORD_SIZE * 2)
+# define PVT__PERL_HASH_STATE_BYTES (PVT__PERL_HASH_WORD_SIZE * 4)
+# define PVT__PERL_HASH_SEED_STATE(seed,state) S_perl_siphash_seed_state(seed,state)
+# define PVT__PERL_HASH_WITH_STATE(state,str,len) S_perl_hash_siphash_1_3_with_state((state),(const U8*)(str),(len))
 #elif defined(PERL_HASH_FUNC_ZAPHOD32)
-# define __PERL_HASH_FUNC "ZAPHOD32"
-# define __PERL_HASH_WORD_TYPE U32
-# define __PERL_HASH_WORD_SIZE sizeof(__PERL_HASH_WORD_TYPE)
-# define __PERL_HASH_SEED_BYTES (__PERL_HASH_WORD_SIZE * 3)
-# define __PERL_HASH_STATE_BYTES (__PERL_HASH_WORD_SIZE * 3)
-# define __PERL_HASH_SEED_STATE(seed,state) zaphod32_seed_state(seed,state)
-# define __PERL_HASH_WITH_STATE(state,str,len) (U32)zaphod32_hash_with_state((state),(U8*)(str),(len))
+# define PERL_HASH_FUNC_DEFINE "PERL_HASH_FUNC_ZAPHOD32"
+# define PVT__PERL_HASH_FUNC "ZAPHOD32"
+# define PVT__PERL_HASH_WORD_TYPE U32
+# define PVT__PERL_HASH_WORD_SIZE sizeof(PVT__PERL_HASH_WORD_TYPE)
+# define PVT__PERL_HASH_SEED_BYTES (PVT__PERL_HASH_WORD_SIZE * 3)
+# define PVT__PERL_HASH_STATE_BYTES (PVT__PERL_HASH_WORD_SIZE * 3)
+# define PVT__PERL_HASH_SEED_STATE(seed,state) zaphod32_seed_state(seed,state)
+# define PVT__PERL_HASH_WITH_STATE(state,str,len) (U32)zaphod32_hash_with_state((state),(U8*)(str),(len))
 # include "zaphod32_hash.h"
 #endif
 
-#ifndef __PERL_HASH_WITH_STATE
+#ifndef PVT__PERL_HASH_WITH_STATE
 #error "No hash function defined!"
 #endif
-#ifndef __PERL_HASH_SEED_BYTES
-#error "__PERL_HASH_SEED_BYTES not defined"
+#ifndef PVT__PERL_HASH_SEED_BYTES
+#error "PVT__PERL_HASH_SEED_BYTES not defined"
 #endif
-#ifndef __PERL_HASH_FUNC
-#error "__PERL_HASH_FUNC not defined"
+#ifndef PVT__PERL_HASH_FUNC
+#error "PVT__PERL_HASH_FUNC not defined"
 #endif
 
 /* Some siphash static functions are needed by XS::APItest even when
 */
 #include "perl_siphash.h"
 
-#define __PERL_HASH_SEED_roundup(x, y)   ( ( ( (x) + ( (y) - 1 ) ) / (y) ) * (y) )
-#define _PERL_HASH_SEED_roundup(x) __PERL_HASH_SEED_roundup(x,__PERL_HASH_WORD_SIZE)
+#define PVT__PERL_HASH_SEED_roundup(x, y)   ( ( ( (x) + ( (y) - 1 ) ) / (y) ) * (y) )
+#define PVT_PERL_HASH_SEED_roundup(x) PVT__PERL_HASH_SEED_roundup(x,PVT__PERL_HASH_WORD_SIZE)
 
 #define PL_hash_seed ((U8 *)PL_hash_seed_w)
 #define PL_hash_state ((U8 *)PL_hash_state_w)
 
-#if PERL_HASH_USE_SBOX32_ALSO != 1
-# define _PERL_HASH_FUNC                        __PERL_HASH_FUNC
-# define _PERL_HASH_SEED_BYTES                  __PERL_HASH_SEED_BYTES
-# define _PERL_HASH_STATE_BYTES                 __PERL_HASH_STATE_BYTES
-# define _PERL_HASH_SEED_STATE(seed,state)      __PERL_HASH_SEED_STATE(seed,state)
-# define _PERL_HASH_WITH_STATE(state,str,len)   __PERL_HASH_WITH_STATE(state,str,len)
+#if PERL_HASH_USE_SBOX32_ALSO == 0
+# define PVT_PERL_HASH_FUNC                        PVT__PERL_HASH_FUNC
+# define PVT_PERL_HASH_SEED_BYTES                  PVT__PERL_HASH_SEED_BYTES
+# define PVT_PERL_HASH_STATE_BYTES                 PVT__PERL_HASH_STATE_BYTES
+# define PVT_PERL_HASH_SEED_STATE(seed,state)      PVT__PERL_HASH_SEED_STATE(seed,state)
+# define PVT_PERL_HASH_WITH_STATE(state,str,len)   PVT__PERL_HASH_WITH_STATE(state,str,len)
 #else
 
-#define _PERL_HASH_FUNC         "SBOX32_WITH_" __PERL_HASH_FUNC
+#define PVT_PERL_HASH_FUNC         "SBOX32_WITH_" PVT__PERL_HASH_FUNC
 /* note the 4 in the below code comes from the fact the seed to initialize the SBOX is 128 bits */
-#define _PERL_HASH_SEED_BYTES   ( __PERL_HASH_SEED_BYTES + (int)( 4 * sizeof(U32)) )
+#define PVT_PERL_HASH_SEED_BYTES   ( PVT__PERL_HASH_SEED_BYTES + (int)( 4 * sizeof(U32)) )
 
-#define _PERL_HASH_STATE_BYTES  \
-    ( __PERL_HASH_STATE_BYTES + ( ( 1 + ( 256 * SBOX32_MAX_LEN ) ) * sizeof(U32) ) )
+#define PVT_PERL_HASH_STATE_BYTES  \
+    ( PVT__PERL_HASH_STATE_BYTES + ( ( 1 + ( 256 * SBOX32_MAX_LEN ) ) * sizeof(U32) ) )
 
-#define _PERL_HASH_SEED_STATE(seed,state) STMT_START {                                      \
-    __PERL_HASH_SEED_STATE(seed,state);                                                     \
-    sbox32_seed_state128(seed + __PERL_HASH_SEED_BYTES, state + __PERL_HASH_STATE_BYTES);    \
+#define PVT_PERL_HASH_SEED_STATE(seed,state) STMT_START {                                      \
+    PVT__PERL_HASH_SEED_STATE(seed,state);                                                     \
+    sbox32_seed_state128(seed + PVT__PERL_HASH_SEED_BYTES, state + PVT__PERL_HASH_STATE_BYTES);    \
 } STMT_END
 
-#define _PERL_HASH_WITH_STATE(state,str,len)                                            \
+#define PVT_PERL_HASH_WITH_STATE(state,str,len)                                            \
     (LIKELY(len <= SBOX32_MAX_LEN)                                                      \
-        ? sbox32_hash_with_state((state + __PERL_HASH_STATE_BYTES),(U8*)(str),(len))    \
-        : __PERL_HASH_WITH_STATE((state),(str),(len)))
+        ? sbox32_hash_with_state((state + PVT__PERL_HASH_STATE_BYTES),(const U8*)(str),(len))    \
+        : PVT__PERL_HASH_WITH_STATE((state),(str),(len)))
 
 #endif
 
 #define PERL_HASH_WITH_SEED(seed,hash,str,len) \
     (hash) = S_perl_hash_with_seed((const U8 *) seed, (const U8 *) str,len)
 #define PERL_HASH_WITH_STATE(state,hash,str,len) \
-    (hash) = _PERL_HASH_WITH_STATE((state),(U8*)(str),(len))
+    (hash) = PVT_PERL_HASH_WITH_STATE((state),(const U8*)(str),(len))
 
-#define PERL_HASH_SEED_STATE(seed,state) _PERL_HASH_SEED_STATE(seed,state)
-#define PERL_HASH_SEED_BYTES _PERL_HASH_SEED_roundup(_PERL_HASH_SEED_BYTES)
-#define PERL_HASH_STATE_BYTES _PERL_HASH_SEED_roundup(_PERL_HASH_STATE_BYTES)
-#define PERL_HASH_FUNC        _PERL_HASH_FUNC
+#define PERL_HASH_SEED_STATE(seed,state) PVT_PERL_HASH_SEED_STATE(seed,state)
+#define PERL_HASH_SEED_BYTES PVT_PERL_HASH_SEED_roundup(PVT_PERL_HASH_SEED_BYTES)
+#define PERL_HASH_STATE_BYTES PVT_PERL_HASH_SEED_roundup(PVT_PERL_HASH_STATE_BYTES)
+#define PERL_HASH_FUNC        PVT_PERL_HASH_FUNC
 
-#define PERL_HASH_SEED_WORDS (PERL_HASH_SEED_BYTES/__PERL_HASH_WORD_SIZE)
-#define PERL_HASH_STATE_WORDS (PERL_HASH_STATE_BYTES/__PERL_HASH_WORD_SIZE)
+#define PERL_HASH_SEED_WORDS (PERL_HASH_SEED_BYTES/PVT__PERL_HASH_WORD_SIZE)
+#define PERL_HASH_STATE_WORDS (PERL_HASH_STATE_BYTES/PVT__PERL_HASH_WORD_SIZE)
 
 #ifdef PERL_USE_SINGLE_CHAR_HASH_CACHE
 #define PERL_HASH(state,str,len) \
     (hash) = ((len) < 2 ? ( (len) == 0 ? PL_hash_chars[256] : PL_hash_chars[(U8)(str)[0]] ) \
-                       : _PERL_HASH_WITH_STATE(PL_hash_state,(U8*)(str),(len)))
+                       : PVT_PERL_HASH_WITH_STATE(PL_hash_state,(U8*)(str),(len)))
 #else
 #define PERL_HASH(hash,str,len) \
     PERL_HASH_WITH_STATE(PL_hash_state,hash,(U8*)(str),(len))
 
 PERL_STATIC_INLINE U32
 S_perl_hash_with_seed(const U8 * seed, const U8 *str, STRLEN len) {
-    __PERL_HASH_WORD_TYPE state[PERL_HASH_STATE_WORDS];
-    _PERL_HASH_SEED_STATE(seed,(U8*)state);
-    return _PERL_HASH_WITH_STATE((U8*)state,str,len);
+    PVT__PERL_HASH_WORD_TYPE state[PERL_HASH_STATE_WORDS];
+    PVT_PERL_HASH_SEED_STATE(seed,(U8*)state);
+    return PVT_PERL_HASH_WITH_STATE((U8*)state,str,len);
 }
 
 #endif /*compile once*/
index 436f8eb..9093018 100644 (file)
@@ -34,6 +34,10 @@ SOFTWARE.
  * header files, because they depend on proto.h (included after most other
  * headers) or struct definitions.
  *
+ * Note also perlstatic.h for functions that can't or shouldn't be inlined, but
+ * whose details should be exposed to the compiler, for such things as tail
+ * call optimization.
+ *
  * Each section names the header file that the functions "belong" to.
  */
 
@@ -140,6 +144,78 @@ Perl_av_fetch_simple(pTHX_ AV *av, SSize_t key, I32 lval)
     }
 }
 
+/*
+=for apidoc av_push_simple
+
+This is a cut-down version of av_push that assumes that the array is very
+straightforward - no magic, not readonly, and AvREAL - and that C<key> is
+not less than -1. This function MUST NOT be used in situations where any
+of those assumptions may not hold.
+
+Pushes an SV (transferring control of one reference count) onto the end of the
+array.  The array will grow automatically to accommodate the addition.
+
+Perl equivalent: C<push @myarray, $val;>.
+
+=cut
+*/
+
+PERL_STATIC_INLINE void
+Perl_av_push_simple(pTHX_ AV *av, SV *val)
+{
+    PERL_ARGS_ASSERT_AV_PUSH_SIMPLE;
+    assert(SvTYPE(av) == SVt_PVAV);
+    assert(!SvMAGICAL(av));
+    assert(!SvREADONLY(av));
+    assert(AvREAL(av));
+    assert(AvFILLp(av) > -2);
+
+    (void)av_store_simple(av,AvFILLp(av)+1,val);
+}
+
+/*
+=for apidoc av_new_alloc
+
+This implements L<perlapi/C<newAV_alloc_x>>
+and L<perlapi/C<newAV_alloc_xz>>, which are the public API for this
+functionality.
+
+Creates a new AV and allocates its SV* array.
+
+This is similar to, but more efficient than doing:
+
+    AV *av = newAV();
+    av_extend(av, key);
+
+The size parameter is used to pre-allocate a SV* array large enough to
+hold at least elements C<0..(size-1)>.  C<size> must be at least 1.
+
+The C<zeroflag> parameter controls whether or not the array is NULL
+initialized.
+
+=cut
+*/
+
+PERL_STATIC_INLINE AV *
+Perl_av_new_alloc(pTHX_ SSize_t size, bool zeroflag)
+{
+    AV * const av = newAV();
+    SV** ary;
+    PERL_ARGS_ASSERT_AV_NEW_ALLOC;
+    assert(size > 0);
+
+    Newx(ary, size, SV*); /* Newx performs the memwrap check */
+    AvALLOC(av) = ary;
+    AvARRAY(av) = ary;
+    AvMAX(av) = size - 1;
+
+    if (zeroflag)
+        Zero(ary, size, SV*);
+
+    return av;
+}
+
+
 /* ------------------------------- cv.h ------------------------------- */
 
 /*
@@ -205,6 +281,25 @@ S_strip_spaces(pTHX_ const char * orig, STRLEN * const len)
 }
 #endif
 
+/* ------------------------------- iperlsys.h ------------------------------- */
+#if ! defined(PERL_IMPLICIT_SYS) && defined(USE_ITHREADS)
+
+/* Otherwise this function is implemented as macros in iperlsys.h */
+
+PERL_STATIC_INLINE bool
+S_PerlEnv_putenv(pTHX_ char * str)
+{
+    PERL_ARGS_ASSERT_PERLENV_PUTENV;
+
+    ENV_LOCK;
+    bool retval = putenv(str);
+    ENV_UNLOCK;
+
+    return retval;
+}
+
+#endif
+
 /* ------------------------------- mg.h ------------------------------- */
 
 #if defined(PERL_CORE) || defined(PERL_EXT)
@@ -314,171 +409,6 @@ Perl_ReANY(const REGEXP * const re)
                                    : (struct regexp *)p;
 }
 
-/* ------------------------------- sv.h ------------------------------- */
-
-PERL_STATIC_INLINE bool
-Perl_SvTRUE(pTHX_ SV *sv)
-{
-    PERL_ARGS_ASSERT_SVTRUE;
-
-    if (UNLIKELY(sv == NULL))
-        return FALSE;
-    SvGETMAGIC(sv);
-    return SvTRUE_nomg_NN(sv);
-}
-
-PERL_STATIC_INLINE bool
-Perl_SvTRUE_nomg(pTHX_ SV *sv)
-{
-    PERL_ARGS_ASSERT_SVTRUE_NOMG;
-
-    if (UNLIKELY(sv == NULL))
-        return FALSE;
-    return SvTRUE_nomg_NN(sv);
-}
-
-PERL_STATIC_INLINE bool
-Perl_SvTRUE_NN(pTHX_ SV *sv)
-{
-    PERL_ARGS_ASSERT_SVTRUE_NN;
-
-    SvGETMAGIC(sv);
-    return SvTRUE_nomg_NN(sv);
-}
-
-PERL_STATIC_INLINE bool
-Perl_SvTRUE_common(pTHX_ SV * sv, const bool sv_2bool_is_fallback)
-{
-    PERL_ARGS_ASSERT_SVTRUE_COMMON;
-
-    if (UNLIKELY(SvIMMORTAL_INTERP(sv)))
-        return SvIMMORTAL_TRUE(sv);
-
-    if (! SvOK(sv))
-        return FALSE;
-
-    if (SvPOK(sv))
-        return SvPVXtrue(sv);
-
-    if (SvIOK(sv))
-        return SvIVX(sv) != 0; /* casts to bool */
-
-    if (SvROK(sv) && !(SvOBJECT(SvRV(sv)) && HvAMAGIC(SvSTASH(SvRV(sv)))))
-        return TRUE;
-
-    if (sv_2bool_is_fallback)
-        return sv_2bool_nomg(sv);
-
-    return isGV_with_GP(sv);
-}
-
-
-PERL_STATIC_INLINE SV *
-Perl_SvREFCNT_inc(SV *sv)
-{
-    if (LIKELY(sv != NULL))
-        SvREFCNT(sv)++;
-    return sv;
-}
-PERL_STATIC_INLINE SV *
-Perl_SvREFCNT_inc_NN(SV *sv)
-{
-    PERL_ARGS_ASSERT_SVREFCNT_INC_NN;
-
-    SvREFCNT(sv)++;
-    return sv;
-}
-PERL_STATIC_INLINE void
-Perl_SvREFCNT_inc_void(SV *sv)
-{
-    if (LIKELY(sv != NULL))
-        SvREFCNT(sv)++;
-}
-PERL_STATIC_INLINE void
-Perl_SvREFCNT_dec(pTHX_ SV *sv)
-{
-    if (LIKELY(sv != NULL)) {
-        U32 rc = SvREFCNT(sv);
-        if (LIKELY(rc > 1))
-            SvREFCNT(sv) = rc - 1;
-        else
-            Perl_sv_free2(aTHX_ sv, rc);
-    }
-}
-
-PERL_STATIC_INLINE void
-Perl_SvREFCNT_dec_NN(pTHX_ SV *sv)
-{
-    U32 rc = SvREFCNT(sv);
-
-    PERL_ARGS_ASSERT_SVREFCNT_DEC_NN;
-
-    if (LIKELY(rc > 1))
-        SvREFCNT(sv) = rc - 1;
-    else
-        Perl_sv_free2(aTHX_ sv, rc);
-}
-
-/*
-=for apidoc SvAMAGIC_on
-
-Indicate that C<sv> has overloading (active magic) enabled.
-
-=cut
-*/
-
-PERL_STATIC_INLINE void
-Perl_SvAMAGIC_on(SV *sv)
-{
-    PERL_ARGS_ASSERT_SVAMAGIC_ON;
-    assert(SvROK(sv));
-
-    if (SvOBJECT(SvRV(sv))) HvAMAGIC_on(SvSTASH(SvRV(sv)));
-}
-
-/*
-=for apidoc SvAMAGIC_off
-
-Indicate that C<sv> has overloading (active magic) disabled.
-
-=cut
-*/
-
-PERL_STATIC_INLINE void
-Perl_SvAMAGIC_off(SV *sv)
-{
-    PERL_ARGS_ASSERT_SVAMAGIC_OFF;
-
-    if (SvROK(sv) && SvOBJECT(SvRV(sv)))
-        HvAMAGIC_off(SvSTASH(SvRV(sv)));
-}
-
-PERL_STATIC_INLINE U32
-Perl_SvPADSTALE_on(SV *sv)
-{
-    assert(!(SvFLAGS(sv) & SVs_PADTMP));
-    return SvFLAGS(sv) |= SVs_PADSTALE;
-}
-PERL_STATIC_INLINE U32
-Perl_SvPADSTALE_off(SV *sv)
-{
-    assert(!(SvFLAGS(sv) & SVs_PADTMP));
-    return SvFLAGS(sv) &= ~SVs_PADSTALE;
-}
-#if defined(PERL_CORE) || defined (PERL_EXT)
-PERL_STATIC_INLINE STRLEN
-S_sv_or_pv_pos_u2b(pTHX_ SV *sv, const char *pv, STRLEN pos, STRLEN *lenp)
-{
-    PERL_ARGS_ASSERT_SV_OR_PV_POS_U2B;
-    if (SvGAMAGIC(sv)) {
-        U8 *hopped = utf8_hop((U8 *)pv, pos);
-        if (lenp) *lenp = (STRLEN)(utf8_hop(hopped, *lenp) - hopped);
-        return (STRLEN)(hopped - (U8 *)pv);
-    }
-    return sv_pos_u2b_flags(sv,pos,lenp,SV_CONST_RETURN);
-}
-#endif
-
 /* ------------------------------- utf8.h ------------------------------- */
 
 /*
@@ -657,7 +587,7 @@ Perl_is_utf8_invariant_string_loc(const U8* const s, STRLEN len, const U8 ** ep)
         /* Here, we know we have at least one full word to process.  Process
          * per-word as long as we have at least a full word left */
         do {
-            if ((* (PERL_UINTMAX_T *) x) & PERL_VARIANTS_WORD_MASK)  {
+            if ((* (const PERL_UINTMAX_T *) x) & PERL_VARIANTS_WORD_MASK)  {
 
                 /* Found a variant.  Just return if caller doesn't want its
                  * exact position */
@@ -668,7 +598,7 @@ Perl_is_utf8_invariant_string_loc(const U8* const s, STRLEN len, const U8 ** ep)
 #  if   BYTEORDER == 0x1234 || BYTEORDER == 0x12345678    \
      || BYTEORDER == 0x4321 || BYTEORDER == 0x87654321
 
-                *ep = x + variant_byte_number(* (PERL_UINTMAX_T *) x);
+                *ep = x + variant_byte_number(* (const PERL_UINTMAX_T *) x);
                 assert(*ep >= s && *ep < send);
 
                 return FALSE;
@@ -1200,7 +1130,8 @@ S_variant_under_utf8_count(const U8* const s, const U8* const e)
 
 #endif
 
-#ifndef PERL_IN_REGEXEC_C   /* Keep  these around for that file */
+   /* Keep  these around for these files */
+#if ! defined(PERL_IN_REGEXEC_C) && ! defined(PERL_IN_UTF8_C)
 #  undef PERL_WORDSIZE
 #  undef PERL_COUNT_MULTIPLIER
 #  undef PERL_WORD_BOUNDARY_MASK
@@ -1542,7 +1473,7 @@ Perl_is_utf8_string_loclen(const U8 *s, STRLEN len, const U8 **ep, STRLEN *el)
  * This uses adaptations of the table and algorithm given in
  * https://bjoern.hoehrmann.de/utf-8/decoder/dfa/, which provides comprehensive
  * documentation of the original version.  A copyright notice for the original
- * version is given at the beginning of this file.  The Perl adapations are
+ * version is given at the beginning of this file.  The Perl adaptations are
  * documented at the definition of PL_extended_utf8_dfa_tab[].
  *
  * This dfa is fast.  There are three exit conditions:
@@ -1599,9 +1530,10 @@ Perl_is_utf8_string_loclen(const U8 *s, STRLEN len, const U8 **ep, STRLEN *el)
                               incomplete_char_action)                       \
     STMT_START {                                                            \
         const U8 * s = s0;                                                  \
+        const U8 * e_ = e;                                                  \
         UV state = 0;                                                       \
                                                                             \
-        PERL_NON_CORE_CHECK_EMPTY(s,e);                                     \
+        PERL_NON_CORE_CHECK_EMPTY(s, e_);                                   \
                                                                             \
         do {                                                                \
             state = dfa_tab[256 + state + dfa_tab[*s]];                     \
@@ -1614,7 +1546,7 @@ Perl_is_utf8_string_loclen(const U8 *s, STRLEN len, const U8 **ep, STRLEN *el)
             if (UNLIKELY(state == 1)) { /* Rejecting state */               \
                 reject_action;                                              \
             }                                                               \
-        } while (s < e);                                                    \
+        } while (s < e_);                                                   \
                                                                             \
         /* Here, dropped out of loop before end-of-char */                  \
         incomplete_char_action;                                             \
@@ -1654,7 +1586,7 @@ machines) is a valid UTF-8 character.
 This uses an adaptation of the table and algorithm given in
 https://bjoern.hoehrmann.de/utf-8/decoder/dfa/, which provides comprehensive
 documentation of the original version.  A copyright notice for the original
-version is given at the beginning of this file.  The Perl adapation is
+version is given at the beginning of this file.  The Perl adaptation is
 documented at the definition of PL_extended_utf8_dfa_tab[].
 */
 
@@ -1723,7 +1655,7 @@ C<L</is_strict_utf8_string_loclen>> to check entire strings.
 This uses an adaptation of the tables and algorithm given in
 https://bjoern.hoehrmann.de/utf-8/decoder/dfa/, which provides comprehensive
 documentation of the original version.  A copyright notice for the original
-version is given at the beginning of this file.  The Perl adapation is
+version is given at the beginning of this file.  The Perl adaptation is
 documented at the definition of strict_extended_utf8_dfa_tab[].
 
 */
@@ -1778,7 +1710,7 @@ C<L</is_c9strict_utf8_string_loclen>> to check entire strings.
 This uses an adaptation of the tables and algorithm given in
 https://bjoern.hoehrmann.de/utf-8/decoder/dfa/, which provides comprehensive
 documentation of the original version.  A copyright notice for the original
-version is given at the beginning of this file.  The Perl adapation is
+version is given at the beginning of this file.  The Perl adaptation is
 documented at the definition of PL_c9_utf8_dfa_tab[].
 
 */
@@ -2072,11 +2004,16 @@ Perl_utf8_distance(pTHX_ const U8 *a, const U8 *b)
 =for apidoc utf8_hop
 
 Return the UTF-8 pointer C<s> displaced by C<off> characters, either
-forward or backward.
+forward (if C<off> is positive) or backward (if negative).  C<s> does not need
+to be pointing to the starting byte of a character.  If it isn't, one count of
+C<off> will be used up to get to the start of the next character for forward
+hops, and to the start of the current character for negative ones.
 
-WARNING: do not use the following unless you *know* C<off> is within
-the UTF-8 data pointed to by C<s> *and* that on entry C<s> is aligned
-on the first byte of character or just after the last byte of a character.
+WARNING: Prefer L</utf8_hop_safe> to this one.
+
+Do NOT use this function unless you B<know> C<off> is within
+the UTF-8 data pointed to by C<s> B<and> that on entry C<s> is aligned
+on the first byte of a character or just after the last byte of a character.
 
 =cut
 */
@@ -2087,10 +2024,20 @@ Perl_utf8_hop(const U8 *s, SSize_t off)
     PERL_ARGS_ASSERT_UTF8_HOP;
 
     /* Note: cannot use UTF8_IS_...() too eagerly here since e.g
-     * the bitops (especially ~) can create illegal UTF-8.
+     * the XXX bitops (especially ~) can create illegal UTF-8.
      * In other words: in Perl UTF-8 is not just for Unicode. */
 
-    if (off >= 0) {
+    if (off > 0) {
+
+        /* Get to next non-continuation byte */
+        if (UNLIKELY(UTF8_IS_CONTINUATION(*s))) {
+            do {
+                s++;
+            }
+            while (UTF8_IS_CONTINUATION(*s));
+            off--;
+        }
+
         while (off--)
             s += UTF8SKIP(s);
     }
@@ -2101,6 +2048,7 @@ Perl_utf8_hop(const U8 *s, SSize_t off)
                 s--;
         }
     }
+
     GCC_DIAG_IGNORE(-Wcast-qual)
     return (U8 *)s;
     GCC_DIAG_RESTORE
@@ -2110,7 +2058,9 @@ Perl_utf8_hop(const U8 *s, SSize_t off)
 =for apidoc utf8_hop_forward
 
 Return the UTF-8 pointer C<s> displaced by up to C<off> characters,
-forward.
+forward.  C<s> does not need to be pointing to the starting byte of a
+character.  If it isn't, one count of C<off> will be used up to get to the
+start of the next character.
 
 C<off> must be non-negative.
 
@@ -2135,6 +2085,15 @@ Perl_utf8_hop_forward(const U8 *s, SSize_t off, const U8 *end)
     assert(s <= end);
     assert(off >= 0);
 
+    if (off && UNLIKELY(UTF8_IS_CONTINUATION(*s))) {
+        /* Get to next non-continuation byte */
+        do {
+            s++;
+        }
+        while (UTF8_IS_CONTINUATION(*s));
+        off--;
+    }
+
     while (off--) {
         STRLEN skip = UTF8SKIP(s);
         if ((STRLEN)(end - s) <= skip) {
@@ -2154,7 +2113,9 @@ Perl_utf8_hop_forward(const U8 *s, SSize_t off, const U8 *end)
 =for apidoc utf8_hop_back
 
 Return the UTF-8 pointer C<s> displaced by up to C<off> characters,
-backward.
+backward.  C<s> does not need to be pointing to the starting byte of a
+character.  If it isn't, one count of C<off> will be used up to get to that
+start.
 
 C<off> must be non-positive.
 
@@ -2179,6 +2140,13 @@ Perl_utf8_hop_back(const U8 *s, SSize_t off, const U8 *start)
     assert(start <= s);
     assert(off <= 0);
 
+    /* Note: if we know that the input is well-formed, we can do per-word
+     * hop-back.  Commit d6ad3b72778369a84a215b498d8d60d5b03aa1af implemented
+     * that.  But it was reverted because doing per-word has some
+     * start-up/tear-down overhead, so only makes sense if the distance to be
+     * moved is large, and core perl doesn't currently move more than a few
+     * characters at a time.  You can reinstate it if it does become
+     * advantageous. */
     while (off++ && s > start) {
         do {
             s--;
@@ -2194,7 +2162,10 @@ Perl_utf8_hop_back(const U8 *s, SSize_t off, const U8 *start)
 =for apidoc utf8_hop_safe
 
 Return the UTF-8 pointer C<s> displaced by up to C<off> characters,
-either forward or backward.
+either forward or backward.  C<s> does not need to be pointing to the starting
+byte of a character.  If it isn't, one count of C<off> will be used up to get
+to the start of the next character for forward hops, and to the start of the
+current character for negative ones.
 
 When moving backward it will not move before C<start>.
 
@@ -2460,11 +2431,11 @@ Perl_is_utf8_fixed_width_buf_loclen_flags(const U8 * const s,
 
 PERL_STATIC_INLINE UV
 Perl_utf8n_to_uvchr_msgs(const U8 *s,
-                      STRLEN curlen,
-                      STRLEN *retlen,
-                      const U32 flags,
-                      U32 * errors,
-                      AV ** msgs)
+                         STRLEN curlen,
+                         STRLEN *retlen,
+                         const U32 flags,
+                         U32 * errors,
+                         AV ** msgs)
 {
     /* This is the inlined portion of utf8n_to_uvchr_msgs.  It handles the
      * simple cases, and, if necessary calls a helper function to deal with the
@@ -2476,7 +2447,7 @@ Perl_utf8n_to_uvchr_msgs(const U8 *s,
      * https://bjoern.hoehrmann.de/utf-8/decoder/dfa/, which provides
      * comprehensive documentation of the original version.  A copyright notice
      * for the original version is given at the beginning of this file.  The
-     * Perl adapation is documented at the definition of PL_strict_utf8_dfa_tab[].
+     * Perl adaptation is documented at the definition of PL_strict_utf8_dfa_tab[].
      */
 
     const U8 * const s0 = s;
@@ -2687,7 +2658,7 @@ S_lossless_NV_to_IV(const NV nv, IV *ivp)
 
 /* ------------------ pp.c, regcomp.c, toke.c, universal.c ------------ */
 
-#if defined(PERL_IN_PP_C) || defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_TOKE_C) || defined(PERL_IN_UNIVERSAL_C)
+#if defined(PERL_IN_PP_C) || defined(PERL_IN_REGCOMP_ANY) || defined(PERL_IN_TOKE_C) || defined(PERL_IN_UNIVERSAL_C)
 
 #define MAX_CHARSET_NAME_LENGTH 2
 
@@ -3086,6 +3057,8 @@ Perl_cx_poploop(pTHX_ PERL_CONTEXT *cx)
         cx->blk_loop.itersave = NULL;
         SvREFCNT_dec(cursv);
     }
+    if (cx->cx_type & (CXp_FOR_GV|CXp_FOR_LVREF))
+        SvREFCNT_dec(cx->blk_loop.itervar_u.svp);
 }
 
 
@@ -3134,6 +3107,36 @@ Perl_cx_popgiven(pTHX_ PERL_CONTEXT *cx)
     SvREFCNT_dec(sv);
 }
 
+/*
+=for apidoc newPADxVOP
+
+Constructs, checks and returns an op containing a pad offset.  C<type> is
+the opcode, which should be one of C<OP_PADSV>, C<OP_PADAV>, C<OP_PADHV>
+or C<OP_PADCV>.  The returned op will have the C<op_targ> field set by
+the C<padix> argument.
+
+This is convenient when constructing a large optree in nested function
+calls, as it avoids needing to store the pad op directly to set the
+C<op_targ> field as a side-effect. For example
+
+    o = op_append_elem(OP_LINESEQ, o,
+        newPADxVOP(OP_PADSV, 0, padix));
+
+=cut
+*/
+
+PERL_STATIC_INLINE OP *
+Perl_newPADxVOP(pTHX_ I32 type, I32 flags, PADOFFSET padix)
+{
+    PERL_ARGS_ASSERT_NEWPADXVOP;
+
+    assert(type == OP_PADSV || type == OP_PADAV || type == OP_PADHV
+            || type == OP_PADCV);
+    OP *o = newOP(type, flags);
+    o->op_targ = padix;
+    return o;
+}
+
 /* ------------------ util.h ------------------------------------------- */
 
 /*
@@ -3151,7 +3154,7 @@ range bytes match only themselves.
 */
 
 PERL_STATIC_INLINE I32
-Perl_foldEQ(const char *s1, const char *s2, I32 len)
+Perl_foldEQ(pTHX_ const char *s1, const char *s2, I32 len)
 {
     const U8 *a = (const U8 *)s1;
     const U8 *b = (const U8 *)s2;
@@ -3169,7 +3172,7 @@ Perl_foldEQ(const char *s1, const char *s2, I32 len)
 }
 
 PERL_STATIC_INLINE I32
-Perl_foldEQ_latin1(const char *s1, const char *s2, I32 len)
+Perl_foldEQ_latin1(pTHX_ const char *s1, const char *s2, I32 len)
 {
     /* Compare non-UTF-8 using Unicode (Latin1) semantics.  Works on all folds
      * representable without UTF-8, except for LATIN_SMALL_LETTER_SHARP_S, and
@@ -3203,7 +3206,7 @@ same case-insensitively in the current locale; false otherwise.
 */
 
 PERL_STATIC_INLINE I32
-Perl_foldEQ_locale(const char *s1, const char *s2, I32 len)
+Perl_foldEQ_locale(pTHX_ const char *s1, const char *s2, I32 len)
 {
     const U8 *a = (const U8 *)s1;
     const U8 *b = (const U8 *)s2;
@@ -3213,8 +3216,14 @@ Perl_foldEQ_locale(const char *s1, const char *s2, I32 len)
     assert(len >= 0);
 
     while (len--) {
-        if (*a != *b && *a != PL_fold_locale[*b])
+        if (*a != *b && *a != PL_fold_locale[*b]) {
+            DEBUG_Lv(PerlIO_printf(Perl_debug_log,
+                     "%s:%d: Our records indicate %02x is not a fold of %02x"
+                     " or its mate %02x\n",
+                     __FILE__, __LINE__, *a, *b, PL_fold_locale[*b]));
+
             return 0;
+        }
         a++,b++;
     }
     return 1;
@@ -3341,7 +3350,7 @@ Perl_mortal_getenv(const char * str)
      * the recursive calls and calls from the logger, and treat them specially.
      * Let's say we want to do getenv("foo").  We first find
      * getenv(PERL_MEM_LOG) and save it to a fixed-length per-interpreter
-     * variable, so no temporary is required.  Then we do getenv(foo}, and in
+     * variable, so no temporary is required.  Then we do getenv(foo), and in
      * the process of creating a temporary to save it, this function will be
      * called recursively to do a getenv(PERL_MEM_LOG).  On the recursed call,
      * we detect that it is such a call and return our saved value instead of
@@ -3421,7 +3430,7 @@ Perl_mortal_getenv(const char * str)
             }
         }
 
-        /* Then each of the three significant characters */
+        /* Then each of the four significant characters */
         if (strchr(ret, 'm')) {
             *mem_log_meat++ = 'm';
         }
@@ -3431,6 +3440,9 @@ Perl_mortal_getenv(const char * str)
         if (strchr(ret, 't')) {
             *mem_log_meat++ = 't';
         }
+        if (strchr(ret, 'c')) {
+            *mem_log_meat++ = 'c';
+        }
         *mem_log_meat = '\0';
 
         assert(mem_log_meat < PL_mem_log + sizeof(PL_mem_log));
@@ -3475,8 +3487,7 @@ Perl_mortal_getenv(const char * str)
 PERL_STATIC_INLINE bool
 Perl_sv_isbool(pTHX_ const SV *sv)
 {
-    return SvIOK(sv) && SvPOK(sv) && SvIsCOW_static(sv) &&
-        (SvPVX_const(sv) == PL_Yes || SvPVX_const(sv) == PL_No);
+    return SvBoolFlagsOK(sv) && BOOL_INTERNALS_sv_isbool(sv);
 }
 
 #ifdef USE_ITHREADS
@@ -3501,6 +3512,254 @@ Perl_cop_file_avn(pTHX_ const COP *cop) {
 
 #endif
 
+PERL_STATIC_INLINE PADNAME *
+Perl_padname_refcnt_inc(PADNAME *pn)
+{
+    PadnameREFCNT(pn)++;
+    return pn;
+}
+
+PERL_STATIC_INLINE PADNAMELIST *
+Perl_padnamelist_refcnt_inc(PADNAMELIST *pnl)
+{
+    PadnamelistREFCNT(pnl)++;
+    return pnl;
+}
+
+/* copy a string to a safe spot */
+
+/*
+=for apidoc_section $string
+=for apidoc savepv
+
+Perl's version of C<strdup()>.  Returns a pointer to a newly allocated
+string which is a duplicate of C<pv>.  The size of the string is
+determined by C<strlen()>, which means it may not contain embedded C<NUL>
+characters and must have a trailing C<NUL>.  To prevent memory leaks, the
+memory allocated for the new string needs to be freed when no longer needed.
+This can be done with the C<L</Safefree>> function, or
+L<C<SAVEFREEPV>|perlguts/SAVEFREEPV(p)>.
+
+On some platforms, Windows for example, all allocated memory owned by a thread
+is deallocated when that thread ends.  So if you need that not to happen, you
+need to use the shared memory functions, such as C<L</savesharedpv>>.
+
+=cut
+*/
+
+PERL_STATIC_INLINE char *
+Perl_savepv(pTHX_ const char *pv)
+{
+    PERL_UNUSED_CONTEXT;
+    if (!pv)
+        return NULL;
+    else {
+        char *newaddr;
+        const STRLEN pvlen = strlen(pv)+1;
+        Newx(newaddr, pvlen, char);
+        return (char*)memcpy(newaddr, pv, pvlen);
+    }
+}
+
+/* same thing but with a known length */
+
+/*
+=for apidoc savepvn
+
+Perl's version of what C<strndup()> would be if it existed.  Returns a
+pointer to a newly allocated string which is a duplicate of the first
+C<len> bytes from C<pv>, plus a trailing
+C<NUL> byte.  The memory allocated for
+the new string can be freed with the C<Safefree()> function.
+
+On some platforms, Windows for example, all allocated memory owned by a thread
+is deallocated when that thread ends.  So if you need that not to happen, you
+need to use the shared memory functions, such as C<L</savesharedpvn>>.
+
+=cut
+*/
+
+PERL_STATIC_INLINE char *
+Perl_savepvn(pTHX_ const char *pv, Size_t len)
+{
+    char *newaddr;
+    PERL_UNUSED_CONTEXT;
+
+    Newx(newaddr,len+1,char);
+    /* Give a meaning to NULL pointer mainly for the use in sv_magic() */
+    if (pv) {
+        /* might not be null terminated */
+        newaddr[len] = '\0';
+        return (char *) CopyD(pv,newaddr,len,char);
+    }
+    else {
+        return (char *) ZeroD(newaddr,len+1,char);
+    }
+}
+
+/*
+=for apidoc savesvpv
+
+A version of C<savepv()>/C<savepvn()> which gets the string to duplicate from
+the passed in SV using C<SvPV()>
+
+On some platforms, Windows for example, all allocated memory owned by a thread
+is deallocated when that thread ends.  So if you need that not to happen, you
+need to use the shared memory functions, such as C<L</savesharedsvpv>>.
+
+=cut
+*/
+
+PERL_STATIC_INLINE char *
+Perl_savesvpv(pTHX_ SV *sv)
+{
+    STRLEN len;
+    const char * const pv = SvPV_const(sv, len);
+    char *newaddr;
+
+    PERL_ARGS_ASSERT_SAVESVPV;
+
+    ++len;
+    Newx(newaddr,len,char);
+    return (char *) CopyD(pv,newaddr,len,char);
+}
+
+/*
+=for apidoc savesharedsvpv
+
+A version of C<savesharedpv()> which allocates the duplicate string in
+memory which is shared between threads.
+
+=cut
+*/
+
+PERL_STATIC_INLINE char *
+Perl_savesharedsvpv(pTHX_ SV *sv)
+{
+    STRLEN len;
+    const char * const pv = SvPV_const(sv, len);
+
+    PERL_ARGS_ASSERT_SAVESHAREDSVPV;
+
+    return savesharedpvn(pv, len);
+}
+
+#ifndef PERL_GET_CONTEXT_DEFINED
+
+/*
+=for apidoc_section $embedding
+=for apidoc get_context
+
+Implements L<perlapi/C<PERL_GET_CONTEXT>>, which you should use instead.
+
+=cut
+*/
+
+PERL_STATIC_INLINE void *
+Perl_get_context(void)
+{
+#  if defined(USE_ITHREADS)
+#    ifdef OLD_PTHREADS_API
+    pthread_addr_t t;
+    int error = pthread_getspecific(PL_thr_key, &t);
+    if (error)
+        Perl_croak_nocontext("panic: pthread_getspecific, error=%d", error);
+    return (void*)t;
+#    elif defined(I_MACH_CTHREADS)
+    return (void*)cthread_data(cthread_self());
+#    else
+    return (void*)PTHREAD_GETSPECIFIC(PL_thr_key);
+#    endif
+#  else
+    return (void*)NULL;
+#  endif
+}
+
+#endif
+
+PERL_STATIC_INLINE MGVTBL*
+Perl_get_vtbl(pTHX_ int vtbl_id)
+{
+    PERL_UNUSED_CONTEXT;
+
+    return (vtbl_id < 0 || vtbl_id >= magic_vtable_max)
+        ? NULL : (MGVTBL*)PL_magic_vtables + vtbl_id;
+}
+
+/*
+=for apidoc my_strlcat
+
+The C library C<strlcat> if available, or a Perl implementation of it.
+This operates on C C<NUL>-terminated strings.
+
+C<my_strlcat()> appends string C<src> to the end of C<dst>.  It will append at
+most S<C<size - strlen(dst) - 1>> characters.  It will then C<NUL>-terminate,
+unless C<size> is 0 or the original C<dst> string was longer than C<size> (in
+practice this should not happen as it means that either C<size> is incorrect or
+that C<dst> is not a proper C<NUL>-terminated string).
+
+Note that C<size> is the full size of the destination buffer and
+the result is guaranteed to be C<NUL>-terminated if there is room.  Note that
+room for the C<NUL> should be included in C<size>.
+
+The return value is the total length that C<dst> would have if C<size> is
+sufficiently large.  Thus it is the initial length of C<dst> plus the length of
+C<src>.  If C<size> is smaller than the return, the excess was not appended.
+
+=cut
+
+Description stolen from http://man.openbsd.org/strlcat.3
+*/
+#ifndef HAS_STRLCAT
+PERL_STATIC_INLINE Size_t
+Perl_my_strlcat(char *dst, const char *src, Size_t size)
+{
+    Size_t used, length, copy;
+
+    used = strlen(dst);
+    length = strlen(src);
+    if (size > 0 && used < size - 1) {
+        copy = (length >= size - used) ? size - used - 1 : length;
+        memcpy(dst + used, src, copy);
+        dst[used + copy] = '\0';
+    }
+    return used + length;
+}
+#endif
+
+
+/*
+=for apidoc my_strlcpy
+
+The C library C<strlcpy> if available, or a Perl implementation of it.
+This operates on C C<NUL>-terminated strings.
+
+C<my_strlcpy()> copies up to S<C<size - 1>> characters from the string C<src>
+to C<dst>, C<NUL>-terminating the result if C<size> is not 0.
+
+The return value is the total length C<src> would be if the copy completely
+succeeded.  If it is larger than C<size>, the excess was not copied.
+
+=cut
+
+Description stolen from http://man.openbsd.org/strlcpy.3
+*/
+#ifndef HAS_STRLCPY
+PERL_STATIC_INLINE Size_t
+Perl_my_strlcpy(char *dst, const char *src, Size_t size)
+{
+    Size_t length, copy;
+
+    length = strlen(src);
+    if (size > 0) {
+        copy = (length >= size) ? size - 1 : length;
+        memcpy(dst, src, copy);
+        dst[copy] = '\0';
+    }
+    return length;
+}
+#endif
+
 /*
  * ex: set ts=8 sts=4 sw=4 et:
  */
index b5e00e2..1c4d7de 100644 (file)
@@ -6,7 +6,7 @@
 use strict;
 use vars qw($Is_VMS $Is_W32 $Is_OS2 $Is_Cygwin $Is_Darwin $Is_AmigaOS
            %opts $packlist);
-use subs qw(unlink link chmod chown);
+use subs qw(unlink link chmod);
 require File::Path;
 require File::Copy;
 
@@ -98,9 +98,6 @@ sub link {
                unless -f $to and (chmod(0666, $to), unlink $to)
                        and File::Copy::copy($from, $to) and ++$success;
        }
-       if (defined($opts{uid}) || defined($opts{gid})) {
-           chown($opts{uid}, $opts{gid}, $to) if $success;
-       }
        $packlist->{$xto} = { type => 'file' };
     }
     $success;
@@ -115,16 +112,6 @@ sub chmod {
       unless $opts{notify};
 }
 
-sub chown {
-    my($uid,$gid,$name) = @_;
-
-    return if ($^O eq 'dos');
-    printf "  chown %s:%s %s\n", $uid, $gid, $name if $opts{verbose};
-    CORE::chown($uid,$gid,$name)
-       || warn sprintf("Couldn't chown %s:%s %s: $!\n", $uid, $gid, $name)
-      unless $opts{notify};
-}
-
 sub samepath {
     my($p1, $p2) = @_;
 
@@ -156,8 +143,7 @@ sub safe_rename {
 }
 
 sub mkpath {
-    File::Path::make_path(shift, {owner=>$opts{uid}, group=>$opts{gid},
-        mode=>0777, verbose=>$opts{verbose}}) unless $opts{notify};
+    File::Path::mkpath(shift , $opts{verbose}, 0777) unless $opts{notify};
 }
 
 sub unixtoamiga
index 0e5f66b..3c8af53 100644 (file)
@@ -72,7 +72,7 @@ $opts{destdir} = '';
     my $usage = 0;
     if (!GetOptions(\%opts, 'notify|n', 'strip|s', 'silent|S',
                     'skip-otherperls|o', 'force|f', 'verbose|V', 'archname|A',
-                    'nopods|p', 'destdir:s', 'help|h|?', 'user|u:s', 'group|g:s',
+                    'nopods|p', 'destdir:s', 'help|h|?',
                     'versiononly|v' => \$versiononly, '<>' => sub {
                         if ($_[0] eq '+v') {
                             $versiononly = 0;
@@ -102,16 +102,12 @@ Usage $0: [switches]
   -A        Also install perl with the architecture's name in the perl binary's
             name.
   -p        Don't install the pod files. [This will break use diagnostics;]
-  -g group  install files with the specified group
-  -u user   install files with the specified user 
   -destdir  Prefix installation directories by this string.
   -h        Display this help message.
 EOT
         exit $usage;
     }
 }
-$opts{'uid'} = getpwnam($opts{'user'}) if exists($opts{'user'});
-$opts{'gid'} = getgrnam($opts{'group'}) if exists($opts{'group'});
 
 $versiononly = 1 if $Config{versiononly} && !defined $versiononly;
 my (@scripts, @tolink);
@@ -146,7 +142,7 @@ if ((-e "testcompile") && (defined($ENV{'COMPILE'}))) {
 }
 
 # Exclude nonxs extensions that are not architecture dependent
-my @nonxs = grep(!/^(Errno|IO\/Compress)$/, split(' ', $Config{'nonxs_ext'}));
+my @nonxs = grep(!/^Errno$/, split(' ', $Config{'nonxs_ext'}));
 
 my @ext_dirs = qw(cpan dist ext);
 foreach my $ext_dir (@ext_dirs) {
@@ -192,7 +188,7 @@ my $installprivlib = "$opts{destdir}$Config{installprivlib}";
 my $installarchlib = "$opts{destdir}$Config{installarchlib}";
 my $installsitelib = "$opts{destdir}$Config{installsitelib}";
 my $installsitearch = "$opts{destdir}$Config{installsitearch}";
-my $installman1dir = "none";
+my $installman1dir = "$opts{destdir}$Config{installman1dir}";
 my $man1ext = $Config{man1ext};
 my $libperl = $Config{libperl};
 # Shared library and dynamic loading suffixes.
@@ -224,6 +220,8 @@ if ($Is_VMS) {  # Hang in there until File::Spec hits the big time
    $installbin         || die "No installbin directory in config.sh\n";
 -d $installbin         || mkpath($installbin);
 -d $installbin         || $opts{notify} || die "$installbin is not a directory\n";
+-w $installbin         || $opts{notify} || die "$installbin is not writable by you\n"
+       unless $installbin =~ m#^/afs/# || $opts{notify};
 
 if (!$Is_VMS) {
 -x 'perl' . $exe_ext   || die "perl isn't executable!\n";
@@ -235,9 +233,9 @@ else {
     }
 }
 
-#-f 't/rantests'               || $Is_W32
-#                      || warn "WARNING: You've never run 'make test' or",
-#                              " some tests failed! (Installing anyway.)\n";
+-f 't/rantests'                || $Is_W32
+                       || warn "WARNING: You've never run 'make test' or",
+                               " some tests failed! (Installing anyway.)\n";
 
 # This will be used to store the packlist
 $packlist = ExtUtils::Packlist->new("$installarchlib/.packlist");
@@ -262,10 +260,6 @@ if ($Is_W32 or $Is_Cygwin) {
     $packlist->{"$Config{installbin}/$perldll"} = { type => 'file' };
 } # if ($Is_W32 or $Is_Cygwin)
 
-# Get the install command and flags from the environment
-my @installcmd = $ENV{"INSTALL"} || "install";
-push(@installcmd, $ENV{"INSTALL_COPY"} || "-c");
-
 # First we install the version-numbered executables.
 
 if ($Is_VMS) {
@@ -285,8 +279,11 @@ if ($Is_VMS) {
     }
 }
 else {
-    my $ver = ''; # don't install a versioned perl binary
-    install("perl$exe_ext", "$installbin/$perl_verbase$ver$exe_ext", "0755");
+    safe_unlink("$installbin/$perl_verbase$ver$exe_ext");
+    copy("perl$exe_ext", "$installbin/$perl_verbase$ver$exe_ext");
+    strip("$installbin/$perl_verbase$ver$exe_ext");
+    fix_dep_names("$installbin/$perl_verbase$ver$exe_ext");
+    chmod(0755, "$installbin/$perl_verbase$ver$exe_ext");
     `chtag -r "$installbin/$perl_verbase$ver$exe_ext"` if ($^O eq 'os390');
 }
 
@@ -342,9 +339,7 @@ elsif ($Is_Cygwin) { # On Cygwin symlink it to CORE to make Makefile happy
     @corefiles = <*.h>;
 } else {
     # [als] hard-coded 'libperl' name... not good!
-    #@corefiles = <*.h libperl*.* perl*$Config{lib_ext}>;
-    @corefiles = <*.h *.inc perl*$Config{lib_ext}>;
-    install($libperl, "$opts{destdir}$Config{glibpth}/$libperl", "0444");
+    @corefiles = <*.h libperl*.* perl*$Config{lib_ext}>;
 
     # AIX needs perl.exp installed as well.
     push(@corefiles,'perl.exp') if $^O eq 'aix';
@@ -374,8 +369,7 @@ if ($Is_W32) { #linking lib isn't made in root but in CORE on Win32
 # Install main perl executables
 # Make links to ordinary names if installbin directory isn't current directory.
 
-if (0) { # don't install a versioned perl binary
-#if (! $versiononly && ! samepath($installbin, '.') && ! $Is_VMS) {
+if (! $versiononly && ! samepath($installbin, '.') && ! $Is_VMS) {
     safe_unlink("$installbin/$perl$exe_ext", "$installbin/suid$perl$exe_ext");
     if ($^O eq 'vos') {
        # VOS doesn't support hard links, so use a symlink.
@@ -514,9 +508,6 @@ if (!$opts{nopods} && (!$versiononly || ($installprivlib =~ m/\Q$vershort/))) {
 
 
 $packlist->write() unless $opts{notify};
-if (defined($opts{uid}) || defined($opts{gid})) {
-    chown($opts{uid}, $opts{gid}, $packlist->packlist_file());
-}
 print "  Installation complete\n" if $opts{verbose};
 
 exit 0;
@@ -555,7 +546,6 @@ sub safe_unlink {
 
 sub copy {
     my($from,$to) = @_;
-    my($success) = 0;
 
     my $xto = $to;
     $xto =~ s/^\Q$opts{destdir}\E//;
@@ -563,32 +553,12 @@ sub copy {
        unless $opts{silent};
     print "  creating new version of $xto\n"
        if $Is_VMS and -e $to and !$opts{silent};
-    unless ($opts{notify} or File::Copy::copy($from, $to) and ++$success) {
+    unless ($opts{notify} or File::Copy::copy($from, $to)) {
        # Might have been that F::C::c can't overwrite the target
        warn "Couldn't copy $from to $to: $!\n"
            unless -f $to and (chmod(0666, $to), unlink $to)
-                  and File::Copy::copy($from, $to) and ++$success;
+                  and File::Copy::copy($from, $to);
     }
-    if (defined($opts{uid}) || defined($opts{gid})) {
-       chown($opts{uid}, $opts{gid}, $to) if $success;
-    }
-    $packlist->{$xto} = { type => 'file' };
-}
-
-sub install {
-    my($from,$to,$mode) = @_;
-
-    my $xto = $to;
-    my $cmd = join(' ', @installcmd);
-    $cmd .= " -m $mode" if $mode;
-    $cmd .= " -s" if $opts{strip};
-    $cmd .= " -o $opts{uid}" if defined($opts{uid});
-    $cmd .= " -g $opts{gid}" if defined($opts{gid});
-    $cmd .= " $from $to";
-    $xto =~ s/^\Q$opts{destdir}\E// if $opts{destdir};
-    print $opts{verbose} ? "  install $from $xto\n" : "  $xto\n" unless $opts{silent};
-    system($cmd);
-    warn "Couldn't $cmd\n" if $?;
     $packlist->{$xto} = { type => 'file' };
 }
 
@@ -620,10 +590,6 @@ sub installlib {
        return;
     }
 
-    # If we have different install version, install that instead
-    return if -e "$_.install";
-    $name =~ s/\.install$//;
-
     # ignore patch backups, RCS files, emacs backup & temp files and the
     # .exists files, .PL files, and test files.
     return if $name =~ m{\.orig$|\.rej$|~$|^#.+#$|,v$|^\.exists|\.PL$|\.plc$|\.t$|^test\.pl$|^dbm_filter_util\.pl$|^filter-util\.pl$|^uupacktool\.pl$|^\.gitignore$} ||
index 94ddbf6..f08de2f 100644 (file)
@@ -58,7 +58,10 @@ PERLVARI(I, sub_generation, U32, 1)  /* incr to invalidate method cache */
 
 #ifdef PERL_HASH_RANDOMIZE_KEYS
 #ifdef USE_PERL_PERTURB_KEYS
-PERLVARI(I, hash_rand_bits_enabled, U8, 1) /* used to randomize hash stuff 0 == no-random, 1 == random, 2 == determinsitic */
+PERLVARI(I, hash_rand_bits_enabled, U8, 1) /* used to randomize hash stuff
+                                              0. no-random
+                                              1. random
+                                              2. deterministic */
 #endif
 PERLVARI(I, hash_rand_bits, UV, 0)      /* used to randomize hash stuff */
 #endif
@@ -83,7 +86,7 @@ PERLVARI(I, tainted,  bool, FALSE)    /* using variables controlled by $< */
  * control returns to pp_push or whatever, it sees if any of those flags
  * have been set, and if so finally calls mg_set().
  *
- * NB: PL_delaymagic is automatically saved and restored by JUMPENV_PUSH
+ * NB: PL_delaymagic is automatically saved and restored by JMPENV_PUSH
  * / POP. This removes the need to do ENTER/SAVEI16(PL_delaymagic)/LEAVE
  * in hot code like pp_push.
  */
@@ -127,7 +130,8 @@ thread's copy.
 =cut
 */
 
-PERLVAR(I, localizing, U8)             /* are we processing a local() list? */
+PERLVAR(I, localizing,  U8)             /* are we processing a local() list?
+                                           0 = no, 1 = localizing, 2 = delocalizing */
 PERLVAR(I, in_eval,    U8)             /* trap "fatal" errors? */
 PERLVAR(I, defgv,      GV *)           /* the *_ glob */
 
@@ -232,6 +236,10 @@ fallback by macros on platforms where L<perlapi/PERL_USE_GCC_BRACE_GROUPS>> is
 unavailable, and which would otherwise evaluate their SV parameter more than
 once.
 
+B<BUT BEWARE>, if this is used in a situation where something that is using it
+is in a call stack with something else that is using it, this variable would
+get zapped, leading to hard-to-diagnose errors.
+
 =cut
 */
 PERLVAR(I, Sv,         SV *)
@@ -252,6 +260,10 @@ It is is typically used with C<SvPV> when one is actually planning to discard
 the returned length, (hence the length is "Not Applicable", which is how this
 variable got its name).
 
+B<BUT BEWARE>, if this is used in a situation where something that is using it
+is in a call stack with something else that is using it, this variable would
+get zapped, leading to hard-to-diagnose errors.
+
 It is usually more efficient to either declare a local variable and use that
 instead, or to use the C<SvPV_nolen> macro.
 
@@ -376,16 +388,15 @@ thread's copy.
 PERLVAR(I, exit_flags, U8)             /* was exit() unexpected, etc. */
 
 PERLVAR(I, utf8locale, bool)           /* utf8 locale detected */
-PERLVAR(I, in_utf8_CTYPE_locale, bool)
-PERLVAR(I, in_utf8_COLLATE_locale, bool)
-PERLVAR(I, in_utf8_turkic_locale, bool)
-#if defined(USE_ITHREADS) && ! defined(USE_THREAD_SAFE_LOCALE)
-PERLVARI(I, lc_numeric_mutex_depth, int, 0)   /* Emulate general semaphore */
+
+#if defined(USE_LOCALE) && defined(USE_LOCALE_THREADS)
+PERLVARI(I, locale_mutex_depth, int, 0)     /* Emulate general semaphore */
 #endif
-PERLVARA(I, locale_utf8ness, 256, char)
 
 #ifdef USE_LOCALE_CTYPE
-    PERLVAR(I, warn_locale, SV *)
+PERLVAR(I, warn_locale, SV *)
+PERLVAR(I, in_utf8_CTYPE_locale, bool)
+PERLVAR(I, in_utf8_turkic_locale, bool)
 #endif
 
 PERLVARA(I, colors,6,  char *)         /* values from PERL_RE_COLORS env var */
@@ -485,11 +496,14 @@ PERLVAR(I, origfilename, char *)
 PERLVARI(I, xsubfilename, const char *, NULL)
 PERLVAR(I, diehook,    SV *)
 PERLVAR(I, warnhook,   SV *)
+/* keyword hooks*/
+PERLVARI(I, hook__require__before, SV *,NULL)
+PERLVARI(I, hook__require__after, SV *,NULL)
 
 /* switches */
 PERLVAR(I, patchlevel, SV *)
 PERLVAR(I, localpatches, const char * const *)
-PERLVARI(I, splitstr,  const char *, " ")
+PERLVARI(I, splitstr,  char *, NULL)
 
 PERLVAR(I, minus_c,    bool)
 PERLVAR(I, minus_n,    bool)
@@ -700,7 +714,6 @@ PERLVARI(I, cop_seqmax,     U32,    PERL_COP_SEQMAX) /* statement sequence number */
 
 PERLVARI(I, evalseq,   U32,    0)      /* eval sequence number */
 PERLVAR(I, origalen,   U32)
-PERLVAR(I, origenviron,        char **)
 #ifdef PERL_USES_PL_PIDSTATUS
 PERLVAR(I, pidstatus,  HV *)           /* pid-to-status mappings for waitpid */
 #endif
@@ -732,20 +745,33 @@ PERLVAR(I, constpadix,    PADOFFSET)      /* lowest unused for constants */
 
 PERLVAR(I, padix_floor,        PADOFFSET)      /* how low may inner block reset padix */
 
-#if defined(USE_POSIX_2008_LOCALE)          \
- && defined(USE_THREAD_SAFE_LOCALE)         \
- && ! defined(HAS_QUERYLOCALE)
+#if defined(USE_POSIX_2008_LOCALE) && defined(MULTIPLICITY)
+PERLVARI(I, cur_locale_obj, locale_t, NULL)
+#endif
+#ifdef USE_PL_CURLOCALES
 
 /* This is the most number of categories we've encountered so far on any
- * platform */
-PERLVARA(I, curlocales, 12, char *)
+ * platform, doesn't include LC_ALL */
+PERLVARA(I, curlocales, 12, const char *)
+
+#endif
+#ifdef USE_PL_CUR_LC_ALL
+
+PERLVARI(I, cur_LC_ALL, const char *, NULL)
 
 #endif
 #ifdef USE_LOCALE_COLLATE
 
+/* The emory needed to store the collxfrm transformation of a string with
+ * length 'x' is predicted by the linear equation mx+b; m=mult, b=base */
+PERLVARI(I, collxfrm_mult,Size_t, 0)   /* Expansion factor in *xfrm();
+                                           0 => unknown or bad, depending on
+                                           base */
+PERLVAR(I, collxfrm_base, Size_t)      /* Basic overhead in *xfrm();
+                                           mult == 0, base == 0 => need to compute
+                                           mult == 0, base != 0 => ill-formed;
+                                         */
 PERLVAR(I, collation_name, char *)     /* Name of current collation */
-PERLVAR(I, collxfrm_base, Size_t)      /* Basic overhead in *xfrm() */
-PERLVARI(I, collxfrm_mult,Size_t, 2)   /* Expansion factor in *xfrm() */
 PERLVARI(I, collation_ix, U32, 0)      /* Collation generation index */
 PERLVARI(I, strxfrm_NUL_replacement, U8, 0)  /* Code point to replace NULs */
 PERLVARI(I, strxfrm_is_behaved, bool, TRUE)
@@ -753,12 +779,15 @@ PERLVARI(I, strxfrm_is_behaved, bool, TRUE)
 PERLVARI(I, strxfrm_max_cp, U8, 0)      /* Highest collating cp in locale */
 PERLVARI(I, collation_standard, bool, TRUE)
                                         /* Assume simple collation */
+PERLVAR(I, in_utf8_COLLATE_locale, bool)
 #endif /* USE_LOCALE_COLLATE */
 
-PERLVARI(I, langinfo_buf, char *, NULL)
+PERLVARI(I, langinfo_buf, const char *, NULL)
 PERLVARI(I, langinfo_bufsize, Size_t, 0)
-PERLVARI(I, setlocale_buf, char *, NULL)
+PERLVARI(I, setlocale_buf, const char *, NULL)
 PERLVARI(I, setlocale_bufsize, Size_t, 0)
+PERLVARI(I, stdize_locale_buf, const char *, NULL)
+PERLVARI(I, stdize_locale_bufsize, Size_t, 0)
 
 #ifdef PERL_SAWAMPERSAND
 PERLVAR(I, sawampersand, U8)           /* must save all match strings */
@@ -771,6 +800,8 @@ PERLVARI(I, phase,  enum perl_phase, PERL_PHASE_CONSTRUCT)
 
 PERLVARI(I, in_load_module, bool, FALSE)       /* to prevent recursions in PerlIO_find_layer */
 
+PERLVARI(I, eval_begin_nest_depth, U32, 0)
+
 PERLVAR(I, unsafe,     bool)
 PERLVAR(I, colorset,   bool)           /* PERL_RE_COLORS env var is in use */
 
@@ -806,25 +837,33 @@ PERLVARI(I, perl_destruct_level, signed char,     0)
 
 PERLVAR(I, pad_reset_pending, bool)    /* reset pad on next attempted alloc */
 
-PERLVAR(I, srand_called, bool)
-
-#ifdef USE_LOCALE_NUMERIC
+PERLVARI(I, srand_called, bool, false)      /* has random_state been initialized yet? */
+PERLVARI(I, srand_override, U32, 0)         /* Should we use a deterministic sequence? */
+PERLVARI(I, srand_override_next, U32, 0)    /* Next item in the sequence */
 
 PERLVARI(I, numeric_underlying, bool, TRUE)
                                         /* Assume underlying locale numerics */
 PERLVARI(I, numeric_underlying_is_standard, bool, TRUE)
 
-PERLVARI(I, numeric_standard, int, TRUE)
-                                        /* Assume C locale numerics */
-PERLVAR(I, numeric_name, char *)       /* Name of current numeric locale */
-PERLVAR(I, numeric_radix_sv, SV *)     /* The radix separator if not '.' */
+PERLVARI(I, numeric_standard, int, TRUE)    /* Assume C locale numerics */
+PERLVAR(I, numeric_name, char *)     /* Name of current numeric locale */
+PERLVAR(I, numeric_radix_sv, SV *)     /* The radix separator */
+PERLVAR(I, underlying_radix_sv, SV *)  /* The radix in the program's current underlying locale */
 
-#  ifdef HAS_POSIX_2008_LOCALE
+#if defined(USE_LOCALE_NUMERIC) && defined(USE_POSIX_2008_LOCALE)
 
 PERLVARI(I, underlying_numeric_obj, locale_t, NULL)
 
+#endif
+#ifdef USE_POSIX_2008_LOCALE
+PERLVARI(I, scratch_locale_obj, locale_t, 0)
+#endif
+
+#ifdef USE_LOCALE_CTYPE
+
+PERLVARI(I, ctype_name, const char *, NULL)   /* Name of current ctype locale */
+
 #  endif
-#endif /* !USE_LOCALE_NUMERIC */
 
 /* Array of signal handlers, indexed by signal number, through which the C
    signal handler dispatches.  */
@@ -888,7 +927,12 @@ PERLVARI(I, clocktick,     long,   0)      /* this many times() ticks in a second */
 PERLVARI(I, sharehook, share_proc_t, Perl_sv_nosharing)
 PERLVARI(I, lockhook,  share_proc_t, Perl_sv_nosharing)
 
+#if defined(__HP_cc) || defined(__HP_aCC)
+#pragma diag_suppress 3215
+#endif
 GCC_DIAG_IGNORE(-Wdeprecated-declarations)
+MSVC_DIAG_IGNORE(4996)
+
 #ifdef NO_MATHOMS
 #  define PERL_UNLOCK_HOOK Perl_sv_nosharing
 #else
@@ -897,7 +941,11 @@ GCC_DIAG_IGNORE(-Wdeprecated-declarations)
 #endif
 PERLVARI(I, unlockhook,        share_proc_t, PERL_UNLOCK_HOOK)
 
+MSVC_DIAG_RESTORE
 GCC_DIAG_RESTORE
+#if defined(__HP_cc) || defined(__HP_aCC)
+#pragma diag_default 3215
+#endif
 
 PERLVARI(I, threadhook,        thrhook_proc_t, Perl_nothreadhook)
 
@@ -925,7 +973,7 @@ PERLVAR(I, Xpv,             XPV *)          /* (unused) held temporary value */
 
 /* name of the scopes we've ENTERed. Only used with -DDEBUGGING, but needs to be
    present always, as -DDEBUGGING must be binary compatible with non.  */
-PERLVARI(I, scopestack_name, const char * *, NULL)
+PERLVARI(I, scopestack_name, const char **, NULL)
 
 PERLVAR(I, debug_pad,  struct perl_debug_pad)  /* always needed because of the re extension */
 
@@ -966,12 +1014,11 @@ PERLVARI(I, sv_serial,   U32,    0)      /* SV serial number, used in sv.c */
 PERLVARA(I, sv_consts, SV_CONSTS_COUNT, SV*)   /* constant SVs with precomputed hash value */
 
 #ifdef PERL_TRACE_OPS
-PERLVARA(I, op_exec_cnt, OP_max+2, UV) /* Counts of executed OPs of the given type.
+PERLVARA(I, op_exec_cnt, OP_max+2, UV)  /* Counts of executed OPs of the given type.
                                            If PERL_TRACE_OPS is enabled, we'll dump
                                            a summary count of all ops executed in the
-                                           program at perl_destruct time. For
-                                           profiling/debugging only. Works only if
-                                           DEBUGGING is enabled, too. */
+                                           program at perl_destruct time. Used only
+                                           for profiling in DEBUGGING mode. */
 #endif
 
 PERLVAR(I, random_state, PL_RANDOM_STATE_TYPE)
@@ -999,6 +1046,8 @@ PERLVAR(I, SB_invlist, SV *)
 PERLVAR(I, SCX_invlist, SV *)
 PERLVAR(I, UpperLatin1,        SV *)   /* Code points 128 - 255 */
 
+PERLVARA(I, fold_locale, 256, U8)
+
 /* List of characters that participate in any fold defined by Unicode */
 PERLVAR(I, in_some_fold, SV *)
 
@@ -1040,7 +1089,8 @@ PERLVAR(I, wcrtomb_ps, mbstate_t)
 /* Enough space for the reserved byte, 1 for a potential leading 0, then enough
  * for the longest representable integer plus an extra, the 3 flag characters,
  * and NUL */
-PERLVARA(I, mem_log, 1 + 1 + TYPE_DIGITS(UV) + 1 + 3 + 1, char)
+#define PERL_MEM_LOG_ARYLEN (1 + 1 + TYPE_DIGITS(UV) + 1 + 3 + 1)
+PERLVARA(I, mem_log, PERL_MEM_LOG_ARYLEN,  char)
 #endif
 
 /* The most recently seen `use VERSION` declaration, encoded in a single
index 9c6ee60..8b28c21 100644 (file)
@@ -10,7 +10,7 @@
 #define PERL_INVLIST_INLINE_H_
 
 #if defined(PERL_IN_UTF8_C)             \
- || defined(PERL_IN_REGCOMP_C)          \
+ || defined(PERL_IN_REGCOMP_ANY)        \
  || defined(PERL_IN_REGEXEC_C)          \
  || defined(PERL_IN_TOKE_C)             \
  || defined(PERL_IN_PP_C)               \
@@ -93,7 +93,7 @@ S_invlist_array(SV* const invlist)
 }
 
 #endif
-#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_OP_C) || defined(PERL_IN_DOOP_C)
+#if defined(PERL_IN_REGCOMP_ANY) || defined(PERL_IN_OP_C) || defined(PERL_IN_DOOP_C)
 
 PERL_STATIC_INLINE void
 S_invlist_extend(pTHX_ SV* const invlist, const UV new_max)
@@ -161,8 +161,45 @@ S_invlist_highest(SV* const invlist)
            : array[len - 1] - 1;
 }
 
+#  if defined(PERL_IN_REGCOMP_ANY)
+
+PERL_STATIC_INLINE UV
+S_invlist_highest_range_start(SV* const invlist)
+{
+    /* Returns the lowest code point of the highest range in the inversion
+     * list parameter.  This API has an ambiguity: it returns 0 either when
+     * the lowest such point is actually 0 or when the list is empty.  If this
+     * distinction matters to you, check for emptiness before calling this
+     * function. */
+
+    UV len = _invlist_len(invlist);
+    UV *array;
+
+    PERL_ARGS_ASSERT_INVLIST_HIGHEST_RANGE_START;
+
+    if (len == 0) {
+        return 0;
+    }
+
+    array = invlist_array(invlist);
+
+    /* The last element in the array in the inversion list always starts a
+     * range that goes to infinity.  That range may be for code points that are
+     * matched in the inversion list, or it may be for ones that aren't
+     * matched.  In the first case, the lowest code point in the matching range
+     * is that the one that started the range.  If the other case, the final
+     * matching range begins at the next element down (which may be 0 in the
+     * edge case). */
+    return (ELEMENT_RANGE_MATCHES_INVLIST(len - 1))
+           ? array[len - 1]
+           : len == 1
+             ? 0
+             : array[len - 2];
+}
+
+#  endif
 #endif
-#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_OP_C)
+#if defined(PERL_IN_REGCOMP_ANY) || defined(PERL_IN_OP_C)
 
 PERL_STATIC_INLINE STRLEN*
 S_get_invlist_iter_addr(SV* invlist)
@@ -238,11 +275,101 @@ S_invlist_iternext(SV* invlist, UV* start, UV* end)
 
 #endif
 
-#ifndef PERL_IN_REGCOMP_C
+#ifndef PERL_IN_REGCOMP_ANY
 
 /* These symbols are only needed later in regcomp.c */
 #       undef TO_INTERNAL_SIZE
 #       undef FROM_INTERNAL_SIZE
 #endif
 
+#ifdef PERL_IN_REGCOMP_ANY
+PERL_STATIC_INLINE
+bool
+S_invlist_is_iterating(const SV* const invlist)
+{
+    PERL_ARGS_ASSERT_INVLIST_IS_ITERATING;
+
+    /* get_invlist_iter_addr()'s sv is non-const only because it returns a
+     * value that can be used to modify the invlist, it doesn't modify the
+     * invlist itself */
+    return *(get_invlist_iter_addr((SV*)invlist)) < (STRLEN) UV_MAX;
+}
+
+PERL_STATIC_INLINE
+SV *
+S_invlist_contents(pTHX_ SV* const invlist, const bool traditional_style)
+{
+    /* Get the contents of an inversion list into a string SV so that they can
+     * be printed out.  If 'traditional_style' is TRUE, it uses the format
+     * traditionally done for debug tracing; otherwise it uses a format
+     * suitable for just copying to the output, with blanks between ranges and
+     * a dash between range components */
+
+    UV start, end;
+    SV* output;
+    const char intra_range_delimiter = (traditional_style ? '\t' : '-');
+    const char inter_range_delimiter = (traditional_style ? '\n' : ' ');
+
+    if (traditional_style) {
+        output = newSVpvs("\n");
+    }
+    else {
+        output = newSVpvs("");
+    }
+
+    PERL_ARGS_ASSERT_INVLIST_CONTENTS;
+
+    assert(! invlist_is_iterating(invlist));
+
+    invlist_iterinit(invlist);
+    while (invlist_iternext(invlist, &start, &end)) {
+        if (end == UV_MAX) {
+            Perl_sv_catpvf(aTHX_ output, "%04" UVXf "%cINFTY%c",
+                                          start, intra_range_delimiter,
+                                                 inter_range_delimiter);
+        }
+        else if (end != start) {
+            Perl_sv_catpvf(aTHX_ output, "%04" UVXf "%c%04" UVXf "%c",
+                                          start,
+                                                   intra_range_delimiter,
+                                                  end, inter_range_delimiter);
+        }
+        else {
+            Perl_sv_catpvf(aTHX_ output, "%04" UVXf "%c",
+                                          start, inter_range_delimiter);
+        }
+    }
+
+    if (SvCUR(output) && ! traditional_style) {/* Get rid of trailing blank */
+        SvCUR_set(output, SvCUR(output) - 1);
+    }
+
+    return output;
+}
+
+PERL_STATIC_INLINE
+UV
+S_invlist_lowest(SV* const invlist)
+{
+    /* Returns the lowest code point that matches an inversion list.  This API
+     * has an ambiguity, as it returns 0 under either the lowest is actually
+     * 0, or if the list is empty.  If this distinction matters to you, check
+     * for emptiness before calling this function */
+
+    UV len = _invlist_len(invlist);
+    UV *array;
+
+    PERL_ARGS_ASSERT_INVLIST_LOWEST;
+
+    if (len == 0) {
+        return 0;
+    }
+
+    array = invlist_array(invlist);
+
+    return array[0];
+}
+
+#endif
+
 #endif /* PERL_INVLIST_INLINE_H_ */
index b922af0..40ff8a3 100644 (file)
@@ -559,14 +559,7 @@ struct IPerlEnvInfo
 #  endif
 
 #else   /* below is ! PERL_IMPLICIT_SYS */
-#  ifdef USE_ITHREADS
-
-     /* Use the comma operator to return 0/non-zero, while avoiding putting
-      * this in an inline function */
-#    define PerlEnv_putenv(str) (ENV_LOCK, (putenv(str)         \
-                                            ? (ENV_UNLOCK, 1)   \
-                                            : (ENV_UNLOCK, 0)))
-#  else
+#  ifndef USE_ITHREADS  /* Threaded is an inline function in inline.h */
 #    define PerlEnv_putenv(str)         putenv(str)
 #  endif
 #  define PerlEnv_getenv(str)           mortal_getenv(str)
index ed26717..54f5d94 100644 (file)
@@ -978,7 +978,7 @@ Perl_keyword (pTHX_ const char *name, I32 len, bool all_keywords)
           goto unknown;
       }
 
-    case 5: /* 41 tokens of length 5 */
+    case 5: /* 43 tokens of length 5 */
       switch (name[0])
       {
         case 'B':
@@ -1119,14 +1119,29 @@ Perl_keyword (pTHX_ const char *name, I32 len, bool all_keywords)
               }
 
             case 'l':
-              if (name[2] == 'o' &&
-                  name[3] == 's' &&
-                  name[4] == 'e')
-              {                                   /* close            */
-                return -KEY_close;
-              }
+              switch (name[2])
+              {
+                case 'a':
+                  if (name[3] == 's' &&
+                      name[4] == 's')
+                  {                               /* class            */
+                    return (all_keywords || FEATURE_CLASS_IS_ENABLED ? -KEY_class : 0);
+                  }
 
-              goto unknown;
+                  goto unknown;
+
+                case 'o':
+                  if (name[3] == 's' &&
+                      name[4] == 'e')
+                  {                               /* close            */
+                    return -KEY_close;
+                  }
+
+                  goto unknown;
+
+                default:
+                  goto unknown;
+              }
 
             case 'r':
               if (name[2] == 'y' &&
@@ -1177,6 +1192,16 @@ Perl_keyword (pTHX_ const char *name, I32 len, bool all_keywords)
 
               goto unknown;
 
+            case 'i':
+              if (name[2] == 'e' &&
+                  name[3] == 'l' &&
+                  name[4] == 'd')
+              {                                   /* field            */
+                return (all_keywords || FEATURE_CLASS_IS_ENABLED ? -KEY_field : 0);
+              }
+
+              goto unknown;
+
             case 'l':
               if (name[2] == 'o' &&
                   name[3] == 'c' &&
@@ -1494,9 +1519,21 @@ Perl_keyword (pTHX_ const char *name, I32 len, bool all_keywords)
           goto unknown;
       }
 
-    case 6: /* 33 tokens of length 6 */
+    case 6: /* 35 tokens of length 6 */
       switch (name[0])
       {
+        case 'A':
+          if (name[1] == 'D' &&
+              name[2] == 'J' &&
+              name[3] == 'U' &&
+              name[4] == 'S' &&
+              name[5] == 'T')
+          {                                       /* ADJUST           */
+            return (all_keywords || FEATURE_CLASS_IS_ENABLED ? KEY_ADJUST : 0);
+          }
+
+          goto unknown;
+
         case 'a':
           if (name[1] == 'c' &&
               name[2] == 'c' &&
@@ -1650,54 +1687,71 @@ Perl_keyword (pTHX_ const char *name, I32 len, bool all_keywords)
           }
 
         case 'm':
-          if (name[1] == 's' &&
-              name[2] == 'g')
+          switch (name[1])
           {
-            switch (name[3])
-            {
-              case 'c':
-                if (name[4] == 't' &&
-                    name[5] == 'l')
-                {                                 /* msgctl           */
-                  return -KEY_msgctl;
-                }
+            case 'e':
+              if (name[2] == 't' &&
+                  name[3] == 'h' &&
+                  name[4] == 'o' &&
+                  name[5] == 'd')
+              {                                   /* method           */
+                return (all_keywords || FEATURE_CLASS_IS_ENABLED ? -KEY_method : 0);
+              }
 
-                goto unknown;
+              goto unknown;
 
-              case 'g':
-                if (name[4] == 'e' &&
-                    name[5] == 't')
-                {                                 /* msgget           */
-                  return -KEY_msgget;
-                }
+            case 's':
+              if (name[2] == 'g')
+              {
+                switch (name[3])
+                {
+                  case 'c':
+                    if (name[4] == 't' &&
+                        name[5] == 'l')
+                    {                             /* msgctl           */
+                      return -KEY_msgctl;
+                    }
 
-                goto unknown;
+                    goto unknown;
 
-              case 'r':
-                if (name[4] == 'c' &&
-                    name[5] == 'v')
-                {                                 /* msgrcv           */
-                  return -KEY_msgrcv;
-                }
+                  case 'g':
+                    if (name[4] == 'e' &&
+                        name[5] == 't')
+                    {                             /* msgget           */
+                      return -KEY_msgget;
+                    }
 
-                goto unknown;
+                    goto unknown;
 
-              case 's':
-                if (name[4] == 'n' &&
-                    name[5] == 'd')
-                {                                 /* msgsnd           */
-                  return -KEY_msgsnd;
+                  case 'r':
+                    if (name[4] == 'c' &&
+                        name[5] == 'v')
+                    {                             /* msgrcv           */
+                      return -KEY_msgrcv;
+                    }
+
+                    goto unknown;
+
+                  case 's':
+                    if (name[4] == 'n' &&
+                        name[5] == 'd')
+                    {                             /* msgsnd           */
+                      return -KEY_msgsnd;
+                    }
+
+                    goto unknown;
+
+                  default:
+                    goto unknown;
                 }
+              }
 
-                goto unknown;
+              goto unknown;
 
-              default:
-                goto unknown;
-            }
+            default:
+              goto unknown;
           }
 
-          goto unknown;
-
         case 'p':
           if (name[1] == 'r' &&
               name[2] == 'i' &&
@@ -3504,5 +3558,5 @@ unknown:
 }
 
 /* Generated from:
- * b680fb3a27b173b65d9c4e534ad92897c925e336476879a6be1da18ac55cbe8b regen/keywords.pl
+ * eb67e851da14ede1aad67aec4a387fa250c1345407fad0a02988d2d8d3cc27f2 regen/keywords.pl
  * ex: set ro: */
index f2304ba..feae6f6 100644 (file)
 #define KEY___DATA__           4
 #define KEY___END__            5
 #define KEY___SUB__            6
-#define KEY_AUTOLOAD           7
-#define KEY_BEGIN              8
-#define KEY_UNITCHECK          9
-#define KEY_DESTROY            10
-#define KEY_END                        11
-#define KEY_INIT               12
-#define KEY_CHECK              13
-#define KEY_abs                        14
-#define KEY_accept             15
-#define KEY_alarm              16
-#define KEY_and                        17
-#define KEY_atan2              18
-#define KEY_bind               19
-#define KEY_binmode            20
-#define KEY_bless              21
-#define KEY_break              22
-#define KEY_caller             23
-#define KEY_catch              24
-#define KEY_chdir              25
-#define KEY_chmod              26
-#define KEY_chomp              27
-#define KEY_chop               28
-#define KEY_chown              29
-#define KEY_chr                        30
-#define KEY_chroot             31
-#define KEY_close              32
-#define KEY_closedir           33
-#define KEY_cmp                        34
-#define KEY_connect            35
-#define KEY_continue           36
-#define KEY_cos                        37
-#define KEY_crypt              38
-#define KEY_dbmclose           39
-#define KEY_dbmopen            40
-#define KEY_default            41
-#define KEY_defer              42
-#define KEY_defined            43
-#define KEY_delete             44
-#define KEY_die                        45
-#define KEY_do                 46
-#define KEY_dump               47
-#define KEY_each               48
-#define KEY_else               49
-#define KEY_elsif              50
-#define KEY_endgrent           51
-#define KEY_endhostent         52
-#define KEY_endnetent          53
-#define KEY_endprotoent                54
-#define KEY_endpwent           55
-#define KEY_endservent         56
-#define KEY_eof                        57
-#define KEY_eq                 58
-#define KEY_eval               59
-#define KEY_evalbytes          60
-#define KEY_exec               61
-#define KEY_exists             62
-#define KEY_exit               63
-#define KEY_exp                        64
-#define KEY_fc                 65
-#define KEY_fcntl              66
-#define KEY_fileno             67
-#define KEY_finally            68
-#define KEY_flock              69
-#define KEY_for                        70
-#define KEY_foreach            71
-#define KEY_fork               72
-#define KEY_format             73
-#define KEY_formline           74
-#define KEY_ge                 75
-#define KEY_getc               76
-#define KEY_getgrent           77
-#define KEY_getgrgid           78
-#define KEY_getgrnam           79
-#define KEY_gethostbyaddr      80
-#define KEY_gethostbyname      81
-#define KEY_gethostent         82
-#define KEY_getlogin           83
-#define KEY_getnetbyaddr       84
-#define KEY_getnetbyname       85
-#define KEY_getnetent          86
-#define KEY_getpeername                87
-#define KEY_getpgrp            88
-#define KEY_getppid            89
-#define KEY_getpriority                90
-#define KEY_getprotobyname     91
-#define KEY_getprotobynumber   92
-#define KEY_getprotoent                93
-#define KEY_getpwent           94
-#define KEY_getpwnam           95
-#define KEY_getpwuid           96
-#define KEY_getservbyname      97
-#define KEY_getservbyport      98
-#define KEY_getservent         99
-#define KEY_getsockname                100
-#define KEY_getsockopt         101
-#define KEY_given              102
-#define KEY_glob               103
-#define KEY_gmtime             104
-#define KEY_goto               105
-#define KEY_grep               106
-#define KEY_gt                 107
-#define KEY_hex                        108
-#define KEY_if                 109
-#define KEY_index              110
-#define KEY_int                        111
-#define KEY_ioctl              112
-#define KEY_isa                        113
-#define KEY_join               114
-#define KEY_keys               115
-#define KEY_kill               116
-#define KEY_last               117
-#define KEY_lc                 118
-#define KEY_lcfirst            119
-#define KEY_le                 120
-#define KEY_length             121
-#define KEY_link               122
-#define KEY_listen             123
-#define KEY_local              124
-#define KEY_localtime          125
-#define KEY_lock               126
-#define KEY_log                        127
-#define KEY_lstat              128
-#define KEY_lt                 129
-#define KEY_m                  130
-#define KEY_map                        131
-#define KEY_mkdir              132
-#define KEY_msgctl             133
-#define KEY_msgget             134
-#define KEY_msgrcv             135
-#define KEY_msgsnd             136
-#define KEY_my                 137
-#define KEY_ne                 138
-#define KEY_next               139
-#define KEY_no                 140
-#define KEY_not                        141
-#define KEY_oct                        142
-#define KEY_open               143
-#define KEY_opendir            144
-#define KEY_or                 145
-#define KEY_ord                        146
-#define KEY_our                        147
-#define KEY_pack               148
-#define KEY_package            149
-#define KEY_pipe               150
-#define KEY_pop                        151
-#define KEY_pos                        152
-#define KEY_print              153
-#define KEY_printf             154
-#define KEY_prototype          155
-#define KEY_push               156
-#define KEY_q                  157
-#define KEY_qq                 158
-#define KEY_qr                 159
-#define KEY_quotemeta          160
-#define KEY_qw                 161
-#define KEY_qx                 162
-#define KEY_rand               163
-#define KEY_read               164
-#define KEY_readdir            165
-#define KEY_readline           166
-#define KEY_readlink           167
-#define KEY_readpipe           168
-#define KEY_recv               169
-#define KEY_redo               170
-#define KEY_ref                        171
-#define KEY_rename             172
-#define KEY_require            173
-#define KEY_reset              174
-#define KEY_return             175
-#define KEY_reverse            176
-#define KEY_rewinddir          177
-#define KEY_rindex             178
-#define KEY_rmdir              179
-#define KEY_s                  180
-#define KEY_say                        181
-#define KEY_scalar             182
-#define KEY_seek               183
-#define KEY_seekdir            184
-#define KEY_select             185
-#define KEY_semctl             186
-#define KEY_semget             187
-#define KEY_semop              188
-#define KEY_send               189
-#define KEY_setgrent           190
-#define KEY_sethostent         191
-#define KEY_setnetent          192
-#define KEY_setpgrp            193
-#define KEY_setpriority                194
-#define KEY_setprotoent                195
-#define KEY_setpwent           196
-#define KEY_setservent         197
-#define KEY_setsockopt         198
-#define KEY_shift              199
-#define KEY_shmctl             200
-#define KEY_shmget             201
-#define KEY_shmread            202
-#define KEY_shmwrite           203
-#define KEY_shutdown           204
-#define KEY_sin                        205
-#define KEY_sleep              206
-#define KEY_socket             207
-#define KEY_socketpair         208
-#define KEY_sort               209
-#define KEY_splice             210
-#define KEY_split              211
-#define KEY_sprintf            212
-#define KEY_sqrt               213
-#define KEY_srand              214
-#define KEY_stat               215
-#define KEY_state              216
-#define KEY_study              217
-#define KEY_sub                        218
-#define KEY_substr             219
-#define KEY_symlink            220
-#define KEY_syscall            221
-#define KEY_sysopen            222
-#define KEY_sysread            223
-#define KEY_sysseek            224
-#define KEY_system             225
-#define KEY_syswrite           226
-#define KEY_tell               227
-#define KEY_telldir            228
-#define KEY_tie                        229
-#define KEY_tied               230
-#define KEY_time               231
-#define KEY_times              232
-#define KEY_tr                 233
-#define KEY_try                        234
-#define KEY_truncate           235
-#define KEY_uc                 236
-#define KEY_ucfirst            237
-#define KEY_umask              238
-#define KEY_undef              239
-#define KEY_unless             240
-#define KEY_unlink             241
-#define KEY_unpack             242
-#define KEY_unshift            243
-#define KEY_untie              244
-#define KEY_until              245
-#define KEY_use                        246
-#define KEY_utime              247
-#define KEY_values             248
-#define KEY_vec                        249
-#define KEY_wait               250
-#define KEY_waitpid            251
-#define KEY_wantarray          252
-#define KEY_warn               253
-#define KEY_when               254
-#define KEY_while              255
-#define KEY_write              256
-#define KEY_x                  257
-#define KEY_xor                        258
-#define KEY_y                  259
+#define KEY_ADJUST             7
+#define KEY_AUTOLOAD           8
+#define KEY_BEGIN              9
+#define KEY_UNITCHECK          10
+#define KEY_DESTROY            11
+#define KEY_END                        12
+#define KEY_INIT               13
+#define KEY_CHECK              14
+#define KEY_abs                        15
+#define KEY_accept             16
+#define KEY_alarm              17
+#define KEY_and                        18
+#define KEY_atan2              19
+#define KEY_bind               20
+#define KEY_binmode            21
+#define KEY_bless              22
+#define KEY_break              23
+#define KEY_caller             24
+#define KEY_catch              25
+#define KEY_chdir              26
+#define KEY_chmod              27
+#define KEY_chomp              28
+#define KEY_chop               29
+#define KEY_chown              30
+#define KEY_chr                        31
+#define KEY_chroot             32
+#define KEY_class              33
+#define KEY_close              34
+#define KEY_closedir           35
+#define KEY_cmp                        36
+#define KEY_connect            37
+#define KEY_continue           38
+#define KEY_cos                        39
+#define KEY_crypt              40
+#define KEY_dbmclose           41
+#define KEY_dbmopen            42
+#define KEY_default            43
+#define KEY_defer              44
+#define KEY_defined            45
+#define KEY_delete             46
+#define KEY_die                        47
+#define KEY_do                 48
+#define KEY_dump               49
+#define KEY_each               50
+#define KEY_else               51
+#define KEY_elsif              52
+#define KEY_endgrent           53
+#define KEY_endhostent         54
+#define KEY_endnetent          55
+#define KEY_endprotoent                56
+#define KEY_endpwent           57
+#define KEY_endservent         58
+#define KEY_eof                        59
+#define KEY_eq                 60
+#define KEY_eval               61
+#define KEY_evalbytes          62
+#define KEY_exec               63
+#define KEY_exists             64
+#define KEY_exit               65
+#define KEY_exp                        66
+#define KEY_fc                 67
+#define KEY_fcntl              68
+#define KEY_field              69
+#define KEY_fileno             70
+#define KEY_finally            71
+#define KEY_flock              72
+#define KEY_for                        73
+#define KEY_foreach            74
+#define KEY_fork               75
+#define KEY_format             76
+#define KEY_formline           77
+#define KEY_ge                 78
+#define KEY_getc               79
+#define KEY_getgrent           80
+#define KEY_getgrgid           81
+#define KEY_getgrnam           82
+#define KEY_gethostbyaddr      83
+#define KEY_gethostbyname      84
+#define KEY_gethostent         85
+#define KEY_getlogin           86
+#define KEY_getnetbyaddr       87
+#define KEY_getnetbyname       88
+#define KEY_getnetent          89
+#define KEY_getpeername                90
+#define KEY_getpgrp            91
+#define KEY_getppid            92
+#define KEY_getpriority                93
+#define KEY_getprotobyname     94
+#define KEY_getprotobynumber   95
+#define KEY_getprotoent                96
+#define KEY_getpwent           97
+#define KEY_getpwnam           98
+#define KEY_getpwuid           99
+#define KEY_getservbyname      100
+#define KEY_getservbyport      101
+#define KEY_getservent         102
+#define KEY_getsockname                103
+#define KEY_getsockopt         104
+#define KEY_given              105
+#define KEY_glob               106
+#define KEY_gmtime             107
+#define KEY_goto               108
+#define KEY_grep               109
+#define KEY_gt                 110
+#define KEY_hex                        111
+#define KEY_if                 112
+#define KEY_index              113
+#define KEY_int                        114
+#define KEY_ioctl              115
+#define KEY_isa                        116
+#define KEY_join               117
+#define KEY_keys               118
+#define KEY_kill               119
+#define KEY_last               120
+#define KEY_lc                 121
+#define KEY_lcfirst            122
+#define KEY_le                 123
+#define KEY_length             124
+#define KEY_link               125
+#define KEY_listen             126
+#define KEY_local              127
+#define KEY_localtime          128
+#define KEY_lock               129
+#define KEY_log                        130
+#define KEY_lstat              131
+#define KEY_lt                 132
+#define KEY_m                  133
+#define KEY_map                        134
+#define KEY_method             135
+#define KEY_mkdir              136
+#define KEY_msgctl             137
+#define KEY_msgget             138
+#define KEY_msgrcv             139
+#define KEY_msgsnd             140
+#define KEY_my                 141
+#define KEY_ne                 142
+#define KEY_next               143
+#define KEY_no                 144
+#define KEY_not                        145
+#define KEY_oct                        146
+#define KEY_open               147
+#define KEY_opendir            148
+#define KEY_or                 149
+#define KEY_ord                        150
+#define KEY_our                        151
+#define KEY_pack               152
+#define KEY_package            153
+#define KEY_pipe               154
+#define KEY_pop                        155
+#define KEY_pos                        156
+#define KEY_print              157
+#define KEY_printf             158
+#define KEY_prototype          159
+#define KEY_push               160
+#define KEY_q                  161
+#define KEY_qq                 162
+#define KEY_qr                 163
+#define KEY_quotemeta          164
+#define KEY_qw                 165
+#define KEY_qx                 166
+#define KEY_rand               167
+#define KEY_read               168
+#define KEY_readdir            169
+#define KEY_readline           170
+#define KEY_readlink           171
+#define KEY_readpipe           172
+#define KEY_recv               173
+#define KEY_redo               174
+#define KEY_ref                        175
+#define KEY_rename             176
+#define KEY_require            177
+#define KEY_reset              178
+#define KEY_return             179
+#define KEY_reverse            180
+#define KEY_rewinddir          181
+#define KEY_rindex             182
+#define KEY_rmdir              183
+#define KEY_s                  184
+#define KEY_say                        185
+#define KEY_scalar             186
+#define KEY_seek               187
+#define KEY_seekdir            188
+#define KEY_select             189
+#define KEY_semctl             190
+#define KEY_semget             191
+#define KEY_semop              192
+#define KEY_send               193
+#define KEY_setgrent           194
+#define KEY_sethostent         195
+#define KEY_setnetent          196
+#define KEY_setpgrp            197
+#define KEY_setpriority                198
+#define KEY_setprotoent                199
+#define KEY_setpwent           200
+#define KEY_setservent         201
+#define KEY_setsockopt         202
+#define KEY_shift              203
+#define KEY_shmctl             204
+#define KEY_shmget             205
+#define KEY_shmread            206
+#define KEY_shmwrite           207
+#define KEY_shutdown           208
+#define KEY_sin                        209
+#define KEY_sleep              210
+#define KEY_socket             211
+#define KEY_socketpair         212
+#define KEY_sort               213
+#define KEY_splice             214
+#define KEY_split              215
+#define KEY_sprintf            216
+#define KEY_sqrt               217
+#define KEY_srand              218
+#define KEY_stat               219
+#define KEY_state              220
+#define KEY_study              221
+#define KEY_sub                        222
+#define KEY_substr             223
+#define KEY_symlink            224
+#define KEY_syscall            225
+#define KEY_sysopen            226
+#define KEY_sysread            227
+#define KEY_sysseek            228
+#define KEY_system             229
+#define KEY_syswrite           230
+#define KEY_tell               231
+#define KEY_telldir            232
+#define KEY_tie                        233
+#define KEY_tied               234
+#define KEY_time               235
+#define KEY_times              236
+#define KEY_tr                 237
+#define KEY_try                        238
+#define KEY_truncate           239
+#define KEY_uc                 240
+#define KEY_ucfirst            241
+#define KEY_umask              242
+#define KEY_undef              243
+#define KEY_unless             244
+#define KEY_unlink             245
+#define KEY_unpack             246
+#define KEY_unshift            247
+#define KEY_untie              248
+#define KEY_until              249
+#define KEY_use                        250
+#define KEY_utime              251
+#define KEY_values             252
+#define KEY_vec                        253
+#define KEY_wait               254
+#define KEY_waitpid            255
+#define KEY_wantarray          256
+#define KEY_warn               257
+#define KEY_when               258
+#define KEY_while              259
+#define KEY_write              260
+#define KEY_x                  261
+#define KEY_xor                        262
+#define KEY_y                  263
 
 /* Generated from:
- * b680fb3a27b173b65d9c4e534ad92897c925e336476879a6be1da18ac55cbe8b regen/keywords.pl
+ * eb67e851da14ede1aad67aec4a387fa250c1345407fad0a02988d2d8d3cc27f2 regen/keywords.pl
  * ex: set ro: */
index ce668f0..01d7763 100644 (file)
@@ -1,4 +1,4 @@
-/* -*- buffer-read-only: t -*-
+/* -*- mode: C; buffer-read-only: t -*-
  * !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!!
  * This file is built by regen/mk_PL_charclass.pl from Unicode::UCD.
  * Any changes made here will be lost!
  * in the comment*/
 
 #if 'A' == 65 /* ASCII/Latin1 */
-/* U+00 NUL */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+01 SOH */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+02 STX */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+03 ETX */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+04 EOT */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+05 ENQ */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+06 ACK */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+07 BEL */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_MNEMONIC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+08 BS */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_MNEMONIC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+09 HT */ (1U<<_CC_ASCII)|(1U<<_CC_BLANK)|(1U<<_CC_CNTRL)|(1U<<_CC_MNEMONIC_CNTRL)|(1U<<_CC_QUOTEMETA)|(1U<<_CC_SPACE),
-/* U+0A LF */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_MNEMONIC_CNTRL)|(1U<<_CC_QUOTEMETA)|(1U<<_CC_SPACE)|(1U<<_CC_VERTSPACE),
-/* U+0B VT */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA)|(1U<<_CC_SPACE)|(1U<<_CC_VERTSPACE),
-/* U+0C FF */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_MNEMONIC_CNTRL)|(1U<<_CC_QUOTEMETA)|(1U<<_CC_SPACE)|(1U<<_CC_VERTSPACE),
-/* U+0D CR */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_MNEMONIC_CNTRL)|(1U<<_CC_QUOTEMETA)|(1U<<_CC_SPACE)|(1U<<_CC_VERTSPACE),
-/* U+0E SO */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+0F SI */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+10 DLE */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+11 DC1 */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+12 DC2 */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+13 DC3 */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+14 DC4 */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+15 NAK */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+16 SYN */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+17 ETB */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+18 CAN */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+19 EOM */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+1A SUB */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+1B ESC */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_MNEMONIC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+1C FS */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+1D GS */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+1E RS */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+1F US */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+20 SP */ (1U<<_CC_ASCII)|(1U<<_CC_BLANK)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA)|(1U<<_CC_SPACE),
-/* U+21 '!' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* U+22 '"' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* U+23 '#' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* U+24 '$' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* U+25 '%' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* U+26 '&' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* U+27 "'" */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* U+28 '(' */ (1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* U+29 ')' */ (1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* U+2A '*' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* U+2B '+' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* U+2C ',' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* U+2D '-' */ (1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* U+2E '.' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* U+2F '/' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* U+30 '0' */ (1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_BINDIGIT)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_DIGIT)|(1U<<_CC_GRAPH)|(1U<<_CC_OCTDIGIT)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT),
-/* U+31 '1' */ (1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_BINDIGIT)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_DIGIT)|(1U<<_CC_GRAPH)|(1U<<_CC_OCTDIGIT)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT),
-/* U+32 '2' */ (1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_DIGIT)|(1U<<_CC_GRAPH)|(1U<<_CC_OCTDIGIT)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT),
-/* U+33 '3' */ (1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_DIGIT)|(1U<<_CC_GRAPH)|(1U<<_CC_OCTDIGIT)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT),
-/* U+34 '4' */ (1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_DIGIT)|(1U<<_CC_GRAPH)|(1U<<_CC_OCTDIGIT)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT),
-/* U+35 '5' */ (1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_DIGIT)|(1U<<_CC_GRAPH)|(1U<<_CC_OCTDIGIT)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT),
-/* U+36 '6' */ (1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_DIGIT)|(1U<<_CC_GRAPH)|(1U<<_CC_OCTDIGIT)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT),
-/* U+37 '7' */ (1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_DIGIT)|(1U<<_CC_GRAPH)|(1U<<_CC_OCTDIGIT)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT),
-/* U+38 '8' */ (1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_DIGIT)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT),
-/* U+39 '9' */ (1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_DIGIT)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT),
-/* U+3A ':' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* U+3B ';' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* U+3C '<' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* U+3D '=' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* U+3E '>' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* U+3F '?' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* U+40 '@' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* U+41 'A' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT),
-/* U+42 'B' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT),
-/* U+43 'C' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT),
-/* U+44 'D' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT),
-/* U+45 'E' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT),
-/* U+46 'F' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT),
-/* U+47 'G' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* U+48 'H' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* U+49 'I' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* U+4A 'J' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* U+4B 'K' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NONLATIN1_SIMPLE_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* U+4C 'L' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* U+4D 'M' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* U+4E 'N' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* U+4F 'O' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* U+50 'P' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* U+51 'Q' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* U+52 'R' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* U+53 'S' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NONLATIN1_SIMPLE_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* U+54 'T' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* U+55 'U' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* U+56 'V' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* U+57 'W' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* U+58 'X' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* U+59 'Y' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* U+5A 'Z' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* U+5B '[' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* U+5C '\' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* U+5D ']' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* U+5E '^' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* U+5F '_' */ (1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_WORDCHAR),
-/* U+60 '`' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* U+61 'a' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT),
-/* U+62 'b' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT),
-/* U+63 'c' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT),
-/* U+64 'd' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT),
-/* U+65 'e' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT),
-/* U+66 'f' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT),
-/* U+67 'g' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* U+68 'h' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* U+69 'i' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* U+6A 'j' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* U+6B 'k' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NONLATIN1_SIMPLE_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* U+6C 'l' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* U+6D 'm' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* U+6E 'n' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* U+6F 'o' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* U+70 'p' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* U+71 'q' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* U+72 'r' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* U+73 's' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NONLATIN1_SIMPLE_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* U+74 't' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* U+75 'u' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* U+76 'v' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* U+77 'w' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* U+78 'x' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* U+79 'y' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* U+7A 'z' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* U+7B '{' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* U+7C '|' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* U+7D '}' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* U+7E '~' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* U+7F DEL */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+80 PAD */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+81 HOP */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+82 BPH */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+83 NBH */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+84 IND */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+85 NEL */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA)|(1U<<_CC_SPACE)|(1U<<_CC_VERTSPACE),
-/* U+86 SSA */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+87 ESA */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+88 HTS */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+89 HTJ */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+8A VTS */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+8B PLD */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+8C PLU */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+8D RI */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+8E SS2 */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+8F SS3 */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+90 DCS */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+91 PU1 */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+92 PU2 */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+93 STS */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+94 CCH */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+95 MW */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+96 SPA */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+97 EPA */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+98 SOS */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+99 SGC */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+9A SCI */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+9B CSI */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+9C ST */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+9D OSC */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+9E PM */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+9F APC */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+A0 NBSP */ (1U<<_CC_BLANK)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA)|(1U<<_CC_SPACE),
-/* U+A1 INVERTED '!' */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* U+A2 CENT */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA),
-/* U+A3 POUND */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA),
-/* U+A4 CURRENCY */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA),
-/* U+A5 YEN */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA),
-/* U+A6 BROKEN BAR */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA),
-/* U+A7 SECTION */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* U+A8 DIAERESIS */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT),
-/* U+A9 COPYRIGHT */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA),
-/* U+AA FEMININE ORDINAL */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* U+AB LEFT-POINTING DOUBLE ANGLE QUOTE */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* U+AC NOT */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA),
-/* U+AD SOFT HYPHEN */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA),
-/* U+AE REGISTERED */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA),
-/* U+AF MACRON */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT),
-/* U+B0 DEGREE */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA),
-/* U+B1 PLUS-MINUS */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA),
-/* U+B2 SUPERSCRIPT 2 */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT),
-/* U+B3 SUPERSCRIPT 3 */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT),
-/* U+B4 ACUTE ACCENT */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT),
-/* U+B5 MICRO */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NONLATIN1_SIMPLE_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* U+B6 PILCROW */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* U+B7 MIDDLE DOT */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT),
-/* U+B8 CEDILLA */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT),
-/* U+B9 SUPERSCRIPT 1 */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT),
-/* U+BA MASCULINE ORDINAL */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* U+BB RIGHT-POINTING DOUBLE ANGLE QUOTE */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* U+BC 1/4 */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT),
-/* U+BD 1/2 */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT),
-/* U+BE 3/4 */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT),
-/* U+BF INVERTED '?' */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* U+C0 A with GRAVE */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* U+C1 A with ACUTE */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* U+C2 A with '^' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* U+C3 A with '~' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* U+C4 A with DIAERESIS */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* U+C5 A with RING */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NONLATIN1_SIMPLE_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* U+C6 AE */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* U+C7 C with CEDILLA */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* U+C8 E with GRAVE */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* U+C9 E with ACUTE */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* U+CA E with '^' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* U+CB E with DIAERESIS */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* U+CC I with GRAVE */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* U+CD I with ACUTE */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* U+CE I with '^' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* U+CF I with DIAERESIS */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* U+D0 ETH */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* U+D1 N with '~' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* U+D2 O with GRAVE */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* U+D3 O with ACUTE */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* U+D4 O with '^' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* U+D5 O with '~' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* U+D6 O with DIAERESIS */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* U+D7 MULTIPLICATION */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA),
-/* U+D8 O with '/' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* U+D9 U with GRAVE */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* U+DA U with ACUTE */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* U+DB U with '^' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* U+DC U with DIAERESIS */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* U+DD Y with ACUTE */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* U+DE THORN */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* U+DF sharp s */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NONLATIN1_SIMPLE_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* U+E0 a with grave */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* U+E1 a with acute */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* U+E2 a with '^' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* U+E3 a with '~' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* U+E4 a with diaeresis */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* U+E5 a with ring */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NONLATIN1_SIMPLE_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* U+E6 ae */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* U+E7 c with cedilla */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* U+E8 e with grave */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* U+E9 e with acute */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* U+EA e with '^' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* U+EB e with diaeresis */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* U+EC i with grave */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* U+ED i with acute */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* U+EE i with '^' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* U+EF i with diaeresis */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* U+F0 eth */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* U+F1 n with '~' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* U+F2 o with grave */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* U+F3 o with acute */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* U+F4 o with '^' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* U+F5 o with '~' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* U+F6 o with diaeresis */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* U+F7 DIVISION */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA),
-/* U+F8 o with '/' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* U+F9 u with grave */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* U+FA u with acute */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* U+FB u with '^' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* U+FC u with diaeresis */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* U+FD y with acute */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* U+FE thorn */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* U+FF y with diaeresis */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NONLATIN1_SIMPLE_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)
+/* U+00 NUL */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+01 SOH */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+02 STX */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+03 ETX */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+04 EOT */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+05 ENQ */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+06 ACK */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+07 BEL */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_MNEMONIC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+08 BS */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_MNEMONIC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+09 HT */ (1U<<CC_ASCII_)|(1U<<CC_BLANK_)|(1U<<CC_CNTRL_)|(1U<<CC_MNEMONIC_CNTRL_)|(1U<<CC_QUOTEMETA_)|(1U<<CC_SPACE_),
+/* U+0A LF */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_MNEMONIC_CNTRL_)|(1U<<CC_QUOTEMETA_)|(1U<<CC_SPACE_)|(1U<<CC_VERTSPACE_),
+/* U+0B VT */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_)|(1U<<CC_SPACE_)|(1U<<CC_VERTSPACE_),
+/* U+0C FF */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_MNEMONIC_CNTRL_)|(1U<<CC_QUOTEMETA_)|(1U<<CC_SPACE_)|(1U<<CC_VERTSPACE_),
+/* U+0D CR */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_MNEMONIC_CNTRL_)|(1U<<CC_QUOTEMETA_)|(1U<<CC_SPACE_)|(1U<<CC_VERTSPACE_),
+/* U+0E SO */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+0F SI */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+10 DLE */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+11 DC1 */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+12 DC2 */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+13 DC3 */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+14 DC4 */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+15 NAK */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+16 SYN */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+17 ETB */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+18 CAN */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+19 EOM */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+1A SUB */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+1B ESC */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_MNEMONIC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+1C FS */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+1D GS */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+1E RS */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+1F US */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+20 SP */ (1U<<CC_ASCII_)|(1U<<CC_BLANK_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_PRINT_)|(1U<<CC_QUOTEMETA_)|(1U<<CC_SPACE_),
+/* U+21 '!' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* U+22 '"' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* U+23 '#' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* U+24 '$' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* U+25 '%' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* U+26 '&' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* U+27 "'" */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* U+28 '(' */ (1U<<CC_ASCII_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* U+29 ')' */ (1U<<CC_ASCII_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* U+2A '*' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* U+2B '+' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* U+2C ',' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* U+2D '-' */ (1U<<CC_ASCII_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* U+2E '.' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* U+2F '/' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* U+30 '0' */ (1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_BINDIGIT_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_DIGIT_)|(1U<<CC_GRAPH_)|(1U<<CC_OCTDIGIT_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_)|(1U<<CC_XDIGIT_),
+/* U+31 '1' */ (1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_BINDIGIT_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_DIGIT_)|(1U<<CC_GRAPH_)|(1U<<CC_OCTDIGIT_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_)|(1U<<CC_XDIGIT_),
+/* U+32 '2' */ (1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_DIGIT_)|(1U<<CC_GRAPH_)|(1U<<CC_OCTDIGIT_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_)|(1U<<CC_XDIGIT_),
+/* U+33 '3' */ (1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_DIGIT_)|(1U<<CC_GRAPH_)|(1U<<CC_OCTDIGIT_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_)|(1U<<CC_XDIGIT_),
+/* U+34 '4' */ (1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_DIGIT_)|(1U<<CC_GRAPH_)|(1U<<CC_OCTDIGIT_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_)|(1U<<CC_XDIGIT_),
+/* U+35 '5' */ (1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_DIGIT_)|(1U<<CC_GRAPH_)|(1U<<CC_OCTDIGIT_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_)|(1U<<CC_XDIGIT_),
+/* U+36 '6' */ (1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_DIGIT_)|(1U<<CC_GRAPH_)|(1U<<CC_OCTDIGIT_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_)|(1U<<CC_XDIGIT_),
+/* U+37 '7' */ (1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_DIGIT_)|(1U<<CC_GRAPH_)|(1U<<CC_OCTDIGIT_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_)|(1U<<CC_XDIGIT_),
+/* U+38 '8' */ (1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_DIGIT_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_)|(1U<<CC_XDIGIT_),
+/* U+39 '9' */ (1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_DIGIT_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_)|(1U<<CC_XDIGIT_),
+/* U+3A ':' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* U+3B ';' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* U+3C '<' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* U+3D '=' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* U+3E '>' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* U+3F '?' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* U+40 '@' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* U+41 'A' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NON_FINAL_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_)|(1U<<CC_XDIGIT_),
+/* U+42 'B' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_)|(1U<<CC_XDIGIT_),
+/* U+43 'C' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_)|(1U<<CC_XDIGIT_),
+/* U+44 'D' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_)|(1U<<CC_XDIGIT_),
+/* U+45 'E' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_)|(1U<<CC_XDIGIT_),
+/* U+46 'F' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NON_FINAL_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_)|(1U<<CC_XDIGIT_),
+/* U+47 'G' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* U+48 'H' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NON_FINAL_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* U+49 'I' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NON_FINAL_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* U+4A 'J' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NON_FINAL_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* U+4B 'K' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NONLATIN1_SIMPLE_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* U+4C 'L' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* U+4D 'M' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* U+4E 'N' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* U+4F 'O' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* U+50 'P' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* U+51 'Q' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* U+52 'R' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* U+53 'S' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NONLATIN1_SIMPLE_FOLD_)|(1U<<CC_NON_FINAL_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* U+54 'T' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NON_FINAL_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* U+55 'U' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* U+56 'V' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* U+57 'W' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NON_FINAL_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* U+58 'X' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* U+59 'Y' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NON_FINAL_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* U+5A 'Z' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* U+5B '[' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* U+5C '\' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* U+5D ']' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* U+5E '^' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* U+5F '_' */ (1U<<CC_ASCII_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_WORDCHAR_),
+/* U+60 '`' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* U+61 'a' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NON_FINAL_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_)|(1U<<CC_XDIGIT_),
+/* U+62 'b' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_)|(1U<<CC_XDIGIT_),
+/* U+63 'c' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_)|(1U<<CC_XDIGIT_),
+/* U+64 'd' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_)|(1U<<CC_XDIGIT_),
+/* U+65 'e' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_)|(1U<<CC_XDIGIT_),
+/* U+66 'f' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NON_FINAL_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_)|(1U<<CC_XDIGIT_),
+/* U+67 'g' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* U+68 'h' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NON_FINAL_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* U+69 'i' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NON_FINAL_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* U+6A 'j' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NON_FINAL_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* U+6B 'k' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NONLATIN1_SIMPLE_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* U+6C 'l' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* U+6D 'm' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* U+6E 'n' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* U+6F 'o' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* U+70 'p' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* U+71 'q' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* U+72 'r' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* U+73 's' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NONLATIN1_SIMPLE_FOLD_)|(1U<<CC_NON_FINAL_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* U+74 't' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NON_FINAL_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* U+75 'u' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* U+76 'v' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* U+77 'w' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NON_FINAL_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* U+78 'x' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* U+79 'y' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NON_FINAL_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* U+7A 'z' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* U+7B '{' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* U+7C '|' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* U+7D '}' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* U+7E '~' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* U+7F DEL */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+80 PAD */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+81 HOP */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+82 BPH */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+83 NBH */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+84 IND */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+85 NEL */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_)|(1U<<CC_SPACE_)|(1U<<CC_VERTSPACE_),
+/* U+86 SSA */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+87 ESA */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+88 HTS */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+89 HTJ */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+8A VTS */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+8B PLD */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+8C PLU */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+8D RI */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+8E SS2 */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+8F SS3 */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+90 DCS */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+91 PU1 */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+92 PU2 */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+93 STS */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+94 CCH */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+95 MW */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+96 SPA */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+97 EPA */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+98 SOS */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+99 SGC */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+9A SCI */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+9B CSI */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+9C ST */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+9D OSC */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+9E PM */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+9F APC */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+A0 NBSP */ (1U<<CC_BLANK_)|(1U<<CC_PRINT_)|(1U<<CC_QUOTEMETA_)|(1U<<CC_SPACE_),
+/* U+A1 INVERTED '!' */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* U+A2 CENT */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_QUOTEMETA_),
+/* U+A3 POUND */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_QUOTEMETA_),
+/* U+A4 CURRENCY */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_QUOTEMETA_),
+/* U+A5 YEN */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_QUOTEMETA_),
+/* U+A6 BROKEN BAR */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_QUOTEMETA_),
+/* U+A7 SECTION */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* U+A8 DIAERESIS */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_),
+/* U+A9 COPYRIGHT */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_QUOTEMETA_),
+/* U+AA FEMININE ORDINAL */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* U+AB LEFT-POINTING DOUBLE ANGLE QUOTE */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* U+AC NOT */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_QUOTEMETA_),
+/* U+AD SOFT HYPHEN */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_QUOTEMETA_),
+/* U+AE REGISTERED */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_QUOTEMETA_),
+/* U+AF MACRON */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_),
+/* U+B0 DEGREE */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_QUOTEMETA_),
+/* U+B1 PLUS-MINUS */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_QUOTEMETA_),
+/* U+B2 SUPERSCRIPT 2 */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_),
+/* U+B3 SUPERSCRIPT 3 */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_),
+/* U+B4 ACUTE ACCENT */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_),
+/* U+B5 MICRO */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NONLATIN1_SIMPLE_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* U+B6 PILCROW */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* U+B7 MIDDLE DOT */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_),
+/* U+B8 CEDILLA */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_),
+/* U+B9 SUPERSCRIPT 1 */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_),
+/* U+BA MASCULINE ORDINAL */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* U+BB RIGHT-POINTING DOUBLE ANGLE QUOTE */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* U+BC 1/4 */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_),
+/* U+BD 1/2 */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_),
+/* U+BE 3/4 */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_),
+/* U+BF INVERTED '?' */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* U+C0 A with GRAVE */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* U+C1 A with ACUTE */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* U+C2 A with '^' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* U+C3 A with '~' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* U+C4 A with DIAERESIS */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* U+C5 A with RING */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NONLATIN1_SIMPLE_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* U+C6 AE */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* U+C7 C with CEDILLA */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* U+C8 E with GRAVE */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* U+C9 E with ACUTE */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* U+CA E with '^' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* U+CB E with DIAERESIS */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* U+CC I with GRAVE */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* U+CD I with ACUTE */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* U+CE I with '^' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* U+CF I with DIAERESIS */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* U+D0 ETH */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* U+D1 N with '~' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* U+D2 O with GRAVE */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* U+D3 O with ACUTE */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* U+D4 O with '^' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* U+D5 O with '~' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* U+D6 O with DIAERESIS */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* U+D7 MULTIPLICATION */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_QUOTEMETA_),
+/* U+D8 O with '/' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* U+D9 U with GRAVE */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* U+DA U with ACUTE */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* U+DB U with '^' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* U+DC U with DIAERESIS */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* U+DD Y with ACUTE */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* U+DE THORN */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* U+DF sharp s */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NONLATIN1_SIMPLE_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* U+E0 a with grave */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* U+E1 a with acute */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* U+E2 a with '^' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* U+E3 a with '~' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* U+E4 a with diaeresis */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* U+E5 a with ring */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NONLATIN1_SIMPLE_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* U+E6 ae */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* U+E7 c with cedilla */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* U+E8 e with grave */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* U+E9 e with acute */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* U+EA e with '^' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* U+EB e with diaeresis */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* U+EC i with grave */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* U+ED i with acute */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* U+EE i with '^' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* U+EF i with diaeresis */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* U+F0 eth */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* U+F1 n with '~' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* U+F2 o with grave */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* U+F3 o with acute */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* U+F4 o with '^' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* U+F5 o with '~' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* U+F6 o with diaeresis */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* U+F7 DIVISION */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_QUOTEMETA_),
+/* U+F8 o with '/' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* U+F9 u with grave */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* U+FA u with acute */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* U+FB u with '^' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* U+FC u with diaeresis */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* U+FD y with acute */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* U+FE thorn */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* U+FF y with diaeresis */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NONLATIN1_SIMPLE_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_)
 
 #endif /* ASCII/Latin1 */
 
      && '\\' == 224 && '[' == 173 && ']' == 189 && '{' == 192 && '}' == 208 \
      && '^' == 95 && '~' == 161 && '!' == 90 && '#' == 123 && '|' == 79 \
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
-/* U+00 NUL */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+01 SOH */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+02 STX */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+03 ETX */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x04 U+9C ST */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x05 U+09 HT */ (1U<<_CC_ASCII)|(1U<<_CC_BLANK)|(1U<<_CC_CNTRL)|(1U<<_CC_MNEMONIC_CNTRL)|(1U<<_CC_QUOTEMETA)|(1U<<_CC_SPACE),
-/* 0x06 U+86 SSA */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x07 U+7F DEL */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x08 U+97 EPA */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x09 U+8D RI */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x0A U+8E SS2 */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+0B VT */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA)|(1U<<_CC_SPACE)|(1U<<_CC_VERTSPACE),
-/* U+0C FF */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_MNEMONIC_CNTRL)|(1U<<_CC_QUOTEMETA)|(1U<<_CC_SPACE)|(1U<<_CC_VERTSPACE),
-/* U+0D CR */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_MNEMONIC_CNTRL)|(1U<<_CC_QUOTEMETA)|(1U<<_CC_SPACE)|(1U<<_CC_VERTSPACE),
-/* U+0E SO */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+0F SI */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+10 DLE */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+11 DC1 */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+12 DC2 */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+13 DC3 */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x14 U+9D OSC */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x15 U+0A LF */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_MNEMONIC_CNTRL)|(1U<<_CC_QUOTEMETA)|(1U<<_CC_SPACE)|(1U<<_CC_VERTSPACE),
-/* 0x16 U+08 BS */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_MNEMONIC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x17 U+87 ESA */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+18 CAN */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+19 EOM */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x1A U+92 PU2 */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x1B U+8F SS3 */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+1C FS */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+1D GS */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+1E RS */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+1F US */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x20 U+80 PAD */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x21 U+81 HOP */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x22 U+82 BPH */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x23 U+83 NBH */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x24 U+84 IND */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x25 U+85 NEL */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA)|(1U<<_CC_SPACE)|(1U<<_CC_VERTSPACE),
-/* 0x26 U+17 ETB */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x27 U+1B ESC */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_MNEMONIC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x28 U+88 HTS */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x29 U+89 HTJ */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x2A U+8A VTS */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x2B U+8B PLD */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x2C U+8C PLU */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x2D U+05 ENQ */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x2E U+06 ACK */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x2F U+07 BEL */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_MNEMONIC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x30 U+90 DCS */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x31 U+91 PU1 */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x32 U+16 SYN */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x33 U+93 STS */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x34 U+94 CCH */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x35 U+95 MW */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x36 U+96 SPA */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x37 U+04 EOT */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x38 U+98 SOS */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x39 U+99 SGC */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x3A U+9A SCI */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x3B U+9B CSI */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x3C U+14 DC4 */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x3D U+15 NAK */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x3E U+9E PM */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x3F U+1A SUB */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x40 U+20 SP */ (1U<<_CC_ASCII)|(1U<<_CC_BLANK)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA)|(1U<<_CC_SPACE),
-/* 0x41 U+A0 NBSP */ (1U<<_CC_BLANK)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA)|(1U<<_CC_SPACE),
-/* 0x42 U+E2 I8=A1 a with '^' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x43 U+E4 I8=A2 a with diaeresis */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x44 U+E0 I8=A3 a with grave */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x45 U+E1 I8=A4 a with acute */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x46 U+E3 I8=A5 a with '~' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x47 U+E5 I8=A6 a with ring */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NONLATIN1_SIMPLE_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x48 U+E7 I8=A7 c with cedilla */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x49 U+F1 I8=A8 n with '~' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x4A U+A2 I8=A9 CENT */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA),
-/* 0x4B U+2E '.' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x4C U+3C '<' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x4D U+28 '(' */ (1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x4E U+2B '+' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x4F U+7C '|' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x50 U+26 '&' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x51 U+E9 I8=AA e with acute */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x52 U+EA I8=AB e with '^' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x53 U+EB I8=AC e with diaeresis */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x54 U+E8 I8=AD e with grave */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x55 U+ED I8=AE i with acute */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x56 U+EE I8=AF i with '^' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x57 U+EF I8=B0 i with diaeresis */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x58 U+EC I8=B1 i with grave */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x59 U+DF I8=B2 sharp s */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NONLATIN1_SIMPLE_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x5A U+21 '!' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x5B U+24 '$' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x5C U+2A '*' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x5D U+29 ')' */ (1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x5E U+3B ';' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x5F U+5E '^' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x60 U+2D '-' */ (1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x61 U+2F '/' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x62 U+C2 I8=B3 A with '^' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0x63 U+C4 I8=B4 A with DIAERESIS */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0x64 U+C0 I8=B5 A with GRAVE */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0x65 U+C1 I8=B6 A with ACUTE */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0x66 U+C3 I8=B7 A with '~' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0x67 U+C5 I8=B8 A with RING */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NONLATIN1_SIMPLE_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0x68 U+C7 I8=B9 C with CEDILLA */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0x69 U+D1 I8=BA N with '~' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0x6A U+A6 I8=BB BROKEN BAR */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA),
-/* 0x6B U+2C ',' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x6C U+25 '%' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x6D U+5F '_' */ (1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_WORDCHAR),
-/* 0x6E U+3E '>' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x6F U+3F '?' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x70 U+F8 I8=BC o with '/' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x71 U+C9 I8=BD E with ACUTE */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0x72 U+CA I8=BE E with '^' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0x73 U+CB I8=BF E with DIAERESIS */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0x74 U+C8 I8=C0 E with GRAVE */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0x75 U+CD I8=C1 I with ACUTE */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0x76 U+CE I8=C2 I with '^' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0x77 U+CF I8=C3 I with DIAERESIS */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0x78 U+CC I8=C4 I with GRAVE */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0x79 U+60 '`' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x7A U+3A ':' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x7B U+23 '#' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x7C U+40 '@' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x7D U+27 "'" */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x7E U+3D '=' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x7F U+22 '"' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x80 U+D8 I8=C5 O with '/' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0x81 U+61 'a' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT),
-/* 0x82 U+62 'b' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT),
-/* 0x83 U+63 'c' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT),
-/* 0x84 U+64 'd' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT),
-/* 0x85 U+65 'e' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT),
-/* 0x86 U+66 'f' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT),
-/* 0x87 U+67 'g' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x88 U+68 'h' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x89 U+69 'i' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x8A U+AB I8=C6 LEFT-POINTING DOUBLE ANGLE QUOTE */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x8B U+BB I8=C7 RIGHT-POINTING DOUBLE ANGLE QUOTE */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x8C U+F0 I8=C8 eth */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x8D U+FD I8=C9 y with acute */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x8E U+FE I8=CA thorn */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x8F U+B1 I8=CB PLUS-MINUS */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA),
-/* 0x90 U+B0 I8=CC DEGREE */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA),
-/* 0x91 U+6A 'j' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x92 U+6B 'k' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NONLATIN1_SIMPLE_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x93 U+6C 'l' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x94 U+6D 'm' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x95 U+6E 'n' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x96 U+6F 'o' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x97 U+70 'p' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x98 U+71 'q' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x99 U+72 'r' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x9A U+AA I8=CD FEMININE ORDINAL */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x9B U+BA I8=CE MASCULINE ORDINAL */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x9C U+E6 I8=CF ae */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x9D U+B8 I8=D0 CEDILLA */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT),
-/* 0x9E U+C6 I8=D1 AE */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0x9F U+A4 I8=D2 CURRENCY */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA),
-/* 0xA0 U+B5 I8=D3 MICRO */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NONLATIN1_SIMPLE_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0xA1 U+7E '~' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0xA2 U+73 's' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NONLATIN1_SIMPLE_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0xA3 U+74 't' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0xA4 U+75 'u' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0xA5 U+76 'v' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0xA6 U+77 'w' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0xA7 U+78 'x' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0xA8 U+79 'y' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0xA9 U+7A 'z' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0xAA U+A1 I8=D4 INVERTED '!' */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0xAB U+BF I8=D5 INVERTED '?' */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0xAC U+D0 I8=D6 ETH */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0xAD U+5B '[' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0xAE U+DE I8=D7 THORN */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0xAF U+AE I8=D8 REGISTERED */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA),
-/* 0xB0 U+AC I8=D9 NOT */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA),
-/* 0xB1 U+A3 I8=DA POUND */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA),
-/* 0xB2 U+A5 I8=DB YEN */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA),
-/* 0xB3 U+B7 I8=DC MIDDLE DOT */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT),
-/* 0xB4 U+A9 I8=DD COPYRIGHT */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA),
-/* 0xB5 U+A7 I8=DE SECTION */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* U+B6 I8=DF PILCROW */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0xB7 U+BC I8=E0 1/4 */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT),
-/* 0xB8 U+BD I8=E1 1/2 */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT),
-/* 0xB9 U+BE I8=E2 3/4 */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT),
-/* 0xBA U+DD I8=E3 Y with ACUTE */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0xBB U+A8 I8=E4 DIAERESIS */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT),
-/* 0xBC U+AF I8=E5 MACRON */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT),
-/* 0xBD U+5D ']' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0xBE U+B4 I8=E6 ACUTE ACCENT */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT),
-/* 0xBF U+D7 I8=E7 MULTIPLICATION */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA),
-/* 0xC0 U+7B '{' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0xC1 U+41 'A' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT),
-/* 0xC2 U+42 'B' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT),
-/* 0xC3 U+43 'C' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT),
-/* 0xC4 U+44 'D' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT),
-/* 0xC5 U+45 'E' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT),
-/* 0xC6 U+46 'F' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT),
-/* 0xC7 U+47 'G' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0xC8 U+48 'H' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0xC9 U+49 'I' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0xCA U+AD I8=E8 SOFT HYPHEN */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA),
-/* 0xCB U+F4 I8=E9 o with '^' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0xCC U+F6 I8=EA o with diaeresis */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0xCD U+F2 I8=EB o with grave */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0xCE U+F3 I8=EC o with acute */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0xCF U+F5 I8=ED o with '~' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0xD0 U+7D '}' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0xD1 U+4A 'J' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0xD2 U+4B 'K' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NONLATIN1_SIMPLE_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0xD3 U+4C 'L' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0xD4 U+4D 'M' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0xD5 U+4E 'N' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0xD6 U+4F 'O' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0xD7 U+50 'P' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0xD8 U+51 'Q' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0xD9 U+52 'R' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0xDA U+B9 I8=EE SUPERSCRIPT 1 */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT),
-/* 0xDB U+FB I8=EF u with '^' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0xDC U+FC I8=F0 u with diaeresis */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0xDD U+F9 I8=F1 u with grave */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0xDE U+FA I8=F2 u with acute */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0xDF U+FF I8=F3 y with diaeresis */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NONLATIN1_SIMPLE_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0xE0 U+5C '\' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0xE1 U+F7 I8=F4 DIVISION */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA),
-/* 0xE2 U+53 'S' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NONLATIN1_SIMPLE_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0xE3 U+54 'T' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0xE4 U+55 'U' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0xE5 U+56 'V' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0xE6 U+57 'W' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0xE7 U+58 'X' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0xE8 U+59 'Y' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0xE9 U+5A 'Z' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0xEA U+B2 I8=F5 SUPERSCRIPT 2 */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT),
-/* 0xEB U+D4 I8=F6 O with '^' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0xEC U+D6 I8=F7 O with DIAERESIS */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0xED U+D2 I8=F8 O with GRAVE */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0xEE U+D3 I8=F9 O with ACUTE */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0xEF U+D5 I8=FA O with '~' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0xF0 U+30 '0' */ (1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_BINDIGIT)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_DIGIT)|(1U<<_CC_GRAPH)|(1U<<_CC_OCTDIGIT)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT),
-/* 0xF1 U+31 '1' */ (1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_BINDIGIT)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_DIGIT)|(1U<<_CC_GRAPH)|(1U<<_CC_OCTDIGIT)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT),
-/* 0xF2 U+32 '2' */ (1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_DIGIT)|(1U<<_CC_GRAPH)|(1U<<_CC_OCTDIGIT)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT),
-/* 0xF3 U+33 '3' */ (1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_DIGIT)|(1U<<_CC_GRAPH)|(1U<<_CC_OCTDIGIT)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT),
-/* 0xF4 U+34 '4' */ (1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_DIGIT)|(1U<<_CC_GRAPH)|(1U<<_CC_OCTDIGIT)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT),
-/* 0xF5 U+35 '5' */ (1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_DIGIT)|(1U<<_CC_GRAPH)|(1U<<_CC_OCTDIGIT)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT),
-/* 0xF6 U+36 '6' */ (1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_DIGIT)|(1U<<_CC_GRAPH)|(1U<<_CC_OCTDIGIT)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT),
-/* 0xF7 U+37 '7' */ (1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_DIGIT)|(1U<<_CC_GRAPH)|(1U<<_CC_OCTDIGIT)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT),
-/* 0xF8 U+38 '8' */ (1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_DIGIT)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT),
-/* 0xF9 U+39 '9' */ (1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_DIGIT)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT),
-/* 0xFA U+B3 I8=FB SUPERSCRIPT 3 */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT),
-/* 0xFB U+DB I8=FC U with '^' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0xFC U+DC I8=FD U with DIAERESIS */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0xFD U+D9 I8=FE U with GRAVE */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0xFE U+DA I8=FF U with ACUTE */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0xFF U+9F APC */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA)
+/* U+00 NUL */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+01 SOH */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+02 STX */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+03 ETX */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x04 U+9C ST */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x05 U+09 HT */ (1U<<CC_ASCII_)|(1U<<CC_BLANK_)|(1U<<CC_CNTRL_)|(1U<<CC_MNEMONIC_CNTRL_)|(1U<<CC_QUOTEMETA_)|(1U<<CC_SPACE_),
+/* 0x06 U+86 SSA */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x07 U+7F DEL */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x08 U+97 EPA */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x09 U+8D RI */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x0A U+8E SS2 */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+0B VT */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_)|(1U<<CC_SPACE_)|(1U<<CC_VERTSPACE_),
+/* U+0C FF */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_MNEMONIC_CNTRL_)|(1U<<CC_QUOTEMETA_)|(1U<<CC_SPACE_)|(1U<<CC_VERTSPACE_),
+/* U+0D CR */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_MNEMONIC_CNTRL_)|(1U<<CC_QUOTEMETA_)|(1U<<CC_SPACE_)|(1U<<CC_VERTSPACE_),
+/* U+0E SO */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+0F SI */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+10 DLE */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+11 DC1 */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+12 DC2 */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+13 DC3 */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x14 U+9D OSC */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x15 U+0A LF */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_MNEMONIC_CNTRL_)|(1U<<CC_QUOTEMETA_)|(1U<<CC_SPACE_)|(1U<<CC_VERTSPACE_),
+/* 0x16 U+08 BS */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_MNEMONIC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x17 U+87 ESA */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+18 CAN */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+19 EOM */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x1A U+92 PU2 */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x1B U+8F SS3 */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+1C FS */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+1D GS */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+1E RS */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+1F US */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x20 U+80 PAD */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x21 U+81 HOP */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x22 U+82 BPH */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x23 U+83 NBH */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x24 U+84 IND */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x25 U+85 NEL */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_)|(1U<<CC_SPACE_)|(1U<<CC_VERTSPACE_),
+/* 0x26 U+17 ETB */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x27 U+1B ESC */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_MNEMONIC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x28 U+88 HTS */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x29 U+89 HTJ */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x2A U+8A VTS */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x2B U+8B PLD */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x2C U+8C PLU */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x2D U+05 ENQ */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x2E U+06 ACK */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x2F U+07 BEL */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_MNEMONIC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x30 U+90 DCS */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x31 U+91 PU1 */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x32 U+16 SYN */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x33 U+93 STS */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x34 U+94 CCH */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x35 U+95 MW */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x36 U+96 SPA */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x37 U+04 EOT */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x38 U+98 SOS */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x39 U+99 SGC */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x3A U+9A SCI */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x3B U+9B CSI */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x3C U+14 DC4 */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x3D U+15 NAK */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x3E U+9E PM */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x3F U+1A SUB */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x40 U+20 SP */ (1U<<CC_ASCII_)|(1U<<CC_BLANK_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_PRINT_)|(1U<<CC_QUOTEMETA_)|(1U<<CC_SPACE_),
+/* 0x41 U+A0 NBSP */ (1U<<CC_BLANK_)|(1U<<CC_PRINT_)|(1U<<CC_QUOTEMETA_)|(1U<<CC_SPACE_),
+/* 0x42 U+E2 I8=A1 a with '^' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x43 U+E4 I8=A2 a with diaeresis */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x44 U+E0 I8=A3 a with grave */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x45 U+E1 I8=A4 a with acute */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x46 U+E3 I8=A5 a with '~' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x47 U+E5 I8=A6 a with ring */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NONLATIN1_SIMPLE_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x48 U+E7 I8=A7 c with cedilla */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x49 U+F1 I8=A8 n with '~' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x4A U+A2 I8=A9 CENT */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_QUOTEMETA_),
+/* 0x4B U+2E '.' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x4C U+3C '<' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x4D U+28 '(' */ (1U<<CC_ASCII_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x4E U+2B '+' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x4F U+7C '|' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x50 U+26 '&' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x51 U+E9 I8=AA e with acute */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x52 U+EA I8=AB e with '^' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x53 U+EB I8=AC e with diaeresis */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x54 U+E8 I8=AD e with grave */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x55 U+ED I8=AE i with acute */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x56 U+EE I8=AF i with '^' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x57 U+EF I8=B0 i with diaeresis */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x58 U+EC I8=B1 i with grave */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x59 U+DF I8=B2 sharp s */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NONLATIN1_SIMPLE_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x5A U+21 '!' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x5B U+24 '$' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x5C U+2A '*' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x5D U+29 ')' */ (1U<<CC_ASCII_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x5E U+3B ';' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x5F U+5E '^' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x60 U+2D '-' */ (1U<<CC_ASCII_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x61 U+2F '/' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x62 U+C2 I8=B3 A with '^' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0x63 U+C4 I8=B4 A with DIAERESIS */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0x64 U+C0 I8=B5 A with GRAVE */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0x65 U+C1 I8=B6 A with ACUTE */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0x66 U+C3 I8=B7 A with '~' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0x67 U+C5 I8=B8 A with RING */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NONLATIN1_SIMPLE_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0x68 U+C7 I8=B9 C with CEDILLA */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0x69 U+D1 I8=BA N with '~' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0x6A U+A6 I8=BB BROKEN BAR */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_QUOTEMETA_),
+/* 0x6B U+2C ',' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x6C U+25 '%' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x6D U+5F '_' */ (1U<<CC_ASCII_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_WORDCHAR_),
+/* 0x6E U+3E '>' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x6F U+3F '?' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x70 U+F8 I8=BC o with '/' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x71 U+C9 I8=BD E with ACUTE */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0x72 U+CA I8=BE E with '^' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0x73 U+CB I8=BF E with DIAERESIS */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0x74 U+C8 I8=C0 E with GRAVE */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0x75 U+CD I8=C1 I with ACUTE */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0x76 U+CE I8=C2 I with '^' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0x77 U+CF I8=C3 I with DIAERESIS */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0x78 U+CC I8=C4 I with GRAVE */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0x79 U+60 '`' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x7A U+3A ':' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x7B U+23 '#' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x7C U+40 '@' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x7D U+27 "'" */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x7E U+3D '=' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x7F U+22 '"' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x80 U+D8 I8=C5 O with '/' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0x81 U+61 'a' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NON_FINAL_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_)|(1U<<CC_XDIGIT_),
+/* 0x82 U+62 'b' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_)|(1U<<CC_XDIGIT_),
+/* 0x83 U+63 'c' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_)|(1U<<CC_XDIGIT_),
+/* 0x84 U+64 'd' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_)|(1U<<CC_XDIGIT_),
+/* 0x85 U+65 'e' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_)|(1U<<CC_XDIGIT_),
+/* 0x86 U+66 'f' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NON_FINAL_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_)|(1U<<CC_XDIGIT_),
+/* 0x87 U+67 'g' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x88 U+68 'h' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NON_FINAL_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x89 U+69 'i' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NON_FINAL_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x8A U+AB I8=C6 LEFT-POINTING DOUBLE ANGLE QUOTE */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x8B U+BB I8=C7 RIGHT-POINTING DOUBLE ANGLE QUOTE */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x8C U+F0 I8=C8 eth */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x8D U+FD I8=C9 y with acute */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x8E U+FE I8=CA thorn */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x8F U+B1 I8=CB PLUS-MINUS */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_QUOTEMETA_),
+/* 0x90 U+B0 I8=CC DEGREE */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_QUOTEMETA_),
+/* 0x91 U+6A 'j' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NON_FINAL_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x92 U+6B 'k' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NONLATIN1_SIMPLE_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x93 U+6C 'l' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x94 U+6D 'm' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x95 U+6E 'n' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x96 U+6F 'o' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x97 U+70 'p' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x98 U+71 'q' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x99 U+72 'r' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x9A U+AA I8=CD FEMININE ORDINAL */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x9B U+BA I8=CE MASCULINE ORDINAL */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x9C U+E6 I8=CF ae */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x9D U+B8 I8=D0 CEDILLA */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_),
+/* 0x9E U+C6 I8=D1 AE */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0x9F U+A4 I8=D2 CURRENCY */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_QUOTEMETA_),
+/* 0xA0 U+B5 I8=D3 MICRO */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NONLATIN1_SIMPLE_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0xA1 U+7E '~' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0xA2 U+73 's' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NONLATIN1_SIMPLE_FOLD_)|(1U<<CC_NON_FINAL_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0xA3 U+74 't' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NON_FINAL_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0xA4 U+75 'u' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0xA5 U+76 'v' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0xA6 U+77 'w' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NON_FINAL_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0xA7 U+78 'x' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0xA8 U+79 'y' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NON_FINAL_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0xA9 U+7A 'z' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0xAA U+A1 I8=D4 INVERTED '!' */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0xAB U+BF I8=D5 INVERTED '?' */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0xAC U+D0 I8=D6 ETH */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0xAD U+5B '[' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0xAE U+DE I8=D7 THORN */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0xAF U+AE I8=D8 REGISTERED */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_QUOTEMETA_),
+/* 0xB0 U+AC I8=D9 NOT */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_QUOTEMETA_),
+/* 0xB1 U+A3 I8=DA POUND */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_QUOTEMETA_),
+/* 0xB2 U+A5 I8=DB YEN */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_QUOTEMETA_),
+/* 0xB3 U+B7 I8=DC MIDDLE DOT */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_),
+/* 0xB4 U+A9 I8=DD COPYRIGHT */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_QUOTEMETA_),
+/* 0xB5 U+A7 I8=DE SECTION */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* U+B6 I8=DF PILCROW */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0xB7 U+BC I8=E0 1/4 */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_),
+/* 0xB8 U+BD I8=E1 1/2 */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_),
+/* 0xB9 U+BE I8=E2 3/4 */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_),
+/* 0xBA U+DD I8=E3 Y with ACUTE */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0xBB U+A8 I8=E4 DIAERESIS */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_),
+/* 0xBC U+AF I8=E5 MACRON */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_),
+/* 0xBD U+5D ']' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0xBE U+B4 I8=E6 ACUTE ACCENT */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_),
+/* 0xBF U+D7 I8=E7 MULTIPLICATION */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_QUOTEMETA_),
+/* 0xC0 U+7B '{' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0xC1 U+41 'A' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NON_FINAL_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_)|(1U<<CC_XDIGIT_),
+/* 0xC2 U+42 'B' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_)|(1U<<CC_XDIGIT_),
+/* 0xC3 U+43 'C' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_)|(1U<<CC_XDIGIT_),
+/* 0xC4 U+44 'D' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_)|(1U<<CC_XDIGIT_),
+/* 0xC5 U+45 'E' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_)|(1U<<CC_XDIGIT_),
+/* 0xC6 U+46 'F' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NON_FINAL_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_)|(1U<<CC_XDIGIT_),
+/* 0xC7 U+47 'G' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0xC8 U+48 'H' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NON_FINAL_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0xC9 U+49 'I' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NON_FINAL_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0xCA U+AD I8=E8 SOFT HYPHEN */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_QUOTEMETA_),
+/* 0xCB U+F4 I8=E9 o with '^' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0xCC U+F6 I8=EA o with diaeresis */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0xCD U+F2 I8=EB o with grave */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0xCE U+F3 I8=EC o with acute */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0xCF U+F5 I8=ED o with '~' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0xD0 U+7D '}' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0xD1 U+4A 'J' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NON_FINAL_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0xD2 U+4B 'K' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NONLATIN1_SIMPLE_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0xD3 U+4C 'L' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0xD4 U+4D 'M' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0xD5 U+4E 'N' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0xD6 U+4F 'O' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0xD7 U+50 'P' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0xD8 U+51 'Q' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0xD9 U+52 'R' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0xDA U+B9 I8=EE SUPERSCRIPT 1 */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_),
+/* 0xDB U+FB I8=EF u with '^' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0xDC U+FC I8=F0 u with diaeresis */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0xDD U+F9 I8=F1 u with grave */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0xDE U+FA I8=F2 u with acute */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0xDF U+FF I8=F3 y with diaeresis */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NONLATIN1_SIMPLE_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0xE0 U+5C '\' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0xE1 U+F7 I8=F4 DIVISION */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_QUOTEMETA_),
+/* 0xE2 U+53 'S' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NONLATIN1_SIMPLE_FOLD_)|(1U<<CC_NON_FINAL_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0xE3 U+54 'T' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NON_FINAL_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0xE4 U+55 'U' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0xE5 U+56 'V' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0xE6 U+57 'W' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NON_FINAL_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0xE7 U+58 'X' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0xE8 U+59 'Y' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NON_FINAL_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0xE9 U+5A 'Z' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0xEA U+B2 I8=F5 SUPERSCRIPT 2 */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_),
+/* 0xEB U+D4 I8=F6 O with '^' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0xEC U+D6 I8=F7 O with DIAERESIS */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0xED U+D2 I8=F8 O with GRAVE */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0xEE U+D3 I8=F9 O with ACUTE */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0xEF U+D5 I8=FA O with '~' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0xF0 U+30 '0' */ (1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_BINDIGIT_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_DIGIT_)|(1U<<CC_GRAPH_)|(1U<<CC_OCTDIGIT_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_)|(1U<<CC_XDIGIT_),
+/* 0xF1 U+31 '1' */ (1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_BINDIGIT_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_DIGIT_)|(1U<<CC_GRAPH_)|(1U<<CC_OCTDIGIT_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_)|(1U<<CC_XDIGIT_),
+/* 0xF2 U+32 '2' */ (1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_DIGIT_)|(1U<<CC_GRAPH_)|(1U<<CC_OCTDIGIT_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_)|(1U<<CC_XDIGIT_),
+/* 0xF3 U+33 '3' */ (1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_DIGIT_)|(1U<<CC_GRAPH_)|(1U<<CC_OCTDIGIT_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_)|(1U<<CC_XDIGIT_),
+/* 0xF4 U+34 '4' */ (1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_DIGIT_)|(1U<<CC_GRAPH_)|(1U<<CC_OCTDIGIT_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_)|(1U<<CC_XDIGIT_),
+/* 0xF5 U+35 '5' */ (1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_DIGIT_)|(1U<<CC_GRAPH_)|(1U<<CC_OCTDIGIT_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_)|(1U<<CC_XDIGIT_),
+/* 0xF6 U+36 '6' */ (1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_DIGIT_)|(1U<<CC_GRAPH_)|(1U<<CC_OCTDIGIT_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_)|(1U<<CC_XDIGIT_),
+/* 0xF7 U+37 '7' */ (1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_DIGIT_)|(1U<<CC_GRAPH_)|(1U<<CC_OCTDIGIT_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_)|(1U<<CC_XDIGIT_),
+/* 0xF8 U+38 '8' */ (1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_DIGIT_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_)|(1U<<CC_XDIGIT_),
+/* 0xF9 U+39 '9' */ (1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_DIGIT_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_)|(1U<<CC_XDIGIT_),
+/* 0xFA U+B3 I8=FB SUPERSCRIPT 3 */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_),
+/* 0xFB U+DB I8=FC U with '^' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0xFC U+DC I8=FD U with DIAERESIS */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0xFD U+D9 I8=FE U with GRAVE */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0xFE U+DA I8=FF U with ACUTE */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0xFF U+9F APC */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_)
 
 #endif /* EBCDIC 1047 */
 
      && '\\' == 224 && '[' == 186 && ']' == 187 && '{' == 192 && '}' == 208 \
      && '^' == 176 && '~' == 161 && '!' == 90 && '#' == 123 && '|' == 79 \
      && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
-/* U+00 NUL */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+01 SOH */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+02 STX */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+03 ETX */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x04 U+9C ST */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x05 U+09 HT */ (1U<<_CC_ASCII)|(1U<<_CC_BLANK)|(1U<<_CC_CNTRL)|(1U<<_CC_MNEMONIC_CNTRL)|(1U<<_CC_QUOTEMETA)|(1U<<_CC_SPACE),
-/* 0x06 U+86 SSA */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x07 U+7F DEL */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x08 U+97 EPA */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x09 U+8D RI */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x0A U+8E SS2 */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+0B VT */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA)|(1U<<_CC_SPACE)|(1U<<_CC_VERTSPACE),
-/* U+0C FF */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_MNEMONIC_CNTRL)|(1U<<_CC_QUOTEMETA)|(1U<<_CC_SPACE)|(1U<<_CC_VERTSPACE),
-/* U+0D CR */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_MNEMONIC_CNTRL)|(1U<<_CC_QUOTEMETA)|(1U<<_CC_SPACE)|(1U<<_CC_VERTSPACE),
-/* U+0E SO */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+0F SI */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+10 DLE */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+11 DC1 */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+12 DC2 */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+13 DC3 */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x14 U+9D OSC */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x15 U+85 NEL */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA)|(1U<<_CC_SPACE)|(1U<<_CC_VERTSPACE),
-/* 0x16 U+08 BS */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_MNEMONIC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x17 U+87 ESA */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+18 CAN */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+19 EOM */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x1A U+92 PU2 */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x1B U+8F SS3 */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+1C FS */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+1D GS */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+1E RS */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* U+1F US */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x20 U+80 PAD */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x21 U+81 HOP */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x22 U+82 BPH */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x23 U+83 NBH */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x24 U+84 IND */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x25 U+0A LF */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_MNEMONIC_CNTRL)|(1U<<_CC_QUOTEMETA)|(1U<<_CC_SPACE)|(1U<<_CC_VERTSPACE),
-/* 0x26 U+17 ETB */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x27 U+1B ESC */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_MNEMONIC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x28 U+88 HTS */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x29 U+89 HTJ */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x2A U+8A VTS */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x2B U+8B PLD */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x2C U+8C PLU */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x2D U+05 ENQ */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x2E U+06 ACK */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x2F U+07 BEL */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_MNEMONIC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x30 U+90 DCS */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x31 U+91 PU1 */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x32 U+16 SYN */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x33 U+93 STS */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x34 U+94 CCH */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x35 U+95 MW */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x36 U+96 SPA */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x37 U+04 EOT */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x38 U+98 SOS */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x39 U+99 SGC */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x3A U+9A SCI */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x3B U+9B CSI */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x3C U+14 DC4 */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x3D U+15 NAK */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x3E U+9E PM */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x3F U+1A SUB */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x40 U+20 SP */ (1U<<_CC_ASCII)|(1U<<_CC_BLANK)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA)|(1U<<_CC_SPACE),
-/* 0x41 U+A0 NBSP */ (1U<<_CC_BLANK)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA)|(1U<<_CC_SPACE),
-/* 0x42 U+E2 I8=A1 a with '^' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x43 U+E4 I8=A2 a with diaeresis */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x44 U+E0 I8=A3 a with grave */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x45 U+E1 I8=A4 a with acute */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x46 U+E3 I8=A5 a with '~' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x47 U+E5 I8=A6 a with ring */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NONLATIN1_SIMPLE_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x48 U+E7 I8=A7 c with cedilla */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x49 U+F1 I8=A8 n with '~' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x4A U+A2 I8=A9 CENT */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA),
-/* 0x4B U+2E '.' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x4C U+3C '<' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x4D U+28 '(' */ (1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x4E U+2B '+' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x4F U+7C '|' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x50 U+26 '&' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x51 U+E9 I8=AA e with acute */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x52 U+EA I8=AB e with '^' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x53 U+EB I8=AC e with diaeresis */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x54 U+E8 I8=AD e with grave */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x55 U+ED I8=AE i with acute */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x56 U+EE I8=AF i with '^' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x57 U+EF I8=B0 i with diaeresis */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x58 U+EC I8=B1 i with grave */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x59 U+DF I8=B2 sharp s */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NONLATIN1_SIMPLE_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x5A U+21 '!' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x5B U+24 '$' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x5C U+2A '*' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x5D U+29 ')' */ (1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x5E U+3B ';' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x5F U+AC I8=B3 NOT */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA),
-/* 0x60 U+2D '-' */ (1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x61 U+2F '/' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x62 U+C2 I8=B4 A with '^' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0x63 U+C4 I8=B5 A with DIAERESIS */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0x64 U+C0 I8=B6 A with GRAVE */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0x65 U+C1 I8=B7 A with ACUTE */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0x66 U+C3 I8=B8 A with '~' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0x67 U+C5 I8=B9 A with RING */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NONLATIN1_SIMPLE_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0x68 U+C7 I8=BA C with CEDILLA */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0x69 U+D1 I8=BB N with '~' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0x6A U+A6 I8=BC BROKEN BAR */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA),
-/* 0x6B U+2C ',' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x6C U+25 '%' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x6D U+5F '_' */ (1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_WORDCHAR),
-/* 0x6E U+3E '>' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x6F U+3F '?' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x70 U+F8 I8=BD o with '/' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x71 U+C9 I8=BE E with ACUTE */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0x72 U+CA I8=BF E with '^' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0x73 U+CB I8=C0 E with DIAERESIS */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0x74 U+C8 I8=C1 E with GRAVE */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0x75 U+CD I8=C2 I with ACUTE */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0x76 U+CE I8=C3 I with '^' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0x77 U+CF I8=C4 I with DIAERESIS */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0x78 U+CC I8=C5 I with GRAVE */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0x79 U+60 '`' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x7A U+3A ':' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x7B U+23 '#' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x7C U+40 '@' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x7D U+27 "'" */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x7E U+3D '=' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x7F U+22 '"' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x80 U+D8 I8=C6 O with '/' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0x81 U+61 'a' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT),
-/* 0x82 U+62 'b' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT),
-/* 0x83 U+63 'c' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT),
-/* 0x84 U+64 'd' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT),
-/* 0x85 U+65 'e' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT),
-/* 0x86 U+66 'f' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT),
-/* 0x87 U+67 'g' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x88 U+68 'h' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x89 U+69 'i' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x8A U+AB I8=C7 LEFT-POINTING DOUBLE ANGLE QUOTE */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x8B U+BB I8=C8 RIGHT-POINTING DOUBLE ANGLE QUOTE */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x8C U+F0 I8=C9 eth */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x8D U+FD I8=CA y with acute */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x8E U+FE I8=CB thorn */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x8F U+B1 I8=CC PLUS-MINUS */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA),
-/* 0x90 U+B0 I8=CD DEGREE */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA),
-/* 0x91 U+6A 'j' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x92 U+6B 'k' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NONLATIN1_SIMPLE_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x93 U+6C 'l' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x94 U+6D 'm' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x95 U+6E 'n' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x96 U+6F 'o' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x97 U+70 'p' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x98 U+71 'q' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x99 U+72 'r' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x9A U+AA I8=CE FEMININE ORDINAL */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x9B U+BA I8=CF MASCULINE ORDINAL */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x9C U+E6 I8=D0 ae */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0x9D U+B8 I8=D1 CEDILLA */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT),
-/* 0x9E U+C6 I8=D2 AE */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0x9F U+A4 I8=D3 CURRENCY */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA),
-/* 0xA0 U+B5 I8=D4 MICRO */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NONLATIN1_SIMPLE_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0xA1 U+7E '~' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0xA2 U+73 's' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NONLATIN1_SIMPLE_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0xA3 U+74 't' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0xA4 U+75 'u' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0xA5 U+76 'v' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0xA6 U+77 'w' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0xA7 U+78 'x' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0xA8 U+79 'y' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0xA9 U+7A 'z' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0xAA U+A1 I8=D5 INVERTED '!' */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0xAB U+BF I8=D6 INVERTED '?' */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0xAC U+D0 I8=D7 ETH */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0xAD U+DD I8=D8 Y with ACUTE */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0xAE U+DE I8=D9 THORN */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0xAF U+AE I8=DA REGISTERED */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA),
-/* 0xB0 U+5E '^' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0xB1 U+A3 I8=DB POUND */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA),
-/* 0xB2 U+A5 I8=DC YEN */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA),
-/* 0xB3 U+B7 I8=DD MIDDLE DOT */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT),
-/* 0xB4 U+A9 I8=DE COPYRIGHT */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA),
-/* 0xB5 U+A7 I8=DF SECTION */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* U+B6 I8=E0 PILCROW */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0xB7 U+BC I8=E1 1/4 */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT),
-/* 0xB8 U+BD I8=E2 1/2 */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT),
-/* 0xB9 U+BE I8=E3 3/4 */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT),
-/* 0xBA U+5B '[' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0xBB U+5D ']' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0xBC U+AF I8=E4 MACRON */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT),
-/* 0xBD U+A8 I8=E5 DIAERESIS */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT),
-/* 0xBE U+B4 I8=E6 ACUTE ACCENT */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT),
-/* 0xBF U+D7 I8=E7 MULTIPLICATION */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA),
-/* 0xC0 U+7B '{' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0xC1 U+41 'A' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT),
-/* 0xC2 U+42 'B' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT),
-/* 0xC3 U+43 'C' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT),
-/* 0xC4 U+44 'D' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT),
-/* 0xC5 U+45 'E' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT),
-/* 0xC6 U+46 'F' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT),
-/* 0xC7 U+47 'G' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0xC8 U+48 'H' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0xC9 U+49 'I' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0xCA U+AD I8=E8 SOFT HYPHEN */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA),
-/* 0xCB U+F4 I8=E9 o with '^' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0xCC U+F6 I8=EA o with diaeresis */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0xCD U+F2 I8=EB o with grave */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0xCE U+F3 I8=EC o with acute */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0xCF U+F5 I8=ED o with '~' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0xD0 U+7D '}' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0xD1 U+4A 'J' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0xD2 U+4B 'K' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NONLATIN1_SIMPLE_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0xD3 U+4C 'L' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0xD4 U+4D 'M' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0xD5 U+4E 'N' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0xD6 U+4F 'O' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0xD7 U+50 'P' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0xD8 U+51 'Q' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0xD9 U+52 'R' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0xDA U+B9 I8=EE SUPERSCRIPT 1 */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT),
-/* 0xDB U+FB I8=EF u with '^' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0xDC U+FC I8=F0 u with diaeresis */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0xDD U+F9 I8=F1 u with grave */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0xDE U+FA I8=F2 u with acute */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0xDF U+FF I8=F3 y with diaeresis */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NONLATIN1_SIMPLE_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR),
-/* 0xE0 U+5C '\' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0xE1 U+F7 I8=F4 DIVISION */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA),
-/* 0xE2 U+53 'S' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NONLATIN1_SIMPLE_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0xE3 U+54 'T' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0xE4 U+55 'U' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0xE5 U+56 'V' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0xE6 U+57 'W' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0xE7 U+58 'X' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0xE8 U+59 'Y' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0xE9 U+5A 'Z' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0xEA U+B2 I8=F5 SUPERSCRIPT 2 */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT),
-/* 0xEB U+D4 I8=F6 O with '^' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0xEC U+D6 I8=F7 O with DIAERESIS */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0xED U+D2 I8=F8 O with GRAVE */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0xEE U+D3 I8=F9 O with ACUTE */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0xEF U+D5 I8=FA O with '~' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0xF0 U+30 '0' */ (1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_BINDIGIT)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_DIGIT)|(1U<<_CC_GRAPH)|(1U<<_CC_OCTDIGIT)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT),
-/* 0xF1 U+31 '1' */ (1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_BINDIGIT)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_DIGIT)|(1U<<_CC_GRAPH)|(1U<<_CC_OCTDIGIT)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT),
-/* 0xF2 U+32 '2' */ (1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_DIGIT)|(1U<<_CC_GRAPH)|(1U<<_CC_OCTDIGIT)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT),
-/* 0xF3 U+33 '3' */ (1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_DIGIT)|(1U<<_CC_GRAPH)|(1U<<_CC_OCTDIGIT)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT),
-/* 0xF4 U+34 '4' */ (1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_DIGIT)|(1U<<_CC_GRAPH)|(1U<<_CC_OCTDIGIT)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT),
-/* 0xF5 U+35 '5' */ (1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_DIGIT)|(1U<<_CC_GRAPH)|(1U<<_CC_OCTDIGIT)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT),
-/* 0xF6 U+36 '6' */ (1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_DIGIT)|(1U<<_CC_GRAPH)|(1U<<_CC_OCTDIGIT)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT),
-/* 0xF7 U+37 '7' */ (1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_DIGIT)|(1U<<_CC_GRAPH)|(1U<<_CC_OCTDIGIT)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT),
-/* 0xF8 U+38 '8' */ (1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_DIGIT)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT),
-/* 0xF9 U+39 '9' */ (1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_DIGIT)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT),
-/* 0xFA U+B3 I8=FB SUPERSCRIPT 3 */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT),
-/* 0xFB U+DB I8=FC U with '^' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0xFC U+DC I8=FD U with DIAERESIS */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0xFD U+D9 I8=FE U with GRAVE */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0xFE U+DA I8=FF U with ACUTE */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR),
-/* 0xFF U+9F APC */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA)
+/* U+00 NUL */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+01 SOH */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+02 STX */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+03 ETX */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x04 U+9C ST */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x05 U+09 HT */ (1U<<CC_ASCII_)|(1U<<CC_BLANK_)|(1U<<CC_CNTRL_)|(1U<<CC_MNEMONIC_CNTRL_)|(1U<<CC_QUOTEMETA_)|(1U<<CC_SPACE_),
+/* 0x06 U+86 SSA */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x07 U+7F DEL */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x08 U+97 EPA */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x09 U+8D RI */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x0A U+8E SS2 */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+0B VT */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_)|(1U<<CC_SPACE_)|(1U<<CC_VERTSPACE_),
+/* U+0C FF */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_MNEMONIC_CNTRL_)|(1U<<CC_QUOTEMETA_)|(1U<<CC_SPACE_)|(1U<<CC_VERTSPACE_),
+/* U+0D CR */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_MNEMONIC_CNTRL_)|(1U<<CC_QUOTEMETA_)|(1U<<CC_SPACE_)|(1U<<CC_VERTSPACE_),
+/* U+0E SO */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+0F SI */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+10 DLE */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+11 DC1 */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+12 DC2 */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+13 DC3 */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x14 U+9D OSC */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x15 U+85 NEL */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_)|(1U<<CC_SPACE_)|(1U<<CC_VERTSPACE_),
+/* 0x16 U+08 BS */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_MNEMONIC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x17 U+87 ESA */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+18 CAN */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+19 EOM */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x1A U+92 PU2 */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x1B U+8F SS3 */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+1C FS */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+1D GS */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+1E RS */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* U+1F US */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x20 U+80 PAD */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x21 U+81 HOP */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x22 U+82 BPH */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x23 U+83 NBH */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x24 U+84 IND */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x25 U+0A LF */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_MNEMONIC_CNTRL_)|(1U<<CC_QUOTEMETA_)|(1U<<CC_SPACE_)|(1U<<CC_VERTSPACE_),
+/* 0x26 U+17 ETB */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x27 U+1B ESC */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_MNEMONIC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x28 U+88 HTS */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x29 U+89 HTJ */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x2A U+8A VTS */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x2B U+8B PLD */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x2C U+8C PLU */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x2D U+05 ENQ */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x2E U+06 ACK */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x2F U+07 BEL */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_MNEMONIC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x30 U+90 DCS */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x31 U+91 PU1 */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x32 U+16 SYN */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x33 U+93 STS */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x34 U+94 CCH */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x35 U+95 MW */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x36 U+96 SPA */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x37 U+04 EOT */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x38 U+98 SOS */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x39 U+99 SGC */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x3A U+9A SCI */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x3B U+9B CSI */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x3C U+14 DC4 */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x3D U+15 NAK */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x3E U+9E PM */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x3F U+1A SUB */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x40 U+20 SP */ (1U<<CC_ASCII_)|(1U<<CC_BLANK_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_PRINT_)|(1U<<CC_QUOTEMETA_)|(1U<<CC_SPACE_),
+/* 0x41 U+A0 NBSP */ (1U<<CC_BLANK_)|(1U<<CC_PRINT_)|(1U<<CC_QUOTEMETA_)|(1U<<CC_SPACE_),
+/* 0x42 U+E2 I8=A1 a with '^' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x43 U+E4 I8=A2 a with diaeresis */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x44 U+E0 I8=A3 a with grave */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x45 U+E1 I8=A4 a with acute */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x46 U+E3 I8=A5 a with '~' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x47 U+E5 I8=A6 a with ring */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NONLATIN1_SIMPLE_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x48 U+E7 I8=A7 c with cedilla */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x49 U+F1 I8=A8 n with '~' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x4A U+A2 I8=A9 CENT */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_QUOTEMETA_),
+/* 0x4B U+2E '.' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x4C U+3C '<' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x4D U+28 '(' */ (1U<<CC_ASCII_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x4E U+2B '+' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x4F U+7C '|' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x50 U+26 '&' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x51 U+E9 I8=AA e with acute */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x52 U+EA I8=AB e with '^' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x53 U+EB I8=AC e with diaeresis */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x54 U+E8 I8=AD e with grave */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x55 U+ED I8=AE i with acute */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x56 U+EE I8=AF i with '^' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x57 U+EF I8=B0 i with diaeresis */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x58 U+EC I8=B1 i with grave */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x59 U+DF I8=B2 sharp s */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NONLATIN1_SIMPLE_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x5A U+21 '!' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x5B U+24 '$' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x5C U+2A '*' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x5D U+29 ')' */ (1U<<CC_ASCII_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x5E U+3B ';' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x5F U+AC I8=B3 NOT */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_QUOTEMETA_),
+/* 0x60 U+2D '-' */ (1U<<CC_ASCII_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x61 U+2F '/' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x62 U+C2 I8=B4 A with '^' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0x63 U+C4 I8=B5 A with DIAERESIS */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0x64 U+C0 I8=B6 A with GRAVE */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0x65 U+C1 I8=B7 A with ACUTE */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0x66 U+C3 I8=B8 A with '~' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0x67 U+C5 I8=B9 A with RING */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NONLATIN1_SIMPLE_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0x68 U+C7 I8=BA C with CEDILLA */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0x69 U+D1 I8=BB N with '~' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0x6A U+A6 I8=BC BROKEN BAR */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_QUOTEMETA_),
+/* 0x6B U+2C ',' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x6C U+25 '%' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x6D U+5F '_' */ (1U<<CC_ASCII_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_WORDCHAR_),
+/* 0x6E U+3E '>' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x6F U+3F '?' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x70 U+F8 I8=BD o with '/' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x71 U+C9 I8=BE E with ACUTE */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0x72 U+CA I8=BF E with '^' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0x73 U+CB I8=C0 E with DIAERESIS */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0x74 U+C8 I8=C1 E with GRAVE */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0x75 U+CD I8=C2 I with ACUTE */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0x76 U+CE I8=C3 I with '^' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0x77 U+CF I8=C4 I with DIAERESIS */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0x78 U+CC I8=C5 I with GRAVE */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0x79 U+60 '`' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x7A U+3A ':' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x7B U+23 '#' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x7C U+40 '@' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x7D U+27 "'" */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x7E U+3D '=' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x7F U+22 '"' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x80 U+D8 I8=C6 O with '/' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0x81 U+61 'a' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NON_FINAL_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_)|(1U<<CC_XDIGIT_),
+/* 0x82 U+62 'b' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_)|(1U<<CC_XDIGIT_),
+/* 0x83 U+63 'c' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_)|(1U<<CC_XDIGIT_),
+/* 0x84 U+64 'd' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_)|(1U<<CC_XDIGIT_),
+/* 0x85 U+65 'e' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_)|(1U<<CC_XDIGIT_),
+/* 0x86 U+66 'f' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NON_FINAL_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_)|(1U<<CC_XDIGIT_),
+/* 0x87 U+67 'g' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x88 U+68 'h' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NON_FINAL_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x89 U+69 'i' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NON_FINAL_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x8A U+AB I8=C7 LEFT-POINTING DOUBLE ANGLE QUOTE */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x8B U+BB I8=C8 RIGHT-POINTING DOUBLE ANGLE QUOTE */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x8C U+F0 I8=C9 eth */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x8D U+FD I8=CA y with acute */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x8E U+FE I8=CB thorn */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x8F U+B1 I8=CC PLUS-MINUS */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_QUOTEMETA_),
+/* 0x90 U+B0 I8=CD DEGREE */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_QUOTEMETA_),
+/* 0x91 U+6A 'j' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NON_FINAL_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x92 U+6B 'k' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NONLATIN1_SIMPLE_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x93 U+6C 'l' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x94 U+6D 'm' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x95 U+6E 'n' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x96 U+6F 'o' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x97 U+70 'p' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x98 U+71 'q' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x99 U+72 'r' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x9A U+AA I8=CE FEMININE ORDINAL */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x9B U+BA I8=CF MASCULINE ORDINAL */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x9C U+E6 I8=D0 ae */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0x9D U+B8 I8=D1 CEDILLA */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_),
+/* 0x9E U+C6 I8=D2 AE */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0x9F U+A4 I8=D3 CURRENCY */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_QUOTEMETA_),
+/* 0xA0 U+B5 I8=D4 MICRO */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NONLATIN1_SIMPLE_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0xA1 U+7E '~' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0xA2 U+73 's' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NONLATIN1_SIMPLE_FOLD_)|(1U<<CC_NON_FINAL_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0xA3 U+74 't' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NON_FINAL_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0xA4 U+75 'u' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0xA5 U+76 'v' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0xA6 U+77 'w' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NON_FINAL_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0xA7 U+78 'x' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0xA8 U+79 'y' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NON_FINAL_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0xA9 U+7A 'z' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0xAA U+A1 I8=D5 INVERTED '!' */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0xAB U+BF I8=D6 INVERTED '?' */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0xAC U+D0 I8=D7 ETH */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0xAD U+DD I8=D8 Y with ACUTE */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0xAE U+DE I8=D9 THORN */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0xAF U+AE I8=DA REGISTERED */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_QUOTEMETA_),
+/* 0xB0 U+5E '^' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0xB1 U+A3 I8=DB POUND */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_QUOTEMETA_),
+/* 0xB2 U+A5 I8=DC YEN */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_QUOTEMETA_),
+/* 0xB3 U+B7 I8=DD MIDDLE DOT */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_),
+/* 0xB4 U+A9 I8=DE COPYRIGHT */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_QUOTEMETA_),
+/* 0xB5 U+A7 I8=DF SECTION */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* U+B6 I8=E0 PILCROW */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0xB7 U+BC I8=E1 1/4 */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_),
+/* 0xB8 U+BD I8=E2 1/2 */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_),
+/* 0xB9 U+BE I8=E3 3/4 */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_),
+/* 0xBA U+5B '[' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0xBB U+5D ']' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0xBC U+AF I8=E4 MACRON */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_),
+/* 0xBD U+A8 I8=E5 DIAERESIS */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_),
+/* 0xBE U+B4 I8=E6 ACUTE ACCENT */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_),
+/* 0xBF U+D7 I8=E7 MULTIPLICATION */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_QUOTEMETA_),
+/* 0xC0 U+7B '{' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0xC1 U+41 'A' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NON_FINAL_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_)|(1U<<CC_XDIGIT_),
+/* 0xC2 U+42 'B' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_)|(1U<<CC_XDIGIT_),
+/* 0xC3 U+43 'C' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_)|(1U<<CC_XDIGIT_),
+/* 0xC4 U+44 'D' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_)|(1U<<CC_XDIGIT_),
+/* 0xC5 U+45 'E' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_)|(1U<<CC_XDIGIT_),
+/* 0xC6 U+46 'F' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NON_FINAL_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_)|(1U<<CC_XDIGIT_),
+/* 0xC7 U+47 'G' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0xC8 U+48 'H' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NON_FINAL_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0xC9 U+49 'I' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NON_FINAL_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0xCA U+AD I8=E8 SOFT HYPHEN */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_QUOTEMETA_),
+/* 0xCB U+F4 I8=E9 o with '^' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0xCC U+F6 I8=EA o with diaeresis */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0xCD U+F2 I8=EB o with grave */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0xCE U+F3 I8=EC o with acute */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0xCF U+F5 I8=ED o with '~' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0xD0 U+7D '}' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0xD1 U+4A 'J' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NON_FINAL_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0xD2 U+4B 'K' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NONLATIN1_SIMPLE_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0xD3 U+4C 'L' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0xD4 U+4D 'M' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0xD5 U+4E 'N' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0xD6 U+4F 'O' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0xD7 U+50 'P' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0xD8 U+51 'Q' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0xD9 U+52 'R' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0xDA U+B9 I8=EE SUPERSCRIPT 1 */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_),
+/* 0xDB U+FB I8=EF u with '^' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0xDC U+FC I8=F0 u with diaeresis */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0xDD U+F9 I8=F1 u with grave */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0xDE U+FA I8=F2 u with acute */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0xDF U+FF I8=F3 y with diaeresis */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_LOWER_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NONLATIN1_SIMPLE_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_),
+/* 0xE0 U+5C '\' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0xE1 U+F7 I8=F4 DIVISION */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_QUOTEMETA_),
+/* 0xE2 U+53 'S' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NONLATIN1_SIMPLE_FOLD_)|(1U<<CC_NON_FINAL_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0xE3 U+54 'T' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NON_FINAL_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0xE4 U+55 'U' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0xE5 U+56 'V' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0xE6 U+57 'W' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NON_FINAL_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0xE7 U+58 'X' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0xE8 U+59 'Y' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_NONLATIN1_FOLD_)|(1U<<CC_NON_FINAL_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0xE9 U+5A 'Z' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0xEA U+B2 I8=F5 SUPERSCRIPT 2 */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_),
+/* 0xEB U+D4 I8=F6 O with '^' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0xEC U+D6 I8=F7 O with DIAERESIS */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0xED U+D2 I8=F8 O with GRAVE */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0xEE U+D3 I8=F9 O with ACUTE */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0xEF U+D5 I8=FA O with '~' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0xF0 U+30 '0' */ (1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_BINDIGIT_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_DIGIT_)|(1U<<CC_GRAPH_)|(1U<<CC_OCTDIGIT_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_)|(1U<<CC_XDIGIT_),
+/* 0xF1 U+31 '1' */ (1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_BINDIGIT_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_DIGIT_)|(1U<<CC_GRAPH_)|(1U<<CC_OCTDIGIT_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_)|(1U<<CC_XDIGIT_),
+/* 0xF2 U+32 '2' */ (1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_DIGIT_)|(1U<<CC_GRAPH_)|(1U<<CC_OCTDIGIT_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_)|(1U<<CC_XDIGIT_),
+/* 0xF3 U+33 '3' */ (1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_DIGIT_)|(1U<<CC_GRAPH_)|(1U<<CC_OCTDIGIT_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_)|(1U<<CC_XDIGIT_),
+/* 0xF4 U+34 '4' */ (1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_DIGIT_)|(1U<<CC_GRAPH_)|(1U<<CC_OCTDIGIT_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_)|(1U<<CC_XDIGIT_),
+/* 0xF5 U+35 '5' */ (1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_DIGIT_)|(1U<<CC_GRAPH_)|(1U<<CC_OCTDIGIT_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_)|(1U<<CC_XDIGIT_),
+/* 0xF6 U+36 '6' */ (1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_DIGIT_)|(1U<<CC_GRAPH_)|(1U<<CC_OCTDIGIT_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_)|(1U<<CC_XDIGIT_),
+/* 0xF7 U+37 '7' */ (1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_DIGIT_)|(1U<<CC_GRAPH_)|(1U<<CC_OCTDIGIT_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_)|(1U<<CC_XDIGIT_),
+/* 0xF8 U+38 '8' */ (1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_DIGIT_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_)|(1U<<CC_XDIGIT_),
+/* 0xF9 U+39 '9' */ (1U<<CC_ALPHANUMERIC_)|(1U<<CC_ASCII_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_DIGIT_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_WORDCHAR_)|(1U<<CC_XDIGIT_),
+/* 0xFA U+B3 I8=FB SUPERSCRIPT 3 */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_),
+/* 0xFB U+DB I8=FC U with '^' */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0xFC U+DC I8=FD U with DIAERESIS */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0xFD U+D9 I8=FE U with GRAVE */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0xFE U+DA I8=FF U with ACUTE */ (1U<<CC_ALPHA_)|(1U<<CC_ALPHANUMERIC_)|(1U<<CC_CASED_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_IS_IN_SOME_FOLD_)|(1U<<CC_PRINT_)|(1U<<CC_UPPER_)|(1U<<CC_WORDCHAR_),
+/* 0xFF U+9F APC */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_)
 
 #endif /* EBCDIC 037 */
 
-/* ex: set ro: */
+/* ex: set ro ft=c: */
index 3b41a4a..4153af2 100644 (file)
@@ -22,6 +22,8 @@ __END__
 
 AnyDBM_File - provide framework for multiple DBMs
 
+NDBM_File, DB_File, GDBM_File, SDBM_File, ODBM_File - various DBM implementations
+
 =head1 SYNOPSIS
 
     use AnyDBM_File;
index 48d23f7..378365e 100644 (file)
@@ -354,6 +354,7 @@ my %not_tested = map { $_ => 1} qw(
     __FILE__
     __LINE__
     __PACKAGE__
+    ADJUST
     AUTOLOAD
     BEGIN
     CHECK
@@ -363,10 +364,12 @@ my %not_tested = map { $_ => 1} qw(
     INIT
     UNITCHECK
     catch
+    class
     default
     defer
     else
     elsif
+    field
     finally
     for
     foreach
@@ -374,6 +377,7 @@ my %not_tested = map { $_ => 1} qw(
     given
     if
     m
+    method
     no
     package
     q
index 7c2ecf9..90a3675 100644 (file)
@@ -7,14 +7,14 @@
 # This is based on the module of the same name by Malcolm Beattie,
 # but essentially none of his code remains.
 
-package B::Deparse;
+package B::Deparse 1.74;
 use strict;
 use Carp;
 use B qw(class main_root main_start main_cv svref_2object opnumber perlstring
         OPf_WANT OPf_WANT_VOID OPf_WANT_SCALAR OPf_WANT_LIST
         OPf_KIDS OPf_REF OPf_STACKED OPf_SPECIAL OPf_MOD OPf_PARENS
         OPpLVAL_INTRO OPpOUR_INTRO OPpENTERSUB_AMPER OPpSLICE OPpKVSLICE
-         OPpCONST_BARE
+         OPpCONST_BARE OPpEMPTYAVHV_IS_HV
         OPpTRANS_SQUASH OPpTRANS_DELETE OPpTRANS_COMPLEMENT OPpTARGET_MY
         OPpEXISTS_SUB OPpSORT_NUMERIC OPpSORT_INTEGER OPpREPEAT_DOLIST
         OPpSORT_REVERSE OPpMULTIDEREF_EXISTS OPpMULTIDEREF_DELETE
@@ -23,12 +23,13 @@ use B qw(class main_root main_start main_cv svref_2object opnumber perlstring
          OPpCONCAT_NESTED
          OPpMULTICONCAT_APPEND OPpMULTICONCAT_STRINGIFY OPpMULTICONCAT_FAKE
          OPpTRUEBOOL OPpINDEX_BOOLNEG OPpDEFER_FINALLY
-        SVf_IOK SVf_NOK SVf_ROK SVf_POK SVpad_OUR SVf_FAKE SVs_RMG SVs_SMG
-        SVs_PADTMP SVpad_TYPED
-         CVf_METHOD CVf_LVALUE
+         OPpARG_IF_UNDEF OPpARG_IF_FALSE
+        SVf_IOK SVf_NOK SVf_ROK SVf_POK SVf_FAKE SVs_RMG SVs_SMG
+        SVs_PADTMP
+         CVf_NOWARN_AMBIGUOUS CVf_LVALUE
         PMf_KEEP PMf_GLOBAL PMf_CONTINUE PMf_EVAL PMf_ONCE
         PMf_MULTILINE PMf_SINGLELINE PMf_FOLD PMf_EXTENDED PMf_EXTENDED_MORE
-        PADNAMEt_OUTER
+        PADNAMEf_OUTER PADNAMEf_OUR PADNAMEf_TYPED
         MDEREF_reload
         MDEREF_AV_pop_rv2av_aelem
         MDEREF_AV_gvsv_vivify_rv2av_aelem
@@ -53,7 +54,6 @@ use B qw(class main_root main_start main_cv svref_2object opnumber perlstring
         MDEREF_SHIFT
     );
 
-our $VERSION = '1.64';
 our $AUTOLOAD;
 use warnings ();
 require feature;
@@ -450,7 +450,7 @@ sub next_todo {
        my $flags = $name->FLAGS;
         my $category =
            !$cv || $seq <= $name->COP_SEQ_RANGE_LOW
-               ? $self->keyword($flags & SVpad_OUR
+               ? $self->keyword($flags & PADNAMEf_OUR
                                    ? "our"
                                    : $flags & SVpad_STATE
                                        ? "state"
@@ -1121,8 +1121,8 @@ sub pad_subs {
        if (defined $name && $name =~ /^&./) {
            my $low = $_->COP_SEQ_RANGE_LOW;
            my $flags = $_->FLAGS;
-           my $outer = $flags & PADNAMEt_OUTER;
-           if ($flags & SVpad_OUR) {
+           my $outer = $flags & PADNAMEf_OUTER;
+           if ($flags & PADNAMEf_OUR) {
                push @todo, [$low, undef, 0, $_]
                          # [seq, no cv, not format, padname]
                    unless $outer;
@@ -1135,7 +1135,7 @@ sub pad_subs {
                my $flags = $flags;
                my $cv = $cv;
                my $name = $_;
-               while ($flags & PADNAMEt_OUTER && class ($protocv) ne 'CV')
+               while ($flags & PADNAMEf_OUTER && class ($protocv) ne 'CV')
                {
                    $cv = $cv->OUTSIDE;
                    next PADENTRY if class($cv) eq 'SPECIAL'; # XXX freed?
@@ -1152,7 +1152,7 @@ sub pad_subs {
                my $other = $protocv->PADLIST;
                $$other && $other->outid == $padlist->id;
            };
-           if ($flags & PADNAMEt_OUTER) {
+           if ($flags & PADNAMEf_OUTER) {
                next unless $defined_in_this_sub;
                push @todo, [$protocv->OUTSIDE_SEQ, $protocv, 0, $_];
                next;
@@ -1262,7 +1262,10 @@ sub deparse_argops {
                 return unless $$kid and $kid->name eq 'argdefelem';
                 my $def = $self->deparse($kid->first, 7);
                 $def = "($def)" if $kid->first->flags & OPf_PARENS;
-                $var .= " = $def";
+                my $assign = "=";
+                $assign = "//=" if $kid->private & OPpARG_IF_UNDEF;
+                $assign = "||=" if $kid->private & OPpARG_IF_FALSE;
+                $var .= " $assign $def";
             }
             push @sig, $var;
         }
@@ -1313,7 +1316,7 @@ Carp::confess("NULL in deparse_sub") if !defined($cv) || $cv->isa("B::NULL");
 Carp::confess("SPECIAL in deparse_sub") if $cv->isa("B::SPECIAL");
     local $self->{'curcop'} = $self->{'curcop'};
 
-    my $has_sig = $self->{hinthash}{feature_signatures};
+    my $has_sig = $self->feature_enabled('signatures');
     if ($cv->FLAGS & SVf_POK) {
        my $myproto = $cv->PV;
        if ($has_sig) {
@@ -1323,9 +1326,9 @@ Carp::confess("SPECIAL in deparse_sub") if $cv->isa("B::SPECIAL");
             $proto = $myproto;
         }
     }
-    if ($cv->CvFLAGS & (CVf_METHOD|CVf_LOCKED|CVf_LVALUE|CVf_ANONCONST)) {
+    if ($cv->CvFLAGS & (CVf_NOWARN_AMBIGUOUS|CVf_LOCKED|CVf_LVALUE|CVf_ANONCONST)) {
         push @attrs, "lvalue" if $cv->CvFLAGS & CVf_LVALUE;
-        push @attrs, "method" if $cv->CvFLAGS & CVf_METHOD;
+        push @attrs, "method" if $cv->CvFLAGS & CVf_NOWARN_AMBIGUOUS;
         push @attrs, "const"  if $cv->CvFLAGS & CVf_ANONCONST;
     }
 
@@ -1551,7 +1554,7 @@ sub maybe_parens_func {
     if ($prec <= $cx or substr($text, 0, 1) eq "(" or $self->{'parens'}) {
        return "$func($text)";
     } else {
-       return "$func $text";
+        return $func . (length($text) ? " $text" : "");
     }
 }
 
@@ -1561,7 +1564,7 @@ sub find_our_type {
     my $seq = $self->{'curcop'} ? $self->{'curcop'}->cop_seq : 0;
     for my $a (@{$self->{'curcvlex'}{"o$name"}}) {
        my ($st, undef, $padname) = @$a;
-       if ($st >= $seq && $padname->FLAGS & SVpad_TYPED) {
+       if ($st >= $seq && $padname->FLAGS & PADNAMEf_TYPED) {
            return $padname->SvSTASH->NAME;
        }
     }
@@ -1647,7 +1650,7 @@ sub maybe_my {
        # because enteriter ops do not carry the flag.
        my $my =
            $self->keyword($padname->FLAGS & SVpad_STATE ? "state" : "my");
-       if ($padname->FLAGS & SVpad_TYPED) {
+       if ($padname->FLAGS & PADNAMEf_TYPED) {
            $my .= ' ' . $padname->SvSTASH->NAME;
        }
        if ($need_parens) {
@@ -1987,7 +1990,7 @@ sub populate_curcvlex {
                    : ($ns[$i]->COP_SEQ_RANGE_LOW, $ns[$i]->COP_SEQ_RANGE_HIGH);
 
            push @{$self->{'curcvlex'}{
-                       ($ns[$i]->FLAGS & SVpad_OUR ? 'o' : 'm') . $name
+                       ($ns[$i]->FLAGS & PADNAMEf_OUR ? 'o' : 'm') . $name
                  }}, [$seq_st, $seq_en, $ns[$i]];
        }
     }
@@ -2331,6 +2334,7 @@ my %feature_keywords = (
    catch    => 'try',
    finally  => 'try',
    defer    => 'defer',
+   signatures => 'signatures',
 );
 
 # keywords that are strong and also have a prototype
@@ -2514,7 +2518,21 @@ sub pp_chomp { maybe_targmy(@_, \&unop, "chomp") }
 sub pp_schop { maybe_targmy(@_, \&unop, "chop") }
 sub pp_schomp { maybe_targmy(@_, \&unop, "chomp") }
 sub pp_defined { unop(@_, "defined") }
-sub pp_undef { unop(@_, "undef") }
+sub pp_undef {
+    if ($_[1]->private & OPpTARGET_MY) {
+        my $targ = $_[1]->targ;
+        my $var = $_[0]->maybe_my($_[1], $_[2], $_[0]->padname($targ),
+            $_[0]->padname_sv($targ),
+            1);
+        my $func = unop(@_, "undef");
+        if ($func =~ /\s/) {
+            return unop(@_, "undef").$var;
+        } else {
+            return "$var = undef";
+        }
+    }
+    unop(@_, "undef") 
+}
 sub pp_study { unop(@_, "study") }
 sub pp_ref { unop(@_, "ref") }
 sub pp_pos { maybe_local(@_, unop(@_, "pos")) }
@@ -2772,19 +2790,40 @@ sub pp_anonlist {
 
 *pp_anonhash = \&pp_anonlist;
 
+sub pp_emptyavhv {
+    my $self = shift;
+    my ($op, $cx, $forbid_parens) = @_;
+    my $val = ($op->private & OPpEMPTYAVHV_IS_HV) ? '{}' : '[]';
+    if ($op->private & OPpTARGET_MY) {
+        my $targ = $op->targ;
+        my $var = $self->maybe_my($op, $cx, $self->padname($targ),
+                           $self->padname_sv($targ),
+                           $forbid_parens);
+        return $self->maybe_parens("$var = $val", $cx, 7);
+    } else {
+        return $val;
+    }
+}
+
 sub pp_refgen {
     my $self = shift;  
     my($op, $cx) = @_;
     my $kid = $op->first;
     if ($kid->name eq "null") {
        my $anoncode = $kid = $kid->first;
+
+       # Perl no longer generates this, but XS modules might:
        if ($anoncode->name eq "anonconst") {
            $anoncode = $anoncode->first->first->sibling;
        }
+
+       # Same as with `anonconst`:
        if ($anoncode->name eq "anoncode"
         or !null($anoncode = $kid->sibling) and
                 $anoncode->name eq "anoncode") {
             return $self->e_anoncode({ code => $self->padval($anoncode->targ) });
+
+       # Perl still generates this:
        } elsif ($kid->name eq "pushmark") {
             my $sib_name = $kid->sibling->name;
             if ($sib_name eq 'entersub') {
@@ -2806,6 +2845,18 @@ sub e_anoncode {
     return $self->keyword("sub") . " $text";
 }
 
+sub pp_anoncode {
+    my ($self, $anoncode) = @_;
+
+    return $self->e_anoncode( { code => $self->padval($anoncode->targ) } );
+}
+
+sub pp_anonconst {
+    my ($self, $anonconst) = @_;
+
+    return $self->pp_anoncode( $anonconst->first->first->sibling );
+}
+
 sub pp_srefgen { pp_refgen(@_) }
 
 sub pp_readline {
@@ -3093,6 +3144,18 @@ sub pp_isa { binop(@_, "isa", 15) }
 sub pp_sassign { binop(@_, "=", 7, SWAP_CHILDREN) }
 sub pp_aassign { binop(@_, "=", 7, SWAP_CHILDREN | LIST_CONTEXT) }
 
+sub pp_padsv_store {
+    my $self = shift;
+    my ($op, $cx, $forbid_parens, @args) = @_;
+    my $targ = $op->targ;
+    my $var = $self->maybe_my($op, $cx, $self->padname($targ),
+                           $self->padname_sv($targ),
+                           $forbid_parens);
+
+    my $val = $self->deparse($op->first, 7);
+    return $self->maybe_parens("$var = $val", $cx, 7);
+}
+
 sub pp_smartmatch {
     my ($self, $op, $cx) = @_;
     if (($op->flags & OPf_SPECIAL) && $self->{expand} < 2) {
@@ -3694,7 +3757,7 @@ sub maybe_var_attr {
             return unless $loppriv & OPpLVAL_INTRO;
 
             my $padname = $self->padname_sv($lop->targ);
-            my $thisclass = ($padname->FLAGS & SVpad_TYPED)
+            my $thisclass = ($padname->FLAGS & PADNAMEf_TYPED)
                                 ? $padname->SvSTASH->NAME : 'main';
 
             # all pad vars must be in the same class
@@ -3813,9 +3876,12 @@ sub pp_list {
                $local = "my";
            }
            my $padname = $self->padname_sv($lop->targ);
-           if ($padname->FLAGS & SVpad_TYPED) {
+           if ($padname->FLAGS & PADNAMEf_TYPED) {
                $newtype = $padname->SvSTASH->NAME;
            }
+       } elsif ($lopname eq 'padsv_store') {
+            # don't interpret as my (list) if it has an implicit assign
+            $local = "";
        } elsif ($lopname =~ /^(?:gv|rv2)([ash])v$/
                        && $loppriv & OPpOUR_INTRO
                or $lopname eq "null" && class($lop) eq 'UNOP'
@@ -4280,6 +4346,17 @@ sub pp_gv {
     return $self->maybe_qualify("", $self->gv_name($gv));
 }
 
+sub pp_aelemfastlex_store {
+    my $self = shift;
+    my($op, $cx) = @_;
+    my $name = $self->padname($op->targ);
+    $name =~ s/^@/\$/;
+    my $i = $op->private;
+    $i -= 256 if $i > 127;
+    my $val = $self->deparse($op->first, 7);
+    return $self->maybe_parens("${name}[$i] = $val", $cx, 7);
+}
+
 sub pp_aelemfast_lex {
     my $self = shift;
     my($op, $cx) = @_;
@@ -4977,78 +5054,92 @@ sub e_method {
 sub check_proto {
     my $self = shift;
     return "&" if $self->{'noproto'};
-    my($proto, @args) = @_;
-    my($arg, $real);
+    my ($proto, @args) = @_;
     my $doneok = 0;
     my @reals;
-    # An unbackslashed @ or % gobbles up the rest of the args
-    1 while $proto =~ s/(?<!\\)([@%])[^\]]+$/$1/;
-    $proto =~ s/^\s*//;
-    while ($proto) {
-       $proto =~ s/^(\\?[\$\@&%*_]|\\\[[\$\@&%*]+\]|;|)\s*//;
+    $proto =~ s/^\s+//;
+    while (length $proto) {
+        $proto =~ s/^(\\?[\$\@&%*]|\\\[[\$\@&%*]+\]|[_+;])\s*//
+            or return "&";  # malformed prototype
        my $chr = $1;
-       if ($chr eq "") {
-           return "&" if @args;
-       } elsif ($chr eq ";") {
+        if ($chr eq ";") {
            $doneok = 1;
-       } elsif ($chr eq "@" or $chr eq "%") {
+        } elsif ($chr eq '@' or $chr eq '%') {
+            # An unbackslashed @ or % gobbles up the rest of the args
            push @reals, map($self->deparse($_, 6), @args);
            @args = ();
+            $proto = '';
+        } elsif (!@args) {
+            last if $doneok;
+            return "&"; # too few args and no ';'
        } else {
-           $arg = shift @args;
-           last unless $arg;
-           if ($chr eq "\$" || $chr eq "_") {
+            my $arg = shift @args;
+            if ($chr eq '$' || $chr eq '_') {
                if (want_scalar $arg) {
                    push @reals, $self->deparse($arg, 6);
                } else {
                    return "&";
                }
            } elsif ($chr eq "&") {
-               if ($arg->name =~ /^(s?refgen|undef)$/) {
+                if ($arg->name =~ /^(?:s?refgen|undef)\z/) {
                    push @reals, $self->deparse($arg, 6);
                } else {
                    return "&";
                }
            } elsif ($chr eq "*") {
-               if ($arg->name =~ /^s?refgen$/
+                if ($arg->name =~ /^s?refgen\z/
                    and $arg->first->first->name eq "rv2gv")
-                 {
-                     $real = $arg->first->first; # skip refgen, null
-                     if ($real->first->name eq "gv") {
-                         push @reals, $self->deparse($real, 6);
-                     } else {
-                         push @reals, $self->deparse($real->first, 6);
-                     }
-                 } else {
-                     return "&";
-                 }
+                {
+                    my $real = $arg->first->first; # skip refgen, null
+                    if ($real->first->name eq "gv") {
+                        push @reals, $self->deparse($real, 6);
+                    } else {
+                        push @reals, $self->deparse($real->first, 6);
+                    }
+                } else {
+                    return "&";
+                }
+            } elsif ($chr eq "+") {
+                my $real;
+                if ($arg->name =~ /^s?refgen\z/ and
+                    !null($real = $arg->first) and
+                    !null($real->first) and
+                    $real->first->name =~ /^(?:rv2|pad)[ah]v\z/)
+                {
+                    push @reals, $self->deparse($real, 6);
+                } elsif (want_scalar $arg) {
+                    push @reals, $self->deparse($arg, 6);
+                } else {
+                    return "&";
+                }
            } elsif (substr($chr, 0, 1) eq "\\") {
                $chr =~ tr/\\[]//d;
-               if ($arg->name =~ /^s?refgen$/ and
+                my $real;
+                if ($arg->name =~ /^s?refgen\z/ and
                    !null($real = $arg->first) and
                    ($chr =~ /\$/ && is_scalar($real->first)
                     or ($chr =~ /@/
-                        && class($real->first->sibling) ne 'NULL'
-                        && $real->first->sibling->name
-                        =~ /^(rv2|pad)av$/)
+                         && !null($real->first)
+                         && $real->first->name =~ /^(?:rv2|pad)av\z/)
                     or ($chr =~ /%/
-                        && class($real->first->sibling) ne 'NULL'
-                        && $real->first->sibling->name
-                        =~ /^(rv2|pad)hv$/)
+                         && !null($real->first)
+                         && $real->first->name =~ /^(?:rv2|pad)hv\z/)
                     #or ($chr =~ /&/ # This doesn't work
                     #   && $real->first->name eq "rv2cv")
                     or ($chr =~ /\*/
                         && $real->first->name eq "rv2gv")))
-                 {
-                     push @reals, $self->deparse($real, 6);
-                 } else {
-                     return "&";
-                 }
-           }
-       }
+                {
+                    push @reals, $self->deparse($real, 6);
+                } else {
+                    return "&";
+                }
+            } else {
+                # should not happen
+                return "&";
+            }
+        }
     }
-    return "&" if $proto and !$doneok; # too few args and no ';'
-    return "&" if @args;               # too many args
+    return "&" if @args; # too many args
     return ("", join ", ", @reals);
 }
 
@@ -5093,7 +5184,7 @@ sub retscalar {
                  |msgrcv|semop|semget|semctl|hintseval|shostent|snetent
                  |sprotoent|sservent|ehostent|enetent|eprotoent|eservent
                  |spwent|epwent|sgrent|egrent|getlogin|syscall|lock|runcv
-                 |fc)\z/x
+                 |fc|padsv_store)\z/x
 }
 
 sub pp_entersub {
@@ -5104,9 +5195,7 @@ sub pp_entersub {
     my $prefix = "";
     my $amper = "";
     my($kid, @exprs);
-    if ($op->flags & OPf_SPECIAL && !($op->flags & OPf_MOD)) {
-       $prefix = "do ";
-    } elsif ($op->private & OPpENTERSUB_AMPER) {
+    if ($op->private & OPpENTERSUB_AMPER) {
        $amper = "&";
     }
     $kid = $op->first;
@@ -5230,19 +5319,23 @@ sub pp_entersub {
        # it back.
        $kid =~ s/^CORE::GLOBAL:://;
 
-       my $dproto = defined($proto) ? $proto : "undefined";
-       my $scalar_proto = $dproto =~ /^;*(?:[\$*_+]|\\.|\\\[[^]]\])\z/;
         if (!$declared) {
            return "$kid(" . $args . ")";
-       } elsif ($dproto =~ /^\s*\z/) {
+        }
+
+        my $dproto = defined($proto) ? $proto : "undefined";
+        if ($dproto =~ /^\s*\z/) {
            return $kid;
-       } elsif ($scalar_proto and is_scalar($exprs[0])) {
+        }
+
+        my $scalar_proto = $dproto =~ /^ \s* (?: ;\s* )* (?: [\$*_+] |\\ \s* (?: [\$\@%&*] | \[ [^\]]+ \] ) ) \s* \z/x;
+        if ($scalar_proto and !@exprs || is_scalar($exprs[0])) {
            # is_scalar is an excessively conservative test here:
            # really, we should be comparing to the precedence of the
            # top operator of $exprs[0] (ala unop()), but that would
            # take some major code restructuring to do right.
            return $self->maybe_parens_func($kid, $args, $cx, 16);
-       } elsif (not $scalar_proto and defined($proto) || $simple) { #'
+        } elsif (not $scalar_proto and defined($proto) || $simple) {
            return $self->maybe_parens_func($kid, $args, $cx, 5);
        } else {
            return "$kid(" . $args . ")";
@@ -6317,9 +6410,7 @@ sub matchop {
                                             ->sibling #   entersub
                                             ->first   #     ex-list
                                             ->first   #       pushmark
-                                            ->sibling #       srefgen
-                                            ->first   #         ex-list
-                                            ->first   #           anoncode
+                                            ->sibling #       anoncode
                                             ->targ
                                     )
                                   : undef);
@@ -6660,15 +6751,16 @@ sub builtin1 {
     return "builtin::$name($arg)";
 }
 
-sub pp_is_bool  { $_[0]->maybe_targmy(@_[1,2], \&builtin1, "is_bool"); }
-sub pp_is_weak  { $_[0]->maybe_targmy(@_[1,2], \&builtin1, "is_weak"); }
-sub pp_weaken   { builtin1(@_, "weaken"); }
-sub pp_unweaken { builtin1(@_, "unweaken"); }
-sub pp_blessed  { builtin1(@_, "blessed"); }
-sub pp_refaddr  { $_[0]->maybe_targmy(@_[1,2], \&builtin1, "refaddr"); }
-sub pp_reftype  { $_[0]->maybe_targmy(@_[1,2], \&builtin1, "reftype"); }
-sub pp_ceil     { $_[0]->maybe_targmy(@_[1,2], \&builtin1, "ceil"); }
-sub pp_floor    { $_[0]->maybe_targmy(@_[1,2], \&builtin1, "floor"); }
+sub pp_is_bool    { builtin1(@_, "is_bool"); }
+sub pp_is_weak    { builtin1(@_, "is_weak"); }
+sub pp_weaken     { builtin1(@_, "weaken"); }
+sub pp_unweaken   { builtin1(@_, "unweaken"); }
+sub pp_blessed    { builtin1(@_, "blessed"); }
+sub pp_refaddr    { $_[0]->maybe_targmy(@_[1,2], \&builtin1, "refaddr"); }
+sub pp_reftype    { $_[0]->maybe_targmy(@_[1,2], \&builtin1, "reftype"); }
+sub pp_ceil       { $_[0]->maybe_targmy(@_[1,2], \&builtin1, "ceil"); }
+sub pp_floor      { $_[0]->maybe_targmy(@_[1,2], \&builtin1, "floor"); }
+sub pp_is_tainted { builtin1(@_, "is_tainted"); }
 
 1;
 __END__
index e7a76c8..75dd96b 100644 (file)
@@ -307,14 +307,19 @@ x(); z()
 .
 EOCODH
 
-is runperl(stderr => 1, switches => [ '-MO=-qq,Deparse', $path, '-T' ],
+SKIP: {
+    skip("Your perl was built without taint support", 1)
+        unless $Config::Config{taint_support};
+
+    is runperl(stderr => 1, switches => [ '-MO=-qq,Deparse', $path, '-T' ],
            prog => "format =\n\@\n\$;\n.\n"),
-   <<'EOCODM', '$; on format line';
-format STDOUT =
-@
-$;
-.
-EOCODM
+        <<~'EOCODM', '$; on format line';
+        format STDOUT =
+        @
+        $;
+        .
+        EOCODM
+}
 
 is runperl(stderr => 1, switches => [ '-MO=-qq,Deparse,-l', $path ],
            prog => "format =\n\@\n\$foo\n.\n"),
@@ -537,10 +542,14 @@ is runperl(stderr => 1, switches => [ '-MO=-qq,Deparse', $path ],
    "sub BEGIN {\n    \$main::{'f'} = \\!0;\n}\n",
    '&PL_sv_yes constant (used to croak)';
 
-is runperl(stderr => 1, switches => [ '-MO=-qq,Deparse', $path, '-T' ],
+SKIP: {
+    skip("Your perl was built without taint support", 1)
+        unless $Config::Config{taint_support};
+    is runperl(stderr => 1, switches => [ '-MO=-qq,Deparse', $path, '-T' ],
            prog => '$x =~ (1?/$a/:0)'),
-  '$x =~ ($_ =~ /$a/);'."\n",
-  '$foo =~ <branch-folded match> under taint mode';
+        '$x =~ ($_ =~ /$a/);'."\n",
+        '$foo =~ <branch-folded match> under taint mode';
+}
 
 unlike runperl(stderr => 1, switches => [ '-MO=-qq,Deparse', $path, '-w' ],
                prog => 'BEGIN { undef &foo }'),
@@ -877,6 +886,13 @@ my $f = sub {
     +{[]};
 } ;
 ####
+# anonconst
+# CONTEXT no warnings 'experimental::const_attr';
+my $f = sub : const {
+    123;
+}
+;
+####
 # bug #43010
 '!@$%'->();
 ####
@@ -1054,7 +1070,7 @@ my $c = [];
 my $d = \[];
 ####
 # SKIP ?$] < 5.010 && "smartmatch and given/when not implemented on this Perl version"
-# CONTEXT use feature ':5.10'; no warnings 'experimental::smartmatch';
+# CONTEXT use feature ':5.10'; no warnings 'deprecated';
 # implicit smartmatch in given/when
 given ('foo') {
     when ('bar') { continue; }
@@ -1617,7 +1633,7 @@ my @a;
 $a[0] = 1;
 ####
 # feature features without feature
-# CONTEXT no warnings 'experimental::smartmatch';
+# CONTEXT no warnings 'deprecated';
 CORE::state $x;
 CORE::say $x;
 CORE::given ($x) {
@@ -1633,7 +1649,7 @@ CORE::evalbytes '';
 () = CORE::fc $x;
 ####
 # feature features when feature has been disabled by use VERSION
-# CONTEXT no warnings 'experimental::smartmatch';
+# CONTEXT no warnings 'deprecated';
 use feature (sprintf(":%vd", $^V));
 use 1;
 CORE::say $_;
@@ -1663,7 +1679,7 @@ CORE::evalbytes '';
 () = CORE::__SUB__;
 ####
 # (the above test with CONTEXT, and the output is equivalent but different)
-# CONTEXT use feature ':5.10'; no warnings 'experimental::smartmatch';
+# CONTEXT use feature ':5.10'; no warnings 'deprecated';
 # feature features when feature has been disabled by use VERSION
 use feature (sprintf(":%vd", $^V));
 use 1;
@@ -1697,7 +1713,7 @@ CORE::evalbytes '';
 ####
 # SKIP ?$] < 5.017004 && "lexical subs not implemented on this Perl version"
 # lexical subroutines and keywords of the same name
-# CONTEXT use feature 'lexical_subs', 'switch'; no warnings 'experimental';
+# CONTEXT use feature 'lexical_subs', 'switch'; no warnings 'experimental'; no warnings 'deprecated';
 my sub default;
 my sub else;
 my sub elsif;
@@ -2101,7 +2117,6 @@ no warnings "experimental::lexical_subs";
 my sub f {}
 print f();
 >>>>
-BEGIN {${^WARNING_BITS} = "\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x54\x55\x55\x55\x55\x55\x55\x55"}
 my sub f {
     
 }
@@ -2114,7 +2129,6 @@ no warnings 'experimental::lexical_subs';
 state sub f {}
 print f();
 >>>>
-BEGIN {${^WARNING_BITS} = "\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x54\x55\x55\x55\x55\x55\x55\x55"}
 state sub f {
     
 }
@@ -2129,7 +2143,7 @@ print f();
     {
       foo();
       my sub b;
-      b ;
+      b;
       main::b();
       &main::b;
       &main::b();
@@ -2145,7 +2159,7 @@ print f();
 ();
 state sub sb2;
 sub sb2 {
-    sb2 ;
+    sb2;
 }
 ####
 # lexical subroutine with outer declaration and inner definition
@@ -2231,6 +2245,14 @@ optoptwack($a = $b);
 wackbrack($a = $b);
 optwackbrack($a = $b);
 optoptwackbrack($a = $b);
+optbar;
+optoptbar;
+optplus;
+optoptplus;
+optwack;
+optoptwack;
+optwackbrack;
+optoptwackbrack;
 >>>>
 package prototest;
 dollar($a < $b);
@@ -2242,15 +2264,91 @@ optoptdollar($a < $b);
 bar($a < $b);
 optbar($a < $b);
 optoptbar($a < $b);
-&plus($a < $b);
-&optplus($a < $b);
-&optoptplus($a < $b);
+plus($a < $b);
+optplus($a < $b);
+optoptplus($a < $b);
 &wack(\($a = $b));
 &optwack(\($a = $b));
 &optoptwack(\($a = $b));
 &wackbrack(\($a = $b));
 &optwackbrack(\($a = $b));
 &optoptwackbrack(\($a = $b));
+optbar;
+optoptbar;
+optplus;
+optoptplus;
+optwack;
+optoptwack;
+optwackbrack;
+optoptwackbrack;
+####
+# enreferencing prototypes: @
+# CONTEXT sub wackat(\@) {} sub optwackat(;\@) {} sub wackbrackat(\[@]) {} sub optwackbrackat(;\[@]) {}
+wackat(my @a0);
+wackat(@a0);
+wackat(@ARGV);
+wackat(@{['t'];});
+optwackat;
+optwackat(my @a1);
+optwackat(@a1);
+optwackat(@ARGV);
+optwackat(@{['t'];});
+wackbrackat(my @a2);
+wackbrackat(@a2);
+wackbrackat(@ARGV);
+wackbrackat(@{['t'];});
+optwackbrackat;
+optwackbrackat(my @a3);
+optwackbrackat(@a3);
+optwackbrackat(@ARGV);
+optwackbrackat(@{['t'];});
+####
+# enreferencing prototypes: %
+# CONTEXT sub wackperc(\%) {} sub optwackperc(;\%) {} sub wackbrackperc(\[%]) {} sub optwackbrackperc(;\[%]) {}
+wackperc(my %a0);
+wackperc(%a0);
+wackperc(%ARGV);
+wackperc(%{+{'t', 1};});
+optwackperc;
+optwackperc(my %a1);
+optwackperc(%a1);
+optwackperc(%ARGV);
+optwackperc(%{+{'t', 1};});
+wackbrackperc(my %a2);
+wackbrackperc(%a2);
+wackbrackperc(%ARGV);
+wackbrackperc(%{+{'t', 1};});
+optwackbrackperc;
+optwackbrackperc(my %a3);
+optwackbrackperc(%a3);
+optwackbrackperc(%ARGV);
+optwackbrackperc(%{+{'t', 1};});
+####
+# enreferencing prototypes: +
+# CONTEXT sub plus(+) {} sub optplus(;+) {}
+plus('hi');
+plus(my @a0);
+plus(my %h0);
+plus(\@a0);
+plus(\%h0);
+optplus;
+optplus('hi');
+optplus(my @a1);
+optplus(my %h1);
+optplus(\@a1);
+optplus(\%h1);
+>>>>
+plus('hi');
+plus(my @a0);
+plus(my %h0);
+plus(@a0);
+plus(%h0);
+optplus;
+optplus('hi');
+optplus(my @a1);
+optplus(my %h1);
+optplus(@a1);
+optplus(%h1);
 ####
 # ensure aelemfast works in the range -128..127 and that there's no
 # funky edge cases
@@ -2747,6 +2845,22 @@ sub ($a, $=) {
 }
 ;
 ####
+# defined-or default
+no warnings;
+use feature 'signatures';
+sub ($a //= 'default') {
+    $a;
+}
+;
+####
+# logical-or default
+no warnings;
+use feature 'signatures';
+sub ($a ||= 'default') {
+    $a;
+}
+;
+####
 # padrange op within pattern code blocks
 /(?{ my($x, $y) = (); })/;
 my $a;
@@ -3221,6 +3335,7 @@ $x = builtin::refaddr(undef);
 $x = builtin::reftype(undef);
 $x = builtin::ceil($x);
 $x = builtin::floor($x);
+$x = builtin::is_tainted($x);
 ####
 # boolean true preserved
 my $x = !0;
@@ -3230,3 +3345,10 @@ my $x = !1;
 ####
 # const NV: NV-ness preserved
 my(@x) = (-2.0, -1.0, -0.0, 0.0, 1.0, 2.0);
+####
+# PADSV_STORE optimised my should be handled
+() = (my $s = 1);
+####
+# PADSV_STORE optimised state should be handled
+# CONTEXT use feature "state";
+() = (state $s = 1);
index af23d85..634cad2 100644 (file)
@@ -1,4 +1,4 @@
-# -*- buffer-read-only: t -*-
+# -*- mode: Perl; buffer-read-only: t -*-
 #
 #    lib/B/Op_private.pm
 #
@@ -118,7 +118,7 @@ package B::Op_private;
 our %bits;
 
 
-our $VERSION = "5.036003";
+our $VERSION = "5.038002";
 
 $bits{$_}{3} = 'OPpENTERSUB_AMPER' for qw(entersub rv2cv);
 $bits{$_}{6} = 'OPpENTERSUB_DB' for qw(entersub rv2cv);
@@ -134,7 +134,7 @@ $bits{$_}{6} = 'OPpINDEX_BOOLNEG' for qw(index rindex);
 $bits{$_}{1} = 'OPpITER_REVERSED' for qw(enteriter iter);
 $bits{$_}{7} = 'OPpLVALUE' for qw(leave leaveloop);
 $bits{$_}{6} = 'OPpLVAL_DEFER' for qw(aelem helem multideref);
-$bits{$_}{7} = 'OPpLVAL_INTRO' for qw(aelem aslice cond_expr delete enteriter entersub gvsv helem hslice list lvavref lvref lvrefslice multiconcat multideref padav padhv padrange padsv pushmark refassign rv2av rv2gv rv2hv rv2sv split);
+$bits{$_}{7} = 'OPpLVAL_INTRO' for qw(aelem aslice cond_expr delete emptyavhv enteriter entersub gvsv helem hslice list lvavref lvref lvrefslice multiconcat multideref padav padhv padrange padsv padsv_store pushmark refassign rv2av rv2gv rv2hv rv2sv split undef);
 $bits{$_}{2} = 'OPpLVREF_ELEM' for qw(lvref refassign);
 $bits{$_}{3} = 'OPpLVREF_ITER' for qw(lvref refassign);
 $bits{$_}{3} = 'OPpMAYBE_LVSUB' for qw(aassign aelem akeys aslice av2arylen avhvswitch helem hslice keys kvaslice kvhslice multideref padav padhv pos rv2av rv2gv rv2hv substr values vec);
@@ -145,11 +145,11 @@ $bits{$_}{4} = 'OPpOPEN_IN_RAW' for qw(backtick open);
 $bits{$_}{7} = 'OPpOPEN_OUT_CRLF' for qw(backtick open);
 $bits{$_}{6} = 'OPpOPEN_OUT_RAW' for qw(backtick open);
 $bits{$_}{6} = 'OPpOUR_INTRO' for qw(enteriter gvsv rv2av rv2hv rv2sv split);
-$bits{$_}{6} = 'OPpPAD_STATE' for qw(lvavref lvref padav padhv padsv pushmark refassign);
+$bits{$_}{6} = 'OPpPAD_STATE' for qw(emptyavhv lvavref lvref padav padhv padsv padsv_store pushmark refassign undef);
 $bits{$_}{7} = 'OPpPV_IS_UTF8' for qw(dump goto last next redo);
 $bits{$_}{6} = 'OPpREFCOUNTED' for qw(leave leaveeval leavesub leavesublv leavewrite);
 $bits{$_}{2} = 'OPpSLICEWARNING' for qw(aslice hslice padav padhv rv2av rv2hv);
-$bits{$_}{4} = 'OPpTARGET_MY' for qw(abs add atan2 ceil chdir chmod chomp chown chr chroot concat cos crypt divide exec exp flock floor getpgrp getppid getpriority hex i_add i_divide i_modulo i_multiply i_subtract index int is_bool is_weak kill left_shift length link log mkdir modulo multiconcat multiply nbit_and nbit_or nbit_xor ncomplement oct ord pow push rand refaddr reftype rename right_shift rindex rmdir schomp scomplement setpgrp setpriority sin sleep sqrt srand stringify subtract symlink system time unlink unshift utime wait waitpid);
+$bits{$_}{4} = 'OPpTARGET_MY' for qw(abs add atan2 ceil chdir chmod chomp chown chr chroot concat cos crypt divide emptyavhv exec exp flock floor getpgrp getppid getpriority hex i_add i_divide i_modulo i_multiply i_subtract index int kill left_shift length link log mkdir modulo multiconcat multiply nbit_and nbit_or nbit_xor ncomplement oct ord pow push rand refaddr reftype rename right_shift rindex rmdir schomp scomplement setpgrp setpriority sin sleep sqrt srand stringify subtract symlink system time undef unlink unshift utime wait waitpid);
 $bits{$_}{0} = 'OPpTRANS_CAN_FORCE_UTF8' for qw(trans transr);
 $bits{$_}{5} = 'OPpTRANS_COMPLEMENT' for qw(trans transr);
 $bits{$_}{7} = 'OPpTRANS_DELETE' for qw(trans transr);
@@ -254,6 +254,7 @@ $bits{aeach}{0} = $bf[0];
 @{$bits{aelem}}{5,4,1,0} = ($bf[8], $bf[8], $bf[1], $bf[1]);
 @{$bits{aelemfast}}{7,6,5,4,3,2,1,0} = ($bf[6], $bf[6], $bf[6], $bf[6], $bf[6], $bf[6], $bf[6], $bf[6]);
 @{$bits{aelemfast_lex}}{7,6,5,4,3,2,1,0} = ($bf[6], $bf[6], $bf[6], $bf[6], $bf[6], $bf[6], $bf[6], $bf[6]);
+@{$bits{aelemfastlex_store}}{7,6,5,4,3,2,1,0} = ($bf[6], $bf[6], $bf[6], $bf[6], $bf[6], $bf[6], $bf[6], $bf[6]);
 $bits{akeys}{0} = $bf[0];
 $bits{alarm}{0} = $bf[0];
 $bits{and}{0} = $bf[0];
@@ -262,7 +263,7 @@ $bits{anonconst}{0} = $bf[0];
 @{$bits{anonhash}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]);
 @{$bits{anonlist}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]);
 $bits{argcheck}{0} = $bf[0];
-$bits{argdefelem}{0} = $bf[0];
+@{$bits{argdefelem}}{7,6,0} = ('OPpARG_IF_UNDEF', 'OPpARG_IF_FALSE', $bf[0]);
 @{$bits{argelem}}{2,1,0} = ($bf[7], $bf[7], $bf[0]);
 @{$bits{atan2}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]);
 $bits{av2arylen}{0} = $bf[0];
@@ -305,7 +306,8 @@ $bits{dor}{0} = $bf[0];
 $bits{dorassign}{0} = $bf[0];
 $bits{dump}{0} = $bf[0];
 $bits{each}{0} = $bf[0];
-@{$bits{entereval}}{5,4,3,2,1,0} = ('OPpEVAL_RE_REPARSING', 'OPpEVAL_COPHH', 'OPpEVAL_BYTES', 'OPpEVAL_UNICODE', 'OPpEVAL_HAS_HH', $bf[0]);
+@{$bits{emptyavhv}}{5,3,2,1,0} = ('OPpEMPTYAVHV_IS_HV', $bf[4], $bf[4], $bf[4], $bf[4]);
+@{$bits{entereval}}{6,5,4,3,2,1,0} = ('OPpEVAL_EVALSV', 'OPpEVAL_RE_REPARSING', 'OPpEVAL_COPHH', 'OPpEVAL_BYTES', 'OPpEVAL_UNICODE', 'OPpEVAL_HAS_HH', $bf[0]);
 $bits{entergiven}{0} = $bf[0];
 $bits{enteriter}{3} = 'OPpITER_DEF';
 @{$bits{entersub}}{5,4,0} = ($bf[8], $bf[8], 'OPpENTERSUB_INARGS');
@@ -382,6 +384,7 @@ $bits{grepwhile}{0} = $bf[0];
 @{$bits{gt}}{1,0} = ($bf[1], $bf[1]);
 $bits{gv}{5} = 'OPpEARLY_CV';
 @{$bits{helem}}{5,4,1,0} = ($bf[8], $bf[8], $bf[1], $bf[1]);
+@{$bits{helemexistsor}}{7,0} = ('OPpHELEMEXISTSOR_DELETE', $bf[0]);
 $bits{hex}{0} = $bf[0];
 @{$bits{i_add}}{1,0} = ($bf[1], $bf[1]);
 @{$bits{i_divide}}{1,0} = ($bf[1], $bf[1]);
@@ -401,9 +404,11 @@ $bits{i_predec}{0} = $bf[0];
 $bits{i_preinc}{0} = $bf[0];
 @{$bits{i_subtract}}{1,0} = ($bf[1], $bf[1]);
 @{$bits{index}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]);
+@{$bits{initfield}}{2,1,0} = ('OPpINITFIELD_HV', 'OPpINITFIELD_AV', $bf[0]);
 $bits{int}{0} = $bf[0];
 @{$bits{ioctl}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]);
 $bits{is_bool}{0} = $bf[0];
+$bits{is_tainted}{0} = $bf[0];
 $bits{is_weak}{0} = $bf[0];
 @{$bits{isa}}{1,0} = ($bf[1], $bf[1]);
 @{$bits{join}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]);
@@ -439,6 +444,7 @@ $bits{method_named}{0} = $bf[0];
 $bits{method_redir}{0} = $bf[0];
 $bits{method_redir_super}{0} = $bf[0];
 $bits{method_super}{0} = $bf[0];
+@{$bits{methstart}}{7,0} = ('OPpINITFIELDS', $bf[0]);
 @{$bits{mkdir}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]);
 @{$bits{modulo}}{1,0} = ($bf[1], $bf[1]);
 @{$bits{msgctl}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]);
@@ -464,6 +470,7 @@ $bits{ord}{0} = $bf[0];
 $bits{padhv}{0} = 'OPpPADHV_ISKEYS';
 @{$bits{padrange}}{6,5,4,3,2,1,0} = ($bf[5], $bf[5], $bf[5], $bf[5], $bf[5], $bf[5], $bf[5]);
 @{$bits{padsv}}{5,4} = ($bf[8], $bf[8]);
+$bits{padsv_store}{0} = $bf[0];
 @{$bits{pipe_op}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]);
 $bits{pop}{0} = $bf[0];
 $bits{pos}{0} = $bf[0];
@@ -571,7 +578,7 @@ $bits{tied}{0} = $bf[0];
 $bits{uc}{0} = $bf[0];
 $bits{ucfirst}{0} = $bf[0];
 @{$bits{umask}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]);
-$bits{undef}{0} = $bf[0];
+@{$bits{undef}}{5,0} = ('OPpUNDEF_KEEP_PV', $bf[0]);
 @{$bits{unlink}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]);
 @{$bits{unpack}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]);
 @{$bits{unshift}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]);
@@ -596,6 +603,8 @@ our %defines = (
     OPpARGELEM_HV            =>   4,
     OPpARGELEM_MASK          =>   6,
     OPpARGELEM_SV            =>   0,
+    OPpARG_IF_FALSE          =>  64,
+    OPpARG_IF_UNDEF          => 128,
     OPpASSIGN_BACKWARDS      =>  64,
     OPpASSIGN_COMMON_AGG     =>  16,
     OPpASSIGN_COMMON_RC1     =>  32,
@@ -620,6 +629,7 @@ our %defines = (
     OPpDEREF_SV              =>  48,
     OPpDONT_INIT_GV          =>   4,
     OPpEARLY_CV              =>  32,
+    OPpEMPTYAVHV_IS_HV       =>  32,
     OPpENTERSUB_AMPER        =>   8,
     OPpENTERSUB_DB           =>  64,
     OPpENTERSUB_HASTARG      =>   4,
@@ -627,6 +637,7 @@ our %defines = (
     OPpENTERSUB_NOPAREN      => 128,
     OPpEVAL_BYTES            =>   8,
     OPpEVAL_COPHH            =>  16,
+    OPpEVAL_EVALSV           =>  64,
     OPpEVAL_HAS_HH           =>   2,
     OPpEVAL_RE_REPARSING     =>  32,
     OPpEVAL_UNICODE          =>   4,
@@ -636,9 +647,13 @@ our %defines = (
     OPpFT_AFTER_t            =>  16,
     OPpFT_STACKED            =>   4,
     OPpFT_STACKING           =>   8,
+    OPpHELEMEXISTSOR_DELETE  => 128,
     OPpHINT_STRICT_REFS      =>   2,
     OPpHUSH_VMSISH           =>  32,
     OPpINDEX_BOOLNEG         =>  64,
+    OPpINITFIELDS            => 128,
+    OPpINITFIELD_AV          =>   2,
+    OPpINITFIELD_HV          =>   4,
     OPpITER_DEF              =>   8,
     OPpITER_REVERSED         =>   2,
     OPpKVSLICE               =>  32,
@@ -696,6 +711,7 @@ our %defines = (
     OPpTRANS_SQUASH          =>   8,
     OPpTRANS_USE_SVOP        =>   2,
     OPpTRUEBOOL              =>  32,
+    OPpUNDEF_KEEP_PV         =>  32,
     OPpUSEINT                =>   4,
 );
 
@@ -704,6 +720,8 @@ our %labels = (
     OPpARGELEM_AV            => 'AV',
     OPpARGELEM_HV            => 'HV',
     OPpARGELEM_SV            => 'SV',
+    OPpARG_IF_FALSE          => 'IF_FALSE',
+    OPpARG_IF_UNDEF          => 'IF_UNDEF',
     OPpASSIGN_BACKWARDS      => 'BKWARD',
     OPpASSIGN_COMMON_AGG     => 'COM_AGG',
     OPpASSIGN_COMMON_RC1     => 'COM_RC1',
@@ -726,6 +744,7 @@ our %labels = (
     OPpDEREF_SV              => 'DREFSV',
     OPpDONT_INIT_GV          => 'NOINIT',
     OPpEARLY_CV              => 'EARLYCV',
+    OPpEMPTYAVHV_IS_HV       => 'ANONHASH',
     OPpENTERSUB_AMPER        => 'AMPER',
     OPpENTERSUB_DB           => 'DBG',
     OPpENTERSUB_HASTARG      => 'TARG',
@@ -733,6 +752,7 @@ our %labels = (
     OPpENTERSUB_NOPAREN      => 'NO()',
     OPpEVAL_BYTES            => 'BYTES',
     OPpEVAL_COPHH            => 'COPHH',
+    OPpEVAL_EVALSV           => 'EVALSV',
     OPpEVAL_HAS_HH           => 'HAS_HH',
     OPpEVAL_RE_REPARSING     => 'REPARSE',
     OPpEVAL_UNICODE          => 'UNI',
@@ -742,9 +762,13 @@ our %labels = (
     OPpFT_AFTER_t            => 'FTAFTERt',
     OPpFT_STACKED            => 'FTSTACKED',
     OPpFT_STACKING           => 'FTSTACKING',
+    OPpHELEMEXISTSOR_DELETE  => 'DELETE',
     OPpHINT_STRICT_REFS      => 'STRICT',
     OPpHUSH_VMSISH           => 'HUSH',
     OPpINDEX_BOOLNEG         => 'NEG',
+    OPpINITFIELDS            => 'INITFIELDS',
+    OPpINITFIELD_AV          => 'INITFIELD_AV',
+    OPpINITFIELD_HV          => 'INITFIELD_HV',
     OPpITER_DEF              => 'DEF',
     OPpITER_REVERSED         => 'REVERSED',
     OPpKVSLICE               => 'KVSLICE',
@@ -799,12 +823,14 @@ our %labels = (
     OPpTRANS_SQUASH          => 'SQUASH',
     OPpTRANS_USE_SVOP        => 'USE_SVOP',
     OPpTRUEBOOL              => 'BOOL',
+    OPpUNDEF_KEEP_PV         => 'KEEP_PV',
     OPpUSEINT                => 'USEINT',
 );
 
 
 our %ops_using = (
     OPpALLOW_FAKE            => [qw(rv2gv)],
+    OPpARG_IF_FALSE          => [qw(argdefelem)],
     OPpASSIGN_BACKWARDS      => [qw(sassign)],
     OPpASSIGN_COMMON_AGG     => [qw(aassign)],
     OPpCONCAT_NESTED         => [qw(concat)],
@@ -812,6 +838,7 @@ our %ops_using = (
     OPpCOREARGS_DEREF1       => [qw(coreargs)],
     OPpDEFER_FINALLY         => [qw(pushdefer)],
     OPpEARLY_CV              => [qw(gv)],
+    OPpEMPTYAVHV_IS_HV       => [qw(emptyavhv)],
     OPpENTERSUB_AMPER        => [qw(entersub rv2cv)],
     OPpENTERSUB_INARGS       => [qw(entersub)],
     OPpENTERSUB_NOPAREN      => [qw(rv2cv)],
@@ -820,16 +847,19 @@ our %ops_using = (
     OPpFLIP_LINENUM          => [qw(flip flop)],
     OPpFT_ACCESS             => [qw(fteexec fteread ftewrite ftrexec ftrread ftrwrite)],
     OPpFT_AFTER_t            => [qw(ftatime ftbinary ftblk ftchr ftctime ftdir fteexec fteowned fteread ftewrite ftfile ftis ftlink ftmtime ftpipe ftrexec ftrowned ftrread ftrwrite ftsgid ftsize ftsock ftsuid ftsvtx fttext fttty ftzero)],
+    OPpHELEMEXISTSOR_DELETE  => [qw(helemexistsor)],
     OPpHINT_STRICT_REFS      => [qw(entersub multideref rv2av rv2cv rv2gv rv2hv rv2sv)],
     OPpHUSH_VMSISH           => [qw(dbstate nextstate)],
     OPpINDEX_BOOLNEG         => [qw(index rindex)],
+    OPpINITFIELDS            => [qw(methstart)],
+    OPpINITFIELD_AV          => [qw(initfield)],
     OPpITER_DEF              => [qw(enteriter)],
     OPpITER_REVERSED         => [qw(enteriter iter)],
     OPpKVSLICE               => [qw(delete)],
     OPpLIST_GUESSED          => [qw(list)],
     OPpLVALUE                => [qw(leave leaveloop)],
     OPpLVAL_DEFER            => [qw(aelem helem multideref)],
-    OPpLVAL_INTRO            => [qw(aelem aslice cond_expr delete enteriter entersub gvsv helem hslice list lvavref lvref lvrefslice multiconcat multideref padav padhv padrange padsv pushmark refassign rv2av rv2gv rv2hv rv2sv split)],
+    OPpLVAL_INTRO            => [qw(aelem aslice cond_expr delete emptyavhv enteriter entersub gvsv helem hslice list lvavref lvref lvrefslice multiconcat multideref padav padhv padrange padsv padsv_store pushmark refassign rv2av rv2gv rv2hv rv2sv split undef)],
     OPpLVREF_ELEM            => [qw(lvref refassign)],
     OPpMAYBE_LVSUB           => [qw(aassign aelem akeys aslice av2arylen avhvswitch helem hslice keys kvaslice kvhslice multideref padav padhv pos rv2av rv2gv rv2hv substr values vec)],
     OPpMAYBE_TRUEBOOL        => [qw(blessed padhv ref rv2hv)],
@@ -839,7 +869,7 @@ our %ops_using = (
     OPpOPEN_IN_CRLF          => [qw(backtick open)],
     OPpOUR_INTRO             => [qw(enteriter gvsv rv2av rv2hv rv2sv split)],
     OPpPADHV_ISKEYS          => [qw(padhv)],
-    OPpPAD_STATE             => [qw(lvavref lvref padav padhv padsv pushmark refassign)],
+    OPpPAD_STATE             => [qw(emptyavhv lvavref lvref padav padhv padsv padsv_store pushmark refassign undef)],
     OPpPV_IS_UTF8            => [qw(dump goto last next redo)],
     OPpREFCOUNTED            => [qw(leave leaveeval leavesub leavesublv leavewrite)],
     OPpREPEAT_DOLIST         => [qw(repeat)],
@@ -849,12 +879,14 @@ our %ops_using = (
     OPpSORT_DESCEND          => [qw(sort)],
     OPpSPLIT_ASSIGN          => [qw(split)],
     OPpSUBSTR_REPL_FIRST     => [qw(substr)],
-    OPpTARGET_MY             => [qw(abs add atan2 ceil chdir chmod chomp chown chr chroot concat cos crypt divide exec exp flock floor getpgrp getppid getpriority hex i_add i_divide i_modulo i_multiply i_subtract index int is_bool is_weak kill left_shift length link log mkdir modulo multiconcat multiply nbit_and nbit_or nbit_xor ncomplement oct ord pow push rand refaddr reftype rename right_shift rindex rmdir schomp scomplement setpgrp setpriority sin sleep sqrt srand stringify subtract symlink system time unlink unshift utime wait waitpid)],
+    OPpTARGET_MY             => [qw(abs add atan2 ceil chdir chmod chomp chown chr chroot concat cos crypt divide emptyavhv exec exp flock floor getpgrp getppid getpriority hex i_add i_divide i_modulo i_multiply i_subtract index int kill left_shift length link log mkdir modulo multiconcat multiply nbit_and nbit_or nbit_xor ncomplement oct ord pow push rand refaddr reftype rename right_shift rindex rmdir schomp scomplement setpgrp setpriority sin sleep sqrt srand stringify subtract symlink system time undef unlink unshift utime wait waitpid)],
     OPpTRANS_CAN_FORCE_UTF8  => [qw(trans transr)],
     OPpTRUEBOOL              => [qw(blessed grepwhile index length padav padhv pos ref rindex rv2av rv2hv subst)],
+    OPpUNDEF_KEEP_PV         => [qw(undef)],
     OPpUSEINT                => [qw(bit_and bit_or bit_xor complement left_shift nbit_and nbit_or nbit_xor ncomplement right_shift sbit_and sbit_or sbit_xor)],
 );
 
+$ops_using{OPpARG_IF_UNDEF} = $ops_using{OPpARG_IF_FALSE};
 $ops_using{OPpASSIGN_COMMON_RC1} = $ops_using{OPpASSIGN_COMMON_AGG};
 $ops_using{OPpASSIGN_COMMON_SCALAR} = $ops_using{OPpASSIGN_COMMON_AGG};
 $ops_using{OPpASSIGN_CV_TO_GV} = $ops_using{OPpASSIGN_BACKWARDS};
@@ -870,11 +902,13 @@ $ops_using{OPpDONT_INIT_GV} = $ops_using{OPpALLOW_FAKE};
 $ops_using{OPpENTERSUB_DB} = $ops_using{OPpENTERSUB_AMPER};
 $ops_using{OPpENTERSUB_HASTARG} = $ops_using{OPpENTERSUB_AMPER};
 $ops_using{OPpEVAL_COPHH} = $ops_using{OPpEVAL_BYTES};
+$ops_using{OPpEVAL_EVALSV} = $ops_using{OPpEVAL_BYTES};
 $ops_using{OPpEVAL_HAS_HH} = $ops_using{OPpEVAL_BYTES};
 $ops_using{OPpEVAL_RE_REPARSING} = $ops_using{OPpEVAL_BYTES};
 $ops_using{OPpEVAL_UNICODE} = $ops_using{OPpEVAL_BYTES};
 $ops_using{OPpFT_STACKED} = $ops_using{OPpFT_AFTER_t};
 $ops_using{OPpFT_STACKING} = $ops_using{OPpFT_AFTER_t};
+$ops_using{OPpINITFIELD_HV} = $ops_using{OPpINITFIELD_AV};
 $ops_using{OPpLVREF_ITER} = $ops_using{OPpLVREF_ELEM};
 $ops_using{OPpMAY_RETURN_CONSTANT} = $ops_using{OPpENTERSUB_NOPAREN};
 $ops_using{OPpMULTICONCAT_FAKE} = $ops_using{OPpMULTICONCAT_APPEND};
@@ -897,4 +931,4 @@ $ops_using{OPpTRANS_IDENTICAL} = $ops_using{OPpTRANS_CAN_FORCE_UTF8};
 $ops_using{OPpTRANS_SQUASH} = $ops_using{OPpTRANS_CAN_FORCE_UTF8};
 $ops_using{OPpTRANS_USE_SVOP} = $ops_using{OPpTRANS_CAN_FORCE_UTF8};
 
-# ex: set ro:
+# ex: set ro ft=perl:
index 3eeba79..b68e96a 100644 (file)
@@ -482,7 +482,7 @@ our(@ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS, $VERSION);
              clearcache clearallcache disablecache enablecache);
 %EXPORT_TAGS=( all => [ @EXPORT, @EXPORT_OK ] ) ;
 
-$VERSION = 1.23;
+$VERSION = 1.24;
 
 # --- ':hireswallclock' special handling
 
@@ -683,9 +683,9 @@ sub runloop {
     my($t0, $t1, $td); # before, after, difference
 
     # find package of caller so we can execute code there
-    my($curpack) = caller(0);
+    my $curpack = caller(0);
     my($i, $pack)= 0;
-    while (($pack) = caller(++$i)) {
+    while ($pack = caller(++$i)) {
        last if $pack ne $curpack;
     }
 
index 7d9a6c8..36a3396 100644 (file)
@@ -40,6 +40,89 @@ sub cmp_delta {
     return $max/$min <= (1+$delta);
 }
 
+sub splatter {
+    my ($message) = @_;
+    my $splatter = <<~'EOF_SPLATTER';
+    Please file a ticket to report this. Our bug tracker can be found at
+
+        https://github.com/Perl/perl5/issues
+
+    Make sure you include the full output of perl -V, also uname -a,
+    and the version details for the C compiler you are using are
+    very helpful.
+
+    Please also try compiling and running the C program that can
+    be found at
+
+        https://github.com/Perl/perl5/issues/20839#issuecomment-1439286875
+
+    and provide the results (or compile errors) as part of your
+    bug report.
+
+    EOF_SPLATTER
+
+    if ( $message =~ s/\.\.\.//) {
+        $splatter =~ s/Please/please/;
+    }
+    die $message, $splatter;
+}
+
+{
+    # Benchmark may end up "looping forever" if time() or times() are
+    # broken such that they do not return different values over time.
+    # The following crude test is intended to ensure that we can rely
+    # on them and be confident that we won't infinite loop in the
+    # following tests.
+    #
+    # You can simulate a broken time or times() function by setting
+    # the appropriate env var to a true value:
+    #
+    #   time()    -> SIMULATE_BROKEN_TIME_FUNCTION
+    #   times()   -> SIMULATE_BROKEN_TIMES_FUNCTION
+    #
+    # If you have a very fast box you may need to set the FAST_CPU env
+    # var to a number larger than 1 to require these tests to perform
+    # more iterations to see the time actually tick over. (You could
+    # also set it to a value between 0 and 1 to speed this up, but I
+    # don't see why you would...)
+    #
+    # See https://github.com/Perl/perl5/issues/20839 for the ticket
+    # that motivated this test. - Yves
+
+    my @times0;
+    for ( 1 .. 3 ) {
+        my $end_time = time + 1;
+        my $count = 0;
+        my $scale = $ENV{FAST_CPU} || 1;
+        my $count_threshold = 20_000;
+        while ( $ENV{SIMULATE_BROKEN_TIME_FUNCTION} || time < $end_time ) {
+            my $x = 0.0;
+            for ( 1 .. 10_000 ) {
+                $x += sqrt(time);
+            }
+            if (++$count > $count_threshold * $scale) {
+                last;
+            }
+        }
+        cmp_ok($count,"<",$count_threshold * $scale,
+            "expecting \$count < ($count_threshold * $scale)")
+        or splatter(<<~'EOF_SPLATTER');
+        Either this system is extremely fast, or the time() function
+        is broken.
+
+        If you think this system is extremely fast you may scale up the
+        number of iterations allowed by this test by setting FAST_CPU=N
+        in the environment. Higher N will allow more ops-per-second
+        before we decide time() is broken.
+
+        If setting a higher FAST_CPU value does not fix this problem then ...
+        EOF_SPLATTER
+        push @times0, $ENV{SIMULATE_BROKEN_TIMES_FUNCTION} ? 0 : (times)[0];
+    }
+    isnt("@times0", "0 0 0", "Make sure times() does not always return 0.")
+        or splatter("It appears you have a broken a times() function.\n\n");
+}
+
 my $t0 = new Benchmark;
 isa_ok ($t0, 'Benchmark', "Ensure we can create a benchmark object");
 
index c593dc7..a574734 100644 (file)
@@ -14,7 +14,7 @@ require Exporter;
 @ISA = qw(Exporter);
 @EXPORT = qw(struct);
 
-$VERSION = '0.66';
+$VERSION = '0.68';
 
 my $print = 0;
 sub printem {
@@ -84,7 +84,7 @@ sub struct {
     }
     else {
         $base_type = 'ARRAY';
-        $class = (caller())[0];
+        $class = caller();
         @decls = @_;
     }
 
@@ -275,24 +275,24 @@ Class::Struct - declare struct-like datatypes as Perl classes
             # declare struct with four types of elements:
     struct( s => '$', a => '@', h => '%', c => 'My_Other_Class' );
 
-    $obj = new Myobj;               # constructor
+    my $obj = Myobj->new;               # constructor
 
                                     # scalar type accessor:
-    $element_value = $obj->s;           # element value
+    my $element_value = $obj->s;           # element value
     $obj->s('new value');               # assign to element
 
                                     # array type accessor:
-    $ary_ref = $obj->a;                 # reference to whole array
-    $ary_element_value = $obj->a(2);    # array element value
+    my $ary_ref = $obj->a;                 # reference to whole array
+    my $ary_element_value = $obj->a(2);    # array element value
     $obj->a(2, 'new value');            # assign to array element
 
                                     # hash type accessor:
-    $hash_ref = $obj->h;                # reference to whole hash
-    $hash_element_value = $obj->h('x'); # hash element value
+    my $hash_ref = $obj->h;                # reference to whole hash
+    my $hash_element_value = $obj->h('x'); # hash element value
     $obj->h('x', 'new value');          # assign to hash element
 
                                     # class type accessor:
-    $element_value = $obj->c;           # object reference
+    my $element_value = $obj->c;           # object reference
     $obj->c->method(...);               # call method of object
     $obj->c(new My_Other_Class);        # assign a new object
 
index 4a07ff5..fa50526 100644 (file)
@@ -51,6 +51,39 @@ ok( exists $Config{d_fork},  "has d_fork");
 
 ok(!exists $Config{d_bork},  "has no d_bork");
 
+{
+    # check taint_support and tain_disabled are set up as expected.
+
+    ok( exists $Config{taint_support}, "has taint_support");
+
+    ok( exists $Config{taint_disabled}, "has taint_disabled");
+
+    is( $Config{taint_support}, ($Config{taint_disabled} ? "" : "define"),
+        "taint_support = !taint_disabled");
+
+    ok( ($Config{taint_support} eq "" or $Config{taint_support} eq "define"),
+        "taint_support is a valid value");
+
+    ok( ( $Config{taint_disabled} eq "" or $Config{taint_disabled} eq "silent" or
+        $Config{taint_disabled} eq "define"),
+        "taint_disabled is a valid value");
+
+    my @opts = Config::non_bincompat_options();
+    my @want_taint_disabled = ("", "define", "silent");
+    my @want_taint_support = ("define", "", "");
+    my ($silent_no_taint_support) = grep $_ eq "SILENT_NO_TAINT_SUPPORT", @opts;
+    my ($no_taint_support) = grep $_ eq "NO_TAINT_SUPPORT", @opts;
+    my $no_taint_support_count = 0 + grep /NO_TAINT_SUPPORT/, @opts;
+    my $want_count = $silent_no_taint_support ? 2 : $no_taint_support ? 1 : 0;
+
+    is ($no_taint_support_count, $want_count,
+        "non_bincompat_options info on taint support is as expected");
+    is( $Config{taint_disabled}, $want_taint_disabled[$no_taint_support_count],
+        "taint_disabled is aligned with non_bincompat_options() data");
+    is( $Config{taint_support}, $want_taint_support[$no_taint_support_count],
+        "taint_support is aligned with non_bincompat_options() data");
+}
+
 like($Config{ivsize}, qr/^(4|8)$/, "ivsize is 4 or 8 (it is $Config{ivsize})");
 
 # byteorder is virtual, but it has rules.
index e8c9a8c..38f361d 100644 (file)
@@ -38,11 +38,11 @@ BEGIN { use_ok('charnames', qw{greek})};
 
 use charnames qw{greek};
 
-unlink <Op_dbmx*>;
-END { unlink <Op_dbmx*>; }
+unlink <encOp_dbmx*>;
+END { unlink <encOp_dbmx*>; }
 
 my %h1 = () ;
-my $db1 = tie(%h1, $db_file,'Op_dbmx', O_RDWR|O_CREAT, 0640) ;
+my $db1 = tie(%h1, $db_file,'encOp_dbmx', O_RDWR|O_CREAT, 0640) ;
 
 ok $db1, "tied to $db_file";
 
@@ -101,7 +101,7 @@ undef $db1;
 
 # read the dbm file without the filter
 my %h2 = () ;
-my $db2 = tie(%h2, $db_file,'Op_dbmx', O_RDWR|O_CREAT, 0640) ;
+my $db2 = tie(%h2, $db_file,'encOp_dbmx', O_RDWR|O_CREAT, 0640) ;
 
 ok $db2, "tied to $db_file";
 
index e322049..ff9ebf7 100644 (file)
@@ -37,11 +37,11 @@ BEGIN { use_ok('charnames', qw{greek})};
 
 use charnames qw{greek};
 
-unlink <Op_dbmx*>;
-END { unlink <Op_dbmx*>; }
+unlink <utf8Op_dbmx*>;
+END { unlink <utf8Op_dbmx*>; }
 
 my %h1 = () ;
-my $db1 = tie(%h1, $db_file,'Op_dbmx', O_RDWR|O_CREAT, 0640) ;
+my $db1 = tie(%h1, $db_file,'utf8Op_dbmx', O_RDWR|O_CREAT, 0640) ;
 
 ok $db1, "tied to $db_file";
 
@@ -77,7 +77,7 @@ undef $db1;
 
 # read the dbm file without the filter
 my %h2 = () ;
-my $db2 = tie(%h2, $db_file,'Op_dbmx', O_RDWR|O_CREAT, 0640) ;
+my $db2 = tie(%h2, $db_file,'utf8Op_dbmx', O_RDWR|O_CREAT, 0640) ;
 
 ok $db2, "tied to $db_file";
 
index 4b4fe95..c3c611f 100644 (file)
@@ -6,11 +6,11 @@ File::Basename - Parse file paths into directory, filename and suffix.
 
     use File::Basename;
 
-    ($name,$path,$suffix) = fileparse($fullname,@suffixlist);
-    $name = fileparse($fullname,@suffixlist);
+    my ($name, $path, $suffix) = fileparse($fullname, @suffixlist);
+    my $name = fileparse($fullname, @suffixlist);
 
-    $basename = basename($fullname,@suffixlist);
-    $dirname  = dirname($fullname);
+    my $basename = basename($fullname, @suffixlist);
+    my $dirname  = dirname($fullname);
 
 
 =head1 DESCRIPTION
@@ -54,7 +54,7 @@ our(@ISA, @EXPORT, $VERSION, $Fileparse_fstype, $Fileparse_igncase);
 require Exporter;
 @ISA = qw(Exporter);
 @EXPORT = qw(fileparse fileparse_set_fstype basename dirname);
-$VERSION = "2.85";
+$VERSION = "2.86";
 
 fileparse_set_fstype($^O);
 
index ce659a0..1dc1d2d 100644 (file)
@@ -23,7 +23,7 @@ sub syscopy;
 sub cp;
 sub mv;
 
-$VERSION = '2.39';
+$VERSION = '2.41';
 
 require Exporter;
 @ISA = qw(Exporter);
@@ -339,14 +339,14 @@ File::Copy - Copy files or filehandles
 
        use File::Copy;
 
-       copy("sourcefile","destinationfile") or die "Copy failed: $!";
-       copy("Copy.pm",\*STDOUT);
-       move("/dev1/sourcefile","/dev2/destinationfile");
+       copy("sourcefile", "destinationfile") or die "Copy failed: $!";
+       copy("Copy.pm", \*STDOUT);
+       move("/dev1/sourcefile", "/dev2/destinationfile");
 
        use File::Copy "cp";
 
-       $n = FileHandle->new("/a/file","r");
-       cp($n,"x");
+       my $n = FileHandle->new("/a/file", "r");
+       cp($n, "x");
 
 =head1 DESCRIPTION
 
@@ -395,9 +395,12 @@ You may use the syntax C<use File::Copy "cp"> to get at the C<cp>
 alias for this function. The syntax is I<exactly> the same.  The
 behavior is nearly the same as well: as of version 2.15, C<cp> will
 preserve the source file's permission bits like the shell utility
-C<cp(1)> would do, while C<copy> uses the default permissions for the
-target file (which may depend on the process' C<umask>, file
-ownership, inherited ACLs, etc.).  If an error occurs in setting
+C<cp(1)> would do with default options, while C<copy> uses the default
+permissions for the target file (which may depend on the process'
+C<umask>, file ownership, inherited ACLs, etc.).  That is, if the
+destination file already exists, C<cp> will leave its permissions
+unchanged; otherwise the permissions are taken from the source file
+and modified by the C<umask>.  If an error occurs in setting
 permissions, C<cp> will return 0, regardless of whether the file was
 successfully copied.
 
index 7b430d7..373afd2 100644 (file)
@@ -11,7 +11,7 @@ BEGIN { *warnif = \&warnings::warnif }
 
 our(@EXPORT, @EXPORT_OK, %EXPORT_TAGS);
 
-our $VERSION = '1.12';
+our $VERSION = '1.13';
 
 our @fields;
 our ( $st_dev, $st_ino, $st_mode,
@@ -233,7 +233,7 @@ File::stat - by-name interface to Perl's built-in stat() functions
 =head1 SYNOPSIS
 
  use File::stat;
- $st = stat($file) or die "No $file: $!";
my $st = stat($file) or die "No $file: $!";
  if ( ($st->mode & 0111) && ($st->nlink > 1) ) {
      print "$file is executable with lotsa links\n";
  } 
index 133221b..a4ae1e4 100644 (file)
@@ -4,7 +4,7 @@ use 5.006;
 use strict;
 our($VERSION, @ISA, @EXPORT, @EXPORT_OK);
 
-$VERSION = "2.03";
+$VERSION = "2.05";
 
 require IO::File;
 @ISA = qw(IO::File);
@@ -111,36 +111,36 @@ FileHandle - supply object methods for filehandles
 
     use FileHandle;
 
-    $fh = FileHandle->new;
+    my $fh = FileHandle->new;
     if ($fh->open("< file")) {
         print <$fh>;
         $fh->close;
     }
 
-    $fh = FileHandle->new("> FOO");
+    my $fh = FileHandle->new("> FOO");
     if (defined $fh) {
         print $fh "bar\n";
         $fh->close;
     }
 
-    $fh = FileHandle->new("file", "r");
+    my $fh = FileHandle->new("file", "r");
     if (defined $fh) {
         print <$fh>;
         undef $fh;       # automatically closes the file
     }
 
-    $fh = FileHandle->new("file", O_WRONLY|O_APPEND);
+    my $fh = FileHandle->new("file", O_WRONLY|O_APPEND);
     if (defined $fh) {
         print $fh "corge\n";
         undef $fh;       # automatically closes the file
     }
 
-    $pos = $fh->getpos;
+    my $pos = $fh->getpos;
     $fh->setpos($pos);
 
-    $fh->setvbuf($buffer_var, _IOLBF, 1024);
+    $fh->setvbuf(my $buffer_var, _IOLBF, 1024);
 
-    ($readfh, $writefh) = FileHandle::pipe;
+    my ($readfh, $writefh) = FileHandle::pipe;
 
     autoflush STDOUT 1;
 
@@ -149,7 +149,7 @@ FileHandle - supply object methods for filehandles
 NOTE: This class is now a front-end to the IO::* classes.
 
 C<FileHandle::new> creates a C<FileHandle>, which is a reference to a
-newly created symbol (see the C<Symbol> package).  If it receives any
+newly created symbol (see the L<Symbol> package).  If it receives any
 parameters, they are passed to C<FileHandle::open>; if the open fails,
 the C<FileHandle> object is destroyed.  Otherwise, it is returned to
 the caller.
index cef20fb..18dc777 100644 (file)
@@ -2,7 +2,7 @@ package Net::protoent;
 use strict;
 
 use 5.006_001;
-our $VERSION = '1.01';
+our $VERSION = '1.02';
 our(@EXPORT, @EXPORT_OK, %EXPORT_TAGS);
 our ( $p_name, @p_aliases, $p_proto );
 BEGIN { 
@@ -51,7 +51,7 @@ Net::protoent - by-name interface to Perl's built-in getproto*() functions
 =head1 SYNOPSIS
 
  use Net::protoent;
- $p = getprotobyname(shift || 'tcp') || die "no proto";
my $p = getprotobyname(shift || 'tcp') || die "no proto";
  printf "proto for %s is %d, aliases are %s\n",
     $p->name, $p->proto, "@{$p->aliases}";
 
index a3b2bad..3aa8389 100644 (file)
@@ -2,7 +2,7 @@ package Net::servent;
 use strict;
 
 use 5.006_001;
-our $VERSION = '1.02';
+our $VERSION = '1.03';
 our(@EXPORT, @EXPORT_OK, %EXPORT_TAGS);
 our ( $s_name, @s_aliases, $s_port, $s_proto );
 BEGIN {
@@ -53,7 +53,7 @@ Net::servent - by-name interface to Perl's built-in getserv*() functions
 =head1 SYNOPSIS
 
  use Net::servent;
- $s = getservbyname(shift || 'ftp') || die "no service";
my $s = getservbyname(shift || 'ftp') || die "no service";
  printf "port for %s is %s, aliases are %s\n",
     $s->name, $s->port, "@{$s->aliases}";
 
index e73c988..96ecfe6 100644 (file)
@@ -1,6 +1,6 @@
 package UNIVERSAL;
 
-our $VERSION = '1.14';
+our $VERSION = '1.15';
 
 # UNIVERSAL should not contain any extra subs/methods beyond those
 # that it exists to define. The existence of import() below is a historical
@@ -24,21 +24,21 @@ UNIVERSAL - base class for ALL classes (blessed references)
 
 =head1 SYNOPSIS
 
-    $is_io    = $fd->isa("IO::Handle");
-    $is_io    = Class->isa("IO::Handle");
+    my $obj_is_io    = $fd->isa("IO::Handle");
+    my $cls_is_io    = Class->isa("IO::Handle");
 
-    $does_log = $obj->DOES("Logger");
-    $does_log = Class->DOES("Logger");
+    my $obj_does_log = $obj->DOES("Logger");
+    my $cls_does_log = Class->DOES("Logger");
 
-    $sub      = $obj->can("print");
-    $sub      = Class->can("print");
+    my $obj_sub      = $obj->can("print");
+    my $cls_sub      = Class->can("print");
 
-    $sub      = eval { $ref->can("fandango") };
-    $ver      = $obj->VERSION;
+    my $eval_sub     = eval { $ref->can("fandango") };
+    my $ver          = $obj->VERSION;
 
     # but never do this!
-    $is_io    = UNIVERSAL::isa($fd, "IO::Handle");
-    $sub      = UNIVERSAL::can($obj, "print");
+    my $is_io        = UNIVERSAL::isa($fd, "IO::Handle");
+    my $sub          = UNIVERSAL::can($obj, "print");
 
 =head1 DESCRIPTION
 
index 3d39121..a70e3bd 100644 (file)
@@ -19,7 +19,7 @@ use Test::More;
 
 use Unicode::UCD qw(charinfo charprop charprops_all);
 
-my $expected_version = '14.0.0';
+my $expected_version = '15.0.0';
 my $current_version = Unicode::UCD::UnicodeVersion;
 my $v_unicode_version = pack "C*", split /\./, $current_version;
 my $unknown_script = ($v_unicode_version lt v5.0.0)
@@ -786,7 +786,7 @@ SKIP:
         skip("Latin range count will be wrong when using older Unicode release",
              2) if $current_version lt $expected_version;
         my $n1 = @$r1;
-        is($n1, 38, "number of ranges in Latin script (Unicode $expected_version)") if $::IS_ASCII;
+        is($n1, 39, "number of ranges in Latin script (Unicode $expected_version)") if $::IS_ASCII;
         shift @$r1 while @$r1;
         my $r2 = charscript('Latin');
         is(@$r2, $n1, "modifying results should not mess up internal caches");
index 9f95541..5774132 100644 (file)
@@ -2,7 +2,7 @@ package User::grent;
 use strict;
 
 use 5.006_001;
-our $VERSION = '1.03';
+our $VERSION = '1.04';
 our(@EXPORT, @EXPORT_OK, %EXPORT_TAGS);
 our ($gr_name, $gr_gid, $gr_passwd, @gr_members);
 BEGIN { 
@@ -46,7 +46,7 @@ User::grent - by-name interface to Perl's built-in getgr*() functions
 =head1 SYNOPSIS
 
  use User::grent;
- $gr = getgrgid(0) or die "No group zero";
my $gr = getgrgid(0) or die "No group zero";
  if ( $gr->name eq 'wheel' && @{$gr->members} > 1 ) {
      print "gid zero name wheel, with other members";
  } 
@@ -57,7 +57,7 @@ User::grent - by-name interface to Perl's built-in getgr*() functions
      print "gid zero name wheel, with other members";
  } 
 
- $gr = getgr($whoever);
my $gr = getgr($whoever);
 
 =head1 DESCRIPTION
 
index 3f82e8c..ff8fbd5 100644 (file)
@@ -1,7 +1,7 @@
 package User::pwent;
 
 use 5.006;
-our $VERSION = '1.01';
+our $VERSION = '1.02';
 
 use strict;
 use warnings;
@@ -189,14 +189,14 @@ User::pwent - by-name interface to Perl's built-in getpw*() functions
 =head1 SYNOPSIS
 
  use User::pwent;
- $pw = getpwnam('daemon')       || die "No daemon user";
my $pw = getpwnam('daemon')       || die "No daemon user";
  if ( $pw->uid == 1 && $pw->dir =~ m#^/(bin|tmp)?\z#s ) {
      print "gid 1 on root dir";
  }
 
- $real_shell = $pw->shell || '/bin/sh';
my $real_shell = $pw->shell || '/bin/sh';
 
- for (($fullname, $office, $workphone, $homephone) =
+ for (my ($fullname, $office, $workphone, $homephone) =
         split /\s*,\s*/, $pw->gecos)
  {
     s/&/ucfirst(lc($pw->name))/ge;
@@ -208,7 +208,7 @@ User::pwent - by-name interface to Perl's built-in getpw*() functions
      print "gid 1 on root dir";
  }
 
- $pw = getpw($whoever);
my $pw = getpw($whoever);
 
  use User::pwent qw/:DEFAULT pw_has/;
  if (pw_has(qw[gecos expire quota])) { .... }
index a73bca6..4425225 100644 (file)
@@ -1,17 +1,17 @@
-# -*- buffer-read-only: t -*-
+# -*- mode: Perl; buffer-read-only: t -*-
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!!
 # This file is built by regen/feature.pl.
 # Any changes made here will be lost!
 
 package feature;
-
-our $VERSION = '1.72';
+our $VERSION = '1.82';
 
 our %feature = (
     fc                      => 'feature_fc',
     isa                     => 'feature_isa',
     say                     => 'feature_say',
     try                     => 'feature_try',
+    class                   => 'feature_class',
     defer                   => 'feature_defer',
     state                   => 'feature_state',
     switch                  => 'feature_switch',
@@ -20,6 +20,7 @@ our %feature = (
     evalbytes               => 'feature_evalbytes',
     signatures              => 'feature_signatures',
     current_sub             => 'feature___SUB__',
+    module_true             => 'feature_module_true',
     refaliasing             => 'feature_refaliasing',
     postderef_qq            => 'feature_postderef_qq',
     unicode_eval            => 'feature_unieval',
@@ -37,7 +38,8 @@ our %feature_bundle = (
     "5.23"    => [qw(bareword_filehandles current_sub evalbytes fc indirect multidimensional postderef_qq say state switch unicode_eval unicode_strings)],
     "5.27"    => [qw(bareword_filehandles bitwise current_sub evalbytes fc indirect multidimensional postderef_qq say state switch unicode_eval unicode_strings)],
     "5.35"    => [qw(bareword_filehandles bitwise current_sub evalbytes fc isa postderef_qq say signatures state unicode_eval unicode_strings)],
-    "all"     => [qw(bareword_filehandles bitwise current_sub declared_refs defer evalbytes extra_paired_delimiters fc indirect isa multidimensional postderef_qq refaliasing say signatures state switch try unicode_eval unicode_strings)],
+    "5.37"    => [qw(bitwise current_sub evalbytes fc isa module_true postderef_qq say signatures state unicode_eval unicode_strings)],
+    "all"     => [qw(bareword_filehandles bitwise class current_sub declared_refs defer evalbytes extra_paired_delimiters fc indirect isa module_true multidimensional postderef_qq refaliasing say signatures state switch try unicode_eval unicode_strings)],
     "default" => [qw(bareword_filehandles indirect multidimensional)],
 );
 
@@ -62,6 +64,7 @@ $feature_bundle{"5.32"} = $feature_bundle{"5.27"};
 $feature_bundle{"5.33"} = $feature_bundle{"5.27"};
 $feature_bundle{"5.34"} = $feature_bundle{"5.27"};
 $feature_bundle{"5.36"} = $feature_bundle{"5.35"};
+$feature_bundle{"5.38"} = $feature_bundle{"5.37"};
 $feature_bundle{"5.9.5"} = $feature_bundle{"5.10"};
 my %noops = (
     postderef => 1,
@@ -73,7 +76,7 @@ my %removed = (
 
 our $hint_shift   = 26;
 our $hint_mask    = 0x3c000000;
-our @hint_bundles = qw( default 5.10 5.11 5.15 5.23 5.27 5.35 );
+our @hint_bundles = qw( default 5.10 5.11 5.15 5.23 5.27 5.35 5.37 );
 
 # This gets set (for now) in $^H as well as in %^H,
 # for runtime speed of the uc/lc/ucfirst/lcfirst functions.
@@ -98,13 +101,13 @@ feature - Perl pragma to enable new features
     say "The case-folded version of $x is: " . fc $x;
 
 
-    # set features to match the :5.10 bundle, which may turn off or on
-    # multiple features (see below)
-    use feature ':5.10';
+    # set features to match the :5.36 bundle, which may turn off or on
+    # multiple features (see "FEATURE BUNDLES" below)
+    use feature ':5.36';
 
 
-    # implicitly loads :5.10 feature bundle
-    use v5.10;
+    # implicitly loads :5.36 feature bundle
+    use v5.36;
 
 =head1 DESCRIPTION
 
@@ -146,6 +149,8 @@ disable I<all> features (an unusual request!) use C<no feature ':all'>.
 
 =head1 AVAILABLE FEATURES
 
+Read L</"FEATURE BUNDLES"> for the feature cheat sheet summary.
+
 =head2 The 'say' feature
 
 C<use feature 'say'> tells the compiler to enable the Raku-inspired
@@ -178,6 +183,9 @@ given/when construct.
 See L<perlsyn/"Switch Statements"> for details.
 
 This feature is available starting with Perl 5.10.
+It is deprecated starting with Perl 5.38, and using
+C<given>, C<when> or smartmatch will throw a warning.
+It will be removed in Perl 5.42.
 
 =head2 The 'unicode_strings' feature
 
@@ -268,9 +276,10 @@ regardless of what feature declarations are in scope.
 =head2 The 'postderef' and 'postderef_qq' features
 
 The 'postderef_qq' feature extends the applicability of L<postfix
-dereference syntax|perlref/Postfix Dereference Syntax> so that postfix array
-and scalar dereference are available in double-quotish interpolations. For
-example, it makes the following two statements equivalent:
+dereference syntax|perlref/Postfix Dereference Syntax> so that
+postfix array dereference, postfix scalar dereference, and
+postfix array highest index access are available in double-quotish interpolations.
+For example, it makes the following two statements equivalent:
 
   my $s = "[@{ $h->{a} }]";
   my $s = "[$h->{a}->@*]";
@@ -361,7 +370,7 @@ warn when you use the feature, unless you have explicitly disabled the warning:
     no warnings "experimental::declared_refs";
 
 This allows a reference to a variable to be declared with C<my>, C<state>,
-our C<our>, or localized with C<local>.  It is intended mainly for use in
+or C<our>, or localized with C<local>.  It is intended mainly for use in
 conjunction with the "refaliasing" feature.  See L<perlref/Declaring a
 Reference to a Variable> for examples.
 
@@ -413,7 +422,7 @@ previous versions, it was simply on all the time.
 You can use the L<multidimensional> module on CPAN to disable
 multidimensional array emulation for older versions of Perl.
 
-=head2 The 'bareword_filehandles' feature.
+=head2 The 'bareword_filehandles' feature
 
 This feature enables bareword filehandles for builtin functions
 operations, a generally discouraged practice.  It is enabled by
@@ -429,7 +438,7 @@ previous versions it was simply on all the time.
 You can use the L<bareword::filehandles> module on CPAN to disable
 bareword filehandles for older versions of perl.
 
-=head2 The 'try' feature.
+=head2 The 'try' feature
 
 B<WARNING>: This feature is still experimental and the implementation may
 change or be removed in future versions of Perl.  For this reason, Perl will
@@ -467,6 +476,10 @@ This feature enables the use of more paired string delimiters than the
 traditional four, S<C<< <  > >>>, S<C<( )>>, S<C<{ }>>, and S<C<[ ]>>.  When
 this feature is on, for example, you can say S<C<qrE<171>patE<187>>>.
 
+As with any usage of non-ASCII delimiters in a UTF-8-encoded source file, you
+will want to ensure the parser will decode the source code from UTF-8 bytes
+with a declaration such as C<use utf8>.
+
 This feature is available starting in Perl 5.36.
 
 The complete list of accepted paired delimiters as of Unicode 14.0 is:
@@ -859,6 +872,25 @@ The complete list of accepted paired delimiters as of Unicode 14.0 is:
  🢫  🢪    U+1F8AB, U+1F8AA RIGHT/LEFTWARDS FRONT-TILTED SHADOWED WHITE
                           ARROW
 
+=head2 The 'module_true' feature
+
+This feature removes the need to return a true value at the end of a module
+loaded with C<require> or C<use>. Any errors during compilation will cause
+failures, but reaching the end of the module when this feature is in effect
+will prevent C<perl> from throwing an exception that the module "did not return
+a true value".
+
+=head2 The 'class' feature
+
+B<WARNING>: This feature is still experimental and the implementation may
+change or be removed in future versions of Perl.  For this reason, Perl will
+warn when you use the feature, unless you have explicitly disabled the warning:
+
+    no warnings "experimental::class";
+
+This feature enables the C<class> block syntax and other associated keywords
+which implement the "new" object system, previously codenamed "Corinna".
+
 =head1 FEATURE BUNDLES
 
 It's possible to load multiple features together, using
@@ -935,6 +967,10 @@ The following feature bundles are available:
             evalbytes fc isa postderef_qq say signatures
             state unicode_eval unicode_strings
 
+  :5.38     bitwise current_sub evalbytes fc isa
+            module_true postderef_qq say signatures
+            state unicode_eval unicode_strings
+
 The C<:default> bundle represents the feature set that is enabled before
 any C<use feature> or C<no feature> declaration.
 
@@ -964,12 +1000,12 @@ main compilation unit (that is, the one-liner that follows C<-E>).
 By explicitly requiring a minimum Perl version number for your program, with
 the C<use VERSION> construct.  That is,
 
-    use v5.10.0;
+    use v5.36.0;
 
 will do an implicit
 
     no feature ':all';
-    use feature ':5.10';
+    use feature ':5.36';
 
 and so on.  Note how the trailing sub-version
 is automatically stripped from the
@@ -977,7 +1013,7 @@ version.
 
 But to avoid portability warnings (see L<perlfunc/use>), you may prefer:
 
-    use 5.010;
+    use 5.036;
 
 with the same effect.
 
@@ -1211,4 +1247,4 @@ sub feature_bundle {
 
 1;
 
-# ex: set ro:
+# ex: set ro ft=perl:
index 9aa8e1d..a0f1c3e 100644 (file)
@@ -58,21 +58,18 @@ BEGIN {
 }
 
 use feature 'fc';
+use I18N::Langinfo qw(langinfo CODESET CRNCYSTR RADIXCHAR);
 
 # =1 adds debugging output; =2 increases the verbosity somewhat
 our $debug = $ENV{PERL_DEBUG_FULL_TEST} // 0;
 
 # Certain tests have been shown to be problematical for a few locales.  Don't
 # fail them unless at least this percentage of the tested locales fail.
-# On AIX machines, many locales call a no-break space a graphic.
-# (There aren't 1000 locales currently in existence, so 99.9 works)
 # EBCDIC os390 has more locales fail than normal, because it has locales that
 # move various critical characters like '['.
-my $acceptable_failure_percentage = ($os =~ / ^ ( aix ) $ /x)
-                                     ? 99.9
-                                     : ($os =~ / ^ ( os390 ) $ /x)
-                                       ? 10
-                                       : 5;
+my $acceptable_failure_percentage = ($os =~ / ^ ( os390 ) $ /x)
+                                    ? 10
+                                    : 5;
 
 # The list of test numbers of the problematic tests.
 my %problematical_tests;
@@ -792,18 +789,24 @@ my $final_without_setlocale = $test_num;
 debug "Scanning for locales...\n";
 
 require POSIX; import POSIX ':locale_h';
-
 my $categories = [ 'LC_CTYPE', 'LC_NUMERIC', 'LC_ALL' ];
-debug "Scanning for just compatible";
-my @Locale = find_locales($categories);
-debug "Scanning for even incompatible";
-my @include_incompatible_locales = find_locales($categories,
-                                                'even incompatible locales');
-
+my @Locale;
+my @include_incompatible_locales;
+if ($^O eq "aix"
+    and version->new(($Config{osvers} =~ /^(\d+(\.\d+))/)[0]) < 7) {
+    # https://www.ibm.com/support/pages/apar/IV22097
+    skip("setlocale broken on old AIX");
+}
+else {
+    debug "Scanning for just compatible";
+    @Locale = find_locales($categories);
+    debug "Scanning for even incompatible";
+    @include_incompatible_locales = find_locales($categories,
+                                              'even incompatible locales');
+}
 # The locales included in the incompatible list that aren't in the compatible
 # one.
 my @incompatible_locales;
-
 if (@Locale < @include_incompatible_locales) {
     my %seen;
     @seen{@Locale} = ();
@@ -1058,9 +1061,12 @@ foreach my $Locale (@Locale) {
 
     my $is_utf8_locale = is_locale_utf8($Locale);
 
-    debug "is utf8 locale? = $is_utf8_locale\n";
-
-    debug "radix = " . disp_str(localeconv()->{decimal_point}) . "\n";
+    if ($debug) {
+        debug "code set = " . langinfo(CODESET);
+        debug "is utf8 locale? = $is_utf8_locale\n";
+        debug "radix = " . disp_str(langinfo(RADIXCHAR)) . "\n";
+        debug "currency = " . disp_str(langinfo(CRNCYSTR));
+    }
 
     if (! $is_utf8_locale) {
         use locale;
@@ -2136,19 +2142,22 @@ foreach my $Locale (@Locale) {
     }
 
     $ok19 = $ok20 = 1;
-    if (setlocale(&POSIX::LC_TIME, $Locale)) { # These tests aren't affected by
-                                               # :not_characters
-        my @times = CORE::localtime();
+    if (locales_enabled('LC_TIME')) {
+        if (setlocale(&POSIX::LC_TIME, $Locale)) { # These tests aren't
+                                                   # affected by
+                                                   # :not_characters
+            my @times = CORE::localtime();
 
-        use locale;
-        $ok19 = POSIX::strftime("%p", @times) ne "%p"; # [perl #119425]
-        my $date = POSIX::strftime("'%A'  '%B'  '%Z'  '%p'", @times);
-        debug("'Day' 'Month' 'TZ' 'am/pm' = ", disp_str($date));
+            use locale;
+            $ok19 = POSIX::strftime("%p", @times) ne "%p"; # [perl #119425]
+            my $date = POSIX::strftime("'%A'  '%B'  '%Z'  '%p'", @times);
+            debug("'Day' 'Month' 'TZ' 'am/pm' = ", disp_str($date));
 
-        # If there is any non-ascii, it better be UTF-8 in a UTF-8 locale, and
-        # not UTF-8 if the locale isn't UTF-8.
-        $ok20 = $date =~ / ^ \p{ASCII}+ $ /x
-                || $is_utf8_locale == utf8::is_utf8($date);
+            # If there is any non-ascii, it better be UTF-8 in a UTF-8 locale,
+            # and not UTF-8 if the locale isn't UTF-8.
+            $ok20 = $date =~ / ^ \p{ASCII}+ $ /x
+                    || $is_utf8_locale == utf8::is_utf8($date);
+        }
     }
 
     $ok21 = 1;
@@ -2435,7 +2444,7 @@ foreach my $Locale (@Locale) {
         $test_names{$locales_test_number} = 'Verify atof with locale radix and negative exponent';
         $problematical_tests{$locales_test_number} = 1;
 
-        my $radix = POSIX::localeconv()->{decimal_point};
+        my $radix = langinfo(RADIXCHAR);
         my @nums = (
              "3.14e+9",  "3${radix}14e+9",  "3.14e-9",  "3${radix}14e-9",
             "-3.14e+9", "-3${radix}14e+9", "-3.14e-9", "-3${radix}14e-9",
index 77ce8f0..d782271 100644 (file)
@@ -2,9 +2,8 @@ package overload;
 
 use strict;
 no strict 'refs';
-no warnings 'experimental::builtin';
 
-our $VERSION = '1.35';
+our $VERSION = '1.37';
 
 our %ops = (
     with_assign         => "+ - * / % ** << >> x .",
@@ -30,152 +29,151 @@ my %ops_seen;
 sub nil {}
 
 sub OVERLOAD {
-  my $package = shift;
-  my %arg = @_;
-  my $sub;
-  *{$package . "::(("} = \&nil; # Make it findable via fetchmethod.
-  for (keys %arg) {
-    if ($_ eq 'fallback') {
-      for my $sym (*{$package . "::()"}) {
-       *$sym = \&nil; # Make it findable via fetchmethod.
-       $$sym = $arg{$_};
-      }
-    } else {
-      warnings::warnif("overload arg '$_' is invalid")
-        unless exists $ops_seen{$_};
-      $sub = $arg{$_};
-      if (not ref $sub) {
-       $ {$package . "::(" . $_} = $sub;
-       $sub = \&nil;
-      }
-      #print STDERR "Setting '$ {'package'}::\cO$_' to \\&'$sub'.\n";
-      *{$package . "::(" . $_} = \&{ $sub };
+    my $package = shift;
+    my %arg = @_;
+    my $sub;
+    *{$package . "::(("} = \&nil; # Make it findable via fetchmethod.
+    for (keys %arg) {
+        if ($_ eq 'fallback') {
+            for my $sym (*{$package . "::()"}) {
+              *$sym = \&nil; # Make it findable via fetchmethod.
+              $$sym = $arg{$_};
+            }
+        } else {
+            warnings::warnif("overload arg '$_' is invalid")
+                unless exists $ops_seen{$_};
+            $sub = $arg{$_};
+            if (not ref $sub) {
+                $ {$package . "::(" . $_} = $sub;
+                $sub = \&nil;
+            }
+            #print STDERR "Setting '$ {'package'}::\cO$_' to \\&'$sub'.\n";
+            *{$package . "::(" . $_} = \&{ $sub };
+        }
     }
-  }
 }
 
 sub import {
-  my $package = (caller())[0];
-  # *{$package . "::OVERLOAD"} = \&OVERLOAD;
-  shift;
-  $package->overload::OVERLOAD(@_);
+    my $package = caller();
+    # *{$package . "::OVERLOAD"} = \&OVERLOAD;
+    shift;
+    $package->overload::OVERLOAD(@_);
 }
 
 sub unimport {
-  my $package = (caller())[0];
-  shift;
-  *{$package . "::(("} = \&nil;
-  for (@_) {
-      warnings::warnif("overload arg '$_' is invalid")
-        unless exists $ops_seen{$_};
-      delete $ {$package . "::"}{$_ eq 'fallback' ? '()' : "(" .$_};
-  }
+    my $package = caller();
+    shift;
+    *{$package . "::(("} = \&nil;
+    for (@_) {
+        warnings::warnif("overload arg '$_' is invalid")
+            unless exists $ops_seen{$_};
+        delete $ {$package . "::"}{$_ eq 'fallback' ? '()' : "(" .$_};
+    }
 }
 
 sub Overloaded {
-  my $package = shift;
-  $package = ref $package if ref $package;
-  mycan ($package, '()') || mycan ($package, '((');
+    my $package = shift;
+    $package = ref $package if ref $package;
+    mycan ($package, '()') || mycan ($package, '((');
 }
 
 sub ov_method {
-  my $globref = shift;
-  return undef unless $globref;
-  my $sub = \&{*$globref};
-  no overloading;
-  return $sub if $sub != \&nil;
-  return shift->can($ {*$globref});
+    my $globref = shift;
+    return undef unless $globref;
+    my $sub = \&{*$globref};
+    no overloading;
+    return $sub if $sub != \&nil;
+    return shift->can($ {*$globref});
 }
 
 sub OverloadedStringify {
-  my $package = shift;
-  $package = ref $package if ref $package;
-  #$package->can('(""')
-  ov_method mycan($package, '(""'), $package
-    or ov_method mycan($package, '(0+'), $package
-    or ov_method mycan($package, '(bool'), $package
-    or ov_method mycan($package, '(nomethod'), $package;
+    my $package = shift;
+    $package = ref $package if ref $package;
+    #$package->can('(""')
+    ov_method mycan($package, '(""'), $package
+        or ov_method mycan($package, '(0+'), $package
+        or ov_method mycan($package, '(bool'), $package
+        or ov_method mycan($package, '(nomethod'), $package;
 }
 
 sub Method {
-  my $package = shift;
-  if(ref $package) {
-    local $@;
-    local $!;
-    $package = builtin::blessed($package);
-    return undef if !defined $package;
-  }
-  #my $meth = $package->can('(' . shift);
-  ov_method mycan($package, '(' . shift), $package;
-  #return $meth if $meth ne \&nil;
-  #return $ {*{$meth}};
+    my $package = shift;
+    if (ref $package) {
+        no warnings 'experimental::builtin';
+        $package = builtin::blessed($package);
+        return undef if !defined $package;
+    }
+    #my $meth = $package->can('(' . shift);
+    ov_method mycan($package, '(' . shift), $package;
+    #return $meth if $meth ne \&nil;
+    #return $ {*{$meth}};
 }
 
 sub AddrRef {
-  no overloading;
-  "$_[0]";
+    no overloading;
+    "$_[0]";
 }
 
 *StrVal = *AddrRef;
 
-sub mycan {                            # Real can would leave stubs.
-  my ($package, $meth) = @_;
+sub mycan {                   # Real can would leave stubs.
+    my ($package, $meth) = @_;
 
-  local $@;
-  local $!;
-  require mro;
+    local $@;
+    local $!;
+    require mro;
 
-  my $mro = mro::get_linear_isa($package);
-  foreach my $p (@$mro) {
-    my $fqmeth = $p . q{::} . $meth;
-    return \*{$fqmeth} if defined &{$fqmeth};
-  }
+    my $mro = mro::get_linear_isa($package);
+    foreach my $p (@$mro) {
+        my $fqmeth = $p . q{::} . $meth;
+        return \*{$fqmeth} if defined &{$fqmeth};
+    }
 
-  return undef;
+    return undef;
 }
 
 my %constants = (
-             'integer'   =>  0x1000, # HINT_NEW_INTEGER
-             'float'     =>  0x2000, # HINT_NEW_FLOAT
-             'binary'    =>  0x4000, # HINT_NEW_BINARY
-             'q'         =>  0x8000, # HINT_NEW_STRING
-             'qr'        => 0x10000, # HINT_NEW_RE
-            );
+    'integer'   =>  0x1000, # HINT_NEW_INTEGER
+    'float'     =>  0x2000, # HINT_NEW_FLOAT
+    'binary'    =>  0x4000, # HINT_NEW_BINARY
+    'q'         =>  0x8000, # HINT_NEW_STRING
+    'qr'        => 0x10000, # HINT_NEW_RE
+);
 
 use warnings::register;
 sub constant {
-  # Arguments: what, sub
-  while (@_) {
-    if (@_ == 1) {
-        warnings::warnif ("Odd number of arguments for overload::constant");
-        last;
-    }
-    elsif (!exists $constants {$_ [0]}) {
-        warnings::warnif ("'$_[0]' is not an overloadable type");
-    }
-    elsif (!ref $_ [1] || "$_[1]" !~ /(^|=)CODE\(0x[0-9a-f]+\)$/) {
-        # Can't use C<ref $_[1] eq "CODE"> above as code references can be
-        # blessed, and C<ref> would return the package the ref is blessed into.
-        if (warnings::enabled) {
-            $_ [1] = "undef" unless defined $_ [1];
-            warnings::warn ("'$_[1]' is not a code reference");
+    # Arguments: what, sub
+    while (@_) {
+        if (@_ == 1) {
+            warnings::warnif ("Odd number of arguments for overload::constant");
+            last;
         }
+        elsif (!exists $constants {$_ [0]}) {
+            warnings::warnif ("'$_[0]' is not an overloadable type");
+        }
+        elsif (!ref $_ [1] || "$_[1]" !~ /(^|=)CODE\(0x[0-9a-f]+\)$/) {
+            # Can't use C<ref $_[1] eq "CODE"> above as code references can be
+            # blessed, and C<ref> would return the package the ref is blessed into.
+            if (warnings::enabled) {
+                $_ [1] = "undef" unless defined $_ [1];
+                warnings::warn ("'$_[1]' is not a code reference");
+            }
+        }
+        else {
+            $^H{$_[0]} = $_[1];
+            $^H |= $constants{$_[0]};
+        }
+        shift, shift;
     }
-    else {
-        $^H{$_[0]} = $_[1];
-        $^H |= $constants{$_[0]};
-    }
-    shift, shift;
-  }
 }
 
 sub remove_constant {
-  # Arguments: what, sub
-  while (@_) {
-    delete $^H{$_[0]};
-    $^H &= ~ $constants{$_[0]};
-    shift, shift;
-  }
+    # Arguments: what, sub
+    while (@_) {
+        delete $^H{$_[0]};
+        $^H &= ~ $constants{$_[0]};
+        shift, shift;
+    }
 }
 
 1;
@@ -191,9 +189,9 @@ overload - Package for overloading Perl operations
     package SomeThing;
 
     use overload
-       '+' => \&myadd,
-       '-' => \&mysub;
-       # etc
+        '+' => \&myadd,
+        '-' => \&mysub;
+        # etc
     ...
 
     package main;
@@ -365,21 +363,21 @@ The complete list of keys that can be specified in the C<use overload>
 directive are given, separated by spaces, in the values of the
 hash C<%overload::ops>:
 
with_assign     => '+ - * / % ** << >> x .',
assign                  => '+= -= *= /= %= **= <<= >>= x= .=',
num_comparison          => '< <= > >= == !=',
'3way_comparison'=> '<=> cmp',
str_comparison          => 'lt le gt ge eq ne',
binary                  => '& &= | |= ^ ^= &. &.= |. |.= ^. ^.=',
unary           => 'neg ! ~ ~.',
mutators        => '++ --',
func            => 'atan2 cos sin exp abs log sqrt int',
conversion      => 'bool "" 0+ qr',
iterators       => '<>',
filetest         => '-X',
dereferencing   => '${} @{} %{} &{} *{}',
matching        => '~~',
- special         => 'nomethod fallback ='
   with_assign         => '+ - * / % ** << >> x .',
   assign              => '+= -= *= /= %= **= <<= >>= x= .=',
   num_comparison      => '< <= > >= == !=',
   '3way_comparison'   => '<=> cmp',
   str_comparison      => 'lt le gt ge eq ne',
   binary              => '& &= | |= ^ ^= &. &.= |. |.= ^. ^.=',
   unary               => 'neg ! ~ ~.',
   mutators            => '++ --',
   func                => 'atan2 cos sin exp abs log sqrt int',
   conversion          => 'bool "" 0+ qr',
   iterators           => '<>',
   filetest            => '-X',
   dereferencing       => '${} @{} %{} &{} *{}',
   matching            => '~~',
+    special             => 'nomethod fallback =',
 
 Most of the overloadable operators map one-to-one to these keys.
 Exceptions, including additional overloadable operations not
@@ -922,7 +920,7 @@ Inheritance interacts with overloading in two ways.
 
 If C<value> in
 
-  use overload key => value;
+    use overload key => value;
 
 is a string, it is interpreted as a method name - which may
 (in the usual way) be inherited from another class.
@@ -943,7 +941,7 @@ be called to implement operation C<+> for an object in package C<A>.
 =back
 
 Note that in Perl version prior to 5.18 inheritance of the C<fallback> key
-was not governed by the above rules.  The value of C<fallback> in the first 
+was not governed by the above rules.  The value of C<fallback> in the first
 overloaded ancestor was used.  This was fixed in 5.18 to follow the usual
 rules of inheritance.
 
@@ -1044,10 +1042,10 @@ and overload::remove_constant() from anywhere but import() and unimport() method
 From these methods they may be called as
 
     sub import {
-       shift;
-       return unless @_;
-       die "unknown import: @_" unless @_ == 1 and $_[0] eq ':constant';
-       overload::constant integer => sub {Math::BigInt->new(shift)};
+        shift;
+        return unless @_;
+        die "unknown import: @_" unless @_ == 1 and $_[0] eq ':constant';
+        overload::constant integer => sub {Math::BigInt->new(shift)};
     }
 
 =head1 IMPLEMENTATION
@@ -1085,66 +1083,66 @@ Please add examples to what follows!
 
 Put this in F<two_face.pm> in your Perl library directory:
 
-  package two_face;            # Scalars with separate string and
-                                # numeric values.
-  sub new { my $p = shift; bless [@_], $p }
-  use overload '""' => \&str, '0+' => \&num, fallback => 1;
-  sub num {shift->[1]}
-  sub str {shift->[0]}
+    package two_face;             # Scalars with separate string and
+                                  # numeric values.
+    sub new { my $p = shift; bless [@_], $p }
+    use overload '""' => \&str, '0+' => \&num, fallback => 1;
+    sub num {shift->[1]}
+    sub str {shift->[0]}
 
 Use it as follows:
 
-  require two_face;
-  my $seven = two_face->new("vii", 7);
-  printf "seven=$seven, seven=%d, eight=%d\n", $seven, $seven+1;
-  print "seven contains 'i'\n" if $seven =~ /i/;
+    require two_face;
+    my $seven = two_face->new("vii", 7);
+    printf "seven=$seven, seven=%d, eight=%d\n", $seven, $seven+1;
+    print "seven contains 'i'\n" if $seven =~ /i/;
 
 (The second line creates a scalar which has both a string value, and a
 numeric value.)  This prints:
 
-  seven=vii, seven=7, eight=8
-  seven contains 'i'
+    seven=vii, seven=7, eight=8
+    seven contains 'i'
 
 =head2 Two-face References
 
 Suppose you want to create an object which is accessible as both an
 array reference and a hash reference.
 
-  package two_refs;
-  use overload '%{}' => \&gethash, '@{}' => sub { $ {shift()} };
-  sub new {
-    my $p = shift;
-    bless \ [@_], $p;
-  }
-  sub gethash {
-    my %h;
-    my $self = shift;
-    tie %h, ref $self, $self;
-    \%h;
-  }
-
-  sub TIEHASH { my $p = shift; bless \ shift, $p }
-  my %fields;
-  my $i = 0;
-  $fields{$_} = $i++ foreach qw{zero one two three};
-  sub STORE {
-    my $self = ${shift()};
-    my $key = $fields{shift()};
-    defined $key or die "Out of band access";
-    $$self->[$key] = shift;
-  }
-  sub FETCH {
-    my $self = ${shift()};
-    my $key = $fields{shift()};
-    defined $key or die "Out of band access";
-    $$self->[$key];
-  }
+    package two_refs;
+    use overload '%{}' => \&gethash, '@{}' => sub { $ {shift()} };
+    sub new {
+        my $p = shift;
+        bless \ [@_], $p;
+    }
+    sub gethash {
+        my %h;
+        my $self = shift;
+        tie %h, ref $self, $self;
+        \%h;
+    }
+
+    sub TIEHASH { my $p = shift; bless \ shift, $p }
+    my %fields;
+    my $i = 0;
+    $fields{$_} = $i++ foreach qw{zero one two three};
+    sub STORE {
+        my $self = ${shift()};
+        my $key = $fields{shift()};
+        defined $key or die "Out of band access";
+        $$self->[$key] = shift;
+    }
+    sub FETCH {
+        my $self = ${shift()};
+        my $key = $fields{shift()};
+        defined $key or die "Out of band access";
+        $$self->[$key];
+    }
 
 Now one can access an object using both the array and hash syntax:
 
-  my $bar = two_refs->new(3,4,5,6);
-  $bar->[2] = 11;
-  $bar->{two} == 11 or die 'bad hash fetch';
+    my $bar = two_refs->new(3,4,5,6);
+    $bar->[2] = 11;
+    $bar->{two} == 11 or die 'bad hash fetch';
 
 Note several important features of this example.  First of all, the
 I<actual> type of $bar is a scalar reference, and we do not overload
@@ -1163,51 +1161,53 @@ hash itself, the only problem one has to circumvent is how to access
 this I<actual> hash (as opposed to the I<virtual> hash exhibited by the
 overloaded dereference operator).  Here is one possible fetching routine:
 
-  sub access_hash {
-    my ($self, $key) = (shift, shift);
-    my $class = ref $self;
-    bless $self, 'overload::dummy'; # Disable overloading of %{}
-    my $out = $self->{$key};
-    bless $self, $class;       # Restore overloading
-    $out;
-  }
+    sub access_hash {
+        my ($self, $key) = (shift, shift);
+        my $class = ref $self;
+        bless $self, 'overload::dummy'; # Disable overloading of %{}
+        my $out = $self->{$key};
+        bless $self, $class;            # Restore overloading
+        $out;
+    }
 
 To remove creation of the tied hash on each access, one may an extra
 level of indirection which allows a non-circular structure of references:
 
-  package two_refs1;
-  use overload '%{}' => sub { ${shift()}->[1] },
-               '@{}' => sub { ${shift()}->[0] };
-  sub new {
-    my $p = shift;
-    my $a = [@_];
-    my %h;
-    tie %h, $p, $a;
-    bless \ [$a, \%h], $p;
-  }
-  sub gethash {
-    my %h;
-    my $self = shift;
-    tie %h, ref $self, $self;
-    \%h;
-  }
-
-  sub TIEHASH { my $p = shift; bless \ shift, $p }
-  my %fields;
-  my $i = 0;
-  $fields{$_} = $i++ foreach qw{zero one two three};
-  sub STORE {
-    my $a = ${shift()};
-    my $key = $fields{shift()};
-    defined $key or die "Out of band access";
-    $a->[$key] = shift;
-  }
-  sub FETCH {
-    my $a = ${shift()};
-    my $key = $fields{shift()};
-    defined $key or die "Out of band access";
-    $a->[$key];
-  }
+    package two_refs1;
+    use overload
+        '%{}' => sub { ${shift()}->[1] },
+        '@{}' => sub { ${shift()}->[0] };
+
+    sub new {
+        my $p = shift;
+        my $a = [@_];
+        my %h;
+        tie %h, $p, $a;
+        bless \ [$a, \%h], $p;
+    }
+    sub gethash {
+        my %h;
+        my $self = shift;
+        tie %h, ref $self, $self;
+        \%h;
+    }
+
+    sub TIEHASH { my $p = shift; bless \ shift, $p }
+    my %fields;
+    my $i = 0;
+    $fields{$_} = $i++ foreach qw{zero one two three};
+    sub STORE {
+        my $a = ${shift()};
+        my $key = $fields{shift()};
+        defined $key or die "Out of band access";
+        $a->[$key] = shift;
+    }
+    sub FETCH {
+        my $a = ${shift()};
+        my $key = $fields{shift()};
+        defined $key or die "Out of band access";
+        $a->[$key];
+    }
 
 Now if $baz is overloaded like this, then C<$baz> is a reference to a
 reference to the intermediate array, which keeps a reference to an
@@ -1233,15 +1233,15 @@ overloaded operations.
 
 Put this in F<symbolic.pm> in your Perl library directory:
 
-  package symbolic;            # Primitive symbolic calculator
-  use overload nomethod => \&wrap;
+    package symbolic;           # Primitive symbolic calculator
+    use overload nomethod => \&wrap;
 
-  sub new { shift; bless ['n', @_] }
-  sub wrap {
-    my ($obj, $other, $inv, $meth) = @_;
-    ($obj, $other) = ($other, $obj) if $inv;
-    bless [$meth, $obj, $other];
-  }
+    sub new { shift; bless ['n', @_] }
+    sub wrap {
+        my ($obj, $other, $inv, $meth) = @_;
+        ($obj, $other) = ($other, $obj) if $inv;
+        bless [$meth, $obj, $other];
+    }
 
 This module is very unusual as overloaded modules go: it does not
 provide any usual overloaded operators, instead it provides an
@@ -1253,20 +1253,20 @@ symbolic->new(3) >> contains C<['+', 2, ['n', 3]]>.
 Here is an example of the script which "calculates" the side of
 circumscribed octagon using the above package:
 
-  require symbolic;
-  my $iter = 1;                        # 2**($iter+2) = 8
-  my $side = symbolic->new(1);
-  my $cnt = $iter;
+    require symbolic;
+    my $iter = 1;                   # 2**($iter+2) = 8
+    my $side = symbolic->new(1);
+    my $cnt = $iter;
 
-  while ($cnt--) {
-    $side = (sqrt(1 + $side**2) - 1)/$side;
-  }
-  print "OK\n";
+    while ($cnt--) {
+        $side = (sqrt(1 + $side**2) - 1)/$side;
+    }
+    print "OK\n";
 
 The value of $side is
 
-  ['/', ['-', ['sqrt', ['+', 1, ['**', ['n', 1], 2]],
-                      undef], 1], ['n', 1]]
+    ['/', ['-', ['sqrt', ['+', 1, ['**', ['n', 1], 2]],
+                        undef], 1], ['n', 1]]
 
 Note that while we obtained this value using a nice little script,
 there is no simple way to I<use> this value.  In fact this value may
@@ -1280,18 +1280,18 @@ again of type C<symbolic>, which will lead to an infinite loop.
 
 Add a pretty-printer method to the module F<symbolic.pm>:
 
-  sub pretty {
-    my ($meth, $a, $b) = @{+shift};
-    $a = 'u' unless defined $a;
-    $b = 'u' unless defined $b;
-    $a = $a->pretty if ref $a;
-    $b = $b->pretty if ref $b;
-    "[$meth $a $b]";
-  }
+    sub pretty {
+        my ($meth, $a, $b) = @{+shift};
+        $a = 'u' unless defined $a;
+        $b = 'u' unless defined $b;
+        $a = $a->pretty if ref $a;
+        $b = $b->pretty if ref $b;
+        "[$meth $a $b]";
+    }
 
 Now one can finish the script by
 
-  print "side = ", $side->pretty, "\n";
+    print "side = ", $side->pretty, "\n";
 
 The method C<pretty> is doing object-to-string conversion, so it
 is natural to overload the operator C<""> using this method.  However,
@@ -1302,21 +1302,21 @@ and $b.  If these components use overloading, the catenation operator
 will look for an overloaded operator C<.>; if not present, it will
 look for an overloaded operator C<"">.  Thus it is enough to use
 
-  use overload nomethod => \&wrap, '""' => \&str;
-  sub str {
-    my ($meth, $a, $b) = @{+shift};
-    $a = 'u' unless defined $a;
-    $b = 'u' unless defined $b;
-    "[$meth $a $b]";
-  }
+    use overload nomethod => \&wrap, '""' => \&str;
+    sub str {
+        my ($meth, $a, $b) = @{+shift};
+        $a = 'u' unless defined $a;
+        $b = 'u' unless defined $b;
+        "[$meth $a $b]";
+    }
 
 Now one can change the last line of the script to
 
-  print "side = $side\n";
+    print "side = $side\n";
 
 which outputs
 
-  side = [/ [- [sqrt [+ 1 [** [n 1 u] 2]] u] 1] [n 1 u]]
+    side = [/ [- [sqrt [+ 1 [** [n 1 u] 2]] u] 1] [n 1 u]]
 
 and one can inspect the value in debugger using all the possible
 methods.
@@ -1335,41 +1335,42 @@ conversion routine.
 Here is the text of F<symbolic.pm> with such a routine added (and
 slightly modified str()):
 
-  package symbolic;            # Primitive symbolic calculator
-  use overload
-    nomethod => \&wrap, '""' => \&str, '0+' => \&num;
-
-  sub new { shift; bless ['n', @_] }
-  sub wrap {
-    my ($obj, $other, $inv, $meth) = @_;
-    ($obj, $other) = ($other, $obj) if $inv;
-    bless [$meth, $obj, $other];
-  }
-  sub str {
-    my ($meth, $a, $b) = @{+shift};
-    $a = 'u' unless defined $a;
-    if (defined $b) {
-      "[$meth $a $b]";
-    } else {
-      "[$meth $a]";
+    package symbolic;           # Primitive symbolic calculator
+    use overload
+        nomethod => \&wrap, '""' => \&str, '0+' => \&num;
+
+    sub new { shift; bless ['n', @_] }
+    sub wrap {
+        my ($obj, $other, $inv, $meth) = @_;
+        ($obj, $other) = ($other, $obj) if $inv;
+        bless [$meth, $obj, $other];
+    }
+    sub str {
+        my ($meth, $a, $b) = @{+shift};
+        $a = 'u' unless defined $a;
+        if (defined $b) {
+            "[$meth $a $b]";
+        } else {
+            "[$meth $a]";
+        }
+    }
+    my %subr = (
+        n => sub {$_[0]},
+        sqrt => sub {sqrt $_[0]},
+        '-' => sub {shift() - shift()},
+        '+' => sub {shift() + shift()},
+        '/' => sub {shift() / shift()},
+        '*' => sub {shift() * shift()},
+        '**' => sub {shift() ** shift()},
+    );
+    sub num {
+        my ($meth, $a, $b) = @{+shift};
+        my $subr = $subr{$meth}
+        or die "Do not know how to ($meth) in symbolic";
+        $a = $a->num if ref $a eq __PACKAGE__;
+        $b = $b->num if ref $b eq __PACKAGE__;
+        $subr->($a,$b);
     }
-  }
-  my %subr = ( n => sub {$_[0]},
-              sqrt => sub {sqrt $_[0]},
-              '-' => sub {shift() - shift()},
-              '+' => sub {shift() + shift()},
-              '/' => sub {shift() / shift()},
-              '*' => sub {shift() * shift()},
-              '**' => sub {shift() ** shift()},
-            );
-  sub num {
-    my ($meth, $a, $b) = @{+shift};
-    my $subr = $subr{$meth}
-      or die "Do not know how to ($meth) in symbolic";
-    $a = $a->num if ref $a eq __PACKAGE__;
-    $b = $b->num if ref $b eq __PACKAGE__;
-    $subr->($a,$b);
-  }
 
 All the work of numeric conversion is done in %subr and num().  Of
 course, %subr is not complete, it contains only operators used in the
@@ -1378,24 +1379,24 @@ explicit recursion in num()?  (Answer is at the end of this section.)
 
 Use this module like this:
 
-  require symbolic;
-  my $iter = symbolic->new(2); # 16-gon
-  my $side = symbolic->new(1);
-  my $cnt = $iter;
+    require symbolic;
+    my $iter = symbolic->new(2);        # 16-gon
+    my $side = symbolic->new(1);
+    my $cnt = $iter;
 
-  while ($cnt) {
-    $cnt = $cnt - 1;           # Mutator '--' not implemented
-    $side = (sqrt(1 + $side**2) - 1)/$side;
-  }
-  printf "%s=%f\n", $side, $side;
-  printf "pi=%f\n", $side*(2**($iter+2));
+    while ($cnt) {
+        $cnt = $cnt - 1;                # Mutator '--' not implemented
+        $side = (sqrt(1 + $side**2) - 1)/$side;
+    }
+    printf "%s=%f\n", $side, $side;
+    printf "pi=%f\n", $side*(2**($iter+2));
 
 It prints (without so many line breaks)
 
-  [/ [- [sqrt [+ 1 [** [/ [- [sqrt [+ 1 [** [n 1] 2]]] 1]
-                         [n 1]] 2]]] 1]
-     [/ [- [sqrt [+ 1 [** [n 1] 2]]] 1] [n 1]]]=0.198912
-  pi=3.182598
+    [/ [- [sqrt [+ 1 [** [/ [- [sqrt [+ 1 [** [n 1] 2]]] 1]
+                            [n 1]] 2]]] 1]
+    [/ [- [sqrt [+ 1 [** [n 1] 2]]] 1] [n 1]]]=0.198912
+    pi=3.182598
 
 The above module is very primitive.  It does not implement
 mutator methods (C<++>, C<-=> and so on), does not do deep copying
@@ -1405,18 +1406,18 @@ operations which are used in the example.
 To implement most arithmetic operations is easy; one should just use
 the tables of operations, and change the code which fills %subr to
 
-  my %subr = ( 'n' => sub {$_[0]} );
-  foreach my $op (split " ", $overload::ops{with_assign}) {
-    $subr{$op} = $subr{"$op="} = eval "sub {shift() $op shift()}";
-  }
-  my @bins = qw(binary 3way_comparison num_comparison str_comparison);
-  foreach my $op (split " ", "@overload::ops{ @bins }") {
-    $subr{$op} = eval "sub {shift() $op shift()}";
-  }
-  foreach my $op (split " ", "@overload::ops{qw(unary func)}") {
-    print "defining '$op'\n";
-    $subr{$op} = eval "sub {$op shift()}";
-  }
+    my %subr = ( 'n' => sub {$_[0]} );
+    foreach my $op (split " ", $overload::ops{with_assign}) {
+        $subr{$op} = $subr{"$op="} = eval "sub {shift() $op shift()}";
+    }
+    my @bins = qw(binary 3way_comparison num_comparison str_comparison);
+    foreach my $op (split " ", "@overload::ops{ @bins }") {
+        $subr{$op} = eval "sub {shift() $op shift()}";
+    }
+    foreach my $op (split " ", "@overload::ops{qw(unary func)}") {
+        print "defining '$op'\n";
+        $subr{$op} = eval "sub {$op shift()}";
+    }
 
 Since subroutines implementing assignment operators are not required
 to modify their operands (see L</Overloadable Operations> above),
@@ -1430,42 +1431,42 @@ To implement a copy constructor, add C<< '=' => \&cpy >> to C<use overload>
 line, and code (this code assumes that mutators change things one level
 deep only, so recursive copying is not needed):
 
-  sub cpy {
-    my $self = shift;
-    bless [@$self], ref $self;
-  }
+    sub cpy {
+        my $self = shift;
+        bless [@$self], ref $self;
+    }
 
 To make C<++> and C<--> work, we need to implement actual mutators,
 either directly, or in C<nomethod>.  We continue to do things inside
 C<nomethod>, thus add
 
     if ($meth eq '++' or $meth eq '--') {
-      @$obj = ($meth, (bless [@$obj]), 1); # Avoid circular reference
-      return $obj;
+        @$obj = ($meth, (bless [@$obj]), 1); # Avoid circular reference
+        return $obj;
     }
 
 after the first line of wrap().  This is not a most effective
 implementation, one may consider
 
-  sub inc { $_[0] = bless ['++', shift, 1]; }
+    sub inc { $_[0] = bless ['++', shift, 1]; }
 
 instead.
 
 As a final remark, note that one can fill %subr by
 
-  my %subr = ( 'n' => sub {$_[0]} );
-  foreach my $op (split " ", $overload::ops{with_assign}) {
-    $subr{$op} = $subr{"$op="} = eval "sub {shift() $op shift()}";
-  }
-  my @bins = qw(binary 3way_comparison num_comparison str_comparison);
-  foreach my $op (split " ", "@overload::ops{ @bins }") {
-    $subr{$op} = eval "sub {shift() $op shift()}";
-  }
-  foreach my $op (split " ", "@overload::ops{qw(unary func)}") {
-    $subr{$op} = eval "sub {$op shift()}";
-  }
-  $subr{'++'} = $subr{'+'};
-  $subr{'--'} = $subr{'-'};
+    my %subr = ( 'n' => sub {$_[0]} );
+    foreach my $op (split " ", $overload::ops{with_assign}) {
+        $subr{$op} = $subr{"$op="} = eval "sub {shift() $op shift()}";
+    }
+    my @bins = qw(binary 3way_comparison num_comparison str_comparison);
+    foreach my $op (split " ", "@overload::ops{ @bins }") {
+        $subr{$op} = eval "sub {shift() $op shift()}";
+    }
+    foreach my $op (split " ", "@overload::ops{qw(unary func)}") {
+        $subr{$op} = eval "sub {$op shift()}";
+    }
+    $subr{'++'} = $subr{'+'};
+    $subr{'--'} = $subr{'-'};
 
 This finishes implementation of a primitive symbolic calculator in
 50 lines of Perl code.  Since the numeric values of subexpressions
@@ -1494,21 +1495,21 @@ until the value is I<used>.
 
 To see it in action, add a method
 
-  sub STORE {
-    my $obj = shift;
-    $#$obj = 1;
-    @$obj->[0,1] = ('=', shift);
-  }
+    sub STORE {
+        my $obj = shift;
+        $#$obj = 1;
+        @$obj->[0,1] = ('=', shift);
+    }
 
 to the package C<symbolic>.  After this change one can do
 
-  my $a = symbolic->new(3);
-  my $b = symbolic->new(4);
-  my $c = sqrt($a**2 + $b**2);
+    my $a = symbolic->new(3);
+    my $b = symbolic->new(4);
+    my $c = sqrt($a**2 + $b**2);
 
 and the numeric value of $c becomes 5.  However, after calling
 
-  $a->STORE(12);  $b->STORE(5);
+    $a->STORE(12);  $b->STORE(5);
 
 the numeric value of $c becomes 13.  There is no doubt now that the module
 symbolic provides a I<symbolic> calculator indeed.
@@ -1516,35 +1517,35 @@ symbolic provides a I<symbolic> calculator indeed.
 To hide the rough edges under the hood, provide a tie()d interface to the
 package C<symbolic>.  Add methods
 
-  sub TIESCALAR { my $pack = shift; $pack->new(@_) }
-  sub FETCH { shift }
-  sub nop {  }         # Around a bug
+    sub TIESCALAR { my $pack = shift; $pack->new(@_) }
+    sub FETCH { shift }
+    sub nop {  }                # Around a bug
 
 (the bug, fixed in Perl 5.14, is described in L<"BUGS">).  One can use this
 new interface as
 
-  tie $a, 'symbolic', 3;
-  tie $b, 'symbolic', 4;
-  $a->nop;  $b->nop;   # Around a bug
+    tie $a, 'symbolic', 3;
+    tie $b, 'symbolic', 4;
+    $a->nop;  $b->nop;          # Around a bug
 
-  my $c = sqrt($a**2 + $b**2);
+    my $c = sqrt($a**2 + $b**2);
 
 Now numeric value of $c is 5.  After C<$a = 12; $b = 5> the numeric value
 of $c becomes 13.  To insulate the user of the module add a method
 
-  sub vars { my $p = shift; tie($_, $p), $_->nop foreach @_; }
+    sub vars { my $p = shift; tie($_, $p), $_->nop foreach @_; }
 
 Now
 
-  my ($a, $b);
-  symbolic->vars($a, $b);
-  my $c = sqrt($a**2 + $b**2);
+    my ($a, $b);
+    symbolic->vars($a, $b);
+    my $c = sqrt($a**2 + $b**2);
 
-  $a = 3; $b = 4;
-  printf "c5  %s=%f\n", $c, $c;
+    $a = 3; $b = 4;
+    printf "c5  %s=%f\n", $c, $c;
 
-  $a = 12; $b = 5;
-  printf "c13  %s=%f\n", $c, $c;
+    $a = 12; $b = 5;
+    printf "c13  %s=%f\n", $c, $c;
 
 shows that the numeric value of $c follows changes to the values of $a
 and $b.
@@ -1607,11 +1608,11 @@ A pitfall when fallback is TRUE and Perl resorts to a built-in
 implementation of an operator is that some operators have more
 than one semantic, for example C<|>:
 
-        use overload '0+' => sub { $_[0]->{n}; },
-            fallback => 1;
-        my $x = bless { n => 4 }, "main";
-        my $y = bless { n => 8 }, "main";
-        print $x | $y, "\n";
+    use overload '0+' => sub { $_[0]->{n}; },
+        fallback => 1;
+    my $x = bless { n => 4 }, "main";
+    my $y = bless { n => 8 }, "main";
+    print $x | $y, "\n";
 
 You might expect this to output "12".
 In fact, it prints "<": the ASCII result of treating "|"
@@ -1697,3 +1698,4 @@ The range operator C<..> cannot be overloaded.
 
 =cut
 
+# ex: set ts=8 sts=4 sw=4 et:
index b1a75e5..adb57d3 100644 (file)
@@ -1100,7 +1100,7 @@ is("a$utfvar", "a".200.2.1); # 224 - overload via sv_2pv_flags
 # were to eval the overload code in the caller's namespace, the privatisation
 # would be quite transparent.
 package Hderef;
-use overload '%{}' => sub { (caller(0))[0] eq 'Foo' ? $_[0] : die "zap" };
+use overload '%{}' => sub { caller(0) eq 'Foo' ? $_[0] : die "zap" };
 package Foo;
 @Foo::ISA = 'Hderef';
 sub new { bless {}, shift }
@@ -1906,11 +1906,11 @@ foreach my $op (qw(<=> == != < <= > >=)) {
 
        # eval should do tie, overload on its arg before checking taint */
        push @tests, [ '1;', 'eval q(eval %s); $@ =~ /Insecure/',
-               '("")', '("")', [ 1, 2, 0 ], 0 ];
+               '("")', '("")', [ 1, 1, 0 ], 0 ];
 
 
        for my $sub (keys %subs) {
-           no warnings 'experimental::smartmatch';
+           no warnings 'deprecated';
            my $term = $subs{$sub};
            my $t = sprintf $term, '$_[0][0]';
            my $e ="sub { \$funcs .= '($sub)'; my \$r; if (\$use_int) {"
@@ -1952,7 +1952,7 @@ foreach my $op (qw(<=> == != < <= > >=)) {
                                    ? "-\$_[0][0]"
                                    : "$_[3](\$_[0][0])";
                        my $r;
-                       no warnings 'experimental::smartmatch';
+                       no warnings 'deprecated';
                        if ($use_int) {
                            use integer; $r = eval $e;
                        }
@@ -1999,7 +1999,7 @@ foreach my $op (qw(<=> == != < <= > >=)) {
            $use_int = ($int ne '');
            my $plain = $tainted_val;
            my $plain_term = $int . sprintf $sub_term, '$plain';
-           my $exp = do {no warnings 'experimental::smartmatch'; eval $plain_term };
+           my $exp = do {no warnings 'deprecated'; eval $plain_term };
            diag("eval of plain_term <$plain_term> gave <$@>") if $@;
            SKIP: {
                is_if_taint_supported(tainted($exp), $exp_taint,
@@ -2029,7 +2029,7 @@ foreach my $op (qw(<=> == != < <= > >=)) {
 
                    my $res_term  = $int . sprintf $sub_term, $var;
                    my $desc =  "<$res_term> $ov_pkg" ;
-                   my $res = do { no warnings 'experimental::smartmatch'; eval $res_term };
+                   my $res = do { no warnings 'deprecated'; eval $res_term };
                    diag("eval of res_term $desc gave <$@>") if $@;
                    # uniquely, the inc/dec ops return the original
                    # ref rather than a copy, so stringify it to
index ccea9e1..9a6f457 100644 (file)
@@ -1,4 +1,4 @@
-# -*- buffer-read-only: t -*-
+# -*- mode: Perl; buffer-read-only: t -*-
 #
 #    lib/overload/numbers.pm
 #
@@ -173,4 +173,4 @@ our @enums = qw#
 
 { my $i = 0; our %enums = map { $_ => $i++ } @enums }
 
-# ex: set ro:
+# ex: set ro ft=perl:
index 436437a..51da574 100644 (file)
@@ -532,7 +532,7 @@ BEGIN {
 use vars qw($VERSION $header);
 
 # bump to X.XX in blead, only use X.XX_XX in maint
-$VERSION = '1.73';
+$VERSION = '1.77';
 
 $header = "perl5db.pl version $VERSION";
 
@@ -1799,17 +1799,6 @@ our (
     @old_watch,
 );
 
-sub _DB__use_full_path
-{
-       # If running in the perl test suite, don't use old system libs
-       return &{$_[0]} if $ENV{PERL_CORE};
-       local @INC = @INC;
-       eval { require Config; };
-       unshift(@INC, 
-           @Config::Config{qw(archlibexp privlibexp sitearchexp sitelibexp)});
-       &{$_[0]};
-}
-
 sub _DB__determine_if_we_should_break
 {
     # if we have something here, see if we should break.
@@ -1972,10 +1961,7 @@ sub _DB__handle_y_command {
         if (!eval {
             local @INC = @INC;
             pop @INC if $INC[-1] eq '.';
-           _DB__use_full_path(sub {
-               require PadWalker;
-           });
-           PadWalker->VERSION(0.08) }) {
+            require PadWalker; PadWalker->VERSION(0.08) }) {
             my $Err = $@;
             _db_warn(
                 $Err =~ /locate/
@@ -3272,7 +3258,7 @@ deal with them instead of processing them in-line.
 =head4 C<y> - List lexicals in higher scope
 
 Uses C<PadWalker> to find the lexicals supplied as arguments in a scope
-above the current one and then displays then using C<dumpvar.pl>.
+above the current one and then displays them using F<dumpvar.pl>.
 
 =head3 COMMANDS NOT WORKING AFTER PROGRAM ENDS
 
@@ -3504,7 +3490,9 @@ again.
 =cut
 
         # No more commands? Quit.
-        $fall_off_end = 1 unless defined $cmd;    # Emulate 'q' on EOF
+        unless (defined $cmd) {
+            DB::Obj::_do_quit();
+        }
 
         # Evaluate post-prompt commands.
         foreach $evalarg (@$post) {
@@ -4308,13 +4296,17 @@ sub _handle_x_command {
     return;
 }
 
+sub _do_quit {
+    $fall_off_end = 1;
+    DB::clean_ENV();
+    exit $?;
+}
+
 sub _handle_q_command {
     my $self = shift;
 
     if ($self->_is_full('q')) {
-        $fall_off_end = 1;
-        DB::clean_ENV();
-        exit $?;
+        _do_quit();
     }
 
     return;
@@ -6837,15 +6829,13 @@ the appropriate attributes. We then
 
 use vars qw($ornaments);
 use vars qw($rl_attribs);
+
 sub setterm {
 
     # Load Term::Readline, but quietly; don't debug it and don't trace it.
     local $frame = 0;
     local $doret = -2;
-    _DB__use_full_path(sub {
-       require Term::ReadLine;
-    });
-    
+    require Term::ReadLine;
 
     # If noTTY is set, but we have a TTY name, go ahead and hook up to it.
     if ($notty) {
@@ -7020,9 +7010,7 @@ qq[3>&1 xterm -title "Daughter Perl debugger $pids $name" -e sh -c 'tty 1>&3;\
 
     # We need $term defined or we can not switch to the newly created xterm
     if ($tty ne '' && !defined $term) {
-       _DB__use_full_path(sub {
-           require Term::ReadLine;
-       });
+        require Term::ReadLine;
         if ( !$rl ) {
             $term = Term::ReadLine::Stub->new( 'perldb', $IN, $OUT );
         }
@@ -8202,7 +8190,7 @@ B<|>I<dbcmd>        Run debugger command, piping DB::OUT to current pager.
 B<||>I<dbcmd>        Same as B<|>I<dbcmd> but DB::OUT is temporarily select()ed as well.
 B<\=> [I<alias> I<value>]    Define a command alias, or list current aliases.
 I<command>        Execute as a perl statement in current package.
-B<R>        Pure-man-restart of debugger, some of debugger state
+B<R>        Poor man's restart of the debugger, some of debugger state
         and command-line options may be lost.
         Currently the following settings are preserved:
         history, breakpoints and actions, debugger B<O>ptions
@@ -8378,7 +8366,7 @@ B<||>I<dbcmd>        Same as B<|>I<dbcmd> but DB::OUT is temporarilly select()ed
 B<\=> [I<alias> I<value>]    Define a command alias, or list current aliases.
 I<command>        Execute as a perl statement in current package.
 B<v>        Show versions of loaded modules.
-B<R>        Pure-man-restart of debugger, some of debugger state
+B<R>        Poor man's restart of the debugger, some of debugger state
         and command-line options may be lost.
         Currently the following settings are preserved:
         history, breakpoints and actions, debugger B<O>ptions
@@ -8855,7 +8843,7 @@ sub CvGV_name_or_bust {
     return if $skipCvGV;    # Backdoor to avoid problems if XS broken...
     return unless ref $in;
     $in = \&$in;            # Hard reference...
-    eval { _DB__use_full_path(sub { require Devel::Peek; 1; }); } or return;
+    eval { require Devel::Peek; 1 } or return;
     my $gv = Devel::Peek::CvGV($in) or return;
     *$gv{PACKAGE} . '::' . *$gv{NAME};
 } ## end sub CvGV_name_or_bust
@@ -10388,7 +10376,8 @@ sub cmd_prepost {
 
 Contains the C<at_exit> routine that the debugger uses to issue the
 C<Debugged program terminated ...> message after the program completes. See
-the C<END> block documentation for more details.
+the L<C<END>|/END PROCESSING - THE END BLOCK> block documentation for more
+details.
 
 =cut
 
index 8ab456c..c38e999 100644 (file)
@@ -404,9 +404,11 @@ results.
 
 =head1 DESCRIPTION
 
-DebugWrap is a simple class that executes a set of debugger commands
-against a program under the debugger and provides some simple methods
-to examine the results.
+DebugWrap is a simple class used when testing the Perl debugger that
+executes a set of debugger commands against a program under the
+debugger and provides some simple methods to examine the results.
+
+It is not installed to your system.
 
 =head2 Creating a DebugWrap object
 
@@ -459,7 +461,7 @@ include the output from the program under test.
 Test that the debugger output matches the given regular expression
 object (as with qr//).
 
-Equivelent to:
+Equivalent to:
 
   like($wrapper->get_contents, $re, $test_name);
 
@@ -468,7 +470,7 @@ Equivelent to:
 Test that the debugger output does not match the given regular
 expression object (as with qr//).
 
-Equivelent to:
+Equivalent to:
 
   unlike($wrapper->get_contents, $re, $test_name);
 
@@ -484,7 +486,7 @@ capturing stderr.
 Test that the program output matches the given regular expression
 object (as with qr//).
 
-Equivelent to:
+Equivalent to:
 
   like($wrapper->get_output, $re, $test_name);
 
@@ -493,7 +495,7 @@ Equivelent to:
 Test that the program output does not match the given regular
 expression object (as with qr//).
 
-Equivelent to:
+Equivalent to:
 
   unlike($wrapper->get_output, $re, $test_name);
 
index bfb6b47..49cd256 100644 (file)
@@ -1,8 +1,8 @@
-# ArabicShaping-14.0.0.txt
-# Date: 2021-05-21, 01:54:00 GMT [KW, RP]
-# © 2021 Unicode®, Inc.
+# ArabicShaping-15.0.0.txt
+# Date: 2022-02-14, 18:50:00 GMT [KW, RP]
+# © 2022 Unicode®, Inc.
 # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
-# For terms of use, see http://www.unicode.org/terms_of_use.html
+# For terms of use, see https://www.unicode.org/terms_of_use.html
 #
 # This file is a normative contributory data file in the
 # Unicode Character Database.
index 89698f5..e138e7f 100644 (file)
@@ -1,6 +1,6 @@
-# BidiBrackets-14.0.0.txt
-# Date: 2021-06-30, 23:59:00 GMT [AG, LI, KW]
-# © 2021 Unicode®, Inc.
+# BidiBrackets-15.0.0.txt
+# Date: 2022-05-03, 18:42:00 GMT [AG, LI, KW]
+# © 2022 Unicode®, Inc.
 # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
 # For terms of use, see https://www.unicode.org/terms_of_use.html
 #
index bd8e2c5..5861d6e 100644 (file)
@@ -1,6 +1,6 @@
-# BidiMirroring-14.0.0.txt
-# Date: 2021-08-08, 22:55:00 GMT [KW, RP]
-# © 2021 Unicode®, Inc.
+# BidiMirroring-15.0.0.txt
+# Date: 2022-05-03, 18:47:00 GMT [KW, RP]
+# © 2022 Unicode®, Inc.
 # For terms of use, see https://www.unicode.org/terms_of_use.html
 #
 # Unicode Character Database
@@ -15,7 +15,7 @@
 # value, for which there is another Unicode character that typically has a glyph
 # that is the mirror image of the original character's glyph.
 #
-# The repertoire covered by the file is Unicode 14.0.0.
+# The repertoire covered by the file is Unicode 15.0.0.
 #
 # The file contains a list of lines with mappings from one code point
 # to another one for character-based mirroring.
index cc5d619..1268459 100644 (file)
@@ -1,10 +1,10 @@
-# Blocks-14.0.0.txt
-# Date: 2021-01-22, 23:29:00 GMT [KW]
-# © 2021 Unicode®, Inc.
-# For terms of use, see http://www.unicode.org/terms_of_use.html
+# Blocks-15.0.0.txt
+# Date: 2022-01-28, 20:58:00 GMT [KW]
+# © 2022 Unicode®, Inc.
+# For terms of use, see https://www.unicode.org/terms_of_use.html
 #
 # Unicode Character Database
-# For documentation, see http://www.unicode.org/reports/tr44/
+# For documentation, see https://www.unicode.org/reports/tr44/
 #
 # Format:
 # Start Code..End Code; Block Name
@@ -15,7 +15,7 @@
 #         and underbars are ignored.
 #         For example, "Latin Extended-A" and "latin extended a" are equivalent.
 #         For more information on the comparison of property values,
-#            see UAX #44: http://www.unicode.org/reports/tr44/
+#            see UAX #44: https://www.unicode.org/reports/tr44/
 #
 #  All block ranges start with a value where (cp MOD 16) = 0,
 #  and end with a value where (cp MOD 16) = 15. In other words,
@@ -241,6 +241,7 @@ FFF0..FFFF; Specials
 10D00..10D3F; Hanifi Rohingya
 10E60..10E7F; Rumi Numeral Symbols
 10E80..10EBF; Yezidi
+10EC0..10EFF; Arabic Extended-C
 10F00..10F2F; Old Sogdian
 10F30..10F6F; Sogdian
 10F70..10FAF; Old Uyghur
@@ -272,11 +273,13 @@ FFF0..FFFF; Specials
 11A50..11AAF; Soyombo
 11AB0..11ABF; Unified Canadian Aboriginal Syllabics Extended-A
 11AC0..11AFF; Pau Cin Hau
+11B00..11B5F; Devanagari Extended-A
 11C00..11C6F; Bhaiksuki
 11C70..11CBF; Marchen
 11D00..11D5F; Masaram Gondi
 11D60..11DAF; Gunjala Gondi
 11EE0..11EFF; Makasar
+11F00..11F5F; Kawi
 11FB0..11FBF; Lisu Supplement
 11FC0..11FFF; Tamil Supplement
 12000..123FF; Cuneiform
@@ -284,7 +287,7 @@ FFF0..FFFF; Specials
 12480..1254F; Early Dynastic Cuneiform
 12F90..12FFF; Cypro-Minoan
 13000..1342F; Egyptian Hieroglyphs
-13430..1343F; Egyptian Hieroglyph Format Controls
+13430..1345F; Egyptian Hieroglyph Format Controls
 14400..1467F; Anatolian Hieroglyphs
 16800..16A3F; Bamum Supplement
 16A40..16A6F; Mro
@@ -309,6 +312,7 @@ FFF0..FFFF; Specials
 1D000..1D0FF; Byzantine Musical Symbols
 1D100..1D1FF; Musical Symbols
 1D200..1D24F; Ancient Greek Musical Notation
+1D2C0..1D2DF; Kaktovik Numerals
 1D2E0..1D2FF; Mayan Numerals
 1D300..1D35F; Tai Xuan Jing Symbols
 1D360..1D37F; Counting Rod Numerals
@@ -316,9 +320,11 @@ FFF0..FFFF; Specials
 1D800..1DAAF; Sutton SignWriting
 1DF00..1DFFF; Latin Extended-G
 1E000..1E02F; Glagolitic Supplement
+1E030..1E08F; Cyrillic Extended-D
 1E100..1E14F; Nyiakeng Puachue Hmong
 1E290..1E2BF; Toto
 1E2C0..1E2FF; Wancho
+1E4D0..1E4FF; Nag Mundari
 1E7E0..1E7FF; Ethiopic Extended-B
 1E800..1E8DF; Mende Kikakui
 1E900..1E95F; Adlam
@@ -348,6 +354,7 @@ FFF0..FFFF; Specials
 2CEB0..2EBEF; CJK Unified Ideographs Extension F
 2F800..2FA1F; CJK Compatibility Ideographs Supplement
 30000..3134F; CJK Unified Ideographs Extension G
+31350..323AF; CJK Unified Ideographs Extension H
 E0000..E007F; Tags
 E0100..E01EF; Variation Selectors Supplement
 F0000..FFFFF; Supplementary Private Use Area-A
index 61a4587..88434a6 100644 (file)
@@ -1,10 +1,10 @@
-# CJKRadicals-14.0.0.txt
-# Date: 2021-03-16, 21:39:00 GMT [RC, KW, LI]
-# © 2021 Unicode®, Inc.
-# For terms of use, see http://www.unicode.org/terms_of_use.html
+# CJKRadicals-15.0.0.txt
+# Date: 2022-05-03, 18:49:00 GMT [RC, KW, LI]
+# © 2022 Unicode®, Inc.
+# For terms of use, see https://www.unicode.org/terms_of_use.html
 #
 # Unicode Character Database
-# For documentation, see http://www.unicode.org/reports/tr44/
+# For documentation, see https://www.unicode.org/reports/tr44/
 #
 # Mapping from CJK radical numbers to characters
 #
@@ -23,7 +23,7 @@
 # and in particular they can end with a U+0027 ' APOSTROPHE.
 #
 # For more information, see UAX #38: Unicode Han Database (Unihan),
-# at http://www.unicode.org/reports/tr38/
+# at https://www.unicode.org/reports/tr38/
 #
 # This file was created for Unicode 5.2 by Richard Cook.
 # Updated for Unicode 6.0 by Richard Cook.
index 932ace2..65aa0fc 100644 (file)
@@ -1,11 +1,11 @@
-# CaseFolding-14.0.0.txt
-# Date: 2021-03-08, 19:35:41 GMT
-# © 2021 Unicode®, Inc.
+# CaseFolding-15.0.0.txt
+# Date: 2022-02-02, 23:35:35 GMT
+# © 2022 Unicode®, Inc.
 # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
-# For terms of use, see http://www.unicode.org/terms_of_use.html
+# For terms of use, see https://www.unicode.org/terms_of_use.html
 #
 # Unicode Character Database
-#   For documentation, see http://www.unicode.org/reports/tr44/
+#   For documentation, see https://www.unicode.org/reports/tr44/
 #
 # Case Folding Properties
 #
index 74e425e..bbc8bd7 100644 (file)
@@ -1,6 +1,6 @@
-# CompositionExclusions-14.0.0.txt
-# Date: 2021-03-30, 23:59:00 GMT [KW, LI]
-# © 2021 Unicode®, Inc.
+# CompositionExclusions-15.0.0.txt
+# Date: 2022-05-03, 18:50:00 GMT [KW, LI]
+# © 2022 Unicode®, Inc.
 # For terms of use, see https://www.unicode.org/terms_of_use.html
 #
 # Unicode Character Database
index c8ee531..f8e83ae 100644 (file)
@@ -1,11 +1,11 @@
-# DerivedAge-14.0.0.txt
-# Date: 2021-07-10, 00:35:00 GMT
-# © 2021 Unicode®, Inc.
+# DerivedAge-15.0.0.txt
+# Date: 2022-04-26, 23:14:23 GMT
+# © 2022 Unicode®, Inc.
 # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
-# For terms of use, see http://www.unicode.org/terms_of_use.html
+# For terms of use, see https://www.unicode.org/terms_of_use.html
 #
 # Unicode Character Database
-#   For documentation, see http://www.unicode.org/reports/tr44/
+#   For documentation, see https://www.unicode.org/reports/tr44/
 #
 # Unicode Character Database: Derived Property Data
 # This file shows when various code points were first assigned in Unicode.
@@ -1949,4 +1949,46 @@ FDFE..FDFF    ; 14.0 #   [2] ARABIC LIGATURE SUBHAANAHU WA TAAALAA..ARABIC LIGAT
 
 # Total code points: 838
 
+# ================================================
+
+# Age=V15_0
+
+# Newly assigned in Unicode 15.0.0 (September, 2022)
+
+0CF3          ; 15.0 #       KANNADA SIGN COMBINING ANUSVARA ABOVE RIGHT
+0ECE          ; 15.0 #       LAO YAMAKKAN
+10EFD..10EFF  ; 15.0 #   [3] ARABIC SMALL LOW WORD SAKTA..ARABIC SMALL LOW WORD MADDA
+1123F..11241  ; 15.0 #   [3] KHOJKI LETTER QA..KHOJKI VOWEL SIGN VOCALIC R
+11B00..11B09  ; 15.0 #  [10] DEVANAGARI HEAD MARK..DEVANAGARI SIGN MINDU
+11F00..11F10  ; 15.0 #  [17] KAWI SIGN CANDRABINDU..KAWI LETTER O
+11F12..11F3A  ; 15.0 #  [41] KAWI LETTER KA..KAWI VOWEL SIGN VOCALIC R
+11F3E..11F59  ; 15.0 #  [28] KAWI VOWEL SIGN E..KAWI DIGIT NINE
+1342F         ; 15.0 #       EGYPTIAN HIEROGLYPH V011D
+13439..1343F  ; 15.0 #   [7] EGYPTIAN HIEROGLYPH INSERT AT MIDDLE..EGYPTIAN HIEROGLYPH END WALLED ENCLOSURE
+13440..13455  ; 15.0 #  [22] EGYPTIAN HIEROGLYPH MIRROR HORIZONTALLY..EGYPTIAN HIEROGLYPH MODIFIER DAMAGED
+1B132         ; 15.0 #       HIRAGANA LETTER SMALL KO
+1B155         ; 15.0 #       KATAKANA LETTER SMALL KO
+1D2C0..1D2D3  ; 15.0 #  [20] KAKTOVIK NUMERAL ZERO..KAKTOVIK NUMERAL NINETEEN
+1DF25..1DF2A  ; 15.0 #   [6] LATIN SMALL LETTER D WITH MID-HEIGHT LEFT HOOK..LATIN SMALL LETTER T WITH MID-HEIGHT LEFT HOOK
+1E030..1E06D  ; 15.0 #  [62] MODIFIER LETTER CYRILLIC SMALL A..MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE
+1E08F         ; 15.0 #       COMBINING CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+1E4D0..1E4F9  ; 15.0 #  [42] NAG MUNDARI LETTER O..NAG MUNDARI DIGIT NINE
+1F6DC         ; 15.0 #       WIRELESS
+1F774..1F776  ; 15.0 #   [3] LOT OF FORTUNE..LUNAR ECLIPSE
+1F77B..1F77F  ; 15.0 #   [5] HAUMEA..ORCUS
+1F7D9         ; 15.0 #       NINE POINTED WHITE STAR
+1FA75..1FA77  ; 15.0 #   [3] LIGHT BLUE HEART..PINK HEART
+1FA87..1FA88  ; 15.0 #   [2] MARACAS..FLUTE
+1FAAD..1FAAF  ; 15.0 #   [3] FOLDING HAND FAN..KHANDA
+1FABB..1FABD  ; 15.0 #   [3] HYACINTH..WING
+1FABF         ; 15.0 #       GOOSE
+1FACE..1FACF  ; 15.0 #   [2] MOOSE..DONKEY
+1FADA..1FADB  ; 15.0 #   [2] GINGER ROOT..PEA POD
+1FAE8         ; 15.0 #       SHAKING FACE
+1FAF7..1FAF8  ; 15.0 #   [2] LEFTWARDS PUSHING HAND..RIGHTWARDS PUSHING HAND
+2B739         ; 15.0 #       CJK UNIFIED IDEOGRAPH-2B739
+31350..323AF  ; 15.0 # [4192] CJK UNIFIED IDEOGRAPH-31350..CJK UNIFIED IDEOGRAPH-323AF
+
+# Total code points: 4489
+
 # EOF
index afc2abd..8b482b5 100644 (file)
@@ -1,11 +1,11 @@
-# DerivedCoreProperties-14.0.0.txt
-# Date: 2021-08-12, 23:12:53 GMT
-# © 2021 Unicode®, Inc.
+# DerivedCoreProperties-15.0.0.txt
+# Date: 2022-08-05, 22:17:05 GMT
+# © 2022 Unicode®, Inc.
 # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
-# For terms of use, see http://www.unicode.org/terms_of_use.html
+# For terms of use, see https://www.unicode.org/terms_of_use.html
 #
 # Unicode Character Database
-#   For documentation, see http://www.unicode.org/reports/tr44/
+#   For documentation, see https://www.unicode.org/reports/tr44/
 
 # ================================================
 
@@ -462,6 +462,7 @@ FFE9..FFEC    ; Math # Sm   [4] HALFWIDTH LEFTWARDS ARROW..HALFWIDTH DOWNWARDS A
 0BD7          ; Alphabetic # Mc       TAMIL AU LENGTH MARK
 0C00          ; Alphabetic # Mn       TELUGU SIGN COMBINING CANDRABINDU ABOVE
 0C01..0C03    ; Alphabetic # Mc   [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA
+0C04          ; Alphabetic # Mn       TELUGU SIGN COMBINING ANUSVARA ABOVE
 0C05..0C0C    ; Alphabetic # Lo   [8] TELUGU LETTER A..TELUGU LETTER VOCALIC L
 0C0E..0C10    ; Alphabetic # Lo   [3] TELUGU LETTER E..TELUGU LETTER AI
 0C12..0C28    ; Alphabetic # Lo  [23] TELUGU LETTER O..TELUGU LETTER NA
@@ -497,6 +498,7 @@ FFE9..FFEC    ; Math # Sm   [4] HALFWIDTH LEFTWARDS ARROW..HALFWIDTH DOWNWARDS A
 0CE0..0CE1    ; Alphabetic # Lo   [2] KANNADA LETTER VOCALIC RR..KANNADA LETTER VOCALIC LL
 0CE2..0CE3    ; Alphabetic # Mn   [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL
 0CF1..0CF2    ; Alphabetic # Lo   [2] KANNADA SIGN JIHVAMULIYA..KANNADA SIGN UPADHMANIYA
+0CF3          ; Alphabetic # Mc       KANNADA SIGN COMBINING ANUSVARA ABOVE RIGHT
 0D00..0D01    ; Alphabetic # Mn   [2] MALAYALAM SIGN COMBINING ANUSVARA ABOVE..MALAYALAM SIGN CANDRABINDU
 0D02..0D03    ; Alphabetic # Mc   [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA
 0D04..0D0C    ; Alphabetic # Lo   [9] MALAYALAM LETTER VEDIC ANUSVARA..MALAYALAM LETTER VOCALIC L
@@ -552,7 +554,7 @@ FFE9..FFEC    ; Math # Sm   [4] HALFWIDTH LEFTWARDS ARROW..HALFWIDTH DOWNWARDS A
 0F49..0F6C    ; Alphabetic # Lo  [36] TIBETAN LETTER NYA..TIBETAN LETTER RRA
 0F71..0F7E    ; Alphabetic # Mn  [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO
 0F7F          ; Alphabetic # Mc       TIBETAN SIGN RNAM BCAD
-0F80..0F81    ; Alphabetic # Mn   [2] TIBETAN VOWEL SIGN REVERSED I..TIBETAN VOWEL SIGN REVERSED II
+0F80..0F83    ; Alphabetic # Mn   [4] TIBETAN VOWEL SIGN REVERSED I..TIBETAN SIGN SNA LDAN
 0F88..0F8C    ; Alphabetic # Lo   [5] TIBETAN SIGN LCE TSA CAN..TIBETAN SIGN INVERTED MCHU CAN
 0F8D..0F97    ; Alphabetic # Mn  [11] TIBETAN SUBJOINED SIGN LCE TSA CAN..TIBETAN SUBJOINED LETTER JA
 0F99..0FBC    ; Alphabetic # Mn  [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA
@@ -1053,6 +1055,7 @@ FFDA..FFDC    ; Alphabetic # Lo   [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANG
 11071..11072  ; Alphabetic # Lo   [2] BRAHMI LETTER OLD TAMIL SHORT E..BRAHMI LETTER OLD TAMIL SHORT O
 11073..11074  ; Alphabetic # Mn   [2] BRAHMI VOWEL SIGN OLD TAMIL SHORT E..BRAHMI VOWEL SIGN OLD TAMIL SHORT O
 11075         ; Alphabetic # Lo       BRAHMI LETTER OLD TAMIL LLA
+11080..11081  ; Alphabetic # Mn   [2] KAITHI SIGN CANDRABINDU..KAITHI SIGN ANUSVARA
 11082         ; Alphabetic # Mc       KAITHI SIGN VISARGA
 11083..110AF  ; Alphabetic # Lo  [45] KAITHI LETTER A..KAITHI LETTER HA
 110B0..110B2  ; Alphabetic # Mc   [3] KAITHI VOWEL SIGN AA..KAITHI VOWEL SIGN II
@@ -1089,6 +1092,8 @@ FFDA..FFDC    ; Alphabetic # Lo   [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANG
 11234         ; Alphabetic # Mn       KHOJKI SIGN ANUSVARA
 11237         ; Alphabetic # Mn       KHOJKI SIGN SHADDA
 1123E         ; Alphabetic # Mn       KHOJKI SIGN SUKUN
+1123F..11240  ; Alphabetic # Lo   [2] KHOJKI LETTER QA..KHOJKI LETTER SHORT I
+11241         ; Alphabetic # Mn       KHOJKI VOWEL SIGN VOCALIC R
 11280..11286  ; Alphabetic # Lo   [7] MULTANI LETTER A..MULTANI LETTER GA
 11288         ; Alphabetic # Lo       MULTANI LETTER GHA
 1128A..1128D  ; Alphabetic # Lo   [4] MULTANI LETTER CA..MULTANI LETTER JJA
@@ -1243,12 +1248,22 @@ FFDA..FFDC    ; Alphabetic # Lo   [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANG
 11EE0..11EF2  ; Alphabetic # Lo  [19] MAKASAR LETTER KA..MAKASAR ANGKA
 11EF3..11EF4  ; Alphabetic # Mn   [2] MAKASAR VOWEL SIGN I..MAKASAR VOWEL SIGN U
 11EF5..11EF6  ; Alphabetic # Mc   [2] MAKASAR VOWEL SIGN E..MAKASAR VOWEL SIGN O
+11F00..11F01  ; Alphabetic # Mn   [2] KAWI SIGN CANDRABINDU..KAWI SIGN ANUSVARA
+11F02         ; Alphabetic # Lo       KAWI SIGN REPHA
+11F03         ; Alphabetic # Mc       KAWI SIGN VISARGA
+11F04..11F10  ; Alphabetic # Lo  [13] KAWI LETTER A..KAWI LETTER O
+11F12..11F33  ; Alphabetic # Lo  [34] KAWI LETTER KA..KAWI LETTER JNYA
+11F34..11F35  ; Alphabetic # Mc   [2] KAWI VOWEL SIGN AA..KAWI VOWEL SIGN ALTERNATE AA
+11F36..11F3A  ; Alphabetic # Mn   [5] KAWI VOWEL SIGN I..KAWI VOWEL SIGN VOCALIC R
+11F3E..11F3F  ; Alphabetic # Mc   [2] KAWI VOWEL SIGN E..KAWI VOWEL SIGN AI
+11F40         ; Alphabetic # Mn       KAWI VOWEL SIGN EU
 11FB0         ; Alphabetic # Lo       LISU LETTER YHA
 12000..12399  ; Alphabetic # Lo [922] CUNEIFORM SIGN A..CUNEIFORM SIGN U U
 12400..1246E  ; Alphabetic # Nl [111] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM
 12480..12543  ; Alphabetic # Lo [196] CUNEIFORM SIGN AB TIMES NUN TENU..CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU
 12F90..12FF0  ; Alphabetic # Lo  [97] CYPRO-MINOAN SIGN CM001..CYPRO-MINOAN SIGN CM114
-13000..1342E  ; Alphabetic # Lo [1071] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH AA032
+13000..1342F  ; Alphabetic # Lo [1072] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH V011D
+13441..13446  ; Alphabetic # Lo   [6] EGYPTIAN HIEROGLYPH FULL BLANK..EGYPTIAN HIEROGLYPH WIDE LOST SIGN
 14400..14646  ; Alphabetic # Lo [583] ANATOLIAN HIEROGLYPH A001..ANATOLIAN HIEROGLYPH A530
 16800..16A38  ; Alphabetic # Lo [569] BAMUM LETTER PHASE-A NGKUE MFON..BAMUM LETTER PHASE-F VUEQ
 16A40..16A5E  ; Alphabetic # Lo  [31] MRO LETTER TA..MRO LETTER TEK
@@ -1275,7 +1290,9 @@ FFDA..FFDC    ; Alphabetic # Lo   [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANG
 1AFF5..1AFFB  ; Alphabetic # Lm   [7] KATAKANA LETTER MINNAN TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-5
 1AFFD..1AFFE  ; Alphabetic # Lm   [2] KATAKANA LETTER MINNAN NASALIZED TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-8
 1B000..1B122  ; Alphabetic # Lo [291] KATAKANA LETTER ARCHAIC E..KATAKANA LETTER ARCHAIC WU
+1B132         ; Alphabetic # Lo       HIRAGANA LETTER SMALL KO
 1B150..1B152  ; Alphabetic # Lo   [3] HIRAGANA LETTER SMALL WI..HIRAGANA LETTER SMALL WO
+1B155         ; Alphabetic # Lo       KATAKANA LETTER SMALL KO
 1B164..1B167  ; Alphabetic # Lo   [4] KATAKANA LETTER SMALL WI..KATAKANA LETTER SMALL N
 1B170..1B2FB  ; Alphabetic # Lo [396] NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB
 1BC00..1BC6A  ; Alphabetic # Lo [107] DUPLOYAN LETTER H..DUPLOYAN LETTER VOCALIC M
@@ -1316,16 +1333,21 @@ FFDA..FFDC    ; Alphabetic # Lo   [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANG
 1DF00..1DF09  ; Alphabetic # L&  [10] LATIN SMALL LETTER FENG DIGRAPH WITH TRILL..LATIN SMALL LETTER T WITH HOOK AND RETROFLEX HOOK
 1DF0A         ; Alphabetic # Lo       LATIN LETTER RETROFLEX CLICK WITH RETROFLEX HOOK
 1DF0B..1DF1E  ; Alphabetic # L&  [20] LATIN SMALL LETTER ESH WITH DOUBLE BAR..LATIN SMALL LETTER S WITH CURL
+1DF25..1DF2A  ; Alphabetic # L&   [6] LATIN SMALL LETTER D WITH MID-HEIGHT LEFT HOOK..LATIN SMALL LETTER T WITH MID-HEIGHT LEFT HOOK
 1E000..1E006  ; Alphabetic # Mn   [7] COMBINING GLAGOLITIC LETTER AZU..COMBINING GLAGOLITIC LETTER ZHIVETE
 1E008..1E018  ; Alphabetic # Mn  [17] COMBINING GLAGOLITIC LETTER ZEMLJA..COMBINING GLAGOLITIC LETTER HERU
 1E01B..1E021  ; Alphabetic # Mn   [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI
 1E023..1E024  ; Alphabetic # Mn   [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS
 1E026..1E02A  ; Alphabetic # Mn   [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA
+1E030..1E06D  ; Alphabetic # Lm  [62] MODIFIER LETTER CYRILLIC SMALL A..MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE
+1E08F         ; Alphabetic # Mn       COMBINING CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
 1E100..1E12C  ; Alphabetic # Lo  [45] NYIAKENG PUACHUE HMONG LETTER MA..NYIAKENG PUACHUE HMONG LETTER W
 1E137..1E13D  ; Alphabetic # Lm   [7] NYIAKENG PUACHUE HMONG SIGN FOR PERSON..NYIAKENG PUACHUE HMONG SYLLABLE LENGTHENER
 1E14E         ; Alphabetic # Lo       NYIAKENG PUACHUE HMONG LOGOGRAM NYAJ
 1E290..1E2AD  ; Alphabetic # Lo  [30] TOTO LETTER PA..TOTO LETTER A
 1E2C0..1E2EB  ; Alphabetic # Lo  [44] WANCHO LETTER AA..WANCHO LETTER YIH
+1E4D0..1E4EA  ; Alphabetic # Lo  [27] NAG MUNDARI LETTER O..NAG MUNDARI LETTER ELL
+1E4EB         ; Alphabetic # Lm       NAG MUNDARI SIGN OJOD
 1E7E0..1E7E6  ; Alphabetic # Lo   [7] ETHIOPIC SYLLABLE HHYA..ETHIOPIC SYLLABLE HHYO
 1E7E8..1E7EB  ; Alphabetic # Lo   [4] ETHIOPIC SYLLABLE GURAGE HHWA..ETHIOPIC SYLLABLE HHWE
 1E7ED..1E7EE  ; Alphabetic # Lo   [2] ETHIOPIC SYLLABLE GURAGE MWI..ETHIOPIC SYLLABLE GURAGE MWEE
@@ -1371,14 +1393,15 @@ FFDA..FFDC    ; Alphabetic # Lo   [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANG
 1F150..1F169  ; Alphabetic # So  [26] NEGATIVE CIRCLED LATIN CAPITAL LETTER A..NEGATIVE CIRCLED LATIN CAPITAL LETTER Z
 1F170..1F189  ; Alphabetic # So  [26] NEGATIVE SQUARED LATIN CAPITAL LETTER A..NEGATIVE SQUARED LATIN CAPITAL LETTER Z
 20000..2A6DF  ; Alphabetic # Lo [42720] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6DF
-2A700..2B738  ; Alphabetic # Lo [4153] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B738
+2A700..2B739  ; Alphabetic # Lo [4154] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B739
 2B740..2B81D  ; Alphabetic # Lo [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D
 2B820..2CEA1  ; Alphabetic # Lo [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1
 2CEB0..2EBE0  ; Alphabetic # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0
 2F800..2FA1D  ; Alphabetic # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D
 30000..3134A  ; Alphabetic # Lo [4939] CJK UNIFIED IDEOGRAPH-30000..CJK UNIFIED IDEOGRAPH-3134A
+31350..323AF  ; Alphabetic # Lo [4192] CJK UNIFIED IDEOGRAPH-31350..CJK UNIFIED IDEOGRAPH-323AF
 
-# Total code points: 133396
+# Total code points: 137765
 
 # ================================================
 
@@ -1663,6 +1686,7 @@ FFDA..FFDC    ; Alphabetic # Lo   [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANG
 052F          ; Lowercase # L&       CYRILLIC SMALL LETTER EL WITH DESCENDER
 0560..0588    ; Lowercase # L&  [41] ARMENIAN SMALL LETTER TURNED AYB..ARMENIAN SMALL LETTER YI WITH STROKE
 10D0..10FA    ; Lowercase # L&  [43] GEORGIAN LETTER AN..GEORGIAN LETTER AIN
+10FC          ; Lowercase # Lm       MODIFIER LETTER GEORGIAN NAR
 10FD..10FF    ; Lowercase # L&   [3] GEORGIAN LETTER AEN..GEORGIAN LETTER LABIAL SIGN
 13F8..13FD    ; Lowercase # L&   [6] CHEROKEE SMALL LETTER YE..CHEROKEE SMALL LETTER MV
 1C80..1C88    ; Lowercase # L&   [9] CYRILLIC SMALL LETTER ROUNDED VE..CYRILLIC SMALL LETTER UNBLENDED UK
@@ -2012,12 +2036,14 @@ A7D3          ; Lowercase # L&       LATIN SMALL LETTER DOUBLE THORN
 A7D5          ; Lowercase # L&       LATIN SMALL LETTER DOUBLE WYNN
 A7D7          ; Lowercase # L&       LATIN SMALL LETTER MIDDLE SCOTS S
 A7D9          ; Lowercase # L&       LATIN SMALL LETTER SIGMOID S
+A7F2..A7F4    ; Lowercase # Lm   [3] MODIFIER LETTER CAPITAL C..MODIFIER LETTER CAPITAL Q
 A7F6          ; Lowercase # L&       LATIN SMALL LETTER REVERSED HALF H
 A7F8..A7F9    ; Lowercase # Lm   [2] MODIFIER LETTER CAPITAL H WITH STROKE..MODIFIER LETTER SMALL LIGATURE OE
 A7FA          ; Lowercase # L&       LATIN LETTER SMALL CAPITAL TURNED M
 AB30..AB5A    ; Lowercase # L&  [43] LATIN SMALL LETTER BARRED ALPHA..LATIN SMALL LETTER Y WITH SHORT RIGHT LEG
 AB5C..AB5F    ; Lowercase # Lm   [4] MODIFIER LETTER SMALL HENG..MODIFIER LETTER SMALL U WITH LEFT HOOK
 AB60..AB68    ; Lowercase # L&   [9] LATIN SMALL LETTER SAKHA YAT..LATIN SMALL LETTER TURNED R WITH MIDDLE TILDE
+AB69          ; Lowercase # Lm       MODIFIER LETTER SMALL TURNED W
 AB70..ABBF    ; Lowercase # L&  [80] CHEROKEE SMALL LETTER A..CHEROKEE SMALL LETTER YA
 FB00..FB06    ; Lowercase # L&   [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST
 FB13..FB17    ; Lowercase # L&   [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH
@@ -2065,9 +2091,11 @@ FF41..FF5A    ; Lowercase # L&  [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH L
 1D7CB         ; Lowercase # L&       MATHEMATICAL BOLD SMALL DIGAMMA
 1DF00..1DF09  ; Lowercase # L&  [10] LATIN SMALL LETTER FENG DIGRAPH WITH TRILL..LATIN SMALL LETTER T WITH HOOK AND RETROFLEX HOOK
 1DF0B..1DF1E  ; Lowercase # L&  [20] LATIN SMALL LETTER ESH WITH DOUBLE BAR..LATIN SMALL LETTER S WITH CURL
+1DF25..1DF2A  ; Lowercase # L&   [6] LATIN SMALL LETTER D WITH MID-HEIGHT LEFT HOOK..LATIN SMALL LETTER T WITH MID-HEIGHT LEFT HOOK
+1E030..1E06D  ; Lowercase # Lm  [62] MODIFIER LETTER CYRILLIC SMALL A..MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE
 1E922..1E943  ; Lowercase # L&  [34] ADLAM SMALL LETTER ALIF..ADLAM SMALL LETTER SHA
 
-# Total code points: 2471
+# Total code points: 2544
 
 # ================================================
 
@@ -2767,6 +2795,7 @@ FF21..FF3A    ; Uppercase # L&  [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH
 10C7          ; Cased # L&       GEORGIAN CAPITAL LETTER YN
 10CD          ; Cased # L&       GEORGIAN CAPITAL LETTER AEN
 10D0..10FA    ; Cased # L&  [43] GEORGIAN LETTER AN..GEORGIAN LETTER AIN
+10FC          ; Cased # Lm       MODIFIER LETTER GEORGIAN NAR
 10FD..10FF    ; Cased # L&   [3] GEORGIAN LETTER AEN..GEORGIAN LETTER LABIAL SIGN
 13A0..13F5    ; Cased # L&  [86] CHEROKEE LETTER A..CHEROKEE LETTER MV
 13F8..13FD    ; Cased # L&   [6] CHEROKEE SMALL LETTER YE..CHEROKEE SMALL LETTER MV
@@ -2837,12 +2866,14 @@ A790..A7CA    ; Cased # L&  [59] LATIN CAPITAL LETTER N WITH DESCENDER..LATIN SM
 A7D0..A7D1    ; Cased # L&   [2] LATIN CAPITAL LETTER CLOSED INSULAR G..LATIN SMALL LETTER CLOSED INSULAR G
 A7D3          ; Cased # L&       LATIN SMALL LETTER DOUBLE THORN
 A7D5..A7D9    ; Cased # L&   [5] LATIN SMALL LETTER DOUBLE WYNN..LATIN SMALL LETTER SIGMOID S
+A7F2..A7F4    ; Cased # Lm   [3] MODIFIER LETTER CAPITAL C..MODIFIER LETTER CAPITAL Q
 A7F5..A7F6    ; Cased # L&   [2] LATIN CAPITAL LETTER REVERSED HALF H..LATIN SMALL LETTER REVERSED HALF H
 A7F8..A7F9    ; Cased # Lm   [2] MODIFIER LETTER CAPITAL H WITH STROKE..MODIFIER LETTER SMALL LIGATURE OE
 A7FA          ; Cased # L&       LATIN LETTER SMALL CAPITAL TURNED M
 AB30..AB5A    ; Cased # L&  [43] LATIN SMALL LETTER BARRED ALPHA..LATIN SMALL LETTER Y WITH SHORT RIGHT LEG
 AB5C..AB5F    ; Cased # Lm   [4] MODIFIER LETTER SMALL HENG..MODIFIER LETTER SMALL U WITH LEFT HOOK
 AB60..AB68    ; Cased # L&   [9] LATIN SMALL LETTER SAKHA YAT..LATIN SMALL LETTER TURNED R WITH MIDDLE TILDE
+AB69          ; Cased # Lm       MODIFIER LETTER SMALL TURNED W
 AB70..ABBF    ; Cased # L&  [80] CHEROKEE SMALL LETTER A..CHEROKEE SMALL LETTER YA
 FB00..FB06    ; Cased # L&   [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST
 FB13..FB17    ; Cased # L&   [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH
@@ -2899,12 +2930,14 @@ FF41..FF5A    ; Cased # L&  [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN
 1D7C4..1D7CB  ; Cased # L&   [8] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD SMALL DIGAMMA
 1DF00..1DF09  ; Cased # L&  [10] LATIN SMALL LETTER FENG DIGRAPH WITH TRILL..LATIN SMALL LETTER T WITH HOOK AND RETROFLEX HOOK
 1DF0B..1DF1E  ; Cased # L&  [20] LATIN SMALL LETTER ESH WITH DOUBLE BAR..LATIN SMALL LETTER S WITH CURL
+1DF25..1DF2A  ; Cased # L&   [6] LATIN SMALL LETTER D WITH MID-HEIGHT LEFT HOOK..LATIN SMALL LETTER T WITH MID-HEIGHT LEFT HOOK
+1E030..1E06D  ; Cased # Lm  [62] MODIFIER LETTER CYRILLIC SMALL A..MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE
 1E900..1E943  ; Cased # L&  [68] ADLAM CAPITAL LETTER ALIF..ADLAM SMALL LETTER SHA
 1F130..1F149  ; Cased # So  [26] SQUARED LATIN CAPITAL LETTER A..SQUARED LATIN CAPITAL LETTER Z
 1F150..1F169  ; Cased # So  [26] NEGATIVE CIRCLED LATIN CAPITAL LETTER A..NEGATIVE CIRCLED LATIN CAPITAL LETTER Z
 1F170..1F189  ; Cased # So  [26] NEGATIVE SQUARED LATIN CAPITAL LETTER A..NEGATIVE SQUARED LATIN CAPITAL LETTER Z
 
-# Total code points: 4453
+# Total code points: 4526
 
 # ================================================
 
@@ -3054,7 +3087,7 @@ FF41..FF5A    ; Cased # L&  [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN
 0EB1          ; Case_Ignorable # Mn       LAO VOWEL SIGN MAI KAN
 0EB4..0EBC    ; Case_Ignorable # Mn   [9] LAO VOWEL SIGN I..LAO SEMIVOWEL SIGN LO
 0EC6          ; Case_Ignorable # Lm       LAO KO LA
-0EC8..0ECD    ; Case_Ignorable # Mn   [6] LAO TONE MAI EK..LAO NIGGAHITA
+0EC8..0ECE    ; Case_Ignorable # Mn   [7] LAO TONE MAI EK..LAO YAMAKKAN
 0F18..0F19    ; Case_Ignorable # Mn   [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS
 0F35          ; Case_Ignorable # Mn       TIBETAN MARK NGAS BZUNG NYI ZLA
 0F37          ; Case_Ignorable # Mn       TIBETAN MARK NGAS BZUNG SGOR RTAGS
@@ -3263,6 +3296,7 @@ FFF9..FFFB    ; Case_Ignorable # Cf   [3] INTERLINEAR ANNOTATION ANCHOR..INTERLI
 10AE5..10AE6  ; Case_Ignorable # Mn   [2] MANICHAEAN ABBREVIATION MARK ABOVE..MANICHAEAN ABBREVIATION MARK BELOW
 10D24..10D27  ; Case_Ignorable # Mn   [4] HANIFI ROHINGYA SIGN HARBAHAY..HANIFI ROHINGYA SIGN TASSI
 10EAB..10EAC  ; Case_Ignorable # Mn   [2] YEZIDI COMBINING HAMZA MARK..YEZIDI COMBINING MADDA MARK
+10EFD..10EFF  ; Case_Ignorable # Mn   [3] ARABIC SMALL LOW WORD SAKTA..ARABIC SMALL LOW WORD MADDA
 10F46..10F50  ; Case_Ignorable # Mn  [11] SOGDIAN COMBINING DOT BELOW..SOGDIAN COMBINING STROKE BELOW
 10F82..10F85  ; Case_Ignorable # Mn   [4] OLD UYGHUR COMBINING DOT ABOVE..OLD UYGHUR COMBINING TWO DOTS BELOW
 11001         ; Case_Ignorable # Mn       BRAHMI SIGN ANUSVARA
@@ -3287,6 +3321,7 @@ FFF9..FFFB    ; Case_Ignorable # Cf   [3] INTERLINEAR ANNOTATION ANCHOR..INTERLI
 11234         ; Case_Ignorable # Mn       KHOJKI SIGN ANUSVARA
 11236..11237  ; Case_Ignorable # Mn   [2] KHOJKI SIGN NUKTA..KHOJKI SIGN SHADDA
 1123E         ; Case_Ignorable # Mn       KHOJKI SIGN SUKUN
+11241         ; Case_Ignorable # Mn       KHOJKI VOWEL SIGN VOCALIC R
 112DF         ; Case_Ignorable # Mn       KHUDAWADI SIGN ANUSVARA
 112E3..112EA  ; Case_Ignorable # Mn   [8] KHUDAWADI VOWEL SIGN U..KHUDAWADI SIGN VIRAMA
 11300..11301  ; Case_Ignorable # Mn   [2] GRANTHA SIGN COMBINING ANUSVARA ABOVE..GRANTHA SIGN CANDRABINDU
@@ -3348,7 +3383,13 @@ FFF9..FFFB    ; Case_Ignorable # Cf   [3] INTERLINEAR ANNOTATION ANCHOR..INTERLI
 11D95         ; Case_Ignorable # Mn       GUNJALA GONDI SIGN ANUSVARA
 11D97         ; Case_Ignorable # Mn       GUNJALA GONDI VIRAMA
 11EF3..11EF4  ; Case_Ignorable # Mn   [2] MAKASAR VOWEL SIGN I..MAKASAR VOWEL SIGN U
-13430..13438  ; Case_Ignorable # Cf   [9] EGYPTIAN HIEROGLYPH VERTICAL JOINER..EGYPTIAN HIEROGLYPH END SEGMENT
+11F00..11F01  ; Case_Ignorable # Mn   [2] KAWI SIGN CANDRABINDU..KAWI SIGN ANUSVARA
+11F36..11F3A  ; Case_Ignorable # Mn   [5] KAWI VOWEL SIGN I..KAWI VOWEL SIGN VOCALIC R
+11F40         ; Case_Ignorable # Mn       KAWI VOWEL SIGN EU
+11F42         ; Case_Ignorable # Mn       KAWI CONJOINER
+13430..1343F  ; Case_Ignorable # Cf  [16] EGYPTIAN HIEROGLYPH VERTICAL JOINER..EGYPTIAN HIEROGLYPH END WALLED ENCLOSURE
+13440         ; Case_Ignorable # Mn       EGYPTIAN HIEROGLYPH MIRROR HORIZONTALLY
+13447..13455  ; Case_Ignorable # Mn  [15] EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP START..EGYPTIAN HIEROGLYPH MODIFIER DAMAGED
 16AF0..16AF4  ; Case_Ignorable # Mn   [5] BASSA VAH COMBINING HIGH TONE..BASSA VAH COMBINING HIGH-LOW TONE
 16B30..16B36  ; Case_Ignorable # Mn   [7] PAHAWH HMONG MARK CIM TUB..PAHAWH HMONG MARK CIM TAUM
 16B40..16B43  ; Case_Ignorable # Lm   [4] PAHAWH HMONG SIGN VOS SEEV..PAHAWH HMONG SIGN IB YAM
@@ -3382,10 +3423,14 @@ FFF9..FFFB    ; Case_Ignorable # Cf   [3] INTERLINEAR ANNOTATION ANCHOR..INTERLI
 1E01B..1E021  ; Case_Ignorable # Mn   [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI
 1E023..1E024  ; Case_Ignorable # Mn   [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS
 1E026..1E02A  ; Case_Ignorable # Mn   [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA
+1E030..1E06D  ; Case_Ignorable # Lm  [62] MODIFIER LETTER CYRILLIC SMALL A..MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE
+1E08F         ; Case_Ignorable # Mn       COMBINING CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
 1E130..1E136  ; Case_Ignorable # Mn   [7] NYIAKENG PUACHUE HMONG TONE-B..NYIAKENG PUACHUE HMONG TONE-D
 1E137..1E13D  ; Case_Ignorable # Lm   [7] NYIAKENG PUACHUE HMONG SIGN FOR PERSON..NYIAKENG PUACHUE HMONG SYLLABLE LENGTHENER
 1E2AE         ; Case_Ignorable # Mn       TOTO SIGN RISING TONE
 1E2EC..1E2EF  ; Case_Ignorable # Mn   [4] WANCHO TONE TUP..WANCHO TONE KOINI
+1E4EB         ; Case_Ignorable # Lm       NAG MUNDARI SIGN OJOD
+1E4EC..1E4EF  ; Case_Ignorable # Mn   [4] NAG MUNDARI SIGN MUHOR..NAG MUNDARI SIGN SUTUH
 1E8D0..1E8D6  ; Case_Ignorable # Mn   [7] MENDE KIKAKUI COMBINING NUMBER TEENS..MENDE KIKAKUI COMBINING NUMBER MILLIONS
 1E944..1E94A  ; Case_Ignorable # Mn   [7] ADLAM ALIF LENGTHENER..ADLAM NUKTA
 1E94B         ; Case_Ignorable # Lm       ADLAM NASALIZATION MARK
@@ -3394,7 +3439,7 @@ E0001         ; Case_Ignorable # Cf       LANGUAGE TAG
 E0020..E007F  ; Case_Ignorable # Cf  [96] TAG SPACE..CANCEL TAG
 E0100..E01EF  ; Case_Ignorable # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256
 
-# Total code points: 2602
+# Total code points: 2707
 
 # ================================================
 
@@ -6617,6 +6662,7 @@ FFDA..FFDC    ; ID_Start # Lo   [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL
 111DC         ; ID_Start # Lo       SHARADA HEADSTROKE
 11200..11211  ; ID_Start # Lo  [18] KHOJKI LETTER A..KHOJKI LETTER JJA
 11213..1122B  ; ID_Start # Lo  [25] KHOJKI LETTER NYA..KHOJKI LETTER LLA
+1123F..11240  ; ID_Start # Lo   [2] KHOJKI LETTER QA..KHOJKI LETTER SHORT I
 11280..11286  ; ID_Start # Lo   [7] MULTANI LETTER A..MULTANI LETTER GA
 11288         ; ID_Start # Lo       MULTANI LETTER GHA
 1128A..1128D  ; ID_Start # Lo   [4] MULTANI LETTER CA..MULTANI LETTER JJA
@@ -6679,12 +6725,16 @@ FFDA..FFDC    ; ID_Start # Lo   [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL
 11D6A..11D89  ; ID_Start # Lo  [32] GUNJALA GONDI LETTER OO..GUNJALA GONDI LETTER SA
 11D98         ; ID_Start # Lo       GUNJALA GONDI OM
 11EE0..11EF2  ; ID_Start # Lo  [19] MAKASAR LETTER KA..MAKASAR ANGKA
+11F02         ; ID_Start # Lo       KAWI SIGN REPHA
+11F04..11F10  ; ID_Start # Lo  [13] KAWI LETTER A..KAWI LETTER O
+11F12..11F33  ; ID_Start # Lo  [34] KAWI LETTER KA..KAWI LETTER JNYA
 11FB0         ; ID_Start # Lo       LISU LETTER YHA
 12000..12399  ; ID_Start # Lo [922] CUNEIFORM SIGN A..CUNEIFORM SIGN U U
 12400..1246E  ; ID_Start # Nl [111] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM
 12480..12543  ; ID_Start # Lo [196] CUNEIFORM SIGN AB TIMES NUN TENU..CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU
 12F90..12FF0  ; ID_Start # Lo  [97] CYPRO-MINOAN SIGN CM001..CYPRO-MINOAN SIGN CM114
-13000..1342E  ; ID_Start # Lo [1071] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH AA032
+13000..1342F  ; ID_Start # Lo [1072] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH V011D
+13441..13446  ; ID_Start # Lo   [6] EGYPTIAN HIEROGLYPH FULL BLANK..EGYPTIAN HIEROGLYPH WIDE LOST SIGN
 14400..14646  ; ID_Start # Lo [583] ANATOLIAN HIEROGLYPH A001..ANATOLIAN HIEROGLYPH A530
 16800..16A38  ; ID_Start # Lo [569] BAMUM LETTER PHASE-A NGKUE MFON..BAMUM LETTER PHASE-F VUEQ
 16A40..16A5E  ; ID_Start # Lo  [31] MRO LETTER TA..MRO LETTER TEK
@@ -6707,7 +6757,9 @@ FFDA..FFDC    ; ID_Start # Lo   [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL
 1AFF5..1AFFB  ; ID_Start # Lm   [7] KATAKANA LETTER MINNAN TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-5
 1AFFD..1AFFE  ; ID_Start # Lm   [2] KATAKANA LETTER MINNAN NASALIZED TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-8
 1B000..1B122  ; ID_Start # Lo [291] KATAKANA LETTER ARCHAIC E..KATAKANA LETTER ARCHAIC WU
+1B132         ; ID_Start # Lo       HIRAGANA LETTER SMALL KO
 1B150..1B152  ; ID_Start # Lo   [3] HIRAGANA LETTER SMALL WI..HIRAGANA LETTER SMALL WO
+1B155         ; ID_Start # Lo       KATAKANA LETTER SMALL KO
 1B164..1B167  ; ID_Start # Lo   [4] KATAKANA LETTER SMALL WI..KATAKANA LETTER SMALL N
 1B170..1B2FB  ; ID_Start # Lo [396] NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB
 1BC00..1BC6A  ; ID_Start # Lo [107] DUPLOYAN LETTER H..DUPLOYAN LETTER VOCALIC M
@@ -6747,11 +6799,15 @@ FFDA..FFDC    ; ID_Start # Lo   [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL
 1DF00..1DF09  ; ID_Start # L&  [10] LATIN SMALL LETTER FENG DIGRAPH WITH TRILL..LATIN SMALL LETTER T WITH HOOK AND RETROFLEX HOOK
 1DF0A         ; ID_Start # Lo       LATIN LETTER RETROFLEX CLICK WITH RETROFLEX HOOK
 1DF0B..1DF1E  ; ID_Start # L&  [20] LATIN SMALL LETTER ESH WITH DOUBLE BAR..LATIN SMALL LETTER S WITH CURL
+1DF25..1DF2A  ; ID_Start # L&   [6] LATIN SMALL LETTER D WITH MID-HEIGHT LEFT HOOK..LATIN SMALL LETTER T WITH MID-HEIGHT LEFT HOOK
+1E030..1E06D  ; ID_Start # Lm  [62] MODIFIER LETTER CYRILLIC SMALL A..MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE
 1E100..1E12C  ; ID_Start # Lo  [45] NYIAKENG PUACHUE HMONG LETTER MA..NYIAKENG PUACHUE HMONG LETTER W
 1E137..1E13D  ; ID_Start # Lm   [7] NYIAKENG PUACHUE HMONG SIGN FOR PERSON..NYIAKENG PUACHUE HMONG SYLLABLE LENGTHENER
 1E14E         ; ID_Start # Lo       NYIAKENG PUACHUE HMONG LOGOGRAM NYAJ
 1E290..1E2AD  ; ID_Start # Lo  [30] TOTO LETTER PA..TOTO LETTER A
 1E2C0..1E2EB  ; ID_Start # Lo  [44] WANCHO LETTER AA..WANCHO LETTER YIH
+1E4D0..1E4EA  ; ID_Start # Lo  [27] NAG MUNDARI LETTER O..NAG MUNDARI LETTER ELL
+1E4EB         ; ID_Start # Lm       NAG MUNDARI SIGN OJOD
 1E7E0..1E7E6  ; ID_Start # Lo   [7] ETHIOPIC SYLLABLE HHYA..ETHIOPIC SYLLABLE HHYO
 1E7E8..1E7EB  ; ID_Start # Lo   [4] ETHIOPIC SYLLABLE GURAGE HHWA..ETHIOPIC SYLLABLE HHWE
 1E7ED..1E7EE  ; ID_Start # Lo   [2] ETHIOPIC SYLLABLE GURAGE MWI..ETHIOPIC SYLLABLE GURAGE MWEE
@@ -6793,14 +6849,15 @@ FFDA..FFDC    ; ID_Start # Lo   [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL
 1EEA5..1EEA9  ; ID_Start # Lo   [5] ARABIC MATHEMATICAL DOUBLE-STRUCK WAW..ARABIC MATHEMATICAL DOUBLE-STRUCK YEH
 1EEAB..1EEBB  ; ID_Start # Lo  [17] ARABIC MATHEMATICAL DOUBLE-STRUCK LAM..ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN
 20000..2A6DF  ; ID_Start # Lo [42720] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6DF
-2A700..2B738  ; ID_Start # Lo [4153] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B738
+2A700..2B739  ; ID_Start # Lo [4154] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B739
 2B740..2B81D  ; ID_Start # Lo [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D
 2B820..2CEA1  ; ID_Start # Lo [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1
 2CEB0..2EBE0  ; ID_Start # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0
 2F800..2FA1D  ; ID_Start # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D
 30000..3134A  ; ID_Start # Lo [4939] CJK UNIFIED IDEOGRAPH-30000..CJK UNIFIED IDEOGRAPH-3134A
+31350..323AF  ; ID_Start # Lo [4192] CJK UNIFIED IDEOGRAPH-31350..CJK UNIFIED IDEOGRAPH-323AF
 
-# Total code points: 131997
+# Total code points: 136345
 
 # ================================================
 
@@ -7083,6 +7140,7 @@ FFDA..FFDC    ; ID_Start # Lo   [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL
 0CE2..0CE3    ; ID_Continue # Mn   [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL
 0CE6..0CEF    ; ID_Continue # Nd  [10] KANNADA DIGIT ZERO..KANNADA DIGIT NINE
 0CF1..0CF2    ; ID_Continue # Lo   [2] KANNADA SIGN JIHVAMULIYA..KANNADA SIGN UPADHMANIYA
+0CF3          ; ID_Continue # Mc       KANNADA SIGN COMBINING ANUSVARA ABOVE RIGHT
 0D00..0D01    ; ID_Continue # Mn   [2] MALAYALAM SIGN COMBINING ANUSVARA ABOVE..MALAYALAM SIGN CANDRABINDU
 0D02..0D03    ; ID_Continue # Mc   [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA
 0D04..0D0C    ; ID_Continue # Lo   [9] MALAYALAM LETTER VEDIC ANUSVARA..MALAYALAM LETTER VOCALIC L
@@ -7136,7 +7194,7 @@ FFDA..FFDC    ; ID_Start # Lo   [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL
 0EBD          ; ID_Continue # Lo       LAO SEMIVOWEL SIGN NYO
 0EC0..0EC4    ; ID_Continue # Lo   [5] LAO VOWEL SIGN E..LAO VOWEL SIGN AI
 0EC6          ; ID_Continue # Lm       LAO KO LA
-0EC8..0ECD    ; ID_Continue # Mn   [6] LAO TONE MAI EK..LAO NIGGAHITA
+0EC8..0ECE    ; ID_Continue # Mn   [7] LAO TONE MAI EK..LAO YAMAKKAN
 0ED0..0ED9    ; ID_Continue # Nd  [10] LAO DIGIT ZERO..LAO DIGIT NINE
 0EDC..0EDF    ; ID_Continue # Lo   [4] LAO HO NO..LAO LETTER KHMU NYO
 0F00          ; ID_Continue # Lo       TIBETAN SYLLABLE OM
@@ -7719,6 +7777,7 @@ FFDA..FFDC    ; ID_Continue # Lo   [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HAN
 10E80..10EA9  ; ID_Continue # Lo  [42] YEZIDI LETTER ELIF..YEZIDI LETTER ET
 10EAB..10EAC  ; ID_Continue # Mn   [2] YEZIDI COMBINING HAMZA MARK..YEZIDI COMBINING MADDA MARK
 10EB0..10EB1  ; ID_Continue # Lo   [2] YEZIDI LETTER LAM WITH DOT ABOVE..YEZIDI LETTER YOT WITH CIRCUMFLEX ABOVE
+10EFD..10EFF  ; ID_Continue # Mn   [3] ARABIC SMALL LOW WORD SAKTA..ARABIC SMALL LOW WORD MADDA
 10F00..10F1C  ; ID_Continue # Lo  [29] OLD SOGDIAN LETTER ALEPH..OLD SOGDIAN LETTER FINAL TAW WITH VERTICAL TAIL
 10F27         ; ID_Continue # Lo       OLD SOGDIAN LIGATURE AYIN-DALETH
 10F30..10F45  ; ID_Continue # Lo  [22] SOGDIAN LETTER ALEPH..SOGDIAN INDEPENDENT SHIN
@@ -7781,6 +7840,8 @@ FFDA..FFDC    ; ID_Continue # Lo   [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HAN
 11235         ; ID_Continue # Mc       KHOJKI SIGN VIRAMA
 11236..11237  ; ID_Continue # Mn   [2] KHOJKI SIGN NUKTA..KHOJKI SIGN SHADDA
 1123E         ; ID_Continue # Mn       KHOJKI SIGN SUKUN
+1123F..11240  ; ID_Continue # Lo   [2] KHOJKI LETTER QA..KHOJKI LETTER SHORT I
+11241         ; ID_Continue # Mn       KHOJKI VOWEL SIGN VOCALIC R
 11280..11286  ; ID_Continue # Lo   [7] MULTANI LETTER A..MULTANI LETTER GA
 11288         ; ID_Continue # Lo       MULTANI LETTER GHA
 1128A..1128D  ; ID_Continue # Lo   [4] MULTANI LETTER CA..MULTANI LETTER JJA
@@ -7963,12 +8024,27 @@ FFDA..FFDC    ; ID_Continue # Lo   [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HAN
 11EE0..11EF2  ; ID_Continue # Lo  [19] MAKASAR LETTER KA..MAKASAR ANGKA
 11EF3..11EF4  ; ID_Continue # Mn   [2] MAKASAR VOWEL SIGN I..MAKASAR VOWEL SIGN U
 11EF5..11EF6  ; ID_Continue # Mc   [2] MAKASAR VOWEL SIGN E..MAKASAR VOWEL SIGN O
+11F00..11F01  ; ID_Continue # Mn   [2] KAWI SIGN CANDRABINDU..KAWI SIGN ANUSVARA
+11F02         ; ID_Continue # Lo       KAWI SIGN REPHA
+11F03         ; ID_Continue # Mc       KAWI SIGN VISARGA
+11F04..11F10  ; ID_Continue # Lo  [13] KAWI LETTER A..KAWI LETTER O
+11F12..11F33  ; ID_Continue # Lo  [34] KAWI LETTER KA..KAWI LETTER JNYA
+11F34..11F35  ; ID_Continue # Mc   [2] KAWI VOWEL SIGN AA..KAWI VOWEL SIGN ALTERNATE AA
+11F36..11F3A  ; ID_Continue # Mn   [5] KAWI VOWEL SIGN I..KAWI VOWEL SIGN VOCALIC R
+11F3E..11F3F  ; ID_Continue # Mc   [2] KAWI VOWEL SIGN E..KAWI VOWEL SIGN AI
+11F40         ; ID_Continue # Mn       KAWI VOWEL SIGN EU
+11F41         ; ID_Continue # Mc       KAWI SIGN KILLER
+11F42         ; ID_Continue # Mn       KAWI CONJOINER
+11F50..11F59  ; ID_Continue # Nd  [10] KAWI DIGIT ZERO..KAWI DIGIT NINE
 11FB0         ; ID_Continue # Lo       LISU LETTER YHA
 12000..12399  ; ID_Continue # Lo [922] CUNEIFORM SIGN A..CUNEIFORM SIGN U U
 12400..1246E  ; ID_Continue # Nl [111] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM
 12480..12543  ; ID_Continue # Lo [196] CUNEIFORM SIGN AB TIMES NUN TENU..CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU
 12F90..12FF0  ; ID_Continue # Lo  [97] CYPRO-MINOAN SIGN CM001..CYPRO-MINOAN SIGN CM114
-13000..1342E  ; ID_Continue # Lo [1071] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH AA032
+13000..1342F  ; ID_Continue # Lo [1072] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH V011D
+13440         ; ID_Continue # Mn       EGYPTIAN HIEROGLYPH MIRROR HORIZONTALLY
+13441..13446  ; ID_Continue # Lo   [6] EGYPTIAN HIEROGLYPH FULL BLANK..EGYPTIAN HIEROGLYPH WIDE LOST SIGN
+13447..13455  ; ID_Continue # Mn  [15] EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP START..EGYPTIAN HIEROGLYPH MODIFIER DAMAGED
 14400..14646  ; ID_Continue # Lo [583] ANATOLIAN HIEROGLYPH A001..ANATOLIAN HIEROGLYPH A530
 16800..16A38  ; ID_Continue # Lo [569] BAMUM LETTER PHASE-A NGKUE MFON..BAMUM LETTER PHASE-F VUEQ
 16A40..16A5E  ; ID_Continue # Lo  [31] MRO LETTER TA..MRO LETTER TEK
@@ -8001,7 +8077,9 @@ FFDA..FFDC    ; ID_Continue # Lo   [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HAN
 1AFF5..1AFFB  ; ID_Continue # Lm   [7] KATAKANA LETTER MINNAN TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-5
 1AFFD..1AFFE  ; ID_Continue # Lm   [2] KATAKANA LETTER MINNAN NASALIZED TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-8
 1B000..1B122  ; ID_Continue # Lo [291] KATAKANA LETTER ARCHAIC E..KATAKANA LETTER ARCHAIC WU
+1B132         ; ID_Continue # Lo       HIRAGANA LETTER SMALL KO
 1B150..1B152  ; ID_Continue # Lo   [3] HIRAGANA LETTER SMALL WI..HIRAGANA LETTER SMALL WO
+1B155         ; ID_Continue # Lo       KATAKANA LETTER SMALL KO
 1B164..1B167  ; ID_Continue # Lo   [4] KATAKANA LETTER SMALL WI..KATAKANA LETTER SMALL N
 1B170..1B2FB  ; ID_Continue # Lo [396] NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB
 1BC00..1BC6A  ; ID_Continue # Lo [107] DUPLOYAN LETTER H..DUPLOYAN LETTER VOCALIC M
@@ -8058,11 +8136,14 @@ FFDA..FFDC    ; ID_Continue # Lo   [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HAN
 1DF00..1DF09  ; ID_Continue # L&  [10] LATIN SMALL LETTER FENG DIGRAPH WITH TRILL..LATIN SMALL LETTER T WITH HOOK AND RETROFLEX HOOK
 1DF0A         ; ID_Continue # Lo       LATIN LETTER RETROFLEX CLICK WITH RETROFLEX HOOK
 1DF0B..1DF1E  ; ID_Continue # L&  [20] LATIN SMALL LETTER ESH WITH DOUBLE BAR..LATIN SMALL LETTER S WITH CURL
+1DF25..1DF2A  ; ID_Continue # L&   [6] LATIN SMALL LETTER D WITH MID-HEIGHT LEFT HOOK..LATIN SMALL LETTER T WITH MID-HEIGHT LEFT HOOK
 1E000..1E006  ; ID_Continue # Mn   [7] COMBINING GLAGOLITIC LETTER AZU..COMBINING GLAGOLITIC LETTER ZHIVETE
 1E008..1E018  ; ID_Continue # Mn  [17] COMBINING GLAGOLITIC LETTER ZEMLJA..COMBINING GLAGOLITIC LETTER HERU
 1E01B..1E021  ; ID_Continue # Mn   [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI
 1E023..1E024  ; ID_Continue # Mn   [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS
 1E026..1E02A  ; ID_Continue # Mn   [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA
+1E030..1E06D  ; ID_Continue # Lm  [62] MODIFIER LETTER CYRILLIC SMALL A..MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE
+1E08F         ; ID_Continue # Mn       COMBINING CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
 1E100..1E12C  ; ID_Continue # Lo  [45] NYIAKENG PUACHUE HMONG LETTER MA..NYIAKENG PUACHUE HMONG LETTER W
 1E130..1E136  ; ID_Continue # Mn   [7] NYIAKENG PUACHUE HMONG TONE-B..NYIAKENG PUACHUE HMONG TONE-D
 1E137..1E13D  ; ID_Continue # Lm   [7] NYIAKENG PUACHUE HMONG SIGN FOR PERSON..NYIAKENG PUACHUE HMONG SYLLABLE LENGTHENER
@@ -8073,6 +8154,10 @@ FFDA..FFDC    ; ID_Continue # Lo   [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HAN
 1E2C0..1E2EB  ; ID_Continue # Lo  [44] WANCHO LETTER AA..WANCHO LETTER YIH
 1E2EC..1E2EF  ; ID_Continue # Mn   [4] WANCHO TONE TUP..WANCHO TONE KOINI
 1E2F0..1E2F9  ; ID_Continue # Nd  [10] WANCHO DIGIT ZERO..WANCHO DIGIT NINE
+1E4D0..1E4EA  ; ID_Continue # Lo  [27] NAG MUNDARI LETTER O..NAG MUNDARI LETTER ELL
+1E4EB         ; ID_Continue # Lm       NAG MUNDARI SIGN OJOD
+1E4EC..1E4EF  ; ID_Continue # Mn   [4] NAG MUNDARI SIGN MUHOR..NAG MUNDARI SIGN SUTUH
+1E4F0..1E4F9  ; ID_Continue # Nd  [10] NAG MUNDARI DIGIT ZERO..NAG MUNDARI DIGIT NINE
 1E7E0..1E7E6  ; ID_Continue # Lo   [7] ETHIOPIC SYLLABLE HHYA..ETHIOPIC SYLLABLE HHYO
 1E7E8..1E7EB  ; ID_Continue # Lo   [4] ETHIOPIC SYLLABLE GURAGE HHWA..ETHIOPIC SYLLABLE HHWE
 1E7ED..1E7EE  ; ID_Continue # Lo   [2] ETHIOPIC SYLLABLE GURAGE MWI..ETHIOPIC SYLLABLE GURAGE MWEE
@@ -8118,15 +8203,16 @@ FFDA..FFDC    ; ID_Continue # Lo   [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HAN
 1EEAB..1EEBB  ; ID_Continue # Lo  [17] ARABIC MATHEMATICAL DOUBLE-STRUCK LAM..ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN
 1FBF0..1FBF9  ; ID_Continue # Nd  [10] SEGMENTED DIGIT ZERO..SEGMENTED DIGIT NINE
 20000..2A6DF  ; ID_Continue # Lo [42720] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6DF
-2A700..2B738  ; ID_Continue # Lo [4153] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B738
+2A700..2B739  ; ID_Continue # Lo [4154] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B739
 2B740..2B81D  ; ID_Continue # Lo [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D
 2B820..2CEA1  ; ID_Continue # Lo [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1
 2CEB0..2EBE0  ; ID_Continue # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0
 2F800..2FA1D  ; ID_Continue # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D
 30000..3134A  ; ID_Continue # Lo [4939] CJK UNIFIED IDEOGRAPH-30000..CJK UNIFIED IDEOGRAPH-3134A
+31350..323AF  ; ID_Continue # Lo [4192] CJK UNIFIED IDEOGRAPH-31350..CJK UNIFIED IDEOGRAPH-323AF
 E0100..E01EF  ; ID_Continue # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256
 
-# Total code points: 135072
+# Total code points: 139482
 
 # ================================================
 
@@ -8685,6 +8771,7 @@ FFDA..FFDC    ; XID_Start # Lo   [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGU
 111DC         ; XID_Start # Lo       SHARADA HEADSTROKE
 11200..11211  ; XID_Start # Lo  [18] KHOJKI LETTER A..KHOJKI LETTER JJA
 11213..1122B  ; XID_Start # Lo  [25] KHOJKI LETTER NYA..KHOJKI LETTER LLA
+1123F..11240  ; XID_Start # Lo   [2] KHOJKI LETTER QA..KHOJKI LETTER SHORT I
 11280..11286  ; XID_Start # Lo   [7] MULTANI LETTER A..MULTANI LETTER GA
 11288         ; XID_Start # Lo       MULTANI LETTER GHA
 1128A..1128D  ; XID_Start # Lo   [4] MULTANI LETTER CA..MULTANI LETTER JJA
@@ -8747,12 +8834,16 @@ FFDA..FFDC    ; XID_Start # Lo   [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGU
 11D6A..11D89  ; XID_Start # Lo  [32] GUNJALA GONDI LETTER OO..GUNJALA GONDI LETTER SA
 11D98         ; XID_Start # Lo       GUNJALA GONDI OM
 11EE0..11EF2  ; XID_Start # Lo  [19] MAKASAR LETTER KA..MAKASAR ANGKA
+11F02         ; XID_Start # Lo       KAWI SIGN REPHA
+11F04..11F10  ; XID_Start # Lo  [13] KAWI LETTER A..KAWI LETTER O
+11F12..11F33  ; XID_Start # Lo  [34] KAWI LETTER KA..KAWI LETTER JNYA
 11FB0         ; XID_Start # Lo       LISU LETTER YHA
 12000..12399  ; XID_Start # Lo [922] CUNEIFORM SIGN A..CUNEIFORM SIGN U U
 12400..1246E  ; XID_Start # Nl [111] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM
 12480..12543  ; XID_Start # Lo [196] CUNEIFORM SIGN AB TIMES NUN TENU..CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU
 12F90..12FF0  ; XID_Start # Lo  [97] CYPRO-MINOAN SIGN CM001..CYPRO-MINOAN SIGN CM114
-13000..1342E  ; XID_Start # Lo [1071] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH AA032
+13000..1342F  ; XID_Start # Lo [1072] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH V011D
+13441..13446  ; XID_Start # Lo   [6] EGYPTIAN HIEROGLYPH FULL BLANK..EGYPTIAN HIEROGLYPH WIDE LOST SIGN
 14400..14646  ; XID_Start # Lo [583] ANATOLIAN HIEROGLYPH A001..ANATOLIAN HIEROGLYPH A530
 16800..16A38  ; XID_Start # Lo [569] BAMUM LETTER PHASE-A NGKUE MFON..BAMUM LETTER PHASE-F VUEQ
 16A40..16A5E  ; XID_Start # Lo  [31] MRO LETTER TA..MRO LETTER TEK
@@ -8775,7 +8866,9 @@ FFDA..FFDC    ; XID_Start # Lo   [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGU
 1AFF5..1AFFB  ; XID_Start # Lm   [7] KATAKANA LETTER MINNAN TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-5
 1AFFD..1AFFE  ; XID_Start # Lm   [2] KATAKANA LETTER MINNAN NASALIZED TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-8
 1B000..1B122  ; XID_Start # Lo [291] KATAKANA LETTER ARCHAIC E..KATAKANA LETTER ARCHAIC WU
+1B132         ; XID_Start # Lo       HIRAGANA LETTER SMALL KO
 1B150..1B152  ; XID_Start # Lo   [3] HIRAGANA LETTER SMALL WI..HIRAGANA LETTER SMALL WO
+1B155         ; XID_Start # Lo       KATAKANA LETTER SMALL KO
 1B164..1B167  ; XID_Start # Lo   [4] KATAKANA LETTER SMALL WI..KATAKANA LETTER SMALL N
 1B170..1B2FB  ; XID_Start # Lo [396] NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB
 1BC00..1BC6A  ; XID_Start # Lo [107] DUPLOYAN LETTER H..DUPLOYAN LETTER VOCALIC M
@@ -8815,11 +8908,15 @@ FFDA..FFDC    ; XID_Start # Lo   [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGU
 1DF00..1DF09  ; XID_Start # L&  [10] LATIN SMALL LETTER FENG DIGRAPH WITH TRILL..LATIN SMALL LETTER T WITH HOOK AND RETROFLEX HOOK
 1DF0A         ; XID_Start # Lo       LATIN LETTER RETROFLEX CLICK WITH RETROFLEX HOOK
 1DF0B..1DF1E  ; XID_Start # L&  [20] LATIN SMALL LETTER ESH WITH DOUBLE BAR..LATIN SMALL LETTER S WITH CURL
+1DF25..1DF2A  ; XID_Start # L&   [6] LATIN SMALL LETTER D WITH MID-HEIGHT LEFT HOOK..LATIN SMALL LETTER T WITH MID-HEIGHT LEFT HOOK
+1E030..1E06D  ; XID_Start # Lm  [62] MODIFIER LETTER CYRILLIC SMALL A..MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE
 1E100..1E12C  ; XID_Start # Lo  [45] NYIAKENG PUACHUE HMONG LETTER MA..NYIAKENG PUACHUE HMONG LETTER W
 1E137..1E13D  ; XID_Start # Lm   [7] NYIAKENG PUACHUE HMONG SIGN FOR PERSON..NYIAKENG PUACHUE HMONG SYLLABLE LENGTHENER
 1E14E         ; XID_Start # Lo       NYIAKENG PUACHUE HMONG LOGOGRAM NYAJ
 1E290..1E2AD  ; XID_Start # Lo  [30] TOTO LETTER PA..TOTO LETTER A
 1E2C0..1E2EB  ; XID_Start # Lo  [44] WANCHO LETTER AA..WANCHO LETTER YIH
+1E4D0..1E4EA  ; XID_Start # Lo  [27] NAG MUNDARI LETTER O..NAG MUNDARI LETTER ELL
+1E4EB         ; XID_Start # Lm       NAG MUNDARI SIGN OJOD
 1E7E0..1E7E6  ; XID_Start # Lo   [7] ETHIOPIC SYLLABLE HHYA..ETHIOPIC SYLLABLE HHYO
 1E7E8..1E7EB  ; XID_Start # Lo   [4] ETHIOPIC SYLLABLE GURAGE HHWA..ETHIOPIC SYLLABLE HHWE
 1E7ED..1E7EE  ; XID_Start # Lo   [2] ETHIOPIC SYLLABLE GURAGE MWI..ETHIOPIC SYLLABLE GURAGE MWEE
@@ -8861,14 +8958,15 @@ FFDA..FFDC    ; XID_Start # Lo   [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGU
 1EEA5..1EEA9  ; XID_Start # Lo   [5] ARABIC MATHEMATICAL DOUBLE-STRUCK WAW..ARABIC MATHEMATICAL DOUBLE-STRUCK YEH
 1EEAB..1EEBB  ; XID_Start # Lo  [17] ARABIC MATHEMATICAL DOUBLE-STRUCK LAM..ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN
 20000..2A6DF  ; XID_Start # Lo [42720] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6DF
-2A700..2B738  ; XID_Start # Lo [4153] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B738
+2A700..2B739  ; XID_Start # Lo [4154] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B739
 2B740..2B81D  ; XID_Start # Lo [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D
 2B820..2CEA1  ; XID_Start # Lo [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1
 2CEB0..2EBE0  ; XID_Start # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0
 2F800..2FA1D  ; XID_Start # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D
 30000..3134A  ; XID_Start # Lo [4939] CJK UNIFIED IDEOGRAPH-30000..CJK UNIFIED IDEOGRAPH-3134A
+31350..323AF  ; XID_Start # Lo [4192] CJK UNIFIED IDEOGRAPH-31350..CJK UNIFIED IDEOGRAPH-323AF
 
-# Total code points: 131974
+# Total code points: 136322
 
 # ================================================
 
@@ -9147,6 +9245,7 @@ FFDA..FFDC    ; XID_Start # Lo   [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGU
 0CE2..0CE3    ; XID_Continue # Mn   [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL
 0CE6..0CEF    ; XID_Continue # Nd  [10] KANNADA DIGIT ZERO..KANNADA DIGIT NINE
 0CF1..0CF2    ; XID_Continue # Lo   [2] KANNADA SIGN JIHVAMULIYA..KANNADA SIGN UPADHMANIYA
+0CF3          ; XID_Continue # Mc       KANNADA SIGN COMBINING ANUSVARA ABOVE RIGHT
 0D00..0D01    ; XID_Continue # Mn   [2] MALAYALAM SIGN COMBINING ANUSVARA ABOVE..MALAYALAM SIGN CANDRABINDU
 0D02..0D03    ; XID_Continue # Mc   [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA
 0D04..0D0C    ; XID_Continue # Lo   [9] MALAYALAM LETTER VEDIC ANUSVARA..MALAYALAM LETTER VOCALIC L
@@ -9200,7 +9299,7 @@ FFDA..FFDC    ; XID_Start # Lo   [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGU
 0EBD          ; XID_Continue # Lo       LAO SEMIVOWEL SIGN NYO
 0EC0..0EC4    ; XID_Continue # Lo   [5] LAO VOWEL SIGN E..LAO VOWEL SIGN AI
 0EC6          ; XID_Continue # Lm       LAO KO LA
-0EC8..0ECD    ; XID_Continue # Mn   [6] LAO TONE MAI EK..LAO NIGGAHITA
+0EC8..0ECE    ; XID_Continue # Mn   [7] LAO TONE MAI EK..LAO YAMAKKAN
 0ED0..0ED9    ; XID_Continue # Nd  [10] LAO DIGIT ZERO..LAO DIGIT NINE
 0EDC..0EDF    ; XID_Continue # Lo   [4] LAO HO NO..LAO LETTER KHMU NYO
 0F00          ; XID_Continue # Lo       TIBETAN SYLLABLE OM
@@ -9788,6 +9887,7 @@ FFDA..FFDC    ; XID_Continue # Lo   [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HA
 10E80..10EA9  ; XID_Continue # Lo  [42] YEZIDI LETTER ELIF..YEZIDI LETTER ET
 10EAB..10EAC  ; XID_Continue # Mn   [2] YEZIDI COMBINING HAMZA MARK..YEZIDI COMBINING MADDA MARK
 10EB0..10EB1  ; XID_Continue # Lo   [2] YEZIDI LETTER LAM WITH DOT ABOVE..YEZIDI LETTER YOT WITH CIRCUMFLEX ABOVE
+10EFD..10EFF  ; XID_Continue # Mn   [3] ARABIC SMALL LOW WORD SAKTA..ARABIC SMALL LOW WORD MADDA
 10F00..10F1C  ; XID_Continue # Lo  [29] OLD SOGDIAN LETTER ALEPH..OLD SOGDIAN LETTER FINAL TAW WITH VERTICAL TAIL
 10F27         ; XID_Continue # Lo       OLD SOGDIAN LIGATURE AYIN-DALETH
 10F30..10F45  ; XID_Continue # Lo  [22] SOGDIAN LETTER ALEPH..SOGDIAN INDEPENDENT SHIN
@@ -9850,6 +9950,8 @@ FFDA..FFDC    ; XID_Continue # Lo   [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HA
 11235         ; XID_Continue # Mc       KHOJKI SIGN VIRAMA
 11236..11237  ; XID_Continue # Mn   [2] KHOJKI SIGN NUKTA..KHOJKI SIGN SHADDA
 1123E         ; XID_Continue # Mn       KHOJKI SIGN SUKUN
+1123F..11240  ; XID_Continue # Lo   [2] KHOJKI LETTER QA..KHOJKI LETTER SHORT I
+11241         ; XID_Continue # Mn       KHOJKI VOWEL SIGN VOCALIC R
 11280..11286  ; XID_Continue # Lo   [7] MULTANI LETTER A..MULTANI LETTER GA
 11288         ; XID_Continue # Lo       MULTANI LETTER GHA
 1128A..1128D  ; XID_Continue # Lo   [4] MULTANI LETTER CA..MULTANI LETTER JJA
@@ -10032,12 +10134,27 @@ FFDA..FFDC    ; XID_Continue # Lo   [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HA
 11EE0..11EF2  ; XID_Continue # Lo  [19] MAKASAR LETTER KA..MAKASAR ANGKA
 11EF3..11EF4  ; XID_Continue # Mn   [2] MAKASAR VOWEL SIGN I..MAKASAR VOWEL SIGN U
 11EF5..11EF6  ; XID_Continue # Mc   [2] MAKASAR VOWEL SIGN E..MAKASAR VOWEL SIGN O
+11F00..11F01  ; XID_Continue # Mn   [2] KAWI SIGN CANDRABINDU..KAWI SIGN ANUSVARA
+11F02         ; XID_Continue # Lo       KAWI SIGN REPHA
+11F03         ; XID_Continue # Mc       KAWI SIGN VISARGA
+11F04..11F10  ; XID_Continue # Lo  [13] KAWI LETTER A..KAWI LETTER O
+11F12..11F33  ; XID_Continue # Lo  [34] KAWI LETTER KA..KAWI LETTER JNYA
+11F34..11F35  ; XID_Continue # Mc   [2] KAWI VOWEL SIGN AA..KAWI VOWEL SIGN ALTERNATE AA
+11F36..11F3A  ; XID_Continue # Mn   [5] KAWI VOWEL SIGN I..KAWI VOWEL SIGN VOCALIC R
+11F3E..11F3F  ; XID_Continue # Mc   [2] KAWI VOWEL SIGN E..KAWI VOWEL SIGN AI
+11F40         ; XID_Continue # Mn       KAWI VOWEL SIGN EU
+11F41         ; XID_Continue # Mc       KAWI SIGN KILLER
+11F42         ; XID_Continue # Mn       KAWI CONJOINER
+11F50..11F59  ; XID_Continue # Nd  [10] KAWI DIGIT ZERO..KAWI DIGIT NINE
 11FB0         ; XID_Continue # Lo       LISU LETTER YHA
 12000..12399  ; XID_Continue # Lo [922] CUNEIFORM SIGN A..CUNEIFORM SIGN U U
 12400..1246E  ; XID_Continue # Nl [111] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM
 12480..12543  ; XID_Continue # Lo [196] CUNEIFORM SIGN AB TIMES NUN TENU..CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU
 12F90..12FF0  ; XID_Continue # Lo  [97] CYPRO-MINOAN SIGN CM001..CYPRO-MINOAN SIGN CM114
-13000..1342E  ; XID_Continue # Lo [1071] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH AA032
+13000..1342F  ; XID_Continue # Lo [1072] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH V011D
+13440         ; XID_Continue # Mn       EGYPTIAN HIEROGLYPH MIRROR HORIZONTALLY
+13441..13446  ; XID_Continue # Lo   [6] EGYPTIAN HIEROGLYPH FULL BLANK..EGYPTIAN HIEROGLYPH WIDE LOST SIGN
+13447..13455  ; XID_Continue # Mn  [15] EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP START..EGYPTIAN HIEROGLYPH MODIFIER DAMAGED
 14400..14646  ; XID_Continue # Lo [583] ANATOLIAN HIEROGLYPH A001..ANATOLIAN HIEROGLYPH A530
 16800..16A38  ; XID_Continue # Lo [569] BAMUM LETTER PHASE-A NGKUE MFON..BAMUM LETTER PHASE-F VUEQ
 16A40..16A5E  ; XID_Continue # Lo  [31] MRO LETTER TA..MRO LETTER TEK
@@ -10070,7 +10187,9 @@ FFDA..FFDC    ; XID_Continue # Lo   [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HA
 1AFF5..1AFFB  ; XID_Continue # Lm   [7] KATAKANA LETTER MINNAN TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-5
 1AFFD..1AFFE  ; XID_Continue # Lm   [2] KATAKANA LETTER MINNAN NASALIZED TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-8
 1B000..1B122  ; XID_Continue # Lo [291] KATAKANA LETTER ARCHAIC E..KATAKANA LETTER ARCHAIC WU
+1B132         ; XID_Continue # Lo       HIRAGANA LETTER SMALL KO
 1B150..1B152  ; XID_Continue # Lo   [3] HIRAGANA LETTER SMALL WI..HIRAGANA LETTER SMALL WO
+1B155         ; XID_Continue # Lo       KATAKANA LETTER SMALL KO
 1B164..1B167  ; XID_Continue # Lo   [4] KATAKANA LETTER SMALL WI..KATAKANA LETTER SMALL N
 1B170..1B2FB  ; XID_Continue # Lo [396] NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB
 1BC00..1BC6A  ; XID_Continue # Lo [107] DUPLOYAN LETTER H..DUPLOYAN LETTER VOCALIC M
@@ -10127,11 +10246,14 @@ FFDA..FFDC    ; XID_Continue # Lo   [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HA
 1DF00..1DF09  ; XID_Continue # L&  [10] LATIN SMALL LETTER FENG DIGRAPH WITH TRILL..LATIN SMALL LETTER T WITH HOOK AND RETROFLEX HOOK
 1DF0A         ; XID_Continue # Lo       LATIN LETTER RETROFLEX CLICK WITH RETROFLEX HOOK
 1DF0B..1DF1E  ; XID_Continue # L&  [20] LATIN SMALL LETTER ESH WITH DOUBLE BAR..LATIN SMALL LETTER S WITH CURL
+1DF25..1DF2A  ; XID_Continue # L&   [6] LATIN SMALL LETTER D WITH MID-HEIGHT LEFT HOOK..LATIN SMALL LETTER T WITH MID-HEIGHT LEFT HOOK
 1E000..1E006  ; XID_Continue # Mn   [7] COMBINING GLAGOLITIC LETTER AZU..COMBINING GLAGOLITIC LETTER ZHIVETE
 1E008..1E018  ; XID_Continue # Mn  [17] COMBINING GLAGOLITIC LETTER ZEMLJA..COMBINING GLAGOLITIC LETTER HERU
 1E01B..1E021  ; XID_Continue # Mn   [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI
 1E023..1E024  ; XID_Continue # Mn   [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS
 1E026..1E02A  ; XID_Continue # Mn   [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA
+1E030..1E06D  ; XID_Continue # Lm  [62] MODIFIER LETTER CYRILLIC SMALL A..MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE
+1E08F         ; XID_Continue # Mn       COMBINING CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
 1E100..1E12C  ; XID_Continue # Lo  [45] NYIAKENG PUACHUE HMONG LETTER MA..NYIAKENG PUACHUE HMONG LETTER W
 1E130..1E136  ; XID_Continue # Mn   [7] NYIAKENG PUACHUE HMONG TONE-B..NYIAKENG PUACHUE HMONG TONE-D
 1E137..1E13D  ; XID_Continue # Lm   [7] NYIAKENG PUACHUE HMONG SIGN FOR PERSON..NYIAKENG PUACHUE HMONG SYLLABLE LENGTHENER
@@ -10142,6 +10264,10 @@ FFDA..FFDC    ; XID_Continue # Lo   [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HA
 1E2C0..1E2EB  ; XID_Continue # Lo  [44] WANCHO LETTER AA..WANCHO LETTER YIH
 1E2EC..1E2EF  ; XID_Continue # Mn   [4] WANCHO TONE TUP..WANCHO TONE KOINI
 1E2F0..1E2F9  ; XID_Continue # Nd  [10] WANCHO DIGIT ZERO..WANCHO DIGIT NINE
+1E4D0..1E4EA  ; XID_Continue # Lo  [27] NAG MUNDARI LETTER O..NAG MUNDARI LETTER ELL
+1E4EB         ; XID_Continue # Lm       NAG MUNDARI SIGN OJOD
+1E4EC..1E4EF  ; XID_Continue # Mn   [4] NAG MUNDARI SIGN MUHOR..NAG MUNDARI SIGN SUTUH
+1E4F0..1E4F9  ; XID_Continue # Nd  [10] NAG MUNDARI DIGIT ZERO..NAG MUNDARI DIGIT NINE
 1E7E0..1E7E6  ; XID_Continue # Lo   [7] ETHIOPIC SYLLABLE HHYA..ETHIOPIC SYLLABLE HHYO
 1E7E8..1E7EB  ; XID_Continue # Lo   [4] ETHIOPIC SYLLABLE GURAGE HHWA..ETHIOPIC SYLLABLE HHWE
 1E7ED..1E7EE  ; XID_Continue # Lo   [2] ETHIOPIC SYLLABLE GURAGE MWI..ETHIOPIC SYLLABLE GURAGE MWEE
@@ -10187,15 +10313,16 @@ FFDA..FFDC    ; XID_Continue # Lo   [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HA
 1EEAB..1EEBB  ; XID_Continue # Lo  [17] ARABIC MATHEMATICAL DOUBLE-STRUCK LAM..ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN
 1FBF0..1FBF9  ; XID_Continue # Nd  [10] SEGMENTED DIGIT ZERO..SEGMENTED DIGIT NINE
 20000..2A6DF  ; XID_Continue # Lo [42720] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6DF
-2A700..2B738  ; XID_Continue # Lo [4153] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B738
+2A700..2B739  ; XID_Continue # Lo [4154] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B739
 2B740..2B81D  ; XID_Continue # Lo [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D
 2B820..2CEA1  ; XID_Continue # Lo [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1
 2CEB0..2EBE0  ; XID_Continue # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0
 2F800..2FA1D  ; XID_Continue # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D
 30000..3134A  ; XID_Continue # Lo [4939] CJK UNIFIED IDEOGRAPH-30000..CJK UNIFIED IDEOGRAPH-3134A
+31350..323AF  ; XID_Continue # Lo [4192] CJK UNIFIED IDEOGRAPH-31350..CJK UNIFIED IDEOGRAPH-323AF
 E0100..E01EF  ; XID_Continue # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256
 
-# Total code points: 135053
+# Total code points: 139463
 
 # ================================================
 
@@ -10206,7 +10333,7 @@ E0100..E01EF  ; XID_Continue # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTO
 #  + Variation_Selector
 #  - White_Space
 #  - FFF9..FFFB (Interlinear annotation format characters)
-#  - 13430..13438 (Egyptian hieroglyph format characters)
+#  - 13430..13440 (Egyptian hieroglyph format characters)
 #  - Prepended_Concatenation_Mark (Exceptional format characters that should be visible)
 
 00AD          ; Default_Ignorable_Code_Point # Cf       SOFT HYPHEN
@@ -10351,7 +10478,7 @@ E01F0..E0FFF  ; Default_Ignorable_Code_Point # Cn [3600] <reserved-E01F0>..<rese
 0E47..0E4E    ; Grapheme_Extend # Mn   [8] THAI CHARACTER MAITAIKHU..THAI CHARACTER YAMAKKAN
 0EB1          ; Grapheme_Extend # Mn       LAO VOWEL SIGN MAI KAN
 0EB4..0EBC    ; Grapheme_Extend # Mn   [9] LAO VOWEL SIGN I..LAO SEMIVOWEL SIGN LO
-0EC8..0ECD    ; Grapheme_Extend # Mn   [6] LAO TONE MAI EK..LAO NIGGAHITA
+0EC8..0ECE    ; Grapheme_Extend # Mn   [7] LAO TONE MAI EK..LAO YAMAKKAN
 0F18..0F19    ; Grapheme_Extend # Mn   [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS
 0F35          ; Grapheme_Extend # Mn       TIBETAN MARK NGAS BZUNG NYI ZLA
 0F37          ; Grapheme_Extend # Mn       TIBETAN MARK NGAS BZUNG SGOR RTAGS
@@ -10490,6 +10617,7 @@ FF9E..FF9F    ; Grapheme_Extend # Lm   [2] HALFWIDTH KATAKANA VOICED SOUND MARK.
 10AE5..10AE6  ; Grapheme_Extend # Mn   [2] MANICHAEAN ABBREVIATION MARK ABOVE..MANICHAEAN ABBREVIATION MARK BELOW
 10D24..10D27  ; Grapheme_Extend # Mn   [4] HANIFI ROHINGYA SIGN HARBAHAY..HANIFI ROHINGYA SIGN TASSI
 10EAB..10EAC  ; Grapheme_Extend # Mn   [2] YEZIDI COMBINING HAMZA MARK..YEZIDI COMBINING MADDA MARK
+10EFD..10EFF  ; Grapheme_Extend # Mn   [3] ARABIC SMALL LOW WORD SAKTA..ARABIC SMALL LOW WORD MADDA
 10F46..10F50  ; Grapheme_Extend # Mn  [11] SOGDIAN COMBINING DOT BELOW..SOGDIAN COMBINING STROKE BELOW
 10F82..10F85  ; Grapheme_Extend # Mn   [4] OLD UYGHUR COMBINING DOT ABOVE..OLD UYGHUR COMBINING TWO DOTS BELOW
 11001         ; Grapheme_Extend # Mn       BRAHMI SIGN ANUSVARA
@@ -10512,6 +10640,7 @@ FF9E..FF9F    ; Grapheme_Extend # Lm   [2] HALFWIDTH KATAKANA VOICED SOUND MARK.
 11234         ; Grapheme_Extend # Mn       KHOJKI SIGN ANUSVARA
 11236..11237  ; Grapheme_Extend # Mn   [2] KHOJKI SIGN NUKTA..KHOJKI SIGN SHADDA
 1123E         ; Grapheme_Extend # Mn       KHOJKI SIGN SUKUN
+11241         ; Grapheme_Extend # Mn       KHOJKI VOWEL SIGN VOCALIC R
 112DF         ; Grapheme_Extend # Mn       KHUDAWADI SIGN ANUSVARA
 112E3..112EA  ; Grapheme_Extend # Mn   [8] KHUDAWADI VOWEL SIGN U..KHUDAWADI SIGN VIRAMA
 11300..11301  ; Grapheme_Extend # Mn   [2] GRANTHA SIGN COMBINING ANUSVARA ABOVE..GRANTHA SIGN CANDRABINDU
@@ -10579,6 +10708,12 @@ FF9E..FF9F    ; Grapheme_Extend # Lm   [2] HALFWIDTH KATAKANA VOICED SOUND MARK.
 11D95         ; Grapheme_Extend # Mn       GUNJALA GONDI SIGN ANUSVARA
 11D97         ; Grapheme_Extend # Mn       GUNJALA GONDI VIRAMA
 11EF3..11EF4  ; Grapheme_Extend # Mn   [2] MAKASAR VOWEL SIGN I..MAKASAR VOWEL SIGN U
+11F00..11F01  ; Grapheme_Extend # Mn   [2] KAWI SIGN CANDRABINDU..KAWI SIGN ANUSVARA
+11F36..11F3A  ; Grapheme_Extend # Mn   [5] KAWI VOWEL SIGN I..KAWI VOWEL SIGN VOCALIC R
+11F40         ; Grapheme_Extend # Mn       KAWI VOWEL SIGN EU
+11F42         ; Grapheme_Extend # Mn       KAWI CONJOINER
+13440         ; Grapheme_Extend # Mn       EGYPTIAN HIEROGLYPH MIRROR HORIZONTALLY
+13447..13455  ; Grapheme_Extend # Mn  [15] EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP START..EGYPTIAN HIEROGLYPH MODIFIER DAMAGED
 16AF0..16AF4  ; Grapheme_Extend # Mn   [5] BASSA VAH COMBINING HIGH TONE..BASSA VAH COMBINING HIGH-LOW TONE
 16B30..16B36  ; Grapheme_Extend # Mn   [7] PAHAWH HMONG MARK CIM TUB..PAHAWH HMONG MARK CIM TAUM
 16F4F         ; Grapheme_Extend # Mn       MIAO SIGN CONSONANT MODIFIER BAR
@@ -10605,15 +10740,17 @@ FF9E..FF9F    ; Grapheme_Extend # Lm   [2] HALFWIDTH KATAKANA VOICED SOUND MARK.
 1E01B..1E021  ; Grapheme_Extend # Mn   [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI
 1E023..1E024  ; Grapheme_Extend # Mn   [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS
 1E026..1E02A  ; Grapheme_Extend # Mn   [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA
+1E08F         ; Grapheme_Extend # Mn       COMBINING CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
 1E130..1E136  ; Grapheme_Extend # Mn   [7] NYIAKENG PUACHUE HMONG TONE-B..NYIAKENG PUACHUE HMONG TONE-D
 1E2AE         ; Grapheme_Extend # Mn       TOTO SIGN RISING TONE
 1E2EC..1E2EF  ; Grapheme_Extend # Mn   [4] WANCHO TONE TUP..WANCHO TONE KOINI
+1E4EC..1E4EF  ; Grapheme_Extend # Mn   [4] NAG MUNDARI SIGN MUHOR..NAG MUNDARI SIGN SUTUH
 1E8D0..1E8D6  ; Grapheme_Extend # Mn   [7] MENDE KIKAKUI COMBINING NUMBER TEENS..MENDE KIKAKUI COMBINING NUMBER MILLIONS
 1E944..1E94A  ; Grapheme_Extend # Mn   [7] ADLAM ALIF LENGTHENER..ADLAM NUKTA
 E0020..E007F  ; Grapheme_Extend # Cf  [96] TAG SPACE..CANCEL TAG
 E0100..E01EF  ; Grapheme_Extend # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256
 
-# Total code points: 2090
+# Total code points: 2125
 
 # ================================================
 
@@ -10913,6 +11050,7 @@ E0100..E01EF  ; Grapheme_Extend # Mn [240] VARIATION SELECTOR-17..VARIATION SELE
 0CE0..0CE1    ; Grapheme_Base # Lo   [2] KANNADA LETTER VOCALIC RR..KANNADA LETTER VOCALIC LL
 0CE6..0CEF    ; Grapheme_Base # Nd  [10] KANNADA DIGIT ZERO..KANNADA DIGIT NINE
 0CF1..0CF2    ; Grapheme_Base # Lo   [2] KANNADA SIGN JIHVAMULIYA..KANNADA SIGN UPADHMANIYA
+0CF3          ; Grapheme_Base # Mc       KANNADA SIGN COMBINING ANUSVARA ABOVE RIGHT
 0D02..0D03    ; Grapheme_Base # Mc   [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA
 0D04..0D0C    ; Grapheme_Base # Lo   [9] MALAYALAM LETTER VEDIC ANUSVARA..MALAYALAM LETTER VOCALIC L
 0D0E..0D10    ; Grapheme_Base # Lo   [3] MALAYALAM LETTER E..MALAYALAM LETTER AI
@@ -11965,6 +12103,7 @@ FFFC..FFFD    ; Grapheme_Base # So   [2] OBJECT REPLACEMENT CHARACTER..REPLACEME
 11232..11233  ; Grapheme_Base # Mc   [2] KHOJKI VOWEL SIGN O..KHOJKI VOWEL SIGN AU
 11235         ; Grapheme_Base # Mc       KHOJKI SIGN VIRAMA
 11238..1123D  ; Grapheme_Base # Po   [6] KHOJKI DANDA..KHOJKI ABBREVIATION SIGN
+1123F..11240  ; Grapheme_Base # Lo   [2] KHOJKI LETTER QA..KHOJKI LETTER SHORT I
 11280..11286  ; Grapheme_Base # Lo   [7] MULTANI LETTER A..MULTANI LETTER GA
 11288         ; Grapheme_Base # Lo       MULTANI LETTER GHA
 1128A..1128D  ; Grapheme_Base # Lo   [4] MULTANI LETTER CA..MULTANI LETTER JJA
@@ -12080,6 +12219,7 @@ FFFC..FFFD    ; Grapheme_Base # So   [2] OBJECT REPLACEMENT CHARACTER..REPLACEME
 11A9D         ; Grapheme_Base # Lo       SOYOMBO MARK PLUTA
 11A9E..11AA2  ; Grapheme_Base # Po   [5] SOYOMBO HEAD MARK WITH MOON AND SUN AND TRIPLE FLAME..SOYOMBO TERMINAL MARK-2
 11AB0..11AF8  ; Grapheme_Base # Lo  [73] CANADIAN SYLLABICS NATTILIK HI..PAU CIN HAU GLOTTAL STOP FINAL
+11B00..11B09  ; Grapheme_Base # Po  [10] DEVANAGARI HEAD MARK..DEVANAGARI SIGN MINDU
 11C00..11C08  ; Grapheme_Base # Lo   [9] BHAIKSUKI LETTER A..BHAIKSUKI LETTER VOCALIC L
 11C0A..11C2E  ; Grapheme_Base # Lo  [37] BHAIKSUKI LETTER E..BHAIKSUKI LETTER HA
 11C2F         ; Grapheme_Base # Mc       BHAIKSUKI VOWEL SIGN AA
@@ -12109,6 +12249,15 @@ FFFC..FFFD    ; Grapheme_Base # So   [2] OBJECT REPLACEMENT CHARACTER..REPLACEME
 11EE0..11EF2  ; Grapheme_Base # Lo  [19] MAKASAR LETTER KA..MAKASAR ANGKA
 11EF5..11EF6  ; Grapheme_Base # Mc   [2] MAKASAR VOWEL SIGN E..MAKASAR VOWEL SIGN O
 11EF7..11EF8  ; Grapheme_Base # Po   [2] MAKASAR PASSIMBANG..MAKASAR END OF SECTION
+11F02         ; Grapheme_Base # Lo       KAWI SIGN REPHA
+11F03         ; Grapheme_Base # Mc       KAWI SIGN VISARGA
+11F04..11F10  ; Grapheme_Base # Lo  [13] KAWI LETTER A..KAWI LETTER O
+11F12..11F33  ; Grapheme_Base # Lo  [34] KAWI LETTER KA..KAWI LETTER JNYA
+11F34..11F35  ; Grapheme_Base # Mc   [2] KAWI VOWEL SIGN AA..KAWI VOWEL SIGN ALTERNATE AA
+11F3E..11F3F  ; Grapheme_Base # Mc   [2] KAWI VOWEL SIGN E..KAWI VOWEL SIGN AI
+11F41         ; Grapheme_Base # Mc       KAWI SIGN KILLER
+11F43..11F4F  ; Grapheme_Base # Po  [13] KAWI DANDA..KAWI PUNCTUATION CLOSING SPIRAL
+11F50..11F59  ; Grapheme_Base # Nd  [10] KAWI DIGIT ZERO..KAWI DIGIT NINE
 11FB0         ; Grapheme_Base # Lo       LISU LETTER YHA
 11FC0..11FD4  ; Grapheme_Base # No  [21] TAMIL FRACTION ONE THREE-HUNDRED-AND-TWENTIETH..TAMIL FRACTION DOWNSCALING FACTOR KIIZH
 11FD5..11FDC  ; Grapheme_Base # So   [8] TAMIL SIGN NEL..TAMIL SIGN MUKKURUNI
@@ -12121,7 +12270,8 @@ FFFC..FFFD    ; Grapheme_Base # So   [2] OBJECT REPLACEMENT CHARACTER..REPLACEME
 12480..12543  ; Grapheme_Base # Lo [196] CUNEIFORM SIGN AB TIMES NUN TENU..CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU
 12F90..12FF0  ; Grapheme_Base # Lo  [97] CYPRO-MINOAN SIGN CM001..CYPRO-MINOAN SIGN CM114
 12FF1..12FF2  ; Grapheme_Base # Po   [2] CYPRO-MINOAN SIGN CM301..CYPRO-MINOAN SIGN CM302
-13000..1342E  ; Grapheme_Base # Lo [1071] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH AA032
+13000..1342F  ; Grapheme_Base # Lo [1072] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH V011D
+13441..13446  ; Grapheme_Base # Lo   [6] EGYPTIAN HIEROGLYPH FULL BLANK..EGYPTIAN HIEROGLYPH WIDE LOST SIGN
 14400..14646  ; Grapheme_Base # Lo [583] ANATOLIAN HIEROGLYPH A001..ANATOLIAN HIEROGLYPH A530
 16800..16A38  ; Grapheme_Base # Lo [569] BAMUM LETTER PHASE-A NGKUE MFON..BAMUM LETTER PHASE-F VUEQ
 16A40..16A5E  ; Grapheme_Base # Lo  [31] MRO LETTER TA..MRO LETTER TEK
@@ -12159,7 +12309,9 @@ FFFC..FFFD    ; Grapheme_Base # So   [2] OBJECT REPLACEMENT CHARACTER..REPLACEME
 1AFF5..1AFFB  ; Grapheme_Base # Lm   [7] KATAKANA LETTER MINNAN TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-5
 1AFFD..1AFFE  ; Grapheme_Base # Lm   [2] KATAKANA LETTER MINNAN NASALIZED TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-8
 1B000..1B122  ; Grapheme_Base # Lo [291] KATAKANA LETTER ARCHAIC E..KATAKANA LETTER ARCHAIC WU
+1B132         ; Grapheme_Base # Lo       HIRAGANA LETTER SMALL KO
 1B150..1B152  ; Grapheme_Base # Lo   [3] HIRAGANA LETTER SMALL WI..HIRAGANA LETTER SMALL WO
+1B155         ; Grapheme_Base # Lo       KATAKANA LETTER SMALL KO
 1B164..1B167  ; Grapheme_Base # Lo   [4] KATAKANA LETTER SMALL WI..KATAKANA LETTER SMALL N
 1B170..1B2FB  ; Grapheme_Base # Lo [396] NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB
 1BC00..1BC6A  ; Grapheme_Base # Lo [107] DUPLOYAN LETTER H..DUPLOYAN LETTER VOCALIC M
@@ -12180,6 +12332,7 @@ FFFC..FFFD    ; Grapheme_Base # So   [2] OBJECT REPLACEMENT CHARACTER..REPLACEME
 1D1AE..1D1EA  ; Grapheme_Base # So  [61] MUSICAL SYMBOL PEDAL MARK..MUSICAL SYMBOL KORON
 1D200..1D241  ; Grapheme_Base # So  [66] GREEK VOCAL NOTATION SYMBOL-1..GREEK INSTRUMENTAL NOTATION SYMBOL-54
 1D245         ; Grapheme_Base # So       GREEK MUSICAL LEIMMA
+1D2C0..1D2D3  ; Grapheme_Base # No  [20] KAKTOVIK NUMERAL ZERO..KAKTOVIK NUMERAL NINETEEN
 1D2E0..1D2F3  ; Grapheme_Base # No  [20] MAYAN NUMERAL ZERO..MAYAN NUMERAL NINETEEN
 1D300..1D356  ; Grapheme_Base # So  [87] MONOGRAM FOR EARTH..TETRAGRAM FOR FOSTERING
 1D360..1D378  ; Grapheme_Base # No  [25] COUNTING ROD UNIT DIGIT ONE..TALLY MARK FIVE
@@ -12233,6 +12386,8 @@ FFFC..FFFD    ; Grapheme_Base # So   [2] OBJECT REPLACEMENT CHARACTER..REPLACEME
 1DF00..1DF09  ; Grapheme_Base # L&  [10] LATIN SMALL LETTER FENG DIGRAPH WITH TRILL..LATIN SMALL LETTER T WITH HOOK AND RETROFLEX HOOK
 1DF0A         ; Grapheme_Base # Lo       LATIN LETTER RETROFLEX CLICK WITH RETROFLEX HOOK
 1DF0B..1DF1E  ; Grapheme_Base # L&  [20] LATIN SMALL LETTER ESH WITH DOUBLE BAR..LATIN SMALL LETTER S WITH CURL
+1DF25..1DF2A  ; Grapheme_Base # L&   [6] LATIN SMALL LETTER D WITH MID-HEIGHT LEFT HOOK..LATIN SMALL LETTER T WITH MID-HEIGHT LEFT HOOK
+1E030..1E06D  ; Grapheme_Base # Lm  [62] MODIFIER LETTER CYRILLIC SMALL A..MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE
 1E100..1E12C  ; Grapheme_Base # Lo  [45] NYIAKENG PUACHUE HMONG LETTER MA..NYIAKENG PUACHUE HMONG LETTER W
 1E137..1E13D  ; Grapheme_Base # Lm   [7] NYIAKENG PUACHUE HMONG SIGN FOR PERSON..NYIAKENG PUACHUE HMONG SYLLABLE LENGTHENER
 1E140..1E149  ; Grapheme_Base # Nd  [10] NYIAKENG PUACHUE HMONG DIGIT ZERO..NYIAKENG PUACHUE HMONG DIGIT NINE
@@ -12242,6 +12397,9 @@ FFFC..FFFD    ; Grapheme_Base # So   [2] OBJECT REPLACEMENT CHARACTER..REPLACEME
 1E2C0..1E2EB  ; Grapheme_Base # Lo  [44] WANCHO LETTER AA..WANCHO LETTER YIH
 1E2F0..1E2F9  ; Grapheme_Base # Nd  [10] WANCHO DIGIT ZERO..WANCHO DIGIT NINE
 1E2FF         ; Grapheme_Base # Sc       WANCHO NGUN SIGN
+1E4D0..1E4EA  ; Grapheme_Base # Lo  [27] NAG MUNDARI LETTER O..NAG MUNDARI LETTER ELL
+1E4EB         ; Grapheme_Base # Lm       NAG MUNDARI SIGN OJOD
+1E4F0..1E4F9  ; Grapheme_Base # Nd  [10] NAG MUNDARI DIGIT ZERO..NAG MUNDARI DIGIT NINE
 1E7E0..1E7E6  ; Grapheme_Base # Lo   [7] ETHIOPIC SYLLABLE HHYA..ETHIOPIC SYLLABLE HHYO
 1E7E8..1E7EB  ; Grapheme_Base # Lo   [4] ETHIOPIC SYLLABLE GURAGE HHWA..ETHIOPIC SYLLABLE HHWE
 1E7ED..1E7EE  ; Grapheme_Base # Lo   [2] ETHIOPIC SYLLABLE GURAGE MWI..ETHIOPIC SYLLABLE GURAGE MWEE
@@ -12310,10 +12468,10 @@ FFFC..FFFD    ; Grapheme_Base # So   [2] OBJECT REPLACEMENT CHARACTER..REPLACEME
 1F300..1F3FA  ; Grapheme_Base # So [251] CYCLONE..AMPHORA
 1F3FB..1F3FF  ; Grapheme_Base # Sk   [5] EMOJI MODIFIER FITZPATRICK TYPE-1-2..EMOJI MODIFIER FITZPATRICK TYPE-6
 1F400..1F6D7  ; Grapheme_Base # So [728] RAT..ELEVATOR
-1F6DD..1F6EC  ; Grapheme_Base # So  [16] PLAYGROUND SLIDE..AIRPLANE ARRIVING
+1F6DC..1F6EC  ; Grapheme_Base # So  [17] WIRELESS..AIRPLANE ARRIVING
 1F6F0..1F6FC  ; Grapheme_Base # So  [13] SATELLITE..ROLLER SKATE
-1F700..1F773  ; Grapheme_Base # So [116] ALCHEMICAL SYMBOL FOR QUINTESSENCE..ALCHEMICAL SYMBOL FOR HALF OUNCE
-1F780..1F7D8  ; Grapheme_Base # So  [89] BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE..NEGATIVE CIRCLED SQUARE
+1F700..1F776  ; Grapheme_Base # So [119] ALCHEMICAL SYMBOL FOR QUINTESSENCE..LUNAR ECLIPSE
+1F77B..1F7D9  ; Grapheme_Base # So  [95] HAUMEA..NINE POINTED WHITE STAR
 1F7E0..1F7EB  ; Grapheme_Base # So  [12] LARGE ORANGE CIRCLE..LARGE BROWN SQUARE
 1F7F0         ; Grapheme_Base # So       HEAVY EQUALS SIGN
 1F800..1F80B  ; Grapheme_Base # So  [12] LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD..DOWNWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD
@@ -12324,27 +12482,26 @@ FFFC..FFFD    ; Grapheme_Base # So   [2] OBJECT REPLACEMENT CHARACTER..REPLACEME
 1F8B0..1F8B1  ; Grapheme_Base # So   [2] ARROW POINTING UPWARDS THEN NORTH WEST..ARROW POINTING RIGHTWARDS THEN CURVING SOUTH WEST
 1F900..1FA53  ; Grapheme_Base # So [340] CIRCLED CROSS FORMEE WITH FOUR DOTS..BLACK CHESS KNIGHT-BISHOP
 1FA60..1FA6D  ; Grapheme_Base # So  [14] XIANGQI RED GENERAL..XIANGQI BLACK SOLDIER
-1FA70..1FA74  ; Grapheme_Base # So   [5] BALLET SHOES..THONG SANDAL
-1FA78..1FA7C  ; Grapheme_Base # So   [5] DROP OF BLOOD..CRUTCH
-1FA80..1FA86  ; Grapheme_Base # So   [7] YO-YO..NESTING DOLLS
-1FA90..1FAAC  ; Grapheme_Base # So  [29] RINGED PLANET..HAMSA
-1FAB0..1FABA  ; Grapheme_Base # So  [11] FLY..NEST WITH EGGS
-1FAC0..1FAC5  ; Grapheme_Base # So   [6] ANATOMICAL HEART..PERSON WITH CROWN
-1FAD0..1FAD9  ; Grapheme_Base # So  [10] BLUEBERRIES..JAR
-1FAE0..1FAE7  ; Grapheme_Base # So   [8] MELTING FACE..BUBBLES
-1FAF0..1FAF6  ; Grapheme_Base # So   [7] HAND WITH INDEX FINGER AND THUMB CROSSED..HEART HANDS
+1FA70..1FA7C  ; Grapheme_Base # So  [13] BALLET SHOES..CRUTCH
+1FA80..1FA88  ; Grapheme_Base # So   [9] YO-YO..FLUTE
+1FA90..1FABD  ; Grapheme_Base # So  [46] RINGED PLANET..WING
+1FABF..1FAC5  ; Grapheme_Base # So   [7] GOOSE..PERSON WITH CROWN
+1FACE..1FADB  ; Grapheme_Base # So  [14] MOOSE..PEA POD
+1FAE0..1FAE8  ; Grapheme_Base # So   [9] MELTING FACE..SHAKING FACE
+1FAF0..1FAF8  ; Grapheme_Base # So   [9] HAND WITH INDEX FINGER AND THUMB CROSSED..RIGHTWARDS PUSHING HAND
 1FB00..1FB92  ; Grapheme_Base # So [147] BLOCK SEXTANT-1..UPPER HALF INVERSE MEDIUM SHADE AND LOWER HALF BLOCK
 1FB94..1FBCA  ; Grapheme_Base # So  [55] LEFT HALF INVERSE MEDIUM SHADE AND RIGHT HALF BLOCK..WHITE UP-POINTING CHEVRON
 1FBF0..1FBF9  ; Grapheme_Base # Nd  [10] SEGMENTED DIGIT ZERO..SEGMENTED DIGIT NINE
 20000..2A6DF  ; Grapheme_Base # Lo [42720] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6DF
-2A700..2B738  ; Grapheme_Base # Lo [4153] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B738
+2A700..2B739  ; Grapheme_Base # Lo [4154] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B739
 2B740..2B81D  ; Grapheme_Base # Lo [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D
 2B820..2CEA1  ; Grapheme_Base # Lo [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1
 2CEB0..2EBE0  ; Grapheme_Base # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0
 2F800..2FA1D  ; Grapheme_Base # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D
 30000..3134A  ; Grapheme_Base # Lo [4939] CJK UNIFIED IDEOGRAPH-30000..CJK UNIFIED IDEOGRAPH-3134A
+31350..323AF  ; Grapheme_Base # Lo [4192] CJK UNIFIED IDEOGRAPH-31350..CJK UNIFIED IDEOGRAPH-323AF
 
-# Total code points: 142539
+# Total code points: 146986
 
 # ================================================
 
@@ -12410,7 +12567,9 @@ ABED          ; Grapheme_Link # Mn       MEETEI MAYEK APUN IYEK
 11C3F         ; Grapheme_Link # Mn       BHAIKSUKI SIGN VIRAMA
 11D44..11D45  ; Grapheme_Link # Mn   [2] MASARAM GONDI SIGN HALANTA..MASARAM GONDI VIRAMA
 11D97         ; Grapheme_Link # Mn       GUNJALA GONDI VIRAMA
+11F41         ; Grapheme_Link # Mc       KAWI SIGN KILLER
+11F42         ; Grapheme_Link # Mn       KAWI CONJOINER
 
-# Total code points: 63
+# Total code points: 65
 
 # EOF
index b344567..5d5ab61 100644 (file)
@@ -1,11 +1,11 @@
-# DerivedNormalizationProps-14.0.0.txt
-# Date: 2021-06-04, 02:19:20 GMT
-# © 2021 Unicode®, Inc.
+# DerivedNormalizationProps-15.0.0.txt
+# Date: 2022-04-02, 01:29:03 GMT
+# © 2022 Unicode®, Inc.
 # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
-# For terms of use, see http://www.unicode.org/terms_of_use.html
+# For terms of use, see https://www.unicode.org/terms_of_use.html
 #
 # Unicode Character Database
-#   For documentation, see http://www.unicode.org/reports/tr44/
+#   For documentation, see https://www.unicode.org/reports/tr44/
 
 # ================================================
 
@@ -1652,6 +1652,7 @@ FFED..FFEE    ; NFKD_QC; N # So   [2] HALFWIDTH BLACK SQUARE..HALFWIDTH WHITE CI
 1D7C3         ; NFKD_QC; N # Sm       MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL
 1D7C4..1D7CB  ; NFKD_QC; N # L&   [8] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD SMALL DIGAMMA
 1D7CE..1D7FF  ; NFKD_QC; N # Nd  [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE
+1E030..1E06D  ; NFKD_QC; N # Lm  [62] MODIFIER LETTER CYRILLIC SMALL A..MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE
 1EE00..1EE03  ; NFKD_QC; N # Lo   [4] ARABIC MATHEMATICAL ALEF..ARABIC MATHEMATICAL DAL
 1EE05..1EE1F  ; NFKD_QC; N # Lo  [27] ARABIC MATHEMATICAL WAW..ARABIC MATHEMATICAL DOTLESS QAF
 1EE21..1EE22  ; NFKD_QC; N # Lo   [2] ARABIC MATHEMATICAL INITIAL BEH..ARABIC MATHEMATICAL INITIAL JEEM
@@ -1697,7 +1698,7 @@ FFED..FFEE    ; NFKD_QC; N # So   [2] HALFWIDTH BLACK SQUARE..HALFWIDTH WHITE CI
 1FBF0..1FBF9  ; NFKD_QC; N # Nd  [10] SEGMENTED DIGIT ZERO..SEGMENTED DIGIT NINE
 2F800..2FA1D  ; NFKD_QC; N # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D
 
-# Total code points: 16967
+# Total code points: 17029
 
 # ================================================
 
@@ -2060,6 +2061,7 @@ FFED..FFEE    ; NFKC_QC; N # So   [2] HALFWIDTH BLACK SQUARE..HALFWIDTH WHITE CI
 1D7C3         ; NFKC_QC; N # Sm       MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL
 1D7C4..1D7CB  ; NFKC_QC; N # L&   [8] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD SMALL DIGAMMA
 1D7CE..1D7FF  ; NFKC_QC; N # Nd  [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE
+1E030..1E06D  ; NFKC_QC; N # Lm  [62] MODIFIER LETTER CYRILLIC SMALL A..MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE
 1EE00..1EE03  ; NFKC_QC; N # Lo   [4] ARABIC MATHEMATICAL ALEF..ARABIC MATHEMATICAL DAL
 1EE05..1EE1F  ; NFKC_QC; N # Lo  [27] ARABIC MATHEMATICAL WAW..ARABIC MATHEMATICAL DOTLESS QAF
 1EE21..1EE22  ; NFKC_QC; N # Lo   [2] ARABIC MATHEMATICAL INITIAL BEH..ARABIC MATHEMATICAL INITIAL JEEM
@@ -2105,7 +2107,7 @@ FFED..FFEE    ; NFKC_QC; N # So   [2] HALFWIDTH BLACK SQUARE..HALFWIDTH WHITE CI
 1FBF0..1FBF9  ; NFKC_QC; N # Nd  [10] SEGMENTED DIGIT ZERO..SEGMENTED DIGIT NINE
 2F800..2FA1D  ; NFKC_QC; N # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D
 
-# Total code points: 4866
+# Total code points: 4928
 
 # ================================================
 
@@ -8076,6 +8078,68 @@ FFF0..FFF8    ; NFKC_CF;                # Cn   [9] <reserved-FFF0>..<reserved-FF
 1D7FD         ; NFKC_CF; 0037           # Nd       MATHEMATICAL MONOSPACE DIGIT SEVEN
 1D7FE         ; NFKC_CF; 0038           # Nd       MATHEMATICAL MONOSPACE DIGIT EIGHT
 1D7FF         ; NFKC_CF; 0039           # Nd       MATHEMATICAL MONOSPACE DIGIT NINE
+1E030         ; NFKC_CF; 0430           # Lm       MODIFIER LETTER CYRILLIC SMALL A
+1E031         ; NFKC_CF; 0431           # Lm       MODIFIER LETTER CYRILLIC SMALL BE
+1E032         ; NFKC_CF; 0432           # Lm       MODIFIER LETTER CYRILLIC SMALL VE
+1E033         ; NFKC_CF; 0433           # Lm       MODIFIER LETTER CYRILLIC SMALL GHE
+1E034         ; NFKC_CF; 0434           # Lm       MODIFIER LETTER CYRILLIC SMALL DE
+1E035         ; NFKC_CF; 0435           # Lm       MODIFIER LETTER CYRILLIC SMALL IE
+1E036         ; NFKC_CF; 0436           # Lm       MODIFIER LETTER CYRILLIC SMALL ZHE
+1E037         ; NFKC_CF; 0437           # Lm       MODIFIER LETTER CYRILLIC SMALL ZE
+1E038         ; NFKC_CF; 0438           # Lm       MODIFIER LETTER CYRILLIC SMALL I
+1E039         ; NFKC_CF; 043A           # Lm       MODIFIER LETTER CYRILLIC SMALL KA
+1E03A         ; NFKC_CF; 043B           # Lm       MODIFIER LETTER CYRILLIC SMALL EL
+1E03B         ; NFKC_CF; 043C           # Lm       MODIFIER LETTER CYRILLIC SMALL EM
+1E03C         ; NFKC_CF; 043E           # Lm       MODIFIER LETTER CYRILLIC SMALL O
+1E03D         ; NFKC_CF; 043F           # Lm       MODIFIER LETTER CYRILLIC SMALL PE
+1E03E         ; NFKC_CF; 0440           # Lm       MODIFIER LETTER CYRILLIC SMALL ER
+1E03F         ; NFKC_CF; 0441           # Lm       MODIFIER LETTER CYRILLIC SMALL ES
+1E040         ; NFKC_CF; 0442           # Lm       MODIFIER LETTER CYRILLIC SMALL TE
+1E041         ; NFKC_CF; 0443           # Lm       MODIFIER LETTER CYRILLIC SMALL U
+1E042         ; NFKC_CF; 0444           # Lm       MODIFIER LETTER CYRILLIC SMALL EF
+1E043         ; NFKC_CF; 0445           # Lm       MODIFIER LETTER CYRILLIC SMALL HA
+1E044         ; NFKC_CF; 0446           # Lm       MODIFIER LETTER CYRILLIC SMALL TSE
+1E045         ; NFKC_CF; 0447           # Lm       MODIFIER LETTER CYRILLIC SMALL CHE
+1E046         ; NFKC_CF; 0448           # Lm       MODIFIER LETTER CYRILLIC SMALL SHA
+1E047         ; NFKC_CF; 044B           # Lm       MODIFIER LETTER CYRILLIC SMALL YERU
+1E048         ; NFKC_CF; 044D           # Lm       MODIFIER LETTER CYRILLIC SMALL E
+1E049         ; NFKC_CF; 044E           # Lm       MODIFIER LETTER CYRILLIC SMALL YU
+1E04A         ; NFKC_CF; A689           # Lm       MODIFIER LETTER CYRILLIC SMALL DZZE
+1E04B         ; NFKC_CF; 04D9           # Lm       MODIFIER LETTER CYRILLIC SMALL SCHWA
+1E04C         ; NFKC_CF; 0456           # Lm       MODIFIER LETTER CYRILLIC SMALL BYELORUSSIAN-UKRAINIAN I
+1E04D         ; NFKC_CF; 0458           # Lm       MODIFIER LETTER CYRILLIC SMALL JE
+1E04E         ; NFKC_CF; 04E9           # Lm       MODIFIER LETTER CYRILLIC SMALL BARRED O
+1E04F         ; NFKC_CF; 04AF           # Lm       MODIFIER LETTER CYRILLIC SMALL STRAIGHT U
+1E050         ; NFKC_CF; 04CF           # Lm       MODIFIER LETTER CYRILLIC SMALL PALOCHKA
+1E051         ; NFKC_CF; 0430           # Lm       CYRILLIC SUBSCRIPT SMALL LETTER A
+1E052         ; NFKC_CF; 0431           # Lm       CYRILLIC SUBSCRIPT SMALL LETTER BE
+1E053         ; NFKC_CF; 0432           # Lm       CYRILLIC SUBSCRIPT SMALL LETTER VE
+1E054         ; NFKC_CF; 0433           # Lm       CYRILLIC SUBSCRIPT SMALL LETTER GHE
+1E055         ; NFKC_CF; 0434           # Lm       CYRILLIC SUBSCRIPT SMALL LETTER DE
+1E056         ; NFKC_CF; 0435           # Lm       CYRILLIC SUBSCRIPT SMALL LETTER IE
+1E057         ; NFKC_CF; 0436           # Lm       CYRILLIC SUBSCRIPT SMALL LETTER ZHE
+1E058         ; NFKC_CF; 0437           # Lm       CYRILLIC SUBSCRIPT SMALL LETTER ZE
+1E059         ; NFKC_CF; 0438           # Lm       CYRILLIC SUBSCRIPT SMALL LETTER I
+1E05A         ; NFKC_CF; 043A           # Lm       CYRILLIC SUBSCRIPT SMALL LETTER KA
+1E05B         ; NFKC_CF; 043B           # Lm       CYRILLIC SUBSCRIPT SMALL LETTER EL
+1E05C         ; NFKC_CF; 043E           # Lm       CYRILLIC SUBSCRIPT SMALL LETTER O
+1E05D         ; NFKC_CF; 043F           # Lm       CYRILLIC SUBSCRIPT SMALL LETTER PE
+1E05E         ; NFKC_CF; 0441           # Lm       CYRILLIC SUBSCRIPT SMALL LETTER ES
+1E05F         ; NFKC_CF; 0443           # Lm       CYRILLIC SUBSCRIPT SMALL LETTER U
+1E060         ; NFKC_CF; 0444           # Lm       CYRILLIC SUBSCRIPT SMALL LETTER EF
+1E061         ; NFKC_CF; 0445           # Lm       CYRILLIC SUBSCRIPT SMALL LETTER HA
+1E062         ; NFKC_CF; 0446           # Lm       CYRILLIC SUBSCRIPT SMALL LETTER TSE
+1E063         ; NFKC_CF; 0447           # Lm       CYRILLIC SUBSCRIPT SMALL LETTER CHE
+1E064         ; NFKC_CF; 0448           # Lm       CYRILLIC SUBSCRIPT SMALL LETTER SHA
+1E065         ; NFKC_CF; 044A           # Lm       CYRILLIC SUBSCRIPT SMALL LETTER HARD SIGN
+1E066         ; NFKC_CF; 044B           # Lm       CYRILLIC SUBSCRIPT SMALL LETTER YERU
+1E067         ; NFKC_CF; 0491           # Lm       CYRILLIC SUBSCRIPT SMALL LETTER GHE WITH UPTURN
+1E068         ; NFKC_CF; 0456           # Lm       CYRILLIC SUBSCRIPT SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+1E069         ; NFKC_CF; 0455           # Lm       CYRILLIC SUBSCRIPT SMALL LETTER DZE
+1E06A         ; NFKC_CF; 045F           # Lm       CYRILLIC SUBSCRIPT SMALL LETTER DZHE
+1E06B         ; NFKC_CF; 04AB           # Lm       MODIFIER LETTER CYRILLIC SMALL ES WITH DESCENDER
+1E06C         ; NFKC_CF; A651           # Lm       MODIFIER LETTER CYRILLIC SMALL YERU WITH BACK YER
+1E06D         ; NFKC_CF; 04B1           # Lm       MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE
 1E900         ; NFKC_CF; 1E922          # L&       ADLAM CAPITAL LETTER ALIF
 1E901         ; NFKC_CF; 1E923          # L&       ADLAM CAPITAL LETTER DAALI
 1E902         ; NFKC_CF; 1E924          # L&       ADLAM CAPITAL LETTER LAAM
@@ -8937,7 +9001,7 @@ E0080..E00FF  ; NFKC_CF;                # Cn [128] <reserved-E0080>..<reserved-E
 E0100..E01EF  ; NFKC_CF;                # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256
 E01F0..E0FFF  ; NFKC_CF;                # Cn [3600] <reserved-E01F0>..<reserved-E0FFF>
 
-# Total code points: 10429
+# Total code points: 10491
 
 # ================================================
 
@@ -9895,6 +9959,7 @@ FFF0..FFF8    ; Changes_When_NFKC_Casefolded # Cn   [9] <reserved-FFF0>..<reserv
 1D7C3         ; Changes_When_NFKC_Casefolded # Sm       MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL
 1D7C4..1D7CB  ; Changes_When_NFKC_Casefolded # L&   [8] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD SMALL DIGAMMA
 1D7CE..1D7FF  ; Changes_When_NFKC_Casefolded # Nd  [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE
+1E030..1E06D  ; Changes_When_NFKC_Casefolded # Lm  [62] MODIFIER LETTER CYRILLIC SMALL A..MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE
 1E900..1E921  ; Changes_When_NFKC_Casefolded # L&  [34] ADLAM CAPITAL LETTER ALIF..ADLAM CAPITAL LETTER SHA
 1EE00..1EE03  ; Changes_When_NFKC_Casefolded # Lo   [4] ARABIC MATHEMATICAL ALEF..ARABIC MATHEMATICAL DAL
 1EE05..1EE1F  ; Changes_When_NFKC_Casefolded # Lo  [27] ARABIC MATHEMATICAL WAW..ARABIC MATHEMATICAL DOTLESS QAF
@@ -9948,6 +10013,6 @@ E0080..E00FF  ; Changes_When_NFKC_Casefolded # Cn [128] <reserved-E0080>..<reser
 E0100..E01EF  ; Changes_When_NFKC_Casefolded # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256
 E01F0..E0FFF  ; Changes_When_NFKC_Casefolded # Cn [3600] <reserved-E01F0>..<reserved-E0FFF>
 
-# Total code points: 10429
+# Total code points: 10491
 
 # EOF
index e04f705..38b7076 100644 (file)
@@ -1,6 +1,6 @@
-# EastAsianWidth-14.0.0.txt
-# Date: 2021-07-06, 09:58:53 GMT [KW, LI]
-# © 2021 Unicode®, Inc.
+# EastAsianWidth-15.0.0.txt
+# Date: 2022-05-24, 17:40:20 GMT [KW, LI]
+# © 2022 Unicode®, Inc.
 # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
 # For terms of use, see https://www.unicode.org/terms_of_use.html
 #
 0CE2..0CE3;N     # Mn     [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL
 0CE6..0CEF;N     # Nd    [10] KANNADA DIGIT ZERO..KANNADA DIGIT NINE
 0CF1..0CF2;N     # Lo     [2] KANNADA SIGN JIHVAMULIYA..KANNADA SIGN UPADHMANIYA
+0CF3;N           # Mc         KANNADA SIGN COMBINING ANUSVARA ABOVE RIGHT
 0D00..0D01;N     # Mn     [2] MALAYALAM SIGN COMBINING ANUSVARA ABOVE..MALAYALAM SIGN CANDRABINDU
 0D02..0D03;N     # Mc     [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA
 0D04..0D0C;N     # Lo     [9] MALAYALAM LETTER VEDIC ANUSVARA..MALAYALAM LETTER VOCALIC L
 0EBD;N           # Lo         LAO SEMIVOWEL SIGN NYO
 0EC0..0EC4;N     # Lo     [5] LAO VOWEL SIGN E..LAO VOWEL SIGN AI
 0EC6;N           # Lm         LAO KO LA
-0EC8..0ECD;N     # Mn     [6] LAO TONE MAI EK..LAO NIGGAHITA
+0EC8..0ECE;N     # Mn     [7] LAO TONE MAI EK..LAO YAMAKKAN
 0ED0..0ED9;N     # Nd    [10] LAO DIGIT ZERO..LAO DIGIT NINE
 0EDC..0EDF;N     # Lo     [4] LAO HO NO..LAO LETTER KHMU NYO
 0F00;N           # Lo         TIBETAN SYLLABLE OM
@@ -1946,6 +1947,7 @@ FFFD;A           # So         REPLACEMENT CHARACTER
 10EAB..10EAC;N   # Mn     [2] YEZIDI COMBINING HAMZA MARK..YEZIDI COMBINING MADDA MARK
 10EAD;N          # Pd         YEZIDI HYPHENATION MARK
 10EB0..10EB1;N   # Lo     [2] YEZIDI LETTER LAM WITH DOT ABOVE..YEZIDI LETTER YOT WITH CIRCUMFLEX ABOVE
+10EFD..10EFF;N   # Mn     [3] ARABIC SMALL LOW WORD SAKTA..ARABIC SMALL LOW WORD MADDA
 10F00..10F1C;N   # Lo    [29] OLD SOGDIAN LETTER ALEPH..OLD SOGDIAN LETTER FINAL TAW WITH VERTICAL TAIL
 10F1D..10F26;N   # No    [10] OLD SOGDIAN NUMBER ONE..OLD SOGDIAN FRACTION ONE HALF
 10F27;N          # Lo         OLD SOGDIAN LIGATURE AYIN-DALETH
@@ -2028,6 +2030,8 @@ FFFD;A           # So         REPLACEMENT CHARACTER
 11236..11237;N   # Mn     [2] KHOJKI SIGN NUKTA..KHOJKI SIGN SHADDA
 11238..1123D;N   # Po     [6] KHOJKI DANDA..KHOJKI ABBREVIATION SIGN
 1123E;N          # Mn         KHOJKI SIGN SUKUN
+1123F..11240;N   # Lo     [2] KHOJKI LETTER QA..KHOJKI LETTER SHORT I
+11241;N          # Mn         KHOJKI VOWEL SIGN VOCALIC R
 11280..11286;N   # Lo     [7] MULTANI LETTER A..MULTANI LETTER GA
 11288;N          # Lo         MULTANI LETTER GHA
 1128A..1128D;N   # Lo     [4] MULTANI LETTER CA..MULTANI LETTER JJA
@@ -2190,6 +2194,7 @@ FFFD;A           # So         REPLACEMENT CHARACTER
 11A9E..11AA2;N   # Po     [5] SOYOMBO HEAD MARK WITH MOON AND SUN AND TRIPLE FLAME..SOYOMBO TERMINAL MARK-2
 11AB0..11ABF;N   # Lo    [16] CANADIAN SYLLABICS NATTILIK HI..CANADIAN SYLLABICS SPA
 11AC0..11AF8;N   # Lo    [57] PAU CIN HAU LETTER PA..PAU CIN HAU GLOTTAL STOP FINAL
+11B00..11B09;N   # Po    [10] DEVANAGARI HEAD MARK..DEVANAGARI SIGN MINDU
 11C00..11C08;N   # Lo     [9] BHAIKSUKI LETTER A..BHAIKSUKI LETTER VOCALIC L
 11C0A..11C2E;N   # Lo    [37] BHAIKSUKI LETTER E..BHAIKSUKI LETTER HA
 11C2F;N          # Mc         BHAIKSUKI VOWEL SIGN AA
@@ -2235,6 +2240,19 @@ FFFD;A           # So         REPLACEMENT CHARACTER
 11EF3..11EF4;N   # Mn     [2] MAKASAR VOWEL SIGN I..MAKASAR VOWEL SIGN U
 11EF5..11EF6;N   # Mc     [2] MAKASAR VOWEL SIGN E..MAKASAR VOWEL SIGN O
 11EF7..11EF8;N   # Po     [2] MAKASAR PASSIMBANG..MAKASAR END OF SECTION
+11F00..11F01;N   # Mn     [2] KAWI SIGN CANDRABINDU..KAWI SIGN ANUSVARA
+11F02;N          # Lo         KAWI SIGN REPHA
+11F03;N          # Mc         KAWI SIGN VISARGA
+11F04..11F10;N   # Lo    [13] KAWI LETTER A..KAWI LETTER O
+11F12..11F33;N   # Lo    [34] KAWI LETTER KA..KAWI LETTER JNYA
+11F34..11F35;N   # Mc     [2] KAWI VOWEL SIGN AA..KAWI VOWEL SIGN ALTERNATE AA
+11F36..11F3A;N   # Mn     [5] KAWI VOWEL SIGN I..KAWI VOWEL SIGN VOCALIC R
+11F3E..11F3F;N   # Mc     [2] KAWI VOWEL SIGN E..KAWI VOWEL SIGN AI
+11F40;N          # Mn         KAWI VOWEL SIGN EU
+11F41;N          # Mc         KAWI SIGN KILLER
+11F42;N          # Mn         KAWI CONJOINER
+11F43..11F4F;N   # Po    [13] KAWI DANDA..KAWI PUNCTUATION CLOSING SPIRAL
+11F50..11F59;N   # Nd    [10] KAWI DIGIT ZERO..KAWI DIGIT NINE
 11FB0;N          # Lo         LISU LETTER YHA
 11FC0..11FD4;N   # No    [21] TAMIL FRACTION ONE THREE-HUNDRED-AND-TWENTIETH..TAMIL FRACTION DOWNSCALING FACTOR KIIZH
 11FD5..11FDC;N   # So     [8] TAMIL SIGN NEL..TAMIL SIGN MUKKURUNI
@@ -2247,8 +2265,11 @@ FFFD;A           # So         REPLACEMENT CHARACTER
 12480..12543;N   # Lo   [196] CUNEIFORM SIGN AB TIMES NUN TENU..CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU
 12F90..12FF0;N   # Lo    [97] CYPRO-MINOAN SIGN CM001..CYPRO-MINOAN SIGN CM114
 12FF1..12FF2;N   # Po     [2] CYPRO-MINOAN SIGN CM301..CYPRO-MINOAN SIGN CM302
-13000..1342E;N   # Lo  [1071] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH AA032
-13430..13438;N   # Cf     [9] EGYPTIAN HIEROGLYPH VERTICAL JOINER..EGYPTIAN HIEROGLYPH END SEGMENT
+13000..1342F;N   # Lo  [1072] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH V011D
+13430..1343F;N   # Cf    [16] EGYPTIAN HIEROGLYPH VERTICAL JOINER..EGYPTIAN HIEROGLYPH END WALLED ENCLOSURE
+13440;N          # Mn         EGYPTIAN HIEROGLYPH MIRROR HORIZONTALLY
+13441..13446;N   # Lo     [6] EGYPTIAN HIEROGLYPH FULL BLANK..EGYPTIAN HIEROGLYPH WIDE LOST SIGN
+13447..13455;N   # Mn    [15] EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP START..EGYPTIAN HIEROGLYPH MODIFIER DAMAGED
 14400..14646;N   # Lo   [583] ANATOLIAN HIEROGLYPH A001..ANATOLIAN HIEROGLYPH A530
 16800..16A38;N   # Lo   [569] BAMUM LETTER PHASE-A NGKUE MFON..BAMUM LETTER PHASE-F VUEQ
 16A40..16A5E;N   # Lo    [31] MRO LETTER TA..MRO LETTER TEK
@@ -2293,7 +2314,9 @@ FFFD;A           # So         REPLACEMENT CHARACTER
 1AFFD..1AFFE;W   # Lm     [2] KATAKANA LETTER MINNAN NASALIZED TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-8
 1B000..1B0FF;W   # Lo   [256] KATAKANA LETTER ARCHAIC E..HENTAIGANA LETTER RE-2
 1B100..1B122;W   # Lo    [35] HENTAIGANA LETTER RE-3..KATAKANA LETTER ARCHAIC WU
+1B132;W          # Lo         HIRAGANA LETTER SMALL KO
 1B150..1B152;W   # Lo     [3] HIRAGANA LETTER SMALL WI..HIRAGANA LETTER SMALL WO
+1B155;W          # Lo         KATAKANA LETTER SMALL KO
 1B164..1B167;W   # Lo     [4] KATAKANA LETTER SMALL WI..KATAKANA LETTER SMALL N
 1B170..1B2FB;W   # Lo   [396] NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB
 1BC00..1BC6A;N   # Lo   [107] DUPLOYAN LETTER H..DUPLOYAN LETTER VOCALIC M
@@ -2324,6 +2347,7 @@ FFFD;A           # So         REPLACEMENT CHARACTER
 1D200..1D241;N   # So    [66] GREEK VOCAL NOTATION SYMBOL-1..GREEK INSTRUMENTAL NOTATION SYMBOL-54
 1D242..1D244;N   # Mn     [3] COMBINING GREEK MUSICAL TRISEME..COMBINING GREEK MUSICAL PENTASEME
 1D245;N          # So         GREEK MUSICAL LEIMMA
+1D2C0..1D2D3;N   # No    [20] KAKTOVIK NUMERAL ZERO..KAKTOVIK NUMERAL NINETEEN
 1D2E0..1D2F3;N   # No    [20] MAYAN NUMERAL ZERO..MAYAN NUMERAL NINETEEN
 1D300..1D356;N   # So    [87] MONOGRAM FOR EARTH..TETRAGRAM FOR FOSTERING
 1D360..1D378;N   # No    [25] COUNTING ROD UNIT DIGIT ONE..TALLY MARK FIVE
@@ -2383,11 +2407,14 @@ FFFD;A           # So         REPLACEMENT CHARACTER
 1DF00..1DF09;N   # Ll    [10] LATIN SMALL LETTER FENG DIGRAPH WITH TRILL..LATIN SMALL LETTER T WITH HOOK AND RETROFLEX HOOK
 1DF0A;N          # Lo         LATIN LETTER RETROFLEX CLICK WITH RETROFLEX HOOK
 1DF0B..1DF1E;N   # Ll    [20] LATIN SMALL LETTER ESH WITH DOUBLE BAR..LATIN SMALL LETTER S WITH CURL
+1DF25..1DF2A;N   # Ll     [6] LATIN SMALL LETTER D WITH MID-HEIGHT LEFT HOOK..LATIN SMALL LETTER T WITH MID-HEIGHT LEFT HOOK
 1E000..1E006;N   # Mn     [7] COMBINING GLAGOLITIC LETTER AZU..COMBINING GLAGOLITIC LETTER ZHIVETE
 1E008..1E018;N   # Mn    [17] COMBINING GLAGOLITIC LETTER ZEMLJA..COMBINING GLAGOLITIC LETTER HERU
 1E01B..1E021;N   # Mn     [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI
 1E023..1E024;N   # Mn     [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS
 1E026..1E02A;N   # Mn     [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA
+1E030..1E06D;N   # Lm    [62] MODIFIER LETTER CYRILLIC SMALL A..MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE
+1E08F;N          # Mn         COMBINING CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
 1E100..1E12C;N   # Lo    [45] NYIAKENG PUACHUE HMONG LETTER MA..NYIAKENG PUACHUE HMONG LETTER W
 1E130..1E136;N   # Mn     [7] NYIAKENG PUACHUE HMONG TONE-B..NYIAKENG PUACHUE HMONG TONE-D
 1E137..1E13D;N   # Lm     [7] NYIAKENG PUACHUE HMONG SIGN FOR PERSON..NYIAKENG PUACHUE HMONG SYLLABLE LENGTHENER
@@ -2400,6 +2427,10 @@ FFFD;A           # So         REPLACEMENT CHARACTER
 1E2EC..1E2EF;N   # Mn     [4] WANCHO TONE TUP..WANCHO TONE KOINI
 1E2F0..1E2F9;N   # Nd    [10] WANCHO DIGIT ZERO..WANCHO DIGIT NINE
 1E2FF;N          # Sc         WANCHO NGUN SIGN
+1E4D0..1E4EA;N   # Lo    [27] NAG MUNDARI LETTER O..NAG MUNDARI LETTER ELL
+1E4EB;N          # Lm         NAG MUNDARI SIGN OJOD
+1E4EC..1E4EF;N   # Mn     [4] NAG MUNDARI SIGN MUHOR..NAG MUNDARI SIGN SUTUH
+1E4F0..1E4F9;N   # Nd    [10] NAG MUNDARI DIGIT ZERO..NAG MUNDARI DIGIT NINE
 1E7E0..1E7E6;N   # Lo     [7] ETHIOPIC SYLLABLE HHYA..ETHIOPIC SYLLABLE HHYO
 1E7E8..1E7EB;N   # Lo     [4] ETHIOPIC SYLLABLE GURAGE HHWA..ETHIOPIC SYLLABLE HHWE
 1E7ED..1E7EE;N   # Lo     [2] ETHIOPIC SYLLABLE GURAGE MWI..ETHIOPIC SYLLABLE GURAGE MWEE
@@ -2528,13 +2559,14 @@ FFFD;A           # So         REPLACEMENT CHARACTER
 1F6D0..1F6D2;W   # So     [3] PLACE OF WORSHIP..SHOPPING TROLLEY
 1F6D3..1F6D4;N   # So     [2] STUPA..PAGODA
 1F6D5..1F6D7;W   # So     [3] HINDU TEMPLE..ELEVATOR
-1F6DD..1F6DF;W   # So     [3] PLAYGROUND SLIDE..RING BUOY
+1F6DC..1F6DF;W   # So     [4] WIRELESS..RING BUOY
 1F6E0..1F6EA;N   # So    [11] HAMMER AND WRENCH..NORTHEAST-POINTING AIRPLANE
 1F6EB..1F6EC;W   # So     [2] AIRPLANE DEPARTURE..AIRPLANE ARRIVING
 1F6F0..1F6F3;N   # So     [4] SATELLITE..PASSENGER SHIP
 1F6F4..1F6FC;W   # So     [9] SCOOTER..ROLLER SKATE
-1F700..1F773;N   # So   [116] ALCHEMICAL SYMBOL FOR QUINTESSENCE..ALCHEMICAL SYMBOL FOR HALF OUNCE
-1F780..1F7D8;N   # So    [89] BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE..NEGATIVE CIRCLED SQUARE
+1F700..1F776;N   # So   [119] ALCHEMICAL SYMBOL FOR QUINTESSENCE..LUNAR ECLIPSE
+1F77B..1F77F;N   # So     [5] HAUMEA..ORCUS
+1F780..1F7D9;N   # So    [90] BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE..NINE POINTED WHITE STAR
 1F7E0..1F7EB;W   # So    [12] LARGE ORANGE CIRCLE..LARGE BROWN SQUARE
 1F7F0;W          # So         HEAVY EQUALS SIGN
 1F800..1F80B;N   # So    [12] LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD..DOWNWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD
@@ -2551,22 +2583,20 @@ FFFD;A           # So         REPLACEMENT CHARACTER
 1F947..1F9FF;W   # So   [185] FIRST PLACE MEDAL..NAZAR AMULET
 1FA00..1FA53;N   # So    [84] NEUTRAL CHESS KING..BLACK CHESS KNIGHT-BISHOP
 1FA60..1FA6D;N   # So    [14] XIANGQI RED GENERAL..XIANGQI BLACK SOLDIER
-1FA70..1FA74;W   # So     [5] BALLET SHOES..THONG SANDAL
-1FA78..1FA7C;W   # So     [5] DROP OF BLOOD..CRUTCH
-1FA80..1FA86;W   # So     [7] YO-YO..NESTING DOLLS
-1FA90..1FAAC;W   # So    [29] RINGED PLANET..HAMSA
-1FAB0..1FABA;W   # So    [11] FLY..NEST WITH EGGS
-1FAC0..1FAC5;W   # So     [6] ANATOMICAL HEART..PERSON WITH CROWN
-1FAD0..1FAD9;W   # So    [10] BLUEBERRIES..JAR
-1FAE0..1FAE7;W   # So     [8] MELTING FACE..BUBBLES
-1FAF0..1FAF6;W   # So     [7] HAND WITH INDEX FINGER AND THUMB CROSSED..HEART HANDS
+1FA70..1FA7C;W   # So    [13] BALLET SHOES..CRUTCH
+1FA80..1FA88;W   # So     [9] YO-YO..FLUTE
+1FA90..1FABD;W   # So    [46] RINGED PLANET..WING
+1FABF..1FAC5;W   # So     [7] GOOSE..PERSON WITH CROWN
+1FACE..1FADB;W   # So    [14] MOOSE..PEA POD
+1FAE0..1FAE8;W   # So     [9] MELTING FACE..SHAKING FACE
+1FAF0..1FAF8;W   # So     [9] HAND WITH INDEX FINGER AND THUMB CROSSED..RIGHTWARDS PUSHING HAND
 1FB00..1FB92;N   # So   [147] BLOCK SEXTANT-1..UPPER HALF INVERSE MEDIUM SHADE AND LOWER HALF BLOCK
 1FB94..1FBCA;N   # So    [55] LEFT HALF INVERSE MEDIUM SHADE AND RIGHT HALF BLOCK..WHITE UP-POINTING CHEVRON
 1FBF0..1FBF9;N   # Nd    [10] SEGMENTED DIGIT ZERO..SEGMENTED DIGIT NINE
 20000..2A6DF;W   # Lo [42720] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6DF
 2A6E0..2A6FF;W   # Cn    [32] <reserved-2A6E0>..<reserved-2A6FF>
-2A700..2B738;W   # Lo  [4153] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B738
-2B739..2B73F;W   # Cn     [7] <reserved-2B739>..<reserved-2B73F>
+2A700..2B739;W   # Lo  [4154] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B739
+2B73A..2B73F;W   # Cn     [6] <reserved-2B73A>..<reserved-2B73F>
 2B740..2B81D;W   # Lo   [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D
 2B81E..2B81F;W   # Cn     [2] <reserved-2B81E>..<reserved-2B81F>
 2B820..2CEA1;W   # Lo  [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1
@@ -2577,7 +2607,9 @@ FFFD;A           # So         REPLACEMENT CHARACTER
 2FA1E..2FA1F;W   # Cn     [2] <reserved-2FA1E>..<reserved-2FA1F>
 2FA20..2FFFD;W   # Cn  [1502] <reserved-2FA20>..<reserved-2FFFD>
 30000..3134A;W   # Lo  [4939] CJK UNIFIED IDEOGRAPH-30000..CJK UNIFIED IDEOGRAPH-3134A
-3134B..3FFFD;W   # Cn [60595] <reserved-3134B>..<reserved-3FFFD>
+3134B..3134F;W   # Cn     [5] <reserved-3134B>..<reserved-3134F>
+31350..323AF;W   # Lo  [4192] CJK UNIFIED IDEOGRAPH-31350..CJK UNIFIED IDEOGRAPH-323AF
+323B0..3FFFD;W   # Cn [56398] <reserved-323B0>..<reserved-3FFFD>
 E0001;N          # Cf         LANGUAGE TAG
 E0020..E007F;N   # Cf    [96] TAG SPACE..CANCEL TAG
 E0100..E01EF;A   # Mn   [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256
index 391a7e0..8e08433 100644 (file)
@@ -1,10 +1,10 @@
-# EmojiSources-14.0.0.txt
-# Date: 2021-03-16, 21:39:00 GMT [MS, KW]
-# © 2021 Unicode®, Inc.
-# For terms of use, see http://www.unicode.org/terms_of_use.html
+# EmojiSources-15.0.0.txt
+# Date: 2022-05-03, 18:51:00 GMT [MS, KW]
+# © 2022 Unicode®, Inc.
+# For terms of use, see https://www.unicode.org/terms_of_use.html
 #
 # Unicode Character Database
-# For documentation, see http://www.unicode.org/reports/tr44/
+# For documentation, see https://www.unicode.org/reports/tr44/
 #
 # This file provides historical mappings between Unicode code points and sequences on one hand
 # and Shift-JIS codes for cell phone carrier symbols on the other hand.
@@ -34,7 +34,7 @@
 # in these mappings do not include variation selectors for emoji presentation.
 # Thus they do not match the named character sequences with keycaps listed in
 # NamedSequences.txt.
-# For modern data used in emoji support, see http://www.unicode.org/Public/emoji/latest/
+# For modern data used in emoji support, see https://www.unicode.org/Public/emoji/latest/
 
 0023 20E3;F985;F489;F7B0
 0030 20E3;F990;F7C9;F7C5
index 8e7ca09..cc147cc 100644 (file)
@@ -1,11 +1,11 @@
-# HangulSyllableType-14.0.0.txt
-# Date: 2021-03-08, 19:35:46 GMT
-# © 2021 Unicode®, Inc.
+# HangulSyllableType-15.0.0.txt
+# Date: 2022-02-02, 23:35:41 GMT
+# © 2022 Unicode®, Inc.
 # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
-# For terms of use, see http://www.unicode.org/terms_of_use.html
+# For terms of use, see https://www.unicode.org/terms_of_use.html
 #
 # Unicode Character Database
-#   For documentation, see http://www.unicode.org/reports/tr44/
+#   For documentation, see https://www.unicode.org/reports/tr44/
 
 # ================================================
 
index 451255c..a11154a 100644 (file)
@@ -270,6 +270,7 @@ ARABIC LETTER HEH WITH YEH ABOVE    06C0
 ARABIC LETTER MARK     061C
 Arabic Letters, Extended       0671
 Arabic Letters, Extended       0750
+Arabic Letters, Extended       10EC0
 ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM  FDFD
 Arabic Ligatures       FBEA
 Arabic Mathematical Alphabetic Symbols 1EE00
@@ -387,7 +388,7 @@ ASTERISM    2042
 Astrological Signs     26B3
 Astrological Signs, Tibetan    0F15
 Astrological Symbols   263D
-Astrological Symbols   28D3
+Astrological Symbols   2BD3
 Astrological Symbols, Weather and      2600
 asymptotic to  2248
 ASYMPTOTICALLY EQUAL TO        2243
@@ -953,6 +954,7 @@ CJK Unified Ideographs Extension D  2B740
 CJK Unified Ideographs Extension E     2B820
 CJK Unified Ideographs Extension F     2CEB0
 CJK Unified Ideographs Extension G     30000
+CJK Unified Ideographs Extension H     31350
 CLAPPING HANDS SIGN    1F44F
 claudian antisigma     2183
 claudian digamma inversum      2132
@@ -1374,6 +1376,7 @@ Cyrillic Combining Characters     0483
 Cyrillic Extended-A    2DE0
 Cyrillic Extended-B    A640
 Cyrillic Extended-C    1C80
+Cyrillic Extended-D    1E030
 Cyrillic Extensions    0450
 Cyrillic Extensions    048A
 Cyrillic Historic Letters      0460
@@ -1467,6 +1470,7 @@ Devanagari Dependent Vowel Signs  093E
 Devanagari Digits      0966
 DEVANAGARI DOUBLE DANDA        0965
 Devanagari Extended    A8E0
+Devanagari Extended-A  11B00
 Devanagari Extensions  0951
 Devanagari Independent Vowels  0904
 DEVANAGARI OM  0950
@@ -1626,6 +1630,7 @@ DOLPHIN   1F42C
 domain restriction     25C1
 Domino Tiles   1F030
 DONG SIGN      20AB
+DONKEY 1FACF
 dot    002E
 DOT ABOVE      02D9
 DOT ABOVE RIGHT, COMBINING     0358
@@ -2042,6 +2047,7 @@ factory   26ED
 FAHRENHEIT, DEGREE     2109
 Fairy Tale Symbols     1F478
 FAMILY 1F46A
+FAN, FOLDING HAND      1FAAD
 fast cursor down       21A1
 fast cursor left       219E
 fast cursor right      21A0
@@ -2250,6 +2256,7 @@ GETA MARK 3013
 ghana currency 20B5
 GHOST  1F47B
 GIMEL SYMBOL   2137
+GINGER ROOT    1FADA
 GIRL   1F467
 Glagolitic     2C00
 Glagolitic Supplement  1E000
@@ -2272,6 +2279,7 @@ GOBLIN, JAPANESE  1F47A
 gold medal     1F947
 Golden Numbers, Runic  16EE
 golf course    26F3
+GOOSE  1FABF
 Gothic 10330
 Grantha        11300
 GRAPHEME JOINER, COMBINING     034F
@@ -2563,6 +2571,7 @@ ht        0009
 Hungarian, Old 10C80
 HV, LATIN SMALL LETTER 0195
 HWAIR, LATIN CAPITAL LETTER    01F6
+HYACINTH       1FABB
 HYPHEN 2010
 HYPHEN BULLET  2043
 hyphen or minus sign   002D
@@ -2647,6 +2656,7 @@ Ideographs Extension D, CJK Unified       2B740
 Ideographs Extension E, CJK Unified    2B820
 Ideographs Extension F, CJK Unified    2CEB0
 Ideographs Extension G, CJK Unified    30000
+Ideographs Extension H, CJK Unified    31350
 Ideographs Supplement, CJK Compatibility       2F800
 Ideographs, Circled    3280
 Ideographs, CJK Compatibility  F900
@@ -2830,6 +2840,7 @@ Japanese Katakana Words, Squared  3300
 Japanese Katakana, Circled     32D0
 japanese kome  203B
 Javanese       A980
+JELLYFISH      1FABC
 JERUSALEM, CROSS OF    2629
 jis composition circle 20DD
 JIS X 0213 Compatibility Ideographs    FA30
@@ -2853,6 +2864,7 @@ K, LATIN SUBSCRIPT SMALL LETTER   2096
 KA, HIRAGANA LETTER SMALL      3095
 kabusiki-gaisya        337F
 Kaithi 11080
+Kaktovik Numerals      1D2C0
 Kana Extended-A        1B100
 Kana Extension, Small  1B130
 Kana Repeat Marks      3031
@@ -2877,6 +2889,7 @@ Katakana Words, Squared   3300
 Katakana, Circled      32D0
 KATAKANA-HIRAGANA DOUBLE HYPHEN        30A0
 KATAKANA-HIRAGANA PROLONGED SOUND MARK 30FC
+Kawi   11F00
 Kayah Li       A900
 KELVIN SIGN    212A
 ket    27E9
@@ -2894,7 +2907,9 @@ Keyboard Symbols  2324
 Keyboard Symbols       2380
 Keyboard Symbols       2396
 KEYCAP, COMBINING ENCLOSING    20E3
+KHANDA 1FAAF
 khanda, gurmukhi       262C
+khanda ta, bangla      09CE
 Kharoshthi     10A00
 Kharoshthi Digits      10A40
 Khitan Small Script    18B00
@@ -3537,6 +3552,7 @@ MOON, CRESCENT    1F319
 MOON, FIRST QUARTER    263D
 MOON, LAST QUARTER     263E
 Moon, Sun, and Star Symbols    1F311
+MOOSE  1FACE
 mortarboard    1F393
 most positive  223E
 MOTORWAY       1F6E3
@@ -3622,6 +3638,7 @@ N-ARY WHITE VERTICAL BAR  2AFF
 naal, tamil    0BF3
 Nabataean      10880
 NABLA  2207
+Nag Mundari    1E4D0
 NAIRA SIGN     20A6
 NAND   22BC
 Nandinagari    119A0
@@ -3737,6 +3754,7 @@ Numbers, Runic Golden     16EE
 Numbers, Tamil 0BE7
 Numbers, White on Black Circled        24EB
 Numerals, Hangzhou     3021
+Numerals, Kaktovik     1D2C0
 Numerals, Mayan        1D2E0
 Numerals, Old Italic   10320
 Numerals, Roman        2160
@@ -4100,6 +4118,8 @@ plaintiff 226C
 PLANCK CONSTANT        210E
 PLANCK CONSTANT OVER TWO PI    210F
 Planet Symbols 263F
+Planets, Symbols for Minor     26B3
+Planets, Symbols for Minor     1F77B
 Plant Symbols  1F330
 Plastics Recycling Symbols     2673
 Playing Card Suits     2660
@@ -5985,6 +6005,7 @@ WHITE VERTICAL BAR, N-ARY 2AFF
 WIDE BRIDGE ABOVE, COMBINING   20E9
 Wiggly Fences  29D8
 WIGGLY VERTICAL LINE   2E3E
+WING   1FABD
 wj     2060
 WOLF FACE      1F43A
 WOMAN  1F469
index 69109ac..8b51a61 100644 (file)
@@ -1,11 +1,11 @@
-# IndicPositionalCategory-14.0.0.txt
-# Date: 2021-05-22, 01:01:00 GMT [KW, RP]
-# © 2021 Unicode®, Inc.
+# IndicPositionalCategory-15.0.0.txt
+# Date: 2022-05-26, 02:18:00 GMT [KW, RP]
+# © 2022 Unicode®, Inc.
 # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
-# For terms of use, see http://www.unicode.org/terms_of_use.html
+# For terms of use, see https://www.unicode.org/terms_of_use.html
 #
 # For documentation, see UAX #44: Unicode Character Database,
-# at http://www.unicode.org/reports/tr44/
+# at https://www.unicode.org/reports/tr44/
 #
 # This file defines the following property:
 #
 #
 # Ahom, Balinese, Batak, Bengali, Bhaiksuki, Brahmi, Buginese, Buhid,
 # Chakma, Cham, Devanagari, Dives Akuru, Dogra, Grantha, Gujarati,
-# Gunjala Gondi, Gurmukhi, Hanunoo, Javanese, Kaithi, Kannada,
-# Kharoshthi, Khmer, Khojki, Khudawadi, Lao, Lepcha, Limbu, Makasar,
-# Malayalam, Marchen, Masaram Gondi, Meetei Mayek, Modi, Myanmar,
-# Nandinagari, Newa, New Tai Lue, Oriya, Rejang, Saurashtra, Sharada,
-# Siddham, Sinhala, Soyombo, Sundanese, Syloti Nagri, Tagalog,
-# Tagbanwa, Tai Tham, Tai Viet, Takri, Tamil, Telugu, Thai, Tibetan,
-# Tirhuta, and Zanabazar Square.
+# Gunjala Gondi, Gurmukhi, Hanunoo, Javanese, Kaithi, Kannada, Kawi,
+# Kayah Li, Kharoshthi, Khmer, Khojki, Khudawadi, Lao, Lepcha, Limbu,
+# Makasar, Malayalam, Marchen, Masaram Gondi, Meetei Mayek, Modi,
+# Myanmar, Nandinagari, Newa, New Tai Lue, Oriya, Rejang, Saurashtra,
+# Sharada, Siddham, Sinhala, Soyombo, Sundanese, Syloti Nagri,
+# Tagalog, Tagbanwa, Tai Tham, Tai Viet, Takri, Tamil, Telugu, Thai,
+# Tibetan, Tirhuta, and Zanabazar Square.
 #
 # All characters for all other scripts not in that list
 # take the default value for this property.
 0CBE          ; Right # Mc       KANNADA VOWEL SIGN AA
 0CC1..0CC4    ; Right # Mc   [4] KANNADA VOWEL SIGN U..KANNADA VOWEL SIGN VOCALIC RR
 0CD5..0CD6    ; Right # Mc   [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK
+0CF3          ; Right # Mc       KANNADA SIGN COMBINING ANUSVARA ABOVE RIGHT
 0D02..0D03    ; Right # Mc   [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA
 0D3E..0D40    ; Right # Mc   [3] MALAYALAM VOWEL SIGN AA..MALAYALAM VOWEL SIGN II
 0D41..0D42    ; Right # Mn   [2] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN UU
@@ -296,6 +297,9 @@ ABEC          ; Right # Mc       MEETEI MAYEK LUM IYEK
 11D93..11D94  ; Right # Mc   [2] GUNJALA GONDI VOWEL SIGN OO..GUNJALA GONDI VOWEL SIGN AU
 11D96         ; Right # Mc       GUNJALA GONDI SIGN VISARGA
 11EF6         ; Right # Mc       MAKASAR VOWEL SIGN O
+11F03         ; Right # Mc       KAWI SIGN VISARGA
+11F34..11F35  ; Right # Mc   [2] KAWI VOWEL SIGN AA..KAWI VOWEL SIGN ALTERNATE AA
+11F41         ; Right # Mc       KAWI SIGN KILLER
 
 # Indic_Positional_Category=Left
 
@@ -346,6 +350,7 @@ AAEE          ; Left # Mc       MEETEI MAYEK VOWEL SIGN AU
 119E4         ; Left # Mc       NANDINAGARI VOWEL SIGN PRISHTHAMATRA E
 11CB1         ; Left # Mc       MARCHEN VOWEL SIGN I
 11EF5         ; Left # Mc       MAKASAR VOWEL SIGN E
+11F3E..11F3F  ; Left # Mc   [2] KAWI VOWEL SIGN E..KAWI VOWEL SIGN AI
 
 # Indic_Positional_Category=Visual_Order_Left
 
@@ -388,7 +393,7 @@ AABB..AABC    ; Visual_Order_Left # Lo   [2] TAI VIET VOWEL AUE..TAI VIET VOWEL
 093A          ; Top # Mn       DEVANAGARI VOWEL SIGN OE
 0945..0948    ; Top # Mn   [4] DEVANAGARI VOWEL SIGN CANDRA E..DEVANAGARI VOWEL SIGN AI
 0951          ; Top # Mn       DEVANAGARI STRESS SIGN UDATTA
-0953..0955    ; Top # Mn   [3] DEVANAGARI GRAVE ACCENT..DEVANAGARI VOWEL SIGN CANDRA LONG E
+0955          ; Top # Mn       DEVANAGARI VOWEL SIGN CANDRA LONG E
 0981          ; Top # Mn       BENGALI SIGN CANDRABINDU
 09FE          ; Top # Mn       BENGALI SANDHI MARK
 0A01..0A02    ; Top # Mn   [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI
@@ -428,7 +433,7 @@ AABB..AABC    ; Visual_Order_Left # Lo   [2] TAI VIET VOWEL AUE..TAI VIET VOWEL
 0EB1          ; Top # Mn       LAO VOWEL SIGN MAI KAN
 0EB4..0EB7    ; Top # Mn   [4] LAO VOWEL SIGN I..LAO VOWEL SIGN YY
 0EBB          ; Top # Mn       LAO VOWEL SIGN MAI KON
-0EC8..0ECD    ; Top # Mn   [6] LAO TONE MAI EK..LAO NIGGAHITA
+0EC8..0ECE    ; Top # Mn   [7] LAO TONE MAI EK..LAO YAMAKKAN
 0F39          ; Top # Mn       TIBETAN MARK TSA -PHRU
 0F72          ; Top # Mn       TIBETAN VOWEL SIGN I
 0F7A..0F7E    ; Top # Mn   [5] TIBETAN VOWEL SIGN E..TIBETAN SIGN RJES SU NGA RO
@@ -488,6 +493,7 @@ A826          ; Top # Mn       SYLOTI NAGRI VOWEL SIGN E
 A8C5          ; Top # Mn       SAURASHTRA SIGN CANDRABINDU
 A8E0..A8F1    ; Top # Mn  [18] COMBINING DEVANAGARI DIGIT ZERO..COMBINING DEVANAGARI SIGN AVAGRAHA
 A8FF          ; Top # Mn       DEVANAGARI VOWEL SIGN AY
+A926..A92A    ; Top # Mn   [5] KAYAH LI VOWEL UE..KAYAH LI VOWEL O
 A94A          ; Top # Mn       REJANG VOWEL SIGN AI
 A94F..A951    ; Top # Mn   [3] REJANG CONSONANT SIGN NG..REJANG CONSONANT SIGN R
 A980..A982    ; Top # Mn   [3] JAVANESE SIGN PANYANGGA..JAVANESE SIGN LAYAR
@@ -580,6 +586,10 @@ ABE5          ; Top # Mn       MEETEI MAYEK VOWEL SIGN ANAP
 11D90..11D91  ; Top # Mn   [2] GUNJALA GONDI VOWEL SIGN EE..GUNJALA GONDI VOWEL SIGN AI
 11D95         ; Top # Mn       GUNJALA GONDI SIGN ANUSVARA
 11EF3         ; Top # Mn       MAKASAR VOWEL SIGN I
+11F00..11F01  ; Top # Mn   [2] KAWI SIGN CANDRABINDU..KAWI SIGN ANUSVARA
+11F02         ; Top # Lo       KAWI SIGN REPHA
+11F36..11F37  ; Top # Mn   [2] KAWI VOWEL SIGN I..KAWI VOWEL SIGN II
+11F40         ; Top # Mn       KAWI VOWEL SIGN EU
 
 # Indic_Positional_Category=Bottom
 
@@ -688,6 +698,7 @@ ABED          ; Bottom # Mn       MEETEI MAYEK APUN IYEK
 111C9..111CA  ; Bottom # Mn   [2] SHARADA SANDHI MARK..SHARADA SIGN NUKTA
 111CC         ; Bottom # Mn       SHARADA EXTRA SHORT VOWEL MARK
 1122F         ; Bottom # Mn       KHOJKI VOWEL SIGN U
+11241         ; Bottom # Mn       KHOJKI VOWEL SIGN VOCALIC R
 112E3..112E4  ; Bottom # Mn   [2] KHUDAWADI VOWEL SIGN U..KHUDAWADI VOWEL SIGN UU
 112E9..112EA  ; Bottom # Mn   [2] KHUDAWADI SIGN NUKTA..KHUDAWADI SIGN VIRAMA
 1133B..1133C  ; Bottom # Mn   [2] COMBINING BINDU BELOW..GRANTHA SIGN NUKTA
@@ -728,6 +739,7 @@ ABED          ; Bottom # Mn       MEETEI MAYEK APUN IYEK
 11D44         ; Bottom # Mn       MASARAM GONDI SIGN HALANTA
 11D47         ; Bottom # Mn       MASARAM GONDI RA-KARA
 11EF4         ; Bottom # Mn       MAKASAR VOWEL SIGN U
+11F38..11F3A  ; Bottom # Mn   [3] KAWI VOWEL SIGN U..KAWI VOWEL SIGN VOCALIC R
 
 # Indic_Positional_Category=Top_And_Bottom
 
index 23b8637..7843c17 100644 (file)
@@ -1,11 +1,11 @@
-# IndicSyllabicCategory-14.0.0.txt
-# Date: 2021-05-22, 01:01:00 GMT [KW, RP]
-# © 2021 Unicode®, Inc.
+# IndicSyllabicCategory-15.0.0.txt
+# Date: 2022-05-26, 02:18:00 GMT [KW, RP]
+# © 2022 Unicode®, Inc.
 # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
-# For terms of use, see http://www.unicode.org/terms_of_use.html
+# For terms of use, see https://www.unicode.org/terms_of_use.html
 #
 # For documentation, see UAX #44: Unicode Character Database,
-# at http://www.unicode.org/reports/tr44/
+# at https://www.unicode.org/reports/tr44/
 #
 # This file defines the following property:
 #
@@ -37,7 +37,7 @@
 #
 # Ahom, Balinese, Batak, Bengali, Bhaiksuki, Brahmi, Buginese, Buhid,
 # Chakma, Cham, Devanagari, Dives Akuru, Dogra, Grantha, Gujarati,
-# Gunjala Gondi, Gurmukhi, Hanunoo, Javanese, Kaithi, Kannada,
+# Gunjala Gondi, Gurmukhi, Hanunoo, Javanese, Kaithi, Kannada, Kawi,
 # Kayah Li, Kharoshthi, Khmer, Khojki, Khudawadi, Lao, Lepcha, Limbu,
 # Mahajani, Makasar, Malayalam, Marchen, Masaram Gondi, Meetei Mayek,
 # Modi, Multani, Myanmar, Nandinagari, Newa, New Tai Lue, Oriya,
@@ -84,6 +84,7 @@
 0C80          ; Bindu # Lo       KANNADA SIGN SPACING CANDRABINDU
 0C81          ; Bindu # Mn       KANNADA SIGN CANDRABINDU
 0C82          ; Bindu # Mc       KANNADA SIGN ANUSVARA
+0CF3          ; Bindu # Mc       KANNADA SIGN COMBINING ANUSVARA ABOVE RIGHT
 0D00..0D01    ; Bindu # Mn   [2] MALAYALAM SIGN COMBINING ANUSVARA ABOVE..MALAYALAM SIGN CANDRABINDU
 0D02          ; Bindu # Mc       MALAYALAM SIGN ANUSVARA
 0D04          ; Bindu # Lo       MALAYALAM LETTER VEDIC ANUSVARA
@@ -133,6 +134,7 @@ A980..A981    ; Bindu # Mn   [2] JAVANESE SIGN PANYANGGA..JAVANESE SIGN CECAK
 11CB5..11CB6  ; Bindu # Mn   [2] MARCHEN SIGN ANUSVARA..MARCHEN SIGN CANDRABINDU
 11D40         ; Bindu # Mn       MASARAM GONDI SIGN ANUSVARA
 11D95         ; Bindu # Mn       GUNJALA GONDI SIGN ANUSVARA
+11F00..11F01  ; Bindu # Mn   [2] KAWI SIGN CANDRABINDU..KAWI SIGN ANUSVARA
 
 # ================================================
 
@@ -179,6 +181,7 @@ AAF5          ; Visarga # Mc       MEETEI MAYEK VOWEL SIGN VISARGA
 11C3E         ; Visarga # Mc       BHAIKSUKI SIGN VISARGA
 11D41         ; Visarga # Mn       MASARAM GONDI SIGN VISARGA
 11D96         ; Visarga # Mc       GUNJALA GONDI SIGN VISARGA
+11F03         ; Visarga # Mc       KAWI SIGN VISARGA
 
 # ================================================
 
@@ -320,6 +323,7 @@ ABED          ; Pure_Killer # Mn       MEETEI MAYEK APUN IYEK
 1193D         ; Pure_Killer # Mc       DIVES AKURU SIGN HALANTA
 11A34         ; Pure_Killer # Mn       ZANABAZAR SQUARE SIGN VIRAMA
 11D44         ; Pure_Killer # Mn       MASARAM GONDI SIGN HALANTA
+11F41         ; Pure_Killer # Mc       KAWI SIGN KILLER
 
 # ================================================
 
@@ -346,6 +350,7 @@ AAF6          ; Invisible_Stacker # Mn       MEETEI MAYEK VIRAMA
 11A99         ; Invisible_Stacker # Mn       SOYOMBO SUBJOINER
 11D45         ; Invisible_Stacker # Mn       MASARAM GONDI VIRAMA
 11D97         ; Invisible_Stacker # Mn       GUNJALA GONDI VIRAMA
+11F42         ; Invisible_Stacker # Mn       KAWI CONJOINER
 
 # ================================================
 
@@ -416,6 +421,7 @@ ABD1          ; Vowel_Independent # Lo       MEETEI MAYEK LETTER ATIYA
 11103..11106  ; Vowel_Independent # Lo   [4] CHAKMA LETTER AA..CHAKMA LETTER E
 11183..11190  ; Vowel_Independent # Lo  [14] SHARADA LETTER A..SHARADA LETTER AU
 11200..11207  ; Vowel_Independent # Lo   [8] KHOJKI LETTER A..KHOJKI LETTER AU
+11240         ; Vowel_Independent # Lo       KHOJKI LETTER SHORT I
 11280..11283  ; Vowel_Independent # Lo   [4] MULTANI LETTER A..MULTANI LETTER E
 112B0..112B9  ; Vowel_Independent # Lo  [10] KHUDAWADI LETTER A..KHUDAWADI LETTER AU
 11305..1130C  ; Vowel_Independent # Lo   [8] GRANTHA LETTER A..GRANTHA LETTER VOCALIC L
@@ -443,6 +449,7 @@ ABD1          ; Vowel_Independent # Lo       MEETEI MAYEK LETTER ATIYA
 11D60..11D65  ; Vowel_Independent # Lo   [6] GUNJALA GONDI LETTER A..GUNJALA GONDI LETTER UU
 11D67..11D68  ; Vowel_Independent # Lo   [2] GUNJALA GONDI LETTER EE..GUNJALA GONDI LETTER AI
 11D6A..11D6B  ; Vowel_Independent # Lo   [2] GUNJALA GONDI LETTER OO..GUNJALA GONDI LETTER AU
+11F04..11F10  ; Vowel_Independent # Lo  [13] KAWI LETTER A..KAWI LETTER O
 
 # ================================================
 
@@ -638,6 +645,7 @@ ABE9..ABEA    ; Vowel_Dependent # Mc   [2] MEETEI MAYEK VOWEL SIGN CHEINAP..MEET
 1122C..1122E  ; Vowel_Dependent # Mc   [3] KHOJKI VOWEL SIGN AA..KHOJKI VOWEL SIGN II
 1122F..11231  ; Vowel_Dependent # Mn   [3] KHOJKI VOWEL SIGN U..KHOJKI VOWEL SIGN AI
 11232..11233  ; Vowel_Dependent # Mc   [2] KHOJKI VOWEL SIGN O..KHOJKI VOWEL SIGN AU
+11241         ; Vowel_Dependent # Mn       KHOJKI VOWEL SIGN VOCALIC R
 112E0..112E2  ; Vowel_Dependent # Mc   [3] KHUDAWADI VOWEL SIGN AA..KHUDAWADI VOWEL SIGN II
 112E3..112E8  ; Vowel_Dependent # Mn   [6] KHUDAWADI VOWEL SIGN U..KHUDAWADI VOWEL SIGN AU
 1133E..1133F  ; Vowel_Dependent # Mc   [2] GRANTHA VOWEL SIGN AA..GRANTHA VOWEL SIGN I
@@ -700,6 +708,10 @@ ABE9..ABEA    ; Vowel_Dependent # Mc   [2] MEETEI MAYEK VOWEL SIGN CHEINAP..MEET
 11D93..11D94  ; Vowel_Dependent # Mc   [2] GUNJALA GONDI VOWEL SIGN OO..GUNJALA GONDI VOWEL SIGN AU
 11EF3..11EF4  ; Vowel_Dependent # Mn   [2] MAKASAR VOWEL SIGN I..MAKASAR VOWEL SIGN U
 11EF5..11EF6  ; Vowel_Dependent # Mc   [2] MAKASAR VOWEL SIGN E..MAKASAR VOWEL SIGN O
+11F34..11F35  ; Vowel_Dependent # Mc   [2] KAWI VOWEL SIGN AA..KAWI VOWEL SIGN ALTERNATE AA
+11F36..11F3A  ; Vowel_Dependent # Mn   [5] KAWI VOWEL SIGN I..KAWI VOWEL SIGN VOCALIC R
+11F3E..11F3F  ; Vowel_Dependent # Mc   [2] KAWI VOWEL SIGN E..KAWI VOWEL SIGN AI
+11F40         ; Vowel_Dependent # Mn       KAWI VOWEL SIGN EU
 
 # ================================================
 
@@ -878,6 +890,7 @@ ABD2..ABDA    ; Consonant # Lo   [9] MEETEI MAYEK LETTER GOK..MEETEI MAYEK LETTE
 11191..111B2  ; Consonant # Lo  [34] SHARADA LETTER KA..SHARADA LETTER HA
 11208..11211  ; Consonant # Lo  [10] KHOJKI LETTER KA..KHOJKI LETTER JJA
 11213..1122B  ; Consonant # Lo  [25] KHOJKI LETTER NYA..KHOJKI LETTER LLA
+1123F         ; Consonant # Lo       KHOJKI LETTER QA
 11284..11286  ; Consonant # Lo   [3] MULTANI LETTER KA..MULTANI LETTER GA
 11288         ; Consonant # Lo       MULTANI LETTER GHA
 1128A..1128D  ; Consonant # Lo   [4] MULTANI LETTER CA..MULTANI LETTER JJA
@@ -908,6 +921,7 @@ ABD2..ABDA    ; Consonant # Lo   [9] MEETEI MAYEK LETTER GOK..MEETEI MAYEK LETTE
 11D0C..11D30  ; Consonant # Lo  [37] MASARAM GONDI LETTER KA..MASARAM GONDI LETTER TRA
 11D6C..11D89  ; Consonant # Lo  [30] GUNJALA GONDI LETTER YA..GUNJALA GONDI LETTER SA
 11EE0..11EF1  ; Consonant # Lo  [18] MAKASAR LETTER KA..MAKASAR LETTER A
+11F12..11F33  ; Consonant # Lo  [34] KAWI LETTER KA..KAWI LETTER JNYA
 
 # ================================================
 
@@ -963,6 +977,7 @@ ABD2..ABDA    ; Consonant # Lo   [9] MEETEI MAYEK LETTER GOK..MEETEI MAYEK LETTE
 0D4E          ; Consonant_Preceding_Repha # Lo       MALAYALAM LETTER DOT REPH
 11941         ; Consonant_Preceding_Repha # Lo       DIVES AKURU INITIAL RA
 11D46         ; Consonant_Preceding_Repha # Lo       MASARAM GONDI REPHA
+11F02         ; Consonant_Preceding_Repha # Lo       KAWI SIGN REPHA
 
 # ================================================
 
@@ -1132,10 +1147,14 @@ ABEC          ; Tone_Mark # Mc       MEETEI MAYEK LUM IYEK
 # Indic_Syllabic_Category=Gemination_Mark
 
 # Gemination Mark (doubling of the preceding or following consonant)
+#
+# U+0A71 GURMUKHI ADDAK precedes the consonant it geminates, while the
+# others follow the consonant they geminate.
 
 # [Not derivable]
 
 0A71          ; Gemination_Mark # Mn       GURMUKHI ADDAK
+0AFB          ; Gemination_Mark # Mn       GUJARATI SIGN SHADDA
 11237         ; Gemination_Mark # Mn       KHOJKI SIGN SHADDA
 11A98         ; Gemination_Mark # Mn       SOYOMBO GEMINATION MARK
 
@@ -1149,7 +1168,8 @@ ABEC          ; Tone_Mark # Mc       MEETEI MAYEK LUM IYEK
 
 0951..0952    ; Cantillation_Mark # Mn   [2] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI STRESS SIGN ANUDATTA
 0A51          ; Cantillation_Mark # Mn       GURMUKHI SIGN UDAAT
-0AFA..0AFC    ; Cantillation_Mark # Mn   [3] GUJARATI SIGN SUKUN..GUJARATI SIGN MADDAH
+0AFA          ; Cantillation_Mark # Mn       GUJARATI SIGN SUKUN
+0AFC          ; Cantillation_Mark # Mn       GUJARATI SIGN MADDAH
 1CD0..1CD2    ; Cantillation_Mark # Mn   [3] VEDIC TONE KARSHANA..VEDIC TONE PRENKHA
 1CD4..1CE0    ; Cantillation_Mark # Mn  [13] VEDIC SIGN YAJURVEDIC MIDLINE SVARITA..VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA
 1CE1          ; Cantillation_Mark # Mc       VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA
@@ -1177,12 +1197,13 @@ A8E0..A8F1    ; Cantillation_Mark # Mn  [18] COMBINING DEVANAGARI DIGIT ZERO..CO
 # Indic_Syllabic_Category=Syllable_Modifier
 
 # Syllable Modifier (miscellaneous combining characters that modify
-# something in the orthographic syllable they succeed)
+# something in the orthographic syllable they succeed or appear in)
 
 # [Not derivable]
 
 00B2..00B3    ; Syllable_Modifier # No   [2] SUPERSCRIPT TWO..SUPERSCRIPT THREE
 09FE          ; Syllable_Modifier # Mn       BENGALI SANDHI MARK
+0ECE          ; Syllable_Modifier # Mn       LAO YAMAKKAN
 0F35          ; Syllable_Modifier # Mn       TIBETAN MARK NGAS BZUNG NYI ZLA
 0F37          ; Syllable_Modifier # Mn       TIBETAN MARK NGAS BZUNG SGOR RTAGS
 0FC6          ; Syllable_Modifier # Mn       TIBETAN SYMBOL PADMA GDAN
@@ -1304,14 +1325,20 @@ ABF0..ABF9    ; Number # Nd  [10] MEETEI MAYEK DIGIT ZERO..MEETEI MAYEK DIGIT NI
 11C5A..11C6C  ; Number # No  [19] BHAIKSUKI NUMBER ONE..BHAIKSUKI HUNDREDS UNIT MARK
 11D50..11D59  ; Number # Nd  [10] MASARAM GONDI DIGIT ZERO..MASARAM GONDI DIGIT NINE
 11DA0..11DA9  ; Number # Nd  [10] GUNJALA GONDI DIGIT ZERO..GUNJALA GONDI DIGIT NINE
+11F50..11F59  ; Number # Nd  [10] KAWI DIGIT ZERO..KAWI DIGIT NINE
 
 # ================================================
 
 # Indic_Syllabic_Category=Brahmi_Joining_Number
 
-# Brahmi Joining Number (similar to Number in that in can be used as
-# vowel-holders like Consonant_Placeholder, but may also be joined by
-# a Number_Joiner of the same script, e.g. in Brahmi)
+# Brahmi Joining Number (may be joined by a Number_Joiner of the same
+# script, e.g. in Brahmi)
+#
+# Note: These are different from Numbers, in the way that there is no known
+# evidence of Brahmi Joining Numbers taking vowels or subjoined consonants. 
+# Until such evidence is found, implementations may assume that Brahmi
+# Joining Numbers only participate in shaping with other Brahmi Joining
+# Numbers.
 
 # [Not derivable]
 
index 298d9df..5e09f62 100644 (file)
@@ -1,14 +1,14 @@
-# Jamo-14.0.0.txt
-# Date: 2021-03-16, 21:43:00 GMT [KW, LI]
-# © 2021 Unicode®, Inc.
-# For terms of use, see http://www.unicode.org/terms_of_use.html
+# Jamo-15.0.0.txt
+# Date: 2022-05-03, 18:52:00 GMT [KW, LI]
+# © 2022 Unicode®, Inc.
+# For terms of use, see https://www.unicode.org/terms_of_use.html
 #
 # Unicode Character Database
-# For documentation, see http://www.unicode.org/reports/tr44/
+# For documentation, see https://www.unicode.org/reports/tr44/
 #
 # This file defines the Jamo_Short_Name property.
 #
-# See Section 3.12 of The Unicode Standard, Version 14.0
+# See Section 3.12 of The Unicode Standard, Version 15.0
 # for more information.
 #
 # Each line contains two fields, separated by a semicolon.
index aa5985b..8243333 100644 (file)
@@ -1,6 +1,6 @@
-# LineBreak-14.0.0.txt
-# Date: 2021-07-06, 09:58:55 GMT [KW, LI]
-# © 2021 Unicode®, Inc.
+# LineBreak-15.0.0.txt
+# Date: 2022-07-28, 09:20:42 GMT [KW, LI]
+# © 2022 Unicode®, Inc.
 # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
 # For terms of use, see https://www.unicode.org/terms_of_use.html
 #
 0CE2..0CE3;CM     # Mn     [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL
 0CE6..0CEF;NU     # Nd    [10] KANNADA DIGIT ZERO..KANNADA DIGIT NINE
 0CF1..0CF2;AL     # Lo     [2] KANNADA SIGN JIHVAMULIYA..KANNADA SIGN UPADHMANIYA
+0CF3;CM           # Mc         KANNADA SIGN COMBINING ANUSVARA ABOVE RIGHT
 0D00..0D01;CM     # Mn     [2] MALAYALAM SIGN COMBINING ANUSVARA ABOVE..MALAYALAM SIGN CANDRABINDU
 0D02..0D03;CM     # Mc     [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA
 0D04..0D0C;AL     # Lo     [9] MALAYALAM LETTER VEDIC ANUSVARA..MALAYALAM LETTER VOCALIC L
 0EBD;SA           # Lo         LAO SEMIVOWEL SIGN NYO
 0EC0..0EC4;SA     # Lo     [5] LAO VOWEL SIGN E..LAO VOWEL SIGN AI
 0EC6;SA           # Lm         LAO KO LA
-0EC8..0ECD;SA     # Mn     [6] LAO TONE MAI EK..LAO NIGGAHITA
+0EC8..0ECE;SA     # Mn     [7] LAO TONE MAI EK..LAO YAMAKKAN
 0ED0..0ED9;NU     # Nd    [10] LAO DIGIT ZERO..LAO DIGIT NINE
 0EDC..0EDF;SA     # Lo     [4] LAO HO NO..LAO LETTER KHMU NYO
 0F00;AL           # Lo         TIBETAN SYLLABLE OM
 1D79..1D7F;AL     # Ll     [7] LATIN SMALL LETTER INSULAR G..LATIN SMALL LETTER UPSILON WITH STROKE
 1D80..1D9A;AL     # Ll    [27] LATIN SMALL LETTER B WITH PALATAL HOOK..LATIN SMALL LETTER EZH WITH RETROFLEX HOOK
 1D9B..1DBF;AL     # Lm    [37] MODIFIER LETTER SMALL TURNED ALPHA..MODIFIER LETTER SMALL THETA
-1DC0..1DFF;CM     # Mn    [64] COMBINING DOTTED GRAVE ACCENT..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW
+1DC0..1DCC;CM     # Mn    [13] COMBINING DOTTED GRAVE ACCENT..COMBINING MACRON-BREVE
+1DCD;GL           # Mn         COMBINING DOUBLE CIRCUMFLEX ABOVE
+1DCE..1DFB;CM     # Mn    [46] COMBINING OGONEK ABOVE..COMBINING DELETION MARK
+1DFC;GL           # Mn         COMBINING DOUBLE INVERTED BREVE BELOW
+1DFD..1DFF;CM     # Mn     [3] COMBINING ALMOST EQUAL TO BELOW..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW
 1E00..1EFF;AL     # L&   [256] LATIN CAPITAL LETTER A WITH RING BELOW..LATIN SMALL LETTER Y WITH LOOP
 1F00..1F15;AL     # L&    [22] GREEK SMALL LETTER ALPHA WITH PSILI..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA
 1F18..1F1D;AL     # Lu     [6] GREEK CAPITAL LETTER EPSILON WITH PSILI..GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA
 2054;AL           # Pc         INVERTED UNDERTIE
 2055;AL           # Po         FLOWER PUNCTUATION MARK
 2056;BA           # Po         THREE DOT PUNCTUATION
-2057;AL           # Po         QUADRUPLE PRIME
+2057;PO           # Po         QUADRUPLE PRIME
 2058..205B;BA     # Po     [4] FOUR DOT PUNCTUATION..FOUR DOT MARK
 205C;AL           # Po         DOTTED CROSS
 205D..205E;BA     # Po     [2] TRICOLON..VERTICAL FOUR DOTS
@@ -2793,6 +2798,7 @@ FFFD;AI           # So         REPLACEMENT CHARACTER
 10EAB..10EAC;CM   # Mn     [2] YEZIDI COMBINING HAMZA MARK..YEZIDI COMBINING MADDA MARK
 10EAD;BA          # Pd         YEZIDI HYPHENATION MARK
 10EB0..10EB1;AL   # Lo     [2] YEZIDI LETTER LAM WITH DOT ABOVE..YEZIDI LETTER YOT WITH CIRCUMFLEX ABOVE
+10EFD..10EFF;CM   # Mn     [3] ARABIC SMALL LOW WORD SAKTA..ARABIC SMALL LOW WORD MADDA
 10F00..10F1C;AL   # Lo    [29] OLD SOGDIAN LETTER ALEPH..OLD SOGDIAN LETTER FINAL TAW WITH VERTICAL TAIL
 10F1D..10F26;AL   # No    [10] OLD SOGDIAN NUMBER ONE..OLD SOGDIAN FRACTION ONE HALF
 10F27;AL          # Lo         OLD SOGDIAN LIGATURE AYIN-DALETH
@@ -2882,6 +2888,8 @@ FFFD;AI           # So         REPLACEMENT CHARACTER
 1123B..1123C;BA   # Po     [2] KHOJKI SECTION MARK..KHOJKI DOUBLE SECTION MARK
 1123D;AL          # Po         KHOJKI ABBREVIATION SIGN
 1123E;CM          # Mn         KHOJKI SIGN SUKUN
+1123F..11240;AL   # Lo     [2] KHOJKI LETTER QA..KHOJKI LETTER SHORT I
+11241;CM          # Mn         KHOJKI VOWEL SIGN VOCALIC R
 11280..11286;AL   # Lo     [7] MULTANI LETTER A..MULTANI LETTER GA
 11288;AL          # Lo         MULTANI LETTER GHA
 1128A..1128D;AL   # Lo     [4] MULTANI LETTER CA..MULTANI LETTER JJA
@@ -3055,6 +3063,7 @@ FFFD;AI           # So         REPLACEMENT CHARACTER
 11AA1..11AA2;BA   # Po     [2] SOYOMBO TERMINAL MARK-1..SOYOMBO TERMINAL MARK-2
 11AB0..11ABF;AL   # Lo    [16] CANADIAN SYLLABICS NATTILIK HI..CANADIAN SYLLABICS SPA
 11AC0..11AF8;AL   # Lo    [57] PAU CIN HAU LETTER PA..PAU CIN HAU GLOTTAL STOP FINAL
+11B00..11B09;BB   # Po    [10] DEVANAGARI HEAD MARK..DEVANAGARI SIGN MINDU
 11C00..11C08;AL   # Lo     [9] BHAIKSUKI LETTER A..BHAIKSUKI LETTER VOCALIC L
 11C0A..11C2E;AL   # Lo    [37] BHAIKSUKI LETTER E..BHAIKSUKI LETTER HA
 11C2F;CM          # Mc         BHAIKSUKI VOWEL SIGN AA
@@ -3101,6 +3110,20 @@ FFFD;AI           # So         REPLACEMENT CHARACTER
 11EF3..11EF4;CM   # Mn     [2] MAKASAR VOWEL SIGN I..MAKASAR VOWEL SIGN U
 11EF5..11EF6;CM   # Mc     [2] MAKASAR VOWEL SIGN E..MAKASAR VOWEL SIGN O
 11EF7..11EF8;AL   # Po     [2] MAKASAR PASSIMBANG..MAKASAR END OF SECTION
+11F00..11F01;CM   # Mn     [2] KAWI SIGN CANDRABINDU..KAWI SIGN ANUSVARA
+11F02;AL          # Lo         KAWI SIGN REPHA
+11F03;CM          # Mc         KAWI SIGN VISARGA
+11F04..11F10;AL   # Lo    [13] KAWI LETTER A..KAWI LETTER O
+11F12..11F33;AL   # Lo    [34] KAWI LETTER KA..KAWI LETTER JNYA
+11F34..11F35;CM   # Mc     [2] KAWI VOWEL SIGN AA..KAWI VOWEL SIGN ALTERNATE AA
+11F36..11F3A;CM   # Mn     [5] KAWI VOWEL SIGN I..KAWI VOWEL SIGN VOCALIC R
+11F3E..11F3F;CM   # Mc     [2] KAWI VOWEL SIGN E..KAWI VOWEL SIGN AI
+11F40;CM          # Mn         KAWI VOWEL SIGN EU
+11F41;CM          # Mc         KAWI SIGN KILLER
+11F42;CM          # Mn         KAWI CONJOINER
+11F43..11F44;BA   # Po     [2] KAWI DANDA..KAWI DOUBLE DANDA
+11F45..11F4F;ID   # Po    [11] KAWI PUNCTUATION SECTION MARKER..KAWI PUNCTUATION CLOSING SPIRAL
+11F50..11F59;NU   # Nd    [10] KAWI DIGIT ZERO..KAWI DIGIT NINE
 11FB0;AL          # Lo         LISU LETTER YHA
 11FC0..11FD4;AL   # No    [21] TAMIL FRACTION ONE THREE-HUNDRED-AND-TWENTIETH..TAMIL FRACTION DOWNSCALING FACTOR KIIZH
 11FD5..11FDC;AL   # So     [8] TAMIL SIGN NEL..TAMIL SIGN MUKKURUNI
@@ -3126,10 +3149,18 @@ FFFD;AI           # So         REPLACEMENT CHARACTER
 1328A..13378;AL   # Lo   [239] EGYPTIAN HIEROGLYPH O037..EGYPTIAN HIEROGLYPH V011
 13379;OP          # Lo         EGYPTIAN HIEROGLYPH V011A
 1337A..1337B;CL   # Lo     [2] EGYPTIAN HIEROGLYPH V011B..EGYPTIAN HIEROGLYPH V011C
-1337C..1342E;AL   # Lo   [179] EGYPTIAN HIEROGLYPH V012..EGYPTIAN HIEROGLYPH AA032
+1337C..1342F;AL   # Lo   [180] EGYPTIAN HIEROGLYPH V012..EGYPTIAN HIEROGLYPH V011D
 13430..13436;GL   # Cf     [7] EGYPTIAN HIEROGLYPH VERTICAL JOINER..EGYPTIAN HIEROGLYPH OVERLAY MIDDLE
 13437;OP          # Cf         EGYPTIAN HIEROGLYPH BEGIN SEGMENT
 13438;CL          # Cf         EGYPTIAN HIEROGLYPH END SEGMENT
+13439..1343B;GL   # Cf     [3] EGYPTIAN HIEROGLYPH INSERT AT MIDDLE..EGYPTIAN HIEROGLYPH INSERT AT BOTTOM
+1343C;OP          # Cf         EGYPTIAN HIEROGLYPH BEGIN ENCLOSURE
+1343D;CL          # Cf         EGYPTIAN HIEROGLYPH END ENCLOSURE
+1343E;OP          # Cf         EGYPTIAN HIEROGLYPH BEGIN WALLED ENCLOSURE
+1343F;CL          # Cf         EGYPTIAN HIEROGLYPH END WALLED ENCLOSURE
+13440;CM          # Mn         EGYPTIAN HIEROGLYPH MIRROR HORIZONTALLY
+13441..13446;AL   # Lo     [6] EGYPTIAN HIEROGLYPH FULL BLANK..EGYPTIAN HIEROGLYPH WIDE LOST SIGN
+13447..13455;CM   # Mn    [15] EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP START..EGYPTIAN HIEROGLYPH MODIFIER DAMAGED
 14400..145CD;AL   # Lo   [462] ANATOLIAN HIEROGLYPH A001..ANATOLIAN HIEROGLYPH A409
 145CE;OP          # Lo         ANATOLIAN HIEROGLYPH A410 BEGIN LOGOGRAM MARK
 145CF;CL          # Lo         ANATOLIAN HIEROGLYPH A410A END LOGOGRAM MARK
@@ -3179,7 +3210,9 @@ FFFD;AI           # So         REPLACEMENT CHARACTER
 1AFFD..1AFFE;AL   # Lm     [2] KATAKANA LETTER MINNAN NASALIZED TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-8
 1B000..1B0FF;ID   # Lo   [256] KATAKANA LETTER ARCHAIC E..HENTAIGANA LETTER RE-2
 1B100..1B122;ID   # Lo    [35] HENTAIGANA LETTER RE-3..KATAKANA LETTER ARCHAIC WU
+1B132;CJ          # Lo         HIRAGANA LETTER SMALL KO
 1B150..1B152;CJ   # Lo     [3] HIRAGANA LETTER SMALL WI..HIRAGANA LETTER SMALL WO
+1B155;CJ          # Lo         KATAKANA LETTER SMALL KO
 1B164..1B167;CJ   # Lo     [4] KATAKANA LETTER SMALL WI..KATAKANA LETTER SMALL N
 1B170..1B2FB;ID   # Lo   [396] NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB
 1BC00..1BC6A;AL   # Lo   [107] DUPLOYAN LETTER H..DUPLOYAN LETTER VOCALIC M
@@ -3210,6 +3243,7 @@ FFFD;AI           # So         REPLACEMENT CHARACTER
 1D200..1D241;AL   # So    [66] GREEK VOCAL NOTATION SYMBOL-1..GREEK INSTRUMENTAL NOTATION SYMBOL-54
 1D242..1D244;CM   # Mn     [3] COMBINING GREEK MUSICAL TRISEME..COMBINING GREEK MUSICAL PENTASEME
 1D245;AL          # So         GREEK MUSICAL LEIMMA
+1D2C0..1D2D3;AL   # No    [20] KAKTOVIK NUMERAL ZERO..KAKTOVIK NUMERAL NINETEEN
 1D2E0..1D2F3;AL   # No    [20] MAYAN NUMERAL ZERO..MAYAN NUMERAL NINETEEN
 1D300..1D356;AL   # So    [87] MONOGRAM FOR EARTH..TETRAGRAM FOR FOSTERING
 1D360..1D378;AL   # No    [25] COUNTING ROD UNIT DIGIT ONE..TALLY MARK FIVE
@@ -3270,11 +3304,14 @@ FFFD;AI           # So         REPLACEMENT CHARACTER
 1DF00..1DF09;AL   # Ll    [10] LATIN SMALL LETTER FENG DIGRAPH WITH TRILL..LATIN SMALL LETTER T WITH HOOK AND RETROFLEX HOOK
 1DF0A;AL          # Lo         LATIN LETTER RETROFLEX CLICK WITH RETROFLEX HOOK
 1DF0B..1DF1E;AL   # Ll    [20] LATIN SMALL LETTER ESH WITH DOUBLE BAR..LATIN SMALL LETTER S WITH CURL
+1DF25..1DF2A;AL   # Ll     [6] LATIN SMALL LETTER D WITH MID-HEIGHT LEFT HOOK..LATIN SMALL LETTER T WITH MID-HEIGHT LEFT HOOK
 1E000..1E006;CM   # Mn     [7] COMBINING GLAGOLITIC LETTER AZU..COMBINING GLAGOLITIC LETTER ZHIVETE
 1E008..1E018;CM   # Mn    [17] COMBINING GLAGOLITIC LETTER ZEMLJA..COMBINING GLAGOLITIC LETTER HERU
 1E01B..1E021;CM   # Mn     [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI
 1E023..1E024;CM   # Mn     [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS
 1E026..1E02A;CM   # Mn     [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA
+1E030..1E06D;AL   # Lm    [62] MODIFIER LETTER CYRILLIC SMALL A..MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE
+1E08F;CM          # Mn         COMBINING CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
 1E100..1E12C;AL   # Lo    [45] NYIAKENG PUACHUE HMONG LETTER MA..NYIAKENG PUACHUE HMONG LETTER W
 1E130..1E136;CM   # Mn     [7] NYIAKENG PUACHUE HMONG TONE-B..NYIAKENG PUACHUE HMONG TONE-D
 1E137..1E13D;AL   # Lm     [7] NYIAKENG PUACHUE HMONG SIGN FOR PERSON..NYIAKENG PUACHUE HMONG SYLLABLE LENGTHENER
@@ -3287,6 +3324,10 @@ FFFD;AI           # So         REPLACEMENT CHARACTER
 1E2EC..1E2EF;CM   # Mn     [4] WANCHO TONE TUP..WANCHO TONE KOINI
 1E2F0..1E2F9;NU   # Nd    [10] WANCHO DIGIT ZERO..WANCHO DIGIT NINE
 1E2FF;PR          # Sc         WANCHO NGUN SIGN
+1E4D0..1E4EA;AL   # Lo    [27] NAG MUNDARI LETTER O..NAG MUNDARI LETTER ELL
+1E4EB;AL          # Lm         NAG MUNDARI SIGN OJOD
+1E4EC..1E4EF;CM   # Mn     [4] NAG MUNDARI SIGN MUHOR..NAG MUNDARI SIGN SUTUH
+1E4F0..1E4F9;NU   # Nd    [10] NAG MUNDARI DIGIT ZERO..NAG MUNDARI DIGIT NINE
 1E7E0..1E7E6;AL   # Lo     [7] ETHIOPIC SYLLABLE HHYA..ETHIOPIC SYLLABLE HHYO
 1E7E8..1E7EB;AL   # Lo     [4] ETHIOPIC SYLLABLE GURAGE HHWA..ETHIOPIC SYLLABLE HHWE
 1E7ED..1E7EE;AL   # Lo     [2] ETHIOPIC SYLLABLE GURAGE MWI..ETHIOPIC SYLLABLE GURAGE MWEE
@@ -3454,16 +3495,18 @@ FFFD;AI           # So         REPLACEMENT CHARACTER
 1F6C1..1F6CB;ID   # So    [11] BATHTUB..COUCH AND LAMP
 1F6CC;EB          # So         SLEEPING ACCOMMODATION
 1F6CD..1F6D7;ID   # So    [11] SHOPPING BAGS..ELEVATOR
-1F6D8..1F6DC;ID   # Cn     [5] <reserved-1F6D8>..<reserved-1F6DC>
-1F6DD..1F6EC;ID   # So    [16] PLAYGROUND SLIDE..AIRPLANE ARRIVING
+1F6D8..1F6DB;ID   # Cn     [4] <reserved-1F6D8>..<reserved-1F6DB>
+1F6DC..1F6EC;ID   # So    [17] WIRELESS..AIRPLANE ARRIVING
 1F6ED..1F6EF;ID   # Cn     [3] <reserved-1F6ED>..<reserved-1F6EF>
 1F6F0..1F6FC;ID   # So    [13] SATELLITE..ROLLER SKATE
 1F6FD..1F6FF;ID   # Cn     [3] <reserved-1F6FD>..<reserved-1F6FF>
 1F700..1F773;AL   # So   [116] ALCHEMICAL SYMBOL FOR QUINTESSENCE..ALCHEMICAL SYMBOL FOR HALF OUNCE
-1F774..1F77F;ID   # Cn    [12] <reserved-1F774>..<reserved-1F77F>
+1F774..1F776;ID   # So     [3] LOT OF FORTUNE..LUNAR ECLIPSE
+1F777..1F77A;ID   # Cn     [4] <reserved-1F777>..<reserved-1F77A>
+1F77B..1F77F;ID   # So     [5] HAUMEA..ORCUS
 1F780..1F7D4;AL   # So    [85] BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE..HEAVY TWELVE POINTED PINWHEEL STAR
-1F7D5..1F7D8;ID   # So     [4] CIRCLED TRIANGLE..NEGATIVE CIRCLED SQUARE
-1F7D9..1F7DF;ID   # Cn     [7] <reserved-1F7D9>..<reserved-1F7DF>
+1F7D5..1F7D9;ID   # So     [5] CIRCLED TRIANGLE..NINE POINTED WHITE STAR
+1F7DA..1F7DF;ID   # Cn     [6] <reserved-1F7DA>..<reserved-1F7DF>
 1F7E0..1F7EB;ID   # So    [12] LARGE ORANGE CIRCLE..LARGE BROWN SQUARE
 1F7EC..1F7EF;ID   # Cn     [4] <reserved-1F7EC>..<reserved-1F7EF>
 1F7F0;ID          # So         HEAVY EQUALS SIGN
@@ -3509,33 +3552,29 @@ FFFD;AI           # So         REPLACEMENT CHARACTER
 1FA54..1FA5F;ID   # Cn    [12] <reserved-1FA54>..<reserved-1FA5F>
 1FA60..1FA6D;ID   # So    [14] XIANGQI RED GENERAL..XIANGQI BLACK SOLDIER
 1FA6E..1FA6F;ID   # Cn     [2] <reserved-1FA6E>..<reserved-1FA6F>
-1FA70..1FA74;ID   # So     [5] BALLET SHOES..THONG SANDAL
-1FA75..1FA77;ID   # Cn     [3] <reserved-1FA75>..<reserved-1FA77>
-1FA78..1FA7C;ID   # So     [5] DROP OF BLOOD..CRUTCH
+1FA70..1FA7C;ID   # So    [13] BALLET SHOES..CRUTCH
 1FA7D..1FA7F;ID   # Cn     [3] <reserved-1FA7D>..<reserved-1FA7F>
-1FA80..1FA86;ID   # So     [7] YO-YO..NESTING DOLLS
-1FA87..1FA8F;ID   # Cn     [9] <reserved-1FA87>..<reserved-1FA8F>
-1FA90..1FAAC;ID   # So    [29] RINGED PLANET..HAMSA
-1FAAD..1FAAF;ID   # Cn     [3] <reserved-1FAAD>..<reserved-1FAAF>
-1FAB0..1FABA;ID   # So    [11] FLY..NEST WITH EGGS
-1FABB..1FABF;ID   # Cn     [5] <reserved-1FABB>..<reserved-1FABF>
-1FAC0..1FAC2;ID   # So     [3] ANATOMICAL HEART..PEOPLE HUGGING
+1FA80..1FA88;ID   # So     [9] YO-YO..FLUTE
+1FA89..1FA8F;ID   # Cn     [7] <reserved-1FA89>..<reserved-1FA8F>
+1FA90..1FABD;ID   # So    [46] RINGED PLANET..WING
+1FABE;ID          # Cn         <reserved-1FABE>
+1FABF..1FAC2;ID   # So     [4] GOOSE..PEOPLE HUGGING
 1FAC3..1FAC5;EB   # So     [3] PREGNANT MAN..PERSON WITH CROWN
-1FAC6..1FACF;ID   # Cn    [10] <reserved-1FAC6>..<reserved-1FACF>
-1FAD0..1FAD9;ID   # So    [10] BLUEBERRIES..JAR
-1FADA..1FADF;ID   # Cn     [6] <reserved-1FADA>..<reserved-1FADF>
-1FAE0..1FAE7;ID   # So     [8] MELTING FACE..BUBBLES
-1FAE8..1FAEF;ID   # Cn     [8] <reserved-1FAE8>..<reserved-1FAEF>
-1FAF0..1FAF6;EB   # So     [7] HAND WITH INDEX FINGER AND THUMB CROSSED..HEART HANDS
-1FAF7..1FAFF;ID   # Cn     [9] <reserved-1FAF7>..<reserved-1FAFF>
+1FAC6..1FACD;ID   # Cn     [8] <reserved-1FAC6>..<reserved-1FACD>
+1FACE..1FADB;ID   # So    [14] MOOSE..PEA POD
+1FADC..1FADF;ID   # Cn     [4] <reserved-1FADC>..<reserved-1FADF>
+1FAE0..1FAE8;ID   # So     [9] MELTING FACE..SHAKING FACE
+1FAE9..1FAEF;ID   # Cn     [7] <reserved-1FAE9>..<reserved-1FAEF>
+1FAF0..1FAF8;EB   # So     [9] HAND WITH INDEX FINGER AND THUMB CROSSED..RIGHTWARDS PUSHING HAND
+1FAF9..1FAFF;ID   # Cn     [7] <reserved-1FAF9>..<reserved-1FAFF>
 1FB00..1FB92;AL   # So   [147] BLOCK SEXTANT-1..UPPER HALF INVERSE MEDIUM SHADE AND LOWER HALF BLOCK
 1FB94..1FBCA;AL   # So    [55] LEFT HALF INVERSE MEDIUM SHADE AND RIGHT HALF BLOCK..WHITE UP-POINTING CHEVRON
 1FBF0..1FBF9;NU   # Nd    [10] SEGMENTED DIGIT ZERO..SEGMENTED DIGIT NINE
 1FC00..1FFFD;ID   # Cn  [1022] <reserved-1FC00>..<reserved-1FFFD>
 20000..2A6DF;ID   # Lo [42720] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6DF
 2A6E0..2A6FF;ID   # Cn    [32] <reserved-2A6E0>..<reserved-2A6FF>
-2A700..2B738;ID   # Lo  [4153] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B738
-2B739..2B73F;ID   # Cn     [7] <reserved-2B739>..<reserved-2B73F>
+2A700..2B739;ID   # Lo  [4154] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B739
+2B73A..2B73F;ID   # Cn     [6] <reserved-2B73A>..<reserved-2B73F>
 2B740..2B81D;ID   # Lo   [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D
 2B81E..2B81F;ID   # Cn     [2] <reserved-2B81E>..<reserved-2B81F>
 2B820..2CEA1;ID   # Lo  [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1
@@ -3546,7 +3585,9 @@ FFFD;AI           # So         REPLACEMENT CHARACTER
 2FA1E..2FA1F;ID   # Cn     [2] <reserved-2FA1E>..<reserved-2FA1F>
 2FA20..2FFFD;ID   # Cn  [1502] <reserved-2FA20>..<reserved-2FFFD>
 30000..3134A;ID   # Lo  [4939] CJK UNIFIED IDEOGRAPH-30000..CJK UNIFIED IDEOGRAPH-3134A
-3134B..3FFFD;ID   # Cn [60595] <reserved-3134B>..<reserved-3FFFD>
+3134B..3134F;ID   # Cn     [5] <reserved-3134B>..<reserved-3134F>
+31350..323AF;ID   # Lo  [4192] CJK UNIFIED IDEOGRAPH-31350..CJK UNIFIED IDEOGRAPH-323AF
+323B0..3FFFD;ID   # Cn [56398] <reserved-323B0>..<reserved-3FFFD>
 E0001;CM          # Cf         LANGUAGE TAG
 E0020..E007F;CM   # Cf    [96] TAG SPACE..CANCEL TAG
 E0100..E01EF;CM   # Mn   [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256
index 8519284..db3a863 100644 (file)
@@ -1,10 +1,10 @@
-# NameAliases-14.0.0.txt
-# Date: 2020-10-21, 22:28:00 GMT [KW, LI]
-# © 2020 Unicode®, Inc.
-# For terms of use, see http://www.unicode.org/terms_of_use.html
+# NameAliases-15.0.0.txt
+# Date: 2022-07-26, 20:13:00 GMT [KW]
+# © 2022 Unicode®, Inc.
+# For terms of use, see https://www.unicode.org/terms_of_use.html
 #
 # Unicode Character Database
-# For documentation, see http://www.unicode.org/reports/tr44/
+# For documentation, see https://www.unicode.org/reports/tr44/
 #
 # This file is a normative contributory data file in the
 # Unicode Character Database.
@@ -40,7 +40,7 @@
 # control codes (which for historical reasons have no Unicode character name)
 # or for format characters.
 #
-# For documentation, see NamesList.html and http://www.unicode.org/reports/tr44/
+# For documentation, see NamesList.html and https://www.unicode.org/reports/tr44/
 #
 # FORMAT
 #
 0018;CAN;abbreviation
 0019;END OF MEDIUM;control
 0019;EOM;abbreviation
+0019;EM;abbreviation
 001A;SUBSTITUTE;control
 001A;SUB;abbreviation
 001B;ESCAPE;control
 # (and corresponding abbreviations) for these code
 # points are included here because these names leaked
 # out from the draft documents and were published in
-# at least one RFC whose names for code points was
+# at least one RFC whose names for code points were
 # implemented in Perl regex expressions.
 
 0080;PADDING CHARACTER;figment
 01A2;LATIN CAPITAL LETTER GHA;correction
 01A3;LATIN SMALL LETTER GHA;correction
 034F;CGJ;abbreviation
+0616;ARABIC SMALL HIGH LIGATURE ALEF WITH YEH BARREE;correction
 061C;ALM;abbreviation
 0709;SYRIAC SUBLINEAR COLON SKEWED LEFT;correction
 0CDE;KANNADA LETTER LLLA;correction
 180D;FVS3;abbreviation
 180E;MVS;abbreviation
 180F;FVS4;abbreviation
+1BBD;SUNDANESE LETTER ARCHAIC I;correction
 200B;ZWSP;abbreviation
 200C;ZWNJ;abbreviation
 200D;ZWJ;abbreviation
index fa05c6a..273eeea 100644 (file)
@@ -1,5 +1,5 @@
-# NamedSequences-14.0.0.txt
-# Date: 2021-08-03, 23:04:00 GMT [KW]
+# NamedSequences-15.0.0.txt
+# Date: 2021-12-07, 17:18:00 GMT [KW]
 # © 2021 Unicode®, Inc.
 # For terms of use, see https://www.unicode.org/terms_of_use.html
 #
index 6c74798..34a1dce 100644 (file)
@@ -1,5 +1,5 @@
-# NamedSequencesProv-14.0.0.txt
-# Date: 2021-08-03, 23:04:00 GMT [KW]
+# NamedSequencesProv-15.0.0.txt
+# Date: 2021-12-07, 17:17:00 GMT [KW]
 # © 2021 Unicode®, Inc.
 # For terms of use, see https://www.unicode.org/terms_of_use.html
 #
index a5618d9..5442db5 100644 (file)
@@ -1,14 +1,14 @@
 ; charset=UTF-8
-@@@    The Unicode Standard 14.0.0
-@@@+   U14M210804.lst
-       Unicode 14.0.0 final names list.
+@@@    The Unicode Standard 15.0.0
+@@@+   U15M220815.lst
+       Unicode 15.0.0 final names list.
        This file is semi-automatically derived from UnicodeData.txt and
        a set of manually created annotations using a script to select
        or suppress information from the data file. The rules used
        for this process are aimed at readability for the human reader,
        at the expense of some details; therefore, this file should not
        be parsed for machine-readable information.
-@+             © 2021 Unicode®, Inc.
+@+             © 2022 Unicode®, Inc.
        For terms of use, see https://www.unicode.org/terms_of_use.html
 @@     0000    C0 Controls and Basic Latin (Basic Latin)       007F
 @@+
        x (stenographic full stop - 2E3C)
        x (ideographic full stop - 3002)
 002F   SOLIDUS
-       = slash,forward slash, virgule
+       = slash, forward slash, virgule
        x (combining long solidus overlay - 0338)
        x (fraction slash - 2044)
        x (division slash - 2215)
 @+             These are obsolete letters attested in a 19th century grammar of Komi.
 052A   CYRILLIC CAPITAL LETTER DZZHE
 052B   CYRILLIC SMALL LETTER DZZHE
-       * also used for Ossetian until 1924
+@+     * also used for Ossetian until 1924
 052C   CYRILLIC CAPITAL LETTER DCHE
 052D   CYRILLIC SMALL LETTER DCHE
 @              Khanty letters
        * should not be confused with the small TAH sign used as a diacritic for some letters such as 0679
 @              Extended Arabic mark
 0616   ARABIC SMALL HIGH LIGATURE ALEF WITH LAM WITH YEH
+       % ARABIC SMALL HIGH LIGATURE ALEF WITH YEH BARREE
        * early Persian
 @              Quranic annotation signs
 0617   ARABIC SMALL HIGH ZAIN
        * Kazakh, Jawi
        * forms digraphs
 @              Digraphic letters for Kazakh
-@+             Use of these characters is discouraged. They were encoded for Kazakh digraphs, but their decompositions do not reflect the preferred order of representation.
+@+             These characters were encoded for Kazakh digraphs, but their compatibility decompositions do not reflect the preferred order of representation. Accordingly, the representation of these Kazakh digraphs should instead use the preferred two-character spellings with the correct order of elements.
 0675   ARABIC LETTER HIGH HAMZA ALEF
+       * preferred spelling is 0674 0627
        # 0627 0674
 0676   ARABIC LETTER HIGH HAMZA WAW
+       * preferred spelling is 0674 0648
        # 0648 0674
 0677   ARABIC LETTER U WITH HAMZA ABOVE
+       * preferred spelling is 0674 06C7
        # 06C7 0674
 0678   ARABIC LETTER HIGH HAMZA YEH
+       * preferred spelling is 0674 0649
        # 064A 0674
 @              Extended Arabic letters
 0679   ARABIC LETTER TTEH
        * Uyghur, Kazakh, Moroccan Arabic, early Jawi, early Persian, ...
 06AE   ARABIC LETTER KAF WITH THREE DOTS BELOW
        * Berber, early Persian
-       * Pegon alternative for 068A
+       * Pegon alternative for 08B4
 06AF   ARABIC LETTER GAF
        * Persian, Urdu, ...
 06B0   ARABIC LETTER GAF WITH RING
 08DB   ARABIC SMALL HIGH WORD AS-SAJDA
 08DC   ARABIC SMALL HIGH WORD AN-NISF
 08DD   ARABIC SMALL HIGH WORD SAKTA
+       x (arabic small low word sakta - 10EFD)
 08DE   ARABIC SMALL HIGH WORD QIF
 08DF   ARABIC SMALL HIGH WORD WAQFA
 08E0   ARABIC SMALL HIGH FOOTNOTE MARKER
 0C80   KANNADA SIGN SPACING CANDRABINDU
 0C81   KANNADA SIGN CANDRABINDU
 0C82   KANNADA SIGN ANUSVARA
+       * used in Konkani, Havyaka Kannada (Havigannada) and Awadhi texts to indicate regular anusvara
 0C83   KANNADA SIGN VISARGA
 0C84   KANNADA SIGN SIDDHAM
        = siddhirastu
        x (vedic sign jihvamuliya - 1CF5)
 0CF2   KANNADA SIGN UPADHMANIYA
        x (vedic sign upadhmaniya - 1CF6)
+0CF3   KANNADA SIGN COMBINING ANUSVARA ABOVE RIGHT
+       * used in Konkani, Havyaka Kannada (Havigannada) and Awadhi texts to indicate anunāsikā
 @@     0D00    Malayalam       0D7F
 @              Various signs
 0D00   MALAYALAM SIGN COMBINING ANUSVARA ABOVE
        = nikkhahit
        * final nasal
 0E4E   THAI CHARACTER YAMAKKAN
+       x (lao yamakkan - 0ECE)
 0E4F   THAI CHARACTER FONGMAN
        * used as a bullet
        x (khmer sign phnaek muan - 17D9)
 0ECC   LAO CANCELLATION MARK
 0ECD   LAO NIGGAHITA
        * final nasal or long o vowel
+0ECE   LAO YAMAKKAN
+       * marks a consonant that is simultaneously a part of two consonant clusters in Pali text
+       x (thai character yamakkan - 0E4E)
 @              Digits
 0ED0   LAO DIGIT ZERO
 0ED1   LAO DIGIT ONE
 19AA   NEW TAI LUE LETTER HIGH SUA
 19AB   NEW TAI LUE LETTER LOW SUA
        * a labialized consonant cluster
-@              Vowel signs
+@              Vowels
 19B0   NEW TAI LUE VOWEL SIGN VOWEL SHORTENER
 19B1   NEW TAI LUE VOWEL SIGN AA
 19B2   NEW TAI LUE VOWEL SIGN II
 19B3   NEW TAI LUE VOWEL SIGN U
 19B4   NEW TAI LUE VOWEL SIGN UU
 19B5   NEW TAI LUE VOWEL SIGN E
+       * precedes consonant in visual order
 19B6   NEW TAI LUE VOWEL SIGN AE
+       * precedes consonant in visual order
 19B7   NEW TAI LUE VOWEL SIGN O
+       * precedes consonant in visual order
 19B8   NEW TAI LUE VOWEL SIGN OA
 19B9   NEW TAI LUE VOWEL SIGN UE
 19BA   NEW TAI LUE VOWEL SIGN AY
+       * precedes consonant in visual order
 19BB   NEW TAI LUE VOWEL SIGN AAY
 19BC   NEW TAI LUE VOWEL SIGN UY
 19BD   NEW TAI LUE VOWEL SIGN OY
 1BB9   SUNDANESE DIGIT NINE
 @              Sign
 1BBA   SUNDANESE AVAGRAHA
+       = gemination mark
 @              Historic letters
 1BBB   SUNDANESE LETTER REU
        * vocalic r
 1BBC   SUNDANESE LETTER LEU
        * vocalic l
 1BBD   SUNDANESE LETTER BHA
+       % SUNDANESE LETTER ARCHAIC I
+       * character was originally misidentified, so its name is a misnomer
 1BBE   SUNDANESE LETTER FINAL K
 1BBF   SUNDANESE LETTER FINAL M
+       * used in a 21st century document
+       * for actual final m, use the sequence 1B99 1BAA
 @@     1BC0    Batak   1BFF
 @              Letters
 @+             Annotations for letters indicate different usage among the various alphabets sharing the Batak script.
        x (asterisk - 002A)
        x (combining asterisk below - 0359)
 204F   REVERSED SEMICOLON
-       * also used in Sindhi
+       * used occasionally in Sindhi when Sindhi is written in the Arabic script
        x (semicolon - 003B)
        x (arabic semicolon - 061B)
 2050   CLOSE UP
 20E6   COMBINING DOUBLE VERTICAL STROKE OVERLAY
        = z notation finite function diacritic
        x (double vertical line - 2016)
+       x (rightwards arrow with double vertical stroke - 21FB)
+       x (rightwards two-headed arrow with double vertical stroke - 2901)
+       x (rightwards arrow with tail with double vertical stroke - 2915)
 20E7   COMBINING ANNUITY SYMBOL
        = actuarial bend
        x (right ceiling - 2309)
        = the set of complex numbers
        # <font> 0043 latin capital letter c
 2103   DEGREE CELSIUS
-       = degrees Centigrade
+       = degrees centigrade
        # 00B0 0043
 2104   CENTRE LINE SYMBOL
        = clone
        x (circled crossing lanes - 26D2)
        x (n-ary circled times operator - 2A02)
        x (circled x - 2BBE)
+       x (lot of fortune - 1F774)
        ~ 2297 FE00 with white rim
 2298   CIRCLED DIVISION SLASH
 2299   CIRCLED DOT OPERATOR
 231B   HOURGLASS
        = alchemical symbol for hour
 @              Quine corners
-@+             These form a set of four quine corners, for quincuncial arrangement. They are also used in upper and lower pairs in mathematic, or more rarely in editorial usage as alternatives to half brackets.
+@+             These form a set of four quine corners, for quincuncial arrangement. They are also used in upper and lower pairs in mathematics, or more rarely in editorial usage as alternatives to half brackets.
 231C   TOP LEFT CORNER
        x (right angle substitution marker - 2E00)
        x (top left half bracket - 2E22)
        x (alchemical symbol for purify - 1F763)
 260C   CONJUNCTION
        = alchemical symbol for day
+       x (occultation - 1F775)
 260D   OPPOSITION
+       x (lunar eclipse - 1F776)
 @              Miscellaneous symbols
 260E   BLACK TELEPHONE
        x (telephone sign - 2121)
 262C   ADI SHAKTI
        = khanda
        * Sikh religious symbol
+       x (khanda - 1FAAF)
 262D   HAMMER AND SICKLE
 262E   PEACE SYMBOL
 262F   YIN YANG
        = heterosexuality
 26A5   MALE AND FEMALE SIGN
        = intersex, androgynous
-       = hermaphrodite (in entomology)
+       = hermaphroditic (in botany)
 26A6   MALE WITH STROKE SIGN
        = transgender
        = alchemical symbol for iron or crocus of iron
        x (modifier letter short equals sign - A78A)
 @              Reversed punctuation
 2E41   REVERSED COMMA
-       * also used in Sindhi
+       * Old Hungarian
+       * used occasionally in Sindhi when Sindhi is written in the Arabic script
        x (comma - 002C)
        x (arabic comma - 060C)
 2E42   DOUBLE LOW-REVERSED-9 QUOTATION MARK
        x (paragraphos - 2E0F)
        x (capitulum - 2E3F)
 2E4E   PUNCTUS ELEVATUS MARK
-@+             This mark indicates a major intermediate pause where the sensus is complete but the sentence is not; this is similar in some regards to the modern use of a semicolon.
+@+             This mark indicates a major intermediate pause where the sensus is complete but the sentence is not; this is similar in some regards to the modern use of a semicolon.
 2E4F   CORNISH VERSE DIVIDER
 2E50   CROSS PATTY WITH RIGHT CROSSBAR
        x (maltese cross - 2720)
 2E94   CJK RADICAL SNOUT ONE
        x 5F51
 2E95   CJK RADICAL SNOUT TWO
+       * actually a form of the radical for hand, despite its resemblance in shape to the radical for snout
        x 5F50
+       x 2B739
 2E96   CJK RADICAL HEART ONE
        * form used on left side
        x 5FC4
 33D6   SQUARE MOL
        # <square> 006D 006F 006C
 33D7   SQUARE PH
+       * casing inconsistency in the compatibility decomposition is a known anomaly dating from glyph presentations in very early versions of the standard
        # <square> 0050 0048
 33D8   SQUARE PM
        # <square> 0070 002E 006D 002E
@@ -24914,11 +24947,13 @@ A91E  KAYAH LI LETTER THA
 A91F   KAYAH LI LETTER HA
 A920   KAYAH LI LETTER VA
 A921   KAYAH LI LETTER CA
+@              Vowels
 A922   KAYAH LI LETTER A
+       * serves as a vowel carrier for vowels indicated with combining marks
 A923   KAYAH LI LETTER OE
+       * also serves as a vowel carrier
 A924   KAYAH LI LETTER I
 A925   KAYAH LI LETTER OO
-@              Vowels
 A926   KAYAH LI VOWEL UE
 A927   KAYAH LI VOWEL E
 A928   KAYAH LI VOWEL U
@@ -25517,6 +25552,7 @@ AB2E    ETHIOPIC SYLLABLE BBO
 @@     AB30    Latin Extended-E        AB6F
 @              Letters for German dialectology
 AB30   LATIN SMALL LETTER BARRED ALPHA
+@+             * This letter is a Latin alpha with a horizontal strikethrough bar. In some font designs, the bar might not extend beyond the edge of the letter, and in such cases, the letter should not be confused with a ligature of epsilon and iota.
 AB31   LATIN SMALL LETTER A REVERSED-SCHWA
 AB32   LATIN SMALL LETTER BLACKLETTER E
 AB33   LATIN SMALL LETTER BARRED E
@@ -32300,6 +32336,7 @@ FFFF    <not a character>
 10C47  OLD TURKIC LETTER ORKHON OT
 10C48  OLD TURKIC LETTER ORKHON BASH
 @@     10C80   Old Hungarian   10CFF
+@+             This script has contemporary usage in Hungary, where users often prefer the name Szekely-Hungarian Rovas.
 @              Uppercase letters
 @+             The use of uppercase letters is a modern innovation.
 10C80  OLD HUNGARIAN CAPITAL LETTER A
@@ -32487,6 +32524,7 @@ FFFF    <not a character>
        * in earlier literature called "tprus" (later recognized as an abbreviation for "temperius")
 10CF2  OLD HUNGARIAN SMALL LETTER US
 @              Numbers
+@+             The numbers for one, five, and ten have a clear relationship to Roman numerals.
 10CFA  OLD HUNGARIAN NUMBER ONE
 10CFB  OLD HUNGARIAN NUMBER FIVE
 10CFC  OLD HUNGARIAN NUMBER TEN
@@ -32652,6 +32690,12 @@ FFFF   <not a character>
 @              Historical letters with diacritics
 10EB0  YEZIDI LETTER LAM WITH DOT ABOVE
 10EB1  YEZIDI LETTER YOT WITH CIRCUMFLEX ABOVE
+@@     10EC0   Arabic Extended-C       10EFF
+@              Quranic marks used in Turkey
+10EFD  ARABIC SMALL LOW WORD SAKTA
+       x (arabic small high word sakta - 08DD)
+10EFE  ARABIC SMALL LOW WORD QASR
+10EFF  ARABIC SMALL LOW WORD MADDA
 @@     10F00   Old Sogdian     10F2F
 @+             This block unifies the scripts used in the Ancient Letters and the Kultobe and Upper Indus inscriptions.
 @              Letters
@@ -33465,6 +33509,12 @@ FFFF   <not a character>
 @              Sign
 1123E  KHOJKI SIGN SUKUN
        * used for Arabic transliteration
+@              Consonant
+1123F  KHOJKI LETTER QA
+@              Independent vowel
+11240  KHOJKI LETTER SHORT I
+@              Dependent vowel sign
+11241  KHOJKI VOWEL SIGN VOCALIC R
 @@     11280   Multani 112AF
 @              Vowels
 11280  MULTANI LETTER A
@@ -34956,6 +35006,22 @@ FFFF   <not a character>
 11AF6  PAU CIN HAU LOW-FALLING TONE LONG FINAL
 11AF7  PAU CIN HAU LOW-FALLING TONE FINAL
 11AF8  PAU CIN HAU GLOTTAL STOP FINAL
+@@     11B00   Devanagari Extended-A   11B5F
+@              Head marks
+11B00  DEVANAGARI HEAD MARK
+       x (devanagari double danda - 0965)
+11B01  DEVANAGARI HEAD MARK WITH HEADSTROKE
+@              Auspicious signs
+@+             These are used for representing bhale mīndu signs.
+11B02  DEVANAGARI SIGN BHALE
+11B03  DEVANAGARI SIGN BHALE WITH HOOK
+11B04  DEVANAGARI SIGN EXTENDED BHALE
+11B05  DEVANAGARI SIGN EXTENDED BHALE WITH HOOK
+11B06  DEVANAGARI SIGN WESTERN FIVE-LIKE BHALE
+11B07  DEVANAGARI SIGN WESTERN NINE-LIKE BHALE
+11B08  DEVANAGARI SIGN REVERSED NINE-LIKE BHALE
+11B09  DEVANAGARI SIGN MINDU
+       x (devanagari digit zero - 0966)
 @@     11C00   Bhaiksuki       11C6F
 @              Independent vowels
 11C00  BHAIKSUKI LETTER A
@@ -35330,6 +35396,106 @@ FFFF  <not a character>
 @              Punctuation
 11EF7  MAKASAR PASSIMBANG
 11EF8  MAKASAR END OF SECTION
+@@     11F00   Kawi    11F5F
+@              Signs
+11F00  KAWI SIGN CANDRABINDU
+11F01  KAWI SIGN ANUSVARA
+11F02  KAWI SIGN REPHA
+       * cluster-initial form of 11F2C
+       * also used as final r
+11F03  KAWI SIGN VISARGA
+@              Independent vowels
+11F04  KAWI LETTER A
+11F05  KAWI LETTER AA
+11F06  KAWI LETTER I
+11F07  KAWI LETTER II
+11F08  KAWI LETTER U
+11F09  KAWI LETTER UU
+11F0A  KAWI LETTER VOCALIC R
+11F0B  KAWI LETTER VOCALIC RR
+11F0C  KAWI LETTER VOCALIC L
+11F0D  KAWI LETTER VOCALIC LL
+11F0E  KAWI LETTER E
+11F0F  KAWI LETTER AI
+11F10  KAWI LETTER O
+@              Consonants
+11F12  KAWI LETTER KA
+11F13  KAWI LETTER KHA
+11F14  KAWI LETTER GA
+11F15  KAWI LETTER GHA
+11F16  KAWI LETTER NGA
+11F17  KAWI LETTER CA
+11F18  KAWI LETTER CHA
+11F19  KAWI LETTER JA
+11F1A  KAWI LETTER JHA
+11F1B  KAWI LETTER NYA
+11F1C  KAWI LETTER TTA
+11F1D  KAWI LETTER TTHA
+11F1E  KAWI LETTER DDA
+11F1F  KAWI LETTER DDHA
+11F20  KAWI LETTER NNA
+11F21  KAWI LETTER TA
+11F22  KAWI LETTER THA
+11F23  KAWI LETTER DA
+11F24  KAWI LETTER DHA
+11F25  KAWI LETTER NA
+11F26  KAWI LETTER PA
+11F27  KAWI LETTER PHA
+11F28  KAWI LETTER BA
+11F29  KAWI LETTER BHA
+11F2A  KAWI LETTER MA
+11F2B  KAWI LETTER YA
+11F2C  KAWI LETTER RA
+11F2D  KAWI LETTER LA
+11F2E  KAWI LETTER WA
+11F2F  KAWI LETTER SHA
+11F30  KAWI LETTER SSA
+11F31  KAWI LETTER SA
+11F32  KAWI LETTER HA
+11F33  KAWI LETTER JNYA
+@              Dependent vowel signs
+11F34  KAWI VOWEL SIGN AA
+11F35  KAWI VOWEL SIGN ALTERNATE AA
+11F36  KAWI VOWEL SIGN I
+11F37  KAWI VOWEL SIGN II
+11F38  KAWI VOWEL SIGN U
+11F39  KAWI VOWEL SIGN UU
+11F3A  KAWI VOWEL SIGN VOCALIC R
+11F3E  KAWI VOWEL SIGN E
+11F3F  KAWI VOWEL SIGN AI
+11F40  KAWI VOWEL SIGN EU
+       * represents schwa [ə]
+@              Viramas
+11F41  KAWI SIGN KILLER
+       * vowel killer, always rendered visibly
+11F42  KAWI CONJOINER
+       * used for producing below-base and post-base conjunct forms
+@              Punctuation
+11F43  KAWI DANDA
+11F44  KAWI DOUBLE DANDA
+11F45  KAWI PUNCTUATION SECTION MARKER
+11F46  KAWI PUNCTUATION ALTERNATE SECTION MARKER
+11F47  KAWI PUNCTUATION FLOWER
+11F48  KAWI PUNCTUATION SPACE FILLER
+11F49  KAWI PUNCTUATION DOT
+11F4A  KAWI PUNCTUATION DOUBLE DOT
+11F4B  KAWI PUNCTUATION TRIPLE DOT
+11F4C  KAWI PUNCTUATION CIRCLE
+11F4D  KAWI PUNCTUATION FILLED CIRCLE
+11F4E  KAWI PUNCTUATION SPIRAL
+11F4F  KAWI PUNCTUATION CLOSING SPIRAL
+@              Digits
+11F50  KAWI DIGIT ZERO
+11F51  KAWI DIGIT ONE
+11F52  KAWI DIGIT TWO
+       * also used as letter ro
+11F53  KAWI DIGIT THREE
+11F54  KAWI DIGIT FOUR
+11F55  KAWI DIGIT FIVE
+11F56  KAWI DIGIT SIX
+11F57  KAWI DIGIT SEVEN
+11F58  KAWI DIGIT EIGHT
+11F59  KAWI DIGIT NINE
 @@     11FB0   Lisu Supplement 11FBF
 @              Letter
 11FB0  LISU LETTER YHA
@@ -36988,8 +37154,11 @@ FFFF   <not a character>
 1308F  EGYPTIAN HIEROGLYPH D025
 13090  EGYPTIAN HIEROGLYPH D026
 13091  EGYPTIAN HIEROGLYPH D027
+       ~ 13091 FE00 rotated 90 degrees
 13092  EGYPTIAN HIEROGLYPH D027A
+       ~ 13092 FE00 rotated 90 degrees
 13093  EGYPTIAN HIEROGLYPH D028
+       ~ 13093 FE01 rotated 180 degrees
 13094  EGYPTIAN HIEROGLYPH D029
 13095  EGYPTIAN HIEROGLYPH D030
 13096  EGYPTIAN HIEROGLYPH D031
@@ -37016,6 +37185,7 @@ FFFF    <not a character>
        * transliterated as d
 130A8  EGYPTIAN HIEROGLYPH D046A
 130A9  EGYPTIAN HIEROGLYPH D047
+       ~ 130A9 FE01 rotated 180 degrees
 130AA  EGYPTIAN HIEROGLYPH D048
 130AB  EGYPTIAN HIEROGLYPH D048A
 130AC  EGYPTIAN HIEROGLYPH D049
@@ -37154,6 +37324,7 @@ FFFF    <not a character>
 1310D  EGYPTIAN HIEROGLYPH F014
 1310E  EGYPTIAN HIEROGLYPH F015
 1310F  EGYPTIAN HIEROGLYPH F016
+       ~ 1310F FE00 rotated 90 degrees
 13110  EGYPTIAN HIEROGLYPH F017
 13111  EGYPTIAN HIEROGLYPH F018
 13112  EGYPTIAN HIEROGLYPH F019
@@ -37163,12 +37334,14 @@ FFFF  <not a character>
        * from hieratic
 13116  EGYPTIAN HIEROGLYPH F022
 13117  EGYPTIAN HIEROGLYPH F023
+       ~ 13117 FE02 rotated 270 degrees
 13118  EGYPTIAN HIEROGLYPH F024
        * mirrored version of 13117
 13119  EGYPTIAN HIEROGLYPH F025
 1311A  EGYPTIAN HIEROGLYPH F026
 1311B  EGYPTIAN HIEROGLYPH F027
 1311C  EGYPTIAN HIEROGLYPH F028
+       ~ 1311C FE00 rotated 90 degrees
 1311D  EGYPTIAN HIEROGLYPH F029
 1311E  EGYPTIAN HIEROGLYPH F030
 1311F  EGYPTIAN HIEROGLYPH F031
@@ -37176,12 +37349,14 @@ FFFF  <not a character>
        * cursive variant of 1311F
 13121  EGYPTIAN HIEROGLYPH F032
        * transliterated as 1E96
+       ~ 13121 FE00 rotated 90 degrees
 13122  EGYPTIAN HIEROGLYPH F033
 13123  EGYPTIAN HIEROGLYPH F034
 13124  EGYPTIAN HIEROGLYPH F035
 13125  EGYPTIAN HIEROGLYPH F036
 13126  EGYPTIAN HIEROGLYPH F037
 13127  EGYPTIAN HIEROGLYPH F037A
+       ~ 13127 FE00 rotated 90 degrees
 13128  EGYPTIAN HIEROGLYPH F038
 13129  EGYPTIAN HIEROGLYPH F038A
 1312A  EGYPTIAN HIEROGLYPH F039
@@ -37204,6 +37379,8 @@ FFFF    <not a character>
        * mirrored version of 13136
 13138  EGYPTIAN HIEROGLYPH F050
 13139  EGYPTIAN HIEROGLYPH F051
+       ~ 13139 FE00 rotated 90 degrees
+       ~ 13139 FE02 rotated 270 degrees
 1313A  EGYPTIAN HIEROGLYPH F051A
 1313B  EGYPTIAN HIEROGLYPH F051B
        * variant of 1313A
@@ -37295,11 +37472,13 @@ FFFF  <not a character>
 13181  EGYPTIAN HIEROGLYPH H003
 13182  EGYPTIAN HIEROGLYPH H004
 13183  EGYPTIAN HIEROGLYPH H005
+       ~ 13183 FE02 rotated 270 degrees
 13184  EGYPTIAN HIEROGLYPH H006
 13185  EGYPTIAN HIEROGLYPH H006A
        * from hieratic
 13186  EGYPTIAN HIEROGLYPH H007
 13187  EGYPTIAN HIEROGLYPH H008
+       ~ 13187 FE01 rotated 180 degrees
 @              I. Amphibious animals, reptiles, etc.
 13188  EGYPTIAN HIEROGLYPH I001
 13189  EGYPTIAN HIEROGLYPH I002
@@ -37330,6 +37509,8 @@ FFFF    <not a character>
 1319E  EGYPTIAN HIEROGLYPH K004
 1319F  EGYPTIAN HIEROGLYPH K005
 131A0  EGYPTIAN HIEROGLYPH K006
+       ~ 131A0 FE00 rotated 90 degrees
+       ~ 131A0 FE02 rotated 270 degrees
 131A1  EGYPTIAN HIEROGLYPH K007
 131A2  EGYPTIAN HIEROGLYPH K008
 @              L. Invertebrata and lesser animals
@@ -37350,6 +37531,8 @@ FFFF    <not a character>
 131AF  EGYPTIAN HIEROGLYPH M001B
 131B0  EGYPTIAN HIEROGLYPH M002
 131B1  EGYPTIAN HIEROGLYPH M003
+       ~ 131B1 FE00 rotated 90 degrees
+       ~ 131B1 FE01 rotated 180 degrees
 131B2  EGYPTIAN HIEROGLYPH M003A
 131B3  EGYPTIAN HIEROGLYPH M004
 131B4  EGYPTIAN HIEROGLYPH M005
@@ -37357,8 +37540,11 @@ FFFF   <not a character>
 131B6  EGYPTIAN HIEROGLYPH M007
 131B7  EGYPTIAN HIEROGLYPH M008
 131B8  EGYPTIAN HIEROGLYPH M009
+       ~ 131B8 FE00 rotated 90 degrees
 131B9  EGYPTIAN HIEROGLYPH M010
+       ~ 131B9 FE00 rotated 90 degrees
 131BA  EGYPTIAN HIEROGLYPH M010A
+       ~ 131BA FE02 rotated 270 degrees
 131BB  EGYPTIAN HIEROGLYPH M011
 131BC  EGYPTIAN HIEROGLYPH M012
        * 1,000
@@ -37389,6 +37575,7 @@ FFFF    <not a character>
        * transliterated as A7BD
        x (hebrew letter yod - 05D9)
        x (arabic letter yeh - 064A)
+       ~ 131CB FE00 rotated 90 degrees
 131CC  EGYPTIAN HIEROGLYPH M017A
        * phonogram 'y'
        x (egyptian hieroglyph z004 - 133ED)
@@ -37435,6 +37622,8 @@ FFFF    <not a character>
 131EE  EGYPTIAN HIEROGLYPH M044
        * thorn
        * not to be confused with 133DA
+       ~ 131EE FE01 rotated 180 degrees
+       ~ 131EE FE02 rotated 270 degrees
 @              N. Sky, earth, water
 131EF  EGYPTIAN HIEROGLYPH N001
 131F0  EGYPTIAN HIEROGLYPH N002
@@ -37451,8 +37640,13 @@ FFFF   <not a character>
        * variant of 131F8
 131F8  EGYPTIAN HIEROGLYPH N010
        * variant of 131F7
+       ~ 131F8 FE01 rotated 180 degrees
 131F9  EGYPTIAN HIEROGLYPH N011
+       ~ 131F9 FE00 rotated 90 degrees
+       ~ 131F9 FE01 rotated 180 degrees
 131FA  EGYPTIAN HIEROGLYPH N012
+       ~ 131FA FE00 rotated 90 degrees
+       ~ 131FA FE01 rotated 180 degrees
 131FB  EGYPTIAN HIEROGLYPH N013
 131FC  EGYPTIAN HIEROGLYPH N014
 131FD  EGYPTIAN HIEROGLYPH N015
@@ -37498,6 +37692,7 @@ FFFF    <not a character>
        * stylistic variant, use of 13214 is preferred
 13216  EGYPTIAN HIEROGLYPH N035
        * transliterated as n
+       ~ 13216 FE02 rotated 270 degrees
 13217  EGYPTIAN HIEROGLYPH N035A
        * classifier 'liquid'
 13218  EGYPTIAN HIEROGLYPH N036
@@ -37578,6 +37773,7 @@ FFFF    <not a character>
 13256  EGYPTIAN HIEROGLYPH O005A
        * mirrored version of 13255
 13257  EGYPTIAN HIEROGLYPH O006
+       ~ 13257 FE01 rotated 180 degrees
 13258  EGYPTIAN HIEROGLYPH O006A
        * beginning of hwt or serekh enclosure
        x (egyptian hieroglyph o033a - 13282)
@@ -37621,6 +37817,7 @@ FFFF    <not a character>
 13279  EGYPTIAN HIEROGLYPH O027
 1327A  EGYPTIAN HIEROGLYPH O028
 1327B  EGYPTIAN HIEROGLYPH O029
+       ~ 1327B FE02 rotated 270 degrees
 1327C  EGYPTIAN HIEROGLYPH O029A
        * rotated variant of 1327B
 1327D  EGYPTIAN HIEROGLYPH O030
@@ -37628,6 +37825,8 @@ FFFF    <not a character>
        * not to be confused with 13361
 1327E  EGYPTIAN HIEROGLYPH O030A
 1327F  EGYPTIAN HIEROGLYPH O031
+       ~ 1327F FE00 rotated 90 degrees
+       ~ 1327F FE01 rotated 180 degrees
 13280  EGYPTIAN HIEROGLYPH O032
 13281  EGYPTIAN HIEROGLYPH O033
        * classifier 'serekh'
@@ -37639,6 +37838,7 @@ FFFF    <not a character>
        x (egyptian hieroglyph s029 - 132F4)
 13284  EGYPTIAN HIEROGLYPH O035
 13285  EGYPTIAN HIEROGLYPH O036
+       ~ 13285 FE00 rotated 90 degrees
 13286  EGYPTIAN HIEROGLYPH O036A
        * beginning of fortified wall cartouche
 13287  EGYPTIAN HIEROGLYPH O036B
@@ -37652,6 +37852,7 @@ FFFF    <not a character>
 1328C  EGYPTIAN HIEROGLYPH O039
        * stone, brick
        * not to be confused with 13219
+       ~ 1328C FE00 rotated 90 degrees
 1328D  EGYPTIAN HIEROGLYPH O040
 1328E  EGYPTIAN HIEROGLYPH O041
 1328F  EGYPTIAN HIEROGLYPH O042
@@ -37683,6 +37884,8 @@ FFFF    <not a character>
 132A2  EGYPTIAN HIEROGLYPH P006
 132A3  EGYPTIAN HIEROGLYPH P007
 132A4  EGYPTIAN HIEROGLYPH P008
+       ~ 132A4 FE01 rotated 180 degrees
+       ~ 132A4 FE02 rotated 270 degrees
 132A5  EGYPTIAN HIEROGLYPH P009
 132A6  EGYPTIAN HIEROGLYPH P010
 132A7  EGYPTIAN HIEROGLYPH P011
@@ -37693,6 +37896,7 @@ FFFF    <not a character>
 132A9  EGYPTIAN HIEROGLYPH Q002
 132AA  EGYPTIAN HIEROGLYPH Q003
        * transliterated as p
+       ~ 132AA FE00 rotated 90 degrees
 132AB  EGYPTIAN HIEROGLYPH Q004
 132AC  EGYPTIAN HIEROGLYPH Q005
 132AD  EGYPTIAN HIEROGLYPH Q006
@@ -37727,6 +37931,7 @@ FFFF    <not a character>
 132C9  EGYPTIAN HIEROGLYPH R022
 132CA  EGYPTIAN HIEROGLYPH R023
 132CB  EGYPTIAN HIEROGLYPH R024
+       ~ 132CB FE00 rotated 90 degrees
 132CC  EGYPTIAN HIEROGLYPH R025
 132CD  EGYPTIAN HIEROGLYPH R026
 132CE  EGYPTIAN HIEROGLYPH R027
@@ -37745,6 +37950,7 @@ FFFF    <not a character>
 132DA  EGYPTIAN HIEROGLYPH S008
 132DB  EGYPTIAN HIEROGLYPH S009
 132DC  EGYPTIAN HIEROGLYPH S010
+       ~ 132DC FE00 rotated 90 degrees
 132DD  EGYPTIAN HIEROGLYPH S011
 132DE  EGYPTIAN HIEROGLYPH S012
 132DF  EGYPTIAN HIEROGLYPH S013
@@ -37756,8 +37962,11 @@ FFFF   <not a character>
 132E5  EGYPTIAN HIEROGLYPH S017
 132E6  EGYPTIAN HIEROGLYPH S017A
 132E7  EGYPTIAN HIEROGLYPH S018
+       ~ 132E7 FE00 rotated 90 degrees
+       ~ 132E7 FE02 rotated 270 degrees
 132E8  EGYPTIAN HIEROGLYPH S019
 132E9  EGYPTIAN HIEROGLYPH S020
+       ~ 132E9 FE02 rotated 270 degrees
 132EA  EGYPTIAN HIEROGLYPH S021
 132EB  EGYPTIAN HIEROGLYPH S022
 132EC  EGYPTIAN HIEROGLYPH S023
@@ -37777,6 +37986,7 @@ FFFF    <not a character>
 132F6  EGYPTIAN HIEROGLYPH S031
 132F7  EGYPTIAN HIEROGLYPH S032
 132F8  EGYPTIAN HIEROGLYPH S033
+       ~ 132F8 FE02 rotated 270 degrees
 132F9  EGYPTIAN HIEROGLYPH S034
 132FA  EGYPTIAN HIEROGLYPH S035
 132FB  EGYPTIAN HIEROGLYPH S035A
@@ -37784,6 +37994,7 @@ FFFF    <not a character>
 132FC  EGYPTIAN HIEROGLYPH S036
        * older variant of 132FA
 132FD  EGYPTIAN HIEROGLYPH S037
+       ~ 132FD FE02 rotated 270 degrees
 132FE  EGYPTIAN HIEROGLYPH S038
 132FF  EGYPTIAN HIEROGLYPH S039
 13300  EGYPTIAN HIEROGLYPH S040
@@ -37791,14 +38002,18 @@ FFFF  <not a character>
 13301  EGYPTIAN HIEROGLYPH S041
        * phonogram 'ḏꜣm'
 13302  EGYPTIAN HIEROGLYPH S042
+       ~ 13302 FE02 rotated 270 degrees
 13303  EGYPTIAN HIEROGLYPH S043
+       ~ 13303 FE02 rotated 270 degrees
 13304  EGYPTIAN HIEROGLYPH S044
 13305  EGYPTIAN HIEROGLYPH S045
 13306  EGYPTIAN HIEROGLYPH S046
 @              T. Warfare, hunting, butchery
 13307  EGYPTIAN HIEROGLYPH T001
+       ~ 13307 FE00 rotated 90 degrees
 13308  EGYPTIAN HIEROGLYPH T002
        * classifier 'striking, hitting'
+       ~ 13308 FE01 rotated 180 degrees
 13309  EGYPTIAN HIEROGLYPH T003
        * classifier 'mace'
 1330A  EGYPTIAN HIEROGLYPH T003A
@@ -37809,11 +38024,19 @@ FFFF  <not a character>
 1330F  EGYPTIAN HIEROGLYPH T007A
 13310  EGYPTIAN HIEROGLYPH T008
        * older variant of 13311
+       ~ 13310 FE02 rotated 270 degrees
 13311  EGYPTIAN HIEROGLYPH T008A
+       ~ 13311 FE02 rotated 270 degrees
 13312  EGYPTIAN HIEROGLYPH T009
+       ~ 13312 FE01 rotated 180 degrees
+       ~ 13312 FE02 rotated 270 degrees
 13313  EGYPTIAN HIEROGLYPH T009A
        * older variant of 13312
+       ~ 13313 FE01 rotated 180 degrees
+       ~ 13313 FE02 rotated 270 degrees
 13314  EGYPTIAN HIEROGLYPH T010
+       ~ 13314 FE01 rotated 180 degrees
+       ~ 13314 FE02 rotated 270 degrees
 13315  EGYPTIAN HIEROGLYPH T011
 13316  EGYPTIAN HIEROGLYPH T011A
 13317  EGYPTIAN HIEROGLYPH T012
@@ -37822,14 +38045,21 @@ FFFF  <not a character>
 1331A  EGYPTIAN HIEROGLYPH T015
        * older variant of 13319
 1331B  EGYPTIAN HIEROGLYPH T016
+       ~ 1331B FE00 rotated 90 degrees
+       ~ 1331B FE01 rotated 180 degrees
 1331C  EGYPTIAN HIEROGLYPH T016A
+       ~ 1331C FE02 rotated 270 degrees
 1331D  EGYPTIAN HIEROGLYPH T017
 1331E  EGYPTIAN HIEROGLYPH T018
 1331F  EGYPTIAN HIEROGLYPH T019
 13320  EGYPTIAN HIEROGLYPH T020
        * older variant of 1331F
 13321  EGYPTIAN HIEROGLYPH T021
+       ~ 13321 FE01 rotated 180 degrees
+       ~ 13321 FE02 rotated 270 degrees
 13322  EGYPTIAN HIEROGLYPH T022
+       ~ 13322 FE00 rotated 90 degrees
+       ~ 13322 FE01 rotated 180 degrees
 13323  EGYPTIAN HIEROGLYPH T023
        * more recent variant of 13322
 13324  EGYPTIAN HIEROGLYPH T024
@@ -37851,6 +38081,8 @@ FFFF    <not a character>
 13330  EGYPTIAN HIEROGLYPH T034
 13331  EGYPTIAN HIEROGLYPH T035
        * variant of 13330
+       ~ 13331 FE01 rotated 180 degrees
+       ~ 13331 FE02 rotated 270 degrees
 13332  EGYPTIAN HIEROGLYPH T036
 @              U. Agriculture, crafts, and professions
 13333  EGYPTIAN HIEROGLYPH U001
@@ -37867,8 +38099,10 @@ FFFF   <not a character>
        * mirrored version of 13339
 1333B  EGYPTIAN HIEROGLYPH U007
        * variant of 13338
+       ~ 1333B FE00 rotated 90 degrees
 1333C  EGYPTIAN HIEROGLYPH U008
        * variant of 1333B
+       ~ 1333C FE00 rotated 90 degrees
 1333D  EGYPTIAN HIEROGLYPH U009
 1333E  EGYPTIAN HIEROGLYPH U010
 1333F  EGYPTIAN HIEROGLYPH U011
@@ -37885,6 +38119,7 @@ FFFF    <not a character>
        * older variant of 13347
 13349  EGYPTIAN HIEROGLYPH U021
 1334A  EGYPTIAN HIEROGLYPH U022
+       ~ 1334A FE02 rotated 270 degrees
 1334B  EGYPTIAN HIEROGLYPH U023
 1334C  EGYPTIAN HIEROGLYPH U023A
        * stylistic variant of 1334B
@@ -37915,6 +38150,7 @@ FFFF    <not a character>
 13361  EGYPTIAN HIEROGLYPH U042
        * pitchfork
        * not to be confused with 1327D
+       ~ 13361 FE02 rotated 270 degrees
 @              V. Rope, fiber, baskets, bags, etc.
 13362  EGYPTIAN HIEROGLYPH V001
        * 100
@@ -37948,13 +38184,17 @@ FFFF  <not a character>
 13372  EGYPTIAN HIEROGLYPH V007
        * phonogram 'šn'
 13373  EGYPTIAN HIEROGLYPH V007A
+       ~ 13373 FE02 rotated 270 degrees
 13374  EGYPTIAN HIEROGLYPH V007B
 13375  EGYPTIAN HIEROGLYPH V008
 13376  EGYPTIAN HIEROGLYPH V009
 13377  EGYPTIAN HIEROGLYPH V010
        * logogram 'name'
+       ~ 13377 FE00 rotated 90 degrees
 13378  EGYPTIAN HIEROGLYPH V011
        * classifier 'restrain, split'
+       x (egyptian hieroglyph v011d - 1342F)
+       ~ 13378 FE00 rotated 90 degrees
 13379  EGYPTIAN HIEROGLYPH V011A
        * beginning of cartouche
 1337A  EGYPTIAN HIEROGLYPH V011B
@@ -37963,6 +38203,7 @@ FFFF    <not a character>
        * end of knotless cartouche
 1337C  EGYPTIAN HIEROGLYPH V012
 1337D  EGYPTIAN HIEROGLYPH V012A
+       ~ 1337D FE02 rotated 270 degrees
 1337E  EGYPTIAN HIEROGLYPH V012B
 1337F  EGYPTIAN HIEROGLYPH V013
        * transliterated as 1E6F
@@ -37974,6 +38215,7 @@ FFFF    <not a character>
 13384  EGYPTIAN HIEROGLYPH V018
        * older variant of 13383
 13385  EGYPTIAN HIEROGLYPH V019
+       ~ 13385 FE02 rotated 270 degrees
 13386  EGYPTIAN HIEROGLYPH V020
        * 10
        * not to be confused with 133AD
@@ -38015,8 +38257,10 @@ FFFF   <not a character>
 13398  EGYPTIAN HIEROGLYPH V025
        * more recent variant of 13397
 13399  EGYPTIAN HIEROGLYPH V026
+       ~ 13399 FE00 rotated 90 degrees
 1339A  EGYPTIAN HIEROGLYPH V027
        * older variant of 13399
+       ~ 1339A FE00 rotated 90 degrees
 1339B  EGYPTIAN HIEROGLYPH V028
        * transliterated as 1E25
        x (arabic letter hah - 062D)
@@ -38053,7 +38297,9 @@ FFFF    <not a character>
        * not to be confused with 13387
 @              W. Vessels of stone and earthenware
 133AF  EGYPTIAN HIEROGLYPH W001
+       ~ 133AF FE02 rotated 270 degrees
 133B0  EGYPTIAN HIEROGLYPH W002
+       ~ 133B0 FE02 rotated 270 degrees
 133B1  EGYPTIAN HIEROGLYPH W003
 133B2  EGYPTIAN HIEROGLYPH W003A
        * stylistic variant, use of 133B1 is preferred
@@ -38073,6 +38319,7 @@ FFFF    <not a character>
        * older variant of 133BC
 133BE  EGYPTIAN HIEROGLYPH W013
 133BF  EGYPTIAN HIEROGLYPH W014
+       ~ 133BF FE02 rotated 270 degrees
 133C0  EGYPTIAN HIEROGLYPH W014A
 133C1  EGYPTIAN HIEROGLYPH W015
 133C2  EGYPTIAN HIEROGLYPH W016
@@ -38089,9 +38336,9 @@ FFFF    <not a character>
 133CA  EGYPTIAN HIEROGLYPH W022
 133CB  EGYPTIAN HIEROGLYPH W023
 133CC  EGYPTIAN HIEROGLYPH W024
-       * phonogramm 'nw'
+       * phonogram 'nw'
 133CD  EGYPTIAN HIEROGLYPH W024A
-       * monogramm 'nw(n)' or 'nww'
+       * monogram 'nw(n)' or 'nww'
 133CE  EGYPTIAN HIEROGLYPH W025
 @              X. Loaves and cakes
 133CF  EGYPTIAN HIEROGLYPH X001
@@ -38102,6 +38349,7 @@ FFFF    <not a character>
 133D2  EGYPTIAN HIEROGLYPH X004
 133D3  EGYPTIAN HIEROGLYPH X004A
        * variant of 133D2
+       ~ 133D3 FE00 rotated 90 degrees
 133D4  EGYPTIAN HIEROGLYPH X004B
        * cake
        * variant of 133D2
@@ -38125,6 +38373,7 @@ FFFF    <not a character>
        * rotated variant of 133DB
 133DD  EGYPTIAN HIEROGLYPH Y002
        * older variant of 133DB
+       ~ 133DD FE02 rotated 270 degrees
 133DE  EGYPTIAN HIEROGLYPH Y003
 133DF  EGYPTIAN HIEROGLYPH Y004
        * mirrored version of 133DE
@@ -38136,7 +38385,7 @@ FFFF    <not a character>
 133E4  EGYPTIAN HIEROGLYPH Z001
        * semogram index
        * classifier 'single'
-       * not to be confuse with 133FA
+       * not to be confused with 133FA
 133E5  EGYPTIAN HIEROGLYPH Z002
        * classifier 'plural'
        * not to be confused with 133FC
@@ -38171,13 +38420,16 @@ FFFF  <not a character>
 133F2  EGYPTIAN HIEROGLYPH Z007
        * phonogram 'w'
        * not to be confused with 13362
+       ~ 133F2 FE00 rotated 90 degrees
 133F3  EGYPTIAN HIEROGLYPH Z008
        * oval
        * not to be confused with 13200, 132F0, or 133D4
 133F4  EGYPTIAN HIEROGLYPH Z009
 133F5  EGYPTIAN HIEROGLYPH Z010
        * older variant of 133F4
+       ~ 133F5 FE00 rotated 90 degrees
 133F6  EGYPTIAN HIEROGLYPH Z011
+       ~ 133F6 FE00 rotated 90 degrees
 133F7  EGYPTIAN HIEROGLYPH Z012
        * hieratic
 133F8  EGYPTIAN HIEROGLYPH Z013
@@ -38209,6 +38461,7 @@ FFFF    <not a character>
        * 9
 13403  EGYPTIAN HIEROGLYPH Z015I
        * 5
+       ~ 13403 FE00 rotated 90 degrees
 13404  EGYPTIAN HIEROGLYPH Z016
        * 1 in dates
 13405  EGYPTIAN HIEROGLYPH Z016A
@@ -38241,11 +38494,16 @@ FFFF  <not a character>
        * mirrored version of 13413
 13415  EGYPTIAN HIEROGLYPH AA007B
 13416  EGYPTIAN HIEROGLYPH AA008
+       ~ 13416 FE00 rotated 90 degrees
 13417  EGYPTIAN HIEROGLYPH AA009
 13418  EGYPTIAN HIEROGLYPH AA010
 13419  EGYPTIAN HIEROGLYPH AA011
+       ~ 13419 FE00 rotated 90 degrees
+       ~ 13419 FE01 rotated 180 degrees
+       ~ 13419 FE02 rotated 270 degrees
 1341A  EGYPTIAN HIEROGLYPH AA012
        * older variant of 13419
+       ~ 1341A FE00 rotated 90 degrees
 1341B  EGYPTIAN HIEROGLYPH AA013
 1341C  EGYPTIAN HIEROGLYPH AA014
        * older variant of 1341B
@@ -38258,6 +38516,7 @@ FFFF    <not a character>
 13421  EGYPTIAN HIEROGLYPH AA019
 13422  EGYPTIAN HIEROGLYPH AA020
 13423  EGYPTIAN HIEROGLYPH AA021
+       ~ 13423 FE00 rotated 90 degrees
 13424  EGYPTIAN HIEROGLYPH AA022
 13425  EGYPTIAN HIEROGLYPH AA023
 13426  EGYPTIAN HIEROGLYPH AA024
@@ -38271,11 +38530,19 @@ FFFF  <not a character>
 1342B  EGYPTIAN HIEROGLYPH AA029
        * older variant of 1342A
 1342C  EGYPTIAN HIEROGLYPH AA030
+       ~ 1342C FE02 rotated 270 degrees
 1342D  EGYPTIAN HIEROGLYPH AA031
        * older variant of 1342C
 1342E  EGYPTIAN HIEROGLYPH AA032
-@@     13430   Egyptian Hieroglyph Format Controls     1343F
-@+             These format controls are used to render Egyptian hieroglyphic quadrats.
+       ~ 1342E FE02 rotated 270 degrees
+@              Addition to group V
+@+             This is part of the cartouche set: 13379, 1337A, 1337B, and 1342F.
+1342F  EGYPTIAN HIEROGLYPH V011D
+       * knotted beginning of cartouche
+       * not to be confused with 13378
+@~     !
+@@     13430   Egyptian Hieroglyph Format Controls     1345F
+@+             These format controls are used to render Egyptian hieroglyphic spatial arrangements, including quadrats, overlays, insertions, and blank, lost or damaged sections.
 @              Joiners
 13430  EGYPTIAN HIEROGLYPH VERTICAL JOINER
        = sign separator: subordination (Manuel de Codage)
@@ -38291,6 +38558,45 @@ FFFF   <not a character>
 @              Segment scoping delimiters
 13437  EGYPTIAN HIEROGLYPH BEGIN SEGMENT
 13438  EGYPTIAN HIEROGLYPH END SEGMENT
+@              Sign insertion controls
+13439  EGYPTIAN HIEROGLYPH INSERT AT MIDDLE
+1343A  EGYPTIAN HIEROGLYPH INSERT AT TOP
+1343B  EGYPTIAN HIEROGLYPH INSERT AT BOTTOM
+@              Enclosure controls
+1343C  EGYPTIAN HIEROGLYPH BEGIN ENCLOSURE
+1343D  EGYPTIAN HIEROGLYPH END ENCLOSURE
+1343E  EGYPTIAN HIEROGLYPH BEGIN WALLED ENCLOSURE
+1343F  EGYPTIAN HIEROGLYPH END WALLED ENCLOSURE
+@              Mirror control
+13440  EGYPTIAN HIEROGLYPH MIRROR HORIZONTALLY
+@              Blank and lost signs
+13441  EGYPTIAN HIEROGLYPH FULL BLANK
+13442  EGYPTIAN HIEROGLYPH HALF BLANK
+13443  EGYPTIAN HIEROGLYPH LOST SIGN
+       ~ 13443 FE00 expanded 
+13444  EGYPTIAN HIEROGLYPH HALF LOST SIGN
+       ~ 13444 FE00 expanded 
+13445  EGYPTIAN HIEROGLYPH TALL LOST SIGN
+       ~ 13445 FE00 expanded 
+13446  EGYPTIAN HIEROGLYPH WIDE LOST SIGN
+       ~ 13446 FE00 expanded 
+@              Damage modifiers
+13447  EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP START
+13448  EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT BOTTOM START
+13449  EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT START
+1344A  EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP END
+1344B  EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP
+1344C  EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT BOTTOM START AND TOP END
+1344D  EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT START AND TOP
+1344E  EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT BOTTOM END
+1344F  EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP START AND BOTTOM END
+13450  EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT BOTTOM
+13451  EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT START AND BOTTOM
+13452  EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT END
+13453  EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP AND END
+13454  EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT BOTTOM AND END
+13455  EGYPTIAN HIEROGLYPH MODIFIER DAMAGED
+@~     !
 @@     14400   Anatolian Hieroglyphs   1467F
 @+             In the names list, most of the comments are in Latin. Those which have a Luwian phonetic value are identified as syllabic.
 @              A. The human body and clothing
@@ -41710,6 +42016,7 @@ FFFF    <not a character>
 18BDC  KHITAN SMALL SCRIPT CHARACTER-18BDC
 18BDD  KHITAN SMALL SCRIPT CHARACTER-18BDD
 18BDE  KHITAN SMALL SCRIPT CHARACTER-18BDE
+       x (khitan small script character-18cca - 18CCA)
 18BDF  KHITAN SMALL SCRIPT CHARACTER-18BDF
 18BE0  KHITAN SMALL SCRIPT CHARACTER-18BE0
 18BE1  KHITAN SMALL SCRIPT CHARACTER-18BE1
@@ -41958,6 +42265,7 @@ FFFF    <not a character>
 18CC8  KHITAN SMALL SCRIPT CHARACTER-18CC8
 18CC9  KHITAN SMALL SCRIPT CHARACTER-18CC9
 18CCA  KHITAN SMALL SCRIPT CHARACTER-18CCA
+       x (khitan small script character-18bde - 18BDE)
 18CCB  KHITAN SMALL SCRIPT CHARACTER-18CCB
 @              Radical-19
 18CCC  KHITAN SMALL SCRIPT CHARACTER-18CCC
@@ -42578,10 +42886,12 @@ FFFF  <not a character>
 1B122  KATAKANA LETTER ARCHAIC WU
 @@     1B130   Small Kana Extension    1B16F
 @              Historic small hiragana letters
+1B132  HIRAGANA LETTER SMALL KO
 1B150  HIRAGANA LETTER SMALL WI
 1B151  HIRAGANA LETTER SMALL WE
 1B152  HIRAGANA LETTER SMALL WO
 @              Historic small katakana letters
+1B155  KATAKANA LETTER SMALL KO
 1B164  KATAKANA LETTER SMALL WI
 1B165  KATAKANA LETTER SMALL WE
 1B166  KATAKANA LETTER SMALL WO
@@ -44467,6 +44777,28 @@ FFFF   <not a character>
 1D244  COMBINING GREEK MUSICAL PENTASEME
        x (metrical pentaseme - 23D9)
 1D245  GREEK MUSICAL LEIMMA
+@@     1D2C0   Kaktovik Numerals       1D2DF
+@              Numerals
+1D2C0  KAKTOVIK NUMERAL ZERO
+1D2C1  KAKTOVIK NUMERAL ONE
+1D2C2  KAKTOVIK NUMERAL TWO
+1D2C3  KAKTOVIK NUMERAL THREE
+1D2C4  KAKTOVIK NUMERAL FOUR
+1D2C5  KAKTOVIK NUMERAL FIVE
+1D2C6  KAKTOVIK NUMERAL SIX
+1D2C7  KAKTOVIK NUMERAL SEVEN
+1D2C8  KAKTOVIK NUMERAL EIGHT
+1D2C9  KAKTOVIK NUMERAL NINE
+1D2CA  KAKTOVIK NUMERAL TEN
+1D2CB  KAKTOVIK NUMERAL ELEVEN
+1D2CC  KAKTOVIK NUMERAL TWELVE
+1D2CD  KAKTOVIK NUMERAL THIRTEEN
+1D2CE  KAKTOVIK NUMERAL FOURTEEN
+1D2CF  KAKTOVIK NUMERAL FIFTEEN
+1D2D0  KAKTOVIK NUMERAL SIXTEEN
+1D2D1  KAKTOVIK NUMERAL SEVENTEEN
+1D2D2  KAKTOVIK NUMERAL EIGHTEEN
+1D2D3  KAKTOVIK NUMERAL NINETEEN
 @@     1D2E0   Mayan Numerals  1D2FF
 @              Mayan numerals
 1D2E0  MAYAN NUMERAL ZERO
@@ -47482,6 +47814,13 @@ FFFF   <not a character>
 1DF1D  LATIN SMALL LETTER C WITH RETROFLEX HOOK
 @              IPA extension
 1DF1E  LATIN SMALL LETTER S WITH CURL
+@              Letters for Malayalam transliteration
+1DF25  LATIN SMALL LETTER D WITH MID-HEIGHT LEFT HOOK
+1DF26  LATIN SMALL LETTER L WITH MID-HEIGHT LEFT HOOK
+1DF27  LATIN SMALL LETTER N WITH MID-HEIGHT LEFT HOOK
+1DF28  LATIN SMALL LETTER R WITH MID-HEIGHT LEFT HOOK
+1DF29  LATIN SMALL LETTER S WITH MID-HEIGHT LEFT HOOK
+1DF2A  LATIN SMALL LETTER T WITH MID-HEIGHT LEFT HOOK
 @@     1E000   Glagolitic Supplement   1E02F
 @              Combining letters
 1E000  COMBINING GLAGOLITIC LETTER AZU
@@ -47522,6 +47861,140 @@ FFFF  <not a character>
 1E028  COMBINING GLAGOLITIC LETTER BIG YUS
 1E029  COMBINING GLAGOLITIC LETTER IOTATED BIG YUS
 1E02A  COMBINING GLAGOLITIC LETTER FITA
+@@     1E030   Cyrillic Extended-D     1E08F
+@+             These are phonetic extensions, used in a manner analogous to IPA. Additional Cyrillic modifier letters are found in other blocks.
+       x (modifier letter cyrillic en - 1D78)
+       x (modifier letter cyrillic hard sign - A69C)
+       x (modifier letter cyrillic soft sign - A69D)
+@              Superscript modifier letters
+1E030  MODIFIER LETTER CYRILLIC SMALL A
+       # <super> 0430
+1E031  MODIFIER LETTER CYRILLIC SMALL BE
+       # <super> 0431
+1E032  MODIFIER LETTER CYRILLIC SMALL VE
+       # <super> 0432
+1E033  MODIFIER LETTER CYRILLIC SMALL GHE
+       # <super> 0433
+1E034  MODIFIER LETTER CYRILLIC SMALL DE
+       # <super> 0434
+1E035  MODIFIER LETTER CYRILLIC SMALL IE
+       # <super> 0435
+1E036  MODIFIER LETTER CYRILLIC SMALL ZHE
+       # <super> 0436
+1E037  MODIFIER LETTER CYRILLIC SMALL ZE
+       # <super> 0437
+1E038  MODIFIER LETTER CYRILLIC SMALL I
+       # <super> 0438
+1E039  MODIFIER LETTER CYRILLIC SMALL KA
+       # <super> 043A
+1E03A  MODIFIER LETTER CYRILLIC SMALL EL
+       # <super> 043B
+1E03B  MODIFIER LETTER CYRILLIC SMALL EM
+       # <super> 043C
+1E03C  MODIFIER LETTER CYRILLIC SMALL O
+       # <super> 043E
+1E03D  MODIFIER LETTER CYRILLIC SMALL PE
+       # <super> 043F
+1E03E  MODIFIER LETTER CYRILLIC SMALL ER
+       # <super> 0440
+1E03F  MODIFIER LETTER CYRILLIC SMALL ES
+       # <super> 0441
+1E040  MODIFIER LETTER CYRILLIC SMALL TE
+       # <super> 0442
+1E041  MODIFIER LETTER CYRILLIC SMALL U
+       # <super> 0443
+1E042  MODIFIER LETTER CYRILLIC SMALL EF
+       # <super> 0444
+1E043  MODIFIER LETTER CYRILLIC SMALL HA
+       # <super> 0445
+1E044  MODIFIER LETTER CYRILLIC SMALL TSE
+       # <super> 0446
+1E045  MODIFIER LETTER CYRILLIC SMALL CHE
+       # <super> 0447
+1E046  MODIFIER LETTER CYRILLIC SMALL SHA
+       # <super> 0448
+1E047  MODIFIER LETTER CYRILLIC SMALL YERU
+       # <super> 044B
+1E048  MODIFIER LETTER CYRILLIC SMALL E
+       # <super> 044D
+1E049  MODIFIER LETTER CYRILLIC SMALL YU
+       # <super> 044E
+1E04A  MODIFIER LETTER CYRILLIC SMALL DZZE
+       # <super> A689
+1E04B  MODIFIER LETTER CYRILLIC SMALL SCHWA
+       # <super> 04D9
+1E04C  MODIFIER LETTER CYRILLIC SMALL BYELORUSSIAN-UKRAINIAN I
+       # <super> 0456
+1E04D  MODIFIER LETTER CYRILLIC SMALL JE
+       # <super> 0458
+1E04E  MODIFIER LETTER CYRILLIC SMALL BARRED O
+       # <super> 04E9
+1E04F  MODIFIER LETTER CYRILLIC SMALL STRAIGHT U
+       # <super> 04AF
+1E050  MODIFIER LETTER CYRILLIC SMALL PALOCHKA
+       # <super> 04CF
+@              Subscript modifier letters
+1E051  CYRILLIC SUBSCRIPT SMALL LETTER A
+       # <sub> 0430
+1E052  CYRILLIC SUBSCRIPT SMALL LETTER BE
+       # <sub> 0431
+1E053  CYRILLIC SUBSCRIPT SMALL LETTER VE
+       # <sub> 0432
+1E054  CYRILLIC SUBSCRIPT SMALL LETTER GHE
+       # <sub> 0433
+1E055  CYRILLIC SUBSCRIPT SMALL LETTER DE
+       # <sub> 0434
+1E056  CYRILLIC SUBSCRIPT SMALL LETTER IE
+       # <sub> 0435
+1E057  CYRILLIC SUBSCRIPT SMALL LETTER ZHE
+       # <sub> 0436
+1E058  CYRILLIC SUBSCRIPT SMALL LETTER ZE
+       # <sub> 0437
+1E059  CYRILLIC SUBSCRIPT SMALL LETTER I
+       # <sub> 0438
+1E05A  CYRILLIC SUBSCRIPT SMALL LETTER KA
+       # <sub> 043A
+1E05B  CYRILLIC SUBSCRIPT SMALL LETTER EL
+       # <sub> 043B
+1E05C  CYRILLIC SUBSCRIPT SMALL LETTER O
+       # <sub> 043E
+1E05D  CYRILLIC SUBSCRIPT SMALL LETTER PE
+       # <sub> 043F
+1E05E  CYRILLIC SUBSCRIPT SMALL LETTER ES
+       # <sub> 0441
+1E05F  CYRILLIC SUBSCRIPT SMALL LETTER U
+       # <sub> 0443
+1E060  CYRILLIC SUBSCRIPT SMALL LETTER EF
+       # <sub> 0444
+1E061  CYRILLIC SUBSCRIPT SMALL LETTER HA
+       # <sub> 0445
+1E062  CYRILLIC SUBSCRIPT SMALL LETTER TSE
+       # <sub> 0446
+1E063  CYRILLIC SUBSCRIPT SMALL LETTER CHE
+       # <sub> 0447
+1E064  CYRILLIC SUBSCRIPT SMALL LETTER SHA
+       # <sub> 0448
+1E065  CYRILLIC SUBSCRIPT SMALL LETTER HARD SIGN
+       # <sub> 044A
+1E066  CYRILLIC SUBSCRIPT SMALL LETTER YERU
+       # <sub> 044B
+1E067  CYRILLIC SUBSCRIPT SMALL LETTER GHE WITH UPTURN
+       # <sub> 0491
+1E068  CYRILLIC SUBSCRIPT SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+       # <sub> 0456
+1E069  CYRILLIC SUBSCRIPT SMALL LETTER DZE
+       # <sub> 0455
+1E06A  CYRILLIC SUBSCRIPT SMALL LETTER DZHE
+       # <sub> 045F
+@              Superscript modifier letters
+1E06B  MODIFIER LETTER CYRILLIC SMALL ES WITH DESCENDER
+       # <super> 04AB
+1E06C  MODIFIER LETTER CYRILLIC SMALL YERU WITH BACK YER
+       # <super> A651
+1E06D  MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE
+       # <super> 04B1
+@              Diacritical mark
+1E08F  COMBINING CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
 @@     1E100   Nyiakeng Puachue Hmong  1E14F
 @+             The Nyiakeng Puachue Hmong script (Nyiaj Keeb Puaj Txwm in RPA orthography) is also known as Pa Dao (Paj Ntaub) and Chervang script (Txawj Vaag).
 @              Consonant onsets
@@ -47740,6 +48213,58 @@ FFFF   <not a character>
 1E2FF  WANCHO NGUN SIGN
        = rupee
        x (indian rupee sign - 20B9)
+@@     1E4D0   Nag Mundari     1E4FF
+@              Letters
+1E4D0  NAG MUNDARI LETTER O
+1E4D1  NAG MUNDARI LETTER OP
+1E4D2  NAG MUNDARI LETTER OL
+1E4D3  NAG MUNDARI LETTER OY
+1E4D4  NAG MUNDARI LETTER ONG
+1E4D5  NAG MUNDARI LETTER A
+1E4D6  NAG MUNDARI LETTER AJ
+1E4D7  NAG MUNDARI LETTER AB
+1E4D8  NAG MUNDARI LETTER ANY
+1E4D9  NAG MUNDARI LETTER AH
+1E4DA  NAG MUNDARI LETTER I
+1E4DB  NAG MUNDARI LETTER IS
+1E4DC  NAG MUNDARI LETTER IDD
+1E4DD  NAG MUNDARI LETTER IT
+1E4DE  NAG MUNDARI LETTER IH
+1E4DF  NAG MUNDARI LETTER U
+1E4E0  NAG MUNDARI LETTER UC
+1E4E1  NAG MUNDARI LETTER UD
+1E4E2  NAG MUNDARI LETTER UK
+1E4E3  NAG MUNDARI LETTER UR
+1E4E4  NAG MUNDARI LETTER E
+1E4E5  NAG MUNDARI LETTER ENN
+1E4E6  NAG MUNDARI LETTER EG
+1E4E7  NAG MUNDARI LETTER EM
+1E4E8  NAG MUNDARI LETTER EN
+1E4E9  NAG MUNDARI LETTER ETT
+1E4EA  NAG MUNDARI LETTER ELL
+@              Various signs
+1E4EB  NAG MUNDARI SIGN OJOD
+       * precedes modified letters such as AB or UD
+       * may indicate consonant gemination
+1E4EC  NAG MUNDARI SIGN MUHOR
+       * vowel nasalization
+1E4ED  NAG MUNDARI SIGN TOYOR
+       * indicates a long vowel
+1E4EE  NAG MUNDARI SIGN IKIR
+       * vowel preceded by the 'w' sound
+1E4EF  NAG MUNDARI SIGN SUTUH
+       * mostly used for close transliteration of other languages
+@              Digits
+1E4F0  NAG MUNDARI DIGIT ZERO
+1E4F1  NAG MUNDARI DIGIT ONE
+1E4F2  NAG MUNDARI DIGIT TWO
+1E4F3  NAG MUNDARI DIGIT THREE
+1E4F4  NAG MUNDARI DIGIT FOUR
+1E4F5  NAG MUNDARI DIGIT FIVE
+1E4F6  NAG MUNDARI DIGIT SIX
+1E4F7  NAG MUNDARI DIGIT SEVEN
+1E4F8  NAG MUNDARI DIGIT EIGHT
+1E4F9  NAG MUNDARI DIGIT NINE
 @@     1E7E0   Ethiopic Extended-B     1E7FF
 @              Syllables for Gurage
 1E7E0  ETHIOPIC SYLLABLE HHYA
@@ -50331,6 +50856,7 @@ FFFF    <not a character>
        x (heavy black heart - 2764)
        x (white heart - 1F90D)
        x (orange heart - 1F9E1)
+       x (light blue heart - 1FA75)
 1F49A  GREEN HEART
 1F49B  YELLOW HEART
 1F49C  PURPLE HEART
@@ -51341,6 +51867,7 @@ FFFF    <not a character>
 1F6D6  HUT
 1F6D7  ELEVATOR
 @              Miscellaneous symbols
+1F6DC  WIRELESS
 1F6DD  PLAYGROUND SLIDE
 1F6DE  WHEEL
 1F6DF  RING BUOY
@@ -51475,8 +52002,9 @@ FFFF    <not a character>
        x (alchemical symbol for sal-ammoniac - 1F739)
 1F728  ALCHEMICAL SYMBOL FOR VERDIGRIS
        = aes viride, copper subacetate
-       = early astronomical symbol for earth
+       = astronomical symbol for earth
        x (circled plus - 2295)
+       x (earth - 2641)
 @              Symbols for tin and lead ore
 1F729  ALCHEMICAL SYMBOL FOR TIN ORE
        x (jupiter - 2643)
@@ -51615,10 +52143,27 @@ FFFF  <not a character>
 @              Measures
 1F772  ALCHEMICAL SYMBOL FOR HALF DRAM
        = drachma semis
+       * handwritten ligature of 0292 + 00DF, typically spelled out as ʒss
        x (latin small letter ezh - 0292)
 1F773  ALCHEMICAL SYMBOL FOR HALF OUNCE
        = uncia semis
+       * handwritten ligature of 2125 + 00DF, typically spelled out as 2125 ss
        x (ounce sign - 2125)
+@              Other symbol
+1F774  LOT OF FORTUNE
+       = pars fortunae
+       x (circled times - 2297)
+@              Eclipse symbols
+1F775  OCCULTATION
+       x (conjunction - 260C)
+1F776  LUNAR ECLIPSE
+       x (opposition - 260D)
+@              Symbols for dwarf planets
+1F77B  HAUMEA
+1F77C  MAKEMAKE
+1F77D  GONGGONG
+1F77E  QUAOAR
+1F77F  ORCUS
 @@     1F780   Geometric Shapes Extended       1F7FF
 @+             These geometric shapes originate from the Webdings/Wingdings collections.
 @              Isosceles right triangles
@@ -51772,6 +52317,9 @@ FFFF    <not a character>
 1F7D6  NEGATIVE CIRCLED TRIANGLE
 1F7D7  CIRCLED SQUARE
 1F7D8  NEGATIVE CIRCLED SQUARE
+@              Nine pointed star
+1F7D9  NINE POINTED WHITE STAR
+       * commonly used by members of the Bahá'í faith
 @              Colored circles
 @+             For use with emoji. Constitute a set as follows: 26AA, 26AB, 1F534, 1F535, 1F7E0-1F7E4
 1F7E0  LARGE ORANGE CIRCLE
@@ -51999,7 +52547,7 @@ FFFF    <not a character>
 @              Hand symbol
 1F90C  PINCHED FINGERS
 @              Colored heart symbols
-@+             For use with emoji. Constitute a set as follows: 2764, 1F499-1F49C, 1F5A4, 1F90D, 1F90E, and 1F9E1.
+@+             For use with emoji. Constitute a set as follows: 2764, 1F499-1F49C, 1F5A4, 1F90D, 1F90E, 1F9E1, and 1FA75-1FA77.
 1F90D  WHITE HEART
 1F90E  BROWN HEART
 @              Hand symbol
@@ -52519,6 +53067,11 @@ FFFF   <not a character>
 1FA73  SHORTS
 1FA74  THONG SANDAL
        = flip flop
+@              Colored heart symbols
+@+             For use with emoji. Constitute a set as follows: 2764, 1F499-1F49C, 1F5A4, 1F90D, 1F90E, 1F9E1, and 1FA75-1FA77.
+1FA75  LIGHT BLUE HEART
+1FA76  GREY HEART
+1FA77  PINK HEART
 @              Medical symbols
 1FA78  DROP OF BLOOD
        x (droplet - 1F4A7)
@@ -52534,6 +53087,9 @@ FFFF    <not a character>
 1FA84  MAGIC WAND
 1FA85  PINATA
 1FA86  NESTING DOLLS
+@              Musical instruments
+1FA87  MARACAS
+1FA88  FLUTE
 @              Miscellaneous objects
 1FA90  RINGED PLANET
 1FA91  CHAIR
@@ -52566,6 +53122,11 @@ FFFF   <not a character>
 1FAAB  LOW BATTERY
        x (battery - 1F50B)
 1FAAC  HAMSA
+1FAAD  FOLDING HAND FAN
+1FAAE  HAIR PICK
+@              Religious symbol
+1FAAF  KHANDA
+       x (adi shakti - 262C)
 @              Animals and nature
 1FAB0  FLY
 1FAB1  WORM
@@ -52578,6 +53139,10 @@ FFFF   <not a character>
 1FAB8  CORAL
 1FAB9  EMPTY NEST
 1FABA  NEST WITH EGGS
+1FABB  HYACINTH
+1FABC  JELLYFISH
+1FABD  WING
+1FABF  GOOSE
 @              Body parts
 1FAC0  ANATOMICAL HEART
 1FAC1  LUNGS
@@ -52588,6 +53153,9 @@ FFFF    <not a character>
        x (pregnant woman - 1F930)
 1FAC5  PERSON WITH CROWN
        x (princess - 1F478)
+@              Animals and nature
+1FACE  MOOSE
+1FACF  DONKEY
 @              Food and drink
 1FAD0  BLUEBERRIES
 1FAD1  BELL PEPPER
@@ -52600,6 +53168,8 @@ FFFF    <not a character>
        x (glass of milk - 1F95B)
 1FAD8  BEANS
 1FAD9  JAR
+1FADA  GINGER ROOT
+1FADB  PEA POD
 @              Faces
 1FAE0  MELTING FACE
 1FAE1  SALUTING FACE
@@ -52611,6 +53181,8 @@ FFFF    <not a character>
 1FAE6  BITING LIP
        x (lips - 1F5E2)
 1FAE7  BUBBLES
+@              Face
+1FAE8  SHAKING FACE
 @              Hand symbols
 1FAF0  HAND WITH INDEX FINGER AND THUMB CROSSED
        x (hand with index and middle fingers crossed - 1F91E)
@@ -52620,6 +53192,8 @@ FFFF    <not a character>
 1FAF4  PALM UP HAND
 1FAF5  INDEX POINTING AT THE VIEWER
 1FAF6  HEART HANDS
+1FAF7  LEFTWARDS PUSHING HAND
+1FAF8  RIGHTWARDS PUSHING HAND
 @@     1FB00   Symbols for Legacy Computing    1FBFF
 @              Block mosaic terminal graphic characters
 @+             The term "sextant" refers to block mosaics divided into six parts.
@@ -52936,7 +53510,7 @@ FFFF    <not a character>
 1FFFE  <not a character>
 1FFFF  <not a character>
 @@     20000   CJK Unified Ideographs Extension B      2A6DF
-@@     2A700   CJK Unified Ideographs Extension C      2B738
+@@     2A700   CJK Unified Ideographs Extension C      2B739
 @@     2B740   CJK Unified Ideographs Extension D      2B81D
 @@     2B820   CJK Unified Ideographs Extension E      2CEA1
 @@     2CEB0   CJK Unified Ideographs Extension F      2EBE0
@@ -54057,6 +54631,7 @@ FFFF    <not a character>
 2FFFE  <not a character>
 2FFFF  <not a character>
 @@     30000   CJK Unified Ideographs Extension G      3134A
+@@     31350   CJK Unified Ideographs Extension H      323AF
 @@     3FF80   Unassigned      3FFFF
 @              Noncharacters
 @+             These codes are intended for process-internal uses.
index a1a34d6..f992c0d 100644 (file)
@@ -1,10 +1,10 @@
-# NormalizationCorrections-14.0.0.txt
-# Date: 2021-03-16, 22:07:00 GMT [KW, LI]
-# © 2021 Unicode®, Inc.
-# For terms of use, see http://www.unicode.org/terms_of_use.html
+# NormalizationCorrections-15.0.0.txt
+# Date: 2022-05-03, 18:53:00 GMT [KW, LI]
+# © 2022 Unicode®, Inc.
+# For terms of use, see https://www.unicode.org/terms_of_use.html
 #
 # Unicode Character Database
-# For documentation, see http://www.unicode.org/reports/tr44/
+# For documentation, see https://www.unicode.org/reports/tr44/
 #
 # This file is a normative contributory data file in the
 # Unicode Character Database.
index 0a5a934..b49d646 100644 (file)
@@ -1,11 +1,11 @@
-# PropList-14.0.0.txt
-# Date: 2021-08-12, 23:13:05 GMT
-# © 2021 Unicode®, Inc.
+# PropList-15.0.0.txt
+# Date: 2022-08-05, 22:17:16 GMT
+# © 2022 Unicode®, Inc.
 # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
-# For terms of use, see http://www.unicode.org/terms_of_use.html
+# For terms of use, see https://www.unicode.org/terms_of_use.html
 #
 # Unicode Character Database
-#   For documentation, see http://www.unicode.org/reports/tr44/
+#   For documentation, see https://www.unicode.org/reports/tr44/
 
 # ================================================
 
@@ -215,6 +215,7 @@ FF64          ; Terminal_Punctuation # Po       HALFWIDTH IDEOGRAPHIC COMMA
 11C41..11C43  ; Terminal_Punctuation # Po   [3] BHAIKSUKI DANDA..BHAIKSUKI WORD SEPARATOR
 11C71         ; Terminal_Punctuation # Po       MARCHEN MARK SHAD
 11EF7..11EF8  ; Terminal_Punctuation # Po   [2] MAKASAR PASSIMBANG..MAKASAR END OF SECTION
+11F43..11F44  ; Terminal_Punctuation # Po   [2] KAWI DANDA..KAWI DOUBLE DANDA
 12470..12474  ; Terminal_Punctuation # Po   [5] CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER..CUNEIFORM PUNCTUATION SIGN DIAGONAL QUADCOLON
 16A6E..16A6F  ; Terminal_Punctuation # Po   [2] MRO DANDA..MRO DOUBLE DANDA
 16AF5         ; Terminal_Punctuation # Po       BASSA VAH FULL STOP
@@ -224,7 +225,7 @@ FF64          ; Terminal_Punctuation # Po       HALFWIDTH IDEOGRAPHIC COMMA
 1BC9F         ; Terminal_Punctuation # Po       DUPLOYAN PUNCTUATION CHINOOK FULL STOP
 1DA87..1DA8A  ; Terminal_Punctuation # Po   [4] SIGNWRITING COMMA..SIGNWRITING COLON
 
-# Total code points: 276
+# Total code points: 278
 
 # ================================================
 
@@ -507,6 +508,7 @@ FF41..FF46    ; Hex_Digit # L&   [6] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH L
 0BD7          ; Other_Alphabetic # Mc       TAMIL AU LENGTH MARK
 0C00          ; Other_Alphabetic # Mn       TELUGU SIGN COMBINING CANDRABINDU ABOVE
 0C01..0C03    ; Other_Alphabetic # Mc   [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA
+0C04          ; Other_Alphabetic # Mn       TELUGU SIGN COMBINING ANUSVARA ABOVE
 0C3E..0C40    ; Other_Alphabetic # Mn   [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II
 0C41..0C44    ; Other_Alphabetic # Mc   [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR
 0C46..0C48    ; Other_Alphabetic # Mn   [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI
@@ -524,6 +526,7 @@ FF41..FF46    ; Hex_Digit # L&   [6] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH L
 0CCC          ; Other_Alphabetic # Mn       KANNADA VOWEL SIGN AU
 0CD5..0CD6    ; Other_Alphabetic # Mc   [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK
 0CE2..0CE3    ; Other_Alphabetic # Mn   [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL
+0CF3          ; Other_Alphabetic # Mc       KANNADA SIGN COMBINING ANUSVARA ABOVE RIGHT
 0D00..0D01    ; Other_Alphabetic # Mn   [2] MALAYALAM SIGN COMBINING ANUSVARA ABOVE..MALAYALAM SIGN CANDRABINDU
 0D02..0D03    ; Other_Alphabetic # Mc   [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA
 0D3E..0D40    ; Other_Alphabetic # Mc   [3] MALAYALAM VOWEL SIGN AA..MALAYALAM VOWEL SIGN II
@@ -548,7 +551,7 @@ FF41..FF46    ; Hex_Digit # L&   [6] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH L
 0ECD          ; Other_Alphabetic # Mn       LAO NIGGAHITA
 0F71..0F7E    ; Other_Alphabetic # Mn  [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO
 0F7F          ; Other_Alphabetic # Mc       TIBETAN SIGN RNAM BCAD
-0F80..0F81    ; Other_Alphabetic # Mn   [2] TIBETAN VOWEL SIGN REVERSED I..TIBETAN VOWEL SIGN REVERSED II
+0F80..0F83    ; Other_Alphabetic # Mn   [4] TIBETAN VOWEL SIGN REVERSED I..TIBETAN SIGN SNA LDAN
 0F8D..0F97    ; Other_Alphabetic # Mn  [11] TIBETAN SUBJOINED SIGN LCE TSA CAN..TIBETAN SUBJOINED LETTER JA
 0F99..0FBC    ; Other_Alphabetic # Mn  [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA
 102B..102C    ; Other_Alphabetic # Mc   [2] MYANMAR VOWEL SIGN TALL AA..MYANMAR VOWEL SIGN AA
@@ -692,6 +695,7 @@ FB1E          ; Other_Alphabetic # Mn       HEBREW POINT JUDEO-SPANISH VARIKA
 11002         ; Other_Alphabetic # Mc       BRAHMI SIGN VISARGA
 11038..11045  ; Other_Alphabetic # Mn  [14] BRAHMI VOWEL SIGN AA..BRAHMI VOWEL SIGN AU
 11073..11074  ; Other_Alphabetic # Mn   [2] BRAHMI VOWEL SIGN OLD TAMIL SHORT E..BRAHMI VOWEL SIGN OLD TAMIL SHORT O
+11080..11081  ; Other_Alphabetic # Mn   [2] KAITHI SIGN CANDRABINDU..KAITHI SIGN ANUSVARA
 11082         ; Other_Alphabetic # Mc       KAITHI SIGN VISARGA
 110B0..110B2  ; Other_Alphabetic # Mc   [3] KAITHI VOWEL SIGN AA..KAITHI VOWEL SIGN II
 110B3..110B6  ; Other_Alphabetic # Mn   [4] KAITHI VOWEL SIGN U..KAITHI VOWEL SIGN AI
@@ -715,6 +719,7 @@ FB1E          ; Other_Alphabetic # Mn       HEBREW POINT JUDEO-SPANISH VARIKA
 11234         ; Other_Alphabetic # Mn       KHOJKI SIGN ANUSVARA
 11237         ; Other_Alphabetic # Mn       KHOJKI SIGN SHADDA
 1123E         ; Other_Alphabetic # Mn       KHOJKI SIGN SUKUN
+11241         ; Other_Alphabetic # Mn       KHOJKI VOWEL SIGN VOCALIC R
 112DF         ; Other_Alphabetic # Mn       KHUDAWADI SIGN ANUSVARA
 112E0..112E2  ; Other_Alphabetic # Mc   [3] KHUDAWADI VOWEL SIGN AA..KHUDAWADI VOWEL SIGN II
 112E3..112E8  ; Other_Alphabetic # Mn   [6] KHUDAWADI VOWEL SIGN U..KHUDAWADI VOWEL SIGN AU
@@ -807,6 +812,12 @@ FB1E          ; Other_Alphabetic # Mn       HEBREW POINT JUDEO-SPANISH VARIKA
 11D96         ; Other_Alphabetic # Mc       GUNJALA GONDI SIGN VISARGA
 11EF3..11EF4  ; Other_Alphabetic # Mn   [2] MAKASAR VOWEL SIGN I..MAKASAR VOWEL SIGN U
 11EF5..11EF6  ; Other_Alphabetic # Mc   [2] MAKASAR VOWEL SIGN E..MAKASAR VOWEL SIGN O
+11F00..11F01  ; Other_Alphabetic # Mn   [2] KAWI SIGN CANDRABINDU..KAWI SIGN ANUSVARA
+11F03         ; Other_Alphabetic # Mc       KAWI SIGN VISARGA
+11F34..11F35  ; Other_Alphabetic # Mc   [2] KAWI VOWEL SIGN AA..KAWI VOWEL SIGN ALTERNATE AA
+11F36..11F3A  ; Other_Alphabetic # Mn   [5] KAWI VOWEL SIGN I..KAWI VOWEL SIGN VOCALIC R
+11F3E..11F3F  ; Other_Alphabetic # Mc   [2] KAWI VOWEL SIGN E..KAWI VOWEL SIGN AI
+11F40         ; Other_Alphabetic # Mn       KAWI VOWEL SIGN EU
 16F4F         ; Other_Alphabetic # Mn       MIAO SIGN CONSONANT MODIFIER BAR
 16F51..16F87  ; Other_Alphabetic # Mc  [55] MIAO SIGN ASPIRATION..MIAO VOWEL SIGN UI
 16F8F..16F92  ; Other_Alphabetic # Mn   [4] MIAO TONE RIGHT..MIAO TONE BELOW
@@ -817,12 +828,13 @@ FB1E          ; Other_Alphabetic # Mn       HEBREW POINT JUDEO-SPANISH VARIKA
 1E01B..1E021  ; Other_Alphabetic # Mn   [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI
 1E023..1E024  ; Other_Alphabetic # Mn   [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS
 1E026..1E02A  ; Other_Alphabetic # Mn   [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA
+1E08F         ; Other_Alphabetic # Mn       COMBINING CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
 1E947         ; Other_Alphabetic # Mn       ADLAM HAMZA
 1F130..1F149  ; Other_Alphabetic # So  [26] SQUARED LATIN CAPITAL LETTER A..SQUARED LATIN CAPITAL LETTER Z
 1F150..1F169  ; Other_Alphabetic # So  [26] NEGATIVE CIRCLED LATIN CAPITAL LETTER A..NEGATIVE CIRCLED LATIN CAPITAL LETTER Z
 1F170..1F189  ; Other_Alphabetic # So  [26] NEGATIVE SQUARED LATIN CAPITAL LETTER A..NEGATIVE SQUARED LATIN CAPITAL LETTER Z
 
-# Total code points: 1404
+# Total code points: 1425
 
 # ================================================
 
@@ -840,14 +852,15 @@ FA70..FAD9    ; Ideographic # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COM
 18D00..18D08  ; Ideographic # Lo   [9] TANGUT IDEOGRAPH-18D00..TANGUT IDEOGRAPH-18D08
 1B170..1B2FB  ; Ideographic # Lo [396] NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB
 20000..2A6DF  ; Ideographic # Lo [42720] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6DF
-2A700..2B738  ; Ideographic # Lo [4153] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B738
+2A700..2B739  ; Ideographic # Lo [4154] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B739
 2B740..2B81D  ; Ideographic # Lo [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D
 2B820..2CEA1  ; Ideographic # Lo [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1
 2CEB0..2EBE0  ; Ideographic # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0
 2F800..2FA1D  ; Ideographic # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D
 30000..3134A  ; Ideographic # Lo [4939] CJK UNIFIED IDEOGRAPH-30000..CJK UNIFIED IDEOGRAPH-3134A
+31350..323AF  ; Ideographic # Lo [4192] CJK UNIFIED IDEOGRAPH-31350..CJK UNIFIED IDEOGRAPH-323AF
 
-# Total code points: 101661
+# Total code points: 105854
 
 # ================================================
 
@@ -1028,6 +1041,7 @@ FFE3          ; Diacritic # Sk       FULLWIDTH MACRON
 10AE5..10AE6  ; Diacritic # Mn   [2] MANICHAEAN ABBREVIATION MARK ABOVE..MANICHAEAN ABBREVIATION MARK BELOW
 10D22..10D23  ; Diacritic # Lo   [2] HANIFI ROHINGYA MARK SAKIN..HANIFI ROHINGYA MARK NA KHONNA
 10D24..10D27  ; Diacritic # Mn   [4] HANIFI ROHINGYA SIGN HARBAHAY..HANIFI ROHINGYA SIGN TASSI
+10EFD..10EFF  ; Diacritic # Mn   [3] ARABIC SMALL LOW WORD SAKTA..ARABIC SMALL LOW WORD MADDA
 10F46..10F50  ; Diacritic # Mn  [11] SOGDIAN COMBINING DOT BELOW..SOGDIAN COMBINING STROKE BELOW
 10F82..10F85  ; Diacritic # Mn   [4] OLD UYGHUR COMBINING DOT ABOVE..OLD UYGHUR COMBINING TWO DOTS BELOW
 11046         ; Diacritic # Mn       BRAHMI VIRAMA
@@ -1064,6 +1078,7 @@ FFE3          ; Diacritic # Sk       FULLWIDTH MACRON
 11D42         ; Diacritic # Mn       MASARAM GONDI SIGN NUKTA
 11D44..11D45  ; Diacritic # Mn   [2] MASARAM GONDI SIGN HALANTA..MASARAM GONDI VIRAMA
 11D97         ; Diacritic # Mn       GUNJALA GONDI VIRAMA
+13447..13455  ; Diacritic # Mn  [15] EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP START..EGYPTIAN HIEROGLYPH MODIFIER DAMAGED
 16AF0..16AF4  ; Diacritic # Mn   [5] BASSA VAH COMBINING HIGH TONE..BASSA VAH COMBINING HIGH-LOW TONE
 16B30..16B36  ; Diacritic # Mn   [7] PAHAWH HMONG MARK CIM TUB..PAHAWH HMONG MARK CIM TAUM
 16F8F..16F92  ; Diacritic # Mn   [4] MIAO TONE RIGHT..MIAO TONE BELOW
@@ -1079,6 +1094,7 @@ FFE3          ; Diacritic # Sk       FULLWIDTH MACRON
 1D17B..1D182  ; Diacritic # Mn   [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE
 1D185..1D18B  ; Diacritic # Mn   [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE
 1D1AA..1D1AD  ; Diacritic # Mn   [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO
+1E030..1E06D  ; Diacritic # Lm  [62] MODIFIER LETTER CYRILLIC SMALL A..MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE
 1E130..1E136  ; Diacritic # Mn   [7] NYIAKENG PUACHUE HMONG TONE-B..NYIAKENG PUACHUE HMONG TONE-D
 1E2AE         ; Diacritic # Mn       TOTO SIGN RISING TONE
 1E2EC..1E2EF  ; Diacritic # Mn   [4] WANCHO TONE TUP..WANCHO TONE KOINI
@@ -1086,7 +1102,7 @@ FFE3          ; Diacritic # Sk       FULLWIDTH MACRON
 1E944..1E946  ; Diacritic # Mn   [3] ADLAM ALIF LENGTHENER..ADLAM GEMINATION MARK
 1E948..1E94A  ; Diacritic # Mn   [3] ADLAM CONSONANT MODIFIER..ADLAM NUKTA
 
-# Total code points: 1064
+# Total code points: 1144
 
 # ================================================
 
@@ -1135,6 +1151,7 @@ FF70          ; Extender # Lm       HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND
 02E0..02E4    ; Other_Lowercase # Lm   [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP
 0345          ; Other_Lowercase # Mn       COMBINING GREEK YPOGEGRAMMENI
 037A          ; Other_Lowercase # Lm       GREEK YPOGEGRAMMENI
+10FC          ; Other_Lowercase # Lm       MODIFIER LETTER GEORGIAN NAR
 1D2C..1D6A    ; Other_Lowercase # Lm  [63] MODIFIER LETTER CAPITAL A..GREEK SUBSCRIPT SMALL LETTER CHI
 1D78          ; Other_Lowercase # Lm       MODIFIER LETTER CYRILLIC EN
 1D9B..1DBF    ; Other_Lowercase # Lm  [37] MODIFIER LETTER SMALL TURNED ALPHA..MODIFIER LETTER SMALL THETA
@@ -1146,14 +1163,17 @@ FF70          ; Extender # Lm       HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND
 2C7C..2C7D    ; Other_Lowercase # Lm   [2] LATIN SUBSCRIPT SMALL LETTER J..MODIFIER LETTER CAPITAL V
 A69C..A69D    ; Other_Lowercase # Lm   [2] MODIFIER LETTER CYRILLIC HARD SIGN..MODIFIER LETTER CYRILLIC SOFT SIGN
 A770          ; Other_Lowercase # Lm       MODIFIER LETTER US
+A7F2..A7F4    ; Other_Lowercase # Lm   [3] MODIFIER LETTER CAPITAL C..MODIFIER LETTER CAPITAL Q
 A7F8..A7F9    ; Other_Lowercase # Lm   [2] MODIFIER LETTER CAPITAL H WITH STROKE..MODIFIER LETTER SMALL LIGATURE OE
 AB5C..AB5F    ; Other_Lowercase # Lm   [4] MODIFIER LETTER SMALL HENG..MODIFIER LETTER SMALL U WITH LEFT HOOK
+AB69          ; Other_Lowercase # Lm       MODIFIER LETTER SMALL TURNED W
 10780         ; Other_Lowercase # Lm       MODIFIER LETTER SMALL CAPITAL AA
 10783..10785  ; Other_Lowercase # Lm   [3] MODIFIER LETTER SMALL AE..MODIFIER LETTER SMALL B WITH HOOK
 10787..107B0  ; Other_Lowercase # Lm  [42] MODIFIER LETTER SMALL DZ DIGRAPH..MODIFIER LETTER SMALL V WITH RIGHT HOOK
 107B2..107BA  ; Other_Lowercase # Lm   [9] MODIFIER LETTER SMALL CAPITAL Y..MODIFIER LETTER SMALL S WITH CURL
+1E030..1E06D  ; Other_Lowercase # Lm  [62] MODIFIER LETTER CYRILLIC SMALL A..MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE
 
-# Total code points: 244
+# Total code points: 311
 
 # ================================================
 
@@ -1251,13 +1271,14 @@ FA21          ; Unified_Ideograph # Lo       CJK COMPATIBILITY IDEOGRAPH-FA21
 FA23..FA24    ; Unified_Ideograph # Lo   [2] CJK COMPATIBILITY IDEOGRAPH-FA23..CJK COMPATIBILITY IDEOGRAPH-FA24
 FA27..FA29    ; Unified_Ideograph # Lo   [3] CJK COMPATIBILITY IDEOGRAPH-FA27..CJK COMPATIBILITY IDEOGRAPH-FA29
 20000..2A6DF  ; Unified_Ideograph # Lo [42720] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6DF
-2A700..2B738  ; Unified_Ideograph # Lo [4153] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B738
+2A700..2B739  ; Unified_Ideograph # Lo [4154] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B739
 2B740..2B81D  ; Unified_Ideograph # Lo [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D
 2B820..2CEA1  ; Unified_Ideograph # Lo [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1
 2CEB0..2EBE0  ; Unified_Ideograph # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0
 30000..3134A  ; Unified_Ideograph # Lo [4939] CJK UNIFIED IDEOGRAPH-30000..CJK UNIFIED IDEOGRAPH-3134A
+31350..323AF  ; Unified_Ideograph # Lo [4192] CJK UNIFIED IDEOGRAPH-31350..CJK UNIFIED IDEOGRAPH-323AF
 
-# Total code points: 92865
+# Total code points: 97058
 
 # ================================================
 
@@ -1323,8 +1344,10 @@ E0001         ; Deprecated # Cf       LANGUAGE TAG
 1D65E..1D65F  ; Soft_Dotted # L&   [2] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J
 1D692..1D693  ; Soft_Dotted # L&   [2] MATHEMATICAL MONOSPACE SMALL I..MATHEMATICAL MONOSPACE SMALL J
 1DF1A         ; Soft_Dotted # L&       LATIN SMALL LETTER I WITH STROKE AND RETROFLEX HOOK
+1E04C..1E04D  ; Soft_Dotted # Lm   [2] MODIFIER LETTER CYRILLIC SMALL BYELORUSSIAN-UKRAINIAN I..MODIFIER LETTER CYRILLIC SMALL JE
+1E068         ; Soft_Dotted # Lm       CYRILLIC SUBSCRIPT SMALL LETTER BYELORUSSIAN-UKRAINIAN I
 
-# Total code points: 47
+# Total code points: 50
 
 # ================================================
 
@@ -1430,6 +1453,7 @@ FF61          ; Sentence_Terminal # Po       HALFWIDTH IDEOGRAPHIC FULL STOP
 11A9B..11A9C  ; Sentence_Terminal # Po   [2] SOYOMBO MARK SHAD..SOYOMBO MARK DOUBLE SHAD
 11C41..11C42  ; Sentence_Terminal # Po   [2] BHAIKSUKI DANDA..BHAIKSUKI DOUBLE DANDA
 11EF7..11EF8  ; Sentence_Terminal # Po   [2] MAKASAR PASSIMBANG..MAKASAR END OF SECTION
+11F43..11F44  ; Sentence_Terminal # Po   [2] KAWI DANDA..KAWI DOUBLE DANDA
 16A6E..16A6F  ; Sentence_Terminal # Po   [2] MRO DANDA..MRO DOUBLE DANDA
 16AF5         ; Sentence_Terminal # Po       BASSA VAH FULL STOP
 16B37..16B38  ; Sentence_Terminal # Po   [2] PAHAWH HMONG SIGN VOS THOM..PAHAWH HMONG SIGN VOS TSHAB CEEB
@@ -1438,7 +1462,7 @@ FF61          ; Sentence_Terminal # Po       HALFWIDTH IDEOGRAPHIC FULL STOP
 1BC9F         ; Sentence_Terminal # Po       DUPLOYAN PUNCTUATION CHINOOK FULL STOP
 1DA88         ; Sentence_Terminal # Po       SIGNWRITING FULL STOP
 
-# Total code points: 152
+# Total code points: 154
 
 # ================================================
 
index f0cb26b..863301b 100644 (file)
@@ -1,11 +1,11 @@
-# PropertyValueAliases-14.0.0.txt
-# Date: 2021-05-10, 21:08:53 GMT
-# © 2021 Unicode®, Inc.
+# PropertyValueAliases-15.0.0.txt
+# Date: 2022-08-05, 23:42:17 GMT
+# © 2022 Unicode®, Inc.
 # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
-# For terms of use, see http://www.unicode.org/terms_of_use.html
+# For terms of use, see https://www.unicode.org/terms_of_use.html
 #
 # Unicode Character Database
-#   For documentation, see http://www.unicode.org/reports/tr44/
+#   For documentation, see https://www.unicode.org/reports/tr44/
 #
 # This file contains aliases for property values used in the UCD.
 # These names can be used for XML formats of UCD data, for regular-expression
@@ -90,6 +90,7 @@ age; 12.0                             ; V12_0
 age; 12.1                             ; V12_1
 age; 13.0                             ; V13_0
 age; 14.0                             ; V14_0
+age; 15.0                             ; V15_0
 age; NA                               ; Unassigned
 
 # Alphabetic (Alpha)
@@ -135,7 +136,6 @@ Bidi_M; Y                             ; Yes                              ; T
 
 # Bidi_Mirroring_Glyph (bmg)
 
-# @missing: 0000..10FFFF; Bidi_Mirroring_Glyph; <none>
 
 # Bidi_Paired_Bracket (bpb)
 
@@ -162,6 +162,7 @@ blk; Ancient_Symbols                  ; Ancient_Symbols
 blk; Arabic                           ; Arabic
 blk; Arabic_Ext_A                     ; Arabic_Extended_A
 blk; Arabic_Ext_B                     ; Arabic_Extended_B
+blk; Arabic_Ext_C                     ; Arabic_Extended_C
 blk; Arabic_Math                      ; Arabic_Mathematical_Alphabetic_Symbols
 blk; Arabic_PF_A                      ; Arabic_Presentation_Forms_A      ; Arabic_Presentation_Forms-A
 blk; Arabic_PF_B                      ; Arabic_Presentation_Forms_B
@@ -206,6 +207,7 @@ blk; CJK_Ext_D                        ; CJK_Unified_Ideographs_Extension_D
 blk; CJK_Ext_E                        ; CJK_Unified_Ideographs_Extension_E
 blk; CJK_Ext_F                        ; CJK_Unified_Ideographs_Extension_F
 blk; CJK_Ext_G                        ; CJK_Unified_Ideographs_Extension_G
+blk; CJK_Ext_H                        ; CJK_Unified_Ideographs_Extension_H
 blk; CJK_Radicals_Sup                 ; CJK_Radicals_Supplement
 blk; CJK_Strokes                      ; CJK_Strokes
 blk; CJK_Symbols                      ; CJK_Symbols_And_Punctuation
@@ -223,10 +225,12 @@ blk; Cyrillic                         ; Cyrillic
 blk; Cyrillic_Ext_A                   ; Cyrillic_Extended_A
 blk; Cyrillic_Ext_B                   ; Cyrillic_Extended_B
 blk; Cyrillic_Ext_C                   ; Cyrillic_Extended_C
+blk; Cyrillic_Ext_D                   ; Cyrillic_Extended_D
 blk; Cyrillic_Sup                     ; Cyrillic_Supplement              ; Cyrillic_Supplementary
 blk; Deseret                          ; Deseret
 blk; Devanagari                       ; Devanagari
 blk; Devanagari_Ext                   ; Devanagari_Extended
+blk; Devanagari_Ext_A                 ; Devanagari_Extended_A
 blk; Diacriticals                     ; Combining_Diacritical_Marks
 blk; Diacriticals_Ext                 ; Combining_Diacritical_Marks_Extended
 blk; Diacriticals_For_Symbols         ; Combining_Diacritical_Marks_For_Symbols; Combining_Marks_For_Symbols
@@ -288,6 +292,7 @@ blk; Jamo_Ext_A                       ; Hangul_Jamo_Extended_A
 blk; Jamo_Ext_B                       ; Hangul_Jamo_Extended_B
 blk; Javanese                         ; Javanese
 blk; Kaithi                           ; Kaithi
+blk; Kaktovik_Numerals                ; Kaktovik_Numerals
 blk; Kana_Ext_A                       ; Kana_Extended_A
 blk; Kana_Ext_B                       ; Kana_Extended_B
 blk; Kana_Sup                         ; Kana_Supplement
@@ -296,6 +301,7 @@ blk; Kangxi                           ; Kangxi_Radicals
 blk; Kannada                          ; Kannada
 blk; Katakana                         ; Katakana
 blk; Katakana_Ext                     ; Katakana_Phonetic_Extensions
+blk; Kawi                             ; Kawi
 blk; Kayah_Li                         ; Kayah_Li
 blk; Kharoshthi                       ; Kharoshthi
 blk; Khitan_Small_Script              ; Khitan_Small_Script
@@ -360,6 +366,7 @@ blk; Myanmar                          ; Myanmar
 blk; Myanmar_Ext_A                    ; Myanmar_Extended_A
 blk; Myanmar_Ext_B                    ; Myanmar_Extended_B
 blk; Nabataean                        ; Nabataean
+blk; Nag_Mundari                      ; Nag_Mundari
 blk; Nandinagari                      ; Nandinagari
 blk; NB                               ; No_Block
 blk; New_Tai_Lue                      ; New_Tai_Lue
@@ -663,7 +670,6 @@ EPres; Y                              ; Yes                              ; T
 
 # Equivalent_Unified_Ideograph (EqUIdeo)
 
-# @missing: 0000..10FFFF; Equivalent_Unified_Ideograph; <none>
 
 # Expands_On_NFC (XO_NFC)
 
@@ -1143,7 +1149,6 @@ NFD_QC; Y                             ; Yes
 
 # NFKC_Casefold (NFKC_CF)
 
-# @missing: 0000..10FFFF; NFKC_Casefold; <code point>
 
 # NFKC_Quick_Check (NFKC_QC)
 
@@ -1313,6 +1318,7 @@ sc ; Ital                             ; Old_Italic
 sc ; Java                             ; Javanese
 sc ; Kali                             ; Kayah_Li
 sc ; Kana                             ; Katakana
+sc ; Kawi                             ; Kawi
 sc ; Khar                             ; Kharoshthi
 sc ; Khmr                             ; Khmer
 sc ; Khoj                             ; Khojki
@@ -1345,6 +1351,7 @@ sc ; Mroo                             ; Mro
 sc ; Mtei                             ; Meetei_Mayek
 sc ; Mult                             ; Multani
 sc ; Mymr                             ; Myanmar
+sc ; Nagm                             ; Nag_Mundari
 sc ; Nand                             ; Nandinagari
 sc ; Narb                             ; Old_North_Arabian
 sc ; Nbat                             ; Nabataean
@@ -1418,7 +1425,6 @@ sc ; Zzzz                             ; Unknown
 
 # Script_Extensions (scx)
 
-# @missing: 0000..10FFFF; Script_Extensions; <script>
 
 # Sentence_Break (SB)
 
index 3e4b429..2de24e2 100644 (file)
@@ -1,11 +1,11 @@
-# PropertyAliases-14.0.0.txt
-# Date: 2021-03-08, 19:35:48 GMT
-# © 2021 Unicode®, Inc.
+# PropertyAliases-15.0.0.txt
+# Date: 2022-02-02, 23:35:44 GMT
+# © 2022 Unicode®, Inc.
 # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
-# For terms of use, see http://www.unicode.org/terms_of_use.html
+# For terms of use, see https://www.unicode.org/terms_of_use.html
 #
 # Unicode Character Database
-#   For documentation, see http://www.unicode.org/reports/tr44/
+#   For documentation, see https://www.unicode.org/reports/tr44/
 #
 # This file contains aliases for properties used in the UCD.
 # These names can be used for XML formats of UCD data, for regular-expression
index e7c080f..f8fd7bb 100644 (file)
@@ -1,6 +1,6 @@
 # Unicode Character Database
-# Date: 2021-09-10, 17:22:00 GMT [KW]
-# © 2021 Unicode®, Inc.
+# Date: 2022-09-02
+# © 2022 Unicode®, Inc.
 # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
 # For terms of use, see https://www.unicode.org/terms_of_use.html
 #
@@ -10,7 +10,7 @@
 # UAX #44, "Unicode Character Database"
 # UTS #51, "Unicode Emoji"
 #
-# The UAXes and UTS #51 can be accessed at https://www.unicode.org/versions/Unicode14.0.0/
+# The UAXes and UTS #51 can be accessed at https://www.unicode.org/versions/Unicode15.0.0/
 
 This directory contains the final data files
-for the Unicode Character Database, for Version 14.0.0 of the Unicode Standard.
+for the Unicode Character Database, for Version 15.0.0 of the Unicode Standard.
index 3f5cd1c..2f5a172 100644 (file)
@@ -1,11 +1,11 @@
-# ScriptExtensions-14.0.0.txt
-# Date: 2021-06-04, 02:19:38 GMT
-# © 2021 Unicode®, Inc.
+# ScriptExtensions-15.0.0.txt
+# Date: 2022-02-02, 00:57:11 GMT
+# © 2022 Unicode®, Inc.
 # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
-# For terms of use, see http://www.unicode.org/terms_of_use.html
+# For terms of use, see https://www.unicode.org/terms_of_use.html
 #
 # Unicode Character Database
-#   For documentation, see http://www.unicode.org/reports/tr44/
+#   For documentation, see https://www.unicode.org/reports/tr44/
 #
 # The Script_Extensions property indicates which characters are commonly used
 # with more than one script, but with a limited number of scripts.
index a138373..2b138bf 100644 (file)
@@ -1,11 +1,11 @@
-# Scripts-14.0.0.txt
-# Date: 2021-07-10, 00:35:31 GMT
-# © 2021 Unicode®, Inc.
+# Scripts-15.0.0.txt
+# Date: 2022-04-26, 23:15:02 GMT
+# © 2022 Unicode®, Inc.
 # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
-# For terms of use, see http://www.unicode.org/terms_of_use.html
+# For terms of use, see https://www.unicode.org/terms_of_use.html
 #
 # Unicode Character Database
-#   For documentation, see http://www.unicode.org/reports/tr44/
+#   For documentation, see https://www.unicode.org/reports/tr44/
 # For more information, see:
 #   UAX #24, Unicode Script Property: https://www.unicode.org/reports/tr24/
 #     Especially the sections:
@@ -532,6 +532,7 @@ FFFC..FFFD    ; Common # So   [2] OBJECT REPLACEMENT CHARACTER..REPLACEMENT CHAR
 1D183..1D184  ; Common # So   [2] MUSICAL SYMBOL ARPEGGIATO UP..MUSICAL SYMBOL ARPEGGIATO DOWN
 1D18C..1D1A9  ; Common # So  [30] MUSICAL SYMBOL RINFORZANDO..MUSICAL SYMBOL DEGREE SLASH
 1D1AE..1D1EA  ; Common # So  [61] MUSICAL SYMBOL PEDAL MARK..MUSICAL SYMBOL KORON
+1D2C0..1D2D3  ; Common # No  [20] KAKTOVIK NUMERAL ZERO..KAKTOVIK NUMERAL NINETEEN
 1D2E0..1D2F3  ; Common # No  [20] MAYAN NUMERAL ZERO..MAYAN NUMERAL NINETEEN
 1D300..1D356  ; Common # So  [87] MONOGRAM FOR EARTH..TETRAGRAM FOR FOSTERING
 1D360..1D378  ; Common # No  [25] COUNTING ROD UNIT DIGIT ONE..TALLY MARK FIVE
@@ -601,10 +602,10 @@ FFFC..FFFD    ; Common # So   [2] OBJECT REPLACEMENT CHARACTER..REPLACEMENT CHAR
 1F300..1F3FA  ; Common # So [251] CYCLONE..AMPHORA
 1F3FB..1F3FF  ; Common # Sk   [5] EMOJI MODIFIER FITZPATRICK TYPE-1-2..EMOJI MODIFIER FITZPATRICK TYPE-6
 1F400..1F6D7  ; Common # So [728] RAT..ELEVATOR
-1F6DD..1F6EC  ; Common # So  [16] PLAYGROUND SLIDE..AIRPLANE ARRIVING
+1F6DC..1F6EC  ; Common # So  [17] WIRELESS..AIRPLANE ARRIVING
 1F6F0..1F6FC  ; Common # So  [13] SATELLITE..ROLLER SKATE
-1F700..1F773  ; Common # So [116] ALCHEMICAL SYMBOL FOR QUINTESSENCE..ALCHEMICAL SYMBOL FOR HALF OUNCE
-1F780..1F7D8  ; Common # So  [89] BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE..NEGATIVE CIRCLED SQUARE
+1F700..1F776  ; Common # So [119] ALCHEMICAL SYMBOL FOR QUINTESSENCE..LUNAR ECLIPSE
+1F77B..1F7D9  ; Common # So  [95] HAUMEA..NINE POINTED WHITE STAR
 1F7E0..1F7EB  ; Common # So  [12] LARGE ORANGE CIRCLE..LARGE BROWN SQUARE
 1F7F0         ; Common # So       HEAVY EQUALS SIGN
 1F800..1F80B  ; Common # So  [12] LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD..DOWNWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD
@@ -615,22 +616,20 @@ FFFC..FFFD    ; Common # So   [2] OBJECT REPLACEMENT CHARACTER..REPLACEMENT CHAR
 1F8B0..1F8B1  ; Common # So   [2] ARROW POINTING UPWARDS THEN NORTH WEST..ARROW POINTING RIGHTWARDS THEN CURVING SOUTH WEST
 1F900..1FA53  ; Common # So [340] CIRCLED CROSS FORMEE WITH FOUR DOTS..BLACK CHESS KNIGHT-BISHOP
 1FA60..1FA6D  ; Common # So  [14] XIANGQI RED GENERAL..XIANGQI BLACK SOLDIER
-1FA70..1FA74  ; Common # So   [5] BALLET SHOES..THONG SANDAL
-1FA78..1FA7C  ; Common # So   [5] DROP OF BLOOD..CRUTCH
-1FA80..1FA86  ; Common # So   [7] YO-YO..NESTING DOLLS
-1FA90..1FAAC  ; Common # So  [29] RINGED PLANET..HAMSA
-1FAB0..1FABA  ; Common # So  [11] FLY..NEST WITH EGGS
-1FAC0..1FAC5  ; Common # So   [6] ANATOMICAL HEART..PERSON WITH CROWN
-1FAD0..1FAD9  ; Common # So  [10] BLUEBERRIES..JAR
-1FAE0..1FAE7  ; Common # So   [8] MELTING FACE..BUBBLES
-1FAF0..1FAF6  ; Common # So   [7] HAND WITH INDEX FINGER AND THUMB CROSSED..HEART HANDS
+1FA70..1FA7C  ; Common # So  [13] BALLET SHOES..CRUTCH
+1FA80..1FA88  ; Common # So   [9] YO-YO..FLUTE
+1FA90..1FABD  ; Common # So  [46] RINGED PLANET..WING
+1FABF..1FAC5  ; Common # So   [7] GOOSE..PERSON WITH CROWN
+1FACE..1FADB  ; Common # So  [14] MOOSE..PEA POD
+1FAE0..1FAE8  ; Common # So   [9] MELTING FACE..SHAKING FACE
+1FAF0..1FAF8  ; Common # So   [9] HAND WITH INDEX FINGER AND THUMB CROSSED..RIGHTWARDS PUSHING HAND
 1FB00..1FB92  ; Common # So [147] BLOCK SEXTANT-1..UPPER HALF INVERSE MEDIUM SHADE AND LOWER HALF BLOCK
 1FB94..1FBCA  ; Common # So  [55] LEFT HALF INVERSE MEDIUM SHADE AND RIGHT HALF BLOCK..WHITE UP-POINTING CHEVRON
 1FBF0..1FBF9  ; Common # Nd  [10] SEGMENTED DIGIT ZERO..SEGMENTED DIGIT NINE
 E0001         ; Common # Cf       LANGUAGE TAG
 E0020..E007F  ; Common # Cf  [96] TAG SPACE..CANCEL TAG
 
-# Total code points: 8252
+# Total code points: 8301
 
 # ================================================
 
@@ -697,8 +696,9 @@ FF41..FF5A    ; Latin # L&  [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN
 1DF00..1DF09  ; Latin # L&  [10] LATIN SMALL LETTER FENG DIGRAPH WITH TRILL..LATIN SMALL LETTER T WITH HOOK AND RETROFLEX HOOK
 1DF0A         ; Latin # Lo       LATIN LETTER RETROFLEX CLICK WITH RETROFLEX HOOK
 1DF0B..1DF1E  ; Latin # L&  [20] LATIN SMALL LETTER ESH WITH DOUBLE BAR..LATIN SMALL LETTER S WITH CURL
+1DF25..1DF2A  ; Latin # L&   [6] LATIN SMALL LETTER D WITH MID-HEIGHT LEFT HOOK..LATIN SMALL LETTER T WITH MID-HEIGHT LEFT HOOK
 
-# Total code points: 1475
+# Total code points: 1481
 
 # ================================================
 
@@ -784,8 +784,10 @@ A680..A69B    ; Cyrillic # L&  [28] CYRILLIC CAPITAL LETTER DWE..CYRILLIC SMALL
 A69C..A69D    ; Cyrillic # Lm   [2] MODIFIER LETTER CYRILLIC HARD SIGN..MODIFIER LETTER CYRILLIC SOFT SIGN
 A69E..A69F    ; Cyrillic # Mn   [2] COMBINING CYRILLIC LETTER EF..COMBINING CYRILLIC LETTER IOTIFIED E
 FE2E..FE2F    ; Cyrillic # Mn   [2] COMBINING CYRILLIC TITLO LEFT HALF..COMBINING CYRILLIC TITLO RIGHT HALF
+1E030..1E06D  ; Cyrillic # Lm  [62] MODIFIER LETTER CYRILLIC SMALL A..MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE
+1E08F         ; Cyrillic # Mn       COMBINING CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
 
-# Total code points: 443
+# Total code points: 506
 
 # ================================================
 
@@ -883,6 +885,7 @@ FDFD..FDFF    ; Arabic # So   [3] ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM.
 FE70..FE74    ; Arabic # Lo   [5] ARABIC FATHATAN ISOLATED FORM..ARABIC KASRATAN ISOLATED FORM
 FE76..FEFC    ; Arabic # Lo [135] ARABIC FATHA ISOLATED FORM..ARABIC LIGATURE LAM WITH ALEF FINAL FORM
 10E60..10E7E  ; Arabic # No  [31] RUMI DIGIT ONE..RUMI FRACTION TWO THIRDS
+10EFD..10EFF  ; Arabic # Mn   [3] ARABIC SMALL LOW WORD SAKTA..ARABIC SMALL LOW WORD MADDA
 1EE00..1EE03  ; Arabic # Lo   [4] ARABIC MATHEMATICAL ALEF..ARABIC MATHEMATICAL DAL
 1EE05..1EE1F  ; Arabic # Lo  [27] ARABIC MATHEMATICAL WAW..ARABIC MATHEMATICAL DOTLESS QAF
 1EE21..1EE22  ; Arabic # Lo   [2] ARABIC MATHEMATICAL INITIAL BEH..ARABIC MATHEMATICAL INITIAL JEEM
@@ -918,7 +921,7 @@ FE76..FEFC    ; Arabic # Lo [135] ARABIC FATHA ISOLATED FORM..ARABIC LIGATURE LA
 1EEAB..1EEBB  ; Arabic # Lo  [17] ARABIC MATHEMATICAL DOUBLE-STRUCK LAM..ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN
 1EEF0..1EEF1  ; Arabic # Sm   [2] ARABIC MATHEMATICAL OPERATOR MEEM WITH HAH WITH TATWEEL..ARABIC MATHEMATICAL OPERATOR HAH WITH DAL
 
-# Total code points: 1365
+# Total code points: 1368
 
 # ================================================
 
@@ -970,8 +973,9 @@ A8FB          ; Devanagari # Lo       DEVANAGARI HEADSTROKE
 A8FC          ; Devanagari # Po       DEVANAGARI SIGN SIDDHAM
 A8FD..A8FE    ; Devanagari # Lo   [2] DEVANAGARI JAIN OM..DEVANAGARI LETTER AY
 A8FF          ; Devanagari # Mn       DEVANAGARI VOWEL SIGN AY
+11B00..11B09  ; Devanagari # Po  [10] DEVANAGARI HEAD MARK..DEVANAGARI SIGN MINDU
 
-# Total code points: 154
+# Total code points: 164
 
 # ================================================
 
@@ -1182,8 +1186,9 @@ A8FF          ; Devanagari # Mn       DEVANAGARI VOWEL SIGN AY
 0CE2..0CE3    ; Kannada # Mn   [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL
 0CE6..0CEF    ; Kannada # Nd  [10] KANNADA DIGIT ZERO..KANNADA DIGIT NINE
 0CF1..0CF2    ; Kannada # Lo   [2] KANNADA SIGN JIHVAMULIYA..KANNADA SIGN UPADHMANIYA
+0CF3          ; Kannada # Mc       KANNADA SIGN COMBINING ANUSVARA ABOVE RIGHT
 
-# Total code points: 90
+# Total code points: 91
 
 # ================================================
 
@@ -1263,11 +1268,11 @@ A8FF          ; Devanagari # Mn       DEVANAGARI VOWEL SIGN AY
 0EBD          ; Lao # Lo       LAO SEMIVOWEL SIGN NYO
 0EC0..0EC4    ; Lao # Lo   [5] LAO VOWEL SIGN E..LAO VOWEL SIGN AI
 0EC6          ; Lao # Lm       LAO KO LA
-0EC8..0ECD    ; Lao # Mn   [6] LAO TONE MAI EK..LAO NIGGAHITA
+0EC8..0ECE    ; Lao # Mn   [7] LAO TONE MAI EK..LAO YAMAKKAN
 0ED0..0ED9    ; Lao # Nd  [10] LAO DIGIT ZERO..LAO DIGIT NINE
 0EDC..0EDF    ; Lao # Lo   [4] LAO HO NO..LAO LETTER KHMU NYO
 
-# Total code points: 82
+# Total code points: 83
 
 # ================================================
 
@@ -1532,10 +1537,11 @@ AB70..ABBF    ; Cherokee # L&  [80] CHEROKEE SMALL LETTER A..CHEROKEE SMALL LETT
 309D..309E    ; Hiragana # Lm   [2] HIRAGANA ITERATION MARK..HIRAGANA VOICED ITERATION MARK
 309F          ; Hiragana # Lo       HIRAGANA DIGRAPH YORI
 1B001..1B11F  ; Hiragana # Lo [287] HIRAGANA LETTER ARCHAIC YE..HIRAGANA LETTER ARCHAIC WU
+1B132         ; Hiragana # Lo       HIRAGANA LETTER SMALL KO
 1B150..1B152  ; Hiragana # Lo   [3] HIRAGANA LETTER SMALL WI..HIRAGANA LETTER SMALL WO
 1F200         ; Hiragana # So       SQUARE HIRAGANA HOKA
 
-# Total code points: 380
+# Total code points: 381
 
 # ================================================
 
@@ -1552,9 +1558,10 @@ FF71..FF9D    ; Katakana # Lo  [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAK
 1AFFD..1AFFE  ; Katakana # Lm   [2] KATAKANA LETTER MINNAN NASALIZED TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-8
 1B000         ; Katakana # Lo       KATAKANA LETTER ARCHAIC E
 1B120..1B122  ; Katakana # Lo   [3] KATAKANA LETTER ARCHAIC YI..KATAKANA LETTER ARCHAIC WU
+1B155         ; Katakana # Lo       KATAKANA LETTER SMALL KO
 1B164..1B167  ; Katakana # Lo   [4] KATAKANA LETTER SMALL WI..KATAKANA LETTER SMALL N
 
-# Total code points: 320
+# Total code points: 321
 
 # ================================================
 
@@ -1582,14 +1589,15 @@ FA70..FAD9    ; Han # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COMPATIBILI
 16FE3         ; Han # Lm       OLD CHINESE ITERATION MARK
 16FF0..16FF1  ; Han # Mc   [2] VIETNAMESE ALTERNATE READING MARK CA..VIETNAMESE ALTERNATE READING MARK NHAY
 20000..2A6DF  ; Han # Lo [42720] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6DF
-2A700..2B738  ; Han # Lo [4153] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B738
+2A700..2B739  ; Han # Lo [4154] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B739
 2B740..2B81D  ; Han # Lo [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D
 2B820..2CEA1  ; Han # Lo [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1
 2CEB0..2EBE0  ; Han # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0
 2F800..2FA1D  ; Han # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D
 30000..3134A  ; Han # Lo [4939] CJK UNIFIED IDEOGRAPH-30000..CJK UNIFIED IDEOGRAPH-3134A
+31350..323AF  ; Han # Lo [4192] CJK UNIFIED IDEOGRAPH-31350..CJK UNIFIED IDEOGRAPH-323AF
 
-# Total code points: 94215
+# Total code points: 98408
 
 # ================================================
 
@@ -2093,10 +2101,13 @@ AADE..AADF    ; Tai_Viet # Po   [2] TAI VIET SYMBOL HO HOI..TAI VIET SYMBOL KOI
 
 # ================================================
 
-13000..1342E  ; Egyptian_Hieroglyphs # Lo [1071] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH AA032
-13430..13438  ; Egyptian_Hieroglyphs # Cf   [9] EGYPTIAN HIEROGLYPH VERTICAL JOINER..EGYPTIAN HIEROGLYPH END SEGMENT
+13000..1342F  ; Egyptian_Hieroglyphs # Lo [1072] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH V011D
+13430..1343F  ; Egyptian_Hieroglyphs # Cf  [16] EGYPTIAN HIEROGLYPH VERTICAL JOINER..EGYPTIAN HIEROGLYPH END WALLED ENCLOSURE
+13440         ; Egyptian_Hieroglyphs # Mn       EGYPTIAN HIEROGLYPH MIRROR HORIZONTALLY
+13441..13446  ; Egyptian_Hieroglyphs # Lo   [6] EGYPTIAN HIEROGLYPH FULL BLANK..EGYPTIAN HIEROGLYPH WIDE LOST SIGN
+13447..13455  ; Egyptian_Hieroglyphs # Mn  [15] EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP START..EGYPTIAN HIEROGLYPH MODIFIER DAMAGED
 
-# Total code points: 1080
+# Total code points: 1110
 
 # ================================================
 
@@ -2440,8 +2451,10 @@ ABF0..ABF9    ; Meetei_Mayek # Nd  [10] MEETEI MAYEK DIGIT ZERO..MEETEI MAYEK DI
 11236..11237  ; Khojki # Mn   [2] KHOJKI SIGN NUKTA..KHOJKI SIGN SHADDA
 11238..1123D  ; Khojki # Po   [6] KHOJKI DANDA..KHOJKI ABBREVIATION SIGN
 1123E         ; Khojki # Mn       KHOJKI SIGN SUKUN
+1123F..11240  ; Khojki # Lo   [2] KHOJKI LETTER QA..KHOJKI LETTER SHORT I
+11241         ; Khojki # Mn       KHOJKI VOWEL SIGN VOCALIC R
 
-# Total code points: 62
+# Total code points: 65
 
 # ================================================
 
@@ -2988,4 +3001,31 @@ ABF0..ABF9    ; Meetei_Mayek # Nd  [10] MEETEI MAYEK DIGIT ZERO..MEETEI MAYEK DI
 
 # Total code points: 70
 
+# ================================================
+
+11F00..11F01  ; Kawi # Mn   [2] KAWI SIGN CANDRABINDU..KAWI SIGN ANUSVARA
+11F02         ; Kawi # Lo       KAWI SIGN REPHA
+11F03         ; Kawi # Mc       KAWI SIGN VISARGA
+11F04..11F10  ; Kawi # Lo  [13] KAWI LETTER A..KAWI LETTER O
+11F12..11F33  ; Kawi # Lo  [34] KAWI LETTER KA..KAWI LETTER JNYA
+11F34..11F35  ; Kawi # Mc   [2] KAWI VOWEL SIGN AA..KAWI VOWEL SIGN ALTERNATE AA
+11F36..11F3A  ; Kawi # Mn   [5] KAWI VOWEL SIGN I..KAWI VOWEL SIGN VOCALIC R
+11F3E..11F3F  ; Kawi # Mc   [2] KAWI VOWEL SIGN E..KAWI VOWEL SIGN AI
+11F40         ; Kawi # Mn       KAWI VOWEL SIGN EU
+11F41         ; Kawi # Mc       KAWI SIGN KILLER
+11F42         ; Kawi # Mn       KAWI CONJOINER
+11F43..11F4F  ; Kawi # Po  [13] KAWI DANDA..KAWI PUNCTUATION CLOSING SPIRAL
+11F50..11F59  ; Kawi # Nd  [10] KAWI DIGIT ZERO..KAWI DIGIT NINE
+
+# Total code points: 86
+
+# ================================================
+
+1E4D0..1E4EA  ; Nag_Mundari # Lo  [27] NAG MUNDARI LETTER O..NAG MUNDARI LETTER ELL
+1E4EB         ; Nag_Mundari # Lm       NAG MUNDARI SIGN OJOD
+1E4EC..1E4EF  ; Nag_Mundari # Mn   [4] NAG MUNDARI SIGN MUHOR..NAG MUNDARI SIGN SUTUH
+1E4F0..1E4F9  ; Nag_Mundari # Nd  [10] NAG MUNDARI DIGIT ZERO..NAG MUNDARI DIGIT NINE
+
+# Total code points: 42
+
 # EOF
index 1c2e968..08d04fa 100644 (file)
@@ -1,11 +1,11 @@
-# SpecialCasing-14.0.0.txt
-# Date: 2021-03-08, 19:35:55 GMT
-# © 2021 Unicode®, Inc.
+# SpecialCasing-15.0.0.txt
+# Date: 2022-02-02, 23:35:52 GMT
+# © 2022 Unicode®, Inc.
 # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
-# For terms of use, see http://www.unicode.org/terms_of_use.html
+# For terms of use, see https://www.unicode.org/terms_of_use.html
 #
 # Unicode Character Database
-#   For documentation, see http://www.unicode.org/reports/tr44/
+#   For documentation, see https://www.unicode.org/reports/tr44/
 #
 # Special Casing
 #
index 5c3c014..f98a596 100644 (file)
@@ -1,6 +1,6 @@
-# StandardizedVariants-14.0.0.txt
-# Date: 2021-01-26, 18:20:00 GMT [KW, LI, RP]
-# © 2021 Unicode®, Inc.
+# StandardizedVariants-15.0.0.txt
+# Date: 2022-08-16, 19:08:00 GMT [KW]
+# © 2022 Unicode®, Inc.
 # For terms of use, see https://www.unicode.org/terms_of_use.html
 #
 # Specification of the variation sequences that are defined in the
@@ -26,7 +26,7 @@
 #
 # For more information on standardized variation sequences,
 # see Section 23.4, Variation Selectors,
-# in The Unicode Standard, Version 14.0.
+# in The Unicode Standard, Version 15.0.
 #
 # For more information on the Ideographic Variation Database,
 # see https://www.unicode.org/ivd/
@@ -262,6 +262,113 @@ A868 FE00; phags-pa letter reversed shaping subjoined ya; # PHAGS-PA SUBJOINED L
 1888 180B; second form; final # MONGOLIAN LETTER ALI GALI I
 188A 180B; second form; initial medial # MONGOLIAN LETTER ALI GALI NGA
 
+# Egyptian hieroglyph rotational variants
+
+# Rotations are clockwise for when rendered normally as left-to-right.
+# Rotations are counter-clockwise when text is mirrored right-to-left.
+
+13091 FE00; rotated 90 degrees; # EGYPTIAN HIEROGLYPH D027
+13092 FE00; rotated 90 degrees; # EGYPTIAN HIEROGLYPH D027A
+13093 FE01; rotated 180 degrees; # EGYPTIAN HIEROGLYPH D028
+130A9 FE01; rotated 180 degrees; # EGYPTIAN HIEROGLYPH D047
+1310F FE00; rotated 90 degrees; # EGYPTIAN HIEROGLYPH F016
+13117 FE02; rotated 270 degrees; # EGYPTIAN HIEROGLYPH F023
+1311C FE00; rotated 90 degrees; # EGYPTIAN HIEROGLYPH F028
+13121 FE00; rotated 90 degrees; # EGYPTIAN HIEROGLYPH F032
+13127 FE00; rotated 90 degrees; # EGYPTIAN HIEROGLYPH F037A
+13139 FE00; rotated 90 degrees; # EGYPTIAN HIEROGLYPH F051
+13139 FE02; rotated 270 degrees; # EGYPTIAN HIEROGLYPH F051
+13183 FE02; rotated 270 degrees; # EGYPTIAN HIEROGLYPH H005
+13187 FE01; rotated 180 degrees; # EGYPTIAN HIEROGLYPH H008
+131A0 FE00; rotated 90 degrees; # EGYPTIAN HIEROGLYPH K006
+131A0 FE02; rotated 270 degrees; # EGYPTIAN HIEROGLYPH K006
+131B1 FE00; rotated 90 degrees; # EGYPTIAN HIEROGLYPH M003
+131B1 FE01; rotated 180 degrees; # EGYPTIAN HIEROGLYPH M003
+131B8 FE00; rotated 90 degrees; # EGYPTIAN HIEROGLYPH M009
+131B9 FE00; rotated 90 degrees; # EGYPTIAN HIEROGLYPH M010
+131BA FE02; rotated 270 degrees; # EGYPTIAN HIEROGLYPH M010A
+131CB FE00; rotated 90 degrees; # EGYPTIAN HIEROGLYPH M017
+131EE FE01; rotated 180 degrees; # EGYPTIAN HIEROGLYPH M044
+131EE FE02; rotated 270 degrees; # EGYPTIAN HIEROGLYPH M044
+131F8 FE01; rotated 180 degrees; # EGYPTIAN HIEROGLYPH N010
+131F9 FE00; rotated 90 degrees; # EGYPTIAN HIEROGLYPH N011
+131F9 FE01; rotated 180 degrees; # EGYPTIAN HIEROGLYPH N011
+131FA FE00; rotated 90 degrees; # EGYPTIAN HIEROGLYPH N012
+131FA FE01; rotated 180 degrees; # EGYPTIAN HIEROGLYPH N012
+13216 FE02; rotated 270 degrees; # EGYPTIAN HIEROGLYPH N035
+13257 FE01; rotated 180 degrees; # EGYPTIAN HIEROGLYPH O006
+1327B FE02; rotated 270 degrees; # EGYPTIAN HIEROGLYPH O029
+1327F FE00; rotated 90 degrees; # EGYPTIAN HIEROGLYPH O031
+1327F FE01; rotated 180 degrees; # EGYPTIAN HIEROGLYPH O031
+13285 FE00; rotated 90 degrees; # EGYPTIAN HIEROGLYPH O036
+1328C FE00; rotated 90 degrees; # EGYPTIAN HIEROGLYPH O039
+132A4 FE01; rotated 180 degrees; # EGYPTIAN HIEROGLYPH P008
+132A4 FE02; rotated 270 degrees; # EGYPTIAN HIEROGLYPH P008
+132AA FE00; rotated 90 degrees; # EGYPTIAN HIEROGLYPH Q003
+132CB FE00; rotated 90 degrees; # EGYPTIAN HIEROGLYPH R024
+132DC FE00; rotated 90 degrees; # EGYPTIAN HIEROGLYPH S010
+132E7 FE00; rotated 90 degrees; # EGYPTIAN HIEROGLYPH S018
+132E7 FE02; rotated 270 degrees; # EGYPTIAN HIEROGLYPH S018
+132E9 FE02; rotated 270 degrees; # EGYPTIAN HIEROGLYPH S020
+132F8 FE02; rotated 270 degrees; # EGYPTIAN HIEROGLYPH S033
+132FD FE02; rotated 270 degrees; # EGYPTIAN HIEROGLYPH S037
+13302 FE02; rotated 270 degrees; # EGYPTIAN HIEROGLYPH S042
+13303 FE02; rotated 270 degrees; # EGYPTIAN HIEROGLYPH S043
+13307 FE00; rotated 90 degrees; # EGYPTIAN HIEROGLYPH T001
+13308 FE01; rotated 180 degrees; # EGYPTIAN HIEROGLYPH T002
+13310 FE02; rotated 270 degrees; # EGYPTIAN HIEROGLYPH T008
+13311 FE02; rotated 270 degrees; # EGYPTIAN HIEROGLYPH T008A
+13312 FE01; rotated 180 degrees; # EGYPTIAN HIEROGLYPH T009
+13312 FE02; rotated 270 degrees; # EGYPTIAN HIEROGLYPH T009
+13313 FE01; rotated 180 degrees; # EGYPTIAN HIEROGLYPH T009A
+13313 FE02; rotated 270 degrees; # EGYPTIAN HIEROGLYPH T009A
+13314 FE01; rotated 180 degrees; # EGYPTIAN HIEROGLYPH T010
+13314 FE02; rotated 270 degrees; # EGYPTIAN HIEROGLYPH T010
+1331B FE00; rotated 90 degrees; # EGYPTIAN HIEROGLYPH T016
+1331B FE01; rotated 180 degrees; # EGYPTIAN HIEROGLYPH T016
+1331C FE02; rotated 270 degrees; # EGYPTIAN HIEROGLYPH T016A
+13321 FE01; rotated 180 degrees; # EGYPTIAN HIEROGLYPH T021
+13321 FE02; rotated 270 degrees; # EGYPTIAN HIEROGLYPH T021
+13322 FE00; rotated 90 degrees; # EGYPTIAN HIEROGLYPH T022
+13322 FE01; rotated 180 degrees; # EGYPTIAN HIEROGLYPH T022
+13331 FE01; rotated 180 degrees; # EGYPTIAN HIEROGLYPH T035
+13331 FE02; rotated 270 degrees; # EGYPTIAN HIEROGLYPH T035
+1333B FE00; rotated 90 degrees; # EGYPTIAN HIEROGLYPH U007
+1333C FE00; rotated 90 degrees; # EGYPTIAN HIEROGLYPH U008
+1334A FE02; rotated 270 degrees; # EGYPTIAN HIEROGLYPH U022
+13361 FE02; rotated 270 degrees; # EGYPTIAN HIEROGLYPH U042
+13373 FE02; rotated 270 degrees; # EGYPTIAN HIEROGLYPH V007A
+13377 FE00; rotated 90 degrees; # EGYPTIAN HIEROGLYPH V010
+13378 FE00; rotated 90 degrees; # EGYPTIAN HIEROGLYPH V011
+1337D FE02; rotated 270 degrees; # EGYPTIAN HIEROGLYPH V012A
+13385 FE02; rotated 270 degrees; # EGYPTIAN HIEROGLYPH V019
+13399 FE00; rotated 90 degrees; # EGYPTIAN HIEROGLYPH V026
+1339A FE00; rotated 90 degrees; # EGYPTIAN HIEROGLYPH V027
+133AF FE02; rotated 270 degrees; # EGYPTIAN HIEROGLYPH W001
+133B0 FE02; rotated 270 degrees; # EGYPTIAN HIEROGLYPH W002
+133BF FE02; rotated 270 degrees; # EGYPTIAN HIEROGLYPH W014
+133D3 FE00; rotated 90 degrees; # EGYPTIAN HIEROGLYPH X004A
+133DD FE02; rotated 270 degrees; # EGYPTIAN HIEROGLYPH Y002
+133F2 FE00; rotated 90 degrees; # EGYPTIAN HIEROGLYPH Z007
+133F5 FE00; rotated 90 degrees; # EGYPTIAN HIEROGLYPH Z010
+133F6 FE00; rotated 90 degrees; # EGYPTIAN HIEROGLYPH Z011
+13403 FE00; rotated 90 degrees; # EGYPTIAN HIEROGLYPH Z015I
+13416 FE00; rotated 90 degrees; # EGYPTIAN HIEROGLYPH AA008
+13419 FE00; rotated 90 degrees; # EGYPTIAN HIEROGLYPH AA011
+13419 FE01; rotated 180 degrees; # EGYPTIAN HIEROGLYPH AA011
+13419 FE02; rotated 270 degrees; # EGYPTIAN HIEROGLYPH AA011
+1341A FE00; rotated 90 degrees; # EGYPTIAN HIEROGLYPH AA012
+13423 FE00; rotated 90 degrees; # EGYPTIAN HIEROGLYPH AA021
+1342C FE02; rotated 270 degrees; # EGYPTIAN HIEROGLYPH AA030
+1342E FE02; rotated 270 degrees; # EGYPTIAN HIEROGLYPH AA032
+
+# Egyptian hieroglyph expanded variants
+
+13443 FE00; expanded ; # EGYPTIAN HIEROGLYPH LOST SIGN
+13444 FE00; expanded ; # EGYPTIAN HIEROGLYPH HALF LOST SIGN
+13445 FE00; expanded ; # EGYPTIAN HIEROGLYPH TALL LOST SIGN
+13446 FE00; expanded ; # EGYPTIAN HIEROGLYPH WIDE LOST SIGN
+
 # CJK compatibility ideographs
 
 # Note: In the entries for CJK compatibility ideographs, field 1
index b5abef7..ea963a7 100644 (file)
 0CEF;KANNADA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
 0CF1;KANNADA SIGN JIHVAMULIYA;Lo;0;L;;;;;N;;;;;
 0CF2;KANNADA SIGN UPADHMANIYA;Lo;0;L;;;;;N;;;;;
+0CF3;KANNADA SIGN COMBINING ANUSVARA ABOVE RIGHT;Mc;0;L;;;;;N;;;;;
 0D00;MALAYALAM SIGN COMBINING ANUSVARA ABOVE;Mn;0;NSM;;;;;N;;;;;
 0D01;MALAYALAM SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;;
 0D02;MALAYALAM SIGN ANUSVARA;Mc;0;L;;;;;N;;;;;
 0ECB;LAO TONE MAI CATAWA;Mn;122;NSM;;;;;N;;;;;
 0ECC;LAO CANCELLATION MARK;Mn;0;NSM;;;;;N;;;;;
 0ECD;LAO NIGGAHITA;Mn;0;NSM;;;;;N;;;;;
+0ECE;LAO YAMAKKAN;Mn;0;NSM;;;;;N;;;;;
 0ED0;LAO DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
 0ED1;LAO DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
 0ED2;LAO DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
@@ -19393,6 +19395,9 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
 10EAD;YEZIDI HYPHENATION MARK;Pd;0;R;;;;;N;;;;;
 10EB0;YEZIDI LETTER LAM WITH DOT ABOVE;Lo;0;R;;;;;N;;;;;
 10EB1;YEZIDI LETTER YOT WITH CIRCUMFLEX ABOVE;Lo;0;R;;;;;N;;;;;
+10EFD;ARABIC SMALL LOW WORD SAKTA;Mn;220;NSM;;;;;N;;;;;
+10EFE;ARABIC SMALL LOW WORD QASR;Mn;220;NSM;;;;;N;;;;;
+10EFF;ARABIC SMALL LOW WORD MADDA;Mn;220;NSM;;;;;N;;;;;
 10F00;OLD SOGDIAN LETTER ALEPH;Lo;0;R;;;;;N;;;;;
 10F01;OLD SOGDIAN LETTER FINAL ALEPH;Lo;0;R;;;;;N;;;;;
 10F02;OLD SOGDIAN LETTER BETH;Lo;0;R;;;;;N;;;;;
@@ -20058,6 +20063,9 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
 1123C;KHOJKI DOUBLE SECTION MARK;Po;0;L;;;;;N;;;;;
 1123D;KHOJKI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;;
 1123E;KHOJKI SIGN SUKUN;Mn;0;NSM;;;;;N;;;;;
+1123F;KHOJKI LETTER QA;Lo;0;L;;;;;N;;;;;
+11240;KHOJKI LETTER SHORT I;Lo;0;L;;;;;N;;;;;
+11241;KHOJKI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;;
 11280;MULTANI LETTER A;Lo;0;L;;;;;N;;;;;
 11281;MULTANI LETTER I;Lo;0;L;;;;;N;;;;;
 11282;MULTANI LETTER U;Lo;0;L;;;;;N;;;;;
@@ -21256,6 +21264,16 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
 11AF6;PAU CIN HAU LOW-FALLING TONE LONG FINAL;Lo;0;L;;;;;N;;;;;
 11AF7;PAU CIN HAU LOW-FALLING TONE FINAL;Lo;0;L;;;;;N;;;;;
 11AF8;PAU CIN HAU GLOTTAL STOP FINAL;Lo;0;L;;;;;N;;;;;
+11B00;DEVANAGARI HEAD MARK;Po;0;L;;;;;N;;;;;
+11B01;DEVANAGARI HEAD MARK WITH HEADSTROKE;Po;0;L;;;;;N;;;;;
+11B02;DEVANAGARI SIGN BHALE;Po;0;L;;;;;N;;;;;
+11B03;DEVANAGARI SIGN BHALE WITH HOOK;Po;0;L;;;;;N;;;;;
+11B04;DEVANAGARI SIGN EXTENDED BHALE;Po;0;L;;;;;N;;;;;
+11B05;DEVANAGARI SIGN EXTENDED BHALE WITH HOOK;Po;0;L;;;;;N;;;;;
+11B06;DEVANAGARI SIGN WESTERN FIVE-LIKE BHALE;Po;0;L;;;;;N;;;;;
+11B07;DEVANAGARI SIGN WESTERN NINE-LIKE BHALE;Po;0;L;;;;;N;;;;;
+11B08;DEVANAGARI SIGN REVERSED NINE-LIKE BHALE;Po;0;L;;;;;N;;;;;
+11B09;DEVANAGARI SIGN MINDU;Po;0;L;;;;;N;;;;;
 11C00;BHAIKSUKI LETTER A;Lo;0;L;;;;;N;;;;;
 11C01;BHAIKSUKI LETTER AA;Lo;0;L;;;;;N;;;;;
 11C02;BHAIKSUKI LETTER I;Lo;0;L;;;;;N;;;;;
@@ -21584,6 +21602,92 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
 11EF6;MAKASAR VOWEL SIGN O;Mc;0;L;;;;;N;;;;;
 11EF7;MAKASAR PASSIMBANG;Po;0;L;;;;;N;;;;;
 11EF8;MAKASAR END OF SECTION;Po;0;L;;;;;N;;;;;
+11F00;KAWI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;;
+11F01;KAWI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+11F02;KAWI SIGN REPHA;Lo;0;L;;;;;N;;;;;
+11F03;KAWI SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+11F04;KAWI LETTER A;Lo;0;L;;;;;N;;;;;
+11F05;KAWI LETTER AA;Lo;0;L;;;;;N;;;;;
+11F06;KAWI LETTER I;Lo;0;L;;;;;N;;;;;
+11F07;KAWI LETTER II;Lo;0;L;;;;;N;;;;;
+11F08;KAWI LETTER U;Lo;0;L;;;;;N;;;;;
+11F09;KAWI LETTER UU;Lo;0;L;;;;;N;;;;;
+11F0A;KAWI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+11F0B;KAWI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+11F0C;KAWI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+11F0D;KAWI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+11F0E;KAWI LETTER E;Lo;0;L;;;;;N;;;;;
+11F0F;KAWI LETTER AI;Lo;0;L;;;;;N;;;;;
+11F10;KAWI LETTER O;Lo;0;L;;;;;N;;;;;
+11F12;KAWI LETTER KA;Lo;0;L;;;;;N;;;;;
+11F13;KAWI LETTER KHA;Lo;0;L;;;;;N;;;;;
+11F14;KAWI LETTER GA;Lo;0;L;;;;;N;;;;;
+11F15;KAWI LETTER GHA;Lo;0;L;;;;;N;;;;;
+11F16;KAWI LETTER NGA;Lo;0;L;;;;;N;;;;;
+11F17;KAWI LETTER CA;Lo;0;L;;;;;N;;;;;
+11F18;KAWI LETTER CHA;Lo;0;L;;;;;N;;;;;
+11F19;KAWI LETTER JA;Lo;0;L;;;;;N;;;;;
+11F1A;KAWI LETTER JHA;Lo;0;L;;;;;N;;;;;
+11F1B;KAWI LETTER NYA;Lo;0;L;;;;;N;;;;;
+11F1C;KAWI LETTER TTA;Lo;0;L;;;;;N;;;;;
+11F1D;KAWI LETTER TTHA;Lo;0;L;;;;;N;;;;;
+11F1E;KAWI LETTER DDA;Lo;0;L;;;;;N;;;;;
+11F1F;KAWI LETTER DDHA;Lo;0;L;;;;;N;;;;;
+11F20;KAWI LETTER NNA;Lo;0;L;;;;;N;;;;;
+11F21;KAWI LETTER TA;Lo;0;L;;;;;N;;;;;
+11F22;KAWI LETTER THA;Lo;0;L;;;;;N;;;;;
+11F23;KAWI LETTER DA;Lo;0;L;;;;;N;;;;;
+11F24;KAWI LETTER DHA;Lo;0;L;;;;;N;;;;;
+11F25;KAWI LETTER NA;Lo;0;L;;;;;N;;;;;
+11F26;KAWI LETTER PA;Lo;0;L;;;;;N;;;;;
+11F27;KAWI LETTER PHA;Lo;0;L;;;;;N;;;;;
+11F28;KAWI LETTER BA;Lo;0;L;;;;;N;;;;;
+11F29;KAWI LETTER BHA;Lo;0;L;;;;;N;;;;;
+11F2A;KAWI LETTER MA;Lo;0;L;;;;;N;;;;;
+11F2B;KAWI LETTER YA;Lo;0;L;;;;;N;;;;;
+11F2C;KAWI LETTER RA;Lo;0;L;;;;;N;;;;;
+11F2D;KAWI LETTER LA;Lo;0;L;;;;;N;;;;;
+11F2E;KAWI LETTER WA;Lo;0;L;;;;;N;;;;;
+11F2F;KAWI LETTER SHA;Lo;0;L;;;;;N;;;;;
+11F30;KAWI LETTER SSA;Lo;0;L;;;;;N;;;;;
+11F31;KAWI LETTER SA;Lo;0;L;;;;;N;;;;;
+11F32;KAWI LETTER HA;Lo;0;L;;;;;N;;;;;
+11F33;KAWI LETTER JNYA;Lo;0;L;;;;;N;;;;;
+11F34;KAWI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+11F35;KAWI VOWEL SIGN ALTERNATE AA;Mc;0;L;;;;;N;;;;;
+11F36;KAWI VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+11F37;KAWI VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;;
+11F38;KAWI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+11F39;KAWI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+11F3A;KAWI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;;
+11F3E;KAWI VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+11F3F;KAWI VOWEL SIGN AI;Mc;0;L;;;;;N;;;;;
+11F40;KAWI VOWEL SIGN EU;Mn;0;NSM;;;;;N;;;;;
+11F41;KAWI SIGN KILLER;Mc;9;L;;;;;N;;;;;
+11F42;KAWI CONJOINER;Mn;9;NSM;;;;;N;;;;;
+11F43;KAWI DANDA;Po;0;L;;;;;N;;;;;
+11F44;KAWI DOUBLE DANDA;Po;0;L;;;;;N;;;;;
+11F45;KAWI PUNCTUATION SECTION MARKER;Po;0;L;;;;;N;;;;;
+11F46;KAWI PUNCTUATION ALTERNATE SECTION MARKER;Po;0;L;;;;;N;;;;;
+11F47;KAWI PUNCTUATION FLOWER;Po;0;L;;;;;N;;;;;
+11F48;KAWI PUNCTUATION SPACE FILLER;Po;0;L;;;;;N;;;;;
+11F49;KAWI PUNCTUATION DOT;Po;0;L;;;;;N;;;;;
+11F4A;KAWI PUNCTUATION DOUBLE DOT;Po;0;L;;;;;N;;;;;
+11F4B;KAWI PUNCTUATION TRIPLE DOT;Po;0;L;;;;;N;;;;;
+11F4C;KAWI PUNCTUATION CIRCLE;Po;0;L;;;;;N;;;;;
+11F4D;KAWI PUNCTUATION FILLED CIRCLE;Po;0;L;;;;;N;;;;;
+11F4E;KAWI PUNCTUATION SPIRAL;Po;0;L;;;;;N;;;;;
+11F4F;KAWI PUNCTUATION CLOSING SPIRAL;Po;0;L;;;;;N;;;;;
+11F50;KAWI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+11F51;KAWI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+11F52;KAWI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+11F53;KAWI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+11F54;KAWI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+11F55;KAWI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+11F56;KAWI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+11F57;KAWI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+11F58;KAWI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+11F59;KAWI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
 11FB0;LISU LETTER YHA;Lo;0;L;;;;;N;;;;;
 11FC0;TAMIL FRACTION ONE THREE-HUNDRED-AND-TWENTIETH;No;0;L;;;;1/320;N;;;;;
 11FC1;TAMIL FRACTION ONE ONE-HUNDRED-AND-SIXTIETH;No;0;L;;;;1/160;N;;;;;
@@ -24040,6 +24144,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
 1342C;EGYPTIAN HIEROGLYPH AA030;Lo;0;L;;;;;N;;;;;
 1342D;EGYPTIAN HIEROGLYPH AA031;Lo;0;L;;;;;N;;;;;
 1342E;EGYPTIAN HIEROGLYPH AA032;Lo;0;L;;;;;N;;;;;
+1342F;EGYPTIAN HIEROGLYPH V011D;Lo;0;L;;;;;N;;;;;
 13430;EGYPTIAN HIEROGLYPH VERTICAL JOINER;Cf;0;L;;;;;N;;;;;
 13431;EGYPTIAN HIEROGLYPH HORIZONTAL JOINER;Cf;0;L;;;;;N;;;;;
 13432;EGYPTIAN HIEROGLYPH INSERT AT TOP START;Cf;0;L;;;;;N;;;;;
@@ -24049,6 +24154,35 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
 13436;EGYPTIAN HIEROGLYPH OVERLAY MIDDLE;Cf;0;L;;;;;N;;;;;
 13437;EGYPTIAN HIEROGLYPH BEGIN SEGMENT;Cf;0;L;;;;;N;;;;;
 13438;EGYPTIAN HIEROGLYPH END SEGMENT;Cf;0;L;;;;;N;;;;;
+13439;EGYPTIAN HIEROGLYPH INSERT AT MIDDLE;Cf;0;L;;;;;N;;;;;
+1343A;EGYPTIAN HIEROGLYPH INSERT AT TOP;Cf;0;L;;;;;N;;;;;
+1343B;EGYPTIAN HIEROGLYPH INSERT AT BOTTOM;Cf;0;L;;;;;N;;;;;
+1343C;EGYPTIAN HIEROGLYPH BEGIN ENCLOSURE;Cf;0;L;;;;;N;;;;;
+1343D;EGYPTIAN HIEROGLYPH END ENCLOSURE;Cf;0;L;;;;;N;;;;;
+1343E;EGYPTIAN HIEROGLYPH BEGIN WALLED ENCLOSURE;Cf;0;L;;;;;N;;;;;
+1343F;EGYPTIAN HIEROGLYPH END WALLED ENCLOSURE;Cf;0;L;;;;;N;;;;;
+13440;EGYPTIAN HIEROGLYPH MIRROR HORIZONTALLY;Mn;0;NSM;;;;;N;;;;;
+13441;EGYPTIAN HIEROGLYPH FULL BLANK;Lo;0;L;;;;;N;;;;;
+13442;EGYPTIAN HIEROGLYPH HALF BLANK;Lo;0;L;;;;;N;;;;;
+13443;EGYPTIAN HIEROGLYPH LOST SIGN;Lo;0;L;;;;;N;;;;;
+13444;EGYPTIAN HIEROGLYPH HALF LOST SIGN;Lo;0;L;;;;;N;;;;;
+13445;EGYPTIAN HIEROGLYPH TALL LOST SIGN;Lo;0;L;;;;;N;;;;;
+13446;EGYPTIAN HIEROGLYPH WIDE LOST SIGN;Lo;0;L;;;;;N;;;;;
+13447;EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP START;Mn;0;NSM;;;;;N;;;;;
+13448;EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT BOTTOM START;Mn;0;NSM;;;;;N;;;;;
+13449;EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT START;Mn;0;NSM;;;;;N;;;;;
+1344A;EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP END;Mn;0;NSM;;;;;N;;;;;
+1344B;EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP;Mn;0;NSM;;;;;N;;;;;
+1344C;EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT BOTTOM START AND TOP END;Mn;0;NSM;;;;;N;;;;;
+1344D;EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT START AND TOP;Mn;0;NSM;;;;;N;;;;;
+1344E;EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT BOTTOM END;Mn;0;NSM;;;;;N;;;;;
+1344F;EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP START AND BOTTOM END;Mn;0;NSM;;;;;N;;;;;
+13450;EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT BOTTOM;Mn;0;NSM;;;;;N;;;;;
+13451;EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT START AND BOTTOM;Mn;0;NSM;;;;;N;;;;;
+13452;EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT END;Mn;0;NSM;;;;;N;;;;;
+13453;EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP AND END;Mn;0;NSM;;;;;N;;;;;
+13454;EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT BOTTOM AND END;Mn;0;NSM;;;;;N;;;;;
+13455;EGYPTIAN HIEROGLYPH MODIFIER DAMAGED;Mn;0;NSM;;;;;N;;;;;
 14400;ANATOLIAN HIEROGLYPH A001;Lo;0;L;;;;;N;;;;;
 14401;ANATOLIAN HIEROGLYPH A002;Lo;0;L;;;;;N;;;;;
 14402;ANATOLIAN HIEROGLYPH A003;Lo;0;L;;;;;N;;;;;
@@ -27289,9 +27423,11 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
 1B120;KATAKANA LETTER ARCHAIC YI;Lo;0;L;;;;;N;;;;;
 1B121;KATAKANA LETTER ARCHAIC YE;Lo;0;L;;;;;N;;;;;
 1B122;KATAKANA LETTER ARCHAIC WU;Lo;0;L;;;;;N;;;;;
+1B132;HIRAGANA LETTER SMALL KO;Lo;0;L;;;;;N;;;;;
 1B150;HIRAGANA LETTER SMALL WI;Lo;0;L;;;;;N;;;;;
 1B151;HIRAGANA LETTER SMALL WE;Lo;0;L;;;;;N;;;;;
 1B152;HIRAGANA LETTER SMALL WO;Lo;0;L;;;;;N;;;;;
+1B155;KATAKANA LETTER SMALL KO;Lo;0;L;;;;;N;;;;;
 1B164;KATAKANA LETTER SMALL WI;Lo;0;L;;;;;N;;;;;
 1B165;KATAKANA LETTER SMALL WE;Lo;0;L;;;;;N;;;;;
 1B166;KATAKANA LETTER SMALL WO;Lo;0;L;;;;;N;;;;;
@@ -28573,6 +28709,26 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
 1D243;COMBINING GREEK MUSICAL TETRASEME;Mn;230;NSM;;;;;N;;;;;
 1D244;COMBINING GREEK MUSICAL PENTASEME;Mn;230;NSM;;;;;N;;;;;
 1D245;GREEK MUSICAL LEIMMA;So;0;ON;;;;;N;;;;;
+1D2C0;KAKTOVIK NUMERAL ZERO;No;0;L;;;;0;N;;;;;
+1D2C1;KAKTOVIK NUMERAL ONE;No;0;L;;;;1;N;;;;;
+1D2C2;KAKTOVIK NUMERAL TWO;No;0;L;;;;2;N;;;;;
+1D2C3;KAKTOVIK NUMERAL THREE;No;0;L;;;;3;N;;;;;
+1D2C4;KAKTOVIK NUMERAL FOUR;No;0;L;;;;4;N;;;;;
+1D2C5;KAKTOVIK NUMERAL FIVE;No;0;L;;;;5;N;;;;;
+1D2C6;KAKTOVIK NUMERAL SIX;No;0;L;;;;6;N;;;;;
+1D2C7;KAKTOVIK NUMERAL SEVEN;No;0;L;;;;7;N;;;;;
+1D2C8;KAKTOVIK NUMERAL EIGHT;No;0;L;;;;8;N;;;;;
+1D2C9;KAKTOVIK NUMERAL NINE;No;0;L;;;;9;N;;;;;
+1D2CA;KAKTOVIK NUMERAL TEN;No;0;L;;;;10;N;;;;;
+1D2CB;KAKTOVIK NUMERAL ELEVEN;No;0;L;;;;11;N;;;;;
+1D2CC;KAKTOVIK NUMERAL TWELVE;No;0;L;;;;12;N;;;;;
+1D2CD;KAKTOVIK NUMERAL THIRTEEN;No;0;L;;;;13;N;;;;;
+1D2CE;KAKTOVIK NUMERAL FOURTEEN;No;0;L;;;;14;N;;;;;
+1D2CF;KAKTOVIK NUMERAL FIFTEEN;No;0;L;;;;15;N;;;;;
+1D2D0;KAKTOVIK NUMERAL SIXTEEN;No;0;L;;;;16;N;;;;;
+1D2D1;KAKTOVIK NUMERAL SEVENTEEN;No;0;L;;;;17;N;;;;;
+1D2D2;KAKTOVIK NUMERAL EIGHTEEN;No;0;L;;;;18;N;;;;;
+1D2D3;KAKTOVIK NUMERAL NINETEEN;No;0;L;;;;19;N;;;;;
 1D2E0;MAYAN NUMERAL ZERO;No;0;L;;;;0;N;;;;;
 1D2E1;MAYAN NUMERAL ONE;No;0;L;;;;1;N;;;;;
 1D2E2;MAYAN NUMERAL TWO;No;0;L;;;;2;N;;;;;
@@ -30404,6 +30560,12 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
 1DF1C;LATIN SMALL LETTER TESH DIGRAPH WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
 1DF1D;LATIN SMALL LETTER C WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
 1DF1E;LATIN SMALL LETTER S WITH CURL;Ll;0;L;;;;;N;;;;;
+1DF25;LATIN SMALL LETTER D WITH MID-HEIGHT LEFT HOOK;Ll;0;L;;;;;N;;;;;
+1DF26;LATIN SMALL LETTER L WITH MID-HEIGHT LEFT HOOK;Ll;0;L;;;;;N;;;;;
+1DF27;LATIN SMALL LETTER N WITH MID-HEIGHT LEFT HOOK;Ll;0;L;;;;;N;;;;;
+1DF28;LATIN SMALL LETTER R WITH MID-HEIGHT LEFT HOOK;Ll;0;L;;;;;N;;;;;
+1DF29;LATIN SMALL LETTER S WITH MID-HEIGHT LEFT HOOK;Ll;0;L;;;;;N;;;;;
+1DF2A;LATIN SMALL LETTER T WITH MID-HEIGHT LEFT HOOK;Ll;0;L;;;;;N;;;;;
 1E000;COMBINING GLAGOLITIC LETTER AZU;Mn;230;NSM;;;;;N;;;;;
 1E001;COMBINING GLAGOLITIC LETTER BUKY;Mn;230;NSM;;;;;N;;;;;
 1E002;COMBINING GLAGOLITIC LETTER VEDE;Mn;230;NSM;;;;;N;;;;;
@@ -30442,6 +30604,69 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
 1E028;COMBINING GLAGOLITIC LETTER BIG YUS;Mn;230;NSM;;;;;N;;;;;
 1E029;COMBINING GLAGOLITIC LETTER IOTATED BIG YUS;Mn;230;NSM;;;;;N;;;;;
 1E02A;COMBINING GLAGOLITIC LETTER FITA;Mn;230;NSM;;;;;N;;;;;
+1E030;MODIFIER LETTER CYRILLIC SMALL A;Lm;0;L;<super> 0430;;;;N;;;;;
+1E031;MODIFIER LETTER CYRILLIC SMALL BE;Lm;0;L;<super> 0431;;;;N;;;;;
+1E032;MODIFIER LETTER CYRILLIC SMALL VE;Lm;0;L;<super> 0432;;;;N;;;;;
+1E033;MODIFIER LETTER CYRILLIC SMALL GHE;Lm;0;L;<super> 0433;;;;N;;;;;
+1E034;MODIFIER LETTER CYRILLIC SMALL DE;Lm;0;L;<super> 0434;;;;N;;;;;
+1E035;MODIFIER LETTER CYRILLIC SMALL IE;Lm;0;L;<super> 0435;;;;N;;;;;
+1E036;MODIFIER LETTER CYRILLIC SMALL ZHE;Lm;0;L;<super> 0436;;;;N;;;;;
+1E037;MODIFIER LETTER CYRILLIC SMALL ZE;Lm;0;L;<super> 0437;;;;N;;;;;
+1E038;MODIFIER LETTER CYRILLIC SMALL I;Lm;0;L;<super> 0438;;;;N;;;;;
+1E039;MODIFIER LETTER CYRILLIC SMALL KA;Lm;0;L;<super> 043A;;;;N;;;;;
+1E03A;MODIFIER LETTER CYRILLIC SMALL EL;Lm;0;L;<super> 043B;;;;N;;;;;
+1E03B;MODIFIER LETTER CYRILLIC SMALL EM;Lm;0;L;<super> 043C;;;;N;;;;;
+1E03C;MODIFIER LETTER CYRILLIC SMALL O;Lm;0;L;<super> 043E;;;;N;;;;;
+1E03D;MODIFIER LETTER CYRILLIC SMALL PE;Lm;0;L;<super> 043F;;;;N;;;;;
+1E03E;MODIFIER LETTER CYRILLIC SMALL ER;Lm;0;L;<super> 0440;;;;N;;;;;
+1E03F;MODIFIER LETTER CYRILLIC SMALL ES;Lm;0;L;<super> 0441;;;;N;;;;;
+1E040;MODIFIER LETTER CYRILLIC SMALL TE;Lm;0;L;<super> 0442;;;;N;;;;;
+1E041;MODIFIER LETTER CYRILLIC SMALL U;Lm;0;L;<super> 0443;;;;N;;;;;
+1E042;MODIFIER LETTER CYRILLIC SMALL EF;Lm;0;L;<super> 0444;;;;N;;;;;
+1E043;MODIFIER LETTER CYRILLIC SMALL HA;Lm;0;L;<super> 0445;;;;N;;;;;
+1E044;MODIFIER LETTER CYRILLIC SMALL TSE;Lm;0;L;<super> 0446;;;;N;;;;;
+1E045;MODIFIER LETTER CYRILLIC SMALL CHE;Lm;0;L;<super> 0447;;;;N;;;;;
+1E046;MODIFIER LETTER CYRILLIC SMALL SHA;Lm;0;L;<super> 0448;;;;N;;;;;
+1E047;MODIFIER LETTER CYRILLIC SMALL YERU;Lm;0;L;<super> 044B;;;;N;;;;;
+1E048;MODIFIER LETTER CYRILLIC SMALL E;Lm;0;L;<super> 044D;;;;N;;;;;
+1E049;MODIFIER LETTER CYRILLIC SMALL YU;Lm;0;L;<super> 044E;;;;N;;;;;
+1E04A;MODIFIER LETTER CYRILLIC SMALL DZZE;Lm;0;L;<super> A689;;;;N;;;;;
+1E04B;MODIFIER LETTER CYRILLIC SMALL SCHWA;Lm;0;L;<super> 04D9;;;;N;;;;;
+1E04C;MODIFIER LETTER CYRILLIC SMALL BYELORUSSIAN-UKRAINIAN I;Lm;0;L;<super> 0456;;;;N;;;;;
+1E04D;MODIFIER LETTER CYRILLIC SMALL JE;Lm;0;L;<super> 0458;;;;N;;;;;
+1E04E;MODIFIER LETTER CYRILLIC SMALL BARRED O;Lm;0;L;<super> 04E9;;;;N;;;;;
+1E04F;MODIFIER LETTER CYRILLIC SMALL STRAIGHT U;Lm;0;L;<super> 04AF;;;;N;;;;;
+1E050;MODIFIER LETTER CYRILLIC SMALL PALOCHKA;Lm;0;L;<super> 04CF;;;;N;;;;;
+1E051;CYRILLIC SUBSCRIPT SMALL LETTER A;Lm;0;L;<sub> 0430;;;;N;;;;;
+1E052;CYRILLIC SUBSCRIPT SMALL LETTER BE;Lm;0;L;<sub> 0431;;;;N;;;;;
+1E053;CYRILLIC SUBSCRIPT SMALL LETTER VE;Lm;0;L;<sub> 0432;;;;N;;;;;
+1E054;CYRILLIC SUBSCRIPT SMALL LETTER GHE;Lm;0;L;<sub> 0433;;;;N;;;;;
+1E055;CYRILLIC SUBSCRIPT SMALL LETTER DE;Lm;0;L;<sub> 0434;;;;N;;;;;
+1E056;CYRILLIC SUBSCRIPT SMALL LETTER IE;Lm;0;L;<sub> 0435;;;;N;;;;;
+1E057;CYRILLIC SUBSCRIPT SMALL LETTER ZHE;Lm;0;L;<sub> 0436;;;;N;;;;;
+1E058;CYRILLIC SUBSCRIPT SMALL LETTER ZE;Lm;0;L;<sub> 0437;;;;N;;;;;
+1E059;CYRILLIC SUBSCRIPT SMALL LETTER I;Lm;0;L;<sub> 0438;;;;N;;;;;
+1E05A;CYRILLIC SUBSCRIPT SMALL LETTER KA;Lm;0;L;<sub> 043A;;;;N;;;;;
+1E05B;CYRILLIC SUBSCRIPT SMALL LETTER EL;Lm;0;L;<sub> 043B;;;;N;;;;;
+1E05C;CYRILLIC SUBSCRIPT SMALL LETTER O;Lm;0;L;<sub> 043E;;;;N;;;;;
+1E05D;CYRILLIC SUBSCRIPT SMALL LETTER PE;Lm;0;L;<sub> 043F;;;;N;;;;;
+1E05E;CYRILLIC SUBSCRIPT SMALL LETTER ES;Lm;0;L;<sub> 0441;;;;N;;;;;
+1E05F;CYRILLIC SUBSCRIPT SMALL LETTER U;Lm;0;L;<sub> 0443;;;;N;;;;;
+1E060;CYRILLIC SUBSCRIPT SMALL LETTER EF;Lm;0;L;<sub> 0444;;;;N;;;;;
+1E061;CYRILLIC SUBSCRIPT SMALL LETTER HA;Lm;0;L;<sub> 0445;;;;N;;;;;
+1E062;CYRILLIC SUBSCRIPT SMALL LETTER TSE;Lm;0;L;<sub> 0446;;;;N;;;;;
+1E063;CYRILLIC SUBSCRIPT SMALL LETTER CHE;Lm;0;L;<sub> 0447;;;;N;;;;;
+1E064;CYRILLIC SUBSCRIPT SMALL LETTER SHA;Lm;0;L;<sub> 0448;;;;N;;;;;
+1E065;CYRILLIC SUBSCRIPT SMALL LETTER HARD SIGN;Lm;0;L;<sub> 044A;;;;N;;;;;
+1E066;CYRILLIC SUBSCRIPT SMALL LETTER YERU;Lm;0;L;<sub> 044B;;;;N;;;;;
+1E067;CYRILLIC SUBSCRIPT SMALL LETTER GHE WITH UPTURN;Lm;0;L;<sub> 0491;;;;N;;;;;
+1E068;CYRILLIC SUBSCRIPT SMALL LETTER BYELORUSSIAN-UKRAINIAN I;Lm;0;L;<sub> 0456;;;;N;;;;;
+1E069;CYRILLIC SUBSCRIPT SMALL LETTER DZE;Lm;0;L;<sub> 0455;;;;N;;;;;
+1E06A;CYRILLIC SUBSCRIPT SMALL LETTER DZHE;Lm;0;L;<sub> 045F;;;;N;;;;;
+1E06B;MODIFIER LETTER CYRILLIC SMALL ES WITH DESCENDER;Lm;0;L;<super> 04AB;;;;N;;;;;
+1E06C;MODIFIER LETTER CYRILLIC SMALL YERU WITH BACK YER;Lm;0;L;<super> A651;;;;N;;;;;
+1E06D;MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE;Lm;0;L;<super> 04B1;;;;N;;;;;
+1E08F;COMBINING CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I;Mn;230;NSM;;;;;N;;;;;
 1E100;NYIAKENG PUACHUE HMONG LETTER MA;Lo;0;L;;;;;N;;;;;
 1E101;NYIAKENG PUACHUE HMONG LETTER TSA;Lo;0;L;;;;;N;;;;;
 1E102;NYIAKENG PUACHUE HMONG LETTER NTA;Lo;0;L;;;;;N;;;;;
@@ -30603,6 +30828,48 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
 1E2F8;WANCHO DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
 1E2F9;WANCHO DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
 1E2FF;WANCHO NGUN SIGN;Sc;0;ET;;;;;N;;;;;
+1E4D0;NAG MUNDARI LETTER O;Lo;0;L;;;;;N;;;;;
+1E4D1;NAG MUNDARI LETTER OP;Lo;0;L;;;;;N;;;;;
+1E4D2;NAG MUNDARI LETTER OL;Lo;0;L;;;;;N;;;;;
+1E4D3;NAG MUNDARI LETTER OY;Lo;0;L;;;;;N;;;;;
+1E4D4;NAG MUNDARI LETTER ONG;Lo;0;L;;;;;N;;;;;
+1E4D5;NAG MUNDARI LETTER A;Lo;0;L;;;;;N;;;;;
+1E4D6;NAG MUNDARI LETTER AJ;Lo;0;L;;;;;N;;;;;
+1E4D7;NAG MUNDARI LETTER AB;Lo;0;L;;;;;N;;;;;
+1E4D8;NAG MUNDARI LETTER ANY;Lo;0;L;;;;;N;;;;;
+1E4D9;NAG MUNDARI LETTER AH;Lo;0;L;;;;;N;;;;;
+1E4DA;NAG MUNDARI LETTER I;Lo;0;L;;;;;N;;;;;
+1E4DB;NAG MUNDARI LETTER IS;Lo;0;L;;;;;N;;;;;
+1E4DC;NAG MUNDARI LETTER IDD;Lo;0;L;;;;;N;;;;;
+1E4DD;NAG MUNDARI LETTER IT;Lo;0;L;;;;;N;;;;;
+1E4DE;NAG MUNDARI LETTER IH;Lo;0;L;;;;;N;;;;;
+1E4DF;NAG MUNDARI LETTER U;Lo;0;L;;;;;N;;;;;
+1E4E0;NAG MUNDARI LETTER UC;Lo;0;L;;;;;N;;;;;
+1E4E1;NAG MUNDARI LETTER UD;Lo;0;L;;;;;N;;;;;
+1E4E2;NAG MUNDARI LETTER UK;Lo;0;L;;;;;N;;;;;
+1E4E3;NAG MUNDARI LETTER UR;Lo;0;L;;;;;N;;;;;
+1E4E4;NAG MUNDARI LETTER E;Lo;0;L;;;;;N;;;;;
+1E4E5;NAG MUNDARI LETTER ENN;Lo;0;L;;;;;N;;;;;
+1E4E6;NAG MUNDARI LETTER EG;Lo;0;L;;;;;N;;;;;
+1E4E7;NAG MUNDARI LETTER EM;Lo;0;L;;;;;N;;;;;
+1E4E8;NAG MUNDARI LETTER EN;Lo;0;L;;;;;N;;;;;
+1E4E9;NAG MUNDARI LETTER ETT;Lo;0;L;;;;;N;;;;;
+1E4EA;NAG MUNDARI LETTER ELL;Lo;0;L;;;;;N;;;;;
+1E4EB;NAG MUNDARI SIGN OJOD;Lm;0;L;;;;;N;;;;;
+1E4EC;NAG MUNDARI SIGN MUHOR;Mn;232;NSM;;;;;N;;;;;
+1E4ED;NAG MUNDARI SIGN TOYOR;Mn;232;NSM;;;;;N;;;;;
+1E4EE;NAG MUNDARI SIGN IKIR;Mn;220;NSM;;;;;N;;;;;
+1E4EF;NAG MUNDARI SIGN SUTUH;Mn;230;NSM;;;;;N;;;;;
+1E4F0;NAG MUNDARI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+1E4F1;NAG MUNDARI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+1E4F2;NAG MUNDARI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+1E4F3;NAG MUNDARI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+1E4F4;NAG MUNDARI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+1E4F5;NAG MUNDARI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+1E4F6;NAG MUNDARI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+1E4F7;NAG MUNDARI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+1E4F8;NAG MUNDARI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+1E4F9;NAG MUNDARI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
 1E7E0;ETHIOPIC SYLLABLE HHYA;Lo;0;L;;;;;N;;;;;
 1E7E1;ETHIOPIC SYLLABLE HHYU;Lo;0;L;;;;;N;;;;;
 1E7E2;ETHIOPIC SYLLABLE HHYI;Lo;0;L;;;;;N;;;;;
@@ -32678,6 +32945,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
 1F6D5;HINDU TEMPLE;So;0;ON;;;;;N;;;;;
 1F6D6;HUT;So;0;ON;;;;;N;;;;;
 1F6D7;ELEVATOR;So;0;ON;;;;;N;;;;;
+1F6DC;WIRELESS;So;0;ON;;;;;N;;;;;
 1F6DD;PLAYGROUND SLIDE;So;0;ON;;;;;N;;;;;
 1F6DE;WHEEL;So;0;ON;;;;;N;;;;;
 1F6DF;RING BUOY;So;0;ON;;;;;N;;;;;
@@ -32823,6 +33091,14 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
 1F771;ALCHEMICAL SYMBOL FOR MONTH;So;0;ON;;;;;N;;;;;
 1F772;ALCHEMICAL SYMBOL FOR HALF DRAM;So;0;ON;;;;;N;;;;;
 1F773;ALCHEMICAL SYMBOL FOR HALF OUNCE;So;0;ON;;;;;N;;;;;
+1F774;LOT OF FORTUNE;So;0;ON;;;;;N;;;;;
+1F775;OCCULTATION;So;0;ON;;;;;N;;;;;
+1F776;LUNAR ECLIPSE;So;0;ON;;;;;N;;;;;
+1F77B;HAUMEA;So;0;ON;;;;;N;;;;;
+1F77C;MAKEMAKE;So;0;ON;;;;;N;;;;;
+1F77D;GONGGONG;So;0;ON;;;;;N;;;;;
+1F77E;QUAOAR;So;0;ON;;;;;N;;;;;
+1F77F;ORCUS;So;0;ON;;;;;N;;;;;
 1F780;BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE;So;0;ON;;;;;N;;;;;
 1F781;BLACK UP-POINTING ISOSCELES RIGHT TRIANGLE;So;0;ON;;;;;N;;;;;
 1F782;BLACK RIGHT-POINTING ISOSCELES RIGHT TRIANGLE;So;0;ON;;;;;N;;;;;
@@ -32912,6 +33188,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
 1F7D6;NEGATIVE CIRCLED TRIANGLE;So;0;ON;;;;;N;;;;;
 1F7D7;CIRCLED SQUARE;So;0;ON;;;;;N;;;;;
 1F7D8;NEGATIVE CIRCLED SQUARE;So;0;ON;;;;;N;;;;;
+1F7D9;NINE POINTED WHITE STAR;So;0;ON;;;;;N;;;;;
 1F7E0;LARGE ORANGE CIRCLE;So;0;ON;;;;;N;;;;;
 1F7E1;LARGE YELLOW CIRCLE;So;0;ON;;;;;N;;;;;
 1F7E2;LARGE GREEN CIRCLE;So;0;ON;;;;;N;;;;;
@@ -33434,6 +33711,9 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
 1FA72;BRIEFS;So;0;ON;;;;;N;;;;;
 1FA73;SHORTS;So;0;ON;;;;;N;;;;;
 1FA74;THONG SANDAL;So;0;ON;;;;;N;;;;;
+1FA75;LIGHT BLUE HEART;So;0;ON;;;;;N;;;;;
+1FA76;GREY HEART;So;0;ON;;;;;N;;;;;
+1FA77;PINK HEART;So;0;ON;;;;;N;;;;;
 1FA78;DROP OF BLOOD;So;0;ON;;;;;N;;;;;
 1FA79;ADHESIVE BANDAGE;So;0;ON;;;;;N;;;;;
 1FA7A;STETHOSCOPE;So;0;ON;;;;;N;;;;;
@@ -33446,6 +33726,8 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
 1FA84;MAGIC WAND;So;0;ON;;;;;N;;;;;
 1FA85;PINATA;So;0;ON;;;;;N;;;;;
 1FA86;NESTING DOLLS;So;0;ON;;;;;N;;;;;
+1FA87;MARACAS;So;0;ON;;;;;N;;;;;
+1FA88;FLUTE;So;0;ON;;;;;N;;;;;
 1FA90;RINGED PLANET;So;0;ON;;;;;N;;;;;
 1FA91;CHAIR;So;0;ON;;;;;N;;;;;
 1FA92;RAZOR;So;0;ON;;;;;N;;;;;
@@ -33475,6 +33757,9 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
 1FAAA;IDENTIFICATION CARD;So;0;ON;;;;;N;;;;;
 1FAAB;LOW BATTERY;So;0;ON;;;;;N;;;;;
 1FAAC;HAMSA;So;0;ON;;;;;N;;;;;
+1FAAD;FOLDING HAND FAN;So;0;ON;;;;;N;;;;;
+1FAAE;HAIR PICK;So;0;ON;;;;;N;;;;;
+1FAAF;KHANDA;So;0;ON;;;;;N;;;;;
 1FAB0;FLY;So;0;ON;;;;;N;;;;;
 1FAB1;WORM;So;0;ON;;;;;N;;;;;
 1FAB2;BEETLE;So;0;ON;;;;;N;;;;;
@@ -33486,12 +33771,18 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
 1FAB8;CORAL;So;0;ON;;;;;N;;;;;
 1FAB9;EMPTY NEST;So;0;ON;;;;;N;;;;;
 1FABA;NEST WITH EGGS;So;0;ON;;;;;N;;;;;
+1FABB;HYACINTH;So;0;ON;;;;;N;;;;;
+1FABC;JELLYFISH;So;0;ON;;;;;N;;;;;
+1FABD;WING;So;0;ON;;;;;N;;;;;
+1FABF;GOOSE;So;0;ON;;;;;N;;;;;
 1FAC0;ANATOMICAL HEART;So;0;ON;;;;;N;;;;;
 1FAC1;LUNGS;So;0;ON;;;;;N;;;;;
 1FAC2;PEOPLE HUGGING;So;0;ON;;;;;N;;;;;
 1FAC3;PREGNANT MAN;So;0;ON;;;;;N;;;;;
 1FAC4;PREGNANT PERSON;So;0;ON;;;;;N;;;;;
 1FAC5;PERSON WITH CROWN;So;0;ON;;;;;N;;;;;
+1FACE;MOOSE;So;0;ON;;;;;N;;;;;
+1FACF;DONKEY;So;0;ON;;;;;N;;;;;
 1FAD0;BLUEBERRIES;So;0;ON;;;;;N;;;;;
 1FAD1;BELL PEPPER;So;0;ON;;;;;N;;;;;
 1FAD2;OLIVE;So;0;ON;;;;;N;;;;;
@@ -33502,6 +33793,8 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
 1FAD7;POURING LIQUID;So;0;ON;;;;;N;;;;;
 1FAD8;BEANS;So;0;ON;;;;;N;;;;;
 1FAD9;JAR;So;0;ON;;;;;N;;;;;
+1FADA;GINGER ROOT;So;0;ON;;;;;N;;;;;
+1FADB;PEA POD;So;0;ON;;;;;N;;;;;
 1FAE0;MELTING FACE;So;0;ON;;;;;N;;;;;
 1FAE1;SALUTING FACE;So;0;ON;;;;;N;;;;;
 1FAE2;FACE WITH OPEN EYES AND HAND OVER MOUTH;So;0;ON;;;;;N;;;;;
@@ -33510,6 +33803,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
 1FAE5;DOTTED LINE FACE;So;0;ON;;;;;N;;;;;
 1FAE6;BITING LIP;So;0;ON;;;;;N;;;;;
 1FAE7;BUBBLES;So;0;ON;;;;;N;;;;;
+1FAE8;SHAKING FACE;So;0;ON;;;;;N;;;;;
 1FAF0;HAND WITH INDEX FINGER AND THUMB CROSSED;So;0;ON;;;;;N;;;;;
 1FAF1;RIGHTWARDS HAND;So;0;ON;;;;;N;;;;;
 1FAF2;LEFTWARDS HAND;So;0;ON;;;;;N;;;;;
@@ -33517,6 +33811,8 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
 1FAF4;PALM UP HAND;So;0;ON;;;;;N;;;;;
 1FAF5;INDEX POINTING AT THE VIEWER;So;0;ON;;;;;N;;;;;
 1FAF6;HEART HANDS;So;0;ON;;;;;N;;;;;
+1FAF7;LEFTWARDS PUSHING HAND;So;0;ON;;;;;N;;;;;
+1FAF8;RIGHTWARDS PUSHING HAND;So;0;ON;;;;;N;;;;;
 1FB00;BLOCK SEXTANT-1;So;0;ON;;;;;N;;;;;
 1FB01;BLOCK SEXTANT-2;So;0;ON;;;;;N;;;;;
 1FB02;BLOCK SEXTANT-12;So;0;ON;;;;;N;;;;;
@@ -33732,7 +34028,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
 20000;<CJK Ideograph Extension B, First>;Lo;0;L;;;;;N;;;;;
 2A6DF;<CJK Ideograph Extension B, Last>;Lo;0;L;;;;;N;;;;;
 2A700;<CJK Ideograph Extension C, First>;Lo;0;L;;;;;N;;;;;
-2B738;<CJK Ideograph Extension C, Last>;Lo;0;L;;;;;N;;;;;
+2B739;<CJK Ideograph Extension C, Last>;Lo;0;L;;;;;N;;;;;
 2B740;<CJK Ideograph Extension D, First>;Lo;0;L;;;;;N;;;;;
 2B81D;<CJK Ideograph Extension D, Last>;Lo;0;L;;;;;N;;;;;
 2B820;<CJK Ideograph Extension E, First>;Lo;0;L;;;;;N;;;;;
@@ -34283,6 +34579,8 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
 2FA1D;CJK COMPATIBILITY IDEOGRAPH-2FA1D;Lo;0;L;2A600;;;;N;;;;;
 30000;<CJK Ideograph Extension G, First>;Lo;0;L;;;;;N;;;;;
 3134A;<CJK Ideograph Extension G, Last>;Lo;0;L;;;;;N;;;;;
+31350;<CJK Ideograph Extension H, First>;Lo;0;L;;;;;N;;;;;
+323AF;<CJK Ideograph Extension H, Last>;Lo;0;L;;;;;N;;;;;
 E0001;LANGUAGE TAG;Cf;0;BN;;;;;N;;;;;
 E0020;TAG SPACE;Cf;0;BN;;;;;N;;;;;
 E0021;TAG EXCLAMATION MARK;Cf;0;BN;;;;;N;;;;;
index eff2fd3..3c73f97 100644 (file)
@@ -1,11 +1,11 @@
-# GraphemeBreakTest-14.0.0.txt
-# Date: 2021-03-08, 06:22:32 GMT
-# © 2021 Unicode®, Inc.
+# GraphemeBreakTest-15.0.0.txt
+# Date: 2022-02-26, 00:38:37 GMT
+# © 2022 Unicode®, Inc.
 # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
-# For terms of use, see http://www.unicode.org/terms_of_use.html
+# For terms of use, see https://www.unicode.org/terms_of_use.html
 #
 # Unicode Character Database
-#   For documentation, see http://www.unicode.org/reports/tr44/
+#   For documentation, see https://www.unicode.org/reports/tr44/
 #
 # Default Grapheme_Cluster_Break Test
 #
index dd25690..a12b5ee 100644 (file)
@@ -1,11 +1,11 @@
-# GraphemeBreakProperty-14.0.0.txt
-# Date: 2021-08-12, 23:13:02 GMT
-# © 2021 Unicode®, Inc.
+# GraphemeBreakProperty-15.0.0.txt
+# Date: 2022-04-27, 17:07:38 GMT
+# © 2022 Unicode®, Inc.
 # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
-# For terms of use, see http://www.unicode.org/terms_of_use.html
+# For terms of use, see https://www.unicode.org/terms_of_use.html
 #
 # Unicode Character Database
-#   For documentation, see http://www.unicode.org/reports/tr44/
+#   For documentation, see https://www.unicode.org/reports/tr44/
 
 # ================================================
 
@@ -32,8 +32,9 @@
 11A3A         ; Prepend # Lo       ZANABAZAR SQUARE CLUSTER-INITIAL LETTER RA
 11A84..11A89  ; Prepend # Lo   [6] SOYOMBO SIGN JIHVAMULIYA..SOYOMBO CLUSTER-INITIAL LETTER SA
 11D46         ; Prepend # Lo       MASARAM GONDI REPHA
+11F02         ; Prepend # Lo       KAWI SIGN REPHA
 
-# Total code points: 26
+# Total code points: 27
 
 # ================================================
 
@@ -67,7 +68,7 @@
 FEFF          ; Control # Cf       ZERO WIDTH NO-BREAK SPACE
 FFF0..FFF8    ; Control # Cn   [9] <reserved-FFF0>..<reserved-FFF8>
 FFF9..FFFB    ; Control # Cf   [3] INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTATION TERMINATOR
-13430..13438  ; Control # Cf   [9] EGYPTIAN HIEROGLYPH VERTICAL JOINER..EGYPTIAN HIEROGLYPH END SEGMENT
+13430..1343F  ; Control # Cf  [16] EGYPTIAN HIEROGLYPH VERTICAL JOINER..EGYPTIAN HIEROGLYPH END WALLED ENCLOSURE
 1BCA0..1BCA3  ; Control # Cf   [4] SHORTHAND FORMAT LETTER OVERLAP..SHORTHAND FORMAT UP STEP
 1D173..1D17A  ; Control # Cf   [8] MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE
 E0000         ; Control # Cn       <reserved-E0000>
@@ -76,7 +77,7 @@ E0002..E001F  ; Control # Cn  [30] <reserved-E0002>..<reserved-E001F>
 E0080..E00FF  ; Control # Cn [128] <reserved-E0080>..<reserved-E00FF>
 E01F0..E0FFF  ; Control # Cn [3600] <reserved-E01F0>..<reserved-E0FFF>
 
-# Total code points: 3886
+# Total code points: 3893
 
 # ================================================
 
@@ -185,7 +186,7 @@ E01F0..E0FFF  ; Control # Cn [3600] <reserved-E01F0>..<reserved-E0FFF>
 0E47..0E4E    ; Extend # Mn   [8] THAI CHARACTER MAITAIKHU..THAI CHARACTER YAMAKKAN
 0EB1          ; Extend # Mn       LAO VOWEL SIGN MAI KAN
 0EB4..0EBC    ; Extend # Mn   [9] LAO VOWEL SIGN I..LAO SEMIVOWEL SIGN LO
-0EC8..0ECD    ; Extend # Mn   [6] LAO TONE MAI EK..LAO NIGGAHITA
+0EC8..0ECE    ; Extend # Mn   [7] LAO TONE MAI EK..LAO YAMAKKAN
 0F18..0F19    ; Extend # Mn   [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS
 0F35          ; Extend # Mn       TIBETAN MARK NGAS BZUNG NYI ZLA
 0F37          ; Extend # Mn       TIBETAN MARK NGAS BZUNG SGOR RTAGS
@@ -324,6 +325,7 @@ FF9E..FF9F    ; Extend # Lm   [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDT
 10AE5..10AE6  ; Extend # Mn   [2] MANICHAEAN ABBREVIATION MARK ABOVE..MANICHAEAN ABBREVIATION MARK BELOW
 10D24..10D27  ; Extend # Mn   [4] HANIFI ROHINGYA SIGN HARBAHAY..HANIFI ROHINGYA SIGN TASSI
 10EAB..10EAC  ; Extend # Mn   [2] YEZIDI COMBINING HAMZA MARK..YEZIDI COMBINING MADDA MARK
+10EFD..10EFF  ; Extend # Mn   [3] ARABIC SMALL LOW WORD SAKTA..ARABIC SMALL LOW WORD MADDA
 10F46..10F50  ; Extend # Mn  [11] SOGDIAN COMBINING DOT BELOW..SOGDIAN COMBINING STROKE BELOW
 10F82..10F85  ; Extend # Mn   [4] OLD UYGHUR COMBINING DOT ABOVE..OLD UYGHUR COMBINING TWO DOTS BELOW
 11001         ; Extend # Mn       BRAHMI SIGN ANUSVARA
@@ -346,6 +348,7 @@ FF9E..FF9F    ; Extend # Lm   [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDT
 11234         ; Extend # Mn       KHOJKI SIGN ANUSVARA
 11236..11237  ; Extend # Mn   [2] KHOJKI SIGN NUKTA..KHOJKI SIGN SHADDA
 1123E         ; Extend # Mn       KHOJKI SIGN SUKUN
+11241         ; Extend # Mn       KHOJKI VOWEL SIGN VOCALIC R
 112DF         ; Extend # Mn       KHUDAWADI SIGN ANUSVARA
 112E3..112EA  ; Extend # Mn   [8] KHUDAWADI VOWEL SIGN U..KHUDAWADI SIGN VIRAMA
 11300..11301  ; Extend # Mn   [2] GRANTHA SIGN COMBINING ANUSVARA ABOVE..GRANTHA SIGN CANDRABINDU
@@ -413,6 +416,12 @@ FF9E..FF9F    ; Extend # Lm   [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDT
 11D95         ; Extend # Mn       GUNJALA GONDI SIGN ANUSVARA
 11D97         ; Extend # Mn       GUNJALA GONDI VIRAMA
 11EF3..11EF4  ; Extend # Mn   [2] MAKASAR VOWEL SIGN I..MAKASAR VOWEL SIGN U
+11F00..11F01  ; Extend # Mn   [2] KAWI SIGN CANDRABINDU..KAWI SIGN ANUSVARA
+11F36..11F3A  ; Extend # Mn   [5] KAWI VOWEL SIGN I..KAWI VOWEL SIGN VOCALIC R
+11F40         ; Extend # Mn       KAWI VOWEL SIGN EU
+11F42         ; Extend # Mn       KAWI CONJOINER
+13440         ; Extend # Mn       EGYPTIAN HIEROGLYPH MIRROR HORIZONTALLY
+13447..13455  ; Extend # Mn  [15] EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP START..EGYPTIAN HIEROGLYPH MODIFIER DAMAGED
 16AF0..16AF4  ; Extend # Mn   [5] BASSA VAH COMBINING HIGH TONE..BASSA VAH COMBINING HIGH-LOW TONE
 16B30..16B36  ; Extend # Mn   [7] PAHAWH HMONG MARK CIM TUB..PAHAWH HMONG MARK CIM TAUM
 16F4F         ; Extend # Mn       MIAO SIGN CONSONANT MODIFIER BAR
@@ -439,16 +448,18 @@ FF9E..FF9F    ; Extend # Lm   [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDT
 1E01B..1E021  ; Extend # Mn   [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI
 1E023..1E024  ; Extend # Mn   [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS
 1E026..1E02A  ; Extend # Mn   [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA
+1E08F         ; Extend # Mn       COMBINING CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
 1E130..1E136  ; Extend # Mn   [7] NYIAKENG PUACHUE HMONG TONE-B..NYIAKENG PUACHUE HMONG TONE-D
 1E2AE         ; Extend # Mn       TOTO SIGN RISING TONE
 1E2EC..1E2EF  ; Extend # Mn   [4] WANCHO TONE TUP..WANCHO TONE KOINI
+1E4EC..1E4EF  ; Extend # Mn   [4] NAG MUNDARI SIGN MUHOR..NAG MUNDARI SIGN SUTUH
 1E8D0..1E8D6  ; Extend # Mn   [7] MENDE KIKAKUI COMBINING NUMBER TEENS..MENDE KIKAKUI COMBINING NUMBER MILLIONS
 1E944..1E94A  ; Extend # Mn   [7] ADLAM ALIF LENGTHENER..ADLAM NUKTA
 1F3FB..1F3FF  ; Extend # Sk   [5] EMOJI MODIFIER FITZPATRICK TYPE-1-2..EMOJI MODIFIER FITZPATRICK TYPE-6
 E0020..E007F  ; Extend # Cf  [96] TAG SPACE..CANCEL TAG
 E0100..E01EF  ; Extend # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256
 
-# Total code points: 2095
+# Total code points: 2130
 
 # ================================================
 
@@ -489,6 +500,7 @@ E0100..E01EF  ; Extend # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256
 0CC3..0CC4    ; SpacingMark # Mc   [2] KANNADA VOWEL SIGN VOCALIC R..KANNADA VOWEL SIGN VOCALIC RR
 0CC7..0CC8    ; SpacingMark # Mc   [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI
 0CCA..0CCB    ; SpacingMark # Mc   [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO
+0CF3          ; SpacingMark # Mc       KANNADA SIGN COMBINING ANUSVARA ABOVE RIGHT
 0D02..0D03    ; SpacingMark # Mc   [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA
 0D3F..0D40    ; SpacingMark # Mc   [2] MALAYALAM VOWEL SIGN I..MALAYALAM VOWEL SIGN II
 0D46..0D48    ; SpacingMark # Mc   [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI
@@ -614,12 +626,16 @@ ABEC          ; SpacingMark # Mc       MEETEI MAYEK LUM IYEK
 11D93..11D94  ; SpacingMark # Mc   [2] GUNJALA GONDI VOWEL SIGN OO..GUNJALA GONDI VOWEL SIGN AU
 11D96         ; SpacingMark # Mc       GUNJALA GONDI SIGN VISARGA
 11EF5..11EF6  ; SpacingMark # Mc   [2] MAKASAR VOWEL SIGN E..MAKASAR VOWEL SIGN O
+11F03         ; SpacingMark # Mc       KAWI SIGN VISARGA
+11F34..11F35  ; SpacingMark # Mc   [2] KAWI VOWEL SIGN AA..KAWI VOWEL SIGN ALTERNATE AA
+11F3E..11F3F  ; SpacingMark # Mc   [2] KAWI VOWEL SIGN E..KAWI VOWEL SIGN AI
+11F41         ; SpacingMark # Mc       KAWI SIGN KILLER
 16F51..16F87  ; SpacingMark # Mc  [55] MIAO SIGN ASPIRATION..MIAO VOWEL SIGN UI
 16FF0..16FF1  ; SpacingMark # Mc   [2] VIETNAMESE ALTERNATE READING MARK CA..VIETNAMESE ALTERNATE READING MARK NHAY
 1D166         ; SpacingMark # Mc       MUSICAL SYMBOL COMBINING SPRECHGESANG STEM
 1D16D         ; SpacingMark # Mc       MUSICAL SYMBOL COMBINING AUGMENTATION DOT
 
-# Total code points: 388
+# Total code points: 395
 
 # ================================================
 
index 8d1cef0..3122a2e 100644 (file)
@@ -1,11 +1,11 @@
-# LineBreakTest-14.0.0.txt
-# Date: 2021-08-20, 21:08:45 GMT
-# © 2021 Unicode®, Inc.
+# LineBreakTest-15.0.0.txt
+# Date: 2022-02-26, 00:38:39 GMT
+# © 2022 Unicode®, Inc.
 # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
-# For terms of use, see http://www.unicode.org/terms_of_use.html
+# For terms of use, see https://www.unicode.org/terms_of_use.html
 #
 # Unicode Character Database
-#   For documentation, see http://www.unicode.org/reports/tr44/
+#   For documentation, see https://www.unicode.org/reports/tr44/
 #
 # Default Line_Break Test
 #
index 61ea42c..be53fe9 100644 (file)
@@ -1,11 +1,11 @@
-# SentenceBreakTest-14.0.0.txt
-# Date: 2021-03-08, 06:22:40 GMT
-# © 2021 Unicode®, Inc.
+# SentenceBreakTest-15.0.0.txt
+# Date: 2022-02-26, 00:39:00 GMT
+# © 2022 Unicode®, Inc.
 # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
-# For terms of use, see http://www.unicode.org/terms_of_use.html
+# For terms of use, see https://www.unicode.org/terms_of_use.html
 #
 # Unicode Character Database
-#   For documentation, see http://www.unicode.org/reports/tr44/
+#   For documentation, see https://www.unicode.org/reports/tr44/
 #
 # Default Sentence_Break Test
 #
index 4b12b85..66fbf01 100644 (file)
@@ -1,11 +1,11 @@
-# SentenceBreakProperty-14.0.0.txt
-# Date: 2021-08-12, 23:13:21 GMT
-# © 2021 Unicode®, Inc.
+# SentenceBreakProperty-15.0.0.txt
+# Date: 2022-08-05, 22:17:35 GMT
+# © 2022 Unicode®, Inc.
 # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
-# For terms of use, see http://www.unicode.org/terms_of_use.html
+# For terms of use, see https://www.unicode.org/terms_of_use.html
 #
 # Unicode Character Database
-#   For documentation, see http://www.unicode.org/reports/tr44/
+#   For documentation, see https://www.unicode.org/reports/tr44/
 
 # ================================================
 
 0CCC..0CCD    ; Extend # Mn   [2] KANNADA VOWEL SIGN AU..KANNADA SIGN VIRAMA
 0CD5..0CD6    ; Extend # Mc   [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK
 0CE2..0CE3    ; Extend # Mn   [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL
+0CF3          ; Extend # Mc       KANNADA SIGN COMBINING ANUSVARA ABOVE RIGHT
 0D00..0D01    ; Extend # Mn   [2] MALAYALAM SIGN COMBINING ANUSVARA ABOVE..MALAYALAM SIGN CANDRABINDU
 0D02..0D03    ; Extend # Mc   [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA
 0D3B..0D3C    ; Extend # Mn   [2] MALAYALAM SIGN VERTICAL BAR VIRAMA..MALAYALAM SIGN CIRCULAR VIRAMA
 0E47..0E4E    ; Extend # Mn   [8] THAI CHARACTER MAITAIKHU..THAI CHARACTER YAMAKKAN
 0EB1          ; Extend # Mn       LAO VOWEL SIGN MAI KAN
 0EB4..0EBC    ; Extend # Mn   [9] LAO VOWEL SIGN I..LAO SEMIVOWEL SIGN LO
-0EC8..0ECD    ; Extend # Mn   [6] LAO TONE MAI EK..LAO NIGGAHITA
+0EC8..0ECE    ; Extend # Mn   [7] LAO TONE MAI EK..LAO YAMAKKAN
 0F18..0F19    ; Extend # Mn   [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS
 0F35          ; Extend # Mn       TIBETAN MARK NGAS BZUNG NYI ZLA
 0F37          ; Extend # Mn       TIBETAN MARK NGAS BZUNG SGOR RTAGS
@@ -371,6 +372,7 @@ FF9E..FF9F    ; Extend # Lm   [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDT
 10AE5..10AE6  ; Extend # Mn   [2] MANICHAEAN ABBREVIATION MARK ABOVE..MANICHAEAN ABBREVIATION MARK BELOW
 10D24..10D27  ; Extend # Mn   [4] HANIFI ROHINGYA SIGN HARBAHAY..HANIFI ROHINGYA SIGN TASSI
 10EAB..10EAC  ; Extend # Mn   [2] YEZIDI COMBINING HAMZA MARK..YEZIDI COMBINING MADDA MARK
+10EFD..10EFF  ; Extend # Mn   [3] ARABIC SMALL LOW WORD SAKTA..ARABIC SMALL LOW WORD MADDA
 10F46..10F50  ; Extend # Mn  [11] SOGDIAN COMBINING DOT BELOW..SOGDIAN COMBINING STROKE BELOW
 10F82..10F85  ; Extend # Mn   [4] OLD UYGHUR COMBINING DOT ABOVE..OLD UYGHUR COMBINING TWO DOTS BELOW
 11000         ; Extend # Mc       BRAHMI SIGN CANDRABINDU
@@ -407,6 +409,7 @@ FF9E..FF9F    ; Extend # Lm   [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDT
 11235         ; Extend # Mc       KHOJKI SIGN VIRAMA
 11236..11237  ; Extend # Mn   [2] KHOJKI SIGN NUKTA..KHOJKI SIGN SHADDA
 1123E         ; Extend # Mn       KHOJKI SIGN SUKUN
+11241         ; Extend # Mn       KHOJKI VOWEL SIGN VOCALIC R
 112DF         ; Extend # Mn       KHUDAWADI SIGN ANUSVARA
 112E0..112E2  ; Extend # Mc   [3] KHUDAWADI VOWEL SIGN AA..KHUDAWADI VOWEL SIGN II
 112E3..112EA  ; Extend # Mn   [8] KHUDAWADI VOWEL SIGN U..KHUDAWADI SIGN VIRAMA
@@ -516,6 +519,16 @@ FF9E..FF9F    ; Extend # Lm   [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDT
 11D97         ; Extend # Mn       GUNJALA GONDI VIRAMA
 11EF3..11EF4  ; Extend # Mn   [2] MAKASAR VOWEL SIGN I..MAKASAR VOWEL SIGN U
 11EF5..11EF6  ; Extend # Mc   [2] MAKASAR VOWEL SIGN E..MAKASAR VOWEL SIGN O
+11F00..11F01  ; Extend # Mn   [2] KAWI SIGN CANDRABINDU..KAWI SIGN ANUSVARA
+11F03         ; Extend # Mc       KAWI SIGN VISARGA
+11F34..11F35  ; Extend # Mc   [2] KAWI VOWEL SIGN AA..KAWI VOWEL SIGN ALTERNATE AA
+11F36..11F3A  ; Extend # Mn   [5] KAWI VOWEL SIGN I..KAWI VOWEL SIGN VOCALIC R
+11F3E..11F3F  ; Extend # Mc   [2] KAWI VOWEL SIGN E..KAWI VOWEL SIGN AI
+11F40         ; Extend # Mn       KAWI VOWEL SIGN EU
+11F41         ; Extend # Mc       KAWI SIGN KILLER
+11F42         ; Extend # Mn       KAWI CONJOINER
+13440         ; Extend # Mn       EGYPTIAN HIEROGLYPH MIRROR HORIZONTALLY
+13447..13455  ; Extend # Mn  [15] EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP START..EGYPTIAN HIEROGLYPH MODIFIER DAMAGED
 16AF0..16AF4  ; Extend # Mn   [5] BASSA VAH COMBINING HIGH TONE..BASSA VAH COMBINING HIGH-LOW TONE
 16B30..16B36  ; Extend # Mn   [7] PAHAWH HMONG MARK CIM TUB..PAHAWH HMONG MARK CIM TAUM
 16F4F         ; Extend # Mn       MIAO SIGN CONSONANT MODIFIER BAR
@@ -544,15 +557,17 @@ FF9E..FF9F    ; Extend # Lm   [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDT
 1E01B..1E021  ; Extend # Mn   [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI
 1E023..1E024  ; Extend # Mn   [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS
 1E026..1E02A  ; Extend # Mn   [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA
+1E08F         ; Extend # Mn       COMBINING CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
 1E130..1E136  ; Extend # Mn   [7] NYIAKENG PUACHUE HMONG TONE-B..NYIAKENG PUACHUE HMONG TONE-D
 1E2AE         ; Extend # Mn       TOTO SIGN RISING TONE
 1E2EC..1E2EF  ; Extend # Mn   [4] WANCHO TONE TUP..WANCHO TONE KOINI
+1E4EC..1E4EF  ; Extend # Mn   [4] NAG MUNDARI SIGN MUHOR..NAG MUNDARI SIGN SUTUH
 1E8D0..1E8D6  ; Extend # Mn   [7] MENDE KIKAKUI COMBINING NUMBER TEENS..MENDE KIKAKUI COMBINING NUMBER MILLIONS
 1E944..1E94A  ; Extend # Mn   [7] ADLAM ALIF LENGTHENER..ADLAM NUKTA
 E0020..E007F  ; Extend # Cf  [96] TAG SPACE..CANCEL TAG
 E0100..E01EF  ; Extend # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256
 
-# Total code points: 2508
+# Total code points: 2550
 
 # ================================================
 
@@ -581,12 +596,12 @@ FEFF          ; Format # Cf       ZERO WIDTH NO-BREAK SPACE
 FFF9..FFFB    ; Format # Cf   [3] INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTATION TERMINATOR
 110BD         ; Format # Cf       KAITHI NUMBER SIGN
 110CD         ; Format # Cf       KAITHI NUMBER SIGN ABOVE
-13430..13438  ; Format # Cf   [9] EGYPTIAN HIEROGLYPH VERTICAL JOINER..EGYPTIAN HIEROGLYPH END SEGMENT
+13430..1343F  ; Format # Cf  [16] EGYPTIAN HIEROGLYPH VERTICAL JOINER..EGYPTIAN HIEROGLYPH END WALLED ENCLOSURE
 1BCA0..1BCA3  ; Format # Cf   [4] SHORTHAND FORMAT LETTER OVERLAP..SHORTHAND FORMAT UP STEP
 1D173..1D17A  ; Format # Cf   [8] MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE
 E0001         ; Format # Cf       LANGUAGE TAG
 
-# Total code points: 65
+# Total code points: 72
 
 # ================================================
 
@@ -880,6 +895,7 @@ E0001         ; Format # Cf       LANGUAGE TAG
 052D          ; Lower # L&       CYRILLIC SMALL LETTER DCHE
 052F          ; Lower # L&       CYRILLIC SMALL LETTER EL WITH DESCENDER
 0560..0588    ; Lower # L&  [41] ARMENIAN SMALL LETTER TURNED AYB..ARMENIAN SMALL LETTER YI WITH STROKE
+10FC          ; Lower # Lm       MODIFIER LETTER GEORGIAN NAR
 13F8..13FD    ; Lower # L&   [6] CHEROKEE SMALL LETTER YE..CHEROKEE SMALL LETTER MV
 1C80..1C88    ; Lower # L&   [9] CYRILLIC SMALL LETTER ROUNDED VE..CYRILLIC SMALL LETTER UNBLENDED UK
 1D00..1D2B    ; Lower # L&  [44] LATIN LETTER SMALL CAPITAL A..CYRILLIC LETTER SMALL CAPITAL EL
@@ -1228,12 +1244,14 @@ A7D3          ; Lower # L&       LATIN SMALL LETTER DOUBLE THORN
 A7D5          ; Lower # L&       LATIN SMALL LETTER DOUBLE WYNN
 A7D7          ; Lower # L&       LATIN SMALL LETTER MIDDLE SCOTS S
 A7D9          ; Lower # L&       LATIN SMALL LETTER SIGMOID S
+A7F2..A7F4    ; Lower # Lm   [3] MODIFIER LETTER CAPITAL C..MODIFIER LETTER CAPITAL Q
 A7F6          ; Lower # L&       LATIN SMALL LETTER REVERSED HALF H
 A7F8..A7F9    ; Lower # Lm   [2] MODIFIER LETTER CAPITAL H WITH STROKE..MODIFIER LETTER SMALL LIGATURE OE
 A7FA          ; Lower # L&       LATIN LETTER SMALL CAPITAL TURNED M
 AB30..AB5A    ; Lower # L&  [43] LATIN SMALL LETTER BARRED ALPHA..LATIN SMALL LETTER Y WITH SHORT RIGHT LEG
 AB5C..AB5F    ; Lower # Lm   [4] MODIFIER LETTER SMALL HENG..MODIFIER LETTER SMALL U WITH LEFT HOOK
 AB60..AB68    ; Lower # L&   [9] LATIN SMALL LETTER SAKHA YAT..LATIN SMALL LETTER TURNED R WITH MIDDLE TILDE
+AB69          ; Lower # Lm       MODIFIER LETTER SMALL TURNED W
 AB70..ABBF    ; Lower # L&  [80] CHEROKEE SMALL LETTER A..CHEROKEE SMALL LETTER YA
 FB00..FB06    ; Lower # L&   [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST
 FB13..FB17    ; Lower # L&   [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH
@@ -1281,9 +1299,11 @@ FF41..FF5A    ; Lower # L&  [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN
 1D7CB         ; Lower # L&       MATHEMATICAL BOLD SMALL DIGAMMA
 1DF00..1DF09  ; Lower # L&  [10] LATIN SMALL LETTER FENG DIGRAPH WITH TRILL..LATIN SMALL LETTER T WITH HOOK AND RETROFLEX HOOK
 1DF0B..1DF1E  ; Lower # L&  [20] LATIN SMALL LETTER ESH WITH DOUBLE BAR..LATIN SMALL LETTER S WITH CURL
+1DF25..1DF2A  ; Lower # L&   [6] LATIN SMALL LETTER D WITH MID-HEIGHT LEFT HOOK..LATIN SMALL LETTER T WITH MID-HEIGHT LEFT HOOK
+1E030..1E06D  ; Lower # Lm  [62] MODIFIER LETTER CYRILLIC SMALL A..MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE
 1E922..1E943  ; Lower # L&  [34] ADLAM SMALL LETTER ALIF..ADLAM SMALL LETTER SHA
 
-# Total code points: 2424
+# Total code points: 2497
 
 # ================================================
 
@@ -2102,7 +2122,6 @@ FF21..FF3A    ; Upper # L&  [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LAT
 1075..1081    ; OLetter # Lo  [13] MYANMAR LETTER SHAN KA..MYANMAR LETTER SHAN HA
 108E          ; OLetter # Lo       MYANMAR LETTER RUMAI PALAUNG FA
 10D0..10FA    ; OLetter # L&  [43] GEORGIAN LETTER AN..GEORGIAN LETTER AIN
-10FC          ; OLetter # Lm       MODIFIER LETTER GEORGIAN NAR
 10FD..10FF    ; OLetter # L&   [3] GEORGIAN LETTER AEN..GEORGIAN LETTER LABIAL SIGN
 1100..1248    ; OLetter # Lo [329] HANGUL CHOSEONG KIYEOK..ETHIOPIC SYLLABLE QWA
 124A..124D    ; OLetter # Lo   [4] ETHIOPIC SYLLABLE QWI..ETHIOPIC SYLLABLE QWE
@@ -2215,7 +2234,6 @@ A6E6..A6EF    ; OLetter # Nl  [10] BAMUM LETTER MO..BAMUM LETTER KOGHOM
 A717..A71F    ; OLetter # Lm   [9] MODIFIER LETTER DOT VERTICAL BAR..MODIFIER LETTER LOW INVERTED EXCLAMATION MARK
 A788          ; OLetter # Lm       MODIFIER LETTER LOW CIRCUMFLEX ACCENT
 A78F          ; OLetter # Lo       LATIN LETTER SINOLOGICAL DOT
-A7F2..A7F4    ; OLetter # Lm   [3] MODIFIER LETTER CAPITAL C..MODIFIER LETTER CAPITAL Q
 A7F7          ; OLetter # Lo       LATIN EPIGRAPHIC LETTER SIDEWAYS I
 A7FB..A801    ; OLetter # Lo   [7] LATIN EPIGRAPHIC LETTER REVERSED F..SYLOTI NAGRI LETTER I
 A803..A805    ; OLetter # Lo   [3] SYLOTI NAGRI LETTER U..SYLOTI NAGRI LETTER O
@@ -2258,7 +2276,6 @@ AB09..AB0E    ; OLetter # Lo   [6] ETHIOPIC SYLLABLE DDHU..ETHIOPIC SYLLABLE DDH
 AB11..AB16    ; OLetter # Lo   [6] ETHIOPIC SYLLABLE DZU..ETHIOPIC SYLLABLE DZO
 AB20..AB26    ; OLetter # Lo   [7] ETHIOPIC SYLLABLE CCHHA..ETHIOPIC SYLLABLE CCHHO
 AB28..AB2E    ; OLetter # Lo   [7] ETHIOPIC SYLLABLE BBA..ETHIOPIC SYLLABLE BBO
-AB69          ; OLetter # Lm       MODIFIER LETTER SMALL TURNED W
 ABC0..ABE2    ; OLetter # Lo  [35] MEETEI MAYEK LETTER KOK..MEETEI MAYEK LETTER I LONSUM
 AC00..D7A3    ; OLetter # Lo [11172] HANGUL SYLLABLE GA..HANGUL SYLLABLE HIH
 D7B0..D7C6    ; OLetter # Lo  [23] HANGUL JUNGSEONG O-YEO..HANGUL JUNGSEONG ARAEA-E
@@ -2366,6 +2383,7 @@ FFDA..FFDC    ; OLetter # Lo   [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL
 111DC         ; OLetter # Lo       SHARADA HEADSTROKE
 11200..11211  ; OLetter # Lo  [18] KHOJKI LETTER A..KHOJKI LETTER JJA
 11213..1122B  ; OLetter # Lo  [25] KHOJKI LETTER NYA..KHOJKI LETTER LLA
+1123F..11240  ; OLetter # Lo   [2] KHOJKI LETTER QA..KHOJKI LETTER SHORT I
 11280..11286  ; OLetter # Lo   [7] MULTANI LETTER A..MULTANI LETTER GA
 11288         ; OLetter # Lo       MULTANI LETTER GHA
 1128A..1128D  ; OLetter # Lo   [4] MULTANI LETTER CA..MULTANI LETTER JJA
@@ -2427,12 +2445,16 @@ FFDA..FFDC    ; OLetter # Lo   [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL
 11D6A..11D89  ; OLetter # Lo  [32] GUNJALA GONDI LETTER OO..GUNJALA GONDI LETTER SA
 11D98         ; OLetter # Lo       GUNJALA GONDI OM
 11EE0..11EF2  ; OLetter # Lo  [19] MAKASAR LETTER KA..MAKASAR ANGKA
+11F02         ; OLetter # Lo       KAWI SIGN REPHA
+11F04..11F10  ; OLetter # Lo  [13] KAWI LETTER A..KAWI LETTER O
+11F12..11F33  ; OLetter # Lo  [34] KAWI LETTER KA..KAWI LETTER JNYA
 11FB0         ; OLetter # Lo       LISU LETTER YHA
 12000..12399  ; OLetter # Lo [922] CUNEIFORM SIGN A..CUNEIFORM SIGN U U
 12400..1246E  ; OLetter # Nl [111] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM
 12480..12543  ; OLetter # Lo [196] CUNEIFORM SIGN AB TIMES NUN TENU..CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU
 12F90..12FF0  ; OLetter # Lo  [97] CYPRO-MINOAN SIGN CM001..CYPRO-MINOAN SIGN CM114
-13000..1342E  ; OLetter # Lo [1071] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH AA032
+13000..1342F  ; OLetter # Lo [1072] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH V011D
+13441..13446  ; OLetter # Lo   [6] EGYPTIAN HIEROGLYPH FULL BLANK..EGYPTIAN HIEROGLYPH WIDE LOST SIGN
 14400..14646  ; OLetter # Lo [583] ANATOLIAN HIEROGLYPH A001..ANATOLIAN HIEROGLYPH A530
 16800..16A38  ; OLetter # Lo [569] BAMUM LETTER PHASE-A NGKUE MFON..BAMUM LETTER PHASE-F VUEQ
 16A40..16A5E  ; OLetter # Lo  [31] MRO LETTER TA..MRO LETTER TEK
@@ -2454,7 +2476,9 @@ FFDA..FFDC    ; OLetter # Lo   [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL
 1AFF5..1AFFB  ; OLetter # Lm   [7] KATAKANA LETTER MINNAN TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-5
 1AFFD..1AFFE  ; OLetter # Lm   [2] KATAKANA LETTER MINNAN NASALIZED TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-8
 1B000..1B122  ; OLetter # Lo [291] KATAKANA LETTER ARCHAIC E..KATAKANA LETTER ARCHAIC WU
+1B132         ; OLetter # Lo       HIRAGANA LETTER SMALL KO
 1B150..1B152  ; OLetter # Lo   [3] HIRAGANA LETTER SMALL WI..HIRAGANA LETTER SMALL WO
+1B155         ; OLetter # Lo       KATAKANA LETTER SMALL KO
 1B164..1B167  ; OLetter # Lo   [4] KATAKANA LETTER SMALL WI..KATAKANA LETTER SMALL N
 1B170..1B2FB  ; OLetter # Lo [396] NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB
 1BC00..1BC6A  ; OLetter # Lo [107] DUPLOYAN LETTER H..DUPLOYAN LETTER VOCALIC M
@@ -2467,6 +2491,8 @@ FFDA..FFDC    ; OLetter # Lo   [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL
 1E14E         ; OLetter # Lo       NYIAKENG PUACHUE HMONG LOGOGRAM NYAJ
 1E290..1E2AD  ; OLetter # Lo  [30] TOTO LETTER PA..TOTO LETTER A
 1E2C0..1E2EB  ; OLetter # Lo  [44] WANCHO LETTER AA..WANCHO LETTER YIH
+1E4D0..1E4EA  ; OLetter # Lo  [27] NAG MUNDARI LETTER O..NAG MUNDARI LETTER ELL
+1E4EB         ; OLetter # Lm       NAG MUNDARI SIGN OJOD
 1E7E0..1E7E6  ; OLetter # Lo   [7] ETHIOPIC SYLLABLE HHYA..ETHIOPIC SYLLABLE HHYO
 1E7E8..1E7EB  ; OLetter # Lo   [4] ETHIOPIC SYLLABLE GURAGE HHWA..ETHIOPIC SYLLABLE HHWE
 1E7ED..1E7EE  ; OLetter # Lo   [2] ETHIOPIC SYLLABLE GURAGE MWI..ETHIOPIC SYLLABLE GURAGE MWEE
@@ -2507,14 +2533,15 @@ FFDA..FFDC    ; OLetter # Lo   [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL
 1EEA5..1EEA9  ; OLetter # Lo   [5] ARABIC MATHEMATICAL DOUBLE-STRUCK WAW..ARABIC MATHEMATICAL DOUBLE-STRUCK YEH
 1EEAB..1EEBB  ; OLetter # Lo  [17] ARABIC MATHEMATICAL DOUBLE-STRUCK LAM..ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN
 20000..2A6DF  ; OLetter # Lo [42720] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6DF
-2A700..2B738  ; OLetter # Lo [4153] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B738
+2A700..2B739  ; OLetter # Lo [4154] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B739
 2B740..2B81D  ; OLetter # Lo [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D
 2B820..2CEA1  ; OLetter # Lo [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1
 2CEB0..2EBE0  ; OLetter # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0
 2F800..2FA1D  ; OLetter # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D
 30000..3134A  ; OLetter # Lo [4939] CJK UNIFIED IDEOGRAPH-30000..CJK UNIFIED IDEOGRAPH-3134A
+31350..323AF  ; OLetter # Lo [4192] CJK UNIFIED IDEOGRAPH-31350..CJK UNIFIED IDEOGRAPH-323AF
 
-# Total code points: 127761
+# Total code points: 132036
 
 # ================================================
 
@@ -2573,16 +2600,18 @@ FF10..FF19    ; Numeric # Nd  [10] FULLWIDTH DIGIT ZERO..FULLWIDTH DIGIT NINE
 11C50..11C59  ; Numeric # Nd  [10] BHAIKSUKI DIGIT ZERO..BHAIKSUKI DIGIT NINE
 11D50..11D59  ; Numeric # Nd  [10] MASARAM GONDI DIGIT ZERO..MASARAM GONDI DIGIT NINE
 11DA0..11DA9  ; Numeric # Nd  [10] GUNJALA GONDI DIGIT ZERO..GUNJALA GONDI DIGIT NINE
+11F50..11F59  ; Numeric # Nd  [10] KAWI DIGIT ZERO..KAWI DIGIT NINE
 16A60..16A69  ; Numeric # Nd  [10] MRO DIGIT ZERO..MRO DIGIT NINE
 16AC0..16AC9  ; Numeric # Nd  [10] TANGSA DIGIT ZERO..TANGSA DIGIT NINE
 16B50..16B59  ; Numeric # Nd  [10] PAHAWH HMONG DIGIT ZERO..PAHAWH HMONG DIGIT NINE
 1D7CE..1D7FF  ; Numeric # Nd  [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE
 1E140..1E149  ; Numeric # Nd  [10] NYIAKENG PUACHUE HMONG DIGIT ZERO..NYIAKENG PUACHUE HMONG DIGIT NINE
 1E2F0..1E2F9  ; Numeric # Nd  [10] WANCHO DIGIT ZERO..WANCHO DIGIT NINE
+1E4F0..1E4F9  ; Numeric # Nd  [10] NAG MUNDARI DIGIT ZERO..NAG MUNDARI DIGIT NINE
 1E950..1E959  ; Numeric # Nd  [10] ADLAM DIGIT ZERO..ADLAM DIGIT NINE
 1FBF0..1FBF9  ; Numeric # Nd  [10] SEGMENTED DIGIT ZERO..SEGMENTED DIGIT NINE
 
-# Total code points: 662
+# Total code points: 682
 
 # ================================================
 
@@ -2664,6 +2693,7 @@ FF61          ; STerm # Po       HALFWIDTH IDEOGRAPHIC FULL STOP
 11A9B..11A9C  ; STerm # Po   [2] SOYOMBO MARK SHAD..SOYOMBO MARK DOUBLE SHAD
 11C41..11C42  ; STerm # Po   [2] BHAIKSUKI DANDA..BHAIKSUKI DOUBLE DANDA
 11EF7..11EF8  ; STerm # Po   [2] MAKASAR PASSIMBANG..MAKASAR END OF SECTION
+11F43..11F44  ; STerm # Po   [2] KAWI DANDA..KAWI DOUBLE DANDA
 16A6E..16A6F  ; STerm # Po   [2] MRO DANDA..MRO DOUBLE DANDA
 16AF5         ; STerm # Po       BASSA VAH FULL STOP
 16B37..16B38  ; STerm # Po   [2] PAHAWH HMONG SIGN VOS THOM..PAHAWH HMONG SIGN VOS TSHAB CEEB
@@ -2672,7 +2702,7 @@ FF61          ; STerm # Po       HALFWIDTH IDEOGRAPHIC FULL STOP
 1BC9F         ; STerm # Po       DUPLOYAN PUNCTUATION CHINOOK FULL STOP
 1DA88         ; STerm # Po       SIGNWRITING FULL STOP
 
-# Total code points: 149
+# Total code points: 151
 
 # ================================================
 
index 1d1435b..27f64bf 100644 (file)
@@ -1,11 +1,11 @@
-# WordBreakTest-14.0.0.txt
-# Date: 2021-03-08, 06:22:40 GMT
-# © 2021 Unicode®, Inc.
+# WordBreakTest-15.0.0.txt
+# Date: 2022-02-26, 00:39:00 GMT
+# © 2022 Unicode®, Inc.
 # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
-# For terms of use, see http://www.unicode.org/terms_of_use.html
+# For terms of use, see https://www.unicode.org/terms_of_use.html
 #
 # Unicode Character Database
-#   For documentation, see http://www.unicode.org/reports/tr44/
+#   For documentation, see https://www.unicode.org/reports/tr44/
 #
 # Default Word_Break Test
 #
index 73cd069..6f868d2 100644 (file)
@@ -1,11 +1,11 @@
-# WordBreakProperty-14.0.0.txt
-# Date: 2021-07-10, 00:35:32 GMT
-# © 2021 Unicode®, Inc.
+# WordBreakProperty-15.0.0.txt
+# Date: 2022-04-27, 02:41:26 GMT
+# © 2022 Unicode®, Inc.
 # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
-# For terms of use, see http://www.unicode.org/terms_of_use.html
+# For terms of use, see https://www.unicode.org/terms_of_use.html
 #
 # Unicode Character Database
-#   For documentation, see http://www.unicode.org/reports/tr44/
+#   For documentation, see https://www.unicode.org/reports/tr44/
 
 # ================================================
 
@@ -180,6 +180,7 @@ FB46..FB4F    ; Hebrew_Letter # Lo  [10] HEBREW LETTER TSADI WITH DAGESH..HEBREW
 0CCC..0CCD    ; Extend # Mn   [2] KANNADA VOWEL SIGN AU..KANNADA SIGN VIRAMA
 0CD5..0CD6    ; Extend # Mc   [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK
 0CE2..0CE3    ; Extend # Mn   [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL
+0CF3          ; Extend # Mc       KANNADA SIGN COMBINING ANUSVARA ABOVE RIGHT
 0D00..0D01    ; Extend # Mn   [2] MALAYALAM SIGN COMBINING ANUSVARA ABOVE..MALAYALAM SIGN CANDRABINDU
 0D02..0D03    ; Extend # Mc   [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA
 0D3B..0D3C    ; Extend # Mn   [2] MALAYALAM SIGN VERTICAL BAR VIRAMA..MALAYALAM SIGN CIRCULAR VIRAMA
@@ -203,7 +204,7 @@ FB46..FB4F    ; Hebrew_Letter # Lo  [10] HEBREW LETTER TSADI WITH DAGESH..HEBREW
 0E47..0E4E    ; Extend # Mn   [8] THAI CHARACTER MAITAIKHU..THAI CHARACTER YAMAKKAN
 0EB1          ; Extend # Mn       LAO VOWEL SIGN MAI KAN
 0EB4..0EBC    ; Extend # Mn   [9] LAO VOWEL SIGN I..LAO SEMIVOWEL SIGN LO
-0EC8..0ECD    ; Extend # Mn   [6] LAO TONE MAI EK..LAO NIGGAHITA
+0EC8..0ECE    ; Extend # Mn   [7] LAO TONE MAI EK..LAO YAMAKKAN
 0F18..0F19    ; Extend # Mn   [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS
 0F35          ; Extend # Mn       TIBETAN MARK NGAS BZUNG NYI ZLA
 0F37          ; Extend # Mn       TIBETAN MARK NGAS BZUNG SGOR RTAGS
@@ -407,6 +408,7 @@ FF9E..FF9F    ; Extend # Lm   [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDT
 10AE5..10AE6  ; Extend # Mn   [2] MANICHAEAN ABBREVIATION MARK ABOVE..MANICHAEAN ABBREVIATION MARK BELOW
 10D24..10D27  ; Extend # Mn   [4] HANIFI ROHINGYA SIGN HARBAHAY..HANIFI ROHINGYA SIGN TASSI
 10EAB..10EAC  ; Extend # Mn   [2] YEZIDI COMBINING HAMZA MARK..YEZIDI COMBINING MADDA MARK
+10EFD..10EFF  ; Extend # Mn   [3] ARABIC SMALL LOW WORD SAKTA..ARABIC SMALL LOW WORD MADDA
 10F46..10F50  ; Extend # Mn  [11] SOGDIAN COMBINING DOT BELOW..SOGDIAN COMBINING STROKE BELOW
 10F82..10F85  ; Extend # Mn   [4] OLD UYGHUR COMBINING DOT ABOVE..OLD UYGHUR COMBINING TWO DOTS BELOW
 11000         ; Extend # Mc       BRAHMI SIGN CANDRABINDU
@@ -443,6 +445,7 @@ FF9E..FF9F    ; Extend # Lm   [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDT
 11235         ; Extend # Mc       KHOJKI SIGN VIRAMA
 11236..11237  ; Extend # Mn   [2] KHOJKI SIGN NUKTA..KHOJKI SIGN SHADDA
 1123E         ; Extend # Mn       KHOJKI SIGN SUKUN
+11241         ; Extend # Mn       KHOJKI VOWEL SIGN VOCALIC R
 112DF         ; Extend # Mn       KHUDAWADI SIGN ANUSVARA
 112E0..112E2  ; Extend # Mc   [3] KHUDAWADI VOWEL SIGN AA..KHUDAWADI VOWEL SIGN II
 112E3..112EA  ; Extend # Mn   [8] KHUDAWADI VOWEL SIGN U..KHUDAWADI SIGN VIRAMA
@@ -552,6 +555,16 @@ FF9E..FF9F    ; Extend # Lm   [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDT
 11D97         ; Extend # Mn       GUNJALA GONDI VIRAMA
 11EF3..11EF4  ; Extend # Mn   [2] MAKASAR VOWEL SIGN I..MAKASAR VOWEL SIGN U
 11EF5..11EF6  ; Extend # Mc   [2] MAKASAR VOWEL SIGN E..MAKASAR VOWEL SIGN O
+11F00..11F01  ; Extend # Mn   [2] KAWI SIGN CANDRABINDU..KAWI SIGN ANUSVARA
+11F03         ; Extend # Mc       KAWI SIGN VISARGA
+11F34..11F35  ; Extend # Mc   [2] KAWI VOWEL SIGN AA..KAWI VOWEL SIGN ALTERNATE AA
+11F36..11F3A  ; Extend # Mn   [5] KAWI VOWEL SIGN I..KAWI VOWEL SIGN VOCALIC R
+11F3E..11F3F  ; Extend # Mc   [2] KAWI VOWEL SIGN E..KAWI VOWEL SIGN AI
+11F40         ; Extend # Mn       KAWI VOWEL SIGN EU
+11F41         ; Extend # Mc       KAWI SIGN KILLER
+11F42         ; Extend # Mn       KAWI CONJOINER
+13440         ; Extend # Mn       EGYPTIAN HIEROGLYPH MIRROR HORIZONTALLY
+13447..13455  ; Extend # Mn  [15] EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP START..EGYPTIAN HIEROGLYPH MODIFIER DAMAGED
 16AF0..16AF4  ; Extend # Mn   [5] BASSA VAH COMBINING HIGH TONE..BASSA VAH COMBINING HIGH-LOW TONE
 16B30..16B36  ; Extend # Mn   [7] PAHAWH HMONG MARK CIM TUB..PAHAWH HMONG MARK CIM TAUM
 16F4F         ; Extend # Mn       MIAO SIGN CONSONANT MODIFIER BAR
@@ -580,16 +593,18 @@ FF9E..FF9F    ; Extend # Lm   [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDT
 1E01B..1E021  ; Extend # Mn   [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI
 1E023..1E024  ; Extend # Mn   [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS
 1E026..1E02A  ; Extend # Mn   [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA
+1E08F         ; Extend # Mn       COMBINING CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
 1E130..1E136  ; Extend # Mn   [7] NYIAKENG PUACHUE HMONG TONE-B..NYIAKENG PUACHUE HMONG TONE-D
 1E2AE         ; Extend # Mn       TOTO SIGN RISING TONE
 1E2EC..1E2EF  ; Extend # Mn   [4] WANCHO TONE TUP..WANCHO TONE KOINI
+1E4EC..1E4EF  ; Extend # Mn   [4] NAG MUNDARI SIGN MUHOR..NAG MUNDARI SIGN SUTUH
 1E8D0..1E8D6  ; Extend # Mn   [7] MENDE KIKAKUI COMBINING NUMBER TEENS..MENDE KIKAKUI COMBINING NUMBER MILLIONS
 1E944..1E94A  ; Extend # Mn   [7] ADLAM ALIF LENGTHENER..ADLAM NUKTA
 1F3FB..1F3FF  ; Extend # Sk   [5] EMOJI MODIFIER FITZPATRICK TYPE-1-2..EMOJI MODIFIER FITZPATRICK TYPE-6
 E0020..E007F  ; Extend # Cf  [96] TAG SPACE..CANCEL TAG
 E0100..E01EF  ; Extend # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256
 
-# Total code points: 2512
+# Total code points: 2554
 
 # ================================================
 
@@ -615,12 +630,12 @@ FEFF          ; Format # Cf       ZERO WIDTH NO-BREAK SPACE
 FFF9..FFFB    ; Format # Cf   [3] INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTATION TERMINATOR
 110BD         ; Format # Cf       KAITHI NUMBER SIGN
 110CD         ; Format # Cf       KAITHI NUMBER SIGN ABOVE
-13430..13438  ; Format # Cf   [9] EGYPTIAN HIEROGLYPH VERTICAL JOINER..EGYPTIAN HIEROGLYPH END SEGMENT
+13430..1343F  ; Format # Cf  [16] EGYPTIAN HIEROGLYPH VERTICAL JOINER..EGYPTIAN HIEROGLYPH END WALLED ENCLOSURE
 1BCA0..1BCA3  ; Format # Cf   [4] SHORTHAND FORMAT LETTER OVERLAP..SHORTHAND FORMAT UP STEP
 1D173..1D17A  ; Format # Cf   [8] MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE
 E0001         ; Format # Cf       LANGUAGE TAG
 
-# Total code points: 64
+# Total code points: 71
 
 # ================================================
 
@@ -641,9 +656,10 @@ FF71..FF9D    ; Katakana # Lo  [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAK
 1AFFD..1AFFE  ; Katakana # Lm   [2] KATAKANA LETTER MINNAN NASALIZED TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-8
 1B000         ; Katakana # Lo       KATAKANA LETTER ARCHAIC E
 1B120..1B122  ; Katakana # Lo   [3] KATAKANA LETTER ARCHAIC YI..KATAKANA LETTER ARCHAIC WU
+1B155         ; Katakana # Lo       KATAKANA LETTER SMALL KO
 1B164..1B167  ; Katakana # Lo   [4] KATAKANA LETTER SMALL WI..KATAKANA LETTER SMALL N
 
-# Total code points: 330
+# Total code points: 331
 
 # ================================================
 
@@ -1127,6 +1143,7 @@ FFDA..FFDC    ; ALetter # Lo   [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL
 111DC         ; ALetter # Lo       SHARADA HEADSTROKE
 11200..11211  ; ALetter # Lo  [18] KHOJKI LETTER A..KHOJKI LETTER JJA
 11213..1122B  ; ALetter # Lo  [25] KHOJKI LETTER NYA..KHOJKI LETTER LLA
+1123F..11240  ; ALetter # Lo   [2] KHOJKI LETTER QA..KHOJKI LETTER SHORT I
 11280..11286  ; ALetter # Lo   [7] MULTANI LETTER A..MULTANI LETTER GA
 11288         ; ALetter # Lo       MULTANI LETTER GHA
 1128A..1128D  ; ALetter # Lo   [4] MULTANI LETTER CA..MULTANI LETTER JJA
@@ -1187,12 +1204,16 @@ FFDA..FFDC    ; ALetter # Lo   [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL
 11D6A..11D89  ; ALetter # Lo  [32] GUNJALA GONDI LETTER OO..GUNJALA GONDI LETTER SA
 11D98         ; ALetter # Lo       GUNJALA GONDI OM
 11EE0..11EF2  ; ALetter # Lo  [19] MAKASAR LETTER KA..MAKASAR ANGKA
+11F02         ; ALetter # Lo       KAWI SIGN REPHA
+11F04..11F10  ; ALetter # Lo  [13] KAWI LETTER A..KAWI LETTER O
+11F12..11F33  ; ALetter # Lo  [34] KAWI LETTER KA..KAWI LETTER JNYA
 11FB0         ; ALetter # Lo       LISU LETTER YHA
 12000..12399  ; ALetter # Lo [922] CUNEIFORM SIGN A..CUNEIFORM SIGN U U
 12400..1246E  ; ALetter # Nl [111] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM
 12480..12543  ; ALetter # Lo [196] CUNEIFORM SIGN AB TIMES NUN TENU..CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU
 12F90..12FF0  ; ALetter # Lo  [97] CYPRO-MINOAN SIGN CM001..CYPRO-MINOAN SIGN CM114
-13000..1342E  ; ALetter # Lo [1071] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH AA032
+13000..1342F  ; ALetter # Lo [1072] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH V011D
+13441..13446  ; ALetter # Lo   [6] EGYPTIAN HIEROGLYPH FULL BLANK..EGYPTIAN HIEROGLYPH WIDE LOST SIGN
 14400..14646  ; ALetter # Lo [583] ANATOLIAN HIEROGLYPH A001..ANATOLIAN HIEROGLYPH A530
 16800..16A38  ; ALetter # Lo [569] BAMUM LETTER PHASE-A NGKUE MFON..BAMUM LETTER PHASE-F VUEQ
 16A40..16A5E  ; ALetter # Lo  [31] MRO LETTER TA..MRO LETTER TEK
@@ -1245,11 +1266,15 @@ FFDA..FFDC    ; ALetter # Lo   [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL
 1DF00..1DF09  ; ALetter # L&  [10] LATIN SMALL LETTER FENG DIGRAPH WITH TRILL..LATIN SMALL LETTER T WITH HOOK AND RETROFLEX HOOK
 1DF0A         ; ALetter # Lo       LATIN LETTER RETROFLEX CLICK WITH RETROFLEX HOOK
 1DF0B..1DF1E  ; ALetter # L&  [20] LATIN SMALL LETTER ESH WITH DOUBLE BAR..LATIN SMALL LETTER S WITH CURL
+1DF25..1DF2A  ; ALetter # L&   [6] LATIN SMALL LETTER D WITH MID-HEIGHT LEFT HOOK..LATIN SMALL LETTER T WITH MID-HEIGHT LEFT HOOK
+1E030..1E06D  ; ALetter # Lm  [62] MODIFIER LETTER CYRILLIC SMALL A..MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE
 1E100..1E12C  ; ALetter # Lo  [45] NYIAKENG PUACHUE HMONG LETTER MA..NYIAKENG PUACHUE HMONG LETTER W
 1E137..1E13D  ; ALetter # Lm   [7] NYIAKENG PUACHUE HMONG SIGN FOR PERSON..NYIAKENG PUACHUE HMONG SYLLABLE LENGTHENER
 1E14E         ; ALetter # Lo       NYIAKENG PUACHUE HMONG LOGOGRAM NYAJ
 1E290..1E2AD  ; ALetter # Lo  [30] TOTO LETTER PA..TOTO LETTER A
 1E2C0..1E2EB  ; ALetter # Lo  [44] WANCHO LETTER AA..WANCHO LETTER YIH
+1E4D0..1E4EA  ; ALetter # Lo  [27] NAG MUNDARI LETTER O..NAG MUNDARI LETTER ELL
+1E4EB         ; ALetter # Lm       NAG MUNDARI SIGN OJOD
 1E7E0..1E7E6  ; ALetter # Lo   [7] ETHIOPIC SYLLABLE HHYA..ETHIOPIC SYLLABLE HHYO
 1E7E8..1E7EB  ; ALetter # Lo   [4] ETHIOPIC SYLLABLE GURAGE HHWA..ETHIOPIC SYLLABLE HHWE
 1E7ED..1E7EE  ; ALetter # Lo   [2] ETHIOPIC SYLLABLE GURAGE MWI..ETHIOPIC SYLLABLE GURAGE MWEE
@@ -1294,7 +1319,7 @@ FFDA..FFDC    ; ALetter # Lo   [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL
 1F150..1F169  ; ALetter # So  [26] NEGATIVE CIRCLED LATIN CAPITAL LETTER A..NEGATIVE CIRCLED LATIN CAPITAL LETTER Z
 1F170..1F189  ; ALetter # So  [26] NEGATIVE SQUARED LATIN CAPITAL LETTER A..NEGATIVE SQUARED LATIN CAPITAL LETTER Z
 
-# Total code points: 29336
+# Total code points: 29489
 
 # ================================================
 
@@ -1398,16 +1423,18 @@ FF10..FF19    ; Numeric # Nd  [10] FULLWIDTH DIGIT ZERO..FULLWIDTH DIGIT NINE
 11C50..11C59  ; Numeric # Nd  [10] BHAIKSUKI DIGIT ZERO..BHAIKSUKI DIGIT NINE
 11D50..11D59  ; Numeric # Nd  [10] MASARAM GONDI DIGIT ZERO..MASARAM GONDI DIGIT NINE
 11DA0..11DA9  ; Numeric # Nd  [10] GUNJALA GONDI DIGIT ZERO..GUNJALA GONDI DIGIT NINE
+11F50..11F59  ; Numeric # Nd  [10] KAWI DIGIT ZERO..KAWI DIGIT NINE
 16A60..16A69  ; Numeric # Nd  [10] MRO DIGIT ZERO..MRO DIGIT NINE
 16AC0..16AC9  ; Numeric # Nd  [10] TANGSA DIGIT ZERO..TANGSA DIGIT NINE
 16B50..16B59  ; Numeric # Nd  [10] PAHAWH HMONG DIGIT ZERO..PAHAWH HMONG DIGIT NINE
 1D7CE..1D7FF  ; Numeric # Nd  [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE
 1E140..1E149  ; Numeric # Nd  [10] NYIAKENG PUACHUE HMONG DIGIT ZERO..NYIAKENG PUACHUE HMONG DIGIT NINE
 1E2F0..1E2F9  ; Numeric # Nd  [10] WANCHO DIGIT ZERO..WANCHO DIGIT NINE
+1E4F0..1E4F9  ; Numeric # Nd  [10] NAG MUNDARI DIGIT ZERO..NAG MUNDARI DIGIT NINE
 1E950..1E959  ; Numeric # Nd  [10] ADLAM DIGIT ZERO..ADLAM DIGIT NINE
 1FBF0..1FBF9  ; Numeric # Nd  [10] SEGMENTED DIGIT ZERO..SEGMENTED DIGIT NINE
 
-# Total code points: 661
+# Total code points: 681
 
 # ================================================
 
index 4012dc2..55b30a6 100644 (file)
@@ -1,36 +1,19 @@
-# DerivedBidiClass-14.0.0.txt
-# Date: 2021-07-10, 00:35:02 GMT
-# © 2021 Unicode®, Inc.
+# DerivedBidiClass-15.0.0.txt
+# Date: 2022-08-05, 17:39:24 GMT
+# © 2022 Unicode®, Inc.
 # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
-# For terms of use, see http://www.unicode.org/terms_of_use.html
+# For terms of use, see https://www.unicode.org/terms_of_use.html
 #
 # Unicode Character Database
-#   For documentation, see http://www.unicode.org/reports/tr44/
+#   For documentation, see https://www.unicode.org/reports/tr44/
 
 # ================================================
 
 # Bidi Class (listing UnicodeData.txt, field 4: see UAX #44: https://www.unicode.org/reports/tr44/)
 # Unlike other properties, unassigned code points in blocks
-# reserved for right-to-left scripts are given either types R or AL.
-#
-# The unassigned code points that default to AL are in the ranges:
-#     [\u0600-\u07BF \u0860-\u08FF \uFB50-\uFDCF \uFDF0-\uFDFF \uFE70-\uFEFF
-#      \U00010D00-\U00010D3F \U00010F30-\U00010F6F
-#      \U0001EC70-\U0001ECBF \U0001ED00-\U0001ED4F \U0001EE00-\U0001EEFF]
-#
-#     This includes code points in the Arabic, Syriac, and Thaana blocks, among others.
-#
-# The unassigned code points that default to R are in the ranges:
-#     [\u0590-\u05FF \u07C0-\u085F \uFB1D-\uFB4F
-#      \U00010800-\U00010CFF \U00010D40-\U00010F2F \U00010F70-\U00010FFF
-#      \U0001E800-\U0001EC6F \U0001ECC0-\U0001ECFF \U0001ED50-\U0001EDFF \U0001EF00-\U0001EFFF]
-#
-#     This includes code points in the Hebrew, NKo, and Phoenician blocks, among others.
-#
-# The unassigned code points that default to ET are in the range:
-#     [\u20A0-\u20CF]
-#
-#     This consists of code points in the Currency Symbols block.
+# reserved for right-to-left scripts are given either values R or AL,
+# and unassigned code points in the Currency Symbols block are given the value ET.
+# For details see the @missing lines below.
 #
 # The unassigned code points that default to BN have one of the following properties:
 #     Default_Ignorable_Code_Point
 
 # @missing: 0000..10FFFF; Left_To_Right
 
+# 0590..05FF Hebrew
+# @missing: 0590..05FF; Right_To_Left
+
+# 0600..06FF Arabic
+# 0700..074F Syriac
+# 0750..077F Arabic_Supplement
+# 0780..07BF Thaana
+# @missing: 0600..07BF; Arabic_Letter
+
+# 07C0..07FF NKo
+# 0800..083F Samaritan
+# 0840..085F Mandaic
+# @missing: 07C0..085F; Right_To_Left
+
+# 0860..086F Syriac_Supplement
+# 0870..089F Arabic_Extended_B
+# 08A0..08FF Arabic_Extended_A
+# @missing: 0860..08FF; Arabic_Letter
+
+# 20A0..20CF Currency_Symbols
+# @missing: 20A0..20CF; European_Terminator
+
+# FB00..FB4F Alphabetic_Presentation_Forms (partial)
+# @missing: FB1D..FB4F; Right_To_Left
+
+# FB50..FDFF Arabic_Presentation_Forms_A (partial)
+# @missing: FB50..FDCF; Arabic_Letter
+
+# FB50..FDFF Arabic_Presentation_Forms_A (partial)
+# @missing: FDF0..FDFF; Arabic_Letter
+
+# FE70..FEFF Arabic_Presentation_Forms_B
+# @missing: FE70..FEFF; Arabic_Letter
+
+# 10800..1083F Cypriot_Syllabary
+# 10840..1085F Imperial_Aramaic
+# 10860..1087F Palmyrene
+# 10880..108AF Nabataean
+# 108E0..108FF Hatran
+# 10900..1091F Phoenician
+# 10920..1093F Lydian
+# 10980..1099F Meroitic_Hieroglyphs
+# 109A0..109FF Meroitic_Cursive
+# 10A00..10A5F Kharoshthi
+# 10A60..10A7F Old_South_Arabian
+# 10A80..10A9F Old_North_Arabian
+# 10AC0..10AFF Manichaean
+# 10B00..10B3F Avestan
+# 10B40..10B5F Inscriptional_Parthian
+# 10B60..10B7F Inscriptional_Pahlavi
+# 10B80..10BAF Psalter_Pahlavi
+# 10C00..10C4F Old_Turkic
+# 10C80..10CFF Old_Hungarian
+# @missing: 10800..10CFF; Right_To_Left
+
+# 10D00..10D3F Hanifi_Rohingya
+# @missing: 10D00..10D3F; Arabic_Letter
+
+# 10E60..10E7F Rumi_Numeral_Symbols
+# 10E80..10EBF Yezidi
+# @missing: 10D40..10EBF; Right_To_Left
+
+# 10EC0..10EFF Arabic_Extended_C
+# @missing: 10EC0..10EFF; Arabic_Letter
+
+# 10F00..10F2F Old_Sogdian
+# @missing: 10F00..10F2F; Right_To_Left
+
+# 10F30..10F6F Sogdian
+# @missing: 10F30..10F6F; Arabic_Letter
+
+# 10F70..10FAF Old_Uyghur
+# 10FB0..10FDF Chorasmian
+# 10FE0..10FFF Elymaic
+# @missing: 10F70..10FFF; Right_To_Left
+
+# 1E800..1E8DF Mende_Kikakui
+# 1E900..1E95F Adlam
+# @missing: 1E800..1EC6F; Right_To_Left
+
+# 1EC70..1ECBF Indic_Siyaq_Numbers
+# @missing: 1EC70..1ECBF; Arabic_Letter
+
+# @missing: 1ECC0..1ECFF; Right_To_Left
+
+# 1ED00..1ED4F Ottoman_Siyaq_Numbers
+# @missing: 1ED00..1ED4F; Arabic_Letter
+
+# @missing: 1ED50..1EDFF; Right_To_Left
+
+# 1EE00..1EEFF Arabic_Mathematical_Alphabetic_Symbols
+# @missing: 1EE00..1EEFF; Arabic_Letter
+
+# @missing: 1EF00..1EFFF; Right_To_Left
+
 # ================================================
 
 # Bidi_Class=Left_To_Right
 0CE0..0CE1    ; L # Lo   [2] KANNADA LETTER VOCALIC RR..KANNADA LETTER VOCALIC LL
 0CE6..0CEF    ; L # Nd  [10] KANNADA DIGIT ZERO..KANNADA DIGIT NINE
 0CF1..0CF2    ; L # Lo   [2] KANNADA SIGN JIHVAMULIYA..KANNADA SIGN UPADHMANIYA
+0CF3          ; L # Mc       KANNADA SIGN COMBINING ANUSVARA ABOVE RIGHT
 0D02..0D03    ; L # Mc   [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA
 0D04..0D0C    ; L # Lo   [9] MALAYALAM LETTER VEDIC ANUSVARA..MALAYALAM LETTER VOCALIC L
 0D0E..0D10    ; L # Lo   [3] MALAYALAM LETTER E..MALAYALAM LETTER AI
@@ -795,6 +874,7 @@ FFDA..FFDC    ; L # Lo   [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER
 11232..11233  ; L # Mc   [2] KHOJKI VOWEL SIGN O..KHOJKI VOWEL SIGN AU
 11235         ; L # Mc       KHOJKI SIGN VIRAMA
 11238..1123D  ; L # Po   [6] KHOJKI DANDA..KHOJKI ABBREVIATION SIGN
+1123F..11240  ; L # Lo   [2] KHOJKI LETTER QA..KHOJKI LETTER SHORT I
 11280..11286  ; L # Lo   [7] MULTANI LETTER A..MULTANI LETTER GA
 11288         ; L # Lo       MULTANI LETTER GHA
 1128A..1128D  ; L # Lo   [4] MULTANI LETTER CA..MULTANI LETTER JJA
@@ -910,6 +990,7 @@ FFDA..FFDC    ; L # Lo   [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER
 11A9D         ; L # Lo       SOYOMBO MARK PLUTA
 11A9E..11AA2  ; L # Po   [5] SOYOMBO HEAD MARK WITH MOON AND SUN AND TRIPLE FLAME..SOYOMBO TERMINAL MARK-2
 11AB0..11AF8  ; L # Lo  [73] CANADIAN SYLLABICS NATTILIK HI..PAU CIN HAU GLOTTAL STOP FINAL
+11B00..11B09  ; L # Po  [10] DEVANAGARI HEAD MARK..DEVANAGARI SIGN MINDU
 11C00..11C08  ; L # Lo   [9] BHAIKSUKI LETTER A..BHAIKSUKI LETTER VOCALIC L
 11C0A..11C2E  ; L # Lo  [37] BHAIKSUKI LETTER E..BHAIKSUKI LETTER HA
 11C2F         ; L # Mc       BHAIKSUKI VOWEL SIGN AA
@@ -940,6 +1021,15 @@ FFDA..FFDC    ; L # Lo   [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER
 11EE0..11EF2  ; L # Lo  [19] MAKASAR LETTER KA..MAKASAR ANGKA
 11EF5..11EF6  ; L # Mc   [2] MAKASAR VOWEL SIGN E..MAKASAR VOWEL SIGN O
 11EF7..11EF8  ; L # Po   [2] MAKASAR PASSIMBANG..MAKASAR END OF SECTION
+11F02         ; L # Lo       KAWI SIGN REPHA
+11F03         ; L # Mc       KAWI SIGN VISARGA
+11F04..11F10  ; L # Lo  [13] KAWI LETTER A..KAWI LETTER O
+11F12..11F33  ; L # Lo  [34] KAWI LETTER KA..KAWI LETTER JNYA
+11F34..11F35  ; L # Mc   [2] KAWI VOWEL SIGN AA..KAWI VOWEL SIGN ALTERNATE AA
+11F3E..11F3F  ; L # Mc   [2] KAWI VOWEL SIGN E..KAWI VOWEL SIGN AI
+11F41         ; L # Mc       KAWI SIGN KILLER
+11F43..11F4F  ; L # Po  [13] KAWI DANDA..KAWI PUNCTUATION CLOSING SPIRAL
+11F50..11F59  ; L # Nd  [10] KAWI DIGIT ZERO..KAWI DIGIT NINE
 11FB0         ; L # Lo       LISU LETTER YHA
 11FC0..11FD4  ; L # No  [21] TAMIL FRACTION ONE THREE-HUNDRED-AND-TWENTIETH..TAMIL FRACTION DOWNSCALING FACTOR KIIZH
 11FFF         ; L # Po       TAMIL PUNCTUATION END OF TEXT
@@ -949,8 +1039,9 @@ FFDA..FFDC    ; L # Lo   [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER
 12480..12543  ; L # Lo [196] CUNEIFORM SIGN AB TIMES NUN TENU..CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU
 12F90..12FF0  ; L # Lo  [97] CYPRO-MINOAN SIGN CM001..CYPRO-MINOAN SIGN CM114
 12FF1..12FF2  ; L # Po   [2] CYPRO-MINOAN SIGN CM301..CYPRO-MINOAN SIGN CM302
-13000..1342E  ; L # Lo [1071] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH AA032
-13430..13438  ; L # Cf   [9] EGYPTIAN HIEROGLYPH VERTICAL JOINER..EGYPTIAN HIEROGLYPH END SEGMENT
+13000..1342F  ; L # Lo [1072] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH V011D
+13430..1343F  ; L # Cf  [16] EGYPTIAN HIEROGLYPH VERTICAL JOINER..EGYPTIAN HIEROGLYPH END WALLED ENCLOSURE
+13441..13446  ; L # Lo   [6] EGYPTIAN HIEROGLYPH FULL BLANK..EGYPTIAN HIEROGLYPH WIDE LOST SIGN
 14400..14646  ; L # Lo [583] ANATOLIAN HIEROGLYPH A001..ANATOLIAN HIEROGLYPH A530
 16800..16A38  ; L # Lo [569] BAMUM LETTER PHASE-A NGKUE MFON..BAMUM LETTER PHASE-F VUEQ
 16A40..16A5E  ; L # Lo  [31] MRO LETTER TA..MRO LETTER TEK
@@ -987,7 +1078,9 @@ FFDA..FFDC    ; L # Lo   [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER
 1AFF5..1AFFB  ; L # Lm   [7] KATAKANA LETTER MINNAN TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-5
 1AFFD..1AFFE  ; L # Lm   [2] KATAKANA LETTER MINNAN NASALIZED TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-8
 1B000..1B122  ; L # Lo [291] KATAKANA LETTER ARCHAIC E..KATAKANA LETTER ARCHAIC WU
+1B132         ; L # Lo       HIRAGANA LETTER SMALL KO
 1B150..1B152  ; L # Lo   [3] HIRAGANA LETTER SMALL WI..HIRAGANA LETTER SMALL WO
+1B155         ; L # Lo       KATAKANA LETTER SMALL KO
 1B164..1B167  ; L # Lo   [4] KATAKANA LETTER SMALL WI..KATAKANA LETTER SMALL N
 1B170..1B2FB  ; L # Lo [396] NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB
 1BC00..1BC6A  ; L # Lo [107] DUPLOYAN LETTER H..DUPLOYAN LETTER VOCALIC M
@@ -1006,6 +1099,7 @@ FFDA..FFDC    ; L # Lo   [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER
 1D183..1D184  ; L # So   [2] MUSICAL SYMBOL ARPEGGIATO UP..MUSICAL SYMBOL ARPEGGIATO DOWN
 1D18C..1D1A9  ; L # So  [30] MUSICAL SYMBOL RINFORZANDO..MUSICAL SYMBOL DEGREE SLASH
 1D1AE..1D1E8  ; L # So  [59] MUSICAL SYMBOL PEDAL MARK..MUSICAL SYMBOL KIEVAN FLAT SIGN
+1D2C0..1D2D3  ; L # No  [20] KAKTOVIK NUMERAL ZERO..KAKTOVIK NUMERAL NINETEEN
 1D2E0..1D2F3  ; L # No  [20] MAYAN NUMERAL ZERO..MAYAN NUMERAL NINETEEN
 1D360..1D378  ; L # No  [25] COUNTING ROD UNIT DIGIT ONE..TALLY MARK FIVE
 1D400..1D454  ; L # L&  [85] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL ITALIC SMALL G
@@ -1052,6 +1146,8 @@ FFDA..FFDC    ; L # Lo   [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER
 1DF00..1DF09  ; L # L&  [10] LATIN SMALL LETTER FENG DIGRAPH WITH TRILL..LATIN SMALL LETTER T WITH HOOK AND RETROFLEX HOOK
 1DF0A         ; L # Lo       LATIN LETTER RETROFLEX CLICK WITH RETROFLEX HOOK
 1DF0B..1DF1E  ; L # L&  [20] LATIN SMALL LETTER ESH WITH DOUBLE BAR..LATIN SMALL LETTER S WITH CURL
+1DF25..1DF2A  ; L # L&   [6] LATIN SMALL LETTER D WITH MID-HEIGHT LEFT HOOK..LATIN SMALL LETTER T WITH MID-HEIGHT LEFT HOOK
+1E030..1E06D  ; L # Lm  [62] MODIFIER LETTER CYRILLIC SMALL A..MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE
 1E100..1E12C  ; L # Lo  [45] NYIAKENG PUACHUE HMONG LETTER MA..NYIAKENG PUACHUE HMONG LETTER W
 1E137..1E13D  ; L # Lm   [7] NYIAKENG PUACHUE HMONG SIGN FOR PERSON..NYIAKENG PUACHUE HMONG SYLLABLE LENGTHENER
 1E140..1E149  ; L # Nd  [10] NYIAKENG PUACHUE HMONG DIGIT ZERO..NYIAKENG PUACHUE HMONG DIGIT NINE
@@ -1060,6 +1156,9 @@ FFDA..FFDC    ; L # Lo   [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER
 1E290..1E2AD  ; L # Lo  [30] TOTO LETTER PA..TOTO LETTER A
 1E2C0..1E2EB  ; L # Lo  [44] WANCHO LETTER AA..WANCHO LETTER YIH
 1E2F0..1E2F9  ; L # Nd  [10] WANCHO DIGIT ZERO..WANCHO DIGIT NINE
+1E4D0..1E4EA  ; L # Lo  [27] NAG MUNDARI LETTER O..NAG MUNDARI LETTER ELL
+1E4EB         ; L # Lm       NAG MUNDARI SIGN OJOD
+1E4F0..1E4F9  ; L # Nd  [10] NAG MUNDARI DIGIT ZERO..NAG MUNDARI DIGIT NINE
 1E7E0..1E7E6  ; L # Lo   [7] ETHIOPIC SYLLABLE HHYA..ETHIOPIC SYLLABLE HHYO
 1E7E8..1E7EB  ; L # Lo   [4] ETHIOPIC SYLLABLE GURAGE HHWA..ETHIOPIC SYLLABLE HHWE
 1E7ED..1E7EE  ; L # Lo   [2] ETHIOPIC SYLLABLE GURAGE MWI..ETHIOPIC SYLLABLE GURAGE MWEE
@@ -1072,188 +1171,124 @@ FFDA..FFDC    ; L # Lo   [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER
 1F240..1F248  ; L # So   [9] TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-672C..TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557
 1F250..1F251  ; L # So   [2] CIRCLED IDEOGRAPH ADVANTAGE..CIRCLED IDEOGRAPH ACCEPT
 20000..2A6DF  ; L # Lo [42720] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6DF
-2A700..2B738  ; L # Lo [4153] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B738
+2A700..2B739  ; L # Lo [4154] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B739
 2B740..2B81D  ; L # Lo [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D
 2B820..2CEA1  ; L # Lo [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1
 2CEB0..2EBE0  ; L # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0
 2F800..2FA1D  ; L # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D
 30000..3134A  ; L # Lo [4939] CJK UNIFIED IDEOGRAPH-30000..CJK UNIFIED IDEOGRAPH-3134A
+31350..323AF  ; L # Lo [4192] CJK UNIFIED IDEOGRAPH-31350..CJK UNIFIED IDEOGRAPH-323AF
 F0000..FFFFD  ; L # Co [65534] <private-use-F0000>..<private-use-FFFFD>
 100000..10FFFD; L # Co [65534] <private-use-100000>..<private-use-10FFFD>
 
-# The above property value applies to 825575 code points not listed here.
-# Total code points: 1096333
+# The above property value applies to 821089 code points not listed here.
+# Total code points: 1096272
 
 # ================================================
 
 # Bidi_Class=Right_To_Left
 
-0590          ; R # Cn       <reserved-0590>
 05BE          ; R # Pd       HEBREW PUNCTUATION MAQAF
 05C0          ; R # Po       HEBREW PUNCTUATION PASEQ
 05C3          ; R # Po       HEBREW PUNCTUATION SOF PASUQ
 05C6          ; R # Po       HEBREW PUNCTUATION NUN HAFUKHA
-05C8..05CF    ; R # Cn   [8] <reserved-05C8>..<reserved-05CF>
 05D0..05EA    ; R # Lo  [27] HEBREW LETTER ALEF..HEBREW LETTER TAV
-05EB..05EE    ; R # Cn   [4] <reserved-05EB>..<reserved-05EE>
 05EF..05F2    ; R # Lo   [4] HEBREW YOD TRIANGLE..HEBREW LIGATURE YIDDISH DOUBLE YOD
 05F3..05F4    ; R # Po   [2] HEBREW PUNCTUATION GERESH..HEBREW PUNCTUATION GERSHAYIM
-05F5..05FF    ; R # Cn  [11] <reserved-05F5>..<reserved-05FF>
 07C0..07C9    ; R # Nd  [10] NKO DIGIT ZERO..NKO DIGIT NINE
 07CA..07EA    ; R # Lo  [33] NKO LETTER A..NKO LETTER JONA RA
 07F4..07F5    ; R # Lm   [2] NKO HIGH TONE APOSTROPHE..NKO LOW TONE APOSTROPHE
 07FA          ; R # Lm       NKO LAJANYALAN
-07FB..07FC    ; R # Cn   [2] <reserved-07FB>..<reserved-07FC>
 07FE..07FF    ; R # Sc   [2] NKO DOROME SIGN..NKO TAMAN SIGN
 0800..0815    ; R # Lo  [22] SAMARITAN LETTER ALAF..SAMARITAN LETTER TAAF
 081A          ; R # Lm       SAMARITAN MODIFIER LETTER EPENTHETIC YUT
 0824          ; R # Lm       SAMARITAN MODIFIER LETTER SHORT A
 0828          ; R # Lm       SAMARITAN MODIFIER LETTER I
-082E..082F    ; R # Cn   [2] <reserved-082E>..<reserved-082F>
 0830..083E    ; R # Po  [15] SAMARITAN PUNCTUATION NEQUDAA..SAMARITAN PUNCTUATION ANNAAU
-083F          ; R # Cn       <reserved-083F>
 0840..0858    ; R # Lo  [25] MANDAIC LETTER HALQA..MANDAIC LETTER AIN
-085C..085D    ; R # Cn   [2] <reserved-085C>..<reserved-085D>
 085E          ; R # Po       MANDAIC PUNCTUATION
-085F          ; R # Cn       <reserved-085F>
 200F          ; R # Cf       RIGHT-TO-LEFT MARK
 FB1D          ; R # Lo       HEBREW LETTER YOD WITH HIRIQ
 FB1F..FB28    ; R # Lo  [10] HEBREW LIGATURE YIDDISH YOD YOD PATAH..HEBREW LETTER WIDE TAV
 FB2A..FB36    ; R # Lo  [13] HEBREW LETTER SHIN WITH SHIN DOT..HEBREW LETTER ZAYIN WITH DAGESH
-FB37          ; R # Cn       <reserved-FB37>
 FB38..FB3C    ; R # Lo   [5] HEBREW LETTER TET WITH DAGESH..HEBREW LETTER LAMED WITH DAGESH
-FB3D          ; R # Cn       <reserved-FB3D>
 FB3E          ; R # Lo       HEBREW LETTER MEM WITH DAGESH
-FB3F          ; R # Cn       <reserved-FB3F>
 FB40..FB41    ; R # Lo   [2] HEBREW LETTER NUN WITH DAGESH..HEBREW LETTER SAMEKH WITH DAGESH
-FB42          ; R # Cn       <reserved-FB42>
 FB43..FB44    ; R # Lo   [2] HEBREW LETTER FINAL PE WITH DAGESH..HEBREW LETTER PE WITH DAGESH
-FB45          ; R # Cn       <reserved-FB45>
 FB46..FB4F    ; R # Lo  [10] HEBREW LETTER TSADI WITH DAGESH..HEBREW LIGATURE ALEF LAMED
 10800..10805  ; R # Lo   [6] CYPRIOT SYLLABLE A..CYPRIOT SYLLABLE JA
-10806..10807  ; R # Cn   [2] <reserved-10806>..<reserved-10807>
 10808         ; R # Lo       CYPRIOT SYLLABLE JO
-10809         ; R # Cn       <reserved-10809>
 1080A..10835  ; R # Lo  [44] CYPRIOT SYLLABLE KA..CYPRIOT SYLLABLE WO
-10836         ; R # Cn       <reserved-10836>
 10837..10838  ; R # Lo   [2] CYPRIOT SYLLABLE XA..CYPRIOT SYLLABLE XE
-10839..1083B  ; R # Cn   [3] <reserved-10839>..<reserved-1083B>
 1083C         ; R # Lo       CYPRIOT SYLLABLE ZA
-1083D..1083E  ; R # Cn   [2] <reserved-1083D>..<reserved-1083E>
 1083F..10855  ; R # Lo  [23] CYPRIOT SYLLABLE ZO..IMPERIAL ARAMAIC LETTER TAW
-10856         ; R # Cn       <reserved-10856>
 10857         ; R # Po       IMPERIAL ARAMAIC SECTION SIGN
 10858..1085F  ; R # No   [8] IMPERIAL ARAMAIC NUMBER ONE..IMPERIAL ARAMAIC NUMBER TEN THOUSAND
 10860..10876  ; R # Lo  [23] PALMYRENE LETTER ALEPH..PALMYRENE LETTER TAW
 10877..10878  ; R # So   [2] PALMYRENE LEFT-POINTING FLEURON..PALMYRENE RIGHT-POINTING FLEURON
 10879..1087F  ; R # No   [7] PALMYRENE NUMBER ONE..PALMYRENE NUMBER TWENTY
 10880..1089E  ; R # Lo  [31] NABATAEAN LETTER FINAL ALEPH..NABATAEAN LETTER TAW
-1089F..108A6  ; R # Cn   [8] <reserved-1089F>..<reserved-108A6>
 108A7..108AF  ; R # No   [9] NABATAEAN NUMBER ONE..NABATAEAN NUMBER ONE HUNDRED
-108B0..108DF  ; R # Cn  [48] <reserved-108B0>..<reserved-108DF>
 108E0..108F2  ; R # Lo  [19] HATRAN LETTER ALEPH..HATRAN LETTER QOPH
-108F3         ; R # Cn       <reserved-108F3>
 108F4..108F5  ; R # Lo   [2] HATRAN LETTER SHIN..HATRAN LETTER TAW
-108F6..108FA  ; R # Cn   [5] <reserved-108F6>..<reserved-108FA>
 108FB..108FF  ; R # No   [5] HATRAN NUMBER ONE..HATRAN NUMBER ONE HUNDRED
 10900..10915  ; R # Lo  [22] PHOENICIAN LETTER ALF..PHOENICIAN LETTER TAU
 10916..1091B  ; R # No   [6] PHOENICIAN NUMBER ONE..PHOENICIAN NUMBER THREE
-1091C..1091E  ; R # Cn   [3] <reserved-1091C>..<reserved-1091E>
 10920..10939  ; R # Lo  [26] LYDIAN LETTER A..LYDIAN LETTER C
-1093A..1093E  ; R # Cn   [5] <reserved-1093A>..<reserved-1093E>
 1093F         ; R # Po       LYDIAN TRIANGULAR MARK
-10940..1097F  ; R # Cn  [64] <reserved-10940>..<reserved-1097F>
 10980..109B7  ; R # Lo  [56] MEROITIC HIEROGLYPHIC LETTER A..MEROITIC CURSIVE LETTER DA
-109B8..109BB  ; R # Cn   [4] <reserved-109B8>..<reserved-109BB>
 109BC..109BD  ; R # No   [2] MEROITIC CURSIVE FRACTION ELEVEN TWELFTHS..MEROITIC CURSIVE FRACTION ONE HALF
 109BE..109BF  ; R # Lo   [2] MEROITIC CURSIVE LOGOGRAM RMT..MEROITIC CURSIVE LOGOGRAM IMN
 109C0..109CF  ; R # No  [16] MEROITIC CURSIVE NUMBER ONE..MEROITIC CURSIVE NUMBER SEVENTY
-109D0..109D1  ; R # Cn   [2] <reserved-109D0>..<reserved-109D1>
 109D2..109FF  ; R # No  [46] MEROITIC CURSIVE NUMBER ONE HUNDRED..MEROITIC CURSIVE FRACTION TEN TWELFTHS
 10A00         ; R # Lo       KHAROSHTHI LETTER A
-10A04         ; R # Cn       <reserved-10A04>
-10A07..10A0B  ; R # Cn   [5] <reserved-10A07>..<reserved-10A0B>
 10A10..10A13  ; R # Lo   [4] KHAROSHTHI LETTER KA..KHAROSHTHI LETTER GHA
-10A14         ; R # Cn       <reserved-10A14>
 10A15..10A17  ; R # Lo   [3] KHAROSHTHI LETTER CA..KHAROSHTHI LETTER JA
-10A18         ; R # Cn       <reserved-10A18>
 10A19..10A35  ; R # Lo  [29] KHAROSHTHI LETTER NYA..KHAROSHTHI LETTER VHA
-10A36..10A37  ; R # Cn   [2] <reserved-10A36>..<reserved-10A37>
-10A3B..10A3E  ; R # Cn   [4] <reserved-10A3B>..<reserved-10A3E>
 10A40..10A48  ; R # No   [9] KHAROSHTHI DIGIT ONE..KHAROSHTHI FRACTION ONE HALF
-10A49..10A4F  ; R # Cn   [7] <reserved-10A49>..<reserved-10A4F>
 10A50..10A58  ; R # Po   [9] KHAROSHTHI PUNCTUATION DOT..KHAROSHTHI PUNCTUATION LINES
-10A59..10A5F  ; R # Cn   [7] <reserved-10A59>..<reserved-10A5F>
 10A60..10A7C  ; R # Lo  [29] OLD SOUTH ARABIAN LETTER HE..OLD SOUTH ARABIAN LETTER THETH
 10A7D..10A7E  ; R # No   [2] OLD SOUTH ARABIAN NUMBER ONE..OLD SOUTH ARABIAN NUMBER FIFTY
 10A7F         ; R # Po       OLD SOUTH ARABIAN NUMERIC INDICATOR
 10A80..10A9C  ; R # Lo  [29] OLD NORTH ARABIAN LETTER HEH..OLD NORTH ARABIAN LETTER ZAH
 10A9D..10A9F  ; R # No   [3] OLD NORTH ARABIAN NUMBER ONE..OLD NORTH ARABIAN NUMBER TWENTY
-10AA0..10ABF  ; R # Cn  [32] <reserved-10AA0>..<reserved-10ABF>
 10AC0..10AC7  ; R # Lo   [8] MANICHAEAN LETTER ALEPH..MANICHAEAN LETTER WAW
 10AC8         ; R # So       MANICHAEAN SIGN UD
 10AC9..10AE4  ; R # Lo  [28] MANICHAEAN LETTER ZAYIN..MANICHAEAN LETTER TAW
-10AE7..10AEA  ; R # Cn   [4] <reserved-10AE7>..<reserved-10AEA>
 10AEB..10AEF  ; R # No   [5] MANICHAEAN NUMBER ONE..MANICHAEAN NUMBER ONE HUNDRED
 10AF0..10AF6  ; R # Po   [7] MANICHAEAN PUNCTUATION STAR..MANICHAEAN PUNCTUATION LINE FILLER
-10AF7..10AFF  ; R # Cn   [9] <reserved-10AF7>..<reserved-10AFF>
 10B00..10B35  ; R # Lo  [54] AVESTAN LETTER A..AVESTAN LETTER HE
-10B36..10B38  ; R # Cn   [3] <reserved-10B36>..<reserved-10B38>
 10B40..10B55  ; R # Lo  [22] INSCRIPTIONAL PARTHIAN LETTER ALEPH..INSCRIPTIONAL PARTHIAN LETTER TAW
-10B56..10B57  ; R # Cn   [2] <reserved-10B56>..<reserved-10B57>
 10B58..10B5F  ; R # No   [8] INSCRIPTIONAL PARTHIAN NUMBER ONE..INSCRIPTIONAL PARTHIAN NUMBER ONE THOUSAND
 10B60..10B72  ; R # Lo  [19] INSCRIPTIONAL PAHLAVI LETTER ALEPH..INSCRIPTIONAL PAHLAVI LETTER TAW
-10B73..10B77  ; R # Cn   [5] <reserved-10B73>..<reserved-10B77>
 10B78..10B7F  ; R # No   [8] INSCRIPTIONAL PAHLAVI NUMBER ONE..INSCRIPTIONAL PAHLAVI NUMBER ONE THOUSAND
 10B80..10B91  ; R # Lo  [18] PSALTER PAHLAVI LETTER ALEPH..PSALTER PAHLAVI LETTER TAW
-10B92..10B98  ; R # Cn   [7] <reserved-10B92>..<reserved-10B98>
 10B99..10B9C  ; R # Po   [4] PSALTER PAHLAVI SECTION MARK..PSALTER PAHLAVI FOUR DOTS WITH DOT
-10B9D..10BA8  ; R # Cn  [12] <reserved-10B9D>..<reserved-10BA8>
 10BA9..10BAF  ; R # No   [7] PSALTER PAHLAVI NUMBER ONE..PSALTER PAHLAVI NUMBER ONE HUNDRED
-10BB0..10BFF  ; R # Cn  [80] <reserved-10BB0>..<reserved-10BFF>
 10C00..10C48  ; R # Lo  [73] OLD TURKIC LETTER ORKHON A..OLD TURKIC LETTER ORKHON BASH
-10C49..10C7F  ; R # Cn  [55] <reserved-10C49>..<reserved-10C7F>
 10C80..10CB2  ; R # L&  [51] OLD HUNGARIAN CAPITAL LETTER A..OLD HUNGARIAN CAPITAL LETTER US
-10CB3..10CBF  ; R # Cn  [13] <reserved-10CB3>..<reserved-10CBF>
 10CC0..10CF2  ; R # L&  [51] OLD HUNGARIAN SMALL LETTER A..OLD HUNGARIAN SMALL LETTER US
-10CF3..10CF9  ; R # Cn   [7] <reserved-10CF3>..<reserved-10CF9>
 10CFA..10CFF  ; R # No   [6] OLD HUNGARIAN NUMBER ONE..OLD HUNGARIAN NUMBER ONE THOUSAND
-10D40..10E5F  ; R # Cn [288] <reserved-10D40>..<reserved-10E5F>
-10E7F         ; R # Cn       <reserved-10E7F>
 10E80..10EA9  ; R # Lo  [42] YEZIDI LETTER ELIF..YEZIDI LETTER ET
-10EAA         ; R # Cn       <reserved-10EAA>
 10EAD         ; R # Pd       YEZIDI HYPHENATION MARK
-10EAE..10EAF  ; R # Cn   [2] <reserved-10EAE>..<reserved-10EAF>
 10EB0..10EB1  ; R # Lo   [2] YEZIDI LETTER LAM WITH DOT ABOVE..YEZIDI LETTER YOT WITH CIRCUMFLEX ABOVE
-10EB2..10EFF  ; R # Cn  [78] <reserved-10EB2>..<reserved-10EFF>
 10F00..10F1C  ; R # Lo  [29] OLD SOGDIAN LETTER ALEPH..OLD SOGDIAN LETTER FINAL TAW WITH VERTICAL TAIL
 10F1D..10F26  ; R # No  [10] OLD SOGDIAN NUMBER ONE..OLD SOGDIAN FRACTION ONE HALF
 10F27         ; R # Lo       OLD SOGDIAN LIGATURE AYIN-DALETH
-10F28..10F2F  ; R # Cn   [8] <reserved-10F28>..<reserved-10F2F>
 10F70..10F81  ; R # Lo  [18] OLD UYGHUR LETTER ALEPH..OLD UYGHUR LETTER LESH
 10F86..10F89  ; R # Po   [4] OLD UYGHUR PUNCTUATION BAR..OLD UYGHUR PUNCTUATION FOUR DOTS
-10F8A..10FAF  ; R # Cn  [38] <reserved-10F8A>..<reserved-10FAF>
 10FB0..10FC4  ; R # Lo  [21] CHORASMIAN LETTER ALEPH..CHORASMIAN LETTER TAW
 10FC5..10FCB  ; R # No   [7] CHORASMIAN NUMBER ONE..CHORASMIAN NUMBER ONE HUNDRED
-10FCC..10FDF  ; R # Cn  [20] <reserved-10FCC>..<reserved-10FDF>
 10FE0..10FF6  ; R # Lo  [23] ELYMAIC LETTER ALEPH..ELYMAIC LIGATURE ZAYIN-YODH
-10FF7..10FFF  ; R # Cn   [9] <reserved-10FF7>..<reserved-10FFF>
 1E800..1E8C4  ; R # Lo [197] MENDE KIKAKUI SYLLABLE M001 KI..MENDE KIKAKUI SYLLABLE M060 NYON
-1E8C5..1E8C6  ; R # Cn   [2] <reserved-1E8C5>..<reserved-1E8C6>
 1E8C7..1E8CF  ; R # No   [9] MENDE KIKAKUI DIGIT ONE..MENDE KIKAKUI DIGIT NINE
-1E8D7..1E8FF  ; R # Cn  [41] <reserved-1E8D7>..<reserved-1E8FF>
 1E900..1E943  ; R # L&  [68] ADLAM CAPITAL LETTER ALIF..ADLAM SMALL LETTER SHA
 1E94B         ; R # Lm       ADLAM NASALIZATION MARK
-1E94C..1E94F  ; R # Cn   [4] <reserved-1E94C>..<reserved-1E94F>
 1E950..1E959  ; R # Nd  [10] ADLAM DIGIT ZERO..ADLAM DIGIT NINE
-1E95A..1E95D  ; R # Cn   [4] <reserved-1E95A>..<reserved-1E95D>
 1E95E..1E95F  ; R # Po   [2] ADLAM INITIAL EXCLAMATION MARK..ADLAM INITIAL QUESTION MARK
-1E960..1EC6F  ; R # Cn [784] <reserved-1E960>..<reserved-1EC6F>
-1ECC0..1ECFF  ; R # Cn  [64] <reserved-1ECC0>..<reserved-1ECFF>
-1ED50..1EDFF  ; R # Cn [176] <reserved-1ED50>..<reserved-1EDFF>
-1EF00..1EFFF  ; R # Cn [256] <reserved-1EF00>..<reserved-1EFFF>
 
-# Total code points: 3711
+# The above property value applies to 2156 code points not listed here.
+# Total code points: 3647
 
 # ================================================
 
@@ -1313,7 +1348,6 @@ FF0D          ; ES # Pd       FULLWIDTH HYPHEN-MINUS
 17DB          ; ET # Sc       KHMER CURRENCY SYMBOL RIEL
 2030..2034    ; ET # Po   [5] PER MILLE SIGN..TRIPLE PRIME
 20A0..20C0    ; ET # Sc  [33] EURO-CURRENCY SIGN..SOM SIGN
-20C1..20CF    ; ET # Cn  [15] <reserved-20C1>..<reserved-20CF>
 212E          ; ET # So       ESTIMATED SYMBOL
 2213          ; ET # Sm       MINUS-OR-PLUS SIGN
 A838          ; ET # Sc       NORTH INDIC RUPEE MARK
@@ -1329,6 +1363,7 @@ FFE5..FFE6    ; ET # Sc   [2] FULLWIDTH YEN SIGN..FULLWIDTH WON SIGN
 11FDD..11FE0  ; ET # Sc   [4] TAMIL SIGN KAACU..TAMIL SIGN VARAAKAN
 1E2FF         ; ET # Sc       WANCHO NGUN SIGN
 
+# The above property value applies to 15 code points not listed here.
 # Total code points: 92
 
 # ================================================
@@ -1887,10 +1922,10 @@ FFFC..FFFD    ; ON # So   [2] OBJECT REPLACEMENT CHARACTER..REPLACEMENT CHARACTE
 1F300..1F3FA  ; ON # So [251] CYCLONE..AMPHORA
 1F3FB..1F3FF  ; ON # Sk   [5] EMOJI MODIFIER FITZPATRICK TYPE-1-2..EMOJI MODIFIER FITZPATRICK TYPE-6
 1F400..1F6D7  ; ON # So [728] RAT..ELEVATOR
-1F6DD..1F6EC  ; ON # So  [16] PLAYGROUND SLIDE..AIRPLANE ARRIVING
+1F6DC..1F6EC  ; ON # So  [17] WIRELESS..AIRPLANE ARRIVING
 1F6F0..1F6FC  ; ON # So  [13] SATELLITE..ROLLER SKATE
-1F700..1F773  ; ON # So [116] ALCHEMICAL SYMBOL FOR QUINTESSENCE..ALCHEMICAL SYMBOL FOR HALF OUNCE
-1F780..1F7D8  ; ON # So  [89] BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE..NEGATIVE CIRCLED SQUARE
+1F700..1F776  ; ON # So [119] ALCHEMICAL SYMBOL FOR QUINTESSENCE..LUNAR ECLIPSE
+1F77B..1F7D9  ; ON # So  [95] HAUMEA..NINE POINTED WHITE STAR
 1F7E0..1F7EB  ; ON # So  [12] LARGE ORANGE CIRCLE..LARGE BROWN SQUARE
 1F7F0         ; ON # So       HEAVY EQUALS SIGN
 1F800..1F80B  ; ON # So  [12] LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD..DOWNWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD
@@ -1901,19 +1936,17 @@ FFFC..FFFD    ; ON # So   [2] OBJECT REPLACEMENT CHARACTER..REPLACEMENT CHARACTE
 1F8B0..1F8B1  ; ON # So   [2] ARROW POINTING UPWARDS THEN NORTH WEST..ARROW POINTING RIGHTWARDS THEN CURVING SOUTH WEST
 1F900..1FA53  ; ON # So [340] CIRCLED CROSS FORMEE WITH FOUR DOTS..BLACK CHESS KNIGHT-BISHOP
 1FA60..1FA6D  ; ON # So  [14] XIANGQI RED GENERAL..XIANGQI BLACK SOLDIER
-1FA70..1FA74  ; ON # So   [5] BALLET SHOES..THONG SANDAL
-1FA78..1FA7C  ; ON # So   [5] DROP OF BLOOD..CRUTCH
-1FA80..1FA86  ; ON # So   [7] YO-YO..NESTING DOLLS
-1FA90..1FAAC  ; ON # So  [29] RINGED PLANET..HAMSA
-1FAB0..1FABA  ; ON # So  [11] FLY..NEST WITH EGGS
-1FAC0..1FAC5  ; ON # So   [6] ANATOMICAL HEART..PERSON WITH CROWN
-1FAD0..1FAD9  ; ON # So  [10] BLUEBERRIES..JAR
-1FAE0..1FAE7  ; ON # So   [8] MELTING FACE..BUBBLES
-1FAF0..1FAF6  ; ON # So   [7] HAND WITH INDEX FINGER AND THUMB CROSSED..HEART HANDS
+1FA70..1FA7C  ; ON # So  [13] BALLET SHOES..CRUTCH
+1FA80..1FA88  ; ON # So   [9] YO-YO..FLUTE
+1FA90..1FABD  ; ON # So  [46] RINGED PLANET..WING
+1FABF..1FAC5  ; ON # So   [7] GOOSE..PERSON WITH CROWN
+1FACE..1FADB  ; ON # So  [14] MOOSE..PEA POD
+1FAE0..1FAE8  ; ON # So   [9] MELTING FACE..SHAKING FACE
+1FAF0..1FAF8  ; ON # So   [9] HAND WITH INDEX FINGER AND THUMB CROSSED..RIGHTWARDS PUSHING HAND
 1FB00..1FB92  ; ON # So [147] BLOCK SEXTANT-1..UPPER HALF INVERSE MEDIUM SHADE AND LOWER HALF BLOCK
 1FB94..1FBCA  ; ON # So  [55] LEFT HALF INVERSE MEDIUM SHADE AND RIGHT HALF BLOCK..WHITE UP-POINTING CHEVRON
 
-# Total code points: 6000
+# Total code points: 6029
 
 # ================================================
 
@@ -2054,7 +2087,7 @@ FFFFE..FFFFF  ; BN # Cn   [2] <noncharacter-FFFFE>..<noncharacter-FFFFF>
 0E47..0E4E    ; NSM # Mn   [8] THAI CHARACTER MAITAIKHU..THAI CHARACTER YAMAKKAN
 0EB1          ; NSM # Mn       LAO VOWEL SIGN MAI KAN
 0EB4..0EBC    ; NSM # Mn   [9] LAO VOWEL SIGN I..LAO SEMIVOWEL SIGN LO
-0EC8..0ECD    ; NSM # Mn   [6] LAO TONE MAI EK..LAO NIGGAHITA
+0EC8..0ECE    ; NSM # Mn   [7] LAO TONE MAI EK..LAO YAMAKKAN
 0F18..0F19    ; NSM # Mn   [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS
 0F35          ; NSM # Mn       TIBETAN MARK NGAS BZUNG NYI ZLA
 0F37          ; NSM # Mn       TIBETAN MARK NGAS BZUNG SGOR RTAGS
@@ -2189,6 +2222,7 @@ FE20..FE2F    ; NSM # Mn  [16] COMBINING LIGATURE LEFT HALF..COMBINING CYRILLIC
 10AE5..10AE6  ; NSM # Mn   [2] MANICHAEAN ABBREVIATION MARK ABOVE..MANICHAEAN ABBREVIATION MARK BELOW
 10D24..10D27  ; NSM # Mn   [4] HANIFI ROHINGYA SIGN HARBAHAY..HANIFI ROHINGYA SIGN TASSI
 10EAB..10EAC  ; NSM # Mn   [2] YEZIDI COMBINING HAMZA MARK..YEZIDI COMBINING MADDA MARK
+10EFD..10EFF  ; NSM # Mn   [3] ARABIC SMALL LOW WORD SAKTA..ARABIC SMALL LOW WORD MADDA
 10F46..10F50  ; NSM # Mn  [11] SOGDIAN COMBINING DOT BELOW..SOGDIAN COMBINING STROKE BELOW
 10F82..10F85  ; NSM # Mn   [4] OLD UYGHUR COMBINING DOT ABOVE..OLD UYGHUR COMBINING TWO DOTS BELOW
 11001         ; NSM # Mn       BRAHMI SIGN ANUSVARA
@@ -2211,6 +2245,7 @@ FE20..FE2F    ; NSM # Mn  [16] COMBINING LIGATURE LEFT HALF..COMBINING CYRILLIC
 11234         ; NSM # Mn       KHOJKI SIGN ANUSVARA
 11236..11237  ; NSM # Mn   [2] KHOJKI SIGN NUKTA..KHOJKI SIGN SHADDA
 1123E         ; NSM # Mn       KHOJKI SIGN SUKUN
+11241         ; NSM # Mn       KHOJKI VOWEL SIGN VOCALIC R
 112DF         ; NSM # Mn       KHUDAWADI SIGN ANUSVARA
 112E3..112EA  ; NSM # Mn   [8] KHUDAWADI VOWEL SIGN U..KHUDAWADI SIGN VIRAMA
 11300..11301  ; NSM # Mn   [2] GRANTHA SIGN COMBINING ANUSVARA ABOVE..GRANTHA SIGN CANDRABINDU
@@ -2272,6 +2307,12 @@ FE20..FE2F    ; NSM # Mn  [16] COMBINING LIGATURE LEFT HALF..COMBINING CYRILLIC
 11D95         ; NSM # Mn       GUNJALA GONDI SIGN ANUSVARA
 11D97         ; NSM # Mn       GUNJALA GONDI VIRAMA
 11EF3..11EF4  ; NSM # Mn   [2] MAKASAR VOWEL SIGN I..MAKASAR VOWEL SIGN U
+11F00..11F01  ; NSM # Mn   [2] KAWI SIGN CANDRABINDU..KAWI SIGN ANUSVARA
+11F36..11F3A  ; NSM # Mn   [5] KAWI VOWEL SIGN I..KAWI VOWEL SIGN VOCALIC R
+11F40         ; NSM # Mn       KAWI VOWEL SIGN EU
+11F42         ; NSM # Mn       KAWI CONJOINER
+13440         ; NSM # Mn       EGYPTIAN HIEROGLYPH MIRROR HORIZONTALLY
+13447..13455  ; NSM # Mn  [15] EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP START..EGYPTIAN HIEROGLYPH MODIFIER DAMAGED
 16AF0..16AF4  ; NSM # Mn   [5] BASSA VAH COMBINING HIGH TONE..BASSA VAH COMBINING HIGH-LOW TONE
 16B30..16B36  ; NSM # Mn   [7] PAHAWH HMONG MARK CIM TUB..PAHAWH HMONG MARK CIM TAUM
 16F4F         ; NSM # Mn       MIAO SIGN CONSONANT MODIFIER BAR
@@ -2296,14 +2337,16 @@ FE20..FE2F    ; NSM # Mn  [16] COMBINING LIGATURE LEFT HALF..COMBINING CYRILLIC
 1E01B..1E021  ; NSM # Mn   [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI
 1E023..1E024  ; NSM # Mn   [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS
 1E026..1E02A  ; NSM # Mn   [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA
+1E08F         ; NSM # Mn       COMBINING CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
 1E130..1E136  ; NSM # Mn   [7] NYIAKENG PUACHUE HMONG TONE-B..NYIAKENG PUACHUE HMONG TONE-D
 1E2AE         ; NSM # Mn       TOTO SIGN RISING TONE
 1E2EC..1E2EF  ; NSM # Mn   [4] WANCHO TONE TUP..WANCHO TONE KOINI
+1E4EC..1E4EF  ; NSM # Mn   [4] NAG MUNDARI SIGN MUHOR..NAG MUNDARI SIGN SUTUH
 1E8D0..1E8D6  ; NSM # Mn   [7] MENDE KIKAKUI COMBINING NUMBER TEENS..MENDE KIKAKUI COMBINING NUMBER MILLIONS
 1E944..1E94A  ; NSM # Mn   [7] ADLAM ALIF LENGTHENER..ADLAM NUKTA
 E0100..E01EF  ; NSM # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256
 
-# Total code points: 1958
+# Total code points: 1993
 
 # ================================================
 
@@ -2329,125 +2372,74 @@ E0100..E01EF  ; NSM # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256
 06FD..06FE    ; AL # So   [2] ARABIC SIGN SINDHI AMPERSAND..ARABIC SIGN SINDHI POSTPOSITION MEN
 06FF          ; AL # Lo       ARABIC LETTER HEH WITH INVERTED V
 0700..070D    ; AL # Po  [14] SYRIAC END OF PARAGRAPH..SYRIAC HARKLEAN ASTERISCUS
-070E          ; AL # Cn       <reserved-070E>
 070F          ; AL # Cf       SYRIAC ABBREVIATION MARK
 0710          ; AL # Lo       SYRIAC LETTER ALAPH
 0712..072F    ; AL # Lo  [30] SYRIAC LETTER BETH..SYRIAC LETTER PERSIAN DHALATH
-074B..074C    ; AL # Cn   [2] <reserved-074B>..<reserved-074C>
 074D..07A5    ; AL # Lo  [89] SYRIAC LETTER SOGDIAN ZHAIN..THAANA LETTER WAAVU
 07B1          ; AL # Lo       THAANA LETTER NAA
-07B2..07BF    ; AL # Cn  [14] <reserved-07B2>..<reserved-07BF>
 0860..086A    ; AL # Lo  [11] SYRIAC LETTER MALAYALAM NGA..SYRIAC LETTER MALAYALAM SSA
-086B..086F    ; AL # Cn   [5] <reserved-086B>..<reserved-086F>
 0870..0887    ; AL # Lo  [24] ARABIC LETTER ALEF WITH ATTACHED FATHA..ARABIC BASELINE ROUND DOT
 0888          ; AL # Sk       ARABIC RAISED ROUND DOT
 0889..088E    ; AL # Lo   [6] ARABIC LETTER NOON WITH INVERTED SMALL V..ARABIC VERTICAL TAIL
-088F          ; AL # Cn       <reserved-088F>
-0892..0897    ; AL # Cn   [6] <reserved-0892>..<reserved-0897>
 08A0..08C8    ; AL # Lo  [41] ARABIC LETTER BEH WITH SMALL V BELOW..ARABIC LETTER GRAF
 08C9          ; AL # Lm       ARABIC SMALL FARSI YEH
 FB50..FBB1    ; AL # Lo  [98] ARABIC LETTER ALEF WASLA ISOLATED FORM..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM
 FBB2..FBC2    ; AL # Sk  [17] ARABIC SYMBOL DOT ABOVE..ARABIC SYMBOL WASLA ABOVE
-FBC3..FBD2    ; AL # Cn  [16] <reserved-FBC3>..<reserved-FBD2>
 FBD3..FD3D    ; AL # Lo [363] ARABIC LETTER NG ISOLATED FORM..ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM
 FD50..FD8F    ; AL # Lo  [64] ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM..ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM
-FD90..FD91    ; AL # Cn   [2] <reserved-FD90>..<reserved-FD91>
 FD92..FDC7    ; AL # Lo  [54] ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM..ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM
-FDC8..FDCE    ; AL # Cn   [7] <reserved-FDC8>..<reserved-FDCE>
 FDF0..FDFB    ; AL # Lo  [12] ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM..ARABIC LIGATURE JALLAJALALOUHOU
 FDFC          ; AL # Sc       RIAL SIGN
 FE70..FE74    ; AL # Lo   [5] ARABIC FATHATAN ISOLATED FORM..ARABIC KASRATAN ISOLATED FORM
-FE75          ; AL # Cn       <reserved-FE75>
 FE76..FEFC    ; AL # Lo [135] ARABIC FATHA ISOLATED FORM..ARABIC LIGATURE LAM WITH ALEF FINAL FORM
-FEFD..FEFE    ; AL # Cn   [2] <reserved-FEFD>..<reserved-FEFE>
 10D00..10D23  ; AL # Lo  [36] HANIFI ROHINGYA LETTER A..HANIFI ROHINGYA MARK NA KHONNA
-10D28..10D2F  ; AL # Cn   [8] <reserved-10D28>..<reserved-10D2F>
-10D3A..10D3F  ; AL # Cn   [6] <reserved-10D3A>..<reserved-10D3F>
 10F30..10F45  ; AL # Lo  [22] SOGDIAN LETTER ALEPH..SOGDIAN INDEPENDENT SHIN
 10F51..10F54  ; AL # No   [4] SOGDIAN NUMBER ONE..SOGDIAN NUMBER ONE HUNDRED
 10F55..10F59  ; AL # Po   [5] SOGDIAN PUNCTUATION TWO VERTICAL BARS..SOGDIAN PUNCTUATION HALF CIRCLE WITH DOT
-10F5A..10F6F  ; AL # Cn  [22] <reserved-10F5A>..<reserved-10F6F>
-1EC70         ; AL # Cn       <reserved-1EC70>
 1EC71..1ECAB  ; AL # No  [59] INDIC SIYAQ NUMBER ONE..INDIC SIYAQ NUMBER PREFIXED NINE
 1ECAC         ; AL # So       INDIC SIYAQ PLACEHOLDER
 1ECAD..1ECAF  ; AL # No   [3] INDIC SIYAQ FRACTION ONE QUARTER..INDIC SIYAQ FRACTION THREE QUARTERS
 1ECB0         ; AL # Sc       INDIC SIYAQ RUPEE MARK
 1ECB1..1ECB4  ; AL # No   [4] INDIC SIYAQ NUMBER ALTERNATE ONE..INDIC SIYAQ ALTERNATE LAKH MARK
-1ECB5..1ECBF  ; AL # Cn  [11] <reserved-1ECB5>..<reserved-1ECBF>
-1ED00         ; AL # Cn       <reserved-1ED00>
 1ED01..1ED2D  ; AL # No  [45] OTTOMAN SIYAQ NUMBER ONE..OTTOMAN SIYAQ NUMBER NINETY THOUSAND
 1ED2E         ; AL # So       OTTOMAN SIYAQ MARRATAN
 1ED2F..1ED3D  ; AL # No  [15] OTTOMAN SIYAQ ALTERNATE NUMBER TWO..OTTOMAN SIYAQ FRACTION ONE SIXTH
-1ED3E..1ED4F  ; AL # Cn  [18] <reserved-1ED3E>..<reserved-1ED4F>
 1EE00..1EE03  ; AL # Lo   [4] ARABIC MATHEMATICAL ALEF..ARABIC MATHEMATICAL DAL
-1EE04         ; AL # Cn       <reserved-1EE04>
 1EE05..1EE1F  ; AL # Lo  [27] ARABIC MATHEMATICAL WAW..ARABIC MATHEMATICAL DOTLESS QAF
-1EE20         ; AL # Cn       <reserved-1EE20>
 1EE21..1EE22  ; AL # Lo   [2] ARABIC MATHEMATICAL INITIAL BEH..ARABIC MATHEMATICAL INITIAL JEEM
-1EE23         ; AL # Cn       <reserved-1EE23>
 1EE24         ; AL # Lo       ARABIC MATHEMATICAL INITIAL HEH
-1EE25..1EE26  ; AL # Cn   [2] <reserved-1EE25>..<reserved-1EE26>
 1EE27         ; AL # Lo       ARABIC MATHEMATICAL INITIAL HAH
-1EE28         ; AL # Cn       <reserved-1EE28>
 1EE29..1EE32  ; AL # Lo  [10] ARABIC MATHEMATICAL INITIAL YEH..ARABIC MATHEMATICAL INITIAL QAF
-1EE33         ; AL # Cn       <reserved-1EE33>
 1EE34..1EE37  ; AL # Lo   [4] ARABIC MATHEMATICAL INITIAL SHEEN..ARABIC MATHEMATICAL INITIAL KHAH
-1EE38         ; AL # Cn       <reserved-1EE38>
 1EE39         ; AL # Lo       ARABIC MATHEMATICAL INITIAL DAD
-1EE3A         ; AL # Cn       <reserved-1EE3A>
 1EE3B         ; AL # Lo       ARABIC MATHEMATICAL INITIAL GHAIN
-1EE3C..1EE41  ; AL # Cn   [6] <reserved-1EE3C>..<reserved-1EE41>
 1EE42         ; AL # Lo       ARABIC MATHEMATICAL TAILED JEEM
-1EE43..1EE46  ; AL # Cn   [4] <reserved-1EE43>..<reserved-1EE46>
 1EE47         ; AL # Lo       ARABIC MATHEMATICAL TAILED HAH
-1EE48         ; AL # Cn       <reserved-1EE48>
 1EE49         ; AL # Lo       ARABIC MATHEMATICAL TAILED YEH
-1EE4A         ; AL # Cn       <reserved-1EE4A>
 1EE4B         ; AL # Lo       ARABIC MATHEMATICAL TAILED LAM
-1EE4C         ; AL # Cn       <reserved-1EE4C>
 1EE4D..1EE4F  ; AL # Lo   [3] ARABIC MATHEMATICAL TAILED NOON..ARABIC MATHEMATICAL TAILED AIN
-1EE50         ; AL # Cn       <reserved-1EE50>
 1EE51..1EE52  ; AL # Lo   [2] ARABIC MATHEMATICAL TAILED SAD..ARABIC MATHEMATICAL TAILED QAF
-1EE53         ; AL # Cn       <reserved-1EE53>
 1EE54         ; AL # Lo       ARABIC MATHEMATICAL TAILED SHEEN
-1EE55..1EE56  ; AL # Cn   [2] <reserved-1EE55>..<reserved-1EE56>
 1EE57         ; AL # Lo       ARABIC MATHEMATICAL TAILED KHAH
-1EE58         ; AL # Cn       <reserved-1EE58>
 1EE59         ; AL # Lo       ARABIC MATHEMATICAL TAILED DAD
-1EE5A         ; AL # Cn       <reserved-1EE5A>
 1EE5B         ; AL # Lo       ARABIC MATHEMATICAL TAILED GHAIN
-1EE5C         ; AL # Cn       <reserved-1EE5C>
 1EE5D         ; AL # Lo       ARABIC MATHEMATICAL TAILED DOTLESS NOON
-1EE5E         ; AL # Cn       <reserved-1EE5E>
 1EE5F         ; AL # Lo       ARABIC MATHEMATICAL TAILED DOTLESS QAF
-1EE60         ; AL # Cn       <reserved-1EE60>
 1EE61..1EE62  ; AL # Lo   [2] ARABIC MATHEMATICAL STRETCHED BEH..ARABIC MATHEMATICAL STRETCHED JEEM
-1EE63         ; AL # Cn       <reserved-1EE63>
 1EE64         ; AL # Lo       ARABIC MATHEMATICAL STRETCHED HEH
-1EE65..1EE66  ; AL # Cn   [2] <reserved-1EE65>..<reserved-1EE66>
 1EE67..1EE6A  ; AL # Lo   [4] ARABIC MATHEMATICAL STRETCHED HAH..ARABIC MATHEMATICAL STRETCHED KAF
-1EE6B         ; AL # Cn       <reserved-1EE6B>
 1EE6C..1EE72  ; AL # Lo   [7] ARABIC MATHEMATICAL STRETCHED MEEM..ARABIC MATHEMATICAL STRETCHED QAF
-1EE73         ; AL # Cn       <reserved-1EE73>
 1EE74..1EE77  ; AL # Lo   [4] ARABIC MATHEMATICAL STRETCHED SHEEN..ARABIC MATHEMATICAL STRETCHED KHAH
-1EE78         ; AL # Cn       <reserved-1EE78>
 1EE79..1EE7C  ; AL # Lo   [4] ARABIC MATHEMATICAL STRETCHED DAD..ARABIC MATHEMATICAL STRETCHED DOTLESS BEH
-1EE7D         ; AL # Cn       <reserved-1EE7D>
 1EE7E         ; AL # Lo       ARABIC MATHEMATICAL STRETCHED DOTLESS FEH
-1EE7F         ; AL # Cn       <reserved-1EE7F>
 1EE80..1EE89  ; AL # Lo  [10] ARABIC MATHEMATICAL LOOPED ALEF..ARABIC MATHEMATICAL LOOPED YEH
-1EE8A         ; AL # Cn       <reserved-1EE8A>
 1EE8B..1EE9B  ; AL # Lo  [17] ARABIC MATHEMATICAL LOOPED LAM..ARABIC MATHEMATICAL LOOPED GHAIN
-1EE9C..1EEA0  ; AL # Cn   [5] <reserved-1EE9C>..<reserved-1EEA0>
 1EEA1..1EEA3  ; AL # Lo   [3] ARABIC MATHEMATICAL DOUBLE-STRUCK BEH..ARABIC MATHEMATICAL DOUBLE-STRUCK DAL
-1EEA4         ; AL # Cn       <reserved-1EEA4>
 1EEA5..1EEA9  ; AL # Lo   [5] ARABIC MATHEMATICAL DOUBLE-STRUCK WAW..ARABIC MATHEMATICAL DOUBLE-STRUCK YEH
-1EEAA         ; AL # Cn       <reserved-1EEAA>
 1EEAB..1EEBB  ; AL # Lo  [17] ARABIC MATHEMATICAL DOUBLE-STRUCK LAM..ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN
-1EEBC..1EEEF  ; AL # Cn  [52] <reserved-1EEBC>..<reserved-1EEEF>
-1EEF2..1EEFF  ; AL # Cn  [14] <reserved-1EEF2>..<reserved-1EEFF>
 
-# Total code points: 1708
+# The above property value applies to 298 code points not listed here.
+# Total code points: 1769
 
 # ================================================
 
index 60409c0..c60da01 100644 (file)
@@ -1,11 +1,11 @@
-# DerivedBinaryProperties-14.0.0.txt
-# Date: 2021-06-04, 02:19:15 GMT
-# © 2021 Unicode®, Inc.
+# DerivedBinaryProperties-15.0.0.txt
+# Date: 2022-02-26, 00:38:29 GMT
+# © 2022 Unicode®, Inc.
 # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
-# For terms of use, see http://www.unicode.org/terms_of_use.html
+# For terms of use, see https://www.unicode.org/terms_of_use.html
 #
 # Unicode Character Database
-#   For documentation, see http://www.unicode.org/reports/tr44/
+#   For documentation, see https://www.unicode.org/reports/tr44/
 
 # ================================================
 
index 4ad8205..5b82ed4 100644 (file)
@@ -1,11 +1,11 @@
-# DerivedCombiningClass-14.0.0.txt
-# Date: 2021-07-10, 00:35:05 GMT
-# © 2021 Unicode®, Inc.
+# DerivedCombiningClass-15.0.0.txt
+# Date: 2022-04-26, 23:14:29 GMT
+# © 2022 Unicode®, Inc.
 # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
-# For terms of use, see http://www.unicode.org/terms_of_use.html
+# For terms of use, see https://www.unicode.org/terms_of_use.html
 #
 # Unicode Character Database
-#   For documentation, see http://www.unicode.org/reports/tr44/
+#   For documentation, see https://www.unicode.org/reports/tr44/
 
 # ================================================
 
 0CE2..0CE3    ; 0 # Mn   [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL
 0CE6..0CEF    ; 0 # Nd  [10] KANNADA DIGIT ZERO..KANNADA DIGIT NINE
 0CF1..0CF2    ; 0 # Lo   [2] KANNADA SIGN JIHVAMULIYA..KANNADA SIGN UPADHMANIYA
+0CF3          ; 0 # Mc       KANNADA SIGN COMBINING ANUSVARA ABOVE RIGHT
 0D00..0D01    ; 0 # Mn   [2] MALAYALAM SIGN COMBINING ANUSVARA ABOVE..MALAYALAM SIGN CANDRABINDU
 0D02..0D03    ; 0 # Mc   [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA
 0D04..0D0C    ; 0 # Lo   [9] MALAYALAM LETTER VEDIC ANUSVARA..MALAYALAM LETTER VOCALIC L
 0EBD          ; 0 # Lo       LAO SEMIVOWEL SIGN NYO
 0EC0..0EC4    ; 0 # Lo   [5] LAO VOWEL SIGN E..LAO VOWEL SIGN AI
 0EC6          ; 0 # Lm       LAO KO LA
-0ECC..0ECD    ; 0 # Mn   [2] LAO CANCELLATION MARK..LAO NIGGAHITA
+0ECC..0ECE    ; 0 # Mn   [3] LAO CANCELLATION MARK..LAO YAMAKKAN
 0ED0..0ED9    ; 0 # Nd  [10] LAO DIGIT ZERO..LAO DIGIT NINE
 0EDC..0EDF    ; 0 # Lo   [4] LAO HO NO..LAO LETTER KHMU NYO
 0F00          ; 0 # Lo       TIBETAN SYLLABLE OM
@@ -1536,6 +1537,8 @@ FFFC..FFFD    ; 0 # So   [2] OBJECT REPLACEMENT CHARACTER..REPLACEMENT CHARACTER
 11237         ; 0 # Mn       KHOJKI SIGN SHADDA
 11238..1123D  ; 0 # Po   [6] KHOJKI DANDA..KHOJKI ABBREVIATION SIGN
 1123E         ; 0 # Mn       KHOJKI SIGN SUKUN
+1123F..11240  ; 0 # Lo   [2] KHOJKI LETTER QA..KHOJKI LETTER SHORT I
+11241         ; 0 # Mn       KHOJKI VOWEL SIGN VOCALIC R
 11280..11286  ; 0 # Lo   [7] MULTANI LETTER A..MULTANI LETTER GA
 11288         ; 0 # Lo       MULTANI LETTER GHA
 1128A..1128D  ; 0 # Lo   [4] MULTANI LETTER CA..MULTANI LETTER JJA
@@ -1682,6 +1685,7 @@ FFFC..FFFD    ; 0 # So   [2] OBJECT REPLACEMENT CHARACTER..REPLACEMENT CHARACTER
 11A9D         ; 0 # Lo       SOYOMBO MARK PLUTA
 11A9E..11AA2  ; 0 # Po   [5] SOYOMBO HEAD MARK WITH MOON AND SUN AND TRIPLE FLAME..SOYOMBO TERMINAL MARK-2
 11AB0..11AF8  ; 0 # Lo  [73] CANADIAN SYLLABICS NATTILIK HI..PAU CIN HAU GLOTTAL STOP FINAL
+11B00..11B09  ; 0 # Po  [10] DEVANAGARI HEAD MARK..DEVANAGARI SIGN MINDU
 11C00..11C08  ; 0 # Lo   [9] BHAIKSUKI LETTER A..BHAIKSUKI LETTER VOCALIC L
 11C0A..11C2E  ; 0 # Lo  [37] BHAIKSUKI LETTER E..BHAIKSUKI LETTER HA
 11C2F         ; 0 # Mc       BHAIKSUKI VOWEL SIGN AA
@@ -1726,6 +1730,17 @@ FFFC..FFFD    ; 0 # So   [2] OBJECT REPLACEMENT CHARACTER..REPLACEMENT CHARACTER
 11EF3..11EF4  ; 0 # Mn   [2] MAKASAR VOWEL SIGN I..MAKASAR VOWEL SIGN U
 11EF5..11EF6  ; 0 # Mc   [2] MAKASAR VOWEL SIGN E..MAKASAR VOWEL SIGN O
 11EF7..11EF8  ; 0 # Po   [2] MAKASAR PASSIMBANG..MAKASAR END OF SECTION
+11F00..11F01  ; 0 # Mn   [2] KAWI SIGN CANDRABINDU..KAWI SIGN ANUSVARA
+11F02         ; 0 # Lo       KAWI SIGN REPHA
+11F03         ; 0 # Mc       KAWI SIGN VISARGA
+11F04..11F10  ; 0 # Lo  [13] KAWI LETTER A..KAWI LETTER O
+11F12..11F33  ; 0 # Lo  [34] KAWI LETTER KA..KAWI LETTER JNYA
+11F34..11F35  ; 0 # Mc   [2] KAWI VOWEL SIGN AA..KAWI VOWEL SIGN ALTERNATE AA
+11F36..11F3A  ; 0 # Mn   [5] KAWI VOWEL SIGN I..KAWI VOWEL SIGN VOCALIC R
+11F3E..11F3F  ; 0 # Mc   [2] KAWI VOWEL SIGN E..KAWI VOWEL SIGN AI
+11F40         ; 0 # Mn       KAWI VOWEL SIGN EU
+11F43..11F4F  ; 0 # Po  [13] KAWI DANDA..KAWI PUNCTUATION CLOSING SPIRAL
+11F50..11F59  ; 0 # Nd  [10] KAWI DIGIT ZERO..KAWI DIGIT NINE
 11FB0         ; 0 # Lo       LISU LETTER YHA
 11FC0..11FD4  ; 0 # No  [21] TAMIL FRACTION ONE THREE-HUNDRED-AND-TWENTIETH..TAMIL FRACTION DOWNSCALING FACTOR KIIZH
 11FD5..11FDC  ; 0 # So   [8] TAMIL SIGN NEL..TAMIL SIGN MUKKURUNI
@@ -1738,8 +1753,11 @@ FFFC..FFFD    ; 0 # So   [2] OBJECT REPLACEMENT CHARACTER..REPLACEMENT CHARACTER
 12480..12543  ; 0 # Lo [196] CUNEIFORM SIGN AB TIMES NUN TENU..CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU
 12F90..12FF0  ; 0 # Lo  [97] CYPRO-MINOAN SIGN CM001..CYPRO-MINOAN SIGN CM114
 12FF1..12FF2  ; 0 # Po   [2] CYPRO-MINOAN SIGN CM301..CYPRO-MINOAN SIGN CM302
-13000..1342E  ; 0 # Lo [1071] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH AA032
-13430..13438  ; 0 # Cf   [9] EGYPTIAN HIEROGLYPH VERTICAL JOINER..EGYPTIAN HIEROGLYPH END SEGMENT
+13000..1342F  ; 0 # Lo [1072] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH V011D
+13430..1343F  ; 0 # Cf  [16] EGYPTIAN HIEROGLYPH VERTICAL JOINER..EGYPTIAN HIEROGLYPH END WALLED ENCLOSURE
+13440         ; 0 # Mn       EGYPTIAN HIEROGLYPH MIRROR HORIZONTALLY
+13441..13446  ; 0 # Lo   [6] EGYPTIAN HIEROGLYPH FULL BLANK..EGYPTIAN HIEROGLYPH WIDE LOST SIGN
+13447..13455  ; 0 # Mn  [15] EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP START..EGYPTIAN HIEROGLYPH MODIFIER DAMAGED
 14400..14646  ; 0 # Lo [583] ANATOLIAN HIEROGLYPH A001..ANATOLIAN HIEROGLYPH A530
 16800..16A38  ; 0 # Lo [569] BAMUM LETTER PHASE-A NGKUE MFON..BAMUM LETTER PHASE-F VUEQ
 16A40..16A5E  ; 0 # Lo  [31] MRO LETTER TA..MRO LETTER TEK
@@ -1779,7 +1797,9 @@ FFFC..FFFD    ; 0 # So   [2] OBJECT REPLACEMENT CHARACTER..REPLACEMENT CHARACTER
 1AFF5..1AFFB  ; 0 # Lm   [7] KATAKANA LETTER MINNAN TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-5
 1AFFD..1AFFE  ; 0 # Lm   [2] KATAKANA LETTER MINNAN NASALIZED TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-8
 1B000..1B122  ; 0 # Lo [291] KATAKANA LETTER ARCHAIC E..KATAKANA LETTER ARCHAIC WU
+1B132         ; 0 # Lo       HIRAGANA LETTER SMALL KO
 1B150..1B152  ; 0 # Lo   [3] HIRAGANA LETTER SMALL WI..HIRAGANA LETTER SMALL WO
+1B155         ; 0 # Lo       KATAKANA LETTER SMALL KO
 1B164..1B167  ; 0 # Lo   [4] KATAKANA LETTER SMALL WI..KATAKANA LETTER SMALL N
 1B170..1B2FB  ; 0 # Lo [396] NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB
 1BC00..1BC6A  ; 0 # Lo [107] DUPLOYAN LETTER H..DUPLOYAN LETTER VOCALIC M
@@ -1803,6 +1823,7 @@ FFFC..FFFD    ; 0 # So   [2] OBJECT REPLACEMENT CHARACTER..REPLACEMENT CHARACTER
 1D1AE..1D1EA  ; 0 # So  [61] MUSICAL SYMBOL PEDAL MARK..MUSICAL SYMBOL KORON
 1D200..1D241  ; 0 # So  [66] GREEK VOCAL NOTATION SYMBOL-1..GREEK INSTRUMENTAL NOTATION SYMBOL-54
 1D245         ; 0 # So       GREEK MUSICAL LEIMMA
+1D2C0..1D2D3  ; 0 # No  [20] KAKTOVIK NUMERAL ZERO..KAKTOVIK NUMERAL NINETEEN
 1D2E0..1D2F3  ; 0 # No  [20] MAYAN NUMERAL ZERO..MAYAN NUMERAL NINETEEN
 1D300..1D356  ; 0 # So  [87] MONOGRAM FOR EARTH..TETRAGRAM FOR FOSTERING
 1D360..1D378  ; 0 # No  [25] COUNTING ROD UNIT DIGIT ONE..TALLY MARK FIVE
@@ -1862,6 +1883,8 @@ FFFC..FFFD    ; 0 # So   [2] OBJECT REPLACEMENT CHARACTER..REPLACEMENT CHARACTER
 1DF00..1DF09  ; 0 # L&  [10] LATIN SMALL LETTER FENG DIGRAPH WITH TRILL..LATIN SMALL LETTER T WITH HOOK AND RETROFLEX HOOK
 1DF0A         ; 0 # Lo       LATIN LETTER RETROFLEX CLICK WITH RETROFLEX HOOK
 1DF0B..1DF1E  ; 0 # L&  [20] LATIN SMALL LETTER ESH WITH DOUBLE BAR..LATIN SMALL LETTER S WITH CURL
+1DF25..1DF2A  ; 0 # L&   [6] LATIN SMALL LETTER D WITH MID-HEIGHT LEFT HOOK..LATIN SMALL LETTER T WITH MID-HEIGHT LEFT HOOK
+1E030..1E06D  ; 0 # Lm  [62] MODIFIER LETTER CYRILLIC SMALL A..MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE
 1E100..1E12C  ; 0 # Lo  [45] NYIAKENG PUACHUE HMONG LETTER MA..NYIAKENG PUACHUE HMONG LETTER W
 1E137..1E13D  ; 0 # Lm   [7] NYIAKENG PUACHUE HMONG SIGN FOR PERSON..NYIAKENG PUACHUE HMONG SYLLABLE LENGTHENER
 1E140..1E149  ; 0 # Nd  [10] NYIAKENG PUACHUE HMONG DIGIT ZERO..NYIAKENG PUACHUE HMONG DIGIT NINE
@@ -1871,6 +1894,9 @@ FFFC..FFFD    ; 0 # So   [2] OBJECT REPLACEMENT CHARACTER..REPLACEMENT CHARACTER
 1E2C0..1E2EB  ; 0 # Lo  [44] WANCHO LETTER AA..WANCHO LETTER YIH
 1E2F0..1E2F9  ; 0 # Nd  [10] WANCHO DIGIT ZERO..WANCHO DIGIT NINE
 1E2FF         ; 0 # Sc       WANCHO NGUN SIGN
+1E4D0..1E4EA  ; 0 # Lo  [27] NAG MUNDARI LETTER O..NAG MUNDARI LETTER ELL
+1E4EB         ; 0 # Lm       NAG MUNDARI SIGN OJOD
+1E4F0..1E4F9  ; 0 # Nd  [10] NAG MUNDARI DIGIT ZERO..NAG MUNDARI DIGIT NINE
 1E7E0..1E7E6  ; 0 # Lo   [7] ETHIOPIC SYLLABLE HHYA..ETHIOPIC SYLLABLE HHYO
 1E7E8..1E7EB  ; 0 # Lo   [4] ETHIOPIC SYLLABLE GURAGE HHWA..ETHIOPIC SYLLABLE HHWE
 1E7ED..1E7EE  ; 0 # Lo   [2] ETHIOPIC SYLLABLE GURAGE MWI..ETHIOPIC SYLLABLE GURAGE MWEE
@@ -1939,10 +1965,10 @@ FFFC..FFFD    ; 0 # So   [2] OBJECT REPLACEMENT CHARACTER..REPLACEMENT CHARACTER
 1F300..1F3FA  ; 0 # So [251] CYCLONE..AMPHORA
 1F3FB..1F3FF  ; 0 # Sk   [5] EMOJI MODIFIER FITZPATRICK TYPE-1-2..EMOJI MODIFIER FITZPATRICK TYPE-6
 1F400..1F6D7  ; 0 # So [728] RAT..ELEVATOR
-1F6DD..1F6EC  ; 0 # So  [16] PLAYGROUND SLIDE..AIRPLANE ARRIVING
+1F6DC..1F6EC  ; 0 # So  [17] WIRELESS..AIRPLANE ARRIVING
 1F6F0..1F6FC  ; 0 # So  [13] SATELLITE..ROLLER SKATE
-1F700..1F773  ; 0 # So [116] ALCHEMICAL SYMBOL FOR QUINTESSENCE..ALCHEMICAL SYMBOL FOR HALF OUNCE
-1F780..1F7D8  ; 0 # So  [89] BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE..NEGATIVE CIRCLED SQUARE
+1F700..1F776  ; 0 # So [119] ALCHEMICAL SYMBOL FOR QUINTESSENCE..LUNAR ECLIPSE
+1F77B..1F7D9  ; 0 # So  [95] HAUMEA..NINE POINTED WHITE STAR
 1F7E0..1F7EB  ; 0 # So  [12] LARGE ORANGE CIRCLE..LARGE BROWN SQUARE
 1F7F0         ; 0 # So       HEAVY EQUALS SIGN
 1F800..1F80B  ; 0 # So  [12] LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD..DOWNWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD
@@ -1953,33 +1979,32 @@ FFFC..FFFD    ; 0 # So   [2] OBJECT REPLACEMENT CHARACTER..REPLACEMENT CHARACTER
 1F8B0..1F8B1  ; 0 # So   [2] ARROW POINTING UPWARDS THEN NORTH WEST..ARROW POINTING RIGHTWARDS THEN CURVING SOUTH WEST
 1F900..1FA53  ; 0 # So [340] CIRCLED CROSS FORMEE WITH FOUR DOTS..BLACK CHESS KNIGHT-BISHOP
 1FA60..1FA6D  ; 0 # So  [14] XIANGQI RED GENERAL..XIANGQI BLACK SOLDIER
-1FA70..1FA74  ; 0 # So   [5] BALLET SHOES..THONG SANDAL
-1FA78..1FA7C  ; 0 # So   [5] DROP OF BLOOD..CRUTCH
-1FA80..1FA86  ; 0 # So   [7] YO-YO..NESTING DOLLS
-1FA90..1FAAC  ; 0 # So  [29] RINGED PLANET..HAMSA
-1FAB0..1FABA  ; 0 # So  [11] FLY..NEST WITH EGGS
-1FAC0..1FAC5  ; 0 # So   [6] ANATOMICAL HEART..PERSON WITH CROWN
-1FAD0..1FAD9  ; 0 # So  [10] BLUEBERRIES..JAR
-1FAE0..1FAE7  ; 0 # So   [8] MELTING FACE..BUBBLES
-1FAF0..1FAF6  ; 0 # So   [7] HAND WITH INDEX FINGER AND THUMB CROSSED..HEART HANDS
+1FA70..1FA7C  ; 0 # So  [13] BALLET SHOES..CRUTCH
+1FA80..1FA88  ; 0 # So   [9] YO-YO..FLUTE
+1FA90..1FABD  ; 0 # So  [46] RINGED PLANET..WING
+1FABF..1FAC5  ; 0 # So   [7] GOOSE..PERSON WITH CROWN
+1FACE..1FADB  ; 0 # So  [14] MOOSE..PEA POD
+1FAE0..1FAE8  ; 0 # So   [9] MELTING FACE..SHAKING FACE
+1FAF0..1FAF8  ; 0 # So   [9] HAND WITH INDEX FINGER AND THUMB CROSSED..RIGHTWARDS PUSHING HAND
 1FB00..1FB92  ; 0 # So [147] BLOCK SEXTANT-1..UPPER HALF INVERSE MEDIUM SHADE AND LOWER HALF BLOCK
 1FB94..1FBCA  ; 0 # So  [55] LEFT HALF INVERSE MEDIUM SHADE AND RIGHT HALF BLOCK..WHITE UP-POINTING CHEVRON
 1FBF0..1FBF9  ; 0 # Nd  [10] SEGMENTED DIGIT ZERO..SEGMENTED DIGIT NINE
 20000..2A6DF  ; 0 # Lo [42720] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6DF
-2A700..2B738  ; 0 # Lo [4153] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B738
+2A700..2B739  ; 0 # Lo [4154] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B739
 2B740..2B81D  ; 0 # Lo [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D
 2B820..2CEA1  ; 0 # Lo [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1
 2CEB0..2EBE0  ; 0 # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0
 2F800..2FA1D  ; 0 # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D
 30000..3134A  ; 0 # Lo [4939] CJK UNIFIED IDEOGRAPH-30000..CJK UNIFIED IDEOGRAPH-3134A
+31350..323AF  ; 0 # Lo [4192] CJK UNIFIED IDEOGRAPH-31350..CJK UNIFIED IDEOGRAPH-323AF
 E0001         ; 0 # Cf       LANGUAGE TAG
 E0020..E007F  ; 0 # Cf  [96] TAG SPACE..CANCEL TAG
 E0100..E01EF  ; 0 # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256
 F0000..FFFFD  ; 0 # Co [65534] <private-use-F0000>..<private-use-FFFFD>
 100000..10FFFD; 0 # Co [65534] <private-use-100000>..<private-use-10FFFD>
 
-# The above property value applies to 831882 code points not listed here.
-# Total code points: 1113200
+# The above property value applies to 827393 code points not listed here.
+# Total code points: 1113190
 
 # ================================================
 
@@ -2110,8 +2135,10 @@ ABED          ; 9 # Mn       MEETEI MAYEK APUN IYEK
 11C3F         ; 9 # Mn       BHAIKSUKI SIGN VIRAMA
 11D44..11D45  ; 9 # Mn   [2] MASARAM GONDI SIGN HALANTA..MASARAM GONDI VIRAMA
 11D97         ; 9 # Mn       GUNJALA GONDI VIRAMA
+11F41         ; 9 # Mc       KAWI SIGN KILLER
+11F42         ; 9 # Mn       KAWI CONJOINER
 
-# Total code points: 63
+# Total code points: 65
 
 # ================================================
 
@@ -2527,6 +2554,7 @@ FE27..FE2D    ; 220 # Mn   [7] COMBINING LIGATURE LEFT HALF BELOW..COMBINING CON
 10A0D         ; 220 # Mn       KHAROSHTHI SIGN DOUBLE RING BELOW
 10A3A         ; 220 # Mn       KHAROSHTHI SIGN DOT BELOW
 10AE6         ; 220 # Mn       MANICHAEAN ABBREVIATION MARK BELOW
+10EFD..10EFF  ; 220 # Mn   [3] ARABIC SMALL LOW WORD SAKTA..ARABIC SMALL LOW WORD MADDA
 10F46..10F47  ; 220 # Mn   [2] SOGDIAN COMBINING DOT BELOW..SOGDIAN COMBINING TWO DOTS BELOW
 10F4B         ; 220 # Mn       SOGDIAN COMBINING CURVE BELOW
 10F4D..10F50  ; 220 # Mn   [4] SOGDIAN COMBINING HOOK BELOW..SOGDIAN COMBINING STROKE BELOW
@@ -2534,9 +2562,10 @@ FE27..FE2D    ; 220 # Mn   [7] COMBINING LIGATURE LEFT HALF BELOW..COMBINING CON
 10F85         ; 220 # Mn       OLD UYGHUR COMBINING TWO DOTS BELOW
 1D17B..1D182  ; 220 # Mn   [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE
 1D18A..1D18B  ; 220 # Mn   [2] MUSICAL SYMBOL COMBINING DOUBLE TONGUE..MUSICAL SYMBOL COMBINING TRIPLE TONGUE
+1E4EE         ; 220 # Mn       NAG MUNDARI SIGN IKIR
 1E8D0..1E8D6  ; 220 # Mn   [7] MENDE KIKAKUI COMBINING NUMBER TEENS..MENDE KIKAKUI COMBINING NUMBER MILLIONS
 
-# Total code points: 177
+# Total code points: 181
 
 # ================================================
 
@@ -2703,12 +2732,14 @@ FE2E..FE2F    ; 230 # Mn   [2] COMBINING CYRILLIC TITLO LEFT HALF..COMBINING CYR
 1E01B..1E021  ; 230 # Mn   [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI
 1E023..1E024  ; 230 # Mn   [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS
 1E026..1E02A  ; 230 # Mn   [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA
+1E08F         ; 230 # Mn       COMBINING CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
 1E130..1E136  ; 230 # Mn   [7] NYIAKENG PUACHUE HMONG TONE-B..NYIAKENG PUACHUE HMONG TONE-D
 1E2AE         ; 230 # Mn       TOTO SIGN RISING TONE
 1E2EC..1E2EF  ; 230 # Mn   [4] WANCHO TONE TUP..WANCHO TONE KOINI
+1E4EF         ; 230 # Mn       NAG MUNDARI SIGN SUTUH
 1E944..1E949  ; 230 # Mn   [6] ADLAM ALIF LENGTHENER..ADLAM GEMINATE CONSONANT MODIFIER
 
-# Total code points: 508
+# Total code points: 510
 
 # ================================================
 
@@ -2719,8 +2750,9 @@ FE2E..FE2F    ; 230 # Mn   [2] COMBINING CYRILLIC TITLO LEFT HALF..COMBINING CYR
 0358          ; 232 # Mn       COMBINING DOT ABOVE RIGHT
 1DF6          ; 232 # Mn       COMBINING KAVYKA ABOVE RIGHT
 302C          ; 232 # Mn       IDEOGRAPHIC DEPARTING TONE MARK
+1E4EC..1E4ED  ; 232 # Mn   [2] NAG MUNDARI SIGN MUHOR..NAG MUNDARI SIGN TOYOR
 
-# Total code points: 5
+# Total code points: 7
 
 # ================================================
 
index 5af556b..2479018 100644 (file)
@@ -1,11 +1,11 @@
-# DerivedDecompositionType-14.0.0.txt
-# Date: 2021-06-04, 02:19:17 GMT
-# © 2021 Unicode®, Inc.
+# DerivedDecompositionType-15.0.0.txt
+# Date: 2022-02-26, 00:38:31 GMT
+# © 2022 Unicode®, Inc.
 # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
-# For terms of use, see http://www.unicode.org/terms_of_use.html
+# For terms of use, see https://www.unicode.org/terms_of_use.html
 #
 # Unicode Character Database
-#   For documentation, see http://www.unicode.org/reports/tr44/
+#   For documentation, see https://www.unicode.org/reports/tr44/
 
 # ================================================
 
@@ -868,9 +868,11 @@ AB69          ; Super # Lm       MODIFIER LETTER SMALL TURNED W
 10781..10785  ; Super # Lm   [5] MODIFIER LETTER SUPERSCRIPT TRIANGULAR COLON..MODIFIER LETTER SMALL B WITH HOOK
 10787..107B0  ; Super # Lm  [42] MODIFIER LETTER SMALL DZ DIGRAPH..MODIFIER LETTER SMALL V WITH RIGHT HOOK
 107B2..107BA  ; Super # Lm   [9] MODIFIER LETTER SMALL CAPITAL Y..MODIFIER LETTER SMALL S WITH CURL
+1E030..1E050  ; Super # Lm  [33] MODIFIER LETTER CYRILLIC SMALL A..MODIFIER LETTER CYRILLIC SMALL PALOCHKA
+1E06B..1E06D  ; Super # Lm   [3] MODIFIER LETTER CYRILLIC SMALL ES WITH DESCENDER..MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE
 1F16A..1F16C  ; Super # So   [3] RAISED MC SIGN..RAISED MR SIGN
 
-# Total code points: 213
+# Total code points: 249
 
 # ================================================
 
@@ -881,8 +883,9 @@ AB69          ; Super # Lm       MODIFIER LETTER SMALL TURNED W
 208E          ; Sub # Pe       SUBSCRIPT RIGHT PARENTHESIS
 2090..209C    ; Sub # Lm  [13] LATIN SUBSCRIPT SMALL LETTER A..LATIN SUBSCRIPT SMALL LETTER T
 2C7C          ; Sub # Lm       LATIN SUBSCRIPT SMALL LETTER J
+1E051..1E06A  ; Sub # Lm  [26] CYRILLIC SUBSCRIPT SMALL LETTER A..CYRILLIC SUBSCRIPT SMALL LETTER DZHE
 
-# Total code points: 38
+# Total code points: 64
 
 # ================================================
 
index 6bc84ff..b6d81dc 100644 (file)
@@ -1,11 +1,11 @@
-# DerivedEastAsianWidth-14.0.0.txt
-# Date: 2021-07-10, 00:35:07 GMT
-# © 2021 Unicode®, Inc.
+# DerivedEastAsianWidth-15.0.0.txt
+# Date: 2022-07-08, 23:49:26 GMT
+# © 2022 Unicode®, Inc.
 # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
-# For terms of use, see http://www.unicode.org/terms_of_use.html
+# For terms of use, see https://www.unicode.org/terms_of_use.html
 #
 # Unicode Character Database
-#   For documentation, see http://www.unicode.org/reports/tr44/
+#   For documentation, see https://www.unicode.org/reports/tr44/
 
 # ================================================
 
 
 # @missing: 0000..10FFFF; Neutral
 
+# 3400..4DBF CJK_Unified_Ideographs_Extension_A
+# @missing: 3400..4DBF; Wide
+
+# 4E00..9FFF CJK_Unified_Ideographs
+# @missing: 4E00..9FFF; Wide
+
+# F900..FAFF CJK_Compatibility_Ideographs
+# @missing: F900..FAFF; Wide
+
+# 20000..2A6DF CJK_Unified_Ideographs_Extension_B
+# 2A700..2B73F CJK_Unified_Ideographs_Extension_C
+# 2B740..2B81F CJK_Unified_Ideographs_Extension_D
+# 2B820..2CEAF CJK_Unified_Ideographs_Extension_E
+# 2CEB0..2EBEF CJK_Unified_Ideographs_Extension_F
+# 2F800..2FA1F CJK_Compatibility_Ideographs_Supplement
+# @missing: 20000..2FFFD; Wide
+
+# 30000..3134F CJK_Unified_Ideographs_Extension_G
+# 31350..323AF CJK_Unified_Ideographs_Extension_H
+# @missing: 30000..3FFFD; Wide
+
 # ================================================
 
 # East_Asian_Width=Neutral
 0CE2..0CE3    ; N # Mn   [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL
 0CE6..0CEF    ; N # Nd  [10] KANNADA DIGIT ZERO..KANNADA DIGIT NINE
 0CF1..0CF2    ; N # Lo   [2] KANNADA SIGN JIHVAMULIYA..KANNADA SIGN UPADHMANIYA
+0CF3          ; N # Mc       KANNADA SIGN COMBINING ANUSVARA ABOVE RIGHT
 0D00..0D01    ; N # Mn   [2] MALAYALAM SIGN COMBINING ANUSVARA ABOVE..MALAYALAM SIGN CANDRABINDU
 0D02..0D03    ; N # Mc   [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA
 0D04..0D0C    ; N # Lo   [9] MALAYALAM LETTER VEDIC ANUSVARA..MALAYALAM LETTER VOCALIC L
 0EBD          ; N # Lo       LAO SEMIVOWEL SIGN NYO
 0EC0..0EC4    ; N # Lo   [5] LAO VOWEL SIGN E..LAO VOWEL SIGN AI
 0EC6          ; N # Lm       LAO KO LA
-0EC8..0ECD    ; N # Mn   [6] LAO TONE MAI EK..LAO NIGGAHITA
+0EC8..0ECE    ; N # Mn   [7] LAO TONE MAI EK..LAO YAMAKKAN
 0ED0..0ED9    ; N # Nd  [10] LAO DIGIT ZERO..LAO DIGIT NINE
 0EDC..0EDF    ; N # Lo   [4] LAO HO NO..LAO LETTER KHMU NYO
 0F00          ; N # Lo       TIBETAN SYLLABLE OM
@@ -1449,6 +1471,7 @@ FFFC          ; N # So       OBJECT REPLACEMENT CHARACTER
 10EAB..10EAC  ; N # Mn   [2] YEZIDI COMBINING HAMZA MARK..YEZIDI COMBINING MADDA MARK
 10EAD         ; N # Pd       YEZIDI HYPHENATION MARK
 10EB0..10EB1  ; N # Lo   [2] YEZIDI LETTER LAM WITH DOT ABOVE..YEZIDI LETTER YOT WITH CIRCUMFLEX ABOVE
+10EFD..10EFF  ; N # Mn   [3] ARABIC SMALL LOW WORD SAKTA..ARABIC SMALL LOW WORD MADDA
 10F00..10F1C  ; N # Lo  [29] OLD SOGDIAN LETTER ALEPH..OLD SOGDIAN LETTER FINAL TAW WITH VERTICAL TAIL
 10F1D..10F26  ; N # No  [10] OLD SOGDIAN NUMBER ONE..OLD SOGDIAN FRACTION ONE HALF
 10F27         ; N # Lo       OLD SOGDIAN LIGATURE AYIN-DALETH
@@ -1530,6 +1553,8 @@ FFFC          ; N # So       OBJECT REPLACEMENT CHARACTER
 11236..11237  ; N # Mn   [2] KHOJKI SIGN NUKTA..KHOJKI SIGN SHADDA
 11238..1123D  ; N # Po   [6] KHOJKI DANDA..KHOJKI ABBREVIATION SIGN
 1123E         ; N # Mn       KHOJKI SIGN SUKUN
+1123F..11240  ; N # Lo   [2] KHOJKI LETTER QA..KHOJKI LETTER SHORT I
+11241         ; N # Mn       KHOJKI VOWEL SIGN VOCALIC R
 11280..11286  ; N # Lo   [7] MULTANI LETTER A..MULTANI LETTER GA
 11288         ; N # Lo       MULTANI LETTER GHA
 1128A..1128D  ; N # Lo   [4] MULTANI LETTER CA..MULTANI LETTER JJA
@@ -1690,6 +1715,7 @@ FFFC          ; N # So       OBJECT REPLACEMENT CHARACTER
 11A9D         ; N # Lo       SOYOMBO MARK PLUTA
 11A9E..11AA2  ; N # Po   [5] SOYOMBO HEAD MARK WITH MOON AND SUN AND TRIPLE FLAME..SOYOMBO TERMINAL MARK-2
 11AB0..11AF8  ; N # Lo  [73] CANADIAN SYLLABICS NATTILIK HI..PAU CIN HAU GLOTTAL STOP FINAL
+11B00..11B09  ; N # Po  [10] DEVANAGARI HEAD MARK..DEVANAGARI SIGN MINDU
 11C00..11C08  ; N # Lo   [9] BHAIKSUKI LETTER A..BHAIKSUKI LETTER VOCALIC L
 11C0A..11C2E  ; N # Lo  [37] BHAIKSUKI LETTER E..BHAIKSUKI LETTER HA
 11C2F         ; N # Mc       BHAIKSUKI VOWEL SIGN AA
@@ -1735,6 +1761,19 @@ FFFC          ; N # So       OBJECT REPLACEMENT CHARACTER
 11EF3..11EF4  ; N # Mn   [2] MAKASAR VOWEL SIGN I..MAKASAR VOWEL SIGN U
 11EF5..11EF6  ; N # Mc   [2] MAKASAR VOWEL SIGN E..MAKASAR VOWEL SIGN O
 11EF7..11EF8  ; N # Po   [2] MAKASAR PASSIMBANG..MAKASAR END OF SECTION
+11F00..11F01  ; N # Mn   [2] KAWI SIGN CANDRABINDU..KAWI SIGN ANUSVARA
+11F02         ; N # Lo       KAWI SIGN REPHA
+11F03         ; N # Mc       KAWI SIGN VISARGA
+11F04..11F10  ; N # Lo  [13] KAWI LETTER A..KAWI LETTER O
+11F12..11F33  ; N # Lo  [34] KAWI LETTER KA..KAWI LETTER JNYA
+11F34..11F35  ; N # Mc   [2] KAWI VOWEL SIGN AA..KAWI VOWEL SIGN ALTERNATE AA
+11F36..11F3A  ; N # Mn   [5] KAWI VOWEL SIGN I..KAWI VOWEL SIGN VOCALIC R
+11F3E..11F3F  ; N # Mc   [2] KAWI VOWEL SIGN E..KAWI VOWEL SIGN AI
+11F40         ; N # Mn       KAWI VOWEL SIGN EU
+11F41         ; N # Mc       KAWI SIGN KILLER
+11F42         ; N # Mn       KAWI CONJOINER
+11F43..11F4F  ; N # Po  [13] KAWI DANDA..KAWI PUNCTUATION CLOSING SPIRAL
+11F50..11F59  ; N # Nd  [10] KAWI DIGIT ZERO..KAWI DIGIT NINE
 11FB0         ; N # Lo       LISU LETTER YHA
 11FC0..11FD4  ; N # No  [21] TAMIL FRACTION ONE THREE-HUNDRED-AND-TWENTIETH..TAMIL FRACTION DOWNSCALING FACTOR KIIZH
 11FD5..11FDC  ; N # So   [8] TAMIL SIGN NEL..TAMIL SIGN MUKKURUNI
@@ -1747,8 +1786,11 @@ FFFC          ; N # So       OBJECT REPLACEMENT CHARACTER
 12480..12543  ; N # Lo [196] CUNEIFORM SIGN AB TIMES NUN TENU..CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU
 12F90..12FF0  ; N # Lo  [97] CYPRO-MINOAN SIGN CM001..CYPRO-MINOAN SIGN CM114
 12FF1..12FF2  ; N # Po   [2] CYPRO-MINOAN SIGN CM301..CYPRO-MINOAN SIGN CM302
-13000..1342E  ; N # Lo [1071] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH AA032
-13430..13438  ; N # Cf   [9] EGYPTIAN HIEROGLYPH VERTICAL JOINER..EGYPTIAN HIEROGLYPH END SEGMENT
+13000..1342F  ; N # Lo [1072] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH V011D
+13430..1343F  ; N # Cf  [16] EGYPTIAN HIEROGLYPH VERTICAL JOINER..EGYPTIAN HIEROGLYPH END WALLED ENCLOSURE
+13440         ; N # Mn       EGYPTIAN HIEROGLYPH MIRROR HORIZONTALLY
+13441..13446  ; N # Lo   [6] EGYPTIAN HIEROGLYPH FULL BLANK..EGYPTIAN HIEROGLYPH WIDE LOST SIGN
+13447..13455  ; N # Mn  [15] EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP START..EGYPTIAN HIEROGLYPH MODIFIER DAMAGED
 14400..14646  ; N # Lo [583] ANATOLIAN HIEROGLYPH A001..ANATOLIAN HIEROGLYPH A530
 16800..16A38  ; N # Lo [569] BAMUM LETTER PHASE-A NGKUE MFON..BAMUM LETTER PHASE-F VUEQ
 16A40..16A5E  ; N # Lo  [31] MRO LETTER TA..MRO LETTER TEK
@@ -1807,6 +1849,7 @@ FFFC          ; N # So       OBJECT REPLACEMENT CHARACTER
 1D200..1D241  ; N # So  [66] GREEK VOCAL NOTATION SYMBOL-1..GREEK INSTRUMENTAL NOTATION SYMBOL-54
 1D242..1D244  ; N # Mn   [3] COMBINING GREEK MUSICAL TRISEME..COMBINING GREEK MUSICAL PENTASEME
 1D245         ; N # So       GREEK MUSICAL LEIMMA
+1D2C0..1D2D3  ; N # No  [20] KAKTOVIK NUMERAL ZERO..KAKTOVIK NUMERAL NINETEEN
 1D2E0..1D2F3  ; N # No  [20] MAYAN NUMERAL ZERO..MAYAN NUMERAL NINETEEN
 1D300..1D356  ; N # So  [87] MONOGRAM FOR EARTH..TETRAGRAM FOR FOSTERING
 1D360..1D378  ; N # No  [25] COUNTING ROD UNIT DIGIT ONE..TALLY MARK FIVE
@@ -1866,11 +1909,14 @@ FFFC          ; N # So       OBJECT REPLACEMENT CHARACTER
 1DF00..1DF09  ; N # L&  [10] LATIN SMALL LETTER FENG DIGRAPH WITH TRILL..LATIN SMALL LETTER T WITH HOOK AND RETROFLEX HOOK
 1DF0A         ; N # Lo       LATIN LETTER RETROFLEX CLICK WITH RETROFLEX HOOK
 1DF0B..1DF1E  ; N # L&  [20] LATIN SMALL LETTER ESH WITH DOUBLE BAR..LATIN SMALL LETTER S WITH CURL
+1DF25..1DF2A  ; N # L&   [6] LATIN SMALL LETTER D WITH MID-HEIGHT LEFT HOOK..LATIN SMALL LETTER T WITH MID-HEIGHT LEFT HOOK
 1E000..1E006  ; N # Mn   [7] COMBINING GLAGOLITIC LETTER AZU..COMBINING GLAGOLITIC LETTER ZHIVETE
 1E008..1E018  ; N # Mn  [17] COMBINING GLAGOLITIC LETTER ZEMLJA..COMBINING GLAGOLITIC LETTER HERU
 1E01B..1E021  ; N # Mn   [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI
 1E023..1E024  ; N # Mn   [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS
 1E026..1E02A  ; N # Mn   [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA
+1E030..1E06D  ; N # Lm  [62] MODIFIER LETTER CYRILLIC SMALL A..MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE
+1E08F         ; N # Mn       COMBINING CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
 1E100..1E12C  ; N # Lo  [45] NYIAKENG PUACHUE HMONG LETTER MA..NYIAKENG PUACHUE HMONG LETTER W
 1E130..1E136  ; N # Mn   [7] NYIAKENG PUACHUE HMONG TONE-B..NYIAKENG PUACHUE HMONG TONE-D
 1E137..1E13D  ; N # Lm   [7] NYIAKENG PUACHUE HMONG SIGN FOR PERSON..NYIAKENG PUACHUE HMONG SYLLABLE LENGTHENER
@@ -1883,6 +1929,10 @@ FFFC          ; N # So       OBJECT REPLACEMENT CHARACTER
 1E2EC..1E2EF  ; N # Mn   [4] WANCHO TONE TUP..WANCHO TONE KOINI
 1E2F0..1E2F9  ; N # Nd  [10] WANCHO DIGIT ZERO..WANCHO DIGIT NINE
 1E2FF         ; N # Sc       WANCHO NGUN SIGN
+1E4D0..1E4EA  ; N # Lo  [27] NAG MUNDARI LETTER O..NAG MUNDARI LETTER ELL
+1E4EB         ; N # Lm       NAG MUNDARI SIGN OJOD
+1E4EC..1E4EF  ; N # Mn   [4] NAG MUNDARI SIGN MUHOR..NAG MUNDARI SIGN SUTUH
+1E4F0..1E4F9  ; N # Nd  [10] NAG MUNDARI DIGIT ZERO..NAG MUNDARI DIGIT NINE
 1E7E0..1E7E6  ; N # Lo   [7] ETHIOPIC SYLLABLE HHYA..ETHIOPIC SYLLABLE HHYO
 1E7E8..1E7EB  ; N # Lo   [4] ETHIOPIC SYLLABLE GURAGE HHWA..ETHIOPIC SYLLABLE HHWE
 1E7ED..1E7EE  ; N # Lo   [2] ETHIOPIC SYLLABLE GURAGE MWI..ETHIOPIC SYLLABLE GURAGE MWEE
@@ -1973,8 +2023,8 @@ FFFC          ; N # So       OBJECT REPLACEMENT CHARACTER
 1F6D3..1F6D4  ; N # So   [2] STUPA..PAGODA
 1F6E0..1F6EA  ; N # So  [11] HAMMER AND WRENCH..NORTHEAST-POINTING AIRPLANE
 1F6F0..1F6F3  ; N # So   [4] SATELLITE..PASSENGER SHIP
-1F700..1F773  ; N # So [116] ALCHEMICAL SYMBOL FOR QUINTESSENCE..ALCHEMICAL SYMBOL FOR HALF OUNCE
-1F780..1F7D8  ; N # So  [89] BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE..NEGATIVE CIRCLED SQUARE
+1F700..1F776  ; N # So [119] ALCHEMICAL SYMBOL FOR QUINTESSENCE..LUNAR ECLIPSE
+1F77B..1F7D9  ; N # So  [95] HAUMEA..NINE POINTED WHITE STAR
 1F800..1F80B  ; N # So  [12] LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD..DOWNWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD
 1F810..1F847  ; N # So  [56] LEFTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD..DOWNWARDS HEAVY ARROW
 1F850..1F859  ; N # So  [10] LEFTWARDS SANS-SERIF ARROW..UP DOWN SANS-SERIF ARROW
@@ -1992,8 +2042,8 @@ FFFC          ; N # So       OBJECT REPLACEMENT CHARACTER
 E0001         ; N # Cf       LANGUAGE TAG
 E0020..E007F  ; N # Cf  [96] TAG SPACE..CANCEL TAG
 
-# The above property value applies to 766585 code points not listed here.
-# Total code points: 792645
+# The above property value applies to 766289 code points not listed here.
+# Total code points: 792623
 
 # ================================================
 
@@ -2343,9 +2393,7 @@ A490..A4C6    ; W # So  [55] YI RADICAL QOT..YI RADICAL KE
 A960..A97C    ; W # Lo  [29] HANGUL CHOSEONG TIKEUT-MIEUM..HANGUL CHOSEONG SSANGYEORINHIEUH
 AC00..D7A3    ; W # Lo [11172] HANGUL SYLLABLE GA..HANGUL SYLLABLE HIH
 F900..FA6D    ; W # Lo [366] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA6D
-FA6E..FA6F    ; W # Cn   [2] <reserved-FA6E>..<reserved-FA6F>
 FA70..FAD9    ; W # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COMPATIBILITY IDEOGRAPH-FAD9
-FADA..FAFF    ; W # Cn  [38] <reserved-FADA>..<reserved-FAFF>
 FE10..FE16    ; W # Po   [7] PRESENTATION FORM FOR VERTICAL COMMA..PRESENTATION FORM FOR VERTICAL QUESTION MARK
 FE17          ; W # Ps       PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET
 FE18          ; W # Pe       PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET
@@ -2402,7 +2450,9 @@ FE6A..FE6B    ; W # Po   [2] SMALL PERCENT SIGN..SMALL COMMERCIAL AT
 1AFF5..1AFFB  ; W # Lm   [7] KATAKANA LETTER MINNAN TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-5
 1AFFD..1AFFE  ; W # Lm   [2] KATAKANA LETTER MINNAN NASALIZED TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-8
 1B000..1B122  ; W # Lo [291] KATAKANA LETTER ARCHAIC E..KATAKANA LETTER ARCHAIC WU
+1B132         ; W # Lo       HIRAGANA LETTER SMALL KO
 1B150..1B152  ; W # Lo   [3] HIRAGANA LETTER SMALL WI..HIRAGANA LETTER SMALL WO
+1B155         ; W # Lo       KATAKANA LETTER SMALL KO
 1B164..1B167  ; W # Lo   [4] KATAKANA LETTER SMALL WI..KATAKANA LETTER SMALL N
 1B170..1B2FB  ; W # Lo [396] NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB
 1F004         ; W # So       MAHJONG TILE RED DRAGON
@@ -2438,7 +2488,7 @@ FE6A..FE6B    ; W # Po   [2] SMALL PERCENT SIGN..SMALL COMMERCIAL AT
 1F6CC         ; W # So       SLEEPING ACCOMMODATION
 1F6D0..1F6D2  ; W # So   [3] PLACE OF WORSHIP..SHOPPING TROLLEY
 1F6D5..1F6D7  ; W # So   [3] HINDU TEMPLE..ELEVATOR
-1F6DD..1F6DF  ; W # So   [3] PLAYGROUND SLIDE..RING BUOY
+1F6DC..1F6DF  ; W # So   [4] WIRELESS..RING BUOY
 1F6EB..1F6EC  ; W # So   [2] AIRPLANE DEPARTURE..AIRPLANE ARRIVING
 1F6F4..1F6FC  ; W # So   [9] SCOOTER..ROLLER SKATE
 1F7E0..1F7EB  ; W # So  [12] LARGE ORANGE CIRCLE..LARGE BROWN SQUARE
@@ -2446,31 +2496,24 @@ FE6A..FE6B    ; W # Po   [2] SMALL PERCENT SIGN..SMALL COMMERCIAL AT
 1F90C..1F93A  ; W # So  [47] PINCHED FINGERS..FENCER
 1F93C..1F945  ; W # So  [10] WRESTLERS..GOAL NET
 1F947..1F9FF  ; W # So [185] FIRST PLACE MEDAL..NAZAR AMULET
-1FA70..1FA74  ; W # So   [5] BALLET SHOES..THONG SANDAL
-1FA78..1FA7C  ; W # So   [5] DROP OF BLOOD..CRUTCH
-1FA80..1FA86  ; W # So   [7] YO-YO..NESTING DOLLS
-1FA90..1FAAC  ; W # So  [29] RINGED PLANET..HAMSA
-1FAB0..1FABA  ; W # So  [11] FLY..NEST WITH EGGS
-1FAC0..1FAC5  ; W # So   [6] ANATOMICAL HEART..PERSON WITH CROWN
-1FAD0..1FAD9  ; W # So  [10] BLUEBERRIES..JAR
-1FAE0..1FAE7  ; W # So   [8] MELTING FACE..BUBBLES
-1FAF0..1FAF6  ; W # So   [7] HAND WITH INDEX FINGER AND THUMB CROSSED..HEART HANDS
+1FA70..1FA7C  ; W # So  [13] BALLET SHOES..CRUTCH
+1FA80..1FA88  ; W # So   [9] YO-YO..FLUTE
+1FA90..1FABD  ; W # So  [46] RINGED PLANET..WING
+1FABF..1FAC5  ; W # So   [7] GOOSE..PERSON WITH CROWN
+1FACE..1FADB  ; W # So  [14] MOOSE..PEA POD
+1FAE0..1FAE8  ; W # So   [9] MELTING FACE..SHAKING FACE
+1FAF0..1FAF8  ; W # So   [9] HAND WITH INDEX FINGER AND THUMB CROSSED..RIGHTWARDS PUSHING HAND
 20000..2A6DF  ; W # Lo [42720] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6DF
-2A6E0..2A6FF  ; W # Cn  [32] <reserved-2A6E0>..<reserved-2A6FF>
-2A700..2B738  ; W # Lo [4153] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B738
-2B739..2B73F  ; W # Cn   [7] <reserved-2B739>..<reserved-2B73F>
+2A700..2B739  ; W # Lo [4154] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B739
 2B740..2B81D  ; W # Lo [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D
-2B81E..2B81F  ; W # Cn   [2] <reserved-2B81E>..<reserved-2B81F>
 2B820..2CEA1  ; W # Lo [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1
-2CEA2..2CEAF  ; W # Cn  [14] <reserved-2CEA2>..<reserved-2CEAF>
 2CEB0..2EBE0  ; W # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0
-2EBE1..2F7FF  ; W # Cn [3103] <reserved-2EBE1>..<reserved-2F7FF>
 2F800..2FA1D  ; W # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D
-2FA1E..2FFFD  ; W # Cn [1504] <reserved-2FA1E>..<reserved-2FFFD>
 30000..3134A  ; W # Lo [4939] CJK UNIFIED IDEOGRAPH-30000..CJK UNIFIED IDEOGRAPH-3134A
-3134B..3FFFD  ; W # Cn [60595] <reserved-3134B>..<reserved-3FFFD>
+31350..323AF  ; W # Lo [4192] CJK UNIFIED IDEOGRAPH-31350..CJK UNIFIED IDEOGRAPH-323AF
 
-# Total code points: 182390
+# The above property value applies to 61104 code points not listed here.
+# Total code points: 182412
 
 # ================================================
 
index a36d42a..c6013ef 100644 (file)
@@ -1,11 +1,11 @@
-# DerivedGeneralCategory-14.0.0.txt
-# Date: 2021-07-10, 00:35:08 GMT
-# © 2021 Unicode®, Inc.
+# DerivedGeneralCategory-15.0.0.txt
+# Date: 2022-04-26, 23:14:35 GMT
+# © 2022 Unicode®, Inc.
 # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
-# For terms of use, see http://www.unicode.org/terms_of_use.html
+# For terms of use, see https://www.unicode.org/terms_of_use.html
 #
 # Unicode Character Database
-#   For documentation, see http://www.unicode.org/reports/tr44/
+#   For documentation, see https://www.unicode.org/reports/tr44/
 
 # ================================================
 
 0CDF          ; Cn #       <reserved-0CDF>
 0CE4..0CE5    ; Cn #   [2] <reserved-0CE4>..<reserved-0CE5>
 0CF0          ; Cn #       <reserved-0CF0>
-0CF3..0CFF    ; Cn #  [13] <reserved-0CF3>..<reserved-0CFF>
+0CF4..0CFF    ; Cn #  [12] <reserved-0CF4>..<reserved-0CFF>
 0D0D          ; Cn #       <reserved-0D0D>
 0D11          ; Cn #       <reserved-0D11>
 0D45          ; Cn #       <reserved-0D45>
 0EBE..0EBF    ; Cn #   [2] <reserved-0EBE>..<reserved-0EBF>
 0EC5          ; Cn #       <reserved-0EC5>
 0EC7          ; Cn #       <reserved-0EC7>
-0ECE..0ECF    ; Cn #   [2] <reserved-0ECE>..<reserved-0ECF>
+0ECF          ; Cn #       <reserved-0ECF>
 0EDA..0EDB    ; Cn #   [2] <reserved-0EDA>..<reserved-0EDB>
 0EE0..0EFF    ; Cn #  [32] <reserved-0EE0>..<reserved-0EFF>
 0F48          ; Cn #       <reserved-0F48>
@@ -436,7 +436,7 @@ FFFE..FFFF    ; Cn #   [2] <noncharacter-FFFE>..<noncharacter-FFFF>
 10E7F         ; Cn #       <reserved-10E7F>
 10EAA         ; Cn #       <reserved-10EAA>
 10EAE..10EAF  ; Cn #   [2] <reserved-10EAE>..<reserved-10EAF>
-10EB2..10EFF  ; Cn #  [78] <reserved-10EB2>..<reserved-10EFF>
+10EB2..10EFC  ; Cn #  [75] <reserved-10EB2>..<reserved-10EFC>
 10F28..10F2F  ; Cn #   [8] <reserved-10F28>..<reserved-10F2F>
 10F5A..10F6F  ; Cn #  [22] <reserved-10F5A>..<reserved-10F6F>
 10F8A..10FAF  ; Cn #  [38] <reserved-10F8A>..<reserved-10FAF>
@@ -454,7 +454,7 @@ FFFE..FFFF    ; Cn #   [2] <noncharacter-FFFE>..<noncharacter-FFFF>
 111E0         ; Cn #       <reserved-111E0>
 111F5..111FF  ; Cn #  [11] <reserved-111F5>..<reserved-111FF>
 11212         ; Cn #       <reserved-11212>
-1123F..1127F  ; Cn #  [65] <reserved-1123F>..<reserved-1127F>
+11242..1127F  ; Cn #  [62] <reserved-11242>..<reserved-1127F>
 11287         ; Cn #       <reserved-11287>
 11289         ; Cn #       <reserved-11289>
 1128E         ; Cn #       <reserved-1128E>
@@ -506,7 +506,8 @@ FFFE..FFFF    ; Cn #   [2] <noncharacter-FFFE>..<noncharacter-FFFF>
 119E5..119FF  ; Cn #  [27] <reserved-119E5>..<reserved-119FF>
 11A48..11A4F  ; Cn #   [8] <reserved-11A48>..<reserved-11A4F>
 11AA3..11AAF  ; Cn #  [13] <reserved-11AA3>..<reserved-11AAF>
-11AF9..11BFF  ; Cn # [263] <reserved-11AF9>..<reserved-11BFF>
+11AF9..11AFF  ; Cn #   [7] <reserved-11AF9>..<reserved-11AFF>
+11B0A..11BFF  ; Cn # [246] <reserved-11B0A>..<reserved-11BFF>
 11C09         ; Cn #       <reserved-11C09>
 11C37         ; Cn #       <reserved-11C37>
 11C46..11C4F  ; Cn #  [10] <reserved-11C46>..<reserved-11C4F>
@@ -527,7 +528,10 @@ FFFE..FFFF    ; Cn #   [2] <noncharacter-FFFE>..<noncharacter-FFFF>
 11D92         ; Cn #       <reserved-11D92>
 11D99..11D9F  ; Cn #   [7] <reserved-11D99>..<reserved-11D9F>
 11DAA..11EDF  ; Cn # [310] <reserved-11DAA>..<reserved-11EDF>
-11EF9..11FAF  ; Cn # [183] <reserved-11EF9>..<reserved-11FAF>
+11EF9..11EFF  ; Cn #   [7] <reserved-11EF9>..<reserved-11EFF>
+11F11         ; Cn #       <reserved-11F11>
+11F3B..11F3D  ; Cn #   [3] <reserved-11F3B>..<reserved-11F3D>
+11F5A..11FAF  ; Cn #  [86] <reserved-11F5A>..<reserved-11FAF>
 11FB1..11FBF  ; Cn #  [15] <reserved-11FB1>..<reserved-11FBF>
 11FF2..11FFE  ; Cn #  [13] <reserved-11FF2>..<reserved-11FFE>
 1239A..123FF  ; Cn # [102] <reserved-1239A>..<reserved-123FF>
@@ -535,8 +539,7 @@ FFFE..FFFF    ; Cn #   [2] <noncharacter-FFFE>..<noncharacter-FFFF>
 12475..1247F  ; Cn #  [11] <reserved-12475>..<reserved-1247F>
 12544..12F8F  ; Cn # [2636] <reserved-12544>..<reserved-12F8F>
 12FF3..12FFF  ; Cn #  [13] <reserved-12FF3>..<reserved-12FFF>
-1342F         ; Cn #       <reserved-1342F>
-13439..143FF  ; Cn # [4039] <reserved-13439>..<reserved-143FF>
+13456..143FF  ; Cn # [4010] <reserved-13456>..<reserved-143FF>
 14647..167FF  ; Cn # [8633] <reserved-14647>..<reserved-167FF>
 16A39..16A3F  ; Cn #   [7] <reserved-16A39>..<reserved-16A3F>
 16A5F         ; Cn #       <reserved-16A5F>
@@ -562,8 +565,10 @@ FFFE..FFFF    ; Cn #   [2] <noncharacter-FFFE>..<noncharacter-FFFF>
 1AFF4         ; Cn #       <reserved-1AFF4>
 1AFFC         ; Cn #       <reserved-1AFFC>
 1AFFF         ; Cn #       <reserved-1AFFF>
-1B123..1B14F  ; Cn #  [45] <reserved-1B123>..<reserved-1B14F>
-1B153..1B163  ; Cn #  [17] <reserved-1B153>..<reserved-1B163>
+1B123..1B131  ; Cn #  [15] <reserved-1B123>..<reserved-1B131>
+1B133..1B14F  ; Cn #  [29] <reserved-1B133>..<reserved-1B14F>
+1B153..1B154  ; Cn #   [2] <reserved-1B153>..<reserved-1B154>
+1B156..1B163  ; Cn #  [14] <reserved-1B156>..<reserved-1B163>
 1B168..1B16F  ; Cn #   [8] <reserved-1B168>..<reserved-1B16F>
 1B2FC..1BBFF  ; Cn # [2308] <reserved-1B2FC>..<reserved-1BBFF>
 1BC6B..1BC6F  ; Cn #   [5] <reserved-1BC6B>..<reserved-1BC6F>
@@ -577,7 +582,8 @@ FFFE..FFFF    ; Cn #   [2] <noncharacter-FFFE>..<noncharacter-FFFF>
 1D0F6..1D0FF  ; Cn #  [10] <reserved-1D0F6>..<reserved-1D0FF>
 1D127..1D128  ; Cn #   [2] <reserved-1D127>..<reserved-1D128>
 1D1EB..1D1FF  ; Cn #  [21] <reserved-1D1EB>..<reserved-1D1FF>
-1D246..1D2DF  ; Cn # [154] <reserved-1D246>..<reserved-1D2DF>
+1D246..1D2BF  ; Cn # [122] <reserved-1D246>..<reserved-1D2BF>
+1D2D4..1D2DF  ; Cn #  [12] <reserved-1D2D4>..<reserved-1D2DF>
 1D2F4..1D2FF  ; Cn #  [12] <reserved-1D2F4>..<reserved-1D2FF>
 1D357..1D35F  ; Cn #   [9] <reserved-1D357>..<reserved-1D35F>
 1D379..1D3FF  ; Cn # [135] <reserved-1D379>..<reserved-1D3FF>
@@ -604,19 +610,23 @@ FFFE..FFFF    ; Cn #   [2] <noncharacter-FFFE>..<noncharacter-FFFF>
 1DA8C..1DA9A  ; Cn #  [15] <reserved-1DA8C>..<reserved-1DA9A>
 1DAA0         ; Cn #       <reserved-1DAA0>
 1DAB0..1DEFF  ; Cn # [1104] <reserved-1DAB0>..<reserved-1DEFF>
-1DF1F..1DFFF  ; Cn # [225] <reserved-1DF1F>..<reserved-1DFFF>
+1DF1F..1DF24  ; Cn #   [6] <reserved-1DF1F>..<reserved-1DF24>
+1DF2B..1DFFF  ; Cn # [213] <reserved-1DF2B>..<reserved-1DFFF>
 1E007         ; Cn #       <reserved-1E007>
 1E019..1E01A  ; Cn #   [2] <reserved-1E019>..<reserved-1E01A>
 1E022         ; Cn #       <reserved-1E022>
 1E025         ; Cn #       <reserved-1E025>
-1E02B..1E0FF  ; Cn # [213] <reserved-1E02B>..<reserved-1E0FF>
+1E02B..1E02F  ; Cn #   [5] <reserved-1E02B>..<reserved-1E02F>
+1E06E..1E08E  ; Cn #  [33] <reserved-1E06E>..<reserved-1E08E>
+1E090..1E0FF  ; Cn # [112] <reserved-1E090>..<reserved-1E0FF>
 1E12D..1E12F  ; Cn #   [3] <reserved-1E12D>..<reserved-1E12F>
 1E13E..1E13F  ; Cn #   [2] <reserved-1E13E>..<reserved-1E13F>
 1E14A..1E14D  ; Cn #   [4] <reserved-1E14A>..<reserved-1E14D>
 1E150..1E28F  ; Cn # [320] <reserved-1E150>..<reserved-1E28F>
 1E2AF..1E2BF  ; Cn #  [17] <reserved-1E2AF>..<reserved-1E2BF>
 1E2FA..1E2FE  ; Cn #   [5] <reserved-1E2FA>..<reserved-1E2FE>
-1E300..1E7DF  ; Cn # [1248] <reserved-1E300>..<reserved-1E7DF>
+1E300..1E4CF  ; Cn # [464] <reserved-1E300>..<reserved-1E4CF>
+1E4FA..1E7DF  ; Cn # [742] <reserved-1E4FA>..<reserved-1E7DF>
 1E7E7         ; Cn #       <reserved-1E7E7>
 1E7EC         ; Cn #       <reserved-1E7EC>
 1E7EF         ; Cn #       <reserved-1E7EF>
@@ -674,11 +684,11 @@ FFFE..FFFF    ; Cn #   [2] <noncharacter-FFFE>..<noncharacter-FFFF>
 1F249..1F24F  ; Cn #   [7] <reserved-1F249>..<reserved-1F24F>
 1F252..1F25F  ; Cn #  [14] <reserved-1F252>..<reserved-1F25F>
 1F266..1F2FF  ; Cn # [154] <reserved-1F266>..<reserved-1F2FF>
-1F6D8..1F6DC  ; Cn #   [5] <reserved-1F6D8>..<reserved-1F6DC>
+1F6D8..1F6DB  ; Cn #   [4] <reserved-1F6D8>..<reserved-1F6DB>
 1F6ED..1F6EF  ; Cn #   [3] <reserved-1F6ED>..<reserved-1F6EF>
 1F6FD..1F6FF  ; Cn #   [3] <reserved-1F6FD>..<reserved-1F6FF>
-1F774..1F77F  ; Cn #  [12] <reserved-1F774>..<reserved-1F77F>
-1F7D9..1F7DF  ; Cn #   [7] <reserved-1F7D9>..<reserved-1F7DF>
+1F777..1F77A  ; Cn #   [4] <reserved-1F777>..<reserved-1F77A>
+1F7DA..1F7DF  ; Cn #   [6] <reserved-1F7DA>..<reserved-1F7DF>
 1F7EC..1F7EF  ; Cn #   [4] <reserved-1F7EC>..<reserved-1F7EF>
 1F7F1..1F7FF  ; Cn #  [15] <reserved-1F7F1>..<reserved-1F7FF>
 1F80C..1F80F  ; Cn #   [4] <reserved-1F80C>..<reserved-1F80F>
@@ -689,32 +699,31 @@ FFFE..FFFF    ; Cn #   [2] <noncharacter-FFFE>..<noncharacter-FFFF>
 1F8B2..1F8FF  ; Cn #  [78] <reserved-1F8B2>..<reserved-1F8FF>
 1FA54..1FA5F  ; Cn #  [12] <reserved-1FA54>..<reserved-1FA5F>
 1FA6E..1FA6F  ; Cn #   [2] <reserved-1FA6E>..<reserved-1FA6F>
-1FA75..1FA77  ; Cn #   [3] <reserved-1FA75>..<reserved-1FA77>
 1FA7D..1FA7F  ; Cn #   [3] <reserved-1FA7D>..<reserved-1FA7F>
-1FA87..1FA8F  ; Cn #   [9] <reserved-1FA87>..<reserved-1FA8F>
-1FAAD..1FAAF  ; Cn #   [3] <reserved-1FAAD>..<reserved-1FAAF>
-1FABB..1FABF  ; Cn #   [5] <reserved-1FABB>..<reserved-1FABF>
-1FAC6..1FACF  ; Cn #  [10] <reserved-1FAC6>..<reserved-1FACF>
-1FADA..1FADF  ; Cn #   [6] <reserved-1FADA>..<reserved-1FADF>
-1FAE8..1FAEF  ; Cn #   [8] <reserved-1FAE8>..<reserved-1FAEF>
-1FAF7..1FAFF  ; Cn #   [9] <reserved-1FAF7>..<reserved-1FAFF>
+1FA89..1FA8F  ; Cn #   [7] <reserved-1FA89>..<reserved-1FA8F>
+1FABE         ; Cn #       <reserved-1FABE>
+1FAC6..1FACD  ; Cn #   [8] <reserved-1FAC6>..<reserved-1FACD>
+1FADC..1FADF  ; Cn #   [4] <reserved-1FADC>..<reserved-1FADF>
+1FAE9..1FAEF  ; Cn #   [7] <reserved-1FAE9>..<reserved-1FAEF>
+1FAF9..1FAFF  ; Cn #   [7] <reserved-1FAF9>..<reserved-1FAFF>
 1FB93         ; Cn #       <reserved-1FB93>
 1FBCB..1FBEF  ; Cn #  [37] <reserved-1FBCB>..<reserved-1FBEF>
 1FBFA..1FFFF  ; Cn # [1030] <reserved-1FBFA>..<noncharacter-1FFFF>
 2A6E0..2A6FF  ; Cn #  [32] <reserved-2A6E0>..<reserved-2A6FF>
-2B739..2B73F  ; Cn #   [7] <reserved-2B739>..<reserved-2B73F>
+2B73A..2B73F  ; Cn #   [6] <reserved-2B73A>..<reserved-2B73F>
 2B81E..2B81F  ; Cn #   [2] <reserved-2B81E>..<reserved-2B81F>
 2CEA2..2CEAF  ; Cn #  [14] <reserved-2CEA2>..<reserved-2CEAF>
 2EBE1..2F7FF  ; Cn # [3103] <reserved-2EBE1>..<reserved-2F7FF>
 2FA1E..2FFFF  ; Cn # [1506] <reserved-2FA1E>..<noncharacter-2FFFF>
-3134B..E0000  ; Cn # [715958] <reserved-3134B>..<reserved-E0000>
+3134B..3134F  ; Cn #   [5] <reserved-3134B>..<reserved-3134F>
+323B0..E0000  ; Cn # [711761] <reserved-323B0>..<reserved-E0000>
 E0002..E001F  ; Cn #  [30] <reserved-E0002>..<reserved-E001F>
 E0080..E00FF  ; Cn # [128] <reserved-E0080>..<reserved-E00FF>
 E01F0..EFFFF  ; Cn # [65040] <reserved-E01F0>..<noncharacter-EFFFF>
 FFFFE..FFFFF  ; Cn #   [2] <noncharacter-FFFFE>..<noncharacter-FFFFF>
 10FFFE..10FFFF; Cn #   [2] <noncharacter-10FFFE>..<noncharacter-10FFFF>
 
-# Total code points: 829834
+# Total code points: 825345
 
 # ================================================
 
@@ -2029,9 +2038,10 @@ FF41..FF5A    ; Ll #  [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL
 1D7CB         ; Ll #       MATHEMATICAL BOLD SMALL DIGAMMA
 1DF00..1DF09  ; Ll #  [10] LATIN SMALL LETTER FENG DIGRAPH WITH TRILL..LATIN SMALL LETTER T WITH HOOK AND RETROFLEX HOOK
 1DF0B..1DF1E  ; Ll #  [20] LATIN SMALL LETTER ESH WITH DOUBLE BAR..LATIN SMALL LETTER S WITH CURL
+1DF25..1DF2A  ; Ll #   [6] LATIN SMALL LETTER D WITH MID-HEIGHT LEFT HOOK..LATIN SMALL LETTER T WITH MID-HEIGHT LEFT HOOK
 1E922..1E943  ; Ll #  [34] ADLAM SMALL LETTER ALIF..ADLAM SMALL LETTER SHA
 
-# Total code points: 2227
+# Total code points: 2233
 
 # ================================================
 
@@ -2121,10 +2131,12 @@ FF9E..FF9F    ; Lm #   [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAK
 1AFF0..1AFF3  ; Lm #   [4] KATAKANA LETTER MINNAN TONE-2..KATAKANA LETTER MINNAN TONE-5
 1AFF5..1AFFB  ; Lm #   [7] KATAKANA LETTER MINNAN TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-5
 1AFFD..1AFFE  ; Lm #   [2] KATAKANA LETTER MINNAN NASALIZED TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-8
+1E030..1E06D  ; Lm #  [62] MODIFIER LETTER CYRILLIC SMALL A..MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE
 1E137..1E13D  ; Lm #   [7] NYIAKENG PUACHUE HMONG SIGN FOR PERSON..NYIAKENG PUACHUE HMONG SYLLABLE LENGTHENER
+1E4EB         ; Lm #       NAG MUNDARI SIGN OJOD
 1E94B         ; Lm #       ADLAM NASALIZATION MARK
 
-# Total code points: 334
+# Total code points: 397
 
 # ================================================
 
@@ -2494,6 +2506,7 @@ FFDA..FFDC    ; Lo #   [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER I
 111DC         ; Lo #       SHARADA HEADSTROKE
 11200..11211  ; Lo #  [18] KHOJKI LETTER A..KHOJKI LETTER JJA
 11213..1122B  ; Lo #  [25] KHOJKI LETTER NYA..KHOJKI LETTER LLA
+1123F..11240  ; Lo #   [2] KHOJKI LETTER QA..KHOJKI LETTER SHORT I
 11280..11286  ; Lo #   [7] MULTANI LETTER A..MULTANI LETTER GA
 11288         ; Lo #       MULTANI LETTER GHA
 1128A..1128D  ; Lo #   [4] MULTANI LETTER CA..MULTANI LETTER JJA
@@ -2555,11 +2568,15 @@ FFDA..FFDC    ; Lo #   [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER I
 11D6A..11D89  ; Lo #  [32] GUNJALA GONDI LETTER OO..GUNJALA GONDI LETTER SA
 11D98         ; Lo #       GUNJALA GONDI OM
 11EE0..11EF2  ; Lo #  [19] MAKASAR LETTER KA..MAKASAR ANGKA
+11F02         ; Lo #       KAWI SIGN REPHA
+11F04..11F10  ; Lo #  [13] KAWI LETTER A..KAWI LETTER O
+11F12..11F33  ; Lo #  [34] KAWI LETTER KA..KAWI LETTER JNYA
 11FB0         ; Lo #       LISU LETTER YHA
 12000..12399  ; Lo # [922] CUNEIFORM SIGN A..CUNEIFORM SIGN U U
 12480..12543  ; Lo # [196] CUNEIFORM SIGN AB TIMES NUN TENU..CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU
 12F90..12FF0  ; Lo #  [97] CYPRO-MINOAN SIGN CM001..CYPRO-MINOAN SIGN CM114
-13000..1342E  ; Lo # [1071] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH AA032
+13000..1342F  ; Lo # [1072] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH V011D
+13441..13446  ; Lo #   [6] EGYPTIAN HIEROGLYPH FULL BLANK..EGYPTIAN HIEROGLYPH WIDE LOST SIGN
 14400..14646  ; Lo # [583] ANATOLIAN HIEROGLYPH A001..ANATOLIAN HIEROGLYPH A530
 16800..16A38  ; Lo # [569] BAMUM LETTER PHASE-A NGKUE MFON..BAMUM LETTER PHASE-F VUEQ
 16A40..16A5E  ; Lo #  [31] MRO LETTER TA..MRO LETTER TEK
@@ -2574,7 +2591,9 @@ FFDA..FFDC    ; Lo #   [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER I
 18800..18CD5  ; Lo # [1238] TANGUT COMPONENT-001..KHITAN SMALL SCRIPT CHARACTER-18CD5
 18D00..18D08  ; Lo #   [9] TANGUT IDEOGRAPH-18D00..TANGUT IDEOGRAPH-18D08
 1B000..1B122  ; Lo # [291] KATAKANA LETTER ARCHAIC E..KATAKANA LETTER ARCHAIC WU
+1B132         ; Lo #       HIRAGANA LETTER SMALL KO
 1B150..1B152  ; Lo #   [3] HIRAGANA LETTER SMALL WI..HIRAGANA LETTER SMALL WO
+1B155         ; Lo #       KATAKANA LETTER SMALL KO
 1B164..1B167  ; Lo #   [4] KATAKANA LETTER SMALL WI..KATAKANA LETTER SMALL N
 1B170..1B2FB  ; Lo # [396] NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB
 1BC00..1BC6A  ; Lo # [107] DUPLOYAN LETTER H..DUPLOYAN LETTER VOCALIC M
@@ -2586,6 +2605,7 @@ FFDA..FFDC    ; Lo #   [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER I
 1E14E         ; Lo #       NYIAKENG PUACHUE HMONG LOGOGRAM NYAJ
 1E290..1E2AD  ; Lo #  [30] TOTO LETTER PA..TOTO LETTER A
 1E2C0..1E2EB  ; Lo #  [44] WANCHO LETTER AA..WANCHO LETTER YIH
+1E4D0..1E4EA  ; Lo #  [27] NAG MUNDARI LETTER O..NAG MUNDARI LETTER ELL
 1E7E0..1E7E6  ; Lo #   [7] ETHIOPIC SYLLABLE HHYA..ETHIOPIC SYLLABLE HHYO
 1E7E8..1E7EB  ; Lo #   [4] ETHIOPIC SYLLABLE GURAGE HHWA..ETHIOPIC SYLLABLE HHWE
 1E7ED..1E7EE  ; Lo #   [2] ETHIOPIC SYLLABLE GURAGE MWI..ETHIOPIC SYLLABLE GURAGE MWEE
@@ -2625,14 +2645,15 @@ FFDA..FFDC    ; Lo #   [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER I
 1EEA5..1EEA9  ; Lo #   [5] ARABIC MATHEMATICAL DOUBLE-STRUCK WAW..ARABIC MATHEMATICAL DOUBLE-STRUCK YEH
 1EEAB..1EEBB  ; Lo #  [17] ARABIC MATHEMATICAL DOUBLE-STRUCK LAM..ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN
 20000..2A6DF  ; Lo # [42720] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6DF
-2A700..2B738  ; Lo # [4153] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B738
+2A700..2B739  ; Lo # [4154] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B739
 2B740..2B81D  ; Lo # [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D
 2B820..2CEA1  ; Lo # [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1
 2CEB0..2EBE0  ; Lo # [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0
 2F800..2FA1D  ; Lo # [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D
 30000..3134A  ; Lo # [4939] CJK UNIFIED IDEOGRAPH-30000..CJK UNIFIED IDEOGRAPH-3134A
+31350..323AF  ; Lo # [4192] CJK UNIFIED IDEOGRAPH-31350..CJK UNIFIED IDEOGRAPH-323AF
 
-# Total code points: 127333
+# Total code points: 131612
 
 # ================================================
 
@@ -2730,7 +2751,7 @@ FFDA..FFDC    ; Lo #   [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER I
 0E47..0E4E    ; Mn #   [8] THAI CHARACTER MAITAIKHU..THAI CHARACTER YAMAKKAN
 0EB1          ; Mn #       LAO VOWEL SIGN MAI KAN
 0EB4..0EBC    ; Mn #   [9] LAO VOWEL SIGN I..LAO SEMIVOWEL SIGN LO
-0EC8..0ECD    ; Mn #   [6] LAO TONE MAI EK..LAO NIGGAHITA
+0EC8..0ECE    ; Mn #   [7] LAO TONE MAI EK..LAO YAMAKKAN
 0F18..0F19    ; Mn #   [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS
 0F35          ; Mn #       TIBETAN MARK NGAS BZUNG NYI ZLA
 0F37          ; Mn #       TIBETAN MARK NGAS BZUNG SGOR RTAGS
@@ -2861,6 +2882,7 @@ FE20..FE2F    ; Mn #  [16] COMBINING LIGATURE LEFT HALF..COMBINING CYRILLIC TITL
 10AE5..10AE6  ; Mn #   [2] MANICHAEAN ABBREVIATION MARK ABOVE..MANICHAEAN ABBREVIATION MARK BELOW
 10D24..10D27  ; Mn #   [4] HANIFI ROHINGYA SIGN HARBAHAY..HANIFI ROHINGYA SIGN TASSI
 10EAB..10EAC  ; Mn #   [2] YEZIDI COMBINING HAMZA MARK..YEZIDI COMBINING MADDA MARK
+10EFD..10EFF  ; Mn #   [3] ARABIC SMALL LOW WORD SAKTA..ARABIC SMALL LOW WORD MADDA
 10F46..10F50  ; Mn #  [11] SOGDIAN COMBINING DOT BELOW..SOGDIAN COMBINING STROKE BELOW
 10F82..10F85  ; Mn #   [4] OLD UYGHUR COMBINING DOT ABOVE..OLD UYGHUR COMBINING TWO DOTS BELOW
 11001         ; Mn #       BRAHMI SIGN ANUSVARA
@@ -2883,6 +2905,7 @@ FE20..FE2F    ; Mn #  [16] COMBINING LIGATURE LEFT HALF..COMBINING CYRILLIC TITL
 11234         ; Mn #       KHOJKI SIGN ANUSVARA
 11236..11237  ; Mn #   [2] KHOJKI SIGN NUKTA..KHOJKI SIGN SHADDA
 1123E         ; Mn #       KHOJKI SIGN SUKUN
+11241         ; Mn #       KHOJKI VOWEL SIGN VOCALIC R
 112DF         ; Mn #       KHUDAWADI SIGN ANUSVARA
 112E3..112EA  ; Mn #   [8] KHUDAWADI VOWEL SIGN U..KHUDAWADI SIGN VIRAMA
 11300..11301  ; Mn #   [2] GRANTHA SIGN COMBINING ANUSVARA ABOVE..GRANTHA SIGN CANDRABINDU
@@ -2944,6 +2967,12 @@ FE20..FE2F    ; Mn #  [16] COMBINING LIGATURE LEFT HALF..COMBINING CYRILLIC TITL
 11D95         ; Mn #       GUNJALA GONDI SIGN ANUSVARA
 11D97         ; Mn #       GUNJALA GONDI VIRAMA
 11EF3..11EF4  ; Mn #   [2] MAKASAR VOWEL SIGN I..MAKASAR VOWEL SIGN U
+11F00..11F01  ; Mn #   [2] KAWI SIGN CANDRABINDU..KAWI SIGN ANUSVARA
+11F36..11F3A  ; Mn #   [5] KAWI VOWEL SIGN I..KAWI VOWEL SIGN VOCALIC R
+11F40         ; Mn #       KAWI VOWEL SIGN EU
+11F42         ; Mn #       KAWI CONJOINER
+13440         ; Mn #       EGYPTIAN HIEROGLYPH MIRROR HORIZONTALLY
+13447..13455  ; Mn #  [15] EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP START..EGYPTIAN HIEROGLYPH MODIFIER DAMAGED
 16AF0..16AF4  ; Mn #   [5] BASSA VAH COMBINING HIGH TONE..BASSA VAH COMBINING HIGH-LOW TONE
 16B30..16B36  ; Mn #   [7] PAHAWH HMONG MARK CIM TUB..PAHAWH HMONG MARK CIM TAUM
 16F4F         ; Mn #       MIAO SIGN CONSONANT MODIFIER BAR
@@ -2968,14 +2997,16 @@ FE20..FE2F    ; Mn #  [16] COMBINING LIGATURE LEFT HALF..COMBINING CYRILLIC TITL
 1E01B..1E021  ; Mn #   [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI
 1E023..1E024  ; Mn #   [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS
 1E026..1E02A  ; Mn #   [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA
+1E08F         ; Mn #       COMBINING CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
 1E130..1E136  ; Mn #   [7] NYIAKENG PUACHUE HMONG TONE-B..NYIAKENG PUACHUE HMONG TONE-D
 1E2AE         ; Mn #       TOTO SIGN RISING TONE
 1E2EC..1E2EF  ; Mn #   [4] WANCHO TONE TUP..WANCHO TONE KOINI
+1E4EC..1E4EF  ; Mn #   [4] NAG MUNDARI SIGN MUHOR..NAG MUNDARI SIGN SUTUH
 1E8D0..1E8D6  ; Mn #   [7] MENDE KIKAKUI COMBINING NUMBER TEENS..MENDE KIKAKUI COMBINING NUMBER MILLIONS
 1E944..1E94A  ; Mn #   [7] ADLAM ALIF LENGTHENER..ADLAM NUKTA
 E0100..E01EF  ; Mn # [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256
 
-# Total code points: 1950
+# Total code points: 1985
 
 # ================================================
 
@@ -3028,6 +3059,7 @@ A670..A672    ; Me #   [3] COMBINING CYRILLIC TEN MILLIONS SIGN..COMBINING CYRIL
 0CC7..0CC8    ; Mc #   [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI
 0CCA..0CCB    ; Mc #   [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO
 0CD5..0CD6    ; Mc #   [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK
+0CF3          ; Mc #       KANNADA SIGN COMBINING ANUSVARA ABOVE RIGHT
 0D02..0D03    ; Mc #   [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA
 0D3E..0D40    ; Mc #   [3] MALAYALAM VOWEL SIGN AA..MALAYALAM VOWEL SIGN II
 0D46..0D48    ; Mc #   [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI
@@ -3166,12 +3198,16 @@ ABEC          ; Mc #       MEETEI MAYEK LUM IYEK
 11D93..11D94  ; Mc #   [2] GUNJALA GONDI VOWEL SIGN OO..GUNJALA GONDI VOWEL SIGN AU
 11D96         ; Mc #       GUNJALA GONDI SIGN VISARGA
 11EF5..11EF6  ; Mc #   [2] MAKASAR VOWEL SIGN E..MAKASAR VOWEL SIGN O
+11F03         ; Mc #       KAWI SIGN VISARGA
+11F34..11F35  ; Mc #   [2] KAWI VOWEL SIGN AA..KAWI VOWEL SIGN ALTERNATE AA
+11F3E..11F3F  ; Mc #   [2] KAWI VOWEL SIGN E..KAWI VOWEL SIGN AI
+11F41         ; Mc #       KAWI SIGN KILLER
 16F51..16F87  ; Mc #  [55] MIAO SIGN ASPIRATION..MIAO VOWEL SIGN UI
 16FF0..16FF1  ; Mc #   [2] VIETNAMESE ALTERNATE READING MARK CA..VIETNAMESE ALTERNATE READING MARK NHAY
 1D165..1D166  ; Mc #   [2] MUSICAL SYMBOL COMBINING STEM..MUSICAL SYMBOL COMBINING SPRECHGESANG STEM
 1D16D..1D172  ; Mc #   [6] MUSICAL SYMBOL COMBINING AUGMENTATION DOT..MUSICAL SYMBOL COMBINING FLAG-5
 
-# Total code points: 445
+# Total code points: 452
 
 # ================================================
 
@@ -3231,16 +3267,18 @@ FF10..FF19    ; Nd #  [10] FULLWIDTH DIGIT ZERO..FULLWIDTH DIGIT NINE
 11C50..11C59  ; Nd #  [10] BHAIKSUKI DIGIT ZERO..BHAIKSUKI DIGIT NINE
 11D50..11D59  ; Nd #  [10] MASARAM GONDI DIGIT ZERO..MASARAM GONDI DIGIT NINE
 11DA0..11DA9  ; Nd #  [10] GUNJALA GONDI DIGIT ZERO..GUNJALA GONDI DIGIT NINE
+11F50..11F59  ; Nd #  [10] KAWI DIGIT ZERO..KAWI DIGIT NINE
 16A60..16A69  ; Nd #  [10] MRO DIGIT ZERO..MRO DIGIT NINE
 16AC0..16AC9  ; Nd #  [10] TANGSA DIGIT ZERO..TANGSA DIGIT NINE
 16B50..16B59  ; Nd #  [10] PAHAWH HMONG DIGIT ZERO..PAHAWH HMONG DIGIT NINE
 1D7CE..1D7FF  ; Nd #  [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE
 1E140..1E149  ; Nd #  [10] NYIAKENG PUACHUE HMONG DIGIT ZERO..NYIAKENG PUACHUE HMONG DIGIT NINE
 1E2F0..1E2F9  ; Nd #  [10] WANCHO DIGIT ZERO..WANCHO DIGIT NINE
+1E4F0..1E4F9  ; Nd #  [10] NAG MUNDARI DIGIT ZERO..NAG MUNDARI DIGIT NINE
 1E950..1E959  ; Nd #  [10] ADLAM DIGIT ZERO..ADLAM DIGIT NINE
 1FBF0..1FBF9  ; Nd #  [10] SEGMENTED DIGIT ZERO..SEGMENTED DIGIT NINE
 
-# Total code points: 660
+# Total code points: 680
 
 # ================================================
 
@@ -3327,6 +3365,7 @@ A830..A835    ; No #   [6] NORTH INDIC FRACTION ONE QUARTER..NORTH INDIC FRACTIO
 11FC0..11FD4  ; No #  [21] TAMIL FRACTION ONE THREE-HUNDRED-AND-TWENTIETH..TAMIL FRACTION DOWNSCALING FACTOR KIIZH
 16B5B..16B61  ; No #   [7] PAHAWH HMONG NUMBER TENS..PAHAWH HMONG NUMBER TRILLIONS
 16E80..16E96  ; No #  [23] MEDEFAIDRIN DIGIT ZERO..MEDEFAIDRIN DIGIT THREE ALTERNATE FORM
+1D2C0..1D2D3  ; No #  [20] KAKTOVIK NUMERAL ZERO..KAKTOVIK NUMERAL NINETEEN
 1D2E0..1D2F3  ; No #  [20] MAYAN NUMERAL ZERO..MAYAN NUMERAL NINETEEN
 1D360..1D378  ; No #  [25] COUNTING ROD UNIT DIGIT ONE..TALLY MARK FIVE
 1E8C7..1E8CF  ; No #   [9] MENDE KIKAKUI DIGIT ONE..MENDE KIKAKUI DIGIT NINE
@@ -3337,7 +3376,7 @@ A830..A835    ; No #   [6] NORTH INDIC FRACTION ONE QUARTER..NORTH INDIC FRACTIO
 1ED2F..1ED3D  ; No #  [15] OTTOMAN SIYAQ ALTERNATE NUMBER TWO..OTTOMAN SIYAQ FRACTION ONE SIXTH
 1F100..1F10C  ; No #  [13] DIGIT ZERO FULL STOP..DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ZERO
 
-# Total code points: 895
+# Total code points: 915
 
 # ================================================
 
@@ -3398,13 +3437,13 @@ FEFF          ; Cf #       ZERO WIDTH NO-BREAK SPACE
 FFF9..FFFB    ; Cf #   [3] INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTATION TERMINATOR
 110BD         ; Cf #       KAITHI NUMBER SIGN
 110CD         ; Cf #       KAITHI NUMBER SIGN ABOVE
-13430..13438  ; Cf #   [9] EGYPTIAN HIEROGLYPH VERTICAL JOINER..EGYPTIAN HIEROGLYPH END SEGMENT
+13430..1343F  ; Cf #  [16] EGYPTIAN HIEROGLYPH VERTICAL JOINER..EGYPTIAN HIEROGLYPH END WALLED ENCLOSURE
 1BCA0..1BCA3  ; Cf #   [4] SHORTHAND FORMAT LETTER OVERLAP..SHORTHAND FORMAT UP STEP
 1D173..1D17A  ; Cf #   [8] MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE
 E0001         ; Cf #       LANGUAGE TAG
 E0020..E007F  ; Cf #  [96] TAG SPACE..CANCEL TAG
 
-# Total code points: 163
+# Total code points: 170
 
 # ================================================
 
@@ -3806,9 +3845,11 @@ FF64..FF65    ; Po #   [2] HALFWIDTH IDEOGRAPHIC COMMA..HALFWIDTH KATAKANA MIDDL
 11A3F..11A46  ; Po #   [8] ZANABAZAR SQUARE INITIAL HEAD MARK..ZANABAZAR SQUARE CLOSING DOUBLE-LINED HEAD MARK
 11A9A..11A9C  ; Po #   [3] SOYOMBO MARK TSHEG..SOYOMBO MARK DOUBLE SHAD
 11A9E..11AA2  ; Po #   [5] SOYOMBO HEAD MARK WITH MOON AND SUN AND TRIPLE FLAME..SOYOMBO TERMINAL MARK-2
+11B00..11B09  ; Po #  [10] DEVANAGARI HEAD MARK..DEVANAGARI SIGN MINDU
 11C41..11C45  ; Po #   [5] BHAIKSUKI DANDA..BHAIKSUKI GAP FILLER-2
 11C70..11C71  ; Po #   [2] MARCHEN HEAD MARK..MARCHEN MARK SHAD
 11EF7..11EF8  ; Po #   [2] MAKASAR PASSIMBANG..MAKASAR END OF SECTION
+11F43..11F4F  ; Po #  [13] KAWI DANDA..KAWI PUNCTUATION CLOSING SPIRAL
 11FFF         ; Po #       TAMIL PUNCTUATION END OF TEXT
 12470..12474  ; Po #   [5] CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER..CUNEIFORM PUNCTUATION SIGN DIAGONAL QUADCOLON
 12FF1..12FF2  ; Po #   [2] CYPRO-MINOAN SIGN CM301..CYPRO-MINOAN SIGN CM302
@@ -3822,7 +3863,7 @@ FF64..FF65    ; Po #   [2] HALFWIDTH IDEOGRAPHIC COMMA..HALFWIDTH KATAKANA MIDDL
 1DA87..1DA8B  ; Po #   [5] SIGNWRITING COMMA..SIGNWRITING PARENTHESIS
 1E95E..1E95F  ; Po #   [2] ADLAM INITIAL EXCLAMATION MARK..ADLAM INITIAL QUESTION MARK
 
-# Total code points: 605
+# Total code points: 628
 
 # ================================================
 
@@ -4126,10 +4167,10 @@ FFFC..FFFD    ; So #   [2] OBJECT REPLACEMENT CHARACTER..REPLACEMENT CHARACTER
 1F260..1F265  ; So #   [6] ROUNDED SYMBOL FOR FU..ROUNDED SYMBOL FOR CAI
 1F300..1F3FA  ; So # [251] CYCLONE..AMPHORA
 1F400..1F6D7  ; So # [728] RAT..ELEVATOR
-1F6DD..1F6EC  ; So #  [16] PLAYGROUND SLIDE..AIRPLANE ARRIVING
+1F6DC..1F6EC  ; So #  [17] WIRELESS..AIRPLANE ARRIVING
 1F6F0..1F6FC  ; So #  [13] SATELLITE..ROLLER SKATE
-1F700..1F773  ; So # [116] ALCHEMICAL SYMBOL FOR QUINTESSENCE..ALCHEMICAL SYMBOL FOR HALF OUNCE
-1F780..1F7D8  ; So #  [89] BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE..NEGATIVE CIRCLED SQUARE
+1F700..1F776  ; So # [119] ALCHEMICAL SYMBOL FOR QUINTESSENCE..LUNAR ECLIPSE
+1F77B..1F7D9  ; So #  [95] HAUMEA..NINE POINTED WHITE STAR
 1F7E0..1F7EB  ; So #  [12] LARGE ORANGE CIRCLE..LARGE BROWN SQUARE
 1F7F0         ; So #       HEAVY EQUALS SIGN
 1F800..1F80B  ; So #  [12] LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD..DOWNWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD
@@ -4140,19 +4181,17 @@ FFFC..FFFD    ; So #   [2] OBJECT REPLACEMENT CHARACTER..REPLACEMENT CHARACTER
 1F8B0..1F8B1  ; So #   [2] ARROW POINTING UPWARDS THEN NORTH WEST..ARROW POINTING RIGHTWARDS THEN CURVING SOUTH WEST
 1F900..1FA53  ; So # [340] CIRCLED CROSS FORMEE WITH FOUR DOTS..BLACK CHESS KNIGHT-BISHOP
 1FA60..1FA6D  ; So #  [14] XIANGQI RED GENERAL..XIANGQI BLACK SOLDIER
-1FA70..1FA74  ; So #   [5] BALLET SHOES..THONG SANDAL
-1FA78..1FA7C  ; So #   [5] DROP OF BLOOD..CRUTCH
-1FA80..1FA86  ; So #   [7] YO-YO..NESTING DOLLS
-1FA90..1FAAC  ; So #  [29] RINGED PLANET..HAMSA
-1FAB0..1FABA  ; So #  [11] FLY..NEST WITH EGGS
-1FAC0..1FAC5  ; So #   [6] ANATOMICAL HEART..PERSON WITH CROWN
-1FAD0..1FAD9  ; So #  [10] BLUEBERRIES..JAR
-1FAE0..1FAE7  ; So #   [8] MELTING FACE..BUBBLES
-1FAF0..1FAF6  ; So #   [7] HAND WITH INDEX FINGER AND THUMB CROSSED..HEART HANDS
+1FA70..1FA7C  ; So #  [13] BALLET SHOES..CRUTCH
+1FA80..1FA88  ; So #   [9] YO-YO..FLUTE
+1FA90..1FABD  ; So #  [46] RINGED PLANET..WING
+1FABF..1FAC5  ; So #   [7] GOOSE..PERSON WITH CROWN
+1FACE..1FADB  ; So #  [14] MOOSE..PEA POD
+1FAE0..1FAE8  ; So #   [9] MELTING FACE..SHAKING FACE
+1FAF0..1FAF8  ; So #   [9] HAND WITH INDEX FINGER AND THUMB CROSSED..RIGHTWARDS PUSHING HAND
 1FB00..1FB92  ; So # [147] BLOCK SEXTANT-1..UPPER HALF INVERSE MEDIUM SHADE AND LOWER HALF BLOCK
 1FB94..1FBCA  ; So #  [55] LEFT HALF INVERSE MEDIUM SHADE AND RIGHT HALF BLOCK..WHITE UP-POINTING CHEVRON
 
-# Total code points: 6605
+# Total code points: 6634
 
 # ================================================
 
index da46dd0..868edf4 100644 (file)
@@ -1,11 +1,11 @@
-# DerivedJoiningGroup-14.0.0.txt
-# Date: 2021-05-11, 21:19:35 GMT
-# © 2021 Unicode®, Inc.
+# DerivedJoiningGroup-15.0.0.txt
+# Date: 2022-02-26, 00:38:32 GMT
+# © 2022 Unicode®, Inc.
 # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
-# For terms of use, see http://www.unicode.org/terms_of_use.html
+# For terms of use, see https://www.unicode.org/terms_of_use.html
 #
 # Unicode Character Database
-#   For documentation, see http://www.unicode.org/reports/tr44/
+#   For documentation, see https://www.unicode.org/reports/tr44/
 
 # ================================================
 
index 7c36d02..62ce8a0 100644 (file)
@@ -1,11 +1,11 @@
-# DerivedJoiningType-14.0.0.txt
-# Date: 2021-05-28, 21:49:06 GMT
-# © 2021 Unicode®, Inc.
+# DerivedJoiningType-15.0.0.txt
+# Date: 2022-04-26, 23:14:36 GMT
+# © 2022 Unicode®, Inc.
 # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
-# For terms of use, see http://www.unicode.org/terms_of_use.html
+# For terms of use, see https://www.unicode.org/terms_of_use.html
 #
 # Unicode Character Database
-#   For documentation, see http://www.unicode.org/reports/tr44/
+#   For documentation, see https://www.unicode.org/reports/tr44/
 
 # ================================================
 
@@ -296,7 +296,7 @@ A872          ; L # Lo       PHAGS-PA SUPERFIXED LETTER RA
 0E47..0E4E    ; T # Mn   [8] THAI CHARACTER MAITAIKHU..THAI CHARACTER YAMAKKAN
 0EB1          ; T # Mn       LAO VOWEL SIGN MAI KAN
 0EB4..0EBC    ; T # Mn   [9] LAO VOWEL SIGN I..LAO SEMIVOWEL SIGN LO
-0EC8..0ECD    ; T # Mn   [6] LAO TONE MAI EK..LAO NIGGAHITA
+0EC8..0ECE    ; T # Mn   [7] LAO TONE MAI EK..LAO YAMAKKAN
 0F18..0F19    ; T # Mn   [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS
 0F35          ; T # Mn       TIBETAN MARK NGAS BZUNG NYI ZLA
 0F37          ; T # Mn       TIBETAN MARK NGAS BZUNG SGOR RTAGS
@@ -438,6 +438,7 @@ FFF9..FFFB    ; T # Cf   [3] INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTATI
 10AE5..10AE6  ; T # Mn   [2] MANICHAEAN ABBREVIATION MARK ABOVE..MANICHAEAN ABBREVIATION MARK BELOW
 10D24..10D27  ; T # Mn   [4] HANIFI ROHINGYA SIGN HARBAHAY..HANIFI ROHINGYA SIGN TASSI
 10EAB..10EAC  ; T # Mn   [2] YEZIDI COMBINING HAMZA MARK..YEZIDI COMBINING MADDA MARK
+10EFD..10EFF  ; T # Mn   [3] ARABIC SMALL LOW WORD SAKTA..ARABIC SMALL LOW WORD MADDA
 10F46..10F50  ; T # Mn  [11] SOGDIAN COMBINING DOT BELOW..SOGDIAN COMBINING STROKE BELOW
 10F82..10F85  ; T # Mn   [4] OLD UYGHUR COMBINING DOT ABOVE..OLD UYGHUR COMBINING TWO DOTS BELOW
 11001         ; T # Mn       BRAHMI SIGN ANUSVARA
@@ -460,6 +461,7 @@ FFF9..FFFB    ; T # Cf   [3] INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTATI
 11234         ; T # Mn       KHOJKI SIGN ANUSVARA
 11236..11237  ; T # Mn   [2] KHOJKI SIGN NUKTA..KHOJKI SIGN SHADDA
 1123E         ; T # Mn       KHOJKI SIGN SUKUN
+11241         ; T # Mn       KHOJKI VOWEL SIGN VOCALIC R
 112DF         ; T # Mn       KHUDAWADI SIGN ANUSVARA
 112E3..112EA  ; T # Mn   [8] KHUDAWADI VOWEL SIGN U..KHUDAWADI SIGN VIRAMA
 11300..11301  ; T # Mn   [2] GRANTHA SIGN COMBINING ANUSVARA ABOVE..GRANTHA SIGN CANDRABINDU
@@ -521,7 +523,13 @@ FFF9..FFFB    ; T # Cf   [3] INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTATI
 11D95         ; T # Mn       GUNJALA GONDI SIGN ANUSVARA
 11D97         ; T # Mn       GUNJALA GONDI VIRAMA
 11EF3..11EF4  ; T # Mn   [2] MAKASAR VOWEL SIGN I..MAKASAR VOWEL SIGN U
-13430..13438  ; T # Cf   [9] EGYPTIAN HIEROGLYPH VERTICAL JOINER..EGYPTIAN HIEROGLYPH END SEGMENT
+11F00..11F01  ; T # Mn   [2] KAWI SIGN CANDRABINDU..KAWI SIGN ANUSVARA
+11F36..11F3A  ; T # Mn   [5] KAWI VOWEL SIGN I..KAWI VOWEL SIGN VOCALIC R
+11F40         ; T # Mn       KAWI VOWEL SIGN EU
+11F42         ; T # Mn       KAWI CONJOINER
+13430..1343F  ; T # Cf  [16] EGYPTIAN HIEROGLYPH VERTICAL JOINER..EGYPTIAN HIEROGLYPH END WALLED ENCLOSURE
+13440         ; T # Mn       EGYPTIAN HIEROGLYPH MIRROR HORIZONTALLY
+13447..13455  ; T # Mn  [15] EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP START..EGYPTIAN HIEROGLYPH MODIFIER DAMAGED
 16AF0..16AF4  ; T # Mn   [5] BASSA VAH COMBINING HIGH TONE..BASSA VAH COMBINING HIGH-LOW TONE
 16B30..16B36  ; T # Mn   [7] PAHAWH HMONG MARK CIM TUB..PAHAWH HMONG MARK CIM TAUM
 16F4F         ; T # Mn       MIAO SIGN CONSONANT MODIFIER BAR
@@ -548,9 +556,11 @@ FFF9..FFFB    ; T # Cf   [3] INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTATI
 1E01B..1E021  ; T # Mn   [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI
 1E023..1E024  ; T # Mn   [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS
 1E026..1E02A  ; T # Mn   [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA
+1E08F         ; T # Mn       COMBINING CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
 1E130..1E136  ; T # Mn   [7] NYIAKENG PUACHUE HMONG TONE-B..NYIAKENG PUACHUE HMONG TONE-D
 1E2AE         ; T # Mn       TOTO SIGN RISING TONE
 1E2EC..1E2EF  ; T # Mn   [4] WANCHO TONE TUP..WANCHO TONE KOINI
+1E4EC..1E4EF  ; T # Mn   [4] NAG MUNDARI SIGN MUHOR..NAG MUNDARI SIGN SUTUH
 1E8D0..1E8D6  ; T # Mn   [7] MENDE KIKAKUI COMBINING NUMBER TEENS..MENDE KIKAKUI COMBINING NUMBER MILLIONS
 1E944..1E94A  ; T # Mn   [7] ADLAM ALIF LENGTHENER..ADLAM NUKTA
 1E94B         ; T # Lm       ADLAM NASALIZATION MARK
@@ -558,6 +568,6 @@ E0001         ; T # Cf       LANGUAGE TAG
 E0020..E007F  ; T # Cf  [96] TAG SPACE..CANCEL TAG
 E0100..E01EF  ; T # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256
 
-# Total code points: 2108
+# Total code points: 2150
 
 # EOF
index 2504c3f..7de7dba 100644 (file)
@@ -1,11 +1,11 @@
-# DerivedLineBreak-14.0.0.txt
-# Date: 2021-07-10, 00:35:09 GMT
-# © 2021 Unicode®, Inc.
+# DerivedLineBreak-15.0.0.txt
+# Date: 2022-08-05, 17:39:33 GMT
+# © 2022 Unicode®, Inc.
 # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
-# For terms of use, see http://www.unicode.org/terms_of_use.html
+# For terms of use, see https://www.unicode.org/terms_of_use.html
 #
 # Unicode Character Database
-#   For documentation, see http://www.unicode.org/reports/tr44/
+#   For documentation, see https://www.unicode.org/reports/tr44/
 
 # ================================================
 
 
 # @missing: 0000..10FFFF; Unknown
 
+# 20A0..20CF Currency_Symbols
+# @missing: 20A0..20CF; Prefix_Numeric
+
+# 3400..4DBF CJK_Unified_Ideographs_Extension_A
+# @missing: 3400..4DBF; Ideographic
+
+# 4E00..9FFF CJK_Unified_Ideographs
+# @missing: 4E00..9FFF; Ideographic
+
+# F900..FAFF CJK_Compatibility_Ideographs
+# @missing: F900..FAFF; Ideographic
+
+# 1F000..1F02F Mahjong_Tiles
+# 1F030..1F09F Domino_Tiles
+# 1F0A0..1F0FF Playing_Cards
+# 1F100..1F1FF Enclosed_Alphanumeric_Supplement
+# 1F200..1F2FF Enclosed_Ideographic_Supplement
+# 1F300..1F5FF Miscellaneous_Symbols_And_Pictographs
+# 1F600..1F64F Emoticons
+# 1F650..1F67F Ornamental_Dingbats
+# 1F680..1F6FF Transport_And_Map_Symbols
+# 1F700..1F77F Alchemical_Symbols
+# 1F780..1F7FF Geometric_Shapes_Extended
+# 1F800..1F8FF Supplemental_Arrows_C
+# 1F900..1F9FF Supplemental_Symbols_And_Pictographs
+# 1FA00..1FA6F Chess_Symbols
+# 1FA70..1FAFF Symbols_And_Pictographs_Extended_A
+# @missing: 1F000..1FAFF; Ideographic
+
+# @missing: 1FC00..1FFFD; Ideographic
+
+# 20000..2A6DF CJK_Unified_Ideographs_Extension_B
+# 2A700..2B73F CJK_Unified_Ideographs_Extension_C
+# 2B740..2B81F CJK_Unified_Ideographs_Extension_D
+# 2B820..2CEAF CJK_Unified_Ideographs_Extension_E
+# 2CEB0..2EBEF CJK_Unified_Ideographs_Extension_F
+# 2F800..2FA1F CJK_Compatibility_Ideographs_Supplement
+# @missing: 20000..2FFFD; Ideographic
+
+# 30000..3134F CJK_Unified_Ideographs_Extension_G
+# 31350..323AF CJK_Unified_Ideographs_Extension_H
+# @missing: 30000..3FFFD; Ideographic
+
 # ================================================
 
 # Line_Break=Unknown
@@ -24,8 +67,8 @@ E000..F8FF    ; XX # Co [6400] <private-use-E000>..<private-use-F8FF>
 F0000..FFFFD  ; XX # Co [65534] <private-use-F0000>..<private-use-FFFFD>
 100000..10FFFD; XX # Co [65534] <private-use-100000>..<private-use-10FFFD>
 
-# The above property value applies to 762997 code points not listed here.
-# Total code points: 900465
+# The above property value applies to 762730 code points not listed here.
+# Total code points: 900198
 
 # ================================================
 
@@ -118,10 +161,12 @@ FF62          ; OP # Ps       HALFWIDTH LEFT CORNER BRACKET
 13288         ; OP # Lo       EGYPTIAN HIEROGLYPH O036C
 13379         ; OP # Lo       EGYPTIAN HIEROGLYPH V011A
 13437         ; OP # Cf       EGYPTIAN HIEROGLYPH BEGIN SEGMENT
+1343C         ; OP # Cf       EGYPTIAN HIEROGLYPH BEGIN ENCLOSURE
+1343E         ; OP # Cf       EGYPTIAN HIEROGLYPH BEGIN WALLED ENCLOSURE
 145CE         ; OP # Lo       ANATOLIAN HIEROGLYPH A410 BEGIN LOGOGRAM MARK
 1E95E..1E95F  ; OP # Po   [2] ADLAM INITIAL EXCLAMATION MARK..ADLAM INITIAL QUESTION MARK
 
-# Total code points: 92
+# Total code points: 94
 
 # ================================================
 
@@ -215,9 +260,11 @@ FF64          ; CL # Po       HALFWIDTH IDEOGRAPHIC COMMA
 13289         ; CL # Lo       EGYPTIAN HIEROGLYPH O036D
 1337A..1337B  ; CL # Lo   [2] EGYPTIAN HIEROGLYPH V011B..EGYPTIAN HIEROGLYPH V011C
 13438         ; CL # Cf       EGYPTIAN HIEROGLYPH END SEGMENT
+1343D         ; CL # Cf       EGYPTIAN HIEROGLYPH END ENCLOSURE
+1343F         ; CL # Cf       EGYPTIAN HIEROGLYPH END WALLED ENCLOSURE
 145CF         ; CL # Lo       ANATOLIAN HIEROGLYPH A410A END LOGOGRAM MARK
 
-# Total code points: 95
+# Total code points: 97
 
 # ================================================
 
@@ -266,13 +313,16 @@ FF64          ; CL # Po       HALFWIDTH IDEOGRAPHIC COMMA
 0F12          ; GL # Po       TIBETAN MARK RGYA GRAM SHAD
 0FD9..0FDA    ; GL # Po   [2] TIBETAN MARK LEADING MCHAN RTAGS..TIBETAN MARK TRAILING MCHAN RTAGS
 180E          ; GL # Cf       MONGOLIAN VOWEL SEPARATOR
+1DCD          ; GL # Mn       COMBINING DOUBLE CIRCUMFLEX ABOVE
+1DFC          ; GL # Mn       COMBINING DOUBLE INVERTED BREVE BELOW
 2007          ; GL # Zs       FIGURE SPACE
 2011          ; GL # Pd       NON-BREAKING HYPHEN
 202F          ; GL # Zs       NARROW NO-BREAK SPACE
 13430..13436  ; GL # Cf   [7] EGYPTIAN HIEROGLYPH VERTICAL JOINER..EGYPTIAN HIEROGLYPH OVERLAY MIDDLE
+13439..1343B  ; GL # Cf   [3] EGYPTIAN HIEROGLYPH INSERT AT MIDDLE..EGYPTIAN HIEROGLYPH INSERT AT BOTTOM
 16FE4         ; GL # Mn       KHITAN SMALL SCRIPT FILLER
 
-# Total code points: 26
+# Total code points: 31
 
 # ================================================
 
@@ -380,7 +430,6 @@ FE13..FE14    ; IS # Po   [2] PRESENTATION FORM FOR VERTICAL COLON..PRESENTATION
 20B7..20BA    ; PR # Sc   [4] SPESMILO SIGN..TURKISH LIRA SIGN
 20BC..20BD    ; PR # Sc   [2] MANAT SIGN..RUBLE SIGN
 20BF          ; PR # Sc       BITCOIN SIGN
-20C1..20CF    ; PR # Cn  [15] <reserved-20C1>..<reserved-20CF>
 2116          ; PR # So       NUMERO SIGN
 2212..2213    ; PR # Sm   [2] MINUS SIGN..MINUS-OR-PLUS SIGN
 FE69          ; PR # Sc       SMALL DOLLAR SIGN
@@ -389,6 +438,7 @@ FFE1          ; PR # Sc       FULLWIDTH POUND SIGN
 FFE5..FFE6    ; PR # Sc   [2] FULLWIDTH YEN SIGN..FULLWIDTH WON SIGN
 1E2FF         ; PR # Sc       WANCHO NGUN SIGN
 
+# The above property value applies to 15 code points not listed here.
 # Total code points: 67
 
 # ================================================
@@ -405,6 +455,7 @@ FFE5..FFE6    ; PR # Sc   [2] FULLWIDTH YEN SIGN..FULLWIDTH WON SIGN
 09F9          ; PO # No       BENGALI CURRENCY DENOMINATOR SIXTEEN
 0D79          ; PO # So       MALAYALAM DATE MARK
 2030..2037    ; PO # Po   [8] PER MILLE SIGN..REVERSED TRIPLE PRIME
+2057          ; PO # Po       QUADRUPLE PRIME
 20A7          ; PO # Sc       PESETA SIGN
 20B6          ; PO # Sc       LIVRE TOURNOIS SIGN
 20BB          ; PO # Sc       NORDIC MARK SIGN
@@ -421,7 +472,7 @@ FFE0          ; PO # Sc       FULLWIDTH CENT SIGN
 1ECAC         ; PO # So       INDIC SIYAQ PLACEHOLDER
 1ECB0         ; PO # Sc       INDIC SIYAQ RUPEE MARK
 
-# Total code points: 37
+# Total code points: 38
 
 # ================================================
 
@@ -481,16 +532,18 @@ ABF0..ABF9    ; NU # Nd  [10] MEETEI MAYEK DIGIT ZERO..MEETEI MAYEK DIGIT NINE
 11C50..11C59  ; NU # Nd  [10] BHAIKSUKI DIGIT ZERO..BHAIKSUKI DIGIT NINE
 11D50..11D59  ; NU # Nd  [10] MASARAM GONDI DIGIT ZERO..MASARAM GONDI DIGIT NINE
 11DA0..11DA9  ; NU # Nd  [10] GUNJALA GONDI DIGIT ZERO..GUNJALA GONDI DIGIT NINE
+11F50..11F59  ; NU # Nd  [10] KAWI DIGIT ZERO..KAWI DIGIT NINE
 16A60..16A69  ; NU # Nd  [10] MRO DIGIT ZERO..MRO DIGIT NINE
 16AC0..16AC9  ; NU # Nd  [10] TANGSA DIGIT ZERO..TANGSA DIGIT NINE
 16B50..16B59  ; NU # Nd  [10] PAHAWH HMONG DIGIT ZERO..PAHAWH HMONG DIGIT NINE
 1D7CE..1D7FF  ; NU # Nd  [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE
 1E140..1E149  ; NU # Nd  [10] NYIAKENG PUACHUE HMONG DIGIT ZERO..NYIAKENG PUACHUE HMONG DIGIT NINE
 1E2F0..1E2F9  ; NU # Nd  [10] WANCHO DIGIT ZERO..WANCHO DIGIT NINE
+1E4F0..1E4F9  ; NU # Nd  [10] NAG MUNDARI DIGIT ZERO..NAG MUNDARI DIGIT NINE
 1E950..1E959  ; NU # Nd  [10] ADLAM DIGIT ZERO..ADLAM DIGIT NINE
 1FBF0..1FBF9  ; NU # Nd  [10] SEGMENTED DIGIT ZERO..SEGMENTED DIGIT NINE
 
-# Total code points: 652
+# Total code points: 672
 
 # ================================================
 
@@ -855,7 +908,6 @@ ABF0..ABF9    ; NU # Nd  [10] MEETEI MAYEK DIGIT ZERO..MEETEI MAYEK DIGIT NINE
 2053          ; AL # Po       SWUNG DASH
 2054          ; AL # Pc       INVERTED UNDERTIE
 2055          ; AL # Po       FLOWER PUNCTUATION MARK
-2057          ; AL # Po       QUADRUPLE PRIME
 205C          ; AL # Po       DOTTED CROSS
 2061..2064    ; AL # Cf   [4] FUNCTION APPLICATION..INVISIBLE PLUS
 2070          ; AL # No       SUPERSCRIPT ZERO
@@ -1300,6 +1352,7 @@ FFED..FFEE    ; AL # So   [2] HALFWIDTH BLACK SQUARE..HALFWIDTH WHITE CIRCLE
 11213..1122B  ; AL # Lo  [25] KHOJKI LETTER NYA..KHOJKI LETTER LLA
 1123A         ; AL # Po       KHOJKI WORD SEPARATOR
 1123D         ; AL # Po       KHOJKI ABBREVIATION SIGN
+1123F..11240  ; AL # Lo   [2] KHOJKI LETTER QA..KHOJKI LETTER SHORT I
 11280..11286  ; AL # Lo   [7] MULTANI LETTER A..MULTANI LETTER GA
 11288         ; AL # Lo       MULTANI LETTER GHA
 1128A..1128D  ; AL # Lo   [4] MULTANI LETTER CA..MULTANI LETTER JJA
@@ -1372,6 +1425,9 @@ FFED..FFEE    ; AL # So   [2] HALFWIDTH BLACK SQUARE..HALFWIDTH WHITE CIRCLE
 11D98         ; AL # Lo       GUNJALA GONDI OM
 11EE0..11EF2  ; AL # Lo  [19] MAKASAR LETTER KA..MAKASAR ANGKA
 11EF7..11EF8  ; AL # Po   [2] MAKASAR PASSIMBANG..MAKASAR END OF SECTION
+11F02         ; AL # Lo       KAWI SIGN REPHA
+11F04..11F10  ; AL # Lo  [13] KAWI LETTER A..KAWI LETTER O
+11F12..11F33  ; AL # Lo  [34] KAWI LETTER KA..KAWI LETTER JNYA
 11FB0         ; AL # Lo       LISU LETTER YHA
 11FC0..11FD4  ; AL # No  [21] TAMIL FRACTION ONE THREE-HUNDRED-AND-TWENTIETH..TAMIL FRACTION DOWNSCALING FACTOR KIIZH
 11FD5..11FDC  ; AL # So   [8] TAMIL SIGN NEL..TAMIL SIGN MUKKURUNI
@@ -1385,7 +1441,8 @@ FFED..FFEE    ; AL # So   [2] HALFWIDTH BLACK SQUARE..HALFWIDTH WHITE CIRCLE
 1325E..13281  ; AL # Lo  [36] EGYPTIAN HIEROGLYPH O007..EGYPTIAN HIEROGLYPH O033
 13283..13285  ; AL # Lo   [3] EGYPTIAN HIEROGLYPH O034..EGYPTIAN HIEROGLYPH O036
 1328A..13378  ; AL # Lo [239] EGYPTIAN HIEROGLYPH O037..EGYPTIAN HIEROGLYPH V011
-1337C..1342E  ; AL # Lo [179] EGYPTIAN HIEROGLYPH V012..EGYPTIAN HIEROGLYPH AA032
+1337C..1342F  ; AL # Lo [180] EGYPTIAN HIEROGLYPH V012..EGYPTIAN HIEROGLYPH V011D
+13441..13446  ; AL # Lo   [6] EGYPTIAN HIEROGLYPH FULL BLANK..EGYPTIAN HIEROGLYPH WIDE LOST SIGN
 14400..145CD  ; AL # Lo [462] ANATOLIAN HIEROGLYPH A001..ANATOLIAN HIEROGLYPH A409
 145D0..14646  ; AL # Lo [119] ANATOLIAN HIEROGLYPH A411..ANATOLIAN HIEROGLYPH A530
 16800..16A38  ; AL # Lo [569] BAMUM LETTER PHASE-A NGKUE MFON..BAMUM LETTER PHASE-F VUEQ
@@ -1425,6 +1482,7 @@ FFED..FFEE    ; AL # So   [2] HALFWIDTH BLACK SQUARE..HALFWIDTH WHITE CIRCLE
 1D1AE..1D1EA  ; AL # So  [61] MUSICAL SYMBOL PEDAL MARK..MUSICAL SYMBOL KORON
 1D200..1D241  ; AL # So  [66] GREEK VOCAL NOTATION SYMBOL-1..GREEK INSTRUMENTAL NOTATION SYMBOL-54
 1D245         ; AL # So       GREEK MUSICAL LEIMMA
+1D2C0..1D2D3  ; AL # No  [20] KAKTOVIK NUMERAL ZERO..KAKTOVIK NUMERAL NINETEEN
 1D2E0..1D2F3  ; AL # No  [20] MAYAN NUMERAL ZERO..MAYAN NUMERAL NINETEEN
 1D300..1D356  ; AL # So  [87] MONOGRAM FOR EARTH..TETRAGRAM FOR FOSTERING
 1D360..1D378  ; AL # No  [25] COUNTING ROD UNIT DIGIT ONE..TALLY MARK FIVE
@@ -1477,12 +1535,16 @@ FFED..FFEE    ; AL # So   [2] HALFWIDTH BLACK SQUARE..HALFWIDTH WHITE CIRCLE
 1DF00..1DF09  ; AL # L&  [10] LATIN SMALL LETTER FENG DIGRAPH WITH TRILL..LATIN SMALL LETTER T WITH HOOK AND RETROFLEX HOOK
 1DF0A         ; AL # Lo       LATIN LETTER RETROFLEX CLICK WITH RETROFLEX HOOK
 1DF0B..1DF1E  ; AL # L&  [20] LATIN SMALL LETTER ESH WITH DOUBLE BAR..LATIN SMALL LETTER S WITH CURL
+1DF25..1DF2A  ; AL # L&   [6] LATIN SMALL LETTER D WITH MID-HEIGHT LEFT HOOK..LATIN SMALL LETTER T WITH MID-HEIGHT LEFT HOOK
+1E030..1E06D  ; AL # Lm  [62] MODIFIER LETTER CYRILLIC SMALL A..MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE
 1E100..1E12C  ; AL # Lo  [45] NYIAKENG PUACHUE HMONG LETTER MA..NYIAKENG PUACHUE HMONG LETTER W
 1E137..1E13D  ; AL # Lm   [7] NYIAKENG PUACHUE HMONG SIGN FOR PERSON..NYIAKENG PUACHUE HMONG SYLLABLE LENGTHENER
 1E14E         ; AL # Lo       NYIAKENG PUACHUE HMONG LOGOGRAM NYAJ
 1E14F         ; AL # So       NYIAKENG PUACHUE HMONG CIRCLED CA
 1E290..1E2AD  ; AL # Lo  [30] TOTO LETTER PA..TOTO LETTER A
 1E2C0..1E2EB  ; AL # Lo  [44] WANCHO LETTER AA..WANCHO LETTER YIH
+1E4D0..1E4EA  ; AL # Lo  [27] NAG MUNDARI LETTER O..NAG MUNDARI LETTER ELL
+1E4EB         ; AL # Lm       NAG MUNDARI SIGN OJOD
 1E7E0..1E7E6  ; AL # Lo   [7] ETHIOPIC SYLLABLE HHYA..ETHIOPIC SYLLABLE HHYO
 1E7E8..1E7EB  ; AL # Lo   [4] ETHIOPIC SYLLABLE GURAGE HHWA..ETHIOPIC SYLLABLE HHWE
 1E7ED..1E7EE  ; AL # Lo   [2] ETHIOPIC SYLLABLE GURAGE MWI..ETHIOPIC SYLLABLE GURAGE MWEE
@@ -1560,7 +1622,7 @@ FFED..FFEE    ; AL # So   [2] HALFWIDTH BLACK SQUARE..HALFWIDTH WHITE CIRCLE
 1FB00..1FB92  ; AL # So [147] BLOCK SEXTANT-1..UPPER HALF INVERSE MEDIUM SHADE AND LOWER HALF BLOCK
 1FB94..1FBCA  ; AL # So  [55] LEFT HALF INVERSE MEDIUM SHADE AND RIGHT HALF BLOCK..WHITE UP-POINTING CHEVRON
 
-# Total code points: 22043
+# Total code points: 22215
 
 # ================================================
 
@@ -1652,9 +1714,7 @@ FFED..FFEE    ; AL # So   [2] HALFWIDTH BLACK SQUARE..HALFWIDTH WHITE CIRCLE
 A016..A48C    ; ID # Lo [1143] YI SYLLABLE BIT..YI SYLLABLE YYR
 A490..A4C6    ; ID # So  [55] YI RADICAL QOT..YI RADICAL KE
 F900..FA6D    ; ID # Lo [366] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA6D
-FA6E..FA6F    ; ID # Cn   [2] <reserved-FA6E>..<reserved-FA6F>
 FA70..FAD9    ; ID # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COMPATIBILITY IDEOGRAPH-FAD9
-FADA..FAFF    ; ID # Cn  [38] <reserved-FADA>..<reserved-FAFF>
 FE30          ; ID # Po       PRESENTATION FORM FOR VERTICAL TWO DOT LEADER
 FE31..FE32    ; ID # Pd   [2] PRESENTATION FORM FOR VERTICAL EM DASH..PRESENTATION FORM FOR VERTICAL EN DASH
 FE33..FE34    ; ID # Pc   [2] PRESENTATION FORM FOR VERTICAL LOW LINE..PRESENTATION FORM FOR VERTICAL WAVY LOW LINE
@@ -1696,37 +1756,26 @@ FFDA..FFDC    ; ID # Lo   [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTE
 FFE2          ; ID # Sm       FULLWIDTH NOT SIGN
 FFE3          ; ID # Sk       FULLWIDTH MACRON
 FFE4          ; ID # So       FULLWIDTH BROKEN BAR
+11F45..11F4F  ; ID # Po  [11] KAWI PUNCTUATION SECTION MARKER..KAWI PUNCTUATION CLOSING SPIRAL
 17000..187F7  ; ID # Lo [6136] TANGUT IDEOGRAPH-17000..TANGUT IDEOGRAPH-187F7
 18800..18AFF  ; ID # Lo [768] TANGUT COMPONENT-001..TANGUT COMPONENT-768
 18D00..18D08  ; ID # Lo   [9] TANGUT IDEOGRAPH-18D00..TANGUT IDEOGRAPH-18D08
 1B000..1B122  ; ID # Lo [291] KATAKANA LETTER ARCHAIC E..KATAKANA LETTER ARCHAIC WU
 1B170..1B2FB  ; ID # Lo [396] NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB
 1F000..1F02B  ; ID # So  [44] MAHJONG TILE EAST WIND..MAHJONG TILE BACK
-1F02C..1F02F  ; ID # Cn   [4] <reserved-1F02C>..<reserved-1F02F>
 1F030..1F093  ; ID # So [100] DOMINO TILE HORIZONTAL BACK..DOMINO TILE VERTICAL-06-06
-1F094..1F09F  ; ID # Cn  [12] <reserved-1F094>..<reserved-1F09F>
 1F0A0..1F0AE  ; ID # So  [15] PLAYING CARD BACK..PLAYING CARD KING OF SPADES
-1F0AF..1F0B0  ; ID # Cn   [2] <reserved-1F0AF>..<reserved-1F0B0>
 1F0B1..1F0BF  ; ID # So  [15] PLAYING CARD ACE OF HEARTS..PLAYING CARD RED JOKER
-1F0C0         ; ID # Cn       <reserved-1F0C0>
 1F0C1..1F0CF  ; ID # So  [15] PLAYING CARD ACE OF DIAMONDS..PLAYING CARD BLACK JOKER
-1F0D0         ; ID # Cn       <reserved-1F0D0>
 1F0D1..1F0F5  ; ID # So  [37] PLAYING CARD ACE OF CLUBS..PLAYING CARD TRUMP-21
-1F0F6..1F0FF  ; ID # Cn  [10] <reserved-1F0F6>..<reserved-1F0FF>
 1F10D..1F10F  ; ID # So   [3] CIRCLED ZERO WITH SLASH..CIRCLED DOLLAR SIGN WITH OVERLAID BACKSLASH
 1F16D..1F16F  ; ID # So   [3] CIRCLED CC..CIRCLED HUMAN FIGURE
 1F1AD         ; ID # So       MASK WORK SYMBOL
-1F1AE..1F1E5  ; ID # Cn  [56] <reserved-1F1AE>..<reserved-1F1E5>
 1F200..1F202  ; ID # So   [3] SQUARE HIRAGANA HOKA..SQUARED KATAKANA SA
-1F203..1F20F  ; ID # Cn  [13] <reserved-1F203>..<reserved-1F20F>
 1F210..1F23B  ; ID # So  [44] SQUARED CJK UNIFIED IDEOGRAPH-624B..SQUARED CJK UNIFIED IDEOGRAPH-914D
-1F23C..1F23F  ; ID # Cn   [4] <reserved-1F23C>..<reserved-1F23F>
 1F240..1F248  ; ID # So   [9] TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-672C..TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557
-1F249..1F24F  ; ID # Cn   [7] <reserved-1F249>..<reserved-1F24F>
 1F250..1F251  ; ID # So   [2] CIRCLED IDEOGRAPH ADVANTAGE..CIRCLED IDEOGRAPH ACCEPT
-1F252..1F25F  ; ID # Cn  [14] <reserved-1F252>..<reserved-1F25F>
 1F260..1F265  ; ID # So   [6] ROUNDED SYMBOL FOR FU..ROUNDED SYMBOL FOR CAI
-1F266..1F2FF  ; ID # Cn [154] <reserved-1F266>..<reserved-1F2FF>
 1F300..1F384  ; ID # So [133] CYCLONE..CHRISTMAS TREE
 1F386..1F39B  ; ID # So  [22] FIREWORKS..CONTROL KNOBS
 1F39E..1F3B4  ; ID # So  [23] FILM FRAMES..FLOWER PLAYING CARDS
@@ -1765,25 +1814,14 @@ FFE4          ; ID # So       FULLWIDTH BROKEN BAR
 1F6B7..1F6BF  ; ID # So   [9] NO PEDESTRIANS..SHOWER
 1F6C1..1F6CB  ; ID # So  [11] BATHTUB..COUCH AND LAMP
 1F6CD..1F6D7  ; ID # So  [11] SHOPPING BAGS..ELEVATOR
-1F6D8..1F6DC  ; ID # Cn   [5] <reserved-1F6D8>..<reserved-1F6DC>
-1F6DD..1F6EC  ; ID # So  [16] PLAYGROUND SLIDE..AIRPLANE ARRIVING
-1F6ED..1F6EF  ; ID # Cn   [3] <reserved-1F6ED>..<reserved-1F6EF>
+1F6DC..1F6EC  ; ID # So  [17] WIRELESS..AIRPLANE ARRIVING
 1F6F0..1F6FC  ; ID # So  [13] SATELLITE..ROLLER SKATE
-1F6FD..1F6FF  ; ID # Cn   [3] <reserved-1F6FD>..<reserved-1F6FF>
-1F774..1F77F  ; ID # Cn  [12] <reserved-1F774>..<reserved-1F77F>
-1F7D5..1F7D8  ; ID # So   [4] CIRCLED TRIANGLE..NEGATIVE CIRCLED SQUARE
-1F7D9..1F7DF  ; ID # Cn   [7] <reserved-1F7D9>..<reserved-1F7DF>
+1F774..1F776  ; ID # So   [3] LOT OF FORTUNE..LUNAR ECLIPSE
+1F77B..1F77F  ; ID # So   [5] HAUMEA..ORCUS
+1F7D5..1F7D9  ; ID # So   [5] CIRCLED TRIANGLE..NINE POINTED WHITE STAR
 1F7E0..1F7EB  ; ID # So  [12] LARGE ORANGE CIRCLE..LARGE BROWN SQUARE
-1F7EC..1F7EF  ; ID # Cn   [4] <reserved-1F7EC>..<reserved-1F7EF>
 1F7F0         ; ID # So       HEAVY EQUALS SIGN
-1F7F1..1F7FF  ; ID # Cn  [15] <reserved-1F7F1>..<reserved-1F7FF>
-1F80C..1F80F  ; ID # Cn   [4] <reserved-1F80C>..<reserved-1F80F>
-1F848..1F84F  ; ID # Cn   [8] <reserved-1F848>..<reserved-1F84F>
-1F85A..1F85F  ; ID # Cn   [6] <reserved-1F85A>..<reserved-1F85F>
-1F888..1F88F  ; ID # Cn   [8] <reserved-1F888>..<reserved-1F88F>
-1F8AE..1F8AF  ; ID # Cn   [2] <reserved-1F8AE>..<reserved-1F8AF>
 1F8B0..1F8B1  ; ID # So   [2] ARROW POINTING UPWARDS THEN NORTH WEST..ARROW POINTING RIGHTWARDS THEN CURVING SOUTH WEST
-1F8B2..1F8FF  ; ID # Cn  [78] <reserved-1F8B2>..<reserved-1F8FF>
 1F90D..1F90E  ; ID # So   [2] WHITE HEART..BROWN HEART
 1F910..1F917  ; ID # So   [8] ZIPPER-MOUTH FACE..HUGGING FACE
 1F920..1F925  ; ID # So   [6] FACE WITH COWBOY HAT..LYING FACE
@@ -1796,43 +1834,24 @@ FFE4          ; ID # So       FULLWIDTH BROKEN BAR
 1F9BC..1F9CC  ; ID # So  [17] MOTORIZED WHEELCHAIR..TROLL
 1F9D0         ; ID # So       FACE WITH MONOCLE
 1F9DE..1F9FF  ; ID # So  [34] GENIE..NAZAR AMULET
-1FA54..1FA5F  ; ID # Cn  [12] <reserved-1FA54>..<reserved-1FA5F>
 1FA60..1FA6D  ; ID # So  [14] XIANGQI RED GENERAL..XIANGQI BLACK SOLDIER
-1FA6E..1FA6F  ; ID # Cn   [2] <reserved-1FA6E>..<reserved-1FA6F>
-1FA70..1FA74  ; ID # So   [5] BALLET SHOES..THONG SANDAL
-1FA75..1FA77  ; ID # Cn   [3] <reserved-1FA75>..<reserved-1FA77>
-1FA78..1FA7C  ; ID # So   [5] DROP OF BLOOD..CRUTCH
-1FA7D..1FA7F  ; ID # Cn   [3] <reserved-1FA7D>..<reserved-1FA7F>
-1FA80..1FA86  ; ID # So   [7] YO-YO..NESTING DOLLS
-1FA87..1FA8F  ; ID # Cn   [9] <reserved-1FA87>..<reserved-1FA8F>
-1FA90..1FAAC  ; ID # So  [29] RINGED PLANET..HAMSA
-1FAAD..1FAAF  ; ID # Cn   [3] <reserved-1FAAD>..<reserved-1FAAF>
-1FAB0..1FABA  ; ID # So  [11] FLY..NEST WITH EGGS
-1FABB..1FABF  ; ID # Cn   [5] <reserved-1FABB>..<reserved-1FABF>
-1FAC0..1FAC2  ; ID # So   [3] ANATOMICAL HEART..PEOPLE HUGGING
-1FAC6..1FACF  ; ID # Cn  [10] <reserved-1FAC6>..<reserved-1FACF>
-1FAD0..1FAD9  ; ID # So  [10] BLUEBERRIES..JAR
-1FADA..1FADF  ; ID # Cn   [6] <reserved-1FADA>..<reserved-1FADF>
-1FAE0..1FAE7  ; ID # So   [8] MELTING FACE..BUBBLES
-1FAE8..1FAEF  ; ID # Cn   [8] <reserved-1FAE8>..<reserved-1FAEF>
-1FAF7..1FAFF  ; ID # Cn   [9] <reserved-1FAF7>..<reserved-1FAFF>
-1FC00..1FFFD  ; ID # Cn [1022] <reserved-1FC00>..<reserved-1FFFD>
+1FA70..1FA7C  ; ID # So  [13] BALLET SHOES..CRUTCH
+1FA80..1FA88  ; ID # So   [9] YO-YO..FLUTE
+1FA90..1FABD  ; ID # So  [46] RINGED PLANET..WING
+1FABF..1FAC2  ; ID # So   [4] GOOSE..PEOPLE HUGGING
+1FACE..1FADB  ; ID # So  [14] MOOSE..PEA POD
+1FAE0..1FAE8  ; ID # So   [9] MELTING FACE..SHAKING FACE
 20000..2A6DF  ; ID # Lo [42720] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6DF
-2A6E0..2A6FF  ; ID # Cn  [32] <reserved-2A6E0>..<reserved-2A6FF>
-2A700..2B738  ; ID # Lo [4153] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B738
-2B739..2B73F  ; ID # Cn   [7] <reserved-2B739>..<reserved-2B73F>
+2A700..2B739  ; ID # Lo [4154] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B739
 2B740..2B81D  ; ID # Lo [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D
-2B81E..2B81F  ; ID # Cn   [2] <reserved-2B81E>..<reserved-2B81F>
 2B820..2CEA1  ; ID # Lo [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1
-2CEA2..2CEAF  ; ID # Cn  [14] <reserved-2CEA2>..<reserved-2CEAF>
 2CEB0..2EBE0  ; ID # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0
-2EBE1..2F7FF  ; ID # Cn [3103] <reserved-2EBE1>..<reserved-2F7FF>
 2F800..2FA1D  ; ID # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D
-2FA1E..2FFFD  ; ID # Cn [1504] <reserved-2FA1E>..<reserved-2FFFD>
 30000..3134A  ; ID # Lo [4939] CJK UNIFIED IDEOGRAPH-30000..CJK UNIFIED IDEOGRAPH-3134A
-3134B..3FFFD  ; ID # Cn [60595] <reserved-3134B>..<reserved-3FFFD>
+31350..323AF  ; ID # Lo [4192] CJK UNIFIED IDEOGRAPH-31350..CJK UNIFIED IDEOGRAPH-323AF
 
-# Total code points: 172456
+# The above property value applies to 62600 code points not listed here.
+# Total code points: 172465
 
 # ================================================
 
@@ -1978,6 +1997,7 @@ FE19          ; IN # Po       PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS
 0CCC..0CCD    ; CM # Mn   [2] KANNADA VOWEL SIGN AU..KANNADA SIGN VIRAMA
 0CD5..0CD6    ; CM # Mc   [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK
 0CE2..0CE3    ; CM # Mn   [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL
+0CF3          ; CM # Mc       KANNADA SIGN COMBINING ANUSVARA ABOVE RIGHT
 0D00..0D01    ; CM # Mn   [2] MALAYALAM SIGN COMBINING ANUSVARA ABOVE..MALAYALAM SIGN CANDRABINDU
 0D02..0D03    ; CM # Mc   [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA
 0D3B..0D3C    ; CM # Mn   [2] MALAYALAM SIGN VERTICAL BAR VIRAMA..MALAYALAM SIGN CIRCULAR VIRAMA
@@ -2072,7 +2092,9 @@ FE19          ; IN # Po       PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS
 1CF4          ; CM # Mn       VEDIC TONE CANDRA ABOVE
 1CF7          ; CM # Mc       VEDIC SIGN ATIKRAMA
 1CF8..1CF9    ; CM # Mn   [2] VEDIC TONE RING ABOVE..VEDIC TONE DOUBLE RING ABOVE
-1DC0..1DFF    ; CM # Mn  [64] COMBINING DOTTED GRAVE ACCENT..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW
+1DC0..1DCC    ; CM # Mn  [13] COMBINING DOTTED GRAVE ACCENT..COMBINING MACRON-BREVE
+1DCE..1DFB    ; CM # Mn  [46] COMBINING OGONEK ABOVE..COMBINING DELETION MARK
+1DFD..1DFF    ; CM # Mn   [3] COMBINING ALMOST EQUAL TO BELOW..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW
 200C          ; CM # Cf       ZERO WIDTH NON-JOINER
 200E..200F    ; CM # Cf   [2] LEFT-TO-RIGHT MARK..RIGHT-TO-LEFT MARK
 202A..202E    ; CM # Cf   [5] LEFT-TO-RIGHT EMBEDDING..RIGHT-TO-LEFT OVERRIDE
@@ -2152,6 +2174,7 @@ FFF9..FFFB    ; CM # Cf   [3] INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTAT
 10AE5..10AE6  ; CM # Mn   [2] MANICHAEAN ABBREVIATION MARK ABOVE..MANICHAEAN ABBREVIATION MARK BELOW
 10D24..10D27  ; CM # Mn   [4] HANIFI ROHINGYA SIGN HARBAHAY..HANIFI ROHINGYA SIGN TASSI
 10EAB..10EAC  ; CM # Mn   [2] YEZIDI COMBINING HAMZA MARK..YEZIDI COMBINING MADDA MARK
+10EFD..10EFF  ; CM # Mn   [3] ARABIC SMALL LOW WORD SAKTA..ARABIC SMALL LOW WORD MADDA
 10F46..10F50  ; CM # Mn  [11] SOGDIAN COMBINING DOT BELOW..SOGDIAN COMBINING STROKE BELOW
 10F82..10F85  ; CM # Mn   [4] OLD UYGHUR COMBINING DOT ABOVE..OLD UYGHUR COMBINING TWO DOTS BELOW
 11000         ; CM # Mc       BRAHMI SIGN CANDRABINDU
@@ -2188,6 +2211,7 @@ FFF9..FFFB    ; CM # Cf   [3] INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTAT
 11235         ; CM # Mc       KHOJKI SIGN VIRAMA
 11236..11237  ; CM # Mn   [2] KHOJKI SIGN NUKTA..KHOJKI SIGN SHADDA
 1123E         ; CM # Mn       KHOJKI SIGN SUKUN
+11241         ; CM # Mn       KHOJKI VOWEL SIGN VOCALIC R
 112DF         ; CM # Mn       KHUDAWADI SIGN ANUSVARA
 112E0..112E2  ; CM # Mc   [3] KHUDAWADI VOWEL SIGN AA..KHUDAWADI VOWEL SIGN II
 112E3..112EA  ; CM # Mn   [8] KHUDAWADI VOWEL SIGN U..KHUDAWADI SIGN VIRAMA
@@ -2292,6 +2316,16 @@ FFF9..FFFB    ; CM # Cf   [3] INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTAT
 11D97         ; CM # Mn       GUNJALA GONDI VIRAMA
 11EF3..11EF4  ; CM # Mn   [2] MAKASAR VOWEL SIGN I..MAKASAR VOWEL SIGN U
 11EF5..11EF6  ; CM # Mc   [2] MAKASAR VOWEL SIGN E..MAKASAR VOWEL SIGN O
+11F00..11F01  ; CM # Mn   [2] KAWI SIGN CANDRABINDU..KAWI SIGN ANUSVARA
+11F03         ; CM # Mc       KAWI SIGN VISARGA
+11F34..11F35  ; CM # Mc   [2] KAWI VOWEL SIGN AA..KAWI VOWEL SIGN ALTERNATE AA
+11F36..11F3A  ; CM # Mn   [5] KAWI VOWEL SIGN I..KAWI VOWEL SIGN VOCALIC R
+11F3E..11F3F  ; CM # Mc   [2] KAWI VOWEL SIGN E..KAWI VOWEL SIGN AI
+11F40         ; CM # Mn       KAWI VOWEL SIGN EU
+11F41         ; CM # Mc       KAWI SIGN KILLER
+11F42         ; CM # Mn       KAWI CONJOINER
+13440         ; CM # Mn       EGYPTIAN HIEROGLYPH MIRROR HORIZONTALLY
+13447..13455  ; CM # Mn  [15] EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP START..EGYPTIAN HIEROGLYPH MODIFIER DAMAGED
 16AF0..16AF4  ; CM # Mn   [5] BASSA VAH COMBINING HIGH TONE..BASSA VAH COMBINING HIGH-LOW TONE
 16B30..16B36  ; CM # Mn   [7] PAHAWH HMONG MARK CIM TUB..PAHAWH HMONG MARK CIM TAUM
 16F4F         ; CM # Mn       MIAO SIGN CONSONANT MODIFIER BAR
@@ -2321,16 +2355,18 @@ FFF9..FFFB    ; CM # Cf   [3] INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTAT
 1E01B..1E021  ; CM # Mn   [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI
 1E023..1E024  ; CM # Mn   [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS
 1E026..1E02A  ; CM # Mn   [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA
+1E08F         ; CM # Mn       COMBINING CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
 1E130..1E136  ; CM # Mn   [7] NYIAKENG PUACHUE HMONG TONE-B..NYIAKENG PUACHUE HMONG TONE-D
 1E2AE         ; CM # Mn       TOTO SIGN RISING TONE
 1E2EC..1E2EF  ; CM # Mn   [4] WANCHO TONE TUP..WANCHO TONE KOINI
+1E4EC..1E4EF  ; CM # Mn   [4] NAG MUNDARI SIGN MUHOR..NAG MUNDARI SIGN SUTUH
 1E8D0..1E8D6  ; CM # Mn   [7] MENDE KIKAKUI COMBINING NUMBER TEENS..MENDE KIKAKUI COMBINING NUMBER MILLIONS
 1E944..1E94A  ; CM # Mn   [7] ADLAM ALIF LENGTHENER..ADLAM NUKTA
 E0001         ; CM # Cf       LANGUAGE TAG
 E0020..E007F  ; CM # Cf  [96] TAG SPACE..CANCEL TAG
 E0100..E01EF  ; CM # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256
 
-# Total code points: 2399
+# Total code points: 2438
 
 # ================================================
 
@@ -2360,9 +2396,10 @@ A8FC          ; BB # Po       DEVANAGARI SIGN SIDDHAM
 11A3F         ; BB # Po       ZANABAZAR SQUARE INITIAL HEAD MARK
 11A45         ; BB # Po       ZANABAZAR SQUARE INITIAL DOUBLE-LINED HEAD MARK
 11A9E..11AA0  ; BB # Po   [3] SOYOMBO HEAD MARK WITH MOON AND SUN AND TRIPLE FLAME..SOYOMBO HEAD MARK WITH MOON AND SUN
+11B00..11B09  ; BB # Po  [10] DEVANAGARI HEAD MARK..DEVANAGARI SIGN MINDU
 11C70         ; BB # Po       MARCHEN HEAD MARK
 
-# Total code points: 45
+# Total code points: 55
 
 # ================================================
 
@@ -2461,6 +2498,7 @@ ABEB          ; BA # Po       MEETEI MAYEK CHEIKHEI
 11A9A..11A9C  ; BA # Po   [3] SOYOMBO MARK TSHEG..SOYOMBO MARK DOUBLE SHAD
 11AA1..11AA2  ; BA # Po   [2] SOYOMBO TERMINAL MARK-1..SOYOMBO TERMINAL MARK-2
 11C41..11C45  ; BA # Po   [5] BHAIKSUKI DANDA..BHAIKSUKI GAP FILLER-2
+11F43..11F44  ; BA # Po   [2] KAWI DANDA..KAWI DOUBLE DANDA
 11FFF         ; BA # Po       TAMIL PUNCTUATION END OF TEXT
 12470..12474  ; BA # Po   [5] CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER..CUNEIFORM PUNCTUATION SIGN DIAGONAL QUADCOLON
 16A6E..16A6F  ; BA # Po   [2] MRO DANDA..MRO DOUBLE DANDA
@@ -2471,7 +2509,7 @@ ABEB          ; BA # Po       MEETEI MAYEK CHEIKHEI
 1BC9F         ; BA # Po       DUPLOYAN PUNCTUATION CHINOOK FULL STOP
 1DA87..1DA8A  ; BA # Po   [4] SIGNWRITING COMMA..SIGNWRITING COLON
 
-# Total code points: 247
+# Total code points: 249
 
 # ================================================
 
@@ -2538,7 +2576,7 @@ FFFC          ; CB # So       OBJECT REPLACEMENT CHARACTER
 0EBD          ; SA # Lo       LAO SEMIVOWEL SIGN NYO
 0EC0..0EC4    ; SA # Lo   [5] LAO VOWEL SIGN E..LAO VOWEL SIGN AI
 0EC6          ; SA # Lm       LAO KO LA
-0EC8..0ECD    ; SA # Mn   [6] LAO TONE MAI EK..LAO NIGGAHITA
+0EC8..0ECE    ; SA # Mn   [7] LAO TONE MAI EK..LAO YAMAKKAN
 0EDC..0EDF    ; SA # Lo   [4] LAO HO NO..LAO LETTER KHMU NYO
 1000..102A    ; SA # Lo  [43] MYANMAR LETTER KA..MYANMAR LETTER AU
 102B..102C    ; SA # Mc   [2] MYANMAR VOWEL SIGN TALL AA..MYANMAR VOWEL SIGN AA
@@ -2641,7 +2679,7 @@ AADE..AADF    ; SA # Po   [2] TAI VIET SYMBOL HO HOI..TAI VIET SYMBOL KOI KOI
 1173F         ; SA # So       AHOM SYMBOL VI
 11740..11746  ; SA # Lo   [7] AHOM LETTER CA..AHOM LETTER LLA
 
-# Total code points: 757
+# Total code points: 758
 
 # ================================================
 
@@ -3706,10 +3744,12 @@ FB46..FB4F    ; HL # Lo  [10] HEBREW LETTER TSADI WITH DAGESH..HEBREW LIGATURE A
 31F0..31FF    ; CJ # Lo  [16] KATAKANA LETTER SMALL KU..KATAKANA LETTER SMALL RO
 FF67..FF6F    ; CJ # Lo   [9] HALFWIDTH KATAKANA LETTER SMALL A..HALFWIDTH KATAKANA LETTER SMALL TU
 FF70          ; CJ # Lm       HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK
+1B132         ; CJ # Lo       HIRAGANA LETTER SMALL KO
 1B150..1B152  ; CJ # Lo   [3] HIRAGANA LETTER SMALL WI..HIRAGANA LETTER SMALL WO
+1B155         ; CJ # Lo       KATAKANA LETTER SMALL KO
 1B164..1B167  ; CJ # Lo   [4] KATAKANA LETTER SMALL WI..KATAKANA LETTER SMALL N
 
-# Total code points: 58
+# Total code points: 60
 
 # ================================================
 
@@ -3762,9 +3802,9 @@ FF70          ; CJ # Lm       HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK
 1F9CD..1F9CF  ; EB # So   [3] STANDING PERSON..DEAF PERSON
 1F9D1..1F9DD  ; EB # So  [13] ADULT..ELF
 1FAC3..1FAC5  ; EB # So   [3] PREGNANT MAN..PERSON WITH CROWN
-1FAF0..1FAF6  ; EB # So   [7] HAND WITH INDEX FINGER AND THUMB CROSSED..HEART HANDS
+1FAF0..1FAF8  ; EB # So   [9] HAND WITH INDEX FINGER AND THUMB CROSSED..RIGHTWARDS PUSHING HAND
 
-# Total code points: 132
+# Total code points: 134
 
 # ================================================
 
index 6d819ea..333d527 100644 (file)
@@ -1,11 +1,11 @@
-# DerivedNumericType-14.0.0.txt
-# Date: 2021-03-08, 06:22:31 GMT
-# © 2021 Unicode®, Inc.
+# DerivedNumericType-15.0.0.txt
+# Date: 2022-02-26, 00:38:36 GMT
+# © 2022 Unicode®, Inc.
 # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
-# For terms of use, see http://www.unicode.org/terms_of_use.html
+# For terms of use, see https://www.unicode.org/terms_of_use.html
 #
 # Unicode Character Database
-#   For documentation, see http://www.unicode.org/reports/tr44/
+#   For documentation, see https://www.unicode.org/reports/tr44/
 
 # ================================================
 
@@ -155,6 +155,7 @@ F9FD          ; Numeric # Lo       CJK COMPATIBILITY IDEOGRAPH-F9FD
 12400..1246E  ; Numeric # Nl [111] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM
 16B5B..16B61  ; Numeric # No   [7] PAHAWH HMONG NUMBER TENS..PAHAWH HMONG NUMBER TRILLIONS
 16E80..16E96  ; Numeric # No  [23] MEDEFAIDRIN DIGIT ZERO..MEDEFAIDRIN DIGIT THREE ALTERNATE FORM
+1D2C0..1D2D3  ; Numeric # No  [20] KAKTOVIK NUMERAL ZERO..KAKTOVIK NUMERAL NINETEEN
 1D2E0..1D2F3  ; Numeric # No  [20] MAYAN NUMERAL ZERO..MAYAN NUMERAL NINETEEN
 1D360..1D378  ; Numeric # No  [25] COUNTING ROD UNIT DIGIT ONE..TALLY MARK FIVE
 1E8C7..1E8CF  ; Numeric # No   [9] MENDE KIKAKUI DIGIT ONE..MENDE KIKAKUI DIGIT NINE
@@ -181,7 +182,7 @@ F9FD          ; Numeric # Lo       CJK COMPATIBILITY IDEOGRAPH-F9FD
 2626D         ; Numeric # Lo       CJK UNIFIED IDEOGRAPH-2626D
 2F890         ; Numeric # Lo       CJK COMPATIBILITY IDEOGRAPH-2F890
 
-# Total code points: 1084
+# Total code points: 1104
 
 # ================================================
 
@@ -264,15 +265,17 @@ FF10..FF19    ; Decimal # Nd  [10] FULLWIDTH DIGIT ZERO..FULLWIDTH DIGIT NINE
 11C50..11C59  ; Decimal # Nd  [10] BHAIKSUKI DIGIT ZERO..BHAIKSUKI DIGIT NINE
 11D50..11D59  ; Decimal # Nd  [10] MASARAM GONDI DIGIT ZERO..MASARAM GONDI DIGIT NINE
 11DA0..11DA9  ; Decimal # Nd  [10] GUNJALA GONDI DIGIT ZERO..GUNJALA GONDI DIGIT NINE
+11F50..11F59  ; Decimal # Nd  [10] KAWI DIGIT ZERO..KAWI DIGIT NINE
 16A60..16A69  ; Decimal # Nd  [10] MRO DIGIT ZERO..MRO DIGIT NINE
 16AC0..16AC9  ; Decimal # Nd  [10] TANGSA DIGIT ZERO..TANGSA DIGIT NINE
 16B50..16B59  ; Decimal # Nd  [10] PAHAWH HMONG DIGIT ZERO..PAHAWH HMONG DIGIT NINE
 1D7CE..1D7FF  ; Decimal # Nd  [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE
 1E140..1E149  ; Decimal # Nd  [10] NYIAKENG PUACHUE HMONG DIGIT ZERO..NYIAKENG PUACHUE HMONG DIGIT NINE
 1E2F0..1E2F9  ; Decimal # Nd  [10] WANCHO DIGIT ZERO..WANCHO DIGIT NINE
+1E4F0..1E4F9  ; Decimal # Nd  [10] NAG MUNDARI DIGIT ZERO..NAG MUNDARI DIGIT NINE
 1E950..1E959  ; Decimal # Nd  [10] ADLAM DIGIT ZERO..ADLAM DIGIT NINE
 1FBF0..1FBF9  ; Decimal # Nd  [10] SEGMENTED DIGIT ZERO..SEGMENTED DIGIT NINE
 
-# Total code points: 660
+# Total code points: 680
 
 # EOF
index 84cb907..221a601 100644 (file)
@@ -1,11 +1,11 @@
-# DerivedNumericValues-14.0.0.txt
-# Date: 2021-03-08, 06:22:32 GMT
-# © 2021 Unicode®, Inc.
+# DerivedNumericValues-15.0.0.txt
+# Date: 2022-02-26, 00:38:37 GMT
+# © 2022 Unicode®, Inc.
 # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
-# For terms of use, see http://www.unicode.org/terms_of_use.html
+# For terms of use, see https://www.unicode.org/terms_of_use.html
 #
 # Unicode Character Database
-#   For documentation, see http://www.unicode.org/reports/tr44/
+#   For documentation, see https://www.unicode.org/reports/tr44/
 
 # ================================================
 
@@ -105,10 +105,12 @@ FF10          ; 0.0 ; ; 0 # Nd       FULLWIDTH DIGIT ZERO
 11C50         ; 0.0 ; ; 0 # Nd       BHAIKSUKI DIGIT ZERO
 11D50         ; 0.0 ; ; 0 # Nd       MASARAM GONDI DIGIT ZERO
 11DA0         ; 0.0 ; ; 0 # Nd       GUNJALA GONDI DIGIT ZERO
+11F50         ; 0.0 ; ; 0 # Nd       KAWI DIGIT ZERO
 16A60         ; 0.0 ; ; 0 # Nd       MRO DIGIT ZERO
 16AC0         ; 0.0 ; ; 0 # Nd       TANGSA DIGIT ZERO
 16B50         ; 0.0 ; ; 0 # Nd       PAHAWH HMONG DIGIT ZERO
 16E80         ; 0.0 ; ; 0 # No       MEDEFAIDRIN DIGIT ZERO
+1D2C0         ; 0.0 ; ; 0 # No       KAKTOVIK NUMERAL ZERO
 1D2E0         ; 0.0 ; ; 0 # No       MAYAN NUMERAL ZERO
 1D7CE         ; 0.0 ; ; 0 # Nd       MATHEMATICAL BOLD DIGIT ZERO
 1D7D8         ; 0.0 ; ; 0 # Nd       MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO
@@ -117,12 +119,13 @@ FF10          ; 0.0 ; ; 0 # Nd       FULLWIDTH DIGIT ZERO
 1D7F6         ; 0.0 ; ; 0 # Nd       MATHEMATICAL MONOSPACE DIGIT ZERO
 1E140         ; 0.0 ; ; 0 # Nd       NYIAKENG PUACHUE HMONG DIGIT ZERO
 1E2F0         ; 0.0 ; ; 0 # Nd       WANCHO DIGIT ZERO
+1E4F0         ; 0.0 ; ; 0 # Nd       NAG MUNDARI DIGIT ZERO
 1E950         ; 0.0 ; ; 0 # Nd       ADLAM DIGIT ZERO
 1F100..1F101  ; 0.0 ; ; 0 # No   [2] DIGIT ZERO FULL STOP..DIGIT ZERO COMMA
 1F10B..1F10C  ; 0.0 ; ; 0 # No   [2] DINGBAT CIRCLED SANS-SERIF DIGIT ZERO..DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ZERO
 1FBF0         ; 0.0 ; ; 0 # Nd       SEGMENTED DIGIT ZERO
 
-# Total code points: 84
+# Total code points: 87
 
 # ================================================
 
@@ -514,6 +517,7 @@ FF11          ; 1.0 ; ; 1 # Nd       FULLWIDTH DIGIT ONE
 11C5A         ; 1.0 ; ; 1 # No       BHAIKSUKI NUMBER ONE
 11D51         ; 1.0 ; ; 1 # Nd       MASARAM GONDI DIGIT ONE
 11DA1         ; 1.0 ; ; 1 # Nd       GUNJALA GONDI DIGIT ONE
+11F51         ; 1.0 ; ; 1 # Nd       KAWI DIGIT ONE
 12415         ; 1.0 ; ; 1 # Nl       CUNEIFORM NUMERIC SIGN ONE GESH2
 1241E         ; 1.0 ; ; 1 # Nl       CUNEIFORM NUMERIC SIGN ONE GESHU
 1242C         ; 1.0 ; ; 1 # Nl       CUNEIFORM NUMERIC SIGN ONE SHARU
@@ -525,6 +529,7 @@ FF11          ; 1.0 ; ; 1 # Nd       FULLWIDTH DIGIT ONE
 16B51         ; 1.0 ; ; 1 # Nd       PAHAWH HMONG DIGIT ONE
 16E81         ; 1.0 ; ; 1 # No       MEDEFAIDRIN DIGIT ONE
 16E94         ; 1.0 ; ; 1 # No       MEDEFAIDRIN DIGIT ONE ALTERNATE FORM
+1D2C1         ; 1.0 ; ; 1 # No       KAKTOVIK NUMERAL ONE
 1D2E1         ; 1.0 ; ; 1 # No       MAYAN NUMERAL ONE
 1D360         ; 1.0 ; ; 1 # No       COUNTING ROD UNIT DIGIT ONE
 1D372         ; 1.0 ; ; 1 # No       IDEOGRAPHIC TALLY MARK ONE
@@ -536,6 +541,7 @@ FF11          ; 1.0 ; ; 1 # Nd       FULLWIDTH DIGIT ONE
 1D7F7         ; 1.0 ; ; 1 # Nd       MATHEMATICAL MONOSPACE DIGIT ONE
 1E141         ; 1.0 ; ; 1 # Nd       NYIAKENG PUACHUE HMONG DIGIT ONE
 1E2F1         ; 1.0 ; ; 1 # Nd       WANCHO DIGIT ONE
+1E4F1         ; 1.0 ; ; 1 # Nd       NAG MUNDARI DIGIT ONE
 1E8C7         ; 1.0 ; ; 1 # No       MENDE KIKAKUI DIGIT ONE
 1E951         ; 1.0 ; ; 1 # Nd       ADLAM DIGIT ONE
 1EC71         ; 1.0 ; ; 1 # No       INDIC SIYAQ NUMBER ONE
@@ -546,7 +552,7 @@ FF11          ; 1.0 ; ; 1 # Nd       FULLWIDTH DIGIT ONE
 1FBF1         ; 1.0 ; ; 1 # Nd       SEGMENTED DIGIT ONE
 2092A         ; 1.0 ; ; 1 # Lo       CJK UNIFIED IDEOGRAPH-2092A
 
-# Total code points: 141
+# Total code points: 144
 
 # ================================================
 
@@ -658,6 +664,7 @@ FF12          ; 2.0 ; ; 2 # Nd       FULLWIDTH DIGIT TWO
 11C5B         ; 2.0 ; ; 2 # No       BHAIKSUKI NUMBER TWO
 11D52         ; 2.0 ; ; 2 # Nd       MASARAM GONDI DIGIT TWO
 11DA2         ; 2.0 ; ; 2 # Nd       GUNJALA GONDI DIGIT TWO
+11F52         ; 2.0 ; ; 2 # Nd       KAWI DIGIT TWO
 12400         ; 2.0 ; ; 2 # Nl       CUNEIFORM NUMERIC SIGN TWO ASH
 12416         ; 2.0 ; ; 2 # Nl       CUNEIFORM NUMERIC SIGN TWO GESH2
 1241F         ; 2.0 ; ; 2 # Nl       CUNEIFORM NUMERIC SIGN TWO GESHU
@@ -673,6 +680,7 @@ FF12          ; 2.0 ; ; 2 # Nd       FULLWIDTH DIGIT TWO
 16B52         ; 2.0 ; ; 2 # Nd       PAHAWH HMONG DIGIT TWO
 16E82         ; 2.0 ; ; 2 # No       MEDEFAIDRIN DIGIT TWO
 16E95         ; 2.0 ; ; 2 # No       MEDEFAIDRIN DIGIT TWO ALTERNATE FORM
+1D2C2         ; 2.0 ; ; 2 # No       KAKTOVIK NUMERAL TWO
 1D2E2         ; 2.0 ; ; 2 # No       MAYAN NUMERAL TWO
 1D361         ; 2.0 ; ; 2 # No       COUNTING ROD UNIT DIGIT TWO
 1D373         ; 2.0 ; ; 2 # No       IDEOGRAPHIC TALLY MARK TWO
@@ -683,6 +691,7 @@ FF12          ; 2.0 ; ; 2 # Nd       FULLWIDTH DIGIT TWO
 1D7F8         ; 2.0 ; ; 2 # Nd       MATHEMATICAL MONOSPACE DIGIT TWO
 1E142         ; 2.0 ; ; 2 # Nd       NYIAKENG PUACHUE HMONG DIGIT TWO
 1E2F2         ; 2.0 ; ; 2 # Nd       WANCHO DIGIT TWO
+1E4F2         ; 2.0 ; ; 2 # Nd       NAG MUNDARI DIGIT TWO
 1E8C8         ; 2.0 ; ; 2 # No       MENDE KIKAKUI DIGIT TWO
 1E952         ; 2.0 ; ; 2 # Nd       ADLAM DIGIT TWO
 1EC72         ; 2.0 ; ; 2 # No       INDIC SIYAQ NUMBER TWO
@@ -694,7 +703,7 @@ FF12          ; 2.0 ; ; 2 # Nd       FULLWIDTH DIGIT TWO
 1FBF2         ; 2.0 ; ; 2 # Nd       SEGMENTED DIGIT TWO
 22390         ; 2.0 ; ; 2 # Lo       CJK UNIFIED IDEOGRAPH-22390
 
-# Total code points: 140
+# Total code points: 143
 
 # ================================================
 
@@ -800,6 +809,7 @@ FF13          ; 3.0 ; ; 3 # Nd       FULLWIDTH DIGIT THREE
 11C5C         ; 3.0 ; ; 3 # No       BHAIKSUKI NUMBER THREE
 11D53         ; 3.0 ; ; 3 # Nd       MASARAM GONDI DIGIT THREE
 11DA3         ; 3.0 ; ; 3 # Nd       GUNJALA GONDI DIGIT THREE
+11F53         ; 3.0 ; ; 3 # Nd       KAWI DIGIT THREE
 12401         ; 3.0 ; ; 3 # Nl       CUNEIFORM NUMERIC SIGN THREE ASH
 12408         ; 3.0 ; ; 3 # Nl       CUNEIFORM NUMERIC SIGN THREE DISH
 12417         ; 3.0 ; ; 3 # Nl       CUNEIFORM NUMERIC SIGN THREE GESH2
@@ -816,6 +826,7 @@ FF13          ; 3.0 ; ; 3 # Nd       FULLWIDTH DIGIT THREE
 16B53         ; 3.0 ; ; 3 # Nd       PAHAWH HMONG DIGIT THREE
 16E83         ; 3.0 ; ; 3 # No       MEDEFAIDRIN DIGIT THREE
 16E96         ; 3.0 ; ; 3 # No       MEDEFAIDRIN DIGIT THREE ALTERNATE FORM
+1D2C3         ; 3.0 ; ; 3 # No       KAKTOVIK NUMERAL THREE
 1D2E3         ; 3.0 ; ; 3 # No       MAYAN NUMERAL THREE
 1D362         ; 3.0 ; ; 3 # No       COUNTING ROD UNIT DIGIT THREE
 1D374         ; 3.0 ; ; 3 # No       IDEOGRAPHIC TALLY MARK THREE
@@ -826,6 +837,7 @@ FF13          ; 3.0 ; ; 3 # Nd       FULLWIDTH DIGIT THREE
 1D7F9         ; 3.0 ; ; 3 # Nd       MATHEMATICAL MONOSPACE DIGIT THREE
 1E143         ; 3.0 ; ; 3 # Nd       NYIAKENG PUACHUE HMONG DIGIT THREE
 1E2F3         ; 3.0 ; ; 3 # Nd       WANCHO DIGIT THREE
+1E4F3         ; 3.0 ; ; 3 # Nd       NAG MUNDARI DIGIT THREE
 1E8C9         ; 3.0 ; ; 3 # No       MENDE KIKAKUI DIGIT THREE
 1E953         ; 3.0 ; ; 3 # Nd       ADLAM DIGIT THREE
 1EC73         ; 3.0 ; ; 3 # No       INDIC SIYAQ NUMBER THREE
@@ -839,7 +851,7 @@ FF13          ; 3.0 ; ; 3 # Nd       FULLWIDTH DIGIT THREE
 22998         ; 3.0 ; ; 3 # Lo       CJK UNIFIED IDEOGRAPH-22998
 23B1B         ; 3.0 ; ; 3 # Lo       CJK UNIFIED IDEOGRAPH-23B1B
 
-# Total code points: 141
+# Total code points: 144
 
 # ================================================
 
@@ -939,6 +951,7 @@ FF14          ; 4.0 ; ; 4 # Nd       FULLWIDTH DIGIT FOUR
 11C5D         ; 4.0 ; ; 4 # No       BHAIKSUKI NUMBER FOUR
 11D54         ; 4.0 ; ; 4 # Nd       MASARAM GONDI DIGIT FOUR
 11DA4         ; 4.0 ; ; 4 # Nd       GUNJALA GONDI DIGIT FOUR
+11F54         ; 4.0 ; ; 4 # Nd       KAWI DIGIT FOUR
 12402         ; 4.0 ; ; 4 # Nl       CUNEIFORM NUMERIC SIGN FOUR ASH
 12409         ; 4.0 ; ; 4 # Nl       CUNEIFORM NUMERIC SIGN FOUR DISH
 1240F         ; 4.0 ; ; 4 # Nl       CUNEIFORM NUMERIC SIGN FOUR U
@@ -955,6 +968,7 @@ FF14          ; 4.0 ; ; 4 # Nd       FULLWIDTH DIGIT FOUR
 16AC4         ; 4.0 ; ; 4 # Nd       TANGSA DIGIT FOUR
 16B54         ; 4.0 ; ; 4 # Nd       PAHAWH HMONG DIGIT FOUR
 16E84         ; 4.0 ; ; 4 # No       MEDEFAIDRIN DIGIT FOUR
+1D2C4         ; 4.0 ; ; 4 # No       KAKTOVIK NUMERAL FOUR
 1D2E4         ; 4.0 ; ; 4 # No       MAYAN NUMERAL FOUR
 1D363         ; 4.0 ; ; 4 # No       COUNTING ROD UNIT DIGIT FOUR
 1D375         ; 4.0 ; ; 4 # No       IDEOGRAPHIC TALLY MARK FOUR
@@ -965,6 +979,7 @@ FF14          ; 4.0 ; ; 4 # Nd       FULLWIDTH DIGIT FOUR
 1D7FA         ; 4.0 ; ; 4 # Nd       MATHEMATICAL MONOSPACE DIGIT FOUR
 1E144         ; 4.0 ; ; 4 # Nd       NYIAKENG PUACHUE HMONG DIGIT FOUR
 1E2F4         ; 4.0 ; ; 4 # Nd       WANCHO DIGIT FOUR
+1E4F4         ; 4.0 ; ; 4 # Nd       NAG MUNDARI DIGIT FOUR
 1E8CA         ; 4.0 ; ; 4 # No       MENDE KIKAKUI DIGIT FOUR
 1E954         ; 4.0 ; ; 4 # Nd       ADLAM DIGIT FOUR
 1EC74         ; 4.0 ; ; 4 # No       INDIC SIYAQ NUMBER FOUR
@@ -977,7 +992,7 @@ FF14          ; 4.0 ; ; 4 # Nd       FULLWIDTH DIGIT FOUR
 200E2         ; 4.0 ; ; 4 # Lo       CJK UNIFIED IDEOGRAPH-200E2
 2626D         ; 4.0 ; ; 4 # Lo       CJK UNIFIED IDEOGRAPH-2626D
 
-# Total code points: 132
+# Total code points: 135
 
 # ================================================
 
@@ -1081,6 +1096,7 @@ FF15          ; 5.0 ; ; 5 # Nd       FULLWIDTH DIGIT FIVE
 11C5E         ; 5.0 ; ; 5 # No       BHAIKSUKI NUMBER FIVE
 11D55         ; 5.0 ; ; 5 # Nd       MASARAM GONDI DIGIT FIVE
 11DA5         ; 5.0 ; ; 5 # Nd       GUNJALA GONDI DIGIT FIVE
+11F55         ; 5.0 ; ; 5 # Nd       KAWI DIGIT FIVE
 12403         ; 5.0 ; ; 5 # Nl       CUNEIFORM NUMERIC SIGN FIVE ASH
 1240A         ; 5.0 ; ; 5 # Nl       CUNEIFORM NUMERIC SIGN FIVE DISH
 12410         ; 5.0 ; ; 5 # Nl       CUNEIFORM NUMERIC SIGN FIVE U
@@ -1096,6 +1112,7 @@ FF15          ; 5.0 ; ; 5 # Nd       FULLWIDTH DIGIT FIVE
 16AC5         ; 5.0 ; ; 5 # Nd       TANGSA DIGIT FIVE
 16B55         ; 5.0 ; ; 5 # Nd       PAHAWH HMONG DIGIT FIVE
 16E85         ; 5.0 ; ; 5 # No       MEDEFAIDRIN DIGIT FIVE
+1D2C5         ; 5.0 ; ; 5 # No       KAKTOVIK NUMERAL FIVE
 1D2E5         ; 5.0 ; ; 5 # No       MAYAN NUMERAL FIVE
 1D364         ; 5.0 ; ; 5 # No       COUNTING ROD UNIT DIGIT FIVE
 1D376         ; 5.0 ; ; 5 # No       IDEOGRAPHIC TALLY MARK FIVE
@@ -1107,6 +1124,7 @@ FF15          ; 5.0 ; ; 5 # Nd       FULLWIDTH DIGIT FIVE
 1D7FB         ; 5.0 ; ; 5 # Nd       MATHEMATICAL MONOSPACE DIGIT FIVE
 1E145         ; 5.0 ; ; 5 # Nd       NYIAKENG PUACHUE HMONG DIGIT FIVE
 1E2F5         ; 5.0 ; ; 5 # Nd       WANCHO DIGIT FIVE
+1E4F5         ; 5.0 ; ; 5 # Nd       NAG MUNDARI DIGIT FIVE
 1E8CB         ; 5.0 ; ; 5 # No       MENDE KIKAKUI DIGIT FIVE
 1E955         ; 5.0 ; ; 5 # Nd       ADLAM DIGIT FIVE
 1EC75         ; 5.0 ; ; 5 # No       INDIC SIYAQ NUMBER FIVE
@@ -1117,7 +1135,7 @@ FF15          ; 5.0 ; ; 5 # Nd       FULLWIDTH DIGIT FIVE
 1FBF5         ; 5.0 ; ; 5 # Nd       SEGMENTED DIGIT FIVE
 20121         ; 5.0 ; ; 5 # Lo       CJK UNIFIED IDEOGRAPH-20121
 
-# Total code points: 130
+# Total code points: 133
 
 # ================================================
 
@@ -1211,6 +1229,7 @@ FF16          ; 6.0 ; ; 6 # Nd       FULLWIDTH DIGIT SIX
 11C5F         ; 6.0 ; ; 6 # No       BHAIKSUKI NUMBER SIX
 11D56         ; 6.0 ; ; 6 # Nd       MASARAM GONDI DIGIT SIX
 11DA6         ; 6.0 ; ; 6 # Nd       GUNJALA GONDI DIGIT SIX
+11F56         ; 6.0 ; ; 6 # Nd       KAWI DIGIT SIX
 12404         ; 6.0 ; ; 6 # Nl       CUNEIFORM NUMERIC SIGN SIX ASH
 1240B         ; 6.0 ; ; 6 # Nl       CUNEIFORM NUMERIC SIGN SIX DISH
 12411         ; 6.0 ; ; 6 # Nl       CUNEIFORM NUMERIC SIGN SIX U
@@ -1223,6 +1242,7 @@ FF16          ; 6.0 ; ; 6 # Nd       FULLWIDTH DIGIT SIX
 16AC6         ; 6.0 ; ; 6 # Nd       TANGSA DIGIT SIX
 16B56         ; 6.0 ; ; 6 # Nd       PAHAWH HMONG DIGIT SIX
 16E86         ; 6.0 ; ; 6 # No       MEDEFAIDRIN DIGIT SIX
+1D2C6         ; 6.0 ; ; 6 # No       KAKTOVIK NUMERAL SIX
 1D2E6         ; 6.0 ; ; 6 # No       MAYAN NUMERAL SIX
 1D365         ; 6.0 ; ; 6 # No       COUNTING ROD UNIT DIGIT SIX
 1D7D4         ; 6.0 ; ; 6 # Nd       MATHEMATICAL BOLD DIGIT SIX
@@ -1232,6 +1252,7 @@ FF16          ; 6.0 ; ; 6 # Nd       FULLWIDTH DIGIT SIX
 1D7FC         ; 6.0 ; ; 6 # Nd       MATHEMATICAL MONOSPACE DIGIT SIX
 1E146         ; 6.0 ; ; 6 # Nd       NYIAKENG PUACHUE HMONG DIGIT SIX
 1E2F6         ; 6.0 ; ; 6 # Nd       WANCHO DIGIT SIX
+1E4F6         ; 6.0 ; ; 6 # Nd       NAG MUNDARI DIGIT SIX
 1E8CC         ; 6.0 ; ; 6 # No       MENDE KIKAKUI DIGIT SIX
 1E956         ; 6.0 ; ; 6 # Nd       ADLAM DIGIT SIX
 1EC76         ; 6.0 ; ; 6 # No       INDIC SIYAQ NUMBER SIX
@@ -1242,7 +1263,7 @@ FF16          ; 6.0 ; ; 6 # Nd       FULLWIDTH DIGIT SIX
 1FBF6         ; 6.0 ; ; 6 # Nd       SEGMENTED DIGIT SIX
 20AEA         ; 6.0 ; ; 6 # Lo       CJK UNIFIED IDEOGRAPH-20AEA
 
-# Total code points: 114
+# Total code points: 117
 
 # ================================================
 
@@ -1334,6 +1355,7 @@ FF17          ; 7.0 ; ; 7 # Nd       FULLWIDTH DIGIT SEVEN
 11C60         ; 7.0 ; ; 7 # No       BHAIKSUKI NUMBER SEVEN
 11D57         ; 7.0 ; ; 7 # Nd       MASARAM GONDI DIGIT SEVEN
 11DA7         ; 7.0 ; ; 7 # Nd       GUNJALA GONDI DIGIT SEVEN
+11F57         ; 7.0 ; ; 7 # Nd       KAWI DIGIT SEVEN
 12405         ; 7.0 ; ; 7 # Nl       CUNEIFORM NUMERIC SIGN SEVEN ASH
 1240C         ; 7.0 ; ; 7 # Nl       CUNEIFORM NUMERIC SIGN SEVEN DISH
 12412         ; 7.0 ; ; 7 # Nl       CUNEIFORM NUMERIC SIGN SEVEN U
@@ -1345,6 +1367,7 @@ FF17          ; 7.0 ; ; 7 # Nd       FULLWIDTH DIGIT SEVEN
 16AC7         ; 7.0 ; ; 7 # Nd       TANGSA DIGIT SEVEN
 16B57         ; 7.0 ; ; 7 # Nd       PAHAWH HMONG DIGIT SEVEN
 16E87         ; 7.0 ; ; 7 # No       MEDEFAIDRIN DIGIT SEVEN
+1D2C7         ; 7.0 ; ; 7 # No       KAKTOVIK NUMERAL SEVEN
 1D2E7         ; 7.0 ; ; 7 # No       MAYAN NUMERAL SEVEN
 1D366         ; 7.0 ; ; 7 # No       COUNTING ROD UNIT DIGIT SEVEN
 1D7D5         ; 7.0 ; ; 7 # Nd       MATHEMATICAL BOLD DIGIT SEVEN
@@ -1354,6 +1377,7 @@ FF17          ; 7.0 ; ; 7 # Nd       FULLWIDTH DIGIT SEVEN
 1D7FD         ; 7.0 ; ; 7 # Nd       MATHEMATICAL MONOSPACE DIGIT SEVEN
 1E147         ; 7.0 ; ; 7 # Nd       NYIAKENG PUACHUE HMONG DIGIT SEVEN
 1E2F7         ; 7.0 ; ; 7 # Nd       WANCHO DIGIT SEVEN
+1E4F7         ; 7.0 ; ; 7 # Nd       NAG MUNDARI DIGIT SEVEN
 1E8CD         ; 7.0 ; ; 7 # No       MENDE KIKAKUI DIGIT SEVEN
 1E957         ; 7.0 ; ; 7 # Nd       ADLAM DIGIT SEVEN
 1EC77         ; 7.0 ; ; 7 # No       INDIC SIYAQ NUMBER SEVEN
@@ -1364,7 +1388,7 @@ FF17          ; 7.0 ; ; 7 # Nd       FULLWIDTH DIGIT SEVEN
 1FBF7         ; 7.0 ; ; 7 # Nd       SEGMENTED DIGIT SEVEN
 20001         ; 7.0 ; ; 7 # Lo       CJK UNIFIED IDEOGRAPH-20001
 
-# Total code points: 113
+# Total code points: 116
 
 # ================================================
 
@@ -1454,6 +1478,7 @@ FF18          ; 8.0 ; ; 8 # Nd       FULLWIDTH DIGIT EIGHT
 11C61         ; 8.0 ; ; 8 # No       BHAIKSUKI NUMBER EIGHT
 11D58         ; 8.0 ; ; 8 # Nd       MASARAM GONDI DIGIT EIGHT
 11DA8         ; 8.0 ; ; 8 # Nd       GUNJALA GONDI DIGIT EIGHT
+11F58         ; 8.0 ; ; 8 # Nd       KAWI DIGIT EIGHT
 12406         ; 8.0 ; ; 8 # Nl       CUNEIFORM NUMERIC SIGN EIGHT ASH
 1240D         ; 8.0 ; ; 8 # Nl       CUNEIFORM NUMERIC SIGN EIGHT DISH
 12413         ; 8.0 ; ; 8 # Nl       CUNEIFORM NUMERIC SIGN EIGHT U
@@ -1465,6 +1490,7 @@ FF18          ; 8.0 ; ; 8 # Nd       FULLWIDTH DIGIT EIGHT
 16AC8         ; 8.0 ; ; 8 # Nd       TANGSA DIGIT EIGHT
 16B58         ; 8.0 ; ; 8 # Nd       PAHAWH HMONG DIGIT EIGHT
 16E88         ; 8.0 ; ; 8 # No       MEDEFAIDRIN DIGIT EIGHT
+1D2C8         ; 8.0 ; ; 8 # No       KAKTOVIK NUMERAL EIGHT
 1D2E8         ; 8.0 ; ; 8 # No       MAYAN NUMERAL EIGHT
 1D367         ; 8.0 ; ; 8 # No       COUNTING ROD UNIT DIGIT EIGHT
 1D7D6         ; 8.0 ; ; 8 # Nd       MATHEMATICAL BOLD DIGIT EIGHT
@@ -1474,6 +1500,7 @@ FF18          ; 8.0 ; ; 8 # Nd       FULLWIDTH DIGIT EIGHT
 1D7FE         ; 8.0 ; ; 8 # Nd       MATHEMATICAL MONOSPACE DIGIT EIGHT
 1E148         ; 8.0 ; ; 8 # Nd       NYIAKENG PUACHUE HMONG DIGIT EIGHT
 1E2F8         ; 8.0 ; ; 8 # Nd       WANCHO DIGIT EIGHT
+1E4F8         ; 8.0 ; ; 8 # Nd       NAG MUNDARI DIGIT EIGHT
 1E8CE         ; 8.0 ; ; 8 # No       MENDE KIKAKUI DIGIT EIGHT
 1E958         ; 8.0 ; ; 8 # Nd       ADLAM DIGIT EIGHT
 1EC78         ; 8.0 ; ; 8 # No       INDIC SIYAQ NUMBER EIGHT
@@ -1483,7 +1510,7 @@ FF18          ; 8.0 ; ; 8 # Nd       FULLWIDTH DIGIT EIGHT
 1F109         ; 8.0 ; ; 8 # No       DIGIT EIGHT COMMA
 1FBF8         ; 8.0 ; ; 8 # Nd       SEGMENTED DIGIT EIGHT
 
-# Total code points: 109
+# Total code points: 112
 
 # ================================================
 
@@ -1574,6 +1601,7 @@ FF19          ; 9.0 ; ; 9 # Nd       FULLWIDTH DIGIT NINE
 11C62         ; 9.0 ; ; 9 # No       BHAIKSUKI NUMBER NINE
 11D59         ; 9.0 ; ; 9 # Nd       MASARAM GONDI DIGIT NINE
 11DA9         ; 9.0 ; ; 9 # Nd       GUNJALA GONDI DIGIT NINE
+11F59         ; 9.0 ; ; 9 # Nd       KAWI DIGIT NINE
 12407         ; 9.0 ; ; 9 # Nl       CUNEIFORM NUMERIC SIGN NINE ASH
 1240E         ; 9.0 ; ; 9 # Nl       CUNEIFORM NUMERIC SIGN NINE DISH
 12414         ; 9.0 ; ; 9 # Nl       CUNEIFORM NUMERIC SIGN NINE U
@@ -1585,6 +1613,7 @@ FF19          ; 9.0 ; ; 9 # Nd       FULLWIDTH DIGIT NINE
 16AC9         ; 9.0 ; ; 9 # Nd       TANGSA DIGIT NINE
 16B59         ; 9.0 ; ; 9 # Nd       PAHAWH HMONG DIGIT NINE
 16E89         ; 9.0 ; ; 9 # No       MEDEFAIDRIN DIGIT NINE
+1D2C9         ; 9.0 ; ; 9 # No       KAKTOVIK NUMERAL NINE
 1D2E9         ; 9.0 ; ; 9 # No       MAYAN NUMERAL NINE
 1D368         ; 9.0 ; ; 9 # No       COUNTING ROD UNIT DIGIT NINE
 1D7D7         ; 9.0 ; ; 9 # Nd       MATHEMATICAL BOLD DIGIT NINE
@@ -1594,6 +1623,7 @@ FF19          ; 9.0 ; ; 9 # Nd       FULLWIDTH DIGIT NINE
 1D7FF         ; 9.0 ; ; 9 # Nd       MATHEMATICAL MONOSPACE DIGIT NINE
 1E149         ; 9.0 ; ; 9 # Nd       NYIAKENG PUACHUE HMONG DIGIT NINE
 1E2F9         ; 9.0 ; ; 9 # Nd       WANCHO DIGIT NINE
+1E4F9         ; 9.0 ; ; 9 # Nd       NAG MUNDARI DIGIT NINE
 1E8CF         ; 9.0 ; ; 9 # No       MENDE KIKAKUI DIGIT NINE
 1E959         ; 9.0 ; ; 9 # Nd       ADLAM DIGIT NINE
 1EC79         ; 9.0 ; ; 9 # No       INDIC SIYAQ NUMBER NINE
@@ -1604,7 +1634,7 @@ FF19          ; 9.0 ; ; 9 # Nd       FULLWIDTH DIGIT NINE
 1FBF9         ; 9.0 ; ; 9 # Nd       SEGMENTED DIGIT NINE
 2F890         ; 9.0 ; ; 9 # Lo       CJK COMPATIBILITY IDEOGRAPH-2F890
 
-# Total code points: 113
+# Total code points: 116
 
 # ================================================
 
@@ -1661,13 +1691,14 @@ F9FD          ; 10.0 ; ; 10 # Lo       CJK COMPATIBILITY IDEOGRAPH-F9FD
 11C63         ; 10.0 ; ; 10 # No       BHAIKSUKI NUMBER TEN
 16B5B         ; 10.0 ; ; 10 # No       PAHAWH HMONG NUMBER TENS
 16E8A         ; 10.0 ; ; 10 # No       MEDEFAIDRIN NUMBER TEN
+1D2CA         ; 10.0 ; ; 10 # No       KAKTOVIK NUMERAL TEN
 1D2EA         ; 10.0 ; ; 10 # No       MAYAN NUMERAL TEN
 1D369         ; 10.0 ; ; 10 # No       COUNTING ROD TENS DIGIT ONE
 1EC7A         ; 10.0 ; ; 10 # No       INDIC SIYAQ NUMBER TEN
 1ED0A         ; 10.0 ; ; 10 # No       OTTOMAN SIYAQ NUMBER TEN
 1ED37         ; 10.0 ; ; 10 # No       OTTOMAN SIYAQ ALTERNATE NUMBER TEN
 
-# Total code points: 62
+# Total code points: 63
 
 # ================================================
 
@@ -1678,9 +1709,10 @@ F9FD          ; 10.0 ; ; 10 # Lo       CJK COMPATIBILITY IDEOGRAPH-F9FD
 2492          ; 11.0 ; ; 11 # No       NUMBER ELEVEN FULL STOP
 24EB          ; 11.0 ; ; 11 # No       NEGATIVE CIRCLED NUMBER ELEVEN
 16E8B         ; 11.0 ; ; 11 # No       MEDEFAIDRIN NUMBER ELEVEN
+1D2CB         ; 11.0 ; ; 11 # No       KAKTOVIK NUMERAL ELEVEN
 1D2EB         ; 11.0 ; ; 11 # No       MAYAN NUMERAL ELEVEN
 
-# Total code points: 8
+# Total code points: 9
 
 # ================================================
 
@@ -1691,9 +1723,10 @@ F9FD          ; 10.0 ; ; 10 # Lo       CJK COMPATIBILITY IDEOGRAPH-F9FD
 2493          ; 12.0 ; ; 12 # No       NUMBER TWELVE FULL STOP
 24EC          ; 12.0 ; ; 12 # No       NEGATIVE CIRCLED NUMBER TWELVE
 16E8C         ; 12.0 ; ; 12 # No       MEDEFAIDRIN NUMBER TWELVE
+1D2CC         ; 12.0 ; ; 12 # No       KAKTOVIK NUMERAL TWELVE
 1D2EC         ; 12.0 ; ; 12 # No       MAYAN NUMERAL TWELVE
 
-# Total code points: 8
+# Total code points: 9
 
 # ================================================
 
@@ -1702,9 +1735,10 @@ F9FD          ; 10.0 ; ; 10 # Lo       CJK COMPATIBILITY IDEOGRAPH-F9FD
 2494          ; 13.0 ; ; 13 # No       NUMBER THIRTEEN FULL STOP
 24ED          ; 13.0 ; ; 13 # No       NEGATIVE CIRCLED NUMBER THIRTEEN
 16E8D         ; 13.0 ; ; 13 # No       MEDEFAIDRIN NUMBER THIRTEEN
+1D2CD         ; 13.0 ; ; 13 # No       KAKTOVIK NUMERAL THIRTEEN
 1D2ED         ; 13.0 ; ; 13 # No       MAYAN NUMERAL THIRTEEN
 
-# Total code points: 6
+# Total code points: 7
 
 # ================================================
 
@@ -1713,9 +1747,10 @@ F9FD          ; 10.0 ; ; 10 # Lo       CJK COMPATIBILITY IDEOGRAPH-F9FD
 2495          ; 14.0 ; ; 14 # No       NUMBER FOURTEEN FULL STOP
 24EE          ; 14.0 ; ; 14 # No       NEGATIVE CIRCLED NUMBER FOURTEEN
 16E8E         ; 14.0 ; ; 14 # No       MEDEFAIDRIN NUMBER FOURTEEN
+1D2CE         ; 14.0 ; ; 14 # No       KAKTOVIK NUMERAL FOURTEEN
 1D2EE         ; 14.0 ; ; 14 # No       MAYAN NUMERAL FOURTEEN
 
-# Total code points: 6
+# Total code points: 7
 
 # ================================================
 
@@ -1724,9 +1759,10 @@ F9FD          ; 10.0 ; ; 10 # Lo       CJK COMPATIBILITY IDEOGRAPH-F9FD
 2496          ; 15.0 ; ; 15 # No       NUMBER FIFTEEN FULL STOP
 24EF          ; 15.0 ; ; 15 # No       NEGATIVE CIRCLED NUMBER FIFTEEN
 16E8F         ; 15.0 ; ; 15 # No       MEDEFAIDRIN NUMBER FIFTEEN
+1D2CF         ; 15.0 ; ; 15 # No       KAKTOVIK NUMERAL FIFTEEN
 1D2EF         ; 15.0 ; ; 15 # No       MAYAN NUMERAL FIFTEEN
 
-# Total code points: 6
+# Total code points: 7
 
 # ================================================
 
@@ -1736,9 +1772,10 @@ F9FD          ; 10.0 ; ; 10 # Lo       CJK COMPATIBILITY IDEOGRAPH-F9FD
 2497          ; 16.0 ; ; 16 # No       NUMBER SIXTEEN FULL STOP
 24F0          ; 16.0 ; ; 16 # No       NEGATIVE CIRCLED NUMBER SIXTEEN
 16E90         ; 16.0 ; ; 16 # No       MEDEFAIDRIN NUMBER SIXTEEN
+1D2D0         ; 16.0 ; ; 16 # No       KAKTOVIK NUMERAL SIXTEEN
 1D2F0         ; 16.0 ; ; 16 # No       MAYAN NUMERAL SIXTEEN
 
-# Total code points: 7
+# Total code points: 8
 
 # ================================================
 
@@ -1748,9 +1785,10 @@ F9FD          ; 10.0 ; ; 10 # Lo       CJK COMPATIBILITY IDEOGRAPH-F9FD
 2498          ; 17.0 ; ; 17 # No       NUMBER SEVENTEEN FULL STOP
 24F1          ; 17.0 ; ; 17 # No       NEGATIVE CIRCLED NUMBER SEVENTEEN
 16E91         ; 17.0 ; ; 17 # No       MEDEFAIDRIN NUMBER SEVENTEEN
+1D2D1         ; 17.0 ; ; 17 # No       KAKTOVIK NUMERAL SEVENTEEN
 1D2F1         ; 17.0 ; ; 17 # No       MAYAN NUMERAL SEVENTEEN
 
-# Total code points: 7
+# Total code points: 8
 
 # ================================================
 
@@ -1760,9 +1798,10 @@ F9FD          ; 10.0 ; ; 10 # Lo       CJK COMPATIBILITY IDEOGRAPH-F9FD
 2499          ; 18.0 ; ; 18 # No       NUMBER EIGHTEEN FULL STOP
 24F2          ; 18.0 ; ; 18 # No       NEGATIVE CIRCLED NUMBER EIGHTEEN
 16E92         ; 18.0 ; ; 18 # No       MEDEFAIDRIN NUMBER EIGHTEEN
+1D2D2         ; 18.0 ; ; 18 # No       KAKTOVIK NUMERAL EIGHTEEN
 1D2F2         ; 18.0 ; ; 18 # No       MAYAN NUMERAL EIGHTEEN
 
-# Total code points: 7
+# Total code points: 8
 
 # ================================================
 
@@ -1772,9 +1811,10 @@ F9FD          ; 10.0 ; ; 10 # Lo       CJK COMPATIBILITY IDEOGRAPH-F9FD
 249A          ; 19.0 ; ; 19 # No       NUMBER NINETEEN FULL STOP
 24F3          ; 19.0 ; ; 19 # No       NEGATIVE CIRCLED NUMBER NINETEEN
 16E93         ; 19.0 ; ; 19 # No       MEDEFAIDRIN NUMBER NINETEEN
+1D2D3         ; 19.0 ; ; 19 # No       KAKTOVIK NUMERAL NINETEEN
 1D2F3         ; 19.0 ; ; 19 # No       MAYAN NUMERAL NINETEEN
 
-# Total code points: 7
+# Total code points: 8
 
 # ================================================
 
index de2db84..ffa38c3 100644 (file)
@@ -36,6 +36,7 @@ use feature 'signatures';
 no warnings qw( experimental::builtin );
 
 sub DEBUG () { 0 }  # Set to 0 for production; 1 for development
+$| = 1 if DEBUG;
 my $debugging_build = $Config{"ccflags"} =~ /-DDEBUGGING/;
 
 sub NON_ASCII_PLATFORM { ord("A") != 65 }
@@ -49,7 +50,7 @@ sub NON_ASCII_PLATFORM { ord("A") != 65 }
 # expected, a warning will be generated.  If an older version is being
 # compiled, any bounds tests that fail in the generated test file (-maketest
 # option) will be marked as TODO.
-my $version_of_mk_invlist_bounds = v14.0.0;
+my $version_of_mk_invlist_bounds = v15.0.0;
 
 ##########################################################################
 #
@@ -1183,7 +1184,12 @@ my $code_point_re = qr/\b$run_on_code_point_re/;
 # defaults for code points not listed (i.e., missing) in the file.  The code
 # depends on this ending with a semi-colon, so it can assume it is a valid
 # field when the line is split() by semi-colons
-my $missing_defaults_prefix = qr/^#\s+\@missing:\s+0000\.\.10FFFF\s*;/;
+my $missing_defaults_prefix = qr/ ^ \# \s+ \@missing: \s+
+                                           ($code_point_re)
+                                           \.\.
+                                           ($code_point_re)
+                                       \s* ;
+                                /x;
 
 # Property types.  Unicode has more types, but these are sufficient for our
 # purposes.
@@ -1854,8 +1860,7 @@ package main;
             no strict "refs";
 
             # Use typeglob to give the anonymous subroutine the name we want
-            *$destroy_name = sub {
-                my $self = shift;
+            *$destroy_name = sub ($self) {
                 my $addr = pack 'J', refaddr $self;
 
                 $self->$destroy_callback if $destroy_callback;
@@ -1870,9 +1875,8 @@ package main;
         unless ($package->can('dump')) {
             my $dump_name = "${package}::dump";
             no strict "refs";
-            *$dump_name = sub {
-                my $self = shift;
-                return dump_inside_out($self, $package_fields{$package}, @_);
+            *$dump_name = sub ($self, @_args) {
+                return dump_inside_out($self, $package_fields{$package}, @_args);
             }
         }
         return;
@@ -2798,19 +2802,30 @@ END
                             utf8::encode($BOM);
                             my $BOM_re = qr/ ^ (?:$BOM)? /x;
 
-                            while ($_ =~ s/$BOM_re//) { # BOM; seems to be on
-                                                        # many lines in some files!!
-                                $_ = <$file_handle>;
+                            do {
                                 chomp;
-                                if ($_ =~ /^# Version: (.*)/) {
-                                    $this_version = $1;
-                                    goto valid_version
-                                        if $this_version eq $string_version;
-                                    goto valid_version
-                                        if "$this_version.0" eq $string_version;
-                                    goto wrong_version;
+
+                                # BOM; seems to be on many lines in some
+                                # files!!
+                                $_ =~ s/$BOM_re//;
+
+                                if (/./) {
+
+                                    # Only look for the version if in the
+                                    # first comment block.
+                                    goto no_version unless $_ =~ /^#/;
+
+                                    if ($_ =~ /Version:? (\S*)/) {
+                                        $this_version = $1;
+                                        goto valid_version
+                                          if  $this_version eq $string_version;
+                                        goto valid_version
+                                            if  "$this_version.0"
+                                                            eq $string_version;
+                                    }
                                 }
-                            }
+                            } while (<$file_handle>);
+
                             goto no_version;
                         }
                     }
@@ -2936,6 +2951,9 @@ END
                     $self->carp_bad_line("Unexpected \@missing line.  Assuming no missing entries");
                 }
                 elsif ($has_missings_defaults{$addr} == $NOT_IGNORED) {
+                    my $start = $1;     # The pattern saves the beginning and
+                    my $end = $2;       # end points of the range the default
+                                        # is for
                     my @defaults = split /\s* ; \s*/x, $_;
 
                     # The first field is the @missing, which ends in a
@@ -3003,8 +3021,13 @@ END
                             $default = "Unknown";
                         }
 
-                        # Store them as a sub-arrays with both components.
-                        push @{$missings{$addr}}, [ $default, $property ];
+                        # Store them as a sub-hash as part of an array, with
+                        # both components.
+                        push @{$missings{$addr}}, { start    => hex $start,
+                                                    end      => hex $end,
+                                                    default  => $default,
+                                                    property => $property
+                                                  };
                     }
                 }
 
@@ -3218,9 +3241,9 @@ END
 
     sub get_missings($self) {
         # Returns the stored up @missings lines' values, and clears the list.
-        # The values are in an array, consisting of the default in the first
-        # element, and the property in the 2nd.  However, since these lines
-        # can be stacked up, the return is an array of all these arrays.
+        # The values are in a hash, consisting of 'default' and 'property'.
+        # However, since these lines can be stacked up, the return is an array
+        # of all these hashes.
 
         my $addr = pack 'J', refaddr $self;
 
@@ -3346,13 +3369,19 @@ END
 
 package Multi_Default;
 
+sub trace { return main::trace(@_); }
+
 # Certain properties in early versions of Unicode had more than one possible
 # default for code points missing from the files.  In these cases, one
 # default applies to everything left over after all the others are applied,
 # and for each of the others, there is a description of which class of code
 # points applies to it.  This object helps implement this by storing the
 # defaults, and for all but that final default, an eval string that generates
-# the class that it applies to.
+# the class that it applies to.  That class must be a Range_List, or contains
+# a Range_List that the overloaded operators recognize as to be operated on.
+# A string is used because this is called early when we know symbolically what
+# needs to be done, but typically before any data is gathered.  Thus the
+# evaluation gets delayed until we have at hand all the needed information.
 
 {   # Closure
 
@@ -3360,12 +3389,13 @@ package Multi_Default;
 
     my %class_defaults;
     # The defaults structure for the classes
-    main::set_access('class_defaults', \%class_defaults);
+    main::set_access('class_defaults', \%class_defaults, 'readable_array');
 
     my %other_default;
     # The default that applies to everything left over.
     main::set_access('other_default', \%other_default, 'r');
 
+    my %iterator;
 
     sub new {
         # The constructor is called with default => eval pairs, terminated by
@@ -3385,22 +3415,41 @@ package Multi_Default;
 
         my $self = bless \do{my $anonymous_scalar}, $class;
         my $addr = pack 'J', refaddr $self;
+        $iterator{$addr} = 0;
+
+        return $self unless @_;
 
         while (@_ > 1) {
-            my $default = shift;
-            my $eval = shift;
-            $class_defaults{$addr}->{$default} = $eval;
+            $self->append_default(shift, shift);
         }
 
-        $other_default{$addr} = shift;
+        $self->set_final_default(shift);
 
         return $self;
     }
 
+    sub append_default($self, $new_default, $eval) {
+        my $addr = pack 'J', refaddr $self;
+
+        # Pushes a default setting to the current list
+        push $class_defaults{$addr}->@*, [ $new_default, $eval ];
+    }
+
+    sub set_final_default($self, $new_default) {
+        my $addr = pack 'J', refaddr $self;
+        $other_default{$addr} = $new_default;
+    }
+
     sub get_next_defaults($self) {
         # Iterates and returns the next class of defaults.
 
-        return each %{$class_defaults{pack 'J', refaddr $self}};
+        my $addr = pack 'J', refaddr $self;
+        if ($iterator{$addr}++ < $class_defaults{$addr}->@*) {
+            return $class_defaults{$addr}->[$iterator{$addr}-1]->@*;
+        }
+
+        $iterator{$addr} = 0;
+        return undef;
     }
 }
 
@@ -3642,7 +3691,10 @@ sub trace { return main::trace(@_); }
         my $class = shift;
         my %args = @_;
 
-        # Optional initialization data for the range list.
+        # Optional initialization data for the range list.  NOTE: For large
+        # ranges, it is better to use Range object rather than
+        #   [ low .. high ]
+        # as it iterates through each one individually in the latter case.
         my $initialize = delete $args{'Initialize'};
 
         my $self;
@@ -8633,7 +8685,7 @@ package Property;
 # starts with unknown type, overridden by a parameter to the constructor, or
 # as match tables are added, or ranges added to the map table, the data is
 # inspected, and the type changed.  After the table is mostly or entirely
-# filled, compute_type() should be called to finalize they analysis.
+# filled, compute_type() should be called to finalize the analysis.
 #
 # There are very few operations defined.  One can safely remove a range from
 # the map table, and property_add_or_replace_non_nulls() adds the maps from another
@@ -9828,7 +9880,7 @@ sub UCD_name ($table, $alias) {
     }
 }
 
-sub dump_inside_out( $object, $fields_ref ) {
+sub dump_inside_out( $object, $fields_ref, @args ) {
     # Dump inside-out hashes in an object's state by converting them to a
     # regular hash and then calling simple_dumper on that.
 
@@ -9839,7 +9891,7 @@ sub dump_inside_out( $object, $fields_ref ) {
         $hash{$key} = $fields_ref->{$key}{$addr};
     }
 
-    return simple_dumper(\%hash, $object, $fields_ref);
+    return simple_dumper(\%hash, @args);
 }
 
 sub _operator_dot($self, $other="", $reversed=0) {
@@ -9989,8 +10041,25 @@ sub finish_property_setup($file) {
         }
     }
 
-    # The following use the Multi_Default class to create objects for
-    # defaults.
+    # For backwards compatibility with applications that may read the mapping
+    # file directly (it was documented in 5.12 and 5.14 as being thusly
+    # usable), keep it from being adjusted.  (range_size_1 is
+    # used to force the traditional format.)
+    if (defined (my $nfkc_cf = property_ref('NFKC_Casefold'))) {
+        $nfkc_cf->set_to_output_map($EXTERNAL_MAP);
+        $nfkc_cf->set_range_size_1(1);
+    }
+    if (defined (my $bmg = property_ref('Bidi_Mirroring_Glyph'))) {
+        $bmg->set_to_output_map($EXTERNAL_MAP);
+        $bmg->set_range_size_1(1);
+    }
+
+    property_ref('Numeric_Value')->set_to_output_map($OUTPUT_ADJUSTED);
+
+    # The rest of this sub is for properties that need the Multi_Default class
+    # to create objects for defaults.  As of v15.0, this is no longer needed.
+
+    return if $v_version ge v15.0.0;
 
     # Bidi class has a complicated default, but the derived file takes care of
     # the complications, leaving just 'L'.
@@ -10076,21 +10145,6 @@ sub finish_property_setup($file) {
         }
     }
 
-    # For backwards compatibility with applications that may read the mapping
-    # file directly (it was documented in 5.12 and 5.14 as being thusly
-    # usable), keep it from being adjusted.  (range_size_1 is
-    # used to force the traditional format.)
-    if (defined (my $nfkc_cf = property_ref('NFKC_Casefold'))) {
-        $nfkc_cf->set_to_output_map($EXTERNAL_MAP);
-        $nfkc_cf->set_range_size_1(1);
-    }
-    if (defined (my $bmg = property_ref('Bidi_Mirroring_Glyph'))) {
-        $bmg->set_to_output_map($EXTERNAL_MAP);
-        $bmg->set_range_size_1(1);
-    }
-
-    property_ref('Numeric_Value')->set_to_output_map($OUTPUT_ADJUSTED);
-
     return;
 }
 
@@ -10390,10 +10444,11 @@ END
     # entries in the file, and may not show up until the end.
     my @defaults = $file->get_missings;
     foreach my $default_ref (@defaults) {
-        my $default = $default_ref->[0];
-        my $property = property_ref($default_ref->[1]);
+        my $default = $default_ref->{default};
+        my $property = property_ref($default_ref->{property});
         $property->set_default_map($default);
     }
+
     return;
 }
 
@@ -10865,22 +10920,21 @@ sub output_perl_charnames_line ($code_point, $name) {
 
                 # If not the first time for this property, retrieve info about
                 # it from the cache
-                if (defined ($property_info{$property_addr}{$TYPE})) {
-                    $property_type = $property_info{$property_addr}{$TYPE};
-                    $default_map = $property_info{$property_addr}{$DEFAULT_MAP};
-                    $map_type
-                        = $property_info{$property_addr}{$PSEUDO_MAP_TYPE};
-                    $default_table
-                            = $property_info{$property_addr}{$DEFAULT_TABLE};
+                my $this_property_info = $property_info{$property_addr};
+                if (defined ($this_property_info->{$TYPE})) {
+                    $property_type = $this_property_info->{$TYPE};
+                    $default_map = $this_property_info->{$DEFAULT_MAP};
+                    $map_type = $this_property_info->{$PSEUDO_MAP_TYPE};
+                    $default_table = $this_property_info->{$DEFAULT_TABLE};
                 }
                 else {
 
                     # Here, is the first time for this property.  Set up the
                     # cache.
-                    $property_type = $property_info{$property_addr}{$TYPE}
+                    $property_type = $this_property_info->{$TYPE}
                                    = $property_object->type;
                     $map_type
-                        = $property_info{$property_addr}{$PSEUDO_MAP_TYPE}
+                        = $this_property_info->{$PSEUDO_MAP_TYPE}
                         = $property_object->pseudo_map_type;
 
                     # The Unicode files are set up so that if the map is not
@@ -10893,9 +10947,8 @@ sub output_perl_charnames_line ($code_point, $name) {
                         }
                         else {
                             $property_object->set_type($BINARY);
-                            $property_type
-                                = $property_info{$property_addr}{$TYPE}
-                                = $BINARY;
+                            $property_type = $this_property_info->{$TYPE}
+                                           = $BINARY;
                         }
                     }
 
@@ -10905,11 +10958,19 @@ sub output_perl_charnames_line ($code_point, $name) {
                     # stored by the Input_file class until we access it here.
                     # It's possible that there is more than one such line
                     # waiting for us; collect them all, and parse
-                    my @missings_list = $file->get_missings
+                    my @missings_list;
+                    @missings_list = $file->get_missings
                                             if $file->has_missings_defaults;
+
                     foreach my $default_ref (@missings_list) {
-                        my $default = $default_ref->[0];
-                        my $addr = pack 'J', refaddr property_ref($default_ref->[1]);
+
+                        # For now, we are only interested in the fallback
+                        # default for the entire property. i.e., an @missing
+                        # line that is for the whole Unicode range.
+                        next if $default_ref->{start} != 0
+                             || $default_ref->{end} != $MAX_UNICODE_CODEPOINT;
+
+                        $default_map = $default_ref->{default};
 
                         # For string properties, the default is just what the
                         # file says, but non-string properties should already
@@ -10919,105 +10980,172 @@ sub output_perl_charnames_line ($code_point, $name) {
                         if ($property_type == $STRING
                             || $property_type == $UNKNOWN)
                         {
-                            $property_info{$addr}{$MISSINGS} = $default;
+                            $this_property_info->{$MISSINGS} = $default_map;
                         }
                         else {
-                            $property_info{$addr}{$MISSINGS}
-                                        = $property_object->table($default);
+                            $default_map =
+                               $property_object->table($default_map)->full_name;
+                            $this_property_info->{$MISSINGS} = $default_map;
+                            $this_property_info->{$DEFAULT_MAP} = $default_map;
+                            if (! defined $property_object->default_map) {
+                                $property_object->set_default_map($default_map);
+                            }
                         }
                     }
 
-                    # Finished storing all the @missings defaults in the input
-                    # file so far.  Get the one for the current property.
-                    my $missings = $property_info{$property_addr}{$MISSINGS};
+                    # For later Unicode versions, multiple @missing lines for
+                    # a single property can appear in the files.  The first
+                    # always applies to the entire Unicode range, and was
+                    # handled above.  The subsequent ones are for smaller
+                    # ranges, and can be read as "But for this range, the
+                    # default is ...".  So each overrides all the preceding
+                    # ones for the range it applies to.  Typically they apply
+                    # to disjoint ranges, but don't have to.  What we do is to
+                    # set them up to work in reverse order, so that after the
+                    # rest of the table is filled, the highest priority
+                    # default range fills in any code points that haven't been
+                    # specified; then the next highest priority one is
+                    # applied, and so forth.
+                    if (@missings_list > 1 && $v_version ge v15.0.0) {
+                        if ($property_type != $ENUM) {
+                            Carp::my_carp_bug("Multiple \@missings lines only"
+                                            . " make sense for ENUM-type"
+                                            . " properties.  Changing type to"
+                                            . " that");
+                            $property_type = $this_property_info->{$TYPE}
+                                                                        = $ENUM;
+                            $property_object->set_type($ENUM);
+                        }
 
-                    # But we likely have separately stored what the default
-                    # should be.  (This is to accommodate versions of the
-                    # standard where the @missings lines are absent or
-                    # incomplete.)  Hopefully the two will match.  But check
-                    # it out.
-                    $default_map = $property_object->default_map;
+                        my $multi = Multi_Default->new();
+
+                        # The overall default should be first on this list,
+                        # and is handled differently than the rest.
+                        $default_map = shift @missings_list;
+                        Carp::my_carp_bug("\@missings needs to be entire range")
+                            if $default_map->{start} != 0
+                            || $default_map->{end} != $MAX_UNICODE_CODEPOINT;
+
+                        # We already have looked at this line above.  Use that
+                        # result
+                        $multi->set_final_default($this_property_info->
+                                                                  {$MISSINGS});
+
+                        # Now get the individual range elements, and add them
+                        # to Multi_Default object
+                        while (@missings_list) {
+                            my $this_entry = pop @missings_list;
+                            my $subrange_default = $this_entry->{default};
+
+                            # Use the short name as a standard
+                            $subrange_default = $property_object->
+                                        table($subrange_default)->short_name;
+                            $multi->append_default($subrange_default,
+                                "Range_List->new(Initialize => Range->new("
+                              . "$this_entry->{start}, $this_entry->{end}))");
+                        }
 
-                    # If the map is a ref, it means that the default won't be
-                    # processed until later, so undef it, so next few lines
-                    # will redefine it to something that nothing will match
-                    undef $default_map if ref $default_map;
+                        # Override the property's simple default with this.
+                        $property_object->set_default_map($multi);
+                    }
 
-                    # Create a $default_map if don't have one; maybe a dummy
-                    # that won't match anything.
-                    if (! defined $default_map) {
+                    if (! $default_map || $property_type != $ENUM) {
+
+                        # Finished storing all the @missings defaults in the
+                        # input file so far.  Get the one for the current
+                        # property.
+                        my $missings = $this_property_info->{$MISSINGS};
+
+                        # But we likely have separately stored what the
+                        # default should be.  (This is to accommodate versions
+                        # of the standard where the @missings lines are absent
+                        # or incomplete.)  Hopefully the two will match.  But
+                        # check it out.
+                        $default_map = $property_object->default_map;
+
+                        # If the map is a ref, it means that the default won't
+                        # be processed until later, so undef it, so next few
+                        # lines will redefine it to something that nothing
+                        # will match
+                        undef $default_map if ref $default_map;
+
+                        # Create a $default_map if don't have one; maybe a
+                        # dummy that won't match anything.
+                        if (! defined $default_map) {
+
+                            # Use any @missings line in the file.
+                            if (defined $missings) {
+                                if (ref $missings) {
+                                    $default_map = $missings->full_name;
+                                    $default_table = $missings;
+                                }
+                                else {
+                                    $default_map = $missings;
+                                }
 
-                        # Use any @missings line in the file.
-                        if (defined $missings) {
-                            if (ref $missings) {
-                                $default_map = $missings->full_name;
-                                $default_table = $missings;
+                                # And store it with the property for outside
+                                # use.
+                                $property_object->set_default_map($default_map);
                             }
                             else {
-                                $default_map = $missings;
-                            }
-
-                            # And store it with the property for outside use.
-                            $property_object->set_default_map($default_map);
-                        }
-                        else {
 
-                            # Neither an @missings nor a default map.  Create
-                            # a dummy one, so won't have to test definedness
-                            # in the main loop.
-                            $default_map = '_Perl This will never be in a file
-                                            from Unicode';
+                                # Neither an @missings nor a default map.
+                                # Create a dummy one, so won't have to test
+                                # definedness in the main loop.
+                                $default_map = '_Perl This will never be in a'
+                                             . ' file from Unicode';
+                            }
                         }
-                    }
 
-                    # Here, we have $default_map defined, possibly in terms of
-                    # $missings, but maybe not, and possibly is a dummy one.
-                    if (defined $missings) {
+                        # Here, we have $default_map defined, possibly in
+                        # terms of $missings, but maybe not, and possibly is a
+                        # dummy one.
+                        if (defined $missings) {
 
-                        # Make sure there is no conflict between the two.
-                        # $missings has priority.
-                        if (ref $missings) {
-                            $default_table
+                            # Make sure there is no conflict between the two.
+                            # $missings has priority.
+                            if (ref $missings) {
+                                $default_table
                                         = $property_object->table($default_map);
-                            if (! defined $default_table
-                                || $default_table != $missings)
-                            {
-                                if (! defined $default_table) {
-                                    $default_table = $UNDEF;
-                                }
-                                $file->carp_bad_line(<<END
+                                if ( ! defined $default_table
+                                    || $default_table != $missings)
+                                {
+                                    if (! defined $default_table) {
+                                        $default_table = $UNDEF;
+                                    }
+                                    $file->carp_bad_line(<<END
 The \@missings line for $property_name in $file says that missings default to
 $missings, but we expect it to be $default_table.  $missings used.
 END
-                                );
-                                $default_table = $missings;
-                                $default_map = $missings->full_name;
+                                    );
+                                    $default_table = $missings;
+                                    $default_map = $missings->full_name;
+                                }
+                                $this_property_info->{$DEFAULT_TABLE}
+                                                            = $default_table;
                             }
-                            $property_info{$property_addr}{$DEFAULT_TABLE}
-                                                        = $default_table;
-                        }
-                        elsif ($default_map ne $missings) {
-                            $file->carp_bad_line(<<END
+                            elsif ($default_map ne $missings) {
+                                $file->carp_bad_line(<<END
 The \@missings line for $property_name in $file says that missings default to
 $missings, but we expect it to be $default_map.  $missings used.
 END
-                            );
-                            $default_map = $missings;
+                                );
+                                $default_map = $missings;
+                            }
                         }
-                    }
 
-                    $property_info{$property_addr}{$DEFAULT_MAP}
-                                                    = $default_map;
+                        $this_property_info->{$DEFAULT_MAP} = $default_map;
 
-                    # If haven't done so already, find the table corresponding
-                    # to this map for non-string properties.
-                    if (! defined $default_table
-                        && $property_type != $STRING
-                        && $property_type != $UNKNOWN)
-                    {
-                        $default_table = $property_info{$property_addr}
-                                                        {$DEFAULT_TABLE}
-                                    = $property_object->table($default_map);
+                        # If haven't done so already, find the table
+                        # corresponding to this map for non-string properties.
+                        if (! defined $default_table
+                            && $property_type != $STRING
+                            && $property_type != $UNKNOWN)
+                        {
+                            $default_table
+                                        = $this_property_info->{$DEFAULT_TABLE}
+                                        = $property_object->table($default_map);
+                        }
                     }
                 } # End of is first time for this property
             } # End of switching properties.
@@ -11047,7 +11175,8 @@ END
                 }
             }
 
-            if ($default_map eq $CODE_POINT && $map =~ / ^ $code_point_re $/x)
+            if (   $default_map eq $CODE_POINT
+                && $map =~ / ^ $code_point_re $/x)
             {
 
                 # Here, we have a map to a particular code point, and the
@@ -11082,14 +11211,45 @@ END
                 }
             }
 
-            # If we can tell that this is a synonym for the default map, use
-            # the default one instead.
-            if ($property_type != $STRING
-                && $property_type != $UNKNOWN)
-            {
+            if ($property_type != $STRING && $property_type != $UNKNOWN) {
                 my $table = $property_object->table($map);
-                if (defined $table && $table == $default_table) {
-                    $map = $default_map;
+                if (defined $table) {
+
+                    # Unicode isn't very consistent about which synonym they
+                    # use in their .txt files, even within the same file, or
+                    # two files that are for the same property.  For enum
+                    # properties, we know already what all the synonyms are
+                    # (because we processed PropValueAliases already).
+                    # Therefore we can take the input and map it to a uniform
+                    # value now, saving us trouble later.
+                    #
+                    # Only if the map is well-behaved do we try this:
+                    # non-empty, all non-blank.
+                    if ($property_type == $ENUM && $map =~ / ^ \S+ $ /x) {
+
+                        # Use existing practice as much as easily practicable,
+                        # so that code that has assumptions about spelling
+                        # doesn't have to change
+                        my $short_name = $property_object->short_name;
+                        if ($short_name =~ / ^ (BC | EA | GC  |HST | JT |
+                                                Lb | BT | BPT | NFCQC |
+                                                NFKCQC) $ /ix)
+                        {
+                            $map = $table->short_name;
+                        }
+                        elsif ($short_name !~ / ^ ( Ccc | Age | InSC | JG |
+                                                    SB) $ /ix)
+                        {
+                            $map = $table->full_name;
+                        }
+                    }
+                    elsif ($table == $default_table) {
+
+                        # When it isn't an ENUM, we we can still tell if
+                        # this is a synonym for the default map.  If so, use
+                        # the default one instead.
+                        $map = $default_map;
+                    }
                 }
             }
 
@@ -13324,6 +13484,7 @@ END
             #
             # Go through each list.
             while (my ($default, $eval) = $default_map->get_next_defaults) {
+                last unless defined $eval;
 
                 # Get the class list, and intersect it with all the so-far
                 # unspecified code points yielding all the code points
@@ -13341,7 +13502,7 @@ END
                 # Add mappings to the property for each code point in the list
                 foreach my $range ($list->ranges) {
                     $property->add_map($range->start, $range->end, $default,
-                    Replace => $CROAK);
+                    Replace => $NO);
                 }
             }
 
@@ -17196,10 +17357,6 @@ sub make_Name_pm () {
 $HEADER
 $INTERNAL_ONLY_HEADER
 
-=head1 NAME -- Internal generated file for use by charnames
-
-=cut
-
 END
 
     # Convert these structures to output format.
@@ -19062,6 +19219,7 @@ my $Indic_Skip
             = "Provisional; for the analysis and processing of Indic scripts";
 my $Validation = "Validation Tests";
 my $Validation_Documentation = "Documentation of validation Tests";
+my $Unused_Skip = "Currently unused by Perl";
 
 # This is a list of the input files and how to handle them.  The files are
 # processed in their order in this list.  Some reordering is possible if
@@ -19625,6 +19783,18 @@ my @input_file_objects = (
                     Property => 'Identifier_Type',
                     UCD => 0,
                    ),
+    Input_file->new('confusables.txt', v15.0.0,
+                    Skip => $Unused_Skip,
+                    UCD => 0,
+                   ),
+    Input_file->new('confusablesSummary.txt', v15.0.0,
+                    Skip => $Unused_Skip,
+                    UCD => 0,
+                   ),
+    Input_file->new('intentional.txt', v15.0.0,
+                    Skip => $Unused_Skip,
+                    UCD => 0,
+                   ),
 );
 
 # End of all the preliminaries.
index 823193b..c1f1680 100644 (file)
@@ -5,7 +5,7 @@ use warnings;
 
 our $hint_bits = 0x00800000;
 
-our $VERSION = '1.24';
+our $VERSION = '1.25';
 our $AUTOLOAD;
 
 sub import {
@@ -114,6 +114,8 @@ sequence in the native encoding (Latin-1 or EBCDIC) to UTF-8. The
 logical character sequence itself is unchanged.  If I<$string> is already
 upgraded, then this is a no-op. Returns the
 number of octets necessary to represent the string as UTF-8.
+Since Perl v5.38, if C<$string> is C<undef> no action is taken; prior to that,
+it would be converted to be defined and zero-length.
 
 If your code needs to be compatible with versions of perl without
 C<use feature 'unicode_strings';>, you can force Unicode semantics on
index d35110b..fa69fcb 100644 (file)
@@ -669,6 +669,9 @@ for(__PACKAGE__) {
        eval { utf8::upgrade($_) };
        is $@, "", 'no error with utf8::upgrade on read-only COW';
 }
+
+is(utf8::upgrade(undef), undef, "Returns undef for undef input"); # GH #20419
+
 # This one croaks, but not because the scalar is read-only
 eval "package \x{100};\n" . <<'END'
     for(__PACKAGE__) {
index fb53a99..f2d47ac 100644 (file)
@@ -1,11 +1,11 @@
-# -*- buffer-read-only: t -*-
+# -*- mode: Perl; buffer-read-only: t -*-
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!!
 # This file is built by regen/warnings.pl.
 # Any changes made here will be lost!
 
 package warnings;
 
-our $VERSION = "1.58";
+our $VERSION = "1.65";
 
 # Verify that we're called correctly so that warnings will work.
 # Can't use Carp, since Carp uses us!
@@ -68,57 +68,69 @@ our %Offsets = (
     'imprecision'                      => 92,
     'illegalproto'                     => 94,
 
+    # Warnings Categories added in Perl 5.011003
+    'deprecated::goto_construct'       => 96,
+    'deprecated::unicode_property_name'        => 98,
+
     # Warnings Categories added in Perl 5.013
-    'non_unicode'                      => 96,
-    'nonchar'                          => 98,
-    'surrogate'                                => 100,
+    'non_unicode'                      => 100,
+    'nonchar'                          => 102,
+    'surrogate'                                => 104,
 
     # Warnings Categories added in Perl 5.017
-    'experimental'                     => 102,
-    'experimental::lexical_subs'       => 104,
-    'experimental::regex_sets'         => 106,
-    'experimental::smartmatch'         => 108,
+    'experimental'                     => 106,
+    'experimental::regex_sets'         => 108,
 
     # Warnings Categories added in Perl 5.019
-    'experimental::postderef'          => 110,
-    'experimental::signatures'         => 112,
-    'syscalls'                         => 114,
+    'syscalls'                         => 110,
 
     # Warnings Categories added in Perl 5.021
-    'experimental::bitwise'            => 116,
-    'experimental::const_attr'         => 118,
-    'experimental::re_strict'          => 120,
-    'experimental::refaliasing'                => 122,
-    'locale'                           => 124,
-    'missing'                          => 126,
-    'redundant'                                => 128,
+    'experimental::const_attr'         => 112,
+    'experimental::re_strict'          => 114,
+    'experimental::refaliasing'                => 116,
+    'locale'                           => 118,
+    'missing'                          => 120,
+    'redundant'                                => 122,
 
     # Warnings Categories added in Perl 5.025
-    'experimental::declared_refs'      => 130,
+    'experimental::declared_refs'      => 124,
+
+    # Warnings Categories added in Perl 5.025011
+    'deprecated::dot_in_inc'           => 126,
 
     # Warnings Categories added in Perl 5.027
-    'experimental::alpha_assertions'   => 132,
-    'experimental::script_run'         => 134,
-    'shadow'                           => 136,
+    'shadow'                           => 128,
 
     # Warnings Categories added in Perl 5.029
-    'experimental::private_use'                => 138,
-    'experimental::uniprop_wildcards'  => 140,
-    'experimental::vlb'                        => 142,
-
-    # Warnings Categories added in Perl 5.031
-    'experimental::isa'                        => 144,
+    'experimental::private_use'                => 130,
+    'experimental::uniprop_wildcards'  => 132,
+    'experimental::vlb'                        => 134,
 
     # Warnings Categories added in Perl 5.033
-    'experimental::try'                        => 146,
+    'experimental::try'                        => 136,
 
     # Warnings Categories added in Perl 5.035
-    'experimental::args_array_with_signatures'=> 148,
-    'experimental::builtin'            => 150,
-    'experimental::defer'              => 152,
-    'experimental::extra_paired_delimiters'=> 154,
-    'experimental::for_list'           => 156,
-    'scalar'                           => 158,
+    'experimental::args_array_with_signatures'=> 138,
+    'experimental::builtin'            => 140,
+    'experimental::defer'              => 142,
+    'experimental::extra_paired_delimiters'=> 144,
+    'experimental::for_list'           => 146,
+    'scalar'                           => 148,
+
+    # Warnings Categories added in Perl 5.035009
+    'deprecated::version_downgrade'    => 150,
+
+    # Warnings Categories added in Perl 5.03501
+    'deprecated::delimiter_will_be_paired'=> 152,
+
+    # Warnings Categories added in Perl 5.037
+    'experimental::class'              => 154,
+
+    # Warnings Categories added in Perl 5.037009
+    'deprecated::apostrophe_as_package_separator'=> 156,
+
+    # Warnings Categories added in Perl 5.03701
+    'deprecated::smartmatch'           => 158,
 );
 
 our %Bits = (
@@ -128,47 +140,47 @@ our %Bits = (
     'closed'                           => "\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [6]
     'closure'                          => "\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [1]
     'debugging'                                => "\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [22]
-    'deprecated'                       => "\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [2]
+    'deprecated'                       => "\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x40\x00\x00\x40\x51", # [2,48,49,63,75,76,78,79]
+    'deprecated::apostrophe_as_package_separator'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10", # [78]
+    'deprecated::delimiter_will_be_paired'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01", # [76]
+    'deprecated::dot_in_inc'           => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00", # [63]
+    'deprecated::goto_construct'       => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00", # [48]
+    'deprecated::smartmatch'           => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40", # [79]
+    'deprecated::unicode_property_name'        => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00", # [49]
+    'deprecated::version_downgrade'    => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00", # [75]
     'digit'                            => "\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [31]
     'exec'                             => "\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [7]
     'exiting'                          => "\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [3]
-    'experimental'                     => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x55\x51\x05\x54\x54\x55\x15", # [51..56,58..61,65..67,69..78]
-    'experimental::alpha_assertions'   => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00", # [66]
-    'experimental::args_array_with_signatures'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00", # [74]
-    'experimental::bitwise'            => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00", # [58]
-    'experimental::builtin'            => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00", # [75]
-    'experimental::const_attr'         => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00", # [59]
-    'experimental::declared_refs'      => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00", # [65]
-    'experimental::defer'              => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01", # [76]
-    'experimental::extra_paired_delimiters'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04", # [77]
-    'experimental::for_list'           => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10", # [78]
-    'experimental::isa'                        => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00", # [72]
-    'experimental::lexical_subs'       => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00", # [52]
-    'experimental::postderef'          => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00", # [55]
-    'experimental::private_use'                => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00", # [69]
-    'experimental::re_strict'          => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00", # [60]
-    'experimental::refaliasing'                => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00", # [61]
-    'experimental::regex_sets'         => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00", # [53]
-    'experimental::script_run'         => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00", # [67]
-    'experimental::signatures'         => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00", # [56]
-    'experimental::smartmatch'         => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00", # [54]
-    'experimental::try'                        => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00", # [73]
-    'experimental::uniprop_wildcards'  => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00", # [70]
-    'experimental::vlb'                        => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00", # [71]
+    'experimental'                     => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x15\x10\x54\x55\x05\x04", # [53,54,56..58,62,65..73,77]
+    'experimental::args_array_with_signatures'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00", # [69]
+    'experimental::builtin'            => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00", # [70]
+    'experimental::class'              => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04", # [77]
+    'experimental::const_attr'         => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00", # [56]
+    'experimental::declared_refs'      => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00", # [62]
+    'experimental::defer'              => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00", # [71]
+    'experimental::extra_paired_delimiters'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00", # [72]
+    'experimental::for_list'           => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00", # [73]
+    'experimental::private_use'                => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00", # [65]
+    'experimental::re_strict'          => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00", # [57]
+    'experimental::refaliasing'                => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00", # [58]
+    'experimental::regex_sets'         => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00", # [54]
+    'experimental::try'                        => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00", # [68]
+    'experimental::uniprop_wildcards'  => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00", # [66]
+    'experimental::vlb'                        => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00", # [67]
     'glob'                             => "\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [4]
     'illegalproto'                     => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00", # [47]
     'imprecision'                      => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00", # [46]
     'inplace'                          => "\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [23]
     'internal'                         => "\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [24]
-    'io'                               => "\x00\x54\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00", # [5..11,57]
+    'io'                               => "\x00\x54\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00", # [5..11,55]
     'layer'                            => "\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [8]
-    'locale'                           => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00", # [62]
+    'locale'                           => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00", # [59]
     'malloc'                           => "\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [25]
     'misc'                             => "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [12]
-    'missing'                          => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00", # [63]
+    'missing'                          => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00", # [60]
     'newline'                          => "\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [9]
-    'non_unicode'                      => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00", # [48]
-    'nonchar'                          => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00", # [49]
+    'non_unicode'                      => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00", # [50]
+    'nonchar'                          => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00", # [51]
     'numeric'                          => "\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [13]
     'once'                             => "\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [14]
     'overflow'                         => "\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [15]
@@ -182,25 +194,25 @@ our %Bits = (
     'qw'                               => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [36]
     'recursion'                                => "\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [18]
     'redefine'                         => "\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [19]
-    'redundant'                                => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00", # [64]
+    'redundant'                                => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00", # [61]
     'regexp'                           => "\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [20]
     'reserved'                         => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [37]
-    'scalar'                           => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40", # [79]
+    'scalar'                           => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00", # [74]
     'semicolon'                                => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [38]
     'severe'                           => "\x00\x00\x00\x00\x00\x54\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [21..25]
-    'shadow'                           => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00", # [68]
+    'shadow'                           => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00", # [64]
     'signal'                           => "\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [26]
     'substr'                           => "\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [27]
-    'surrogate'                                => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00", # [50]
+    'surrogate'                                => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00", # [52]
     'syntax'                           => "\x00\x00\x00\x00\x00\x00\x00\x55\x55\x15\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00", # [28..38,47]
-    'syscalls'                         => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00", # [57]
+    'syscalls'                         => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00", # [55]
     'taint'                            => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [39]
     'threads'                          => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [40]
     'uninitialized'                    => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [41]
     'unopened'                         => "\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [11]
     'unpack'                           => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [42]
     'untie'                            => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [43]
-    'utf8'                             => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x15\x00\x00\x00\x00\x00\x00\x00", # [44,48..50]
+    'utf8'                             => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x50\x01\x00\x00\x00\x00\x00\x00", # [44,50..52]
     'void'                             => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00", # [45]
 );
 
@@ -211,47 +223,47 @@ our %DeadBits = (
     'closed'                           => "\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [6]
     'closure'                          => "\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [1]
     'debugging'                                => "\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [22]
-    'deprecated'                       => "\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [2]
+    'deprecated'                       => "\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x80\x00\x00\x80\xa2", # [2,48,49,63,75,76,78,79]
+    'deprecated::apostrophe_as_package_separator'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20", # [78]
+    'deprecated::delimiter_will_be_paired'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02", # [76]
+    'deprecated::dot_in_inc'           => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00", # [63]
+    'deprecated::goto_construct'       => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00", # [48]
+    'deprecated::smartmatch'           => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80", # [79]
+    'deprecated::unicode_property_name'        => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00", # [49]
+    'deprecated::version_downgrade'    => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00", # [75]
     'digit'                            => "\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [31]
     'exec'                             => "\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [7]
     'exiting'                          => "\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [3]
-    'experimental'                     => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\xaa\xa2\x0a\xa8\xa8\xaa\x2a", # [51..56,58..61,65..67,69..78]
-    'experimental::alpha_assertions'   => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00", # [66]
-    'experimental::args_array_with_signatures'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00", # [74]
-    'experimental::bitwise'            => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00", # [58]
-    'experimental::builtin'            => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00", # [75]
-    'experimental::const_attr'         => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00", # [59]
-    'experimental::declared_refs'      => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00", # [65]
-    'experimental::defer'              => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02", # [76]
-    'experimental::extra_paired_delimiters'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08", # [77]
-    'experimental::for_list'           => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20", # [78]
-    'experimental::isa'                        => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00", # [72]
-    'experimental::lexical_subs'       => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00", # [52]
-    'experimental::postderef'          => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00", # [55]
-    'experimental::private_use'                => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00", # [69]
-    'experimental::re_strict'          => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00", # [60]
-    'experimental::refaliasing'                => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00", # [61]
-    'experimental::regex_sets'         => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00", # [53]
-    'experimental::script_run'         => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00", # [67]
-    'experimental::signatures'         => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00", # [56]
-    'experimental::smartmatch'         => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00", # [54]
-    'experimental::try'                        => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00", # [73]
-    'experimental::uniprop_wildcards'  => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00", # [70]
-    'experimental::vlb'                        => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00", # [71]
+    'experimental'                     => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x28\x2a\x20\xa8\xaa\x0a\x08", # [53,54,56..58,62,65..73,77]
+    'experimental::args_array_with_signatures'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00", # [69]
+    'experimental::builtin'            => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00", # [70]
+    'experimental::class'              => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08", # [77]
+    'experimental::const_attr'         => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00", # [56]
+    'experimental::declared_refs'      => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00", # [62]
+    'experimental::defer'              => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00", # [71]
+    'experimental::extra_paired_delimiters'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00", # [72]
+    'experimental::for_list'           => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00", # [73]
+    'experimental::private_use'                => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00", # [65]
+    'experimental::re_strict'          => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00", # [57]
+    'experimental::refaliasing'                => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00", # [58]
+    'experimental::regex_sets'         => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00", # [54]
+    'experimental::try'                        => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00", # [68]
+    'experimental::uniprop_wildcards'  => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00", # [66]
+    'experimental::vlb'                        => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00", # [67]
     'glob'                             => "\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [4]
     'illegalproto'                     => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00", # [47]
     'imprecision'                      => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00", # [46]
     'inplace'                          => "\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [23]
     'internal'                         => "\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [24]
-    'io'                               => "\x00\xa8\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00", # [5..11,57]
+    'io'                               => "\x00\xa8\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00", # [5..11,55]
     'layer'                            => "\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [8]
-    'locale'                           => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00", # [62]
+    'locale'                           => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00", # [59]
     'malloc'                           => "\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [25]
     'misc'                             => "\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [12]
-    'missing'                          => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00", # [63]
+    'missing'                          => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00", # [60]
     'newline'                          => "\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [9]
-    'non_unicode'                      => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00", # [48]
-    'nonchar'                          => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00", # [49]
+    'non_unicode'                      => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00", # [50]
+    'nonchar'                          => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00", # [51]
     'numeric'                          => "\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [13]
     'once'                             => "\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [14]
     'overflow'                         => "\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [15]
@@ -265,31 +277,42 @@ our %DeadBits = (
     'qw'                               => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [36]
     'recursion'                                => "\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [18]
     'redefine'                         => "\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [19]
-    'redundant'                                => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00", # [64]
+    'redundant'                                => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00", # [61]
     'regexp'                           => "\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [20]
     'reserved'                         => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [37]
-    'scalar'                           => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80", # [79]
+    'scalar'                           => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00", # [74]
     'semicolon'                                => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [38]
     'severe'                           => "\x00\x00\x00\x00\x00\xa8\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [21..25]
-    'shadow'                           => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00", # [68]
+    'shadow'                           => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00", # [64]
     'signal'                           => "\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [26]
     'substr'                           => "\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [27]
-    'surrogate'                                => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00", # [50]
+    'surrogate'                                => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00", # [52]
     'syntax'                           => "\x00\x00\x00\x00\x00\x00\x00\xaa\xaa\x2a\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00", # [28..38,47]
-    'syscalls'                         => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00", # [57]
+    'syscalls'                         => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00", # [55]
     'taint'                            => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [39]
     'threads'                          => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [40]
     'uninitialized'                    => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [41]
     'unopened'                         => "\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [11]
     'unpack'                           => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [42]
     'untie'                            => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [43]
-    'utf8'                             => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x2a\x00\x00\x00\x00\x00\x00\x00", # [44,48..50]
+    'utf8'                             => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\xa0\x02\x00\x00\x00\x00\x00\x00", # [44,50..52]
     'void'                             => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00", # [45]
 );
 
+our %NoOp = (
+    'experimental::alpha_assertions'   => 1,
+    'experimental::bitwise'            => 1,
+    'experimental::isa'                        => 1,
+    'experimental::lexical_subs'       => 1,
+    'experimental::postderef'          => 1,
+    'experimental::script_run'         => 1,
+    'experimental::signatures'         => 1,
+    'experimental::smartmatch'         => 1,
+);
+
 # These are used by various things, including our own tests
 our $NONE                              =  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
-our $DEFAULT                           =  "\x10\x01\x00\x00\x00\x50\x04\x00\x00\x00\x00\x00\x00\x51\x51\x15\x54\x54\x55\x15"; # [2,4,22,23,25,52,54..56,58..62,65..67,69..78]
+our $DEFAULT                           =  "\x10\x01\x00\x00\x00\x50\x04\x00\x00\x00\x00\x00\x05\x00\x55\x50\x54\x55\x45\x55"; # [2,4,22,23,25,48,49,56..59,62,63,65..73,75..79]
 our $LAST_BIT                          =  160 ;
 our $BYTES                             =  20 ;
 
@@ -328,6 +351,7 @@ sub _bits {
 
     $mask = _expand_bits($mask);
     foreach my $word ( @_ ) {
+        next if $NoOp{$word};
         if ($word eq 'FATAL') {
             $fatal = 1;
             $no_fatal = 0;
@@ -389,6 +413,7 @@ sub unimport
 
     $mask = _expand_bits($mask);
     foreach my $word ( @_ ) {
+        next if $NoOp{$word};
         if ($word eq 'FATAL') {
             next;
         }
@@ -449,7 +474,7 @@ sub __chk
             unless defined $offset;
     }
     else {
-        $category = (caller(1))[0] ;
+        $category = caller(1);
         $offset = $Offsets{$category};
         Croaker("package '$category' not registered for warnings")
             unless defined $offset ;
@@ -732,6 +757,13 @@ which is equivalent to:
     no warnings  'experimental';
     use warnings 'experimental::somefeature';
 
+As experimental features become regular features of Perl,
+the corresponding warnings are not printed anymore.
+They also stop being listed in the L</Category Hierarchy> below.
+
+It is still possible to request turning on or off these warnings,
+but doing so has no effect.
+
 =head2 What's wrong with B<-w> and C<$^W>
 
 Although very useful, the big problem with using B<-w> on the command
@@ -882,20 +914,32 @@ The current hierarchy is:
          |
          +- closure
          |
-         +- deprecated
+         +- deprecated ----+
+         |                 |
+         |                 +- deprecated::apostrophe_as_package_separator
+         |                 |
+         |                 +- deprecated::delimiter_will_be_paired
+         |                 |
+         |                 +- deprecated::dot_in_inc
+         |                 |
+         |                 +- deprecated::goto_construct
+         |                 |
+         |                 +- deprecated::smartmatch
+         |                 |
+         |                 +- deprecated::unicode_property_name
+         |                 |
+         |                 +- deprecated::version_downgrade
          |
          +- exiting
          |
          +- experimental --+
          |                 |
-         |                 +- experimental::alpha_assertions
-         |                 |
          |                 +- experimental::args_array_with_signatures
          |                 |
-         |                 +- experimental::bitwise
-         |                 |
          |                 +- experimental::builtin
          |                 |
+         |                 +- experimental::class
+         |                 |
          |                 +- experimental::const_attr
          |                 |
          |                 +- experimental::declared_refs
@@ -906,12 +950,6 @@ The current hierarchy is:
          |                 |
          |                 +- experimental::for_list
          |                 |
-         |                 +- experimental::isa
-         |                 |
-         |                 +- experimental::lexical_subs
-         |                 |
-         |                 +- experimental::postderef
-         |                 |
          |                 +- experimental::private_use
          |                 |
          |                 +- experimental::re_strict
@@ -920,12 +958,6 @@ The current hierarchy is:
          |                 |
          |                 +- experimental::regex_sets
          |                 |
-         |                 +- experimental::script_run
-         |                 |
-         |                 +- experimental::signatures
-         |                 |
-         |                 +- experimental::smartmatch
-         |                 |
          |                 +- experimental::try
          |                 |
          |                 +- experimental::uniprop_wildcards
@@ -1460,4 +1492,4 @@ See also L<perlmodlib/Pragmatic Modules> and L<perldiag>.
 
 =cut
 
-# ex: set ro:
+# ex: set ro ft=perl:
index 0adf104..8bcb7a2 100644 (file)
@@ -1,6 +1,5 @@
-package warnings::register;
+package warnings::register 1.05;
 
-our $VERSION = '1.04';
 require warnings;
 
 # left here as cruft in case other users were using this undocumented routine
@@ -19,7 +18,7 @@ sub import
     shift;
     my @categories = @_;
 
-    my $package = (caller(0))[0];
+    my $package = caller;
     warnings::register_categories($package);
 
     warnings::register_categories($package . "::$_") for @categories;
index c83076d..92b6c1a 100644 (file)
  * it would be possible to emulate thread-safe locales, but this likely would
  * involve a lot of locale switching, and would require XS code changes.
  * Macros could be written so that the code wouldn't have to know which type of
- * system is being used.  It's unlikely that we would ever do that, since most
- * modern systems support thread-safe locales, but there was code written to
- * this end, and is retained, #ifdef'd out.
+ * system is being used.
+ *
+ * Table-driven code is used for simplicity and clarity, as many operations
+ * differ only in which category is being worked on.  However the system
+ * categories need not be small contiguous integers, so do not lend themselves
+ * to table lookup.  Instead we have created our own equivalent values which
+ * are all small contiguous non-negative integers, and translation functions
+ * between the two sets.  For category 'LC_foo', the name of our index is
+ * LC_foo_INDEX_.  Various parallel tables, indexed by these, are used.
+ *
+ * Many of the macros and functions in this file have one of the suffixes '_c',
+ * '_r', or '_i'.  khw found these useful in remembering what type of locale
+ * category to use as their parameter.  '_r' takes an int category number as
+ * passed to setlocale(), like LC_ALL, LC_CTYPE, etc.  The 'r' indicates that
+ * the value isn't known until runtime.  '_c' also indicates such a category
+ * number, but its value is known at compile time.  These are both converted
+ * into unsigned indexes into various tables of category information, where the
+ * real work is generally done.  The tables are generated at compile-time based
+ * on platform characteristics and Configure options.  They hide from the code
+ * many of the vagaries of the different locale implementations out there.  You
+ * may have already guessed that '_i' indicates the parameter is such an
+ * unsigned index.  Converting from '_r' to '_i' requires run-time lookup.
+ * '_c' is used to get cpp to do this at compile time.  To avoid the runtime
+ * expense, the code is structured to use '_r' at the API level, and once
+ * converted, everything possible is done using the table indexes.
+ *
+ * On unthreaded perls, most operations expand out to just the basic
+ * setlocale() calls.  The same is true on threaded perls on modern Windows
+ * systems where the same API, after set up, is used for thread-safe locale
+ * handling.  On other systems, there is a completely different API, specified
+ * in POSIX 2008, to do thread-safe locales.  On these systems, our
+ * emulate_setlocale_i() function is used to hide the different API from the
+ * outside.  This makes it completely transparent to most XS code.
+ *
+ * A huge complicating factor is that the LC_NUMERIC category is normally held
+ * in the C locale, except during those relatively rare times when it needs to
+ * be in the underlying locale.  There is a bunch of code to accomplish this,
+ * and to allow easy switches from one state to the other.
+ *
+ * In addition, the setlocale equivalents have versions for the return context,
+ * 'void' and 'bool', besides the full return value.  This can present
+ * opportunities for avoiding work.  We don't have to necessarily create a safe
+ * copy to return if no return is desired.
+ *
+ * There are 3.5 major implementations here; which one chosen depends on what
+ * the platform has available, and Configuration options.
+ *
+ * 1) Raw my_setlocale().  Here the layer adds nothing.  This is used for
+ *    unthreaded perls, and when the API for safe locale threading is identical
+ *    to the unsafe API (Windows, currently).
+ *
+ * 2) A minimal layer that makes my_setlocale() uninterruptible and returns a
+ *    per-thread/per-category value.
+ *
+ * 3a and 3b) A layer that implements POSIX 2008 thread-safe locale handling,
+ *    mapping the setlocale() API to them.  This automatically makes almost all
+ *    code thread-safe without need for changes.  This layer is chosen on
+ *    threaded perls when the platform supports the POSIX 2008 functions, and
+ *    when there is no manual override in Configure.
+ *
+ *    3a) is when the platform has a reliable querylocale() function or
+ *        equivalent that is selected to be used.
+ *    3b) is when we have to emulate that functionality.
+ *
+ * z/OS (os390) is an outlier.  Locales really don't work under threads when
+ * either the radix character isn't a dot, or attempts are made to change
+ * locales after the first thread is created.  The reason is that IBM has made
+ * it thread-safe by refusing to change locales (returning failure if
+ * attempted) any time after an application has called pthread_create() to
+ * create another thread.  The expectation is that an application will set up
+ * its locale information before the first fork, and be stable thereafter.  But
+ * perl toggles LC_NUMERIC if the locale's radix character isn't a dot, as do
+ * the other toggles, which are less common.
  */
 
+/* If the environment says to, we can output debugging information during
+ * initialization.  This is done before option parsing, and before any thread
+ * creation, so can be a file-level static.  (Must come before #including
+ * perl.h) */
+#ifdef DEBUGGING
+static int debug_initialization = 0;
+#  define DEBUG_INITIALIZATION_set(v) (debug_initialization = v)
+#  define DEBUG_LOCALE_INITIALIZATION_  debug_initialization
+/* C standards seem to say that __LINE__ is merely "an integer constant",
+ * which means it might be either int, long (with L suffix), or long long
+ * (or their corresponding unsigned type).  So, we have to explicitly cast
+ * __LINE__ to a particular integer type to pass it reliably to variadic
+ * functions like (PerlIO_)printf, as below: */
+#  ifdef USE_LOCALE_THREADS
+#    define DEBUG_PRE_STMTS                                                     \
+     dSAVE_ERRNO; dTHX; PerlIO_printf(Perl_debug_log,"\n%s: %" LINE_Tf ": %p: ",\
+                                      __FILE__, (line_t)__LINE__, aTHX);
+#  else
+#    define DEBUG_PRE_STMTS                                                     \
+     dSAVE_ERRNO; dTHX; PerlIO_printf(Perl_debug_log, "\n%s: %" LINE_Tf ": ",   \
+                                      __FILE__, (line_t)__LINE__);
+#  endif
+#  define DEBUG_POST_STMTS  RESTORE_ERRNO;
+#else
+#  define debug_initialization 0
+#  define DEBUG_INITIALIZATION_set(v)
+#  define DEBUG_PRE_STMTS
+#  define DEBUG_POST_STMTS
+#endif
+
 #include "EXTERN.h"
 #define PERL_IN_LOCALE_C
-#include "perl_langinfo.h"
 #include "perl.h"
 
 #include "reentr.h"
 #  include <wctype.h>
 #endif
 
-/* If the environment says to, we can output debugging information during
- * initialization.  This is done before option parsing, and before any thread
- * creation, so can be a file-level static */
-#if ! defined(DEBUGGING)
-#  define debug_initialization 0
-#  define DEBUG_INITIALIZATION_set(v)
+ /* The main errno that gets used is this one, on platforms that support it */
+#ifdef EINVAL
+#  define SET_EINVAL  SETERRNO(EINVAL, LIB_INVARG)
 #else
-static bool debug_initialization = FALSE;
-#  define DEBUG_INITIALIZATION_set(v) (debug_initialization = v)
+#  define SET_EINVAL
+#endif
+
+/* If we have any of these library functions, we can reliably determine is a
+ * locale is a UTF-8 one or not.  And if we aren't using locales at all, we act
+ * as if everything is the C locale, so the answer there is always "No, it
+ * isn't UTF-8"; this too is reliably accurate */
+#if   defined(HAS_SOME_LANGINFO) || defined(HAS_MBTOWC) || defined(HAS_MBRTOWC) \
+ || ! defined(USE_LOCALE)
+#  define HAS_RELIABLE_UTF8NESS_DETERMINATION
 #endif
 
+#ifdef USE_LOCALE
+
+PERL_STATIC_INLINE const char *
+S_mortalized_pv_copy(pTHX_ const char * const pv)
+{
+    PERL_ARGS_ASSERT_MORTALIZED_PV_COPY;
+
+    /* Copies the input pv, and arranges for it to be freed at an unspecified
+     * later time. */
+
+    if (pv == NULL) {
+        return NULL;
+    }
+
+    const char * copy = savepv(pv);
+    SAVEFREEPV(copy);
+    return copy;
+}
+
+#endif
 
 /* Returns the Unix errno portion; ignoring any others.  This is a macro here
  * instead of putting it into perl.h, because unclear to khw what should be
  * done generally. */
 #define GET_ERRNO   saved_errno
 
-/* strlen() of a literal string constant.  We might want this more general,
- * but using it in just this file for now.  A problem with more generality is
- * the compiler warnings about comparing unlike signs */
-#define STRLENs(s)  (sizeof("" s "") - 1)
+/* Default values come from the C locale */
+#define C_codeset "ANSI_X3.4-1968" /* Only in some Configurations, and usually
+                                      a single instance, so is a #define */
+static const char C_decimal_point[] = ".";
+static const char C_thousands_sep[] = "";
 
 /* Is the C string input 'name' "C" or "POSIX"?  If so, and 'name' is the
  * return of setlocale(), then this is extremely likely to be the C or POSIX
@@ -94,85 +219,47 @@ static bool debug_initialization = FALSE;
                               && (( *(name) == 'C' && (*(name + 1)) == '\0') \
                                    || strEQ((name), "POSIX")))
 
-#ifdef USE_LOCALE
-
-/* This code keeps a LRU cache of the UTF-8ness of the locales it has so-far
- * looked up.  This is in the form of a C string:  */
-
-#define UTF8NESS_SEP     "\v"
-#define UTF8NESS_PREFIX  "\f"
-
-/* So, the string looks like:
- *
- *      \vC\a0\vPOSIX\a0\vam_ET\a0\vaf_ZA.utf8\a1\ven_US.UTF-8\a1\0
- *
- * where the digit 0 after the \a indicates that the locale starting just
- * after the preceding \v is not UTF-8, and the digit 1 mean it is. */
-
-STATIC_ASSERT_DECL(STRLENs(UTF8NESS_SEP) == 1);
-STATIC_ASSERT_DECL(STRLENs(UTF8NESS_PREFIX) == 1);
-
-#define C_and_POSIX_utf8ness    UTF8NESS_SEP "C"     UTF8NESS_PREFIX "0"    \
-                                UTF8NESS_SEP "POSIX" UTF8NESS_PREFIX "0"
-
-/* The cache is initialized to C_and_POSIX_utf8ness at start up.  These are
- * kept there always.  The remining portion of the cache is LRU, with the
- * oldest looked-up locale at the tail end */
-
-STATIC char *
-S_stdize_locale(pTHX_ char *locs)
-{
-    /* Standardize the locale name from a string returned by 'setlocale',
-     * possibly modifying that string.
-     *
-     * The typical return value of setlocale() is either
-     * (1) "xx_YY" if the first argument of setlocale() is not LC_ALL
-     * (2) "xa_YY xb_YY ..." if the first argument of setlocale() is LC_ALL
-     *     (the space-separated values represent the various sublocales,
-     *      in some unspecified order).  This is not handled by this function.
-     *
-     * In some platforms it has a form like "LC_SOMETHING=Lang_Country.866\n",
-     * which is harmful for further use of the string in setlocale().  This
-     * function removes the trailing new line and everything up through the '='
-     * */
-
-    const char * const s = strchr(locs, '=');
-    bool okay = TRUE;
+#if defined(HAS_NL_LANGINFO_L) || defined(HAS_NL_LANGINFO)
+#  define HAS_SOME_LANGINFO
+#endif
 
-    PERL_ARGS_ASSERT_STDIZE_LOCALE;
+#define my_langinfo_c(item, category, locale, retbufp, retbuf_sizep, utf8ness) \
+            my_langinfo_i(item, category##_INDEX_, locale, retbufp,            \
+                                                      retbuf_sizep,  utf8ness)
 
-    if (s) {
-        const char * const t = strchr(s, '.');
-        okay = FALSE;
-        if (t) {
-            const char * const u = strchr(t, '\n');
-            if (u && (u[1] == 0)) {
-                const STRLEN len = u - s;
-                Move(s + 1, locs, len, char);
-                locs[len] = 0;
-                okay = TRUE;
-            }
-        }
-    }
+#ifdef USE_LOCALE
 
-    if (!okay)
-        Perl_croak(aTHX_ "Can't fix broken locale name \"%s\"", locs);
+#  ifdef DEBUGGING
+#    define setlocale_debug_string_i(index, locale, result)                 \
+            my_setlocale_debug_string_i(index, locale, result, __LINE__)
+#    define setlocale_debug_string_c(category, locale, result)              \
+                setlocale_debug_string_i(category##_INDEX_, locale, result)
+#    define setlocale_debug_string_r(category, locale, result)              \
+             setlocale_debug_string_i(get_category_index(category, locale), \
+                                      locale, result)
+#  endif
 
-    return locs;
-}
+#  define toggle_locale_i(index, locale)                                    \
+                 S_toggle_locale_i(aTHX_ index, locale, __LINE__)
+#  define toggle_locale_c(cat, locale)  toggle_locale_i(cat##_INDEX_, locale)
+#  define restore_toggled_locale_i(index, locale)                           \
+                 S_restore_toggled_locale_i(aTHX_ index, locale, __LINE__)
+#  define restore_toggled_locale_c(cat, locale)                             \
+                             restore_toggled_locale_i(cat##_INDEX_, locale)
 
-/* Two parallel arrays; first the locale categories Perl uses on this system;
- * the second array is their names.  These arrays are in mostly arbitrary
- * order. */
+/* Two parallel arrays indexed by our mapping of category numbers into small
+ * non-negative indexes; first the locale categories Perl uses on this system,
+ * used to do the inverse mapping.  The second array is their names.  These
+ * arrays are in mostly arbitrary order. */
 
-const int categories[] = {
+STATIC const int categories[] = {
 
-#    ifdef USE_LOCALE_NUMERIC
-                             LC_NUMERIC,
-#    endif
 #    ifdef USE_LOCALE_CTYPE
                              LC_CTYPE,
 #    endif
+#  ifdef USE_LOCALE_NUMERIC
+                             LC_NUMERIC,
+#  endif
 #    ifdef USE_LOCALE_COLLATE
                              LC_COLLATE,
 #    endif
@@ -200,6 +287,9 @@ const int categories[] = {
 #    ifdef USE_LOCALE_TELEPHONE
                              LC_TELEPHONE,
 #    endif
+#    ifdef USE_LOCALE_NAME
+                             LC_NAME,
+#    endif
 #    ifdef USE_LOCALE_SYNTAX
                              LC_SYNTAX,
 #    endif
@@ -209,21 +299,22 @@ const int categories[] = {
 #    ifdef LC_ALL
                              LC_ALL,
 #    endif
-                            -1  /* Placeholder because C doesn't allow a
-                                   trailing comma, and it would get complicated
-                                   with all the #ifdef's */
+
+   /* Placeholder as a precaution if code fails to check the return of
+    * get_category_index(), which returns this element to indicate an error */
+                            -1
 };
 
 /* The top-most real element is LC_ALL */
 
-const char * const category_names[] = {
+STATIC const char * const category_names[] = {
 
-#    ifdef USE_LOCALE_NUMERIC
-                                 "LC_NUMERIC",
-#    endif
 #    ifdef USE_LOCALE_CTYPE
                                  "LC_CTYPE",
 #    endif
+#  ifdef USE_LOCALE_NUMERIC
+                                 "LC_NUMERIC",
+#  endif
 #    ifdef USE_LOCALE_COLLATE
                                  "LC_COLLATE",
 #    endif
@@ -251,6 +342,9 @@ const char * const category_names[] = {
 #    ifdef USE_LOCALE_TELEPHONE
                                  "LC_TELEPHONE",
 #    endif
+#    ifdef USE_LOCALE_NAME
+                                 "LC_NAME",
+#    endif
 #    ifdef USE_LOCALE_SYNTAX
                                  "LC_SYNTAX",
 #    endif
@@ -260,240 +354,477 @@ const char * const category_names[] = {
 #    ifdef LC_ALL
                                  "LC_ALL",
 #    endif
-                                 NULL  /* Placeholder */
-                            };
+
+   /* Placeholder as a precaution if code fails to check the return of
+    * get_category_index(), which returns this element to indicate an error */
+                                 NULL
+};
+
+/* A few categories require additional setup when they are changed.  This table
+ * points to the functions that do that setup */
+STATIC void (*update_functions[]) (pTHX_ const char *, bool force) = {
+#  ifdef USE_LOCALE_CTYPE
+                                S_new_ctype,
+#  endif
+#  ifdef USE_LOCALE_NUMERIC
+                                S_new_numeric,
+#  endif
+#  ifdef USE_LOCALE_COLLATE
+                                S_new_collate,
+#  endif
+#  ifdef USE_LOCALE_TIME
+                                NULL,
+#  endif
+#  ifdef USE_LOCALE_MESSAGES
+                                NULL,
+#  endif
+#  ifdef USE_LOCALE_MONETARY
+                                NULL,
+#  endif
+#  ifdef USE_LOCALE_ADDRESS
+                                NULL,
+#  endif
+#  ifdef USE_LOCALE_IDENTIFICATION
+                                NULL,
+#  endif
+#  ifdef USE_LOCALE_MEASUREMENT
+                                NULL,
+#  endif
+#  ifdef USE_LOCALE_PAPER
+                                NULL,
+#  endif
+#  ifdef USE_LOCALE_TELEPHONE
+                                NULL,
+#  endif
+#  ifdef USE_LOCALE_NAME
+                                NULL,
+#  endif
+#  ifdef USE_LOCALE_SYNTAX
+                                NULL,
+#  endif
+#  ifdef USE_LOCALE_TOD
+                                NULL,
+#  endif
+    /* No harm done to have this even without an LC_ALL */
+                                S_new_LC_ALL,
+
+   /* Placeholder as a precaution if code fails to check the return of
+    * get_category_index(), which returns this element to indicate an error */
+                                NULL
+};
 
 #  ifdef LC_ALL
 
     /* On systems with LC_ALL, it is kept in the highest index position.  (-2
      * to account for the final unused placeholder element.) */
 #    define NOMINAL_LC_ALL_INDEX (C_ARRAY_LENGTH(categories) - 2)
-
 #  else
 
     /* On systems without LC_ALL, we pretend it is there, one beyond the real
      * top element, hence in the unused placeholder element. */
 #    define NOMINAL_LC_ALL_INDEX (C_ARRAY_LENGTH(categories) - 1)
-
 #  endif
 
 /* Pretending there is an LC_ALL element just above allows us to avoid most
  * special cases.  Most loops through these arrays in the code below are
  * written like 'for (i = 0; i < NOMINAL_LC_ALL_INDEX; i++)'.  They will work
  * on either type of system.  But the code must be written to not access the
- * element at 'LC_ALL_INDEX' except on platforms that have it.  This can be
- * checked for at compile time by using the #define LC_ALL_INDEX which is only
+ * element at 'LC_ALL_INDEX_' except on platforms that have it.  This can be
+ * checked for at compile time by using the #define LC_ALL_INDEX_ which is only
  * defined if we do have LC_ALL. */
 
-STATIC const char *
-S_category_name(const int category)
+STATIC int
+S_get_category_index_nowarn(const int category)
 {
+    /* Given a category, return the equivalent internal index we generally use
+     * instead, or negative if not found.
+     *
+     * Some sort of hash could be used instead of this loop, but the number of
+     * elements is so far at most 12 */
+
     unsigned int i;
 
-#ifdef LC_ALL
+    PERL_ARGS_ASSERT_GET_CATEGORY_INDEX;
 
-    if (category == LC_ALL) {
-        return "LC_ALL";
+#  ifdef LC_ALL
+    for (i = 0; i <=         LC_ALL_INDEX_; i++)
+#  else
+    for (i = 0; i <  NOMINAL_LC_ALL_INDEX;  i++)
+#  endif
+    {
+        if (category == categories[i]) {
+            dTHX_DEBUGGING;
+            DEBUG_Lv(PerlIO_printf(Perl_debug_log,
+                                   "index of category %d (%s) is %d\n",
+                                   category, category_names[i], i));
+            return i;
+        }
+    }
+
+    return -1;
+}
+
+STATIC unsigned int
+S_get_category_index(const int category, const char * locale)
+{
+    /* Given a category, return the equivalent internal index we generally use
+     * instead.
+     *
+     * 'locale' is for use in any generated diagnostics, and may be NULL
+     */
+
+    const char * conditional_warn_text = "; can't set it to ";
+    const int index = get_category_index_nowarn(category);
+
+    if (index >= 0) {
+        return index;
+    }
+
+    /* Here, we don't know about this category, so can't handle it. */
+
+    if (! locale) {
+        locale = "";
+        conditional_warn_text = "";
+    }
+
+    /* diag_listed_as: Unknown locale category %d; can't set it to %s */
+    Perl_warner_nocontext(packWARN(WARN_LOCALE),
+                          "Unknown locale category %d%s%s",
+                          category, conditional_warn_text, locale);
+
+    SET_EINVAL;
+
+    /* Return an out-of-bounds value */
+    return NOMINAL_LC_ALL_INDEX + 1;
+}
+
+#endif /* ifdef USE_LOCALE */
+
+void
+Perl_force_locale_unlock()
+{
+
+#if defined(USE_LOCALE_THREADS)
+
+    dTHX;
+
+    /* If recursively locked, clear all at once */
+    if (PL_locale_mutex_depth > 1) {
+        PL_locale_mutex_depth = 1;
+    }
+
+    if (PL_locale_mutex_depth > 0) {
+        LOCALE_UNLOCK_;
     }
 
 #endif
 
-    for (i = 0; i < NOMINAL_LC_ALL_INDEX; i++) {
-        if (category == categories[i]) {
-            return category_names[i];
-        }
+}
+
+#ifdef USE_POSIX_2008_LOCALE
+
+STATIC locale_t
+S_use_curlocale_scratch(pTHX)
+{
+    /* This function is used to hide from the caller the case where the current
+     * locale_t object in POSIX 2008 is the global one, which is illegal in
+     * many of the P2008 API calls.  This checks for that and, if necessary
+     * creates a proper P2008 object.  Any prior object is deleted, as is any
+     * remaining object during global destruction. */
+
+    locale_t cur = uselocale((locale_t) 0);
+
+    if (cur != LC_GLOBAL_LOCALE) {
+        return cur;
     }
 
-    {
-        const char suffix[] = " (unknown)";
-        int temp = category;
-        Size_t length = sizeof(suffix) + 1;
-        char * unknown;
-        dTHX;
-
-        if (temp < 0) {
-            length++;
-            temp = - temp;
-        }
+    if (PL_scratch_locale_obj) {
+        freelocale(PL_scratch_locale_obj);
+    }
 
-        /* Calculate the number of digits */
-        while (temp >= 10) {
-            temp /= 10;
-            length++;
-        }
+    PL_scratch_locale_obj = duplocale(LC_GLOBAL_LOCALE);
+    return PL_scratch_locale_obj;
+}
+
+#endif
+
+void
+Perl_locale_panic(const char * msg,
+                  const char * file_name,
+                  const line_t line,
+                  const int errnum)
+{
+    dTHX;
+
+    PERL_ARGS_ASSERT_LOCALE_PANIC;
+
+    force_locale_unlock();
+
+#ifdef USE_C_BACKTRACE
+    dump_c_backtrace(Perl_debug_log, 20, 1);
+#endif
+
+    /* diag_listed_as: panic: %s */
+    Perl_croak(aTHX_ "%s: %" LINE_Tf ": panic: %s; errno=%d\n",
+                     file_name, line, msg, errnum);
+}
+
+#define setlocale_failure_panic_c(                                          \
+                        cat, current, failed, caller_0_line, caller_1_line) \
+        setlocale_failure_panic_i(cat##_INDEX_, current, failed,            \
+                        caller_0_line, caller_1_line)
+
+/* posix_setlocale() presents a consistent POSIX-compliant interface to
+ * setlocale().   Windows requres a customized base-level setlocale().  Any
+ * necessary mutex locking needs to be done at a higher level */
+#ifdef WIN32
+#  define posix_setlocale(cat, locale) win32_setlocale(cat, locale)
+#else
+#  define posix_setlocale(cat, locale) ((const char *) setlocale(cat, locale))
+#endif
+
+/* The next layer up is to catch vagaries and bugs in the libc setlocale return
+ * value.  Again, any necessary mutex locking needs to be done at a higher
+ * level */
+#ifdef stdize_locale
+#  define stdized_setlocale(cat, locale)                                       \
+     stdize_locale(cat, posix_setlocale(cat, locale),                          \
+                   &PL_stdize_locale_buf, &PL_stdize_locale_bufsize, __LINE__)
+#else
+#  define stdized_setlocale(cat, locale)  posix_setlocale(cat, locale)
+#endif
+
+/* The next many lines form a layer above the close-to-the-metal 'posix'
+ * and 'stdized' macros.  They are used to present a uniform API to the rest of
+ * the code in this file in spite of the disparate underlying implementations.
+ * */
+
+#if    (! defined(USE_LOCALE_THREADS) && ! defined(USE_POSIX_2008_LOCALE))    \
+    || (  defined(WIN32) && defined(USE_THREAD_SAFE_LOCALE))
+
+/* For non-threaded perls, the added layer just expands to the base-level
+ * functions, except if we are supposed to use the POSIX 2008 interface anyway.
+ * On perls where threading is invisible to us, the base-level functions are
+ * used regardless of threading.  Currently this is only on later Windows
+ * versions.
+ *
+ * See the introductory comments in this file for the meaning of the suffixes
+ * '_c', '_r', '_i'. */
+
+#  define setlocale_r(cat, locale)        stdized_setlocale(cat, locale)
+#  define setlocale_i(i, locale)      setlocale_r(categories[i], locale)
+#  define setlocale_c(cat, locale)              setlocale_r(cat, locale)
+
+#  define void_setlocale_i(i, locale)                                       \
+    STMT_START {                                                            \
+        if (! posix_setlocale(categories[i], locale)) {                     \
+            setlocale_failure_panic_i(i, NULL, locale, __LINE__, 0);        \
+            NOT_REACHED; /* NOTREACHED */                                   \
+        }                                                                   \
+    } STMT_END
+#  define void_setlocale_c(cat, locale)                                     \
+                                  void_setlocale_i(cat##_INDEX_, locale)
+#  define void_setlocale_r(cat, locale)                                     \
+               void_setlocale_i(get_category_index(cat, locale), locale)
+
+#  define bool_setlocale_r(cat, locale) cBOOL(posix_setlocale(cat, locale))
+#  define bool_setlocale_i(i, locale)                                       \
+                                 bool_setlocale_c(categories[i], locale)
+#  define bool_setlocale_c(cat, locale)    bool_setlocale_r(cat, locale)
+
+/* All the querylocale...() forms return a mortalized copy.  If you need
+ * something stable across calls, you need to savepv() the result yourself */
+
+#  define querylocale_r(cat)        mortalized_pv_copy(setlocale_r(cat, NULL))
+#  define querylocale_c(cat)        querylocale_r(cat)
+#  define querylocale_i(i)          querylocale_c(categories[i])
+
+#elif   defined(USE_LOCALE_THREADS)                 \
+   && ! defined(USE_THREAD_SAFE_LOCALE)
+
+   /* Here, there are threads, and there is no support for thread-safe
+    * operation.  This is a dangerous situation, which perl is documented as
+    * not supporting, but it arises in practice.  We can do a modicum of
+    * automatic mitigation by making sure there is a per-thread return from
+    * setlocale(), and that a mutex protects it from races */
+STATIC const char *
+S_less_dicey_setlocale_r(pTHX_ const int category, const char * locale)
+{
+    const char * retval;
+
+    PERL_ARGS_ASSERT_LESS_DICEY_SETLOCALE_R;
+
+    POSIX_SETLOCALE_LOCK;
+
+    retval = stdized_setlocale(category, locale);
+
+    /* We reuse PL_stdize_locale_buf as it doesn't conflict, but the call may
+     * already have used it, in which case we don't have to do anything further
+     * */
+    retval = save_to_buffer(retval,
+                            &PL_stdize_locale_buf, &PL_stdize_locale_bufsize);
+
+    POSIX_SETLOCALE_UNLOCK;
+
+    return retval;
+}
+
+#  define setlocale_r(cat, locale)  less_dicey_setlocale_r(cat, locale)
+#  define setlocale_c(cat, locale)             setlocale_r(cat, locale)
+#  define setlocale_i(i, locale)     setlocale_r(categories[i], locale)
+
+#  define querylocale_r(cat)  mortalized_pv_copy(setlocale_r(cat, NULL))
+#  define querylocale_c(cat)                   querylocale_r(cat)
+#  define querylocale_i(i)                     querylocale_r(categories[i])
+
+STATIC void
+S_less_dicey_void_setlocale_i(pTHX_ const unsigned cat_index,
+                                    const char * locale,
+                                    const line_t line)
+{
+    PERL_ARGS_ASSERT_LESS_DICEY_VOID_SETLOCALE_I;
 
-        Newx(unknown, length, char);
-        my_snprintf(unknown, length, "%d%s", category, suffix);
-        SAVEFREEPV(unknown);
-        return unknown;
+    POSIX_SETLOCALE_LOCK;
+    if (! posix_setlocale(categories[cat_index], locale)) {
+        POSIX_SETLOCALE_UNLOCK;
+        setlocale_failure_panic_i(cat_index, NULL, locale, __LINE__, line);
     }
+    POSIX_SETLOCALE_UNLOCK;
 }
 
-/* Now create LC_foo_INDEX #defines for just those categories on this system */
-#  ifdef USE_LOCALE_NUMERIC
-#    define LC_NUMERIC_INDEX            0
-#    define _DUMMY_NUMERIC              LC_NUMERIC_INDEX
-#  else
-#    define _DUMMY_NUMERIC              -1
+#  define void_setlocale_i(i, locale)                                       \
+                          less_dicey_void_setlocale_i(i, locale, __LINE__)
+#  define void_setlocale_c(cat, locale)                                     \
+                          void_setlocale_i(cat##_INDEX_, locale)
+#  define void_setlocale_r(cat, locale)                                     \
+       void_setlocale_i(get_category_index(cat, locale), locale)
+
+#  if 0     /* Not currently used */
+
+STATIC bool
+S_less_dicey_bool_setlocale_r(pTHX_ const int cat, const char * locale)
+{
+    bool retval;
+
+    PERL_ARGS_ASSERT_LESS_DICEY_BOOL_SETLOCALE_R;
+
+    POSIX_SETLOCALE_LOCK;
+    retval = cBOOL(posix_setlocale(cat, locale));
+    POSIX_SETLOCALE_UNLOCK;
+
+    return retval;
+}
+
+#  endif
+#  define bool_setlocale_r(cat, locale)                                 \
+                               less_dicey_bool_setlocale_r(cat, locale)
+#  define bool_setlocale_i(i, locale)                                   \
+                                bool_setlocale_r(categories[i], locale)
+#  define bool_setlocale_c(cat, locale) bool_setlocale_r(cat, locale)
+#else
+
+/* Here, there is a completely different API to get thread-safe locales.  We
+ * emulate the setlocale() API with our own function(s).  setlocale categories,
+ * like LC_NUMERIC, are not valid here for the POSIX 2008 API.  Instead, there
+ * are equivalents, like LC_NUMERIC_MASK, which we use instead, converting to
+ * by using get_category_index() followed by table lookup. */
+
+#  define emulate_setlocale_c(cat, locale, recalc_LC_ALL, line)             \
+           emulate_setlocale_i(cat##_INDEX_, locale, recalc_LC_ALL, line)
+
+     /* A wrapper for the macros below. */
+#  define common_emulate_setlocale(i, locale)                               \
+                 emulate_setlocale_i(i, locale, YES_RECALC_LC_ALL, __LINE__)
+
+#  define setlocale_i(i, locale)                                            \
+     save_to_buffer(common_emulate_setlocale(i, locale),                    \
+                                             &PL_stdize_locale_buf,         \
+                                             &PL_stdize_locale_bufsize)
+#  define setlocale_c(cat, locale)     setlocale_i(cat##_INDEX_, locale)
+#  define setlocale_r(cat, locale)                                          \
+                    setlocale_i(get_category_index(cat, locale), locale)
+
+#  define void_setlocale_i(i, locale)                                       \
+                             ((void) common_emulate_setlocale(i, locale))
+#  define void_setlocale_c(cat, locale)                                     \
+                                  void_setlocale_i(cat##_INDEX_, locale)
+#  define void_setlocale_r(cat, locale) ((void) setlocale_r(cat, locale))
+
+#  define bool_setlocale_i(i, locale)                                       \
+                               cBOOL(common_emulate_setlocale(i, locale))
+#  define bool_setlocale_c(cat, locale)                                     \
+                                  bool_setlocale_i(cat##_INDEX_, locale)
+#  define bool_setlocale_r(cat, locale)   cBOOL(setlocale_r(cat, locale))
+
+#  define querylocale_i(i)      mortalized_pv_copy(my_querylocale_i(i))
+#  define querylocale_c(cat)    querylocale_i(cat##_INDEX_)
+#  define querylocale_r(cat)    querylocale_i(get_category_index(cat,NULL))
+
+#  ifdef USE_QUERYLOCALE
+#    define isSINGLE_BIT_SET(mask) isPOWER_OF_2(mask)
+
+     /* This code used to think querylocale() was valid on LC_ALL.  Make sure
+      * all instances of that have been removed */
+#    define QUERYLOCALE_ASSERT(index)                                       \
+                        __ASSERT_(isSINGLE_BIT_SET(category_masks[index]))
+#    if ! defined(HAS_QUERYLOCALE) && (   defined(_NL_LOCALE_NAME)          \
+                                       && defined(HAS_NL_LANGINFO_L))
+#      define querylocale_l(index, locale_obj)                              \
+            (QUERYLOCALE_ASSERT(index)                                      \
+             mortalized_pv_copy(nl_langinfo_l(                              \
+                         _NL_LOCALE_NAME(categories[index]), locale_obj)))
+#    else
+#      define querylocale_l(index, locale_obj)                              \
+        (QUERYLOCALE_ASSERT(index)                                          \
+         mortalized_pv_copy(querylocale(category_masks[index], locale_obj)))
+#    endif
+#  endif
+#  if defined(__GLIBC__) && defined(USE_LOCALE_MESSAGES)
+#    define HAS_GLIBC_LC_MESSAGES_BUG
+#    include <libintl.h>
 #  endif
+
+/* A fourth array, parallel to the ones above to map from category to its
+ * equivalent mask */
+STATIC const int category_masks[] = {
 #  ifdef USE_LOCALE_CTYPE
-#    define LC_CTYPE_INDEX              _DUMMY_NUMERIC + 1
-#    define _DUMMY_CTYPE                LC_CTYPE_INDEX
-#  else
-#    define _DUMMY_CTYPE                _DUMMY_NUMERIC
+                                LC_CTYPE_MASK,
+#  endif
+#  ifdef USE_LOCALE_NUMERIC
+                                LC_NUMERIC_MASK,
 #  endif
 #  ifdef USE_LOCALE_COLLATE
-#    define LC_COLLATE_INDEX            _DUMMY_CTYPE + 1
-#    define _DUMMY_COLLATE              LC_COLLATE_INDEX
-#  else
-#    define _DUMMY_COLLATE              _DUMMY_CTYPE
+                                LC_COLLATE_MASK,
 #  endif
 #  ifdef USE_LOCALE_TIME
-#    define LC_TIME_INDEX               _DUMMY_COLLATE + 1
-#    define _DUMMY_TIME                 LC_TIME_INDEX
-#  else
-#    define _DUMMY_TIME                 _DUMMY_COLLATE
+                                LC_TIME_MASK,
 #  endif
 #  ifdef USE_LOCALE_MESSAGES
-#    define LC_MESSAGES_INDEX           _DUMMY_TIME + 1
-#    define _DUMMY_MESSAGES             LC_MESSAGES_INDEX
-#  else
-#    define _DUMMY_MESSAGES             _DUMMY_TIME
+                                LC_MESSAGES_MASK,
 #  endif
 #  ifdef USE_LOCALE_MONETARY
-#    define LC_MONETARY_INDEX           _DUMMY_MESSAGES + 1
-#    define _DUMMY_MONETARY             LC_MONETARY_INDEX
-#  else
-#    define _DUMMY_MONETARY             _DUMMY_MESSAGES
+                                LC_MONETARY_MASK,
 #  endif
 #  ifdef USE_LOCALE_ADDRESS
-#    define LC_ADDRESS_INDEX            _DUMMY_MONETARY + 1
-#    define _DUMMY_ADDRESS              LC_ADDRESS_INDEX
-#  else
-#    define _DUMMY_ADDRESS              _DUMMY_MONETARY
+                                LC_ADDRESS_MASK,
 #  endif
 #  ifdef USE_LOCALE_IDENTIFICATION
-#    define LC_IDENTIFICATION_INDEX     _DUMMY_ADDRESS + 1
-#    define _DUMMY_IDENTIFICATION       LC_IDENTIFICATION_INDEX
-#  else
-#    define _DUMMY_IDENTIFICATION       _DUMMY_ADDRESS
+                                LC_IDENTIFICATION_MASK,
 #  endif
 #  ifdef USE_LOCALE_MEASUREMENT
-#    define LC_MEASUREMENT_INDEX        _DUMMY_IDENTIFICATION + 1
-#    define _DUMMY_MEASUREMENT          LC_MEASUREMENT_INDEX
-#  else
-#    define _DUMMY_MEASUREMENT          _DUMMY_IDENTIFICATION
+                                LC_MEASUREMENT_MASK,
 #  endif
 #  ifdef USE_LOCALE_PAPER
-#    define LC_PAPER_INDEX              _DUMMY_MEASUREMENT + 1
-#    define _DUMMY_PAPER                LC_PAPER_INDEX
-#  else
-#    define _DUMMY_PAPER                _DUMMY_MEASUREMENT
+                                LC_PAPER_MASK,
 #  endif
 #  ifdef USE_LOCALE_TELEPHONE
-#    define LC_TELEPHONE_INDEX          _DUMMY_PAPER + 1
-#    define _DUMMY_TELEPHONE            LC_TELEPHONE_INDEX
-#  else
-#    define _DUMMY_TELEPHONE            _DUMMY_PAPER
+                                LC_TELEPHONE_MASK,
+#  endif
+#  ifdef USE_LOCALE_NAME
+                                LC_NAME_MASK,
 #  endif
 #  ifdef USE_LOCALE_SYNTAX
-#    define LC_SYNTAX_INDEX             _DUMMY_TELEPHONE + 1
-#    define _DUMMY_SYNTAX               LC_SYNTAX_INDEX
-#  else
-#    define _DUMMY_SYNTAX               _DUMMY_TELEPHONE
-#  endif
-#  ifdef USE_LOCALE_TOD
-#    define LC_TOD_INDEX                _DUMMY_SYNTAX + 1
-#    define _DUMMY_TOD                  LC_TOD_INDEX
-#  else
-#    define _DUMMY_TOD                  _DUMMY_SYNTAX
-#  endif
-#  ifdef LC_ALL
-#    define LC_ALL_INDEX                _DUMMY_TOD + 1
-#  endif
-#endif /* ifdef USE_LOCALE */
-
-/* Windows requres a customized base-level setlocale() */
-#ifdef WIN32
-#  define my_setlocale(cat, locale) win32_setlocale(cat, locale)
-#else
-#  define my_setlocale(cat, locale) setlocale(cat, locale)
-#endif
-
-#ifndef USE_POSIX_2008_LOCALE
-
-/* "do_setlocale_c" is intended to be called when the category is a constant
- * known at compile time; "do_setlocale_r", not known until run time  */
-#  define do_setlocale_c(cat, locale) my_setlocale(cat, locale)
-#  define do_setlocale_r(cat, locale) my_setlocale(cat, locale)
-#  define FIX_GLIBC_LC_MESSAGES_BUG(i)
-
-#else   /* Below uses POSIX 2008 */
-
-/* We emulate setlocale with our own function.  LC_foo is not valid for the
- * POSIX 2008 functions.  Instead LC_foo_MASK is used, which we use an array
- * lookup to convert to.  At compile time we have defined LC_foo_INDEX as the
- * proper offset into the array 'category_masks[]'.  At runtime, we have to
- * search through the array (as the actual numbers may not be small contiguous
- * positive integers which would lend themselves to array lookup). */
-#  define do_setlocale_c(cat, locale)                                       \
-                        emulate_setlocale(cat, locale, cat ## _INDEX, TRUE)
-#  define do_setlocale_r(cat, locale) emulate_setlocale(cat, locale, 0, FALSE)
-
-#  if ! defined(__GLIBC__) || ! defined(USE_LOCALE_MESSAGES)
-
-#    define FIX_GLIBC_LC_MESSAGES_BUG(i)
-
-#  else /* Invalidate glibc cache of loaded translations, see [perl #134264] */
-
-#    include <libintl.h>
-#    define FIX_GLIBC_LC_MESSAGES_BUG(i)                                        \
-        STMT_START {                                                        \
-            if ((i) == LC_MESSAGES_INDEX) {                                 \
-                textdomain(textdomain(NULL));                               \
-            }                                                               \
-        } STMT_END
-
-#  endif
-
-/* A third array, parallel to the ones above to map from category to its
- * equivalent mask */
-const int category_masks[] = {
-#  ifdef USE_LOCALE_NUMERIC
-                                LC_NUMERIC_MASK,
-#  endif
-#  ifdef USE_LOCALE_CTYPE
-                                LC_CTYPE_MASK,
-#  endif
-#  ifdef USE_LOCALE_COLLATE
-                                LC_COLLATE_MASK,
-#  endif
-#  ifdef USE_LOCALE_TIME
-                                LC_TIME_MASK,
-#  endif
-#  ifdef USE_LOCALE_MESSAGES
-                                LC_MESSAGES_MASK,
-#  endif
-#  ifdef USE_LOCALE_MONETARY
-                                LC_MONETARY_MASK,
-#  endif
-#  ifdef USE_LOCALE_ADDRESS
-                                LC_ADDRESS_MASK,
-#  endif
-#  ifdef USE_LOCALE_IDENTIFICATION
-                                LC_IDENTIFICATION_MASK,
-#  endif
-#  ifdef USE_LOCALE_MEASUREMENT
-                                LC_MEASUREMENT_MASK,
-#  endif
-#  ifdef USE_LOCALE_PAPER
-                                LC_PAPER_MASK,
-#  endif
-#  ifdef USE_LOCALE_TELEPHONE
-                                LC_TELEPHONE_MASK,
-#  endif
-#  ifdef USE_LOCALE_SYNTAX
-                                LC_SYNTAX_MASK,
+                                LC_SYNTAX_MASK,
 #  endif
 #  ifdef USE_LOCALE_TOD
                                 LC_TOD_MASK,
@@ -503,781 +834,1031 @@ const int category_masks[] = {
                                  * here, so compile it in unconditionally.
                                  * This could catch some glitches at compile
                                  * time */
-                                LC_ALL_MASK
-                            };
+                                LC_ALL_MASK,
+
+   /* Placeholder as a precaution if code fails to check the return of
+    * get_category_index(), which returns this element to indicate an error */
+                                0
+};
+
+#  define my_querylocale_c(cat) my_querylocale_i(cat##_INDEX_)
 
 STATIC const char *
-S_emulate_setlocale(const int category,
-                    const char * locale,
-                    unsigned int index,
-                    const bool is_index_valid
-                   )
+S_my_querylocale_i(pTHX_ const unsigned int index)
 {
-    /* This function effectively performs a setlocale() on just the current
-     * thread; thus it is thread-safe.  It does this by using the POSIX 2008
-     * locale functions to emulate the behavior of setlocale().  Similar to
-     * regular setlocale(), the return from this function points to memory that
-     * can be overwritten by other system calls, so needs to be copied
-     * immediately if you need to retain it.  The difference here is that
-     * system calls besides another setlocale() can overwrite it.
-     *
-     * By doing this, most locale-sensitive functions become thread-safe.  The
-     * exceptions are mostly those that return a pointer to static memory.
-     *
-     * This function takes the same parameters, 'category' and 'locale', that
-     * the regular setlocale() function does, but it also takes two additional
-     * ones.  This is because the 2008 functions don't use a category; instead
-     * they use a corresponding mask.  Because this function operates in both
-     * worlds, it may need one or the other or both.  This function can
-     * calculate the mask from the input category, but to avoid this
-     * calculation, if the caller knows at compile time what the mask is, it
-     * can pass it, setting 'is_index_valid' to TRUE; otherwise the mask
-     * parameter is ignored.
+    /* This function returns the name of the locale category given by the input
+     * index into our parallel tables of them.
      *
      * POSIX 2008, for some sick reason, chose not to provide a method to find
-     * the category name of a locale.  Some vendors have created a
-     * querylocale() function to do just that.  This function is a lot simpler
-     * to implement on systems that have this.  Otherwise, we have to keep
-     * track of what the locale has been set to, so that we can return its
-     * name to emulate setlocale().  It's also possible for C code in some
-     * library to change the locale without us knowing it, though as of
+     * the category name of a locale, discarding a basic linguistic tenet that
+     * for any object, people will create a name for it.  Some vendors have
+     * created a querylocale() function to do just that.  This function is a
+     * lot simpler to implement on systems that have this.  Otherwise, we have
+     * to keep track of what the locale has been set to, so that we can return
+     * its name so as to emulate setlocale().  It's also possible for C code in
+     * some library to change the locale without us knowing it, though as of
      * September 2017, there are no occurrences in CPAN of uselocale().  Some
      * libraries do use setlocale(), but that changes the global locale, and
-     * threads using per-thread locales will just ignore those changes.
-     * Another problem is that without querylocale(), we have to guess at what
-     * was meant by setting a locale of "".  We handle this by not actually
-     * ever setting to "" (unless querylocale exists), but to emulate what we
-     * think should happen for "".
-     */
-
-    int mask;
-    locale_t old_obj;
-    locale_t new_obj;
-    const char * safelocale = locale ? locale : "(null)";
-    dTHX;
+     * threads using per-thread locales will just ignore those changes. */
 
-#  ifdef DEBUGGING
+    int category;
+    const locale_t cur_obj = uselocale((locale_t) 0);
+    const char * retval;
 
-    if (DEBUG_Lv_TEST || debug_initialization) {
-        PerlIO_printf(Perl_debug_log, "%s:%d: emulate_setlocale input=%d (%s), \"%s\", %d, %d\n", __FILE__, __LINE__, category, category_name(category), safelocale, index, is_index_valid);
-    }
+    PERL_ARGS_ASSERT_MY_QUERYLOCALE_I;
+    assert(index <= NOMINAL_LC_ALL_INDEX);
 
-#  endif
+    category = categories[index];
 
-    /* If the input mask might be incorrect, calculate the correct one */
-    if (! is_index_valid) {
-        unsigned int i;
+    DEBUG_Lv(PerlIO_printf(Perl_debug_log, "my_querylocale_i(%s) on %p\n",
+                                           category_names[index], cur_obj));
+    if (cur_obj == LC_GLOBAL_LOCALE) {
+        POSIX_SETLOCALE_LOCK;
+        retval = posix_setlocale(category, NULL);
+        POSIX_SETLOCALE_UNLOCK;
+    }
+    else {
 
-#  ifdef DEBUGGING
+#  ifdef USE_QUERYLOCALE
 
-        if (DEBUG_Lv_TEST || debug_initialization) {
-            PerlIO_printf(Perl_debug_log, "%s:%d: finding index of category %d (%s)\n", __FILE__, __LINE__, category, category_name(category));
-        }
+        /* We don't currently keep records when there is querylocale(), so have
+         * to get it anew each time */
+        retval = (index == LC_ALL_INDEX_)
+                 ? calculate_LC_ALL(cur_obj)
+                 : querylocale_l(index, cur_obj);
 
-#  endif
+#  else
 
-        for (i = 0; i <= LC_ALL_INDEX; i++) {
-            if (category == categories[i]) {
-                index = i;
-                goto found_index;
-            }
+        /* But we do have up-to-date values when we keep our own records
+         * (except some times in initialization, where we get the value from
+         * the system. */
+        const char ** which  = (index == LC_ALL_INDEX_)
+                               ? &PL_cur_LC_ALL
+                               : &PL_curlocales[index];
+        if (*which == NULL) {
+            retval = stdized_setlocale(category, NULL);
+            *which = savepv(retval);
         }
-
-        /* Here, we don't know about this category, so can't handle it.
-         * Fallback to the early POSIX usages */
-        Perl_warner(aTHX_ packWARN(WARN_LOCALE),
-                            "Unknown locale category %d; can't set it to %s\n",
-                                                     category, safelocale);
-        return NULL;
-
-      found_index: ;
-
-#  ifdef DEBUGGING
-
-        if (DEBUG_Lv_TEST || debug_initialization) {
-            PerlIO_printf(Perl_debug_log, "%s:%d: index is %d for %s\n", __FILE__, __LINE__, index, category_name(category));
+        else {
+            retval = *which;
         }
 
 #  endif
 
     }
 
-    mask = category_masks[index];
-
-#  ifdef DEBUGGING
+    DEBUG_Lv(PerlIO_printf(Perl_debug_log,
+                           "my_querylocale_i(%s) returning '%s'\n",
+                           category_names[index], retval));
+    assert(strNE(retval, ""));
+    return retval;
+}
 
-    if (DEBUG_Lv_TEST || debug_initialization) {
-        PerlIO_printf(Perl_debug_log, "%s:%d: category name is %s; mask is 0x%x\n", __FILE__, __LINE__, category_names[index], mask);
-    }
+#  ifdef USE_PL_CURLOCALES
 
-#  endif
+STATIC const char *
+S_update_PL_curlocales_i(pTHX_
+                         const unsigned int index,
+                         const char * new_locale,
+                         recalc_lc_all_t recalc_LC_ALL)
+{
+    /* This is a helper function for emulate_setlocale_i(), mostly used to
+     * make that function easier to read. */
 
-    /* If just querying what the existing locale is ... */
-    if (locale == NULL) {
-        locale_t cur_obj = uselocale((locale_t) 0);
+    PERL_ARGS_ASSERT_UPDATE_PL_CURLOCALES_I;
+    assert(index <= NOMINAL_LC_ALL_INDEX);
 
-#  ifdef DEBUGGING
+    if (index == LC_ALL_INDEX_) {
+        unsigned int i;
 
-        if (DEBUG_Lv_TEST || debug_initialization) {
-            PerlIO_printf(Perl_debug_log, "%s:%d: emulate_setlocale querying %p\n", __FILE__, __LINE__, cur_obj);
+        /* For LC_ALL, we change all individual categories to correspond */
+                         /* PL_curlocales is a parallel array, so has same
+                          * length as 'categories' */
+        for (i = 0; i < LC_ALL_INDEX_; i++) {
+            Safefree(PL_curlocales[i]);
+            PL_curlocales[i] = savepv(new_locale);
         }
 
-#  endif
+        Safefree(PL_cur_LC_ALL);
+        PL_cur_LC_ALL = savepv(calculate_LC_ALL(PL_curlocales));
+        return PL_cur_LC_ALL;
+    }
 
-        if (cur_obj == LC_GLOBAL_LOCALE) {
-            return my_setlocale(category, NULL);
-        }
+    /* Update the single category's record */
+    Safefree(PL_curlocales[index]);
+    PL_curlocales[index] = savepv(new_locale);
 
-#  ifdef HAS_QUERYLOCALE
+    /* And also LC_ALL if the input says to, including if this is the final
+     * iteration of a loop updating all sub-categories */
+    if (   recalc_LC_ALL == YES_RECALC_LC_ALL
+        || (   recalc_LC_ALL == RECALCULATE_LC_ALL_ON_FINAL_INTERATION
+            && index == NOMINAL_LC_ALL_INDEX - 1))
+    {
+        Safefree(PL_cur_LC_ALL);
+        PL_cur_LC_ALL = savepv(calculate_LC_ALL(PL_curlocales));
+    }
 
-        return (char *) querylocale(mask, cur_obj);
+    return PL_curlocales[index];
+}
 
-#  else
+#  endif  /* Need PL_curlocales[] */
 
-        /* If this assert fails, adjust the size of curlocales in intrpvar.h */
-        STATIC_ASSERT_STMT(C_ARRAY_LENGTH(PL_curlocales) > LC_ALL_INDEX);
+STATIC const char *
+S_setlocale_from_aggregate_LC_ALL(pTHX_ const char * locale, const line_t line)
+{
+    /* This function parses the value of the LC_ALL locale, assuming glibc
+     * syntax, and sets each individual category on the system to the proper
+     * value.
+     *
+     * This is likely to only ever be called from one place, so exists to make
+     * the calling function easier to read by moving this ancillary code out of
+     * the main line.
+     *
+     * The locale for each category is independent of the other categories.
+     * Often, they are all the same, but certainly not always.  Perl, in fact,
+     * usually keeps LC_NUMERIC in the C locale, regardless of the underlying
+     * locale.  LC_ALL has to be able to represent the case of when there are
+     * varying locales.  Platforms have differing ways of representing this.
+     * Because of this, the code in this file goes to lengths to avoid the
+     * issue, generally looping over the component categories instead of
+     * referring to them in the aggregate, wherever possible.  However, there
+     * are cases where we have to parse our own constructed aggregates, which use
+     * the glibc syntax. */
+
+    const char * locale_on_entry = querylocale_c(LC_ALL);
+
+    PERL_ARGS_ASSERT_SETLOCALE_FROM_AGGREGATE_LC_ALL;
+
+    /* If the string that gives what to set doesn't include all categories,
+     * the omitted ones get set to "C".  To get this behavior, first set
+     * all the individual categories to "C", and override the furnished
+     * ones below.  FALSE => No need to recalculate LC_ALL, as this is a
+     * temporary state */
+    if (! emulate_setlocale_c(LC_ALL, "C", DONT_RECALC_LC_ALL, line)) {
+        setlocale_failure_panic_c(LC_ALL, locale_on_entry,
+                                  "C", __LINE__, line);
+        NOT_REACHED; /* NOTREACHED */
+    }
 
-#    if   defined(_NL_LOCALE_NAME)                                          \
-     &&   defined(DEBUGGING)                                                \
-          /* On systems that accept any locale name, the real underlying    \
-           * locale is often returned by this internal function, so we      \
-           * can't use it */                                                \
-     && ! defined(SETLOCALE_ACCEPTS_ANY_LOCALE_NAME)
-        {
-            /* Internal glibc for querylocale(), but doesn't handle
-             * empty-string ("") locale properly; who knows what other
-             * glitches.  Check for it now, under debug. */
-
-            char * temp_name = nl_langinfo_l(_NL_LOCALE_NAME(category),
-                                             uselocale((locale_t) 0));
-            /*
-            PerlIO_printf(Perl_debug_log, "%s:%d: temp_name=%s\n", __FILE__, __LINE__, temp_name ? temp_name : "NULL");
-            PerlIO_printf(Perl_debug_log, "%s:%d: index=%d\n", __FILE__, __LINE__, index);
-            PerlIO_printf(Perl_debug_log, "%s:%d: PL_curlocales[index]=%s\n", __FILE__, __LINE__, PL_curlocales[index]);
-            */
-            if (temp_name && PL_curlocales[index] && strNE(temp_name, "")) {
-                if (         strNE(PL_curlocales[index], temp_name)
-                    && ! (   isNAME_C_OR_POSIX(temp_name)
-                          && isNAME_C_OR_POSIX(PL_curlocales[index]))) {
-
-#      ifdef USE_C_BACKTRACE
-
-                    dump_c_backtrace(Perl_debug_log, 20, 1);
+    const char * s = locale;
+    const char * e = locale + strlen(locale);
+    while (s < e) {
+        const char * p = s;
 
-#      endif
+        /* Parse through the category */
+        while (isWORDCHAR(*p)) {
+            p++;
+        }
 
-                    Perl_croak(aTHX_ "panic: Mismatch between what Perl thinks %s is"
-                                     " (%s) and what internal glibc thinks"
-                                     " (%s)\n", category_names[index],
-                                     PL_curlocales[index], temp_name);
-                }
+        const char * category_end = p;
 
-                return temp_name;
-            }
+        if (*p++ != '=') {
+            locale_panic_(Perl_form(aTHX_
+                          "Unexpected character in locale category name '%s"
+                          "<-- HERE",
+                          get_displayable_string(s, p - 1, 0)));
         }
 
-#    endif
+        /* Parse through the locale name */
+        const char * name_start = p;
+        while (p < e && *p != ';') {
+            p++;
+        }
+        if (UNLIKELY( p < e && *p != ';')) {
+            locale_panic_(Perl_form(aTHX_
+                          "Unexpected character in locale name '%s<-- HERE",
+                          get_displayable_string(s, p, 0)));
+        }
 
-        /* Without querylocale(), we have to use our record-keeping we've
-         *  done. */
+        const char * name_end = p;
 
-        if (category != LC_ALL) {
+        /* Space past the semi-colon */
+        if (p < e) {
+            p++;
+        }
 
-#    ifdef DEBUGGING
+        /* Find the index of the category name in our lists */
+        for (PERL_UINT_FAST8_T i = 0; i < LC_ALL_INDEX_; i++) {
 
-            if (DEBUG_Lv_TEST || debug_initialization) {
-                PerlIO_printf(Perl_debug_log, "%s:%d: emulate_setlocale returning %s\n", __FILE__, __LINE__, PL_curlocales[index]);
+            /* Keep going if this index doesn't point to the category being
+             * parsed.  The strnNE() avoids a Perl_form(), but would fail if
+             * ever a category name could be a substring of another one, e.g.,
+             * if there were a "LC_TIME_DATE" */
+            if strnNE(s, category_names[i], category_end - s) {
+                continue;
             }
 
-#    endif
-
-            return PL_curlocales[index];
-        }
-        else {  /* For LC_ALL */
-            unsigned int i;
-            Size_t names_len = 0;
-            char * all_string;
-            bool are_all_categories_the_same_locale = TRUE;
-
-            /* If we have a valid LC_ALL value, just return it */
-            if (PL_curlocales[LC_ALL_INDEX]) {
+            /* Here i points to the category being parsed.  Now isolate the
+             * locale it is being changed to */
+            const char * individ_locale = Perl_form(aTHX_ "%.*s",
+                                (int) (name_end - name_start), name_start);
 
-#    ifdef DEBUGGING
+            /* And do the change.  Don't recalculate LC_ALL; we'll do it
+             * ourselves after the loop */
+            if (! emulate_setlocale_i(i, individ_locale,
+                                      DONT_RECALC_LC_ALL, line))
+            {
 
-                if (DEBUG_Lv_TEST || debug_initialization) {
-                    PerlIO_printf(Perl_debug_log, "%s:%d: emulate_setlocale returning %s\n", __FILE__, __LINE__, PL_curlocales[LC_ALL_INDEX]);
+                /* But if we have to back out, do fix up LC_ALL */
+                if (! emulate_setlocale_c(LC_ALL, locale_on_entry,
+                                          YES_RECALC_LC_ALL, line))
+                {
+                    setlocale_failure_panic_i(i, individ_locale,
+                                              locale, __LINE__, line);
+                    NOT_REACHED; /* NOTREACHED */
                 }
 
-#    endif
-
-                return PL_curlocales[LC_ALL_INDEX];
+                /* Reverting to the entry value succeeded, but the operation
+                 * failed to go to the requested locale. */
+                return NULL;
             }
 
-            /* Otherwise, we need to construct a string of name=value pairs.
-             * We use the glibc syntax, like
-             *      LC_NUMERIC=C;LC_TIME=en_US.UTF-8;...
-             *  First calculate the needed size.  Along the way, check if all
-             *  the locale names are the same */
-            for (i = 0; i < LC_ALL_INDEX; i++) {
-
-#    ifdef DEBUGGING
+            /* Found and handled the desired category.  Quit the inner loop to
+             * try the next category */
+            break;
+        }
 
-                if (DEBUG_Lv_TEST || debug_initialization) {
-                    PerlIO_printf(Perl_debug_log, "%s:%d: emulate_setlocale i=%d, name=%s, locale=%s\n", __FILE__, __LINE__, i, category_names[i], PL_curlocales[i]);
-                }
+        /* Finished with this category; iterate to the next one in the input */
+        s = p;
+    }
 
-#    endif
+#    ifdef USE_PL_CURLOCALES
 
-                names_len += strlen(category_names[i])
-                          + 1                       /* '=' */
-                          + strlen(PL_curlocales[i])
-                          + 1;                      /* ';' */
+    /* Here we have set all the individual categories.  Update the LC_ALL entry
+     * as well.  We can't just use the input 'locale' as the value may omit
+     * categories whose locale is 'C'.  khw thinks it's better to store a
+     * complete LC_ALL.  So calculate it. */
+    const char * retval = savepv(calculate_LC_ALL(PL_curlocales));
+    Safefree(PL_cur_LC_ALL);
+    PL_cur_LC_ALL = retval;
 
-                if (i > 0 && strNE(PL_curlocales[i], PL_curlocales[i-1])) {
-                    are_all_categories_the_same_locale = FALSE;
-                }
-            }
+#    else
 
-            /* If they are the same, we don't actually have to construct the
-             * string; we just make the entry in LC_ALL_INDEX valid, and be
-             * that single name */
-            if (are_all_categories_the_same_locale) {
-                PL_curlocales[LC_ALL_INDEX] = savepv(PL_curlocales[0]);
-                return PL_curlocales[LC_ALL_INDEX];
-            }
+    const char * retval = querylocale_c(LC_ALL);
 
-            names_len++;    /* Trailing '\0' */
-            SAVEFREEPV(Newx(all_string, names_len, char));
-            *all_string = '\0';
+#    endif
 
-            /* Then fill in the string */
-            for (i = 0; i < LC_ALL_INDEX; i++) {
+    return retval;
+}
 
-#    ifdef DEBUGGING
+STATIC const char *
+S_emulate_setlocale_i(pTHX_
 
-                if (DEBUG_Lv_TEST || debug_initialization) {
-                    PerlIO_printf(Perl_debug_log, "%s:%d: emulate_setlocale i=%d, name=%s, locale=%s\n", __FILE__, __LINE__, i, category_names[i], PL_curlocales[i]);
-                }
+        /* Our internal index of the 'category' setlocale is called with */
+        const unsigned int index,
 
-#    endif
+        const char * new_locale, /* The locale to set the category to */
+        const recalc_lc_all_t recalc_LC_ALL,  /* Explained below */
+        const line_t line     /* Called from this line number */
+       )
+{
+    PERL_ARGS_ASSERT_EMULATE_SETLOCALE_I;
+    assert(index <= NOMINAL_LC_ALL_INDEX);
 
-                my_strlcat(all_string, category_names[i], names_len);
-                my_strlcat(all_string, "=", names_len);
-                my_strlcat(all_string, PL_curlocales[i], names_len);
-                my_strlcat(all_string, ";", names_len);
-            }
+    /* Otherwise could have undefined behavior, as the return of this function
+     * may be copied to this buffer, which this function could change in the
+     * middle of its work */
+    assert(new_locale != PL_stdize_locale_buf);
 
-#    ifdef DEBUGGING
+    /* This function effectively performs a setlocale() on just the current
+     * thread; thus it is thread-safe.  It does this by using the POSIX 2008
+     * locale functions to emulate the behavior of setlocale().  Similar to
+     * regular setlocale(), the return from this function points to memory that
+     * can be overwritten by other system calls, so needs to be copied
+     * immediately if you need to retain it.  The difference here is that
+     * system calls besides another setlocale() can overwrite it.
+     *
+     * By doing this, most locale-sensitive functions become thread-safe.  The
+     * exceptions are mostly those that return a pointer to static memory.
+     *
+     * This function may be called in a tight loop that iterates over all
+     * categories.  Because LC_ALL is not a "real" category, but merely the sum
+     * of all the other ones, such loops don't include LC_ALL.  On systems that
+     * have querylocale() or similar, the current LC_ALL value is immediately
+     * retrievable; on systems lacking that feature, we have to keep track of
+     * LC_ALL ourselves.  We could do that on each iteration, only to throw it
+     * away on the next, but the calculation is more than a trivial amount of
+     * work.  Instead, the 'recalc_LC_ALL' parameter is set to
+     * RECALCULATE_LC_ALL_ON_FINAL_INTERATION to only do the calculation once.
+     * This function calls itself recursively in such a loop.
+     *
+     * When not in such a loop, the parameter is set to the other enum values
+     * DONT_RECALC_LC_ALL or YES_RECALC_LC_ALL. */
 
-            if (DEBUG_L_TEST || debug_initialization) {
-                PerlIO_printf(Perl_debug_log, "%s:%d: emulate_setlocale returning %s\n", __FILE__, __LINE__, all_string);
-            }
+    int mask = category_masks[index];
+    const locale_t entry_obj = uselocale((locale_t) 0);
+    const char * locale_on_entry = querylocale_i(index);
 
-    #endif
+    DEBUG_Lv(PerlIO_printf(Perl_debug_log,
+             "emulate_setlocale_i input=%d (%s), mask=0x%x,"
+             " new locale=\"%s\", current locale=\"%s\","
+             "index=%d, object=%p\n",
+             categories[index], category_names[index], mask,
+             ((new_locale == NULL) ? "(nil)" : new_locale),
+             locale_on_entry, index, entry_obj));
+
+    /* Return the already-calculated info if just querying what the existing
+     * locale is */
+    if (new_locale == NULL) {
+        return locale_on_entry;
+    }
 
-            return all_string;
+    /* Here, trying to change the locale, but it is a no-op if the new boss is
+     * the same as the old boss.  Except this routine is called when converting
+     * from the global locale, so in that case we will create a per-thread
+     * locale below (with the current values).  It also seemed that newlocale()
+     * could free up the basis locale memory if we called it with the new and
+     * old being the same, but khw now thinks that this was due to some other
+     * bug, since fixed, as there are other places where newlocale() gets
+     * similarly called without problems. */
+    if (   entry_obj != LC_GLOBAL_LOCALE
+        && locale_on_entry
+        && strEQ(new_locale, locale_on_entry))
+    {
+        DEBUG_Lv(PerlIO_printf(Perl_debug_log,
+                 "(%" LINE_Tf "): emulate_setlocale_i"
+                 " no-op to change to what it already was\n",
+                 line));
+
+#  ifdef USE_PL_CURLOCALES
+
+       /* On the final iteration of a loop that needs to recalculate LC_ALL, do
+        * so.  If no iteration changed anything, LC_ALL also doesn't change,
+        * but khw believes the complexity needed to keep track of that isn't
+        * worth it. */
+        if (UNLIKELY(   recalc_LC_ALL == RECALCULATE_LC_ALL_ON_FINAL_INTERATION
+                     && index == NOMINAL_LC_ALL_INDEX - 1))
+        {
+            Safefree(PL_cur_LC_ALL);
+            PL_cur_LC_ALL = savepv(calculate_LC_ALL(PL_curlocales));
         }
 
-#    ifdef EINVAL
+#  endif
 
-        SETERRNO(EINVAL, LIB_INVARG);
+        return locale_on_entry;
+    }
 
-#    endif
+#  ifndef USE_QUERYLOCALE
 
-        return NULL;
+    /* Without a querylocale() mechanism, we have to figure out ourselves what
+     * happens with setting a locale to "" */
+    if (strEQ(new_locale, "")) {
+        new_locale = find_locale_from_environment(index);
+    }
 
 #  endif
 
-    }   /* End of this being setlocale(LC_foo, NULL) */
+    /* So far, it has worked that a semi-colon in the locale name means that
+     * the category is LC_ALL and it subsumes categories which don't all have
+     * the same locale.  This is the glibc syntax. */
+    if (strchr(new_locale, ';')) {
+        assert(index == LC_ALL_INDEX_);
+        return setlocale_from_aggregate_LC_ALL(new_locale, line);
+    }
 
-    /* Here, we are switching locales. */
+#  ifdef HAS_GLIBC_LC_MESSAGES_BUG
 
-#  ifndef HAS_QUERYLOCALE
+    /* For this bug, if the LC_MESSAGES locale changes, we have to do an
+     * expensive workaround.  Save the current value so we can later determine
+     * if it changed. */
+    const char * old_messages_locale = NULL;
+    if (   (index == LC_MESSAGES_INDEX_ || index == LC_ALL_INDEX_)
+        &&  LIKELY(PL_phase != PERL_PHASE_CONSTRUCT))
+    {
+        old_messages_locale = querylocale_c(LC_MESSAGES);
+    }
 
-    if (strEQ(locale, "")) {
+#  endif
 
-        /* For non-querylocale() systems, we do the setting of "" ourselves to
-         * be sure that we really know what's going on.  We follow the Linux
-         * documented behavior (but if that differs from the actual behavior,
-         * this won't work exactly as the OS implements).  We go out and
-         * examine the environment based on our understanding of how the system
-         * works, and use that to figure things out */
+    assert(PL_C_locale_obj);
 
-        const char * const lc_all = PerlEnv_getenv("LC_ALL");
+    /* Now ready to switch to the input 'new_locale' */
 
-        /* Use any "LC_ALL" environment variable, as it overrides everything
-         * else. */
-        if (lc_all && strNE(lc_all, "")) {
-            locale = lc_all;
-        }
-        else {
+    /* Switching locales generally entails freeing the current one's space (at
+     * the C library's discretion), hence we can't be using that locale at the
+     * time of the switch (this wasn't obvious to khw from the man pages).  So
+     * switch to a known locale object that we don't otherwise mess with. */
+    if (! uselocale(PL_C_locale_obj)) {
+
+        /* Not being able to change to the C locale is severe; don't keep
+         * going.  */
+        setlocale_failure_panic_i(index, locale_on_entry, "C", __LINE__, line);
+        NOT_REACHED; /* NOTREACHED */
+    }
 
-            /* Otherwise, we need to dig deeper.  Unless overridden, the
-             * default is the LANG environment variable; if it doesn't exist,
-             * then "C" */
+    DEBUG_Lv(PerlIO_printf(Perl_debug_log,
+             "(%" LINE_Tf "): emulate_setlocale_i now using C"
+             " object=%p\n", line, PL_C_locale_obj));
 
-            const char * default_name;
+    locale_t new_obj;
 
-            default_name = PerlEnv_getenv("LANG");
+    /* We created a (never changing) object at start-up for LC_ALL being in the
+     * C locale.  If this call is to switch to LC_ALL=>C, simply use that
+     * object.  But in fact, we already have switched to it just above, in
+     * preparation for the general case.  Since we're already there, no need to
+     * do further switching. */
+    if (mask == LC_ALL_MASK && isNAME_C_OR_POSIX(new_locale)) {
+        DEBUG_Lv(PerlIO_printf(Perl_debug_log, "(%" LINE_Tf "):"
+                                               " emulate_setlocale_i will stay"
+                                               " in C object\n", line));
+        new_obj = PL_C_locale_obj;
 
-            if (! default_name || strEQ(default_name, "")) {
-                default_name = "C";
+        /* And free the old object if it isn't a special one */
+        if (entry_obj != LC_GLOBAL_LOCALE && entry_obj != PL_C_locale_obj) {
+            freelocale(entry_obj);
+        }
+    }
+    else {  /* Here is the general case, not to LC_ALL=>C */
+        locale_t basis_obj = entry_obj;
+
+        /* Specially handle two objects */
+        if (basis_obj == LC_GLOBAL_LOCALE || basis_obj == PL_C_locale_obj) {
+
+            /* For these two objects, we make duplicates to hand to newlocale()
+             * below.  For LC_GLOBAL_LOCALE, this is because newlocale()
+             * doesn't necessarily accept it as input (the results are
+             * undefined).  For PL_C_locale_obj, it is so that it never gets
+             * modified, as otherwise newlocale() is free to do so */
+            basis_obj = duplocale(basis_obj);
+            if (! basis_obj) {
+                locale_panic_(Perl_form(aTHX_ "(%" LINE_Tf "): duplocale failed",
+                                              line));
+                NOT_REACHED; /* NOTREACHED */
             }
 
-            if (category != LC_ALL) {
-                const char * const name = PerlEnv_getenv(category_names[index]);
+            DEBUG_Lv(PerlIO_printf(Perl_debug_log,
+                                   "(%" LINE_Tf "): emulate_setlocale_i"
+                                   " created %p by duping the input\n",
+                                   line, basis_obj));
+        }
 
-                /* Here we are setting a single category.  Assume will have the
-                 * default name */
-                locale = default_name;
+        /* Ready to create a new locale by modification of the existing one.
+         *
+         * NOTE: This code may incorrectly show up as a leak under the address
+         * sanitizer. We do not free this object under normal teardown, however
+         * you can set PERL_DESTRUCT_LEVEL=2 to cause it to be freed.
+         */
+        new_obj = newlocale(mask, new_locale, basis_obj);
 
-                /* But then look for an overriding environment variable */
-                if (name && strNE(name, "")) {
-                    locale = name;
-                }
+        if (! new_obj) {
+            DEBUG_L(PerlIO_printf(Perl_debug_log,
+                                  " (%" LINE_Tf "): emulate_setlocale_i"
+                                  " creating new object from %p failed:"
+                                  " errno=%d\n",
+                                  line, basis_obj, GET_ERRNO));
+
+            /* Failed.  Likely this is because the proposed new locale isn't
+             * valid on this system.  But we earlier switched to the LC_ALL=>C
+             * locale in anticipation of it succeeding,  Now have to switch
+             * back to the state upon entry */
+            if (! uselocale(entry_obj)) {
+                setlocale_failure_panic_i(index, "switching back to",
+                                          locale_on_entry, __LINE__, line);
+                NOT_REACHED; /* NOTREACHED */
             }
-            else {
-                bool did_override = FALSE;
-                unsigned int i;
-
-                /* Here, we are getting LC_ALL.  Any categories that don't have
-                 * a corresponding environment variable set should be set to
-                 * LANG, or to "C" if there is no LANG.  If no individual
-                 * categories differ from this, we can just set LC_ALL.  This
-                 * is buggy on systems that have extra categories that we don't
-                 * know about.  If there is an environment variable that sets
-                 * that category, we won't know to look for it, and so our use
-                 * of LANG or "C" improperly overrides it.  On the other hand,
-                 * if we don't do what is done here, and there is no
-                 * environment variable, the category's locale should be set to
-                 * LANG or "C".  So there is no good solution.  khw thinks the
-                 * best is to look at systems to see what categories they have,
-                 * and include them, and then to assume that we know the
-                 * complete set */
-
-                for (i = 0; i < LC_ALL_INDEX; i++) {
-                    const char * const env_override
-                                            = PerlEnv_getenv(category_names[i]);
-                    const char * this_locale = (   env_override
-                                                && strNE(env_override, ""))
-                                               ? env_override
-                                               : default_name;
-                    if (! emulate_setlocale(categories[i], this_locale, i, TRUE))
-                    {
-                        return NULL;
-                    }
-
-                    if (strNE(this_locale, default_name)) {
-                        did_override = TRUE;
-                    }
-                }
-
-                /* If all the categories are the same, we can set LC_ALL to
-                 * that */
-                if (! did_override) {
-                    locale = default_name;
-                }
-                else {
 
-                    /* Here, LC_ALL is no longer valid, as some individual
-                     * categories don't match it.  We call ourselves
-                     * recursively, as that will execute the code that
-                     * generates the proper locale string for this situation.
-                     * We don't do the remainder of this function, as that is
-                     * to update our records, and we've just done that for the
-                     * individual categories in the loop above, and doing so
-                     * would cause LC_ALL to be done as well */
-                    return emulate_setlocale(LC_ALL, NULL, LC_ALL_INDEX, TRUE);
+#    ifdef USE_PL_CURLOCALES
+
+            if (entry_obj == LC_GLOBAL_LOCALE) {
+
+                /* Here, we are back in the global locale.  We may never have
+                 * set PL_curlocales.  If the locale change had succeeded, the
+                 * code would have then set them up, but since it didn't, do so
+                 * here.  khw isn't sure if this prevents some issues or not,
+                 * This will calculate LC_ALL's entry only on the final
+                 * iteration */
+                POSIX_SETLOCALE_LOCK;
+                for (PERL_UINT_FAST8_T i = 0; i < NOMINAL_LC_ALL_INDEX; i++) {
+                    update_PL_curlocales_i(i,
+                                       posix_setlocale(categories[i], NULL),
+                                       RECALCULATE_LC_ALL_ON_FINAL_INTERATION);
                 }
+                POSIX_SETLOCALE_UNLOCK;
             }
+#    endif
+
+            return NULL;
         }
-    }   /* End of this being setlocale(LC_foo, "") */
-    else if (strchr(locale, ';')) {
 
-        /* LC_ALL may actually incude a conglomeration of various categories.
-         * Without querylocale, this code uses the glibc (as of this writing)
-         * syntax for representing that, but that is not a stable API, and
-         * other platforms do it differently, so we have to handle all cases
-         * ourselves */
+        DEBUG_Lv(PerlIO_printf(Perl_debug_log,
+                               "(%" LINE_Tf "): emulate_setlocale_i created %p"
+                               " while freeing %p\n", line, new_obj, basis_obj));
 
-        unsigned int i;
-        const char * s = locale;
-        const char * e = locale + strlen(locale);
-        const char * p = s;
-        const char * category_end;
-        const char * name_start;
-        const char * name_end;
-
-        /* If the string that gives what to set doesn't include all categories,
-         * the omitted ones get set to "C".  To get this behavior, first set
-         * all the individual categories to "C", and override the furnished
-         * ones below */
-        for (i = 0; i < LC_ALL_INDEX; i++) {
-            if (! emulate_setlocale(categories[i], "C", i, TRUE)) {
-                return NULL;
-            }
+        /* Here, successfully created an object representing the desired
+         * locale; now switch into it */
+        if (! uselocale(new_obj)) {
+            freelocale(new_obj);
+            locale_panic_(Perl_form(aTHX_ "(%" LINE_Tf "): emulate_setlocale_i"
+                                          " switching into new locale failed",
+                                          line));
         }
+    }
 
-        while (s < e) {
+    /* Here, we are using 'new_obj' which matches the input 'new_locale'. */
+    DEBUG_Lv(PerlIO_printf(Perl_debug_log,
+             "(%" LINE_Tf "): emulate_setlocale_i now using %p\n",
+             line, new_obj));
 
-            /* Parse through the category */
-            while (isWORDCHAR(*p)) {
-                p++;
-            }
-            category_end = p;
+#ifdef MULTIPLICITY
+    PL_cur_locale_obj = new_obj;
+#endif
 
-            if (*p++ != '=') {
-                Perl_croak(aTHX_
-                    "panic: %s: %d: Unexpected character in locale name '%02X",
-                    __FILE__, __LINE__, *(p-1));
-            }
+    /* We are done, except for updating our records (if the system doesn't keep
+     * them) and in the case of locale "", we don't actually know what the
+     * locale that got switched to is, as it came from the environment.  So
+     * have to find it */
 
-            /* Parse through the locale name */
-            name_start = p;
-            while (p < e && *p != ';') {
-                if (! isGRAPH(*p)) {
-                    Perl_croak(aTHX_
-                        "panic: %s: %d: Unexpected character in locale name '%02X",
-                        __FILE__, __LINE__, *(p-1));
-                }
-                p++;
-            }
-            name_end = p;
+#  ifdef USE_QUERYLOCALE
 
-            /* Space past the semi-colon */
-            if (p < e) {
-                p++;
-            }
+    if (strEQ(new_locale, "")) {
+        new_locale = querylocale_i(index);
+    }
 
-            /* Find the index of the category name in our lists */
-            for (i = 0; i < LC_ALL_INDEX; i++) {
-                char * individ_locale;
+    PERL_UNUSED_ARG(recalc_LC_ALL);
 
-                /* Keep going if this isn't the index.  The strnNE() avoids a
-                 * Perl_form(), but would fail if ever a category name could be
-                 * a substring of another one, like if there were a
-                 * "LC_TIME_DATE" */
-                if strnNE(s, category_names[i], category_end - s) {
-                    continue;
-                }
+#  else
 
-                /* If this index is for the single category we're changing, we
-                 * have found the locale to set it to. */
-                if (category == categories[i]) {
-                    locale = Perl_form(aTHX_ "%.*s",
-                                             (int) (name_end - name_start),
-                                             name_start);
-                    goto ready_to_set;
-                }
+    new_locale = update_PL_curlocales_i(index, new_locale, recalc_LC_ALL);
 
-                assert(category == LC_ALL);
-                individ_locale = Perl_form(aTHX_ "%.*s",
-                                    (int) (name_end - name_start), name_start);
-                if (! emulate_setlocale(categories[i], individ_locale, i, TRUE))
-                {
-                    return NULL;
-                }
-            }
+#  endif
+#  ifdef HAS_GLIBC_LC_MESSAGES_BUG
 
-            s = p;
+    /* Invalidate the glibc cache of loaded translations if the locale has
+     * changed, see [perl #134264] */
+    if (old_messages_locale) {
+        if (strNE(old_messages_locale, my_querylocale_c(LC_MESSAGES))) {
+            textdomain(textdomain(NULL));
         }
+    }
 
-        /* Here we have set all the individual categories by recursive calls.
-         * These collectively should have fixed up LC_ALL, so can just query
-         * what that now is */
-        assert(category == LC_ALL);
-
-        return do_setlocale_c(LC_ALL, NULL);
-    }   /* End of this being setlocale(LC_ALL,
-           "LC_CTYPE=foo;LC_NUMERIC=bar;...") */
+#  endif
 
-  ready_to_set: ;
+    return new_locale;
+}
 
-    /* Here at the end of having to deal with the absence of querylocale().
-     * Some cases have already been fully handled by recursive calls to this
-     * function.  But at this point, we haven't dealt with those, but are now
-     * prepared to, knowing what the locale name to set this category to is.
-     * This would have come for free if this system had had querylocale() */
+#endif   /* End of the various implementations of the setlocale and
+            querylocale macros used in the remainder of this program */
 
-#  endif  /* end of ! querylocale */
+#ifdef USE_LOCALE
 
-    assert(PL_C_locale_obj);
+/* So far, the locale strings returned by modern 2008-compliant systems have
+ * been fine */
 
-    /* Switching locales generally entails freeing the current one's space (at
-     * the C library's discretion).  We need to stop using that locale before
-     * the switch.  So switch to a known locale object that we don't otherwise
-     * mess with.  This returns the locale object in effect at the time of the
-     * switch. */
-    old_obj = uselocale(PL_C_locale_obj);
+STATIC const char *
+S_stdize_locale(pTHX_ const int category,
+                      const char *input_locale,
+                      const char **buf,
+                      Size_t *buf_size,
+                      const line_t caller_line)
+{
+    /* The return value of setlocale() is opaque, but is required to be usable
+     * as input to a future setlocale() to create the same state.
+     * Unfortunately not all systems are compliant.  But most often they are of
+     * a very restricted set of forms that this file has been coded to expect.
+     *
+     * There are some outliers, though, that this function tries to tame:
+     *
+     * 1) A new-line.  This function chomps any \n characters
+     * 2) foo=bar.     'bar' is what is generally meant, and the foo= part is
+     *                 stripped.  This form is legal for LC_ALL.  When found in
+     *                 that category group, the function calls itself
+     *                 recursively on each possible component category to make
+     *                 sure the individual categories are ok.
+     *
+     * If no changes to the input were made, it is returned; otherwise the
+     * changed version is stored into memory at *buf, with *buf_size set to its
+     * new value, and *buf is returned.
+     */
 
-#  ifdef DEBUGGING
+    const char * first_bad;
+    const char * retval;
+
+    PERL_ARGS_ASSERT_STDIZE_LOCALE;
 
-    if (DEBUG_Lv_TEST || debug_initialization) {
-        PerlIO_printf(Perl_debug_log, "%s:%d: emulate_setlocale was using %p\n", __FILE__, __LINE__, old_obj);
+    if (input_locale == NULL) {
+        return NULL;
     }
 
-#  endif
+    first_bad = strpbrk(input_locale, "=\n");
 
-    if (! old_obj) {
+    /* Most likely, there isn't a problem with the input */
+    if (LIKELY(! first_bad)) {
+        return input_locale;
+    }
 
-#  ifdef DEBUGGING
+#    ifdef LC_ALL
 
-        if (DEBUG_L_TEST || debug_initialization) {
-            dSAVE_ERRNO;
-            PerlIO_printf(Perl_debug_log, "%s:%d: emulate_setlocale switching to C failed: %d\n", __FILE__, __LINE__, GET_ERRNO);
-            RESTORE_ERRNO;
+    /* But if there is, and the category is LC_ALL, we have to look at each
+     * component category */
+    if (category == LC_ALL) {
+        const char * individ_locales[LC_ALL_INDEX_];
+        bool made_changes = FALSE;
+        unsigned int i;
+
+        for (i = 0; i < NOMINAL_LC_ALL_INDEX; i++) {
+            Size_t this_size = 0;
+            individ_locales[i] = stdize_locale(categories[i],
+                                               posix_setlocale(categories[i],
+                                                               NULL),
+                                               &individ_locales[i],
+                                               &this_size,
+                                               caller_line);
+
+            /* If the size didn't change, it means this category did not have
+             * to be adjusted, and individ_locales[i] points to the buffer
+             * returned by posix_setlocale(); we have to copy that before
+             * it's called again in the next iteration */
+            if (this_size == 0) {
+                individ_locales[i] = savepv(individ_locales[i]);
+            }
+            else {
+                made_changes = TRUE;
+            }
         }
 
-#  endif
+        /* If all the individual categories were ok as-is, this was a false
+         * alarm.  We must have seen an '=' which was a legal occurrence in
+         * this combination locale */
+        if (! made_changes) {
+            retval = input_locale;  /* The input can be returned unchanged */
+        }
+        else {
+            retval = save_to_buffer(querylocale_c(LC_ALL), buf, buf_size);
+        }
 
-        return NULL;
+        for (i = 0; i < NOMINAL_LC_ALL_INDEX; i++) {
+            Safefree(individ_locales[i]);
+        }
+
+        return retval;
     }
 
-#  ifdef DEBUGGING
+#    else   /* else no LC_ALL */
 
-    if (DEBUG_Lv_TEST || debug_initialization) {
-        PerlIO_printf(Perl_debug_log,
-                      "%s:%d: emulate_setlocale now using %p\n",
-                      __FILE__, __LINE__, PL_C_locale_obj);
-    }
+    PERL_UNUSED_ARG(category);
+    PERL_UNUSED_ARG(caller_line);
 
-#  endif
+#    endif
 
-    /* If this call is to switch to the LC_ALL C locale, it already exists, and
-     * in fact, we already have switched to it (in preparation for what
-     * normally is to come).  But since we're already there, continue to use
-     * it instead of trying to create a new locale */
-    if (mask == LC_ALL_MASK && isNAME_C_OR_POSIX(locale)) {
+    /* Here, there was a problem in an individual category.  This means that at
+     * least one adjustment will be necessary.  Create a modifiable copy */
+    retval = save_to_buffer(input_locale, buf, buf_size);
 
-#  ifdef DEBUGGING
+    if (*first_bad != '=') {
 
-        if (DEBUG_Lv_TEST || debug_initialization) {
-            PerlIO_printf(Perl_debug_log,
-                          "%s:%d: will stay in C object\n", __FILE__, __LINE__);
-        }
+        /* Translate the found position into terms of the copy */
+        first_bad = retval + (first_bad - input_locale);
+    }
+    else { /* An '=' */
 
-#  endif
+        /* It is unlikely that the return is so screwed-up that it contains
+         * multiple equals signs, but handle that case by stripping all of
+         * them.  */
+        const char * final_equals = strrchr(retval, '=');
 
-        new_obj = PL_C_locale_obj;
+        /* The length passed here causes the move to include the terminating
+         * NUL */
+        Move(final_equals + 1, retval, strlen(final_equals), char);
+
+        /* See if there are additional problems; if not, we're good to return.
+         * */
+        first_bad = strpbrk(retval, "\n");
 
-        /* We already had switched to the C locale in preparation for freeing
-         * 'old_obj' */
-        if (old_obj != LC_GLOBAL_LOCALE && old_obj != PL_C_locale_obj) {
-            freelocale(old_obj);
+        if (! first_bad) {
+            return retval;
         }
     }
-    else {
-        /* If we weren't in a thread safe locale, set so that newlocale() below
-         * which uses 'old_obj', uses an empty one.  Same for our reserved C
-         * object.  The latter is defensive coding, so that, even if there is
-         * some bug, we will never end up trying to modify either of these, as
-         * if passed to newlocale(), they can be. */
-        if (old_obj == LC_GLOBAL_LOCALE || old_obj == PL_C_locale_obj) {
-            old_obj = (locale_t) 0;
-        }
 
-        /* Ready to create a new locale by modification of the exising one */
-        new_obj = newlocale(mask, locale, old_obj);
+    /* Here, the problem must be a \n.  Get rid of it and what follows.
+     * (Originally, only a trailing \n was stripped.  Unsure what to do if not
+     * trailing) */
+    *((char *) first_bad) = '\0';
+    return retval;
+}
 
-        if (! new_obj) {
-            dSAVE_ERRNO;
+#if defined(WIN32) || (     defined(USE_POSIX_2008_LOCALE)      \
+                       && ! defined(USE_QUERYLOCALE))
 
-#  ifdef DEBUGGING
+STATIC const char *
+S_find_locale_from_environment(pTHX_ const unsigned int index)
+{
+    /* NB: This function may actually change the locale on Windows.
+     *
+     * On Windows systems, the concept of the POSIX ordering of environment
+     * variables is missing.  To increase portability of programs across
+     * platforms, the POSIX ordering is emulated on Windows.
+     *
+     * And on POSIX 2008 systems without querylocale(), it is problematic
+     * getting the results of the POSIX 2008 equivalent of
+     *      setlocale(category,  "")
+     * (which gets the locale from the environment).
+     *
+     * To ensure that we know exactly what those values are, we do the setting
+     * ourselves, using the documented algorithm (assuming the documentation is
+     * correct) rather than use "" as the locale.  This will lead to results
+     * that differ from native behavior if the native behavior differs from the
+     * standard documented value, but khw believes it is better to know what's
+     * going on, even if different from native, than to just guess.
+     *
+     * Another option for the POSIX 2008 case would be, in a critical section,
+     * to save the global locale's current value, and do a straight
+     * setlocale(LC_ALL, "").  That would return our desired values, destroying
+     * the global locale's, which we would then restore.  But that could cause
+     * races with any other thread that is using the global locale and isn't
+     * using the mutex.  And, the only reason someone would have done that is
+     * because they are calling a library function, like in gtk, that calls
+     * setlocale(), and which can't be changed to use the mutex.  That wouldn't
+     * be a problem if this were to be done before any threads had switched,
+     * say during perl construction time.  But this code would still be needed
+     * for the general case.
+     *
+     * The Windows and POSIX 2008 differ in that the ultimate fallback is "C"
+     * in POSIX, and is the system default locale in Windows.  To get that
+     * system default value, we actually have to call setlocale() on Windows.
+     */
 
-            if (DEBUG_L_TEST || debug_initialization) {
-                PerlIO_printf(Perl_debug_log,
-                              "%s:%d: emulate_setlocale creating new object"
-                              " failed: %d\n", __FILE__, __LINE__, GET_ERRNO);
-            }
+    /* We rely on PerlEnv_getenv() returning a mortalized copy */
+    const char * const lc_all = PerlEnv_getenv("LC_ALL");
 
-#  endif
+    /* Use any "LC_ALL" environment variable, as it overrides everything
+     * else. */
+    if (lc_all && strNE(lc_all, "")) {
+        return lc_all;
+    }
 
-            if (! uselocale(old_obj)) {
+    /* If setting an individual category, use its corresponding value found in
+     * the environment, if any */
+    if (index != LC_ALL_INDEX_) {
+        const char * const new_value = PerlEnv_getenv(category_names[index]);
 
-#  ifdef DEBUGGING
+        if (new_value && strNE(new_value, "")) {
+            return new_value;
+        }
 
-                if (DEBUG_L_TEST || debug_initialization) {
-                    PerlIO_printf(Perl_debug_log,
-                                  "%s:%d: switching back failed: %d\n",
-                                  __FILE__, __LINE__, GET_ERRNO);
-                }
+        /* If no corresponding environment variable, see if LANG exists.  If
+         * so, use it. */
+        const char * default_name = PerlEnv_getenv("LANG");
+        if (default_name && strNE(default_name, "")) {
+            return default_name;
+        }
 
+        /* If no LANG, use "C" on POSIX 2008, the system default on Windows */
+#  ifndef WIN32
+        return "C";
+#  else
+        return wrap_wsetlocale(categories[index], "");
 #  endif
 
-            }
-            RESTORE_ERRNO;
-            return NULL;
-        }
+    }
 
-#  ifdef DEBUGGING
+    /* Here is LC_ALL, and no LC_ALL environment variable.  LANG is used as a
+     * default, but overridden for individual categories that have
+     * corresponding environment variables.  If no LANG exists, the default is
+     * "C" on POSIX 2008, or the system default for the category on Windows. */
+    const char * default_name = PerlEnv_getenv("LANG");
 
-        if (DEBUG_Lv_TEST || debug_initialization) {
-            PerlIO_printf(Perl_debug_log,
-                          "%s:%d: emulate_setlocale created %p",
-                          __FILE__, __LINE__, new_obj);
-            if (old_obj) {
-                PerlIO_printf(Perl_debug_log,
-                              "; should have freed %p", old_obj);
-            }
-            PerlIO_printf(Perl_debug_log, "\n");
+    /* Convert "" to NULL to save conditionals in the loop below */
+    if (default_name != NULL && strEQ(default_name, "")) {
+        default_name = NULL;
+    }
+
+    /* Loop through all the individual categories, setting each to any
+     * corresponding environment variable; or to the default if none exists for
+     * the category */
+    const char * locale_names[LC_ALL_INDEX_];
+    for (unsigned i = 0; i < LC_ALL_INDEX_; i++) {
+        const char * const env_override = PerlEnv_getenv(category_names[i]);
+
+        if (env_override && strNE(env_override, "")) {
+            locale_names[i] = env_override;
         }
+        else if (default_name) {
+            locale_names[i] = default_name;
+        }
+        else {
 
+#  ifndef WIN32
+            locale_names[i] = "C";
+#  else
+            locale_names[i] = wrap_wsetlocale(categories[index], "");
 #  endif
 
-        /* And switch into it */
-        if (! uselocale(new_obj)) {
-            dSAVE_ERRNO;
+        }
 
-#  ifdef DEBUGGING
+        DEBUG_Lv(PerlIO_printf(Perl_debug_log,
+                 "find_locale_from_environment i=%d, name=%s, locale=%s\n",
+                 i, category_names[i], locale_names[i]));
+    }
 
-            if (DEBUG_L_TEST || debug_initialization) {
-                PerlIO_printf(Perl_debug_log,
-                              "%s:%d: emulate_setlocale switching to new object"
-                              " failed\n", __FILE__, __LINE__);
-            }
+    return calculate_LC_ALL(locale_names);
+}
+
+#endif
+#if defined(WIN32) || defined(USE_POSIX_2008_LOCALE) || ! defined(LC_ALL)
+
+STATIC
+const char *
 
+#  ifdef USE_QUERYLOCALE
+S_calculate_LC_ALL(pTHX_ const locale_t cur_obj)
+#  else
+S_calculate_LC_ALL(pTHX_ const char ** individ_locales)
 #  endif
 
-            if (! uselocale(old_obj)) {
+{
+    /* For POSIX 2008, we have to figure out LC_ALL ourselves when needed.
+     * querylocale(), on systems that have it, doesn't tend to work for LC_ALL.
+     * So we have to construct the answer ourselves based on the passed in
+     * data, which is either a locale_t object, for systems with querylocale(),
+     * or an array we keep updated to the proper values, otherwise.
+     *
+     * For Windows, we also may need to construct an LC_ALL when setting the
+     * locale to the system default.
+     *
+     * This function returns a mortalized string containing the locale name(s)
+     * of LC_ALL.
+     *
+     * If all individual categories are the same locale, we can just set LC_ALL
+     * to that locale.  But if not, we have to create an aggregation of all the
+     * categories on the system.  Platforms differ as to the syntax they use
+     * for these non-uniform locales for LC_ALL.  Some use a '/' or other
+     * delimiter of the locales with a predetermined order of categories; a
+     * Configure probe would be needed to tell us how to decipher those.  glibc
+     * and Windows use a series of name=value pairs, like
+     *      LC_NUMERIC=C;LC_TIME=en_US.UTF-8;...
+     * This function returns that syntax, which is suitable for input to the
+     * Windows setlocale().  It could also be suitable for glibc, but because
+     * the non-Windows code is common to systems that use a different syntax,
+     * we don't depend on it for glibc.  Instead we take care not to use the
+     * native setlocale() function on whatever non-Windows style is chosen.
+     * But, it would be possible for someone to call Perl_setlocale() using a
+     * native style we don't understand.  So far no one has complained.
+     *
+     * For systems that have categories we don't know about, the algorithm
+     * below won't know about those missing categories, leading to potential
+     * bugs for code that looks at them.  If there is an environment variable
+     * that sets that category, we won't know to look for it, and so our use of
+     * LANG or "C" improperly overrides it.  On the other hand, if we don't do
+     * what is done here, and there is no environment variable, the category's
+     * locale should be set to LANG or "C".  So there is no good solution.  khw
+     * thinks the best is to make sure we have a complete list of possible
+     * categories, adding new ones as they show up on obscure platforms.
+     */
+
+    unsigned int i;
+    Size_t names_len = 0;
+    bool are_all_categories_the_same_locale = TRUE;
+    char * aggregate_locale;
+    char * previous_start = NULL;
+    char * this_start = NULL;
+    Size_t entry_len = 0;
 
-#  ifdef DEBUGGING
+    PERL_ARGS_ASSERT_CALCULATE_LC_ALL;
 
-                if (DEBUG_L_TEST || debug_initialization) {
-                    PerlIO_printf(Perl_debug_log,
-                                  "%s:%d: switching back failed: %d\n",
-                                  __FILE__, __LINE__, GET_ERRNO);
-                }
+    /* First calculate the needed size for the string listing the categories
+     * and their locales. */
+    for (i = 0; i < NOMINAL_LC_ALL_INDEX; i++) {
 
+#  ifdef USE_QUERYLOCALE
+        const char * entry = querylocale_l(i, cur_obj);
+#  else
+        const char * entry = individ_locales[i];
 #  endif
 
-            }
-            freelocale(new_obj);
-            RESTORE_ERRNO;
-            return NULL;
-        }
+        names_len += strlen(category_names[i])
+                  + 1                           /* '=' */
+                  + strlen(entry)
+                  + 1;                          /* ';' */
     }
 
-#  ifdef DEBUGGING
+    names_len++;    /* Trailing '\0' */
 
-    if (DEBUG_Lv_TEST || debug_initialization) {
-        PerlIO_printf(Perl_debug_log,
-                      "%s:%d: emulate_setlocale now using %p\n",
-                      __FILE__, __LINE__, new_obj);
-    }
+    /* Allocate enough space for the aggregated string */
+    Newxz(aggregate_locale, names_len, char);
+    SAVEFREEPV(aggregate_locale);
 
+    /* Then fill it in */
+    for (i = 0; i < NOMINAL_LC_ALL_INDEX; i++) {
+        Size_t new_len;
+
+#  ifdef USE_QUERYLOCALE
+        const char * entry = querylocale_l(i, cur_obj);
+#  else
+        const char * entry = individ_locales[i];
 #  endif
 
-    /* We are done, except for updating our records (if the system doesn't keep
-     * them) and in the case of locale "", we don't actually know what the
-     * locale that got switched to is, as it came from the environment.  So
-     * have to find it */
+        new_len = my_strlcat(aggregate_locale, category_names[i], names_len);
+        assert(new_len <= names_len);
+        new_len = my_strlcat(aggregate_locale, "=", names_len);
+        assert(new_len <= names_len);
 
-#  ifdef HAS_QUERYLOCALE
+        this_start = aggregate_locale + strlen(aggregate_locale);
+        entry_len = strlen(entry);
 
-    if (strEQ(locale, "")) {
-        locale = querylocale(mask, new_obj);
+        new_len = my_strlcat(aggregate_locale, entry, names_len);
+        assert(new_len <= names_len);
+        new_len = my_strlcat(aggregate_locale, ";", names_len);
+        assert(new_len <= names_len);
+        PERL_UNUSED_VAR(new_len);   /* Only used in DEBUGGING */
+
+        if (   i > 0
+            && are_all_categories_the_same_locale
+            && memNE(previous_start, this_start, entry_len + 1))
+        {
+            are_all_categories_the_same_locale = FALSE;
+        }
+        else {
+            previous_start = this_start;
+        }
     }
 
-#  else
+    /* If they are all the same, just return any one of them */
+    if (are_all_categories_the_same_locale) {
+        aggregate_locale = this_start;
+        aggregate_locale[entry_len] = '\0';
+    }
 
-    /* Here, 'locale' is the return value */
+    DEBUG_Lv(PerlIO_printf(Perl_debug_log,
+                           "calculate_LC_ALL returning '%s'\n",
+                           aggregate_locale));
 
-    /* Without querylocale(), we have to update our records */
+    return aggregate_locale;
+}
 
-    if (category == LC_ALL) {
-        unsigned int i;
+#endif
+#if defined(USE_LOCALE) && (   defined(DEBUGGING)                       \
+                            || defined(USE_PERL_SWITCH_LOCALE_CONTEXT))
 
-        /* For LC_ALL, we change all individual categories to correspond */
-                              /* PL_curlocales is a parallel array, so has same
-                               * length as 'categories' */
-        for (i = 0; i <= LC_ALL_INDEX; i++) {
-            Safefree(PL_curlocales[i]);
-            PL_curlocales[i] = savepv(locale);
-        }
+STATIC const char *
+S_get_LC_ALL_display(pTHX)
+{
 
-        FIX_GLIBC_LC_MESSAGES_BUG(LC_MESSAGES_INDEX);
-    }
-    else {
+#  ifdef LC_ALL
 
-        /* For a single category, if it's not the same as the one in LC_ALL, we
-         * nullify LC_ALL */
+    return querylocale_c(LC_ALL);
 
-        if (PL_curlocales[LC_ALL_INDEX] && strNE(PL_curlocales[LC_ALL_INDEX], locale)) {
-            Safefree(PL_curlocales[LC_ALL_INDEX]);
-            PL_curlocales[LC_ALL_INDEX] = NULL;
-        }
+#  else
 
-        /* Then update the category's record */
-        Safefree(PL_curlocales[index]);
-        PL_curlocales[index] = savepv(locale);
+    const char * curlocales[NOMINAL_LC_ALL_INDEX];
 
-        FIX_GLIBC_LC_MESSAGES_BUG(index);
+    for (unsigned i = 0; i < NOMINAL_LC_ALL_INDEX; i++) {
+        curlocales[i] = querylocale_i(i);
     }
 
+    return calculate_LC_ALL(curlocales);
+
 #  endif
 
-    return locale;
 }
 
-#endif /* USE_POSIX_2008_LOCALE */
-
-#ifdef USE_LOCALE
+#endif
 
 STATIC void
-S_set_numeric_radix(pTHX_ const bool use_locale)
+S_setlocale_failure_panic_i(pTHX_
+                            const unsigned int cat_index,
+                            const char * current,
+                            const char * failed,
+                            const line_t caller_0_line,
+                            const line_t caller_1_line)
 {
-    /* If 'use_locale' is FALSE, set to use a dot for the radix character.  If
-     * TRUE, use the radix character derived from the current locale */
-
-#if defined(USE_LOCALE_NUMERIC) && (   defined(HAS_LOCALECONV)              \
-                                    || defined(HAS_NL_LANGINFO))
-
-    const char * radix = (use_locale)
-                         ? my_nl_langinfo(RADIXCHAR, FALSE)
-                                        /* FALSE => already in dest locale */
-                         : ".";
+    dSAVE_ERRNO;
+    const int cat = categories[cat_index];
+    const char * name = category_names[cat_index];
 
-        sv_setpv(PL_numeric_radix_sv, radix);
+    PERL_ARGS_ASSERT_SETLOCALE_FAILURE_PANIC_I;
 
-    /* If this is valid UTF-8 that isn't totally ASCII, and we are in
-        * a UTF-8 locale, then mark the radix as being in UTF-8 */
-    if (is_utf8_non_invariant_string((U8 *) SvPVX(PL_numeric_radix_sv),
-                                            SvCUR(PL_numeric_radix_sv))
-        && _is_cur_LC_category_utf8(LC_NUMERIC))
-    {
-        SvUTF8_on(PL_numeric_radix_sv);
+    if (current == NULL) {
+        current = querylocale_i(cat_index);
     }
 
-#  ifdef DEBUGGING
-
-    if (DEBUG_L_TEST || debug_initialization) {
-        PerlIO_printf(Perl_debug_log, "Locale radix is '%s', ?UTF-8=%d\n",
-                                           SvPVX(PL_numeric_radix_sv),
-                                           cBOOL(SvUTF8(PL_numeric_radix_sv)));
-    }
+    Perl_locale_panic(Perl_form(aTHX_ "(%" LINE_Tf
+                                      "): Can't change locale for %s(%d)"
+                                      " from '%s' to '%s'",
+                                      caller_1_line, name, cat,
+                                      current, failed),
+                      __FILE__, caller_0_line, GET_ERRNO);
+    NOT_REACHED; /* NOTREACHED */
+}
 
+/* Any of these will allow us to find the RADIX */
+#  if defined(USE_LOCALE_NUMERIC) && (   defined(HAS_SOME_LANGINFO)         \
+                                      || defined(HAS_LOCALECONV)            \
+                                      || defined(HAS_SNPRINTF))
+#    define CAN_CALCULATE_RADIX
 #  endif
-#else
-
-    PERL_UNUSED_ARG(use_locale);
-
-#endif /* USE_LOCALE_NUMERIC and can find the radix char */
-
-}
+#  ifdef USE_LOCALE_NUMERIC
 
 STATIC void
-S_new_numeric(pTHX_ const char *newnum)
+S_new_numeric(pTHX_ const char *newnum, bool force)
 {
-
-#ifndef USE_LOCALE_NUMERIC
-
-    PERL_UNUSED_ARG(newnum);
-
-#else
+    PERL_ARGS_ASSERT_NEW_NUMERIC;
 
     /* Called after each libc setlocale() call affecting LC_NUMERIC, to tell
-     * core Perl this and that 'newnum' is the name of the new locale.
-     * It installs this locale as the current underlying default.
+     * core Perl this and that 'newnum' is the name of the new locale, and we
+     * are switched into it.  It installs this locale as the current underlying
+     * default, and then switches to the C locale, if necessary, so that the
+     * code that has traditionally expected the radix character to be a dot may
+     * continue to do so.
      *
      * The default locale and the C locale can be toggled between by use of the
      * set_numeric_underlying() and set_numeric_standard() functions, which
@@ -1285,8 +1866,8 @@ S_new_numeric(pTHX_ const char *newnum)
      * SET_NUMERIC_STANDARD() in perl.h.
      *
      * The toggling is necessary mainly so that a non-dot radix decimal point
-     * character can be output, while allowing internal calculations to use a
-     * dot.
+     * character can be input and output, while allowing internal calculations
+     * to use a dot.
      *
      * This sets several interpreter-level variables:
      * PL_numeric_name  The underlying locale's name: a copy of 'newnum'
@@ -1305,101 +1886,155 @@ S_new_numeric(pTHX_ const char *newnum)
      *                  variables are true at the same time.  (Toggling is a
      *                  no-op under these circumstances.)  This variable is
      *                  used to avoid having to recalculate.
+     * PL_numeric_radix_sv  Contains the string that code should use for the
+     *                  decimal point.  It is set to either a dot or the
+     *                  program's underlying locale's radix character string,
+     *                  depending on the situation.
+     * PL_underlying_radix_sv  Contains the program's underlying locale's radix
+     *                  character string.  This is copied into
+     *                  PL_numeric_radix_sv when the situation warrants.  It
+     *                  exists to avoid having to recalculate it when toggling.
+     * PL_underlying_numeric_obj = (only on POSIX 2008 platforms)  An object
+     *                  with everything set up properly so as to avoid work on
+     *                  such platforms.
      */
 
-    char *save_newnum;
+    DEBUG_L( PerlIO_printf(Perl_debug_log,
+                           "Called new_numeric with %s, PL_numeric_name=%s\n",
+                           newnum, PL_numeric_name));
 
-    if (! newnum) {
-        Safefree(PL_numeric_name);
-        PL_numeric_name = NULL;
+    /* If not forcing this procedure, and there isn't actually a change from
+     * our records, do nothing.  (Our records can be wrong when sync'ing to the
+     * locale set up by an external library, hence the 'force' parameter) */
+    if (! force && strEQ(PL_numeric_name, newnum)) {
+        return;
+    }
+
+    Safefree(PL_numeric_name);
+    PL_numeric_name = savepv(newnum);
+
+    /* Handle the trivial case.  Since this is called at process
+     * initialization, be aware that this bit can't rely on much being
+     * available. */
+    if (isNAME_C_OR_POSIX(PL_numeric_name)) {
         PL_numeric_standard = TRUE;
-        PL_numeric_underlying = TRUE;
         PL_numeric_underlying_is_standard = TRUE;
+        PL_numeric_underlying = TRUE;
+        sv_setpv(PL_numeric_radix_sv, C_decimal_point);
+        sv_setpv(PL_underlying_radix_sv, C_decimal_point);
         return;
     }
 
-    save_newnum = stdize_locale(savepv(newnum));
+    /* We are in the underlying locale until changed at the end of this
+     * function */
     PL_numeric_underlying = TRUE;
-    PL_numeric_standard = isNAME_C_OR_POSIX(save_newnum);
 
-#ifndef TS_W32_BROKEN_LOCALECONV
+#  ifdef USE_POSIX_2008_LOCALE
 
-    /* If its name isn't C nor POSIX, it could still be indistinguishable from
-     * them.  But on broken Windows systems calling my_nl_langinfo() for
-     * THOUSEP can currently (but rarely) cause a race, so avoid doing that,
-     * and just always change the locale if not C nor POSIX on those systems */
-    if (! PL_numeric_standard) {
-        PL_numeric_standard = cBOOL(strEQ(".", my_nl_langinfo(RADIXCHAR,
-                                            FALSE /* Don't toggle locale */  ))
-                                 && strEQ("",  my_nl_langinfo(THOUSEP, FALSE)));
-    }
+    /* We keep a special object for easy switching to.
+     *
+     * NOTE: This code may incorrectly show up as a leak under the address
+     * sanitizer. We do not free this object under normal teardown, however
+     * you can set PERL_DESTRUCT_LEVEL=2 to cause it to be freed.
+     */
+    PL_underlying_numeric_obj = newlocale(LC_NUMERIC_MASK,
+                                          PL_numeric_name,
+                                          PL_underlying_numeric_obj);
 
-#endif
+#    endif
 
-    /* Save the new name if it isn't the same as the previous one, if any */
-    if (! PL_numeric_name || strNE(PL_numeric_name, save_newnum)) {
-        Safefree(PL_numeric_name);
-        PL_numeric_name = save_newnum;
-    }
-    else {
-        Safefree(save_newnum);
-    }
+    const char * radix = NULL;
+    utf8ness_t utf8ness = UTF8NESS_IMMATERIAL;
 
-    PL_numeric_underlying_is_standard = PL_numeric_standard;
+    /* Find and save this locale's radix character. */
+    my_langinfo_c(RADIXCHAR, LC_NUMERIC, PL_numeric_name,
+                  &radix, NULL, &utf8ness);
+    sv_setpv(PL_underlying_radix_sv, radix);
 
-#  ifdef HAS_POSIX_2008_LOCALE
+    if (utf8ness == UTF8NESS_YES) {
+        SvUTF8_on(PL_underlying_radix_sv);
+    }
 
-    PL_underlying_numeric_obj = newlocale(LC_NUMERIC_MASK,
-                                          PL_numeric_name,
-                                          PL_underlying_numeric_obj);
+    DEBUG_L(PerlIO_printf(Perl_debug_log,
+                          "Locale radix is '%s', ?UTF-8=%d\n",
+                          SvPVX(PL_underlying_radix_sv),
+                          cBOOL(SvUTF8(PL_underlying_radix_sv))));
 
-#endif
+    /* This locale is indistinguishable from C (for numeric purposes) if both
+     * the radix character and the thousands separator are the same as C's.
+     * Start with the radix. */
+    PL_numeric_underlying_is_standard = strEQ(C_decimal_point, radix);
+    Safefree(radix);
 
-    if (DEBUG_L_TEST || debug_initialization) {
-        PerlIO_printf(Perl_debug_log, "Called new_numeric with %s, PL_numeric_name=%s\n", newnum, PL_numeric_name);
-    }
+#    ifndef TS_W32_BROKEN_LOCALECONV
 
-    /* Keep LC_NUMERIC in the C locale.  This is for XS modules, so they don't
-     * have to worry about the radix being a non-dot.  (Core operations that
-     * need the underlying locale change to it temporarily). */
-    if (PL_numeric_standard) {
-        set_numeric_radix(0);
+    /* If the radix isn't the same as C's, we know it is distinguishable from
+     * C; otherwise check the thousands separator too.  Only if both are the
+     * same as C's is the locale indistinguishable from C.
+     *
+     * But on earlier Windows versions, there is a potential race.  This code
+     * knows that localeconv() (elsewhere in this file) will be used to extract
+     * the needed value, and localeconv() was buggy for quite a while, and that
+     * code in this file hence uses a workaround.  And that workaround may have
+     * an (unlikely) race.  Gathering the radix uses a different workaround on
+     * Windows that doesn't involve a race.  It might be possible to do the
+     * same for this (patches welcome).
+     *
+     * Until then khw doesn't think it's worth even the small risk of a race to
+     * get this value, which doesn't appear to be used in any of the Microsoft
+     * library routines anyway. */
+
+    const char * scratch_buffer = NULL;
+    if (PL_numeric_underlying_is_standard) {
+        PL_numeric_underlying_is_standard = strEQ(C_thousands_sep,
+                                             my_langinfo_c(THOUSEP, LC_NUMERIC,
+                                                           PL_numeric_name,
+                                                           &scratch_buffer,
+                                                           NULL, NULL));
     }
-    else {
+    Safefree(scratch_buffer);
+
+#    else
+    PERL_UNUSED_VAR(C_thousands_sep);
+#    endif
+
+    PL_numeric_standard = PL_numeric_underlying_is_standard;
+
+    /* Keep LC_NUMERIC so that it has the C locale radix and thousands
+     * separator.  This is for XS modules, so they don't have to worry about
+     * the radix being a non-dot.  (Core operations that need the underlying
+     * locale change to it temporarily). */
+    if (! PL_numeric_standard) {
         set_numeric_standard();
     }
 
-#endif /* USE_LOCALE_NUMERIC */
-
 }
 
+#  endif
+
 void
 Perl_set_numeric_standard(pTHX)
 {
 
-#ifdef USE_LOCALE_NUMERIC
-
-    /* Toggle the LC_NUMERIC locale to C.  Most code should use the macros like
-     * SET_NUMERIC_STANDARD() in perl.h instead of calling this directly.  The
-     * macro avoids calling this routine if toggling isn't necessary according
-     * to our records (which could be wrong if some XS code has changed the
-     * locale behind our back) */
-
-#  ifdef DEBUGGING
+#  ifdef USE_LOCALE_NUMERIC
 
-    if (DEBUG_L_TEST || debug_initialization) {
-        PerlIO_printf(Perl_debug_log,
-                          "Setting LC_NUMERIC locale to standard C\n");
-    }
+    /* Unconditionally toggle the LC_NUMERIC locale to the C locale
+     *
+     * Most code should use the macro SET_NUMERIC_STANDARD() in perl.h
+     * instead of calling this directly.  The macro avoids calling this routine
+     * if toggling isn't necessary according to our records (which could be
+     * wrong if some XS code has changed the locale behind our back) */
 
-#  endif
+    DEBUG_L(PerlIO_printf(Perl_debug_log,
+                                  "Setting LC_NUMERIC locale to standard C\n"));
 
-    do_setlocale_c(LC_NUMERIC, "C");
+    void_setlocale_c(LC_NUMERIC, "C");
     PL_numeric_standard = TRUE;
+    sv_setpv(PL_numeric_radix_sv, C_decimal_point);
+
     PL_numeric_underlying = PL_numeric_underlying_is_standard;
-    set_numeric_radix(0);
 
-#endif /* USE_LOCALE_NUMERIC */
+#  endif /* USE_LOCALE_NUMERIC */
 
 }
 
@@ -1407,65 +2042,50 @@ void
 Perl_set_numeric_underlying(pTHX)
 {
 
-#ifdef USE_LOCALE_NUMERIC
+#  ifdef USE_LOCALE_NUMERIC
 
-    /* Toggle the LC_NUMERIC locale to the current underlying default.  Most
-     * code should use the macros like SET_NUMERIC_UNDERLYING() in perl.h
+    /* Unconditionally toggle the LC_NUMERIC locale to the current underlying
+     * default.
+     *
+     * Most code should use the macro SET_NUMERIC_UNDERLYING() in perl.h
      * instead of calling this directly.  The macro avoids calling this routine
      * if toggling isn't necessary according to our records (which could be
      * wrong if some XS code has changed the locale behind our back) */
 
-#  ifdef DEBUGGING
-
-    if (DEBUG_L_TEST || debug_initialization) {
-        PerlIO_printf(Perl_debug_log,
-                          "Setting LC_NUMERIC locale to %s\n",
-                          PL_numeric_name);
-    }
+    DEBUG_L(PerlIO_printf(Perl_debug_log, "Setting LC_NUMERIC locale to %s\n",
+                                          PL_numeric_name));
 
-#  endif
+    void_setlocale_c(LC_NUMERIC, PL_numeric_name);
+    PL_numeric_underlying = TRUE;
+    sv_setsv_nomg(PL_numeric_radix_sv, PL_underlying_radix_sv);
 
-    do_setlocale_c(LC_NUMERIC, PL_numeric_name);
     PL_numeric_standard = PL_numeric_underlying_is_standard;
-    PL_numeric_underlying = TRUE;
-    set_numeric_radix(! PL_numeric_standard);
 
-#endif /* USE_LOCALE_NUMERIC */
+#  endif /* USE_LOCALE_NUMERIC */
 
 }
 
-/*
- * Set up for a new ctype locale.
- */
+#  ifdef USE_LOCALE_CTYPE
+
 STATIC void
-S_new_ctype(pTHX_ const char *newctype)
+S_new_ctype(pTHX_ const char *newctype, bool force)
 {
-
-#ifndef USE_LOCALE_CTYPE
-
-    PERL_UNUSED_ARG(newctype);
-    PERL_UNUSED_CONTEXT;
-
-#else
+    PERL_ARGS_ASSERT_NEW_CTYPE;
+    PERL_UNUSED_ARG(force);
 
     /* Called after each libc setlocale() call affecting LC_CTYPE, to tell
      * core Perl this and that 'newctype' is the name of the new locale.
      *
      * This function sets up the folding arrays for all 256 bytes, assuming
      * that tofold() is tolc() since fold case is not a concept in POSIX,
-     *
-     * Any code changing the locale (outside this file) should use
-     * Perl_setlocale or POSIX::setlocale, which call this function.  Therefore
-     * this function should be called directly only from this file and from
-     * POSIX::setlocale() */
-
-    unsigned int i;
+     */
 
-    /* Don't check for problems if we are suppressing the warnings */
-    bool check_for_problems = ckWARN_d(WARN_LOCALE) || UNLIKELY(DEBUG_L_TEST);
-    bool maybe_utf8_turkic = FALSE;
+    DEBUG_L(PerlIO_printf(Perl_debug_log, "Entering new_ctype(%s)\n", newctype));
 
-    PERL_ARGS_ASSERT_NEW_CTYPE;
+    /* No change means no-op */
+    if (strEQ(PL_ctype_name, newctype)) {
+        return;
+    }
 
     /* We will replace any bad locale warning with 1) nothing if the new one is
      * ok; or 2) a new warning for the bad new locale */
@@ -1474,52 +2094,196 @@ S_new_ctype(pTHX_ const char *newctype)
         PL_warn_locale = NULL;
     }
 
-    PL_in_utf8_CTYPE_locale = _is_cur_LC_category_utf8(LC_CTYPE);
+    /* Clear cache */
+    Safefree(PL_ctype_name);
+    PL_ctype_name = "";
+
+    PL_in_utf8_turkic_locale = FALSE;
+
+    /* For the C locale, just use the standard folds, and we know there are no
+     * glitches possible, so return early.  Since this is called at process
+     * initialization, be aware that this bit can't rely on much being
+     * available. */
+    if (isNAME_C_OR_POSIX(newctype)) {
+        Copy(PL_fold, PL_fold_locale, 256, U8);
+        PL_ctype_name = savepv(newctype);
+        PL_in_utf8_CTYPE_locale = FALSE;
+        return;
+    }
+
+    /* The cache being cleared signals this function to compute a new value */
+    PL_in_utf8_CTYPE_locale = is_locale_utf8(newctype);
+
+    PL_ctype_name = savepv(newctype);
+    bool maybe_utf8_turkic = FALSE;
+
+    /* Don't check for problems if we are suppressing the warnings */
+    bool check_for_problems = ckWARN_d(WARN_LOCALE) || UNLIKELY(DEBUG_L_TEST);
 
-    /* A UTF-8 locale gets standard rules.  But note that code still has to
-     * handle this specially because of the three problematic code points */
     if (PL_in_utf8_CTYPE_locale) {
+
+        /* A UTF-8 locale gets standard rules.  But note that code still has to
+         * handle this specially because of the three problematic code points
+         * */
         Copy(PL_fold_latin1, PL_fold_locale, 256, U8);
 
         /* UTF-8 locales can have special handling for 'I' and 'i' if they are
-         * Turkic.  Make sure these two are the only anomalies.  (We don't use
-         * towupper and towlower because they aren't in C89.) */
+         * Turkic.  Make sure these two are the only anomalies.  (We don't
+         * require towupper and towlower because they aren't in C89.) */
 
-#if defined(HAS_TOWUPPER) && defined (HAS_TOWLOWER)
+#    if defined(HAS_TOWUPPER) && defined (HAS_TOWLOWER)
 
-        if (towupper('i') == 0x130 && towlower('I') == 0x131) {
+        if (towupper('i') == 0x130 && towlower('I') == 0x131)
 
-#else
+#    else
 
-        if (toupper('i') == 'i' && tolower('I') == 'I') {
+        if (toU8_UPPER_LC('i') == 'i' && toU8_LOWER_LC('I') == 'I')
+
+#    endif
+
+        {
+            /* This is how we determine it really is Turkic */
+            check_for_problems = TRUE;
+            maybe_utf8_turkic = TRUE;
+        }
+    }
+    else {  /* Not a canned locale we know the values for.  Compute them */
+
+#    ifdef DEBUGGING
+
+        bool has_non_ascii_fold = FALSE;
+        bool found_unexpected = FALSE;
+
+        /* Under -DLv, see if there are any folds outside the ASCII range.
+         * This factoid is used below */
+        if (DEBUG_Lv_TEST) {
+            for (unsigned i = 128; i < 256; i++) {
+                int j = LATIN1_TO_NATIVE(i);
+                if (toU8_LOWER_LC(j) != j || toU8_UPPER_LC(j) != j) {
+                    has_non_ascii_fold = TRUE;
+                    break;
+                }
+            }
+        }
+
+#    endif
+
+        for (unsigned i = 0; i < 256; i++) {
+            if (isU8_UPPER_LC(i))
+                PL_fold_locale[i] = (U8) toU8_LOWER_LC(i);
+            else if (isU8_LOWER_LC(i))
+                PL_fold_locale[i] = (U8) toU8_UPPER_LC(i);
+            else
+                PL_fold_locale[i] = (U8) i;
+
+#    ifdef DEBUGGING
+
+            /* Most locales these days are supersets of ASCII.  When debugging
+             * with -DLv, it is helpful to know what the exceptions to that are
+             * in this locale */
+            if (DEBUG_Lv_TEST) {
+                bool unexpected = FALSE;
+
+                if (isUPPER_L1(i)) {
+                    if (isUPPER_A(i)) {
+                        if (PL_fold_locale[i] != toLOWER_A(i)) {
+                            unexpected = TRUE;
+                        }
+                    }
+                    else if (has_non_ascii_fold) {
+                        if (PL_fold_locale[i] != toLOWER_L1(i)) {
+                            unexpected = TRUE;
+                        }
+                    }
+                    else if (PL_fold_locale[i] != i) {
+                        unexpected = TRUE;
+                    }
+                }
+                else if (   isLOWER_L1(i)
+                         && i != LATIN_SMALL_LETTER_SHARP_S
+                         && i != MICRO_SIGN)
+                {
+                    if (isLOWER_A(i)) {
+                        if (PL_fold_locale[i] != toUPPER_A(i)) {
+                            unexpected = TRUE;
+                        }
+                    }
+                    else if (has_non_ascii_fold) {
+                        if (PL_fold_locale[i] != toUPPER_LATIN1_MOD(i)) {
+                            unexpected = TRUE;
+                        }
+                    }
+                    else if (PL_fold_locale[i] != i) {
+                        unexpected = TRUE;
+                    }
+                }
+                else if (PL_fold_locale[i] != i) {
+                    unexpected = TRUE;
+                }
+
+                if (unexpected) {
+                    found_unexpected = TRUE;
+                    DEBUG_Lv(PerlIO_printf(Perl_debug_log,
+                                           "For %s, fold of %02x is %02x\n",
+                                           newctype, i, PL_fold_locale[i]));
+                }
+            }
+        }
+
+        if (found_unexpected) {
+            DEBUG_Lv(PerlIO_printf(Perl_debug_log,
+                               "All bytes not mentioned above either fold to"
+                               " themselves or are the expected ASCII or"
+                               " Latin1 ones\n"));
+        }
+        else {
+            DEBUG_Lv(PerlIO_printf(Perl_debug_log,
+                                   "No nonstandard folds were found\n"));
+#    endif
 
-#endif
-            check_for_problems = TRUE;
-            maybe_utf8_turkic = TRUE;
         }
     }
 
+#    ifdef MB_CUR_MAX
+
+    /* We only handle single-byte locales (outside of UTF-8 ones); so if this
+     * locale requires more than one byte, there are going to be BIG problems.
+     * */
+
+    if (MB_CUR_MAX > 1 && ! PL_in_utf8_CTYPE_locale
+
+            /* Some platforms return MB_CUR_MAX > 1 for even the "C" locale.
+             * Just assume that the implementation for them (plus for POSIX) is
+             * correct and the > 1 value is spurious.  (Since these are
+             * specially handled to never be considered UTF-8 locales, as long
+             * as this is the only problem, everything should work fine */
+        && ! isNAME_C_OR_POSIX(newctype))
+    {
+        DEBUG_L(PerlIO_printf(Perl_debug_log,
+                              "Unsupported, MB_CUR_MAX=%d\n", (int) MB_CUR_MAX));
+
+        Perl_ck_warner_d(aTHX_ packWARN(WARN_LOCALE),
+                         "Locale '%s' is unsupported, and may crash the"
+                         " interpreter.\n",
+                         newctype);
+    }
+
+#    endif
+
+    DEBUG_Lv(PerlIO_printf(Perl_debug_log, "check_for_problems=%d\n",
+                                           check_for_problems));
+
     /* We don't populate the other lists if a UTF-8 locale, but do check that
      * everything works as expected, unless checking turned off */
-    if (check_for_problems || ! PL_in_utf8_CTYPE_locale) {
+    if (check_for_problems) {
         /* Assume enough space for every character being bad.  4 spaces each
          * for the 94 printable characters that are output like "'x' "; and 5
          * spaces each for "'\\' ", "'\t' ", and "'\n' "; plus a terminating
          * NUL */
         char bad_chars_list[ (94 * 4) + (3 * 5) + 1 ] = { '\0' };
-        bool multi_byte_locale = FALSE;     /* Assume is a single-byte locale
-                                               to start */
         unsigned int bad_count = 0;         /* Count of bad characters */
 
-        for (i = 0; i < 256; i++) {
-            if (! PL_in_utf8_CTYPE_locale) {
-                if (isupper(i))
-                    PL_fold_locale[i] = (U8) tolower(i);
-                else if (islower(i))
-                    PL_fold_locale[i] = (U8) toupper(i);
-                else
-                    PL_fold_locale[i] = (U8) i;
-            }
+        for (unsigned i = 0; i < 256; i++) {
 
             /* If checking for locale problems, see if the native ASCII-range
              * printables plus \n and \t are in their expected categories in
@@ -1530,9 +2294,7 @@ S_new_ctype(pTHX_ const char *newctype)
              * nowadays.  It isn't a problem for most controls to be changed
              * into something else; we check only \n and \t, though perhaps \r
              * could be an issue as well. */
-            if (    check_for_problems
-                && (isGRAPH_A(i) || isBLANK_A(i) || i == '\n'))
-            {
+            if (isGRAPH_A(i) || isBLANK_A(i) || i == '\n') {
                 bool is_bad = FALSE;
                 char name[4] = { '\0' };
 
@@ -1553,77 +2315,79 @@ S_new_ctype(pTHX_ const char *newctype)
                 }
 
                 /* Check each possibe class */
-                if (UNLIKELY(cBOOL(isalnum(i)) != cBOOL(isALPHANUMERIC_A(i))))  {
+                if (UNLIKELY(cBOOL(isU8_ALPHANUMERIC_LC(i)) !=
+                                                    cBOOL(isALPHANUMERIC_A(i))))
+                {
                     is_bad = TRUE;
                     DEBUG_L(PerlIO_printf(Perl_debug_log,
-                                          "isalnum('%s') unexpectedly is %d\n",
-                                          name, cBOOL(isalnum(i))));
+                                          "isalnum('%s') unexpectedly is %x\n",
+                                          name, cBOOL(isU8_ALPHANUMERIC_LC(i))));
                 }
-                if (UNLIKELY(cBOOL(isalpha(i)) != cBOOL(isALPHA_A(i))))  {
+                if (UNLIKELY(cBOOL(isU8_ALPHA_LC(i)) != cBOOL(isALPHA_A(i))))  {
                     is_bad = TRUE;
                     DEBUG_L(PerlIO_printf(Perl_debug_log,
-                                          "isalpha('%s') unexpectedly is %d\n",
-                                          name, cBOOL(isalpha(i))));
+                                          "isalpha('%s') unexpectedly is %x\n",
+                                          name, cBOOL(isU8_ALPHA_LC(i))));
                 }
-                if (UNLIKELY(cBOOL(isdigit(i)) != cBOOL(isDIGIT_A(i))))  {
+                if (UNLIKELY(cBOOL(isU8_DIGIT_LC(i)) != cBOOL(isDIGIT_A(i))))  {
                     is_bad = TRUE;
                     DEBUG_L(PerlIO_printf(Perl_debug_log,
-                                          "isdigit('%s') unexpectedly is %d\n",
-                                          name, cBOOL(isdigit(i))));
+                                          "isdigit('%s') unexpectedly is %x\n",
+                                          name, cBOOL(isU8_DIGIT_LC(i))));
                 }
-                if (UNLIKELY(cBOOL(isgraph(i)) != cBOOL(isGRAPH_A(i))))  {
+                if (UNLIKELY(cBOOL(isU8_GRAPH_LC(i)) != cBOOL(isGRAPH_A(i))))  {
                     is_bad = TRUE;
                     DEBUG_L(PerlIO_printf(Perl_debug_log,
-                                          "isgraph('%s') unexpectedly is %d\n",
-                                          name, cBOOL(isgraph(i))));
+                                          "isgraph('%s') unexpectedly is %x\n",
+                                          name, cBOOL(isU8_GRAPH_LC(i))));
                 }
-                if (UNLIKELY(cBOOL(islower(i)) != cBOOL(isLOWER_A(i))))  {
+                if (UNLIKELY(cBOOL(isU8_LOWER_LC(i)) != cBOOL(isLOWER_A(i))))  {
                     is_bad = TRUE;
                     DEBUG_L(PerlIO_printf(Perl_debug_log,
-                                          "islower('%s') unexpectedly is %d\n",
-                                          name, cBOOL(islower(i))));
+                                          "islower('%s') unexpectedly is %x\n",
+                                          name, cBOOL(isU8_LOWER_LC(i))));
                 }
-                if (UNLIKELY(cBOOL(isprint(i)) != cBOOL(isPRINT_A(i))))  {
+                if (UNLIKELY(cBOOL(isU8_PRINT_LC(i)) != cBOOL(isPRINT_A(i))))  {
                     is_bad = TRUE;
                     DEBUG_L(PerlIO_printf(Perl_debug_log,
-                                          "isprint('%s') unexpectedly is %d\n",
-                                          name, cBOOL(isprint(i))));
+                                          "isprint('%s') unexpectedly is %x\n",
+                                          name, cBOOL(isU8_PRINT_LC(i))));
                 }
-                if (UNLIKELY(cBOOL(ispunct(i)) != cBOOL(isPUNCT_A(i))))  {
+                if (UNLIKELY(cBOOL(isU8_PUNCT_LC(i)) != cBOOL(isPUNCT_A(i))))  {
                     is_bad = TRUE;
                     DEBUG_L(PerlIO_printf(Perl_debug_log,
-                                          "ispunct('%s') unexpectedly is %d\n",
-                                          name, cBOOL(ispunct(i))));
+                                          "ispunct('%s') unexpectedly is %x\n",
+                                          name, cBOOL(isU8_PUNCT_LC(i))));
                 }
-                if (UNLIKELY(cBOOL(isspace(i)) != cBOOL(isSPACE_A(i))))  {
+                if (UNLIKELY(cBOOL(isU8_SPACE_LC(i)) != cBOOL(isSPACE_A(i))))  {
                     is_bad = TRUE;
                     DEBUG_L(PerlIO_printf(Perl_debug_log,
-                                          "isspace('%s') unexpectedly is %d\n",
-                                          name, cBOOL(isspace(i))));
+                                          "isspace('%s') unexpectedly is %x\n",
+                                          name, cBOOL(isU8_SPACE_LC(i))));
                 }
-                if (UNLIKELY(cBOOL(isupper(i)) != cBOOL(isUPPER_A(i))))  {
+                if (UNLIKELY(cBOOL(isU8_UPPER_LC(i)) != cBOOL(isUPPER_A(i))))  {
                     is_bad = TRUE;
                     DEBUG_L(PerlIO_printf(Perl_debug_log,
-                                          "isupper('%s') unexpectedly is %d\n",
-                                          name, cBOOL(isupper(i))));
+                                          "isupper('%s') unexpectedly is %x\n",
+                                          name, cBOOL(isU8_UPPER_LC(i))));
                 }
-                if (UNLIKELY(cBOOL(isxdigit(i))!= cBOOL(isXDIGIT_A(i))))  {
+                if (UNLIKELY(cBOOL(isU8_XDIGIT_LC(i))!= cBOOL(isXDIGIT_A(i))))  {
                     is_bad = TRUE;
                     DEBUG_L(PerlIO_printf(Perl_debug_log,
-                                          "isxdigit('%s') unexpectedly is %d\n",
-                                          name, cBOOL(isxdigit(i))));
+                                          "isxdigit('%s') unexpectedly is %x\n",
+                                          name, cBOOL(isU8_XDIGIT_LC(i))));
                 }
-                if (UNLIKELY(tolower(i) != (int) toLOWER_A(i))) {
+                if (UNLIKELY(toU8_LOWER_LC(i) != (int) toLOWER_A(i))) {
                     is_bad = TRUE;
                     DEBUG_L(PerlIO_printf(Perl_debug_log,
                             "tolower('%s')=0x%x instead of the expected 0x%x\n",
-                            name, tolower(i), (int) toLOWER_A(i)));
+                            name, toU8_LOWER_LC(i), (int) toLOWER_A(i)));
                 }
-                if (UNLIKELY(toupper(i) != (int) toUPPER_A(i))) {
+                if (UNLIKELY(toU8_UPPER_LC(i) != (int) toUPPER_A(i))) {
                     is_bad = TRUE;
                     DEBUG_L(PerlIO_printf(Perl_debug_log,
                             "toupper('%s')=0x%x instead of the expected 0x%x\n",
-                            name, toupper(i), (int) toUPPER_A(i)));
+                            name, toU8_UPPER_LC(i), (int) toUPPER_A(i)));
                 }
                 if (UNLIKELY((i == '\n' && ! isCNTRL_LC(i))))  {
                     is_bad = TRUE;
@@ -1645,46 +2409,25 @@ S_new_ctype(pTHX_ const char *newctype)
         if (bad_count == 2 && maybe_utf8_turkic) {
             bad_count = 0;
             *bad_chars_list = '\0';
-            PL_fold_locale['I'] = 'I';
-            PL_fold_locale['i'] = 'i';
-            PL_in_utf8_turkic_locale = TRUE;
-            DEBUG_L(PerlIO_printf(Perl_debug_log, "%s:%d: %s is turkic\n",
-                                                 __FILE__, __LINE__, newctype));
-        }
-        else {
-            PL_in_utf8_turkic_locale = FALSE;
-        }
 
-#  ifdef MB_CUR_MAX
-
-        /* We only handle single-byte locales (outside of UTF-8 ones; so if
-         * this locale requires more than one byte, there are going to be
-         * problems. */
-        DEBUG_Lv(PerlIO_printf(Perl_debug_log,
-                 "%s:%d: check_for_problems=%d, MB_CUR_MAX=%d\n",
-                 __FILE__, __LINE__, check_for_problems, (int) MB_CUR_MAX));
-
-        if (   check_for_problems && MB_CUR_MAX > 1
-            && ! PL_in_utf8_CTYPE_locale
-
-               /* Some platforms return MB_CUR_MAX > 1 for even the "C"
-                * locale.  Just assume that the implementation for them (plus
-                * for POSIX) is correct and the > 1 value is spurious.  (Since
-                * these are specially handled to never be considered UTF-8
-                * locales, as long as this is the only problem, everything
-                * should work fine */
-            && strNE(newctype, "C") && strNE(newctype, "POSIX"))
-        {
-            multi_byte_locale = TRUE;
+            /* The casts are because otherwise some compilers warn:
+                gcc.gnu.org/bugzilla/show_bug.cgi?id=99950
+                gcc.gnu.org/bugzilla/show_bug.cgi?id=94182
+             */
+            PL_fold_locale[ (U8) 'I' ] = 'I';
+            PL_fold_locale[ (U8) 'i' ] = 'i';
+            PL_in_utf8_turkic_locale = TRUE;
+            DEBUG_L(PerlIO_printf(Perl_debug_log, "%s is turkic\n", newctype));
         }
 
-#  endif
-
         /* If we found problems and we want them output, do so */
-        if (   (UNLIKELY(bad_count) || UNLIKELY(multi_byte_locale))
+        if (   (UNLIKELY(bad_count))
             && (LIKELY(ckWARN_d(WARN_LOCALE)) || UNLIKELY(DEBUG_L_TEST)))
         {
-            if (UNLIKELY(bad_count) && PL_in_utf8_CTYPE_locale) {
+            /* WARNING.  If you change the wording of these; be sure to update
+             * t/loc_tools.pl correspondingly */
+
+            if (PL_in_utf8_CTYPE_locale) {
                 PL_warn_locale = Perl_newSVpvf(aTHX_
                      "Locale '%s' contains (at least) the following characters"
                      " which have\nunexpected meanings: %s\nThe Perl program"
@@ -1692,29 +2435,24 @@ S_new_ctype(pTHX_ const char *newctype)
                       newctype, bad_chars_list);
             }
             else {
-                PL_warn_locale = Perl_newSVpvf(aTHX_
-                             "Locale '%s' may not work well.%s%s%s\n",
-                             newctype,
-                             (multi_byte_locale)
-                              ? "  Some characters in it are not recognized by"
-                                " Perl."
-                              : "",
-                             (bad_count)
-                              ? "\nThe following characters (and maybe others)"
-                                " may not have the same meaning as the Perl"
-                                " program expects:\n"
-                              : "",
-                             (bad_count)
-                              ? bad_chars_list
-                              : ""
+                PL_warn_locale =
+                    Perl_newSVpvf(aTHX_
+                                  "\nThe following characters (and maybe"
+                                  " others) may not have the same meaning as"
+                                  " the Perl program expects: %s\n",
+                                  bad_chars_list
                             );
             }
 
-#  ifdef HAS_NL_LANGINFO
+#    ifdef HAS_SOME_LANGINFO
 
+            const char * scratch_buffer = NULL;
             Perl_sv_catpvf(aTHX_ PL_warn_locale, "; codeset=%s",
-                                    /* parameter FALSE is a don't care here */
-                                    my_nl_langinfo(CODESET, FALSE));
+                                 my_langinfo_c(CODESET, LC_CTYPE,
+                                               newctype,
+                                               &scratch_buffer, NULL,
+                                               NULL));
+            Safefree(scratch_buffer);
 
 #  endif
 
@@ -1728,7 +2466,8 @@ S_new_ctype(pTHX_ const char *newctype)
             if (IN_LC(LC_CTYPE) || UNLIKELY(DEBUG_L_TEST)) {
 
                 /* The '0' below suppresses a bogus gcc compiler warning */
-                Perl_warner(aTHX_ packWARN(WARN_LOCALE), SvPVX(PL_warn_locale), 0);
+                Perl_warner(aTHX_ packWARN(WARN_LOCALE), SvPVX(PL_warn_locale),
+                                                                            0);
 
                 if (IN_LC(LC_CTYPE)) {
                     SvREFCNT_dec_NN(PL_warn_locale);
@@ -1737,22 +2476,21 @@ S_new_ctype(pTHX_ const char *newctype)
             }
         }
     }
-
-#endif /* USE_LOCALE_CTYPE */
-
 }
 
+#  endif /* USE_LOCALE_CTYPE */
+
 void
 Perl__warn_problematic_locale()
 {
 
-#ifdef USE_LOCALE_CTYPE
+#  ifdef USE_LOCALE_CTYPE
 
     dTHX;
 
     /* Internal-to-core function that outputs the message in PL_warn_locale,
      * and then NULLS it.  Should be called only through the macro
-     * _CHECK_AND_WARN_PROBLEMATIC_LOCALE */
+     * CHECK_AND_WARN_PROBLEMATIC_LOCALE_ */
 
     if (PL_warn_locale) {
         Perl_ck_warner(aTHX_ packWARN(WARN_LOCALE),
@@ -1762,26 +2500,39 @@ Perl__warn_problematic_locale()
         PL_warn_locale = NULL;
     }
 
-#endif
+#  endif
 
 }
 
 STATIC void
-S_new_collate(pTHX_ const char *newcoll)
+S_new_LC_ALL(pTHX_ const char *unused, bool force)
 {
+    PERL_ARGS_ASSERT_NEW_LC_ALL;
+    PERL_UNUSED_ARG(unused);
 
-#ifndef USE_LOCALE_COLLATE
+    /* LC_ALL updates all the things we care about. */
 
-    PERL_UNUSED_ARG(newcoll);
-    PERL_UNUSED_CONTEXT;
+    for (unsigned int i = 0; i < NOMINAL_LC_ALL_INDEX; i++) {
+        if (update_functions[i]) {
+            const char * this_locale = querylocale_i(i);
+            update_functions[i](aTHX_ this_locale, force);
+        }
+    }
+}
 
-#else
+#  ifdef USE_LOCALE_COLLATE
+
+STATIC void
+S_new_collate(pTHX_ const char *newcoll, bool force)
+{
+    PERL_ARGS_ASSERT_NEW_COLLATE;
+    PERL_UNUSED_ARG(force);
 
     /* Called after each libc setlocale() call affecting LC_COLLATE, to tell
      * core Perl this and that 'newcoll' is the name of the new locale.
      *
      * The design of locale collation is that every locale change is given an
-     * index 'PL_collation_ix'.  The first time a string particpates in an
+     * index 'PL_collation_ix'.  The first time a string participates in an
      * operation that requires collation while locale collation is active, it
      * is given PERL_MAGIC_collxfrm magic (via sv_collxfrm_flags()).  That
      * magic includes the collation index, and the transformation of the string
@@ -1794,14 +2545,23 @@ S_new_collate(pTHX_ const char *newcoll)
      * that a transformation would improperly be considered valid, leading to
      * an unlikely bug */
 
-    if (! newcoll) {
-        if (PL_collation_name) {
-            ++PL_collation_ix;
-            Safefree(PL_collation_name);
-            PL_collation_name = NULL;
-        }
-        PL_collation_standard = TRUE;
-      is_standard_collation:
+    /* Return if the locale isn't changing */
+    if (strEQ(PL_collation_name, newcoll)) {
+        return;
+    }
+
+    Safefree(PL_collation_name);
+    PL_collation_name = savepv(newcoll);
+    ++PL_collation_ix;
+
+    /* Set the new one up if trivial.  Since this is called at process
+     * initialization, be aware that this bit can't rely on much being
+     * available. */
+    PL_collation_standard = isNAME_C_OR_POSIX(newcoll);
+    if (PL_collation_standard) {
+        DEBUG_Lv(PerlIO_printf(Perl_debug_log,
+                               "Setting PL_collation name='%s'\n",
+                               PL_collation_name));
         PL_collxfrm_base = 0;
         PL_collxfrm_mult = 2;
         PL_in_utf8_COLLATE_locale = FALSE;
@@ -1810,240 +2570,105 @@ S_new_collate(pTHX_ const char *newcoll)
         return;
     }
 
-    /* If this is not the same locale as currently, set the new one up */
-    if (! PL_collation_name || strNE(PL_collation_name, newcoll)) {
-        ++PL_collation_ix;
-        Safefree(PL_collation_name);
-        PL_collation_name = stdize_locale(savepv(newcoll));
-        PL_collation_standard = isNAME_C_OR_POSIX(newcoll);
-        if (PL_collation_standard) {
-            goto is_standard_collation;
-        }
-
-        PL_in_utf8_COLLATE_locale = _is_cur_LC_category_utf8(LC_COLLATE);
-        PL_strxfrm_NUL_replacement = '\0';
-        PL_strxfrm_max_cp = 0;
+    /* Flag that the remainder of the set up is being deferred until first
+     * need. */
+    PL_collxfrm_mult = 0;
+    PL_collxfrm_base = 0;
 
-        /* A locale collation definition includes primary, secondary, tertiary,
-         * etc. weights for each character.  To sort, the primary weights are
-         * used, and only if they compare equal, then the secondary weights are
-         * used, and only if they compare equal, then the tertiary, etc.
-         *
-         * strxfrm() works by taking the input string, say ABC, and creating an
-         * output transformed string consisting of first the primary weights,
-         * A¹B¹C¹ followed by the secondary ones, A²B²C²; and then the
-         * tertiary, etc, yielding A¹B¹C¹ A²B²C² A³B³C³ ....  Some characters
-         * may not have weights at every level.  In our example, let's say B
-         * doesn't have a tertiary weight, and A doesn't have a secondary
-         * weight.  The constructed string is then going to be
-         *  A¹B¹C¹ B²C² A³C³ ....
-         * This has the desired effect that strcmp() will look at the secondary
-         * or tertiary weights only if the strings compare equal at all higher
-         * priority weights.  The spaces shown here, like in
-         *  "A¹B¹C¹ A²B²C² "
-         * are not just for readability.  In the general case, these must
-         * actually be bytes, which we will call here 'separator weights'; and
-         * they must be smaller than any other weight value, but since these
-         * are C strings, only the terminating one can be a NUL (some
-         * implementations may include a non-NUL separator weight just before
-         * the NUL).  Implementations tend to reserve 01 for the separator
-         * weights.  They are needed so that a shorter string's secondary
-         * weights won't be misconstrued as primary weights of a longer string,
-         * etc.  By making them smaller than any other weight, the shorter
-         * string will sort first.  (Actually, if all secondary weights are
-         * smaller than all primary ones, there is no need for a separator
-         * weight between those two levels, etc.)
-         *
-         * The length of the transformed string is roughly a linear function of
-         * the input string.  It's not exactly linear because some characters
-         * don't have weights at all levels.  When we call strxfrm() we have to
-         * allocate some memory to hold the transformed string.  The
-         * calculations below try to find coefficients 'm' and 'b' for this
-         * locale so that m*x + b equals how much space we need, given the size
-         * of the input string in 'x'.  If we calculate too small, we increase
-         * the size as needed, and call strxfrm() again, but it is better to
-         * get it right the first time to avoid wasted expensive string
-         * transformations. */
+}
 
-        {
-            /* We use the string below to find how long the tranformation of it
-             * is.  Almost all locales are supersets of ASCII, or at least the
-             * ASCII letters.  We use all of them, half upper half lower,
-             * because if we used fewer, we might hit just the ones that are
-             * outliers in a particular locale.  Most of the strings being
-             * collated will contain a preponderance of letters, and even if
-             * they are above-ASCII, they are likely to have the same number of
-             * weight levels as the ASCII ones.  It turns out that digits tend
-             * to have fewer levels, and some punctuation has more, but those
-             * are relatively sparse in text, and khw believes this gives a
-             * reasonable result, but it could be changed if experience so
-             * dictates. */
-            const char longer[] = "ABCDEFGHIJKLMnopqrstuvwxyz";
-            char * x_longer;        /* Transformed 'longer' */
-            Size_t x_len_longer;    /* Length of 'x_longer' */
-
-            char * x_shorter;   /* We also transform a substring of 'longer' */
-            Size_t x_len_shorter;
-
-            /* _mem_collxfrm() is used get the transformation (though here we
-             * are interested only in its length).  It is used because it has
-             * the intelligence to handle all cases, but to work, it needs some
-             * values of 'm' and 'b' to get it started.  For the purposes of
-             * this calculation we use a very conservative estimate of 'm' and
-             * 'b'.  This assumes a weight can be multiple bytes, enough to
-             * hold any UV on the platform, and there are 5 levels, 4 weight
-             * bytes, and a trailing NUL.  */
-            PL_collxfrm_base = 5;
-            PL_collxfrm_mult = 5 * sizeof(UV);
-
-            /* Find out how long the transformation really is */
-            x_longer = _mem_collxfrm(longer,
-                                     sizeof(longer) - 1,
-                                     &x_len_longer,
-
-                                     /* We avoid converting to UTF-8 in the
-                                      * called function by telling it the
-                                      * string is in UTF-8 if the locale is a
-                                      * UTF-8 one.  Since the string passed
-                                      * here is invariant under UTF-8, we can
-                                      * claim it's UTF-8 even though it isn't.
-                                      * */
-                                     PL_in_utf8_COLLATE_locale);
-            Safefree(x_longer);
-
-            /* Find out how long the transformation of a substring of 'longer'
-             * is.  Together the lengths of these transformations are
-             * sufficient to calculate 'm' and 'b'.  The substring is all of
-             * 'longer' except the first character.  This minimizes the chances
-             * of being swayed by outliers */
-            x_shorter = _mem_collxfrm(longer + 1,
-                                      sizeof(longer) - 2,
-                                      &x_len_shorter,
-                                      PL_in_utf8_COLLATE_locale);
-            Safefree(x_shorter);
-
-            /* If the results are nonsensical for this simple test, the whole
-             * locale definition is suspect.  Mark it so that locale collation
-             * is not active at all for it.  XXX Should we warn? */
-            if (   x_len_shorter == 0
-                || x_len_longer == 0
-                || x_len_shorter >= x_len_longer)
-            {
-                PL_collxfrm_mult = 0;
-                PL_collxfrm_base = 0;
-            }
-            else {
-                SSize_t base;       /* Temporary */
-
-                /* We have both:    m * strlen(longer)  + b = x_len_longer
-                 *                  m * strlen(shorter) + b = x_len_shorter;
-                 * subtracting yields:
-                 *          m * (strlen(longer) - strlen(shorter))
-                 *                             = x_len_longer - x_len_shorter
-                 * But we have set things up so that 'shorter' is 1 byte smaller
-                 * than 'longer'.  Hence:
-                 *          m = x_len_longer - x_len_shorter
-                 *
-                 * But if something went wrong, make sure the multiplier is at
-                 * least 1.
-                 */
-                if (x_len_longer > x_len_shorter) {
-                    PL_collxfrm_mult = (STRLEN) x_len_longer - x_len_shorter;
-                }
-                else {
-                    PL_collxfrm_mult = 1;
-                }
+#  endif /* USE_LOCALE_COLLATE */
+#endif  /* USE_LOCALE */
 
-                /*     mx + b = len
-                 * so:      b = len - mx
-                 * but in case something has gone wrong, make sure it is
-                 * non-negative */
-                base = x_len_longer - PL_collxfrm_mult * (sizeof(longer) - 1);
-                if (base < 0) {
-                    base = 0;
-                }
+#ifdef WIN32
 
-                /* Add 1 for the trailing NUL */
-                PL_collxfrm_base = base + 1;
-            }
+wchar_t *
+S_Win_byte_string_to_wstring(const UINT code_page, const char * byte_string)
+{
+    /* Caller must arrange to free the returned string */
 
-#  ifdef DEBUGGING
+    int req_size = MultiByteToWideChar(code_page, 0, byte_string, -1, NULL, 0);
+    if (! req_size) {
+        SET_EINVAL;
+        return NULL;
+    }
 
-            if (DEBUG_L_TEST || debug_initialization) {
-                PerlIO_printf(Perl_debug_log,
-                    "%s:%d: ?UTF-8 locale=%d; x_len_shorter=%zu, "
-                    "x_len_longer=%zu,"
-                    " collate multipler=%zu, collate base=%zu\n",
-                    __FILE__, __LINE__,
-                    PL_in_utf8_COLLATE_locale,
-                    x_len_shorter, x_len_longer,
-                    PL_collxfrm_mult, PL_collxfrm_base);
-            }
-#  endif
+    wchar_t *wstring;
+    Newx(wstring, req_size, wchar_t);
 
-        }
+    if (! MultiByteToWideChar(code_page, 0, byte_string, -1, wstring, req_size))
+    {
+        Safefree(wstring);
+        SET_EINVAL;
+        return NULL;
     }
 
-#endif /* USE_LOCALE_COLLATE */
-
+    return wstring;
 }
 
-#endif
+#define Win_utf8_string_to_wstring(s)  Win_byte_string_to_wstring(CP_UTF8, (s))
 
-#ifdef WIN32
+char *
+S_Win_wstring_to_byte_string(const UINT code_page, const wchar_t * wstring)
+{
+    /* Caller must arrange to free the returned string */
 
-#define USE_WSETLOCALE
+    int req_size =
+            WideCharToMultiByte(code_page, 0, wstring, -1, NULL, 0, NULL, NULL);
 
-#ifdef USE_WSETLOCALE
+    char *byte_string;
+    Newx(byte_string, req_size, char);
 
-STATIC char *
-S_wrap_wsetlocale(pTHX_ int category, const char *locale) {
-    wchar_t *wlocale;
-    wchar_t *wresult;
-    char *result;
+    if (! WideCharToMultiByte(code_page, 0, wstring, -1, byte_string,
+                                                         req_size, NULL, NULL))
+    {
+        Safefree(byte_string);
+        SET_EINVAL;
+        return NULL;
+    }
 
-    if (locale) {
-        int req_size =
-            MultiByteToWideChar(CP_UTF8, 0, locale, -1, NULL, 0);
+    return byte_string;
+}
 
-        if (!req_size) {
-            errno = EINVAL;
-            return NULL;
-        }
+#define Win_wstring_to_utf8_string(ws) Win_wstring_to_byte_string(CP_UTF8, (ws))
+
+STATIC const char *
+S_wrap_wsetlocale(pTHX_ const int category, const char *locale)
+{
+    PERL_ARGS_ASSERT_WRAP_WSETLOCALE;
+
+    /* Calls _wsetlocale(), converting the parameters/return to/from
+     * Perl-expected forms as if plain setlocale() were being called instead.
+     */
 
-        Newx(wlocale, req_size, wchar_t);
-        if (!MultiByteToWideChar(CP_UTF8, 0, locale, -1, wlocale, req_size)) {
-            Safefree(wlocale);
-            errno = EINVAL;
+    const wchar_t * wlocale = NULL;
+
+    if (locale) {
+        wlocale = Win_utf8_string_to_wstring(locale);
+        if (! wlocale) {
             return NULL;
         }
     }
-    else {
-        wlocale = NULL;
-    }
-    wresult = _wsetlocale(category, wlocale);
+
+    WSETLOCALE_LOCK;
+    const wchar_t * wresult = _wsetlocale(category, wlocale);
     Safefree(wlocale);
-    if (wresult) {
-        int req_size =
-            WideCharToMultiByte(CP_UTF8, 0, wresult, -1, NULL, 0, NULL, NULL);
-        Newx(result, req_size, char);
-        SAVEFREEPV(result); /* is there something better we can do here? */
-        if (!WideCharToMultiByte(CP_UTF8, 0, wresult, -1,
-                                 result, req_size, NULL, NULL)) {
-            errno = EINVAL;
-            return NULL;
-        }
-    }
-    else {
-        result = NULL;
+
+    if (! wresult) {
+        WSETLOCALE_UNLOCK;
+        return NULL;
     }
 
+    const char * result = Win_wstring_to_utf8_string(wresult);
+    WSETLOCALE_UNLOCK;
+
+    SAVEFREEPV(result); /* is there something better we can do here?  Answer:
+                           Without restructuring, returning a unique value each
+                           call is required.  See GH #20434 */
     return result;
 }
 
-#endif
-
-STATIC char *
+STATIC const char *
 S_win32_setlocale(pTHX_ int category, const char* locale)
 {
     /* This, for Windows, emulates POSIX setlocale() behavior.  There is no
@@ -2060,90 +2685,32 @@ S_win32_setlocale(pTHX_ int category, const char* locale)
      * use the particular category's variable if set; otherwise to use the LANG
      * variable. */
 
-    bool override_LC_ALL = FALSE;
-    char * result;
-    unsigned int i;
-
-    if (locale && strEQ(locale, "")) {
-
-#  ifdef LC_ALL
-
-        locale = PerlEnv_getenv("LC_ALL");
-        if (! locale) {
-            if (category ==  LC_ALL) {
-                override_LC_ALL = TRUE;
-            }
-            else {
-
-#  endif
-
-                for (i = 0; i < NOMINAL_LC_ALL_INDEX; i++) {
-                    if (category == categories[i]) {
-                        locale = PerlEnv_getenv(category_names[i]);
-                        goto found_locale;
-                    }
-                }
-
-                locale = PerlEnv_getenv("LANG");
-                if (! locale) {
-                    locale = "";
-                }
-
-              found_locale: ;
+    if (locale == NULL) {
+        return wrap_wsetlocale(category, NULL);
+    }
 
-#  ifdef LC_ALL
+    if (strEQ(locale, "")) {
+        /* Note this function may change the locale, but that's ok because we
+         * are about to change it anyway */
+        locale = find_locale_from_environment(get_category_index(category, ""));
+    }
 
-            }
-        }
+    const char * result = wrap_wsetlocale(category, locale);
+    DEBUG_L(PerlIO_printf(Perl_debug_log, "%s\n",
+                          setlocale_debug_string_r(category, locale, result)));
 
-#  endif
+#  ifdef USE_PL_CUR_LC_ALL
 
+    /* If we need to keep track of LC_ALL, update it to the new value.  */
+    Safefree(PL_cur_LC_ALL);
+    if (category == LC_ALL) {
+        PL_cur_LC_ALL = savepv(result);
     }
-
-#ifdef USE_WSETLOCALE
-    result = S_wrap_wsetlocale(aTHX_ category, locale);
-#else
-    result = setlocale(category, locale);
-#endif
-    DEBUG_L(STMT_START {
-                dSAVE_ERRNO;
-                PerlIO_printf(Perl_debug_log, "%s:%d: %s\n", __FILE__, __LINE__,
-                            setlocale_debug_string(category, locale, result));
-                RESTORE_ERRNO;
-            } STMT_END);
-
-    if (! override_LC_ALL)  {
-        return result;
-    }
-
-    /* Here the input category was LC_ALL, and we have set it to what is in the
-     * LANG variable or the system default if there is no LANG.  But these have
-     * lower priority than the other LC_foo variables, so override it for each
-     * one that is set.  (If they are set to "", it means to use the same thing
-     * we just set LC_ALL to, so can skip) */
-
-    for (i = 0; i < LC_ALL_INDEX; i++) {
-        result = PerlEnv_getenv(category_names[i]);
-        if (result && strNE(result, "")) {
-#ifdef USE_WSETLOCALE
-            S_wrap_wsetlocale(aTHX_ categories[i], result);
-#else
-            setlocale(categories[i], result);
-#endif
-            DEBUG_Lv(PerlIO_printf(Perl_debug_log, "%s:%d: %s\n",
-                __FILE__, __LINE__,
-                setlocale_debug_string(categories[i], result, "not captured")));
-        }
+    else {
+        PL_cur_LC_ALL = savepv(wrap_wsetlocale(LC_ALL, NULL));
     }
 
-    result = setlocale(LC_ALL, NULL);
-    DEBUG_L(STMT_START {
-                dSAVE_ERRNO;
-                PerlIO_printf(Perl_debug_log, "%s:%d: %s\n",
-                               __FILE__, __LINE__,
-                               setlocale_debug_string(LC_ALL, NULL, result));
-                RESTORE_ERRNO;
-            } STMT_END);
+#  endif
 
     return result;
 }
@@ -2173,11 +2740,16 @@ Finally, C<Perl_setlocale> works under all circumstances, whereas plain
 C<setlocale> can be completely ineffective on some platforms under some
 configurations.
 
-C<Perl_setlocale> should not be used to change the locale except on systems
-where the predefined variable C<${^SAFE_LOCALES}> is 1.  On some such systems,
-the system C<setlocale()> is ineffective, returning the wrong information, and
-failing to actually change the locale.  C<Perl_setlocale>, however works
-properly in all circumstances.
+Changing the locale is not a good idea when more than one thread is running,
+except on systems where the predefined variable C<${^SAFE_LOCALES}> is 1.
+This is because on such systems the locale is global to the whole process and
+not local to just the thread calling the function.  So changing it in one
+thread instantaneously changes it in all.  On some such systems, the system
+C<setlocale()> is ineffective, returning the wrong information, and failing to
+actually change the locale.  z/OS refuses to try to change the locale once a
+second thread is created.  C<Perl_setlocale>, should give you accurate results
+of what actually happened on these problematic platforms, returning NULL if the
+system forbade the locale change.
 
 The return points to a per-thread static buffer, which is overwritten the next
 time C<Perl_setlocale> is called from the same thread.
@@ -2186,6 +2758,14 @@ time C<Perl_setlocale> is called from the same thread.
 
 */
 
+#ifndef USE_LOCALE_NUMERIC
+#  define affects_LC_NUMERIC(cat) 0
+#elif defined(LC_ALL)
+#  define affects_LC_NUMERIC(cat) (cat == LC_NUMERIC || cat == LC_ALL)
+#else
+#  define affects_LC_NUMERIC(cat) (cat == LC_NUMERIC)
+#endif
+
 const char *
 Perl_setlocale(const int category, const char * locale)
 {
@@ -2201,187 +2781,1111 @@ Perl_setlocale(const int category, const char * locale)
 #else
 
     const char * retval;
-    const char * newlocale;
-    dSAVEDERRNO;
     dTHX;
-    DECLARATION_FOR_LC_NUMERIC_MANIPULATION;
 
-#ifdef USE_LOCALE_NUMERIC
+    DEBUG_L(PerlIO_printf(Perl_debug_log,
+                          "Entering Perl_setlocale(%d, \"%s\")\n",
+                          category, locale));
 
-    /* A NULL locale means only query what the current one is.  We have the
-     * LC_NUMERIC name saved, because we are normally switched into the C
-     * (or equivalent) locale for it.  For an LC_ALL query, switch back to get
-     * the correct results.  All other categories don't require special
-     * handling */
+    /* A NULL locale means only query what the current one is. */
     if (locale == NULL) {
+
+#  ifndef USE_LOCALE_NUMERIC
+
+        /* Without LC_NUMERIC, it's trivial; we just return the value */
+        return save_to_buffer(querylocale_r(category),
+                              &PL_setlocale_buf, &PL_setlocale_bufsize);
+#  else
+
+        /* We have the LC_NUMERIC name saved, because we are normally switched
+         * into the C locale (or equivalent) for it. */
         if (category == LC_NUMERIC) {
+            DEBUG_L(PerlIO_printf(Perl_debug_log,
+                    "Perl_setlocale(LC_NUMERIC, NULL) returning stashed '%s'\n",
+                    PL_numeric_name));
 
             /* We don't have to copy this return value, as it is a per-thread
              * variable, and won't change until a future setlocale */
             return PL_numeric_name;
         }
 
-#  ifdef LC_ALL
+#    ifndef LC_ALL
+
+        /* Without LC_ALL, just return the value */
+        return save_to_buffer(querylocale_r(category),
+                              &PL_setlocale_buf, &PL_setlocale_bufsize);
+
+#    else
+
+        /* Here, LC_ALL is available on this platform.  It's the one
+         * complicating category (because it can contain a toggled LC_NUMERIC
+         * value), for all the remaining ones (we took care of LC_NUMERIC
+         * above), just return the value */
+        if (category != LC_ALL) {
+            return save_to_buffer(querylocale_r(category),
+                                  &PL_setlocale_buf, &PL_setlocale_bufsize);
+        }
+
+        bool toggled = FALSE;
+
+        /* For an LC_ALL query, switch back to the underlying numeric locale
+         * (if we aren't there already) so as to get the correct results.  Our
+         * records for all the other categories are valid without switching */
+        if (! PL_numeric_underlying) {
+            set_numeric_underlying();
+            toggled = TRUE;
+        }
+
+        retval = querylocale_c(LC_ALL);
+
+        if (toggled) {
+            set_numeric_standard();
+        }
+
+        DEBUG_L(PerlIO_printf(Perl_debug_log, "%s\n",
+                            setlocale_debug_string_r(category, locale, retval)));
+
+        return save_to_buffer(retval, &PL_setlocale_buf, &PL_setlocale_bufsize);
+
+#    endif      /* Has LC_ALL */
+#  endif        /* Has LC_NUMERIC */
+
+    } /* End of querying the current locale */
+
+
+    unsigned int cat_index = get_category_index(category, NULL);
+    retval = querylocale_i(cat_index);
+
+    /* If the new locale is the same as the current one, nothing is actually
+     * being changed, so do nothing. */
+    if (      strEQ(retval, locale)
+        && (   ! affects_LC_NUMERIC(category)
+
+#  ifdef USE_LOCALE_NUMERIC
+
+            || strEQ(locale, PL_numeric_name)
+
+#  endif
+
+    )) {
+        DEBUG_L(PerlIO_printf(Perl_debug_log,
+                              "Already in requested locale: no action taken\n"));
+        return save_to_buffer(retval, &PL_setlocale_buf, &PL_setlocale_bufsize);
+    }
+
+    /* Here, an actual change is being requested.  Do it */
+    retval = setlocale_i(cat_index, locale);
+
+    if (! retval) {
+        DEBUG_L(PerlIO_printf(Perl_debug_log, "%s\n",
+                          setlocale_debug_string_i(cat_index, locale, "NULL")));
+        return NULL;
+    }
+
+    assert(strNE(retval, ""));
+    retval = save_to_buffer(retval, &PL_setlocale_buf, &PL_setlocale_bufsize);
+
+    /* Now that have changed locales, we have to update our records to
+     * correspond.  Only certain categories have extra work to update. */
+    if (update_functions[cat_index]) {
+        update_functions[cat_index](aTHX_ retval, false);
+    }
+
+    DEBUG_L(PerlIO_printf(Perl_debug_log, "returning '%s'\n", retval));
+
+    return retval;
+
+#endif
+
+}
+
+STATIC utf8ness_t
+S_get_locale_string_utf8ness_i(pTHX_ const char * string,
+                                     const locale_utf8ness_t known_utf8,
+                                     const char * locale,
+                                     const unsigned cat_index)
+{
+    PERL_ARGS_ASSERT_GET_LOCALE_STRING_UTF8NESS_I;
+
+#ifndef USE_LOCALE
+
+    return UTF8NESS_NO;
+    PERL_UNUSED_ARG(string);
+    PERL_UNUSED_ARG(known_utf8);
+    PERL_UNUSED_ARG(locale);
+    PERL_UNUSED_ARG(cat_index);
+
+#else
+
+    assert(cat_index <= NOMINAL_LC_ALL_INDEX);
+
+    /* Return to indicate if 'string' in the locale given by the input
+     * arguments should be considered UTF-8 or not.
+     *
+     * If the input 'locale' is not NULL, use that for the locale; otherwise
+     * use the current locale for the category specified by 'cat_index'.
+     */
+
+    if (string == NULL) {
+        return UTF8NESS_NO;
+    }
+
+    if (IN_BYTES) { /* respect 'use bytes' */
+        return UTF8NESS_NO;
+    }
+
+    Size_t len = strlen(string);
+
+    /* UTF8ness is immaterial if the representation doesn't vary */
+    const U8 * first_variant = NULL;
+    if (is_utf8_invariant_string_loc((U8 *) string, len, &first_variant)) {
+        return UTF8NESS_IMMATERIAL;
+    }
+
+    /* Can't be UTF-8 if invalid */
+    if (! is_utf8_string((U8 *) first_variant,
+                         len - ((char *) first_variant - string)))
+    {
+        return UTF8NESS_NO;
+    }
+
+    /* Here and below, we know the string is legal UTF-8, containing at least
+     * one character requiring a sequence of two or more bytes.  It is quite
+     * likely to be UTF-8.  But it pays to be paranoid and do further checking.
+     *
+     * If we already know the UTF-8ness of the locale, then we immediately know
+     * what the string is */
+    if (UNLIKELY(known_utf8 != LOCALE_UTF8NESS_UNKNOWN)) {
+        if (known_utf8 == LOCALE_IS_UTF8) {
+            return UTF8NESS_YES;
+        }
+        else {
+            return UTF8NESS_NO;
+        }
+    }
+
+#  ifdef HAS_RELIABLE_UTF8NESS_DETERMINATION
+
+    /* Here, we have available the libc functions that can be used to
+     * accurately determine the UTF8ness of the underlying locale.  If it is a
+     * UTF-8 locale, the string is UTF-8;  otherwise it was coincidental that
+     * the string is legal UTF-8
+     *
+     * However, if the perl is compiled to not pay attention to the category
+     * being passed in, you might think that that locale is essentially always
+     * the C locale, so it would make sense to say it isn't UTF-8.  But to get
+     * here, the string has to contain characters unknown in the C locale.  And
+     * in fact, Windows boxes are compiled without LC_MESSAGES, as their
+     * message catalog isn't really a part of the locale system.  But those
+     * messages really could be UTF-8, and given that the odds are rather small
+     * of something not being UTF-8 but being syntactically valid UTF-8, khw
+     * has decided to call such strings as UTF-8. */
+
+    if (locale == NULL) {
+        locale = querylocale_i(cat_index);
+    }
+    if (is_locale_utf8(locale)) {
+        return UTF8NESS_YES;
+    }
+
+    return UTF8NESS_NO;
+
+#  else
+
+    /* Here, we have a valid UTF-8 string containing non-ASCII characters, and
+     * don't have access to functions to check if the locale is UTF-8 or not.
+     * Assume that it is.  khw tried adding a check that the string is entirely
+     * in a single Unicode script, but discovered the strftime() timezone is
+     * user-settable through the environment, which may be in a different
+     * script than the locale-expected value. */
+    PERL_UNUSED_ARG(locale);
+    PERL_UNUSED_ARG(cat_index);
+
+    return UTF8NESS_YES;
+
+#  endif
+#endif
+
+}
+
+STATIC bool
+S_is_locale_utf8(pTHX_ const char * locale)
+{
+    /* Returns TRUE if the locale 'locale' is UTF-8; FALSE otherwise.  It uses
+     * my_langinfo(), which employs various methods to get this information
+     * if nl_langinfo() isn't available, using heuristics as a last resort, in
+     * which case, the result will very likely be correct for locales for
+     * languages that have commonly used non-ASCII characters, but for notably
+     * English, it comes down to if the locale's name ends in something like
+     * "UTF-8".  It errs on the side of not being a UTF-8 locale. */
+
+#  if ! defined(USE_LOCALE)                                                   \
+   || ! defined(USE_LOCALE_CTYPE)                                             \
+   ||   defined(EBCDIC) /* There aren't any real UTF-8 locales at this time */
+
+    PERL_UNUSED_ARG(locale);
+
+    return FALSE;
+
+#  else
+
+    const char * scratch_buffer = NULL;
+    const char * codeset;
+    bool retval;
+
+    PERL_ARGS_ASSERT_IS_LOCALE_UTF8;
+
+    if (strEQ(locale, PL_ctype_name)) {
+        return PL_in_utf8_CTYPE_locale;
+    }
+
+    codeset = my_langinfo_c(CODESET, LC_CTYPE, locale,
+                            &scratch_buffer, NULL, NULL);
+    retval = is_codeset_name_UTF8(codeset);
+
+    DEBUG_Lv(PerlIO_printf(Perl_debug_log,
+                           "found codeset=%s, is_utf8=%d\n", codeset, retval));
+
+    Safefree(scratch_buffer);
+    return retval;
+
+#  endif
+
+}
+
+#ifdef USE_LOCALE
+
+STATIC const char *
+S_save_to_buffer(const char * string, const char **buf, Size_t *buf_size)
+{
+    /* Copy the NUL-terminated 'string' to a buffer whose address before this
+     * call began at *buf, and whose available length before this call was
+     * *buf_size.
+     *
+     * If the length of 'string' is greater than the space available, the
+     * buffer is grown accordingly, which may mean that it gets relocated.
+     * *buf and *buf_size will be updated to reflect this.
+     *
+     * Regardless, the function returns a pointer to where 'string' is now
+     * stored.
+     *
+     * 'string' may be NULL, which means no action gets taken, and NULL is
+     * returned.
+     *
+     * If *buf or 'buf_size' are NULL or *buf_size is 0, the buffer is assumed
+     * empty, and memory is malloc'd.   'buf-size' being NULL is to be used
+     * when this is a single use buffer, which will shortly be freed by the
+     * caller.
+     */
+
+    Size_t string_size;
+
+    PERL_ARGS_ASSERT_SAVE_TO_BUFFER;
+
+    if (! string) {
+        return NULL;
+    }
+
+    /* No-op to copy over oneself */
+    if (string == *buf) {
+        return string;
+    }
+
+    string_size = strlen(string) + 1;
+
+    if (buf_size == NULL) {
+        Newx(*buf, string_size, char);
+    }
+    else if (*buf_size == 0) {
+        Newx(*buf, string_size, char);
+        *buf_size = string_size;
+    }
+    else if (string_size > *buf_size) {
+        Renew(*buf, string_size, char);
+        *buf_size = string_size;
+    }
+
+    {
+        dTHX_DEBUGGING;
+        DEBUG_Lv(PerlIO_printf(Perl_debug_log,
+                         "Copying '%s' to %p\n",
+                         ((is_utf8_string((U8 *) string, 0))
+                          ? string
+                          :_byte_dump_string((U8 *) string, strlen(string), 0)),
+                          *buf));
+    }
+
+#    ifdef DEBUGGING
+
+    /* Catch glitches.  Usually this is because LC_CTYPE needs to be the same
+     * locale as whatever is being worked on */
+    if (UNLIKELY(instr(string, REPLACEMENT_CHARACTER_UTF8))) {
+        dTHX_DEBUGGING;
+
+        locale_panic_(Perl_form(aTHX_
+                                "Unexpected REPLACEMENT_CHARACTER in '%s'\n%s",
+                                string, get_LC_ALL_display()));
+    }
+
+#    endif
+
+    Copy(string, *buf, string_size, char);
+    return *buf;
+}
+
+#  ifdef WIN32
+
+bool
+Perl_get_win32_message_utf8ness(pTHX_ const char * string)
+{
+    /* NULL => locale irrelevant, 0 => category irrelevant
+     * so returns based on the UTF-8 legality of the input string, ignoring the
+     * locale and category completely.
+     *
+     * This is because Windows doesn't have LC_MESSAGES */
+    return get_locale_string_utf8ness_i(string, LOCALE_IS_UTF8, NULL, 0);
+}
+
+#  endif
+#endif  /* USE_LOCALE */
+
+
+int
+Perl_mbtowc_(pTHX_ const wchar_t * pwc, const char * s, const Size_t len)
+{
+
+#if ! defined(HAS_MBRTOWC) && ! defined(HAS_MBTOWC)
+
+    PERL_UNUSED_ARG(pwc);
+    PERL_UNUSED_ARG(s);
+    PERL_UNUSED_ARG(len);
+    return -1;
+
+#else   /* Below we have some form of mbtowc() */
+#   if defined(HAS_MBRTOWC)                                     \
+   && (defined(USE_LOCALE_THREADS) || ! defined(HAS_MBTOWC))
+#    define USE_MBRTOWC
+#  else
+#    undef USE_MBRTOWC
+#  endif
+
+    int retval = -1;
+
+    if (s == NULL) { /* Initialize the shift state to all zeros in
+                        PL_mbrtowc_ps. */
+
+#  if defined(USE_MBRTOWC)
+
+        memzero(&PL_mbrtowc_ps, sizeof(PL_mbrtowc_ps));
+        return 0;
+
+#  else
+
+        MBTOWC_LOCK_;
+        SETERRNO(0, 0);
+        retval = mbtowc(NULL, NULL, 0);
+        MBTOWC_UNLOCK_;
+        return retval;
+
+#  endif
+
+    }
+
+#  if defined(USE_MBRTOWC)
+
+    SETERRNO(0, 0);
+    retval = (SSize_t) mbrtowc((wchar_t *) pwc, s, len, &PL_mbrtowc_ps);
+
+#  else
+
+    /* Locking prevents races, but locales can be switched out without locking,
+     * so this isn't a cure all */
+    MBTOWC_LOCK_;
+    SETERRNO(0, 0);
+    retval = mbtowc((wchar_t *) pwc, s, len);
+    MBTOWC_UNLOCK_;
+
+#  endif
+
+    return retval;
+
+#endif
+
+}
+
+/*
+=for apidoc Perl_localeconv
+
+This is a thread-safe version of the libc L<localeconv(3)>.  It is the same as
+L<POSIX::localeconv|POSIX/localeconv> (returning a hash of the C<localeconv()>
+fields), but directly callable from XS code.
+
+=cut
+*/
+
+HV *
+Perl_localeconv(pTHX)
+{
+
+#if  ! defined(HAS_LOCALECONV)
+
+    return newHV();
+
+#else
+
+    return my_localeconv(0);
+
+#endif
+
+}
+
+#if  defined(HAS_LOCALECONV)
+
+HV *
+S_my_localeconv(pTHX_ const int item)
+{
+    PERL_ARGS_ASSERT_MY_LOCALECONV;
+
+    /* This returns a mortalized hash containing all or one of the elements
+     * returned by localeconv().  It is used by Perl_localeconv() and
+     * POSIX::localeconv() and is thread-safe.
+     *
+     * There are two use cases:
+     * 1) Called from POSIX::locale_conv().  This returns the lconv structure
+     *    copied to a hash, based on the current underlying locales for
+     *    LC_NUMERIC and LC_MONETARY. An input item==0 signifies this case, or
+     *    on many platforms it is the only use case compiled.
+     * 2) Certain items that nl_langinfo() provides are also derivable from
+     *    the return of localeconv().  Windows notably doesn't have
+     *    nl_langinfo(), so on that, and actually any platform lacking it,
+     *    my_localeconv() is used also to emulate it for those particular
+     *    items.  The code to do this is compiled only on such platforms.
+     *    Rather than going to the expense of creating a full hash when only
+     *    one item is needed, the returned hash has just the desired item in
+     *    it.
+     *
+     * To access all the localeconv() struct lconv fields, there is a data
+     * structure that contains every commonly documented field in it.  (Maybe
+     * some minority platforms have extra fields.  Those could be added here
+     * without harm; they would just be ignored on platforms lacking them.)
+     *
+     * Our structure is compiled to make looping through the fields easier by
+     * pointing each name to its value's offset within lconv, e.g.,
+        { "thousands_sep", STRUCT_OFFSET(struct lconv, thousands_sep) }
+     */
+#  define LCONV_ENTRY(name)                                           \
+                {STRINGIFY(name), STRUCT_OFFSET(struct lconv, name)}
+
+    /* These synonyms are just for clarity, and to make it easier in case
+     * something needs to change in the future */
+#  define LCONV_NUMERIC_ENTRY(name)  LCONV_ENTRY(name)
+#  define LCONV_MONETARY_ENTRY(name) LCONV_ENTRY(name)
+
+    /* There are just a few fields for NUMERIC strings */
+    const lconv_offset_t lconv_numeric_strings[] = {
+#  ifndef NO_LOCALECONV_GROUPING
+        LCONV_NUMERIC_ENTRY(grouping),
+#   endif
+        LCONV_NUMERIC_ENTRY(thousands_sep),
+        LCONV_NUMERIC_ENTRY(decimal_point),
+        {NULL, 0}
+    };
+
+    /* When used to implement nl_langinfo(), we save time by only populating
+     * the hash with the field(s) needed.  Thus we would need a data structure
+     * of just:
+     *  LCONV_NUMERIC_ENTRY(decimal_point),
+     *  {NULL, 0}
+     *
+     * By placing the decimal_point field last in the full structure, we can
+     * use just the tail for this bit of it, saving space.  This macro yields
+     * the address of the sub structure. */
+#  define DECIMAL_POINT_ADDRESS                                             \
+        &lconv_numeric_strings[(C_ARRAY_LENGTH(lconv_numeric_strings) - 2)]
+
+    /* And the MONETARY string fields */
+    const lconv_offset_t lconv_monetary_strings[] = {
+        LCONV_MONETARY_ENTRY(int_curr_symbol),
+        LCONV_MONETARY_ENTRY(mon_decimal_point),
+#  ifndef NO_LOCALECONV_MON_THOUSANDS_SEP
+        LCONV_MONETARY_ENTRY(mon_thousands_sep),
+#  endif
+#  ifndef NO_LOCALECONV_MON_GROUPING
+        LCONV_MONETARY_ENTRY(mon_grouping),
+#  endif
+        LCONV_MONETARY_ENTRY(positive_sign),
+        LCONV_MONETARY_ENTRY(negative_sign),
+        LCONV_MONETARY_ENTRY(currency_symbol),
+        {NULL, 0}
+    };
+
+    /* Like above, this field being last can be used as a sub structure */
+#  define CURRENCY_SYMBOL_ADDRESS                                            \
+      &lconv_monetary_strings[(C_ARRAY_LENGTH(lconv_monetary_strings) - 2)]
+
+    /* Finally there are integer fields, all are for monetary purposes */
+    const lconv_offset_t lconv_integers[] = {
+        LCONV_ENTRY(int_frac_digits),
+        LCONV_ENTRY(frac_digits),
+        LCONV_ENTRY(p_sep_by_space),
+        LCONV_ENTRY(n_cs_precedes),
+        LCONV_ENTRY(n_sep_by_space),
+        LCONV_ENTRY(p_sign_posn),
+        LCONV_ENTRY(n_sign_posn),
+#  ifdef HAS_LC_MONETARY_2008
+        LCONV_ENTRY(int_p_cs_precedes),
+        LCONV_ENTRY(int_p_sep_by_space),
+        LCONV_ENTRY(int_n_cs_precedes),
+        LCONV_ENTRY(int_n_sep_by_space),
+        LCONV_ENTRY(int_p_sign_posn),
+        LCONV_ENTRY(int_n_sign_posn),
+#  endif
+        LCONV_ENTRY(p_cs_precedes),
+        {NULL, 0}
+    };
+
+    /* Like above, this field being last can be used as a sub structure */
+#  define P_CS_PRECEDES_ADDRESS                                       \
+      &lconv_integers[(C_ARRAY_LENGTH(lconv_integers) - 2)]
+
+    /* If we aren't paying attention to a given category, use LC_CTYPE instead;
+     * If not paying attention to that either, the code below should end up not
+     * using this.  Make sure that things blow up if that avoidance gets lost,
+     * by setting the category to -1 */
+    unsigned int numeric_index;
+    unsigned int monetary_index;
+
+#  ifdef USE_LOCALE_NUMERIC
+    numeric_index = LC_NUMERIC_INDEX_;
+#  elif defined(USE_LOCALE_CTYPE)
+    numeric_index = LC_CTYPE_INDEX_;
+#  else
+    numeric_index = (unsigned) -1;
+#  endif
+#  ifdef USE_LOCALE_MONETARY
+    monetary_index = LC_MONETARY_INDEX_;
+#  elif defined(USE_LOCALE_CTYPE)
+    monetary_index = LC_CTYPE_INDEX_;
+#  else
+    monetary_index = (unsigned) -1;
+#  endif
+
+    /* Some platforms, for correct non-mojibake results, require LC_CTYPE's
+     * locale to match LC_NUMERIC's for the numeric fields, and LC_MONETARY's
+     * for the monetary ones.  What happens if LC_NUMERIC and LC_MONETARY
+     * aren't compatible?  Wrong results.  To avoid that, we call localeconv()
+     * twice, once for each locale, setting LC_CTYPE to match the category.
+     * But if the locales of both categories are the same, there is no need for
+     * a second call.  Assume this is the case unless overridden below */
+    bool requires_2nd_localeconv = false;
+
+    /* The actual hash populating is done by S_populate_hash_from_localeconv().
+     * It gets passed an array of length two containing the data structure it
+     * is supposed to use to get the key names to fill the hash with.  One
+     * element is alwasy for the NUMERIC strings (or NULL if none to use), and
+     * the other element similarly for the MONETARY ones. */
+#    define NUMERIC_STRING_OFFSET   0
+#    define MONETARY_STRING_OFFSET  1
+    const lconv_offset_t * strings[2] = { NULL, NULL };
+
+    /* This is a mask, with one bit to tell S_populate_hash_from_localeconv to
+     * populate the NUMERIC items; another bit for the MONETARY ones.  This way
+     * it can choose which (or both) to populate from */
+    U32 index_bits = 0;
+
+    /* This converts from a locale index to its bit position in the above mask.
+     * */
+#  define INDEX_TO_BIT(i)  (1 << (i))
+
+    /* The two categories can have disparate locales.  Initialize them to C and
+     * override later whichever one(s) we pay attention to */
+    const char * numeric_locale = "C";
+    const char * monetary_locale = "C";
+
+    /* This will be either 'numeric_locale' or 'monetary_locale' depending on
+     * what we are working on at the moment */
+    const char * locale;
+
+    /* The LC_MONETARY category also has some integer-valued fields, whose
+     * information is kept in a separate list */
+    const lconv_offset_t * integers;
+
+#  ifdef HAS_SOME_LANGINFO
+
+    /* If the only use-case for this is the full localeconv(), the 'item'
+     * parameter is ignored. */
+    PERL_UNUSED_ARG(item);
+
+#  else
+
+    /* This only gets compiled for the use-case of using localeconv() to
+     * emulate an nl_langinfo() missing from the platform.
+     *
+     * We need this substructure to only return this field for the THOUSEP
+     * item.  The other items also need substructures, but they were handled
+     * above by placing the substructure's item at the end of the full one, so
+     * the data structure could do double duty.  However, both this and
+     * RADIXCHAR would need to be in the final position of the same full
+     * structure; an impossibility.  So make this into a separate structure */
+    const lconv_offset_t  thousands_sep_string[] = {
+        LCONV_NUMERIC_ENTRY(thousands_sep),
+        {NULL, 0}
+    };
+
+    /* End of all the initialization of datastructures.  Now for actual code.
+     *
+     * Without nl_langinfo(), the call to my_localeconv() could be for just one
+     * of the following 3 items to emulate nl_langinfo().  This is compiled
+     * only when using perl_langinfo.h, which we control, and it has been
+     * constructed so that no item is numbered 0.
+     *
+     * For each, setup the appropriate parameters for the call below to
+     * S_populate_hash_from_localeconv() */
+    if (item != 0) switch (item) {
+      default:
+        locale_panic_(Perl_form(aTHX_
+                    "Unexpected item passed to my_localeconv: %d", item));
+        break;
+
+#    ifdef USE_LOCALE_NUMERIC
+
+      case RADIXCHAR:
+        locale = numeric_locale = PL_numeric_name;
+        index_bits = INDEX_TO_BIT(LC_NUMERIC_INDEX_);
+        strings[NUMERIC_STRING_OFFSET] = DECIMAL_POINT_ADDRESS;
+        integers = NULL;
+        break;
+
+      case THOUSEP:
+        index_bits = INDEX_TO_BIT(LC_NUMERIC_INDEX_);
+        locale = numeric_locale = PL_numeric_name;
+        strings[NUMERIC_STRING_OFFSET] = thousands_sep_string;
+        integers = NULL;
+        break;
+
+#    endif
+#    ifdef USE_LOCALE_MONETARY
+
+      case CRNCYSTR:
+        index_bits = INDEX_TO_BIT(LC_MONETARY_INDEX_);
+        locale = monetary_locale = querylocale_i(LC_MONETARY_INDEX_);
+
+        /* This item needs the values for both the currency symbol, and another
+         * one used to construct the nl_langino()-compatible return */
+        strings[MONETARY_STRING_OFFSET] = CURRENCY_SYMBOL_ADDRESS;
+        integers = P_CS_PRECEDES_ADDRESS;
+        break;
+
+#    endif
+
+    } /* End of switch() */
+
+    else    /* End of for just one item to emulate nl_langinfo() */
+
+#  endif
+
+    {   /* Here, the call is for all of localeconv().  It has a bunch of
+         * items.  As in the individual item case, set up the parameters for
+         * S_populate_hash_from_localeconv(); */
+
+#  ifdef USE_LOCALE_NUMERIC
+        numeric_locale = PL_numeric_name;
+#  elif defined(USE_LOCALE_CTYPE)
+        numeric_locale = querylocale_i(numeric_index);
+#  endif
+#  if defined(USE_LOCALE_MONETARY) || defined(USE_LOCALE_CTYPE)
+        monetary_locale = querylocale_i(monetary_index);
+#  endif
+
+        /* The first call to S_populate_hash_from_localeconv() will be for the
+         * MONETARY values */
+        index_bits = INDEX_TO_BIT(monetary_index);
+        locale = monetary_locale;
+
+        /* And if the locales for the two categories are the same, we can also
+         * do the NUMERIC values in the same call */
+        if (strEQ(numeric_locale, monetary_locale)) {
+            index_bits |= INDEX_TO_BIT(numeric_index);
+        }
+        else {
+            requires_2nd_localeconv = true;
+        }
+
+        /* We always pass both sets of strings. 'index_bits' tells
+         * S_populate_hash_from_localeconv which to actually look at */
+        strings[NUMERIC_STRING_OFFSET] = lconv_numeric_strings;
+        strings[MONETARY_STRING_OFFSET] = lconv_monetary_strings;
+
+        /* And pass the integer values to populate; again 'index_bits' will
+         * say to use them or not */
+        integers = lconv_integers;
+
+    }   /* End of call is for localeconv() */
+
+    /* The code above has determined the parameters to
+       S_populate_hash_from_localeconv() for both cases of an individual item
+       and for the entire structure.  Below is code common to both */
+
+    HV * hv = newHV();      /* The returned hash, initially empty */
+    sv_2mortal((SV*)hv);
+
+    /* Call localeconv() and copy its results into the hash.  All the
+     * parameters have been initialized above */
+    populate_hash_from_localeconv(hv,
+                                  locale,
+                                  index_bits,
+                                  strings,
+                                  integers
+                                 );
+
+    /* The above call may have done all the hash fields, but not always, as
+     * already explained.  If we need a second call it is always for the
+     * NUMERIC fields */
+    if (requires_2nd_localeconv) {
+        populate_hash_from_localeconv(hv,
+                                      numeric_locale,
+                                      INDEX_TO_BIT(numeric_index),
+                                      strings,
+                                      NULL      /* There are No NUMERIC integer
+                                                   fields */
+                                     );
+    }
+
+    /* Here, the hash has been completely populated.
+     *
+     * Now go through all the items and:
+     *  a) For string items, see if they should be marked as UTF-8 or not.
+     *     This would have been more convenient and faster to do while
+     *     populating the hash in the first place, but that operation has to be
+     *     done within a critical section, keeping other threads from
+     *     executing, so only the minimal amount of work necessary is done at
+     *     that time.
+     *  b) For integer items, convert the C CHAR_MAX value into -1.  Again,
+     *     this could have been done in the critical section, but was deferred
+     *     to here to keep to the bare minimum amount the time spent owning the
+     *     processor. CHAR_MAX is a C concept for an 8-bit character type.
+     *     Perl has no such type; the closest fit is a -1.
+     *
+     * XXX On unthreaded perls, this code could be #ifdef'd out, and the
+     * corrections determined at hash population time, at an extra maintenance
+     * cost which khw doesn't think is worth it
+     */
+    for (unsigned int i = 0; i < 2; i++) {  /* Try both types of strings */
+        if (! strings[i]) {     /* Skip if no strings of this type */
+            continue;
+        }
+
+        locale = (i == NUMERIC_STRING_OFFSET)
+                 ? numeric_locale
+                 : monetary_locale;
+
+        locale_utf8ness_t locale_is_utf8 = LOCALE_UTF8NESS_UNKNOWN;
+
+#  ifdef HAS_RELIABLE_UTF8NESS_DETERMINATION
+
+        /* It saves time in the loop below to have predetermined the UTF8ness
+         * of the locale.  But only do so if the platform reliably has this
+         * information; otherwise to do it, this could recurse indefinitely.
+         *
+         * When we don't do it here, it will be done on a per-element basis in
+         * the loop.  The per-element check is intelligent enough to not
+         * recurse */
+
+        locale_is_utf8 = (is_locale_utf8(locale))
+                         ? LOCALE_IS_UTF8
+                         : LOCALE_NOT_UTF8;
+
+        if (locale_is_utf8 == LOCALE_NOT_UTF8) {
+            continue;   /* No string can be UTF-8 if the locale isn't */
+        }
+
+#  endif
+
+        /* Examine each string */
+        while (1) {
+            const char * name = strings[i]->name;
+
+            if (! name) {   /* Reached the end */
+                break;
+            }
+
+            /* 'value' will contain the string that may need to be marked as
+             * UTF-8 */
+            SV ** value = hv_fetch(hv, name, strlen(name), true);
+            if (! value) {
+                continue;
+            }
+
+            /* Determine if the string should be marked as UTF-8. */
+            if (UTF8NESS_YES == (get_locale_string_utf8ness_i(SvPVX(*value),
+                                                              locale_is_utf8,
+                                                              NULL, 0)))
+            {
+                SvUTF8_on(*value);
+            }
+
+            strings[i]++;   /* Iterate */
+        }
+    }   /* End of fixing up UTF8ness */
+
+
+    /* Examine each integer */
+    if (integers) while (1) {
+        const char * name = integers->name;
+
+        if (! name) {   /* Reached the end */
+            break;
+        }
 
-        else if (category == LC_ALL) {
-            STORE_LC_NUMERIC_FORCE_TO_UNDERLYING();
+        SV ** value = hv_fetch(hv, name, strlen(name), true);
+        if (! value) {
+            continue;
         }
 
-#  endif
+        /* Change CHAR_MAX to -1 */
+        if (SvIV(*value) == CHAR_MAX) {
+            sv_setiv(*value, -1);
+        }
 
+        integers++;   /* Iterate */
     }
 
-#endif
+    return hv;
+}
 
-    retval = save_to_buffer(do_setlocale_r(category, locale),
-                            &PL_setlocale_buf, &PL_setlocale_bufsize, 0);
-    SAVE_ERRNO;
+STATIC void
+S_populate_hash_from_localeconv(pTHX_ HV * hv,
 
-#if defined(USE_LOCALE_NUMERIC) && defined(LC_ALL)
+                                      /* Switch to this locale to run
+                                       * localeconv() from */
+                                      const char * locale,
 
-    if (locale == NULL && category == LC_ALL) {
-        RESTORE_LC_NUMERIC();
-    }
+                                      /* bit mask of which categories to
+                                       * populate */
+                                      const U32 which_mask,
 
-#endif
+                                      /* strings[0] points the numeric
+                                       * string fields; [1] to the monetary */
+                                      const lconv_offset_t * strings[2],
 
-    DEBUG_L(PerlIO_printf(Perl_debug_log,
-        "%s:%d: %s\n", __FILE__, __LINE__,
-            setlocale_debug_string(category, locale, retval)));
+                                      /* And to the monetary integer fields */
+                                      const lconv_offset_t * integers)
+{
+    PERL_ARGS_ASSERT_POPULATE_HASH_FROM_LOCALECONV;
+    PERL_UNUSED_ARG(which_mask);    /* Some configurations don't use this;
+                                       complicated to figure out which */
+
+    /* Run localeconv() and copy some or all of its results to the input 'hv'
+     * hash.  Most localeconv() implementations return the values in a global
+     * static buffer, so the operation must be performed in a critical section,
+     * ending only after the copy is completed.  There are so many locks
+     * because localeconv() deals with two categories, and returns in a single
+     * global static buffer.  Some locks might be no-ops on this platform, but
+     * not others.  We need to lock if any one isn't a no-op. */
 
-    RESTORE_ERRNO;
+#  ifdef USE_LOCALE_CTYPE
 
-    if (! retval) {
-        return NULL;
-    }
+    /* Some platforms require LC_CTYPE to be congruent with the category we are
+     * looking for */
+    const char * orig_CTYPE_locale = toggle_locale_c(LC_CTYPE, locale);
 
-    /* If locale == NULL, we are just querying the state */
-    if (locale == NULL) {
-        return retval;
-    }
+#  endif
+#  ifdef USE_LOCALE_NUMERIC
 
-    /* Now that have switched locales, we have to update our records to
-     * correspond. */
+    /* We need to toggle to the underlying NUMERIC locale if we are getting
+     * NUMERIC strings */
+    const char * orig_NUMERIC_locale = NULL;
+    if (which_mask & INDEX_TO_BIT(LC_NUMERIC_INDEX_)) {
+        LC_NUMERIC_LOCK(0);
+        orig_NUMERIC_locale = toggle_locale_i(LC_NUMERIC_INDEX_, locale);
+    }
 
-    switch (category) {
+#    endif
 
-#ifdef USE_LOCALE_CTYPE
+    /* Finally ready to do the actual localeconv().  Lock to prevent other
+     * accesses until we have made a copy of its returned static buffer */
+    gwLOCALE_LOCK;
 
-        case LC_CTYPE:
-            new_ctype(retval);
-            break;
+#  ifdef TS_W32_BROKEN_LOCALECONV
 
-#endif
-#ifdef USE_LOCALE_COLLATE
+    /* This is a workaround for another bug in Windows.  localeconv() was
+     * broken with thread-safe locales prior to VS 15.  It looks at the global
+     * locale instead of the thread one.  As a work-around, we toggle to the
+     * global locale; populate the return; then toggle back.  We have to use
+     * LC_ALL instead of the individual categories because of yet another bug
+     * in Windows.  And this all has to be done in a critical section.
+     *
+     * This introduces a potential race with any other thread that has also
+     * converted to use the global locale, and doesn't protect its locale calls
+     * with mutexes.  khw can't think of any reason for a thread to do so on
+     * Windows, as the locale API is the same regardless of thread-safety, except
+     * if the code is ported from working on another platform where there might
+     * be some reason to do this.  But this is typically due to some
+     * alien-to-Perl library that thinks it owns locale setting.  Such a
+     * library isn't likely to exist on Windows, so such an application is
+     * unlikely to be run on Windows
+     */
+    bool restore_per_thread = FALSE;
 
-        case LC_COLLATE:
-            new_collate(retval);
-            break;
+    /* Save the per-thread locale state */
+    const char * save_thread = querylocale_c(LC_ALL);
 
-#endif
-#ifdef USE_LOCALE_NUMERIC
+    /* Change to the global locale, and note if we already were there */
+    if (_configthreadlocale(_DISABLE_PER_THREAD_LOCALE)
+                         != _DISABLE_PER_THREAD_LOCALE)
+    {
+        restore_per_thread = TRUE;
+    }
 
-        case LC_NUMERIC:
-            new_numeric(retval);
-            break;
+    /* Save the state of the global locale; then convert to our desired
+     * state.  */
+    const char * save_global = querylocale_c(LC_ALL);
+    void_setlocale_c(LC_ALL, save_thread);
 
-#endif
-#ifdef LC_ALL
+#  endif  /* TS_W32_BROKEN_LOCALECONV */
 
-        case LC_ALL:
+    /* Finally, do the actual localeconv */
+    const char *lcbuf_as_string = (const char *) localeconv();
 
-            /* LC_ALL updates all the things we care about.  The values may not
-             * be the same as 'retval', as the locale "" may have set things
-             * individually */
+    /* Fill in the string fields of the HV* */
+    for (unsigned int i = 0; i < 2; i++) {
 
-#  ifdef USE_LOCALE_CTYPE
+#  ifdef USE_LOCALE_NUMERIC
 
-            newlocale = savepv(do_setlocale_c(LC_CTYPE, NULL));
-            new_ctype(newlocale);
-            Safefree(newlocale);
+        /* One iteration is only for the numeric string fields */
+        if (   i == NUMERIC_STRING_OFFSET
+            && (which_mask & INDEX_TO_BIT(LC_NUMERIC_INDEX_))  == 0)
+        {
+            continue;
+        }
 
-#  endif /* USE_LOCALE_CTYPE */
-#  ifdef USE_LOCALE_COLLATE
+#  endif
+#  ifdef USE_LOCALE_MONETARY
 
-            newlocale = savepv(do_setlocale_c(LC_COLLATE, NULL));
-            new_collate(newlocale);
-            Safefree(newlocale);
+        /* The other iteration is only for the monetary string fields */
+        if (   i == MONETARY_STRING_OFFSET
+            && (which_mask & INDEX_TO_BIT(LC_MONETARY_INDEX_)) == 0)
+        {
+            continue;
+        }
 
 #  endif
-#  ifdef USE_LOCALE_NUMERIC
 
-            newlocale = savepv(do_setlocale_c(LC_NUMERIC, NULL));
-            new_numeric(newlocale);
-            Safefree(newlocale);
+        /* For each field for the given category ... */
+        const lconv_offset_t * category_strings = strings[i];
+        while (1) {
+            const char * name = category_strings->name;
+            if (! name) {   /* Quit at the end */
+                break;
+            }
 
-#  endif /* USE_LOCALE_NUMERIC */
-#endif /* LC_ALL */
+            /* we have set things up so that we know where in the returned
+             * structure, when viewed as a string, the corresponding value is.
+             * */
+            const char *value = *((const char **)(  lcbuf_as_string
+                                                  + category_strings->offset));
 
-        default:
-            break;
-    }
+            /* Set to get next string on next iteration */
+            category_strings++;
 
-    return retval;
+            /* Skip if this platform doesn't have this field. */
+            if (! value) {
+                continue;
+            }
 
-#endif
+            /* Copy to the hash */
+            (void) hv_store(hv,
+                            name, strlen(name),
+                            newSVpv(value, strlen(value)),
+                            0);
+        }
 
-}
+        /* Add any int fields to the HV* */
+        if (i == MONETARY_STRING_OFFSET && integers) {
+            while (integers->name) {
+                const char value = *((const char *)(  lcbuf_as_string
+                                                    + integers->offset));
+                (void) hv_store(hv, integers->name,
+                                strlen(integers->name), newSViv(value), 0);
+                integers++;
+            }
+        }
+    }   /* End of loop through the fields */
 
-PERL_STATIC_INLINE const char *
-S_save_to_buffer(const char * string, char **buf, Size_t *buf_size, const Size_t offset)
-{
-    /* Copy the NUL-terminated 'string' to 'buf' + 'offset'.  'buf' has size 'buf_size',
-     * growing it if necessary */
+    /* Done with copying to the hash.  Can unwind the critical section locks */
 
-    Size_t string_size;
+#  ifdef TS_W32_BROKEN_LOCALECONV
 
-    PERL_ARGS_ASSERT_SAVE_TO_BUFFER;
+    /* Restore the global locale's prior state */
+    void_setlocale_c(LC_ALL, save_global);
 
-    if (! string) {
-        return NULL;
+    /* And back to per-thread locales */
+    if (restore_per_thread) {
+        _configthreadlocale(_ENABLE_PER_THREAD_LOCALE);
     }
 
-    string_size = strlen(string) + offset + 1;
+    /* Restore the per-thread locale state */
+    void_setlocale_c(LC_ALL, save_thread);
 
-    if (*buf_size == 0) {
-        Newx(*buf, string_size, char);
-        *buf_size = string_size;
-    }
-    else if (string_size > *buf_size) {
-        Renew(*buf, string_size, char);
-        *buf_size = string_size;
+#  endif  /* TS_W32_BROKEN_LOCALECONV */
+
+    gwLOCALE_UNLOCK;    /* Finished with the critical section of a
+                           globally-accessible buffer */
+
+#  ifdef USE_LOCALE_NUMERIC
+
+    restore_toggled_locale_i(LC_NUMERIC_INDEX_, orig_NUMERIC_locale);
+    if (which_mask & INDEX_TO_BIT(LC_NUMERIC_INDEX_)) {
+        LC_NUMERIC_UNLOCK;
     }
 
-    Copy(string, *buf + offset, string_size - offset, char);
-    return *buf;
+#  endif
+#  ifdef USE_LOCALE_CTYPE
+
+    restore_toggled_locale_c(LC_CTYPE, orig_CTYPE_locale);
+
+#  endif
+
 }
 
+#endif /* defined(HAS_LOCALECONV) */
+#ifndef HAS_SOME_LANGINFO
+
+typedef int nl_item;    /* Substitute 'int' for emulated nl_langinfo() */
+
+#endif
+
 /*
 
-=for apidoc Perl_langinfo
+=for apidoc      Perl_langinfo
+=for apidoc_item Perl_langinfo8
+
+C<Perl_langinfo> is an (almost) drop-in replacement for the system
+C<L<nl_langinfo(3)>>, taking the same C<item> parameter values, and returning
+the same information.  But it is more thread-safe than regular
+C<nl_langinfo()>, and hides the quirks of Perl's locale handling from your
+code, and can be used on systems that lack a native C<nl_langinfo>.
 
-This is an (almost) drop-in replacement for the system C<L<nl_langinfo(3)>>,
-taking the same C<item> parameter values, and returning the same information.
-But it is more thread-safe than regular C<nl_langinfo()>, and hides the quirks
-of Perl's locale handling from your code, and can be used on systems that lack
-a native C<nl_langinfo>.
+However, you should instead use the improved version of this:
+L</Perl_langinfo8>, which behaves identically except for an additional
+parameter, a pointer to a variable declared as L</C<utf8ness_t>>, into which it
+returns to you how you should treat the returned string with regards to it
+being encoded in UTF-8 or not.
 
-Expanding on these:
+Concerning the differences between these and plain C<nl_langinfo()>:
 
 =over
 
-=item *
+=item a.
 
-The reason it isn't quite a drop-in replacement is actually an advantage.  The
-only difference is that it returns S<C<const char *>>, whereas plain
-C<nl_langinfo()> returns S<C<char *>>, but you are (only by documentation)
-forbidden to write into the buffer.  By declaring this C<const>, the compiler
-enforces this restriction, so if it is violated, you know at compilation time,
-rather than getting segfaults at runtime.
+C<Perl_langinfo8> has an extra parameter, described above.  Besides this, the
+other reason they aren't quite a drop-in replacement is actually an advantage.
+The C<const>ness of the return allows the compiler to catch attempts to write
+into the returned buffer, which is illegal and could cause run-time crashes.
 
-=item *
+=item b.
 
-It delivers the correct results for the C<RADIXCHAR> and C<THOUSEP> items,
+They deliver the correct results for the C<RADIXCHAR> and C<THOUSEP> items,
 without you having to write extra code.  The reason for the extra code would be
 because these are from the C<LC_NUMERIC> locale category, which is normally
 kept set by Perl so that the radix is a dot, and the separator is the empty
@@ -2393,737 +3897,1094 @@ the other advantages of C<Perl_langinfo()>; not keeping C<LC_NUMERIC> in the C
 (or equivalent) locale would break a lot of CPAN, which is expecting the radix
 (decimal point) character to be a dot.)
 
-=item *
+=item c.
 
-The system function it replaces can have its static return buffer trashed,
+The system function they replace can have its static return buffer trashed,
 not only by a subsequent call to that function, but by a C<freelocale>,
-C<setlocale>, or other locale change.  The returned buffer of this function is
-not changed until the next call to it, so the buffer is never in a trashed
-state.
+C<setlocale>, or other locale change.  The returned buffer of these functions
+is not changed until the next call to one or the other, so the buffer is never
+in a trashed state.
 
-=item *
+=item d.
 
-Its return buffer is per-thread, so it also is never overwritten by a call to
-this function from another thread;  unlike the function it replaces.
+The return buffer is per-thread, so it also is never overwritten by a call to
+these functions from another thread;  unlike the function it replaces.
 
-=item *
+=item e.
 
-But most importantly, it works on systems that don't have C<nl_langinfo>, such
-as Windows, hence makes your code more portable.  Of the fifty-some possible
+But most importantly, they work on systems that don't have C<nl_langinfo>, such
+as Windows, hence making your code more portable.  Of the fifty-some possible
 items specified by the POSIX 2008 standard,
 L<http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/langinfo.h.html>,
 only one is completely unimplemented, though on non-Windows platforms, another
-significant one is also not implemented).  It uses various techniques to
+significant one is not fully implemented).  They use various techniques to
 recover the other items, including calling C<L<localeconv(3)>>, and
 C<L<strftime(3)>>, both of which are specified in C89, so should be always be
-available.  Later C<strftime()> versions have additional capabilities; C<""> is
-returned for those not available on your system.
+available.  Later C<strftime()> versions have additional capabilities; What the
+C locale yields or C<""> is returned for any item not available on your system.
 
-It is important to note that when called with an item that is recovered by
+It is important to note that, when called with an item that is recovered by
 using C<localeconv>, the buffer from any previous explicit call to
-C<localeconv> will be overwritten.  This means you must save that buffer's
-contents if you need to access them after a call to this function.  (But note
-that you might not want to be using C<localeconv()> directly anyway, because of
-issues like the ones listed in the second item of this list (above) for
-C<RADIXCHAR> and C<THOUSEP>.  You can use the methods given in L<perlcall> to
-call L<POSIX/localeconv> and avoid all the issues, but then you have a hash to
-unpack).
+C<L<localeconv(3)>> will be overwritten.  But you shouldn't be using
+C<localeconv> anyway because it is is very much not thread-safe, and suffers
+from the same problems outlined in item 'b.' above for the fields it returns that
+are controlled by the LC_NUMERIC locale category.  Instead, avoid all of those
+problems by calling L</Perl_localeconv>, which is thread-safe; or by using the
+methods given in L<perlcall>  to call
+L<C<POSIX::localeconv()>|POSIX/localeconv>, which is also thread-safe.
+
+=back
 
 The details for those items which may deviate from what this emulation returns
 and what a native C<nl_langinfo()> would return are specified in
 L<I18N::Langinfo>.
 
-=back
-
-When using C<Perl_langinfo> on systems that don't have a native
-C<nl_langinfo()>, you must
+When using C<Perl_langinfo8> (or plain C<Perl_langinfo>) on systems that don't
+have a native C<nl_langinfo()>, you must
 
  #include "perl_langinfo.h"
 
-before the C<perl.h> C<#include>.  You can replace your C<langinfo.h>
+before the C<perl.h> C<#include>.  You can replace your F<langinfo.h>
 C<#include> with this one.  (Doing it this way keeps out the symbols that plain
-C<langinfo.h> would try to import into the namespace for code that doesn't need
+F<langinfo.h> would try to import into the namespace for code that doesn't need
 it.)
 
-The original impetus for C<Perl_langinfo()> was so that code that needs to
-find out the current currency symbol, floating point radix character, or digit
-grouping separator can use, on all systems, the simpler and more
-thread-friendly C<nl_langinfo> API instead of C<L<localeconv(3)>> which is a
-pain to make thread-friendly.  For other fields returned by C<localeconv>, it
-is better to use the methods given in L<perlcall> to call
-L<C<POSIX::localeconv()>|POSIX/localeconv>, which is thread-friendly.
-
 =cut
 
 */
 
 const char *
-#ifdef HAS_NL_LANGINFO
 Perl_langinfo(const nl_item item)
-#else
-Perl_langinfo(const int item)
-#endif
 {
-    return my_nl_langinfo(item, TRUE);
+    return Perl_langinfo8(item, NULL);
 }
 
-STATIC const char *
-#ifdef HAS_NL_LANGINFO
-S_my_nl_langinfo(const nl_item item, bool toggle)
-#else
-S_my_nl_langinfo(const int item, bool toggle)
-#endif
+const char *
+Perl_langinfo8(const nl_item item, utf8ness_t * utf8ness)
 {
     dTHX;
-    const char * retval;
+    unsigned cat_index;
 
-#ifdef USE_LOCALE_NUMERIC
+    PERL_ARGS_ASSERT_PERL_LANGINFO8;
 
-    /* We only need to toggle into the underlying LC_NUMERIC locale for these
-     * two items, and only if not already there */
-    if (toggle && ((   item != RADIXCHAR && item != THOUSEP)
-                    || PL_numeric_underlying))
+    if (utf8ness) {     /* Assume for now */
+        *utf8ness = UTF8NESS_IMMATERIAL;
+    }
 
-#endif  /* No toggling needed if not using LC_NUMERIC */
+    /* Find the locale category that controls the input 'item'.  If we are not
+     * paying attention to that category, instead return a default value.  Also
+     * return the default value if there is no way for us to figure out the
+     * correct value.  If we have some form of nl_langinfo(), we can always
+     * figure it out, but lacking that, there may be alternative methods that
+     * can be used to recover most of the possible items.  Some of those
+     * methods need libc functions, which may or may not be available.  If
+     * unavailable, we can't compute the correct value, so must here return the
+     * default. */
+    switch (item) {
 
-        toggle = FALSE;
+      case CODESET:
 
-#if defined(HAS_NL_LANGINFO) /* nl_langinfo() is available.  */
-#  if   ! defined(HAS_THREAD_SAFE_NL_LANGINFO_L)      \
-     || ! defined(HAS_POSIX_2008_LOCALE)
+#ifdef USE_LOCALE_CTYPE
 
-    /* Here, use plain nl_langinfo(), switching to the underlying LC_NUMERIC
-     * for those items dependent on it.  This must be copied to a buffer before
-     * switching back, as some systems destroy the buffer when setlocale() is
-     * called */
+        cat_index = LC_CTYPE_INDEX_;
+        break;
 
-    {
-        DECLARATION_FOR_LC_NUMERIC_MANIPULATION;
+#else
+        return C_codeset;
+#endif
+#if defined(USE_LOCALE_MESSAGES) && defined(HAS_SOME_LANGINFO)
 
-        if (toggle) {
-            STORE_LC_NUMERIC_FORCE_TO_UNDERLYING();
-        }
+      case YESEXPR: case YESSTR: case NOEXPR: case NOSTR:
+        cat_index = LC_MESSAGES_INDEX_;
+        break;
+#else
+      case YESEXPR:   return "^[+1yY]";
+      case YESSTR:    return "yes";
+      case NOEXPR:    return "^[-0nN]";
+      case NOSTR:     return "no";
+#endif
 
-        /* Prevent interference from another thread executing this code
-         * section. */
-        NL_LANGINFO_LOCK;
+      case CRNCYSTR:
 
-        /* Copy to a per-thread buffer, which is also one that won't be
-         * destroyed by a subsequent setlocale(), such as the
-         * RESTORE_LC_NUMERIC may do just below. */
-        retval = save_to_buffer(nl_langinfo(item),
-                                &PL_langinfo_buf, &PL_langinfo_bufsize, 0);
-        NL_LANGINFO_UNLOCK;
+#if  defined(USE_LOCALE_MONETARY)                                   \
+ && (defined(HAS_SOME_LANGINFO) || defined(HAS_LOCALECONV))
 
-        if (toggle) {
-            RESTORE_LC_NUMERIC();
-        }
+        cat_index = LC_MONETARY_INDEX_;
+        break;
+#else
+        return "-";
+#endif
+
+      case RADIXCHAR:
+
+#ifdef CAN_CALCULATE_RADIX
+
+        cat_index = LC_NUMERIC_INDEX_;
+        break;
+#else
+        return C_decimal_point;
+#endif
+
+      case THOUSEP:
+
+#if  defined(USE_LOCALE_NUMERIC)                                    \
+ && (defined(HAS_SOME_LANGINFO) || defined(HAS_LOCALECONV))
+
+        cat_index = LC_NUMERIC_INDEX_;
+        break;
+#else
+        return C_thousands_sep;
+#endif
+
+/* The other possible items are all in LC_TIME. */
+#ifdef USE_LOCALE_TIME
+
+      default:
+        cat_index = LC_TIME_INDEX_;
+        break;
+
+#endif
+#if ! defined(USE_LOCALE_TIME) || ! defined(HAS_SOME_LANGINFO)
+
+    /* If not using LC_TIME, hard code the rest.  Or, if there is no
+     * nl_langinfo(), we use strftime() as an alternative, and it is missing
+     * functionality to get every single one, so hard-code those */
+
+      case ERA: return "";  /* Unimplemented; for use with strftime() %E
+                               modifier */
+
+      /* These formats are defined by C89, so we assume that strftime supports
+       * them, and so are returned unconditionally; they may not be what the
+       * locale actually says, but should give good enough results for someone
+       * using them as formats (as opposed to trying to parse them to figure
+       * out what the locale says).  The other format items are actually tested
+       * to verify they work on the platform */
+      case D_FMT:         return "%x";
+      case T_FMT:         return "%X";
+      case D_T_FMT:       return "%c";
+
+#  if defined(WIN32) || ! defined(USE_LOCALE_TIME)
+
+      /* strftime() on Windows doesn't have the POSIX (beyond C89) extensions
+       * that would allow it to recover these */
+      case ERA_D_FMT:     return "%x";
+      case ERA_T_FMT:     return "%X";
+      case ERA_D_T_FMT:   return "%c";
+      case ALT_DIGITS:    return "0";
+
+#  endif
+#  ifndef USE_LOCALE_TIME
+
+      case T_FMT_AMPM:    return "%r";
+      case ABDAY_1:       return "Sun";
+      case ABDAY_2:       return "Mon";
+      case ABDAY_3:       return "Tue";
+      case ABDAY_4:       return "Wed";
+      case ABDAY_5:       return "Thu";
+      case ABDAY_6:       return "Fri";
+      case ABDAY_7:       return "Sat";
+      case AM_STR:        return "AM";
+      case PM_STR:        return "PM";
+      case ABMON_1:       return "Jan";
+      case ABMON_2:       return "Feb";
+      case ABMON_3:       return "Mar";
+      case ABMON_4:       return "Apr";
+      case ABMON_5:       return "May";
+      case ABMON_6:       return "Jun";
+      case ABMON_7:       return "Jul";
+      case ABMON_8:       return "Aug";
+      case ABMON_9:       return "Sep";
+      case ABMON_10:      return "Oct";
+      case ABMON_11:      return "Nov";
+      case ABMON_12:      return "Dec";
+      case DAY_1:         return "Sunday";
+      case DAY_2:         return "Monday";
+      case DAY_3:         return "Tuesday";
+      case DAY_4:         return "Wednesday";
+      case DAY_5:         return "Thursday";
+      case DAY_6:         return "Friday";
+      case DAY_7:         return "Saturday";
+      case MON_1:         return "January";
+      case MON_2:         return "February";
+      case MON_3:         return "March";
+      case MON_4:         return "April";
+      case MON_5:         return "May";
+      case MON_6:         return "June";
+      case MON_7:         return "July";
+      case MON_8:         return "August";
+      case MON_9:         return "September";
+      case MON_10:        return "October";
+      case MON_11:        return "November";
+      case MON_12:        return "December";
+
+#  endif
+#endif
+
+    } /* End of switch on item */
+
+#ifndef USE_LOCALE
+
+    Perl_croak_nocontext("panic: Unexpected nl_langinfo() item %d", item);
+    NOT_REACHED; /* NOTREACHED */
+    PERL_UNUSED_VAR(cat_index);
+
+#else
+#  ifdef USE_LOCALE_NUMERIC
+
+    /* Use either the underlying numeric, or the other underlying categories */
+    if (cat_index == LC_NUMERIC_INDEX_) {
+        return my_langinfo_c(item, LC_NUMERIC, PL_numeric_name,
+                             &PL_langinfo_buf, &PL_langinfo_bufsize, utf8ness);
     }
+    else
 
-#  else /* Use nl_langinfo_l(), avoiding both a mutex and changing the locale */
+#  endif
 
     {
-        bool do_free = FALSE;
-        locale_t cur = uselocale((locale_t) 0);
+        return my_langinfo_i(item, cat_index, querylocale_i(cat_index),
+                             &PL_langinfo_buf, &PL_langinfo_bufsize, utf8ness);
+    }
 
-        if (cur == LC_GLOBAL_LOCALE) {
-            cur = duplocale(LC_GLOBAL_LOCALE);
-            do_free = TRUE;
-        }
+#endif
 
-#    ifdef USE_LOCALE_NUMERIC
+}
+
+#ifdef USE_LOCALE
+
+/* There are several implementations of my_langinfo, depending on the
+ * Configuration.  They all share the same beginning of the function */
+STATIC const char *
+S_my_langinfo_i(pTHX_
+                const nl_item item,           /* The item to look up */
+                const unsigned int cat_index, /* The locale category that
+                                                 controls it */
+                /* The locale to look up 'item' in. */
+                const char * locale,
+
+                /* Where to store the result, and where the size of that buffer
+                 * is stored, updated on exit. retbuf_sizep may be NULL for an
+                 * empty-on-entry, single use buffer whose size we don't need
+                 * to keep track of */
+                const char ** retbufp,
+                Size_t * retbuf_sizep,
+
+                /* If not NULL, the location to store the UTF8-ness of 'item's
+                 * value, as documented */
+                utf8ness_t * utf8ness)
+{
+    const char * retval = NULL;
+
+    PERL_ARGS_ASSERT_MY_LANGINFO_I;
+    assert(cat_index < NOMINAL_LC_ALL_INDEX);
+
+    DEBUG_Lv(PerlIO_printf(Perl_debug_log,
+                           "Entering my_langinfo item=%ld, using locale %s\n",
+                           (long) item, locale));
+/*--------------------------------------------------------------------------*/
+/* Above is the common beginning to all the implementations of my_langinfo().
+ * Below are the various completions.
+ *
+ * Some platforms don't deal well with non-ASCII strings in locale X when
+ * LC_CTYPE is not in X.  (Actually it is probably when X is UTF-8 and LC_CTYPE
+ * isn't, or vice versa).  There is explicit code to bring the categories into
+ * sync.  This doesn't seem to be a problem with nl_langinfo(), so that
+ * implementation doesn't currently worry about it.  But it is a problem on
+ * Windows boxes, which don't have nl_langinfo(). */
+
+/*--------------------------------------------------------------------------*/
+#  if defined(HAS_NL_LANGINFO) /* nl_langinfo() is available.  */
+#    ifdef USE_LOCALE_CTYPE
+
+    /* Ths function sorts out if things actually have to be switched or not,
+     * for both calls. */
+    const char * orig_CTYPE_locale = toggle_locale_c(LC_CTYPE, locale);
+
+#    endif
+
+    const char * orig_switched_locale = toggle_locale_i(cat_index, locale);
+
+    gwLOCALE_LOCK;
+    retval = save_to_buffer(nl_langinfo(item), retbufp, retbuf_sizep);
+    gwLOCALE_UNLOCK;
+
+    if (utf8ness) {
+        *utf8ness = get_locale_string_utf8ness_i(retval,
+                                                 LOCALE_UTF8NESS_UNKNOWN,
+                                                 locale, cat_index);
+    }
+
+    restore_toggled_locale_i(cat_index, orig_switched_locale);
+
+#    ifdef USE_LOCALE_CTYPE
+    restore_toggled_locale_c(LC_CTYPE, orig_CTYPE_locale);
+#    endif
+
+    return retval;
+/*--------------------------------------------------------------------------*/
+#  else   /* Below, emulate nl_langinfo as best we can */
+
+    /* And the third and final completion is where we have to emulate
+     * nl_langinfo().  There are various possibilities depending on the
+     * Configuration */
+
+#    ifdef USE_LOCALE_CTYPE
+
+    const char * orig_CTYPE_locale = toggle_locale_c(LC_CTYPE, locale);
+
+#    endif
+
+    const char * orig_switched_locale = toggle_locale_i(cat_index, locale);
+
+    /* Here, we are in the locale we want information about */
+
+    /* Almost all the items will have ASCII return values.  Set that here, and
+     * override if necessary */
+    utf8ness_t is_utf8 = UTF8NESS_IMMATERIAL;
+
+    switch (item) {
+      default:
+        assert(item < 0);   /* Make sure using perl_langinfo.h */
+        retval = "";
+        break;
+
+      case RADIXCHAR:
+
+#    if      defined(HAS_SNPRINTF)                                              \
+       && (! defined(HAS_LOCALECONV) || defined(TS_W32_BROKEN_LOCALECONV))
+
+        {
+            /* snprintf() can be used to find the radix character by outputting
+             * a known simple floating point number to a buffer, and parsing
+             * it, inferring the radix as the bytes separating the integer and
+             * fractional parts.  But localeconv() is more direct, not
+             * requiring inference, so use it instead of the code just below,
+             * if (likely) it is available and works ok */
+
+            char * floatbuf = NULL;
+            const Size_t initial_size = 10;
+
+            Newx(floatbuf, initial_size, char);
+
+            /* 1.5 is exactly representable on binary computers */
+            Size_t needed_size = snprintf(floatbuf, initial_size, "%.1f", 1.5);
+
+            /* If our guess wasn't big enough, increase and try again, based on
+             * the real number that snprintf() is supposed to return */
+            if (UNLIKELY(needed_size >= initial_size)) {
+                needed_size++;  /* insurance */
+                Renew(floatbuf, needed_size, char);
+                Size_t new_needed = snprintf(floatbuf, needed_size, "%.1f", 1.5);
+                assert(new_needed <= needed_size);
+                needed_size = new_needed;
+            }
 
-        if (toggle) {
-            if (PL_underlying_numeric_obj) {
-                cur = PL_underlying_numeric_obj;
+            char * s = floatbuf;
+            char * e = floatbuf + needed_size;
+
+            /* Find the '1' */
+            while (s < e && *s != '1') {
+                s++;
             }
-            else {
-                cur = newlocale(LC_NUMERIC_MASK, PL_numeric_name, cur);
-                do_free = TRUE;
+
+            if (LIKELY(s < e)) {
+                s++;
+            }
+
+            /* Find the '5' */
+            char * item_start = s;
+            while (s < e && *s != '5') {
+                s++;
+            }
+
+            /* Everything in between is the radix string */
+            if (LIKELY(s < e)) {
+                *s = '\0';
+                retval = save_to_buffer(item_start, retbufp, retbuf_sizep);
+                Safefree(floatbuf);
+
+                if (utf8ness) {
+                    is_utf8 = get_locale_string_utf8ness_i(retval,
+                                                        LOCALE_UTF8NESS_UNKNOWN,
+                                                        locale, cat_index);
+                }
+
+                break;
             }
+
+            Safefree(floatbuf);
         }
 
+#      ifdef HAS_LOCALECONV /* snprintf() failed; drop down to use
+                               localeconv() */
+
+        /* FALLTHROUGH */
+
+#      else                      /* snprintf() failed and no localeconv() */
+
+        retval = C_decimal_point;
+        break;
+
+#      endif
 #    endif
+#    ifdef HAS_LOCALECONV
 
-        /* We have to save it to a buffer, because the freelocale() just below
-         * can invalidate the internal one */
-        retval = save_to_buffer(nl_langinfo_l(item, cur),
-                                &PL_langinfo_buf, &PL_langinfo_bufsize, 0);
+    /* These items are available from localeconv().  (To avoid using
+     * TS_W32_BROKEN_LOCALECONV, one could use GetNumberFormat and
+     * GetCurrencyFormat; patches welcome) */
 
-        if (do_free) {
-            freelocale(cur);
-        }
-    }
+#    define P_CS_PRECEDES    "p_cs_precedes"
+#    define CURRENCY_SYMBOL  "currency_symbol"
 
-#  endif
+   /* case RADIXCHAR:   // May drop down to here in some configurations */
+      case THOUSEP:
+      case CRNCYSTR:
+       {
 
-    if (strEQ(retval, "")) {
-        if (item == YESSTR) {
-            return "yes";
-        }
-        if (item == NOSTR) {
-            return "no";
+        /* The hash gets populated with just the field(s) related to 'item'. */
+        HV * result_hv = my_localeconv(item);
+
+        SV* string;
+        if (item != CRNCYSTR) {
+
+            /* These items have been populated with just one key => value */
+            (void) hv_iterinit(result_hv);
+            HE * entry = hv_iternext(result_hv);
+            string = hv_iterval(result_hv, entry);
         }
-    }
+        else {
 
-    return retval;
+            /* But CRNCYSTR localeconv() returns a slightly different value
+             * than the nl_langinfo() API calls for, so have to modify this one
+             * to conform.  We need another value from localeconv() to know
+             * what to change it to.  my_localeconv() has populated the hash
+             * with exactly both fields.  Delete this one, leaving just the
+             * CRNCYSTR one in the hash */
+            SV* precedes = hv_delete(result_hv,
+                                     P_CS_PRECEDES, STRLENs(P_CS_PRECEDES),
+                                     0);
+            if (! precedes) {
+                    locale_panic_("my_localeconv() unexpectedly didn't return"
+                                  " a value for " P_CS_PRECEDES);
+            }
 
-#else   /* Below, emulate nl_langinfo as best we can */
+            /* The modification is to prefix the localeconv() return with a
+             * single byte, calculated as follows: */
+            char prefix = (LIKELY(SvIV(precedes) != -1))
+                          ? ((precedes != 0) ?  '-' : '+')
+
+                            /* khw couldn't find any documentation that
+                             * CHAR_MAX (which we modify to -1) is the signal,
+                             * but cygwin uses it thusly, and it makes sense
+                             * given that CHAR_MAX indicates the value isn't
+                             * used, so it neither precedes nor succeeds */
+                          : '.';
+
+            /* Now get CRNCYSTR */
+            (void) hv_iterinit(result_hv);
+            HE * entry = hv_iternext(result_hv);
+            string = hv_iterval(result_hv, entry);
+
+            /* And perform the modification */
+            Perl_sv_setpvf(aTHX_ string, "%c%s", prefix, SvPV_nolen(string));
+        }
 
-    {
+        /* Here, 'string' contains the value we want to return */
+        retval = save_to_buffer(SvPV_nolen(string), retbufp, retbuf_sizep);
 
-#  ifdef HAS_LOCALECONV
+        if (utf8ness) {
+            is_utf8 = (SvUTF8(string))
+                      ? UTF8NESS_YES
+                      : (is_utf8_invariant_string( (U8 *) retval,
+                                                  strlen(retval)))
+                        ? UTF8NESS_IMMATERIAL
+                        : UTF8NESS_NO;
+        }
 
-        const struct lconv* lc;
-        const char * temp;
-        DECLARATION_FOR_LC_NUMERIC_MANIPULATION;
+        break;
+
+       }
+
+#    endif  /* Some form of localeconv */
+#    ifdef HAS_STRFTIME
+
+      /* These formats are only available in later strftime's */
+      case ERA_D_FMT: case ERA_T_FMT: case ERA_D_T_FMT: case T_FMT_AMPM:
+
+      /* The rest can be gotten from most versions of strftime(). */
+      case ABDAY_1: case ABDAY_2: case ABDAY_3:
+      case ABDAY_4: case ABDAY_5: case ABDAY_6: case ABDAY_7:
+      case ALT_DIGITS:
+      case AM_STR: case PM_STR:
+      case ABMON_1: case ABMON_2: case ABMON_3: case ABMON_4:
+      case ABMON_5: case ABMON_6: case ABMON_7: case ABMON_8:
+      case ABMON_9: case ABMON_10: case ABMON_11: case ABMON_12:
+      case DAY_1: case DAY_2: case DAY_3: case DAY_4:
+      case DAY_5: case DAY_6: case DAY_7:
+      case MON_1: case MON_2: case MON_3: case MON_4:
+      case MON_5: case MON_6: case MON_7: case MON_8:
+      case MON_9: case MON_10: case MON_11: case MON_12:
+        {
+            const char * format;
+            bool return_format = FALSE;
+            int mon = 0;
+            int mday = 1;
+            int hour = 6;
+
+            GCC_DIAG_IGNORE_STMT(-Wimplicit-fallthrough);
+
+            switch (item) {
+              default:
+                locale_panic_(Perl_form(aTHX_ "switch case: %d problem", item));
+                NOT_REACHED; /* NOTREACHED */
+
+              case PM_STR: hour = 18;
+              case AM_STR:
+                format = "%p";
+                break;
+              case ABDAY_7: mday++;
+              case ABDAY_6: mday++;
+              case ABDAY_5: mday++;
+              case ABDAY_4: mday++;
+              case ABDAY_3: mday++;
+              case ABDAY_2: mday++;
+              case ABDAY_1:
+                format = "%a";
+                break;
+              case DAY_7: mday++;
+              case DAY_6: mday++;
+              case DAY_5: mday++;
+              case DAY_4: mday++;
+              case DAY_3: mday++;
+              case DAY_2: mday++;
+              case DAY_1:
+                format = "%A";
+                break;
+              case ABMON_12: mon++;
+              case ABMON_11: mon++;
+              case ABMON_10: mon++;
+              case ABMON_9:  mon++;
+              case ABMON_8:  mon++;
+              case ABMON_7:  mon++;
+              case ABMON_6:  mon++;
+              case ABMON_5:  mon++;
+              case ABMON_4:  mon++;
+              case ABMON_3:  mon++;
+              case ABMON_2:  mon++;
+              case ABMON_1:
+                format = "%b";
+                break;
+              case MON_12: mon++;
+              case MON_11: mon++;
+              case MON_10: mon++;
+              case MON_9:  mon++;
+              case MON_8:  mon++;
+              case MON_7:  mon++;
+              case MON_6:  mon++;
+              case MON_5:  mon++;
+              case MON_4:  mon++;
+              case MON_3:  mon++;
+              case MON_2:  mon++;
+              case MON_1:
+                format = "%B";
+                break;
+              case T_FMT_AMPM:
+                format = "%r";
+                return_format = TRUE;
+                break;
+              case ERA_D_FMT:
+                format = "%Ex";
+                return_format = TRUE;
+                break;
+              case ERA_T_FMT:
+                format = "%EX";
+                return_format = TRUE;
+                break;
+              case ERA_D_T_FMT:
+                format = "%Ec";
+                return_format = TRUE;
+                break;
+              case ALT_DIGITS:
+                format = "%Ow";        /* Find the alternate digit for 0 */
+                break;
+            }
 
-#    ifdef TS_W32_BROKEN_LOCALECONV
+            GCC_DIAG_RESTORE_STMT;
 
-        const char * save_global;
-        const char * save_thread;
-        int needed_size;
-        char * ptr;
-        char * e;
-        char * item_start;
+            /* The year was deliberately chosen so that January 1 is on the
+             * first day of the week.  Since we're only getting one thing at a
+             * time, it all works */
+            const char * temp = my_strftime8_temp(format, 30, 30, hour, mday, mon,
+                                             2011, 0, 0, 0, &is_utf8);
+            retval = save_to_buffer(temp, retbufp, retbuf_sizep);
+            Safefree(temp);
 
-#    endif
-#  endif
-#  ifdef HAS_STRFTIME
+            /* If the item is 'ALT_DIGITS', '*retbuf' contains the alternate
+             * format for wday 0.  If the value is the same as the normal 0,
+             * there isn't an alternate, so clear the buffer.
+             *
+             * (wday was chosen because its range is all a single digit.
+             * Things like tm_sec have two digits as the minimum: '00'.) */
+            if (item == ALT_DIGITS && strEQ(*retbufp, "0")) {
+                retval = "";
+                break;
+            }
 
-        struct tm tm;
-        bool return_format = FALSE; /* Return the %format, not the value */
-        const char * format;
+            /* ALT_DIGITS is problematic.  Experiments on it showed that
+             * strftime() did not always work properly when going from alt-9 to
+             * alt-10.  Only a few locales have this item defined, and in all
+             * of them on Linux that khw was able to find, nl_langinfo() merely
+             * returned the alt-0 character, possibly doubled.  Most Unicode
+             * digits are in blocks of 10 consecutive code points, so that is
+             * sufficient information for such scripts, as we can infer alt-1,
+             * alt-2, ....  But for a Japanese locale, a CJK ideographic 0 is
+             * returned, and the CJK digits are not in code point order, so you
+             * can't really infer anything.  The localedef for this locale did
+             * specify the succeeding digits, so that strftime() works properly
+             * on them, without needing to infer anything.  But the
+             * nl_langinfo() return did not give sufficient information for the
+             * caller to understand what's going on.  So until there is
+             * evidence that it should work differently, this returns the alt-0
+             * string for ALT_DIGITS. */
+
+            if (return_format) {
 
-#  endif
+                /* If to return the format, not the value, overwrite the buffer
+                 * with it.  But some strftime()s will keep the original format
+                 * if illegal, so change those to "" */
+                if (strEQ(*retbufp, format)) {
+                    retval = "";
+                }
+                else {
+                    retval = format;
+                }
 
-        /* We copy the results to a per-thread buffer, even if not
-         * multi-threaded.  This is in part to simplify this code, and partly
-         * because we need a buffer anyway for strftime(), and partly because a
-         * call of localeconv() could otherwise wipe out the buffer, and the
-         * programmer would not be expecting this, as this is a nl_langinfo()
-         * substitute after all, so s/he might be thinking their localeconv()
-         * is safe until another localeconv() call. */
+                /* A format is always in ASCII */
+                is_utf8 = UTF8NESS_IMMATERIAL;
+            }
 
-        switch (item) {
-            Size_t len;
+            break;
+        }
 
-            /* This is unimplemented */
-            case ERA:      /* For use with strftime() %E modifier */
+#    endif
 
-            default:
-                return "";
+      case CODESET:
 
-            /* We use only an English set, since we don't know any more */
-            case YESEXPR:   return "^[+1yY]";
-            case YESSTR:    return "yes";
-            case NOEXPR:    return "^[-0nN]";
-            case NOSTR:     return "no";
+        /* The trivial case */
+        if (isNAME_C_OR_POSIX(locale)) {
+            retval = C_codeset;
+            break;
+        }
 
-            case CODESET:
+#    ifdef WIN32
 
-#  ifndef WIN32
+        /* This function retrieves the code page.  It is subject to change, but
+         * is documented and has been stable for many releases */
+        UINT ___lc_codepage_func(void);
 
-                /* On non-windows, this is unimplemented, in part because of
-                 * inconsistencies between vendors.  The Darwin native
-                 * nl_langinfo() implementation simply looks at everything past
-                 * any dot in the name, but that doesn't work for other
-                 * vendors.  Many Linux locales that don't have UTF-8 in their
-                 * names really are UTF-8, for example; z/OS locales that do
-                 * have UTF-8 in their names, aren't really UTF-8 */
-                return "";
+        retval = save_to_buffer(Perl_form(aTHX_ "%d", ___lc_codepage_func()),
+                                retbufp, retbuf_sizep);
+        DEBUG_Lv(PerlIO_printf(Perl_debug_log, "locale='%s' cp=%s\n",
+                                               locale, retval));
+        break;
 
-#  else
+#    else
+
+        /* The codeset is important, but khw did not figure out a way for it to
+         * be retrieved on non-Windows boxes without nl_langinfo().  But even
+         * if we can't get it directly, we can usually determine if it is a
+         * UTF-8 locale or not.  If it is UTF-8, we (correctly) use that for
+         * the code set. */
+
+#      if defined(HAS_MBTOWC) || defined(HAS_MBRTOWC)
+
+        /* If libc mbtowc() evaluates the bytes that form the REPLACEMENT
+         * CHARACTER as that Unicode code point, this has to be a UTF-8 locale.
+         * */
+        wchar_t wc = 0;
+        (void) Perl_mbtowc_(aTHX_ NULL, NULL, 0);/* Reset shift state */
+        int mbtowc_ret = Perl_mbtowc_(aTHX_ &wc,
+                              STR_WITH_LEN(REPLACEMENT_CHARACTER_UTF8));
+        if (mbtowc_ret >= 0 && wc == UNICODE_REPLACEMENT) {
+            DEBUG_Lv(PerlIO_printf(Perl_debug_log,
+                                   "mbtowc returned REPLACEMENT\n"));
+            retval = "UTF-8";
+            break;
+        }
 
-                {   /* But on Windows, the name does seem to be consistent, so
-                       use that. */
-                    const char * p;
-                    const char * first;
-                    Size_t offset = 0;
-                    const char * name = my_setlocale(LC_CTYPE, NULL);
+        /* Here, it isn't a UTF-8 locale. */
 
-                    if (isNAME_C_OR_POSIX(name)) {
-                        return "ANSI_X3.4-1968";
-                    }
+#    else   /* mbtowc() is not available. */
 
-                    /* Find the dot in the locale name */
-                    first = (const char *) strchr(name, '.');
-                    if (! first) {
-                        first = name;
-                        goto has_nondigit;
-                    }
+        /* Sling together several possibilities, depending on platform
+         * capabilities and what we found.
+         *
+         * For non-English locales or non-dollar currency locales, we likely
+         * will find out whether a locale is UTF-8 or not */
 
-                    /* Look at everything past the dot */
-                    first++;
-                    p = first;
+        utf8ness_t is_utf8 = UTF8NESS_UNKNOWN;
+        const char * scratch_buf = NULL;
 
-                    while (*p) {
-                        if (! isDIGIT(*p)) {
-                            goto has_nondigit;
-                        }
+#      if defined(USE_LOCALE_MONETARY) && defined(HAS_LOCALECONV)
 
-                        p++;
-                    }
+        /* Can't use this method unless localeconv() is available, as that's
+         * the way we find out the currency symbol. */
 
-                    /* Here everything past the dot is a digit.  Treat it as a
-                     * code page */
-                    retval = save_to_buffer("CP", &PL_langinfo_buf,
-                                                &PL_langinfo_bufsize, 0);
-                    offset = STRLENs("CP");
+        /* First try looking at the currency symbol (via a recursive call) to
+         * see if it disambiguates things.  Often that will be in the native
+         * script, and if the symbol isn't legal UTF-8, we know that the locale
+         * isn't either. */
+        (void) my_langinfo_c(CRNCYSTR, LC_MONETARY, locale, &scratch_buf, NULL,
+                             &is_utf8);
+        Safefree(scratch_buf);
 
-                  has_nondigit:
+#      endif
+#      ifdef USE_LOCALE_TIME
 
-                    retval = save_to_buffer(first, &PL_langinfo_buf,
-                                            &PL_langinfo_bufsize, offset);
-                }
+        /* If we have ruled out being UTF-8, no point in checking further. */
+        if (is_utf8 != UTF8NESS_NO) {
 
-                break;
+            /* But otherwise do check more.  This is done even if the currency
+             * symbol looks to be UTF-8, just in case that's a false positive.
+             *
+             * Look at the LC_TIME entries, like the names of the months or
+             * weekdays.  We quit at the first one that is illegal UTF-8 */
+
+            utf8ness_t this_is_utf8 = UTF8NESS_UNKNOWN;
+            const int times[] = {
+                DAY_1, DAY_2, DAY_3, DAY_4, DAY_5, DAY_6, DAY_7,
+                MON_1, MON_2, MON_3, MON_4, MON_5, MON_6, MON_7, MON_8,
+                                            MON_9, MON_10, MON_11, MON_12,
+                ALT_DIGITS, AM_STR, PM_STR,
+                ABDAY_1, ABDAY_2, ABDAY_3, ABDAY_4, ABDAY_5, ABDAY_6,
+                                                             ABDAY_7,
+                ABMON_1, ABMON_2, ABMON_3, ABMON_4, ABMON_5, ABMON_6,
+                ABMON_7, ABMON_8, ABMON_9, ABMON_10, ABMON_11, ABMON_12
+            };
+
+            /* The code in the recursive call can handle switching the locales,
+             * but by doing it here, we avoid switching each iteration of the
+             * loop */
+            const char * orig_TIME_locale = toggle_locale_c(LC_TIME, locale);
+
+            for (PERL_UINT_FAST8_T i = 0; i < C_ARRAY_LENGTH(times); i++) {
+                scratch_buf = NULL;
+                (void) my_langinfo_c(times[i], LC_TIME, locale, &scratch_buf,
+                                     NULL, &this_is_utf8);
+                Safefree(scratch_buf);
+                if (this_is_utf8 == UTF8NESS_NO) {
+                    is_utf8 = UTF8NESS_NO;
+                    break;
+                }
 
-#  endif
-#  ifdef HAS_LOCALECONV
+                if (this_is_utf8 == UTF8NESS_YES) {
+                    is_utf8 = UTF8NESS_YES;
+                }
+            }
 
-            case CRNCYSTR:
+            /* Here we have gone through all the LC_TIME elements.  is_utf8 has
+             * been set as follows:
+             *      UTF8NESS_NO           If at least one is't legal UTF-8
+             *      UTF8NESS_IMMMATERIAL  If all are ASCII
+             *      UTF8NESS_YES          If all are legal UTF-8 (including
+             *                            ASCIIi), and at least one isn't
+             *                            ASCII. */
 
-                /* We don't bother with localeconv_l() because any system that
-                 * has it is likely to also have nl_langinfo() */
+            restore_toggled_locale_c(LC_TIME, orig_TIME_locale);
+        }
 
-                LOCALECONV_LOCK;    /* Prevent interference with other threads
-                                       using localeconv() */
+#      endif    /* LC_TIME */
 
-#    ifdef TS_W32_BROKEN_LOCALECONV
+        /* If nothing examined above rules out it being UTF-8, and at least one
+         * thing fits as UTF-8 (and not plain ASCII), assume the codeset is
+         * UTF-8. */
+        if (is_utf8 == UTF8NESS_YES) {
+            retval = "UTF-8";
+            break;
+        }
 
-                /* This is a workaround for a Windows bug prior to VS 15.
-                 * What we do here is, while locked, switch to the global
-                 * locale so localeconv() works; then switch back just before
-                 * the unlock.  This can screw things up if some thread is
-                 * already using the global locale while assuming no other is.
-                 * A different workaround would be to call GetCurrencyFormat on
-                 * a known value, and parse it; patches welcome
-                 *
-                 * We have to use LC_ALL instead of LC_MONETARY because of
-                 * another bug in Windows */
+        /* Here, nothing examined indicates that the codeset is UTF-8.  But
+         * what is it?  The other locale categories are not likely to be of
+         * further help:
+         *
+         * LC_NUMERIC   Only a few locales in the world have a non-ASCII radix
+         *              or group separator.
+         * LC_CTYPE     This code wouldn't be compiled if mbtowc() existed and
+         *              was reliable.  This is unlikely in C99.  There are
+         *              other functions that could be used instead, but are
+         *              they going to exist, and be able to distinguish between
+         *              UTF-8 and 8859-1?  Deal with this only if it becomes
+         *              necessary.
+         * LC_MESSAGES  The strings returned from strerror() would seem likely
+         *              candidates, but experience has shown that many systems
+         *              don't actually have translations installed for them.
+         *              They are instead always in English, so everything in
+         *              them is ASCII, which is of no help to us.  A Configure
+         *              probe could possibly be written to see if this platform
+         *              has non-ASCII error messages.  But again, wait until it
+         *              turns out to be an actual problem. */
+
+#    endif    /* ! mbtowc() */
+
+        /* Rejoin the mbtowc available/not-available cases.
+         *
+         * We got here only because we haven't been able to find the codeset.
+         * The only other option khw could think of is to see if the codeset is
+         * part of the locale name.  This is very less than ideal; often there
+         * is no code set in the name; and at other times they even lie.
+         *
+         * But there is an XPG standard syntax, which many locales follow:
+         *
+         * language[_territory[.codeset]][@modifier]
+         *
+         * So we take the part between the dot and any '@' */
+        retval = (const char *) strchr(locale, '.');
+        if (! retval) {
+            retval = "";  /* Alas, no dot */
+            break;
+        }
 
-                save_thread = savepv(my_setlocale(LC_ALL, NULL));
-                _configthreadlocale(_DISABLE_PER_THREAD_LOCALE);
-                save_global= savepv(my_setlocale(LC_ALL, NULL));
-                my_setlocale(LC_ALL, save_thread);
+        /* Don't include the dot */
+        retval++;
+
+        /* And stop before any '@' */
+        const char * modifier = strchr(retval, '@');
+        if (modifier) {
+            char * code_set_name;
+            const Size_t name_len = modifier - retval;
+            Newx(code_set_name, name_len + 1, char);         /* +1 for NUL */
+            my_strlcpy(code_set_name, retval, name_len + 1);
+            SAVEFREEPV(code_set_name);
+            retval = code_set_name;
+        }
 
-#    endif
+#      if defined(HAS_MBTOWC) || defined(HAS_MBRTOWC)
 
-                lc = localeconv();
-                if (   ! lc
-                    || ! lc->currency_symbol
-                    || strEQ("", lc->currency_symbol))
-                {
-                    LOCALECONV_UNLOCK;
-                    return "";
-                }
+        /* When these functions, are available, they were tried earlier and
+         * indicated that the locale did not act like a proper UTF-8 one.  So
+         * if it claims to be UTF-8, it is a lie */
+        if (is_codeset_name_UTF8(retval)) {
+            retval = "";
+            break;
+        }
 
-                /* Leave the first spot empty to be filled in below */
-                retval = save_to_buffer(lc->currency_symbol, &PL_langinfo_buf,
-                                        &PL_langinfo_bufsize, 1);
-                if (lc->mon_decimal_point && strEQ(lc->mon_decimal_point, ""))
-                { /*  khw couldn't figure out how the localedef specifications
-                      would show that the $ should replace the radix; this is
-                      just a guess as to how it might work.*/
-                    PL_langinfo_buf[0] = '.';
-                }
-                else if (lc->p_cs_precedes) {
-                    PL_langinfo_buf[0] = '-';
-                }
-                else {
-                    PL_langinfo_buf[0] = '+';
-                }
+#      endif
 
-#    ifdef TS_W32_BROKEN_LOCALECONV
+        /* Otherwise the code set name is considered to be everything between
+         * the dot and the '@' */
+        retval = save_to_buffer(retval, retbufp, retbuf_sizep);
 
-                my_setlocale(LC_ALL, save_global);
-                _configthreadlocale(_ENABLE_PER_THREAD_LOCALE);
-                my_setlocale(LC_ALL, save_thread);
-                Safefree(save_global);
-                Safefree(save_thread);
+        break;
 
 #    endif
 
-                LOCALECONV_UNLOCK;
-                break;
-
-#    ifdef TS_W32_BROKEN_LOCALECONV
+    } /* Giant switch() of nl_langinfo() items */
 
-            case RADIXCHAR:
+    restore_toggled_locale_i(cat_index, orig_switched_locale);
 
-                /* For this, we output a known simple floating point number to
-                 * a buffer, and parse it, looking for the radix */
-
-                if (toggle) {
-                    STORE_LC_NUMERIC_FORCE_TO_UNDERLYING();
-                }
+#    ifdef USE_LOCALE_CTYPE
+    restore_toggled_locale_c(LC_CTYPE, orig_CTYPE_locale);
+#    endif
 
-                if (PL_langinfo_bufsize < 10) {
-                    PL_langinfo_bufsize = 10;
-                    Renew(PL_langinfo_buf, PL_langinfo_bufsize, char);
-                }
+    if (utf8ness) {
+        *utf8ness = is_utf8;
+    }
 
-                needed_size = my_snprintf(PL_langinfo_buf, PL_langinfo_bufsize,
-                                          "%.1f", 1.5);
-                if (needed_size >= (int) PL_langinfo_bufsize) {
-                    PL_langinfo_bufsize = needed_size + 1;
-                    Renew(PL_langinfo_buf, PL_langinfo_bufsize, char);
-                    needed_size = my_snprintf(PL_langinfo_buf, PL_langinfo_bufsize,
-                                             "%.1f", 1.5);
-                    assert(needed_size < (int) PL_langinfo_bufsize);
-                }
+    return retval;
 
-                ptr = PL_langinfo_buf;
-                e = PL_langinfo_buf + PL_langinfo_bufsize;
+#  endif    /* All the implementations of my_langinfo() */
 
-                /* Find the '1' */
-                while (ptr < e && *ptr != '1') {
-                    ptr++;
-                }
-                ptr++;
+/*--------------------------------------------------------------------------*/
 
-                /* Find the '5' */
-                item_start = ptr;
-                while (ptr < e && *ptr != '5') {
-                    ptr++;
-                }
+}   /* my_langinfo() */
 
-                /* Everything in between is the radix string */
-                if (ptr >= e) {
-                    PL_langinfo_buf[0] = '?';
-                    PL_langinfo_buf[1] = '\0';
-                }
-                else {
-                    *ptr = '\0';
-                    Move(item_start, PL_langinfo_buf, ptr - PL_langinfo_buf, char);
-                }
+#endif      /* USE_LOCALE */
 
-                if (toggle) {
-                    RESTORE_LC_NUMERIC();
-                }
+char *
+Perl_my_strftime(pTHX_ const char *fmt, int sec, int min, int hour, int mday, int mon, int year, int wday, int yday, int isdst)
+{
+#ifdef HAS_STRFTIME
 
-                retval = PL_langinfo_buf;
-                break;
+/*
+=for apidoc_section $time
+=for apidoc      my_strftime
 
-#    else
+strftime(), but with a different API so that the return value is a pointer
+to the formatted result (which MUST be arranged to be FREED BY THE
+CALLER).  This allows this function to increase the buffer size as needed,
+so that the caller doesn't have to worry about that.
 
-            case RADIXCHAR:     /* No special handling needed */
+On failure it returns NULL.
 
-#    endif
+Note that yday and wday effectively are ignored by this function, as
+mini_mktime() overwrites them.
 
-            case THOUSEP:
+Also note that it is always executed in the underlying C<LC_TIME> locale of
+the program, giving results based on that locale.
 
-                if (toggle) {
-                    STORE_LC_NUMERIC_FORCE_TO_UNDERLYING();
-                }
+=cut
+ */
+    PERL_ARGS_ASSERT_MY_STRFTIME;
+
+    /* An empty format yields an empty result */
+    const int fmtlen = strlen(fmt);
+    if (fmtlen == 0) {
+        char *ret;
+        Newxz (ret, 1, char);
+        return ret;
+    }
 
-                LOCALECONV_LOCK;    /* Prevent interference with other threads
-                                       using localeconv() */
-
-#    ifdef TS_W32_BROKEN_LOCALECONV
-
-                /* This should only be for the thousands separator.  A
-                 * different work around would be to use GetNumberFormat on a
-                 * known value and parse the result to find the separator */
-                save_thread = savepv(my_setlocale(LC_ALL, NULL));
-                _configthreadlocale(_DISABLE_PER_THREAD_LOCALE);
-                save_global = savepv(my_setlocale(LC_ALL, NULL));
-                my_setlocale(LC_ALL, save_thread);
-#      if 0
-                /* This is the start of code that for broken Windows replaces
-                 * the above and below code, and instead calls
-                 * GetNumberFormat() and then would parse that to find the
-                 * thousands separator.  It needs to handle UTF-16 vs -8
-                 * issues. */
-
-                needed_size = GetNumberFormatEx(PL_numeric_name, 0, "1234.5", NULL, PL_langinfo_buf, PL_langinfo_bufsize);
-                DEBUG_L(PerlIO_printf(Perl_debug_log,
-                    "%s: %d: return from GetNumber, count=%d, val=%s\n",
-                    __FILE__, __LINE__, needed_size, PL_langinfo_buf));
+    /* Set mytm to now */
+    struct tm mytm;
+    init_tm(&mytm);    /* XXX workaround - see Perl_init_tm() */
+
+    /* Override with the passed-in values */
+    mytm.tm_sec = sec;
+    mytm.tm_min = min;
+    mytm.tm_hour = hour;
+    mytm.tm_mday = mday;
+    mytm.tm_mon = mon;
+    mytm.tm_year = year;
+    mytm.tm_wday = wday;
+    mytm.tm_yday = yday;
+    mytm.tm_isdst = isdst;
+    mini_mktime(&mytm);
+
+    /* use libc to get the values for tm_gmtoff and tm_zone on platforms that
+     * have them [perl #18238] */
+#if defined(HAS_MKTIME) && (defined(HAS_TM_TM_GMTOFF) || defined(HAS_TM_TM_ZONE))
+    struct tm mytm2;
+    mytm2 = mytm;
+    MKTIME_LOCK;
+    mktime(&mytm2);
+    MKTIME_UNLOCK;
+#  ifdef HAS_TM_TM_GMTOFF
+    mytm.tm_gmtoff = mytm2.tm_gmtoff;
+#  endif
+#  ifdef HAS_TM_TM_ZONE
+    mytm.tm_zone = mytm2.tm_zone;
+#  endif
+#endif
+#if defined(USE_LOCALE_CTYPE) && defined(USE_LOCALE_TIME)
 
-#      endif
-#    endif
+    const char * orig_CTYPE_LOCALE = toggle_locale_c(LC_CTYPE,
+                                                     querylocale_c(LC_TIME));
+#endif
 
-                lc = localeconv();
-                if (! lc) {
-                    temp = "";
-                }
-                else {
-                    temp = (item == RADIXCHAR)
-                             ? lc->decimal_point
-                             : lc->thousands_sep;
-                    if (! temp) {
-                        temp = "";
-                    }
-                }
+    /* Guess an initial size for the returned string based on an expansion
+     * factor of the input format, but with a minimum that should handle most
+     * common cases.  If this guess is too small, we will try again with a
+     * larger one */
+    int bufsize = MAX(fmtlen * 2, 64);
 
-                retval = save_to_buffer(temp, &PL_langinfo_buf,
-                                        &PL_langinfo_bufsize, 0);
+    char *buf = NULL;   /* Makes Renew() act as Newx() on the first iteration */
+    do {
+        Renew(buf, bufsize, char);
 
-#    ifdef TS_W32_BROKEN_LOCALECONV
+        GCC_DIAG_IGNORE_STMT(-Wformat-nonliteral); /* fmt checked by caller */
 
-                my_setlocale(LC_ALL, save_global);
-                _configthreadlocale(_ENABLE_PER_THREAD_LOCALE);
-                my_setlocale(LC_ALL, save_thread);
-                Safefree(save_global);
-                Safefree(save_thread);
+        STRFTIME_LOCK;
+        int len = strftime(buf, bufsize, fmt, &mytm);
+        STRFTIME_UNLOCK;
 
-#    endif
+        GCC_DIAG_RESTORE_STMT;
 
-                LOCALECONV_UNLOCK;
+        /* A non-zero return indicates success.  But to make sure we're not
+         * dealing with some rogue strftime that returns how much space it
+         * needs instead of 0 when there isn't enough, check that the return
+         * indicates we have at least one byte of spare space (which will be
+         * used for the terminating NUL). */
+        if (inRANGE(len, 1, bufsize - 1)) {
+            goto strftime_success;
+        }
 
-                if (toggle) {
-                    RESTORE_LC_NUMERIC();
-                }
+        /* There are several possible reasons for a 0 return code for a
+         * non-empty format, and they are not trivial to tease apart.  This
+         * issue is a known bug in the strftime() API.  What we do to cope is
+         * to assume that the reason is not enough space in the buffer, so
+         * increase it and try again. */
+        bufsize *= 2;
+
+        /* But don't just keep increasing the size indefinitely.  Stop when it
+         * becomes obvious that the reason for failure is something besides not
+         * enough space.  The most likely largest expanding format is %c.  On
+         * khw's Linux box, the maximum result of this is 67 characters, in the
+         * km_KH locale.  If a new script comes along that uses 4 UTF-8 bytes
+         * per character, and with a similar expansion factor, that would be a
+         * 268:2 byte ratio, or a bit more than 128:1 = 2**7:1.  Some strftime
+         * implementations allow you to say %1000c to pad to 1000 bytes.  This
+         * shows that it is impossible to implement this without a heuristic
+         * (that can fail).  But it indicates we need to be generous in the
+         * upper limit before failing.  The previous heuristic used was too
+         * stingy.  Since the size doubles per iteration, it doesn't take many
+         * to reach the limit */
+    } while (bufsize < ((1 << 11) + 1) * fmtlen);
+
+    /* Here, strftime() returned 0, and it likely wasn't for lack of space.
+     * There are two possible reasons:
+     *
+     * First is that the result is legitimately 0 length.  This can happen
+     * when the format is precisely "%p".  That is the only documented format
+     * that can have an empty result. */
+    if (strEQ(fmt, "%p")) {
+        Renew(buf, 1, char);
+        *buf = '\0';
+        goto strftime_success;
+    }
 
-                break;
+    /* The other reason is that the format string is malformed.  Probably it is
+     * an illegal conversion specifier.) */
+    Safefree(buf);
+    return NULL;
 
-#  endif
-#  ifdef HAS_STRFTIME
-
-            /* These are defined by C89, so we assume that strftime supports
-             * them, and so are returned unconditionally; they may not be what
-             * the locale actually says, but should give good enough results
-             * for someone using them as formats (as opposed to trying to parse
-             * them to figure out what the locale says).  The other format
-             * items are actually tested to verify they work on the platform */
-            case D_FMT:         return "%x";
-            case T_FMT:         return "%X";
-            case D_T_FMT:       return "%c";
-
-            /* These formats are only available in later strfmtime's */
-            case ERA_D_FMT: case ERA_T_FMT: case ERA_D_T_FMT: case T_FMT_AMPM:
-
-            /* The rest can be gotten from most versions of strftime(). */
-            case ABDAY_1: case ABDAY_2: case ABDAY_3:
-            case ABDAY_4: case ABDAY_5: case ABDAY_6: case ABDAY_7:
-            case ALT_DIGITS:
-            case AM_STR: case PM_STR:
-            case ABMON_1: case ABMON_2: case ABMON_3: case ABMON_4:
-            case ABMON_5: case ABMON_6: case ABMON_7: case ABMON_8:
-            case ABMON_9: case ABMON_10: case ABMON_11: case ABMON_12:
-            case DAY_1: case DAY_2: case DAY_3: case DAY_4:
-            case DAY_5: case DAY_6: case DAY_7:
-            case MON_1: case MON_2: case MON_3: case MON_4:
-            case MON_5: case MON_6: case MON_7: case MON_8:
-            case MON_9: case MON_10: case MON_11: case MON_12:
-
-                init_tm(&tm);   /* Precaution against core dumps */
-                tm.tm_sec = 30;
-                tm.tm_min = 30;
-                tm.tm_hour = 6;
-                tm.tm_year = 2017 - 1900;
-                tm.tm_wday = 0;
-                tm.tm_mon = 0;
-
-                GCC_DIAG_IGNORE_STMT(-Wimplicit-fallthrough);
-
-                switch (item) {
-                    default:
-                        Perl_croak(aTHX_
-                                    "panic: %s: %d: switch case: %d problem",
-                                       __FILE__, __LINE__, item);
-                        NOT_REACHED; /* NOTREACHED */
-
-                    case PM_STR: tm.tm_hour = 18;
-                    case AM_STR:
-                        format = "%p";
-                        break;
-
-                    case ABDAY_7: tm.tm_wday++;
-                    case ABDAY_6: tm.tm_wday++;
-                    case ABDAY_5: tm.tm_wday++;
-                    case ABDAY_4: tm.tm_wday++;
-                    case ABDAY_3: tm.tm_wday++;
-                    case ABDAY_2: tm.tm_wday++;
-                    case ABDAY_1:
-                        format = "%a";
-                        break;
-
-                    case DAY_7: tm.tm_wday++;
-                    case DAY_6: tm.tm_wday++;
-                    case DAY_5: tm.tm_wday++;
-                    case DAY_4: tm.tm_wday++;
-                    case DAY_3: tm.tm_wday++;
-                    case DAY_2: tm.tm_wday++;
-                    case DAY_1:
-                        format = "%A";
-                        break;
-
-                    case ABMON_12: tm.tm_mon++;
-                    case ABMON_11: tm.tm_mon++;
-                    case ABMON_10: tm.tm_mon++;
-                    case ABMON_9: tm.tm_mon++;
-                    case ABMON_8: tm.tm_mon++;
-                    case ABMON_7: tm.tm_mon++;
-                    case ABMON_6: tm.tm_mon++;
-                    case ABMON_5: tm.tm_mon++;
-                    case ABMON_4: tm.tm_mon++;
-                    case ABMON_3: tm.tm_mon++;
-                    case ABMON_2: tm.tm_mon++;
-                    case ABMON_1:
-                        format = "%b";
-                        break;
-
-                    case MON_12: tm.tm_mon++;
-                    case MON_11: tm.tm_mon++;
-                    case MON_10: tm.tm_mon++;
-                    case MON_9: tm.tm_mon++;
-                    case MON_8: tm.tm_mon++;
-                    case MON_7: tm.tm_mon++;
-                    case MON_6: tm.tm_mon++;
-                    case MON_5: tm.tm_mon++;
-                    case MON_4: tm.tm_mon++;
-                    case MON_3: tm.tm_mon++;
-                    case MON_2: tm.tm_mon++;
-                    case MON_1:
-                        format = "%B";
-                        break;
-
-                    case T_FMT_AMPM:
-                        format = "%r";
-                        return_format = TRUE;
-                        break;
-
-                    case ERA_D_FMT:
-                        format = "%Ex";
-                        return_format = TRUE;
-                        break;
-
-                    case ERA_T_FMT:
-                        format = "%EX";
-                        return_format = TRUE;
-                        break;
-
-                    case ERA_D_T_FMT:
-                        format = "%Ec";
-                        return_format = TRUE;
-                        break;
-
-                    case ALT_DIGITS:
-                        tm.tm_wday = 0;
-                        format = "%Ow";        /* Find the alternate digit for 0 */
-                        break;
-                }
+  strftime_success:
 
-                GCC_DIAG_RESTORE_STMT;
+#if defined(USE_LOCALE_CTYPE) && defined(USE_LOCALE_TIME)
 
-                /* We can't use my_strftime() because it doesn't look at
-                 * tm_wday  */
-                while (0 == strftime(PL_langinfo_buf, PL_langinfo_bufsize,
-                                     format, &tm))
-                {
-                    /* A zero return means one of:
-                     *  a)  there wasn't enough space in PL_langinfo_buf
-                     *  b)  the format, like a plain %p, returns empty
-                     *  c)  it was an illegal format, though some
-                     *      implementations of strftime will just return the
-                     *      illegal format as a plain character sequence.
-                     *
-                     *  To quickly test for case 'b)', try again but precede
-                     *  the format with a plain character.  If that result is
-                     *  still empty, the problem is either 'a)' or 'c)' */
-
-                    Size_t format_size = strlen(format) + 1;
-                    Size_t mod_size = format_size + 1;
-                    char * mod_format;
-                    char * temp_result;
-
-                    Newx(mod_format, mod_size, char);
-                    Newx(temp_result, PL_langinfo_bufsize, char);
-                    *mod_format = ' ';
-                    my_strlcpy(mod_format + 1, format, mod_size);
-                    len = strftime(temp_result,
-                                   PL_langinfo_bufsize,
-                                   mod_format, &tm);
-                    Safefree(mod_format);
-                    Safefree(temp_result);
-
-                    /* If 'len' is non-zero, it means that we had a case like
-                     * %p which means the current locale doesn't use a.m. or
-                     * p.m., and that is valid */
-                    if (len == 0) {
-
-                        /* Here, still didn't work.  If we get well beyond a
-                         * reasonable size, bail out to prevent an infinite
-                         * loop. */
-
-                        if (PL_langinfo_bufsize > 100 * format_size) {
-                            *PL_langinfo_buf = '\0';
-                        }
-                        else {
-                            /* Double the buffer size to retry;  Add 1 in case
-                             * original was 0, so we aren't stuck at 0.  */
-                            PL_langinfo_bufsize *= 2;
-                            PL_langinfo_bufsize++;
-                            Renew(PL_langinfo_buf, PL_langinfo_bufsize, char);
-                            continue;
-                        }
-                    }
+    restore_toggled_locale_c(LC_CTYPE, orig_CTYPE_LOCALE);
 
-                    break;
-                }
+#endif
+    return buf;
 
-                /* Here, we got a result.
-                 *
-                 * If the item is 'ALT_DIGITS', PL_langinfo_buf contains the
-                 * alternate format for wday 0.  If the value is the same as
-                 * the normal 0, there isn't an alternate, so clear the buffer.
-                 * */
-                if (   item == ALT_DIGITS
-                    && strEQ(PL_langinfo_buf, "0"))
-                {
-                    *PL_langinfo_buf = '\0';
-                }
+#else
+    Perl_croak(aTHX_ "panic: no strftime");
+    return NULL;
+#endif
 
-                /* ALT_DIGITS is problematic.  Experiments on it showed that
-                 * strftime() did not always work properly when going from
-                 * alt-9 to alt-10.  Only a few locales have this item defined,
-                 * and in all of them on Linux that khw was able to find,
-                 * nl_langinfo() merely returned the alt-0 character, possibly
-                 * doubled.  Most Unicode digits are in blocks of 10
-                 * consecutive code points, so that is sufficient information
-                 * for those scripts, as we can infer alt-1, alt-2, ....  But
-                 * for a Japanese locale, a CJK ideographic 0 is returned, and
-                 * the CJK digits are not in code point order, so you can't
-                 * really infer anything.  The localedef for this locale did
-                 * specify the succeeding digits, so that strftime() works
-                 * properly on them, without needing to infer anything.  But
-                 * the nl_langinfo() return did not give sufficient information
-                 * for the caller to understand what's going on.  So until
-                 * there is evidence that it should work differently, this
-                 * returns the alt-0 string for ALT_DIGITS.
-                 *
-                 * wday was chosen because its range is all a single digit.
-                 * Things like tm_sec have two digits as the minimum: '00' */
+}
 
-                retval = PL_langinfo_buf;
+char *
+Perl_my_strftime8_temp(pTHX_ const char *fmt, int sec, int min, int hour, int mday,
+                         int mon, int year, int wday, int yday, int isdst,
+                         utf8ness_t * utf8ness)
+{   /* Documented above */
+    char * retval = my_strftime(fmt, sec, min, hour, mday, mon, year, wday,
+                                yday, isdst);
 
-                /* If to return the format, not the value, overwrite the buffer
-                 * with it.  But some strftime()s will keep the original format
-                 * if illegal, so change those to "" */
-                if (return_format) {
-                    if (strEQ(PL_langinfo_buf, format)) {
-                        *PL_langinfo_buf = '\0';
-                    }
-                    else {
-                        retval = save_to_buffer(format, &PL_langinfo_buf,
-                                                &PL_langinfo_bufsize, 0);
-                    }
-                }
+    PERL_ARGS_ASSERT_MY_STRFTIME8_TEMP;
 
-                break;
+    if (utf8ness) {
 
-#  endif
+#ifdef USE_LOCALE_TIME
+        *utf8ness = get_locale_string_utf8ness_i(retval,
+                                                 LOCALE_UTF8NESS_UNKNOWN,
+                                                 NULL, LC_TIME_INDEX_);
+#else
+        *utf8ness = UTF8NESS_IMMATERIAL;
+#endif
 
-        }
     }
 
-    return retval;
-
-#endif
+    DEBUG_Lv(PerlIO_printf(Perl_debug_log,
+                        "fmt=%s, retval=%s", fmt,
+                        ((is_utf8_string((U8 *) retval, 0))
+                         ? retval
+                         :_byte_dump_string((U8 *) retval, strlen(retval), 0)));
+             if (utf8ness) PerlIO_printf(Perl_debug_log, "; utf8ness=%d",
+                                                         (int) *utf8ness);
+             PerlIO_printf(Perl_debug_log, "\n");
+            );
 
+    return retval;
 }
 
 /*
@@ -3150,53 +5011,79 @@ Perl_init_i18nl10n(pTHX_ int printwarn)
      * error handling.
      *
      * Besides some asserts, data structure initialization, and specific
-     * platform complications, this routine is effectively just two things.
-     *
-     *    a)    setlocale(LC_ALL, "");
+     * platform complications, this routine is effectively represented by this
+     * pseudo-code:
      *
-     * which sets LC_ALL to the values in the current environment.
+     *      setlocale(LC_ALL, "");                                            x
+     *      foreach (subcategory) {                                           x
+     *          curlocales[f(subcategory)] = setlocale(subcategory, NULL);    x
+     *      }                                                                 x
+     *      if (platform_so_requires) {
+     *          foreach (subcategory) {
+     *            PL_curlocales[f(subcategory)] = curlocales[f(subcategory)]
+     *          }
+     *      }
+     *      foreach (subcategory) {
+     *          if (needs_special_handling[f(subcategory)] &this_subcat_handler
+     *      }
      *
-     * And for each individual category 'foo' whose value we care about:
+     * This sets all the categories to the values in the current environment,
+     * saves them temporarily in curlocales[] until they can be handled and/or
+     * on some platforms saved in a per-thread array PL_curlocales[].
      *
-     *    b)    save_foo = setlocale(LC_foo, NULL); handle_foo(save_foo);
+     * f(foo) is a mapping from the opaque system category numbers to small
+     * non-negative integers used most everywhere in this file as indices into
+     * arrays (such as curlocales[]) so the program doesn't have to otherwise
+     * deal with the opaqueness.
      *
-     * (We don't tend to care about categories like LC_PAPER, for example.)
+     * If the platform doesn't have LC_ALL, the lines marked 'x' above are
+     * effectively replaced by:
+     *      foreach (subcategory) {                                           y
+     *          curlocales[f(subcategory)] = setlocale(subcategory, "");      y
+     *      }                                                                 y
      *
-     * But there are complications.  On systems without LC_ALL, it emulates
-     * step a) by looping through all the categories, and doing
+     * The only differences being the lack of an LC_ALL call, and using ""
+     * instead of NULL in the setlocale calls.
      *
-     *    setlocale(LC_foo, "");
+     * But there are, of course, complications.
      *
-     * on each.
+     * it has to deal with if this is an embedded perl, whose locale doesn't
+     * come from the environment, but has been set up by the caller.  This is
+     * pretty simply handled: the "" in the setlocale calls is not a string
+     * constant, but a variable which is set to NULL in the embedded case.
      *
-     * And it has to deal with if this is an embedded perl, whose locale
-     * doesn't come from the environment, but has been set up by the caller.
-     * This is pretty simply handled: the "" in the setlocale calls is not a
-     * string constant, but a variable which is set to NULL in the embedded
-     * case.
+     * But the major complication is handling failure and doing fallback.  All
+     * the code marked 'x' or 'y' above is actually enclosed in an outer loop,
+     * using the array trial_locales[].  On entry, trial_locales[] is
+     * initialized to just one entry, containing the NULL or "" locale argument
+     * shown above.  If, as is almost always the case, everything works, it
+     * exits after just the one iteration, going on to the next step.
      *
-     * But the major complication is handling failure and doing fallback.
-     * There is an array, trial_locales, the elements of which are looped over
-     * until the locale is successfully set.  The array is initialized with
-     * just one element, for
-     *      setlocale(LC_ALL, $NULL_or_empty)
-     * If that works, as it almost always does, there's no more elements and
-     * the loop iterates just the once.  Otherwise elements are added for each
-     * of the environment variables that POSIX dictates should control the
-     * program, in priority order, with a final one being "C".  The loop is
-     * repeated until the first one succeeds.  If all fail, we limp along with
-     * whatever state we got to.  If there is no LC_ALL, an inner loop is run
-     * through all categories (making things look complex).
+     * But if there is a failure, the code tries its best to honor the
+     * environment as much as possible.  It self-modifies trial_locales[] to
+     * have more elements, one for each of the POSIX-specified settings from
+     * the environment, such as LANG, ending in the ultimate fallback, the C
+     * locale.  Thus if there is something bogus with a higher priority
+     * environment variable, it will try with the next highest, until something
+     * works.  If everything fails, it limps along with whatever state it got
+     * to.
      *
      * A further complication is that Windows has an additional fallback, the
      * user-default ANSI code page obtained from the operating system.  This is
      * added as yet another loop iteration, just before the final "C"
      *
-     * On Ultrix, the locale MUST come from the environment, so there is
-     * preliminary code to set it.  I (khw) am not sure that it is necessary,
-     * and that this couldn't be folded into the loop, but barring any real
-     * platforms to test on, it's staying as-is
-     */
+     * A slight complication is that in embedded Perls, the locale may already
+     * be set-up, and we don't want to get it from the normal environment
+     * variables.  This is handled by having a special environment variable
+     * indicate we're in this situation.  We simply set setlocale's 2nd
+     * parameter to be a NULL instead of "".  That indicates to setlocale that
+     * it is not to change anything, but to return the current value,
+     * effectively initializing perl's db to what the locale already is.
+     *
+     * We play the same trick with NULL if a LC_ALL succeeds.  We call
+     * setlocale() on the individual categories with NULL to get their existing
+     * values for our db, instead of trying to change them.
+     * */
 
     int ok = 1;
 
@@ -3215,7 +5102,13 @@ Perl_init_i18nl10n(pTHX_ int printwarn)
     const char * const setlocale_init = (PerlEnv_getenv("PERL_SKIP_LOCALE_INIT"))
                                         ? NULL
                                         : "";
-    const char* trial_locales[5];   /* 5 = 1 each for "", LC_ALL, LANG, "", C */
+    typedef struct trial_locales_struct_s {
+        const char* trial_locale;
+        const char* fallback_desc;
+        const char* fallback_name;
+    } trial_locales_struct;
+    /* 5 = 1 each for "", LC_ALL, LANG, (Win32) system default locale, C */
+    trial_locales_struct trial_locales[5];
     unsigned int trial_locales_count;
     const char * const lc_all     = PerlEnv_getenv("LC_ALL");
     const char * const lang       = PerlEnv_getenv("LANG");
@@ -3233,165 +5126,140 @@ Perl_init_i18nl10n(pTHX_ int printwarn)
                                          *bad_lang_use_once
                                        && strNE("0", bad_lang_use_once)))));
 
-    /* setlocale() return vals; not copied so must be looked at immediately */
-    const char * sl_result[NOMINAL_LC_ALL_INDEX + 1];
-
     /* current locale for given category; should have been copied so aren't
      * volatile */
     const char * curlocales[NOMINAL_LC_ALL_INDEX + 1];
 
-#  ifdef WIN32
-
-    /* In some systems you can find out the system default locale
-     * and use that as the fallback locale. */
-#    define SYSTEM_DEFAULT_LOCALE
-#  endif
-#  ifdef SYSTEM_DEFAULT_LOCALE
-
-    const char *system_default_locale = NULL;
-
-#  endif
-
 #  ifndef DEBUGGING
 #    define DEBUG_LOCALE_INIT(a,b,c)
 #  else
 
     DEBUG_INITIALIZATION_set(cBOOL(PerlEnv_getenv("PERL_DEBUG_LOCALE_INIT")));
 
-#    define DEBUG_LOCALE_INIT(category, locale, result)                     \
-        STMT_START {                                                        \
-                if (debug_initialization) {                                 \
-                    PerlIO_printf(Perl_debug_log,                           \
-                                  "%s:%d: %s\n",                            \
-                                  __FILE__, __LINE__,                       \
-                                  setlocale_debug_string(category,          \
-                                                          locale,           \
-                                                          result));         \
-                }                                                           \
-        } STMT_END
+#    define DEBUG_LOCALE_INIT(cat_index, locale, result)                    \
+        DEBUG_L(PerlIO_printf(Perl_debug_log, "%s\n",                       \
+                    setlocale_debug_string_i(cat_index, locale, result)));
 
 /* Make sure the parallel arrays are properly set up */
 #    ifdef USE_LOCALE_NUMERIC
-    assert(categories[LC_NUMERIC_INDEX] == LC_NUMERIC);
-    assert(strEQ(category_names[LC_NUMERIC_INDEX], "LC_NUMERIC"));
+    assert(categories[LC_NUMERIC_INDEX_] == LC_NUMERIC);
+    assert(strEQ(category_names[LC_NUMERIC_INDEX_], "LC_NUMERIC"));
 #      ifdef USE_POSIX_2008_LOCALE
-    assert(category_masks[LC_NUMERIC_INDEX] == LC_NUMERIC_MASK);
+    assert(category_masks[LC_NUMERIC_INDEX_] == LC_NUMERIC_MASK);
 #      endif
 #    endif
 #    ifdef USE_LOCALE_CTYPE
-    assert(categories[LC_CTYPE_INDEX] == LC_CTYPE);
-    assert(strEQ(category_names[LC_CTYPE_INDEX], "LC_CTYPE"));
+    assert(categories[LC_CTYPE_INDEX_] == LC_CTYPE);
+    assert(strEQ(category_names[LC_CTYPE_INDEX_], "LC_CTYPE"));
 #      ifdef USE_POSIX_2008_LOCALE
-    assert(category_masks[LC_CTYPE_INDEX] == LC_CTYPE_MASK);
+    assert(category_masks[LC_CTYPE_INDEX_] == LC_CTYPE_MASK);
 #      endif
 #    endif
 #    ifdef USE_LOCALE_COLLATE
-    assert(categories[LC_COLLATE_INDEX] == LC_COLLATE);
-    assert(strEQ(category_names[LC_COLLATE_INDEX], "LC_COLLATE"));
+    assert(categories[LC_COLLATE_INDEX_] == LC_COLLATE);
+    assert(strEQ(category_names[LC_COLLATE_INDEX_], "LC_COLLATE"));
 #      ifdef USE_POSIX_2008_LOCALE
-    assert(category_masks[LC_COLLATE_INDEX] == LC_COLLATE_MASK);
+    assert(category_masks[LC_COLLATE_INDEX_] == LC_COLLATE_MASK);
 #      endif
 #    endif
 #    ifdef USE_LOCALE_TIME
-    assert(categories[LC_TIME_INDEX] == LC_TIME);
-    assert(strEQ(category_names[LC_TIME_INDEX], "LC_TIME"));
+    assert(categories[LC_TIME_INDEX_] == LC_TIME);
+    assert(strEQ(category_names[LC_TIME_INDEX_], "LC_TIME"));
 #      ifdef USE_POSIX_2008_LOCALE
-    assert(category_masks[LC_TIME_INDEX] == LC_TIME_MASK);
+    assert(category_masks[LC_TIME_INDEX_] == LC_TIME_MASK);
 #      endif
 #    endif
 #    ifdef USE_LOCALE_MESSAGES
-    assert(categories[LC_MESSAGES_INDEX] == LC_MESSAGES);
-    assert(strEQ(category_names[LC_MESSAGES_INDEX], "LC_MESSAGES"));
+    assert(categories[LC_MESSAGES_INDEX_] == LC_MESSAGES);
+    assert(strEQ(category_names[LC_MESSAGES_INDEX_], "LC_MESSAGES"));
 #      ifdef USE_POSIX_2008_LOCALE
-    assert(category_masks[LC_MESSAGES_INDEX] == LC_MESSAGES_MASK);
+    assert(category_masks[LC_MESSAGES_INDEX_] == LC_MESSAGES_MASK);
 #      endif
 #    endif
 #    ifdef USE_LOCALE_MONETARY
-    assert(categories[LC_MONETARY_INDEX] == LC_MONETARY);
-    assert(strEQ(category_names[LC_MONETARY_INDEX], "LC_MONETARY"));
+    assert(categories[LC_MONETARY_INDEX_] == LC_MONETARY);
+    assert(strEQ(category_names[LC_MONETARY_INDEX_], "LC_MONETARY"));
 #      ifdef USE_POSIX_2008_LOCALE
-    assert(category_masks[LC_MONETARY_INDEX] == LC_MONETARY_MASK);
+    assert(category_masks[LC_MONETARY_INDEX_] == LC_MONETARY_MASK);
 #      endif
 #    endif
 #    ifdef USE_LOCALE_ADDRESS
-    assert(categories[LC_ADDRESS_INDEX] == LC_ADDRESS);
-    assert(strEQ(category_names[LC_ADDRESS_INDEX], "LC_ADDRESS"));
+    assert(categories[LC_ADDRESS_INDEX_] == LC_ADDRESS);
+    assert(strEQ(category_names[LC_ADDRESS_INDEX_], "LC_ADDRESS"));
 #      ifdef USE_POSIX_2008_LOCALE
-    assert(category_masks[LC_ADDRESS_INDEX] == LC_ADDRESS_MASK);
+    assert(category_masks[LC_ADDRESS_INDEX_] == LC_ADDRESS_MASK);
 #      endif
 #    endif
 #    ifdef USE_LOCALE_IDENTIFICATION
-    assert(categories[LC_IDENTIFICATION_INDEX] == LC_IDENTIFICATION);
-    assert(strEQ(category_names[LC_IDENTIFICATION_INDEX], "LC_IDENTIFICATION"));
+    assert(categories[LC_IDENTIFICATION_INDEX_] == LC_IDENTIFICATION);
+    assert(strEQ(category_names[LC_IDENTIFICATION_INDEX_], "LC_IDENTIFICATION"));
 #      ifdef USE_POSIX_2008_LOCALE
-    assert(category_masks[LC_IDENTIFICATION_INDEX] == LC_IDENTIFICATION_MASK);
+    assert(category_masks[LC_IDENTIFICATION_INDEX_] == LC_IDENTIFICATION_MASK);
 #      endif
 #    endif
 #    ifdef USE_LOCALE_MEASUREMENT
-    assert(categories[LC_MEASUREMENT_INDEX] == LC_MEASUREMENT);
-    assert(strEQ(category_names[LC_MEASUREMENT_INDEX], "LC_MEASUREMENT"));
+    assert(categories[LC_MEASUREMENT_INDEX_] == LC_MEASUREMENT);
+    assert(strEQ(category_names[LC_MEASUREMENT_INDEX_], "LC_MEASUREMENT"));
 #      ifdef USE_POSIX_2008_LOCALE
-    assert(category_masks[LC_MEASUREMENT_INDEX] == LC_MEASUREMENT_MASK);
+    assert(category_masks[LC_MEASUREMENT_INDEX_] == LC_MEASUREMENT_MASK);
 #      endif
 #    endif
 #    ifdef USE_LOCALE_PAPER
-    assert(categories[LC_PAPER_INDEX] == LC_PAPER);
-    assert(strEQ(category_names[LC_PAPER_INDEX], "LC_PAPER"));
+    assert(categories[LC_PAPER_INDEX_] == LC_PAPER);
+    assert(strEQ(category_names[LC_PAPER_INDEX_], "LC_PAPER"));
 #      ifdef USE_POSIX_2008_LOCALE
-    assert(category_masks[LC_PAPER_INDEX] == LC_PAPER_MASK);
+    assert(category_masks[LC_PAPER_INDEX_] == LC_PAPER_MASK);
 #      endif
 #    endif
 #    ifdef USE_LOCALE_TELEPHONE
-    assert(categories[LC_TELEPHONE_INDEX] == LC_TELEPHONE);
-    assert(strEQ(category_names[LC_TELEPHONE_INDEX], "LC_TELEPHONE"));
+    assert(categories[LC_TELEPHONE_INDEX_] == LC_TELEPHONE);
+    assert(strEQ(category_names[LC_TELEPHONE_INDEX_], "LC_TELEPHONE"));
 #      ifdef USE_POSIX_2008_LOCALE
-    assert(category_masks[LC_TELEPHONE_INDEX] == LC_TELEPHONE_MASK);
+    assert(category_masks[LC_TELEPHONE_INDEX_] == LC_TELEPHONE_MASK);
+#      endif
+#    endif
+#    ifdef USE_LOCALE_NAME
+    assert(categories[LC_NAME_INDEX_] == LC_NAME);
+    assert(strEQ(category_names[LC_NAME_INDEX_], "LC_NAME"));
+#      ifdef USE_POSIX_2008_LOCALE
+    assert(category_masks[LC_NAME_INDEX_] == LC_NAME_MASK);
 #      endif
 #    endif
 #    ifdef USE_LOCALE_SYNTAX
-    assert(categories[LC_SYNTAX_INDEX] == LC_SYNTAX);
-    assert(strEQ(category_names[LC_SYNTAX_INDEX], "LC_SYNTAX"));
+    assert(categories[LC_SYNTAX_INDEX_] == LC_SYNTAX);
+    assert(strEQ(category_names[LC_SYNTAX_INDEX_], "LC_SYNTAX"));
 #      ifdef USE_POSIX_2008_LOCALE
-    assert(category_masks[LC_SYNTAX_INDEX] == LC_SYNTAX_MASK);
+    assert(category_masks[LC_SYNTAX_INDEX_] == LC_SYNTAX_MASK);
 #      endif
 #    endif
 #    ifdef USE_LOCALE_TOD
-    assert(categories[LC_TOD_INDEX] == LC_TOD);
-    assert(strEQ(category_names[LC_TOD_INDEX], "LC_TOD"));
+    assert(categories[LC_TOD_INDEX_] == LC_TOD);
+    assert(strEQ(category_names[LC_TOD_INDEX_], "LC_TOD"));
 #      ifdef USE_POSIX_2008_LOCALE
-    assert(category_masks[LC_TOD_INDEX] == LC_TOD_MASK);
+    assert(category_masks[LC_TOD_INDEX_] == LC_TOD_MASK);
 #      endif
 #    endif
 #    ifdef LC_ALL
-    assert(categories[LC_ALL_INDEX] == LC_ALL);
-    assert(strEQ(category_names[LC_ALL_INDEX], "LC_ALL"));
-    assert(NOMINAL_LC_ALL_INDEX == LC_ALL_INDEX);
+    assert(categories[LC_ALL_INDEX_] == LC_ALL);
+    assert(strEQ(category_names[LC_ALL_INDEX_], "LC_ALL"));
+    STATIC_ASSERT_STMT(NOMINAL_LC_ALL_INDEX == LC_ALL_INDEX_);
 #      ifdef USE_POSIX_2008_LOCALE
-    assert(category_masks[LC_ALL_INDEX] == LC_ALL_MASK);
+    assert(category_masks[LC_ALL_INDEX_] == LC_ALL_MASK);
 #      endif
 #    endif
 #  endif    /* DEBUGGING */
 
     /* Initialize the per-thread mbrFOO() state variables.  See POSIX.xs for
      * why these particular incantations are used. */
-#ifdef HAS_MBRLEN
+#  ifdef HAS_MBRLEN
     memzero(&PL_mbrlen_ps, sizeof(PL_mbrlen_ps));
-#endif
-#ifdef HAS_MBRTOWC
+#  endif
+#  ifdef HAS_MBRTOWC
     memzero(&PL_mbrtowc_ps, sizeof(PL_mbrtowc_ps));
-#endif
-#ifdef HAS_WCTOMBR
+#  endif
+#  ifdef HAS_WCTOMBR
     wcrtomb(NULL, L'\0', &PL_wcrtomb_ps);
-#endif
-
-    /* Initialize the cache of the program's UTF-8ness for the always known
-     * locales C and POSIX */
-    my_strlcpy(PL_locale_utf8ness, C_and_POSIX_utf8ness,
-               sizeof(PL_locale_utf8ness));
-
-    /* See https://github.com/Perl/perl5/issues/17824 */
-    Zero(curlocales, NOMINAL_LC_ALL_INDEX, char *);
-
+#  endif
 #  ifdef USE_THREAD_SAFE_LOCALE
 #    ifdef WIN32
 
@@ -3401,123 +5269,87 @@ Perl_init_i18nl10n(pTHX_ int printwarn)
 #  endif
 #  ifdef USE_POSIX_2008_LOCALE
 
-    PL_C_locale_obj = newlocale(LC_ALL_MASK, "C", (locale_t) 0);
     if (! PL_C_locale_obj) {
-        Perl_croak_nocontext(
-            "panic: Cannot create POSIX 2008 C locale object; errno=%d", errno);
+        PL_C_locale_obj = newlocale(LC_ALL_MASK, "C", (locale_t) 0);
     }
-    if (DEBUG_Lv_TEST || debug_initialization) {
-        PerlIO_printf(Perl_debug_log, "%s:%d: created C object %p\n", __FILE__, __LINE__, PL_C_locale_obj);
+    if (! PL_C_locale_obj) {
+        locale_panic_(Perl_form(aTHX_
+                                "Cannot create POSIX 2008 C locale object"));
     }
 
-#  endif
+    DEBUG_Lv(PerlIO_printf(Perl_debug_log, "created C object %p\n",
+                           PL_C_locale_obj));
 
-#  ifdef USE_LOCALE_NUMERIC
+    /* Switch to using the POSIX 2008 interface now.  This would happen below
+     * anyway, but deferring it can lead to leaks of memory that would also get
+     * malloc'd in the interim */
+    uselocale(PL_C_locale_obj);
+
+#    ifdef USE_LOCALE_NUMERIC
 
-    PL_numeric_radix_sv = newSVpvs(".");
+    PL_underlying_numeric_obj = duplocale(PL_C_locale_obj);
 
+#    endif
 #  endif
+#  ifdef USE_LOCALE_NUMERIC
+
+    PL_numeric_radix_sv    = newSV(1);
+    PL_underlying_radix_sv = newSV(1);
+    Newxz(PL_numeric_name, 1, char);    /* Single NUL character */
+    new_numeric("C", false);
 
-#  if defined(USE_POSIX_2008_LOCALE) && ! defined(HAS_QUERYLOCALE)
+#  endif
+#  ifdef USE_LOCALE_COLLATE
 
-    /* Initialize our records.  If we have POSIX 2008, we have LC_ALL */
-    do_setlocale_c(LC_ALL, my_setlocale(LC_ALL, NULL));
+    Newxz(PL_collation_name, 1, char);
+    new_collate("C", false);
 
 #  endif
-#  ifdef LOCALE_ENVIRON_REQUIRED
+#  ifdef USE_LOCALE_CTYPE
 
-    /*
-     * Ultrix setlocale(..., "") fails if there are no environment
-     * variables from which to get a locale name.
-     */
+    Newxz(PL_ctype_name, 1, char);
+    new_ctype("C", false);
 
-#    ifndef LC_ALL
-#      error Ultrix without LC_ALL not implemented
-#    else
+#  endif
+#  ifdef USE_PL_CURLOCALES
 
-    {
-        bool done = FALSE;
-        if (lang) {
-            sl_result[LC_ALL_INDEX] = do_setlocale_c(LC_ALL, setlocale_init);
-            DEBUG_LOCALE_INIT(LC_ALL, setlocale_init, sl_result[LC_ALL_INDEX]);
-            if (sl_result[LC_ALL_INDEX])
-                done = TRUE;
-            else
-                setlocale_failure = TRUE;
-        }
-        if (! setlocale_failure) {
-            const char * locale_param;
-            for (i = 0; i < LC_ALL_INDEX; i++) {
-                locale_param = (! done && (lang || PerlEnv_getenv(category_names[i])))
-                            ? setlocale_init
-                            : NULL;
-                sl_result[i] = do_setlocale_r(categories[i], locale_param);
-                if (! sl_result[i]) {
-                    setlocale_failure = TRUE;
-                }
-                DEBUG_LOCALE_INIT(categories[i], locale_param, sl_result[i]);
-            }
-        }
+    /* Initialize our records. */
+    for (i = 0; i < NOMINAL_LC_ALL_INDEX; i++) {
+        (void) emulate_setlocale_i(i, posix_setlocale(categories[i], NULL),
+                                   RECALCULATE_LC_ALL_ON_FINAL_INTERATION,
+                                   __LINE__);
     }
 
-#    endif /* LC_ALL */
-#  endif /* LOCALE_ENVIRON_REQUIRED */
+#  endif
 
     /* We try each locale in the list until we get one that works, or exhaust
      * the list.  Normally the loop is executed just once.  But if setting the
      * locale fails, inside the loop we add fallback trials to the array and so
      * will execute the loop multiple times */
-    trial_locales[0] = setlocale_init;
+    trial_locales_struct ts = {
+        .trial_locale = setlocale_init,
+        .fallback_desc = NULL,
+        .fallback_name = NULL,
+    };
+    trial_locales[0] = ts;
     trial_locales_count = 1;
 
-    for (i= 0; i < trial_locales_count; i++) {
-        const char * trial_locale = trial_locales[i];
-
-        if (i > 0) {
-
-            /* XXX This is to preserve old behavior for LOCALE_ENVIRON_REQUIRED
-             * when i==0, but I (khw) don't think that behavior makes much
-             * sense */
-            setlocale_failure = FALSE;
-
-#  ifdef SYSTEM_DEFAULT_LOCALE
-#    ifdef WIN32    /* Note that assumes Win32 has LC_ALL */
-
-            /* On Windows machines, an entry of "" after the 0th means to use
-             * the system default locale, which we now proceed to get. */
-            if (strEQ(trial_locale, "")) {
-                unsigned int j;
-
-                /* Note that this may change the locale, but we are going to do
-                 * that anyway just below */
-                system_default_locale = do_setlocale_c(LC_ALL, "");
-                DEBUG_LOCALE_INIT(LC_ALL, "", system_default_locale);
-
-                /* Skip if invalid or if it's already on the list of locales to
-                 * try */
-                if (! system_default_locale) {
-                    goto next_iteration;
-                }
-                for (j = 0; j < trial_locales_count; j++) {
-                    if (strEQ(system_default_locale, trial_locales[j])) {
-                        goto next_iteration;
-                    }
-                }
-
-                trial_locale = system_default_locale;
-            }
-#    else
-#      error SYSTEM_DEFAULT_LOCALE only implemented for Win32
-#    endif
-#  endif /* SYSTEM_DEFAULT_LOCALE */
+    for (i = 0; i < NOMINAL_LC_ALL_INDEX; i++) {
+        curlocales[i] = NULL;
+    }
 
-        }   /* For i > 0 */
+    for (i= 0; i < trial_locales_count; i++) {
+        const char * trial_locale = trial_locales[i].trial_locale;
+        setlocale_failure = FALSE;
 
 #  ifdef LC_ALL
 
-        sl_result[LC_ALL_INDEX] = do_setlocale_c(LC_ALL, trial_locale);
-        DEBUG_LOCALE_INIT(LC_ALL, trial_locale, sl_result[LC_ALL_INDEX]);
-        if (! sl_result[LC_ALL_INDEX]) {
+        /* setlocale() return vals; not copied so must be looked at
+         * immediately. */
+        const char * sl_result[NOMINAL_LC_ALL_INDEX + 1];
+        sl_result[LC_ALL_INDEX_] = stdized_setlocale(LC_ALL, trial_locale);
+        DEBUG_LOCALE_INIT(LC_ALL_INDEX_, trial_locale, sl_result[LC_ALL_INDEX_]);
+        if (! sl_result[LC_ALL_INDEX_]) {
             setlocale_failure = TRUE;
         }
         else {
@@ -3536,12 +5368,12 @@ Perl_init_i18nl10n(pTHX_ int printwarn)
         if (! setlocale_failure) {
             unsigned int j;
             for (j = 0; j < NOMINAL_LC_ALL_INDEX; j++) {
-                curlocales[j]
-                        = savepv(do_setlocale_r(categories[j], trial_locale));
+                curlocales[j] = stdized_setlocale(categories[j], trial_locale);
                 if (! curlocales[j]) {
                     setlocale_failure = TRUE;
                 }
-                DEBUG_LOCALE_INIT(categories[j], trial_locale, curlocales[j]);
+                curlocales[j] = savepv(curlocales[j]);
+                DEBUG_LOCALE_INIT(j, trial_locale, curlocales[j]);
             }
 
             if (LIKELY(! setlocale_failure)) {  /* All succeeded */
@@ -3565,14 +5397,11 @@ Perl_init_i18nl10n(pTHX_ int printwarn)
 #  else /* !LC_ALL */
 
                 PerlIO_printf(Perl_error_log,
-                "perl: warning: Setting locale failed for the categories:\n\t");
+                "perl: warning: Setting locale failed for the categories:\n");
 
                 for (j = 0; j < NOMINAL_LC_ALL_INDEX; j++) {
                     if (! curlocales[j]) {
-                        PerlIO_printf(Perl_error_log, category_names[j]);
-                    }
-                    else {
-                        Safefree(curlocales[j]);
+                        PerlIO_printf(Perl_error_log, "\t%s\n", category_names[j]);
                     }
                 }
 
@@ -3656,21 +5485,35 @@ Perl_init_i18nl10n(pTHX_ int printwarn)
              * to change the behavior. */
             if (lc_all) {
                 for (j = 0; j < trial_locales_count; j++) {
-                    if (strEQ(lc_all, trial_locales[j])) {
+                    if (strEQ(lc_all, trial_locales[j].trial_locale)) {
                         goto done_lc_all;
                     }
                 }
-                trial_locales[trial_locales_count++] = lc_all;
+                trial_locales_struct ts = {
+                    .trial_locale = lc_all,
+                    .fallback_desc = (strEQ(lc_all, "C")
+                                      ? "the standard locale"
+                                      : "a fallback locale"),
+                    .fallback_name = lc_all,
+                };
+                trial_locales[trial_locales_count++] = ts;
             }
           done_lc_all:
 
             if (lang) {
                 for (j = 0; j < trial_locales_count; j++) {
-                    if (strEQ(lang, trial_locales[j])) {
+                    if (strEQ(lang, trial_locales[j].trial_locale)) {
                         goto done_lang;
                     }
                 }
-                trial_locales[trial_locales_count++] = lang;
+                trial_locales_struct ts = {
+                    .trial_locale = lang,
+                    .fallback_desc = (strEQ(lang, "C")
+                                      ? "the standard locale"
+                                      : "a fallback locale"),
+                    .fallback_name = lang,
+                };
+                trial_locales[trial_locales_count++] = ts;
             }
           done_lang:
 
@@ -3679,29 +5522,65 @@ Perl_init_i18nl10n(pTHX_ int printwarn)
             /* For Windows, we also try the system default locale before "C".
              * (If there exists a Windows without LC_ALL we skip this because
              * it gets too complicated.  For those, the "C" is the next
-             * fallback possibility).  The "" is the same as the 0th element of
-             * the array, but the code at the loop above knows to treat it
-             * differently when not the 0th */
-            trial_locales[trial_locales_count++] = "";
+             * fallback possibility). */
+            {
+                /* Note that this may change the locale, but we are going to do
+                 * that anyway.
+                 *
+                 * Our normal Windows setlocale() implementation ignores the
+                 * system default locale to make things work like POSIX.  This
+                 * is the only place where we want to consider it, so have to
+                 * use wrap_wsetlocale(). */
+                const char *system_default_locale =
+                                    stdize_locale(LC_ALL,
+                                                  wrap_wsetlocale(LC_ALL, ""),
+                                                  &PL_stdize_locale_buf,
+                                                  &PL_stdize_locale_bufsize,
+                                                  __LINE__);
+                DEBUG_LOCALE_INIT(LC_ALL_INDEX_, "", system_default_locale);
+
+                /* Skip if invalid or if it's already on the list of locales to
+                 * try */
+                if (! system_default_locale) {
+                    goto done_system_default;
+                }
+                for (j = 0; j < trial_locales_count; j++) {
+                    if (strEQ(system_default_locale, trial_locales[j].trial_locale)) {
+                        goto done_system_default;
+                    }
+                }
+
+                trial_locales_struct ts = {
+                    .trial_locale = system_default_locale,
+                    .fallback_desc = (strEQ(system_default_locale, "C")
+                                      ? "the standard locale"
+                                      : "the system default locale"),
+                    .fallback_name = system_default_locale,
+                };
+                trial_locales[trial_locales_count++] = ts;
+            }
+          done_system_default:
 
 #  endif
 
             for (j = 0; j < trial_locales_count; j++) {
-                if (strEQ("C", trial_locales[j])) {
+                if (strEQ("C", trial_locales[j].trial_locale)) {
                     goto done_C;
                 }
             }
-            trial_locales[trial_locales_count++] = "C";
-
+            {
+                /* new scope to avoid C++ complaining about
+                   initialization being bypassed by goto.
+                */
+                trial_locales_struct ts = {
+                    .trial_locale = "C",
+                    .fallback_desc = "the standard locale",
+                    .fallback_name = "C",
+                };
+                trial_locales[trial_locales_count++] = ts;
+            }
           done_C: ;
         }   /* end of first time through the loop */
-
-#  ifdef WIN32
-
-      next_iteration: ;
-
-#  endif
-
     }   /* end of looping through the trial locales */
 
     if (ok < 1) {   /* If we tried to fallback */
@@ -3723,34 +5602,15 @@ Perl_init_i18nl10n(pTHX_ int printwarn)
 
             for (j = 0; j < NOMINAL_LC_ALL_INDEX; j++) {
                 Safefree(curlocales[j]);
-                curlocales[j] = savepv(do_setlocale_r(categories[j], NULL));
-                DEBUG_LOCALE_INIT(categories[j], NULL, curlocales[j]);
+                curlocales[j] = savepv(stdized_setlocale(categories[j], NULL));
+                DEBUG_LOCALE_INIT(j, NULL, curlocales[j]);
             }
         }
 
         if (locwarn) {
-            const char * description;
-            const char * name = "";
-            if (strEQ(trial_locales[i], "C")) {
-                description = "the standard locale";
-                name = "C";
-            }
-
-#  ifdef SYSTEM_DEFAULT_LOCALE
-
-            else if (strEQ(trial_locales[i], "")) {
-                description = "the system default locale";
-                if (system_default_locale) {
-                    name = system_default_locale;
-                }
-            }
+            const char * description = trial_locales[i].fallback_desc;
+            const char * name = trial_locales[i].fallback_name;
 
-#  endif /* SYSTEM_DEFAULT_LOCALE */
-
-            else {
-                description = "a fallback locale";
-                name = trial_locales[i];
-            }
             if (name && strNE(name, "")) {
                 PerlIO_printf(Perl_error_log,
                     "perl: warning: %s %s (\"%s\").\n", msg, description, name);
@@ -3762,43 +5622,23 @@ Perl_init_i18nl10n(pTHX_ int printwarn)
         }
     } /* End of tried to fallback */
 
-    /* Done with finding the locales; update our records */
-
-#  ifdef USE_LOCALE_CTYPE
-
-    new_ctype(curlocales[LC_CTYPE_INDEX]);
-
-#  endif
-#  ifdef USE_LOCALE_COLLATE
+#  ifdef USE_POSIX_2008_LOCALE
 
-    new_collate(curlocales[LC_COLLATE_INDEX]);
+    /* The stdized setlocales haven't affected the P2008 locales.  Initialize
+     * them now, calculating LC_ALL only on the final go round, when all have
+     * been set. */
+    for (i = 0; i < NOMINAL_LC_ALL_INDEX; i++) {
+        (void) emulate_setlocale_i(i, curlocales[i],
+                                   RECALCULATE_LC_ALL_ON_FINAL_INTERATION,
+                                   __LINE__);
+    }
 
 #  endif
-#  ifdef USE_LOCALE_NUMERIC
-
-    new_numeric(curlocales[LC_NUMERIC_INDEX]);
 
-#  endif
+    /* Done with finding the locales; update the auxiliary records */
+    new_LC_ALL(NULL, false);
 
     for (i = 0; i < NOMINAL_LC_ALL_INDEX; i++) {
-
-#  if defined(USE_ITHREADS) && ! defined(USE_THREAD_SAFE_LOCALE)
-
-        /* This caches whether each category's locale is UTF-8 or not.  This
-         * may involve changing the locale.  It is ok to do this at
-         * initialization time before any threads have started, but not later
-         * unless thread-safe operations are used.
-         * Caching means that if the program heeds our dictate not to change
-         * locales in threaded applications, this data will remain valid, and
-         * it may get queried without having to change locales.  If the
-         * environment is such that all categories have the same locale, this
-         * isn't needed, as the code will not change the locale; but this
-         * handles the uncommon case where the environment has disparate
-         * locales for the categories */
-        (void) _is_cur_LC_category_utf8(categories[i]);
-
-#  endif
-
         Safefree(curlocales[i]);
     }
 
@@ -3824,20 +5664,174 @@ Perl_init_i18nl10n(pTHX_ int printwarn)
 
 #  endif
 #endif /* USE_LOCALE */
-#ifdef DEBUGGING
 
     /* So won't continue to output stuff */
     DEBUG_INITIALIZATION_set(FALSE);
 
-#endif
-
     return ok;
 }
 
 #ifdef USE_LOCALE_COLLATE
 
+STATIC void
+S_compute_collxfrm_coefficients(pTHX)
+{
+
+    /* A locale collation definition includes primary, secondary, tertiary,
+     * etc. weights for each character.  To sort, the primary weights are used,
+     * and only if they compare equal, then the secondary weights are used, and
+     * only if they compare equal, then the tertiary, etc.
+     *
+     * strxfrm() works by taking the input string, say ABC, and creating an
+     * output transformed string consisting of first the primary weights,
+     * A¹B¹C¹ followed by the secondary ones, A²B²C²; and then the tertiary,
+     * etc, yielding A¹B¹C¹ A²B²C² A³B³C³ ....  Some characters may not have
+     * weights at every level.  In our example, let's say B doesn't have a
+     * tertiary weight, and A doesn't have a secondary weight.  The constructed
+     * string is then going to be
+     *  A¹B¹C¹ B²C² A³C³ ....
+     * This has the desired effect that strcmp() will look at the secondary or
+     * tertiary weights only if the strings compare equal at all higher
+     * priority weights.  The spaces shown here, like in
+     *  "A¹B¹C¹ A²B²C² "
+     * are not just for readability.  In the general case, these must actually
+     * be bytes, which we will call here 'separator weights'; and they must be
+     * smaller than any other weight value, but since these are C strings, only
+     * the terminating one can be a NUL (some implementations may include a
+     * non-NUL separator weight just before the NUL).  Implementations tend to
+     * reserve 01 for the separator weights.  They are needed so that a shorter
+     * string's secondary weights won't be misconstrued as primary weights of a
+     * longer string, etc.  By making them smaller than any other weight, the
+     * shorter string will sort first.  (Actually, if all secondary weights are
+     * smaller than all primary ones, there is no need for a separator weight
+     * between those two levels, etc.)
+     *
+     * The length of the transformed string is roughly a linear function of the
+     * input string.  It's not exactly linear because some characters don't
+     * have weights at all levels.  When we call strxfrm() we have to allocate
+     * some memory to hold the transformed string.  The calculations below try
+     * to find coefficients 'm' and 'b' for this locale so that m*x + b equals
+     * how much space we need, given the size of the input string in 'x'.  If
+     * we calculate too small, we increase the size as needed, and call
+     * strxfrm() again, but it is better to get it right the first time to
+     * avoid wasted expensive string transformations.
+     *
+     * We use the string below to find how long the transformation of it is.
+     * Almost all locales are supersets of ASCII, or at least the ASCII
+     * letters.  We use all of them, half upper half lower, because if we used
+     * fewer, we might hit just the ones that are outliers in a particular
+     * locale.  Most of the strings being collated will contain a preponderance
+     * of letters, and even if they are above-ASCII, they are likely to have
+     * the same number of weight levels as the ASCII ones.  It turns out that
+     * digits tend to have fewer levels, and some punctuation has more, but
+     * those are relatively sparse in text, and khw believes this gives a
+     * reasonable result, but it could be changed if experience so dictates. */
+    const char longer[] = "ABCDEFGHIJKLMnopqrstuvwxyz";
+    char * x_longer;        /* Transformed 'longer' */
+    Size_t x_len_longer;    /* Length of 'x_longer' */
+
+    char * x_shorter;   /* We also transform a substring of 'longer' */
+    Size_t x_len_shorter;
+
+    PL_in_utf8_COLLATE_locale = (PL_collation_standard)
+                                ? 0
+                                : is_locale_utf8(PL_collation_name);
+    PL_strxfrm_NUL_replacement = '\0';
+    PL_strxfrm_max_cp = 0;
+
+    /* mem_collxfrm_() is used get the transformation (though here we are
+     * interested only in its length).  It is used because it has the
+     * intelligence to handle all cases, but to work, it needs some values of
+     * 'm' and 'b' to get it started.  For the purposes of this calculation we
+     * use a very conservative estimate of 'm' and 'b'.  This assumes a weight
+     * can be multiple bytes, enough to hold any UV on the platform, and there
+     * are 5 levels, 4 weight bytes, and a trailing NUL.  */
+    PL_collxfrm_base = 5;
+    PL_collxfrm_mult = 5 * sizeof(UV);
+
+    /* Find out how long the transformation really is */
+    x_longer = mem_collxfrm_(longer,
+                             sizeof(longer) - 1,
+                             &x_len_longer,
+
+                             /* We avoid converting to UTF-8 in the called
+                              * function by telling it the string is in UTF-8
+                              * if the locale is a UTF-8 one.  Since the string
+                              * passed here is invariant under UTF-8, we can
+                              * claim it's UTF-8 even though it isn't.  */
+                              PL_in_utf8_COLLATE_locale);
+    Safefree(x_longer);
+
+    /* Find out how long the transformation of a substring of 'longer' is.
+     * Together the lengths of these transformations are sufficient to
+     * calculate 'm' and 'b'.  The substring is all of 'longer' except the
+     * first character.  This minimizes the chances of being swayed by outliers
+     * */
+    x_shorter = mem_collxfrm_(longer + 1,
+                              sizeof(longer) - 2,
+                              &x_len_shorter,
+                              PL_in_utf8_COLLATE_locale);
+    Safefree(x_shorter);
+
+    /* If the results are nonsensical for this simple test, the whole locale
+     * definition is suspect.  Mark it so that locale collation is not active
+     * at all for it.  XXX Should we warn? */
+    if (   x_len_shorter == 0
+        || x_len_longer == 0
+        || x_len_shorter >= x_len_longer)
+    {
+        PL_collxfrm_mult = 0;
+        PL_collxfrm_base = 1;
+        DEBUG_L(PerlIO_printf(Perl_debug_log,
+                "Disabling locale collation for LC_COLLATE='%s';"
+                " length for shorter sample=%zu; longer=%zu\n",
+                PL_collation_name, x_len_shorter, x_len_longer));
+    }
+    else {
+        SSize_t base;       /* Temporary */
+
+        /* We have both: m * strlen(longer)  + b = x_len_longer
+         *               m * strlen(shorter) + b = x_len_shorter;
+         * subtracting yields:
+         *          m * (strlen(longer) - strlen(shorter))
+         *                             = x_len_longer - x_len_shorter
+         * But we have set things up so that 'shorter' is 1 byte smaller than
+         * 'longer'.  Hence:
+         *          m = x_len_longer - x_len_shorter
+         *
+         * But if something went wrong, make sure the multiplier is at least 1.
+         */
+        if (x_len_longer > x_len_shorter) {
+            PL_collxfrm_mult = (STRLEN) x_len_longer - x_len_shorter;
+        }
+        else {
+            PL_collxfrm_mult = 1;
+        }
+
+        /*     mx + b = len
+         * so:      b = len - mx
+         * but in case something has gone wrong, make sure it is non-negative
+         * */
+        base = x_len_longer - PL_collxfrm_mult * (sizeof(longer) - 1);
+        if (base < 0) {
+            base = 0;
+        }
+
+        /* Add 1 for the trailing NUL */
+        PL_collxfrm_base = base + 1;
+    }
+
+    DEBUG_L(PerlIO_printf(Perl_debug_log,
+                          "?UTF-8 locale=%d; x_len_shorter=%zu, "
+                          "x_len_longer=%zu,"
+                          " collate multipler=%zu, collate base=%zu\n",
+                          PL_in_utf8_COLLATE_locale,
+                          x_len_shorter, x_len_longer,
+                          PL_collxfrm_mult, PL_collxfrm_base));
+}
+
 char *
-Perl__mem_collxfrm(pTHX_ const char *input_string,
+Perl_mem_collxfrm_(pTHX_ const char *input_string,
                          STRLEN len,    /* Length of 'input_string' */
                          STRLEN *xlen,  /* Set to length of returned string
                                            (not including the collation index
@@ -3845,15 +5839,18 @@ Perl__mem_collxfrm(pTHX_ const char *input_string,
                          bool utf8      /* Is the input in UTF-8? */
                    )
 {
-
-    /* _mem_collxfrm() is a bit like strxfrm() but with two important
-     * differences. First, it handles embedded NULs. Second, it allocates a bit
-     * more memory than needed for the transformed data itself.  The real
-     * transformed data begins at offset COLLXFRM_HDR_LEN.  *xlen is set to
-     * the length of that, and doesn't include the collation index size.
+    /* mem_collxfrm_() is like strxfrm() but with two important differences.
+     * First, it handles embedded NULs. Second, it allocates a bit more memory
+     * than needed for the transformed data itself.  The real transformed data
+     * begins at offset COLLXFRM_HDR_LEN.  *xlen is set to the length of that,
+     * and doesn't include the collation index size.
+     *
+     * It is the caller's responsibility to eventually free the memory returned
+     * by this function.
+     *
      * Please see sv_collxfrm() to see how this is used. */
 
-#define COLLXFRM_HDR_LEN    sizeof(PL_collation_ix)
+#  define COLLXFRM_HDR_LEN    sizeof(PL_collation_ix)
 
     char * s = (char *) input_string;
     STRLEN s_strlen = strlen(input_string);
@@ -3862,16 +5859,29 @@ Perl__mem_collxfrm(pTHX_ const char *input_string,
     STRLEN length_in_chars;
     bool first_time = TRUE; /* Cleared after first loop iteration */
 
-    PERL_ARGS_ASSERT__MEM_COLLXFRM;
+#  ifdef USE_LOCALE_CTYPE
+        const char * orig_CTYPE_locale = NULL;
+#  endif
+
+#  if defined(USE_POSIX_2008_LOCALE) && defined HAS_STRXFRM_L
+    locale_t constructed_locale = (locale_t) 0;
+#  endif
+
+    PERL_ARGS_ASSERT_MEM_COLLXFRM_;
 
     /* Must be NUL-terminated */
     assert(*(input_string + len) == '\0');
 
-    /* If this locale has defective collation, skip */
-    if (PL_collxfrm_base == 0 && PL_collxfrm_mult == 0) {
-        DEBUG_L(PerlIO_printf(Perl_debug_log,
-                      "_mem_collxfrm: locale's collation is defective\n"));
-        goto bad;
+    if (PL_collxfrm_mult == 0) {     /* unknown or bad */
+        if (PL_collxfrm_base != 0) { /* bad collation => skip */
+            DEBUG_L(PerlIO_printf(Perl_debug_log,
+                            "mem_collxfrm_: locale's collation is defective\n"));
+            goto bad;
+        }
+
+        /* (mult, base) == (0,0) means we need to calculate mult and base
+         * before proceeding */
+        S_compute_collxfrm_coefficients(aTHX);
     }
 
     /* Replace any embedded NULs with the control that sorts before any others.
@@ -3912,6 +5922,16 @@ Perl__mem_collxfrm(pTHX_ const char *input_string,
                  try_non_controls < 2;
                  try_non_controls++)
             {
+
+#  ifdef USE_LOCALE_CTYPE
+
+                /* In this case we use isCNTRL_LC() below, which relies on
+                 * LC_CTYPE, so that must be switched to correspond with the
+                 * LC_COLLATE locale */
+                if (! try_non_controls && ! PL_in_utf8_COLLATE_locale) {
+                    orig_CTYPE_locale = toggle_locale_c(LC_CTYPE, PL_collation_name);
+                }
+#  endif
                 /* Look through all legal code points (NUL isn't) */
                 for (j = 1; j < 256; j++) {
                     char * x;       /* j's xfrm plus collation index */
@@ -3932,7 +5952,7 @@ Perl__mem_collxfrm(pTHX_ const char *input_string,
                     cur_source[0] = (char) j;
 
                     /* Then transform it */
-                    x = _mem_collxfrm(cur_source, trial_len, &x_len,
+                    x = mem_collxfrm_(cur_source, trial_len, &x_len,
                                       0 /* The string is not in UTF-8 */);
 
                     /* Ignore any character that didn't successfully transform.
@@ -3956,6 +5976,10 @@ Perl__mem_collxfrm(pTHX_ const char *input_string,
                     }
                 } /* end of loop through all 255 characters */
 
+#  ifdef USE_LOCALE_CTYPE
+                restore_toggled_locale_c(LC_CTYPE, orig_CTYPE_locale);
+#  endif
+
                 /* Stop looking if found */
                 if (cur_min_x) {
                     break;
@@ -3965,18 +5989,18 @@ Perl__mem_collxfrm(pTHX_ const char *input_string,
                  * work in the locale, repeat the loop, looking for any
                  * character that works */
                 DEBUG_L(PerlIO_printf(Perl_debug_log,
-                "_mem_collxfrm: No control worked.  Trying non-controls\n"));
+                "mem_collxfrm_: No control worked.  Trying non-controls\n"));
             } /* End of loop to try first the controls, then any char */
 
             if (! cur_min_x) {
                 DEBUG_L(PerlIO_printf(Perl_debug_log,
-                    "_mem_collxfrm: Couldn't find any character to replace"
+                    "mem_collxfrm_: Couldn't find any character to replace"
                     " embedded NULs in locale %s with", PL_collation_name));
                 goto bad;
             }
 
             DEBUG_L(PerlIO_printf(Perl_debug_log,
-                    "_mem_collxfrm: Replacing embedded NULs in locale %s with "
+                    "mem_collxfrm_: Replacing embedded NULs in locale %s with "
                     "0x%02X\n", PL_collation_name, PL_strxfrm_NUL_replacement));
 
             Safefree(cur_min_x);
@@ -4089,7 +6113,7 @@ Perl__mem_collxfrm(pTHX_ const char *input_string,
                         cur_source[0] = (char) j;
 
                         /* Then transform it */
-                        x = _mem_collxfrm(cur_source, 1, &x_len, FALSE);
+                        x = mem_collxfrm_(cur_source, 1, &x_len, FALSE);
 
                         /* If something went wrong (which it shouldn't), just
                          * ignore this code point */
@@ -4114,14 +6138,14 @@ Perl__mem_collxfrm(pTHX_ const char *input_string,
 
                     if (! cur_max_x) {
                         DEBUG_L(PerlIO_printf(Perl_debug_log,
-                            "_mem_collxfrm: Couldn't find any character to"
+                            "mem_collxfrm_: Couldn't find any character to"
                             " replace above-Latin1 chars in locale %s with",
                             PL_collation_name));
                         goto bad;
                     }
 
                     DEBUG_L(PerlIO_printf(Perl_debug_log,
-                            "_mem_collxfrm: highest 1-byte collating character"
+                            "mem_collxfrm_: highest 1-byte collating character"
                             " in locale %s is 0x%02X\n",
                             PL_collation_name,
                             PL_strxfrm_max_cp));
@@ -4181,27 +6205,66 @@ Perl__mem_collxfrm(pTHX_ const char *input_string,
     Newx(xbuf, xAlloc, char);
     if (UNLIKELY(! xbuf)) {
         DEBUG_L(PerlIO_printf(Perl_debug_log,
-                      "_mem_collxfrm: Couldn't malloc %zu bytes\n", xAlloc));
+                      "mem_collxfrm_: Couldn't malloc %zu bytes\n", xAlloc));
         goto bad;
     }
 
     /* Store the collation id */
     *(U32*)xbuf = PL_collation_ix;
 
+#  if defined(USE_POSIX_2008_LOCALE) && defined HAS_STRXFRM_L
+#    ifdef USE_LOCALE_CTYPE
+
+    constructed_locale = newlocale(LC_CTYPE_MASK, PL_collation_name,
+                                   duplocale(use_curlocale_scratch()));
+#    else
+
+    constructed_locale = duplocale(use_curlocale_scratch());
+
+#    endif
+#    define my_strxfrm(dest, src, n)  strxfrm_l(dest, src, n,           \
+                                                constructed_locale)
+#    define CLEANUP_STRXFRM                                             \
+        STMT_START {                                                    \
+            if (constructed_locale != (locale_t) 0)                     \
+                freelocale(constructed_locale);                         \
+        } STMT_END
+#  else
+#    define my_strxfrm(dest, src, n)  strxfrm(dest, src, n)
+#    ifdef USE_LOCALE_CTYPE
+
+    orig_CTYPE_locale = toggle_locale_c(LC_CTYPE, PL_collation_name);
+
+#      define CLEANUP_STRXFRM                                           \
+                restore_toggled_locale_c(LC_CTYPE, orig_CTYPE_locale)
+#    else
+#      define CLEANUP_STRXFRM  NOOP
+#    endif
+#  endif
+
     /* Then the transformation of the input.  We loop until successful, or we
      * give up */
     for (;;) {
 
-        *xlen = strxfrm(xbuf + COLLXFRM_HDR_LEN, s, xAlloc - COLLXFRM_HDR_LEN);
+        errno = 0;
+        *xlen = my_strxfrm(xbuf + COLLXFRM_HDR_LEN, s, xAlloc - COLLXFRM_HDR_LEN);
 
         /* If the transformed string occupies less space than we told strxfrm()
-         * was available, it means it successfully transformed the whole
-         * string. */
+         * was available, it means it transformed the whole string. */
         if (*xlen < xAlloc - COLLXFRM_HDR_LEN) {
 
-            /* Some systems include a trailing NUL in the returned length.
-             * Ignore it, using a loop in case multiple trailing NULs are
-             * returned. */
+            /* But there still could have been a problem */
+            if (errno != 0) {
+                DEBUG_L(PerlIO_printf(Perl_debug_log,
+                       "strxfrm failed for LC_COLLATE=%s; errno=%d, input=%s\n",
+                       PL_collation_name, errno,
+                       _byte_dump_string((U8 *) s, len, 0)));
+                goto bad;
+            }
+
+            /* Here, the transformation was successful.  Some systems include a
+             * trailing NUL in the returned length.  Ignore it, using a loop in
+             * case multiple trailing NULs are returned. */
             while (   (*xlen) > 0
                    && *(xbuf + COLLXFRM_HDR_LEN + (*xlen) - 1) == '\0')
             {
@@ -4223,9 +6286,8 @@ Perl__mem_collxfrm(pTHX_ const char *input_string,
                                      : PL_collxfrm_mult;
 
                 DEBUG_Lv(PerlIO_printf(Perl_debug_log,
-                    "%s: %d: initial size of %zu bytes for a length "
+                    "initial size of %zu bytes for a length "
                     "%zu string was insufficient, %zu needed\n",
-                    __FILE__, __LINE__,
                     computed_guess, length_in_chars, needed));
 
                 /* If slope increased, use it, but discard this result for
@@ -4249,9 +6311,8 @@ Perl__mem_collxfrm(pTHX_ const char *input_string,
                     }
 
                     DEBUG_Lv(PerlIO_printf(Perl_debug_log,
-                        "%s: %d: slope is now %zu; was %zu, base "
+                                    "slope is now %zu; was %zu, base "
                         "is now %zu; was %zu\n",
-                        __FILE__, __LINE__,
                         PL_collxfrm_mult, old_m,
                         PL_collxfrm_base, old_b));
                 }
@@ -4260,9 +6321,7 @@ Perl__mem_collxfrm(pTHX_ const char *input_string,
                                         - computed_guess
                                         + PL_collxfrm_base;
                     DEBUG_Lv(PerlIO_printf(Perl_debug_log,
-                        "%s: %d: base is now %zu; was %zu\n",
-                        __FILE__, __LINE__,
-                        new_b, PL_collxfrm_base));
+                        "base is now %zu; was %zu\n", new_b, PL_collxfrm_base));
                     PL_collxfrm_base = new_b;
                 }
             }
@@ -4272,7 +6331,7 @@ Perl__mem_collxfrm(pTHX_ const char *input_string,
 
         if (UNLIKELY(*xlen >= PERL_INT_MAX)) {
             DEBUG_L(PerlIO_printf(Perl_debug_log,
-                  "_mem_collxfrm: Needed %zu bytes, max permissible is %u\n",
+                  "mem_collxfrm_: Needed %zu bytes, max permissible is %u\n",
                   *xlen, PERL_INT_MAX));
             goto bad;
         }
@@ -4298,45 +6357,29 @@ Perl__mem_collxfrm(pTHX_ const char *input_string,
             xAlloc += (xAlloc / 4) + 1;
             PL_strxfrm_is_behaved = FALSE;
 
-#  ifdef DEBUGGING
-
-            if (DEBUG_Lv_TEST || debug_initialization) {
-                PerlIO_printf(Perl_debug_log,
-                "_mem_collxfrm required more space than previously calculated"
-                " for locale %s, trying again with new guess=%zu+%zu\n",
+            DEBUG_Lv(PerlIO_printf(Perl_debug_log,
+                     "mem_collxfrm_ required more space than previously"
+                     " calculated for locale %s, trying again with new"
+                     " guess=%zu+%zu\n",
                 PL_collation_name,  COLLXFRM_HDR_LEN,
-                xAlloc - COLLXFRM_HDR_LEN);
-            }
-
-#  endif
-
+                     xAlloc - COLLXFRM_HDR_LEN));
         }
 
         Renew(xbuf, xAlloc, char);
         if (UNLIKELY(! xbuf)) {
             DEBUG_L(PerlIO_printf(Perl_debug_log,
-                      "_mem_collxfrm: Couldn't realloc %zu bytes\n", xAlloc));
+                      "mem_collxfrm_: Couldn't realloc %zu bytes\n", xAlloc));
             goto bad;
         }
 
         first_time = FALSE;
     }
 
+    CLEANUP_STRXFRM;
 
-#  ifdef DEBUGGING
-
-    if (DEBUG_Lv_TEST || debug_initialization) {
-
-        print_collxfrm_input_and_return(s, s + len, xlen, utf8);
-        PerlIO_printf(Perl_debug_log, "Its xfrm is:");
-        PerlIO_printf(Perl_debug_log, "%s\n",
-                      _byte_dump_string((U8 *) xbuf + COLLXFRM_HDR_LEN,
-                       *xlen, 1));
-    }
-
-#  endif
+    DEBUG_L(print_collxfrm_input_and_return(s, s + len, xbuf, *xlen, utf8));
 
-    /* Free up unneeded space; retain ehough for trailing NUL */
+    /* Free up unneeded space; retain enough for trailing NUL */
     Renew(xbuf, COLLXFRM_HDR_LEN + *xlen + 1, char);
 
     if (s != input_string) {
@@ -4347,13 +6390,8 @@ Perl__mem_collxfrm(pTHX_ const char *input_string,
 
   bad:
 
-#  ifdef DEBUGGING
-
-    if (DEBUG_Lv_TEST || debug_initialization) {
-        print_collxfrm_input_and_return(s, s + len, NULL, utf8);
-    }
-
-#  endif
+    CLEANUP_STRXFRM;
+    DEBUG_L(print_collxfrm_input_and_return(s, s + len, NULL, 0, utf8));
 
     Safefree(xbuf);
     if (s != input_string) {
@@ -4368,45 +6406,96 @@ Perl__mem_collxfrm(pTHX_ const char *input_string,
 
 STATIC void
 S_print_collxfrm_input_and_return(pTHX_
-                                  const char * const s,
-                                  const char * const e,
-                                  const STRLEN * const xlen,
+                                  const char * s,
+                                  const char * e,
+                                  const char * xbuf,
+                                  const STRLEN xlen,
                                   const bool is_utf8)
 {
 
     PERL_ARGS_ASSERT_PRINT_COLLXFRM_INPUT_AND_RETURN;
 
-    PerlIO_printf(Perl_debug_log, "_mem_collxfrm[%" UVuf "]: returning ",
-                                                        (UV)PL_collation_ix);
-    if (xlen) {
-        PerlIO_printf(Perl_debug_log, "%zu", *xlen);
-    }
-    else {
-        PerlIO_printf(Perl_debug_log, "NULL");
+    PerlIO_printf(Perl_debug_log,
+                  "mem_collxfrm_[ix %" UVuf "] for locale '%s':\n"
+                  "     input=%s\n    return=%s\n    return len=%zu\n",
+                  (UV) PL_collation_ix, PL_collation_name,
+                  get_displayable_string(s, e, is_utf8),
+                  ((xbuf == NULL)
+                   ? "(null)"
+                   : _byte_dump_string((U8 *) xbuf + COLLXFRM_HDR_LEN, xlen, 0)),
+                  xlen);
+}
+
+#  endif    /* DEBUGGING */
+
+SV *
+Perl_strxfrm(pTHX_ SV * src)
+{
+    PERL_ARGS_ASSERT_STRXFRM;
+
+    /* For use by POSIX::strxfrm().  If they differ, toggle LC_CTYPE to
+     * LC_COLLATE to avoid potential mojibake.
+     *
+     * If we can't calculate a collation, 'src' is instead returned, so that
+     * future comparisons will be by code point order */
+
+#  ifdef USE_LOCALE_CTYPE
+
+    const char * orig_ctype = toggle_locale_c(LC_CTYPE,
+                                              querylocale_c(LC_COLLATE));
+#  endif
+
+    SV * dst = src;
+    STRLEN dstlen;
+    STRLEN srclen;
+    const char *p = SvPV_const(src,srclen);
+    const U32 utf8_flag = SvUTF8(src);
+    char *d = mem_collxfrm_(p, srclen, &dstlen, cBOOL(utf8_flag));
+
+    assert(utf8_flag == 0 || utf8_flag == SVf_UTF8);
+
+    if (d != NULL) {
+        assert(dstlen > 0);
+        dst =newSVpvn_flags(d + COLLXFRM_HDR_LEN,
+                            dstlen, SVs_TEMP|utf8_flag);
+        Safefree(d);
     }
-    PerlIO_printf(Perl_debug_log, " for locale '%s', string='",
-                                                            PL_collation_name);
-    print_bytes_for_locale(s, e, is_utf8);
 
-    PerlIO_printf(Perl_debug_log, "'\n");
+#  ifdef USE_LOCALE_CTYPE
+
+    restore_toggled_locale_c(LC_CTYPE, orig_ctype);
+
+#  endif
+
+    return dst;
 }
 
-#  endif    /* DEBUGGING */
 #endif /* USE_LOCALE_COLLATE */
-#ifdef USE_LOCALE
-#  ifdef DEBUGGING
+#if  defined(DEBUGGING) || defined(USE_POSIX_2008_LOCALE)
 
-STATIC void
-S_print_bytes_for_locale(pTHX_
-                    const char * const s,
-                    const char * const e,
-                    const bool is_utf8)
+STATIC const char *
+S_get_displayable_string(pTHX_
+                         const char * const s,
+                         const char * const e,
+                         const bool is_utf8)
 {
+    PERL_ARGS_ASSERT_GET_DISPLAYABLE_STRING;
+
     const char * t = s;
     bool prev_was_printable = TRUE;
     bool first_time = TRUE;
+    char * ret;
+
+    if (e <= s) {
+        return "";
+    }
 
-    PERL_ARGS_ASSERT_PRINT_BYTES_FOR_LOCALE;
+    /* Worst case scenario: All are non-printable so have a blank between each.
+     * If UTF-8, all are the largest possible code point; otherwise all are a
+     * single byte.  '(2 + 1)'  is from each byte takes 2 characters to
+     * display, and a blank (or NUL for the final one) after it */
+    Newxz(ret, (e - s) * (2 + 1) * ((is_utf8) ? UVSIZE : 1), char);
+    SAVEFREEPV(ret);
 
     while (t < e) {
         UV cp = (is_utf8)
@@ -4414,720 +6503,153 @@ S_print_bytes_for_locale(pTHX_
                 : * (U8 *) t;
         if (isPRINT(cp)) {
             if (! prev_was_printable) {
-                PerlIO_printf(Perl_debug_log, " ");
+                my_strlcat(ret, " ", sizeof(ret));
+            }
+
+            /* Escape these to avoid any ambiguity */
+            if (cp == ' ' || cp == '\\') {
+                my_strlcat(ret, "\\", sizeof(ret));
             }
-            PerlIO_printf(Perl_debug_log, "%c", (U8) cp);
+            my_strlcat(ret, Perl_form(aTHX_ "%c", (U8) cp), sizeof(ret));
             prev_was_printable = TRUE;
         }
         else {
             if (! first_time) {
-                PerlIO_printf(Perl_debug_log, " ");
+                my_strlcat(ret, " ", sizeof(ret));
             }
-            PerlIO_printf(Perl_debug_log, "%02" UVXf, cp);
+            my_strlcat(ret, Perl_form(aTHX_ "%02" UVXf, cp), sizeof(ret));
             prev_was_printable = FALSE;
         }
         t += (is_utf8) ? UTF8SKIP(t) : 1;
         first_time = FALSE;
     }
+
+    return ret;
 }
 
-#  endif   /* #ifdef DEBUGGING */
+#endif
+#ifdef USE_LOCALE
 
 STATIC const char *
-S_switch_category_locale_to_template(pTHX_ const int switch_category, const int template_category, const char * template_locale)
+S_toggle_locale_i(pTHX_ const unsigned cat_index,
+                        const char * new_locale,
+                        const line_t caller_line)
 {
-    /* Changes the locale for LC_'switch_category" to that of
-     * LC_'template_category', if they aren't already the same.  If not NULL,
-     * 'template_locale' is the locale that 'template_category' is in.
+    /* Changes the locale for the category specified by 'index' to 'new_locale,
+     * if they aren't already the same.
      *
-     * Returns a copy of the name of the original locale for 'switch_category'
+     * Returns a copy of the name of the original locale for 'cat_index'
      * so can be switched back to with the companion function
-     * restore_switched_locale(),  (NULL if no restoral is necessary.) */
-
-    char * restore_to_locale = NULL;
-
-    if (switch_category == template_category) { /* No changes needed */
-        return NULL;
-    }
-
-    /* Find the original locale of the category we may need to change, so that
-     * it can be restored to later */
-    restore_to_locale = stdize_locale(savepv(do_setlocale_r(switch_category,
-                                                            NULL)));
-    if (! restore_to_locale) {
-        Perl_croak(aTHX_
-             "panic: %s: %d: Could not find current %s locale, errno=%d\n",
-                __FILE__, __LINE__, category_name(switch_category), errno);
-    }
-
-    /* If the locale of the template category wasn't passed in, find it now */
-    if (template_locale == NULL) {
-        template_locale = do_setlocale_r(template_category, NULL);
-        if (! template_locale) {
-            Perl_croak(aTHX_
-             "panic: %s: %d: Could not find current %s locale, errno=%d\n",
-                   __FILE__, __LINE__, category_name(template_category), errno);
-        }
-    }
-
-    /* It the locales are the same, there's nothing to do */
-    if (strEQ(restore_to_locale, template_locale)) {
-        Safefree(restore_to_locale);
-
-        DEBUG_Lv(PerlIO_printf(Perl_debug_log, "%s locale unchanged as %s\n",
-                            category_name(switch_category), template_locale));
-
-        return NULL;
-    }
-
-    /* Finally, change the locale to the template one */
-    if (! do_setlocale_r(switch_category, template_locale)) {
-        Perl_croak(aTHX_
-         "panic: %s: %d: Could not change %s locale to %s, errno=%d\n",
-                            __FILE__, __LINE__, category_name(switch_category),
-                                                       template_locale, errno);
-    }
-
-    DEBUG_Lv(PerlIO_printf(Perl_debug_log, "%s locale switched to %s\n",
-                            category_name(switch_category), template_locale));
-
-    return restore_to_locale;
-}
-
-STATIC void
-S_restore_switched_locale(pTHX_ const int category, const char * const original_locale)
-{
-    /* Restores the locale for LC_'category' to 'original_locale' (which is a
-     * copy that will be freed by this function), or do nothing if the latter
-     * parameter is NULL */
-
-    if (original_locale == NULL) {
-        return;
-    }
-
-    if (! do_setlocale_r(category, original_locale)) {
-        Perl_croak(aTHX_
-             "panic: %s: %d: setlocale %s restore to %s failed, errno=%d\n",
-                 __FILE__, __LINE__,
-                             category_name(category), original_locale, errno);
-    }
-
-    Safefree(original_locale);
-}
-
-/* is_cur_LC_category_utf8 uses a small char buffer to avoid malloc/free */
-#define CUR_LC_BUFFER_SIZE  64
-
-bool
-Perl__is_cur_LC_category_utf8(pTHX_ int category)
-{
-    /* Returns TRUE if the current locale for 'category' is UTF-8; FALSE
-     * otherwise. 'category' may not be LC_ALL.  If the platform doesn't have
-     * nl_langinfo(), nor MB_CUR_MAX, this employs a heuristic, which hence
-     * could give the wrong result.  The result will very likely be correct for
-     * languages that have commonly used non-ASCII characters, but for notably
-     * English, it comes down to if the locale's name ends in something like
-     * "UTF-8".  It errs on the side of not being a UTF-8 locale.
-     *
-     * If the platform is early C89, not containing mbtowc(), or we are
-     * compiled to not pay attention to LC_CTYPE, this employs heuristics.
-     * These work very well for non-Latin locales or those whose currency
-     * symbol isn't a '$' nor plain ASCII text.  But without LC_CTYPE and at
-     * least MB_CUR_MAX, English locales with an ASCII currency symbol depend
-     * on the name containing UTF-8 or not. */
-
-    /* Name of current locale corresponding to the input category */
-    const char *save_input_locale = NULL;
+     * restore_toggled_locale_i(),  (NULL if no restoral is necessary.) */
 
-    bool is_utf8 = FALSE;                /* The return value */
-
-    /* The variables below are for the cache of previous lookups using this
-     * function.  The cache is a C string, described at the definition for
-     * 'C_and_POSIX_utf8ness'.
-     *
-     * The first part of the cache is fixed, for the C and POSIX locales.  The
-     * varying part starts just after them. */
-    char * utf8ness_cache = PL_locale_utf8ness + STRLENs(C_and_POSIX_utf8ness);
-
-    Size_t utf8ness_cache_size; /* Size of the varying portion */
-    Size_t input_name_len;      /* Length in bytes of save_input_locale */
-    Size_t input_name_len_with_overhead;    /* plus extra chars used to store
-                                               the name in the cache */
-    char * delimited;           /* The name plus the delimiters used to store
-                                   it in the cache */
-    char buffer[CUR_LC_BUFFER_SIZE];        /* small buffer */
-    char * name_pos;            /* position of 'delimited' in the cache, or 0
-                                   if not there */
-
-
-#  ifdef LC_ALL
-
-    assert(category != LC_ALL);
-
-#  endif
-
-    /* Get the desired category's locale */
-    save_input_locale = stdize_locale(savepv(do_setlocale_r(category, NULL)));
-    if (! save_input_locale) {
-        Perl_croak(aTHX_
-             "panic: %s: %d: Could not find current %s locale, errno=%d\n",
-                     __FILE__, __LINE__, category_name(category), errno);
-    }
-
-    DEBUG_L(PerlIO_printf(Perl_debug_log,
-                          "Current locale for %s is %s\n",
-                          category_name(category), save_input_locale));
-
-    input_name_len = strlen(save_input_locale);
-
-    /* In our cache, each name is accompanied by two delimiters and a single
-     * utf8ness digit */
-    input_name_len_with_overhead = input_name_len + 3;
-
-    if ( input_name_len_with_overhead <= CUR_LC_BUFFER_SIZE ) {
-        /* we can use the buffer, avoid a malloc */
-        delimited = buffer;
-    } else { /* need a malloc */
-        /* Allocate and populate space for a copy of the name surrounded by the
-         * delimiters */
-        Newx(delimited, input_name_len_with_overhead, char);
-    }
-
-    delimited[0] = UTF8NESS_SEP[0];
-    Copy(save_input_locale, delimited + 1, input_name_len, char);
-    delimited[input_name_len+1] = UTF8NESS_PREFIX[0];
-    delimited[input_name_len+2] = '\0';
-
-    /* And see if that is in the cache */
-    name_pos = instr(PL_locale_utf8ness, delimited);
-    if (name_pos) {
-        is_utf8 = *(name_pos + input_name_len_with_overhead - 1) - '0';
-
-#  ifdef DEBUGGING
-
-        if (DEBUG_Lv_TEST || debug_initialization) {
-            PerlIO_printf(Perl_debug_log, "UTF8ness for locale %s=%d, \n",
-                                          save_input_locale, is_utf8);
-        }
-
-#  endif
-
-        /* And, if not already in that position, move it to the beginning of
-         * the non-constant portion of the list, since it is the most recently
-         * used.  (We don't have to worry about overflow, since just moving
-         * existing names around) */
-        if (name_pos > utf8ness_cache) {
-            Move(utf8ness_cache,
-                 utf8ness_cache + input_name_len_with_overhead,
-                 name_pos - utf8ness_cache, char);
-            Copy(delimited,
-                 utf8ness_cache,
-                 input_name_len_with_overhead - 1, char);
-            utf8ness_cache[input_name_len_with_overhead - 1] = is_utf8 + '0';
-        }
-
-        /* free only when not using the buffer */
-        if ( delimited != buffer ) Safefree(delimited);
-        Safefree(save_input_locale);
-        return is_utf8;
-    }
-
-    /* Here we don't have stored the utf8ness for the input locale.  We have to
-     * calculate it */
-
-#  if        defined(USE_LOCALE_CTYPE)                                  \
-     && (    defined(HAS_NL_LANGINFO)                                   \
-         || (defined(HAS_MBTOWC) || defined(HAS_MBRTOWC)))
-
-    {
-        const char *original_ctype_locale
-                        = switch_category_locale_to_template(LC_CTYPE,
-                                                             category,
-                                                             save_input_locale);
-
-        /* Here the current LC_CTYPE is set to the locale of the category whose
-         * information is desired.  This means that nl_langinfo() and mbtowc()
-         * should give the correct results */
-
-#    ifdef MB_CUR_MAX  /* But we can potentially rule out UTF-8ness, avoiding
-                          calling the functions if we have this */
-
-            /* Standard UTF-8 needs at least 4 bytes to represent the maximum
-             * Unicode code point. */
-
-            DEBUG_L(PerlIO_printf(Perl_debug_log, "%s: %d: MB_CUR_MAX=%d\n",
-                                       __FILE__, __LINE__, (int) MB_CUR_MAX));
-            if ((unsigned) MB_CUR_MAX < STRLENs(MAX_UNICODE_UTF8)) {
-                is_utf8 = FALSE;
-                restore_switched_locale(LC_CTYPE, original_ctype_locale);
-                goto finish_and_return;
-            }
-
-#    endif
-#    if defined(HAS_NL_LANGINFO)
-
-        { /* The task is easiest if the platform has this POSIX 2001 function.
-             Except on some platforms it can wrongly return "", so have to have
-             a fallback.  And it can return that it's UTF-8, even if there are
-             variances from that.  For example, Turkish locales may use the
-             alternate dotted I rules, and sometimes it appears to be a
-             defective locale definition.  XXX We should probably check for
-             these in the Latin1 range and warn (but on glibc, requires
-             iswalnum() etc. due to their not handling 80-FF correctly */
-            const char *codeset = my_nl_langinfo(CODESET, FALSE);
-                                          /* FALSE => already in dest locale */
-
-            DEBUG_Lv(PerlIO_printf(Perl_debug_log,
-                            "\tnllanginfo returned CODESET '%s'\n", codeset));
-
-            if (codeset && strNE(codeset, "")) {
-
-                              /* If the implementation of foldEQ() somehow were
-                               * to change to not go byte-by-byte, this could
-                               * read past end of string, as only one length is
-                               * checked.  But currently, a premature NUL will
-                               * compare false, and it will stop there */
-                is_utf8 = cBOOL(   foldEQ(codeset, STR_WITH_LEN("UTF-8"))
-                                || foldEQ(codeset, STR_WITH_LEN("UTF8")));
-
-                DEBUG_L(PerlIO_printf(Perl_debug_log,
-                       "\tnllanginfo returned CODESET '%s'; ?UTF8 locale=%d\n",
-                                                     codeset,         is_utf8));
-                restore_switched_locale(LC_CTYPE, original_ctype_locale);
-                goto finish_and_return;
-            }
-        }
-
-#    endif
-#    if defined(HAS_MBTOWC) || defined(HAS_MBRTOWC)
-     /* We can see if this is a UTF-8-like locale if have mbtowc().  It was a
-      * late adder to C89, so very likely to have it.  However, testing has
-      * shown that, like nl_langinfo() above, there are locales that are not
-      * strictly UTF-8 that this will return that they are */
-
-        {
-            wchar_t wc;
-            int len;
-            dSAVEDERRNO;
-
-#      if defined(HAS_MBRTOWC) && defined(USE_ITHREADS)
-
-            mbstate_t ps;
-
-#      endif
-
-            /* mbrtowc() and mbtowc() convert a byte string to a wide
-             * character.  Feed a byte string to one of them and check that the
-             * result is the expected Unicode code point */
-
-#      if defined(HAS_MBRTOWC) && defined(USE_ITHREADS)
-            /* Prefer this function if available, as it's reentrant */
-
-            memzero(&ps, sizeof(ps));;
-            PERL_UNUSED_RESULT(mbrtowc(&wc, NULL, 0, &ps)); /* Reset any shift
-                                                               state */
-            SETERRNO(0, 0);
-            len = mbrtowc(&wc, STR_WITH_LEN(REPLACEMENT_CHARACTER_UTF8), &ps);
-            SAVE_ERRNO;
-
-#      else
-
-            MBTOWC_LOCK;
-            PERL_UNUSED_RESULT(mbtowc(&wc, NULL, 0));/* Reset any shift state */
-            SETERRNO(0, 0);
-            len = mbtowc(&wc, STR_WITH_LEN(REPLACEMENT_CHARACTER_UTF8));
-            SAVE_ERRNO;
-            MBTOWC_UNLOCK;
-
-#      endif
-
-            RESTORE_ERRNO;
-            DEBUG_Lv(PerlIO_printf(Perl_debug_log,
-                    "\treturn from mbtowc; len=%d; code_point=%x; errno=%d\n",
-                                   len,      (unsigned int) wc, GET_ERRNO));
-
-            is_utf8 = cBOOL(   len == STRLENs(REPLACEMENT_CHARACTER_UTF8)
-                            && wc == (wchar_t) UNICODE_REPLACEMENT);
-        }
-
-#    endif
-
-        restore_switched_locale(LC_CTYPE, original_ctype_locale);
-        goto finish_and_return;
-    }
-
-#  else
-
-        /* Here, we must have a C89 compiler that doesn't have mbtowc().  Next
-         * try looking at the currency symbol to see if it disambiguates
-         * things.  Often that will be in the native script, and if the symbol
-         * isn't in UTF-8, we know that the locale isn't.  If it is non-ASCII
-         * UTF-8, we infer that the locale is too, as the odds of a non-UTF8
-         * string being valid UTF-8 are quite small */
-
-#    ifdef USE_LOCALE_MONETARY
-
-        /* If have LC_MONETARY, we can look at the currency symbol.  Often that
-         * will be in the native script.  We do this one first because there is
-         * just one string to examine, so potentially avoids work */
-
-        {
-            const char *original_monetary_locale
-                        = switch_category_locale_to_template(LC_MONETARY,
-                                                             category,
-                                                             save_input_locale);
-            bool only_ascii = FALSE;
-            const U8 * currency_string
-                            = (const U8 *) my_nl_langinfo(CRNCYSTR, FALSE);
-                                      /* 2nd param not relevant for this item */
-            const U8 * first_variant;
-
-            assert(   *currency_string == '-'
-                   || *currency_string == '+'
-                   || *currency_string == '.');
-
-            currency_string++;
-
-            if (is_utf8_invariant_string_loc(currency_string, 0, &first_variant))
-            {
-                DEBUG_L(PerlIO_printf(Perl_debug_log, "Couldn't get currency symbol for %s, or contains only ASCII; can't use for determining if UTF-8 locale\n", save_input_locale));
-                only_ascii = TRUE;
-            }
-            else {
-                is_utf8 = is_strict_utf8_string(first_variant, 0);
-            }
-
-            restore_switched_locale(LC_MONETARY, original_monetary_locale);
-
-            if (! only_ascii) {
-
-                /* It isn't a UTF-8 locale if the symbol is not legal UTF-8;
-                 * otherwise assume the locale is UTF-8 if and only if the symbol
-                 * is non-ascii UTF-8. */
-                DEBUG_Lv(PerlIO_printf(Perl_debug_log, "\t?Currency symbol for %s is UTF-8=%d\n",
-                                        save_input_locale, is_utf8));
-                goto finish_and_return;
-            }
-        }
-
-#    endif /* USE_LOCALE_MONETARY */
-#    if defined(HAS_STRFTIME) && defined(USE_LOCALE_TIME)
-
-    /* Still haven't found a non-ASCII string to disambiguate UTF-8 or not.  Try
-     * the names of the months and weekdays, timezone, and am/pm indicator */
-        {
-            const char *original_time_locale
-                            = switch_category_locale_to_template(LC_TIME,
-                                                                 category,
-                                                                 save_input_locale);
-            int hour = 10;
-            bool is_dst = FALSE;
-            int dom = 1;
-            int month = 0;
-            int i;
-            char * formatted_time;
-
-            /* Here the current LC_TIME is set to the locale of the category
-             * whose information is desired.  Look at all the days of the week and
-             * month names, and the timezone and am/pm indicator for UTF-8 variant
-             * characters.  The first such a one found will tell us if the locale
-             * is UTF-8 or not */
-
-            for (i = 0; i < 7 + 12; i++) {  /* 7 days; 12 months */
-                formatted_time = my_strftime("%A %B %Z %p",
-                                0, 0, hour, dom, month, 2012 - 1900, 0, 0, is_dst);
-                if ( ! formatted_time
-                    || is_utf8_invariant_string((U8 *) formatted_time, 0))
-                {
-
-                    /* Here, we didn't find a non-ASCII.  Try the next time through
-                     * with the complemented dst and am/pm, and try with the next
-                     * weekday.  After we have gotten all weekdays, try the next
-                     * month */
-                    is_dst = ! is_dst;
-                    hour = (hour + 12) % 24;
-                    dom++;
-                    if (i > 6) {
-                        month++;
-                    }
-                    continue;
-                }
-
-                /* Here, we have a non-ASCII.  Return TRUE is it is valid UTF8;
-                 * false otherwise.  But first, restore LC_TIME to its original
-                 * locale if we changed it */
-                restore_switched_locale(LC_TIME, original_time_locale);
-
-                DEBUG_Lv(PerlIO_printf(Perl_debug_log, "\t?time-related strings for %s are UTF-8=%d\n",
-                                    save_input_locale,
-                                    is_utf8_string((U8 *) formatted_time, 0)));
-                is_utf8 = is_utf8_string((U8 *) formatted_time, 0);
-                goto finish_and_return;
-            }
-
-            /* Falling off the end of the loop indicates all the names were just
-             * ASCII.  Go on to the next test.  If we changed it, restore LC_TIME
-             * to its original locale */
-            restore_switched_locale(LC_TIME, original_time_locale);
-            DEBUG_Lv(PerlIO_printf(Perl_debug_log, "All time-related words for %s contain only ASCII; can't use for determining if UTF-8 locale\n", save_input_locale));
-        }
-
-#    endif
-
-#    if 0 && defined(USE_LOCALE_MESSAGES) && defined(HAS_SYS_ERRLIST)
-
-    /* This code is ifdefd out because it was found to not be necessary in testing
-     * on our dromedary test machine, which has over 700 locales.  There, this
-     * added no value to looking at the currency symbol and the time strings.  I
-     * left it in so as to avoid rewriting it if real-world experience indicates
-     * that dromedary is an outlier.  Essentially, instead of returning abpve if we
-     * haven't found illegal utf8, we continue on and examine all the strerror()
-     * messages on the platform for utf8ness.  If all are ASCII, we still don't
-     * know the answer; but otherwise we have a pretty good indication of the
-     * utf8ness.  The reason this doesn't help much is that the messages may not
-     * have been translated into the locale.  The currency symbol and time strings
-     * are much more likely to have been translated.  */
-        {
-            int e;
-            bool non_ascii = FALSE;
-            const char *original_messages_locale
-                            = switch_category_locale_to_template(LC_MESSAGES,
-                                                                 category,
-                                                                 save_input_locale);
-            const char * errmsg = NULL;
-
-            /* Here the current LC_MESSAGES is set to the locale of the category
-             * whose information is desired.  Look through all the messages.  We
-             * can't use Strerror() here because it may expand to code that
-             * segfaults in miniperl */
-
-            for (e = 0; e <= sys_nerr; e++) {
-                errno = 0;
-                errmsg = sys_errlist[e];
-                if (errno || !errmsg) {
-                    break;
-                }
-                errmsg = savepv(errmsg);
-                if (! is_utf8_invariant_string((U8 *) errmsg, 0)) {
-                    non_ascii = TRUE;
-                    is_utf8 = is_utf8_string((U8 *) errmsg, 0);
-                    break;
-                }
-            }
-            Safefree(errmsg);
-
-            restore_switched_locale(LC_MESSAGES, original_messages_locale);
-
-            if (non_ascii) {
-
-                /* Any non-UTF-8 message means not a UTF-8 locale; if all are valid,
-                 * any non-ascii means it is one; otherwise we assume it isn't */
-                DEBUG_Lv(PerlIO_printf(Perl_debug_log, "\t?error messages for %s are UTF-8=%d\n",
-                                    save_input_locale,
-                                    is_utf8));
-                goto finish_and_return;
-            }
-
-            DEBUG_L(PerlIO_printf(Perl_debug_log, "All error messages for %s contain only ASCII; can't use for determining if UTF-8 locale\n", save_input_locale));
-        }
-
-#    endif
-#    ifndef EBCDIC  /* On os390, even if the name ends with "UTF-8', it isn't a
-                   UTF-8 locale */
-
-    /* As a last resort, look at the locale name to see if it matches
-     * qr/UTF -?  * 8 /ix, or some other common locale names.  This "name", the
-     * return of setlocale(), is actually defined to be opaque, so we can't
-     * really rely on the absence of various substrings in the name to indicate
-     * its UTF-8ness, but if it has UTF8 in the name, it is extremely likely to
-     * be a UTF-8 locale.  Similarly for the other common names */
-
-    {
-        const Size_t final_pos = strlen(save_input_locale) - 1;
-
-        if (final_pos >= 3) {
-            const char *name = save_input_locale;
-
-            /* Find next 'U' or 'u' and look from there */
-            while ((name += strcspn(name, "Uu") + 1)
-                                        <= save_input_locale + final_pos - 2)
-            {
-                if (   isALPHA_FOLD_NE(*name, 't')
-                    || isALPHA_FOLD_NE(*(name + 1), 'f'))
-                {
-                    continue;
-                }
-                name += 2;
-                if (*(name) == '-') {
-                    if ((name > save_input_locale + final_pos - 1)) {
-                        break;
-                    }
-                    name++;
-                }
-                if (*(name) == '8') {
-                    DEBUG_L(PerlIO_printf(Perl_debug_log,
-                                        "Locale %s ends with UTF-8 in name\n",
-                                        save_input_locale));
-                    is_utf8 = TRUE;
-                    goto finish_and_return;
-                }
-            }
-            DEBUG_L(PerlIO_printf(Perl_debug_log,
-                                "Locale %s doesn't end with UTF-8 in name\n",
-                                    save_input_locale));
-        }
+    const char * locale_to_restore_to = NULL;
 
-#      ifdef WIN32
+    PERL_ARGS_ASSERT_TOGGLE_LOCALE_I;
+    assert(cat_index <= NOMINAL_LC_ALL_INDEX);
 
-        /* http://msdn.microsoft.com/en-us/library/windows/desktop/dd317756.aspx */
-        if (memENDs(save_input_locale, final_pos, "65001")) {
-            DEBUG_L(PerlIO_printf(Perl_debug_log,
-                        "Locale %s ends with 65001 in name, is UTF-8 locale\n",
-                        save_input_locale));
-            is_utf8 = TRUE;
-            goto finish_and_return;
-        }
+    /* Find the original locale of the category we may need to change, so that
+     * it can be restored to later */
 
-#      endif
+    locale_to_restore_to = querylocale_i(cat_index);
+
+    DEBUG_Lv(PerlIO_printf(Perl_debug_log,
+             "(%" LINE_Tf "): toggle_locale_i: index=%d(%s), wanted=%s,"
+             " actual=%s\n",
+             caller_line, cat_index, category_names[cat_index],
+             new_locale, locale_to_restore_to));
+
+    if (! locale_to_restore_to) {
+        locale_panic_(Perl_form(aTHX_
+                                "Could not find current %s locale, errno=%d",
+                                category_names[cat_index], errno));
     }
-#    endif
 
-    /* Other common encodings are the ISO 8859 series, which aren't UTF-8.  But
-     * since we are about to return FALSE anyway, there is no point in doing
-     * this extra work */
+    /* If the locales are the same, there's nothing to do */
+    if (strEQ(locale_to_restore_to, new_locale)) {
+        DEBUG_Lv(PerlIO_printf(Perl_debug_log,
+                               "(%" LINE_Tf "): %s locale unchanged as %s\n",
+                               caller_line, category_names[cat_index],
+                               new_locale));
 
-#    if 0
-    if (instr(save_input_locale, "8859")) {
-        DEBUG_L(PerlIO_printf(Perl_debug_log,
-                             "Locale %s has 8859 in name, not UTF-8 locale\n",
-                             save_input_locale));
-        is_utf8 = FALSE;
-        goto finish_and_return;
+        return NULL;
     }
-#    endif
 
-    DEBUG_L(PerlIO_printf(Perl_debug_log,
-                          "Assuming locale %s is not a UTF-8 locale\n",
-                                    save_input_locale));
-    is_utf8 = FALSE;
+    /* Finally, change the locale to the new one */
+    void_setlocale_i(cat_index, new_locale);
+
+    DEBUG_Lv(PerlIO_printf(Perl_debug_log,
+                           "(%" LINE_Tf "): %s locale switched to %s\n",
+                           caller_line, category_names[cat_index], new_locale));
 
-#  endif /* the code that is compiled when no modern LC_CTYPE */
+    return locale_to_restore_to;
 
-  finish_and_return:
+#  ifndef DEBUGGING
+    PERL_UNUSED_ARG(caller_line);
+#  endif
 
-    /* Cache this result so we don't have to go through all this next time. */
-    utf8ness_cache_size = sizeof(PL_locale_utf8ness)
-                       - (utf8ness_cache - PL_locale_utf8ness);
+}
 
-    /* But we can't save it if it is too large for the total space available */
-    if (LIKELY(input_name_len_with_overhead < utf8ness_cache_size)) {
-        Size_t utf8ness_cache_len = strlen(utf8ness_cache);
+STATIC void
+S_restore_toggled_locale_i(pTHX_ const unsigned int cat_index,
+                                 const char * restore_locale,
+                                 const line_t caller_line)
+{
+    /* Restores the locale for LC_category corresponding to cat_indes to
+     * 'restore_locale' (which is a copy that will be freed by this function),
+     * or do nothing if the latter parameter is NULL */
 
-        /* Here it can fit, but we may need to clear out the oldest cached
-         * result(s) to do so.  Check */
-        if (utf8ness_cache_len + input_name_len_with_overhead
-                                                        >= utf8ness_cache_size)
-        {
-            /* Here we have to clear something out to make room for this.
-             * Start looking at the rightmost place where it could fit and find
-             * the beginning of the entry that extends past that. */
-            char * cutoff = (char *) my_memrchr(utf8ness_cache,
-                                                UTF8NESS_SEP[0],
-                                                utf8ness_cache_size
-                                              - input_name_len_with_overhead);
-
-            assert(cutoff);
-            assert(cutoff >= utf8ness_cache);
-
-            /* This and all subsequent entries must be removed */
-            *cutoff = '\0';
-            utf8ness_cache_len = strlen(utf8ness_cache);
-        }
+    PERL_ARGS_ASSERT_RESTORE_TOGGLED_LOCALE_I;
+    assert(cat_index <= NOMINAL_LC_ALL_INDEX);
 
-        /* Make space for the new entry */
-        Move(utf8ness_cache,
-             utf8ness_cache + input_name_len_with_overhead,
-             utf8ness_cache_len + 1 /* Incl. trailing NUL */, char);
-
-        /* And insert it */
-        Copy(delimited, utf8ness_cache, input_name_len_with_overhead - 1, char);
-        utf8ness_cache[input_name_len_with_overhead - 1] = is_utf8 + '0';
-
-        if ((PL_locale_utf8ness[strlen(PL_locale_utf8ness)-1] & ~1) != '0') {
-            Perl_croak(aTHX_
-             "panic: %s: %d: Corrupt utf8ness_cache=%s\nlen=%zu,"
-             " inserted_name=%s, its_len=%zu\n",
-                __FILE__, __LINE__,
-                PL_locale_utf8ness, strlen(PL_locale_utf8ness),
-                delimited, input_name_len_with_overhead);
-        }
+    if (restore_locale == NULL) {
+        DEBUG_Lv(PerlIO_printf(Perl_debug_log,
+                               "(%" LINE_Tf "): No need to restore %s\n",
+                               caller_line, category_names[cat_index]));
+        return;
     }
 
-#  ifdef DEBUGGING
+    DEBUG_Lv(PerlIO_printf(Perl_debug_log,
+                           "(%" LINE_Tf "): %s restoring locale to %s\n",
+                           caller_line, category_names[cat_index],
+                           restore_locale));
 
-    if (DEBUG_Lv_TEST) {
-        const char * s = PL_locale_utf8ness;
+    void_setlocale_i(cat_index, restore_locale);
 
-        /* Audit the structure */
-        while (s < PL_locale_utf8ness + strlen(PL_locale_utf8ness)) {
-            const char *e;
+#  ifndef DEBUGGING
+    PERL_UNUSED_ARG(caller_line);
+#  endif
 
-            if (*s != UTF8NESS_SEP[0]) {
-                Perl_croak(aTHX_
-                           "panic: %s: %d: Corrupt utf8ness_cache: missing"
-                           " separator %.*s<-- HERE %s\n",
-                           __FILE__, __LINE__,
-                           (int) (s - PL_locale_utf8ness), PL_locale_utf8ness,
-                           s);
-            }
-            s++;
-            e = strchr(s, UTF8NESS_PREFIX[0]);
-            if (! e) {
-                e = PL_locale_utf8ness + strlen(PL_locale_utf8ness);
-                Perl_croak(aTHX_
-                           "panic: %s: %d: Corrupt utf8ness_cache: missing"
-                           " separator %.*s<-- HERE %s\n",
-                           __FILE__, __LINE__,
-                           (int) (e - PL_locale_utf8ness), PL_locale_utf8ness,
-                           e);
-            }
-            e++;
-            if (*e != '0' && *e != '1') {
-                Perl_croak(aTHX_
-                           "panic: %s: %d: Corrupt utf8ness_cache: utf8ness"
-                           " must be [01] %.*s<-- HERE %s\n",
-                           __FILE__, __LINE__,
-                           (int) (e + 1 - PL_locale_utf8ness),
-                           PL_locale_utf8ness, e + 1);
-            }
-            if (ninstr(PL_locale_utf8ness, s, s-1, e)) {
-                Perl_croak(aTHX_
-                           "panic: %s: %d: Corrupt utf8ness_cache: entry"
-                           " has duplicate %.*s<-- HERE %s\n",
-                           __FILE__, __LINE__,
-                           (int) (e - PL_locale_utf8ness), PL_locale_utf8ness,
-                           e);
-            }
-            s = e + 1;
-        }
-    }
+}
 
-    if (DEBUG_Lv_TEST || debug_initialization) {
+#  ifdef USE_LOCALE_CTYPE
 
-        PerlIO_printf(Perl_debug_log,
-                "PL_locale_utf8ness is now %s; returning %d\n",
-                                     PL_locale_utf8ness, is_utf8);
-    }
+STATIC bool
+S_is_codeset_name_UTF8(const char * name)
+{
+    /* Return a boolean as to if the passed-in name indicates it is a UTF-8
+     * code set.  Several variants are possible */
+    const Size_t len = strlen(name);
 
-#  endif
+    PERL_ARGS_ASSERT_IS_CODESET_NAME_UTF8;
 
-    /* free only when not using the buffer */
-    if ( delimited != buffer ) Safefree(delimited);
-    Safefree(save_input_locale);
-    return is_utf8;
+#    ifdef WIN32
+
+    /* http://msdn.microsoft.com/en-us/library/windows/desktop/dd317756.aspx */
+    if (memENDs(name, len, "65001")) {
+        return TRUE;
+    }
+
+#    endif
+               /* 'UTF8' or 'UTF-8' */
+    return (    inRANGE(len, 4, 5)
+            &&  name[len-1] == '8'
+            && (   memBEGINs(name, len, "UTF")
+                || memBEGINs(name, len, "utf"))
+            && (len == 4 || name[3] == '-'));
 }
 
-#endif
+#  endif
+#endif  /* USE_LOCALE */
 
 bool
 Perl__is_in_locale_category(pTHX_ const bool compiling, const int category)
@@ -5149,197 +6671,285 @@ Perl__is_in_locale_category(pTHX_ const bool compiling, const int category)
     return cBOOL(SvUV(these_categories) & (1U << (category + 1)));
 }
 
-char *
-Perl_my_strerror(pTHX_ const int errnum)
+/* my_strerror() returns a mortalized copy of the text of the error message
+ * associated with 'errnum'.
+ *
+ * If not called from within the scope of 'use locale', it uses the text from
+ * the C locale.  If Perl is compiled to not pay attention to LC_CTYPE nor
+ * LC_MESSAGES, it uses whatever strerror() returns.  Otherwise the text is
+ * derived from the locale, LC_MESSAGES if we have that; LC_CTYPE if not.
+ *
+ * It returns in *utf8ness the result's UTF-8ness
+ *
+ * The function just calls strerror(), but temporarily switches locales, if
+ * needed.  Many platforms require LC_CTYPE and LC_MESSAGES to be in the same
+ * CODESET in order for the return from strerror() to not contain '?' symbols,
+ * or worse, mojibaked.  It's cheaper to just use the stricter criteria of
+ * being in the same locale.  So the code below uses a common locale for both
+ * categories.  Again, that is C if not within 'use locale' scope; or the
+ * LC_MESSAGES locale if in scope and we have that category; and LC_CTYPE if we
+ * don't have LC_MESSAGES; and whatever strerror returns if we don't have
+ * either category.
+ *
+ * There are two sets of implementations.  The first below is if we have
+ * strerror_l().  This is the simpler.  We just use the already-built C locale
+ * object if not in locale scope, or build up a custom one otherwise.
+ *
+ * When strerror_l() is not available, we may have to swap locales temporarily
+ * to bring the two categories into sync with each other, and possibly to the C
+ * locale.
+ *
+ * Because the prepropessing directives to conditionally compile this function
+ * would greatly obscure the logic of the various implementations, the whole
+ * function is repeated for each configuration, with some common macros. */
+
+/* Used to shorten the definitions of the following implementations of
+ * my_strerror() */
+#define DEBUG_STRERROR_ENTER(errnum, in_locale)                             \
+    DEBUG_Lv(PerlIO_printf(Perl_debug_log,                                  \
+                           "my_strerror called with errnum %d;"             \
+                           " Within locale scope=%d\n",                     \
+                           errnum, in_locale))
+#define DEBUG_STRERROR_RETURN(errstr, utf8ness)                             \
+    DEBUG_Lv(PerlIO_printf(Perl_debug_log,                                  \
+                           "Strerror returned; saving a copy: '%s';"        \
+                           " utf8ness=%d\n",                                \
+                           get_displayable_string(errstr,                   \
+                                                  errstr + strlen(errstr),  \
+                                                  *utf8ness),               \
+                           (int) *utf8ness))
+
+/* On platforms that have precisely one of these categories (Windows
+ * qualifies), these yield the correct one */
+#if defined(USE_LOCALE_CTYPE)
+#  define WHICH_LC_INDEX LC_CTYPE_INDEX_
+#elif defined(USE_LOCALE_MESSAGES)
+#  define WHICH_LC_INDEX LC_MESSAGES_INDEX_
+#endif
+
+/*==========================================================================*/
+/* First set of implementations, when have strerror_l() */
+
+#if defined(USE_POSIX_2008_LOCALE) && defined(HAS_STRERROR_L)
+
+#  if ! defined(USE_LOCALE_CTYPE) && ! defined(USE_LOCALE_MESSAGES)
+
+/* Here, neither category is defined: use the C locale */
+const char *
+Perl_my_strerror(pTHX_ const int errnum, utf8ness_t * utf8ness)
 {
-    /* Returns a mortalized copy of the text of the error message associated
-     * with 'errnum'.  It uses the current locale's text unless the platform
-     * doesn't have the LC_MESSAGES category or we are not being called from
-     * within the scope of 'use locale'.  In the former case, it uses whatever
-     * strerror returns; in the latter case it uses the text from the C locale.
-     *
-     * The function just calls strerror(), but temporarily switches, if needed,
-     * to the C locale */
+    PERL_ARGS_ASSERT_MY_STRERROR;
+
+    DEBUG_STRERROR_ENTER(errnum, 0);
+
+    const char *errstr = savepv(strerror_l(errnum, PL_C_locale_obj));
+    *utf8ness = UTF8NESS_IMMATERIAL;
+
+    DEBUG_STRERROR_RETURN(errstr, utf8ness);
 
-    char *errstr;
+    SAVEFREEPV(errstr);
+    return errstr;
+}
 
-#ifndef USE_LOCALE_MESSAGES
+#  elif ! defined(USE_LOCALE_CTYPE) || ! defined(USE_LOCALE_MESSAGES)
 
-    /* If platform doesn't have messages category, we don't do any switching to
-     * the C locale; we just use whatever strerror() returns */
+/*--------------------------------------------------------------------------*/
 
-    errstr = savepv(Strerror(errnum));
+/* Here one or the other of CTYPE or MESSAGES is defined, but not both.  If we
+ * are not within 'use locale' scope of the only one defined, we use the C
+ * locale; otherwise use the current locale object */
 
-#else   /* Has locale messages */
+const char *
+Perl_my_strerror(pTHX_ const int errnum, utf8ness_t * utf8ness)
+{
+    PERL_ARGS_ASSERT_MY_STRERROR;
 
-    const bool within_locale_scope = IN_LC(LC_MESSAGES);
+    DEBUG_STRERROR_ENTER(errnum, IN_LC(categories[WHICH_LC_INDEX]));
 
-#  ifndef USE_ITHREADS
+    /* Use C if not within locale scope;  Otherwise, use current locale */
+    const locale_t which_obj = (IN_LC(categories[WHICH_LC_INDEX]))
+                               ? PL_C_locale_obj
+                               : use_curlocale_scratch();
 
-    /* This function is trivial without threads. */
-    if (within_locale_scope) {
-        errstr = savepv(strerror(errnum));
-    }
-    else {
-        const char * save_locale = savepv(do_setlocale_c(LC_MESSAGES, NULL));
+    const char *errstr = savepv(strerror_l(errnum, which_obj));
+    *utf8ness = get_locale_string_utf8ness_i(errstr, LOCALE_UTF8NESS_UNKNOWN,
+                                             NULL, WHICH_LC_INDEX);
+    DEBUG_STRERROR_RETURN(errstr, utf8ness);
 
-        do_setlocale_c(LC_MESSAGES, "C");
-        errstr = savepv(strerror(errnum));
-        do_setlocale_c(LC_MESSAGES, save_locale);
-        Safefree(save_locale);
-    }
+    SAVEFREEPV(errstr);
+    return errstr;
+}
 
-#  elif   defined(USE_POSIX_2008_LOCALE)                      \
-     &&   defined(HAS_STRERROR_L)
+/*--------------------------------------------------------------------------*/
+#  else     /* Are using both categories.  Place them in the same CODESET,
+             * either C or the LC_MESSAGES locale */
 
-    /* This function is also trivial if we don't have to worry about thread
-     * safety and have strerror_l(), as it handles the switch of locales so we
-     * don't have to deal with that.  We don't have to worry about thread
-     * safety if strerror_r() is also available.  Both it and strerror_l() are
-     * thread-safe.  Plain strerror() isn't thread safe.  But on threaded
-     * builds when strerror_r() is available, the apparent call to strerror()
-     * below is actually a macro that behind-the-scenes calls strerror_r(). */
+const char *
+Perl_my_strerror(pTHX_ const int errnum, utf8ness_t * utf8ness)
+{
+    PERL_ARGS_ASSERT_MY_STRERROR;
 
-#    ifdef HAS_STRERROR_R
+    DEBUG_STRERROR_ENTER(errnum, IN_LC(LC_MESSAGES));
 
-    if (within_locale_scope) {
-        errstr = savepv(strerror(errnum));
-    }
-    else {
+    const char *errstr;
+    if (! IN_LC(LC_MESSAGES)) {    /* Use C if not within locale scope */
         errstr = savepv(strerror_l(errnum, PL_C_locale_obj));
+        *utf8ness = UTF8NESS_IMMATERIAL;
+    }
+    else {  /* Otherwise, use the LC_MESSAGES locale, making sure LC_CTYPE
+               matches */
+        locale_t cur = duplocale(use_curlocale_scratch());
+
+        cur = newlocale(LC_CTYPE_MASK, querylocale_c(LC_MESSAGES), cur);
+        errstr = savepv(strerror_l(errnum, cur));
+        *utf8ness = get_locale_string_utf8ness_i(errstr,
+                                                 LOCALE_UTF8NESS_UNKNOWN,
+                                                 NULL, LC_MESSAGES_INDEX_);
+        freelocale(cur);
     }
 
-#    else
+    DEBUG_STRERROR_RETURN(errstr, utf8ness);
 
-    /* Here we have strerror_l(), but not strerror_r() and we are on a
-     * threaded-build.  We use strerror_l() for everything, constructing a
-     * locale to pass to it if necessary */
+    SAVEFREEPV(errstr);
+    return errstr;
+}
+#  endif    /* Above is using strerror_l */
+/*==========================================================================*/
+#else       /* Below is not using strerror_l */
+#  if ! defined(USE_LOCALE_CTYPE) && ! defined(USE_LOCALE_MESSAGES)
 
-    bool do_free = FALSE;
-    locale_t locale_to_use;
+/* If not using using either of the categories, return plain, unadorned
+ * strerror */
 
-    if (within_locale_scope) {
-        locale_to_use = uselocale((locale_t) 0);
-        if (locale_to_use == LC_GLOBAL_LOCALE) {
-            locale_to_use = duplocale(LC_GLOBAL_LOCALE);
-            do_free = TRUE;
-        }
-    }
-    else {  /* Use C locale if not within 'use locale' scope */
-        locale_to_use = PL_C_locale_obj;
-    }
+const char *
+Perl_my_strerror(pTHX_ const int errnum, utf8ness_t * utf8ness)
+{
+    PERL_ARGS_ASSERT_MY_STRERROR;
 
-    errstr = savepv(strerror_l(errnum, locale_to_use));
+    DEBUG_STRERROR_ENTER(errnum, 0);
 
-    if (do_free) {
-        freelocale(locale_to_use);
-    }
+    const char *errstr = savepv(Strerror(errnum));
+    *utf8ness = UTF8NESS_IMMATERIAL;
 
-#    endif
-#  else /* Doesn't have strerror_l() */
+    DEBUG_STRERROR_RETURN(errstr, utf8ness);
 
-    const char * save_locale = NULL;
-    bool locale_is_C = FALSE;
+    SAVEFREEPV(errstr);
+    return errstr;
+}
 
-    /* We have a critical section to prevent another thread from executing this
-     * same code at the same time.  (On thread-safe perls, the LOCK is a
-     * no-op.)  Since this is the only place in core that changes LC_MESSAGES
-     * (unless the user has called setlocale(), this works to prevent races. */
-    SETLOCALE_LOCK;
+/*--------------------------------------------------------------------------*/
+#  elif ! defined(USE_LOCALE_CTYPE) || ! defined(USE_LOCALE_MESSAGES)
 
-    DEBUG_Lv(PerlIO_printf(Perl_debug_log,
-                            "my_strerror called with errnum %d\n", errnum));
-    if (! within_locale_scope) {
-        save_locale = do_setlocale_c(LC_MESSAGES, NULL);
-        if (! save_locale) {
-            SETLOCALE_UNLOCK;
-            Perl_croak(aTHX_
-                 "panic: %s: %d: Could not find current LC_MESSAGES locale,"
-                 " errno=%d\n", __FILE__, __LINE__, errno);
-        }
-        else {
-            locale_is_C = isNAME_C_OR_POSIX(save_locale);
-
-            /* Switch to the C locale if not already in it */
-            if (! locale_is_C) {
-
-                /* The setlocale() just below likely will zap 'save_locale', so
-                 * create a copy.  */
-                save_locale = savepv(save_locale);
-                if (! do_setlocale_c(LC_MESSAGES, "C")) {
-
-                    /* If, for some reason, the locale change failed, we
-                     * soldier on as best as possible under the circumstances,
-                     * using the current locale, and clear save_locale, so we
-                     * don't try to change back.  On z/0S, all setlocale()
-                     * calls fail after you've created a thread.  This is their
-                     * way of making sure the entire process is always a single
-                     * locale.  This means that 'use locale' is always in place
-                     * for messages under these circumstances. */
-                    Safefree(save_locale);
-                    save_locale = NULL;
-                }
-            }
-        }
-    }   /* end of ! within_locale_scope */
-    else {
-        DEBUG_Lv(PerlIO_printf(Perl_debug_log, "%s: %d: WITHIN locale scope\n",
-                                               __FILE__, __LINE__));
-    }
+/* Here one or the other of CTYPE or MESSAGES is defined, but not both.  If we
+ * are not within 'use locale' scope of the only one defined, we use the C
+ * locale; otherwise use the current locale */
 
-    DEBUG_Lv(PerlIO_printf(Perl_debug_log,
-             "Any locale change has been done; about to call Strerror\n"));
-    errstr = savepv(Strerror(errnum));
-
-    if (! within_locale_scope) {
-        if (save_locale && ! locale_is_C) {
-            if (! do_setlocale_c(LC_MESSAGES, save_locale)) {
-                SETLOCALE_UNLOCK;
-                Perl_croak(aTHX_
-                     "panic: %s: %d: setlocale restore to '%s' failed, errno=%d\n",
-                             __FILE__, __LINE__, save_locale, errno);
-            }
-            Safefree(save_locale);
-        }
+const char *
+Perl_my_strerror(pTHX_ const int errnum, utf8ness_t * utf8ness)
+{
+    PERL_ARGS_ASSERT_MY_STRERROR;
+
+    DEBUG_STRERROR_ENTER(errnum, IN_LC(categories[WHICH_LC_INDEX]));
+
+    const char *errstr;
+    if (IN_LC(categories[WHICH_LC_INDEX])) {
+        errstr = savepv(Strerror(errnum));
+        *utf8ness = get_locale_string_utf8ness_i(errstr,
+                                                 LOCALE_UTF8NESS_UNKNOWN,
+                                                 NULL, WHICH_LC_INDEX);
     }
+    else {
 
-    SETLOCALE_UNLOCK;
+        SETLOCALE_LOCK;
 
-#  endif /* End of doesn't have strerror_l */
-#  ifdef DEBUGGING
+        const char * orig_locale = toggle_locale_i(WHICH_LC_INDEX, "C");
+
+        errstr = savepv(Strerror(errnum));
+
+        restore_toggled_locale_i(WHICH_LC_INDEX, orig_locale);
+
+        SETLOCALE_UNLOCK;
+
+        *utf8ness = UTF8NESS_IMMATERIAL;
 
-    if (DEBUG_Lv_TEST) {
-        PerlIO_printf(Perl_debug_log, "Strerror returned; saving a copy: '");
-        print_bytes_for_locale(errstr, errstr + strlen(errstr), 0);
-        PerlIO_printf(Perl_debug_log, "'\n");
     }
 
-#  endif
-#endif   /* End of does have locale messages */
+    DEBUG_STRERROR_RETURN(errstr, utf8ness);
+
+    SAVEFREEPV(errstr);
+    return errstr;
+}
+
+/*--------------------------------------------------------------------------*/
+#  else
+
+/* Below, have both LC_CTYPE and LC_MESSAGES.  Place them in the same CODESET,
+ * either C or the LC_MESSAGES locale */
+
+const char *
+Perl_my_strerror(pTHX_ const int errnum, utf8ness_t * utf8ness)
+{
+    PERL_ARGS_ASSERT_MY_STRERROR;
+
+    DEBUG_STRERROR_ENTER(errnum, IN_LC(LC_MESSAGES));
+
+    const char * desired_locale = (IN_LC(LC_MESSAGES))
+                                  ? querylocale_c(LC_MESSAGES)
+                                  : "C";
+    /* XXX Can fail on z/OS */
+
+    SETLOCALE_LOCK;
+
+    const char* orig_CTYPE_locale    = toggle_locale_c(LC_CTYPE, desired_locale);
+    const char* orig_MESSAGES_locale = toggle_locale_c(LC_MESSAGES,
+                                                       desired_locale);
+    const char *errstr = savepv(Strerror(errnum));
+
+    restore_toggled_locale_c(LC_MESSAGES, orig_MESSAGES_locale);
+    restore_toggled_locale_c(LC_CTYPE, orig_CTYPE_locale);
+
+    SETLOCALE_UNLOCK;
+
+    *utf8ness = get_locale_string_utf8ness_i(errstr, LOCALE_UTF8NESS_UNKNOWN,
+                                             NULL, LC_MESSAGES_INDEX_);
+    DEBUG_STRERROR_RETURN(errstr, utf8ness);
 
     SAVEFREEPV(errstr);
     return errstr;
 }
 
+/*--------------------------------------------------------------------------*/
+#  endif /* end of not using strerror_l() */
+#endif   /* end of all the my_strerror() implementations */
+
 /*
 
 =for apidoc switch_to_global_locale
 
-On systems without locale support, or on typical single-threaded builds, or on
-platforms that do not support per-thread locale operations, this function does
-nothing.  On such systems that do have locale support, only a locale global to
-the whole program is available.
+This function copies the locale state of the calling thread into the program's
+global locale, and converts the thread to use that global locale.
+
+It is intended so that Perl can safely be used with C libraries that access the
+global locale and which can't be converted to not access it.  Effectively, this
+means libraries that call C<L<setlocale(3)>> on non-Windows systems.  (For
+portability, it is a good idea to use it on Windows as well.)
+
+A downside of using it is that it disables the services that Perl provides to
+hide locale gotchas from your code.  The service you most likely will miss
+regards the radix character (decimal point) in floating point numbers.  Code
+executed after this function is called can no longer just assume that this
+character is correct for the current circumstances.
 
-On multi-threaded builds on systems that do have per-thread locale operations,
-this function converts the thread it is running in to use the global locale.
-This is for code that has not yet or cannot be updated to handle multi-threaded
-locale operation.  As long as only a single thread is so-converted, everything
-works fine, as all the other threads continue to ignore the global one, so only
-this thread looks at it.
+To return to Perl control, and restart the gotcha prevention services, call
+C<L</sync_locale>>.  Behavior is undefined for any pure Perl code that executes
+while the switch is in effect.
 
-However, on Windows systems this isn't quite true prior to Visual Studio 15,
-at which point Microsoft fixed a bug.  A race can occur if you use the
-following operations on earlier Windows platforms:
+The global locale and the per-thread locales are independent.  As long as just
+one thread converts to the global locale, everything works smoothly.  But if
+more than one does, they can easily interfere with each other, and races are
+likely.  On Windows systems prior to Visual Studio 15 (at which point Microsoft
+fixed a bug), races can occur (even if only one thread has been converted to
+the global locale), but only if you use the following operations:
 
 =over
 
@@ -5352,59 +6962,98 @@ following operations on earlier Windows platforms:
 =back
 
 The first item is not fixable (except by upgrading to a later Visual Studio
-release), but it would be possible to work around the latter two items by using
-the Windows API functions C<GetNumberFormat> and C<GetCurrencyFormat>; patches
+release), but it would be possible to work around the latter two items by
+having Perl change its algorithm for calculating these to use Windows API
+functions (likely C<GetNumberFormat> and C<GetCurrencyFormat>); patches
 welcome.
 
-Without this function call, threads that use the L<C<setlocale(3)>> system
-function will not work properly, as all the locale-sensitive functions will
-look at the per-thread locale, and C<setlocale> will have no effect on this
-thread.
-
-Perl code should convert to either call
-L<C<Perl_setlocale>|perlapi/Perl_setlocale> (which is a drop-in for the system
-C<setlocale>) or use the methods given in L<perlcall> to call
+XS code should never call plain C<setlocale>, but should instead be converted
+to either call L<C<Perl_setlocale>|perlapi/Perl_setlocale> (which is a drop-in
+for the system C<setlocale>) or use the methods given in L<perlcall> to call
 L<C<POSIX::setlocale>|POSIX/setlocale>.  Either one will transparently properly
 handle all cases of single- vs multi-thread, POSIX 2008-supported or not.
 
-Non-Perl libraries, such as C<gtk>, that call the system C<setlocale> can
-continue to work if this function is called before transferring control to the
-library.
-
-Upon return from the code that needs to use the global locale,
-L<C<sync_locale()>|perlapi/sync_locale> should be called to restore the safe
-multi-thread operation.
-
 =cut
 */
 
 void
-Perl_switch_to_global_locale()
+Perl_switch_to_global_locale(pTHX)
 {
 
-#ifdef USE_THREAD_SAFE_LOCALE
-#  ifdef WIN32
+#ifdef USE_LOCALE
 
-    _configthreadlocale(_DISABLE_PER_THREAD_LOCALE);
+    DEBUG_L(PerlIO_printf(Perl_debug_log, "Entering switch_to_global; %s\n",
+                                          get_LC_ALL_display()));
+    bool perl_controls = false;
 
-#  else
-#    ifdef HAS_QUERYLOCALE
+#  ifdef USE_THREAD_SAFE_LOCALE
+
+   /* In these cases, we use the system state to determine if we are in the
+    * global locale or not. */
+
+#    ifdef USE_POSIX_2008_LOCALE
+
+    perl_controls = (LC_GLOBAL_LOCALE != uselocale((locale_t) 0));
 
-    setlocale(LC_ALL, querylocale(LC_ALL_MASK, uselocale((locale_t) 0)));
+#    elif defined(WIN32)
+
+    perl_controls = (_configthreadlocale(0) == _ENABLE_PER_THREAD_LOCALE);
 
 #    else
+#      error Unexpected Configuration
+#    endif
+#  endif
 
-    {
-        unsigned int i;
+    /* No-op if already in global */
+    if (! perl_controls) {
+        return;
+    }
 
-        for (i = 0; i < LC_ALL_INDEX; i++) {
-            setlocale(categories[i], do_setlocale_r(categories[i], NULL));
-        }
+#  ifdef USE_THREAD_SAFE_LOCALE
+#    if defined(WIN32)
+
+    const char * thread_locale = posix_setlocale(LC_ALL, NULL);
+    _configthreadlocale(_DISABLE_PER_THREAD_LOCALE);
+    posix_setlocale(LC_ALL, thread_locale);
+
+#    else   /* Must be USE_POSIX_2008_LOCALE) */
+
+    const char * cur_thread_locales[NOMINAL_LC_ALL_INDEX + 1];
+
+    /* Save each category's current per-thread state */
+    for (unsigned i = 0; i < NOMINAL_LC_ALL_INDEX; i++) {
+        cur_thread_locales[i] = querylocale_i(i);
+    }
+
+    /* Now switch to global */
+    DEBUG_Lv(PerlIO_printf(Perl_debug_log, "Switching to global locale\n"));
+
+    locale_t old_locale = uselocale(LC_GLOBAL_LOCALE);
+    if (! old_locale) {
+        locale_panic_("Could not change to global locale");
+    }
+
+    /* Free the per-thread memory */
+    if (old_locale != LC_GLOBAL_LOCALE && old_locale != PL_C_locale_obj) {
+        freelocale(old_locale);
+    }
+
+    /* Set the global to what was our per-thread state */
+    POSIX_SETLOCALE_LOCK;
+    for (unsigned int i = 0; i < NOMINAL_LC_ALL_INDEX; i++) {
+        posix_setlocale(categories[i], cur_thread_locales[i]);
     }
+    POSIX_SETLOCALE_UNLOCK;
 
 #    endif
+#  endif
+#  ifdef USE_LOCALE_NUMERIC
 
-    uselocale(LC_GLOBAL_LOCALE);
+    /* Switch to the underlying C numeric locale; the application is on its
+     * own. */
+    POSIX_SETLOCALE_LOCK;
+    posix_setlocale(LC_NUMERIC, PL_numeric_name);
+    POSIX_SETLOCALE_UNLOCK;
 
 #  endif
 #endif
@@ -5415,27 +7064,45 @@ Perl_switch_to_global_locale()
 
 =for apidoc sync_locale
 
+This function copies the state of the program global locale into the calling
+thread, and converts that thread to using per-thread locales, if it wasn't
+already, and the platform supports them.  The LC_NUMERIC locale is toggled into
+the standard state (using the C locale's conventions), if not within the
+lexical scope of S<C<use locale>>.
+
+Perl will now consider itself to have control of the locale.
+
+Since unthreaded perls have only a global locale, this function is a no-op
+without threads.
+
+This function is intended for use with C libraries that do locale manipulation.
+It allows Perl to accommodate the use of them.  Call this function before
+transferring back to Perl space so that it knows what state the C code has left
+things in.
+
+XS code should not manipulate the locale on its own.  Instead,
 L<C<Perl_setlocale>|perlapi/Perl_setlocale> can be used at any time to query or
 change the locale (though changing the locale is antisocial and dangerous on
 multi-threaded systems that don't have multi-thread safe locale operations.
-(See L<perllocale/Multi-threaded operation>).  Using the system
-L<C<setlocale(3)>> should be avoided.  Nevertheless, certain non-Perl libraries
-called from XS, such as C<Gtk> do so, and this can't be changed.  When the
-locale is changed by XS code that didn't use
-L<C<Perl_setlocale>|perlapi/Perl_setlocale>, Perl needs to be told that the
-locale has changed.  Use this function to do so, before returning to Perl.
+(See L<perllocale/Multi-threaded operation>).
+
+Using the libc L<C<setlocale(3)>> function should be avoided.  Nevertheless,
+certain non-Perl libraries called from XS, do call it, and their behavior may
+not be able to be changed.  This function, along with
+C<L</switch_to_global_locale>>, can be used to get seamless behavior in these
+circumstances, as long as only one thread is involved.
+
+If the library has an option to turn off its locale manipulation, doing that is
+preferable to using this mechanism.  C<Gtk> is such a library.
 
 The return value is a boolean: TRUE if the global locale at the time of call
-was in effect; and FALSE if a per-thread locale was in effect.  This can be
-used by the caller that needs to restore things as-they-were to decide whether
-or not to call
-L<C<Perl_switch_to_global_locale>|perlapi/switch_to_global_locale>.
+was in effect for the caller; and FALSE if a per-thread locale was in effect.
 
 =cut
 */
 
 bool
-Perl_sync_locale()
+Perl_sync_locale(pTHX)
 {
 
 #ifndef USE_LOCALE
@@ -5444,77 +7111,52 @@ Perl_sync_locale()
 
 #else
 
-    const char * newlocale;
-    dTHX;
-
-#  ifdef USE_POSIX_2008_LOCALE
+    bool was_in_global = TRUE;
 
-    bool was_in_global_locale = FALSE;
-    locale_t cur_obj = uselocale((locale_t) 0);
+#  ifdef USE_THREAD_SAFE_LOCALE
+#    if defined(WIN32)
 
-    /* On Windows, unless the foreign code has turned off the thread-safe
-     * locale setting, any plain setlocale() will have affected what we see, so
-     * no need to worry.  Otherwise, If the foreign code has done a plain
-     * setlocale(), it will only affect the global locale on POSIX systems, but
-     * will affect the */
-    if (cur_obj == LC_GLOBAL_LOCALE) {
+    was_in_global = _configthreadlocale(_DISABLE_PER_THREAD_LOCALE)
+                                     == _DISABLE_PER_THREAD_LOCALE;
 
-#    ifdef HAS_QUERY_LOCALE
+#    elif defined(USE_POSIX_2008_LOCALE)
 
-        do_setlocale_c(LC_ALL, setlocale(LC_ALL, NULL));
+    was_in_global = (LC_GLOBAL_LOCALE == uselocale((locale_t) 0));
 
 #    else
-
-        unsigned int i;
-
-        /* We can't trust that we can read the LC_ALL format on the
-         * platform, so do them individually */
-        for (i = 0; i < LC_ALL_INDEX; i++) {
-            do_setlocale_r(categories[i], setlocale(categories[i], NULL));
-        }
-
+#      error Unexpected Configuration
 #    endif
-
-        was_in_global_locale = TRUE;
+#  endif    /* USE_THREAD_SAFE_LOCALE */
+
+    /* Here, we are in the global locale.  Get and save the values for each
+     * category. */
+    const char * current_globals[NOMINAL_LC_ALL_INDEX];
+    for (unsigned i = 0; i < NOMINAL_LC_ALL_INDEX; i++) {
+        POSIX_SETLOCALE_LOCK;
+        current_globals[i] = savepv(stdized_setlocale(categories[i], NULL));
+        POSIX_SETLOCALE_UNLOCK;
     }
 
-#  else
-
-    bool was_in_global_locale = TRUE;
-
-#  endif
-#  ifdef USE_LOCALE_CTYPE
-
-    newlocale = savepv(do_setlocale_c(LC_CTYPE, NULL));
-    DEBUG_Lv(PerlIO_printf(Perl_debug_log,
-        "%s:%d: %s\n", __FILE__, __LINE__,
-        setlocale_debug_string(LC_CTYPE, NULL, newlocale)));
-    new_ctype(newlocale);
-    Safefree(newlocale);
+    /* Now we have to convert the current thread to use them */
 
-#  endif /* USE_LOCALE_CTYPE */
-#  ifdef USE_LOCALE_COLLATE
+#  if defined(WIN32)
 
-    newlocale = savepv(do_setlocale_c(LC_COLLATE, NULL));
-    DEBUG_Lv(PerlIO_printf(Perl_debug_log,
-        "%s:%d: %s\n", __FILE__, __LINE__,
-        setlocale_debug_string(LC_COLLATE, NULL, newlocale)));
-    new_collate(newlocale);
-    Safefree(newlocale);
+    /* On Windows, convert to per-thread behavior.  This isn't necessary in
+     * POSIX 2008, as the conversion gets done automatically in the loop below.
+     * */
+    _configthreadlocale(_ENABLE_PER_THREAD_LOCALE);
 
 #  endif
-#  ifdef USE_LOCALE_NUMERIC
 
-    newlocale = savepv(do_setlocale_c(LC_NUMERIC, NULL));
-    DEBUG_Lv(PerlIO_printf(Perl_debug_log,
-        "%s:%d: %s\n", __FILE__, __LINE__,
-        setlocale_debug_string(LC_NUMERIC, NULL, newlocale)));
-    new_numeric(newlocale);
-    Safefree(newlocale);
+    for (unsigned i = 0; i < NOMINAL_LC_ALL_INDEX; i++) {
+        setlocale_i(i, current_globals[i]);
+        Safefree(current_globals[i]);
+    }
 
-#  endif /* USE_LOCALE_NUMERIC */
+    /* And update our remaining records.  'true' => force recalculation */
+    new_LC_ALL(NULL, true);
 
-    return was_in_global_locale;
+    return was_in_global;
 
 #endif
 
@@ -5523,75 +7165,127 @@ Perl_sync_locale()
 #if defined(DEBUGGING) && defined(USE_LOCALE)
 
 STATIC char *
-S_setlocale_debug_string(const int category,        /* category number,
-                                                           like LC_ALL */
-                            const char* const locale,   /* locale name */
+S_my_setlocale_debug_string_i(pTHX_
+                              const unsigned cat_index,
+                              const char* locale, /* Optional locale name */
 
-                            /* return value from setlocale() when attempting to
-                             * set 'category' to 'locale' */
-                            const char* const retval)
+                              /* return value from setlocale() when attempting
+                               * to set 'category' to 'locale' */
+                              const char* retval,
+
+                              const line_t line)
 {
     /* Returns a pointer to a NUL-terminated string in static storage with
      * added text about the info passed in.  This is not thread safe and will
      * be overwritten by the next call, so this should be used just to
      * formulate a string to immediately print or savepv() on. */
 
-    static char ret[256];
+    const char * locale_quote;
+    const char * retval_quote;
 
-    my_strlcpy(ret, "setlocale(", sizeof(ret));
-    my_strlcat(ret, category_name(category), sizeof(ret));
-    my_strlcat(ret, ", ", sizeof(ret));
+    assert(cat_index <= NOMINAL_LC_ALL_INDEX);
 
-    if (locale) {
-        my_strlcat(ret, "\"", sizeof(ret));
-        my_strlcat(ret, locale, sizeof(ret));
-        my_strlcat(ret, "\"", sizeof(ret));
+    if (locale == NULL) {
+        locale_quote = "";
+        locale = "NULL";
     }
     else {
-        my_strlcat(ret, "NULL", sizeof(ret));
+        locale_quote = "\"";
     }
 
-    my_strlcat(ret, ") returned ", sizeof(ret));
-
-    if (retval) {
-        my_strlcat(ret, "\"", sizeof(ret));
-        my_strlcat(ret, retval, sizeof(ret));
-        my_strlcat(ret, "\"", sizeof(ret));
+    if (retval == NULL) {
+        retval_quote = "";
+        retval = "NULL";
     }
     else {
-        my_strlcat(ret, "NULL", sizeof(ret));
+        retval_quote = "\"";
     }
 
-    assert(strlen(ret) < sizeof(ret));
+#  ifdef USE_LOCALE_THREADS
+#    define THREAD_FORMAT "%p:"
+#    define THREAD_ARGUMENT aTHX_
+#  else
+#    define THREAD_FORMAT
+#    define THREAD_ARGUMENT
+#  endif
 
-    return ret;
+    return Perl_form(aTHX_
+                     "%s:%" LINE_Tf ": " THREAD_FORMAT
+                     " setlocale(%s[%d], %s%s%s) returned %s%s%s\n",
+
+                     __FILE__, line, THREAD_ARGUMENT
+                     category_names[cat_index], categories[cat_index],
+                     locale_quote, locale, locale_quote,
+                     retval_quote, retval, retval_quote);
 }
 
 #endif
+#ifdef USE_PERL_SWITCH_LOCALE_CONTEXT
 
 void
-Perl_thread_locale_init()
+Perl_switch_locale_context()
 {
-    /* Called from a thread on startup*/
+    /* libc keeps per-thread locale status information in some configurations.
+     * So, we can't just switch out aTHX to switch to a new thread.  libc has
+     * to follow along.  This routine does that based on per-interpreter
+     * variables we keep just for this purpose */
 
-#ifdef USE_THREAD_SAFE_LOCALE
+    /* Can't use pTHX, because we may be called from a place where that
+     * isn't available */
+    dTHX;
 
-    dTHX_DEBUGGING;
+    if (UNLIKELY(   aTHX == NULL
+                 || PL_veto_switch_non_tTHX_context
+                 || PL_phase == PERL_PHASE_CONSTRUCT))
+    {
+        return;
+    }
 
-    /* C starts the new thread in the global C locale.  If we are thread-safe,
-     * we want to not be in the global locale */
+#  ifdef USE_POSIX_2008_LOCALE
 
-     DEBUG_L(PerlIO_printf(Perl_debug_log,
-            "%s:%d: new thread, initial locale is %s; calling setlocale\n",
-            __FILE__, __LINE__, setlocale(LC_ALL, NULL)));
+    if (! uselocale(PL_cur_locale_obj)) {
+        locale_panic_(Perl_form(aTHX_
+                                "Can't uselocale(%p), LC_ALL supposed to be '%s",
+                                PL_cur_locale_obj, get_LC_ALL_display()));
+    }
 
-#  ifdef WIN32
+#  elif defined(WIN32)
 
-    _configthreadlocale(_ENABLE_PER_THREAD_LOCALE);
+    if (! bool_setlocale_c(LC_ALL, PL_cur_LC_ALL)) {
+        locale_panic_(Perl_form(aTHX_ "Can't setlocale(%s)", PL_cur_LC_ALL));
+    }
 
-#  else
+#  endif
+
+}
+
+#endif
+
+void
+Perl_thread_locale_init(pTHX)
+{
+
+#ifdef USE_THREAD_SAFE_LOCALE
+#  ifdef USE_POSIX_2008_LOCALE
+
+    /* Called from a thread on startup.
+     *
+     * The operations here have to be done from within the calling thread, as
+     * they affect libc's knowledge of the thread; libc has no knowledge of
+     * aTHX */
+
+     DEBUG_L(PerlIO_printf(Perl_debug_log,
+                           "new thread, initial locale is %s;"
+                           " calling setlocale(LC_ALL, \"C\")\n",
+                           get_LC_ALL_display()));
+
+    uselocale(PL_C_locale_obj);
 
-    Perl_setlocale(LC_ALL, "C");
+#  elif defined(WIN32)
+
+    /* On Windows, make sure new thread has per-thread locales enabled */
+    _configthreadlocale(_ENABLE_PER_THREAD_LOCALE);
+    void_setlocale_c(LC_ALL, "C");
 
 #  endif
 #endif
@@ -5599,25 +7293,36 @@ Perl_thread_locale_init()
 }
 
 void
-Perl_thread_locale_term()
+Perl_thread_locale_term(pTHX)
 {
-    /* Called from a thread as it gets ready to terminate */
+    /* Called from a thread as it gets ready to terminate.
+     *
+     * The operations here have to be done from within the calling thread, as
+     * they affect libc's knowledge of the thread; libc has no knowledge of
+     * aTHX */
 
-#ifdef USE_THREAD_SAFE_LOCALE
+#ifdef USE_POSIX_2008_LOCALE
 
     /* C starts the new thread in the global C locale.  If we are thread-safe,
      * we want to not be in the global locale */
 
-#  ifndef WIN32
+    /* Free up */
+    locale_t actual_obj   = uselocale(LC_GLOBAL_LOCALE);
+    if (actual_obj != LC_GLOBAL_LOCALE && actual_obj != PL_C_locale_obj) {
+        freelocale(actual_obj);
+    }
 
-    {   /* Free up */
-        locale_t cur_obj = uselocale(LC_GLOBAL_LOCALE);
-        if (cur_obj != LC_GLOBAL_LOCALE && cur_obj != PL_C_locale_obj) {
-            freelocale(cur_obj);
-        }
+    /* Prevent leaks even if something has gone wrong */
+    locale_t expected_obj = PL_cur_locale_obj;
+    if (UNLIKELY(   expected_obj != actual_obj
+                 && expected_obj != LC_GLOBAL_LOCALE
+                 && expected_obj != PL_C_locale_obj))
+    {
+        freelocale(expected_obj);
     }
 
-#  endif
+    PL_cur_locale_obj = LC_GLOBAL_LOCALE;
+
 #endif
 
 }
index df352cb..eceb454 100644 (file)
@@ -51,14 +51,6 @@ our $opt_v = scalar grep $_ eq '-v', @ARGV;
 
 BEGIN {
     my $root=".";
-    # test 1st to see if we're a -Dmksymlinks target dir
-    $subcd = '';
-    $srcdir = $root;
-    if (-l "./Configure") {
-       $srcdir = readlink("./Configure");
-       $srcdir =~ s/Configure//;
-       $subcd = "cd $srcdir &&"; # activate backtick fragment
-    }
     while (!-e "$root/perl.c" and length($root)<100) {
         if ($root eq '.') {
             $root="..";
@@ -68,6 +60,15 @@ BEGIN {
     }
     die "Can't find toplevel" if !-e "$root/perl.c";
     sub path_to { "$root/$_[0]" } # use $_[0] if this'd be placed in toplevel.
+
+    # test to see if we're a -Dmksymlinks target dir
+    $subcd = '';
+    $srcdir = $root;
+    if (-l "$root/Configure") {
+        $srcdir = readlink("$root/Configure");
+        $srcdir =~ s/Configure//;
+        $subcd = "cd $srcdir &&"; # activate backtick fragment
+    }
 }
 
 sub read_file {
@@ -161,8 +162,7 @@ elsif ($git_patch_file = read_file(".git_patch") and $git_patch_file !~ /\A\$For
     $commit_title = "Snapshot of:";
 }
 elsif (-d "$srcdir/.git") {
-    # git branch | awk 'BEGIN{ORS=""} /\*/ { print $2 }'
-    ($branch) = map { /\* ([^(]\S*)/ ? $1 : () } backtick("git branch");
+    ($branch) = backtick("git symbolic-ref -q HEAD") =~ m#^refs/heads/(.+)$#;
     $branch //= "";
     my ($remote,$merge);
     if (length $branch) {
index 27076e3..c8b34eb 100644 (file)
@@ -33,6 +33,7 @@
 
 use strict;
 use Config;
+use warnings;
 
 my $fold;
 my %ARGS;
@@ -66,14 +67,19 @@ BEGIN {
     die "PLATFORM must be one of: @PLATFORM\n"
        unless exists $PLATFORM{$ARGS{PLATFORM}};
 }
+
 use constant PLATFORM => $ARGS{PLATFORM};
 
+# This makes us able to use, e.g., $define{WIN32}, so you don't have to
+# remember what things came from %ARGS.
+$define{uc $ARGS{'PLATFORM'}} = 1;
+
 require "./$ARGS{TARG_DIR}regen/embed_lib.pl";
 
 # Is the following guard strictly necessary? Added during refactoring
 # to keep the same behaviour when merging other code into here.
 process_cc_flags(@Config{qw(ccflags optimize)})
-    if $ARGS{PLATFORM} ne 'win32';
+    if PLATFORM ne 'win32';
 
 # Add the compile-time options that miniperl was built with to %define.
 # On Win32 these are not the same options as perl itself will be built
@@ -85,7 +91,7 @@ process_cc_flags(@Config{qw(ccflags optimize)})
 # minimal configs that don't include any of those options.
 
 my @options = sort(Config::bincompat_options(), Config::non_bincompat_options());
-print STDERR "Options: (@options)\n" unless $ARGS{PLATFORM} eq 'test';
+print STDERR "Options: (@options)\n" unless PLATFORM eq 'test';
 $define{$_} = 1 foreach @options;
 
 my %exportperlmalloc =
@@ -96,7 +102,7 @@ my %exportperlmalloc =
        Perl_calloc             =>      "calloc",
     );
 
-my $exportperlmalloc = $ARGS{PLATFORM} eq 'os2';
+my $exportperlmalloc = PLATFORM eq 'os2';
 
 my $config_h = 'config.h';
 open(CFG, '<', $config_h) || die "Cannot open $config_h: $!\n";
@@ -107,8 +113,10 @@ while (<CFG>) {
 }
 close(CFG);
 
+#==========================================================================
 # perl.h logic duplication begins
 
+
 if ($define{USE_ITHREADS}) {
     if (!$define{MULTIPLICITY}) {
         $define{MULTIPLICITY} = 1;
@@ -119,7 +127,7 @@ $define{MULTIPLICITY} ||=
     $define{USE_ITHREADS} ||
     $define{PERL_IMPLICIT_CONTEXT} ;
 
-if ($define{USE_ITHREADS} && $ARGS{PLATFORM} ne 'win32') {
+if ($define{USE_ITHREADS} && ! $define{WIN32}) {
     $define{USE_REENTRANT_API} = 1;
 }
 
@@ -140,36 +148,66 @@ if (! $define{NO_LOCALE}) {
 
 # https://en.wikipedia.org/wiki/Microsoft_Visual_C%2B%2B#Internal_version_numbering
 my $cctype = $ARGS{CCTYPE} =~ s/MSVC//r;
-if (! $define{HAS_SETLOCALE} && $define{HAS_POSIX_2008_LOCALE}) {
+if ($define{USE_ITHREADS} && ! $define{NO_LOCALE_THREADS}) {
+    $define{USE_LOCALE_THREADS} = 1;
+}
+
+if (   $define{HAS_POSIX_2008_LOCALE}
+    && (  ! $define{HAS_SETLOCALE} || (     $define{USE_LOCALE_THREADS}
+                                       && ! $define{NO_POSIX_2008_LOCALE})))
+{
     $define{USE_POSIX_2008_LOCALE} = 1;
-    $define{USE_THREAD_SAFE_LOCALE} = 1;
 }
-elsif (   ($define{USE_ITHREADS} || $define{USE_THREAD_SAFE_LOCALE})
-       && (    $define{HAS_POSIX_2008_LOCALE}
-           || ($ARGS{PLATFORM} eq 'win32' && (   $cctype !~ /\D/
-                                              && $cctype >= 80)))
-       && ! $define{NO_THREAD_SAFE_LOCALE})
+
+if ($define{USE_LOCALE_THREADS} && ! $define{NO_THREAD_SAFE_LOCALE})
 {
-    $define{USE_THREAD_SAFE_LOCALE} = 1 unless $define{USE_THREAD_SAFE_LOCALE};
-    $define{USE_POSIX_2008_LOCALE} = 1 if $define{HAS_POSIX_2008_LOCALE};
+    if (    $define{USE_POSIX_2008_LOCALE}
+        || ($define{WIN32} && (   $cctype !~ /\D/
+                               && $cctype >= 80)))
+    {
+        $define{USE_THREAD_SAFE_LOCALE} = 1;
+    }
+}
+
+if ($define{USE_POSIX_2008_LOCALE} && $define{HAS_QUERYLOCALE})
+{
+    $define{USE_QUERYLOCALE} = 1;
+
+    # Don't need glibc only code from perl.h
+}
+
+if ($define{USE_POSIX_2008_LOCALE} && ! $define{USE_QUERYLOCALE})
+{
+    $define{USE_PL_CURLOCALES} = 1;
+    $define{USE_PL_CUR_LC_ALL} = 1;
+}
+
+if ($define{WIN32} && $define{USE_THREAD_SAFE_LOCALE})
+{
+    $define{USE_PL_CUR_LC_ALL} = 1;
+
+    if ($cctype < 140) {
+        $define{TS_W32_BROKEN_LOCALECONV} = 1;
+    }
 }
 
-if (   $ARGS{PLATFORM} eq 'win32'
-    && $define{USE_THREAD_SAFE_LOCALE}
-    && $cctype < 140)
+if ($define{MULTIPLICITY} && (   $define{USE_POSIX_2008_LOCALE}
+                              || (   $define{WIN32}
+                                  && $define{USE_THREAD_SAFE_LOCALE})))
 {
-    $define{TS_W32_BROKEN_LOCALECONV} = 1;
+    $define{USE_PERL_SWITCH_LOCALE_CONTEXT} = 1;
 }
 
 # perl.h logic duplication ends
+#==========================================================================
 
 print STDERR "Defines: (" . join(' ', sort keys %define) . ")\n"
-     unless $ARGS{PLATFORM} eq 'test';
+     unless PLATFORM eq 'test';
 
 my $sym_ord = 0;
 my %ordinal;
 
-if ($ARGS{PLATFORM} eq 'os2') {
+if (PLATFORM eq 'os2') {
     if (open my $fh, '<', 'perl5.def') {
       while (<$fh>) {
        last if /^\s*EXPORTS\b/;
@@ -219,7 +257,7 @@ sub readvar {
     }
 }
 
-if ($ARGS{PLATFORM} ne 'os2') {
+if (PLATFORM ne 'os2') {
     ++$skip{$_} foreach qw(
                     PL_opsave
                     Perl_dump_fds
@@ -232,7 +270,7 @@ if ($ARGS{PLATFORM} ne 'os2') {
                     Perl_my_ntohl
                     Perl_my_swap
                         );
-    if ($ARGS{PLATFORM} eq 'vms') {
+    if (PLATFORM eq 'vms') {
        ++$skip{PL_statusvalue_posix};
         # This is a wrapper if we have symlink, not a replacement
         # if we don't.
@@ -240,7 +278,7 @@ if ($ARGS{PLATFORM} ne 'os2') {
     } else {
        ++$skip{PL_statusvalue_vms};
        ++$skip{PL_perllib_sep};
-       if ($ARGS{PLATFORM} ne 'aix') {
+       if (PLATFORM ne 'aix') {
            ++$skip{$_} foreach qw(
                                PL_DBcv
                                PL_generation
@@ -252,14 +290,14 @@ if ($ARGS{PLATFORM} ne 'os2') {
     }
 }
 
-if ($ARGS{PLATFORM} ne 'vms') {
+if (PLATFORM ne 'vms') {
     # VMS does its own thing for these symbols.
     ++$skip{$_} foreach qw(
                        PL_sig_handlers_initted
                        PL_sig_ignoring
                        PL_sig_defaulting
                         );
-    if ($ARGS{PLATFORM} ne 'win32') {
+    if (PLATFORM ne 'win32') {
        ++$skip{$_} foreach qw(
                            Perl_do_spawn
                            Perl_do_spawn_nowait
@@ -268,9 +306,12 @@ if ($ARGS{PLATFORM} ne 'vms') {
     }
 }
 
-if ($ARGS{PLATFORM} ne 'win32') {
+if (PLATFORM ne 'win32') {
     ++$skip{$_} foreach qw(
-                   Perl_my_setlocale
+                   Perl_get_context
+                   Perl_get_win32_message_utf8ness
+                   Perl_Win_utf8_string_to_wstring
+                   Perl_Win_wstring_to_utf8_string
                         );
 }
 
@@ -286,7 +327,6 @@ unless ($define{'DEBUGGING'}) {
                    Perl_debstackptrs
                    Perl_pad_sv
                    Perl_pad_setsv
-                    Perl__setlocale_debug_string
                    Perl_set_padlist
                    Perl_hv_assert
                    PL_watchaddr
@@ -353,10 +393,6 @@ else {
                         );
 }
 
-if ($define{'PERL_USE_SAFE_PUTENV'}) {
-    ++$skip{PL_use_safe_putenv};
-}
-
 unless ($define{'USE_ITHREADS'}) {
     ++$skip{PL_thr_key};
     ++$skip{PL_user_prop_mutex};
@@ -367,6 +403,7 @@ unless ($define{'USE_ITHREADS'}) {
     ++$skip{$_} foreach qw(
                     PL_keyword_plugin_mutex
                    PL_check_mutex
+                    PL_cur_locale_obj
                    PL_op_mutex
                    PL_regex_pad
                    PL_regex_padav
@@ -374,13 +411,13 @@ unless ($define{'USE_ITHREADS'}) {
                    PL_env_mutex
                    PL_hints_mutex
                    PL_locale_mutex
-                   PL_lc_numeric_mutex
-                   PL_lc_numeric_mutex_depth
+                   PL_locale_mutex_depth
                    PL_my_ctx_mutex
                    PL_perlio_mutex
                    PL_stashpad
                    PL_stashpadix
                    PL_stashpadmax
+                    PL_veto_switch_non_tTHX_context
                    Perl_alloccopstash
                    Perl_allocfilegv
                    Perl_clone_params_del
@@ -409,23 +446,32 @@ unless ($define{'USE_ITHREADS'}) {
                         );
 }
 
-if (      $define{NO_LOCALE}
-    || (! $define{USE_ITHREADS} && ! $define{USE_THREAD_SAFE_LOCALE}))
+unless ($define{USE_POSIX_2008_LOCALE})
 {
     ++$skip{$_} foreach qw(
         PL_C_locale_obj
+        PL_scratch_locale_obj
+        PL_underlying_numeric_obj
+    );
+}
+unless ($define{USE_PL_CURLOCALES})
+{
+    ++$skip{$_} foreach qw(
         PL_curlocales
     );
 }
 
-unless ( $define{'HAS_NEWLOCALE'}
-    &&   $define{'HAS_FREELOCALE'}
-    &&   $define{'HAS_USELOCALE'}
-    && ! $define{'NO_POSIX_2008_LOCALE'})
+unless ($define{USE_PL_CUR_LC_ALL})
 {
     ++$skip{$_} foreach qw(
-        PL_C_locale_obj
-        PL_underlying_numeric_obj
+        PL_cur_LC_ALL
+    );
+}
+
+unless ($define{USE_PERL_SWITCH_LOCALE_CONTEXT})
+{
+    ++$skip{$_} foreach qw(
+        Perl_switch_locale_context
     );
 }
 
@@ -454,11 +500,6 @@ unless ($define{'MULTIPLICITY'}) {
                         );
 }
 
-if ($define{USE_THREAD_SAFE_LOCALE}) {
-    ++$skip{PL_lc_numeric_mutex};
-    ++$skip{PL_lc_numeric_mutex_depth};
-}
-
 unless ($define{'USE_DTRACE'}) {
     ++$skip{$_} foreach qw(
                     Perl_dtrace_probe_call
@@ -517,14 +558,14 @@ unless ($define{HAS_MMAP}) {
 if ($define{HAS_SIGACTION}) {
     ++$skip{PL_sig_trapped};
 
-    if ($ARGS{PLATFORM} eq 'vms') {
+    if (PLATFORM eq 'vms') {
         # FAKE_PERSISTENT_SIGNAL_HANDLERS defined as !defined(HAS_SIGACTION)
         ++$skip{PL_sig_ignoring};
         ++$skip{PL_sig_handlers_initted} unless $define{KILL_BY_SIGPRC};
     }
 }
 
-if ($ARGS{PLATFORM} eq 'vms' && !$define{KILL_BY_SIGPRC}) {
+if (PLATFORM eq 'vms' && !$define{KILL_BY_SIGPRC}) {
     # FAKE_DEFAULT_SIGNAL_HANDLERS defined as KILL_BY_SIGPRC
     ++$skip{Perl_csighandler_init};
     ++$skip{Perl_my_kill};
@@ -550,21 +591,24 @@ unless ($define{USE_LOCALE_COLLATE}) {
                     PL_strxfrm_NUL_replacement
                     PL_strxfrm_is_behaved
                     PL_strxfrm_max_cp
+                   PL_in_utf8_COLLATE_locale
                         );
 }
 
 unless ($define{USE_LOCALE_NUMERIC}) {
     ++$skip{$_} foreach qw(
-                   PL_numeric_local
-                   PL_numeric_name
-                   PL_numeric_radix_sv
-                   PL_numeric_standard
-                    PL_numeric_underlying
-                    PL_numeric_underlying_is_standard
                     PL_underlying_numeric_obj
                         );
 }
 
+unless ($define{USE_LOCALE_CTYPE}) {
+    ++$skip{$_} foreach qw(
+                   PL_ctype_name
+                    PL_in_utf8_CTYPE_locale
+                    PL_in_utf8_turkic_locale
+                        );
+}
+
 unless ($define{'USE_C_BACKTRACE'}) {
     ++$skip{Perl_get_c_backtrace_dump};
     ++$skip{Perl_dump_c_backtrace};
@@ -706,11 +750,13 @@ unless ($Config{d_wcrtomb}) {
 
 {
     my %seen;
-    my ($embed) = setup_embed($ARGS{TARG_DIR});
-    my $excludedre = $define{'NO_MATHOMS'} ? qr/[emiIb]/ : qr/[emiI]/;
+    my ($embed_array) = setup_embed($ARGS{TARG_DIR});
+    my $excludedre = $define{'NO_MATHOMS'} ? qr/[emiIsb]/ : qr/[emiIs]/;
 
-    foreach (@$embed) {
-       my ($flags, $retval, $func, @args) = @$_;
+    foreach (@$embed_array) {
+        my $embed= $_->{embed}
+            or next;
+       my ($flags, $retval, $func, $args) = @{$embed}{qw(flags return_type name args)};
        next unless $func;
        if (($flags =~ /[AXC]/ && $flags !~ $excludedre)
             || (!$define{'NO_MATHOMS'} && $flags =~ /b/))
@@ -723,7 +769,7 @@ unless ($Config{d_wcrtomb}) {
            # mean "don't export"
            next if $seen{$func}++;
            # Should we also skip adding the Perl_ prefix if $flags =~ /o/ ?
-           $func = "Perl_$func" if ($flags =~ /[pX]/ && $func !~ /^Perl_/);
+           $func = "Perl_$func" if ($flags =~ /[psX]/ && $func !~ /^Perl_/);
            ++$export{$func} unless exists $skip{$func};
        }
     }
@@ -757,7 +803,7 @@ try_symbols(qw(
                    PerlIO_tmpfile
             ));
 
-if ($ARGS{PLATFORM} eq 'win32') {
+if (PLATFORM eq 'win32') {
     try_symbols(qw(
                    win32_free_childdir
                    win32_free_childenv
@@ -922,7 +968,7 @@ if ($ARGS{PLATFORM} eq 'win32') {
                     win32_readlink
                 ));
 }
-elsif ($ARGS{PLATFORM} eq 'vms') {
+elsif (PLATFORM eq 'vms') {
     try_symbols(qw(
                      Perl_cando
                      Perl_cando_by_name
@@ -1007,7 +1053,7 @@ elsif ($ARGS{PLATFORM} eq 'vms') {
                      PerlIO_openn
                 ));
 }
-elsif ($ARGS{PLATFORM} eq 'os2') {
+elsif (PLATFORM eq 'os2') {
     try_symbols(qw(
                      ctermid
                      get_sysinfo
@@ -1083,7 +1129,7 @@ elsif ($ARGS{PLATFORM} eq 'os2') {
 # static extensions with -fPIC, but links them to perl, not libperl.so
 # The VMS build scripts don't yet implement static extensions at all.
 
-if ($ARGS{PLATFORM} eq 'win32') {
+if (PLATFORM eq 'win32') {
     # records of type boot_module for statically linked modules (except Dynaloader)
     my $static_ext = $Config{static_ext} // "";
     $static_ext =~ s/\//__/g;
@@ -1092,7 +1138,7 @@ if ($ARGS{PLATFORM} eq 'win32') {
     try_symbols("init_Win32CORE") if $static_ext =~ /\bWin32CORE\b/;
 }
 
-if ($ARGS{PLATFORM} eq 'os2') {
+if (PLATFORM eq 'os2') {
     my (%mapped, @missing);
     open MAP, '<', 'miniperl.map' or die 'Cannot read miniperl.map';
     /^\s*[\da-f:]+\s+(\w+)/i and $mapped{$1}++ foreach <MAP>;
@@ -1110,7 +1156,7 @@ if ($ARGS{PLATFORM} eq 'os2') {
 
 # Start with platform specific headers:
 
-if ($ARGS{PLATFORM} eq 'win32') {
+if (PLATFORM eq 'win32') {
     my $dll = $define{PERL_DLL} ? $define{PERL_DLL} =~ s/\.dll$//ir
        : "perl$Config{api_revision}$Config{api_version}";
     print "LIBRARY $dll\n";
@@ -1121,7 +1167,7 @@ if ($ARGS{PLATFORM} eq 'win32') {
     }
     print "EXPORTS\n";
 }
-elsif ($ARGS{PLATFORM} eq 'os2') {
+elsif (PLATFORM eq 'os2') {
     (my $v = $]) =~ s/(\d\.\d\d\d)(\d\d)$/$1_$2/;
     $v .= '-thread' if $Config{archname} =~ /-thread/;
     (my $dll = $define{PERL_DLL}) =~ s/\.dll$//i;
@@ -1137,7 +1183,7 @@ DATA LOADONCALL NONSHARED MULTIPLE
 EXPORTS
 ---EOP---
 }
-elsif ($ARGS{PLATFORM} eq 'aix') {
+elsif (PLATFORM eq 'aix') {
     my $OSVER = `uname -v`;
     chop $OSVER;
     my $OSREL = `uname -r`;
@@ -1176,7 +1222,7 @@ foreach my $symbol (@symbols) {
 
 # Then platform specific footers.
 
-if ($ARGS{PLATFORM} eq 'os2') {
+if (PLATFORM eq 'os2') {
     print <<EOP;
     dll_perlmain=main
     fill_extLibpath
index 396cf3f..8a1599a 100644 (file)
@@ -410,25 +410,25 @@ union     overhead {
                 u_int  ovu_rmagic;     /* range magic number */
 #endif
         } ovu;
-#define        ov_magic        ovu.ovu_magic
-#define        ov_index        ovu.ovu_index
-#define        ov_size         ovu.ovu_size
-#define        ov_rmagic       ovu.ovu_rmagic
+#define ov_magic        ovu.ovu_magic
+#define ov_index        ovu.ovu_index
+#define ov_size         ovu.ovu_size
+#define ov_rmagic       ovu.ovu_rmagic
 };
 
-#define        MAGIC           0xff            /* magic # on accounting info */
+#define MAGIC           0xff            /* magic # on accounting info */
 #define RMAGIC         0x55555555      /* magic # on range info */
 #define RMAGIC_C       0x55            /* magic # on range info */
 
 #ifdef RCHECK
-#  define      RMAGIC_SZ       sizeof (u_int) /* Overhead at end of bucket */
+#  define RMAGIC_SZ     sizeof (u_int) /* Overhead at end of bucket */
 #  ifdef TWO_POT_OPTIMIZE
 #    define MAX_SHORT_BUCKET (12 * BUCKETS_PER_POW2) /* size-1 fits in short */
 #  else
 #    define MAX_SHORT_BUCKET (13 * BUCKETS_PER_POW2)
 #  endif 
 #else
-#  define      RMAGIC_SZ       0
+#  define RMAGIC_SZ     0
 #endif
 
 #if !defined(PACK_MALLOC) && defined(BUCKETS_ROOT2)
@@ -583,7 +583,7 @@ static const u_short buck_size[MAX_BUCKET_BY_TABLE + 1] =
  *
  * This allows for an additional optimization: the above scheme leads
  * to giant overheads for sizes 128 or more (one whole chunk needs to
- * be sacrifised to keep INDEX).  Instead we use chunks not of size
+ * be sacrificed to keep INDEX).  Instead we use chunks not of size
  * 2^k, but of size 2^k-ALIGN.  If we pack these chunks at the end of
  * the arena, then the beginnings are still in different 2^k-long
  * sections of the arena if k>=7 for ALIGN==4, and k>=8 if ALIGN=8.
@@ -812,7 +812,7 @@ static int  getpages_adjacent(MEM_SIZE require);
  * smallest allocatable block is 8 bytes.  The overhead information
  * precedes the data area returned to the user.
  */
-#define        NBUCKETS (BITS_IN_PTR*BUCKETS_PER_POW2 + 1)
+#define NBUCKETS (BITS_IN_PTR*BUCKETS_PER_POW2 + 1)
 static union overhead *nextf[NBUCKETS];
 
 #if defined(PURIFY) && !defined(USE_PERL_SBRK)
@@ -1059,7 +1059,7 @@ emergency_sbrk(MEM_SIZE size)
 
 #ifdef DEBUGGING
 #undef ASSERT
-#define        ASSERT(p,diag)   if (!(p)) botch(diag,STRINGIFY(p),__FILE__,__LINE__);
+#define ASSERT(p,diag)   if (!(p)) botch(diag,STRINGIFY(p),__FILE__,__LINE__);
 
 static void
 botch(const char *diag, const char *s, const char *file, int line)
@@ -1095,7 +1095,7 @@ botch(const char *diag, const char *s, const char *file, int line)
     }
 }
 #else
-#define        ASSERT(p, diag)
+#define ASSERT(p, diag)
 #endif
 
 #ifdef MALLOC_FILL
index 74f1078..dba2459 100644 (file)
@@ -299,112 +299,15 @@ Perl_sv_catsv_mg(pTHX_ SV *dsv, SV *sstr)
     sv_catsv_flags(dsv,sstr,SV_GMAGIC|SV_SMAGIC);
 }
 
-/*
-=for apidoc_section $SV
-=for apidoc sv_iv
-
-A private implementation of the C<SvIVx> macro for compilers which can't
-cope with complex macro expressions.  Always use the macro instead.
-
-=cut
-*/
-
-IV
-Perl_sv_iv(pTHX_ SV *sv)
-{
-    PERL_ARGS_ASSERT_SV_IV;
-
-    if (SvIOK(sv)) {
-        if (SvIsUV(sv))
-            return (IV)SvUVX(sv);
-        return SvIVX(sv);
-    }
-    return sv_2iv(sv);
-}
-
-/*
-=for apidoc_section $SV
-=for apidoc sv_uv
-
-A private implementation of the C<SvUVx> macro for compilers which can't
-cope with complex macro expressions.  Always use the macro instead.
-
-=cut
-*/
-
-UV
-Perl_sv_uv(pTHX_ SV *sv)
-{
-    PERL_ARGS_ASSERT_SV_UV;
-
-    if (SvIOK(sv)) {
-        if (SvIsUV(sv))
-            return SvUVX(sv);
-        return (UV)SvIVX(sv);
-    }
-    return sv_2uv(sv);
-}
-
-/*
-=for apidoc_section $SV
-=for apidoc sv_nv
-
-A private implementation of the C<SvNVx> macro for compilers which can't
-cope with complex macro expressions.  Always use the macro instead.
-
-=cut
-*/
-
-NV
-Perl_sv_nv(pTHX_ SV *sv)
-{
-    PERL_ARGS_ASSERT_SV_NV;
-
-    if (SvNOK(sv))
-        return SvNVX(sv);
-    return sv_2nv(sv);
-}
-
 /*
 =for apidoc_section $SV
 =for apidoc sv_pv
 
 Use the C<SvPV_nolen> macro instead
 
-=for apidoc_section $SV
-=for apidoc sv_pvn
-
-A private implementation of the C<SvPV> macro for compilers which can't
-cope with complex macro expressions.  Always use the macro instead.
-
 =cut
 */
 
-char *
-Perl_sv_pvn(pTHX_ SV *sv, STRLEN *lp)
-{
-    PERL_ARGS_ASSERT_SV_PVN;
-
-    if (SvPOK(sv)) {
-        *lp = SvCUR(sv);
-        return SvPVX(sv);
-    }
-    return sv_2pv(sv, lp);
-}
-
-
-char *
-Perl_sv_pvn_nomg(pTHX_ SV *sv, STRLEN *lp)
-{
-    PERL_ARGS_ASSERT_SV_PVN_NOMG;
-
-    if (SvPOK(sv)) {
-        *lp = SvCUR(sv);
-        return SvPVX(sv);
-    }
-    return sv_2pv_flags(sv, lp, 0);
-}
-
 /* sv_pv() is now a macro using SvPV_nolen();
  * this function provided for binary compatibility only
  */
@@ -441,7 +344,7 @@ Perl_sv_pvbyte(pTHX_ SV *sv)
 {
     PERL_ARGS_ASSERT_SV_PVBYTE;
 
-    sv_utf8_downgrade(sv, FALSE);
+    (void)sv_utf8_downgrade(sv, FALSE);
     return sv_pv(sv);
 }
 
@@ -451,59 +354,26 @@ Perl_sv_pvbyte(pTHX_ SV *sv)
 
 Use C<SvPVbyte_nolen> instead.
 
-=for apidoc sv_pvbyten
-
-A private implementation of the C<SvPVbyte> macro for compilers
-which can't cope with complex macro expressions.  Always use the macro
-instead.
-
 =cut
 */
 
-char *
-Perl_sv_pvbyten(pTHX_ SV *sv, STRLEN *lp)
-{
-    PERL_ARGS_ASSERT_SV_PVBYTEN;
-
-    sv_utf8_downgrade(sv, FALSE);
-    return sv_pvn(sv,lp);
-}
-
-/* sv_pvutf8 () is now a macro using Perl_sv_2pv_flags();
- * this function provided for binary compatibility only
- */
-
-char *
-Perl_sv_pvutf8(pTHX_ SV *sv)
-{
-    PERL_ARGS_ASSERT_SV_PVUTF8;
-
-    sv_utf8_upgrade(sv);
-    return sv_pv(sv);
-}
-
 /*
 =for apidoc_section $SV
 =for apidoc sv_pvutf8
 
 Use the C<SvPVutf8_nolen> macro instead
 
-=for apidoc sv_pvutf8n
-
-A private implementation of the C<SvPVutf8> macro for compilers
-which can't cope with complex macro expressions.  Always use the macro
-instead.
-
 =cut
 */
 
+
 char *
-Perl_sv_pvutf8n(pTHX_ SV *sv, STRLEN *lp)
+Perl_sv_pvutf8(pTHX_ SV *sv)
 {
-    PERL_ARGS_ASSERT_SV_PVUTF8N;
+    PERL_ARGS_ASSERT_SV_PVUTF8;
 
     sv_utf8_upgrade(sv);
-    return sv_pvn(sv,lp);
+    return sv_pv(sv);
 }
 
 /* sv_utf8_upgrade() is now a macro using sv_utf8_upgrade_flags();
@@ -518,41 +388,6 @@ Perl_sv_utf8_upgrade(pTHX_ SV *sv)
     return sv_utf8_upgrade_flags(sv, SV_GMAGIC);
 }
 
-int
-Perl_fprintf_nocontext(PerlIO *stream, const char *format, ...)
-{
-    int ret = 0;
-    va_list arglist;
-
-    /* Easier to special case this here than in embed.pl. (Look at what it
-       generates for proto.h) */
-#ifdef MULTIPLICITY
-    PERL_ARGS_ASSERT_FPRINTF_NOCONTEXT;
-#endif
-
-    va_start(arglist, format);
-    ret = PerlIO_vprintf(stream, format, arglist);
-    va_end(arglist);
-    return ret;
-}
-
-int
-Perl_printf_nocontext(const char *format, ...)
-{
-    dTHX;
-    va_list arglist;
-    int ret = 0;
-
-#ifdef MULTIPLICITY
-    PERL_ARGS_ASSERT_PRINTF_NOCONTEXT;
-#endif
-
-    va_start(arglist, format);
-    ret = PerlIO_vprintf(PerlIO_stdout(), format, arglist);
-    va_end(arglist);
-    return ret;
-}
-
 #if defined(HUGE_VAL) || (defined(USE_LONG_DOUBLE) && defined(HUGE_VALL))
 /*
  * This hack is to force load of "huge" support from libm.a
@@ -570,24 +405,6 @@ Perl_huge(void)
 }
 #endif
 
-/* compatibility with versions <= 5.003. */
-void
-Perl_gv_fullname(pTHX_ SV *sv, const GV *gv)
-{
-    PERL_ARGS_ASSERT_GV_FULLNAME;
-
-    gv_fullname3(sv, gv, sv == (const SV*)gv ? "*" : "");
-}
-
-/* compatibility with versions <= 5.003. */
-void
-Perl_gv_efullname(pTHX_ SV *sv, const GV *gv)
-{
-    PERL_ARGS_ASSERT_GV_EFULLNAME;
-
-    gv_efullname3(sv, gv, sv == (const SV*)gv ? "*" : "");
-}
-
 void
 Perl_gv_fullname3(pTHX_ SV *sv, const GV *gv, const char *prefix)
 {
@@ -647,36 +464,6 @@ Perl_do_open(pTHX_ GV *gv, const char *name, I32 len, int as_raw,
                     supplied_fp, (SV **) NULL, 0);
 }
 
-bool
-Perl_do_open9(pTHX_ GV *gv, const char *name, I32 len, int
-as_raw,
-              int rawmode, int rawperm, PerlIO *supplied_fp, SV *svs,
-              I32 num_svs)
-{
-    PERL_ARGS_ASSERT_DO_OPEN9;
-
-    PERL_UNUSED_ARG(num_svs);
-    return do_openn(gv, name, len, as_raw, rawmode, rawperm,
-                    supplied_fp, &svs, 1);
-}
-
-int
-Perl_do_binmode(pTHX_ PerlIO *fp, int iotype, int mode)
-{
- /* The old body of this is now in non-LAYER part of perlio.c
-  * This is a stub for any XS code which might have been calling it.
-  */
- const char *name = ":raw";
-
- PERL_ARGS_ASSERT_DO_BINMODE;
-
-#ifdef PERLIO_USING_CRLF
- if (!(mode & O_BINARY))
-     name = ":crlf";
-#endif
- return PerlIO_binmode(aTHX_ fp, iotype, mode, name);
-}
-
 #ifndef OS2
 bool
 Perl_do_aexec(pTHX_ SV *really, SV **mark, SV **sp)
@@ -687,13 +474,6 @@ Perl_do_aexec(pTHX_ SV *really, SV **mark, SV **sp)
 }
 #endif
 
-/* Backwards compatibility. */
-int
-Perl_init_i18nl14n(pTHX_ int printwarn)
-{
-    return init_i18nl10n(printwarn);
-}
-
 bool
 Perl_is_utf8_string_loc(const U8 *s, const STRLEN len, const U8 **ep)
 {
@@ -747,46 +527,6 @@ Perl_sv_nounlocking(pTHX_ SV *sv)
     PERL_UNUSED_ARG(sv);
 }
 
-void
-Perl_save_long(pTHX_ long int *longp)
-{
-    PERL_ARGS_ASSERT_SAVE_LONG;
-
-    SSCHECK(3);
-    SSPUSHLONG(*longp);
-    SSPUSHPTR(longp);
-    SSPUSHUV(SAVEt_LONG);
-}
-
-void
-Perl_save_nogv(pTHX_ GV *gv)
-{
-    PERL_ARGS_ASSERT_SAVE_NOGV;
-
-    SSCHECK(2);
-    SSPUSHPTR(gv);
-    SSPUSHUV(SAVEt_NSTAB);
-}
-
-void
-Perl_save_list(pTHX_ SV **sarg, I32 maxsarg)
-{
-    I32 i;
-
-    PERL_ARGS_ASSERT_SAVE_LIST;
-
-    for (i = 1; i <= maxsarg; i++) {
-        SV *sv;
-        SvGETMAGIC(sarg[i]);
-        sv = newSV(0);
-        sv_setsv_nomg(sv,sarg[i]);
-        SSCHECK(3);
-        SSPUSHPTR(sarg[i]);            /* remember the pointer */
-        SSPUSHPTR(sv);                 /* remember the value */
-        SSPUSHUV(SAVEt_ITEM);
-    }
-}
-
 void
 Perl_sv_usepvn_mg(pTHX_ SV *sv, char *ptr, STRLEN len)
 {
@@ -804,52 +544,6 @@ Perl_sv_usepvn(pTHX_ SV *sv, char *ptr, STRLEN len)
     sv_usepvn_flags(sv,ptr,len, 0);
 }
 
-/*
-=for apidoc_section $pack
-=for apidoc unpack_str
-
-The engine implementing C<unpack()> Perl function.  Note: parameters C<strbeg>,
-C<new_s> and C<ocnt> are not used.  This call should not be used, use
-C<unpackstring> instead.
-
-=cut */
-
-SSize_t
-Perl_unpack_str(pTHX_ const char *pat, const char *patend, const char *s,
-                const char *strbeg, const char *strend, char **new_s, I32 ocnt,
-                U32 flags)
-{
-    PERL_ARGS_ASSERT_UNPACK_STR;
-
-    PERL_UNUSED_ARG(strbeg);
-    PERL_UNUSED_ARG(new_s);
-    PERL_UNUSED_ARG(ocnt);
-
-    return unpackstring(pat, patend, s, strend, flags);
-}
-
-/*
-=for apidoc_section $pack
-=for apidoc pack_cat
-
-The engine implementing C<pack()> Perl function.  Note: parameters
-C<next_in_list> and C<flags> are not used.  This call should not be used; use
-C<L</packlist>> instead.
-
-=cut
-*/
-
-void
-Perl_pack_cat(pTHX_ SV *cat, const char *pat, const char *patend, SV **beglist, SV **endlist, SV ***next_in_list, U32 flags)
-{
-    PERL_ARGS_ASSERT_PACK_CAT;
-
-    PERL_UNUSED_ARG(next_in_list);
-    PERL_UNUSED_ARG(flags);
-
-    packlist(cat, pat, patend, beglist, endlist);
-}
-
 HE *
 Perl_hv_store_ent(pTHX_ HV *hv, SV *keysv, SV *val, U32 hash)
 {
@@ -1081,17 +775,6 @@ Perl_sv_collxfrm(pTHX_ SV *const sv, STRLEN *const nxp)
     return sv_collxfrm_flags(sv, nxp, SV_GMAGIC);
 }
 
-char *
-Perl_mem_collxfrm(pTHX_ const char *input_string, STRLEN len, STRLEN *xlen)
-{
-    /* This function is retained for compatibility in case someone outside core
-     * is using this (but it is undocumented) */
-
-    PERL_ARGS_ASSERT_MEM_COLLXFRM;
-
-    return _mem_collxfrm(input_string, len, xlen, FALSE);
-}
-
 #endif
 
 bool
@@ -1101,36 +784,6 @@ Perl_sv_2bool(pTHX_ SV *const sv)
     return sv_2bool_flags(sv, SV_GMAGIC);
 }
 
-
-/*
-=for apidoc_section $custom
-=for apidoc custom_op_name
-Return the name for a given custom op.  This was once used by the C<OP_NAME>
-macro, but is no longer: it has only been kept for compatibility, and
-should not be used.
-
-=for apidoc custom_op_desc
-Return the description of a given custom op.  This was once used by the
-C<OP_DESC> macro, but is no longer: it has only been kept for
-compatibility, and should not be used.
-
-=cut
-*/
-
-const char*
-Perl_custom_op_name(pTHX_ const OP* o)
-{
-    PERL_ARGS_ASSERT_CUSTOM_OP_NAME;
-    return XopENTRYCUSTOM(o, xop_name);
-}
-
-const char*
-Perl_custom_op_desc(pTHX_ const OP* o)
-{
-    PERL_ARGS_ASSERT_CUSTOM_OP_DESC;
-    return XopENTRYCUSTOM(o, xop_desc);
-}
-
 CV *
 Perl_newSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *block)
 {
@@ -1151,46 +804,6 @@ Perl_sv_copypv(pTHX_ SV *const dsv, SV *const ssv)
     sv_copypv_flags(dsv, ssv, SV_GMAGIC);
 }
 
-UV      /* Made into a function, so can be deprecated */
-NATIVE_TO_NEED(const UV enc, const UV ch)
-{
-    PERL_UNUSED_ARG(enc);
-    return ch;
-}
-
-UV      /* Made into a function, so can be deprecated */
-ASCII_TO_NEED(const UV enc, const UV ch)
-{
-    PERL_UNUSED_ARG(enc);
-    return ch;
-}
-
-/*
-=for apidoc_section $unicode
-=for apidoc is_utf8_char
-
-Tests if some arbitrary number of bytes begins in a valid UTF-8
-character.  Note that an INVARIANT (i.e. ASCII on non-EBCDIC machines)
-character is a valid UTF-8 character.  The actual number of bytes in the UTF-8
-character will be returned if it is valid, otherwise 0.
-
-This function is deprecated due to the possibility that malformed input could
-cause reading beyond the end of the input buffer.  Use L</isUTF8_CHAR>
-instead.
-
-=cut */
-
-STRLEN
-Perl_is_utf8_char(const U8 *s)
-{
-    PERL_ARGS_ASSERT_IS_UTF8_CHAR;
-
-    /* Assumes we have enough space, which is why this is deprecated.  But the
-     * UTF8_CHK_SKIP(s)) makes it safe for the common case of NUL-terminated
-     * strings */
-    return isUTF8_CHAR(s, s + UTF8_CHK_SKIP(s));
-}
-
 /*
 =for apidoc_section $unicode
 =for apidoc is_utf8_char_buf
@@ -1208,20 +821,6 @@ Perl_is_utf8_char_buf(const U8 *buf, const U8* buf_end)
     return isUTF8_CHAR(buf, buf_end);
 }
 
-/* DEPRECATED!
- * Like L</utf8_to_uvuni_buf>(), but should only be called when it is known that
- * there are no malformations in the input UTF-8 string C<s>.  Surrogates,
- * non-character code points, and non-Unicode code points are allowed */
-
-UV
-Perl_valid_utf8_to_uvuni(pTHX_ const U8 *s, STRLEN *retlen)
-{
-    PERL_UNUSED_CONTEXT;
-    PERL_ARGS_ASSERT_VALID_UTF8_TO_UVUNI;
-
-    return NATIVE_TO_UNI(valid_utf8_to_uvchr(s, retlen));
-}
-
 /*
 =for apidoc_section $unicode
 =for apidoc utf8_to_uvuni
@@ -1234,7 +833,7 @@ Some, but not all, UTF-8 malformations are detected, and in fact, some
 malformed input could cause reading beyond the end of the input buffer, which
 is one reason why this function is deprecated.  The other is that only in
 extremely limited circumstances should the Unicode versus native code point be
-of any interest to you.  See L</utf8_to_uvuni_buf> for alternatives.
+of any interest to you.
 
 If C<s> points to one of the detected malformations, and UTF8 warnings are
 enabled, zero is returned and C<*retlen> is set (if C<retlen> doesn't point to
@@ -1256,25 +855,6 @@ Perl_utf8_to_uvuni(pTHX_ const U8 *s, STRLEN *retlen)
     return NATIVE_TO_UNI(valid_utf8_to_uvchr(s, retlen));
 }
 
-/*
-=for apidoc_section $pad
-=for apidoc pad_compname_type
-
-Looks up the type of the lexical variable at position C<po> in the
-currently-compiling pad.  If the variable is typed, the stash of the
-class to which it is typed is returned.  If not, C<NULL> is returned.
-
-Use L<perlintern/C<PAD_COMPNAME_TYPE>> instead.
-
-=cut
-*/
-
-HV *
-Perl_pad_compname_type(pTHX_ const PADOFFSET po)
-{
-    return PAD_COMPNAME_TYPE(po);
-}
-
 /* return ptr to little string in big string, NULL if not found */
 /* The original version of this routine was donated by Corey Satten. */
 
@@ -1349,31 +929,6 @@ Perl_utf8n_to_uvuni(pTHX_ const U8 *s, STRLEN curlen, STRLEN *retlen, U32 flags)
     return NATIVE_TO_UNI(utf8n_to_uvchr(s, curlen, retlen, flags));
 }
 
-/*
-=for apidoc_section $unicode
-=for apidoc uvuni_to_utf8_flags
-
-Instead you almost certainly want to use L<perlapi/uvchr_to_utf8> or
-L<perlapi/uvchr_to_utf8_flags>.
-
-This function is a deprecated synonym for L</uvoffuni_to_utf8_flags>,
-which itself, while not deprecated, should be used only in isolated
-circumstances.  These functions were useful for code that wanted to handle
-both EBCDIC and ASCII platforms with Unicode properties, but starting in Perl
-v5.20, the distinctions between the platforms have mostly been made invisible
-to most code, so this function is quite unlikely to be what you want.
-
-=cut
-*/
-
-U8 *
-Perl_uvuni_to_utf8_flags(pTHX_ U8 *d, UV uv, UV flags)
-{
-    PERL_ARGS_ASSERT_UVUNI_TO_UTF8_FLAGS;
-
-    return uvoffuni_to_utf8_flags(d, uv, flags);
-}
-
 /*
 =for apidoc_section $unicode
 =for apidoc utf8_to_uvchr
index 46d4ab1..c2a4650 100644 (file)
@@ -14,9 +14,5 @@
  * they should be removed from here.
  *
  * HAS_NON_INT_BITFIELDS
- * HAS_STRXFRM_L
- * HAS_NL_LANGINFO_L
- * HAS_FFS
- * HAS_FFSL
  *
  */
index a5be824..bc514c0 100644 (file)
@@ -87,7 +87,7 @@ struct magic_state {
 /* MGS is typedef'ed to struct magic_state in perl.h */
 
 STATIC void
-S_save_magic_flags(pTHX_ I32 mgs_ix, SV *sv, U32 flags)
+S_save_magic_flags(pTHX_ SSize_t mgs_ix, SV *sv, U32 flags)
 {
     MGS* mgs;
     bool bumped = FALSE;
@@ -165,7 +165,7 @@ be >= C<SVt_PVMG>.  See C<L</sv_magic>>.
 int
 Perl_mg_get(pTHX_ SV *sv)
 {
-    const I32 mgs_ix = SSNEW(sizeof(MGS));
+    const SSize_t mgs_ix = SSNEW(sizeof(MGS));
     bool saved = FALSE;
     bool have_new = 0;
     bool taint_only = TRUE; /* the only get method seen is taint */
@@ -269,7 +269,7 @@ Do magic after a value is assigned to the SV.  See C<L</sv_magic>>.
 int
 Perl_mg_set(pTHX_ SV *sv)
 {
-    const I32 mgs_ix = SSNEW(sizeof(MGS));
+    const SSize_t mgs_ix = SSNEW(sizeof(MGS));
     MAGIC* mg;
     MAGIC* nextmg;
 
@@ -297,42 +297,6 @@ Perl_mg_set(pTHX_ SV *sv)
     return 0;
 }
 
-/*
-=for apidoc mg_length
-
-Reports on the SV's length in bytes, calling length magic if available,
-but does not set the UTF8 flag on C<sv>.  It will fall back to 'get'
-magic if there is no 'length' magic, but with no indication as to
-whether it called 'get' magic.  It assumes C<sv> is a C<PVMG> or
-higher.  Use C<sv_len()> instead.
-
-=cut
-*/
-
-U32
-Perl_mg_length(pTHX_ SV *sv)
-{
-    MAGIC* mg;
-    STRLEN len;
-
-    PERL_ARGS_ASSERT_MG_LENGTH;
-
-    for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
-        const MGVTBL * const vtbl = mg->mg_virtual;
-        if (vtbl && vtbl->svt_len) {
-            const I32 mgs_ix = SSNEW(sizeof(MGS));
-            save_magic(mgs_ix, sv);
-            /* omit MGf_GSKIP -- not changed here */
-            len = vtbl->svt_len(aTHX_ sv, mg);
-            restore_magic(INT2PTR(void*, (IV)mgs_ix));
-            return len;
-        }
-    }
-
-    (void)SvPV_const(sv, len);
-    return len;
-}
-
 I32
 Perl_mg_size(pTHX_ SV *sv)
 {
@@ -343,7 +307,7 @@ Perl_mg_size(pTHX_ SV *sv)
     for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
         const MGVTBL* const vtbl = mg->mg_virtual;
         if (vtbl && vtbl->svt_len) {
-            const I32 mgs_ix = SSNEW(sizeof(MGS));
+            const SSize_t mgs_ix = SSNEW(sizeof(MGS));
             I32 len;
             save_magic(mgs_ix, sv);
             /* omit MGf_GSKIP -- not changed here */
@@ -376,7 +340,7 @@ Clear something magical that the SV represents.  See C<L</sv_magic>>.
 int
 Perl_mg_clear(pTHX_ SV *sv)
 {
-    const I32 mgs_ix = SSNEW(sizeof(MGS));
+    const SSize_t mgs_ix = SSNEW(sizeof(MGS));
     MAGIC* mg;
     MAGIC *nextmg;
 
@@ -674,15 +638,15 @@ Perl_magic_regdata_cnt(pTHX_ SV *sv, MAGIC *mg)
             const SSize_t n = (SSize_t)mg->mg_obj;
             if (n == '+') {          /* @+ */
                 /* return the number possible */
-                return RX_NPARENS(rx);
+                return RX_LOGICAL_NPARENS(rx) ? RX_LOGICAL_NPARENS(rx) : RX_NPARENS(rx);
             } else {   /* @- @^CAPTURE  @{^CAPTURE} */
                 I32 paren = RX_LASTPAREN(rx);
 
                 /* return the last filled */
-                while ( paren >= 0
-                        && (RX_OFFS(rx)[paren].start == -1
-                            || RX_OFFS(rx)[paren].end == -1) )
+                while ( paren >= 0 && !RX_OFFS_VALID(rx,paren) )
                     paren--;
+                if (paren && RX_PARNO_TO_LOGICAL(rx))
+                    paren = RX_PARNO_TO_LOGICAL(rx)[paren];
                 if (n == '-') {
                     /* @- */
                     return (U32)paren;
@@ -703,32 +667,42 @@ int
 Perl_magic_regdatum_get(pTHX_ SV *sv, MAGIC *mg)
 {
     PERL_ARGS_ASSERT_MAGIC_REGDATUM_GET;
+    REGEXP * const rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
+
+    if (rx) {
+        const SSize_t n = (SSize_t)mg->mg_obj;
+        /* @{^CAPTURE} does not contain $&, so we need to increment by 1 */
+        const I32 paren = mg->mg_len
+                        + (n == '\003' ? 1 : 0);
+        
+        if (paren < 0)
+            return 0;
 
-    if (PL_curpm) {
-        REGEXP * const rx = PM_GETRE(PL_curpm);
-        if (rx) {
-            const SSize_t n = (SSize_t)mg->mg_obj;
-            /* @{^CAPTURE} does not contain $&, so we need to increment by 1 */
-            const I32 paren = mg->mg_len
-                            + (n == '\003' ? 1 : 0);
-            SSize_t s;
-            SSize_t t;
-            if (paren < 0)
-                return 0;
-            if (paren <= (I32)RX_NPARENS(rx) &&
-                (s = RX_OFFS(rx)[paren].start) != -1 &&
-                (t = RX_OFFS(rx)[paren].end) != -1)
+        SSize_t s;
+        SSize_t t;
+        I32 logical_nparens = (I32)RX_LOGICAL_NPARENS(rx);
+
+        if (!logical_nparens) 
+            logical_nparens = (I32)RX_NPARENS(rx);
+
+        if (n != '+' && n != '-') {
+            CALLREG_NUMBUF_FETCH(rx,paren,sv);
+            return 0;
+        }
+        if (paren <= (I32)logical_nparens) {
+            I32 true_paren = RX_LOGICAL_TO_PARNO(rx)
+                             ? RX_LOGICAL_TO_PARNO(rx)[paren]
+                             : paren;
+            do {
+                if (((s = RX_OFFS_START(rx,true_paren)) != -1) &&
+                    ((t = RX_OFFS_END(rx,true_paren)) != -1))
                 {
                     SSize_t i;
 
-                    if (n == '+')                /* @+ */
+                    if (n == '+')               /* @+ */
                         i = t;
-                    else if (n == '-')           /* @- */
+                    else                        /* @- */
                         i = s;
-                    else {                        /* @^CAPTURE @{^CAPTURE} */
-                        CALLREG_NUMBUF_FETCH(rx,paren,sv);
-                        return 0;
-                    }
 
                     if (RX_MATCH_UTF8(rx)) {
                         const char * const b = RX_SUBBEG(rx);
@@ -741,6 +715,11 @@ Perl_magic_regdatum_get(pTHX_ SV *sv, MAGIC *mg)
                     sv_setuv(sv, i);
                     return 0;
                 }
+                if (RX_PARNO_TO_LOGICAL_NEXT(rx))
+                    true_paren = RX_PARNO_TO_LOGICAL_NEXT(rx)[true_paren];
+                else
+                    break;
+            } while (true_paren);
         }
     }
     sv_set_undef(sv);
@@ -760,15 +739,16 @@ Perl_magic_regdatum_set(pTHX_ SV *sv, MAGIC *mg)
     NORETURN_FUNCTION_END;
 }
 
-#define SvRTRIM(sv) STMT_START { \
-    if (SvPOK(sv)) { \
-        STRLEN len = SvCUR(sv); \
-        char * const p = SvPVX(sv); \
-        while (len > 0 && isSPACE(p[len-1])) \
-           --len; \
-        SvCUR_set(sv, len); \
-        p[len] = '\0'; \
-    } \
+#define SvRTRIM(sv) STMT_START {                \
+    SV * sv_ = sv;                              \
+    if (SvPOK(sv_)) {                           \
+        STRLEN len = SvCUR(sv_);                \
+        char * const p = SvPVX(sv_);            \
+        while (len > 0 && isSPACE(p[len-1]))    \
+           --len;                               \
+        SvCUR_set(sv_, len);                    \
+        p[len] = '\0';                          \
+    }                                           \
 } STMT_END
 
 void
@@ -795,49 +775,51 @@ Perl_emulate_cop_io(pTHX_ const COP *const c, SV *const sv)
     }
 }
 
-STATIC void
-S_fixup_errno_string(pTHX_ SV* sv)
+int
+Perl_get_extended_os_errno(void)
 {
-    /* Do what is necessary to fixup the non-empty string in 'sv' for return to
-     * Perl space. */
 
-    PERL_ARGS_ASSERT_FIXUP_ERRNO_STRING;
+#if defined(VMS)
 
-    assert(SvOK(sv));
+    return (int) vaxc$errno;
 
-    if(strEQ(SvPVX(sv), "")) {
-        sv_catpv(sv, UNKNOWN_ERRNO_MSG);
+#elif defined(OS2)
+
+    if (! (_emx_env & 0x200)) {        /* Under DOS */
+        return (int) errno;
     }
-    else {
 
-        /* In some locales the error string may come back as UTF-8, in which
-         * case we should turn on that flag.  This didn't use to happen, and to
-         * avoid as many possible backward compatibility issues as possible, we
-         * don't turn on the flag unless we have to.  So the flag stays off for
-         * an entirely invariant string.  We assume that if the string looks
-         * like UTF-8 in a single script, it really is UTF-8:  "text in any
-         * other encoding that uses bytes with the high bit set is extremely
-         * unlikely to pass a UTF-8 validity test"
-         * (http://en.wikipedia.org/wiki/Charset_detection).  There is a
-         * potential that we will get it wrong however, especially on short
-         * error message text, so do an additional check. */
-        if ( ! IN_BYTES  /* respect 'use bytes' */
-            && is_utf8_non_invariant_string((U8*) SvPVX_const(sv), SvCUR(sv))
+    if (errno != errno_isOS2) {
+        const int tmp = _syserrno();
+        if (tmp)       /* 2nd call to _syserrno() makes it 0 */
+            Perl_rc = tmp;
+    }
+    return (int) Perl_rc;
 
-#ifdef USE_LOCALE_MESSAGES
+#elif defined(WIN32)
 
-            &&  _is_cur_LC_category_utf8(LC_MESSAGES)
+    return (int) GetLastError();
+
+#else
 
-#else   /* If can't check directly, at least can see if script is consistent,
-           under UTF-8, which gives us an extra measure of confidence. */
+    return (int) errno;
 
-            && isSCRIPT_RUN((const U8 *) SvPVX_const(sv), (U8 *) SvEND(sv),
-                            TRUE) /* Means assume UTF-8 */
 #endif
 
-        ) {
-            SvUTF8_on(sv);
-        }
+}
+
+STATIC void
+S_fixup_errno_string(pTHX_ SV* sv)
+{
+    /* Do what is necessary to fixup the non-empty string in 'sv' for return to
+     * Perl space. */
+
+    PERL_ARGS_ASSERT_FIXUP_ERRNO_STRING;
+
+    assert(SvOK(sv));
+
+    if(strEQ(SvPVX(sv), "")) {
+        sv_catpv(sv, UNKNOWN_ERRNO_MSG);
     }
 }
 
@@ -876,11 +858,16 @@ SV *
 Perl_sv_string_from_errnum(pTHX_ int errnum, SV *tgtsv)
 {
     char const *errstr;
+    utf8ness_t utf8ness;
+
     if(!tgtsv)
         tgtsv = newSV_type_mortal(SVt_PV);
-    errstr = my_strerror(errnum);
+    errstr = my_strerror(errnum, &utf8ness);
     if(errstr) {
         sv_setpv(tgtsv, errstr);
+        if (utf8ness == UTF8NESS_YES) {
+            SvUTF8_on(tgtsv);
+        }
         fixup_errno_string(tgtsv);
     } else {
         SvPVCLEAR(tgtsv);
@@ -899,11 +886,14 @@ Perl_magic_get(pTHX_ SV *sv, MAGIC *mg)
     I32 paren;
     const char *s = NULL;
     REGEXP *rx;
-    const char * const remaining = mg->mg_ptr + 1;
     char nextchar;
 
     PERL_ARGS_ASSERT_MAGIC_GET;
 
+    const char * const remaining = (mg->mg_ptr)
+                                   ? mg->mg_ptr + 1
+                                   : NULL;
+
     if (!mg->mg_ptr) {
         paren = mg->mg_len;
         if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
@@ -937,51 +927,73 @@ Perl_magic_get(pTHX_ SV *sv, MAGIC *mg)
         sv_setiv(sv, (IV)(PL_debug & DEBUG_MASK));
         break;
     case '\005':  /* ^E */
-         if (nextchar != '\0') {
-            if (strEQ(remaining, "NCODING"))
-                sv_set_undef(sv);
-            break;
-        }
+        {
+            if (nextchar != '\0') {
+                if (strEQ(remaining, "NCODING"))
+                    sv_set_undef(sv);
+                break;
+            }
 
 #if defined(VMS) || defined(OS2) || defined(WIN32)
+
+            int extended_errno = get_extended_os_errno();
+
 #   if defined(VMS)
-        {
             char msg[255];
             $DESCRIPTOR(msgdsc,msg);
-            sv_setnv(sv,(NV) vaxc$errno);
-            if (sys$getmsg(vaxc$errno,&msgdsc.dsc$w_length,&msgdsc,0,0) & 1)
+
+            sv_setnv(sv, (NV) extended_errno);
+            if (sys$getmsg(extended_errno,
+                           &msgdsc.dsc$w_length,
+                           &msgdsc,
+                           0, 0)
+                & 1)
                 sv_setpvn(sv,msgdsc.dsc$a_pointer,msgdsc.dsc$w_length);
             else
                 SvPVCLEAR(sv);
-        }
+
 #elif defined(OS2)
-        if (!(_emx_env & 0x200)) {     /* Under DOS */
-            sv_setnv(sv, (NV)errno);
-            sv_setpv(sv, errno ? my_strerror(errno) : "");
-        } else {
-            if (errno != errno_isOS2) {
-                const int tmp = _syserrno();
-                if (tmp)       /* 2nd call to _syserrno() makes it 0 */
-                    Perl_rc = tmp;
+            if (!(_emx_env & 0x200)) { /* Under DOS */
+                sv_setnv(sv, (NV) extended_errno);
+                if (extended_errno) {
+                    utf8ness_t utf8ness;
+                    const char * errstr = my_strerror(extended_errno, &utf8ness);
+
+                    sv_setpv(sv, errstr);
+
+                    if (utf8ness == UTF8NESS_YES) {
+                        SvUTF8_on(sv);
+                    }
+                }
+                else {
+                    SvPVCLEAR(sv);
+                }
+            } else {
+                sv_setnv(sv, (NV) extended_errno);
+                sv_setpv(sv, os2error(extended_errno));
             }
-            sv_setnv(sv, (NV)Perl_rc);
-            sv_setpv(sv, os2error(Perl_rc));
-        }
-        if (SvOK(sv) && strNE(SvPVX(sv), "")) {
-            fixup_errno_string(sv);
-        }
+            if (SvOK(sv) && strNE(SvPVX(sv), "")) {
+                fixup_errno_string(sv);
+            }
+
 #   elif defined(WIN32)
-        {
-            const DWORD dwErr = GetLastError();
-            sv_setnv(sv, (NV)dwErr);
+            const DWORD dwErr = (DWORD) extended_errno;
+            sv_setnv(sv, (NV) dwErr);
             if (dwErr) {
                 PerlProc_GetOSError(sv, dwErr);
                 fixup_errno_string(sv);
+
+#     ifdef USE_LOCALE
+                if (   IN_LOCALE
+                    && get_win32_message_utf8ness(SvPV_nomg_const_nolen(sv)))
+                {
+                    SvUTF8_on(sv);
+                }
+#     endif
             }
             else
                 SvPVCLEAR(sv);
             SetLastError(dwErr);
-        }
 #   else
 #   error Missing code for platform
 #   endif
@@ -990,6 +1002,7 @@ Perl_magic_get(pTHX_ SV *sv, MAGIC *mg)
         break;
 #endif  /* End of platforms with special handling for $^E; others just fall
            through to $! */
+        }
     /* FALLTHROUGH */
 
     case '!':
@@ -1050,6 +1063,14 @@ Perl_magic_get(pTHX_ SV *sv, MAGIC *mg)
             else
                 sv_set_undef(sv);
         }
+        else if (strEQ(remaining, "AST_SUCCESSFUL_PATTERN")) {
+            if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
+                sv_setrv_inc(sv, MUTABLE_SV(rx));
+                sv_rvweaken(sv);
+            }
+            else
+                sv_set_undef(sv);
+        }
         break;
     case '\017':               /* ^O & ^OPEN */
         if (nextchar == '\0') {
@@ -1120,23 +1141,31 @@ Perl_magic_get(pTHX_ SV *sv, MAGIC *mg)
                 sv_setpvn(sv, WARN_ALLstring, WARNsize);
             }
             else {
-                sv_setpvn(sv, (char *) (PL_compiling.cop_warnings + 1),
-                          *PL_compiling.cop_warnings);
+                sv_setpvn(sv, PL_compiling.cop_warnings,
+                        RCPV_LEN(PL_compiling.cop_warnings));
             }
         }
         break;
-    case '+':
+    case '+':                   /* $+ */
         if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
             paren = RX_LASTPAREN(rx);
-            if (paren)
+            if (paren) {
+                I32 *parno_to_logical = RX_PARNO_TO_LOGICAL(rx);
+                if (parno_to_logical)
+                    paren = parno_to_logical[paren];
                 goto do_numbuf_fetch;
+            }
         }
         goto set_undef;
-    case '\016':               /* ^N */
+    case '\016':               /* $^N */
         if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
             paren = RX_LASTCLOSEPAREN(rx);
-            if (paren)
+            if (paren) {
+                I32 *parno_to_logical = RX_PARNO_TO_LOGICAL(rx);
+                if (parno_to_logical)
+                    paren = parno_to_logical[paren];
                 goto do_numbuf_fetch;
+            }
         }
         goto set_undef;
     case '.':
@@ -1296,7 +1325,7 @@ Perl_magic_setenv(pTHX_ SV *sv, MAGIC *mg)
         /* defined environment variables are byte strings; unfortunately
            there is no SvPVbyte_force_nomg(), so we must do this piecewise */
         (void)SvPV_force_nomg_nolen(sv);
-        sv_utf8_downgrade(sv, /* fail_ok */ TRUE);
+        (void)sv_utf8_downgrade(sv, /* fail_ok */ TRUE);
         if (SvUTF8(sv)) {
             Perl_ck_warner_d(aTHX_ packWARN(WARN_UTF8), "Wide character in %s", "setenv");
             SvUTF8_off(sv);
@@ -1356,6 +1385,15 @@ Perl_magic_setenv(pTHX_ SV *sv, MAGIC *mg)
             const char path_sep = ':';
 #endif
 
+#ifndef __VMS
+            /* Does this apply for VMS?
+             * Empty PATH on linux is treated same as ".", which is forbidden
+             * under taint. So check if the PATH variable is empty. */
+            if (!len) {
+                MgTAINTEDDIR_on(mg);
+                return 0;
+            }
+#endif
             /* set MGf_TAINTEDDIR if any component of the new path is
              * relative or world-writeable */
             while (s < strend) {
@@ -1372,7 +1410,8 @@ Perl_magic_setenv(pTHX_ SV *sv, MAGIC *mg)
                       /* Using Unix separator, e.g. under bash, so act line Unix */
                       || (PL_perllib_sep == ':' && *tmpbuf != '/')
 #else
-                      || *tmpbuf != '/'       /* no starting slash -- assume relative path */
+                      || *tmpbuf != '/' /* no starting slash -- assume relative path */
+                      || s == strend    /* trailing empty component -- same as "." */
 #endif
                       || (PerlLIO_stat(tmpbuf, &st) == 0 && (st.st_mode & 2)) ) {
                     MgTAINTEDDIR_on(mg);
@@ -1706,7 +1745,8 @@ Perl_magic_setsig(pTHX_ SV *sv, MAGIC *mg)
                For magic_clearsig, we don't change the warnings handler if it's
                set to the &PL_warnhook.  */
             svp = &PL_warnhook;
-        } else if (sv) {
+        }
+        else if (sv) {
             SV *tmp = sv_newmortal();
             Perl_croak(aTHX_ "No such hook: %s",
                                 pv_pretty(tmp, s, len, 0, NULL, NULL, 0));
@@ -1778,8 +1818,9 @@ Perl_magic_setsig(pTHX_ SV *sv, MAGIC *mg)
         if (i) {
             (void)rsignal(i, PL_csighandlerp);
         }
-        else
+        else {
             *svp = SvREFCNT_inc_simple_NN(sv);
+        }
     } else {
         if (sv && SvOK(sv)) {
             s = SvPV_force(sv, len);
@@ -1849,6 +1890,92 @@ Perl_magic_setsigall(pTHX_ SV* sv, MAGIC* mg)
     return 0;
 }
 
+int
+Perl_magic_clearhook(pTHX_ SV *sv, MAGIC *mg)
+{
+    PERL_ARGS_ASSERT_MAGIC_CLEARHOOK;
+
+    magic_sethook(NULL, mg);
+    return sv_unmagic(sv, mg->mg_type);
+}
+
+/* sv of NULL signifies that we're acting as magic_clearhook.  */
+int
+Perl_magic_sethook(pTHX_ SV *sv, MAGIC *mg)
+{
+    SV** svp = NULL;
+    STRLEN len;
+    const char *s = MgPV_const(mg,len);
+
+    PERL_ARGS_ASSERT_MAGIC_SETHOOK;
+
+    if (memEQs(s, len, "require__before")) {
+        svp = &PL_hook__require__before;
+    }
+    else if (memEQs(s, len, "require__after")) {
+        svp = &PL_hook__require__after;
+    }
+    else {
+        SV *tmp = sv_newmortal();
+        Perl_croak(aTHX_ "Attempt to set unknown hook '%s' in %%{^HOOK}",
+                            pv_pretty(tmp, s, len, 0, NULL, NULL, 0));
+    }
+    if (sv && SvOK(sv) && (!SvROK(sv) || SvTYPE(SvRV(sv))!= SVt_PVCV))
+        croak("${^HOOK}{%.*s} may only be a CODE reference or undef", (int)len, s);
+
+    if (svp) {
+        if (*svp)
+            SvREFCNT_dec(*svp);
+
+        if (sv)
+            *svp = SvREFCNT_inc_simple_NN(sv);
+        else
+            *svp = NULL;
+    }
+
+    return 0;
+}
+
+int
+Perl_magic_sethookall(pTHX_ SV* sv, MAGIC* mg)
+{
+    PERL_ARGS_ASSERT_MAGIC_SETHOOKALL;
+    PERL_UNUSED_ARG(mg);
+
+    if (PL_localizing == 1) {
+        SAVEGENERICSV(PL_hook__require__before);
+        PL_hook__require__before = NULL;
+        SAVEGENERICSV(PL_hook__require__after);
+        PL_hook__require__after = NULL;
+    }
+    else
+    if (PL_localizing == 2) {
+        HV* hv = (HV*)sv;
+        HE* current;
+        hv_iterinit(hv);
+        while ((current = hv_iternext(hv))) {
+            SV* hookelem = hv_iterval(hv, current);
+            mg_set(hookelem);
+        }
+    }
+    return 0;
+}
+
+int
+Perl_magic_clearhookall(pTHX_ SV* sv, MAGIC* mg)
+{
+    PERL_ARGS_ASSERT_MAGIC_CLEARHOOKALL;
+    PERL_UNUSED_ARG(mg);
+    PERL_UNUSED_ARG(sv);
+
+    SvREFCNT_dec_set_NULL(PL_hook__require__before);
+
+    SvREFCNT_dec_set_NULL(PL_hook__require__after);
+
+    return 0;
+}
+
+
 int
 Perl_magic_setisa(pTHX_ SV *sv, MAGIC *mg)
 {
@@ -1886,7 +2013,7 @@ Perl_magic_clearisa(pTHX_ SV *sv, MAGIC *mg)
         I32 items = AvFILLp((AV *)mg->mg_obj) + 1;
         while (items--) {
             stash = GvSTASH((GV *)*svp++);
-            if (stash && HvENAME(stash)) mro_isa_changed_in(stash);
+            if (stash && HvHasENAME(stash)) mro_isa_changed_in(stash);
         }
 
         return 0;
@@ -1898,7 +2025,7 @@ Perl_magic_clearisa(pTHX_ SV *sv, MAGIC *mg)
 
     /* The stash may have been detached from the symbol table, so check its
        name before doing anything. */
-    if (stash && HvENAME_get(stash))
+    if (stash && HvHasENAME(stash))
         mro_isa_changed_in(stash);
 
     return 0;
@@ -3040,7 +3167,7 @@ Perl_magic_set(pTHX_ SV *sv, MAGIC *mg)
         else if (strEQ(mg->mg_ptr+1, "ARNING_BITS")) {
             if ( ! (PL_dowarn & G_WARN_ALL_MASK)) {
                 if (!SvPOK(sv)) {
-            free_and_set_cop_warnings(&PL_compiling, pWARN_STD);
+                    free_and_set_cop_warnings(&PL_compiling, pWARN_STD);
                     break;
                 }
                 {
@@ -3052,23 +3179,24 @@ Perl_magic_set(pTHX_ SV *sv, MAGIC *mg)
                         not_all |= ptr[i] ^ 0x55;
                     }
                     if (!not_none) {
-                free_and_set_cop_warnings(&PL_compiling, pWARN_NONE);
+                        free_and_set_cop_warnings(&PL_compiling, pWARN_NONE);
                     } else if (len >= WARNsize && !not_all) {
-                free_and_set_cop_warnings(&PL_compiling, pWARN_ALL);
-                    PL_dowarn |= G_WARN_ONCE ;
-                }
-            else {
-                             STRLEN len;
-                             const char *const p = SvPV_const(sv, len);
+                        free_and_set_cop_warnings(&PL_compiling, pWARN_ALL);
+                        PL_dowarn |= G_WARN_ONCE ;
+                    }
+                    else {
+                        STRLEN len;
+                        const char *const p = SvPV_const(sv, len);
 
-                             PL_compiling.cop_warnings
-                                 = Perl_new_warnings_bitfield(aTHX_ PL_compiling.cop_warnings,
-                                                         p, len);
+                        free_and_set_cop_warnings(
+                            &PL_compiling,
+                            Perl_new_warnings_bitfield(aTHX_ PL_compiling.cop_warnings,
+                                                     p, len)
+                        );
 
-                     if (isWARN_on(PL_compiling.cop_warnings, WARN_ONCE))
+                        if (isWARN_on(PL_compiling.cop_warnings, WARN_ONCE))
                             PL_dowarn |= G_WARN_ONCE ;
-               }
-
+                    }
                 }
             }
         }
index 7eb9033..c63c690 100644 (file)
@@ -1,4 +1,4 @@
-/* -*- buffer-read-only: t -*-
+/* -*- mode: C; buffer-read-only: t -*-
  *
  *    mg_names.inc
  * !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!!
        { PERL_MAGIC_vstring,        "vstring(V)" },
        { PERL_MAGIC_vec,            "vec(v)" },
        { PERL_MAGIC_utf8,           "utf8(w)" },
+       { PERL_MAGIC_destruct,       "destruct(X)" },
        { PERL_MAGIC_substr,         "substr(x)" },
        { PERL_MAGIC_nonelem,        "nonelem(Y)" },
        { PERL_MAGIC_defelem,        "defelem(y)" },
+       { PERL_MAGIC_hook,           "hook(Z)" },
+       { PERL_MAGIC_hookelem,       "hookelem(z)" },
        { PERL_MAGIC_lvref,          "lvref(\\)" },
        { PERL_MAGIC_checkcall,      "checkcall(])" },
+       { PERL_MAGIC_extvalue,       "extvalue(^)" },
        { PERL_MAGIC_ext,            "ext(~)" },
 
-/* ex: set ro: */
+/* ex: set ro ft=c: */
index c55e643..eddcbf5 100644 (file)
@@ -1,4 +1,4 @@
-/* -*- buffer-read-only: t -*-
+/* -*- mode: C; buffer-read-only: t -*-
  *
  *    mg_raw.h
  * !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!!
       "/* vec 'v' vec() lvalue */" },
     { 'w', "want_vtbl_utf8 | PERL_MAGIC_VALUE_MAGIC",
       "/* utf8 'w' Cached UTF-8 information */" },
+    { 'X', "want_vtbl_destruct | PERL_MAGIC_VALUE_MAGIC",
+      "/* destruct 'X' destruct callback */" },
     { 'x', "want_vtbl_substr | PERL_MAGIC_VALUE_MAGIC",
       "/* substr 'x' substr() lvalue */" },
     { 'Y', "want_vtbl_nonelem | PERL_MAGIC_VALUE_MAGIC",
       "/* nonelem 'Y' Array element that does not exist */" },
     { 'y', "want_vtbl_defelem | PERL_MAGIC_VALUE_MAGIC",
       "/* defelem 'y' Shadow \"foreach\" iterator variable / smart parameter vivification */" },
+    { 'Z', "want_vtbl_hook",
+      "/* hook 'Z' %{^HOOK} hash */" },
+    { 'z', "want_vtbl_hookelem",
+      "/* hookelem 'z' %{^HOOK} hash element */" },
     { '\\', "want_vtbl_lvref",
       "/* lvref '\\' Lvalue reference constructor */" },
     { ']', "want_vtbl_checkcall | PERL_MAGIC_VALUE_MAGIC",
       "/* checkcall ']' Inlining/mutation of call to this CV */" },
+    { '^', "magic_vtable_max | PERL_MAGIC_READONLY_ACCEPTABLE | PERL_MAGIC_VALUE_MAGIC",
+      "/* extvalue '^' Value magic available for use by extensions */" },
     { '~', "magic_vtable_max | PERL_MAGIC_READONLY_ACCEPTABLE",
-      "/* ext '~' Available for use by extensions */" },
+      "/* ext '~' Variable magic available for use by extensions */" },
 
-/* ex: set ro: */
+/* ex: set ro ft=c: */
index 8f59573..80f265f 100644 (file)
@@ -1,4 +1,4 @@
-/* -*- buffer-read-only: t -*-
+/* -*- mode: C; buffer-read-only: t -*-
  *
  *    mg_vtable.h
  * !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!!
 #define PERL_MAGIC_vstring        'V' /* SV was vstring literal */
 #define PERL_MAGIC_vec            'v' /* vec() lvalue */
 #define PERL_MAGIC_utf8           'w' /* Cached UTF-8 information */
+#define PERL_MAGIC_destruct       'X' /* destruct callback */
 #define PERL_MAGIC_substr         'x' /* substr() lvalue */
 #define PERL_MAGIC_nonelem        'Y' /* Array element that does not exist */
 #define PERL_MAGIC_defelem        'y' /* Shadow "foreach" iterator variable /
                                          smart parameter vivification */
+#define PERL_MAGIC_hook           'Z' /* %{^HOOK} hash */
+#define PERL_MAGIC_hookelem       'z' /* %{^HOOK} hash element */
 #define PERL_MAGIC_lvref          '\\' /* Lvalue reference constructor */
 #define PERL_MAGIC_checkcall      ']' /* Inlining/mutation of call to this CV */
-#define PERL_MAGIC_ext            '~' /* Available for use by extensions */
+#define PERL_MAGIC_extvalue       '^' /* Value magic available for use by extensions */
+#define PERL_MAGIC_ext            '~' /* Variable magic available for use by extensions */
 
 enum {         /* pass one of these to get_vtbl */
     want_vtbl_arylen,
@@ -68,10 +72,13 @@ enum {              /* pass one of these to get_vtbl */
     want_vtbl_dbline,
     want_vtbl_debugvar,
     want_vtbl_defelem,
+    want_vtbl_destruct,
     want_vtbl_env,
     want_vtbl_envelem,
     want_vtbl_hints,
     want_vtbl_hintselem,
+    want_vtbl_hook,
+    want_vtbl_hookelem,
     want_vtbl_isa,
     want_vtbl_isaelem,
     want_vtbl_lvref,
@@ -106,10 +113,13 @@ EXTCONST char * const PL_magic_vtable_names[magic_vtable_max] = {
     "dbline",
     "debugvar",
     "defelem",
+    "destruct",
     "env",
     "envelem",
     "hints",
     "hintselem",
+    "hook",
+    "hookelem",
     "isa",
     "isaelem",
     "lvref",
@@ -167,10 +177,13 @@ EXT_MGVTBL PL_magic_vtables[magic_vtable_max] = {
   { 0, Perl_magic_setdbline, 0, 0, 0, 0, 0, 0 },
   { Perl_magic_getdebugvar, Perl_magic_setdebugvar, 0, 0, 0, 0, 0, 0 },
   { Perl_magic_getdefelem, Perl_magic_setdefelem, 0, 0, 0, 0, 0, 0 },
+  { 0, 0, 0, 0, Perl_magic_freedestruct, 0, 0, 0 },
   { 0, Perl_magic_set_all_env, 0, Perl_magic_clear_all_env, 0, 0, 0, 0 },
   { 0, Perl_magic_setenv, 0, Perl_magic_clearenv, 0, 0, 0, 0 },
   { 0, 0, 0, Perl_magic_clearhints, 0, 0, 0, 0 },
   { 0, Perl_magic_sethint, 0, Perl_magic_clearhint, 0, 0, 0, 0 },
+  { 0, Perl_magic_sethookall, 0, Perl_magic_clearhookall, 0, 0, 0, 0 },
+  { 0, Perl_magic_sethook, 0, Perl_magic_clearhook, 0, 0, 0, 0 },
   { 0, Perl_magic_setisa, 0, Perl_magic_clearisa, 0, 0, 0, 0 },
   { 0, Perl_magic_setisa, 0, 0, 0, 0, 0, 0 },
   { 0, Perl_magic_setlvref, 0, 0, 0, 0, 0, 0 },
@@ -213,11 +226,14 @@ EXT_MGVTBL PL_magic_vtables[magic_vtable_max];
 #define PL_vtbl_dbline PL_magic_vtables[want_vtbl_dbline]
 #define PL_vtbl_debugvar PL_magic_vtables[want_vtbl_debugvar]
 #define PL_vtbl_defelem PL_magic_vtables[want_vtbl_defelem]
+#define PL_vtbl_destruct PL_magic_vtables[want_vtbl_destruct]
 #define PL_vtbl_env PL_magic_vtables[want_vtbl_env]
 #define PL_vtbl_envelem PL_magic_vtables[want_vtbl_envelem]
 #define PL_vtbl_fm PL_magic_vtables[want_vtbl_fm]
 #define PL_vtbl_hints PL_magic_vtables[want_vtbl_hints]
 #define PL_vtbl_hintselem PL_magic_vtables[want_vtbl_hintselem]
+#define PL_vtbl_hook PL_magic_vtables[want_vtbl_hook]
+#define PL_vtbl_hookelem PL_magic_vtables[want_vtbl_hookelem]
 #define PL_vtbl_isa PL_magic_vtables[want_vtbl_isa]
 #define PL_vtbl_isaelem PL_magic_vtables[want_vtbl_isaelem]
 #define PL_vtbl_lvref PL_magic_vtables[want_vtbl_lvref]
@@ -240,4 +256,4 @@ EXT_MGVTBL PL_magic_vtables[magic_vtable_max];
 #define PL_vtbl_uvar PL_magic_vtables[want_vtbl_uvar]
 #define PL_vtbl_vec PL_magic_vtables[want_vtbl_vec]
 
-/* ex: set ro: */
+/* ex: set ro ft=c: */
index 4edd4d1..f8e0fd2 100644 (file)
@@ -1,4 +1,4 @@
-/* -*- buffer-read-only: t -*-
+/* -*- mode: C; buffer-read-only: t -*-
    !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!!
    This file is built by regen/miniperlmain.pl and ExtUtils::Miniperl.
    Any changes made here will be lost!
@@ -73,9 +73,6 @@ main(int argc, char **argv, char **env)
 #ifndef NO_ENV_ARRAY_IN_MAIN
     PERL_UNUSED_ARG(env);
 #endif
-#ifndef PERL_USE_SAFE_PUTENV
-    PL_use_safe_putenv = FALSE;
-#endif /* PERL_USE_SAFE_PUTENV */
 
     /* if user wants control of gprof profiling off by default */
     /* noop unless Configure is given -Accflags=-DPERL_GPROF_CONTROL */
@@ -112,8 +109,29 @@ main(int argc, char **argv, char **env)
        PL_perl_destruct_level = 0;
     }
     PL_exit_flags |= PERL_EXIT_DESTRUCT_END;
-    if (!perl_parse(my_perl, xs_init, argc, argv, (char **)NULL))
+    if (!perl_parse(my_perl, xs_init, argc, argv, (char **)NULL)) {
+
+        /* perl_parse() may end up starting its own run loops, which
+         * might end up "leaking" PL_restartop from the parse phase into
+         * the run phase which then ends up confusing run_body(). This
+         * leakage shouldn't happen and if it does its a bug.
+         *
+         * Note we do not do this assert in perl_run() or perl_parse()
+         * as there are modules out there which explicitly set
+         * PL_restartop before calling perl_run() directly from XS code
+         * (Coro), and it is conceivable PL_restartop could be set prior
+         * to calling perl_parse() by XS code as well.
+         *
+         * What we want to check is that the top level perl_parse(),
+         * perl_run() pairing does not allow a leaking PL_restartop, as
+         * that indicates a bug in perl. By putting the assert here we
+         * can validate that Perl itself is operating correctly without
+         * risking breakage to XS code under DEBUGGING. - Yves
+         */
+        assert(!PL_restartop);
+
         perl_run(my_perl);
+    }
 
 #ifndef PERL_MICRO
     /* Unregister our signal handler before destroying my_perl */
@@ -128,19 +146,6 @@ main(int argc, char **argv, char **env)
 
     perl_free(my_perl);
 
-#if defined(USE_ENVIRON_ARRAY) && defined(PERL_TRACK_MEMPOOL) && !defined(NO_ENV_ARRAY_IN_MAIN)
-    /*
-     * The old environment may have been freed by perl_free()
-     * when PERL_TRACK_MEMPOOL is defined, but without having
-     * been restored by perl_destruct() before (this is only
-     * done if destruct_level > 0).
-     *
-     * It is important to have a valid environment for atexit()
-     * routines that are eventually called.
-     */
-    environ = env;
-#endif
-
     PERL_SYS_TERM();
 
     exit(exitstatus);
@@ -156,4 +161,4 @@ xs_init(pTHX)
     PERL_UNUSED_CONTEXT;
 }
 
-/* ex: set ro: */
+/* ex: set ro ft=c: */
index 332327e..a8d1a3a 100755 (executable)
@@ -1,3 +1,5 @@
+#!perl
+
 use strict;
 use warnings;
 
index 42a11af..f106831 100644 (file)
@@ -28,6 +28,7 @@ Also see L<perlmroapi>.
 
 #include "EXTERN.h"
 #define PERL_IN_MRO_C
+#define PERL_IN_MRO_CORE_C
 #include "perl.h"
 
 static const struct mro_alg dfs_alg =
@@ -215,7 +216,8 @@ Perl_mro_meta_dup(pTHX_ struct mro_meta* smeta, CLONE_PARAMS* param)
 =for apidoc mro_get_linear_isa_dfs
 
 Returns the Depth-First Search linearization of C<@ISA>
-the given stash.  The return value is a read-only AV*.
+the given stash.  The return value is a read-only AV*
+whose elements are string SVs giving class names.
 C<level> should be 0 (it is used internally in this
 function's recursion).
 
@@ -268,7 +270,7 @@ S_mro_get_linear_isa_dfs(pTHX_ HV *stash, U32 level)
     /* We use this later in this function, but don't need a reference to it
        beyond the end of this function, so reference count is fine.  */
     our_name = newSVhek(stashhek);
-    av_push(retval, our_name); /* add ourselves at the top */
+    av_push_simple(retval, our_name); /* add ourselves at the top */
 
     /* fetch our @ISA */
     gvp = (GV**)hv_fetchs(stash, "ISA", FALSE);
@@ -326,7 +328,7 @@ S_mro_get_linear_isa_dfs(pTHX_ HV *stash, U32 level)
 
                         HeVAL(he) = &PL_sv_undef;
                         sv_sethek(val, key);
-                        av_push(retval, val);
+                        av_push_simple(retval, val);
                     }
                 }
             } else {
@@ -358,7 +360,7 @@ S_mro_get_linear_isa_dfs(pTHX_ HV *stash, U32 level)
                        as if we'd copied it from what theirs should be.  */
                     stored = MUTABLE_HV(newSV_type_mortal(SVt_PVHV));
                     (void) hv_stores(stored, "UNIVERSAL", &PL_sv_undef);
-                    av_push(retval,
+                    av_push_simple(retval,
                             newSVhek(HeKEY_hek(hv_store_ent(stored, sv,
                                                             &PL_sv_undef, 0))));
                 }
@@ -398,7 +400,7 @@ S_mro_get_linear_isa_dfs(pTHX_ HV *stash, U32 level)
 Returns the mro linearisation for the given stash.  By default, this
 will be whatever C<mro_get_linear_isa_dfs> returns unless some
 other MRO is in effect for the stash.  The return value is a
-read-only AV*.
+read-only AV* whose values are string SVs giving class names.
 
 You are responsible for C<SvREFCNT_inc()> on the
 return value if you plan to store it anywhere
@@ -415,7 +417,7 @@ Perl_mro_get_linear_isa(pTHX_ HV *stash)
     AV *isa;
 
     PERL_ARGS_ASSERT_MRO_GET_LINEAR_ISA;
-    if(!SvOOK(stash))
+    if(!HvHasAUX(stash))
         Perl_croak(aTHX_ "Can't linearize anonymous symbol table");
 
     meta = HvMROMETA(stash);
@@ -425,8 +427,8 @@ Perl_mro_get_linear_isa(pTHX_ HV *stash)
 
     if (meta->mro_which != &dfs_alg) { /* skip for dfs, for speed */
         SV * const namesv =
-            (HvENAME(stash)||HvNAME(stash))
-              ? newSVhek(HvENAME_HEK(stash)
+            (HvHasENAME_HEK(stash) || HvHasNAME(stash))
+              ? newSVhek(HvHasENAME_HEK(stash)
                           ? HvENAME_HEK(stash)
                           : HvNAME_HEK(stash))
               : NULL;
@@ -787,12 +789,12 @@ Perl_mro_package_moved(pTHX_ HV * const stash, HV * const oldstash,
     if(!(flags & 1)) {
         SV **svp;
         if(
-         !GvSTASH(gv) || !HvENAME(GvSTASH(gv)) ||
+         !GvSTASH(gv) || !HvHasENAME(GvSTASH(gv)) ||
          !(svp = hv_fetchhek(GvSTASH(gv), GvNAME_HEK(gv), 0)) ||
          *svp != (SV *)gv
         ) return;
     }
-    assert(SvOOK(GvSTASH(gv)));
+    assert(HvHasAUX(GvSTASH(gv)));
     assert(GvNAMELEN(gv));
     assert(GvNAME(gv)[GvNAMELEN(gv) - 1] == ':');
     assert(GvNAMELEN(gv) == 1 || GvNAME(gv)[GvNAMELEN(gv) - 2] == ':');
@@ -812,7 +814,7 @@ Perl_mro_package_moved(pTHX_ HV * const stash, HV * const oldstash,
                 : newSVpvs_flags("",  SVs_TEMP);
         }
         else {
-            namesv = sv_2mortal(newSVhek(*namep));
+            namesv = newSVhek_mortal(*namep);
             if (GvNAMELEN(gv) == 1) sv_catpvs(namesv, ":");
             else                    sv_catpvs(namesv, "::");
         }
@@ -846,7 +848,7 @@ Perl_mro_package_moved(pTHX_ HV * const stash, HV * const oldstash,
                     GvNAMEUTF8(gv) ? SV_CATUTF8 : SV_CATBYTES
                 );
             }
-            av_push((AV *)namesv, aname);
+            av_push_simple((AV *)namesv, aname);
         }
     }
 
@@ -903,7 +905,7 @@ S_mro_gather_and_rename(pTHX_ HV * const stashes, HV * const seen_stashes,
     HE *entry;
     I32 riter = -1;
     I32 items = 0;
-    const bool stash_had_name = stash && HvENAME(stash);
+    const bool stash_had_name = stash && HvHasENAME(stash);
     bool fetched_isarev = FALSE;
     HV *seen = NULL;
     HV *isarev = NULL;
@@ -1163,7 +1165,7 @@ S_mro_gather_and_rename(pTHX_ HV * const stashes, HV * const seen_stashes,
                             stashentry && *stashentry && isGV(*stashentry)
                          && (substash = GvHV(*stashentry))
                         )
-                     || (oldsubstash && HvENAME_get(oldsubstash))
+                     || (oldsubstash && HvHasENAME(oldsubstash))
                     )
                     {
                         /* Add :: and the key (minus the trailing ::)
@@ -1186,7 +1188,7 @@ S_mro_gather_and_rename(pTHX_ HV * const stashes, HV * const seen_stashes,
                                            ? SV_CATUTF8 : SV_CATBYTES
                                     );
                                 }
-                                av_push((AV *)subname, aname);
+                                av_push_simple((AV *)subname, aname);
                             }
                         }
                         else {
@@ -1269,7 +1271,7 @@ S_mro_gather_and_rename(pTHX_ HV * const stashes, HV * const seen_stashes,
                                            ? SV_CATUTF8 : SV_CATBYTES
                                     );
                                 }
-                                av_push((AV *)subname, aname);
+                                av_push_simple((AV *)subname, aname);
                             }
                         }
                         else {
@@ -1327,17 +1329,18 @@ via, C<mro::method_changed_in(classname)>.
 void
 Perl_mro_method_changed_in(pTHX_ HV *stash)
 {
-    const char * const stashname = HvENAME_get(stash);
-    const STRLEN stashname_len = HvENAMELEN_get(stash);
-
-    SV ** const svp = hv_fetchhek(PL_isarev, HvENAME_HEK(stash), 0);
-    HV * const isarev = svp ? MUTABLE_HV(*svp) : NULL;
-
     PERL_ARGS_ASSERT_MRO_METHOD_CHANGED_IN;
 
+    const char * const stashname = HvENAME_get(stash);
+
     if(!stashname)
         Perl_croak(aTHX_ "Can't call mro_method_changed_in() on anonymous symbol table");
 
+    const STRLEN stashname_len = HvENAMELEN_get(stash);
+
+    SV ** const svp = hv_fetchhek(PL_isarev, HvENAME_HEK_NN(stash), 0);
+    HV * const isarev = svp ? MUTABLE_HV(*svp) : NULL;
+
     /* Inc the package generation, since a local method changed */
     HvMROMETA(stash)->pkg_gen++;
 
index 41940a4..c22e4ef 100644 (file)
@@ -31,8 +31,8 @@ values, including such things as replacements for the OS's atof() function
 PERL_STATIC_INLINE NV
 S_strtod(pTHX_ const char * const s, char ** e)
 {
-    NV result;
     DECLARATION_FOR_LC_NUMERIC_MANIPULATION;
+    NV result;
 
     STORE_LC_NUMERIC_SET_TO_NEEDED();
 
@@ -426,42 +426,42 @@ Perl_grok_bin_oct_hex(pTHX_ const char *start,
       case 0:
           return 0;
       default:
-          if (UNLIKELY(! _generic_isCC(*s, class_bit)))  break;
+          if (UNLIKELY(! generic_isCC_(*s, class_bit)))  break;
           value = (value << shift) | XDIGIT_VALUE(*s);
           s++;
           /* FALLTHROUGH */
       case 7:
-          if (UNLIKELY(! _generic_isCC(*s, class_bit)))  break;
+          if (UNLIKELY(! generic_isCC_(*s, class_bit)))  break;
           value = (value << shift) | XDIGIT_VALUE(*s);
           s++;
           /* FALLTHROUGH */
       case 6:
-          if (UNLIKELY(! _generic_isCC(*s, class_bit)))  break;
+          if (UNLIKELY(! generic_isCC_(*s, class_bit)))  break;
           value = (value << shift) | XDIGIT_VALUE(*s);
           s++;
           /* FALLTHROUGH */
       case 5:
-          if (UNLIKELY(! _generic_isCC(*s, class_bit)))  break;
+          if (UNLIKELY(! generic_isCC_(*s, class_bit)))  break;
           value = (value << shift) | XDIGIT_VALUE(*s);
           s++;
           /* FALLTHROUGH */
       case 4:
-          if (UNLIKELY(! _generic_isCC(*s, class_bit)))  break;
+          if (UNLIKELY(! generic_isCC_(*s, class_bit)))  break;
           value = (value << shift) | XDIGIT_VALUE(*s);
           s++;
           /* FALLTHROUGH */
       case 3:
-          if (UNLIKELY(! _generic_isCC(*s, class_bit)))  break;
+          if (UNLIKELY(! generic_isCC_(*s, class_bit)))  break;
           value = (value << shift) | XDIGIT_VALUE(*s);
           s++;
           /* FALLTHROUGH */
       case 2:
-          if (UNLIKELY(! _generic_isCC(*s, class_bit)))  break;
+          if (UNLIKELY(! generic_isCC_(*s, class_bit)))  break;
           value = (value << shift) | XDIGIT_VALUE(*s);
           s++;
           /* FALLTHROUGH */
       case 1:
-          if (UNLIKELY(! _generic_isCC(*s, class_bit)))  break;
+          if (UNLIKELY(! generic_isCC_(*s, class_bit)))  break;
           value = (value << shift) | XDIGIT_VALUE(*s);
 
           if (LIKELY(len <= 8)) {
@@ -477,7 +477,7 @@ Perl_grok_bin_oct_hex(pTHX_ const char *start,
     len -= bytes_so_far;
 
     for (; len--; s++) {
-        if (_generic_isCC(*s, class_bit)) {
+        if (generic_isCC_(*s, class_bit)) {
             /* Write it in this wonky order with a goto to attempt to get the
                compiler to make the common case integer-only loop pretty tight.
                With gcc seems to be much straighter code than old scan_hex.
@@ -527,7 +527,7 @@ Perl_grok_bin_oct_hex(pTHX_ const char *start,
         if (   *s == '_'
             && len
             && allow_underscores
-            && _generic_isCC(s[1], class_bit)
+            && generic_isCC_(s[1], class_bit)
 
                 /* Don't allow a leading underscore if the only-medial bit is
                  * set */
@@ -924,7 +924,7 @@ Perl_grok_infnan(pTHX_ const char** sp, const char* send)
                      * of UVs and NVs can be different. */
 
                     if ((nantype & IS_NUMBER_NOT_INT) ||
-                        !(nantype && IS_NUMBER_IN_UV)) {
+                        !(nantype & IS_NUMBER_IN_UV)) {
                         /* treat "NaN(invalid)" the same as "NaNgarbage" */
                         return trail;
                     }
@@ -1277,7 +1277,7 @@ no leading zeros).  Otherwise it returns TRUE, and sets C<*valptr> to that
 value.
 
 If you constrain the portion of C<pv> that is looked at by this function (by
-passing a non-NULL C<endptr>), and if the intial bytes of that portion form a
+passing a non-NULL C<endptr>), and if the initial bytes of that portion form a
 valid value, it will return TRUE, setting C<*endptr> to the byte following the
 final digit of the value.  But if there is no constraint at what's looked at,
 all of C<pv> must be valid in order for TRUE to be returned.  C<*endptr> is
@@ -1492,7 +1492,7 @@ N.B. C<s> must be NUL terminated.
     {
         DECLARATION_FOR_LC_NUMERIC_MANIPULATION;
         STORE_LC_NUMERIC_SET_TO_NEEDED();
-        if (! (PL_numeric_radix_sv && IN_LC(LC_NUMERIC))) {
+        if (! IN_LC(LC_NUMERIC)) {
             ATOF(s,x);
         }
         else {
index 748a268..df43c2a 100644 (file)
@@ -19,8 +19,8 @@
  *     [p.23 of _The Lord of the Rings_, I/i: "A Long-Expected Party"]
  */
 
-/* This file contains the functions that create, manipulate and optimize
- * the OP structures that hold a compiled perl program.
+/* This file contains the functions that create and manipulate the OP
+ * structures that hold a compiled perl program.
  *
  * Note that during the build of miniperl, a temporary copy of this file
  * is made, called opmini.c.
@@ -167,7 +167,6 @@ recursive, but it's recursive on basic blocks, not on tree nodes.
 #include "invlist_inline.h"
 
 #define CALL_PEEP(o) PL_peepp(aTHX_ o)
-#define CALL_RPEEP(o) PL_rpeepp(aTHX_ o)
 #define CALL_OPFREEHOOK(o) if (PL_opfreehook) PL_opfreehook(aTHX_ o)
 
 static const char array_passed_to_stat[] = "Array passed to stat will be coerced to a scalar";
@@ -177,9 +176,11 @@ static const char array_passed_to_stat[] = "Array passed to stat will be coerced
  * first node in op_p.
  */
 
-STATIC void
-S_prune_chain_head(OP** op_p)
+void
+Perl_op_prune_chain_head(OP** op_p)
 {
+    PERL_ARGS_ASSERT_OP_PRUNE_CHAIN_HEAD;
+
     while (*op_p
         && (   (*op_p)->op_type == OP_NULL
             || (*op_p)->op_type == OP_SCOPE
@@ -512,7 +513,7 @@ Perl_Slab_Free(pTHX_ void *op)
 void
 Perl_opslab_free_nopad(pTHX_ OPSLAB *slab)
 {
-    const bool havepad = !!PL_comppad;
+    const bool havepad = cBOOL(PL_comppad);
     PERL_ARGS_ASSERT_OPSLAB_FREE_NOPAD;
     if (havepad) {
         ENTER;
@@ -654,12 +655,6 @@ Perl_op_refcnt_dec(pTHX_ OP *o)
 
 #define RETURN_UNLIMITED_NUMBER (PERL_INT_MAX / 2)
 
-#define OpTYPE_set(o,type) \
-    STMT_START {                               \
-        o->op_type = (OPCODE)type;             \
-        o->op_ppaddr = PL_ppaddr[type];                \
-    } STMT_END
-
 STATIC OP *
 S_no_fh_allowed(pTHX_ OP *o)
 {
@@ -706,8 +701,8 @@ S_bad_type_gv(pTHX_ I32 n, GV *gv, const OP *kid, const char *t)
                  (int)n, SVfARG(namesv), t, OP_DESC(kid)), SvUTF8(namesv));
 }
 
-STATIC void
-S_no_bareword_allowed(pTHX_ OP *o)
+void
+Perl_no_bareword_allowed(pTHX_ OP *o)
 {
     PERL_ARGS_ASSERT_NO_BAREWORD_ALLOWED;
 
@@ -777,9 +772,15 @@ Perl_allocmy(pTHX_ const char *const name, const STRLEN len, const U32 flags)
 
     /* allocate a spare slot and store the name in that slot */
 
-    off = pad_add_name_pvn(name, len,
-                       (is_our ? padadd_OUR :
-                        PL_parser->in_my == KEY_state ? padadd_STATE : 0),
+    U32 addflags = 0;
+    if(is_our)
+        addflags |= padadd_OUR;
+    else if(PL_parser->in_my == KEY_state)
+        addflags |= padadd_STATE;
+    else if(PL_parser->in_my == KEY_field)
+        addflags |= padadd_FIELD;
+
+    off = pad_add_name_pvn(name, len, addflags,
                     PL_parser->in_my_stash,
                     (is_our
                         /* $_ is always in main::, even with our */
@@ -854,6 +855,15 @@ S_op_destroy(pTHX_ OP *o)
 Free an op and its children. Only use this when an op is no longer linked
 to from any optree.
 
+Remember that any op with C<OPf_KIDS> set is expected to have a valid
+C<op_first> pointer.  If you are attempting to free an op but preserve its
+child op, make sure to clear that flag before calling C<op_free()>.  For
+example:
+
+    OP *kid = o->op_first; o->op_first = NULL;
+    o->op_flags &= ~OPf_KIDS;
+    op_free(o);
+
 =cut
 */
 
@@ -903,6 +913,12 @@ Perl_op_free(pTHX_ OP *o)
         /* free child ops before ourself, (then free ourself "on the
          * way back up") */
 
+        /* Ensure the caller maintains the relationship between OPf_KIDS and
+         * op_first != NULL when restructuring the tree
+         *   https://github.com/Perl/perl5/issues/20764
+         */
+        assert(!(o->op_flags & OPf_KIDS) || cUNOPo->op_first);
+
         if (!went_up && o->op_flags & OPf_KIDS) {
             next_op = cUNOPo->op_first;
             continue;
@@ -1064,19 +1080,19 @@ Perl_op_clear(pTHX_ OP *o)
     case OP_METHOD_REDIR:
     case OP_METHOD_REDIR_SUPER:
 #ifdef USE_ITHREADS
-        if (cMETHOPx(o)->op_rclass_targ) {
-            pad_swipe(cMETHOPx(o)->op_rclass_targ, 1);
-            cMETHOPx(o)->op_rclass_targ = 0;
+        if (cMETHOPo->op_rclass_targ) {
+            pad_swipe(cMETHOPo->op_rclass_targ, 1);
+            cMETHOPo->op_rclass_targ = 0;
         }
 #else
-        SvREFCNT_dec(cMETHOPx(o)->op_rclass_sv);
-        cMETHOPx(o)->op_rclass_sv = NULL;
+        SvREFCNT_dec(cMETHOPo->op_rclass_sv);
+        cMETHOPo->op_rclass_sv = NULL;
 #endif
         /* FALLTHROUGH */
     case OP_METHOD_NAMED:
     case OP_METHOD_SUPER:
-        SvREFCNT_dec(cMETHOPx(o)->op_u.op_meth_sv);
-        cMETHOPx(o)->op_u.op_meth_sv = NULL;
+        SvREFCNT_dec(cMETHOPo->op_u.op_meth_sv);
+        cMETHOPo->op_u.op_meth_sv = NULL;
 #ifdef USE_ITHREADS
         if (o->op_targ) {
             pad_swipe(o->op_targ, 1);
@@ -1303,6 +1319,22 @@ Perl_op_clear(pTHX_ OP *o)
             PerlMemShared_free(cUNOP_AUXo->op_aux - 1);
         }
         break;
+
+    case OP_METHSTART:
+        {
+            UNOP_AUX_item *aux = cUNOP_AUXo->op_aux;
+            /* Every item in aux is a UV, so nothing in it to free */
+            Safefree(aux);
+        }
+        break;
+
+    case OP_INITFIELD:
+        {
+            UNOP_AUX_item *aux = cUNOP_AUXo->op_aux;
+            /* Every item in aux is a UV, so nothing in it to free */
+            Safefree(aux);
+        }
+        break;
     }
 
     if (o->op_targ > 0) {
@@ -1336,7 +1368,8 @@ S_cop_free(pTHX_ COP* cop)
     }
     CopFILE_free(cop);
     if (! specialWARN(cop->cop_warnings))
-        PerlMemShared_free(cop->cop_warnings);
+        cop->cop_warnings = rcpv_free(cop->cop_warnings);
+
     cophh_free(CopHINTHASH_get(cop));
     if (PL_curcop == cop)
        PL_curcop = NULL;
@@ -1391,7 +1424,7 @@ S_find_and_forget_pmops(pTHX_ OP *o)
         case OP_SPLIT:
         case OP_MATCH:
         case OP_QR:
-            forget_pmop((PMOP*)o);
+            forget_pmop(cPMOPo);
         }
 
         if (o->op_flags & OPf_KIDS) {
@@ -1833,105 +1866,80 @@ S_op_varname_subscript(pTHX_ const OP *o, int subscript_type)
     }
 }
 
-static SV *
-S_op_varname(pTHX_ const OP *o)
+SV *
+Perl_op_varname(pTHX_ const OP *o)
 {
+    PERL_ARGS_ASSERT_OP_VARNAME;
+
     return S_op_varname_subscript(aTHX_ o, 1);
 }
 
-static void
-S_op_pretty(pTHX_ const OP *o, SV **retsv, const char **retpv)
-{ /* or not so pretty :-) */
+/*
+
+Warns that an access of a single element from a named container variable in
+scalar context might not be what the programmer wanted. The container
+variable's (sigiled, full) name is given by C<name>, and the key to access
+it is given by the C<SVOP_sv> of the C<OP_CONST> op given by C<o>.
+C<is_hash> selects whether it prints using {KEY} or [KEY] brackets.
+
+C<is_slice> selects between two different messages used in different places.
+ */
+void
+Perl_warn_elem_scalar_context(pTHX_ const OP *o, SV *name, bool is_hash, bool is_slice)
+{
+    PERL_ARGS_ASSERT_WARN_ELEM_SCALAR_CONTEXT;
+
+    SV *keysv = NULL;
+    const char *keypv = NULL;
+
+    const char lbrack = is_hash ? '{' : '[';
+    const char rbrack = is_hash ? '}' : ']';
+
     if (o->op_type == OP_CONST) {
-        *retsv = cSVOPo_sv;
-        if (SvPOK(*retsv)) {
-            SV *sv = *retsv;
-            *retsv = sv_newmortal();
-            pv_pretty(*retsv, SvPVX_const(sv), SvCUR(sv), 32, NULL, NULL,
+        keysv = cSVOPo_sv;
+        if (SvPOK(keysv)) {
+            SV *sv = keysv;
+            keysv = sv_newmortal();
+            pv_pretty(keysv, SvPVX_const(sv), SvCUR(sv), 32, NULL, NULL,
                       PERL_PV_PRETTY_DUMP |PERL_PV_ESCAPE_UNI_DETECT);
         }
-        else if (!SvOK(*retsv))
-            *retpv = "undef";
+        else if (!SvOK(keysv))
+            keypv = "undef";
     }
-    else *retpv = "...";
-}
+    else keypv = "...";
 
-static void
-S_scalar_slice_warning(pTHX_ const OP *o)
-{
-    OP *kid;
-    const bool h = o->op_type == OP_HSLICE
-                || (o->op_type == OP_NULL && o->op_targ == OP_HSLICE);
-    const char lbrack =
-        h ? '{' : '[';
-    const char rbrack =
-        h ? '}' : ']';
-    SV *name;
-    SV *keysv = NULL; /* just to silence compiler warnings */
-    const char *key = NULL;
-
-    if (!(o->op_private & OPpSLICEWARNING))
-        return;
-    if (PL_parser && PL_parser->error_count)
-        /* This warning can be nonsensical when there is a syntax error. */
-        return;
+    assert(SvPOK(name));
+    sv_chop(name,SvPVX(name)+1);
 
-    kid = cLISTOPo->op_first;
-    kid = OpSIBLING(kid); /* get past pushmark */
-    /* weed out false positives: any ops that can return lists */
-    switch (kid->op_type) {
-    case OP_BACKTICK:
-    case OP_GLOB:
-    case OP_READLINE:
-    case OP_MATCH:
-    case OP_RV2AV:
-    case OP_EACH:
-    case OP_VALUES:
-    case OP_KEYS:
-    case OP_SPLIT:
-    case OP_LIST:
-    case OP_SORT:
-    case OP_REVERSE:
-    case OP_ENTERSUB:
-    case OP_CALLER:
-    case OP_LSTAT:
-    case OP_STAT:
-    case OP_READDIR:
-    case OP_SYSTEM:
-    case OP_TMS:
-    case OP_LOCALTIME:
-    case OP_GMTIME:
-    case OP_ENTEREVAL:
-        return;
-    }
+    const char *msg;
 
-    /* Don't warn if we have a nulled list either. */
-    if (kid->op_type == OP_NULL && kid->op_targ == OP_LIST)
-        return;
+    if (keypv) {
+        msg = is_slice ?
+            /* diag_listed_as: Scalar value @%s[%s] better written as $%s[%s] */
+            PERL_DIAG_WARN_SYNTAX(
+                "Scalar value @%" SVf "%c%s%c better written as $%" SVf "%c%s%c") :
+            /* diag_listed_as: %%s[%s] in scalar context better written as $%s[%s] */
+            PERL_DIAG_WARN_SYNTAX(
+                "%%%" SVf "%c%s%c in scalar context better written as $%" SVf "%c%s%c");
 
-    assert(OpSIBLING(kid));
-    name = S_op_varname(aTHX_ OpSIBLING(kid));
-    if (!name) /* XS module fiddling with the op tree */
-        return;
-    S_op_pretty(aTHX_ kid, &keysv, &key);
-    assert(SvPOK(name));
-    sv_chop(name,SvPVX(name)+1);
-    if (key)
-       /* diag_listed_as: Scalar value @%s[%s] better written as $%s[%s] */
-        Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
-                   "Scalar value @%" SVf "%c%s%c better written as $%" SVf
-                   "%c%s%c",
-                    SVfARG(name), lbrack, key, rbrack, SVfARG(name),
-                    lbrack, key, rbrack);
-    else
-       /* diag_listed_as: Scalar value @%s[%s] better written as $%s[%s] */
-        Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
-                   "Scalar value @%" SVf "%c%" SVf "%c better written as $%"
-                    SVf "%c%" SVf "%c",
-                    SVfARG(name), lbrack, SVfARG(keysv), rbrack,
-                    SVfARG(name), lbrack, SVfARG(keysv), rbrack);
-}
+        Perl_warner(aTHX_ packWARN(WARN_SYNTAX), msg,
+                SVfARG(name), lbrack, keypv, rbrack,
+                SVfARG(name), lbrack, keypv, rbrack);
+    }
+    else {
+        msg = is_slice ?
+            /* diag_listed_as: Scalar value @%s[%s] better written as $%s[%s] */
+            PERL_DIAG_WARN_SYNTAX(
+                "Scalar value @%" SVf "%c%" SVf "%c better written as $%" SVf "%c%" SVf "%c") :
+            /* diag_listed_as: %%s[%s] in scalar context better written as $%s[%s] */
+            PERL_DIAG_WARN_SYNTAX(
+                "%%%" SVf "%c%" SVf "%c in scalar context better written as $%" SVf "%c%" SVf "%c");
 
+        Perl_warner(aTHX_ packWARN(WARN_SYNTAX), msg,
+                SVfARG(name), lbrack, SVfARG(keysv), rbrack,
+                SVfARG(name), lbrack, SVfARG(keysv), rbrack);
+    }
+}
 
 
 /* apply scalar context to the o subtree */
@@ -2039,11 +2047,7 @@ Perl_scalar(pTHX_ OP *o)
         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)
@@ -2054,26 +2058,10 @@ Perl_scalar(pTHX_ OP *o)
             kid = cLISTOPo->op_first;
             kid = OpSIBLING(kid); /* get past pushmark */
             assert(OpSIBLING(kid));
-            name = S_op_varname(aTHX_ OpSIBLING(kid));
+            name = op_varname(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);
+            warn_elem_scalar_context(kid, name, o->op_type == OP_KVHSLICE, false);
         }
         } /* switch */
 
@@ -2174,6 +2162,7 @@ Perl_scalarvoid(pTHX_ OP *arg)
         case OP_REF:
         case OP_REFGEN:
         case OP_SREFGEN:
+        case OP_ANONCODE:
         case OP_DEFINED:
         case OP_HEX:
         case OP_OCT:
@@ -2343,17 +2332,17 @@ Perl_scalarvoid(pTHX_ OP *arg)
             if ((o->op_private & ~OPpASSIGN_BACKWARDS) != 2)
                 break;
 
-            rv2gv = ((BINOP *)o)->op_last;
+            rv2gv = cBINOPo->op_last;
             if (!rv2gv || rv2gv->op_type != OP_RV2GV)
                 break;
 
-            refgen = (UNOP *)((BINOP *)o)->op_first;
+            refgen = cUNOPx(cBINOPo->op_first);
 
             if (!refgen || (refgen->op_type != OP_REFGEN
                             && refgen->op_type != OP_SREFGEN))
                 break;
 
-            exlist = (LISTOP *)refgen->op_first;
+            exlist = cLISTOPx(refgen->op_first);
             if (!exlist || exlist->op_type != OP_NULL
                 || exlist->op_targ != OP_LIST)
                 break;
@@ -2362,7 +2351,7 @@ Perl_scalarvoid(pTHX_ OP *arg)
                 && exlist->op_first != exlist->op_last)
                 break;
 
-            rv2cv = (UNOP*)exlist->op_last;
+            rv2cv = cUNOPx(exlist->op_last);
 
             if (rv2cv->op_type != OP_RV2CV)
                 break;
@@ -2480,8 +2469,7 @@ Perl_scalarvoid(pTHX_ OP *arg)
         }
         o = next_kid;
     }
-
-    return arg;
+    NOT_REACHED;
 }
 
 
@@ -2698,8 +2686,8 @@ S_modkids(pTHX_ OP *o, I32 type)
  * real   if false, only check (and possibly croak); don't update op
  */
 
-STATIC void
-S_check_hash_fields_and_hekify(pTHX_ UNOP *rop, SVOP *key_op, int real)
+void
+Perl_check_hash_fields_and_hekify(pTHX_ UNOP *rop, SVOP *key_op, int real)
 {
     PADNAME *lexname;
     GV **fields;
@@ -2709,13 +2697,13 @@ S_check_hash_fields_and_hekify(pTHX_ UNOP *rop, SVOP *key_op, int real)
     if (rop) {
         if (rop->op_first->op_type == OP_PADSV)
             /* @$hash{qw(keys here)} */
-            rop = (UNOP*)rop->op_first;
+            rop = cUNOPx(rop->op_first);
         else {
             /* @{$hash}{qw(keys here)} */
             if (rop->op_first->op_type == OP_SCOPE
                 && cLISTOPx(rop->op_first)->op_last->op_type == OP_PADSV)
                 {
-                    rop = (UNOP*)cLISTOPx(rop->op_first)->op_last;
+                    rop = cUNOPx(cLISTOPx(rop->op_first)->op_last);
                 }
             else
                 rop = NULL;
@@ -2728,11 +2716,11 @@ S_check_hash_fields_and_hekify(pTHX_ UNOP *rop, SVOP *key_op, int real)
     check_fields =
             rop
          && (lexname = padnamelist_fetch(PL_comppad_name, rop->op_targ),
-             SvPAD_TYPED(lexname))
+             PadnameHasTYPE(lexname))
          && (fields = (GV**)hv_fetchs(PadnameTYPE(lexname), "FIELDS", FALSE))
          && isGV(*fields) && GvHV(*fields);
 
-    for (; key_op; key_op = (SVOP*)OpSIBLING(key_op)) {
+    for (; key_op; key_op = cSVOPx(OpSIBLING(key_op))) {
         SV **svp, *sv;
         if (key_op->op_type != OP_CONST)
             continue;
@@ -2770,7939 +2758,6901 @@ S_check_hash_fields_and_hekify(pTHX_ UNOP *rop, SVOP *key_op, int real)
     }
 }
 
-/* info returned by S_sprintf_is_multiconcatable() */
-
-struct sprintf_ismc_info {
-    SSize_t nargs;    /* num of args to sprintf (not including the format) */
-    char  *start;     /* start of raw format string */
-    char  *end;       /* bytes after end of raw format string */
-    STRLEN total_len; /* total length (in bytes) of format string, not
-                         including '%s' and  half of '%%' */
-    STRLEN variant;   /* number of bytes by which total_len_p would grow
-                         if upgraded to utf8 */
-    bool   utf8;      /* whether the format is utf8 */
-};
-
 
-/* is the OP_SPRINTF o suitable for converting into a multiconcat op?
- * i.e. its format argument is a const string with only '%s' and '%%'
- * formats, and the number of args is known, e.g.
- *    sprintf "a=%s f=%s", $a[0], scalar(f());
- * but not
- *    sprintf "i=%d a=%s f=%s", $i, @a, f();
- *
- * If successful, the sprintf_ismc_info struct pointed to by info will be
- * populated.
+/* do all the final processing on an optree (e.g. running the peephole
+ * optimiser on it), then attach it to cv (if cv is non-null)
  */
 
-STATIC bool
-S_sprintf_is_multiconcatable(pTHX_ OP *o,struct sprintf_ismc_info *info)
+static void
+S_process_optree(pTHX_ CV *cv, OP *optree, OP* start)
 {
-    OP    *pm, *constop, *kid;
-    SV    *sv;
-    char  *s, *e, *p;
-    SSize_t nargs, nformats;
-    STRLEN cur, total_len, variant;
-    bool   utf8;
-
-    /* if sprintf's behaviour changes, die here so that someone
-     * can decide whether to enhance this function or skip optimising
-     * under those new circumstances */
-    assert(!(o->op_flags & OPf_STACKED));
-    assert(!(PL_opargs[OP_SPRINTF] & OA_TARGLEX));
-    assert(!(o->op_private & ~OPpARG4_MASK));
-
-    pm = cUNOPo->op_first;
-    if (pm->op_type != OP_PUSHMARK) /* weird coreargs stuff */
-        return FALSE;
-    constop = OpSIBLING(pm);
-    if (!constop || constop->op_type != OP_CONST)
-        return FALSE;
-    sv = cSVOPx_sv(constop);
-    if (SvMAGICAL(sv) || !SvPOK(sv))
-        return FALSE;
-
-    s = SvPV(sv, cur);
-    e = s + cur;
+    OP **startp;
 
-    /* Scan format for %% and %s and work out how many %s there are.
-     * Abandon if other format types are found.
-     */
+    /* XXX for some reason, evals, require and main optrees are
+     * never attached to their CV; instead they just hang off
+     * PL_main_root + PL_main_start or PL_eval_root + PL_eval_start
+     * and get manually freed when appropriate */
+    if (cv)
+        startp = &CvSTART(cv);
+    else
+        startp = PL_in_eval? &PL_eval_start : &PL_main_start;
 
-    nformats  = 0;
-    total_len = 0;
-    variant   = 0;
+    *startp = start;
+    optree->op_private |= OPpREFCOUNTED;
+    OpREFCNT_set(optree, 1);
+    optimize_optree(optree);
+    CALL_PEEP(*startp);
+    finalize_optree(optree);
+    op_prune_chain_head(startp);
 
-    for (p = s; p < e; p++) {
-        if (*p != '%') {
-            total_len++;
-            if (!UTF8_IS_INVARIANT(*p))
-                variant++;
-            continue;
-        }
-        p++;
-        if (p >= e)
-            return FALSE; /* lone % at end gives "Invalid conversion" */
-        if (*p == '%')
-            total_len++;
-        else if (*p == 's')
-            nformats++;
-        else
-            return FALSE;
+    if (cv) {
+        /* now that optimizer has done its work, adjust pad values */
+        pad_tidy(optree->op_type == OP_LEAVEWRITE ? padtidy_FORMAT
+                 : CvCLONE(cv) ? padtidy_SUBCLONE : padtidy_SUB);
     }
+}
 
-    if (!nformats || nformats > PERL_MULTICONCAT_MAXARG)
-        return FALSE;
-
-    utf8 = cBOOL(SvUTF8(sv));
-    if (utf8)
-        variant = 0;
-
-    /* scan args; they must all be in scalar cxt */
-
-    nargs = 0;
-    kid = OpSIBLING(constop);
+#ifdef USE_ITHREADS
+/* Relocate sv to the pad for thread safety.
+ * Despite being a "constant", the SV is written to,
+ * for reference counts, sv_upgrade() etc. */
+void
+Perl_op_relocate_sv(pTHX_ SV** svp, PADOFFSET* targp)
+{
+    PADOFFSET ix;
+    PERL_ARGS_ASSERT_OP_RELOCATE_SV;
+    if (!*svp) return;
+    ix = pad_alloc(OP_CONST, SVf_READONLY);
+    SvREFCNT_dec(PAD_SVl(ix));
+    PAD_SETSV(ix, *svp);
+    /* XXX I don't know how this isn't readonly already. */
+    if (!SvIsCOW(PAD_SVl(ix))) SvREADONLY_on(PAD_SVl(ix));
+    *svp = NULL;
+    *targp = ix;
+}
+#endif
 
-    while (kid) {
-        if ((kid->op_flags & OPf_WANT) != OPf_WANT_SCALAR)
-            return FALSE;
-        nargs++;
-        kid = OpSIBLING(kid);
+static void
+S_mark_padname_lvalue(pTHX_ PADNAME *pn)
+{
+    CV *cv = PL_compcv;
+    PadnameLVALUE_on(pn);
+    while (PadnameOUTER(pn) && PARENT_PAD_INDEX(pn)) {
+        cv = CvOUTSIDE(cv);
+        /* RT #127786: cv can be NULL due to an eval within the DB package
+         * called from an anon sub - anon subs don't have CvOUTSIDE() set
+         * unless they contain an eval, but calling eval within DB
+         * pretends the eval was done in the caller's scope.
+         */
+        if (!cv)
+            break;
+        assert(CvPADLIST(cv));
+        pn =
+           PadlistNAMESARRAY(CvPADLIST(cv))[PARENT_PAD_INDEX(pn)];
+        assert(PadnameLEN(pn));
+        PadnameLVALUE_on(pn);
     }
-
-    if (nargs != nformats)
-        return FALSE; /* e.g. sprintf("%s%s", $a); */
-
-
-    info->nargs      = nargs;
-    info->start      = s;
-    info->end        = e;
-    info->total_len  = total_len;
-    info->variant    = variant;
-    info->utf8       = utf8;
-
-    return TRUE;
 }
 
+static bool
+S_vivifies(const OPCODE type)
+{
+    switch(type) {
+    case OP_RV2AV:     case   OP_ASLICE:
+    case OP_RV2HV:     case OP_KVASLICE:
+    case OP_RV2SV:     case   OP_HSLICE:
+    case OP_AELEMFAST: case OP_KVHSLICE:
+    case OP_HELEM:
+    case OP_AELEM:
+        return 1;
+    }
+    return 0;
+}
 
 
-/* S_maybe_multiconcat():
- *
- * given an OP_STRINGIFY, OP_SASSIGN, OP_CONCAT or OP_SPRINTF op, possibly
- * convert it (and its children) into an OP_MULTICONCAT. See the code
- * comments just before pp_multiconcat() for the full details of what
- * OP_MULTICONCAT supports.
- *
- * Basically we're looking for an optree with a chain of OP_CONCATS down
- * the LHS (or an OP_SPRINTF), with possibly an OP_SASSIGN, and/or
- * OP_STRINGIFY, and/or OP_CONCAT acting as '.=' at its head, e.g.
- *
- *      $x = "$a$b-$c"
- *
- *  looks like
- *
- *      SASSIGN
- *         |
- *      STRINGIFY   -- PADSV[$x]
- *         |
- *         |
- *      ex-PUSHMARK -- CONCAT/S
- *                        |
- *                     CONCAT/S  -- PADSV[$d]
- *                        |
- *                     CONCAT    -- CONST["-"]
- *                        |
- *                     PADSV[$a] -- PADSV[$b]
- *
- * Note that at this stage the OP_SASSIGN may have already been optimised
- * away with OPpTARGET_MY set on the OP_STRINGIFY or OP_CONCAT.
+/* 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_maybe_multiconcat(pTHX_ OP *o)
+static void
+S_lvref(pTHX_ OP *o, I32 type)
 {
-    OP *lastkidop;   /* the right-most of any kids unshifted onto o */
-    OP *topop;       /* the top-most op in the concat tree (often equals o,
-                        unless there are assign/stringify ops above it */
-    OP *parentop;    /* the parent op of topop (or itself if no parent) */
-    OP *targmyop;    /* the op (if any) with the OPpTARGET_MY flag */
-    OP *targetop;    /* the op corresponding to target=... or target.=... */
-    OP *stringop;    /* the OP_STRINGIFY op, if any */
-    OP *nextop;      /* used for recreating the op_next chain without consts */
-    OP *kid;         /* general-purpose op pointer */
-    UNOP_AUX_item *aux;
-    UNOP_AUX_item *lenp;
-    char *const_str, *p;
-    struct sprintf_ismc_info sprintf_info;
-
-                     /* store info about each arg in args[];
-                      * toparg is the highest used slot; argp is a general
-                      * pointer to args[] slots */
-    struct {
-        void *p;      /* initially points to const sv (or null for op);
-                         later, set to SvPV(constsv), with ... */
-        STRLEN len;   /* ... len set to SvPV(..., len) */
-    } *argp, *toparg, args[PERL_MULTICONCAT_MAXARG*2 + 1];
-
-    SSize_t nargs  = 0;
-    SSize_t nconst = 0;
-    SSize_t nadjconst  = 0; /* adjacent consts - may be demoted to args */
-    STRLEN variant;
-    bool utf8 = FALSE;
-    bool kid_is_last = FALSE; /* most args will be the RHS kid of a concat op;
-                                 the last-processed arg will the LHS of one,
-                                 as args are processed in reverse order */
-    U8   stacked_last = 0;   /* whether the last seen concat op was STACKED */
-    STRLEN total_len  = 0;   /* sum of the lengths of the const segments */
-    U8 flags          = 0;   /* what will become the op_flags and ... */
-    U8 private_flags  = 0;   /* ... op_private of the multiconcat op */
-    bool is_sprintf = FALSE; /* we're optimising an sprintf */
-    bool is_targable  = FALSE; /* targetop is an OPpTARGET_MY candidate */
-    bool prev_was_const = FALSE; /* previous arg was a const */
-
-    /* -----------------------------------------------------------------
-     * Phase 1:
-     *
-     * Examine the optree non-destructively to determine whether it's
-     * suitable to be converted into an OP_MULTICONCAT. Accumulate
-     * information about the optree in args[].
-     */
+    OP *kid;
+    OP * top_op = o;
 
-    argp     = args;
-    targmyop = NULL;
-    targetop = NULL;
-    stringop = NULL;
-    topop    = o;
-    parentop = o;
+    while (1) {
+        switch (o->op_type) {
+        case OP_COND_EXPR:
+            o = OpSIBLING(cUNOPo->op_first);
+            continue;
 
-    assert(   o->op_type == OP_SASSIGN
-           || o->op_type == OP_CONCAT
-           || o->op_type == OP_SPRINTF
-           || o->op_type == OP_STRINGIFY);
+        case OP_PUSHMARK:
+            goto do_next;
 
-    Zero(&sprintf_info, 1, struct sprintf_ismc_info);
+        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;
 
-    /* first see if, at the top of the tree, there is an assign,
-     * append and/or stringify */
+        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;
 
-    if (topop->op_type == OP_SASSIGN) {
-        /* expr = ..... */
-        if (o->op_ppaddr != PL_ppaddr[OP_SASSIGN])
-            return;
-        if (o->op_private & (OPpASSIGN_BACKWARDS|OPpASSIGN_CV_TO_GV))
-            return;
-        assert(!(o->op_private & ~OPpARG2_MASK)); /* barf on unknown flags */
+        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;
 
-        parentop = topop;
-        topop = cBINOPo->op_first;
-        targetop = OpSIBLING(topop);
-        if (!targetop) /* probably some sort of syntax error */
-            return;
+        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;
 
-        /* don't optimise away assign in 'local $foo = ....' */
-        if (   (targetop->op_private & OPpLVAL_INTRO)
-            /* these are the common ops which do 'local', but
-             * not all */
-            && (   targetop->op_type == OP_GVSV
-                || targetop->op_type == OP_RV2SV
-                || targetop->op_type == OP_AELEM
-                || targetop->op_type == OP_HELEM
-                )
-        )
-            return;
-    }
-    else if (   topop->op_type == OP_CONCAT
-             && (topop->op_flags & OPf_STACKED)
-             && (!(topop->op_private & OPpCONCAT_NESTED))
-            )
-    {
-        /* expr .= ..... */
-
-        /* OPpTARGET_MY shouldn't be able to be set here. If it is,
-         * decide what to do about it */
-        assert(!(o->op_private & OPpTARGET_MY));
-
-        /* barf on unknown flags */
-        assert(!(o->op_private & ~(OPpARG2_MASK|OPpTARGET_MY)));
-        private_flags |= OPpMULTICONCAT_APPEND;
-        targetop = cBINOPo->op_first;
-        parentop = topop;
-        topop    = OpSIBLING(targetop);
-
-        /* $x .= <FOO> gets optimised to rcatline instead */
-        if (topop->op_type == OP_READLINE)
-            return;
-    }
-
-    if (targetop) {
-        /* Can targetop (the LHS) if it's a padsv, be optimised
-         * away and use OPpTARGET_MY instead?
-         */
-        if (    (targetop->op_type == OP_PADSV)
-            && !(targetop->op_private & OPpDEREF)
-            && !(targetop->op_private & OPpPAD_STATE)
-               /* we don't support 'my $x .= ...' */
-            && (   o->op_type == OP_SASSIGN
-                || !(targetop->op_private & OPpLVAL_INTRO))
-        )
-            is_targable = TRUE;
-    }
-
-    if (topop->op_type == OP_STRINGIFY) {
-        if (topop->op_ppaddr != PL_ppaddr[OP_STRINGIFY])
-            return;
-        stringop = topop;
-
-        /* barf on unknown flags */
-        assert(!(o->op_private & ~(OPpARG4_MASK|OPpTARGET_MY)));
-
-        if ((topop->op_private & OPpTARGET_MY)) {
-            if (o->op_type == OP_SASSIGN)
-                return; /* can't have two assigns */
-            targmyop = topop;
-        }
-
-        private_flags |= OPpMULTICONCAT_STRINGIFY;
-        parentop = topop;
-        topop = cBINOPx(topop)->op_first;
-        assert(OP_TYPE_IS_OR_WAS_NN(topop, OP_PUSHMARK));
-        topop = OpSIBLING(topop);
-    }
-
-    if (topop->op_type == OP_SPRINTF) {
-        if (topop->op_ppaddr != PL_ppaddr[OP_SPRINTF])
-            return;
-        if (S_sprintf_is_multiconcatable(aTHX_ topop, &sprintf_info)) {
-            nargs     = sprintf_info.nargs;
-            total_len = sprintf_info.total_len;
-            variant   = sprintf_info.variant;
-            utf8      = sprintf_info.utf8;
-            is_sprintf = TRUE;
-            private_flags |= OPpMULTICONCAT_FAKE;
-            toparg = argp;
-            /* we have an sprintf op rather than a concat optree.
-             * Skip most of the code below which is associated with
-             * processing that optree. We also skip phase 2, determining
-             * whether its cost effective to optimise, since for sprintf,
-             * multiconcat is *always* faster */
-            goto create_aux;
-        }
-        /* note that even if the sprintf itself isn't multiconcatable,
-         * the expression as a whole may be, e.g. in
-         *    $x .= sprintf("%d",...)
-         * the sprintf op will be left as-is, but the concat/S op may
-         * be upgraded to multiconcat
-         */
-    }
-    else if (topop->op_type == OP_CONCAT) {
-        if (topop->op_ppaddr != PL_ppaddr[OP_CONCAT])
-            return;
-
-        if ((topop->op_private & OPpTARGET_MY)) {
-            if (o->op_type == OP_SASSIGN || targmyop)
-                return; /* can't have two assigns */
-            targmyop = topop;
-        }
-    }
-
-    /* Is it safe to convert a sassign/stringify/concat op into
-     * a multiconcat? */
-    assert((PL_opargs[OP_SASSIGN]   & OA_CLASS_MASK) == OA_BINOP);
-    assert((PL_opargs[OP_CONCAT]    & OA_CLASS_MASK) == OA_BINOP);
-    assert((PL_opargs[OP_STRINGIFY] & OA_CLASS_MASK) == OA_LISTOP);
-    assert((PL_opargs[OP_SPRINTF]   & OA_CLASS_MASK) == OA_LISTOP);
-    STATIC_ASSERT_STMT(   STRUCT_OFFSET(BINOP,    op_last)
-                       == STRUCT_OFFSET(UNOP_AUX, op_aux));
-    STATIC_ASSERT_STMT(   STRUCT_OFFSET(LISTOP,   op_last)
-                       == STRUCT_OFFSET(UNOP_AUX, op_aux));
-
-    /* Now scan the down the tree looking for a series of
-     * CONCAT/OPf_STACKED ops on the LHS (with the last one not
-     * stacked). For example this tree:
-     *
-     *     |
-     *   CONCAT/STACKED
-     *     |
-     *   CONCAT/STACKED -- EXPR5
-     *     |
-     *   CONCAT/STACKED -- EXPR4
-     *     |
-     *   CONCAT -- EXPR3
-     *     |
-     *   EXPR1  -- EXPR2
-     *
-     * corresponds to an expression like
-     *
-     *   (EXPR1 . EXPR2 . EXPR3 . EXPR4 . EXPR5)
-     *
-     * Record info about each EXPR in args[]: in particular, whether it is
-     * a stringifiable OP_CONST and if so what the const sv is.
-     *
-     * The reason why the last concat can't be STACKED is the difference
-     * between
-     *
-     *    ((($a .= $a) .= $a) .= $a) .= $a
-     *
-     * and
-     *    $a . $a . $a . $a . $a
-     *
-     * The main difference between the optrees for those two constructs
-     * is the presence of the last STACKED. As well as modifying $a,
-     * the former sees the changed $a between each concat, so if $s is
-     * initially 'a', the first returns 'a' x 16, while the latter returns
-     * 'a' x 5. And pp_multiconcat can't handle that kind of thing.
-     */
-
-    kid = topop;
-
-    for (;;) {
-        OP *argop;
-        SV *sv;
-        bool last = FALSE;
+        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;
 
-        if (    kid->op_type == OP_CONCAT
-            && !kid_is_last
-        ) {
-            OP *k1, *k2;
-            k1 = cUNOPx(kid)->op_first;
-            k2 = OpSIBLING(k1);
-            /* shouldn't happen except maybe after compile err? */
-            if (!k2)
-                return;
+        case OP_AELEM:
+        case OP_HELEM:
+            o->op_private |= OPpLVREF_ELEM;
+            o->op_flags   |= OPf_STACKED;
+            break;
 
-            /* avoid turning (A . B . ($lex = C) ...)  into  (A . B . C ...) */
-            if (kid->op_private & OPpTARGET_MY)
-                kid_is_last = TRUE;
+        case OP_ASLICE:
+        case OP_HSLICE:
+            OpTYPE_set(o, OP_LVREFSLICE);
+            o->op_private &= OPpLVAL_INTRO;
+            goto do_next;
 
-            stacked_last = (kid->op_flags & OPf_STACKED);
-            if (!stacked_last)
-                kid_is_last = TRUE;
+        case OP_NULL:
+            if (o->op_flags & OPf_SPECIAL)             /* do BLOCK */
+                goto badref;
+            else if (!(o->op_flags & OPf_KIDS))
+                goto do_next;
 
-            kid   = k1;
-            argop = k2;
-        }
-        else {
-            argop = kid;
-            last = TRUE;
-        }
+            /* 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;
 
-        if (   nargs + nadjconst  >  PERL_MULTICONCAT_MAXARG        - 2
-            || (argp - args + 1)  > (PERL_MULTICONCAT_MAXARG*2 + 1) - 2)
-        {
-            /* At least two spare slots are needed to decompose both
-             * concat args. If there are no slots left, continue to
-             * examine the rest of the optree, but don't push new values
-             * on args[]. If the optree as a whole is legal for conversion
-             * (in particular that the last concat isn't STACKED), then
-             * the first PERL_MULTICONCAT_MAXARG elements of the optree
-             * can be converted into an OP_MULTICONCAT now, with the first
-             * child of that op being the remainder of the optree -
-             * which may itself later be converted to a multiconcat op
-             * too.
-             */
-            if (last) {
-                /* the last arg is the rest of the optree */
-                argp++->p = NULL;
-                nargs++;
-            }
-        }
-        else if (   argop->op_type == OP_CONST
-            && ((sv = cSVOPx_sv(argop)))
-            /* defer stringification until runtime of 'constant'
-             * things that might stringify variantly, e.g. the radix
-             * point of NVs, or overloaded RVs */
-            && (SvPOK(sv) || SvIOK(sv))
-            && (!SvGMAGICAL(sv))
-        ) {
-            if (argop->op_private & OPpCONST_STRICT)
-                no_bareword_allowed(argop);
-            argp++->p = sv;
-            utf8   |= cBOOL(SvUTF8(sv));
-            nconst++;
-            if (prev_was_const)
-                /* this const may be demoted back to a plain arg later;
-                 * make sure we have enough arg slots left */
-                nadjconst++;
-            prev_was_const = !prev_was_const;
-        }
-        else {
-            argp++->p = NULL;
-            nargs++;
-            prev_was_const = FALSE;
+        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;
         }
 
-        if (last)
-            break;
-    }
-
-    toparg = argp - 1;
-
-    if (stacked_last)
-        return; /* we don't support ((A.=B).=C)...) */
+        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;
 
-    /* look for two adjacent consts and don't fold them together:
-     *     $o . "a" . "b"
-     * should do
-     *     $o->concat("a")->concat("b")
-     * rather than
-     *     $o->concat("ab")
-     * (but $o .=  "a" . "b" should still fold)
-     */
-    {
-        bool seen_nonconst = FALSE;
-        for (argp = toparg; argp >= args; argp--) {
-            if (argp->p == NULL) {
-                seen_nonconst = TRUE;
-                continue;
-            }
-            if (!seen_nonconst)
-                continue;
-            if (argp[1].p) {
-                /* both previous and current arg were constants;
-                 * leave the current OP_CONST as-is */
-                argp->p = NULL;
-                nconst--;
-                nargs++;
+      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 */
         }
-    }
-
-    /* -----------------------------------------------------------------
-     * Phase 2:
-     *
-     * At this point we have determined that the optree *can* be converted
-     * into a multiconcat. Having gathered all the evidence, we now decide
-     * whether it *should*.
-     */
+    } /* while */
+}
 
 
-    /* we need at least one concat action, e.g.:
-     *
-     *  Y . Z
-     *  X = Y . Z
-     *  X .= Y
-     *
-     * otherwise we could be doing something like $x = "foo", which
-     * if treated as a concat, would fail to COW.
-     */
-    if (nargs + nconst + cBOOL(private_flags & OPpMULTICONCAT_APPEND) < 2)
-        return;
+PERL_STATIC_INLINE bool
+S_potential_mod_type(I32 type)
+{
+    /* Types that only potentially result in modification.  */
+    return type == OP_GREPSTART || type == OP_ENTERSUB
+        || type == OP_REFGEN    || type == OP_LEAVESUBLV;
+}
 
-    /* Benchmarking seems to indicate that we gain if:
-     * * we optimise at least two actions into a single multiconcat
-     *    (e.g concat+concat, sassign+concat);
-     * * or if we can eliminate at least 1 OP_CONST;
-     * * or if we can eliminate a padsv via OPpTARGET_MY
-     */
 
-    if (
-           /* eliminated at least one OP_CONST */
-           nconst >= 1
-           /* eliminated an OP_SASSIGN */
-        || o->op_type == OP_SASSIGN
-           /* eliminated an OP_PADSV */
-        || (!targmyop && is_targable)
-    )
-        /* definitely a net gain to optimise */
-        goto optimise;
+/*
+=for apidoc op_lvalue
 
-    /* ... if not, what else? */
+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).
 
-    /* special-case '$lex1 = expr . $lex1' (where expr isn't lex1):
-     * multiconcat is faster (due to not creating a temporary copy of
-     * $lex1), whereas for a general $lex1 = $lex2 . $lex3, concat is
-     * faster.
-     */
-    if (   nconst == 0
-         && nargs == 2
-         && targmyop
-         && topop->op_type == OP_CONCAT
-    ) {
-        PADOFFSET t = targmyop->op_targ;
-        OP *k1 = cBINOPx(topop)->op_first;
-        OP *k2 = cBINOPx(topop)->op_last;
-        if (   k2->op_type == OP_PADSV
-            && k2->op_targ == t
-            && (   k1->op_type != OP_PADSV
-                || k1->op_targ != t)
-        )
-            goto optimise;
-    }
+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>.
 
-    /* need at least two concats */
-    if (nargs + nconst + cBOOL(private_flags & OPpMULTICONCAT_APPEND) < 3)
-        return;
+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
 
-    /* -----------------------------------------------------------------
-     * Phase 3:
-     *
-     * At this point the optree has been verified as ok to be optimised
-     * into an OP_MULTICONCAT. Now start changing things.
-     */
+*/
 
-   optimise:
+OP *
+Perl_op_lvalue_flags(pTHX_ OP *o, I32 type, U32 flags)
+{
+    OP *top_op = o;
 
-    /* stringify all const args and determine utf8ness */
+    if (!o || (PL_parser && PL_parser->error_count))
+        return o;
 
-    variant = 0;
-    for (argp = args; argp <= toparg; argp++) {
-        SV *sv = (SV*)argp->p;
-        if (!sv)
-            continue; /* not a const op */
-        if (utf8 && !SvUTF8(sv))
-            sv_utf8_upgrade_nomg(sv);
-        argp->p = SvPV_nomg(sv, argp->len);
-        total_len += argp->len;
+    while (1) {
+    OP *kid;
+    /* -1 = error on localize, 0 = ignore localize, 1 = ok to localize */
+    int localize = -1;
+    OP *next_kid = NULL;
 
-        /* see if any strings would grow if converted to utf8 */
-        if (!utf8) {
-            variant += variant_under_utf8_count((U8 *) argp->p,
-                                                (U8 *) argp->p + argp->len);
-        }
+    if ((o->op_private & OPpTARGET_MY)
+        && (PL_opargs[o->op_type] & OA_TARGLEX))/* OPp share the meaning */
+    {
+        goto do_next;
     }
 
-    /* create and populate aux struct */
-
-  create_aux:
-
-    aux = (UNOP_AUX_item*)PerlMemShared_malloc(
-                    sizeof(UNOP_AUX_item)
-                    *  (
-                           PERL_MULTICONCAT_HEADER_SIZE
-                         + ((nargs + 1) * (variant ? 2 : 1))
-                        )
-                    );
-    const_str = (char *)PerlMemShared_malloc(total_len ? total_len : 1);
+    /* 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;
 
-    /* Extract all the non-const expressions from the concat tree then
-     * dispose of the old tree, e.g. convert the tree from this:
-     *
-     *  o => SASSIGN
-     *         |
-     *       STRINGIFY   -- TARGET
-     *         |
-     *       ex-PUSHMARK -- CONCAT
-     *                        |
-     *                      CONCAT -- EXPR5
-     *                        |
-     *                      CONCAT -- EXPR4
-     *                        |
-     *                      CONCAT -- EXPR3
-     *                        |
-     *                      EXPR1  -- EXPR2
-     *
-     *
-     * to:
-     *
-     *  o => MULTICONCAT
-     *         |
-     *       ex-PUSHMARK -- EXPR1 -- EXPR2 -- EXPR3 -- EXPR4 -- EXPR5 -- TARGET
-     *
-     * except that if EXPRi is an OP_CONST, it's discarded.
-     *
-     * During the conversion process, EXPR ops are stripped from the tree
-     * and unshifted onto o. Finally, any of o's remaining original
-     * childen are discarded and o is converted into an OP_MULTICONCAT.
-     *
-     * In this middle of this, o may contain both: unshifted args on the
-     * left, and some remaining original args on the right. lastkidop
-     * is set to point to the right-most unshifted arg to delineate
-     * between the two sets.
-     */
+    if (type == OP_PRTF || type == OP_SPRINTF) type = OP_ENTERSUB;
 
+    switch (o->op_type) {
+    case OP_UNDEF:
+        if (type == OP_SASSIGN)
+            goto nomod;
+        PL_modcount++;
+        goto do_next;
 
-    if (is_sprintf) {
-        /* create a copy of the format with the %'s removed, and record
-         * the sizes of the const string segments in the aux struct */
-        char *q, *oldq;
-        lenp = aux + PERL_MULTICONCAT_IX_LENGTHS;
-
-        p    = sprintf_info.start;
-        q    = const_str;
-        oldq = q;
-        for (; p < sprintf_info.end; p++) {
-            if (*p == '%') {
-                p++;
-                if (*p != '%') {
-                    (lenp++)->ssize = q - oldq;
-                    oldq = q;
-                    continue;
-                }
-            }
-            *q++ = *p;
-        }
-        lenp->ssize = q - oldq;
-        assert((STRLEN)(q - const_str) == total_len);
+    case OP_STUB:
+        if ((o->op_flags & OPf_PARENS))
+            break;
+        goto nomod;
 
-        /* Attach all the args (i.e. the kids of the sprintf) to o (which
-         * may or may not be topop) The pushmark and const ops need to be
-         * kept in case they're an op_next entry point.
-         */
-        lastkidop = cLISTOPx(topop)->op_last;
-        kid = cUNOPx(topop)->op_first; /* pushmark */
-        op_null(kid);
-        op_null(OpSIBLING(kid));       /* const */
-        if (o != topop) {
-            kid = op_sibling_splice(topop, NULL, -1, NULL); /* cut all args */
-            op_sibling_splice(o, NULL, 0, kid); /* and attach to o */
-            lastkidop->op_next = o;
+    case OP_ENTERSUB:
+        if ((type == OP_UNDEF || type == OP_REFGEN || type == OP_LOCK) &&
+            !(o->op_flags & OPf_STACKED)) {
+            OpTYPE_set(o, OP_RV2CV);           /* entersub => rv2cv */
+            assert(cUNOPo->op_first->op_type == OP_NULL);
+            op_null(cLISTOPx(cUNOPo->op_first)->op_first);/* disable pushmark */
+            break;
         }
-    }
-    else {
-        p = const_str;
-        lenp = aux + PERL_MULTICONCAT_IX_LENGTHS;
-
-        lenp->ssize = -1;
-
-        /* Concatenate all const strings into const_str.
-         * Note that args[] contains the RHS args in reverse order, so
-         * we scan args[] from top to bottom to get constant strings
-         * in L-R order
-         */
-        for (argp = toparg; argp >= args; argp--) {
-            if (!argp->p)
-                /* not a const op */
-                (++lenp)->ssize = -1;
-            else {
-                STRLEN l = argp->len;
-                Copy(argp->p, p, l, char);
-                p += l;
-                if (lenp->ssize == -1)
-                    lenp->ssize = l;
-                else
-                    lenp->ssize += l;
+        else {                         /* lvalue subroutine call */
+            o->op_private |= OPpLVAL_INTRO;
+            PL_modcount = RETURN_UNLIMITED_NUMBER;
+            if (S_potential_mod_type(type)) {
+                o->op_private |= OPpENTERSUB_INARGS;
+                break;
             }
-        }
-
-        kid = topop;
-        nextop = o;
-        lastkidop = NULL;
-
-        for (argp = args; argp <= toparg; argp++) {
-            /* only keep non-const args, except keep the first-in-next-chain
-             * arg no matter what it is (but nulled if OP_CONST), because it
-             * may be the entry point to this subtree from the previous
-             * op_next.
-             */
-            bool last = (argp == toparg);
-            OP *prev;
+            else {                      /* Compile-time error message: */
+                OP *kid = cUNOPo->op_first;
+                CV *cv;
+                GV *gv;
+                SV *namesv;
 
-            /* set prev to the sibling *before* the arg to be cut out,
-             * e.g. when cutting EXPR:
-             *
-             *         |
-             * kid=  CONCAT
-             *         |
-             * prev= CONCAT -- EXPR
-             *         |
-             */
-            if (argp == args && kid->op_type != OP_CONCAT) {
-                /* in e.g. '$x .= f(1)' there's no RHS concat tree
-                 * so the expression to be cut isn't kid->op_last but
-                 * kid itself */
-                OP *o1, *o2;
-                /* find the op before kid */
-                o1 = NULL;
-                o2 = cUNOPx(parentop)->op_first;
-                while (o2 && o2 != kid) {
-                    o1 = o2;
-                    o2 = OpSIBLING(o2);
-                }
-                assert(o2 == kid);
-                prev = o1;
-                kid  = parentop;
-            }
-            else if (kid == o && lastkidop)
-                prev = last ? lastkidop : OpSIBLING(lastkidop);
-            else
-                prev = last ? NULL : cUNOPx(kid)->op_first;
-
-            if (!argp->p || last) {
-                /* cut RH op */
-                OP *aop = op_sibling_splice(kid, prev, 1, NULL);
-                /* and unshift to front of o */
-                op_sibling_splice(o, NULL, 0, aop);
-                /* record the right-most op added to o: later we will
-                 * free anything to the right of it */
-                if (!lastkidop)
-                    lastkidop = aop;
-                aop->op_next = nextop;
-                if (last) {
-                    if (argp->p)
-                        /* null the const at start of op_next chain */
-                        op_null(aop);
+                if (kid->op_type != OP_PUSHMARK) {
+                    if (kid->op_type != OP_NULL || kid->op_targ != OP_LIST)
+                        Perl_croak(aTHX_
+                                "panic: unexpected lvalue entersub "
+                                "args: type/targ %ld:%" UVuf,
+                                (long)kid->op_type, (UV)kid->op_targ);
+                    kid = kLISTOP->op_first;
+                }
+                while (OpHAS_SIBLING(kid))
+                    kid = OpSIBLING(kid);
+                if (!(kid->op_type == OP_NULL && kid->op_targ == OP_RV2CV)) {
+                    break;     /* Postpone until runtime */
                 }
-                else if (prev)
-                    nextop = prev->op_next;
-            }
-
-            /* the last two arguments are both attached to the same concat op */
-            if (argp < toparg - 1)
-                kid = prev;
-        }
-    }
-
-    /* Populate the aux struct */
-
-    aux[PERL_MULTICONCAT_IX_NARGS].ssize     = nargs;
-    aux[PERL_MULTICONCAT_IX_PLAIN_PV].pv    = utf8 ? NULL : const_str;
-    aux[PERL_MULTICONCAT_IX_PLAIN_LEN].ssize = utf8 ?    0 : total_len;
-    aux[PERL_MULTICONCAT_IX_UTF8_PV].pv     = const_str;
-    aux[PERL_MULTICONCAT_IX_UTF8_LEN].ssize  = total_len;
-
-    /* if variant > 0, calculate a variant const string and lengths where
-     * the utf8 version of the string will take 'variant' more bytes than
-     * the plain one. */
 
-    if (variant) {
-        char              *p = const_str;
-        STRLEN          ulen = total_len + variant;
-        UNOP_AUX_item  *lens = aux + PERL_MULTICONCAT_IX_LENGTHS;
-        UNOP_AUX_item *ulens = lens + (nargs + 1);
-        char             *up = (char*)PerlMemShared_malloc(ulen);
-        SSize_t            n;
+                kid = kUNOP->op_first;
+                if (kid->op_type == OP_NULL && kid->op_targ == OP_RV2SV)
+                    kid = kUNOP->op_first;
+                if (kid->op_type == OP_NULL)
+                    Perl_croak(aTHX_
+                               "panic: unexpected constant lvalue entersub "
+                               "entry via type/targ %ld:%" UVuf,
+                               (long)kid->op_type, (UV)kid->op_targ);
+                if (kid->op_type != OP_GV) {
+                    break;
+                }
 
-        aux[PERL_MULTICONCAT_IX_UTF8_PV].pv    = up;
-        aux[PERL_MULTICONCAT_IX_UTF8_LEN].ssize = ulen;
+                gv = kGVOP_gv;
+                cv = isGV(gv)
+                    ? GvCV(gv)
+                    : SvROK(gv) && SvTYPE(SvRV(gv)) == SVt_PVCV
+                        ? MUTABLE_CV(SvRV(gv))
+                        : NULL;
+                if (!cv)
+                    break;
+                if (CvLVALUE(cv))
+                    break;
+                if (flags & OP_LVALUE_NO_CROAK)
+                    return NULL;
 
-        for (n = 0; n < (nargs + 1); n++) {
-            SSize_t i;
-            char * orig_up = up;
-            for (i = (lens++)->ssize; i > 0; i--) {
-                U8 c = *p++;
-                append_utf8_from_native_byte(c, (U8**)&up);
+                namesv = cv_name(cv, NULL, 0);
+                yyerror_pv(Perl_form(aTHX_ "Can't modify non-lvalue "
+                                     "subroutine call of &%" SVf " in %s",
+                                     SVfARG(namesv), PL_op_desc[type]),
+                           SvUTF8(namesv));
+                goto do_next;
             }
-            (ulens++)->ssize = (i < 0) ? i : up - orig_up;
         }
-    }
-
-    if (stringop) {
-        /* if there was a top(ish)-level OP_STRINGIFY, we need to keep
-         * that op's first child - an ex-PUSHMARK - because the op_next of
-         * the previous op may point to it (i.e. it's the entry point for
-         * the o optree)
-         */
-        OP *pmop =
-            (stringop == o)
-                ? op_sibling_splice(o, lastkidop, 1, NULL)
-                : op_sibling_splice(stringop, NULL, 1, NULL);
-        assert(OP_TYPE_IS_OR_WAS_NN(pmop, OP_PUSHMARK));
-        op_sibling_splice(o, NULL, 0, pmop);
-        if (!lastkidop)
-            lastkidop = pmop;
-    }
-
-    /* Optimise
-     *    target  = A.B.C...
-     *    target .= A.B.C...
-     */
+        /* FALLTHROUGH */
+    default:
+      nomod:
+        if (flags & OP_LVALUE_NO_CROAK) return NULL;
+        /* grep, foreach, subcalls, refgen */
+        if (S_potential_mod_type(type))
+            break;
+        yyerror(Perl_form(aTHX_ "Can't modify %s in %s",
+                     (o->op_type == OP_NULL && (o->op_flags & OPf_SPECIAL)
+                      ? "do block"
+                      : OP_DESC(o)),
+                     type ? PL_op_desc[type] : "local"));
+        goto do_next;
 
-    if (targetop) {
-        assert(!targmyop);
+    case OP_PREINC:
+    case OP_PREDEC:
+    case OP_POW:
+    case OP_MULTIPLY:
+    case OP_DIVIDE:
+    case OP_MODULO:
+    case OP_ADD:
+    case OP_SUBTRACT:
+    case OP_CONCAT:
+    case OP_LEFT_SHIFT:
+    case OP_RIGHT_SHIFT:
+    case OP_BIT_AND:
+    case OP_BIT_XOR:
+    case OP_BIT_OR:
+    case OP_I_MULTIPLY:
+    case OP_I_DIVIDE:
+    case OP_I_MODULO:
+    case OP_I_ADD:
+    case OP_I_SUBTRACT:
+        if (!(o->op_flags & OPf_STACKED))
+            goto nomod;
+        PL_modcount++;
+        break;
 
-        if (o->op_type == OP_SASSIGN) {
-            /* Move the target subtree from being the last of o's children
-             * to being the last of o's preserved children.
-             * Note the difference between 'target = ...' and 'target .= ...':
-             * for the former, target is executed last; for the latter,
-             * first.
-             */
-            kid = OpSIBLING(lastkidop);
-            op_sibling_splice(o, kid, 1, NULL); /* cut target op */
-            op_sibling_splice(o, lastkidop, 0, targetop); /* and paste */
-            lastkidop->op_next = kid->op_next;
-            lastkidop = targetop;
+    case OP_REPEAT:
+        if (o->op_flags & OPf_STACKED) {
+            PL_modcount++;
+            break;
         }
+        if (!(o->op_private & OPpREPEAT_DOLIST))
+            goto nomod;
         else {
-            /* Move the target subtree from being the first of o's
-             * original children to being the first of *all* o's children.
+            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
              */
-            if (lastkidop) {
-                op_sibling_splice(o, lastkidop, 1, NULL); /* cut target op */
-                op_sibling_splice(o, NULL, 0, targetop);  /* and paste*/
-            }
-            else {
-                /* if the RHS of .= doesn't contain a concat (e.g.
-                 * $x .= "foo"), it gets missed by the "strip ops from the
-                 * tree and add to o" loop earlier */
-                assert(topop->op_type != OP_CONCAT);
-                if (stringop) {
-                    /* in e.g. $x .= "$y", move the $y expression
-                     * from being a child of OP_STRINGIFY to being the
-                     * second child of the OP_CONCAT
-                     */
-                    assert(cUNOPx(stringop)->op_first == topop);
-                    op_sibling_splice(stringop, NULL, 1, NULL);
-                    op_sibling_splice(o, cUNOPo->op_first, 0, topop);
-                }
-                assert(topop == OpSIBLING(cBINOPo->op_first));
-                if (toparg->p)
-                    op_null(topop);
-                lastkidop = topop;
+            modkids(cBINOPo->op_first, type);
+            if (type != OP_AASSIGN)
+                goto nomod;
+            kid = cBINOPo->op_last;
+            if (kid->op_type == OP_CONST && SvIOK(kSVOP_sv)) {
+                const IV iv = SvIV(kSVOP_sv);
+                if (PL_modcount != RETURN_UNLIMITED_NUMBER)
+                    PL_modcount =
+                        mods + (PL_modcount - mods) * (iv < 0 ? 0 : iv);
             }
+            else
+                PL_modcount = RETURN_UNLIMITED_NUMBER;
         }
+        break;
 
-        if (is_targable) {
-            /* optimise
-             *  my $lex  = A.B.C...
-             *     $lex  = A.B.C...
-             *     $lex .= A.B.C...
-             * The original padsv op is kept but nulled in case it's the
-             * entry point for the optree (which it will be for
-             * '$lex .=  ... '
-             */
-            private_flags |= OPpTARGET_MY;
-            private_flags |= (targetop->op_private & OPpLVAL_INTRO);
-            o->op_targ = targetop->op_targ;
-            targetop->op_targ = 0;
-            op_null(targetop);
-        }
-        else
-            flags |= OPf_STACKED;
-    }
-    else if (targmyop) {
-        private_flags |= OPpTARGET_MY;
-        if (o != targmyop) {
-            o->op_targ = targmyop->op_targ;
-            targmyop->op_targ = 0;
+    case OP_COND_EXPR:
+        localize = 1;
+        next_kid = OpSIBLING(cUNOPo->op_first);
+        break;
+
+    case OP_RV2AV:
+    case OP_RV2HV:
+        if (type == OP_REFGEN && o->op_flags & OPf_PARENS) {
+           PL_modcount = RETURN_UNLIMITED_NUMBER;
+           /* Treat \(@foo) like ordinary list, but still mark it as modi-
+              fiable since some contexts need to know.  */
+           o->op_flags |= OPf_MOD;
+           goto do_next;
         }
-    }
+        /* FALLTHROUGH */
+    case OP_RV2GV:
+        if (scalar_mod_type(o, type))
+            goto nomod;
+        ref(cUNOPo->op_first, o->op_type);
+        /* FALLTHROUGH */
+    case OP_ASLICE:
+    case OP_HSLICE:
+        localize = 1;
+        /* FALLTHROUGH */
+    case OP_AASSIGN:
+        /* Do not apply the lvsub flag for rv2[ah]v in scalar context.  */
+        if (type == OP_LEAVESUBLV && (
+                (o->op_type != OP_RV2AV && o->op_type != OP_RV2HV)
+             || (o->op_flags & OPf_WANT) != OPf_WANT_SCALAR
+           ))
+            o->op_private |= OPpMAYBE_LVSUB;
+        /* FALLTHROUGH */
+    case OP_NEXTSTATE:
+    case OP_DBSTATE:
+       PL_modcount = RETURN_UNLIMITED_NUMBER;
+        break;
 
-    /* detach the emaciated husk of the sprintf/concat optree and free it */
-    for (;;) {
-        kid = op_sibling_splice(o, lastkidop, 1, NULL);
-        if (!kid)
-            break;
-        op_free(kid);
-    }
+    case OP_KVHSLICE:
+    case OP_KVASLICE:
+    case OP_AKEYS:
+        if (type == OP_LEAVESUBLV)
+            o->op_private |= OPpMAYBE_LVSUB;
+        goto nomod;
 
-    /* and convert o into a multiconcat */
+    case OP_AVHVSWITCH:
+        if (type == OP_LEAVESUBLV
+         && (o->op_private & OPpAVHVSWITCH_MASK) + OP_EACH == OP_KEYS)
+            o->op_private |= OPpMAYBE_LVSUB;
+        goto nomod;
 
-    o->op_flags        = (flags|OPf_KIDS|stacked_last
-                         |(o->op_flags & (OPf_WANT|OPf_PARENS)));
-    o->op_private      = private_flags;
-    o->op_type         = OP_MULTICONCAT;
-    o->op_ppaddr       = PL_ppaddr[OP_MULTICONCAT];
-    cUNOP_AUXo->op_aux = aux;
-}
+    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;
+        /* FALLTHROUGH */
+    case OP_GV:
+        PL_hints |= HINT_BLOCK_SCOPE;
+        /* FALLTHROUGH */
+    case OP_SASSIGN:
+    case OP_ANDASSIGN:
+    case OP_ORASSIGN:
+    case OP_DORASSIGN:
+        PL_modcount++;
+        break;
 
-/* do all the final processing on an optree (e.g. running the peephole
- * optimiser on it), then attach it to cv (if cv is non-null)
- */
+    case OP_AELEMFAST:
+    case OP_AELEMFAST_LEX:
+        localize = -1;
+        PL_modcount++;
+        break;
 
-static void
-S_process_optree(pTHX_ CV *cv, OP *optree, OP* start)
-{
-    OP **startp;
+    case OP_PADAV:
+    case OP_PADHV:
+       PL_modcount = RETURN_UNLIMITED_NUMBER;
+        if (type == OP_REFGEN && o->op_flags & OPf_PARENS)
+        {
+           /* Treat \(@foo) like ordinary list, but still mark it as modi-
+              fiable since some contexts need to know.  */
+            o->op_flags |= OPf_MOD;
+            goto do_next;
+        }
+        if (scalar_mod_type(o, type))
+            goto nomod;
+        if ((o->op_flags & OPf_WANT) != OPf_WANT_SCALAR
+          && type == OP_LEAVESUBLV)
+            o->op_private |= OPpMAYBE_LVSUB;
+        /* FALLTHROUGH */
+    case OP_PADSV:
+        PL_modcount++;
+        if (!type) /* local() */
+            Perl_croak(aTHX_ "Can't localize lexical variable %" PNf,
+                              PNfARG(PAD_COMPNAME(o->op_targ)));
+        if (!(o->op_private & OPpLVAL_INTRO)
+         || (  type != OP_SASSIGN && type != OP_AASSIGN
+            && PadnameIsSTATE(PAD_COMPNAME_SV(o->op_targ))  ))
+            S_mark_padname_lvalue(aTHX_ PAD_COMPNAME_SV(o->op_targ));
+        break;
 
-    /* XXX for some reason, evals, require and main optrees are
-     * never attached to their CV; instead they just hang off
-     * PL_main_root + PL_main_start or PL_eval_root + PL_eval_start
-     * and get manually freed when appropriate */
-    if (cv)
-        startp = &CvSTART(cv);
-    else
-        startp = PL_in_eval? &PL_eval_start : &PL_main_start;
+    case OP_PUSHMARK:
+        localize = 0;
+        break;
 
-    *startp = start;
-    optree->op_private |= OPpREFCOUNTED;
-    OpREFCNT_set(optree, 1);
-    optimize_optree(optree);
-    CALL_PEEP(*startp);
-    finalize_optree(optree);
-    S_prune_chain_head(startp);
+    case OP_KEYS:
+        if (type != OP_LEAVESUBLV && !scalar_mod_type(NULL, type))
+            goto nomod;
+        goto lvalue_func;
+    case OP_SUBSTR:
+        if (o->op_private == 4) /* don't allow 4 arg substr as lvalue */
+            goto nomod;
+        /* FALLTHROUGH */
+    case OP_POS:
+    case OP_VEC:
+      lvalue_func:
+        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 */
 
-    if (cv) {
-        /* now that optimizer has done its work, adjust pad values */
-        pad_tidy(optree->op_type == OP_LEAVEWRITE ? padtidy_FORMAT
-                 : CvCLONE(cv) ? padtidy_SUBCLONE : padtidy_SUB);
-    }
-}
-
-
-/*
-=for apidoc optimize_optree
-
-This function applies some optimisations to the optree in top-down order.
-It is called before the peephole optimizer, which processes ops in
-execution order. Note that finalize_optree() also does a top-down scan,
-but is called *after* the peephole optimizer.
-
-=cut
-*/
-
-void
-Perl_optimize_optree(pTHX_ OP* o)
-{
-    PERL_ARGS_ASSERT_OPTIMIZE_OPTREE;
-
-    ENTER;
-    SAVEVPTR(PL_curcop);
-
-    optimize_op(o);
-
-    LEAVE;
-}
-
-
-#define warn_implicit_snail_cvsig(o)  S_warn_implicit_snail_cvsig(aTHX_ o)
-static void
-S_warn_implicit_snail_cvsig(pTHX_ OP *o)
-{
-    CV *cv = PL_compcv;
-    while(cv && CvEVAL(cv))
-        cv = CvOUTSIDE(cv);
-
-    if(cv && CvSIGNATURE(cv))
-        Perl_ck_warner_d(aTHX_ packWARN(WARN_EXPERIMENTAL__ARGS_ARRAY_WITH_SIGNATURES),
-            "Implicit use of @_ in %s with signatured subroutine is experimental", OP_DESC(o));
-}
-
-#define OP_ZOOM(o)  (OP_TYPE_IS(o, OP_NULL) ? cUNOPx(o)->op_first : (o))
-
-/* helper for optimize_optree() which optimises one op then recurses
- * to optimise any children.
- */
-
-STATIC void
-S_optimize_op(pTHX_ OP* o)
-{
-    OP *top_op = o;
-
-    PERL_ARGS_ASSERT_OPTIMIZE_OP;
-
-    while (1) {
-        OP * next_kid = NULL;
-
-        assert(o->op_type != OP_FREED);
+            /* substr and vec */
+            /* If this op is in merely potential (non-fatal) modifiable
+               context, then apply OP_ENTERSUB context to
+               the kid op (to avoid croaking).  Other-
+               wise pass this op’s own type so the correct op is mentioned
+               in error messages.  */
+            op_lvalue(OpSIBLING(cBINOPo->op_first),
+                      S_potential_mod_type(type)
+                        ? (I32)OP_ENTERSUB
+                        : o->op_type);
+        }
+        break;
 
-        switch (o->op_type) {
-        case OP_NEXTSTATE:
-        case OP_DBSTATE:
-            PL_curcop = ((COP*)o);             /* for warnings */
-            break;
+    case OP_AELEM:
+    case OP_HELEM:
+        ref(cBINOPo->op_first, o->op_type);
+        if (type == OP_ENTERSUB &&
+             !(o->op_private & (OPpLVAL_INTRO | OPpDEREF)))
+            o->op_private |= OPpLVAL_DEFER;
+        if (type == OP_LEAVESUBLV)
+            o->op_private |= OPpMAYBE_LVSUB;
+        localize = 1;
+        PL_modcount++;
+        break;
 
+    case OP_LEAVE:
+    case OP_LEAVELOOP:
+        o->op_private |= OPpLVALUE;
+        /* FALLTHROUGH */
+    case OP_SCOPE:
+    case OP_ENTER:
+    case OP_LINESEQ:
+        localize = 0;
+        if (o->op_flags & OPf_KIDS)
+            next_kid = cLISTOPo->op_last;
+        break;
 
-        case OP_CONCAT:
-        case OP_SASSIGN:
-        case OP_STRINGIFY:
-        case OP_SPRINTF:
-            S_maybe_multiconcat(aTHX_ o);
+    case OP_NULL:
+        localize = 0;
+        if (o->op_flags & OPf_SPECIAL)         /* do BLOCK */
+            goto nomod;
+        else if (!(o->op_flags & OPf_KIDS))
             break;
 
-        case OP_SUBST:
-            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;
+        if (o->op_targ != OP_LIST) {
+            OP *sib = OpSIBLING(cLISTOPo->op_first);
+            /* OP_TRANS and OP_TRANSR with argument have a weird optree
+             * that looks like
+             *
+             *   null
+             *      arg
+             *      trans
+             *
+             * compared with things like OP_MATCH which have the argument
+             * as a child:
+             *
+             *   match
+             *      arg
+             *
+             * so handle specially to correctly get "Can't modify" croaks etc
+             */
 
-        case OP_RV2AV:
-        {
-            OP *first = (o->op_flags & OPf_KIDS) ? cUNOPo->op_first : NULL;
-            CV *cv = PL_compcv;
-            while(cv && CvEVAL(cv))
-                cv = CvOUTSIDE(cv);
-
-            if(cv && CvSIGNATURE(cv) &&
-                    OP_TYPE_IS(first, OP_GV) && cGVOPx_gv(first) == PL_defgv) {
-                OP *parent = op_parent(o);
-                while(OP_TYPE_IS(parent, OP_NULL))
-                    parent = op_parent(parent);
-
-                Perl_ck_warner_d(aTHX_ packWARN(WARN_EXPERIMENTAL__ARGS_ARRAY_WITH_SIGNATURES),
-                    "Use of @_ in %s with signatured subroutine is experimental", OP_DESC(parent));
+            if (sib && (sib->op_type == OP_TRANS || sib->op_type == OP_TRANSR))
+            {
+                /* this should trigger a "Can't modify transliteration" err */
+                op_lvalue(sib, 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;
+        next_kid = cLISTOPo->op_first;
+        break;
 
-        case OP_SHIFT:
-        case OP_POP:
-            if(!CvUNIQUE(PL_compcv) && !(o->op_flags & OPf_KIDS))
-                warn_implicit_snail_cvsig(o);
-            break;
+    case OP_COREARGS:
+        goto do_next;
 
-        case OP_ENTERSUB:
-            if(!(o->op_flags & OPf_STACKED))
-                warn_implicit_snail_cvsig(o);
-            break;
+    case OP_AND:
+    case OP_OR:
+        if (type == OP_LEAVESUBLV
+         || !S_vivifies(cLOGOPo->op_first->op_type))
+            next_kid = cLOGOPo->op_first;
+        else if (type == OP_LEAVESUBLV
+         || !S_vivifies(OpSIBLING(cLOGOPo->op_first)->op_type))
+            next_kid = OpSIBLING(cLOGOPo->op_first);
+        goto nomod;
 
-        case OP_GOTO:
+    case OP_SREFGEN:
+        if (type == OP_NULL) { /* local */
+          local_refgen:
+            if (!FEATURE_MYREF_IS_ENABLED)
+                Perl_croak(aTHX_ "The experimental declared_refs "
+                                 "feature is not enabled");
+            Perl_ck_warner_d(aTHX_
+                     packWARN(WARN_EXPERIMENTAL__DECLARED_REFS),
+                    "Declaring references is experimental");
+            next_kid = cUNOPo->op_first;
+            goto do_next;
+        }
+        if (type != OP_AASSIGN && type != OP_SASSIGN
+         && type != OP_ENTERLOOP)
+            goto nomod;
+        /* Don’t bother applying lvalue context to the ex-list.  */
+        kid = cUNOPx(cUNOPo->op_first)->op_first;
+        assert (!OpHAS_SIBLING(kid));
+        goto kid_2lvref;
+    case OP_REFGEN:
+        if (type == OP_NULL) /* local */
+            goto local_refgen;
+        if (type != OP_AASSIGN) goto nomod;
+        kid = cUNOPo->op_first;
+      kid_2lvref:
         {
-            OP *first = (o->op_flags & OPf_KIDS) ? cUNOPo->op_first : NULL;
-            OP *ffirst;
-            if(OP_TYPE_IS(first, OP_SREFGEN) &&
-                    (ffirst = OP_ZOOM(cUNOPx(first)->op_first)) &&
-                    OP_TYPE_IS(ffirst, OP_RV2CV))
-                warn_implicit_snail_cvsig(o);
-            break;
+            const U8 ec = PL_parser ? PL_parser->error_count : 0;
+            S_lvref(aTHX_ kid, type);
+            if (!PL_parser || PL_parser->error_count == ec) {
+                if (!FEATURE_REFALIASING_IS_ENABLED)
+                    Perl_croak(aTHX_
+                       "Experimental aliasing via reference not enabled");
+                Perl_ck_warner_d(aTHX_
+                                 packWARN(WARN_EXPERIMENTAL__REFALIASING),
+                                "Aliasing via reference is experimental");
+            }
         }
+        if (o->op_type == OP_REFGEN)
+            op_null(cUNOPx(cUNOPo->op_first)->op_first); /* pushmark */
+        op_null(o);
+        goto do_next;
 
-        default:
+    case OP_SPLIT:
+        if ((o->op_private & OPpSPLIT_ASSIGN)) {
+            /* This is actually @array = split.  */
+            PL_modcount = RETURN_UNLIMITED_NUMBER;
             break;
         }
+        goto nomod;
 
-        if (o->op_flags & OPf_KIDS)
-            next_kid = cUNOPo->op_first;
+    case OP_SCALAR:
+        op_lvalue(cUNOPo->op_first, OP_ENTERSUB);
+        goto nomod;
 
-        /* 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
+    case OP_ANONCODE:
+        /* If we were to set OPf_REF on this and it was constructed by XS
+         * code as a child of an OP_REFGEN then we'd end up generating a
+         * double-ref when executed. We don't want to do that, so don't
+         * set flag here.
+         *   See also https://github.com/Perl/perl5/issues/20384
          */
-        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 */
-        }
-
-      /* this label not yet used. Goto here if any code above sets
-       * next-kid
-       get_next_op:
-       */
-        o = next_kid;
-    }
-}
 
+        // Perl always sets OPf_REF as of 5.37.5.
+        //
+        if (LIKELY(o->op_flags & OPf_REF)) goto nomod;
 
-/*
-=for apidoc finalize_optree
-
-This function finalizes the optree.  Should be called directly after
-the complete optree is built.  It does some additional
-checking which can't be done in the normal C<ck_>xxx functions and makes
-the tree thread-safe.
-
-=cut
-*/
-void
-Perl_finalize_optree(pTHX_ OP* o)
-{
-    PERL_ARGS_ASSERT_FINALIZE_OPTREE;
+        // If we got here, then our op came from an XS module that predates
+        // 5.37.5’s change to the op tree, which we have to handle a bit
+        // diffrently to preserve backward compatibility.
+        //
+        goto do_next;
+    }
 
-    ENTER;
-    SAVEVPTR(PL_curcop);
+    /* [20011101.069 (#7861)] File test operators interpret OPf_REF to mean that
+       their argument is a filehandle; thus \stat(".") should not set
+       it. AMS 20011102 */
+    if (type == OP_REFGEN && OP_IS_STAT(o->op_type))
+        goto do_next;
 
-    finalize_op(o);
+    if (type != OP_LEAVESUBLV)
+        o->op_flags |= OPf_MOD;
 
-    LEAVE;
-}
+    if (type == OP_AASSIGN || type == OP_SASSIGN)
+        o->op_flags |= o->op_type == OP_ENTERSUB ? 0 : OPf_SPECIAL|OPf_REF;
+    else if (!type) { /* local() */
+        switch (localize) {
+        case 1:
+            o->op_private |= OPpLVAL_INTRO;
+            o->op_flags &= ~OPf_SPECIAL;
+            PL_hints |= HINT_BLOCK_SCOPE;
+            break;
+        case 0:
+            break;
+        case -1:
+            Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
+                           "Useless localization of %s", OP_DESC(o));
+        }
+    }
+    else if (type != OP_GREPSTART && type != OP_ENTERSUB
+             && type != OP_LEAVESUBLV && o->op_type != OP_ENTERSUB)
+        o->op_flags |= OPf_REF;
 
-#ifdef USE_ITHREADS
-/* Relocate sv to the pad for thread safety.
- * Despite being a "constant", the SV is written to,
- * for reference counts, sv_upgrade() etc. */
-PERL_STATIC_INLINE void
-S_op_relocate_sv(pTHX_ SV** svp, PADOFFSET* targp)
-{
-    PADOFFSET ix;
-    PERL_ARGS_ASSERT_OP_RELOCATE_SV;
-    if (!*svp) return;
-    ix = pad_alloc(OP_CONST, SVf_READONLY);
-    SvREFCNT_dec(PAD_SVl(ix));
-    PAD_SETSV(ix, *svp);
-    /* XXX I don't know how this isn't readonly already. */
-    if (!SvIsCOW(PAD_SVl(ix))) SvREADONLY_on(PAD_SVl(ix));
-    *svp = NULL;
-    *targp = ix;
-}
-#endif
-
-/*
-=for apidoc traverse_op_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;
+            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 */
 
-Return the next op in a depth-first traversal of the op tree,
-returning NULL when the traversal is complete.
+    }
+    o = next_kid;
 
-The initial call must supply the root of the tree as both top and o.
+    } /* while */
 
-For now it's static, but it may be exposed to the API in the future.
+}
 
-=cut
-*/
 
-STATIC OP*
-S_traverse_op_tree(pTHX_ OP *top, OP *o) {
-    OP *sib;
+STATIC bool
+S_scalar_mod_type(const OP *o, I32 type)
+{
+    switch (type) {
+    case OP_POS:
+    case OP_SASSIGN:
+        if (o && o->op_type == OP_RV2GV)
+            return FALSE;
+        /* FALLTHROUGH */
+    case OP_PREINC:
+    case OP_PREDEC:
+    case OP_POSTINC:
+    case OP_POSTDEC:
+    case OP_I_PREINC:
+    case OP_I_PREDEC:
+    case OP_I_POSTINC:
+    case OP_I_POSTDEC:
+    case OP_POW:
+    case OP_MULTIPLY:
+    case OP_DIVIDE:
+    case OP_MODULO:
+    case OP_REPEAT:
+    case OP_ADD:
+    case OP_SUBTRACT:
+    case OP_I_MULTIPLY:
+    case OP_I_DIVIDE:
+    case OP_I_MODULO:
+    case OP_I_ADD:
+    case OP_I_SUBTRACT:
+    case OP_LEFT_SHIFT:
+    case OP_RIGHT_SHIFT:
+    case OP_BIT_AND:
+    case OP_BIT_XOR:
+    case OP_BIT_OR:
+    case OP_NBIT_AND:
+    case OP_NBIT_XOR:
+    case OP_NBIT_OR:
+    case OP_SBIT_AND:
+    case OP_SBIT_XOR:
+    case OP_SBIT_OR:
+    case OP_CONCAT:
+    case OP_SUBST:
+    case OP_TRANS:
+    case OP_TRANSR:
+    case OP_READ:
+    case OP_SYSREAD:
+    case OP_RECV:
+    case OP_ANDASSIGN:
+    case OP_ORASSIGN:
+    case OP_DORASSIGN:
+    case OP_VEC:
+    case OP_SUBSTR:
+        return TRUE;
+    default:
+        return FALSE;
+    }
+}
 
-    PERL_ARGS_ASSERT_TRAVERSE_OP_TREE;
+STATIC bool
+S_is_handle_constructor(const OP *o, I32 numargs)
+{
+    PERL_ARGS_ASSERT_IS_HANDLE_CONSTRUCTOR;
 
-    if ((o->op_flags & OPf_KIDS) && cUNOPo->op_first) {
-        return cUNOPo->op_first;
-    }
-    else if ((sib = OpSIBLING(o))) {
-        return sib;
+    switch (o->op_type) {
+    case OP_PIPE_OP:
+    case OP_SOCKPAIR:
+        if (numargs == 2)
+            return TRUE;
+        /* FALLTHROUGH */
+    case OP_SYSOPEN:
+    case OP_OPEN:
+    case OP_SELECT:            /* XXX c.f. SelectSaver.pm */
+    case OP_SOCKET:
+    case OP_OPEN_DIR:
+    case OP_ACCEPT:
+        if (numargs == 1)
+            return TRUE;
+        /* FALLTHROUGH */
+    default:
+        return FALSE;
     }
-    else {
-        OP *parent = o->op_sibparent;
-        assert(!(o->op_moresib));
-        while (parent && parent != top) {
-            OP *sib = OpSIBLING(parent);
-            if (sib)
-                return sib;
-            parent = parent->op_sibparent;
-        }
+}
 
-        return NULL;
+static OP *
+S_refkids(pTHX_ OP *o, I32 type)
+{
+    if (o && o->op_flags & OPf_KIDS) {
+        OP *kid;
+        for (kid = cLISTOPo->op_first; kid; kid = OpSIBLING(kid))
+            ref(kid, type);
     }
+    return o;
 }
 
-STATIC void
-S_finalize_op(pTHX_ OP* 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)
 {
-    OP * const top = o;
-    PERL_ARGS_ASSERT_FINALIZE_OP;
+    OP * top_op = o;
 
-    do {
-        assert(o->op_type != OP_FREED);
+    PERL_ARGS_ASSERT_DOREF;
+
+    if (PL_parser && PL_parser->error_count)
+        return o;
 
+    while (1) {
         switch (o->op_type) {
-        case OP_NEXTSTATE:
-        case OP_DBSTATE:
-            PL_curcop = ((COP*)o);             /* for warnings */
-            break;
-        case OP_EXEC:
-            if (OpHAS_SIBLING(o)) {
-                OP *sib = OpSIBLING(o);
-                if ((  sib->op_type == OP_NEXTSTATE || sib->op_type == OP_DBSTATE)
-                    && ckWARN(WARN_EXEC)
-                    && OpHAS_SIBLING(sib))
-                {
-                    const OPCODE type = OpSIBLING(sib)->op_type;
-                    if (type != OP_EXIT && type != OP_WARN && type != OP_DIE) {
-                        const line_t oldline = CopLINE(PL_curcop);
-                        CopLINE_set(PL_curcop, CopLINE((COP*)sib));
-                        Perl_warner(aTHX_ packWARN(WARN_EXEC),
-                            "Statement unlikely to be reached");
-                        Perl_warner(aTHX_ packWARN(WARN_EXEC),
-                            "\t(Maybe you meant system() when you said exec()?)\n");
-                        CopLINE_set(PL_curcop, oldline);
-                    }
-                }
+        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(cLISTOPx(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;
 
-        case OP_GV:
-            if ((o->op_private & OPpEARLY_CV) && ckWARN(WARN_PROTOTYPE)) {
-                GV * const gv = cGVOPo_gv;
-                if (SvTYPE(gv) == SVt_PVGV && GvCV(gv) && SvPVX_const(GvCV(gv))) {
-                    /* XXX could check prototype here instead of just carping */
-                    SV * const sv = sv_newmortal();
-                    gv_efullname3(sv, gv, NULL);
-                    Perl_warner(aTHX_ packWARN(WARN_PROTOTYPE),
-                                "%" SVf "() called too early to check prototype",
-                                SVfARG(sv));
-                }
+        case OP_COND_EXPR:
+            o = OpSIBLING(cUNOPo->op_first);
+            continue;
+
+        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_CONST:
-            if (cSVOPo->op_private & OPpCONST_STRICT)
-                no_bareword_allowed(o);
-#ifdef USE_ITHREADS
+        case OP_RV2AV:
+        case OP_RV2HV:
+            if (set_op_ref)
+                o->op_flags |= OPf_REF;
             /* FALLTHROUGH */
-        case OP_HINTSEVAL:
-            op_relocate_sv(&cSVOPo->op_sv, &o->op_targ);
-#endif
-            break;
+        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;
 
-#ifdef USE_ITHREADS
-            /* Relocate all the METHOP's SVs to the pad for thread safety. */
-        case OP_METHOD_NAMED:
-        case OP_METHOD_SUPER:
-        case OP_METHOD_REDIR:
-        case OP_METHOD_REDIR_SUPER:
-            op_relocate_sv(&cMETHOPx(o)->op_u.op_meth_sv, &o->op_targ);
+        case OP_PADAV:
+        case OP_PADHV:
+            if (set_op_ref)
+                o->op_flags |= OPf_REF;
             break;
-#endif
-
-        case OP_HELEM: {
-            UNOP *rop;
-            SVOP *key_op;
-            OP *kid;
 
-            if ((key_op = cSVOPx(((BINOP*)o)->op_last))->op_type != OP_CONST)
+        case OP_SCALAR:
+        case OP_NULL:
+            if (!(o->op_flags & OPf_KIDS) || type == OP_DEFINED)
                 break;
+             o = cBINOPo->op_first;
+            continue;
 
-            rop = (UNOP*)((BINOP*)o)->op_first;
-
-            goto check_keys;
-
-            case OP_HSLICE:
-                S_scalar_slice_warning(aTHX_ o);
-                /* FALLTHROUGH */
-
-            case OP_KVHSLICE:
-                kid = OpSIBLING(cLISTOPo->op_first);
-            if (/* I bet there's always a pushmark... */
-                OP_TYPE_ISNT_AND_WASNT_NN(kid, OP_LIST)
-                && OP_TYPE_ISNT_NN(kid, OP_CONST))
-            {
-                break;
+        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;;
 
-            key_op = (SVOP*)(kid->op_type == OP_CONST
-                             ? kid
-                             : OpSIBLING(kLISTOP->op_first));
-
-            rop = (UNOP*)((LISTOP*)o)->op_last;
+        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;
 
-        check_keys:
-            if (o->op_private & OPpLVAL_INTRO || rop->op_type != OP_RV2HV)
-                rop = NULL;
-            S_check_hash_fields_and_hekify(aTHX_ rop, key_op, 1);
+        default:
             break;
-        }
-        case OP_NULL:
-            if (o->op_targ != OP_HSLICE && o->op_targ != OP_ASLICE)
-                break;
-            /* FALLTHROUGH */
-        case OP_ASLICE:
-            S_scalar_slice_warning(aTHX_ o);
-            break;
-
-        case OP_SUBST: {
-            if (cPMOPo->op_pmreplrootu.op_pmreplroot)
-                finalize_op(cPMOPo->op_pmreplrootu.op_pmreplroot);
-            break;
-        }
-        default:
-            break;
-        }
-
-#ifdef DEBUGGING
-        if (o->op_flags & OPf_KIDS) {
-            OP *kid;
+        } /* switch */
 
-            /* check that op_last points to the last sibling, and that
-             * the last op_sibling/op_sibparent field points back to the
-             * parent, and that the only ops with KIDS are those which are
-             * entitled to them */
-            U32 type = o->op_type;
-            U32 family;
-            bool has_last;
-
-            if (type == OP_NULL) {
-                type = o->op_targ;
-                /* ck_glob creates a null UNOP with ex-type GLOB
-                 * (which is a list op. So pretend it wasn't a listop */
-                if (type == OP_GLOB)
-                    type = OP_NULL;
-            }
-            family = PL_opargs[type] & OA_CLASS_MASK;
-
-            has_last = (   family == OA_BINOP
-                        || family == OA_LISTOP
-                        || family == OA_PMOP
-                        || family == OA_LOOP
-                       );
-            assert(  has_last /* has op_first and op_last, or ...
-                  ... has (or may have) op_first: */
-                  || family == OA_UNOP
-                  || family == OA_UNOP_AUX
-                  || family == OA_LOGOP
-                  || family == OA_BASEOP_OR_UNOP
-                  || family == OA_FILESTATOP
-                  || family == OA_LOOPEXOP
-                  || family == OA_METHOP
-                  || type == OP_CUSTOM
-                  || type == OP_NULL /* new_logop does this */
-                  );
-
-            for (kid = cUNOPo->op_first; kid; kid = OpSIBLING(kid)) {
-                if (!OpHAS_SIBLING(kid)) {
-                    if (has_last)
-                        assert(kid == cLISTOPo->op_last);
-                    assert(kid->op_sibparent == o);
-                }
+        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 */
         }
-#endif
-    } while (( o = traverse_op_tree(top, o)) != NULL);
+    } /* while */
 }
 
-static void
-S_mark_padname_lvalue(pTHX_ PADNAME *pn)
+
+STATIC OP *
+S_dup_attrlist(pTHX_ OP *o)
 {
-    CV *cv = PL_compcv;
-    PadnameLVALUE_on(pn);
-    while (PadnameOUTER(pn) && PARENT_PAD_INDEX(pn)) {
-        cv = CvOUTSIDE(cv);
-        /* RT #127786: cv can be NULL due to an eval within the DB package
-         * called from an anon sub - anon subs don't have CvOUTSIDE() set
-         * unless they contain an eval, but calling eval within DB
-         * pretends the eval was done in the caller's scope.
-         */
-        if (!cv)
-            break;
-        assert(CvPADLIST(cv));
-        pn =
-           PadlistNAMESARRAY(CvPADLIST(cv))[PARENT_PAD_INDEX(pn)];
-        assert(PadnameLEN(pn));
-        PadnameLVALUE_on(pn);
+    OP *rop;
+
+    PERL_ARGS_ASSERT_DUP_ATTRLIST;
+
+    /* An attrlist is either a simple OP_CONST or an OP_LIST with kids,
+     * where the first kid is OP_PUSHMARK and the remaining ones
+     * are OP_CONST.  We need to push the OP_CONST values.
+     */
+    if (o->op_type == OP_CONST)
+        rop = newSVOP(OP_CONST, o->op_flags, SvREFCNT_inc_NN(cSVOPo->op_sv));
+    else {
+        assert((o->op_type == OP_LIST) && (o->op_flags & OPf_KIDS));
+        rop = NULL;
+        for (o = cLISTOPo->op_first; o; o = OpSIBLING(o)) {
+            if (o->op_type == OP_CONST)
+                rop = op_append_elem(OP_LIST, rop,
+                                  newSVOP(OP_CONST, o->op_flags,
+                                          SvREFCNT_inc_NN(cSVOPo->op_sv)));
+        }
     }
+    return rop;
 }
 
-static bool
-S_vivifies(const OPCODE type)
+STATIC void
+S_apply_attrs(pTHX_ HV *stash, SV *target, OP *attrs)
 {
-    switch(type) {
-    case OP_RV2AV:     case   OP_ASLICE:
-    case OP_RV2HV:     case OP_KVASLICE:
-    case OP_RV2SV:     case   OP_HSLICE:
-    case OP_AELEMFAST: case OP_KVHSLICE:
-    case OP_HELEM:
-    case OP_AELEM:
-        return 1;
+    PERL_ARGS_ASSERT_APPLY_ATTRS;
+    {
+        SV * const stashsv = newSVhek(HvNAME_HEK(stash));
+
+        /* fake up C<use attributes $pkg,$rv,@attrs> */
+
+#define ATTRSMODULE "attributes"
+#define ATTRSMODULE_PM "attributes.pm"
+
+        Perl_load_module(
+          aTHX_ PERL_LOADMOD_IMPORT_OPS,
+          newSVpvs(ATTRSMODULE),
+          NULL,
+          op_prepend_elem(OP_LIST,
+                          newSVOP(OP_CONST, 0, stashsv),
+                          op_prepend_elem(OP_LIST,
+                                          newSVOP(OP_CONST, 0,
+                                                  newRV(target)),
+                                          dup_attrlist(attrs))));
     }
-    return 0;
 }
 
+STATIC void
+S_apply_attrs_my(pTHX_ HV *stash, OP *target, OP *attrs, OP **imopsp)
+{
+    OP *pack, *imop, *arg;
+    SV *meth, *stashsv, **svp;
 
-/* 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) = (...)
- */
+    PERL_ARGS_ASSERT_APPLY_ATTRS_MY;
 
-static void
-S_lvref(pTHX_ OP *o, I32 type)
-{
-    OP *kid;
-    OP * top_op = o;
+    if (!attrs)
+        return;
 
-    while (1) {
-        switch (o->op_type) {
-        case OP_COND_EXPR:
-            o = OpSIBLING(cUNOPo->op_first);
-            continue;
+    assert(target->op_type == OP_PADSV ||
+           target->op_type == OP_PADHV ||
+           target->op_type == OP_PADAV);
 
-        case OP_PUSHMARK:
-            goto do_next;
+    /* Ensure that attributes.pm is loaded. */
+    /* Don't force the C<use> if we don't need it. */
+    svp = hv_fetchs(GvHVn(PL_incgv), ATTRSMODULE_PM, FALSE);
+    if (svp && *svp != &PL_sv_undef)
+        NOOP;  /* already in %INC */
+    else
+        Perl_load_module(aTHX_ PERL_LOADMOD_NOIMPORT,
+                               newSVpvs(ATTRSMODULE), NULL);
 
-        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;
+    /* Need package name for method call. */
+    pack = newSVOP(OP_CONST, 0, newSVpvs(ATTRSMODULE));
 
-        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;
+    /* Build up the real arg-list. */
+    stashsv = newSVhek(HvNAME_HEK(stash));
 
-        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;
+    arg = newPADxVOP(OP_PADSV, 0, target->op_targ);
+    arg = op_prepend_elem(OP_LIST,
+                       newSVOP(OP_CONST, 0, stashsv),
+                       op_prepend_elem(OP_LIST,
+                                    newUNOP(OP_REFGEN, 0,
+                                            arg),
+                                    dup_attrlist(attrs)));
 
-        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;
+    /* Fake up a method call to import */
+    meth = newSVpvs_share("import");
+    imop = op_convert_list(OP_ENTERSUB, OPf_STACKED|OPf_WANT_VOID,
+                   op_append_elem(OP_LIST,
+                               op_prepend_elem(OP_LIST, pack, arg),
+                               newMETHOP_named(OP_METHOD_NAMED, 0, meth)));
 
-        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;
+    /* Combine the ops. */
+    *imopsp = op_append_elem(OP_LIST, *imopsp, imop);
+}
 
-        case OP_AELEM:
-        case OP_HELEM:
-            o->op_private |= OPpLVREF_ELEM;
-            o->op_flags   |= OPf_STACKED;
-            break;
+/*
+=notfor apidoc apply_attrs_string
 
-        case OP_ASLICE:
-        case OP_HSLICE:
-            OpTYPE_set(o, OP_LVREFSLICE);
-            o->op_private &= OPpLVAL_INTRO;
-            goto do_next;
+Attempts to apply a list of attributes specified by the C<attrstr> and
+C<len> arguments to the subroutine identified by the C<cv> argument which
+is expected to be associated with the package identified by the C<stashpv>
+argument (see L<attributes>).  It gets this wrong, though, in that it
+does not correctly identify the boundaries of the individual attribute
+specifications within C<attrstr>.  This is not really intended for the
+public API, but has to be listed here for systems such as AIX which
+need an explicit export list for symbols.  (It's called from XS code
+in support of the C<ATTRS:> keyword from F<xsubpp>.)  Patches to fix it
+to respect attribute syntax properly would be welcome.
 
-        case OP_NULL:
-            if (o->op_flags & OPf_SPECIAL)             /* do BLOCK */
-                goto badref;
-            else if (!(o->op_flags & OPf_KIDS))
-                goto do_next;
+=cut
+*/
 
-            /* 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;
+void
+Perl_apply_attrs_string(pTHX_ const char *stashpv, CV *cv,
+                        const char *attrstr, STRLEN len)
+{
+    OP *attrs = NULL;
 
-        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;
-        }
+    PERL_ARGS_ASSERT_APPLY_ATTRS_STRING;
 
-        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;
+    if (!len) {
+        len = strlen(attrstr);
+    }
 
-      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 (len) {
+        for (; isSPACE(*attrstr) && len; --len, ++attrstr) ;
+        if (len) {
+            const char * const sstr = attrstr;
+            for (; !isSPACE(*attrstr) && len; --len, ++attrstr) ;
+            attrs = op_append_elem(OP_LIST, attrs,
+                                newSVOP(OP_CONST, 0,
+                                        newSVpvn(sstr, attrstr-sstr)));
         }
-    } /* while */
-}
-
+    }
 
-PERL_STATIC_INLINE bool
-S_potential_mod_type(I32 type)
-{
-    /* Types that only potentially result in modification.  */
-    return type == OP_GREPSTART || type == OP_ENTERSUB
-        || type == OP_REFGEN    || type == OP_LEAVESUBLV;
+    Perl_load_module(aTHX_ PERL_LOADMOD_IMPORT_OPS,
+                     newSVpvs(ATTRSMODULE),
+                     NULL, op_prepend_elem(OP_LIST,
+                                  newSVOP(OP_CONST, 0, newSVpv(stashpv,0)),
+                                  op_prepend_elem(OP_LIST,
+                                               newSVOP(OP_CONST, 0,
+                                                       newRV(MUTABLE_SV(cv))),
+                                               attrs)));
 }
 
+STATIC void
+S_move_proto_attr(pTHX_ OP **proto, OP **attrs, const GV * name,
+                        bool curstash)
+{
+    OP *new_proto = NULL;
+    STRLEN pvlen;
+    char *pv;
+    OP *o;
 
-/*
-=for apidoc op_lvalue
+    PERL_ARGS_ASSERT_MOVE_PROTO_ATTR;
 
-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).
+    if (!*attrs)
+        return;
 
-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>.
+    o = *attrs;
+    if (o->op_type == OP_CONST) {
+        pv = SvPV(cSVOPo_sv, pvlen);
+        if (memBEGINs(pv, pvlen, "prototype(")) {
+            SV * const tmpsv = newSVpvn_flags(pv + 10, pvlen - 11, SvUTF8(cSVOPo_sv));
+            SV ** const tmpo = cSVOPx_svp(o);
+            SvREFCNT_dec(cSVOPo_sv);
+            *tmpo = tmpsv;
+            new_proto = o;
+            *attrs = NULL;
+        }
+    } else if (o->op_type == OP_LIST) {
+        OP * lasto;
+        assert(o->op_flags & OPf_KIDS);
+        lasto = cLISTOPo->op_first;
+        assert(lasto->op_type == OP_PUSHMARK);
+        for (o = OpSIBLING(lasto); o; o = OpSIBLING(o)) {
+            if (o->op_type == OP_CONST) {
+                pv = SvPV(cSVOPo_sv, pvlen);
+                if (memBEGINs(pv, pvlen, "prototype(")) {
+                    SV * const tmpsv = newSVpvn_flags(pv + 10, pvlen - 11, SvUTF8(cSVOPo_sv));
+                    SV ** const tmpo = cSVOPx_svp(o);
+                    SvREFCNT_dec(cSVOPo_sv);
+                    *tmpo = tmpsv;
+                    if (new_proto && ckWARN(WARN_MISC)) {
+                        STRLEN new_len;
+                        const char * newp = SvPV(cSVOPo_sv, new_len);
+                        Perl_warner(aTHX_ packWARN(WARN_MISC),
+                            "Attribute prototype(%" UTF8f ") discards earlier prototype attribute in same sub",
+                            UTF8fARG(SvUTF8(cSVOPo_sv), new_len, newp));
+                        op_free(new_proto);
+                    }
+                    else if (new_proto)
+                        op_free(new_proto);
+                    new_proto = o;
+                    /* excise new_proto from the list */
+                    op_sibling_splice(*attrs, lasto, 1, NULL);
+                    o = lasto;
+                    continue;
+                }
+            }
+            lasto = o;
+        }
+        /* If the list is now just the PUSHMARK, scrap the whole thing; otherwise attributes.xs
+           would get pulled in with no real need */
+        if (!OpHAS_SIBLING(cLISTOPx(*attrs)->op_first)) {
+            op_free(*attrs);
+            *attrs = NULL;
+        }
+    }
 
-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>.
+    if (new_proto) {
+        SV *svname;
+        if (isGV(name)) {
+            svname = sv_newmortal();
+            gv_efullname3(svname, name, NULL);
+        }
+        else if (SvPOK(name) && *SvPVX((SV *)name) == '&')
+            svname = newSVpvn_flags(SvPVX((SV *)name)+1, SvCUR(name)-1, SvUTF8(name)|SVs_TEMP);
+        else
+            svname = (SV *)name;
+        if (ckWARN(WARN_ILLEGALPROTO))
+            (void)validate_proto(svname, cSVOPx_sv(new_proto), TRUE,
+                                 curstash);
+        if (*proto && ckWARN(WARN_PROTOTYPE)) {
+            STRLEN old_len, new_len;
+            const char * oldp = SvPV(cSVOPx_sv(*proto), old_len);
+            const char * newp = SvPV(cSVOPx_sv(new_proto), new_len);
 
-=cut
+            if (curstash && svname == (SV *)name
+             && !memchr(SvPVX(svname), ':', SvCUR(svname))) {
+                svname = sv_2mortal(newSVsv(PL_curstname));
+                sv_catpvs(svname, "::");
+                sv_catsv(svname, (SV *)name);
+            }
 
-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
+            Perl_warner(aTHX_ packWARN(WARN_PROTOTYPE),
+                "Prototype '%" UTF8f "' overridden by attribute 'prototype(%" UTF8f ")'"
+                " in %" SVf,
+                UTF8fARG(SvUTF8(cSVOPx_sv(*proto)), old_len, oldp),
+                UTF8fARG(SvUTF8(cSVOPx_sv(new_proto)), new_len, newp),
+                SVfARG(svname));
+        }
+        if (*proto)
+            op_free(*proto);
+        *proto = new_proto;
+    }
+}
 
-*/
+static void
+S_cant_declare(pTHX_ OP *o)
+{
+    if (o->op_type == OP_NULL
+     && (o->op_flags & (OPf_SPECIAL|OPf_KIDS)) == OPf_KIDS)
+        o = cUNOPo->op_first;
+    yyerror(Perl_form(aTHX_ "Can't declare %s in \"%s\"",
+                             o->op_type == OP_NULL
+                               && o->op_flags & OPf_SPECIAL
+                                 ? "do block"
+                                 : OP_DESC(o),
+                             PL_parser->in_my == KEY_our   ? "our"   :
+                             PL_parser->in_my == KEY_state ? "state" :
+                                                             "my"));
+}
 
-OP *
-Perl_op_lvalue_flags(pTHX_ OP *o, I32 type, U32 flags)
+STATIC OP *
+S_my_kid(pTHX_ OP *o, OP *attrs, OP **imopsp)
 {
-    OP *top_op = o;
+    I32 type;
+    const bool stately = PL_parser && PL_parser->in_my == KEY_state;
+
+    PERL_ARGS_ASSERT_MY_KID;
 
     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;
+    type = o->op_type;
 
-    if ((o->op_private & OPpTARGET_MY)
-        && (PL_opargs[o->op_type] & OA_TARGLEX))/* OPp share the meaning */
+    if (OP_TYPE_IS_OR_WAS(o, OP_LIST)) {
+        OP *kid;
+        for (kid = cLISTOPo->op_first; kid; kid = OpSIBLING(kid))
+            my_kid(kid, attrs, imopsp);
+        return o;
+    } else if (type == OP_UNDEF || type == OP_STUB) {
+        return o;
+    } else if (type == OP_RV2SV ||     /* "our" declaration */
+               type == OP_RV2AV ||
+               type == OP_RV2HV) {
+        if (cUNOPo->op_first->op_type != OP_GV) { /* MJD 20011224 */
+            S_cant_declare(aTHX_ o);
+        } else if (attrs) {
+            GV * const gv = cGVOPx_gv(cUNOPo->op_first);
+            assert(PL_parser);
+            PL_parser->in_my = FALSE;
+            PL_parser->in_my_stash = NULL;
+            apply_attrs(GvSTASH(gv),
+                        (type == OP_RV2SV ? GvSVn(gv) :
+                         type == OP_RV2AV ? MUTABLE_SV(GvAVn(gv)) :
+                         type == OP_RV2HV ? MUTABLE_SV(GvHVn(gv)) : MUTABLE_SV(gv)),
+                        attrs);
+        }
+        o->op_private |= OPpOUR_INTRO;
+        return o;
+    }
+    else if (type == OP_REFGEN || type == OP_SREFGEN) {
+        if (!FEATURE_MYREF_IS_ENABLED)
+            Perl_croak(aTHX_ "The experimental declared_refs "
+                             "feature is not enabled");
+        Perl_ck_warner_d(aTHX_
+             packWARN(WARN_EXPERIMENTAL__DECLARED_REFS),
+            "Declaring references is experimental");
+        /* Kid is a nulled OP_LIST, handled above.  */
+        my_kid(cUNOPo->op_first, attrs, imopsp);
+        return o;
+    }
+    else if (type != OP_PADSV &&
+             type != OP_PADAV &&
+             type != OP_PADHV &&
+             type != OP_PUSHMARK)
     {
-        goto do_next;
+        S_cant_declare(aTHX_ o);
+        return o;
     }
+    else if (attrs && type != OP_PUSHMARK) {
+        HV *stash;
 
-    /* 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;
+        assert(PL_parser);
+        PL_parser->in_my = FALSE;
+        PL_parser->in_my_stash = NULL;
 
-    switch (o->op_type) {
-    case OP_UNDEF:
-        if (type == OP_SASSIGN)
-            goto nomod;
-        PL_modcount++;
-        goto do_next;
+        /* check for C<my Dog $spot> when deciding package */
+        stash = PAD_COMPNAME_TYPE(o->op_targ);
+        if (!stash)
+            stash = PL_curstash;
+        apply_attrs_my(stash, o, attrs, imopsp);
+    }
+    o->op_flags |= OPf_MOD;
+    o->op_private |= OPpLVAL_INTRO;
+    if (stately)
+        o->op_private |= OPpPAD_STATE;
+    return o;
+}
 
-    case OP_STUB:
-        if ((o->op_flags & OPf_PARENS))
-            break;
-        goto nomod;
+OP *
+Perl_my_attrs(pTHX_ OP *o, OP *attrs)
+{
+    OP *rops;
+    int maybe_scalar = 0;
 
-    case OP_ENTERSUB:
-        if ((type == OP_UNDEF || type == OP_REFGEN || type == OP_LOCK) &&
-            !(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 */
-            break;
-        }
-        else {                         /* lvalue subroutine call */
+    PERL_ARGS_ASSERT_MY_ATTRS;
+
+/* [perl #17376]: this appears to be premature, and results in code such as
+   C< our(%x); > executing in list mode rather than void mode */
+#if 0
+    if (o->op_flags & OPf_PARENS)
+        list(o);
+    else
+        maybe_scalar = 1;
+#else
+    maybe_scalar = 1;
+#endif
+    if (attrs)
+        SAVEFREEOP(attrs);
+    rops = NULL;
+    o = my_kid(o, attrs, &rops);
+    if (rops) {
+        if (maybe_scalar && o->op_type == OP_PADSV) {
+            o = scalar(op_append_list(OP_LIST, rops, o));
             o->op_private |= OPpLVAL_INTRO;
-            PL_modcount = RETURN_UNLIMITED_NUMBER;
-            if (S_potential_mod_type(type)) {
-                o->op_private |= OPpENTERSUB_INARGS;
-                break;
+        }
+        else {
+            /* The listop in rops might have a pushmark at the beginning,
+               which will mess up list assignment. */
+            LISTOP * const lrops = cLISTOPx(rops); /* for brevity */
+            if (rops->op_type == OP_LIST &&
+                lrops->op_first && lrops->op_first->op_type == OP_PUSHMARK)
+            {
+                OP * const pushmark = lrops->op_first;
+                /* excise pushmark */
+                op_sibling_splice(rops, NULL, 1, NULL);
+                op_free(pushmark);
             }
-            else {                      /* Compile-time error message: */
-                OP *kid = cUNOPo->op_first;
-                CV *cv;
-                GV *gv;
-                SV *namesv;
+            o = op_append_list(OP_LIST, o, rops);
+        }
+    }
+    PL_parser->in_my = FALSE;
+    PL_parser->in_my_stash = NULL;
+    return o;
+}
 
-                if (kid->op_type != OP_PUSHMARK) {
-                    if (kid->op_type != OP_NULL || kid->op_targ != OP_LIST)
-                        Perl_croak(aTHX_
-                                "panic: unexpected lvalue entersub "
-                                "args: type/targ %ld:%" UVuf,
-                                (long)kid->op_type, (UV)kid->op_targ);
-                    kid = kLISTOP->op_first;
-                }
-                while (OpHAS_SIBLING(kid))
-                    kid = OpSIBLING(kid);
-                if (!(kid->op_type == OP_NULL && kid->op_targ == OP_RV2CV)) {
-                    break;     /* Postpone until runtime */
-                }
+OP *
+Perl_sawparens(pTHX_ OP *o)
+{
+    PERL_UNUSED_CONTEXT;
+    if (o)
+        o->op_flags |= OPf_PARENS;
+    return o;
+}
 
-                kid = kUNOP->op_first;
-                if (kid->op_type == OP_NULL && kid->op_targ == OP_RV2SV)
-                    kid = kUNOP->op_first;
-                if (kid->op_type == OP_NULL)
-                    Perl_croak(aTHX_
-                               "panic: unexpected constant lvalue entersub "
-                               "entry via type/targ %ld:%" UVuf,
-                               (long)kid->op_type, (UV)kid->op_targ);
-                if (kid->op_type != OP_GV) {
-                    break;
-                }
+OP *
+Perl_bind_match(pTHX_ I32 type, OP *left, OP *right)
+{
+    OP *o;
+    bool ismatchop = 0;
+    const OPCODE ltype = left->op_type;
+    const OPCODE rtype = right->op_type;
 
-                gv = kGVOP_gv;
-                cv = isGV(gv)
-                    ? GvCV(gv)
-                    : SvROK(gv) && SvTYPE(SvRV(gv)) == SVt_PVCV
-                        ? MUTABLE_CV(SvRV(gv))
-                        : NULL;
-                if (!cv)
-                    break;
-                if (CvLVALUE(cv))
-                    break;
-                if (flags & OP_LVALUE_NO_CROAK)
-                    return NULL;
+    PERL_ARGS_ASSERT_BIND_MATCH;
 
-                namesv = cv_name(cv, NULL, 0);
-                yyerror_pv(Perl_form(aTHX_ "Can't modify non-lvalue "
-                                     "subroutine call of &%" SVf " in %s",
-                                     SVfARG(namesv), PL_op_desc[type]),
-                           SvUTF8(namesv));
-                goto do_next;
-            }
-        }
-        /* FALLTHROUGH */
-    default:
-      nomod:
-        if (flags & OP_LVALUE_NO_CROAK) return NULL;
-        /* grep, foreach, subcalls, refgen */
-        if (S_potential_mod_type(type))
-            break;
-        yyerror(Perl_form(aTHX_ "Can't modify %s in %s",
-                     (o->op_type == OP_NULL && (o->op_flags & OPf_SPECIAL)
-                      ? "do block"
-                      : OP_DESC(o)),
-                     type ? PL_op_desc[type] : "local"));
-        goto do_next;
+    if ( (ltype == OP_RV2AV || ltype == OP_RV2HV || ltype == OP_PADAV
+          || ltype == OP_PADHV) && ckWARN(WARN_MISC))
+    {
+      const char * const desc
+          = PL_op_desc[(
+                          rtype == OP_SUBST || rtype == OP_TRANS
+                       || rtype == OP_TRANSR
+                       )
+                       ? (int)rtype : OP_MATCH];
+      const bool isary = ltype == OP_RV2AV || ltype == OP_PADAV;
+      SV * const name = op_varname(left);
+      if (name)
+        Perl_warner(aTHX_ packWARN(WARN_MISC),
+             "Applying %s to %" SVf " will act on scalar(%" SVf ")",
+             desc, SVfARG(name), SVfARG(name));
+      else {
+        const char * const sample = (isary
+             ? "@array" : "%hash");
+        Perl_warner(aTHX_ packWARN(WARN_MISC),
+             "Applying %s to %s will act on scalar(%s)",
+             desc, sample, sample);
+      }
+    }
 
-    case OP_PREINC:
-    case OP_PREDEC:
-    case OP_POW:
-    case OP_MULTIPLY:
-    case OP_DIVIDE:
-    case OP_MODULO:
-    case OP_ADD:
-    case OP_SUBTRACT:
-    case OP_CONCAT:
-    case OP_LEFT_SHIFT:
-    case OP_RIGHT_SHIFT:
-    case OP_BIT_AND:
-    case OP_BIT_XOR:
-    case OP_BIT_OR:
-    case OP_I_MULTIPLY:
-    case OP_I_DIVIDE:
-    case OP_I_MODULO:
-    case OP_I_ADD:
-    case OP_I_SUBTRACT:
-        if (!(o->op_flags & OPf_STACKED))
-            goto nomod;
-        PL_modcount++;
-        break;
+    if (rtype == OP_CONST &&
+        cSVOPx(right)->op_private & OPpCONST_BARE &&
+        cSVOPx(right)->op_private & OPpCONST_STRICT)
+    {
+        no_bareword_allowed(right);
+    }
 
-    case OP_REPEAT:
-        if (o->op_flags & OPf_STACKED) {
-            PL_modcount++;
-            break;
+    /* !~ doesn't make sense with /r, so error on it for now */
+    if (rtype == OP_SUBST && (cPMOPx(right)->op_pmflags & PMf_NONDESTRUCT) &&
+        type == OP_NOT)
+        /* diag_listed_as: Using !~ with %s doesn't make sense */
+        yyerror("Using !~ with s///r doesn't make sense");
+    if (rtype == OP_TRANSR && type == OP_NOT)
+        /* diag_listed_as: Using !~ with %s doesn't make sense */
+        yyerror("Using !~ with tr///r doesn't make sense");
+
+    ismatchop = (rtype == OP_MATCH ||
+                 rtype == OP_SUBST ||
+                 rtype == OP_TRANS || rtype == OP_TRANSR)
+             && !(right->op_flags & OPf_SPECIAL);
+    if (ismatchop && right->op_private & OPpTARGET_MY) {
+        right->op_targ = 0;
+        right->op_private &= ~OPpTARGET_MY;
+    }
+    if (!(right->op_flags & OPf_STACKED) && !right->op_targ && ismatchop) {
+        if (left->op_type == OP_PADSV
+         && !(left->op_private & OPpLVAL_INTRO))
+        {
+            right->op_targ = left->op_targ;
+            op_free(left);
+            o = right;
         }
-        if (!(o->op_private & OPpREPEAT_DOLIST))
-            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;
-            kid = cBINOPo->op_last;
-            if (kid->op_type == OP_CONST && SvIOK(kSVOP_sv)) {
-                const IV iv = SvIV(kSVOP_sv);
-                if (PL_modcount != RETURN_UNLIMITED_NUMBER)
-                    PL_modcount =
-                        mods + (PL_modcount - mods) * (iv < 0 ? 0 : iv);
-            }
+            right->op_flags |= OPf_STACKED;
+            if (rtype != OP_MATCH && rtype != OP_TRANSR &&
+            ! (rtype == OP_TRANS &&
+               right->op_private & OPpTRANS_IDENTICAL) &&
+            ! (rtype == OP_SUBST &&
+               (cPMOPx(right)->op_pmflags & PMf_NONDESTRUCT)))
+                left = op_lvalue(left, rtype);
+            if (right->op_type == OP_TRANS || right->op_type == OP_TRANSR)
+                o = newBINOP(OP_NULL, OPf_STACKED, scalar(left), right);
             else
-                PL_modcount = RETURN_UNLIMITED_NUMBER;
+                o = op_prepend_elem(rtype, scalar(left), right);
         }
-        break;
-
-    case OP_COND_EXPR:
-        localize = 1;
-        next_kid = OpSIBLING(cUNOPo->op_first);
-        break;
+        if (type == OP_NOT)
+            return newUNOP(OP_NOT, 0, scalar(o));
+        return o;
+    }
+    else
+        return bind_match(type, left,
+                pmruntime(newPMOP(OP_MATCH, 0), right, NULL, 0, 0));
+}
 
-    case OP_RV2AV:
-    case OP_RV2HV:
-        if (type == OP_REFGEN && o->op_flags & OPf_PARENS) {
-           PL_modcount = RETURN_UNLIMITED_NUMBER;
-           /* Treat \(@foo) like ordinary list, but still mark it as modi-
-              fiable since some contexts need to know.  */
-           o->op_flags |= OPf_MOD;
-           goto do_next;
-        }
-        /* FALLTHROUGH */
-    case OP_RV2GV:
-        if (scalar_mod_type(o, type))
-            goto nomod;
-        ref(cUNOPo->op_first, o->op_type);
-        /* FALLTHROUGH */
-    case OP_ASLICE:
-    case OP_HSLICE:
-        localize = 1;
-        /* FALLTHROUGH */
-    case OP_AASSIGN:
-        /* Do not apply the lvsub flag for rv2[ah]v in scalar context.  */
-        if (type == OP_LEAVESUBLV && (
-                (o->op_type != OP_RV2AV && o->op_type != OP_RV2HV)
-             || (o->op_flags & OPf_WANT) != OPf_WANT_SCALAR
-           ))
-            o->op_private |= OPpMAYBE_LVSUB;
-        /* FALLTHROUGH */
-    case OP_NEXTSTATE:
-    case OP_DBSTATE:
-       PL_modcount = RETURN_UNLIMITED_NUMBER;
-        break;
+OP *
+Perl_invert(pTHX_ OP *o)
+{
+    if (!o)
+        return NULL;
+    return newUNOP(OP_NOT, OPf_SPECIAL, scalar(o));
+}
 
-    case OP_KVHSLICE:
-    case OP_KVASLICE:
-    case OP_AKEYS:
-        if (type == OP_LEAVESUBLV)
-            o->op_private |= OPpMAYBE_LVSUB;
-        goto nomod;
+OP *
+Perl_cmpchain_start(pTHX_ I32 type, OP *left, OP *right)
+{
+    BINOP *bop;
+    OP *op;
 
-    case OP_AVHVSWITCH:
-        if (type == OP_LEAVESUBLV
-         && (o->op_private & OPpAVHVSWITCH_MASK) + OP_EACH == OP_KEYS)
-            o->op_private |= OPpMAYBE_LVSUB;
-        goto nomod;
+    if (!left)
+        left = newOP(OP_NULL, 0);
+    if (!right)
+        right = newOP(OP_NULL, 0);
+    scalar(left);
+    scalar(right);
+    NewOp(0, bop, 1, BINOP);
+    op = (OP*)bop;
+    ASSUME((PL_opargs[type] & OA_CLASS_MASK) == OA_BINOP);
+    OpTYPE_set(op, type);
+    cBINOPx(op)->op_flags = OPf_KIDS;
+    cBINOPx(op)->op_private = 2;
+    cBINOPx(op)->op_first = left;
+    cBINOPx(op)->op_last = right;
+    OpMORESIB_set(left, right);
+    OpLASTSIB_set(right, op);
+    return op;
+}
 
-    case OP_AV2ARYLEN:
-        PL_hints |= HINT_BLOCK_SCOPE;
-        if (type == OP_LEAVESUBLV)
-            o->op_private |= OPpMAYBE_LVSUB;
-        PL_modcount++;
-        break;
+OP *
+Perl_cmpchain_extend(pTHX_ I32 type, OP *ch, OP *right)
+{
+    BINOP *bop;
+    OP *op;
 
-    case OP_RV2SV:
-        ref(cUNOPo->op_first, o->op_type);
-        localize = 1;
-        /* FALLTHROUGH */
-    case OP_GV:
-        PL_hints |= HINT_BLOCK_SCOPE;
-        /* FALLTHROUGH */
-    case OP_SASSIGN:
-    case OP_ANDASSIGN:
-    case OP_ORASSIGN:
-    case OP_DORASSIGN:
-        PL_modcount++;
-        break;
+    PERL_ARGS_ASSERT_CMPCHAIN_EXTEND;
+    if (!right)
+        right = newOP(OP_NULL, 0);
+    scalar(right);
+    NewOp(0, bop, 1, BINOP);
+    op = (OP*)bop;
+    ASSUME((PL_opargs[type] & OA_CLASS_MASK) == OA_BINOP);
+    OpTYPE_set(op, type);
+    if (ch->op_type != OP_NULL) {
+        UNOP *lch;
+        OP *nch, *cleft, *cright;
+        NewOp(0, lch, 1, UNOP);
+        nch = (OP*)lch;
+        OpTYPE_set(nch, OP_NULL);
+        nch->op_flags = OPf_KIDS;
+        cleft = cBINOPx(ch)->op_first;
+        cright = cBINOPx(ch)->op_last;
+        cBINOPx(ch)->op_first = NULL;
+        cBINOPx(ch)->op_last = NULL;
+        cBINOPx(ch)->op_private = 0;
+        cBINOPx(ch)->op_flags = 0;
+        cUNOPx(nch)->op_first = cright;
+        OpMORESIB_set(cright, ch);
+        OpMORESIB_set(ch, cleft);
+        OpLASTSIB_set(cleft, nch);
+        ch = nch;
+    }
+    OpMORESIB_set(right, op);
+    OpMORESIB_set(op, cUNOPx(ch)->op_first);
+    cUNOPx(ch)->op_first = right;
+    return ch;
+}
 
-    case OP_AELEMFAST:
-    case OP_AELEMFAST_LEX:
-        localize = -1;
-        PL_modcount++;
-        break;
+OP *
+Perl_cmpchain_finish(pTHX_ OP *ch)
+{
 
-    case OP_PADAV:
-    case OP_PADHV:
-       PL_modcount = RETURN_UNLIMITED_NUMBER;
-        if (type == OP_REFGEN && o->op_flags & OPf_PARENS)
-        {
-           /* Treat \(@foo) like ordinary list, but still mark it as modi-
-              fiable since some contexts need to know.  */
-            o->op_flags |= OPf_MOD;
-            goto do_next;
+    PERL_ARGS_ASSERT_CMPCHAIN_FINISH;
+    if (ch->op_type != OP_NULL) {
+        OPCODE cmpoptype = ch->op_type;
+        ch = CHECKOP(cmpoptype, ch);
+        if(!ch->op_next && ch->op_type == cmpoptype)
+            ch = fold_constants(op_integerize(op_std_init(ch)));
+        return ch;
+    } else {
+        OP *condop = NULL;
+        OP *rightarg = cUNOPx(ch)->op_first;
+        cUNOPx(ch)->op_first = OpSIBLING(rightarg);
+        OpLASTSIB_set(rightarg, NULL);
+        while (1) {
+            OP *cmpop = cUNOPx(ch)->op_first;
+            OP *leftarg = OpSIBLING(cmpop);
+            OPCODE cmpoptype = cmpop->op_type;
+            OP *nextrightarg;
+            bool is_last;
+            is_last = !(cUNOPx(ch)->op_first = OpSIBLING(leftarg));
+            OpLASTSIB_set(cmpop, NULL);
+            OpLASTSIB_set(leftarg, NULL);
+            if (is_last) {
+                ch->op_flags = 0;
+                op_free(ch);
+                nextrightarg = NULL;
+            } else {
+                nextrightarg = newUNOP(OP_CMPCHAIN_DUP, 0, leftarg);
+                leftarg = newOP(OP_NULL, 0);
+            }
+            cBINOPx(cmpop)->op_first = leftarg;
+            cBINOPx(cmpop)->op_last = rightarg;
+            OpMORESIB_set(leftarg, rightarg);
+            OpLASTSIB_set(rightarg, cmpop);
+            cmpop->op_flags = OPf_KIDS;
+            cmpop->op_private = 2;
+            cmpop = CHECKOP(cmpoptype, cmpop);
+            if(!cmpop->op_next && cmpop->op_type == cmpoptype)
+                cmpop = op_integerize(op_std_init(cmpop));
+            condop = condop ? newLOGOP(OP_CMPCHAIN_AND, 0, cmpop, condop) :
+                        cmpop;
+            if (!nextrightarg)
+                return condop;
+            rightarg = nextrightarg;
         }
-        if (scalar_mod_type(o, type))
-            goto nomod;
-        if ((o->op_flags & OPf_WANT) != OPf_WANT_SCALAR
-          && type == OP_LEAVESUBLV)
-            o->op_private |= OPpMAYBE_LVSUB;
-        /* FALLTHROUGH */
-    case OP_PADSV:
-        PL_modcount++;
-        if (!type) /* local() */
-            Perl_croak(aTHX_ "Can't localize lexical variable %" PNf,
-                              PNfARG(PAD_COMPNAME(o->op_targ)));
-        if (!(o->op_private & OPpLVAL_INTRO)
-         || (  type != OP_SASSIGN && type != OP_AASSIGN
-            && PadnameIsSTATE(PAD_COMPNAME_SV(o->op_targ))  ))
-            S_mark_padname_lvalue(aTHX_ PAD_COMPNAME_SV(o->op_targ));
-        break;
+    }
+}
 
-    case OP_PUSHMARK:
-        localize = 0;
-        break;
+/*
+=for apidoc op_scope
 
-    case OP_KEYS:
-        if (type != OP_LEAVESUBLV && !scalar_mod_type(NULL, type))
-            goto nomod;
-        goto lvalue_func;
-    case OP_SUBSTR:
-        if (o->op_private == 4) /* don't allow 4 arg substr as lvalue */
-            goto nomod;
-        /* FALLTHROUGH */
-    case OP_POS:
-    case OP_VEC:
-      lvalue_func:
-        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 */
+Wraps up an op tree with some additional ops so that at runtime a dynamic
+scope will be created.  The original ops run in the new dynamic scope,
+and then, provided that they exit normally, the scope will be unwound.
+The additional ops used to create and unwind the dynamic scope will
+normally be an C<enter>/C<leave> pair, but a C<scope> op may be used
+instead if the ops are simple enough to not need the full dynamic scope
+structure.
 
-            /* substr and vec */
-            /* If this op is in merely potential (non-fatal) modifiable
-               context, then apply OP_ENTERSUB context to
-               the kid op (to avoid croaking).  Other-
-               wise pass this op’s own type so the correct op is mentioned
-               in error messages.  */
-            op_lvalue(OpSIBLING(cBINOPo->op_first),
-                      S_potential_mod_type(type)
-                        ? (I32)OP_ENTERSUB
-                        : o->op_type);
+=cut
+*/
+
+OP *
+Perl_op_scope(pTHX_ OP *o)
+{
+    if (o) {
+        if (o->op_flags & OPf_PARENS || PERLDB_NOOPT || TAINTING_get) {
+            o = op_prepend_elem(OP_LINESEQ,
+                    newOP(OP_ENTER, (o->op_flags & OPf_WANT)), o);
+            OpTYPE_set(o, OP_LEAVE);
         }
-        break;
+        else if (o->op_type == OP_LINESEQ) {
+            OP *kid;
+            OpTYPE_set(o, OP_SCOPE);
+            kid = cLISTOPo->op_first;
+            if (kid->op_type == OP_NEXTSTATE || kid->op_type == OP_DBSTATE) {
+                op_null(kid);
 
-    case OP_AELEM:
-    case OP_HELEM:
-        ref(cBINOPo->op_first, o->op_type);
-        if (type == OP_ENTERSUB &&
-             !(o->op_private & (OPpLVAL_INTRO | OPpDEREF)))
-            o->op_private |= OPpLVAL_DEFER;
-        if (type == OP_LEAVESUBLV)
-            o->op_private |= OPpMAYBE_LVSUB;
-        localize = 1;
-        PL_modcount++;
-        break;
+                /* The following deals with things like 'do {1 for 1}' */
+                kid = OpSIBLING(kid);
+                if (kid &&
+                    (kid->op_type == OP_NEXTSTATE || kid->op_type == OP_DBSTATE))
+                    op_null(kid);
+            }
+        }
+        else
+            o = newLISTOP(OP_SCOPE, 0, o, NULL);
+    }
+    return o;
+}
 
-    case OP_LEAVE:
-    case OP_LEAVELOOP:
-        o->op_private |= OPpLVALUE;
-        /* FALLTHROUGH */
-    case OP_SCOPE:
-    case OP_ENTER:
-    case OP_LINESEQ:
-        localize = 0;
-        if (o->op_flags & OPf_KIDS)
-            next_kid = cLISTOPo->op_last;
-        break;
+OP *
+Perl_op_unscope(pTHX_ OP *o)
+{
+    if (o && o->op_type == OP_LINESEQ) {
+        OP *kid = cLISTOPo->op_first;
+        for(; kid; kid = OpSIBLING(kid))
+            if (kid->op_type == OP_NEXTSTATE || kid->op_type == OP_DBSTATE)
+                op_null(kid);
+    }
+    return o;
+}
 
-    case OP_NULL:
-        localize = 0;
-        if (o->op_flags & OPf_SPECIAL)         /* do BLOCK */
-            goto nomod;
-        else if (!(o->op_flags & OPf_KIDS))
-            break;
+/*
+=for apidoc block_start
 
-        if (o->op_targ != OP_LIST) {
-            OP *sib = OpSIBLING(cLISTOPo->op_first);
-            /* OP_TRANS and OP_TRANSR with argument have a weird optree
-             * that looks like
-             *
-             *   null
-             *      arg
-             *      trans
-             *
-             * compared with things like OP_MATCH which have the argument
-             * as a child:
-             *
-             *   match
-             *      arg
-             *
-             * so handle specially to correctly get "Can't modify" croaks etc
-             */
+Handles compile-time scope entry.
+Arranges for hints to be restored on block
+exit and also handles pad sequence numbers to make lexical variables scope
+right.  Returns a savestack index for use with C<block_end>.
 
-            if (sib && (sib->op_type == OP_TRANS || sib->op_type == OP_TRANSR))
-            {
-                /* this should trigger a "Can't modify transliteration" err */
-                op_lvalue(sib, 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;
-        next_kid = cLISTOPo->op_first;
-        break;
+=cut
+*/
 
-    case OP_COREARGS:
-        goto do_next;
+int
+Perl_block_start(pTHX_ int full)
+{
+    const int retval = PL_savestack_ix;
 
-    case OP_AND:
-    case OP_OR:
-        if (type == OP_LEAVESUBLV
-         || !S_vivifies(cLOGOPo->op_first->op_type))
-            next_kid = cLOGOPo->op_first;
-        else if (type == OP_LEAVESUBLV
-         || !S_vivifies(OpSIBLING(cLOGOPo->op_first)->op_type))
-            next_kid = OpSIBLING(cLOGOPo->op_first);
-        goto nomod;
+    PL_compiling.cop_seq = PL_cop_seqmax;
+    COP_SEQMAX_INC;
+    pad_block_start(full);
+    SAVEHINTS();
+    PL_hints &= ~HINT_BLOCK_SCOPE;
+    SAVECOMPILEWARNINGS();
+    PL_compiling.cop_warnings = DUP_WARNINGS(PL_compiling.cop_warnings);
+    SAVEI32(PL_compiling.cop_seq);
+    PL_compiling.cop_seq = 0;
 
-    case OP_SREFGEN:
-        if (type == OP_NULL) { /* local */
-          local_refgen:
-            if (!FEATURE_MYREF_IS_ENABLED)
-                Perl_croak(aTHX_ "The experimental declared_refs "
-                                 "feature is not enabled");
-            Perl_ck_warner_d(aTHX_
-                     packWARN(WARN_EXPERIMENTAL__DECLARED_REFS),
-                    "Declaring references is experimental");
-            next_kid = cUNOPo->op_first;
-            goto do_next;
-        }
-        if (type != OP_AASSIGN && type != OP_SASSIGN
-         && type != OP_ENTERLOOP)
-            goto nomod;
-        /* Don’t bother applying lvalue context to the ex-list.  */
-        kid = cUNOPx(cUNOPo->op_first)->op_first;
-        assert (!OpHAS_SIBLING(kid));
-        goto kid_2lvref;
-    case OP_REFGEN:
-        if (type == OP_NULL) /* local */
-            goto local_refgen;
-        if (type != OP_AASSIGN) goto nomod;
-        kid = cUNOPo->op_first;
-      kid_2lvref:
-        {
-            const U8 ec = PL_parser ? PL_parser->error_count : 0;
-            S_lvref(aTHX_ kid, type);
-            if (!PL_parser || PL_parser->error_count == ec) {
-                if (!FEATURE_REFALIASING_IS_ENABLED)
-                    Perl_croak(aTHX_
-                       "Experimental aliasing via reference not enabled");
-                Perl_ck_warner_d(aTHX_
-                                 packWARN(WARN_EXPERIMENTAL__REFALIASING),
-                                "Aliasing via reference is experimental");
-            }
-        }
-        if (o->op_type == OP_REFGEN)
-            op_null(cUNOPx(cUNOPo->op_first)->op_first); /* pushmark */
-        op_null(o);
-        goto do_next;
+    CALL_BLOCK_HOOKS(bhk_start, full);
 
-    case OP_SPLIT:
-        if ((o->op_private & OPpSPLIT_ASSIGN)) {
-            /* This is actually @array = split.  */
-            PL_modcount = RETURN_UNLIMITED_NUMBER;
-            break;
-        }
-        goto nomod;
+    return retval;
+}
 
-    case OP_SCALAR:
-        op_lvalue(cUNOPo->op_first, OP_ENTERSUB);
-        goto nomod;
-    }
+/*
+=for apidoc block_end
 
-    /* [20011101.069 (#7861)] File test operators interpret OPf_REF to mean that
-       their argument is a filehandle; thus \stat(".") should not set
-       it. AMS 20011102 */
-    if (type == OP_REFGEN && OP_IS_STAT(o->op_type))
-        goto do_next;
+Handles compile-time scope exit.  C<floor>
+is the savestack index returned by
+C<block_start>, and C<seq> is the body of the block.  Returns the block,
+possibly modified.
 
-    if (type != OP_LEAVESUBLV)
-        o->op_flags |= OPf_MOD;
+=cut
+*/
 
-    if (type == OP_AASSIGN || type == OP_SASSIGN)
-        o->op_flags |= OPf_SPECIAL
-                      |(o->op_type == OP_ENTERSUB ? 0 : OPf_REF);
-    else if (!type) { /* local() */
-        switch (localize) {
-        case 1:
-            o->op_private |= OPpLVAL_INTRO;
-            o->op_flags &= ~OPf_SPECIAL;
-            PL_hints |= HINT_BLOCK_SCOPE;
-            break;
-        case 0:
-            break;
-        case -1:
-            Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
-                           "Useless localization of %s", OP_DESC(o));
-        }
+OP*
+Perl_block_end(pTHX_ I32 floor, OP *seq)
+{
+    const int needblockscope = PL_hints & HINT_BLOCK_SCOPE;
+    OP* retval = voidnonfinal(seq);
+    OP *o;
+
+    /* XXX Is the null PL_parser check necessary here? */
+    assert(PL_parser); /* Let’s find out under debugging builds.  */
+    if (PL_parser && PL_parser->parsed_sub) {
+        o = newSTATEOP(0, NULL, NULL);
+        op_null(o);
+        retval = op_append_elem(OP_LINESEQ, retval, o);
     }
-    else if (type != OP_GREPSTART && type != OP_ENTERSUB
-             && type != OP_LEAVESUBLV && o->op_type != OP_ENTERSUB)
-        o->op_flags |= OPf_REF;
 
-  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 */
+    CALL_BLOCK_HOOKS(bhk_pre_end, &retval);
 
-    }
-    o = next_kid;
+    LEAVE_SCOPE(floor);
+    if (needblockscope)
+        PL_hints |= HINT_BLOCK_SCOPE; /* propagate out */
+    o = pad_leavemy();
 
-    } /* while */
+    if (o) {
+        /* pad_leavemy has created a sequence of introcv ops for all my
+           subs declared in the block.  We have to replicate that list with
+           clonecv ops, to deal with this situation:
 
-}
+               sub {
+                   my sub s1;
+                   my sub s2;
+                   sub s1 { state sub foo { \&s2 } }
+               }->()
 
+           Originally, I was going to have introcv clone the CV and turn
+           off the stale flag.  Since &s1 is declared before &s2, the
+           introcv op for &s1 is executed (on sub entry) before the one for
+           &s2.  But the &foo sub inside &s1 (which is cloned when &s1 is
+           cloned, since it is a state sub) closes over &s2 and expects
+           to see it in its outer CV’s pad.  If the introcv op clones &s1,
+           then &s2 is still marked stale.  Since &s1 is not active, and
+           &foo closes over &s1’s implicit entry for &s2, we get a ‘Varia-
+           ble will not stay shared’ warning.  Because it is the same stub
+           that will be used when the introcv op for &s2 is executed, clos-
+           ing over it is safe.  Hence, we have to turn off the stale flag
+           on all lexical subs in the block before we clone any of them.
+           Hence, having introcv clone the sub cannot work.  So we create a
+           list of ops like this:
 
-STATIC bool
-S_scalar_mod_type(const OP *o, I32 type)
-{
-    switch (type) {
-    case OP_POS:
-    case OP_SASSIGN:
-        if (o && o->op_type == OP_RV2GV)
-            return FALSE;
-        /* FALLTHROUGH */
-    case OP_PREINC:
-    case OP_PREDEC:
-    case OP_POSTINC:
-    case OP_POSTDEC:
-    case OP_I_PREINC:
-    case OP_I_PREDEC:
-    case OP_I_POSTINC:
-    case OP_I_POSTDEC:
-    case OP_POW:
-    case OP_MULTIPLY:
-    case OP_DIVIDE:
-    case OP_MODULO:
-    case OP_REPEAT:
-    case OP_ADD:
-    case OP_SUBTRACT:
-    case OP_I_MULTIPLY:
-    case OP_I_DIVIDE:
-    case OP_I_MODULO:
-    case OP_I_ADD:
-    case OP_I_SUBTRACT:
-    case OP_LEFT_SHIFT:
-    case OP_RIGHT_SHIFT:
-    case OP_BIT_AND:
-    case OP_BIT_XOR:
-    case OP_BIT_OR:
-    case OP_NBIT_AND:
-    case OP_NBIT_XOR:
-    case OP_NBIT_OR:
-    case OP_SBIT_AND:
-    case OP_SBIT_XOR:
-    case OP_SBIT_OR:
-    case OP_CONCAT:
-    case OP_SUBST:
-    case OP_TRANS:
-    case OP_TRANSR:
-    case OP_READ:
-    case OP_SYSREAD:
-    case OP_RECV:
-    case OP_ANDASSIGN:
-    case OP_ORASSIGN:
-    case OP_DORASSIGN:
-    case OP_VEC:
-    case OP_SUBSTR:
-        return TRUE;
-    default:
-        return FALSE;
+               lineseq
+                  |
+                  +-- introcv
+                  |
+                  +-- introcv
+                  |
+                  +-- introcv
+                  |
+                  .
+                  .
+                  .
+                  |
+                  +-- clonecv
+                  |
+                  +-- clonecv
+                  |
+                  +-- clonecv
+                  |
+                  .
+                  .
+                  .
+         */
+        OP *kid = o->op_flags & OPf_KIDS ? cLISTOPo->op_first : o;
+        OP * const last = o->op_flags & OPf_KIDS ? cLISTOPo->op_last : o;
+        for (;; kid = OpSIBLING(kid)) {
+            OP *newkid = newOP(OP_CLONECV, 0);
+            newkid->op_targ = kid->op_targ;
+            o = op_append_elem(OP_LINESEQ, o, newkid);
+            if (kid == last) break;
+        }
+        retval = op_prepend_elem(OP_LINESEQ, o, retval);
     }
-}
 
-STATIC bool
-S_is_handle_constructor(const OP *o, I32 numargs)
-{
-    PERL_ARGS_ASSERT_IS_HANDLE_CONSTRUCTOR;
+    CALL_BLOCK_HOOKS(bhk_post_end, &retval);
 
-    switch (o->op_type) {
-    case OP_PIPE_OP:
-    case OP_SOCKPAIR:
-        if (numargs == 2)
-            return TRUE;
-        /* FALLTHROUGH */
-    case OP_SYSOPEN:
-    case OP_OPEN:
-    case OP_SELECT:            /* XXX c.f. SelectSaver.pm */
-    case OP_SOCKET:
-    case OP_OPEN_DIR:
-    case OP_ACCEPT:
-        if (numargs == 1)
-            return TRUE;
-        /* FALLTHROUGH */
-    default:
-        return FALSE;
-    }
+    return retval;
 }
 
-static OP *
-S_refkids(pTHX_ OP *o, I32 type)
-{
-    if (o && o->op_flags & OPf_KIDS) {
-        OP *kid;
-        for (kid = cLISTOPo->op_first; kid; kid = OpSIBLING(kid))
-            ref(kid, type);
-    }
-    return o;
-}
+/*
+=for apidoc_section $scope
 
+=for apidoc blockhook_register
 
-/* 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).
- */
+Register a set of hooks to be called when the Perl lexical scope changes
+at compile time.  See L<perlguts/"Compile-time scope hooks">.
 
-OP *
-Perl_doref(pTHX_ OP *o, I32 type, bool set_op_ref)
+=cut
+*/
+
+void
+Perl_blockhook_register(pTHX_ BHK *hk)
 {
-    OP * top_op = o;
+    PERL_ARGS_ASSERT_BLOCKHOOK_REGISTER;
 
-    PERL_ARGS_ASSERT_DOREF;
+    Perl_av_create_and_push(aTHX_ &PL_blockhooks, newSViv(PTR2IV(hk)));
+}
 
-    if (PL_parser && PL_parser->error_count)
-        return o;
+void
+Perl_newPROG(pTHX_ OP *o)
+{
+    OP *start;
 
-    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;
-            }
+    PERL_ARGS_ASSERT_NEWPROG;
 
-            break;
+    if (PL_in_eval) {
+        PERL_CONTEXT *cx;
+        I32 i;
+        if (PL_eval_root)
+                return;
+        PL_eval_root = newUNOP(OP_LEAVEEVAL,
+                               ((PL_in_eval & EVAL_KEEPERR)
+                                ? OPf_SPECIAL : 0), o);
 
-        case OP_COND_EXPR:
-            o = OpSIBLING(cUNOPo->op_first);
-            continue;
+        cx = CX_CUR();
+        assert(CxTYPE(cx) == CXt_EVAL);
 
-        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;
+        if ((cx->blk_gimme & G_WANT) == G_VOID)
+            scalarvoid(PL_eval_root);
+        else if ((cx->blk_gimme & G_WANT) == G_LIST)
+            list(PL_eval_root);
+        else
+            scalar(PL_eval_root);
 
-        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;
+        start = op_linklist(PL_eval_root);
+        PL_eval_root->op_next = 0;
+        i = PL_savestack_ix;
+        SAVEFREEOP(o);
+        ENTER;
+        S_process_optree(aTHX_ NULL, PL_eval_root, start);
+        LEAVE;
+        PL_savestack_ix = i;
+    }
+    else {
+        if (o->op_type == OP_STUB) {
+            /* This block is entered if nothing is compiled for the main
+               program. This will be the case for an genuinely empty main
+               program, or one which only has BEGIN blocks etc, so already
+               run and freed.
 
-        case OP_PADAV:
-        case OP_PADHV:
-            if (set_op_ref)
-                o->op_flags |= OPf_REF;
-            break;
+               Historically (5.000) the guard above was !o. However, commit
+               f8a08f7b8bd67b28 (Jun 2001), integrated to blead as
+               c71fccf11fde0068, changed perly.y so that newPROG() is now
+               called with the output of block_end(), which returns a new
+               OP_STUB for the case of an empty optree. ByteLoader (and
+               maybe other things) also take this path, because they set up
+               PL_main_start and PL_main_root directly, without generating an
+               optree.
 
-        case OP_SCALAR:
-        case OP_NULL:
-            if (!(o->op_flags & OPf_KIDS) || type == OP_DEFINED)
-                break;
-             o = cBINOPo->op_first;
-            continue;
+               If the parsing the main program aborts (due to parse errors,
+               or due to BEGIN or similar calling exit), then newPROG()
+               isn't even called, and hence this code path and its cleanups
+               are skipped. This shouldn't make a make a difference:
+               * a non-zero return from perl_parse is a failure, and
+                 perl_destruct() should be called immediately.
+               * however, if exit(0) is called during the parse, then
+                 perl_parse() returns 0, and perl_run() is called. As
+                 PL_main_start will be NULL, perl_run() will return
+                 promptly, and the exit code will remain 0.
+            */
 
-        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;
+            PL_comppad_name = 0;
+            PL_compcv = 0;
+            S_op_destroy(aTHX_ o);
+            return;
+        }
+        PL_main_root = op_scope(sawparens(scalarvoid(o)));
+        PL_curcop = &PL_compiling;
+        start = LINKLIST(PL_main_root);
+        PL_main_root->op_next = 0;
+        S_process_optree(aTHX_ NULL, PL_main_root, start);
+        if (!PL_parser->error_count)
+            /* on error, leave CV slabbed so that ops left lying around
+             * will eb cleaned up. Else unslab */
+            cv_forget_slab(PL_compcv);
+        PL_compcv = 0;
+
+        /* Register with debugger */
+        if (PERLDB_INTER) {
+            CV * const cv = get_cvs("DB::postponed", 0);
+            if (cv) {
+                dSP;
+                PUSHMARK(SP);
+                XPUSHs(MUTABLE_SV(CopFILEGV(&PL_compiling)));
+                PUTBACK;
+                call_sv(MUTABLE_SV(cv), G_DISCARD);
             }
-            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;
+OP *
+Perl_localize(pTHX_ OP *o, I32 lex)
+{
+    PERL_ARGS_ASSERT_LOCALIZE;
 
-        default:
-            break;
-        } /* switch */
+    if (o->op_flags & OPf_PARENS)
+/* [perl #17376]: this appears to be premature, and results in code such as
+   C< our(%x); > executing in list mode rather than void mode */
+#if 0
+        list(o);
+#else
+        NOOP;
+#endif
+    else {
+        if ( PL_parser->bufptr > PL_parser->oldbufptr
+            && PL_parser->bufptr[-1] == ','
+            && ckWARN(WARN_PARENTHESIS))
+        {
+            char *s = PL_parser->bufptr;
+            bool sigil = FALSE;
 
-        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)
+            /* some heuristics to detect a potential error */
+            while (*s && (memCHRs(", \t\n", *s)))
+                s++;
+
+            while (1) {
+                if (*s && (memCHRs("@$%", *s) || (!lex && *s == '*'))
+                       && *++s
+                       && (isWORDCHAR(*s) || UTF8_IS_CONTINUED(*s))) {
+                    s++;
+                    sigil = TRUE;
+                    while (*s && (isWORDCHAR(*s) || UTF8_IS_CONTINUED(*s)))
+                        s++;
+                    while (*s && (memCHRs(", \t\n", *s)))
+                        s++;
+                }
+                else
                     break;
-                continue;
             }
-            o = o->op_sibparent; /*try parent's next sibling */
+            if (sigil && (*s == ';' || *s == '=')) {
+                Perl_warner(aTHX_ packWARN(WARN_PARENTHESIS),
+                                "Parentheses missing around \"%s\" list",
+                                lex
+                                    ? (PL_parser->in_my == KEY_our
+                                        ? "our"
+                                        : PL_parser->in_my == KEY_state
+                                            ? "state"
+                                            : "my")
+                                    : "local");
+            }
         }
-    } /* while */
+    }
+    if (lex)
+        o = my(o);
+    else
+        o = op_lvalue(o, OP_NULL);             /* a bit kludgey */
+    PL_parser->in_my = FALSE;
+    PL_parser->in_my_stash = NULL;
+    return o;
 }
 
-
-STATIC OP *
-S_dup_attrlist(pTHX_ OP *o)
+OP *
+Perl_jmaybe(pTHX_ OP *o)
 {
-    OP *rop;
-
-    PERL_ARGS_ASSERT_DUP_ATTRLIST;
+    PERL_ARGS_ASSERT_JMAYBE;
 
-    /* An attrlist is either a simple OP_CONST or an OP_LIST with kids,
-     * where the first kid is OP_PUSHMARK and the remaining ones
-     * are OP_CONST.  We need to push the OP_CONST values.
-     */
-    if (o->op_type == OP_CONST)
-        rop = newSVOP(OP_CONST, o->op_flags, SvREFCNT_inc_NN(cSVOPo->op_sv));
-    else {
-        assert((o->op_type == OP_LIST) && (o->op_flags & OPf_KIDS));
-        rop = NULL;
-        for (o = cLISTOPo->op_first; o; o = OpSIBLING(o)) {
-            if (o->op_type == OP_CONST)
-                rop = op_append_elem(OP_LIST, rop,
-                                  newSVOP(OP_CONST, o->op_flags,
-                                          SvREFCNT_inc_NN(cSVOPo->op_sv)));
+    if (o->op_type == OP_LIST) {
+        if (FEATURE_MULTIDIMENSIONAL_IS_ENABLED) {
+            OP * const o2
+                = newSVREF(newGVOP(OP_GV, 0, gv_fetchpvs(";", GV_ADD|GV_NOTQUAL, SVt_PV)));
+            o = op_convert_list(OP_JOIN, 0, op_prepend_elem(OP_LIST, o2, o));
+        }
+        else {
+            /* If the user disables this, then a warning might not be enough to alert
+               them to a possible change of behaviour here, so throw an exception.
+            */
+            yyerror("Multidimensional hash lookup is disabled");
         }
     }
-    return rop;
+    return o;
 }
 
-STATIC void
-S_apply_attrs(pTHX_ HV *stash, SV *target, OP *attrs)
+PERL_STATIC_INLINE OP *
+S_op_std_init(pTHX_ OP *o)
 {
-    PERL_ARGS_ASSERT_APPLY_ATTRS;
-    {
-        SV * const stashsv = newSVhek(HvNAME_HEK(stash));
+    I32 type = o->op_type;
 
-        /* fake up C<use attributes $pkg,$rv,@attrs> */
+    PERL_ARGS_ASSERT_OP_STD_INIT;
 
-#define ATTRSMODULE "attributes"
-#define ATTRSMODULE_PM "attributes.pm"
+    if (PL_opargs[type] & OA_RETSCALAR)
+        scalar(o);
+    if (PL_opargs[type] & OA_TARGET && !o->op_targ)
+        o->op_targ = pad_alloc(type, SVs_PADTMP);
 
-        Perl_load_module(
-          aTHX_ PERL_LOADMOD_IMPORT_OPS,
-          newSVpvs(ATTRSMODULE),
-          NULL,
-          op_prepend_elem(OP_LIST,
-                          newSVOP(OP_CONST, 0, stashsv),
-                          op_prepend_elem(OP_LIST,
-                                          newSVOP(OP_CONST, 0,
-                                                  newRV(target)),
-                                          dup_attrlist(attrs))));
-    }
+    return o;
 }
 
-STATIC void
-S_apply_attrs_my(pTHX_ HV *stash, OP *target, OP *attrs, OP **imopsp)
+PERL_STATIC_INLINE OP *
+S_op_integerize(pTHX_ OP *o)
 {
-    OP *pack, *imop, *arg;
-    SV *meth, *stashsv, **svp;
+    I32 type = o->op_type;
 
-    PERL_ARGS_ASSERT_APPLY_ATTRS_MY;
+    PERL_ARGS_ASSERT_OP_INTEGERIZE;
 
-    if (!attrs)
-        return;
+    /* integerize op. */
+    if ((PL_opargs[type] & OA_OTHERINT) && (PL_hints & HINT_INTEGER))
+    {
+        o->op_ppaddr = PL_ppaddr[++(o->op_type)];
+    }
 
-    assert(target->op_type == OP_PADSV ||
-           target->op_type == OP_PADHV ||
-           target->op_type == OP_PADAV);
+    if (type == OP_NEGATE)
+        /* XXX might want a ck_negate() for this */
+        cUNOPo->op_first->op_private &= ~OPpCONST_STRICT;
 
-    /* Ensure that attributes.pm is loaded. */
-    /* Don't force the C<use> if we don't need it. */
-    svp = hv_fetchs(GvHVn(PL_incgv), ATTRSMODULE_PM, FALSE);
-    if (svp && *svp != &PL_sv_undef)
-        NOOP;  /* already in %INC */
-    else
-        Perl_load_module(aTHX_ PERL_LOADMOD_NOIMPORT,
-                               newSVpvs(ATTRSMODULE), NULL);
+    return o;
+}
 
-    /* Need package name for method call. */
-    pack = newSVOP(OP_CONST, 0, newSVpvs(ATTRSMODULE));
+/* This function exists solely to provide a scope to limit
+   setjmp/longjmp() messing with auto variables.  It cannot be inlined because
+   it uses setjmp
+ */
+STATIC int
+S_fold_constants_eval(pTHX) {
+    int ret = 0;
+    dJMPENV;
 
-    /* Build up the real arg-list. */
-    stashsv = newSVhek(HvNAME_HEK(stash));
+    JMPENV_PUSH(ret);
 
-    arg = newOP(OP_PADSV, 0);
-    arg->op_targ = target->op_targ;
-    arg = op_prepend_elem(OP_LIST,
-                       newSVOP(OP_CONST, 0, stashsv),
-                       op_prepend_elem(OP_LIST,
-                                    newUNOP(OP_REFGEN, 0,
-                                            arg),
-                                    dup_attrlist(attrs)));
+    if (ret == 0) {
+        CALLRUNOPS(aTHX);
+    }
 
-    /* Fake up a method call to import */
-    meth = newSVpvs_share("import");
-    imop = op_convert_list(OP_ENTERSUB, OPf_STACKED|OPf_SPECIAL|OPf_WANT_VOID,
-                   op_append_elem(OP_LIST,
-                               op_prepend_elem(OP_LIST, pack, arg),
-                               newMETHOP_named(OP_METHOD_NAMED, 0, meth)));
+    JMPENV_POP;
 
-    /* Combine the ops. */
-    *imopsp = op_append_elem(OP_LIST, *imopsp, imop);
+    return ret;
 }
 
-/*
-=notfor apidoc apply_attrs_string
+static OP *
+S_fold_constants(pTHX_ OP *const o)
+{
+    OP *curop;
+    OP *newop;
+    I32 type = o->op_type;
+    bool is_stringify;
+    SV *sv = NULL;
+    int ret = 0;
+    OP *old_next;
+    SV * const oldwarnhook = PL_warnhook;
+    SV * const olddiehook  = PL_diehook;
+    COP not_compiling;
+    U8 oldwarn = PL_dowarn;
+    I32 old_cxix;
 
-Attempts to apply a list of attributes specified by the C<attrstr> and
-C<len> arguments to the subroutine identified by the C<cv> argument which
-is expected to be associated with the package identified by the C<stashpv>
-argument (see L<attributes>).  It gets this wrong, though, in that it
-does not correctly identify the boundaries of the individual attribute
-specifications within C<attrstr>.  This is not really intended for the
-public API, but has to be listed here for systems such as AIX which
-need an explicit export list for symbols.  (It's called from XS code
-in support of the C<ATTRS:> keyword from F<xsubpp>.)  Patches to fix it
-to respect attribute syntax properly would be welcome.
+    PERL_ARGS_ASSERT_FOLD_CONSTANTS;
 
-=cut
-*/
+    if (!(PL_opargs[type] & OA_FOLDCONST))
+        goto nope;
 
-void
-Perl_apply_attrs_string(pTHX_ const char *stashpv, CV *cv,
-                        const char *attrstr, STRLEN len)
-{
-    OP *attrs = NULL;
+    switch (type) {
+    case OP_UCFIRST:
+    case OP_LCFIRST:
+    case OP_UC:
+    case OP_LC:
+    case OP_FC:
+#ifdef USE_LOCALE_CTYPE
+        if (IN_LC_COMPILETIME(LC_CTYPE))
+            goto nope;
+#endif
+        break;
+    case OP_SLT:
+    case OP_SGT:
+    case OP_SLE:
+    case OP_SGE:
+    case OP_SCMP:
+#ifdef USE_LOCALE_COLLATE
+        if (IN_LC_COMPILETIME(LC_COLLATE))
+            goto nope;
+#endif
+        break;
+    case OP_SPRINTF:
+        /* XXX what about the numeric ops? */
+#ifdef USE_LOCALE_NUMERIC
+        if (IN_LC_COMPILETIME(LC_NUMERIC))
+            goto nope;
+#endif
+        break;
+    case OP_PACK:
+        if (!OpHAS_SIBLING(cLISTOPo->op_first)
+          || OpSIBLING(cLISTOPo->op_first)->op_type != OP_CONST)
+            goto nope;
+        {
+            SV * const sv = cSVOPx_sv(OpSIBLING(cLISTOPo->op_first));
+            if (!SvPOK(sv) || SvGMAGICAL(sv)) goto nope;
+            {
+                const char *s = SvPVX_const(sv);
+                while (s < SvEND(sv)) {
+                    if (isALPHA_FOLD_EQ(*s, 'p')) goto nope;
+                    s++;
+                }
+            }
+        }
+        break;
+    case OP_REPEAT:
+        if (o->op_private & OPpREPEAT_DOLIST) goto nope;
+        break;
+    case OP_SREFGEN:
+        if (cUNOPx(cUNOPo->op_first)->op_first->op_type != OP_CONST
+         || SvPADTMP(cSVOPx_sv(cUNOPx(cUNOPo->op_first)->op_first)))
+            goto nope;
+    }
 
-    PERL_ARGS_ASSERT_APPLY_ATTRS_STRING;
+    if (PL_parser && PL_parser->error_count)
+        goto nope;             /* Don't try to run w/ errors */
 
-    if (!len) {
-        len = strlen(attrstr);
-    }
+    for (curop = LINKLIST(o); curop != o; curop = LINKLIST(curop)) {
+        switch (curop->op_type) {
+        case OP_CONST:
+            if (   (curop->op_private & OPpCONST_BARE)
+                && (curop->op_private & OPpCONST_STRICT)) {
+                no_bareword_allowed(curop);
+                goto nope;
+            }
+            /* FALLTHROUGH */
+        case OP_LIST:
+        case OP_SCALAR:
+        case OP_NULL:
+        case OP_PUSHMARK:
+            /* Foldable; move to next op in list */
+            break;
 
-    while (len) {
-        for (; isSPACE(*attrstr) && len; --len, ++attrstr) ;
-        if (len) {
-            const char * const sstr = attrstr;
-            for (; !isSPACE(*attrstr) && len; --len, ++attrstr) ;
-            attrs = op_append_elem(OP_LIST, attrs,
-                                newSVOP(OP_CONST, 0,
-                                        newSVpvn(sstr, attrstr-sstr)));
+        default:
+            /* No other op types are considered foldable */
+            goto nope;
         }
     }
 
-    Perl_load_module(aTHX_ PERL_LOADMOD_IMPORT_OPS,
-                     newSVpvs(ATTRSMODULE),
-                     NULL, op_prepend_elem(OP_LIST,
-                                  newSVOP(OP_CONST, 0, newSVpv(stashpv,0)),
-                                  op_prepend_elem(OP_LIST,
-                                               newSVOP(OP_CONST, 0,
-                                                       newRV(MUTABLE_SV(cv))),
-                                               attrs)));
-}
+    curop = LINKLIST(o);
+    old_next = o->op_next;
+    o->op_next = 0;
+    PL_op = curop;
 
-STATIC void
-S_move_proto_attr(pTHX_ OP **proto, OP **attrs, const GV * name,
-                        bool curstash)
-{
-    OP *new_proto = NULL;
-    STRLEN pvlen;
-    char *pv;
-    OP *o;
+    old_cxix = cxstack_ix;
+    create_eval_scope(NULL, G_FAKINGEVAL);
 
-    PERL_ARGS_ASSERT_MOVE_PROTO_ATTR;
+    /* Verify that we don't need to save it:  */
+    assert(PL_curcop == &PL_compiling);
+    StructCopy(&PL_compiling, &not_compiling, COP);
+    PL_curcop = &not_compiling;
+    /* The above ensures that we run with all the correct hints of the
+       currently compiling COP, but that IN_PERL_RUNTIME is true. */
+    assert(IN_PERL_RUNTIME);
+    PL_warnhook = PERL_WARNHOOK_FATAL;
+    PL_diehook  = NULL;
 
-    if (!*attrs)
-        return;
+    /* Effective $^W=1.  */
+    if ( ! (PL_dowarn & G_WARN_ALL_MASK))
+        PL_dowarn |= G_WARN_ON;
 
-    o = *attrs;
-    if (o->op_type == OP_CONST) {
-        pv = SvPV(cSVOPo_sv, pvlen);
-        if (memBEGINs(pv, pvlen, "prototype(")) {
-            SV * const tmpsv = newSVpvn_flags(pv + 10, pvlen - 11, SvUTF8(cSVOPo_sv));
-            SV ** const tmpo = cSVOPx_svp(o);
-            SvREFCNT_dec(cSVOPo_sv);
-            *tmpo = tmpsv;
-            new_proto = o;
-            *attrs = NULL;
+    ret = S_fold_constants_eval(aTHX);
+
+    switch (ret) {
+    case 0:
+        sv = *(PL_stack_sp--);
+        if (o->op_targ && sv == PAD_SV(o->op_targ)) {  /* grab pad temp? */
+            pad_swipe(o->op_targ,  FALSE);
         }
-    } else if (o->op_type == OP_LIST) {
-        OP * lasto;
-        assert(o->op_flags & OPf_KIDS);
-        lasto = cLISTOPo->op_first;
-        assert(lasto->op_type == OP_PUSHMARK);
-        for (o = OpSIBLING(lasto); o; o = OpSIBLING(o)) {
-            if (o->op_type == OP_CONST) {
-                pv = SvPV(cSVOPo_sv, pvlen);
-                if (memBEGINs(pv, pvlen, "prototype(")) {
-                    SV * const tmpsv = newSVpvn_flags(pv + 10, pvlen - 11, SvUTF8(cSVOPo_sv));
-                    SV ** const tmpo = cSVOPx_svp(o);
-                    SvREFCNT_dec(cSVOPo_sv);
-                    *tmpo = tmpsv;
-                    if (new_proto && ckWARN(WARN_MISC)) {
-                        STRLEN new_len;
-                        const char * newp = SvPV(cSVOPo_sv, new_len);
-                        Perl_warner(aTHX_ packWARN(WARN_MISC),
-                            "Attribute prototype(%" UTF8f ") discards earlier prototype attribute in same sub",
-                            UTF8fARG(SvUTF8(cSVOPo_sv), new_len, newp));
-                        op_free(new_proto);
-                    }
-                    else if (new_proto)
-                        op_free(new_proto);
-                    new_proto = o;
-                    /* excise new_proto from the list */
-                    op_sibling_splice(*attrs, lasto, 1, NULL);
-                    o = lasto;
-                    continue;
-                }
-            }
-            lasto = o;
-        }
-        /* If the list is now just the PUSHMARK, scrap the whole thing; otherwise attributes.xs
-           would get pulled in with no real need */
-        if (!OpHAS_SIBLING(cLISTOPx(*attrs)->op_first)) {
-            op_free(*attrs);
-            *attrs = NULL;
+        else if (SvTEMP(sv)) {                 /* grab mortal temp? */
+            SvREFCNT_inc_simple_void(sv);
+            SvTEMP_off(sv);
         }
+        else { assert(SvIMMORTAL(sv)); }
+        break;
+    case 3:
+        /* Something tried to die.  Abandon constant folding.  */
+        /* Pretend the error never happened.  */
+        CLEAR_ERRSV();
+        o->op_next = old_next;
+        break;
+    default:
+        /* Don't expect 1 (setjmp failed) or 2 (something called my_exit)  */
+        PL_warnhook = oldwarnhook;
+        PL_diehook  = olddiehook;
+        /* XXX note that this croak may fail as we've already blown away
+         * the stack - eg any nested evals */
+        Perl_croak(aTHX_ "panic: fold_constants JMPENV_PUSH returned %d", ret);
     }
+    PL_dowarn   = oldwarn;
+    PL_warnhook = oldwarnhook;
+    PL_diehook  = olddiehook;
+    PL_curcop = &PL_compiling;
 
-    if (new_proto) {
-        SV *svname;
-        if (isGV(name)) {
-            svname = sv_newmortal();
-            gv_efullname3(svname, name, NULL);
-        }
-        else if (SvPOK(name) && *SvPVX((SV *)name) == '&')
-            svname = newSVpvn_flags(SvPVX((SV *)name)+1, SvCUR(name)-1, SvUTF8(name)|SVs_TEMP);
-        else
-            svname = (SV *)name;
-        if (ckWARN(WARN_ILLEGALPROTO))
-            (void)validate_proto(svname, cSVOPx_sv(new_proto), TRUE,
-                                 curstash);
-        if (*proto && ckWARN(WARN_PROTOTYPE)) {
-            STRLEN old_len, new_len;
-            const char * oldp = SvPV(cSVOPx_sv(*proto), old_len);
-            const char * newp = SvPV(cSVOPx_sv(new_proto), new_len);
-
-            if (curstash && svname == (SV *)name
-             && !memchr(SvPVX(svname), ':', SvCUR(svname))) {
-                svname = sv_2mortal(newSVsv(PL_curstname));
-                sv_catpvs(svname, "::");
-                sv_catsv(svname, (SV *)name);
-            }
+    /* if we croaked, depending on how we croaked the eval scope
+     * may or may not have already been popped */
+    if (cxstack_ix > old_cxix) {
+        assert(cxstack_ix == old_cxix + 1);
+        assert(CxTYPE(CX_CUR()) == CXt_EVAL);
+        delete_eval_scope();
+    }
+    if (ret)
+        goto nope;
 
-            Perl_warner(aTHX_ packWARN(WARN_PROTOTYPE),
-                "Prototype '%" UTF8f "' overridden by attribute 'prototype(%" UTF8f ")'"
-                " in %" SVf,
-                UTF8fARG(SvUTF8(cSVOPx_sv(*proto)), old_len, oldp),
-                UTF8fARG(SvUTF8(cSVOPx_sv(new_proto)), new_len, newp),
-                SVfARG(svname));
-        }
-        if (*proto)
-            op_free(*proto);
-        *proto = new_proto;
+    /* OP_STRINGIFY and constant folding are used to implement qq.
+       Here the constant folding is an implementation detail that we
+       want to hide.  If the stringify op is itself already marked
+       folded, however, then it is actually a folded join.  */
+    is_stringify = type == OP_STRINGIFY && !o->op_folded;
+    op_free(o);
+    assert(sv);
+    if (is_stringify)
+        SvPADTMP_off(sv);
+    else if (!SvIMMORTAL(sv)) {
+        SvPADTMP_on(sv);
+        SvREADONLY_on(sv);
     }
+    newop = newSVOP(OP_CONST, 0, MUTABLE_SV(sv));
+    if (!is_stringify) newop->op_folded = 1;
+    return newop;
+
+ nope:
+    return o;
 }
 
+/* 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_cant_declare(pTHX_ OP *o)
+S_gen_constant_list(pTHX_ OP *o)
 {
-    if (o->op_type == OP_NULL
-     && (o->op_flags & (OPf_SPECIAL|OPf_KIDS)) == OPf_KIDS)
-        o = cUNOPo->op_first;
-    yyerror(Perl_form(aTHX_ "Can't declare %s in \"%s\"",
-                             o->op_type == OP_NULL
-                               && o->op_flags & OPf_SPECIAL
-                                 ? "do block"
-                                 : OP_DESC(o),
-                             PL_parser->in_my == KEY_our   ? "our"   :
-                             PL_parser->in_my == KEY_state ? "state" :
-                                                             "my"));
-}
+    OP *curop, *old_next;
+    SV * const oldwarnhook = PL_warnhook;
+    SV * const olddiehook  = PL_diehook;
+    COP *old_curcop;
+    U8 oldwarn = PL_dowarn;
+    SV **svp;
+    AV *av;
+    I32 old_cxix;
+    COP not_compiling;
+    int ret = 0;
+    dJMPENV;
+    bool op_was_null;
 
-STATIC OP *
-S_my_kid(pTHX_ OP *o, OP *attrs, OP **imopsp)
-{
-    I32 type;
-    const bool stately = PL_parser && PL_parser->in_my == KEY_state;
+    list(o);
+    if (PL_parser && PL_parser->error_count)
+        return;                /* Don't attempt to run with errors */
 
-    PERL_ARGS_ASSERT_MY_KID;
+    curop = LINKLIST(o);
+    old_next = o->op_next;
+    o->op_next = 0;
+    op_was_null = o->op_type == OP_NULL;
+    if (op_was_null) /* b3698342565fb462291fba4b432cfcd05b6eb4e1 */
+        o->op_type = OP_CUSTOM;
+    CALL_PEEP(curop);
+    if (op_was_null)
+        o->op_type = OP_NULL;
+    op_prune_chain_head(&curop);
+    PL_op = curop;
 
-    if (!o || (PL_parser && PL_parser->error_count))
-        return o;
+    old_cxix = cxstack_ix;
+    create_eval_scope(NULL, G_FAKINGEVAL);
 
-    type = o->op_type;
+    old_curcop = PL_curcop;
+    StructCopy(old_curcop, &not_compiling, COP);
+    PL_curcop = &not_compiling;
+    /* The above ensures that we run with all the correct hints of the
+       current COP, but that IN_PERL_RUNTIME is true. */
+    assert(IN_PERL_RUNTIME);
+    PL_warnhook = PERL_WARNHOOK_FATAL;
+    PL_diehook  = NULL;
+    JMPENV_PUSH(ret);
 
-    if (OP_TYPE_IS_OR_WAS(o, OP_LIST)) {
-        OP *kid;
-        for (kid = cLISTOPo->op_first; kid; kid = OpSIBLING(kid))
-            my_kid(kid, attrs, imopsp);
-        return o;
-    } else if (type == OP_UNDEF || type == OP_STUB) {
-        return o;
-    } else if (type == OP_RV2SV ||     /* "our" declaration */
-               type == OP_RV2AV ||
-               type == OP_RV2HV) {
-        if (cUNOPo->op_first->op_type != OP_GV) { /* MJD 20011224 */
-            S_cant_declare(aTHX_ o);
-        } else if (attrs) {
-            GV * const gv = cGVOPx_gv(cUNOPo->op_first);
-            assert(PL_parser);
-            PL_parser->in_my = FALSE;
-            PL_parser->in_my_stash = NULL;
-            apply_attrs(GvSTASH(gv),
-                        (type == OP_RV2SV ? GvSVn(gv) :
-                         type == OP_RV2AV ? MUTABLE_SV(GvAVn(gv)) :
-                         type == OP_RV2HV ? MUTABLE_SV(GvHVn(gv)) : MUTABLE_SV(gv)),
-                        attrs);
-        }
-        o->op_private |= OPpOUR_INTRO;
-        return o;
-    }
-    else if (type == OP_REFGEN || type == OP_SREFGEN) {
-        if (!FEATURE_MYREF_IS_ENABLED)
-            Perl_croak(aTHX_ "The experimental declared_refs "
-                             "feature is not enabled");
-        Perl_ck_warner_d(aTHX_
-             packWARN(WARN_EXPERIMENTAL__DECLARED_REFS),
-            "Declaring references is experimental");
-        /* Kid is a nulled OP_LIST, handled above.  */
-        my_kid(cUNOPo->op_first, attrs, imopsp);
-        return o;
-    }
-    else if (type != OP_PADSV &&
-             type != OP_PADAV &&
-             type != OP_PADHV &&
-             type != OP_PUSHMARK)
-    {
-        S_cant_declare(aTHX_ o);
-        return o;
+    /* Effective $^W=1.  */
+    if ( ! (PL_dowarn & G_WARN_ALL_MASK))
+        PL_dowarn |= G_WARN_ON;
+
+    switch (ret) {
+    case 0:
+#if defined DEBUGGING && !defined DEBUGGING_RE_ONLY
+        PL_curstackinfo->si_stack_hwm = 0; /* stop valgrind complaining */
+#endif
+        Perl_pp_pushmark(aTHX);
+        CALLRUNOPS(aTHX);
+        PL_op = curop;
+        assert (!(curop->op_flags & OPf_SPECIAL));
+        assert(curop->op_type == OP_RANGE);
+        Perl_pp_anonlist(aTHX);
+        break;
+    case 3:
+        CLEAR_ERRSV();
+        o->op_next = old_next;
+        break;
+    default:
+        JMPENV_POP;
+        PL_warnhook = oldwarnhook;
+        PL_diehook = olddiehook;
+        Perl_croak(aTHX_ "panic: gen_constant_list JMPENV_PUSH returned %d",
+            ret);
     }
-    else if (attrs && type != OP_PUSHMARK) {
-        HV *stash;
 
-        assert(PL_parser);
-        PL_parser->in_my = FALSE;
-        PL_parser->in_my_stash = NULL;
+    JMPENV_POP;
+    PL_dowarn = oldwarn;
+    PL_warnhook = oldwarnhook;
+    PL_diehook = olddiehook;
+    PL_curcop = old_curcop;
 
-        /* check for C<my Dog $spot> when deciding package */
-        stash = PAD_COMPNAME_TYPE(o->op_targ);
-        if (!stash)
-            stash = PL_curstash;
-        apply_attrs_my(stash, o, attrs, imopsp);
+    if (cxstack_ix > old_cxix) {
+        assert(cxstack_ix == old_cxix + 1);
+        assert(CxTYPE(CX_CUR()) == CXt_EVAL);
+        delete_eval_scope();
     }
-    o->op_flags |= OPf_MOD;
-    o->op_private |= OPpLVAL_INTRO;
-    if (stately)
-        o->op_private |= OPpPAD_STATE;
-    return o;
-}
+    if (ret)
+        return;
 
-OP *
-Perl_my_attrs(pTHX_ OP *o, OP *attrs)
-{
-    OP *rops;
-    int maybe_scalar = 0;
+    OpTYPE_set(o, OP_RV2AV);
+    o->op_flags &= ~OPf_REF;   /* treat \(1..2) like an ordinary list */
+    o->op_flags |= OPf_PARENS; /* and flatten \(1..2,3) */
+    o->op_opt = 0;             /* needs to be revisited in rpeep() */
+    av = (AV *)SvREFCNT_inc_NN(*PL_stack_sp--);
 
-    PERL_ARGS_ASSERT_MY_ATTRS;
+    /* replace subtree with an OP_CONST */
+    curop = cUNOPo->op_first;
+    op_sibling_splice(o, NULL, -1, newSVOP(OP_CONST, 0, (SV *)av));
+    op_free(curop);
 
-/* [perl #17376]: this appears to be premature, and results in code such as
-   C< our(%x); > executing in list mode rather than void mode */
-#if 0
-    if (o->op_flags & OPf_PARENS)
-        list(o);
-    else
-        maybe_scalar = 1;
-#else
-    maybe_scalar = 1;
-#endif
-    if (attrs)
-        SAVEFREEOP(attrs);
-    rops = NULL;
-    o = my_kid(o, attrs, &rops);
-    if (rops) {
-        if (maybe_scalar && o->op_type == OP_PADSV) {
-            o = scalar(op_append_list(OP_LIST, rops, o));
-            o->op_private |= OPpLVAL_INTRO;
+    if (AvFILLp(av) != -1)
+        for (svp = AvARRAY(av) + AvFILLp(av); svp >= AvARRAY(av); --svp)
+        {
+            SvPADTMP_on(*svp);
+            SvREADONLY_on(*svp);
         }
-        else {
-            /* The listop in rops might have a pushmark at the beginning,
-               which will mess up list assignment. */
-            LISTOP * const lrops = (LISTOP *)rops; /* for brevity */
-            if (rops->op_type == OP_LIST &&
-                lrops->op_first && lrops->op_first->op_type == OP_PUSHMARK)
+    LINKLIST(o);
+    list(o);
+    return;
+}
+
+/*
+=for apidoc_section $optree_manipulation
+*/
+
+enum {
+    FORBID_LOOPEX_DEFAULT = (1<<0),
+};
+
+static void walk_ops_find_labels(pTHX_ OP *o, HV *gotolabels)
+{
+    switch(o->op_type) {
+        case OP_NEXTSTATE:
+        case OP_DBSTATE:
             {
-                OP * const pushmark = lrops->op_first;
-                /* excise pushmark */
-                op_sibling_splice(rops, NULL, 1, NULL);
-                op_free(pushmark);
+                STRLEN label_len;
+                U32 label_flags;
+                const char *label_pv = CopLABEL_len_flags((COP *)o, &label_len, &label_flags);
+                if(!label_pv)
+                    break;
+
+                SV *labelsv = newSVpvn_flags(label_pv, label_len, label_flags);
+                SAVEFREESV(labelsv);
+
+                sv_inc(HeVAL(hv_fetch_ent(gotolabels, labelsv, TRUE, 0)));
+                break;
             }
-            o = op_append_list(OP_LIST, o, rops);
-        }
     }
-    PL_parser->in_my = FALSE;
-    PL_parser->in_my_stash = NULL;
-    return o;
-}
 
-OP *
-Perl_sawparens(pTHX_ OP *o)
-{
-    PERL_UNUSED_CONTEXT;
-    if (o)
-        o->op_flags |= OPf_PARENS;
-    return o;
+    if(!(o->op_flags & OPf_KIDS))
+        return;
+
+    OP *kid = cUNOPo->op_first;
+    while(kid) {
+        walk_ops_find_labels(aTHX_ kid, gotolabels);
+        kid = OpSIBLING(kid);
+    }
 }
 
-OP *
-Perl_bind_match(pTHX_ I32 type, OP *left, OP *right)
+static void walk_ops_forbid(pTHX_ OP *o, U32 flags, HV *permittedloops, HV *permittedgotos, const char *blockname)
 {
-    OP *o;
-    bool ismatchop = 0;
-    const OPCODE ltype = left->op_type;
-    const OPCODE rtype = right->op_type;
+    bool is_loop = FALSE;
+    SV *labelsv = NULL;
 
-    PERL_ARGS_ASSERT_BIND_MATCH;
+    switch(o->op_type) {
+        case OP_NEXTSTATE:
+        case OP_DBSTATE:
+            PL_curcop = (COP *)o;
+            return;
 
-    if ( (ltype == OP_RV2AV || ltype == OP_RV2HV || ltype == OP_PADAV
-          || ltype == OP_PADHV) && ckWARN(WARN_MISC))
-    {
-      const char * const desc
-          = PL_op_desc[(
-                          rtype == OP_SUBST || rtype == OP_TRANS
-                       || rtype == OP_TRANSR
-                       )
-                       ? (int)rtype : OP_MATCH];
-      const bool isary = ltype == OP_RV2AV || ltype == OP_PADAV;
-      SV * const name =
-        S_op_varname(aTHX_ left);
-      if (name)
-        Perl_warner(aTHX_ packWARN(WARN_MISC),
-             "Applying %s to %" SVf " will act on scalar(%" SVf ")",
-             desc, SVfARG(name), SVfARG(name));
-      else {
-        const char * const sample = (isary
-             ? "@array" : "%hash");
-        Perl_warner(aTHX_ packWARN(WARN_MISC),
-             "Applying %s to %s will act on scalar(%s)",
-             desc, sample, sample);
-      }
-    }
+        case OP_RETURN:
+            goto forbid;
 
-    if (rtype == OP_CONST &&
-        cSVOPx(right)->op_private & OPpCONST_BARE &&
-        cSVOPx(right)->op_private & OPpCONST_STRICT)
-    {
-        no_bareword_allowed(right);
-    }
+        case OP_GOTO:
+            {
+                /* OPf_STACKED means either dynamically computed label or `goto &sub` */
+                if(o->op_flags & OPf_STACKED)
+                    goto forbid;
 
-    /* !~ doesn't make sense with /r, so error on it for now */
-    if (rtype == OP_SUBST && (cPMOPx(right)->op_pmflags & PMf_NONDESTRUCT) &&
-        type == OP_NOT)
-        /* diag_listed_as: Using !~ with %s doesn't make sense */
-        yyerror("Using !~ with s///r doesn't make sense");
-    if (rtype == OP_TRANSR && type == OP_NOT)
-        /* diag_listed_as: Using !~ with %s doesn't make sense */
-        yyerror("Using !~ with tr///r doesn't make sense");
+                SV *target = newSVpvn_utf8(cPVOPo->op_pv, strlen(cPVOPo->op_pv),
+                        cPVOPo->op_private & OPpPV_IS_UTF8);
+                SAVEFREESV(target);
 
-    ismatchop = (rtype == OP_MATCH ||
-                 rtype == OP_SUBST ||
-                 rtype == OP_TRANS || rtype == OP_TRANSR)
-             && !(right->op_flags & OPf_SPECIAL);
-    if (ismatchop && right->op_private & OPpTARGET_MY) {
-        right->op_targ = 0;
-        right->op_private &= ~OPpTARGET_MY;
+                if(hv_fetch_ent(permittedgotos, target, FALSE, 0))
+                    break;
+
+                goto forbid;
+            }
+
+        case OP_NEXT:
+        case OP_LAST:
+        case OP_REDO:
+            {
+                /* OPf_SPECIAL means this is a default loopex */
+                if(o->op_flags & OPf_SPECIAL) {
+                    if(flags & FORBID_LOOPEX_DEFAULT)
+                        goto forbid;
+
+                    break;
+                }
+                /* OPf_STACKED means it's a dynamically computed label */
+                if(o->op_flags & OPf_STACKED)
+                    goto forbid;
+
+                SV *target = newSVpv(cPVOPo->op_pv, strlen(cPVOPo->op_pv));
+                if(cPVOPo->op_private & OPpPV_IS_UTF8)
+                    SvUTF8_on(target);
+                SAVEFREESV(target);
+
+                if(hv_fetch_ent(permittedloops, target, FALSE, 0))
+                    break;
+
+                goto forbid;
+            }
+
+        case OP_LEAVELOOP:
+            {
+                STRLEN label_len;
+                U32 label_flags;
+                const char *label_pv = CopLABEL_len_flags(PL_curcop, &label_len, &label_flags);
+
+                if(label_pv) {
+                    labelsv = newSVpvn(label_pv, label_len);
+                    if(label_flags & SVf_UTF8)
+                        SvUTF8_on(labelsv);
+                    SAVEFREESV(labelsv);
+
+                    sv_inc(HeVAL(hv_fetch_ent(permittedloops, labelsv, TRUE, 0)));
+                }
+
+                is_loop = TRUE;
+                break;
+            }
+
+forbid:
+            /* diag_listed_as: Can't "%s" out of a "defer" block */
+            /* diag_listed_as: Can't "%s" out of a "finally" block */
+            croak("Can't \"%s\" out of %s", PL_op_name[o->op_type], blockname);
+
+        default:
+            break;
     }
-    if (!(right->op_flags & OPf_STACKED) && !right->op_targ && ismatchop) {
-        if (left->op_type == OP_PADSV
-         && !(left->op_private & OPpLVAL_INTRO))
-        {
-            right->op_targ = left->op_targ;
-            op_free(left);
-            o = right;
-        }
-        else {
-            right->op_flags |= OPf_STACKED;
-            if (rtype != OP_MATCH && rtype != OP_TRANSR &&
-            ! (rtype == OP_TRANS &&
-               right->op_private & OPpTRANS_IDENTICAL) &&
-            ! (rtype == OP_SUBST &&
-               (cPMOPx(right)->op_pmflags & PMf_NONDESTRUCT)))
-                left = op_lvalue(left, rtype);
-            if (right->op_type == OP_TRANS || right->op_type == OP_TRANSR)
-                o = newBINOP(OP_NULL, OPf_STACKED, scalar(left), right);
-            else
-                o = op_prepend_elem(rtype, scalar(left), right);
+
+    if(!(o->op_flags & OPf_KIDS))
+        return;
+
+    OP *kid = cUNOPo->op_first;
+    while(kid) {
+        walk_ops_forbid(aTHX_ kid, flags, permittedloops, permittedgotos, blockname);
+        kid = OpSIBLING(kid);
+
+        if(is_loop) {
+            /* Now in the body of the loop; we can permit loopex default */
+            flags &= ~FORBID_LOOPEX_DEFAULT;
         }
-        if (type == OP_NOT)
-            return newUNOP(OP_NOT, 0, scalar(o));
-        return o;
     }
-    else
-        return bind_match(type, left,
-                pmruntime(newPMOP(OP_MATCH, 0), right, NULL, 0, 0));
-}
 
-OP *
-Perl_invert(pTHX_ OP *o)
-{
-    if (!o)
-        return NULL;
-    return newUNOP(OP_NOT, OPf_SPECIAL, scalar(o));
+    if(is_loop && labelsv) {
+        HE *he = hv_fetch_ent(permittedloops, labelsv, FALSE, 0);
+        if(SvIV(HeVAL(he)) > 1)
+            sv_dec(HeVAL(he));
+        else
+            hv_delete_ent(permittedloops, labelsv, 0, 0);
+    }
 }
 
-OP *
-Perl_cmpchain_start(pTHX_ I32 type, OP *left, OP *right)
+/*
+=for apidoc forbid_outofblock_ops
+
+Checks an optree that implements a block, to ensure there are no control-flow
+ops that attempt to leave the block.  Any C<OP_RETURN> is forbidden, as is any
+C<OP_GOTO>. Loops are analysed, so any LOOPEX op (C<OP_NEXT>, C<OP_LAST> or
+C<OP_REDO>) that affects a loop that contains it within the block are
+permitted, but those that do not are forbidden.
+
+If any of these forbidden constructions are detected, an exception is thrown
+by using the op name and the blockname argument to construct a suitable
+message.
+
+This function alone is not sufficient to ensure the optree does not perform
+any of these forbidden activities during runtime, as it might call a different
+function that performs a non-local LOOPEX, or a string-eval() that performs a
+C<goto>, or various other things. It is intended purely as a compile-time
+check for those that could be detected statically. Additional runtime checks
+may be required depending on the circumstance it is used for.
+
+Note currently that I<all> C<OP_GOTO> ops are forbidden, even in cases where
+they might otherwise be safe to execute.  This may be permitted in a later
+version.
+
+=cut
+*/
+
+void
+Perl_forbid_outofblock_ops(pTHX_ OP *o, const char *blockname)
 {
-    BINOP *bop;
-    OP *op;
+    PERL_ARGS_ASSERT_FORBID_OUTOFBLOCK_OPS;
 
-    if (!left)
-        left = newOP(OP_NULL, 0);
-    if (!right)
-        right = newOP(OP_NULL, 0);
-    scalar(left);
-    scalar(right);
-    NewOp(0, bop, 1, BINOP);
-    op = (OP*)bop;
-    ASSUME((PL_opargs[type] & OA_CLASS_MASK) == OA_BINOP);
-    OpTYPE_set(op, type);
-    cBINOPx(op)->op_flags = OPf_KIDS;
-    cBINOPx(op)->op_private = 2;
-    cBINOPx(op)->op_first = left;
-    cBINOPx(op)->op_last = right;
-    OpMORESIB_set(left, right);
-    OpLASTSIB_set(right, op);
-    return op;
+    ENTER;
+    SAVEVPTR(PL_curcop);
+
+    HV *looplabels = newHV();
+    SAVEFREESV((SV *)looplabels);
+
+    HV *gotolabels = newHV();
+    SAVEFREESV((SV *)gotolabels);
+
+    walk_ops_find_labels(aTHX_ o, gotolabels);
+
+    walk_ops_forbid(aTHX_ o, FORBID_LOOPEX_DEFAULT, looplabels, gotolabels, blockname);
+
+    LEAVE;
 }
 
-OP *
-Perl_cmpchain_extend(pTHX_ I32 type, OP *ch, OP *right)
-{
-    BINOP *bop;
-    OP *op;
+/* List constructors */
 
-    PERL_ARGS_ASSERT_CMPCHAIN_EXTEND;
-    if (!right)
-        right = newOP(OP_NULL, 0);
-    scalar(right);
-    NewOp(0, bop, 1, BINOP);
-    op = (OP*)bop;
-    ASSUME((PL_opargs[type] & OA_CLASS_MASK) == OA_BINOP);
-    OpTYPE_set(op, type);
-    if (ch->op_type != OP_NULL) {
-        UNOP *lch;
-        OP *nch, *cleft, *cright;
-        NewOp(0, lch, 1, UNOP);
-        nch = (OP*)lch;
-        OpTYPE_set(nch, OP_NULL);
-        nch->op_flags = OPf_KIDS;
-        cleft = cBINOPx(ch)->op_first;
-        cright = cBINOPx(ch)->op_last;
-        cBINOPx(ch)->op_first = NULL;
-        cBINOPx(ch)->op_last = NULL;
-        cBINOPx(ch)->op_private = 0;
-        cBINOPx(ch)->op_flags = 0;
-        cUNOPx(nch)->op_first = cright;
-        OpMORESIB_set(cright, ch);
-        OpMORESIB_set(ch, cleft);
-        OpLASTSIB_set(cleft, nch);
-        ch = nch;
-    }
-    OpMORESIB_set(right, op);
-    OpMORESIB_set(op, cUNOPx(ch)->op_first);
-    cUNOPx(ch)->op_first = right;
-    return ch;
-}
+/*
+=for apidoc op_append_elem
+
+Append an item to the list of ops contained directly within a list-type
+op, returning the lengthened list.  C<first> is the list-type op,
+and C<last> is the op to append to the list.  C<optype> specifies the
+intended opcode for the list.  If C<first> is not already a list of the
+right type, it will be upgraded into one.  If either C<first> or C<last>
+is null, the other is returned unchanged.
+
+=cut
+*/
 
 OP *
-Perl_cmpchain_finish(pTHX_ OP *ch)
+Perl_op_append_elem(pTHX_ I32 type, OP *first, OP *last)
 {
+    if (!first)
+        return last;
 
-    PERL_ARGS_ASSERT_CMPCHAIN_FINISH;
-    if (ch->op_type != OP_NULL) {
-        OPCODE cmpoptype = ch->op_type;
-        ch = CHECKOP(cmpoptype, ch);
-        if(!ch->op_next && ch->op_type == cmpoptype)
-            ch = fold_constants(op_integerize(op_std_init(ch)));
-        return ch;
-    } else {
-        OP *condop = NULL;
-        OP *rightarg = cUNOPx(ch)->op_first;
-        cUNOPx(ch)->op_first = OpSIBLING(rightarg);
-        OpLASTSIB_set(rightarg, NULL);
-        while (1) {
-            OP *cmpop = cUNOPx(ch)->op_first;
-            OP *leftarg = OpSIBLING(cmpop);
-            OPCODE cmpoptype = cmpop->op_type;
-            OP *nextrightarg;
-            bool is_last;
-            is_last = !(cUNOPx(ch)->op_first = OpSIBLING(leftarg));
-            OpLASTSIB_set(cmpop, NULL);
-            OpLASTSIB_set(leftarg, NULL);
-            if (is_last) {
-                ch->op_flags = 0;
-                op_free(ch);
-                nextrightarg = NULL;
-            } else {
-                nextrightarg = newUNOP(OP_CMPCHAIN_DUP, 0, leftarg);
-                leftarg = newOP(OP_NULL, 0);
-            }
-            cBINOPx(cmpop)->op_first = leftarg;
-            cBINOPx(cmpop)->op_last = rightarg;
-            OpMORESIB_set(leftarg, rightarg);
-            OpLASTSIB_set(rightarg, cmpop);
-            cmpop->op_flags = OPf_KIDS;
-            cmpop->op_private = 2;
-            cmpop = CHECKOP(cmpoptype, cmpop);
-            if(!cmpop->op_next && cmpop->op_type == cmpoptype)
-                cmpop = op_integerize(op_std_init(cmpop));
-            condop = condop ? newLOGOP(OP_CMPCHAIN_AND, 0, cmpop, condop) :
-                        cmpop;
-            if (!nextrightarg)
-                return condop;
-            rightarg = nextrightarg;
-        }
+    if (!last)
+        return first;
+
+    if (first->op_type != (unsigned)type
+        || (type == OP_LIST && (first->op_flags & OPf_PARENS)))
+    {
+        return newLISTOP(type, 0, first, last);
     }
+
+    op_sibling_splice(first, cLISTOPx(first)->op_last, 0, last);
+    first->op_flags |= OPf_KIDS;
+    return first;
 }
 
 /*
-=for apidoc op_scope
+=for apidoc op_append_list
 
-Wraps up an op tree with some additional ops so that at runtime a dynamic
-scope will be created.  The original ops run in the new dynamic scope,
-and then, provided that they exit normally, the scope will be unwound.
-The additional ops used to create and unwind the dynamic scope will
-normally be an C<enter>/C<leave> pair, but a C<scope> op may be used
-instead if the ops are simple enough to not need the full dynamic scope
-structure.
+Concatenate the lists of ops contained directly within two list-type ops,
+returning the combined list.  C<first> and C<last> are the list-type ops
+to concatenate.  C<optype> specifies the intended opcode for the list.
+If either C<first> or C<last> is not already a list of the right type,
+it will be upgraded into one.  If either C<first> or C<last> is null,
+the other is returned unchanged.
 
 =cut
 */
 
 OP *
-Perl_op_scope(pTHX_ OP *o)
+Perl_op_append_list(pTHX_ I32 type, OP *first, OP *last)
 {
-    if (o) {
-        if (o->op_flags & OPf_PARENS || PERLDB_NOOPT || TAINTING_get) {
-            o = op_prepend_elem(OP_LINESEQ,
-                    newOP(OP_ENTER, (o->op_flags & OPf_WANT)), o);
-            OpTYPE_set(o, OP_LEAVE);
-        }
-        else if (o->op_type == OP_LINESEQ) {
-            OP *kid;
-            OpTYPE_set(o, OP_SCOPE);
-            kid = ((LISTOP*)o)->op_first;
-            if (kid->op_type == OP_NEXTSTATE || kid->op_type == OP_DBSTATE) {
-                op_null(kid);
+    if (!first)
+        return last;
 
-                /* The following deals with things like 'do {1 for 1}' */
-                kid = OpSIBLING(kid);
-                if (kid &&
-                    (kid->op_type == OP_NEXTSTATE || kid->op_type == OP_DBSTATE))
-                    op_null(kid);
-            }
-        }
-        else
-            o = newLISTOP(OP_SCOPE, 0, o, NULL);
-    }
-    return o;
-}
+    if (!last)
+        return first;
 
-OP *
-Perl_op_unscope(pTHX_ OP *o)
-{
-    if (o && o->op_type == OP_LINESEQ) {
-        OP *kid = cLISTOPo->op_first;
-        for(; kid; kid = OpSIBLING(kid))
-            if (kid->op_type == OP_NEXTSTATE || kid->op_type == OP_DBSTATE)
-                op_null(kid);
-    }
-    return o;
+    if (first->op_type != (unsigned)type)
+        return op_prepend_elem(type, first, last);
+
+    if (last->op_type != (unsigned)type)
+        return op_append_elem(type, first, last);
+
+    OpMORESIB_set(cLISTOPx(first)->op_last, cLISTOPx(last)->op_first);
+    cLISTOPx(first)->op_last = cLISTOPx(last)->op_last;
+    OpLASTSIB_set(cLISTOPx(first)->op_last, first);
+    first->op_flags |= (last->op_flags & OPf_KIDS);
+
+    S_op_destroy(aTHX_ last);
+
+    return first;
 }
 
 /*
-=for apidoc block_start
+=for apidoc op_prepend_elem
 
-Handles compile-time scope entry.
-Arranges for hints to be restored on block
-exit and also handles pad sequence numbers to make lexical variables scope
-right.  Returns a savestack index for use with C<block_end>.
+Prepend an item to the list of ops contained directly within a list-type
+op, returning the lengthened list.  C<first> is the op to prepend to the
+list, and C<last> is the list-type op.  C<optype> specifies the intended
+opcode for the list.  If C<last> is not already a list of the right type,
+it will be upgraded into one.  If either C<first> or C<last> is null,
+the other is returned unchanged.
 
 =cut
 */
 
-int
-Perl_block_start(pTHX_ int full)
+OP *
+Perl_op_prepend_elem(pTHX_ I32 type, OP *first, OP *last)
 {
-    const int retval = PL_savestack_ix;
+    if (!first)
+        return last;
 
-    PL_compiling.cop_seq = PL_cop_seqmax;
-    COP_SEQMAX_INC;
-    pad_block_start(full);
-    SAVEHINTS();
-    PL_hints &= ~HINT_BLOCK_SCOPE;
-    SAVECOMPILEWARNINGS();
-    PL_compiling.cop_warnings = DUP_WARNINGS(PL_compiling.cop_warnings);
-    SAVEI32(PL_compiling.cop_seq);
-    PL_compiling.cop_seq = 0;
+    if (!last)
+        return first;
 
-    CALL_BLOCK_HOOKS(bhk_start, full);
+    if (last->op_type == (unsigned)type) {
+        if (type == OP_LIST) { /* already a PUSHMARK there */
+            /* insert 'first' after pushmark */
+            op_sibling_splice(last, cLISTOPx(last)->op_first, 0, first);
+            if (!(first->op_flags & OPf_PARENS))
+                last->op_flags &= ~OPf_PARENS;
+        }
+        else
+            op_sibling_splice(last, NULL, 0, first);
+        last->op_flags |= OPf_KIDS;
+        return last;
+    }
 
-    return retval;
+    return newLISTOP(type, 0, first, last);
 }
 
 /*
-=for apidoc block_end
+=for apidoc op_convert_list
 
-Handles compile-time scope exit.  C<floor>
-is the savestack index returned by
-C<block_start>, and C<seq> is the body of the block.  Returns the block,
-possibly modified.
+Converts C<o> into a list op if it is not one already, and then converts it
+into the specified C<type>, calling its check function, allocating a target if
+it needs one, and folding constants.
+
+A list-type op is usually constructed one kid at a time via C<newLISTOP>,
+C<op_prepend_elem> and C<op_append_elem>.  Then finally it is passed to
+C<op_convert_list> to make it the right type.
 
 =cut
 */
 
-OP*
-Perl_block_end(pTHX_ I32 floor, OP *seq)
+OP *
+Perl_op_convert_list(pTHX_ I32 type, I32 flags, OP *o)
 {
-    const int needblockscope = PL_hints & HINT_BLOCK_SCOPE;
-    OP* retval = voidnonfinal(seq);
-    OP *o;
+    if (type < 0) type = -type, flags |= OPf_SPECIAL;
+    if (type == OP_RETURN) {
+        if (FEATURE_MODULE_TRUE_IS_ENABLED)
+            flags |= OPf_SPECIAL;
+    }
+    if (!o || o->op_type != OP_LIST)
+        o = force_list(o, FALSE);
+    else
+    {
+        o->op_flags &= ~OPf_WANT;
+        o->op_private &= ~OPpLVAL_INTRO;
+    }
 
-    /* XXX Is the null PL_parser check necessary here? */
-    assert(PL_parser); /* Let’s find out under debugging builds.  */
-    if (PL_parser && PL_parser->parsed_sub) {
-        o = newSTATEOP(0, NULL, NULL);
-        op_null(o);
-        retval = op_append_elem(OP_LINESEQ, retval, o);
+    if (!(PL_opargs[type] & OA_MARK))
+        op_null(cLISTOPo->op_first);
+    else {
+        OP * const kid2 = OpSIBLING(cLISTOPo->op_first);
+        if (kid2 && kid2->op_type == OP_COREARGS) {
+            op_null(cLISTOPo->op_first);
+            kid2->op_private |= OPpCOREARGS_PUSHMARK;
+        }
     }
 
-    CALL_BLOCK_HOOKS(bhk_pre_end, &retval);
+    if (type != OP_SPLIT)
+        /* At this point o is a LISTOP, but OP_SPLIT is a PMOP; let
+         * ck_split() create a real PMOP and leave the op's type as listop
+         * for now. Otherwise op_free() etc will crash.
+         */
+        OpTYPE_set(o, type);
 
-    LEAVE_SCOPE(floor);
-    if (needblockscope)
-        PL_hints |= HINT_BLOCK_SCOPE; /* propagate out */
-    o = pad_leavemy();
-
-    if (o) {
-        /* pad_leavemy has created a sequence of introcv ops for all my
-           subs declared in the block.  We have to replicate that list with
-           clonecv ops, to deal with this situation:
-
-               sub {
-                   my sub s1;
-                   my sub s2;
-                   sub s1 { state sub foo { \&s2 } }
-               }->()
+    o->op_flags |= flags;
+    if (flags & OPf_FOLDED)
+        o->op_folded = 1;
 
-           Originally, I was going to have introcv clone the CV and turn
-           off the stale flag.  Since &s1 is declared before &s2, the
-           introcv op for &s1 is executed (on sub entry) before the one for
-           &s2.  But the &foo sub inside &s1 (which is cloned when &s1 is
-           cloned, since it is a state sub) closes over &s2 and expects
-           to see it in its outer CV’s pad.  If the introcv op clones &s1,
-           then &s2 is still marked stale.  Since &s1 is not active, and
-           &foo closes over &s1’s implicit entry for &s2, we get a ‘Varia-
-           ble will not stay shared’ warning.  Because it is the same stub
-           that will be used when the introcv op for &s2 is executed, clos-
-           ing over it is safe.  Hence, we have to turn off the stale flag
-           on all lexical subs in the block before we clone any of them.
-           Hence, having introcv clone the sub cannot work.  So we create a
-           list of ops like this:
+    o = CHECKOP(type, o);
+    if (o->op_type != (unsigned)type)
+        return o;
 
-               lineseq
-                  |
-                  +-- introcv
-                  |
-                  +-- introcv
-                  |
-                  +-- introcv
-                  |
-                  .
-                  .
-                  .
-                  |
-                  +-- clonecv
-                  |
-                  +-- clonecv
-                  |
-                  +-- clonecv
-                  |
-                  .
-                  .
-                  .
-         */
-        OP *kid = o->op_flags & OPf_KIDS ? cLISTOPo->op_first : o;
-        OP * const last = o->op_flags & OPf_KIDS ? cLISTOPo->op_last : o;
-        for (;; kid = OpSIBLING(kid)) {
-            OP *newkid = newOP(OP_CLONECV, 0);
-            newkid->op_targ = kid->op_targ;
-            o = op_append_elem(OP_LINESEQ, o, newkid);
-            if (kid == last) break;
-        }
-        retval = op_prepend_elem(OP_LINESEQ, o, retval);
-    }
+    return fold_constants(op_integerize(op_std_init(o)));
+}
 
-    CALL_BLOCK_HOOKS(bhk_post_end, &retval);
+/* Constructors */
 
-    return retval;
-}
 
 /*
-=for apidoc_section $scope
+=for apidoc_section $optree_construction
 
-=for apidoc blockhook_register
+=for apidoc newNULLLIST
 
-Register a set of hooks to be called when the Perl lexical scope changes
-at compile time.  See L<perlguts/"Compile-time scope hooks">.
+Constructs, checks, and returns a new C<stub> op, which represents an
+empty list expression.
 
 =cut
 */
 
-void
-Perl_blockhook_register(pTHX_ BHK *hk)
+OP *
+Perl_newNULLLIST(pTHX)
 {
-    PERL_ARGS_ASSERT_BLOCKHOOK_REGISTER;
-
-    Perl_av_create_and_push(aTHX_ &PL_blockhooks, newSViv(PTR2IV(hk)));
+    return newOP(OP_STUB, 0);
 }
 
-void
-Perl_newPROG(pTHX_ OP *o)
+/* promote o and any siblings to be a list if its not already; i.e.
+ *
+ *  o - A - B
+ *
+ * becomes
+ *
+ *  list
+ *    |
+ *  pushmark - o - A - B
+ *
+ * If nullit it true, the list op is nulled.
+ */
+
+static OP *
+S_force_list(pTHX_ OP *o, bool nullit)
 {
-    OP *start;
+    if (!o || o->op_type != OP_LIST) {
+        OP *rest = NULL;
+        if (o) {
+            /* manually detach any siblings then add them back later */
+            rest = OpSIBLING(o);
+            OpLASTSIB_set(o, NULL);
+        }
+        o = newLISTOP(OP_LIST, 0, o, NULL);
+        if (rest)
+            op_sibling_splice(o, cLISTOPo->op_last, 0, rest);
+    }
+    if (nullit)
+        op_null(o);
+    return o;
+}
 
-    PERL_ARGS_ASSERT_NEWPROG;
+/*
+=for apidoc op_force_list
 
-    if (PL_in_eval) {
-        PERL_CONTEXT *cx;
-        I32 i;
-        if (PL_eval_root)
-                return;
-        PL_eval_root = newUNOP(OP_LEAVEEVAL,
-                               ((PL_in_eval & EVAL_KEEPERR)
-                                ? OPf_SPECIAL : 0), o);
+Promotes o and any siblings to be an C<OP_LIST> if it is not already. If
+a new C<OP_LIST> op was created, its first child will be C<OP_PUSHMARK>.
+The returned node itself will be nulled, leaving only its children.
 
-        cx = CX_CUR();
-        assert(CxTYPE(cx) == CXt_EVAL);
+This is often what you want to do before putting the optree into list
+context; as
 
-        if ((cx->blk_gimme & G_WANT) == G_VOID)
-            scalarvoid(PL_eval_root);
-        else if ((cx->blk_gimme & G_WANT) == G_LIST)
-            list(PL_eval_root);
-        else
-            scalar(PL_eval_root);
+    o = op_contextualize(op_force_list(o), G_LIST);
 
-        start = op_linklist(PL_eval_root);
-        PL_eval_root->op_next = 0;
-        i = PL_savestack_ix;
-        SAVEFREEOP(o);
-        ENTER;
-        S_process_optree(aTHX_ NULL, PL_eval_root, start);
-        LEAVE;
-        PL_savestack_ix = i;
-    }
-    else {
-        if (o->op_type == OP_STUB) {
-            /* This block is entered if nothing is compiled for the main
-               program. This will be the case for an genuinely empty main
-               program, or one which only has BEGIN blocks etc, so already
-               run and freed.
+=cut
+*/
 
-               Historically (5.000) the guard above was !o. However, commit
-               f8a08f7b8bd67b28 (Jun 2001), integrated to blead as
-               c71fccf11fde0068, changed perly.y so that newPROG() is now
-               called with the output of block_end(), which returns a new
-               OP_STUB for the case of an empty optree. ByteLoader (and
-               maybe other things) also take this path, because they set up
-               PL_main_start and PL_main_root directly, without generating an
-               optree.
+OP *
+Perl_op_force_list(pTHX_ OP *o)
+{
+    return force_list(o, TRUE);
+}
 
-               If the parsing the main program aborts (due to parse errors,
-               or due to BEGIN or similar calling exit), then newPROG()
-               isn't even called, and hence this code path and its cleanups
-               are skipped. This shouldn't make a make a difference:
-               * a non-zero return from perl_parse is a failure, and
-                 perl_destruct() should be called immediately.
-               * however, if exit(0) is called during the parse, then
-                 perl_parse() returns 0, and perl_run() is called. As
-                 PL_main_start will be NULL, perl_run() will return
-                 promptly, and the exit code will remain 0.
-            */
+/*
+=for apidoc newLISTOP
 
-            PL_comppad_name = 0;
-            PL_compcv = 0;
-            S_op_destroy(aTHX_ o);
-            return;
-        }
-        PL_main_root = op_scope(sawparens(scalarvoid(o)));
-        PL_curcop = &PL_compiling;
-        start = LINKLIST(PL_main_root);
-        PL_main_root->op_next = 0;
-        S_process_optree(aTHX_ NULL, PL_main_root, start);
-        if (!PL_parser->error_count)
-            /* on error, leave CV slabbed so that ops left lying around
-             * will eb cleaned up. Else unslab */
-            cv_forget_slab(PL_compcv);
-        PL_compcv = 0;
+Constructs, checks, and returns an op of any list type.  C<type> is
+the opcode.  C<flags> gives the eight bits of C<op_flags>, except that
+C<OPf_KIDS> will be set automatically if required.  C<first> and C<last>
+supply up to two ops to be direct children of the list op; they are
+consumed by this function and become part of the constructed op tree.
 
-        /* Register with debugger */
-        if (PERLDB_INTER) {
-            CV * const cv = get_cvs("DB::postponed", 0);
-            if (cv) {
-                dSP;
-                PUSHMARK(SP);
-                XPUSHs(MUTABLE_SV(CopFILEGV(&PL_compiling)));
-                PUTBACK;
-                call_sv(MUTABLE_SV(cv), G_DISCARD);
-            }
-        }
-    }
-}
+For most list operators, the check function expects all the kid ops to be
+present already, so calling C<newLISTOP(OP_JOIN, ...)> (e.g.) is not
+appropriate.  What you want to do in that case is create an op of type
+C<OP_LIST>, append more children to it, and then call L</op_convert_list>.
+See L</op_convert_list> for more information.
+
+=cut
+*/
 
 OP *
-Perl_localize(pTHX_ OP *o, I32 lex)
+Perl_newLISTOP(pTHX_ I32 type, I32 flags, OP *first, OP *last)
 {
-    PERL_ARGS_ASSERT_LOCALIZE;
+    LISTOP *listop;
+    /* Note that allocating an OP_PUSHMARK can die under Safe.pm if
+     * pushmark is banned. So do it now while existing ops are in a
+     * consistent state, in case they suddenly get freed */
+    OP* const pushop = type == OP_LIST ? newOP(OP_PUSHMARK, 0) : NULL;
 
-    if (o->op_flags & OPf_PARENS)
-/* [perl #17376]: this appears to be premature, and results in code such as
-   C< our(%x); > executing in list mode rather than void mode */
-#if 0
-        list(o);
-#else
-        NOOP;
-#endif
-    else {
-        if ( PL_parser->bufptr > PL_parser->oldbufptr
-            && PL_parser->bufptr[-1] == ','
-            && ckWARN(WARN_PARENTHESIS))
-        {
-            char *s = PL_parser->bufptr;
-            bool sigil = FALSE;
+    assert((PL_opargs[type] & OA_CLASS_MASK) == OA_LISTOP
+        || type == OP_CUSTOM);
 
-            /* some heuristics to detect a potential error */
-            while (*s && (memCHRs(", \t\n", *s)))
-                s++;
+    NewOp(1101, listop, 1, LISTOP);
+    OpTYPE_set(listop, type);
+    if (first || last)
+        flags |= OPf_KIDS;
+    listop->op_flags = (U8)flags;
 
-            while (1) {
-                if (*s && (memCHRs("@$%", *s) || (!lex && *s == '*'))
-                       && *++s
-                       && (isWORDCHAR(*s) || UTF8_IS_CONTINUED(*s))) {
-                    s++;
-                    sigil = TRUE;
-                    while (*s && (isWORDCHAR(*s) || UTF8_IS_CONTINUED(*s)))
-                        s++;
-                    while (*s && (memCHRs(", \t\n", *s)))
-                        s++;
-                }
-                else
-                    break;
-            }
-            if (sigil && (*s == ';' || *s == '=')) {
-                Perl_warner(aTHX_ packWARN(WARN_PARENTHESIS),
-                                "Parentheses missing around \"%s\" list",
-                                lex
-                                    ? (PL_parser->in_my == KEY_our
-                                        ? "our"
-                                        : PL_parser->in_my == KEY_state
-                                            ? "state"
-                                            : "my")
-                                    : "local");
-            }
-        }
+    if (!last && first)
+        last = first;
+    else if (!first && last)
+        first = last;
+    else if (first)
+        OpMORESIB_set(first, last);
+    listop->op_first = first;
+    listop->op_last = last;
+
+    if (pushop) {
+        OpMORESIB_set(pushop, first);
+        listop->op_first = pushop;
+        listop->op_flags |= OPf_KIDS;
+        if (!last)
+            listop->op_last = pushop;
     }
-    if (lex)
-        o = my(o);
-    else
-        o = op_lvalue(o, OP_NULL);             /* a bit kludgey */
-    PL_parser->in_my = FALSE;
-    PL_parser->in_my_stash = NULL;
-    return o;
+    if (listop->op_last)
+        OpLASTSIB_set(listop->op_last, (OP*)listop);
+
+    return CHECKOP(type, listop);
 }
 
+/*
+=for apidoc newOP
+
+Constructs, checks, and returns an op of any base type (any type that
+has no extra fields).  C<type> is the opcode.  C<flags> gives the
+eight bits of C<op_flags>, and, shifted up eight bits, the eight bits
+of C<op_private>.
+
+=cut
+*/
+
 OP *
-Perl_jmaybe(pTHX_ OP *o)
+Perl_newOP(pTHX_ I32 type, I32 flags)
 {
-    PERL_ARGS_ASSERT_JMAYBE;
+    OP *o;
 
-    if (o->op_type == OP_LIST) {
-        if (FEATURE_MULTIDIMENSIONAL_IS_ENABLED) {
-            OP * const o2
-                = newSVREF(newGVOP(OP_GV, 0, gv_fetchpvs(";", GV_ADD|GV_NOTQUAL, SVt_PV)));
-            o = op_convert_list(OP_JOIN, 0, op_prepend_elem(OP_LIST, o2, o));
-        }
-        else {
-            /* If the user disables this, then a warning might not be enough to alert
-               them to a possible change of behaviour here, so throw an exception.
-            */
-            yyerror("Multidimensional hash lookup is disabled");
-        }
+    if (type == -OP_ENTEREVAL) {
+        type = OP_ENTEREVAL;
+        flags |= OPpEVAL_BYTES<<8;
     }
-    return o;
-}
 
-PERL_STATIC_INLINE OP *
-S_op_std_init(pTHX_ OP *o)
-{
-    I32 type = o->op_type;
+    assert((PL_opargs[type] & OA_CLASS_MASK) == OA_BASEOP
+        || (PL_opargs[type] & OA_CLASS_MASK) == OA_BASEOP_OR_UNOP
+        || (PL_opargs[type] & OA_CLASS_MASK) == OA_FILESTATOP
+        || (PL_opargs[type] & OA_CLASS_MASK) == OA_LOOPEXOP);
 
-    PERL_ARGS_ASSERT_OP_STD_INIT;
+    NewOp(1101, o, 1, OP);
+    OpTYPE_set(o, type);
+    o->op_flags = (U8)flags;
 
+    o->op_next = o;
+    o->op_private = (U8)(0 | (flags >> 8));
     if (PL_opargs[type] & OA_RETSCALAR)
         scalar(o);
-    if (PL_opargs[type] & OA_TARGET && !o->op_targ)
+    if (PL_opargs[type] & OA_TARGET)
         o->op_targ = pad_alloc(type, SVs_PADTMP);
-
-    return o;
+    return CHECKOP(type, o);
 }
 
-PERL_STATIC_INLINE OP *
-S_op_integerize(pTHX_ OP *o)
-{
-    I32 type = o->op_type;
+/*
+=for apidoc newUNOP
 
-    PERL_ARGS_ASSERT_OP_INTEGERIZE;
+Constructs, checks, and returns an op of any unary type.  C<type> is
+the opcode.  C<flags> gives the eight bits of C<op_flags>, except that
+C<OPf_KIDS> will be set automatically if required, and, shifted up eight
+bits, the eight bits of C<op_private>, except that the bit with value 1
+is automatically set.  C<first> supplies an optional op to be the direct
+child of the unary op; it is consumed by this function and become part
+of the constructed op tree.
 
-    /* integerize op. */
-    if ((PL_opargs[type] & OA_OTHERINT) && (PL_hints & HINT_INTEGER))
-    {
-        o->op_ppaddr = PL_ppaddr[++(o->op_type)];
+=for apidoc Amnh||OPf_KIDS
+
+=cut
+*/
+
+OP *
+Perl_newUNOP(pTHX_ I32 type, I32 flags, OP *first)
+{
+    UNOP *unop;
+
+    if (type == -OP_ENTEREVAL) {
+        type = OP_ENTEREVAL;
+        flags |= OPpEVAL_BYTES<<8;
     }
 
-    if (type == OP_NEGATE)
-        /* XXX might want a ck_negate() for this */
-        cUNOPo->op_first->op_private &= ~OPpCONST_STRICT;
+    assert((PL_opargs[type] & OA_CLASS_MASK) == OA_UNOP
+        || (PL_opargs[type] & OA_CLASS_MASK) == OA_BASEOP_OR_UNOP
+        || (PL_opargs[type] & OA_CLASS_MASK) == OA_FILESTATOP
+        || (PL_opargs[type] & OA_CLASS_MASK) == OA_LOOPEXOP
+        || type == OP_SASSIGN
+        || type == OP_ENTERTRY
+        || type == OP_ENTERTRYCATCH
+        || type == OP_CUSTOM
+        || type == OP_NULL );
 
-    return o;
+    if (!first)
+        first = newOP(OP_STUB, 0);
+    if (PL_opargs[type] & OA_MARK)
+        first = op_force_list(first);
+
+    NewOp(1101, unop, 1, UNOP);
+    OpTYPE_set(unop, type);
+    unop->op_first = first;
+    unop->op_flags = (U8)(flags | OPf_KIDS);
+    unop->op_private = (U8)(1 | (flags >> 8));
+
+    if (!OpHAS_SIBLING(first)) /* true unless weird syntax error */
+        OpLASTSIB_set(first, (OP*)unop);
+
+    unop = (UNOP*) CHECKOP(type, unop);
+    if (unop->op_next)
+        return (OP*)unop;
+
+    return fold_constants(op_integerize(op_std_init((OP *) unop)));
 }
 
-/* This function exists solely to provide a scope to limit
-   setjmp/longjmp() messing with auto variables.  It cannot be inlined because
-   it uses setjmp
- */
-STATIC int
-S_fold_constants_eval(pTHX) {
-    int ret = 0;
-    dJMPENV;
+/*
+=for apidoc newUNOP_AUX
 
-    JMPENV_PUSH(ret);
+Similar to C<newUNOP>, but creates an C<UNOP_AUX> struct instead, with C<op_aux>
+initialised to C<aux>
 
-    if (ret == 0) {
-        CALLRUNOPS(aTHX);
-    }
+=cut
+*/
 
-    JMPENV_POP;
+OP *
+Perl_newUNOP_AUX(pTHX_ I32 type, I32 flags, OP *first, UNOP_AUX_item *aux)
+{
+    UNOP_AUX *unop;
 
-    return ret;
+    assert((PL_opargs[type] & OA_CLASS_MASK) == OA_UNOP_AUX
+        || type == OP_CUSTOM);
+
+    NewOp(1101, unop, 1, UNOP_AUX);
+    unop->op_type = (OPCODE)type;
+    unop->op_ppaddr = PL_ppaddr[type];
+    unop->op_first = first;
+    unop->op_flags = (U8)(flags | (first ? OPf_KIDS : 0));
+    unop->op_private = (U8)((first ? 1 : 0) | (flags >> 8));
+    unop->op_aux = aux;
+
+    if (first && !OpHAS_SIBLING(first)) /* true unless weird syntax error */
+        OpLASTSIB_set(first, (OP*)unop);
+
+    unop = (UNOP_AUX*) CHECKOP(type, unop);
+
+    return op_std_init((OP *) unop);
 }
 
-static OP *
-S_fold_constants(pTHX_ OP *const o)
-{
-    OP *curop;
-    OP *newop;
-    I32 type = o->op_type;
-    bool is_stringify;
-    SV *sv = NULL;
-    int ret = 0;
-    OP *old_next;
-    SV * const oldwarnhook = PL_warnhook;
-    SV * const olddiehook  = PL_diehook;
-    COP not_compiling;
-    U8 oldwarn = PL_dowarn;
-    I32 old_cxix;
+/*
+=for apidoc newMETHOP
 
-    PERL_ARGS_ASSERT_FOLD_CONSTANTS;
+Constructs, checks, and returns an op of method type with a method name
+evaluated at runtime.  C<type> is the opcode.  C<flags> gives the eight
+bits of C<op_flags>, except that C<OPf_KIDS> will be set automatically,
+and, shifted up eight bits, the eight bits of C<op_private>, except that
+the bit with value 1 is automatically set.  C<dynamic_meth> supplies an
+op which evaluates method name; it is consumed by this function and
+become part of the constructed op tree.
+Supported optypes: C<OP_METHOD>.
 
-    if (!(PL_opargs[type] & OA_FOLDCONST))
-        goto nope;
+=cut
+*/
 
-    switch (type) {
-    case OP_UCFIRST:
-    case OP_LCFIRST:
-    case OP_UC:
-    case OP_LC:
-    case OP_FC:
-#ifdef USE_LOCALE_CTYPE
-        if (IN_LC_COMPILETIME(LC_CTYPE))
-            goto nope;
-#endif
-        break;
-    case OP_SLT:
-    case OP_SGT:
-    case OP_SLE:
-    case OP_SGE:
-    case OP_SCMP:
-#ifdef USE_LOCALE_COLLATE
-        if (IN_LC_COMPILETIME(LC_COLLATE))
-            goto nope;
-#endif
-        break;
-    case OP_SPRINTF:
-        /* XXX what about the numeric ops? */
-#ifdef USE_LOCALE_NUMERIC
-        if (IN_LC_COMPILETIME(LC_NUMERIC))
-            goto nope;
-#endif
-        break;
-    case OP_PACK:
-        if (!OpHAS_SIBLING(cLISTOPo->op_first)
-          || OpSIBLING(cLISTOPo->op_first)->op_type != OP_CONST)
-            goto nope;
-        {
-            SV * const sv = cSVOPx_sv(OpSIBLING(cLISTOPo->op_first));
-            if (!SvPOK(sv) || SvGMAGICAL(sv)) goto nope;
-            {
-                const char *s = SvPVX_const(sv);
-                while (s < SvEND(sv)) {
-                    if (isALPHA_FOLD_EQ(*s, 'p')) goto nope;
-                    s++;
-                }
-            }
-        }
-        break;
-    case OP_REPEAT:
-        if (o->op_private & OPpREPEAT_DOLIST) goto nope;
-        break;
-    case OP_SREFGEN:
-        if (cUNOPx(cUNOPo->op_first)->op_first->op_type != OP_CONST
-         || SvPADTMP(cSVOPx_sv(cUNOPx(cUNOPo->op_first)->op_first)))
-            goto nope;
-    }
+static OP*
+S_newMETHOP_internal(pTHX_ I32 type, I32 flags, OP* dynamic_meth, SV* const_meth) {
+    METHOP *methop;
 
-    if (PL_parser && PL_parser->error_count)
-        goto nope;             /* Don't try to run w/ errors */
+    assert((PL_opargs[type] & OA_CLASS_MASK) == OA_METHOP
+        || type == OP_CUSTOM);
 
-    for (curop = LINKLIST(o); curop != o; curop = LINKLIST(curop)) {
-        switch (curop->op_type) {
-        case OP_CONST:
-            if (   (curop->op_private & OPpCONST_BARE)
-                && (curop->op_private & OPpCONST_STRICT)) {
-                no_bareword_allowed(curop);
-                goto nope;
-            }
-            /* FALLTHROUGH */
-        case OP_LIST:
-        case OP_SCALAR:
-        case OP_NULL:
-        case OP_PUSHMARK:
-            /* Foldable; move to next op in list */
-            break;
+    NewOp(1101, methop, 1, METHOP);
+    if (dynamic_meth) {
+        if (PL_opargs[type] & OA_MARK) dynamic_meth = op_force_list(dynamic_meth);
+        methop->op_flags = (U8)(flags | OPf_KIDS);
+        methop->op_u.op_first = dynamic_meth;
+        methop->op_private = (U8)(1 | (flags >> 8));
 
-        default:
-            /* No other op types are considered foldable */
-            goto nope;
-        }
+        if (!OpHAS_SIBLING(dynamic_meth))
+            OpLASTSIB_set(dynamic_meth, (OP*)methop);
+    }
+    else {
+        assert(const_meth);
+        methop->op_flags = (U8)(flags & ~OPf_KIDS);
+        methop->op_u.op_meth_sv = const_meth;
+        methop->op_private = (U8)(0 | (flags >> 8));
+        methop->op_next = (OP*)methop;
     }
 
-    curop = LINKLIST(o);
-    old_next = o->op_next;
-    o->op_next = 0;
-    PL_op = curop;
+#ifdef USE_ITHREADS
+    methop->op_rclass_targ = 0;
+#else
+    methop->op_rclass_sv = NULL;
+#endif
 
-    old_cxix = cxstack_ix;
-    create_eval_scope(NULL, G_FAKINGEVAL);
+    OpTYPE_set(methop, type);
+    return CHECKOP(type, methop);
+}
 
-    /* Verify that we don't need to save it:  */
-    assert(PL_curcop == &PL_compiling);
-    StructCopy(&PL_compiling, &not_compiling, COP);
-    PL_curcop = &not_compiling;
-    /* The above ensures that we run with all the correct hints of the
-       currently compiling COP, but that IN_PERL_RUNTIME is true. */
-    assert(IN_PERL_RUNTIME);
-    PL_warnhook = PERL_WARNHOOK_FATAL;
-    PL_diehook  = NULL;
+OP *
+Perl_newMETHOP (pTHX_ I32 type, I32 flags, OP* dynamic_meth) {
+    PERL_ARGS_ASSERT_NEWMETHOP;
+    return newMETHOP_internal(type, flags, dynamic_meth, NULL);
+}
 
-    /* Effective $^W=1.  */
-    if ( ! (PL_dowarn & G_WARN_ALL_MASK))
-        PL_dowarn |= G_WARN_ON;
+/*
+=for apidoc newMETHOP_named
 
-    ret = S_fold_constants_eval(aTHX);
+Constructs, checks, and returns an op of method type with a constant
+method name.  C<type> is the opcode.  C<flags> gives the eight bits of
+C<op_flags>, and, shifted up eight bits, the eight bits of
+C<op_private>.  C<const_meth> supplies a constant method name;
+it must be a shared COW string.
+Supported optypes: C<OP_METHOD_NAMED>.
 
-    switch (ret) {
-    case 0:
-        sv = *(PL_stack_sp--);
-        if (o->op_targ && sv == PAD_SV(o->op_targ)) {  /* grab pad temp? */
-            pad_swipe(o->op_targ,  FALSE);
-        }
-        else if (SvTEMP(sv)) {                 /* grab mortal temp? */
-            SvREFCNT_inc_simple_void(sv);
-            SvTEMP_off(sv);
-        }
-        else { assert(SvIMMORTAL(sv)); }
-        break;
-    case 3:
-        /* Something tried to die.  Abandon constant folding.  */
-        /* Pretend the error never happened.  */
-        CLEAR_ERRSV();
-        o->op_next = old_next;
-        break;
-    default:
-        /* Don't expect 1 (setjmp failed) or 2 (something called my_exit)  */
-        PL_warnhook = oldwarnhook;
-        PL_diehook  = olddiehook;
-        /* XXX note that this croak may fail as we've already blown away
-         * the stack - eg any nested evals */
-        Perl_croak(aTHX_ "panic: fold_constants JMPENV_PUSH returned %d", ret);
-    }
-    PL_dowarn   = oldwarn;
-    PL_warnhook = oldwarnhook;
-    PL_diehook  = olddiehook;
-    PL_curcop = &PL_compiling;
+=cut
+*/
 
-    /* if we croaked, depending on how we croaked the eval scope
-     * may or may not have already been popped */
-    if (cxstack_ix > old_cxix) {
-        assert(cxstack_ix == old_cxix + 1);
-        assert(CxTYPE(CX_CUR()) == CXt_EVAL);
-        delete_eval_scope();
-    }
-    if (ret)
-        goto nope;
+OP *
+Perl_newMETHOP_named (pTHX_ I32 type, I32 flags, SV* const_meth) {
+    PERL_ARGS_ASSERT_NEWMETHOP_NAMED;
+    return newMETHOP_internal(type, flags, NULL, const_meth);
+}
 
-    /* OP_STRINGIFY and constant folding are used to implement qq.
-       Here the constant folding is an implementation detail that we
-       want to hide.  If the stringify op is itself already marked
-       folded, however, then it is actually a folded join.  */
-    is_stringify = type == OP_STRINGIFY && !o->op_folded;
-    op_free(o);
-    assert(sv);
-    if (is_stringify)
-        SvPADTMP_off(sv);
-    else if (!SvIMMORTAL(sv)) {
-        SvPADTMP_on(sv);
-        SvREADONLY_on(sv);
-    }
-    newop = newSVOP(OP_CONST, 0, MUTABLE_SV(sv));
-    if (!is_stringify) newop->op_folded = 1;
-    return newop;
+/*
+=for apidoc newBINOP
 
- nope:
-    return o;
-}
+Constructs, checks, and returns an op of any binary type.  C<type>
+is the opcode.  C<flags> gives the eight bits of C<op_flags>, except
+that C<OPf_KIDS> will be set automatically, and, shifted up eight bits,
+the eight bits of C<op_private>, except that the bit with value 1 or
+2 is automatically set as required.  C<first> and C<last> supply up to
+two ops to be the direct children of the binary op; they are consumed
+by this function and become part of the constructed op tree.
 
-/* convert a constant range in list context into an OP_RV2AV, OP_CONST pair;
- * the constant value being an AV holding the flattened range.
- */
+=cut
+*/
 
-static void
-S_gen_constant_list(pTHX_ OP *o)
+OP *
+Perl_newBINOP(pTHX_ I32 type, I32 flags, OP *first, OP *last)
 {
-    OP *curop, *old_next;
-    SV * const oldwarnhook = PL_warnhook;
-    SV * const olddiehook  = PL_diehook;
-    COP *old_curcop;
-    U8 oldwarn = PL_dowarn;
-    SV **svp;
-    AV *av;
-    I32 old_cxix;
-    COP not_compiling;
-    int ret = 0;
-    dJMPENV;
-    bool op_was_null;
+    BINOP *binop;
 
-    list(o);
-    if (PL_parser && PL_parser->error_count)
-        return;                /* Don't attempt to run with errors */
+    ASSUME((PL_opargs[type] & OA_CLASS_MASK) == OA_BINOP
+        || type == OP_NULL || type == OP_CUSTOM);
 
-    curop = LINKLIST(o);
-    old_next = o->op_next;
-    o->op_next = 0;
-    op_was_null = o->op_type == OP_NULL;
-    if (op_was_null) /* b3698342565fb462291fba4b432cfcd05b6eb4e1 */
-        o->op_type = OP_CUSTOM;
-    CALL_PEEP(curop);
-    if (op_was_null)
-        o->op_type = OP_NULL;
-    S_prune_chain_head(&curop);
-    PL_op = curop;
+    NewOp(1101, binop, 1, BINOP);
 
-    old_cxix = cxstack_ix;
-    create_eval_scope(NULL, G_FAKINGEVAL);
+    if (!first)
+        first = newOP(OP_NULL, 0);
 
-    old_curcop = PL_curcop;
-    StructCopy(old_curcop, &not_compiling, COP);
-    PL_curcop = &not_compiling;
-    /* The above ensures that we run with all the correct hints of the
-       current COP, but that IN_PERL_RUNTIME is true. */
-    assert(IN_PERL_RUNTIME);
-    PL_warnhook = PERL_WARNHOOK_FATAL;
-    PL_diehook  = NULL;
-    JMPENV_PUSH(ret);
+    OpTYPE_set(binop, type);
+    binop->op_first = first;
+    binop->op_flags = (U8)(flags | OPf_KIDS);
+    if (!last) {
+        last = first;
+        binop->op_private = (U8)(1 | (flags >> 8));
+    }
+    else {
+        binop->op_private = (U8)(2 | (flags >> 8));
+        OpMORESIB_set(first, last);
+    }
 
-    /* Effective $^W=1.  */
-    if ( ! (PL_dowarn & G_WARN_ALL_MASK))
-        PL_dowarn |= G_WARN_ON;
+    if (!OpHAS_SIBLING(last)) /* true unless weird syntax error */
+        OpLASTSIB_set(last, (OP*)binop);
 
-    switch (ret) {
-    case 0:
-#if defined DEBUGGING && !defined DEBUGGING_RE_ONLY
-        PL_curstackinfo->si_stack_hwm = 0; /* stop valgrind complaining */
-#endif
-        Perl_pp_pushmark(aTHX);
-        CALLRUNOPS(aTHX);
-        PL_op = curop;
-        assert (!(curop->op_flags & OPf_SPECIAL));
-        assert(curop->op_type == OP_RANGE);
-        Perl_pp_anonlist(aTHX);
-        break;
-    case 3:
-        CLEAR_ERRSV();
-        o->op_next = old_next;
-        break;
-    default:
-        JMPENV_POP;
-        PL_warnhook = oldwarnhook;
-        PL_diehook = olddiehook;
-        Perl_croak(aTHX_ "panic: gen_constant_list JMPENV_PUSH returned %d",
-            ret);
-    }
-
-    JMPENV_POP;
-    PL_dowarn = oldwarn;
-    PL_warnhook = oldwarnhook;
-    PL_diehook = olddiehook;
-    PL_curcop = old_curcop;
-
-    if (cxstack_ix > old_cxix) {
-        assert(cxstack_ix == old_cxix + 1);
-        assert(CxTYPE(CX_CUR()) == CXt_EVAL);
-        delete_eval_scope();
-    }
-    if (ret)
-        return;
-
-    OpTYPE_set(o, OP_RV2AV);
-    o->op_flags &= ~OPf_REF;   /* treat \(1..2) like an ordinary list */
-    o->op_flags |= OPf_PARENS; /* and flatten \(1..2,3) */
-    o->op_opt = 0;             /* needs to be revisited in rpeep() */
-    av = (AV *)SvREFCNT_inc_NN(*PL_stack_sp--);
+    binop->op_last = OpSIBLING(binop->op_first);
+    if (binop->op_last)
+        OpLASTSIB_set(binop->op_last, (OP*)binop);
 
-    /* replace subtree with an OP_CONST */
-    curop = ((UNOP*)o)->op_first;
-    op_sibling_splice(o, NULL, -1, newSVOP(OP_CONST, 0, (SV *)av));
-    op_free(curop);
+    binop = (BINOP*) CHECKOP(type, binop);
+    if (binop->op_next || binop->op_type != (OPCODE)type)
+        return (OP*)binop;
 
-    if (AvFILLp(av) != -1)
-        for (svp = AvARRAY(av) + AvFILLp(av); svp >= AvARRAY(av); --svp)
-        {
-            SvPADTMP_on(*svp);
-            SvREADONLY_on(*svp);
-        }
-    LINKLIST(o);
-    list(o);
-    return;
+    return fold_constants(op_integerize(op_std_init((OP *)binop)));
 }
 
-/*
-=for apidoc_section $optree_manipulation
-*/
-
-/* List constructors */
+void
+Perl_invmap_dump(pTHX_ SV* invlist, UV *map)
+{
+    const char indent[] = "    ";
 
-/*
-=for apidoc op_append_elem
+    UV len = _invlist_len(invlist);
+    UV * array = invlist_array(invlist);
+    UV i;
 
-Append an item to the list of ops contained directly within a list-type
-op, returning the lengthened list.  C<first> is the list-type op,
-and C<last> is the op to append to the list.  C<optype> specifies the
-intended opcode for the list.  If C<first> is not already a list of the
-right type, it will be upgraded into one.  If either C<first> or C<last>
-is null, the other is returned unchanged.
+    PERL_ARGS_ASSERT_INVMAP_DUMP;
 
-=cut
-*/
+    for (i = 0; i < len; i++) {
+        UV start = array[i];
+        UV end   = (i + 1 < len) ? array[i+1] - 1 : IV_MAX;
 
-OP *
-Perl_op_append_elem(pTHX_ I32 type, OP *first, OP *last)
-{
-    if (!first)
-        return last;
+        PerlIO_printf(Perl_debug_log, "%s[%" UVuf "] 0x%04" UVXf, indent, i, start);
+        if (end == IV_MAX) {
+            PerlIO_printf(Perl_debug_log, " .. INFTY");
+        }
+        else if (end != start) {
+            PerlIO_printf(Perl_debug_log, " .. 0x%04" UVXf, end);
+        }
+        else {
+            PerlIO_printf(Perl_debug_log, "            ");
+        }
 
-    if (!last)
-        return first;
+        PerlIO_printf(Perl_debug_log, "\t");
 
-    if (first->op_type != (unsigned)type
-        || (type == OP_LIST && (first->op_flags & OPf_PARENS)))
-    {
-        return newLISTOP(type, 0, first, last);
+        if (map[i] == TR_UNLISTED) {
+            PerlIO_printf(Perl_debug_log, "TR_UNLISTED\n");
+        }
+        else if (map[i] == TR_SPECIAL_HANDLING) {
+            PerlIO_printf(Perl_debug_log, "TR_SPECIAL_HANDLING\n");
+        }
+        else {
+            PerlIO_printf(Perl_debug_log, "0x%04" UVXf "\n", map[i]);
+        }
     }
-
-    op_sibling_splice(first, ((LISTOP*)first)->op_last, 0, last);
-    first->op_flags |= OPf_KIDS;
-    return first;
 }
 
-/*
-=for apidoc op_append_list
-
-Concatenate the lists of ops contained directly within two list-type ops,
-returning the combined list.  C<first> and C<last> are the list-type ops
-to concatenate.  C<optype> specifies the intended opcode for the list.
-If either C<first> or C<last> is not already a list of the right type,
-it will be upgraded into one.  If either C<first> or C<last> is null,
-the other is returned unchanged.
-
-=cut
-*/
+/* Given an OP_TRANS / OP_TRANSR op o, plus OP_CONST ops expr and repl
+ * containing the search and replacement strings, assemble into
+ * a translation table attached as o->op_pv.
+ * Free expr and repl.
+ * It expects the toker to have already set the
+ *   OPpTRANS_COMPLEMENT
+ *   OPpTRANS_SQUASH
+ *   OPpTRANS_DELETE
+ * flags as appropriate; this function may add
+ *   OPpTRANS_USE_SVOP
+ *   OPpTRANS_CAN_FORCE_UTF8
+ *   OPpTRANS_IDENTICAL
+ *   OPpTRANS_GROWS
+ * flags
+ */
 
-OP *
-Perl_op_append_list(pTHX_ I32 type, OP *first, OP *last)
+static OP *
+S_pmtrans(pTHX_ OP *o, OP *expr, OP *repl)
 {
-    if (!first)
-        return last;
+    /* This function compiles a tr///, from data gathered from toke.c, into a
+     * form suitable for use by do_trans() in doop.c at runtime.
+     *
+     * It first normalizes the data, while discarding extraneous inputs; then
+     * writes out the compiled data.  The normalization allows for complete
+     * analysis, and avoids some false negatives and positives earlier versions
+     * of this code had.
+     *
+     * The normalization form is an inversion map (described below in detail).
+     * This is essentially the compiled form for tr///'s that require UTF-8,
+     * and its easy to use it to write the 257-byte table for tr///'s that
+     * don't need UTF-8.  That table is identical to what's been in use for
+     * many perl versions, except that it doesn't handle some edge cases that
+     * it used to, involving code points above 255.  The UTF-8 form now handles
+     * these.  (This could be changed with extra coding should it shown to be
+     * desirable.)
+     *
+     * If the complement (/c) option is specified, the lhs string (tstr) is
+     * parsed into an inversion list.  Complementing these is trivial.  Then a
+     * complemented tstr is built from that, and used thenceforth.  This hides
+     * the fact that it was complemented from almost all successive code.
+     *
+     * One of the important characteristics to know about the input is whether
+     * the transliteration may be done in place, or does a temporary need to be
+     * allocated, then copied.  If the replacement for every character in every
+     * possible string takes up no more bytes than the character it
+     * replaces, then it can be edited in place.  Otherwise the replacement
+     * could overwrite a byte we are about to read, depending on the strings
+     * being processed.  The comments and variable names here refer to this as
+     * "growing".  Some inputs won't grow, and might even shrink under /d, but
+     * some inputs could grow, so we have to assume any given one might grow.
+     * On very long inputs, the temporary could eat up a lot of memory, so we
+     * want to avoid it if possible.  For non-UTF-8 inputs, everything is
+     * single-byte, so can be edited in place, unless there is something in the
+     * pattern that could force it into UTF-8.  The inversion map makes it
+     * feasible to determine this.  Previous versions of this code pretty much
+     * punted on determining if UTF-8 could be edited in place.  Now, this code
+     * is rigorous in making that determination.
+     *
+     * Another characteristic we need to know is whether the lhs and rhs are
+     * identical.  If so, and no other flags are present, the only effect of
+     * the tr/// is to count the characters present in the input that are
+     * mentioned in the lhs string.  The implementation of that is easier and
+     * runs faster than the more general case.  Normalizing here allows for
+     * accurate determination of this.  Previously there were false negatives
+     * possible.
+     *
+     * Instead of 'transliterated', the comments here use 'unmapped' for the
+     * characters that are left unchanged by the operation; otherwise they are
+     * 'mapped'
+     *
+     * The lhs of the tr/// is here referred to as the t side.
+     * The rhs of the tr/// is here referred to as the r side.
+     */
 
-    if (!last)
-        return first;
+    SV * const tstr = cSVOPx(expr)->op_sv;
+    SV * const rstr = cSVOPx(repl)->op_sv;
+    STRLEN tlen;
+    STRLEN rlen;
+    const U8 * t0 = (U8*)SvPV_const(tstr, tlen);
+    const U8 * r0 = (U8*)SvPV_const(rstr, rlen);
+    const U8 * t = t0;
+    const U8 * r = r0;
+    UV t_count = 0, r_count = 0;  /* Number of characters in search and
+                                         replacement lists */
 
-    if (first->op_type != (unsigned)type)
-        return op_prepend_elem(type, first, last);
+    /* khw thinks some of the private flags for this op are quaintly named.
+     * OPpTRANS_GROWS for example is TRUE if the replacement for some lhs
+     * character when represented in UTF-8 is longer than the original
+     * character's UTF-8 representation */
+    const bool complement = cBOOL(o->op_private & OPpTRANS_COMPLEMENT);
+    const bool squash     = cBOOL(o->op_private & OPpTRANS_SQUASH);
+    const bool del        = cBOOL(o->op_private & OPpTRANS_DELETE);
 
-    if (last->op_type != (unsigned)type)
-        return op_append_elem(type, first, last);
+    /* Set to true if there is some character < 256 in the lhs that maps to
+     * above 255.  If so, a non-UTF-8 match string can be forced into being in
+     * UTF-8 by a tr/// operation. */
+    bool can_force_utf8 = FALSE;
 
-    OpMORESIB_set(((LISTOP*)first)->op_last, ((LISTOP*)last)->op_first);
-    ((LISTOP*)first)->op_last = ((LISTOP*)last)->op_last;
-    OpLASTSIB_set(((LISTOP*)first)->op_last, first);
-    first->op_flags |= (last->op_flags & OPf_KIDS);
+    /* What is the maximum expansion factor in UTF-8 transliterations.  If a
+     * 2-byte UTF-8 encoded character is to be replaced by a 3-byte one, its
+     * expansion factor is 1.5.  This number is used at runtime to calculate
+     * how much space to allocate for non-inplace transliterations.  Without
+     * this number, the worst case is 14, which is extremely unlikely to happen
+     * in real life, and could require significant memory overhead. */
+    NV max_expansion = 1.;
 
-    S_op_destroy(aTHX_ last);
+    UV t_range_count, r_range_count, min_range_count;
+    UV* t_array;
+    SV* t_invlist;
+    UV* r_map;
+    UV r_cp = 0, t_cp = 0;
+    UV t_cp_end = (UV) -1;
+    UV r_cp_end;
+    Size_t len;
+    AV* invmap;
+    UV final_map = TR_UNLISTED;    /* The final character in the replacement
+                                      list, updated as we go along.  Initialize
+                                      to something illegal */
 
-    return first;
-}
+    bool rstr_utf8 = cBOOL(SvUTF8(rstr));
+    bool tstr_utf8 = cBOOL(SvUTF8(tstr));
 
-/*
-=for apidoc op_prepend_elem
+    const U8* tend = t + tlen;
+    const U8* rend = r + rlen;
 
-Prepend an item to the list of ops contained directly within a list-type
-op, returning the lengthened list.  C<first> is the op to prepend to the
-list, and C<last> is the list-type op.  C<optype> specifies the intended
-opcode for the list.  If C<last> is not already a list of the right type,
-it will be upgraded into one.  If either C<first> or C<last> is null,
-the other is returned unchanged.
-
-=cut
-*/
-
-OP *
-Perl_op_prepend_elem(pTHX_ I32 type, OP *first, OP *last)
-{
-    if (!first)
-        return last;
-
-    if (!last)
-        return first;
+    SV * inverted_tstr = NULL;
 
-    if (last->op_type == (unsigned)type) {
-        if (type == OP_LIST) { /* already a PUSHMARK there */
-            /* insert 'first' after pushmark */
-            op_sibling_splice(last, cLISTOPx(last)->op_first, 0, first);
-            if (!(first->op_flags & OPf_PARENS))
-                last->op_flags &= ~OPf_PARENS;
-        }
-        else
-            op_sibling_splice(last, NULL, 0, first);
-        last->op_flags |= OPf_KIDS;
-        return last;
-    }
+    Size_t i;
+    unsigned int pass2;
 
-    return newLISTOP(type, 0, first, last);
-}
+    /* This routine implements detection of a transliteration having a longer
+     * UTF-8 representation than its source, by partitioning all the possible
+     * code points of the platform into equivalence classes of the same UTF-8
+     * byte length in the first pass.  As it constructs the mappings, it carves
+     * these up into smaller chunks, but doesn't merge any together.  This
+     * makes it easy to find the instances it's looking for.  A second pass is
+     * done after this has been determined which merges things together to
+     * shrink the table for runtime.  The table below is used for both ASCII
+     * and EBCDIC platforms.  On EBCDIC, the byte length is not monotonically
+     * increasing for code points below 256.  To correct for that, the macro
+     * CP_ADJUST defined below converts those code points to ASCII in the first
+     * pass, and we use the ASCII partition values.  That works because the
+     * growth factor will be unaffected, which is all that is calculated during
+     * the first pass. */
+    UV PL_partition_by_byte_length[] = {
+        0,
+        0x80,   /* Below this is 1 byte representations */
+        (32 * (1UL << (    UTF_ACCUMULATION_SHIFT))),   /* 2 bytes below this */
+        (16 * (1UL << (2 * UTF_ACCUMULATION_SHIFT))),   /* 3 bytes below this */
+        ( 8 * (1UL << (3 * UTF_ACCUMULATION_SHIFT))),   /* 4 bytes below this */
+        ( 4 * (1UL << (4 * UTF_ACCUMULATION_SHIFT))),   /* 5 bytes below this */
+        ( 2 * (1UL << (5 * UTF_ACCUMULATION_SHIFT)))    /* 6 bytes below this */
 
-/*
-=for apidoc op_convert_list
+#  ifdef UV_IS_QUAD
+                                                    ,
+        ( ((UV) 1U << (6 * UTF_ACCUMULATION_SHIFT)))    /* 7 bytes below this */
+#  endif
 
-Converts C<o> into a list op if it is not one already, and then converts it
-into the specified C<type>, calling its check function, allocating a target if
-it needs one, and folding constants.
+    };
 
-A list-type op is usually constructed one kid at a time via C<newLISTOP>,
-C<op_prepend_elem> and C<op_append_elem>.  Then finally it is passed to
-C<op_convert_list> to make it the right type.
+    PERL_ARGS_ASSERT_PMTRANS;
 
-=cut
-*/
+    PL_hints |= HINT_BLOCK_SCOPE;
 
-OP *
-Perl_op_convert_list(pTHX_ I32 type, I32 flags, OP *o)
-{
-    if (type < 0) type = -type, flags |= OPf_SPECIAL;
-    if (!o || o->op_type != OP_LIST)
-        o = force_list(o, FALSE);
-    else
-    {
-        o->op_flags &= ~OPf_WANT;
-        o->op_private &= ~OPpLVAL_INTRO;
-    }
+    /* If /c, the search list is sorted and complemented.  This is now done by
+     * creating an inversion list from it, and then trivially inverting that.
+     * The previous implementation used qsort, but creating the list
+     * automatically keeps it sorted as we go along */
+    if (complement) {
+        UV start, end;
+        SV * inverted_tlist = _new_invlist(tlen);
+        Size_t temp_len;
 
-    if (!(PL_opargs[type] & OA_MARK))
-        op_null(cLISTOPo->op_first);
-    else {
-        OP * const kid2 = OpSIBLING(cLISTOPo->op_first);
-        if (kid2 && kid2->op_type == OP_COREARGS) {
-            op_null(cLISTOPo->op_first);
-            kid2->op_private |= OPpCOREARGS_PUSHMARK;
-        }
-    }
+        DEBUG_y(PerlIO_printf(Perl_debug_log,
+                    "%s: %d: tstr before inversion=\n%s\n",
+                    __FILE__, __LINE__, _byte_dump_string(t, tend - t, 0)));
 
-    if (type != OP_SPLIT)
-        /* At this point o is a LISTOP, but OP_SPLIT is a PMOP; let
-         * ck_split() create a real PMOP and leave the op's type as listop
-         * for now. Otherwise op_free() etc will crash.
-         */
-        OpTYPE_set(o, type);
+        while (t < tend) {
 
-    o->op_flags |= flags;
-    if (flags & OPf_FOLDED)
-        o->op_folded = 1;
+            /* Non-utf8 strings don't have ranges, so each character is listed
+             * out */
+            if (! tstr_utf8) {
+                inverted_tlist = add_cp_to_invlist(inverted_tlist, *t);
+                t++;
+            }
+            else {  /* But UTF-8 strings have been parsed in toke.c to have
+                 * ranges if appropriate. */
+                UV t_cp;
+                Size_t t_char_len;
 
-    o = CHECKOP(type, o);
-    if (o->op_type != (unsigned)type)
-        return o;
+                /* Get the first character */
+                t_cp = valid_utf8_to_uvchr(t, &t_char_len);
+                t += t_char_len;
 
-    return fold_constants(op_integerize(op_std_init(o)));
-}
+                /* If the next byte indicates that this wasn't the first
+                 * element of a range, the range is just this one */
+                if (t >= tend || *t != RANGE_INDICATOR) {
+                    inverted_tlist = add_cp_to_invlist(inverted_tlist, t_cp);
+                }
+                else { /* Otherwise, ignore the indicator byte, and get the
+                          final element, and add the whole range */
+                    t++;
+                    t_cp_end = valid_utf8_to_uvchr(t, &t_char_len);
+                    t += t_char_len;
 
-/* Constructors */
+                    inverted_tlist = _add_range_to_invlist(inverted_tlist,
+                                                      t_cp, t_cp_end);
+                }
+            }
+        } /* End of parse through tstr */
 
+        /* The inversion list is done; now invert it */
+        _invlist_invert(inverted_tlist);
 
-/*
-=for apidoc_section $optree_construction
+        /* Now go through the inverted list and create a new tstr for the rest
+         * of the routine to use.  Since the UTF-8 version can have ranges, and
+         * can be much more compact than the non-UTF-8 version, we create the
+         * string in UTF-8 even if not necessary.  (This is just an intermediate
+         * value that gets thrown away anyway.) */
+        invlist_iterinit(inverted_tlist);
+        inverted_tstr = newSVpvs("");
+        while (invlist_iternext(inverted_tlist, &start, &end)) {
+            U8 temp[UTF8_MAXBYTES];
+            U8 * temp_end_pos;
 
-=for apidoc newNULLLIST
+            /* IV_MAX keeps things from going out of bounds */
+            start = MIN(IV_MAX, start);
+            end   = MIN(IV_MAX, end);
 
-Constructs, checks, and returns a new C<stub> op, which represents an
-empty list expression.
+            temp_end_pos = uvchr_to_utf8(temp, start);
+            sv_catpvn(inverted_tstr, (char *) temp, temp_end_pos - temp);
 
-=cut
-*/
+            if (start != end) {
+                Perl_sv_catpvf(aTHX_ inverted_tstr, "%c", RANGE_INDICATOR);
+                temp_end_pos = uvchr_to_utf8(temp, end);
+                sv_catpvn(inverted_tstr, (char *) temp, temp_end_pos - temp);
+            }
+        }
 
-OP *
-Perl_newNULLLIST(pTHX)
-{
-    return newOP(OP_STUB, 0);
-}
+        /* Set up so the remainder of the routine uses this complement, instead
+         * of the actual input */
+        t0 = t = (U8*)SvPV_const(inverted_tstr, temp_len);
+        tend = t0 + temp_len;
+        tstr_utf8 = TRUE;
 
-/* promote o and any siblings to be a list if its not already; i.e.
- *
- *  o - A - B
- *
- * becomes
- *
- *  list
- *    |
- *  pushmark - o - A - B
- *
- * If nullit it true, the list op is nulled.
- */
+        SvREFCNT_dec_NN(inverted_tlist);
+    }
 
-static OP *
-S_force_list(pTHX_ OP *o, bool nullit)
-{
-    if (!o || o->op_type != OP_LIST) {
-        OP *rest = NULL;
-        if (o) {
-            /* manually detach any siblings then add them back later */
-            rest = OpSIBLING(o);
-            OpLASTSIB_set(o, NULL);
-        }
-        o = newLISTOP(OP_LIST, 0, o, NULL);
-        if (rest)
-            op_sibling_splice(o, cLISTOPo->op_last, 0, rest);
+    /* For non-/d, an empty rhs means to use the lhs */
+    if (rlen == 0 && ! del) {
+        r0 = t0;
+        rend = tend;
+        rstr_utf8  = tstr_utf8;
     }
-    if (nullit)
-        op_null(o);
-    return o;
-}
 
-/*
-=for apidoc newLISTOP
+    t_invlist = _new_invlist(1);
 
-Constructs, checks, and returns an op of any list type.  C<type> is
-the opcode.  C<flags> gives the eight bits of C<op_flags>, except that
-C<OPf_KIDS> will be set automatically if required.  C<first> and C<last>
-supply up to two ops to be direct children of the list op; they are
-consumed by this function and become part of the constructed op tree.
+    /* Initialize to a single range */
+    t_invlist = _add_range_to_invlist(t_invlist, 0, UV_MAX);
 
-For most list operators, the check function expects all the kid ops to be
-present already, so calling C<newLISTOP(OP_JOIN, ...)> (e.g.) is not
-appropriate.  What you want to do in that case is create an op of type
-C<OP_LIST>, append more children to it, and then call L</op_convert_list>.
-See L</op_convert_list> for more information.
+    /* Below, we parse the (potentially adjusted) input, creating the inversion
+     * map.  This is done in two passes.  The first pass is just to determine
+     * if the transliteration can be done in-place.  It can be done in place if
+     * no possible inputs result in the replacement taking up more bytes than
+     * the input.  To figure that out, in the first pass we start with all the
+     * possible code points partitioned into ranges so that every code point in
+     * a range occupies the same number of UTF-8 bytes as every other code
+     * point in the range.  Constructing the inversion map doesn't merge ranges
+     * together, but can split them into multiple ones.  Given the starting
+     * partition, the ending state will also have the same characteristic,
+     * namely that each code point in each partition requires the same number
+     * of UTF-8 bytes to represent as every other code point in the same
+     * partition.
+     *
+     * This partitioning has been pre-compiled.  Copy it to initialize */
+    len = C_ARRAY_LENGTH(PL_partition_by_byte_length);
+    invlist_extend(t_invlist, len);
+    t_array = invlist_array(t_invlist);
+    Copy(PL_partition_by_byte_length, t_array, len, UV);
+    invlist_set_len(t_invlist, len, *(get_invlist_offset_addr(t_invlist)));
+    Newx(r_map, len + 1, UV);
 
+    /* The inversion map the first pass creates could be used as-is, but
+     * generally would be larger and slower to run than the output of the
+     * second pass.  */
 
-=cut
-*/
+    for (pass2 = 0; pass2 < 2; pass2++) {
+        if (pass2) {
+            /* In the second pass, we start with a single range */
+            t_invlist = _add_range_to_invlist(t_invlist, 0, UV_MAX);
+            len = 1;
+            t_array = invlist_array(t_invlist);
+        }
 
-OP *
-Perl_newLISTOP(pTHX_ I32 type, I32 flags, OP *first, OP *last)
-{
-    LISTOP *listop;
-    /* Note that allocating an OP_PUSHMARK can die under Safe.pm if
-     * pushmark is banned. So do it now while existing ops are in a
-     * consistent state, in case they suddenly get freed */
-    OP* const pushop = type == OP_LIST ? newOP(OP_PUSHMARK, 0) : NULL;
-
-    assert((PL_opargs[type] & OA_CLASS_MASK) == OA_LISTOP
-        || type == OP_CUSTOM);
-
-    NewOp(1101, listop, 1, LISTOP);
-    OpTYPE_set(listop, type);
-    if (first || last)
-        flags |= OPf_KIDS;
-    listop->op_flags = (U8)flags;
-
-    if (!last && first)
-        last = first;
-    else if (!first && last)
-        first = last;
-    else if (first)
-        OpMORESIB_set(first, last);
-    listop->op_first = first;
-    listop->op_last = last;
+/* As noted earlier, we convert EBCDIC code points to Unicode in the first pass
+ * so as to get the well-behaved length 1 vs length 2 boundary.  Only code
+ * points below 256 differ between the two character sets in this regard.  For
+ * these, we also can't have any ranges, as they have to be individually
+ * converted. */
+#ifdef EBCDIC
+#  define CP_ADJUST(x)          ((pass2) ? (x) : NATIVE_TO_UNI(x))
+#  define FORCE_RANGE_LEN_1(x)  ((pass2) ? 0 : ((x) < 256))
+#  define CP_SKIP(x)            ((pass2) ? UVCHR_SKIP(x) : OFFUNISKIP(x))
+#else
+#  define CP_ADJUST(x)          (x)
+#  define FORCE_RANGE_LEN_1(x)  0
+#  define CP_SKIP(x)            UVCHR_SKIP(x)
+#endif
 
-    if (pushop) {
-        OpMORESIB_set(pushop, first);
-        listop->op_first = pushop;
-        listop->op_flags |= OPf_KIDS;
-        if (!last)
-            listop->op_last = pushop;
-    }
-    if (listop->op_last)
-        OpLASTSIB_set(listop->op_last, (OP*)listop);
+        /* And the mapping of each of the ranges is initialized.  Initially,
+         * everything is TR_UNLISTED. */
+        for (i = 0; i < len; i++) {
+            r_map[i] = TR_UNLISTED;
+        }
 
-    return CHECKOP(type, listop);
-}
+        t = t0;
+        t_count = 0;
+        r = r0;
+        r_count = 0;
+        t_range_count = r_range_count = 0;
 
-/*
-=for apidoc newOP
+        DEBUG_y(PerlIO_printf(Perl_debug_log, "%s: %d:\ntstr=%s\n",
+                    __FILE__, __LINE__, _byte_dump_string(t, tend - t, 0)));
+        DEBUG_y(PerlIO_printf(Perl_debug_log, "rstr=%s\n",
+                                        _byte_dump_string(r, rend - r, 0)));
+        DEBUG_y(PerlIO_printf(Perl_debug_log, "/c=%d; /s=%d; /d=%d\n",
+                                                  complement, squash, del));
+        DEBUG_y(invmap_dump(t_invlist, r_map));
 
-Constructs, checks, and returns an op of any base type (any type that
-has no extra fields).  C<type> is the opcode.  C<flags> gives the
-eight bits of C<op_flags>, and, shifted up eight bits, the eight bits
-of C<op_private>.
+        /* Now go through the search list constructing an inversion map.  The
+         * input is not necessarily in any particular order.  Making it an
+         * inversion map orders it, potentially simplifying, and makes it easy
+         * to deal with at run time.  This is the only place in core that
+         * generates an inversion map; if others were introduced, it might be
+         * better to create general purpose routines to handle them.
+         * (Inversion maps are created in perl in other places.)
+         *
+         * An inversion map consists of two parallel arrays.  One is
+         * essentially an inversion list: an ordered list of code points such
+         * that each element gives the first code point of a range of
+         * consecutive code points that map to the element in the other array
+         * that has the same index as this one (in other words, the
+         * corresponding element).  Thus the range extends up to (but not
+         * including) the code point given by the next higher element.  In a
+         * true inversion map, the corresponding element in the other array
+         * gives the mapping of the first code point in the range, with the
+         * understanding that the next higher code point in the inversion
+         * list's range will map to the next higher code point in the map.
+         *
+         * So if at element [i], let's say we have:
+         *
+         *     t_invlist  r_map
+         * [i]    A         a
+         *
+         * This means that A => a, B => b, C => c....  Let's say that the
+         * situation is such that:
+         *
+         * [i+1]  L        -1
+         *
+         * This means the sequence that started at [i] stops at K => k.  This
+         * illustrates that you need to look at the next element to find where
+         * a sequence stops.  Except, the highest element in the inversion list
+         * begins a range that is understood to extend to the platform's
+         * infinity.
+         *
+         * This routine modifies traditional inversion maps to reserve two
+         * mappings:
+         *
+         *  TR_UNLISTED (or -1) indicates that no code point in the range
+         *      is listed in the tr/// searchlist.  At runtime, these are
+         *      always passed through unchanged.  In the inversion map, all
+         *      points in the range are mapped to -1, instead of increasing,
+         *      like the 'L' in the example above.
+         *
+         *      We start the parse with every code point mapped to this, and as
+         *      we parse and find ones that are listed in the search list, we
+         *      carve out ranges as we go along that override that.
+         *
+         *  TR_SPECIAL_HANDLING (or -2) indicates that every code point in the
+         *      range needs special handling.  Again, all code points in the
+         *      range are mapped to -2, instead of increasing.
+         *
+         *      Under /d this value means the code point should be deleted from
+         *      the transliteration when encountered.
+         *
+         *      Otherwise, it marks that every code point in the range is to
+         *      map to the final character in the replacement list.  This
+         *      happens only when the replacement list is shorter than the
+         *      search one, so there are things in the search list that have no
+         *      correspondence in the replacement list.  For example, in
+         *      tr/a-z/A/, 'A' is the final value, and the inversion map
+         *      generated for this would be like this:
+         *          \0  =>  -1
+         *          a   =>   A
+         *          b-z =>  -2
+         *          z+1 =>  -1
+         *      'A' appears once, then the remainder of the range maps to -2.
+         *      The use of -2 isn't strictly necessary, as an inversion map is
+         *      capable of representing this situation, but not nearly so
+         *      compactly, and this is actually quite commonly encountered.
+         *      Indeed, the original design of this code used a full inversion
+         *      map for this.  But things like
+         *          tr/\0-\x{FFFF}/A/
+         *      generated huge data structures, slowly, and the execution was
+         *      also slow.  So the current scheme was implemented.
+         *
+         *  So, if the next element in our example is:
+         *
+         * [i+2]  Q        q
+         *
+         * Then all of L, M, N, O, and P map to TR_UNLISTED.  If the next
+         * elements are
+         *
+         * [i+3]  R        z
+         * [i+4]  S       TR_UNLISTED
+         *
+         * Then Q => q; R => z; and S => TR_UNLISTED.  If [i+4] (the 'S') is
+         * the final element in the arrays, every code point from S to infinity
+         * maps to TR_UNLISTED.
+         *
+         */
+                           /* Finish up range started in what otherwise would
+                            * have been the final iteration */
+        while (t < tend || t_range_count > 0) {
+            bool adjacent_to_range_above = FALSE;
+            bool adjacent_to_range_below = FALSE;
 
-=cut
-*/
+            bool merge_with_range_above = FALSE;
+            bool merge_with_range_below = FALSE;
 
-OP *
-Perl_newOP(pTHX_ I32 type, I32 flags)
-{
-    OP *o;
+            UV span, invmap_range_length_remaining;
+            SSize_t j;
+            Size_t i;
 
-    if (type == -OP_ENTEREVAL) {
-        type = OP_ENTEREVAL;
-        flags |= OPpEVAL_BYTES<<8;
-    }
+            /* If we are in the middle of processing a range in the 'target'
+             * side, the previous iteration has set us up.  Otherwise, look at
+             * the next character in the search list */
+            if (t_range_count <= 0) {
+                if (! tstr_utf8) {
 
-    assert((PL_opargs[type] & OA_CLASS_MASK) == OA_BASEOP
-        || (PL_opargs[type] & OA_CLASS_MASK) == OA_BASEOP_OR_UNOP
-        || (PL_opargs[type] & OA_CLASS_MASK) == OA_FILESTATOP
-        || (PL_opargs[type] & OA_CLASS_MASK) == OA_LOOPEXOP);
+                    /* Here, not in the middle of a range, and not UTF-8.  The
+                     * next code point is the single byte where we're at */
+                    t_cp = CP_ADJUST(*t);
+                    t_range_count = 1;
+                    t++;
+                }
+                else {
+                    Size_t t_char_len;
 
-    NewOp(1101, o, 1, OP);
-    OpTYPE_set(o, type);
-    o->op_flags = (U8)flags;
+                    /* Here, not in the middle of a range, and is UTF-8.  The
+                     * next code point is the next UTF-8 char in the input.  We
+                     * know the input is valid, because the toker constructed
+                     * it */
+                    t_cp = CP_ADJUST(valid_utf8_to_uvchr(t, &t_char_len));
+                    t += t_char_len;
 
-    o->op_next = o;
-    o->op_private = (U8)(0 | (flags >> 8));
-    if (PL_opargs[type] & OA_RETSCALAR)
-        scalar(o);
-    if (PL_opargs[type] & OA_TARGET)
-        o->op_targ = pad_alloc(type, SVs_PADTMP);
-    return CHECKOP(type, o);
-}
+                    /* UTF-8 strings (only) have been parsed in toke.c to have
+                     * ranges.  See if the next byte indicates that this was
+                     * the first element of a range.  If so, get the final
+                     * element and calculate the range size.  If not, the range
+                     * size is 1 */
+                    if (   t < tend && *t == RANGE_INDICATOR
+                        && ! FORCE_RANGE_LEN_1(t_cp))
+                    {
+                        t++;
+                        t_range_count = valid_utf8_to_uvchr(t, &t_char_len)
+                                      - t_cp + 1;
+                        t += t_char_len;
+                    }
+                    else {
+                        t_range_count = 1;
+                    }
+                }
 
-/*
-=for apidoc newUNOP
+                /* Count the total number of listed code points * */
+                t_count += t_range_count;
+            }
 
-Constructs, checks, and returns an op of any unary type.  C<type> is
-the opcode.  C<flags> gives the eight bits of C<op_flags>, except that
-C<OPf_KIDS> will be set automatically if required, and, shifted up eight
-bits, the eight bits of C<op_private>, except that the bit with value 1
-is automatically set.  C<first> supplies an optional op to be the direct
-child of the unary op; it is consumed by this function and become part
-of the constructed op tree.
+            /* Similarly, get the next character in the replacement list */
+            if (r_range_count <= 0) {
+                if (r >= rend) {
 
-=for apidoc Amnh||OPf_KIDS
+                    /* But if we've exhausted the rhs, there is nothing to map
+                     * to, except the special handling one, and we make the
+                     * range the same size as the lhs one. */
+                    r_cp = TR_SPECIAL_HANDLING;
+                    r_range_count = t_range_count;
 
-=cut
-*/
-
-OP *
-Perl_newUNOP(pTHX_ I32 type, I32 flags, OP *first)
-{
-    UNOP *unop;
-
-    if (type == -OP_ENTEREVAL) {
-        type = OP_ENTEREVAL;
-        flags |= OPpEVAL_BYTES<<8;
-    }
-
-    assert((PL_opargs[type] & OA_CLASS_MASK) == OA_UNOP
-        || (PL_opargs[type] & OA_CLASS_MASK) == OA_BASEOP_OR_UNOP
-        || (PL_opargs[type] & OA_CLASS_MASK) == OA_FILESTATOP
-        || (PL_opargs[type] & OA_CLASS_MASK) == OA_LOOPEXOP
-        || type == OP_SASSIGN
-        || type == OP_ENTERTRY
-        || type == OP_ENTERTRYCATCH
-        || type == OP_CUSTOM
-        || type == OP_NULL );
-
-    if (!first)
-        first = newOP(OP_STUB, 0);
-    if (PL_opargs[type] & OA_MARK)
-        first = force_list(first, TRUE);
+                    if (! del) {
+                        DEBUG_yv(PerlIO_printf(Perl_debug_log,
+                                        "final_map =%" UVXf "\n", final_map));
+                    }
+                }
+                else {
+                    if (! rstr_utf8) {
+                        r_cp = CP_ADJUST(*r);
+                        r_range_count = 1;
+                        r++;
+                    }
+                    else {
+                        Size_t r_char_len;
 
-    NewOp(1101, unop, 1, UNOP);
-    OpTYPE_set(unop, type);
-    unop->op_first = first;
-    unop->op_flags = (U8)(flags | OPf_KIDS);
-    unop->op_private = (U8)(1 | (flags >> 8));
+                        r_cp = CP_ADJUST(valid_utf8_to_uvchr(r, &r_char_len));
+                        r += r_char_len;
+                        if (   r < rend && *r == RANGE_INDICATOR
+                            && ! FORCE_RANGE_LEN_1(r_cp))
+                        {
+                            r++;
+                            r_range_count = valid_utf8_to_uvchr(r,
+                                                    &r_char_len) - r_cp + 1;
+                            r += r_char_len;
+                        }
+                        else {
+                            r_range_count = 1;
+                        }
+                    }
 
-    if (!OpHAS_SIBLING(first)) /* true unless weird syntax error */
-        OpLASTSIB_set(first, (OP*)unop);
+                    if (r_cp == TR_SPECIAL_HANDLING) {
+                        r_range_count = t_range_count;
+                    }
 
-    unop = (UNOP*) CHECKOP(type, unop);
-    if (unop->op_next)
-        return (OP*)unop;
+                    /* This is the final character so far */
+                    final_map = r_cp + r_range_count - 1;
 
-    return fold_constants(op_integerize(op_std_init((OP *) unop)));
-}
+                    r_count += r_range_count;
+                }
+            }
 
-/*
-=for apidoc newUNOP_AUX
+            /* Here, we have the next things ready in both sides.  They are
+             * potentially ranges.  We try to process as big a chunk as
+             * possible at once, but the lhs and rhs must be synchronized, so
+             * things like tr/A-Z/a-ij-z/ will need to be processed in 2 chunks
+             * */
+            min_range_count = MIN(t_range_count, r_range_count);
 
-Similar to C<newUNOP>, but creates an C<UNOP_AUX> struct instead, with C<op_aux>
-initialised to C<aux>
+            /* Search the inversion list for the entry that contains the input
+             * code point <cp>.  The inversion map was initialized to cover the
+             * entire range of possible inputs, so this should not fail.  So
+             * the return value is the index into the list's array of the range
+             * that contains <cp>, that is, 'i' such that array[i] <= cp <
+             * array[i+1] */
+            j = _invlist_search(t_invlist, t_cp);
+            assert(j >= 0);
+            i = j;
 
-=cut
-*/
+            /* Here, the data structure might look like:
+             *
+             * index    t   r     Meaning
+             * [i-1]    J   j   # J-L => j-l
+             * [i]      M  -1   # M => default; as do N, O, P, Q
+             * [i+1]    R   x   # R => x, S => x+1, T => x+2
+             * [i+2]    U   y   # U => y, V => y+1, ...
+             * ...
+             * [-1]     Z  -1   # Z => default; as do Z+1, ... infinity
+             *
+             * where 'x' and 'y' above are not to be taken literally.
+             *
+             * The maximum chunk we can handle in this loop iteration, is the
+             * smallest of the three components: the lhs 't_', the rhs 'r_',
+             * and the remainder of the range in element [i].  (In pass 1, that
+             * range will have everything in it be of the same class; we can't
+             * cross into another class.)  'min_range_count' already contains
+             * the smallest of the first two values.  The final one is
+             * irrelevant if the map is to the special indicator */
 
-OP *
-Perl_newUNOP_AUX(pTHX_ I32 type, I32 flags, OP *first, UNOP_AUX_item *aux)
-{
-    UNOP_AUX *unop;
+            invmap_range_length_remaining = (i + 1 < len)
+                                            ? t_array[i+1] - t_cp
+                                            : IV_MAX - t_cp;
+            span = MAX(1, MIN(min_range_count, invmap_range_length_remaining));
 
-    assert((PL_opargs[type] & OA_CLASS_MASK) == OA_UNOP_AUX
-        || type == OP_CUSTOM);
+            /* The end point of this chunk is where we are, plus the span, but
+             * never larger than the platform's infinity */
+            t_cp_end = MIN(IV_MAX, t_cp + span - 1);
 
-    NewOp(1101, unop, 1, UNOP_AUX);
-    unop->op_type = (OPCODE)type;
-    unop->op_ppaddr = PL_ppaddr[type];
-    unop->op_first = first;
-    unop->op_flags = (U8)(flags | (first ? OPf_KIDS : 0));
-    unop->op_private = (U8)((first ? 1 : 0) | (flags >> 8));
-    unop->op_aux = aux;
+            if (r_cp == TR_SPECIAL_HANDLING) {
 
-    if (first && !OpHAS_SIBLING(first)) /* true unless weird syntax error */
-        OpLASTSIB_set(first, (OP*)unop);
+                /* If unmatched lhs code points map to the final map, use that
+                 * value.  This being set to TR_SPECIAL_HANDLING indicates that
+                 * we don't have a final map: unmatched lhs code points are
+                 * simply deleted */
+                r_cp_end = (del) ? TR_SPECIAL_HANDLING : final_map;
+            }
+            else {
+                r_cp_end = MIN(IV_MAX, r_cp + span - 1);
 
-    unop = (UNOP_AUX*) CHECKOP(type, unop);
+                /* If something on the lhs is below 256, and something on the
+                 * rhs is above, there is a potential mapping here across that
+                 * boundary.  Indeed the only way there isn't is if both sides
+                 * start at the same point.  That means they both cross at the
+                 * same time.  But otherwise one crosses before the other */
+                if (t_cp < 256 && r_cp_end > 255 && r_cp != t_cp) {
+                    can_force_utf8 = TRUE;
+                }
+            }
 
-    return op_std_init((OP *) unop);
-}
+            /* If a character appears in the search list more than once, the
+             * 2nd and succeeding occurrences are ignored, so only do this
+             * range if haven't already processed this character.  (The range
+             * has been set up so that all members in it will be of the same
+             * ilk) */
+            if (r_map[i] == TR_UNLISTED) {
+                DEBUG_yv(PerlIO_printf(Perl_debug_log,
+                    "Processing %" UVxf "-%" UVxf " => %" UVxf "-%" UVxf "\n",
+                    t_cp, t_cp_end, r_cp, r_cp_end));
 
-/*
-=for apidoc newMETHOP
+                /* This is the first definition for this chunk, hence is valid
+                 * and needs to be processed.  Here and in the comments below,
+                 * we use the above sample data.  The t_cp chunk must be any
+                 * contiguous subset of M, N, O, P, and/or Q.
+                 *
+                 * In the first pass, calculate if there is any possible input
+                 * string that has a character whose transliteration will be
+                 * longer than it.  If none, the transliteration may be done
+                 * in-place, as it can't write over a so-far unread byte.
+                 * Otherwise, a copy must first be made.  This could be
+                 * expensive for long inputs.
+                 *
+                 * In the first pass, the t_invlist has been partitioned so
+                 * that all elements in any single range have the same number
+                 * of bytes in their UTF-8 representations.  And the r space is
+                 * either a single byte, or a range of strictly monotonically
+                 * increasing code points.  So the final element in the range
+                 * will be represented by no fewer bytes than the initial one.
+                 * That means that if the final code point in the t range has
+                 * at least as many bytes as the final code point in the r,
+                 * then all code points in the t range have at least as many
+                 * bytes as their corresponding r range element.  But if that's
+                 * not true, the transliteration of at least the final code
+                 * point grows in length.  As an example, suppose we had
+                 *      tr/\x{fff0}-\x{fff1}/\x{ffff}-\x{10000}/
+                 * The UTF-8 for all but 10000 occupies 3 bytes on ASCII
+                 * platforms.  We have deliberately set up the data structure
+                 * so that any range in the lhs gets split into chunks for
+                 * processing, such that every code point in a chunk has the
+                 * same number of UTF-8 bytes.  We only have to check the final
+                 * code point in the rhs against any code point in the lhs. */
+                if ( ! pass2
+                    && r_cp_end != TR_SPECIAL_HANDLING
+                    && CP_SKIP(t_cp_end) < CP_SKIP(r_cp_end))
+                {
+                    /* Here, we will need to make a copy of the input string
+                     * before doing the transliteration.  The worst possible
+                     * case is an expansion ratio of 14:1. This is rare, and
+                     * we'd rather allocate only the necessary amount of extra
+                     * memory for that copy.  We can calculate the worst case
+                     * for this particular transliteration is by keeping track
+                     * of the expansion factor for each range.
+                     *
+                     * Consider tr/\xCB/\X{E000}/.  The maximum expansion
+                     * factor is 1 byte going to 3 if the target string is not
+                     * UTF-8, but 2 bytes going to 3 if it is in UTF-8.  We
+                     * could pass two different values so doop could choose
+                     * based on the UTF-8ness of the target.  But khw thinks
+                     * (perhaps wrongly) that is overkill.  It is used only to
+                     * make sure we malloc enough space.
+                     *
+                     * If no target string can force the result to be UTF-8,
+                     * then we don't have to worry about the case of the target
+                     * string not being UTF-8 */
+                    NV t_size = (can_force_utf8 && t_cp < 256)
+                                ? 1
+                                : CP_SKIP(t_cp_end);
+                    NV ratio = CP_SKIP(r_cp_end) / t_size;
 
-Constructs, checks, and returns an op of method type with a method name
-evaluated at runtime.  C<type> is the opcode.  C<flags> gives the eight
-bits of C<op_flags>, except that C<OPf_KIDS> will be set automatically,
-and, shifted up eight bits, the eight bits of C<op_private>, except that
-the bit with value 1 is automatically set.  C<dynamic_meth> supplies an
-op which evaluates method name; it is consumed by this function and
-become part of the constructed op tree.
-Supported optypes: C<OP_METHOD>.
+                    o->op_private |= OPpTRANS_GROWS;
 
-=cut
-*/
+                    /* Now that we know it grows, we can keep track of the
+                     * largest ratio */
+                    if (ratio > max_expansion) {
+                        max_expansion = ratio;
+                        DEBUG_y(PerlIO_printf(Perl_debug_log,
+                                        "New expansion factor: %" NVgf "\n",
+                                        max_expansion));
+                    }
+                }
 
-static OP*
-S_newMETHOP_internal(pTHX_ I32 type, I32 flags, OP* dynamic_meth, SV* const_meth) {
-    METHOP *methop;
+                /* The very first range is marked as adjacent to the
+                 * non-existent range below it, as it causes things to "just
+                 * work" (TradeMark)
+                 *
+                 * If the lowest code point in this chunk is M, it adjoins the
+                 * J-L range */
+                if (t_cp == t_array[i]) {
+                    adjacent_to_range_below = TRUE;
 
-    assert((PL_opargs[type] & OA_CLASS_MASK) == OA_METHOP
-        || type == OP_CUSTOM);
-
-    NewOp(1101, methop, 1, METHOP);
-    if (dynamic_meth) {
-        if (PL_opargs[type] & OA_MARK) dynamic_meth = force_list(dynamic_meth, TRUE);
-        methop->op_flags = (U8)(flags | OPf_KIDS);
-        methop->op_u.op_first = dynamic_meth;
-        methop->op_private = (U8)(1 | (flags >> 8));
-
-        if (!OpHAS_SIBLING(dynamic_meth))
-            OpLASTSIB_set(dynamic_meth, (OP*)methop);
-    }
-    else {
-        assert(const_meth);
-        methop->op_flags = (U8)(flags & ~OPf_KIDS);
-        methop->op_u.op_meth_sv = const_meth;
-        methop->op_private = (U8)(0 | (flags >> 8));
-        methop->op_next = (OP*)methop;
-    }
-
-#ifdef USE_ITHREADS
-    methop->op_rclass_targ = 0;
-#else
-    methop->op_rclass_sv = NULL;
-#endif
-
-    OpTYPE_set(methop, type);
-    return CHECKOP(type, methop);
-}
-
-OP *
-Perl_newMETHOP (pTHX_ I32 type, I32 flags, OP* dynamic_meth) {
-    PERL_ARGS_ASSERT_NEWMETHOP;
-    return newMETHOP_internal(type, flags, dynamic_meth, NULL);
-}
+                    /* And if the map has the same offset from the beginning of
+                     * the range as does this new code point (or both are for
+                     * TR_SPECIAL_HANDLING), this chunk can be completely
+                     * merged with the range below.  EXCEPT, in the first pass,
+                     * we don't merge ranges whose UTF-8 byte representations
+                     * have different lengths, so that we can more easily
+                     * detect if a replacement is longer than the source, that
+                     * is if it 'grows'.  But in the 2nd pass, there's no
+                     * reason to not merge */
+                    if (   (i > 0 && (   pass2
+                                      || CP_SKIP(t_array[i-1])
+                                                            == CP_SKIP(t_cp)))
+                        && (   (   r_cp == TR_SPECIAL_HANDLING
+                                && r_map[i-1] == TR_SPECIAL_HANDLING)
+                            || (   r_cp != TR_SPECIAL_HANDLING
+                                && r_cp - r_map[i-1] == t_cp - t_array[i-1])))
+                    {
+                        merge_with_range_below = TRUE;
+                    }
+                }
 
-/*
-=for apidoc newMETHOP_named
+                /* Similarly, if the highest code point in this chunk is 'Q',
+                 * it adjoins the range above, and if the map is suitable, can
+                 * be merged with it */
+                if (    t_cp_end >= IV_MAX - 1
+                    || (   i + 1 < len
+                        && t_cp_end + 1 == t_array[i+1]))
+                {
+                    adjacent_to_range_above = TRUE;
+                    if (i + 1 < len)
+                    if (    (   pass2
+                             || CP_SKIP(t_cp) == CP_SKIP(t_array[i+1]))
+                        && (   (   r_cp == TR_SPECIAL_HANDLING
+                                && r_map[i+1] == (UV) TR_SPECIAL_HANDLING)
+                            || (   r_cp != TR_SPECIAL_HANDLING
+                                && r_cp_end == r_map[i+1] - 1)))
+                    {
+                        merge_with_range_above = TRUE;
+                    }
+                }
 
-Constructs, checks, and returns an op of method type with a constant
-method name.  C<type> is the opcode.  C<flags> gives the eight bits of
-C<op_flags>, and, shifted up eight bits, the eight bits of
-C<op_private>.  C<const_meth> supplies a constant method name;
-it must be a shared COW string.
-Supported optypes: C<OP_METHOD_NAMED>.
+                if (merge_with_range_below && merge_with_range_above) {
 
-=cut
-*/
+                    /* Here the new chunk looks like M => m, ... Q => q; and
+                     * the range above is like R => r, ....  Thus, the [i-1]
+                     * and [i+1] ranges should be seamlessly melded so the
+                     * result looks like
+                     *
+                     * [i-1]    J   j   # J-T => j-t
+                     * [i]      U   y   # U => y, V => y+1, ...
+                     * ...
+                     * [-1]     Z  -1   # Z => default; as do Z+1, ... infinity
+                     */
+                    Move(t_array + i + 2, t_array + i, len - i - 2, UV);
+                    Move(r_map   + i + 2, r_map   + i, len - i - 2, UV);
+                    len -= 2;
+                    invlist_set_len(t_invlist,
+                                    len,
+                                    *(get_invlist_offset_addr(t_invlist)));
+                }
+                else if (merge_with_range_below) {
 
-OP *
-Perl_newMETHOP_named (pTHX_ I32 type, I32 flags, SV* const_meth) {
-    PERL_ARGS_ASSERT_NEWMETHOP_NAMED;
-    return newMETHOP_internal(type, flags, NULL, const_meth);
-}
+                    /* Here the new chunk looks like M => m, .... But either
+                     * (or both) it doesn't extend all the way up through Q; or
+                     * the range above doesn't start with R => r. */
+                    if (! adjacent_to_range_above) {
 
-/*
-=for apidoc newBINOP
+                        /* In the first case, let's say the new chunk extends
+                         * through O.  We then want:
+                         *
+                         * [i-1]    J   j   # J-O => j-o
+                         * [i]      P  -1   # P => -1, Q => -1
+                         * [i+1]    R   x   # R => x, S => x+1, T => x+2
+                         * [i+2]    U   y   # U => y, V => y+1, ...
+                         * ...
+                         * [-1]     Z  -1   # Z => default; as do Z+1, ...
+                         *                                            infinity
+                         */
+                        t_array[i] = t_cp_end + 1;
+                        r_map[i] = TR_UNLISTED;
+                    }
+                    else { /* Adjoins the range above, but can't merge with it
+                              (because 'x' is not the next map after q) */
+                        /*
+                         * [i-1]    J   j   # J-Q => j-q
+                         * [i]      R   x   # R => x, S => x+1, T => x+2
+                         * [i+1]    U   y   # U => y, V => y+1, ...
+                         * ...
+                         * [-1]     Z  -1   # Z => default; as do Z+1, ...
+                         *                                          infinity
+                         */
 
-Constructs, checks, and returns an op of any binary type.  C<type>
-is the opcode.  C<flags> gives the eight bits of C<op_flags>, except
-that C<OPf_KIDS> will be set automatically, and, shifted up eight bits,
-the eight bits of C<op_private>, except that the bit with value 1 or
-2 is automatically set as required.  C<first> and C<last> supply up to
-two ops to be the direct children of the binary op; they are consumed
-by this function and become part of the constructed op tree.
+                        Move(t_array + i + 1, t_array + i, len - i - 1, UV);
+                        Move(r_map + i + 1, r_map + i, len - i - 1, UV);
+                        len--;
+                        invlist_set_len(t_invlist, len,
+                                        *(get_invlist_offset_addr(t_invlist)));
+                    }
+                }
+                else if (merge_with_range_above) {
 
-=cut
-*/
+                    /* Here the new chunk ends with Q => q, and the range above
+                     * must start with R => r, so the two can be merged. But
+                     * either (or both) the new chunk doesn't extend all the
+                     * way down to M; or the mapping of the final code point
+                     * range below isn't m */
+                    if (! adjacent_to_range_below) {
 
-OP *
-Perl_newBINOP(pTHX_ I32 type, I32 flags, OP *first, OP *last)
-{
-    BINOP *binop;
+                        /* In the first case, let's assume the new chunk starts
+                         * with P => p.  Then, because it's merge-able with the
+                         * range above, that range must be R => r.  We want:
+                         *
+                         * [i-1]    J   j   # J-L => j-l
+                         * [i]      M  -1   # M => -1, N => -1
+                         * [i+1]    P   p   # P-T => p-t
+                         * [i+2]    U   y   # U => y, V => y+1, ...
+                         * ...
+                         * [-1]     Z  -1   # Z => default; as do Z+1, ...
+                         *                                          infinity
+                         */
+                        t_array[i+1] = t_cp;
+                        r_map[i+1] = r_cp;
+                    }
+                    else { /* Adjoins the range below, but can't merge with it
+                            */
+                        /*
+                         * [i-1]    J   j   # J-L => j-l
+                         * [i]      M   x   # M-T => x-5 .. x+2
+                         * [i+1]    U   y   # U => y, V => y+1, ...
+                         * ...
+                         * [-1]     Z  -1   # Z => default; as do Z+1, ...
+                         *                                          infinity
+                         */
+                        Move(t_array + i + 1, t_array + i, len - i - 1, UV);
+                        Move(r_map   + i + 1, r_map   + i, len - i - 1, UV);
+                        len--;
+                        t_array[i] = t_cp;
+                        r_map[i] = r_cp;
+                        invlist_set_len(t_invlist, len,
+                                        *(get_invlist_offset_addr(t_invlist)));
+                    }
+                }
+                else if (adjacent_to_range_below && adjacent_to_range_above) {
+                    /* The new chunk completely fills the gap between the
+                     * ranges on either side, but can't merge with either of
+                     * them.
+                     *
+                     * [i-1]    J   j   # J-L => j-l
+                     * [i]      M   z   # M => z, N => z+1 ... Q => z+4
+                     * [i+1]    R   x   # R => x, S => x+1, T => x+2
+                     * [i+2]    U   y   # U => y, V => y+1, ...
+                     * ...
+                     * [-1]     Z  -1   # Z => default; as do Z+1, ... infinity
+                     */
+                    r_map[i] = r_cp;
+                }
+                else if (adjacent_to_range_below) {
+                    /* The new chunk adjoins the range below, but not the range
+                     * above, and can't merge.  Let's assume the chunk ends at
+                     * O.
+                     *
+                     * [i-1]    J   j   # J-L => j-l
+                     * [i]      M   z   # M => z, N => z+1, O => z+2
+                     * [i+1]    P   -1  # P => -1, Q => -1
+                     * [i+2]    R   x   # R => x, S => x+1, T => x+2
+                     * [i+3]    U   y   # U => y, V => y+1, ...
+                     * ...
+                     * [-w]     Z  -1   # Z => default; as do Z+1, ... infinity
+                     */
+                    invlist_extend(t_invlist, len + 1);
+                    t_array = invlist_array(t_invlist);
+                    Renew(r_map, len + 1, UV);
 
-    ASSUME((PL_opargs[type] & OA_CLASS_MASK) == OA_BINOP
-        || type == OP_NULL || type == OP_CUSTOM);
+                    Move(t_array + i + 1, t_array + i + 2, len - i - 1, UV);
+                    Move(r_map + i + 1,   r_map   + i + 2, len - i - 1, UV);
+                    r_map[i] = r_cp;
+                    t_array[i+1] = t_cp_end + 1;
+                    r_map[i+1] = TR_UNLISTED;
+                    len++;
+                    invlist_set_len(t_invlist, len,
+                                    *(get_invlist_offset_addr(t_invlist)));
+                }
+                else if (adjacent_to_range_above) {
+                    /* The new chunk adjoins the range above, but not the range
+                     * below, and can't merge.  Let's assume the new chunk
+                     * starts at O
+                     *
+                     * [i-1]    J   j   # J-L => j-l
+                     * [i]      M  -1   # M => default, N => default
+                     * [i+1]    O   z   # O => z, P => z+1, Q => z+2
+                     * [i+2]    R   x   # R => x, S => x+1, T => x+2
+                     * [i+3]    U   y   # U => y, V => y+1, ...
+                     * ...
+                     * [-1]     Z  -1   # Z => default; as do Z+1, ... infinity
+                     */
+                    invlist_extend(t_invlist, len + 1);
+                    t_array = invlist_array(t_invlist);
+                    Renew(r_map, len + 1, UV);
 
-    NewOp(1101, binop, 1, BINOP);
+                    Move(t_array + i + 1, t_array + i + 2, len - i - 1, UV);
+                    Move(r_map   + i + 1, r_map   + i + 2, len - i - 1, UV);
+                    t_array[i+1] = t_cp;
+                    r_map[i+1] = r_cp;
+                    len++;
+                    invlist_set_len(t_invlist, len,
+                                    *(get_invlist_offset_addr(t_invlist)));
+                }
+                else {
+                    /* The new chunk adjoins neither the range above, nor the
+                     * range below.  Lets assume it is N..P => n..p
+                     *
+                     * [i-1]    J   j   # J-L => j-l
+                     * [i]      M  -1   # M => default
+                     * [i+1]    N   n   # N..P => n..p
+                     * [i+2]    Q  -1   # Q => default
+                     * [i+3]    R   x   # R => x, S => x+1, T => x+2
+                     * [i+4]    U   y   # U => y, V => y+1, ...
+                     * ...
+                     * [-1]     Z  -1   # Z => default; as do Z+1, ... infinity
+                     */
 
-    if (!first)
-        first = newOP(OP_NULL, 0);
+                    DEBUG_yv(PerlIO_printf(Perl_debug_log,
+                                        "Before fixing up: len=%d, i=%d\n",
+                                        (int) len, (int) i));
+                    DEBUG_yv(invmap_dump(t_invlist, r_map));
 
-    OpTYPE_set(binop, type);
-    binop->op_first = first;
-    binop->op_flags = (U8)(flags | OPf_KIDS);
-    if (!last) {
-        last = first;
-        binop->op_private = (U8)(1 | (flags >> 8));
-    }
-    else {
-        binop->op_private = (U8)(2 | (flags >> 8));
-        OpMORESIB_set(first, last);
-    }
+                    invlist_extend(t_invlist, len + 2);
+                    t_array = invlist_array(t_invlist);
+                    Renew(r_map, len + 2, UV);
 
-    if (!OpHAS_SIBLING(last)) /* true unless weird syntax error */
-        OpLASTSIB_set(last, (OP*)binop);
+                    Move(t_array + i + 1,
+                         t_array + i + 2 + 1, len - i - (2 - 1), UV);
+                    Move(r_map   + i + 1,
+                         r_map   + i + 2 + 1, len - i - (2 - 1), UV);
 
-    binop->op_last = OpSIBLING(binop->op_first);
-    if (binop->op_last)
-        OpLASTSIB_set(binop->op_last, (OP*)binop);
+                    len += 2;
+                    invlist_set_len(t_invlist, len,
+                                    *(get_invlist_offset_addr(t_invlist)));
 
-    binop = (BINOP*)CHECKOP(type, binop);
-    if (binop->op_next || binop->op_type != (OPCODE)type)
-        return (OP*)binop;
+                    t_array[i+1] = t_cp;
+                    r_map[i+1] = r_cp;
 
-    return fold_constants(op_integerize(op_std_init((OP *)binop)));
-}
+                    t_array[i+2] = t_cp_end + 1;
+                    r_map[i+2] = TR_UNLISTED;
+                }
+                DEBUG_yv(PerlIO_printf(Perl_debug_log,
+                          "After iteration: span=%" UVuf ", t_range_count=%"
+                          UVuf " r_range_count=%" UVuf "\n",
+                          span, t_range_count, r_range_count));
+                DEBUG_yv(invmap_dump(t_invlist, r_map));
+            } /* End of this chunk needs to be processed */
 
-void
-Perl_invmap_dump(pTHX_ SV* invlist, UV *map)
-{
-    const char indent[] = "    ";
+            /* Done with this chunk. */
+            t_cp += span;
+            if (t_cp >= IV_MAX) {
+                break;
+            }
+            t_range_count -= span;
+            if (r_cp != TR_SPECIAL_HANDLING) {
+                r_cp += span;
+                r_range_count -= span;
+            }
+            else {
+                r_range_count = 0;
+            }
 
-    UV len = _invlist_len(invlist);
-    UV * array = invlist_array(invlist);
-    UV i;
+        } /* End of loop through the search list */
 
-    PERL_ARGS_ASSERT_INVMAP_DUMP;
+        /* We don't need an exact count, but we do need to know if there is
+         * anything left over in the replacement list.  So, just assume it's
+         * one byte per character */
+        if (rend > r) {
+            r_count++;
+        }
+    } /* End of passes */
 
-    for (i = 0; i < len; i++) {
-        UV start = array[i];
-        UV end   = (i + 1 < len) ? array[i+1] - 1 : IV_MAX;
+    SvREFCNT_dec(inverted_tstr);
 
-        PerlIO_printf(Perl_debug_log, "%s[%" UVuf "] 0x%04" UVXf, indent, i, start);
-        if (end == IV_MAX) {
-            PerlIO_printf(Perl_debug_log, " .. INFTY");
-        }
-        else if (end != start) {
-            PerlIO_printf(Perl_debug_log, " .. 0x%04" UVXf, end);
-        }
-        else {
-            PerlIO_printf(Perl_debug_log, "            ");
-        }
+    DEBUG_y(PerlIO_printf(Perl_debug_log, "After everything: \n"));
+    DEBUG_y(invmap_dump(t_invlist, r_map));
 
-        PerlIO_printf(Perl_debug_log, "\t");
+    /* We now have normalized the input into an inversion map.
+     *
+     * See if the lhs and rhs are equivalent.  If so, this tr/// is a no-op
+     * except for the count, and streamlined runtime code can be used */
+    if (!del && !squash) {
 
-        if (map[i] == TR_UNLISTED) {
-            PerlIO_printf(Perl_debug_log, "TR_UNLISTED\n");
-        }
-        else if (map[i] == TR_SPECIAL_HANDLING) {
-            PerlIO_printf(Perl_debug_log, "TR_SPECIAL_HANDLING\n");
-        }
-        else {
-            PerlIO_printf(Perl_debug_log, "0x%04" UVXf "\n", map[i]);
+        /* They are identical if they point to the same address, or if
+         * everything maps to UNLISTED or to itself.  This catches things that
+         * not looking at the normalized inversion map doesn't catch, like
+         * tr/aa/ab/ or tr/\x{100}-\x{104}/\x{100}-\x{102}\x{103}-\x{104}  */
+        if (r0 != t0) {
+            for (i = 0; i < len; i++) {
+                if (r_map[i] != TR_UNLISTED && r_map[i] != t_array[i]) {
+                    goto done_identical_check;
+                }
+            }
         }
+
+        /* Here have gone through entire list, and didn't find any
+         * non-identical mappings */
+        o->op_private |= OPpTRANS_IDENTICAL;
+
+      done_identical_check: ;
     }
-}
 
-/* Given an OP_TRANS / OP_TRANSR op o, plus OP_CONST ops expr and repl
- * containing the search and replacement strings, assemble into
- * a translation table attached as o->op_pv.
- * Free expr and repl.
- * It expects the toker to have already set the
- *   OPpTRANS_COMPLEMENT
- *   OPpTRANS_SQUASH
- *   OPpTRANS_DELETE
- * flags as appropriate; this function may add
- *   OPpTRANS_USE_SVOP
- *   OPpTRANS_CAN_FORCE_UTF8
- *   OPpTRANS_IDENTICAL
- *   OPpTRANS_GROWS
- * flags
- */
+    t_array = invlist_array(t_invlist);
 
-static OP *
-S_pmtrans(pTHX_ OP *o, OP *expr, OP *repl)
-{
-    /* This function compiles a tr///, from data gathered from toke.c, into a
-     * form suitable for use by do_trans() in doop.c at runtime.
-     *
-     * It first normalizes the data, while discarding extraneous inputs; then
-     * writes out the compiled data.  The normalization allows for complete
-     * analysis, and avoids some false negatives and positives earlier versions
-     * of this code had.
-     *
-     * The normalization form is an inversion map (described below in detail).
-     * This is essentially the compiled form for tr///'s that require UTF-8,
-     * and its easy to use it to write the 257-byte table for tr///'s that
-     * don't need UTF-8.  That table is identical to what's been in use for
-     * many perl versions, except that it doesn't handle some edge cases that
-     * it used to, involving code points above 255.  The UTF-8 form now handles
-     * these.  (This could be changed with extra coding should it shown to be
-     * desirable.)
-     *
-     * If the complement (/c) option is specified, the lhs string (tstr) is
-     * parsed into an inversion list.  Complementing these is trivial.  Then a
-     * complemented tstr is built from that, and used thenceforth.  This hides
-     * the fact that it was complemented from almost all successive code.
-     *
-     * One of the important characteristics to know about the input is whether
-     * the transliteration may be done in place, or does a temporary need to be
-     * allocated, then copied.  If the replacement for every character in every
-     * possible string takes up no more bytes than the character it
-     * replaces, then it can be edited in place.  Otherwise the replacement
-     * could overwrite a byte we are about to read, depending on the strings
-     * being processed.  The comments and variable names here refer to this as
-     * "growing".  Some inputs won't grow, and might even shrink under /d, but
-     * some inputs could grow, so we have to assume any given one might grow.
-     * On very long inputs, the temporary could eat up a lot of memory, so we
-     * want to avoid it if possible.  For non-UTF-8 inputs, everything is
-     * single-byte, so can be edited in place, unless there is something in the
-     * pattern that could force it into UTF-8.  The inversion map makes it
-     * feasible to determine this.  Previous versions of this code pretty much
-     * punted on determining if UTF-8 could be edited in place.  Now, this code
-     * is rigorous in making that determination.
-     *
-     * Another characteristic we need to know is whether the lhs and rhs are
-     * identical.  If so, and no other flags are present, the only effect of
-     * the tr/// is to count the characters present in the input that are
-     * mentioned in the lhs string.  The implementation of that is easier and
-     * runs faster than the more general case.  Normalizing here allows for
-     * accurate determination of this.  Previously there were false negatives
-     * possible.
-     *
-     * Instead of 'transliterated', the comments here use 'unmapped' for the
-     * characters that are left unchanged by the operation; otherwise they are
-     * 'mapped'
-     *
-     * The lhs of the tr/// is here referred to as the t side.
-     * The rhs of the tr/// is here referred to as the r side.
-     */
+    /* If has components above 255, we generally need to use the inversion map
+     * implementation */
+    if (   can_force_utf8
+        || (   len > 0
+            && t_array[len-1] > 255
+                 /* If the final range is 0x100-INFINITY and is a special
+                  * mapping, the table implementation can handle it */
+            && ! (   t_array[len-1] == 256
+                  && (   r_map[len-1] == TR_UNLISTED
+                      || r_map[len-1] == TR_SPECIAL_HANDLING))))
+    {
+        SV* r_map_sv;
+        SV* temp_sv;
 
-    SV * const tstr = ((SVOP*)expr)->op_sv;
-    SV * const rstr = ((SVOP*)repl)->op_sv;
-    STRLEN tlen;
-    STRLEN rlen;
-    const U8 * t0 = (U8*)SvPV_const(tstr, tlen);
-    const U8 * r0 = (U8*)SvPV_const(rstr, rlen);
-    const U8 * t = t0;
-    const U8 * r = r0;
-    UV t_count = 0, r_count = 0;  /* Number of characters in search and
-                                         replacement lists */
+        /* A UTF-8 op is generated, indicated by this flag.  This op is an
+         * sv_op */
+        o->op_private |= OPpTRANS_USE_SVOP;
 
-    /* khw thinks some of the private flags for this op are quaintly named.
-     * OPpTRANS_GROWS for example is TRUE if the replacement for some lhs
-     * character when represented in UTF-8 is longer than the original
-     * character's UTF-8 representation */
-    const bool complement = cBOOL(o->op_private & OPpTRANS_COMPLEMENT);
-    const bool squash     = cBOOL(o->op_private & OPpTRANS_SQUASH);
-    const bool del        = cBOOL(o->op_private & OPpTRANS_DELETE);
+        if (can_force_utf8) {
+            o->op_private |= OPpTRANS_CAN_FORCE_UTF8;
+        }
 
-    /* Set to true if there is some character < 256 in the lhs that maps to
-     * above 255.  If so, a non-UTF-8 match string can be forced into being in
-     * UTF-8 by a tr/// operation. */
-    bool can_force_utf8 = FALSE;
+        /* The inversion map is pushed; first the list. */
+        invmap = MUTABLE_AV(newAV());
 
-    /* What is the maximum expansion factor in UTF-8 transliterations.  If a
-     * 2-byte UTF-8 encoded character is to be replaced by a 3-byte one, its
-     * expansion factor is 1.5.  This number is used at runtime to calculate
-     * how much space to allocate for non-inplace transliterations.  Without
-     * this number, the worst case is 14, which is extremely unlikely to happen
-     * in real life, and could require significant memory overhead. */
-    NV max_expansion = 1.;
+        SvREADONLY_on(t_invlist);
+        av_push(invmap, t_invlist);
 
-    UV t_range_count, r_range_count, min_range_count;
-    UV* t_array;
-    SV* t_invlist;
-    UV* r_map;
-    UV r_cp = 0, t_cp = 0;
-    UV t_cp_end = (UV) -1;
-    UV r_cp_end;
-    Size_t len;
-    AV* invmap;
-    UV final_map = TR_UNLISTED;    /* The final character in the replacement
-                                      list, updated as we go along.  Initialize
-                                      to something illegal */
+        /* 2nd is the mapping */
+        r_map_sv = newSVpvn((char *) r_map, len * sizeof(UV));
+        SvREADONLY_on(r_map_sv);
+        av_push(invmap, r_map_sv);
 
-    bool rstr_utf8 = cBOOL(SvUTF8(rstr));
-    bool tstr_utf8 = cBOOL(SvUTF8(tstr));
+        /* 3rd is the max possible expansion factor */
+        temp_sv = newSVnv(max_expansion);
+        SvREADONLY_on(temp_sv);
+        av_push(invmap, temp_sv);
 
-    const U8* tend = t + tlen;
-    const U8* rend = r + rlen;
+        /* Characters that are in the search list, but not in the replacement
+         * list are mapped to the final character in the replacement list */
+        if (! del && r_count < t_count) {
+            temp_sv = newSVuv(final_map);
+            SvREADONLY_on(temp_sv);
+            av_push(invmap, temp_sv);
+        }
 
-    SV * inverted_tstr = NULL;
+#ifdef USE_ITHREADS
+        cPADOPo->op_padix = pad_alloc(OP_TRANS, SVf_READONLY);
+        SvREFCNT_dec(PAD_SVl(cPADOPo->op_padix));
+        PAD_SETSV(cPADOPo->op_padix, (SV *) invmap);
+        SvPADTMP_on(invmap);
+        SvREADONLY_on(invmap);
+#else
+        cSVOPo->op_sv = (SV *) invmap;
+#endif
 
-    Size_t i;
-    unsigned int pass2;
+    }
+    else {
+        OPtrans_map *tbl;
+        unsigned short i;
 
-    /* This routine implements detection of a transliteration having a longer
-     * UTF-8 representation than its source, by partitioning all the possible
-     * code points of the platform into equivalence classes of the same UTF-8
-     * byte length in the first pass.  As it constructs the mappings, it carves
-     * these up into smaller chunks, but doesn't merge any together.  This
-     * makes it easy to find the instances it's looking for.  A second pass is
-     * done after this has been determined which merges things together to
-     * shrink the table for runtime.  The table below is used for both ASCII
-     * and EBCDIC platforms.  On EBCDIC, the byte length is not monotonically
-     * increasing for code points below 256.  To correct for that, the macro
-     * CP_ADJUST defined below converts those code points to ASCII in the first
-     * pass, and we use the ASCII partition values.  That works because the
-     * growth factor will be unaffected, which is all that is calculated during
-     * the first pass. */
-    UV PL_partition_by_byte_length[] = {
-        0,
-        0x80,   /* Below this is 1 byte representations */
-        (32 * (1UL << (    UTF_ACCUMULATION_SHIFT))),   /* 2 bytes below this */
-        (16 * (1UL << (2 * UTF_ACCUMULATION_SHIFT))),   /* 3 bytes below this */
-        ( 8 * (1UL << (3 * UTF_ACCUMULATION_SHIFT))),   /* 4 bytes below this */
-        ( 4 * (1UL << (4 * UTF_ACCUMULATION_SHIFT))),   /* 5 bytes below this */
-        ( 2 * (1UL << (5 * UTF_ACCUMULATION_SHIFT)))    /* 6 bytes below this */
+        /* The OPtrans_map struct already contains one slot; hence the -1. */
+        SSize_t struct_size = sizeof(OPtrans_map)
+                            + (256 - 1 + 1)*sizeof(short);
 
-#  ifdef UV_IS_QUAD
-                                                    ,
-        ( ((UV) 1U << (6 * UTF_ACCUMULATION_SHIFT)))    /* 7 bytes below this */
-#  endif
+        /* Non-utf8 case: set o->op_pv to point to a simple 256+ entry lookup
+         * table. Entries with the value TR_UNMAPPED indicate chars not to be
+         * translated, while TR_DELETE indicates a search char without a
+         * corresponding replacement char under /d.
+         *
+         * In addition, an extra slot at the end is used to store the final
+         * repeating char, or TR_R_EMPTY under an empty replacement list, or
+         * TR_DELETE under /d; which makes the runtime code easier. */
 
-    };
+        /* Indicate this is an op_pv */
+        o->op_private &= ~OPpTRANS_USE_SVOP;
 
-    PERL_ARGS_ASSERT_PMTRANS;
+        tbl = (OPtrans_map*)PerlMemShared_calloc(struct_size, 1);
+        tbl->size = 256;
+        cPVOPo->op_pv = (char*)tbl;
 
-    PL_hints |= HINT_BLOCK_SCOPE;
+        for (i = 0; i < len; i++) {
+            STATIC_ASSERT_DECL(TR_SPECIAL_HANDLING == TR_DELETE);
+            short upper = i >= len - 1 ? 256 : (short) t_array[i+1];
+            short to = (short) r_map[i];
+            short j;
+            bool do_increment = TRUE;
 
-    /* If /c, the search list is sorted and complemented.  This is now done by
-     * creating an inversion list from it, and then trivially inverting that.
-     * The previous implementation used qsort, but creating the list
-     * automatically keeps it sorted as we go along */
-    if (complement) {
-        UV start, end;
-        SV * inverted_tlist = _new_invlist(tlen);
-        Size_t temp_len;
+            /* Any code points above our limit should be irrelevant */
+            if (t_array[i] >= tbl->size) break;
 
-        DEBUG_y(PerlIO_printf(Perl_debug_log,
-                    "%s: %d: tstr before inversion=\n%s\n",
-                    __FILE__, __LINE__, _byte_dump_string(t, tend - t, 0)));
+            /* Set up the map */
+            if (to == (short) TR_SPECIAL_HANDLING && ! del) {
+                to = (short) final_map;
+                do_increment = FALSE;
+            }
+            else if (to < 0) {
+                do_increment = FALSE;
+            }
 
-        while (t < tend) {
+            /* Create a map for everything in this range.  The value increases
+             * except for the special cases */
+            for (j = (short) t_array[i]; j < upper; j++) {
+                tbl->map[j] = to;
+                if (do_increment) to++;
+            }
+        }
 
-            /* Non-utf8 strings don't have ranges, so each character is listed
-             * out */
-            if (! tstr_utf8) {
-                inverted_tlist = add_cp_to_invlist(inverted_tlist, *t);
-                t++;
+        tbl->map[tbl->size] = del
+                              ? (short) TR_DELETE
+                              : (short) rlen
+                                ? (short) final_map
+                                : (short) TR_R_EMPTY;
+        DEBUG_y(PerlIO_printf(Perl_debug_log,"%s: %d\n", __FILE__, __LINE__));
+        for (i = 0; i < tbl->size; i++) {
+            if (tbl->map[i] < 0) {
+                DEBUG_y(PerlIO_printf(Perl_debug_log," %02x=>%d",
+                                                (unsigned) i, tbl->map[i]));
             }
-            else {  /* But UTF-8 strings have been parsed in toke.c to have
-                 * ranges if appropriate. */
-                UV t_cp;
-                Size_t t_char_len;
+            else {
+                DEBUG_y(PerlIO_printf(Perl_debug_log," %02x=>%02x",
+                                                (unsigned) i, tbl->map[i]));
+            }
+            if ((i+1) % 8 == 0 || i + 1 == (short) tbl->size) {
+                DEBUG_y(PerlIO_printf(Perl_debug_log,"\n"));
+            }
+        }
+        DEBUG_y(PerlIO_printf(Perl_debug_log,"Final map 0x%x=>%02x\n",
+                                (unsigned) tbl->size, tbl->map[tbl->size]));
 
-                /* Get the first character */
-                t_cp = valid_utf8_to_uvchr(t, &t_char_len);
-                t += t_char_len;
+        SvREFCNT_dec(t_invlist);
 
-                /* If the next byte indicates that this wasn't the first
-                 * element of a range, the range is just this one */
-                if (t >= tend || *t != RANGE_INDICATOR) {
-                    inverted_tlist = add_cp_to_invlist(inverted_tlist, t_cp);
-                }
-                else { /* Otherwise, ignore the indicator byte, and get the
-                          final element, and add the whole range */
-                    t++;
-                    t_cp_end = valid_utf8_to_uvchr(t, &t_char_len);
-                    t += t_char_len;
+#if 0   /* code that added excess above-255 chars at the end of the table, in
+           case we ever want to not use the inversion map implementation for
+           this */
 
-                    inverted_tlist = _add_range_to_invlist(inverted_tlist,
-                                                      t_cp, t_cp_end);
-                }
-            }
-        } /* End of parse through tstr */
+        ASSUME(j <= rlen);
+        excess = rlen - j;
 
-        /* The inversion list is done; now invert it */
-        _invlist_invert(inverted_tlist);
+        if (excess) {
+            /* More replacement chars than search chars:
+             * store excess replacement chars at end of main table.
+             */
 
-        /* Now go through the inverted list and create a new tstr for the rest
-         * of the routine to use.  Since the UTF-8 version can have ranges, and
-         * can be much more compact than the non-UTF-8 version, we create the
-         * string in UTF-8 even if not necessary.  (This is just an intermediate
-         * value that gets thrown away anyway.) */
-        invlist_iterinit(inverted_tlist);
-        inverted_tstr = newSVpvs("");
-        while (invlist_iternext(inverted_tlist, &start, &end)) {
-            U8 temp[UTF8_MAXBYTES];
-            U8 * temp_end_pos;
+            struct_size += excess;
+            tbl = (OPtrans_map*)PerlMemShared_realloc(tbl,
+                        struct_size + excess * sizeof(short));
+            tbl->size += excess;
+            cPVOPo->op_pv = (char*)tbl;
 
-            /* IV_MAX keeps things from going out of bounds */
-            start = MIN(IV_MAX, start);
-            end   = MIN(IV_MAX, end);
+            for (i = 0; i < excess; i++)
+                tbl->map[i + 256] = r[j+i];
+        }
+        else {
+            /* no more replacement chars than search chars */
+        }
+#endif
 
-            temp_end_pos = uvchr_to_utf8(temp, start);
-            sv_catpvn(inverted_tstr, (char *) temp, temp_end_pos - temp);
+    }
 
-            if (start != end) {
-                Perl_sv_catpvf(aTHX_ inverted_tstr, "%c", RANGE_INDICATOR);
-                temp_end_pos = uvchr_to_utf8(temp, end);
-                sv_catpvn(inverted_tstr, (char *) temp, temp_end_pos - temp);
-            }
-        }
+    DEBUG_y(PerlIO_printf(Perl_debug_log,
+            "/d=%d, /s=%d, /c=%d, identical=%d, grows=%d,"
+            " use_svop=%d, can_force_utf8=%d,\nexpansion=%" NVgf "\n",
+            del, squash, complement,
+            cBOOL(o->op_private & OPpTRANS_IDENTICAL),
+            cBOOL(o->op_private & OPpTRANS_USE_SVOP),
+            cBOOL(o->op_private & OPpTRANS_GROWS),
+            cBOOL(o->op_private & OPpTRANS_CAN_FORCE_UTF8),
+            max_expansion));
 
-        /* Set up so the remainder of the routine uses this complement, instead
-         * of the actual input */
-        t0 = t = (U8*)SvPV_const(inverted_tstr, temp_len);
-        tend = t0 + temp_len;
-        tstr_utf8 = TRUE;
+    Safefree(r_map);
 
-        SvREFCNT_dec_NN(inverted_tlist);
+    if(del && rlen != 0 && r_count == t_count) {
+        Perl_ck_warner(aTHX_ packWARN(WARN_MISC), "Useless use of /d modifier in transliteration operator");
+    } else if(r_count > t_count) {
+        Perl_ck_warner(aTHX_ packWARN(WARN_MISC), "Replacement list is longer than search list");
     }
 
-    /* For non-/d, an empty rhs means to use the lhs */
-    if (rlen == 0 && ! del) {
-        r0 = t0;
-        rend = tend;
-        rstr_utf8  = tstr_utf8;
-    }
+    op_free(expr);
+    op_free(repl);
 
-    t_invlist = _new_invlist(1);
+    return o;
+}
 
-    /* Initialize to a single range */
-    t_invlist = _add_range_to_invlist(t_invlist, 0, UV_MAX);
 
-    /* For the first pass, the lhs is partitioned such that the
-     * number of UTF-8 bytes required to represent a code point in each
-     * partition is the same as the number for any other code point in
-     * that partion.  We copy the pre-compiled partion. */
-    len = C_ARRAY_LENGTH(PL_partition_by_byte_length);
-    invlist_extend(t_invlist, len);
-    t_array = invlist_array(t_invlist);
-    Copy(PL_partition_by_byte_length, t_array, len, UV);
-    invlist_set_len(t_invlist, len, *(get_invlist_offset_addr(t_invlist)));
-    Newx(r_map, len + 1, UV);
+/*
+=for apidoc newPMOP
 
-    /* Parse the (potentially adjusted) input, creating the inversion map.
-     * This is done in two passes.  The first pass is to determine if the
-     * transliteration can be done in place.  The inversion map it creates
-     * could be used, but generally would be larger and slower to run than the
-     * output of the second pass, which starts with a more compact table and
-     * allows more ranges to be merged */
-    for (pass2 = 0; pass2 < 2; pass2++) {
-        if (pass2) {
-            /* Initialize to a single range */
-            t_invlist = _add_range_to_invlist(t_invlist, 0, UV_MAX);
-
-            /* In the second pass, we just have the single range */
-            len = 1;
-            t_array = invlist_array(t_invlist);
-        }
-
-/* As noted earlier, we convert EBCDIC code points to Unicode in the first pass
- * so as to get the well-behaved length 1 vs length 2 boundary.  Only code
- * points below 256 differ between the two character sets in this regard.  For
- * these, we also can't have any ranges, as they have to be individually
- * converted. */
-#ifdef EBCDIC
-#  define CP_ADJUST(x)          ((pass2) ? (x) : NATIVE_TO_UNI(x))
-#  define FORCE_RANGE_LEN_1(x)  ((pass2) ? 0 : ((x) < 256))
-#  define CP_SKIP(x)            ((pass2) ? UVCHR_SKIP(x) : OFFUNISKIP(x))
-#else
-#  define CP_ADJUST(x)          (x)
-#  define FORCE_RANGE_LEN_1(x)  0
-#  define CP_SKIP(x)            UVCHR_SKIP(x)
-#endif
+Constructs, checks, and returns an op of any pattern matching type.
+C<type> is the opcode.  C<flags> gives the eight bits of C<op_flags>
+and, shifted up eight bits, the eight bits of C<op_private>.
 
-        /* And the mapping of each of the ranges is initialized.  Initially,
-         * everything is TR_UNLISTED. */
-        for (i = 0; i < len; i++) {
-            r_map[i] = TR_UNLISTED;
-        }
+=cut
+*/
 
-        t = t0;
-        t_count = 0;
-        r = r0;
-        r_count = 0;
-        t_range_count = r_range_count = 0;
+OP *
+Perl_newPMOP(pTHX_ I32 type, I32 flags)
+{
+    PMOP *pmop;
 
-        DEBUG_y(PerlIO_printf(Perl_debug_log, "%s: %d:\ntstr=%s\n",
-                    __FILE__, __LINE__, _byte_dump_string(t, tend - t, 0)));
-        DEBUG_y(PerlIO_printf(Perl_debug_log, "rstr=%s\n",
-                                        _byte_dump_string(r, rend - r, 0)));
-        DEBUG_y(PerlIO_printf(Perl_debug_log, "/c=%d; /s=%d; /d=%d\n",
-                                                  complement, squash, del));
-        DEBUG_y(invmap_dump(t_invlist, r_map));
+    assert((PL_opargs[type] & OA_CLASS_MASK) == OA_PMOP
+        || type == OP_CUSTOM);
 
-        /* Now go through the search list constructing an inversion map.  The
-         * input is not necessarily in any particular order.  Making it an
-         * inversion map orders it, potentially simplifying, and makes it easy
-         * to deal with at run time.  This is the only place in core that
-         * generates an inversion map; if others were introduced, it might be
-         * better to create general purpose routines to handle them.
-         * (Inversion maps are created in perl in other places.)
-         *
-         * An inversion map consists of two parallel arrays.  One is
-         * essentially an inversion list: an ordered list of code points such
-         * that each element gives the first code point of a range of
-         * consecutive code points that map to the element in the other array
-         * that has the same index as this one (in other words, the
-         * corresponding element).  Thus the range extends up to (but not
-         * including) the code point given by the next higher element.  In a
-         * true inversion map, the corresponding element in the other array
-         * gives the mapping of the first code point in the range, with the
-         * understanding that the next higher code point in the inversion
-         * list's range will map to the next higher code point in the map.
-         *
-         * So if at element [i], let's say we have:
-         *
-         *     t_invlist  r_map
-         * [i]    A         a
-         *
-         * This means that A => a, B => b, C => c....  Let's say that the
-         * situation is such that:
-         *
-         * [i+1]  L        -1
-         *
-         * This means the sequence that started at [i] stops at K => k.  This
-         * illustrates that you need to look at the next element to find where
-         * a sequence stops.  Except, the highest element in the inversion list
-         * begins a range that is understood to extend to the platform's
-         * infinity.
-         *
-         * This routine modifies traditional inversion maps to reserve two
-         * mappings:
-         *
-         *  TR_UNLISTED (or -1) indicates that no code point in the range
-         *      is listed in the tr/// searchlist.  At runtime, these are
-         *      always passed through unchanged.  In the inversion map, all
-         *      points in the range are mapped to -1, instead of increasing,
-         *      like the 'L' in the example above.
-         *
-         *      We start the parse with every code point mapped to this, and as
-         *      we parse and find ones that are listed in the search list, we
-         *      carve out ranges as we go along that override that.
-         *
-         *  TR_SPECIAL_HANDLING (or -2) indicates that every code point in the
-         *      range needs special handling.  Again, all code points in the
-         *      range are mapped to -2, instead of increasing.
-         *
-         *      Under /d this value means the code point should be deleted from
-         *      the transliteration when encountered.
-         *
-         *      Otherwise, it marks that every code point in the range is to
-         *      map to the final character in the replacement list.  This
-         *      happens only when the replacement list is shorter than the
-         *      search one, so there are things in the search list that have no
-         *      correspondence in the replacement list.  For example, in
-         *      tr/a-z/A/, 'A' is the final value, and the inversion map
-         *      generated for this would be like this:
-         *          \0  =>  -1
-         *          a   =>   A
-         *          b-z =>  -2
-         *          z+1 =>  -1
-         *      'A' appears once, then the remainder of the range maps to -2.
-         *      The use of -2 isn't strictly necessary, as an inversion map is
-         *      capable of representing this situation, but not nearly so
-         *      compactly, and this is actually quite commonly encountered.
-         *      Indeed, the original design of this code used a full inversion
-         *      map for this.  But things like
-         *          tr/\0-\x{FFFF}/A/
-         *      generated huge data structures, slowly, and the execution was
-         *      also slow.  So the current scheme was implemented.
-         *
-         *  So, if the next element in our example is:
-         *
-         * [i+2]  Q        q
-         *
-         * Then all of L, M, N, O, and P map to TR_UNLISTED.  If the next
-         * elements are
-         *
-         * [i+3]  R        z
-         * [i+4]  S       TR_UNLISTED
-         *
-         * Then Q => q; R => z; and S => TR_UNLISTED.  If [i+4] (the 'S') is
-         * the final element in the arrays, every code point from S to infinity
-         * maps to TR_UNLISTED.
-         *
-         */
-                           /* Finish up range started in what otherwise would
-                            * have been the final iteration */
-        while (t < tend || t_range_count > 0) {
-            bool adjacent_to_range_above = FALSE;
-            bool adjacent_to_range_below = FALSE;
+    NewOp(1101, pmop, 1, PMOP);
+    OpTYPE_set(pmop, type);
+    pmop->op_flags = (U8)flags;
+    pmop->op_private = (U8)(0 | (flags >> 8));
+    if (PL_opargs[type] & OA_RETSCALAR)
+        scalar((OP *)pmop);
 
-            bool merge_with_range_above = FALSE;
-            bool merge_with_range_below = FALSE;
+    if (PL_hints & HINT_RE_TAINT)
+        pmop->op_pmflags |= PMf_RETAINT;
+#ifdef USE_LOCALE_CTYPE
+    if (IN_LC_COMPILETIME(LC_CTYPE)) {
+        set_regex_charset(&(pmop->op_pmflags), REGEX_LOCALE_CHARSET);
+    }
+    else
+#endif
+         if (IN_UNI_8_BIT) {
+        set_regex_charset(&(pmop->op_pmflags), REGEX_UNICODE_CHARSET);
+    }
+    if (PL_hints & HINT_RE_FLAGS) {
+        SV *reflags = Perl_refcounted_he_fetch_pvn(aTHX_
+         PL_compiling.cop_hints_hash, STR_WITH_LEN("reflags"), 0, 0
+        );
+        if (reflags && SvOK(reflags)) pmop->op_pmflags |= SvIV(reflags);
+        reflags = Perl_refcounted_he_fetch_pvn(aTHX_
+         PL_compiling.cop_hints_hash, STR_WITH_LEN("reflags_charset"), 0, 0
+        );
+        if (reflags && SvOK(reflags)) {
+            set_regex_charset(&(pmop->op_pmflags), (regex_charset)SvIV(reflags));
+        }
+    }
 
-            UV span, invmap_range_length_remaining;
-            SSize_t j;
-            Size_t i;
 
-            /* If we are in the middle of processing a range in the 'target'
-             * side, the previous iteration has set us up.  Otherwise, look at
-             * the next character in the search list */
-            if (t_range_count <= 0) {
-                if (! tstr_utf8) {
+#ifdef USE_ITHREADS
+    assert(SvPOK(PL_regex_pad[0]));
+    if (SvCUR(PL_regex_pad[0])) {
+        /* Pop off the "packed" IV from the end.  */
+        SV *const repointer_list = PL_regex_pad[0];
+        const char *p = SvEND(repointer_list) - sizeof(IV);
+        const IV offset = *((IV*)p);
 
-                    /* Here, not in the middle of a range, and not UTF-8.  The
-                     * next code point is the single byte where we're at */
-                    t_cp = CP_ADJUST(*t);
-                    t_range_count = 1;
-                    t++;
-                }
-                else {
-                    Size_t t_char_len;
+        assert(SvCUR(repointer_list) % sizeof(IV) == 0);
 
-                    /* Here, not in the middle of a range, and is UTF-8.  The
-                     * next code point is the next UTF-8 char in the input.  We
-                     * know the input is valid, because the toker constructed
-                     * it */
-                    t_cp = CP_ADJUST(valid_utf8_to_uvchr(t, &t_char_len));
-                    t += t_char_len;
+        SvEND_set(repointer_list, p);
 
-                    /* UTF-8 strings (only) have been parsed in toke.c to have
-                     * ranges.  See if the next byte indicates that this was
-                     * the first element of a range.  If so, get the final
-                     * element and calculate the range size.  If not, the range
-                     * size is 1 */
-                    if (   t < tend && *t == RANGE_INDICATOR
-                        && ! FORCE_RANGE_LEN_1(t_cp))
-                    {
-                        t++;
-                        t_range_count = valid_utf8_to_uvchr(t, &t_char_len)
-                                      - t_cp + 1;
-                        t += t_char_len;
-                    }
-                    else {
-                        t_range_count = 1;
-                    }
-                }
+        pmop->op_pmoffset = offset;
+        /* This slot should be free, so assert this:  */
+        assert(PL_regex_pad[offset] == &PL_sv_undef);
+    } else {
+        SV * const repointer = &PL_sv_undef;
+        av_push(PL_regex_padav, repointer);
+        pmop->op_pmoffset = av_top_index(PL_regex_padav);
+        PL_regex_pad = AvARRAY(PL_regex_padav);
+    }
+#endif
 
-                /* Count the total number of listed code points * */
-                t_count += t_range_count;
-            }
+    return CHECKOP(type, pmop);
+}
 
-            /* Similarly, get the next character in the replacement list */
-            if (r_range_count <= 0) {
-                if (r >= rend) {
+static void
+S_set_haseval(pTHX)
+{
+    PADOFFSET i = 1;
+    PL_cv_has_eval = 1;
+    /* Any pad names in scope are potentially lvalues.  */
+    for (; i < PadnamelistMAXNAMED(PL_comppad_name); i++) {
+        PADNAME *pn = PAD_COMPNAME_SV(i);
+        if (!pn || !PadnameLEN(pn))
+            continue;
+        if (PadnameOUTER(pn) || PadnameIN_SCOPE(pn, PL_cop_seqmax))
+            S_mark_padname_lvalue(aTHX_ pn);
+    }
+}
 
-                    /* But if we've exhausted the rhs, there is nothing to map
-                     * to, except the special handling one, and we make the
-                     * range the same size as the lhs one. */
-                    r_cp = TR_SPECIAL_HANDLING;
-                    r_range_count = t_range_count;
+/* Given some sort of match op o, and an expression expr containing a
+ * pattern, either compile expr into a regex and attach it to o (if it's
+ * constant), or convert expr into a runtime regcomp op sequence (if it's
+ * not)
+ *
+ * Flags currently has 2 bits of meaning:
+ * 1: isreg indicates that the pattern is part of a regex construct, eg
+ *      $x =~ /pattern/ or split /pattern/, as opposed to $x =~ $pattern or
+ *      split "pattern", which aren't. In the former case, expr will be a list
+ *      if the pattern contains more than one term (eg /a$b/).
+ * 2: The pattern is for a split.
+ *
+ * When the pattern has been compiled within a new anon CV (for
+ * qr/(?{...})/ ), then floor indicates the savestack level just before
+ * the new sub was created
+ *
+ * tr/// is also handled.
+ */
 
-                    if (! del) {
-                        DEBUG_yv(PerlIO_printf(Perl_debug_log,
-                                        "final_map =%" UVXf "\n", final_map));
-                    }
-                }
-                else {
-                    if (! rstr_utf8) {
-                        r_cp = CP_ADJUST(*r);
-                        r_range_count = 1;
-                        r++;
-                    }
-                    else {
-                        Size_t r_char_len;
+OP *
+Perl_pmruntime(pTHX_ OP *o, OP *expr, OP *repl, UV flags, I32 floor)
+{
+    PMOP *pm;
+    LOGOP *rcop;
+    I32 repl_has_vars = 0;
+    bool is_trans = (o->op_type == OP_TRANS || o->op_type == OP_TRANSR);
+    bool is_compiletime;
+    bool has_code;
+    bool isreg    = cBOOL(flags & 1);
+    bool is_split = cBOOL(flags & 2);
 
-                        r_cp = CP_ADJUST(valid_utf8_to_uvchr(r, &r_char_len));
-                        r += r_char_len;
-                        if (   r < rend && *r == RANGE_INDICATOR
-                            && ! FORCE_RANGE_LEN_1(r_cp))
-                        {
-                            r++;
-                            r_range_count = valid_utf8_to_uvchr(r,
-                                                    &r_char_len) - r_cp + 1;
-                            r += r_char_len;
-                        }
-                        else {
-                            r_range_count = 1;
-                        }
-                    }
+    PERL_ARGS_ASSERT_PMRUNTIME;
 
-                    if (r_cp == TR_SPECIAL_HANDLING) {
-                        r_range_count = t_range_count;
-                    }
+    if (is_trans) {
+        return pmtrans(o, expr, repl);
+    }
 
-                    /* This is the final character so far */
-                    final_map = r_cp + r_range_count - 1;
+    /* find whether we have any runtime or code elements;
+     * at the same time, temporarily set the op_next of each DO block;
+     * then when we LINKLIST, this will cause the DO blocks to be excluded
+     * from the op_next chain (and from having LINKLIST recursively
+     * applied to them). We fix up the DOs specially later */
 
-                    r_count += r_range_count;
+    is_compiletime = 1;
+    has_code = 0;
+    if (expr->op_type == OP_LIST) {
+        OP *child;
+        for (child = cLISTOPx(expr)->op_first; child; child = OpSIBLING(child)) {
+            if (child->op_type == OP_NULL && (child->op_flags & OPf_SPECIAL)) {
+                has_code = 1;
+                assert(!child->op_next);
+                if (UNLIKELY(!OpHAS_SIBLING(child))) {
+                    assert(PL_parser && PL_parser->error_count);
+                    /* This can happen with qr/ (?{(^{})/.  Just fake up
+                       the op we were expecting to see, to avoid crashing
+                       elsewhere.  */
+                    op_sibling_splice(expr, child, 0,
+                              newSVOP(OP_CONST, 0, &PL_sv_no));
                 }
+                child->op_next = OpSIBLING(child);
             }
+            else if (child->op_type != OP_CONST && child->op_type != OP_PUSHMARK)
+            is_compiletime = 0;
+        }
+    }
+    else if (expr->op_type != OP_CONST)
+        is_compiletime = 0;
 
-            /* Here, we have the next things ready in both sides.  They are
-             * potentially ranges.  We try to process as big a chunk as
-             * possible at once, but the lhs and rhs must be synchronized, so
-             * things like tr/A-Z/a-ij-z/ will need to be processed in 2 chunks
-             * */
-            min_range_count = MIN(t_range_count, r_range_count);
-
-            /* Search the inversion list for the entry that contains the input
-             * code point <cp>.  The inversion map was initialized to cover the
-             * entire range of possible inputs, so this should not fail.  So
-             * the return value is the index into the list's array of the range
-             * that contains <cp>, that is, 'i' such that array[i] <= cp <
-             * array[i+1] */
-            j = _invlist_search(t_invlist, t_cp);
-            assert(j >= 0);
-            i = j;
-
-            /* Here, the data structure might look like:
-             *
-             * index    t   r     Meaning
-             * [i-1]    J   j   # J-L => j-l
-             * [i]      M  -1   # M => default; as do N, O, P, Q
-             * [i+1]    R   x   # R => x, S => x+1, T => x+2
-             * [i+2]    U   y   # U => y, V => y+1, ...
-             * ...
-             * [-1]     Z  -1   # Z => default; as do Z+1, ... infinity
-             *
-             * where 'x' and 'y' above are not to be taken literally.
-             *
-             * The maximum chunk we can handle in this loop iteration, is the
-             * smallest of the three components: the lhs 't_', the rhs 'r_',
-             * and the remainder of the range in element [i].  (In pass 1, that
-             * range will have everything in it be of the same class; we can't
-             * cross into another class.)  'min_range_count' already contains
-             * the smallest of the first two values.  The final one is
-             * irrelevant if the map is to the special indicator */
+    LINKLIST(expr);
 
-            invmap_range_length_remaining = (i + 1 < len)
-                                            ? t_array[i+1] - t_cp
-                                            : IV_MAX - t_cp;
-            span = MAX(1, MIN(min_range_count, invmap_range_length_remaining));
+    /* fix up DO blocks; treat each one as a separate little sub;
+     * also, mark any arrays as LIST/REF */
 
-            /* The end point of this chunk is where we are, plus the span, but
-             * never larger than the platform's infinity */
-            t_cp_end = MIN(IV_MAX, t_cp + span - 1);
+    if (expr->op_type == OP_LIST) {
+        OP *child;
+        for (child = cLISTOPx(expr)->op_first; child; child = OpSIBLING(child)) {
 
-            if (r_cp == TR_SPECIAL_HANDLING) {
+            if (child->op_type == OP_PADAV || child->op_type == OP_RV2AV) {
+                assert( !(child->op_flags  & OPf_WANT));
+                /* push the array rather than its contents. The regex
+                 * engine will retrieve and join the elements later */
+                child->op_flags |= (OPf_WANT_LIST | OPf_REF);
+                continue;
+            }
 
-                /* If unmatched lhs code points map to the final map, use that
-                 * value.  This being set to TR_SPECIAL_HANDLING indicates that
-                 * we don't have a final map: unmatched lhs code points are
-                 * simply deleted */
-                r_cp_end = (del) ? TR_SPECIAL_HANDLING : final_map;
+            if (!(child->op_type == OP_NULL && (child->op_flags & OPf_SPECIAL)))
+                continue;
+            child->op_next = NULL; /* undo temporary hack from above */
+            scalar(child);
+            LINKLIST(child);
+            if (cLISTOPx(child)->op_first->op_type == OP_LEAVE) {
+                LISTOP *leaveop = cLISTOPx(cLISTOPx(child)->op_first);
+                /* skip ENTER */
+                assert(leaveop->op_first->op_type == OP_ENTER);
+                assert(OpHAS_SIBLING(leaveop->op_first));
+                child->op_next = OpSIBLING(leaveop->op_first);
+                /* skip leave */
+                assert(leaveop->op_flags & OPf_KIDS);
+                assert(leaveop->op_last->op_next == (OP*)leaveop);
+                leaveop->op_next = NULL; /* stop on last op */
+                op_null((OP*)leaveop);
             }
             else {
-                r_cp_end = MIN(IV_MAX, r_cp + span - 1);
-
-                /* If something on the lhs is below 256, and something on the
-                 * rhs is above, there is a potential mapping here across that
-                 * boundary.  Indeed the only way there isn't is if both sides
-                 * start at the same point.  That means they both cross at the
-                 * same time.  But otherwise one crosses before the other */
-                if (t_cp < 256 && r_cp_end > 255 && r_cp != t_cp) {
-                    can_force_utf8 = TRUE;
-                }
+                /* skip SCOPE */
+                OP *scope = cLISTOPx(child)->op_first;
+                assert(scope->op_type == OP_SCOPE);
+                assert(scope->op_flags & OPf_KIDS);
+                scope->op_next = NULL; /* stop on last op */
+                op_null(scope);
             }
 
-            /* If a character appears in the search list more than once, the
-             * 2nd and succeeding occurrences are ignored, so only do this
-             * range if haven't already processed this character.  (The range
-             * has been set up so that all members in it will be of the same
-             * ilk) */
-            if (r_map[i] == TR_UNLISTED) {
-                DEBUG_yv(PerlIO_printf(Perl_debug_log,
-                    "Processing %" UVxf "-%" UVxf " => %" UVxf "-%" UVxf "\n",
-                    t_cp, t_cp_end, r_cp, r_cp_end));
+            /* XXX optimize_optree() must be called on o before
+             * CALL_PEEP(), as currently S_maybe_multiconcat() can't
+             * currently cope with a peephole-optimised optree.
+             * Calling optimize_optree() here ensures that condition
+             * is met, but may mean optimize_optree() is applied
+             * to the same optree later (where hopefully it won't do any
+             * harm as it can't convert an op to multiconcat if it's
+             * already been converted */
+            optimize_optree(child);
 
-                /* This is the first definition for this chunk, hence is valid
-                 * and needs to be processed.  Here and in the comments below,
-                 * we use the above sample data.  The t_cp chunk must be any
-                 * contiguous subset of M, N, O, P, and/or Q.
-                 *
-                 * In the first pass, calculate if there is any possible input
-                 * string that has a character whose transliteration will be
-                 * longer than it.  If none, the transliteration may be done
-                 * in-place, as it can't write over a so-far unread byte.
-                 * Otherwise, a copy must first be made.  This could be
-                 * expensive for long inputs.
-                 *
-                 * In the first pass, the t_invlist has been partitioned so
-                 * that all elements in any single range have the same number
-                 * of bytes in their UTF-8 representations.  And the r space is
-                 * either a single byte, or a range of strictly monotonically
-                 * increasing code points.  So the final element in the range
-                 * will be represented by no fewer bytes than the initial one.
-                 * That means that if the final code point in the t range has
-                 * at least as many bytes as the final code point in the r,
-                 * then all code points in the t range have at least as many
-                 * bytes as their corresponding r range element.  But if that's
-                 * not true, the transliteration of at least the final code
-                 * point grows in length.  As an example, suppose we had
-                 *      tr/\x{fff0}-\x{fff1}/\x{ffff}-\x{10000}/
-                 * The UTF-8 for all but 10000 occupies 3 bytes on ASCII
-                 * platforms.  We have deliberately set up the data structure
-                 * so that any range in the lhs gets split into chunks for
-                 * processing, such that every code point in a chunk has the
-                 * same number of UTF-8 bytes.  We only have to check the final
-                 * code point in the rhs against any code point in the lhs. */
-                if ( ! pass2
-                    && r_cp_end != TR_SPECIAL_HANDLING
-                    && CP_SKIP(t_cp_end) < CP_SKIP(r_cp_end))
-                {
-                    /* Here, we will need to make a copy of the input string
-                     * before doing the transliteration.  The worst possible
-                     * case is an expansion ratio of 14:1. This is rare, and
-                     * we'd rather allocate only the necessary amount of extra
-                     * memory for that copy.  We can calculate the worst case
-                     * for this particular transliteration is by keeping track
-                     * of the expansion factor for each range.
-                     *
-                     * Consider tr/\xCB/\X{E000}/.  The maximum expansion
-                     * factor is 1 byte going to 3 if the target string is not
-                     * UTF-8, but 2 bytes going to 3 if it is in UTF-8.  We
-                     * could pass two different values so doop could choose
-                     * based on the UTF-8ness of the target.  But khw thinks
-                     * (perhaps wrongly) that is overkill.  It is used only to
-                     * make sure we malloc enough space.
-                     *
-                     * If no target string can force the result to be UTF-8,
-                     * then we don't have to worry about the case of the target
-                     * string not being UTF-8 */
-                    NV t_size = (can_force_utf8 && t_cp < 256)
-                                ? 1
-                                : CP_SKIP(t_cp_end);
-                    NV ratio = CP_SKIP(r_cp_end) / t_size;
+            /* have to peep the DOs individually as we've removed it from
+             * the op_next chain */
+            CALL_PEEP(child);
+            op_prune_chain_head(&(child->op_next));
+            if (is_compiletime)
+                /* runtime finalizes as part of finalizing whole tree */
+                finalize_optree(child);
+        }
+    }
+    else if (expr->op_type == OP_PADAV || expr->op_type == OP_RV2AV) {
+        assert( !(expr->op_flags  & OPf_WANT));
+        /* push the array rather than its contents. The regex
+         * engine will retrieve and join the elements later */
+        expr->op_flags |= (OPf_WANT_LIST | OPf_REF);
+    }
 
-                    o->op_private |= OPpTRANS_GROWS;
+    PL_hints |= HINT_BLOCK_SCOPE;
+    pm = cPMOPo;
+    assert(floor==0 || (pm->op_pmflags & PMf_HAS_CV));
 
-                    /* Now that we know it grows, we can keep track of the
-                     * largest ratio */
-                    if (ratio > max_expansion) {
-                        max_expansion = ratio;
-                        DEBUG_y(PerlIO_printf(Perl_debug_log,
-                                        "New expansion factor: %" NVgf "\n",
-                                        max_expansion));
-                    }
-                }
+    if (is_compiletime) {
+        U32 rx_flags = pm->op_pmflags & RXf_PMf_COMPILETIME;
+        regexp_engine const *eng = current_re_engine();
 
-                /* The very first range is marked as adjacent to the
-                 * non-existent range below it, as it causes things to "just
-                 * work" (TradeMark)
-                 *
-                 * If the lowest code point in this chunk is M, it adjoins the
-                 * J-L range */
-                if (t_cp == t_array[i]) {
-                    adjacent_to_range_below = TRUE;
+        if (is_split) {
+            /* make engine handle split ' ' specially */
+            pm->op_pmflags |= PMf_SPLIT;
+            rx_flags |= RXf_SPLIT;
+        }
 
-                    /* And if the map has the same offset from the beginning of
-                     * the range as does this new code point (or both are for
-                     * TR_SPECIAL_HANDLING), this chunk can be completely
-                     * merged with the range below.  EXCEPT, in the first pass,
-                     * we don't merge ranges whose UTF-8 byte representations
-                     * have different lengths, so that we can more easily
-                     * detect if a replacement is longer than the source, that
-                     * is if it 'grows'.  But in the 2nd pass, there's no
-                     * reason to not merge */
-                    if (   (i > 0 && (   pass2
-                                      || CP_SKIP(t_array[i-1])
-                                                            == CP_SKIP(t_cp)))
-                        && (   (   r_cp == TR_SPECIAL_HANDLING
-                                && r_map[i-1] == TR_SPECIAL_HANDLING)
-                            || (   r_cp != TR_SPECIAL_HANDLING
-                                && r_cp - r_map[i-1] == t_cp - t_array[i-1])))
-                    {
-                        merge_with_range_below = TRUE;
-                    }
-                }
+        if (!has_code || !eng->op_comp) {
+            /* compile-time simple constant pattern */
 
-                /* Similarly, if the highest code point in this chunk is 'Q',
-                 * it adjoins the range above, and if the map is suitable, can
-                 * be merged with it */
-                if (    t_cp_end >= IV_MAX - 1
-                    || (   i + 1 < len
-                        && t_cp_end + 1 == t_array[i+1]))
-                {
-                    adjacent_to_range_above = TRUE;
-                    if (i + 1 < len)
-                    if (    (   pass2
-                             || CP_SKIP(t_cp) == CP_SKIP(t_array[i+1]))
-                        && (   (   r_cp == TR_SPECIAL_HANDLING
-                                && r_map[i+1] == (UV) TR_SPECIAL_HANDLING)
-                            || (   r_cp != TR_SPECIAL_HANDLING
-                                && r_cp_end == r_map[i+1] - 1)))
-                    {
-                        merge_with_range_above = TRUE;
-                    }
+            if ((pm->op_pmflags & PMf_HAS_CV) && !has_code) {
+                /* whoops! we guessed that a qr// had a code block, but we
+                 * were wrong (e.g. /[(?{}]/ ). Throw away the PL_compcv
+                 * that isn't required now. Note that we have to be pretty
+                 * confident that nothing used that CV's pad while the
+                 * regex was parsed, except maybe op targets for \Q etc.
+                 * If there were any op targets, though, they should have
+                 * been stolen by constant folding.
+                 */
+#ifdef DEBUGGING
+                SSize_t i = 0;
+                assert(PadnamelistMAXNAMED(PL_comppad_name) == 0);
+                while (++i <= AvFILLp(PL_comppad)) {
+#  ifdef USE_PAD_RESET
+                    /* under USE_PAD_RESET, pad swipe replaces a swiped
+                     * folded constant with a fresh padtmp */
+                    assert(!PL_curpad[i] || SvPADTMP(PL_curpad[i]));
+#  else
+                    assert(!PL_curpad[i]);
+#  endif
                 }
+#endif
+                /* This LEAVE_SCOPE will restore PL_compcv to point to the
+                 * outer CV (the one whose slab holds the pm op). The
+                 * inner CV (which holds expr) will be freed later, once
+                 * all the entries on the parse stack have been popped on
+                 * return from this function. Which is why its safe to
+                 * call op_free(expr) below.
+                 */
+                LEAVE_SCOPE(floor);
+                pm->op_pmflags &= ~PMf_HAS_CV;
+            }
 
-                if (merge_with_range_below && merge_with_range_above) {
+            /* Skip compiling if parser found an error for this pattern */
+            if (pm->op_pmflags & PMf_HAS_ERROR) {
+                return o;
+            }
 
-                    /* Here the new chunk looks like M => m, ... Q => q; and
-                     * the range above is like R => r, ....  Thus, the [i-1]
-                     * and [i+1] ranges should be seamlessly melded so the
-                     * result looks like
-                     *
-                     * [i-1]    J   j   # J-T => j-t
-                     * [i]      U   y   # U => y, V => y+1, ...
-                     * ...
-                     * [-1]     Z  -1   # Z => default; as do Z+1, ... infinity
-                     */
-                    Move(t_array + i + 2, t_array + i, len - i - 2, UV);
-                    Move(r_map   + i + 2, r_map   + i, len - i - 2, UV);
-                    len -= 2;
-                    invlist_set_len(t_invlist,
-                                    len,
-                                    *(get_invlist_offset_addr(t_invlist)));
-                }
-                else if (merge_with_range_below) {
+            PM_SETRE(pm,
+                eng->op_comp
+                    ? eng->op_comp(aTHX_ NULL, 0, expr, eng, NULL, NULL,
+                                        rx_flags, pm->op_pmflags)
+                    : Perl_re_op_compile(aTHX_ NULL, 0, expr, eng, NULL, NULL,
+                                        rx_flags, pm->op_pmflags)
+            );
+            op_free(expr);
+        }
+        else {
+            /* compile-time pattern that includes literal code blocks */
 
-                    /* Here the new chunk looks like M => m, .... But either
-                     * (or both) it doesn't extend all the way up through Q; or
-                     * the range above doesn't start with R => r. */
-                    if (! adjacent_to_range_above) {
+            REGEXP* re;
 
-                        /* In the first case, let's say the new chunk extends
-                         * through O.  We then want:
-                         *
-                         * [i-1]    J   j   # J-O => j-o
-                         * [i]      P  -1   # P => -1, Q => -1
-                         * [i+1]    R   x   # R => x, S => x+1, T => x+2
-                         * [i+2]    U   y   # U => y, V => y+1, ...
-                         * ...
-                         * [-1]     Z  -1   # Z => default; as do Z+1, ...
-                         *                                            infinity
-                         */
-                        t_array[i] = t_cp_end + 1;
-                        r_map[i] = TR_UNLISTED;
-                    }
-                    else { /* Adjoins the range above, but can't merge with it
-                              (because 'x' is not the next map after q) */
-                        /*
-                         * [i-1]    J   j   # J-Q => j-q
-                         * [i]      R   x   # R => x, S => x+1, T => x+2
-                         * [i+1]    U   y   # U => y, V => y+1, ...
-                         * ...
-                         * [-1]     Z  -1   # Z => default; as do Z+1, ...
-                         *                                          infinity
-                         */
+            /* Skip compiling if parser found an error for this pattern */
+            if (pm->op_pmflags & PMf_HAS_ERROR) {
+                return o;
+            }
 
-                        Move(t_array + i + 1, t_array + i, len - i - 1, UV);
-                        Move(r_map + i + 1, r_map + i, len - i - 1, UV);
-                        len--;
-                        invlist_set_len(t_invlist, len,
-                                        *(get_invlist_offset_addr(t_invlist)));
-                    }
-                }
-                else if (merge_with_range_above) {
+            re = eng->op_comp(aTHX_ NULL, 0, expr, eng, NULL, NULL,
+                        rx_flags,
+                        (pm->op_pmflags |
+                            ((PL_hints & HINT_RE_EVAL) ? PMf_USE_RE_EVAL : 0))
+                    );
+            PM_SETRE(pm, re);
+            if (pm->op_pmflags & PMf_HAS_CV) {
+                CV *cv;
+                /* this QR op (and the anon sub we embed it in) is never
+                 * actually executed. It's just a placeholder where we can
+                 * squirrel away expr in op_code_list without the peephole
+                 * optimiser etc processing it for a second time */
+                OP *qr = newPMOP(OP_QR, 0);
+                cPMOPx(qr)->op_code_list = expr;
 
-                    /* Here the new chunk ends with Q => q, and the range above
-                     * must start with R => r, so the two can be merged. But
-                     * either (or both) the new chunk doesn't extend all the
-                     * way down to M; or the mapping of the final code point
-                     * range below isn't m */
-                    if (! adjacent_to_range_below) {
+                /* handle the implicit sub{} wrapped round the qr/(?{..})/ */
+                SvREFCNT_inc_simple_void(PL_compcv);
+                cv = newATTRSUB(floor, 0, NULL, NULL, qr);
+                ReANY(re)->qr_anoncv = cv;
 
-                        /* In the first case, let's assume the new chunk starts
-                         * with P => p.  Then, because it's merge-able with the
-                         * range above, that range must be R => r.  We want:
-                         *
-                         * [i-1]    J   j   # J-L => j-l
-                         * [i]      M  -1   # M => -1, N => -1
-                         * [i+1]    P   p   # P-T => p-t
-                         * [i+2]    U   y   # U => y, V => y+1, ...
-                         * ...
-                         * [-1]     Z  -1   # Z => default; as do Z+1, ...
-                         *                                          infinity
-                         */
-                        t_array[i+1] = t_cp;
-                        r_map[i+1] = r_cp;
-                    }
-                    else { /* Adjoins the range below, but can't merge with it
-                            */
-                        /*
-                         * [i-1]    J   j   # J-L => j-l
-                         * [i]      M   x   # M-T => x-5 .. x+2
-                         * [i+1]    U   y   # U => y, V => y+1, ...
-                         * ...
-                         * [-1]     Z  -1   # Z => default; as do Z+1, ...
-                         *                                          infinity
-                         */
-                        Move(t_array + i + 1, t_array + i, len - i - 1, UV);
-                        Move(r_map   + i + 1, r_map   + i, len - i - 1, UV);
-                        len--;
-                        t_array[i] = t_cp;
-                        r_map[i] = r_cp;
-                        invlist_set_len(t_invlist, len,
-                                        *(get_invlist_offset_addr(t_invlist)));
-                    }
-                }
-                else if (adjacent_to_range_below && adjacent_to_range_above) {
-                    /* The new chunk completely fills the gap between the
-                     * ranges on either side, but can't merge with either of
-                     * them.
-                     *
-                     * [i-1]    J   j   # J-L => j-l
-                     * [i]      M   z   # M => z, N => z+1 ... Q => z+4
-                     * [i+1]    R   x   # R => x, S => x+1, T => x+2
-                     * [i+2]    U   y   # U => y, V => y+1, ...
-                     * ...
-                     * [-1]     Z  -1   # Z => default; as do Z+1, ... infinity
-                     */
-                    r_map[i] = r_cp;
-                }
-                else if (adjacent_to_range_below) {
-                    /* The new chunk adjoins the range below, but not the range
-                     * above, and can't merge.  Let's assume the chunk ends at
-                     * O.
-                     *
-                     * [i-1]    J   j   # J-L => j-l
-                     * [i]      M   z   # M => z, N => z+1, O => z+2
-                     * [i+1]    P   -1  # P => -1, Q => -1
-                     * [i+2]    R   x   # R => x, S => x+1, T => x+2
-                     * [i+3]    U   y   # U => y, V => y+1, ...
-                     * ...
-                     * [-w]     Z  -1   # Z => default; as do Z+1, ... infinity
-                     */
-                    invlist_extend(t_invlist, len + 1);
-                    t_array = invlist_array(t_invlist);
-                    Renew(r_map, len + 1, UV);
-
-                    Move(t_array + i + 1, t_array + i + 2, len - i - 1, UV);
-                    Move(r_map + i + 1,   r_map   + i + 2, len - i - 1, UV);
-                    r_map[i] = r_cp;
-                    t_array[i+1] = t_cp_end + 1;
-                    r_map[i+1] = TR_UNLISTED;
-                    len++;
-                    invlist_set_len(t_invlist, len,
-                                    *(get_invlist_offset_addr(t_invlist)));
-                }
-                else if (adjacent_to_range_above) {
-                    /* The new chunk adjoins the range above, but not the range
-                     * below, and can't merge.  Let's assume the new chunk
-                     * starts at O
-                     *
-                     * [i-1]    J   j   # J-L => j-l
-                     * [i]      M  -1   # M => default, N => default
-                     * [i+1]    O   z   # O => z, P => z+1, Q => z+2
-                     * [i+2]    R   x   # R => x, S => x+1, T => x+2
-                     * [i+3]    U   y   # U => y, V => y+1, ...
-                     * ...
-                     * [-1]     Z  -1   # Z => default; as do Z+1, ... infinity
-                     */
-                    invlist_extend(t_invlist, len + 1);
-                    t_array = invlist_array(t_invlist);
-                    Renew(r_map, len + 1, UV);
-
-                    Move(t_array + i + 1, t_array + i + 2, len - i - 1, UV);
-                    Move(r_map   + i + 1, r_map   + i + 2, len - i - 1, UV);
-                    t_array[i+1] = t_cp;
-                    r_map[i+1] = r_cp;
-                    len++;
-                    invlist_set_len(t_invlist, len,
-                                    *(get_invlist_offset_addr(t_invlist)));
-                }
-                else {
-                    /* The new chunk adjoins neither the range above, nor the
-                     * range below.  Lets assume it is N..P => n..p
-                     *
-                     * [i-1]    J   j   # J-L => j-l
-                     * [i]      M  -1   # M => default
-                     * [i+1]    N   n   # N..P => n..p
-                     * [i+2]    Q  -1   # Q => default
-                     * [i+3]    R   x   # R => x, S => x+1, T => x+2
-                     * [i+4]    U   y   # U => y, V => y+1, ...
-                     * ...
-                     * [-1]     Z  -1   # Z => default; as do Z+1, ... infinity
-                     */
-
-                    DEBUG_yv(PerlIO_printf(Perl_debug_log,
-                                        "Before fixing up: len=%d, i=%d\n",
-                                        (int) len, (int) i));
-                    DEBUG_yv(invmap_dump(t_invlist, r_map));
-
-                    invlist_extend(t_invlist, len + 2);
-                    t_array = invlist_array(t_invlist);
-                    Renew(r_map, len + 2, UV);
-
-                    Move(t_array + i + 1,
-                         t_array + i + 2 + 1, len - i - (2 - 1), UV);
-                    Move(r_map   + i + 1,
-                         r_map   + i + 2 + 1, len - i - (2 - 1), UV);
-
-                    len += 2;
-                    invlist_set_len(t_invlist, len,
-                                    *(get_invlist_offset_addr(t_invlist)));
-
-                    t_array[i+1] = t_cp;
-                    r_map[i+1] = r_cp;
-
-                    t_array[i+2] = t_cp_end + 1;
-                    r_map[i+2] = TR_UNLISTED;
-                }
-                DEBUG_yv(PerlIO_printf(Perl_debug_log,
-                          "After iteration: span=%" UVuf ", t_range_count=%"
-                          UVuf " r_range_count=%" UVuf "\n",
-                          span, t_range_count, r_range_count));
-                DEBUG_yv(invmap_dump(t_invlist, r_map));
-            } /* End of this chunk needs to be processed */
-
-            /* Done with this chunk. */
-            t_cp += span;
-            if (t_cp >= IV_MAX) {
-                break;
-            }
-            t_range_count -= span;
-            if (r_cp != TR_SPECIAL_HANDLING) {
-                r_cp += span;
-                r_range_count -= span;
+                /* attach the anon CV to the pad so that
+                 * pad_fixup_inner_anons() can find it */
+                (void)pad_add_anon(cv, o->op_type);
+                SvREFCNT_inc_simple_void(cv);
             }
             else {
-                r_range_count = 0;
+                pm->op_code_list = expr;
             }
-
-        } /* End of loop through the search list */
-
-        /* We don't need an exact count, but we do need to know if there is
-         * anything left over in the replacement list.  So, just assume it's
-         * one byte per character */
-        if (rend > r) {
-            r_count++;
         }
-    } /* End of passes */
-
-    SvREFCNT_dec(inverted_tstr);
-
-    DEBUG_y(PerlIO_printf(Perl_debug_log, "After everything: \n"));
-    DEBUG_y(invmap_dump(t_invlist, r_map));
+    }
+    else {
+        /* runtime pattern: build chain of regcomp etc ops */
+        bool reglist;
+        PADOFFSET cv_targ = 0;
 
-    /* We now have normalized the input into an inversion map.
-     *
-     * See if the lhs and rhs are equivalent.  If so, this tr/// is a no-op
-     * except for the count, and streamlined runtime code can be used */
-    if (!del && !squash) {
+        reglist = isreg && expr->op_type == OP_LIST;
+        if (reglist)
+            op_null(expr);
 
-        /* They are identical if they point to same address, or if everything
-         * maps to UNLISTED or to itself.  This catches things that not looking
-         * at the normalized inversion map doesn't catch, like tr/aa/ab/ or
-         * tr/\x{100}-\x{104}/\x{100}-\x{102}\x{103}-\x{104}  */
-        if (r0 != t0) {
-            for (i = 0; i < len; i++) {
-                if (r_map[i] != TR_UNLISTED && r_map[i] != t_array[i]) {
-                    goto done_identical_check;
-                }
-            }
+        if (has_code) {
+            pm->op_code_list = expr;
+            /* don't free op_code_list; its ops are embedded elsewhere too */
+            pm->op_pmflags |= PMf_CODELIST_PRIVATE;
         }
 
-        /* Here have gone through entire list, and didn't find any
-         * non-identical mappings */
-        o->op_private |= OPpTRANS_IDENTICAL;
-
-      done_identical_check: ;
-    }
+        if (is_split)
+            /* make engine handle split ' ' specially */
+            pm->op_pmflags |= PMf_SPLIT;
 
-    t_array = invlist_array(t_invlist);
+        /* the OP_REGCMAYBE is a placeholder in the non-threaded case
+         * to allow its op_next to be pointed past the regcomp and
+         * preceding stacking ops;
+         * OP_REGCRESET is there to reset taint before executing the
+         * stacking ops */
+        if (pm->op_pmflags & PMf_KEEP || TAINTING_get)
+            expr = newUNOP((TAINTING_get ? OP_REGCRESET : OP_REGCMAYBE),0,expr);
 
-    /* If has components above 255, we generally need to use the inversion map
-     * implementation */
-    if (   can_force_utf8
-        || (   len > 0
-            && t_array[len-1] > 255
-                 /* If the final range is 0x100-INFINITY and is a special
-                  * mapping, the table implementation can handle it */
-            && ! (   t_array[len-1] == 256
-                  && (   r_map[len-1] == TR_UNLISTED
-                      || r_map[len-1] == TR_SPECIAL_HANDLING))))
-    {
-        SV* r_map_sv;
+        if (pm->op_pmflags & PMf_HAS_CV) {
+            /* we have a runtime qr with literal code. This means
+             * that the qr// has been wrapped in a new CV, which
+             * means that runtime consts, vars etc will have been compiled
+             * against a new pad. So... we need to execute those ops
+             * within the environment of the new CV. So wrap them in a call
+             * to a new anon sub. i.e. for
+             *
+             *     qr/a$b(?{...})/,
+             *
+             * we build an anon sub that looks like
+             *
+             *     sub { "a", $b, '(?{...})' }
+             *
+             * and call it, passing the returned list to regcomp.
+             * Or to put it another way, the list of ops that get executed
+             * are:
+             *
+             *     normal              PMf_HAS_CV
+             *     ------              -------------------
+             *                         pushmark (for regcomp)
+             *                         pushmark (for entersub)
+             *                         anoncode
+             *                         entersub
+             *     regcreset                  regcreset
+             *     pushmark                   pushmark
+             *     const("a")                 const("a")
+             *     gvsv(b)                    gvsv(b)
+             *     const("(?{...})")          const("(?{...})")
+             *                                leavesub
+             *     regcomp             regcomp
+             */
 
-        /* A UTF-8 op is generated, indicated by this flag.  This op is an
-         * sv_op */
-        o->op_private |= OPpTRANS_USE_SVOP;
+            SvREFCNT_inc_simple_void(PL_compcv);
+            CvLVALUE_on(PL_compcv);
+            /* these lines are just an unrolled newANONATTRSUB */
+            expr = newSVOP(OP_ANONCODE, OPf_REF,
+                    MUTABLE_SV(newATTRSUB(floor, 0, NULL, NULL, expr)));
+            cv_targ = expr->op_targ;
 
-        if (can_force_utf8) {
-            o->op_private |= OPpTRANS_CAN_FORCE_UTF8;
+            expr = list(op_force_list(newUNOP(OP_ENTERSUB, 0, scalar(expr))));
         }
 
-        /* The inversion map is pushed; first the list. */
-        invmap = MUTABLE_AV(newAV());
-        av_push(invmap, t_invlist);
-
-        /* 2nd is the mapping */
-        r_map_sv = newSVpvn((char *) r_map, len * sizeof(UV));
-        av_push(invmap, r_map_sv);
+        rcop = alloc_LOGOP(OP_REGCOMP, scalar(expr), o);
+        rcop->op_flags |=  ((PL_hints & HINT_RE_EVAL) ? OPf_SPECIAL : 0)
+                           | (reglist ? OPf_STACKED : 0);
+        rcop->op_targ = cv_targ;
 
-        /* 3rd is the max possible expansion factor */
-        av_push(invmap, newSVnv(max_expansion));
+        /* /$x/ may cause an eval, since $x might be qr/(?{..})/  */
+        if (PL_hints & HINT_RE_EVAL)
+            S_set_haseval(aTHX);
 
-        /* Characters that are in the search list, but not in the replacement
-         * list are mapped to the final character in the replacement list */
-        if (! del && r_count < t_count) {
-            av_push(invmap, newSVuv(final_map));
+        /* establish postfix order */
+        if (expr->op_type == OP_REGCRESET || expr->op_type == OP_REGCMAYBE) {
+            LINKLIST(expr);
+            rcop->op_next = expr;
+            cUNOPx(expr)->op_first->op_next = (OP*)rcop;
+        }
+        else {
+            rcop->op_next = LINKLIST(expr);
+            expr->op_next = (OP*)rcop;
         }
 
-#ifdef USE_ITHREADS
-        cPADOPo->op_padix = pad_alloc(OP_TRANS, SVf_READONLY);
-        SvREFCNT_dec(PAD_SVl(cPADOPo->op_padix));
-        PAD_SETSV(cPADOPo->op_padix, (SV *) invmap);
-        SvPADTMP_on(invmap);
-        SvREADONLY_on(invmap);
-#else
-        cSVOPo->op_sv = (SV *) invmap;
-#endif
-
+        op_prepend_elem(o->op_type, scalar((OP*)rcop), o);
     }
-    else {
-        OPtrans_map *tbl;
-        unsigned short i;
-
-        /* The OPtrans_map struct already contains one slot; hence the -1. */
-        SSize_t struct_size = sizeof(OPtrans_map)
-                            + (256 - 1 + 1)*sizeof(short);
-
-        /* Non-utf8 case: set o->op_pv to point to a simple 256+ entry lookup
-        * table. Entries with the value TR_UNMAPPED indicate chars not to be
-        * translated, while TR_DELETE indicates a search char without a
-        * corresponding replacement char under /d.
-        *
-        * In addition, an extra slot at the end is used to store the final
-        * repeating char, or TR_R_EMPTY under an empty replacement list, or
-        * TR_DELETE under /d; which makes the runtime code easier.
-        */
-
-        /* Indicate this is an op_pv */
-        o->op_private &= ~OPpTRANS_USE_SVOP;
-
-        tbl = (OPtrans_map*)PerlMemShared_calloc(struct_size, 1);
-        tbl->size = 256;
-        cPVOPo->op_pv = (char*)tbl;
-
-        for (i = 0; i < len; i++) {
-            STATIC_ASSERT_DECL(TR_SPECIAL_HANDLING == TR_DELETE);
-            short upper = i >= len - 1 ? 256 : (short) t_array[i+1];
-            short to = (short) r_map[i];
-            short j;
-            bool do_increment = TRUE;
-
-            /* Any code points above our limit should be irrelevant */
-            if (t_array[i] >= tbl->size) break;
-
-            /* Set up the map */
-            if (to == (short) TR_SPECIAL_HANDLING && ! del) {
-                to = (short) final_map;
-                do_increment = FALSE;
-            }
-            else if (to < 0) {
-                do_increment = FALSE;
-            }
 
-            /* Create a map for everything in this range.  The value increases
-             * except for the special cases */
-            for (j = (short) t_array[i]; j < upper; j++) {
-                tbl->map[j] = to;
-                if (do_increment) to++;
-            }
+    if (repl) {
+        OP *curop = repl;
+        bool konst;
+        /* If we are looking at s//.../e with a single statement, get past
+           the implicit do{}. */
+        if (curop->op_type == OP_NULL && curop->op_flags & OPf_KIDS
+             && cUNOPx(curop)->op_first->op_type == OP_SCOPE
+             && cUNOPx(curop)->op_first->op_flags & OPf_KIDS)
+         {
+            OP *sib;
+            OP *kid = cUNOPx(cUNOPx(curop)->op_first)->op_first;
+            if (kid->op_type == OP_NULL && (sib = OpSIBLING(kid))
+             && !OpHAS_SIBLING(sib))
+                curop = sib;
+        }
+        if (curop->op_type == OP_CONST)
+            konst = TRUE;
+        else if (( (curop->op_type == OP_RV2SV ||
+                    curop->op_type == OP_RV2AV ||
+                    curop->op_type == OP_RV2HV ||
+                    curop->op_type == OP_RV2GV)
+                   && cUNOPx(curop)->op_first
+                   && cUNOPx(curop)->op_first->op_type == OP_GV )
+                || curop->op_type == OP_PADSV
+                || curop->op_type == OP_PADAV
+                || curop->op_type == OP_PADHV
+                || curop->op_type == OP_PADANY) {
+            repl_has_vars = 1;
+            konst = TRUE;
+        }
+        else konst = FALSE;
+        if (konst
+            && !(repl_has_vars
+                 && (!PM_GETRE(pm)
+                     || !RX_PRELEN(PM_GETRE(pm))
+                     || RX_EXTFLAGS(PM_GETRE(pm)) & RXf_EVAL_SEEN)))
+        {
+            pm->op_pmflags |= PMf_CONST;       /* const for long enough */
+            op_prepend_elem(o->op_type, scalar(repl), o);
         }
+        else {
+            rcop = alloc_LOGOP(OP_SUBSTCONT, scalar(repl), o);
+            rcop->op_private = 1;
 
-        tbl->map[tbl->size] = del
-                              ? (short) TR_DELETE
-                              : (short) rlen
-                                ? (short) final_map
-                                : (short) TR_R_EMPTY;
-        DEBUG_y(PerlIO_printf(Perl_debug_log,"%s: %d\n", __FILE__, __LINE__));
-        for (i = 0; i < tbl->size; i++) {
-            if (tbl->map[i] < 0) {
-                DEBUG_y(PerlIO_printf(Perl_debug_log," %02x=>%d",
-                                                (unsigned) i, tbl->map[i]));
-            }
-            else {
-                DEBUG_y(PerlIO_printf(Perl_debug_log," %02x=>%02x",
-                                                (unsigned) i, tbl->map[i]));
-            }
-            if ((i+1) % 8 == 0 || i + 1 == (short) tbl->size) {
-                DEBUG_y(PerlIO_printf(Perl_debug_log,"\n"));
-            }
+            /* establish postfix order */
+            rcop->op_next = LINKLIST(repl);
+            repl->op_next = (OP*)rcop;
+
+            pm->op_pmreplrootu.op_pmreplroot = scalar((OP*)rcop);
+            assert(!(pm->op_pmflags & PMf_ONCE));
+            pm->op_pmstashstartu.op_pmreplstart = LINKLIST(rcop);
+            rcop->op_next = 0;
         }
-        DEBUG_y(PerlIO_printf(Perl_debug_log,"Final map 0x%x=>%02x\n",
-                                (unsigned) tbl->size, tbl->map[tbl->size]));
+    }
 
-        SvREFCNT_dec(t_invlist);
+    return (OP*)pm;
+}
 
-#if 0   /* code that added excess above-255 chars at the end of the table, in
-           case we ever want to not use the inversion map implementation for
-           this */
+/*
+=for apidoc newSVOP
 
-        ASSUME(j <= rlen);
-        excess = rlen - j;
+Constructs, checks, and returns an op of any type that involves an
+embedded SV.  C<type> is the opcode.  C<flags> gives the eight bits
+of C<op_flags>.  C<sv> gives the SV to embed in the op; this function
+takes ownership of one reference to it.
 
-        if (excess) {
-            /* More replacement chars than search chars:
-             * store excess replacement chars at end of main table.
-             */
+=cut
+*/
 
-            struct_size += excess;
-            tbl = (OPtrans_map*)PerlMemShared_realloc(tbl,
-                        struct_size + excess * sizeof(short));
-            tbl->size += excess;
-            cPVOPo->op_pv = (char*)tbl;
+OP *
+Perl_newSVOP(pTHX_ I32 type, I32 flags, SV *sv)
+{
+    SVOP *svop;
 
-            for (i = 0; i < excess; i++)
-                tbl->map[i + 256] = r[j+i];
-        }
-        else {
-            /* no more replacement chars than search chars */
-        }
-#endif
+    PERL_ARGS_ASSERT_NEWSVOP;
 
-    }
+    /* OP_RUNCV is allowed specially so rpeep has room to convert it into an
+     * OP_CONST */
+    assert((PL_opargs[type] & OA_CLASS_MASK) == OA_SVOP
+        || (PL_opargs[type] & OA_CLASS_MASK) == OA_PVOP_OR_SVOP
+        || (PL_opargs[type] & OA_CLASS_MASK) == OA_FILESTATOP
+        || type == OP_RUNCV
+        || type == OP_CUSTOM);
 
-    DEBUG_y(PerlIO_printf(Perl_debug_log,
-            "/d=%d, /s=%d, /c=%d, identical=%d, grows=%d,"
-            " use_svop=%d, can_force_utf8=%d,\nexpansion=%" NVgf "\n",
-            del, squash, complement,
-            cBOOL(o->op_private & OPpTRANS_IDENTICAL),
-            cBOOL(o->op_private & OPpTRANS_USE_SVOP),
-            cBOOL(o->op_private & OPpTRANS_GROWS),
-            cBOOL(o->op_private & OPpTRANS_CAN_FORCE_UTF8),
-            max_expansion));
+    NewOp(1101, svop, 1, SVOP);
+    OpTYPE_set(svop, type);
+    svop->op_sv = sv;
+    svop->op_next = (OP*)svop;
+    svop->op_flags = (U8)flags;
+    svop->op_private = (U8)(0 | (flags >> 8));
+    if (PL_opargs[type] & OA_RETSCALAR)
+        scalar((OP*)svop);
+    if (PL_opargs[type] & OA_TARGET)
+        svop->op_targ = pad_alloc(type, SVs_PADTMP);
+    return CHECKOP(type, svop);
+}
 
-    Safefree(r_map);
+/*
+=for apidoc newDEFSVOP
 
-    if(del && rlen != 0 && r_count == t_count) {
-        Perl_ck_warner(aTHX_ packWARN(WARN_MISC), "Useless use of /d modifier in transliteration operator");
-    } else if(r_count > t_count) {
-        Perl_ck_warner(aTHX_ packWARN(WARN_MISC), "Replacement list is longer than search list");
-    }
+Constructs and returns an op to access C<$_>.
 
-    op_free(expr);
-    op_free(repl);
+=cut
+*/
 
-    return o;
+OP *
+Perl_newDEFSVOP(pTHX)
+{
+        return newSVREF(newGVOP(OP_GV, 0, PL_defgv));
 }
 
+#ifdef USE_ITHREADS
 
 /*
-=for apidoc newPMOP
+=for apidoc newPADOP
 
-Constructs, checks, and returns an op of any pattern matching type.
-C<type> is the opcode.  C<flags> gives the eight bits of C<op_flags>
-and, shifted up eight bits, the eight bits of C<op_private>.
+Constructs, checks, and returns an op of any type that involves a
+reference to a pad element.  C<type> is the opcode.  C<flags> gives the
+eight bits of C<op_flags>.  A pad slot is automatically allocated, and
+is populated with C<sv>; this function takes ownership of one reference
+to it.
+
+This function only exists if Perl has been compiled to use ithreads.
 
 =cut
 */
 
 OP *
-Perl_newPMOP(pTHX_ I32 type, I32 flags)
+Perl_newPADOP(pTHX_ I32 type, I32 flags, SV *sv)
 {
-    PMOP *pmop;
+    PADOP *padop;
 
-    assert((PL_opargs[type] & OA_CLASS_MASK) == OA_PMOP
+    PERL_ARGS_ASSERT_NEWPADOP;
+
+    assert((PL_opargs[type] & OA_CLASS_MASK) == OA_SVOP
+        || (PL_opargs[type] & OA_CLASS_MASK) == OA_PVOP_OR_SVOP
+        || (PL_opargs[type] & OA_CLASS_MASK) == OA_FILESTATOP
         || type == OP_CUSTOM);
 
-    NewOp(1101, pmop, 1, PMOP);
-    OpTYPE_set(pmop, type);
-    pmop->op_flags = (U8)flags;
-    pmop->op_private = (U8)(0 | (flags >> 8));
+    NewOp(1101, padop, 1, PADOP);
+    OpTYPE_set(padop, type);
+    padop->op_padix =
+        pad_alloc(type, isGV(sv) ? SVf_READONLY : SVs_PADTMP);
+    SvREFCNT_dec(PAD_SVl(padop->op_padix));
+    PAD_SETSV(padop->op_padix, sv);
+    assert(sv);
+    padop->op_next = (OP*)padop;
+    padop->op_flags = (U8)flags;
     if (PL_opargs[type] & OA_RETSCALAR)
-        scalar((OP *)pmop);
+        scalar((OP*)padop);
+    if (PL_opargs[type] & OA_TARGET)
+        padop->op_targ = pad_alloc(type, SVs_PADTMP);
+    return CHECKOP(type, padop);
+}
 
-    if (PL_hints & HINT_RE_TAINT)
-        pmop->op_pmflags |= PMf_RETAINT;
-#ifdef USE_LOCALE_CTYPE
-    if (IN_LC_COMPILETIME(LC_CTYPE)) {
-        set_regex_charset(&(pmop->op_pmflags), REGEX_LOCALE_CHARSET);
-    }
-    else
-#endif
-         if (IN_UNI_8_BIT) {
-        set_regex_charset(&(pmop->op_pmflags), REGEX_UNICODE_CHARSET);
-    }
-    if (PL_hints & HINT_RE_FLAGS) {
-        SV *reflags = Perl_refcounted_he_fetch_pvn(aTHX_
-         PL_compiling.cop_hints_hash, STR_WITH_LEN("reflags"), 0, 0
-        );
-        if (reflags && SvOK(reflags)) pmop->op_pmflags |= SvIV(reflags);
-        reflags = Perl_refcounted_he_fetch_pvn(aTHX_
-         PL_compiling.cop_hints_hash, STR_WITH_LEN("reflags_charset"), 0, 0
-        );
-        if (reflags && SvOK(reflags)) {
-            set_regex_charset(&(pmop->op_pmflags), (regex_charset)SvIV(reflags));
-        }
-    }
+#endif /* USE_ITHREADS */
 
+/*
+=for apidoc newGVOP
 
-#ifdef USE_ITHREADS
-    assert(SvPOK(PL_regex_pad[0]));
-    if (SvCUR(PL_regex_pad[0])) {
-        /* Pop off the "packed" IV from the end.  */
-        SV *const repointer_list = PL_regex_pad[0];
-        const char *p = SvEND(repointer_list) - sizeof(IV);
-        const IV offset = *((IV*)p);
+Constructs, checks, and returns an op of any type that involves an
+embedded reference to a GV.  C<type> is the opcode.  C<flags> gives the
+eight bits of C<op_flags>.  C<gv> identifies the GV that the op should
+reference; calling this function does not transfer ownership of any
+reference to it.
 
-        assert(SvCUR(repointer_list) % sizeof(IV) == 0);
+=cut
+*/
 
-        SvEND_set(repointer_list, p);
+OP *
+Perl_newGVOP(pTHX_ I32 type, I32 flags, GV *gv)
+{
+    PERL_ARGS_ASSERT_NEWGVOP;
 
-        pmop->op_pmoffset = offset;
-        /* This slot should be free, so assert this:  */
-        assert(PL_regex_pad[offset] == &PL_sv_undef);
-    } else {
-        SV * const repointer = &PL_sv_undef;
-        av_push(PL_regex_padav, repointer);
-        pmop->op_pmoffset = av_top_index(PL_regex_padav);
-        PL_regex_pad = AvARRAY(PL_regex_padav);
-    }
+#ifdef USE_ITHREADS
+    return newPADOP(type, flags, SvREFCNT_inc_simple_NN(gv));
+#else
+    return newSVOP(type, flags, SvREFCNT_inc_simple_NN(gv));
 #endif
-
-    return CHECKOP(type, pmop);
 }
 
-static void
-S_set_haseval(pTHX)
-{
-    PADOFFSET i = 1;
-    PL_cv_has_eval = 1;
-    /* Any pad names in scope are potentially lvalues.  */
-    for (; i < PadnamelistMAXNAMED(PL_comppad_name); i++) {
-        PADNAME *pn = PAD_COMPNAME_SV(i);
-        if (!pn || !PadnameLEN(pn))
-            continue;
-        if (PadnameOUTER(pn) || PadnameIN_SCOPE(pn, PL_cop_seqmax))
-            S_mark_padname_lvalue(aTHX_ pn);
-    }
-}
+/*
+=for apidoc newPVOP
 
-/* Given some sort of match op o, and an expression expr containing a
- * pattern, either compile expr into a regex and attach it to o (if it's
- * constant), or convert expr into a runtime regcomp op sequence (if it's
- * not)
- *
- * Flags currently has 2 bits of meaning:
- * 1: isreg indicates that the pattern is part of a regex construct, eg
- *      $x =~ /pattern/ or split /pattern/, as opposed to $x =~ $pattern or
- *      split "pattern", which aren't. In the former case, expr will be a list
- *      if the pattern contains more than one term (eg /a$b/).
- * 2: The pattern is for a split.
- *
- * When the pattern has been compiled within a new anon CV (for
- * qr/(?{...})/ ), then floor indicates the savestack level just before
- * the new sub was created
- *
- * tr/// is also handled.
- */
+Constructs, checks, and returns an op of any type that involves an
+embedded C-level pointer (PV).  C<type> is the opcode.  C<flags> gives
+the eight bits of C<op_flags>.  C<pv> supplies the C-level pointer.
+Depending on the op type, the memory referenced by C<pv> may be freed
+when the op is destroyed.  If the op is of a freeing type, C<pv> must
+have been allocated using C<PerlMemShared_malloc>.
+
+=cut
+*/
 
 OP *
-Perl_pmruntime(pTHX_ OP *o, OP *expr, OP *repl, UV flags, I32 floor)
+Perl_newPVOP(pTHX_ I32 type, I32 flags, char *pv)
 {
-    PMOP *pm;
-    LOGOP *rcop;
-    I32 repl_has_vars = 0;
-    bool is_trans = (o->op_type == OP_TRANS || o->op_type == OP_TRANSR);
-    bool is_compiletime;
-    bool has_code;
-    bool isreg    = cBOOL(flags & 1);
-    bool is_split = cBOOL(flags & 2);
-
-    PERL_ARGS_ASSERT_PMRUNTIME;
-
-    if (is_trans) {
-        return pmtrans(o, expr, repl);
-    }
-
-    /* find whether we have any runtime or code elements;
-     * at the same time, temporarily set the op_next of each DO block;
-     * then when we LINKLIST, this will cause the DO blocks to be excluded
-     * from the op_next chain (and from having LINKLIST recursively
-     * applied to them). We fix up the DOs specially later */
+    const bool utf8 = cBOOL(flags & SVf_UTF8);
+    PVOP *pvop;
 
-    is_compiletime = 1;
-    has_code = 0;
-    if (expr->op_type == OP_LIST) {
-        OP *child;
-        for (child = cLISTOPx(expr)->op_first; child; child = OpSIBLING(child)) {
-            if (child->op_type == OP_NULL && (child->op_flags & OPf_SPECIAL)) {
-                has_code = 1;
-                assert(!child->op_next);
-                if (UNLIKELY(!OpHAS_SIBLING(child))) {
-                    assert(PL_parser && PL_parser->error_count);
-                    /* This can happen with qr/ (?{(^{})/.  Just fake up
-                       the op we were expecting to see, to avoid crashing
-                       elsewhere.  */
-                    op_sibling_splice(expr, child, 0,
-                              newSVOP(OP_CONST, 0, &PL_sv_no));
-                }
-                child->op_next = OpSIBLING(child);
-            }
-            else if (child->op_type != OP_CONST && child->op_type != OP_PUSHMARK)
-            is_compiletime = 0;
-        }
-    }
-    else if (expr->op_type != OP_CONST)
-        is_compiletime = 0;
+    flags &= ~SVf_UTF8;
 
-    LINKLIST(expr);
+    assert((PL_opargs[type] & OA_CLASS_MASK) == OA_PVOP_OR_SVOP
+        || type == OP_CUSTOM
+        || (PL_opargs[type] & OA_CLASS_MASK) == OA_LOOPEXOP);
 
-    /* fix up DO blocks; treat each one as a separate little sub;
-     * also, mark any arrays as LIST/REF */
+    NewOp(1101, pvop, 1, PVOP);
+    OpTYPE_set(pvop, type);
+    pvop->op_pv = pv;
+    pvop->op_next = (OP*)pvop;
+    pvop->op_flags = (U8)flags;
+    pvop->op_private = utf8 ? OPpPV_IS_UTF8 : 0;
+    if (PL_opargs[type] & OA_RETSCALAR)
+        scalar((OP*)pvop);
+    if (PL_opargs[type] & OA_TARGET)
+        pvop->op_targ = pad_alloc(type, SVs_PADTMP);
+    return CHECKOP(type, pvop);
+}
 
-    if (expr->op_type == OP_LIST) {
-        OP *child;
-        for (child = cLISTOPx(expr)->op_first; child; child = OpSIBLING(child)) {
+void
+Perl_package(pTHX_ OP *o)
+{
+    SV *const sv = cSVOPo->op_sv;
 
-            if (child->op_type == OP_PADAV || child->op_type == OP_RV2AV) {
-                assert( !(child->op_flags  & OPf_WANT));
-                /* push the array rather than its contents. The regex
-                 * engine will retrieve and join the elements later */
-                child->op_flags |= (OPf_WANT_LIST | OPf_REF);
-                continue;
-            }
+    PERL_ARGS_ASSERT_PACKAGE;
 
-            if (!(child->op_type == OP_NULL && (child->op_flags & OPf_SPECIAL)))
-                continue;
-            child->op_next = NULL; /* undo temporary hack from above */
-            scalar(child);
-            LINKLIST(child);
-            if (cLISTOPx(child)->op_first->op_type == OP_LEAVE) {
-                LISTOP *leaveop = cLISTOPx(cLISTOPx(child)->op_first);
-                /* skip ENTER */
-                assert(leaveop->op_first->op_type == OP_ENTER);
-                assert(OpHAS_SIBLING(leaveop->op_first));
-                child->op_next = OpSIBLING(leaveop->op_first);
-                /* skip leave */
-                assert(leaveop->op_flags & OPf_KIDS);
-                assert(leaveop->op_last->op_next == (OP*)leaveop);
-                leaveop->op_next = NULL; /* stop on last op */
-                op_null((OP*)leaveop);
-            }
-            else {
-                /* skip SCOPE */
-                OP *scope = cLISTOPx(child)->op_first;
-                assert(scope->op_type == OP_SCOPE);
-                assert(scope->op_flags & OPf_KIDS);
-                scope->op_next = NULL; /* stop on last op */
-                op_null(scope);
-            }
+    SAVEGENERICSV(PL_curstash);
+    save_item(PL_curstname);
 
-            /* XXX optimize_optree() must be called on o before
-             * CALL_PEEP(), as currently S_maybe_multiconcat() can't
-             * currently cope with a peephole-optimised optree.
-             * Calling optimize_optree() here ensures that condition
-             * is met, but may mean optimize_optree() is applied
-             * to the same optree later (where hopefully it won't do any
-             * harm as it can't convert an op to multiconcat if it's
-             * already been converted */
-            optimize_optree(child);
+    PL_curstash = (HV *)SvREFCNT_inc(gv_stashsv(sv, GV_ADD));
 
-            /* have to peep the DOs individually as we've removed it from
-             * the op_next chain */
-            CALL_PEEP(child);
-            S_prune_chain_head(&(child->op_next));
-            if (is_compiletime)
-                /* runtime finalizes as part of finalizing whole tree */
-                finalize_optree(child);
-        }
-    }
-    else if (expr->op_type == OP_PADAV || expr->op_type == OP_RV2AV) {
-        assert( !(expr->op_flags  & OPf_WANT));
-        /* push the array rather than its contents. The regex
-         * engine will retrieve and join the elements later */
-        expr->op_flags |= (OPf_WANT_LIST | OPf_REF);
-    }
+    sv_setsv(PL_curstname, sv);
 
     PL_hints |= HINT_BLOCK_SCOPE;
-    pm = (PMOP*)o;
-    assert(floor==0 || (pm->op_pmflags & PMf_HAS_CV));
+    PL_parser->copline = NOLINE;
 
-    if (is_compiletime) {
-        U32 rx_flags = pm->op_pmflags & RXf_PMf_COMPILETIME;
-        regexp_engine const *eng = current_re_engine();
+    op_free(o);
+}
 
-        if (is_split) {
-            /* make engine handle split ' ' specially */
-            pm->op_pmflags |= PMf_SPLIT;
-            rx_flags |= RXf_SPLIT;
-        }
+void
+Perl_package_version( pTHX_ OP *v )
+{
+    U32 savehints = PL_hints;
+    PERL_ARGS_ASSERT_PACKAGE_VERSION;
+    PL_hints &= ~HINT_STRICT_VARS;
+    sv_setsv( GvSV(gv_fetchpvs("VERSION", GV_ADDMULTI, SVt_PV)), cSVOPx(v)->op_sv );
+    PL_hints = savehints;
+    op_free(v);
+}
 
-        if (!has_code || !eng->op_comp) {
-            /* compile-time simple constant pattern */
+/* Extract the first two components of a "version" object as two 8bit integers
+ * and return them packed into a single U16 in the format of PL_prevailing_version.
+ * This function only ever has to cope with version objects already known
+ * bounded by the current perl version, so we know its components will fit
+ * (Up until we reach perl version 5.256 anyway) */
+static U16 S_extract_shortver(pTHX_ SV *sv)
+{
+    SV *rv;
+    if(!SvRV(sv) || !SvOBJECT(rv = SvRV(sv)) || !sv_derived_from(sv, "version"))
+        return 0;
 
-            if ((pm->op_pmflags & PMf_HAS_CV) && !has_code) {
-                /* whoops! we guessed that a qr// had a code block, but we
-                 * were wrong (e.g. /[(?{}]/ ). Throw away the PL_compcv
-                 * that isn't required now. Note that we have to be pretty
-                 * confident that nothing used that CV's pad while the
-                 * regex was parsed, except maybe op targets for \Q etc.
-                 * If there were any op targets, though, they should have
-                 * been stolen by constant folding.
-                 */
-#ifdef DEBUGGING
-                SSize_t i = 0;
-                assert(PadnamelistMAXNAMED(PL_comppad_name) == 0);
-                while (++i <= AvFILLp(PL_comppad)) {
-#  ifdef USE_PAD_RESET
-                    /* under USE_PAD_RESET, pad swipe replaces a swiped
-                     * folded constant with a fresh padtmp */
-                    assert(!PL_curpad[i] || SvPADTMP(PL_curpad[i]));
-#  else
-                    assert(!PL_curpad[i]);
-#  endif
-                }
-#endif
-                /* This LEAVE_SCOPE will restore PL_compcv to point to the
-                 * outer CV (the one whose slab holds the pm op). The
-                 * inner CV (which holds expr) will be freed later, once
-                 * all the entries on the parse stack have been popped on
-                 * return from this function. Which is why its safe to
-                 * call op_free(expr) below.
-                 */
-                LEAVE_SCOPE(floor);
-                pm->op_pmflags &= ~PMf_HAS_CV;
-            }
+    AV *av = MUTABLE_AV(SvRV(*hv_fetchs(MUTABLE_HV(rv), "version", 0)));
 
-            /* Skip compiling if parser found an error for this pattern */
-            if (pm->op_pmflags & PMf_HAS_ERROR) {
-                return o;
-            }
+    U16 shortver = 0;
 
-            PM_SETRE(pm,
-                eng->op_comp
-                    ? eng->op_comp(aTHX_ NULL, 0, expr, eng, NULL, NULL,
-                                        rx_flags, pm->op_pmflags)
-                    : Perl_re_op_compile(aTHX_ NULL, 0, expr, eng, NULL, NULL,
-                                        rx_flags, pm->op_pmflags)
-            );
-            op_free(expr);
-        }
-        else {
-            /* compile-time pattern that includes literal code blocks */
+    IV major = av_count(av) > 0 ? SvIV(*av_fetch(av, 0, false)) : 0;
+    if(major > 255)
+        shortver |= 255 << 8;
+    else
+        shortver |= major << 8;
 
-            REGEXP* re;
+    IV minor = av_count(av) > 1 ? SvIV(*av_fetch(av, 1, false)) : 0;
+    if(minor > 255)
+        shortver |= 255;
+    else
+        shortver |= minor;
 
-            /* Skip compiling if parser found an error for this pattern */
-            if (pm->op_pmflags & PMf_HAS_ERROR) {
-                return o;
-            }
+    return shortver;
+}
+#define SHORTVER(maj,min) ((maj << 8) | min)
 
-            re = eng->op_comp(aTHX_ NULL, 0, expr, eng, NULL, NULL,
-                        rx_flags,
-                        (pm->op_pmflags |
-                            ((PL_hints & HINT_RE_EVAL) ? PMf_USE_RE_EVAL : 0))
-                    );
-            PM_SETRE(pm, re);
-            if (pm->op_pmflags & PMf_HAS_CV) {
-                CV *cv;
-                /* this QR op (and the anon sub we embed it in) is never
-                 * actually executed. It's just a placeholder where we can
-                 * squirrel away expr in op_code_list without the peephole
-                 * optimiser etc processing it for a second time */
-                OP *qr = newPMOP(OP_QR, 0);
-                ((PMOP*)qr)->op_code_list = expr;
+void
+Perl_utilize(pTHX_ int aver, I32 floor, OP *version, OP *idop, OP *arg)
+{
+    OP *pack;
+    OP *imop;
+    OP *veop;
+    SV *use_version = NULL;
 
-                /* handle the implicit sub{} wrapped round the qr/(?{..})/ */
-                SvREFCNT_inc_simple_void(PL_compcv);
-                cv = newATTRSUB(floor, 0, NULL, NULL, qr);
-                ReANY(re)->qr_anoncv = cv;
+    PERL_ARGS_ASSERT_UTILIZE;
 
-                /* attach the anon CV to the pad so that
-                 * pad_fixup_inner_anons() can find it */
-                (void)pad_add_anon(cv, o->op_type);
-                SvREFCNT_inc_simple_void(cv);
-            }
-            else {
-                pm->op_code_list = expr;
-            }
+    if (idop->op_type != OP_CONST)
+        Perl_croak(aTHX_ "Module name must be constant");
+
+    veop = NULL;
+
+    if (version) {
+        SV * const vesv = cSVOPx(version)->op_sv;
+
+        if (!arg && !SvNIOKp(vesv)) {
+            arg = version;
         }
-    }
-    else {
-        /* runtime pattern: build chain of regcomp etc ops */
-        bool reglist;
-        PADOFFSET cv_targ = 0;
+        else {
+            OP *pack;
+            SV *meth;
 
-        reglist = isreg && expr->op_type == OP_LIST;
-        if (reglist)
-            op_null(expr);
+            if (version->op_type != OP_CONST || !SvNIOKp(vesv))
+                Perl_croak(aTHX_ "Version number must be a constant number");
 
-        if (has_code) {
-            pm->op_code_list = expr;
-            /* don't free op_code_list; its ops are embedded elsewhere too */
-            pm->op_pmflags |= PMf_CODELIST_PRIVATE;
+            /* Make copy of idop so we don't free it twice */
+            pack = newSVOP(OP_CONST, 0, newSVsv(cSVOPx(idop)->op_sv));
+
+            /* Fake up a method call to VERSION */
+            meth = newSVpvs_share("VERSION");
+            veop = op_convert_list(OP_ENTERSUB, OPf_STACKED,
+                            op_append_elem(OP_LIST,
+                                        op_prepend_elem(OP_LIST, pack, version),
+                                        newMETHOP_named(OP_METHOD_NAMED, 0, meth)));
         }
+    }
 
-        if (is_split)
-            /* make engine handle split ' ' specially */
-            pm->op_pmflags |= PMf_SPLIT;
+    /* Fake up an import/unimport */
+    if (arg && arg->op_type == OP_STUB) {
+        imop = arg;            /* no import on explicit () */
+    }
+    else if (SvNIOKp(cSVOPx(idop)->op_sv)) {
+        imop = NULL;           /* use 5.0; */
+        if (aver)
+            use_version = cSVOPx(idop)->op_sv;
+        else
+            idop->op_private |= OPpCONST_NOVER;
+    }
+    else {
+        SV *meth;
 
-        /* the OP_REGCMAYBE is a placeholder in the non-threaded case
-         * to allow its op_next to be pointed past the regcomp and
-         * preceding stacking ops;
-         * OP_REGCRESET is there to reset taint before executing the
-         * stacking ops */
-        if (pm->op_pmflags & PMf_KEEP || TAINTING_get)
-            expr = newUNOP((TAINTING_get ? OP_REGCRESET : OP_REGCMAYBE),0,expr);
+        /* Make copy of idop so we don't free it twice */
+        pack = newSVOP(OP_CONST, 0, newSVsv(cSVOPx(idop)->op_sv));
 
-        if (pm->op_pmflags & PMf_HAS_CV) {
-            /* we have a runtime qr with literal code. This means
-             * that the qr// has been wrapped in a new CV, which
-             * means that runtime consts, vars etc will have been compiled
-             * against a new pad. So... we need to execute those ops
-             * within the environment of the new CV. So wrap them in a call
-             * to a new anon sub. i.e. for
-             *
-             *     qr/a$b(?{...})/,
-             *
-             * we build an anon sub that looks like
-             *
-             *     sub { "a", $b, '(?{...})' }
-             *
-             * and call it, passing the returned list to regcomp.
-             * Or to put it another way, the list of ops that get executed
-             * are:
-             *
-             *     normal              PMf_HAS_CV
-             *     ------              -------------------
-             *                         pushmark (for regcomp)
-             *                         pushmark (for entersub)
-             *                         anoncode
-             *                         srefgen
-             *                         entersub
-             *     regcreset                  regcreset
-             *     pushmark                   pushmark
-             *     const("a")                 const("a")
-             *     gvsv(b)                    gvsv(b)
-             *     const("(?{...})")          const("(?{...})")
-             *                                leavesub
-             *     regcomp             regcomp
-             */
+        /* Fake up a method call to import/unimport */
+        meth = aver
+            ? newSVpvs_share("import") : newSVpvs_share("unimport");
+        imop = op_convert_list(OP_ENTERSUB, OPf_STACKED,
+                       op_append_elem(OP_LIST,
+                                   op_prepend_elem(OP_LIST, pack, arg),
+                                   newMETHOP_named(OP_METHOD_NAMED, 0, meth)
+                       ));
+    }
 
-            SvREFCNT_inc_simple_void(PL_compcv);
-            CvLVALUE_on(PL_compcv);
-            /* these lines are just an unrolled newANONATTRSUB */
-            expr = newSVOP(OP_ANONCODE, 0,
-                    MUTABLE_SV(newATTRSUB(floor, 0, NULL, NULL, expr)));
-            cv_targ = expr->op_targ;
-            expr = newUNOP(OP_REFGEN, 0, expr);
+    /* Fake up the BEGIN {}, which does its thing immediately. */
+    newATTRSUB(floor,
+        newSVOP(OP_CONST, 0, newSVpvs_share("BEGIN")),
+        NULL,
+        NULL,
+        op_append_elem(OP_LINESEQ,
+            op_append_elem(OP_LINESEQ,
+                newSTATEOP(0, NULL, newUNOP(OP_REQUIRE, 0, idop)),
+                newSTATEOP(0, NULL, veop)),
+            newSTATEOP(0, NULL, imop) ));
 
-            expr = list(force_list(newUNOP(OP_ENTERSUB, 0, scalar(expr)), TRUE));
-        }
+    if (use_version) {
+        /* Enable the
+         * feature bundle that corresponds to the required version. */
+        use_version = sv_2mortal(new_version(use_version));
+        S_enable_feature_bundle(aTHX_ use_version);
 
-        rcop = alloc_LOGOP(OP_REGCOMP, scalar(expr), o);
-        rcop->op_flags |=  ((PL_hints & HINT_RE_EVAL) ? OPf_SPECIAL : 0)
-                           | (reglist ? OPf_STACKED : 0);
-        rcop->op_targ = cv_targ;
+        U16 shortver = S_extract_shortver(aTHX_ use_version);
 
-        /* /$x/ may cause an eval, since $x might be qr/(?{..})/  */
-        if (PL_hints & HINT_RE_EVAL)
-            S_set_haseval(aTHX);
+        /* If a version >= 5.11.0 is requested, strictures are on by default! */
+        if (shortver >= SHORTVER(5, 11)) {
+            if (!(PL_hints & HINT_EXPLICIT_STRICT_REFS))
+                PL_hints |= HINT_STRICT_REFS;
+            if (!(PL_hints & HINT_EXPLICIT_STRICT_SUBS))
+                PL_hints |= HINT_STRICT_SUBS;
+            if (!(PL_hints & HINT_EXPLICIT_STRICT_VARS))
+                PL_hints |= HINT_STRICT_VARS;
 
-        /* establish postfix order */
-        if (expr->op_type == OP_REGCRESET || expr->op_type == OP_REGCMAYBE) {
-            LINKLIST(expr);
-            rcop->op_next = expr;
-            ((UNOP*)expr)->op_first->op_next = (OP*)rcop;
+            if (shortver >= SHORTVER(5, 35))
+                free_and_set_cop_warnings(&PL_compiling, pWARN_ALL);
         }
+        /* otherwise they are off */
         else {
-            rcop->op_next = LINKLIST(expr);
-            expr->op_next = (OP*)rcop;
-        }
+            if(PL_prevailing_version >= SHORTVER(5, 11))
+                deprecate_fatal_in(WARN_DEPRECATED__VERSION_DOWNGRADE, "5.40",
+                    "Downgrading a use VERSION declaration to below v5.11");
 
-        op_prepend_elem(o->op_type, scalar((OP*)rcop), o);
-    }
-
-    if (repl) {
-        OP *curop = repl;
-        bool konst;
-        /* If we are looking at s//.../e with a single statement, get past
-           the implicit do{}. */
-        if (curop->op_type == OP_NULL && curop->op_flags & OPf_KIDS
-             && cUNOPx(curop)->op_first->op_type == OP_SCOPE
-             && cUNOPx(curop)->op_first->op_flags & OPf_KIDS)
-         {
-            OP *sib;
-            OP *kid = cUNOPx(cUNOPx(curop)->op_first)->op_first;
-            if (kid->op_type == OP_NULL && (sib = OpSIBLING(kid))
-             && !OpHAS_SIBLING(sib))
-                curop = sib;
-        }
-        if (curop->op_type == OP_CONST)
-            konst = TRUE;
-        else if (( (curop->op_type == OP_RV2SV ||
-                    curop->op_type == OP_RV2AV ||
-                    curop->op_type == OP_RV2HV ||
-                    curop->op_type == OP_RV2GV)
-                   && cUNOPx(curop)->op_first
-                   && cUNOPx(curop)->op_first->op_type == OP_GV )
-                || curop->op_type == OP_PADSV
-                || curop->op_type == OP_PADAV
-                || curop->op_type == OP_PADHV
-                || curop->op_type == OP_PADANY) {
-            repl_has_vars = 1;
-            konst = TRUE;
-        }
-        else konst = FALSE;
-        if (konst
-            && !(repl_has_vars
-                 && (!PM_GETRE(pm)
-                     || !RX_PRELEN(PM_GETRE(pm))
-                     || RX_EXTFLAGS(PM_GETRE(pm)) & RXf_EVAL_SEEN)))
-        {
-            pm->op_pmflags |= PMf_CONST;       /* const for long enough */
-            op_prepend_elem(o->op_type, scalar(repl), o);
+            if (!(PL_hints & HINT_EXPLICIT_STRICT_REFS))
+                PL_hints &= ~HINT_STRICT_REFS;
+            if (!(PL_hints & HINT_EXPLICIT_STRICT_SUBS))
+                PL_hints &= ~HINT_STRICT_SUBS;
+            if (!(PL_hints & HINT_EXPLICIT_STRICT_VARS))
+                PL_hints &= ~HINT_STRICT_VARS;
         }
-        else {
-            rcop = alloc_LOGOP(OP_SUBSTCONT, scalar(repl), o);
-            rcop->op_private = 1;
-
-            /* establish postfix order */
-            rcop->op_next = LINKLIST(repl);
-            repl->op_next = (OP*)rcop;
 
-            pm->op_pmreplrootu.op_pmreplroot = scalar((OP*)rcop);
-            assert(!(pm->op_pmflags & PMf_ONCE));
-            pm->op_pmstashstartu.op_pmreplstart = LINKLIST(rcop);
-            rcop->op_next = 0;
-        }
+        PL_prevailing_version = shortver;
     }
 
-    return (OP*)pm;
+    /* The "did you use incorrect case?" warning used to be here.
+     * The problem is that on case-insensitive filesystems one
+     * might get false positives for "use" (and "require"):
+     * "use Strict" or "require CARP" will work.  This causes
+     * portability problems for the script: in case-strict
+     * filesystems the script will stop working.
+     *
+     * The "incorrect case" warning checked whether "use Foo"
+     * imported "Foo" to your namespace, but that is wrong, too:
+     * there is no requirement nor promise in the language that
+     * a Foo.pm should or would contain anything in package "Foo".
+     *
+     * There is very little Configure-wise that can be done, either:
+     * the case-sensitivity of the build filesystem of Perl does not
+     * help in guessing the case-sensitivity of the runtime environment.
+     */
+
+    PL_hints |= HINT_BLOCK_SCOPE;
+    PL_parser->copline = NOLINE;
+    COP_SEQMAX_INC; /* Purely for B::*'s benefit */
 }
 
 /*
-=for apidoc newSVOP
+=for apidoc_section $embedding
 
-Constructs, checks, and returns an op of any type that involves an
-embedded SV.  C<type> is the opcode.  C<flags> gives the eight bits
-of C<op_flags>.  C<sv> gives the SV to embed in the op; this function
-takes ownership of one reference to it.
+=for apidoc      load_module
+=for apidoc_item load_module_nocontext
 
-=cut
-*/
+These load the module whose name is pointed to by the string part of C<name>.
+Note that the actual module name, not its filename, should be given.
+Eg, "Foo::Bar" instead of "Foo/Bar.pm". ver, if specified and not NULL,
+provides version semantics similar to C<use Foo::Bar VERSION>. The optional
+trailing arguments can be used to specify arguments to the module's C<import()>
+method, similar to C<use Foo::Bar VERSION LIST>; their precise handling depends
+on the flags. The flags argument is a bitwise-ORed collection of any of
+C<PERL_LOADMOD_DENY>, C<PERL_LOADMOD_NOIMPORT>, or C<PERL_LOADMOD_IMPORT_OPS>
+(or 0 for no flags).
 
-OP *
-Perl_newSVOP(pTHX_ I32 type, I32 flags, SV *sv)
-{
-    SVOP *svop;
+If C<PERL_LOADMOD_NOIMPORT> is set, the module is loaded as if with an empty
+import list, as in C<use Foo::Bar ()>; this is the only circumstance in which
+the trailing optional arguments may be omitted entirely. Otherwise, if
+C<PERL_LOADMOD_IMPORT_OPS> is set, the trailing arguments must consist of
+exactly one C<OP*>, containing the op tree that produces the relevant import
+arguments. Otherwise, the trailing arguments must all be C<SV*> values that
+will be used as import arguments; and the list must be terminated with C<(SV*)
+NULL>. If neither C<PERL_LOADMOD_NOIMPORT> nor C<PERL_LOADMOD_IMPORT_OPS> is
+set, the trailing C<NULL> pointer is needed even if no import arguments are
+desired. The reference count for each specified C<SV*> argument is
+decremented. In addition, the C<name> argument is modified.
 
-    PERL_ARGS_ASSERT_NEWSVOP;
+If C<PERL_LOADMOD_DENY> is set, the module is loaded as if with C<no> rather
+than C<use>.
 
-    assert((PL_opargs[type] & OA_CLASS_MASK) == OA_SVOP
-        || (PL_opargs[type] & OA_CLASS_MASK) == OA_PVOP_OR_SVOP
-        || (PL_opargs[type] & OA_CLASS_MASK) == OA_FILESTATOP
-        || type == OP_CUSTOM);
+C<load_module> and C<load_module_nocontext> have the same apparent signature,
+but the former hides the fact that it is accessing a thread context parameter.
+So use the latter when you get a compilation error about C<pTHX>.
 
-    NewOp(1101, svop, 1, SVOP);
-    OpTYPE_set(svop, type);
-    svop->op_sv = sv;
-    svop->op_next = (OP*)svop;
-    svop->op_flags = (U8)flags;
-    svop->op_private = (U8)(0 | (flags >> 8));
-    if (PL_opargs[type] & OA_RETSCALAR)
-        scalar((OP*)svop);
-    if (PL_opargs[type] & OA_TARGET)
-        svop->op_targ = pad_alloc(type, SVs_PADTMP);
-    return CHECKOP(type, svop);
-}
+=for apidoc Amnh||PERL_LOADMOD_DENY
+=for apidoc Amnh||PERL_LOADMOD_NOIMPORT
+=for apidoc Amnh||PERL_LOADMOD_IMPORT_OPS
 
-/*
-=for apidoc newDEFSVOP
+=for apidoc vload_module
+Like C<L</load_module>> but the arguments are an encapsulated argument list.
 
-Constructs and returns an op to access C<$_>.
+=cut */
 
-=cut
-*/
+void
+Perl_load_module(pTHX_ U32 flags, SV *name, SV *ver, ...)
+{
+    va_list args;
 
-OP *
-Perl_newDEFSVOP(pTHX)
+    PERL_ARGS_ASSERT_LOAD_MODULE;
+
+    va_start(args, ver);
+    vload_module(flags, name, ver, &args);
+    va_end(args);
+}
+
+#ifdef MULTIPLICITY
+void
+Perl_load_module_nocontext(U32 flags, SV *name, SV *ver, ...)
 {
-        return newSVREF(newGVOP(OP_GV, 0, PL_defgv));
+    dTHX;
+    va_list args;
+    PERL_ARGS_ASSERT_LOAD_MODULE_NOCONTEXT;
+    va_start(args, ver);
+    vload_module(flags, name, ver, &args);
+    va_end(args);
 }
+#endif
 
-#ifdef USE_ITHREADS
+void
+Perl_vload_module(pTHX_ U32 flags, SV *name, SV *ver, va_list *args)
+{
+    OP *veop, *imop;
+    OP * modname;
+    I32 floor;
 
-/*
-=for apidoc newPADOP
+    PERL_ARGS_ASSERT_VLOAD_MODULE;
 
-Constructs, checks, and returns an op of any type that involves a
-reference to a pad element.  C<type> is the opcode.  C<flags> gives the
-eight bits of C<op_flags>.  A pad slot is automatically allocated, and
-is populated with C<sv>; this function takes ownership of one reference
-to it.
+    /* utilize() fakes up a BEGIN { require ..; import ... }, so make sure
+     * that it has a PL_parser to play with while doing that, and also
+     * that it doesn't mess with any existing parser, by creating a tmp
+     * new parser with lex_start(). This won't actually be used for much,
+     * since pp_require() will create another parser for the real work.
+     * The ENTER/LEAVE pair protect callers from any side effects of use.
+     *
+     * start_subparse() creates a new PL_compcv. This means that any ops
+     * allocated below will be allocated from that CV's op slab, and so
+     * will be automatically freed if the utilise() fails
+     */
 
-This function only exists if Perl has been compiled to use ithreads.
+    ENTER;
+    SAVEVPTR(PL_curcop);
+    lex_start(NULL, NULL, LEX_START_SAME_FILTER);
+    floor = start_subparse(FALSE, 0);
 
-=cut
-*/
+    modname = newSVOP(OP_CONST, 0, name);
+    modname->op_private |= OPpCONST_BARE;
+    if (ver) {
+        veop = newSVOP(OP_CONST, 0, ver);
+    }
+    else
+        veop = NULL;
+    if (flags & PERL_LOADMOD_NOIMPORT) {
+        imop = sawparens(newNULLLIST());
+    }
+    else if (flags & PERL_LOADMOD_IMPORT_OPS) {
+        imop = va_arg(*args, OP*);
+    }
+    else {
+        SV *sv;
+        imop = NULL;
+        sv = va_arg(*args, SV*);
+        while (sv) {
+            imop = op_append_elem(OP_LIST, imop, newSVOP(OP_CONST, 0, sv));
+            sv = va_arg(*args, SV*);
+        }
+    }
 
-OP *
-Perl_newPADOP(pTHX_ I32 type, I32 flags, SV *sv)
+    utilize(!(flags & PERL_LOADMOD_DENY), floor, veop, modname, imop);
+    LEAVE;
+}
+
+PERL_STATIC_INLINE OP *
+S_new_entersubop(pTHX_ GV *gv, OP *arg)
 {
-    PADOP *padop;
+    return newUNOP(OP_ENTERSUB, OPf_STACKED,
+                   newLISTOP(OP_LIST, 0, arg,
+                             newUNOP(OP_RV2CV, 0,
+                                     newGVOP(OP_GV, 0, gv))));
+}
 
-    PERL_ARGS_ASSERT_NEWPADOP;
+OP *
+Perl_dofile(pTHX_ OP *term, I32 force_builtin)
+{
+    OP *doop;
+    GV *gv;
 
-    assert((PL_opargs[type] & OA_CLASS_MASK) == OA_SVOP
-        || (PL_opargs[type] & OA_CLASS_MASK) == OA_PVOP_OR_SVOP
-        || (PL_opargs[type] & OA_CLASS_MASK) == OA_FILESTATOP
-        || type == OP_CUSTOM);
+    PERL_ARGS_ASSERT_DOFILE;
 
-    NewOp(1101, padop, 1, PADOP);
-    OpTYPE_set(padop, type);
-    padop->op_padix =
-        pad_alloc(type, isGV(sv) ? SVf_READONLY : SVs_PADTMP);
-    SvREFCNT_dec(PAD_SVl(padop->op_padix));
-    PAD_SETSV(padop->op_padix, sv);
-    assert(sv);
-    padop->op_next = (OP*)padop;
-    padop->op_flags = (U8)flags;
-    if (PL_opargs[type] & OA_RETSCALAR)
-        scalar((OP*)padop);
-    if (PL_opargs[type] & OA_TARGET)
-        padop->op_targ = pad_alloc(type, SVs_PADTMP);
-    return CHECKOP(type, padop);
+    if (!force_builtin && (gv = gv_override("do", 2))) {
+        doop = S_new_entersubop(aTHX_ gv, term);
+    }
+    else {
+        doop = newUNOP(OP_DOFILE, 0, scalar(term));
+    }
+    return doop;
 }
 
-#endif /* USE_ITHREADS */
-
 /*
-=for apidoc newGVOP
+=for apidoc_section $optree_construction
 
-Constructs, checks, and returns an op of any type that involves an
-embedded reference to a GV.  C<type> is the opcode.  C<flags> gives the
-eight bits of C<op_flags>.  C<gv> identifies the GV that the op should
-reference; calling this function does not transfer ownership of any
-reference to it.
+=for apidoc newSLICEOP
+
+Constructs, checks, and returns an C<lslice> (list slice) op.  C<flags>
+gives the eight bits of C<op_flags>, except that C<OPf_KIDS> will
+be set automatically, and, shifted up eight bits, the eight bits of
+C<op_private>, except that the bit with value 1 or 2 is automatically
+set as required.  C<listval> and C<subscript> supply the parameters of
+the slice; they are consumed by this function and become part of the
+constructed op tree.
 
 =cut
 */
 
 OP *
-Perl_newGVOP(pTHX_ I32 type, I32 flags, GV *gv)
+Perl_newSLICEOP(pTHX_ I32 flags, OP *subscript, OP *listval)
 {
-    PERL_ARGS_ASSERT_NEWGVOP;
-
-#ifdef USE_ITHREADS
-    return newPADOP(type, flags, SvREFCNT_inc_simple_NN(gv));
-#else
-    return newSVOP(type, flags, SvREFCNT_inc_simple_NN(gv));
-#endif
+    return newBINOP(OP_LSLICE, flags,
+            list(op_force_list(subscript)),
+            list(op_force_list(listval)));
 }
 
-/*
-=for apidoc newPVOP
-
-Constructs, checks, and returns an op of any type that involves an
-embedded C-level pointer (PV).  C<type> is the opcode.  C<flags> gives
-the eight bits of C<op_flags>.  C<pv> supplies the C-level pointer.
-Depending on the op type, the memory referenced by C<pv> may be freed
-when the op is destroyed.  If the op is of a freeing type, C<pv> must
-have been allocated using C<PerlMemShared_malloc>.
+#define ASSIGN_SCALAR 0
+#define ASSIGN_LIST   1
+#define ASSIGN_REF    2
 
-=cut
-*/
+/* given the optree o on the LHS of an assignment, determine whether its:
+ *  ASSIGN_SCALAR   $x  = ...
+ *  ASSIGN_LIST    ($x) = ...
+ *  ASSIGN_REF     \$x  = ...
+ */
 
-OP *
-Perl_newPVOP(pTHX_ I32 type, I32 flags, char *pv)
+STATIC I32
+S_assignment_type(pTHX_ const OP *o)
 {
-    const bool utf8 = cBOOL(flags & SVf_UTF8);
-    PVOP *pvop;
-
-    flags &= ~SVf_UTF8;
+    unsigned type;
+    U8 flags;
+    U8 ret;
 
-    assert((PL_opargs[type] & OA_CLASS_MASK) == OA_PVOP_OR_SVOP
-        || type == OP_RUNCV || type == OP_CUSTOM
-        || (PL_opargs[type] & OA_CLASS_MASK) == OA_LOOPEXOP);
+    if (!o)
+        return ASSIGN_LIST;
 
-    NewOp(1101, pvop, 1, PVOP);
-    OpTYPE_set(pvop, type);
-    pvop->op_pv = pv;
-    pvop->op_next = (OP*)pvop;
-    pvop->op_flags = (U8)flags;
-    pvop->op_private = utf8 ? OPpPV_IS_UTF8 : 0;
-    if (PL_opargs[type] & OA_RETSCALAR)
-        scalar((OP*)pvop);
-    if (PL_opargs[type] & OA_TARGET)
-        pvop->op_targ = pad_alloc(type, SVs_PADTMP);
-    return CHECKOP(type, pvop);
-}
+    if (o->op_type == OP_SREFGEN)
+    {
+        OP * const kid = cUNOPx(cUNOPo->op_first)->op_first;
+        type = kid->op_type;
+        flags = o->op_flags | kid->op_flags;
+        if (!(flags & OPf_PARENS)
+          && (kid->op_type == OP_RV2AV || kid->op_type == OP_PADAV ||
+              kid->op_type == OP_RV2HV || kid->op_type == OP_PADHV ))
+            return ASSIGN_REF;
+        ret = ASSIGN_REF;
+    } else {
+        if ((o->op_type == OP_NULL) && (o->op_flags & OPf_KIDS))
+            o = cUNOPo->op_first;
+        flags = o->op_flags;
+        type = o->op_type;
+        ret = ASSIGN_SCALAR;
+    }
 
-void
-Perl_package(pTHX_ OP *o)
-{
-    SV *const sv = cSVOPo->op_sv;
+    if (type == OP_COND_EXPR) {
+        OP * const sib = OpSIBLING(cLOGOPo->op_first);
+        const I32 t = assignment_type(sib);
+        const I32 f = assignment_type(OpSIBLING(sib));
 
-    PERL_ARGS_ASSERT_PACKAGE;
+        if (t == ASSIGN_LIST && f == ASSIGN_LIST)
+            return ASSIGN_LIST;
+        if ((t == ASSIGN_LIST) ^ (f == ASSIGN_LIST))
+            yyerror("Assignment to both a list and a scalar");
+        return ASSIGN_SCALAR;
+    }
 
-    SAVEGENERICSV(PL_curstash);
-    save_item(PL_curstname);
+    if (type == OP_LIST &&
+        (flags & OPf_WANT) == OPf_WANT_SCALAR &&
+        o->op_private & OPpLVAL_INTRO)
+        return ret;
 
-    PL_curstash = (HV *)SvREFCNT_inc(gv_stashsv(sv, GV_ADD));
+    if (type == OP_LIST || flags & OPf_PARENS ||
+        type == OP_RV2AV || type == OP_RV2HV ||
+        type == OP_ASLICE || type == OP_HSLICE ||
+        type == OP_KVASLICE || type == OP_KVHSLICE || type == OP_REFGEN)
+        return ASSIGN_LIST;
 
-    sv_setsv(PL_curstname, sv);
+    if (type == OP_PADAV || type == OP_PADHV)
+        return ASSIGN_LIST;
 
-    PL_hints |= HINT_BLOCK_SCOPE;
-    PL_parser->copline = NOLINE;
+    if (type == OP_RV2SV)
+        return ret;
 
-    op_free(o);
+    return ret;
 }
 
-void
-Perl_package_version( pTHX_ OP *v )
+static OP *
+S_newONCEOP(pTHX_ OP *initop, OP *padop)
 {
-    U32 savehints = PL_hints;
-    PERL_ARGS_ASSERT_PACKAGE_VERSION;
-    PL_hints &= ~HINT_STRICT_VARS;
-    sv_setsv( GvSV(gv_fetchpvs("VERSION", GV_ADDMULTI, SVt_PV)), cSVOPx(v)->op_sv );
-    PL_hints = savehints;
-    op_free(v);
-}
+    const PADOFFSET target = padop->op_targ;
+    OP *const other = newOP(OP_PADSV,
+                            padop->op_flags
+                            | ((padop->op_private & ~OPpLVAL_INTRO) << 8));
+    OP *const first = newOP(OP_NULL, 0);
+    OP *const nullop = newCONDOP(0, first, initop, other);
+    /* XXX targlex disabled for now; see ticket #124160
+        newCONDOP(0, first, S_maybe_targlex(aTHX_ initop), other);
+     */
+    OP *const condop = first->op_next;
 
-/* Extract the first two components of a "version" object as two 8bit integers
- * and return them packed into a single U16 in the format of PL_prevailing_version.
- * This function only ever has to cope with version objects already known
- * bounded by the current perl version, so we know its components will fit
- * (Up until we reach perl version 5.256 anyway) */
-static U16 S_extract_shortver(pTHX_ SV *sv)
-{
-    SV *rv;
-    if(!SvRV(sv) || !SvOBJECT(rv = SvRV(sv)) || !sv_derived_from(sv, "version"))
-        return 0;
+    OpTYPE_set(condop, OP_ONCE);
+    other->op_targ = target;
+    nullop->op_flags |= OPf_WANT_SCALAR;
 
-    AV *av = MUTABLE_AV(SvRV(*hv_fetchs(MUTABLE_HV(rv), "version", 0)));
+    /* Store the initializedness of state vars in a separate
+       pad entry.  */
+    condop->op_targ =
+      pad_add_name_pvn("$",1,padadd_NO_DUP_CHECK|padadd_STATE,0,0);
+    /* hijacking PADSTALE for uninitialized state variables */
+    SvPADSTALE_on(PAD_SVl(condop->op_targ));
 
-    U16 shortver = 0;
+    return nullop;
+}
 
-    IV major = av_count(av) > 0 ? SvIV(*av_fetch(av, 0, false)) : 0;
-    if(major > 255)
-        shortver |= 255 << 8;
-    else
-        shortver |= major << 8;
+/*
+=for apidoc newARGDEFELEMOP
 
-    IV minor = av_count(av) > 1 ? SvIV(*av_fetch(av, 1, false)) : 0;
-    if(minor > 255)
-        shortver |= 255;
-    else
-        shortver |= minor;
+Constructs and returns a new C<OP_ARGDEFELEM> op which provides a defaulting
+expression given by C<expr> for the signature parameter at the index given
+by C<argindex>. The expression optree is consumed by this function and
+becomes part of the returned optree.
 
-    return shortver;
-}
-#define SHORTVER(maj,min) ((maj << 8) | min)
+=cut
+*/
 
-void
-Perl_utilize(pTHX_ int aver, I32 floor, OP *version, OP *idop, OP *arg)
+OP *
+Perl_newARGDEFELEMOP(pTHX_ I32 flags, OP *expr, I32 argindex)
 {
-    OP *pack;
-    OP *imop;
-    OP *veop;
-    SV *use_version = NULL;
+    PERL_ARGS_ASSERT_NEWARGDEFELEMOP;
 
-    PERL_ARGS_ASSERT_UTILIZE;
+    OP *o = (OP *)alloc_LOGOP(OP_ARGDEFELEM, expr, LINKLIST(expr));
+    o->op_flags |= (U8)(flags);
+    o->op_private = 1 | (U8)(flags >> 8);
 
-    if (idop->op_type != OP_CONST)
-        Perl_croak(aTHX_ "Module name must be constant");
+    /* re-purpose op_targ to hold @_ index */
+    o->op_targ = (PADOFFSET)(argindex);
 
-    veop = NULL;
+    return o;
+}
 
-    if (version) {
-        SV * const vesv = ((SVOP*)version)->op_sv;
+/*
+=for apidoc newASSIGNOP
 
-        if (!arg && !SvNIOKp(vesv)) {
-            arg = version;
-        }
-        else {
-            OP *pack;
-            SV *meth;
+Constructs, checks, and returns an assignment op.  C<left> and C<right>
+supply the parameters of the assignment; they are consumed by this
+function and become part of the constructed op tree.
 
-            if (version->op_type != OP_CONST || !SvNIOKp(vesv))
-                Perl_croak(aTHX_ "Version number must be a constant number");
+If C<optype> is C<OP_ANDASSIGN>, C<OP_ORASSIGN>, or C<OP_DORASSIGN>, then
+a suitable conditional optree is constructed.  If C<optype> is the opcode
+of a binary operator, such as C<OP_BIT_OR>, then an op is constructed that
+performs the binary operation and assigns the result to the left argument.
+Either way, if C<optype> is non-zero then C<flags> has no effect.
 
-            /* Make copy of idop so we don't free it twice */
-            pack = newSVOP(OP_CONST, 0, newSVsv(((SVOP*)idop)->op_sv));
+If C<optype> is zero, then a plain scalar or list assignment is
+constructed.  Which type of assignment it is is automatically determined.
+C<flags> gives the eight bits of C<op_flags>, except that C<OPf_KIDS>
+will be set automatically, and, shifted up eight bits, the eight bits
+of C<op_private>, except that the bit with value 1 or 2 is automatically
+set as required.
 
-            /* Fake up a method call to VERSION */
-            meth = newSVpvs_share("VERSION");
-            veop = op_convert_list(OP_ENTERSUB, OPf_STACKED|OPf_SPECIAL,
-                            op_append_elem(OP_LIST,
-                                        op_prepend_elem(OP_LIST, pack, version),
-                                        newMETHOP_named(OP_METHOD_NAMED, 0, meth)));
-        }
-    }
+=cut
+*/
 
-    /* Fake up an import/unimport */
-    if (arg && arg->op_type == OP_STUB) {
-        imop = arg;            /* no import on explicit () */
-    }
-    else if (SvNIOKp(((SVOP*)idop)->op_sv)) {
-        imop = NULL;           /* use 5.0; */
-        if (aver)
-            use_version = ((SVOP*)idop)->op_sv;
-        else
-            idop->op_private |= OPpCONST_NOVER;
+OP *
+Perl_newASSIGNOP(pTHX_ I32 flags, OP *left, I32 optype, OP *right)
+{
+    OP *o;
+    I32 assign_type;
+
+    switch (optype) {
+        case 0: break;
+        case OP_ANDASSIGN:
+        case OP_ORASSIGN:
+        case OP_DORASSIGN:
+            right = scalar(right);
+            return newLOGOP(optype, 0,
+                op_lvalue(scalar(left), optype),
+                newBINOP(OP_SASSIGN, OPpASSIGN_BACKWARDS<<8, right, right));
+        default:
+            return newBINOP(optype, OPf_STACKED,
+                op_lvalue(scalar(left), optype), scalar(right));
     }
-    else {
-        SV *meth;
 
-        /* Make copy of idop so we don't free it twice */
-        pack = newSVOP(OP_CONST, 0, newSVsv(((SVOP*)idop)->op_sv));
+    if ((assign_type = assignment_type(left)) == ASSIGN_LIST) {
+        OP *state_var_op = NULL;
+        static const char no_list_state[] = "Initialization of state variables"
+            " in list currently forbidden";
+        OP *curop;
 
-        /* Fake up a method call to import/unimport */
-        meth = aver
-            ? newSVpvs_share("import") : newSVpvs_share("unimport");
-        imop = op_convert_list(OP_ENTERSUB, OPf_STACKED|OPf_SPECIAL,
-                       op_append_elem(OP_LIST,
-                                   op_prepend_elem(OP_LIST, pack, arg),
-                                   newMETHOP_named(OP_METHOD_NAMED, 0, meth)
-                       ));
-    }
+        if (left->op_type == OP_ASLICE || left->op_type == OP_HSLICE)
+            left->op_private &= ~ OPpSLICEWARNING;
 
-    /* Fake up the BEGIN {}, which does its thing immediately. */
-    newATTRSUB(floor,
-        newSVOP(OP_CONST, 0, newSVpvs_share("BEGIN")),
-        NULL,
-        NULL,
-        op_append_elem(OP_LINESEQ,
-            op_append_elem(OP_LINESEQ,
-                newSTATEOP(0, NULL, newUNOP(OP_REQUIRE, 0, idop)),
-                newSTATEOP(0, NULL, veop)),
-            newSTATEOP(0, NULL, imop) ));
+        PL_modcount = 0;
+        left = op_lvalue(left, OP_AASSIGN);
+        curop = list(op_force_list(left));
+        o = newBINOP(OP_AASSIGN, flags, list(op_force_list(right)), curop);
+        o->op_private = (U8)(0 | (flags >> 8));
 
-    if (use_version) {
-        /* Enable the
-         * feature bundle that corresponds to the required version. */
-        use_version = sv_2mortal(new_version(use_version));
-        S_enable_feature_bundle(aTHX_ use_version);
+        if (OP_TYPE_IS_OR_WAS(left, OP_LIST))
+        {
+            OP *lop = cLISTOPx(left)->op_first, *vop, *eop;
+            if (!(left->op_flags & OPf_PARENS) &&
+                    lop->op_type == OP_PUSHMARK &&
+                    (vop = OpSIBLING(lop)) &&
+                    (vop->op_type == OP_PADAV || vop->op_type == OP_PADHV) &&
+                    !(vop->op_flags & OPf_PARENS) &&
+                    (vop->op_private & (OPpLVAL_INTRO|OPpPAD_STATE)) ==
+                        (OPpLVAL_INTRO|OPpPAD_STATE) &&
+                    (eop = OpSIBLING(vop)) &&
+                    eop->op_type == OP_ENTERSUB &&
+                    !OpHAS_SIBLING(eop)) {
+                state_var_op = vop;
+            } else {
+                while (lop) {
+                    if ((lop->op_type == OP_PADSV ||
+                         lop->op_type == OP_PADAV ||
+                         lop->op_type == OP_PADHV ||
+                         lop->op_type == OP_PADANY)
+                      && (lop->op_private & OPpPAD_STATE)
+                    )
+                        yyerror(no_list_state);
+                    lop = OpSIBLING(lop);
+                }
+            }
+        }
+        else if (  (left->op_private & OPpLVAL_INTRO)
+                && (left->op_private & OPpPAD_STATE)
+                && (   left->op_type == OP_PADSV
+                    || left->op_type == OP_PADAV
+                    || left->op_type == OP_PADHV
+                    || left->op_type == OP_PADANY)
+        ) {
+                /* All single variable list context state assignments, hence
+                   state ($a) = ...
+                   (state $a) = ...
+                   state @a = ...
+                   state (@a) = ...
+                   (state @a) = ...
+                   state %a = ...
+                   state (%a) = ...
+                   (state %a) = ...
+                */
+                if (left->op_flags & OPf_PARENS)
+                    yyerror(no_list_state);
+                else
+                    state_var_op = left;
+        }
 
-        U16 shortver = S_extract_shortver(aTHX_ use_version);
+        /* optimise @a = split(...) into:
+        * @{expr}:              split(..., @{expr}) (where @a is not flattened)
+        * @a, my @a, local @a:  split(...)          (where @a is attached to
+        *                                            the split op itself)
+        */
 
-        /* If a version >= 5.11.0 is requested, strictures are on by default! */
-        if (shortver >= SHORTVER(5, 11)) {
-            if (!(PL_hints & HINT_EXPLICIT_STRICT_REFS))
-                PL_hints |= HINT_STRICT_REFS;
-            if (!(PL_hints & HINT_EXPLICIT_STRICT_SUBS))
-                PL_hints |= HINT_STRICT_SUBS;
-            if (!(PL_hints & HINT_EXPLICIT_STRICT_VARS))
-                PL_hints |= HINT_STRICT_VARS;
+        if (   right
+            && right->op_type == OP_SPLIT
+            /* don't do twice, e.g. @b = (@a = split) */
+            && !(right->op_private & OPpSPLIT_ASSIGN))
+        {
+            OP *gvop = NULL;
 
-            if (shortver >= SHORTVER(5, 35))
-                free_and_set_cop_warnings(&PL_compiling, pWARN_ALL);
-        }
-        /* otherwise they are off */
-        else {
-            if(PL_prevailing_version >= SHORTVER(5, 11))
-                deprecate_fatal_in("5.40",
-                    "Downgrading a use VERSION declaration to below v5.11");
+            if (   (  left->op_type == OP_RV2AV
+                   && (gvop=cUNOPx(left)->op_first)->op_type==OP_GV)
+                || left->op_type == OP_PADAV)
+            {
+                /* @pkg or @lex or local @pkg' or 'my @lex' */
+                OP *tmpop;
+                if (gvop) {
+#ifdef USE_ITHREADS
+                    cPMOPx(right)->op_pmreplrootu.op_pmtargetoff
+                        = cPADOPx(gvop)->op_padix;
+                    cPADOPx(gvop)->op_padix = 0;       /* steal it */
+#else
+                    cPMOPx(right)->op_pmreplrootu.op_pmtargetgv
+                        = MUTABLE_GV(cSVOPx(gvop)->op_sv);
+                    cSVOPx(gvop)->op_sv = NULL;        /* steal it */
+#endif
+                    right->op_private |=
+                        left->op_private & OPpOUR_INTRO;
+                }
+                else {
+                    cPMOPx(right)->op_pmreplrootu.op_pmtargetoff = left->op_targ;
+                    left->op_targ = 0; /* steal it */
+                    right->op_private |= OPpSPLIT_LEX;
+                }
+                right->op_private |= left->op_private & OPpLVAL_INTRO;
 
-            if (!(PL_hints & HINT_EXPLICIT_STRICT_REFS))
-                PL_hints &= ~HINT_STRICT_REFS;
-            if (!(PL_hints & HINT_EXPLICIT_STRICT_SUBS))
-                PL_hints &= ~HINT_STRICT_SUBS;
-            if (!(PL_hints & HINT_EXPLICIT_STRICT_VARS))
-                PL_hints &= ~HINT_STRICT_VARS;
+              detach_split:
+                tmpop = cUNOPo->op_first;      /* to list (nulled) */
+                tmpop = cUNOPx(tmpop)->op_first; /* to pushmark */
+                assert(OpSIBLING(tmpop) == right);
+                assert(!OpHAS_SIBLING(right));
+                /* detach the split subtreee from the o tree,
+                 * then free the residual o tree */
+                op_sibling_splice(cUNOPo->op_first, tmpop, 1, NULL);
+                op_free(o);                    /* blow off assign */
+                right->op_private |= OPpSPLIT_ASSIGN;
+                right->op_flags &= ~OPf_WANT;
+                        /* "I don't know and I don't care." */
+                return right;
+            }
+            else if (left->op_type == OP_RV2AV) {
+                /* @{expr} */
+
+                OP *pushop = cUNOPx(cBINOPo->op_last)->op_first;
+                assert(OpSIBLING(pushop) == left);
+                /* Detach the array ...  */
+                op_sibling_splice(cBINOPo->op_last, pushop, 1, NULL);
+                /* ... and attach it to the split.  */
+                op_sibling_splice(right, cLISTOPx(right)->op_last,
+                                  0, left);
+                right->op_flags |= OPf_STACKED;
+                /* Detach split and expunge aassign as above.  */
+                goto detach_split;
+            }
+            else if (PL_modcount < RETURN_UNLIMITED_NUMBER &&
+                    cLISTOPx(right)->op_last->op_type == OP_CONST)
+            {
+                /* convert split(...,0) to split(..., PL_modcount+1) */
+                SV ** const svp =
+                    &cSVOPx(cLISTOPx(right)->op_last)->op_sv;
+                SV * const sv = *svp;
+                if (SvIOK(sv) && SvIVX(sv) == 0)
+                {
+                  if (right->op_private & OPpSPLIT_IMPLIM) {
+                    /* our own SV, created in ck_split */
+                    SvREADONLY_off(sv);
+                    sv_setiv(sv, PL_modcount+1);
+                  }
+                  else {
+                    /* SV may belong to someone else */
+                    SvREFCNT_dec(sv);
+                    *svp = newSViv(PL_modcount+1);
+                  }
+                }
+            }
         }
 
-        PL_prevailing_version = shortver;
+        if (state_var_op)
+            o = S_newONCEOP(aTHX_ o, state_var_op);
+        return o;
     }
-
-    /* The "did you use incorrect case?" warning used to be here.
-     * The problem is that on case-insensitive filesystems one
-     * might get false positives for "use" (and "require"):
-     * "use Strict" or "require CARP" will work.  This causes
-     * portability problems for the script: in case-strict
-     * filesystems the script will stop working.
-     *
-     * The "incorrect case" warning checked whether "use Foo"
-     * imported "Foo" to your namespace, but that is wrong, too:
-     * there is no requirement nor promise in the language that
-     * a Foo.pm should or would contain anything in package "Foo".
-     *
-     * There is very little Configure-wise that can be done, either:
-     * the case-sensitivity of the build filesystem of Perl does not
-     * help in guessing the case-sensitivity of the runtime environment.
-     */
-
-    PL_hints |= HINT_BLOCK_SCOPE;
-    PL_parser->copline = NOLINE;
-    COP_SEQMAX_INC; /* Purely for B::*'s benefit */
+    if (assign_type == ASSIGN_REF)
+        return newBINOP(OP_REFASSIGN, flags, scalar(right), left);
+    if (!right)
+        right = newOP(OP_UNDEF, 0);
+    if (right->op_type == OP_READLINE) {
+        right->op_flags |= OPf_STACKED;
+        return newBINOP(OP_NULL, flags, op_lvalue(scalar(left), OP_SASSIGN),
+                scalar(right));
+    }
+    else {
+        o = newBINOP(OP_SASSIGN, flags,
+            scalar(right), op_lvalue(scalar(left), OP_SASSIGN) );
+    }
+    return o;
 }
 
 /*
-=for apidoc_section $embedding
-
-=for apidoc      load_module
-=for apidoc_item load_module_nocontext
+=for apidoc newSTATEOP
 
-These load the module whose name is pointed to by the string part of C<name>.
-Note that the actual module name, not its filename, should be given.
-Eg, "Foo::Bar" instead of "Foo/Bar.pm". ver, if specified and not NULL,
-provides version semantics similar to C<use Foo::Bar VERSION>. The optional
-trailing arguments can be used to specify arguments to the module's C<import()>
-method, similar to C<use Foo::Bar VERSION LIST>; their precise handling depends
-on the flags. The flags argument is a bitwise-ORed collection of any of
-C<PERL_LOADMOD_DENY>, C<PERL_LOADMOD_NOIMPORT>, or C<PERL_LOADMOD_IMPORT_OPS>
-(or 0 for no flags).
-
-If C<PERL_LOADMOD_NOIMPORT> is set, the module is loaded as if with an empty
-import list, as in C<use Foo::Bar ()>; this is the only circumstance in which
-the trailing optional arguments may be omitted entirely. Otherwise, if
-C<PERL_LOADMOD_IMPORT_OPS> is set, the trailing arguments must consist of
-exactly one C<OP*>, containing the op tree that produces the relevant import
-arguments. Otherwise, the trailing arguments must all be C<SV*> values that
-will be used as import arguments; and the list must be terminated with C<(SV*)
-NULL>. If neither C<PERL_LOADMOD_NOIMPORT> nor C<PERL_LOADMOD_IMPORT_OPS> is
-set, the trailing C<NULL> pointer is needed even if no import arguments are
-desired. The reference count for each specified C<SV*> argument is
-decremented. In addition, the C<name> argument is modified.
-
-If C<PERL_LOADMOD_DENY> is set, the module is loaded as if with C<no> rather
-than C<use>.
-
-C<load_module> and C<load_module_nocontext> have the same apparent signature,
-but the former hides the fact that it is accessing a thread context parameter.
-So use the latter when you get a compilation error about C<pTHX>.
-
-=for apidoc Amnh||PERL_LOADMOD_DENY
-=for apidoc Amnh||PERL_LOADMOD_NOIMPORT
-=for apidoc Amnh||PERL_LOADMOD_IMPORT_OPS
-
-=for apidoc vload_module
-Like C<L</load_module>> but the arguments are an encapsulated argument list.
-
-=cut */
-
-void
-Perl_load_module(pTHX_ U32 flags, SV *name, SV *ver, ...)
-{
-    va_list args;
-
-    PERL_ARGS_ASSERT_LOAD_MODULE;
+Constructs a state op (COP).  The state op is normally a C<nextstate> op,
+but will be a C<dbstate> op if debugging is enabled for currently-compiled
+code.  The state op is populated from C<PL_curcop> (or C<PL_compiling>).
+If C<label> is non-null, it supplies the name of a label to attach to
+the state op; this function takes ownership of the memory pointed at by
+C<label>, and will free it.  C<flags> gives the eight bits of C<op_flags>
+for the state op.
 
-    va_start(args, ver);
-    vload_module(flags, name, ver, &args);
-    va_end(args);
-}
+If C<o> is null, the state op is returned.  Otherwise the state op is
+combined with C<o> into a C<lineseq> list op, which is returned.  C<o>
+is consumed by this function and becomes part of the returned op tree.
 
-#ifdef MULTIPLICITY
-void
-Perl_load_module_nocontext(U32 flags, SV *name, SV *ver, ...)
-{
-    dTHX;
-    va_list args;
-    PERL_ARGS_ASSERT_LOAD_MODULE_NOCONTEXT;
-    va_start(args, ver);
-    vload_module(flags, name, ver, &args);
-    va_end(args);
-}
-#endif
+=cut
+*/
 
-void
-Perl_vload_module(pTHX_ U32 flags, SV *name, SV *ver, va_list *args)
+OP *
+Perl_newSTATEOP(pTHX_ I32 flags, char *label, OP *o)
 {
-    OP *veop, *imop;
-    OP * modname;
-    I32 floor;
-
-    PERL_ARGS_ASSERT_VLOAD_MODULE;
+    const U32 seq = intro_my();
+    const U32 utf8 = flags & SVf_UTF8;
+    COP *cop;
 
-    /* utilize() fakes up a BEGIN { require ..; import ... }, so make sure
-     * that it has a PL_parser to play with while doing that, and also
-     * that it doesn't mess with any existing parser, by creating a tmp
-     * new parser with lex_start(). This won't actually be used for much,
-     * since pp_require() will create another parser for the real work.
-     * The ENTER/LEAVE pair protect callers from any side effects of use.
-     *
-     * start_subparse() creates a new PL_compcv. This means that any ops
-     * allocated below will be allocated from that CV's op slab, and so
-     * will be automatically freed if the utilise() fails
-     */
+    assert(PL_parser);
+    PL_parser->parsed_sub = 0;
 
-    ENTER;
-    SAVEVPTR(PL_curcop);
-    lex_start(NULL, NULL, LEX_START_SAME_FILTER);
-    floor = start_subparse(FALSE, 0);
+    flags &= ~SVf_UTF8;
 
-    modname = newSVOP(OP_CONST, 0, name);
-    modname->op_private |= OPpCONST_BARE;
-    if (ver) {
-        veop = newSVOP(OP_CONST, 0, ver);
-    }
-    else
-        veop = NULL;
-    if (flags & PERL_LOADMOD_NOIMPORT) {
-        imop = sawparens(newNULLLIST());
-    }
-    else if (flags & PERL_LOADMOD_IMPORT_OPS) {
-        imop = va_arg(*args, OP*);
+    NewOp(1101, cop, 1, COP);
+    if (PERLDB_LINE && CopLINE(PL_curcop) && PL_curstash != PL_debstash) {
+        OpTYPE_set(cop, OP_DBSTATE);
     }
     else {
-        SV *sv;
-        imop = NULL;
-        sv = va_arg(*args, SV*);
-        while (sv) {
-            imop = op_append_elem(OP_LIST, imop, newSVOP(OP_CONST, 0, sv));
-            sv = va_arg(*args, SV*);
-        }
+        OpTYPE_set(cop, OP_NEXTSTATE);
     }
+    cop->op_flags = (U8)flags;
+    CopHINTS_set(cop, PL_hints);
+#ifdef VMS
+    if (VMSISH_HUSHED) cop->op_private |= OPpHUSH_VMSISH;
+#endif
+    cop->op_next = (OP*)cop;
 
-    utilize(!(flags & PERL_LOADMOD_DENY), floor, veop, modname, imop);
-    LEAVE;
-}
-
-PERL_STATIC_INLINE OP *
-S_new_entersubop(pTHX_ GV *gv, OP *arg)
-{
-    return newUNOP(OP_ENTERSUB, OPf_STACKED,
-                   newLISTOP(OP_LIST, 0, arg,
-                             newUNOP(OP_RV2CV, 0,
-                                     newGVOP(OP_GV, 0, gv))));
-}
-
-OP *
-Perl_dofile(pTHX_ OP *term, I32 force_builtin)
-{
-    OP *doop;
-    GV *gv;
+    cop->cop_seq = seq;
+    cop->cop_warnings = DUP_WARNINGS(PL_curcop->cop_warnings);
+    CopHINTHASH_set(cop, cophh_copy(CopHINTHASH_get(PL_curcop)));
+    CopFEATURES_setfrom(cop, PL_curcop);
+    if (label) {
+        Perl_cop_store_label(aTHX_ cop, label, strlen(label), utf8);
 
-    PERL_ARGS_ASSERT_DOFILE;
+        PL_hints |= HINT_BLOCK_SCOPE;
+        /* It seems that we need to defer freeing this pointer, as other parts
+           of the grammar end up wanting to copy it after this op has been
+           created. */
+        SAVEFREEPV(label);
+    }
 
-    if (!force_builtin && (gv = gv_override("do", 2))) {
-        doop = S_new_entersubop(aTHX_ gv, term);
+    if (PL_parser->preambling != NOLINE) {
+        CopLINE_set(cop, PL_parser->preambling);
+        PL_parser->copline = NOLINE;
     }
+    else if (PL_parser->copline == NOLINE)
+        CopLINE_set(cop, CopLINE(PL_curcop));
     else {
-        doop = newUNOP(OP_DOFILE, 0, scalar(term));
+        CopLINE_set(cop, PL_parser->copline);
+        PL_parser->copline = NOLINE;
     }
-    return doop;
+#ifdef USE_ITHREADS
+    CopFILE_copy(cop, PL_curcop);
+#else
+    CopFILEGV_set(cop, CopFILEGV(PL_curcop));
+#endif
+    CopSTASH_set(cop, PL_curstash);
+
+    if (cop->op_type == OP_DBSTATE) {
+        /* this line can have a breakpoint - store the cop in IV */
+        AV *av = CopFILEAVx(PL_curcop);
+        if (av) {
+            SV * const * const svp = av_fetch(av, CopLINE(cop), FALSE);
+            if (svp && *svp != &PL_sv_undef ) {
+                (void)SvIOK_on(*svp);
+                SvIV_set(*svp, PTR2IV(cop));
+            }
+        }
+    }
+
+    if (flags & OPf_SPECIAL)
+        op_null((OP*)cop);
+    return op_prepend_elem(OP_LINESEQ, (OP*)cop, o);
 }
 
 /*
-=for apidoc_section $optree_construction
-
-=for apidoc newSLICEOP
+=for apidoc newLOGOP
 
-Constructs, checks, and returns an C<lslice> (list slice) op.  C<flags>
-gives the eight bits of C<op_flags>, except that C<OPf_KIDS> will
-be set automatically, and, shifted up eight bits, the eight bits of
-C<op_private>, except that the bit with value 1 or 2 is automatically
-set as required.  C<listval> and C<subscript> supply the parameters of
-the slice; they are consumed by this function and become part of the
-constructed op tree.
+Constructs, checks, and returns a logical (flow control) op.  C<type>
+is the opcode.  C<flags> gives the eight bits of C<op_flags>, except
+that C<OPf_KIDS> will be set automatically, and, shifted up eight bits,
+the eight bits of C<op_private>, except that the bit with value 1 is
+automatically set.  C<first> supplies the expression controlling the
+flow, and C<other> supplies the side (alternate) chain of ops; they are
+consumed by this function and become part of the constructed op tree.
 
 =cut
 */
 
 OP *
-Perl_newSLICEOP(pTHX_ I32 flags, OP *subscript, OP *listval)
+Perl_newLOGOP(pTHX_ I32 type, I32 flags, OP *first, OP *other)
 {
-    return newBINOP(OP_LSLICE, flags,
-            list(force_list(subscript, TRUE)),
-            list(force_list(listval,   TRUE)));
+    PERL_ARGS_ASSERT_NEWLOGOP;
+
+    return new_logop(type, flags, &first, &other);
 }
 
-#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  = ...
+/* 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 I32
-S_assignment_type(pTHX_ const OP *o)
+STATIC OP *
+S_search_const(pTHX_ OP *o)
 {
-    unsigned type;
-    U8 flags;
-    U8 ret;
+    PERL_ARGS_ASSERT_SEARCH_CONST;
 
-    if (!o)
-        return ASSIGN_LIST;
+  redo:
+    switch (o->op_type) {
+        case OP_CONST:
+            return o;
+        case OP_NULL:
+            if (o->op_flags & OPf_KIDS) {
+                o = cUNOPo->op_first;
+                goto redo;
+            }
+            break;
+        case OP_LEAVE:
+        case OP_SCOPE:
+        case OP_LINESEQ:
+        {
+            OP *kid;
+            if (!(o->op_flags & OPf_KIDS))
+                return NULL;
+            kid = cLISTOPo->op_first;
 
-    if (o->op_type == OP_SREFGEN)
-    {
-        OP * const kid = cUNOPx(cUNOPo->op_first)->op_first;
-        type = kid->op_type;
-        flags = o->op_flags | kid->op_flags;
-        if (!(flags & OPf_PARENS)
-          && (kid->op_type == OP_RV2AV || kid->op_type == OP_PADAV ||
-              kid->op_type == OP_RV2HV || kid->op_type == OP_PADHV ))
-            return ASSIGN_REF;
-        ret = ASSIGN_REF;
-    } else {
-        if ((o->op_type == OP_NULL) && (o->op_flags & OPf_KIDS))
-            o = cUNOPo->op_first;
-        flags = o->op_flags;
-        type = o->op_type;
-        ret = ASSIGN_SCALAR;
-    }
-
-    if (type == OP_COND_EXPR) {
-        OP * const sib = OpSIBLING(cLOGOPo->op_first);
-        const I32 t = assignment_type(sib);
-        const I32 f = assignment_type(OpSIBLING(sib));
+            do {
+                switch (kid->op_type) {
+                    case OP_ENTER:
+                    case OP_NULL:
+                    case OP_NEXTSTATE:
+                        kid = OpSIBLING(kid);
+                        break;
+                    default:
+                        if (kid != cLISTOPo->op_last)
+                            return NULL;
+                        goto last;
+                }
+            } while (kid);
 
-        if (t == ASSIGN_LIST && f == ASSIGN_LIST)
-            return ASSIGN_LIST;
-        if ((t == ASSIGN_LIST) ^ (f == ASSIGN_LIST))
-            yyerror("Assignment to both a list and a scalar");
-        return ASSIGN_SCALAR;
+            if (!kid)
+                kid = cLISTOPo->op_last;
+          last:
+             o = kid;
+             goto redo;
+        }
     }
 
-    if (type == OP_LIST &&
-        (flags & OPf_WANT) == OPf_WANT_SCALAR &&
-        o->op_private & OPpLVAL_INTRO)
-        return ret;
+    return NULL;
+}
 
-    if (type == OP_LIST || flags & OPf_PARENS ||
-        type == OP_RV2AV || type == OP_RV2HV ||
-        type == OP_ASLICE || type == OP_HSLICE ||
-        type == OP_KVASLICE || type == OP_KVHSLICE || type == OP_REFGEN)
-        return ASSIGN_LIST;
 
-    if (type == OP_PADAV || type == OP_PADHV)
-        return ASSIGN_LIST;
+STATIC OP *
+S_new_logop(pTHX_ I32 type, I32 flags, OP** firstp, OP** otherp)
+{
+    LOGOP *logop;
+    OP *o;
+    OP *first;
+    OP *other;
+    OP *cstop = NULL;
+    int prepend_not = 0;
 
-    if (type == OP_RV2SV)
-        return ret;
+    PERL_ARGS_ASSERT_NEW_LOGOP;
 
-    return ret;
-}
+    first = *firstp;
+    other = *otherp;
 
-static OP *
-S_newONCEOP(pTHX_ OP *initop, OP *padop)
-{
-    const PADOFFSET target = padop->op_targ;
-    OP *const other = newOP(OP_PADSV,
-                            padop->op_flags
-                            | ((padop->op_private & ~OPpLVAL_INTRO) << 8));
-    OP *const first = newOP(OP_NULL, 0);
-    OP *const nullop = newCONDOP(0, first, initop, other);
-    /* XXX targlex disabled for now; see ticket #124160
-        newCONDOP(0, first, S_maybe_targlex(aTHX_ initop), other);
+    /* [perl #59802]: Warn about things like "return $a or $b", which
+       is parsed as "(return $a) or $b" rather than "return ($a or
+       $b)".  NB: This also applies to xor, which is why we do it
+       here.
      */
-    OP *const condop = first->op_next;
+    switch (first->op_type) {
+    case OP_NEXT:
+    case OP_LAST:
+    case OP_REDO:
+        /* XXX: Perhaps we should emit a stronger warning for these.
+           Even with the high-precedence operator they don't seem to do
+           anything sensible.
 
-    OpTYPE_set(condop, OP_ONCE);
-    other->op_targ = target;
-    nullop->op_flags |= OPf_WANT_SCALAR;
+           But until we do, fall through here.
+         */
+    case OP_RETURN:
+    case OP_EXIT:
+    case OP_DIE:
+    case OP_GOTO:
+        /* XXX: Currently we allow people to "shoot themselves in the
+           foot" by explicitly writing "(return $a) or $b".
 
-    /* Store the initializedness of state vars in a separate
-       pad entry.  */
-    condop->op_targ =
-      pad_add_name_pvn("$",1,padadd_NO_DUP_CHECK|padadd_STATE,0,0);
-    /* hijacking PADSTALE for uninitialized state variables */
-    SvPADSTALE_on(PAD_SVl(condop->op_targ));
+           Warn unless we are looking at the result from folding or if
+           the programmer explicitly grouped the operators like this.
+           The former can occur with e.g.
 
-    return nullop;
-}
+                use constant FEATURE => ( $] >= ... );
+                sub { not FEATURE and return or do_stuff(); }
+         */
+        if (!first->op_folded && !(first->op_flags & OPf_PARENS))
+            Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
+                           "Possible precedence issue with control flow operator");
+        /* XXX: Should we optimze this to "return $a;" (i.e. remove
+           the "or $b" part)?
+        */
+        break;
+    }
 
-/*
-=for apidoc newASSIGNOP
+    if (type == OP_XOR)                /* Not short circuit, but here by precedence. */
+        return newBINOP(type, flags, scalar(first), scalar(other));
 
-Constructs, checks, and returns an assignment op.  C<left> and C<right>
-supply the parameters of the assignment; they are consumed by this
-function and become part of the constructed op tree.
+    assert((PL_opargs[type] & OA_CLASS_MASK) == OA_LOGOP
+        || type == OP_CUSTOM);
 
-If C<optype> is C<OP_ANDASSIGN>, C<OP_ORASSIGN>, or C<OP_DORASSIGN>, then
-a suitable conditional optree is constructed.  If C<optype> is the opcode
-of a binary operator, such as C<OP_BIT_OR>, then an op is constructed that
-performs the binary operation and assigns the result to the left argument.
-Either way, if C<optype> is non-zero then C<flags> has no effect.
+    scalarboolean(first);
 
-If C<optype> is zero, then a plain scalar or list assignment is
-constructed.  Which type of assignment it is is automatically determined.
-C<flags> gives the eight bits of C<op_flags>, except that C<OPf_KIDS>
-will be set automatically, and, shifted up eight bits, the eight bits
-of C<op_private>, except that the bit with value 1 or 2 is automatically
-set as required.
+    /* search for a constant op that could let us fold the test */
+    if ((cstop = search_const(first))) {
+        if (cstop->op_private & OPpCONST_STRICT)
+            no_bareword_allowed(cstop);
+        else if ((cstop->op_private & OPpCONST_BARE))
+                Perl_ck_warner(aTHX_ packWARN(WARN_BAREWORD), "Bareword found in conditional");
+        if ((type == OP_AND &&  SvTRUE(cSVOPx(cstop)->op_sv)) ||
+            (type == OP_OR  && !SvTRUE(cSVOPx(cstop)->op_sv)) ||
+            (type == OP_DOR && !SvOK(cSVOPx(cstop)->op_sv))) {
+            /* Elide the (constant) lhs, since it can't affect the outcome */
+            *firstp = NULL;
+            if (other->op_type == OP_CONST)
+                other->op_private |= OPpCONST_SHORTCIRCUIT;
+            op_free(first);
+            if (other->op_type == OP_LEAVE)
+                other = newUNOP(OP_NULL, OPf_SPECIAL, other);
+            else if (other->op_type == OP_MATCH
+                  || other->op_type == OP_SUBST
+                  || other->op_type == OP_TRANSR
+                  || other->op_type == OP_TRANS)
+                /* Mark the op as being unbindable with =~ */
+                other->op_flags |= OPf_SPECIAL;
 
-=cut
-*/
+            other->op_folded = 1;
+            return other;
+        }
+        else {
+            /* Elide the rhs, since the outcome is entirely determined by
+             * the (constant) lhs */
 
-OP *
-Perl_newASSIGNOP(pTHX_ I32 flags, OP *left, I32 optype, OP *right)
-{
-    OP *o;
-    I32 assign_type;
+            /* check for C<my $x if 0>, or C<my($x,$y) if 0> */
+            const OP *o2 = other;
+            if ( ! (o2->op_type == OP_LIST
+                    && (( o2 = cUNOPx(o2)->op_first))
+                    && o2->op_type == OP_PUSHMARK
+                    && (( o2 = OpSIBLING(o2))) )
+            )
+                o2 = other;
+            if ((o2->op_type == OP_PADSV || o2->op_type == OP_PADAV
+                        || o2->op_type == OP_PADHV)
+                && o2->op_private & OPpLVAL_INTRO
+                && !(o2->op_private & OPpPAD_STATE))
+            {
+        Perl_croak(aTHX_ "This use of my() in false conditional is "
+                          "no longer allowed");
+            }
 
-    switch (optype) {
-        case 0: break;
-        case OP_ANDASSIGN:
-        case OP_ORASSIGN:
-        case OP_DORASSIGN:
-            right = scalar(right);
-            return newLOGOP(optype, 0,
-                op_lvalue(scalar(left), optype),
-                newBINOP(OP_SASSIGN, OPpASSIGN_BACKWARDS<<8, right, right));
-        default:
-            return newBINOP(optype, OPf_STACKED,
-                op_lvalue(scalar(left), optype), scalar(right));
+            *otherp = NULL;
+            if (cstop->op_type == OP_CONST)
+                cstop->op_private |= OPpCONST_SHORTCIRCUIT;
+            op_free(other);
+            return first;
+        }
     }
-
-    if ((assign_type = assignment_type(left)) == ASSIGN_LIST) {
-        OP *state_var_op = NULL;
-        static const char no_list_state[] = "Initialization of state variables"
-            " in list currently forbidden";
-        OP *curop;
-
-        if (left->op_type == OP_ASLICE || left->op_type == OP_HSLICE)
-            left->op_private &= ~ OPpSLICEWARNING;
-
-        PL_modcount = 0;
-        left = op_lvalue(left, OP_AASSIGN);
-        curop = list(force_list(left, TRUE));
-        o = newBINOP(OP_AASSIGN, flags, list(force_list(right, TRUE)), curop);
-        o->op_private = (U8)(0 | (flags >> 8));
-
-        if (OP_TYPE_IS_OR_WAS(left, OP_LIST))
+    else if ((first->op_flags & OPf_KIDS) && type != OP_DOR
+        && ckWARN(WARN_MISC)) /* [#24076] Don't warn for <FH> err FOO. */
+    {
+        const OP * const k1 = cUNOPx(first)->op_first;
+        const OP * const k2 = OpSIBLING(k1);
+        OPCODE warnop = 0;
+        switch (first->op_type)
         {
-            OP *lop = ((LISTOP*)left)->op_first, *vop, *eop;
-            if (!(left->op_flags & OPf_PARENS) &&
-                    lop->op_type == OP_PUSHMARK &&
-                    (vop = OpSIBLING(lop)) &&
-                    (vop->op_type == OP_PADAV || vop->op_type == OP_PADHV) &&
-                    !(vop->op_flags & OPf_PARENS) &&
-                    (vop->op_private & (OPpLVAL_INTRO|OPpPAD_STATE)) ==
-                        (OPpLVAL_INTRO|OPpPAD_STATE) &&
-                    (eop = OpSIBLING(vop)) &&
-                    eop->op_type == OP_ENTERSUB &&
-                    !OpHAS_SIBLING(eop)) {
-                state_var_op = vop;
-            } else {
-                while (lop) {
-                    if ((lop->op_type == OP_PADSV ||
-                         lop->op_type == OP_PADAV ||
-                         lop->op_type == OP_PADHV ||
-                         lop->op_type == OP_PADANY)
-                      && (lop->op_private & OPpPAD_STATE)
-                    )
-                        yyerror(no_list_state);
-                    lop = OpSIBLING(lop);
-                }
-            }
-        }
-        else if (  (left->op_private & OPpLVAL_INTRO)
-                && (left->op_private & OPpPAD_STATE)
-                && (   left->op_type == OP_PADSV
-                    || left->op_type == OP_PADAV
-                    || left->op_type == OP_PADHV
-                    || left->op_type == OP_PADANY)
-        ) {
-                /* All single variable list context state assignments, hence
-                   state ($a) = ...
-                   (state $a) = ...
-                   state @a = ...
-                   state (@a) = ...
-                   (state @a) = ...
-                   state %a = ...
-                   state (%a) = ...
-                   (state %a) = ...
-                */
-                if (left->op_flags & OPf_PARENS)
-                    yyerror(no_list_state);
-                else
-                    state_var_op = left;
-        }
-
-        /* optimise @a = split(...) into:
-        * @{expr}:              split(..., @{expr}) (where @a is not flattened)
-        * @a, my @a, local @a:  split(...)          (where @a is attached to
-        *                                            the split op itself)
-        */
-
-        if (   right
-            && right->op_type == OP_SPLIT
-            /* don't do twice, e.g. @b = (@a = split) */
-            && !(right->op_private & OPpSPLIT_ASSIGN))
-        {
-            OP *gvop = NULL;
-
-            if (   (  left->op_type == OP_RV2AV
-                   && (gvop=((UNOP*)left)->op_first)->op_type==OP_GV)
-                || left->op_type == OP_PADAV)
+        case OP_NULL:
+            if (k2 && k2->op_type == OP_READLINE
+                  && (k2->op_flags & OPf_STACKED)
+                  && ((k1->op_flags & OPf_WANT) == OPf_WANT_SCALAR))
             {
-                /* @pkg or @lex or local @pkg' or 'my @lex' */
-                OP *tmpop;
-                if (gvop) {
-#ifdef USE_ITHREADS
-                    ((PMOP*)right)->op_pmreplrootu.op_pmtargetoff
-                        = cPADOPx(gvop)->op_padix;
-                    cPADOPx(gvop)->op_padix = 0;       /* steal it */
-#else
-                    ((PMOP*)right)->op_pmreplrootu.op_pmtargetgv
-                        = MUTABLE_GV(cSVOPx(gvop)->op_sv);
-                    cSVOPx(gvop)->op_sv = NULL;        /* steal it */
-#endif
-                    right->op_private |=
-                        left->op_private & OPpOUR_INTRO;
-                }
-                else {
-                    ((PMOP*)right)->op_pmreplrootu.op_pmtargetoff = left->op_targ;
-                    left->op_targ = 0; /* steal it */
-                    right->op_private |= OPpSPLIT_LEX;
-                }
-                right->op_private |= left->op_private & OPpLVAL_INTRO;
-
-              detach_split:
-                tmpop = cUNOPo->op_first;      /* to list (nulled) */
-                tmpop = ((UNOP*)tmpop)->op_first; /* to pushmark */
-                assert(OpSIBLING(tmpop) == right);
-                assert(!OpHAS_SIBLING(right));
-                /* detach the split subtreee from the o tree,
-                 * then free the residual o tree */
-                op_sibling_splice(cUNOPo->op_first, tmpop, 1, NULL);
-                op_free(o);                    /* blow off assign */
-                right->op_private |= OPpSPLIT_ASSIGN;
-                right->op_flags &= ~OPf_WANT;
-                        /* "I don't know and I don't care." */
-                return right;
+                warnop = k2->op_type;
             }
-            else if (left->op_type == OP_RV2AV) {
-                /* @{expr} */
+            break;
 
-                OP *pushop = cUNOPx(cBINOPo->op_last)->op_first;
-                assert(OpSIBLING(pushop) == left);
-                /* Detach the array ...  */
-                op_sibling_splice(cBINOPo->op_last, pushop, 1, NULL);
-                /* ... and attach it to the split.  */
-                op_sibling_splice(right, cLISTOPx(right)->op_last,
-                                  0, left);
-                right->op_flags |= OPf_STACKED;
-                /* Detach split and expunge aassign as above.  */
-                goto detach_split;
-            }
-            else if (PL_modcount < RETURN_UNLIMITED_NUMBER &&
-                    ((LISTOP*)right)->op_last->op_type == OP_CONST)
+        case OP_SASSIGN:
+            if (k1->op_type == OP_READDIR
+                  || k1->op_type == OP_GLOB
+                  || (k1->op_type == OP_NULL && k1->op_targ == OP_GLOB)
+                 || k1->op_type == OP_EACH
+                 || k1->op_type == OP_AEACH)
             {
-                /* convert split(...,0) to split(..., PL_modcount+1) */
-                SV ** const svp =
-                    &((SVOP*)((LISTOP*)right)->op_last)->op_sv;
-                SV * const sv = *svp;
-                if (SvIOK(sv) && SvIVX(sv) == 0)
-                {
-                  if (right->op_private & OPpSPLIT_IMPLIM) {
-                    /* our own SV, created in ck_split */
-                    SvREADONLY_off(sv);
-                    sv_setiv(sv, PL_modcount+1);
-                  }
-                  else {
-                    /* SV may belong to someone else */
-                    SvREFCNT_dec(sv);
-                    *svp = newSViv(PL_modcount+1);
-                  }
-                }
+                warnop = ((k1->op_type == OP_NULL)
+                          ? (OPCODE)k1->op_targ : k1->op_type);
             }
+            break;
+        }
+        if (warnop) {
+            const line_t oldline = CopLINE(PL_curcop);
+            /* This ensures that warnings are reported at the first line
+               of the construction, not the last.  */
+            CopLINE_set(PL_curcop, PL_parser->copline);
+            Perl_warner(aTHX_ packWARN(WARN_MISC),
+                 "Value of %s%s can be \"0\"; test with defined()",
+                 PL_op_desc[warnop],
+                 ((warnop == OP_READLINE || warnop == OP_GLOB)
+                  ? " construct" : "() operator"));
+            CopLINE_set(PL_curcop, oldline);
         }
-
-        if (state_var_op)
-            o = S_newONCEOP(aTHX_ o, state_var_op);
-        return o;
-    }
-    if (assign_type == ASSIGN_REF)
-        return newBINOP(OP_REFASSIGN, flags, scalar(right), left);
-    if (!right)
-        right = newOP(OP_UNDEF, 0);
-    if (right->op_type == OP_READLINE) {
-        right->op_flags |= OPf_STACKED;
-        return newBINOP(OP_NULL, flags, op_lvalue(scalar(left), OP_SASSIGN),
-                scalar(right));
     }
-    else {
-        o = newBINOP(OP_SASSIGN, flags,
-            scalar(right), op_lvalue(scalar(left), OP_SASSIGN) );
+
+    /* optimize AND and OR ops that have NOTs as children */
+    if (first->op_type == OP_NOT
+        && (first->op_flags & OPf_KIDS)
+        && ((first->op_flags & OPf_SPECIAL) /* unless ($x) { } */
+            || (other->op_type == OP_NOT))  /* if (!$x && !$y) { } */
+        ) {
+        if (type == OP_AND || type == OP_OR) {
+            if (type == OP_AND)
+                type = OP_OR;
+            else
+                type = OP_AND;
+            op_null(first);
+            if (other->op_type == OP_NOT) { /* !a AND|OR !b => !(a OR|AND b) */
+                op_null(other);
+                prepend_not = 1; /* prepend a NOT op later */
+            }
+        }
     }
+
+    logop = alloc_LOGOP(type, first, LINKLIST(other));
+    logop->op_flags |= (U8)flags;
+    logop->op_private = (U8)(1 | (flags >> 8));
+
+    /* establish postfix order */
+    logop->op_next = LINKLIST(first);
+    first->op_next = (OP*)logop;
+    assert(!OpHAS_SIBLING(first));
+    op_sibling_splice((OP*)logop, first, 0, other);
+
+    CHECKOP(type,logop);
+
+    o = newUNOP(prepend_not ? OP_NOT : OP_NULL,
+                PL_opargs[type] & OA_RETSCALAR ? OPf_WANT_SCALAR : 0,
+                (OP*)logop);
+    other->op_next = o;
+
     return o;
 }
 
 /*
-=for apidoc newSTATEOP
-
-Constructs a state op (COP).  The state op is normally a C<nextstate> op,
-but will be a C<dbstate> op if debugging is enabled for currently-compiled
-code.  The state op is populated from C<PL_curcop> (or C<PL_compiling>).
-If C<label> is non-null, it supplies the name of a label to attach to
-the state op; this function takes ownership of the memory pointed at by
-C<label>, and will free it.  C<flags> gives the eight bits of C<op_flags>
-for the state op.
+=for apidoc newCONDOP
 
-If C<o> is null, the state op is returned.  Otherwise the state op is
-combined with C<o> into a C<lineseq> list op, which is returned.  C<o>
-is consumed by this function and becomes part of the returned op tree.
+Constructs, checks, and returns a conditional-expression (C<cond_expr>)
+op.  C<flags> gives the eight bits of C<op_flags>, except that C<OPf_KIDS>
+will be set automatically, and, shifted up eight bits, the eight bits of
+C<op_private>, except that the bit with value 1 is automatically set.
+C<first> supplies the expression selecting between the two branches,
+and C<trueop> and C<falseop> supply the branches; they are consumed by
+this function and become part of the constructed op tree.
 
 =cut
 */
 
 OP *
-Perl_newSTATEOP(pTHX_ I32 flags, char *label, OP *o)
+Perl_newCONDOP(pTHX_ I32 flags, OP *first, OP *trueop, OP *falseop)
 {
-    const U32 seq = intro_my();
-    const U32 utf8 = flags & SVf_UTF8;
-    COP *cop;
+    LOGOP *logop;
+    OP *start;
+    OP *o;
+    OP *cstop;
 
-    assert(PL_parser);
-    PL_parser->parsed_sub = 0;
+    PERL_ARGS_ASSERT_NEWCONDOP;
 
-    flags &= ~SVf_UTF8;
+    if (!falseop)
+        return newLOGOP(OP_AND, 0, first, trueop);
+    if (!trueop)
+        return newLOGOP(OP_OR, 0, first, falseop);
 
-    NewOp(1101, cop, 1, COP);
-    if (PERLDB_LINE && CopLINE(PL_curcop) && PL_curstash != PL_debstash) {
-        OpTYPE_set(cop, OP_DBSTATE);
-    }
-    else {
-        OpTYPE_set(cop, OP_NEXTSTATE);
+    scalarboolean(first);
+    if ((cstop = search_const(first))) {
+        /* Left or right arm of the conditional?  */
+        const bool left = SvTRUE(cSVOPx(cstop)->op_sv);
+        OP *live = left ? trueop : falseop;
+        OP *const dead = left ? falseop : trueop;
+        if (cstop->op_private & OPpCONST_BARE &&
+            cstop->op_private & OPpCONST_STRICT) {
+            no_bareword_allowed(cstop);
+        }
+        op_free(first);
+        op_free(dead);
+        if (live->op_type == OP_LEAVE)
+            live = newUNOP(OP_NULL, OPf_SPECIAL, live);
+        else if (live->op_type == OP_MATCH || live->op_type == OP_SUBST
+              || live->op_type == OP_TRANS || live->op_type == OP_TRANSR)
+            /* Mark the op as being unbindable with =~ */
+            live->op_flags |= OPf_SPECIAL;
+        live->op_folded = 1;
+        return live;
     }
-    cop->op_flags = (U8)flags;
-    CopHINTS_set(cop, PL_hints);
-#ifdef VMS
-    if (VMSISH_HUSHED) cop->op_private |= OPpHUSH_VMSISH;
-#endif
-    cop->op_next = (OP*)cop;
+    logop = alloc_LOGOP(OP_COND_EXPR, first, LINKLIST(trueop));
+    logop->op_flags |= (U8)flags;
+    logop->op_private = (U8)(1 | (flags >> 8));
+    logop->op_next = LINKLIST(falseop);
 
-    cop->cop_seq = seq;
-    cop->cop_warnings = DUP_WARNINGS(PL_curcop->cop_warnings);
-    CopHINTHASH_set(cop, cophh_copy(CopHINTHASH_get(PL_curcop)));
-    if (label) {
-        Perl_cop_store_label(aTHX_ cop, label, strlen(label), utf8);
+    CHECKOP(OP_COND_EXPR, /* that's logop->op_type */
+            logop);
 
-        PL_hints |= HINT_BLOCK_SCOPE;
-        /* It seems that we need to defer freeing this pointer, as other parts
-           of the grammar end up wanting to copy it after this op has been
-           created. */
-        SAVEFREEPV(label);
-    }
+    /* establish postfix order */
+    start = LINKLIST(first);
+    first->op_next = (OP*)logop;
 
-    if (PL_parser->preambling != NOLINE) {
-        CopLINE_set(cop, PL_parser->preambling);
-        PL_parser->copline = NOLINE;
-    }
-    else if (PL_parser->copline == NOLINE)
-        CopLINE_set(cop, CopLINE(PL_curcop));
-    else {
-        CopLINE_set(cop, PL_parser->copline);
-        PL_parser->copline = NOLINE;
-    }
-#ifdef USE_ITHREADS
-    CopFILE_set(cop, CopFILE(PL_curcop));      /* XXX share in a pvtable? */
-#else
-    CopFILEGV_set(cop, CopFILEGV(PL_curcop));
-#endif
-    CopSTASH_set(cop, PL_curstash);
+    /* make first, trueop, falseop siblings */
+    op_sibling_splice((OP*)logop, first,  0, trueop);
+    op_sibling_splice((OP*)logop, trueop, 0, falseop);
 
-    if (cop->op_type == OP_DBSTATE) {
-        /* this line can have a breakpoint - store the cop in IV */
-        AV *av = CopFILEAVx(PL_curcop);
-        if (av) {
-            SV * const * const svp = av_fetch(av, CopLINE(cop), FALSE);
-            if (svp && *svp != &PL_sv_undef ) {
-                (void)SvIOK_on(*svp);
-                SvIV_set(*svp, PTR2IV(cop));
-            }
-        }
-    }
+    o = newUNOP(OP_NULL, 0, (OP*)logop);
 
-    if (flags & OPf_SPECIAL)
-        op_null((OP*)cop);
-    return op_prepend_elem(OP_LINESEQ, (OP*)cop, o);
+    trueop->op_next = falseop->op_next = o;
+
+    o->op_next = start;
+    return o;
 }
 
 /*
-=for apidoc newLOGOP
+=for apidoc newTRYCATCHOP
 
-Constructs, checks, and returns a logical (flow control) op.  C<type>
-is the opcode.  C<flags> gives the eight bits of C<op_flags>, except
-that C<OPf_KIDS> will be set automatically, and, shifted up eight bits,
-the eight bits of C<op_private>, except that the bit with value 1 is
-automatically set.  C<first> supplies the expression controlling the
-flow, and C<other> supplies the side (alternate) chain of ops; they are
-consumed by this function and become part of the constructed op tree.
+Constructs and returns a conditional execution statement that implements
+the C<try>/C<catch> semantics.  First the op tree in C<tryblock> is executed,
+inside a context that traps exceptions.  If an exception occurs then the
+optree in C<catchblock> is executed, with the trapped exception set into the
+lexical variable given by C<catchvar> (which must be an op of type
+C<OP_PADSV>).  All the optrees are consumed by this function and become part
+of the returned op tree.
+
+The C<flags> argument is currently ignored.
 
 =cut
-*/
+ */
 
 OP *
-Perl_newLOGOP(pTHX_ I32 type, I32 flags, OP *first, OP *other)
+Perl_newTRYCATCHOP(pTHX_ I32 flags, OP *tryblock, OP *catchvar, OP *catchblock)
 {
-    PERL_ARGS_ASSERT_NEWLOGOP;
+    OP *o, *catchop;
 
-    return new_logop(type, flags, &first, &other);
-}
+    PERL_ARGS_ASSERT_NEWTRYCATCHOP;
+    assert(catchvar->op_type == OP_PADSV);
 
+    PERL_UNUSED_ARG(flags);
 
-/* See if the optree o contains a single OP_CONST (plus possibly
- * surrounding enter/nextstate/null etc). If so, return it, else return
- * NULL.
- */
+    /* The returned optree is shaped as:
+     *   LISTOP leavetrycatch
+     *       LOGOP entertrycatch
+     *       LISTOP poptry
+     *           $tryblock here
+     *       LOGOP catch
+     *           $catchblock here
+     */
 
-STATIC OP *
-S_search_const(pTHX_ OP *o)
-{
-    PERL_ARGS_ASSERT_SEARCH_CONST;
+    if(tryblock->op_type != OP_LINESEQ)
+        tryblock = op_convert_list(OP_LINESEQ, 0, tryblock);
+    OpTYPE_set(tryblock, OP_POPTRY);
 
-  redo:
-    switch (o->op_type) {
-        case OP_CONST:
-            return o;
-        case OP_NULL:
-            if (o->op_flags & OPf_KIDS) {
-                o = cUNOPo->op_first;
-                goto redo;
-            }
-            break;
-        case OP_LEAVE:
-        case OP_SCOPE:
-        case OP_LINESEQ:
-        {
-            OP *kid;
-            if (!(o->op_flags & OPf_KIDS))
-                return NULL;
-            kid = cLISTOPo->op_first;
+    /* Manually construct a naked LOGOP.
+     * Normally if we call newLOGOP the returned value is a UNOP(OP_NULL)
+     * containing the LOGOP we wanted as its op_first */
+    catchop = (OP *)alloc_LOGOP(OP_CATCH, newOP(OP_NULL, 0), catchblock);
+    OpMORESIB_set(cUNOPx(catchop)->op_first, catchblock);
+    OpLASTSIB_set(catchblock, catchop);
 
-            do {
-                switch (kid->op_type) {
-                    case OP_ENTER:
-                    case OP_NULL:
-                    case OP_NEXTSTATE:
-                        kid = OpSIBLING(kid);
-                        break;
-                    default:
-                        if (kid != cLISTOPo->op_last)
-                            return NULL;
-                        goto last;
-                }
-            } while (kid);
+    /* Inject the catchvar's pad offset into the OP_CATCH targ */
+    cLOGOPx(catchop)->op_targ = catchvar->op_targ;
+    op_free(catchvar);
 
-            if (!kid)
-                kid = cLISTOPo->op_last;
-          last:
-             o = kid;
-             goto redo;
-        }
-    }
+    /* Build the optree structure */
+    o = newLISTOP(OP_LIST, 0, tryblock, catchop);
+    o = op_convert_list(OP_ENTERTRYCATCH, 0, o);
 
-    return NULL;
+    return o;
 }
 
+/*
+=for apidoc newRANGE
 
-STATIC OP *
-S_new_logop(pTHX_ I32 type, I32 flags, OP** firstp, OP** otherp)
+Constructs and returns a C<range> op, with subordinate C<flip> and
+C<flop> ops.  C<flags> gives the eight bits of C<op_flags> for the
+C<flip> op and, shifted up eight bits, the eight bits of C<op_private>
+for both the C<flip> and C<range> ops, except that the bit with value
+1 is automatically set.  C<left> and C<right> supply the expressions
+controlling the endpoints of the range; they are consumed by this function
+and become part of the constructed op tree.
+
+=cut
+*/
+
+OP *
+Perl_newRANGE(pTHX_ I32 flags, OP *left, OP *right)
 {
-    LOGOP *logop;
+    LOGOP *range;
+    OP *flip;
+    OP *flop;
+    OP *leftstart;
     OP *o;
-    OP *first;
-    OP *other;
-    OP *cstop = NULL;
-    int prepend_not = 0;
 
-    PERL_ARGS_ASSERT_NEW_LOGOP;
+    PERL_ARGS_ASSERT_NEWRANGE;
 
-    first = *firstp;
-    other = *otherp;
+    range = alloc_LOGOP(OP_RANGE, left, LINKLIST(right));
+    range->op_flags = OPf_KIDS;
+    leftstart = LINKLIST(left);
+    range->op_private = (U8)(1 | (flags >> 8));
 
-    /* [perl #59802]: Warn about things like "return $a or $b", which
-       is parsed as "(return $a) or $b" rather than "return ($a or
-       $b)".  NB: This also applies to xor, which is why we do it
-       here.
-     */
-    switch (first->op_type) {
-    case OP_NEXT:
-    case OP_LAST:
-    case OP_REDO:
-        /* XXX: Perhaps we should emit a stronger warning for these.
-           Even with the high-precedence operator they don't seem to do
-           anything sensible.
+    /* make left and right siblings */
+    op_sibling_splice((OP*)range, left, 0, right);
 
-           But until we do, fall through here.
-         */
-    case OP_RETURN:
-    case OP_EXIT:
-    case OP_DIE:
-    case OP_GOTO:
-        /* XXX: Currently we allow people to "shoot themselves in the
-           foot" by explicitly writing "(return $a) or $b".
+    range->op_next = (OP*)range;
+    flip = newUNOP(OP_FLIP, flags, (OP*)range);
+    flop = newUNOP(OP_FLOP, 0, flip);
+    o = newUNOP(OP_NULL, 0, flop);
+    LINKLIST(flop);
+    range->op_next = leftstart;
 
-           Warn unless we are looking at the result from folding or if
-           the programmer explicitly grouped the operators like this.
-           The former can occur with e.g.
+    left->op_next = flip;
+    right->op_next = flop;
 
-                use constant FEATURE => ( $] >= ... );
-                sub { not FEATURE and return or do_stuff(); }
-         */
-        if (!first->op_folded && !(first->op_flags & OPf_PARENS))
-            Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
-                           "Possible precedence issue with control flow operator");
-        /* XXX: Should we optimze this to "return $a;" (i.e. remove
-           the "or $b" part)?
-        */
-        break;
-    }
+    range->op_targ =
+        pad_add_name_pvn("$", 1, padadd_NO_DUP_CHECK|padadd_STATE, 0, 0);
+    sv_upgrade(PAD_SV(range->op_targ), SVt_PVNV);
+    flip->op_targ =
+        pad_add_name_pvn("$", 1, padadd_NO_DUP_CHECK|padadd_STATE, 0, 0);;
+    sv_upgrade(PAD_SV(flip->op_targ), SVt_PVNV);
+    SvPADTMP_on(PAD_SV(flip->op_targ));
 
-    if (type == OP_XOR)                /* Not short circuit, but here by precedence. */
-        return newBINOP(type, flags, scalar(first), scalar(other));
+    flip->op_private =  left->op_type == OP_CONST ? OPpFLIP_LINENUM : 0;
+    flop->op_private = right->op_type == OP_CONST ? OPpFLIP_LINENUM : 0;
 
-    assert((PL_opargs[type] & OA_CLASS_MASK) == OA_LOGOP
-        || type == OP_CUSTOM);
+    /* check barewords before they might be optimized away */
+    if (flip->op_private && cSVOPx(left)->op_private & OPpCONST_STRICT)
+        no_bareword_allowed(left);
+    if (flop->op_private && cSVOPx(right)->op_private & OPpCONST_STRICT)
+        no_bareword_allowed(right);
 
-    scalarboolean(first);
+    flip->op_next = o;
+    if (!flip->op_private || !flop->op_private)
+        LINKLIST(o);           /* blow off optimizer unless constant */
 
-    /* search for a constant op that could let us fold the test */
-    if ((cstop = search_const(first))) {
-        if (cstop->op_private & OPpCONST_STRICT)
-            no_bareword_allowed(cstop);
-        else if ((cstop->op_private & OPpCONST_BARE))
-                Perl_ck_warner(aTHX_ packWARN(WARN_BAREWORD), "Bareword found in conditional");
-        if ((type == OP_AND &&  SvTRUE(((SVOP*)cstop)->op_sv)) ||
-            (type == OP_OR  && !SvTRUE(((SVOP*)cstop)->op_sv)) ||
-            (type == OP_DOR && !SvOK(((SVOP*)cstop)->op_sv))) {
-            /* Elide the (constant) lhs, since it can't affect the outcome */
-            *firstp = NULL;
-            if (other->op_type == OP_CONST)
-                other->op_private |= OPpCONST_SHORTCIRCUIT;
-            op_free(first);
-            if (other->op_type == OP_LEAVE)
-                other = newUNOP(OP_NULL, OPf_SPECIAL, other);
-            else if (other->op_type == OP_MATCH
-                  || other->op_type == OP_SUBST
-                  || other->op_type == OP_TRANSR
-                  || other->op_type == OP_TRANS)
-                /* Mark the op as being unbindable with =~ */
-                other->op_flags |= OPf_SPECIAL;
+    return o;
+}
 
-            other->op_folded = 1;
-            return other;
-        }
-        else {
-            /* Elide the rhs, since the outcome is entirely determined by
-             * the (constant) lhs */
+/*
+=for apidoc newLOOPOP
 
-            /* check for C<my $x if 0>, or C<my($x,$y) if 0> */
-            const OP *o2 = other;
-            if ( ! (o2->op_type == OP_LIST
-                    && (( o2 = cUNOPx(o2)->op_first))
-                    && o2->op_type == OP_PUSHMARK
-                    && (( o2 = OpSIBLING(o2))) )
-            )
-                o2 = other;
-            if ((o2->op_type == OP_PADSV || o2->op_type == OP_PADAV
-                        || o2->op_type == OP_PADHV)
-                && o2->op_private & OPpLVAL_INTRO
-                && !(o2->op_private & OPpPAD_STATE))
-            {
-        Perl_croak(aTHX_ "This use of my() in false conditional is "
-                          "no longer allowed");
-            }
+Constructs, checks, and returns an op tree expressing a loop.  This is
+only a loop in the control flow through the op tree; it does not have
+the heavyweight loop structure that allows exiting the loop by C<last>
+and suchlike.  C<flags> gives the eight bits of C<op_flags> for the
+top-level op, except that some bits will be set automatically as required.
+C<expr> supplies the expression controlling loop iteration, and C<block>
+supplies the body of the loop; they are consumed by this function and
+become part of the constructed op tree.  C<debuggable> is currently
+unused and should always be 1.
 
-            *otherp = NULL;
-            if (cstop->op_type == OP_CONST)
-                cstop->op_private |= OPpCONST_SHORTCIRCUIT;
-            op_free(other);
-            return first;
-        }
-    }
-    else if ((first->op_flags & OPf_KIDS) && type != OP_DOR
-        && ckWARN(WARN_MISC)) /* [#24076] Don't warn for <FH> err FOO. */
+=cut
+*/
+
+OP *
+Perl_newLOOPOP(pTHX_ I32 flags, I32 debuggable, OP *expr, OP *block)
+{
+    PERL_ARGS_ASSERT_NEWLOOPOP;
+
+    OP* listop;
+    OP* o;
+    const bool once = block && block->op_flags & OPf_SPECIAL &&
+                      block->op_type == OP_NULL;
+
+    PERL_UNUSED_ARG(debuggable);
+
+    if (once && (
+          (expr->op_type == OP_CONST && !SvTRUE(cSVOPx(expr)->op_sv))
+       || (  expr->op_type == OP_NOT
+          && cUNOPx(expr)->op_first->op_type == OP_CONST
+          && SvTRUE(cSVOPx_sv(cUNOPx(expr)->op_first))
+          )
+       ))
+        /* Return the block now, so that S_new_logop does not try to
+           fold it away. */
     {
-        const OP * const k1 = ((UNOP*)first)->op_first;
-        const OP * const k2 = OpSIBLING(k1);
-        OPCODE warnop = 0;
-        switch (first->op_type)
-        {
-        case OP_NULL:
-            if (k2 && k2->op_type == OP_READLINE
+        op_free(expr);
+        return block;  /* do {} while 0 does once */
+    }
+
+    if (expr->op_type == OP_READLINE
+        || expr->op_type == OP_READDIR
+        || expr->op_type == OP_GLOB
+        || expr->op_type == OP_EACH || expr->op_type == OP_AEACH
+        || (expr->op_type == OP_NULL && expr->op_targ == OP_GLOB)) {
+        expr = newUNOP(OP_DEFINED, 0,
+            newASSIGNOP(0, newDEFSVOP(), 0, expr) );
+    } else if (expr->op_flags & OPf_KIDS) {
+        const OP * const k1 = cUNOPx(expr)->op_first;
+        const OP * const k2 = k1 ? OpSIBLING(k1) : NULL;
+        switch (expr->op_type) {
+          case OP_NULL:
+            if (k2 && (k2->op_type == OP_READLINE || k2->op_type == OP_READDIR)
                   && (k2->op_flags & OPf_STACKED)
                   && ((k1->op_flags & OPf_WANT) == OPf_WANT_SCALAR))
-            {
-                warnop = k2->op_type;
-            }
+                expr = newUNOP(OP_DEFINED, 0, expr);
             break;
 
-        case OP_SASSIGN:
-            if (k1->op_type == OP_READDIR
+          case OP_SASSIGN:
+            if (k1 && (k1->op_type == OP_READDIR
                   || k1->op_type == OP_GLOB
                   || (k1->op_type == OP_NULL && k1->op_targ == OP_GLOB)
-                 || k1->op_type == OP_EACH
-                 || k1->op_type == OP_AEACH)
-            {
-                warnop = ((k1->op_type == OP_NULL)
-                          ? (OPCODE)k1->op_targ : k1->op_type);
-            }
+                  || k1->op_type == OP_EACH
+                  || k1->op_type == OP_AEACH))
+                expr = newUNOP(OP_DEFINED, 0, expr);
             break;
         }
-        if (warnop) {
-            const line_t oldline = CopLINE(PL_curcop);
-            /* This ensures that warnings are reported at the first line
-               of the construction, not the last.  */
-            CopLINE_set(PL_curcop, PL_parser->copline);
-            Perl_warner(aTHX_ packWARN(WARN_MISC),
-                 "Value of %s%s can be \"0\"; test with defined()",
-                 PL_op_desc[warnop],
-                 ((warnop == OP_READLINE || warnop == OP_GLOB)
-                  ? " construct" : "() operator"));
-            CopLINE_set(PL_curcop, oldline);
-        }
     }
 
-    /* optimize AND and OR ops that have NOTs as children */
-    if (first->op_type == OP_NOT
-        && (first->op_flags & OPf_KIDS)
-        && ((first->op_flags & OPf_SPECIAL) /* unless ($x) { } */
-            || (other->op_type == OP_NOT))  /* if (!$x && !$y) { } */
-        ) {
-        if (type == OP_AND || type == OP_OR) {
-            if (type == OP_AND)
-                type = OP_OR;
-            else
-                type = OP_AND;
-            op_null(first);
-            if (other->op_type == OP_NOT) { /* !a AND|OR !b => !(a OR|AND b) */
-                op_null(other);
-                prepend_not = 1; /* prepend a NOT op later */
-            }
-        }
-    }
+    /* if block is null, the next op_append_elem() would put UNSTACK, a scalar
+     * op, in listop. This is wrong. [perl #27024] */
+    if (!block)
+        block = newOP(OP_NULL, 0);
+    listop = op_append_elem(OP_LINESEQ, block, newOP(OP_UNSTACK, 0));
+    o = new_logop(OP_AND, 0, &expr, &listop);
 
-    logop = alloc_LOGOP(type, first, LINKLIST(other));
-    logop->op_flags |= (U8)flags;
-    logop->op_private = (U8)(1 | (flags >> 8));
+    if (once) {
+        ASSUME(listop);
+    }
 
-    /* establish postfix order */
-    logop->op_next = LINKLIST(first);
-    first->op_next = (OP*)logop;
-    assert(!OpHAS_SIBLING(first));
-    op_sibling_splice((OP*)logop, first, 0, other);
+    if (listop)
+        cLISTOPx(listop)->op_last->op_next = LINKLIST(o);
 
-    CHECKOP(type,logop);
+    if (once && o != listop)
+    {
+        assert(cUNOPo->op_first->op_type == OP_AND
+            || cUNOPo->op_first->op_type == OP_OR);
+        o->op_next = cLOGOPx(cUNOPo->op_first)->op_other;
+    }
 
-    o = newUNOP(prepend_not ? OP_NOT : OP_NULL,
-                PL_opargs[type] & OA_RETSCALAR ? OPf_WANT_SCALAR : 0,
-                (OP*)logop);
-    other->op_next = o;
+    if (o == listop)
+        o = newUNOP(OP_NULL, 0, o);    /* or do {} while 1 loses outer block */
 
+    o->op_flags |= flags;
+    o = op_scope(o);
+    o->op_flags |= OPf_SPECIAL;        /* suppress cx_popblock() curpm restoration*/
     return o;
 }
 
 /*
-=for apidoc newCONDOP
+=for apidoc newWHILEOP
 
-Constructs, checks, and returns a conditional-expression (C<cond_expr>)
-op.  C<flags> gives the eight bits of C<op_flags>, except that C<OPf_KIDS>
-will be set automatically, and, shifted up eight bits, the eight bits of
-C<op_private>, except that the bit with value 1 is automatically set.
-C<first> supplies the expression selecting between the two branches,
-and C<trueop> and C<falseop> supply the branches; they are consumed by
-this function and become part of the constructed op tree.
+Constructs, checks, and returns an op tree expressing a C<while> loop.
+This is a heavyweight loop, with structure that allows exiting the loop
+by C<last> and suchlike.
+
+C<loop> is an optional preconstructed C<enterloop> op to use in the
+loop; if it is null then a suitable op will be constructed automatically.
+C<expr> supplies the loop's controlling expression.  C<block> supplies the
+main body of the loop, and C<cont> optionally supplies a C<continue> block
+that operates as a second half of the body.  All of these optree inputs
+are consumed by this function and become part of the constructed op tree.
+
+C<flags> gives the eight bits of C<op_flags> for the C<leaveloop>
+op and, shifted up eight bits, the eight bits of C<op_private> for
+the C<leaveloop> op, except that (in both cases) some bits will be set
+automatically.  C<debuggable> is currently unused and should always be 1.
+C<has_my> can be supplied as true to force the
+loop body to be enclosed in its own scope.
 
 =cut
 */
 
 OP *
-Perl_newCONDOP(pTHX_ I32 flags, OP *first, OP *trueop, OP *falseop)
+Perl_newWHILEOP(pTHX_ I32 flags, I32 debuggable, LOOP *loop,
+        OP *expr, OP *block, OP *cont, I32 has_my)
 {
-    LOGOP *logop;
-    OP *start;
+    OP *redo;
+    OP *next = NULL;
+    OP *listop;
     OP *o;
-    OP *cstop;
+    U8 loopflags = 0;
 
-    PERL_ARGS_ASSERT_NEWCONDOP;
+    PERL_UNUSED_ARG(debuggable);
 
-    if (!falseop)
-        return newLOGOP(OP_AND, 0, first, trueop);
-    if (!trueop)
-        return newLOGOP(OP_OR, 0, first, falseop);
+    if (expr) {
+        if (expr->op_type == OP_READLINE
+         || expr->op_type == OP_READDIR
+         || expr->op_type == OP_GLOB
+         || expr->op_type == OP_EACH || expr->op_type == OP_AEACH
+                     || (expr->op_type == OP_NULL && expr->op_targ == OP_GLOB)) {
+            expr = newUNOP(OP_DEFINED, 0,
+                newASSIGNOP(0, newDEFSVOP(), 0, expr) );
+        } else if (expr->op_flags & OPf_KIDS) {
+            const OP * const k1 = cUNOPx(expr)->op_first;
+            const OP * const k2 = (k1) ? OpSIBLING(k1) : NULL;
+            switch (expr->op_type) {
+              case OP_NULL:
+                if (k2 && (k2->op_type == OP_READLINE || k2->op_type == OP_READDIR)
+                      && (k2->op_flags & OPf_STACKED)
+                      && ((k1->op_flags & OPf_WANT) == OPf_WANT_SCALAR))
+                    expr = newUNOP(OP_DEFINED, 0, expr);
+                break;
 
-    scalarboolean(first);
-    if ((cstop = search_const(first))) {
-        /* Left or right arm of the conditional?  */
-        const bool left = SvTRUE(((SVOP*)cstop)->op_sv);
-        OP *live = left ? trueop : falseop;
-        OP *const dead = left ? falseop : trueop;
-        if (cstop->op_private & OPpCONST_BARE &&
-            cstop->op_private & OPpCONST_STRICT) {
-            no_bareword_allowed(cstop);
+              case OP_SASSIGN:
+                if (k1 && (k1->op_type == OP_READDIR
+                      || k1->op_type == OP_GLOB
+                      || (k1->op_type == OP_NULL && k1->op_targ == OP_GLOB)
+                     || k1->op_type == OP_EACH
+                     || k1->op_type == OP_AEACH))
+                    expr = newUNOP(OP_DEFINED, 0, expr);
+                break;
+            }
         }
-        op_free(first);
-        op_free(dead);
-        if (live->op_type == OP_LEAVE)
-            live = newUNOP(OP_NULL, OPf_SPECIAL, live);
-        else if (live->op_type == OP_MATCH || live->op_type == OP_SUBST
-              || live->op_type == OP_TRANS || live->op_type == OP_TRANSR)
-            /* Mark the op as being unbindable with =~ */
-            live->op_flags |= OPf_SPECIAL;
-        live->op_folded = 1;
-        return live;
     }
-    logop = alloc_LOGOP(OP_COND_EXPR, first, LINKLIST(trueop));
-    logop->op_flags |= (U8)flags;
-    logop->op_private = (U8)(1 | (flags >> 8));
-    logop->op_next = LINKLIST(falseop);
-
-    CHECKOP(OP_COND_EXPR, /* that's logop->op_type */
-            logop);
-
-    /* establish postfix order */
-    start = LINKLIST(first);
-    first->op_next = (OP*)logop;
-
-    /* make first, trueop, falseop siblings */
-    op_sibling_splice((OP*)logop, first,  0, trueop);
-    op_sibling_splice((OP*)logop, trueop, 0, falseop);
 
-    o = newUNOP(OP_NULL, 0, (OP*)logop);
+    if (!block)
+        block = newOP(OP_NULL, 0);
+    else if (cont || has_my) {
+        block = op_scope(block);
+    }
 
-    trueop->op_next = falseop->op_next = o;
-
-    o->op_next = start;
-    return o;
-}
-
-/*
-=for apidoc newTRYCATCHOP
-
-Constructs and returns a conditional execution statement that implements
-the C<try>/C<catch> semantics.  First the op tree in C<tryblock> is executed,
-inside a context that traps exceptions.  If an exception occurs then the
-optree in C<catchblock> is executed, with the trapped exception set into the
-lexical variable given by C<catchvar> (which must be an op of type
-C<OP_PADSV>).  All the optrees are consumed by this function and become part
-of the returned op tree.
-
-The C<flags> argument is currently ignored.
-
-=cut
- */
-
-OP *
-Perl_newTRYCATCHOP(pTHX_ I32 flags, OP *tryblock, OP *catchvar, OP *catchblock)
-{
-    OP *o, *catchop;
-
-    PERL_ARGS_ASSERT_NEWTRYCATCHOP;
-    assert(catchvar->op_type == OP_PADSV);
+    if (cont) {
+        next = LINKLIST(cont);
+    }
+    if (expr) {
+        OP * const unstack = newOP(OP_UNSTACK, 0);
+        if (!next)
+            next = unstack;
+        cont = op_append_elem(OP_LINESEQ, cont, unstack);
+    }
 
-    PERL_UNUSED_ARG(flags);
+    assert(block);
+    listop = op_append_list(OP_LINESEQ, block, cont);
+    assert(listop);
+    redo = LINKLIST(listop);
 
-    /* The returned optree is shaped as:
-     *   LISTOP leavetrycatch
-     *       LOGOP entertrycatch
-     *       LISTOP poptry
-     *           $tryblock here
-     *       LOGOP catch
-     *           $catchblock here
-     */
+    if (expr) {
+        scalar(listop);
+        o = new_logop(OP_AND, 0, &expr, &listop);
+        if (o == expr && o->op_type == OP_CONST && !SvTRUE(cSVOPo->op_sv)) {
+            op_free((OP*)loop);
+            return expr;               /* listop already freed by new_logop */
+        }
+        if (listop)
+            cLISTOPx(listop)->op_last->op_next =
+                (o == listop ? redo : LINKLIST(o));
+    }
+    else
+        o = listop;
 
-    if(tryblock->op_type != OP_LINESEQ)
-        tryblock = op_convert_list(OP_LINESEQ, 0, tryblock);
-    OpTYPE_set(tryblock, OP_POPTRY);
+    if (!loop) {
+        NewOp(1101,loop,1,LOOP);
+        OpTYPE_set(loop, OP_ENTERLOOP);
+        loop->op_private = 0;
+        loop->op_next = (OP*)loop;
+    }
 
-    /* Manually construct a naked LOGOP.
-     * Normally if we call newLOGOP the returned value is a UNOP(OP_NULL)
-     * containing the LOGOP we wanted as its op_first */
-    catchop = (OP *)alloc_LOGOP(OP_CATCH, newOP(OP_NULL, 0), catchblock);
-    OpMORESIB_set(cUNOPx(catchop)->op_first, catchblock);
-    OpLASTSIB_set(catchblock, catchop);
+    o = newBINOP(OP_LEAVELOOP, 0, (OP*)loop, o);
 
-    /* Inject the catchvar's pad offset into the OP_CATCH targ */
-    cLOGOPx(catchop)->op_targ = catchvar->op_targ;
-    op_free(catchvar);
+    loop->op_redoop = redo;
+    loop->op_lastop = o;
+    o->op_private |= loopflags;
 
-    /* Build the optree structure */
-    o = newLISTOP(OP_LIST, 0, tryblock, catchop);
-    o = op_convert_list(OP_ENTERTRYCATCH, 0, o);
+    if (next)
+        loop->op_nextop = next;
+    else
+        loop->op_nextop = o;
 
+    o->op_flags |= flags;
+    o->op_private |= (flags >> 8);
     return o;
 }
 
 /*
-=for apidoc newRANGE
+=for apidoc newFOROP
 
-Constructs and returns a C<range> op, with subordinate C<flip> and
-C<flop> ops.  C<flags> gives the eight bits of C<op_flags> for the
-C<flip> op and, shifted up eight bits, the eight bits of C<op_private>
-for both the C<flip> and C<range> ops, except that the bit with value
-1 is automatically set.  C<left> and C<right> supply the expressions
-controlling the endpoints of the range; they are consumed by this function
-and become part of the constructed op tree.
+Constructs, checks, and returns an op tree expressing a C<foreach>
+loop (iteration through a list of values).  This is a heavyweight loop,
+with structure that allows exiting the loop by C<last> and suchlike.
+
+C<sv> optionally supplies the variable(s) that will be aliased to each
+item in turn; if null, it defaults to C<$_>.
+C<expr> supplies the list of values to iterate over.  C<block> supplies
+the main body of the loop, and C<cont> optionally supplies a C<continue>
+block that operates as a second half of the body.  All of these optree
+inputs are consumed by this function and become part of the constructed
+op tree.
+
+C<flags> gives the eight bits of C<op_flags> for the C<leaveloop>
+op and, shifted up eight bits, the eight bits of C<op_private> for
+the C<leaveloop> op, except that (in both cases) some bits will be set
+automatically.
 
 =cut
 */
 
 OP *
-Perl_newRANGE(pTHX_ I32 flags, OP *left, OP *right)
+Perl_newFOROP(pTHX_ I32 flags, OP *sv, OP *expr, OP *block, OP *cont)
 {
-    LOGOP *range;
-    OP *flip;
-    OP *flop;
-    OP *leftstart;
-    OP *o;
+    LOOP *loop;
+    OP *iter;
+    PADOFFSET padoff = 0;
+    PADOFFSET how_many_more = 0;
+    I32 iterflags = 0;
+    I32 iterpflags = 0;
+    bool parens = 0;
 
-    PERL_ARGS_ASSERT_NEWRANGE;
+    PERL_ARGS_ASSERT_NEWFOROP;
 
-    range = alloc_LOGOP(OP_RANGE, left, LINKLIST(right));
-    range->op_flags = OPf_KIDS;
-    leftstart = LINKLIST(left);
-    range->op_private = (U8)(1 | (flags >> 8));
+    if (sv) {
+        if (sv->op_type == OP_RV2SV) { /* symbol table variable */
+            iterpflags = sv->op_private & OPpOUR_INTRO; /* for our $x () */
+            OpTYPE_set(sv, OP_RV2GV);
 
-    /* make left and right siblings */
-    op_sibling_splice((OP*)range, left, 0, right);
+            /* The op_type check is needed to prevent a possible segfault
+             * if the loop variable is undeclared and 'strict vars' is in
+             * effect. This is illegal but is nonetheless parsed, so we
+             * may reach this point with an OP_CONST where we're expecting
+             * an OP_GV.
+             */
+            if (cUNOPx(sv)->op_first->op_type == OP_GV
+             && cGVOPx_gv(cUNOPx(sv)->op_first) == PL_defgv)
+                iterpflags |= OPpITER_DEF;
+        }
+        else if (sv->op_type == OP_PADSV) { /* private variable */
+            if (sv->op_flags & OPf_PARENS) {
+                /* handle degenerate 1-var form of "for my ($x, ...)" */
+                sv->op_private |= OPpLVAL_INTRO;
+                parens = 1;
+            }
+            iterpflags = sv->op_private & OPpLVAL_INTRO; /* for my $x () */
+            padoff = sv->op_targ;
+            sv->op_targ = 0;
+            op_free(sv);
+            sv = NULL;
+            PAD_COMPNAME_GEN_set(padoff, PERL_INT_MAX);
+        }
+        else if (sv->op_type == OP_NULL && sv->op_targ == OP_SREFGEN)
+            NOOP;
+        else if (sv->op_type == OP_LIST) {
+            LISTOP *list = cLISTOPx(sv);
+            OP *pushmark = list->op_first;
+            OP *first_padsv;
+            UNOP *padsv;
+            PADOFFSET i;
 
-    range->op_next = (OP*)range;
-    flip = newUNOP(OP_FLIP, flags, (OP*)range);
-    flop = newUNOP(OP_FLOP, 0, flip);
-    o = newUNOP(OP_NULL, 0, flop);
-    LINKLIST(flop);
-    range->op_next = leftstart;
+            iterpflags = OPpLVAL_INTRO; /* for my ($k, $v) () */
+            parens = 1;
 
-    left->op_next = flip;
-    right->op_next = flop;
+            if (!pushmark || pushmark->op_type != OP_PUSHMARK) {
+                Perl_croak(aTHX_ "panic: newFORLOOP, found %s, expecting pushmark",
+                           pushmark ? PL_op_desc[pushmark->op_type] : "NULL");
+            }
+            first_padsv = OpSIBLING(pushmark);
+            if (!first_padsv || first_padsv->op_type != OP_PADSV) {
+                Perl_croak(aTHX_ "panic: newFORLOOP, found %s, expecting padsv",
+                           first_padsv ? PL_op_desc[first_padsv->op_type] : "NULL");
+            }
+            padoff = first_padsv->op_targ;
 
-    range->op_targ =
-        pad_add_name_pvn("$", 1, padadd_NO_DUP_CHECK|padadd_STATE, 0, 0);
-    sv_upgrade(PAD_SV(range->op_targ), SVt_PVNV);
-    flip->op_targ =
-        pad_add_name_pvn("$", 1, padadd_NO_DUP_CHECK|padadd_STATE, 0, 0);;
-    sv_upgrade(PAD_SV(flip->op_targ), SVt_PVNV);
-    SvPADTMP_on(PAD_SV(flip->op_targ));
+            /* There should be at least one more PADSV to find, and the ops
+               should have consecutive values in targ: */
+            padsv = cUNOPx(OpSIBLING(first_padsv));
+            do {
+                if (!padsv || padsv->op_type != OP_PADSV) {
+                    Perl_croak(aTHX_ "panic: newFORLOOP, found %s at %zd, expecting padsv",
+                               padsv ? PL_op_desc[padsv->op_type] : "NULL",
+                               how_many_more);
+                }
+                ++how_many_more;
+                if (padsv->op_targ != padoff + how_many_more) {
+                    Perl_croak(aTHX_ "panic: newFORLOOP, padsv at %zd targ is %zd, not %zd",
+                               how_many_more, padsv->op_targ, padoff + how_many_more);
+                }
 
-    flip->op_private =  left->op_type == OP_CONST ? OPpFLIP_LINENUM : 0;
-    flop->op_private = right->op_type == OP_CONST ? OPpFLIP_LINENUM : 0;
+                padsv = cUNOPx(OpSIBLING(padsv));
+            } while (padsv);
 
-    /* check barewords before they might be optimized aways */
-    if (flip->op_private && cSVOPx(left)->op_private & OPpCONST_STRICT)
-        no_bareword_allowed(left);
-    if (flop->op_private && cSVOPx(right)->op_private & OPpCONST_STRICT)
-        no_bareword_allowed(right);
+            /* OK, this optree has the shape that we expected. So now *we*
+               "claim" the Pad slots: */
+            first_padsv->op_targ = 0;
+            PAD_COMPNAME_GEN_set(padoff, PERL_INT_MAX);
 
-    flip->op_next = o;
-    if (!flip->op_private || !flop->op_private)
-        LINKLIST(o);           /* blow off optimizer unless constant */
+            i = padoff;
 
-    return o;
-}
+            padsv = cUNOPx(OpSIBLING(first_padsv));
+            do {
+                ++i;
+                padsv->op_targ = 0;
+                PAD_COMPNAME_GEN_set(i, PERL_INT_MAX);
 
-/*
-=for apidoc newLOOPOP
+                padsv = cUNOPx(OpSIBLING(padsv));
+            } while (padsv);
 
-Constructs, checks, and returns an op tree expressing a loop.  This is
-only a loop in the control flow through the op tree; it does not have
-the heavyweight loop structure that allows exiting the loop by C<last>
-and suchlike.  C<flags> gives the eight bits of C<op_flags> for the
-top-level op, except that some bits will be set automatically as required.
-C<expr> supplies the expression controlling loop iteration, and C<block>
-supplies the body of the loop; they are consumed by this function and
-become part of the constructed op tree.  C<debuggable> is currently
-unused and should always be 1.
+            op_free(sv);
+            sv = NULL;
+        }
+        else
+            Perl_croak(aTHX_ "Can't use %s for loop variable", PL_op_desc[sv->op_type]);
+        if (padoff) {
+            PADNAME * const pn = PAD_COMPNAME(padoff);
+            const char * const name = PadnamePV(pn);
 
-=cut
-*/
-
-OP *
-Perl_newLOOPOP(pTHX_ I32 flags, I32 debuggable, OP *expr, OP *block)
-{
-    OP* listop;
-    OP* o;
-    const bool once = block && block->op_flags & OPf_SPECIAL &&
-                      block->op_type == OP_NULL;
-
-    PERL_UNUSED_ARG(debuggable);
-
-    if (expr) {
-        if (once && (
-              (expr->op_type == OP_CONST && !SvTRUE(((SVOP*)expr)->op_sv))
-           || (  expr->op_type == OP_NOT
-              && cUNOPx(expr)->op_first->op_type == OP_CONST
-              && SvTRUE(cSVOPx_sv(cUNOPx(expr)->op_first))
-              )
-           ))
-            /* Return the block now, so that S_new_logop does not try to
-               fold it away. */
-        {
-            op_free(expr);
-            return block;      /* do {} while 0 does once */
+            if (PadnameLEN(pn) == 2 && name[0] == '$' && name[1] == '_')
+                iterpflags |= OPpITER_DEF;
         }
+    }
+    else {
+        sv = newGVOP(OP_GV, 0, PL_defgv);
+        iterpflags |= OPpITER_DEF;
+    }
 
-        if (expr->op_type == OP_READLINE
-            || expr->op_type == OP_READDIR
-            || expr->op_type == OP_GLOB
-            || expr->op_type == OP_EACH || expr->op_type == OP_AEACH
-            || (expr->op_type == OP_NULL && expr->op_targ == OP_GLOB)) {
-            expr = newUNOP(OP_DEFINED, 0,
-                newASSIGNOP(0, newDEFSVOP(), 0, expr) );
-        } else if (expr->op_flags & OPf_KIDS) {
-            const OP * const k1 = ((UNOP*)expr)->op_first;
-            const OP * const k2 = k1 ? OpSIBLING(k1) : NULL;
-            switch (expr->op_type) {
-              case OP_NULL:
-                if (k2 && (k2->op_type == OP_READLINE || k2->op_type == OP_READDIR)
-                      && (k2->op_flags & OPf_STACKED)
-                      && ((k1->op_flags & OPf_WANT) == OPf_WANT_SCALAR))
-                    expr = newUNOP(OP_DEFINED, 0, expr);
-                break;
-
-              case OP_SASSIGN:
-                if (k1 && (k1->op_type == OP_READDIR
-                      || k1->op_type == OP_GLOB
-                      || (k1->op_type == OP_NULL && k1->op_targ == OP_GLOB)
-                     || k1->op_type == OP_EACH
-                     || k1->op_type == OP_AEACH))
-                    expr = newUNOP(OP_DEFINED, 0, expr);
-                break;
-            }
-        }
+    if (expr->op_type == OP_RV2AV || expr->op_type == OP_PADAV) {
+        expr = op_lvalue(op_force_list(scalar(ref(expr, OP_ITER))), OP_GREPSTART);
+        iterflags |= OPf_STACKED;
     }
+    else if (expr->op_type == OP_NULL &&
+             (expr->op_flags & OPf_KIDS) &&
+             cBINOPx(expr)->op_first->op_type == OP_FLOP)
+    {
+        /* Basically turn for($x..$y) into the same as for($x,$y), but we
+         * set the STACKED flag to indicate that these values are to be
+         * treated as min/max values by 'pp_enteriter'.
+         */
+        const UNOP* const flip = cUNOPx(cUNOPx(cBINOPx(expr)->op_first)->op_first);
+        LOGOP* const range = cLOGOPx(flip->op_first);
+        OP* const left  = range->op_first;
+        OP* const right = OpSIBLING(left);
+        LISTOP* listop;
 
-    /* if block is null, the next op_append_elem() would put UNSTACK, a scalar
-     * op, in listop. This is wrong. [perl #27024] */
-    if (!block)
-        block = newOP(OP_NULL, 0);
-    listop = op_append_elem(OP_LINESEQ, block, newOP(OP_UNSTACK, 0));
-    o = new_logop(OP_AND, 0, &expr, &listop);
+        range->op_flags &= ~OPf_KIDS;
+        /* detach range's children */
+        op_sibling_splice((OP*)range, NULL, -1, NULL);
 
-    if (once) {
-        ASSUME(listop);
+        listop = cLISTOPx(newLISTOP(OP_LIST, 0, left, right));
+        listop->op_first->op_next = range->op_next;
+        left->op_next = range->op_other;
+        right->op_next = (OP*)listop;
+        listop->op_next = listop->op_first;
+
+        op_free(expr);
+        expr = (OP*)(listop);
+        op_null(expr);
+        iterflags |= OPf_STACKED;
+    }
+    else {
+        expr = op_lvalue(op_force_list(expr), OP_GREPSTART);
     }
 
-    if (listop)
-        ((LISTOP*)listop)->op_last->op_next = LINKLIST(o);
+    loop = (LOOP*)op_convert_list(OP_ENTERITER, iterflags,
+                                  op_append_elem(OP_LIST, list(expr),
+                                                 scalar(sv)));
+    assert(!loop->op_next);
+    /* for my  $x () sets OPpLVAL_INTRO;
+     * for our $x () sets OPpOUR_INTRO */
+    loop->op_private = (U8)iterpflags;
 
-    if (once && o != listop)
+    /* upgrade loop from a LISTOP to a LOOPOP;
+     * keep it in-place if there's space */
+    if (loop->op_slabbed
+        &&    OpSLOT(loop)->opslot_size
+            < SIZE_TO_PSIZE(sizeof(LOOP) + OPSLOT_HEADER))
     {
-        assert(cUNOPo->op_first->op_type == OP_AND
-            || cUNOPo->op_first->op_type == OP_OR);
-        o->op_next = ((LOGOP*)cUNOPo->op_first)->op_other;
+        /* no space; allocate new op */
+        LOOP *tmp;
+        NewOp(1234,tmp,1,LOOP);
+        Copy(loop,tmp,1,LISTOP);
+        assert(loop->op_last->op_sibparent == (OP*)loop);
+        OpLASTSIB_set(loop->op_last, (OP*)tmp); /*point back to new parent */
+        S_op_destroy(aTHX_ (OP*)loop);
+        loop = tmp;
     }
-
-    if (o == listop)
-        o = newUNOP(OP_NULL, 0, o);    /* or do {} while 1 loses outer block */
-
-    o->op_flags |= flags;
-    o = op_scope(o);
-    o->op_flags |= OPf_SPECIAL;        /* suppress cx_popblock() curpm restoration*/
-    return o;
+    else if (!loop->op_slabbed)
+    {
+        /* loop was malloc()ed */
+        loop = (LOOP*)PerlMemShared_realloc(loop, sizeof(LOOP));
+        OpLASTSIB_set(loop->op_last, (OP*)loop);
+    }
+    loop->op_targ = padoff;
+    if (parens)
+        /* hint to deparser that this:  for my (...) ... */
+        loop->op_flags |= OPf_PARENS;
+    iter = newOP(OP_ITER, 0);
+    iter->op_targ = how_many_more;
+    return newWHILEOP(flags, 1, loop, iter, block, cont, 0);
 }
 
 /*
-=for apidoc newWHILEOP
-
-Constructs, checks, and returns an op tree expressing a C<while> loop.
-This is a heavyweight loop, with structure that allows exiting the loop
-by C<last> and suchlike.
-
-C<loop> is an optional preconstructed C<enterloop> op to use in the
-loop; if it is null then a suitable op will be constructed automatically.
-C<expr> supplies the loop's controlling expression.  C<block> supplies the
-main body of the loop, and C<cont> optionally supplies a C<continue> block
-that operates as a second half of the body.  All of these optree inputs
-are consumed by this function and become part of the constructed op tree.
+=for apidoc newLOOPEX
 
-C<flags> gives the eight bits of C<op_flags> for the C<leaveloop>
-op and, shifted up eight bits, the eight bits of C<op_private> for
-the C<leaveloop> op, except that (in both cases) some bits will be set
-automatically.  C<debuggable> is currently unused and should always be 1.
-C<has_my> can be supplied as true to force the
-loop body to be enclosed in its own scope.
+Constructs, checks, and returns a loop-exiting op (such as C<goto>
+or C<last>).  C<type> is the opcode.  C<label> supplies the parameter
+determining the target of the op; it is consumed by this function and
+becomes part of the constructed op tree.
 
 =cut
 */
 
-OP *
-Perl_newWHILEOP(pTHX_ I32 flags, I32 debuggable, LOOP *loop,
-        OP *expr, OP *block, OP *cont, I32 has_my)
+OP*
+Perl_newLOOPEX(pTHX_ I32 type, OP *label)
 {
-    OP *redo;
-    OP *next = NULL;
-    OP *listop;
-    OP *o;
-    U8 loopflags = 0;
+    OP *o = NULL;
 
-    PERL_UNUSED_ARG(debuggable);
+    PERL_ARGS_ASSERT_NEWLOOPEX;
 
-    if (expr) {
-        if (expr->op_type == OP_READLINE
-         || expr->op_type == OP_READDIR
-         || expr->op_type == OP_GLOB
-         || expr->op_type == OP_EACH || expr->op_type == OP_AEACH
-                     || (expr->op_type == OP_NULL && expr->op_targ == OP_GLOB)) {
-            expr = newUNOP(OP_DEFINED, 0,
-                newASSIGNOP(0, newDEFSVOP(), 0, expr) );
-        } else if (expr->op_flags & OPf_KIDS) {
-            const OP * const k1 = ((UNOP*)expr)->op_first;
-            const OP * const k2 = (k1) ? OpSIBLING(k1) : NULL;
-            switch (expr->op_type) {
-              case OP_NULL:
-                if (k2 && (k2->op_type == OP_READLINE || k2->op_type == OP_READDIR)
-                      && (k2->op_flags & OPf_STACKED)
-                      && ((k1->op_flags & OPf_WANT) == OPf_WANT_SCALAR))
-                    expr = newUNOP(OP_DEFINED, 0, expr);
-                break;
+    assert((PL_opargs[type] & OA_CLASS_MASK) == OA_LOOPEXOP
+        || type == OP_CUSTOM);
 
-              case OP_SASSIGN:
-                if (k1 && (k1->op_type == OP_READDIR
-                      || k1->op_type == OP_GLOB
-                      || (k1->op_type == OP_NULL && k1->op_targ == OP_GLOB)
-                     || k1->op_type == OP_EACH
-                     || k1->op_type == OP_AEACH))
-                    expr = newUNOP(OP_DEFINED, 0, expr);
-                break;
-            }
+    if (type != OP_GOTO) {
+        /* "last()" means "last" */
+        if (label->op_type == OP_STUB && (label->op_flags & OPf_PARENS)) {
+            o = newOP(type, OPf_SPECIAL);
         }
     }
-
-    if (!block)
-        block = newOP(OP_NULL, 0);
-    else if (cont || has_my) {
-        block = op_scope(block);
-    }
-
-    if (cont) {
-        next = LINKLIST(cont);
-    }
-    if (expr) {
-        OP * const unstack = newOP(OP_UNSTACK, 0);
-        if (!next)
-            next = unstack;
-        cont = op_append_elem(OP_LINESEQ, cont, unstack);
-    }
-
-    assert(block);
-    listop = op_append_list(OP_LINESEQ, block, cont);
-    assert(listop);
-    redo = LINKLIST(listop);
-
-    if (expr) {
-        scalar(listop);
-        o = new_logop(OP_AND, 0, &expr, &listop);
-        if (o == expr && o->op_type == OP_CONST && !SvTRUE(cSVOPo->op_sv)) {
-            op_free((OP*)loop);
-            return expr;               /* listop already freed by new_logop */
-        }
-        if (listop)
-            ((LISTOP*)listop)->op_last->op_next =
-                (o == listop ? redo : LINKLIST(o));
+    else {
+        /* Check whether it's going to be a goto &function */
+        if (label->op_type == OP_ENTERSUB
+                && !(label->op_flags & OPf_STACKED))
+            label = newUNOP(OP_REFGEN, 0, op_lvalue(label, OP_REFGEN));
     }
-    else
-        o = listop;
 
-    if (!loop) {
-        NewOp(1101,loop,1,LOOP);
-        OpTYPE_set(loop, OP_ENTERLOOP);
-        loop->op_private = 0;
-        loop->op_next = (OP*)loop;
+    /* Check for a constant argument */
+    if (label->op_type == OP_CONST) {
+            SV * const sv = cSVOPx(label)->op_sv;
+            STRLEN l;
+            const char *s = SvPV_const(sv,l);
+            if (l == strlen(s)) {
+                o = newPVOP(type,
+                            SvUTF8(cSVOPx(label)->op_sv),
+                            savesharedpv(
+                                SvPV_nolen_const(cSVOPx(label)->op_sv)));
+            }
     }
 
-    o = newBINOP(OP_LEAVELOOP, 0, (OP*)loop, o);
+    /* If we have already created an op, we do not need the label. */
+    if (o)
+                op_free(label);
+    else o = newUNOP(type, OPf_STACKED, label);
 
-    loop->op_redoop = redo;
-    loop->op_lastop = o;
-    o->op_private |= loopflags;
+    PL_hints |= HINT_BLOCK_SCOPE;
+    return o;
+}
 
-    if (next)
-        loop->op_nextop = next;
-    else
-        loop->op_nextop = o;
+/* if the condition is a literal array or hash
+   (or @{ ... } etc), make a reference to it.
+ */
+STATIC OP *
+S_ref_array_or_hash(pTHX_ OP *cond)
+{
+    if (cond
+    && (cond->op_type == OP_RV2AV
+    ||  cond->op_type == OP_PADAV
+    ||  cond->op_type == OP_RV2HV
+    ||  cond->op_type == OP_PADHV))
 
-    o->op_flags |= flags;
-    o->op_private |= (flags >> 8);
-    return o;
-}
+        return newUNOP(OP_REFGEN, 0, op_lvalue(cond, OP_REFGEN));
 
-/*
-=for apidoc newFOROP
+    else if(cond
+    && (cond->op_type == OP_ASLICE
+    ||  cond->op_type == OP_KVASLICE
+    ||  cond->op_type == OP_HSLICE
+    ||  cond->op_type == OP_KVHSLICE)) {
 
-Constructs, checks, and returns an op tree expressing a C<foreach>
-loop (iteration through a list of values).  This is a heavyweight loop,
-with structure that allows exiting the loop by C<last> and suchlike.
+        /* anonlist now needs a list from this op, was previously used in
+         * scalar context */
+        cond->op_flags &= ~(OPf_WANT_SCALAR | OPf_REF);
+        cond->op_flags |= OPf_WANT_LIST;
 
-C<sv> optionally supplies the variable(s) that will be aliased to each
-item in turn; if null, it defaults to C<$_>.
-C<expr> supplies the list of values to iterate over.  C<block> supplies
-the main body of the loop, and C<cont> optionally supplies a C<continue>
-block that operates as a second half of the body.  All of these optree
-inputs are consumed by this function and become part of the constructed
-op tree.
+        return newANONLIST(op_lvalue(cond, OP_ANONLIST));
+    }
 
-C<flags> gives the eight bits of C<op_flags> for the C<leaveloop>
-op and, shifted up eight bits, the eight bits of C<op_private> for
-the C<leaveloop> op, except that (in both cases) some bits will be set
-automatically.
+    else
+        return cond;
+}
 
-=cut
-*/
+/* These construct the optree fragments representing given()
+   and when() blocks.
 
-OP *
-Perl_newFOROP(pTHX_ I32 flags, OP *sv, OP *expr, OP *block, OP *cont)
+   entergiven and enterwhen are LOGOPs; the op_other pointer
+   points up to the associated leave op. We need this so we
+   can put it in the context and make break/continue work.
+   (Also, of course, pp_enterwhen will jump straight to
+   op_other if the match fails.)
+ */
+
+STATIC OP *
+S_newGIVWHENOP(pTHX_ OP *cond, OP *block,
+                   I32 enter_opcode, I32 leave_opcode,
+                   PADOFFSET entertarg)
 {
-    LOOP *loop;
-    OP *iter;
-    PADOFFSET padoff = 0;
-    PADOFFSET how_many_more = 0;
-    I32 iterflags = 0;
-    I32 iterpflags = 0;
-    bool parens = 0;
+    LOGOP *enterop;
+    OP *o;
 
-    PERL_ARGS_ASSERT_NEWFOROP;
+    PERL_ARGS_ASSERT_NEWGIVWHENOP;
+    PERL_UNUSED_ARG(entertarg); /* used to indicate targ of lexical $_ */
 
-    if (sv) {
-        if (sv->op_type == OP_RV2SV) { /* symbol table variable */
-            iterpflags = sv->op_private & OPpOUR_INTRO; /* for our $x () */
-            OpTYPE_set(sv, OP_RV2GV);
+    enterop = alloc_LOGOP(enter_opcode, block, NULL);
+    enterop->op_targ = 0;
+    enterop->op_private = 0;
 
-            /* The op_type check is needed to prevent a possible segfault
-             * if the loop variable is undeclared and 'strict vars' is in
-             * effect. This is illegal but is nonetheless parsed, so we
-             * may reach this point with an OP_CONST where we're expecting
-             * an OP_GV.
-             */
-            if (cUNOPx(sv)->op_first->op_type == OP_GV
-             && cGVOPx_gv(cUNOPx(sv)->op_first) == PL_defgv)
-                iterpflags |= OPpITER_DEF;
-        }
-        else if (sv->op_type == OP_PADSV) { /* private variable */
-            if (sv->op_flags & OPf_PARENS) {
-                /* handle degenerate 1-var form of "for my ($x, ...)" */
-                sv->op_private |= OPpLVAL_INTRO;
-                parens = 1;
-            }
-            iterpflags = sv->op_private & OPpLVAL_INTRO; /* for my $x () */
-            padoff = sv->op_targ;
-            sv->op_targ = 0;
-            op_free(sv);
-            sv = NULL;
-            PAD_COMPNAME_GEN_set(padoff, PERL_INT_MAX);
-        }
-        else if (sv->op_type == OP_NULL && sv->op_targ == OP_SREFGEN)
-            NOOP;
-        else if (sv->op_type == OP_LIST) {
-            LISTOP *list = (LISTOP *) sv;
-            OP *pushmark = list->op_first;
-            OP *first_padsv;
-            UNOP *padsv;
-            PADOFFSET i;
+    o = newUNOP(leave_opcode, 0, (OP *) enterop);
 
-            iterpflags = OPpLVAL_INTRO; /* for my ($k, $v) () */
-            parens = 1;
+    if (cond) {
+        /* prepend cond if we have one */
+        op_sibling_splice((OP*)enterop, NULL, 0, scalar(cond));
 
-            if (!pushmark || pushmark->op_type != OP_PUSHMARK) {
-                Perl_croak(aTHX_ "panic: newFORLOOP, found %s, expecting pushmark",
-                           pushmark ? PL_op_desc[pushmark->op_type] : "NULL");
-            }
-            first_padsv = OpSIBLING(pushmark);
-            if (!first_padsv || first_padsv->op_type != OP_PADSV) {
-                Perl_croak(aTHX_ "panic: newFORLOOP, found %s, expecting padsv",
-                           first_padsv ? PL_op_desc[first_padsv->op_type] : "NULL");
-            }
-            padoff = first_padsv->op_targ;
+        o->op_next = LINKLIST(cond);
+        cond->op_next = (OP *) enterop;
+    }
+    else {
+        /* This is a default {} block */
+        enterop->op_flags |= OPf_SPECIAL;
+        o      ->op_flags |= OPf_SPECIAL;
 
-            /* There should be at least one more PADSV to find, and the ops
-               should have consecutive values in targ: */
-            padsv = (UNOP *) OpSIBLING(first_padsv);
-            do {
-                if (!padsv || padsv->op_type != OP_PADSV) {
-                    Perl_croak(aTHX_ "panic: newFORLOOP, found %s at %zd, expecting padsv",
-                               padsv ? PL_op_desc[padsv->op_type] : "NULL",
-                               how_many_more);
-                }
-                ++how_many_more;
-                if (padsv->op_targ != padoff + how_many_more) {
-                    Perl_croak(aTHX_ "panic: newFORLOOP, padsv at %zd targ is %zd, not %zd",
-                               how_many_more, padsv->op_targ, padoff + how_many_more);
-                }
+        o->op_next = (OP *) enterop;
+    }
 
-                padsv = (UNOP *) OpSIBLING(padsv);
-            } while (padsv);
+    CHECKOP(enter_opcode, enterop); /* Currently does nothing, since
+                                       entergiven and enterwhen both
+                                       use ck_null() */
 
-            /* OK, this optree has the shape that we expected. So now *we*
-               "claim" the Pad slots: */
-            first_padsv->op_targ = 0;
-            PAD_COMPNAME_GEN_set(padoff, PERL_INT_MAX);
+    enterop->op_next = LINKLIST(block);
+    block->op_next = enterop->op_other = o;
 
-            i = padoff;
+    return o;
+}
 
-            padsv = (UNOP *) OpSIBLING(first_padsv);
-            do {
-                ++i;
-                padsv->op_targ = 0;
-                PAD_COMPNAME_GEN_set(i, PERL_INT_MAX);
 
-                padsv = (UNOP *) OpSIBLING(padsv);
-            } while (padsv);
+/* 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
+     - a comparison operator
+     - a filetest operator, with the exception of -s -M -A -C
+     - defined(), exists() or eof()
+     - /$re/ or $foo =~ /$re/
 
-            op_free(sv);
-            sv = NULL;
-        }
-        else
-            Perl_croak(aTHX_ "Can't use %s for loop variable", PL_op_desc[sv->op_type]);
-        if (padoff) {
-            PADNAME * const pn = PAD_COMPNAME(padoff);
-            const char * const name = PadnamePV(pn);
+   [*] possibly surprising
+ */
+STATIC bool
+S_looks_like_bool(pTHX_ const OP *o)
+{
+    PERL_ARGS_ASSERT_LOOKS_LIKE_BOOL;
 
-            if (PadnameLEN(pn) == 2 && name[0] == '$' && name[1] == '_')
-                iterpflags |= OPpITER_DEF;
+    switch(o->op_type) {
+        case OP_OR:
+        case OP_DOR:
+            return looks_like_bool(cLOGOPo->op_first);
+
+        case OP_AND:
+        {
+            OP* sibl = OpSIBLING(cLOGOPo->op_first);
+            ASSUME(sibl);
+            return (
+                looks_like_bool(cLOGOPo->op_first)
+             && looks_like_bool(sibl));
         }
-    }
-    else {
-        sv = newGVOP(OP_GV, 0, PL_defgv);
-        iterpflags |= OPpITER_DEF;
-    }
 
-    if (expr->op_type == OP_RV2AV || expr->op_type == OP_PADAV) {
-        expr = op_lvalue(force_list(scalar(ref(expr, OP_ITER)), TRUE), OP_GREPSTART);
-        iterflags |= OPf_STACKED;
-    }
-    else if (expr->op_type == OP_NULL &&
-             (expr->op_flags & OPf_KIDS) &&
-             ((BINOP*)expr)->op_first->op_type == OP_FLOP)
-    {
-        /* Basically turn for($x..$y) into the same as for($x,$y), but we
-         * set the STACKED flag to indicate that these values are to be
-         * treated as min/max values by 'pp_enteriter'.
-         */
-        const UNOP* const flip = (UNOP*)((UNOP*)((BINOP*)expr)->op_first)->op_first;
-        LOGOP* const range = (LOGOP*) flip->op_first;
-        OP* const left  = range->op_first;
-        OP* const right = OpSIBLING(left);
-        LISTOP* listop;
+        case OP_NULL:
+        case OP_SCALAR:
+            return (
+                o->op_flags & OPf_KIDS
+            && looks_like_bool(cUNOPo->op_first));
 
-        range->op_flags &= ~OPf_KIDS;
-        /* detach range's children */
-        op_sibling_splice((OP*)range, NULL, -1, NULL);
+        case OP_ENTERSUB:
 
-        listop = (LISTOP*)newLISTOP(OP_LIST, 0, left, right);
-        listop->op_first->op_next = range->op_next;
-        left->op_next = range->op_other;
-        right->op_next = (OP*)listop;
-        listop->op_next = listop->op_first;
+        case OP_NOT:   case OP_XOR:
 
-        op_free(expr);
-        expr = (OP*)(listop);
-        op_null(expr);
-        iterflags |= OPf_STACKED;
-    }
-    else {
-        expr = op_lvalue(force_list(expr, TRUE), OP_GREPSTART);
-    }
-
-    loop = (LOOP*)op_convert_list(OP_ENTERITER, iterflags,
-                                  op_append_elem(OP_LIST, list(expr),
-                                                 scalar(sv)));
-    assert(!loop->op_next);
-    /* for my  $x () sets OPpLVAL_INTRO;
-     * for our $x () sets OPpOUR_INTRO */
-    loop->op_private = (U8)iterpflags;
-
-    /* upgrade loop from a LISTOP to a LOOPOP;
-     * keep it in-place if there's space */
-    if (loop->op_slabbed
-        &&    OpSLOT(loop)->opslot_size
-            < SIZE_TO_PSIZE(sizeof(LOOP) + OPSLOT_HEADER))
-    {
-        /* no space; allocate new op */
-        LOOP *tmp;
-        NewOp(1234,tmp,1,LOOP);
-        Copy(loop,tmp,1,LISTOP);
-        assert(loop->op_last->op_sibparent == (OP*)loop);
-        OpLASTSIB_set(loop->op_last, (OP*)tmp); /*point back to new parent */
-        S_op_destroy(aTHX_ (OP*)loop);
-        loop = tmp;
-    }
-    else if (!loop->op_slabbed)
-    {
-        /* loop was malloc()ed */
-        loop = (LOOP*)PerlMemShared_realloc(loop, sizeof(LOOP));
-        OpLASTSIB_set(loop->op_last, (OP*)loop);
-    }
-    loop->op_targ = padoff;
-    if (parens)
-        /* hint to deparser that this:  for my (...) ... */
-        loop->op_flags |= OPf_PARENS;
-    iter = newOP(OP_ITER, 0);
-    iter->op_targ = how_many_more;
-    return newWHILEOP(flags, 1, loop, iter, block, cont, 0);
-}
-
-/*
-=for apidoc newLOOPEX
-
-Constructs, checks, and returns a loop-exiting op (such as C<goto>
-or C<last>).  C<type> is the opcode.  C<label> supplies the parameter
-determining the target of the op; it is consumed by this function and
-becomes part of the constructed op tree.
-
-=cut
-*/
-
-OP*
-Perl_newLOOPEX(pTHX_ I32 type, OP *label)
-{
-    OP *o = NULL;
-
-    PERL_ARGS_ASSERT_NEWLOOPEX;
-
-    assert((PL_opargs[type] & OA_CLASS_MASK) == OA_LOOPEXOP
-        || type == OP_CUSTOM);
-
-    if (type != OP_GOTO) {
-        /* "last()" means "last" */
-        if (label->op_type == OP_STUB && (label->op_flags & OPf_PARENS)) {
-            o = newOP(type, OPf_SPECIAL);
-        }
-    }
-    else {
-        /* Check whether it's going to be a goto &function */
-        if (label->op_type == OP_ENTERSUB
-                && !(label->op_flags & OPf_STACKED))
-            label = newUNOP(OP_REFGEN, 0, op_lvalue(label, OP_REFGEN));
-    }
-
-    /* Check for a constant argument */
-    if (label->op_type == OP_CONST) {
-            SV * const sv = ((SVOP *)label)->op_sv;
-            STRLEN l;
-            const char *s = SvPV_const(sv,l);
-            if (l == strlen(s)) {
-                o = newPVOP(type,
-                            SvUTF8(((SVOP*)label)->op_sv),
-                            savesharedpv(
-                                SvPV_nolen_const(((SVOP*)label)->op_sv)));
-            }
-    }
-
-    /* If we have already created an op, we do not need the label. */
-    if (o)
-                op_free(label);
-    else o = newUNOP(type, OPf_STACKED, label);
-
-    PL_hints |= HINT_BLOCK_SCOPE;
-    return o;
-}
-
-/* if the condition is a literal array or hash
-   (or @{ ... } etc), make a reference to it.
- */
-STATIC OP *
-S_ref_array_or_hash(pTHX_ OP *cond)
-{
-    if (cond
-    && (cond->op_type == OP_RV2AV
-    ||  cond->op_type == OP_PADAV
-    ||  cond->op_type == OP_RV2HV
-    ||  cond->op_type == OP_PADHV))
-
-        return newUNOP(OP_REFGEN, 0, op_lvalue(cond, OP_REFGEN));
-
-    else if(cond
-    && (cond->op_type == OP_ASLICE
-    ||  cond->op_type == OP_KVASLICE
-    ||  cond->op_type == OP_HSLICE
-    ||  cond->op_type == OP_KVHSLICE)) {
-
-        /* anonlist now needs a list from this op, was previously used in
-         * scalar context */
-        cond->op_flags &= ~(OPf_WANT_SCALAR | OPf_REF);
-        cond->op_flags |= OPf_WANT_LIST;
-
-        return newANONLIST(op_lvalue(cond, OP_ANONLIST));
-    }
-
-    else
-        return cond;
-}
-
-/* These construct the optree fragments representing given()
-   and when() blocks.
-
-   entergiven and enterwhen are LOGOPs; the op_other pointer
-   points up to the associated leave op. We need this so we
-   can put it in the context and make break/continue work.
-   (Also, of course, pp_enterwhen will jump straight to
-   op_other if the match fails.)
- */
-
-STATIC OP *
-S_newGIVWHENOP(pTHX_ OP *cond, OP *block,
-                   I32 enter_opcode, I32 leave_opcode,
-                   PADOFFSET entertarg)
-{
-    LOGOP *enterop;
-    OP *o;
-
-    PERL_ARGS_ASSERT_NEWGIVWHENOP;
-    PERL_UNUSED_ARG(entertarg); /* used to indicate targ of lexical $_ */
-
-    enterop = alloc_LOGOP(enter_opcode, block, NULL);
-    enterop->op_targ = 0;
-    enterop->op_private = 0;
-
-    o = newUNOP(leave_opcode, 0, (OP *) enterop);
-
-    if (cond) {
-        /* prepend cond if we have one */
-        op_sibling_splice((OP*)enterop, NULL, 0, scalar(cond));
-
-        o->op_next = LINKLIST(cond);
-        cond->op_next = (OP *) enterop;
-    }
-    else {
-        /* This is a default {} block */
-        enterop->op_flags |= OPf_SPECIAL;
-        o      ->op_flags |= OPf_SPECIAL;
-
-        o->op_next = (OP *) enterop;
-    }
-
-    CHECKOP(enter_opcode, enterop); /* Currently does nothing, since
-                                       entergiven and enterwhen both
-                                       use ck_null() */
-
-    enterop->op_next = LINKLIST(block);
-    block->op_next = enterop->op_other = o;
-
-    return o;
-}
-
-
-/* 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
-     - a comparison operator
-     - a filetest operator, with the exception of -s -M -A -C
-     - defined(), exists() or eof()
-     - /$re/ or $foo =~ /$re/
-
-   [*] possibly surprising
- */
-STATIC bool
-S_looks_like_bool(pTHX_ const OP *o)
-{
-    PERL_ARGS_ASSERT_LOOKS_LIKE_BOOL;
-
-    switch(o->op_type) {
-        case OP_OR:
-        case OP_DOR:
-            return looks_like_bool(cLOGOPo->op_first);
-
-        case OP_AND:
-        {
-            OP* sibl = OpSIBLING(cLOGOPo->op_first);
-            ASSUME(sibl);
-            return (
-                looks_like_bool(cLOGOPo->op_first)
-             && looks_like_bool(sibl));
-        }
-
-        case OP_NULL:
-        case OP_SCALAR:
-            return (
-                o->op_flags & OPf_KIDS
-            && looks_like_bool(cUNOPo->op_first));
-
-        case OP_ENTERSUB:
-
-        case OP_NOT:   case OP_XOR:
-
-        case OP_EQ:    case OP_NE:     case OP_LT:
-        case OP_GT:    case OP_LE:     case OP_GE:
+        case OP_EQ:    case OP_NE:     case OP_LT:
+        case OP_GT:    case OP_LE:     case OP_GE:
 
         case OP_I_EQ:  case OP_I_NE:   case OP_I_LT:
         case OP_I_GT:  case OP_I_LE:   case OP_I_GE:
@@ -10828,9 +9778,12 @@ Perl_newDEFEROP(pTHX_ I32 flags, OP *block)
 
     PERL_ARGS_ASSERT_NEWDEFEROP;
 
+    forbid_outofblock_ops(block,
+        (flags & (OPpDEFER_FINALLY << 8)) ? "a \"finally\" block" : "a \"defer\" block");
+
     start = LINKLIST(block);
 
-    /* Hide the block inside an OP_NULL with no exection */
+    /* Hide the block inside an OP_NULL with no execution */
     block = newUNOP(OP_NULL, 0, block);
     block->op_next = block;
 
@@ -10923,7 +9876,7 @@ Perl_cv_ckproto_len_flags(pTHX_ const CV *cv, const GV *gv, const char *p,
         else if (SvPOK(gv) && *SvPVX((SV *)gv) == '&')
             name = newSVpvn_flags(SvPVX((SV *)gv)+1, SvCUR(gv)-1, SvUTF8(gv)|SVs_TEMP);
         else if (flags & CV_CKPROTO_CURSTASH || SvROK(gv)) {
-            name = sv_2mortal(newSVhek(HvNAME_HEK(PL_curstash)));
+            name = newSVhek_mortal(HvNAME_HEK(PL_curstash));
             sv_catpvs(name, "::");
             if (SvROK(gv)) {
                 assert (SvTYPE(SvRV_const(gv)) == SVt_PVCV);
@@ -11034,7 +9987,7 @@ S_op_const_sv(pTHX_ const OP *o, CV *cv, bool allow_lex)
             SAVEFREESV(sv);
         }
         else if (allow_lex && type == OP_PADSV) {
-                if (PAD_COMPNAME_FLAGS(o->op_targ) & PADNAMEt_OUTER)
+                if (PAD_COMPNAME_FLAGS(o->op_targ) & PADNAMEf_OUTER)
                 {
                     sv = &PL_sv_undef; /* an arbitrary non-null value */
                     padsv = TRUE;
@@ -11152,8 +10105,8 @@ Perl_newMYSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block)
 
     if (proto) {
         assert(proto->op_type == OP_CONST);
-        ps = SvPV_const(((SVOP*)proto)->op_sv, ps_len);
-        ps_utf8 = SvUTF8(((SVOP*)proto)->op_sv);
+        ps = SvPV_const(cSVOPx(proto)->op_sv, ps_len);
+        ps_utf8 = SvUTF8(cSVOPx(proto)->op_sv);
     }
     else
         ps = NULL;
@@ -11267,7 +10220,7 @@ Perl_newMYSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block)
         CvCONST_on(cv);
         CvISXSUB_on(cv);
         PoisonPADLIST(cv);
-        CvFLAGS(cv) |= CvMETHOD(compcv);
+        CvFLAGS(cv) |= CvNOWARN_AMBIGUOUS(compcv);
         op_free(block);
         SvREFCNT_dec(compcv);
         PL_compcv = NULL;
@@ -11393,10 +10346,10 @@ Perl_newMYSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block)
             GV * const db_postponed = gv_fetchpvs("DB::postponed",
                                                   GV_ADDMULTI, SVt_PVHV);
             HV *hv;
-            SV * const sv = Perl_newSVpvf(aTHX_ "%s:%ld-%ld",
+            SV * const sv = Perl_newSVpvf(aTHX_ "%s:%" LINE_Tf "-%" LINE_Tf,
                                           CopFILE(PL_curcop),
-                                          (long)PL_subline,
-                                          (long)CopLINE(PL_curcop));
+                                          (line_t)PL_subline,
+                                          CopLINE(PL_curcop));
             if (HvNAME_HEK(PL_curstash)) {
                 sv_sethek(tmpstr, HvNAME_HEK(PL_curstash));
                 sv_catpvs(tmpstr, "::");
@@ -11574,6 +10527,7 @@ Perl_newATTRSUB_x(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs,
     bool has_name;
     bool name_is_utf8 = o && !o_is_gv && SvUTF8(cSVOPo->op_sv);
     bool evanescent = FALSE;
+    bool isBEGIN = FALSE;
     OP *start = NULL;
 #ifdef PERL_DEBUG_READONLY_OPS
     OPSLAB *slab = NULL;
@@ -11604,9 +10558,9 @@ Perl_newATTRSUB_x(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs,
         has_name = TRUE;
     } else if (PERLDB_NAMEANON && CopLINE(PL_curcop)) {
         SV * const sv = sv_newmortal();
-        Perl_sv_setpvf(aTHX_ sv, "%s[%s:%" IVdf "]",
+        Perl_sv_setpvf(aTHX_ sv, "%s[%s:%" LINE_Tf "]",
                        PL_curstash ? "__ANON__" : "__ANON__::__ANON__",
-                       CopFILE(PL_curcop), (IV)CopLINE(PL_curcop));
+                       CopFILE(PL_curcop), CopLINE(PL_curcop));
         gv = gv_fetchsv(sv, gv_fetch_flags, SVt_PVCV);
         has_name = TRUE;
     } else if (PL_curstash) {
@@ -11626,14 +10580,6 @@ Perl_newATTRSUB_x(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs,
         }
     }
 
-    if (proto) {
-        assert(proto->op_type == OP_CONST);
-        ps = SvPV_const(((SVOP*)proto)->op_sv, ps_len);
-        ps_utf8 = SvUTF8(((SVOP*)proto)->op_sv);
-    }
-    else
-        ps = NULL;
-
     if (o)
         SAVEFREEOP(o);
     if (proto)
@@ -11641,6 +10587,37 @@ Perl_newATTRSUB_x(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs,
     if (attrs)
         SAVEFREEOP(attrs);
 
+    /* we need this in two places later on, so set it up here */
+    if (name && block) {
+        const char *s = (char *) my_memrchr(name, ':', namlen);
+        s = s ? s+1 : name;
+        isBEGIN = strEQ(s,"BEGIN");
+    }
+
+    if (isBEGIN) {
+        /* Make sure that we do not have any prototypes or
+         * attributes associated with this BEGIN block, as the block
+         * is already done and dusted, and we will assert or worse
+         * if we try to attach the prototype to the now essentially
+         * nonexistent sub. */
+        if (proto)
+            /* diag_listed_as: %s on BEGIN block ignored */
+            Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "Prototype on BEGIN block ignored");
+        if (attrs)
+            /* diag_listed_as: %s on BEGIN block ignored */
+            Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "Attribute on BEGIN block ignored");
+        proto = NULL;
+        attrs = NULL;
+    }
+
+    if (proto) {
+        assert(proto->op_type == OP_CONST);
+        ps = SvPV_const(cSVOPx(proto)->op_sv, ps_len);
+        ps_utf8 = SvUTF8(cSVOPx(proto)->op_sv);
+    }
+    else
+        ps = NULL;
+
     if (ec) {
         op_free(block);
 
@@ -11650,18 +10627,14 @@ Perl_newATTRSUB_x(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs,
             cv = PL_compcv;
 
         PL_compcv = 0;
-        if (name && block) {
-            const char *s = (char *) my_memrchr(name, ':', namlen);
-            s = s ? s+1 : name;
-            if (strEQ(s, "BEGIN")) {
-                if (PL_in_eval & EVAL_KEEPERR)
-                    Perl_croak_nocontext("BEGIN not safe after errors--compilation aborted");
-                else {
-                    SV * const errsv = ERRSV;
-                    /* force display of errors found but not reported */
-                    sv_catpvs(errsv, "BEGIN not safe after errors--compilation aborted");
-                    Perl_croak_nocontext("%" SVf, SVfARG(errsv));
-                }
+        if (isBEGIN) {
+            if (PL_in_eval & EVAL_KEEPERR)
+                Perl_croak_nocontext("BEGIN not safe after errors--compilation aborted");
+            else {
+                SV * const errsv = ERRSV;
+                /* force display of errors found but not reported */
+                sv_catpvs(errsv, "BEGIN not safe after errors--compilation aborted");
+                Perl_croak_nocontext("%" SVf, SVfARG(errsv));
             }
         }
         goto done;
@@ -11711,6 +10684,8 @@ Perl_newATTRSUB_x(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs,
 
     if (block) {
         assert(PL_parser);
+        if (CvIsMETHOD(PL_compcv))
+            block = class_wrap_method_body(block);
         /* This makes sub {}; work as expected.  */
         if (block->op_type == OP_STUB) {
             const line_t l = PL_parser->copline;
@@ -11756,7 +10731,9 @@ Perl_newATTRSUB_x(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs,
             if (ckWARN(WARN_REDEFINE)
              || (  ckWARN_d(WARN_REDEFINE)
                 && (  !const_sv || SvRV(gv) == const_sv
-                   || sv_cmp(SvRV(gv), const_sv)  ))) {
+                      || SvTYPE(const_sv) == SVt_PVAV
+                      || SvTYPE(SvRV(gv)) == SVt_PVAV
+                      || sv_cmp(SvRV(gv), const_sv)  ))) {
                 assert(cSVOPo);
                 Perl_warner(aTHX_ packWARN(WARN_REDEFINE),
                           "Constant subroutine %" SVf " redefined",
@@ -11805,10 +10782,10 @@ Perl_newATTRSUB_x(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs,
             CvCONST_on(cv);
             CvISXSUB_on(cv);
             PoisonPADLIST(cv);
-            CvFLAGS(cv) |= CvMETHOD(PL_compcv);
+            CvFLAGS(cv) |= CvNOWARN_AMBIGUOUS(PL_compcv);
         }
         else {
-            if (isGV(gv) || CvMETHOD(PL_compcv)) {
+            if (isGV(gv) || CvNOWARN_AMBIGUOUS(PL_compcv)) {
                 if (name && isGV(gv))
                     GvCV_set(gv, NULL);
                 cv = newCONSTSUB_flags(
@@ -11817,7 +10794,7 @@ Perl_newATTRSUB_x(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs,
                 );
                 assert(cv);
                 assert(SvREFCNT((SV*)cv) != 0);
-                CvFLAGS(cv) |= CvMETHOD(PL_compcv);
+                CvFLAGS(cv) |= CvNOWARN_AMBIGUOUS(PL_compcv);
             }
             else {
                 if (!SvROK(gv)) {
@@ -11981,10 +10958,10 @@ Perl_newATTRSUB_x(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs,
             GV * const db_postponed = gv_fetchpvs("DB::postponed",
                                                   GV_ADDMULTI, SVt_PVHV);
             HV *hv;
-            SV * const sv = Perl_newSVpvf(aTHX_ "%s:%ld-%ld",
+            SV * const sv = Perl_newSVpvf(aTHX_ "%s:%" LINE_Tf "-%" LINE_Tf,
                                           CopFILE(PL_curcop),
-                                          (long)PL_subline,
-                                          (long)CopLINE(PL_curcop));
+                                          (line_t)PL_subline,
+                                          CopLINE(PL_curcop));
             (void)hv_store_ent(GvHV(PL_DBsub), tmpstr, sv, 0);
             hv = GvHVn(db_postponed);
             if (HvTOTALKEYS(hv) > 0 && hv_exists_ent(hv, tmpstr, 0)) {
@@ -12065,12 +11042,80 @@ S_process_special_blocks(pTHX_ I32 floor, const char *const fullname,
 
     if (*name == 'B') {
         if (strEQ(name, "BEGIN")) {
+            /* can't goto a declaration, but a null statement is fine */
+            module_install_hack: ;
             const I32 oldscope = PL_scopestack_ix;
+            SV *max_nest_sv = NULL;
+            IV max_nest_iv;
             dSP;
             (void)CvGV(cv);
             if (floor) LEAVE_SCOPE(floor);
             ENTER;
 
+            /* Make sure we don't recurse too deeply into BEGIN blocks,
+             * but let the user control it via the new control variable
+             *
+             *   ${^MAX_NESTED_EVAL_BEGIN_BLOCKS}
+             *
+             * Note that this code (when max_nest_iv is 1) *looks* like
+             * it would block the following code:
+             *
+             * BEGIN { $n |= 1; BEGIN { $n |= 2; BEGIN { $n |= 4 } } }
+             *
+             * but it does *not*; this code will happily execute when
+             * the nest limit is 1. The reason is revealed in the
+             * execution order. If we could watch $n in this code, we
+             * would see the following order of modifications:
+             *
+             * $n |= 4;
+             * $n |= 2;
+             * $n |= 1;
+             *
+             * This is because nested BEGIN blocks execute in FILO
+             * order; this is because BEGIN blocks are defined to
+             * execute immediately once they are closed. So the
+             * innermost block is closed first, and it executes, which
+             * increments the eval_begin_nest_depth by 1, and then it
+             * finishes, which drops eval_begin_nest_depth back to its
+             * previous value. This happens in turn as each BEGIN is
+             * completed.
+             *
+             * The *only* place these counts matter is when BEGIN is
+             * inside of some kind of string eval, either a require or a
+             * true eval. Only in that case would there be any nesting
+             * and would perl try to execute a BEGIN before another had
+             * completed.
+             *
+             * Thus this logic puts an upper limit on module nesting.
+             * Hence the reason we let the user control it, although it
+             * is hard to imagine a 1000-level-deep module use
+             * dependency even in a very large codebase. The real
+             * objective is to prevent code like this:
+             *
+             * perl -e'sub f { eval "BEGIN { f() }" } f()'
+             *
+             * from segfaulting due to stack exhaustion.
+             *
+             */
+            max_nest_sv = get_sv(PERL_VAR_MAX_NESTED_EVAL_BEGIN_BLOCKS, GV_ADD);
+            if (!SvOK(max_nest_sv))
+                sv_setiv(max_nest_sv, PERL_MAX_NESTED_EVAL_BEGIN_BLOCKS_DEFAULT);
+            max_nest_iv = SvIV(max_nest_sv);
+            if (max_nest_iv < 0) {
+                max_nest_iv = PERL_MAX_NESTED_EVAL_BEGIN_BLOCKS_DEFAULT;
+                sv_setiv(max_nest_sv, max_nest_iv);
+            }
+
+            /* (UV) below is just to silence a compiler warning, and should be
+             * effectively a no-op, as max_nest_iv will never be negative here.
+             */
+            if (PL_eval_begin_nest_depth >= (UV)max_nest_iv) {
+                Perl_croak(aTHX_ "Too many nested BEGIN blocks, maximum of %" IVdf " allowed",
+                             max_nest_iv);
+            }
+            SAVEINT(PL_eval_begin_nest_depth);
+            PL_eval_begin_nest_depth++;
+
             SAVEVPTR(PL_curcop);
             if (PL_curcop == &PL_compiling) {
                 /* Avoid pushing the "global" &PL_compiling onto the
@@ -12133,6 +11178,28 @@ S_process_special_blocks(pTHX_ I32 floor, const char *const fullname,
                 return FALSE;
         } else if (*name == 'I') {
             if (strEQ(name, "INIT")) {
+#ifdef MI_INIT_WORKAROUND_PACK
+                {
+                    HV *hv = CvSTASH(cv);
+                    STRLEN len = hv ? HvNAMELEN(hv) : 0;
+                    char *pv = (len == sizeof(MI_INIT_WORKAROUND_PACK)-1)
+                            ? HvNAME_get(hv) : NULL;
+                    if ( pv && strEQ(pv, MI_INIT_WORKAROUND_PACK) ) {
+                        /* old versions of Module::Install::DSL contain code
+                         * that creates an INIT in eval, which expects to run
+                         * after an exit(0) in BEGIN. This unfortunately
+                         * breaks a lot of code in the CPAN river. So we magically
+                         * convert INIT blocks from Module::Install::DSL to
+                         * be BEGIN blocks. Which works out, since the INIT
+                         * blocks it creates are eval'ed and so are late.
+                         */
+                        Perl_warn(aTHX_ "Treating %s::INIT block as BEGIN block as workaround",
+                                MI_INIT_WORKAROUND_PACK);
+                        goto module_install_hack;
+                    }
+
+                }
+#endif
                 if (PL_main_start)
                     /* diag_listed_as: Too late to run %s block */
                     Perl_ck_warner(aTHX_ packWARN(WARN_VOID),
@@ -12599,15 +11666,21 @@ OP *
 Perl_newANONATTRSUB(pTHX_ I32 floor, OP *proto, OP *attrs, OP *block)
 {
     SV * const cv = MUTABLE_SV(newATTRSUB(floor, 0, proto, attrs, block));
+
+    bool is_const = CvANONCONST(cv);
+
     OP * anoncode =
-        newSVOP(OP_ANONCODE, 0,
+        newSVOP(OP_ANONCODE, is_const ? 0 : OPf_REF,
                 cv);
-    if (CvANONCONST(cv))
-        anoncode = newUNOP(OP_ANONCONST, 0,
+
+    if (is_const) {
+        anoncode = newUNOP(OP_ANONCONST, OPf_REF,
                            op_convert_list(OP_ENTERSUB,
                                            OPf_STACKED|OPf_WANT_SCALAR,
                                            anoncode));
-    return newUNOP(OP_REFGEN, 0, anoncode);
+    }
+
+    return anoncode;
 }
 
 OP *
@@ -12683,6 +11756,13 @@ Perl_newGVREF(pTHX_ I32 type, OP *o)
 {
     if (type == OP_MAPSTART || type == OP_GREPSTART || type == OP_SORT)
         return newUNOP(OP_NULL, 0, o);
+
+    if (!FEATURE_BAREWORD_FILEHANDLES_IS_ENABLED &&
+        ((PL_opargs[type] >> OASHIFT) & 7) == OA_FILEREF &&
+        o->op_type == OP_CONST && (o->op_private & OPpCONST_BARE)) {
+        no_bareword_filehandle(SvPVX(cSVOPo_sv));
+    }
+
     return ref(newUNOP(OP_RV2GV, OPf_REF, o), type);
 }
 
@@ -13092,7 +12172,7 @@ Perl_ck_eval(pTHX_ OP *o)
 
     PL_hints |= HINT_BLOCK_SCOPE;
     if (o->op_flags & OPf_KIDS) {
-        SVOP * const kid = (SVOP*)cUNOPo->op_first;
+        SVOP * const kid = cSVOPx(cUNOPo->op_first);
         assert(kid);
 
         if (o->op_type == OP_ENTERTRY) {
@@ -13252,10 +12332,40 @@ Perl_ck_exists(pTHX_ OP *o)
     return o;
 }
 
+OP *
+Perl_ck_helemexistsor(pTHX_ OP *o)
+{
+    PERL_ARGS_ASSERT_CK_HELEMEXISTSOR;
+
+    o = ck_fun(o);
+
+    OP *first;
+    if(!(o->op_flags & OPf_KIDS) ||
+        !(first = cLOGOPo->op_first) ||
+        first->op_type != OP_HELEM)
+        /* As this opcode isn't currently exposed to pure-perl, only core or XS
+         * authors are ever going to see this message. We don't need to list it
+         * in perldiag as to do so would require documenting OP_HELEMEXISTSOR
+         * itself
+         */
+        /* diag_listed_as: SKIPME */
+        croak("OP_HELEMEXISTSOR argument is not a HASH element");
+
+    OP *hvop  = cBINOPx(first)->op_first;
+    OP *keyop = OpSIBLING(hvop);
+    assert(!OpSIBLING(keyop));
+
+    op_null(first); // null out the OP_HELEM
+
+    keyop->op_next = o;
+
+    return o;
+}
+
 OP *
 Perl_ck_rvconst(pTHX_ OP *o)
 {
-    SVOP * const kid = (SVOP*)cUNOPo->op_first;
+    SVOP * const kid = cSVOPx(cUNOPo->op_first);
 
     PERL_ARGS_ASSERT_CK_RVCONST;
 
@@ -13357,11 +12467,14 @@ Perl_ck_ftst(pTHX_ OP *o)
         NOOP;
     }
     else if (o->op_flags & OPf_KIDS && cUNOPo->op_first->op_type != OP_STUB) {
-        SVOP * const kid = (SVOP*)cUNOPo->op_first;
+        SVOP * const kid = cSVOPx(cUNOPo->op_first);
         const OPCODE kidtype = kid->op_type;
 
         if (kidtype == OP_CONST && (kid->op_private & OPpCONST_BARE)
          && !kid->op_folded) {
+            if (!FEATURE_BAREWORD_FILEHANDLES_IS_ENABLED) {
+                no_bareword_filehandle(SvPVX(kSVOP_sv));
+            }
             OP * const newop = newGVOP(type, OPf_REF,
                 gv_fetchsv(kid->op_sv, GV_ADD, SVt_PVIO));
             op_free(o);
@@ -13517,11 +12630,11 @@ Perl_ck_fun(pTHX_ OP *o)
                         (kid->op_private & OPpCONST_BARE))
                     {
                         OP * const newop = newGVOP(OP_GV, 0,
-                            gv_fetchsv(((SVOP*)kid)->op_sv, GV_ADD, SVt_PVIO));
+                            gv_fetchsv(kSVOP->op_sv, GV_ADD, SVt_PVIO));
                         /* a first argument is handled by toke.c, ideally we'd
                          just check here but several ops don't use ck_fun() */
-                        if (!FEATURE_BAREWORD_FILEHANDLES_IS_ENABLED && numargs > 1) {
-                            no_bareword_filehandle(SvPVX(cSVOPx_sv((SVOP*)kid)));
+                        if (!FEATURE_BAREWORD_FILEHANDLES_IS_ENABLED) {
+                            no_bareword_filehandle(SvPVX(kSVOP_sv));
                         }
                         /* replace kid with newop in chain */
                         op_sibling_splice(o, prev_kid, 1, newop);
@@ -13569,7 +12682,7 @@ Perl_ck_fun(pTHX_ OP *o)
                                      || kid->op_type == OP_HELEM)
                             {
                                  OP *firstop;
-                                 OP *op = ((BINOP*)kid)->op_first;
+                                 OP *op = kBINOP->op_first;
                                  name = NULL;
                                  if (op) {
                                       SV *tmpstr = NULL;
@@ -13578,7 +12691,7 @@ Perl_ck_fun(pTHX_ OP *o)
                                            "[]" : "{}";
                                       if (((op->op_type == OP_RV2AV) ||
                                            (op->op_type == OP_RV2HV)) &&
-                                          (firstop = ((UNOP*)op)->op_first) &&
+                                          (firstop = cUNOPx(op)->op_first) &&
                                           (firstop->op_type == OP_GV)) {
                                            /* packagevar $a[] or $h{} */
                                            GV * const gv = cGVOPx_gv(firstop);
@@ -13660,4867 +12773,2254 @@ Perl_ck_fun(pTHX_ OP *o)
         return newUNOP(type, 0, newDEFSVOP());
     }
 
-    if (oa) {
-        while (oa & OA_OPTIONAL)
-            oa >>= 4;
-        if (oa && oa != OA_LIST)
-            return too_few_arguments_pv(o,OP_DESC(o), 0);
-    }
-    return o;
-}
-
-OP *
-Perl_ck_glob(pTHX_ OP *o)
-{
-    GV *gv;
-
-    PERL_ARGS_ASSERT_CK_GLOB;
-
-    o = ck_fun(o);
-    if ((o->op_flags & OPf_KIDS) && !OpHAS_SIBLING(cLISTOPo->op_first))
-        op_append_elem(OP_GLOB, o, newDEFSVOP()); /* glob() => glob($_) */
-
-    if (!(o->op_flags & OPf_SPECIAL) && (gv = gv_override("glob", 4)))
-    {
-        /* convert
-         *     glob
-         *       \ null - const(wildcard)
-         * into
-         *     null
-         *       \ enter
-         *            \ list
-         *                 \ mark - glob - rv2cv
-         *                             |        \ gv(CORE::GLOBAL::glob)
-         *                             |
-         *                              \ null - const(wildcard)
-         */
-        o->op_flags |= OPf_SPECIAL;
-        o->op_targ = pad_alloc(OP_GLOB, SVs_PADTMP);
-        o = S_new_entersubop(aTHX_ gv, o);
-        o = newUNOP(OP_NULL, 0, o);
-        o->op_targ = OP_GLOB; /* hint at what it used to be: eg in newWHILEOP */
-        return o;
-    }
-    else o->op_flags &= ~OPf_SPECIAL;
-#if !defined(PERL_EXTERNAL_GLOB)
-    if (!PL_globhook) {
-        ENTER;
-        Perl_load_module(aTHX_ PERL_LOADMOD_NOIMPORT,
-                               newSVpvs("File::Glob"), NULL, NULL, NULL);
-        LEAVE;
-    }
-#endif /* !PERL_EXTERNAL_GLOB */
-    gv = (GV *)newSV_type(SVt_NULL);
-    gv_init(gv, 0, "", 0, 0);
-    gv_IOadd(gv);
-    op_append_elem(OP_GLOB, o, newGVOP(OP_GV, 0, gv));
-    SvREFCNT_dec_NN(gv); /* newGVOP increased it */
-    scalarkids(o);
-    return o;
-}
-
-OP *
-Perl_ck_grep(pTHX_ OP *o)
-{
-    LOGOP *gwop;
-    OP *kid;
-    const OPCODE type = o->op_type == OP_GREPSTART ? OP_GREPWHILE : OP_MAPWHILE;
-
-    PERL_ARGS_ASSERT_CK_GREP;
-
-    /* don't allocate gwop here, as we may leak it if PL_parser->error_count > 0 */
-
-    if (o->op_flags & OPf_STACKED) {
-        kid = cUNOPx(OpSIBLING(cLISTOPo->op_first))->op_first;
-        if (kid->op_type != OP_SCOPE && kid->op_type != OP_LEAVE)
-            return no_fh_allowed(o);
-        o->op_flags &= ~OPf_STACKED;
-    }
-    kid = OpSIBLING(cLISTOPo->op_first);
-    if (type == OP_MAPWHILE)
-        list(kid);
-    else
-        scalar(kid);
-    o = ck_fun(o);
-    if (PL_parser && PL_parser->error_count)
-        return o;
-    kid = OpSIBLING(cLISTOPo->op_first);
-    if (kid->op_type != OP_NULL)
-        Perl_croak(aTHX_ "panic: ck_grep, type=%u", (unsigned) kid->op_type);
-    kid = kUNOP->op_first;
-
-    gwop = alloc_LOGOP(type, o, LINKLIST(kid));
-    kid->op_next = (OP*)gwop;
-    o->op_private = gwop->op_private = 0;
-    gwop->op_targ = pad_alloc(type, SVs_PADTMP);
-
-    kid = OpSIBLING(cLISTOPo->op_first);
-    for (kid = OpSIBLING(kid); kid; kid = OpSIBLING(kid))
-        op_lvalue(kid, OP_GREPSTART);
-
-    return (OP*)gwop;
-}
-
-OP *
-Perl_ck_index(pTHX_ OP *o)
-{
-    PERL_ARGS_ASSERT_CK_INDEX;
-
-    if (o->op_flags & OPf_KIDS) {
-        OP *kid = OpSIBLING(cLISTOPo->op_first);       /* get past pushmark */
-        if (kid)
-            kid = OpSIBLING(kid);                      /* get past "big" */
-        if (kid && kid->op_type == OP_CONST) {
-            const bool save_taint = TAINT_get;
-            SV *sv = kSVOP->op_sv;
-            if (   (!SvPOK(sv) || SvNIOKp(sv) || isREGEXP(sv))
-                && SvOK(sv) && !SvROK(sv))
-            {
-                sv = newSV_type(SVt_NULL);
-                sv_copypv(sv, kSVOP->op_sv);
-                SvREFCNT_dec_NN(kSVOP->op_sv);
-                kSVOP->op_sv = sv;
-            }
-            if (SvOK(sv)) fbm_compile(sv, 0);
-            TAINT_set(save_taint);
-#ifdef NO_TAINT_SUPPORT
-            PERL_UNUSED_VAR(save_taint);
-#endif
-        }
-    }
-    return ck_fun(o);
-}
-
-OP *
-Perl_ck_lfun(pTHX_ OP *o)
-{
-    const OPCODE type = o->op_type;
-
-    PERL_ARGS_ASSERT_CK_LFUN;
-
-    return modkids(ck_fun(o), type);
-}
-
-OP *
-Perl_ck_defined(pTHX_ OP *o)           /* 19990527 MJD */
-{
-    PERL_ARGS_ASSERT_CK_DEFINED;
-
-    if ((o->op_flags & OPf_KIDS)) {
-        switch (cUNOPo->op_first->op_type) {
-        case OP_RV2AV:
-        case OP_PADAV:
-            Perl_croak(aTHX_ "Can't use 'defined(@array)'"
-                             " (Maybe you should just omit the defined()?)");
-            NOT_REACHED; /* NOTREACHED */
-            break;
-        case OP_RV2HV:
-        case OP_PADHV:
-            Perl_croak(aTHX_ "Can't use 'defined(%%hash)'"
-                             " (Maybe you should just omit the defined()?)");
-            NOT_REACHED; /* NOTREACHED */
-            break;
-        default:
-            /* no warning */
-            break;
-        }
-    }
-    return ck_rfun(o);
-}
-
-OP *
-Perl_ck_readline(pTHX_ OP *o)
-{
-    PERL_ARGS_ASSERT_CK_READLINE;
-
-    if (o->op_flags & OPf_KIDS) {
-         OP *kid = cLISTOPo->op_first;
-         if (kid->op_type == OP_RV2GV) kid->op_private |= OPpALLOW_FAKE;
-         scalar(kid);
-    }
-    else {
-        OP * const newop
-            = newUNOP(OP_READLINE, 0, newGVOP(OP_GV, 0, PL_argvgv));
-        op_free(o);
-        return newop;
-    }
-    return o;
-}
-
-OP *
-Perl_ck_rfun(pTHX_ OP *o)
-{
-    const OPCODE type = o->op_type;
-
-    PERL_ARGS_ASSERT_CK_RFUN;
-
-    return refkids(ck_fun(o), type);
-}
-
-OP *
-Perl_ck_listiob(pTHX_ OP *o)
-{
-    OP *kid;
-
-    PERL_ARGS_ASSERT_CK_LISTIOB;
-
-    kid = cLISTOPo->op_first;
-    if (!kid) {
-        o = force_list(o, TRUE);
-        kid = cLISTOPo->op_first;
-    }
-    if (kid->op_type == OP_PUSHMARK)
-        kid = OpSIBLING(kid);
-    if (kid && o->op_flags & OPf_STACKED)
-        kid = OpSIBLING(kid);
-    else if (kid && !OpHAS_SIBLING(kid)) {             /* print HANDLE; */
-        if (kid->op_type == OP_CONST && kid->op_private & OPpCONST_BARE
-         && !kid->op_folded) {
-            o->op_flags |= OPf_STACKED;        /* make it a filehandle */
-            scalar(kid);
-            /* replace old const op with new OP_RV2GV parent */
-            kid = S_op_sibling_newUNOP(aTHX_ o, cLISTOPo->op_first,
-                                        OP_RV2GV, OPf_REF);
-            kid = OpSIBLING(kid);
-        }
-    }
-
-    if (!kid)
-        op_append_elem(o->op_type, o, newDEFSVOP());
-
-    if (o->op_type == OP_PRTF) return modkids(listkids(o), OP_PRTF);
-    return listkids(o);
-}
-
-OP *
-Perl_ck_smartmatch(pTHX_ OP *o)
-{
-    PERL_ARGS_ASSERT_CK_SMARTMATCH;
-    if (0 == (o->op_flags & OPf_SPECIAL)) {
-        OP *first  = cBINOPo->op_first;
-        OP *second = OpSIBLING(first);
-
-        /* Implicitly take a reference to an array or hash */
-
-        /* remove the original two siblings, then add back the
-         * (possibly different) first and second sibs.
-         */
-        op_sibling_splice(o, NULL, 1, NULL);
-        op_sibling_splice(o, NULL, 1, NULL);
-        first  = ref_array_or_hash(first);
-        second = ref_array_or_hash(second);
-        op_sibling_splice(o, NULL, 0, second);
-        op_sibling_splice(o, NULL, 0, first);
-
-        /* Implicitly take a reference to a regular expression */
-        if (first->op_type == OP_MATCH && !(first->op_flags & OPf_STACKED)) {
-            OpTYPE_set(first, OP_QR);
-        }
-        if (second->op_type == OP_MATCH && !(second->op_flags & OPf_STACKED)) {
-            OpTYPE_set(second, OP_QR);
-        }
-    }
-
-    return o;
-}
-
-
-static OP *
-S_maybe_targlex(pTHX_ OP *o)
-{
-    OP * const kid = cLISTOPo->op_first;
-    /* has a disposable target? */
-    if ((PL_opargs[kid->op_type] & OA_TARGLEX)
-        && !(kid->op_flags & OPf_STACKED)
-        /* Cannot steal the second time! */
-        && !(kid->op_private & OPpTARGET_MY)
-        )
-    {
-        OP * const kkid = OpSIBLING(kid);
-
-        /* Can just relocate the target. */
-        if (kkid && kkid->op_type == OP_PADSV
-            && (!(kkid->op_private & OPpLVAL_INTRO)
-               || kkid->op_private & OPpPAD_STATE))
-        {
-            kid->op_targ = kkid->op_targ;
-            kkid->op_targ = 0;
-            /* Now we do not need PADSV and SASSIGN.
-             * Detach kid and free the rest. */
-            op_sibling_splice(o, NULL, 1, NULL);
-            op_free(o);
-            kid->op_private |= OPpTARGET_MY;   /* Used for context settings */
-            return kid;
-        }
-    }
-    return o;
-}
-
-OP *
-Perl_ck_sassign(pTHX_ OP *o)
-{
-    OP * const kid = cBINOPo->op_first;
-
-    PERL_ARGS_ASSERT_CK_SASSIGN;
-
-    if (OpHAS_SIBLING(kid)) {
-        OP *kkid = OpSIBLING(kid);
-        /* For state variable assignment with attributes, kkid is a list op
-           whose op_last is a padsv. */
-        if ((kkid->op_type == OP_PADSV ||
-             (OP_TYPE_IS_OR_WAS(kkid, OP_LIST) &&
-              (kkid = cLISTOPx(kkid)->op_last)->op_type == OP_PADSV
-             )
-            )
-                && (kkid->op_private & (OPpLVAL_INTRO|OPpPAD_STATE))
-                    == (OPpLVAL_INTRO|OPpPAD_STATE)) {
-            return S_newONCEOP(aTHX_ o, kkid);
-        }
-    }
-    return S_maybe_targlex(aTHX_ o);
-}
-
-
-OP *
-Perl_ck_match(pTHX_ OP *o)
-{
-    PERL_UNUSED_CONTEXT;
-    PERL_ARGS_ASSERT_CK_MATCH;
-
-    return o;
-}
-
-OP *
-Perl_ck_method(pTHX_ OP *o)
-{
-    SV *sv, *methsv, *rclass;
-    const char* method;
-    char* compatptr;
-    int utf8;
-    STRLEN len, nsplit = 0, i;
-    OP* new_op;
-    OP * const kid = cUNOPo->op_first;
-
-    PERL_ARGS_ASSERT_CK_METHOD;
-    if (kid->op_type != OP_CONST) return o;
-
-    sv = kSVOP->op_sv;
-
-    /* replace ' with :: */
-    while ((compatptr = (char *) memchr(SvPVX(sv), '\'',
-                                        SvEND(sv) - SvPVX(sv) )))
-    {
-        *compatptr = ':';
-        sv_insert(sv, compatptr - SvPVX_const(sv), 0, ":", 1);
-    }
-
-    method = SvPVX_const(sv);
-    len = SvCUR(sv);
-    utf8 = SvUTF8(sv) ? -1 : 1;
-
-    for (i = len - 1; i > 0; --i) if (method[i] == ':') {
-        nsplit = i+1;
-        break;
-    }
-
-    methsv = newSVpvn_share(method+nsplit, utf8*(len - nsplit), 0);
-
-    if (!nsplit) { /* $proto->method() */
-        op_free(o);
-        return newMETHOP_named(OP_METHOD_NAMED, 0, methsv);
-    }
-
-    if (memEQs(method, nsplit, "SUPER::")) { /* $proto->SUPER::method() */
-        op_free(o);
-        return newMETHOP_named(OP_METHOD_SUPER, 0, methsv);
-    }
-
-    /* $proto->MyClass::method() and $proto->MyClass::SUPER::method() */
-    if (nsplit >= 9 && strBEGINs(method+nsplit-9, "::SUPER::")) {
-        rclass = newSVpvn_share(method, utf8*(nsplit-9), 0);
-        new_op = newMETHOP_named(OP_METHOD_REDIR_SUPER, 0, methsv);
-    } else {
-        rclass = newSVpvn_share(method, utf8*(nsplit-2), 0);
-        new_op = newMETHOP_named(OP_METHOD_REDIR, 0, methsv);
-    }
-#ifdef USE_ITHREADS
-    op_relocate_sv(&rclass, &cMETHOPx(new_op)->op_rclass_targ);
-#else
-    cMETHOPx(new_op)->op_rclass_sv = rclass;
-#endif
-    op_free(o);
-    return new_op;
-}
-
-OP *
-Perl_ck_null(pTHX_ OP *o)
-{
-    PERL_ARGS_ASSERT_CK_NULL;
-    PERL_UNUSED_CONTEXT;
-    return o;
-}
-
-OP *
-Perl_ck_open(pTHX_ OP *o)
-{
-    PERL_ARGS_ASSERT_CK_OPEN;
-
-    S_io_hints(aTHX_ o);
-    {
-         /* In case of three-arg dup open remove strictness
-          * from the last arg if it is a bareword. */
-         OP * const first = cLISTOPx(o)->op_first; /* The pushmark. */
-         OP * const last  = cLISTOPx(o)->op_last;  /* The bareword. */
-         OP *oa;
-         const char *mode;
-
-         if ((last->op_type == OP_CONST) &&            /* The bareword. */
-             (last->op_private & OPpCONST_BARE) &&
-             (last->op_private & OPpCONST_STRICT) &&
-             (oa = OpSIBLING(first)) &&                /* The fh. */
-             (oa = OpSIBLING(oa)) &&                   /* The mode. */
-             (oa->op_type == OP_CONST) &&
-             SvPOK(((SVOP*)oa)->op_sv) &&
-             (mode = SvPVX_const(((SVOP*)oa)->op_sv)) &&
-             mode[0] == '>' && mode[1] == '&' &&       /* A dup open. */
-             (last == OpSIBLING(oa)))                  /* The bareword. */
-              last->op_private &= ~OPpCONST_STRICT;
-    }
-    return ck_fun(o);
-}
-
-OP *
-Perl_ck_prototype(pTHX_ OP *o)
-{
-    PERL_ARGS_ASSERT_CK_PROTOTYPE;
-    if (!(o->op_flags & OPf_KIDS)) {
-        op_free(o);
-        return newUNOP(OP_PROTOTYPE, 0, newDEFSVOP());
-    }
-    return o;
-}
-
-OP *
-Perl_ck_refassign(pTHX_ OP *o)
-{
-    OP * const right = cLISTOPo->op_first;
-    OP * const left = OpSIBLING(right);
-    OP *varop = cUNOPx(cUNOPx(left)->op_first)->op_first;
-    bool stacked = 0;
-
-    PERL_ARGS_ASSERT_CK_REFASSIGN;
-    assert (left);
-    assert (left->op_type == OP_SREFGEN);
-
-    o->op_private = 0;
-    /* we use OPpPAD_STATE in refassign to mean either of those things,
-     * and the code assumes the two flags occupy the same bit position
-     * in the various ops below */
-    assert(OPpPAD_STATE == OPpOUR_INTRO);
-
-    switch (varop->op_type) {
-    case OP_PADAV:
-        o->op_private |= OPpLVREF_AV;
-        goto settarg;
-    case OP_PADHV:
-        o->op_private |= OPpLVREF_HV;
-        /* FALLTHROUGH */
-    case OP_PADSV:
-      settarg:
-        o->op_private |= (varop->op_private & (OPpLVAL_INTRO|OPpPAD_STATE));
-        o->op_targ = varop->op_targ;
-        varop->op_targ = 0;
-        PAD_COMPNAME_GEN_set(o->op_targ, PERL_INT_MAX);
-        break;
-
-    case OP_RV2AV:
-        o->op_private |= OPpLVREF_AV;
-        goto checkgv;
-        NOT_REACHED; /* NOTREACHED */
-    case OP_RV2HV:
-        o->op_private |= OPpLVREF_HV;
-        /* FALLTHROUGH */
-    case OP_RV2SV:
-      checkgv:
-        o->op_private |= (varop->op_private & (OPpLVAL_INTRO|OPpOUR_INTRO));
-        if (cUNOPx(varop)->op_first->op_type != OP_GV) goto bad;
-      detach_and_stack:
-        /* Point varop to its GV kid, detached.  */
-        varop = op_sibling_splice(varop, NULL, -1, NULL);
-        stacked = TRUE;
-        break;
-    case OP_RV2CV: {
-        OP * const kidparent =
-            OpSIBLING(cUNOPx(cUNOPx(varop)->op_first)->op_first);
-        OP * const kid = cUNOPx(kidparent)->op_first;
-        o->op_private |= OPpLVREF_CV;
-        if (kid->op_type == OP_GV) {
-            SV *sv = (SV*)cGVOPx_gv(kid);
-            varop = kidparent;
-            if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVCV) {
-                /* a CVREF here confuses pp_refassign, so make sure
-                   it gets a GV */
-                CV *const cv = (CV*)SvRV(sv);
-                SV *name_sv = sv_2mortal(newSVhek(CvNAME_HEK(cv)));
-                (void)gv_init_sv((GV*)sv, CvSTASH(cv), name_sv, 0);
-                assert(SvTYPE(sv) == SVt_PVGV);
-            }
-            goto detach_and_stack;
-        }
-        if (kid->op_type != OP_PADCV)  goto bad;
-        o->op_targ = kid->op_targ;
-        kid->op_targ = 0;
-        break;
-    }
-    case OP_AELEM:
-    case OP_HELEM:
-        o->op_private |= (varop->op_private & OPpLVAL_INTRO);
-        o->op_private |= OPpLVREF_ELEM;
-        op_null(varop);
-        stacked = TRUE;
-        /* Detach varop.  */
-        op_sibling_splice(cUNOPx(left)->op_first, NULL, -1, NULL);
-        break;
-    default:
-      bad:
-        /* diag_listed_as: Can't modify reference to %s in %s assignment */
-        yyerror(Perl_form(aTHX_ "Can't modify reference to %s in scalar "
-                                "assignment",
-                                 OP_DESC(varop)));
-        return o;
-    }
-    if (!FEATURE_REFALIASING_IS_ENABLED)
-        Perl_croak(aTHX_
-                  "Experimental aliasing via reference not enabled");
-    Perl_ck_warner_d(aTHX_
-                     packWARN(WARN_EXPERIMENTAL__REFALIASING),
-                    "Aliasing via reference is experimental");
-    if (stacked) {
-        o->op_flags |= OPf_STACKED;
-        op_sibling_splice(o, right, 1, varop);
-    }
-    else {
-        o->op_flags &=~ OPf_STACKED;
-        op_sibling_splice(o, right, 1, NULL);
-    }
-    op_free(left);
-    return o;
-}
-
-OP *
-Perl_ck_repeat(pTHX_ OP *o)
-{
-    PERL_ARGS_ASSERT_CK_REPEAT;
-
-    if (cBINOPo->op_first->op_flags & OPf_PARENS) {
-        OP* kids;
-        o->op_private |= OPpREPEAT_DOLIST;
-        kids = op_sibling_splice(o, NULL, 1, NULL); /* detach first kid */
-        kids = force_list(kids, TRUE); /* promote it to a list */
-        op_sibling_splice(o, NULL, 0, kids); /* and add back */
-    }
-    else
-        scalar(o);
-    return o;
-}
-
-OP *
-Perl_ck_require(pTHX_ OP *o)
-{
-    GV* gv;
-
-    PERL_ARGS_ASSERT_CK_REQUIRE;
-
-    if (o->op_flags & OPf_KIDS) {      /* Shall we supply missing .pm? */
-        SVOP * const kid = (SVOP*)cUNOPo->op_first;
-        U32 hash;
-        char *s;
-        STRLEN len;
-        if (kid->op_type == OP_CONST) {
-          SV * const sv = kid->op_sv;
-          U32 const was_readonly = SvREADONLY(sv);
-          if (kid->op_private & OPpCONST_BARE) {
-            const char *end;
-            HEK *hek;
-
-            if (was_readonly) {
-                SvREADONLY_off(sv);
-            }
-
-            if (SvIsCOW(sv)) sv_force_normal_flags(sv, 0);
-
-            s = SvPVX(sv);
-            len = SvCUR(sv);
-            end = s + len;
-            /* treat ::foo::bar as foo::bar */
-            if (len >= 2 && s[0] == ':' && s[1] == ':')
-                DIE(aTHX_ "Bareword in require must not start with a double-colon: \"%s\"\n", s);
-            if (s == end)
-                DIE(aTHX_ "Bareword in require maps to empty filename");
-
-            for (; s < end; s++) {
-                if (*s == ':' && s[1] == ':') {
-                    *s = '/';
-                    Move(s+2, s+1, end - s - 1, char);
-                    --end;
-                }
-            }
-            SvEND_set(sv, end);
-            sv_catpvs(sv, ".pm");
-            PERL_HASH(hash, SvPVX(sv), SvCUR(sv));
-            hek = share_hek(SvPVX(sv),
-                            (SSize_t)SvCUR(sv) * (SvUTF8(sv) ? -1 : 1),
-                            hash);
-            sv_sethek(sv, hek);
-            unshare_hek(hek);
-            SvFLAGS(sv) |= was_readonly;
-          }
-          else if (SvPOK(sv) && !SvNIOK(sv) && !SvGMAGICAL(sv)
-                && !SvVOK(sv)) {
-            s = SvPV(sv, len);
-            if (SvREFCNT(sv) > 1) {
-                kid->op_sv = newSVpvn_share(
-                    s, SvUTF8(sv) ? -(SSize_t)len : (SSize_t)len, 0);
-                SvREFCNT_dec_NN(sv);
-            }
-            else {
-                HEK *hek;
-                if (was_readonly) SvREADONLY_off(sv);
-                PERL_HASH(hash, s, len);
-                hek = share_hek(s,
-                                SvUTF8(sv) ? -(SSize_t)len : (SSize_t)len,
-                                hash);
-                sv_sethek(sv, hek);
-                unshare_hek(hek);
-                SvFLAGS(sv) |= was_readonly;
-            }
-          }
-        }
-    }
-
-    if (!(o->op_flags & OPf_SPECIAL) /* Wasn't written as CORE::require */
-        /* handle override, if any */
-     && (gv = gv_override("require", 7))) {
-        OP *kid, *newop;
-        if (o->op_flags & OPf_KIDS) {
-            kid = cUNOPo->op_first;
-            op_sibling_splice(o, NULL, -1, NULL);
-        }
-        else {
-            kid = newDEFSVOP();
-        }
-        op_free(o);
-        newop = S_new_entersubop(aTHX_ gv, kid);
-        return newop;
-    }
-
-    return ck_fun(o);
-}
-
-OP *
-Perl_ck_return(pTHX_ OP *o)
-{
-    OP *kid;
-
-    PERL_ARGS_ASSERT_CK_RETURN;
-
-    kid = OpSIBLING(cLISTOPo->op_first);
-    if (PL_compcv && CvLVALUE(PL_compcv)) {
-        for (; kid; kid = OpSIBLING(kid))
-            op_lvalue(kid, OP_LEAVESUBLV);
-    }
-
-    return o;
-}
-
-OP *
-Perl_ck_select(pTHX_ OP *o)
-{
-    OP* kid;
-
-    PERL_ARGS_ASSERT_CK_SELECT;
-
-    if (o->op_flags & OPf_KIDS) {
-        kid = OpSIBLING(cLISTOPo->op_first);     /* get past pushmark */
-        if (kid && OpHAS_SIBLING(kid)) {
-            OpTYPE_set(o, OP_SSELECT);
-            o = ck_fun(o);
-            return fold_constants(op_integerize(op_std_init(o)));
-        }
-    }
-    o = ck_fun(o);
-    kid = OpSIBLING(cLISTOPo->op_first);    /* get past pushmark */
-    if (kid && kid->op_type == OP_RV2GV)
-        kid->op_private &= ~HINT_STRICT_REFS;
-    return o;
-}
-
-OP *
-Perl_ck_shift(pTHX_ OP *o)
-{
-    const I32 type = o->op_type;
-
-    PERL_ARGS_ASSERT_CK_SHIFT;
-
-    if (!(o->op_flags & OPf_KIDS)) {
-        OP *argop;
-
-        if (!CvUNIQUE(PL_compcv)) {
-            o->op_flags |= OPf_SPECIAL;
-            return o;
-        }
-
-        argop = newUNOP(OP_RV2AV, 0, scalar(newGVOP(OP_GV, 0, PL_argvgv)));
-        op_free(o);
-        return newUNOP(type, 0, scalar(argop));
-    }
-    return scalar(ck_fun(o));
-}
-
-OP *
-Perl_ck_sort(pTHX_ OP *o)
-{
-    OP *firstkid;
-    OP *kid;
-    U8 stacked;
-
-    PERL_ARGS_ASSERT_CK_SORT;
-
-    if (o->op_flags & OPf_STACKED)
-        simplify_sort(o);
-    firstkid = OpSIBLING(cLISTOPo->op_first);          /* get past pushmark */
-
-    if (!firstkid)
-        return too_few_arguments_pv(o,OP_DESC(o), 0);
-
-    if ((stacked = o->op_flags & OPf_STACKED)) {       /* may have been cleared */
-        OP *kid = cUNOPx(firstkid)->op_first;          /* get past null */
-
-        /* if the first arg is a code block, process it and mark sort as
-         * OPf_SPECIAL */
-        if (kid->op_type == OP_SCOPE || kid->op_type == OP_LEAVE) {
-            LINKLIST(kid);
-            if (kid->op_type == OP_LEAVE)
-                    op_null(kid);                      /* wipe out leave */
-            /* Prevent execution from escaping out of the sort block. */
-            kid->op_next = 0;
-
-            /* provide scalar context for comparison function/block */
-            kid = scalar(firstkid);
-            kid->op_next = kid;
-            o->op_flags |= OPf_SPECIAL;
-        }
-        else if (kid->op_type == OP_CONST
-              && kid->op_private & OPpCONST_BARE) {
-            char tmpbuf[256];
-            STRLEN len;
-            PADOFFSET off;
-            const char * const name = SvPV(kSVOP_sv, len);
-            *tmpbuf = '&';
-            assert (len < 256);
-            Copy(name, tmpbuf+1, len, char);
-            off = pad_findmy_pvn(tmpbuf, len+1, 0);
-            if (off != NOT_IN_PAD) {
-                if (PAD_COMPNAME_FLAGS_isOUR(off)) {
-                    SV * const fq =
-                        newSVhek(HvNAME_HEK(PAD_COMPNAME_OURSTASH(off)));
-                    sv_catpvs(fq, "::");
-                    sv_catsv(fq, kSVOP_sv);
-                    SvREFCNT_dec_NN(kSVOP_sv);
-                    kSVOP->op_sv = fq;
-                }
-                else {
-                    OP * const padop = newOP(OP_PADCV, 0);
-                    padop->op_targ = off;
-                    /* replace the const op with the pad op */
-                    op_sibling_splice(firstkid, NULL, 1, padop);
-                    op_free(kid);
-                }
-            }
-        }
-
-        firstkid = OpSIBLING(firstkid);
-    }
-
-    for (kid = firstkid; kid; kid = OpSIBLING(kid)) {
-        /* provide list context for arguments */
-        list(kid);
-        if (stacked)
-            op_lvalue(kid, OP_GREPSTART);
-    }
-
-    return o;
-}
-
-/* for sort { X } ..., where X is one of
- *   $a <=> $b, $b <=> $a, $a cmp $b, $b cmp $a
- * elide the second child of the sort (the one containing X),
- * and set these flags as appropriate
-        OPpSORT_NUMERIC;
-        OPpSORT_INTEGER;
-        OPpSORT_DESCEND;
- * Also, check and warn on lexical $a, $b.
- */
-
-STATIC void
-S_simplify_sort(pTHX_ OP *o)
-{
-    OP *kid = OpSIBLING(cLISTOPo->op_first);   /* get past pushmark */
-    OP *k;
-    int descending;
-    GV *gv;
-    const char *gvname;
-    bool have_scopeop;
-
-    PERL_ARGS_ASSERT_SIMPLIFY_SORT;
-
-    kid = kUNOP->op_first;                             /* get past null */
-    if (!(have_scopeop = kid->op_type == OP_SCOPE)
-     && kid->op_type != OP_LEAVE)
-        return;
-    kid = kLISTOP->op_last;                            /* get past scope */
-    switch(kid->op_type) {
-        case OP_NCMP:
-        case OP_I_NCMP:
-        case OP_SCMP:
-            if (!have_scopeop) goto padkids;
-            break;
-        default:
-            return;
-    }
-    k = kid;                                           /* remember this node*/
-    if (kBINOP->op_first->op_type != OP_RV2SV
-     || kBINOP->op_last ->op_type != OP_RV2SV)
-    {
-        /*
-           Warn about my($a) or my($b) in a sort block, *if* $a or $b is
-           then used in a comparison.  This catches most, but not
-           all cases.  For instance, it catches
-               sort { my($a); $a <=> $b }
-           but not
-               sort { my($a); $a < $b ? -1 : $a == $b ? 0 : 1; }
-           (although why you'd do that is anyone's guess).
-        */
-
-       padkids:
-        if (!ckWARN(WARN_SYNTAX)) return;
-        kid = kBINOP->op_first;
-        do {
-            if (kid->op_type == OP_PADSV) {
-                PADNAME * const name = PAD_COMPNAME(kid->op_targ);
-                if (PadnameLEN(name) == 2 && *PadnamePV(name) == '$'
-                 && (  PadnamePV(name)[1] == 'a'
-                    || PadnamePV(name)[1] == 'b'  ))
-                    /* diag_listed_as: "my %s" used in sort comparison */
-                    Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
-                                     "\"%s %s\" used in sort comparison",
-                                      PadnameIsSTATE(name)
-                                        ? "state"
-                                        : "my",
-                                      PadnamePV(name));
-            }
-        } while ((kid = OpSIBLING(kid)));
-        return;
-    }
-    kid = kBINOP->op_first;                            /* get past cmp */
-    if (kUNOP->op_first->op_type != OP_GV)
-        return;
-    kid = kUNOP->op_first;                             /* get past rv2sv */
-    gv = kGVOP_gv;
-    if (GvSTASH(gv) != PL_curstash)
-        return;
-    gvname = GvNAME(gv);
-    if (*gvname == 'a' && gvname[1] == '\0')
-        descending = 0;
-    else if (*gvname == 'b' && gvname[1] == '\0')
-        descending = 1;
-    else
-        return;
-
-    kid = k;                                           /* back to cmp */
-    /* already checked above that it is rv2sv */
-    kid = kBINOP->op_last;                             /* down to 2nd arg */
-    if (kUNOP->op_first->op_type != OP_GV)
-        return;
-    kid = kUNOP->op_first;                             /* get past rv2sv */
-    gv = kGVOP_gv;
-    if (GvSTASH(gv) != PL_curstash)
-        return;
-    gvname = GvNAME(gv);
-    if ( descending
-         ? !(*gvname == 'a' && gvname[1] == '\0')
-         : !(*gvname == 'b' && gvname[1] == '\0'))
-        return;
-    o->op_flags &= ~(OPf_STACKED | OPf_SPECIAL);
-    if (descending)
-        o->op_private |= OPpSORT_DESCEND;
-    if (k->op_type == OP_NCMP)
-        o->op_private |= OPpSORT_NUMERIC;
-    if (k->op_type == OP_I_NCMP)
-        o->op_private |= OPpSORT_NUMERIC | OPpSORT_INTEGER;
-    kid = OpSIBLING(cLISTOPo->op_first);
-    /* cut out and delete old block (second sibling) */
-    op_sibling_splice(o, cLISTOPo->op_first, 1, NULL);
-    op_free(kid);
-}
-
-OP *
-Perl_ck_split(pTHX_ OP *o)
-{
-    OP *kid;
-    OP *sibs;
-
-    PERL_ARGS_ASSERT_CK_SPLIT;
-
-    assert(o->op_type == OP_LIST);
-
-    if (o->op_flags & OPf_STACKED)
-        return no_fh_allowed(o);
-
-    kid = cLISTOPo->op_first;
-    /* delete leading NULL node, then add a CONST if no other nodes */
-    assert(kid->op_type == OP_NULL);
-    op_sibling_splice(o, NULL, 1,
-        OpHAS_SIBLING(kid) ? NULL : newSVOP(OP_CONST, 0, newSVpvs(" ")));
-    op_free(kid);
-    kid = cLISTOPo->op_first;
-
-    if (kid->op_type != OP_MATCH || kid->op_flags & OPf_STACKED) {
-        /* remove match expression, and replace with new optree with
-         * a match op at its head */
-        op_sibling_splice(o, NULL, 1, NULL);
-        /* pmruntime will handle split " " behavior with flag==2 */
-        kid = pmruntime(newPMOP(OP_MATCH, 0), kid, NULL, 2, 0);
-        op_sibling_splice(o, NULL, 0, kid);
-    }
-
-    assert(kid->op_type == OP_MATCH || kid->op_type == OP_SPLIT);
-
-    if (((PMOP *)kid)->op_pmflags & PMf_GLOBAL) {
-      Perl_ck_warner(aTHX_ packWARN(WARN_REGEXP),
-                     "Use of /g modifier is meaningless in split");
-    }
-
-    /* eliminate the split op, and move the match op (plus any children)
-     * into its place, then convert the match op into a split op. i.e.
-     *
-     *  SPLIT                    MATCH                 SPLIT(ex-MATCH)
-     *    |                        |                     |
-     *  MATCH - A - B - C   =>     R - A - B - C   =>    R - A - B - C
-     *    |                        |                     |
-     *    R                        X - Y                 X - Y
-     *    |
-     *    X - Y
-     *
-     * (R, if it exists, will be a regcomp op)
-     */
-
-    op_sibling_splice(o, NULL, 1, NULL); /* detach match op from o */
-    sibs = op_sibling_splice(o, NULL, -1, NULL); /* detach any other sibs */
-    op_sibling_splice(kid, cLISTOPx(kid)->op_last, 0, sibs); /* and reattach */
-    OpTYPE_set(kid, OP_SPLIT);
-    kid->op_flags   = (o->op_flags | (kid->op_flags & OPf_KIDS));
-    kid->op_private = o->op_private;
-    op_free(o);
-    o = kid;
-    kid = sibs; /* kid is now the string arg of the split */
-
-    if (!kid) {
-        kid = newDEFSVOP();
-        op_append_elem(OP_SPLIT, o, kid);
-    }
-    scalar(kid);
-
-    kid = OpSIBLING(kid);
-    if (!kid) {
-        kid = newSVOP(OP_CONST, 0, newSViv(0));
-        op_append_elem(OP_SPLIT, o, kid);
-        o->op_private |= OPpSPLIT_IMPLIM;
-    }
-    scalar(kid);
-
-    if (OpHAS_SIBLING(kid))
-        return too_many_arguments_pv(o,OP_DESC(o), 0);
-
-    return o;
-}
-
-OP *
-Perl_ck_stringify(pTHX_ OP *o)
-{
-    OP * const kid = OpSIBLING(cUNOPo->op_first);
-    PERL_ARGS_ASSERT_CK_STRINGIFY;
-    if ((   kid->op_type == OP_JOIN || kid->op_type == OP_QUOTEMETA
-         || kid->op_type == OP_LC   || kid->op_type == OP_LCFIRST
-         || kid->op_type == OP_UC   || kid->op_type == OP_UCFIRST)
-        && !OpHAS_SIBLING(kid)) /* syntax errs can leave extra children */
-    {
-        op_sibling_splice(o, cUNOPo->op_first, -1, NULL);
-        op_free(o);
-        return kid;
-    }
-    return ck_fun(o);
-}
-
-OP *
-Perl_ck_join(pTHX_ OP *o)
-{
-    OP * const kid = OpSIBLING(cLISTOPo->op_first);
-
-    PERL_ARGS_ASSERT_CK_JOIN;
-
-    if (kid && kid->op_type == OP_MATCH) {
-        if (ckWARN(WARN_SYNTAX)) {
-            const REGEXP *re = PM_GETRE(kPMOP);
-            const SV *msg = re
-                    ? newSVpvn_flags( RX_PRECOMP_const(re), RX_PRELEN(re),
-                                            SVs_TEMP | ( RX_UTF8(re) ? SVf_UTF8 : 0 ) )
-                    : newSVpvs_flags( "STRING", SVs_TEMP );
-            Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
-                        "/%" SVf "/ should probably be written as \"%" SVf "\"",
-                        SVfARG(msg), SVfARG(msg));
-        }
-    }
-    if (kid
-     && (kid->op_type == OP_CONST /* an innocent, unsuspicious separator */
-        || (kid->op_type == OP_PADSV && !(kid->op_private & OPpLVAL_INTRO))
-        || (  kid->op_type==OP_RV2SV && kUNOP->op_first->op_type == OP_GV
-           && !(kid->op_private & (OPpLVAL_INTRO|OPpOUR_INTRO)))))
-    {
-        const OP * const bairn = OpSIBLING(kid); /* the list */
-        if (bairn && !OpHAS_SIBLING(bairn) /* single-item list */
-         && OP_GIMME(bairn,0) == G_SCALAR)
-        {
-            OP * const ret = op_convert_list(OP_STRINGIFY, OPf_FOLDED,
-                                     op_sibling_splice(o, kid, 1, NULL));
-            op_free(o);
-            return ret;
-        }
-    }
-
-    return ck_fun(o);
-}
-
-/*
-=for apidoc rv2cv_op_cv
-
-Examines an op, which is expected to identify a subroutine at runtime,
-and attempts to determine at compile time which subroutine it identifies.
-This is normally used during Perl compilation to determine whether
-a prototype can be applied to a function call.  C<cvop> is the op
-being considered, normally an C<rv2cv> op.  A pointer to the identified
-subroutine is returned, if it could be determined statically, and a null
-pointer is returned if it was not possible to determine statically.
-
-Currently, the subroutine can be identified statically if the RV that the
-C<rv2cv> is to operate on is provided by a suitable C<gv> or C<const> op.
-A C<gv> op is suitable if the GV's CV slot is populated.  A C<const> op is
-suitable if the constant value must be an RV pointing to a CV.  Details of
-this process may change in future versions of Perl.  If the C<rv2cv> op
-has the C<OPpENTERSUB_AMPER> flag set then no attempt is made to identify
-the subroutine statically: this flag is used to suppress compile-time
-magic on a subroutine call, forcing it to use default runtime behaviour.
-
-If C<flags> has the bit C<RV2CVOPCV_MARK_EARLY> set, then the handling
-of a GV reference is modified.  If a GV was examined and its CV slot was
-found to be empty, then the C<gv> op has the C<OPpEARLY_CV> flag set.
-If the op is not optimised away, and the CV slot is later populated with
-a subroutine having a prototype, that flag eventually triggers the warning
-"called too early to check prototype".
-
-If C<flags> has the bit C<RV2CVOPCV_RETURN_NAME_GV> set, then instead
-of returning a pointer to the subroutine it returns a pointer to the
-GV giving the most appropriate name for the subroutine in this context.
-Normally this is just the C<CvGV> of the subroutine, but for an anonymous
-(C<CvANON>) subroutine that is referenced through a GV it will be the
-referencing GV.  The resulting C<GV*> is cast to C<CV*> to be returned.
-A null pointer is returned as usual if there is no statically-determinable
-subroutine.
-
-=for apidoc Amnh||OPpEARLY_CV
-=for apidoc Amnh||OPpENTERSUB_AMPER
-=for apidoc Amnh||RV2CVOPCV_MARK_EARLY
-=for apidoc Amnh||RV2CVOPCV_RETURN_NAME_GV
-
-=cut
-*/
-
-/* shared by toke.c:yylex */
-CV *
-Perl_find_lexical_cv(pTHX_ PADOFFSET off)
-{
-    const PADNAME *name = PAD_COMPNAME(off);
-    CV *compcv = PL_compcv;
-    while (PadnameOUTER(name)) {
-        compcv = CvOUTSIDE(compcv);
-        if (LIKELY(PARENT_PAD_INDEX(name))) {
-            name = PadlistNAMESARRAY(CvPADLIST(compcv))
-                [off = PARENT_PAD_INDEX(name)];
-        }
-        else {
-            /* In an eval() in an inner scope like a function, the
-               intermediate pad in the sub might not be populated with the
-               sub.  So search harder.
-
-               It is possible we won't find the name in this
-               particular scope, but that's fine, if we don't we'll
-               find it in some outer scope.  Finding it here will let us
-               go back to following the PARENT_PAD_INDEX() chain.
-            */
-            const PADNAMELIST * const names = PadlistNAMES(CvPADLIST(compcv));
-            PADNAME * const * const name_p = PadnamelistARRAY(names);
-            int offset;
-            for (offset = PadnamelistMAXNAMED(names); offset > 0; offset--) {
-                const PADNAME * const thisname = name_p[offset];
-                /* The pv is copied from the outer PADNAME to the
-                   inner PADNAMEs so we don't need to compare the
-                   string contents
-                */
-                if (thisname && PadnameLEN(thisname) == PadnameLEN(name)
-                    && PadnamePV(thisname) == PadnamePV(name)) {
-                    name = thisname;
-                    break;
-                }
-            }
-        }
-    }
-    assert(!PadnameIsOUR(name));
-    if (!PadnameIsSTATE(name) && PadnamePROTOCV(name)) {
-        return PadnamePROTOCV(name);
-    }
-    return (CV *)AvARRAY(PadlistARRAY(CvPADLIST(compcv))[1])[off];
-}
-
-CV *
-Perl_rv2cv_op_cv(pTHX_ OP *cvop, U32 flags)
-{
-    OP *rvop;
-    CV *cv;
-    GV *gv;
-    PERL_ARGS_ASSERT_RV2CV_OP_CV;
-    if (flags & ~RV2CVOPCV_FLAG_MASK)
-        Perl_croak(aTHX_ "panic: rv2cv_op_cv bad flags %x", (unsigned)flags);
-    if (cvop->op_type != OP_RV2CV)
-        return NULL;
-    if (cvop->op_private & OPpENTERSUB_AMPER)
-        return NULL;
-    if (!(cvop->op_flags & OPf_KIDS))
-        return NULL;
-    rvop = cUNOPx(cvop)->op_first;
-    switch (rvop->op_type) {
-        case OP_GV: {
-            gv = cGVOPx_gv(rvop);
-            if (!isGV(gv)) {
-                if (SvROK(gv) && SvTYPE(SvRV(gv)) == SVt_PVCV) {
-                    cv = MUTABLE_CV(SvRV(gv));
-                    gv = NULL;
-                    break;
-                }
-                if (flags & RV2CVOPCV_RETURN_STUB)
-                    return (CV *)gv;
-                else return NULL;
-            }
-            cv = GvCVu(gv);
-            if (!cv) {
-                if (flags & RV2CVOPCV_MARK_EARLY)
-                    rvop->op_private |= OPpEARLY_CV;
-                return NULL;
-            }
-        } break;
-        case OP_CONST: {
-            SV *rv = cSVOPx_sv(rvop);
-            if (!SvROK(rv))
-                return NULL;
-            cv = (CV*)SvRV(rv);
-            gv = NULL;
-        } break;
-        case OP_PADCV: {
-            cv = find_lexical_cv(rvop->op_targ);
-            gv = NULL;
-        } break;
-        default: {
-            return NULL;
-        } NOT_REACHED; /* NOTREACHED */
-    }
-    if (SvTYPE((SV*)cv) != SVt_PVCV)
-        return NULL;
-    if (flags & RV2CVOPCV_RETURN_NAME_GV) {
-        if ((!CvANON(cv) && !CvLEXICAL(cv)) || !gv)
-            gv = CvGV(cv);
-        return (CV*)gv;
-    }
-    else if (flags & RV2CVOPCV_MAYBE_NAME_GV) {
-        if (CvLEXICAL(cv) || CvNAMED(cv))
-            return NULL;
-        if (!CvANON(cv) || !gv)
-            gv = CvGV(cv);
-        return (CV*)gv;
-
-    } else {
-        return cv;
-    }
-}
-
-/*
-=for apidoc ck_entersub_args_list
-
-Performs the default fixup of the arguments part of an C<entersub>
-op tree.  This consists of applying list context to each of the
-argument ops.  This is the standard treatment used on a call marked
-with C<&>, or a method call, or a call through a subroutine reference,
-or any other call where the callee can't be identified at compile time,
-or a call where the callee has no prototype.
-
-=cut
-*/
-
-OP *
-Perl_ck_entersub_args_list(pTHX_ OP *entersubop)
-{
-    OP *aop;
-
-    PERL_ARGS_ASSERT_CK_ENTERSUB_ARGS_LIST;
-
-    aop = cUNOPx(entersubop)->op_first;
-    if (!OpHAS_SIBLING(aop))
-        aop = cUNOPx(aop)->op_first;
-    for (aop = OpSIBLING(aop); OpHAS_SIBLING(aop); aop = OpSIBLING(aop)) {
-        /* skip the extra attributes->import() call implicitly added in
-         * something like foo(my $x : bar)
-         */
-        if (   aop->op_type == OP_ENTERSUB
-            && (aop->op_flags & OPf_WANT) == OPf_WANT_VOID
-        )
-            continue;
-        list(aop);
-        op_lvalue(aop, OP_ENTERSUB);
-    }
-    return entersubop;
-}
-
-/*
-=for apidoc ck_entersub_args_proto
-
-Performs the fixup of the arguments part of an C<entersub> op tree
-based on a subroutine prototype.  This makes various modifications to
-the argument ops, from applying context up to inserting C<refgen> ops,
-and checking the number and syntactic types of arguments, as directed by
-the prototype.  This is the standard treatment used on a subroutine call,
-not marked with C<&>, where the callee can be identified at compile time
-and has a prototype.
-
-C<protosv> supplies the subroutine prototype to be applied to the call.
-It may be a normal defined scalar, of which the string value will be used.
-Alternatively, for convenience, it may be a subroutine object (a C<CV*>
-that has been cast to C<SV*>) which has a prototype.  The prototype
-supplied, in whichever form, does not need to match the actual callee
-referenced by the op tree.
-
-If the argument ops disagree with the prototype, for example by having
-an unacceptable number of arguments, a valid op tree is returned anyway.
-The error is reflected in the parser state, normally resulting in a single
-exception at the top level of parsing which covers all the compilation
-errors that occurred.  In the error message, the callee is referred to
-by the name defined by the C<namegv> parameter.
-
-=cut
-*/
-
-OP *
-Perl_ck_entersub_args_proto(pTHX_ OP *entersubop, GV *namegv, SV *protosv)
-{
-    STRLEN proto_len;
-    const char *proto, *proto_end;
-    OP *aop, *prev, *cvop, *parent;
-    int optional = 0;
-    I32 arg = 0;
-    I32 contextclass = 0;
-    const char *e = NULL;
-    PERL_ARGS_ASSERT_CK_ENTERSUB_ARGS_PROTO;
-    if (SvTYPE(protosv) == SVt_PVCV ? !SvPOK(protosv) : !SvOK(protosv))
-        Perl_croak(aTHX_ "panic: ck_entersub_args_proto CV with no proto, "
-                   "flags=%lx", (unsigned long) SvFLAGS(protosv));
-    if (SvTYPE(protosv) == SVt_PVCV)
-         proto = CvPROTO(protosv), proto_len = CvPROTOLEN(protosv);
-    else proto = SvPV(protosv, proto_len);
-    proto = S_strip_spaces(aTHX_ proto, &proto_len);
-    proto_end = proto + proto_len;
-    parent = entersubop;
-    aop = cUNOPx(entersubop)->op_first;
-    if (!OpHAS_SIBLING(aop)) {
-        parent = aop;
-        aop = cUNOPx(aop)->op_first;
-    }
-    prev = aop;
-    aop = OpSIBLING(aop);
-    for (cvop = aop; OpHAS_SIBLING(cvop); cvop = OpSIBLING(cvop)) ;
-    while (aop != cvop) {
-        OP* o3 = aop;
-
-        if (proto >= proto_end)
-        {
-            SV * const namesv = cv_name((CV *)namegv, NULL, 0);
-            yyerror_pv(Perl_form(aTHX_ "Too many arguments for %" SVf,
-                                        SVfARG(namesv)), SvUTF8(namesv));
-            return entersubop;
-        }
-
-        switch (*proto) {
-            case ';':
-                optional = 1;
-                proto++;
-                continue;
-            case '_':
-                /* _ must be at the end */
-                if (proto[1] && !memCHRs(";@%", proto[1]))
-                    goto oops;
-                /* FALLTHROUGH */
-            case '$':
-                proto++;
-                arg++;
-                scalar(aop);
-                break;
-            case '%':
-            case '@':
-                list(aop);
-                arg++;
-                break;
-            case '&':
-                proto++;
-                arg++;
-                if (    o3->op_type != OP_UNDEF
-                    && (o3->op_type != OP_SREFGEN
-                        || (  cUNOPx(cUNOPx(o3)->op_first)->op_first->op_type
-                                != OP_ANONCODE
-                            && cUNOPx(cUNOPx(o3)->op_first)->op_first->op_type
-                                != OP_RV2CV)))
-                    bad_type_gv(arg, namegv, o3,
-                            arg == 1 ? "block or sub {}" : "sub {}");
-                break;
-            case '*':
-                /* '*' allows any scalar type, including bareword */
-                proto++;
-                arg++;
-                if (o3->op_type == OP_RV2GV)
-                    goto wrapref;      /* autoconvert GLOB -> GLOBref */
-                else if (o3->op_type == OP_CONST)
-                    o3->op_private &= ~OPpCONST_STRICT;
-                scalar(aop);
-                break;
-            case '+':
-                proto++;
-                arg++;
-                if (o3->op_type == OP_RV2AV ||
-                    o3->op_type == OP_PADAV ||
-                    o3->op_type == OP_RV2HV ||
-                    o3->op_type == OP_PADHV
-                ) {
-                    goto wrapref;
-                }
-                scalar(aop);
-                break;
-            case '[': case ']':
-                goto oops;
-
-            case '\\':
-                proto++;
-                arg++;
-            again:
-                switch (*proto++) {
-                    case '[':
-                        if (contextclass++ == 0) {
-                            e = (char *) memchr(proto, ']', proto_end - proto);
-                            if (!e || e == proto)
-                                goto oops;
-                        }
-                        else
-                            goto oops;
-                        goto again;
-
-                    case ']':
-                        if (contextclass) {
-                            const char *p = proto;
-                            const char *const end = proto;
-                            contextclass = 0;
-                            while (*--p != '[')
-                                /* \[$] accepts any scalar lvalue */
-                                if (*p == '$'
-                                 && Perl_op_lvalue_flags(aTHX_
-                                     scalar(o3),
-                                     OP_READ, /* not entersub */
-                                     OP_LVALUE_NO_CROAK
-                                    )) goto wrapref;
-                            bad_type_gv(arg, namegv, o3,
-                                    Perl_form(aTHX_ "one of %.*s",(int)(end - p), p));
-                        } else
-                            goto oops;
-                        break;
-                    case '*':
-                        if (o3->op_type == OP_RV2GV)
-                            goto wrapref;
-                        if (!contextclass)
-                            bad_type_gv(arg, namegv, o3, "symbol");
-                        break;
-                    case '&':
-                        if (o3->op_type == OP_ENTERSUB
-                         && !(o3->op_flags & OPf_STACKED))
-                            goto wrapref;
-                        if (!contextclass)
-                            bad_type_gv(arg, namegv, o3, "subroutine");
-                        break;
-                    case '$':
-                        if (o3->op_type == OP_RV2SV ||
-                                o3->op_type == OP_PADSV ||
-                                o3->op_type == OP_HELEM ||
-                                o3->op_type == OP_AELEM)
-                            goto wrapref;
-                        if (!contextclass) {
-                            /* \$ accepts any scalar lvalue */
-                            if (Perl_op_lvalue_flags(aTHX_
-                                    scalar(o3),
-                                    OP_READ,  /* not entersub */
-                                    OP_LVALUE_NO_CROAK
-                               )) goto wrapref;
-                            bad_type_gv(arg, namegv, o3, "scalar");
-                        }
-                        break;
-                    case '@':
-                        if (o3->op_type == OP_RV2AV ||
-                                o3->op_type == OP_PADAV)
-                        {
-                            o3->op_flags &=~ OPf_PARENS;
-                            goto wrapref;
-                        }
-                        if (!contextclass)
-                            bad_type_gv(arg, namegv, o3, "array");
-                        break;
-                    case '%':
-                        if (o3->op_type == OP_RV2HV ||
-                                o3->op_type == OP_PADHV)
-                        {
-                            o3->op_flags &=~ OPf_PARENS;
-                            goto wrapref;
-                        }
-                        if (!contextclass)
-                            bad_type_gv(arg, namegv, o3, "hash");
-                        break;
-                    wrapref:
-                            aop = S_op_sibling_newUNOP(aTHX_ parent, prev,
-                                                OP_REFGEN, 0);
-                        if (contextclass && e) {
-                            proto = e + 1;
-                            contextclass = 0;
-                        }
-                        break;
-                    default: goto oops;
-                }
-                if (contextclass)
-                    goto again;
-                break;
-            case ' ':
-                proto++;
-                continue;
-            default:
-            oops: {
-                Perl_croak(aTHX_ "Malformed prototype for %" SVf ": %" SVf,
-                                  SVfARG(cv_name((CV *)namegv, NULL, 0)),
-                                  SVfARG(protosv));
-            }
-        }
-
-        op_lvalue(aop, OP_ENTERSUB);
-        prev = aop;
-        aop = OpSIBLING(aop);
-    }
-    if (aop == cvop && *proto == '_') {
-        /* generate an access to $_ */
-        op_sibling_splice(parent, prev, 0, newDEFSVOP());
-    }
-    if (!optional && proto_end > proto &&
-        (*proto != '@' && *proto != '%' && *proto != ';' && *proto != '_'))
-    {
-        SV * const namesv = cv_name((CV *)namegv, NULL, 0);
-        yyerror_pv(Perl_form(aTHX_ "Not enough arguments for %" SVf,
-                                    SVfARG(namesv)), SvUTF8(namesv));
-    }
-    return entersubop;
-}
-
-/*
-=for apidoc ck_entersub_args_proto_or_list
-
-Performs the fixup of the arguments part of an C<entersub> op tree either
-based on a subroutine prototype or using default list-context processing.
-This is the standard treatment used on a subroutine call, not marked
-with C<&>, where the callee can be identified at compile time.
-
-C<protosv> supplies the subroutine prototype to be applied to the call,
-or indicates that there is no prototype.  It may be a normal scalar,
-in which case if it is defined then the string value will be used
-as a prototype, and if it is undefined then there is no prototype.
-Alternatively, for convenience, it may be a subroutine object (a C<CV*>
-that has been cast to C<SV*>), of which the prototype will be used if it
-has one.  The prototype (or lack thereof) supplied, in whichever form,
-does not need to match the actual callee referenced by the op tree.
-
-If the argument ops disagree with the prototype, for example by having
-an unacceptable number of arguments, a valid op tree is returned anyway.
-The error is reflected in the parser state, normally resulting in a single
-exception at the top level of parsing which covers all the compilation
-errors that occurred.  In the error message, the callee is referred to
-by the name defined by the C<namegv> parameter.
-
-=cut
-*/
-
-OP *
-Perl_ck_entersub_args_proto_or_list(pTHX_ OP *entersubop,
-        GV *namegv, SV *protosv)
-{
-    PERL_ARGS_ASSERT_CK_ENTERSUB_ARGS_PROTO_OR_LIST;
-    if (SvTYPE(protosv) == SVt_PVCV ? SvPOK(protosv) : SvOK(protosv))
-        return ck_entersub_args_proto(entersubop, namegv, protosv);
-    else
-        return ck_entersub_args_list(entersubop);
-}
-
-OP *
-Perl_ck_entersub_args_core(pTHX_ OP *entersubop, GV *namegv, SV *protosv)
-{
-    IV cvflags = SvIVX(protosv);
-    int opnum = cvflags & 0xffff;
-    OP *aop = cUNOPx(entersubop)->op_first;
-
-    PERL_ARGS_ASSERT_CK_ENTERSUB_ARGS_CORE;
-
-    if (!opnum) {
-        OP *cvop;
-        if (!OpHAS_SIBLING(aop))
-            aop = cUNOPx(aop)->op_first;
-        aop = OpSIBLING(aop);
-        for (cvop = aop; OpSIBLING(cvop); cvop = OpSIBLING(cvop)) ;
-        if (aop != cvop) {
-            SV *namesv = cv_name((CV *)namegv, NULL, CV_NAME_NOTQUAL);
-            yyerror_pv(Perl_form(aTHX_ "Too many arguments for %" SVf,
-                SVfARG(namesv)), SvUTF8(namesv));
-        }
-
-        op_free(entersubop);
-        switch(cvflags >> 16) {
-        case 'F': return newSVOP(OP_CONST, 0,
-                                        newSVpv(CopFILE(PL_curcop),0));
-        case 'L': return newSVOP(
-                           OP_CONST, 0,
-                           Perl_newSVpvf(aTHX_
-                             "%" IVdf, (IV)CopLINE(PL_curcop)
-                           )
-                         );
-        case 'P': return newSVOP(OP_CONST, 0,
-                                   (PL_curstash
-                                     ? newSVhek(HvNAME_HEK(PL_curstash))
-                                     : &PL_sv_undef
-                                   )
-                                );
-        }
-        NOT_REACHED; /* NOTREACHED */
-    }
-    else {
-        OP *prev, *cvop, *first, *parent;
-        U32 flags = 0;
-
-        parent = entersubop;
-        if (!OpHAS_SIBLING(aop)) {
-            parent = aop;
-            aop = cUNOPx(aop)->op_first;
-        }
-
-        first = prev = aop;
-        aop = OpSIBLING(aop);
-        /* find last sibling */
-        for (cvop = aop;
-             OpHAS_SIBLING(cvop);
-             prev = cvop, cvop = OpSIBLING(cvop))
-            ;
-        if (!(cvop->op_private & OPpENTERSUB_NOPAREN)
-            /* Usually, OPf_SPECIAL on an op with no args means that it had
-             * parens, but these have their own meaning for that flag: */
-            && opnum != OP_VALUES && opnum != OP_KEYS && opnum != OP_EACH
-            && opnum != OP_DELETE && opnum != OP_EXISTS)
-                flags |= OPf_SPECIAL;
-        /* excise cvop from end of sibling chain */
-        op_sibling_splice(parent, prev, 1, NULL);
-        op_free(cvop);
-        if (aop == cvop) aop = NULL;
-
-        /* detach remaining siblings from the first sibling, then
-         * dispose of original optree */
-
-        if (aop)
-            op_sibling_splice(parent, first, -1, NULL);
-        op_free(entersubop);
+    if (oa) {
+        while (oa & OA_OPTIONAL)
+            oa >>= 4;
+        if (oa && oa != OA_LIST)
+            return too_few_arguments_pv(o,OP_DESC(o), 0);
+    }
+    return o;
+}
 
-        if (cvflags == (OP_ENTEREVAL | (1<<16)))
-            flags |= OPpEVAL_BYTES <<8;
+OP *
+Perl_ck_glob(pTHX_ OP *o)
+{
+    GV *gv;
 
-        switch (PL_opargs[opnum] & OA_CLASS_MASK) {
-        case OA_UNOP:
-        case OA_BASEOP_OR_UNOP:
-        case OA_FILESTATOP:
-            if (!aop)
-                return newOP(opnum,flags);       /* zero args */
-            if (aop == prev)
-                return newUNOP(opnum,flags,aop); /* one arg */
-            /* too many args */
-            /* FALLTHROUGH */
-        case OA_BASEOP:
-            if (aop) {
-                SV *namesv;
-                OP *nextop;
+    PERL_ARGS_ASSERT_CK_GLOB;
 
-                namesv = cv_name((CV *)namegv, NULL, CV_NAME_NOTQUAL);
-                yyerror_pv(Perl_form(aTHX_ "Too many arguments for %" SVf,
-                    SVfARG(namesv)), SvUTF8(namesv));
-                while (aop) {
-                    nextop = OpSIBLING(aop);
-                    op_free(aop);
-                    aop = nextop;
-                }
+    o = ck_fun(o);
+    if ((o->op_flags & OPf_KIDS) && !OpHAS_SIBLING(cLISTOPo->op_first))
+        op_append_elem(OP_GLOB, o, newDEFSVOP()); /* glob() => glob($_) */
 
-            }
-            return opnum == OP_RUNCV
-                ? newPVOP(OP_RUNCV,0,NULL)
-                : newOP(opnum,0);
-        default:
-            return op_convert_list(opnum,0,aop);
-        }
+    if (!(o->op_flags & OPf_SPECIAL) && (gv = gv_override("glob", 4)))
+    {
+        /* convert
+         *     glob
+         *       \ null - const(wildcard)
+         * into
+         *     null
+         *       \ enter
+         *            \ list
+         *                 \ mark - glob - rv2cv
+         *                             |        \ gv(CORE::GLOBAL::glob)
+         *                             |
+         *                              \ null - const(wildcard)
+         */
+        o->op_flags |= OPf_SPECIAL;
+        o->op_targ = pad_alloc(OP_GLOB, SVs_PADTMP);
+        o = S_new_entersubop(aTHX_ gv, o);
+        o = newUNOP(OP_NULL, 0, o);
+        o->op_targ = OP_GLOB; /* hint at what it used to be: eg in newWHILEOP */
+        return o;
     }
-    NOT_REACHED; /* NOTREACHED */
-    return entersubop;
+    else o->op_flags &= ~OPf_SPECIAL;
+#if !defined(PERL_EXTERNAL_GLOB)
+    if (!PL_globhook) {
+        ENTER;
+        Perl_load_module(aTHX_ PERL_LOADMOD_NOIMPORT,
+                               newSVpvs("File::Glob"), NULL, NULL, NULL);
+        LEAVE;
+    }
+#endif /* !PERL_EXTERNAL_GLOB */
+    gv = (GV *)newSV_type(SVt_NULL);
+    gv_init(gv, 0, "", 0, 0);
+    gv_IOadd(gv);
+    op_append_elem(OP_GLOB, o, newGVOP(OP_GV, 0, gv));
+    SvREFCNT_dec_NN(gv); /* newGVOP increased it */
+    scalarkids(o);
+    return o;
 }
 
-/*
-=for apidoc cv_get_call_checker_flags
+OP *
+Perl_ck_grep(pTHX_ OP *o)
+{
+    LOGOP *gwop;
+    OP *kid;
+    const OPCODE type = o->op_type == OP_GREPSTART ? OP_GREPWHILE : OP_MAPWHILE;
 
-Retrieves the function that will be used to fix up a call to C<cv>.
-Specifically, the function is applied to an C<entersub> op tree for a
-subroutine call, not marked with C<&>, where the callee can be identified
-at compile time as C<cv>.
+    PERL_ARGS_ASSERT_CK_GREP;
 
-The C-level function pointer is returned in C<*ckfun_p>, an SV argument
-for it is returned in C<*ckobj_p>, and control flags are returned in
-C<*ckflags_p>.  The function is intended to be called in this manner:
+    /* don't allocate gwop here, as we may leak it if PL_parser->error_count > 0 */
 
- entersubop = (*ckfun_p)(aTHX_ entersubop, namegv, (*ckobj_p));
+    if (o->op_flags & OPf_STACKED) {
+        kid = cUNOPx(OpSIBLING(cLISTOPo->op_first))->op_first;
+        if (kid->op_type != OP_SCOPE && kid->op_type != OP_LEAVE)
+            return no_fh_allowed(o);
+        o->op_flags &= ~OPf_STACKED;
+    }
+    kid = OpSIBLING(cLISTOPo->op_first);
+    if (type == OP_MAPWHILE)
+        list(kid);
+    else
+        scalar(kid);
+    o = ck_fun(o);
+    if (PL_parser && PL_parser->error_count)
+        return o;
+    kid = OpSIBLING(cLISTOPo->op_first);
+    if (kid->op_type != OP_NULL)
+        Perl_croak(aTHX_ "panic: ck_grep, type=%u", (unsigned) kid->op_type);
+    kid = kUNOP->op_first;
 
-In this call, C<entersubop> is a pointer to the C<entersub> op,
-which may be replaced by the check function, and C<namegv> supplies
-the name that should be used by the check function to refer
-to the callee of the C<entersub> op if it needs to emit any diagnostics.
-It is permitted to apply the check function in non-standard situations,
-such as to a call to a different subroutine or to a method call.
+    gwop = alloc_LOGOP(type, o, LINKLIST(kid));
+    kid->op_next = (OP*)gwop;
+    o->op_private = gwop->op_private = 0;
+    gwop->op_targ = pad_alloc(type, SVs_PADTMP);
 
-C<namegv> may not actually be a GV.  If the C<CALL_CHECKER_REQUIRE_GV>
-bit is clear in C<*ckflags_p>, it is permitted to pass a CV or other SV
-instead, anything that can be used as the first argument to L</cv_name>.
-If the C<CALL_CHECKER_REQUIRE_GV> bit is set in C<*ckflags_p> then the
-check function requires C<namegv> to be a genuine GV.
+    kid = OpSIBLING(cLISTOPo->op_first);
+    for (kid = OpSIBLING(kid); kid; kid = OpSIBLING(kid))
+        op_lvalue(kid, OP_GREPSTART);
 
-By default, the check function is
-L<Perl_ck_entersub_args_proto_or_list|/ck_entersub_args_proto_or_list>,
-the SV parameter is C<cv> itself, and the C<CALL_CHECKER_REQUIRE_GV>
-flag is clear.  This implements standard prototype processing.  It can
-be changed, for a particular subroutine, by L</cv_set_call_checker_flags>.
+    return (OP*)gwop;
+}
 
-If the C<CALL_CHECKER_REQUIRE_GV> bit is set in C<gflags> then it
-indicates that the caller only knows about the genuine GV version of
-C<namegv>, and accordingly the corresponding bit will always be set in
-C<*ckflags_p>, regardless of the check function's recorded requirements.
-If the C<CALL_CHECKER_REQUIRE_GV> bit is clear in C<gflags> then it
-indicates the caller knows about the possibility of passing something
-other than a GV as C<namegv>, and accordingly the corresponding bit may
-be either set or clear in C<*ckflags_p>, indicating the check function's
-recorded requirements.
+OP *
+Perl_ck_index(pTHX_ OP *o)
+{
+    PERL_ARGS_ASSERT_CK_INDEX;
 
-C<gflags> is a bitset passed into C<cv_get_call_checker_flags>, in which
-only the C<CALL_CHECKER_REQUIRE_GV> bit currently has a defined meaning
-(for which see above).  All other bits should be clear.
+    if (o->op_flags & OPf_KIDS) {
+        OP *kid = OpSIBLING(cLISTOPo->op_first);       /* get past pushmark */
+        if (kid)
+            kid = OpSIBLING(kid);                      /* get past "big" */
+        if (kid && kid->op_type == OP_CONST) {
+            const bool save_taint = TAINT_get;
+            SV *sv = kSVOP->op_sv;
+            if (   (!SvPOK(sv) || SvNIOKp(sv) || isREGEXP(sv))
+                && SvOK(sv) && !SvROK(sv))
+            {
+                sv = newSV_type(SVt_NULL);
+                sv_copypv(sv, kSVOP->op_sv);
+                SvREFCNT_dec_NN(kSVOP->op_sv);
+                kSVOP->op_sv = sv;
+            }
+            if (SvOK(sv)) fbm_compile(sv, 0);
+            TAINT_set(save_taint);
+#ifdef NO_TAINT_SUPPORT
+            PERL_UNUSED_VAR(save_taint);
+#endif
+        }
+    }
+    return ck_fun(o);
+}
 
-=for apidoc Amnh||CALL_CHECKER_REQUIRE_GV
+OP *
+Perl_ck_lfun(pTHX_ OP *o)
+{
+    const OPCODE type = o->op_type;
 
-=for apidoc cv_get_call_checker
+    PERL_ARGS_ASSERT_CK_LFUN;
 
-The original form of L</cv_get_call_checker_flags>, which does not return
-checker flags.  When using a checker function returned by this function,
-it is only safe to call it with a genuine GV as its C<namegv> argument.
+    return modkids(ck_fun(o), type);
+}
 
-=cut
-*/
+OP *
+Perl_ck_defined(pTHX_ OP *o)           /* 19990527 MJD */
+{
+    PERL_ARGS_ASSERT_CK_DEFINED;
 
-void
-Perl_cv_get_call_checker_flags(pTHX_ CV *cv, U32 gflags,
-        Perl_call_checker *ckfun_p, SV **ckobj_p, U32 *ckflags_p)
+    if ((o->op_flags & OPf_KIDS)) {
+        switch (cUNOPo->op_first->op_type) {
+        case OP_RV2AV:
+        case OP_PADAV:
+            Perl_croak(aTHX_ "Can't use 'defined(@array)'"
+                             " (Maybe you should just omit the defined()?)");
+            NOT_REACHED; /* NOTREACHED */
+            break;
+        case OP_RV2HV:
+        case OP_PADHV:
+            Perl_croak(aTHX_ "Can't use 'defined(%%hash)'"
+                             " (Maybe you should just omit the defined()?)");
+            NOT_REACHED; /* NOTREACHED */
+            break;
+        default:
+            /* no warning */
+            break;
+        }
+    }
+    return ck_rfun(o);
+}
+
+OP *
+Perl_ck_readline(pTHX_ OP *o)
 {
-    MAGIC *callmg;
-    PERL_ARGS_ASSERT_CV_GET_CALL_CHECKER_FLAGS;
-    PERL_UNUSED_CONTEXT;
-    callmg = SvMAGICAL((SV*)cv) ? mg_find((SV*)cv, PERL_MAGIC_checkcall) : NULL;
-    if (callmg) {
-        *ckfun_p = DPTR2FPTR(Perl_call_checker, callmg->mg_ptr);
-        *ckobj_p = callmg->mg_obj;
-        *ckflags_p = (callmg->mg_flags | gflags) & MGf_REQUIRE_GV;
-    } else {
-        *ckfun_p = Perl_ck_entersub_args_proto_or_list;
-        *ckobj_p = (SV*)cv;
-        *ckflags_p = gflags & MGf_REQUIRE_GV;
+    PERL_ARGS_ASSERT_CK_READLINE;
+
+    if (o->op_flags & OPf_KIDS) {
+         OP *kid = cLISTOPo->op_first;
+         if (!FEATURE_BAREWORD_FILEHANDLES_IS_ENABLED
+             && kid->op_type == OP_CONST && (kid->op_private & OPpCONST_BARE)) {
+             no_bareword_filehandle(SvPVX(kSVOP_sv));
+         }
+         if (kid->op_type == OP_RV2GV) kid->op_private |= OPpALLOW_FAKE;
+         scalar(kid);
+    }
+    else {
+        OP * const newop
+            = newUNOP(OP_READLINE, 0, newGVOP(OP_GV, 0, PL_argvgv));
+        op_free(o);
+        return newop;
     }
+    return o;
 }
 
-void
-Perl_cv_get_call_checker(pTHX_ CV *cv, Perl_call_checker *ckfun_p, SV **ckobj_p)
+OP *
+Perl_ck_rfun(pTHX_ OP *o)
 {
-    U32 ckflags;
-    PERL_ARGS_ASSERT_CV_GET_CALL_CHECKER;
-    PERL_UNUSED_CONTEXT;
-    cv_get_call_checker_flags(cv, CALL_CHECKER_REQUIRE_GV, ckfun_p, ckobj_p,
-        &ckflags);
-}
+    const OPCODE type = o->op_type;
 
-/*
-=for apidoc cv_set_call_checker_flags
+    PERL_ARGS_ASSERT_CK_RFUN;
 
-Sets the function that will be used to fix up a call to C<cv>.
-Specifically, the function is applied to an C<entersub> op tree for a
-subroutine call, not marked with C<&>, where the callee can be identified
-at compile time as C<cv>.
+    return refkids(ck_fun(o), type);
+}
 
-The C-level function pointer is supplied in C<ckfun>, an SV argument for
-it is supplied in C<ckobj>, and control flags are supplied in C<ckflags>.
-The function should be defined like this:
+OP *
+Perl_ck_listiob(pTHX_ OP *o)
+{
+    OP *kid;
 
-    STATIC OP * ckfun(pTHX_ OP *op, GV *namegv, SV *ckobj)
+    PERL_ARGS_ASSERT_CK_LISTIOB;
 
-It is intended to be called in this manner:
+    kid = cLISTOPo->op_first;
+    if (!kid) {
+        o = op_force_list(o);
+        kid = cLISTOPo->op_first;
+    }
+    if (kid->op_type == OP_PUSHMARK)
+        kid = OpSIBLING(kid);
+    if (kid && o->op_flags & OPf_STACKED)
+        kid = OpSIBLING(kid);
+    else if (kid && !OpHAS_SIBLING(kid)) {             /* print HANDLE; */
+        if (kid->op_type == OP_CONST && kid->op_private & OPpCONST_BARE
+         && !kid->op_folded) {
+            if (!FEATURE_BAREWORD_FILEHANDLES_IS_ENABLED) {
+                no_bareword_filehandle(SvPVX(kSVOP_sv));
+            }
+            o->op_flags |= OPf_STACKED;        /* make it a filehandle */
+            scalar(kid);
+            /* replace old const op with new OP_RV2GV parent */
+            kid = S_op_sibling_newUNOP(aTHX_ o, cLISTOPo->op_first,
+                                        OP_RV2GV, OPf_REF);
+            kid = OpSIBLING(kid);
+        }
+    }
 
-    entersubop = ckfun(aTHX_ entersubop, namegv, ckobj);
+    if (!kid)
+        op_append_elem(o->op_type, o, newDEFSVOP());
 
-In this call, C<entersubop> is a pointer to the C<entersub> op,
-which may be replaced by the check function, and C<namegv> supplies
-the name that should be used by the check function to refer
-to the callee of the C<entersub> op if it needs to emit any diagnostics.
-It is permitted to apply the check function in non-standard situations,
-such as to a call to a different subroutine or to a method call.
+    if (o->op_type == OP_PRTF) return modkids(listkids(o), OP_PRTF);
+    return listkids(o);
+}
 
-C<namegv> may not actually be a GV.  For efficiency, perl may pass a
-CV or other SV instead.  Whatever is passed can be used as the first
-argument to L</cv_name>.  You can force perl to pass a GV by including
-C<CALL_CHECKER_REQUIRE_GV> in the C<ckflags>.
+OP *
+Perl_ck_smartmatch(pTHX_ OP *o)
+{
+    PERL_ARGS_ASSERT_CK_SMARTMATCH;
+    if (0 == (o->op_flags & OPf_SPECIAL)) {
+        OP *first  = cBINOPo->op_first;
+        OP *second = OpSIBLING(first);
 
-C<ckflags> is a bitset, in which only the C<CALL_CHECKER_REQUIRE_GV>
-bit currently has a defined meaning (for which see above).  All other
-bits should be clear.
+        /* Implicitly take a reference to an array or hash */
 
-The current setting for a particular CV can be retrieved by
-L</cv_get_call_checker_flags>.
+        /* remove the original two siblings, then add back the
+         * (possibly different) first and second sibs.
+         */
+        op_sibling_splice(o, NULL, 1, NULL);
+        op_sibling_splice(o, NULL, 1, NULL);
+        first  = ref_array_or_hash(first);
+        second = ref_array_or_hash(second);
+        op_sibling_splice(o, NULL, 0, second);
+        op_sibling_splice(o, NULL, 0, first);
 
-=for apidoc cv_set_call_checker
+        /* Implicitly take a reference to a regular expression */
+        if (first->op_type == OP_MATCH && !(first->op_flags & OPf_STACKED)) {
+            OpTYPE_set(first, OP_QR);
+        }
+        if (second->op_type == OP_MATCH && !(second->op_flags & OPf_STACKED)) {
+            OpTYPE_set(second, OP_QR);
+        }
+    }
 
-The original form of L</cv_set_call_checker_flags>, which passes it the
-C<CALL_CHECKER_REQUIRE_GV> flag for backward-compatibility.  The effect
-of that flag setting is that the check function is guaranteed to get a
-genuine GV as its C<namegv> argument.
+    return o;
+}
 
-=cut
-*/
 
-void
-Perl_cv_set_call_checker(pTHX_ CV *cv, Perl_call_checker ckfun, SV *ckobj)
+static OP *
+S_maybe_targlex(pTHX_ OP *o)
 {
-    PERL_ARGS_ASSERT_CV_SET_CALL_CHECKER;
-    cv_set_call_checker_flags(cv, ckfun, ckobj, CALL_CHECKER_REQUIRE_GV);
-}
+    OP * const kid = cLISTOPo->op_first;
+    /* has a disposable target? */
+    if ((PL_opargs[kid->op_type] & OA_TARGLEX)
+        && !(kid->op_flags & OPf_STACKED)
+        /* Cannot steal the second time! */
+        && !(kid->op_private & OPpTARGET_MY)
+        )
+    {
+        OP * const kkid = OpSIBLING(kid);
 
-void
-Perl_cv_set_call_checker_flags(pTHX_ CV *cv, Perl_call_checker ckfun,
-                                     SV *ckobj, U32 ckflags)
-{
-    PERL_ARGS_ASSERT_CV_SET_CALL_CHECKER_FLAGS;
-    if (ckfun == Perl_ck_entersub_args_proto_or_list && ckobj == (SV*)cv) {
-        if (SvMAGICAL((SV*)cv))
-            mg_free_type((SV*)cv, PERL_MAGIC_checkcall);
-    } else {
-        MAGIC *callmg;
-        sv_magic((SV*)cv, &PL_sv_undef, PERL_MAGIC_checkcall, NULL, 0);
-        callmg = mg_find((SV*)cv, PERL_MAGIC_checkcall);
-        assert(callmg);
-        if (callmg->mg_flags & MGf_REFCOUNTED) {
-            SvREFCNT_dec(callmg->mg_obj);
-            callmg->mg_flags &= ~MGf_REFCOUNTED;
-        }
-        callmg->mg_ptr = FPTR2DPTR(char *, ckfun);
-        callmg->mg_obj = ckobj;
-        if (ckobj != (SV*)cv) {
-            SvREFCNT_inc_simple_void_NN(ckobj);
-            callmg->mg_flags |= MGf_REFCOUNTED;
+        /* Can just relocate the target. */
+        if (kkid && kkid->op_type == OP_PADSV
+            && (!(kkid->op_private & OPpLVAL_INTRO)
+               || kkid->op_private & OPpPAD_STATE))
+        {
+            kid->op_targ = kkid->op_targ;
+            kkid->op_targ = 0;
+            /* Now we do not need PADSV and SASSIGN.
+             * Detach kid and free the rest. */
+            op_sibling_splice(o, NULL, 1, NULL);
+            op_free(o);
+            kid->op_private |= OPpTARGET_MY;   /* Used for context settings */
+            return kid;
         }
-        callmg->mg_flags = (callmg->mg_flags &~ MGf_REQUIRE_GV)
-                         | (U8)(ckflags & MGf_REQUIRE_GV) | MGf_COPY;
     }
-}
-
-static void
-S_entersub_alloc_targ(pTHX_ OP * const o)
-{
-    o->op_targ = pad_alloc(OP_ENTERSUB, SVs_PADTMP);
-    o->op_private |= OPpENTERSUB_HASTARG;
+    return o;
 }
 
 OP *
-Perl_ck_subr(pTHX_ OP *o)
+Perl_ck_sassign(pTHX_ OP *o)
 {
-    OP *aop, *cvop;
-    CV *cv;
-    GV *namegv;
-    SV **const_class = NULL;
-
-    PERL_ARGS_ASSERT_CK_SUBR;
-
-    aop = cUNOPx(o)->op_first;
-    if (!OpHAS_SIBLING(aop))
-        aop = cUNOPx(aop)->op_first;
-    aop = OpSIBLING(aop);
-    for (cvop = aop; OpHAS_SIBLING(cvop); cvop = OpSIBLING(cvop)) ;
-    cv = rv2cv_op_cv(cvop, RV2CVOPCV_MARK_EARLY);
-    namegv = cv ? (GV*)rv2cv_op_cv(cvop, RV2CVOPCV_MAYBE_NAME_GV) : NULL;
-
-    o->op_private &= ~1;
-    o->op_private |= (PL_hints & HINT_STRICT_REFS);
-    if (PERLDB_SUB && PL_curstash != PL_debstash)
-        o->op_private |= OPpENTERSUB_DB;
-    switch (cvop->op_type) {
-        case OP_RV2CV:
-            o->op_private |= (cvop->op_private & OPpENTERSUB_AMPER);
-            op_null(cvop);
-            break;
-        case OP_METHOD:
-        case OP_METHOD_NAMED:
-        case OP_METHOD_SUPER:
-        case OP_METHOD_REDIR:
-        case OP_METHOD_REDIR_SUPER:
-            o->op_flags |= OPf_REF;
-            if (aop->op_type == OP_CONST) {
-                aop->op_private &= ~OPpCONST_STRICT;
-                const_class = &cSVOPx(aop)->op_sv;
-            }
-            else if (aop->op_type == OP_LIST) {
-                OP * const sib = OpSIBLING(((UNOP*)aop)->op_first);
-                if (sib && sib->op_type == OP_CONST) {
-                    sib->op_private &= ~OPpCONST_STRICT;
-                    const_class = &cSVOPx(sib)->op_sv;
-                }
-            }
-            /* make class name a shared cow string to speedup method calls */
-            /* constant string might be replaced with object, f.e. bigint */
-            if (const_class && SvPOK(*const_class)) {
-                STRLEN len;
-                const char* str = SvPV(*const_class, len);
-                if (len) {
-                    SV* const shared = newSVpvn_share(
-                        str, SvUTF8(*const_class)
-                                    ? -(SSize_t)len : (SSize_t)len,
-                        0
-                    );
-                    if (SvREADONLY(*const_class))
-                        SvREADONLY_on(shared);
-                    SvREFCNT_dec(*const_class);
-                    *const_class = shared;
-                }
-            }
-            break;
-    }
+    OP * const kid = cBINOPo->op_first;
 
-    if (!cv) {
-        S_entersub_alloc_targ(aTHX_ o);
-        return ck_entersub_args_list(o);
-    } else {
-        Perl_call_checker ckfun;
-        SV *ckobj;
-        U32 ckflags;
-        cv_get_call_checker_flags(cv, 0, &ckfun, &ckobj, &ckflags);
-        if (CvISXSUB(cv) || !CvROOT(cv))
-            S_entersub_alloc_targ(aTHX_ o);
-        if (!namegv) {
-            /* The original call checker API guarantees that a GV will
-               be provided with the right name.  So, if the old API was
-               used (or the REQUIRE_GV flag was passed), we have to reify
-               the CV’s GV, unless this is an anonymous sub.  This is not
-               ideal for lexical subs, as its stringification will include
-               the package.  But it is the best we can do.  */
-            if (ckflags & CALL_CHECKER_REQUIRE_GV) {
-                if (!CvANON(cv) && (!CvNAMED(cv) || CvNAME_HEK(cv)))
-                    namegv = CvGV(cv);
-            }
-            else namegv = MUTABLE_GV(cv);
-            /* After a syntax error in a lexical sub, the cv that
-               rv2cv_op_cv returns may be a nameless stub. */
-            if (!namegv) return ck_entersub_args_list(o);
+    PERL_ARGS_ASSERT_CK_SASSIGN;
 
+    if (OpHAS_SIBLING(kid)) {
+        OP *kkid = OpSIBLING(kid);
+        /* For state variable assignment with attributes, kkid is a list op
+           whose op_last is a padsv. */
+        if ((kkid->op_type == OP_PADSV ||
+             (OP_TYPE_IS_OR_WAS(kkid, OP_LIST) &&
+              (kkid = cLISTOPx(kkid)->op_last)->op_type == OP_PADSV
+             )
+            )
+                && (kkid->op_private & (OPpLVAL_INTRO|OPpPAD_STATE))
+                    == (OPpLVAL_INTRO|OPpPAD_STATE)) {
+            return S_newONCEOP(aTHX_ o, kkid);
         }
-        return ckfun(aTHX_ o, namegv, ckobj);
     }
+    return S_maybe_targlex(aTHX_ o);
 }
 
+
 OP *
-Perl_ck_svconst(pTHX_ OP *o)
+Perl_ck_match(pTHX_ OP *o)
 {
-    SV * const sv = cSVOPo->op_sv;
-    PERL_ARGS_ASSERT_CK_SVCONST;
     PERL_UNUSED_CONTEXT;
-#ifdef PERL_COPY_ON_WRITE
-    /* Since the read-only flag may be used to protect a string buffer, we
-       cannot do copy-on-write with existing read-only scalars that are not
-       already copy-on-write scalars.  To allow $_ = "hello" to do COW with
-       that constant, mark the constant as COWable here, if it is not
-       already read-only. */
-    if (!SvREADONLY(sv) && !SvIsCOW(sv) && SvCANCOW(sv)) {
-        SvIsCOW_on(sv);
-        CowREFCNT(sv) = 0;
-# ifdef PERL_DEBUG_READONLY_COW
-        sv_buf_to_ro(sv);
-# endif
-    }
-#endif
-    SvREADONLY_on(sv);
+    PERL_ARGS_ASSERT_CK_MATCH;
+
     return o;
 }
 
 OP *
-Perl_ck_trunc(pTHX_ OP *o)
+Perl_ck_method(pTHX_ OP *o)
 {
-    PERL_ARGS_ASSERT_CK_TRUNC;
+    SV *sv, *methsv, *rclass;
+    const char* method;
+    char* compatptr;
+    int utf8;
+    STRLEN len, nsplit = 0, i;
+    OP* new_op;
+    OP * const kid = cUNOPo->op_first;
 
-    if (o->op_flags & OPf_KIDS) {
-        SVOP *kid = (SVOP*)cUNOPo->op_first;
+    PERL_ARGS_ASSERT_CK_METHOD;
+    if (kid->op_type != OP_CONST) return o;
 
-        if (kid->op_type == OP_NULL)
-            kid = (SVOP*)OpSIBLING(kid);
-        if (kid && kid->op_type == OP_CONST &&
-            (kid->op_private & OPpCONST_BARE) &&
-            !kid->op_folded)
-        {
-            o->op_flags |= OPf_SPECIAL;
-            kid->op_private &= ~OPpCONST_STRICT;
-            if (!FEATURE_BAREWORD_FILEHANDLES_IS_ENABLED) {
-                no_bareword_filehandle(SvPVX(cSVOPx_sv(kid)));
-            }
-        }
+    sv = kSVOP->op_sv;
+
+    /* replace ' with :: */
+    while ((compatptr = (char *) memchr(SvPVX(sv), '\'',
+                                        SvEND(sv) - SvPVX(sv) )))
+    {
+        *compatptr = ':';
+        sv_insert(sv, compatptr - SvPVX_const(sv), 0, ":", 1);
     }
-    return ck_fun(o);
-}
 
-OP *
-Perl_ck_substr(pTHX_ OP *o)
-{
-    PERL_ARGS_ASSERT_CK_SUBSTR;
+    method = SvPVX_const(sv);
+    len = SvCUR(sv);
+    utf8 = SvUTF8(sv) ? -1 : 1;
 
-    o = ck_fun(o);
-    if ((o->op_flags & OPf_KIDS) && (o->op_private == 4)) {
-        OP *kid = cLISTOPo->op_first;
+    for (i = len - 1; i > 0; --i) if (method[i] == ':') {
+        nsplit = i+1;
+        break;
+    }
 
-        if (kid->op_type == OP_NULL)
-            kid = OpSIBLING(kid);
-        if (kid)
-            /* Historically, substr(delete $foo{bar},...) has been allowed
-               with 4-arg substr.  Keep it working by applying entersub
-               lvalue context.  */
-            op_lvalue(kid, OP_ENTERSUB);
+    methsv = newSVpvn_share(method+nsplit, utf8*(len - nsplit), 0);
 
+    if (!nsplit) { /* $proto->method() */
+        op_free(o);
+        return newMETHOP_named(OP_METHOD_NAMED, 0, methsv);
     }
-    return o;
-}
 
-OP *
-Perl_ck_tell(pTHX_ OP *o)
-{
-    PERL_ARGS_ASSERT_CK_TELL;
-    o = ck_fun(o);
-    if (o->op_flags & OPf_KIDS) {
-     OP *kid = cLISTOPo->op_first;
-     if (kid->op_type == OP_NULL && OpHAS_SIBLING(kid)) kid = OpSIBLING(kid);
-     if (kid->op_type == OP_RV2GV) kid->op_private |= OPpALLOW_FAKE;
+    if (memEQs(method, nsplit, "SUPER::")) { /* $proto->SUPER::method() */
+        op_free(o);
+        return newMETHOP_named(OP_METHOD_SUPER, 0, methsv);
     }
-    return o;
-}
 
-PERL_STATIC_INLINE OP *
-S_last_non_null_kid(OP *o) {
-    OP *last = NULL;
-    if (cUNOPo->op_flags & OPf_KIDS) {
-        OP *k = cLISTOPo->op_first;
-        while (k) {
-            if (k->op_type != OP_NULL) {
-                last = k;
-            }
-            k = OpSIBLING(k);
-        }
+    /* $proto->MyClass::method() and $proto->MyClass::SUPER::method() */
+    if (nsplit >= 9 && strBEGINs(method+nsplit-9, "::SUPER::")) {
+        rclass = newSVpvn_share(method, utf8*(nsplit-9), 0);
+        new_op = newMETHOP_named(OP_METHOD_REDIR_SUPER, 0, methsv);
+    } else {
+        rclass = newSVpvn_share(method, utf8*(nsplit-2), 0);
+        new_op = newMETHOP_named(OP_METHOD_REDIR, 0, methsv);
     }
-
-    return last;
+#ifdef USE_ITHREADS
+    op_relocate_sv(&rclass, &cMETHOPx(new_op)->op_rclass_targ);
+#else
+    cMETHOPx(new_op)->op_rclass_sv = rclass;
+#endif
+    op_free(o);
+    return new_op;
 }
 
 OP *
-Perl_ck_each(pTHX_ OP *o)
+Perl_ck_null(pTHX_ OP *o)
 {
-    OP *kid = o->op_flags & OPf_KIDS ? cUNOPo->op_first : NULL;
-    const unsigned orig_type  = o->op_type;
+    PERL_ARGS_ASSERT_CK_NULL;
+    PERL_UNUSED_CONTEXT;
+    return o;
+}
 
-    PERL_ARGS_ASSERT_CK_EACH;
+OP *
+Perl_ck_open(pTHX_ OP *o)
+{
+    PERL_ARGS_ASSERT_CK_OPEN;
 
-    if (kid) {
-        switch (kid->op_type) {
-            case OP_PADHV:
-                break;
+    S_io_hints(aTHX_ o);
+    {
+         /* In case of three-arg dup open remove strictness
+          * from the last arg if it is a bareword. */
+         OP * const first = cLISTOPx(o)->op_first; /* The pushmark. */
+         OP * const last  = cLISTOPx(o)->op_last;  /* The bareword. */
+         OP *oa;
+         const char *mode;
 
-            case OP_RV2HV:
-                /* Catch out an anonhash here, since the behaviour might be
-                 * confusing.
-                 *
-                 * The typical tree is:
-                 *
-                 *     rv2hv
-                 *         scope
-                 *             null
-                 *             anonhash
-                 *
-                 * If the contents of the block is more complex you might get:
-                 *
-                 *     rv2hv
-                 *         leave
-                 *             enter
-                 *             ...
-                 *             anonhash
-                 *
-                 * Similarly for the anonlist version below.
-                 */
-                if (orig_type == OP_EACH &&
-                    ckWARN(WARN_SYNTAX) &&
-                    (cUNOPx(kid)->op_flags & OPf_KIDS) &&
-                    ( cUNOPx(kid)->op_first->op_type == OP_SCOPE ||
-                      cUNOPx(kid)->op_first->op_type == OP_LEAVE) &&
-                    (cUNOPx(kid)->op_first->op_flags & OPf_KIDS)) {
-                    /* look for last non-null kid, since we might have:
-                       each %{ some code ; +{ anon hash } }
-                    */
-                    OP *k = S_last_non_null_kid(cUNOPx(kid)->op_first);
-                    if (k && k->op_type == OP_ANONHASH) {
-                        /* diag_listed_as: each on anonymous %s will always start from the beginning */
-                        Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "each on anonymous hash will always start from the beginning");
-                    }
-                }
-                break;
-            case OP_RV2AV:
-                if (orig_type == OP_EACH &&
-                    ckWARN(WARN_SYNTAX) &&
-                    (cUNOPx(kid)->op_flags & OPf_KIDS) &&
-                    (cUNOPx(kid)->op_first->op_type == OP_SCOPE ||
-                     cUNOPx(kid)->op_first->op_type == OP_LEAVE) &&
-                    (cUNOPx(kid)->op_first->op_flags & OPf_KIDS)) {
-                    OP *k = S_last_non_null_kid(cUNOPx(kid)->op_first);
-                    if (k && k->op_type == OP_ANONLIST) {
-                        /* diag_listed_as: each on anonymous %s will always start from the beginning */
-                        Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "each on anonymous array will always start from the beginning");
-                    }
-                }
-                /* FALLTHROUGH */
-            case OP_PADAV:
-                OpTYPE_set(o, orig_type == OP_EACH ? OP_AEACH
-                            : orig_type == OP_KEYS ? OP_AKEYS
-                            :                        OP_AVALUES);
-                break;
-            case OP_CONST:
-                if (kid->op_private == OPpCONST_BARE
-                 || !SvROK(cSVOPx_sv(kid))
-                 || (  SvTYPE(SvRV(cSVOPx_sv(kid))) != SVt_PVAV
-                    && SvTYPE(SvRV(cSVOPx_sv(kid))) != SVt_PVHV  )
-                   )
-                    goto bad;
-                /* FALLTHROUGH */
-            default:
-                qerror(Perl_mess(aTHX_
-                    "Experimental %s on scalar is now forbidden",
-                     PL_op_desc[orig_type]));
-               bad:
-                bad_type_pv(1, "hash or array", o, kid);
-                return o;
-        }
+         if ((last->op_type == OP_CONST) &&            /* The bareword. */
+             (last->op_private & OPpCONST_BARE) &&
+             (last->op_private & OPpCONST_STRICT) &&
+             (oa = OpSIBLING(first)) &&                /* The fh. */
+             (oa = OpSIBLING(oa)) &&                   /* The mode. */
+             (oa->op_type == OP_CONST) &&
+             SvPOK(cSVOPx(oa)->op_sv) &&
+             (mode = SvPVX_const(cSVOPx(oa)->op_sv)) &&
+             mode[0] == '>' && mode[1] == '&' &&       /* A dup open. */
+             (last == OpSIBLING(oa)))                  /* The bareword. */
+              last->op_private &= ~OPpCONST_STRICT;
     }
     return ck_fun(o);
 }
 
 OP *
-Perl_ck_length(pTHX_ OP *o)
+Perl_ck_prototype(pTHX_ OP *o)
+{
+    PERL_ARGS_ASSERT_CK_PROTOTYPE;
+    if (!(o->op_flags & OPf_KIDS)) {
+        op_free(o);
+        return newUNOP(OP_PROTOTYPE, 0, newDEFSVOP());
+    }
+    return o;
+}
+
+OP *
+Perl_ck_refassign(pTHX_ OP *o)
 {
-    PERL_ARGS_ASSERT_CK_LENGTH;
+    OP * const right = cLISTOPo->op_first;
+    OP * const left = OpSIBLING(right);
+    OP *varop = cUNOPx(cUNOPx(left)->op_first)->op_first;
+    bool stacked = 0;
 
-    o = ck_fun(o);
+    PERL_ARGS_ASSERT_CK_REFASSIGN;
+    assert (left);
+    assert (left->op_type == OP_SREFGEN);
 
-    if (ckWARN(WARN_SYNTAX)) {
-        const OP *kid = o->op_flags & OPf_KIDS ? cLISTOPo->op_first : NULL;
+    o->op_private = 0;
+    /* we use OPpPAD_STATE in refassign to mean either of those things,
+     * and the code assumes the two flags occupy the same bit position
+     * in the various ops below */
+    assert(OPpPAD_STATE == OPpOUR_INTRO);
 
-        if (kid) {
-            SV *name = NULL;
-            const bool hash = kid->op_type == OP_PADHV
-                           || kid->op_type == OP_RV2HV;
-            switch (kid->op_type) {
-                case OP_PADHV:
-                case OP_PADAV:
-                case OP_RV2HV:
-                case OP_RV2AV:
-                    name = S_op_varname(aTHX_ kid);
-                    break;
-                default:
-                    return o;
+    switch (varop->op_type) {
+    case OP_PADAV:
+        o->op_private |= OPpLVREF_AV;
+        goto settarg;
+    case OP_PADHV:
+        o->op_private |= OPpLVREF_HV;
+        /* FALLTHROUGH */
+    case OP_PADSV:
+      settarg:
+        o->op_private |= (varop->op_private & (OPpLVAL_INTRO|OPpPAD_STATE));
+        o->op_targ = varop->op_targ;
+        varop->op_targ = 0;
+        PAD_COMPNAME_GEN_set(o->op_targ, PERL_INT_MAX);
+        break;
+
+    case OP_RV2AV:
+        o->op_private |= OPpLVREF_AV;
+        goto checkgv;
+        NOT_REACHED; /* NOTREACHED */
+    case OP_RV2HV:
+        o->op_private |= OPpLVREF_HV;
+        /* FALLTHROUGH */
+    case OP_RV2SV:
+      checkgv:
+        o->op_private |= (varop->op_private & (OPpLVAL_INTRO|OPpOUR_INTRO));
+        if (cUNOPx(varop)->op_first->op_type != OP_GV) goto bad;
+      detach_and_stack:
+        /* Point varop to its GV kid, detached.  */
+        varop = op_sibling_splice(varop, NULL, -1, NULL);
+        stacked = TRUE;
+        break;
+    case OP_RV2CV: {
+        OP * const kidparent =
+            OpSIBLING(cUNOPx(cUNOPx(varop)->op_first)->op_first);
+        OP * const kid = cUNOPx(kidparent)->op_first;
+        o->op_private |= OPpLVREF_CV;
+        if (kid->op_type == OP_GV) {
+            SV *sv = (SV*)cGVOPx_gv(kid);
+            varop = kidparent;
+            if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVCV) {
+                /* a CVREF here confuses pp_refassign, so make sure
+                   it gets a GV */
+                CV *const cv = (CV*)SvRV(sv);
+                SV *name_sv = newSVhek_mortal(CvNAME_HEK(cv));
+                (void)gv_init_sv((GV*)sv, CvSTASH(cv), name_sv, 0);
+                assert(SvTYPE(sv) == SVt_PVGV);
             }
-            if (name)
-                Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
-                    "length() used on %" SVf " (did you mean \"scalar(%s%" SVf
-                    ")\"?)",
-                    SVfARG(name), hash ? "keys " : "", SVfARG(name)
-                );
-            else if (hash)
-     /* diag_listed_as: length() used on %s (did you mean "scalar(%s)"?) */
-                Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
-                    "length() used on %%hash (did you mean \"scalar(keys %%hash)\"?)");
-            else
-     /* diag_listed_as: length() used on %s (did you mean "scalar(%s)"?) */
-                Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
-                    "length() used on @array (did you mean \"scalar(@array)\"?)");
+            goto detach_and_stack;
         }
+        if (kid->op_type != OP_PADCV)  goto bad;
+        o->op_targ = kid->op_targ;
+        kid->op_targ = 0;
+        break;
     }
-
+    case OP_AELEM:
+    case OP_HELEM:
+        o->op_private |= (varop->op_private & OPpLVAL_INTRO);
+        o->op_private |= OPpLVREF_ELEM;
+        op_null(varop);
+        stacked = TRUE;
+        /* Detach varop.  */
+        op_sibling_splice(cUNOPx(left)->op_first, NULL, -1, NULL);
+        break;
+    default:
+      bad:
+        /* diag_listed_as: Can't modify reference to %s in %s assignment */
+        yyerror(Perl_form(aTHX_ "Can't modify reference to %s in scalar "
+                                "assignment",
+                                 OP_DESC(varop)));
+        return o;
+    }
+    if (!FEATURE_REFALIASING_IS_ENABLED)
+        Perl_croak(aTHX_
+                  "Experimental aliasing via reference not enabled");
+    Perl_ck_warner_d(aTHX_
+                     packWARN(WARN_EXPERIMENTAL__REFALIASING),
+                    "Aliasing via reference is experimental");
+    if (stacked) {
+        o->op_flags |= OPf_STACKED;
+        op_sibling_splice(o, right, 1, varop);
+    }
+    else {
+        o->op_flags &=~ OPf_STACKED;
+        op_sibling_splice(o, right, 1, NULL);
+    }
+    op_free(left);
     return o;
 }
 
-
 OP *
-Perl_ck_isa(pTHX_ OP *o)
+Perl_ck_repeat(pTHX_ OP *o)
 {
-    OP *classop = cBINOPo->op_last;
-
-    PERL_ARGS_ASSERT_CK_ISA;
+    PERL_ARGS_ASSERT_CK_REPEAT;
 
-    /* Convert barename into PV */
-    if(classop->op_type == OP_CONST && classop->op_private & OPpCONST_BARE) {
-        /* TODO: Optionally convert package to raw HV here */
-        classop->op_private &= ~(OPpCONST_BARE|OPpCONST_STRICT);
+    if (cBINOPo->op_first->op_flags & OPf_PARENS) {
+        OP* kids;
+        o->op_private |= OPpREPEAT_DOLIST;
+        kids = op_sibling_splice(o, NULL, 1, NULL); /* detach first kid */
+        kids = op_force_list(kids); /* promote it to a list */
+        op_sibling_splice(o, NULL, 0, kids); /* and add back */
     }
-
+    else
+        scalar(o);
     return o;
 }
 
+OP *
+Perl_ck_require(pTHX_ OP *o)
+{
+    GV* gv;
 
-/*
-   ---------------------------------------------------------
-
-   Common vars in list assignment
-
-   There now follows some enums and static functions for detecting
-   common variables in list assignments. Here is a little essay I wrote
-   for myself when trying to get my head around this. DAPM.
-
-   ----
-
-   First some random observations:
-
-   * If a lexical var is an alias of something else, e.g.
-       for my $x ($lex, $pkg, $a[0]) {...}
-     then the act of aliasing will increase the reference count of the SV
-
-   * If a package var is an alias of something else, it may still have a
-     reference count of 1, depending on how the alias was created, e.g.
-     in *a = *b, $a may have a refcount of 1 since the GP is shared
-     with a single GvSV pointer to the SV. So If it's an alias of another
-     package var, then RC may be 1; if it's an alias of another scalar, e.g.
-     a lexical var or an array element, then it will have RC > 1.
-
-   * There are many ways to create a package alias; ultimately, XS code
-     may quite legally do GvSV(gv) = SvREFCNT_inc(sv) for example, so
-     run-time tracing mechanisms are unlikely to be able to catch all cases.
-
-   * When the LHS is all my declarations, the same vars can't appear directly
-     on the RHS, but they can indirectly via closures, aliasing and lvalue
-     subs. But those techniques all involve an increase in the lexical
-     scalar's ref count.
-
-   * When the LHS is all lexical vars (but not necessarily my declarations),
-     it is possible for the same lexicals to appear directly on the RHS, and
-     without an increased ref count, since the stack isn't refcounted.
-     This case can be detected at compile time by scanning for common lex
-     vars with PL_generation.
-
-   * lvalue subs defeat common var detection, but they do at least
-     return vars with a temporary ref count increment. Also, you can't
-     tell at compile time whether a sub call is lvalue.
-
-
-   So...
-
-   A: There are a few circumstances where there definitely can't be any
-     commonality:
-
-       LHS empty:  () = (...);
-       RHS empty:  (....) = ();
-       RHS contains only constants or other 'can't possibly be shared'
-           elements (e.g. ops that return PADTMPs):  (...) = (1,2, length)
-           i.e. they only contain ops not marked as dangerous, whose children
-           are also not dangerous;
-       LHS ditto;
-       LHS contains a single scalar element: e.g. ($x) = (....); because
-           after $x has been modified, it won't be used again on the RHS;
-       RHS contains a single element with no aggregate on LHS: e.g.
-           ($a,$b,$c)  = ($x); again, once $a has been modified, its value
-           won't be used again.
-
-   B: If LHS are all 'my' lexical var declarations (or safe ops, which
-     we can ignore):
-
-       my ($a, $b, @c) = ...;
-
-       Due to closure and goto tricks, these vars may already have content.
-       For the same reason, an element on the RHS may be a lexical or package
-       alias of one of the vars on the left, or share common elements, for
-       example:
-
-           my ($x,$y) = f(); # $x and $y on both sides
-           sub f : lvalue { ($x,$y) = (1,2); $y, $x }
-
-       and
-
-           my $ra = f();
-           my @a = @$ra;  # elements of @a on both sides
-           sub f { @a = 1..4; \@a }
-
-
-       First, just consider scalar vars on LHS:
-
-           RHS is safe only if (A), or in addition,
-               * contains only lexical *scalar* vars, where neither side's
-                 lexicals have been flagged as aliases
-
-           If RHS is not safe, then it's always legal to check LHS vars for
-           RC==1, since the only RHS aliases will always be associated
-           with an RC bump.
-
-           Note that in particular, RHS is not safe if:
-
-               * it contains package scalar vars; e.g.:
+    PERL_ARGS_ASSERT_CK_REQUIRE;
 
-                   f();
-                   my ($x, $y) = (2, $x_alias);
-                   sub f { $x = 1; *x_alias = \$x; }
+    if (o->op_flags & OPf_KIDS) {      /* Shall we supply missing .pm? */
+        SVOP * const kid = cSVOPx(cUNOPo->op_first);
+        U32 hash;
+        char *s;
+        STRLEN len;
+        if (kid->op_type == OP_CONST) {
+          SV * const sv = kid->op_sv;
+          U32 const was_readonly = SvREADONLY(sv);
+          if (kid->op_private & OPpCONST_BARE) {
+            const char *end;
+            HEK *hek;
 
-               * It contains other general elements, such as flattened or
-               * spliced or single array or hash elements, e.g.
+            if (was_readonly) {
+                SvREADONLY_off(sv);
+            }
 
-                   f();
-                   my ($x,$y) = @a; # or $a[0] or @a{@b} etc
+            if (SvIsCOW(sv)) sv_force_normal_flags(sv, 0);
 
-                   sub f {
-                       ($x, $y) = (1,2);
-                       use feature 'refaliasing';
-                       \($a[0], $a[1]) = \($y,$x);
-                   }
+            s = SvPVX(sv);
+            len = SvCUR(sv);
+            end = s + len;
+            /* treat ::foo::bar as foo::bar */
+            if (len >= 2 && s[0] == ':' && s[1] == ':')
+                DIE(aTHX_ "Bareword in require must not start with a double-colon: \"%s\"\n", s);
+            if (s == end)
+                DIE(aTHX_ "Bareword in require maps to empty filename");
 
-                 It doesn't matter if the array/hash is lexical or package.
+            for (; s < end; s++) {
+                if (*s == ':' && s[1] == ':') {
+                    *s = '/';
+                    Move(s+2, s+1, end - s - 1, char);
+                    --end;
+                }
+            }
+            SvEND_set(sv, end);
+            sv_catpvs(sv, ".pm");
+            PERL_HASH(hash, SvPVX(sv), SvCUR(sv));
+            hek = share_hek(SvPVX(sv),
+                            (SSize_t)SvCUR(sv) * (SvUTF8(sv) ? -1 : 1),
+                            hash);
+            sv_sethek(sv, hek);
+            unshare_hek(hek);
+            SvFLAGS(sv) |= was_readonly;
+          }
+          else if (SvPOK(sv) && !SvNIOK(sv) && !SvGMAGICAL(sv)
+                && !SvVOK(sv)) {
+            s = SvPV(sv, len);
+            if (SvREFCNT(sv) > 1) {
+                kid->op_sv = newSVpvn_share(
+                    s, SvUTF8(sv) ? -(SSize_t)len : (SSize_t)len, 0);
+                SvREFCNT_dec_NN(sv);
+            }
+            else {
+                HEK *hek;
+                if (was_readonly) SvREADONLY_off(sv);
+                PERL_HASH(hash, s, len);
+                hek = share_hek(s,
+                                SvUTF8(sv) ? -(SSize_t)len : (SSize_t)len,
+                                hash);
+                sv_sethek(sv, hek);
+                unshare_hek(hek);
+                SvFLAGS(sv) |= was_readonly;
+            }
+          }
+        }
+    }
 
-               * it contains a function call that happens to be an lvalue
-                 sub which returns one or more of the above, e.g.
+    if (!(o->op_flags & OPf_SPECIAL) /* Wasn't written as CORE::require */
+        /* handle override, if any */
+     && (gv = gv_override("require", 7))) {
+        OP *kid, *newop;
+        if (o->op_flags & OPf_KIDS) {
+            kid = cUNOPo->op_first;
+            op_sibling_splice(o, NULL, -1, NULL);
+        }
+        else {
+            kid = newDEFSVOP();
+        }
+        op_free(o);
+        newop = S_new_entersubop(aTHX_ gv, kid);
+        return newop;
+    }
 
-                   f();
-                   my ($x,$y) = f();
+    return ck_fun(o);
+}
 
-                   sub f : lvalue {
-                       ($x, $y) = (1,2);
-                       *x1 = \$x;
-                       $y, $x1;
-                   }
+OP *
+Perl_ck_return(pTHX_ OP *o)
+{
+    OP *kid;
 
-                   (so a sub call on the RHS should be treated the same
-                   as having a package var on the RHS).
+    PERL_ARGS_ASSERT_CK_RETURN;
 
-               * any other "dangerous" thing, such an op or built-in that
-                 returns one of the above, e.g. pp_preinc
+    kid = OpSIBLING(cLISTOPo->op_first);
+    if (PL_compcv && CvLVALUE(PL_compcv)) {
+        for (; kid; kid = OpSIBLING(kid))
+            op_lvalue(kid, OP_LEAVESUBLV);
+    }
 
+    return o;
+}
 
-           If RHS is not safe, what we can do however is at compile time flag
-           that the LHS are all my declarations, and at run time check whether
-           all the LHS have RC == 1, and if so skip the full scan.
+OP *
+Perl_ck_select(pTHX_ OP *o)
+{
+    OP* kid;
 
-       Now consider array and hash vars on LHS: e.g. my (...,@a) = ...;
+    PERL_ARGS_ASSERT_CK_SELECT;
 
-           Here the issue is whether there can be elements of @a on the RHS
-           which will get prematurely freed when @a is cleared prior to
-           assignment. This is only a problem if the aliasing mechanism
-           is one which doesn't increase the refcount - only if RC == 1
-           will the RHS element be prematurely freed.
+    if (o->op_flags & OPf_KIDS) {
+        kid = OpSIBLING(cLISTOPo->op_first);     /* get past pushmark */
+        if (kid && OpHAS_SIBLING(kid)) {
+            OpTYPE_set(o, OP_SSELECT);
+            o = ck_fun(o);
+            return fold_constants(op_integerize(op_std_init(o)));
+        }
+    }
+    o = ck_fun(o);
+    kid = OpSIBLING(cLISTOPo->op_first);    /* get past pushmark */
+    if (kid && kid->op_type == OP_RV2GV)
+        kid->op_private &= ~HINT_STRICT_REFS;
+    return o;
+}
 
-           Because the array/hash is being INTROed, it or its elements
-           can't directly appear on the RHS:
+OP *
+Perl_ck_shift(pTHX_ OP *o)
+{
+    const I32 type = o->op_type;
 
-               my (@a) = ($a[0], @a, etc) # NOT POSSIBLE
+    PERL_ARGS_ASSERT_CK_SHIFT;
 
-           but can indirectly, e.g.:
+    if (!(o->op_flags & OPf_KIDS)) {
+        OP *argop;
 
-               my $r = f();
-               my (@a) = @$r;
-               sub f { @a = 1..3; \@a }
+        if (!CvUNIQUE(PL_compcv)) {
+            o->op_flags |= OPf_SPECIAL;
+            return o;
+        }
 
-           So if the RHS isn't safe as defined by (A), we must always
-           mortalise and bump the ref count of any remaining RHS elements
-           when assigning to a non-empty LHS aggregate.
+        argop = newUNOP(OP_RV2AV, 0, scalar(newGVOP(OP_GV, 0, PL_argvgv)));
+        op_free(o);
+        return newUNOP(type, 0, scalar(argop));
+    }
+    return scalar(ck_fun(o));
+}
 
-           Lexical scalars on the RHS aren't safe if they've been involved in
-           aliasing, e.g.
+OP *
+Perl_ck_sort(pTHX_ OP *o)
+{
+    OP *firstkid;
+    OP *kid;
+    U8 stacked;
 
-               use feature 'refaliasing';
+    PERL_ARGS_ASSERT_CK_SORT;
 
-               f();
-               \(my $lex) = \$pkg;
-               my @a = ($lex,3); # equivalent to ($a[0],3)
+    if (o->op_flags & OPf_STACKED)
+        simplify_sort(o);
+    firstkid = OpSIBLING(cLISTOPo->op_first);          /* get past pushmark */
 
-               sub f {
-                   @a = (1,2);
-                   \$pkg = \$a[0];
-               }
+    if (!firstkid)
+        return too_few_arguments_pv(o,OP_DESC(o), 0);
 
-           Similarly with lexical arrays and hashes on the RHS:
+    if ((stacked = o->op_flags & OPf_STACKED)) {       /* may have been cleared */
+        OP *kid = cUNOPx(firstkid)->op_first;          /* get past null */
 
-               f();
-               my @b;
-               my @a = (@b);
+        /* if the first arg is a code block, process it and mark sort as
+         * OPf_SPECIAL */
+        if (kid->op_type == OP_SCOPE || kid->op_type == OP_LEAVE) {
+            LINKLIST(kid);
+            if (kid->op_type == OP_LEAVE)
+                    op_null(kid);                      /* wipe out leave */
+            /* Prevent execution from escaping out of the sort block. */
+            kid->op_next = 0;
 
-               sub f {
-                   @a = (1,2);
-                   \$b[0] = \$a[1];
-                   \$b[1] = \$a[0];
-               }
+            /* provide scalar context for comparison function/block */
+            kid = scalar(firstkid);
+            kid->op_next = kid;
+            o->op_flags |= OPf_SPECIAL;
+        }
+        else if (kid->op_type == OP_CONST
+              && kid->op_private & OPpCONST_BARE) {
+            char tmpbuf[256];
+            STRLEN len;
+            PADOFFSET off;
+            const char * const name = SvPV(kSVOP_sv, len);
+            *tmpbuf = '&';
+            assert (len < 256);
+            Copy(name, tmpbuf+1, len, char);
+            off = pad_findmy_pvn(tmpbuf, len+1, 0);
+            if (off != NOT_IN_PAD) {
+                if (PAD_COMPNAME_FLAGS_isOUR(off)) {
+                    SV * const fq =
+                        newSVhek(HvNAME_HEK(PAD_COMPNAME_OURSTASH(off)));
+                    sv_catpvs(fq, "::");
+                    sv_catsv(fq, kSVOP_sv);
+                    SvREFCNT_dec_NN(kSVOP_sv);
+                    kSVOP->op_sv = fq;
+                }
+                else {
+                    /* replace the const op with the pad op */
+                    op_sibling_splice(firstkid, NULL, 1,
+                        newPADxVOP(OP_PADCV, 0, off));
+                    op_free(kid);
+                }
+            }
+        }
 
+        firstkid = OpSIBLING(firstkid);
+    }
 
+    for (kid = firstkid; kid; kid = OpSIBLING(kid)) {
+        /* provide list context for arguments */
+        list(kid);
+        if (stacked)
+            op_lvalue(kid, OP_GREPSTART);
+    }
 
-   C: As (B), but in addition the LHS may contain non-intro lexicals, e.g.
-       my $a; ($a, my $b) = (....);
+    return o;
+}
 
-       The difference between (B) and (C) is that it is now physically
-       possible for the LHS vars to appear on the RHS too, where they
-       are not reference counted; but in this case, the compile-time
-       PL_generation sweep will detect such common vars.
+/* for sort { X } ..., where X is one of
+ *   $a <=> $b, $b <=> $a, $a cmp $b, $b cmp $a
+ * elide the second child of the sort (the one containing X),
+ * and set these flags as appropriate
+        OPpSORT_NUMERIC;
+        OPpSORT_INTEGER;
+        OPpSORT_DESCEND;
+ * Also, check and warn on lexical $a, $b.
+ */
 
-       So the rules for (C) differ from (B) in that if common vars are
-       detected, the runtime "test RC==1" optimisation can no longer be used,
-       and a full mark and sweep is required
+STATIC void
+S_simplify_sort(pTHX_ OP *o)
+{
+    OP *kid = OpSIBLING(cLISTOPo->op_first);   /* get past pushmark */
+    OP *k;
+    int descending;
+    GV *gv;
+    const char *gvname;
+    bool have_scopeop;
 
-   D: As (C), but in addition the LHS may contain package vars.
+    PERL_ARGS_ASSERT_SIMPLIFY_SORT;
 
-       Since package vars can be aliased without a corresponding refcount
-       increase, all bets are off. It's only safe if (A). E.g.
+    kid = kUNOP->op_first;                             /* get past null */
+    if (!(have_scopeop = kid->op_type == OP_SCOPE)
+     && kid->op_type != OP_LEAVE)
+        return;
+    kid = kLISTOP->op_last;                            /* get past scope */
+    switch(kid->op_type) {
+        case OP_NCMP:
+        case OP_I_NCMP:
+        case OP_SCMP:
+            if (!have_scopeop) goto padkids;
+            break;
+        default:
+            return;
+    }
+    k = kid;                                           /* remember this node*/
+    if (kBINOP->op_first->op_type != OP_RV2SV
+     || kBINOP->op_last ->op_type != OP_RV2SV)
+    {
+        /*
+           Warn about my($a) or my($b) in a sort block, *if* $a or $b is
+           then used in a comparison.  This catches most, but not
+           all cases.  For instance, it catches
+               sort { my($a); $a <=> $b }
+           but not
+               sort { my($a); $a < $b ? -1 : $a == $b ? 0 : 1; }
+           (although why you'd do that is anyone's guess).
+        */
 
-           my ($x, $y) = (1,2);
+       padkids:
+        if (!ckWARN(WARN_SYNTAX)) return;
+        kid = kBINOP->op_first;
+        do {
+            if (kid->op_type == OP_PADSV) {
+                PADNAME * const name = PAD_COMPNAME(kid->op_targ);
+                if (PadnameLEN(name) == 2 && *PadnamePV(name) == '$'
+                 && (  PadnamePV(name)[1] == 'a'
+                    || PadnamePV(name)[1] == 'b'  ))
+                    /* diag_listed_as: "my %s" used in sort comparison */
+                    Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
+                                     "\"%s %s\" used in sort comparison",
+                                      PadnameIsSTATE(name)
+                                        ? "state"
+                                        : "my",
+                                      PadnamePV(name));
+            }
+        } while ((kid = OpSIBLING(kid)));
+        return;
+    }
+    kid = kBINOP->op_first;                            /* get past cmp */
+    if (kUNOP->op_first->op_type != OP_GV)
+        return;
+    kid = kUNOP->op_first;                             /* get past rv2sv */
+    gv = kGVOP_gv;
+    if (GvSTASH(gv) != PL_curstash)
+        return;
+    gvname = GvNAME(gv);
+    if (*gvname == 'a' && gvname[1] == '\0')
+        descending = 0;
+    else if (*gvname == 'b' && gvname[1] == '\0')
+        descending = 1;
+    else
+        return;
 
-           for $x_alias ($x) {
-               ($x_alias, $y) = (3, $x); # whoops
-           }
+    kid = k;                                           /* back to cmp */
+    /* already checked above that it is rv2sv */
+    kid = kBINOP->op_last;                             /* down to 2nd arg */
+    if (kUNOP->op_first->op_type != OP_GV)
+        return;
+    kid = kUNOP->op_first;                             /* get past rv2sv */
+    gv = kGVOP_gv;
+    if (GvSTASH(gv) != PL_curstash)
+        return;
+    gvname = GvNAME(gv);
+    if ( descending
+         ? !(*gvname == 'a' && gvname[1] == '\0')
+         : !(*gvname == 'b' && gvname[1] == '\0'))
+        return;
+    o->op_flags &= ~(OPf_STACKED | OPf_SPECIAL);
+    if (descending)
+        o->op_private |= OPpSORT_DESCEND;
+    if (k->op_type == OP_NCMP)
+        o->op_private |= OPpSORT_NUMERIC;
+    if (k->op_type == OP_I_NCMP)
+        o->op_private |= OPpSORT_NUMERIC | OPpSORT_INTEGER;
+    kid = OpSIBLING(cLISTOPo->op_first);
+    /* cut out and delete old block (second sibling) */
+    op_sibling_splice(o, cLISTOPo->op_first, 1, NULL);
+    op_free(kid);
+}
 
-       Ditto for LHS aggregate package vars.
+OP *
+Perl_ck_split(pTHX_ OP *o)
+{
+    OP *kid;
+    OP *sibs;
 
-   E: Any other dangerous ops on LHS, e.g.
-           (f(), $a[0], @$r) = (...);
+    PERL_ARGS_ASSERT_CK_SPLIT;
 
-       this is similar to (E) in that all bets are off. In addition, it's
-       impossible to determine at compile time whether the LHS
-       contains a scalar or an aggregate, e.g.
+    assert(o->op_type == OP_LIST);
 
-           sub f : lvalue { @a }
-           (f()) = 1..3;
+    if (o->op_flags & OPf_STACKED)
+        return no_fh_allowed(o);
 
-* ---------------------------------------------------------
-*/
+    kid = cLISTOPo->op_first;
+    /* delete leading NULL node, then add a CONST if no other nodes */
+    assert(kid->op_type == OP_NULL);
+    op_sibling_splice(o, NULL, 1,
+        OpHAS_SIBLING(kid) ? NULL : newSVOP(OP_CONST, 0, newSVpvs(" ")));
+    op_free(kid);
+    kid = cLISTOPo->op_first;
 
+    if (kid->op_type != OP_MATCH || kid->op_flags & OPf_STACKED) {
+        /* remove match expression, and replace with new optree with
+         * a match op at its head */
+        op_sibling_splice(o, NULL, 1, NULL);
+        /* pmruntime will handle split " " behavior with flag==2 */
+        kid = pmruntime(newPMOP(OP_MATCH, 0), kid, NULL, 2, 0);
+        op_sibling_splice(o, NULL, 0, kid);
+    }
 
-/* A set of bit flags returned by S_aassign_scan(). Each flag indicates
- * that at least one of the things flagged was seen.
- */
+    assert(kid->op_type == OP_MATCH || kid->op_type == OP_SPLIT);
 
-enum {
-    AAS_MY_SCALAR       = 0x001, /* my $scalar */
-    AAS_MY_AGG          = 0x002, /* aggregate: my @array or my %hash */
-    AAS_LEX_SCALAR      = 0x004, /* $lexical */
-    AAS_LEX_AGG         = 0x008, /* @lexical or %lexical aggregate */
-    AAS_LEX_SCALAR_COMM = 0x010, /* $lexical seen on both sides */
-    AAS_PKG_SCALAR      = 0x020, /* $scalar (where $scalar is pkg var) */
-    AAS_PKG_AGG         = 0x040, /* package @array or %hash aggregate */
-    AAS_DANGEROUS       = 0x080, /* an op (other than the above)
-                                         that's flagged OA_DANGEROUS */
-    AAS_SAFE_SCALAR     = 0x100, /* produces at least one scalar SV that's
-                                        not in any of the categories above */
-    AAS_DEFAV           = 0x200  /* contains just a single '@_' on RHS */
-};
+    if (kPMOP->op_pmflags & PMf_GLOBAL) {
+      Perl_ck_warner(aTHX_ packWARN(WARN_REGEXP),
+                     "Use of /g modifier is meaningless in split");
+    }
 
+    /* eliminate the split op, and move the match op (plus any children)
+     * into its place, then convert the match op into a split op. i.e.
+     *
+     *  SPLIT                    MATCH                 SPLIT(ex-MATCH)
+     *    |                        |                     |
+     *  MATCH - A - B - C   =>     R - A - B - C   =>    R - A - B - C
+     *    |                        |                     |
+     *    R                        X - Y                 X - Y
+     *    |
+     *    X - Y
+     *
+     * (R, if it exists, will be a regcomp op)
+     */
 
+    op_sibling_splice(o, NULL, 1, NULL); /* detach match op from o */
+    sibs = op_sibling_splice(o, NULL, -1, NULL); /* detach any other sibs */
+    op_sibling_splice(kid, cLISTOPx(kid)->op_last, 0, sibs); /* and reattach */
+    OpTYPE_set(kid, OP_SPLIT);
+    kid->op_flags   = (o->op_flags | (kid->op_flags & OPf_KIDS));
+    kid->op_private = o->op_private;
+    op_free(o);
+    o = kid;
+    kid = sibs; /* kid is now the string arg of the split */
 
-/* helper function for S_aassign_scan().
- * check a PAD-related op for commonality and/or set its generation number.
- * Returns a boolean indicating whether its shared */
+    if (!kid) {
+        kid = newDEFSVOP();
+        op_append_elem(OP_SPLIT, o, kid);
+    }
+    scalar(kid);
 
-static bool
-S_aassign_padcheck(pTHX_ OP* o, bool rhs)
-{
-    if (PAD_COMPNAME_GEN(o->op_targ) == PERL_INT_MAX)
-        /* lexical used in aliasing */
-        return TRUE;
+    kid = OpSIBLING(kid);
+    if (!kid) {
+        kid = newSVOP(OP_CONST, 0, newSViv(0));
+        op_append_elem(OP_SPLIT, o, kid);
+        o->op_private |= OPpSPLIT_IMPLIM;
+    }
+    scalar(kid);
 
-    if (rhs)
-        return cBOOL(PAD_COMPNAME_GEN(o->op_targ) == (STRLEN)PL_generation);
-    else
-        PAD_COMPNAME_GEN_set(o->op_targ, PL_generation);
+    if (OpHAS_SIBLING(kid))
+        return too_many_arguments_pv(o,OP_DESC(o), 0);
 
-    return FALSE;
+    return o;
 }
 
-
-/*
-  Helper function for OPpASSIGN_COMMON* detection in rpeep().
-  It scans the left or right hand subtree of the aassign op, and returns a
-  set of flags indicating what sorts of things it found there.
-  '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.
-  '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
-  number of SVs onto the stack); rather it's used as to test whether there
-  can be at most 1 SV pushed; so it's only meanings are "0, 1, many".
-*/
-
-static int
-S_aassign_scan(pTHX_ OP* o, bool rhs, int *scalars_p)
+OP *
+Perl_ck_stringify(pTHX_ OP *o)
 {
-    OP *top_op           = o;
-    OP *effective_top_op = o;
-    int all_flags = 0;
-
-    while (1) {
-    bool top = o == effective_top_op;
-    int flags = 0;
-    OP* next_kid = NULL;
-
-    /* first, look for a solitary @_ on the RHS */
-    if (   rhs
-        && top
-        && (o->op_flags & OPf_KIDS)
-        && OP_TYPE_IS_OR_WAS(o, OP_LIST)
-    ) {
-        OP *kid = cUNOPo->op_first;
-        if (   (   kid->op_type == OP_PUSHMARK
-                || kid->op_type == OP_PADRANGE) /* ex-pushmark */
-            && ((kid = OpSIBLING(kid)))
-            && !OpHAS_SIBLING(kid)
-            && kid->op_type == OP_RV2AV
-            && !(kid->op_flags & OPf_REF)
-            && !(kid->op_private & (OPpLVAL_INTRO|OPpMAYBE_LVSUB))
-            && ((kid->op_flags & OPf_WANT) == OPf_WANT_LIST)
-            && ((kid = cUNOPx(kid)->op_first))
-            && kid->op_type == OP_GV
-            && cGVOPx_gv(kid) == PL_defgv
-        )
-            flags = AAS_DEFAV;
+    OP * const kid = OpSIBLING(cUNOPo->op_first);
+    PERL_ARGS_ASSERT_CK_STRINGIFY;
+    if ((   kid->op_type == OP_JOIN || kid->op_type == OP_QUOTEMETA
+         || kid->op_type == OP_LC   || kid->op_type == OP_LCFIRST
+         || kid->op_type == OP_UC   || kid->op_type == OP_UCFIRST)
+        && !OpHAS_SIBLING(kid)) /* syntax errs can leave extra children */
+    {
+        op_sibling_splice(o, cUNOPo->op_first, -1, NULL);
+        op_free(o);
+        return kid;
     }
+    return ck_fun(o);
+}
 
-    switch (o->op_type) {
-    case OP_GVSV:
-        (*scalars_p)++;
-        all_flags |= AAS_PKG_SCALAR;
-        goto do_next;
+OP *
+Perl_ck_join(pTHX_ OP *o)
+{
+    OP * const kid = OpSIBLING(cLISTOPo->op_first);
 
-    case OP_PADAV:
-    case OP_PADHV:
-        (*scalars_p) += 2;
-        /* if !top, could be e.g. @a[0,1] */
-        all_flags |=  (top && (o->op_flags & OPf_REF))
-                        ? ((o->op_private & OPpLVAL_INTRO)
-                            ? AAS_MY_AGG : AAS_LEX_AGG)
-                        : AAS_DANGEROUS;
-        goto do_next;
+    PERL_ARGS_ASSERT_CK_JOIN;
 
-    case OP_PADSV:
+    if (kid && kid->op_type == OP_MATCH) {
+        if (ckWARN(WARN_SYNTAX)) {
+            const REGEXP *re = PM_GETRE(kPMOP);
+            const SV *msg = re
+                    ? newSVpvn_flags( RX_PRECOMP_const(re), RX_PRELEN(re),
+                                            SVs_TEMP | ( RX_UTF8(re) ? SVf_UTF8 : 0 ) )
+                    : newSVpvs_flags( "STRING", SVs_TEMP );
+            Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
+                        "/%" SVf "/ should probably be written as \"%" SVf "\"",
+                        SVfARG(msg), SVfARG(msg));
+        }
+    }
+    if (kid
+     && (kid->op_type == OP_CONST /* an innocent, unsuspicious separator */
+        || (kid->op_type == OP_PADSV && !(kid->op_private & OPpLVAL_INTRO))
+        || (  kid->op_type==OP_RV2SV && kUNOP->op_first->op_type == OP_GV
+           && !(kid->op_private & (OPpLVAL_INTRO|OPpOUR_INTRO)))))
+    {
+        const OP * const bairn = OpSIBLING(kid); /* the list */
+        if (bairn && !OpHAS_SIBLING(bairn) /* single-item list */
+         && OP_GIMME(bairn,0) == G_SCALAR)
         {
-            int comm = S_aassign_padcheck(aTHX_ o, rhs)
-                        ?  AAS_LEX_SCALAR_COMM : 0;
-            (*scalars_p)++;
-            all_flags |= (o->op_private & OPpLVAL_INTRO)
-                ? (AAS_MY_SCALAR|comm) : (AAS_LEX_SCALAR|comm);
-            goto do_next;
-
+            OP * const ret = op_convert_list(OP_STRINGIFY, OPf_FOLDED,
+                                     op_sibling_splice(o, kid, 1, NULL));
+            op_free(o);
+            return ret;
         }
+    }
 
-    case OP_RV2AV:
-    case OP_RV2HV:
-        (*scalars_p) += 2;
-        if (cUNOPx(o)->op_first->op_type != OP_GV)
-            all_flags |= AAS_DANGEROUS; /* @{expr}, %{expr} */
-        /* @pkg, %pkg */
-        /* if !top, could be e.g. @a[0,1] */
-        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;
-            all_flags |= AAS_DANGEROUS; /* ${expr} */
-        }
-        else
-            all_flags |= AAS_PKG_SCALAR; /* $pkg */
-        goto do_next;
+    return ck_fun(o);
+}
 
-    case OP_SPLIT:
-        if (o->op_private & OPpSPLIT_ASSIGN) {
-            /* the assign in @a = split() has been optimised away
-             * and the @a attached directly to the split op
-             * Treat the array as appearing on the RHS, i.e.
-             *    ... = (@a = split)
-             * is treated like
-             *    ... = @a;
-             */
+/*
+=for apidoc rv2cv_op_cv
 
-            if (o->op_flags & OPf_STACKED) {
-                /* @{expr} = split() - the array expression is tacked
-                 * on as an extra child to split - process kid */
-                next_kid = cLISTOPo->op_last;
-                goto do_next;
-            }
+Examines an op, which is expected to identify a subroutine at runtime,
+and attempts to determine at compile time which subroutine it identifies.
+This is normally used during Perl compilation to determine whether
+a prototype can be applied to a function call.  C<cvop> is the op
+being considered, normally an C<rv2cv> op.  A pointer to the identified
+subroutine is returned, if it could be determined statically, and a null
+pointer is returned if it was not possible to determine statically.
 
-            /* ... else array is directly attached to split op */
-            (*scalars_p) += 2;
-            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 */
-        all_flags |= AAS_SAFE_SCALAR;
-        goto do_next;
+Currently, the subroutine can be identified statically if the RV that the
+C<rv2cv> is to operate on is provided by a suitable C<gv> or C<const> op.
+A C<gv> op is suitable if the GV's CV slot is populated.  A C<const> op is
+suitable if the constant value must be an RV pointing to a CV.  Details of
+this process may change in future versions of Perl.  If the C<rv2cv> op
+has the C<OPpENTERSUB_AMPER> flag set then no attempt is made to identify
+the subroutine statically: this flag is used to suppress compile-time
+magic on a subroutine call, forcing it to use default runtime behaviour.
 
-    case OP_UNDEF:
-        /* undef on LHS following a var is significant, e.g.
-         *    my $x = 1;
-         *    @a = (($x, undef) = (2 => $x));
-         *    # @a shoul be (2,1) not (2,2)
-         *
-         * undef on RHS counts as a scalar:
-         *   ($x, $y)    = (undef, $x); # 2 scalars on RHS: unsafe
-         */
-        if ((!rhs && *scalars_p) || rhs)
-            (*scalars_p)++;
-        flags = AAS_SAFE_SCALAR;
-        break;
+If C<flags> has the bit C<RV2CVOPCV_MARK_EARLY> set, then the handling
+of a GV reference is modified.  If a GV was examined and its CV slot was
+found to be empty, then the C<gv> op has the C<OPpEARLY_CV> flag set.
+If the op is not optimised away, and the CV slot is later populated with
+a subroutine having a prototype, that flag eventually triggers the warning
+"called too early to check prototype".
 
-    case OP_PUSHMARK:
-    case OP_STUB:
-        /* 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 */
-        goto do_next;
+If C<flags> has the bit C<RV2CVOPCV_RETURN_NAME_GV> set, then instead
+of returning a pointer to the subroutine it returns a pointer to the
+GV giving the most appropriate name for the subroutine in this context.
+Normally this is just the C<CvGV> of the subroutine, but for an anonymous
+(C<CvANON>) subroutine that is referenced through a GV it will be the
+referencing GV.  The resulting C<GV*> is cast to C<CV*> to be returned.
+A null pointer is returned as usual if there is no statically-determinable
+subroutine.
 
-    case OP_PADRANGE: /* Ignore padrange; checking its siblings is enough */
-        break;
+=for apidoc Amnh||OPpEARLY_CV
+=for apidoc Amnh||OPpENTERSUB_AMPER
+=for apidoc Amnh||RV2CVOPCV_MARK_EARLY
+=for apidoc Amnh||RV2CVOPCV_RETURN_NAME_GV
 
-    case OP_NULL:
-    case OP_LIST:
-        /* these do nothing, but may have children */
-        break;
+=cut
+*/
 
-    default:
-        if (PL_opargs[o->op_type] & OA_DANGEROUS) {
-            (*scalars_p) += 2;
-            flags = AAS_DANGEROUS;
-            break;
+/* shared by toke.c:yylex */
+CV *
+Perl_find_lexical_cv(pTHX_ PADOFFSET off)
+{
+    const PADNAME *name = PAD_COMPNAME(off);
+    CV *compcv = PL_compcv;
+    while (PadnameOUTER(name)) {
+        compcv = CvOUTSIDE(compcv);
+        if (LIKELY(PARENT_PAD_INDEX(name))) {
+            name = PadlistNAMESARRAY(CvPADLIST(compcv))
+                [off = PARENT_PAD_INDEX(name)];
         }
+        else {
+            /* In an eval() in an inner scope like a function, the
+               intermediate pad in the sub might not be populated with the
+               sub.  So search harder.
 
-        if (   (PL_opargs[o->op_type] & OA_TARGLEX)
-            && (o->op_private & OPpTARGET_MY))
-        {
-            (*scalars_p)++;
-            all_flags |= S_aassign_padcheck(aTHX_ o, rhs)
-                            ? AAS_LEX_SCALAR_COMM : AAS_LEX_SCALAR;
-            goto do_next;
+               It is possible we won't find the name in this
+               particular scope, but that's fine, if we don't we'll
+               find it in some outer scope.  Finding it here will let us
+               go back to following the PARENT_PAD_INDEX() chain.
+            */
+            const PADNAMELIST * const names = PadlistNAMES(CvPADLIST(compcv));
+            PADNAME * const * const name_p = PadnamelistARRAY(names);
+            int offset;
+            for (offset = PadnamelistMAXNAMED(names); offset > 0; offset--) {
+                const PADNAME * const thisname = name_p[offset];
+                /* The pv is copied from the outer PADNAME to the
+                   inner PADNAMEs so we don't need to compare the
+                   string contents
+                */
+                if (thisname && PadnameLEN(thisname) == PadnameLEN(name)
+                    && PadnamePV(thisname) == PadnamePV(name)) {
+                    name = thisname;
+                    break;
+                }
+            }
         }
+    }
+    assert(!PadnameIsOUR(name));
+    if (!PadnameIsSTATE(name) && PadnamePROTOCV(name)) {
+        return PadnamePROTOCV(name);
+    }
+    return (CV *)AvARRAY(PadlistARRAY(CvPADLIST(compcv))[1])[off];
+}
 
-        /* if its an unrecognised, non-dangerous op, assume that it
-         * is the cause of at least one safe scalar */
-        (*scalars_p)++;
-        flags = AAS_SAFE_SCALAR;
-        break;
+CV *
+Perl_rv2cv_op_cv(pTHX_ OP *cvop, U32 flags)
+{
+    OP *rvop;
+    CV *cv;
+    GV *gv;
+    PERL_ARGS_ASSERT_RV2CV_OP_CV;
+    if (flags & ~RV2CVOPCV_FLAG_MASK)
+        Perl_croak(aTHX_ "panic: rv2cv_op_cv bad flags %x", (unsigned)flags);
+    if (cvop->op_type != OP_RV2CV)
+        return NULL;
+    if (cvop->op_private & OPpENTERSUB_AMPER)
+        return NULL;
+    if (!(cvop->op_flags & OPf_KIDS))
+        return NULL;
+    rvop = cUNOPx(cvop)->op_first;
+    switch (rvop->op_type) {
+        case OP_GV: {
+            gv = cGVOPx_gv(rvop);
+            if (!isGV(gv)) {
+                if (SvROK(gv) && SvTYPE(SvRV(gv)) == SVt_PVCV) {
+                    cv = MUTABLE_CV(SvRV(gv));
+                    gv = NULL;
+                    break;
+                }
+                if (flags & RV2CVOPCV_RETURN_STUB)
+                    return (CV *)gv;
+                else return NULL;
+            }
+            cv = GvCVu(gv);
+            if (!cv) {
+                if (flags & RV2CVOPCV_MARK_EARLY)
+                    rvop->op_private |= OPpEARLY_CV;
+                return NULL;
+            }
+        } break;
+        case OP_CONST: {
+            SV *rv = cSVOPx_sv(rvop);
+            if (!SvROK(rv))
+                return NULL;
+            cv = (CV*)SvRV(rv);
+            gv = NULL;
+        } break;
+        case OP_PADCV: {
+            cv = find_lexical_cv(rvop->op_targ);
+            gv = NULL;
+        } break;
+        default: {
+            return NULL;
+        } NOT_REACHED; /* NOTREACHED */
     }
-
-    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) {
-        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 (SvTYPE((SV*)cv) != SVt_PVCV)
+        return NULL;
+    if (flags & RV2CVOPCV_RETURN_NAME_GV) {
+        if ((!CvANON(cv) && !CvLEXICAL(cv)) || !gv)
+            gv = CvGV(cv);
+        return (CV*)gv;
     }
+    else if (flags & RV2CVOPCV_MAYBE_NAME_GV) {
+        if (CvLEXICAL(cv) || CvNAMED(cv))
+            return NULL;
+        if (!CvANON(cv) || !gv)
+            gv = CvGV(cv);
+        return (CV*)gv;
 
-
-    /* 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 */
-
+    } else {
+        return cv;
     }
-    o = next_kid;
-    } /* while */
-
 }
 
+/*
+=for apidoc ck_entersub_args_list
 
-/* Check for in place reverse and sort assignments like "@a = reverse @a"
-   and modify the optree to make them work inplace */
-
-STATIC void
-S_inplace_aassign(pTHX_ OP *o) {
-
-    OP *modop, *modop_pushmark;
-    OP *oright;
-    OP *oleft, *oleft_pushmark;
-
-    PERL_ARGS_ASSERT_INPLACE_AASSIGN;
-
-    assert((o->op_flags & OPf_WANT) == OPf_WANT_VOID);
-
-    assert(cUNOPo->op_first->op_type == OP_NULL);
-    modop_pushmark = cUNOPx(cUNOPo->op_first)->op_first;
-    assert(modop_pushmark->op_type == OP_PUSHMARK);
-    modop = OpSIBLING(modop_pushmark);
-
-    if (modop->op_type != OP_SORT && modop->op_type != OP_REVERSE)
-        return;
-
-    /* no other operation except sort/reverse */
-    if (OpHAS_SIBLING(modop))
-        return;
-
-    assert(cUNOPx(modop)->op_first->op_type == OP_PUSHMARK);
-    if (!(oright = OpSIBLING(cUNOPx(modop)->op_first))) return;
-
-    if (modop->op_flags & OPf_STACKED) {
-        /* skip sort subroutine/block */
-        assert(oright->op_type == OP_NULL);
-        oright = OpSIBLING(oright);
-    }
+Performs the default fixup of the arguments part of an C<entersub>
+op tree.  This consists of applying list context to each of the
+argument ops.  This is the standard treatment used on a call marked
+with C<&>, or a method call, or a call through a subroutine reference,
+or any other call where the callee can't be identified at compile time,
+or a call where the callee has no prototype.
 
-    assert(OpSIBLING(cUNOPo->op_first)->op_type == OP_NULL);
-    oleft_pushmark = cUNOPx(OpSIBLING(cUNOPo->op_first))->op_first;
-    assert(oleft_pushmark->op_type == OP_PUSHMARK);
-    oleft = OpSIBLING(oleft_pushmark);
+=cut
+*/
 
-    /* Check the lhs is an array */
-    if (!oleft ||
-        (oleft->op_type != OP_RV2AV && oleft->op_type != OP_PADAV)
-        || OpHAS_SIBLING(oleft)
-        || (oleft->op_private & OPpLVAL_INTRO)
-    )
-        return;
+OP *
+Perl_ck_entersub_args_list(pTHX_ OP *entersubop)
+{
+    OP *aop;
 
-    /* Only one thing on the rhs */
-    if (OpHAS_SIBLING(oright))
-        return;
+    PERL_ARGS_ASSERT_CK_ENTERSUB_ARGS_LIST;
 
-    /* check the array is the same on both sides */
-    if (oleft->op_type == OP_RV2AV) {
-        if (oright->op_type != OP_RV2AV
-            || !cUNOPx(oright)->op_first
-            || cUNOPx(oright)->op_first->op_type != OP_GV
-            || cUNOPx(oleft )->op_first->op_type != OP_GV
-            || cGVOPx_gv(cUNOPx(oleft)->op_first) !=
-               cGVOPx_gv(cUNOPx(oright)->op_first)
+    aop = cUNOPx(entersubop)->op_first;
+    if (!OpHAS_SIBLING(aop))
+        aop = cUNOPx(aop)->op_first;
+    for (aop = OpSIBLING(aop); OpHAS_SIBLING(aop); aop = OpSIBLING(aop)) {
+        /* skip the extra attributes->import() call implicitly added in
+         * something like foo(my $x : bar)
+         */
+        if (   aop->op_type == OP_ENTERSUB
+            && (aop->op_flags & OPf_WANT) == OPf_WANT_VOID
         )
-            return;
+            continue;
+        list(aop);
+        op_lvalue(aop, OP_ENTERSUB);
     }
-    else if (oright->op_type != OP_PADAV
-        || oright->op_targ != oleft->op_targ
-    )
-        return;
-
-    /* This actually is an inplace assignment */
-
-    modop->op_private |= OPpSORT_INPLACE;
-
-    /* transfer MODishness etc from LHS arg to RHS arg */
-    oright->op_flags = oleft->op_flags;
-
-    /* remove the aassign op and the lhs */
-    op_null(o);
-    op_null(oleft_pushmark);
-    if (oleft->op_type == OP_RV2AV && cUNOPx(oleft)->op_first)
-        op_null(cUNOPx(oleft)->op_first);
-    op_null(oleft);
+    return entersubop;
 }
 
+/*
+=for apidoc ck_entersub_args_proto
 
+Performs the fixup of the arguments part of an C<entersub> op tree
+based on a subroutine prototype.  This makes various modifications to
+the argument ops, from applying context up to inserting C<refgen> ops,
+and checking the number and syntactic types of arguments, as directed by
+the prototype.  This is the standard treatment used on a subroutine call,
+not marked with C<&>, where the callee can be identified at compile time
+and has a prototype.
 
-/* S_maybe_multideref(): given an op_next chain of ops beginning at 'start'
- * that potentially represent a series of one or more aggregate derefs
- * (such as $a->[1]{$key}), examine the chain, and if appropriate, convert
- * the whole chain to a single OP_MULTIDEREF op (maybe with a few
- * additional ops left in too).
- *
- * The caller will have already verified that the first few ops in the
- * chain following 'start' indicate a multideref candidate, and will have
- * set 'orig_o' to the point further on in the chain where the first index
- * expression (if any) begins.  'orig_action' specifies what type of
- * beginning has already been determined by the ops between start..orig_o
- * (e.g.  $lex_ary[], $pkg_ary->{}, expr->[], etc).
- *
- * 'hints' contains any hints flags that need adding (currently just
- * OPpHINT_STRICT_REFS) as found in any rv2av/hv skipped by the caller.
- */
+C<protosv> supplies the subroutine prototype to be applied to the call.
+It may be a normal defined scalar, of which the string value will be used.
+Alternatively, for convenience, it may be a subroutine object (a C<CV*>
+that has been cast to C<SV*>) which has a prototype.  The prototype
+supplied, in whichever form, does not need to match the actual callee
+referenced by the op tree.
 
-STATIC void
-S_maybe_multideref(pTHX_ OP *start, OP *orig_o, UV orig_action, U8 hints)
-{
-    int pass;
-    UNOP_AUX_item *arg_buf = NULL;
-    bool reset_start_targ  = FALSE; /* start->op_targ needs zeroing */
-    int index_skip         = -1;    /* don't output index arg on this action */
-
-    /* similar to regex compiling, do two passes; the first pass
-     * determines whether the op chain is convertible and calculates the
-     * buffer size; the second pass populates the buffer and makes any
-     * changes necessary to ops (such as moving consts to the pad on
-     * threaded builds).
-     *
-     * NB: for things like Coverity, note that both passes take the same
-     * path through the logic tree (except for 'if (pass)' bits), since
-     * both passes are following the same op_next chain; and in
-     * particular, if it would return early on the second pass, it would
-     * already have returned early on the first pass.
-     */
-    for (pass = 0; pass < 2; pass++) {
-        OP *o                = orig_o;
-        UV action            = orig_action;
-        OP *first_elem_op    = NULL;  /* first seen aelem/helem */
-        OP *top_op           = NULL;  /* highest [ah]elem/exists/del/rv2[ah]v */
-        int action_count     = 0;     /* number of actions seen so far */
-        int action_ix        = 0;     /* action_count % (actions per IV) */
-        bool next_is_hash    = FALSE; /* is the next lookup to be a hash? */
-        bool is_last         = FALSE; /* no more derefs to follow */
-        bool maybe_aelemfast = FALSE; /* we can replace with aelemfast? */
-        UV action_word       = 0;     /* all actions so far */
-        UNOP_AUX_item *arg     = arg_buf;
-        UNOP_AUX_item *action_ptr = arg_buf;
-
-        arg++; /* reserve slot for first action word */
-
-        switch (action) {
-        case MDEREF_HV_gvsv_vivify_rv2hv_helem:
-        case MDEREF_HV_gvhv_helem:
-            next_is_hash = TRUE;
-            /* FALLTHROUGH */
-        case MDEREF_AV_gvsv_vivify_rv2av_aelem:
-        case MDEREF_AV_gvav_aelem:
-            if (pass) {
-#ifdef USE_ITHREADS
-                arg->pad_offset = cPADOPx(start)->op_padix;
-                /* stop it being swiped when nulled */
-                cPADOPx(start)->op_padix = 0;
-#else
-                arg->sv = cSVOPx(start)->op_sv;
-                cSVOPx(start)->op_sv = NULL;
-#endif
-            }
-            arg++;
-            break;
+If the argument ops disagree with the prototype, for example by having
+an unacceptable number of arguments, a valid op tree is returned anyway.
+The error is reflected in the parser state, normally resulting in a single
+exception at the top level of parsing which covers all the compilation
+errors that occurred.  In the error message, the callee is referred to
+by the name defined by the C<namegv> parameter.
 
-        case MDEREF_HV_padhv_helem:
-        case MDEREF_HV_padsv_vivify_rv2hv_helem:
-            next_is_hash = TRUE;
-            /* FALLTHROUGH */
-        case MDEREF_AV_padav_aelem:
-        case MDEREF_AV_padsv_vivify_rv2av_aelem:
-            if (pass) {
-                arg->pad_offset = start->op_targ;
-                /* we skip setting op_targ = 0 for now, since the intact
-                 * OP_PADXV is needed by S_check_hash_fields_and_hekify */
-                reset_start_targ = TRUE;
-            }
-            arg++;
-            break;
+=cut
+*/
 
-        case MDEREF_HV_pop_rv2hv_helem:
-            next_is_hash = TRUE;
-            /* FALLTHROUGH */
-        case MDEREF_AV_pop_rv2av_aelem:
-            break;
+OP *
+Perl_ck_entersub_args_proto(pTHX_ OP *entersubop, GV *namegv, SV *protosv)
+{
+    STRLEN proto_len;
+    const char *proto, *proto_end;
+    OP *aop, *prev, *cvop, *parent;
+    int optional = 0;
+    I32 arg = 0;
+    I32 contextclass = 0;
+    const char *e = NULL;
+    PERL_ARGS_ASSERT_CK_ENTERSUB_ARGS_PROTO;
+    if (SvTYPE(protosv) == SVt_PVCV ? !SvPOK(protosv) : !SvOK(protosv))
+        Perl_croak(aTHX_ "panic: ck_entersub_args_proto CV with no proto, "
+                   "flags=%lx", (unsigned long) SvFLAGS(protosv));
+    if (SvTYPE(protosv) == SVt_PVCV)
+         proto = CvPROTO(protosv), proto_len = CvPROTOLEN(protosv);
+    else proto = SvPV(protosv, proto_len);
+    proto = S_strip_spaces(aTHX_ proto, &proto_len);
+    proto_end = proto + proto_len;
+    parent = entersubop;
+    aop = cUNOPx(entersubop)->op_first;
+    if (!OpHAS_SIBLING(aop)) {
+        parent = aop;
+        aop = cUNOPx(aop)->op_first;
+    }
+    prev = aop;
+    aop = OpSIBLING(aop);
+    for (cvop = aop; OpHAS_SIBLING(cvop); cvop = OpSIBLING(cvop)) ;
+    while (aop != cvop) {
+        OP* o3 = aop;
 
-        default:
-            NOT_REACHED; /* NOTREACHED */
-            return;
+        if (proto >= proto_end)
+        {
+            SV * const namesv = cv_name((CV *)namegv, NULL, 0);
+            yyerror_pv(Perl_form(aTHX_ "Too many arguments for %" SVf,
+                                        SVfARG(namesv)), SvUTF8(namesv));
+            return entersubop;
         }
 
-        while (!is_last) {
-            /* look for another (rv2av/hv; get index;
-             * aelem/helem/exists/delele) sequence */
-
-            OP *kid;
-            bool is_deref;
-            bool ok;
-            UV index_type = MDEREF_INDEX_none;
-
-            if (action_count) {
-                /* if this is not the first lookup, consume the rv2av/hv  */
-
-                /* for N levels of aggregate lookup, we normally expect
-                 * that the first N-1 [ah]elem ops will be flagged as
-                 * /DEREF (so they autovivifiy if necessary), and the last
-                 * lookup op not to be.
-                 * For other things (like @{$h{k1}{k2}}) extra scope or
-                 * leave ops can appear, so abandon the effort in that
-                 * case */
-                if (o->op_type != OP_RV2AV && o->op_type != OP_RV2HV)
-                    return;
-
-                /* rv2av or rv2hv sKR/1 */
-
-                ASSUME(!(o->op_flags & ~(OPf_WANT|OPf_KIDS|OPf_PARENS
-                                            |OPf_REF|OPf_MOD|OPf_SPECIAL)));
-                if (o->op_flags != (OPf_WANT_SCALAR|OPf_KIDS|OPf_REF))
-                    return;
-
-                /* at this point, we wouldn't expect any of these
-                 * possible private flags:
-                 * OPpMAYBE_LVSUB, OPpOUR_INTRO, OPpLVAL_INTRO
-                 * OPpTRUEBOOL, OPpMAYBE_TRUEBOOL (rv2hv only)
-                 */
-                ASSUME(!(o->op_private &
-                    ~(OPpHINT_STRICT_REFS|OPpARG1_MASK|OPpSLICEWARNING)));
-
-                hints = (o->op_private & OPpHINT_STRICT_REFS);
-
-                /* make sure the type of the previous /DEREF matches the
-                 * type of the next lookup */
-                ASSUME(o->op_type == (next_is_hash ? OP_RV2HV : OP_RV2AV));
-                top_op = o;
-
-                action = next_is_hash
-                            ? MDEREF_HV_vivify_rv2hv_helem
-                            : MDEREF_AV_vivify_rv2av_aelem;
-                o = o->op_next;
-            }
-
-            /* if this is the second pass, and we're at the depth where
-             * previously we encountered a non-simple index expression,
-             * stop processing the index at this point */
-            if (action_count != index_skip) {
-
-                /* look for one or more simple ops that return an array
-                 * index or hash key */
-
-                switch (o->op_type) {
-                case OP_PADSV:
-                    /* it may be a lexical var index */
-                    ASSUME(!(o->op_flags & ~(OPf_WANT|OPf_PARENS
-                                            |OPf_REF|OPf_MOD|OPf_SPECIAL)));
-                    ASSUME(!(o->op_private &
-                            ~(OPpPAD_STATE|OPpDEREF|OPpLVAL_INTRO)));
-
-                    if (   OP_GIMME(o,0) == G_SCALAR
-                        && !(o->op_flags & (OPf_REF|OPf_MOD))
-                        && o->op_private == 0)
-                    {
-                        if (pass)
-                            arg->pad_offset = o->op_targ;
-                        arg++;
-                        index_type = MDEREF_INDEX_padsv;
-                        o = o->op_next;
-                    }
-                    break;
-
-                case OP_CONST:
-                    if (next_is_hash) {
-                        /* it's a constant hash index */
-                        if (!(SvFLAGS(cSVOPo_sv) & (SVf_IOK|SVf_NOK|SVf_POK)))
-                            /* "use constant foo => FOO; $h{+foo}" for
-                             * some weird FOO, can leave you with constants
-                             * that aren't simple strings. It's not worth
-                             * the extra hassle for those edge cases */
-                            break;
+        switch (*proto) {
+            case ';':
+                optional = 1;
+                proto++;
+                continue;
+            case '_':
+                /* _ must be at the end */
+                if (proto[1] && !memCHRs(";@%", proto[1]))
+                    goto oops;
+                /* FALLTHROUGH */
+            case '$':
+                proto++;
+                arg++;
+                scalar(aop);
+                break;
+            case '%':
+            case '@':
+                list(aop);
+                arg++;
+                break;
+            case '&':
+                proto++;
+                arg++;
+                if (    o3->op_type != OP_UNDEF
+                    && o3->op_type != OP_ANONCODE
+                    && (o3->op_type != OP_SREFGEN
+                        || (  cUNOPx(cUNOPx(o3)->op_first)->op_first->op_type
+                                != OP_ANONCODE
+                            && cUNOPx(cUNOPx(o3)->op_first)->op_first->op_type
+                                != OP_RV2CV)))
+                    bad_type_gv(arg, namegv, o3,
+                            arg == 1 ? "block or sub {}" : "sub {}");
+                break;
+            case '*':
+                /* '*' allows any scalar type, including bareword */
+                proto++;
+                arg++;
+                if (o3->op_type == OP_RV2GV)
+                    goto wrapref;      /* autoconvert GLOB -> GLOBref */
+                else if (o3->op_type == OP_CONST)
+                    o3->op_private &= ~OPpCONST_STRICT;
+                scalar(aop);
+                break;
+            case '+':
+                proto++;
+                arg++;
+                if (o3->op_type == OP_RV2AV ||
+                    o3->op_type == OP_PADAV ||
+                    o3->op_type == OP_RV2HV ||
+                    o3->op_type == OP_PADHV
+                ) {
+                    goto wrapref;
+                }
+                scalar(aop);
+                break;
+            case '[': case ']':
+                goto oops;
 
-                        {
-                            UNOP *rop = NULL;
-                            OP * helem_op = o->op_next;
-
-                            ASSUME(   helem_op->op_type == OP_HELEM
-                                   || helem_op->op_type == OP_NULL
-                                   || pass == 0);
-                            if (helem_op->op_type == OP_HELEM) {
-                                rop = (UNOP*)(((BINOP*)helem_op)->op_first);
-                                if (   helem_op->op_private & OPpLVAL_INTRO
-                                    || rop->op_type != OP_RV2HV
-                                )
-                                    rop = NULL;
-                            }
-                            /* on first pass just check; on second pass
-                             * hekify */
-                            S_check_hash_fields_and_hekify(aTHX_ rop, cSVOPo,
-                                                            pass);
+            case '\\':
+                proto++;
+                arg++;
+            again:
+                switch (*proto++) {
+                    case '[':
+                        if (contextclass++ == 0) {
+                            e = (char *) memchr(proto, ']', proto_end - proto);
+                            if (!e || e == proto)
+                                goto oops;
                         }
+                        else
+                            goto oops;
+                        goto again;
 
-                        if (pass) {
-#ifdef USE_ITHREADS
-                            /* Relocate sv to the pad for thread safety */
-                            op_relocate_sv(&cSVOPo->op_sv, &o->op_targ);
-                            arg->pad_offset = o->op_targ;
-                            o->op_targ = 0;
-#else
-                            arg->sv = cSVOPx_sv(o);
-#endif
+                    case ']':
+                        if (contextclass) {
+                            const char *p = proto;
+                            const char *const end = proto;
+                            contextclass = 0;
+                            while (*--p != '[')
+                                /* \[$] accepts any scalar lvalue */
+                                if (*p == '$'
+                                 && Perl_op_lvalue_flags(aTHX_
+                                     scalar(o3),
+                                     OP_READ, /* not entersub */
+                                     OP_LVALUE_NO_CROAK
+                                    )) goto wrapref;
+                            bad_type_gv(arg, namegv, o3,
+                                    Perl_form(aTHX_ "one of %.*s",(int)(end - p), p));
+                        } else
+                            goto oops;
+                        break;
+                    case '*':
+                        if (o3->op_type == OP_RV2GV)
+                            goto wrapref;
+                        if (!contextclass)
+                            bad_type_gv(arg, namegv, o3, "symbol");
+                        break;
+                    case '&':
+                        if (o3->op_type == OP_ENTERSUB
+                         && !(o3->op_flags & OPf_STACKED))
+                            goto wrapref;
+                        if (!contextclass)
+                            bad_type_gv(arg, namegv, o3, "subroutine");
+                        break;
+                    case '$':
+                        if (o3->op_type == OP_RV2SV ||
+                                o3->op_type == OP_PADSV ||
+                                o3->op_type == OP_HELEM ||
+                                o3->op_type == OP_AELEM)
+                            goto wrapref;
+                        if (!contextclass) {
+                            /* \$ accepts any scalar lvalue */
+                            if (Perl_op_lvalue_flags(aTHX_
+                                    scalar(o3),
+                                    OP_READ,  /* not entersub */
+                                    OP_LVALUE_NO_CROAK
+                               )) goto wrapref;
+                            bad_type_gv(arg, namegv, o3, "scalar");
                         }
-                    }
-                    else {
-                        /* it's a constant array index */
-                        IV iv;
-                        SV *ix_sv = cSVOPo->op_sv;
-                        if (!SvIOK(ix_sv))
-                            break;
-                        iv = SvIV(ix_sv);
-
-                        if (   action_count == 0
-                            && iv >= -128
-                            && iv <= 127
-                            && (   action == MDEREF_AV_padav_aelem
-                                || action == MDEREF_AV_gvav_aelem)
-                        )
-                            maybe_aelemfast = TRUE;
-
-                        if (pass) {
-                            arg->iv = iv;
-                            SvREFCNT_dec_NN(cSVOPo->op_sv);
+                        break;
+                    case '@':
+                        if (o3->op_type == OP_RV2AV ||
+                                o3->op_type == OP_PADAV)
+                        {
+                            o3->op_flags &=~ OPf_PARENS;
+                            goto wrapref;
                         }
-                    }
-                    if (pass)
-                        /* we've taken ownership of the SV */
-                        cSVOPo->op_sv = NULL;
-                    arg++;
-                    index_type = MDEREF_INDEX_const;
-                    o = o->op_next;
-                    break;
-
-                case OP_GV:
-                    /* it may be a package var index */
-
-                    ASSUME(!(o->op_flags & ~(OPf_WANT|OPf_PARENS|OPf_SPECIAL)));
-                    ASSUME(!(o->op_private & ~(OPpEARLY_CV)));
-                    if (  (o->op_flags & ~(OPf_PARENS|OPf_SPECIAL)) != OPf_WANT_SCALAR
-                        || o->op_private != 0
-                    )
+                        if (!contextclass)
+                            bad_type_gv(arg, namegv, o3, "array");
                         break;
-
-                    kid = o->op_next;
-                    if (kid->op_type != OP_RV2SV)
+                    case '%':
+                        if (o3->op_type == OP_RV2HV ||
+                                o3->op_type == OP_PADHV)
+                        {
+                            o3->op_flags &=~ OPf_PARENS;
+                            goto wrapref;
+                        }
+                        if (!contextclass)
+                            bad_type_gv(arg, namegv, o3, "hash");
                         break;
-
-                    ASSUME(!(kid->op_flags &
-                            ~(OPf_WANT|OPf_KIDS|OPf_MOD|OPf_REF
-                             |OPf_SPECIAL|OPf_PARENS)));
-                    ASSUME(!(kid->op_private &
-                                    ~(OPpARG1_MASK
-                                     |OPpHINT_STRICT_REFS|OPpOUR_INTRO
-                                     |OPpDEREF|OPpLVAL_INTRO)));
-                    if(   (kid->op_flags &~ OPf_PARENS)
-                            != (OPf_WANT_SCALAR|OPf_KIDS)
-                       || (kid->op_private & ~(OPpARG1_MASK|HINT_STRICT_REFS))
-                    )
+                    wrapref:
+                            aop = S_op_sibling_newUNOP(aTHX_ parent, prev,
+                                                OP_REFGEN, 0);
+                        if (contextclass && e) {
+                            proto = e + 1;
+                            contextclass = 0;
+                        }
                         break;
-
-                    if (pass) {
-#ifdef USE_ITHREADS
-                        arg->pad_offset = cPADOPx(o)->op_padix;
-                        /* stop it being swiped when nulled */
-                        cPADOPx(o)->op_padix = 0;
-#else
-                        arg->sv = cSVOPx(o)->op_sv;
-                        cSVOPo->op_sv = NULL;
-#endif
-                    }
-                    arg++;
-                    index_type = MDEREF_INDEX_gvsv;
-                    o = kid->op_next;
-                    break;
-
-                } /* switch */
-            } /* action_count != index_skip */
-
-            action |= index_type;
-
-
-            /* at this point we have either:
-             *   * detected what looks like a simple index expression,
-             *     and expect the next op to be an [ah]elem, or
-             *     an nulled  [ah]elem followed by a delete or exists;
-             *  * found a more complex expression, so something other
-             *    than the above follows.
-             */
-
-            /* possibly an optimised away [ah]elem (where op_next is
-             * exists or delete) */
-            if (o->op_type == OP_NULL)
-                o = o->op_next;
-
-            /* at this point we're looking for an OP_AELEM, OP_HELEM,
-             * OP_EXISTS or OP_DELETE */
-
-            /* if a custom array/hash access checker is in scope,
-             * abandon optimisation attempt */
-            if (  (o->op_type == OP_AELEM || o->op_type == OP_HELEM)
-               && PL_check[o->op_type] != Perl_ck_null)
-                return;
-            /* similarly for customised exists and delete */
-            if (  (o->op_type == OP_EXISTS)
-               && PL_check[o->op_type] != Perl_ck_exists)
-                return;
-            if (  (o->op_type == OP_DELETE)
-               && PL_check[o->op_type] != Perl_ck_delete)
-                return;
-
-            if (   o->op_type != OP_AELEM
-                || (o->op_private &
-                      (OPpLVAL_INTRO|OPpLVAL_DEFER|OPpDEREF|OPpMAYBE_LVSUB))
-                )
-                maybe_aelemfast = FALSE;
-
-            /* look for aelem/helem/exists/delete. If it's not the last elem
-             * lookup, it *must* have OPpDEREF_AV/HV, but not many other
-             * flags; if it's the last, then it mustn't have
-             * OPpDEREF_AV/HV, but may have lots of other flags, like
-             * OPpLVAL_INTRO etc
-             */
-
-            if (   index_type == MDEREF_INDEX_none
-                || (   o->op_type != OP_AELEM  && o->op_type != OP_HELEM
-                    && o->op_type != OP_EXISTS && o->op_type != OP_DELETE)
-            )
-                ok = FALSE;
-            else {
-                /* we have aelem/helem/exists/delete with valid simple index */
-
-                is_deref =    (o->op_type == OP_AELEM || o->op_type == OP_HELEM)
-                           && (   (o->op_private & OPpDEREF) == OPpDEREF_AV
-                               || (o->op_private & OPpDEREF) == OPpDEREF_HV);
-
-                /* This doesn't make much sense but is legal:
-                 *    @{ local $x[0][0] } = 1
-                 * Since scope exit will undo the autovivification,
-                 * don't bother in the first place. The OP_LEAVE
-                 * assertion is in case there are other cases of both
-                 * OPpLVAL_INTRO and OPpDEREF which don't include a scope
-                 * exit that would undo the local - in which case this
-                 * block of code would need rethinking.
-                 */
-                if (is_deref && (o->op_private & OPpLVAL_INTRO)) {
-#ifdef DEBUGGING
-                    OP *n = o->op_next;
-                    while (n && (  n->op_type == OP_NULL
-                                || n->op_type == OP_LIST
-                                || n->op_type == OP_SCALAR))
-                        n = n->op_next;
-                    assert(n && n->op_type == OP_LEAVE);
-#endif
-                    o->op_private &= ~OPpDEREF;
-                    is_deref = FALSE;
-                }
-
-                if (is_deref) {
-                    ASSUME(!(o->op_flags &
-                                 ~(OPf_WANT|OPf_KIDS|OPf_MOD|OPf_PARENS)));
-                    ASSUME(!(o->op_private & ~(OPpARG2_MASK|OPpDEREF)));
-
-                    ok =    (o->op_flags &~ OPf_PARENS)
-                               == (OPf_WANT_SCALAR|OPf_KIDS|OPf_MOD)
-                         && !(o->op_private & ~(OPpDEREF|OPpARG2_MASK));
-                }
-                else if (o->op_type == OP_EXISTS) {
-                    ASSUME(!(o->op_flags & ~(OPf_WANT|OPf_KIDS|OPf_PARENS
-                                |OPf_REF|OPf_MOD|OPf_SPECIAL)));
-                    ASSUME(!(o->op_private & ~(OPpARG1_MASK|OPpEXISTS_SUB)));
-                    ok =  !(o->op_private & ~OPpARG1_MASK);
-                }
-                else if (o->op_type == OP_DELETE) {
-                    ASSUME(!(o->op_flags & ~(OPf_WANT|OPf_KIDS|OPf_PARENS
-                                |OPf_REF|OPf_MOD|OPf_SPECIAL)));
-                    ASSUME(!(o->op_private &
-                                    ~(OPpARG1_MASK|OPpSLICE|OPpLVAL_INTRO)));
-                    /* don't handle slices or 'local delete'; the latter
-                     * is fairly rare, and has a complex runtime */
-                    ok =  !(o->op_private & ~OPpARG1_MASK);
-                    if (OP_TYPE_IS_OR_WAS(cUNOPo->op_first, OP_AELEM))
-                        /* skip handling run-tome error */
-                        ok = (ok && cBOOL(o->op_flags & OPf_SPECIAL));
-                }
-                else {
-                    ASSUME(o->op_type == OP_AELEM || o->op_type == OP_HELEM);
-                    ASSUME(!(o->op_flags & ~(OPf_WANT|OPf_KIDS|OPf_MOD
-                                            |OPf_PARENS|OPf_REF|OPf_SPECIAL)));
-                    ASSUME(!(o->op_private & ~(OPpARG2_MASK|OPpMAYBE_LVSUB
-                                    |OPpLVAL_DEFER|OPpDEREF|OPpLVAL_INTRO)));
-                    ok = (o->op_private & OPpDEREF) != OPpDEREF_SV;
-                }
-            }
-
-            if (ok) {
-                if (!first_elem_op)
-                    first_elem_op = o;
-                top_op = o;
-                if (is_deref) {
-                    next_is_hash = cBOOL((o->op_private & OPpDEREF) == OPpDEREF_HV);
-                    o = o->op_next;
-                }
-                else {
-                    is_last = TRUE;
-                    action |= MDEREF_FLAG_last;
+                    default: goto oops;
                 }
+                if (contextclass)
+                    goto again;
+                break;
+            case ' ':
+                proto++;
+                continue;
+            default:
+            oops: {
+                Perl_croak(aTHX_ "Malformed prototype for %" SVf ": %" SVf,
+                                  SVfARG(cv_name((CV *)namegv, NULL, 0)),
+                                  SVfARG(protosv));
             }
-            else {
-                /* at this point we have something that started
-                 * promisingly enough (with rv2av or whatever), but failed
-                 * to find a simple index followed by an
-                 * aelem/helem/exists/delete. If this is the first action,
-                 * give up; but if we've already seen at least one
-                 * aelem/helem, then keep them and add a new action with
-                 * MDEREF_INDEX_none, which causes it to do the vivify
-                 * from the end of the previous lookup, and do the deref,
-                 * but stop at that point. So $a[0][expr] will do one
-                 * av_fetch, vivify and deref, then continue executing at
-                 * expr */
-                if (!action_count)
-                    return;
-                is_last = TRUE;
-                index_skip = action_count;
-                action |= MDEREF_FLAG_last;
-                if (index_type != MDEREF_INDEX_none)
-                    arg--;
-            }
+        }
 
-            action_word |= (action << (action_ix * MDEREF_SHIFT));
-            action_ix++;
-            action_count++;
-            /* if there's no space for the next action, reserve a new slot
-             * for it *before* we start adding args for that action */
-            if ((action_ix + 1) * MDEREF_SHIFT > UVSIZE*8) {
-                if (pass)
-                    action_ptr->uv = action_word;
-                action_word = 0;
-                action_ptr = arg;
-                arg++;
-                action_ix = 0;
-            }
-        } /* while !is_last */
-
-        /* success! */
-
-        if (!action_ix)
-            /* slot reserved for next action word not now needed */
-            arg--;
-        else if (pass)
-            action_ptr->uv = action_word;
-
-        if (pass) {
-            OP *mderef;
-            OP *p, *q;
-
-            mderef = newUNOP_AUX(OP_MULTIDEREF, 0, NULL, arg_buf);
-            if (index_skip == -1) {
-                mderef->op_flags = o->op_flags
-                        & (OPf_WANT|OPf_MOD|(next_is_hash ? OPf_SPECIAL : 0));
-                if (o->op_type == OP_EXISTS)
-                    mderef->op_private = OPpMULTIDEREF_EXISTS;
-                else if (o->op_type == OP_DELETE)
-                    mderef->op_private = OPpMULTIDEREF_DELETE;
-                else
-                    mderef->op_private = o->op_private
-                        & (OPpMAYBE_LVSUB|OPpLVAL_DEFER|OPpLVAL_INTRO);
-            }
-            /* accumulate strictness from every level (although I don't think
-             * they can actually vary) */
-            mderef->op_private |= hints;
+        op_lvalue(aop, OP_ENTERSUB);
+        prev = aop;
+        aop = OpSIBLING(aop);
+    }
+    if (aop == cvop && *proto == '_') {
+        /* generate an access to $_ */
+        op_sibling_splice(parent, prev, 0, newDEFSVOP());
+    }
+    if (!optional && proto_end > proto &&
+        (*proto != '@' && *proto != '%' && *proto != ';' && *proto != '_'))
+    {
+        SV * const namesv = cv_name((CV *)namegv, NULL, 0);
+        yyerror_pv(Perl_form(aTHX_ "Not enough arguments for %" SVf,
+                                    SVfARG(namesv)), SvUTF8(namesv));
+    }
+    return entersubop;
+}
 
-            /* integrate the new multideref op into the optree and the
-             * op_next chain.
-             *
-             * In general an op like aelem or helem has two child
-             * sub-trees: the aggregate expression (a_expr) and the
-             * index expression (i_expr):
-             *
-             *     aelem
-             *       |
-             *     a_expr - i_expr
-             *
-             * The a_expr returns an AV or HV, while the i-expr returns an
-             * index. In general a multideref replaces most or all of a
-             * multi-level tree, e.g.
-             *
-             *     exists
-             *       |
-             *     ex-aelem
-             *       |
-             *     rv2av  - i_expr1
-             *       |
-             *     helem
-             *       |
-             *     rv2hv  - i_expr2
-             *       |
-             *     aelem
-             *       |
-             *     a_expr - i_expr3
-             *
-             * With multideref, all the i_exprs will be simple vars or
-             * constants, except that i_expr1 may be arbitrary in the case
-             * of MDEREF_INDEX_none.
-             *
-             * The bottom-most a_expr will be either:
-             *   1) a simple var (so padXv or gv+rv2Xv);
-             *   2) a simple scalar var dereferenced (e.g. $r->[0]):
-             *      so a simple var with an extra rv2Xv;
-             *   3) or an arbitrary expression.
-             *
-             * 'start', the first op in the execution chain, will point to
-             *   1),2): the padXv or gv op;
-             *   3):    the rv2Xv which forms the last op in the a_expr
-             *          execution chain, and the top-most op in the a_expr
-             *          subtree.
-             *
-             * For all cases, the 'start' node is no longer required,
-             * but we can't free it since one or more external nodes
-             * may point to it. E.g. consider
-             *     $h{foo} = $a ? $b : $c
-             * Here, both the op_next and op_other branches of the
-             * cond_expr point to the gv[*h] of the hash expression, so
-             * we can't free the 'start' op.
-             *
-             * For expr->[...], we need to save the subtree containing the
-             * expression; for the other cases, we just need to save the
-             * start node.
-             * So in all cases, we null the start op and keep it around by
-             * making it the child of the multideref op; for the expr->
-             * case, the expr will be a subtree of the start node.
-             *
-             * So in the simple 1,2 case the  optree above changes to
-             *
-             *     ex-exists
-             *       |
-             *     multideref
-             *       |
-             *     ex-gv (or ex-padxv)
-             *
-             *  with the op_next chain being
-             *
-             *  -> ex-gv -> multideref -> op-following-ex-exists ->
-             *
-             *  In the 3 case, we have
-             *
-             *     ex-exists
-             *       |
-             *     multideref
-             *       |
-             *     ex-rv2xv
-             *       |
-             *    rest-of-a_expr
-             *      subtree
-             *
-             *  and
-             *
-             *  -> rest-of-a_expr subtree ->
-             *    ex-rv2xv -> multideref -> op-following-ex-exists ->
-             *
-             *
-             * Where the last i_expr is non-simple (i.e. MDEREF_INDEX_none,
-             * e.g. $a[0]{foo}[$x+1], the next rv2xv is nulled and the
-             * multideref attached as the child, e.g.
-             *
-             *     exists
-             *       |
-             *     ex-aelem
-             *       |
-             *     ex-rv2av  - i_expr1
-             *       |
-             *     multideref
-             *       |
-             *     ex-whatever
-             *
-             */
+/*
+=for apidoc ck_entersub_args_proto_or_list
 
-            /* if we free this op, don't free the pad entry */
-            if (reset_start_targ)
-                start->op_targ = 0;
+Performs the fixup of the arguments part of an C<entersub> op tree either
+based on a subroutine prototype or using default list-context processing.
+This is the standard treatment used on a subroutine call, not marked
+with C<&>, where the callee can be identified at compile time.
 
+C<protosv> supplies the subroutine prototype to be applied to the call,
+or indicates that there is no prototype.  It may be a normal scalar,
+in which case if it is defined then the string value will be used
+as a prototype, and if it is undefined then there is no prototype.
+Alternatively, for convenience, it may be a subroutine object (a C<CV*>
+that has been cast to C<SV*>), of which the prototype will be used if it
+has one.  The prototype (or lack thereof) supplied, in whichever form,
+does not need to match the actual callee referenced by the op tree.
 
-            /* Cut the bit we need to save out of the tree and attach to
-             * the multideref op, then free the rest of the tree */
+If the argument ops disagree with the prototype, for example by having
+an unacceptable number of arguments, a valid op tree is returned anyway.
+The error is reflected in the parser state, normally resulting in a single
+exception at the top level of parsing which covers all the compilation
+errors that occurred.  In the error message, the callee is referred to
+by the name defined by the C<namegv> parameter.
 
-            /* find parent of node to be detached (for use by splice) */
-            p = first_elem_op;
-            if (   orig_action == MDEREF_AV_pop_rv2av_aelem
-                || orig_action == MDEREF_HV_pop_rv2hv_helem)
-            {
-                /* there is an arbitrary expression preceding us, e.g.
-                 * expr->[..]? so we need to save the 'expr' subtree */
-                if (p->op_type == OP_EXISTS || p->op_type == OP_DELETE)
-                    p = cUNOPx(p)->op_first;
-                ASSUME(   start->op_type == OP_RV2AV
-                       || start->op_type == OP_RV2HV);
-            }
-            else {
-                /* either a padXv or rv2Xv+gv, maybe with an ex-Xelem
-                 * above for exists/delete. */
-                while (   (p->op_flags & OPf_KIDS)
-                       && cUNOPx(p)->op_first != start
-                )
-                    p = cUNOPx(p)->op_first;
-            }
-            ASSUME(cUNOPx(p)->op_first == start);
+=cut
+*/
 
-            /* detach from main tree, and re-attach under the multideref */
-            op_sibling_splice(mderef, NULL, 0,
-                    op_sibling_splice(p, NULL, 1, NULL));
-            op_null(start);
+OP *
+Perl_ck_entersub_args_proto_or_list(pTHX_ OP *entersubop,
+        GV *namegv, SV *protosv)
+{
+    PERL_ARGS_ASSERT_CK_ENTERSUB_ARGS_PROTO_OR_LIST;
+    if (SvTYPE(protosv) == SVt_PVCV ? SvPOK(protosv) : SvOK(protosv))
+        return ck_entersub_args_proto(entersubop, namegv, protosv);
+    else
+        return ck_entersub_args_list(entersubop);
+}
 
-            start->op_next = mderef;
+OP *
+Perl_ck_entersub_args_core(pTHX_ OP *entersubop, GV *namegv, SV *protosv)
+{
+    IV cvflags = SvIVX(protosv);
+    int opnum = cvflags & 0xffff;
+    OP *aop = cUNOPx(entersubop)->op_first;
 
-            mderef->op_next = index_skip == -1 ? o->op_next : o;
+    PERL_ARGS_ASSERT_CK_ENTERSUB_ARGS_CORE;
 
-            /* excise and free the original tree, and replace with
-             * the multideref op */
-            p = op_sibling_splice(top_op, NULL, -1, mderef);
-            while (p) {
-                q = OpSIBLING(p);
-                op_free(p);
-                p = q;
-            }
-            op_null(top_op);
+    if (!opnum) {
+        OP *cvop;
+        if (!OpHAS_SIBLING(aop))
+            aop = cUNOPx(aop)->op_first;
+        aop = OpSIBLING(aop);
+        for (cvop = aop; OpSIBLING(cvop); cvop = OpSIBLING(cvop)) ;
+        if (aop != cvop) {
+            SV *namesv = cv_name((CV *)namegv, NULL, CV_NAME_NOTQUAL);
+            yyerror_pv(Perl_form(aTHX_ "Too many arguments for %" SVf,
+                SVfARG(namesv)), SvUTF8(namesv));
         }
-        else {
-            Size_t size = arg - arg_buf;
 
-            if (maybe_aelemfast && action_count == 1)
-                return;
-
-            arg_buf = (UNOP_AUX_item*)PerlMemShared_malloc(
-                                sizeof(UNOP_AUX_item) * (size + 1));
-            /* for dumping etc: store the length in a hidden first slot;
-             * we set the op_aux pointer to the second slot */
-            arg_buf->uv = size;
-            arg_buf++;
+        op_free(entersubop);
+        switch(cvflags >> 16) {
+        case 'F': return newSVOP(OP_CONST, 0,
+                                        newSVpv(CopFILE(PL_curcop),0));
+        case 'L': return newSVOP(
+                           OP_CONST, 0,
+                           Perl_newSVpvf(aTHX_
+                             "%" LINE_Tf, CopLINE(PL_curcop)
+                           )
+                         );
+        case 'P': return newSVOP(OP_CONST, 0,
+                                   (PL_curstash
+                                     ? newSVhek(HvNAME_HEK(PL_curstash))
+                                     : &PL_sv_undef
+                                   )
+                                );
         }
-    } /* for (pass = ...) */
-}
-
-/* See if the ops following o are such that o will always be executed in
- * boolean context: that is, the SV which o pushes onto the stack will
- * only ever be consumed by later ops via SvTRUE(sv) or similar.
- * If so, set a suitable private flag on o. Normally this will be
- * bool_flag; but see below why maybe_flag is needed too.
- *
- * Typically the two flags you pass will be the generic OPpTRUEBOOL and
- * OPpMAYBE_TRUEBOOL, buts it's possible that for some ops those bits may
- * already be taken, so you'll have to give that op two different flags.
- *
- * More explanation of 'maybe_flag' and 'safe_and' parameters.
- * The binary logical ops &&, ||, // (plus 'if' and 'unless' which use
- * those underlying ops) short-circuit, which means that rather than
- * necessarily returning a truth value, they may return the LH argument,
- * which may not be boolean. For example in $x = (keys %h || -1), keys
- * should return a key count rather than a boolean, even though its
- * sort-of being used in boolean context.
- *
- * So we only consider such logical ops to provide boolean context to
- * their LH argument if they themselves are in void or boolean context.
- * However, sometimes the context isn't known until run-time. In this
- * case the op is marked with the maybe_flag flag it.
- *
- * Consider the following.
- *
- *     sub f { ....;  if (%h) { .... } }
- *
- * This is actually compiled as
- *
- *     sub f { ....;  %h && do { .... } }
- *
- * Here we won't know until runtime whether the final statement (and hence
- * the &&) is in void context and so is safe to return a boolean value.
- * So mark o with maybe_flag rather than the bool_flag.
- * Note that there is cost associated with determining context at runtime
- * (e.g. a call to block_gimme()), so it may not be worth setting (at
- * compile time) and testing (at runtime) maybe_flag if the scalar verses
- * boolean costs savings are marginal.
- *
- * However, we can do slightly better with && (compared to || and //):
- * this op only returns its LH argument when that argument is false. In
- * this case, as long as the op promises to return a false value which is
- * valid in both boolean and scalar contexts, we can mark an op consumed
- * by && with bool_flag rather than maybe_flag.
- * For example as long as pp_padhv and pp_rv2hv return &PL_sv_zero rather
- * than &PL_sv_no for a false result in boolean context, then it's safe. An
- * op which promises to handle this case is indicated by setting safe_and
- * to true.
- */
+        NOT_REACHED; /* NOTREACHED */
+    }
+    else {
+        OP *prev, *cvop, *first, *parent;
+        U32 flags = 0;
 
-static void
-S_check_for_bool_cxt(OP*o, bool safe_and, U8 bool_flag, U8 maybe_flag)
-{
-    OP *lop;
-    U8 flag = 0;
+        parent = entersubop;
+        if (!OpHAS_SIBLING(aop)) {
+            parent = aop;
+            aop = cUNOPx(aop)->op_first;
+        }
 
-    assert((o->op_flags & OPf_WANT) == OPf_WANT_SCALAR);
+        first = prev = aop;
+        aop = OpSIBLING(aop);
+        /* find last sibling */
+        for (cvop = aop;
+             OpHAS_SIBLING(cvop);
+             prev = cvop, cvop = OpSIBLING(cvop))
+            ;
+        if (!(cvop->op_private & OPpENTERSUB_NOPAREN)
+            /* Usually, OPf_SPECIAL on an op with no args means that it had
+             * parens, but these have their own meaning for that flag: */
+            && opnum != OP_VALUES && opnum != OP_KEYS && opnum != OP_EACH
+            && opnum != OP_DELETE && opnum != OP_EXISTS)
+                flags |= OPf_SPECIAL;
+        /* excise cvop from end of sibling chain */
+        op_sibling_splice(parent, prev, 1, NULL);
+        op_free(cvop);
+        if (aop == cvop) aop = NULL;
 
-    /* OPpTARGET_MY and boolean context probably don't mix well.
-     * If someone finds a valid use case, maybe add an extra flag to this
-     * function which indicates its safe to do so for this op? */
-    assert(!(   (PL_opargs[o->op_type] & OA_TARGLEX)
-             && (o->op_private & OPpTARGET_MY)));
+        /* detach remaining siblings from the first sibling, then
+         * dispose of original optree */
 
-    lop = o->op_next;
+        if (aop)
+            op_sibling_splice(parent, first, -1, NULL);
+        op_free(entersubop);
 
-    while (lop) {
-        switch (lop->op_type) {
-        case OP_NULL:
-        case OP_SCALAR:
-            break;
+        if (cvflags == (OP_ENTEREVAL | (1<<16)))
+            flags |= OPpEVAL_BYTES <<8;
 
-        /* these two consume the stack argument in the scalar case,
-         * and treat it as a boolean in the non linenumber case */
-        case OP_FLIP:
-        case OP_FLOP:
-            if (   ((lop->op_flags & OPf_WANT) == OPf_WANT_LIST)
-                || (lop->op_private & OPpFLIP_LINENUM))
-            {
-                lop = NULL;
-                break;
-            }
+        switch (PL_opargs[opnum] & OA_CLASS_MASK) {
+        case OA_UNOP:
+        case OA_BASEOP_OR_UNOP:
+        case OA_FILESTATOP:
+            if (!aop)
+                return newOP(opnum,flags);       /* zero args */
+            if (aop == prev)
+                return newUNOP(opnum,flags,aop); /* one arg */
+            /* too many args */
             /* FALLTHROUGH */
-        /* these never leave the original value on the stack */
-        case OP_NOT:
-        case OP_XOR:
-        case OP_COND_EXPR:
-        case OP_GREPWHILE:
-            flag = bool_flag;
-            lop = NULL;
-            break;
+        case OA_BASEOP:
+            if (aop) {
+                SV *namesv;
+                OP *nextop;
 
-        /* OR DOR and AND evaluate their arg as a boolean, but then may
-         * leave the original scalar value on the stack when following the
-         * op_next route. If not in void context, we need to ensure
-         * that whatever follows consumes the arg only in boolean context
-         * too.
-         */
-        case OP_AND:
-            if (safe_and) {
-                flag = bool_flag;
-                lop = NULL;
-                break;
-            }
-            /* FALLTHROUGH */
-        case OP_OR:
-        case OP_DOR:
-            if ((lop->op_flags & OPf_WANT) == OPf_WANT_VOID) {
-                flag = bool_flag;
-                lop = NULL;
-            }
-            else if (!(lop->op_flags & OPf_WANT)) {
-                /* unknown context - decide at runtime */
-                flag = maybe_flag;
-                lop = NULL;
-            }
-            break;
+                namesv = cv_name((CV *)namegv, NULL, CV_NAME_NOTQUAL);
+                yyerror_pv(Perl_form(aTHX_ "Too many arguments for %" SVf,
+                    SVfARG(namesv)), SvUTF8(namesv));
+                while (aop) {
+                    nextop = OpSIBLING(aop);
+                    op_free(aop);
+                    aop = nextop;
+                }
 
+            }
+            return opnum == OP_RUNCV
+                ? newSVOP(OP_RUNCV, 0, &PL_sv_undef)
+                : newOP(opnum,0);
         default:
-            lop = NULL;
-            break;
+            return op_convert_list(opnum,0,aop);
         }
-
-        if (lop)
-            lop = lop->op_next;
     }
-
-    o->op_private |= flag;
+    NOT_REACHED; /* NOTREACHED */
+    return entersubop;
 }
 
+/*
+=for apidoc cv_get_call_checker_flags
 
+Retrieves the function that will be used to fix up a call to C<cv>.
+Specifically, the function is applied to an C<entersub> op tree for a
+subroutine call, not marked with C<&>, where the callee can be identified
+at compile time as C<cv>.
 
-/* mechanism for deferring recursion in rpeep() */
-
-#define MAX_DEFERRED 4
-
-#define DEFER(o) \
-  STMT_START { \
-    if (defer_ix == (MAX_DEFERRED-1)) { \
-        OP **defer = defer_queue[defer_base]; \
-        CALL_RPEEP(*defer); \
-        S_prune_chain_head(defer); \
-        defer_base = (defer_base + 1) % MAX_DEFERRED; \
-        defer_ix--; \
-    } \
-    defer_queue[(defer_base + ++defer_ix) % MAX_DEFERRED] = &(o); \
-  } STMT_END
-
-#define IS_AND_OP(o)   (o->op_type == OP_AND)
-#define IS_OR_OP(o)    (o->op_type == OP_OR)
-
-
-/* A peephole optimizer.  We visit the ops in the order they're to execute.
- * See the comments at the top of this file for more details about when
- * peep() is called */
-
-void
-Perl_rpeep(pTHX_ OP *o)
-{
-    OP* oldop = NULL;
-    OP* oldoldop = NULL;
-    OP** defer_queue[MAX_DEFERRED]; /* small queue of deferred branches */
-    int defer_base = 0;
-    int defer_ix = -1;
-
-    if (!o || o->op_opt)
-        return;
-
-    assert(o->op_type != OP_FREED);
-
-    ENTER;
-    SAVEOP();
-    SAVEVPTR(PL_curcop);
-    for (;; o = o->op_next) {
-        if (o && o->op_opt)
-            o = NULL;
-        if (!o) {
-            while (defer_ix >= 0) {
-                OP **defer =
-                        defer_queue[(defer_base + defer_ix--) % MAX_DEFERRED];
-                CALL_RPEEP(*defer);
-                S_prune_chain_head(defer);
-            }
-            break;
-        }
-
-      redo:
+The C-level function pointer is returned in C<*ckfun_p>, an SV argument
+for it is returned in C<*ckobj_p>, and control flags are returned in
+C<*ckflags_p>.  The function is intended to be called in this manner:
 
-        /* oldoldop -> oldop -> o should be a chain of 3 adjacent ops */
-        assert(!oldoldop || oldoldop->op_next == oldop);
-        assert(!oldop    || oldop->op_next    == o);
+ entersubop = (*ckfun_p)(aTHX_ entersubop, namegv, (*ckobj_p));
 
-        /* By default, this op has now been optimised. A couple of cases below
-           clear this again.  */
-        o->op_opt = 1;
-        PL_op = o;
+In this call, C<entersubop> is a pointer to the C<entersub> op,
+which may be replaced by the check function, and C<namegv> supplies
+the name that should be used by the check function to refer
+to the callee of the C<entersub> op if it needs to emit any diagnostics.
+It is permitted to apply the check function in non-standard situations,
+such as to a call to a different subroutine or to a method call.
 
-        /* look for a series of 1 or more aggregate derefs, e.g.
-         *   $a[1]{foo}[$i]{$k}
-         * and replace with a single OP_MULTIDEREF op.
-         * Each index must be either a const, or a simple variable,
-         *
-         * First, look for likely combinations of starting ops,
-         * corresponding to (global and lexical variants of)
-         *     $a[...]   $h{...}
-         *     $r->[...] $r->{...}
-         *     (preceding expression)->[...]
-         *     (preceding expression)->{...}
-         * and if so, call maybe_multideref() to do a full inspection
-         * of the op chain and if appropriate, replace with an
-         * OP_MULTIDEREF
-         */
-        {
-            UV action;
-            OP *o2 = o;
-            U8 hints = 0;
-
-            switch (o2->op_type) {
-            case OP_GV:
-                /* $pkg[..]   :   gv[*pkg]
-                 * $pkg->[...]:   gv[*pkg]; rv2sv sKM/DREFAV */
-
-                /* Fail if there are new op flag combinations that we're
-                 * not aware of, rather than:
-                 *  * silently failing to optimise, or
-                 *  * silently optimising the flag away.
-                 * If this ASSUME starts failing, examine what new flag
-                 * has been added to the op, and decide whether the
-                 * optimisation should still occur with that flag, then
-                 * update the code accordingly. This applies to all the
-                 * other ASSUMEs in the block of code too.
-                 */
-                ASSUME(!(o2->op_flags &
-                            ~(OPf_WANT|OPf_MOD|OPf_PARENS|OPf_SPECIAL)));
-                ASSUME(!(o2->op_private & ~OPpEARLY_CV));
+C<namegv> may not actually be a GV.  If the C<CALL_CHECKER_REQUIRE_GV>
+bit is clear in C<*ckflags_p>, it is permitted to pass a CV or other SV
+instead, anything that can be used as the first argument to L</cv_name>.
+If the C<CALL_CHECKER_REQUIRE_GV> bit is set in C<*ckflags_p> then the
+check function requires C<namegv> to be a genuine GV.
 
-                o2 = o2->op_next;
+By default, the check function is
+L<Perl_ck_entersub_args_proto_or_list|/ck_entersub_args_proto_or_list>,
+the SV parameter is C<cv> itself, and the C<CALL_CHECKER_REQUIRE_GV>
+flag is clear.  This implements standard prototype processing.  It can
+be changed, for a particular subroutine, by L</cv_set_call_checker_flags>.
 
-                if (o2->op_type == OP_RV2AV) {
-                    action = MDEREF_AV_gvav_aelem;
-                    goto do_deref;
-                }
+If the C<CALL_CHECKER_REQUIRE_GV> bit is set in C<gflags> then it
+indicates that the caller only knows about the genuine GV version of
+C<namegv>, and accordingly the corresponding bit will always be set in
+C<*ckflags_p>, regardless of the check function's recorded requirements.
+If the C<CALL_CHECKER_REQUIRE_GV> bit is clear in C<gflags> then it
+indicates the caller knows about the possibility of passing something
+other than a GV as C<namegv>, and accordingly the corresponding bit may
+be either set or clear in C<*ckflags_p>, indicating the check function's
+recorded requirements.
 
-                if (o2->op_type == OP_RV2HV) {
-                    action = MDEREF_HV_gvhv_helem;
-                    goto do_deref;
-                }
+C<gflags> is a bitset passed into C<cv_get_call_checker_flags>, in which
+only the C<CALL_CHECKER_REQUIRE_GV> bit currently has a defined meaning
+(for which see above).  All other bits should be clear.
 
-                if (o2->op_type != OP_RV2SV)
-                    break;
+=for apidoc Amnh||CALL_CHECKER_REQUIRE_GV
 
-                /* at this point we've seen gv,rv2sv, so the only valid
-                 * construct left is $pkg->[] or $pkg->{} */
+=for apidoc cv_get_call_checker
 
-                ASSUME(!(o2->op_flags & OPf_STACKED));
-                if ((o2->op_flags & (OPf_WANT|OPf_REF|OPf_MOD|OPf_SPECIAL))
-                            != (OPf_WANT_SCALAR|OPf_MOD))
-                    break;
+The original form of L</cv_get_call_checker_flags>, which does not return
+checker flags.  When using a checker function returned by this function,
+it is only safe to call it with a genuine GV as its C<namegv> argument.
 
-                ASSUME(!(o2->op_private & ~(OPpARG1_MASK|HINT_STRICT_REFS
-                                    |OPpOUR_INTRO|OPpDEREF|OPpLVAL_INTRO)));
-                if (o2->op_private & (OPpOUR_INTRO|OPpLVAL_INTRO))
-                    break;
-                if (   (o2->op_private & OPpDEREF) != OPpDEREF_AV
-                    && (o2->op_private & OPpDEREF) != OPpDEREF_HV)
-                    break;
+=cut
+*/
 
-                o2 = o2->op_next;
-                if (o2->op_type == OP_RV2AV) {
-                    action = MDEREF_AV_gvsv_vivify_rv2av_aelem;
-                    goto do_deref;
-                }
-                if (o2->op_type == OP_RV2HV) {
-                    action = MDEREF_HV_gvsv_vivify_rv2hv_helem;
-                    goto do_deref;
-                }
-                break;
+void
+Perl_cv_get_call_checker_flags(pTHX_ CV *cv, U32 gflags,
+        Perl_call_checker *ckfun_p, SV **ckobj_p, U32 *ckflags_p)
+{
+    MAGIC *callmg;
+    PERL_ARGS_ASSERT_CV_GET_CALL_CHECKER_FLAGS;
+    PERL_UNUSED_CONTEXT;
+    callmg = SvMAGICAL((SV*)cv) ? mg_find((SV*)cv, PERL_MAGIC_checkcall) : NULL;
+    if (callmg) {
+        *ckfun_p = DPTR2FPTR(Perl_call_checker, callmg->mg_ptr);
+        *ckobj_p = callmg->mg_obj;
+        *ckflags_p = (callmg->mg_flags | gflags) & MGf_REQUIRE_GV;
+    } else {
+        *ckfun_p = Perl_ck_entersub_args_proto_or_list;
+        *ckobj_p = (SV*)cv;
+        *ckflags_p = gflags & MGf_REQUIRE_GV;
+    }
+}
 
-            case OP_PADSV:
-                /* $lex->[...]: padsv[$lex] sM/DREFAV */
+void
+Perl_cv_get_call_checker(pTHX_ CV *cv, Perl_call_checker *ckfun_p, SV **ckobj_p)
+{
+    U32 ckflags;
+    PERL_ARGS_ASSERT_CV_GET_CALL_CHECKER;
+    PERL_UNUSED_CONTEXT;
+    cv_get_call_checker_flags(cv, CALL_CHECKER_REQUIRE_GV, ckfun_p, ckobj_p,
+        &ckflags);
+}
 
-                ASSUME(!(o2->op_flags &
-                    ~(OPf_WANT|OPf_PARENS|OPf_REF|OPf_MOD|OPf_SPECIAL)));
-                if ((o2->op_flags &
-                        (OPf_WANT|OPf_REF|OPf_MOD|OPf_SPECIAL))
-                     != (OPf_WANT_SCALAR|OPf_MOD))
-                    break;
+/*
+=for apidoc cv_set_call_checker_flags
 
-                ASSUME(!(o2->op_private &
-                                ~(OPpPAD_STATE|OPpDEREF|OPpLVAL_INTRO)));
-                /* skip if state or intro, or not a deref */
-                if (      o2->op_private != OPpDEREF_AV
-                       && o2->op_private != OPpDEREF_HV)
-                    break;
+Sets the function that will be used to fix up a call to C<cv>.
+Specifically, the function is applied to an C<entersub> op tree for a
+subroutine call, not marked with C<&>, where the callee can be identified
+at compile time as C<cv>.
 
-                o2 = o2->op_next;
-                if (o2->op_type == OP_RV2AV) {
-                    action = MDEREF_AV_padsv_vivify_rv2av_aelem;
-                    goto do_deref;
-                }
-                if (o2->op_type == OP_RV2HV) {
-                    action = MDEREF_HV_padsv_vivify_rv2hv_helem;
-                    goto do_deref;
-                }
-                break;
+The C-level function pointer is supplied in C<ckfun>, an SV argument for
+it is supplied in C<ckobj>, and control flags are supplied in C<ckflags>.
+The function should be defined like this:
 
-            case OP_PADAV:
-            case OP_PADHV:
-                /*    $lex[..]:  padav[@lex:1,2] sR *
-                 * or $lex{..}:  padhv[%lex:1,2] sR */
-                ASSUME(!(o2->op_flags & ~(OPf_WANT|OPf_MOD|OPf_PARENS|
-                                            OPf_REF|OPf_SPECIAL)));
-                if ((o2->op_flags &
-                        (OPf_WANT|OPf_REF|OPf_MOD|OPf_SPECIAL))
-                     != (OPf_WANT_SCALAR|OPf_REF))
-                    break;
-                if (o2->op_flags != (OPf_WANT_SCALAR|OPf_REF))
-                    break;
-                /* OPf_PARENS isn't currently used in this case;
-                 * if that changes, let us know! */
-                ASSUME(!(o2->op_flags & OPf_PARENS));
-
-                /* at this point, we wouldn't expect any of the remaining
-                 * possible private flags:
-                 * OPpPAD_STATE, OPpLVAL_INTRO, OPpTRUEBOOL,
-                 * OPpMAYBE_TRUEBOOL, OPpMAYBE_LVSUB
-                 *
-                 * OPpSLICEWARNING shouldn't affect runtime
-                 */
-                ASSUME(!(o2->op_private & ~(OPpSLICEWARNING)));
+    STATIC OP * ckfun(pTHX_ OP *op, GV *namegv, SV *ckobj)
 
-                action = o2->op_type == OP_PADAV
-                            ? MDEREF_AV_padav_aelem
-                            : MDEREF_HV_padhv_helem;
-                o2 = o2->op_next;
-                S_maybe_multideref(aTHX_ o, o2, action, 0);
-                break;
+It is intended to be called in this manner:
 
+    entersubop = ckfun(aTHX_ entersubop, namegv, ckobj);
 
-            case OP_RV2AV:
-            case OP_RV2HV:
-                action = o2->op_type == OP_RV2AV
-                            ? MDEREF_AV_pop_rv2av_aelem
-                            : MDEREF_HV_pop_rv2hv_helem;
-                /* FALLTHROUGH */
-            do_deref:
-                /* (expr)->[...]:  rv2av sKR/1;
-                 * (expr)->{...}:  rv2hv sKR/1; */
+In this call, C<entersubop> is a pointer to the C<entersub> op,
+which may be replaced by the check function, and C<namegv> supplies
+the name that should be used by the check function to refer
+to the callee of the C<entersub> op if it needs to emit any diagnostics.
+It is permitted to apply the check function in non-standard situations,
+such as to a call to a different subroutine or to a method call.
 
-                ASSUME(o2->op_type == OP_RV2AV || o2->op_type == OP_RV2HV);
+C<namegv> may not actually be a GV.  For efficiency, perl may pass a
+CV or other SV instead.  Whatever is passed can be used as the first
+argument to L</cv_name>.  You can force perl to pass a GV by including
+C<CALL_CHECKER_REQUIRE_GV> in the C<ckflags>.
 
-                ASSUME(!(o2->op_flags & ~(OPf_WANT|OPf_KIDS|OPf_PARENS
-                                |OPf_REF|OPf_MOD|OPf_STACKED|OPf_SPECIAL)));
-                if (o2->op_flags != (OPf_WANT_SCALAR|OPf_KIDS|OPf_REF))
-                    break;
+C<ckflags> is a bitset, in which only the C<CALL_CHECKER_REQUIRE_GV>
+bit currently has a defined meaning (for which see above).  All other
+bits should be clear.
 
-                /* at this point, we wouldn't expect any of these
-                 * possible private flags:
-                 * OPpMAYBE_LVSUB, OPpLVAL_INTRO
-                 * OPpTRUEBOOL, OPpMAYBE_TRUEBOOL, (rv2hv only)
-                 */
-                ASSUME(!(o2->op_private &
-                    ~(OPpHINT_STRICT_REFS|OPpARG1_MASK|OPpSLICEWARNING
-                     |OPpOUR_INTRO)));
-                hints |= (o2->op_private & OPpHINT_STRICT_REFS);
+The current setting for a particular CV can be retrieved by
+L</cv_get_call_checker_flags>.
 
-                o2 = o2->op_next;
+=for apidoc cv_set_call_checker
 
-                S_maybe_multideref(aTHX_ o, o2, action, hints);
-                break;
+The original form of L</cv_set_call_checker_flags>, which passes it the
+C<CALL_CHECKER_REQUIRE_GV> flag for backward-compatibility.  The effect
+of that flag setting is that the check function is guaranteed to get a
+genuine GV as its C<namegv> argument.
 
-            default:
-                break;
-            }
-        }
+=cut
+*/
 
+void
+Perl_cv_set_call_checker(pTHX_ CV *cv, Perl_call_checker ckfun, SV *ckobj)
+{
+    PERL_ARGS_ASSERT_CV_SET_CALL_CHECKER;
+    cv_set_call_checker_flags(cv, ckfun, ckobj, CALL_CHECKER_REQUIRE_GV);
+}
 
-        switch (o->op_type) {
-        case OP_DBSTATE:
-            PL_curcop = ((COP*)o);             /* for warnings */
-            break;
-        case OP_NEXTSTATE:
-            PL_curcop = ((COP*)o);             /* for warnings */
-
-            /* Optimise a "return ..." at the end of a sub to just be "...".
-             * This saves 2 ops. Before:
-             * 1  <;> nextstate(main 1 -e:1) v ->2
-             * 4  <@> return K ->5
-             * 2    <0> pushmark s ->3
-             * -    <1> ex-rv2sv sK/1 ->4
-             * 3      <#> gvsv[*cat] s ->4
-             *
-             * After:
-             * -  <@> return K ->-
-             * -    <0> pushmark s ->2
-             * -    <1> ex-rv2sv sK/1 ->-
-             * 2      <$> gvsv(*cat) s ->3
-             */
-            {
-                OP *next = o->op_next;
-                OP *sibling = OpSIBLING(o);
-                if (   OP_TYPE_IS(next, OP_PUSHMARK)
-                    && OP_TYPE_IS(sibling, OP_RETURN)
-                    && OP_TYPE_IS(sibling->op_next, OP_LINESEQ)
-                    && ( OP_TYPE_IS(sibling->op_next->op_next, OP_LEAVESUB)
-                       ||OP_TYPE_IS(sibling->op_next->op_next,
-                                    OP_LEAVESUBLV))
-                    && cUNOPx(sibling)->op_first == next
-                    && OpHAS_SIBLING(next) && OpSIBLING(next)->op_next
-                    && next->op_next
-                ) {
-                    /* Look through the PUSHMARK's siblings for one that
-                     * points to the RETURN */
-                    OP *top = OpSIBLING(next);
-                    while (top && top->op_next) {
-                        if (top->op_next == sibling) {
-                            top->op_next = sibling->op_next;
-                            o->op_next = next->op_next;
-                            break;
-                        }
-                        top = OpSIBLING(top);
-                    }
-                }
-            }
+void
+Perl_cv_set_call_checker_flags(pTHX_ CV *cv, Perl_call_checker ckfun,
+                                     SV *ckobj, U32 ckflags)
+{
+    PERL_ARGS_ASSERT_CV_SET_CALL_CHECKER_FLAGS;
+    if (ckfun == Perl_ck_entersub_args_proto_or_list && ckobj == (SV*)cv) {
+        if (SvMAGICAL((SV*)cv))
+            mg_free_type((SV*)cv, PERL_MAGIC_checkcall);
+    } else {
+        MAGIC *callmg;
+        sv_magic((SV*)cv, &PL_sv_undef, PERL_MAGIC_checkcall, NULL, 0);
+        callmg = mg_find((SV*)cv, PERL_MAGIC_checkcall);
+        assert(callmg);
+        if (callmg->mg_flags & MGf_REFCOUNTED) {
+            SvREFCNT_dec(callmg->mg_obj);
+            callmg->mg_flags &= ~MGf_REFCOUNTED;
+        }
+        callmg->mg_ptr = FPTR2DPTR(char *, ckfun);
+        callmg->mg_obj = ckobj;
+        if (ckobj != (SV*)cv) {
+            SvREFCNT_inc_simple_void_NN(ckobj);
+            callmg->mg_flags |= MGf_REFCOUNTED;
+        }
+        callmg->mg_flags = (callmg->mg_flags &~ MGf_REQUIRE_GV)
+                         | (U8)(ckflags & MGf_REQUIRE_GV) | MGf_COPY;
+    }
+}
 
-            /* Optimise 'my $x; my $y;' into 'my ($x, $y);'
-             *
-             * This latter form is then suitable for conversion into padrange
-             * later on. Convert:
-             *
-             *   nextstate1 -> padop1 -> nextstate2 -> padop2 -> nextstate3
-             *
-             * into:
-             *
-             *   nextstate1 ->     listop     -> nextstate3
-             *                 /            \
-             *         pushmark -> padop1 -> padop2
-             */
-            if (o->op_next && (
-                    o->op_next->op_type == OP_PADSV
-                 || o->op_next->op_type == OP_PADAV
-                 || o->op_next->op_type == OP_PADHV
-                )
-                && !(o->op_next->op_private & ~OPpLVAL_INTRO)
-                && o->op_next->op_next && o->op_next->op_next->op_type == OP_NEXTSTATE
-                && o->op_next->op_next->op_next && (
-                    o->op_next->op_next->op_next->op_type == OP_PADSV
-                 || o->op_next->op_next->op_next->op_type == OP_PADAV
-                 || o->op_next->op_next->op_next->op_type == OP_PADHV
-                )
-                && !(o->op_next->op_next->op_next->op_private & ~OPpLVAL_INTRO)
-                && o->op_next->op_next->op_next->op_next && o->op_next->op_next->op_next->op_next->op_type == OP_NEXTSTATE
-                && (!CopLABEL((COP*)o)) /* Don't mess with labels */
-                && (!CopLABEL((COP*)o->op_next->op_next)) /* ... */
-            ) {
-                OP *pad1, *ns2, *pad2, *ns3, *newop, *newpm;
-
-                pad1 =    o->op_next;
-                ns2  = pad1->op_next;
-                pad2 =  ns2->op_next;
-                ns3  = pad2->op_next;
-
-                /* we assume here that the op_next chain is the same as
-                 * the op_sibling chain */
-                assert(OpSIBLING(o)    == pad1);
-                assert(OpSIBLING(pad1) == ns2);
-                assert(OpSIBLING(ns2)  == pad2);
-                assert(OpSIBLING(pad2) == ns3);
-
-                /* excise and delete ns2 */
-                op_sibling_splice(NULL, pad1, 1, NULL);
-                op_free(ns2);
-
-                /* excise pad1 and pad2 */
-                op_sibling_splice(NULL, o, 2, NULL);
-
-                /* create new listop, with children consisting of:
-                 * a new pushmark, pad1, pad2. */
-                newop = newLISTOP(OP_LIST, 0, pad1, pad2);
-                newop->op_flags |= OPf_PARENS;
-                newop->op_flags = (newop->op_flags & ~OPf_WANT) | OPf_WANT_VOID;
-
-                /* insert newop between o and ns3 */
-                op_sibling_splice(NULL, o, 0, newop);
-
-                /*fixup op_next chain */
-                newpm = cUNOPx(newop)->op_first; /* pushmark */
-                o    ->op_next = newpm;
-                newpm->op_next = pad1;
-                pad1 ->op_next = pad2;
-                pad2 ->op_next = newop; /* listop */
-                newop->op_next = ns3;
-
-                /* Ensure pushmark has this flag if padops do */
-                if (pad1->op_flags & OPf_MOD && pad2->op_flags & OPf_MOD) {
-                    newpm->op_flags |= OPf_MOD;
-                }
+static void
+S_entersub_alloc_targ(pTHX_ OP * const o)
+{
+    o->op_targ = pad_alloc(OP_ENTERSUB, SVs_PADTMP);
+    o->op_private |= OPpENTERSUB_HASTARG;
+}
 
-                break;
-            }
+OP *
+Perl_ck_subr(pTHX_ OP *o)
+{
+    OP *aop, *cvop;
+    CV *cv;
+    GV *namegv;
+    SV **const_class = NULL;
 
-            /* Two NEXTSTATEs in a row serve no purpose. Except if they happen
-               to carry two labels. For now, take the easier option, and skip
-               this optimisation if the first NEXTSTATE has a label.  */
-            if (!CopLABEL((COP*)o) && !PERLDB_NOOPT) {
-                OP *nextop = o->op_next;
-                while (nextop) {
-                    switch (nextop->op_type) {
-                        case OP_NULL:
-                        case OP_SCALAR:
-                        case OP_LINESEQ:
-                        case OP_SCOPE:
-                            nextop = nextop->op_next;
-                            continue;
-                    }
-                    break;
-                }
+    PERL_ARGS_ASSERT_CK_SUBR;
 
-                if (nextop && (nextop->op_type == OP_NEXTSTATE)) {
-                    op_null(o);
-                    if (oldop)
-                        oldop->op_next = nextop;
-                    o = nextop;
-                    /* Skip (old)oldop assignment since the current oldop's
-                       op_next already points to the next op.  */
-                    goto redo;
-                }
-            }
-            break;
+    aop = cUNOPx(o)->op_first;
+    if (!OpHAS_SIBLING(aop))
+        aop = cUNOPx(aop)->op_first;
+    aop = OpSIBLING(aop);
+    for (cvop = aop; OpHAS_SIBLING(cvop); cvop = OpSIBLING(cvop)) ;
+    cv = rv2cv_op_cv(cvop, RV2CVOPCV_MARK_EARLY);
+    namegv = cv ? (GV*)rv2cv_op_cv(cvop, RV2CVOPCV_MAYBE_NAME_GV) : NULL;
 
-        case OP_CONCAT:
-            if (o->op_next && o->op_next->op_type == OP_STRINGIFY) {
-                if (o->op_next->op_private & OPpTARGET_MY) {
-                    if (o->op_flags & OPf_STACKED) /* chained concats */
-                        break; /* ignore_optimization */
-                    else {
-                        /* assert(PL_opargs[o->op_type] & OA_TARGLEX); */
-                        o->op_targ = o->op_next->op_targ;
-                        o->op_next->op_targ = 0;
-                        o->op_private |= OPpTARGET_MY;
-                    }
-                }
-                op_null(o->op_next);
-            }
+    o->op_private &= ~1;
+    o->op_private |= (PL_hints & HINT_STRICT_REFS);
+    if (PERLDB_SUB && PL_curstash != PL_debstash)
+        o->op_private |= OPpENTERSUB_DB;
+    switch (cvop->op_type) {
+        case OP_RV2CV:
+            o->op_private |= (cvop->op_private & OPpENTERSUB_AMPER);
+            op_null(cvop);
             break;
-        case OP_STUB:
-            if ((o->op_flags & OPf_WANT) != OPf_WANT_LIST) {
-                break; /* Scalar stub must produce undef.  List stub is noop */
-            }
-            goto nothin;
-        case OP_NULL:
-            if (o->op_targ == OP_NEXTSTATE
-                || o->op_targ == OP_DBSTATE)
-            {
-                PL_curcop = ((COP*)o);
-            }
-            /* XXX: We avoid setting op_seq here to prevent later calls
-               to rpeep() from mistakenly concluding that optimisation
-               has already occurred. This doesn't fix the real problem,
-               though (See 20010220.007 (#5874)). AMS 20010719 */
-            /* op_seq functionality is now replaced by op_opt */
-            o->op_opt = 0;
-            /* FALLTHROUGH */
-        case OP_SCALAR:
-        case OP_LINESEQ:
-        case OP_SCOPE:
-        nothin:
-            if (oldop) {
-                oldop->op_next = o->op_next;
-                o->op_opt = 0;
-                continue;
+        case OP_METHOD:
+        case OP_METHOD_NAMED:
+        case OP_METHOD_SUPER:
+        case OP_METHOD_REDIR:
+        case OP_METHOD_REDIR_SUPER:
+            o->op_flags |= OPf_REF;
+            if (aop->op_type == OP_CONST) {
+                aop->op_private &= ~OPpCONST_STRICT;
+                const_class = &cSVOPx(aop)->op_sv;
             }
-            break;
-
-        case OP_PUSHMARK:
-
-            /* Given
-                 5 repeat/DOLIST
-                 3   ex-list
-                 1     pushmark
-                 2     scalar or const
-                 4   const[0]
-               convert repeat into a stub with no kids.
-             */
-            if (o->op_next->op_type == OP_CONST
-             || (  o->op_next->op_type == OP_PADSV
-                && !(o->op_next->op_private & OPpLVAL_INTRO))
-             || (  o->op_next->op_type == OP_GV
-                && o->op_next->op_next->op_type == OP_RV2SV
-                && !(o->op_next->op_next->op_private
-                        & (OPpLVAL_INTRO|OPpOUR_INTRO))))
-            {
-                const OP *kid = o->op_next->op_next;
-                if (o->op_next->op_type == OP_GV)
-                   kid = kid->op_next;
-                /* kid is now the ex-list.  */
-                if (kid->op_type == OP_NULL
-                 && (kid = kid->op_next)->op_type == OP_CONST
-                    /* kid is now the repeat count.  */
-                 && kid->op_next->op_type == OP_REPEAT
-                 && kid->op_next->op_private & OPpREPEAT_DOLIST
-                 && (kid->op_next->op_flags & OPf_WANT) == OPf_WANT_LIST
-                 && SvIOK(kSVOP_sv) && SvIVX(kSVOP_sv) == 0
-                 && oldop)
-                {
-                    o = kid->op_next; /* repeat */
-                    oldop->op_next = o;
-                    op_free(cBINOPo->op_first);
-                    op_free(cBINOPo->op_last );
-                    o->op_flags &=~ OPf_KIDS;
-                    /* stub is a baseop; repeat is a binop */
-                    STATIC_ASSERT_STMT(sizeof(OP) <= sizeof(BINOP));
-                    OpTYPE_set(o, OP_STUB);
-                    o->op_private = 0;
-                    break;
+            else if (aop->op_type == OP_LIST) {
+                OP * const sib = OpSIBLING(cUNOPx(aop)->op_first);
+                if (sib && sib->op_type == OP_CONST) {
+                    sib->op_private &= ~OPpCONST_STRICT;
+                    const_class = &cSVOPx(sib)->op_sv;
                 }
             }
-
-            /* Convert a series of PAD ops for my vars plus support into a
-             * single padrange op. Basically
-             *
-             *    pushmark -> pad[ahs]v -> pad[ahs]?v -> ... -> (list) -> rest
-             *
-             * becomes, depending on circumstances, one of
-             *
-             *    padrange  ----------------------------------> (list) -> rest
-             *    padrange  --------------------------------------------> rest
-             *
-             * where all the pad indexes are sequential and of the same type
-             * (INTRO or not).
-             * We convert the pushmark into a padrange op, then skip
-             * any other pad ops, and possibly some trailing ops.
-             * Note that we don't null() the skipped ops, to make it
-             * easier for Deparse to undo this optimisation (and none of
-             * the skipped ops are holding any resourses). It also makes
-             * it easier for find_uninit_var(), as it can just ignore
-             * padrange, and examine the original pad ops.
-             */
-        {
-            OP *p;
-            OP *followop = NULL; /* the op that will follow the padrange op */
-            U8 count = 0;
-            U8 intro = 0;
-            PADOFFSET base = 0; /* init only to stop compiler whining */
-            bool gvoid = 0;     /* init only to stop compiler whining */
-            bool defav = 0;  /* seen (...) = @_ */
-            bool reuse = 0;  /* reuse an existing padrange op */
-
-            /* look for a pushmark -> gv[_] -> rv2av */
-
-            {
-                OP *rv2av, *q;
-                p = o->op_next;
-                if (   p->op_type == OP_GV
-                    && cGVOPx_gv(p) == PL_defgv
-                    && (rv2av = p->op_next)
-                    && rv2av->op_type == OP_RV2AV
-                    && !(rv2av->op_flags & OPf_REF)
-                    && !(rv2av->op_private & (OPpLVAL_INTRO|OPpMAYBE_LVSUB))
-                    && ((rv2av->op_flags & OPf_WANT) == OPf_WANT_LIST)
-                ) {
-                    q = rv2av->op_next;
-                    if (q->op_type == OP_NULL)
-                        q = q->op_next;
-                    if (q->op_type == OP_PUSHMARK) {
-                        defav = 1;
-                        p = q;
-                    }
+            /* make class name a shared cow string to speedup method calls */
+            /* constant string might be replaced with object, f.e. bigint */
+            if (const_class && SvPOK(*const_class)) {
+                STRLEN len;
+                const char* str = SvPV(*const_class, len);
+                if (len) {
+                    SV* const shared = newSVpvn_share(
+                        str, SvUTF8(*const_class)
+                                    ? -(SSize_t)len : (SSize_t)len,
+                        0
+                    );
+                    if (SvREADONLY(*const_class))
+                        SvREADONLY_on(shared);
+                    SvREFCNT_dec(*const_class);
+                    *const_class = shared;
                 }
             }
-            if (!defav) {
-                p = o;
-            }
-
-            /* scan for PAD ops */
-
-            for (p = p->op_next; p; p = p->op_next) {
-                if (p->op_type == OP_NULL)
-                    continue;
-
-                if ((     p->op_type != OP_PADSV
-                       && p->op_type != OP_PADAV
-                       && p->op_type != OP_PADHV
-                    )
-                      /* any private flag other than INTRO? e.g. STATE */
-                   || (p->op_private & ~OPpLVAL_INTRO)
-                )
-                    break;
-
-                /* let $a[N] potentially be optimised into AELEMFAST_LEX
-                 * instead */
-                if (   p->op_type == OP_PADAV
-                    && p->op_next
-                    && p->op_next->op_type == OP_CONST
-                    && p->op_next->op_next
-                    && p->op_next->op_next->op_type == OP_AELEM
-                )
-                    break;
-
-                /* for 1st padop, note what type it is and the range
-                 * start; for the others, check that it's the same type
-                 * and that the targs are contiguous */
-                if (count == 0) {
-                    intro = (p->op_private & OPpLVAL_INTRO);
-                    base = p->op_targ;
-                    gvoid = OP_GIMME(p,0) == G_VOID;
-                }
-                else {
-                    if ((p->op_private & OPpLVAL_INTRO) != intro)
-                        break;
-                    /* Note that you'd normally  expect targs to be
-                     * contiguous in my($a,$b,$c), but that's not the case
-                     * when external modules start doing things, e.g.
-                     * Function::Parameters */
-                    if (p->op_targ != base + count)
-                        break;
-                    assert(p->op_targ == base + count);
-                    /* Either all the padops or none of the padops should
-                       be in void context.  Since we only do the optimisa-
-                       tion for av/hv when the aggregate itself is pushed
-                       on to the stack (one item), there is no need to dis-
-                       tinguish list from scalar context.  */
-                    if (gvoid != (OP_GIMME(p,0) == G_VOID))
-                        break;
-                }
-
-                /* for AV, HV, only when we're not flattening */
-                if (   p->op_type != OP_PADSV
-                    && !gvoid
-                    && !(p->op_flags & OPf_REF)
-                )
-                    break;
-
-                if (count >= OPpPADRANGE_COUNTMASK)
-                    break;
-
-                /* there's a biggest base we can fit into a
-                 * SAVEt_CLEARPADRANGE in pp_padrange.
-                 * (The sizeof() stuff will be constant-folded, and is
-                 * intended to avoid getting "comparison is always false"
-                 * compiler warnings. See the comments above
-                 * MEM_WRAP_CHECK for more explanation on why we do this
-                 * in a weird way to avoid compiler warnings.)
-                 */
-                if (   intro
-                    && (8*sizeof(base) >
-                        8*sizeof(UV)-OPpPADRANGE_COUNTSHIFT-SAVE_TIGHT_SHIFT
-                        ? (Size_t)base
-                        : (UV_MAX >> (OPpPADRANGE_COUNTSHIFT+SAVE_TIGHT_SHIFT))
-                        ) >
-                        (UV_MAX >> (OPpPADRANGE_COUNTSHIFT+SAVE_TIGHT_SHIFT))
-                )
-                    break;
+            break;
+    }
 
-                /* Success! We've got another valid pad op to optimise away */
-                count++;
-                followop = p->op_next;
+    if (!cv) {
+        S_entersub_alloc_targ(aTHX_ o);
+        return ck_entersub_args_list(o);
+    } else {
+        Perl_call_checker ckfun;
+        SV *ckobj;
+        U32 ckflags;
+        cv_get_call_checker_flags(cv, 0, &ckfun, &ckobj, &ckflags);
+        if (CvISXSUB(cv) || !CvROOT(cv))
+            S_entersub_alloc_targ(aTHX_ o);
+        if (!namegv) {
+            /* The original call checker API guarantees that a GV will
+               be provided with the right name.  So, if the old API was
+               used (or the REQUIRE_GV flag was passed), we have to reify
+               the CV’s GV, unless this is an anonymous sub.  This is not
+               ideal for lexical subs, as its stringification will include
+               the package.  But it is the best we can do.  */
+            if (ckflags & CALL_CHECKER_REQUIRE_GV) {
+                if (!CvANON(cv) && (!CvNAMED(cv) || CvNAME_HEK(cv)))
+                    namegv = CvGV(cv);
             }
+            else namegv = MUTABLE_GV(cv);
+            /* After a syntax error in a lexical sub, the cv that
+               rv2cv_op_cv returns may be a nameless stub. */
+            if (!namegv) return ck_entersub_args_list(o);
 
-            if (count < 1 || (count == 1 && !defav))
-                break;
+        }
+        return ckfun(aTHX_ o, namegv, ckobj);
+    }
+}
 
-            /* pp_padrange in specifically compile-time void context
-             * skips pushing a mark and lexicals; in all other contexts
-             * (including unknown till runtime) it pushes a mark and the
-             * lexicals. We must be very careful then, that the ops we
-             * optimise away would have exactly the same effect as the
-             * padrange.
-             * In particular in void context, we can only optimise to
-             * a padrange if we see the complete sequence
-             *     pushmark, pad*v, ...., list
-             * which has the net effect of leaving the markstack as it
-             * was.  Not pushing onto the stack (whereas padsv does touch
-             * the stack) makes no difference in void context.
-             */
-            assert(followop);
-            if (gvoid) {
-                if (followop->op_type == OP_LIST
-                        && OP_GIMME(followop,0) == G_VOID
-                   )
-                {
-                    followop = followop->op_next; /* skip OP_LIST */
-
-                    /* consolidate two successive my(...);'s */
-
-                    if (   oldoldop
-                        && oldoldop->op_type == OP_PADRANGE
-                        && (oldoldop->op_flags & OPf_WANT) == OPf_WANT_VOID
-                        && (oldoldop->op_private & OPpLVAL_INTRO) == intro
-                        && !(oldoldop->op_flags & OPf_SPECIAL)
-                    ) {
-                        U8 old_count;
-                        assert(oldoldop->op_next == oldop);
-                        assert(   oldop->op_type == OP_NEXTSTATE
-                               || oldop->op_type == OP_DBSTATE);
-                        assert(oldop->op_next == o);
-
-                        old_count
-                            = (oldoldop->op_private & OPpPADRANGE_COUNTMASK);
-
-                       /* Do not assume pad offsets for $c and $d are con-
-                          tiguous in
-                            my ($a,$b,$c);
-                            my ($d,$e,$f);
-                        */
-                        if (  oldoldop->op_targ + old_count == base
-                           && old_count < OPpPADRANGE_COUNTMASK - count) {
-                            base = oldoldop->op_targ;
-                            count += old_count;
-                            reuse = 1;
-                        }
-                    }
+OP *
+Perl_ck_svconst(pTHX_ OP *o)
+{
+    SV * const sv = cSVOPo->op_sv;
+    PERL_ARGS_ASSERT_CK_SVCONST;
+    PERL_UNUSED_CONTEXT;
+#ifdef PERL_COPY_ON_WRITE
+    /* Since the read-only flag may be used to protect a string buffer, we
+       cannot do copy-on-write with existing read-only scalars that are not
+       already copy-on-write scalars.  To allow $_ = "hello" to do COW with
+       that constant, mark the constant as COWable here, if it is not
+       already read-only. */
+    if (!SvREADONLY(sv) && !SvIsCOW(sv) && SvCANCOW(sv)) {
+        SvIsCOW_on(sv);
+        CowREFCNT(sv) = 0;
+# ifdef PERL_DEBUG_READONLY_COW
+        sv_buf_to_ro(sv);
+# endif
+    }
+#endif
+    SvREADONLY_on(sv);
+    return o;
+}
 
-                    /* if there's any immediately following singleton
-                     * my var's; then swallow them and the associated
-                     * nextstates; i.e.
-                     *    my ($a,$b); my $c; my $d;
-                     * is treated as
-                     *    my ($a,$b,$c,$d);
-                     */
+OP *
+Perl_ck_trunc(pTHX_ OP *o)
+{
+    PERL_ARGS_ASSERT_CK_TRUNC;
 
-                    while (    ((p = followop->op_next))
-                            && (  p->op_type == OP_PADSV
-                               || p->op_type == OP_PADAV
-                               || p->op_type == OP_PADHV)
-                            && (p->op_flags & OPf_WANT) == OPf_WANT_VOID
-                            && (p->op_private & OPpLVAL_INTRO) == intro
-                            && !(p->op_private & ~OPpLVAL_INTRO)
-                            && p->op_next
-                            && (   p->op_next->op_type == OP_NEXTSTATE
-                                || p->op_next->op_type == OP_DBSTATE)
-                            && count < OPpPADRANGE_COUNTMASK
-                            && base + count == p->op_targ
-                    ) {
-                        count++;
-                        followop = p->op_next;
-                    }
-                }
-                else
-                    break;
-            }
+    if (o->op_flags & OPf_KIDS) {
+        SVOP *kid = cSVOPx(cUNOPo->op_first);
 
-            if (reuse) {
-                assert(oldoldop->op_type == OP_PADRANGE);
-                oldoldop->op_next = followop;
-                oldoldop->op_private = (intro | count);
-                o = oldoldop;
-                oldop = NULL;
-                oldoldop = NULL;
-            }
-            else {
-                /* Convert the pushmark into a padrange.
-                 * To make Deparse easier, we guarantee that a padrange was
-                 * *always* formerly a pushmark */
-                assert(o->op_type == OP_PUSHMARK);
-                o->op_next = followop;
-                OpTYPE_set(o, OP_PADRANGE);
-                o->op_targ = base;
-                /* bit 7: INTRO; bit 6..0: count */
-                o->op_private = (intro | count);
-                o->op_flags = ((o->op_flags & ~(OPf_WANT|OPf_SPECIAL))
-                              | gvoid * OPf_WANT_VOID
-                              | (defav ? OPf_SPECIAL : 0));
+        if (kid->op_type == OP_NULL)
+            kid = cSVOPx(OpSIBLING(kid));
+        if (kid && kid->op_type == OP_CONST &&
+            (kid->op_private & OPpCONST_BARE) &&
+            !kid->op_folded)
+        {
+            o->op_flags |= OPf_SPECIAL;
+            kid->op_private &= ~OPpCONST_STRICT;
+            if (!FEATURE_BAREWORD_FILEHANDLES_IS_ENABLED) {
+                no_bareword_filehandle(SvPVX(cSVOPx_sv(kid)));
             }
-            break;
         }
+    }
+    return ck_fun(o);
+}
 
-        case OP_RV2AV:
-            if ((o->op_flags & OPf_WANT) == OPf_WANT_SCALAR)
-                S_check_for_bool_cxt(o, 1, OPpTRUEBOOL, 0);
-            break;
-
-        case OP_RV2HV:
-        case OP_PADHV:
-            /*'keys %h' in void or scalar context: skip the OP_KEYS
-             * and perform the functionality directly in the RV2HV/PADHV
-             * op
-             */
-            if (o->op_flags & OPf_REF) {
-                OP *k = o->op_next;
-                U8 want = (k->op_flags & OPf_WANT);
-                if (   k
-                    && k->op_type == OP_KEYS
-                    && (   want == OPf_WANT_VOID
-                        || want == OPf_WANT_SCALAR)
-                    && !(k->op_private & OPpMAYBE_LVSUB)
-                    && !(k->op_flags & OPf_MOD)
-                ) {
-                    o->op_next     = k->op_next;
-                    o->op_flags   &= ~(OPf_REF|OPf_WANT);
-                    o->op_flags   |= want;
-                    o->op_private |= (o->op_type == OP_PADHV ?
-                                      OPpPADHV_ISKEYS : OPpRV2HV_ISKEYS);
-                    /* for keys(%lex), hold onto the OP_KEYS's targ
-                     * since padhv doesn't have its own targ to return
-                     * an int with */
-                    if (!(o->op_type ==OP_PADHV && want == OPf_WANT_SCALAR))
-                        op_null(k);
-                }
-            }
-
-            /* see if %h is used in boolean context */
-            if ((o->op_flags & OPf_WANT) == OPf_WANT_SCALAR)
-                S_check_for_bool_cxt(o, 1, OPpTRUEBOOL, OPpMAYBE_TRUEBOOL);
-
+OP *
+Perl_ck_substr(pTHX_ OP *o)
+{
+    PERL_ARGS_ASSERT_CK_SUBSTR;
 
-            if (o->op_type != OP_PADHV)
-                break;
-            /* FALLTHROUGH */
-        case OP_PADAV:
-            if (   o->op_type == OP_PADAV
-                && (o->op_flags & OPf_WANT) == OPf_WANT_SCALAR
-            )
-                S_check_for_bool_cxt(o, 1, OPpTRUEBOOL, 0);
-            /* FALLTHROUGH */
-        case OP_PADSV:
-            /* Skip over state($x) in void context.  */
-            if (oldop && o->op_private == (OPpPAD_STATE|OPpLVAL_INTRO)
-             && (o->op_flags & OPf_WANT) == OPf_WANT_VOID)
-            {
-                oldop->op_next = o->op_next;
-                goto redo_nextstate;
-            }
-            if (o->op_type != OP_PADAV)
-                break;
-            /* FALLTHROUGH */
-        case OP_GV:
-            if (o->op_type == OP_PADAV || o->op_next->op_type == OP_RV2AV) {
-                OP* const pop = (o->op_type == OP_PADAV) ?
-                            o->op_next : o->op_next->op_next;
-                IV i;
-                if (pop && pop->op_type == OP_CONST &&
-                    ((PL_op = pop->op_next)) &&
-                    pop->op_next->op_type == OP_AELEM &&
-                    !(pop->op_next->op_private &
-                      (OPpLVAL_INTRO|OPpLVAL_DEFER|OPpDEREF|OPpMAYBE_LVSUB)) &&
-                    (i = SvIV(((SVOP*)pop)->op_sv)) >= -128 && i <= 127)
-                {
-                    GV *gv;
-                    if (cSVOPx(pop)->op_private & OPpCONST_STRICT)
-                        no_bareword_allowed(pop);
-                    if (o->op_type == OP_GV)
-                        op_null(o->op_next);
-                    op_null(pop->op_next);
-                    op_null(pop);
-                    o->op_flags |= pop->op_next->op_flags & OPf_MOD;
-                    o->op_next = pop->op_next->op_next;
-                    o->op_ppaddr = PL_ppaddr[OP_AELEMFAST];
-                    o->op_private = (U8)i;
-                    if (o->op_type == OP_GV) {
-                        gv = cGVOPo_gv;
-                        GvAVn(gv);
-                        o->op_type = OP_AELEMFAST;
-                    }
-                    else
-                        o->op_type = OP_AELEMFAST_LEX;
-                }
-                if (o->op_type != OP_GV)
-                    break;
-            }
+    o = ck_fun(o);
+    if ((o->op_flags & OPf_KIDS) && (o->op_private == 4)) {
+        OP *kid = cLISTOPo->op_first;
 
-            /* Remove $foo from the op_next chain in void context.  */
-            if (oldop
-             && (  o->op_next->op_type == OP_RV2SV
-                || o->op_next->op_type == OP_RV2AV
-                || o->op_next->op_type == OP_RV2HV  )
-             && (o->op_next->op_flags & OPf_WANT) == OPf_WANT_VOID
-             && !(o->op_next->op_private & OPpLVAL_INTRO))
-            {
-                oldop->op_next = o->op_next->op_next;
-                /* Reprocess the previous op if it is a nextstate, to
-                   allow double-nextstate optimisation.  */
-              redo_nextstate:
-                if (oldop->op_type == OP_NEXTSTATE) {
-                    oldop->op_opt = 0;
-                    o = oldop;
-                    oldop = oldoldop;
-                    oldoldop = NULL;
-                    goto redo;
-                }
-                o = oldop->op_next;
-                goto redo;
-            }
-            else if (o->op_next->op_type == OP_RV2SV) {
-                if (!(o->op_next->op_private & OPpDEREF)) {
-                    op_null(o->op_next);
-                    o->op_private |= o->op_next->op_private & (OPpLVAL_INTRO
-                                                               | OPpOUR_INTRO);
-                    o->op_next = o->op_next->op_next;
-                    OpTYPE_set(o, OP_GVSV);
-                }
-            }
-            else if (o->op_next->op_type == OP_READLINE
-                    && o->op_next->op_next->op_type == OP_CONCAT
-                    && (o->op_next->op_next->op_flags & OPf_STACKED))
-            {
-                /* Turn "$a .= <FH>" into an OP_RCATLINE. AMS 20010917 */
-                OpTYPE_set(o, OP_RCATLINE);
-                o->op_flags |= OPf_STACKED;
-                op_null(o->op_next->op_next);
-                op_null(o->op_next);
-            }
+        if (kid->op_type == OP_NULL)
+            kid = OpSIBLING(kid);
+        if (kid)
+            /* Historically, substr(delete $foo{bar},...) has been allowed
+               with 4-arg substr.  Keep it working by applying entersub
+               lvalue context.  */
+            op_lvalue(kid, OP_ENTERSUB);
 
-            break;
+    }
+    return o;
+}
 
-        case OP_NOT:
-            break;
+OP *
+Perl_ck_tell(pTHX_ OP *o)
+{
+    PERL_ARGS_ASSERT_CK_TELL;
+    o = ck_fun(o);
+    if (o->op_flags & OPf_KIDS) {
+     OP *kid = cLISTOPo->op_first;
+     if (kid->op_type == OP_NULL && OpHAS_SIBLING(kid)) kid = OpSIBLING(kid);
+     if (kid->op_type == OP_RV2GV) kid->op_private |= OPpALLOW_FAKE;
+    }
+    return o;
+}
 
-        case OP_AND:
-        case OP_OR:
-        case OP_DOR:
-        case OP_CMPCHAIN_AND:
-        case OP_PUSHDEFER:
-            while (cLOGOP->op_other->op_type == OP_NULL)
-                cLOGOP->op_other = cLOGOP->op_other->op_next;
-            while (o->op_next && (   o->op_type == o->op_next->op_type
-                                  || o->op_next->op_type == OP_NULL))
-                o->op_next = o->op_next->op_next;
-
-            /* If we're an OR and our next is an AND in void context, we'll
-               follow its op_other on short circuit, same for reverse.
-               We can't do this with OP_DOR since if it's true, its return
-               value is the underlying value which must be evaluated
-               by the next op. */
-            if (o->op_next &&
-                (
-                    (IS_AND_OP(o) && IS_OR_OP(o->op_next))
-                 || (IS_OR_OP(o) && IS_AND_OP(o->op_next))
-                )
-                && (o->op_next->op_flags & OPf_WANT) == OPf_WANT_VOID
-            ) {
-                o->op_next = ((LOGOP*)o->op_next)->op_other;
+PERL_STATIC_INLINE OP *
+S_last_non_null_kid(OP *o) {
+    OP *last = NULL;
+    if (cUNOPo->op_flags & OPf_KIDS) {
+        OP *k = cLISTOPo->op_first;
+        while (k) {
+            if (k->op_type != OP_NULL) {
+                last = k;
             }
-            DEFER(cLOGOP->op_other);
-            o->op_opt = 1;
-            break;
-
-        case OP_GREPWHILE:
-            if ((o->op_flags & OPf_WANT) == OPf_WANT_SCALAR)
-                S_check_for_bool_cxt(o, 1, OPpTRUEBOOL, 0);
-            /* FALLTHROUGH */
-        case OP_COND_EXPR:
-        case OP_MAPWHILE:
-        case OP_ANDASSIGN:
-        case OP_ORASSIGN:
-        case OP_DORASSIGN:
-        case OP_RANGE:
-        case OP_ONCE:
-        case OP_ARGDEFELEM:
-            while (cLOGOP->op_other->op_type == OP_NULL)
-                cLOGOP->op_other = cLOGOP->op_other->op_next;
-            DEFER(cLOGOP->op_other);
-            break;
-
-        case OP_ENTERLOOP:
-        case OP_ENTERITER:
-            while (cLOOP->op_redoop->op_type == OP_NULL)
-                cLOOP->op_redoop = cLOOP->op_redoop->op_next;
-            while (cLOOP->op_nextop->op_type == OP_NULL)
-                cLOOP->op_nextop = cLOOP->op_nextop->op_next;
-            while (cLOOP->op_lastop->op_type == OP_NULL)
-                cLOOP->op_lastop = cLOOP->op_lastop->op_next;
-            /* a while(1) loop doesn't have an op_next that escapes the
-             * loop, so we have to explicitly follow the op_lastop to
-             * process the rest of the code */
-            DEFER(cLOOP->op_lastop);
-            break;
-
-        case OP_ENTERTRY:
-            assert(cLOGOPo->op_other->op_type == OP_LEAVETRY);
-            DEFER(cLOGOPo->op_other);
-            break;
+            k = OpSIBLING(k);
+        }
+    }
 
-        case OP_ENTERTRYCATCH:
-            assert(cLOGOPo->op_other->op_type == OP_CATCH);
-            /* catch body is the ->op_other of the OP_CATCH */
-            DEFER(cLOGOPx(cLOGOPo->op_other)->op_other);
-            break;
+    return last;
+}
 
-        case OP_SUBST:
-            if ((o->op_flags & OPf_WANT) == OPf_WANT_SCALAR)
-                S_check_for_bool_cxt(o, 1, OPpTRUEBOOL, 0);
-            assert(!(cPMOP->op_pmflags & PMf_ONCE));
-            while (cPMOP->op_pmstashstartu.op_pmreplstart &&
-                   cPMOP->op_pmstashstartu.op_pmreplstart->op_type == OP_NULL)
-                cPMOP->op_pmstashstartu.op_pmreplstart
-                    = cPMOP->op_pmstashstartu.op_pmreplstart->op_next;
-            DEFER(cPMOP->op_pmstashstartu.op_pmreplstart);
-            break;
+OP *
+Perl_ck_each(pTHX_ OP *o)
+{
+    OP *kid = o->op_flags & OPf_KIDS ? cUNOPo->op_first : NULL;
+    const unsigned orig_type  = o->op_type;
 
-        case OP_SORT: {
-            OP *oright;
-
-            if (o->op_flags & OPf_SPECIAL) {
-                /* first arg is a code block */
-                OP * const nullop = OpSIBLING(cLISTOP->op_first);
-                OP * kid          = cUNOPx(nullop)->op_first;
-
-                assert(nullop->op_type == OP_NULL);
-                assert(kid->op_type == OP_SCOPE
-                 || (kid->op_type == OP_NULL && kid->op_targ == OP_LEAVE));
-                /* since OP_SORT doesn't have a handy op_other-style
-                 * field that can point directly to the start of the code
-                 * block, store it in the otherwise-unused op_next field
-                 * of the top-level OP_NULL. This will be quicker at
-                 * run-time, and it will also allow us to remove leading
-                 * OP_NULLs by just messing with op_nexts without
-                 * altering the basic op_first/op_sibling layout. */
-                kid = kLISTOP->op_first;
-                assert(
-                      (kid->op_type == OP_NULL
-                      && (  kid->op_targ == OP_NEXTSTATE
-                         || kid->op_targ == OP_DBSTATE  ))
-                    || kid->op_type == OP_STUB
-                    || kid->op_type == OP_ENTER
-                    || (PL_parser && PL_parser->error_count));
-                nullop->op_next = kid->op_next;
-                DEFER(nullop->op_next);
-            }
+    PERL_ARGS_ASSERT_CK_EACH;
 
-            /* check that RHS of sort is a single plain array */
-            oright = cUNOPo->op_first;
-            if (!oright || oright->op_type != OP_PUSHMARK)
+    if (kid) {
+        switch (kid->op_type) {
+            case OP_PADHV:
                 break;
 
-            if (o->op_private & OPpSORT_INPLACE)
+            case OP_RV2HV:
+                /* Catch out an anonhash here, since the behaviour might be
+                 * confusing.
+                 *
+                 * The typical tree is:
+                 *
+                 *     rv2hv
+                 *         scope
+                 *             null
+                 *             anonhash
+                 *
+                 * If the contents of the block is more complex you might get:
+                 *
+                 *     rv2hv
+                 *         leave
+                 *             enter
+                 *             ...
+                 *             anonhash
+                 *
+                 * Similarly for the anonlist version below.
+                 */
+                if (orig_type == OP_EACH &&
+                    ckWARN(WARN_SYNTAX) &&
+                    (cUNOPx(kid)->op_flags & OPf_KIDS) &&
+                    ( cUNOPx(kid)->op_first->op_type == OP_SCOPE ||
+                      cUNOPx(kid)->op_first->op_type == OP_LEAVE) &&
+                    (cUNOPx(kid)->op_first->op_flags & OPf_KIDS)) {
+                    /* look for last non-null kid, since we might have:
+                       each %{ some code ; +{ anon hash } }
+                    */
+                    OP *k = S_last_non_null_kid(cUNOPx(kid)->op_first);
+                    if (k && k->op_type == OP_ANONHASH) {
+                        /* diag_listed_as: each on anonymous %s will always start from the beginning */
+                        Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "each on anonymous hash will always start from the beginning");
+                    }
+                }
                 break;
-
-            /* reverse sort ... can be optimised.  */
-            if (!OpHAS_SIBLING(cUNOPo)) {
-                /* Nothing follows us on the list. */
-                OP * const reverse = o->op_next;
-
-                if (reverse->op_type == OP_REVERSE &&
-                    (reverse->op_flags & OPf_WANT) == OPf_WANT_LIST) {
-                    OP * const pushmark = cUNOPx(reverse)->op_first;
-                    if (pushmark && (pushmark->op_type == OP_PUSHMARK)
-                        && (OpSIBLING(cUNOPx(pushmark)) == o)) {
-                        /* reverse -> pushmark -> sort */
-                        o->op_private |= OPpSORT_REVERSE;
-                        op_null(reverse);
-                        pushmark->op_next = oright->op_next;
-                        op_null(oright);
+            case OP_RV2AV:
+                if (orig_type == OP_EACH &&
+                    ckWARN(WARN_SYNTAX) &&
+                    (cUNOPx(kid)->op_flags & OPf_KIDS) &&
+                    (cUNOPx(kid)->op_first->op_type == OP_SCOPE ||
+                     cUNOPx(kid)->op_first->op_type == OP_LEAVE) &&
+                    (cUNOPx(kid)->op_first->op_flags & OPf_KIDS)) {
+                    OP *k = S_last_non_null_kid(cUNOPx(kid)->op_first);
+                    if (k && k->op_type == OP_ANONLIST) {
+                        /* diag_listed_as: each on anonymous %s will always start from the beginning */
+                        Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "each on anonymous array will always start from the beginning");
                     }
                 }
-            }
-
-            break;
+                /* FALLTHROUGH */
+            case OP_PADAV:
+                OpTYPE_set(o, orig_type == OP_EACH ? OP_AEACH
+                            : orig_type == OP_KEYS ? OP_AKEYS
+                            :                        OP_AVALUES);
+                break;
+            case OP_CONST:
+                if (kid->op_private == OPpCONST_BARE
+                 || !SvROK(cSVOPx_sv(kid))
+                 || (  SvTYPE(SvRV(cSVOPx_sv(kid))) != SVt_PVAV
+                    && SvTYPE(SvRV(cSVOPx_sv(kid))) != SVt_PVHV  )
+                   )
+                    goto bad;
+                /* FALLTHROUGH */
+            default:
+                qerror(Perl_mess(aTHX_
+                    "Experimental %s on scalar is now forbidden",
+                     PL_op_desc[orig_type]));
+               bad:
+                bad_type_pv(1, "hash or array", o, kid);
+                return o;
         }
+    }
+    return ck_fun(o);
+}
+
+OP *
+Perl_ck_length(pTHX_ OP *o)
+{
+    PERL_ARGS_ASSERT_CK_LENGTH;
 
-        case OP_REVERSE: {
-            OP *ourmark, *theirmark, *ourlast, *iter, *expushmark, *rv2av;
-            OP *gvop = NULL;
-            LISTOP *enter, *exlist;
+    o = ck_fun(o);
 
-            if (o->op_private & OPpSORT_INPLACE)
-                break;
+    if (ckWARN(WARN_SYNTAX)) {
+        const OP *kid = o->op_flags & OPf_KIDS ? cLISTOPo->op_first : NULL;
 
-            enter = (LISTOP *) o->op_next;
-            if (!enter)
-                break;
-            if (enter->op_type == OP_NULL) {
-                enter = (LISTOP *) enter->op_next;
-                if (!enter)
-                    break;
-            }
-            /* for $a (...) will have OP_GV then OP_RV2GV here.
-               for (...) just has an OP_GV.  */
-            if (enter->op_type == OP_GV) {
-                gvop = (OP *) enter;
-                enter = (LISTOP *) enter->op_next;
-                if (!enter)
-                    break;
-                if (enter->op_type == OP_RV2GV) {
-                  enter = (LISTOP *) enter->op_next;
-                  if (!enter)
+        if (kid) {
+            SV *name = NULL;
+            const bool hash = kid->op_type == OP_PADHV
+                           || kid->op_type == OP_RV2HV;
+            switch (kid->op_type) {
+                case OP_PADHV:
+                case OP_PADAV:
+                case OP_RV2HV:
+                case OP_RV2AV:
+                    name = op_varname(kid);
                     break;
-                }
+                default:
+                    return o;
             }
+            if (name)
+                Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
+                    "length() used on %" SVf " (did you mean \"scalar(%s%" SVf
+                    ")\"?)",
+                    SVfARG(name), hash ? "keys " : "", SVfARG(name)
+                );
+            else if (hash)
+     /* diag_listed_as: length() used on %s (did you mean "scalar(%s)"?) */
+                Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
+                    "length() used on %%hash (did you mean \"scalar(keys %%hash)\"?)");
+            else
+     /* diag_listed_as: length() used on %s (did you mean "scalar(%s)"?) */
+                Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
+                    "length() used on @array (did you mean \"scalar(@array)\"?)");
+        }
+    }
 
-            if (enter->op_type != OP_ENTERITER)
-                break;
+    return o;
+}
 
-            iter = enter->op_next;
-            if (!iter || iter->op_type != OP_ITER)
-                break;
 
-            expushmark = enter->op_first;
-            if (!expushmark || expushmark->op_type != OP_NULL
-                || expushmark->op_targ != OP_PUSHMARK)
-                break;
+OP *
+Perl_ck_isa(pTHX_ OP *o)
+{
+    OP *classop = cBINOPo->op_last;
 
-            exlist = (LISTOP *) OpSIBLING(expushmark);
-            if (!exlist || exlist->op_type != OP_NULL
-                || exlist->op_targ != OP_LIST)
-                break;
+    PERL_ARGS_ASSERT_CK_ISA;
 
-            if (exlist->op_last != o) {
-                /* Mmm. Was expecting to point back to this op.  */
-                break;
-            }
-            theirmark = exlist->op_first;
-            if (!theirmark || theirmark->op_type != OP_PUSHMARK)
-                break;
+    /* Convert barename into PV */
+    if(classop->op_type == OP_CONST && classop->op_private & OPpCONST_BARE) {
+        /* TODO: Optionally convert package to raw HV here */
+        classop->op_private &= ~(OPpCONST_BARE|OPpCONST_STRICT);
+    }
 
-            if (OpSIBLING(theirmark) != o) {
-                /* There's something between the mark and the reverse, eg
-                   for (1, reverse (...))
-                   so no go.  */
-                break;
-            }
+    return o;
+}
 
-            ourmark = ((LISTOP *)o)->op_first;
-            if (!ourmark || ourmark->op_type != OP_PUSHMARK)
-                break;
 
-            ourlast = ((LISTOP *)o)->op_last;
-            if (!ourlast || ourlast->op_next != o)
-                break;
+/* Check for in place reverse and sort assignments like "@a = reverse @a"
+   and modify the optree to make them work inplace */
 
-            rv2av = OpSIBLING(ourmark);
-            if (rv2av && rv2av->op_type == OP_RV2AV && !OpHAS_SIBLING(rv2av)
-                && rv2av->op_flags == (OPf_WANT_LIST | OPf_KIDS)) {
-                /* We're just reversing a single array.  */
-                rv2av->op_flags = OPf_WANT_SCALAR | OPf_KIDS | OPf_REF;
-                enter->op_flags |= OPf_STACKED;
-            }
+STATIC void
+S_inplace_aassign(pTHX_ OP *o) {
 
-            /* We don't have control over who points to theirmark, so sacrifice
-               ours.  */
-            theirmark->op_next = ourmark->op_next;
-            theirmark->op_flags = ourmark->op_flags;
-            ourlast->op_next = gvop ? gvop : (OP *) enter;
-            op_null(ourmark);
-            op_null(o);
-            enter->op_private |= OPpITER_REVERSED;
-            iter->op_private |= OPpITER_REVERSED;
-
-            oldoldop = NULL;
-            oldop    = ourlast;
-            o        = oldop->op_next;
-            goto redo;
-            NOT_REACHED; /* NOTREACHED */
-            break;
-        }
+    OP *modop, *modop_pushmark;
+    OP *oright;
+    OP *oleft, *oleft_pushmark;
 
-        case OP_QR:
-        case OP_MATCH:
-            if (!(cPMOP->op_pmflags & PMf_ONCE)) {
-                assert (!cPMOP->op_pmstashstartu.op_pmreplstart);
-            }
-            break;
+    PERL_ARGS_ASSERT_INPLACE_AASSIGN;
 
-        case OP_RUNCV:
-            if (!(o->op_private & OPpOFFBYONE) && !CvCLONE(PL_compcv)
-             && (!CvANON(PL_compcv) || (!PL_cv_has_eval && !PL_perldb)))
-            {
-                SV *sv;
-                if (CvEVAL(PL_compcv)) sv = &PL_sv_undef;
-                else {
-                    sv = newRV((SV *)PL_compcv);
-                    sv_rvweaken(sv);
-                    SvREADONLY_on(sv);
-                }
-                OpTYPE_set(o, OP_CONST);
-                o->op_flags |= OPf_SPECIAL;
-                cSVOPo->op_sv = sv;
-            }
-            break;
+    assert((o->op_flags & OPf_WANT) == OPf_WANT_VOID);
 
-        case OP_SASSIGN:
-            if (OP_GIMME(o,0) == G_VOID
-             || (  o->op_next->op_type == OP_LINESEQ
-                && (  o->op_next->op_next->op_type == OP_LEAVESUB
-                   || (  o->op_next->op_next->op_type == OP_RETURN
-                      && !CvLVALUE(PL_compcv)))))
-            {
-                OP *right = cBINOP->op_first;
-                if (right) {
-                    /*   sassign
-                    *      RIGHT
-                    *      substr
-                    *         pushmark
-                    *         arg1
-                    *         arg2
-                    *         ...
-                    * becomes
-                    *
-                    *  ex-sassign
-                    *     substr
-                    *        pushmark
-                    *        RIGHT
-                    *        arg1
-                    *        arg2
-                    *        ...
-                    */
-                    OP *left = OpSIBLING(right);
-                    if (left->op_type == OP_SUBSTR
-                         && (left->op_private & 7) < 4) {
-                        op_null(o);
-                        /* cut out right */
-                        op_sibling_splice(o, NULL, 1, NULL);
-                        /* and insert it as second child of OP_SUBSTR */
-                        op_sibling_splice(left, cBINOPx(left)->op_first, 0,
-                                    right);
-                        left->op_private |= OPpSUBSTR_REPL_FIRST;
-                        left->op_flags =
-                            (o->op_flags & ~OPf_WANT) | OPf_WANT_VOID;
-                    }
-                }
-            }
-            break;
+    assert(cUNOPo->op_first->op_type == OP_NULL);
+    modop_pushmark = cUNOPx(cUNOPo->op_first)->op_first;
+    assert(modop_pushmark->op_type == OP_PUSHMARK);
+    modop = OpSIBLING(modop_pushmark);
 
-        case OP_AASSIGN: {
-            int l, r, lr, lscalars, rscalars;
-
-            /* handle common vars detection, e.g. ($a,$b) = ($b,$a).
-               Note that we do this now rather than in newASSIGNOP(),
-               since only by now are aliased lexicals flagged as such
-
-               See the essay "Common vars in list assignment" above for
-               the full details of the rationale behind all the conditions
-               below.
-
-               PL_generation sorcery:
-               To detect whether there are common vars, the global var
-               PL_generation is incremented for each assign op we scan.
-               Then we run through all the lexical variables on the LHS,
-               of the assignment, setting a spare slot in each of them to
-               PL_generation.  Then we scan the RHS, and if any lexicals
-               already have that value, we know we've got commonality.
-               Also, if the generation number is already set to
-               PERL_INT_MAX, then the variable is involved in aliasing, so
-               we also have potential commonality in that case.
-             */
+    if (modop->op_type != OP_SORT && modop->op_type != OP_REVERSE)
+        return;
 
-            PL_generation++;
-            /* scan LHS */
-            lscalars = 0;
-            l = S_aassign_scan(aTHX_ cLISTOPo->op_last,  FALSE, &lscalars);
-            /* scan RHS */
-            rscalars = 0;
-            r = S_aassign_scan(aTHX_ cLISTOPo->op_first, TRUE, &rscalars);
-            lr = (l|r);
-
-
-            /* After looking for things which are *always* safe, this main
-             * if/else chain selects primarily based on the type of the
-             * LHS, gradually working its way down from the more dangerous
-             * to the more restrictive and thus safer cases */
-
-            if (   !l                      /* () = ....; */
-                || !r                      /* .... = (); */
-                || !(l & ~AAS_SAFE_SCALAR) /* (undef, pos()) = ...; */
-                || !(r & ~AAS_SAFE_SCALAR) /* ... = (1,2,length,undef); */
-                || (lscalars < 2)          /* (undef, $x) = ... */
-            ) {
-                NOOP; /* always safe */
-            }
-            else if (l & AAS_DANGEROUS) {
-                /* always dangerous */
-                o->op_private |= OPpASSIGN_COMMON_SCALAR;
-                o->op_private |= OPpASSIGN_COMMON_AGG;
-            }
-            else if (l & (AAS_PKG_SCALAR|AAS_PKG_AGG)) {
-                /* package vars are always dangerous - too many
-                 * aliasing possibilities */
-                if (l & AAS_PKG_SCALAR)
-                    o->op_private |= OPpASSIGN_COMMON_SCALAR;
-                if (l & AAS_PKG_AGG)
-                    o->op_private |= OPpASSIGN_COMMON_AGG;
-            }
-            else if (l & ( AAS_MY_SCALAR|AAS_MY_AGG
-                          |AAS_LEX_SCALAR|AAS_LEX_AGG))
-            {
-                /* LHS contains only lexicals and safe ops */
+    /* no other operation except sort/reverse */
+    if (OpHAS_SIBLING(modop))
+        return;
 
-                if (l & (AAS_MY_AGG|AAS_LEX_AGG))
-                    o->op_private |= OPpASSIGN_COMMON_AGG;
+    assert(cUNOPx(modop)->op_first->op_type == OP_PUSHMARK);
+    if (!(oright = OpSIBLING(cUNOPx(modop)->op_first))) return;
 
-                if (l & (AAS_MY_SCALAR|AAS_LEX_SCALAR)) {
-                    if (lr & AAS_LEX_SCALAR_COMM)
-                        o->op_private |= OPpASSIGN_COMMON_SCALAR;
-                    else if (   !(l & AAS_LEX_SCALAR)
-                             && (r & AAS_DEFAV))
-                    {
-                        /* falsely mark
-                         *    my (...) = @_
-                         * as scalar-safe for performance reasons.
-                         * (it will still have been marked _AGG if necessary */
-                        NOOP;
-                    }
-                    else if (r  & (AAS_PKG_SCALAR|AAS_PKG_AGG|AAS_DANGEROUS))
-                        /* if there are only lexicals on the LHS and no
-                         * common ones on the RHS, then we assume that the
-                         * only way those lexicals could also get
-                         * on the RHS is via some sort of dereffing or
-                         * closure, e.g.
-                         *    $r = \$lex;
-                         *    ($lex, $x) = (1, $$r)
-                         * and in this case we assume the var must have
-                         *  a bumped ref count. So if its ref count is 1,
-                         *  it must only be on the LHS.
-                         */
-                        o->op_private |= OPpASSIGN_COMMON_RC1;
-                }
-            }
+    if (modop->op_flags & OPf_STACKED) {
+        /* skip sort subroutine/block */
+        assert(oright->op_type == OP_NULL);
+        oright = OpSIBLING(oright);
+    }
+
+    assert(OpSIBLING(cUNOPo->op_first)->op_type == OP_NULL);
+    oleft_pushmark = cUNOPx(OpSIBLING(cUNOPo->op_first))->op_first;
+    assert(oleft_pushmark->op_type == OP_PUSHMARK);
+    oleft = OpSIBLING(oleft_pushmark);
 
-            /* ... = ($x)
-             * may have to handle aggregate on LHS, but we can't
-             * have common scalars. */
-            if (rscalars < 2)
-                o->op_private &=
-                        ~(OPpASSIGN_COMMON_SCALAR|OPpASSIGN_COMMON_RC1);
+    /* Check the lhs is an array */
+    if (!oleft ||
+        (oleft->op_type != OP_RV2AV && oleft->op_type != OP_PADAV)
+        || OpHAS_SIBLING(oleft)
+        || (oleft->op_private & OPpLVAL_INTRO)
+    )
+        return;
 
-            if ((o->op_flags & OPf_WANT) == OPf_WANT_SCALAR)
-                S_check_for_bool_cxt(o, 1, OPpASSIGN_TRUEBOOL, 0);
-            break;
-        }
+    /* Only one thing on the rhs */
+    if (OpHAS_SIBLING(oright))
+        return;
 
-        case OP_REF:
-        case OP_BLESSED:
-            /* if the op is used in boolean context, set the TRUEBOOL flag
-             * which enables an optimisation at runtime which avoids creating
-             * a stack temporary for known-true package names */
-            if ((o->op_flags & OPf_WANT) == OPf_WANT_SCALAR)
-                S_check_for_bool_cxt(o, 1, OPpTRUEBOOL, OPpMAYBE_TRUEBOOL);
-            break;
+    /* check the array is the same on both sides */
+    if (oleft->op_type == OP_RV2AV) {
+        if (oright->op_type != OP_RV2AV
+            || !cUNOPx(oright)->op_first
+            || cUNOPx(oright)->op_first->op_type != OP_GV
+            || cUNOPx(oleft )->op_first->op_type != OP_GV
+            || cGVOPx_gv(cUNOPx(oleft)->op_first) !=
+               cGVOPx_gv(cUNOPx(oright)->op_first)
+        )
+            return;
+    }
+    else if (oright->op_type != OP_PADAV
+        || oright->op_targ != oleft->op_targ
+    )
+        return;
 
-        case OP_LENGTH:
-            /* see if the op is used in known boolean context,
-             * but not if OA_TARGLEX optimisation is enabled */
-            if (   (o->op_flags & OPf_WANT) == OPf_WANT_SCALAR
-                && !(o->op_private & OPpTARGET_MY)
-            )
-                S_check_for_bool_cxt(o, 1, OPpTRUEBOOL, 0);
-            break;
+    /* This actually is an inplace assignment */
 
-        case OP_POS:
-            /* see if the op is used in known boolean context */
-            if ((o->op_flags & OPf_WANT) == OPf_WANT_SCALAR)
-                S_check_for_bool_cxt(o, 1, OPpTRUEBOOL, 0);
-            break;
+    modop->op_private |= OPpSORT_INPLACE;
 
-        case OP_CUSTOM: {
-            Perl_cpeep_t cpeep =
-                XopENTRYCUSTOM(o, xop_peep);
-            if (cpeep)
-                cpeep(aTHX_ o, oldop);
-            break;
-        }
+    /* transfer MODishness etc from LHS arg to RHS arg */
+    oright->op_flags = oleft->op_flags;
 
-        }
-        /* did we just null the current op? If so, re-process it to handle
-         * eliding "empty" ops from the chain */
-        if (o->op_type == OP_NULL && oldop && oldop->op_next == o) {
-            o->op_opt = 0;
-            o = oldop;
-        }
-        else {
-            oldoldop = oldop;
-            oldop = o;
-        }
-    }
-    LEAVE;
+    /* remove the aassign op and the lhs */
+    op_null(o);
+    op_null(oleft_pushmark);
+    if (oleft->op_type == OP_RV2AV && cUNOPx(oleft)->op_first)
+        op_null(cUNOPx(oleft)->op_first);
+    op_null(oleft);
 }
 
-void
-Perl_peep(pTHX_ OP *o)
-{
-    CALL_RPEEP(o);
-}
 
 /*
 =for apidoc_section $custom
@@ -18890,8 +15390,8 @@ Perl_report_redefined_cv(pTHX_ const SV *name, const CV *old_cv,
                                SV * const *new_const_svp)
 {
     const char *hvname;
-    bool is_const = !!CvCONST(old_cv);
-    SV *old_const_sv = is_const ? cv_const_sv(old_cv) : NULL;
+    bool is_const = cBOOL(CvCONST(old_cv));
+    SV *old_const_sv = is_const ? cv_const_sv_or_av(old_cv) : NULL;
 
     PERL_ARGS_ASSERT_REPORT_REDEFINED_CV;
 
@@ -18914,14 +15414,22 @@ Perl_report_redefined_cv(pTHX_ const SV *name, const CV *old_cv,
         )
      || (is_const
          && ckWARN_d(WARN_REDEFINE)
-         && (!new_const_svp || sv_cmp(old_const_sv, *new_const_svp))
+         && (!new_const_svp ||
+             !*new_const_svp ||
+             !old_const_sv ||
+             SvTYPE(old_const_sv) == SVt_PVAV ||
+             SvTYPE(*new_const_svp) == SVt_PVAV ||
+             sv_cmp(old_const_sv, *new_const_svp))
         )
-    )
+        ) {
         Perl_warner(aTHX_ packWARN(WARN_REDEFINE),
                           is_const
                             ? "Constant subroutine %" SVf " redefined"
-                            : "Subroutine %" SVf " redefined",
+                            : CvIsMETHOD(old_cv)
+                              ? "Method %" SVf " redefined"
+                              : "Subroutine %" SVf " redefined",
                           SVfARG(name));
+    }
 }
 
 /*
@@ -19048,20 +15556,155 @@ const_av_xsub(pTHX_ CV* cv)
  * This is the e implementation for the DUP_WARNINGS() macro
  */
 
-STRLEN*
-Perl_dup_warnings(pTHX_ STRLEN* warnings)
+char *
+Perl_dup_warnings(pTHX_ char* warnings)
 {
-    Size_t size;
-    STRLEN *new_warnings;
-
     if (warnings == NULL || specialWARN(warnings))
         return warnings;
 
-    size = sizeof(*warnings) + *warnings;
+    return rcpv_copy(warnings);
+}
+
+/*
+=for apidoc rcpv_new
+
+Create a new shared memory refcounted string with the requested size, and
+with the requested initialization and a refcount of 1. The actual space
+allocated will be 1 byte more than requested and rcpv_new() will ensure that
+the extra byte is a null regardless of any flags settings.
+
+If the RCPVf_NO_COPY flag is set then the pv argument will be
+ignored, otherwise the contents of the pv pointer will be copied into
+the new buffer or if it is NULL the function will do nothing and return NULL.
+
+If the RCPVf_USE_STRLEN flag is set then the len argument is ignored and
+recomputed using C<strlen(pv)>. It is an error to combine RCPVf_USE_STRLEN
+and RCPVf_NO_COPY at the same time.
+
+Under DEBUGGING rcpv_new() will assert() if it is asked to create a 0 length
+shared string unless the RCPVf_ALLOW_EMPTY flag is set.
+
+The return value from the function is suitable for passing into rcpv_copy() and
+rcpv_free(). To access the RCPV * from the returned value use the RCPVx() macro.
+The 'len' member of the RCPV struct stores the allocated length (including the
+extra byte), but the RCPV_LEN() macro returns the requested length (not
+including the extra byte).
+
+Note that rcpv_new() does NOT use a hash table or anything like that to
+dedupe inputs given the same text content. Each call with a non-null pv
+parameter will produce a distinct pointer with its own refcount regardless of
+the input content.
+
+=cut
+*/
+
+char *
+Perl_rcpv_new(pTHX_ const char *pv, STRLEN len, U32 flags) {
+    RCPV *rcpv;
+
+    PERL_ARGS_ASSERT_RCPV_NEW;
+
+    PERL_UNUSED_CONTEXT;
+
+    /* Musn't use both at the same time */
+    assert((flags & (RCPVf_NO_COPY|RCPVf_USE_STRLEN))!=
+                    (RCPVf_NO_COPY|RCPVf_USE_STRLEN));
+
+    if (!pv && (flags & RCPVf_NO_COPY) == 0)
+        return NULL;
+
+    if (flags & RCPVf_USE_STRLEN)
+        len = strlen(pv);
+
+    assert(len || (flags & RCPVf_ALLOW_EMPTY));
+
+    len++; /* add one for the null we will add to the end */
+
+    rcpv = (RCPV *)PerlMemShared_malloc(sizeof(struct rcpv) + len);
+    if (!rcpv)
+        croak_no_mem();
+
+    rcpv->len = len;    /* store length including null,
+                           RCPV_LEN() subtracts 1 to account for this */
+    rcpv->refcount = 1;
+
+    if ((flags & RCPVf_NO_COPY) == 0) {
+        (void)memcpy(rcpv->pv, pv, len-1);
+    }
+    rcpv->pv[len-1]= '\0'; /* the last byte should always be null */
+    return rcpv->pv;
+}
+
+/*
+=for apidoc rcpv_free
+
+refcount decrement a shared memory refcounted string, and when
+the refcount goes to 0 free it using perlmemshared_free().
+
+it is the callers responsibility to ensure that the pv is the
+result of a rcpv_new() call.
+
+Always returns NULL so it can be used like this:
+
+    thing = rcpv_free(thing);
+
+=cut
+*/
+
+char *
+Perl_rcpv_free(pTHX_ char *pv) {
+
+    PERL_ARGS_ASSERT_RCPV_FREE;
+
+    PERL_UNUSED_CONTEXT;
+
+    if (!pv)
+        return NULL;
+    RCPV *rcpv = RCPVx(pv);
+
+    assert(rcpv->refcount);
+    assert(rcpv->len);
+
+    OP_REFCNT_LOCK;
+    if (--rcpv->refcount == 0) {
+        rcpv->len = 0;
+        PerlMemShared_free(rcpv);
+    }
+    OP_REFCNT_UNLOCK;
+    return NULL;
+}
+
+/*
+=for apidoc rcpv_copy
+
+refcount increment a shared memory refcounted string, and when
+the refcount goes to 0 free it using PerlMemShared_free().
+
+It is the callers responsibility to ensure that the pv is the
+result of a rcpv_new() call.
+
+Returns the same pointer that was passed in.
+
+    new = rcpv_copy(pv);
+
+=cut
+*/
 
-    new_warnings = (STRLEN*)PerlMemShared_malloc(size);
-    Copy(warnings, new_warnings, size, char);
-    return new_warnings;
+
+char *
+Perl_rcpv_copy(pTHX_ char *pv) {
+
+    PERL_ARGS_ASSERT_RCPV_COPY;
+
+    PERL_UNUSED_CONTEXT;
+
+    if (!pv)
+        return NULL;
+    RCPV *rcpv = RCPVx(pv);
+    OP_REFCNT_LOCK;
+    rcpv->refcount++;
+    OP_REFCNT_UNLOCK;
+    return pv;
 }
 
 /*
index 63be543..503dfdb 100644 (file)
@@ -64,6 +64,14 @@ typedef PERL_BITFIELD16 Optype;
     U8         op_private;
 #endif
 
+#define OpTYPE_set(o,type)                      \
+    STMT_START {                                \
+        OP *o_ = (OP *)o;                       \
+        OPCODE type_ = type;                    \
+        o_->op_type = type_;                    \
+        o_->op_ppaddr = PL_ppaddr[type_];       \
+    } STMT_END
+
 /* If op_type:9 is changed to :10, also change cx_pusheval()
    Also, if the type of op_type is ever changed (e.g. to PERL_BITFIELD32)
    then all the other bit-fields before/after it should change their
@@ -153,6 +161,9 @@ Deprecated.  Use C<GIMME_V> instead.
                                 /*  On OP_DUMP, has no label */
                                 /*  On OP_UNSTACK, in a C-style for loop */
                                 /*  On OP_READLINE, it's for <<>>, not <> */
+                                /*  On OP_RETURN, module_true is in effect */
+                                /*  On OP_NEXT/OP_LAST/OP_REDO, there is no
+                                 *  loop label */
 /* There is no room in op_flags for this one, so it has its own bit-
    field member (op_folded) instead.  The flag is only used to tell
    op_convert_list to set op_folded.  */
@@ -248,8 +259,7 @@ struct methop {
     BASEOP
     union {
         /* op_u.op_first *must* be aligned the same as the op_first
-         * field of the other op types, and op_u.op_meth_sv *must*
-         * be aligned with op_sv */
+         * field of the other op types */
         OP* op_first;   /* optree for method name */
         SV* op_meth_sv; /* static method name */
     } op_u;
@@ -469,6 +479,7 @@ struct loop {
 #define cPVOP          cPVOPx(PL_op)
 #define cCOP           cCOPx(PL_op)
 #define cLOOP          cLOOPx(PL_op)
+#define cMETHOP         cMETHOPx(PL_op)
 
 #define cUNOPo         cUNOPx(o)
 #define cUNOP_AUXo     cUNOP_AUXx(o)
@@ -481,6 +492,7 @@ struct loop {
 #define cPVOPo         cPVOPx(o)
 #define cCOPo          cCOPx(o)
 #define cLOOPo         cLOOPx(o)
+#define cMETHOPo        cMETHOPx(o)
 
 #define kUNOP          cUNOPx(kid)
 #define kUNOP_AUX      cUNOP_AUXx(kid)
@@ -493,6 +505,7 @@ struct loop {
 #define kPVOP          cPVOPx(kid)
 #define kCOP           cCOPx(kid)
 #define kLOOP          cLOOPx(kid)
+#define kMETHOP         cMETHOPx(kid)
 
 
 typedef enum {
@@ -514,33 +527,40 @@ typedef enum {
 
 
 #ifdef USE_ITHREADS
-#  define      cGVOPx_gv(o)    ((GV*)PAD_SVl(cPADOPx(o)->op_padix))
+#  define cGVOPx_gv(o)  ((GV*)PAD_SVl(cPADOPx(o)->op_padix))
 #  ifndef PERL_CORE
-#    define    IS_PADGV(v)     (v && isGV(v))
-#    define    IS_PADCONST(v) \
+#    define IS_PADGV(v) (v && isGV(v))
+#    define IS_PADCONST(v) \
         (v && (SvREADONLY(v) || (SvIsCOW(v) && !SvLEN(v))))
 #  endif
-#  define      cSVOPx_sv(v)    (cSVOPx(v)->op_sv \
+#  define cSVOPx_sv(v)  (cSVOPx(v)->op_sv \
                                  ? cSVOPx(v)->op_sv : PAD_SVl((v)->op_targ))
-#  define      cSVOPx_svp(v)   (cSVOPx(v)->op_sv \
+#  define cSVOPx_svp(v) (cSVOPx(v)->op_sv \
                                  ? &cSVOPx(v)->op_sv : &PAD_SVl((v)->op_targ))
-#  define      cMETHOPx_rclass(v) PAD_SVl(cMETHOPx(v)->op_rclass_targ)
+#  define       cMETHOPx_meth(v) (cMETHOPx(v)->op_u.op_meth_sv \
+                                  ? cMETHOPx(v)->op_u.op_meth_sv : PAD_SVl((v)->op_targ))
+#  define cMETHOPx_rclass(v) PAD_SVl(cMETHOPx(v)->op_rclass_targ)
 #else
-#  define      cGVOPx_gv(o)    ((GV*)cSVOPx(o)->op_sv)
+#  define cGVOPx_gv(o)  ((GV*)cSVOPx(o)->op_sv)
 #  ifndef PERL_CORE
-#    define    IS_PADGV(v)     FALSE
-#    define    IS_PADCONST(v)  FALSE
+#    define IS_PADGV(v) FALSE
+#    define IS_PADCONST(v)      FALSE
 #  endif
-#  define      cSVOPx_sv(v)    (cSVOPx(v)->op_sv)
-#  define      cSVOPx_svp(v)   (&cSVOPx(v)->op_sv)
-#  define      cMETHOPx_rclass(v) (cMETHOPx(v)->op_rclass_sv)
+#  define cSVOPx_sv(v)  (cSVOPx(v)->op_sv)
+#  define cSVOPx_svp(v) (&cSVOPx(v)->op_sv)
+#  define       cMETHOPx_meth(v)   (cMETHOPx(v)->op_u.op_meth_sv)
+#  define cMETHOPx_rclass(v) (cMETHOPx(v)->op_rclass_sv)
 #endif
 
-#define        cMETHOPx_meth(v)        cSVOPx_sv(v)
+#define cMETHOP_meth            cMETHOPx_meth(PL_op)
+#define cMETHOP_rclass          cMETHOPx_rclass(PL_op)
 
-#define        cGVOP_gv                cGVOPx_gv(PL_op)
-#define        cGVOPo_gv               cGVOPx_gv(o)
-#define        kGVOP_gv                cGVOPx_gv(kid)
+#define cMETHOPo_meth           cMETHOPx_meth(o)
+#define cMETHOPo_rclass         cMETHOPx_rclass(o)
+
+#define cGVOP_gv                cGVOPx_gv(PL_op)
+#define cGVOPo_gv               cGVOPx_gv(o)
+#define kGVOP_gv                cGVOPx_gv(kid)
 #define cSVOP_sv               cSVOPx_sv(PL_op)
 #define cSVOPo_sv              cSVOPx_sv(o)
 #define kSVOP_sv               cSVOPx_sv(kid)
@@ -601,6 +621,7 @@ typedef enum {
  * The same mutex is used to protect the refcounts of the reg_trie_data
  * and reg_ac_data structures, which are shared between duplicated
  * regexes.
+ * The same mutex is used to protect the refcounts for RCPV objects.
  */
 
 #ifdef USE_ITHREADS
@@ -768,29 +789,29 @@ struct block_hooks {
 =for apidoc mx|U32|BhkFLAGS|BHK *hk
 Return the BHK's flags.
 
-=for apidoc mxu|void *|BhkENTRY|BHK *hk|which
+=for apidoc mxu|void *|BhkENTRY|BHK *hk|token which
 Return an entry from the BHK structure.  C<which> is a preprocessor token
 indicating which entry to return.  If the appropriate flag is not set
 this will return C<NULL>.  The type of the return value depends on which
 entry you ask for.
 
-=for apidoc Amxu|void|BhkENTRY_set|BHK *hk|which|void *ptr
+=for apidoc Amxu|void|BhkENTRY_set|BHK *hk|token which|void *ptr
 Set an entry in the BHK structure, and set the flags to indicate it is
 valid.  C<which> is a preprocessing token indicating which entry to set.
 The type of C<ptr> depends on the entry.
 
-=for apidoc Amxu|void|BhkDISABLE|BHK *hk|which
+=for apidoc Amxu|void|BhkDISABLE|BHK *hk|token which
 Temporarily disable an entry in this BHK structure, by clearing the
 appropriate flag.  C<which> is a preprocessor token indicating which
 entry to disable.
 
-=for apidoc Amxu|void|BhkENABLE|BHK *hk|which
+=for apidoc Amxu|void|BhkENABLE|BHK *hk|token which
 Re-enable an entry in this BHK structure, by setting the appropriate
 flag.  C<which> is a preprocessor token indicating which entry to enable.
 This will assert (under -DDEBUGGING) if the entry doesn't contain a valid
 pointer.
 
-=for apidoc mxu|void|CALL_BLOCK_HOOKS|which|arg
+=for apidoc mxu|void|CALL_BLOCK_HOOKS|token which|arg
 Call all the registered block hooks for type C<which>.  C<which> is a
 preprocessing token; the type of C<arg> depends on C<which>.
 
@@ -866,7 +887,7 @@ preprocessing token; the type of C<arg> depends on C<which>.
 =for apidoc Am|U32|XopFLAGS|XOP *xop
 Return the XOP's flags.
 
-=for apidoc Am||XopENTRY|XOP *xop|which
+=for apidoc Amu||XopENTRY|XOP *xop|token which
 Return a member of the XOP structure.  C<which> is a cpp token
 indicating which entry to return.  If the member is not set
 this will return a default value.  The return type depends
@@ -874,21 +895,21 @@ on C<which>.  This macro evaluates its arguments more than
 once.  If you are using C<Perl_custom_op_xop> to retrieve a
 C<XOP *> from a C<OP *>, use the more efficient L</XopENTRYCUSTOM> instead.
 
-=for apidoc Am||XopENTRYCUSTOM|const OP *o|which
+=for apidoc Amu||XopENTRYCUSTOM|const OP *o|token which
 Exactly like C<XopENTRY(XopENTRY(Perl_custom_op_xop(aTHX_ o), which)> but more
 efficient.  The C<which> parameter is identical to L</XopENTRY>.
 
-=for apidoc Am|void|XopENTRY_set|XOP *xop|which|value
+=for apidoc Amu|void|XopENTRY_set|XOP *xop|token which|value
 Set a member of the XOP structure.  C<which> is a cpp token
 indicating which entry to set.  See L<perlguts/"Custom Operators">
 for details about the available members and how
 they are used.  This macro evaluates its argument
 more than once.
 
-=for apidoc Am|void|XopDISABLE|XOP *xop|which
+=for apidoc Amu|void|XopDISABLE|XOP *xop|token which
 Temporarily disable a member of the XOP, by clearing the appropriate flag.
 
-=for apidoc Am|void|XopENABLE|XOP *xop|which
+=for apidoc Amu|void|XopENABLE|XOP *xop|token which
 Reenable a member of the XOP which has been disabled.
 
 =cut
@@ -1149,6 +1170,8 @@ struct op_argcheck_aux {
     char slurpy;     /* presence of slurpy: may be '\0', '@' or '%' */
 };
 
+#define MI_INIT_WORKAROUND_PACK "Module::Install::DSL"
+
 
 /*
  * ex: set ts=8 sts=4 sw=4 et:
index e8770e6..1273cb6 100644 (file)
@@ -101,8 +101,20 @@ get_regex_charset(const U32 flags)
 
 /* Mask of the above bits.  These need to be transferred from op_pmflags to
  * re->extflags during compilation */
-#define RXf_PMf_COMPILETIME    (RXf_PMf_MULTILINE|RXf_PMf_SINGLELINE|RXf_PMf_FOLD|RXf_PMf_EXTENDED|RXf_PMf_EXTENDED_MORE|RXf_PMf_KEEPCOPY|RXf_PMf_NOCAPTURE|RXf_PMf_CHARSET|RXf_PMf_STRICT)
-#define RXf_PMf_FLAGCOPYMASK   (RXf_PMf_COMPILETIME|RXf_PMf_SPLIT)
+#define RXf_PMf_COMPILETIME \
+    ( RXf_PMf_MULTILINE     \
+    | RXf_PMf_SINGLELINE    \
+    | RXf_PMf_FOLD          \
+    | RXf_PMf_EXTENDED      \
+    | RXf_PMf_EXTENDED_MORE \
+    | RXf_PMf_KEEPCOPY      \
+    | RXf_PMf_NOCAPTURE     \
+    | RXf_PMf_CHARSET       \
+    | RXf_PMf_STRICT )
+
+#define RXf_PMf_FLAGCOPYMASK    \
+    ( RXf_PMf_COMPILETIME       \
+    | RXf_PMf_SPLIT )
 
 /* Temporary to get Jenkins happy again
  * See thread starting at http://nntp.perl.org/group/perl.perl5.porters/220710
index 838b256..9f51822 100644 (file)
@@ -1,4 +1,4 @@
-/* -*- buffer-read-only: t -*-
+/* -*- mode: C; buffer-read-only: t -*-
  *
  *    opcode.h
  *
 
 START_EXTERN_C
 
-#ifndef DOINIT
-EXTCONST char* const PL_op_name[];
-#else
-EXTCONST char* const PL_op_name[] = {
+EXTCONST char* const PL_op_name[] INIT({
        "null",
        "stub",
        "scalar",
@@ -159,6 +156,7 @@ EXTCONST char* const PL_op_name[] = {
        "gv",
        "gelem",
        "padsv",
+       "padsv_store",
        "padav",
        "padhv",
        "padany",
@@ -287,6 +285,7 @@ EXTCONST char* const PL_op_name[] = {
        "rv2av",
        "aelemfast",
        "aelemfast_lex",
+       "aelemfastlex_store",
        "aelem",
        "aslice",
        "kvaslice",
@@ -311,6 +310,7 @@ EXTCONST char* const PL_op_name[] = {
        "lslice",
        "anonlist",
        "anonhash",
+       "emptyavhv",
        "splice",
        "push",
        "pop",
@@ -563,14 +563,14 @@ EXTCONST char* const PL_op_name[] = {
        "reftype",
        "ceil",
        "floor",
+       "is_tainted",
+       "helemexistsor",
+       "methstart",
+       "initfield",
         "freed",
-};
-#endif
+});
 
-#ifndef DOINIT
-EXTCONST char* const PL_op_desc[];
-#else
-EXTCONST char* const PL_op_desc[] = {
+EXTCONST char* const PL_op_desc[] INIT({
        "null operation",
        "stub",
        "scalar",
@@ -581,6 +581,7 @@ EXTCONST char* const PL_op_desc[] = {
        "glob value",
        "glob elem",
        "private variable",
+       "padsv scalar assignment",
        "private array",
        "private hash",
        "private value",
@@ -709,6 +710,7 @@ EXTCONST char* const PL_op_desc[] = {
        "array dereference",
        "constant array element",
        "constant lexical array element",
+       "const lexical array element store",
        "array element",
        "array slice",
        "index/value array slice",
@@ -733,6 +735,7 @@ EXTCONST char* const PL_op_desc[] = {
        "list slice",
        "anonymous array ([])",
        "anonymous hash ({})",
+       "empty anon hash/array",
        "splice",
        "push",
        "pop",
@@ -985,17 +988,19 @@ EXTCONST char* const PL_op_desc[] = {
        "reftype",
        "ceil",
        "floor",
-        "freed op",
-};
-#endif
+       "is_tainted",
+       "hash element exists or",
+       "method start",
+       "initialise field",
+    "freed op",
+});
 
 END_EXTERN_C
 
 START_EXTERN_C
 
 EXT Perl_ppaddr_t PL_ppaddr[] /* or perlvars.h */
-#if defined(DOINIT)
-= {
+INIT({
        Perl_pp_null,
        Perl_pp_stub,
        Perl_pp_scalar, /* implemented by Perl_pp_null */
@@ -1006,6 +1011,7 @@ EXT Perl_ppaddr_t PL_ppaddr[] /* or perlvars.h */
        Perl_pp_gv,
        Perl_pp_gelem,
        Perl_pp_padsv,
+       Perl_pp_padsv_store,
        Perl_pp_padav,
        Perl_pp_padhv,
        Perl_pp_padany, /* implemented by Perl_unimplemented_op */
@@ -1134,6 +1140,7 @@ EXT Perl_ppaddr_t PL_ppaddr[] /* or perlvars.h */
        Perl_pp_rv2av,
        Perl_pp_aelemfast,
        Perl_pp_aelemfast_lex,  /* implemented by Perl_pp_aelemfast */
+       Perl_pp_aelemfastlex_store,
        Perl_pp_aelem,
        Perl_pp_aslice,
        Perl_pp_kvaslice,
@@ -1158,6 +1165,7 @@ EXT Perl_ppaddr_t PL_ppaddr[] /* or perlvars.h */
        Perl_pp_lslice,
        Perl_pp_anonlist,
        Perl_pp_anonhash,
+       Perl_pp_emptyavhv,
        Perl_pp_splice,
        Perl_pp_push,
        Perl_pp_pop,    /* implemented by Perl_pp_shift */
@@ -1410,13 +1418,14 @@ EXT Perl_ppaddr_t PL_ppaddr[] /* or perlvars.h */
        Perl_pp_reftype,
        Perl_pp_ceil,
        Perl_pp_floor,
-}
-#endif
-;
+       Perl_pp_is_tainted,
+       Perl_pp_helemexistsor,
+       Perl_pp_methstart,
+       Perl_pp_initfield,
+});
 
 EXT Perl_check_t PL_check[] /* or perlvars.h */
-#if defined(DOINIT)
-= {
+INIT({
        Perl_ck_null,           /* null */
        Perl_ck_null,           /* stub */
        Perl_ck_fun,            /* scalar */
@@ -1427,6 +1436,7 @@ EXT Perl_check_t PL_check[] /* or perlvars.h */
        Perl_ck_null,           /* gv */
        Perl_ck_null,           /* gelem */
        Perl_ck_null,           /* padsv */
+       Perl_ck_sassign,        /* padsv_store */
        Perl_ck_null,           /* padav */
        Perl_ck_null,           /* padhv */
        Perl_ck_null,           /* padany */
@@ -1555,6 +1565,7 @@ EXT Perl_check_t PL_check[] /* or perlvars.h */
        Perl_ck_rvconst,        /* rv2av */
        Perl_ck_null,           /* aelemfast */
        Perl_ck_null,           /* aelemfast_lex */
+       Perl_ck_null,           /* aelemfastlex_store */
        Perl_ck_null,           /* aelem */
        Perl_ck_null,           /* aslice */
        Perl_ck_null,           /* kvaslice */
@@ -1579,6 +1590,7 @@ EXT Perl_check_t PL_check[] /* or perlvars.h */
        Perl_ck_null,           /* lslice */
        Perl_ck_fun,            /* anonlist */
        Perl_ck_fun,            /* anonhash */
+       Perl_ck_fun,            /* emptyavhv */
        Perl_ck_fun,            /* splice */
        Perl_ck_fun,            /* push */
        Perl_ck_shift,          /* pop */
@@ -1831,14 +1843,13 @@ EXT Perl_check_t PL_check[] /* or perlvars.h */
        Perl_ck_null,           /* reftype */
        Perl_ck_null,           /* ceil */
        Perl_ck_null,           /* floor */
-}
-#endif
-;
+       Perl_ck_null,           /* is_tainted */
+       Perl_ck_helemexistsor,  /* helemexistsor */
+       Perl_ck_null,           /* methstart */
+       Perl_ck_null,           /* initfield */
+});
 
-#ifndef DOINIT
-EXTCONST U32 PL_opargs[];
-#else
-EXTCONST U32 PL_opargs[] = {
+EXTCONST U32 PL_opargs[] INIT({
        0x00000000,     /* null */
        0x00000000,     /* stub */
        0x00001b04,     /* scalar */
@@ -1849,6 +1860,7 @@ EXTCONST U32 PL_opargs[] = {
        0x00000644,     /* gv */
        0x00011244,     /* gelem */
        0x00000044,     /* padsv */
+       0x00011104,     /* padsv_store */
        0x00000040,     /* padav */
        0x00000040,     /* padhv */
        0x00000040,     /* padany */
@@ -1977,6 +1989,7 @@ EXTCONST U32 PL_opargs[] = {
        0x00000148,     /* rv2av */
        0x00013644,     /* aelemfast */
        0x00013040,     /* aelemfast_lex */
+       0x00013140,     /* aelemfastlex_store */
        0x00013204,     /* aelem */
        0x00023401,     /* aslice */
        0x00023401,     /* kvaslice */
@@ -2001,6 +2014,7 @@ EXTCONST U32 PL_opargs[] = {
        0x00224200,     /* lslice */
        0x00002405,     /* anonlist */
        0x00002405,     /* anonhash */
+       0x0000241c,     /* emptyavhv */
        0x02993401,     /* splice */
        0x0002341d,     /* push */
        0x0000bb04,     /* pop */
@@ -2244,8 +2258,8 @@ EXTCONST U32 PL_opargs[] = {
        0x00000400,     /* poptry */
        0x00000300,     /* catch */
        0x00000300,     /* pushdefer */
-       0x0000011e,     /* is_bool */
-       0x0000011e,     /* is_weak */
+       0x00000106,     /* is_bool */
+       0x00000106,     /* is_weak */
        0x00000100,     /* weaken */
        0x00000100,     /* unweaken */
        0x00000106,     /* blessed */
@@ -2253,8 +2267,11 @@ EXTCONST U32 PL_opargs[] = {
        0x0000011e,     /* reftype */
        0x0000011e,     /* ceil */
        0x0000011e,     /* floor */
-};
-#endif
+       0x00000106,     /* is_tainted */
+       0x00011300,     /* helemexistsor */
+       0x00000f00,     /* methstart */
+       0x00000f00,     /* initfield */
+});
 
 END_EXTERN_C
 
@@ -2274,6 +2291,7 @@ END_EXTERN_C
 #define OPpEVAL_HAS_HH          0x02
 #define OPpFT_ACCESS            0x02
 #define OPpHINT_STRICT_REFS     0x02
+#define OPpINITFIELD_AV         0x02
 #define OPpITER_REVERSED        0x02
 #define OPpSORT_INTEGER         0x02
 #define OPpTRANS_USE_SVOP       0x02
@@ -2286,6 +2304,7 @@ END_EXTERN_C
 #define OPpENTERSUB_HASTARG     0x04
 #define OPpEVAL_UNICODE         0x04
 #define OPpFT_STACKED           0x04
+#define OPpINITFIELD_HV         0x04
 #define OPpLVREF_ELEM           0x04
 #define OPpSLICEWARNING         0x04
 #define OPpSORT_REVERSE         0x04
@@ -2324,6 +2343,7 @@ END_EXTERN_C
 #define OPpASSIGN_COMMON_RC1    0x20
 #define OPpDEREF_HV             0x20
 #define OPpEARLY_CV             0x20
+#define OPpEMPTYAVHV_IS_HV      0x20
 #define OPpEVAL_RE_REPARSING    0x20
 #define OPpHUSH_VMSISH          0x20
 #define OPpKVSLICE              0x20
@@ -2334,17 +2354,20 @@ END_EXTERN_C
 #define OPpOPEN_IN_CRLF         0x20
 #define OPpTRANS_COMPLEMENT     0x20
 #define OPpTRUEBOOL             0x20
+#define OPpUNDEF_KEEP_PV        0x20
 #define OPpDEREF                0x30
 #define OPpDEREF_SV             0x30
 #define OPpLVREF_CV             0x30
 #define OPpLVREF_TYPE           0x30
 #define OPpALLOW_FAKE           0x40
+#define OPpARG_IF_FALSE         0x40
 #define OPpASSIGN_BACKWARDS     0x40
 #define OPpASSIGN_COMMON_SCALAR 0x40
 #define OPpCONCAT_NESTED        0x40
 #define OPpCONST_BARE           0x40
 #define OPpCOREARGS_SCALARMOD   0x40
 #define OPpENTERSUB_DB          0x40
+#define OPpEVAL_EVALSV          0x40
 #define OPpEXISTS_SUB           0x40
 #define OPpFLIP_LINENUM         0x40
 #define OPpINDEX_BOOLNEG        0x40
@@ -2359,10 +2382,13 @@ END_EXTERN_C
 #define OPpSLICE                0x40
 #define OPpTRANS_GROWS          0x40
 #define OPpPADRANGE_COUNTMASK   0x7f
+#define OPpARG_IF_UNDEF         0x80
 #define OPpASSIGN_CV_TO_GV      0x80
 #define OPpCOREARGS_PUSHMARK    0x80
 #define OPpDEFER_FINALLY        0x80
 #define OPpENTERSUB_NOPAREN     0x80
+#define OPpHELEMEXISTSOR_DELETE 0x80
+#define OPpINITFIELDS           0x80
 #define OPpLVALUE               0x80
 #define OPpLVAL_INTRO           0x80
 #define OPpOFFBYONE             0x80
@@ -2394,6 +2420,7 @@ EXTCONST char PL_op_private_labels[] = {
     '+','1','\0',
     '-','\0',
     'A','M','P','E','R','\0',
+    'A','N','O','N','H','A','S','H','\0',
     'A','P','P','E','N','D','\0',
     'A','S','S','I','G','N','\0',
     'A','V','\0',
@@ -2425,6 +2452,7 @@ EXTCONST char PL_op_private_labels[] = {
     'E','A','R','L','Y','C','V','\0',
     'E','L','E','M','\0',
     'E','N','T','E','R','E','D','\0',
+    'E','V','A','L','S','V','\0',
     'E','X','I','S','T','S','\0',
     'F','A','K','E','\0',
     'F','I','N','A','L','L','Y','\0',
@@ -2438,13 +2466,19 @@ EXTCONST char PL_op_private_labels[] = {
     'H','U','S','H','\0',
     'H','V','\0',
     'I','D','E','N','T','\0',
+    'I','F','_','F','A','L','S','E','\0',
+    'I','F','_','U','N','D','E','F','\0',
     'I','M','P','L','I','M','\0',
     'I','N','A','R','G','S','\0',
     'I','N','B','I','N','\0',
     'I','N','C','R','\0',
+    'I','N','I','T','F','I','E','L','D','S','\0',
+    'I','N','I','T','F','I','E','L','D','_','A','V','\0',
+    'I','N','I','T','F','I','E','L','D','_','H','V','\0',
     'I','N','P','L','A','C','E','\0',
     'I','N','T','\0',
     'I','T','E','R','\0',
+    'K','E','E','P','_','P','V','\0',
     'K','E','Y','S','\0',
     'K','V','S','L','I','C','E','\0',
     'L','E','X','\0',
@@ -2504,14 +2538,14 @@ EXTCONST char PL_op_private_labels[] = {
 EXTCONST I16 PL_op_private_bitfields[] = {
     0, 8, -1,
     0, 8, -1,
-    0, 596, -1,
+    0, 675, -1,
     0, 8, -1,
     0, 8, -1,
-    0, 603, -1,
-    0, 592, -1,
-    1, -1, 0, 553, 1, 30, 2, 303, -1,
-    4, -1, 1, 176, 2, 183, 3, 190, -1,
-    4, -1, 0, 553, 1, 30, 2, 303, 3, 122, -1,
+    0, 682, -1,
+    0, 671, -1,
+    1, -1, 0, 632, 1, 39, 2, 319, -1,
+    4, -1, 1, 185, 2, 192, 3, 199, -1,
+    4, -1, 0, 632, 1, 39, 2, 319, 3, 131, -1,
 
 };
 
@@ -2530,21 +2564,22 @@ EXTCONST I16  PL_op_private_bitdef_ix[] = {
       11, /* gv */
       12, /* gelem */
       13, /* padsv */
-      16, /* padav */
-      21, /* padhv */
+      16, /* padsv_store */
+      19, /* padav */
+      24, /* padhv */
       -1, /* padany */
-      28, /* rv2gv */
-      35, /* rv2sv */
-      40, /* av2arylen */
-      42, /* rv2cv */
+      31, /* rv2gv */
+      38, /* rv2sv */
+      43, /* av2arylen */
+      45, /* rv2cv */
       -1, /* anoncode */
        0, /* prototype */
        0, /* refgen */
        0, /* srefgen */
-      49, /* ref */
-      52, /* bless */
-      53, /* backtick */
-      52, /* glob */
+      52, /* ref */
+      55, /* bless */
+      56, /* backtick */
+      55, /* glob */
        0, /* readline */
       -1, /* rcatline */
        0, /* regcmaybe */
@@ -2552,20 +2587,20 @@ EXTCONST I16  PL_op_private_bitdef_ix[] = {
        0, /* regcomp */
       -1, /* match */
       -1, /* qr */
-      58, /* subst */
+      61, /* subst */
        0, /* substcont */
-      59, /* trans */
-      59, /* transr */
-      66, /* sassign */
-      69, /* aassign */
+      62, /* trans */
+      62, /* transr */
+      69, /* sassign */
+      72, /* aassign */
        0, /* chop */
        0, /* schop */
-      75, /* chomp */
-      75, /* schomp */
+      78, /* chomp */
+      78, /* schomp */
        0, /* defined */
-       0, /* undef */
+      80, /* undef */
        0, /* study */
-      77, /* pos */
+      85, /* pos */
        0, /* preinc */
        0, /* i_preinc */
        0, /* predec */
@@ -2574,23 +2609,23 @@ EXTCONST I16  PL_op_private_bitdef_ix[] = {
        0, /* i_postinc */
        0, /* postdec */
        0, /* i_postdec */
-      80, /* pow */
-      80, /* multiply */
-      80, /* i_multiply */
-      80, /* divide */
-      80, /* i_divide */
-      80, /* modulo */
-      80, /* i_modulo */
-      82, /* repeat */
-      80, /* add */
-      80, /* i_add */
-      80, /* subtract */
-      80, /* i_subtract */
-      84, /* concat */
-      87, /* multiconcat */
-      93, /* stringify */
-      95, /* left_shift */
-      95, /* right_shift */
+      88, /* pow */
+      88, /* multiply */
+      88, /* i_multiply */
+      88, /* divide */
+      88, /* i_divide */
+      88, /* modulo */
+      88, /* i_modulo */
+      90, /* repeat */
+      88, /* add */
+      88, /* i_add */
+      88, /* subtract */
+      88, /* i_subtract */
+      92, /* concat */
+      95, /* multiconcat */
+     101, /* stringify */
+     103, /* left_shift */
+     103, /* right_shift */
       12, /* lt */
       12, /* i_lt */
       12, /* gt */
@@ -2612,126 +2647,128 @@ EXTCONST I16  PL_op_private_bitdef_ix[] = {
       12, /* seq */
       12, /* sne */
       12, /* scmp */
-      97, /* bit_and */
-      97, /* bit_xor */
-      97, /* bit_or */
-      95, /* nbit_and */
-      95, /* nbit_xor */
-      95, /* nbit_or */
-      97, /* sbit_and */
-      97, /* sbit_xor */
-      97, /* sbit_or */
+     105, /* bit_and */
+     105, /* bit_xor */
+     105, /* bit_or */
+     103, /* nbit_and */
+     103, /* nbit_xor */
+     103, /* nbit_or */
+     105, /* sbit_and */
+     105, /* sbit_xor */
+     105, /* sbit_or */
        0, /* negate */
        0, /* i_negate */
        0, /* not */
-      97, /* complement */
-      95, /* ncomplement */
-      75, /* scomplement */
+     105, /* complement */
+     103, /* ncomplement */
+      78, /* scomplement */
       12, /* smartmatch */
-      93, /* atan2 */
-      75, /* sin */
-      75, /* cos */
-      93, /* rand */
-      93, /* srand */
-      75, /* exp */
-      75, /* log */
-      75, /* sqrt */
-      75, /* int */
-      75, /* hex */
-      75, /* oct */
-      75, /* abs */
-      98, /* length */
-     101, /* substr */
-     104, /* vec */
-     106, /* index */
-     106, /* rindex */
-      52, /* sprintf */
-      52, /* formline */
-      75, /* ord */
-      75, /* chr */
-      93, /* crypt */
+     101, /* atan2 */
+      78, /* sin */
+      78, /* cos */
+     101, /* rand */
+     101, /* srand */
+      78, /* exp */
+      78, /* log */
+      78, /* sqrt */
+      78, /* int */
+      78, /* hex */
+      78, /* oct */
+      78, /* abs */
+     106, /* length */
+     109, /* substr */
+     112, /* vec */
+     114, /* index */
+     114, /* rindex */
+      55, /* sprintf */
+      55, /* formline */
+      78, /* ord */
+      78, /* chr */
+     101, /* crypt */
        0, /* ucfirst */
        0, /* lcfirst */
        0, /* uc */
        0, /* lc */
        0, /* quotemeta */
-     110, /* rv2av */
-     117, /* aelemfast */
-     117, /* aelemfast_lex */
-     118, /* aelem */
-     123, /* aslice */
-     126, /* kvaslice */
+     118, /* rv2av */
+     125, /* aelemfast */
+     125, /* aelemfast_lex */
+     125, /* aelemfastlex_store */
+     126, /* aelem */
+     131, /* aslice */
+     134, /* kvaslice */
        0, /* aeach */
        0, /* avalues */
-      40, /* akeys */
+      43, /* akeys */
        0, /* each */
-      40, /* values */
-      40, /* keys */
-     127, /* delete */
-     131, /* exists */
-     133, /* rv2hv */
-     118, /* helem */
-     123, /* hslice */
-     126, /* kvhslice */
-     141, /* multideref */
-      52, /* unpack */
-      52, /* pack */
-     148, /* split */
-      52, /* join */
-     153, /* list */
+      43, /* values */
+      43, /* keys */
+     135, /* delete */
+     139, /* exists */
+     141, /* rv2hv */
+     126, /* helem */
+     131, /* hslice */
+     134, /* kvhslice */
+     149, /* multideref */
+      55, /* unpack */
+      55, /* pack */
+     156, /* split */
+      55, /* join */
+     161, /* list */
       12, /* lslice */
-      52, /* anonlist */
-      52, /* anonhash */
-      52, /* splice */
-      93, /* push */
+      55, /* anonlist */
+      55, /* anonhash */
+     163, /* emptyavhv */
+      55, /* splice */
+     101, /* push */
        0, /* pop */
        0, /* shift */
-      93, /* unshift */
-     155, /* sort */
-     160, /* reverse */
+     101, /* unshift */
+     168, /* sort */
+     173, /* reverse */
        0, /* grepstart */
-     162, /* grepwhile */
+     175, /* grepwhile */
        0, /* mapstart */
        0, /* mapwhile */
        0, /* range */
-     164, /* flip */
-     164, /* flop */
+     177, /* flip */
+     177, /* flop */
        0, /* and */
        0, /* or */
       12, /* xor */
        0, /* dor */
-     166, /* cond_expr */
+     179, /* cond_expr */
        0, /* andassign */
        0, /* orassign */
        0, /* dorassign */
-     168, /* entersub */
-     175, /* leavesub */
-     175, /* leavesublv */
+     181, /* entersub */
+     188, /* leavesub */
+     188, /* leavesublv */
        0, /* argcheck */
-     177, /* argelem */
-       0, /* argdefelem */
-     179, /* caller */
-      52, /* warn */
-      52, /* die */
-      52, /* reset */
+     190, /* argelem */
+     192, /* argdefelem */
+     195, /* caller */
+      55, /* warn */
+      55, /* die */
+      55, /* reset */
       -1, /* lineseq */
-     181, /* nextstate */
-     181, /* dbstate */
+     197, /* nextstate */
+     197, /* dbstate */
       -1, /* unstack */
       -1, /* enter */
-     182, /* leave */
+     198, /* leave */
       -1, /* scope */
-     184, /* enteriter */
-     188, /* iter */
+     200, /* enteriter */
+     204, /* iter */
       -1, /* enterloop */
-     189, /* leaveloop */
+     205, /* leaveloop */
       -1, /* return */
-     191, /* last */
-     191, /* next */
-     191, /* redo */
-     191, /* dump */
-     191, /* goto */
-      52, /* exit */
+     207, /* last */
+     207, /* next */
+     207, /* redo */
+     207, /* dump */
+     207, /* goto */
+      55, /* exit */
        0, /* method */
        0, /* method_named */
        0, /* method_super */
@@ -2743,143 +2780,143 @@ EXTCONST I16  PL_op_private_bitdef_ix[] = {
        0, /* leavewhen */
       -1, /* break */
       -1, /* continue */
-     193, /* open */
-      52, /* close */
-      52, /* pipe_op */
-      52, /* fileno */
-      52, /* umask */
-      52, /* binmode */
-      52, /* tie */
+     209, /* open */
+      55, /* close */
+      55, /* pipe_op */
+      55, /* fileno */
+      55, /* umask */
+      55, /* binmode */
+      55, /* tie */
        0, /* untie */
        0, /* tied */
-      52, /* dbmopen */
+      55, /* dbmopen */
        0, /* dbmclose */
-      52, /* sselect */
-      52, /* select */
-      52, /* getc */
-      52, /* read */
-      52, /* enterwrite */
-     175, /* leavewrite */
+      55, /* sselect */
+      55, /* select */
+      55, /* getc */
+      55, /* read */
+      55, /* enterwrite */
+     188, /* leavewrite */
       -1, /* prtf */
       -1, /* print */
       -1, /* say */
-      52, /* sysopen */
-      52, /* sysseek */
-      52, /* sysread */
-      52, /* syswrite */
-      52, /* eof */
-      52, /* tell */
-      52, /* seek */
-      52, /* truncate */
-      52, /* fcntl */
-      52, /* ioctl */
-      93, /* flock */
-      52, /* send */
-      52, /* recv */
-      52, /* socket */
-      52, /* sockpair */
-      52, /* bind */
-      52, /* connect */
-      52, /* listen */
-      52, /* accept */
-      52, /* shutdown */
-      52, /* gsockopt */
-      52, /* ssockopt */
+      55, /* sysopen */
+      55, /* sysseek */
+      55, /* sysread */
+      55, /* syswrite */
+      55, /* eof */
+      55, /* tell */
+      55, /* seek */
+      55, /* truncate */
+      55, /* fcntl */
+      55, /* ioctl */
+     101, /* flock */
+      55, /* send */
+      55, /* recv */
+      55, /* socket */
+      55, /* sockpair */
+      55, /* bind */
+      55, /* connect */
+      55, /* listen */
+      55, /* accept */
+      55, /* shutdown */
+      55, /* gsockopt */
+      55, /* ssockopt */
        0, /* getsockname */
        0, /* getpeername */
        0, /* lstat */
        0, /* stat */
-     198, /* ftrread */
-     198, /* ftrwrite */
-     198, /* ftrexec */
-     198, /* fteread */
-     198, /* ftewrite */
-     198, /* fteexec */
-     203, /* ftis */
-     203, /* ftsize */
-     203, /* ftmtime */
-     203, /* ftatime */
-     203, /* ftctime */
-     203, /* ftrowned */
-     203, /* fteowned */
-     203, /* ftzero */
-     203, /* ftsock */
-     203, /* ftchr */
-     203, /* ftblk */
-     203, /* ftfile */
-     203, /* ftdir */
-     203, /* ftpipe */
-     203, /* ftsuid */
-     203, /* ftsgid */
-     203, /* ftsvtx */
-     203, /* ftlink */
-     203, /* fttty */
-     203, /* fttext */
-     203, /* ftbinary */
-      93, /* chdir */
-      93, /* chown */
-      75, /* chroot */
-      93, /* unlink */
-      93, /* chmod */
-      93, /* utime */
-      93, /* rename */
-      93, /* link */
-      93, /* symlink */
+     214, /* ftrread */
+     214, /* ftrwrite */
+     214, /* ftrexec */
+     214, /* fteread */
+     214, /* ftewrite */
+     214, /* fteexec */
+     219, /* ftis */
+     219, /* ftsize */
+     219, /* ftmtime */
+     219, /* ftatime */
+     219, /* ftctime */
+     219, /* ftrowned */
+     219, /* fteowned */
+     219, /* ftzero */
+     219, /* ftsock */
+     219, /* ftchr */
+     219, /* ftblk */
+     219, /* ftfile */
+     219, /* ftdir */
+     219, /* ftpipe */
+     219, /* ftsuid */
+     219, /* ftsgid */
+     219, /* ftsvtx */
+     219, /* ftlink */
+     219, /* fttty */
+     219, /* fttext */
+     219, /* ftbinary */
+     101, /* chdir */
+     101, /* chown */
+      78, /* chroot */
+     101, /* unlink */
+     101, /* chmod */
+     101, /* utime */
+     101, /* rename */
+     101, /* link */
+     101, /* symlink */
        0, /* readlink */
-      93, /* mkdir */
-      75, /* rmdir */
-      52, /* open_dir */
+     101, /* mkdir */
+      78, /* rmdir */
+      55, /* open_dir */
        0, /* readdir */
        0, /* telldir */
-      52, /* seekdir */
+      55, /* seekdir */
        0, /* rewinddir */
        0, /* closedir */
       -1, /* fork */
-     207, /* wait */
-      93, /* waitpid */
-      93, /* system */
-      93, /* exec */
-      93, /* kill */
-     207, /* getppid */
-      93, /* getpgrp */
-      93, /* setpgrp */
-      93, /* getpriority */
-      93, /* setpriority */
-     207, /* time */
+     223, /* wait */
+     101, /* waitpid */
+     101, /* system */
+     101, /* exec */
+     101, /* kill */
+     223, /* getppid */
+     101, /* getpgrp */
+     101, /* setpgrp */
+     101, /* getpriority */
+     101, /* setpriority */
+     223, /* time */
       -1, /* tms */
        0, /* localtime */
-      52, /* gmtime */
+      55, /* gmtime */
        0, /* alarm */
-      93, /* sleep */
-      52, /* shmget */
-      52, /* shmctl */
-      52, /* shmread */
-      52, /* shmwrite */
-      52, /* msgget */
-      52, /* msgctl */
-      52, /* msgsnd */
-      52, /* msgrcv */
-      52, /* semop */
-      52, /* semget */
-      52, /* semctl */
+     101, /* sleep */
+      55, /* shmget */
+      55, /* shmctl */
+      55, /* shmread */
+      55, /* shmwrite */
+      55, /* msgget */
+      55, /* msgctl */
+      55, /* msgsnd */
+      55, /* msgrcv */
+      55, /* semop */
+      55, /* semget */
+      55, /* semctl */
        0, /* require */
        0, /* dofile */
       -1, /* hintseval */
-     208, /* entereval */
-     175, /* leaveeval */
+     224, /* entereval */
+     188, /* leaveeval */
        0, /* entertry */
       -1, /* leavetry */
        0, /* ghbyname */
-      52, /* ghbyaddr */
+      55, /* ghbyaddr */
       -1, /* ghostent */
        0, /* gnbyname */
-      52, /* gnbyaddr */
+      55, /* gnbyaddr */
       -1, /* gnetent */
        0, /* gpbyname */
-      52, /* gpbynumber */
+      55, /* gpbynumber */
       -1, /* gprotoent */
-      52, /* gsbyname */
-      52, /* gsbyport */
+      55, /* gsbyname */
+      55, /* gsbyport */
       -1, /* gservent */
        0, /* shostent */
        0, /* snetent */
@@ -2900,22 +2937,22 @@ EXTCONST I16  PL_op_private_bitdef_ix[] = {
       -1, /* sgrent */
       -1, /* egrent */
       -1, /* getlogin */
-      52, /* syscall */
+      55, /* syscall */
        0, /* lock */
        0, /* once */
       -1, /* custom */
-     214, /* coreargs */
-     218, /* avhvswitch */
+     231, /* coreargs */
+     235, /* avhvswitch */
        3, /* runcv */
        0, /* fc */
       -1, /* padcv */
       -1, /* introcv */
       -1, /* clonecv */
-     220, /* padrange */
-     222, /* refassign */
-     228, /* lvref */
-     234, /* lvrefslice */
-     235, /* lvavref */
+     237, /* padrange */
+     239, /* refassign */
+     245, /* lvref */
+     251, /* lvrefslice */
+      16, /* lvavref */
        0, /* anonconst */
       12, /* isa */
        0, /* cmpchain_and */
@@ -2924,16 +2961,20 @@ EXTCONST I16  PL_op_private_bitdef_ix[] = {
       -1, /* leavetrycatch */
       -1, /* poptry */
        0, /* catch */
-     238, /* pushdefer */
-      75, /* is_bool */
-      75, /* is_weak */
+     252, /* pushdefer */
+       0, /* is_bool */
+       0, /* is_weak */
        0, /* weaken */
        0, /* unweaken */
-      49, /* blessed */
-      75, /* refaddr */
-      75, /* reftype */
-      75, /* ceil */
-      75, /* floor */
+      52, /* blessed */
+      78, /* refaddr */
+      78, /* reftype */
+      78, /* ceil */
+      78, /* floor */
+       0, /* is_tainted */
+     254, /* helemexistsor */
+     256, /* methstart */
+     258, /* initfield */
 
 };
 
@@ -2952,79 +2993,85 @@ EXTCONST I16  PL_op_private_bitdef_ix[] = {
  */
 
 EXTCONST U16  PL_op_private_bitdefs[] = {
-    0x0003, /* scalar, prototype, refgen, srefgen, readline, regcmaybe, regcreset, regcomp, substcont, chop, schop, defined, undef, study, preinc, i_preinc, predec, i_predec, postinc, i_postinc, postdec, i_postdec, negate, i_negate, not, ucfirst, lcfirst, uc, lc, quotemeta, aeach, avalues, each, pop, shift, grepstart, mapstart, mapwhile, range, and, or, dor, andassign, orassign, dorassign, argcheck, argdefelem, method, method_named, method_super, method_redir, method_redir_super, entergiven, leavegiven, enterwhen, leavewhen, untie, tied, dbmclose, getsockname, getpeername, lstat, stat, readlink, readdir, telldir, rewinddir, closedir, localtime, alarm, require, dofile, entertry, ghbyname, gnbyname, gpbyname, shostent, snetent, sprotoent, sservent, gpwnam, gpwuid, ggrnam, ggrgid, lock, once, fc, anonconst, cmpchain_and, cmpchain_dup, entertrycatch, catch, weaken, unweaken */
-    0x30dc, 0x41d9, /* pushmark */
+    0x0003, /* scalar, prototype, refgen, srefgen, readline, regcmaybe, regcreset, regcomp, substcont, chop, schop, defined, study, preinc, i_preinc, predec, i_predec, postinc, i_postinc, postdec, i_postdec, negate, i_negate, not, ucfirst, lcfirst, uc, lc, quotemeta, aeach, avalues, each, pop, shift, grepstart, mapstart, mapwhile, range, and, or, dor, andassign, orassign, dorassign, argcheck, method, method_named, method_super, method_redir, method_redir_super, entergiven, leavegiven, enterwhen, leavewhen, untie, tied, dbmclose, getsockname, getpeername, lstat, stat, readlink, readdir, telldir, rewinddir, closedir, localtime, alarm, require, dofile, entertry, ghbyname, gnbyname, gpbyname, shostent, snetent, sprotoent, sservent, gpwnam, gpwuid, ggrnam, ggrgid, lock, once, fc, anonconst, cmpchain_and, cmpchain_dup, entertrycatch, catch, is_bool, is_weak, weaken, unweaken, is_tainted */
+    0x3abc, 0x4bb9, /* pushmark */
     0x00bd, /* wantarray, runcv */
-    0x0438, 0x1a50, 0x428c, 0x3e28, 0x3605, /* const */
-    0x30dc, 0x3759, /* gvsv */
-    0x18b5, /* gv */
+    0x0558, 0x1b70, 0x4c6c, 0x4808, 0x3fe5, /* const */
+    0x3abc, 0x4139, /* gvsv */
+    0x19d5, /* gv */
     0x0067, /* gelem, lt, i_lt, gt, i_gt, le, i_le, ge, i_ge, eq, i_eq, ne, i_ne, ncmp, i_ncmp, slt, sgt, sle, sge, seq, sne, scmp, smartmatch, lslice, xor, isa */
-    0x30dc, 0x41d8, 0x03d7, /* padsv */
-    0x30dc, 0x41d8, 0x05b4, 0x31cc, 0x3fa9, /* padav */
-    0x30dc, 0x41d8, 0x05b4, 0x0650, 0x31cc, 0x3fa8, 0x2c41, /* padhv */
-    0x30dc, 0x1c38, 0x03d6, 0x31cc, 0x3528, 0x4284, 0x0003, /* rv2gv */
-    0x30dc, 0x3758, 0x03d6, 0x4284, 0x0003, /* rv2sv */
-    0x31cc, 0x0003, /* av2arylen, akeys, values, keys */
-    0x349c, 0x1078, 0x0dd4, 0x014c, 0x4588, 0x4284, 0x0003, /* rv2cv */
-    0x05b4, 0x0650, 0x0003, /* ref, blessed */
+    0x3abc, 0x4bb8, 0x03d7, /* padsv */
+    0x3abc, 0x4bb8, 0x0003, /* padsv_store, lvavref */
+    0x3abc, 0x4bb8, 0x06d4, 0x3bac, 0x4989, /* padav */
+    0x3abc, 0x4bb8, 0x06d4, 0x0770, 0x3bac, 0x4988, 0x3621, /* padhv */
+    0x3abc, 0x1e38, 0x03d6, 0x3bac, 0x3f08, 0x4c64, 0x0003, /* rv2gv */
+    0x3abc, 0x4138, 0x03d6, 0x4c64, 0x0003, /* rv2sv */
+    0x3bac, 0x0003, /* av2arylen, akeys, values, keys */
+    0x3e7c, 0x1198, 0x0ef4, 0x014c, 0x4f68, 0x4c64, 0x0003, /* rv2cv */
+    0x06d4, 0x0770, 0x0003, /* ref, blessed */
     0x018f, /* bless, glob, sprintf, formline, unpack, pack, join, anonlist, anonhash, splice, warn, die, reset, exit, close, pipe_op, fileno, umask, binmode, tie, dbmopen, sselect, select, getc, read, enterwrite, sysopen, sysseek, sysread, syswrite, eof, tell, seek, truncate, fcntl, ioctl, send, recv, socket, sockpair, bind, connect, listen, accept, shutdown, gsockopt, ssockopt, open_dir, seekdir, gmtime, shmget, shmctl, shmread, shmwrite, msgget, msgctl, msgsnd, msgrcv, semop, semget, semctl, ghbyaddr, gnbyaddr, gpbynumber, gsbyname, gsbyport, syscall */
-    0x393c, 0x3858, 0x2994, 0x28d0, 0x0003, /* backtick */
-    0x05b5, /* subst */
-    0x117c, 0x22b8, 0x09b4, 0x40ec, 0x2648, 0x4864, 0x07c1, /* trans, transr */
-    0x0fbc, 0x04d8, 0x0067, /* sassign */
-    0x0c78, 0x0b74, 0x0a70, 0x31cc, 0x05a8, 0x0067, /* aassign */
-    0x4630, 0x0003, /* chomp, schomp, scomplement, sin, cos, exp, log, sqrt, int, hex, oct, abs, ord, chr, chroot, rmdir, is_bool, is_weak, refaddr, reftype, ceil, floor */
-    0x05b4, 0x31cc, 0x0003, /* pos */
-    0x4630, 0x0067, /* pow, multiply, i_multiply, divide, i_divide, modulo, i_modulo, add, i_add, subtract, i_subtract */
-    0x1538, 0x0067, /* repeat */
-    0x33b8, 0x4630, 0x0067, /* concat */
-    0x30dc, 0x0218, 0x1c34, 0x4630, 0x436c, 0x0003, /* multiconcat */
-    0x4630, 0x018f, /* stringify, atan2, rand, srand, crypt, push, unshift, flock, chdir, chown, unlink, chmod, utime, rename, link, symlink, mkdir, waitpid, system, exec, kill, getpgrp, setpgrp, getpriority, setpriority, sleep */
-    0x4630, 0x4789, /* left_shift, right_shift, nbit_and, nbit_xor, nbit_or, ncomplement */
-    0x4789, /* bit_and, bit_xor, bit_or, sbit_and, sbit_xor, sbit_or, complement */
-    0x05b4, 0x4630, 0x0003, /* length */
-    0x3b90, 0x31cc, 0x012b, /* substr */
-    0x31cc, 0x0067, /* vec */
-    0x3338, 0x05b4, 0x4630, 0x018f, /* index, rindex */
-    0x30dc, 0x3758, 0x05b4, 0x31cc, 0x3fa8, 0x4284, 0x0003, /* rv2av */
-    0x025f, /* aelemfast, aelemfast_lex */
-    0x30dc, 0x2fd8, 0x03d6, 0x31cc, 0x0067, /* aelem, helem */
-    0x30dc, 0x31cc, 0x3fa9, /* aslice, hslice */
-    0x31cd, /* kvaslice, kvhslice */
-    0x30dc, 0x3ef8, 0x2cf4, 0x0003, /* delete */
-    0x44b8, 0x0003, /* exists */
-    0x30dc, 0x3758, 0x05b4, 0x0650, 0x31cc, 0x3fa8, 0x4284, 0x2c41, /* rv2hv */
-    0x30dc, 0x2fd8, 0x11f4, 0x1b50, 0x31cc, 0x4284, 0x0003, /* multideref */
-    0x30dc, 0x3758, 0x02f0, 0x2dec, 0x2709, /* split */
-    0x30dc, 0x2379, /* list */
-    0x1490, 0x2a2c, 0x3c88, 0x2b24, 0x36c1, /* sort */
-    0x2a2c, 0x0003, /* reverse */
-    0x05b4, 0x0003, /* grepwhile */
-    0x2e78, 0x0003, /* flip, flop */
-    0x30dc, 0x0003, /* cond_expr */
-    0x30dc, 0x1078, 0x03d6, 0x014c, 0x4588, 0x4284, 0x27e1, /* entersub */
-    0x39f8, 0x0003, /* leavesub, leavesublv, leavewrite, leaveeval */
+    0x431c, 0x4238, 0x2dd4, 0x2d10, 0x0003, /* backtick */
+    0x06d5, /* subst */
+    0x129c, 0x24b8, 0x0ad4, 0x4acc, 0x2848, 0x5244, 0x08e1, /* trans, transr */
+    0x10dc, 0x05f8, 0x0067, /* sassign */
+    0x0d98, 0x0c94, 0x0b90, 0x3bac, 0x06c8, 0x0067, /* aassign */
+    0x5010, 0x0003, /* chomp, schomp, scomplement, sin, cos, exp, log, sqrt, int, hex, oct, abs, ord, chr, chroot, rmdir, refaddr, reftype, ceil, floor */
+    0x3abc, 0x4bb8, 0x3534, 0x5010, 0x0003, /* undef */
+    0x06d4, 0x3bac, 0x0003, /* pos */
+    0x5010, 0x0067, /* pow, multiply, i_multiply, divide, i_divide, modulo, i_modulo, add, i_add, subtract, i_subtract */
+    0x1658, 0x0067, /* repeat */
+    0x3d98, 0x5010, 0x0067, /* concat */
+    0x3abc, 0x0338, 0x1e34, 0x5010, 0x4d4c, 0x0003, /* multiconcat */
+    0x5010, 0x018f, /* stringify, atan2, rand, srand, crypt, push, unshift, flock, chdir, chown, unlink, chmod, utime, rename, link, symlink, mkdir, waitpid, system, exec, kill, getpgrp, setpgrp, getpriority, setpriority, sleep */
+    0x5010, 0x5169, /* left_shift, right_shift, nbit_and, nbit_xor, nbit_or, ncomplement */
+    0x5169, /* bit_and, bit_xor, bit_or, sbit_and, sbit_xor, sbit_or, complement */
+    0x06d4, 0x5010, 0x0003, /* length */
+    0x4570, 0x3bac, 0x012b, /* substr */
+    0x3bac, 0x0067, /* vec */
+    0x3d18, 0x06d4, 0x5010, 0x018f, /* index, rindex */
+    0x3abc, 0x4138, 0x06d4, 0x3bac, 0x4988, 0x4c64, 0x0003, /* rv2av */
+    0x025f, /* aelemfast, aelemfast_lex, aelemfastlex_store */
+    0x3abc, 0x39b8, 0x03d6, 0x3bac, 0x0067, /* aelem, helem */
+    0x3abc, 0x3bac, 0x4989, /* aslice, hslice */
+    0x3bad, /* kvaslice, kvhslice */
+    0x3abc, 0x48d8, 0x36d4, 0x0003, /* delete */
+    0x4e98, 0x0003, /* exists */
+    0x3abc, 0x4138, 0x06d4, 0x0770, 0x3bac, 0x4988, 0x4c64, 0x3621, /* rv2hv */
+    0x3abc, 0x39b8, 0x1314, 0x1d50, 0x3bac, 0x4c64, 0x0003, /* multideref */
+    0x3abc, 0x4138, 0x0410, 0x37cc, 0x2b49, /* split */
+    0x3abc, 0x2579, /* list */
+    0x3abc, 0x4bb8, 0x0214, 0x5010, 0x018f, /* emptyavhv */
+    0x15b0, 0x330c, 0x4668, 0x3404, 0x40a1, /* sort */
+    0x330c, 0x0003, /* reverse */
+    0x06d4, 0x0003, /* grepwhile */
+    0x3858, 0x0003, /* flip, flop */
+    0x3abc, 0x0003, /* cond_expr */
+    0x3abc, 0x1198, 0x03d6, 0x014c, 0x4f68, 0x4c64, 0x2c21, /* entersub */
+    0x43d8, 0x0003, /* leavesub, leavesublv, leavewrite, leaveeval */
     0x02aa, 0x0003, /* argelem */
+    0x2a3c, 0x2918, 0x0003, /* argdefelem */
     0x00bc, 0x018f, /* caller */
-    0x2555, /* nextstate, dbstate */
-    0x2f7c, 0x39f9, /* leave */
-    0x30dc, 0x3758, 0x10ec, 0x3d05, /* enteriter */
-    0x3d05, /* iter */
-    0x2f7c, 0x0067, /* leaveloop */
-    0x499c, 0x0003, /* last, next, redo, dump, goto */
-    0x393c, 0x3858, 0x2994, 0x28d0, 0x018f, /* open */
-    0x1ef0, 0x214c, 0x2008, 0x1dc4, 0x0003, /* ftrread, ftrwrite, ftrexec, fteread, ftewrite, fteexec */
-    0x1ef0, 0x214c, 0x2008, 0x0003, /* ftis, ftsize, ftmtime, ftatime, ftctime, ftrowned, fteowned, ftzero, ftsock, ftchr, ftblk, ftfile, ftdir, ftpipe, ftsuid, ftsgid, ftsvtx, ftlink, fttty, fttext, ftbinary */
-    0x4631, /* wait, getppid, time */
-    0x3a94, 0x0e90, 0x070c, 0x4708, 0x2464, 0x0003, /* entereval */
-    0x329c, 0x0018, 0x13a4, 0x12c1, /* coreargs */
-    0x31cc, 0x00c7, /* avhvswitch */
-    0x30dc, 0x01fb, /* padrange */
-    0x30dc, 0x41d8, 0x04f6, 0x2bac, 0x19a8, 0x0067, /* refassign */
-    0x30dc, 0x41d8, 0x04f6, 0x2bac, 0x19a8, 0x0003, /* lvref */
-    0x30dd, /* lvrefslice */
-    0x30dc, 0x41d8, 0x0003, /* lvavref */
-    0x1cdc, 0x0003, /* pushdefer */
+    0x2755, /* nextstate, dbstate */
+    0x395c, 0x43d9, /* leave */
+    0x3abc, 0x4138, 0x120c, 0x46e5, /* enteriter */
+    0x46e5, /* iter */
+    0x395c, 0x0067, /* leaveloop */
+    0x537c, 0x0003, /* last, next, redo, dump, goto */
+    0x431c, 0x4238, 0x2dd4, 0x2d10, 0x018f, /* open */
+    0x20f0, 0x234c, 0x2208, 0x1fc4, 0x0003, /* ftrread, ftrwrite, ftrexec, fteread, ftewrite, fteexec */
+    0x20f0, 0x234c, 0x2208, 0x0003, /* ftis, ftsize, ftmtime, ftatime, ftctime, ftrowned, fteowned, ftzero, ftsock, ftchr, ftblk, ftfile, ftdir, ftpipe, ftsuid, ftsgid, ftsvtx, ftlink, fttty, fttext, ftbinary */
+    0x5011, /* wait, getppid, time */
+    0x1c78, 0x4474, 0x0fb0, 0x082c, 0x50e8, 0x2664, 0x0003, /* entereval */
+    0x3c7c, 0x0018, 0x14c4, 0x13e1, /* coreargs */
+    0x3bac, 0x00c7, /* avhvswitch */
+    0x3abc, 0x01fb, /* padrange */
+    0x3abc, 0x4bb8, 0x04f6, 0x348c, 0x1ac8, 0x0067, /* refassign */
+    0x3abc, 0x4bb8, 0x04f6, 0x348c, 0x1ac8, 0x0003, /* lvref */
+    0x3abd, /* lvrefslice */
+    0x1edc, 0x0003, /* pushdefer */
+    0x131c, 0x0003, /* helemexistsor */
+    0x2e7c, 0x0003, /* methstart */
+    0x3168, 0x2fc4, 0x0003, /* initfield */
 
 };
 
@@ -3043,6 +3090,7 @@ EXTCONST U8 PL_op_private_valid[] = {
     /* GV         */ (OPpEARLY_CV),
     /* GELEM      */ (OPpARG2_MASK),
     /* PADSV      */ (OPpDEREF|OPpPAD_STATE|OPpLVAL_INTRO),
+    /* PADSV_STORE */ (OPpARG1_MASK|OPpPAD_STATE|OPpLVAL_INTRO),
     /* PADAV      */ (OPpSLICEWARNING|OPpMAYBE_LVSUB|OPpTRUEBOOL|OPpPAD_STATE|OPpLVAL_INTRO),
     /* PADHV      */ (OPpPADHV_ISKEYS|OPpSLICEWARNING|OPpMAYBE_LVSUB|OPpMAYBE_TRUEBOOL|OPpTRUEBOOL|OPpPAD_STATE|OPpLVAL_INTRO),
     /* PADANY     */ (0),
@@ -3076,7 +3124,7 @@ EXTCONST U8 PL_op_private_valid[] = {
     /* CHOMP      */ (OPpARG1_MASK|OPpTARGET_MY),
     /* SCHOMP     */ (OPpARG1_MASK|OPpTARGET_MY),
     /* DEFINED    */ (OPpARG1_MASK),
-    /* UNDEF      */ (OPpARG1_MASK),
+    /* UNDEF      */ (OPpARG1_MASK|OPpTARGET_MY|OPpUNDEF_KEEP_PV|OPpPAD_STATE|OPpLVAL_INTRO),
     /* STUDY      */ (OPpARG1_MASK),
     /* POS        */ (OPpARG1_MASK|OPpMAYBE_LVSUB|OPpTRUEBOOL),
     /* PREINC     */ (OPpARG1_MASK),
@@ -3171,6 +3219,7 @@ EXTCONST U8 PL_op_private_valid[] = {
     /* RV2AV      */ (OPpARG1_MASK|OPpHINT_STRICT_REFS|OPpSLICEWARNING|OPpMAYBE_LVSUB|OPpTRUEBOOL|OPpOUR_INTRO|OPpLVAL_INTRO),
     /* AELEMFAST  */ (255),
     /* AELEMFAST_LEX */ (255),
+    /* AELEMFASTLEX_STORE */ (255),
     /* AELEM      */ (OPpARG2_MASK|OPpMAYBE_LVSUB|OPpDEREF|OPpLVAL_DEFER|OPpLVAL_INTRO),
     /* ASLICE     */ (OPpSLICEWARNING|OPpMAYBE_LVSUB|OPpLVAL_INTRO),
     /* KVASLICE   */ (OPpMAYBE_LVSUB),
@@ -3195,6 +3244,7 @@ EXTCONST U8 PL_op_private_valid[] = {
     /* LSLICE     */ (OPpARG2_MASK),
     /* ANONLIST   */ (OPpARG4_MASK),
     /* ANONHASH   */ (OPpARG4_MASK),
+    /* EMPTYAVHV  */ (OPpARG4_MASK|OPpTARGET_MY|OPpEMPTYAVHV_IS_HV|OPpPAD_STATE|OPpLVAL_INTRO),
     /* SPLICE     */ (OPpARG4_MASK),
     /* PUSH       */ (OPpARG4_MASK|OPpTARGET_MY),
     /* POP        */ (OPpARG1_MASK),
@@ -3222,7 +3272,7 @@ EXTCONST U8 PL_op_private_valid[] = {
     /* LEAVESUBLV */ (OPpARG1_MASK|OPpREFCOUNTED),
     /* ARGCHECK   */ (OPpARG1_MASK),
     /* ARGELEM    */ (OPpARG1_MASK|OPpARGELEM_MASK),
-    /* ARGDEFELEM */ (OPpARG1_MASK),
+    /* ARGDEFELEM */ (OPpARG1_MASK|OPpARG_IF_FALSE|OPpARG_IF_UNDEF),
     /* CALLER     */ (OPpARG4_MASK|OPpOFFBYONE),
     /* WARN       */ (OPpARG4_MASK),
     /* DIE        */ (OPpARG4_MASK),
@@ -3378,7 +3428,7 @@ EXTCONST U8 PL_op_private_valid[] = {
     /* REQUIRE    */ (OPpARG1_MASK),
     /* DOFILE     */ (OPpARG1_MASK),
     /* HINTSEVAL  */ (0),
-    /* ENTEREVAL  */ (OPpARG1_MASK|OPpEVAL_HAS_HH|OPpEVAL_UNICODE|OPpEVAL_BYTES|OPpEVAL_COPHH|OPpEVAL_RE_REPARSING),
+    /* ENTEREVAL  */ (OPpARG1_MASK|OPpEVAL_HAS_HH|OPpEVAL_UNICODE|OPpEVAL_BYTES|OPpEVAL_COPHH|OPpEVAL_RE_REPARSING|OPpEVAL_EVALSV),
     /* LEAVEEVAL  */ (OPpARG1_MASK|OPpREFCOUNTED),
     /* ENTERTRY   */ (OPpARG1_MASK),
     /* LEAVETRY   */ (0),
@@ -3438,8 +3488,8 @@ EXTCONST U8 PL_op_private_valid[] = {
     /* POPTRY     */ (0),
     /* CATCH      */ (OPpARG1_MASK),
     /* PUSHDEFER  */ (OPpARG1_MASK|OPpDEFER_FINALLY),
-    /* IS_BOOL    */ (OPpARG1_MASK|OPpTARGET_MY),
-    /* IS_WEAK    */ (OPpARG1_MASK|OPpTARGET_MY),
+    /* IS_BOOL    */ (OPpARG1_MASK),
+    /* IS_WEAK    */ (OPpARG1_MASK),
     /* WEAKEN     */ (OPpARG1_MASK),
     /* UNWEAKEN   */ (OPpARG1_MASK),
     /* BLESSED    */ (OPpARG1_MASK|OPpMAYBE_TRUEBOOL|OPpTRUEBOOL),
@@ -3447,6 +3497,10 @@ EXTCONST U8 PL_op_private_valid[] = {
     /* REFTYPE    */ (OPpARG1_MASK|OPpTARGET_MY),
     /* CEIL       */ (OPpARG1_MASK|OPpTARGET_MY),
     /* FLOOR      */ (OPpARG1_MASK|OPpTARGET_MY),
+    /* IS_TAINTED */ (OPpARG1_MASK),
+    /* HELEMEXISTSOR */ (OPpARG1_MASK|OPpHELEMEXISTSOR_DELETE),
+    /* METHSTART  */ (OPpARG1_MASK|OPpINITFIELDS),
+    /* INITFIELD  */ (OPpARG1_MASK|OPpINITFIELD_AV|OPpINITFIELD_HV),
 
 };
 
@@ -3456,4 +3510,4 @@ END_EXTERN_C
 
 
 
-/* ex: set ro: */
+/* ex: set ro ft=c: */
index 5bf8f49..71601b8 100644 (file)
@@ -1,4 +1,4 @@
-/* -*- buffer-read-only: t -*-
+/* -*- mode: C; buffer-read-only: t -*-
  *
  *    opnames.h
  *
@@ -24,414 +24,421 @@ typedef enum opcode {
        OP_GV            = 7,
        OP_GELEM         = 8,
        OP_PADSV         = 9,
-       OP_PADAV         = 10,
-       OP_PADHV         = 11,
-       OP_PADANY        = 12,
-       OP_RV2GV         = 13,
-       OP_RV2SV         = 14,
-       OP_AV2ARYLEN     = 15,
-       OP_RV2CV         = 16,
-       OP_ANONCODE      = 17,
-       OP_PROTOTYPE     = 18,
-       OP_REFGEN        = 19,
-       OP_SREFGEN       = 20,
-       OP_REF           = 21,
-       OP_BLESS         = 22,
-       OP_BACKTICK      = 23,
-       OP_GLOB          = 24,
-       OP_READLINE      = 25,
-       OP_RCATLINE      = 26,
-       OP_REGCMAYBE     = 27,
-       OP_REGCRESET     = 28,
-       OP_REGCOMP       = 29,
-       OP_MATCH         = 30,
-       OP_QR            = 31,
-       OP_SUBST         = 32,
-       OP_SUBSTCONT     = 33,
-       OP_TRANS         = 34,
-       OP_TRANSR        = 35,
-       OP_SASSIGN       = 36,
-       OP_AASSIGN       = 37,
-       OP_CHOP          = 38,
-       OP_SCHOP         = 39,
-       OP_CHOMP         = 40,
-       OP_SCHOMP        = 41,
-       OP_DEFINED       = 42,
-       OP_UNDEF         = 43,
-       OP_STUDY         = 44,
-       OP_POS           = 45,
-       OP_PREINC        = 46,
-       OP_I_PREINC      = 47,
-       OP_PREDEC        = 48,
-       OP_I_PREDEC      = 49,
-       OP_POSTINC       = 50,
-       OP_I_POSTINC     = 51,
-       OP_POSTDEC       = 52,
-       OP_I_POSTDEC     = 53,
-       OP_POW           = 54,
-       OP_MULTIPLY      = 55,
-       OP_I_MULTIPLY    = 56,
-       OP_DIVIDE        = 57,
-       OP_I_DIVIDE      = 58,
-       OP_MODULO        = 59,
-       OP_I_MODULO      = 60,
-       OP_REPEAT        = 61,
-       OP_ADD           = 62,
-       OP_I_ADD         = 63,
-       OP_SUBTRACT      = 64,
-       OP_I_SUBTRACT    = 65,
-       OP_CONCAT        = 66,
-       OP_MULTICONCAT   = 67,
-       OP_STRINGIFY     = 68,
-       OP_LEFT_SHIFT    = 69,
-       OP_RIGHT_SHIFT   = 70,
-       OP_LT            = 71,
-       OP_I_LT          = 72,
-       OP_GT            = 73,
-       OP_I_GT          = 74,
-       OP_LE            = 75,
-       OP_I_LE          = 76,
-       OP_GE            = 77,
-       OP_I_GE          = 78,
-       OP_EQ            = 79,
-       OP_I_EQ          = 80,
-       OP_NE            = 81,
-       OP_I_NE          = 82,
-       OP_NCMP          = 83,
-       OP_I_NCMP        = 84,
-       OP_SLT           = 85,
-       OP_SGT           = 86,
-       OP_SLE           = 87,
-       OP_SGE           = 88,
-       OP_SEQ           = 89,
-       OP_SNE           = 90,
-       OP_SCMP          = 91,
-       OP_BIT_AND       = 92,
-       OP_BIT_XOR       = 93,
-       OP_BIT_OR        = 94,
-       OP_NBIT_AND      = 95,
-       OP_NBIT_XOR      = 96,
-       OP_NBIT_OR       = 97,
-       OP_SBIT_AND      = 98,
-       OP_SBIT_XOR      = 99,
-       OP_SBIT_OR       = 100,
-       OP_NEGATE        = 101,
-       OP_I_NEGATE      = 102,
-       OP_NOT           = 103,
-       OP_COMPLEMENT    = 104,
-       OP_NCOMPLEMENT   = 105,
-       OP_SCOMPLEMENT   = 106,
-       OP_SMARTMATCH    = 107,
-       OP_ATAN2         = 108,
-       OP_SIN           = 109,
-       OP_COS           = 110,
-       OP_RAND          = 111,
-       OP_SRAND         = 112,
-       OP_EXP           = 113,
-       OP_LOG           = 114,
-       OP_SQRT          = 115,
-       OP_INT           = 116,
-       OP_HEX           = 117,
-       OP_OCT           = 118,
-       OP_ABS           = 119,
-       OP_LENGTH        = 120,
-       OP_SUBSTR        = 121,
-       OP_VEC           = 122,
-       OP_INDEX         = 123,
-       OP_RINDEX        = 124,
-       OP_SPRINTF       = 125,
-       OP_FORMLINE      = 126,
-       OP_ORD           = 127,
-       OP_CHR           = 128,
-       OP_CRYPT         = 129,
-       OP_UCFIRST       = 130,
-       OP_LCFIRST       = 131,
-       OP_UC            = 132,
-       OP_LC            = 133,
-       OP_QUOTEMETA     = 134,
-       OP_RV2AV         = 135,
-       OP_AELEMFAST     = 136,
-       OP_AELEMFAST_LEX = 137,
-       OP_AELEM         = 138,
-       OP_ASLICE        = 139,
-       OP_KVASLICE      = 140,
-       OP_AEACH         = 141,
-       OP_AVALUES       = 142,
-       OP_AKEYS         = 143,
-       OP_EACH          = 144,
-       OP_VALUES        = 145,
-       OP_KEYS          = 146,
-       OP_DELETE        = 147,
-       OP_EXISTS        = 148,
-       OP_RV2HV         = 149,
-       OP_HELEM         = 150,
-       OP_HSLICE        = 151,
-       OP_KVHSLICE      = 152,
-       OP_MULTIDEREF    = 153,
-       OP_UNPACK        = 154,
-       OP_PACK          = 155,
-       OP_SPLIT         = 156,
-       OP_JOIN          = 157,
-       OP_LIST          = 158,
-       OP_LSLICE        = 159,
-       OP_ANONLIST      = 160,
-       OP_ANONHASH      = 161,
-       OP_SPLICE        = 162,
-       OP_PUSH          = 163,
-       OP_POP           = 164,
-       OP_SHIFT         = 165,
-       OP_UNSHIFT       = 166,
-       OP_SORT          = 167,
-       OP_REVERSE       = 168,
-       OP_GREPSTART     = 169,
-       OP_GREPWHILE     = 170,
-       OP_MAPSTART      = 171,
-       OP_MAPWHILE      = 172,
-       OP_RANGE         = 173,
-       OP_FLIP          = 174,
-       OP_FLOP          = 175,
-       OP_AND           = 176,
-       OP_OR            = 177,
-       OP_XOR           = 178,
-       OP_DOR           = 179,
-       OP_COND_EXPR     = 180,
-       OP_ANDASSIGN     = 181,
-       OP_ORASSIGN      = 182,
-       OP_DORASSIGN     = 183,
-       OP_ENTERSUB      = 184,
-       OP_LEAVESUB      = 185,
-       OP_LEAVESUBLV    = 186,
-       OP_ARGCHECK      = 187,
-       OP_ARGELEM       = 188,
-       OP_ARGDEFELEM    = 189,
-       OP_CALLER        = 190,
-       OP_WARN          = 191,
-       OP_DIE           = 192,
-       OP_RESET         = 193,
-       OP_LINESEQ       = 194,
-       OP_NEXTSTATE     = 195,
-       OP_DBSTATE       = 196,
-       OP_UNSTACK       = 197,
-       OP_ENTER         = 198,
-       OP_LEAVE         = 199,
-       OP_SCOPE         = 200,
-       OP_ENTERITER     = 201,
-       OP_ITER          = 202,
-       OP_ENTERLOOP     = 203,
-       OP_LEAVELOOP     = 204,
-       OP_RETURN        = 205,
-       OP_LAST          = 206,
-       OP_NEXT          = 207,
-       OP_REDO          = 208,
-       OP_DUMP          = 209,
-       OP_GOTO          = 210,
-       OP_EXIT          = 211,
-       OP_METHOD        = 212,
-       OP_METHOD_NAMED  = 213,
-       OP_METHOD_SUPER  = 214,
-       OP_METHOD_REDIR  = 215,
-       OP_METHOD_REDIR_SUPER = 216,
-       OP_ENTERGIVEN    = 217,
-       OP_LEAVEGIVEN    = 218,
-       OP_ENTERWHEN     = 219,
-       OP_LEAVEWHEN     = 220,
-       OP_BREAK         = 221,
-       OP_CONTINUE      = 222,
-       OP_OPEN          = 223,
-       OP_CLOSE         = 224,
-       OP_PIPE_OP       = 225,
-       OP_FILENO        = 226,
-       OP_UMASK         = 227,
-       OP_BINMODE       = 228,
-       OP_TIE           = 229,
-       OP_UNTIE         = 230,
-       OP_TIED          = 231,
-       OP_DBMOPEN       = 232,
-       OP_DBMCLOSE      = 233,
-       OP_SSELECT       = 234,
-       OP_SELECT        = 235,
-       OP_GETC          = 236,
-       OP_READ          = 237,
-       OP_ENTERWRITE    = 238,
-       OP_LEAVEWRITE    = 239,
-       OP_PRTF          = 240,
-       OP_PRINT         = 241,
-       OP_SAY           = 242,
-       OP_SYSOPEN       = 243,
-       OP_SYSSEEK       = 244,
-       OP_SYSREAD       = 245,
-       OP_SYSWRITE      = 246,
-       OP_EOF           = 247,
-       OP_TELL          = 248,
-       OP_SEEK          = 249,
-       OP_TRUNCATE      = 250,
-       OP_FCNTL         = 251,
-       OP_IOCTL         = 252,
-       OP_FLOCK         = 253,
-       OP_SEND          = 254,
-       OP_RECV          = 255,
-       OP_SOCKET        = 256,
-       OP_SOCKPAIR      = 257,
-       OP_BIND          = 258,
-       OP_CONNECT       = 259,
-       OP_LISTEN        = 260,
-       OP_ACCEPT        = 261,
-       OP_SHUTDOWN      = 262,
-       OP_GSOCKOPT      = 263,
-       OP_SSOCKOPT      = 264,
-       OP_GETSOCKNAME   = 265,
-       OP_GETPEERNAME   = 266,
-       OP_LSTAT         = 267,
-       OP_STAT          = 268,
-       OP_FTRREAD       = 269,
-       OP_FTRWRITE      = 270,
-       OP_FTREXEC       = 271,
-       OP_FTEREAD       = 272,
-       OP_FTEWRITE      = 273,
-       OP_FTEEXEC       = 274,
-       OP_FTIS          = 275,
-       OP_FTSIZE        = 276,
-       OP_FTMTIME       = 277,
-       OP_FTATIME       = 278,
-       OP_FTCTIME       = 279,
-       OP_FTROWNED      = 280,
-       OP_FTEOWNED      = 281,
-       OP_FTZERO        = 282,
-       OP_FTSOCK        = 283,
-       OP_FTCHR         = 284,
-       OP_FTBLK         = 285,
-       OP_FTFILE        = 286,
-       OP_FTDIR         = 287,
-       OP_FTPIPE        = 288,
-       OP_FTSUID        = 289,
-       OP_FTSGID        = 290,
-       OP_FTSVTX        = 291,
-       OP_FTLINK        = 292,
-       OP_FTTTY         = 293,
-       OP_FTTEXT        = 294,
-       OP_FTBINARY      = 295,
-       OP_CHDIR         = 296,
-       OP_CHOWN         = 297,
-       OP_CHROOT        = 298,
-       OP_UNLINK        = 299,
-       OP_CHMOD         = 300,
-       OP_UTIME         = 301,
-       OP_RENAME        = 302,
-       OP_LINK          = 303,
-       OP_SYMLINK       = 304,
-       OP_READLINK      = 305,
-       OP_MKDIR         = 306,
-       OP_RMDIR         = 307,
-       OP_OPEN_DIR      = 308,
-       OP_READDIR       = 309,
-       OP_TELLDIR       = 310,
-       OP_SEEKDIR       = 311,
-       OP_REWINDDIR     = 312,
-       OP_CLOSEDIR      = 313,
-       OP_FORK          = 314,
-       OP_WAIT          = 315,
-       OP_WAITPID       = 316,
-       OP_SYSTEM        = 317,
-       OP_EXEC          = 318,
-       OP_KILL          = 319,
-       OP_GETPPID       = 320,
-       OP_GETPGRP       = 321,
-       OP_SETPGRP       = 322,
-       OP_GETPRIORITY   = 323,
-       OP_SETPRIORITY   = 324,
-       OP_TIME          = 325,
-       OP_TMS           = 326,
-       OP_LOCALTIME     = 327,
-       OP_GMTIME        = 328,
-       OP_ALARM         = 329,
-       OP_SLEEP         = 330,
-       OP_SHMGET        = 331,
-       OP_SHMCTL        = 332,
-       OP_SHMREAD       = 333,
-       OP_SHMWRITE      = 334,
-       OP_MSGGET        = 335,
-       OP_MSGCTL        = 336,
-       OP_MSGSND        = 337,
-       OP_MSGRCV        = 338,
-       OP_SEMOP         = 339,
-       OP_SEMGET        = 340,
-       OP_SEMCTL        = 341,
-       OP_REQUIRE       = 342,
-       OP_DOFILE        = 343,
-       OP_HINTSEVAL     = 344,
-       OP_ENTEREVAL     = 345,
-       OP_LEAVEEVAL     = 346,
-       OP_ENTERTRY      = 347,
-       OP_LEAVETRY      = 348,
-       OP_GHBYNAME      = 349,
-       OP_GHBYADDR      = 350,
-       OP_GHOSTENT      = 351,
-       OP_GNBYNAME      = 352,
-       OP_GNBYADDR      = 353,
-       OP_GNETENT       = 354,
-       OP_GPBYNAME      = 355,
-       OP_GPBYNUMBER    = 356,
-       OP_GPROTOENT     = 357,
-       OP_GSBYNAME      = 358,
-       OP_GSBYPORT      = 359,
-       OP_GSERVENT      = 360,
-       OP_SHOSTENT      = 361,
-       OP_SNETENT       = 362,
-       OP_SPROTOENT     = 363,
-       OP_SSERVENT      = 364,
-       OP_EHOSTENT      = 365,
-       OP_ENETENT       = 366,
-       OP_EPROTOENT     = 367,
-       OP_ESERVENT      = 368,
-       OP_GPWNAM        = 369,
-       OP_GPWUID        = 370,
-       OP_GPWENT        = 371,
-       OP_SPWENT        = 372,
-       OP_EPWENT        = 373,
-       OP_GGRNAM        = 374,
-       OP_GGRGID        = 375,
-       OP_GGRENT        = 376,
-       OP_SGRENT        = 377,
-       OP_EGRENT        = 378,
-       OP_GETLOGIN      = 379,
-       OP_SYSCALL       = 380,
-       OP_LOCK          = 381,
-       OP_ONCE          = 382,
-       OP_CUSTOM        = 383,
-       OP_COREARGS      = 384,
-       OP_AVHVSWITCH    = 385,
-       OP_RUNCV         = 386,
-       OP_FC            = 387,
-       OP_PADCV         = 388,
-       OP_INTROCV       = 389,
-       OP_CLONECV       = 390,
-       OP_PADRANGE      = 391,
-       OP_REFASSIGN     = 392,
-       OP_LVREF         = 393,
-       OP_LVREFSLICE    = 394,
-       OP_LVAVREF       = 395,
-       OP_ANONCONST     = 396,
-       OP_ISA           = 397,
-       OP_CMPCHAIN_AND  = 398,
-       OP_CMPCHAIN_DUP  = 399,
-       OP_ENTERTRYCATCH = 400,
-       OP_LEAVETRYCATCH = 401,
-       OP_POPTRY        = 402,
-       OP_CATCH         = 403,
-       OP_PUSHDEFER     = 404,
-       OP_IS_BOOL       = 405,
-       OP_IS_WEAK       = 406,
-       OP_WEAKEN        = 407,
-       OP_UNWEAKEN      = 408,
-       OP_BLESSED       = 409,
-       OP_REFADDR       = 410,
-       OP_REFTYPE       = 411,
-       OP_CEIL          = 412,
-       OP_FLOOR         = 413,
+       OP_PADSV_STORE   = 10,
+       OP_PADAV         = 11,
+       OP_PADHV         = 12,
+       OP_PADANY        = 13,
+       OP_RV2GV         = 14,
+       OP_RV2SV         = 15,
+       OP_AV2ARYLEN     = 16,
+       OP_RV2CV         = 17,
+       OP_ANONCODE      = 18,
+       OP_PROTOTYPE     = 19,
+       OP_REFGEN        = 20,
+       OP_SREFGEN       = 21,
+       OP_REF           = 22,
+       OP_BLESS         = 23,
+       OP_BACKTICK      = 24,
+       OP_GLOB          = 25,
+       OP_READLINE      = 26,
+       OP_RCATLINE      = 27,
+       OP_REGCMAYBE     = 28,
+       OP_REGCRESET     = 29,
+       OP_REGCOMP       = 30,
+       OP_MATCH         = 31,
+       OP_QR            = 32,
+       OP_SUBST         = 33,
+       OP_SUBSTCONT     = 34,
+       OP_TRANS         = 35,
+       OP_TRANSR        = 36,
+       OP_SASSIGN       = 37,
+       OP_AASSIGN       = 38,
+       OP_CHOP          = 39,
+       OP_SCHOP         = 40,
+       OP_CHOMP         = 41,
+       OP_SCHOMP        = 42,
+       OP_DEFINED       = 43,
+       OP_UNDEF         = 44,
+       OP_STUDY         = 45,
+       OP_POS           = 46,
+       OP_PREINC        = 47,
+       OP_I_PREINC      = 48,
+       OP_PREDEC        = 49,
+       OP_I_PREDEC      = 50,
+       OP_POSTINC       = 51,
+       OP_I_POSTINC     = 52,
+       OP_POSTDEC       = 53,
+       OP_I_POSTDEC     = 54,
+       OP_POW           = 55,
+       OP_MULTIPLY      = 56,
+       OP_I_MULTIPLY    = 57,
+       OP_DIVIDE        = 58,
+       OP_I_DIVIDE      = 59,
+       OP_MODULO        = 60,
+       OP_I_MODULO      = 61,
+       OP_REPEAT        = 62,
+       OP_ADD           = 63,
+       OP_I_ADD         = 64,
+       OP_SUBTRACT      = 65,
+       OP_I_SUBTRACT    = 66,
+       OP_CONCAT        = 67,
+       OP_MULTICONCAT   = 68,
+       OP_STRINGIFY     = 69,
+       OP_LEFT_SHIFT    = 70,
+       OP_RIGHT_SHIFT   = 71,
+       OP_LT            = 72,
+       OP_I_LT          = 73,
+       OP_GT            = 74,
+       OP_I_GT          = 75,
+       OP_LE            = 76,
+       OP_I_LE          = 77,
+       OP_GE            = 78,
+       OP_I_GE          = 79,
+       OP_EQ            = 80,
+       OP_I_EQ          = 81,
+       OP_NE            = 82,
+       OP_I_NE          = 83,
+       OP_NCMP          = 84,
+       OP_I_NCMP        = 85,
+       OP_SLT           = 86,
+       OP_SGT           = 87,
+       OP_SLE           = 88,
+       OP_SGE           = 89,
+       OP_SEQ           = 90,
+       OP_SNE           = 91,
+       OP_SCMP          = 92,
+       OP_BIT_AND       = 93,
+       OP_BIT_XOR       = 94,
+       OP_BIT_OR        = 95,
+       OP_NBIT_AND      = 96,
+       OP_NBIT_XOR      = 97,
+       OP_NBIT_OR       = 98,
+       OP_SBIT_AND      = 99,
+       OP_SBIT_XOR      = 100,
+       OP_SBIT_OR       = 101,
+       OP_NEGATE        = 102,
+       OP_I_NEGATE      = 103,
+       OP_NOT           = 104,
+       OP_COMPLEMENT    = 105,
+       OP_NCOMPLEMENT   = 106,
+       OP_SCOMPLEMENT   = 107,
+       OP_SMARTMATCH    = 108,
+       OP_ATAN2         = 109,
+       OP_SIN           = 110,
+       OP_COS           = 111,
+       OP_RAND          = 112,
+       OP_SRAND         = 113,
+       OP_EXP           = 114,
+       OP_LOG           = 115,
+       OP_SQRT          = 116,
+       OP_INT           = 117,
+       OP_HEX           = 118,
+       OP_OCT           = 119,
+       OP_ABS           = 120,
+       OP_LENGTH        = 121,
+       OP_SUBSTR        = 122,
+       OP_VEC           = 123,
+       OP_INDEX         = 124,
+       OP_RINDEX        = 125,
+       OP_SPRINTF       = 126,
+       OP_FORMLINE      = 127,
+       OP_ORD           = 128,
+       OP_CHR           = 129,
+       OP_CRYPT         = 130,
+       OP_UCFIRST       = 131,
+       OP_LCFIRST       = 132,
+       OP_UC            = 133,
+       OP_LC            = 134,
+       OP_QUOTEMETA     = 135,
+       OP_RV2AV         = 136,
+       OP_AELEMFAST     = 137,
+       OP_AELEMFAST_LEX = 138,
+       OP_AELEMFASTLEX_STORE = 139,
+       OP_AELEM         = 140,
+       OP_ASLICE        = 141,
+       OP_KVASLICE      = 142,
+       OP_AEACH         = 143,
+       OP_AVALUES       = 144,
+       OP_AKEYS         = 145,
+       OP_EACH          = 146,
+       OP_VALUES        = 147,
+       OP_KEYS          = 148,
+       OP_DELETE        = 149,
+       OP_EXISTS        = 150,
+       OP_RV2HV         = 151,
+       OP_HELEM         = 152,
+       OP_HSLICE        = 153,
+       OP_KVHSLICE      = 154,
+       OP_MULTIDEREF    = 155,
+       OP_UNPACK        = 156,
+       OP_PACK          = 157,
+       OP_SPLIT         = 158,
+       OP_JOIN          = 159,
+       OP_LIST          = 160,
+       OP_LSLICE        = 161,
+       OP_ANONLIST      = 162,
+       OP_ANONHASH      = 163,
+       OP_EMPTYAVHV     = 164,
+       OP_SPLICE        = 165,
+       OP_PUSH          = 166,
+       OP_POP           = 167,
+       OP_SHIFT         = 168,
+       OP_UNSHIFT       = 169,
+       OP_SORT          = 170,
+       OP_REVERSE       = 171,
+       OP_GREPSTART     = 172,
+       OP_GREPWHILE     = 173,
+       OP_MAPSTART      = 174,
+       OP_MAPWHILE      = 175,
+       OP_RANGE         = 176,
+       OP_FLIP          = 177,
+       OP_FLOP          = 178,
+       OP_AND           = 179,
+       OP_OR            = 180,
+       OP_XOR           = 181,
+       OP_DOR           = 182,
+       OP_COND_EXPR     = 183,
+       OP_ANDASSIGN     = 184,
+       OP_ORASSIGN      = 185,
+       OP_DORASSIGN     = 186,
+       OP_ENTERSUB      = 187,
+       OP_LEAVESUB      = 188,
+       OP_LEAVESUBLV    = 189,
+       OP_ARGCHECK      = 190,
+       OP_ARGELEM       = 191,
+       OP_ARGDEFELEM    = 192,
+       OP_CALLER        = 193,
+       OP_WARN          = 194,
+       OP_DIE           = 195,
+       OP_RESET         = 196,
+       OP_LINESEQ       = 197,
+       OP_NEXTSTATE     = 198,
+       OP_DBSTATE       = 199,
+       OP_UNSTACK       = 200,
+       OP_ENTER         = 201,
+       OP_LEAVE         = 202,
+       OP_SCOPE         = 203,
+       OP_ENTERITER     = 204,
+       OP_ITER          = 205,
+       OP_ENTERLOOP     = 206,
+       OP_LEAVELOOP     = 207,
+       OP_RETURN        = 208,
+       OP_LAST          = 209,
+       OP_NEXT          = 210,
+       OP_REDO          = 211,
+       OP_DUMP          = 212,
+       OP_GOTO          = 213,
+       OP_EXIT          = 214,
+       OP_METHOD        = 215,
+       OP_METHOD_NAMED  = 216,
+       OP_METHOD_SUPER  = 217,
+       OP_METHOD_REDIR  = 218,
+       OP_METHOD_REDIR_SUPER = 219,
+       OP_ENTERGIVEN    = 220,
+       OP_LEAVEGIVEN    = 221,
+       OP_ENTERWHEN     = 222,
+       OP_LEAVEWHEN     = 223,
+       OP_BREAK         = 224,
+       OP_CONTINUE      = 225,
+       OP_OPEN          = 226,
+       OP_CLOSE         = 227,
+       OP_PIPE_OP       = 228,
+       OP_FILENO        = 229,
+       OP_UMASK         = 230,
+       OP_BINMODE       = 231,
+       OP_TIE           = 232,
+       OP_UNTIE         = 233,
+       OP_TIED          = 234,
+       OP_DBMOPEN       = 235,
+       OP_DBMCLOSE      = 236,
+       OP_SSELECT       = 237,
+       OP_SELECT        = 238,
+       OP_GETC          = 239,
+       OP_READ          = 240,
+       OP_ENTERWRITE    = 241,
+       OP_LEAVEWRITE    = 242,
+       OP_PRTF          = 243,
+       OP_PRINT         = 244,
+       OP_SAY           = 245,
+       OP_SYSOPEN       = 246,
+       OP_SYSSEEK       = 247,
+       OP_SYSREAD       = 248,
+       OP_SYSWRITE      = 249,
+       OP_EOF           = 250,
+       OP_TELL          = 251,
+       OP_SEEK          = 252,
+       OP_TRUNCATE      = 253,
+       OP_FCNTL         = 254,
+       OP_IOCTL         = 255,
+       OP_FLOCK         = 256,
+       OP_SEND          = 257,
+       OP_RECV          = 258,
+       OP_SOCKET        = 259,
+       OP_SOCKPAIR      = 260,
+       OP_BIND          = 261,
+       OP_CONNECT       = 262,
+       OP_LISTEN        = 263,
+       OP_ACCEPT        = 264,
+       OP_SHUTDOWN      = 265,
+       OP_GSOCKOPT      = 266,
+       OP_SSOCKOPT      = 267,
+       OP_GETSOCKNAME   = 268,
+       OP_GETPEERNAME   = 269,
+       OP_LSTAT         = 270,
+       OP_STAT          = 271,
+       OP_FTRREAD       = 272,
+       OP_FTRWRITE      = 273,
+       OP_FTREXEC       = 274,
+       OP_FTEREAD       = 275,
+       OP_FTEWRITE      = 276,
+       OP_FTEEXEC       = 277,
+       OP_FTIS          = 278,
+       OP_FTSIZE        = 279,
+       OP_FTMTIME       = 280,
+       OP_FTATIME       = 281,
+       OP_FTCTIME       = 282,
+       OP_FTROWNED      = 283,
+       OP_FTEOWNED      = 284,
+       OP_FTZERO        = 285,
+       OP_FTSOCK        = 286,
+       OP_FTCHR         = 287,
+       OP_FTBLK         = 288,
+       OP_FTFILE        = 289,
+       OP_FTDIR         = 290,
+       OP_FTPIPE        = 291,
+       OP_FTSUID        = 292,
+       OP_FTSGID        = 293,
+       OP_FTSVTX        = 294,
+       OP_FTLINK        = 295,
+       OP_FTTTY         = 296,
+       OP_FTTEXT        = 297,
+       OP_FTBINARY      = 298,
+       OP_CHDIR         = 299,
+       OP_CHOWN         = 300,
+       OP_CHROOT        = 301,
+       OP_UNLINK        = 302,
+       OP_CHMOD         = 303,
+       OP_UTIME         = 304,
+       OP_RENAME        = 305,
+       OP_LINK          = 306,
+       OP_SYMLINK       = 307,
+       OP_READLINK      = 308,
+       OP_MKDIR         = 309,
+       OP_RMDIR         = 310,
+       OP_OPEN_DIR      = 311,
+       OP_READDIR       = 312,
+       OP_TELLDIR       = 313,
+       OP_SEEKDIR       = 314,
+       OP_REWINDDIR     = 315,
+       OP_CLOSEDIR      = 316,
+       OP_FORK          = 317,
+       OP_WAIT          = 318,
+       OP_WAITPID       = 319,
+       OP_SYSTEM        = 320,
+       OP_EXEC          = 321,
+       OP_KILL          = 322,
+       OP_GETPPID       = 323,
+       OP_GETPGRP       = 324,
+       OP_SETPGRP       = 325,
+       OP_GETPRIORITY   = 326,
+       OP_SETPRIORITY   = 327,
+       OP_TIME          = 328,
+       OP_TMS           = 329,
+       OP_LOCALTIME     = 330,
+       OP_GMTIME        = 331,
+       OP_ALARM         = 332,
+       OP_SLEEP         = 333,
+       OP_SHMGET        = 334,
+       OP_SHMCTL        = 335,
+       OP_SHMREAD       = 336,
+       OP_SHMWRITE      = 337,
+       OP_MSGGET        = 338,
+       OP_MSGCTL        = 339,
+       OP_MSGSND        = 340,
+       OP_MSGRCV        = 341,
+       OP_SEMOP         = 342,
+       OP_SEMGET        = 343,
+       OP_SEMCTL        = 344,
+       OP_REQUIRE       = 345,
+       OP_DOFILE        = 346,
+       OP_HINTSEVAL     = 347,
+       OP_ENTEREVAL     = 348,
+       OP_LEAVEEVAL     = 349,
+       OP_ENTERTRY      = 350,
+       OP_LEAVETRY      = 351,
+       OP_GHBYNAME      = 352,
+       OP_GHBYADDR      = 353,
+       OP_GHOSTENT      = 354,
+       OP_GNBYNAME      = 355,
+       OP_GNBYADDR      = 356,
+       OP_GNETENT       = 357,
+       OP_GPBYNAME      = 358,
+       OP_GPBYNUMBER    = 359,
+       OP_GPROTOENT     = 360,
+       OP_GSBYNAME      = 361,
+       OP_GSBYPORT      = 362,
+       OP_GSERVENT      = 363,
+       OP_SHOSTENT      = 364,
+       OP_SNETENT       = 365,
+       OP_SPROTOENT     = 366,
+       OP_SSERVENT      = 367,
+       OP_EHOSTENT      = 368,
+       OP_ENETENT       = 369,
+       OP_EPROTOENT     = 370,
+       OP_ESERVENT      = 371,
+       OP_GPWNAM        = 372,
+       OP_GPWUID        = 373,
+       OP_GPWENT        = 374,
+       OP_SPWENT        = 375,
+       OP_EPWENT        = 376,
+       OP_GGRNAM        = 377,
+       OP_GGRGID        = 378,
+       OP_GGRENT        = 379,
+       OP_SGRENT        = 380,
+       OP_EGRENT        = 381,
+       OP_GETLOGIN      = 382,
+       OP_SYSCALL       = 383,
+       OP_LOCK          = 384,
+       OP_ONCE          = 385,
+       OP_CUSTOM        = 386,
+       OP_COREARGS      = 387,
+       OP_AVHVSWITCH    = 388,
+       OP_RUNCV         = 389,
+       OP_FC            = 390,
+       OP_PADCV         = 391,
+       OP_INTROCV       = 392,
+       OP_CLONECV       = 393,
+       OP_PADRANGE      = 394,
+       OP_REFASSIGN     = 395,
+       OP_LVREF         = 396,
+       OP_LVREFSLICE    = 397,
+       OP_LVAVREF       = 398,
+       OP_ANONCONST     = 399,
+       OP_ISA           = 400,
+       OP_CMPCHAIN_AND  = 401,
+       OP_CMPCHAIN_DUP  = 402,
+       OP_ENTERTRYCATCH = 403,
+       OP_LEAVETRYCATCH = 404,
+       OP_POPTRY        = 405,
+       OP_CATCH         = 406,
+       OP_PUSHDEFER     = 407,
+       OP_IS_BOOL       = 408,
+       OP_IS_WEAK       = 409,
+       OP_WEAKEN        = 410,
+       OP_UNWEAKEN      = 411,
+       OP_BLESSED       = 412,
+       OP_REFADDR       = 413,
+       OP_REFTYPE       = 414,
+       OP_CEIL          = 415,
+       OP_FLOOR         = 416,
+       OP_IS_TAINTED    = 417,
+       OP_HELEMEXISTSOR = 418,
+       OP_METHSTART     = 419,
+       OP_INITFIELD     = 420,
        OP_max          
 } opcode;
 
-#define MAXO 414
+#define MAXO 421
 #define OP_FREED MAXO
 
 /* the OP_IS_* macros are optimized to a simple range check because
@@ -439,22 +446,22 @@ typedef enum opcode {
     opcode.pl verifies the range contiguity, or generates an OR-equals
     expression */
 
-#define OP_IS_SOCKET(op)       \
+#define OP_IS_SOCKET(op)   \
        ((op) >= OP_SEND && (op) <= OP_GETPEERNAME)
 
-#define OP_IS_FILETEST(op)     \
+#define OP_IS_FILETEST(op)   \
        ((op) >= OP_FTRREAD && (op) <= OP_FTBINARY)
 
-#define OP_IS_FILETEST_ACCESS(op)      \
+#define OP_IS_FILETEST_ACCESS(op)   \
        ((op) >= OP_FTRREAD && (op) <= OP_FTEEXEC)
 
-#define OP_IS_NUMCOMPARE(op)   \
+#define OP_IS_NUMCOMPARE(op)   \
        ((op) >= OP_LT && (op) <= OP_I_NCMP)
 
-#define OP_IS_DIRHOP(op)       \
+#define OP_IS_DIRHOP(op)   \
        ((op) >= OP_READDIR && (op) <= OP_CLOSEDIR)
 
-#define OP_IS_INFIX_BIT(op)    \
+#define OP_IS_INFIX_BIT(op)   \
        ((op) >= OP_BIT_AND && (op) <= OP_SBIT_OR)
 
-/* ex: set ro: */
+/* ex: set ro ft=c: */
index 6d0ca4b..212c8b7 100644 (file)
@@ -11,7 +11,7 @@ require OS2::DLL;
 # Other items we are prepared to export if requested
 @EXPORT_OK = qw(drop register);
 
-$VERSION = '1.05';
+$VERSION = '1.06';
 
 # We cannot just put OS2::DLL in @ISA, since some scripts would use
 # function interface, not method interface...
@@ -428,7 +428,7 @@ overridden. So unless you know better than I do, do not access REXX
 variables (probably tied to Perl variables) or call REXX functions
 which access REXX queues or REXX variables in signal handlers.
 
-See C<t/rx*.t> and the next section for examples.
+See F<t/rx*.t> and the next section for examples.
 
 =head1 EXAMPLE
 
index 0d29d13..6fa0028 100644 (file)
@@ -5047,14 +5047,14 @@ my_tmpnam (char *str)
     char *p = PerlEnv_getenv("TMP"), *tpath;
 
     if (!p) p = PerlEnv_getenv("TEMP");
-    ENV_LOCK;
+    ENV_READ_LOCK;
     tpath = tempnam(p, "pltmp");
     if (str && tpath) {
         strcpy(str, tpath);
-        ENV_UNLOCK;
+        ENV_READ_UNLOCK;
         return str;
     }
-    ENV_UNLOCK;
+    ENV_READ_UNLOCK;
     return tpath;
 }
 
index 0f80a4d..b810900 100644 (file)
@@ -6,7 +6,7 @@
  *     This symbol, if defined, indicates that the ioctl() routine is
  *     available to set I/O characteristics
  */
-#define        HAS_IOCTL               /**/
+#define HAS_IOCTL               /**/
  
 /* HAS_UTIME:
  *     This symbol, if defined, indicates that the routine utime() is
@@ -192,7 +192,7 @@ extern int rc;
 #  define pthread_setspecific(k,v)     (*(k)=(v),0)
 #  define pthread_key_create(keyp,flag)                        \
         ( DosAllocThreadLocalMemory(1,(unsigned long**)keyp)   \
-          ? Perl_croak_nocontext("LocalMemory"),1      \
+          ? Perl_croak_nocontext("Out of memory!"), 1        \
           : 0                                          \
         )
 #endif /* USE_SLOW_THREAD_SPECIFIC */
@@ -822,50 +822,50 @@ int os2_do_aspawn(pTHX_ SV *really, SV **vmark, SV **vsp);
 #ifndef LOG_DAEMON
 
 /* Replacement for syslog.h */
-#  define      LOG_EMERG       0       /* system is unusable */
-#  define      LOG_ALERT       1       /* action must be taken immediately */
-#  define      LOG_CRIT        2       /* critical conditions */
-#  define      LOG_ERR 3       /* error conditions */
-#  define      LOG_WARNING     4       /* warning conditions */
-#  define      LOG_NOTICE      5       /* normal but significant condition */
-#  define      LOG_INFO        6       /* informational */
-#  define      LOG_DEBUG       7       /* debug-level messages */
-
-#  define      LOG_PRIMASK     0x007   /* mask to extract priority part (internal) */
+#  define LOG_EMERG     0       /* system is unusable */
+#  define LOG_ALERT     1       /* action must be taken immediately */
+#  define LOG_CRIT      2       /* critical conditions */
+#  define LOG_ERR       3       /* error conditions */
+#  define LOG_WARNING   4       /* warning conditions */
+#  define LOG_NOTICE    5       /* normal but significant condition */
+#  define LOG_INFO      6       /* informational */
+#  define LOG_DEBUG     7       /* debug-level messages */
+
+#  define LOG_PRIMASK   0x007   /* mask to extract priority part (internal) */
                                 /* extract priority */
-#  define      LOG_PRI(p)      ((p) & LOG_PRIMASK)
-#  define      LOG_MAKEPRI(fac, pri)   (((fac) << 3) | (pri))
+#  define LOG_PRI(p)    ((p) & LOG_PRIMASK)
+#  define LOG_MAKEPRI(fac, pri) (((fac) << 3) | (pri))
 
 /* facility codes */
-#  define      LOG_KERN        (0<<3)  /* kernel messages */
-#  define      LOG_USER        (1<<3)  /* random user-level messages */
-#  define      LOG_MAIL        (2<<3)  /* mail system */
-#  define      LOG_DAEMON      (3<<3)  /* system daemons */
-#  define      LOG_AUTH        (4<<3)  /* security/authorization messages */
-#  define      LOG_SYSLOG      (5<<3)  /* messages generated internally by syslogd */
-#  define      LOG_LPR (6<<3)  /* line printer subsystem */
-#  define      LOG_NEWS        (7<<3)  /* network news subsystem */
-#  define      LOG_UUCP        (8<<3)  /* UUCP subsystem */
-#  define      LOG_CRON        (15<<3) /* clock daemon */
+#  define LOG_KERN      (0<<3)  /* kernel messages */
+#  define LOG_USER      (1<<3)  /* random user-level messages */
+#  define LOG_MAIL      (2<<3)  /* mail system */
+#  define LOG_DAEMON    (3<<3)  /* system daemons */
+#  define LOG_AUTH      (4<<3)  /* security/authorization messages */
+#  define LOG_SYSLOG    (5<<3)  /* messages generated internally by syslogd */
+#  define LOG_LPR       (6<<3)  /* line printer subsystem */
+#  define LOG_NEWS      (7<<3)  /* network news subsystem */
+#  define LOG_UUCP      (8<<3)  /* UUCP subsystem */
+#  define LOG_CRON      (15<<3) /* clock daemon */
         /* other codes through 15 reserved for system use */
-#  define      LOG_LOCAL0      (16<<3) /* reserved for local use */
-#  define      LOG_LOCAL1      (17<<3) /* reserved for local use */
-#  define      LOG_LOCAL2      (18<<3) /* reserved for local use */
-#  define      LOG_LOCAL3      (19<<3) /* reserved for local use */
-#  define      LOG_LOCAL4      (20<<3) /* reserved for local use */
-#  define      LOG_LOCAL5      (21<<3) /* reserved for local use */
-#  define      LOG_LOCAL6      (22<<3) /* reserved for local use */
-#  define      LOG_LOCAL7      (23<<3) /* reserved for local use */
-
-#  define      LOG_NFACILITIES 24      /* current number of facilities */
-#  define      LOG_FACMASK     0x03f8  /* mask to extract facility part */
+#  define LOG_LOCAL0    (16<<3) /* reserved for local use */
+#  define LOG_LOCAL1    (17<<3) /* reserved for local use */
+#  define LOG_LOCAL2    (18<<3) /* reserved for local use */
+#  define LOG_LOCAL3    (19<<3) /* reserved for local use */
+#  define LOG_LOCAL4    (20<<3) /* reserved for local use */
+#  define LOG_LOCAL5    (21<<3) /* reserved for local use */
+#  define LOG_LOCAL6    (22<<3) /* reserved for local use */
+#  define LOG_LOCAL7    (23<<3) /* reserved for local use */
+
+#  define LOG_NFACILITIES       24      /* current number of facilities */
+#  define LOG_FACMASK   0x03f8  /* mask to extract facility part */
                                 /* facility of pri */
-#  define      LOG_FAC(p)      (((p) & LOG_FACMASK) >> 3)
+#  define LOG_FAC(p)    (((p) & LOG_FACMASK) >> 3)
 
 /*
  * arguments to setlogmask.
  */
-#  define      LOG_MASK(pri)   (1 << (pri))            /* mask for one priority */
+#  define LOG_MASK(pri) (1 << (pri))            /* mask for one priority */
 #  define       LOG_UPTO(pri)   nBIT_MASK((pri)+1)      /* all priorities through pri */
 
 /*
@@ -874,12 +874,12 @@ int os2_do_aspawn(pTHX_ SV *really, SV **vmark, SV **vsp);
  * LOG_ODELAY no longer does anything.
  * LOG_NDELAY is the inverse of what it used to be.
  */
-#  define      LOG_PID         0x01    /* log the pid with each message */
-#  define      LOG_CONS        0x02    /* log on the console if errors in sending */
-#  define      LOG_ODELAY      0x04    /* delay open until first syslog() (default) */
-#  define      LOG_NDELAY      0x08    /* don't delay open */
-#  define      LOG_NOWAIT      0x10    /* don't wait for console forks: DEPRECATED */
-#  define      LOG_PERROR      0x20    /* log to stderr as well */
+#  define LOG_PID               0x01    /* log the pid with each message */
+#  define LOG_CONS      0x02    /* log on the console if errors in sending */
+#  define LOG_ODELAY    0x04    /* delay open until first syslog() (default) */
+#  define LOG_NDELAY    0x08    /* don't delay open */
+#  define LOG_NOWAIT    0x10    /* don't wait for console forks: DEPRECATED */
+#  define LOG_PERROR    0x20    /* log to stderr as well */
 
 #endif
 
@@ -1239,4 +1239,3 @@ typedef struct {
 PQTOPLEVEL get_sysinfo(ULONG pid, ULONG flags);
 
 #endif /* _OS2_H */
-
index 50e7660..cb2e9f1 100644 (file)
@@ -1,4 +1,4 @@
-/* -*- buffer-read-only: t -*-
+/* -*- mode: C; buffer-read-only: t -*-
  *
  *    overload.h
  *
@@ -95,4 +95,4 @@ enum {
 
 #define NofAMmeth max_amg_code
 
-/* ex: set ro: */
+/* ex: set ro ft=c: */
index ae74f93..b6f2723 100644 (file)
@@ -1,4 +1,4 @@
-/* -*- buffer-read-only: t -*-
+/* -*- mode: C; buffer-read-only: t -*-
    !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!!
    This file is built by regen/genpacksizetables.pl from its data.
    Any changes made here will be lost!
@@ -219,4 +219,4 @@ STATIC const packprops_t packprops[512] = {
 };
 #endif
 
-/* ex: set ro: */
+/* ex: set ro ft=c: */
index e0131ac..e3c2bd6 100644 (file)
@@ -302,7 +302,7 @@ void
 Perl_cv_undef_flags(pTHX_ CV *cv, U32 flags)
 {
     CV cvbody;/*CV body will never be realloced inside this func,
-               so dont read it more than once, use fake CV so existing macros
+               so don't read it more than once, use fake CV so existing macros
                will work, the indirection and CV head struct optimized away*/
     SvANY(&cvbody) = SvANY(cv);
 
@@ -357,7 +357,7 @@ Perl_cv_undef_flags(pTHX_ CV *cv, U32 flags)
 #endif
         }
     }
-    else { /* dont bother checking if CvXSUB(cv) is true, less branching */
+    else { /* don't bother checking if CvXSUB(cv) is true, less branching */
         CvXSUB(&cvbody) = NULL;
     }
     SvPOK_off(MUTABLE_SV(cv));         /* forget prototype */
@@ -457,8 +457,11 @@ Perl_cv_undef_flags(pTHX_ CV *cv, U32 flags)
         Safefree(padlist);
         CvPADLIST_set(&cvbody, NULL);
     }
-    else if (CvISXSUB(&cvbody))
+    else if (CvISXSUB(&cvbody)) {
+        if (CvREFCOUNTED_ANYSV(&cvbody))
+            SvREFCNT_dec(CvXSUBANY(&cvbody).any_sv);
         CvHSCXT(&cvbody) = NULL;
+    }
     /* else is (!CvISXSUB(&cvbody) && !CvPADLIST(&cvbody)) {do nothing;} */
 
 
@@ -550,17 +553,21 @@ S_pad_alloc_name(pTHX_ PADNAME *name, U32 flags, HV *typestash,
     ASSERT_CURPAD_ACTIVE("pad_alloc_name");
 
     if (typestash) {
-        SvPAD_TYPED_on(name);
+        PadnameFLAGS(name) |= PADNAMEf_TYPED;
         PadnameTYPE(name) =
             MUTABLE_HV(SvREFCNT_inc_simple_NN(MUTABLE_SV(typestash)));
     }
     if (ourstash) {
-        SvPAD_OUR_on(name);
-        SvOURSTASH_set(name, ourstash);
+        PadnameFLAGS(name) |= PADNAMEf_OUR;
+        PadnameOURSTASH_set(name, ourstash);
         SvREFCNT_inc_simple_void_NN(ourstash);
     }
     else if (flags & padadd_STATE) {
-        SvPAD_STATE_on(name);
+        PadnameFLAGS(name) |= PADNAMEf_STATE;
+    }
+    if (flags & padadd_FIELD) {
+        assert(HvSTASH_IS_CLASS(PL_curstash));
+        class_add_field(PL_curstash, name);
     }
 
     padnamelist_store(PL_comppad_name, offset, name);
@@ -586,6 +593,7 @@ flags can be OR'ed together:
  padadd_OUR          redundantly specifies if it's a package var
  padadd_STATE        variable will retain value persistently
  padadd_NO_DUP_CHECK skip check for lexical shadowing
+ padadd_FIELD        specifies that the lexical is a field for a class
 
 =cut
 */
@@ -599,7 +607,7 @@ Perl_pad_add_name_pvn(pTHX_ const char *namepv, STRLEN namelen,
 
     PERL_ARGS_ASSERT_PAD_ADD_NAME_PVN;
 
-    if (flags & ~(padadd_OUR|padadd_STATE|padadd_NO_DUP_CHECK))
+    if (flags & ~(padadd_OUR|padadd_STATE|padadd_NO_DUP_CHECK|padadd_FIELD))
         Perl_croak(aTHX_ "panic: pad_add_name_pvn illegal flag bits 0x%" UVxf,
                    (UV)flags);
 
@@ -609,8 +617,8 @@ Perl_pad_add_name_pvn(pTHX_ const char *namepv, STRLEN namelen,
         ENTER;
         SAVEFREEPADNAME(name); /* in case of fatal warnings */
         /* check for duplicate declaration */
-        pad_check_dup(name, flags & padadd_OUR, ourstash);
-        PadnameREFCNT(name)++;
+        pad_check_dup(name, flags & (padadd_OUR|padadd_FIELD), ourstash);
+        PadnameREFCNT_inc(name);
         LEAVE;
     }
 
@@ -861,12 +869,13 @@ S_pad_check_dup(pTHX_ PADNAME *name, U32 flags, const HV *ourstash)
     PADNAME    **svp;
     PADOFFSET  top, off;
     const U32  is_our = flags & padadd_OUR;
+    bool        is_field = flags & padadd_FIELD;
 
     PERL_ARGS_ASSERT_PAD_CHECK_DUP;
 
     ASSERT_CURPAD_ACTIVE("pad_check_dup");
 
-    assert((flags & ~padadd_OUR) == 0);
+    assert((flags & ~(padadd_OUR|padadd_FIELD)) == 0);
 
     if (PadnamelistMAX(PL_comppad_name) < 0 || !ckWARN(WARN_SHADOW))
         return; /* nothing to check */
@@ -875,26 +884,30 @@ S_pad_check_dup(pTHX_ PADNAME *name, U32 flags, const HV *ourstash)
     top = PadnamelistMAX(PL_comppad_name);
     /* check the current scope */
     for (off = top; off > PL_comppad_name_floor; off--) {
-        PADNAME * const sv = svp[off];
-        if (sv
-            && PadnameLEN(sv) == PadnameLEN(name)
-            && !PadnameOUTER(sv)
-            && (   COP_SEQ_RANGE_LOW(sv)  == PERL_PADSEQ_INTRO
-                || COP_SEQ_RANGE_HIGH(sv) == PERL_PADSEQ_INTRO)
-            && memEQ(PadnamePV(sv), PadnamePV(name), PadnameLEN(name)))
+        PADNAME * const pn = svp[off];
+        if (pn
+            && PadnameLEN(pn) == PadnameLEN(name)
+            && !PadnameOUTER(pn)
+            && (   COP_SEQ_RANGE_LOW(pn)  == PERL_PADSEQ_INTRO
+                || COP_SEQ_RANGE_HIGH(pn) == PERL_PADSEQ_INTRO)
+            && memEQ(PadnamePV(pn), PadnamePV(name), PadnameLEN(name)))
         {
-            if (is_our && (SvPAD_OUR(sv)))
+            if (is_our && (PadnameIsOUR(pn)))
                 break; /* "our" masking "our" */
+            if (is_field && PadnameIsFIELD(pn) &&
+                    PadnameFIELDINFO(pn)->fieldstash != PL_curstash)
+                break; /* field of a different class */
             /* diag_listed_as: "%s" variable %s masks earlier declaration in same %s */
             Perl_warner(aTHX_ packWARN(WARN_SHADOW),
                 "\"%s\" %s %" PNf " masks earlier declaration in same %s",
                 (   is_our                         ? "our"   :
                     PL_parser->in_my == KEY_my     ? "my"    :
                     PL_parser->in_my == KEY_sigvar ? "my"    :
+                    PL_parser->in_my == KEY_field  ? "field" :
                                                      "state" ),
-                *PadnamePV(sv) == '&' ? "subroutine" : "variable",
-                PNfARG(sv),
-                (COP_SEQ_RANGE_HIGH(sv) == PERL_PADSEQ_INTRO
+                *PadnamePV(pn) == '&' ? "subroutine" : "variable",
+                PNfARG(pn),
+                (COP_SEQ_RANGE_HIGH(pn) == PERL_PADSEQ_INTRO
                     ? "scope" : "statement"));
             --off;
             break;
@@ -903,17 +916,17 @@ S_pad_check_dup(pTHX_ PADNAME *name, U32 flags, const HV *ourstash)
     /* check the rest of the pad */
     if (is_our) {
         while (off > 0) {
-            PADNAME * const sv = svp[off];
-            if (sv
-                && PadnameLEN(sv) == PadnameLEN(name)
-                && !PadnameOUTER(sv)
-                && (   COP_SEQ_RANGE_LOW(sv)  == PERL_PADSEQ_INTRO
-                    || COP_SEQ_RANGE_HIGH(sv) == PERL_PADSEQ_INTRO)
-                && SvOURSTASH(sv) == ourstash
-                && memEQ(PadnamePV(sv), PadnamePV(name), PadnameLEN(name)))
+            PADNAME * const pn = svp[off];
+            if (pn
+                && PadnameLEN(pn) == PadnameLEN(name)
+                && !PadnameOUTER(pn)
+                && (   COP_SEQ_RANGE_LOW(pn)  == PERL_PADSEQ_INTRO
+                    || COP_SEQ_RANGE_HIGH(pn) == PERL_PADSEQ_INTRO)
+                && PadnameOURSTASH(pn) == ourstash
+                && memEQ(PadnamePV(pn), PadnamePV(name), PadnameLEN(name)))
             {
                 Perl_warner(aTHX_ packWARN(WARN_SHADOW),
-                    "\"our\" variable %" PNf " redeclared", PNfARG(sv));
+                    "\"our\" variable %" PNf " redeclared", PNfARG(pn));
                 if (off <= PL_comppad_name_floor)
                     Perl_warner(aTHX_ packWARN(WARN_SHADOW),
                         "\t(Did you mean \"local\" instead of \"our\"?)\n");
@@ -1025,26 +1038,6 @@ Perl_pad_findmy_sv(pTHX_ SV *name, U32 flags)
     return pad_findmy_pvn(namepv, namelen, flags);
 }
 
-/*
-=for apidoc find_rundefsvoffset
-
-Until the lexical C<$_> feature was removed, this function would
-find the position of the lexical C<$_> in the pad of the
-currently-executing function and return the offset in the current pad,
-or C<NOT_IN_PAD>.
-
-Now it always returns C<NOT_IN_PAD>.
-
-=cut
-*/
-
-PADOFFSET
-Perl_find_rundefsvoffset(pTHX)
-{
-    PERL_UNUSED_CONTEXT; /* Can we just remove the pTHX from the sig? */
-    return NOT_IN_PAD;
-}
-
 /*
 =for apidoc find_rundefsv
 
@@ -1110,11 +1103,12 @@ S_pad_findlex(pTHX_ const char *namepv, STRLEN namelen, U32 flags, const CV* cv,
     SV *new_capture;
     SV **new_capturep;
     const PADLIST * const padlist = CvPADLIST(cv);
-    const bool staleok = !!(flags & padadd_STALEOK);
+    const bool staleok = cBOOL(flags & padadd_STALEOK);
+    const bool fieldok = cBOOL(flags & padfind_FIELD_OK);
 
     PERL_ARGS_ASSERT_PAD_FINDLEX;
 
-    flags &= ~ padadd_STALEOK; /* one-shot flag */
+    flags &= ~(padadd_STALEOK|padfind_FIELD_OK); /* one-shot flags */
     if (flags)
         Perl_croak(aTHX_ "panic: pad_findlex illegal flag bits 0x%" UVxf,
                    (UV)flags);
@@ -1153,6 +1147,10 @@ S_pad_findlex(pTHX_ const char *namepv, STRLEN namelen, U32 flags, const CV* cv,
                 fake_offset = 0;
                 *out_name = name_p[offset]; /* return the name */
 
+                if (PadnameIsFIELD(*out_name) && !fieldok)
+                    croak("Field %" SVf " is not accessible outside a method",
+                            SVfARG(PadnameSV(*out_name)));
+
                 /* set PAD_FAKELEX_MULTI if this lex can have multiple
                  * instances. For now, we just test !CvUNIQUE(cv), but
                  * ideally, we should detect my's declared within loops
@@ -1276,13 +1274,27 @@ S_pad_findlex(pTHX_ const char *namepv, STRLEN namelen, U32 flags, const CV* cv,
     new_capturep = out_capture ? out_capture :
                 CvLATE(cv) ? NULL : &new_capture;
 
-    offset = pad_findlex(namepv, namelen,
-                flags | padadd_STALEOK*(new_capturep == &new_capture),
+    U32 recurse_flags = flags;
+    if(new_capturep == &new_capture)
+        recurse_flags |= padadd_STALEOK;
+    if(CvIsMETHOD(cv))
+        recurse_flags |= padfind_FIELD_OK;
+
+    offset = pad_findlex(namepv, namelen, recurse_flags,
                 CvOUTSIDE(cv), CvOUTSIDE_SEQ(cv), 1,
                 new_capturep, out_name, out_flags);
     if (offset == NOT_IN_PAD)
         return NOT_IN_PAD;
 
+    if (PadnameIsFIELD(*out_name)) {
+        HV *fieldstash = PadnameFIELDINFO(*out_name)->fieldstash;
+
+        /* fields are only visible to the class that declared them */
+        if(fieldstash != PL_curstash)
+            croak("Field %" SVf " of %" HvNAMEf_QUOTEDPREFIX " is not accessible in a method of %" HvNAMEf_QUOTEDPREFIX,
+                SVfARG(PadnameSV(*out_name)), HvNAMEfARG(fieldstash), HvNAMEfARG(PL_curstash));
+    }
+
     /* found in an outer CV. Add appropriate fake entry to this pad */
 
     /* don't add new fake entries (via eval) to CVs that we have already
@@ -1986,7 +1998,7 @@ S_cv_clone_pad(pTHX_ CV *proto, CV *cv, CV *outside, HV *cloned,
                 /* formats may have an inactive, or even undefined, parent;
                    but state vars are always available. */
                 if (!outpad || !(sv = outpad[PARENT_PAD_INDEX(namesv)])
-                 || (  SvPADSTALE(sv) && !SvPAD_STATE(namesv)
+                 || (  SvPADSTALE(sv) && !PadnameIsSTATE(namesv)
                     && (!outside || !CvDEPTH(outside)))  ) {
                     S_unavailable(aTHX_ namesv);
                     sv = NULL;
@@ -2004,7 +2016,7 @@ S_cv_clone_pad(pTHX_ CV *proto, CV *cv, CV *outside, HV *cloned,
                        ing over other state subs’ entries, so we have
                        to put a stub here and then clone into it on the
                        second pass. */
-                    if (SvPAD_STATE(namesv) && !CvCLONED(ppad[ix])) {
+                    if (PadnameIsSTATE(namesv) && !CvCLONED(ppad[ix])) {
                         assert(SvTYPE(ppad[ix]) == SVt_PVCV);
                         subclones ++;
                         if (CvOUTSIDE(ppad[ix]) != proto)
@@ -2037,7 +2049,7 @@ S_cv_clone_pad(pTHX_ CV *proto, CV *cv, CV *outside, HV *cloned,
                 else
                     sv = newSV_type(SVt_NULL);
                 /* reset the 'assign only once' flag on each state var */
-                if (sigil != '&' && SvPAD_STATE(namesv))
+                if (sigil != '&' && PadnameIsSTATE(namesv))
                     SvPADSTALE_on(sv);
             }
           }
@@ -2123,7 +2135,7 @@ S_cv_clone_pad(pTHX_ CV *proto, CV *cv, CV *outside, HV *cloned,
 
     if (CvCONST(cv)) {
         /* Constant sub () { $x } closing over $x:
-         * The prototype was marked as a candiate for const-ization,
+         * The prototype was marked as a candidate for const-ization,
          * so try to grab the current const value, and if successful,
          * turn into a const sub:
          */
@@ -2138,7 +2150,7 @@ S_cv_clone_pad(pTHX_ CV *proto, CV *cv, CV *outside, HV *cloned,
         /* the candidate should have 1 ref from this pad and 1 ref
          * from the parent */
         if (const_sv && SvREFCNT(const_sv) == 2) {
-            const bool was_method = cBOOL(CvMETHOD(cv));
+            const bool was_method = cBOOL(CvNOWARN_AMBIGUOUS(cv));
             if (outside) {
                 PADNAME * const pn =
                     PadlistNAMESARRAY(CvPADLIST(outside))
@@ -2184,7 +2196,7 @@ S_cv_clone_pad(pTHX_ CV *proto, CV *cv, CV *outside, HV *cloned,
             SvREFCNT_dec_NN(cv);
             cv = newCONSTSUB(CvSTASH(proto), NULL, const_sv);
             if (was_method)
-                CvMETHOD_on(cv);
+                CvNOWARN_AMBIGUOUS_on(cv);
         }
         else {
           constoff:
@@ -2221,6 +2233,8 @@ S_cv_clone(pTHX_ CV *proto, CV *cv, CV *outside, HV *cloned)
     if (UNLIKELY(CvISXSUB(proto))) {
         CvXSUB(cv)    = CvXSUB(proto);
         CvXSUBANY(cv) = CvXSUBANY(proto);
+        if (CvREFCOUNTED_ANYSV(cv))
+            SvREFCNT_inc(CvXSUBANY(cv).any_sv);
     }
     else {
         OP_REFCNT_LOCK;
@@ -2463,8 +2477,6 @@ Perl_pad_push(pTHX_ PADLIST *padlist, int depth)
 
 #if defined(USE_ITHREADS)
 
-#  define av_dup_inc(s,t)      MUTABLE_AV(sv_dup_inc((const SV *)s,t))
-
 /*
 =for apidoc padlist_dup
 
@@ -2492,9 +2504,7 @@ Perl_padlist_dup(pTHX_ PADLIST *srcpad, CLONE_PARAMS *param)
     PadlistMAX(dstpad) = max;
     Newx(PadlistARRAY(dstpad), max + 1, PAD *);
 
-    PadlistARRAY(dstpad)[0] = (PAD *)
-            padnamelist_dup(PadlistNAMES(srcpad), param);
-    PadnamelistREFCNT(PadlistNAMES(dstpad))++;
+    PadlistARRAY(dstpad)[0] = (PAD *)padnamelist_dup_inc(PadlistNAMES(srcpad), param);
     if (cloneall) {
         PADOFFSET depth;
         for (depth = 1; depth <= max; ++depth)
@@ -2728,8 +2738,7 @@ Perl_padnamelist_dup(pTHX_ PADNAMELIST *srcpad, CLONE_PARAMS *param)
     for (; max >= 0; max--)
       if (PadnamelistARRAY(srcpad)[max]) {
         PadnamelistARRAY(dstpad)[max] =
-            padname_dup(PadnamelistARRAY(srcpad)[max], param);
-        PadnameREFCNT(PadnamelistARRAY(dstpad)[max])++;
+            padname_dup_inc(PadnamelistARRAY(srcpad)[max], param);
       }
 
     return dstpad;
@@ -2773,9 +2782,9 @@ Perl_newPADNAMEpvn(const char *s, STRLEN len)
 Constructs and returns a new pad name.  Only use this function for names
 that refer to outer lexicals.  (See also L</newPADNAMEpvn>.)  C<outer> is
 the outer pad name that this one mirrors.  The returned pad name has the
-C<PADNAMEt_OUTER> flag already set.
+C<PADNAMEf_OUTER> flag already set.
 
-=for apidoc Amnh||PADNAMEt_OUTER
+=for apidoc Amnh||PADNAMEf_OUTER
 
 =cut
 */
@@ -2790,8 +2799,13 @@ Perl_newPADNAMEouter(PADNAME *outer)
     PadnamePV(pn) = PadnamePV(outer);
     /* Not PadnameREFCNT(outer), because ‘outer’ may itself close over
        another entry.  The original pad name owns the buffer.  */
-    PadnameREFCNT(PADNAME_FROM_PV(PadnamePV(outer)))++;
-    PadnameFLAGS(pn) = PADNAMEt_OUTER;
+    PadnameREFCNT_inc(PADNAME_FROM_PV(PadnamePV(outer)));
+    PadnameFLAGS(pn) = PADNAMEf_OUTER;
+    if(PadnameIsFIELD(outer)) {
+        PadnameFIELDINFO(pn) = PadnameFIELDINFO(outer);
+        PadnameFIELDINFO(pn)->refcount++;
+        PadnameFLAGS(pn) |= PADNAMEf_FIELD;
+    }
     PadnameLEN(pn) = PadnameLEN(outer);
     return pn;
 }
@@ -2809,6 +2823,16 @@ Perl_padname_free(pTHX_ PADNAME *pn)
         SvREFCNT_dec(PadnameOURSTASH(pn));
         if (PadnameOUTER(pn))
             PadnameREFCNT_dec(PADNAME_FROM_PV(PadnamePV(pn)));
+        if (PadnameIsFIELD(pn)) {
+            struct padname_fieldinfo *info = PadnameFIELDINFO(pn);
+            if(!--info->refcount) {
+                SvREFCNT_dec(info->fieldstash);
+                /* todo: something about defop */
+                SvREFCNT_dec(info->paramname);
+
+                Safefree(info);
+            }
+        }
         Safefree(pn);
     }
 }
@@ -2851,6 +2875,18 @@ Perl_padname_dup(pTHX_ PADNAME *src, CLONE_PARAMS *param)
     PadnameTYPE   (dst) = (HV *)sv_dup_inc((SV *)PadnameTYPE(src), param);
     PadnameOURSTASH(dst) = (HV *)sv_dup_inc((SV *)PadnameOURSTASH(src),
                                             param);
+    if(PadnameIsFIELD(src) && !PadnameOUTER(src)) {
+        struct padname_fieldinfo *sinfo = PadnameFIELDINFO(src);
+        struct padname_fieldinfo *dinfo;
+        Newxz(dinfo, 1, struct padname_fieldinfo);
+
+        dinfo->refcount   = 1;
+        dinfo->fieldix    = sinfo->fieldix;
+        dinfo->fieldstash = hv_dup_inc(sinfo->fieldstash, param);
+        dinfo->paramname  = sv_dup_inc(sinfo->paramname, param);
+
+        PadnameFIELDINFO(dst) = dinfo;
+    }
     dst->xpadn_low  = src->xpadn_low;
     dst->xpadn_high = src->xpadn_high;
     dst->xpadn_gen  = src->xpadn_gen;
@@ -2859,6 +2895,91 @@ Perl_padname_dup(pTHX_ PADNAME *src, CLONE_PARAMS *param)
 
 #endif /* USE_ITHREADS */
 
+/*
+=for apidoc_section $lexer
+=for apidoc suspend_compcv
+
+Implements part of the concept of a "suspended compilation CV", which can be
+used to pause the parser and compiler during parsing a CV in order to come
+back to it later on.
+
+This function saves the current state of the subroutine under compilation
+(C<PL_compcv>) into the supplied buffer.  This should be used initially to
+create the state in the buffer, as the final thing before a C<LEAVE> within a
+block.
+
+    ENTER;
+    start_subparse(0);
+    ...
+
+    suspend_compcv(&buffer);
+    LEAVE;
+
+Once suspended, the C<resume_compcv> or C<resume_compcv_and_save> function can
+later be used to continue the parsing from the point this stopped.
+
+=cut
+*/
+
+void
+Perl_suspend_compcv(pTHX_ struct suspended_compcv *buffer)
+{
+    PERL_ARGS_ASSERT_SUSPEND_COMPCV;
+
+    buffer->compcv = PL_compcv;
+
+    buffer->padix             = PL_padix;
+    buffer->constpadix        = PL_constpadix;
+
+    buffer->comppad_name_fill = PL_comppad_name_fill;
+    buffer->min_intro_pending = PL_min_intro_pending;
+    buffer->max_intro_pending = PL_max_intro_pending;
+
+    buffer->cv_has_eval       = PL_cv_has_eval;
+    buffer->pad_reset_pending = PL_pad_reset_pending;
+}
+
+/*
+=for apidoc resume_compcv_final
+
+Resumes the parser state previously saved using the C<suspend_compcv> function
+for a final time before being compiled into a full CV.  This should be used
+within an C<ENTER>/C<LEAVE> scoped pair.
+
+=for apidoc resume_compcv_and_save
+
+Resumes a buffer previously suspended by the C<suspend_compcv> function, in a
+way that will be re-suspended at the end of the scope so it can be used again
+later.  This should be used within an C<ENTER>/C<LEAVE> scoped pair.
+
+=cut
+*/
+
+void
+Perl_resume_compcv(pTHX_ struct suspended_compcv *buffer, bool save)
+{
+    PERL_ARGS_ASSERT_RESUME_COMPCV;
+
+    SAVESPTR(PL_compcv);
+    PL_compcv = buffer->compcv;
+    PAD_SET_CUR(CvPADLIST(PL_compcv), 1);
+
+    SAVESPTR(PL_comppad_name);
+    PL_comppad_name = PadlistNAMES(CvPADLIST(PL_compcv));
+
+    SAVESTRLEN(PL_padix);             PL_padix             = buffer->padix;
+    SAVESTRLEN(PL_constpadix);        PL_constpadix        = buffer->constpadix;
+    SAVESTRLEN(PL_comppad_name_fill); PL_comppad_name_fill = buffer->comppad_name_fill;
+    SAVESTRLEN(PL_min_intro_pending); PL_min_intro_pending = buffer->min_intro_pending;
+    SAVESTRLEN(PL_max_intro_pending); PL_max_intro_pending = buffer->max_intro_pending;
+
+    SAVEBOOL(PL_cv_has_eval);       PL_cv_has_eval       = buffer->cv_has_eval;
+    SAVEBOOL(PL_pad_reset_pending); PL_pad_reset_pending = buffer->pad_reset_pending;
+
+    if(save)
+        SAVEDESTRUCTOR_X(&Perl_suspend_compcv, buffer);
+}
+
 /*
  * ex: set ts=8 sts=4 sw=4 et:
  */
index 07c4d86..8f339ae 100644 (file)
@@ -23,8 +23,9 @@ typedef SSize_t PADOFFSET; /* signed so that -1 is a valid value */
 struct padlist {
     SSize_t    xpadl_max;      /* max index for which array has space */
     union {
-        PAD ** xpadlarr_alloc; /* Pointer to beginning of array of AVs.
-                                   index 0 is a padnamelist *          */
+        PAD **  xpadlarr_alloc; /* Pointer to beginning of array of AVs.
+                                   Note that a 'padnamelist *' is stored
+                                   in the 0 index of the AV. */
         struct {
             PADNAMELIST * padnl;
             PAD * pad_1;        /* this slice of PAD * array always alloced */
@@ -54,6 +55,8 @@ struct padnamelist {
 #  define PERL_PADNAME_MINIMAL
 #endif
 
+struct padname_fieldinfo;
+
 #define _PADNAME_BASE \
     char *     xpadn_pv;               \
     HV *       xpadn_ourstash;         \
@@ -61,6 +64,7 @@ struct padnamelist {
         HV *   xpadn_typestash;        \
         CV *   xpadn_protocv;          \
     } xpadn_type_u;                    \
+    struct padname_fieldinfo *xpadn_fieldinfo; \
     U32                xpadn_low;              \
     U32                xpadn_high;             \
     U32                xpadn_refcnt;           \
@@ -86,6 +90,19 @@ struct padname_with_str {
 #define PADNAME_FROM_PV(s) \
     ((PADNAME *)((s) - STRUCT_OFFSET(struct padname_with_str, xpadn_str)))
 
+/* Most padnames are not field names. Keep all the field-related info in its
+ * own substructure, stored in ->xpadn_fieldinfo.
+ */
+struct padname_fieldinfo {
+    U32        refcount;
+    PADOFFSET  fieldix;    /* index of this field within ObjectFIELDS() array */
+    HV        *fieldstash; /* original class package which added this field */
+    OP        *defop;      /* optree fragment for defaulting expression */
+    SV        *paramname;  /* name of the :param to look for in constructor */
+    int        def_if_undef : 1; /* default op uses //= */
+    int        def_if_false : 1; /* default op uses ||= */
+};
+
 
 /* a value that PL_cop_seqmax is guaranteed never to be,
  * flagging that a lexical is being introduced, or has not yet left scope
@@ -131,6 +148,8 @@ typedef enum {
 #define padadd_NO_DUP_CHECK    0x04       /* skip warning on dups. */
 #define padadd_STALEOK         0x08       /* allow stale lexical in active
                                             * sub, but only one level up */
+#define padadd_FIELD            0x10       /* set PADNAMEt_FIELD */
+#define padfind_FIELD_OK        0x20       /* pad_findlex is permitted to see fields */
 
 /* ASSERT_CURPAD_LEGAL and ASSERT_CURPAD_ACTIVE respectively determine
  * whether PL_comppad and PL_curpad are consistent and whether they have
@@ -160,8 +179,9 @@ typedef enum {
 
 /* Note: the following three macros are actually defined in scope.h, but
  * they are documented here for completeness, since they directly or
- * indirectly affect pads.
+ * indirectly affect pads. */
 
+/*
 =for apidoc m|void|SAVEPADSV   |PADOFFSET po
 Save a pad slot (used to restore after an iteration)
 
@@ -242,6 +262,10 @@ are often referred to as 'fake'.
 =for apidoc m|bool|PadnameIsSTATE|PADNAME * pn
 Whether this is a "state" variable.
 
+=for apidoc m|bool|PadnameIsFIELD|PADNAME * pn
+Whether this is a "field" variable.  PADNAMEs where this is true will
+have additional information available via C<PadnameFIELDINFO>.
+
 =for apidoc m|HV *|PadnameTYPE|PADNAME * pn
 The stash associated with a typed lexical.  This returns the C<%Foo::> hash
 for C<my Foo $bar>.
@@ -249,6 +273,9 @@ for C<my Foo $bar>.
 =for apidoc Amx|SSize_t|PadnameREFCNT|PADNAME * pn
 The reference count of the pad name.
 
+=for apidoc Amx|PADNAME *|PadnameREFCNT_inc|PADNAME * pn
+Increases the reference count of the pad name.  Returns the pad name itself.
+
 =for apidoc Amx|void|PadnameREFCNT_dec|PADNAME * pn
 Lowers the reference count of the pad name.
 
@@ -304,6 +331,7 @@ Restore the old pad saved into the local variable C<opad> by C<PAD_SAVE_LOCAL()>
 #define PadnamelistMAX(pnl)            (pnl)->xpadnl_fill
 #define PadnamelistMAXNAMED(pnl)       (pnl)->xpadnl_max_named
 #define PadnamelistREFCNT(pnl)         (pnl)->xpadnl_refcnt
+#define PadnamelistREFCNT_inc(pnl)      Perl_padnamelist_refcnt_inc(pnl)
 #define PadnamelistREFCNT_dec(pnl)     Perl_padnamelist_free(aTHX_ pnl)
 
 #define PadARRAY(pad)          AvARRAY(pad)
@@ -315,39 +343,56 @@ Restore the old pad saved into the local variable C<opad> by C<PAD_SAVE_LOCAL()>
 #define PadnameSV(pn) \
         newSVpvn_flags(PadnamePV(pn), PadnameLEN(pn), SVs_TEMP|SVf_UTF8)
 #define PadnameFLAGS(pn)       (pn)->xpadn_flags
-#define PadnameIsOUR(pn)       (!!(pn)->xpadn_ourstash)
+#define PadnameIsOUR(pn)       cBOOL((pn)->xpadn_ourstash)
 #define PadnameOURSTASH(pn)    (pn)->xpadn_ourstash
 #define PadnameTYPE(pn)                (pn)->xpadn_type_u.xpadn_typestash
+#define PadnameHasTYPE(pn)      cBOOL(PadnameTYPE(pn))
 #define PadnamePROTOCV(pn)     (pn)->xpadn_type_u.xpadn_protocv
 #define PadnameREFCNT(pn)      (pn)->xpadn_refcnt
+#define PadnameREFCNT_inc(pn)   Perl_padname_refcnt_inc(pn)
 #define PadnameREFCNT_dec(pn)  Perl_padname_free(aTHX_ pn)
 #define PadnameOURSTASH_set(pn,s) (PadnameOURSTASH(pn) = (s))
 #define PadnameTYPE_set(pn,s)    (PadnameTYPE(pn) = (s))
-#define PadnameOUTER(pn)       (PadnameFLAGS(pn) & PADNAMEt_OUTER)
-#define PadnameIsSTATE(pn)     (PadnameFLAGS(pn) & PADNAMEt_STATE)
-#define PadnameLVALUE(pn)      (PadnameFLAGS(pn) & PADNAMEt_LVALUE)
-
-#define PadnameLVALUE_on(pn)   (PadnameFLAGS(pn) |= PADNAMEt_LVALUE)
-#define PadnameIsSTATE_on(pn)  (PadnameFLAGS(pn) |= PADNAMEt_STATE)
-
-#define PADNAMEt_OUTER 1       /* outer lexical var */
-#define PADNAMEt_STATE 2       /* state var */
-#define PADNAMEt_LVALUE        4       /* used as lvalue */
-#define PADNAMEt_TYPED 8       /* for B; unused by core */
-#define PADNAMEt_OUR   16      /* for B; unused by core */
+#define PadnameFIELDINFO(pn)    (pn)->xpadn_fieldinfo
+#define PadnameOUTER(pn)       (PadnameFLAGS(pn) & PADNAMEf_OUTER)
+#define PadnameIsSTATE(pn)     (PadnameFLAGS(pn) & PADNAMEf_STATE)
+#define PadnameLVALUE(pn)      (PadnameFLAGS(pn) & PADNAMEf_LVALUE)
+#define PadnameIsFIELD(pn)     (PadnameFLAGS(pn) & PADNAMEf_FIELD)
+
+#define PadnameLVALUE_on(pn)   (PadnameFLAGS(pn) |= PADNAMEf_LVALUE)
+#define PadnameIsSTATE_on(pn)  (PadnameFLAGS(pn) |= PADNAMEf_STATE)
+
+#define PADNAMEf_OUTER 0x01    /* outer lexical var */
+#define PADNAMEf_STATE 0x02    /* state var */
+#define PADNAMEf_LVALUE        0x04    /* used as lvalue */
+#define PADNAMEf_TYPED 0x08    /* for B; unused by core */
+#define PADNAMEf_OUR   0x10    /* for B; unused by core */
+#define PADNAMEf_FIELD  0x20    /* field var */
 
 /* backward compatibility */
-#define SvPAD_STATE            PadnameIsSTATE
-#define SvPAD_TYPED(pn)                (!!PadnameTYPE(pn))
-#define SvPAD_OUR(pn)          (!!PadnameOURSTASH(pn))
-#define SvPAD_STATE_on         PadnameIsSTATE_on
-#define SvPAD_TYPED_on(pn)     (PadnameFLAGS(pn) |= PADNAMEt_TYPED)
-#define SvPAD_OUR_on(pn)       (PadnameFLAGS(pn) |= PADNAMEt_OUR)
-#define SvOURSTASH             PadnameOURSTASH
-#define SvOURSTASH_set         PadnameOURSTASH_set
-#define SVpad_STATE            PADNAMEt_STATE
-#define SVpad_TYPED            PADNAMEt_TYPED
-#define SVpad_OUR              PADNAMEt_OUR
+#ifndef PERL_CORE
+#  define SvPAD_STATE           PadnameIsSTATE
+#  define SvPAD_TYPED           PadnameHasTYPE
+#  define SvPAD_OUR(pn)         cBOOL(PadnameOURSTASH(pn))
+#  define SvPAD_STATE_on        PadnameIsSTATE_on
+#  define SvPAD_TYPED_on(pn)    (PadnameFLAGS(pn) |= PADNAMEf_TYPED)
+#  define SvPAD_OUR_on(pn)      (PadnameFLAGS(pn) |= PADNAMEf_OUR)
+#  define SvOURSTASH            PadnameOURSTASH
+#  define SvOURSTASH_set        PadnameOURSTASH_set
+#  define SVpad_STATE           PADNAMEf_STATE
+#  define SVpad_TYPED           PADNAMEf_TYPED
+#  define SVpad_OUR             PADNAMEf_OUR
+#  define PADNAMEt_OUTER        PADNAMEf_OUTER
+#  define PADNAMEt_STATE        PADNAMEf_STATE
+#  define PADNAMEt_LVALUE       PADNAMEf_LVALUE
+#  define PADNAMEt_TYPED        PADNAMEf_TYPED
+#  define PADNAMEt_OUR          PADNAMEf_OUR
+#endif
+
+#ifdef USE_ITHREADS
+#  define padnamelist_dup_inc(pnl,param)  PadnamelistREFCNT_inc(padnamelist_dup(pnl,param))
+#  define padname_dup_inc(pn,param)       PadnameREFCNT_inc(padname_dup(pn,param))
+#endif
 
 #ifdef DEBUGGING
 #  define PAD_SV(po)      pad_sv(po)
@@ -445,13 +490,12 @@ ling pad (lvalue) to C<gen>.
 #define PAD_COMPNAME(po)       PAD_COMPNAME_SV(po)
 #define PAD_COMPNAME_SV(po)    (PadnamelistARRAY(PL_comppad_name)[(po)])
 #define PAD_COMPNAME_FLAGS(po) PadnameFLAGS(PAD_COMPNAME(po))
-#define PAD_COMPNAME_FLAGS_isOUR(po) SvPAD_OUR(PAD_COMPNAME_SV(po))
+#define PAD_COMPNAME_FLAGS_isOUR(po) PadnameIsOUR(PAD_COMPNAME_SV(po))
 #define PAD_COMPNAME_PV(po)    PadnamePV(PAD_COMPNAME(po))
 
 #define PAD_COMPNAME_TYPE(po)  PadnameTYPE(PAD_COMPNAME(po))
 
-#define PAD_COMPNAME_OURSTASH(po) \
-    (SvOURSTASH(PAD_COMPNAME_SV(po)))
+#define PAD_COMPNAME_OURSTASH(po)  (PadnameOURSTASH(PAD_COMPNAME_SV(po)))
 
 #define PAD_COMPNAME_GEN(po) \
     ((STRLEN)PadnamelistARRAY(PL_comppad_name)[po]->xpadn_gen)
@@ -513,6 +557,18 @@ instead of a string/length pair.
 #define pad_findmy_pvs(name,flags) \
     Perl_pad_findmy_pvn(aTHX_ STR_WITH_LEN(name), flags)
 
+struct suspended_compcv
+{
+    CV *compcv;
+    STRLEN padix, constpadix;
+    STRLEN comppad_name_fill;
+    STRLEN min_intro_pending, max_intro_pending;
+    bool cv_has_eval, pad_reset_pending;
+};
+
+#define resume_compcv_final(buffer)     Perl_resume_compcv(aTHX_ buffer, false)
+#define resume_compcv_and_save(buffer)  Perl_resume_compcv(aTHX_ buffer, true)
+
 /*
  * ex: set ts=8 sts=4 sw=4 et:
  */
index 52a8d53..9bd928b 100644 (file)
@@ -38,8 +38,8 @@ Instead use one of the version comparison macros.  See C<L</PERL_VERSION_EQ>>.
  * exactly on the third column */
 
 #define PERL_REVISION  5               /* age */
-#define PERL_VERSION   36              /* epoch */
-#define PERL_SUBVERSION        3               /* generation */
+#define PERL_VERSION   38              /* epoch */
+#define PERL_SUBVERSION        2               /* generation */
 
 /* The following numbers describe the earliest compatible version of
    Perl ("compatibility" here being defined as sufficient binary/API
@@ -59,7 +59,7 @@ Instead use one of the version comparison macros.  See C<L</PERL_VERSION_EQ>>.
    changing them should not be necessary.
 */
 #define PERL_API_REVISION      5
-#define PERL_API_VERSION       36
+#define PERL_API_VERSION       38
 #define PERL_API_SUBVERSION    0
 /*
    XXX Note:  The selection of non-default Configure options, such
@@ -118,11 +118,12 @@ open PLIN, "<", "patchlevel.h" or die "Couldn't open patchlevel.h : $!";
 open PLOUT, ">", "patchlevel.new" or die "Couldn't write on patchlevel.new : $!";
 my $seen=0;
 while (<PLIN>) {
-    if (/\t,NULL/ and $seen) {
+    if (/^(\s+),NULL/ and $seen) {
+       my $pre = $1;
        while (my $c = shift @ARGV){
             $c =~ s|\\|\\\\|g;
             $c =~ s|"|\\"|g;
-            print PLOUT qq{\t,"$c"\n};
+            print PLOUT qq{$pre,"$c"\n};
        }
     }
     $seen++ if /local_patches\[\]/;
@@ -153,7 +154,7 @@ hunk.
 #    define PERL_PATCHNUM "UNKNOWN-microperl"
 #    define PERL_GIT_UNPUSHED_COMMITS /*leave-this-comment*/
 #  else
-#include "git_version.h"
+#    include "git_version.h"
 #  endif
 static const char * const local_patches[] = {
         NULL
@@ -167,7 +168,7 @@ static const char * const local_patches[] = {
 
 
 /* Initial space prevents this variable from being inserted in config.sh  */
-#  define      LOCAL_PATCH_COUNT       \
+#  define LOCAL_PATCH_COUNT     \
         ((int)(C_ARRAY_LENGTH(local_patches)-2))
 
 /* the old terms of reference, add them only when explicitly included */
index f6d9bd9..a8d92ae 100644 (file)
@@ -67,12 +67,6 @@ static I32 read_e_script(pTHX_ int idx, SV *buf_sv, int maxlen);
 #  define validate_suid(rsfp) S_validate_suid(aTHX_ rsfp)
 #endif
 
-#define CALL_BODY_SUB(myop) \
-    if (PL_op == (myop)) \
-        PL_op = PL_ppaddr[OP_ENTERSUB](aTHX); \
-    if (PL_op) \
-        CALLRUNOPS(aTHX);
-
 #define CALL_LIST_BODY(cv) \
     PUSHMARK(PL_stack_sp); \
     call_sv(MUTABLE_SV((cv)), G_EVAL|G_DISCARD|G_VOID);
@@ -108,6 +102,34 @@ S_init_tls_and_interp(PerlInterpreter *my_perl)
 }
 
 
+#ifndef PLATFORM_SYS_INIT_
+#  define PLATFORM_SYS_INIT_  NOOP
+#endif
+
+#ifndef PLATFORM_SYS_TERM_
+#  define PLATFORM_SYS_TERM_  NOOP
+#endif
+
+#ifndef PERL_SYS_INIT_BODY
+#  define PERL_SYS_INIT_BODY(c,v)                               \
+        MALLOC_CHECK_TAINT2(*c,*v) PERL_FPU_INIT; PERLIO_INIT;  \
+        MALLOC_INIT; PLATFORM_SYS_INIT_;
+#endif
+
+/* Generally add things last-in first-terminated.  IO and memory terminations
+ * need to be generally last
+ *
+ * BEWARE that using PerlIO in these will be using freed memory, so may appear
+ * to work, but must NOT be retained in production code. */
+#ifndef PERL_SYS_TERM_BODY
+#  define PERL_SYS_TERM_BODY()                                          \
+                    ENV_TERM; USER_PROP_MUTEX_TERM; LOCALE_TERM;        \
+                    HINTS_REFCNT_TERM; KEYWORD_PLUGIN_MUTEX_TERM;       \
+                    OP_CHECK_MUTEX_TERM; OP_REFCNT_TERM;                \
+                    PERLIO_TERM; MALLOC_TERM;                           \
+                    PLATFORM_SYS_TERM_;
+#endif
+
 /* these implement the PERL_SYS_INIT, PERL_SYS_INIT3, PERL_SYS_TERM macros */
 
 void
@@ -238,20 +260,43 @@ perl_construct(pTHXx)
 
     init_stacks();
 
-/* The PERL_INTERNAL_RAND_SEED set-up must be after init_stacks because it calls
+#if !defined(NO_PERL_RAND_SEED) || !defined(NO_PERL_INTERNAL_HASH_SEED)
+    bool sensitive_env_vars_allowed =
+            (PerlProc_getuid() == PerlProc_geteuid() &&
+             PerlProc_getgid() == PerlProc_getegid()) ? TRUE : FALSE;
+#endif
+
+/* The seed set-up must be after init_stacks because it calls
  * things that may put SVs on the stack.
  */
+#ifndef NO_PERL_RAND_SEED
+    if (sensitive_env_vars_allowed) {
+        UV seed= 0;
+        const char *env_pv;
+        if ((env_pv = PerlEnv_getenv("PERL_RAND_SEED")) &&
+            grok_number(env_pv, strlen(env_pv), &seed) == IS_NUMBER_IN_UV)
+        {
+
+            PL_srand_override_next = seed;
+            PERL_SRAND_OVERRIDE_NEXT_INIT();
+        }
+    }
+#endif
 
+    /* This is NOT the state used for C<rand()>, this is only
+     * used in internal functionality */
 #ifdef NO_PERL_INTERNAL_RAND_SEED
     Perl_drand48_init_r(&PL_internal_random_state, seed());
 #else
     {
         UV seed;
         const char *env_pv;
-        if (PerlProc_getuid() != PerlProc_geteuid() ||
-            PerlProc_getgid() != PerlProc_getegid() ||
+        if (
+            !sensitive_env_vars_allowed ||
             !(env_pv = PerlEnv_getenv("PERL_INTERNAL_RAND_SEED")) ||
-            grok_number(env_pv, strlen(env_pv), &seed) != IS_NUMBER_IN_UV) {
+            grok_number(env_pv, strlen(env_pv), &seed) != IS_NUMBER_IN_UV)
+        {
+            /* use a randomly generated seed */
             seed = seed();
         }
         Perl_drand48_init_r(&PL_internal_random_state, (U32)seed);
@@ -337,7 +382,7 @@ perl_construct(pTHXx)
             PERL_HASH_WITH_STATE(PL_hash_state,PL_hash_chars[256],str,0);
         }
 #endif
-        /* at this point we have initialezed the hash function, and we can start
+        /* at this point we have initialized the hash function, and we can start
          * constructing hashes */
         PL_hash_seed_set= TRUE;
     }
@@ -356,11 +401,17 @@ perl_construct(pTHXx)
         hv_ksplit(PL_strtab, 1 << 11);
     }
 
+#ifdef USE_ITHREADS
+    PL_compiling.cop_file = NULL;
+    PL_compiling.cop_warnings = NULL;
+#endif
+
     Zero(PL_sv_consts, SV_CONSTS_COUNT, SV*);
 
 #ifndef PERL_MICRO
 #   ifdef  USE_ENVIRON_ARRAY
-    PL_origenviron = environ;
+    if (!PL_origenviron)
+        PL_origenviron = environ;
 #   endif
 #endif
 
@@ -410,10 +461,6 @@ perl_construct(pTHXx)
     /* Start with 1 bucket, for DFS.  It's unlikely we'll need more.  */
     HvMAX(PL_registered_mros) = 0;
 
-#ifdef USE_POSIX_2008_LOCALE
-    PL_C_locale_obj = newlocale(LC_ALL_MASK, "C", NULL);
-#endif
-
     ENTER;
     init_i18nl10n(1);
 }
@@ -583,9 +630,6 @@ perl_destruct(pTHXx)
 
     assert(PL_scopestack_ix == 1);
 
-    /* wait for all pseudo-forked children to finish */
-    PERL_WAIT_FOR_CHILDREN;
-
     destruct_level = PL_perl_destruct_level;
     {
         const char * const s = PerlEnv_getenv("PERL_DESTRUCT_LEVEL");
@@ -624,6 +668,10 @@ perl_destruct(pTHXx)
     FREETMPS;
     assert(PL_scopestack_ix == 0);
 
+    /* wait for all pseudo-forked children to finish */
+    PERL_WAIT_FOR_CHILDREN;
+
+
     /* normally when we get here, PL_parser should be null due to having
      * its original (null) value restored by SAVEt_PARSER during leaving
      * scope (usually before run-time starts in fact).
@@ -884,6 +932,10 @@ perl_destruct(pTHXx)
     PL_warnhook = NULL;
     SvREFCNT_dec(PL_diehook);
     PL_diehook = NULL;
+    SvREFCNT_dec(PL_hook__require__before);
+    PL_hook__require__before = NULL;
+    SvREFCNT_dec(PL_hook__require__after);
+    PL_hook__require__after = NULL;
 
     /* call exit list functions */
     while (PL_exitlistlen-- > 0)
@@ -896,32 +948,6 @@ perl_destruct(pTHXx)
 
     SvREFCNT_dec(PL_registered_mros);
 
-    /* jettison our possibly duplicated environment */
-    /* if PERL_USE_SAFE_PUTENV is defined environ will not have been copied
-     * so we certainly shouldn't free it here
-     */
-#ifndef PERL_MICRO
-#if defined(USE_ENVIRON_ARRAY) && !defined(PERL_USE_SAFE_PUTENV)
-    if (environ != PL_origenviron && !PL_use_safe_putenv
-#ifdef USE_ITHREADS
-        /* only main thread can free environ[0] contents */
-        && PL_curinterp == aTHX
-#endif
-        )
-    {
-        I32 i;
-
-        for (i = 0; environ[i]; i++)
-            safesysfree(environ[i]);
-
-        /* Must use safesysfree() when working with environ. */
-        safesysfree(environ);
-
-        environ = PL_origenviron;
-    }
-#endif
-#endif /* !PERL_MICRO */
-
     if (destruct_level == 0) {
 
         DEBUG_P(debprofdump());
@@ -1096,29 +1122,44 @@ perl_destruct(pTHXx)
     Safefree(PL_collation_name);
     PL_collation_name = NULL;
 #endif
-#if   defined(USE_POSIX_2008_LOCALE)      \
- &&   defined(USE_THREAD_SAFE_LOCALE)     \
- && ! defined(HAS_QUERYLOCALE)
+#if defined(USE_PL_CURLOCALES)
     for (i = 0; i < (int) C_ARRAY_LENGTH(PL_curlocales); i++) {
         Safefree(PL_curlocales[i]);
         PL_curlocales[i] = NULL;
     }
 #endif
-#ifdef HAS_POSIX_2008_LOCALE
+#ifdef USE_POSIX_2008_LOCALE
     {
         /* This also makes sure we aren't using a locale object that gets freed
          * below */
-        const locale_t old_locale = uselocale(LC_GLOBAL_LOCALE);
-        if (   old_locale != LC_GLOBAL_LOCALE
-#  ifdef USE_POSIX_2008_LOCALE
-            && old_locale != PL_C_locale_obj
-#  endif
+        if (   PL_cur_locale_obj != NULL
+            && PL_cur_locale_obj != LC_GLOBAL_LOCALE
+            && PL_cur_locale_obj != PL_C_locale_obj
         ) {
-            DEBUG_Lv(PerlIO_printf(Perl_debug_log,
-                     "%s:%d: Freeing %p\n", __FILE__, __LINE__, old_locale));
-            freelocale(old_locale);
+            locale_t cur_locale = uselocale((locale_t) 0);
+            if (cur_locale == PL_cur_locale_obj) {
+                uselocale(LC_GLOBAL_LOCALE);
+            }
+
+            freelocale(PL_cur_locale_obj);
+            PL_cur_locale_obj = NULL;
         }
     }
+
+#  ifdef USE_PL_CUR_LC_ALL
+
+    if (PL_cur_LC_ALL) {
+        DEBUG_L( PerlIO_printf(Perl_debug_log, "PL_cur_LC_ALL=%p\n", PL_cur_LC_ALL));
+        Safefree(PL_cur_LC_ALL);
+        PL_cur_LC_ALL = NULL;
+    }
+
+#  endif
+
+    if (PL_scratch_locale_obj) {
+        freelocale(PL_scratch_locale_obj);
+        PL_scratch_locale_obj = NULL;
+    }
 #  ifdef USE_LOCALE_NUMERIC
     if (PL_underlying_numeric_obj) {
         DEBUG_Lv(PerlIO_printf(Perl_debug_log,
@@ -1134,6 +1175,12 @@ perl_destruct(pTHXx)
     PL_numeric_name = NULL;
     SvREFCNT_dec(PL_numeric_radix_sv);
     PL_numeric_radix_sv = NULL;
+    SvREFCNT_dec(PL_underlying_radix_sv);
+    PL_underlying_radix_sv  = NULL;
+#endif
+#ifdef USE_LOCALE_CTYPE
+    Safefree(PL_ctype_name);
+    PL_ctype_name = NULL;
 #endif
 
     if (PL_setlocale_buf) {
@@ -1146,6 +1193,11 @@ perl_destruct(pTHXx)
         PL_langinfo_buf = NULL;
     }
 
+    if (PL_stdize_locale_buf) {
+        Safefree(PL_stdize_locale_buf);
+        PL_stdize_locale_buf = NULL;
+    }
+
 #ifdef USE_LOCALE_CTYPE
     SvREFCNT_dec(PL_warn_locale);
     PL_warn_locale       = NULL;
@@ -1216,7 +1268,7 @@ perl_destruct(pTHXx)
         SvREFCNT_dec(PL_XPosix_ptrs[i]);
         PL_XPosix_ptrs[i] = NULL;
 
-        if (i != _CC_CASED) {   /* A copy of Alpha */
+        if (i != CC_CASED_) {   /* A copy of Alpha */
             SvREFCNT_dec(PL_Posix_ptrs[i]);
             PL_Posix_ptrs[i] = NULL;
         }
@@ -1377,7 +1429,7 @@ perl_destruct(pTHXx)
         for (sva = PL_sv_arenaroot; sva; sva = MUTABLE_SV(SvANY(sva))) {
             svend = &sva[SvREFCNT(sva)];
             for (sv = sva + 1; sv < svend; ++sv) {
-                if (SvTYPE(sv) != (svtype)SVTYPEMASK) {
+                if (!SvIS_FREED(sv)) {
                     PerlIO_printf(Perl_debug_log, "leaked: sv=0x%p"
                         " flags=0x%" UVxf
                         " refcnt=%" UVuf pTHX__FORMAT "\n"
@@ -1608,6 +1660,48 @@ Perl_call_atexit(pTHX_ ATEXIT_t fn, void *ptr)
     ++PL_exitlistlen;
 }
 
+#ifdef USE_ENVIRON_ARRAY
+static void
+dup_environ(pTHX)
+{
+#  ifdef USE_ITHREADS
+    if (aTHX != PL_curinterp)
+        return;
+#  endif
+    if (!environ)
+        return;
+
+    size_t n_entries = 0, vars_size = 0;
+
+    for (char **ep = environ; *ep; ++ep) {
+        ++n_entries;
+        vars_size += strlen(*ep) + 1;
+    }
+
+    /* To save memory, we store both the environ array and its values in a
+     * single memory block. */
+    char **new_environ = (char**)PerlMemShared_malloc(
+        (sizeof(char*) * (n_entries + 1)) + vars_size
+    );
+    char *vars = (char*)(new_environ + n_entries + 1);
+
+    for (size_t i = 0, copied = 0; n_entries > i; ++i) {
+        size_t len = strlen(environ[i]) + 1;
+        new_environ[i] = (char *) CopyD(environ[i], vars + copied, len, char);
+        copied += len;
+    }
+    new_environ[n_entries] = NULL;
+
+    environ = new_environ;
+    /* Store a pointer in a global variable to ensure it's always reachable so
+     * LeakSanitizer/Valgrind won't complain about it. We can't ever free it.
+     * Even if libc allocates a new environ, it's possible that some of its
+     * values will still be pointing to the old environ.
+     */
+    PL_my_environ = new_environ;
+}
+#endif
+
 /*
 =for apidoc perl_parse
 
@@ -1654,16 +1748,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
 */
@@ -1753,9 +1844,9 @@ perl_parse(pTHXx_ XSINIT_t xsinit, int argc, char **argv, char **env)
               }
          }
 
-#ifndef PERL_USE_SAFE_PUTENV
+#ifdef USE_ENVIRON_ARRAY
          /* Can we grab env area too to be used as the area for $0? */
-         if (s && PL_origenviron && !PL_use_safe_putenv) {
+         if (s && PL_origenviron) {
               if ((PL_origenviron[0] == s + 1)
                   ||
                   (aligned &&
@@ -1769,8 +1860,11 @@ perl_parse(pTHXx_ XSINIT_t xsinit, int argc, char **argv, char **env)
                    s = PL_origenviron[0];
                    while (*s) s++;
 #endif
-                   my_setenv("NoNe  SuCh", NULL);
+
                    /* Force copy of environment. */
+                   if (PL_origenviron == environ)
+                       dup_environ(aTHX);
+
                    for (i = 1; PL_origenviron[i]; i++) {
                         if (PL_origenviron[i] == s + 1
                             ||
@@ -1788,7 +1882,7 @@ perl_parse(pTHXx_ XSINIT_t xsinit, int argc, char **argv, char **env)
                    }
               }
          }
-#endif /* !defined(PERL_USE_SAFE_PUTENV) */
+#endif /* USE_ENVIRON_ARRAY */
 
          PL_origalen = s ? s - PL_origargv[0] + 1 : 0;
     }
@@ -1853,12 +1947,11 @@ perl_parse(pTHXx_ XSINIT_t xsinit, int argc, char **argv, char **env)
         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].
+             * We do this here to avoid [perl #2754].
+             * Note this may cause trouble with Module::Install.
+             * See: [perl #132577].
              */
+            ret = 0x100;
         }
         break;
     case 3:
@@ -1875,6 +1968,7 @@ perl_parse(pTHXx_ XSINIT_t xsinit, int argc, char **argv, char **env)
 
 /* What this returns is subject to change.  Use the public interface in Config.
  */
+
 static void
 S_Internals_V(pTHX_ CV *cv)
 {
@@ -1886,15 +1980,26 @@ S_Internals_V(pTHX_ CV *cv)
 #endif
     const int entries = 3 + local_patch_count;
     int i;
+    /* NOTE - This list must remain sorted. Do not put any settings here
+     * which affect binary compatibility */
     static const char non_bincompat_options[] =
 #  ifdef DEBUGGING
                              " DEBUGGING"
 #  endif
+#  ifdef HAS_LONG_DOUBLE
+                             " HAS_LONG_DOUBLE"
+#  endif
+#  ifdef HAS_STRTOLD
+                             " HAS_STRTOLD"
+#  endif
 #  ifdef NO_MATHOMS
                              " NO_MATHOMS"
 #  endif
-#  ifdef NO_HASH_SEED
-                             " NO_HASH_SEED"
+#  ifdef NO_PERL_INTERNAL_RAND_SEED
+                             " NO_PERL_INTERNAL_RAND_SEED"
+#  endif
+#  ifdef NO_PERL_RAND_SEED
+                             " NO_PERL_RAND_SEED"
 #  endif
 #  ifdef NO_TAINT_SUPPORT
                              " NO_TAINT_SUPPORT"
@@ -1911,30 +2016,6 @@ S_Internals_V(pTHX_ CV *cv)
 #  ifdef PERL_EXTERNAL_GLOB
                              " PERL_EXTERNAL_GLOB"
 #  endif
-#  ifdef PERL_HASH_FUNC_SIPHASH
-                             " PERL_HASH_FUNC_SIPHASH"
-#  endif
-#  ifdef PERL_HASH_FUNC_SDBM
-                             " PERL_HASH_FUNC_SDBM"
-#  endif
-#  ifdef PERL_HASH_FUNC_DJB2
-                             " PERL_HASH_FUNC_DJB2"
-#  endif
-#  ifdef PERL_HASH_FUNC_SUPERFAST
-                             " PERL_HASH_FUNC_SUPERFAST"
-#  endif
-#  ifdef PERL_HASH_FUNC_MURMUR3
-                             " PERL_HASH_FUNC_MURMUR3"
-#  endif
-#  ifdef PERL_HASH_FUNC_ONE_AT_A_TIME
-                             " PERL_HASH_FUNC_ONE_AT_A_TIME"
-#  endif
-#  ifdef PERL_HASH_FUNC_ONE_AT_A_TIME_HARD
-                             " PERL_HASH_FUNC_ONE_AT_A_TIME_HARD"
-#  endif
-#  ifdef PERL_HASH_FUNC_ONE_AT_A_TIME_OLD
-                             " PERL_HASH_FUNC_ONE_AT_A_TIME_OLD"
-#  endif
 #  ifdef PERL_IS_MINIPERL
                              " PERL_IS_MINIPERL"
 #  endif
@@ -1971,6 +2052,7 @@ S_Internals_V(pTHX_ CV *cv)
 #  ifdef PERL_USE_SAFE_PUTENV
                              " PERL_USE_SAFE_PUTENV"
 #  endif
+
 #  ifdef PERL_USE_UNSHARED_KEYS_IN_LARGE_HASHES
                              " PERL_USE_UNSHARED_KEYS_IN_LARGE_HASHES"
 #  endif
@@ -2004,7 +2086,8 @@ S_Internals_V(pTHX_ CV *cv)
 #  ifdef USE_THREAD_SAFE_LOCALE
                              " USE_THREAD_SAFE_LOCALE"
 #  endif
-        ;
+    ""; /* keep this on a line by itself, WITH the empty string */
+
     PERL_UNUSED_ARG(cv);
     PERL_UNUSED_VAR(items);
 
@@ -2025,8 +2108,6 @@ S_Internals_V(pTHX_ CV *cv)
 #  endif
 #endif
 
-#undef PERL_BUILD_DATE
-
 #ifdef PERL_BUILD_DATE
     PUSHs(Perl_newSVpvn_flags(aTHX_
                               STR_WITH_LEN("Compiled at " PERL_BUILD_DATE),
@@ -2536,7 +2617,7 @@ S_parse_body(pTHX_ char **env, XSINIT_t xsinit)
 
     SETERRNO(0,SS_NORMAL);
     if (yyparse(GRAMPROG) || PL_parser->error_count) {
-        abort_execution("", PL_origfilename);
+        abort_execution(NULL, PL_origfilename);
     }
     CopLINE_set(PL_curcop, 0);
     SET_CURSTASH(PL_defstash);
@@ -2712,6 +2793,14 @@ S_run_body(pTHX_ I32 oldscope)
     PERL_SET_PHASE(PERL_PHASE_RUN);
 
     if (PL_restartop) {
+#ifdef DEBUGGING
+        /* this complements the "EXECUTING..." debug we emit above.
+         * it will show up when an eval fails in the main program level
+         * and the code continues after the error.
+         */
+        if (!DEBUG_q_TEST)
+          PERL_DEBUG(PerlIO_printf(Perl_debug_log, "\nCONTINUING...\n\n"));
+#endif
         PL_restartjmpenv = NULL;
         PL_op = PL_restartop;
         PL_restartop = 0;
@@ -2761,7 +2850,8 @@ Returns the AV of the specified Perl global or package array with the given
 name (so it won't work on lexical variables).  C<flags> are passed
 to C<gv_fetchpv>.  If C<GV_ADD> is set and the
 Perl variable does not exist then it will be created.  If C<flags> is zero
-and the variable does not exist then NULL is returned.
+(ignoring C<SVf_UTF8>) and the variable does not exist then C<NULL> is
+returned.
 
 Perl equivalent: C<@{"$name"}>.
 
@@ -2775,7 +2865,7 @@ Perl_get_av(pTHX_ const char *name, I32 flags)
 
     PERL_ARGS_ASSERT_GET_AV;
 
-    if (flags)
+    if (flags & ~SVf_UTF8)
         return GvAVn(gv);
     if (gv)
         return GvAV(gv);
@@ -2790,7 +2880,8 @@ Perl_get_av(pTHX_ const char *name, I32 flags)
 Returns the HV of the specified Perl hash.  C<flags> are passed to
 C<gv_fetchpv>.  If C<GV_ADD> is set and the
 Perl variable does not exist then it will be created.  If C<flags> is zero
-and the variable does not exist then C<NULL> is returned.
+(ignoring C<SVf_UTF8>) and the variable does not exist then C<NULL> is
+returned.
 
 =cut
 */
@@ -2802,7 +2893,7 @@ Perl_get_hv(pTHX_ const char *name, I32 flags)
 
     PERL_ARGS_ASSERT_GET_HV;
 
-    if (flags)
+    if (flags & ~SVf_UTF8)
         return GvHVn(gv);
     if (gv)
         return GvHV(gv);
@@ -2812,9 +2903,9 @@ Perl_get_hv(pTHX_ const char *name, I32 flags)
 /*
 =for apidoc_section $CV
 
-=for apidoc get_cv
+=for apidoc            get_cv
+=for apidoc_item       get_cvn_flags
 =for apidoc_item |CV *|get_cvs|"string"|I32 flags
-=for apidoc_item get_cvn_flags
 
 These return the CV of the specified Perl subroutine.  C<flags> are passed to
 C<gv_fetchpvn_flags>.  If C<GV_ADD> is set and the Perl subroutine does not
@@ -3001,6 +3092,8 @@ Perl_call_sv(pTHX_ SV *sv, volatile I32 flags)
     if (!(flags & G_NOARGS))
         myop.op_flags |= OPf_STACKED;
     myop.op_flags |= OP_GIMME_REVERSE(flags);
+    myop.op_ppaddr = PL_ppaddr[OP_ENTERSUB];
+    myop.op_type = OP_ENTERSUB;
     SAVEOP();
     PL_op = (OP*)&myop;
 
@@ -3033,13 +3126,11 @@ Perl_call_sv(pTHX_ SV *sv, volatile I32 flags)
             method_op.op_ppaddr = PL_ppaddr[OP_METHOD];
             method_op.op_type = OP_METHOD;
         }
-        myop.op_ppaddr = PL_ppaddr[OP_ENTERSUB];
-        myop.op_type = OP_ENTERSUB;
     }
 
     if (!(flags & G_EVAL)) {
         CATCH_SET(TRUE);
-        CALL_BODY_SUB((OP*)&myop);
+        CALLRUNOPS(aTHX);
         retval = PL_stack_sp - (PL_stack_base + oldmark);
         CATCH_SET(oldcatch);
     }
@@ -3056,7 +3147,7 @@ Perl_call_sv(pTHX_ SV *sv, volatile I32 flags)
         switch (ret) {
         case 0:
  redo_body:
-            CALL_BODY_SUB((OP*)&myop);
+            CALLRUNOPS(aTHX);
             retval = PL_stack_sp - (PL_stack_base + oldmark);
             if (!(flags & G_KEEPERR)) {
                 CLEAR_ERRSV();
@@ -3146,6 +3237,9 @@ Perl_eval_sv(pTHX_ SV *sv, I32 flags)
     SAVEOP();
     PL_op = (OP*)&myop;
     Zero(&myop, 1, UNOP);
+    myop.op_ppaddr = PL_ppaddr[OP_ENTEREVAL];
+    myop.op_type = OP_ENTEREVAL;
+
     {
         dSP;
         oldmark = SP - PL_stack_base;
@@ -3161,8 +3255,9 @@ Perl_eval_sv(pTHX_ SV *sv, I32 flags)
     if (flags & G_KEEPERR)
         myop.op_flags |= OPf_SPECIAL;
 
+    myop.op_private = (OPpEVAL_EVALSV); /* tell pp_entereval we're the caller */
     if (flags & G_RE_REPARSING)
-        myop.op_private = (OPpEVAL_COPHH | OPpEVAL_RE_REPARSING);
+        myop.op_private |= (OPpEVAL_COPHH | OPpEVAL_RE_REPARSING);
 
     /* fail now; otherwise we could fail after the JMPENV_PUSH but
      * before a cx_pusheval(), which corrupts the stack after a croak */
@@ -3171,13 +3266,22 @@ Perl_eval_sv(pTHX_ SV *sv, I32 flags)
     JMPENV_PUSH(ret);
     switch (ret) {
     case 0:
- redo_body:
-        if (PL_op == (OP*)(&myop)) {
-            PL_op = PL_ppaddr[OP_ENTEREVAL](aTHX);
-            if (!PL_op)
-                goto fail; /* failed in compilation */
-        }
         CALLRUNOPS(aTHX);
+        if (!*PL_stack_sp) {
+            /* In the presence of the OPpEVAL_EVALSV flag,
+             * pp_entereval() pushes a NULL pointer onto the stack to
+             * indicate compilation failure. Otherwise, the top slot on
+             * the stack will be a non-NULL pointer to whatever scalar or
+             * list value(s) the eval returned. In void context it will
+             * be whatever our caller has at the top of stack at the time,
+             * or the &PL_sv_undef guard at PL_stack_base[0]. Note that
+             * NULLs are not pushed on the stack except in a few very
+             * specific circumstances (such as this) to flag something
+             * special. */
+            PL_stack_sp--;
+            goto fail;
+        }
+     redone_body:
         retval = PL_stack_sp - (PL_stack_base + oldmark);
         if (!(flags & G_KEEPERR)) {
             CLEAR_ERRSV();
@@ -3198,14 +3302,19 @@ Perl_eval_sv(pTHX_ SV *sv, I32 flags)
             PL_restartjmpenv = NULL;
             PL_op = PL_restartop;
             PL_restartop = 0;
-            goto redo_body;
+            CALLRUNOPS(aTHX);
+            goto redone_body;
         }
       fail:
         if (flags & G_RETHROW) {
             JMPENV_POP;
             croak_sv(ERRSV);
         }
-
+        /* Should be nothing left in stack frame apart from a possible
+         * scalar context undef. Assert it's safe to reset the stack */
+        assert(     PL_stack_sp == PL_stack_base + oldmark
+                || (PL_stack_sp == PL_stack_base + oldmark + 1
+                    && *PL_stack_sp == &PL_sv_undef));
         PL_stack_sp = PL_stack_base + oldmark;
         if ((flags & G_WANT) == G_LIST)
             retval = 0;
@@ -3306,6 +3415,7 @@ S_usage(pTHX)             /* XXX move this out into a module ? */
 "  -E commandline        like -e, but enables all optional features\n"
 "  -f                    don't do $sitelib/sitecustomize.pl at startup\n"
 "  -F/pattern/           split() pattern for -a switch (//'s are optional)\n"
+"  -g                    read all input in one go (slurp), rather than line-by-line (alias for -0777)\n"
 "  -i[extension]         edit <> files in place (makes backup if extension supplied)\n"
 "  -Idirectory           specify @INC/#include directory (several -I's allowed)\n",
 "  -l[octnum]            enable line ending processing, specifies line terminator\n"
@@ -3390,7 +3500,7 @@ Perl_get_debug_opts(pTHX_ const char **s, bool givehelp)
          * If there is a free slot available marked with '?' feel
          * free to reuse it for something else.
          *
-         * Regardles remember to update DEBUG_MASK in perl.h, and
+         * Regardless remember to update DEBUG_MASK in perl.h, and
          * update the documentation above AND in pod/perlrun.pod.
          *
          * Note that the ? indicates an unused slot. As the code below
@@ -3464,8 +3574,8 @@ Perl_moreswitches(pTHX_ const char *s)
                    numlen = 0;
                    s--;
               }
-              PL_rs = newSVpvs("");
-              tmps = (U8*) SvGROW(PL_rs, (STRLEN)(UVCHR_SKIP(rschar) + 1));
+              PL_rs = newSV((STRLEN)(UVCHR_SKIP(rschar) + 1));
+              tmps = (U8*)SvPVCLEAR_FRESH(PL_rs);
               uvchr_to_utf8(tmps, rschar);
               SvCUR_set(PL_rs, UVCHR_SKIP(rschar));
               SvUTF8_on(PL_rs);
@@ -3495,9 +3605,12 @@ Perl_moreswitches(pTHX_ const char *s)
         PL_minus_a = TRUE;
         PL_minus_F = TRUE;
         PL_minus_n = TRUE;
-        PL_splitstr = ++s;
-        while (*s && !isSPACE(*s)) ++s;
-        PL_splitstr = savepvn(PL_splitstr, s - PL_splitstr);
+        {
+            const char *start = ++s;
+            while (*s && !isSPACE(*s)) ++s;
+            Safefree(PL_splitstr);
+            PL_splitstr = savepvn(start, s - start);
+        }
         return s;
     case 'a':
         PL_minus_a = TRUE;
@@ -3738,12 +3851,12 @@ Perl_moreswitches(pTHX_ const char *s)
         return s;
     case 'W':
         PL_dowarn = G_WARN_ALL_ON|G_WARN_ON;
-    free_and_set_cop_warnings(&PL_compiling, pWARN_ALL);
+        free_and_set_cop_warnings(&PL_compiling, pWARN_ALL);
         s++;
         return s;
     case 'X':
         PL_dowarn = G_WARN_ALL_OFF;
-    free_and_set_cop_warnings(&PL_compiling, pWARN_NONE);
+        free_and_set_cop_warnings(&PL_compiling, pWARN_NONE);
         s++;
         return s;
     case '*':
@@ -4572,7 +4685,7 @@ S_init_postdump_symbols(pTHX_ int argc, char **argv, char **env)
         hv = GvHVn(PL_envgv);
         hv_magic(hv, NULL, PERL_MAGIC_env);
 #ifndef PERL_MICRO
-#ifdef USE_ENVIRON_ARRAY
+#if defined(USE_ENVIRON_ARRAY) || defined(WIN32)
         /* Note that if the supplied env parameter is actually a copy
            of the global environ then it may now point to free'd memory
            if the environment has been modified since. To avoid this
@@ -4708,16 +4821,7 @@ S_init_perllib(pTHX)
     if (!TAINTING_get) {
 #ifndef VMS
         perl5lib = PerlEnv_getenv("PERL5LIB");
-/*
- * It isn't possible to delete an environment variable with
- * PERL_USE_SAFE_PUTENV set unless unsetenv() is also available, so in that
- * case we treat PERL5LIB as undefined if it has a zero-length value.
- */
-#if defined(PERL_USE_SAFE_PUTENV) && ! defined(HAS_UNSETENV)
         if (perl5lib && *perl5lib != '\0')
-#else
-        if (perl5lib)
-#endif
             incpush_use_sep(perl5lib, 0, INCPUSH_ADD_SUB_DIRS);
         else {
             s = PerlEnv_getenv("PERLLIB");
@@ -5218,6 +5322,19 @@ Perl_my_exit(pTHX_ U32 status)
     my_exit_jump();
 }
 
+/*
+=for apidoc my_failure_exit
+
+Exit the running Perl process with an error.
+
+On non-VMS platforms, this is essentially equivalent to L</C<my_exit>>, using
+C<errno>, but forces an en error code of 255 if C<errno> is 0.
+
+On VMS, it takes care to set the appropriate severity bits in the exit status.
+
+=cut
+*/
+
 void
 Perl_my_failure_exit(pTHX)
 {
index 71b44f0..4ef161d 100644 (file)
 #ifndef H_PERL
 #define H_PERL 1
 
+#if defined(__HP_cc) || defined(__HP_aCC)
+/* The HPUX compiler for Itanium is very picky and warns about
+ * things that gcc doesn't and that we would prefer it does not.
+ * So on that platform silence certain warnings unlaterally. */
+
+/* silence "relational operator ">" always evaluates to 'false'"
+ * warnings. We get a LOT of these from the memwrap checks. */
+#pragma diag_suppress 4276
+
+/* silence "may cause misaligned access" warnings from our "OO in C"
+ * type logic. we do this a lot and if it was broken we would fail tests
+ * all over the place */
+#pragma diag_suppress 4232
+
+#endif /* end HPUX warning disablement */
+
 #ifdef PERL_FOR_X2P
 /*
  * This file is being used for x2p stuff.
@@ -30,7 +46,7 @@
 
 /*
 =for apidoc_section $debugging
-=for apidoc CmnW ||_aDEPTH
+=for apidoc CmnW ||comma_aDEPTH
 Some functions when compiled under DEBUGGING take an extra final argument named
 C<depth>, indicating the C stack depth.  This argument is omitted otherwise.
 This macro expands to either S<C<, depth>> under DEBUGGING, or to nothing at
@@ -38,20 +54,32 @@ all when not under DEBUGGING, reducing the number of C<#ifdef>'s in the code.
 
 The program is responsible for maintaining the correct value for C<depth>.
 
-=for apidoc CyW ||_pDEPTH
-This is used in the prototype declarations for functions that take a L</C<_aDEPTH>>
+=for apidoc CyW ||comma_pDEPTH
+This is used in the prototype declarations for functions that take a L</C<comma_aDEPTH>>
 final parameter, much like L<C<pTHX_>|perlguts/Background and MULTIPLICITY>
 is used in functions that take a thread context initial parameter.
 
+=for apidoc CmnW ||debug_aDEPTH
+Same as L</C<comma_aDEPTH>> but with no leading argument. Intended for functions with
+no normal arguments, and used by L</C<comma_aDEPTH>> itself.
+
+=for apidoc CmnW ||debug_pDEPTH
+Same as L</C<comma_pDEPTH>> but with no leading argument. Intended for functions with
+no normal arguments, and used by L</C<comma_pDEPTH>> itself.
+
 =cut
  */
 
 #ifdef DEBUGGING
-#  define _pDEPTH ,U32 depth
-#  define _aDEPTH ,depth
+#  define debug_pDEPTH U32 depth
+#  define comma_pDEPTH ,debug_pDEPTH
+#  define debug_aDEPTH depth
+#  define comma_aDEPTH ,debug_aDEPTH
 #else
-#  define _pDEPTH
-#  define _aDEPTH
+#  define debug_aDEPTH
+#  define comma_aDEPTH
+#  define debug_pDEPTH
+#  define comma_pDEPTH
 #endif
 
 /* NOTE 1: that with gcc -std=c89 the __STDC_VERSION__ is *not* defined
@@ -79,14 +107,18 @@ is used in functions that take a thread context initial parameter.
 #endif
 
 /* PERL_IMPLICIT_CONTEXT is a legacy synonym for MULTIPLICITY */
-#ifdef MULTIPLICITY
-#  ifndef PERL_IMPLICIT_CONTEXT
-#    define PERL_IMPLICIT_CONTEXT
-#  endif
+#if defined(MULTIPLICITY)               \
+ && ! defined(PERL_CORE)                \
+ && ! defined(PERL_IMPLICIT_CONTEXT)
+#  define PERL_IMPLICIT_CONTEXT
 #endif
 #if defined(PERL_IMPLICIT_CONTEXT) && !defined(MULTIPLICITY)
 #  define MULTIPLICITY
 #endif
+#if defined(PERL_CORE) && defined(PERL_IMPLICIT_CONTEXT)
+#  pragma message("PERL_IMPLICIT_CONTEXT was removed from core perl. It does not do anything. Undeffing it for compilation")
+#  undef PERL_IMPLICIT_CONTEXT
+#endif
 
 /* undef WIN32 when building on Cygwin (for libwin32) - gph */
 #ifdef __CYGWIN__
@@ -364,6 +396,9 @@ Now a no-op.
 #    if PERL_GCC_VERSION_GE(4,7,0)
 #      define HASATTRIBUTE_ALWAYS_INLINE
 #    endif
+#    if PERL_GCC_VERSION_GE(3,3,0)
+#      define HASATTRIBUTE_VISIBILITY
+#    endif
 #  endif
 #endif /* #ifndef PERL_MICRO */
 
@@ -397,6 +432,14 @@ Now a no-op.
 #    define __attribute__always_inline__      __attribute__((always_inline))
 #  endif
 #endif
+#if defined(HASATTRIBUTE_VISIBILITY) && !defined(_WIN32) && !defined(__CYGWIN__)
+/* On Windows instead of this, we use __declspec(dllexport) and a .def file
+ * Cygwin works by exporting every global symbol, see the definition of ldflags
+ * near the end of hints/cygwin.sh and the visibility attribute doesn't appear
+ * to control that.
+ */
+#  define __attribute__visibility__(x) __attribute__((visibility(x)))
+#endif
 
 /* If we haven't defined the attributes yet, define them to blank. */
 #ifndef __attribute__deprecated__
@@ -426,6 +469,9 @@ Now a no-op.
 #ifndef __attribute__always_inline__
 #  define __attribute__always_inline__
 #endif
+#ifndef __attribute__visibility__
+#  define __attribute__visibility__(x)
+#endif
 
 /* Some OS warn on NULL format to printf */
 #ifdef PRINTF_FORMAT_NULL_OK
@@ -443,7 +489,9 @@ Now a no-op.
  * marking unused variables (they need e.g. a #pragma) and therefore
  * cpp macros like PERL_UNUSED_DECL cannot work for this purpose, even
  * if it were PERL_UNUSED_DECL(x), which it cannot be (see above).
+*/
 
+/*
 =for apidoc_section $directives
 =for apidoc AmnU||PERL_UNUSED_DECL
 Tells the compiler that the parameter in the function prototype just before it
@@ -462,7 +510,7 @@ Example usage:
 =back
 
 =cut
- */
+*/
 
 #ifndef PERL_UNUSED_DECL
 #  define PERL_UNUSED_DECL __attribute__unused__
@@ -472,25 +520,26 @@ Example usage:
  * for silencing unused variables that are actually used most of the time,
  * but we cannot quite get rid of, such as "ax" in PPCODE+noargs xsubs,
  * or variables/arguments that are used only in certain configurations.
-
-=for apidoc Ams||PERL_UNUSED_ARG|void x
+ */
+/*
+=for apidoc Am;||PERL_UNUSED_ARG|void x
 This is used to suppress compiler warnings that a parameter to a function is
 not used.  This situation can arise, for example, when a parameter is needed
 under some configuration conditions, but not others, so that C preprocessor
-conditional compilation causes it be used just some times.
+conditional compilation causes it be used just sometimes.
 
-=for apidoc Amns||PERL_UNUSED_CONTEXT
+=for apidoc Amn;||PERL_UNUSED_CONTEXT
 This is used to suppress compiler warnings that the thread context parameter to
 a function is not used.  This situation can arise, for example, when a
 C preprocessor conditional compilation causes it be used just some times.
 
-=for apidoc Ams||PERL_UNUSED_VAR|void x
+=for apidoc Am;||PERL_UNUSED_VAR|void x
 This is used to suppress compiler warnings that the variable I<x> is not used.
 This situation can arise, for example, when a C preprocessor conditional
 compilation causes it be used just some times.
 
 =cut
- */
+*/
 #ifndef PERL_UNUSED_ARG
 #  define PERL_UNUSED_ARG(x) ((void)sizeof(x))
 #endif
@@ -546,7 +595,7 @@ and use C<L</PERL_UNUSED_VAR>> on that.
 =cut
 
 The __typeof__() is used instead of typeof() since typeof() is not
-available under strict C89, and because of compilers masquerading
+available under strict ISO C, and because of compilers masquerading
 as gcc (clang and icc), we want exactly the gcc extension
 __typeof__ and nothing else.
 
@@ -625,18 +674,18 @@ __typeof__ and nothing else.
 #define MSVC_DIAG_RESTORE_STMT MSVC_DIAG_RESTORE NOOP
 
 /*
-=for apidoc Amns||NOOP
+=for apidoc Amn;||NOOP
 Do nothing; typically used as a placeholder to replace something that used to
 do something.
 
-=for apidoc Amns||dNOOP
+=for apidoc Amn;||dNOOP
 Declare nothing; typically used as a placeholder to replace something that used
 to declare something.  Works on compilers that require declarations before any
 code.
 
 =cut
 */
-#define NOOP /*EMPTY*/(void)0
+#define NOOP ((void)0)
 #define dNOOP struct Perl___notused_struct
 
 #ifndef pTHX
@@ -668,7 +717,7 @@ code.
 This is now a synonym for dNOOP: declare nothing
 
 =for apidoc_section $XS
-=for apidoc Amns||dMY_CXT_SV
+=for apidoc Amn;||dMY_CXT_SV
 Now a placeholder that declares nothing
 
 =cut
@@ -717,28 +766,60 @@ Now a placeholder that declares nothing
 
 /*
 =for apidoc_section $directives
-=for apidoc AmnUu|void|STMT_START
-=for apidoc_item ||STMT_END
+=for apidoc AmnUu|void|STMT_END
+=for apidoc_item |    |STMT_START
 
-This allows a series of statements in a macro to be used as a single statement,
+These allow a series of statements in a macro to be used as a single statement,
 as in
 
  if (x) STMT_START { ... } STMT_END else ...
 
-Note that you can't return a value out of them, which limits their utility.
-But see C<L</PERL_USE_GCC_BRACE_GROUPS>>.
+Note that you can't return a value out of this construct and cannot use it as
+an operand to the comma operator.  These limit its utility.  
+
+But, a value could be returned by constructing the API so that a pointer is
+passed and the macro dereferences this to set the return.  If the value can be
+any of various types, depending on context, you can handle that situation in
+some situations by adding the type of the return as an extra accompanying
+parameter:
 
-=for apidoc AmnuU|bool|PERL_USE_GCC_BRACE_GROUPS
+ #define foo(param, type)  STMT_START {
+                              type * param; *param = do_calc; ...
+                           } STMT_END
+
+This could be awkward, so consider instead using a C language C<static inline>
+function.
+
+If you do use this construct, it is easy to forget that it is a macro and not a
+function, and hence fall into traps that might not show up until someone
+someday writes code which contains names that clash with the ones you chose
+here, or calls it with a parameter which is an expression with side effects,
+the consequences of which you didn't think about.  See L<perlhacktips/Writing
+safer macros> for how to avoid these.
+
+=for apidoc_section $genconfig
+=for apidoc Amn#||PERL_USE_GCC_BRACE_GROUPS
 
 This C pre-processor value, if defined, indicates that it is permissible to use
-the GCC brace groups extension.  This extension, of the form
+the GCC brace groups extension.  However, use of this extension is DISCOURAGED.
+Use a C<static inline> function instead.
+
+The extension, of the form
 
  ({ statement ... })
 
-turns the block consisting of I<statements ...> into an expression with a
+turns the block consisting of I<statement ...> into an expression with a
 value, unlike plain C language blocks.  This can present optimization
-possibilities, B<BUT> you generally need to specify an alternative in case this
-ability doesn't exist or has otherwise been forbidden.
+possibilities, B<BUT>, unless you know for sure that this will never be
+compiled without this extension being available and not forbidden, you need to
+specify an alternative.  Thus two code paths have to be maintained, which can
+get out-of-sync.  All these issues are solved by using a C<static inline>
+function instead.
+
+Perl can be configured to not use this feature by passing the parameter
+C<-Accflags=-DPERL_GCC_BRACE_GROUPS_FORBIDDEN> to F<Configure>.
+
+=for apidoc Amnh#||PERL_GCC_BRACE_GROUPS_FORBIDDEN
 
 Example usage:
 
@@ -765,10 +846,19 @@ Example usage:
 #   define BYTEORDER 0x1234
 #endif
 
+/*
+=for apidoc_section $genconfig
+=for apidoc Amn#||ASCIIish
+
+A preprocessor symbol that is defined iff the system is an ASCII platform; this
+symbol would not be defined on C<L</EBCDIC>> platforms.
+
+=cut
+*/
 #if 'A' == 65 && 'I' == 73 && 'J' == 74 && 'Z' == 90
-#define ASCIIish
+#  define ASCIIish
 #else
-#undef  ASCIIish
+#  undef  ASCIIish
 #endif
 
 /*
@@ -961,6 +1051,13 @@ violations are fatal.
 #  endif
 #endif
 
+/* This define exists only for compatibility. It used to mean "my_setenv and
+ * friends should use setenv/putenv, instead of manipulating environ directly",
+ * which is now always the case. It's still defined to prevent XS modules from
+ * using the no longer existing PL_use_safe_putenv variable.
+ */
+#define PERL_USE_SAFE_PUTENV
+
 /* HP-UX 10.X CMA (Common Multithreaded Architecture) insists that
    pthread.h must be included before all other header files.
 */
@@ -1000,6 +1097,12 @@ violations are fatal.
 #   include <xlocale.h>
 #endif
 
+#include "perl_langinfo.h"    /* Needed for _NL_LOCALE_NAME */
+
+/* =========================================================================
+ * The defines from here to the following ===== line are unfortunately
+ * duplicated in makedef.pl, and changes here MUST also be made there */
+
 /* If not forbidden, we enable locale handling if either 1) the POSIX 2008
  * functions are available, or 2) just the setlocale() function.  This logic is
  * repeated in t/loc_tools.pl and makedef.pl;  The three should be kept in
@@ -1061,6 +1164,9 @@ violations are fatal.
 #   if !defined(NO_LOCALE_TELEPHONE) && defined(LC_TELEPHONE)
 #      define USE_LOCALE_TELEPHONE
 #   endif
+#   if !defined(NO_LOCALE_NAME) && defined(LC_NAME)
+#      define USE_LOCALE_NAME
+#   endif
 #   if !defined(NO_LOCALE_SYNTAX) && defined(LC_SYNTAX)
 #      define USE_LOCALE_SYNTAX
 #   endif
@@ -1068,38 +1174,205 @@ violations are fatal.
 #      define USE_LOCALE_TOD
 #   endif
 
-/* XXX The next few defines are unfortunately duplicated in makedef.pl, and
- * changes here MUST also be made there */
+/* Now create LC_foo_INDEX_ #defines for just those categories on this system */
+#  ifdef USE_LOCALE_CTYPE
+#    define LC_CTYPE_INDEX_             0
+#    define PERL_DUMMY_CTYPE_           LC_CTYPE_INDEX_
+#  else
+#    define PERL_DUMMY_CTYPE_           -1
+#  endif
+#  ifdef USE_LOCALE_NUMERIC
+#    define LC_NUMERIC_INDEX_           PERL_DUMMY_CTYPE_ + 1
+#    define PERL_DUMMY_NUMERIC_         LC_NUMERIC_INDEX_
+#  else
+#    define PERL_DUMMY_NUMERIC_         PERL_DUMMY_CTYPE_
+#  endif
+#  ifdef USE_LOCALE_COLLATE
+#    define LC_COLLATE_INDEX_           PERL_DUMMY_NUMERIC_ + 1
+#    define PERL_DUMMY_COLLATE_         LC_COLLATE_INDEX_
+#  else
+#    define PERL_DUMMY_COLLATE_         PERL_DUMMY_NUMERIC_
+#  endif
+#  ifdef USE_LOCALE_TIME
+#    define LC_TIME_INDEX_              PERL_DUMMY_COLLATE_ + 1
+#    define PERL_DUMMY_TIME_            LC_TIME_INDEX_
+#  else
+#    define PERL_DUMMY_TIME_            PERL_DUMMY_COLLATE_
+#  endif
+#  ifdef USE_LOCALE_MESSAGES
+#    define LC_MESSAGES_INDEX_          PERL_DUMMY_TIME_ + 1
+#    define PERL_DUMMY_MESSAGES_        LC_MESSAGES_INDEX_
+#  else
+#    define PERL_DUMMY_MESSAGES_        PERL_DUMMY_TIME_
+#  endif
+#  ifdef USE_LOCALE_MONETARY
+#    define LC_MONETARY_INDEX_          PERL_DUMMY_MESSAGES_ + 1
+#    define PERL_DUMMY_MONETARY_        LC_MONETARY_INDEX_
+#  else
+#    define PERL_DUMMY_MONETARY_        PERL_DUMMY_MESSAGES_
+#  endif
+#  ifdef USE_LOCALE_ADDRESS
+#    define LC_ADDRESS_INDEX_           PERL_DUMMY_MONETARY_ + 1
+#    define PERL_DUMMY_ADDRESS_         LC_ADDRESS_INDEX_
+#  else
+#    define PERL_DUMMY_ADDRESS_         PERL_DUMMY_MONETARY_
+#  endif
+#  ifdef USE_LOCALE_IDENTIFICATION
+#    define LC_IDENTIFICATION_INDEX_    PERL_DUMMY_ADDRESS_ + 1
+#    define PERL_DUMMY_IDENTIFICATION_  LC_IDENTIFICATION_INDEX_
+#  else
+#    define PERL_DUMMY_IDENTIFICATION_  PERL_DUMMY_ADDRESS_
+#  endif
+#  ifdef USE_LOCALE_MEASUREMENT
+#    define LC_MEASUREMENT_INDEX_       PERL_DUMMY_IDENTIFICATION_ + 1
+#    define PERL_DUMMY_MEASUREMENT_     LC_MEASUREMENT_INDEX_
+#  else
+#    define PERL_DUMMY_MEASUREMENT_    PERL_DUMMY_IDENTIFICATION_
+#  endif
+#  ifdef USE_LOCALE_PAPER
+#    define LC_PAPER_INDEX_             PERL_DUMMY_MEASUREMENT_ + 1
+#    define PERL_DUMMY_PAPER_           LC_PAPER_INDEX_
+#  else
+#    define PERL_DUMMY_PAPER_           PERL_DUMMY_MEASUREMENT_
+#  endif
+#  ifdef USE_LOCALE_TELEPHONE
+#    define LC_TELEPHONE_INDEX_         PERL_DUMMY_PAPER_ + 1
+#    define PERL_DUMMY_TELEPHONE_       LC_TELEPHONE_INDEX_
+#  else
+#    define PERL_DUMMY_TELEPHONE_       PERL_DUMMY_PAPER_
+#  endif
+#  ifdef USE_LOCALE_NAME
+#    define LC_NAME_INDEX_              PERL_DUMMY_TELEPHONE_ + 1
+#    define PERL_DUMMY_NAME_            LC_NAME_INDEX_
+#  else
+#    define PERL_DUMMY_NAME_            PERL_DUMMY_TELEPHONE_
+#  endif
+#  ifdef USE_LOCALE_SYNTAX
+#    define LC_SYNTAX_INDEX_            PERL_DUMMY_NAME + 1
+#    define PERL_DUMMY_SYNTAX_          LC_SYNTAX_INDEX_
+#  else
+#    define PERL_DUMMY_SYNTAX_          PERL_DUMMY_NAME_
+#  endif
+#  ifdef USE_LOCALE_TOD
+#    define LC_TOD_INDEX_               PERL_DUMMY_SYNTAX_ + 1
+#    define PERL_DUMMY_TOD_             LC_TOD_INDEX_
+#  else
+#    define PERL_DUMMY_TOD_             PERL_DUMMY_SYNTAX_
+#  endif
+#  ifdef LC_ALL
+#    define LC_ALL_INDEX_               PERL_DUMMY_TOD_ + 1
+#  endif
 
-#  if ! defined(HAS_SETLOCALE) && defined(HAS_POSIX_2008_LOCALE)
-#      define USE_POSIX_2008_LOCALE
-#      ifndef USE_THREAD_SAFE_LOCALE
-#        define USE_THREAD_SAFE_LOCALE
-#      endif
-                                   /* If compiled with
-                                    * -DUSE_THREAD_SAFE_LOCALE, will do so even
-                                    * on unthreaded builds */
-#  elif   (defined(USE_ITHREADS) || defined(USE_THREAD_SAFE_LOCALE))         \
-       && (    defined(HAS_POSIX_2008_LOCALE)                                \
-           || (defined(WIN32) && defined(_MSC_VER)))                         \
-       && ! defined(NO_THREAD_SAFE_LOCALE)
-#    ifndef USE_THREAD_SAFE_LOCALE
+
+#  if defined(USE_ITHREADS) && ! defined(NO_LOCALE_THREADS)
+#    define USE_LOCALE_THREADS
+#  endif
+
+   /* Use POSIX 2008 locales if available, and no alternative exists
+    * ('setlocale()' is the alternative); or is threaded and not forbidden to
+    * use them */
+#  if defined(HAS_POSIX_2008_LOCALE) && (  ! defined(HAS_SETLOCALE)            \
+                                         || (     defined(USE_LOCALE_THREADS)  \
+                                             && ! defined(NO_POSIX_2008_LOCALE)))
+#    define USE_POSIX_2008_LOCALE
+#  endif
+
+   /* On threaded builds, use thread-safe locales if they are available and not
+    * forbidden.  Availability is when we are using POSIX 2008 locales, or
+    * Windows for quite a few releases now. */
+#  if defined(USE_LOCALE_THREADS) && ! defined(NO_THREAD_SAFE_LOCALE)
+#    if defined(USE_POSIX_2008_LOCALE) || (defined(WIN32) && defined(_MSC_VER))
 #      define USE_THREAD_SAFE_LOCALE
 #    endif
-#    ifdef HAS_POSIX_2008_LOCALE
-#      define USE_POSIX_2008_LOCALE
+#  endif
+
+#  include "perl_langinfo.h"    /* Needed for _NL_LOCALE_NAME */
+
+#  ifdef USE_POSIX_2008_LOCALE
+#    if  defined(HAS_QUERYLOCALE)                                           \
+              /* Use querylocale if has it, or has the glibc internal       \
+               * undocumented equivalent. */                                \
+     || (     defined(_NL_LOCALE_NAME)                                      \
+              /* And asked for */                                           \
+         &&   defined(USE_NL_LOCALE_NAME)                                   \
+              /* nl_langinfo_l almost certainly will exist on systems that  \
+               * have _NL_LOCALE_NAME, so there is nothing lost by          \
+               * requiring it instead of also allowing plain nl_langinfo(). \
+               * And experience indicates that its glibc implementation is  \
+               * thread-safe, eliminating code complications */             \
+         &&   defined(HAS_NL_LANGINFO_L)                                    \
+               /* On systems that accept any locale name, the real          \
+                * underlying locale is often returned by this internal      \
+                * item, so we can't use it */                               \
+         && ! defined(SETLOCALE_ACCEPTS_ANY_LOCALE_NAME))
+#      define USE_QUERYLOCALE
 #    endif
+#  endif
+
+   /* POSIX 2008 has no means of finding out the current locale without a
+    * querylocale; so must keep track of it ourselves */
+#  if (defined(USE_POSIX_2008_LOCALE) && ! defined(USE_QUERYLOCALE))
+#    define USE_PL_CURLOCALES
+#    define USE_PL_CUR_LC_ALL
+#  endif
+
+#  if defined(WIN32) && defined(USE_THREAD_SAFE_LOCALE)
+
+   /* We need to be able to map the current value of what the tTHX context
+    * thinks LC_ALL is so as to inform the Windows libc when switching
+    * contexts. */
+#    define USE_PL_CUR_LC_ALL
+
+   /* Microsoft documentation reads in the change log for VS 2015: "The
+    * localeconv function declared in locale.h now works correctly when
+    * per-thread locale is enabled. In previous versions of the library, this
+    * function would return the lconv data for the global locale, not the
+    * thread's locale." */
+#    if _MSC_VER < 1900
+#      define TS_W32_BROKEN_LOCALECONV
+#    endif
+#  endif
+
+   /* POSIX 2008 and Windows with thread-safe locales keep locale information
+    * in libc data.  Therefore we must inform their libc's when the context
+    * switches */
+#  if defined(MULTIPLICITY) && (   defined(USE_POSIX_2008_LOCALE)           \
+                                || (   defined(WIN32)                       \
+                                    && defined(USE_THREAD_SAFE_LOCALE)))
+#    define USE_PERL_SWITCH_LOCALE_CONTEXT
 #  endif
 #endif
 
-/*  Microsoft documentation reads in the change log for VS 2015:
- *     "The localeconv function declared in locale.h now works correctly when
- *     per-thread locale is enabled. In previous versions of the library, this
- *     function would return the lconv data for the global locale, not the
- *     thread's locale."
- */
-#if defined(WIN32) && defined(USE_THREAD_SAFE_LOCALE) && _MSC_VER < 1900
-#  define TS_W32_BROKEN_LOCALECONV
+/* end of makedef.pl logic duplication
+ * ========================================================================= */
+
+#ifdef PERL_CORE
+
+/* Both typedefs are used in locale.c only, but defined here so that embed.fnc
+ * can generate the proper prototypes. */
+
+typedef enum {
+    DONT_RECALC_LC_ALL,
+    YES_RECALC_LC_ALL,
+
+    /* Used in tight loops through all sub-categories, where LC_ALL won't be
+     * fully known until all subcategories are handled. */
+    RECALCULATE_LC_ALL_ON_FINAL_INTERATION
+} recalc_lc_all_t;
+
+
+typedef enum {  /* Is the locale UTF8? */
+    LOCALE_NOT_UTF8,
+    LOCALE_IS_UTF8,
+    LOCALE_UTF8NESS_UNKNOWN
+} locale_utf8ness_t;
+
+typedef struct {
+    const char *name;
+    size_t offset;
+} lconv_offset_t;
+
+
 #endif
 
 #include <setjmp.h>
@@ -1158,7 +1431,9 @@ EXTERN_C int usleep(unsigned int);
 
 /* Macros for correct constant construction.  These are in C99 <stdint.h>
  * (so they will not be available in strict C89 mode), but they are nice, so
- * let's define them if necessary.
+ * let's define them if necessary. */
+
+/*
 =for apidoc_section $integer
 =for apidoc    Am|I16|INT16_C|number
 =for apidoc_item |I32|INT32_C|number
@@ -1372,6 +1647,32 @@ Use L</UV> to declare variables of the maximum usable size on this platform.
 
 #define MEM_SIZE Size_t
 
+/* av_extend and analogues enforce a minimum number of array elements.
+ * This has been 4 elements (so a minimum key size of 3) for a long
+ * time, but the rationale behind this seems to have been lost to the
+ * mists of time. */
+#ifndef PERL_ARRAY_NEW_MIN_KEY
+#define PERL_ARRAY_NEW_MIN_KEY 3
+#endif
+
+/* Functions like Perl_sv_grow mandate a minimum string size.
+ * This was 10 bytes for a long time, the rationale for which seems lost
+ * to the mists of time. However, this does not correlate to what modern
+ * malloc implementations will actually return, in particular the fact
+ * that chunks are almost certainly some multiple of pointer size. The
+ * default has therefore been revised to a more useful approximation.
+ * Notes: The following is specifically conservative for 64 bit, since
+ * most dlmalloc derivatives seem to serve a 3xPTRSIZE minimum chunk,
+ * so the below perhaps should be:
+ *     ((PTRSIZE == 4) ? 12 : 24)
+ * Configure probes for malloc_good_size, malloc_actual_size etc.
+ * could be revised to record the actual minimum chunk size, to which
+ * PERL_STRLEN_NEW_MIN could then be set.
+ */
+#ifndef PERL_STRLEN_NEW_MIN
+#define PERL_STRLEN_NEW_MIN ((PTRSIZE == 4) ? 12 : 16)
+#endif
+
 /* Round all values passed to malloc up, by default to a multiple of
    sizeof(size_t)
 */
@@ -1444,10 +1745,12 @@ Use L</UV> to declare variables of the maximum usable size on this platform.
                 if (newval) {                                  \
                   PERL_UNUSED_RESULT(panic_write2("panic: tainting with $ENV{PERL_MALLOC_OPT}\n"));\
                   exit(1); })
-#  define MALLOC_CHECK_TAINT(argc,argv,env)    STMT_START {    \
-        if (doing_taint(argc,argv,env)) {                      \
-                MallocCfg_ptr[MallocCfg_skip_cfg_env] = 1;     \
-    }} STMT_END;
+#  define MALLOC_CHECK_TAINT(argc,argv,env)                     \
+    STMT_START {                                                \
+        if (doing_taint(argc,argv,env)) {                       \
+            MallocCfg_ptr[MallocCfg_skip_cfg_env] = 1;          \
+        }                                                       \
+    } STMT_END;
 #else  /* MYMALLOC */
 #  define safemalloc  safesysmalloc
 #  define safecalloc  safesyscalloc
@@ -2014,7 +2317,7 @@ my_snprintf()
 
 #define PERL_SNPRINTF_CHECK(len, max, api) STMT_START { if ((max) > 0 && (Size_t)len > (max)) Perl_croak_nocontext("panic: %s buffer overflow", STRINGIFY(api)); } STMT_END
 
-#ifdef USE_QUADMATH
+#if defined(USE_LOCALE_NUMERIC) || defined(USE_QUADMATH)
 #  define my_snprintf Perl_my_snprintf
 #  define PERL_MY_SNPRINTF_GUARDED
 #elif defined(HAS_SNPRINTF) && defined(HAS_C99_VARIADIC_MACROS) && !(defined(DEBUGGING) && !defined(PERL_USE_GCC_BRACE_GROUPS)) && !defined(PERL_GCC_PEDANTIC)
@@ -2031,9 +2334,16 @@ my_snprintf()
 
 /* There is no quadmath_vsnprintf, and therefore my_vsnprintf()
  * dies if called under USE_QUADMATH. */
-#if defined(HAS_VSNPRINTF) && defined(HAS_C99_VARIADIC_MACROS) && !(defined(DEBUGGING) && !defined(PERL_USE_GCC_BRACE_GROUPS)) && !defined(PERL_GCC_PEDANTIC)
+#if !  defined(USE_LOCALE_NUMERIC)                                  \
+ &&    defined(HAS_VSNPRINTF)                                       \
+ &&    defined(HAS_C99_VARIADIC_MACROS)                             \
+ && ! (defined(DEBUGGING) && ! defined(PERL_USE_GCC_BRACE_GROUPS))  \
+ && !  defined(PERL_GCC_PEDANTIC)
 #  ifdef PERL_USE_GCC_BRACE_GROUPS
-#      define my_vsnprintf(buffer, max, ...) ({ int len = vsnprintf(buffer, max, __VA_ARGS__); PERL_SNPRINTF_CHECK(len, max, vsnprintf); len; })
+#      define my_vsnprintf(buffer, max, ...)                        \
+            ({ int len = vsnprintf(buffer, max, __VA_ARGS__);       \
+             PERL_SNPRINTF_CHECK(len, max, vsnprintf);              \
+             len; })
 #      define PERL_MY_VSNPRINTF_GUARDED
 #  else
 #    define my_vsnprintf(buffer, max, ...) vsnprintf(buffer, max, __VA_ARGS__)
@@ -2418,7 +2728,7 @@ extern long double Perl_my_frexpl(long double x, int *e);
 #   define Perl_ldexp(x, y) ldexpq(x,y)
 #   define Perl_isinf(x) isinfq(x)
 #   define Perl_isnan(x) isnanq(x)
-#   define Perl_isfinite(x) !(isnanq(x) || isinfq(x))
+#   define Perl_isfinite(x) (!(isnanq(x) || isinfq(x)))
 #   define Perl_fp_class(x) ((x) == 0.0Q ? 0 : isinfq(x) ? 3 : isnanq(x) ? 4 : PERL_ABS(x) < FLT128_MIN ? 2 : 1)
 #   define Perl_fp_class_inf(x)    (Perl_fp_class(x) == 3)
 #   define Perl_fp_class_nan(x)    (Perl_fp_class(x) == 4)
@@ -2745,7 +3055,7 @@ extern long double Perl_my_frexpl(long double x, int *e);
 
 #ifndef Perl_isinf
 #   if defined(Perl_isfinite) && defined(Perl_isnan)
-#       define Perl_isinf(x) !(Perl_isfinite(x)||Perl_isnan(x))
+#       define Perl_isinf(x) (!(Perl_isfinite(x)||Perl_isnan(x)))
 #   endif
 #endif
 
@@ -2762,15 +3072,20 @@ extern long double Perl_my_frexpl(long double x, int *e);
 #    elif defined(HAS_FINITEL)
 #        define Perl_isfinitel(x) finitel(x)
 #    elif defined(HAS_ISINFL) && defined(HAS_ISNANL)
-#        define Perl_isfinitel(x) !(isinfl(x)||isnanl(x))
+#        define Perl_isfinitel(x) (!(isinfl(x)||isnanl(x)))
 #    else
 #        define Perl_isfinitel(x) ((x) * 0 == 0)  /* See Perl_isfinite. */
 #    endif
 #endif
 
 /* The default is to use Perl's own atof() implementation (in numeric.c).
- * Usually that is the one to use but for some platforms (e.g. UNICOS)
- * it is however best to use the native implementation of atof.
+ * This knows about if 'use locale' is in effect or not, and handles the radix
+ * character accordingly.  On some platforms (e.g. UNICOS) it is however best
+ * to use the native implementation of atof, as long as you accept that the
+ * current underlying locale will affect the radix character.  Perl's version
+ * uses a dot for a radix, execpt within the lexical scope of a Perl C<use
+ * locale> statement.
+ *
  * You can experiment with using your native one by -DUSE_PERL_ATOF=0.
  * Some good tests to try out with either setting are t/base/num.t,
  * t/op/numconvert.t, and t/op/pack.t. Note that if using long doubles
@@ -2787,7 +3102,7 @@ extern long double Perl_my_frexpl(long double x, int *e);
 #endif
 
 #ifdef USE_PERL_ATOF
-#   define Perl_atof(s) Perl_my_atof(s)
+#   define Perl_atof(s) Perl_my_atof(aTHX_ s)
 #   define Perl_atof2(s, n) Perl_my_atof3(aTHX_ (s), &(n), 0)
 #else
 #   define Perl_atof(s) (NV)atof(s)
@@ -2795,6 +3110,17 @@ extern long double Perl_my_frexpl(long double x, int *e);
 #endif
 #define my_atof2(a,b) my_atof3(a,b,0)
 
+/*
+=for apidoc AmTR|NV|Atof|NN const char * const s
+
+This is a synonym for L</C<my_atof>>.
+
+=cut
+
+*/
+
+#define Atof                           my_atof
+
 /*
 =for apidoc_section $numeric
 =for apidoc   AmT|NV|Perl_acos|NV x
@@ -2828,6 +3154,7 @@ NV on this platform.  If no such function with sufficient precision exists,
 the highest precision one available is used.
 
 =cut
+
 */
 
 /*
@@ -2870,24 +3197,24 @@ the highest precision one available is used.
 /*
 =for apidoc_section $integer
 
-=for apidoc AmnU||PERL_INT_MAX
-=for apidoc_item ||PERL_INT_MIN
-=for apidoc_item ||PERL_LONG_MAX
-=for apidoc_item ||PERL_LONG_MIN
-=for apidoc_item ||PERL_SHORT_MAX
-=for apidoc_item ||PERL_SHORT_MIN
-=for apidoc_item ||PERL_UCHAR_MAX
-=for apidoc_item ||PERL_UCHAR_MIN
-=for apidoc_item ||PERL_UINT_MAX
-=for apidoc_item ||PERL_UINT_MIN
-=for apidoc_item ||PERL_ULONG_MAX
-=for apidoc_item ||PERL_ULONG_MIN
-=for apidoc_item ||PERL_USHORT_MAX
-=for apidoc_item ||PERL_USHORT_MIN
-=for apidoc_item ||PERL_QUAD_MAX
-=for apidoc_item ||PERL_QUAD_MIN
-=for apidoc_item ||PERL_UQUAD_MAX
-=for apidoc_item ||PERL_UQUAD_MIN
+=for apidoc Amn |int|PERL_INT_MAX
+=for apidoc_item |int|PERL_INT_MIN
+=for apidoc_item |long|PERL_LONG_MAX
+=for apidoc_item |long|PERL_LONG_MIN
+=for apidoc_item |IV|PERL_QUAD_MAX
+=for apidoc_item |IV|PERL_QUAD_MIN
+=for apidoc_item |short|PERL_SHORT_MAX
+=for apidoc_item |short|PERL_SHORT_MIN
+=for apidoc_item |U8|PERL_UCHAR_MAX
+=for apidoc_item |U8|PERL_UCHAR_MIN
+=for apidoc_item |unsigned int|PERL_UINT_MAX
+=for apidoc_item |unsigned int|PERL_UINT_MIN
+=for apidoc_item |unsigned long|PERL_ULONG_MAX
+=for apidoc_item |unsigned long|PERL_ULONG_MIN
+=for apidoc_item |UV|PERL_UQUAD_MAX
+=for apidoc_item |UV|PERL_UQUAD_MIN
+=for apidoc_item |unsigned short|PERL_USHORT_MAX
+=for apidoc_item |unsigned short|PERL_USHORT_MIN
 
 These give the largest and smallest number representable in the current
 platform in variables of the corresponding types.
@@ -2963,6 +3290,7 @@ typedef struct xpvcv XPVCV;
 typedef struct xpvbm XPVBM;
 typedef struct xpvfm XPVFM;
 typedef struct xpvio XPVIO;
+typedef struct xobject XPVOBJ;
 typedef struct mgvtbl MGVTBL;
 typedef union any ANY;
 typedef struct ptr_tbl_ent PTR_TBL_ENT_t;
@@ -3769,7 +4097,10 @@ out there, Solaris being the most prominent.
 
 /* the traditional thread-unsafe notion of "current interpreter". */
 #ifndef PERL_SET_INTERP
-#  define PERL_SET_INTERP(i)           (PL_curinterp = (PerlInterpreter*)(i))
+#  define PERL_SET_INTERP(i)                                            \
+            STMT_START { PL_curinterp = (PerlInterpreter*)(i);          \
+                         PERL_SET_NON_tTHX_CONTEXT(i);                  \
+            } STMT_END
 #endif
 
 #ifndef PERL_GET_INTERP
@@ -3811,30 +4142,63 @@ out there, Solaris being the most prominent.
 
 #define SVfARG(p) ((void*)(p))
 
+/* Render an SV as a quoted and escaped string suitable for an error message.
+ * Only shows the first PERL_QUOTEDPREFIX_LEN characters, and adds ellipses if the
+ * string is too long.
+ */
+#ifndef PERL_QUOTEDPREFIX_LEN
+# define PERL_QUOTEDPREFIX_LEN 256
+#endif
+#ifndef SVf_QUOTEDPREFIX
+#  define SVf_QUOTEDPREFIX "5p"
+#endif
+
+/* like %s but runs through the quoted prefix logic */
+#ifndef PVf_QUOTEDPREFIX
+#  define PVf_QUOTEDPREFIX "1p"
+#endif
+
 #ifndef HEKf
 #  define HEKf "2p"
 #endif
 
+#ifndef HEKf_QUOTEDPREFIX
+#  define HEKf_QUOTEDPREFIX "7p"
+#endif
+
 /* Not ideal, but we cannot easily include a number in an already-numeric
  * format sequence. */
 #ifndef HEKf256
 #  define HEKf256 "3p"
 #endif
 
+#ifndef HEKf256_QUOTEDPREFIX
+#  define HEKf256_QUOTEDPREFIX "8p"
+#endif
+
 #define HEKfARG(p) ((void*)(p))
 
 /* Documented in perlguts
  *
- * %4p is a custom format
+ * %4p and %9p are custom formats for handling UTF8 parameters.
+ * They only occur when prefixed by specific other formats.
  */
 #ifndef UTF8f
 #  define UTF8f "d%" UVuf "%4p"
 #endif
+#ifndef UTF8f_QUOTEDPREFIX
+#  define UTF8f_QUOTEDPREFIX "d%" UVuf "%9p"
+#endif
 #define UTF8fARG(u,l,p) (int)cBOOL(u), (UV)(l), (void*)(p)
 
 #define PNf UTF8f
 #define PNfARG(pn) (int)1, (UV)PadnameLEN(pn), (void *)PadnamePV(pn)
 
+#define HvNAMEf "6p"
+#define HvNAMEf_QUOTEDPREFIX "10p"
+
+#define HvNAMEfARG(hv) ((void*)(hv))
+
 #ifdef PERL_CORE
 /* not used; but needed for backward compatibility with XS code? - RMB
 =for apidoc_section $io_formats
@@ -3954,6 +4318,14 @@ intrinsic function, see its documents for more details.
 
 #ifdef DEBUGGING
 #  define ASSUME(x) assert(x)
+#elif __has_builtin(__builtin_assume)
+#  if defined(__clang__) || defined(__clang)
+#    define ASSUME(x)  CLANG_DIAG_IGNORE(-Wassume)      \
+                       __builtin_assume (x)             \
+                       CLANG_DIAG_RESTORE
+#  else
+#    define ASSUME(x)  __builtin_assume(x)
+#  endif
 #elif defined(_MSC_VER)
 #  define ASSUME(x) __assume(x)
 #elif defined(__ARMCC_VERSION) /* untested */
@@ -4025,7 +4397,7 @@ void init_os_extras(void);
 UNION_ANY_DEFINITION;
 #else
 union any {
-    void*      any_ptr;
+    void*       any_ptr;
     SV*         any_sv;
     SV**        any_svp;
     GV*         any_gv;
@@ -4034,14 +4406,17 @@ union any {
     OP*         any_op;
     char*       any_pv;
     char**      any_pvp;
-    I32                any_i32;
-    U32                any_u32;
-    IV         any_iv;
-    UV         any_uv;
-    long       any_long;
-    bool       any_bool;
-    void       (*any_dptr) (void*);
-    void       (*any_dxptr) (pTHX_ void*);
+    I32         any_i32;
+    U32         any_u32;
+    IV          any_iv;
+    UV          any_uv;
+    long        any_long;
+    bool        any_bool;
+    Size_t      any_size;
+    SSize_t     any_ssize;
+    STRLEN      any_strlen;
+    void        (*any_dptr) (void*);
+    void        (*any_dxptr) (pTHX_ void*);
 };
 #endif
 
@@ -4116,7 +4491,7 @@ typedef        struct crypt_data {     /* straight from /usr/include/crypt.h */
 #define FAKE_BIT_BUCKET
 #endif
 
-/* [perl #22371] Algorimic Complexity Attack on Perl 5.6.1, 5.8.0.
+/* [perl #22371] Algorithmic Complexity Attack on Perl 5.6.1, 5.8.0.
  * Note that the USE_HASH_SEED and similar defines are *NOT* defined by
  * Configure, despite their names being similar to other defines like
  * USE_ITHREADS.  Configure in fact knows nothing about the randomised
@@ -4182,8 +4557,7 @@ typedef        struct crypt_data {     /* straight from /usr/include/crypt.h */
 
 typedef struct magic_state MGS;        /* struct magic_state defined in mg.c */
 
-#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C) \
- || defined(PERL_EXT_RE_BUILD)
+#if defined(PERL_IN_REGEX_ENGINE) || defined(PERL_EXT_RE_BUILD)
 
 /* These have to be predeclared, as they are used in proto.h which is #included
  * before their definitions in regcomp.h. */
@@ -4199,6 +4573,7 @@ typedef struct regnode_charclass_posixl regnode_charclass_posixl;
 typedef struct regnode_ssc regnode_ssc;
 typedef struct RExC_state_t RExC_state_t;
 struct _reg_trie_data;
+typedef struct scan_data_t scan_data_t;
 
 #endif
 
@@ -4497,13 +4872,23 @@ Gid_t getegid (void);
 #  define DEBUG_q_TEST_ UNLIKELY(PL_debug & DEBUG_q_FLAG)
 #  define DEBUG_M_TEST_ UNLIKELY(PL_debug & DEBUG_M_FLAG)
 #  define DEBUG_B_TEST_ UNLIKELY(PL_debug & DEBUG_B_FLAG)
-#  define DEBUG_L_TEST_ UNLIKELY(PL_debug & DEBUG_L_FLAG)
+
+/* Locale initialization comes earlier than PL_debug gets set,
+ * DEBUG_LOCALE_INITIALIZATION_, if defined, will be set early enough */
+#  ifndef DEBUG_LOCALE_INITIALIZATION_
+#    define DEBUG_LOCALE_INITIALIZATION_ 0
+#  endif
+#  define DEBUG_L_TEST_                                                 \
+        (   UNLIKELY(DEBUG_LOCALE_INITIALIZATION_)                      \
+         || UNLIKELY(PL_debug & DEBUG_L_FLAG))
+#  define DEBUG_Lv_TEST_                                                \
+        (   UNLIKELY(DEBUG_LOCALE_INITIALIZATION_)                      \
+         || UNLIKELY(DEBUG_BOTH_FLAGS_TEST_(DEBUG_L_FLAG, DEBUG_v_FLAG)))
 #  define DEBUG_i_TEST_ UNLIKELY(PL_debug & DEBUG_i_FLAG)
 #  define DEBUG_y_TEST_ UNLIKELY(PL_debug & DEBUG_y_FLAG)
 #  define DEBUG_Xv_TEST_ DEBUG_BOTH_FLAGS_TEST_(DEBUG_X_FLAG, DEBUG_v_FLAG)
 #  define DEBUG_Uv_TEST_ DEBUG_BOTH_FLAGS_TEST_(DEBUG_U_FLAG, DEBUG_v_FLAG)
 #  define DEBUG_Pv_TEST_ DEBUG_BOTH_FLAGS_TEST_(DEBUG_P_FLAG, DEBUG_v_FLAG)
-#  define DEBUG_Lv_TEST_ DEBUG_BOTH_FLAGS_TEST_(DEBUG_L_FLAG, DEBUG_v_FLAG)
 #  define DEBUG_yv_TEST_ DEBUG_BOTH_FLAGS_TEST_(DEBUG_y_FLAG, DEBUG_v_FLAG)
 
 #ifdef DEBUGGING
@@ -4597,9 +4982,9 @@ Gid_t getegid (void);
 
 #  define DEBUG__(t, a)                                                 \
         STMT_START {                                                    \
-            if (t) STMT_START {                                         \
+            if (t) {                                                    \
                 DEBUG_PRE_STMTS a; DEBUG_POST_STMTS                     \
-            } STMT_END;                                                 \
+            }                                                           \
         } STMT_END
 
 #  define DEBUG_f(a) DEBUG__(DEBUG_f_TEST, a)
@@ -5061,9 +5446,9 @@ Indices outside the range 0..31 result in (bad) undedefined behavior.
 EXTCONST char PL_hexdigit[]
   INIT("0123456789abcdef0123456789ABCDEF");
 
-EXTCONST STRLEN PL_WARN_ALL
+EXT char PL_WARN_ALL
   INIT(0);
-EXTCONST STRLEN PL_WARN_NONE
+EXT char PL_WARN_NONE
   INIT(0);
 
 /* This is constant on most architectures, a global on OS/2 */
@@ -5167,41 +5552,6 @@ EXTCONST  unsigned char PL_fold[] = {
         248,   249,    250,    251,    252,    253,    254,    255
 };
 
-EXT unsigned char PL_fold_locale[] = { /* Unfortunately not EXTCONST. */
-        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,    'a',    'b',    'c',    'd',    'e',    'f',    'g',
-        'h',   'i',    'j',    'k',    'l',    'm',    'n',    'o',
-        'p',   'q',    'r',    's',    't',    'u',    'v',    'w',
-        'x',   'y',    'z',    91,     92,     93,     94,     95,
-        96,    'A',    'B',    'C',    'D',    'E',    'F',    'G',
-        'H',   'I',    'J',    'K',    'L',    'M',    'N',    'O',
-        'P',   'Q',    'R',    'S',    'T',    'U',    'V',    'W',
-        'X',   'Y',    'Z',    123,    124,    125,    126,    127,
-        128,   129,    130,    131,    132,    133,    134,    135,
-        136,   137,    138,    139,    140,    141,    142,    143,
-        144,   145,    146,    147,    148,    149,    150,    151,
-        152,   153,    154,    155,    156,    157,    158,    159,
-        160,   161,    162,    163,    164,    165,    166,    167,
-        168,   169,    170,    171,    172,    173,    174,    175,
-        176,   177,    178,    179,    180,    181,    182,    183,
-        184,   185,    186,    187,    188,    189,    190,    191,
-        192,   193,    194,    195,    196,    197,    198,    199,
-        200,   201,    202,    203,    204,    205,    206,    207,
-        208,   209,    210,    211,    212,    213,    214,    215,
-        216,   217,    218,    219,    220,    221,    222,    223,
-        224,   225,    226,    227,    228,    229,    230,    231,
-        232,   233,    234,    235,    236,    237,    238,    239,
-        240,   241,    242,    243,    244,    245,    246,    247,
-        248,   249,    250,    251,    252,    253,    254,    255
-};
-
 EXTCONST  unsigned char PL_fold_latin1[] = {
     /* Full latin1 complement folding, except for three problematic code points:
      * Micro sign (181 = 0xB5) and y with diearesis (255 = 0xFF) have their
@@ -5333,7 +5683,6 @@ EXTCONST unsigned char PL_fold[];
 EXTCONST unsigned char PL_fold_latin1[];
 EXTCONST unsigned char PL_mod_latin1_uc[];
 EXTCONST unsigned char PL_latin1_lc[];
-EXT      unsigned char PL_fold_locale[]; /* Unfortunately not EXTCONST. */
 #   endif
 #endif
 
@@ -5386,6 +5735,9 @@ EXTCONST char PL_bincompat_options[] =
 #  ifdef MYMALLOC
                              " MYMALLOC"
 #  endif
+#  ifdef NO_HASH_SEED
+                             " NO_HASH_SEED"
+#  endif
 #  ifdef PERLIO_LAYERS
                              " PERLIO_LAYERS"
 #  endif
@@ -5395,6 +5747,16 @@ EXTCONST char PL_bincompat_options[] =
 #  ifdef PERL_DEBUG_READONLY_OPS
                              " PERL_DEBUG_READONLY_OPS"
 #  endif
+#  ifdef PERL_HASH_FUNC_DEFINE
+/* note that this is different from the others, PERL_HASH_FUNC_DEFINE
+ * is a string which says which define was defined. */
+                             " " PERL_HASH_FUNC_DEFINE
+#  endif
+#  ifdef PERL_HASH_USE_SBOX32
+                             " PERL_HASH_USE_SBOX32"
+#  else
+                             " PERL_HASH_NO_SBOX32"
+#  endif
 #  ifdef PERL_IMPLICIT_SYS
                              " PERL_IMPLICIT_SYS"
 #  endif
@@ -5461,7 +5823,7 @@ EXTCONST char PL_bincompat_options[] =
 #  ifdef VMS_WE_ARE_CASE_SENSITIVE
                              " VMS_SYMBOL_CASE_AS_IS"
 #  endif
-  "";
+    ""; /* keep this on a line by itself, WITH the empty string */
 #else
 EXTCONST char PL_bincompat_options[];
 #endif
@@ -5682,7 +6044,7 @@ typedef char*   (*re_intuit_start_t) (pTHX_ regexp *prog, SV *sv,
 typedef SV*    (*re_intuit_string_t) (pTHX_ regexp *prog);
 typedef void   (*regfree_t) (pTHX_ struct regexp* r);
 typedef regexp* (*regdupe_t) (pTHX_ const regexp* r, CLONE_PARAMS *param);
-typedef I32     (*re_fold_t)(const char *, char const *, I32);
+typedef I32     (*re_fold_t)(pTHX_ const char *, char const *, I32);
 
 typedef void (*DESTRUCTORFUNC_NOCONTEXT_t) (void*);
 typedef void (*DESTRUCTORFUNC_t) (pTHX_ void*);
@@ -5692,10 +6054,38 @@ typedef void (*XSINIT_t) (pTHX);
 typedef void (*ATEXIT_t) (pTHX_ void*);
 typedef void (*XSUBADDR_t) (pTHX_ CV *);
 
+enum Perl_custom_infix_precedence {
+    /* These numbers are spaced out to give room to insert new values as
+     * required. They form part of the ABI contract with XS::Parse::Infix so
+     * they should not be changed within a stable release cycle, but they can
+     * be freely altered during a development cycle because no ABI guarantees
+     * are made at that time */
+    INFIX_PREC_LOW             =  10, /* non-associative */
+    INFIX_PREC_LOGICAL_OR_LOW  =  30, /* left-associative, as `or` */
+    INFIX_PREC_LOGICAL_AND_LOW =  40, /* left-associative, as `and` */
+    INFIX_PREC_ASSIGN          =  50, /* right-associative, as `=` */
+    INFIX_PREC_LOGICAL_OR      =  70, /* left-associative, as `||` */
+    INFIX_PREC_LOGICAL_AND     =  80, /* left-associative, as `&&` */
+    INFIX_PREC_REL             =  90, /* non-associative, just below `==` */
+    INFIX_PREC_ADD             = 110, /* left-associative, as `+` */
+    INFIX_PREC_MUL             = 130, /* left-associative, as `*` */
+    INFIX_PREC_POW             = 150, /* right-associative, as `**` */
+    INFIX_PREC_HIGH            = 170, /* non-associative */
+    /* Try to keep within the range of a U8 in case we need to split the field
+     * and add flags */
+};
+struct Perl_custom_infix;
+struct Perl_custom_infix {
+    enum Perl_custom_infix_precedence prec;
+    void (*parse)(pTHX_ SV **opdata, struct Perl_custom_infix *);  /* optional */
+    OP *(*build_op)(pTHX_ SV **opdata, OP *lhs, OP *rhs, struct Perl_custom_infix *);
+};
+
 typedef OP* (*Perl_ppaddr_t)(pTHX);
 typedef OP* (*Perl_check_t) (pTHX_ OP*);
 typedef void(*Perl_ophook_t)(pTHX_ OP*);
 typedef int (*Perl_keyword_plugin_t)(pTHX_ char*, STRLEN, OP**);
+typedef STRLEN (*Perl_infix_plugin_t)(pTHX_ char*, STRLEN, struct Perl_custom_infix **);
 typedef void(*Perl_cpeep_t)(pTHX_ OP *, OP *);
 
 typedef void(*globhook_t)(pTHX);
@@ -5908,19 +6298,19 @@ EXTCONST U8 PL_magic_data[256];
 #endif
 
 #ifdef DOINIT
-                        /* NL IV NV PV INV PI PN MG RX GV LV AV HV CV FM IO */
+                        /* NL IV NV PV INV PI PN MG RX GV LV AV HV CV FM IO OBJ */
 EXTCONST bool
-PL_valid_types_IVX[]    = { 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0 };
+PL_valid_types_IVX[]    = { 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0 };
 EXTCONST bool
-PL_valid_types_NVX[]    = { 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0 };
+PL_valid_types_NVX[]    = { 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0 };
 EXTCONST bool
-PL_valid_types_PVX[]    = { 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1 };
+PL_valid_types_PVX[]    = { 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0 };
 EXTCONST bool
-PL_valid_types_RV[]     = { 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1 };
+PL_valid_types_RV[]     = { 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0 };
 EXTCONST bool
-PL_valid_types_IV_set[] = { 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1 };
+PL_valid_types_IV_set[] = { 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0 };
 EXTCONST bool
-PL_valid_types_NV_set[] = { 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 };
+PL_valid_types_NV_set[] = { 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0 };
 
 EXTCONST U8
 PL_deBruijn_bitpos_tab32[] = {
@@ -5972,6 +6362,24 @@ EXTCONST U8   PL_deBruijn_bitpos_tab64[];
 #  define PERL_SET_CONTEXT(i)          PERL_SET_INTERP(i)
 #endif
 
+#ifdef USE_PERL_SWITCH_LOCALE_CONTEXT
+#  define PERL_SET_LOCALE_CONTEXT(i)                                        \
+      STMT_START {                                                          \
+          if (UNLIKELY(PL_veto_switch_non_tTHX_context))                    \
+                Perl_switch_locale_context();                               \
+      } STMT_END
+#else
+#  define PERL_SET_LOCALE_CONTEXT(i)  NOOP
+#endif
+
+/* In some Configurations there may be per-thread information that is carried
+ * in a library instead of perl's tTHX structure.  This macro is to be used to
+ * handle those when tTHX is changed.  Only locale handling is currently known
+ * to be affected. */
+#define PERL_SET_NON_tTHX_CONTEXT(i)                                        \
+                        STMT_START { PERL_SET_LOCALE_CONTEXT(i); } STMT_END
+
+
 #ifndef PERL_GET_CONTEXT
 #  define PERL_GET_CONTEXT             PERL_GET_INTERP
 #endif
@@ -6609,14 +7017,14 @@ the plain locale pragma without a parameter (S<C<use locale>>) is in effect.
       * instead it makes sense to minimize space used and do all the work in
       * the rarely called function */
 #    ifdef USE_LOCALE_CTYPE
-#      define _CHECK_AND_WARN_PROBLEMATIC_LOCALE                              \
+#      define CHECK_AND_WARN_PROBLEMATIC_LOCALE_                              \
                 STMT_START {                                                  \
                     if (UNLIKELY(PL_warn_locale)) {                           \
                         Perl__warn_problematic_locale();                      \
                     }                                                         \
                 }  STMT_END
 #    else
-#      define _CHECK_AND_WARN_PROBLEMATIC_LOCALE
+#      define CHECK_AND_WARN_PROBLEMATIC_LOCALE_
 #    endif
 
 
@@ -6626,7 +7034,7 @@ the plain locale pragma without a parameter (S<C<use locale>>) is in effect.
       * string, and an end position which it won't try to read past */
 #    define _CHECK_AND_OUTPUT_WIDE_LOCALE_CP_MSG(cp)                        \
         STMT_START {                                                        \
-            if (! PL_in_utf8_CTYPE_locale && ckWARN(WARN_LOCALE)) {         \
+            if (! IN_UTF8_CTYPE_LOCALE && ckWARN(WARN_LOCALE)) {            \
                 Perl_warner(aTHX_ packWARN(WARN_LOCALE),                    \
                                        "Wide character (U+%" UVXf ") in %s",\
                                        (UV) cp, OP_DESC(PL_op));            \
@@ -6635,7 +7043,7 @@ the plain locale pragma without a parameter (S<C<use locale>>) is in effect.
 
 #    define _CHECK_AND_OUTPUT_WIDE_LOCALE_UTF8_MSG(s, send)                 \
         STMT_START { /* Check if to warn before doing the conversion work */\
-            if (! PL_in_utf8_CTYPE_locale && ckWARN(WARN_LOCALE)) {         \
+            if (! IN_UTF8_CTYPE_LOCALE && ckWARN(WARN_LOCALE)) {            \
                 UV cp = utf8_to_uvchr_buf((U8 *) (s), (U8 *) (send), NULL); \
                 Perl_warner(aTHX_ packWARN(WARN_LOCALE),                    \
                     "Wide character (U+%" UVXf ") in %s",                   \
@@ -6661,207 +7069,99 @@ the plain locale pragma without a parameter (S<C<use locale>>) is in effect.
 #  define IN_LC_COMPILETIME(category)      0
 #  define IN_LC_RUNTIME(category)          0
 #  define IN_LC(category)                  0
-#  define _CHECK_AND_WARN_PROBLEMATIC_LOCALE
+#  define CHECK_AND_WARN_PROBLEMATIC_LOCALE_
 #  define _CHECK_AND_OUTPUT_WIDE_LOCALE_UTF8_MSG(s, send)
 #  define _CHECK_AND_OUTPUT_WIDE_LOCALE_CP_MSG(c)
 #endif
 
+#define locale_panic_(m)  Perl_locale_panic((m), __FILE__, __LINE__, errno)
 
 /* Locale/thread synchronization macros. */
-#if ! (   defined(USE_LOCALE)                                               \
-       &&    defined(USE_ITHREADS)                                          \
-       && (  ! defined(USE_THREAD_SAFE_LOCALE)                              \
-           || (   defined(HAS_LOCALECONV)                                   \
-               && (  ! defined(HAS_LOCALECONV_L)                            \
-                   ||  defined(TS_W32_BROKEN_LOCALECONV)))                  \
-           || (   defined(HAS_NL_LANGINFO)                                  \
-               && ! defined(HAS_THREAD_SAFE_NL_LANGINFO_L))                 \
-           || (defined(HAS_MBLEN)  && ! defined(HAS_MBRLEN))                \
-           || (defined(HAS_MBTOWC) && ! defined(HAS_MBRTOWC))               \
-           || (defined(HAS_WCTOMB) && ! defined(HAS_WCRTOMB))))
-
-/* The whole expression just above was complemented, so here we have no need
- * for thread synchronization, most likely it would be that this isn't a
- * threaded build. */
+#if ! defined(USE_LOCALE) || ! defined(USE_LOCALE_THREADS)
+#  define LOCALE_LOCK_(cond)  NOOP
+#  define LOCALE_UNLOCK_      NOOP
 #  define LOCALE_INIT
 #  define LOCALE_TERM
-#  define LC_NUMERIC_LOCK(cond)     NOOP
-#  define LC_NUMERIC_UNLOCK         NOOP
-#  define LOCALECONV_LOCK           NOOP
-#  define LOCALECONV_UNLOCK         NOOP
-#  define LOCALE_READ_LOCK          NOOP
-#  define LOCALE_READ_UNLOCK        NOOP
-#  define MBLEN_LOCK                NOOP
-#  define MBLEN_UNLOCK              NOOP
-#  define MBTOWC_LOCK               NOOP
-#  define MBTOWC_UNLOCK             NOOP
-#  define NL_LANGINFO_LOCK          NOOP
-#  define NL_LANGINFO_UNLOCK        NOOP
-#  define SETLOCALE_LOCK            NOOP
-#  define SETLOCALE_UNLOCK          NOOP
-#  define WCTOMB_LOCK               NOOP
-#  define WCTOMB_UNLOCK             NOOP
-#else
-
-   /* Here, we will need critical sections in locale handling, because one or
-    * more of the above conditions are true.  This could be because the
-    * platform doesn't have thread-safe locales, or that at least one of the
-    * locale-dependent functions in the core isn't thread-safe.  The latter
-    * case is generally because they return a pointer to a static buffer, which
-    * may be per-process instead of per-thread.  There are supposedly
-    * re-entrant, safe versions for all of them Perl currently uses (which the
-    * #if above checks for), but most platforms don't have all the needed ones
-    * available, and the Posix standard doesn't require nl_langinfo_l() to be
-    * fully thread-safe, so a Configure probe was written.  localeconv_l() is
-    * uncommon, and judging by bug reports on the web, some earlier library
-    * localeconv_l versions were broken, so perhaps a probe is in order for
-    * that, but it would be a pain to write.
-    *
-    * On non-thread-safe systems, some of the above functions are vulnerable to
-    * races should another thread get control and change the locale in the
-    * middle of their execution.
-    *
-    * We currently use a single mutex for all these cases.  This solves both
-    * the problem of another thread changing the locale, and the buffer being
-    * overwritten (the code copies the results to a safe place before releasing
-    * the mutex).  Ideally, for locale thread-safe platforms where the only
-    * issue is another thread clobbering the function's static buffer, there
-    * would be a separate mutex for each such buffer.  Otherwise, things get
-    * locked that don't need to.  But, it is not expected that any of these
-    * will be called frequently, and the locked interval should be short, and
-    * modern platforms will have reentrant versions (which don't lock) for
-    * almost all of them, so khw thinks a single mutex should suffice. */
-#  define LOCALE_LOCK_                                                      \
-        STMT_START {                                                        \
-            DEBUG_Lv(PerlIO_printf(Perl_debug_log,                          \
-                    "%s: %d: locking locale\n", __FILE__, __LINE__));       \
-            MUTEX_LOCK(&PL_locale_mutex);                                   \
-        } STMT_END
-#  define LOCALE_UNLOCK_                                                    \
-        STMT_START {                                                        \
-            DEBUG_Lv(PerlIO_printf(Perl_debug_log,                          \
-                   "%s: %d: unlocking locale\n", __FILE__, __LINE__));      \
-            MUTEX_UNLOCK(&PL_locale_mutex);                                 \
-        } STMT_END
 
-   /* We do define a different macro for each case; then if we want to have
-    * separate mutexes for some of them, the only changes needed are here.
-    * Define just the necessary macros.  The compiler should then croak if the
-    * #ifdef's in the code are incorrect */
-#  if defined(HAS_LOCALECONV) && (  ! defined(HAS_POSIX_2008_LOCALE)        \
-                                 || ! defined(HAS_LOCALECONV_L)             \
-                                 ||   defined(TS_W32_BROKEN_LOCALECONV))
-#    define LOCALECONV_LOCK   LOCALE_LOCK_
-#    define LOCALECONV_UNLOCK LOCALE_UNLOCK_
-#  endif
-#  if defined(HAS_NL_LANGINFO) && (   ! defined(HAS_THREAD_SAFE_NL_LANGINFO_L) \
-                                   || ! defined(HAS_POSIX_2008_LOCALE))
-#    define NL_LANGINFO_LOCK   LOCALE_LOCK_
-#    define NL_LANGINFO_UNLOCK LOCALE_UNLOCK_
-#  endif
-#  if defined(HAS_MBLEN) && ! defined(HAS_MBRLEN)
-#    define MBLEN_LOCK   LOCALE_LOCK_
-#    define MBLEN_UNLOCK LOCALE_UNLOCK_
-#  endif
-#  if defined(HAS_MBTOWC) && ! defined(HAS_MBRTOWC)
-#    define MBTOWC_LOCK   LOCALE_LOCK_
-#    define MBTOWC_UNLOCK LOCALE_UNLOCK_
-#  endif
-#  if defined(HAS_WCTOMB) && ! defined(HAS_WCRTOMB)
-#    define WCTOMB_LOCK   LOCALE_LOCK_
-#    define WCTOMB_UNLOCK LOCALE_UNLOCK_
-#  endif
-#  if defined(USE_THREAD_SAFE_LOCALE)
-     /* On locale thread-safe systems, we don't need these workarounds */
-#    define LOCALE_TERM_LC_NUMERIC_   NOOP
-#    define LOCALE_INIT_LC_NUMERIC_   NOOP
-#    define LC_NUMERIC_LOCK(cond)   NOOP
-#    define LC_NUMERIC_UNLOCK       NOOP
-#    define LOCALE_INIT_LC_NUMERIC_ NOOP
-#    define LOCALE_TERM_LC_NUMERIC_ NOOP
-
-     /* There may be instance core where we this is invoked yet should do
-      * nothing.  Rather than have #ifdef's around them, define it here */
-#    define SETLOCALE_LOCK    NOOP
-#    define SETLOCALE_UNLOCK  NOOP
-#  else
-#    define SETLOCALE_LOCK   LOCALE_LOCK_
-#    define SETLOCALE_UNLOCK LOCALE_UNLOCK_
+#else   /* Below: Threaded, and locales are supported */
 
-    /* On platforms without per-thread locales, when another thread can switch
-     * our locale, we need another mutex to create critical sections where we
-     * want the LC_NUMERIC locale to be locked into either the C (standard)
-     * locale, or the underlying locale, so that other threads interrupting
-     * this one don't change it to the wrong state before we've had a chance to
-     * complete our operation.  It can stay locked over an entire printf
-     * operation, for example.  And so is made distinct from the LOCALE_LOCK
-     * mutex.
+    /* A locale mutex is required on all such threaded builds.
      *
-     * This simulates kind of a general semaphore.  The current thread will
-     * lock the mutex if the per-thread variable is zero, and then increments
-     * that variable.  Each corresponding UNLOCK decrements the variable until
-     * it is 0, at which point it actually unlocks the mutex.  Since the
-     * variable is per-thread, there is no race with other threads.
+     * This mutex simulates a general (or recursive) semaphore.  The current
+     * thread will lock the mutex if the per-thread variable is zero, and then
+     * increments that variable.  Each corresponding UNLOCK decrements the
+     * variable until it is 0, at which point it actually unlocks the mutex.
+     * Since the variable is per-thread, initialized to 0, there is no race
+     * with other threads.
      *
-     * The single argument is a condition to test for, and if true, to panic,
-     * as this would be an attempt to complement the LC_NUMERIC state, and
-     * we're not supposed to because it's locked.
+     * The single argument is a condition to test for, and if true, to panic.
+     * Call it with the constant 0 to suppress the check.
      *
      * Clang improperly gives warnings for this, if not silenced:
      * https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#conditional-locks
-     *
-     * If LC_NUMERIC_LOCK is combined with one of the LOCKs above, calls to
-     * that and its corresponding unlock should be contained entirely within
-     * the locked portion of LC_NUMERIC.  Those mutexes should be used only in
-     * very short sections of code, while LC_NUMERIC_LOCK may span more
-     * operations.  By always following this convention, deadlock should be
-     * impossible.  But if necessary, the two mutexes could be combined. */
-#    define LC_NUMERIC_LOCK(cond_to_panic_if_already_locked)                \
-        CLANG_DIAG_IGNORE(-Wthread-safety)                                 \
+     */
+#  define LOCALE_LOCK_(cond_to_panic_if_already_locked)                     \
         STMT_START {                                                        \
-            if (PL_lc_numeric_mutex_depth <= 0) {                           \
-                MUTEX_LOCK(&PL_lc_numeric_mutex);                           \
-                PL_lc_numeric_mutex_depth = 1;                              \
+            CLANG_DIAG_IGNORE(-Wthread-safety)                             \
+            if (LIKELY(PL_locale_mutex_depth <= 0)) {                       \
                 DEBUG_Lv(PerlIO_printf(Perl_debug_log,                      \
-                         "%s: %d: locking lc_numeric; depth=1\n",           \
+                         "%s: %d: locking locale; depth=1\n",               \
                          __FILE__, __LINE__));                              \
+                MUTEX_LOCK(&PL_locale_mutex);                               \
+                PL_locale_mutex_depth = 1;                                  \
             }                                                               \
             else {                                                          \
-                PL_lc_numeric_mutex_depth++;                                \
+                PL_locale_mutex_depth++;                                    \
                 DEBUG_Lv(PerlIO_printf(Perl_debug_log,                      \
-                        "%s: %d: avoided lc_numeric_lock; new depth=%d\n",  \
-                        __FILE__, __LINE__, PL_lc_numeric_mutex_depth));    \
+                        "%s: %d: avoided locking locale; new depth=%d\n",   \
+                        __FILE__, __LINE__, PL_locale_mutex_depth));        \
                 if (cond_to_panic_if_already_locked) {                      \
-                    Perl_croak_nocontext("panic: %s: %d: Trying to change"  \
-                                         " LC_NUMERIC incompatibly",        \
-                                         __FILE__, __LINE__);               \
+                    locale_panic_("Trying to lock locale incompatibly: "    \
+                         STRINGIFY(cond_to_panic_if_already_locked));       \
                 }                                                           \
             }                                                               \
+            CLANG_DIAG_RESTORE                                              \
         } STMT_END
 
-#    define LC_NUMERIC_UNLOCK                                               \
+#  define LOCALE_UNLOCK_                                                    \
         STMT_START {                                                        \
-            if (PL_lc_numeric_mutex_depth <= 1) {                           \
-                MUTEX_UNLOCK(&PL_lc_numeric_mutex);                         \
-                PL_lc_numeric_mutex_depth = 0;                              \
+            if (LIKELY(PL_locale_mutex_depth == 1)) {                       \
                 DEBUG_Lv(PerlIO_printf(Perl_debug_log,                      \
-                         "%s: %d: unlocking lc_numeric; depth=0\n",         \
+                         "%s: %d: unlocking locale; new depth=0\n",         \
                          __FILE__, __LINE__));                              \
+                PL_locale_mutex_depth = 0;                                  \
+                MUTEX_UNLOCK(&PL_locale_mutex);                             \
+            }                                                               \
+            else if (PL_locale_mutex_depth <= 0) {                          \
+                DEBUG_L(PerlIO_printf(Perl_debug_log,                       \
+                        "%s: %d: ignored attempt to unlock already"         \
+                        " unlocked locale; depth unchanged at %d\n",        \
+                       __FILE__, __LINE__, PL_locale_mutex_depth));         \
             }                                                               \
             else {                                                          \
-                PL_lc_numeric_mutex_depth--;                                \
+                PL_locale_mutex_depth--;                                    \
                 DEBUG_Lv(PerlIO_printf(Perl_debug_log,                      \
-                        "%s: %d: avoided lc_numeric_unlock; new depth=%d\n",\
-                        __FILE__, __LINE__, PL_lc_numeric_mutex_depth));    \
+                        "%s: %d: avoided unlocking locale; new depth=%d\n", \
+                        __FILE__, __LINE__, PL_locale_mutex_depth));        \
             }                                                               \
-        } STMT_END                                                          \
-        CLANG_DIAG_RESTORE
+        } STMT_END
+
+#  if defined(USE_THREADS) && ! defined(USE_THREAD_SAFE_LOCALE)
 
-#    define LOCALE_INIT_LC_NUMERIC_   MUTEX_INIT(&PL_lc_numeric_mutex)
-#    define LOCALE_TERM_LC_NUMERIC_   MUTEX_DESTROY(&PL_lc_numeric_mutex)
+     /* By definition, a thread-unsafe locale means we need a critical
+      * section. */
+#    define SETLOCALE_LOCK   LOCALE_LOCK_(0)
+#    define SETLOCALE_UNLOCK LOCALE_UNLOCK_
+#    ifdef USE_LOCALE_NUMERIC
+#      define LC_NUMERIC_LOCK(cond_to_panic_if_already_locked)              \
+                 LOCALE_LOCK_(cond_to_panic_if_already_locked)
+#      define LC_NUMERIC_UNLOCK  LOCALE_UNLOCK_
+#    endif
 #  endif
 
-#  ifdef USE_POSIX_2008_LOCALE
+#  ifndef USE_POSIX_2008_LOCALE
+#    define LOCALE_TERM_POSIX_2008_  NOOP
+#  else
      /* We have a locale object holding the 'C' locale for Posix 2008 */
 #    define LOCALE_TERM_POSIX_2008_                                         \
                     STMT_START {                                            \
@@ -6873,22 +7173,131 @@ the plain locale pragma without a parameter (S<C<use locale>>) is in effect.
                             PL_C_locale_obj = (locale_t) NULL;              \
                         }                                                   \
                     } STMT_END
-#  else
-#    define LOCALE_TERM_POSIX_2008_  NOOP
 #  endif
 
-#  define LOCALE_INIT           STMT_START {                                \
-                                    MUTEX_INIT(&PL_locale_mutex);           \
-                                    LOCALE_INIT_LC_NUMERIC_;                \
-                                } STMT_END
-
+#  define LOCALE_INIT           MUTEX_INIT(&PL_locale_mutex)
 #  define LOCALE_TERM           STMT_START {                                \
-                                    MUTEX_DESTROY(&PL_locale_mutex);        \
-                                    LOCALE_TERM_LC_NUMERIC_;                \
                                     LOCALE_TERM_POSIX_2008_;                \
+                                    MUTEX_DESTROY(&PL_locale_mutex);        \
                                 } STMT_END
 #endif
 
+/* There are some locale-related functions which may need locking only because
+ * they share some common memory across threads, and hence there is the
+ * potential for a race in accessing that space.  Most are because their return
+ * points to a global static buffer, but some just use some common space
+ * internally.  All functions accessing a given space need to have a critical
+ * section to prevent any other thread from accessing it at the same time.
+ * Ideally, there would be a separate mutex for each such space, so that
+ * another thread isn't unnecessarily blocked.  But, most of them need to be
+ * locked against the locale changing while accessing that space, and it is not
+ * expected that any will be called frequently, and the locked interval should
+ * be short, and modern platforms will have reentrant versions (which don't
+ * lock) for almost all of them, so khw thinks a single mutex should suffice.
+ * Having a single mutex facilitates that, avoiding potential deadlock
+ * situations.
+ *
+ * This will be a no-op iff the perl is unthreaded. 'gw' stands for 'global
+ * write', to indicate the caller wants to be able to access memory that isn't
+ * thread specific, either to write to itself, or to prevent anyone else from
+ * writing. */
+#define gwLOCALE_LOCK    LOCALE_LOCK_(0)
+#define gwLOCALE_UNLOCK  LOCALE_UNLOCK_
+
+/* setlocale() generally returns in a global static buffer, but not on Windows
+ * when operating in thread-safe mode */
+#if defined(WIN32) && defined(USE_THREAD_SAFE_LOCALE)
+#  define POSIX_SETLOCALE_LOCK                                              \
+            STMT_START {                                                    \
+                if (_configthreadlocale(0) == _DISABLE_PER_THREAD_LOCALE)   \
+                    gwLOCALE_LOCK;                                          \
+            } STMT_END
+#  define POSIX_SETLOCALE_UNLOCK                                            \
+            STMT_START {                                                    \
+                if (_configthreadlocale(0) == _DISABLE_PER_THREAD_LOCALE)   \
+                    gwLOCALE_UNLOCK;                                        \
+            } STMT_END
+#else
+#  define POSIX_SETLOCALE_LOCK      gwLOCALE_LOCK
+#  define POSIX_SETLOCALE_UNLOCK    gwLOCALE_UNLOCK
+#endif
+
+/* It handles _wsetlocale() as well */
+#define WSETLOCALE_LOCK      POSIX_SETLOCALE_LOCK
+#define WSETLOCALE_UNLOCK    POSIX_SETLOCALE_UNLOCK
+
+/* Similar to gwLOCALE_LOCK, there are functions that require both the locale
+ * and environment to be constant during their execution, and don't change
+ * either of those things, but do write to some sort of shared global space.
+ * They require some sort of exclusive lock against similar functions, and a
+ * read lock on both the locale and environment.  However, on systems which
+ * have per-thread locales, the locale is constant during the execution of
+ * these functions, and so no locale lock is necssary.  For such systems, an
+ * exclusive ENV lock is necessary and sufficient.  On systems where the locale
+ * could change out from under us, we use an exclusive LOCALE lock to prevent
+ * that, and a read ENV lock to prevent other threads that have nothing to do
+ * with locales here from changing the environment. */
+#ifdef SETLOCALE_LOCK
+#  define gwENVr_LOCALEr_LOCK                                               \
+                    STMT_START { SETLOCALE_LOCK; ENV_READ_LOCK; } STMT_END
+#  define gwENVr_LOCALEr_UNLOCK                                             \
+                STMT_START { ENV_READ_UNLOCK; SETLOCALE_UNLOCK; } STMT_END
+#else
+#  define gwENVr_LOCALEr_LOCK           ENV_LOCK
+#  define gwENVr_LOCALEr_UNLOCK         ENV_UNLOCK
+#endif
+
+/* Now that we have defined gwENVr_LOCALEr_LOCK, we can finish defining
+ * SETLOCALE_LOCK, which we kept undefined until here on a thread-safe system
+ * so that we could use that fact to calculate what gwENVr_LOCALEr_LOCK should
+ * be */
+#ifndef SETLOCALE_LOCK
+#  define SETLOCALE_LOCK                NOOP
+#  define SETLOCALE_UNLOCK              NOOP
+#endif
+
+
+      /* On systems that don't have per-thread locales, even though we don't
+       * think we are changing the locale ourselves, behind the scenes it does
+       * get changed to whatever the thread's should be, so it has to be an
+       * exclusive lock.  By defining it here with this name, we can, for the
+       * most part, hide this detail from the rest of the code */
+/* Currently, the read lock is an exclusive lock */
+#define LOCALE_READ_LOCK                SETLOCALE_LOCK
+#define LOCALE_READ_UNLOCK              SETLOCALE_UNLOCK
+
+
+#ifndef LC_NUMERIC_LOCK
+#  define LC_NUMERIC_LOCK(cond)   NOOP
+#  define LC_NUMERIC_UNLOCK       NOOP
+#endif
+
+   /* These non-reentrant versions use global space */
+#  define MBLEN_LOCK_                gwLOCALE_LOCK
+#  define MBLEN_UNLOCK_              gwLOCALE_UNLOCK
+
+#  define MBTOWC_LOCK_               gwLOCALE_LOCK
+#  define MBTOWC_UNLOCK_             gwLOCALE_UNLOCK
+
+#  define WCTOMB_LOCK_               gwLOCALE_LOCK
+#  define WCTOMB_UNLOCK_             gwLOCALE_UNLOCK
+
+   /* Whereas the reentrant versions don't (assuming they are called with a
+    * per-thread buffer; some have the capability of being called with a NULL
+    * parameter, which defeats the reentrancy) */
+#  define MBRLEN_LOCK_                  NOOP
+#  define MBRLEN_UNLOCK_                NOOP
+#  define MBRTOWC_LOCK_                 NOOP
+#  define MBRTOWC_UNLOCK_               NOOP
+#  define WCRTOMB_LOCK_                 NOOP
+#  define WCRTOMB_UNLOCK_               NOOP
+
+#  define LC_COLLATE_LOCK               SETLOCALE_LOCK
+#  define LC_COLLATE_UNLOCK             SETLOCALE_UNLOCK
+
+#  define STRFTIME_LOCK                 ENV_LOCK
+#  define STRFTIME_UNLOCK               ENV_UNLOCK
+
 #ifdef USE_LOCALE_NUMERIC
 
 /* These macros are for toggling between the underlying locale (UNDERLYING or
@@ -7045,12 +7454,12 @@ cannot have changed since the precalculation.
  * khw believes the reason for the variables instead of the bits in a single
  * word is to avoid having to have masking instructions. */
 
-#  define _NOT_IN_NUMERIC_STANDARD (! PL_numeric_standard)
+#  define NOT_IN_NUMERIC_STANDARD_ (! PL_numeric_standard)
 
 /* We can lock the category to stay in the C locale, making requests to the
  * contrary be noops, in the dynamic scope by setting PL_numeric_standard to 2.
  * */
-#  define _NOT_IN_NUMERIC_UNDERLYING                                        \
+#  define NOT_IN_NUMERIC_UNDERLYING_                                        \
                     (! PL_numeric_underlying && PL_numeric_standard < 2)
 
 #  define DECLARATION_FOR_LC_NUMERIC_MANIPULATION                           \
@@ -7060,17 +7469,17 @@ cannot have changed since the precalculation.
         STMT_START {                                                        \
             bool _in_lc_numeric = (in);                                     \
             LC_NUMERIC_LOCK(                                                \
-                    (   (  _in_lc_numeric && _NOT_IN_NUMERIC_UNDERLYING)    \
-                     || (! _in_lc_numeric && _NOT_IN_NUMERIC_STANDARD)));   \
+                    (   (  _in_lc_numeric && NOT_IN_NUMERIC_UNDERLYING_)    \
+                     || (! _in_lc_numeric && NOT_IN_NUMERIC_STANDARD_)));   \
             if (_in_lc_numeric) {                                           \
-                if (_NOT_IN_NUMERIC_UNDERLYING) {                           \
+                if (NOT_IN_NUMERIC_UNDERLYING_) {                           \
                     Perl_set_numeric_underlying(aTHX);                      \
                     _restore_LC_NUMERIC_function                            \
                                             = &Perl_set_numeric_standard;   \
                 }                                                           \
             }                                                               \
             else {                                                          \
-                if (_NOT_IN_NUMERIC_STANDARD) {                             \
+                if (NOT_IN_NUMERIC_STANDARD_) {                             \
                     Perl_set_numeric_standard(aTHX);                        \
                     _restore_LC_NUMERIC_function                            \
                                             = &Perl_set_numeric_underlying; \
@@ -7089,22 +7498,25 @@ cannot have changed since the precalculation.
             LC_NUMERIC_UNLOCK;                                              \
         } STMT_END
 
-/* The next two macros set unconditionally.  These should be rarely used, and
- * only after being sure that this is what is needed */
+/* The next two macros should be rarely used, and only after being sure that
+ * this is what is needed */
 #  define SET_NUMERIC_STANDARD()                                            \
         STMT_START {                                                        \
             DEBUG_Lv(PerlIO_printf(Perl_debug_log,                          \
                                "%s: %d: lc_numeric standard=%d\n",          \
                                 __FILE__, __LINE__, PL_numeric_standard));  \
-            Perl_set_numeric_standard(aTHX);                                \
+            if (UNLIKELY(NOT_IN_NUMERIC_STANDARD_)) {                       \
+                Perl_set_numeric_standard(aTHX);                            \
+            }                                                               \
             DEBUG_Lv(PerlIO_printf(Perl_debug_log,                          \
                                  "%s: %d: lc_numeric standard=%d\n",        \
                                  __FILE__, __LINE__, PL_numeric_standard)); \
         } STMT_END
 
 #  define SET_NUMERIC_UNDERLYING()                                          \
-        STMT_START {                                                        \
-            if (_NOT_IN_NUMERIC_UNDERLYING) {                               \
+       STMT_START {                                                        \
+          /*assert(PL_locale_mutex_depth > 0);*/                            \
+            if (NOT_IN_NUMERIC_UNDERLYING_) {                               \
                 Perl_set_numeric_underlying(aTHX);                          \
             }                                                               \
         } STMT_END
@@ -7113,8 +7525,8 @@ cannot have changed since the precalculation.
  * the RESTORE_foo ones called to switch back, but only if need be */
 #  define STORE_LC_NUMERIC_SET_STANDARD()                                   \
         STMT_START {                                                        \
-            LC_NUMERIC_LOCK(_NOT_IN_NUMERIC_STANDARD);                      \
-            if (_NOT_IN_NUMERIC_STANDARD) {                                 \
+            LC_NUMERIC_LOCK(NOT_IN_NUMERIC_STANDARD_);                      \
+            if (NOT_IN_NUMERIC_STANDARD_) {                                 \
                 _restore_LC_NUMERIC_function = &Perl_set_numeric_underlying;\
                 Perl_set_numeric_standard(aTHX);                            \
             }                                                               \
@@ -7123,9 +7535,9 @@ cannot have changed since the precalculation.
 /* Rarely, we want to change to the underlying locale even outside of 'use
  * locale'.  This is principally in the POSIX:: functions */
 #  define STORE_LC_NUMERIC_FORCE_TO_UNDERLYING()                            \
-        STMT_START {                                                        \
-            LC_NUMERIC_LOCK(_NOT_IN_NUMERIC_UNDERLYING);                    \
-            if (_NOT_IN_NUMERIC_UNDERLYING) {                               \
+       STMT_START {                                                        \
+            LC_NUMERIC_LOCK(NOT_IN_NUMERIC_UNDERLYING_);                    \
+            if (NOT_IN_NUMERIC_UNDERLYING_) {                               \
                 Perl_set_numeric_underlying(aTHX);                          \
                 _restore_LC_NUMERIC_function = &Perl_set_numeric_standard;  \
             }                                                               \
@@ -7191,7 +7603,7 @@ cannot have changed since the precalculation.
 
 #endif /* !USE_LOCALE_NUMERIC */
 
-#ifdef USE_ITHREADS
+#ifdef USE_LOCALE_THREADS
 #  define ENV_LOCK            PERL_WRITE_LOCK(&PL_env_mutex)
 #  define ENV_UNLOCK          PERL_WRITE_UNLOCK(&PL_env_mutex)
 #  define ENV_READ_LOCK       PERL_READ_LOCK(&PL_env_mutex)
@@ -7224,6 +7636,162 @@ cannot have changed since the precalculation.
 #  define GETENV_UNLOCK   NOOP
 #endif
 
+/* Some critical sections need to lock both the locale and the environment from
+ * changing, while allowing for any number of readers.  To avoid deadlock, this
+ * is always done in the same order.  These should always be invoked, like all
+ * locks really, at such a low level that its just a libc call that is wrapped,
+ * so as to prevent recursive calls which could deadlock. */
+#define ENVr_LOCALEr_LOCK                                               \
+            STMT_START { LOCALE_READ_LOCK; ENV_READ_LOCK; } STMT_END
+#define ENVr_LOCALEr_UNLOCK                                             \
+        STMT_START { ENV_READ_UNLOCK; LOCALE_READ_UNLOCK; } STMT_END
+
+/* These time-related functions all requre that the environment and locale
+ * don't change while they are executing (at least in glibc; this appears to be
+ * contrary to the POSIX standard).  tzset() writes global variables, so
+ * always needs to have write locking.  ctime, localtime, mktime, and strftime
+ * effectively call it, so they too need exclusive access.  The rest need to
+ * have exclusive locking as well so that they can copy the contents of the
+ * returned static buffer before releasing the lock.  That leaves asctime and
+ * gmtime.  There may be reentrant versions of these available on the platform
+ * which don't require write locking.
+ */
+#ifdef PERL_REENTR_USING_ASCTIME_R
+#  define ASCTIME_LOCK     ENVr_LOCALEr_LOCK
+#  define ASCTIME_UNLOCK   ENVr_LOCALEr_UNLOCK
+#else
+#  define ASCTIME_LOCK     gwENVr_LOCALEr_LOCK
+#  define ASCTIME_UNLOCK   gwENVr_LOCALEr_UNLOCK
+#endif
+
+#define CTIME_LOCK         gwENVr_LOCALEr_LOCK
+#define CTIME_UNLOCK       gwENVr_LOCALEr_UNLOCK
+
+#ifdef PERL_REENTR_USING_GMTIME_R
+#  define GMTIME_LOCK      ENVr_LOCALEr_LOCK
+#  define GMTIME_UNLOCK    ENVr_LOCALEr_UNLOCK
+#else
+#  define GMTIME_LOCK      gwENVr_LOCALEr_LOCK
+#  define GMTIME_UNLOCK    gwENVr_LOCALEr_UNLOCK
+#endif
+
+#define LOCALTIME_LOCK     gwENVr_LOCALEr_LOCK
+#define LOCALTIME_UNLOCK   gwENVr_LOCALEr_UNLOCK
+#define MKTIME_LOCK        gwENVr_LOCALEr_LOCK
+#define MKTIME_UNLOCK      gwENVr_LOCALEr_UNLOCK
+#define TZSET_LOCK         gwENVr_LOCALEr_LOCK
+#define TZSET_UNLOCK       gwENVr_LOCALEr_UNLOCK
+
+/* Similiarly, these functions need a constant environment and/or locale.  And
+ * some have a buffer that is shared with another thread executing the same or
+ * a related call.  A mutex could be created for each class, but for now, share
+ * the ENV mutex with everything, as none probably gets called so much that
+ * performance would suffer by a thread being locked out by another thread that
+ * could have used a different mutex.
+ *
+ * But, create a different macro name just to indicate the ones that don't
+ * actually depend on the environment, but are using its mutex for want of a
+ * better one */
+#define gwLOCALEr_LOCK              gwENVr_LOCALEr_LOCK
+#define gwLOCALEr_UNLOCK            gwENVr_LOCALEr_UNLOCK
+
+#ifdef PERL_REENTR_USING_GETHOSTBYADDR_R
+#  define GETHOSTBYADDR_LOCK        ENVr_LOCALEr_LOCK
+#  define GETHOSTBYADDR_UNLOCK      ENVr_LOCALEr_UNLOCK
+#else
+#  define GETHOSTBYADDR_LOCK        gwENVr_LOCALEr_LOCK
+#  define GETHOSTBYADDR_UNLOCK      gwENVr_LOCALEr_UNLOCK
+#endif
+#ifdef PERL_REENTR_USING_GETHOSTBYNAME_R
+#  define GETHOSTBYNAME_LOCK        ENVr_LOCALEr_LOCK
+#  define GETHOSTBYNAME_UNLOCK      ENVr_LOCALEr_UNLOCK
+#else
+#  define GETHOSTBYNAME_LOCK        gwENVr_LOCALEr_LOCK
+#  define GETHOSTBYNAME_UNLOCK      gwENVr_LOCALEr_UNLOCK
+#endif
+#ifdef PERL_REENTR_USING_GETNETBYADDR_R
+#  define GETNETBYADDR_LOCK         LOCALE_READ_LOCK
+#  define GETNETBYADDR_UNLOCK       LOCALE_READ_UNLOCK
+#else
+#  define GETNETBYADDR_LOCK         gwLOCALEr_LOCK
+#  define GETNETBYADDR_UNLOCK       gwLOCALEr_UNLOCK
+#endif
+#ifdef PERL_REENTR_USING_GETNETBYNAME_R
+#  define GETNETBYNAME_LOCK         LOCALE_READ_LOCK
+#  define GETNETBYNAME_UNLOCK       LOCALE_READ_UNLOCK
+#else
+#  define GETNETBYNAME_LOCK         gwLOCALEr_LOCK
+#  define GETNETBYNAME_UNLOCK       gwLOCALEr_UNLOCK
+#endif
+#ifdef PERL_REENTR_USING_GETPROTOBYNAME_R
+#  define GETPROTOBYNAME_LOCK       LOCALE_READ_LOCK
+#  define GETPROTOBYNAME_UNLOCK     LOCALE_READ_UNLOCK
+#else
+#  define GETPROTOBYNAME_LOCK       gwLOCALEr_LOCK
+#  define GETPROTOBYNAME_UNLOCK     gwLOCALEr_UNLOCK
+#endif
+#ifdef PERL_REENTR_USING_GETPROTOBYNUMBER_R
+#  define GETPROTOBYNUMBER_LOCK     LOCALE_READ_LOCK
+#  define GETPROTOBYNUMBER_UNLOCK   LOCALE_READ_UNLOCK
+#else
+#  define GETPROTOBYNUMBER_LOCK     gwLOCALEr_LOCK
+#  define GETPROTOBYNUMBER_UNLOCK   gwLOCALEr_UNLOCK
+#endif
+#ifdef PERL_REENTR_USING_GETPROTOENT_R
+#  define GETPROTOENT_LOCK          LOCALE_READ_LOCK
+#  define GETPROTOENT_UNLOCK        LOCALE_READ_UNLOCK
+#else
+#  define GETPROTOENT_LOCK          gwLOCALEr_LOCK
+#  define GETPROTOENT_UNLOCK        gwLOCALEr_UNLOCK
+#endif
+#ifdef PERL_REENTR_USING_GETPWNAM_R
+#  define GETPWNAM_LOCK             LOCALE_READ_LOCK
+#  define GETPWNAM_UNLOCK           LOCALE_READ_UNLOCK
+#else
+#  define GETPWNAM_LOCK             gwLOCALEr_LOCK
+#  define GETPWNAM_UNLOCK           gwLOCALEr_UNLOCK
+#endif
+#ifdef PERL_REENTR_USING_GETPWUID_R
+#  define GETPWUID_LOCK             LOCALE_READ_LOCK
+#  define GETPWUID_UNLOCK           LOCALE_READ_UNLOCK
+#else
+#  define GETPWUID_LOCK             gwLOCALEr_LOCK
+#  define GETPWUID_UNLOCK           gwLOCALEr_UNLOCK
+#endif
+#ifdef PERL_REENTR_USING_GETSERVBYNAME_R
+#  define GETSERVBYNAME_LOCK        LOCALE_READ_LOCK
+#  define GETSERVBYNAME_UNLOCK      LOCALE_READ_UNLOCK
+#else
+#  define GETSERVBYNAME_LOCK        gwLOCALEr_LOCK
+#  define GETSERVBYNAME_UNLOCK      gwLOCALEr_UNLOCK
+#endif
+#ifdef PERL_REENTR_USING_GETSERVBYPORT_R
+#  define GETSERVBYPORT_LOCK        LOCALE_READ_LOCK
+#  define GETSERVBYPORT_UNLOCK      LOCALE_READ_UNLOCK
+#else
+#  define GETSERVBYPORT_LOCK        gwLOCALEr_LOCK
+#  define GETSERVBYPORT_UNLOCK      gwLOCALEr_UNLOCK
+#endif
+#ifdef PERL_REENTR_USING_GETSERVENT_R
+#  define GETSERVENT_LOCK           LOCALE_READ_LOCK
+#  define GETSERVENT_UNLOCK         LOCALE_READ_UNLOCK
+#else
+#  define GETSERVENT_LOCK           gwLOCALEr_LOCK
+#  define GETSERVENT_UNLOCK         gwLOCALEr_UNLOCK
+#endif
+#ifdef PERL_REENTR_USING_GETSPNAM_R
+#  define GETSPNAM_LOCK             LOCALE_READ_LOCK
+#  define GETSPNAM_UNLOCK           LOCALE_READ_UNLOCK
+#else
+#  define GETSPNAM_LOCK             gwLOCALEr_LOCK
+#  define GETSPNAM_UNLOCK           gwLOCALEr_UNLOCK
+#endif
+
+#define STRFMON_LOCK        LC_MONETARY_LOCK
+#define STRFMON_UNLOCK      LC_MONETARY_UNLOCK
+
+/* End of locale/env synchronization */
+
 #ifndef PERL_NO_INLINE_FUNCTIONS
 /* Static inline funcs that depend on includes and declarations above.
    Some of these reference functions in the perl object files, and some
@@ -7239,6 +7807,7 @@ cannot have changed since the precalculation.
 
 START_EXTERN_C
 
+#  include "perlstatic.h"
 #  include "inline.h"
 #  include "sv_inline.h"
 
@@ -7246,23 +7815,6 @@ END_EXTERN_C
 
 #endif
 
-/* Some critical sections need to lock both the locale and the environment.
- * XXX khw intends to change this to lock both mutexes, but that brings up
- * issues of potential deadlock, so should be done at the beginning of a
- * development cycle.  So for now, it just locks the environment.  Note that
- * many modern platforms are locale-thread-safe anyway, so locking the locale
- * mutex is a no-op anyway */
-#define ENV_LOCALE_LOCK     ENV_LOCK
-#define ENV_LOCALE_UNLOCK   ENV_UNLOCK
-
-/* And some critical sections care only that no one else is writing either the
- * locale nor the environment.  XXX Again this is for the future.  This can be
- * simulated with using COND_WAIT in thread.h */
-#define ENV_LOCALE_READ_LOCK     ENV_LOCALE_LOCK
-#define ENV_LOCALE_READ_UNLOCK   ENV_LOCALE_UNLOCK
-
-#define Atof                           my_atof
-
 /*
 
 =for apidoc_section $numeric
@@ -7359,12 +7911,12 @@ C<strtoul>.
 #endif
 
 #define grok_bin(s,lp,fp,rp)                                                \
-                    grok_bin_oct_hex(s, lp, fp, rp, 1, _CC_BINDIGIT, 'b')
+                    grok_bin_oct_hex(s, lp, fp, rp, 1, CC_BINDIGIT_, 'b')
 #define grok_oct(s,lp,fp,rp)                                                \
                     (*(fp) |= PERL_SCAN_DISALLOW_PREFIX,                    \
-                    grok_bin_oct_hex(s, lp, fp, rp, 3, _CC_OCTDIGIT, '\0'))
+                    grok_bin_oct_hex(s, lp, fp, rp, 3, CC_OCTDIGIT_, '\0'))
 #define grok_hex(s,lp,fp,rp)                                                \
-                    grok_bin_oct_hex(s, lp, fp, rp, 4, _CC_XDIGIT, 'x')
+                    grok_bin_oct_hex(s, lp, fp, rp, 4, CC_XDIGIT_, 'x')
 
 #ifndef PERL_SCRIPT_MODE
 #define PERL_SCRIPT_MODE "r"
@@ -7442,7 +7994,9 @@ C<strtoul>.
  *    "DynaLoader::_guts" XS_VERSION
  *    XXX in the current implementation, this string is ignored.
  * 2. Declare a typedef named my_cxt_t that is a structure that contains
- *    all the data that needs to be interpreter-local.
+ *    all the data that needs to be interpreter-local that perl controls.  This
+ *    doesn't include things that libc controls, such as the uselocale object
+ *    in Configurations that use it.
  * 3. Use the START_MY_CXT macro after the declaration of my_cxt_t.
  * 4. Use the MY_CXT_INIT macro such that it is called exactly once
  *    (typically put in the BOOT: section).
@@ -7644,7 +8198,7 @@ extern void moncontrol(int);
 #endif
 
 /* ISO 6429 NEL - C1 control NExt Line */
-/* See https://www.unicode.org/reports/tr13/ */
+/* See https://www.unicode.org/unicode/reports/tr13/ */
 #define NEXT_LINE_CHAR NEXT_LINE_NATIVE
 
 #ifndef PIPESOCK_MODE
@@ -7784,7 +8338,7 @@ Allows one ending \0
 #define PERL_PV_ESCAPE_NONASCII     0x000400
 #define PERL_PV_ESCAPE_FIRSTCHAR    0x000800
 
-#define PERL_PV_ESCAPE_ALL            0x001000
+#define PERL_PV_ESCAPE_ALL          0x001000
 #define PERL_PV_ESCAPE_NOBACKSLASH  0x002000
 #define PERL_PV_ESCAPE_NOCLEAR      0x004000
 #define PERL_PV_PRETTY_NOCLEAR      PERL_PV_ESCAPE_NOCLEAR
@@ -7796,6 +8350,18 @@ Allows one ending \0
 /* Escape PV with all hex, including NUL. */
 #define PERL_PV_ESCAPE_DWIM_ALL_HEX 0x020000
 
+/* Do not escape word characters, alters meaning of other flags */
+#define PERL_PV_ESCAPE_NON_WC       0x040000
+#define PERL_PV_ESCAPE_TRUNC_MIDDLE 0x080000
+
+#define PERL_PV_PRETTY_QUOTEDPREFIX (   \
+        PERL_PV_PRETTY_ELLIPSES |       \
+        PERL_PV_PRETTY_QUOTE    |       \
+        PERL_PV_ESCAPE_NONASCII |       \
+        PERL_PV_ESCAPE_NON_WC   |       \
+        PERL_PV_ESCAPE_TRUNC_MIDDLE |   \
+        0)
+
 
 /* used by pv_display in dump.c*/
 #define PERL_PV_PRETTY_DUMP  PERL_PV_PRETTY_ELLIPSES|PERL_PV_PRETTY_QUOTE
@@ -8498,6 +9064,69 @@ END_EXTERN_C
 
 #endif /* DOUBLE_HAS_NAN */
 
+/* these are used to faciliate the env var PERL_RAND_SEED,
+ * which allows consistent behavior from code that calls
+ * srand() with no arguments, either explicitly or implicitly.
+ */
+#define PERL_SRAND_OVERRIDE_NEXT() PERL_XORSHIFT32_A(PL_srand_override_next);
+
+#define PERL_SRAND_OVERRIDE_NEXT_INIT() STMT_START {    \
+    PL_srand_override = PL_srand_override_next;         \
+    PERL_SRAND_OVERRIDE_NEXT();                         \
+} STMT_END
+
+#define PERL_SRAND_OVERRIDE_GET(into) STMT_START {      \
+    into= PL_srand_override;                            \
+    PERL_SRAND_OVERRIDE_NEXT_INIT();                    \
+} STMT_END
+
+#define PERL_SRAND_OVERRIDE_NEXT_CHILD() STMT_START {   \
+    PERL_XORSHIFT32_B(PL_srand_override_next);          \
+    PERL_SRAND_OVERRIDE_NEXT_INIT();                    \
+} STMT_END
+
+#define PERL_SRAND_OVERRIDE_NEXT_PARENT() \
+    PERL_SRAND_OVERRIDE_NEXT()
+
+/* in something like
+ *
+ * perl -le'sub f { eval "BEGIN{ f() }" }'
+ *
+ * Each iteration chews up 8 stacks frames, and we will eventually SEGV
+ * due to C stack overflow.
+ *
+ * This define provides a maximum limit to prevent the SEGV. Such code is
+ * unusual, so it unlikely we need a very large number here.
+ */
+#ifndef PERL_MAX_NESTED_EVAL_BEGIN_BLOCKS_DEFAULT
+#define PERL_MAX_NESTED_EVAL_BEGIN_BLOCKS_DEFAULT 1000
+#endif
+/* ${^MAX_NESTED_EVAL_BEGIN_BLOCKS} */
+#define PERL_VAR_MAX_NESTED_EVAL_BEGIN_BLOCKS "\015AX_NESTED_EVAL_BEGIN_BLOCKS"
+
+/* Defines like this make it easier to do porting/diag.t. They are no-
+ * ops that return their argument which can be used to hint to diag.t
+ * that a string is actually an error message. By putting the category
+ * information into the macro name it considerably simplifies extended
+ * diag.t to support these cases. Feel free to add more.
+ *
+ * While it seems tempting to try to convert all of our diagnostics to
+ * this format, it would miss part of the point of diag.t in that it
+ * detects NEW diagnostics, which would not necessarily use these
+ * macros. The macros instead exist where we know we have an error
+ * message that isnt being picked up by diag.t because it is declared
+ * as a string independently of the function it is fed to, something
+ * diag.t can never handle right without help.
+ */
+#define PERL_DIAG_STR_(x)           ("" x "")
+#define PERL_DIAG_WARN_SYNTAX(x)    PERL_DIAG_STR_(x)
+#define PERL_DIAG_DIE_SYNTAX(x)     PERL_DIAG_STR_(x)
+
+#ifndef PERL_STOP_PARSING_AFTER_N_ERRORS
+#define PERL_STOP_PARSING_AFTER_N_ERRORS 10
+#endif
+
+#define PERL_PARSE_ERROR_COUNT(f)     (f)
 
 /*
 
index 0d66a68..d93ee19 100644 (file)
@@ -13,7 +13,7 @@
 /*
  * This file used to declare accessor functions for Perl variables
  * when PERL_GLOBAL_STRUCT was enabled, but that no longer exists.
- * This file is kept for backwards compatiblity with XS code that
+ * This file is kept for backwards compatibility with XS code that
  * might include it.
  */
 #ifndef __perlapi_h__
index f2803a4..3f148d2 100644 (file)
@@ -53,7 +53,7 @@
 #  include <rms.h>
 #endif
 
-#define PerlIO_lockcnt(f) (((PerlIOl*)(f))->head->flags)
+#define PerlIO_lockcnt(f) (((PerlIOl*)(void*)(f))->head->flags)
 
 /* Call the callback or PerlIOBase, and return failure. */
 #define Perl_PerlIO_or_Base(f, callback, base, failure, args)  \
@@ -294,7 +294,7 @@ PerlIO_openn(pTHX_ const char *layers, const char *mode, int fd,
         }
     }
     else {
-        return PerlIO_fdopen(fd, (char *) mode);
+        return PerlIO_fdopen(fd, mode);
     }
     return NULL;
 }
@@ -362,14 +362,17 @@ PerlIO_debug(const char *fmt, ...)
         const char * const s = CopFILE(PL_curcop);
         /* Use fixed buffer as sv_catpvf etc. needs SVs */
         char buffer[1024];
-        const STRLEN len1 = my_snprintf(buffer, sizeof(buffer), "%.40s:%" IVdf " ", s ? s : "(none)", (IV) CopLINE(PL_curcop));
+        const STRLEN len1 = my_snprintf(buffer, sizeof(buffer), "%.40s:%" LINE_Tf " ", s ? s : "(none)", CopLINE(PL_curcop));
 #  ifdef USE_QUADMATH
 #    ifdef HAS_VSNPRINTF
         /* my_vsnprintf() isn't available with quadmath, but the native vsnprintf()
            should be, otherwise the system isn't likely to support quadmath.
            Nothing should be calling PerlIO_debug() with floating point anyway.
         */
+        DECLARATION_FOR_LC_NUMERIC_MANIPULATION;
+        STORE_LC_NUMERIC_SET_TO_NEEDED();
         const STRLEN len2 = vsnprintf(buffer + len1, sizeof(buffer) - len1, fmt, ap);
+        RESTORE_LC_NUMERIC();
 #    else
         STATIC_ASSERT_STMT(0);
 #    endif
@@ -380,8 +383,8 @@ PerlIO_debug(const char *fmt, ...)
 #else
         const char *s = CopFILE(PL_curcop);
         STRLEN len;
-        SV * const sv = Perl_newSVpvf(aTHX_ "%s:%" IVdf " ", s ? s : "(none)",
-                                      (IV) CopLINE(PL_curcop));
+        SV * const sv = Perl_newSVpvf(aTHX_ "%s:%" LINE_Tf " ",
+                                      s ? s : "(none)", CopLINE(PL_curcop));
         Perl_sv_vcatpvf(aTHX_ sv, fmt, &ap);
 
         s = SvPV_const(sv, len);
@@ -416,7 +419,7 @@ PerlIO_verify_head(pTHX_ PerlIO *f)
     assert(p);
     do {
         assert(p->head == head);
-        if (p == (PerlIOl*)f)
+        if (&p->next == f)
             seen = 1;
         p = p->next;
     } while (p);
@@ -446,14 +449,14 @@ PerlIO *
 PerlIO_allocate(pTHX)
 {
     /*
-     * Find a free slot in the table, allocating new table as necessary
+     * Find a free slot in the table, allocating new tables as necessary
      */
     PerlIOl **last;
     PerlIOl *f;
     last = &PL_perlio;
     while ((f = *last)) {
         int i;
-        last = (PerlIOl **) (f);
+        last = &f->next;
         for (i = 1; i < PERLIO_TABLE_SIZE; i++) {
             if (!((++f)->next)) {
                 goto good_exit;
@@ -464,13 +467,13 @@ PerlIO_allocate(pTHX)
     if (!f) {
         return NULL;
     }
-    *last = (PerlIOl*) f++;
+    *last = f++;
 
     good_exit:
     f->flags = 0; /* lockcnt */
     f->tab = NULL;
     f->head = f;
-    return (PerlIO*) f;
+    return &f->next;
 }
 
 #undef PerlIO_fdupopen
@@ -498,7 +501,7 @@ PerlIO_cleantable(pTHX_ PerlIOl **tablep)
     PerlIOl * const table = *tablep;
     if (table) {
         int i;
-        PerlIO_cleantable(aTHX_(PerlIOl **) & (table[0]));
+        PerlIO_cleantable(aTHX_ &table[0].next);
         for (i = PERLIO_TABLE_SIZE - 1; i > 0; i--) {
             PerlIOl * const f = table + i;
             if (f->next) {
@@ -592,7 +595,8 @@ PerlIO_clone(pTHX_ PerlInterpreter *proto, CLONE_PARAMS *param)
     DEBUG_i( PerlIO_debug("Clone %p from %p\n",(void*)aTHX,(void*)proto) );
     while ((f = *table)) {
             int i;
-            table = (PerlIOl **) (f++);
+            table = &f->next;
+            f++;
             for (i = 1; i < PERLIO_TABLE_SIZE; i++) {
                 if (f->next) {
                     (void) fp_dup(&(f->next), 0, param);
@@ -617,7 +621,8 @@ PerlIO_destruct(pTHX)
 #endif
     while ((f = *table)) {
         int i;
-        table = (PerlIOl **) (f++);
+        table = &f->next;
+        f++;
         for (i = 1; i < PERLIO_TABLE_SIZE; i++) {
             PerlIO *x = &(f->next);
             const PerlIOl *l;
@@ -690,9 +695,9 @@ PerlIO_get_layers(pTHX_ PerlIO *f)
             newSVpv(l->tab->name, 0) : &PL_sv_undef;
             SV * const arg = l->tab && l->tab->Getarg ?
             (*l->tab->Getarg)(aTHX_ &l, 0, 0) : &PL_sv_undef;
-            av_push(av, name);
-            av_push(av, arg);
-            av_push(av, newSViv((IV)l->flags));
+            av_push_simple(av, name);
+            av_push_simple(av, arg);
+            av_push_simple(av, newSViv((IV)l->flags));
             l = l->next;
         }
     }
@@ -818,7 +823,7 @@ XS(XS_io_MODIFY_SCALAR_ATTRIBUTES)
         const char * const name = SvPV_const(ST(i), len);
         SV * const layer = PerlIO_find_layer(aTHX_ name, len, 1);
         if (layer) {
-            av_push(av, SvREFCNT_inc_simple_NN(layer));
+            av_push_simple(av, SvREFCNT_inc_simple_NN(layer));
         }
         else {
             ST(count) = ST(i);
@@ -1441,7 +1446,7 @@ PerlIO_resolve_layers(pTHX_ const char *layers,
             }
             /*
              * Don't fail if handler cannot be found :via(...) etc. may do
-             * something sensible else we will just stringfy and open
+             * something sensible else we will just stringify and open
              * resulting string.
              */
         }
@@ -1628,7 +1633,8 @@ Perl_PerlIO_flush(pTHX_ PerlIO *f)
         int code = 0;
         while ((ff = *table)) {
             int i;
-            table = (PerlIOl **) (ff++);
+            table = &ff->next;
+            ff++;
             for (i = 1; i < PERLIO_TABLE_SIZE; i++) {
                 if (ff->next && PerlIO_flush(&(ff->next)) != 0)
                     code = -1;
@@ -1646,7 +1652,8 @@ PerlIOBase_flush_linebuf(pTHX)
     PerlIOl *f;
     while ((f = *table)) {
         int i;
-        table = (PerlIOl **) (f++);
+        table = &f->next;
+        f++;
         for (i = 1; i < PERLIO_TABLE_SIZE; i++) {
             if (f->next
                 && (PerlIOBase(&(f->next))->
@@ -4831,7 +4838,7 @@ Perl_PerlIO_stdin(pTHX)
     if (!PL_perlio) {
         PerlIO_stdstreams(aTHX);
     }
-    return (PerlIO*)&PL_perlio[1];
+    return &PL_perlio[1].next;
 }
 
 PerlIO *
@@ -4840,7 +4847,7 @@ Perl_PerlIO_stdout(pTHX)
     if (!PL_perlio) {
         PerlIO_stdstreams(aTHX);
     }
-    return (PerlIO*)&PL_perlio[2];
+    return &PL_perlio[2].next;
 }
 
 PerlIO *
@@ -4849,7 +4856,7 @@ Perl_PerlIO_stderr(pTHX)
     if (!PL_perlio) {
         PerlIO_stdstreams(aTHX);
     }
-    return (PerlIO*)&PL_perlio[3];
+    return &PL_perlio[3].next;
 }
 
 /*--------------------------------------------------------------------------------------*/
index b802105..96fc6f5 100644 (file)
@@ -32,7 +32,7 @@
 #  error "stdio is no longer supported as the default base layer -- use perlio."
 #endif
 
-/* --------------------  End of Configure controls ---------------------------- */
+/*--------------------  End of Configure controls ---------------------------*/
 
 /*
  * Although we may not want stdio to be used including <stdio.h> here
index 2ecf29e..02085fe 100644 (file)
@@ -48,10 +48,6 @@ PERLVAR(G, thr_key,  perl_key)       /* key to retrieve per-thread struct */
 /* XXX does anyone even use this? */
 PERLVARI(G, do_undump, bool,   FALSE)  /* -u or dump seen? */
 
-#ifndef PERL_USE_SAFE_PUTENV
-PERLVARI(G, use_safe_putenv, bool, TRUE)
-#endif
-
 #if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS)||defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
 PERLVARI(G, sig_handlers_initted, int, 0)
 #endif
@@ -106,13 +102,10 @@ PERLVARI(G, mmap_page_size, IV, 0)
 PERLVAR(G, hints_mutex, perl_mutex)    /* Mutex for refcounted he refcounting */
 PERLVAR(G, env_mutex, perl_RnW1_mutex_t)      /* Mutex for accessing ENV */
 PERLVAR(G, locale_mutex, perl_mutex)   /* Mutex related to locale handling */
-#  ifndef USE_THREAD_SAFE_LOCALE
-PERLVAR(G, lc_numeric_mutex, perl_mutex)   /* Mutex for switching LC_NUMERIC */
-#  endif
 #endif
 
 #ifdef USE_POSIX_2008_LOCALE
-PERLVAR(G, C_locale_obj, locale_t)
+PERLVARI(G, C_locale_obj, locale_t, NULL)
 #endif
 
 PERLVARI(G, watch_pvx, char *, NULL)
@@ -176,6 +169,7 @@ PERLVAR(G, check_mutex,     perl_mutex)     /* Mutex for PL_check */
 #ifdef MULTIPLICITY
 # ifdef USE_ITHREADS
 PERLVAR(G, my_ctx_mutex, perl_mutex)
+PERLVARI(G, veto_switch_non_tTHX_context, int, FALSE)
 # endif
 PERLVARI(G, my_cxt_index, int, 0)
 #endif
@@ -241,10 +235,107 @@ Instead, use the function L</wrap_keyword_plugin>.
 */
 
 #if defined(USE_ITHREADS)
-PERLVAR(G, keyword_plugin_mutex, perl_mutex)   /* Mutex for PL_keyword_plugin */
+PERLVAR(G, keyword_plugin_mutex, perl_mutex)   /* Mutex for PL_keyword_plugin and PL_infix_plugin */
 #endif
 PERLVARI(G, keyword_plugin, Perl_keyword_plugin_t, Perl_keyword_plugin_standard)
 
+/*
+=for apidoc AmnUx|Perl_infix_plugin_t|PL_infix_plugin
+
+B<NOTE:> This API exists entirely for the purpose of making the CPAN module
+C<XS::Parse::Infix> work. It is not expected that additional modules will make
+use of it; rather, that they should use C<XS::Parse::Infix> to provide parsing
+of new infix operators.
+
+Function pointer, pointing at a function used to handle extended infix
+operators. The function should be declared as
+
+        int infix_plugin_function(pTHX_
+                char *opname, STRLEN oplen,
+                struct Perl_custom_infix **infix_ptr)
+
+The function is called from the tokenizer whenever a possible infix operator
+is seen. C<opname> points to the operator name in the parser's input buffer,
+and C<oplen> gives the I<maximum> number of bytes of it that should be
+consumed; it is not null-terminated. The function is expected to examine the
+operator name and possibly other state such as L<%^H|perlvar/%^H>, to
+determine whether it wants to handle the operator name.
+
+As compared to the single stage of C<PL_keyword_plugin>, parsing of additional
+infix operators occurs in three separate stages. This is because of the more
+complex interactions it has with the parser, to ensure that operator
+precedence rules work correctly. These stages are co-ordinated by the use of
+an additional information structure.
+
+If the function wants to handle the infix operator, it must set the variable
+pointed to by C<infix_ptr> to the address of a structure that provides this
+additional information about the subsequent parsing stages. If it does not,
+it should make a call to the next function in the chain.
+
+This structure has the following definition:
+
+       struct Perl_custom_infix {
+           enum Perl_custom_infix_precedence prec;
+           void (*parse)(pTHX_ SV **opdata,
+               struct Perl_custom_infix *);
+           OP *(*build_op)(pTHX_ SV **opdata, OP *lhs, OP *rhs,
+               struct Perl_custom_infix *);
+       };
+
+The function must then return an integer giving the number of bytes consumed
+by the name of this operator. In the case of an operator whose name is
+composed of identifier characters, this must be equal to C<oplen>. In the case
+of an operator named by non-identifier characters, this is permitted to be
+shorter than C<oplen>, and any additional characters after it will not be
+claimed by the infix operator but instead will be consumed by the tokenizer
+and parser as normal.
+
+If the optional C<parse> function is provided, it is called immediately by the
+parser to let the operator's definition consume any additional syntax from the
+source code. This should I<not> be used for normal operand parsing, but it may
+be useful when implementing things like parametric operators or meta-operators
+that consume more syntax themselves. This function may use the variable
+pointed to by C<opdata> to provide an SV containing additional data to be
+passed into the C<build_op> function later on.
+
+The information structure gives the operator precedence level in the C<prec>
+field. This is used to tell the parser how much of the surrounding syntax
+before and after should be considered as operands to the operator.
+
+The tokenizer and parser will then continue to operate as normal until enough
+additional input has been parsed to form both the left- and right-hand side
+operands to the operator, according to the precedence level. At this point the
+C<build_op> function is called, being passed the left- and right-hand operands
+as optree fragments. It is expected to combine them into the resulting optree
+fragment, which it should return.
+
+After the C<build_op> function has returned, if the variable pointed to by
+C<opdata> was set to a non-C<NULL> value, it will then be destroyed by calling
+C<SvREFCNT_dec()>.
+
+For thread safety, modules should not set this variable directly.
+Instead, use the function L</wrap_infix_plugin>.
+
+However, that all said, the introductory note above still applies. This
+variable is provided in core perl only for the benefit of the
+C<XS::Parse::Infix> module. That module acts as a central registry for infix
+operators, automatically handling things like deparse support and
+discovery/reflection, and these abilities only work because it knows all the
+registered operators. Other modules should not use this interpreter variable
+directly to implement them because then those central features would no longer
+work properly.
+
+Furthermore, it is likely that this (experimental) API will be replaced in a
+future Perl version by a more complete API that fully implements the central
+registry and other semantics currently provided by C<XS::Parse::Infix>, once
+the module has had sufficient experimental testing time. This current
+mechanism exists only as an interim measure to get to that stage.
+
+=cut
+*/
+
+PERLVARI(G, infix_plugin, Perl_infix_plugin_t, Perl_infix_plugin_standard)
+
 PERLVARI(G, op_sequence, HV *, NULL)   /* dump.c */
 PERLVARI(G, op_seq,    UV,     0)      /* dump.c */
 
@@ -264,12 +355,13 @@ PERLVAR(G, malloc_mutex, perl_mutex)      /* Mutex for malloc */
 #endif
 
 PERLVARI(G, hash_seed_set, bool, FALSE)        /* perl.c */
-PERLVARA(G, hash_seed_w, PERL_HASH_SEED_WORDS, __PERL_HASH_WORD_TYPE) /* perl.c and hv.h */
+PERLVARA(G, hash_seed_w, PERL_HASH_SEED_WORDS, PVT__PERL_HASH_WORD_TYPE) /* perl.c and hv.h */
 #if defined(PERL_HASH_STATE_BYTES)
-PERLVARA(G, hash_state_w, PERL_HASH_STATE_WORDS, __PERL_HASH_WORD_TYPE) /* perl.c and hv.h */
+PERLVARA(G, hash_state_w, PERL_HASH_STATE_WORDS, PVT__PERL_HASH_WORD_TYPE) /* perl.c and hv.h */
 #endif
 #if defined(PERL_USE_SINGLE_CHAR_HASH_CACHE)
-PERLVARA(G, hash_chars, (1+256) * sizeof(U32), unsigned char) /* perl.c and hv.h */
+#define PERL_SINGLE_CHAR_HASH_CACHE_ELEMS ((1+256) * sizeof(U32))
+PERLVARA(G, hash_chars, PERL_SINGLE_CHAR_HASH_CACHE_ELEMS, unsigned char) /* perl.c and hv.h */
 #endif
 
 /* The path separator can vary depending on whether we're running under DCL or
@@ -305,3 +397,6 @@ PERLVARI(G, strategy_socket,     int, 0)    /* doio.c */
 PERLVARI(G, strategy_accept,     int, 0)       /* doio.c */
 PERLVARI(G, strategy_pipe,       int, 0)       /* doio.c */
 PERLVARI(G, strategy_socketpair, int, 0)       /* doio.c */
+
+PERLVARI(G, my_environ, char **, NULL)
+PERLVARI(G, origenviron, char **, NULL)
index 200df18..8c5acb1 100644 (file)
@@ -1,12 +1,12 @@
-/* -*- buffer-read-only: t -*-
+/* -*- mode: C; buffer-read-only: t -*-
    !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!!
    This file is built by regen_perly.pl from perly.y.
    Any changes made here will be lost!
  */
 
 case 2:
-#line 140 "perly.y"
-                        {
+#line 161 "perly.y"
+    {
                          parser->expect = XSTATE;
                           (yyval.ival) = 0;
                        }
@@ -14,8 +14,8 @@ case 2:
     break;
 
   case 3:
-#line 145 "perly.y"
-                        {
+#line 166 "perly.y"
+    {
                          newPROG(block_end((ps[-1].val.ival),(ps[0].val.opval)));
                          PL_compiling.cop_seq = 0;
                          (yyval.ival) = 0;
@@ -24,8 +24,8 @@ case 2:
     break;
 
   case 4:
-#line 151 "perly.y"
-                        {
+#line 172 "perly.y"
+    {
                          parser->expect = XTERM;
                           (yyval.ival) = 0;
                        }
@@ -33,8 +33,8 @@ case 2:
     break;
 
   case 5:
-#line 156 "perly.y"
-                        {
+#line 177 "perly.y"
+    {
                          PL_eval_root = (ps[0].val.opval);
                          (yyval.ival) = 0;
                        }
@@ -42,8 +42,8 @@ case 2:
     break;
 
   case 6:
-#line 161 "perly.y"
-                        {
+#line 182 "perly.y"
+    {
                          parser->expect = XBLOCK;
                           (yyval.ival) = 0;
                        }
@@ -51,8 +51,8 @@ case 2:
     break;
 
   case 7:
-#line 166 "perly.y"
-                        {
+#line 187 "perly.y"
+    {
                          PL_pad_reset_pending = TRUE;
                          PL_eval_root = (ps[0].val.opval);
                          (yyval.ival) = 0;
@@ -63,8 +63,8 @@ case 2:
     break;
 
   case 8:
-#line 174 "perly.y"
-                        {
+#line 195 "perly.y"
+    {
                          parser->expect = XSTATE;
                           (yyval.ival) = 0;
                        }
@@ -72,8 +72,8 @@ case 2:
     break;
 
   case 9:
-#line 179 "perly.y"
-                        {
+#line 200 "perly.y"
+    {
                          PL_pad_reset_pending = TRUE;
                          PL_eval_root = (ps[0].val.opval);
                          (yyval.ival) = 0;
@@ -84,8 +84,8 @@ case 2:
     break;
 
   case 10:
-#line 187 "perly.y"
-                        {
+#line 208 "perly.y"
+    {
                          parser->expect = XSTATE;
                           (yyval.ival) = 0;
                        }
@@ -93,8 +93,8 @@ case 2:
     break;
 
   case 11:
-#line 192 "perly.y"
-                        {
+#line 213 "perly.y"
+    {
                          PL_pad_reset_pending = TRUE;
                          PL_eval_root = (ps[0].val.opval);
                          (yyval.ival) = 0;
@@ -105,8 +105,8 @@ case 2:
     break;
 
   case 12:
-#line 200 "perly.y"
-                        {
+#line 221 "perly.y"
+    {
                          parser->expect = XSTATE;
                           (yyval.ival) = 0;
                        }
@@ -114,8 +114,8 @@ case 2:
     break;
 
   case 13:
-#line 205 "perly.y"
-                        {
+#line 226 "perly.y"
+    {
                          PL_eval_root = (ps[0].val.opval);
                          (yyval.ival) = 0;
                        }
@@ -123,8 +123,8 @@ case 2:
     break;
 
   case 14:
-#line 210 "perly.y"
-                        {
+#line 231 "perly.y"
+    {
                          parser->expect = XSTATE;
                          (yyval.ival) = 0;
                        }
@@ -132,8 +132,8 @@ case 2:
     break;
 
   case 15:
-#line 215 "perly.y"
-                        {
+#line 236 "perly.y"
+    {
                          PL_eval_root = (ps[0].val.opval);
                          (yyval.ival) = 0;
                        }
@@ -141,55 +141,85 @@ case 2:
     break;
 
   case 16:
-#line 223 "perly.y"
-                        { if (parser->copline > (line_t)(ps[-3].val.ival))
+#line 245 "perly.y"
+    { (yyval.ival) = KW_SUB_named_sig; }
+
+    break;
+
+  case 17:
+#line 247 "perly.y"
+    { (yyval.ival) = KW_METHOD_named; }
+
+    break;
+
+  case 18:
+#line 252 "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));
                        }
 
     break;
 
-  case 17:
-#line 230 "perly.y"
-                                { (yyval.opval) = NULL; }
+  case 19:
+#line 259 "perly.y"
+    { (yyval.opval) = NULL; }
 
     break;
 
-  case 18:
-#line 235 "perly.y"
-                        { if (parser->copline > (line_t)(ps[-6].val.ival))
+  case 20:
+#line 264 "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));
                        }
 
     break;
 
-  case 19:
-#line 242 "perly.y"
-                        { (yyval.ival) = block_start(TRUE);
+  case 21:
+#line 271 "perly.y"
+    { (yyval.ival) = block_start(TRUE);
                          parser->parsed_sub = 0; }
 
     break;
 
-  case 20:
-#line 247 "perly.y"
-                        { if (parser->copline > (line_t)(ps[-3].val.ival))
+  case 22:
+#line 276 "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));
                        }
 
     break;
 
-  case 21:
-#line 254 "perly.y"
-                        { (yyval.ival) = block_start(FALSE);
+  case 23:
+#line 283 "perly.y"
+    { (yyval.ival) = block_start(FALSE);
                          parser->parsed_sub = 0; }
 
     break;
 
-  case 23:
-#line 262 "perly.y"
-                        {   (yyval.opval) = op_append_list(OP_LINESEQ, (ps[-1].val.opval), (ps[0].val.opval));
+  case 25:
+#line 292 "perly.y"
+    { parser->in_my = 1; }
+
+    break;
+
+  case 26:
+#line 294 "perly.y"
+    { parser->in_my = 0; intro_my(); }
+
+    break;
+
+  case 27:
+#line 296 "perly.y"
+    { (yyval.opval) = (ps[-2].val.opval); }
+
+    break;
+
+  case 29:
+#line 303 "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))
                                PL_hints |= HINT_BLOCK_SCOPE;
@@ -197,9 +227,9 @@ case 2:
 
     break;
 
-  case 25:
-#line 273 "perly.y"
-                        {   (yyval.opval) = op_append_list(OP_LINESEQ, (ps[-1].val.opval), (ps[0].val.opval));
+  case 31:
+#line 314 "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))
                                PL_hints |= HINT_BLOCK_SCOPE;
@@ -207,23 +237,23 @@ case 2:
 
     break;
 
-  case 26:
-#line 282 "perly.y"
-                        {
+  case 32:
+#line 323 "perly.y"
+    {
                          (yyval.opval) = (ps[0].val.opval) ? newSTATEOP(0, NULL, (ps[0].val.opval)) : NULL;
                        }
 
     break;
 
-  case 27:
-#line 286 "perly.y"
-                        { (yyval.opval) = (ps[0].val.opval); }
+  case 33:
+#line 327 "perly.y"
+    { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
-  case 28:
-#line 290 "perly.y"
-                        {
+  case 34:
+#line 331 "perly.y"
+    {
                           SV *label = cSVOPx_sv((ps[-1].val.opval));
                          (yyval.opval) = newSTATEOP(SvFLAGS(label) & SVf_UTF8,
                                             savepv(SvPVX_const(label)), (ps[0].val.opval));
@@ -232,9 +262,9 @@ case 2:
 
     break;
 
-  case 29:
-#line 297 "perly.y"
-                        {
+  case 35:
+#line 338 "perly.y"
+    {
                           SV *label = cSVOPx_sv((ps[-1].val.opval));
                          (yyval.opval) = newSTATEOP(SvFLAGS(label) & SVf_UTF8,
                                             savepv(SvPVX_const(label)), (ps[0].val.opval));
@@ -243,15 +273,15 @@ case 2:
 
     break;
 
-  case 30:
-#line 307 "perly.y"
-                        { (yyval.opval) = (ps[0].val.opval); }
+  case 36:
+#line 348 "perly.y"
+    { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
-  case 31:
-#line 309 "perly.y"
-                        {
+  case 37:
+#line 350 "perly.y"
+    {
                          CV *fmtcv = PL_compcv;
                          newFORM((ps[-2].val.ival), (ps[-1].val.opval), (ps[0].val.opval));
                          (yyval.opval) = NULL;
@@ -263,9 +293,9 @@ case 2:
 
     break;
 
-  case 32:
-#line 321 "perly.y"
-                        {
+  case 38:
+#line 362 "perly.y"
+    {
                           init_named_cv(PL_compcv, (ps[-1].val.opval));
                          parser->in_my = 0;
                          parser->in_my_stash = NULL;
@@ -273,9 +303,9 @@ case 2:
 
     break;
 
-  case 33:
-#line 327 "perly.y"
-                        {
+  case 39:
+#line 368 "perly.y"
+    {
                          SvREFCNT_inc_simple_void(PL_compcv);
                          (ps[-5].val.opval)->op_type == OP_CONST
                              ? newATTRSUB((ps[-4].val.ival), (ps[-5].val.opval), (ps[-2].val.opval), (ps[-1].val.opval), (ps[0].val.opval))
@@ -288,23 +318,29 @@ case 2:
 
     break;
 
-  case 34:
-#line 342 "perly.y"
-                        {
+  case 40:
+#line 383 "perly.y"
+    {
                           init_named_cv(PL_compcv, (ps[-1].val.opval));
+                         if((ps[-2].val.ival) == KW_METHOD_named) {
+                             croak_kw_unless_class("method");
+                             class_prepare_method_parse(PL_compcv);
+                         }
                          parser->in_my = 0;
                          parser->in_my_stash = NULL;
                        }
 
     break;
 
-  case 35:
-#line 348 "perly.y"
-                        {
+  case 41:
+#line 393 "perly.y"
+    {
+                         OP *body = (ps[0].val.opval);
+
                          SvREFCNT_inc_simple_void(PL_compcv);
                          (ps[-4].val.opval)->op_type == OP_CONST
-                             ? newATTRSUB((ps[-3].val.ival), (ps[-4].val.opval), NULL, (ps[-1].val.opval), (ps[0].val.opval))
-                             : newMYSUB(  (ps[-3].val.ival), (ps[-4].val.opval), NULL, (ps[-1].val.opval), (ps[0].val.opval))
+                             ? newATTRSUB((ps[-3].val.ival), (ps[-4].val.opval), NULL, (ps[-1].val.opval), body)
+                             : newMYSUB(  (ps[-3].val.ival), (ps[-4].val.opval), NULL, (ps[-1].val.opval), body)
                          ;
                          (yyval.opval) = NULL;
                          intro_my();
@@ -313,9 +349,43 @@ case 2:
 
     break;
 
-  case 36:
-#line 359 "perly.y"
-                        {
+  case 42:
+#line 406 "perly.y"
+    {
+                         switch((ps[-1].val.ival)) {
+                             case KEY_ADJUST:
+                                croak_kw_unless_class("ADJUST");
+                                class_prepare_method_parse(PL_compcv);
+                                break;
+                             default:
+                                NOT_REACHED;
+                         }
+                       }
+
+    break;
+
+  case 43:
+#line 417 "perly.y"
+    {
+                         OP *body = (ps[0].val.opval);
+                         SvREFCNT_inc_simple_void(PL_compcv);
+
+                         CV *cv;
+
+                         switch((ps[-3].val.ival)) {
+                             case KEY_ADJUST:
+                                 cv = newATTRSUB((ps[-2].val.ival), NULL, NULL, NULL, body);
+                                 class_add_ADJUST(PL_curstash, cv);
+                                 break;
+                         }
+                         (yyval.opval) = NULL;
+                       }
+
+    break;
+
+  case 44:
+#line 436 "perly.y"
+    {
                          package((ps[-1].val.opval));
                          if ((ps[-2].val.opval))
                              package_version((ps[-2].val.opval));
@@ -324,15 +394,30 @@ case 2:
 
     break;
 
-  case 37:
-#line 366 "perly.y"
-                        { CvSPECIAL_on(PL_compcv); /* It's a BEGIN {} */ }
+  case 45:
+#line 443 "perly.y"
+    {
+                         package((ps[-2].val.opval));
+                         if ((ps[-3].val.opval))
+                             package_version((ps[-3].val.opval));
+                         (yyval.opval) = NULL;
+                         class_setup_stash(PL_curstash);
+                         if ((ps[-1].val.opval)) {
+                             class_apply_attributes(PL_curstash, (ps[-1].val.opval));
+                         }
+                       }
 
     break;
 
-  case 38:
-#line 368 "perly.y"
-                        {
+  case 46:
+#line 454 "perly.y"
+    { CvSPECIAL_on(PL_compcv); /* It's a BEGIN {} */ }
+
+    break;
+
+  case 47:
+#line 458 "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));
                          parser->parsed_sub = 1;
@@ -341,9 +426,9 @@ case 2:
 
     break;
 
-  case 39:
-#line 375 "perly.y"
-                        {
+  case 48:
+#line 465 "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)));
                          parser->copline = (line_t)(ps[-6].val.ival);
@@ -351,9 +436,9 @@ case 2:
 
     break;
 
-  case 40:
-#line 381 "perly.y"
-                        {
+  case 49:
+#line 471 "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))));
                          parser->copline = (line_t)(ps[-6].val.ival);
@@ -361,30 +446,30 @@ case 2:
 
     break;
 
-  case 41:
-#line 387 "perly.y"
-                        {
+  case 50:
+#line 477 "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);
                        }
 
     break;
 
-  case 42:
-#line 392 "perly.y"
-                        { (yyval.opval) = block_end((ps[-3].val.ival), newWHENOP((ps[-2].val.opval), op_scope((ps[0].val.opval)))); }
+  case 51:
+#line 482 "perly.y"
+    { (yyval.opval) = block_end((ps[-3].val.ival), newWHENOP((ps[-2].val.opval), op_scope((ps[0].val.opval)))); }
 
     break;
 
-  case 43:
-#line 394 "perly.y"
-                        { (yyval.opval) = newWHENOP(0, op_scope((ps[0].val.opval))); }
+  case 52:
+#line 484 "perly.y"
+    { (yyval.opval) = newWHENOP(0, op_scope((ps[0].val.opval))); }
 
     break;
 
-  case 44:
-#line 396 "perly.y"
-                        {
+  case 53:
+#line 486 "perly.y"
+    {
                          (yyval.opval) = block_end((ps[-5].val.ival),
                                  newWHILEOP(0, 1, NULL,
                                      (ps[-4].val.opval), (ps[-1].val.opval), (ps[0].val.opval), (ps[-2].val.ival)));
@@ -393,9 +478,9 @@ case 2:
 
     break;
 
-  case 45:
-#line 403 "perly.y"
-                        {
+  case 54:
+#line 493 "perly.y"
+    {
                          (yyval.opval) = block_end((ps[-5].val.ival),
                                  newWHILEOP(0, 1, NULL,
                                      (ps[-4].val.opval), (ps[-1].val.opval), (ps[0].val.opval), (ps[-2].val.ival)));
@@ -404,21 +489,21 @@ case 2:
 
     break;
 
-  case 46:
-#line 410 "perly.y"
-                        { parser->expect = XTERM; }
+  case 55:
+#line 500 "perly.y"
+    { parser->expect = XTERM; }
 
     break;
 
-  case 47:
-#line 412 "perly.y"
-                        { parser->expect = XTERM; }
+  case 56:
+#line 502 "perly.y"
+    { parser->expect = XTERM; }
 
     break;
 
-  case 48:
-#line 415 "perly.y"
-                        {
+  case 57:
+#line 505 "perly.y"
+    {
                          OP *initop = (ps[-9].val.opval);
                          OP *forop = newWHILEOP(0, 1, NULL,
                                      scalar((ps[-6].val.opval)), (ps[0].val.opval), (ps[-2].val.opval), (ps[-3].val.ival));
@@ -435,18 +520,18 @@ case 2:
 
     break;
 
-  case 49:
-#line 430 "perly.y"
-                        {
+  case 58:
+#line 520 "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);
                        }
 
     break;
 
-  case 50:
-#line 435 "perly.y"
-                        {
+  case 59:
+#line 525 "perly.y"
+    {
                           if ((ps[-6].val.opval)->op_type == OP_PADSV)
                             /* degenerate case of 1 var: for my ($x) ....
                                Flag it so it can be special-cased in newFOROP */
@@ -457,9 +542,9 @@ case 2:
 
     break;
 
-  case 51:
-#line 444 "perly.y"
-                        {
+  case 60:
+#line 534 "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)));
                          parser->copline = (line_t)(ps[-7].val.ival);
@@ -467,15 +552,15 @@ case 2:
 
     break;
 
-  case 52:
-#line 450 "perly.y"
-                        { parser->in_my = 0; (yyval.opval) = my((ps[0].val.opval)); }
+  case 61:
+#line 540 "perly.y"
+    { parser->in_my = 0; (yyval.opval) = my((ps[0].val.opval)); }
 
     break;
 
-  case 53:
-#line 452 "perly.y"
-                        {
+  case 62:
+#line 542 "perly.y"
+    {
                          (yyval.opval) = block_end(
                                (ps[-7].val.ival),
                                newFOROP(0,
@@ -490,9 +575,9 @@ case 2:
 
     break;
 
-  case 54:
-#line 465 "perly.y"
-                        {
+  case 63:
+#line 555 "perly.y"
+    {
                          (yyval.opval) = block_end((ps[-4].val.ival), newFOROP(
                                0, op_lvalue(newUNOP(OP_REFGEN, 0,
                                                     (ps[-6].val.opval)),
@@ -502,9 +587,9 @@ case 2:
 
     break;
 
-  case 55:
-#line 473 "perly.y"
-                        {
+  case 64:
+#line 563 "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)));
                          parser->copline = (line_t)(ps[-6].val.ival);
@@ -512,33 +597,32 @@ case 2:
 
     break;
 
-  case 56:
-#line 479 "perly.y"
-                        { parser->in_my = 1; }
-
-    break;
-
-  case 57:
-#line 481 "perly.y"
-                        { parser->in_my = 0; intro_my(); }
+  case 65:
+#line 569 "perly.y"
+    {
+                         if(!(ps[0].val.opval)) {
+                             yyerror("catch block requires a (VAR)");
+                             YYERROR;
+                         }
+                       }
 
     break;
 
-  case 58:
-#line 483 "perly.y"
-                        {
+  case 66:
+#line 576 "perly.y"
+    {
                          (yyval.opval) = newTRYCATCHOP(0,
-                                 (ps[-9].val.opval), (ps[-4].val.opval), block_end((ps[-5].val.ival), op_scope((ps[-1].val.opval))));
+                                 (ps[-6].val.opval), (ps[-3].val.opval), block_end((ps[-4].val.ival), op_scope((ps[-1].val.opval))));
                          if((ps[0].val.opval))
                              (yyval.opval) = op_wrap_finally((yyval.opval), (ps[0].val.opval));
-                         parser->copline = (line_t)(ps[-10].val.ival);
+                         parser->copline = (line_t)(ps[-7].val.ival);
                        }
 
     break;
 
-  case 59:
-#line 491 "perly.y"
-                        {
+  case 67:
+#line 584 "perly.y"
+    {
                          /* a block is a loop that happens once */
                          (yyval.opval) = newWHILEOP(0, 1, NULL,
                                  NULL, (ps[-1].val.opval), (ps[0].val.opval), 0);
@@ -546,9 +630,9 @@ case 2:
 
     break;
 
-  case 60:
-#line 497 "perly.y"
-                        {
+  case 68:
+#line 590 "perly.y"
+    {
                          package((ps[-2].val.opval));
                          if ((ps[-3].val.opval)) {
                              package_version((ps[-3].val.opval));
@@ -557,9 +641,9 @@ case 2:
 
     break;
 
-  case 61:
-#line 504 "perly.y"
-                        {
+  case 69:
+#line 597 "perly.y"
+    {
                          /* a block is a loop that happens once */
                          (yyval.opval) = newWHILEOP(0, 1, NULL,
                                  NULL, block_end((ps[-3].val.ival), (ps[-1].val.opval)), NULL, 0);
@@ -569,43 +653,80 @@ case 2:
 
     break;
 
-  case 62:
-#line 512 "perly.y"
-                        {
+  case 70:
+#line 605 "perly.y"
+    {
+                         package((ps[-3].val.opval));
+
+                         if ((ps[-4].val.opval)) {
+                             package_version((ps[-4].val.opval));
+                         }
+                         class_setup_stash(PL_curstash);
+                         if ((ps[-2].val.opval)) {
+                             class_apply_attributes(PL_curstash, (ps[-2].val.opval));
+                         }
+                       }
+
+    break;
+
+  case 71:
+#line 617 "perly.y"
+    {
+                         /* a block is a loop that happens once */
+                         (yyval.opval) = newWHILEOP(0, 1, NULL,
+                                 NULL, block_end((ps[-3].val.ival), (ps[-1].val.opval)), NULL, 0);
+                         if (parser->copline > (line_t)(ps[-4].val.ival))
+                             parser->copline = (line_t)(ps[-4].val.ival);
+                       }
+
+    break;
+
+  case 72:
+#line 625 "perly.y"
+    {
                          (yyval.opval) = (ps[-1].val.opval);
                        }
 
     break;
 
-  case 63:
-#line 516 "perly.y"
-                        {
+  case 73:
+#line 629 "perly.y"
+    {
+                         (yyval.opval) = (ps[-1].val.opval);
+                       }
+
+    break;
+
+  case 74:
+#line 633 "perly.y"
+    {
                          (yyval.opval) = newDEFEROP(0, op_scope((ps[0].val.opval)));
                        }
 
     break;
 
-  case 64:
-#line 520 "perly.y"
-                        {
+  case 75:
+#line 637 "perly.y"
+    {
+                          /* diag_listed_as: Unimplemented */
                          (yyval.opval) = newLISTOP(OP_DIE, 0, newOP(OP_PUSHMARK, 0),
                                newSVOP(OP_CONST, 0, newSVpvs("Unimplemented")));
                        }
 
     break;
 
-  case 65:
-#line 525 "perly.y"
-                        {
+  case 76:
+#line 643 "perly.y"
+    {
                          (yyval.opval) = NULL;
                          parser->copline = NOLINE;
                        }
 
     break;
 
-  case 66:
-#line 533 "perly.y"
-                        { OP *list;
+  case 77:
+#line 651 "perly.y"
+    { OP *list;
                          if ((ps[0].val.opval)) {
                              OP *term = (ps[0].val.opval);
                              list = op_append_elem(OP_LIST, (ps[-1].val.opval), term);
@@ -622,73 +743,73 @@ case 2:
 
     break;
 
-  case 68:
-#line 552 "perly.y"
-                        { (yyval.opval) = op_unscope((ps[-1].val.opval)); }
+  case 79:
+#line 670 "perly.y"
+    { (yyval.opval) = op_unscope((ps[-1].val.opval)); }
 
     break;
 
-  case 70:
-#line 560 "perly.y"
-                        { (yyval.opval) = NULL; }
+  case 81:
+#line 678 "perly.y"
+    { (yyval.opval) = NULL; }
 
     break;
 
-  case 71:
-#line 562 "perly.y"
-                        { (yyval.opval) = (ps[0].val.opval); }
+  case 82:
+#line 680 "perly.y"
+    { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
-  case 72:
-#line 564 "perly.y"
-                        { (yyval.opval) = newLOGOP(OP_AND, 0, (ps[0].val.opval), (ps[-2].val.opval)); }
+  case 83:
+#line 682 "perly.y"
+    { (yyval.opval) = newLOGOP(OP_AND, 0, (ps[0].val.opval), (ps[-2].val.opval)); }
 
     break;
 
-  case 73:
-#line 566 "perly.y"
-                        { (yyval.opval) = newLOGOP(OP_OR, 0, (ps[0].val.opval), (ps[-2].val.opval)); }
+  case 84:
+#line 684 "perly.y"
+    { (yyval.opval) = newLOGOP(OP_OR, 0, (ps[0].val.opval), (ps[-2].val.opval)); }
 
     break;
 
-  case 74:
-#line 568 "perly.y"
-                        { (yyval.opval) = newLOOPOP(OPf_PARENS, 1, scalar((ps[0].val.opval)), (ps[-2].val.opval)); }
+  case 85:
+#line 686 "perly.y"
+    { (yyval.opval) = newLOOPOP(OPf_PARENS, 1, scalar((ps[0].val.opval)), (ps[-2].val.opval)); }
 
     break;
 
-  case 75:
-#line 570 "perly.y"
-                        { (yyval.opval) = newLOOPOP(OPf_PARENS, 1, (ps[0].val.opval), (ps[-2].val.opval)); }
+  case 86:
+#line 688 "perly.y"
+    { (yyval.opval) = newLOOPOP(OPf_PARENS, 1, (ps[0].val.opval), (ps[-2].val.opval)); }
 
     break;
 
-  case 76:
-#line 572 "perly.y"
-                        { (yyval.opval) = newFOROP(0, NULL, (ps[0].val.opval), (ps[-2].val.opval), NULL);
+  case 87:
+#line 690 "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 77:
-#line 575 "perly.y"
-                        { (yyval.opval) = newWHENOP((ps[0].val.opval), op_scope((ps[-2].val.opval))); }
+  case 88:
+#line 693 "perly.y"
+    { (yyval.opval) = newWHENOP((ps[0].val.opval), op_scope((ps[-2].val.opval))); }
 
     break;
 
-  case 79:
-#line 582 "perly.y"
-                        {
+  case 90:
+#line 700 "perly.y"
+    {
                          ((ps[0].val.opval))->op_flags |= OPf_PARENS;
                          (yyval.opval) = op_scope((ps[0].val.opval));
                        }
 
     break;
 
-  case 80:
-#line 587 "perly.y"
-                        { parser->copline = (line_t)(ps[-5].val.ival);
+  case 91:
+#line 705 "perly.y"
+    { parser->copline = (line_t)(ps[-5].val.ival);
                            (yyval.opval) = newCONDOP(0,
                                newSTATEOP(OPf_SPECIAL,NULL,(ps[-3].val.opval)),
                                op_scope((ps[-1].val.opval)), (ps[0].val.opval));
@@ -697,145 +818,157 @@ case 2:
 
     break;
 
-  case 82:
-#line 599 "perly.y"
-                        { (yyval.opval) = op_scope((ps[0].val.opval)); }
+  case 93:
+#line 717 "perly.y"
+    { (yyval.opval) = op_scope((ps[0].val.opval)); }
 
     break;
 
-  case 83:
-#line 604 "perly.y"
-                        { (yyval.opval) = NULL; }
+  case 94:
+#line 722 "perly.y"
+    { (yyval.opval) = NULL; }
 
     break;
 
-  case 84:
-#line 606 "perly.y"
-                        { (yyval.opval) = op_scope((ps[0].val.opval)); }
+  case 95:
+#line 724 "perly.y"
+    { (yyval.opval) = op_scope((ps[0].val.opval)); }
 
     break;
 
-  case 85:
-#line 611 "perly.y"
-                        { (yyval.ival) = (PL_min_intro_pending &&
+  case 96:
+#line 729 "perly.y"
+    { (yyval.ival) = (PL_min_intro_pending &&
                            PL_max_intro_pending >=  PL_min_intro_pending);
                          intro_my(); }
 
     break;
 
-  case 88:
-#line 623 "perly.y"
-                        { YYSTYPE tmplval;
+  case 99:
+#line 741 "perly.y"
+    { YYSTYPE tmplval;
                          (void)scan_num("1", &tmplval);
                          (yyval.opval) = tmplval.opval; }
 
     break;
 
-  case 90:
-#line 631 "perly.y"
-                        { (yyval.opval) = invert(scalar((ps[0].val.opval))); }
+  case 101:
+#line 749 "perly.y"
+    { (yyval.opval) = invert(scalar((ps[0].val.opval))); }
 
     break;
 
-  case 91:
-#line 636 "perly.y"
-                        { (yyval.opval) = (ps[0].val.opval); intro_my(); }
+  case 102:
+#line 754 "perly.y"
+    { (yyval.opval) = (ps[0].val.opval); intro_my(); }
 
     break;
 
-  case 92:
-#line 640 "perly.y"
-                        { (yyval.opval) = (ps[0].val.opval); intro_my(); }
+  case 103:
+#line 758 "perly.y"
+    { (yyval.opval) = (ps[0].val.opval); intro_my(); }
 
     break;
 
-  case 93:
-#line 643 "perly.y"
-                                { (yyval.opval) = (ps[0].val.opval); }
+  case 104:
+#line 761 "perly.y"
+    { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
-  case 95:
-#line 648 "perly.y"
-                        { (yyval.ival) = start_subparse(FALSE, 0);
+  case 106:
+#line 766 "perly.y"
+    { (yyval.ival) = start_subparse(FALSE, 0);
                            SAVEFREESV(PL_compcv); }
 
     break;
 
-  case 96:
-#line 654 "perly.y"
-                        { (yyval.ival) = start_subparse(FALSE, CVf_ANON);
+  case 107:
+#line 772 "perly.y"
+    { (yyval.ival) = start_subparse(FALSE, CVf_ANON);
                            SAVEFREESV(PL_compcv); }
 
     break;
 
-  case 97:
-#line 659 "perly.y"
-                        { (yyval.ival) = start_subparse(TRUE, 0);
+  case 108:
+#line 777 "perly.y"
+    { (yyval.ival) = start_subparse(FALSE, CVf_ANON|CVf_IsMETHOD);
                            SAVEFREESV(PL_compcv); }
 
     break;
 
-  case 103:
-#line 678 "perly.y"
-                        { (yyval.opval) = (ps[0].val.opval); }
+  case 109:
+#line 782 "perly.y"
+    { (yyval.ival) = start_subparse(TRUE, 0);
+                           SAVEFREESV(PL_compcv); }
 
     break;
 
-  case 104:
-#line 680 "perly.y"
-                        { (yyval.opval) = NULL; }
+  case 115:
+#line 801 "perly.y"
+    {
+                         OP *attrlist = (ps[0].val.opval);
+                         if(attrlist && !PL_parser->sig_seen)
+                             attrlist = apply_builtin_cv_attributes(PL_compcv, attrlist);
+                         (yyval.opval) = attrlist;
+                       }
 
     break;
 
-  case 105:
-#line 685 "perly.y"
-                        { (yyval.opval) = (ps[0].val.opval); }
+  case 116:
+#line 808 "perly.y"
+    { (yyval.opval) = NULL; }
 
     break;
 
-  case 106:
-#line 687 "perly.y"
-                        { (yyval.opval) = NULL; }
+  case 117:
+#line 813 "perly.y"
+    { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
-  case 107:
-#line 698 "perly.y"
-                        { parser->in_my = 0; (yyval.opval) = NULL; }
+  case 118:
+#line 815 "perly.y"
+    { (yyval.opval) = NULL; }
 
     break;
 
-  case 108:
-#line 700 "perly.y"
-                        { parser->in_my = 0; (yyval.opval) = (ps[0].val.opval); }
+  case 119:
+#line 826 "perly.y"
+    { parser->in_my = 0; (yyval.opval) = NULL; }
 
     break;
 
-  case 109:
-#line 705 "perly.y"
-                        { (yyval.ival) = '@'; }
+  case 120:
+#line 828 "perly.y"
+    { parser->in_my = 0; (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
-  case 110:
-#line 707 "perly.y"
-                        { (yyval.ival) = '%'; }
+  case 121:
+#line 833 "perly.y"
+    { (yyval.ival) = '@'; }
 
     break;
 
-  case 111:
-#line 711 "perly.y"
-                        {
-                            I32 sigil   = (ps[-2].val.ival);
-                            OP *var     = (ps[-1].val.opval);
-                            OP *defexpr = (ps[0].val.opval);
+  case 122:
+#line 835 "perly.y"
+    { (yyval.ival) = '%'; }
 
-                            if (parser->sig_slurpy)
-                                yyerror("Multiple slurpy parameters not allowed");
-                            parser->sig_slurpy = (char)sigil;
+    break;
+
+  case 123:
+#line 839 "perly.y"
+    {
+                            I32 sigil = (ps[-2].val.ival);
+                            OP *var   = (ps[-1].val.opval);
+                            OP *defop = (ps[0].val.opval);
+
+                            if (parser->sig_slurpy)
+                                yyerror("Multiple slurpy parameters not allowed");
+                            parser->sig_slurpy = (char)sigil;
 
-                            if (defexpr)
+                            if (defop)
                                 yyerror("A slurpy parameter may not have "
                                         "a default value");
 
@@ -844,32 +977,41 @@ case 2:
 
     break;
 
-  case 113:
-#line 732 "perly.y"
-                        { (yyval.opval) = newOP(OP_NULL, 0); }
+  case 125:
+#line 860 "perly.y"
+    { (yyval.opval) = newARGDEFELEMOP(0, newOP(OP_NULL, 0), parser->sig_elems); }
 
     break;
 
-  case 114:
-#line 734 "perly.y"
-                        { (yyval.opval) = (ps[0].val.opval); }
+  case 126:
+#line 862 "perly.y"
+    {
+                            I32 flags = 0;
+                            if ((ps[-1].val.ival) == OP_DORASSIGN)
+                                flags |= OPpARG_IF_UNDEF << 8;
+                            if ((ps[-1].val.ival) == OP_ORASSIGN)
+                                flags |= OPpARG_IF_FALSE << 8;
+                            (yyval.opval) = newARGDEFELEMOP(flags, (ps[0].val.opval), parser->sig_elems);
+                        }
 
     break;
 
-  case 115:
-#line 740 "perly.y"
-                        {
-                            OP *var     = (ps[-1].val.opval);
-                            OP *defexpr = (ps[0].val.opval);
+  case 127:
+#line 875 "perly.y"
+    {
+                            OP *var   = (ps[-1].val.opval);
+                            OP *defop = (ps[0].val.opval);
 
                             if (parser->sig_slurpy)
                                 yyerror("Slurpy parameter not last");
 
                             parser->sig_elems++;
 
-                            if (defexpr) {
+                            if (defop) {
                                 parser->sig_optelems++;
 
+                                OP *defexpr = cLOGOPx(defop)->op_first;
+
                                 if (   defexpr->op_type == OP_NULL
                                     && !(defexpr->op_flags & OPf_KIDS))
                                 {
@@ -877,17 +1019,10 @@ case 2:
                                     if (var)
                                         yyerror("Optional parameter "
                                                     "lacks default expression");
-                                    op_free(defexpr);
+                                    op_free(defop);
                                 }
                                 else { 
                                     /* a normal '=default' expression */ 
-                                    OP *defop = (OP*)alloc_LOGOP(OP_ARGDEFELEM,
-                                                        defexpr,
-                                                        LINKLIST(defexpr));
-                                    /* re-purpose op_targ to hold @_ index */
-                                    defop->op_targ =
-                                        (PADOFFSET)(parser->sig_elems - 1);
-
                                     if (var) {
                                         var->op_flags |= OPf_STACKED;
                                         (void)op_sibling_splice(var,
@@ -921,47 +1056,47 @@ case 2:
 
     break;
 
-  case 116:
-#line 805 "perly.y"
-                        { parser->in_my = KEY_sigvar; (yyval.opval) = (ps[0].val.opval); }
+  case 128:
+#line 935 "perly.y"
+    { parser->in_my = KEY_sigvar; (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
-  case 117:
-#line 807 "perly.y"
-                        { parser->in_my = KEY_sigvar; (yyval.opval) = (ps[0].val.opval); }
+  case 129:
+#line 937 "perly.y"
+    { parser->in_my = KEY_sigvar; (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
-  case 118:
-#line 813 "perly.y"
-                        { (yyval.opval) = (ps[-1].val.opval); }
+  case 130:
+#line 943 "perly.y"
+    { (yyval.opval) = (ps[-1].val.opval); }
 
     break;
 
-  case 119:
-#line 815 "perly.y"
-                        {
+  case 131:
+#line 945 "perly.y"
+    {
                          (yyval.opval) = op_append_list(OP_LINESEQ, (ps[-2].val.opval), (ps[0].val.opval));
                        }
 
     break;
 
-  case 120:
-#line 819 "perly.y"
-                        { (yyval.opval) = (ps[0].val.opval); }
+  case 132:
+#line 949 "perly.y"
+    { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
-  case 125:
-#line 836 "perly.y"
-                        { (yyval.opval) = (ps[-1].val.opval); }
+  case 137:
+#line 966 "perly.y"
+    { (yyval.opval) = (ps[-1].val.opval); }
 
     break;
 
-  case 126:
-#line 839 "perly.y"
-                        {
+  case 138:
+#line 969 "perly.y"
+    {
                             ENTER;
                             SAVEIV(parser->sig_elems);
                             SAVEIV(parser->sig_optelems);
@@ -974,14 +1109,14 @@ case 2:
 
     break;
 
-  case 127:
-#line 850 "perly.y"
-                        {
+  case 139:
+#line 980 "perly.y"
+    {
                             OP            *sigops = (ps[0].val.opval);
                             struct op_argcheck_aux *aux;
                             OP            *check;
 
-                           if (!FEATURE_SIGNATURES_IS_ENABLED)
+                           if (!FEATURE_SIGNATURES_IS_ENABLED && !CvIsMETHOD(PL_compcv))
                                Perl_croak(aTHX_ "Experimental "
                                     "subroutine signatures not enabled");
 
@@ -1031,15 +1166,15 @@ case 2:
 
     break;
 
-  case 129:
-#line 907 "perly.y"
-                                { (yyval.opval) = NULL; }
+  case 141:
+#line 1037 "perly.y"
+    { (yyval.opval) = NULL; }
 
     break;
 
-  case 130:
-#line 913 "perly.y"
-                        {
+  case 142:
+#line 1043 "perly.y"
+    {
                          if (parser->copline > (line_t)(ps[-2].val.ival))
                              parser->copline = (line_t)(ps[-2].val.ival);
                          (yyval.opval) = block_end((ps[-3].val.ival), (ps[-1].val.opval));
@@ -1047,15 +1182,15 @@ case 2:
 
     break;
 
-  case 132:
-#line 925 "perly.y"
-                                   { (yyval.opval) = NULL; }
+  case 144:
+#line 1055 "perly.y"
+    { (yyval.opval) = NULL; }
 
     break;
 
-  case 133:
-#line 930 "perly.y"
-                        {
+  case 145:
+#line 1060 "perly.y"
+    {
                          if (parser->copline > (line_t)(ps[-2].val.ival))
                              parser->copline = (line_t)(ps[-2].val.ival);
                          (yyval.opval) = block_end((ps[-4].val.ival),
@@ -1064,52 +1199,64 @@ case 2:
 
     break;
 
-  case 134:
-#line 941 "perly.y"
-                        { (yyval.opval) = newLOGOP(OP_AND, 0, (ps[-2].val.opval), (ps[0].val.opval)); }
+  case 146:
+#line 1071 "perly.y"
+    { (yyval.opval) = newLOGOP(OP_AND, 0, (ps[-2].val.opval), (ps[0].val.opval)); }
 
     break;
 
-  case 135:
-#line 943 "perly.y"
-                        { (yyval.opval) = newLOGOP((ps[-1].val.ival), 0, (ps[-2].val.opval), (ps[0].val.opval)); }
+  case 147:
+#line 1073 "perly.y"
+    { (yyval.opval) = build_infix_plugin((ps[-2].val.opval), (ps[0].val.opval), (ps[-1].val.pval)); }
 
     break;
 
-  case 137:
-#line 949 "perly.y"
-                        { (yyval.opval) = (ps[-1].val.opval); }
+  case 148:
+#line 1075 "perly.y"
+    { (yyval.opval) = newLOGOP((ps[-1].val.ival), 0, (ps[-2].val.opval), (ps[0].val.opval)); }
 
     break;
 
-  case 138:
-#line 951 "perly.y"
-                        {
+  case 149:
+#line 1077 "perly.y"
+    { (yyval.opval) = build_infix_plugin((ps[-2].val.opval), (ps[0].val.opval), (ps[-1].val.pval)); }
+
+    break;
+
+  case 151:
+#line 1083 "perly.y"
+    { (yyval.opval) = (ps[-1].val.opval); }
+
+    break;
+
+  case 152:
+#line 1085 "perly.y"
+    {
                          OP* term = (ps[0].val.opval);
                          (yyval.opval) = op_append_elem(OP_LIST, (ps[-2].val.opval), term);
                        }
 
     break;
 
-  case 140:
-#line 960 "perly.y"
-                        { (yyval.opval) = op_convert_list((ps[-2].val.ival), OPf_STACKED,
+  case 154:
+#line 1094 "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)) );
                        }
 
     break;
 
-  case 141:
-#line 964 "perly.y"
-                        { (yyval.opval) = op_convert_list((ps[-4].val.ival), OPf_STACKED,
+  case 155:
+#line 1098 "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)) );
                        }
 
     break;
 
-  case 142:
-#line 968 "perly.y"
-                        { (yyval.opval) = op_convert_list(OP_ENTERSUB, OPf_STACKED,
+  case 156:
+#line 1102 "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)),
                                    newMETHOP(OP_METHOD, 0, (ps[-3].val.opval))));
@@ -1117,18 +1264,18 @@ case 2:
 
     break;
 
-  case 143:
-#line 974 "perly.y"
-                        { (yyval.opval) = op_convert_list(OP_ENTERSUB, OPf_STACKED,
+  case 157:
+#line 1108 "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))));
                        }
 
     break;
 
-  case 144:
-#line 979 "perly.y"
-                        { (yyval.opval) = op_convert_list(OP_ENTERSUB, OPf_STACKED,
+  case 158:
+#line 1113 "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)),
                                    newMETHOP(OP_METHOD, 0, (ps[-2].val.opval))));
@@ -1136,9 +1283,9 @@ case 2:
 
     break;
 
-  case 145:
-#line 985 "perly.y"
-                        { (yyval.opval) = op_convert_list(OP_ENTERSUB, OPf_STACKED,
+  case 159:
+#line 1119 "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)),
                                    newMETHOP(OP_METHOD, 0, (ps[-4].val.opval))));
@@ -1146,97 +1293,97 @@ case 2:
 
     break;
 
-  case 146:
-#line 991 "perly.y"
-                        { (yyval.opval) = op_convert_list((ps[-1].val.ival), 0, (ps[0].val.opval)); }
+  case 160:
+#line 1125 "perly.y"
+    { (yyval.opval) = op_convert_list((ps[-1].val.ival), 0, (ps[0].val.opval)); }
 
     break;
 
-  case 147:
-#line 993 "perly.y"
-                        { (yyval.opval) = op_convert_list((ps[-3].val.ival), 0, (ps[-1].val.opval)); }
+  case 161:
+#line 1127 "perly.y"
+    { (yyval.opval) = op_convert_list((ps[-3].val.ival), 0, (ps[-1].val.opval)); }
 
     break;
 
-  case 148:
-#line 995 "perly.y"
-                        { (yyval.opval) = op_convert_list((ps[-3].val.ival), 0, (ps[-1].val.opval)); }
+  case 162:
+#line 1129 "perly.y"
+    { (yyval.opval) = op_convert_list((ps[-3].val.ival), 0, (ps[-1].val.opval)); }
 
     break;
 
-  case 149:
-#line 997 "perly.y"
-                        { SvREFCNT_inc_simple_void(PL_compcv);
+  case 163:
+#line 1131 "perly.y"
+    { SvREFCNT_inc_simple_void(PL_compcv);
                          (yyval.opval) = newANONATTRSUB((ps[-1].val.ival), 0, NULL, (ps[0].val.opval)); }
 
     break;
 
-  case 150:
-#line 1000 "perly.y"
-                        { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
+  case 164:
+#line 1134 "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)));
                        }
 
     break;
 
-  case 153:
-#line 1015 "perly.y"
-                        { (yyval.opval) = newBINOP(OP_GELEM, 0, (ps[-4].val.opval), scalar((ps[-2].val.opval))); }
+  case 167:
+#line 1149 "perly.y"
+    { (yyval.opval) = newBINOP(OP_GELEM, 0, (ps[-4].val.opval), scalar((ps[-2].val.opval))); }
 
     break;
 
-  case 154:
-#line 1017 "perly.y"
-                        { (yyval.opval) = newBINOP(OP_AELEM, 0, oopsAV((ps[-3].val.opval)), scalar((ps[-1].val.opval)));
+  case 168:
+#line 1151 "perly.y"
+    { (yyval.opval) = newBINOP(OP_AELEM, 0, oopsAV((ps[-3].val.opval)), scalar((ps[-1].val.opval)));
                        }
 
     break;
 
-  case 155:
-#line 1020 "perly.y"
-                        { (yyval.opval) = newBINOP(OP_AELEM, 0,
+  case 169:
+#line 1154 "perly.y"
+    { (yyval.opval) = newBINOP(OP_AELEM, 0,
                                        ref(newAVREF((ps[-4].val.opval)),OP_RV2AV),
                                        scalar((ps[-1].val.opval)));
                        }
 
     break;
 
-  case 156:
-#line 1025 "perly.y"
-                        { (yyval.opval) = newBINOP(OP_AELEM, 0,
+  case 170:
+#line 1159 "perly.y"
+    { (yyval.opval) = newBINOP(OP_AELEM, 0,
                                        ref(newAVREF((ps[-3].val.opval)),OP_RV2AV),
                                        scalar((ps[-1].val.opval)));
                        }
 
     break;
 
-  case 157:
-#line 1030 "perly.y"
-                        { (yyval.opval) = newBINOP(OP_HELEM, 0, oopsHV((ps[-4].val.opval)), jmaybe((ps[-2].val.opval)));
+  case 171:
+#line 1164 "perly.y"
+    { (yyval.opval) = newBINOP(OP_HELEM, 0, oopsHV((ps[-4].val.opval)), jmaybe((ps[-2].val.opval)));
                        }
 
     break;
 
-  case 158:
-#line 1033 "perly.y"
-                        { (yyval.opval) = newBINOP(OP_HELEM, 0,
+  case 172:
+#line 1167 "perly.y"
+    { (yyval.opval) = newBINOP(OP_HELEM, 0,
                                        ref(newHVREF((ps[-5].val.opval)),OP_RV2HV),
                                        jmaybe((ps[-2].val.opval))); }
 
     break;
 
-  case 159:
-#line 1037 "perly.y"
-                        { (yyval.opval) = newBINOP(OP_HELEM, 0,
+  case 173:
+#line 1171 "perly.y"
+    { (yyval.opval) = newBINOP(OP_HELEM, 0,
                                        ref(newHVREF((ps[-4].val.opval)),OP_RV2HV),
                                        jmaybe((ps[-2].val.opval))); }
 
     break;
 
-  case 160:
-#line 1041 "perly.y"
-                        { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
+  case 174:
+#line 1175 "perly.y"
+    { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
                                   newCVREF(0, scalar((ps[-3].val.opval))));
                          if (parser->expect == XBLOCK)
                              parser->expect = XOPERATOR;
@@ -1244,9 +1391,9 @@ case 2:
 
     break;
 
-  case 161:
-#line 1047 "perly.y"
-                        { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
+  case 175:
+#line 1181 "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)))));
                          if (parser->expect == XBLOCK)
@@ -1255,9 +1402,9 @@ case 2:
 
     break;
 
-  case 162:
-#line 1055 "perly.y"
-                        { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
+  case 176:
+#line 1189 "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)))));
                          if (parser->expect == XBLOCK)
@@ -1266,9 +1413,9 @@ case 2:
 
     break;
 
-  case 163:
-#line 1062 "perly.y"
-                        { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
+  case 177:
+#line 1196 "perly.y"
+    { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
                                   newCVREF(0, scalar((ps[-2].val.opval))));
                          if (parser->expect == XBLOCK)
                              parser->expect = XOPERATOR;
@@ -1276,224 +1423,278 @@ case 2:
 
     break;
 
-  case 164:
-#line 1068 "perly.y"
-                        { (yyval.opval) = newSLICEOP(0, (ps[-1].val.opval), (ps[-4].val.opval)); }
+  case 178:
+#line 1202 "perly.y"
+    { (yyval.opval) = newSLICEOP(0, (ps[-1].val.opval), (ps[-4].val.opval)); }
+
+    break;
+
+  case 179:
+#line 1204 "perly.y"
+    { (yyval.opval) = newSLICEOP(0, (ps[-1].val.opval), (ps[-3].val.opval)); }
 
     break;
 
-  case 165:
-#line 1070 "perly.y"
-                        { (yyval.opval) = newSLICEOP(0, (ps[-1].val.opval), (ps[-3].val.opval)); }
+  case 180:
+#line 1206 "perly.y"
+    { (yyval.opval) = newSLICEOP(0, (ps[-1].val.opval), NULL); }
 
     break;
 
-  case 166:
-#line 1072 "perly.y"
-                        { (yyval.opval) = newSLICEOP(0, (ps[-1].val.opval), NULL); }
+  case 181:
+#line 1211 "perly.y"
+    { (yyval.opval) = build_infix_plugin((ps[-2].val.opval), (ps[0].val.opval), (ps[-1].val.pval)); }
 
     break;
 
-  case 167:
-#line 1077 "perly.y"
-                        { (yyval.opval) = newASSIGNOP(OPf_STACKED, (ps[-2].val.opval), (ps[-1].val.ival), (ps[0].val.opval)); }
+  case 182:
+#line 1213 "perly.y"
+    { (yyval.opval) = newASSIGNOP(OPf_STACKED, (ps[-2].val.opval), (ps[-1].val.ival), (ps[0].val.opval)); }
 
     break;
 
-  case 168:
-#line 1079 "perly.y"
-                        { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); }
+  case 183:
+#line 1215 "perly.y"
+    { (yyval.opval) = build_infix_plugin((ps[-2].val.opval), (ps[0].val.opval), (ps[-1].val.pval)); }
 
     break;
 
-  case 169:
-#line 1081 "perly.y"
-                        {   if ((ps[-1].val.ival) != OP_REPEAT)
+  case 184:
+#line 1217 "perly.y"
+    { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); }
+
+    break;
+
+  case 185:
+#line 1219 "perly.y"
+    { (yyval.opval) = build_infix_plugin((ps[-2].val.opval), (ps[0].val.opval), (ps[-1].val.pval)); }
+
+    break;
+
+  case 186:
+#line 1221 "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)));
                        }
 
     break;
 
-  case 170:
-#line 1086 "perly.y"
-                        { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); }
+  case 187:
+#line 1226 "perly.y"
+    { (yyval.opval) = build_infix_plugin((ps[-2].val.opval), (ps[0].val.opval), (ps[-1].val.pval)); }
 
     break;
 
-  case 171:
-#line 1088 "perly.y"
-                        { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); }
+  case 188:
+#line 1228 "perly.y"
+    { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); }
 
     break;
 
-  case 172:
-#line 1090 "perly.y"
-                        { (yyval.opval) = (ps[0].val.opval); }
+  case 189:
+#line 1230 "perly.y"
+    { (yyval.opval) = build_infix_plugin((ps[-2].val.opval), (ps[0].val.opval), (ps[-1].val.pval)); }
 
     break;
 
-  case 173:
-#line 1092 "perly.y"
-                        { (yyval.opval) = (ps[0].val.opval); }
+  case 190:
+#line 1232 "perly.y"
+    { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); }
 
     break;
 
-  case 174:
-#line 1094 "perly.y"
-                        { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); }
+  case 191:
+#line 1234 "perly.y"
+    { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
-  case 175:
-#line 1096 "perly.y"
-                        { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); }
+  case 192:
+#line 1236 "perly.y"
+    { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
-  case 176:
-#line 1098 "perly.y"
-                        { (yyval.opval) = newRANGE((ps[-1].val.ival), scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); }
+  case 193:
+#line 1238 "perly.y"
+    { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); }
 
     break;
 
-  case 177:
-#line 1100 "perly.y"
-                        { (yyval.opval) = newLOGOP(OP_AND, 0, (ps[-2].val.opval), (ps[0].val.opval)); }
+  case 194:
+#line 1240 "perly.y"
+    { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); }
 
     break;
 
-  case 178:
-#line 1102 "perly.y"
-                        { (yyval.opval) = newLOGOP(OP_OR, 0, (ps[-2].val.opval), (ps[0].val.opval)); }
+  case 195:
+#line 1242 "perly.y"
+    { (yyval.opval) = newRANGE((ps[-1].val.ival), scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); }
 
     break;
 
-  case 179:
-#line 1104 "perly.y"
-                        { (yyval.opval) = newLOGOP(OP_DOR, 0, (ps[-2].val.opval), (ps[0].val.opval)); }
+  case 196:
+#line 1244 "perly.y"
+    { (yyval.opval) = newLOGOP(OP_AND, 0, (ps[-2].val.opval), (ps[0].val.opval)); }
 
     break;
 
-  case 180:
-#line 1106 "perly.y"
-                        { (yyval.opval) = bind_match((ps[-1].val.ival), (ps[-2].val.opval), (ps[0].val.opval)); }
+  case 197:
+#line 1246 "perly.y"
+    { (yyval.opval) = build_infix_plugin((ps[-2].val.opval), (ps[0].val.opval), (ps[-1].val.pval)); }
 
     break;
 
-  case 181:
-#line 1110 "perly.y"
-                        { (yyval.opval) = cmpchain_finish((ps[0].val.opval)); }
+  case 198:
+#line 1248 "perly.y"
+    { (yyval.opval) = newLOGOP(OP_OR, 0, (ps[-2].val.opval), (ps[0].val.opval)); }
 
     break;
 
-  case 182:
-#line 1112 "perly.y"
-                        { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); }
+  case 199:
+#line 1250 "perly.y"
+    { (yyval.opval) = build_infix_plugin((ps[-2].val.opval), (ps[0].val.opval), (ps[-1].val.pval)); }
 
     break;
 
-  case 183:
-#line 1114 "perly.y"
-                        { yyerror("syntax error"); YYERROR; }
+  case 200:
+#line 1252 "perly.y"
+    { (yyval.opval) = newLOGOP(OP_DOR, 0, (ps[-2].val.opval), (ps[0].val.opval)); }
 
     break;
 
-  case 184:
-#line 1116 "perly.y"
-                        { yyerror("syntax error"); YYERROR; }
+  case 201:
+#line 1254 "perly.y"
+    { (yyval.opval) = bind_match((ps[-1].val.ival), (ps[-2].val.opval), (ps[0].val.opval)); }
 
     break;
 
-  case 185:
-#line 1120 "perly.y"
-                        { (yyval.opval) = cmpchain_start((ps[-1].val.ival), (ps[-2].val.opval), (ps[0].val.opval)); }
+  case 202:
+#line 1256 "perly.y"
+    { (yyval.opval) = build_infix_plugin((ps[-2].val.opval), (ps[0].val.opval), (ps[-1].val.pval)); }
 
     break;
 
-  case 186:
-#line 1122 "perly.y"
-                        { (yyval.opval) = cmpchain_extend((ps[-1].val.ival), (ps[-2].val.opval), (ps[0].val.opval)); }
+  case 203:
+#line 1260 "perly.y"
+    { (yyval.opval) = cmpchain_finish((ps[0].val.opval)); }
 
     break;
 
-  case 187:
-#line 1126 "perly.y"
-                        { (yyval.opval) = cmpchain_finish((ps[0].val.opval)); }
+  case 204:
+#line 1262 "perly.y"
+    { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); }
 
     break;
 
-  case 188:
-#line 1128 "perly.y"
-                        { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); }
+  case 205:
+#line 1264 "perly.y"
+    { yyerror("syntax error"); YYERROR; }
 
     break;
 
-  case 189:
-#line 1130 "perly.y"
-                        { yyerror("syntax error"); YYERROR; }
+  case 206:
+#line 1266 "perly.y"
+    { yyerror("syntax error"); YYERROR; }
 
     break;
 
-  case 190:
-#line 1132 "perly.y"
-                        { yyerror("syntax error"); YYERROR; }
+  case 207:
+#line 1268 "perly.y"
+    { (yyval.opval) = build_infix_plugin((ps[-2].val.opval), (ps[0].val.opval), (ps[-1].val.pval)); }
 
     break;
 
-  case 191:
-#line 1136 "perly.y"
-                        { (yyval.opval) = cmpchain_start((ps[-1].val.ival), (ps[-2].val.opval), (ps[0].val.opval)); }
+  case 208:
+#line 1272 "perly.y"
+    { (yyval.opval) = cmpchain_start((ps[-1].val.ival), (ps[-2].val.opval), (ps[0].val.opval)); }
 
     break;
 
-  case 192:
-#line 1138 "perly.y"
-                        { (yyval.opval) = cmpchain_extend((ps[-1].val.ival), (ps[-2].val.opval), (ps[0].val.opval)); }
+  case 209:
+#line 1274 "perly.y"
+    { (yyval.opval) = cmpchain_extend((ps[-1].val.ival), (ps[-2].val.opval), (ps[0].val.opval)); }
 
     break;
 
-  case 193:
-#line 1143 "perly.y"
-                        { (yyval.opval) = newUNOP(OP_NEGATE, 0, scalar((ps[0].val.opval))); }
+  case 210:
+#line 1278 "perly.y"
+    { (yyval.opval) = cmpchain_finish((ps[0].val.opval)); }
 
     break;
 
-  case 194:
-#line 1145 "perly.y"
-                        { (yyval.opval) = (ps[0].val.opval); }
+  case 211:
+#line 1280 "perly.y"
+    { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); }
 
     break;
 
-  case 195:
-#line 1148 "perly.y"
-                        { (yyval.opval) = newUNOP(OP_NOT, 0, scalar((ps[0].val.opval))); }
+  case 212:
+#line 1282 "perly.y"
+    { yyerror("syntax error"); YYERROR; }
 
     break;
 
-  case 196:
-#line 1150 "perly.y"
-                        { (yyval.opval) = newUNOP((ps[-1].val.ival), 0, scalar((ps[0].val.opval))); }
+  case 213:
+#line 1284 "perly.y"
+    { yyerror("syntax error"); YYERROR; }
 
     break;
 
-  case 197:
-#line 1152 "perly.y"
-                        { (yyval.opval) = newUNOP(OP_POSTINC, 0,
+  case 214:
+#line 1288 "perly.y"
+    { (yyval.opval) = cmpchain_start((ps[-1].val.ival), (ps[-2].val.opval), (ps[0].val.opval)); }
+
+    break;
+
+  case 215:
+#line 1290 "perly.y"
+    { (yyval.opval) = cmpchain_extend((ps[-1].val.ival), (ps[-2].val.opval), (ps[0].val.opval)); }
+
+    break;
+
+  case 216:
+#line 1295 "perly.y"
+    { (yyval.opval) = newUNOP(OP_NEGATE, 0, scalar((ps[0].val.opval))); }
+
+    break;
+
+  case 217:
+#line 1297 "perly.y"
+    { (yyval.opval) = (ps[0].val.opval); }
+
+    break;
+
+  case 218:
+#line 1300 "perly.y"
+    { (yyval.opval) = newUNOP(OP_NOT, 0, scalar((ps[0].val.opval))); }
+
+    break;
+
+  case 219:
+#line 1302 "perly.y"
+    { (yyval.opval) = newUNOP((ps[-1].val.ival), 0, scalar((ps[0].val.opval))); }
+
+    break;
+
+  case 220:
+#line 1304 "perly.y"
+    { (yyval.opval) = newUNOP(OP_POSTINC, 0,
                                        op_lvalue(scalar((ps[-1].val.opval)), OP_POSTINC)); }
 
     break;
 
-  case 198:
-#line 1155 "perly.y"
-                        { (yyval.opval) = newUNOP(OP_POSTDEC, 0,
+  case 221:
+#line 1307 "perly.y"
+    { (yyval.opval) = newUNOP(OP_POSTDEC, 0,
                                        op_lvalue(scalar((ps[-1].val.opval)), OP_POSTDEC));}
 
     break;
 
-  case 199:
-#line 1158 "perly.y"
-                        { (yyval.opval) = op_convert_list(OP_JOIN, 0,
+  case 222:
+#line 1310 "perly.y"
+    { (yyval.opval) = op_convert_list(OP_JOIN, 0,
                                       op_append_elem(
                                        OP_LIST,
                                        newSVREF(scalar(
@@ -1506,139 +1707,148 @@ case 2:
 
     break;
 
-  case 200:
-#line 1169 "perly.y"
-                        { (yyval.opval) = newUNOP(OP_PREINC, 0,
+  case 223:
+#line 1321 "perly.y"
+    { (yyval.opval) = newUNOP(OP_PREINC, 0,
                                        op_lvalue(scalar((ps[0].val.opval)), OP_PREINC)); }
 
     break;
 
-  case 201:
-#line 1172 "perly.y"
-                        { (yyval.opval) = newUNOP(OP_PREDEC, 0,
+  case 224:
+#line 1324 "perly.y"
+    { (yyval.opval) = newUNOP(OP_PREDEC, 0,
                                        op_lvalue(scalar((ps[0].val.opval)), OP_PREDEC)); }
 
     break;
 
-  case 202:
-#line 1180 "perly.y"
-                        { (yyval.opval) = newANONLIST((ps[-1].val.opval)); }
+  case 225:
+#line 1332 "perly.y"
+    { (yyval.opval) = newANONLIST((ps[-1].val.opval)); }
 
     break;
 
-  case 203:
-#line 1182 "perly.y"
-                        { (yyval.opval) = newANONHASH((ps[-2].val.opval)); }
+  case 226:
+#line 1334 "perly.y"
+    { (yyval.opval) = newANONHASH((ps[-2].val.opval)); }
 
     break;
 
-  case 204:
-#line 1184 "perly.y"
-                        { SvREFCNT_inc_simple_void(PL_compcv);
+  case 227:
+#line 1336 "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 205:
-#line 1187 "perly.y"
-                        { SvREFCNT_inc_simple_void(PL_compcv);
+  case 228:
+#line 1339 "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 206:
-#line 1193 "perly.y"
-                        { (yyval.opval) = dofile((ps[0].val.opval), (ps[-1].val.ival));}
+  case 229:
+#line 1342 "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 207:
-#line 1195 "perly.y"
-                        { (yyval.opval) = newUNOP(OP_NULL, OPf_SPECIAL, op_scope((ps[0].val.opval)));}
+  case 230:
+#line 1350 "perly.y"
+    { (yyval.opval) = dofile((ps[0].val.opval), (ps[-1].val.ival));}
 
     break;
 
-  case 212:
-#line 1203 "perly.y"
-                        { (yyval.opval) = newCONDOP(0, (ps[-4].val.opval), (ps[-2].val.opval), (ps[0].val.opval)); }
+  case 231:
+#line 1352 "perly.y"
+    { (yyval.opval) = newUNOP(OP_NULL, OPf_SPECIAL, op_scope((ps[0].val.opval)));}
 
     break;
 
-  case 213:
-#line 1205 "perly.y"
-                        { (yyval.opval) = newUNOP(OP_REFGEN, 0, (ps[0].val.opval)); }
+  case 236:
+#line 1360 "perly.y"
+    { (yyval.opval) = newCONDOP(0, (ps[-4].val.opval), (ps[-2].val.opval), (ps[0].val.opval)); }
 
     break;
 
-  case 214:
-#line 1207 "perly.y"
-                        { (yyval.opval) = (ps[0].val.opval); }
+  case 237:
+#line 1362 "perly.y"
+    { (yyval.opval) = newUNOP(OP_REFGEN, 0, (ps[0].val.opval)); }
 
     break;
 
-  case 215:
-#line 1209 "perly.y"
-                        { (yyval.opval) = localize((ps[0].val.opval),0); }
+  case 238:
+#line 1364 "perly.y"
+    { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
-  case 216:
-#line 1211 "perly.y"
-                        { (yyval.opval) = sawparens((ps[-1].val.opval)); }
+  case 239:
+#line 1366 "perly.y"
+    { (yyval.opval) = localize((ps[0].val.opval),0); }
 
     break;
 
-  case 217:
-#line 1213 "perly.y"
-                        { (yyval.opval) = (ps[0].val.opval); }
+  case 240:
+#line 1368 "perly.y"
+    { (yyval.opval) = sawparens((ps[-1].val.opval)); }
 
     break;
 
-  case 218:
-#line 1215 "perly.y"
-                        { (yyval.opval) = sawparens(newNULLLIST()); }
+  case 241:
+#line 1370 "perly.y"
+    { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
-  case 219:
-#line 1217 "perly.y"
-                        { (yyval.opval) = (ps[0].val.opval); }
+  case 242:
+#line 1372 "perly.y"
+    { (yyval.opval) = sawparens(newNULLLIST()); }
 
     break;
 
-  case 220:
-#line 1219 "perly.y"
-                        { (yyval.opval) = (ps[0].val.opval); }
+  case 243:
+#line 1374 "perly.y"
+    { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
-  case 221:
-#line 1221 "perly.y"
-                        { (yyval.opval) = (ps[0].val.opval); }
+  case 244:
+#line 1376 "perly.y"
+    { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
-  case 222:
-#line 1223 "perly.y"
-                        { (yyval.opval) = (ps[0].val.opval); }
+  case 245:
+#line 1378 "perly.y"
+    { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
-  case 223:
-#line 1225 "perly.y"
-                        { (yyval.opval) = newUNOP(OP_AV2ARYLEN, 0, ref((ps[0].val.opval), OP_AV2ARYLEN));}
+  case 246:
+#line 1380 "perly.y"
+    { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
-  case 224:
-#line 1227 "perly.y"
-                        { (yyval.opval) = (ps[0].val.opval); }
+  case 247:
+#line 1382 "perly.y"
+    { (yyval.opval) = newUNOP(OP_AV2ARYLEN, 0, ref((ps[0].val.opval), OP_AV2ARYLEN));}
 
     break;
 
-  case 225:
-#line 1229 "perly.y"
-                        { (yyval.opval) = op_prepend_elem(OP_ASLICE,
+  case 248:
+#line 1384 "perly.y"
+    { (yyval.opval) = (ps[0].val.opval); }
+
+    break;
+
+  case 249:
+#line 1386 "perly.y"
+    { (yyval.opval) = op_prepend_elem(OP_ASLICE,
                                newOP(OP_PUSHMARK, 0),
                                    newLISTOP(OP_ASLICE, 0,
                                        list((ps[-1].val.opval)),
@@ -1650,9 +1860,9 @@ case 2:
 
     break;
 
-  case 226:
-#line 1239 "perly.y"
-                        { (yyval.opval) = op_prepend_elem(OP_KVASLICE,
+  case 250:
+#line 1396 "perly.y"
+    { (yyval.opval) = op_prepend_elem(OP_KVASLICE,
                                newOP(OP_PUSHMARK, 0),
                                    newLISTOP(OP_KVASLICE, 0,
                                        list((ps[-1].val.opval)),
@@ -1664,9 +1874,9 @@ case 2:
 
     break;
 
-  case 227:
-#line 1249 "perly.y"
-                        { (yyval.opval) = op_prepend_elem(OP_HSLICE,
+  case 251:
+#line 1406 "perly.y"
+    { (yyval.opval) = op_prepend_elem(OP_HSLICE,
                                newOP(OP_PUSHMARK, 0),
                                    newLISTOP(OP_HSLICE, 0,
                                        list((ps[-2].val.opval)),
@@ -1678,9 +1888,9 @@ case 2:
 
     break;
 
-  case 228:
-#line 1259 "perly.y"
-                        { (yyval.opval) = op_prepend_elem(OP_KVHSLICE,
+  case 252:
+#line 1416 "perly.y"
+    { (yyval.opval) = op_prepend_elem(OP_KVHSLICE,
                                newOP(OP_PUSHMARK, 0),
                                    newLISTOP(OP_KVHSLICE, 0,
                                        list((ps[-2].val.opval)),
@@ -1692,182 +1902,182 @@ case 2:
 
     break;
 
-  case 229:
-#line 1269 "perly.y"
-                        { (yyval.opval) = (ps[0].val.opval); }
+  case 253:
+#line 1426 "perly.y"
+    { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
-  case 230:
-#line 1271 "perly.y"
-                        { (yyval.opval) = newUNOP(OP_ENTERSUB, 0, scalar((ps[0].val.opval))); }
+  case 254:
+#line 1428 "perly.y"
+    { (yyval.opval) = newUNOP(OP_ENTERSUB, 0, scalar((ps[0].val.opval))); }
 
     break;
 
-  case 231:
-#line 1273 "perly.y"
-                        { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar((ps[-2].val.opval)));
+  case 255:
+#line 1430 "perly.y"
+    { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar((ps[-2].val.opval)));
                        }
 
     break;
 
-  case 232:
-#line 1276 "perly.y"
-                        {
+  case 256:
+#line 1433 "perly.y"
+    {
                          (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
                                op_append_elem(OP_LIST, (ps[-1].val.opval), scalar((ps[-3].val.opval))));
                        }
 
     break;
 
-  case 233:
-#line 1281 "perly.y"
-                        { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
+  case 257:
+#line 1438 "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 234:
-#line 1285 "perly.y"
-                        { (yyval.opval) = newSVREF((ps[-3].val.opval)); }
+  case 258:
+#line 1442 "perly.y"
+    { (yyval.opval) = newSVREF((ps[-3].val.opval)); }
 
     break;
 
-  case 235:
-#line 1287 "perly.y"
-                        { (yyval.opval) = newAVREF((ps[-3].val.opval)); }
+  case 259:
+#line 1444 "perly.y"
+    { (yyval.opval) = newAVREF((ps[-3].val.opval)); }
 
     break;
 
-  case 236:
-#line 1289 "perly.y"
-                        { (yyval.opval) = newHVREF((ps[-3].val.opval)); }
+  case 260:
+#line 1446 "perly.y"
+    { (yyval.opval) = newHVREF((ps[-3].val.opval)); }
 
     break;
 
-  case 237:
-#line 1291 "perly.y"
-                        { (yyval.opval) = newUNOP(OP_ENTERSUB, 0,
+  case 261:
+#line 1448 "perly.y"
+    { (yyval.opval) = newUNOP(OP_ENTERSUB, 0,
                                       scalar(newCVREF((ps[-1].val.ival),(ps[-3].val.opval)))); }
 
     break;
 
-  case 238:
-#line 1294 "perly.y"
-                        { (yyval.opval) = newGVREF(0,(ps[-3].val.opval)); }
+  case 262:
+#line 1451 "perly.y"
+    { (yyval.opval) = newGVREF(0,(ps[-3].val.opval)); }
 
     break;
 
-  case 239:
-#line 1296 "perly.y"
-                        { (yyval.opval) = newOP((ps[0].val.ival), OPf_SPECIAL);
+  case 263:
+#line 1453 "perly.y"
+    { (yyval.opval) = newOP((ps[0].val.ival), OPf_SPECIAL);
                            PL_hints |= HINT_BLOCK_SCOPE; }
 
     break;
 
-  case 240:
-#line 1299 "perly.y"
-                        { (yyval.opval) = newLOOPEX((ps[-1].val.ival),(ps[0].val.opval)); }
+  case 264:
+#line 1456 "perly.y"
+    { (yyval.opval) = newLOOPEX((ps[-1].val.ival),(ps[0].val.opval)); }
 
     break;
 
-  case 241:
-#line 1301 "perly.y"
-                        { (yyval.opval) = newUNOP(OP_NOT, 0, scalar((ps[0].val.opval))); }
+  case 265:
+#line 1458 "perly.y"
+    { (yyval.opval) = newUNOP(OP_NOT, 0, scalar((ps[0].val.opval))); }
 
     break;
 
-  case 242:
-#line 1303 "perly.y"
-                        { (yyval.opval) = newOP((ps[0].val.ival), 0); }
+  case 266:
+#line 1460 "perly.y"
+    { (yyval.opval) = newOP((ps[0].val.ival), 0); }
 
     break;
 
-  case 243:
-#line 1305 "perly.y"
-                        { (yyval.opval) = newUNOP((ps[-1].val.ival), 0, (ps[0].val.opval)); }
+  case 267:
+#line 1462 "perly.y"
+    { (yyval.opval) = newUNOP((ps[-1].val.ival), 0, (ps[0].val.opval)); }
 
     break;
 
-  case 244:
-#line 1307 "perly.y"
-                        { (yyval.opval) = newUNOP((ps[-1].val.ival), 0, (ps[0].val.opval)); }
+  case 268:
+#line 1464 "perly.y"
+    { (yyval.opval) = newUNOP((ps[-1].val.ival), 0, (ps[0].val.opval)); }
 
     break;
 
-  case 245:
-#line 1309 "perly.y"
-                        { (yyval.opval) = newOP(OP_REQUIRE, (ps[0].val.ival) ? OPf_SPECIAL : 0); }
+  case 269:
+#line 1466 "perly.y"
+    { (yyval.opval) = newOP(OP_REQUIRE, (ps[0].val.ival) ? OPf_SPECIAL : 0); }
 
     break;
 
-  case 246:
-#line 1311 "perly.y"
-                        { (yyval.opval) = newUNOP(OP_REQUIRE, (ps[-1].val.ival) ? OPf_SPECIAL : 0, (ps[0].val.opval)); }
+  case 270:
+#line 1468 "perly.y"
+    { (yyval.opval) = newUNOP(OP_REQUIRE, (ps[-1].val.ival) ? OPf_SPECIAL : 0, (ps[0].val.opval)); }
 
     break;
 
-  case 247:
-#line 1313 "perly.y"
-                        { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar((ps[0].val.opval))); }
+  case 271:
+#line 1470 "perly.y"
+    { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar((ps[0].val.opval))); }
 
     break;
 
-  case 248:
-#line 1315 "perly.y"
-                        { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
+  case 272:
+#line 1472 "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 249:
-#line 1318 "perly.y"
-                        { (yyval.opval) = newOP((ps[0].val.ival), 0); }
+  case 273:
+#line 1475 "perly.y"
+    { (yyval.opval) = newOP((ps[0].val.ival), 0); }
 
     break;
 
-  case 250:
-#line 1320 "perly.y"
-                        { (yyval.opval) = newOP((ps[-2].val.ival), 0);}
+  case 274:
+#line 1477 "perly.y"
+    { (yyval.opval) = newOP((ps[-2].val.ival), 0);}
 
     break;
 
-  case 251:
-#line 1322 "perly.y"
-                        { (yyval.opval) = (ps[0].val.opval); }
+  case 275:
+#line 1479 "perly.y"
+    { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
-  case 252:
-#line 1324 "perly.y"
-                        { (yyval.opval) = (ps[-2].val.opval); }
+  case 276:
+#line 1481 "perly.y"
+    { (yyval.opval) = (ps[-2].val.opval); }
 
     break;
 
-  case 253:
-#line 1326 "perly.y"
-                        { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar((ps[0].val.opval))); }
+  case 277:
+#line 1483 "perly.y"
+    { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar((ps[0].val.opval))); }
 
     break;
 
-  case 254:
-#line 1328 "perly.y"
-                        { (yyval.opval) = ((ps[-2].val.ival) == OP_NOT)
+  case 278:
+#line 1485 "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); }
 
     break;
 
-  case 255:
-#line 1332 "perly.y"
-                        { (yyval.opval) = newUNOP((ps[-3].val.ival), 0, (ps[-1].val.opval)); }
+  case 279:
+#line 1489 "perly.y"
+    { (yyval.opval) = newUNOP((ps[-3].val.ival), 0, (ps[-1].val.opval)); }
 
     break;
 
-  case 256:
-#line 1334 "perly.y"
-                        {
+  case 280:
+#line 1491 "perly.y"
+    {
                            if (   (ps[0].val.opval)->op_type != OP_TRANS
                                && (ps[0].val.opval)->op_type != OP_TRANSR
                                && (((PMOP*)(ps[0].val.opval))->op_pmflags & PMf_HAS_CV))
@@ -1880,193 +2090,264 @@ case 2:
 
     break;
 
-  case 257:
-#line 1345 "perly.y"
-                        { (yyval.opval) = pmruntime((ps[-5].val.opval), (ps[-2].val.opval), (ps[-1].val.opval), 1, (ps[-4].val.ival)); }
+  case 281:
+#line 1502 "perly.y"
+    { (yyval.opval) = pmruntime((ps[-5].val.opval), (ps[-2].val.opval), (ps[-1].val.opval), 1, (ps[-4].val.ival)); }
 
     break;
 
-  case 261:
-#line 1354 "perly.y"
-                        { (yyval.opval) = my_attrs((ps[-1].val.opval),(ps[0].val.opval)); }
+  case 285:
+#line 1511 "perly.y"
+    { (yyval.opval) = my_attrs((ps[-1].val.opval),(ps[0].val.opval)); }
 
     break;
 
-  case 262:
-#line 1356 "perly.y"
-                        { (yyval.opval) = localize((ps[0].val.opval),1); }
+  case 286:
+#line 1513 "perly.y"
+    { (yyval.opval) = localize((ps[0].val.opval),1); }
 
     break;
 
-  case 263:
-#line 1358 "perly.y"
-                        { (yyval.opval) = newUNOP(OP_REFGEN, 0, my_attrs((ps[-1].val.opval),(ps[0].val.opval))); }
+  case 287:
+#line 1515 "perly.y"
+    { (yyval.opval) = newUNOP(OP_REFGEN, 0, my_attrs((ps[-1].val.opval),(ps[0].val.opval))); }
 
     break;
 
-  case 264:
-#line 1360 "perly.y"
-                        { (yyval.opval) = newUNOP(OP_REFGEN, 0, localize((ps[0].val.opval),1)); }
+  case 288:
+#line 1517 "perly.y"
+    { (yyval.opval) = newUNOP(OP_REFGEN, 0, localize((ps[0].val.opval),1)); }
 
     break;
 
-  case 265:
-#line 1365 "perly.y"
-                        { (yyval.opval) = sawparens((ps[-1].val.opval)); }
+  case 289:
+#line 1522 "perly.y"
+    { (yyval.opval) = sawparens((ps[-1].val.opval)); }
 
     break;
 
-  case 266:
-#line 1367 "perly.y"
-                        { (yyval.opval) = sawparens(newNULLLIST()); }
+  case 290:
+#line 1524 "perly.y"
+    { (yyval.opval) = sawparens(newNULLLIST()); }
 
     break;
 
-  case 267:
-#line 1370 "perly.y"
-                        { (yyval.opval) = (ps[0].val.opval); }
+  case 291:
+#line 1527 "perly.y"
+    { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
-  case 268:
-#line 1372 "perly.y"
-                        { (yyval.opval) = (ps[0].val.opval); }
+  case 292:
+#line 1529 "perly.y"
+    { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
-  case 269:
-#line 1374 "perly.y"
-                        { (yyval.opval) = (ps[0].val.opval); }
+  case 293:
+#line 1531 "perly.y"
+    { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
-  case 275:
-#line 1390 "perly.y"
-                                        { (yyval.opval) = (ps[0].val.opval); }
+  case 294:
+#line 1536 "perly.y"
+    {
+                         (yyval.pval) = PadnamelistARRAY(PL_comppad_name)[(ps[0].val.opval)->op_targ];
+                         op_free((ps[0].val.opval));
+                       }
 
     break;
 
-  case 276:
-#line 1396 "perly.y"
-                        { parser->in_my = 0; (yyval.opval) = my((ps[0].val.opval)); }
+  case 295:
+#line 1541 "perly.y"
+    {
+                         (yyval.pval) = PadnamelistARRAY(PL_comppad_name)[(ps[0].val.opval)->op_targ];
+                         op_free((ps[0].val.opval));
+                       }
 
     break;
 
-  case 277:
-#line 1401 "perly.y"
-                        { (yyval.opval) = (ps[-1].val.opval); }
+  case 296:
+#line 1546 "perly.y"
+    {
+                         (yyval.pval) = PadnamelistARRAY(PL_comppad_name)[(ps[0].val.opval)->op_targ];
+                         op_free((ps[0].val.opval));
+                       }
 
     break;
 
-  case 278:
-#line 1403 "perly.y"
-                        {
+  case 297:
+#line 1554 "perly.y"
+    { (yyval.opval) = (ps[0].val.opval); }
+
+    break;
+
+  case 298:
+#line 1556 "perly.y"
+    { (yyval.opval) = NULL; }
+
+    break;
+
+  case 300:
+#line 1562 "perly.y"
+    {
+                         parser->in_my = 0;
+                         if((ps[0].val.opval))
+                           class_apply_field_attributes((PADNAME *)(ps[-1].val.pval), (ps[0].val.opval));
+                         (yyval.opval) = newOP(OP_NULL, 0);
+                       }
+
+    break;
+
+  case 301:
+#line 1569 "perly.y"
+    {
+                         parser->in_my = 0;
+                         if((ps[-1].val.opval))
+                           class_apply_field_attributes((PADNAME *)(ps[-2].val.pval), (ps[-1].val.opval));
+                         ENTER;
+                         class_prepare_initfield_parse();
+                       }
+
+    break;
+
+  case 302:
+#line 1577 "perly.y"
+    {
+                         class_set_field_defop((PADNAME *)(ps[-4].val.pval), (ps[-2].val.ival), (ps[0].val.opval));
+                         LEAVE;
+                         (yyval.opval) = newOP(OP_NULL, 0);
+                       }
+
+    break;
+
+  case 308:
+#line 1597 "perly.y"
+    { (yyval.opval) = (ps[0].val.opval); }
+
+    break;
+
+  case 309:
+#line 1603 "perly.y"
+    { parser->in_my = 0; (yyval.opval) = my((ps[0].val.opval)); }
+
+    break;
+
+  case 310:
+#line 1608 "perly.y"
+    { (yyval.opval) = (ps[-1].val.opval); }
+
+    break;
+
+  case 311:
+#line 1610 "perly.y"
+    {
                          (yyval.opval) = op_append_elem(OP_LIST, (ps[-2].val.opval), (ps[0].val.opval));
                        }
 
     break;
 
-  case 280:
-#line 1410 "perly.y"
-                        { parser->in_my = 0; (yyval.opval) = (ps[0].val.opval); }
+  case 313:
+#line 1617 "perly.y"
+    { parser->in_my = 0; (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
-  case 288:
-#line 1427 "perly.y"
-                        { (yyval.opval) = newCVREF((ps[-1].val.ival),(ps[0].val.opval)); }
+  case 321:
+#line 1634 "perly.y"
+    { (yyval.opval) = newCVREF((ps[-1].val.ival),(ps[0].val.opval)); }
 
     break;
 
-  case 289:
-#line 1431 "perly.y"
-                        { (yyval.opval) = newSVREF((ps[0].val.opval)); }
+  case 322:
+#line 1638 "perly.y"
+    { (yyval.opval) = newSVREF((ps[0].val.opval)); }
 
     break;
 
-  case 290:
-#line 1435 "perly.y"
-                        { (yyval.opval) = newAVREF((ps[0].val.opval));
+  case 323:
+#line 1642 "perly.y"
+    { (yyval.opval) = newAVREF((ps[0].val.opval));
                          if ((yyval.opval)) (yyval.opval)->op_private |= (ps[-1].val.ival);
                        }
 
     break;
 
-  case 291:
-#line 1441 "perly.y"
-                        { (yyval.opval) = newHVREF((ps[0].val.opval));
+  case 324:
+#line 1648 "perly.y"
+    { (yyval.opval) = newHVREF((ps[0].val.opval));
                          if ((yyval.opval)) (yyval.opval)->op_private |= (ps[-1].val.ival);
                        }
 
     break;
 
-  case 292:
-#line 1447 "perly.y"
-                        { (yyval.opval) = newAVREF((ps[0].val.opval)); }
+  case 325:
+#line 1654 "perly.y"
+    { (yyval.opval) = newAVREF((ps[0].val.opval)); }
 
     break;
 
-  case 293:
-#line 1449 "perly.y"
-                        { (yyval.opval) = newAVREF((ps[-3].val.opval)); }
+  case 326:
+#line 1656 "perly.y"
+    { (yyval.opval) = newAVREF((ps[-3].val.opval)); }
 
     break;
 
-  case 294:
-#line 1453 "perly.y"
-                        { (yyval.opval) = newGVREF(0,(ps[0].val.opval)); }
+  case 327:
+#line 1660 "perly.y"
+    { (yyval.opval) = newGVREF(0,(ps[0].val.opval)); }
 
     break;
 
-  case 296:
-#line 1458 "perly.y"
-                        { (yyval.opval) = newAVREF((ps[-2].val.opval)); }
+  case 329:
+#line 1665 "perly.y"
+    { (yyval.opval) = newAVREF((ps[-2].val.opval)); }
 
     break;
 
-  case 298:
-#line 1463 "perly.y"
-                        { (yyval.opval) = newHVREF((ps[-2].val.opval)); }
+  case 331:
+#line 1670 "perly.y"
+    { (yyval.opval) = newHVREF((ps[-2].val.opval)); }
 
     break;
 
-  case 300:
-#line 1468 "perly.y"
-                        { (yyval.opval) = newGVREF(0,(ps[-2].val.opval)); }
+  case 333:
+#line 1675 "perly.y"
+    { (yyval.opval) = newGVREF(0,(ps[-2].val.opval)); }
 
     break;
 
-  case 301:
-#line 1473 "perly.y"
-                        { (yyval.opval) = scalar((ps[0].val.opval)); }
+  case 334:
+#line 1680 "perly.y"
+    { (yyval.opval) = scalar((ps[0].val.opval)); }
 
     break;
 
-  case 302:
-#line 1475 "perly.y"
-                        { (yyval.opval) = scalar((ps[0].val.opval)); }
+  case 335:
+#line 1682 "perly.y"
+    { (yyval.opval) = scalar((ps[0].val.opval)); }
 
     break;
 
-  case 303:
-#line 1477 "perly.y"
-                        { (yyval.opval) = op_scope((ps[0].val.opval)); }
+  case 336:
+#line 1684 "perly.y"
+    { (yyval.opval) = op_scope((ps[0].val.opval)); }
 
     break;
 
-  case 304:
-#line 1480 "perly.y"
-                        { (yyval.opval) = (ps[0].val.opval); }
+  case 337:
+#line 1687 "perly.y"
+    { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
 
 
-
       default: break;
     
 
 /* Generated from:
- * 0caf1eb1cc4750131dc71e3a22ead383ed9a123dec61ccd23408ff13441fafde perly.y
+ * 0a5fcd15cf0b7afb57ade6ceaf68037a38dd194acd9d60d3e4ad99c15233af75 perly.y
  * acf1cbfd2545faeaaa58b1cf0cf9d7f98b5be0752eb7a54528ef904a9e2e1ca7 regen_perly.pl
- * ex: set ro: */
+ * ex: set ro ft=c: */
index 20854ae..fb4abdf 100644 (file)
@@ -488,7 +488,8 @@ Perl_yyparse (pTHX_ int gramtype)
       yyerrlab:
         /* If not already recovering from an error, report this error.  */
         if (!parser->yyerrstatus) {
-            yyerror ("syntax error");
+            yyerror("syntax error");
+            yyquit();
         }
 
 
index d5a45b2..f2f378a 100644 (file)
@@ -1,17 +1,17 @@
-/* -*- buffer-read-only: t -*-
+/* -*- mode: C; buffer-read-only: t -*-
    !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!!
    This file is built by regen_perly.pl from perly.y.
    Any changes made here will be lost!
  */
 
-#define PERL_BISON_VERSION  30006
+#define PERL_BISON_VERSION  30003
 
 #ifdef PERL_CORE
-/* A Bison parser, made by GNU Bison 3.6.4.  */
+/* A Bison parser, made by GNU Bison 3.3.  */
 
 /* Bison interface for Yacc-like parsers in C
 
-   Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2020 Free Software Foundation,
+   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
@@ -40,9 +40,8 @@
    This special exception was added by the Free Software Foundation in
    version 2.2 of Bison.  */
 
-/* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual,
-   especially those whose name start with YY_ or yy_.  They are
-   private implementation details that can be changed or removed.  */
+/* Undocumented macros, especially those whose name start with YY_,
+   are private implementation details.  Do not rely on them.  */
 
 /* Debug traces.  */
 #ifndef YYDEBUG
 extern int yydebug;
 #endif
 
-/* Token kinds.  */
+/* Token type.  */
 #ifndef YYTOKENTYPE
 # define YYTOKENTYPE
   enum yytokentype
   {
-    YYEMPTY = -2,
-    YYEOF = 0,                     /* "end of file"  */
-    YYerror = 256,                 /* error  */
-    YYUNDEF = 257,                 /* "invalid token"  */
-    GRAMPROG = 258,                /* GRAMPROG  */
-    GRAMEXPR = 259,                /* GRAMEXPR  */
-    GRAMBLOCK = 260,               /* GRAMBLOCK  */
-    GRAMBARESTMT = 261,            /* GRAMBARESTMT  */
-    GRAMFULLSTMT = 262,            /* GRAMFULLSTMT  */
-    GRAMSTMTSEQ = 263,             /* GRAMSTMTSEQ  */
-    GRAMSUBSIGNATURE = 264,        /* GRAMSUBSIGNATURE  */
-    PERLY_AMPERSAND = 265,         /* PERLY_AMPERSAND  */
-    PERLY_BRACE_OPEN = 266,        /* PERLY_BRACE_OPEN  */
-    PERLY_BRACE_CLOSE = 267,       /* PERLY_BRACE_CLOSE  */
-    PERLY_BRACKET_OPEN = 268,      /* PERLY_BRACKET_OPEN  */
-    PERLY_BRACKET_CLOSE = 269,     /* PERLY_BRACKET_CLOSE  */
-    PERLY_COMMA = 270,             /* PERLY_COMMA  */
-    PERLY_DOLLAR = 271,            /* PERLY_DOLLAR  */
-    PERLY_DOT = 272,               /* PERLY_DOT  */
-    PERLY_EQUAL_SIGN = 273,        /* PERLY_EQUAL_SIGN  */
-    PERLY_MINUS = 274,             /* PERLY_MINUS  */
-    PERLY_PERCENT_SIGN = 275,      /* PERLY_PERCENT_SIGN  */
-    PERLY_PLUS = 276,              /* PERLY_PLUS  */
-    PERLY_SEMICOLON = 277,         /* PERLY_SEMICOLON  */
-    PERLY_SLASH = 278,             /* PERLY_SLASH  */
-    PERLY_SNAIL = 279,             /* PERLY_SNAIL  */
-    PERLY_STAR = 280,              /* PERLY_STAR  */
-    BAREWORD = 281,                /* BAREWORD  */
-    METHOD = 282,                  /* METHOD  */
-    FUNCMETH = 283,                /* FUNCMETH  */
-    THING = 284,                   /* THING  */
-    PMFUNC = 285,                  /* PMFUNC  */
-    PRIVATEREF = 286,              /* PRIVATEREF  */
-    QWLIST = 287,                  /* QWLIST  */
-    FUNC0OP = 288,                 /* FUNC0OP  */
-    FUNC0SUB = 289,                /* FUNC0SUB  */
-    UNIOPSUB = 290,                /* UNIOPSUB  */
-    LSTOPSUB = 291,                /* LSTOPSUB  */
-    PLUGEXPR = 292,                /* PLUGEXPR  */
-    PLUGSTMT = 293,                /* PLUGSTMT  */
-    LABEL = 294,                   /* LABEL  */
-    FORMAT = 295,                  /* FORMAT  */
-    SUB = 296,                     /* SUB  */
-    SIGSUB = 297,                  /* SIGSUB  */
-    ANONSUB = 298,                 /* ANONSUB  */
-    ANON_SIGSUB = 299,             /* ANON_SIGSUB  */
-    PACKAGE = 300,                 /* PACKAGE  */
-    USE = 301,                     /* USE  */
-    WHILE = 302,                   /* WHILE  */
-    UNTIL = 303,                   /* UNTIL  */
-    IF = 304,                      /* IF  */
-    UNLESS = 305,                  /* UNLESS  */
-    ELSE = 306,                    /* ELSE  */
-    ELSIF = 307,                   /* ELSIF  */
-    CONTINUE = 308,                /* CONTINUE  */
-    FOR = 309,                     /* FOR  */
-    GIVEN = 310,                   /* GIVEN  */
-    WHEN = 311,                    /* WHEN  */
-    DEFAULT = 312,                 /* DEFAULT  */
-    TRY = 313,                     /* TRY  */
-    CATCH = 314,                   /* CATCH  */
-    FINALLY = 315,                 /* FINALLY  */
-    LOOPEX = 316,                  /* LOOPEX  */
-    DOTDOT = 317,                  /* DOTDOT  */
-    YADAYADA = 318,                /* YADAYADA  */
-    FUNC0 = 319,                   /* FUNC0  */
-    FUNC1 = 320,                   /* FUNC1  */
-    FUNC = 321,                    /* FUNC  */
-    UNIOP = 322,                   /* UNIOP  */
-    LSTOP = 323,                   /* LSTOP  */
-    MULOP = 324,                   /* MULOP  */
-    ADDOP = 325,                   /* ADDOP  */
-    DOLSHARP = 326,                /* DOLSHARP  */
-    DO = 327,                      /* DO  */
-    HASHBRACK = 328,               /* HASHBRACK  */
-    NOAMP = 329,                   /* NOAMP  */
-    LOCAL = 330,                   /* LOCAL  */
-    MY = 331,                      /* MY  */
-    REQUIRE = 332,                 /* REQUIRE  */
-    COLONATTR = 333,               /* COLONATTR  */
-    FORMLBRACK = 334,              /* FORMLBRACK  */
-    FORMRBRACK = 335,              /* FORMRBRACK  */
-    SUBLEXSTART = 336,             /* SUBLEXSTART  */
-    SUBLEXEND = 337,               /* SUBLEXEND  */
-    DEFER = 338,                   /* DEFER  */
-    PREC_LOW = 339,                /* PREC_LOW  */
-    OROP = 340,                    /* OROP  */
-    ANDOP = 341,                   /* ANDOP  */
-    NOTOP = 342,                   /* NOTOP  */
-    ASSIGNOP = 343,                /* ASSIGNOP  */
-    PERLY_QUESTION_MARK = 344,     /* PERLY_QUESTION_MARK  */
-    PERLY_COLON = 345,             /* PERLY_COLON  */
-    OROR = 346,                    /* OROR  */
-    DORDOR = 347,                  /* DORDOR  */
-    ANDAND = 348,                  /* ANDAND  */
-    BITOROP = 349,                 /* BITOROP  */
-    BITANDOP = 350,                /* BITANDOP  */
-    CHEQOP = 351,                  /* CHEQOP  */
-    NCEQOP = 352,                  /* NCEQOP  */
-    CHRELOP = 353,                 /* CHRELOP  */
-    NCRELOP = 354,                 /* NCRELOP  */
-    SHIFTOP = 355,                 /* SHIFTOP  */
-    MATCHOP = 356,                 /* MATCHOP  */
-    PERLY_EXCLAMATION_MARK = 357,  /* PERLY_EXCLAMATION_MARK  */
-    PERLY_TILDE = 358,             /* PERLY_TILDE  */
-    UMINUS = 359,                  /* UMINUS  */
-    REFGEN = 360,                  /* REFGEN  */
-    POWOP = 361,                   /* POWOP  */
-    PREINC = 362,                  /* PREINC  */
-    PREDEC = 363,                  /* PREDEC  */
-    POSTINC = 364,                 /* POSTINC  */
-    POSTDEC = 365,                 /* POSTDEC  */
-    POSTJOIN = 366,                /* POSTJOIN  */
-    ARROW = 367,                   /* ARROW  */
-    PERLY_PAREN_CLOSE = 368,       /* PERLY_PAREN_CLOSE  */
-    PERLY_PAREN_OPEN = 369         /* PERLY_PAREN_OPEN  */
+    GRAMPROG = 258,
+    GRAMEXPR = 259,
+    GRAMBLOCK = 260,
+    GRAMBARESTMT = 261,
+    GRAMFULLSTMT = 262,
+    GRAMSTMTSEQ = 263,
+    GRAMSUBSIGNATURE = 264,
+    PERLY_AMPERSAND = 265,
+    PERLY_BRACE_OPEN = 266,
+    PERLY_BRACE_CLOSE = 267,
+    PERLY_BRACKET_OPEN = 268,
+    PERLY_BRACKET_CLOSE = 269,
+    PERLY_COMMA = 270,
+    PERLY_DOLLAR = 271,
+    PERLY_DOT = 272,
+    PERLY_EQUAL_SIGN = 273,
+    PERLY_MINUS = 274,
+    PERLY_PERCENT_SIGN = 275,
+    PERLY_PLUS = 276,
+    PERLY_SEMICOLON = 277,
+    PERLY_SLASH = 278,
+    PERLY_SNAIL = 279,
+    PERLY_STAR = 280,
+    KW_FORMAT = 281,
+    KW_PACKAGE = 282,
+    KW_CLASS = 283,
+    KW_LOCAL = 284,
+    KW_MY = 285,
+    KW_FIELD = 286,
+    KW_IF = 287,
+    KW_ELSE = 288,
+    KW_ELSIF = 289,
+    KW_UNLESS = 290,
+    KW_FOR = 291,
+    KW_UNTIL = 292,
+    KW_WHILE = 293,
+    KW_CONTINUE = 294,
+    KW_GIVEN = 295,
+    KW_WHEN = 296,
+    KW_DEFAULT = 297,
+    KW_TRY = 298,
+    KW_CATCH = 299,
+    KW_FINALLY = 300,
+    KW_DEFER = 301,
+    KW_REQUIRE = 302,
+    KW_DO = 303,
+    KW_USE_or_NO = 304,
+    KW_SUB_named = 305,
+    KW_SUB_named_sig = 306,
+    KW_SUB_anon = 307,
+    KW_SUB_anon_sig = 308,
+    KW_METHOD_named = 309,
+    KW_METHOD_anon = 310,
+    BAREWORD = 311,
+    METHCALL0 = 312,
+    METHCALL = 313,
+    THING = 314,
+    PMFUNC = 315,
+    PRIVATEREF = 316,
+    QWLIST = 317,
+    FUNC0OP = 318,
+    FUNC0SUB = 319,
+    UNIOPSUB = 320,
+    LSTOPSUB = 321,
+    PLUGEXPR = 322,
+    PLUGSTMT = 323,
+    LABEL = 324,
+    LOOPEX = 325,
+    DOTDOT = 326,
+    YADAYADA = 327,
+    FUNC0 = 328,
+    FUNC1 = 329,
+    FUNC = 330,
+    UNIOP = 331,
+    LSTOP = 332,
+    POWOP = 333,
+    MULOP = 334,
+    ADDOP = 335,
+    DOLSHARP = 336,
+    HASHBRACK = 337,
+    NOAMP = 338,
+    COLONATTR = 339,
+    FORMLBRACK = 340,
+    FORMRBRACK = 341,
+    SUBLEXSTART = 342,
+    SUBLEXEND = 343,
+    PHASER = 344,
+    PREC_LOW = 345,
+    PLUGIN_LOW_OP = 346,
+    OROP = 347,
+    PLUGIN_LOGICAL_OR_LOW_OP = 348,
+    ANDOP = 349,
+    PLUGIN_LOGICAL_AND_LOW_OP = 350,
+    NOTOP = 351,
+    ASSIGNOP = 352,
+    PLUGIN_ASSIGN_OP = 353,
+    PERLY_QUESTION_MARK = 354,
+    PERLY_COLON = 355,
+    OROR = 356,
+    DORDOR = 357,
+    PLUGIN_LOGICAL_OR_OP = 358,
+    ANDAND = 359,
+    PLUGIN_LOGICAL_AND_OP = 360,
+    BITOROP = 361,
+    BITANDOP = 362,
+    CHEQOP = 363,
+    NCEQOP = 364,
+    CHRELOP = 365,
+    NCRELOP = 366,
+    PLUGIN_REL_OP = 367,
+    SHIFTOP = 368,
+    PLUGIN_ADD_OP = 369,
+    PLUGIN_MUL_OP = 370,
+    MATCHOP = 371,
+    PERLY_EXCLAMATION_MARK = 372,
+    PERLY_TILDE = 373,
+    UMINUS = 374,
+    REFGEN = 375,
+    PLUGIN_POW_OP = 376,
+    PREINC = 377,
+    PREDEC = 378,
+    POSTINC = 379,
+    POSTDEC = 380,
+    POSTJOIN = 381,
+    PLUGIN_HIGH_OP = 382,
+    ARROW = 383,
+    PERLY_PAREN_CLOSE = 384,
+    PERLY_PAREN_OPEN = 385
   };
-  typedef enum yytokentype yytoken_kind_t;
 #endif
 
 /* Value type.  */
@@ -185,10 +195,10 @@ S_is_opval_token(int type) {
     case BAREWORD:
     case FUNC0OP:
     case FUNC0SUB:
-    case FUNCMETH:
     case LABEL:
     case LSTOPSUB:
-    case METHOD:
+    case METHCALL:
+    case METHCALL0:
     case PLUGEXPR:
     case PLUGSTMT:
     case PMFUNC:
@@ -203,17 +213,18 @@ S_is_opval_token(int type) {
 #endif /* PERL_IN_TOKE_C */
 #endif /* PERL_CORE */
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
+
 union YYSTYPE
 {
 
     I32        ival; /* __DEFAULT__ (marker for regen_perly.pl;
                                must always be 1st union member) */
-    char *pval;
+    void *pval;
     OP *opval;
     GV *gvval;
 
-
 };
+
 typedef union YYSTYPE YYSTYPE;
 # define YYSTYPE_IS_TRIVIAL 1
 # define YYSTYPE_IS_DECLARED 1
@@ -225,6 +236,6 @@ int yyparse (void);
 
 
 /* Generated from:
- * 0caf1eb1cc4750131dc71e3a22ead383ed9a123dec61ccd23408ff13441fafde perly.y
+ * 0a5fcd15cf0b7afb57ade6ceaf68037a38dd194acd9d60d3e4ad99c15233af75 perly.y
  * acf1cbfd2545faeaaa58b1cf0cf9d7f98b5be0752eb7a54528ef904a9e2e1ca7 regen_perly.pl
- * ex: set ro: */
+ * ex: set ro ft=c: */
index 5312210..1ca9c7d 100644 (file)
-/* -*- buffer-read-only: t -*-
+/* -*- mode: C; buffer-read-only: t -*-
    !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!!
    This file is built by regen_perly.pl from perly.y.
    Any changes made here will be lost!
  */
 
-/* Symbol kind.  */
-enum yysymbol_kind_t
-{
-  YYSYMBOL_YYEMPTY = -2,
-  YYSYMBOL_YYEOF = 0,                      /* "end of file"  */
-  YYSYMBOL_YYerror = 1,                    /* error  */
-  YYSYMBOL_YYUNDEF = 2,                    /* "invalid token"  */
-  YYSYMBOL_GRAMPROG = 3,                   /* GRAMPROG  */
-  YYSYMBOL_GRAMEXPR = 4,                   /* GRAMEXPR  */
-  YYSYMBOL_GRAMBLOCK = 5,                  /* GRAMBLOCK  */
-  YYSYMBOL_GRAMBARESTMT = 6,               /* GRAMBARESTMT  */
-  YYSYMBOL_GRAMFULLSTMT = 7,               /* GRAMFULLSTMT  */
-  YYSYMBOL_GRAMSTMTSEQ = 8,                /* GRAMSTMTSEQ  */
-  YYSYMBOL_GRAMSUBSIGNATURE = 9,           /* GRAMSUBSIGNATURE  */
-  YYSYMBOL_PERLY_AMPERSAND = 10,           /* PERLY_AMPERSAND  */
-  YYSYMBOL_PERLY_BRACE_OPEN = 11,          /* PERLY_BRACE_OPEN  */
-  YYSYMBOL_PERLY_BRACE_CLOSE = 12,         /* PERLY_BRACE_CLOSE  */
-  YYSYMBOL_PERLY_BRACKET_OPEN = 13,        /* PERLY_BRACKET_OPEN  */
-  YYSYMBOL_PERLY_BRACKET_CLOSE = 14,       /* PERLY_BRACKET_CLOSE  */
-  YYSYMBOL_PERLY_COMMA = 15,               /* PERLY_COMMA  */
-  YYSYMBOL_PERLY_DOLLAR = 16,              /* PERLY_DOLLAR  */
-  YYSYMBOL_PERLY_DOT = 17,                 /* PERLY_DOT  */
-  YYSYMBOL_PERLY_EQUAL_SIGN = 18,          /* PERLY_EQUAL_SIGN  */
-  YYSYMBOL_PERLY_MINUS = 19,               /* PERLY_MINUS  */
-  YYSYMBOL_PERLY_PERCENT_SIGN = 20,        /* PERLY_PERCENT_SIGN  */
-  YYSYMBOL_PERLY_PLUS = 21,                /* PERLY_PLUS  */
-  YYSYMBOL_PERLY_SEMICOLON = 22,           /* PERLY_SEMICOLON  */
-  YYSYMBOL_PERLY_SLASH = 23,               /* PERLY_SLASH  */
-  YYSYMBOL_PERLY_SNAIL = 24,               /* PERLY_SNAIL  */
-  YYSYMBOL_PERLY_STAR = 25,                /* PERLY_STAR  */
-  YYSYMBOL_BAREWORD = 26,                  /* BAREWORD  */
-  YYSYMBOL_METHOD = 27,                    /* METHOD  */
-  YYSYMBOL_FUNCMETH = 28,                  /* FUNCMETH  */
-  YYSYMBOL_THING = 29,                     /* THING  */
-  YYSYMBOL_PMFUNC = 30,                    /* PMFUNC  */
-  YYSYMBOL_PRIVATEREF = 31,                /* PRIVATEREF  */
-  YYSYMBOL_QWLIST = 32,                    /* QWLIST  */
-  YYSYMBOL_FUNC0OP = 33,                   /* FUNC0OP  */
-  YYSYMBOL_FUNC0SUB = 34,                  /* FUNC0SUB  */
-  YYSYMBOL_UNIOPSUB = 35,                  /* UNIOPSUB  */
-  YYSYMBOL_LSTOPSUB = 36,                  /* LSTOPSUB  */
-  YYSYMBOL_PLUGEXPR = 37,                  /* PLUGEXPR  */
-  YYSYMBOL_PLUGSTMT = 38,                  /* PLUGSTMT  */
-  YYSYMBOL_LABEL = 39,                     /* LABEL  */
-  YYSYMBOL_FORMAT = 40,                    /* FORMAT  */
-  YYSYMBOL_SUB = 41,                       /* SUB  */
-  YYSYMBOL_SIGSUB = 42,                    /* SIGSUB  */
-  YYSYMBOL_ANONSUB = 43,                   /* ANONSUB  */
-  YYSYMBOL_ANON_SIGSUB = 44,               /* ANON_SIGSUB  */
-  YYSYMBOL_PACKAGE = 45,                   /* PACKAGE  */
-  YYSYMBOL_USE = 46,                       /* USE  */
-  YYSYMBOL_WHILE = 47,                     /* WHILE  */
-  YYSYMBOL_UNTIL = 48,                     /* UNTIL  */
-  YYSYMBOL_IF = 49,                        /* IF  */
-  YYSYMBOL_UNLESS = 50,                    /* UNLESS  */
-  YYSYMBOL_ELSE = 51,                      /* ELSE  */
-  YYSYMBOL_ELSIF = 52,                     /* ELSIF  */
-  YYSYMBOL_CONTINUE = 53,                  /* CONTINUE  */
-  YYSYMBOL_FOR = 54,                       /* FOR  */
-  YYSYMBOL_GIVEN = 55,                     /* GIVEN  */
-  YYSYMBOL_WHEN = 56,                      /* WHEN  */
-  YYSYMBOL_DEFAULT = 57,                   /* DEFAULT  */
-  YYSYMBOL_TRY = 58,                       /* TRY  */
-  YYSYMBOL_CATCH = 59,                     /* CATCH  */
-  YYSYMBOL_FINALLY = 60,                   /* FINALLY  */
-  YYSYMBOL_LOOPEX = 61,                    /* LOOPEX  */
-  YYSYMBOL_DOTDOT = 62,                    /* DOTDOT  */
-  YYSYMBOL_YADAYADA = 63,                  /* YADAYADA  */
-  YYSYMBOL_FUNC0 = 64,                     /* FUNC0  */
-  YYSYMBOL_FUNC1 = 65,                     /* FUNC1  */
-  YYSYMBOL_FUNC = 66,                      /* FUNC  */
-  YYSYMBOL_UNIOP = 67,                     /* UNIOP  */
-  YYSYMBOL_LSTOP = 68,                     /* LSTOP  */
-  YYSYMBOL_MULOP = 69,                     /* MULOP  */
-  YYSYMBOL_ADDOP = 70,                     /* ADDOP  */
-  YYSYMBOL_DOLSHARP = 71,                  /* DOLSHARP  */
-  YYSYMBOL_DO = 72,                        /* DO  */
-  YYSYMBOL_HASHBRACK = 73,                 /* HASHBRACK  */
-  YYSYMBOL_NOAMP = 74,                     /* NOAMP  */
-  YYSYMBOL_LOCAL = 75,                     /* LOCAL  */
-  YYSYMBOL_MY = 76,                        /* MY  */
-  YYSYMBOL_REQUIRE = 77,                   /* REQUIRE  */
-  YYSYMBOL_COLONATTR = 78,                 /* COLONATTR  */
-  YYSYMBOL_FORMLBRACK = 79,                /* FORMLBRACK  */
-  YYSYMBOL_FORMRBRACK = 80,                /* FORMRBRACK  */
-  YYSYMBOL_SUBLEXSTART = 81,               /* SUBLEXSTART  */
-  YYSYMBOL_SUBLEXEND = 82,                 /* SUBLEXEND  */
-  YYSYMBOL_DEFER = 83,                     /* DEFER  */
-  YYSYMBOL_PREC_LOW = 84,                  /* PREC_LOW  */
-  YYSYMBOL_OROP = 85,                      /* OROP  */
-  YYSYMBOL_ANDOP = 86,                     /* ANDOP  */
-  YYSYMBOL_NOTOP = 87,                     /* NOTOP  */
-  YYSYMBOL_ASSIGNOP = 88,                  /* ASSIGNOP  */
-  YYSYMBOL_PERLY_QUESTION_MARK = 89,       /* PERLY_QUESTION_MARK  */
-  YYSYMBOL_PERLY_COLON = 90,               /* PERLY_COLON  */
-  YYSYMBOL_OROR = 91,                      /* OROR  */
-  YYSYMBOL_DORDOR = 92,                    /* DORDOR  */
-  YYSYMBOL_ANDAND = 93,                    /* ANDAND  */
-  YYSYMBOL_BITOROP = 94,                   /* BITOROP  */
-  YYSYMBOL_BITANDOP = 95,                  /* BITANDOP  */
-  YYSYMBOL_CHEQOP = 96,                    /* CHEQOP  */
-  YYSYMBOL_NCEQOP = 97,                    /* NCEQOP  */
-  YYSYMBOL_CHRELOP = 98,                   /* CHRELOP  */
-  YYSYMBOL_NCRELOP = 99,                   /* NCRELOP  */
-  YYSYMBOL_SHIFTOP = 100,                  /* SHIFTOP  */
-  YYSYMBOL_MATCHOP = 101,                  /* MATCHOP  */
-  YYSYMBOL_PERLY_EXCLAMATION_MARK = 102,   /* PERLY_EXCLAMATION_MARK  */
-  YYSYMBOL_PERLY_TILDE = 103,              /* PERLY_TILDE  */
-  YYSYMBOL_UMINUS = 104,                   /* UMINUS  */
-  YYSYMBOL_REFGEN = 105,                   /* REFGEN  */
-  YYSYMBOL_POWOP = 106,                    /* POWOP  */
-  YYSYMBOL_PREINC = 107,                   /* PREINC  */
-  YYSYMBOL_PREDEC = 108,                   /* PREDEC  */
-  YYSYMBOL_POSTINC = 109,                  /* POSTINC  */
-  YYSYMBOL_POSTDEC = 110,                  /* POSTDEC  */
-  YYSYMBOL_POSTJOIN = 111,                 /* POSTJOIN  */
-  YYSYMBOL_ARROW = 112,                    /* ARROW  */
-  YYSYMBOL_PERLY_PAREN_CLOSE = 113,        /* PERLY_PAREN_CLOSE  */
-  YYSYMBOL_PERLY_PAREN_OPEN = 114,         /* PERLY_PAREN_OPEN  */
-  YYSYMBOL_YYACCEPT = 115,                 /* $accept  */
-  YYSYMBOL_grammar = 116,                  /* grammar  */
-  YYSYMBOL_117_1 = 117,                    /* @1  */
-  YYSYMBOL_118_2 = 118,                    /* @2  */
-  YYSYMBOL_119_3 = 119,                    /* @3  */
-  YYSYMBOL_120_4 = 120,                    /* @4  */
-  YYSYMBOL_121_5 = 121,                    /* @5  */
-  YYSYMBOL_122_6 = 122,                    /* @6  */
-  YYSYMBOL_123_7 = 123,                    /* @7  */
-  YYSYMBOL_block = 124,                    /* block  */
-  YYSYMBOL_empty = 125,                    /* empty  */
-  YYSYMBOL_formblock = 126,                /* formblock  */
-  YYSYMBOL_remember = 127,                 /* remember  */
-  YYSYMBOL_mblock = 128,                   /* mblock  */
-  YYSYMBOL_mremember = 129,                /* mremember  */
-  YYSYMBOL_stmtseq = 130,                  /* stmtseq  */
-  YYSYMBOL_formstmtseq = 131,              /* formstmtseq  */
-  YYSYMBOL_fullstmt = 132,                 /* fullstmt  */
-  YYSYMBOL_labfullstmt = 133,              /* labfullstmt  */
-  YYSYMBOL_barestmt = 134,                 /* barestmt  */
-  YYSYMBOL_135_8 = 135,                    /* $@8  */
-  YYSYMBOL_136_9 = 136,                    /* $@9  */
-  YYSYMBOL_137_10 = 137,                   /* $@10  */
-  YYSYMBOL_138_11 = 138,                   /* $@11  */
-  YYSYMBOL_139_12 = 139,                   /* $@12  */
-  YYSYMBOL_140_13 = 140,                   /* @13  */
-  YYSYMBOL_141_14 = 141,                   /* $@14  */
-  YYSYMBOL_142_15 = 142,                   /* $@15  */
-  YYSYMBOL_143_16 = 143,                   /* $@16  */
-  YYSYMBOL_formline = 144,                 /* formline  */
-  YYSYMBOL_formarg = 145,                  /* formarg  */
-  YYSYMBOL_condition = 146,                /* condition  */
-  YYSYMBOL_sideff = 147,                   /* sideff  */
-  YYSYMBOL_else = 148,                     /* else  */
-  YYSYMBOL_cont = 149,                     /* cont  */
-  YYSYMBOL_finally = 150,                  /* finally  */
-  YYSYMBOL_mintro = 151,                   /* mintro  */
-  YYSYMBOL_nexpr = 152,                    /* nexpr  */
-  YYSYMBOL_texpr = 153,                    /* texpr  */
-  YYSYMBOL_iexpr = 154,                    /* iexpr  */
-  YYSYMBOL_mexpr = 155,                    /* mexpr  */
-  YYSYMBOL_mnexpr = 156,                   /* mnexpr  */
-  YYSYMBOL_formname = 157,                 /* formname  */
-  YYSYMBOL_startsub = 158,                 /* startsub  */
-  YYSYMBOL_startanonsub = 159,             /* startanonsub  */
-  YYSYMBOL_startformsub = 160,             /* startformsub  */
-  YYSYMBOL_subname = 161,                  /* subname  */
-  YYSYMBOL_proto = 162,                    /* proto  */
-  YYSYMBOL_subattrlist = 163,              /* subattrlist  */
-  YYSYMBOL_myattrlist = 164,               /* myattrlist  */
-  YYSYMBOL_sigvarname = 165,               /* sigvarname  */
-  YYSYMBOL_sigslurpsigil = 166,            /* sigslurpsigil  */
-  YYSYMBOL_sigslurpelem = 167,             /* sigslurpelem  */
-  YYSYMBOL_sigdefault = 168,               /* sigdefault  */
-  YYSYMBOL_sigscalarelem = 169,            /* sigscalarelem  */
-  YYSYMBOL_sigelem = 170,                  /* sigelem  */
-  YYSYMBOL_siglist = 171,                  /* siglist  */
-  YYSYMBOL_optsiglist = 172,               /* optsiglist  */
-  YYSYMBOL_optsubsignature = 173,          /* optsubsignature  */
-  YYSYMBOL_subsignature = 174,             /* subsignature  */
-  YYSYMBOL_subsigguts = 175,               /* subsigguts  */
-  YYSYMBOL_176_17 = 176,                   /* $@17  */
-  YYSYMBOL_optsubbody = 177,               /* optsubbody  */
-  YYSYMBOL_subbody = 178,                  /* subbody  */
-  YYSYMBOL_optsigsubbody = 179,            /* optsigsubbody  */
-  YYSYMBOL_sigsubbody = 180,               /* sigsubbody  */
-  YYSYMBOL_expr = 181,                     /* expr  */
-  YYSYMBOL_listexpr = 182,                 /* listexpr  */
-  YYSYMBOL_listop = 183,                   /* listop  */
-  YYSYMBOL_184_18 = 184,                   /* @18  */
-  YYSYMBOL_method = 185,                   /* method  */
-  YYSYMBOL_subscripted = 186,              /* subscripted  */
-  YYSYMBOL_termbinop = 187,                /* termbinop  */
-  YYSYMBOL_termrelop = 188,                /* termrelop  */
-  YYSYMBOL_relopchain = 189,               /* relopchain  */
-  YYSYMBOL_termeqop = 190,                 /* termeqop  */
-  YYSYMBOL_eqopchain = 191,                /* eqopchain  */
-  YYSYMBOL_termunop = 192,                 /* termunop  */
-  YYSYMBOL_anonymous = 193,                /* anonymous  */
-  YYSYMBOL_termdo = 194,                   /* termdo  */
-  YYSYMBOL_term = 195,                     /* term  */
-  YYSYMBOL_196_19 = 196,                   /* @19  */
-  YYSYMBOL_myattrterm = 197,               /* myattrterm  */
-  YYSYMBOL_myterm = 198,                   /* myterm  */
-  YYSYMBOL_optlistexpr = 199,              /* optlistexpr  */
-  YYSYMBOL_optexpr = 200,                  /* optexpr  */
-  YYSYMBOL_optrepl = 201,                  /* optrepl  */
-  YYSYMBOL_my_scalar = 202,                /* my_scalar  */
-  YYSYMBOL_list_of_scalars = 203,          /* list_of_scalars  */
-  YYSYMBOL_my_list_of_scalars = 204,       /* my_list_of_scalars  */
-  YYSYMBOL_my_var = 205,                   /* my_var  */
-  YYSYMBOL_refgen_topic = 206,             /* refgen_topic  */
-  YYSYMBOL_my_refgen = 207,                /* my_refgen  */
-  YYSYMBOL_amper = 208,                    /* amper  */
-  YYSYMBOL_scalar = 209,                   /* scalar  */
-  YYSYMBOL_ary = 210,                      /* ary  */
-  YYSYMBOL_hsh = 211,                      /* hsh  */
-  YYSYMBOL_arylen = 212,                   /* arylen  */
-  YYSYMBOL_star = 213,                     /* star  */
-  YYSYMBOL_sliceme = 214,                  /* sliceme  */
-  YYSYMBOL_kvslice = 215,                  /* kvslice  */
-  YYSYMBOL_gelem = 216,                    /* gelem  */
-  YYSYMBOL_indirob = 217                   /* indirob  */
-};
-typedef enum yysymbol_kind_t yysymbol_kind_t;
-
-
-
-
 #define YYFINAL  16
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   3293
+#define YYLAST   3664
 
 /* YYNTOKENS -- Number of terminals.  */
-#define YYNTOKENS  115
+#define YYNTOKENS  131
 /* YYNNTS -- Number of nonterminals.  */
-#define YYNNTS  103
+#define YYNNTS  113
 /* YYNRULES -- Number of rules.  */
-#define YYNRULES  304
+#define YYNRULES  337
 /* YYNSTATES -- Number of states.  */
-#define YYNSTATES  610
-
-#define YYMAXUTOK   369
+#define YYNSTATES  669
 
+#define YYUNDEFTOK  2
+#define YYMAXUTOK   385
 
 /* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM
    as returned by yylex, with out-of-bounds checking.  */
-#define YYTRANSLATE(YYX)                                \
-  (0 <= (YYX) && (YYX) <= YYMAXUTOK                     \
-   ? YY_CAST (yysymbol_kind_t, yytranslate[YYX])        \
-   : YYSYMBOL_YYUNDEF)
+#define YYTRANSLATE(YYX)                                                \
+  ((unsigned) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
 
 /* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM
    as returned by yylex.  */
-static const yytype_int8 yytranslate[] =
+static const yytype_uint8 yytranslate[] =
 {
        0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
@@ -295,110 +65,109 @@ static const yytype_int8 yytranslate[] =
       75,    76,    77,    78,    79,    80,    81,    82,    83,    84,
       85,    86,    87,    88,    89,    90,    91,    92,    93,    94,
       95,    96,    97,    98,    99,   100,   101,   102,   103,   104,
-     105,   106,   107,   108,   109,   110,   111,   112,   113,   114
+     105,   106,   107,   108,   109,   110,   111,   112,   113,   114,
+     115,   116,   117,   118,   119,   120,   121,   122,   123,   124,
+     125,   126,   127,   128,   129,   130
 };
 
 #if YYDEBUG
   /* YYRLINE[YYN] -- Source line where rule number YYN was defined.  */
-static const yytype_int16 yyrline[] =
+static const yytype_uint16 yyrline[] =
 {
-       0,   140,   140,   139,   151,   150,   161,   160,   174,   173,
-     187,   186,   200,   199,   210,   209,   222,   230,   234,   241,
-     246,   253,   260,   261,   271,   272,   281,   285,   289,   296,
-     306,   308,   321,   318,   342,   337,   358,   366,   365,   374,
-     380,   386,   391,   393,   395,   402,   410,   412,   409,   429,
-     434,   443,   450,   449,   464,   472,   479,   481,   478,   490,
-     497,   496,   511,   515,   519,   524,   532,   550,   551,   555,
-     559,   561,   563,   565,   567,   569,   571,   574,   580,   581,
-     586,   597,   598,   603,   605,   610,   617,   618,   622,   626,
-     630,   635,   639,   643,   644,   647,   653,   658,   664,   665,
-     670,   671,   676,   677,   679,   684,   686,   697,   699,   704,
-     706,   710,   730,   731,   733,   739,   804,   806,   812,   814,
-     818,   824,   825,   830,   831,   835,   839,   839,   906,   907,
-     912,   924,   925,   929,   940,   942,   944,   948,   950,   955,
-     959,   963,   967,   973,   978,   984,   990,   992,   994,   997,
-     996,  1007,  1008,  1012,  1016,  1019,  1024,  1029,  1032,  1036,
-    1040,  1046,  1054,  1061,  1067,  1069,  1071,  1076,  1078,  1080,
-    1085,  1087,  1089,  1091,  1093,  1095,  1097,  1099,  1101,  1103,
-    1105,  1109,  1111,  1113,  1115,  1119,  1121,  1125,  1127,  1129,
-    1131,  1135,  1137,  1142,  1144,  1147,  1149,  1151,  1154,  1157,
-    1168,  1171,  1179,  1181,  1183,  1186,  1192,  1194,  1198,  1199,
-    1200,  1201,  1202,  1204,  1206,  1208,  1210,  1212,  1214,  1216,
-    1218,  1220,  1222,  1224,  1226,  1228,  1238,  1248,  1258,  1268,
-    1270,  1272,  1275,  1280,  1284,  1286,  1288,  1290,  1293,  1295,
-    1298,  1300,  1302,  1304,  1306,  1308,  1310,  1312,  1314,  1317,
-    1319,  1321,  1323,  1325,  1327,  1331,  1334,  1333,  1346,  1347,
-    1348,  1353,  1355,  1357,  1359,  1364,  1366,  1369,  1371,  1373,
-    1379,  1380,  1384,  1385,  1389,  1390,  1395,  1400,  1402,  1406,
-    1409,  1413,  1414,  1415,  1418,  1419,  1422,  1423,  1426,  1430,
-    1434,  1440,  1446,  1448,  1452,  1456,  1457,  1461,  1462,  1466,
-    1467,  1472,  1474,  1476,  1479
+       0,   161,   161,   160,   172,   171,   182,   181,   195,   194,
+     208,   207,   221,   220,   231,   230,   244,   246,   251,   259,
+     263,   270,   275,   282,   288,   292,   294,   291,   301,   302,
+     312,   313,   322,   326,   330,   337,   347,   349,   362,   359,
+     383,   378,   406,   405,   431,   442,   454,   453,   464,   470,
+     476,   481,   483,   485,   492,   500,   502,   499,   519,   524,
+     533,   540,   539,   554,   562,   569,   568,   583,   590,   589,
+     605,   604,   624,   628,   632,   636,   642,   650,   668,   669,
+     673,   677,   679,   681,   683,   685,   687,   689,   692,   698,
+     699,   704,   715,   716,   721,   723,   728,   735,   736,   740,
+     744,   748,   753,   757,   761,   762,   765,   771,   776,   781,
+     787,   788,   793,   794,   799,   800,   807,   812,   814,   825,
+     827,   832,   834,   838,   858,   859,   861,   874,   934,   936,
+     942,   944,   948,   954,   955,   960,   961,   965,   969,   969,
+    1036,  1037,  1042,  1054,  1055,  1059,  1070,  1072,  1074,  1076,
+    1078,  1082,  1084,  1089,  1093,  1097,  1101,  1107,  1112,  1118,
+    1124,  1126,  1128,  1131,  1130,  1141,  1142,  1146,  1150,  1153,
+    1158,  1163,  1166,  1170,  1174,  1180,  1188,  1195,  1201,  1203,
+    1205,  1210,  1212,  1214,  1216,  1218,  1220,  1225,  1227,  1229,
+    1231,  1233,  1235,  1237,  1239,  1241,  1243,  1245,  1247,  1249,
+    1251,  1253,  1255,  1259,  1261,  1263,  1265,  1267,  1271,  1273,
+    1277,  1279,  1281,  1283,  1287,  1289,  1294,  1296,  1299,  1301,
+    1303,  1306,  1309,  1320,  1323,  1331,  1333,  1335,  1338,  1341,
+    1349,  1351,  1355,  1356,  1357,  1358,  1359,  1361,  1363,  1365,
+    1367,  1369,  1371,  1373,  1375,  1377,  1379,  1381,  1383,  1385,
+    1395,  1405,  1415,  1425,  1427,  1429,  1432,  1437,  1441,  1443,
+    1445,  1447,  1450,  1452,  1455,  1457,  1459,  1461,  1463,  1465,
+    1467,  1469,  1471,  1474,  1476,  1478,  1480,  1482,  1484,  1488,
+    1491,  1490,  1503,  1504,  1505,  1510,  1512,  1514,  1516,  1521,
+    1523,  1526,  1528,  1530,  1535,  1540,  1545,  1553,  1555,  1557,
+    1561,  1569,  1568,  1586,  1587,  1591,  1592,  1596,  1597,  1602,
+    1607,  1609,  1613,  1616,  1620,  1621,  1622,  1625,  1626,  1629,
+    1630,  1633,  1637,  1641,  1647,  1653,  1655,  1659,  1663,  1664,
+    1668,  1669,  1673,  1674,  1679,  1681,  1683,  1686
 };
 #endif
 
-/** Accessing symbol of state STATE.  */
-#define YY_ACCESSING_SYMBOL(State) YY_CAST (yysymbol_kind_t, yystos[State])
-
-#if YYDEBUG || 0
-/* The user-facing name of the symbol whose (internal) number is
-   YYSYMBOL.  No bounds checking.  */
-static const char *yysymbol_name (yysymbol_kind_t yysymbol) YY_ATTRIBUTE_UNUSED;
-
+#if YYDEBUG || YYERROR_VERBOSE || 0
 /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
    First, the terminals, then, starting at YYNTOKENS, nonterminals.  */
 static const char *const yytname[] =
 {
-  "\"end of file\"", "error", "\"invalid token\"", "GRAMPROG", "GRAMEXPR",
-  "GRAMBLOCK", "GRAMBARESTMT", "GRAMFULLSTMT", "GRAMSTMTSEQ",
-  "GRAMSUBSIGNATURE", "PERLY_AMPERSAND", "PERLY_BRACE_OPEN",
-  "PERLY_BRACE_CLOSE", "PERLY_BRACKET_OPEN", "PERLY_BRACKET_CLOSE",
-  "PERLY_COMMA", "PERLY_DOLLAR", "PERLY_DOT", "PERLY_EQUAL_SIGN",
-  "PERLY_MINUS", "PERLY_PERCENT_SIGN", "PERLY_PLUS", "PERLY_SEMICOLON",
-  "PERLY_SLASH", "PERLY_SNAIL", "PERLY_STAR", "BAREWORD", "METHOD",
-  "FUNCMETH", "THING", "PMFUNC", "PRIVATEREF", "QWLIST", "FUNC0OP",
-  "FUNC0SUB", "UNIOPSUB", "LSTOPSUB", "PLUGEXPR", "PLUGSTMT", "LABEL",
-  "FORMAT", "SUB", "SIGSUB", "ANONSUB", "ANON_SIGSUB", "PACKAGE", "USE",
-  "WHILE", "UNTIL", "IF", "UNLESS", "ELSE", "ELSIF", "CONTINUE", "FOR",
-  "GIVEN", "WHEN", "DEFAULT", "TRY", "CATCH", "FINALLY", "LOOPEX",
-  "DOTDOT", "YADAYADA", "FUNC0", "FUNC1", "FUNC", "UNIOP", "LSTOP",
-  "MULOP", "ADDOP", "DOLSHARP", "DO", "HASHBRACK", "NOAMP", "LOCAL", "MY",
-  "REQUIRE", "COLONATTR", "FORMLBRACK", "FORMRBRACK", "SUBLEXSTART",
-  "SUBLEXEND", "DEFER", "PREC_LOW", "OROP", "ANDOP", "NOTOP", "ASSIGNOP",
-  "PERLY_QUESTION_MARK", "PERLY_COLON", "OROR", "DORDOR", "ANDAND",
-  "BITOROP", "BITANDOP", "CHEQOP", "NCEQOP", "CHRELOP", "NCRELOP",
-  "SHIFTOP", "MATCHOP", "PERLY_EXCLAMATION_MARK", "PERLY_TILDE", "UMINUS",
-  "REFGEN", "POWOP", "PREINC", "PREDEC", "POSTINC", "POSTDEC", "POSTJOIN",
-  "ARROW", "PERLY_PAREN_CLOSE", "PERLY_PAREN_OPEN", "$accept", "grammar",
-  "@1", "@2", "@3", "@4", "@5", "@6", "@7", "block", "empty", "formblock",
-  "remember", "mblock", "mremember", "stmtseq", "formstmtseq", "fullstmt",
-  "labfullstmt", "barestmt", "$@8", "$@9", "$@10", "$@11", "$@12", "@13",
-  "$@14", "$@15", "$@16", "formline", "formarg", "condition", "sideff",
-  "else", "cont", "finally", "mintro", "nexpr", "texpr", "iexpr", "mexpr",
-  "mnexpr", "formname", "startsub", "startanonsub", "startformsub",
-  "subname", "proto", "subattrlist", "myattrlist", "sigvarname",
-  "sigslurpsigil", "sigslurpelem", "sigdefault", "sigscalarelem",
-  "sigelem", "siglist", "optsiglist", "optsubsignature", "subsignature",
-  "subsigguts", "$@17", "optsubbody", "subbody", "optsigsubbody",
-  "sigsubbody", "expr", "listexpr", "listop", "@18", "method",
-  "subscripted", "termbinop", "termrelop", "relopchain", "termeqop",
-  "eqopchain", "termunop", "anonymous", "termdo", "term", "@19",
-  "myattrterm", "myterm", "optlistexpr", "optexpr", "optrepl", "my_scalar",
-  "list_of_scalars", "my_list_of_scalars", "my_var", "refgen_topic",
-  "my_refgen", "amper", "scalar", "ary", "hsh", "arylen", "star",
-  "sliceme", "kvslice", "gelem", "indirob", YY_NULLPTR
+  "$end", "error", "$undefined", "GRAMPROG", "GRAMEXPR", "GRAMBLOCK",
+  "GRAMBARESTMT", "GRAMFULLSTMT", "GRAMSTMTSEQ", "GRAMSUBSIGNATURE",
+  "PERLY_AMPERSAND", "PERLY_BRACE_OPEN", "PERLY_BRACE_CLOSE",
+  "PERLY_BRACKET_OPEN", "PERLY_BRACKET_CLOSE", "PERLY_COMMA",
+  "PERLY_DOLLAR", "PERLY_DOT", "PERLY_EQUAL_SIGN", "PERLY_MINUS",
+  "PERLY_PERCENT_SIGN", "PERLY_PLUS", "PERLY_SEMICOLON", "PERLY_SLASH",
+  "PERLY_SNAIL", "PERLY_STAR", "KW_FORMAT", "KW_PACKAGE", "KW_CLASS",
+  "KW_LOCAL", "KW_MY", "KW_FIELD", "KW_IF", "KW_ELSE", "KW_ELSIF",
+  "KW_UNLESS", "KW_FOR", "KW_UNTIL", "KW_WHILE", "KW_CONTINUE", "KW_GIVEN",
+  "KW_WHEN", "KW_DEFAULT", "KW_TRY", "KW_CATCH", "KW_FINALLY", "KW_DEFER",
+  "KW_REQUIRE", "KW_DO", "KW_USE_or_NO", "KW_SUB_named",
+  "KW_SUB_named_sig", "KW_SUB_anon", "KW_SUB_anon_sig", "KW_METHOD_named",
+  "KW_METHOD_anon", "BAREWORD", "METHCALL0", "METHCALL", "THING", "PMFUNC",
+  "PRIVATEREF", "QWLIST", "FUNC0OP", "FUNC0SUB", "UNIOPSUB", "LSTOPSUB",
+  "PLUGEXPR", "PLUGSTMT", "LABEL", "LOOPEX", "DOTDOT", "YADAYADA", "FUNC0",
+  "FUNC1", "FUNC", "UNIOP", "LSTOP", "POWOP", "MULOP", "ADDOP", "DOLSHARP",
+  "HASHBRACK", "NOAMP", "COLONATTR", "FORMLBRACK", "FORMRBRACK",
+  "SUBLEXSTART", "SUBLEXEND", "PHASER", "PREC_LOW", "PLUGIN_LOW_OP",
+  "OROP", "PLUGIN_LOGICAL_OR_LOW_OP", "ANDOP", "PLUGIN_LOGICAL_AND_LOW_OP",
+  "NOTOP", "ASSIGNOP", "PLUGIN_ASSIGN_OP", "PERLY_QUESTION_MARK",
+  "PERLY_COLON", "OROR", "DORDOR", "PLUGIN_LOGICAL_OR_OP", "ANDAND",
+  "PLUGIN_LOGICAL_AND_OP", "BITOROP", "BITANDOP", "CHEQOP", "NCEQOP",
+  "CHRELOP", "NCRELOP", "PLUGIN_REL_OP", "SHIFTOP", "PLUGIN_ADD_OP",
+  "PLUGIN_MUL_OP", "MATCHOP", "PERLY_EXCLAMATION_MARK", "PERLY_TILDE",
+  "UMINUS", "REFGEN", "PLUGIN_POW_OP", "PREINC", "PREDEC", "POSTINC",
+  "POSTDEC", "POSTJOIN", "PLUGIN_HIGH_OP", "ARROW", "PERLY_PAREN_CLOSE",
+  "PERLY_PAREN_OPEN", "$accept", "grammar", "@1", "@2", "@3", "@4", "@5",
+  "@6", "@7", "sigsub_or_method_named", "block", "empty", "formblock",
+  "remember", "mblock", "mremember", "catch_paren", "$@8", "$@9",
+  "stmtseq", "formstmtseq", "fullstmt", "labfullstmt", "barestmt", "$@10",
+  "$@11", "$@12", "$@13", "$@14", "$@15", "@16", "$@17", "$@18", "$@19",
+  "formline", "formarg", "condition", "sideff", "else", "cont", "finally",
+  "mintro", "nexpr", "texpr", "iexpr", "mexpr", "mnexpr", "formname",
+  "startsub", "startanonsub", "startanonmethod", "startformsub", "subname",
+  "proto", "subattrlist", "myattrlist", "sigvarname", "sigslurpsigil",
+  "sigslurpelem", "sigdefault", "sigscalarelem", "sigelem", "siglist",
+  "optsiglist", "optsubsignature", "subsignature", "subsigguts", "$@20",
+  "optsubbody", "subbody", "optsigsubbody", "sigsubbody", "expr",
+  "listexpr", "listop", "@21", "methodname", "subscripted", "termbinop",
+  "termrelop", "relopchain", "termeqop", "eqopchain", "termunop",
+  "anonymous", "termdo", "term", "@22", "myattrterm", "myterm", "fieldvar",
+  "optfieldattrlist", "fielddecl", "$@23", "optlistexpr", "optexpr",
+  "optrepl", "my_scalar", "list_of_scalars", "my_list_of_scalars",
+  "my_var", "refgen_topic", "my_refgen", "amper", "scalar", "ary", "hsh",
+  "arylen", "star", "sliceme", "kvslice", "gelem", "indirob", YY_NULLPTR
 };
-
-static const char *
-yysymbol_name (yysymbol_kind_t yysymbol)
-{
-  return yytname[yysymbol];
-}
 #endif
 
-#ifdef YYPRINT
+# ifdef YYPRINT
 /* YYTOKNUM[NUM] -- (External) token number corresponding to the
    (internal) symbol number NUM (which must be that of a token).  */
-static const yytype_int16 yytoknum[] =
+static const yytype_uint16 yytoknum[] =
 {
        0,   256,   257,   258,   259,   260,   261,   262,   263,   264,
      265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
@@ -411,185 +180,201 @@ static const yytype_int16 yytoknum[] =
      335,   336,   337,   338,   339,   340,   341,   342,   343,   344,
      345,   346,   347,   348,   349,   350,   351,   352,   353,   354,
      355,   356,   357,   358,   359,   360,   361,   362,   363,   364,
-     365,   366,   367,   368,   369
+     365,   366,   367,   368,   369,   370,   371,   372,   373,   374,
+     375,   376,   377,   378,   379,   380,   381,   382,   383,   384,
+     385
 };
-#endif
+# endif
 
-#define YYPACT_NINF (-498)
+#define YYPACT_NINF -551
 
-#define yypact_value_is_default(Yyn) \
-  ((Yyn) == YYPACT_NINF)
+#define yypact_value_is_default(Yystate) \
+  (!!((Yystate) == (-551)))
 
-#define YYTABLE_NINF (-300)
+#define YYTABLE_NINF -336
 
-#define yytable_value_is_error(Yyn) \
-  ((Yyn) == YYTABLE_NINF)
+#define yytable_value_is_error(Yytable_value) \
+  (!!((Yytable_value) == (-336)))
 
   /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
      STATE-NUM.  */
 static const yytype_int16 yypact[] =
 {
-     477,  -498,  -498,  -498,  -498,  -498,  -498,  -498,    37,  -498,
-    2923,    16,  1589,  1490,  -498,  -498,  -498,  -498,   214,  2923,
-     214,  2923,   214,  2923,   214,   214,  -498,   214,   214,  -498,
-    -498,    33,   -64,  -498,  2923,  -498,  -498,  -498,  -498,  2923,
-     -49,   -46,   -37,  2155,  2056,   214,  2155,  2923,   155,  2923,
-      50,  2923,  2923,  2923,  2923,  2923,  2923,  2923,  2251,  -498,
-       2,    57,  -498,    10,  -498,   120,   -14,   176,     1,  -498,
-    -498,  -498,  3091,  -498,  -498,    -5,   171,   189,   194,  -498,
-      94,   220,   224,   111,  -498,  -498,  -498,  -498,  -498,  -498,
-     155,   155,   125,  -498,    26,    69,    99,   112,     9,   133,
-     136,    16,   244,   165,   244,   208,  -498,   243,   512,  1490,
-    -498,  -498,  -498,  -498,   630,  -498,    35,   774,  -498,  -498,
-    -498,  -498,  -498,   260,  -498,   400,  -498,   400,  -498,  -498,
-    2923,   177,   229,  2923,   201,   223,    16,   292,   248,  3091,
-     230,  2347,  2923,  2056,  -498,   223,  1952,  -498,    57,  -498,
-    1850,  2923,  -498,  -498,   223,   323,  -498,  -498,  2923,   223,
-    3019,  2443,   268,  -498,  -498,  -498,   223,    57,   400,   400,
-     400,   253,   253,   354,    59,  2923,  2923,  2923,  2923,  2923,
-    2539,  -498,  -498,  2923,  -498,  -498,  2923,  2923,  2923,  2923,
-    2923,  2923,  2923,  2923,  2923,  2923,  2923,  2923,  2923,  2923,
-    2923,  2923,  2923,  2923,  -498,  -498,  -498,   149,  2635,  2923,
-    2923,  2923,  2923,  2923,  2923,  2923,  -498,   331,  -498,  -498,
-     348,  -498,  -498,  -498,  -498,  -498,   283,   188,  -498,  -498,
-     265,  -498,  -498,  -498,  -498,   333,  -498,  -498,    16,  -498,
-    -498,  -498,  2923,  2923,  2923,  2923,  2923,  2923,  -498,  -498,
-    -498,   359,  -498,  -498,  -498,   359,  -498,  -498,  -498,   378,
-    -498,  -498,  -498,  2923,  2923,    22,  -498,  -498,  -498,  -498,
-     248,   375,  -498,  -498,  -498,  -498,   156,   334,   314,  2923,
-      57,   393,  -498,  2731,   400,   268,    78,   117,   139,  -498,
-     181,   392,  -498,  2923,   415,   343,  -498,  3091,    72,    25,
-    -498,   185,   223,   361,  3181,   344,   238,  3091,  3046,  1884,
-    1884,  1669,   444,   301,   361,   361,   223,   223,   308,   400,
-     400,   407,  2923,  2923,   622,   408,   416,   418,  -498,   421,
-    2827,   337,  -498,  -498,   191,    82,    27,   124,    31,   153,
-      53,   158,   879,  -498,  -498,   429,  -498,  -498,    20,   426,
-    2923,  2923,  2923,  2923,  -498,   -12,  -498,  -498,   349,  -498,
-    -498,  -498,  -498,  1685,   356,  -498,  2923,  2923,  -498,   351,
-    -498,  -498,     2,  -498,     2,  -498,  -498,  -498,  -498,  -498,
-     369,   369,    35,   353,   114,  -498,  2923,  -498,  -498,   360,
-    -498,  -498,  -498,  -498,   242,  -498,    15,   256,  -498,  -498,
-    -498,    68,  2923,   464,  -498,  -498,  2923,  -498,   174,    85,
-    -498,  -498,  -498,  -498,  -498,  -498,   274,  2923,  -498,   465,
-    -498,   466,  -498,   475,  -498,   476,  -498,  -498,  -498,   292,
-     248,  -498,  -498,   463,   380,     2,   384,   386,     2,   387,
-     487,   391,  -498,  -498,  -498,  -498,  -498,   402,   495,   143,
-    -498,  2923,   406,   409,   995,  -498,  2923,  -498,  -498,  -498,
-    -498,  -498,  2923,  -498,   441,  -498,   514,  -498,  -498,  -498,
-     515,  -498,  -498,    49,  -498,    92,  -498,  3136,   517,  -498,
-    -498,   417,  -498,  -498,  -498,  -498,   524,   248,   526,  -498,
-    2923,  -498,  -498,   244,   244,   519,   423,  -498,  2923,  2923,
-     244,  -498,   435,   424,   244,   244,  -498,  -498,  3091,     2,
-    -498,  -498,   439,  -498,  -498,  -498,  -498,   478,   535,  -498,
-    -498,  -498,  -498,   541,   244,   244,   228,   228,   487,   450,
-     452,   454,   208,  2923,  2923,   244,  -498,  -498,   487,  1094,
-    -498,  1193,  -498,  -498,  -498,  -498,  1292,  -498,   208,   208,
-     244,   455,  -498,  -498,  -498,  -498,  2923,   244,   244,  -498,
-     548,   460,   208,  -498,  -498,  -498,  -498,    18,  -498,  -498,
-    -498,  -498,  2923,   461,   208,   208,  -498,   244,  -498,   462,
-     560,   499,  -498,   467,   244,  -498,  -498,  -498,   208,   244,
-    -498,  -498,  -498,  -498,   244,   208,  1781,  -498,   521,  1391,
-     228,  -498,   469,    16,  -498,  -498,  -498,   244,  -498,  -498
+     926,  -551,  -551,  -551,  -551,  -551,  -551,  -551,    34,  -551,
+    2909,    41,  1877,  1762,  -551,  -551,  -551,  -551,    46,  2909,
+      46,  2909,    46,  2909,    46,    46,  2909,    12,  2909,  2198,
+    -551,  -551,  -551,  -551,    46,    46,  -551,  -551,    42,   -66,
+    -551,  2909,  -551,  -551,  2909,   -41,   -38,   -64,  2198,  2119,
+      46,  2909,   -23,  2909,  2909,  2909,  2909,  2909,  2909,  2277,
+    -551,   680,   101,  -551,     4,  -551,   -42,    10,    63,    22,
+    -551,  -551,  -551,  3152,  -551,  -551,    18,   185,   200,   212,
+    -551,   151,   219,   229,   192,  -551,  -551,  -551,  -551,  -551,
+     160,   177,   129,    82,   111,    13,   127,   134,   175,   180,
+      41,   300,   300,  -551,   -23,  -551,  -551,  -551,   292,  -551,
+     -23,   276,  -551,   303,   432,   313,  1762,  -551,  -551,  -551,
+    -551,   660,  -551,   384,   832,  -551,  -551,  -551,  -551,  -551,
+     323,  -551,   329,  -551,   329,  -551,  -551,   317,  2988,  2356,
+     255,  -551,  -551,  -551,   317,  -551,   317,   281,   261,   261,
+    2909,   216,   266,  2909,   230,   317,    41,  3152,   232,  2435,
+    2909,  2119,  -551,   317,  3067,  -551,   101,  -551,  2514,  2909,
+    -551,   326,  -551,  -551,  2909,   101,   329,   329,   329,   642,
+     642,   350,   262,  2909,  2909,  2909,  2909,  2909,  2909,  2909,
+    2593,  -551,  -551,  2909,  -551,  -551,  2909,  2909,  2909,  2909,
+    2909,  2909,  2909,  2909,  2909,  2909,  2909,  2909,  2909,  2909,
+    2909,  2909,  2909,  2909,  2909,  2909,  2909,  2909,  2909,  2909,
+    2909,  2909,  -551,  -551,  -551,  2909,    84,  2672,  2909,  2909,
+    2909,  2909,  2909,  2909,  2909,  -551,   318,   324,   325,   289,
+    -551,  -551,  -551,  -551,  -551,   259,   741,  -551,  -551,   258,
+    -551,  -551,  -551,  -551,  -551,  -551,   341,  -551,  -551,  -551,
+    -551,  -551,  -551,    41,  -551,  -551,  -551,  2909,  2909,  2909,
+    2909,  2909,  2909,  -551,  -551,  -551,  -551,   332,  -551,  -551,
+    -551,   332,  -551,  -551,  -551,   372,  -551,  -551,  2751,   329,
+     255,    40,   250,   278,  -551,   273,   340,  -551,  -551,  -551,
+     261,   342,  -551,  -551,  -551,  -551,  2909,  2909,    96,  -551,
+    -551,  -551,  -551,   390,   315,   282,  2909,   101,   398,  -551,
+    2909,   399,   161,   161,  -551,  -551,  3254,    66,   100,  -551,
+     411,  3517,  3497,  3356,   329,   492,  3220,  3203,  3254,  3254,
+    3101,  3395,  3395,  3395,  3418,  3418,  3457,  3478,  3497,  3497,
+    3517,  3517,  3536,   459,  3220,   492,   329,   329,   146,   392,
+    2909,  2909,   322,   393,   400,   401,  -551,   410,  2830,   294,
+    -551,  -551,   417,    89,   115,   236,   142,   249,   159,   257,
+     947,  -551,  -551,   418,    54,   261,   380,  -551,   343,  2909,
+    2909,  -551,     6,  -551,  -551,   316,  -551,  -551,  -551,  -551,
+    1961,   129,  -551,  2909,  2909,  2909,  2909,  -551,  -551,   403,
+    -551,   426,  -551,  -551,  -551,   680,  -551,  -551,  -551,   680,
+    -551,  -551,  -551,   352,   352,   384,   -12,   449,  -551,  -551,
+    -551,  -551,  -551,   330,  -551,  -551,   334,   103,  -551,  2909,
+    -551,  -551,  -551,   500,  -551,   173,  2909,   453,  -551,  -551,
+    2909,  -551,   277,   214,  -551,  -551,  -551,  -551,  -551,  -551,
+     652,  2909,  -551,   454,  -551,   460,  -551,   462,  -551,   463,
+    -551,  -551,  -551,  -551,  -551,   156,  -551,  -551,   347,   680,
+     349,   455,   358,  -551,  -551,  -551,  -551,  -551,   351,   457,
+     183,  -551,  2909,   361,   363,   680,   365,   366,  1072,   367,
+     442,   281,  -551,   490,  -551,  -551,   261,  2909,  -551,  -551,
+    -551,  -551,    37,  -551,  -551,  -551,   491,  -551,  -551,  2909,
+    -551,   419,  -551,  -551,  -551,   224,  -551,  3305,   502,  -551,
+    -551,   386,  -551,  -551,  -551,  -551,   494,  -551,  -551,  -551,
+    2909,   300,   300,   503,   391,  -551,  2909,  2909,   300,  -551,
+     415,   404,  -551,  -551,   300,   300,  -551,  -551,  -551,  -551,
+    2909,   261,  -551,   506,  3152,   423,  -551,   680,  -551,  -551,
+    -551,  -551,   436,  -551,  -551,  3152,   247,   247,   455,   424,
+     428,   429,   276,  2909,  2909,   300,   300,   300,  -551,  -551,
+     455,   300,   507,   426,  1187,  -551,  -551,  -551,  -551,  1302,
+    -551,  1417,  -551,   300,   431,  -551,  -551,  -551,  -551,  2909,
+     300,   300,  -551,   525,   430,   276,   276,   276,  -551,   519,
+    -551,  -551,  -551,  -551,  -551,    20,  -551,  1532,  -551,  2909,
+     439,   276,   276,  -551,   300,  -551,  -551,  -551,   440,    41,
+    -551,   548,   486,  -551,  -551,   447,   300,  -551,  -551,  -551,
+     276,  -551,  -551,  -551,  -551,  -551,  -551,   300,   276,  2040,
+    -551,  1647,   247,  -551,   448,  -551,  -551,   300,  -551
 };
 
   /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
      Performed when YYTABLE does not specify something else to do.  Zero
      means the default is an error.  */
-static const yytype_int16 yydefact[] =
+static const yytype_uint16 yydefact[] =
 {
-       0,     2,     4,     6,     8,    10,    12,    14,     0,    19,
-      17,     0,     0,     0,    17,   126,     1,    17,     0,    17,
-       0,     0,     0,     0,     0,     0,   258,     0,     0,   229,
-     256,   217,   251,   253,   247,    96,   260,    96,    96,   239,
-     249,     0,     0,   242,    17,     0,     0,    17,     0,     0,
-       0,   245,     0,     0,     0,     0,     0,     0,     0,   272,
-     273,   136,   259,   224,   208,   172,   181,   173,   187,   209,
-     210,   211,   139,   214,     5,   230,   219,   222,   221,   223,
-     220,     0,     0,     0,    19,     7,    70,    65,    30,    97,
-       0,     0,     0,    95,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,    17,     9,     0,    71,     0,
-      11,    27,    26,    22,     0,    15,    17,     0,   301,   304,
-     303,   302,   288,     0,   289,   193,   291,   194,   290,   294,
-      17,     0,     0,     0,     0,   248,     0,    17,    17,   240,
-       0,     0,    17,    17,   243,   244,   301,   270,   271,   146,
-     302,     0,   292,   207,   206,     0,    98,    99,    17,   215,
-       0,     0,   262,   267,   269,   268,   246,   241,   195,   196,
-     213,   200,   201,   218,     0,     0,     0,   137,     0,     0,
-       0,   184,   183,     0,   190,   189,     0,     0,     0,     0,
+       0,     2,     4,     6,     8,    10,    12,    14,     0,    21,
+      19,     0,     0,     0,    19,   138,     1,    19,     0,    19,
+       0,     0,     0,     0,     0,     0,     0,     0,   269,     0,
+     107,   107,   108,   282,     0,     0,   253,   280,   241,   275,
+     277,   271,   107,   284,   263,   273,     0,     0,   266,    19,
+       0,    19,     0,     0,     0,     0,     0,     0,     0,     0,
+     305,   306,   150,   283,   248,   232,   191,   203,   192,   210,
+     233,   234,   235,   153,   238,     5,   254,   243,   246,   245,
+     247,   244,     0,     0,     0,    21,     7,    81,    76,   109,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   197,   198,   199,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,    17,    17,    95,    95,
-       0,    37,    19,    19,    19,    19,    19,     0,    19,    19,
-       0,    19,    19,    43,    21,     0,    64,    63,     0,    81,
-      59,    62,     0,     0,     0,     0,     0,     0,    29,    28,
-      23,   107,   110,   109,   121,   107,   117,   116,   120,   122,
-     127,   202,   144,    17,     0,     0,   252,   149,   101,   100,
-      17,   104,   102,    19,   250,   254,     0,     0,     0,     0,
-     140,     0,   233,     0,   264,     0,   219,   222,   221,   266,
-       0,   106,   261,     0,   216,   135,   134,   138,     0,     0,
-     163,     0,   186,   192,   176,   169,   170,   167,     0,   178,
-     179,   177,   175,   174,   191,   188,   185,   182,   171,   180,
-     168,     0,     0,     0,     0,   298,   296,   300,   151,     0,
-       0,   143,   152,   231,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,    93,    94,     0,    32,    34,     0,     0,
-      88,     0,     0,     0,   286,     0,   287,   284,     0,   285,
-     281,   282,   283,     0,     0,    19,     0,     0,    17,     0,
-      82,    74,    69,    75,    90,    72,    73,    76,    77,   108,
-      17,    17,   118,     0,    17,   165,    17,    19,   103,    17,
-     205,   255,   148,   147,     0,   203,   218,     0,   263,   265,
-     105,     0,     0,     0,   156,   162,     0,   237,     0,     0,
-     234,   236,   235,   238,   293,   160,     0,    17,   232,     0,
-     154,     0,   225,     0,   226,     0,    16,    19,    31,    17,
-      17,    19,    36,     0,     0,    89,     0,     0,    91,     0,
-       0,     0,   276,    19,    86,    87,    92,     0,     0,    71,
-      52,     0,     0,     0,     0,    56,   113,   112,   115,   111,
-     119,   145,     0,   274,     0,   150,     0,   204,   126,   123,
-       0,   124,   141,   216,   166,     0,   159,   212,     0,   155,
-     161,     0,   157,   227,   228,   153,     0,    17,    19,    60,
-      17,    85,    85,     0,     0,   280,     0,   279,     0,     0,
-       0,    46,     0,     0,     0,     0,    20,    19,   114,   275,
-     257,    17,     0,    17,   164,   158,   142,     0,    19,   132,
-      35,   131,    17,     0,     0,     0,    17,    17,   277,     0,
-       0,     0,    17,    88,     0,     0,    41,    42,     0,     0,
-     125,     0,    17,   129,    33,   128,     0,    38,    17,    17,
-       0,     0,    78,    39,    40,   278,     0,     0,     0,    55,
-       0,     0,    17,    57,   130,   133,    24,     0,    61,    44,
-      45,    79,     0,     0,    17,    17,    47,     0,    51,     0,
-       0,    17,    25,     0,     0,    49,    54,    85,    17,     0,
-      18,    17,    67,    66,     0,    17,     0,    53,    83,     0,
-      17,    50,     0,     0,    58,    68,    80,     0,    84,    48
+       0,     0,     0,   106,     0,    16,    17,    36,     0,   106,
+       0,    19,     9,     0,    82,     0,     0,    11,    33,    32,
+      28,     0,    15,    19,     0,   334,   337,   336,   335,   321,
+       0,   322,   216,   324,   217,   323,   327,   239,     0,     0,
+     286,   291,   293,   292,   270,   231,   230,    19,    19,    19,
+      19,     0,     0,     0,     0,   272,     0,   264,     0,     0,
+      19,    19,   267,   268,   282,   303,   304,   160,   243,     0,
+     325,     0,   110,   111,    19,   265,   218,   219,   237,   223,
+     224,   242,     0,     0,     0,     0,     0,   151,     0,     0,
+       0,   206,   205,     0,   213,   212,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,   220,   221,   222,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,    19,    19,     0,     0,    19,
+     294,   296,   295,    21,    21,    21,     0,    21,    21,     0,
+      21,    21,    21,    21,    52,    23,     0,    74,    46,   106,
+      75,    42,   106,     0,    92,    67,    73,     0,     0,     0,
+       0,     0,     0,    72,    35,    34,    29,   119,   122,   121,
+     133,   119,   129,   128,   132,   134,   139,   225,     0,   288,
+       0,   243,   246,   245,   290,     0,   118,   285,   113,   112,
+      19,   116,   114,    21,    21,   158,    19,     0,     0,   276,
+     163,   274,   278,     0,     0,     0,     0,   154,     0,   257,
+       0,   240,   148,   149,   146,   147,   152,     0,     0,   177,
+       0,   209,   215,   195,   184,   186,   188,   202,   182,   183,
+       0,   198,   200,   199,   196,   197,   194,   193,   214,   211,
+     208,   204,   207,   190,   189,   187,   201,   185,   181,     0,
+       0,     0,     0,   331,   329,   333,   165,     0,     0,   157,
+     166,   255,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   104,   105,     0,     0,    19,   298,   299,   300,     0,
+       0,   319,     0,   320,   317,     0,   318,   314,   315,   316,
+       0,     0,    21,     0,    99,     0,     0,    19,    21,     0,
+      38,    21,    40,    93,    83,    80,    84,    87,    86,   101,
+      85,    88,   120,    19,    19,   130,   242,     0,   287,   289,
+     117,    21,   115,    19,   228,   229,     0,    19,   179,    19,
+     279,   162,   161,     0,   226,     0,     0,     0,   170,   176,
+       0,   261,     0,     0,   258,   260,   259,   262,   326,   174,
+       0,    19,   256,     0,   168,     0,   249,     0,   250,     0,
+      18,    21,    37,    21,    44,     0,   297,   301,     0,   102,
+       0,     0,     0,   309,    21,    97,    98,   103,     0,     0,
+      82,    61,     0,     0,     0,   100,     0,     0,     0,    19,
+       0,    19,   141,     0,    43,   140,    19,   125,   124,   127,
+     123,   131,   240,   227,   138,   135,     0,   136,   159,     0,
+     307,     0,   164,   155,   180,     0,   173,   236,     0,   169,
+     175,     0,   171,   251,   252,   167,     0,    68,    21,    45,
+       0,     0,     0,   313,     0,   312,     0,     0,     0,    55,
+       0,     0,    96,    96,     0,     0,    22,    25,    24,    65,
+      19,    19,    19,    21,   126,     0,    19,   308,   281,   178,
+     172,   156,     0,    19,    70,   302,    19,    19,   310,     0,
+       0,     0,    19,    99,     0,     0,     0,     0,    50,    51,
+       0,     0,     0,    21,     0,   144,    41,   143,   137,     0,
+      19,     0,    19,     0,     0,    89,    48,    49,   311,     0,
+       0,     0,    64,     0,     0,    19,    19,    19,    26,    94,
+      47,    39,   142,   145,    30,     0,    69,     0,    90,     0,
+       0,    19,    19,    56,     0,    60,    54,    53,     0,     0,
+      66,     0,    19,    31,    71,     0,     0,    58,    63,    96,
+      19,    27,    95,    20,    19,    78,    77,     0,    19,     0,
+      62,     0,    19,    59,     0,    79,    91,     0,    57
 };
 
   /* YYPGOTO[NTERM-NUM].  */
 static const yytype_int16 yypgoto[] =
 {
-    -498,  -498,  -498,  -498,  -498,  -498,  -498,  -498,  -498,   -11,
-       5,  -498,    77,   -56,  -498,   -15,  -498,   572,   474,     6,
-    -498,  -498,  -498,  -498,  -498,  -498,  -498,  -498,  -498,  -498,
-    -498,   137,  -360,  -497,  -237,  -498,  -487,  -498,    54,   237,
-    -310,    -6,  -498,    71,   259,  -498,   240,   170,  -264,   309,
-     345,  -498,  -498,   221,  -498,   226,  -498,  -498,  -498,  -498,
-     135,  -498,  -498,    93,  -498,   122,    73,   -32,  -498,  -498,
-    -498,  -498,  -498,  -498,  -498,  -498,  -498,  -498,  -498,  -498,
-     570,  -498,  -498,   457,  -129,    -9,  -498,  -498,  -498,  -498,
-     250,  -498,  -498,   385,    51,   -42,   -24,  -498,  -498,  -498,
-    -498,  -498,    36
+    -551,  -551,  -551,  -551,  -551,  -551,  -551,  -551,  -551,  -551,
+      -4,   -10,  -551,    50,   -55,  -551,  -551,  -551,  -551,   -13,
+    -551,   568,   466,    28,  -551,  -551,  -551,  -551,  -551,  -551,
+    -551,  -551,  -551,  -551,  -551,  -551,    52,  -390,  -550,  -533,
+    -551,  -534,  -551,    14,   193,  -220,   -61,  -551,   -96,   137,
+    -551,  -551,   -17,   102,  -146,   311,   328,  -551,  -551,   186,
+    -551,   179,  -551,  -551,  -551,  -551,    97,  -551,    30,   184,
+    -551,  -293,    16,   -47,  -551,  -551,  -551,  -551,  -551,  -551,
+    -551,  -551,  -551,  -551,  -551,  -551,   610,  -551,  -551,   489,
+    -551,  -551,  -551,  -551,  -126,   -14,  -551,  -551,  -551,  -551,
+     223,  -551,  -551,   382,    36,   -19,   -15,  -551,  -551,  -551,
+    -551,  -551,    56
 };
 
   /* YYDEFGOTO[NTERM-NUM].  */
 static const yytype_int16 yydefgoto[] =
 {
-      -1,     8,     9,    10,    11,    12,    13,    14,    15,   105,
-     239,   428,   389,   235,   368,   114,   567,   250,   111,   112,
-     429,   430,   349,   533,   587,   502,   507,   579,   522,   582,
-     593,   371,   107,   553,   240,   604,   524,   446,   434,   373,
-     437,   448,   345,   221,   136,   217,   158,   270,   273,   292,
-     380,   255,   256,   458,   257,   258,   259,   260,   470,   471,
-     115,   116,   544,   467,   520,   390,   108,    61,    62,   386,
-     331,    63,    64,    65,    66,    67,    68,    69,    70,    71,
-      72,   132,    73,   162,   149,    74,   464,   441,   495,   496,
-     357,   358,   229,    75,    76,    77,    78,    79,    80,    81,
-      82,    83,   124
+      -1,     8,     9,    10,    11,    12,    13,    14,    15,   110,
+     111,   120,   472,   433,   256,   407,   559,   590,   638,   121,
+     625,   276,   118,   119,   501,   506,   411,   409,   583,   649,
+     550,   591,   573,   602,   643,   656,   414,   113,   606,   265,
+     640,   586,   487,   494,   418,   478,   489,   383,   258,   147,
+     149,   236,   174,   300,   303,   297,   423,   281,   282,   509,
+     283,   284,   285,   286,   516,   517,   122,   123,   504,   505,
+     596,   434,   114,    62,    63,   439,   369,    64,    65,    66,
+      67,    68,    69,    70,    71,    72,    73,   152,    74,   140,
+     239,   388,   115,   540,   167,    75,   521,   482,   543,   544,
+     394,   395,   248,    76,    77,    78,    79,    80,    81,    82,
+      83,    84,   131
 };
 
   /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM.  If
@@ -597,859 +382,952 @@ static const yytype_int16 yydefgoto[] =
      number is the opposite.  If YYTABLE_NINF, syntax error.  */
 static const yytype_int16 yytable[] =
 {
-      85,   262,   117,   445,    20,   525,   387,   120,   164,   120,
-     123,   120,   148,   120,   120,    59,   120,   120,   106,   113,
-     167,   178,   113,   179,    59,    20,   165,    84,   293,   282,
-     554,   431,   144,   120,   120,   153,   385,    16,   155,   404,
-     580,   420,   432,   439,   142,   422,   133,   581,   237,   147,
-     134,   251,    59,   447,   122,   252,   452,   453,   126,   253,
-     128,   129,   402,   130,   131,   140,    20,   424,   141,   121,
-      22,   121,   177,   121,    24,   121,   121,   143,   121,   121,
-     151,   152,   474,    60,   183,   226,    17,   175,   176,   209,
-     233,   210,    60,  -266,   403,   150,   121,   186,   148,   479,
-     596,   163,   440,   606,   419,  -299,   514,   175,   176,   208,
-     175,   176,   175,   176,   227,   249,   175,   176,   287,   280,
-      60,   254,   215,   228,   180,   267,   148,  -265,  -295,   177,
-    -295,   174,   120,   277,   278,   147,   288,   462,   175,   176,
-     222,   503,   269,   272,   175,   176,   421,    59,    59,   230,
-    -297,   220,  -297,   175,   176,   160,  -267,   175,   176,   321,
-     322,   216,   323,   147,   161,   324,   488,   175,   176,   325,
-     175,   176,   294,   326,   327,   423,   328,   175,   176,   279,
-     425,   156,   209,   223,   210,   361,   157,   236,   530,   531,
-     242,   243,   244,   245,   150,  -269,   478,   246,    18,   247,
-    -295,   342,  -295,   362,    20,  -297,   265,  -297,    22,   175,
-     176,   286,    24,   224,   276,    60,    60,  -268,   181,   182,
-     329,   113,   344,   518,   561,    84,   225,   370,   175,   176,
-      20,   211,   384,   212,   290,   213,   445,   214,   175,   176,
-     118,   175,   176,   175,   176,   119,   573,   231,   295,   296,
-     232,   298,   299,   301,   383,   234,   -91,   465,   332,   175,
-     176,   238,   583,   330,   356,   241,   175,   176,    59,   391,
-     175,   176,   184,   185,   261,   272,   175,   176,   360,   550,
-     551,   334,   335,   336,   337,   338,   339,   340,   341,   346,
-     347,   263,   188,   189,   399,   559,   137,   138,   405,   350,
-     351,   352,   353,   355,   418,   363,   364,   188,   366,   367,
-     264,   569,   570,   120,   266,   372,   374,   372,   372,   372,
-     372,   268,   361,   201,   202,   578,   271,   175,   176,   203,
-     218,   219,   204,   205,   206,   207,    60,   585,   586,   202,
-     362,   175,   176,   274,   203,   281,   291,   204,   205,   206,
-     207,   597,   394,   454,   148,   472,   397,   343,   601,   175,
-     176,   523,  -300,  -300,  -300,   207,   401,   293,   444,   473,
-     188,   189,    20,   113,   348,   121,    22,   188,   189,   365,
-      24,   375,   376,   377,   378,   457,   457,   480,   354,   463,
-     379,   147,   369,   382,   469,   408,   409,   197,   198,   199,
-     200,   201,   202,   416,   388,   395,   442,   203,   481,   202,
-     204,   205,   206,   207,   203,   360,   392,   204,   205,   206,
-     207,   400,    59,   435,   374,   438,   438,   393,   402,   176,
-     188,   189,   407,   411,   269,   272,   449,   526,   527,   438,
-     438,   412,   451,   413,   532,   202,   414,   427,   536,   537,
-     203,   417,   433,   204,   205,   206,   207,   456,   148,   199,
-     200,   201,   202,   443,   466,   455,   461,   203,   548,   549,
-     204,   205,   206,   207,   468,   475,   476,   482,   483,   562,
-       1,     2,     3,     4,     5,     6,     7,   484,   485,   490,
-      60,   497,   272,   491,   571,   147,   539,   492,   541,   493,
-     494,   574,   575,    20,   486,   498,   203,   546,   489,   204,
-     205,   206,   207,   188,   189,   500,   113,   501,   113,   504,
-     499,   588,   505,   510,   438,   511,   513,   113,   595,   515,
-     516,   552,   552,   598,   528,   509,   529,   535,   600,   196,
-     197,   198,   199,   200,   201,   202,   517,   566,   519,   534,
-     203,   609,   540,   204,   205,   206,   207,   543,   542,   242,
-     243,   244,   245,   547,   556,   557,   246,   558,   247,   572,
-     576,   438,   438,   577,   584,   589,   599,   590,   591,   555,
-     594,   603,   607,   248,   538,   110,   592,   560,   436,   563,
-     602,   125,   608,   127,   398,   466,   113,   175,   176,   487,
-     381,   444,   459,   512,   135,   552,   435,   438,   460,   139,
-     521,   545,   359,   145,   450,     0,   154,   285,     0,   159,
-       0,   166,     0,   168,   169,   170,   171,   172,     0,   438,
-     -13,    86,     0,    84,     0,     0,     0,     0,    20,     0,
-      18,    84,     0,    19,     0,   438,    20,   410,   118,    21,
-      22,    23,    87,   119,    24,    25,    26,    27,    28,    29,
-      30,     0,    31,    32,    33,    34,    35,    36,    88,   109,
-      89,    90,    91,    37,    38,    92,    93,    94,    95,    96,
-      97,     0,     0,     0,    98,    99,   100,   101,   102,     0,
-       0,    39,     0,   103,    40,    41,    42,    43,    44,     0,
-       0,    45,    46,    47,    48,    49,    50,    51,     0,     0,
-       0,     0,     0,   104,     0,     0,     0,    52,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     284,     0,    53,    54,     0,    55,     0,    56,    57,     0,
-       0,     0,     0,     0,    58,     0,     0,   297,     0,     0,
-       0,     0,     0,   302,     0,     0,   303,   304,   305,   306,
-     307,   308,   309,   310,   311,   312,   313,   314,   315,   316,
-     317,   318,   319,   320,    -3,    86,     0,     0,     0,     0,
-       0,     0,     0,     0,    18,    84,     0,    19,     0,     0,
-      20,     0,     0,    21,    22,    23,    87,     0,    24,    25,
-      26,    27,    28,    29,    30,     0,    31,    32,    33,    34,
-      35,    36,    88,   109,    89,    90,    91,    37,    38,    92,
-      93,    94,    95,    96,    97,     0,     0,     0,    98,    99,
-     100,   101,   102,     0,     0,    39,     0,   103,    40,    41,
-      42,    43,    44,     0,     0,    45,    46,    47,    48,    49,
-      50,    51,     0,     0,     0,     0,     0,   104,     0,     0,
-       0,    52,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,    53,    54,     0,    55,
-      86,    56,    57,     0,     0,     0,     0,     0,    58,    18,
-      84,   426,    19,     0,     0,    20,     0,     0,    21,    22,
-      23,    87,     0,    24,    25,    26,    27,    28,    29,    30,
-       0,    31,    32,    33,    34,    35,    36,    88,   109,    89,
-      90,    91,    37,    38,    92,    93,    94,    95,    96,    97,
-       0,     0,     0,    98,    99,   100,   101,   102,     0,     0,
-      39,     0,   103,    40,    41,    42,    43,    44,     0,     0,
-      45,    46,    47,    48,    49,    50,    51,     0,     0,     0,
-       0,     0,   104,     0,     0,     0,    52,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   477,     0,     0,     0,
-       0,    53,    54,     0,    55,     0,    56,    57,     0,     0,
-       0,     0,     0,    58,     0,     0,    86,     0,     0,     0,
-       0,     0,     0,     0,     0,    18,    84,   506,    19,     0,
-       0,    20,     0,     0,    21,    22,    23,    87,     0,    24,
-      25,    26,    27,    28,    29,    30,   508,    31,    32,    33,
-      34,    35,    36,    88,   109,    89,    90,    91,    37,    38,
-      92,    93,    94,    95,    96,    97,     0,     0,     0,    98,
-      99,   100,   101,   102,     0,     0,    39,     0,   103,    40,
-      41,    42,    43,    44,     0,     0,    45,    46,    47,    48,
-      49,    50,    51,     0,     0,     0,     0,     0,   104,     0,
-       0,     0,    52,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,    86,     0,    53,    54,     0,
-      55,     0,    56,    57,    18,    84,   564,    19,     0,    58,
-      20,     0,     0,    21,    22,    23,    87,     0,    24,    25,
-      26,    27,    28,    29,    30,     0,    31,    32,    33,    34,
-      35,    36,    88,   109,    89,    90,    91,    37,    38,    92,
-      93,    94,    95,    96,    97,     0,     0,     0,    98,    99,
-     100,   101,   102,     0,     0,    39,     0,   103,    40,    41,
-      42,    43,    44,     0,     0,    45,    46,    47,    48,    49,
-      50,    51,     0,     0,     0,     0,     0,   104,     0,     0,
-       0,    52,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,    86,     0,    53,    54,     0,    55,
-       0,    56,    57,    18,    84,   565,    19,     0,    58,    20,
-       0,     0,    21,    22,    23,    87,     0,    24,    25,    26,
-      27,    28,    29,    30,     0,    31,    32,    33,    34,    35,
-      36,    88,   109,    89,    90,    91,    37,    38,    92,    93,
-      94,    95,    96,    97,     0,     0,     0,    98,    99,   100,
-     101,   102,     0,     0,    39,     0,   103,    40,    41,    42,
-      43,    44,     0,     0,    45,    46,    47,    48,    49,    50,
-      51,     0,     0,     0,     0,     0,   104,     0,     0,     0,
-      52,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,    86,     0,    53,    54,     0,    55,     0,
-      56,    57,    18,    84,   568,    19,     0,    58,    20,     0,
-       0,    21,    22,    23,    87,     0,    24,    25,    26,    27,
-      28,    29,    30,     0,    31,    32,    33,    34,    35,    36,
-      88,   109,    89,    90,    91,    37,    38,    92,    93,    94,
-      95,    96,    97,     0,     0,     0,    98,    99,   100,   101,
-     102,     0,     0,    39,     0,   103,    40,    41,    42,    43,
-      44,     0,     0,    45,    46,    47,    48,    49,    50,    51,
-       0,     0,     0,     0,     0,   104,     0,     0,     0,    52,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,    86,     0,    53,    54,     0,    55,     0,    56,
-      57,    18,    84,     0,    19,     0,    58,    20,     0,     0,
-      21,    22,    23,    87,     0,    24,    25,    26,    27,    28,
-      29,    30,     0,    31,    32,    33,    34,    35,    36,    88,
-     109,    89,    90,    91,    37,    38,    92,    93,    94,    95,
-      96,    97,     0,     0,     0,    98,    99,   100,   101,   102,
-       0,     0,    39,     0,   103,    40,    41,    42,    43,    44,
-       0,     0,    45,    46,    47,    48,    49,    50,    51,     0,
-       0,   605,     0,     0,   104,     0,     0,     0,    52,     0,
+      60,   320,   166,   304,   124,   130,   175,    86,   142,    60,
+     486,   435,   143,   261,   127,   188,   127,   189,   127,   587,
+     127,   127,    20,   160,   305,   145,    61,   607,    20,    20,
+     127,   127,    22,   172,    16,    61,    24,   171,   173,   165,
+     112,    60,   641,   245,   162,   127,   127,   257,   319,   612,
+     446,   228,    85,   229,   128,   153,   128,    85,   128,    17,
+     128,   128,    20,   141,   154,   473,   161,    61,   191,   192,
+     128,   128,  -290,   241,   129,   182,   474,   242,   133,   642,
+     135,   136,   635,   636,   637,   168,   128,   259,   447,   158,
+     150,   151,   159,   262,   359,   360,   254,   361,   647,   648,
+     362,   264,   125,   166,   363,   169,   170,   126,   364,   365,
+     438,   463,   666,   280,   448,   659,   187,   660,   187,   292,
+     193,  -289,   317,   293,  -291,   663,   519,   166,   240,   464,
+     196,   249,   138,   246,   190,   235,   481,   299,   302,   302,
+     165,   366,   139,   247,   275,    20,   314,   315,   227,    22,
+      60,    60,   310,    24,   431,   295,   466,   127,   183,   184,
+     185,   186,  -332,   410,   165,   367,   412,   538,   148,   308,
+     480,   194,   195,   468,   291,   313,    61,    61,   539,   156,
+     488,   183,   184,   185,   186,   496,   497,   524,   183,   184,
+     185,   186,   183,   184,   185,   186,   228,   168,   229,   322,
+     323,   324,   325,   234,   327,   328,   330,   183,   184,   185,
+     186,  -328,   243,  -328,   368,   267,   237,   316,   268,   269,
+     270,   271,   380,  -330,   272,  -330,   382,   398,   529,   387,
+     230,   399,   231,   238,   183,   184,   185,   186,   569,   475,
+     232,   244,   233,   372,   373,   374,   375,   376,   377,   378,
+     379,   183,   184,   185,   186,   185,   186,   250,   465,   413,
+     437,  -328,   370,  -328,   251,   183,   184,   185,   186,   486,
+     597,   467,   551,  -336,   226,   183,   184,   185,   186,   469,
+     603,   604,   397,   415,   415,   415,   419,   415,   415,  -330,
+     302,  -330,   436,   389,   390,   392,    60,   400,   401,   528,
+     403,   404,   405,   406,   427,   252,   183,   184,   185,   186,
+     253,   255,  -102,   522,   260,   263,   183,   184,   185,   186,
+     416,   417,    61,   420,   421,   266,   580,   581,   183,   184,
+     185,   186,   443,    85,  -293,   273,   445,   287,    20,   296,
+     298,   183,   184,   185,   186,   301,   306,   454,   318,   183,
+     184,   185,   186,   307,   183,   184,   185,   186,   127,   309,
+     563,   311,  -292,   320,   614,   183,   184,   185,   186,   183,
+     184,   185,   186,   386,   381,   302,   452,   453,   125,   391,
+     384,   385,   398,   126,   460,   408,   399,   425,   402,   630,
+     485,   321,   166,   422,   498,   198,   199,   200,   128,   430,
+     277,   432,   429,   441,   278,   479,   479,   198,   279,   645,
+     444,   442,   446,   508,   508,   593,   490,   451,   455,   419,
+     495,   479,   479,   515,   461,   456,   457,   520,   483,   165,
+     217,   218,   219,   220,   592,   458,   471,   397,   221,   476,
+     477,   222,   223,   224,   225,   226,   484,   531,   502,   507,
+     221,    60,   492,   222,   223,   224,   225,   226,   499,   500,
+     514,   503,   525,   518,   267,   526,   532,   268,   269,   270,
+     271,    20,   533,   272,   534,   535,   541,    61,   542,   549,
+     548,   503,   183,   184,   185,   186,   576,   577,   546,   558,
+     552,   299,   553,   582,   554,   555,   302,   557,   560,   588,
+     589,   562,   566,   183,   184,   185,   186,   568,   479,   183,
+     184,   185,   186,   166,   570,   571,   572,   545,   578,   440,
+     579,   536,   600,   537,   183,   184,   185,   186,   595,   620,
+     615,   616,   617,   585,   547,   567,   619,   198,   199,   200,
+     449,   183,   184,   185,   186,   584,   462,   633,   628,   594,
+     165,   302,   598,   599,   609,   631,   632,   610,   611,   634,
+     601,   629,   479,   479,   639,   653,   605,   605,   646,   651,
+     198,   654,   264,   218,   219,   220,   657,   667,   512,   650,
+     221,   117,   274,   222,   223,   224,   225,   226,   574,   627,
+     624,   658,   183,   184,   185,   186,   493,   613,   664,   495,
+     479,   428,   662,   561,   511,   264,   264,   264,   220,   424,
+     510,   565,   668,   221,   608,   513,   222,   223,   224,   225,
+     226,   264,   264,   621,   491,   479,   618,   290,   396,   523,
+       0,   132,   655,   134,     0,   652,   137,     0,   144,   146,
+     264,   661,     0,   503,     0,   479,     0,     0,   264,   485,
+       0,   155,   605,     0,   157,     0,     0,     0,   163,     0,
+     -13,    87,     0,     0,   176,   177,   178,   179,   180,     0,
+      18,    85,     0,    19,     0,     0,    20,     0,     0,    21,
+      22,    23,    88,     0,    24,    25,    89,    90,    91,    26,
+      27,    92,    93,     0,     0,    94,    95,    96,    97,     0,
+      98,    99,   100,   101,     0,     0,   102,    28,    29,   103,
+     104,   105,    30,    31,   106,    32,    33,    34,    35,    36,
+      37,     0,    38,    39,    40,    41,    42,    43,   107,   116,
+      44,     0,   108,    45,    46,    47,    48,    49,     0,     0,
+       0,    50,    51,    52,   183,   184,   185,   186,   289,   109,
+       0,    18,     0,     0,     0,     0,    53,    20,     0,     0,
+       0,    22,     0,     0,     0,    24,  -336,  -336,  -336,   225,
+     226,   393,   183,   184,   185,   186,     0,    54,    55,     0,
+      56,   530,    57,    58,     0,     0,     0,     0,     0,     0,
+      59,     0,     0,     0,     0,     0,     0,   326,     0,     0,
+       0,     0,     0,   331,     0,     0,   332,   333,   334,   335,
+     336,   337,   338,   339,   340,   341,   342,   343,   344,   345,
+     346,   347,   348,   349,   350,   351,   352,   353,   354,   355,
+     356,   357,    -3,    87,     0,   358,     0,     0,     0,     0,
+       0,     0,    18,    85,     0,    19,     0,     0,    20,     0,
+       0,    21,    22,    23,    88,     0,    24,    25,    89,    90,
+      91,    26,    27,    92,    93,     0,     0,    94,    95,    96,
+      97,     0,    98,    99,   100,   101,     0,     0,   102,    28,
+      29,   103,   104,   105,    30,    31,   106,    32,    33,    34,
+      35,    36,    37,     0,    38,    39,    40,    41,    42,    43,
+     107,   116,    44,     0,   108,    45,    46,    47,    48,    49,
+       0,     0,     0,    50,    51,    52,     0,     0,     0,     0,
+       0,   109,     0,     0,     0,     0,     0,     0,    53,     1,
+       2,     3,     4,     5,     6,     7,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,    87,    54,
+      55,     0,    56,     0,    57,    58,     0,    18,    85,   470,
+      19,     0,    59,    20,     0,     0,    21,    22,    23,    88,
+       0,    24,    25,    89,    90,    91,    26,    27,    92,    93,
+       0,     0,    94,    95,    96,    97,     0,    98,    99,   100,
+     101,     0,     0,   102,    28,    29,   103,   104,   105,    30,
+      31,   106,    32,    33,    34,    35,    36,    37,     0,    38,
+      39,    40,    41,    42,    43,   107,   116,    44,     0,   108,
+      45,    46,    47,    48,    49,     0,     0,     0,    50,    51,
+      52,     0,     0,     0,     0,     0,   109,     0,     0,     0,
+       0,     0,     0,    53,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,    86,     0,    53,    54,     0,    55,     0,    56,    57,
-      18,    84,     0,    19,     0,    58,    20,     0,     0,    21,
-      22,    23,    87,     0,    24,    25,    26,    27,    28,    29,
-      30,     0,    31,    32,    33,    34,    35,    36,    88,   109,
-      89,    90,    91,    37,    38,    92,    93,    94,    95,    96,
-      97,     0,     0,     0,    98,    99,   100,   101,   102,     0,
-       0,    39,     0,   103,    40,    41,    42,    43,    44,     0,
-       0,    45,    46,    47,    48,    49,    50,    51,     0,     0,
-       0,     0,     0,   104,     0,     0,     0,    52,     0,     0,
+     527,     0,     0,     0,    54,    55,     0,    56,     0,    57,
+      58,     0,     0,    87,     0,     0,     0,    59,     0,     0,
+       0,     0,    18,    85,   556,    19,     0,     0,    20,     0,
+       0,    21,    22,    23,    88,     0,    24,    25,    89,    90,
+      91,    26,    27,    92,    93,     0,     0,    94,    95,    96,
+      97,     0,    98,    99,   100,   101,     0,   564,   102,    28,
+      29,   103,   104,   105,    30,    31,   106,    32,    33,    34,
+      35,    36,    37,     0,    38,    39,    40,    41,    42,    43,
+     107,   116,    44,     0,   108,    45,    46,    47,    48,    49,
+     575,     0,     0,    50,    51,    52,     0,     0,     0,     0,
+       0,   109,     0,     0,     0,     0,     0,     0,    53,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-      86,     0,    53,    54,     0,    55,     0,    56,    57,    18,
-      84,     0,    19,     0,    58,    20,     0,     0,    21,    22,
-      23,    87,     0,    24,    25,    26,    27,    28,    29,    30,
-       0,    31,    32,    33,    34,    35,    36,    88,     0,    89,
-      90,    91,    37,    38,    92,    93,    94,    95,    96,    97,
-       0,     0,     0,    98,    99,   100,   101,   102,     0,     0,
-      39,     0,   103,    40,    41,    42,    43,    44,     0,     0,
-      45,    46,    47,    48,    49,    50,    51,     0,     0,     0,
-       0,     0,   104,     0,     0,     0,    52,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,    86,     0,     0,     0,
-       0,    53,    54,     0,    55,    18,    56,    57,    19,     0,
-       0,    20,     0,    58,    21,    22,    23,   -17,     0,    24,
-      25,    26,    27,    28,    29,    30,     0,    31,    32,    33,
-      34,    35,    36,     0,     0,     0,     0,     0,    37,    38,
-       0,     0,     0,     0,     0,     0,     0,     0,   188,   189,
-       0,     0,     0,     0,     0,     0,    39,     0,     0,    40,
-      41,    42,    43,    44,     0,     0,    45,    46,    47,    48,
-      49,    50,    51,   195,   196,   197,   198,   199,   200,   201,
-     202,     0,    52,     0,     0,   203,     0,     0,   204,   205,
-     206,   207,    86,     0,     0,     0,     0,    53,    54,     0,
-      55,    18,    56,    57,    19,     0,     0,    20,     0,    58,
-      21,    22,    23,     0,     0,    24,    25,    26,    27,    28,
-      29,    30,     0,    31,    32,    33,    34,    35,    36,     0,
-       0,     0,     0,     0,    37,    38,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,    87,    54,
+      55,     0,    56,     0,    57,    58,     0,    18,    85,   622,
+      19,     0,    59,    20,     0,     0,    21,    22,    23,    88,
+       0,    24,    25,    89,    90,    91,    26,    27,    92,    93,
+       0,     0,    94,    95,    96,    97,     0,    98,    99,   100,
+     101,     0,     0,   102,    28,    29,   103,   104,   105,    30,
+      31,   106,    32,    33,    34,    35,    36,    37,     0,    38,
+      39,    40,    41,    42,    43,   107,   116,    44,     0,   108,
+      45,    46,    47,    48,    49,     0,     0,     0,    50,    51,
+      52,     0,     0,     0,     0,     0,   109,     0,     0,     0,
+       0,     0,     0,    53,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,    39,     0,     0,    40,    41,    42,    43,    44,
-    -219,     0,    45,    46,    47,    48,    49,    50,    51,     0,
-       0,   209,     0,   210,  -219,  -219,     0,     0,    52,     0,
-       0,     0,  -219,  -219,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,    53,    54,     0,    55,     0,    56,    57,
-       0,     0,     0,     0,   -17,    58,     0,  -219,  -219,  -219,
-    -219,     0,     0,     0,  -219,     0,  -219,     0,     0,     0,
-       0,     0,  -219,     0,     0,     0,     0,     0,     0,  -219,
-    -219,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,  -219,     0,     0,  -219,  -219,     0,  -219,  -219,
-    -219,  -219,  -219,  -219,  -219,  -219,  -219,  -219,  -219,  -219,
-    -219,  -219,  -258,   188,   189,     0,  -219,     0,     0,  -219,
-    -219,  -219,  -219,  -219,     0,     0,  -258,  -258,     0,     0,
-       0,     0,     0,     0,  -258,  -258,     0,   194,   195,   196,
-     197,   198,   199,   200,   201,   202,     0,     0,     0,     0,
-     203,     0,     0,   204,   205,   206,   207,     0,     0,  -258,
-    -258,  -258,  -258,     0,     0,     0,  -258,     0,  -258,     0,
-       0,     0,     0,     0,  -258,     0,     0,     0,     0,     0,
-       0,  -258,  -258,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,  -258,     0,     0,  -258,  -258,     0,
-    -258,  -258,  -258,  -258,  -258,  -258,  -258,  -258,  -258,  -258,
-    -258,  -258,  -258,  -258,     0,     0,     0,     0,  -258,     0,
-       0,  -258,  -258,  -258,  -258,  -258,    18,    84,     0,    19,
-       0,     0,    20,     0,     0,    21,    22,    23,     0,     0,
-      24,    25,   146,    27,    28,    29,    30,   119,    31,    32,
-      33,    34,    35,    36,     0,     0,     0,     0,     0,    37,
-      38,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,    39,     0,     0,
-      40,    41,    42,    43,    44,     0,     0,    45,    46,    47,
-      48,    49,    50,    51,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,    52,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,    53,    54,
-       0,    55,     0,    56,    57,    18,    84,     0,    19,     0,
-      58,    20,     0,     0,    21,    22,    23,     0,     0,    24,
-      25,    26,    27,    28,    29,    30,     0,    31,    32,    33,
-      34,    35,    36,     0,     0,     0,     0,     0,    37,    38,
+       0,     0,     0,    87,    54,    55,     0,    56,     0,    57,
+      58,     0,    18,    85,   623,    19,     0,    59,    20,     0,
+       0,    21,    22,    23,    88,     0,    24,    25,    89,    90,
+      91,    26,    27,    92,    93,     0,     0,    94,    95,    96,
+      97,     0,    98,    99,   100,   101,     0,     0,   102,    28,
+      29,   103,   104,   105,    30,    31,   106,    32,    33,    34,
+      35,    36,    37,     0,    38,    39,    40,    41,    42,    43,
+     107,   116,    44,     0,   108,    45,    46,    47,    48,    49,
+       0,     0,     0,    50,    51,    52,     0,     0,     0,     0,
+       0,   109,     0,     0,     0,     0,     0,     0,    53,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,    39,     0,     0,    40,
-      41,    42,    43,    44,     0,     0,    45,    46,    47,    48,
-      49,    50,    51,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,    52,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,    53,    54,     0,
-      55,    18,    56,    57,    19,     0,     0,    20,     0,    58,
-      21,    22,    23,     0,     0,    24,    25,    26,    27,    28,
-      29,    30,     0,    31,    32,    33,    34,    35,    36,     0,
-       0,     0,     0,     0,    37,    38,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,    87,    54,
+      55,     0,    56,     0,    57,    58,     0,    18,    85,   626,
+      19,     0,    59,    20,     0,     0,    21,    22,    23,    88,
+       0,    24,    25,    89,    90,    91,    26,    27,    92,    93,
+       0,     0,    94,    95,    96,    97,     0,    98,    99,   100,
+     101,     0,     0,   102,    28,    29,   103,   104,   105,    30,
+      31,   106,    32,    33,    34,    35,    36,    37,     0,    38,
+      39,    40,    41,    42,    43,   107,   116,    44,     0,   108,
+      45,    46,    47,    48,    49,     0,     0,     0,    50,    51,
+      52,     0,     0,     0,     0,     0,   109,     0,     0,     0,
+       0,     0,     0,    53,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,    39,     0,     0,    40,    41,    42,    43,    44,
-       0,     0,    45,    46,    47,    48,    49,    50,    51,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,    52,     0,
+       0,     0,     0,    87,    54,    55,     0,    56,     0,    57,
+      58,     0,    18,    85,   644,    19,     0,    59,    20,     0,
+       0,    21,    22,    23,    88,     0,    24,    25,    89,    90,
+      91,    26,    27,    92,    93,     0,     0,    94,    95,    96,
+      97,     0,    98,    99,   100,   101,     0,     0,   102,    28,
+      29,   103,   104,   105,    30,    31,   106,    32,    33,    34,
+      35,    36,    37,     0,    38,    39,    40,    41,    42,    43,
+     107,   116,    44,     0,   108,    45,    46,    47,    48,    49,
+       0,     0,     0,    50,    51,    52,     0,     0,     0,     0,
+       0,   109,     0,     0,     0,     0,     0,     0,    53,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,    53,    54,     0,    55,    18,    56,    57,
-      19,     0,     0,    20,   173,    58,    21,    22,    23,     0,
-       0,    24,    25,    26,    27,    28,    29,    30,     0,    31,
-      32,    33,    34,    35,    36,     0,     0,     0,     0,     0,
-      37,    38,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,    39,     0,
-       0,    40,    41,    42,    43,    44,     0,     0,    45,    46,
-      47,    48,    49,    50,    51,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,    52,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,    53,
-      54,     0,    55,    18,    56,    57,    19,     0,     0,    20,
-     275,    58,    21,    22,    23,     0,     0,    24,    25,    26,
-      27,    28,    29,    30,     0,    31,    32,    33,    34,    35,
-      36,     0,     0,     0,     0,     0,    37,    38,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,    87,    54,
+      55,     0,    56,     0,    57,    58,     0,    18,    85,     0,
+      19,     0,    59,    20,     0,     0,    21,    22,    23,    88,
+       0,    24,    25,    89,    90,    91,    26,    27,    92,    93,
+       0,     0,    94,    95,    96,    97,     0,    98,    99,   100,
+     101,     0,     0,   102,    28,    29,   103,   104,   105,    30,
+      31,   106,    32,    33,    34,    35,    36,    37,     0,    38,
+      39,    40,    41,    42,    43,   107,   116,    44,     0,   108,
+      45,    46,    47,    48,    49,     0,     0,     0,    50,    51,
+      52,     0,     0,   665,     0,     0,   109,     0,     0,     0,
+       0,     0,     0,    53,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,    39,     0,     0,    40,    41,    42,
-      43,    44,     0,     0,    45,    46,    47,    48,    49,    50,
-      51,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-      52,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,    53,    54,     0,    55,    18,
-      56,    57,    19,     0,     0,    20,   289,    58,    21,    22,
-      23,     0,     0,    24,    25,    26,    27,    28,    29,    30,
-       0,    31,    32,    33,    34,    35,    36,     0,     0,     0,
-       0,     0,    37,    38,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,    87,    54,    55,     0,    56,     0,    57,
+      58,     0,    18,    85,     0,    19,     0,    59,    20,     0,
+       0,    21,    22,    23,    88,     0,    24,    25,    89,    90,
+      91,    26,    27,    92,    93,     0,     0,    94,    95,    96,
+      97,     0,    98,    99,   100,   101,     0,     0,   102,    28,
+      29,   103,   104,   105,    30,    31,   106,    32,    33,    34,
+      35,    36,    37,     0,    38,    39,    40,    41,    42,    43,
+     107,   116,    44,     0,   108,    45,    46,    47,    48,    49,
+       0,     0,     0,    50,    51,    52,     0,     0,     0,     0,
+       0,   109,     0,     0,     0,     0,     0,     0,    53,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-      39,     0,     0,    40,    41,    42,    43,    44,     0,     0,
-      45,    46,    47,    48,    49,    50,    51,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,    52,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,    87,    54,
+      55,     0,    56,     0,    57,    58,     0,    18,    85,     0,
+      19,     0,    59,    20,     0,     0,    21,    22,    23,    88,
+       0,    24,    25,    89,    90,    91,    26,    27,    92,    93,
+       0,     0,    94,    95,    96,    97,     0,    98,    99,   100,
+     101,     0,     0,   102,    28,    29,   103,   104,   105,    30,
+      31,   106,    32,    33,    34,    35,    36,    37,     0,    38,
+      39,    40,    41,    42,    43,   107,     0,    44,     0,   108,
+      45,    46,    47,    48,    49,     0,     0,     0,    50,    51,
+      52,     0,    87,     0,     0,     0,   109,     0,     0,     0,
+       0,    18,     0,    53,    19,     0,     0,    20,     0,     0,
+      21,    22,    23,   -19,     0,    24,    25,     0,     0,     0,
+      26,    27,     0,     0,    54,    55,     0,    56,     0,    57,
+      58,     0,     0,     0,     0,     0,     0,    59,    28,    29,
+       0,     0,     0,    30,    31,     0,    32,    33,    34,    35,
+      36,    37,     0,    38,    39,    40,    41,    42,    43,     0,
+       0,    44,     0,     0,    45,    46,    47,    48,    49,     0,
+       0,    87,    50,    51,    52,     0,     0,     0,     0,     0,
+      18,     0,     0,    19,     0,     0,    20,    53,     0,    21,
+      22,    23,     0,     0,    24,    25,     0,     0,     0,    26,
+      27,     0,     0,     0,     0,     0,     0,     0,    54,    55,
+       0,    56,     0,    57,    58,     0,     0,    28,    29,     0,
+       0,    59,    30,    31,     0,    32,    33,    34,    35,    36,
+      37,     0,    38,    39,    40,    41,    42,    43,     0,     0,
+      44,     0,     0,    45,    46,    47,    48,    49,     0,     0,
+       0,    50,    51,    52,     0,     0,     0,     0,     0,    18,
+      85,     0,    19,     0,     0,    20,    53,     0,    21,    22,
+      23,     0,     0,    24,    25,     0,     0,     0,    26,    27,
+       0,     0,     0,     0,     0,     0,     0,    54,    55,     0,
+      56,     0,    57,    58,     0,     0,    28,    29,     0,   -19,
+      59,    30,    31,     0,    32,   164,    34,    35,    36,    37,
+     126,    38,    39,    40,    41,    42,    43,     0,     0,    44,
+       0,     0,    45,    46,    47,    48,    49,     0,     0,     0,
+      50,    51,    52,     0,     0,     0,     0,     0,    18,    85,
+       0,    19,     0,     0,    20,    53,     0,    21,    22,    23,
+       0,     0,    24,    25,     0,     0,     0,    26,    27,     0,
+       0,     0,     0,     0,     0,     0,    54,    55,     0,    56,
+       0,    57,    58,     0,     0,    28,    29,     0,     0,    59,
+      30,    31,     0,    32,    33,    34,    35,    36,    37,     0,
+      38,    39,    40,    41,    42,    43,     0,     0,    44,     0,
+       0,    45,    46,    47,    48,    49,     0,     0,     0,    50,
+      51,    52,     0,     0,     0,     0,     0,    18,     0,     0,
+      19,     0,     0,    20,    53,     0,    21,    22,    23,     0,
+       0,    24,    25,     0,     0,     0,    26,    27,     0,     0,
+       0,     0,     0,     0,     0,    54,    55,     0,    56,     0,
+      57,    58,     0,     0,    28,    29,     0,     0,    59,    30,
+      31,     0,    32,    33,    34,    35,    36,    37,     0,    38,
+      39,    40,    41,    42,    43,     0,     0,    44,     0,     0,
+      45,    46,    47,    48,    49,     0,     0,     0,    50,    51,
+      52,     0,     0,     0,     0,     0,    18,     0,     0,    19,
+       0,     0,    20,    53,     0,    21,    22,    23,     0,     0,
+      24,    25,     0,     0,     0,    26,    27,     0,     0,     0,
+       0,     0,     0,     0,    54,    55,     0,    56,     0,    57,
+      58,     0,     0,    28,    29,     0,   181,    59,    30,    31,
+       0,    32,    33,    34,    35,    36,    37,     0,    38,    39,
+      40,    41,    42,    43,     0,     0,    44,     0,     0,    45,
+      46,    47,    48,    49,     0,     0,     0,    50,    51,    52,
+       0,     0,     0,     0,     0,    18,     0,     0,    19,     0,
+       0,    20,    53,     0,    21,    22,    23,     0,     0,    24,
+      25,     0,     0,     0,    26,    27,     0,     0,     0,     0,
+       0,     0,     0,    54,    55,     0,    56,     0,    57,    58,
+       0,     0,    28,    29,     0,   294,    59,    30,    31,     0,
+      32,    33,    34,    35,    36,    37,     0,    38,    39,    40,
+      41,    42,    43,     0,     0,    44,     0,     0,    45,    46,
+      47,    48,    49,     0,     0,     0,    50,    51,    52,     0,
+       0,     0,     0,     0,  -335,   228,     0,   229,     0,     0,
+    -335,    53,     0,  -335,  -335,  -335,     0,     0,  -335,  -335,
+       0,     0,     0,  -335,  -335,     0,     0,     0,     0,     0,
+       0,     0,    54,    55,     0,    56,     0,    57,    58,     0,
+       0,  -335,  -335,     0,   312,    59,  -335,  -335,     0,  -335,
+    -335,  -335,  -335,  -335,  -335,     0,  -335,  -335,  -335,  -335,
+    -335,  -335,     0,     0,  -335,     0,     0,  -335,  -335,  -335,
+    -335,  -335,     0,     0,     0,  -335,  -335,  -335,     0,     0,
+       0,     0,     0,    18,     0,     0,    19,     0,     0,    20,
+    -335,     0,    21,    22,    23,     0,     0,    24,    25,     0,
+       0,     0,    26,    27,     0,     0,     0,     0,     0,     0,
+       0,  -335,  -335,     0,  -335,     0,  -335,  -335,     0,     0,
+      28,    29,     0,     0,  -335,    30,    31,     0,    32,    33,
+      34,    35,    36,    37,     0,    38,    39,    40,    41,    42,
+      43,     0,     0,    44,     0,     0,    45,    46,    47,    48,
+      49,     0,     0,     0,    50,    51,    52,     0,     0,     0,
+       0,     0,    18,     0,     0,    19,     0,     0,    20,    53,
+       0,    21,    22,    23,     0,     0,    24,    25,     0,     0,
+       0,    26,    27,     0,     0,     0,     0,     0,     0,     0,
+      54,    55,     0,    56,     0,    57,    58,     0,     0,    28,
+      29,     0,   329,    59,    30,    31,     0,    32,    33,    34,
+      35,    36,    37,     0,    38,    39,    40,    41,    42,    43,
+       0,     0,    44,     0,     0,    45,    46,    47,    48,    49,
+       0,     0,     0,    50,    51,    52,     0,     0,     0,     0,
+       0,    18,     0,     0,    19,     0,     0,    20,    53,     0,
+      21,    22,    23,     0,     0,    24,    25,     0,     0,     0,
+      26,    27,     0,     0,     0,     0,     0,     0,     0,    54,
+      55,     0,    56,     0,    57,    58,     0,     0,    28,    29,
+       0,   371,    59,    30,    31,     0,    32,    33,    34,    35,
+      36,    37,     0,    38,    39,    40,    41,    42,    43,     0,
+       0,    44,     0,     0,    45,    46,    47,    48,    49,     0,
+       0,     0,    50,    51,    52,     0,     0,     0,     0,     0,
+      18,     0,     0,    19,     0,     0,    20,    53,     0,    21,
+      22,    23,     0,     0,    24,    25,     0,     0,     0,    26,
+      27,     0,     0,     0,     0,     0,     0,     0,    54,    55,
+       0,    56,     0,    57,    58,     0,     0,    28,    29,     0,
+     426,    59,    30,    31,     0,    32,    33,    34,    35,    36,
+      37,     0,    38,    39,    40,    41,    42,    43,     0,     0,
+      44,     0,     0,    45,    46,    47,    48,    49,     0,     0,
+       0,    50,    51,    52,     0,     0,     0,     0,     0,    18,
+       0,     0,    19,     0,     0,    20,    53,     0,    21,    22,
+      23,     0,     0,    24,    25,     0,     0,     0,    26,    27,
+       0,     0,     0,     0,     0,     0,     0,    54,    55,     0,
+      56,     0,    57,    58,     0,     0,    28,    29,     0,   459,
+      59,    30,    31,     0,    32,    33,    34,    35,    36,    37,
+       0,    38,    39,    40,    41,    42,    43,     0,     0,    44,
+       0,     0,    45,    46,    47,    48,    49,     0,     0,     0,
+      50,    51,    52,     0,     0,     0,     0,     0,    18,     0,
+       0,    19,     0,     0,    20,    53,     0,    21,    22,    23,
+       0,     0,    24,    25,     0,     0,     0,    26,    27,     0,
+       0,     0,     0,     0,     0,     0,    54,    55,     0,    56,
+       0,    57,    58,     0,     0,    28,    29,     0,     0,    59,
+      30,    31,     0,    32,    33,    34,    35,    36,    37,     0,
+      38,    39,    40,    41,    42,    43,     0,     0,    44,     0,
+       0,    45,    46,    47,    48,    49,     0,     0,     0,    50,
+      51,    52,     0,     0,     0,     0,     0,  -334,     0,     0,
+    -334,     0,     0,  -334,    53,     0,  -334,  -334,  -334,     0,
+       0,  -334,  -334,     0,     0,     0,  -334,  -334,     0,     0,
+       0,     0,     0,     0,     0,    54,    55,     0,    56,     0,
+      57,    58,     0,     0,  -334,  -334,     0,     0,   288,  -334,
+    -334,     0,  -334,  -334,  -334,  -334,  -334,  -334,     0,  -334,
+    -334,  -334,  -334,  -334,  -334,     0,     0,  -334,     0,     0,
+    -334,  -334,  -334,  -334,  -334,     0,     0,     0,  -334,  -334,
+    -334,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,  -334,     0,     0,     0,     0,     0,     0,
+       0,     0,   197,     0,     0,     0,     0,     0,     0,   198,
+     199,   200,     0,     0,  -334,  -334,     0,  -334,     0,  -334,
+    -334,     0,   201,     0,     0,     0,     0,  -334,   202,   203,
+     204,   450,   205,   206,   207,   208,   209,   210,   211,   212,
+     213,   214,   215,   216,   217,   218,   219,   220,     0,     0,
+       0,     0,   221,   197,     0,   222,   223,   224,   225,   226,
+     198,   199,   200,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   201,     0,     0,     0,     0,     0,   202,
+     203,   204,     0,   205,   206,   207,   208,   209,   210,   211,
+     212,   213,   214,   215,   216,   217,   218,   219,   220,     0,
+       0,     0,     0,   221,   197,     0,   222,   223,   224,   225,
+     226,   198,   199,   200,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,  -336,     0,     0,     0,   198,   199,
+     202,   203,   204,     0,   205,   206,   207,   208,   209,   210,
+     211,   212,   213,   214,   215,   216,   217,   218,   219,   220,
+       0,     0,     0,     0,   221,   197,     0,   222,   223,   224,
+     225,   226,   198,   199,   200,   219,   220,     0,     0,     0,
+       0,   221,     0,     0,   222,   223,   224,   225,   226,     0,
+       0,   202,   203,   204,     0,   205,   206,   207,   208,   209,
+     210,   211,   212,   213,   214,   215,   216,   217,   218,   219,
+     220,     0,     0,     0,     0,   221,   197,     0,   222,   223,
+     224,   225,   226,   198,   199,   200,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,    53,    54,     0,    55,    18,    56,    57,    19,     0,
-       0,    20,   300,    58,    21,    22,    23,     0,     0,    24,
-      25,    26,    27,    28,    29,    30,     0,    31,    32,    33,
-      34,    35,    36,     0,     0,     0,     0,     0,    37,    38,
+       0,     0,     0,     0,   204,     0,   205,   206,   207,   208,
+     209,   210,   211,   212,   213,   214,   215,   216,   217,   218,
+     219,   220,     0,     0,     0,     0,   221,  -336,     0,   222,
+     223,   224,   225,   226,   198,   199,   200,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,    39,     0,     0,    40,
-      41,    42,    43,    44,     0,     0,    45,    46,    47,    48,
-      49,    50,    51,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,    52,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,    53,    54,     0,
-      55,    18,    56,    57,    19,     0,     0,    20,   333,    58,
-      21,    22,    23,     0,     0,    24,    25,    26,    27,    28,
-      29,    30,     0,    31,    32,    33,    34,    35,    36,     0,
-       0,     0,     0,     0,    37,    38,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,    39,     0,     0,    40,    41,    42,    43,    44,
-       0,     0,    45,    46,    47,    48,    49,    50,    51,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,    52,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,    53,    54,     0,    55,    18,    56,    57,
-      19,     0,     0,    20,   396,    58,    21,    22,    23,     0,
-       0,    24,    25,    26,    27,    28,    29,    30,     0,    31,
-      32,    33,    34,    35,    36,     0,     0,     0,     0,     0,
-      37,    38,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,    39,     0,
-       0,    40,    41,    42,    43,    44,     0,     0,    45,    46,
-      47,    48,    49,    50,    51,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,    52,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,    53,
-      54,     0,    55,    18,    56,    57,    19,     0,     0,    20,
-     415,    58,    21,    22,    23,     0,     0,    24,    25,    26,
-      27,    28,    29,    30,     0,    31,    32,    33,    34,    35,
-      36,     0,     0,     0,     0,     0,    37,    38,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,    39,     0,     0,    40,    41,    42,
-      43,    44,     0,     0,    45,    46,    47,    48,    49,    50,
-      51,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-      52,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,    53,    54,     0,    55,    18,
-      56,    57,    19,     0,     0,    20,     0,    58,    21,    22,
-      23,     0,     0,    24,    25,    26,    27,    28,    29,    30,
-       0,    31,    32,    33,    34,    35,    36,     0,     0,     0,
-       0,     0,    37,    38,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-      39,     0,     0,    40,    41,    42,    43,    44,     0,     0,
-      45,    46,    47,    48,    49,    50,    51,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,    52,     0,   187,     0,
-       0,     0,     0,     0,     0,   188,   189,     0,     0,     0,
-       0,    53,    54,     0,    55,     0,    56,    57,     0,     0,
-       0,     0,     0,   283,   190,   191,   406,   192,   193,   194,
-     195,   196,   197,   198,   199,   200,   201,   202,     0,     0,
-       0,     0,   203,   187,     0,   204,   205,   206,   207,     0,
-     188,   189,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   190,
-     191,     0,   192,   193,   194,   195,   196,   197,   198,   199,
-     200,   201,   202,     0,     0,     0,     0,   203,   187,     0,
-     204,   205,   206,   207,     0,   188,   189,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   191,     0,   192,   193,   194,
-     195,   196,   197,   198,   199,   200,   201,   202,     0,     0,
-       0,     0,   203,  -300,     0,   204,   205,   206,   207,     0,
-     188,   189,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   192,   193,   194,   195,   196,   197,   198,   199,
-     200,   201,   202,     0,     0,     0,     0,   203,     0,     0,
-     204,   205,   206,   207
+       0,     0,     0,     0,     0,     0,     0,   205,   206,   207,
+     208,   209,   210,   211,   212,   213,   214,   215,   216,   217,
+     218,   219,   220,   198,   199,   200,     0,   221,     0,     0,
+     222,   223,   224,   225,   226,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   198,   199,   200,   208,
+     209,   210,   211,   212,   213,   214,   215,   216,   217,   218,
+     219,   220,     0,     0,     0,     0,   221,     0,     0,   222,
+     223,   224,   225,   226,   210,   211,   212,   213,   214,   215,
+     216,   217,   218,   219,   220,   198,   199,   200,     0,   221,
+       0,     0,   222,   223,   224,   225,   226,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   198,   199,   200,     0,
+       0,     0,     0,     0,   211,   212,   213,   214,   215,   216,
+     217,   218,   219,   220,     0,   198,   199,   200,   221,     0,
+       0,   222,   223,   224,   225,   226,   212,   213,   214,   215,
+     216,   217,   218,   219,   220,   198,   199,   200,     0,   221,
+       0,     0,   222,   223,   224,   225,   226,   214,   215,   216,
+     217,   218,   219,   220,   198,   199,   200,     0,   221,     0,
+       0,   222,   223,   224,   225,   226,     0,     0,     0,   216,
+     217,   218,   219,   220,     0,     0,     0,     0,   221,     0,
+       0,   222,   223,   224,   225,   226,     0,     0,  -336,   217,
+     218,   219,   220,     0,     0,     0,     0,   221,     0,     0,
+     222,   223,   224,   225,   226
 };
 
 static const yytype_int16 yycheck[] =
 {
-      11,   130,    17,   363,    16,   492,   270,    18,    50,    20,
-      19,    22,    44,    24,    25,    10,    27,    28,    12,    14,
-      52,    11,    17,    13,    19,    16,    50,    11,    13,   158,
-     527,    11,    43,    44,    45,    46,    14,     0,    47,    14,
-      22,    14,    22,   353,    81,    14,    13,    29,   104,    44,
-     114,    16,    47,   363,    18,    20,   366,   367,    22,    24,
-      24,    25,    13,    27,    28,   114,    16,    14,   114,    18,
-      20,    20,    15,    22,    24,    24,    25,   114,    27,    28,
-      44,    45,    14,    10,    98,    76,     9,    85,    86,    11,
-     101,    13,    19,    78,    22,    44,    45,    96,   130,    14,
-     587,    50,   114,   600,    22,    11,    14,    85,    86,   114,
-      85,    86,    85,    86,   105,   109,    85,    86,   160,   151,
-      47,   116,    11,   114,   114,   136,   158,    78,    11,    15,
-      13,    58,   143,   142,   143,   130,   160,    23,    85,    86,
-     114,   451,   137,   138,    85,    86,    22,   142,   143,    98,
-      11,    26,    13,    85,    86,   105,    78,    85,    86,    10,
-      11,    84,    13,   158,   114,    16,   430,    85,    86,    20,
-      85,    86,   113,    24,    25,    22,    27,    85,    86,   143,
-      22,    26,    11,   114,    13,   227,    31,    22,   498,   499,
-      47,    48,    49,    50,   143,    78,    22,    54,    10,    56,
-      11,   216,    13,   227,    16,    11,   133,    13,    20,    85,
-      86,   160,    24,   114,   141,   142,   143,    78,    98,    99,
-      71,   216,   217,   487,   534,    11,   114,   238,    85,    86,
-      16,    11,   264,    13,   161,    11,   596,    13,    85,    86,
-      26,    85,    86,    85,    86,    31,   556,   114,   175,   176,
-     114,   178,   179,   180,   263,    11,   113,   386,   207,    85,
-      86,    53,   572,   114,    76,    22,    85,    86,   263,   113,
-      85,    86,    96,    97,    14,   270,    85,    86,   227,    51,
-      52,   208,   209,   210,   211,   212,   213,   214,   215,   218,
-     219,   114,    69,    70,   113,   532,    37,    38,   113,   222,
-     223,   224,   225,   226,   113,   228,   229,    69,   231,   232,
-      81,   548,   549,   324,   113,   242,   243,   244,   245,   246,
-     247,    29,   364,   100,   101,   562,    78,    85,    86,   106,
-      90,    91,   109,   110,   111,   112,   263,   574,   575,   101,
-     364,    85,    86,   113,   106,    22,    78,   109,   110,   111,
-     112,   588,   279,   368,   386,   113,   283,    26,   595,    85,
-      86,   490,   109,   110,   111,   112,   293,    13,   363,   113,
-      69,    70,    16,   368,    26,   324,    20,    69,    70,   114,
-      24,   244,   245,   246,   247,   380,   381,   113,   105,   384,
-      31,   386,    59,    15,   389,   322,   323,    96,    97,    98,
-      99,   100,   101,   330,    29,    12,   355,   106,   417,   101,
-     109,   110,   111,   112,   106,   364,    82,   109,   110,   111,
-     112,    29,   417,   350,   351,   352,   353,   113,    13,    86,
-      69,    70,    25,    25,   429,   430,   363,   493,   494,   366,
-     367,    25,   365,    25,   500,   101,    25,    18,   504,   505,
-     106,   114,    26,   109,   110,   111,   112,    88,   490,    98,
-      99,   100,   101,   114,   387,   114,   113,   106,   524,   525,
-     109,   110,   111,   112,   114,   402,    12,    12,    12,   535,
-       3,     4,     5,     6,     7,     8,     9,    12,    12,    26,
-     417,   440,   487,   113,   550,   490,   511,   113,   513,   113,
-     113,   557,   558,    16,   427,   114,   106,   522,   431,   109,
-     110,   111,   112,    69,    70,   113,   511,    22,   513,   113,
-     443,   577,   113,    82,   451,    11,    11,   522,   584,    12,
-     113,   526,   527,   589,    15,   462,   113,   113,   594,    95,
-      96,    97,    98,    99,   100,   101,    22,   542,    22,   114,
-     106,   607,   113,   109,   110,   111,   112,    22,    80,    47,
-      48,    49,    50,    22,   114,   113,    54,   113,    56,   114,
-      22,   498,   499,   113,   113,   113,   591,    17,    79,   528,
-     113,    60,   113,   109,   507,    13,   581,   533,   351,   538,
-     596,    21,   603,    23,   285,   518,   591,    85,    86,   429,
-     255,   596,   381,   468,    34,   600,   533,   534,   382,    39,
-     488,   518,   227,    43,   364,    -1,    46,   160,    -1,    49,
-      -1,    51,    -1,    53,    54,    55,    56,    57,    -1,   556,
-       0,     1,    -1,    11,    -1,    -1,    -1,    -1,    16,    -1,
-      10,    11,    -1,    13,    -1,   572,    16,    25,    26,    19,
-      20,    21,    22,    31,    24,    25,    26,    27,    28,    29,
-      30,    -1,    32,    33,    34,    35,    36,    37,    38,    39,
-      40,    41,    42,    43,    44,    45,    46,    47,    48,    49,
-      50,    -1,    -1,    -1,    54,    55,    56,    57,    58,    -1,
-      -1,    61,    -1,    63,    64,    65,    66,    67,    68,    -1,
-      -1,    71,    72,    73,    74,    75,    76,    77,    -1,    -1,
-      -1,    -1,    -1,    83,    -1,    -1,    -1,    87,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     160,    -1,   102,   103,    -1,   105,    -1,   107,   108,    -1,
-      -1,    -1,    -1,    -1,   114,    -1,    -1,   177,    -1,    -1,
-      -1,    -1,    -1,   183,    -1,    -1,   186,   187,   188,   189,
-     190,   191,   192,   193,   194,   195,   196,   197,   198,   199,
-     200,   201,   202,   203,     0,     1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    10,    11,    -1,    13,    -1,    -1,
-      16,    -1,    -1,    19,    20,    21,    22,    -1,    24,    25,
-      26,    27,    28,    29,    30,    -1,    32,    33,    34,    35,
-      36,    37,    38,    39,    40,    41,    42,    43,    44,    45,
-      46,    47,    48,    49,    50,    -1,    -1,    -1,    54,    55,
-      56,    57,    58,    -1,    -1,    61,    -1,    63,    64,    65,
-      66,    67,    68,    -1,    -1,    71,    72,    73,    74,    75,
-      76,    77,    -1,    -1,    -1,    -1,    -1,    83,    -1,    -1,
-      -1,    87,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   102,   103,    -1,   105,
-       1,   107,   108,    -1,    -1,    -1,    -1,    -1,   114,    10,
-      11,    12,    13,    -1,    -1,    16,    -1,    -1,    19,    20,
-      21,    22,    -1,    24,    25,    26,    27,    28,    29,    30,
-      -1,    32,    33,    34,    35,    36,    37,    38,    39,    40,
-      41,    42,    43,    44,    45,    46,    47,    48,    49,    50,
-      -1,    -1,    -1,    54,    55,    56,    57,    58,    -1,    -1,
-      61,    -1,    63,    64,    65,    66,    67,    68,    -1,    -1,
-      71,    72,    73,    74,    75,    76,    77,    -1,    -1,    -1,
-      -1,    -1,    83,    -1,    -1,    -1,    87,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   406,    -1,    -1,    -1,
-      -1,   102,   103,    -1,   105,    -1,   107,   108,    -1,    -1,
-      -1,    -1,    -1,   114,    -1,    -1,     1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    10,    11,    12,    13,    -1,
-      -1,    16,    -1,    -1,    19,    20,    21,    22,    -1,    24,
-      25,    26,    27,    28,    29,    30,   456,    32,    33,    34,
-      35,    36,    37,    38,    39,    40,    41,    42,    43,    44,
-      45,    46,    47,    48,    49,    50,    -1,    -1,    -1,    54,
-      55,    56,    57,    58,    -1,    -1,    61,    -1,    63,    64,
-      65,    66,    67,    68,    -1,    -1,    71,    72,    73,    74,
-      75,    76,    77,    -1,    -1,    -1,    -1,    -1,    83,    -1,
-      -1,    -1,    87,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,     1,    -1,   102,   103,    -1,
-     105,    -1,   107,   108,    10,    11,    12,    13,    -1,   114,
-      16,    -1,    -1,    19,    20,    21,    22,    -1,    24,    25,
-      26,    27,    28,    29,    30,    -1,    32,    33,    34,    35,
-      36,    37,    38,    39,    40,    41,    42,    43,    44,    45,
-      46,    47,    48,    49,    50,    -1,    -1,    -1,    54,    55,
-      56,    57,    58,    -1,    -1,    61,    -1,    63,    64,    65,
-      66,    67,    68,    -1,    -1,    71,    72,    73,    74,    75,
-      76,    77,    -1,    -1,    -1,    -1,    -1,    83,    -1,    -1,
-      -1,    87,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,     1,    -1,   102,   103,    -1,   105,
-      -1,   107,   108,    10,    11,    12,    13,    -1,   114,    16,
-      -1,    -1,    19,    20,    21,    22,    -1,    24,    25,    26,
-      27,    28,    29,    30,    -1,    32,    33,    34,    35,    36,
-      37,    38,    39,    40,    41,    42,    43,    44,    45,    46,
-      47,    48,    49,    50,    -1,    -1,    -1,    54,    55,    56,
-      57,    58,    -1,    -1,    61,    -1,    63,    64,    65,    66,
-      67,    68,    -1,    -1,    71,    72,    73,    74,    75,    76,
-      77,    -1,    -1,    -1,    -1,    -1,    83,    -1,    -1,    -1,
-      87,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,     1,    -1,   102,   103,    -1,   105,    -1,
-     107,   108,    10,    11,    12,    13,    -1,   114,    16,    -1,
-      -1,    19,    20,    21,    22,    -1,    24,    25,    26,    27,
-      28,    29,    30,    -1,    32,    33,    34,    35,    36,    37,
-      38,    39,    40,    41,    42,    43,    44,    45,    46,    47,
-      48,    49,    50,    -1,    -1,    -1,    54,    55,    56,    57,
-      58,    -1,    -1,    61,    -1,    63,    64,    65,    66,    67,
-      68,    -1,    -1,    71,    72,    73,    74,    75,    76,    77,
-      -1,    -1,    -1,    -1,    -1,    83,    -1,    -1,    -1,    87,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,     1,    -1,   102,   103,    -1,   105,    -1,   107,
-     108,    10,    11,    -1,    13,    -1,   114,    16,    -1,    -1,
-      19,    20,    21,    22,    -1,    24,    25,    26,    27,    28,
-      29,    30,    -1,    32,    33,    34,    35,    36,    37,    38,
-      39,    40,    41,    42,    43,    44,    45,    46,    47,    48,
-      49,    50,    -1,    -1,    -1,    54,    55,    56,    57,    58,
-      -1,    -1,    61,    -1,    63,    64,    65,    66,    67,    68,
-      -1,    -1,    71,    72,    73,    74,    75,    76,    77,    -1,
-      -1,    80,    -1,    -1,    83,    -1,    -1,    -1,    87,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,     1,    -1,   102,   103,    -1,   105,    -1,   107,   108,
-      10,    11,    -1,    13,    -1,   114,    16,    -1,    -1,    19,
+      10,    13,    49,   149,    17,    19,    53,    11,    27,    19,
+     400,   304,    27,   109,    18,    11,    20,    13,    22,   553,
+      24,    25,    16,    87,   150,    29,    10,   577,    16,    16,
+      34,    35,    20,    56,     0,    19,    24,    51,    61,    49,
+      12,    51,    22,    30,    48,    49,    50,   102,   174,   582,
+      13,    11,    11,    13,    18,    13,    20,    11,    22,     9,
+      24,    25,    16,    27,   130,    11,   130,    51,   110,   111,
+      34,    35,    84,    92,    18,    59,    22,    92,    22,    59,
+      24,    25,   615,   616,   617,    49,    50,   104,    22,   130,
+      34,    35,   130,   110,    10,    11,   100,    13,   631,   632,
+      16,   111,    56,   150,    20,    49,    50,    61,    24,    25,
+      14,    22,   662,   123,    14,   649,    15,   650,    15,   138,
+     110,    84,   169,   138,    84,   658,    23,   174,    92,    14,
+     108,    95,   120,   120,   130,    85,   130,   147,   148,   149,
+     150,    57,   130,   130,   116,    16,   160,   161,   130,    20,
+     160,   161,   156,    24,   300,   139,    14,   161,    92,    93,
+      94,    95,    11,   259,   174,    81,   262,    11,    31,   153,
+     390,   108,   109,    14,   138,   159,   160,   161,    22,    42,
+     400,    92,    93,    94,    95,   405,   406,    14,    92,    93,
+      94,    95,    92,    93,    94,    95,    11,   161,    13,   183,
+     184,   185,   186,    11,   188,   189,   190,    92,    93,    94,
+      95,    11,   130,    13,   130,    32,    56,   161,    35,    36,
+      37,    38,   235,    11,    41,    13,   236,   246,    14,   239,
+      11,   246,    13,    56,    92,    93,    94,    95,    14,   385,
+      11,   130,    13,   227,   228,   229,   230,   231,   232,   233,
+     234,    92,    93,    94,    95,    94,    95,   130,    22,   263,
+     307,    11,   226,    13,   130,    92,    93,    94,    95,   659,
+     563,    22,   492,   127,   128,    92,    93,    94,    95,    22,
+      33,    34,   246,   267,   268,   269,   270,   271,   272,    11,
+     300,    13,   306,   243,   244,   245,   306,   247,   248,    22,
+     250,   251,   252,   253,   288,   130,    92,    93,    94,    95,
+     130,    11,   129,   439,    22,    39,    92,    93,    94,    95,
+     268,   269,   306,   271,   272,    22,   546,   547,    92,    93,
+      94,    95,   316,    11,    84,    22,   320,    14,    16,    84,
+      59,    92,    93,    94,    95,    84,   130,    25,    22,    92,
+      93,    94,    95,    87,    92,    93,    94,    95,   362,   129,
+     506,   129,    84,    13,   584,    92,    93,    94,    95,    92,
+      93,    94,    95,    84,    56,   385,   360,   361,    56,   120,
+      56,    56,   401,    61,   368,    44,   401,    15,   130,   609,
+     400,   129,   439,    61,   407,    78,    79,    80,   362,    59,
+      16,    59,   129,    88,    20,   389,   390,    78,    24,   629,
+      12,   129,    13,   423,   424,   561,   400,    25,    25,   403,
+     404,   405,   406,   433,   130,    25,    25,   437,   392,   439,
+     113,   114,   115,   116,   560,    25,    18,   401,   121,    59,
+      97,   124,   125,   126,   127,   128,   130,   461,    22,    97,
+     121,   461,   402,   124,   125,   126,   127,   128,   408,    56,
+     130,   411,   446,   129,    32,    12,    12,    35,    36,    37,
+      38,    16,    12,    41,    12,    12,   129,   461,   129,    22,
+     129,   431,    92,    93,    94,    95,   541,   542,   130,   499,
+     129,   501,   129,   548,   129,   129,   506,   130,    56,   554,
+     555,    11,    11,    92,    93,    94,    95,    88,   492,    92,
+      93,    94,    95,   560,    12,   129,    22,   481,    15,   129,
+     129,   471,    86,   473,    92,    93,    94,    95,    22,    22,
+     585,   586,   587,   129,   484,   519,   591,    78,    79,    80,
+     129,    92,    93,    94,    95,   130,   129,    22,   603,   562,
+     560,   561,   129,   566,   130,   610,   611,   129,   129,   129,
+     573,   130,   546,   547,    45,    17,   576,   577,   129,   129,
+      78,    85,   582,   114,   115,   116,   129,   129,   129,   634,
+     121,    13,   116,   124,   125,   126,   127,   128,   538,   602,
+     600,   646,    92,    93,    94,    95,   403,   583,   659,   583,
+     584,   290,   657,   501,   425,   615,   616,   617,   116,   281,
+     424,   514,   667,   121,   578,   431,   124,   125,   126,   127,
+     128,   631,   632,   593,   401,   609,   590,   138,   246,   129,
+      -1,    21,   642,    23,    -1,   639,    26,    -1,    28,    29,
+     650,   654,    -1,   593,    -1,   629,    -1,    -1,   658,   659,
+      -1,    41,   662,    -1,    44,    -1,    -1,    -1,    48,    -1,
+       0,     1,    -1,    -1,    54,    55,    56,    57,    58,    -1,
+      10,    11,    -1,    13,    -1,    -1,    16,    -1,    -1,    19,
       20,    21,    22,    -1,    24,    25,    26,    27,    28,    29,
-      30,    -1,    32,    33,    34,    35,    36,    37,    38,    39,
-      40,    41,    42,    43,    44,    45,    46,    47,    48,    49,
-      50,    -1,    -1,    -1,    54,    55,    56,    57,    58,    -1,
-      -1,    61,    -1,    63,    64,    65,    66,    67,    68,    -1,
-      -1,    71,    72,    73,    74,    75,    76,    77,    -1,    -1,
-      -1,    -1,    -1,    83,    -1,    -1,    -1,    87,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-       1,    -1,   102,   103,    -1,   105,    -1,   107,   108,    10,
-      11,    -1,    13,    -1,   114,    16,    -1,    -1,    19,    20,
-      21,    22,    -1,    24,    25,    26,    27,    28,    29,    30,
-      -1,    32,    33,    34,    35,    36,    37,    38,    -1,    40,
-      41,    42,    43,    44,    45,    46,    47,    48,    49,    50,
-      -1,    -1,    -1,    54,    55,    56,    57,    58,    -1,    -1,
-      61,    -1,    63,    64,    65,    66,    67,    68,    -1,    -1,
-      71,    72,    73,    74,    75,    76,    77,    -1,    -1,    -1,
-      -1,    -1,    83,    -1,    -1,    -1,    87,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,     1,    -1,    -1,    -1,
-      -1,   102,   103,    -1,   105,    10,   107,   108,    13,    -1,
-      -1,    16,    -1,   114,    19,    20,    21,    22,    -1,    24,
-      25,    26,    27,    28,    29,    30,    -1,    32,    33,    34,
-      35,    36,    37,    -1,    -1,    -1,    -1,    -1,    43,    44,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    69,    70,
-      -1,    -1,    -1,    -1,    -1,    -1,    61,    -1,    -1,    64,
-      65,    66,    67,    68,    -1,    -1,    71,    72,    73,    74,
-      75,    76,    77,    94,    95,    96,    97,    98,    99,   100,
-     101,    -1,    87,    -1,    -1,   106,    -1,    -1,   109,   110,
-     111,   112,     1,    -1,    -1,    -1,    -1,   102,   103,    -1,
-     105,    10,   107,   108,    13,    -1,    -1,    16,    -1,   114,
-      19,    20,    21,    -1,    -1,    24,    25,    26,    27,    28,
-      29,    30,    -1,    32,    33,    34,    35,    36,    37,    -1,
-      -1,    -1,    -1,    -1,    43,    44,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    61,    -1,    -1,    64,    65,    66,    67,    68,
-       0,    -1,    71,    72,    73,    74,    75,    76,    77,    -1,
-      -1,    11,    -1,    13,    14,    15,    -1,    -1,    87,    -1,
-      -1,    -1,    22,    23,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   102,   103,    -1,   105,    -1,   107,   108,
-      -1,    -1,    -1,    -1,   113,   114,    -1,    47,    48,    49,
-      50,    -1,    -1,    -1,    54,    -1,    56,    -1,    -1,    -1,
-      -1,    -1,    62,    -1,    -1,    -1,    -1,    -1,    -1,    69,
-      70,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    82,    -1,    -1,    85,    86,    -1,    88,    89,
-      90,    91,    92,    93,    94,    95,    96,    97,    98,    99,
-     100,   101,     0,    69,    70,    -1,   106,    -1,    -1,   109,
-     110,   111,   112,   113,    -1,    -1,    14,    15,    -1,    -1,
-      -1,    -1,    -1,    -1,    22,    23,    -1,    93,    94,    95,
-      96,    97,    98,    99,   100,   101,    -1,    -1,    -1,    -1,
-     106,    -1,    -1,   109,   110,   111,   112,    -1,    -1,    47,
-      48,    49,    50,    -1,    -1,    -1,    54,    -1,    56,    -1,
-      -1,    -1,    -1,    -1,    62,    -1,    -1,    -1,    -1,    -1,
-      -1,    69,    70,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    82,    -1,    -1,    85,    86,    -1,
-      88,    89,    90,    91,    92,    93,    94,    95,    96,    97,
-      98,    99,   100,   101,    -1,    -1,    -1,    -1,   106,    -1,
-      -1,   109,   110,   111,   112,   113,    10,    11,    -1,    13,
-      -1,    -1,    16,    -1,    -1,    19,    20,    21,    -1,    -1,
-      24,    25,    26,    27,    28,    29,    30,    31,    32,    33,
-      34,    35,    36,    37,    -1,    -1,    -1,    -1,    -1,    43,
-      44,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    61,    -1,    -1,
-      64,    65,    66,    67,    68,    -1,    -1,    71,    72,    73,
-      74,    75,    76,    77,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    87,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   102,   103,
-      -1,   105,    -1,   107,   108,    10,    11,    -1,    13,    -1,
-     114,    16,    -1,    -1,    19,    20,    21,    -1,    -1,    24,
-      25,    26,    27,    28,    29,    30,    -1,    32,    33,    34,
-      35,    36,    37,    -1,    -1,    -1,    -1,    -1,    43,    44,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    61,    -1,    -1,    64,
-      65,    66,    67,    68,    -1,    -1,    71,    72,    73,    74,
-      75,    76,    77,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    87,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   102,   103,    -1,
-     105,    10,   107,   108,    13,    -1,    -1,    16,    -1,   114,
-      19,    20,    21,    -1,    -1,    24,    25,    26,    27,    28,
-      29,    30,    -1,    32,    33,    34,    35,    36,    37,    -1,
-      -1,    -1,    -1,    -1,    43,    44,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    61,    -1,    -1,    64,    65,    66,    67,    68,
-      -1,    -1,    71,    72,    73,    74,    75,    76,    77,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    87,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   102,   103,    -1,   105,    10,   107,   108,
-      13,    -1,    -1,    16,   113,   114,    19,    20,    21,    -1,
-      -1,    24,    25,    26,    27,    28,    29,    30,    -1,    32,
-      33,    34,    35,    36,    37,    -1,    -1,    -1,    -1,    -1,
-      43,    44,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    61,    -1,
-      -1,    64,    65,    66,    67,    68,    -1,    -1,    71,    72,
-      73,    74,    75,    76,    77,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    87,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   102,
-     103,    -1,   105,    10,   107,   108,    13,    -1,    -1,    16,
-     113,   114,    19,    20,    21,    -1,    -1,    24,    25,    26,
-      27,    28,    29,    30,    -1,    32,    33,    34,    35,    36,
-      37,    -1,    -1,    -1,    -1,    -1,    43,    44,    -1,    -1,
+      30,    31,    32,    -1,    -1,    35,    36,    37,    38,    -1,
+      40,    41,    42,    43,    -1,    -1,    46,    47,    48,    49,
+      50,    51,    52,    53,    54,    55,    56,    57,    58,    59,
+      60,    -1,    62,    63,    64,    65,    66,    67,    68,    69,
+      70,    -1,    72,    73,    74,    75,    76,    77,    -1,    -1,
+      -1,    81,    82,    83,    92,    93,    94,    95,   138,    89,
+      -1,    10,    -1,    -1,    -1,    -1,    96,    16,    -1,    -1,
+      -1,    20,    -1,    -1,    -1,    24,   124,   125,   126,   127,
+     128,    30,    92,    93,    94,    95,    -1,   117,   118,    -1,
+     120,   129,   122,   123,    -1,    -1,    -1,    -1,    -1,    -1,
+     130,    -1,    -1,    -1,    -1,    -1,    -1,   187,    -1,    -1,
+      -1,    -1,    -1,   193,    -1,    -1,   196,   197,   198,   199,
+     200,   201,   202,   203,   204,   205,   206,   207,   208,   209,
+     210,   211,   212,   213,   214,   215,   216,   217,   218,   219,
+     220,   221,     0,     1,    -1,   225,    -1,    -1,    -1,    -1,
+      -1,    -1,    10,    11,    -1,    13,    -1,    -1,    16,    -1,
+      -1,    19,    20,    21,    22,    -1,    24,    25,    26,    27,
+      28,    29,    30,    31,    32,    -1,    -1,    35,    36,    37,
+      38,    -1,    40,    41,    42,    43,    -1,    -1,    46,    47,
+      48,    49,    50,    51,    52,    53,    54,    55,    56,    57,
+      58,    59,    60,    -1,    62,    63,    64,    65,    66,    67,
+      68,    69,    70,    -1,    72,    73,    74,    75,    76,    77,
+      -1,    -1,    -1,    81,    82,    83,    -1,    -1,    -1,    -1,
+      -1,    89,    -1,    -1,    -1,    -1,    -1,    -1,    96,     3,
+       4,     5,     6,     7,     8,     9,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,     1,   117,
+     118,    -1,   120,    -1,   122,   123,    -1,    10,    11,    12,
+      13,    -1,   130,    16,    -1,    -1,    19,    20,    21,    22,
+      -1,    24,    25,    26,    27,    28,    29,    30,    31,    32,
+      -1,    -1,    35,    36,    37,    38,    -1,    40,    41,    42,
+      43,    -1,    -1,    46,    47,    48,    49,    50,    51,    52,
+      53,    54,    55,    56,    57,    58,    59,    60,    -1,    62,
+      63,    64,    65,    66,    67,    68,    69,    70,    -1,    72,
+      73,    74,    75,    76,    77,    -1,    -1,    -1,    81,    82,
+      83,    -1,    -1,    -1,    -1,    -1,    89,    -1,    -1,    -1,
+      -1,    -1,    -1,    96,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    61,    -1,    -1,    64,    65,    66,
-      67,    68,    -1,    -1,    71,    72,    73,    74,    75,    76,
-      77,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      87,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   102,   103,    -1,   105,    10,
-     107,   108,    13,    -1,    -1,    16,   113,   114,    19,    20,
-      21,    -1,    -1,    24,    25,    26,    27,    28,    29,    30,
-      -1,    32,    33,    34,    35,    36,    37,    -1,    -1,    -1,
-      -1,    -1,    43,    44,    -1,    -1,    -1,    -1,    -1,    -1,
+     450,    -1,    -1,    -1,   117,   118,    -1,   120,    -1,   122,
+     123,    -1,    -1,     1,    -1,    -1,    -1,   130,    -1,    -1,
+      -1,    -1,    10,    11,    12,    13,    -1,    -1,    16,    -1,
+      -1,    19,    20,    21,    22,    -1,    24,    25,    26,    27,
+      28,    29,    30,    31,    32,    -1,    -1,    35,    36,    37,
+      38,    -1,    40,    41,    42,    43,    -1,   507,    46,    47,
+      48,    49,    50,    51,    52,    53,    54,    55,    56,    57,
+      58,    59,    60,    -1,    62,    63,    64,    65,    66,    67,
+      68,    69,    70,    -1,    72,    73,    74,    75,    76,    77,
+     540,    -1,    -1,    81,    82,    83,    -1,    -1,    -1,    -1,
+      -1,    89,    -1,    -1,    -1,    -1,    -1,    -1,    96,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      61,    -1,    -1,    64,    65,    66,    67,    68,    -1,    -1,
-      71,    72,    73,    74,    75,    76,    77,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    87,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,     1,   117,
+     118,    -1,   120,    -1,   122,   123,    -1,    10,    11,    12,
+      13,    -1,   130,    16,    -1,    -1,    19,    20,    21,    22,
+      -1,    24,    25,    26,    27,    28,    29,    30,    31,    32,
+      -1,    -1,    35,    36,    37,    38,    -1,    40,    41,    42,
+      43,    -1,    -1,    46,    47,    48,    49,    50,    51,    52,
+      53,    54,    55,    56,    57,    58,    59,    60,    -1,    62,
+      63,    64,    65,    66,    67,    68,    69,    70,    -1,    72,
+      73,    74,    75,    76,    77,    -1,    -1,    -1,    81,    82,
+      83,    -1,    -1,    -1,    -1,    -1,    89,    -1,    -1,    -1,
+      -1,    -1,    -1,    96,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   102,   103,    -1,   105,    10,   107,   108,    13,    -1,
-      -1,    16,   113,   114,    19,    20,    21,    -1,    -1,    24,
-      25,    26,    27,    28,    29,    30,    -1,    32,    33,    34,
-      35,    36,    37,    -1,    -1,    -1,    -1,    -1,    43,    44,
+      -1,    -1,    -1,     1,   117,   118,    -1,   120,    -1,   122,
+     123,    -1,    10,    11,    12,    13,    -1,   130,    16,    -1,
+      -1,    19,    20,    21,    22,    -1,    24,    25,    26,    27,
+      28,    29,    30,    31,    32,    -1,    -1,    35,    36,    37,
+      38,    -1,    40,    41,    42,    43,    -1,    -1,    46,    47,
+      48,    49,    50,    51,    52,    53,    54,    55,    56,    57,
+      58,    59,    60,    -1,    62,    63,    64,    65,    66,    67,
+      68,    69,    70,    -1,    72,    73,    74,    75,    76,    77,
+      -1,    -1,    -1,    81,    82,    83,    -1,    -1,    -1,    -1,
+      -1,    89,    -1,    -1,    -1,    -1,    -1,    -1,    96,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    61,    -1,    -1,    64,
-      65,    66,    67,    68,    -1,    -1,    71,    72,    73,    74,
-      75,    76,    77,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    87,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   102,   103,    -1,
-     105,    10,   107,   108,    13,    -1,    -1,    16,   113,   114,
-      19,    20,    21,    -1,    -1,    24,    25,    26,    27,    28,
-      29,    30,    -1,    32,    33,    34,    35,    36,    37,    -1,
-      -1,    -1,    -1,    -1,    43,    44,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,     1,   117,
+     118,    -1,   120,    -1,   122,   123,    -1,    10,    11,    12,
+      13,    -1,   130,    16,    -1,    -1,    19,    20,    21,    22,
+      -1,    24,    25,    26,    27,    28,    29,    30,    31,    32,
+      -1,    -1,    35,    36,    37,    38,    -1,    40,    41,    42,
+      43,    -1,    -1,    46,    47,    48,    49,    50,    51,    52,
+      53,    54,    55,    56,    57,    58,    59,    60,    -1,    62,
+      63,    64,    65,    66,    67,    68,    69,    70,    -1,    72,
+      73,    74,    75,    76,    77,    -1,    -1,    -1,    81,    82,
+      83,    -1,    -1,    -1,    -1,    -1,    89,    -1,    -1,    -1,
+      -1,    -1,    -1,    96,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    61,    -1,    -1,    64,    65,    66,    67,    68,
-      -1,    -1,    71,    72,    73,    74,    75,    76,    77,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    87,    -1,
+      -1,    -1,    -1,     1,   117,   118,    -1,   120,    -1,   122,
+     123,    -1,    10,    11,    12,    13,    -1,   130,    16,    -1,
+      -1,    19,    20,    21,    22,    -1,    24,    25,    26,    27,
+      28,    29,    30,    31,    32,    -1,    -1,    35,    36,    37,
+      38,    -1,    40,    41,    42,    43,    -1,    -1,    46,    47,
+      48,    49,    50,    51,    52,    53,    54,    55,    56,    57,
+      58,    59,    60,    -1,    62,    63,    64,    65,    66,    67,
+      68,    69,    70,    -1,    72,    73,    74,    75,    76,    77,
+      -1,    -1,    -1,    81,    82,    83,    -1,    -1,    -1,    -1,
+      -1,    89,    -1,    -1,    -1,    -1,    -1,    -1,    96,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   102,   103,    -1,   105,    10,   107,   108,
-      13,    -1,    -1,    16,   113,   114,    19,    20,    21,    -1,
-      -1,    24,    25,    26,    27,    28,    29,    30,    -1,    32,
-      33,    34,    35,    36,    37,    -1,    -1,    -1,    -1,    -1,
-      43,    44,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    61,    -1,
-      -1,    64,    65,    66,    67,    68,    -1,    -1,    71,    72,
-      73,    74,    75,    76,    77,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    87,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   102,
-     103,    -1,   105,    10,   107,   108,    13,    -1,    -1,    16,
-     113,   114,    19,    20,    21,    -1,    -1,    24,    25,    26,
-      27,    28,    29,    30,    -1,    32,    33,    34,    35,    36,
-      37,    -1,    -1,    -1,    -1,    -1,    43,    44,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,     1,   117,
+     118,    -1,   120,    -1,   122,   123,    -1,    10,    11,    -1,
+      13,    -1,   130,    16,    -1,    -1,    19,    20,    21,    22,
+      -1,    24,    25,    26,    27,    28,    29,    30,    31,    32,
+      -1,    -1,    35,    36,    37,    38,    -1,    40,    41,    42,
+      43,    -1,    -1,    46,    47,    48,    49,    50,    51,    52,
+      53,    54,    55,    56,    57,    58,    59,    60,    -1,    62,
+      63,    64,    65,    66,    67,    68,    69,    70,    -1,    72,
+      73,    74,    75,    76,    77,    -1,    -1,    -1,    81,    82,
+      83,    -1,    -1,    86,    -1,    -1,    89,    -1,    -1,    -1,
+      -1,    -1,    -1,    96,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    61,    -1,    -1,    64,    65,    66,
-      67,    68,    -1,    -1,    71,    72,    73,    74,    75,    76,
-      77,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      87,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   102,   103,    -1,   105,    10,
-     107,   108,    13,    -1,    -1,    16,    -1,   114,    19,    20,
-      21,    -1,    -1,    24,    25,    26,    27,    28,    29,    30,
-      -1,    32,    33,    34,    35,    36,    37,    -1,    -1,    -1,
-      -1,    -1,    43,    44,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,     1,   117,   118,    -1,   120,    -1,   122,
+     123,    -1,    10,    11,    -1,    13,    -1,   130,    16,    -1,
+      -1,    19,    20,    21,    22,    -1,    24,    25,    26,    27,
+      28,    29,    30,    31,    32,    -1,    -1,    35,    36,    37,
+      38,    -1,    40,    41,    42,    43,    -1,    -1,    46,    47,
+      48,    49,    50,    51,    52,    53,    54,    55,    56,    57,
+      58,    59,    60,    -1,    62,    63,    64,    65,    66,    67,
+      68,    69,    70,    -1,    72,    73,    74,    75,    76,    77,
+      -1,    -1,    -1,    81,    82,    83,    -1,    -1,    -1,    -1,
+      -1,    89,    -1,    -1,    -1,    -1,    -1,    -1,    96,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      61,    -1,    -1,    64,    65,    66,    67,    68,    -1,    -1,
-      71,    72,    73,    74,    75,    76,    77,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    87,    -1,    62,    -1,
-      -1,    -1,    -1,    -1,    -1,    69,    70,    -1,    -1,    -1,
-      -1,   102,   103,    -1,   105,    -1,   107,   108,    -1,    -1,
-      -1,    -1,    -1,   114,    88,    89,    90,    91,    92,    93,
-      94,    95,    96,    97,    98,    99,   100,   101,    -1,    -1,
-      -1,    -1,   106,    62,    -1,   109,   110,   111,   112,    -1,
-      69,    70,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    88,
-      89,    -1,    91,    92,    93,    94,    95,    96,    97,    98,
-      99,   100,   101,    -1,    -1,    -1,    -1,   106,    62,    -1,
-     109,   110,   111,   112,    -1,    69,    70,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,     1,   117,
+     118,    -1,   120,    -1,   122,   123,    -1,    10,    11,    -1,
+      13,    -1,   130,    16,    -1,    -1,    19,    20,    21,    22,
+      -1,    24,    25,    26,    27,    28,    29,    30,    31,    32,
+      -1,    -1,    35,    36,    37,    38,    -1,    40,    41,    42,
+      43,    -1,    -1,    46,    47,    48,    49,    50,    51,    52,
+      53,    54,    55,    56,    57,    58,    59,    60,    -1,    62,
+      63,    64,    65,    66,    67,    68,    -1,    70,    -1,    72,
+      73,    74,    75,    76,    77,    -1,    -1,    -1,    81,    82,
+      83,    -1,     1,    -1,    -1,    -1,    89,    -1,    -1,    -1,
+      -1,    10,    -1,    96,    13,    -1,    -1,    16,    -1,    -1,
+      19,    20,    21,    22,    -1,    24,    25,    -1,    -1,    -1,
+      29,    30,    -1,    -1,   117,   118,    -1,   120,    -1,   122,
+     123,    -1,    -1,    -1,    -1,    -1,    -1,   130,    47,    48,
+      -1,    -1,    -1,    52,    53,    -1,    55,    56,    57,    58,
+      59,    60,    -1,    62,    63,    64,    65,    66,    67,    -1,
+      -1,    70,    -1,    -1,    73,    74,    75,    76,    77,    -1,
+      -1,     1,    81,    82,    83,    -1,    -1,    -1,    -1,    -1,
+      10,    -1,    -1,    13,    -1,    -1,    16,    96,    -1,    19,
+      20,    21,    -1,    -1,    24,    25,    -1,    -1,    -1,    29,
+      30,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   117,   118,
+      -1,   120,    -1,   122,   123,    -1,    -1,    47,    48,    -1,
+      -1,   130,    52,    53,    -1,    55,    56,    57,    58,    59,
+      60,    -1,    62,    63,    64,    65,    66,    67,    -1,    -1,
+      70,    -1,    -1,    73,    74,    75,    76,    77,    -1,    -1,
+      -1,    81,    82,    83,    -1,    -1,    -1,    -1,    -1,    10,
+      11,    -1,    13,    -1,    -1,    16,    96,    -1,    19,    20,
+      21,    -1,    -1,    24,    25,    -1,    -1,    -1,    29,    30,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   117,   118,    -1,
+     120,    -1,   122,   123,    -1,    -1,    47,    48,    -1,   129,
+     130,    52,    53,    -1,    55,    56,    57,    58,    59,    60,
+      61,    62,    63,    64,    65,    66,    67,    -1,    -1,    70,
+      -1,    -1,    73,    74,    75,    76,    77,    -1,    -1,    -1,
+      81,    82,    83,    -1,    -1,    -1,    -1,    -1,    10,    11,
+      -1,    13,    -1,    -1,    16,    96,    -1,    19,    20,    21,
+      -1,    -1,    24,    25,    -1,    -1,    -1,    29,    30,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   117,   118,    -1,   120,
+      -1,   122,   123,    -1,    -1,    47,    48,    -1,    -1,   130,
+      52,    53,    -1,    55,    56,    57,    58,    59,    60,    -1,
+      62,    63,    64,    65,    66,    67,    -1,    -1,    70,    -1,
+      -1,    73,    74,    75,    76,    77,    -1,    -1,    -1,    81,
+      82,    83,    -1,    -1,    -1,    -1,    -1,    10,    -1,    -1,
+      13,    -1,    -1,    16,    96,    -1,    19,    20,    21,    -1,
+      -1,    24,    25,    -1,    -1,    -1,    29,    30,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   117,   118,    -1,   120,    -1,
+     122,   123,    -1,    -1,    47,    48,    -1,    -1,   130,    52,
+      53,    -1,    55,    56,    57,    58,    59,    60,    -1,    62,
+      63,    64,    65,    66,    67,    -1,    -1,    70,    -1,    -1,
+      73,    74,    75,    76,    77,    -1,    -1,    -1,    81,    82,
+      83,    -1,    -1,    -1,    -1,    -1,    10,    -1,    -1,    13,
+      -1,    -1,    16,    96,    -1,    19,    20,    21,    -1,    -1,
+      24,    25,    -1,    -1,    -1,    29,    30,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   117,   118,    -1,   120,    -1,   122,
+     123,    -1,    -1,    47,    48,    -1,   129,   130,    52,    53,
+      -1,    55,    56,    57,    58,    59,    60,    -1,    62,    63,
+      64,    65,    66,    67,    -1,    -1,    70,    -1,    -1,    73,
+      74,    75,    76,    77,    -1,    -1,    -1,    81,    82,    83,
+      -1,    -1,    -1,    -1,    -1,    10,    -1,    -1,    13,    -1,
+      -1,    16,    96,    -1,    19,    20,    21,    -1,    -1,    24,
+      25,    -1,    -1,    -1,    29,    30,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   117,   118,    -1,   120,    -1,   122,   123,
+      -1,    -1,    47,    48,    -1,   129,   130,    52,    53,    -1,
+      55,    56,    57,    58,    59,    60,    -1,    62,    63,    64,
+      65,    66,    67,    -1,    -1,    70,    -1,    -1,    73,    74,
+      75,    76,    77,    -1,    -1,    -1,    81,    82,    83,    -1,
+      -1,    -1,    -1,    -1,    10,    11,    -1,    13,    -1,    -1,
+      16,    96,    -1,    19,    20,    21,    -1,    -1,    24,    25,
+      -1,    -1,    -1,    29,    30,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,   117,   118,    -1,   120,    -1,   122,   123,    -1,
+      -1,    47,    48,    -1,   129,   130,    52,    53,    -1,    55,
+      56,    57,    58,    59,    60,    -1,    62,    63,    64,    65,
+      66,    67,    -1,    -1,    70,    -1,    -1,    73,    74,    75,
+      76,    77,    -1,    -1,    -1,    81,    82,    83,    -1,    -1,
+      -1,    -1,    -1,    10,    -1,    -1,    13,    -1,    -1,    16,
+      96,    -1,    19,    20,    21,    -1,    -1,    24,    25,    -1,
+      -1,    -1,    29,    30,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   117,   118,    -1,   120,    -1,   122,   123,    -1,    -1,
+      47,    48,    -1,    -1,   130,    52,    53,    -1,    55,    56,
+      57,    58,    59,    60,    -1,    62,    63,    64,    65,    66,
+      67,    -1,    -1,    70,    -1,    -1,    73,    74,    75,    76,
+      77,    -1,    -1,    -1,    81,    82,    83,    -1,    -1,    -1,
+      -1,    -1,    10,    -1,    -1,    13,    -1,    -1,    16,    96,
+      -1,    19,    20,    21,    -1,    -1,    24,    25,    -1,    -1,
+      -1,    29,    30,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     117,   118,    -1,   120,    -1,   122,   123,    -1,    -1,    47,
+      48,    -1,   129,   130,    52,    53,    -1,    55,    56,    57,
+      58,    59,    60,    -1,    62,    63,    64,    65,    66,    67,
+      -1,    -1,    70,    -1,    -1,    73,    74,    75,    76,    77,
+      -1,    -1,    -1,    81,    82,    83,    -1,    -1,    -1,    -1,
+      -1,    10,    -1,    -1,    13,    -1,    -1,    16,    96,    -1,
+      19,    20,    21,    -1,    -1,    24,    25,    -1,    -1,    -1,
+      29,    30,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   117,
+     118,    -1,   120,    -1,   122,   123,    -1,    -1,    47,    48,
+      -1,   129,   130,    52,    53,    -1,    55,    56,    57,    58,
+      59,    60,    -1,    62,    63,    64,    65,    66,    67,    -1,
+      -1,    70,    -1,    -1,    73,    74,    75,    76,    77,    -1,
+      -1,    -1,    81,    82,    83,    -1,    -1,    -1,    -1,    -1,
+      10,    -1,    -1,    13,    -1,    -1,    16,    96,    -1,    19,
+      20,    21,    -1,    -1,    24,    25,    -1,    -1,    -1,    29,
+      30,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   117,   118,
+      -1,   120,    -1,   122,   123,    -1,    -1,    47,    48,    -1,
+     129,   130,    52,    53,    -1,    55,    56,    57,    58,    59,
+      60,    -1,    62,    63,    64,    65,    66,    67,    -1,    -1,
+      70,    -1,    -1,    73,    74,    75,    76,    77,    -1,    -1,
+      -1,    81,    82,    83,    -1,    -1,    -1,    -1,    -1,    10,
+      -1,    -1,    13,    -1,    -1,    16,    96,    -1,    19,    20,
+      21,    -1,    -1,    24,    25,    -1,    -1,    -1,    29,    30,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   117,   118,    -1,
+     120,    -1,   122,   123,    -1,    -1,    47,    48,    -1,   129,
+     130,    52,    53,    -1,    55,    56,    57,    58,    59,    60,
+      -1,    62,    63,    64,    65,    66,    67,    -1,    -1,    70,
+      -1,    -1,    73,    74,    75,    76,    77,    -1,    -1,    -1,
+      81,    82,    83,    -1,    -1,    -1,    -1,    -1,    10,    -1,
+      -1,    13,    -1,    -1,    16,    96,    -1,    19,    20,    21,
+      -1,    -1,    24,    25,    -1,    -1,    -1,    29,    30,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   117,   118,    -1,   120,
+      -1,   122,   123,    -1,    -1,    47,    48,    -1,    -1,   130,
+      52,    53,    -1,    55,    56,    57,    58,    59,    60,    -1,
+      62,    63,    64,    65,    66,    67,    -1,    -1,    70,    -1,
+      -1,    73,    74,    75,    76,    77,    -1,    -1,    -1,    81,
+      82,    83,    -1,    -1,    -1,    -1,    -1,    10,    -1,    -1,
+      13,    -1,    -1,    16,    96,    -1,    19,    20,    21,    -1,
+      -1,    24,    25,    -1,    -1,    -1,    29,    30,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   117,   118,    -1,   120,    -1,
+     122,   123,    -1,    -1,    47,    48,    -1,    -1,   130,    52,
+      53,    -1,    55,    56,    57,    58,    59,    60,    -1,    62,
+      63,    64,    65,    66,    67,    -1,    -1,    70,    -1,    -1,
+      73,    74,    75,    76,    77,    -1,    -1,    -1,    81,    82,
+      83,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    96,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    71,    -1,    -1,    -1,    -1,    -1,    -1,    78,
+      79,    80,    -1,    -1,   117,   118,    -1,   120,    -1,   122,
+     123,    -1,    91,    -1,    -1,    -1,    -1,   130,    97,    98,
+      99,   100,   101,   102,   103,   104,   105,   106,   107,   108,
+     109,   110,   111,   112,   113,   114,   115,   116,    -1,    -1,
+      -1,    -1,   121,    71,    -1,   124,   125,   126,   127,   128,
+      78,    79,    80,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    91,    -1,    -1,    -1,    -1,    -1,    97,
+      98,    99,    -1,   101,   102,   103,   104,   105,   106,   107,
+     108,   109,   110,   111,   112,   113,   114,   115,   116,    -1,
+      -1,    -1,    -1,   121,    71,    -1,   124,   125,   126,   127,
+     128,    78,    79,    80,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    91,    -1,    -1,    -1,    78,    79,
+      97,    98,    99,    -1,   101,   102,   103,   104,   105,   106,
+     107,   108,   109,   110,   111,   112,   113,   114,   115,   116,
+      -1,    -1,    -1,    -1,   121,    71,    -1,   124,   125,   126,
+     127,   128,    78,    79,    80,   115,   116,    -1,    -1,    -1,
+      -1,   121,    -1,    -1,   124,   125,   126,   127,   128,    -1,
+      -1,    97,    98,    99,    -1,   101,   102,   103,   104,   105,
+     106,   107,   108,   109,   110,   111,   112,   113,   114,   115,
+     116,    -1,    -1,    -1,    -1,   121,    71,    -1,   124,   125,
+     126,   127,   128,    78,    79,    80,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    89,    -1,    91,    92,    93,
-      94,    95,    96,    97,    98,    99,   100,   101,    -1,    -1,
-      -1,    -1,   106,    62,    -1,   109,   110,   111,   112,    -1,
-      69,    70,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    99,    -1,   101,   102,   103,   104,
+     105,   106,   107,   108,   109,   110,   111,   112,   113,   114,
+     115,   116,    -1,    -1,    -1,    -1,   121,    71,    -1,   124,
+     125,   126,   127,   128,    78,    79,    80,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    91,    92,    93,    94,    95,    96,    97,    98,
-      99,   100,   101,    -1,    -1,    -1,    -1,   106,    -1,    -1,
-     109,   110,   111,   112
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   101,   102,   103,
+     104,   105,   106,   107,   108,   109,   110,   111,   112,   113,
+     114,   115,   116,    78,    79,    80,    -1,   121,    -1,    -1,
+     124,   125,   126,   127,   128,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    78,    79,    80,   104,
+     105,   106,   107,   108,   109,   110,   111,   112,   113,   114,
+     115,   116,    -1,    -1,    -1,    -1,   121,    -1,    -1,   124,
+     125,   126,   127,   128,   106,   107,   108,   109,   110,   111,
+     112,   113,   114,   115,   116,    78,    79,    80,    -1,   121,
+      -1,    -1,   124,   125,   126,   127,   128,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    78,    79,    80,    -1,
+      -1,    -1,    -1,    -1,   107,   108,   109,   110,   111,   112,
+     113,   114,   115,   116,    -1,    78,    79,    80,   121,    -1,
+      -1,   124,   125,   126,   127,   128,   108,   109,   110,   111,
+     112,   113,   114,   115,   116,    78,    79,    80,    -1,   121,
+      -1,    -1,   124,   125,   126,   127,   128,   110,   111,   112,
+     113,   114,   115,   116,    78,    79,    80,    -1,   121,    -1,
+      -1,   124,   125,   126,   127,   128,    -1,    -1,    -1,   112,
+     113,   114,   115,   116,    -1,    -1,    -1,    -1,   121,    -1,
+      -1,   124,   125,   126,   127,   128,    -1,    -1,   112,   113,
+     114,   115,   116,    -1,    -1,    -1,    -1,   121,    -1,    -1,
+     124,   125,   126,   127,   128
 };
 
   /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
      symbol of state STATE-NUM.  */
 static const yytype_uint8 yystos[] =
 {
-       0,     3,     4,     5,     6,     7,     8,     9,   116,   117,
-     118,   119,   120,   121,   122,   123,     0,   127,    10,    13,
-      16,    19,    20,    21,    24,    25,    26,    27,    28,    29,
-      30,    32,    33,    34,    35,    36,    37,    43,    44,    61,
-      64,    65,    66,    67,    68,    71,    72,    73,    74,    75,
-      76,    77,    87,   102,   103,   105,   107,   108,   114,   125,
-     181,   182,   183,   186,   187,   188,   189,   190,   191,   192,
-     193,   194,   195,   197,   200,   208,   209,   210,   211,   212,
-     213,   214,   215,   216,    11,   124,     1,    22,    38,    40,
-      41,    42,    45,    46,    47,    48,    49,    50,    54,    55,
-      56,    57,    58,    63,    83,   124,   134,   147,   181,    39,
-     132,   133,   134,   125,   130,   175,   176,   130,    26,    31,
-     124,   209,   217,   200,   217,   195,   217,   195,   217,   217,
-     217,   217,   196,    13,   114,   195,   159,   159,   159,   195,
-     114,   114,    81,   114,   124,   195,    26,   125,   182,   199,
-     209,   217,   217,   124,   195,   200,    26,    31,   161,   195,
-     105,   114,   198,   209,   210,   211,   195,   182,   195,   195,
-     195,   195,   195,   113,   181,    85,    86,    15,    11,    13,
-     114,    98,    99,    98,    96,    97,    96,    62,    69,    70,
-      88,    89,    91,    92,    93,    94,    95,    96,    97,    98,
-      99,   100,   101,   106,   109,   110,   111,   112,   114,    11,
-      13,    11,    13,    11,    13,    11,   127,   160,   161,   161,
-      26,   158,   114,   114,   114,   114,    76,   105,   114,   207,
-     209,   114,   114,   124,    11,   128,    22,   128,    53,   125,
-     149,    22,    47,    48,    49,    50,    54,    56,   133,   134,
-     132,    16,    20,    24,   125,   166,   167,   169,   170,   171,
-     172,    14,   199,   114,    81,   181,   113,   124,    29,   125,
-     162,    78,   125,   163,   113,   113,   181,   200,   200,   217,
-     182,    22,   199,   114,   195,   198,   209,   210,   211,   113,
-     181,    78,   164,    13,   113,   181,   181,   195,   181,   181,
-     113,   181,   195,   195,   195,   195,   195,   195,   195,   195,
-     195,   195,   195,   195,   195,   195,   195,   195,   195,   195,
-     195,    10,    11,    13,    16,    20,    24,    25,    27,    71,
-     114,   185,   209,   113,   181,   181,   181,   181,   181,   181,
-     181,   181,   130,    26,   125,   157,   158,   158,    26,   137,
-     127,   127,   127,   127,   105,   127,    76,   205,   206,   208,
-     209,   210,   211,   127,   127,   114,   127,   127,   129,    59,
-     124,   146,   181,   154,   181,   146,   146,   146,   146,    31,
-     165,   165,    15,   200,   182,    14,   184,   163,    29,   127,
-     180,   113,    82,   113,   181,    12,   113,   181,   164,   113,
-      29,   181,    13,    22,    14,   113,    90,    25,   181,   181,
-      25,    25,    25,    25,    25,   113,   181,   114,   113,    22,
-      14,    22,    14,    22,    14,    22,    12,    18,   126,   135,
-     136,    11,    22,    26,   153,   181,   154,   155,   181,   155,
-     114,   202,   209,   114,   125,   147,   152,   155,   156,   181,
-     205,   127,   155,   155,   130,   114,    88,   125,   168,   168,
-     170,   113,    23,   125,   201,   199,   127,   178,   114,   125,
-     173,   174,   113,   113,    14,   181,    12,   195,    22,    14,
-     113,   200,    12,    12,    12,    12,   127,   162,   163,   127,
-      26,   113,   113,   113,   113,   203,   204,   209,   114,   127,
-     113,    22,   140,   155,   113,   113,    12,   141,   195,   181,
-      82,    11,   175,    11,    14,    12,   113,    22,   163,    22,
-     179,   180,   143,   199,   151,   151,   128,   128,    15,   113,
-     155,   155,   128,   138,   114,   113,   128,   128,   127,   130,
-     113,   130,    80,    22,   177,   178,   130,    22,   128,   128,
-      51,    52,   125,   148,   148,   209,   114,   113,   113,   149,
-     153,   155,   128,   209,    12,    12,   125,   131,    12,   149,
-     149,   128,   114,   155,   128,   128,    22,   113,   149,   142,
-      22,    29,   144,   155,   113,   149,   149,   139,   128,   113,
-      17,    79,   125,   145,   113,   128,   151,   149,   128,   130,
-     128,   149,   156,    60,   150,    80,   148,   113,   124,   128
+       0,     3,     4,     5,     6,     7,     8,     9,   132,   133,
+     134,   135,   136,   137,   138,   139,     0,   144,    10,    13,
+      16,    19,    20,    21,    24,    25,    29,    30,    47,    48,
+      52,    53,    55,    56,    57,    58,    59,    60,    62,    63,
+      64,    65,    66,    67,    70,    73,    74,    75,    76,    77,
+      81,    82,    83,    96,   117,   118,   120,   122,   123,   130,
+     142,   203,   204,   205,   208,   209,   210,   211,   212,   213,
+     214,   215,   216,   217,   219,   226,   234,   235,   236,   237,
+     238,   239,   240,   241,   242,    11,   141,     1,    22,    26,
+      27,    28,    31,    32,    35,    36,    37,    38,    40,    41,
+      42,    43,    46,    49,    50,    51,    54,    68,    72,    89,
+     140,   141,   154,   168,   203,   223,    69,   152,   153,   154,
+     142,   150,   197,   198,   150,    56,    61,   141,   235,   243,
+     226,   243,   217,   243,   217,   243,   243,   217,   120,   130,
+     220,   235,   236,   237,   217,   141,   217,   180,   180,   181,
+     243,   243,   218,    13,   130,   217,   180,   217,   130,   130,
+      87,   130,   141,   217,    56,   142,   204,   225,   235,   243,
+     243,   226,    56,    61,   183,   204,   217,   217,   217,   217,
+     217,   129,   203,    92,    93,    94,    95,    15,    11,    13,
+     130,   110,   111,   110,   108,   109,   108,    71,    78,    79,
+      80,    91,    97,    98,    99,   101,   102,   103,   104,   105,
+     106,   107,   108,   109,   110,   111,   112,   113,   114,   115,
+     116,   121,   124,   125,   126,   127,   128,   130,    11,    13,
+      11,    13,    11,    13,    11,   144,   182,    56,    56,   221,
+     235,   236,   237,   130,   130,    30,   120,   130,   233,   235,
+     130,   130,   130,   130,   141,    11,   145,   145,   179,   183,
+      22,   179,   183,    39,   142,   170,    22,    32,    35,    36,
+      37,    38,    41,    22,   153,   154,   152,    16,    20,    24,
+     142,   188,   189,   191,   192,   193,   194,    14,   130,   217,
+     220,   235,   236,   237,   129,   203,    84,   186,    59,   142,
+     184,    84,   142,   185,   185,   225,   130,    87,   203,   129,
+     141,   129,   129,   203,   226,   226,   243,   204,    22,   225,
+      13,   129,   203,   203,   203,   203,   217,   203,   203,   129,
+     203,   217,   217,   217,   217,   217,   217,   217,   217,   217,
+     217,   217,   217,   217,   217,   217,   217,   217,   217,   217,
+     217,   217,   217,   217,   217,   217,   217,   217,   217,    10,
+      11,    13,    16,    20,    24,    25,    57,    81,   130,   207,
+     235,   129,   203,   203,   203,   203,   203,   203,   203,   203,
+     150,    56,   142,   178,    56,    56,    84,   142,   222,   144,
+     144,   120,   144,    30,   231,   232,   234,   235,   236,   237,
+     144,   144,   130,   144,   144,   144,   144,   146,    44,   158,
+     179,   157,   179,   141,   167,   203,   167,   167,   175,   203,
+     167,   167,    61,   187,   187,    15,   129,   203,   186,   129,
+      59,   185,    59,   144,   202,   202,   226,   204,    14,   206,
+     129,    88,   129,   203,    12,   203,    13,    22,    14,   129,
+     100,    25,   203,   203,    25,    25,    25,    25,    25,   129,
+     203,   130,   129,    22,    14,    22,    14,    22,    14,    22,
+      12,    18,   143,    11,    22,   185,    59,    97,   176,   203,
+     176,   130,   228,   235,   130,   142,   168,   173,   176,   177,
+     203,   231,   144,   175,   174,   203,   176,   176,   150,   144,
+      56,   155,    22,   144,   199,   200,   156,    97,   142,   190,
+     190,   192,   129,   200,   130,   142,   195,   196,   129,    23,
+     142,   227,   225,   129,    14,   203,    12,   217,    22,    14,
+     129,   226,    12,    12,    12,    12,   144,   144,    11,    22,
+     224,   129,   129,   229,   230,   235,   130,   144,   129,    22,
+     161,   176,   129,   129,   129,   129,    12,   130,   142,   147,
+      56,   184,    11,   185,   217,   197,    11,   203,    88,    14,
+      12,   129,    22,   163,   144,   217,   145,   145,    15,   129,
+     176,   176,   145,   159,   130,   129,   172,   172,   145,   145,
+     148,   162,   225,   185,   150,    22,   201,   202,   129,   150,
+      86,   150,   164,    33,    34,   142,   169,   169,   235,   130,
+     129,   129,   170,   174,   176,   145,   145,   145,   235,   145,
+      22,   199,    12,    12,   142,   151,    12,   150,   145,   130,
+     176,   145,   145,    22,   129,   170,   170,   170,   149,    45,
+     171,    22,    59,   165,    12,   176,   129,   170,   170,   160,
+     145,   129,   141,    17,    85,   142,   166,   129,   145,   172,
+     170,   150,   145,   170,   177,    86,   169,   129,   145
 };
 
   /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
 static const yytype_uint8 yyr1[] =
 {
-       0,   115,   117,   116,   118,   116,   119,   116,   120,   116,
-     121,   116,   122,   116,   123,   116,   124,   125,   126,   127,
-     128,   129,   130,   130,   131,   131,   132,   132,   133,   133,
-     134,   134,   135,   134,   136,   134,   134,   137,   134,   134,
-     134,   134,   134,   134,   134,   134,   138,   139,   134,   134,
-     134,   134,   140,   134,   134,   134,   141,   142,   134,   134,
-     143,   134,   134,   134,   134,   134,   144,   145,   145,   146,
-     147,   147,   147,   147,   147,   147,   147,   147,   148,   148,
-     148,   149,   149,   150,   150,   151,   152,   152,   153,   153,
-     154,   155,   156,   157,   157,   158,   159,   160,   161,   161,
-     162,   162,   163,   163,   163,   164,   164,   165,   165,   166,
-     166,   167,   168,   168,   168,   169,   170,   170,   171,   171,
-     171,   172,   172,   173,   173,   174,   176,   175,   177,   177,
-     178,   179,   179,   180,   181,   181,   181,   182,   182,   182,
-     183,   183,   183,   183,   183,   183,   183,   183,   183,   184,
-     183,   185,   185,   186,   186,   186,   186,   186,   186,   186,
-     186,   186,   186,   186,   186,   186,   186,   187,   187,   187,
-     187,   187,   187,   187,   187,   187,   187,   187,   187,   187,
-     187,   188,   188,   188,   188,   189,   189,   190,   190,   190,
-     190,   191,   191,   192,   192,   192,   192,   192,   192,   192,
-     192,   192,   193,   193,   193,   193,   194,   194,   195,   195,
-     195,   195,   195,   195,   195,   195,   195,   195,   195,   195,
-     195,   195,   195,   195,   195,   195,   195,   195,   195,   195,
-     195,   195,   195,   195,   195,   195,   195,   195,   195,   195,
-     195,   195,   195,   195,   195,   195,   195,   195,   195,   195,
-     195,   195,   195,   195,   195,   195,   196,   195,   195,   195,
-     195,   197,   197,   197,   197,   198,   198,   198,   198,   198,
-     199,   199,   200,   200,   201,   201,   202,   203,   203,   203,
-     204,   205,   205,   205,   206,   206,   207,   207,   208,   209,
-     210,   211,   212,   212,   213,   214,   214,   215,   215,   216,
-     216,   217,   217,   217,   217
+       0,   131,   133,   132,   134,   132,   135,   132,   136,   132,
+     137,   132,   138,   132,   139,   132,   140,   140,   141,   142,
+     143,   144,   145,   146,   147,   148,   149,   147,   150,   150,
+     151,   151,   152,   152,   153,   153,   154,   154,   155,   154,
+     156,   154,   157,   154,   154,   154,   158,   154,   154,   154,
+     154,   154,   154,   154,   154,   159,   160,   154,   154,   154,
+     154,   161,   154,   154,   154,   162,   154,   154,   163,   154,
+     164,   154,   154,   154,   154,   154,   154,   165,   166,   166,
+     167,   168,   168,   168,   168,   168,   168,   168,   168,   169,
+     169,   169,   170,   170,   171,   171,   172,   173,   173,   174,
+     174,   175,   176,   177,   178,   178,   179,   180,   181,   182,
+     183,   183,   184,   184,   185,   185,   185,   186,   186,   187,
+     187,   188,   188,   189,   190,   190,   190,   191,   192,   192,
+     193,   193,   193,   194,   194,   195,   195,   196,   198,   197,
+     199,   199,   200,   201,   201,   202,   203,   203,   203,   203,
+     203,   204,   204,   204,   205,   205,   205,   205,   205,   205,
+     205,   205,   205,   206,   205,   207,   207,   208,   208,   208,
+     208,   208,   208,   208,   208,   208,   208,   208,   208,   208,
+     208,   209,   209,   209,   209,   209,   209,   209,   209,   209,
+     209,   209,   209,   209,   209,   209,   209,   209,   209,   209,
+     209,   209,   209,   210,   210,   210,   210,   210,   211,   211,
+     212,   212,   212,   212,   213,   213,   214,   214,   214,   214,
+     214,   214,   214,   214,   214,   215,   215,   215,   215,   215,
+     216,   216,   217,   217,   217,   217,   217,   217,   217,   217,
+     217,   217,   217,   217,   217,   217,   217,   217,   217,   217,
+     217,   217,   217,   217,   217,   217,   217,   217,   217,   217,
+     217,   217,   217,   217,   217,   217,   217,   217,   217,   217,
+     217,   217,   217,   217,   217,   217,   217,   217,   217,   217,
+     218,   217,   217,   217,   217,   219,   219,   219,   219,   220,
+     220,   220,   220,   220,   221,   221,   221,   222,   222,   222,
+     223,   224,   223,   225,   225,   226,   226,   227,   227,   228,
+     229,   229,   229,   230,   231,   231,   231,   232,   232,   233,
+     233,   234,   235,   236,   237,   238,   238,   239,   240,   240,
+     241,   241,   242,   242,   243,   243,   243,   243
 };
 
   /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN.  */
-static const yytype_int8 yyr2[] =
+static const yytype_uint8 yyr2[] =
 {
        0,     2,     0,     4,     0,     3,     0,     3,     0,     3,
-       0,     3,     0,     3,     0,     3,     4,     0,     7,     0,
-       4,     0,     1,     2,     1,     2,     1,     1,     2,     2,
-       1,     4,     0,     7,     0,     6,     4,     0,     7,     7,
-       7,     6,     6,     2,     8,     8,     0,     0,    13,     9,
-      11,     8,     0,    10,     9,     7,     0,     0,    11,     2,
-       0,     8,     2,     2,     2,     1,     2,     1,     3,     1,
-       1,     1,     3,     3,     3,     3,     3,     3,     1,     2,
-       6,     1,     2,     0,     2,     0,     1,     1,     0,     1,
-       1,     1,     1,     1,     1,     0,     0,     0,     1,     1,
-       1,     1,     1,     2,     1,     2,     1,     0,     1,     1,
-       1,     3,     1,     1,     2,     3,     1,     1,     2,     3,
-       1,     1,     1,     1,     1,     3,     0,     2,     1,     1,
-       4,     1,     1,     5,     3,     3,     1,     2,     3,     1,
-       3,     5,     6,     3,     3,     5,     2,     4,     4,     0,
-       5,     1,     1,     5,     4,     5,     4,     5,     6,     5,
-       4,     5,     4,     3,     6,     4,     5,     3,     3,     3,
-       3,     3,     1,     1,     3,     3,     3,     3,     3,     3,
-       3,     1,     3,     2,     2,     3,     3,     1,     3,     2,
-       2,     3,     3,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     3,     4,     5,     4,     2,     2,     1,     1,
-       1,     1,     5,     2,     1,     2,     3,     1,     2,     1,
-       1,     1,     1,     1,     1,     4,     4,     5,     5,     1,
-       1,     3,     4,     3,     4,     4,     4,     4,     4,     1,
-       2,     2,     1,     2,     2,     1,     2,     1,     2,     1,
-       3,     1,     3,     1,     3,     4,     0,     6,     1,     1,
-       1,     3,     2,     4,     3,     3,     2,     1,     1,     1,
-       1,     1,     1,     1,     1,     2,     1,     2,     3,     1,
-       1,     1,     1,     1,     1,     1,     2,     2,     2,     2,
-       2,     2,     2,     4,     2,     1,     3,     1,     3,     1,
-       3,     1,     1,     1,     1
+       0,     3,     0,     3,     0,     3,     1,     1,     4,     0,
+       7,     0,     4,     0,     1,     0,     0,     5,     1,     2,
+       1,     2,     1,     1,     2,     2,     1,     4,     0,     7,
+       0,     6,     0,     4,     4,     5,     0,     7,     7,     7,
+       6,     6,     2,     8,     8,     0,     0,    13,     9,    11,
+       8,     0,    10,     9,     7,     0,     8,     2,     0,     8,
+       0,     9,     2,     2,     2,     2,     1,     2,     1,     3,
+       1,     1,     1,     3,     3,     3,     3,     3,     3,     1,
+       2,     6,     1,     2,     0,     2,     0,     1,     1,     0,
+       1,     1,     1,     1,     1,     1,     0,     0,     0,     0,
+       1,     1,     1,     1,     1,     2,     1,     2,     1,     0,
+       1,     1,     1,     3,     1,     1,     2,     3,     1,     1,
+       2,     3,     1,     1,     1,     1,     1,     3,     0,     2,
+       1,     1,     4,     1,     1,     5,     3,     3,     3,     3,
+       1,     2,     3,     1,     3,     5,     6,     3,     3,     5,
+       2,     4,     4,     0,     5,     1,     1,     5,     4,     5,
+       4,     5,     6,     5,     4,     5,     4,     3,     6,     4,
+       5,     3,     3,     3,     3,     3,     3,     3,     3,     3,
+       3,     1,     1,     3,     3,     3,     3,     3,     3,     3,
+       3,     3,     3,     1,     3,     2,     2,     3,     3,     3,
+       1,     3,     2,     2,     3,     3,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     3,     4,     5,     4,     4,
+       2,     2,     1,     1,     1,     1,     5,     2,     1,     2,
+       3,     1,     2,     1,     1,     1,     1,     1,     1,     4,
+       4,     5,     5,     1,     1,     3,     4,     3,     4,     4,
+       4,     4,     4,     1,     2,     2,     1,     2,     2,     1,
+       2,     1,     2,     1,     3,     1,     3,     1,     3,     4,
+       0,     6,     1,     1,     1,     3,     2,     4,     3,     3,
+       2,     1,     1,     1,     1,     1,     1,     2,     1,     1,
+       3,     0,     6,     1,     1,     1,     1,     1,     2,     1,
+       2,     3,     1,     1,     1,     1,     1,     1,     1,     2,
+       2,     2,     2,     2,     2,     2,     4,     2,     1,     3,
+       1,     3,     1,     3,     1,     1,     1,     1
 };
 
 typedef enum {
-       toketype_ival, toketype_opval
+       toketype_ival, toketype_opval, toketype_pval
 } toketypes;
 
 /* type of each token/terminal */
 static const toketypes yy_type_tab[] =
 {
-  toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival,
+  toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival,
   toketype_ival, toketype_ival, toketype_ival, toketype_ival,
   toketype_ival, toketype_ival, toketype_ival,
   toketype_ival, toketype_ival, toketype_ival,
   toketype_ival, toketype_ival, toketype_ival, toketype_ival,
   toketype_ival, toketype_ival, toketype_ival, toketype_ival,
-  toketype_ival, toketype_ival, toketype_ival, toketype_opval, toketype_opval,
-  toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval,
+  toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival,
+  toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival,
+  toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival,
+  toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival,
+  toketype_ival, toketype_ival, toketype_ival, toketype_ival,
+  toketype_ival, toketype_ival, toketype_ival, toketype_ival,
+  toketype_ival, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval,
   toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval,
-  toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival,
-  toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival,
-  toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival,
-  toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival,
+  toketype_opval, toketype_opval, toketype_opval, toketype_ival, toketype_ival, toketype_ival, toketype_ival,
   toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival,
   toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival,
-  toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival,
   toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival,
-  toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival,
+  toketype_ival, toketype_ival, toketype_ival, toketype_ival,
+  toketype_ival, toketype_ival, toketype_ival, toketype_ival,
+  toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival,
   toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival,
-  toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival,
   toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival,
-  toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_opval, toketype_opval, toketype_opval,
-  toketype_ival, toketype_opval, toketype_ival, toketype_opval, toketype_opval, toketype_opval,
-  toketype_opval, toketype_opval, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival,
-  toketype_ival, toketype_ival, toketype_ival, toketype_opval, toketype_opval, toketype_opval, toketype_opval,
-  toketype_opval, toketype_opval, toketype_opval, toketype_ival, toketype_opval, toketype_opval, toketype_opval, toketype_opval,
-  toketype_opval, toketype_opval, toketype_ival, toketype_ival, toketype_ival,
+  toketype_ival, toketype_ival, toketype_ival, toketype_ival,
+  toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival,
+  toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival,
+  toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival,
+  toketype_ival, toketype_ival, toketype_ival, toketype_opval, toketype_opval, toketype_opval,
+  toketype_ival, toketype_opval, toketype_ival, toketype_opval, toketype_ival, toketype_ival,
+  toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_ival,
+  toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival,
+  toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval,
+  toketype_ival, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval,
+  toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_opval,
+  toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_ival,
   toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval,
-  toketype_ival, toketype_opval, toketype_opval, toketype_opval,
+  toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_ival,
   toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval,
-  toketype_opval, toketype_ival, toketype_opval, toketype_opval, toketype_opval,
-  toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_ival, toketype_opval,
+  toketype_opval, toketype_opval, toketype_ival, toketype_opval, toketype_opval, toketype_opval,
   toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval,
-  toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_ival,
-  toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval,
+  toketype_opval, toketype_opval, toketype_opval, toketype_ival, toketype_opval, toketype_opval, toketype_pval,
+  toketype_opval, toketype_opval, toketype_ival, toketype_opval, toketype_opval,
   toketype_opval, toketype_opval, toketype_opval, toketype_opval,
-  toketype_ival, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval,
-  toketype_opval, toketype_opval, toketype_opval, toketype_opval
+  toketype_opval, toketype_opval, toketype_ival, toketype_opval, toketype_opval, toketype_opval, toketype_opval,
+  toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval
 };
 
 /* Generated from:
- * 0caf1eb1cc4750131dc71e3a22ead383ed9a123dec61ccd23408ff13441fafde perly.y
+ * 0a5fcd15cf0b7afb57ade6ceaf68037a38dd194acd9d60d3e4ad99c15233af75 perly.y
  * acf1cbfd2545faeaaa58b1cf0cf9d7f98b5be0752eb7a54528ef904a9e2e1ca7 regen_perly.pl
- * ex: set ro: */
+ * ex: set ro ft=c: */
index 55321fa..c0c0909 100644 (file)
 %union {
     I32        ival; /* __DEFAULT__ (marker for regen_perly.pl;
                                must always be 1st union member) */
-    char *pval;
+    void *pval;
     OP *opval;
     GV *gvval;
 }
 
 %token <ival> GRAMPROG GRAMEXPR GRAMBLOCK GRAMBARESTMT GRAMFULLSTMT GRAMSTMTSEQ GRAMSUBSIGNATURE
 
+/* Tokens emitted by toke.c for simple punctiation characters - &, {, }, etc... */
 %token <ival> PERLY_AMPERSAND
 %token <ival> PERLY_BRACE_OPEN
 %token <ival> PERLY_BRACE_CLOSE
 %token <ival> PERLY_SNAIL
 %token <ival> PERLY_STAR
 
-%token <opval> BAREWORD METHOD FUNCMETH THING PMFUNC PRIVATEREF QWLIST
+/* Tokens emitted by toke.c on simple keywords */
+%token <ival> KW_FORMAT KW_PACKAGE KW_CLASS
+%token <ival> KW_LOCAL KW_MY KW_FIELD
+%token <ival> KW_IF KW_ELSE KW_ELSIF KW_UNLESS
+%token <ival> KW_FOR KW_UNTIL KW_WHILE KW_CONTINUE
+%token <ival> KW_GIVEN KW_WHEN KW_DEFAULT
+%token <ival> KW_TRY KW_CATCH KW_FINALLY KW_DEFER
+%token <ival> KW_REQUIRE KW_DO
+
+/* The 'use' and 'no' keywords both emit this */
+%token <ival> KW_USE_or_NO
+
+/* The 'sub' keyword is a bit special; four different tokens depending on
+ *   named-vs-anon, and whether signatures are in effect */
+%token <ival> KW_SUB_named KW_SUB_named_sig KW_SUB_anon KW_SUB_anon_sig
+%token <ival> KW_METHOD_named KW_METHOD_anon
+
+/* Tokens emitted in other situations */
+%token <opval> BAREWORD METHCALL0 METHCALL THING PMFUNC PRIVATEREF QWLIST
 %token <opval> FUNC0OP FUNC0SUB UNIOPSUB LSTOPSUB
 %token <opval> PLUGEXPR PLUGSTMT
 %token <opval> LABEL
-%token <ival> FORMAT SUB SIGSUB ANONSUB ANON_SIGSUB PACKAGE USE
-%token <ival> WHILE UNTIL IF UNLESS ELSE ELSIF CONTINUE FOR
-%token <ival> GIVEN WHEN DEFAULT
-%token <ival> TRY CATCH FINALLY
 %token <ival> LOOPEX DOTDOT YADAYADA
 %token <ival> FUNC0 FUNC1 FUNC UNIOP LSTOP
-%token <ival> MULOP ADDOP
-%token <ival> DOLSHARP DO HASHBRACK NOAMP
-%token <ival> LOCAL MY REQUIRE
+%token <ival> POWOP MULOP ADDOP
+%token <ival> DOLSHARP HASHBRACK NOAMP
 %token <ival> COLONATTR FORMLBRACK FORMRBRACK
 %token <ival> SUBLEXSTART SUBLEXEND
-%token <ival> DEFER
+%token <ival> PHASER
 
 %type <ival> grammar remember mremember
-%type <ival>  startsub startanonsub startformsub
+%type <ival>  startsub startanonsub startanonmethod startformsub
 
 %type <ival> mintro
 
+%type <ival>  sigsub_or_method_named
 %type <opval> stmtseq fullstmt labfullstmt barestmt block mblock else finally
 %type <opval> expr term subscripted scalar ary hsh arylen star amper sideff
 %type <opval> condition
+%type <opval> catch_paren
 %type <opval> empty
 %type <opval> sliceme kvslice gelem
 %type <opval> listexpr nexpr texpr iexpr mexpr mnexpr
-%type <opval> optlistexpr optexpr optrepl indirob listop method
+%type <opval> optlistexpr optexpr optrepl indirob listop methodname
 %type <opval> formname subname proto cont my_scalar my_var
 %type <opval> list_of_scalars my_list_of_scalars refgen_topic formblock
 %type <opval> subattrlist myattrlist myattrterm myterm
+%type <pval>  fieldvar /* pval is PADNAME */
+%type <opval> optfieldattrlist fielddecl
 %type <opval> termbinop termunop anonymous termdo
 %type <opval> termrelop relopchain termeqop eqopchain
 %type <ival>  sigslurpsigil
 %nonassoc <ival> PREC_LOW
 %nonassoc LOOPEX
 
-%left <ival> OROP
-%left <ival> ANDOP
+%nonassoc <pval> PLUGIN_LOW_OP
+%left <ival> OROP <pval> PLUGIN_LOGICAL_OR_LOW_OP
+%left <ival> ANDOP <pval> PLUGIN_LOGICAL_AND_LOW_OP
 %right <ival> NOTOP
 %nonassoc LSTOP LSTOPSUB
 %left PERLY_COMMA
-%right <ival> ASSIGNOP
+%right <ival> ASSIGNOP <pval> PLUGIN_ASSIGN_OP
 %right <ival> PERLY_QUESTION_MARK PERLY_COLON
 %nonassoc DOTDOT
-%left <ival> OROR DORDOR
-%left <ival> ANDAND
+%left <ival> OROR DORDOR <pval> PLUGIN_LOGICAL_OR_OP
+%left <ival> ANDAND <pval> PLUGIN_LOGICAL_AND_OP
 %left <ival> BITOROP
 %left <ival> BITANDOP
 %left <ival> CHEQOP NCEQOP
 %left <ival> CHRELOP NCRELOP
+%nonassoc <pval> PLUGIN_REL_OP
 %nonassoc UNIOP UNIOPSUB
-%nonassoc REQUIRE
+%nonassoc KW_REQUIRE
 %left <ival> SHIFTOP
-%left ADDOP
-%left MULOP
+%left ADDOP <pval> PLUGIN_ADD_OP
+%left MULOP <pval> PLUGIN_MUL_OP
 %left <ival> MATCHOP
 %right <ival> PERLY_EXCLAMATION_MARK PERLY_TILDE UMINUS REFGEN
-%right <ival> POWOP
+%right POWOP <pval> PLUGIN_POW_OP
 %nonassoc <ival> PREINC PREDEC POSTINC POSTDEC POSTJOIN
+%nonassoc <pval> PLUGIN_HIGH_OP
 %left <ival> ARROW
 %nonassoc <ival> PERLY_PAREN_CLOSE
 %left <ival> PERLY_PAREN_OPEN
@@ -218,6 +239,14 @@ grammar    :       GRAMPROG
                        }
        ;
 
+/* Either a signatured 'sub' or 'method' keyword */
+sigsub_or_method_named
+       :       KW_SUB_named_sig
+                       { $$ = KW_SUB_named_sig; }
+       |       KW_METHOD_named
+                       { $$ = KW_METHOD_named; }
+       ;
+
 /* An ordinary block */
 block  :       PERLY_BRACE_OPEN remember stmtseq PERLY_BRACE_CLOSE
                        { if (parser->copline > (line_t)$PERLY_BRACE_OPEN)
@@ -255,6 +284,18 @@ mremember: %empty  /* start a partial lexical scope */
                          parser->parsed_sub = 0; }
        ;
 
+/* The parenthesized variable of a catch block */
+catch_paren:   empty
+                       /* not really valid grammar but we detect it in the
+                        * action block to throw a nicer error message */
+       |       PERLY_PAREN_OPEN
+                       { parser->in_my = 1; }
+               scalar
+                       { parser->in_my = 0; intro_my(); }
+               PERLY_PAREN_CLOSE
+                       { $$ = $scalar; }
+       ;
+
 /* A sequence of statements in the program */
 stmtseq
        :       empty
@@ -305,7 +346,7 @@ labfullstmt:        LABEL barestmt
 /* A bare statement, lacking label and other aspects of state op */
 barestmt:      PLUGSTMT
                        { $$ = $PLUGSTMT; }
-       |       FORMAT startformsub formname formblock
+       |       KW_FORMAT startformsub formname formblock
                        {
                          CV *fmtcv = PL_compcv;
                          newFORM($startformsub, $formname, $formblock);
@@ -315,7 +356,7 @@ barestmt:   PLUGSTMT
                          }
                          parser->parsed_sub = 1;
                        }
-       |       SUB subname startsub
+       |       KW_SUB_named subname startsub
                     /* sub declaration or definition not within scope
                        of 'use feature "signatures"'*/
                        {
@@ -334,79 +375,128 @@ barestmt:        PLUGSTMT
                          intro_my();
                          parser->parsed_sub = 1;
                        }
-       |       SIGSUB subname startsub
+       |       sigsub_or_method_named subname startsub
                     /* sub declaration or definition under 'use feature
                      * "signatures"'. (Note that a signature isn't
                      * allowed in a declaration)
                      */
                        {
                           init_named_cv(PL_compcv, $subname);
+                         if($sigsub_or_method_named == KW_METHOD_named) {
+                             croak_kw_unless_class("method");
+                             class_prepare_method_parse(PL_compcv);
+                         }
                          parser->in_my = 0;
                          parser->in_my_stash = NULL;
                        }
                     subattrlist optsigsubbody
                        {
+                         OP *body = $optsigsubbody;
+
                          SvREFCNT_inc_simple_void(PL_compcv);
                          $subname->op_type == OP_CONST
-                             ? newATTRSUB($startsub, $subname, NULL, $subattrlist, $optsigsubbody)
-                             : newMYSUB(  $startsub, $subname, NULL, $subattrlist, $optsigsubbody)
+                             ? newATTRSUB($startsub, $subname, NULL, $subattrlist, body)
+                             : newMYSUB(  $startsub, $subname, NULL, $subattrlist, body)
                          ;
                          $$ = NULL;
                          intro_my();
                          parser->parsed_sub = 1;
                        }
-       |       PACKAGE BAREWORD[version] BAREWORD[package] PERLY_SEMICOLON
+       |       PHASER startsub
+                       {
+                         switch($PHASER) {
+                             case KEY_ADJUST:
+                                croak_kw_unless_class("ADJUST");
+                                class_prepare_method_parse(PL_compcv);
+                                break;
+                             default:
+                                NOT_REACHED;
+                         }
+                       }
+                   optsubbody
+                       {
+                         OP *body = $optsubbody;
+                         SvREFCNT_inc_simple_void(PL_compcv);
+
+                         CV *cv;
+
+                         switch($PHASER) {
+                             case KEY_ADJUST:
+                                 cv = newATTRSUB($startsub, NULL, NULL, NULL, body);
+                                 class_add_ADJUST(PL_curstash, cv);
+                                 break;
+                         }
+                         $$ = NULL;
+                       }
+       |       KW_PACKAGE BAREWORD[version] BAREWORD[package] PERLY_SEMICOLON
+                   /* version and package appear in the reverse order to what may be
+                    * expected, because toke.c has already pushed both of them to a stack
+                    * by calling force_next() from within force_version().
+                    * When the parser pops them back out again they appear swapped */
+                       {
+                         package($package);
+                         if ($version)
+                             package_version($version);
+                         $$ = NULL;
+                       }
+       |       KW_CLASS BAREWORD[version] BAREWORD[package] subattrlist PERLY_SEMICOLON
                        {
                          package($package);
                          if ($version)
                              package_version($version);
                          $$ = NULL;
+                         class_setup_stash(PL_curstash);
+                         if ($subattrlist) {
+                             class_apply_attributes(PL_curstash, $subattrlist);
+                         }
                        }
-       |       USE startsub
+       |       KW_USE_or_NO startsub
                        { CvSPECIAL_on(PL_compcv); /* It's a BEGIN {} */ }
                BAREWORD[version] BAREWORD[module] optlistexpr PERLY_SEMICOLON
+                   /* version and package appear in reverse order for the same reason as
+                    * KW_PACKAGE; see comment above */
                        {
                          SvREFCNT_inc_simple_void(PL_compcv);
-                         utilize($USE, $startsub, $version, $module, $optlistexpr);
+                         utilize($KW_USE_or_NO, $startsub, $version, $module, $optlistexpr);
                          parser->parsed_sub = 1;
                          $$ = NULL;
                        }
-       |       IF PERLY_PAREN_OPEN remember mexpr PERLY_PAREN_CLOSE mblock else
+       |       KW_IF PERLY_PAREN_OPEN remember mexpr PERLY_PAREN_CLOSE mblock else
                        {
                          $$ = block_end($remember,
                              newCONDOP(0, $mexpr, op_scope($mblock), $else));
-                         parser->copline = (line_t)$IF;
+                         parser->copline = (line_t)$KW_IF;
                        }
-       |       UNLESS PERLY_PAREN_OPEN remember mexpr PERLY_PAREN_CLOSE mblock else
+       |       KW_UNLESS PERLY_PAREN_OPEN remember mexpr PERLY_PAREN_CLOSE mblock else
                        {
                          $$ = block_end($remember,
                               newCONDOP(0, $mexpr, $else, op_scope($mblock)));
-                         parser->copline = (line_t)$UNLESS;
+                         parser->copline = (line_t)$KW_UNLESS;
                        }
-       |       GIVEN PERLY_PAREN_OPEN remember mexpr PERLY_PAREN_CLOSE mblock
+       |       KW_GIVEN PERLY_PAREN_OPEN remember mexpr PERLY_PAREN_CLOSE mblock
                        {
                          $$ = block_end($remember, newGIVENOP($mexpr, op_scope($mblock), 0));
-                         parser->copline = (line_t)$GIVEN;
+                         parser->copline = (line_t)$KW_GIVEN;
                        }
-       |       WHEN PERLY_PAREN_OPEN remember mexpr PERLY_PAREN_CLOSE mblock
+       |       KW_WHEN PERLY_PAREN_OPEN remember mexpr PERLY_PAREN_CLOSE mblock
                        { $$ = block_end($remember, newWHENOP($mexpr, op_scope($mblock))); }
-       |       DEFAULT block
+       |       KW_DEFAULT block
                        { $$ = newWHENOP(0, op_scope($block)); }
-       |       WHILE PERLY_PAREN_OPEN remember texpr PERLY_PAREN_CLOSE mintro mblock cont
+       |       KW_WHILE PERLY_PAREN_OPEN remember texpr PERLY_PAREN_CLOSE mintro mblock cont
                        {
                          $$ = block_end($remember,
                                  newWHILEOP(0, 1, NULL,
                                      $texpr, $mblock, $cont, $mintro));
-                         parser->copline = (line_t)$WHILE;
+                         parser->copline = (line_t)$KW_WHILE;
                        }
-       |       UNTIL PERLY_PAREN_OPEN remember iexpr PERLY_PAREN_CLOSE mintro mblock cont
+       |       KW_UNTIL PERLY_PAREN_OPEN remember iexpr PERLY_PAREN_CLOSE mintro mblock cont
                        {
                          $$ = block_end($remember,
                                  newWHILEOP(0, 1, NULL,
                                      $iexpr, $mblock, $cont, $mintro));
-                         parser->copline = (line_t)$UNTIL;
+                         parser->copline = (line_t)$KW_UNTIL;
                        }
-       |       FOR PERLY_PAREN_OPEN remember mnexpr[init_mnexpr] PERLY_SEMICOLON
+       |       KW_FOR PERLY_PAREN_OPEN remember mnexpr[init_mnexpr] PERLY_SEMICOLON
                        { parser->expect = XTERM; }
                texpr PERLY_SEMICOLON
                        { parser->expect = XTERM; }
@@ -424,29 +514,29 @@ barestmt: PLUGSTMT
                          }
                          PL_hints |= HINT_BLOCK_SCOPE;
                          $$ = block_end($remember, forop);
-                         parser->copline = (line_t)$FOR;
+                         parser->copline = (line_t)$KW_FOR;
                        }
-       |       FOR MY remember my_scalar PERLY_PAREN_OPEN mexpr PERLY_PAREN_CLOSE mblock cont
+       |       KW_FOR KW_MY remember my_scalar PERLY_PAREN_OPEN mexpr PERLY_PAREN_CLOSE mblock cont
                        {
                          $$ = block_end($remember, newFOROP(0, $my_scalar, $mexpr, $mblock, $cont));
-                         parser->copline = (line_t)$FOR;
+                         parser->copline = (line_t)$KW_FOR;
                        }
-       |       FOR MY remember PERLY_PAREN_OPEN my_list_of_scalars PERLY_PAREN_CLOSE PERLY_PAREN_OPEN mexpr PERLY_PAREN_CLOSE mblock cont
+       |       KW_FOR KW_MY remember PERLY_PAREN_OPEN my_list_of_scalars PERLY_PAREN_CLOSE PERLY_PAREN_OPEN mexpr PERLY_PAREN_CLOSE mblock cont
                        {
                           if ($my_list_of_scalars->op_type == OP_PADSV)
                             /* degenerate case of 1 var: for my ($x) ....
                                Flag it so it can be special-cased in newFOROP */
                                 $my_list_of_scalars->op_flags |= OPf_PARENS;
                          $$ = block_end($remember, newFOROP(0, $my_list_of_scalars, $mexpr, $mblock, $cont));
-                         parser->copline = (line_t)$FOR;
+                         parser->copline = (line_t)$KW_FOR;
                        }
-       |       FOR scalar PERLY_PAREN_OPEN remember mexpr PERLY_PAREN_CLOSE mblock cont
+       |       KW_FOR scalar PERLY_PAREN_OPEN remember mexpr PERLY_PAREN_CLOSE mblock cont
                        {
                          $$ = block_end($remember, newFOROP(0,
                                      op_lvalue($scalar, OP_ENTERLOOP), $mexpr, $mblock, $cont));
-                         parser->copline = (line_t)$FOR;
+                         parser->copline = (line_t)$KW_FOR;
                        }
-       |       FOR my_refgen remember my_var
+       |       KW_FOR my_refgen remember my_var
                        { parser->in_my = 0; $<opval>$ = my($my_var); }[variable]
                PERLY_PAREN_OPEN mexpr PERLY_PAREN_CLOSE mblock cont
                        {
@@ -459,33 +549,36 @@ barestmt: PLUGSTMT
                                            OP_ENTERLOOP),
                                         $mexpr, $mblock, $cont)
                          );
-                         parser->copline = (line_t)$FOR;
+                         parser->copline = (line_t)$KW_FOR;
                        }
-       |       FOR REFGEN refgen_topic PERLY_PAREN_OPEN remember mexpr PERLY_PAREN_CLOSE mblock cont
+       |       KW_FOR REFGEN refgen_topic PERLY_PAREN_OPEN remember mexpr PERLY_PAREN_CLOSE mblock cont
                        {
                          $$ = block_end($remember, newFOROP(
                                0, op_lvalue(newUNOP(OP_REFGEN, 0,
                                                     $refgen_topic),
                                             OP_ENTERLOOP), $mexpr, $mblock, $cont));
-                         parser->copline = (line_t)$FOR;
+                         parser->copline = (line_t)$KW_FOR;
                        }
-       |       FOR PERLY_PAREN_OPEN remember mexpr PERLY_PAREN_CLOSE mblock cont
+       |       KW_FOR PERLY_PAREN_OPEN remember mexpr PERLY_PAREN_CLOSE mblock cont
                        {
                          $$ = block_end($remember,
                                  newFOROP(0, NULL, $mexpr, $mblock, $cont));
-                         parser->copline = (line_t)$FOR;
+                         parser->copline = (line_t)$KW_FOR;
                        }
-       |       TRY mblock[try] CATCH PERLY_PAREN_OPEN 
-                       { parser->in_my = 1; }
-               remember scalar 
-                       { parser->in_my = 0; intro_my(); }
-               PERLY_PAREN_CLOSE mblock[catch] finally
+       |       KW_TRY mblock[try] KW_CATCH remember catch_paren[scalar]
+                       {
+                         if(!$scalar) {
+                             yyerror("catch block requires a (VAR)");
+                             YYERROR;
+                         }
+                       }
+               mblock[catch] finally
                        {
                          $$ = newTRYCATCHOP(0,
                                  $try, $scalar, block_end($remember, op_scope($catch)));
                          if($finally)
                              $$ = op_wrap_finally($$, $finally);
-                         parser->copline = (line_t)$TRY;
+                         parser->copline = (line_t)$KW_TRY;
                        }
        |       block cont
                        {
@@ -493,12 +586,32 @@ barestmt: PLUGSTMT
                          $$ = newWHILEOP(0, 1, NULL,
                                  NULL, $block, $cont, 0);
                        }
-       |       PACKAGE BAREWORD[version] BAREWORD[package] PERLY_BRACE_OPEN remember
+       |       KW_PACKAGE BAREWORD[version] BAREWORD[package] PERLY_BRACE_OPEN remember
+                       {
+                         package($package);
+                         if ($version) {
+                             package_version($version);
+                         }
+                       }
+               stmtseq PERLY_BRACE_CLOSE
+                       {
+                         /* a block is a loop that happens once */
+                         $$ = newWHILEOP(0, 1, NULL,
+                                 NULL, block_end($remember, $stmtseq), NULL, 0);
+                         if (parser->copline > (line_t)$PERLY_BRACE_OPEN)
+                             parser->copline = (line_t)$PERLY_BRACE_OPEN;
+                       }
+       |       KW_CLASS BAREWORD[version] BAREWORD[package] subattrlist PERLY_BRACE_OPEN remember
                        {
                          package($package);
+
                          if ($version) {
                              package_version($version);
                          }
+                         class_setup_stash(PL_curstash);
+                         if ($subattrlist) {
+                             class_apply_attributes(PL_curstash, $subattrlist);
+                         }
                        }
                stmtseq PERLY_BRACE_CLOSE
                        {
@@ -508,16 +621,21 @@ barestmt: PLUGSTMT
                          if (parser->copline > (line_t)$PERLY_BRACE_OPEN)
                              parser->copline = (line_t)$PERLY_BRACE_OPEN;
                        }
+       |       fielddecl PERLY_SEMICOLON
+                       {
+                         $$ = $fielddecl;
+                       }
        |       sideff PERLY_SEMICOLON
                        {
                          $$ = $sideff;
                        }
-       |       DEFER mblock
+       |       KW_DEFER mblock
                        {
                          $$ = newDEFEROP(0, op_scope($2));
                        }
        |       YADAYADA PERLY_SEMICOLON
                        {
+                          /* diag_listed_as: Unimplemented */
                          $$ = newLISTOP(OP_DIE, 0, newOP(OP_PUSHMARK, 0),
                                newSVOP(OP_CONST, 0, newSVpvs("Unimplemented")));
                        }
@@ -560,31 +678,31 @@ sideff    :       error
                        { $$ = NULL; }
        |       expr[body]
                        { $$ = $body; }
-       |       expr[body] IF condition
+       |       expr[body] KW_IF condition
                        { $$ = newLOGOP(OP_AND, 0, $condition, $body); }
-       |       expr[body] UNLESS condition
+       |       expr[body] KW_UNLESS condition
                        { $$ = newLOGOP(OP_OR, 0, $condition, $body); }
-       |       expr[body] WHILE condition
+       |       expr[body] KW_WHILE condition
                        { $$ = newLOOPOP(OPf_PARENS, 1, scalar($condition), $body); }
-       |       expr[body] UNTIL iexpr
+       |       expr[body] KW_UNTIL iexpr
                        { $$ = newLOOPOP(OPf_PARENS, 1, $iexpr, $body); }
-       |       expr[body] FOR condition
+       |       expr[body] KW_FOR condition
                        { $$ = newFOROP(0, NULL, $condition, $body, NULL);
-                         parser->copline = (line_t)$FOR; }
-       |       expr[body] WHEN condition
+                         parser->copline = (line_t)$KW_FOR; }
+       |       expr[body] KW_WHEN condition
                        { $$ = newWHENOP($condition, op_scope($body)); }
        ;
 
 /* else and elsif blocks */
 else
        :       empty
-       |       ELSE mblock
+       |       KW_ELSE mblock
                        {
                          ($mblock)->op_flags |= OPf_PARENS;
                          $$ = op_scope($mblock);
                        }
-       |       ELSIF PERLY_PAREN_OPEN mexpr PERLY_PAREN_CLOSE mblock else[else.recurse]
-                       { parser->copline = (line_t)$ELSIF;
+       |       KW_ELSIF PERLY_PAREN_OPEN mexpr PERLY_PAREN_CLOSE mblock else[else.recurse]
+                       { parser->copline = (line_t)$KW_ELSIF;
                            $$ = newCONDOP(0,
                                newSTATEOP(OPf_SPECIAL,NULL,$mexpr),
                                op_scope($mblock), $[else.recurse]);
@@ -595,14 +713,14 @@ else
 /* Continue blocks */
 cont
        :       empty
-       |       CONTINUE block
+       |       KW_CONTINUE block
                        { $$ = op_scope($block); }
        ;
 
 /* Finally blocks */
 finally        :       %empty
                        { $$ = NULL; }
-       |       FINALLY block
+       |       KW_FINALLY block
                        { $$ = op_scope($block); }
        ;
 
@@ -655,6 +773,11 @@ startanonsub:      %empty  /* start an anonymous subroutine scope */
                            SAVEFREESV(PL_compcv); }
        ;
 
+startanonmethod:       %empty  /* start an anonymous method scope */
+                       { $$ = start_subparse(FALSE, CVf_ANON|CVf_IsMETHOD);
+                           SAVEFREESV(PL_compcv); }
+       ;
+
 startformsub:  %empty  /* start a format subroutine scope */
                        { $$ = start_subparse(TRUE, 0);
                            SAVEFREESV(PL_compcv); }
@@ -675,7 +798,12 @@ proto
 subattrlist
        :       empty
        |       COLONATTR THING
-                       { $$ = $THING; }
+                       {
+                         OP *attrlist = $THING;
+                         if(attrlist && !PL_parser->sig_seen)
+                             attrlist = apply_builtin_cv_attributes(PL_compcv, attrlist);
+                         $$ = attrlist;
+                       }
        |       COLONATTR
                        { $$ = NULL; }
        ;
@@ -709,15 +837,15 @@ sigslurpsigil:
 /* @, %, @foo, %foo */
 sigslurpelem: sigslurpsigil sigvarname sigdefault/* def only to catch errors */ 
                         {
-                            I32 sigil   = $sigslurpsigil;
-                            OP *var     = $sigvarname;
-                            OP *defexpr = $sigdefault;
+                            I32 sigil = $sigslurpsigil;
+                            OP *var   = $sigvarname;
+                            OP *defop = $sigdefault;
 
                             if (parser->sig_slurpy)
                                 yyerror("Multiple slurpy parameters not allowed");
                             parser->sig_slurpy = (char)sigil;
 
-                            if (defexpr)
+                            if (defop)
                                 yyerror("A slurpy parameter may not have "
                                         "a default value");
 
@@ -729,26 +857,35 @@ sigslurpelem: sigslurpsigil sigvarname sigdefault/* def only to catch errors */
 sigdefault
        :       empty
         |       ASSIGNOP
-                        { $$ = newOP(OP_NULL, 0); }
+                        { $$ = newARGDEFELEMOP(0, newOP(OP_NULL, 0), parser->sig_elems); }
         |       ASSIGNOP term
-                        { $$ = $term; }
+                        {
+                            I32 flags = 0;
+                            if ($ASSIGNOP == OP_DORASSIGN)
+                                flags |= OPpARG_IF_UNDEF << 8;
+                            if ($ASSIGNOP == OP_ORASSIGN)
+                                flags |= OPpARG_IF_FALSE << 8;
+                            $$ = newARGDEFELEMOP(flags, $term, parser->sig_elems);
+                        }
 
 
 /* subroutine signature scalar element: e.g. '$x', '$=', '$x = $default' */
 sigscalarelem:
                 PERLY_DOLLAR sigvarname sigdefault
                         {
-                            OP *var     = $sigvarname;
-                            OP *defexpr = $sigdefault;
+                            OP *var   = $sigvarname;
+                            OP *defop = $sigdefault;
 
                             if (parser->sig_slurpy)
                                 yyerror("Slurpy parameter not last");
 
                             parser->sig_elems++;
 
-                            if (defexpr) {
+                            if (defop) {
                                 parser->sig_optelems++;
 
+                                OP *defexpr = cLOGOPx(defop)->op_first;
+
                                 if (   defexpr->op_type == OP_NULL
                                     && !(defexpr->op_flags & OPf_KIDS))
                                 {
@@ -756,17 +893,10 @@ sigscalarelem:
                                     if (var)
                                         yyerror("Optional parameter "
                                                     "lacks default expression");
-                                    op_free(defexpr);
+                                    op_free(defop);
                                 }
                                 else { 
                                     /* a normal '=default' expression */ 
-                                    OP *defop = (OP*)alloc_LOGOP(OP_ARGDEFELEM,
-                                                        defexpr,
-                                                        LINKLIST(defexpr));
-                                    /* re-purpose op_targ to hold @_ index */
-                                    defop->op_targ =
-                                        (PADOFFSET)(parser->sig_elems - 1);
-
                                     if (var) {
                                         var->op_flags |= OPf_STACKED;
                                         (void)op_sibling_splice(var,
@@ -852,7 +982,7 @@ subsigguts:
                             struct op_argcheck_aux *aux;
                             OP            *check;
 
-                           if (!FEATURE_SIGNATURES_IS_ENABLED)
+                           if (!FEATURE_SIGNATURES_IS_ENABLED && !CvIsMETHOD(PL_compcv))
                                Perl_croak(aTHX_ "Experimental "
                                     "subroutine signatures not enabled");
 
@@ -939,8 +1069,12 @@ sigsubbody:       remember optsubsignature PERLY_BRACE_OPEN stmtseq PERLY_BRACE_CLOSE
 /* Ordinary expressions; logical combinations */
 expr   :       expr[lhs] ANDOP expr[rhs]
                        { $$ = newLOGOP(OP_AND, 0, $lhs, $rhs); }
+       |       expr[lhs] PLUGIN_LOGICAL_AND_LOW_OP[op] expr[rhs]
+                       { $$ = build_infix_plugin($lhs, $rhs, $op); }
        |       expr[lhs] OROP[operator] expr[rhs]
                        { $$ = newLOGOP($operator, 0, $lhs, $rhs); }
+       |       expr[lhs] PLUGIN_LOGICAL_OR_LOW_OP[op] expr[rhs]
+                       { $$ = build_infix_plugin($lhs, $rhs, $op); }
        |       listexpr %prec PREC_LOW
        ;
 
@@ -964,28 +1098,28 @@ listop   :       LSTOP indirob listexpr /* map {...} @args or print $fh @args */
                        { $$ = op_convert_list($FUNC, OPf_STACKED,
                                op_prepend_elem(OP_LIST, newGVREF($FUNC,$indirob), $expr) );
                        }
-       |       term ARROW method PERLY_PAREN_OPEN optexpr PERLY_PAREN_CLOSE /* $foo->bar(list) */
+       |       term ARROW methodname PERLY_PAREN_OPEN optexpr PERLY_PAREN_CLOSE /* $foo->bar(list) */
                        { $$ = op_convert_list(OP_ENTERSUB, OPf_STACKED,
                                op_append_elem(OP_LIST,
                                    op_prepend_elem(OP_LIST, scalar($term), $optexpr),
-                                   newMETHOP(OP_METHOD, 0, $method)));
+                                   newMETHOP(OP_METHOD, 0, $methodname)));
                        }
-       |       term ARROW method                     /* $foo->bar */
+       |       term ARROW methodname                     /* $foo->bar */
                        { $$ = op_convert_list(OP_ENTERSUB, OPf_STACKED,
                                op_append_elem(OP_LIST, scalar($term),
-                                   newMETHOP(OP_METHOD, 0, $method)));
+                                   newMETHOP(OP_METHOD, 0, $methodname)));
                        }
-       |       METHOD indirob optlistexpr           /* new Class @args */
+       |       METHCALL0 indirob optlistexpr           /* new Class @args */
                        { $$ = op_convert_list(OP_ENTERSUB, OPf_STACKED,
                                op_append_elem(OP_LIST,
                                    op_prepend_elem(OP_LIST, $indirob, $optlistexpr),
-                                   newMETHOP(OP_METHOD, 0, $METHOD)));
+                                   newMETHOP(OP_METHOD, 0, $METHCALL0)));
                        }
-       |       FUNCMETH indirob PERLY_PAREN_OPEN optexpr PERLY_PAREN_CLOSE    /* method $object (@args) */
+       |       METHCALL indirob PERLY_PAREN_OPEN optexpr PERLY_PAREN_CLOSE    /* method $object (@args) */
                        { $$ = op_convert_list(OP_ENTERSUB, OPf_STACKED,
                                op_append_elem(OP_LIST,
                                    op_prepend_elem(OP_LIST, $indirob, $optexpr),
-                                   newMETHOP(OP_METHOD, 0, $FUNCMETH)));
+                                   newMETHOP(OP_METHOD, 0, $METHCALL)));
                        }
        |       LSTOP optlistexpr                    /* print @args */
                        { $$ = op_convert_list($LSTOP, 0, $optlistexpr); }
@@ -1004,7 +1138,7 @@ listop    :       LSTOP indirob listexpr /* map {...} @args or print $fh @args */
        ;
 
 /* Names of methods. May use $object->$methodname */
-method :       METHOD
+methodname:    METHCALL0
        |       scalar
        ;
 
@@ -1073,17 +1207,27 @@ subscripted:    gelem PERLY_BRACE_OPEN expr PERLY_SEMICOLON PERLY_BRACE_CLOSE
     ;
 
 /* Binary operators between terms */
-termbinop:     term[lhs] ASSIGNOP term[rhs]                     /* $x = $y, $x += $y */
+termbinop:     term[lhs] PLUGIN_HIGH_OP[op] term[rhs]
+                       { $$ = build_infix_plugin($lhs, $rhs, $op); }
+       |       term[lhs] ASSIGNOP term[rhs]                     /* $x = $y, $x += $y */
                        { $$ = newASSIGNOP(OPf_STACKED, $lhs, $ASSIGNOP, $rhs); }
+       |       term[lhs] PLUGIN_ASSIGN_OP[op] term[rhs]
+                       { $$ = build_infix_plugin($lhs, $rhs, $op); }
        |       term[lhs] POWOP term[rhs]                        /* $x ** $y */
                        { $$ = newBINOP($POWOP, 0, scalar($lhs), scalar($rhs)); }
+       |       term[lhs] PLUGIN_POW_OP[op] term[rhs]
+                       { $$ = build_infix_plugin($lhs, $rhs, $op); }
        |       term[lhs] MULOP term[rhs]                        /* $x * $y, $x x $y */
                        {   if ($MULOP != OP_REPEAT)
                                scalar($lhs);
                            $$ = newBINOP($MULOP, 0, $lhs, scalar($rhs));
                        }
+       |       term[lhs] PLUGIN_MUL_OP[op] term[rhs]
+                       { $$ = build_infix_plugin($lhs, $rhs, $op); }
        |       term[lhs] ADDOP term[rhs]                        /* $x + $y */
                        { $$ = newBINOP($ADDOP, 0, scalar($lhs), scalar($rhs)); }
+       |       term[lhs] PLUGIN_ADD_OP[op] term[rhs]
+                       { $$ = build_infix_plugin($lhs, $rhs, $op); }
        |       term[lhs] SHIFTOP term[rhs]                      /* $x >> $y, $x << $y */
                        { $$ = newBINOP($SHIFTOP, 0, scalar($lhs), scalar($rhs)); }
        |       termrelop %prec PREC_LOW               /* $x > $y, etc. */
@@ -1098,12 +1242,18 @@ termbinop:      term[lhs] ASSIGNOP term[rhs]                     /* $x = $y, $x += $y
                        { $$ = newRANGE($DOTDOT, scalar($lhs), scalar($rhs)); }
        |       term[lhs] ANDAND term[rhs]                       /* $x && $y */
                        { $$ = newLOGOP(OP_AND, 0, $lhs, $rhs); }
+       |       term[lhs] PLUGIN_LOGICAL_AND_OP[op] term[rhs]
+                       { $$ = build_infix_plugin($lhs, $rhs, $op); }
        |       term[lhs] OROR term[rhs]                         /* $x || $y */
                        { $$ = newLOGOP(OP_OR, 0, $lhs, $rhs); }
+       |       term[lhs] PLUGIN_LOGICAL_OR_OP[op] term[rhs]
+                       { $$ = build_infix_plugin($lhs, $rhs, $op); }
        |       term[lhs] DORDOR term[rhs]                       /* $x // $y */
                        { $$ = newLOGOP(OP_DOR, 0, $lhs, $rhs); }
        |       term[lhs] MATCHOP term[rhs]                      /* $x =~ /$y/ */
                        { $$ = bind_match($MATCHOP, $lhs, $rhs); }
+       |       term[lhs] PLUGIN_LOW_OP[op] term[rhs]
+                       { $$ = build_infix_plugin($lhs, $rhs, $op); }
     ;
 
 termrelop:     relopchain %prec PREC_LOW
@@ -1114,6 +1264,8 @@ termrelop:        relopchain %prec PREC_LOW
                        { yyerror("syntax error"); YYERROR; }
        |       termrelop CHRELOP
                        { yyerror("syntax error"); YYERROR; }
+       |       term[lhs] PLUGIN_REL_OP[op] term[rhs]
+                       { $$ = build_infix_plugin($lhs, $rhs, $op); }
        ;
 
 relopchain:    term[lhs] CHRELOP term[rhs]
@@ -1180,18 +1332,23 @@ anonymous
                        { $$ = newANONLIST($optexpr); }
        |       HASHBRACK optexpr PERLY_SEMICOLON PERLY_BRACE_CLOSE     %prec PERLY_PAREN_OPEN /* { foo => "Bar" } */
                        { $$ = newANONHASH($optexpr); }
-       |       ANONSUB     startanonsub proto subattrlist subbody    %prec PERLY_PAREN_OPEN
+       |       KW_SUB_anon     startanonsub proto subattrlist subbody    %prec PERLY_PAREN_OPEN
                        { SvREFCNT_inc_simple_void(PL_compcv);
                          $$ = newANONATTRSUB($startanonsub, $proto, $subattrlist, $subbody); }
-       |       ANON_SIGSUB startanonsub subattrlist sigsubbody %prec PERLY_PAREN_OPEN
+       |       KW_SUB_anon_sig startanonsub subattrlist sigsubbody %prec PERLY_PAREN_OPEN
                        { SvREFCNT_inc_simple_void(PL_compcv);
                          $$ = newANONATTRSUB($startanonsub, NULL, $subattrlist, $sigsubbody); }
+       |       KW_METHOD_anon startanonmethod subattrlist sigsubbody %prec PERLY_PAREN_OPEN
+                       {
+                         SvREFCNT_inc_simple_void(PL_compcv);
+                         $$ = newANONATTRSUB($startanonmethod, NULL, $subattrlist, $sigsubbody);
+                       }
     ;
 
 /* Things called with "do" */
-termdo :       DO term %prec UNIOP                     /* do $filename */
-                       { $$ = dofile($term, $DO);}
-       |       DO block        %prec PERLY_PAREN_OPEN               /* do { code */
+termdo :       KW_DO term      %prec UNIOP                     /* do $filename */
+                       { $$ = dofile($term, $KW_DO);}
+       |       KW_DO block     %prec PERLY_PAREN_OPEN               /* do { code */
                        { $$ = newUNOP(OP_NULL, OPf_SPECIAL, op_scope($block));}
         ;
 
@@ -1205,7 +1362,7 @@ term[product]     :       termbinop
                        { $$ = newUNOP(OP_REFGEN, 0, $operand); }
        |       myattrterm      %prec UNIOP
                        { $$ = $myattrterm; }
-       |       LOCAL term[operand]     %prec UNIOP
+       |       KW_LOCAL term[operand]  %prec UNIOP
                        { $$ = localize($operand,0); }
        |       PERLY_PAREN_OPEN expr PERLY_PAREN_CLOSE
                        { $$ = sawparens($expr); }
@@ -1305,10 +1462,10 @@ term[product]   :       termbinop
                        { $$ = newUNOP($UNIOP, 0, $block); }
        |       UNIOP term[operand]                           /* Unary op */
                        { $$ = newUNOP($UNIOP, 0, $operand); }
-       |       REQUIRE                              /* require, $_ implied */
-                       { $$ = newOP(OP_REQUIRE, $REQUIRE ? OPf_SPECIAL : 0); }
-       |       REQUIRE term[operand]                         /* require Foo */
-                       { $$ = newUNOP(OP_REQUIRE, $REQUIRE ? OPf_SPECIAL : 0, $operand); }
+       |       KW_REQUIRE                              /* require, $_ implied */
+                       { $$ = newOP(OP_REQUIRE, $KW_REQUIRE ? OPf_SPECIAL : 0); }
+       |       KW_REQUIRE term[operand]                         /* require Foo */
+                       { $$ = newUNOP(OP_REQUIRE, $KW_REQUIRE ? OPf_SPECIAL : 0, $operand); }
        |       UNIOPSUB
                        { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar($UNIOPSUB)); }
        |       UNIOPSUB term[operand]                        /* Sub treated as unop */
@@ -1350,13 +1507,13 @@ term[product]   :       termbinop
 
 /* "my" declarations, with optional attributes */
 myattrterm
-       :       MY myterm myattrlist
+       :       KW_MY myterm myattrlist
                        { $$ = my_attrs($myterm,$myattrlist); }
-       |       MY myterm
+       |       KW_MY myterm
                        { $$ = localize($myterm,1); }
-       |       MY REFGEN myterm myattrlist
+       |       KW_MY REFGEN myterm myattrlist
                        { $$ = newUNOP(OP_REFGEN, 0, my_attrs($myterm,$myattrlist)); }
-       |       MY REFGEN term[operand]
+       |       KW_MY REFGEN term[operand]
                        { $$ = newUNOP(OP_REFGEN, 0, localize($operand,1)); }
        ;
 
@@ -1374,6 +1531,56 @@ myterm   :       PERLY_PAREN_OPEN expr PERLY_PAREN_CLOSE
                        { $$ = $ary; }
        ;
 
+/* "field" declarations */
+fieldvar:      scalar  %prec PERLY_PAREN_OPEN
+                       {
+                         $$ = PadnamelistARRAY(PL_comppad_name)[$scalar->op_targ];
+                         op_free($scalar);
+                       }
+       |       hsh     %prec PERLY_PAREN_OPEN
+                       {
+                         $$ = PadnamelistARRAY(PL_comppad_name)[$hsh->op_targ];
+                         op_free($hsh);
+                       }
+       |       ary     %prec PERLY_PAREN_OPEN
+                       {
+                         $$ = PadnamelistARRAY(PL_comppad_name)[$ary->op_targ];
+                         op_free($ary);
+                       }
+       ;
+
+optfieldattrlist:
+               COLONATTR THING
+                       { $$ = $THING; }
+       |       COLONATTR
+                       { $$ = NULL; }
+       |       empty
+       ;
+
+fielddecl
+       :       KW_FIELD fieldvar optfieldattrlist
+                       {
+                         parser->in_my = 0;
+                         if($optfieldattrlist)
+                           class_apply_field_attributes((PADNAME *)$fieldvar, $optfieldattrlist);
+                         $$ = newOP(OP_NULL, 0);
+                       }
+       |       KW_FIELD fieldvar optfieldattrlist ASSIGNOP
+                       {
+                         parser->in_my = 0;
+                         if($optfieldattrlist)
+                           class_apply_field_attributes((PADNAME *)$fieldvar, $optfieldattrlist);
+                         ENTER;
+                         class_prepare_initfield_parse();
+                       }
+               term
+                       {
+                         class_set_field_defop((PADNAME *)$fieldvar, $ASSIGNOP, $term);
+                         LEAVE;
+                         $$ = newOP(OP_NULL, 0);
+                       }
+       ;
+
 /* Basic list expressions */
 optlistexpr
        :       empty                   %prec PREC_LOW
@@ -1419,8 +1626,8 @@ refgen_topic:     my_var
        |       amper
        ;
 
-my_refgen:     MY REFGEN
-       |       REFGEN MY
+my_refgen:     KW_MY REFGEN
+       |       REFGEN KW_MY
        ;
 
 amper  :       PERLY_AMPERSAND indirob
index b6408b0..a59a189 100644 (file)
  *     This symbol, if defined, indicates that the chsize routine is available
  *     to truncate files.  You might need a -lx to get this routine.
  */
-/*#define      HAS_CHSIZE              / **/
+/*#define HAS_CHSIZE            / **/
 
 /* HAS_CUSERID:
  *     This symbol, if defined, indicates that the cuserid routine is
  *     This symbol, if defined, indicates that the mbstowcs routine is
  *     available to covert a multibyte string into a wide character string.
  */
-#define        HAS_MBSTOWCS            /**/
+#define HAS_MBSTOWCS            /**/
 
 /* HAS_MBTOWC:
  *     This symbol, if defined, indicates that the mbtowc routine is available
  *     This symbol, if defined, indicates to the C program that it should
  *     include <arpa/inet.h> to get inet_addr and friends declarations.
  */
-#define        I_ARPA_INET             /**/
+#define I_ARPA_INET             /**/
 
 /* I_DBM:
  *     This symbol, if defined, indicates that <dbm.h> exists and should
  *     This symbol, if defined, indicates to the C program that it should
  *     include <locale.h>.
  */
-#define        I_LOCALE                /**/
+#define I_LOCALE                /**/
 
 /* I_NET_ERRNO:
  *     This symbol, if defined, indicates that <net/errno.h> exists and
  *     This symbol, if defined, indicates the <sys/sockio.h> should be included
  *     to get socket ioctl options, like SIOCATMARK.
  */
-#define        I_SYS_IOCTL             /**/
+#define I_SYS_IOCTL             /**/
 /*#define I_SYS_SOCKIO / **/
 
 /* I_SYS_NDIR:
  *     This symbol, if defined, indicates to the C program that it should
  *     include <sys/stat.h>.
  */
-#define        I_SYS_STAT              /**/
+#define I_SYS_STAT              /**/
 
 /* I_SYS_TIMES:
  *     This symbol, if defined, indicates to the C program that it should
  *     include <sys/times.h>.
  */
-#define        I_SYS_TIMES             /**/
+#define I_SYS_TIMES             /**/
 
 /* I_SYS_TYPES:
  *     This symbol, if defined, indicates to the C program that it should
  *     include <sys/types.h>.
  */
-#define        I_SYS_TYPES             /**/
+#define I_SYS_TYPES             /**/
 
 /* I_SYS_UN:
  *     This symbol, if defined, indicates to the C program that it should
  *     This symbol is defined if the C compiler can cast negative
  *     or large floating point numbers to 32-bit ints.
  */
-/*#define      CASTI32         / **/
+/*#define CASTI32               / **/
 
 /* CASTNEGFLOAT:
  *     This symbol is defined if the C compiler can cast negative
  *             2 = couldn't cast >= 0x80000000
  *             4 = couldn't cast in argument expression list
  */
-/*#define      CASTNEGFLOAT            /* config-skip */
+/*#define CASTNEGFLOAT          /* config-skip */
 #if _P9P_OBJTYPE == 386
 #  define CASTFLAGS 3           /**/ /* config-skip */
 #else
  *     to the program to supply one.  A good guess is
  *             extern double drand48(void);
  */
-/*#define      HAS_DRAND48_PROTO       / **/
+/*#define HAS_DRAND48_PROTO     / **/
 
 /* HAS_ENDGRENT:
  *     This symbol, if defined, indicates that the getgrent routine is
  *     This symbol, if defined, indicates that the system supports filenames
  *     longer than 14 characters.
  */
-#define        FLEXFILENAMES           /**/
+#define FLEXFILENAMES           /**/
 
 /* HAS_FP_CLASS:
  *     This symbol, if defined, indicates that the fp_class routine is
 /* HAS_FPOS64_T:
  *     This symbol will be defined if the C compiler supports fpos64_t.
  */
-/*#define      HAS_FPOS64_T            / **/
+/*#define HAS_FPOS64_T          / **/
 
 /* HAS_FREXPL:
  *     This symbol, if defined, indicates that the frexpl routine is
  *     gethostbyaddr().  Otherwise, it is up to the program to guess
  *     them.  See netdbtype.U for probing for various Netdb_xxx_t types.
  */
-/*#define      HAS_GETHOST_PROTOS      / **/
+/*#define HAS_GETHOST_PROTOS    / **/
 
 /* HAS_GETITIMER:
  *     This symbol, if defined, indicates that the getitimer routine is
  *     getnetbyaddr().  Otherwise, it is up to the program to guess
  *     them.  See netdbtype.U for probing for various Netdb_xxx_t types.
  */
-/*#define      HAS_GETNET_PROTOS       / **/
+/*#define HAS_GETNET_PROTOS     / **/
 
 /* HAS_GETPAGESIZE:
  *     This symbol, if defined, indicates that the getpagesize system call
  *     getprotobyaddr().  Otherwise, it is up to the program to guess
  *     them.  See netdbtype.U for probing for various Netdb_xxx_t types.
  */
-/*#define      HAS_GETPROTO_PROTOS     / **/
+/*#define HAS_GETPROTO_PROTOS   / **/
 
 /* HAS_GETPRPWNAM:
  *     This symbol, if defined, indicates that the getprpwnam system call is
  *     getservbyaddr().  Otherwise, it is up to the program to guess
  *     them.  See netdbtype.U for probing for various Netdb_xxx_t types.
  */
-/*#define      HAS_GETSERV_PROTOS      / **/
+/*#define HAS_GETSERV_PROTOS    / **/
 
 /* HAS_GETSPNAM:
  *     This symbol, if defined, indicates that the getspnam system call is
  *     to the program to supply one.  A good guess is
  *             extern off_t lseek(int, off_t, int);
  */
-/*#define      HAS_LSEEK_PROTO / **/
+/*#define HAS_LSEEK_PROTO       / **/
 
 /* HAS_MADVISE:
  *     This symbol, if defined, indicates that the madvise system call is
 /* HAS_OFF64_T:
  *     This symbol will be defined if the C compiler supports off64_t.
  */
-/*#define      HAS_OFF64_T             / **/
+/*#define HAS_OFF64_T                   / **/
 
 /* HAS_OPEN3:
  *     This manifest constant lets the C program know that the three
  *             extern void* sbrk(int);
  *             extern void* sbrk(size_t);
  */
-/*#define      HAS_SBRK_PROTO  / **/
+/*#define HAS_SBRK_PROTO        / **/
 
 /* HAS_SEM:
  *     This symbol, if defined, indicates that the entire sem*(2) library is
  *     This symbol, if defined, indicates that the BSD socketpair() call is
  *     supported.
  */
-#define        HAS_SOCKET              /**/
-#define        HAS_SOCKETPAIR  /**/
+#define HAS_SOCKET              /**/
+#define HAS_SOCKETPAIR  /**/
 
 /* HAS_SOCKS5_INIT:
  *     This symbol, if defined, indicates that the socks5_init routine is
  *     to the program to supply one.  A good guess is
  *             extern long telldir(DIR*);
  */
-/*#define      HAS_TELLDIR_PROTO       / **/
+/*#define HAS_TELLDIR_PROTO     / **/
 
 /* HAS_TIME:
  *     This symbol, if defined, indicates that the time() routine exists.
  *     This symbol, if defined, indicates that this system uses
  *     EBCDIC encoding.
  */
-/*#define      EBCDIC          / **/
+/*#define EBCDIC                / **/
 
 /* FFLUSH_NULL:
  *     This symbol, if defined, tells that fflush(NULL) does flush
  *     Note that if fflushNULL is defined, fflushall will not
  *     even be probed for and will be left undefined.
  */
-#define        FFLUSH_NULL             /**/
-/*#define      FFLUSH_ALL              / **/
+#define FFLUSH_NULL             /**/
+/*#define FFLUSH_ALL            / **/
 
 /* Fpos_t:
  *     This symbol holds the type used to declare file positions in libc.
 /* Gid_t_f:
  *     This symbol defines the format string used for printing a Gid_t.
  */
-#define        Gid_t_f         "hd"            /**/
+#define Gid_t_f         "hd"            /**/
 
 /* Gid_t_sign:
  *     This symbol holds the signedess of a Gid_t.
  *     This symbol, if defined, indicates that <fp_class.h> exists and
  *     should be included.
  */
-/*#define      I_FP_CLASS              / **/
+/*#define I_FP_CLASS            / **/
 
 /* I_GRP:
  *     This symbol, if defined, indicates to the C program that it should
  *     This symbol, if defined, indicates that <ieeefp.h> exists and
  *     should be included.
  */
-/*#define      I_IEEEFP                / **/
+/*#define I_IEEEFP              / **/
 
 /* I_INTTYPES:
  *     This symbol, if defined, indicates to the C program that it should
  *     This symbol, if defined, indicates that <libutil.h> exists and
  *     should be included.
  */
-/*#define      I_LIBUTIL               / **/
+/*#define I_LIBUTIL             / **/
 
 /* I_MACH_CTHREADS:
  *     This symbol, if defined, indicates to the C program that it should
  *     This symbol, if defined, indicates that <mntent.h> exists and
  *     should be included.
  */
-/*#define      I_MNTENT                / **/
+/*#define I_MNTENT              / **/
 
 /* I_NETDB:
  *     This symbol, if defined, indicates that <netdb.h> exists and
  *     This symbol, if defined, indicates that <poll.h> exists and
  *     should be included.
  */
-/*#define      I_POLL          / **/
+/*#define I_POLL                / **/
 
 /* I_PROT:
  *     This symbol, if defined, indicates that <prot.h> exists and
  *     should be included.
  */
-/*#define      I_PROT          / **/
+/*#define I_PROT                / **/
 
 /* I_PTHREAD:
  *     This symbol, if defined, indicates to the C program that it should
  *     This symbol, if defined, indicates that <quadmath.h> exists and
  *     should be included.
  */
-/*#define      I_QUADMATH              / **/
+/*#define I_QUADMATH            / **/
 
 /* I_SHADOW:
  *     This symbol, if defined, indicates that <shadow.h> exists and
  *     should be included.
  */
-/*#define      I_SHADOW                / **/
+/*#define I_SHADOW              / **/
 
 /* I_SOCKS:
  *     This symbol, if defined, indicates that <socks.h> exists and
  *     should be included.
  */
-/*#define      I_SOCKS         / **/
+/*#define I_SOCKS               / **/
 
 /* I_SUNMATH:
  *     This symbol, if defined, indicates that <sunmath.h> exists and
  *     should be included.
  */
-/*#define      I_SUNMATH               / **/
+/*#define I_SUNMATH             / **/
 
 /* I_SYSLOG:
  *     This symbol, if defined, indicates that <syslog.h> exists and
  *     should be included.
  */
-/*#define      I_SYSLOG                / **/
+/*#define I_SYSLOG              / **/
 
 /* I_SYSMODE:
  *     This symbol, if defined, indicates that <sys/mode.h> exists and
  *     should be included.
  */
-/*#define      I_SYSMODE               / **/
+/*#define I_SYSMODE             / **/
 
 /* I_SYS_MOUNT:
  *     This symbol, if defined, indicates that <sys/mount.h> exists and
  *     should be included.
  */
-/*#define      I_SYS_MOUNT             / **/
+/*#define I_SYS_MOUNT           / **/
 
 /* I_SYS_STATFS:
  *     This symbol, if defined, indicates that <sys/statfs.h> exists.
  */
-/*#define      I_SYS_STATFS            / **/
+/*#define I_SYS_STATFS          / **/
 
 /* I_SYS_STATVFS:
  *     This symbol, if defined, indicates that <sys/statvfs.h> exists and
  *     should be included.
  */
-/*#define      I_SYS_STATVFS           / **/
+/*#define I_SYS_STATVFS         / **/
 
 /* I_SYSUIO:
  *     This symbol, if defined, indicates that <sys/uio.h> exists and
  *     should be included.
  */
-#define        I_SYSUIO                /**/
+#define I_SYSUIO                /**/
 
 /* I_SYSUTSNAME:
  *     This symbol, if defined, indicates that <sys/utsname.h> exists and
  *     should be included.
  */
-#define        I_SYSUTSNAME            /**/
+#define I_SYSUTSNAME            /**/
 
 /* I_SYS_VFS:
  *     This symbol, if defined, indicates that <sys/vfs.h> exists and
  *     should be included.
  */
-/*#define      I_SYS_VFS               / **/
+/*#define I_SYS_VFS             / **/
 
 /* Plan 9: P9 has both <time.h> and <sys/time.h> */
 /* I_TIME:
  *     This symbol, if defined, indicates that <ustat.h> exists and
  *     should be included.
  */
-/*#define      I_USTAT         / **/
+/*#define I_USTAT               / **/
 
 /* PERL_INC_VERSION_LIST:
  *     This variable specifies the list of subdirectories in over
  *     of copying mechanisms, handy.h defines a platform-
  *     independent macro, Perl_va_copy(src, dst), to do the job.
  */
-/*#define      NEED_VA_COPY            / **/
+/*#define NEED_VA_COPY          / **/
 
 /* Netdb_host_t:
  *     This symbol holds the type used for the 1st argument
  *     This symbol, if defined, indicates that a variable of type NVTYPE
  *     stores 0.0 in memory as all bits zero.
  */
-#define        IVTYPE          long            /**/
-#define        UVTYPE          unsigned long           /**/
-#define        I8TYPE          char            /**/
-#define        U8TYPE          unsigned char           /**/
-#define        I16TYPE         short   /**/
-#define        U16TYPE         unsigned short  /**/
-#define        I32TYPE         long    /**/
-#define        U32TYPE         unsigned long   /**/
+#define IVTYPE          long            /**/
+#define UVTYPE          unsigned long           /**/
+#define I8TYPE          char            /**/
+#define U8TYPE          unsigned char           /**/
+#define I16TYPE         short   /**/
+#define U16TYPE         unsigned short  /**/
+#define I32TYPE         long    /**/
+#define U32TYPE         unsigned long   /**/
 #ifdef HAS_QUAD
-#define        I64TYPE         long long       /**/
-#define        U64TYPE         unsigned long long      /**/
+#define I64TYPE         long long       /**/
+#define U64TYPE         unsigned long long      /**/
 #endif
-#define        NVTYPE          double          /**/
-#define        IVSIZE          4               /**/
-#define        UVSIZE          4               /**/
-#define        I8SIZE          1               /**/
-#define        U8SIZE          1               /**/
-#define        I16SIZE         2       /**/
-#define        U16SIZE         2       /**/
-#define        I32SIZE         4       /**/
-#define        U32SIZE         4       /**/
+#define NVTYPE          double          /**/
+#define IVSIZE          4               /**/
+#define UVSIZE          4               /**/
+#define I8SIZE          1               /**/
+#define U8SIZE          1               /**/
+#define I16SIZE         2       /**/
+#define U16SIZE         2       /**/
+#define I32SIZE         4       /**/
+#define U32SIZE         4       /**/
 #ifdef HAS_QUAD
-#define        I64SIZE         8       /**/
-#define        U64SIZE         8       /**/
+#define I64SIZE         8       /**/
+#define U64SIZE         8       /**/
 #endif
-#define        NVSIZE          8               /**/
-#define        NV_PRESERVES_UV
-#define        NV_PRESERVES_UV_BITS    31
-#define        NV_OVERFLOWS_INTEGERS_AT        256.0*256.0*256.0*256.0*256.0*256.0*2.0*2.0*2.0*2.0*2.0
+#define NVSIZE          8               /**/
+#define NV_PRESERVES_UV
+#define NV_PRESERVES_UV_BITS    31
+#define NV_OVERFLOWS_INTEGERS_AT        256.0*256.0*256.0*256.0*256.0*256.0*2.0*2.0*2.0*2.0*2.0
 #undef NV_ZERO_IS_ALLBITS_ZERO
 
 /* IVdf:
  *     This symbol defines the format string used for printing a Perl NV
  *     using %g-ish floating point format.
  */
-#define        IVdf            "ld"            /**/
-#define        UVuf            "lu"            /**/
-#define        UVof            "lo"            /**/
-#define        UVxf            "lx"            /**/
-#define        UVXf            "lX"            /**/
-#define        NVef            "e"             /**/
-#define        NVff            "f"             /**/
-#define        NVgf            "g"             /**/
+/* I32df:
+ *     This symbol defines the format string used for printing a Perl I32
+ *     as a signed decimal integer.
+ */
+/* U32uf:
+ *     This symbol defines the format string used for printing a Perl U32
+ *     as an unsigned decimal integer.
+ */
+/* U32of:
+ *     This symbol defines the format string used for printing a Perl U32
+ *     as an unsigned octal integer.
+ */
+/* U32xf:
+ *     This symbol defines the format string used for printing a Perl U32
+ *     as an unsigned hexadecimal integer in lowercase abcdef.
+ */
+/* U32Xf:
+ *     This symbol defines the format string used for printing a Perl U32
+ *     as an unsigned hexadecimal integer in uppercase ABCDEF.
+ */
+#define IVdf            "ld"            /**/
+#define UVuf            "lu"            /**/
+#define UVof            "lo"            /**/
+#define UVxf            "lx"            /**/
+#define UVXf            "lX"            /**/
+#define NVef            "e"             /**/
+#define NVff            "f"             /**/
+#define NVgf            "g"             /**/
+#define I32df           "ld"            /**/
+#define U32uf           "lu"            /**/
+#define U32of           "lo"            /**/
+#define U32xf           "lx"            /**/
+#define U32Xf           "lX"            /**/
 
 /* Pid_t:
  *     This symbol holds the type used to declare process ids in the kernel.
  *     This symbol tells the name of the array holding the stdio streams.
  *     Usual values include _iob, __iob, and __sF.
  */
-/*#define      HAS_STDIO_STREAM_ARRAY  / **/
+/*#define HAS_STDIO_STREAM_ARRAY        / **/
 #define STDIO_STREAM_ARRAY     
 
 /* Uid_t_f:
  *     This symbol defines the format string used for printing a Uid_t.
  */
-#define        Uid_t_f         "hd"            /**/
+#define Uid_t_f         "hd"            /**/
 
 /* Uid_t_sign:
  *     This symbol holds the signedess of a Uid_t.
  *     you may need at least to reboot your OS to 64-bit mode.
  */
 #ifndef USE_64_BIT_INT
-/*#define      USE_64_BIT_INT          / **/
+/*#define USE_64_BIT_INT                / **/
 #endif
 
 #ifndef USE_64_BIT_ALL
-/*#define      USE_64_BIT_ALL          / **/
+/*#define USE_64_BIT_ALL                / **/
 #endif
 
 /* USE_FAST_STDIO:
  *     Defaults to define in Perls 5.8 and earlier, to undef later.
  */
 #ifndef USE_FAST_STDIO
-/*#define      USE_FAST_STDIO          / **/
+/*#define USE_FAST_STDIO                / **/
 #endif
 
 /* USE_LARGE_FILES:
  *     should be used when available.
  */
 #ifndef USE_LARGE_FILES
-#define        USE_LARGE_FILES         /**/
+#define USE_LARGE_FILES         /**/
 #endif
 
 /* USE_LONG_DOUBLE:
  *     be used when available.
  */
 #ifndef USE_LONG_DOUBLE
-/*#define      USE_LONG_DOUBLE         / **/
+/*#define USE_LONG_DOUBLE               / **/
 #endif
 
 /* USE_MORE_BITS:
  *     long doubles should be used when available.
  */
 #ifndef USE_MORE_BITS
-/*#define      USE_MORE_BITS           / **/
+/*#define USE_MORE_BITS         / **/
 #endif
 
 /* MULTIPLICITY:
  *     be built to use multiplicity.
  */
 #ifndef MULTIPLICITY
-/*#define      MULTIPLICITY            / **/
+/*#define MULTIPLICITY          / **/
 #endif
 
 /* USE_PERLIO:
  *     used in a fully backward compatible manner.
  */
 #ifndef USE_PERLIO
-#define        USE_PERLIO              /**/
+#define USE_PERLIO              /**/
 #endif
 
 /* USE_QUADMATH:
  *     be used when available.
  */
 #ifndef USE_QUADMATH
-/*#define      USE_QUADMATH            / **/
+/*#define USE_QUADMATH          / **/
 #endif
 
 /* USE_SOCKS:
  *     be built to use socks.
  */
 #ifndef USE_SOCKS
-/*#define      USE_SOCKS               / **/
+/*#define USE_SOCKS             / **/
 #endif
 
 /* USE_ITHREADS:
  *     try to use the various _r versions of library functions.
  *     This is extremely experimental.
  */
-/*#define      USE_ITHREADS            / **/
-/*#define              USE_THREADS             / **/
-/*#define      OLD_PTHREADS_API                / **/
-/*#define      USE_REENTRANT_API       / **/
+/*#define USE_ITHREADS          / **/
+/*#define       USE_THREADS             / **/
+/*#define OLD_PTHREADS_API              / **/
+/*#define USE_REENTRANT_API     / **/
 
 /* PERL_VENDORARCH:
  *     If defined, this symbol contains the name of a private library.
  *     Perl has been cross-compiled to.  Undefined if not a cross-compile.
  */
 #ifndef USE_CROSS_COMPILE
-/*#define      USE_CROSS_COMPILE       / **/
-#define        PERL_TARGETARCH ""      /**/
+/*#define USE_CROSS_COMPILE     / **/
+#define PERL_TARGETARCH ""      /**/
 #endif
 
 /* HAS_COPYSIGNL:
  *     to the program to supply one.  A good guess is
  *             extern int dbminit(char *);
  */
-/*#define      HAS_DBMINIT_PROTO       / **/
+/*#define HAS_DBMINIT_PROTO     / **/
 
 /* HAS_DIRFD:
  *     This manifest constant lets the C program know that dirfd
  *     to the program to supply one.  A good guess is
  *             extern int flock(int, int);
  */
-/*#define      HAS_FLOCK_PROTO / **/
+/*#define HAS_FLOCK_PROTO       / **/
 
 /* HAS_FPCLASSL:
  *     This symbol, if defined, indicates that the fpclassl routine is
  *     to the program to supply one.  A good guess is
  *             extern int sockatmark(int);
  */
-/*#define      HAS_SOCKATMARK_PROTO    / **/
+/*#define HAS_SOCKATMARK_PROTO  / **/
 
 /* HAS_SETRESGID_PROTO:
  *     This symbol, if defined, indicates that the system provides
  *     to the program to supply one.  Good guesses are
  *             extern int setresgid(uid_t ruid, uid_t euid, uid_t suid);
  */
-/*#define      HAS_SETRESGID_PROTO     / **/
+/*#define HAS_SETRESGID_PROTO   / **/
 
 /* HAS_SETRESUID_PROTO:
  *     This symbol, if defined, indicates that the system provides
  *     to the program to supply one.  Good guesses are
  *             extern int setresuid(uid_t ruid, uid_t euid, uid_t suid);
  */
-/*#define      HAS_SETRESUID_PROTO     / **/
+/*#define HAS_SETRESUID_PROTO   / **/
 
 /* HAS_STRFTIME:
  *     This symbol, if defined, indicates that the strftime routine is
  *             extern int syscall(int,  ...);
  *             extern int syscall(long, ...);
  */
-/*#define      HAS_SYSCALL_PROTO       / **/
+/*#define HAS_SYSCALL_PROTO     / **/
 
 /* U32_ALIGNMENT_REQUIRED:
  *     This symbol, if defined, indicates that you must access
  *     to the program to supply one.  A good guess is
  *             extern int usleep(useconds_t);
  */
-/*#define      HAS_USLEEP_PROTO        / **/
+/*#define HAS_USLEEP_PROTO      / **/
 
 /* I_CRYPT:
  *     This symbol, if defined, indicates that <crypt.h> exists and
  *     should be included.
  */
-/*#define      I_CRYPT         / **/
+/*#define I_CRYPT               / **/
 
 /* I_FP:
  *     This symbol, if defined, indicates that <fp.h> exists and
  *     should be included.
  */
-/*#define      I_FP            / **/
+/*#define I_FP          / **/
 
 /* I_LANGINFO:
  *     This symbol, if defined, indicates that <langinfo.h> exists and
  *     should be included.
  */
-/*#define      I_LANGINFO              / **/
+/*#define I_LANGINFO            / **/
 
 /* HAS_CTERMID_R:
  *     This symbol, if defined, indicates that the ctermid_r routine
index 5ecf263..1720754 100644 (file)
@@ -66,7 +66,7 @@
  *     This symbol, if defined, indicates that the chsize routine is available
  *     to truncate files.  You might need a -lx to get this routine.
  */
-/*#define      HAS_CHSIZE              / **/
+/*#define HAS_CHSIZE            / **/
 
 /* HAS_CUSERID:
  *     This symbol, if defined, indicates that the cuserid routine is
  *     This symbol, if defined, indicates that the mbstowcs routine is
  *     available to covert a multibyte string into a wide character string.
  */
-#define        HAS_MBSTOWCS            /**/
+#define HAS_MBSTOWCS            /**/
 
 /* HAS_MBTOWC:
  *     This symbol, if defined, indicates that the mbtowc routine is available
  *     This symbol, if defined, indicates to the C program that it should
  *     include <arpa/inet.h> to get inet_addr and friends declarations.
  */
-#define        I_ARPA_INET             /**/
+#define I_ARPA_INET             /**/
 
 /* I_DBM:
  *     This symbol, if defined, indicates that <dbm.h> exists and should
  *     This symbol, if defined, indicates to the C program that it should
  *     include <locale.h>.
  */
-#define        I_LOCALE                /**/
+#define I_LOCALE                /**/
 
 /* I_NET_ERRNO:
  *     This symbol, if defined, indicates that <net/errno.h> exists and 
  *     This symbol, if defined, indicates the <sys/sockio.h> should be included
  *     to get socket ioctl options, like SIOCATMARK.
  */
-#define        I_SYS_IOCTL             /**/
+#define I_SYS_IOCTL             /**/
 /*#define I_SYS_SOCKIO / **/
 
 /* I_SYS_NDIR:
  *     This symbol, if defined, indicates to the C program that it should
  *     include <sys/stat.h>.
  */
-#define        I_SYS_STAT              /**/
+#define I_SYS_STAT              /**/
 
 /* I_SYS_TIMES:
  *     This symbol, if defined, indicates to the C program that it should
  *     include <sys/times.h>.
  */
-#define        I_SYS_TIMES             /**/
+#define I_SYS_TIMES             /**/
 
 /* I_SYS_TYPES:
  *     This symbol, if defined, indicates to the C program that it should
  *     include <sys/types.h>.
  */
-#define        I_SYS_TYPES             /**/
+#define I_SYS_TYPES             /**/
 
 /* I_SYS_UN:
  *     This symbol, if defined, indicates to the C program that it should
  *     This symbol is defined if the C compiler can cast negative
  *     or large floating point numbers to 32-bit ints.
  */
-/*#define      CASTI32         / **/
+/*#define CASTI32               / **/
 
 /* CASTNEGFLOAT:
  *     This symbol is defined if the C compiler can cast negative
  *             2 = couldn't cast >= 0x80000000
  *             4 = couldn't cast in argument expression list
  */
-/*#define      CASTNEGFLOAT            / **/
+/*#define CASTNEGFLOAT          / **/
 #define CASTFLAGS 7            /**/
 
 /* HAS_CLASS:
  *     to the program to supply one.  A good guess is
  *             extern double drand48(void);
  */
-/*#define      HAS_DRAND48_PROTO       / **/
+/*#define HAS_DRAND48_PROTO     / **/
 
 /* HAS_ENDGRENT:
  *     This symbol, if defined, indicates that the getgrent routine is
  *     This symbol, if defined, indicates that the system supports filenames
  *     longer than 14 characters.
  */
-#define        FLEXFILENAMES           /**/
+#define FLEXFILENAMES           /**/
 
 /* HAS_FP_CLASS:
  *     This symbol, if defined, indicates that the fp_class routine is
 /* HAS_FPOS64_T:
  *     This symbol will be defined if the C compiler supports fpos64_t.
  */
-/*#define      HAS_FPOS64_T            / **/
+/*#define HAS_FPOS64_T          / **/
 
 /* HAS_FREXPL:
  *     This symbol, if defined, indicates that the frexpl routine is
  *     gethostbyaddr().  Otherwise, it is up to the program to guess
  *     them.  See netdbtype.U for probing for various Netdb_xxx_t types.
  */
-/*#define      HAS_GETHOST_PROTOS      / **/
+/*#define HAS_GETHOST_PROTOS    / **/
 
 /* HAS_GETITIMER:
  *     This symbol, if defined, indicates that the getitimer routine is
  *     getnetbyaddr().  Otherwise, it is up to the program to guess
  *     them.  See netdbtype.U for probing for various Netdb_xxx_t types.
  */
-/*#define      HAS_GETNET_PROTOS       / **/
+/*#define HAS_GETNET_PROTOS     / **/
 
 /* HAS_GETPAGESIZE:
  *     This symbol, if defined, indicates that the getpagesize system call
  *     getprotobyaddr().  Otherwise, it is up to the program to guess
  *     them.  See netdbtype.U for probing for various Netdb_xxx_t types.
  */
-/*#define      HAS_GETPROTO_PROTOS     / **/
+/*#define HAS_GETPROTO_PROTOS   / **/
 
 /* HAS_GETPRPWNAM:
  *     This symbol, if defined, indicates that the getprpwnam system call is
  *     getservbyaddr().  Otherwise, it is up to the program to guess
  *     them.  See netdbtype.U for probing for various Netdb_xxx_t types.
  */
-/*#define      HAS_GETSERV_PROTOS      / **/
+/*#define HAS_GETSERV_PROTOS    / **/
 
 /* HAS_GETSPNAM:
  *     This symbol, if defined, indicates that the getspnam system call is
  *     to the program to supply one.  A good guess is
  *             extern off_t lseek(int, off_t, int);
  */
-/*#define      HAS_LSEEK_PROTO / **/
+/*#define HAS_LSEEK_PROTO       / **/
 
 /* HAS_MADVISE:
  *     This symbol, if defined, indicates that the madvise system call is
 /* HAS_OFF64_T:
  *     This symbol will be defined if the C compiler supports off64_t.
  */
-/*#define      HAS_OFF64_T             / **/
+/*#define HAS_OFF64_T                   / **/
 
 /* HAS_OPEN3:
  *     This manifest constant lets the C program know that the three
  *             extern void* sbrk(int);
  *             extern void* sbrk(size_t);
  */
-/*#define      HAS_SBRK_PROTO  / **/
+/*#define HAS_SBRK_PROTO        / **/
 
 /* HAS_SEM:
  *     This symbol, if defined, indicates that the entire sem*(2) library is
  *     This symbol, if defined, indicates that the BSD socketpair() call is
  *     supported.
  */
-#define        HAS_SOCKET              /**/
-#define        HAS_SOCKETPAIR  /**/
+#define HAS_SOCKET              /**/
+#define HAS_SOCKETPAIR  /**/
 
 /* HAS_SOCKS5_INIT:
  *     This symbol, if defined, indicates that the socks5_init routine is
  *     to the program to supply one.  A good guess is
  *             extern long telldir(DIR*);
  */
-/*#define      HAS_TELLDIR_PROTO       / **/
+/*#define HAS_TELLDIR_PROTO     / **/
 
 /* HAS_TIME:
  *     This symbol, if defined, indicates that the time() routine exists.
  *     This symbol, if defined, indicates that this system uses
  *     EBCDIC encoding.
  */
-/*#define      EBCDIC          / **/
+/*#define EBCDIC                / **/
 
 /* FFLUSH_NULL:
  *     This symbol, if defined, tells that fflush(NULL) does flush
  *     Note that if fflushNULL is defined, fflushall will not
  *     even be probed for and will be left undefined.
  */
-#define        FFLUSH_NULL             /**/
-/*#define      FFLUSH_ALL              / **/
+#define FFLUSH_NULL             /**/
+/*#define FFLUSH_ALL            / **/
 
 /* Fpos_t:
  *     This symbol holds the type used to declare file positions in libc.
 /* Gid_t_f:
  *     This symbol defines the format string used for printing a Gid_t.
  */
-#define        Gid_t_f         "hd"            /**/
+#define Gid_t_f         "hd"            /**/
 
 /* Gid_t_sign:
  *     This symbol holds the signedess of a Gid_t.
  *     This symbol, if defined, indicates that <fp_class.h> exists and
  *     should be included.
  */
-/*#define      I_FP_CLASS              / **/
+/*#define I_FP_CLASS            / **/
 
 /* I_GRP:
  *     This symbol, if defined, indicates to the C program that it should
  *     This symbol, if defined, indicates that <ieeefp.h> exists and
  *     should be included.
  */
-/*#define      I_IEEEFP                / **/
+/*#define I_IEEEFP              / **/
 
 /* I_INTTYPES:
  *     This symbol, if defined, indicates to the C program that it should
  *     This symbol, if defined, indicates that <libutil.h> exists and
  *     should be included.
  */
-/*#define      I_LIBUTIL               / **/
+/*#define I_LIBUTIL             / **/
 
 /* I_MACH_CTHREADS:
  *     This symbol, if defined, indicates to the C program that it should
  *     This symbol, if defined, indicates that <mntent.h> exists and
  *     should be included.
  */
-/*#define      I_MNTENT                / **/
+/*#define I_MNTENT              / **/
 
 /* I_NETDB:
  *     This symbol, if defined, indicates that <netdb.h> exists and
  *     This symbol, if defined, indicates that <poll.h> exists and
  *     should be included.
  */
-/*#define      I_POLL          / **/
+/*#define I_POLL                / **/
 
 /* I_PROT:
  *     This symbol, if defined, indicates that <prot.h> exists and
  *     should be included.
  */
-/*#define      I_PROT          / **/
+/*#define I_PROT                / **/
 
 /* I_PTHREAD:
  *     This symbol, if defined, indicates to the C program that it should
  *     This symbol, if defined, indicates that <shadow.h> exists and
  *     should be included.
  */
-/*#define      I_SHADOW                / **/
+/*#define I_SHADOW              / **/
 
 /* I_SOCKS:
  *     This symbol, if defined, indicates that <socks.h> exists and
  *     should be included.
  */
-/*#define      I_SOCKS         / **/
+/*#define I_SOCKS               / **/
 
 /* I_SUNMATH:
  *     This symbol, if defined, indicates that <sunmath.h> exists and
  *     should be included.
  */
-/*#define      I_SUNMATH               / **/
+/*#define I_SUNMATH             / **/
 
 /* I_SYSLOG:
  *     This symbol, if defined, indicates that <syslog.h> exists and
  *     should be included.
  */
-/*#define      I_SYSLOG                / **/
+/*#define I_SYSLOG              / **/
 
 /* I_SYSMODE:
  *     This symbol, if defined, indicates that <sys/mode.h> exists and
  *     should be included.
  */
-/*#define      I_SYSMODE               / **/
+/*#define I_SYSMODE             / **/
 
 /* I_SYS_MOUNT:
  *     This symbol, if defined, indicates that <sys/mount.h> exists and
  *     should be included.
  */
-/*#define      I_SYS_MOUNT             / **/
+/*#define I_SYS_MOUNT           / **/
 
 /* I_SYS_STATFS:
  *     This symbol, if defined, indicates that <sys/statfs.h> exists.
  */
-/*#define      I_SYS_STATFS            / **/
+/*#define I_SYS_STATFS          / **/
 
 /* I_SYS_STATVFS:
  *     This symbol, if defined, indicates that <sys/statvfs.h> exists and
  *     should be included.
  */
-/*#define      I_SYS_STATVFS           / **/
+/*#define I_SYS_STATVFS         / **/
 
 /* I_SYSUIO:
  *     This symbol, if defined, indicates that <sys/uio.h> exists and
  *     should be included.
  */
-#define        I_SYSUIO                /**/
+#define I_SYSUIO                /**/
 
 /* I_SYSUTSNAME:
  *     This symbol, if defined, indicates that <sys/utsname.h> exists and
  *     should be included.
  */
-#define        I_SYSUTSNAME            /**/
+#define I_SYSUTSNAME            /**/
 
 /* I_SYS_VFS:
  *     This symbol, if defined, indicates that <sys/vfs.h> exists and
  *     should be included.
  */
-/*#define      I_SYS_VFS               / **/
+/*#define I_SYS_VFS             / **/
 
 /* I_TIME:
  *     This symbol, if defined, indicates to the C program that it should
  *     This symbol, if defined, indicates that <ustat.h> exists and
  *     should be included.
  */
-/*#define      I_USTAT         / **/
+/*#define I_USTAT               / **/
 
 /* PERL_INC_VERSION_LIST:
  *     This variable specifies the list of subdirectories in over
  *     of copying mechanisms, handy.h defines a platform-
  *     independent macro, Perl_va_copy(src, dst), to do the job.
  */
-/*#define      NEED_VA_COPY            / **/
+/*#define NEED_VA_COPY          / **/
 
 /* Netdb_host_t:
  *     This symbol holds the type used for the 1st argument
  *     This symbol contains the number of bits a variable of type NVTYPE
  *     can preserve of a variable of type UVTYPE.
  */
-#define        IVTYPE          long            /**/
-#define        UVTYPE          unsigned long           /**/
-#define        I8TYPE          char            /**/
-#define        U8TYPE          unsigned char           /**/
-#define        I16TYPE         short   /**/
-#define        U16TYPE         unsigned short  /**/
-#define        I32TYPE         long    /**/
-#define        U32TYPE         unsigned long   /**/
+#define IVTYPE          long            /**/
+#define UVTYPE          unsigned long           /**/
+#define I8TYPE          char            /**/
+#define U8TYPE          unsigned char           /**/
+#define I16TYPE         short   /**/
+#define U16TYPE         unsigned short  /**/
+#define I32TYPE         long    /**/
+#define U32TYPE         unsigned long   /**/
 #ifdef HAS_QUAD
-#define        I64TYPE         long long       /**/
-#define        U64TYPE         unsigned long long      /**/
+#define I64TYPE         long long       /**/
+#define U64TYPE         unsigned long long      /**/
 #endif
-#define        NVTYPE          double          /**/
-#define        IVSIZE          4               /**/
-#define        UVSIZE          4               /**/
-#define        I8SIZE          1               /**/
-#define        U8SIZE          1               /**/
-#define        I16SIZE         2       /**/
-#define        U16SIZE         2       /**/
-#define        I32SIZE         4       /**/
-#define        U32SIZE         4       /**/
+#define NVTYPE          double          /**/
+#define IVSIZE          4               /**/
+#define UVSIZE          4               /**/
+#define I8SIZE          1               /**/
+#define U8SIZE          1               /**/
+#define I16SIZE         2       /**/
+#define U16SIZE         2       /**/
+#define I32SIZE         4       /**/
+#define U32SIZE         4       /**/
 #ifdef HAS_QUAD
-#define        I64SIZE         8       /**/
-#define        U64SIZE         8       /**/
+#define I64SIZE         8       /**/
+#define U64SIZE         8       /**/
 #endif
-#define        NVSIZE          8               /**/
+#define NVSIZE          8               /**/
 #undef NV_PRESERVES_UV
-#define        NV_PRESERVES_UV_BITS    31
+#define NV_PRESERVES_UV_BITS    31
 
 /* IVdf:
  *     This symbol defines the format string used for printing a Perl IV
  *     This symbol defines the format string used for printing a Perl NV
  *     using %g-ish floating point format.
  */
-#define        IVdf            "ld"            /**/
-#define        UVuf            "lu"            /**/
-#define        UVof            "lo"            /**/
-#define        UVxf            "lx"            /**/
-#define        UVXf            "lX"            /**/
-#define        NVef            "e"             /**/
-#define        NVff            "f"             /**/
-#define        NVgf            "g"             /**/
+/* I32df:
+ *     This symbol defines the format string used for printing a Perl I32
+ *     as a signed decimal integer.
+ */
+/* U32uf:
+ *     This symbol defines the format string used for printing a Perl U32
+ *     as an unsigned decimal integer.
+ */
+/* U32of:
+ *     This symbol defines the format string used for printing a Perl U32
+ *     as an unsigned octal integer.
+ */
+/* U32xf:
+ *     This symbol defines the format string used for printing a Perl U32
+ *     as an unsigned hexadecimal integer in lowercase abcdef.
+ */
+/* U32Xf:
+ *     This symbol defines the format string used for printing a Perl U32
+ *     as an unsigned hexadecimal integer in uppercase ABCDEF.
+ */
+#define IVdf            "ld"            /**/
+#define UVuf            "lu"            /**/
+#define UVof            "lo"            /**/
+#define UVxf            "lx"            /**/
+#define UVXf            "lX"            /**/
+#define NVef            "e"             /**/
+#define NVff            "f"             /**/
+#define NVgf            "g"             /**/
+#define I32df           "ld"            /**/
+#define U32uf           "lu"            /**/
+#define U32of           "lo"            /**/
+#define U32xf           "lx"            /**/
+#define U32Xf           "lX"            /**/
 
 /* Pid_t:
  *     This symbol holds the type used to declare process ids in the kernel.
  *     This symbol tells the name of the array holding the stdio streams.
  *     Usual values include _iob, __iob, and __sF.
  */
-/*#define      HAS_STDIO_STREAM_ARRAY  / **/
+/*#define HAS_STDIO_STREAM_ARRAY        / **/
 #define STDIO_STREAM_ARRAY     
 
 /* Uid_t_f:
  *     This symbol defines the format string used for printing a Uid_t.
  */
-#define        Uid_t_f         "hd"            /**/
+#define Uid_t_f         "hd"            /**/
 
 /* Uid_t_sign:
  *     This symbol holds the signedess of a Uid_t.
  *     you may need at least to reboot your OS to 64-bit mode.
  */
 #ifndef USE_64_BIT_INT
-/*#define      USE_64_BIT_INT          / **/
+/*#define USE_64_BIT_INT                / **/
 #endif
 
 #ifndef USE_64_BIT_ALL
-/*#define      USE_64_BIT_ALL          / **/
+/*#define USE_64_BIT_ALL                / **/
 #endif
 
 /* USE_FAST_STDIO:
  *     Defaults to define in Perls 5.8 and earlier, to undef later.
  */
 #ifndef USE_FAST_STDIO
-/*#define      USE_FAST_STDIO          / **/
+/*#define USE_FAST_STDIO                / **/
 #endif
 
 /* USE_LARGE_FILES:
  *     should be used when available.
  */
 #ifndef USE_LARGE_FILES
-#define        USE_LARGE_FILES         /**/
+#define USE_LARGE_FILES         /**/
 #endif
 
 /* USE_LONG_DOUBLE:
  *     be used when available.
  */
 #ifndef USE_LONG_DOUBLE
-/*#define      USE_LONG_DOUBLE         / **/
+/*#define USE_LONG_DOUBLE               / **/
 #endif
 
 /* USE_MORE_BITS:
  *     long doubles should be used when available.
  */
 #ifndef USE_MORE_BITS
-/*#define      USE_MORE_BITS           / **/
+/*#define USE_MORE_BITS         / **/
 #endif
 
 /* MULTIPLICITY:
  *     be built to use multiplicity.
  */
 #ifndef MULTIPLICITY
-/*#define      MULTIPLICITY            / **/
+/*#define MULTIPLICITY          / **/
 #endif
 
 /* USE_PERLIO:
  *     used in a fully backward compatible manner.
  */
 #ifndef USE_PERLIO
-#define        USE_PERLIO              /**/
+#define USE_PERLIO              /**/
 #endif
 
 /* USE_SOCKS:
  *     be built to use socks.
  */
 #ifndef USE_SOCKS
-/*#define      USE_SOCKS               / **/
+/*#define USE_SOCKS             / **/
 #endif
 
 /* USE_ITHREADS:
  *     try to use the various _r versions of library functions.
  *     This is extremely experimental.
  */
-/*#define      USE_ITHREADS            / **/
-/*#define              USE_THREADS             / **/
-/*#define      OLD_PTHREADS_API                / **/
-/*#define      USE_REENTRANT_API       / **/
+/*#define USE_ITHREADS          / **/
+/*#define       USE_THREADS             / **/
+/*#define OLD_PTHREADS_API              / **/
+/*#define USE_REENTRANT_API     / **/
 
 /* PERL_VENDORARCH:
  *     If defined, this symbol contains the name of a private library.
  *     Perl has been cross-compiled to.  Undefined if not a cross-compile.
  */
 #ifndef USE_CROSS_COMPILE
-/*#define      USE_CROSS_COMPILE       / **/
-#define        PERL_TARGETARCH ""      /**/
+/*#define USE_CROSS_COMPILE     / **/
+#define PERL_TARGETARCH ""      /**/
 #endif
 
 /* HAS_COPYSIGNL:
  *     to the program to supply one.  A good guess is
  *             extern int dbminit(char *);
  */
-/*#define      HAS_DBMINIT_PROTO       / **/
+/*#define HAS_DBMINIT_PROTO     / **/
 
 /* HAS_DIRFD:
  *     This manifest constant lets the C program know that dirfd
  *     to the program to supply one.  A good guess is
  *             extern int flock(int, int);
  */
-/*#define      HAS_FLOCK_PROTO / **/
+/*#define HAS_FLOCK_PROTO       / **/
 
 /* HAS_FPCLASSL:
  *     This symbol, if defined, indicates that the fpclassl routine is
  *     to the program to supply one.  A good guess is
  *             extern int sockatmark(int);
  */
-/*#define      HAS_SOCKATMARK_PROTO    / **/
+/*#define HAS_SOCKATMARK_PROTO  / **/
 
 /* HAS_SETRESGID_PROTO:
  *     This symbol, if defined, indicates that the system provides
  *     to the program to supply one.  Good guesses are
  *             extern int setresgid(uid_t ruid, uid_t euid, uid_t suid);
  */
-/*#define      HAS_SETRESGID_PROTO     / **/
+/*#define HAS_SETRESGID_PROTO   / **/
 
 /* HAS_SETRESUID_PROTO:
  *     This symbol, if defined, indicates that the system provides
  *     to the program to supply one.  Good guesses are
  *             extern int setresuid(uid_t ruid, uid_t euid, uid_t suid);
  */
-/*#define      HAS_SETRESUID_PROTO     / **/
+/*#define HAS_SETRESUID_PROTO   / **/
 
 /* HAS_STRFTIME:
  *     This symbol, if defined, indicates that the strftime routine is
  *             extern int syscall(int,  ...);
  *             extern int syscall(long, ...);
  */
-/*#define      HAS_SYSCALL_PROTO       / **/
+/*#define HAS_SYSCALL_PROTO     / **/
 
 /* U32_ALIGNMENT_REQUIRED:
  *     This symbol, if defined, indicates that you must access
  *     to the program to supply one.  A good guess is
  *             extern int usleep(useconds_t);
  */
-/*#define      HAS_USLEEP_PROTO        / **/
+/*#define HAS_USLEEP_PROTO      / **/
 
 /* I_CRYPT:
  *     This symbol, if defined, indicates that <crypt.h> exists and
  *     should be included.
  */
-/*#define      I_CRYPT         / **/
+/*#define I_CRYPT               / **/
 
 /* I_FP:
  *     This symbol, if defined, indicates that <fp.h> exists and
  *     should be included.
  */
-/*#define      I_FP            / **/
+/*#define I_FP          / **/
 
 /* I_LANGINFO:
  *     This symbol, if defined, indicates that <langinfo.h> exists and
  *     should be included.
  */
-/*#define      I_LANGINFO              / **/
+/*#define I_LANGINFO            / **/
 
 /* HAS_CTERMID_R:
  *     This symbol, if defined, indicates that the ctermid_r routine
index 5ebb630..e9dba44 100644 (file)
@@ -32,11 +32,11 @@ alignbytes='4'
 aphostname='/bin/uname -n'
 api_revision='5'
 api_subversion='0'
-api_version='36'
-api_versionstring='5.36.0'
+api_version='38'
+api_versionstring='5.38.0'
 ar='ar'
-archlib='/sys/lib/perl5/5.36.3/386'
-archlibexp='/sys/lib/perl5/5.36.3/386'
+archlib='/sys/lib/perl5/5.38.2/386'
+archlibexp='/sys/lib/perl5/5.38.2/386'
 archname64=''
 archname='386'
 archobjs=''
@@ -124,6 +124,7 @@ d_attribute_nonnull='undef'
 d_attribute_noreturn='undef'
 d_attribute_pure='undef'
 d_attribute_unused='undef'
+d_attribute_visibility='undef'
 d_attribute_warn_unused_result='undef'
 d_backtrace='undef'
 d_bsd='undef'
@@ -489,6 +490,7 @@ d_semget='undef'
 d_semop='undef'
 d_sendmsg='undef'
 d_setegid='undef'
+d_setenv='undef'
 d_seteuid='undef'
 d_setgrent='define'
 d_setgrent_r='undef'
@@ -731,6 +733,7 @@ hint='recommended'
 hostcat=''
 i16size='2'
 i16type='short'
+i32dformat='"ld"'
 i32size='4'
 i32type='long'
 i64size='8'
@@ -801,6 +804,7 @@ i_syssockio='undef'
 i_sysstat='define'
 i_sysstatfs='undef'
 i_sysstatvfs='undef'
+i_syssyscall='undef'
 i_systime='undef'
 i_systimek='undef'
 i_systimes='define'
@@ -825,17 +829,17 @@ inc_version_list=' '
 inc_version_list_init='0'
 incpath=''
 inews=''
-installarchlib='/sys/lib/perl/5.36.3/386'
+installarchlib='/sys/lib/perl/5.38.2/386'
 installbin='/usr/bin'
 installman1dir='/sys/man/1pub'
 installman3dir='/sys/man/2pub'
 installprefix='/usr'
 installprefixexp='/usr'
-installprivlib='/sys/lib/perl/5.36.3'
+installprivlib='/sys/lib/perl/5.38.2'
 installscript='/usr/bin'
-installsitearch='/sys/lib/perl/5.36.3/site_perl/386'
+installsitearch='/sys/lib/perl/5.38.2/site_perl/386'
 installsitebin='/usr/bin'
-installsitelib='/sys/lib/perl/5.36.3/site_perl'
+installsitelib='/sys/lib/perl/5.38.2/site_perl'
 installstyle='lib/perl5'
 installusrbinperl='undef'
 installvendorarch=''
@@ -961,8 +965,8 @@ pmake=''
 pr=''
 prefix='/usr'
 prefixexp='/usr'
-privlib='/sys/lib/perl/5.36.3'
-privlibexp='/sys/lib/perl/5.36.3'
+privlib='/sys/lib/perl/5.38.2'
+privlibexp='/sys/lib/perl/5.38.2'
 procselfexe=''
 prototype='define'
 ptrsize='4'
@@ -1027,13 +1031,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.36.3/site_perl/386'
+sitearch='/sys/lib/perl/5.38.2/site_perl/386'
 sitearchexp='/sys/lib/perl/site_perl/386'
 sitebin='/usr/bin'
 sitebinexp='/usr/bin'
-sitelib='/sys/lib/perl/5.36.3/site_perl'
-sitelib_stem='/sys/lib/perl/5.36.3/site_perl'
-sitelibexp='/sys/lib/perl/5.36.3/site_perl'
+sitelib='/sys/lib/perl/5.38.2/site_perl'
+sitelib_stem='/sys/lib/perl/5.38.2/site_perl'
+sitelibexp='/sys/lib/perl/5.38.2/site_perl'
 siteprefix='/usr'
 siteprefixexp='/usr'
 sizesize='4'
@@ -1068,7 +1072,7 @@ stdio_stream_array=''
 strerror_r_proto='0'
 strings='/sys/include/ape/string.h'
 submit=''
-subversion='3'
+subversion='2'
 sysman='/sys/man/1pub'
 tail=''
 tar=''
@@ -1088,8 +1092,12 @@ troff=''
 ttyname_r_proto='0'
 u16size='2'
 u16type='unsigned short'
+u32XUformat='"lX"'
+u32oformat='"lo"'
 u32size='4'
 u32type='unsigned long'
+u32uformat='"lu"'
+u32xformat='"lx"'
 u64size='8'
 u64type='unsigned long long'
 u8size='1'
@@ -1149,8 +1157,8 @@ vendorlib_stem=''
 vendorlibexp=''
 vendorprefix=''
 vendorprefixexp=''
-version='5.36.3'
-version_patchlevel_string='version 36 subversion 3'
+version='5.38.2'
+version_patchlevel_string='version 38 subversion 2'
 versiononly='undef'
 vi=''
 xlibpth=''
@@ -1164,10 +1172,10 @@ config_arg0='./Configure'
 config_args=''
 config_argc=0
 PERL_REVISION=5
-PERL_VERSION=36
-PERL_SUBVERSION=3
+PERL_VERSION=38
+PERL_SUBVERSION=2
 PERL_API_REVISION=5
-PERL_API_VERSION=36
+PERL_API_VERSION=38
 PERL_API_SUBVERSION=0
 PERL_PATCHLEVEL=
 PERL_CONFIG_SH=true
index 9872306..0cae63e 100644 (file)
@@ -106,7 +106,7 @@ void setprotoent(int a)
 
 void setservent(int a)
 {
-    croak("Function \"setservent\"  not implemented in this version of perl.");
+    croak("Function \"setservent\" not implemented in this version of perl.");
 }
 
 void endnetent()
index a5a318e..c7ac4ce 100644 (file)
@@ -12,7 +12,7 @@
  *     This symbol, if defined, indicates that the ioctl() routine is
  *     available to set I/O characteristics
  */
-#define        HAS_IOCTL               /**/
+#define HAS_IOCTL               /**/
  
 /* HAS_UTIME:
  *     This symbol, if defined, indicates that the routine utime() is
index c846d99..053b181 100644 (file)
@@ -186,7 +186,7 @@ my ($inhead1, $inhead2, $initem);
 sub podset {
     my ($pod, $file) = @_;
 
-    open my $fh, '<:raw', $file or my_die "Can't open file '$file' for $pod: $!";
+    open my $fh, '<:', $file or my_die "Can't open file '$file' for $pod: $!";
 
     local *_;
     my $found_pod;
@@ -206,11 +206,12 @@ sub podset {
     local $/ = '';
 
     while(<$fh>) {
-       tr/\015//d;
+       s/\r$//;
        if (s/^=head1 (NAME)\s*/=head2 /) {
            unhead1();
            $OUT .= "\n\n=head2 ";
            $_ = <$fh>;
+            last unless defined $_;
            # Remove svn keyword expansions from the Perl FAQ
            s/ \(\$Revision: \d+ \$\)//g;
            if ( /^\s*\Q$pod\E\b/ ) {
@@ -237,6 +238,8 @@ sub podset {
            s/^\s*\*\s*//;
            s/\n/ /g;
            s/\s+$//;
+           # make sure inner links include the target page
+           s{L<(?:[^|>]+\|)?\K/}{$pod/}g;
            next if /^[\d.]+$/;
            next if $pod eq 'perlmodlib' && /^ftp:/;
            $OUT .= ", " if $initem;
index 26904ee..8217cc8 100644 (file)
@@ -34,7 +34,7 @@ For ease of access, the Perl manual has been split up into several sections.
 
 # This section is parsed by Porting/pod_lib.pl for use by pod/buildtoc etc
 
-flag =g  perlmodlib perlapi perlintern
+flag =g  perluniprops perlmodlib perlapi perlintern
 flag =go perltoc
 flag =ro perlcn perljp perlko perltw
 flag =   perlvms
@@ -111,6 +111,7 @@ aux h2ph h2xs perlbug pl2pm pod2html pod2man splain xsubpp
     perlform           Perl formats
     perlobj            Perl objects
     perltie            Perl objects hidden behind simple variables
+    perlclass           Perl class syntax
       perldbmfilter    Perl DBM filters
 
     perlipc            Perl interprocess communication
@@ -160,6 +161,7 @@ aux h2ph h2xs perlbug pl2pm pod2html pod2man splain xsubpp
     perlmroapi         Perl method resolution plugin interface
     perlreapi          Perl regular expression plugin interface
     perlreguts         Perl regular expression engine internals
+    perlclassguts      Internals of class syntax
 
     perlapi            Perl API listing (autogenerated)
     perlintern         Perl internal functions (autogenerated)
@@ -179,9 +181,12 @@ aux h2ph h2xs perlbug pl2pm pod2html pod2man splain xsubpp
 
     perlhist           Perl history records
     perldelta          Perl changes since previous version
-    perl5362delta       Perl changes in version 5.36.2
-    perl5361delta       Perl changes in version 5.36.1
-    perl5360delta       Perl changes in version 5.36.0
+    perl5381delta      Perl changes in version 5.38.1
+    perl5380delta      Perl changes in version 5.38.0
+    perl5363delta      Perl changes in version 5.36.3
+    perl5362delta      Perl changes in version 5.36.2
+    perl5361delta      Perl changes in version 5.36.1
+    perl5360delta      Perl changes in version 5.36.0
     perl5343delta      Perl changes in version 5.34.3
     perl5342delta      Perl changes in version 5.34.2
     perl5341delta      Perl changes in version 5.34.1
@@ -318,8 +323,8 @@ available as manpages for use with the F<man> program.
 Some documentation is not available as man pages, so if a
 cross-reference is not found by man, try it with L<perldoc>.  Perldoc can
 also take you directly to documentation for functions (with the B<-f>
-switch). See C<perldoc --help> (or C<perldoc perldoc> or C<man perldoc>)
-for other helpful options L<perldoc> has to offer.
+switch). See S<C<perldoc --help>> (or S<C<perldoc perldoc>> or
+S<C<man perldoc>>) for other helpful options L<perldoc> has to offer.
 
 In general, if something strange has gone wrong with your program and you're
 not sure where you should look for help, try making your code comply with
index 8bcf0bb..ef7b456 100644 (file)
@@ -1266,7 +1266,7 @@ locales.
 
 =item *
 
-C<goto EXPR> is now documented to handle an expression that evalutes to a
+C<goto EXPR> is now documented to handle an expression that evaluates to a
 code reference as if it was C<goto &$coderef>.  This behavior is at least ten
 years old.
 
index 813d66d..520997e 100644 (file)
@@ -325,7 +325,7 @@ block compiles, it means you're using perl v5.14.0 or later.
 We now probe for compiler support for C11 thread local storage, and where
 available use this for "implicit context" for XS extensions making API calls for
 a threaded Perl build.  This requires fewer function calls at the C level than
-POSIX thread specific storage. We continue to use the the pthreads approach if
+POSIX thread specific storage. We continue to use the pthreads approach if
 the C11 approach is not available.
 
 F<Configure> run with the defaults will build an unthreaded Perl (which is
@@ -1050,7 +1050,7 @@ that are strict in rejecting certain C99 features, particularly mixed
 declarations and code, and hence it makes sense for XS module authors to audit
 that their code does not violate this. However, doing this is now only
 possible on these earlier versions of Perl, hence these modules need to be
-changed to only add this flag for C<<$] < 5.035005>>.
+changed to only add this flag for C<< $] < 5.035005 >>.
 
 =item *
 
index aa6d5a6..c851ab8 100644 (file)
@@ -46,7 +46,7 @@ be executed.
 
 =head1 Acknowledgements
 
-Perl 5.36.2 represents approximately 1 month of development since Perl
+Perl 5.36.2 represents approximately 7 months of development since Perl
 5.36.1 and contains approximately 2,300 lines of changes across 38 files
 from 4 authors.
 
index 4373f63..3450a56 100644 (file)
@@ -89,10 +89,10 @@ perlapio - perl's IO abstraction interface.
 =for apidoc_item  |         |PerlIO_flush
 =for apidoc_item  |         |PerlIO_get_base
 =for apidoc_item  |         |PerlIO_get_bufsiz
-=for apidoc_item T|int      |PerlIO_getc|PerlIO *d
 =for apidoc_item  |         |PerlIO_get_cnt
-=for apidoc_item T|int      |PerlIO_getpos|PerlIO *f|SV *save
 =for apidoc_item  |         |PerlIO_get_ptr
+=for apidoc_item T|int      |PerlIO_getc|PerlIO *d
+=for apidoc_item T|int      |PerlIO_getpos|PerlIO *f|SV *save
 =for apidoc_item T|int      |PerlIO_has_base|PerlIO *f
 =for apidoc_item T|int      |PerlIO_has_cntptr|PerlIO *f
 =for apidoc_item T|PerlIO * |PerlIO_importFILE|FILE *stdio|const char *mode
@@ -106,9 +106,9 @@ perlapio - perl's IO abstraction interface.
 =for apidoc_item T|void     |PerlIO_rewind|PerlIO *f
 =for apidoc_item  |         |PerlIO_seek
 =for apidoc_item  |         |PerlIO_set_cnt
+=for apidoc_item  |         |PerlIO_set_ptrcnt
 =for apidoc_item  |         |PerlIO_setlinebuf
 =for apidoc_item T|int      |PerlIO_setpos|PerlIO *f|SV *saved
-=for apidoc_item  |         |PerlIO_set_ptrcnt
 =for apidoc_item  |         |PerlIO_stderr
 =for apidoc_item  |         |PerlIO_stdin
 =for apidoc_item  |         |PerlIO_stdout
index a7b2c3a..acb55c9 100644 (file)
@@ -98,11 +98,6 @@ Stack Overflow is a free question-and-answer site for programmers. It's not
 focussed solely on Perl, but it does have an active group of users who do
 their best to help people with their Perl programming questions.
 
-=item L<http://prepan.org/>
-
-PrePAN is used as a place to discuss modules that you're considering uploading
-to the CPAN.  You can get feedback on their design before you upload.
-
 =back
 
 =head2 User Groups
index 27f6092..0cf8eb2 100644 (file)
@@ -21,8 +21,8 @@ structure it refers.  The rest of the name tells you the particular
 value to which it refers.  Usually this name is a single I<identifier>,
 that is, a string beginning with a letter or underscore, and
 containing letters, underscores, and digits.  In some cases, it may
-be a chain of identifiers, separated by C<::> (or by the slightly
-archaic C<'>); all but the last are interpreted as names of packages,
+be a chain of identifiers, separated by C<::> (or by the deprecated C<'>);
+all but the last are interpreted as names of packages,
 to locate the namespace in which to look up the final identifier
 (see L<perlmod/Packages> for details).  For a more in-depth discussion
 on identifiers, see L</Identifier parsing>.  It's possible to
@@ -137,11 +137,12 @@ That is, any word character in the ASCII range, as long as the first
 character is not a digit.
 
 There are two package separators in Perl: A double colon (C<::>) and a single
-quote (C<'>).  Normal identifiers can start or end with a double colon, and
-can contain several parts delimited by double colons.
-Single quotes have similar rules, but with the exception that they are not
-legal at the end of an identifier: That is, C<$'foo> and C<$foo'bar> are
-legal, but C<$foo'bar'> is not.
+quote (C<'>).  Use of C<'> as the package separator is deprecated and will be
+removed in Perl 5.40.  Normal identifiers can start or end with a double
+colon, and can contain several parts delimited by double colons.  Single
+quotes have similar rules, but with the exception that they are not legal at
+the end of an identifier: That is, C<$'foo> and C<$foo'bar> are legal, but
+C<$foo'bar'> is not.
 
 Additionally, if the identifier is preceded by a sigil --
 that is, if the identifier is part of a variable name -- it
index 1e5ebf3..52aef07 100644 (file)
@@ -621,7 +621,7 @@ will be lost.
  ANYOFHr          sv 1       Like ANYOFH, but the flags field contains
                              packed bounds for all matchable UTF-8 start
                              bytes.
- ANYOFHs          sv 1       Like ANYOFHb, but has a string field that
+ ANYOFHs          sv:str 1   Like ANYOFHb, but has a string field that
                              gives the leading matchable UTF-8 bytes;
                              flags field is len
  ANYOFR           packed 1   Matches any character in the range given by
@@ -632,6 +632,10 @@ will be lost.
  ANYOFRb          packed 1   Like ANYOFR, but all matches share the same
                              UTF-8 start byte, given in the flags field
 
+ ANYOFHbbm        none bbm   Like ANYOFHb, but only for 2-byte UTF-8
+                             characters; uses a bitmap to match the
+                             continuation byte
+
  ANYOFM           byte 1     Like ANYOF, but matches an invariant byte
                              as determined by the mask and arg
  NANYOFM          byte 1     complement of ANYOFM
@@ -664,7 +668,7 @@ will be lost.
  #               pointer of each individual branch points; each branch
  #               starts with the operand node of a BRANCH node.
  #
- BRANCH           node       Match this alternative, or the next...
+ BRANCH           node 1     Match this alternative, or the next...
 
  # Literals
 
@@ -743,14 +747,19 @@ will be lost.
  #               (one character per match) are implemented with STAR
  #               and PLUS for speed and to minimize recursive plunges.
  #
- STAR             node       Match this (simple) thing 0 or more times.
- PLUS             node       Match this (simple) thing 1 or more times.
-
- CURLY            sv 2       Match this simple thing {n,m} times.
- CURLYN           no 2       Capture next-after-this simple thing
- CURLYM           no 2       Capture this medium-complex thing {n,m}
+ STAR             node       Match this (simple) thing 0 or more times:
+                             /A{0,}B/ where A is width 1 char
+ PLUS             node       Match this (simple) thing 1 or more times:
+                             /A{1,}B/ where A is width 1 char
+
+ CURLY            sv 3       Match this (simple) thing {n,m} times:
+                             /A{m,n}B/ where A is width 1 char
+ CURLYN           no 3       Capture next-after-this simple thing:
+                             /(A){m,n}B/ where A is width 1 char
+ CURLYM           no 3       Capture this medium-complex thing {n,m}
+                             times: /(A){m,n}B/ where A is fixed-length
+ CURLYX           sv 3       Match/Capture this complex thing {n,m}
                              times.
- CURLYX           sv 2       Match this complex thing {n,m} times.
 
  # This terminator creates a loop structure for CURLYX
  WHILEM           no         Do curly processing and see if rest
@@ -764,30 +773,30 @@ will be lost.
  SROPEN           none       Same as OPEN, but for script run
  SRCLOSE          none       Close preceding SROPEN
 
- REF              num 1      Match some already matched string
- REFF             num 1      Match already matched string, using /di
+ REF              num 2      Match some already matched string
+ REFF             num 2      Match already matched string, using /di
                              rules.
- REFFL            num 1      Match already matched string, using /li
+ REFFL            num 2      Match already matched string, using /li
                              rules.
- REFFU            num 1      Match already matched string, usng /ui.
- REFFA            num 1      Match already matched string, using /aai
+ REFFU            num 2      Match already matched string, usng /ui.
+ REFFA            num 2      Match already matched string, using /aai
                              rules.
 
  # Named references.  Code in regcomp.c assumes that these all are after
  # the numbered references
- REFN             no-sv 1    Match some already matched string
- REFFN            no-sv 1    Match already matched string, using /di
+ REFN             no-sv 2    Match some already matched string
+ REFFN            no-sv 2    Match already matched string, using /di
                              rules.
- REFFLN           no-sv 1    Match already matched string, using /li
+ REFFLN           no-sv 2    Match already matched string, using /li
                              rules.
- REFFUN           num 1      Match already matched string, using /ui
+ REFFUN           num 2      Match already matched string, using /ui
                              rules.
- REFFAN           num 1      Match already matched string, using /aai
+ REFFAN           num 2      Match already matched string, using /aai
                              rules.
 
  # Support for long RE
  LONGJMP          off 1 1    Jump far away.
- BRANCHJ          off 1 1    BRANCH with long offset.
+ BRANCHJ          off 2 1    BRANCH with long offset.
 
  # Special Case Regops
  IFMATCH          off 1 1    Succeeds if the following matches; non-zero
@@ -805,7 +814,7 @@ will be lost.
  # The heavy worker
 
  EVAL             evl/flags  Execute some Perl code.
-                  2L
+                  2
 
  # Modifiers
 
@@ -816,7 +825,7 @@ will be lost.
  RENUM            off 1 1    Group with independently numbered parens.
 
  # Regex Subroutines
- GOSUB            num/ofs 2L recurse to paren arg1 at (signed) ofs arg2
+ GOSUB            num/ofs 2  recurse to paren arg1 at (signed) ofs arg2
 
  # Special conditionals
  GROUPPN          no-sv 1    Whether the group matched.
@@ -827,7 +836,7 @@ will be lost.
  ENDLIKE          none       Used only for the type field of verbs
  OPFAIL           no-sv 1    Same as (?!), but with verb arg
  ACCEPT           no-sv/num  Accepts the current matched string, with
-                  2L         verbar
+                  2          verbar
 
  # Verbs With Arguments
  VERB             no-sv 1    Used only for the type field of verbs
index 20fa8d7..01cd53b 100644 (file)
@@ -76,7 +76,7 @@ Interactively supply an arbitrary C<expression> using C<-e>.
 
 =item perl -d:ptkdb program_name
 
-Debug a given program via the C<Devel::ptkdb> GUI.
+Debug a given program via the L<Devel::ptkdb> GUI.
 
 =item perl -dt threaded_program_name
 
@@ -173,7 +173,7 @@ X<debugger command, y>
 Display all (or some) lexical variables (mnemonic: C<mY> variables)
 in the current scope or I<level> scopes higher.  You can limit the
 variables that you see with I<vars> which works exactly as it does
-for the C<V> and C<X> commands.  Requires the C<PadWalker> module
+for the C<V> and C<X> commands.  Requires the L<PadWalker> module
 version 0.08 or higher; will warn if this isn't installed.  Output
 is pretty-printed in the same style as for C<V> and the format is
 controlled by the same options.
@@ -579,13 +579,13 @@ Redo number'th previous command.
 X<debugger command, !>
 
 Redo last command that started with pattern.
-See C<o recallCommand>, too.
+See S<C<o recallCommand>>, too.
 
 =item !! cmd
 X<debugger command, !!>
 
 Run cmd in a subprocess (reads from DB::IN, writes to DB::OUT) See
-C<o shellBang>, also.  Note that the user's current shell (well,
+S<C<o shellBang>>, also.  Note that the user's current shell (well,
 their C<$ENV{SHELL}> variable) will be used, which can interfere
 with proper interpretation of exit status or signal and coredump
 information.
@@ -862,7 +862,7 @@ include lexicals in a module's file scope, or lost in closures.
 X<debugger option, history, HistFile>
 
 The path of the file from which the history (assuming a usable
-Term::ReadLine backend) will be read on the debugger's startup, and to which
+L<Term::ReadLine> backend) will be read on the debugger's startup, and to which
 it will be saved on shutdown (for persistence across sessions). Similar in
 concept to Bash's C<.bash_history> file.
 
@@ -951,7 +951,7 @@ variable settings):
   $ ( PERLDB_OPTS="NonStop frame=1 AutoTrace LineInfo=tperl.out"
       perl -d myprogram )
 
-which may be useful for debugging a program that uses C<Term::ReadLine>
+which may be useful for debugging a program that uses L<Term::ReadLine>
 itself.  Do not forget to detach your shell from the TTY in the window that
 corresponds to F</dev/ttyXX>, say, by issuing a command like
 
@@ -1145,14 +1145,14 @@ use only, and as such are subject to change without notice.
 
 As shipped, the only command-line history supplied is a simplistic one
 that checks for leading exclamation points.  However, if you install
-the Term::ReadKey and Term::ReadLine modules from CPAN (such as
-Term::ReadLine::Gnu, Term::ReadLine::Perl, ...) you will
+the L<Term::ReadKey> and L<Term::ReadLine> modules from CPAN (such as
+L<Term::ReadLine::Gnu>, L<Term::ReadLine::Perl>, ...) you will
 have full editing capabilities much like those GNU I<readline>(3) provides.
 Look for these in the F<modules/by-module/Term> directory on CPAN.
 These do not support normal B<vi> command-line editing, however.
 
 A rudimentary command-line completion is also available, including
-lexical variables in the current scope if the C<PadWalker> module
+lexical variables in the current scope if the L<PadWalker> module
 is installed.
 
 Without Readline support you may see the symbols "^[[A", "^[[C", "^[[B",
index 7ba4b99..c7d7a64 100644 (file)
@@ -2,16 +2,16 @@
 
 =head1 NAME
 
-perldelta - what is new for perl v5.36.3
+perldelta - what is new for perl v5.38.2
 
 =head1 DESCRIPTION
 
-This document describes differences between the 5.36.1 release and the 5.36.3
-release.  B<Please note:> This document ignores Perl 5.36.2, a broken release
+This document describes differences between the 5.38.0 release and the 5.38.2
+release.  B<Please note:> This document ignores Perl 5.38.1, a broken release
 which existed for a couple of days only.
 
-If you are upgrading from an earlier release such as 5.36.0, first read
-L<perl5361delta>, which describes differences between 5.36.0 and 5.36.1.
+If you are upgrading from an earlier release such as 5.37.0, first read
+L<perl5380delta>, which describes differences between 5.37.0 and 5.38.0.
 
 =head1 Security
 
@@ -47,16 +47,16 @@ be executed.
 
 =head1 Acknowledgements
 
-Perl 5.36.3 represents approximately 1 month of development since Perl
-5.36.1 and contains approximately 2,300 lines of changes across 38 files
+Perl 5.38.2 represents approximately 5 months of development since Perl
+5.38.0 and contains approximately 6,100 lines of changes across 34 files
 from 4 authors.
 
 Excluding auto-generated files, documentation and release tools, there were
-approximately 1,400 lines of changes to 8 .pm, .t, .c and .h files.
+approximately 1,300 lines of changes to 9 .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.36.3:
+contributed the improvements that became Perl 5.38.2:
 
 Karl Williamson, Paul Evans, Steve Hay, Tony Cook.
 
index 6695760..38aa9c5 100644 (file)
@@ -50,6 +50,12 @@ letter.
 to check the return value of your socket() call?  See
 L<perlfunc/accept>.
 
+=item ADJUST is experimental
+
+(S experimental::class) This warning is emitted if you use the C<ADJUST>
+keyword of C<use feature 'class'>.  This keyword is currently
+experimental and its behaviour may change in future releases of Perl.
+
 =item Aliasing via reference is experimental
 
 (S experimental::refaliasing) This warning is emitted if you use
@@ -313,6 +319,13 @@ the current set of allowed keys of a restricted hash.
 the current package to be freed.  Perl cannot figure out what to
 do, so it throws up its hands in despair.
 
+=item Attempt to bless into a class
+
+(F) You are attempting to call C<bless> with a package name that is a
+new-style C<class>.  This is not necessary, as instances created by the
+constructor are already in the correct class.  Instances cannot be created
+by other means, such as C<bless>.
+
 =item Attempt to bless into a reference
 
 (F) The CLASSNAME argument to the bless() operator is expected to be
@@ -455,6 +468,13 @@ This message can be seen quite often with DB_File on systems with "hard"
 dynamic linking, like C<AIX> and C<OS/2>.  It is a bug of C<Berkeley DB>
 which is left unnoticed if C<DB> uses I<forgiving> system malloc().
 
+=item Bad infix plugin result (%zd) - did not consume entire identifier <%s>
+
+(F) A plugin using the C<PL_infix_plugin> mechanism to parse an infix
+keyword consumed part of a named identifier operator name but did not
+consume all of it.  This is not permitted as it leads to fragile parsing
+results.
+
 =item Badly placed ()'s
 
 (A) You've accidentally run your script through B<csh> instead
@@ -486,24 +506,9 @@ plugin API.
 had never been malloc()ed in the first place.  Mandatory, but can
 be disabled by setting the environment variable C<PERL_BADFREE> to 1.
 
-=item Bad symbol for array
-
-(P) An internal request asked to add an array entry to something that
-wasn't a symbol table entry.
-
-=item Bad symbol for dirhandle
-
-(P) An internal request asked to add a dirhandle entry to something
-that wasn't a symbol table entry.
-
-=item Bad symbol for filehandle
-
-(P) An internal request asked to add a filehandle entry to something
-that wasn't a symbol table entry.
+=item Bad symbol for %s
 
-=item Bad symbol for hash
-
-(P) An internal request asked to add a hash entry to something that
+(P) An internal request asked to add an entry of the named type to something that
 wasn't a symbol table entry.
 
 =item Bad symbol for scalar
@@ -668,6 +673,12 @@ checking.  Alternatively, if you are certain that you're calling the
 function correctly, you may put an ampersand before the name to avoid
 the warning.  See L<perlsub>.
 
+=item Cannot assign :param(%s) to field %s because that name is already in use
+
+(F) An attempt was made to apply a parameter name to a field, when the name
+is already being used by another field in the same class, or one of its
+parent classes. This would cause a name clash so is not allowed.
+
 =item Cannot chr %f
 
 (F) You passed an invalid number (like an infinity or not-a-number) to C<chr>.
@@ -708,11 +719,29 @@ no legal conversion from that type of reference to a typeglob.
 (P) Perl detected an attempt to copy a value to an internal type that cannot
 be directly assigned to.
 
+=item Cannot create class %s as it already has a non-empty @ISA
+
+(F) An attempt was made to create a class out of a package that already has
+an C<@ISA> array, and the array is not empty.  This is not permitted, as it
+would lead to a class with inconsistent inheritance.
+
 =item Cannot find encoding "%s"
 
 (S io) You tried to apply an encoding that did not exist to a filehandle,
 either with open() or binmode().
 
+=item Cannot invoke a method of "%s" on an instance of "%s"
+
+(F) You tried to directly call a C<method> subroutine of one class by passing
+in a value that is an instance of a different class.  This is not permitted,
+as the method would not have access to the correct instance fields.
+
+=item Cannot invoke method on a non-instance
+
+(F) You tried to directly call a C<method> subroutine of a class by passing
+in a value that is not an instance of that class.  This is not permitted, as
+the method would not then have access to its instance fields.
+
 =item Cannot open %s as a dirhandle: it is already open as a filehandle
 
 (F) You tried to use opendir() to associate a dirhandle to a symbol (glob
@@ -727,6 +756,11 @@ or scalar) that already holds a dirhandle.  Since this idiom might render
 your code confusing, it was deprecated in Perl 5.10.  As of Perl 5.28, it
 is a fatal error.
 
+=item Cannot '%s' outside of a 'class'
+
+(F) You attempted to use one of the keywords that only makes sense inside
+a C<class> definition, at a location that is not inside such a class.
+
 =item Cannot pack %f with '%c'
 
 (F) You tried converting an infinity or not-a-number to an integer,
@@ -737,6 +771,11 @@ which makes no sense.
 (F) You tried printing an infinity or not-a-number as a character (%c),
 which makes no sense.  Maybe you meant '%s', or just stringifying it?
 
+=item Cannot reopen existing class "%s"
+
+(F) You tried to begin a C<class> definition for a class that already exists.
+A class may only have one definition block.
+
 =item Cannot set tied @DB::args
 
 (F) C<caller> tried to set C<@DB::args>, but found it tied.  Tying C<@DB::args>
@@ -774,6 +813,11 @@ not permitted.
 (F) Similar to above, but involving a C<finally> block at the end of a
 C<try>/C<catch> construction rather than a C<defer> block.
 
+=item Can't bless an object reference
+
+(F) You attempted to call C<bless> on a value that already refers to a real
+object instance.
+
 =item Can't bless non-reference value
 
 (F) Only hard references may be blessed.  This is how Perl "enforces"
@@ -788,6 +832,14 @@ a C<given> block.  You probably meant to use C<next> or C<last>.
 
 (F) You called C<break>, but you're not inside a C<given> block.
 
+=item Can't call destructor for 0x%p in global destruction
+
+(S) This should not happen. Internals code has set up a destructor
+using C<mortal_destructor_sv> or C<mortal_destructor_x> which is firing
+during global destruction. Please attempt to reduce the code that triggers
+this warning down to a small an example as possible and then report the
+problem to L<https://github.com/Perl/perl5/issues/new/choose>
+
 =item Can't call method "%s" on an undefined value
 
 (F) You used the syntax of a method call, but the slot filled by the
@@ -851,6 +903,11 @@ but then $foo no longer contains a glob.
 (F) You called C<continue>, but you're not inside a C<when>
 or C<default> block.
 
+=item can't convert empty path
+
+(F) On Cygwin, you called a path conversion function with an empty path.
+Only non-empty paths are legal.
+
 =item Can't create pipe mailbox
 
 (P) An error peculiar to VMS.  The process is suffering from exhausted
@@ -1191,6 +1248,14 @@ to load "%s"?)
 could not be found in UNIVERSAL.  This often means that a method
 requires a package that has not been loaded.
 
+=item Can't locate object method "INC", nor "INCDIR" nor string overload via package "%s" %s in @INC
+
+(F) You pushed an object, either directly or via an array reference hook,
+into C<@INC>, but the object doesn't support any known hook methods, nor
+a string overload and is also not a blessed CODE reference. In short the
+C<require> function does not know what to do with the object.
+See also L<perlfunc/require>.
+
 =item Can't locate package %s for @%s::ISA
 
 (W syntax) The @ISA array contained the name of another package that
@@ -1589,6 +1654,18 @@ or if you use an explicit C<continue>.)
 with an assignment operator, which implies modifying the value itself.
 Perhaps you need to copy the value to a temporary, and repeat that.
 
+=item catch block requires a (VAR)
+
+(F) You tried to use the C<try> and C<catch> syntax of C<use feature 'try'>
+but did not include the error variable in the C<catch> block. The
+parenthesized variable name is not optional, unlike in some other forms of
+syntax you may be familiar with from CPAN modules or other languages.
+
+The required syntax is
+
+    try { ... }
+    catch ($var) { ... }
+
 =item Character following "\c" must be printable ASCII
 
 (F) In C<\cI<X>>, I<X> must be a printable (non-control) ASCII character.
@@ -1703,6 +1780,34 @@ is better written as simply itself, perhaps preceded by a backslash
 for non-word characters.  Doing it the way you did is not portable
 between ASCII and EBCDIC platforms.
 
+=item Class already has a superclass, cannot add another
+
+(F) You attempted to specify a second superclass for a C<class> by using
+the C<:isa> attribute, when one is already specified.  Unlike classes
+whose instances are created with C<bless>, classes created via the
+C<class> keyword cannot have more than one superclass.
+
+=item Class attribute %s requires a value
+
+(F) You specified an attribute for a class that would require a value to
+be passed in parentheses, but did not provide one.  Remember that
+whitespace is B<not> permitted between the attribute name and its value;
+you must write this as
+
+    class Example::Class :attr(VALUE) ...
+
+=item class is experimental
+
+(S experimental::class) This warning is emitted if you use the C<class>
+keyword of C<use feature 'class'>.  This keyword is currently
+experimental and its behaviour may change in future releases of Perl.
+
+=item Class :isa attribute requires a class but "%s" is not one
+
+(F) When creating a subclass using the C<class> C<:isa> attribute, the
+named superclass must also be a real class created using the C<class>
+keyword.
+
 =item Cloning substitution context is unimplemented
 
 (F) Creating a new thread inside the C<s///> operator is not supported.
@@ -1803,18 +1908,6 @@ Perl yourself.  The #! line at the top of your file could look like
 Perl uses this generic message when none of the errors that it
 encountered were severe enough to halt compilation immediately.
 
-=item Complex regular subexpression recursion limit (%d) exceeded
-
-(W regexp) The regular expression engine uses recursion in complex
-situations where back-tracking is required.  Recursion depth is limited
-to 32766, or perhaps less in architectures where the stack cannot grow
-arbitrarily.  ("Simple" and "medium" situations are handled without
-recursion and are not subject to a limit.)  Try shortening the string
-under examination; looping in Perl code (e.g. with C<while>) rather than
-in the regular expression engine; or rewriting the regular expression so
-that it is simpler or backtracks less.  (See L<perlfaq2> for information
-on I<Mastering Regular Expressions>.)
-
 =item connect() on closed socket %s
 
 (W closed) You tried to do a connect on a closed socket.  Did you forget
@@ -1931,7 +2024,7 @@ called as barewords.  Something like this will work:
 
 (P) This is either an error in Perl, or, if you're using
 one, your L<custom regular expression engine|perlreapi>.  If not the
-latter, report the problem to L<https://github.com/Perl/perl5/issues>.
+latter, report the problem to L<https://github.com/Perl/perl5/issues/new/choose>.
 
 =item corrupted regexp pointers
 
@@ -2075,11 +2168,11 @@ See L<perlfunc/pack>.
 
 =item do "%s" failed, '.' is no longer in @INC; did you mean do "./%s"?
 
-(D deprecated) Previously C< do "somefile"; > would search the current
-directory for the specified file.  Since perl v5.26.0, F<.> has been
-removed from C<@INC> by default, so this is no longer true.  To search the
-current directory (and only the current directory) you can write
-C< do "./somefile"; >.
+(D deprecated::dot_in_inc) Previously C< do "somefile"; > would search
+the current directory for the specified file. Since perl v5.26.0, F<.>
+has been removed from C<@INC> by default, so this is no longer true. To
+search the current directory (and only the current directory) you can
+write C< do "./somefile"; >.
 
 =item Don't know how to get file name
 
@@ -2092,12 +2185,12 @@ somehow called on another platform.  This should not happen.
 
 =item Downgrading a use VERSION declaration to below v5.11 is deprecated
 
-(S deprecated) This warning is emitted on a C<use VERSION> statement that
-requests a version below v5.11 (when the effects of C<use strict> would be
-disabled), after a previous declaration of one having a larger number (which
-would have enabled these effects). Because of a change to the way that
-C<use VERSION> interacts with the strictness flags, this is no longer
-supported.
+(S deprecated::version_downgrade) This warning is emitted on a
+C<use VERSION> statement that requests a version below v5.11 (when the
+effects of C<use strict> would be disabled), after a previous
+declaration of one having a larger number (which would have enabled
+these effects). Because of a change to the way that C<use VERSION>
+interacts with the strictness flags, this is no longer supported.
 
 =item (Do you need to predeclare %s?)
 
@@ -2170,6 +2263,18 @@ the C<encoding> pragma, is no longer supported as of Perl 5.26.0.
 Setting it to anything other than C<undef> is a fatal error as of Perl
 5.28.
 
+=item ${^HOOK}{%s} may only be a CODE reference or undef
+
+(F) You attempted to assign something other than undef or a CODE ref to
+C<%{^HOOK}>. Hooks may only be CODE refs. See L<perlvar/%{^HOOK}> for
+details.
+
+=item Attempt to set unknown hook '%s' in %{^HOOK}
+
+(F) You attempted to assign something other than undef or a CODE ref to
+C<%{^HOOK}>. Hooks may only be CODE refs. See L<perlvar/%{^HOOK}> for
+details.
+
 =item entering effective %s failed
 
 (F) While under the C<use filetest> pragma, switching the real and
@@ -2250,6 +2355,10 @@ Catamount. See L<perlport>.
 
 (F) The final summary message when a Perl compilation fails.
 
+=item Execution of %s aborted due to compilation errors.
+
+(F) The final summary message when a Perl compilation fails.
+
 =item exists argument is not a HASH or ARRAY element or a subroutine
 
 (F) The argument to C<exists> must be a hash or array element or a
@@ -2290,6 +2399,12 @@ as a goto, or a loop control statement.
 (W exiting) You are exiting a substitution by unconventional means, such
 as a return, a goto, or a loop control statement.
 
+=item Expected %s reference in export_lexically
+
+(F) The type of a reference given to L<builtin/export_lexically> did not
+match the sigil of the preceding name, or the value was not a reference at
+all. 
+
 =item Expecting close bracket in regex; marked by S<<-- HERE> in m/%s/
 
 (F) You wrote something like
@@ -2342,6 +2457,12 @@ the effect of blessing the reference into the package main.  This is
 usually not what you want.  Consider providing a default target package,
 e.g. bless($ref, $p || 'MyPackage');
 
+=item export_lexically can only be called at compile time
+
+(F) L<builtin/export_lexically> was called at runtime.  Because it creates
+new names in the lexical scope currently being compiled, it can only be
+called from code inside C<BEGIN> block in that scope.
+
 =item %s: Expression syntax
 
 (A) You've accidentally run your script through B<csh> instead of Perl.
@@ -2384,6 +2505,39 @@ PDP-11 or something?
 (F) A tied array claimed to have a negative number of elements, which
 is not possible.
 
+=item Field already has a parameter name, cannot add another
+
+(F) A field may have at most one application of the C<:param> attribute to
+assign a parameter name to it; once applied a second one is not allowed.
+
+=item Field attribute %s requires a value
+
+(F) You specified an attribute for a field that would require a value to
+be passed in parentheses, but did not provide one.  Remember that
+whitespace is B<not> permitted between the attribute name and its value;
+you must write this as
+
+    field $var :attr(VALUE) ...
+
+=item field is experimental
+
+(S experimental::class) This warning is emitted if you use the C<field>
+keyword of C<use feature 'class'>.  This keyword is currently
+experimental and its behaviour may change in future releases of Perl.
+
+=item Field %s is not accessible outside a method
+
+(F) An attempt was made to access a field variable of a class from code
+that does not appear inside the body of a C<method> subroutine.  This is not
+permitted, as only methods will have access to the fields of an instance.
+
+=item Field %s of "%s" is not accessible in a method of "%s"
+
+(F) An attempt was made to access a field variable of a class, from a
+method of another class nested inside the one that actually defined it.
+This is not permitted, as only methods defined by a given class are
+permitted to access fields of that class.
+
 =item Field too wide in 'u' format in pack
 
 (W pack) Each line in an uuencoded string starts with a length indicator
@@ -2418,6 +2572,11 @@ previously.
 (W io) You opened for writing a filehandle that got the same filehandle id
 as STDIN.  This occurred because you closed STDIN previously.
 
+=item Filehandle STD%s reopened as %s only for input
+
+(W io) You opened for reading a filehandle that got the same filehandle id
+as STDOUT or STDERR.  This occurred because you closed the handle previously.
+
 =item Final $ should be \$ or $name
 
 (F) You must now decide whether the final $ in a string was meant to be
@@ -2504,11 +2663,10 @@ C<getpwnam> operator returned an invalid UIC.
 forget to check the return value of your socket() call?  See
 L<perlfunc/getsockopt>.
 
-=item given is experimental
+=item given is deprecated
 
-(S experimental::smartmatch) C<given> depends on smartmatch, which
-is experimental, so its behavior may change or even be removed
-in any future release of perl.  See the explanation under
+(D deprecated::smartmatch) C<given> depends on smartmatch, which is
+deprecated. It will be removed in Perl 5.42. See the explanation under
 L<perlsyn/Experimental Details on given and when>.
 
 =item Global symbol "%s" requires explicit package name (did you forget to
@@ -3227,14 +3385,6 @@ neither as a system call nor an ioctl call (SIOCATMARK).
 Perl.  The current valid ones are given in
 L<perlrebackslash/\b{}, \b, \B{}, \B>.
 
-=item %s is forbidden - matches null string many times in regex; marked by S<<-- HERE> in
-m/%s/
-
-(F) The pattern you've specified might cause the regular expression to
-infinite loop so it is forbidden.  The S<<-- HERE>
-shows whereabouts in the regular expression the problem was discovered.
-See L<perlre>.
-
 =item %s() isn't allowed on :utf8 handles
 
 (F) The sysread(), recv(), syswrite() and send() operators are
@@ -3441,12 +3591,22 @@ considered punctuation in the C locale (and the POSIX standard defers to
 the C standard), and Unicode is generally considered a superset of
 the C locale.  But Unicode has added an extra category, "Symbol", and
 classifies these particular characters as being symbols.  Most UTF-8
-locales have them treated as punctuation, so that L<ispunct(2)> returns
+locales have them treated as punctuation, so that L<ispunct(3)> returns
 non-zero for them.  But a few locales have it return 0.   Perl takes
 the first approach, not using C<ispunct()> at all (see L<Note [5] in
 perlrecharclass|perlrecharclass/[5]>), and this message is raised to notify you that you
 are getting Perl's approach, not the locale's.
 
+=item Locale '%s' is unsupported, and may crash the interpreter.
+
+(S locale) The named locale is not supported by Perl, and using it leads
+to undefined behavior, including potentially crashing the computer.
+
+Currently the only locales that generate this severe warning are
+non-UTF-8 ones which have characters that require more than one byte to
+represent (common in older East Asian language locales).  See
+L<perllocale>.
+
 =item Locale '%s' may not work well.%s
 
 (W locale) You are using the named locale, which is a non-UTF-8 one, and
@@ -3706,16 +3866,36 @@ See L<perlfunc/unpack>.
 (F) An attempt was made to specify an entry in an overloading table that
 doesn't resolve to a valid subroutine.  See L<overload>.
 
+=item method is experimental
+
+(S experimental::class) This warning is emitted if you use the C<method>
+keyword of C<use feature 'class'>.  This keyword is currently
+experimental and its behaviour may change in future releases of Perl.
+
 =item Method %s not permitted
 
 See L</500 Server error>.
 
+=item Method %s redefined
+
+(W redefine) You redefined a method.  To suppress this warning, say
+
+    {
+       no warnings 'redefine';
+       *name = method { ... };
+    }
+
 =item Might be a runaway multi-line %s string starting on line %d
 
 (S) An advisory indicating that the previous error may have been caused
 by a missing delimiter on a string or pattern, because it eventually
 ended earlier on the current line.
 
+=item Mismatched brackets in template
+
+(F) A pack template could not be parsed because pairs of C<[...]> or
+C<(...)> could not be matched up. See L<perlfunc/pack>.
+
 =item Misplaced _ in number
 
 (W syntax) An underscore (underbar) in a numeric constant did not
@@ -3793,11 +3973,17 @@ can vary from one line to the next.
 
 =item Missing or undefined argument to %s
 
-(F) You tried to call require or do with no argument or with an undefined
-value as an argument.  Require expects either a package name or a
-file-specification as an argument; do expects a filename.  See
+(F) You tried to call C<require> or C<do> with no argument or with an
+undefined value as an argument.  Require expects either a package name or
+file-specification as an argument; do expects a filename.  See
 L<perlfunc/require EXPR> and L<perlfunc/do EXPR>.
 
+=item Missing or undefined argument to %s via %{^HOOK}{require__before}
+
+(F) A C<%{^HOOK}{require__before}> hook rewrote the name of the file being
+compiled with C<require> or C<do> with an empty string an undefined value
+which is forbidden.  See L<perlvar/%{^HOOK}> and L<perlfunc/require EXPR>.
+
 =item Missing right brace on \%c{} in regex; marked by S<<-- HERE> in m/%s/
 
 (F) Missing right brace in C<\x{...}>, C<\p{...}>, C<\P{...}>, or C<\N{...}>.
@@ -4468,11 +4654,24 @@ arguments.  The arguments should come in pairs.
 (W misc) You specified an odd number of elements to initialize a hash,
 which is odd, because hashes come in key/value pairs.
 
+=item Odd number of elements in export_lexically
+
+(F) A call to L<builtin/export_lexically> contained an odd number of
+arguments.  This is not permitted, because each name must be paired with a
+valid reference value.
+
 =item Odd number of elements in hash assignment
 
 (W misc) You specified an odd number of elements to initialize a hash,
 which is odd, because hashes come in key/value pairs.
 
+=item Odd number of elements in hash field initialization
+
+(W misc) You specified an odd number of elements to initialise a hash
+field of an object.  Hashes are initialised from a list of key/value
+pairs so there must be a corresponding value to every key.  The final
+missing value will be filled in with undef instead.
+
 =item Offset outside string
 
 (F)(W layer) You tried to do a read/write/send/recv/seek operation
@@ -4483,12 +4682,26 @@ C<sysread()>ing a file, or when seeking past the end of a scalar opened
 for I/O (in anticipation of future reads and to imitate the behavior
 with real files).
 
+=item Old package separator "'" deprecated
+
+(W deprecated::apostrophe_as_package_separator, syntax) You used the old package
+separator "'" in a variable, subroutine or package name. Support for the
+old package separator will be removed in Perl 5.42.
+
 =item Old package separator used in string
 
-(W syntax) You used the old package separator, "'", in a variable
-named inside a double-quoted string; e.g., C<"In $name's house">.  This
-is equivalent to C<"In $name::s house">.  If you meant the former, put
-a backslash before the apostrophe (C<"In $name\'s house">).
+(W deprecated::apostrophe_as_package_separator, syntax) You used the old package
+separator, "'", in a variable named inside a double-quoted string; e.g.,
+C<"In $name's house">. This is equivalent to C<"In $name::s house">. If
+you meant the former, put a backslash before the apostrophe
+(C<"In $name\'s house">).
+
+Support for the old package separator will be removed in Perl 5.42.
+
+=item Only scalar fields can take a :param attribute
+
+(F) You tried to apply the C<:param> attribute to an array or hash field.
+Currently this is not permitted.
 
 =item %s() on unopened %s
 
@@ -4916,7 +5129,7 @@ utility to report; in regex; marked by S<<-- HERE> in m/%s/
 (S regexp) You used a regular expression with case-insensitive matching,
 and there is a bug in Perl in which the built-in regular expression
 folding rules are not accurate.  This may lead to incorrect results.
-Please report this as a bug to L<https://github.com/Perl/perl5/issues>.
+Please report this as a bug to L<https://github.com/Perl/perl5/issues/new/choose>.
 
 =item Perl_my_%s() not available
 
@@ -5230,6 +5443,13 @@ the sub name and via the prototype attribute.  The prototype in
 parentheses is useless, since it will be replaced by the prototype
 from the attribute before it's ever used.
 
+=item %s on BEGIN block ignored
+
+(W syntax) C<BEGIN> blocks are executed immediately after they are parsed
+and then thrown away. Any prototypes or attributes are therefore
+meaningless and are ignored. You should remove them from the C<BEGIN> block.
+Note this also means you cannot create a constant called C<BEGIN>.
+
 =item Quantifier follows nothing in regex; marked by S<<-- HERE> in m/%s/
 
 (F) You started a regular expression with a quantifier.  Backslash it if
@@ -5483,6 +5703,11 @@ terminates.  You might use ^# instead.  See L<perlform>.
 search list.  So the additional elements in the replacement list
 are meaningless.
 
+=item Required parameter '%s' is missing for %s constructor
+
+(F) You called the constructor for a class that has a required named
+parameter, but did not pass that parameter at all.
+
 =item '(*%s' requires a terminating ':' in regex; marked by <-- HERE in m/%s/
 
 (F) You used a construct that needs a colon and pattern argument.
@@ -5839,14 +6064,13 @@ so there can't be any left to fill later parameters.
 overload it: Perl refuses to use the object's underlying structure
 for the smart match.
 
-=item Smartmatch is experimental
+=item Smartmatch is deprecated
 
-(S experimental::smartmatch) This warning is emitted if you
-use the smartmatch (C<~~>) operator.  This is currently an experimental
-feature, and its details are subject to change in future releases of
-Perl.  Particularly, its current behavior is noticed for being
-unnecessarily complex and unintuitive, and is very likely to be
-overhauled.
+(D deprecated::smartmatch) This warning is emitted if you
+use the smartmatch (C<~~>) operator.  This is a deprecated
+feature.  Particularly, its behavior is noticed for being
+unnecessarily complex and unintuitive, and it will be removed
+in Perl 5.42.
 
 =item Sorry, hash keys must be smaller than 2**31 bytes
 
@@ -6365,6 +6589,24 @@ setting C<${^RE_COMPILE_RECURSION_LIMIT}> to some other value.  This may
 need to be done in a BEGIN block before the regular expression pattern
 is compiled.
 
+=item Too many nested BEGIN blocks, maximum of %d allowed
+
+(F) You have executed code that nests too many BEGIN blocks inside of
+each other, either explicitly as BEGIN{} or implicitly as use statements.
+This limit defaults to a rather high number which should not be exceeded
+in normal circumstances, and triggering likely indicates something is
+very wrong in your code. For instance infinite recursion of eval and
+BEGIN blocks is known to trigger this error.
+
+If you know that you have good reason to exceed the limit you can change
+it by setting C<${^MAX_NESTED_EVAL_BEGIN_BLOCKS}> to a different value from
+the default of 1000.
+
+=item Too many capture groups (limit is %d) in regex m/%s/
+
+(F) You have too many capture groups in your regex pattern. You need to rework
+your pattern to use less capture groups.
+
 =item Too many )'s
 
 (A) You've accidentally run your script through B<csh> instead of Perl.
@@ -6391,6 +6633,15 @@ C<$tr> or C<$y> may cause this error.
 (F) The lexer couldn't find the final delimiter of a tr///, tr[][],
 y/// or y[][] construct.
 
+=item Treating %s::INIT block as BEGIN block as workaround
+
+(S) A package is using an old version of C<Module::Install::DSL> to
+install, which makes unsafe assumptions about when INIT blocks will be
+called. Because C<Module::Install::DSL> is used to install other modules
+and is difficult to upgrade we have a special workaround in place to
+deal with this. Unless you are a maintainer of an affected module you
+can ignore this warning. We emit it only as a sanity check.
+
 =item '%s' trapped by operation mask
 
 (F) You tried to use an operator from a Safe compartment in which it's
@@ -6652,6 +6903,12 @@ within an inner pair of square brackets, like
 Another possibility is that you forgot a backslash.  Perl isn't smart
 enough to figure out what you really meant.
 
+=item Unexpected characters while parsing class :isa attribute: %s
+
+(F) You tried to specify something other than a single class name with an
+optional trailing verison number as the value for a C<class> C<:isa>
+attribute.  This confused the parser.
+
 =item Unexpected exit %u
 
 (S) exit() was called or the script otherwise finished gracefully when
@@ -6733,6 +6990,21 @@ problems when being input or output, which is likely where this message
 came from.  If you really really know what you are doing you can turn
 off this warning by C<no warnings 'surrogate';>.
 
+=item Unimplemented
+
+(F) In Perl 5.12 and above, you have executed an
+L<ellipsis statement|perlsyn/"The Ellipsis Statement">.  This is a
+bare C<...;>, meant to be used to allow you to outline code that
+is to be written, but is not complete, similar to the following:
+
+    sub not_done_yet {
+      my($self, $arg1, $arg2) = @_;
+      ...
+    }
+
+If C<not_done_yet()> is called, Perl will die with an C<Unimplemented> error
+at the line containing C<...>.
+
 =item Unknown charname '%s'
 
 (F) The name you used inside C<\N{}> is unknown to Perl.  Check the
@@ -6753,6 +7025,8 @@ compiler does not recognize.  Check your spelling.
 (P) Perl was about to print an error message in C<$@>, but the C<$@> variable
 did not exist, even after an attempt to create it.
 
+=item Unknown locale category %d
+
 =item Unknown locale category %d; can't set it to %s
 
 (W locale) You used a locale category that perl doesn't recognize, so it
@@ -6899,6 +7173,11 @@ in your Perl script (or eval) near the specified column.  Perhaps you
 tried  to run a compressed script, a binary program, or a directory as
 a Perl program.
 
+=item Unrecognized class attribute %s
+
+(F) You attempted to add a named attribute to a C<class> definition, but
+perl does not recognise the name of the requested attribute.
+
 =item Unrecognized escape \%c in character class in regex; marked by
 S<<-- HERE> in m/%s/
 
@@ -6929,6 +7208,11 @@ recognized by Perl.  The character(s) were understood literally, but
 this may change in a future version of Perl.  The S<<-- HERE> shows
 whereabouts in the regular expression the escape was discovered.
 
+=item Unrecognized field attribute %s
+
+(F) You attempted to add a named attribute to a C<field> definition, but
+perl does not recognise the name of the requested attribute.
+
 =item Unrecognized signal name "%s"
 
 (F) You specified a signal name to the kill() function that was not
@@ -7311,16 +7595,17 @@ repeatedly, the C</g> has no effect.
 
 =item Use of "goto" to jump into a construct is deprecated
 
-(D deprecated) Using C<goto> to jump from an outer scope into an inner
+(D deprecated::goto_construct) Using C<goto> to jump from an outer scope into an inner
 scope is deprecated and should be avoided.
 
 This was deprecated in Perl 5.12.
 
 =item Use of '%s' in \p{} or \P{} is deprecated because: %s
 
-(D deprecated) Certain properties are deprecated by Unicode, and may
-eventually be removed from the Standard, at which time Perl will follow
-along.  In the meantime, this message is raised to notify you.
+(D deprecated::unicode_property_name) Certain properties are deprecated
+by Unicode, and may eventually be removed from the Standard, at which
+time Perl will follow along. In the meantime, this message is raised to
+notify you.
 
 =item Use of inherited AUTOLOAD for non-method %s::%s() is no longer allowed
 
@@ -7338,12 +7623,13 @@ only C.  This usually means there's a better way to do it in Perl.
 
 =item Use of '%s' is deprecated as a string delimiter
 
-(D deprecated) You used the given character as a starting delimiter of a
-string outside the scope of S<C<use feature 'extra_paired_delimiters'>>.
-This character is the mirror image of another Unicode character; within
-the scope of that feature, the two are considered a pair for delimitting
-strings.  It is planned to make that feature the default, at which point
-this usage would become illegal; hence this warning.
+(D deprecated::delimiter_will_be_paired) You used the given character as
+a starting delimiter of a string outside the scope of
+S<C<use feature 'extra_paired_delimiters'>>. This character is the
+mirror image of another Unicode character; within the scope of that
+feature, the two are considered a pair for delimitting strings. It is
+planned to make that feature the default, at which point this usage
+would become illegal; hence this warning.
 
 For now, you may live with this warning, or turn it off, but this code
 will no longer compile in a future version of Perl.  Or you can turn on
@@ -7771,12 +8057,12 @@ but in actual fact, you got
 
 So put in parentheses to say what you really mean.
 
-=item when is experimental
+=item when is deprecated
 
-(S experimental::smartmatch) C<when> depends on smartmatch, which is
-experimental.  Additionally, it has several special cases that may
-not be immediately obvious, and their behavior may change or
-even be removed in any future release of perl.  See the explanation
+(D deprecated::smartmatch) C<when> depends on smartmatch, which is
+deprecated.  Additionally, it has several special cases that may
+not be immediately obvious, and it will be removed in Perl 5.42.
+See the explanation
 under L<perlsyn/Experimental Details on given and when>.
 
 =item Wide character in %s
@@ -7857,7 +8143,7 @@ the beginning of the string being (un)packed.  See L<perlfunc/pack>.
 
 =item 'x' outside of string in unpack
 
-(F) You had a pack template that specified a relative position after
+(F) You had an unpack template that specified a relative position after
 the end of the string being unpacked.  See L<perlfunc/pack>.
 
 =item YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!
index bd0100d..f11075c 100644 (file)
@@ -24,8 +24,12 @@ Introduced in Perl 5.10.0
 
 Modified in Perl 5.10.1, 5.12.0
 
+Deprecated in 5.38.0
+
+Will be removed in 5.42.0
+
 Using this feature triggers warnings in the category
-C<experimental::smartmatch>.
+C<deprecated>.
 
 The ticket for this experiment is
 L<[perl #13173]|https://github.com/Perl/perl5/issues/13173>.
index 60be3df..93f1277 100644 (file)
@@ -12,7 +12,7 @@ about what source filters are, how they work, and how to write your
 own.
 
 The original purpose of source filters was to let you encrypt your
-program source to prevent casual piracy. This isn't all they can do, as
+program source to prevent casual reading. This isn't all they can do, as
 you'll soon learn. But first, the basics.
 
 =head1 CONCEPTS
@@ -205,18 +205,17 @@ source filter (see Decryption Filters, below).
 All decryption filters work on the principle of "security through
 obscurity." Regardless of how well you write a decryption filter and
 how strong your encryption algorithm is, anyone determined enough can
-retrieve the original source code. The reason is quite simple - once
-the decryption filter has decrypted the source back to its original
-form, fragments of it will be stored in the computer's memory as Perl
-parses it. The source might only be in memory for a short period of
-time, but anyone possessing a debugger, skill, and lots of patience can
-eventually reconstruct your program.
+retrieve the original source code. The reason is quite simple:
+in order to execute your program Perl must parse its source code.
+This means that Perl must have all the information needed to decrypt
+your program, and that means that that information is also available to
+anyone able to run the program.
 
 That said, there are a number of steps that can be taken to make life
-difficult for the potential cracker. The most important: Write your
+difficult for the potential reader. The most important: Write your
 decryption filter in C and statically link the decryption module into
 the Perl binary. For further tips to make life difficult for the
-potential cracker, see the file I<decrypt.pm> in the source filters
+potential reader, see the file I<decrypt.pm> in the source filters
 distribution.
 
 =back
index 2c27a74..6f9e63c 100644 (file)
@@ -262,6 +262,7 @@ L<C<dump>|/dump LABEL>, L<C<eval>|/eval EXPR>,
 L<C<evalbytes>|/evalbytes EXPR>, L<C<exit>|/exit EXPR>,
 L<C<__FILE__>|/__FILE__>, L<C<goto>|/goto LABEL>,
 L<C<last>|/last LABEL>, L<C<__LINE__>|/__LINE__>,
+L<C<method>|/method NAME BLOCK>,
 L<C<next>|/next LABEL>, L<C<__PACKAGE__>|/__PACKAGE__>,
 L<C<redo>|/redo LABEL>, L<C<return>|/return EXPR>,
 L<C<sub>|/sub NAME BLOCK>, L<C<__SUB__>|/__SUB__>,
@@ -293,9 +294,15 @@ current scope.
 
 =for Pod::Functions =Namespace
 
-L<C<caller>|/caller EXPR>, L<C<import>|/import LIST>,
-L<C<local>|/local EXPR>, L<C<my>|/my VARLIST>, L<C<our>|/our VARLIST>,
-L<C<package>|/package NAMESPACE>, L<C<state>|/state VARLIST>,
+L<C<caller>|/caller EXPR>,
+L<C<class>|/class NAMESPACE>, 
+L<C<field>|/field VARNAME>,
+L<C<import>|/import LIST>,
+L<C<local>|/local EXPR>,
+L<C<my>|/my VARLIST>,
+L<C<our>|/our VARLIST>,
+L<C<package>|/package NAMESPACE>,
+L<C<state>|/state VARLIST>,
 L<C<use>|/use Module VERSION LIST>
 
 L<C<state>|/state VARLIST> is available only if the
@@ -343,11 +350,18 @@ X<object> X<class> X<package>
 
 =for Pod::Functions =Objects
 
-L<C<bless>|/bless REF,CLASSNAME>, L<C<dbmclose>|/dbmclose HASH>,
+L<C<bless>|/bless REF,CLASSNAME>,
+L<C<class>|/class NAMESPACE>,
+L<C<dbmclose>|/dbmclose HASH>,
 L<C<dbmopen>|/dbmopen HASH,DBNAME,MASK>,
-L<C<package>|/package NAMESPACE>, L<C<ref>|/ref EXPR>,
-L<C<tie>|/tie VARIABLE,CLASSNAME,LIST>, L<C<tied>|/tied VARIABLE>,
-L<C<untie>|/untie VARIABLE>, L<C<use>|/use Module VERSION LIST>
+L<C<field>|/field VARNAME>,
+L<C<method>|/method NAME BLOCK>,
+L<C<package>|/package NAMESPACE>,
+L<C<ref>|/ref EXPR>,
+L<C<tie>|/tie VARIABLE,CLASSNAME,LIST>,
+L<C<tied>|/tied VARIABLE>,
+L<C<untie>|/untie VARIABLE>,
+L<C<use>|/use Module VERSION LIST>
 
 =item Low-level socket functions
 X<socket> X<sock>
@@ -426,6 +440,7 @@ L<C<time>|/time>, L<C<times>|/times>
 
 =for Pod::Functions =!Non-functions
 
+C<ADJUST>,
 C<and>,
 C<AUTOLOAD>,
 C<BEGIN>,
@@ -931,24 +946,63 @@ X<bless>
 
 =for Pod::Functions create an object
 
-This function tells the thingy referenced by REF that it is now an object
-in the CLASSNAME package.  If CLASSNAME is an empty string, it is
-interpreted as referring to the C<main> package.
-If CLASSNAME is omitted, the current package
-is used.  Because a L<C<bless>|/bless REF,CLASSNAME> is often the last
-thing in a constructor, it returns the reference for convenience.
-Always use the two-argument version if a derived class might inherit the
-method doing the blessing.  See L<perlobj> for more about the blessing
-(and blessings) of objects.
-
-Consider always blessing objects in CLASSNAMEs that are mixed case.
-Namespaces with all lowercase names are considered reserved for
-Perl pragmas.  Builtin types have all uppercase names.  To prevent
-confusion, you may wish to avoid such package names as well.
-It is advised to avoid the class name C<0>, because much code erroneously
-uses the result of L<C<ref>|/ref EXPR> as a truth value.
-
-See L<perlmod/"Perl Modules">.
+C<bless> tells Perl to mark the item referred to by C<REF> as an
+object in a package.  The two-argument version of C<bless> is
+always preferable unless there is a specific reason to I<not>
+use it.
+
+=over
+
+=item * Bless the referred-to item into a specific package
+(recommended form):
+
+    bless $ref, $package;
+
+The two-argument form adds the object to the package specified
+as the second argument.
+
+=item * Bless the referred-to item into package C<main>:
+
+    bless $ref, "";
+
+If the second argument is an empty string, C<bless> adds the
+object to package C<main>.
+
+=item * Bless the referred-to item into the current package (not
+inheritable):
+
+    bless $ref;
+
+If C<bless> is used without its second argument, the object is
+created in the current package. The second argument should
+always be supplied if a derived class might inherit a method
+executing C<bless>. Because it is a potential source of bugs,
+one-argument C<bless> is discouraged.
+
+=back
+
+See L<perlobj> for more about the blessing (and blessings) of
+objects.
+
+L<C<bless>|/bless REF,CLASSNAME> returns its first argument, the
+supplied reference, as the value of the function; since C<bless>
+is commonly the last thing executed in constructors, this means
+that the reference to the object is returned as the
+constructor's value and allows the caller to immediately use
+this returned object in method calls.
+
+C<CLASSNAME> should always be a mixed-case name, as
+all-uppercase and all-lowercase names are meant to be used only
+for Perl builtin types and pragmas, respectively. Avoid creating
+all-uppercase or all-lowercase package names to prevent
+confusion.
+
+Also avoid <Cbless>ing things into the class name C<0>; this
+will cause code which (erroneously) checks the result of
+L<C<ref>|/ref EXPR> to see if a reference is C<bless>ed to fail,
+as "0", a falsy value, is returned.
+
+See L<perlmod/"Perl Modules"> for more details.
 
 =item break
 
@@ -1278,6 +1332,21 @@ may be outside of the new root.
 
 Portability issues: L<perlport/chroot>.
 
+=item class NAMESPACE
+
+=item class NAMESPACE VERSION
+
+=item class NAMESPACE BLOCK
+
+=item class NAMESPACE VERSION BLOCK
+
+=for Pod::Functions declare a separate global namespace that is an object class
+
+Declares the BLOCK or the rest of the compilation unit as being in the given
+namespace, which implements an object class.  This behaves similarly to
+L<C<package>|/package NAMESPACE>, except that the newly-created package behaves
+as a class.
+
 =item close FILEHANDLE
 X<close>
 
@@ -1525,7 +1594,7 @@ filehandle, even though it looks like one).  DBNAME is the name of the
 database (without the F<.dir> or F<.pag> extension if any).  If the
 database does not exist, it is created with protection specified by MASK
 (as modified by the L<C<umask>|/umask EXPR>).  To prevent creation of
-the database if it doesn't exist, you may specify a MODE of 0, and the
+the database if it doesn't exist, you may specify a MASK of 0, and the
 function will return a false value if it can't find an existing
 database.  If your system supports only the older DBM functions, you may
 make only one L<C<dbmopen>|/dbmopen HASH,DBNAME,MASK> call in your
@@ -2237,6 +2306,16 @@ context of the current Perl program, any outer lexical variables are
 visible to it, and any package variable settings or subroutine and
 format definitions remain afterwards.
 
+Note that when C<BEGIN {}> blocks are embedded inside of an eval block
+the contents of the block will be executed immediately and before the rest
+of the eval code is executed. You can disable this entirely by
+
+   local ${^MAX_NESTED_EVAL_BEGIN_BLOCKS} = 0;
+   eval $string;
+
+which will cause any embedded C<BEGIN> blocks in C<$string> to throw an
+exception.
+
 =over 4
 
 =item Under the L<C<"unicode_eval"> feature|feature/The 'unicode_eval' and 'evalbytes' features>
@@ -2739,6 +2818,15 @@ A special token that returns the name of the file in which it occurs.
 It can be altered by the mechanism described at
 L<perlsyn/"Plain Old Comments (Not!)">.
 
+=item field VARNAME
+X<field>
+
+=for Pod::Functions declare a field variable of the current class
+
+Declares a new field variable within the current class.  Methods and
+C<ADJUST> blocks of the class will have access to this variable as if it
+was a lexical in scope at that point.
+
 =item fileno FILEHANDLE
 X<fileno>
 
@@ -4105,7 +4193,7 @@ This makes it easy to get a month name from a list:
     print "$abbr[$mon] $mday";
     # $mon=9, $mday=18 gives "Oct 18"
 
-C<$year> contains the number of years since 1900.  To get a 4-digit
+C<$year> contains the number of years since 1900.  To get the full
 year write:
 
     $year += 1900;
@@ -4303,6 +4391,16 @@ or to force an anon hash constructor use C<+{>:
 
 to get a list of anonymous hashes each with only one entry apiece.
 
+=item method NAME BLOCK
+X<method>
+
+=item method NAME : ATTRS BLOCK
+
+=for Pod::Functions declare a method of a class
+
+Creates a new named method in the scope of the class that it appears within.
+This is only valid inside a L<C<class>|/class NAMESPACE> declaration.
+
 =item mkdir FILENAME,MODE
 X<mkdir> X<md> X<directory, create>
 
@@ -4326,6 +4424,8 @@ a restrictive MODE and give the user no way to be more permissive.
 The exceptions to this rule are when the file or directory should be
 kept private (mail files, for instance).  The documentation for
 L<C<umask>|/umask EXPR> discusses the choice of MODE in more detail.
+If bits in MODE other than the permission bits are set, the result may
+be implementation defined, per POSIX 1003.1-2008.
 
 Note that according to the POSIX 1003.1-1996 the FILENAME may have any
 number of trailing slashes.  Some operating and filesystems do not get
@@ -4572,7 +4672,7 @@ Reading from a file:
         or die "Can't open < input.txt: $!";
 
     # Process every line in input.txt
-    while (my $line = <$fh>) {
+    while (my $line = readline($fh)) {
         #
         # ... do something interesting with $line here ...
         #
@@ -5986,14 +6086,26 @@ X<pop> X<stack>
 
 =for Pod::Functions remove the last element from an array and return it
 
-Pops and returns the last value of the array, shortening the array by
+Removes and returns the B<last> element of the array, shortening the array by
 one element.
 
-Returns the undefined value if the array is empty, although this may
-also happen at other times.  If ARRAY is omitted, pops the
-L<C<@ARGV>|perlvar/@ARGV> array in the main program, but the
-L<C<@_>|perlvar/@_> array in subroutines, just like
-L<C<shift>|/shift ARRAY>.
+    my @arr  = ('cat', 'dog', 'mouse');
+    my $item = pop(@arr); # 'mouse'
+
+    # @arr is now ('cat', 'dog')
+
+Returns C<undef> if the array is empty.
+
+B<Note:> C<pop> may also return C<undef> if the last element in the array
+is C<undef>.
+
+    my @arr  = ('one', 'two', undef);
+    my $item = pop(@arr); # undef
+
+If ARRAY is omitted, C<pop> operates on the L<C<@ARGV>|perlvar/@ARGV> array
+in the main program, but the L<C<@_>|perlvar/@_> array in subroutines. C<pop>
+will operate on the C<@ARGV> array in C<eval STRING>, C<BEGIN {}>, C<INIT {}>,
+C<CHECK {}> blocks.
 
 Starting with Perl 5.14, an experimental feature allowed
 L<C<pop>|/pop ARRAY> to take a
@@ -6144,16 +6256,20 @@ X<push> X<stack>
 
 =for Pod::Functions append one or more elements to an array
 
-Treats ARRAY as a stack by appending the values of LIST to the end of
-ARRAY.  The length of ARRAY increases by the length of LIST.  Has the same
-effect as
+Adds one or more items to the B<end> of an array.
 
-    for my $value (LIST) {
-        $ARRAY[++$#ARRAY] = $value;
-    }
+       my @animals = ("cat");
+       push(@animals, "mouse"); # ("cat", "mouse")
 
-but is more efficient.  Returns the number of elements in the array following
-the completed L<C<push>|/push ARRAY,LIST>.
+       my @colors = ("red");
+       push(@colors, ("blue", "green")); # ("red", "blue", "green")
+
+Returns the number of elements in the array following the completed
+L<C<push>|/push ARRAY,LIST>.
+
+       my $color_count = push(@colors, ("yellow", "purple"));
+
+       say "There are $color_count colors in the updated array";
 
 Starting with Perl 5.14, an experimental feature allowed
 L<C<push>|/push ARRAY,LIST> to take a
@@ -6704,8 +6820,14 @@ would have semantics similar to the following:
             croak "Compilation failed in require";
         }
 
-        foreach $prefix (@INC) {
-            if (ref($prefix)) {
+        local $INC;
+        # this type of loop lets a hook overwrite $INC if they wish
+        for($INC = 0; $INC < @INC; $INC++) {
+            my $prefix = $INC[$INC];
+            if (!defined $prefix) {
+                next;
+            }
+            if (ref $prefix) {
                 #... do other stuff - see text below ....
             }
             # (see text below about possible appending of .pmc
@@ -6734,11 +6856,17 @@ would have semantics similar to the following:
 Note that the file will not be included twice under the same specified
 name.
 
-The file must return true as the last statement to indicate
+Historically the file must return true as the last statement to indicate
 successful execution of any initialization code, so it's customary to
 end such a file with C<1;> unless you're sure it'll return true
 otherwise.  But it's better just to put the C<1;>, in case you add more
-statements.
+statements. As of 5.37.6 this requirement may be avoided by enabling
+the 'module_true' feature, which is enabled by default in modern
+version bundles. Thus code with C<use v5.37;> no longer needs to concern
+itself with this issue. See L<feature> for more details. Note that this
+affects the compilation unit within which the feature is used, and using
+it before requiring a module will not change the behavior of existing
+modules that do not themselves also use it.
 
 If EXPR is a bareword, L<C<require>|/require VERSION> assumes a F<.pm>
 extension and replaces C<::> with C</> in the filename for you,
@@ -6782,16 +6910,20 @@ F<.pmc> extension.  If this file is found, it will be loaded in place of
 any file ending in a F<.pm> extension. This applies to both the explicit
 C<require "Foo/Bar.pm";> form and the C<require Foo::Bar;> form.
 
-You can also insert hooks into the import facility by putting Perl code
-directly into the L<C<@INC>|perlvar/@INC> array.  There are three forms
-of hooks: subroutine references, array references, and blessed objects.
+You can also insert hooks into the import facility by putting Perl
+coderefs or objects directly into the L<C<@INC>|perlvar/@INC> array.
+There are two types of hooks, INC filters, and INCDIR hooks, and there
+are three forms of representing a hook: subroutine references, array
+references, and blessed objects.
 
 Subroutine references are the simplest case.  When the inclusion system
-walks through L<C<@INC>|perlvar/@INC> and encounters a subroutine, this
-subroutine gets called with two parameters, the first a reference to
-itself, and the second the name of the file to be included (e.g.,
-F<Foo/Bar.pm>).  The subroutine should return either nothing or else a
-list of up to four values in the following order:
+walks through L<C<@INC>|perlvar/@INC> and encounters a subroutine, unless
+this subroutine is blessed and supports an INCDIR hook this
+subroutine will be assumed to be an INC hook will be called with two
+parameters, the first a reference to itself, and the second the name of
+the file to be included (e.g., F<Foo/Bar.pm>).  The subroutine should
+return either nothing or else a list of up to four values in the
+following order:
 
 =over
 
@@ -6823,6 +6955,9 @@ Optional state for the subroutine.  The state is passed in as C<$_[1]>.
 
 =back
 
+C<AUTOLOAD> cannot be used to resolve the C<INCDIR> method, C<INC> is
+checked first, and C<AUTOLOAD> would resolve that.
+
 If an empty list, L<C<undef>|/undef EXPR>, or nothing that matches the
 first 3 values above is returned, then L<C<require>|/require VERSION>
 looks at the remaining elements of L<C<@INC>|perlvar/@INC>.
@@ -6830,10 +6965,37 @@ Note that this filehandle must be a real filehandle (strictly a typeglob
 or reference to a typeglob, whether blessed or unblessed); tied filehandles
 will be ignored and processing will stop there.
 
-If the hook is an array reference, its first element must be a subroutine
-reference.  This subroutine is called as above, but the first parameter is
-the array reference.  This lets you indirectly pass arguments to
-the subroutine.
+If the hook is an object, it should provide an C<INC> or C<INCDIR>
+method that will be called as above, the first parameter being the
+object itself. If it does not provide either method, and the object is
+not CODE ref then an exception will be thrown, otherwise it will simply
+be executed like an unblessed CODE ref would. Note that you must fully
+qualify the method name when you declare an C<INC> sub (unlike the
+C<INCDIR> sub), as the unqualified symbol C<INC> is always forced into
+package C<main>.  Here is a typical code layout for an C<INC> hook:
+
+    # In Foo.pm
+    package Foo;
+    sub new { ... }
+    sub Foo::INC {
+        my ($self, $filename) = @_;
+        ...
+    }
+
+    # In the main program
+    push @INC, Foo->new(...);
+
+If the hook is an array reference, its first element must be a
+subroutine reference or an object as described above. When the first
+element is an object that supports an C<INC> or C<INCDIR> method then
+the method will be called with the object as the first argument, the
+filename requested as the second, and the hook array reference as the
+the third. When the first element is a subroutine then it will be
+called with the array as the first argument, and the filename as the
+second, no third parameter will be passed in. In both forms you can
+modify the contents of the array to provide state between calls, or
+whatever you like.
+
 
 In other words, you can write:
 
@@ -6853,26 +7015,130 @@ or:
         ...
     }
 
-If the hook is an object, it must provide an C<INC> method that will be
-called as above, the first parameter being the object itself.  (Note that
-you must fully qualify the sub's name, as unqualified C<INC> is always forced
-into package C<main>.)  Here is a typical code layout:
+or:
 
-    # In Foo.pm
-    package Foo;
-    sub new { ... }
-    sub Foo::INC {
-        my ($self, $filename) = @_;
+    push @INC, [ HookObj->new(), $x, $y, ... ];
+    sub HookObj::INC {
+        my ($self, $filename, $arrayref)= @_;
+        my (undef, @parameters) = @$arrayref;
         ...
     }
 
-    # In the main program
-    push @INC, Foo->new(...);
-
 These hooks are also permitted to set the L<C<%INC>|perlvar/%INC> entry
 corresponding to the files they have loaded.  See L<perlvar/%INC>.
+Should an C<INC> hook not do this then perl will set the C<%INC> entry
+to be the hook reference itself.
+
+A hook may also be used to rewrite the C<@INC> array. While this might
+sound strange, there are situations where it can be very useful to do
+this. Such hooks usually just return undef and do not mix filtering and
+C<@INC> modifications. While in older versions of perl having a hook
+modify C<@INC> was fraught with issues and could even result in
+segfaults or assert failures, as of 5.37.7 the logic has been made much
+more robust and the hook now has control over the loop iteration if it
+wishes to do so.
+
+There is a now a facility to control the iterator for the C<@INC> array
+traversal that is performed during require. The C<$INC> variable will be
+initialized with the index of the currently executing hook. Once the
+hook returns the next slot in C<@INC> that will be checked will be the
+integer successor of value in C<$INC> (or -1 if it is undef). For example
+the following code
+
+    push @INC, sub {
+        splice @INC, $INC, 1; # remove this hook from @INC
+        unshift @INC, sub { warn "A" };
+        undef $INC; # reset the $INC iterator so we
+                    # execute the newly installed sub
+                    # immediately.
+    };
+
+would install a sub into C<@INC> that when executed as a hook (by for
+instance a require of a file that does not exist), the hook will splice
+itself out of C<@INC>, and add a new sub to the front that will warn
+whenever someone does a require operation that requires an C<@INC>
+search, and then immediately execute that hook.
+
+Prior to 5.37.7, there was no way to cause perl to use the newly
+installed hook immediately, or to inspect any changed items in C<@INC> to
+the left of the iterator, and so the warning would only be generated on
+the second call to require. In more recent perl the presence of the last
+statement which undefines C<$INC> will cause perl to restart the
+traversal of the C<@INC> array at the beginning and execute the newly
+installed sub immediately.
+
+Whatever value C<$INC> held, if any, will be restored at the end of the
+require. Any changes made to C<$INC> during the lifetime of the hook
+will be unrolled after the hook exits, and its value only has meaning
+immediately after execution of the hook, thus setting C<$INC> to some
+value prior to executing a C<require> will have no effect on how the
+require executes at all.
+
+As of 5.37.7 C<@INC> values of undef will be silently ignored.
+
+The function C<require()> is difficult to wrap properly. Many modules
+consult the stack to find information about their caller, and injecting
+a new stack frame by wrapping C<require()> often breaks things.
+Nevertheless it can be very helpful to have the ability to perform
+actions before and after a C<require>, for instance for trace utilities
+like C<Devel::TraceUse> or to measure time to load and the memory
+consumption of the require graph. Because of the difficulties in safely
+creating a C<require()> wrapper in 5.37.10 we introduced a new mechanism.
+
+As of 5.37.10, prior to any other actions it performs, C<require> will
+check if C<${^HOOK}{require__before}> contains a coderef, and if it does
+it will be called with the filename form of the item being loaded. The hook
+may modify C<$_[0]> to load a different filename, or it may throw a fatal
+exception to cause the require to fail, which will be treated as though the
+required code itself had thrown an exception.
+
+The C<${^HOOK}{require__before}> hook may return a code reference, in
+which case the code reference will be executed (in an eval with the
+filname as a parameter) after the require completes. It will be executed
+regardless of how the compilation completed, and even if the require
+throws a fatal exception.  The function may consult C<%INC> to determine
+if the require failed or not.  For instance the following code will print
+some diagnostics before and after every C<require> statement.  The
+example also includes logic to chain the signal, so that multiple
+signals can cooperate. Well behaved C<${^HOOK}{require__before}>
+handlers should always take this into account.
 
-For a yet-more-powerful import facility, see
+    {
+        use Scalar::Util qw(reftype);
+        my $old_hook = ${^HOOK}{require__before};
+        local ${^HOOK}{require__before} = sub {
+            my ($name) = @_;
+            my $old_hook_ret;
+            $old_hook_ret = $old_hook->($name) if $old_hook;
+            warn "Requiring: $name\n";
+            return sub {
+                $old_hook_ret->() if ref($old_hook_ret)
+                                  && reftype($old_hook_ret) eq "CODE";
+                warn sprintf "Finished requiring %s: %s\n",
+                        $name, $INC{$name} ? "loaded" :"failed";
+            };
+        };
+        require Whatever;
+    }
+
+This hook executes for ALL C<require> statements, unlike C<INC> and
+C<INCDIR> hooks, which are only executed for relative file names, and it
+executes first before any other special behaviour inside of require.
+Note that the initial hook in C<${^HOOK}{require__before}> is *not*
+executed inside of an eval, and throwing an exception will stop further
+processing, but the after hook it may return is executed inside of an
+eval, and any exceptions it throws will be silently ignored.  This is
+because it executes inside of the scope cleanup logic that is triggered
+after the require completes, and an exception at this time would not
+stop the module from being loaded, etc.
+
+There is a similar hook that fires after require completes,
+C<${^HOOK}{require__after}>, which will be called after each require statement
+completes, either via an exception or successfully. It will be called with
+the filename of the most recently executed require statement. It is executed
+in an eval, and will not in any way affect execution.
+
+For a yet-more-powerful import facility built around C<require>, see
 L<C<use>|/use Module VERSION LIST> and L<perlmod>.
 
 =item reset EXPR
@@ -7142,10 +7408,10 @@ X<select> X<filehandle, default>
 
 Returns the currently selected filehandle.  If FILEHANDLE is supplied,
 sets the new current default filehandle for output.  This has two
-effects: first, a L<C<write>|/write FILEHANDLE> or a L<C<print>|/print
-FILEHANDLE LIST> without a filehandle
-default to this FILEHANDLE.  Second, references to variables related to
-output will refer to this output channel.
+effects: first, a L<C<write>|/write FILEHANDLE> L<C<print>|/print
+FILEHANDLE LIST>, or L<C<say>|/say FILEHANDLE LIST> without a
+filehandle default to this FILEHANDLE.  Second, references to variables
+related to output will refer to this output channel.
 
 For example, to set the top-of-form format for more than one
 output channel, you might do the following:
@@ -7168,6 +7434,34 @@ methods, preferring to write the last example as:
 (Prior to Perl version 5.14, you have to C<use IO::Handle;> explicitly
 first.)
 
+Whilst you can use C<select> to temporarily "capture" the output of
+C<print> like this:
+
+    {
+        my $old_handle = select $new_handle;
+
+        # This goes to $new_handle:
+        print "ok 1\n";
+        ...
+
+        select $old_handle;
+    }
+
+you might find it easier to localize the typeglob instead:
+
+    {
+        local *STDOUT = $new_handle;
+
+        print "ok 1\n";
+        ...
+    }
+
+The two are not exactly equivalent, but the latter might be clearer and will
+restore STDOUT if the wrapped code dies.  The difference is that in the
+former, the original STDOUT can still be accessed by explicitly using it in a
+C<print> statement (as C<print STDOUT ...>), whereas in the latter the meaning
+of the STDOUT handle itself has temporarily been changed.
+
 Portability issues: L<perlport/select>.
 
 =item select RBITS,WBITS,EBITS,TIMEOUT
@@ -7376,14 +7670,25 @@ X<shift>
 
 =for Pod::Functions remove the first element of an array, and return it
 
-Shifts the first value of the array off and returns it, shortening the
-array by 1 and moving everything down.  If there are no elements in the
-array, returns the undefined value.  If ARRAY is omitted, shifts the
-L<C<@_>|perlvar/@_> array within the lexical scope of subroutines and
-formats, and the L<C<@ARGV>|perlvar/@ARGV> array outside a subroutine
-and also within the lexical scopes
-established by the C<eval STRING>, C<BEGIN {}>, C<INIT {}>, C<CHECK {}>,
-C<UNITCHECK {}>, and C<END {}> constructs.
+Removes and returns the B<first> element of an array. This shortens the
+array by one and moves everything down.
+
+    my @arr  = ('cat', 'dog');
+    my $item = shift(@arr); # 'cat'
+
+    # @arr is now ('dog');
+
+Returns C<undef> if the array is empty.
+
+B<Note:> C<shift> may also return C<undef> if the first element in the array
+is C<undef>.
+
+    my @arr  = (undef, 'two', 'three');
+    my $item = shift(@arr); # undef
+
+If ARRAY is omitted, C<shift> operates on the C<@ARGV> array in the main
+program, and the C<@_> array in subroutines. C<shift> will operate on the
+C<@ARGV> array in C<eval STRING>, C<BEGIN {}>, C<INIT {}>, C<CHECK {}> blocks.
 
 Starting with Perl 5.14, an experimental feature allowed
 L<C<shift>|/shift ARRAY> to take a
@@ -7498,7 +7803,10 @@ argument is given.  Returns the integer number of seconds actually slept.
 
 EXPR should be a positive integer. If called with a negative integer,
 L<C<sleep>|/sleep EXPR> does not sleep but instead emits a warning, sets
-$! (C<errno>), and returns zero.
+C<$!> (C<errno>), and returns zero.
+
+If called with a non-integer, the fractional part is ignored.
+
 
 C<sleep 0> is permitted, but a function call to the underlying platform
 implementation still occurs, with any side effects that may have.
@@ -7593,7 +7901,7 @@ undefined.
 If SUBNAME or BLOCK is omitted, L<C<sort>|/sort SUBNAME LIST>s in
 standard string comparison
 order.  If SUBNAME is specified, it gives the name of a subroutine
-that returns an integer less than, equal to, or greater than C<0>,
+that returns a numeric value less than, equal to, or greater than C<0>,
 depending on how the elements of the list are to be ordered.  (The
 C<< <=> >> and C<cmp> operators are extremely useful in such routines.)
 SUBNAME may be a scalar variable name (unsubscripted), in which case
@@ -8450,7 +8758,7 @@ The point of the function is to "seed" the L<C<rand>|/rand EXPR>
 function so that L<C<rand>|/rand EXPR> can produce a different sequence
 each time you run your program.  When called with a parameter,
 L<C<srand>|/srand EXPR> uses that for the seed; otherwise it
-(semi-)randomly chooses a seed.  In either case, starting with Perl 5.14,
+(semi-)randomly chooses a seed (see below).  In either case, starting with Perl 5.14,
 it returns the seed.  To signal that your code will work I<only> on Perls
 of a recent vintage:
 
@@ -8482,6 +8790,20 @@ combinations to test comprehensively in the time available to it each run.  It
 can test a random subset each time, and should there be a failure, log the seed
 used for that run so that it can later be used to reproduce the same results.
 
+If the C<PERL_RAND_SEED> environment variable is set to a non-negative
+integer during process startup then calls to C<srand()> with no
+arguments will initialize the perl random number generator with a
+consistent seed each time it is called, whether called explicitly with
+no arguments or implicitly via use of C<rand()>. The exact seeding that
+a given C<PERL_RAND_SEED> will produce is deliberately unspecified, but
+using different values for C<PERL_RAND_SEED> should produce different
+results. This is intended for debugging and performance analysis and is
+only guaranteed to produce consistent results between invocations of the
+same perl executable running the same code when all other factors are
+equal. The environment variable is read only once during process
+startup, and changing it during the program flow will not affect the
+currently running process. See L<perlrun> for more details.
+
 B<L<C<rand>|/rand EXPR> is not cryptographically secure.  You should not rely
 on it in security-sensitive situations.>  As of this writing, a
 number of third-party CPAN modules offer random number generators
@@ -8779,7 +9101,7 @@ Here's an example showing the behavior for boundary cases:
 An alternative to using
 L<C<substr>|/substr EXPR,OFFSET,LENGTH,REPLACEMENT> as an lvalue is to
 specify the
-replacement string as the 4th argument.  This allows you to replace
+REPLACEMENT string as the 4th argument.  This allows you to replace
 parts of the EXPR and return what was there before in one operation,
 just as you can with
 L<C<splice>|/splice ARRAY,OFFSET,LENGTH,LIST>.
@@ -9423,17 +9745,21 @@ X<ucfirst> X<uppercase>
 
 =item ucfirst
 
-=for Pod::Functions return a string with just the next letter in upper case
+=for Pod::Functions return a string with the first letter in upper case
 
-Returns the value of EXPR with the first character in uppercase
-(titlecase in Unicode).  This is the internal function implementing
-the C<\u> escape in double-quoted strings.
+Returns the value of EXPR with the B<first> character in uppercase
+(Unicode calls this titlecase). If EXPR is omitted, C<ucfirst> uses L<C<$_>|perlvar/$_>.
 
-If EXPR is omitted, uses L<C<$_>|perlvar/$_>.
+    my $str = ucfirst("hello world!"); # "Hello world!"
 
 This function behaves the same way under various pragmas, such as in a locale,
 as L<C<lc>|/lc EXPR> does.
 
+B<Note:> This is the internal function implementing the C<\u> escape in
+double-quoted strings.
+
+    my $str = "\uperl\E is great"; # "Perl is great"
+
 =item umask EXPR
 X<umask>
 
@@ -9619,12 +9945,21 @@ X<unshift>
 
 =for Pod::Functions prepend more elements to the beginning of a list
 
-Does the opposite of a L<C<shift>|/shift ARRAY>.  Or the opposite of a
-L<C<push>|/push ARRAY,LIST>,
-depending on how you look at it.  Prepends list to the front of the
-array and returns the new number of elements in the array.
+Add one or more elements to the B<beginning> of an array. This is the
+opposite of a L<C<shift>|/shift ARRAY>.
+
+    my @animals = ("cat");
+    unshift(@animals, "mouse"); # ("mouse", "cat")
+
+    my @colors = ("red");
+    unshift(@colors, ("blue", "green")); # ("blue", "green", "red")
+
+Returns the new number of elements in the updated array.
 
-    unshift(@ARGV, '-e') unless $ARGV[0] =~ /^-/;
+    # Return value is the number of items in the updated array
+    my $color_count = unshift(@colors, ("yellow", "purple"));
+
+    say "There are $color_count colors in the updated array";
 
 Note the LIST is prepended whole, not one element at a time, so the
 prepended elements stay in the same order.  Use
@@ -10517,4 +10852,12 @@ documented in L<perlsyn/"defer blocks">.
 
 =back
 
+=over
+
+=item ADJUST
+
+This class-related phaser block is documented in L<perlclass>.
+
+=back
+
 =cut
index c1e6853..b354b73 100644 (file)
@@ -785,6 +785,27 @@ When describing the merge commit, explain the purpose of the branch, and
 keep in mind that this description will probably be used by the
 eventual release engineer when reviewing the next perldelta document.
 
+If the subsequent I<push> fails then you must be careful on how you I<rebase>.
+If you use
+
+  % git rebase p5p/blead
+
+or
+
+  % git pull --rebase
+
+then your carefully created merge commit will be lost! To avoid this you
+can use:
+
+  % git fetch p5p
+  % git rebase --rebase-merges p5p/blead
+
+This will recreate your merge commit.
+
+(Should you be stuck with an older version of git (prior to 2.18), then
+C<git rebase> will not have the C<--rebase-merges> switch, instead you
+have to use the C<--preserve-merges> switch.)
+
 =head2 Committing to maintenance versions
 
 Maintenance versions should only be altered to add critical bug fixes,
index 4037975..a32ea56 100644 (file)
@@ -61,17 +61,17 @@ A numeric constant can be specified with L<perlapi/C<INT16_C>>,
 L<perlapi/C<UINTMAX_C>>, and similar.
 
 =for apidoc_section $integer
-=for apidoc Ayh||I8
+=for apidoc  Ayh ||IV
+=for apidoc_item ||I8
 =for apidoc_item ||I16
 =for apidoc_item ||I32
 =for apidoc_item ||I64
-=for apidoc_item ||IV
 
-=for apidoc Ayh||U8
+=for apidoc  Ayh ||UV
+=for apidoc_item ||U8
 =for apidoc_item ||U16
 =for apidoc_item ||U32
 =for apidoc_item ||U64
-=for apidoc_item ||UV
 
 =head2 Working with SVs
 
@@ -523,8 +523,8 @@ In general, though, it's best to use the C<Sv*V> macros.
 
 =head2 Working with AVs
 
-There are two ways to create and load an AV.  The first method creates an
-empty AV:
+There are two main, longstanding ways to create and load an AV.  The first
+method creates an empty AV:
 
     AV*  newAV();
 
@@ -535,6 +535,20 @@ The second method both creates the AV and initially populates it with SVs:
 The second argument points to an array containing C<num> C<SV*>'s.  Once the
 AV has been created, the SVs can be destroyed, if so desired.
 
+Perl v5.36 added two new ways to create an AV and allocate a SV** array
+without populating it. These are more efficient than a newAV() followed by an
+av_extend().
+
+    /* Creates but does not initialize (Zero) the SV** array */
+    AV *av = newAV_alloc_x(1);
+    /* Creates and does initialize (Zero) the SV** array */
+    AV *av = newAV_alloc_xz(1);
+
+The numerical argument refers to the number of array elements to allocate, not
+an array index, and must be >0. The first form must only ever be used when all
+elements will be initialized before any read occurs. Reading a non-initialized
+SV* - i.e. treating a random memory address as a SV* - is a serious bug.
+
 Once the AV has been created, the following operations are possible on it:
 
     void  av_push(AV*, SV*);
@@ -587,6 +601,46 @@ This returns NULL if the variable does not exist.
 See L</Understanding the Magic of Tied Hashes and Arrays> for more
 information on how to use the array access functions on tied arrays.
 
+=head3 More efficient working with new or vanilla AVs
+
+Perl v5.36 and v5.38 introduced streamlined, inlined versions of some
+functions:
+
+=over
+
+=item * C<av_store_simple>
+
+=item * C<av_fetch_simple>
+
+=item * C<av_push_simple>
+
+=back
+
+These are drop-in replacements, but can only be used on straightforward
+AVs that meet the following criteria:
+
+=over
+
+=item * are not magical
+
+=item * are not readonly
+
+=item * are "real" (refcounted) AVs
+
+=item * have an av_top_index value > -2
+
+=back
+
+AVs created using C<newAV()>, C<av_make>, C<newAV_alloc_x>, and
+C<newAV_alloc_xz> are all compatible at the time of creation. It is
+only if they are declared readonly or unreal, have magic attached, or
+are otherwise configured unusually that they will stop being compatible.
+
+Note that some interpreter functions may attach magic to an AV as part
+of normal operations. It is therefore safest, unless you are sure of the
+lifecycle of an AV, to only use these new functions close to the point
+of AV creation.
+
 =head2 Working with HVs
 
 To create an HV, you use the following routine:
@@ -1456,17 +1510,17 @@ will be lost.
                                              tables
  <  PERL_MAGIC_backref        vtbl_backref   For weak ref data
  @  PERL_MAGIC_arylen_p       (none)         To move arylen out of XPVAV
- B  PERL_MAGIC_bm             vtbl_regexp    Boyer-Moore 
+ B  PERL_MAGIC_bm             vtbl_regexp    Boyer-Moore
                                              (fast string search)
- c  PERL_MAGIC_overload_table vtbl_ovrld     Holds overload table 
+ c  PERL_MAGIC_overload_table vtbl_ovrld     Holds overload table
                                              (AMT) on stash
- D  PERL_MAGIC_regdata        vtbl_regdata   Regex match position data 
+ D  PERL_MAGIC_regdata        vtbl_regdata   Regex match position data
                                              (@+ and @- vars)
  d  PERL_MAGIC_regdatum       vtbl_regdatum  Regex match position data
                                              element
  E  PERL_MAGIC_env            vtbl_env       %ENV hash
  e  PERL_MAGIC_envelem        vtbl_envelem   %ENV hash element
- f  PERL_MAGIC_fm             vtbl_regexp    Formline 
+ f  PERL_MAGIC_fm             vtbl_regexp    Formline
                                              ('compiled' format)
  g  PERL_MAGIC_regex_global   vtbl_mglob     m//g target
  H  PERL_MAGIC_hints          vtbl_hints     %^H hash
@@ -1494,18 +1548,23 @@ will be lost.
  V  PERL_MAGIC_vstring        (none)         SV was vstring literal
  v  PERL_MAGIC_vec            vtbl_vec       vec() lvalue
  w  PERL_MAGIC_utf8           vtbl_utf8      Cached UTF-8 information
+ X  PERL_MAGIC_destruct       vtbl_destruct  destruct callback
  x  PERL_MAGIC_substr         vtbl_substr    substr() lvalue
  Y  PERL_MAGIC_nonelem        vtbl_nonelem   Array element that does not
                                              exist
  y  PERL_MAGIC_defelem        vtbl_defelem   Shadow "foreach" iterator
                                              variable / smart parameter
                                              vivification
+ Z  PERL_MAGIC_hook           vtbl_hook      %{^HOOK} hash
+ z  PERL_MAGIC_hookelem       vtbl_hookelem  %{^HOOK} hash element
  \  PERL_MAGIC_lvref          vtbl_lvref     Lvalue reference
                                              constructor
  ]  PERL_MAGIC_checkcall      vtbl_checkcall Inlining/mutation of call
                                              to this CV
- ~  PERL_MAGIC_ext            (none)         Available for use by
-                                             extensions
+ ^  PERL_MAGIC_extvalue       (none)         Value magic available for
+                                             use by extensions
+ ~  PERL_MAGIC_ext            (none)         Variable magic available
+                                             for use by extensions
 
 
 =for apidoc_section $magic
@@ -1519,12 +1578,16 @@ will be lost.
 =for apidoc_item ||PERL_MAGIC_dbline
 =for apidoc_item ||PERL_MAGIC_debugvar
 =for apidoc_item ||PERL_MAGIC_defelem
+=for apidoc_item ||PERL_MAGIC_destruct
 =for apidoc_item ||PERL_MAGIC_env
 =for apidoc_item ||PERL_MAGIC_envelem
 =for apidoc_item ||PERL_MAGIC_ext
+=for apidoc_item ||PERL_MAGIC_extvalue
 =for apidoc_item ||PERL_MAGIC_fm
 =for apidoc_item ||PERL_MAGIC_hints
 =for apidoc_item ||PERL_MAGIC_hintselem
+=for apidoc_item ||PERL_MAGIC_hook
+=for apidoc_item ||PERL_MAGIC_hookelem
 =for apidoc_item ||PERL_MAGIC_isa
 =for apidoc_item ||PERL_MAGIC_isaelem
 =for apidoc_item ||PERL_MAGIC_lvref
@@ -1562,12 +1625,15 @@ uppercase letter is typically used to represent some kind of composite type
 of that composite type.  Some internals code makes use of this case
 relationship.  However, 'v' and 'V' (vec and v-string) are in no way related.
 
-The C<PERL_MAGIC_ext> and C<PERL_MAGIC_uvar> magic types are defined
-specifically for use by extensions and will not be used by perl itself.
-Extensions can use C<PERL_MAGIC_ext> magic to 'attach' private information
-to variables (typically objects).  This is especially useful because
-there is no way for normal perl code to corrupt this private information
-(unlike using extra elements of a hash object).
+The C<PERL_MAGIC_ext>, C<PERL_MAGIC_extvalue> and C<PERL_MAGIC_uvar> magic types
+are defined specifically for use by extensions and will not be used by perl
+itself.  Extensions can use C<PERL_MAGIC_ext> or C<PERL_MAGIC_extvalue> magic to
+'attach' private information to variables (typically objects).  This is
+especially useful because there is no way for normal perl code to corrupt this
+private information (unlike using extra elements of a hash object).
+C<PERL_MAGIC_extvalue> is value magic (unlike C<PERL_MAGIC_ext> and
+C<PERL_MAGIC_uvar>) meaning that on localization the new value will not be
+magical.
 
 Similarly, C<PERL_MAGIC_uvar> magic can be used much like tie() to call a
 C function any time a scalar's value is used or changed.  The C<MAGIC>'s
@@ -1829,6 +1895,32 @@ and back.
 =for apidoc Amh||SAVESPTR|SV * s
 =for apidoc Amh||SAVEPPTR|char * p
 
+=item C<SAVERCPV(char **ppv)>
+
+This macro arranges to restore the value of a C<char *> variable which
+was allocated with a call to C<rcpv_new()> to its previous state when
+the current pseudo block is completed. The pointer stored in C<*ppv> at
+the time of the call will be refcount incremented and stored on the save
+stack. Later when the current I<pseudo-block> is completed the value
+stored in C<*ppv> will be refcount decremented, and the previous value
+restored from the savestack which will also be refcount decremented.
+
+This is the C<RCPV> equivalent of C<SAVEGENERICSV()>.
+
+=for apidoc Amh||SAVERCPV|char *pv
+
+=item C<SAVEGENERICSV(SV **psv)>
+
+This macro arranges to restore the value of a C<SV *> variable to its
+previous state when the current pseudo block is completed. The pointer
+stored in C<*psv> at the time of the call will be refcount incremented
+and stored on the save stack. Later when the current I<pseudo-block> is
+completed the value stored in C<*ppv> will be refcount decremented, and
+the previous value restored from the savestack which will also be refcount
+decremented. This the C equivalent of C<local $sv>.
+
+=for apidoc Amh||SAVEGENERICSV|char **psv
+
 =item C<SAVEFREESV(SV *sv)>
 
 The refcount of C<sv> will be decremented at the end of
@@ -1853,16 +1945,25 @@ live scope has finished executing.
 
 =item C<SAVEFREEOP(OP *op)>
 
-The C<OP *> is op_free()ed at the end of I<pseudo-block>.
+The C<OP *> is C<op_free()>ed at the end of I<pseudo-block>.
 
 =for apidoc Amh||SAVEFREEOP|OP *op
 
 =item C<SAVEFREEPV(p)>
 
-The chunk of memory which is pointed to by C<p> is Safefree()ed at the
-end of I<pseudo-block>.
+The chunk of memory which is pointed to by C<p> is C<Safefree()>ed at the
+end of the current I<pseudo-block>.
+
+=for apidoc Amh||SAVEFREEPV|char *pv
+
+=item C<SAVEFREERCPV(char *pv)>
+
+Ensures that a C<char *> which was created by a call to C<rcpv_new()> is
+C<rcpv_free()>ed at the end of the current I<pseudo-block>.
+
+This is the RCPV equivalent of C<SAVEFREESV()>.
 
-=for apidoc Amh||SAVEFREEPV|void * p
+=for apidoc Amh||SAVEFREERCPV|char *pv
 
 =item C<SAVECLEARSV(SV *sv)>
 
@@ -1883,7 +1984,7 @@ this:
 =item C<SAVEDESTRUCTOR(DESTRUCTORFUNC_NOCONTEXT_t f, void *p)>
 
 At the end of I<pseudo-block> the function C<f> is called with the
-only argument C<p>.
+only argument C<p> which may be NULL.
 
 =for apidoc Ayh||DESTRUCTORFUNC_NOCONTEXT_t
 =for apidoc Amh||SAVEDESTRUCTOR|DESTRUCTORFUNC_NOCONTEXT_t f|void *p
@@ -1891,11 +1992,45 @@ only argument C<p>.
 =item C<SAVEDESTRUCTOR_X(DESTRUCTORFUNC_t f, void *p)>
 
 At the end of I<pseudo-block> the function C<f> is called with the
-implicit context argument (if any), and C<p>.
+implicit context argument (if any), and C<p> which may be NULL.
+
+Note the I<end of the current pseudo-block> may occur much later than
+the I<end of the current statement>. You may wish to look at the
+C<MORTALDESTRUCTOR_X()> macro instead.
 
 =for apidoc Ayh||DESTRUCTORFUNC_t
 =for apidoc Amh||SAVEDESTRUCTOR_X|DESTRUCTORFUNC_t f|void *p
 
+=item C<MORTALSVFUNC_X(SVFUNC_t f, SV *sv)>
+
+At the end of I<the current statement> the function C<f> is called with
+the implicit context argument (if any), and C<sv> which may be NULL.
+
+Be aware that the parameter argument to the destructor function differs
+from the related C<SAVEDESTRUCTOR_X()> in that it MUST be either NULL or
+an C<SV*>.
+
+Note the I<end of the current statement> may occur much before the
+the I<end of the current pseudo-block>.  You may wish to look at the
+C<SAVEDESTRUCTOR_X()> macro instead.
+
+=for apidoc Amh||MORTALDESTRUCTOR_X|DESTRUCTORFUNC_t f|SV *sv
+
+=item C<MORTALDESTRUCTOR_SV(SV *coderef, SV *args)>
+
+At the end of I<the current statement> the Perl function contained in
+C<coderef> is called with the arguments provided (if any) in C<args>.
+See the documentation for C<mortal_destructor_sv()> for details on
+the C<args> parameter is handled.
+
+Note the I<end of the current statement> may occur much before the
+the I<end of the current pseudo-block>.  If you wish to call a perl
+function at the end of the current pseudo block you should use the
+C<SAVEDESTRUCTOR_X()> API instead, which will require you create a
+C wrapper to call the Perl function.
+
+=for apidoc Amh||MORTALDESTRUCTOR_SV|SV *coderef|SV *args
+
 =item C<SAVESTACK_POS()>
 
 The current offset on the Perl internal stack (cf. C<SP>) is restored
@@ -1940,13 +2075,6 @@ C<ENTER>/C<LEAVE> I<pseudo-block> the value of C<SV> will be restored
 using the stored value.  It doesn't handle magic.  Use C<save_scalar> if
 magic is affected.
 
-=item C<void save_list(SV **sarg, I32 maxsarg)>
-
-=for apidoc save_list
-
-A variant of C<save_item> which takes multiple arguments via an array
-C<sarg> of C<SV*> of length C<maxsarg>.
-
 =item C<SV* save_svref(SV **sptr)>
 
 =for apidoc save_svref
@@ -2102,7 +2230,7 @@ not constantly freed/created.
 
 Each of the targets is created only once (but see
 L</Scratchpads and recursion> below), and when an opcode needs to put
-an integer, a double, or a string on stack, it just sets the
+an integer, a double, or a string on the stack, it just sets the
 corresponding parts of its I<target> and puts the I<target> on stack.
 
 The macro to put this target on stack is C<PUSHTARG>, and it is
@@ -2841,6 +2969,9 @@ that there's an undeclared identifier in those functions.)  No changes
 are needed for the XSUBs themselves, because the XS() macro is
 correctly defined to pass in the implicit context if needed.
 
+=for apidoc_section $concurrency
+=for apidoc AmnhU||PERL_NO_GET_CONTEXT
+
 The third, even more efficient way is to ape how it is done within
 the Perl guts:
 
@@ -3016,7 +3147,7 @@ compiled with C++, to maintain compliance with its standard.
 Note that any filehandle being printed to under UTF-8 must be expecting
 UTF-8 in order to get good results and avoid Wide-character warnings.
 One way to do this for typical filehandles is to invoke perl with the
-C<-C>> parameter.  (See L<perlrun/-C [numberE<sol>list]>.
+C<-C> parameter.  (See L<perlrun/-C [numberE<sol>list]>.
 
 You can use this to concatenate two scalars:
 
@@ -3025,6 +3156,24 @@ You can use this to concatenate two scalars:
  SV *var3 = newSVpvf("var1=%" SVf " and var2=%" SVf,
                      SVfARG(var1), SVfARG(var2));
 
+=for apidoc Amnh||SVf_QUOTEDPREFIX
+
+C<SVf_QUOTEDPREFIX> is similar to C<SVf> except that it restricts the
+number of the characters printed, showing at most the first
+C<PERL_QUOTEDPREFIX_LEN> characters of the argument, and rendering it with
+double quotes and with the contents escaped using double quoted string
+escaping rules. If the string is longer than this then ellipses "..."
+will be appended after the trailing quote. This is intended for error
+messages where the string is assumed to be a class name.
+
+=for apidoc Amnh||HvNAMEf
+=for apidoc Amnh||HvNAMEf_QUOTEDPREFIX
+
+C<HvNAMEf> and C<HvNAMEf_QUOTEDPREFIX> are similar to C<SVf> except they
+extract the string, length and utf8 flags from the argument using the
+C<HvNAME()>, C<HvNAMELEN()>, C<HvNAMEUTF8()> macros. This is intended
+for stringifying a class name directly from an stash HV.
+
 =head2 Formatted Printing of Strings
 
 If you just want the bytes printed in a 7bit NUL-terminated string, you can
@@ -3054,10 +3203,15 @@ string.
 Note that any filehandle being printed to under UTF-8 must be expecting
 UTF-8 in order to get good results and avoid Wide-character warnings.
 One way to do this for typical filehandles is to invoke perl with the
-C<-C>> parameter.  (See L<perlrun/-C [numberE<sol>list]>.
+C<-C> parameter.  (See L<perlrun/-C [numberE<sol>list]>.
 
 =for apidoc_section $io_formats
 =for apidoc Amnh||UTF8f
+Output a possibly UTF8 value. Be sure to use UTF8fARG() to compose
+the arguments for this format.
+=for apidoc Amnh||UTF8f_QUOTEDPREFIX
+Same as C<UTF8f> but the output is quoted, escaped and length limited.
+See C<SVf_QUOTEDPREFIX> for more details on escaping.
 =for apidoc Amh||UTF8fARG|bool is_utf8|Size_t byte_len|char *str
 
 =cut
@@ -3634,12 +3788,12 @@ the only core C<PVOP>, C<OP_TRANS>, can sometimes be a C<SVOP> instead.
 =for apidoc_item OA_COP
 =for apidoc_item OA_LISTOP
 =for apidoc_item OA_LOGOP
+=for apidoc_item OA_LOOP
 =for apidoc_item OA_PADOP
 =for apidoc_item OA_PMOP
 =for apidoc_item OA_PVOP_OR_SVOP
 =for apidoc_item OA_SVOP
 =for apidoc_item OA_UNOP
-=for apidoc_item OA_LOOP
 
 =back
 
index 3665ba2..7a52461 100644 (file)
@@ -880,6 +880,19 @@ it doesn't redirect stderr to stdout.
 Note that under Win32 F<t/harness> is always used instead of F<t/TEST>,
 so there is no special "test_harness" target.
 
+Under the Unix build process you may use the TEST_ARGS and TEST_FILES
+parameters to pass arguments through to the underlying harness call.
+This means that for instance you could do
+
+    make test_harness TEST_ARGS="-v -re pat"
+
+which would make, and then run the test harness in verbose mode over
+files which contain "pat". Or you could do
+
+    make test_harness TEST_ARGS="-torture" TEST_FILES="op/*.t"
+
+and run torture tests on files matching the glob "op/*.t".
+
 Under Win32's "test" target you may use the TEST_SWITCHES and
 TEST_FILES environment variables to control the behaviour of
 F<t/harness>.  This means you can say
@@ -887,6 +900,9 @@ F<t/harness>.  This means you can say
     nmake test TEST_FILES="op/*.t"
     nmake test TEST_SWITCHES="-torture" TEST_FILES="op/*.t"
 
+Note that for compatibility with the unix build process TEST_ARGS
+may also be used instead of the traditional TEST_SWITCHES argument.
+
 =item * test-notty test_notty
 
 Sets PERL_SKIP_TTY_TEST to true before running normal test.
@@ -926,6 +942,16 @@ Note that the command line above added a C<-j> parameter to make, so as
 to cause parallel compilation.  This may or may not work on your
 platform.
 
+Normally data on how long tests take is stored in F<t/test_state>,
+however you can change this to use a different filename by setting the
+C<PERL_TEST_STATE_FILE> environment variable to something different, or
+to a false value (0 or the empty string) to disable use of the state
+mechanism entirely.  There are no protections against the format of the
+state file changing over time, so if you have any issues related to this
+file it is up to you to delete the file manually and then let the
+harness recreate it, although the file format does not change frequently
+so this should not be necessary very often.
+
 =head2 Running tests by hand
 
 You can run part of the test suite by hand by using one of the
index 32a4eed..ae40fde 100644 (file)
@@ -309,6 +309,211 @@ C<-xc99>
 
 =back
 
+=head2 Symbol Names and Namespace Pollution
+
+=head3 Choosing legal symbol names
+
+C reserves for its implementation any symbol whose name begins with an
+underscore followed immediately by either an uppercase letter C<[A-Z]>
+or another underscore.  C++ further reserves any symbol containing two
+consecutive underscores, and further reserves in the global name space any
+symbol beginning with an underscore, not just ones followed by a
+capital.  We care about C++ because C<hdr> files need to be compilable by
+it, and some people do all their development using a C++ compiler.
+
+The consequences of failing to do this are probably none.  Unless you
+stumble on a name that the implementation uses, things will work.
+Indeed, the perl core has more than a few instances of using
+implementation-reserved symbols.  (These are gradually being changed.)
+But your code might stop working any time that the implementation
+decides to use a name you already had chosen, potentially many years
+before.
+
+It's best then to:
+
+=over
+
+=item B<Don't begin a symbol name with an underscore>; (I<e.g.>, don't
+use: C<_FOOBAR>)
+
+=item B<Don't use two consecutive underscores in a symbol name>;
+(I<e.g.>, don't use C<FOO__BAR>)
+
+=back
+
+POSIX also reserves many symbols.  See Section 2.2.2 in
+L<http://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html>.
+Perl also has conflicts with that.
+
+Perl reserves for its use any symbol beginning with C<Perl>, C<perl>, or
+C<PL_>.  Any time you introduce a macro into a C<hdr> file that doesn't
+follow that convention, you are creating the possiblity of a namespace
+clash with an existing XS module, unless you restrict it by, say,
+
+ #ifdef PERL_CORE
+ #  define my_symbol
+ #endif
+
+There are many symbols in C<hdr> files that aren't of this form, and
+which are accessible from XS namespace, intentionally or not, just about
+anything in F<config.h>, for example.
+
+Having to use one of these prefixes detracts from the readability of the
+code, and hasn't been an actual issue for non-trivial names.  Things
+like perl defining its own C<MAX> macro have been problematic, but they
+were quickly discovered, and a S<C<#ifdef PERL_CORE>> guard added.
+
+So there's no rule imposed about using such symbols, just be aware of
+the issues.
+
+=head3 Choosing good symbol names
+
+Ideally, a symbol name name should correctly and precisely describe its
+intended purpose.  But there is a tension between that and getting names
+that are overly long and hence awkward to type and read.  Metaphors
+could be helpful (a poetic name), but those tend to be culturally
+specific, and may not translate for someone whose native language isn't
+English, or even comes from a different cultural background.  Besides,
+the talent of writing poetry seems to be rare in programmers.
+
+Certain symbol names don't reflect their purpose, but are nonetheless
+fine to use because of long-standing conventions.  These often
+originated in the field of Mathematics, where C<i> and C<j> are
+frequently used as subscripts, and C<n> as a population count.  Since at
+least the 1950's, computer programs have used C<i>, I<etc.> as loop
+variables.
+
+Our guidance is to choose a name that reasonably describes the purpose,
+and to comment its declaration more precisely.
+
+One certainly shouldn't use misleading nor ambiguous names.  C<last_foo>
+could mean either the final C<foo> or the previous C<foo>, and so could
+be confusing to the reader, or even to the writer coming back to the
+code after a few months of working on something else.  Sometimes the
+programmer has a particular line of thought in mind, and it doesn't
+occur to them that ambiguity is present.
+
+There are probably still many off-by-1 bugs around because the name
+L<perlapi/C<av_len>> doesn't correspond to what other I<-len> constructs
+mean, such as L<perlapi/C<sv_len>>.  Awkward (and controversial)
+synonyms were created to use instead that conveyed its true meaning
+(L<perlapi/C<av_top_index>>).  Eventually, though someone had the better
+idea to create a new name to signify what most people think C<-len>
+signifies.  So L<perlapi/C<av_count>> was born.  And we wish it had been
+thought up much earlier.
+
+=head2 Writing safer macros
+
+Macros are used extensively in the Perl core for such things as hiding
+internal details from the caller, so that it doesn't have to be
+concerned about them.  For example, most lines of code don't need
+to know if they are running on a threaded versus unthreaded perl.  That
+detail is automatically mostly hidden.
+
+It is often better to use an inline function instead of a macro.  They
+are immune to name collisions with the caller, and don't magnify
+problems when called with parameters that are expressions with side
+effects.  There was a time when one might choose a macro over an inline
+function because compiler support for inline functions was quite
+limited.  Some only would actually only inline the first two or three
+encountered in a compilation.  But those days are long gone, and inline
+functions are fully supported in modern compilers.
+
+Nevertheless, there are situations where a function won't do, and a
+macro is required.  One example is when a parameter can be any of
+several types.  A function has to be declared with a single explicit
+
+Or maybe the code involved is so trivial that a function would be just
+complicating overkill, such as when the macro simply creates a mnemonic
+name for some constant value.
+
+If you do choose to use a non-trivial macro, be aware that there are
+several avoidable pitfalls that can occur.  Keep in mind that a macro is
+expanded within the lexical context of each place in the source it is
+called.  If you have a token C<foo> in the macro and the source happens
+also to have C<foo>, the meaning of the macro's C<foo> will become that
+of the caller's.  Sometimes that is exactly the behavior you want, but
+be aware that this tends to be confusing later on.  It effectively turns
+C<foo> into a reserved word for any code that calls the macro, and this
+fact is usually not documented nor considered.  It is safer to pass
+C<foo> as a parameter, so that C<foo> remains freely available to the
+caller and the macro interface is explicitly specified.
+
+Worse is when the equivalence between the two C<foo>'s is coincidental.
+Suppose for example, that the macro declares a variable
+
+ int foo
+
+That works fine as long as the caller doesn't define the string C<foo>
+in some way.  And it might not be until years later that someone comes
+along with an instance where C<foo> is used.  For example a future
+caller could do this:
+
+ #define foo  bar
+
+Then that declaration of C<foo> in the macro suddenly becomes
+
+ int bar
+
+That could mean that something completely different happens than
+intended.  It is hard to debug; the macro and call may not even be in
+the same file, so it would require some digging and gnashing of teeth to
+figure out.
+
+Therefore, if a macro does use variables, their names should be such
+that it is very unlikely that they would collide with any caller, now or
+forever.  One way to do that, now being used in the perl source, is to
+include the name of the macro itself as part of the name of each
+variable in the macro.  Suppose the macro is named C<SvPV>  Then we
+could have
+
+ int foo_svpv_ = 0;
+
+This is harder to read than plain C<foo>, but it is pretty much
+guaranteed that a caller will never naively use C<foo_svpv_> (and run
+into problems).  (The lowercasing makes it clearer that this is a
+variable, but assumes that there won't be two elements whose names
+differ only in the case of their letters.)  The trailing underscore
+makes it even more unlikely to clash, as those, by convention, signify a
+private variable name.  (See L</Choosing legal symbol names> for
+restrictions on what names you can use.)
+
+This kind of name collision doesn't happen with the macro's formal
+parameters, so they don't need to have complicated names.  But there are
+pitfalls when a a parameter is an expression, or has some Perl magic
+attached.  When calling a function, C will evaluate the parameter once,
+and pass the result to the function.  But when calling a macro, the
+parameter is copied as-is by the C preprocessor to each instance inside
+the macro.  This means that when evaluating a parameter having side
+effects, the function and macro results differ.  This is particularly
+fraught when a parameter has overload magic, say it is a tied variable
+that reads the next line in a file upon each evaluation.  Having it read
+multiple lines per call is probably not what the caller intended.  If a
+macro refers to a potentially overloadable parameter more than once, it
+should first make a copy and then use that copy the rest of the time.
+There are macros in the perl core that violate this, but are gradually
+being converted, usually by changing to use inline functions instead.
+
+Above we said "first make a copy".  In a macro, that is easier said than
+done, because macros are normally expressions, and declarations aren't
+allowed in expressions.  But the S<C<STMT_START> .. C<STMT_END>>
+construct, described in L<perlapi|perlapi/STMT_START>, allows you to
+have declarations in most contexts, as long as you don't need a return
+value.  If you do need a value returned, you can make the interface such
+that a pointer is passed to the construct, which then stores its result
+there.  (Or you can use GCC brace groups.  But these require a fallback
+if the code will ever get executed on a platform that lacks this
+non-standard extension to C.  And that fallback would be another code
+path, which can get out-of-sync with the brace group one, so doing this
+isn't advisable.)  In situations where there's no other way, Perl does
+furnish L<perlintern/C<PL_Sv>> and L<perlapi/C<PL_na>> to use (with a
+slight performance penalty) for some such common cases.  But beware that
+a call chain involving multiple macros using them will zap the other's
+use.  These have been very difficult to debug.
+
+For a concrete example of these pitfalls in action, see
+L<https://perlmonks.org/?node_id=11144355>
+
 =head2 Portability problems
 
 The following are common causes of compilation and/or execution
@@ -690,15 +895,19 @@ C<PERL_STATIC_INLINE> to transparently fall back to emulation where needed.
 
 Binding together several statements in a macro
 
-Use the macros STMT_START and STMT_END.
+Use the macros C<STMT_START> and C<STMT_END>.
 
    STMT_START {
       ...
    } STMT_END
 
+But there can be subtle (but avoidable if you do it right) bugs
+introduced with these; see L<perlapi/C<STMT_START>> for best practices
+for their use.
+
 =item *
 
-Testing for operating systems or versions when should be testing for
+Testing for operating systems or versions when you should be testing for
 features
 
   #ifdef __FOONIX__    /* BAD */
@@ -1695,6 +1904,8 @@ determine whether to log the event, and if so how:
 
     $ENV{PERL_MEM_LOG} =~ /m/           Log all memory ops
     $ENV{PERL_MEM_LOG} =~ /s/           Log all SV ops
+    $ENV{PERL_MEM_LOG} =~ /c/           Additionally log C backtrace for
+                                        new_SV events
     $ENV{PERL_MEM_LOG} =~ /t/           include timestamp in Log
     $ENV{PERL_MEM_LOG} =~ /^(\d+)/      write to FD given (default is 2)
 
@@ -1710,6 +1921,10 @@ no extra SV allocations are introduced by enabling the logging.  If
 compiled with C<-DDEBUG_LEAKING_SCALARS>, the serial number for each SV
 allocation is also logged.
 
+The C<c> option uses the C<Perl_c_backtrace> facility, and therefore
+additionally requires the Configure C<-Dusecbacktrace> compile flag in
+order to access it.
+
 =head2 DDD over gdb
 
 Those debugging perl with the DDD frontend over gdb may find the
index 30940a5..cb40f38 100644 (file)
@@ -1693,7 +1693,7 @@ and so uses other non-locale constructs that aren't multi-thread-safe.
 See L<perlxs/Thread-aware system interfaces>.
 
 POSIX does not define a way to get the name of the current per-thread
-locale.  Some systems, such as Darwin and NetBSD do implement a
+locale.  Some systems, such as Darwin and FreeBSD do implement a
 function, L<querylocale(3)> to do this.  On non-Windows systems without
 it, such as Linux, there are some additional caveats:
 
index 5c68273..fa18872 100644 (file)
@@ -81,6 +81,9 @@ the $s variable in package C<owner>, which is probably not what you meant.
 Use braces to disambiguate, as in C<"This is ${owner}'s house">.
 X<::> X<'>
 
+Using C<'> as a package separator is deprecated and will be removed in
+Perl 5.40.
+
 Packages may themselves contain package separators, as in
 C<$OUTER::INNER::var>.  This implies nothing about the order of
 name lookups, however.  There are no relative packages: all symbols
index b626829..a4dc204 100644 (file)
@@ -79,11 +79,11 @@ You can get gzip from L<ftp://prep.ai.mit.edu/pub/gnu/>
 
 Or, you can combine this step with the next to save disk space:
 
-     gzip -dc yourmodule.tar.gz | tar -xf -
+     gzip -dc yourmodule.tar.gz | tar -xof -
 
 B. UNPACK
 
-Unpack the result with C<tar -xf yourmodule.tar>
+Unpack the result with C<tar -xof yourmodule.tar>
 
 C. BUILD
 
index bd0486f..909bd9b 100644 (file)
@@ -64,7 +64,6 @@ for my $filename (@files) {
         die "p5p-controlled module $filename missing =head1 NAME\n"
             if $filename !~ m{^(dist/|cpan/)}n # under our direct control
             && $filename !~ m{/_[^/]+\z}       # not private
-            && $filename !~ m{/unicore/}       # not unicore
             && $filename ne 'lib/meta_notation.pm'      # no pod
             && $filename ne 'lib/overload/numbers.pm';  # no pod
         warn "$filename missing =head1 NAME\n" unless $Quiet;
index c217008..c2491b8 100644 (file)
@@ -182,8 +182,7 @@ been done in Perl, and avoid re-inventing the wheel unless you have a
 good reason.
 
 Good places to look for pre-existing modules include
-L<MetaCPAN|https://metacpan.org> and L<PrePAN|http://prepan.org>
-and asking on C<module-authors@perl.org>
+L<MetaCPAN|https://metacpan.org> and asking on C<module-authors@perl.org>
 (L<https://lists.perl.org/list/module-authors.html>).
 
 If an existing module B<almost> does what you want, consider writing a
@@ -247,15 +246,11 @@ hierarchy already exists under which you could place your module.
 =head2 Get feedback before publishing
 
 If you have never uploaded a module to CPAN before (and even if you have),
-you are strongly encouraged to get feedback on L<PrePAN|http://prepan.org>.
-PrePAN is a site dedicated to discussing ideas for CPAN modules with other
-Perl developers and is a great resource for new (and experienced) Perl
-developers.
-
-You should also try to get feedback from people who are already familiar
-with the module's application domain and the CPAN naming system.  Authors
-of similar modules, or modules with similar names, may be a good place to
-start, as are community sites like L<Perl Monks|https://www.perlmonks.org>.
+you are strongly encouraged to get feedback from people who are already
+familiar with the module's application domain and the CPAN naming system.
+Authors of similar modules, or modules with similar names, may be a good
+place to start, as are community sites like
+L<Perl Monks|https://www.perlmonks.org>.
 
 =head1 DESIGNING AND WRITING YOUR MODULE
 
index ad6d1e3..2345ca3 100644 (file)
@@ -57,10 +57,10 @@ a I<level> of 0. The core always sets I<level> to 0 when it calls your
 function - the parameter is provided to allow your implementation to track
 depth if it needs to recurse.
 
-The function should return a reference to an array containing the parent
-classes in order. The names of the classes should be the result of calling
-C<HvENAME()> on the stash. In those cases where C<HvENAME()> returns null,
-C<HvNAME()> should be used instead.
+The function should return a reference to an array containing string SVs
+giving the names of parent classes in order. The names of the classes should
+be the result of calling C<HvENAME()> on the stash. In those cases where
+C<HvENAME()> returns null, C<HvNAME()> should be used instead.
 
 The caller is responsible for incrementing the reference count of the array
 returned if it wants to keep the structure. Hence, if you have created a
index ca3dd5c..628b3d5 100644 (file)
@@ -88,7 +88,7 @@ written.
 
 There are a lot of modules on CPAN, and it's easy to miss one that's
 similar to what you're planning on contributing. Have a good plough
-through L<http://metacpan.org> and make sure you're not the one
+through L<https://metacpan.org> and make sure you're not the one
 reinventing the wheel!
 
 =item Discuss the need
@@ -234,7 +234,7 @@ file.
 =item Get a CPAN user ID
 
 Every developer publishing modules on CPAN needs a CPAN ID.  Visit
-C<L<http://pause.perl.org/>>, select "Request PAUSE Account", and wait for
+C<L<https://pause.perl.org/>>, select "Request PAUSE Account", and wait for
 your request to be approved by the PAUSE administrators.
 
 =item Make the tarball
@@ -278,4 +278,4 @@ Updated by Kirrily "Skud" Robert, C<skud@cpan.org>
 L<perlmod>, L<perlmodlib>, L<perlmodinstall>, L<h2xs>, L<strict>,
 L<Carp>, L<Exporter>, L<perlpod>, L<Test::Simple>, L<Test::More>
 L<ExtUtils::MakeMaker>, L<Module::Build>, L<Module::Starter>
-L<http://www.cpan.org/>
+L<https://www.cpan.org/>
index 4d47ab0..07c01a5 100644 (file)
@@ -1833,7 +1833,7 @@ and although they often accept just C<"\012">, they seldom tolerate just
 C<"\015">.  If you get in the habit of using C<"\n"> for networking,
 you may be burned some day.
 X<newline> X<line terminator> X<eol> X<end of line>
-X<\r>
+X<\n> X<\r> X<\r\n>
 
 For constructs that do interpolate, variables beginning with "C<$>"
 or "C<@>" are interpolated.  Subscripted variables such as C<$a[3]> or
@@ -1949,8 +1949,8 @@ Options (specified by the following modifiers) are:
         square-bracketed character classes
     p  When matching preserve a copy of the matched string so
         that ${^PREMATCH}, ${^MATCH}, ${^POSTMATCH} will be
-        defined (ignored starting in v5.20) as these are always
-        defined starting in that release
+        defined (ignored starting in v5.20 as these are always
+        defined starting in that release)
     o  Compile pattern only once.
     a   ASCII-restrict: Use ASCII for \d, \s, \w and [[:posix:]]
         character classes; specifying two a's adds the further
@@ -2055,11 +2055,24 @@ The bottom line is that using C</o> is almost never a good idea.
 =item The empty pattern C<//>
 
 If the I<PATTERN> evaluates to the empty string, the last
-I<successfully> matched regular expression is used instead.  In this
-case, only the C<g> and C<c> flags on the empty pattern are honored;
-the other flags are taken from the original pattern.  If no match has
+I<successfully> matched regular expression is used instead. In this
+case, only the C<g> and C<c> flags on the empty pattern are honored; the
+other flags are taken from the original pattern. If no match has
 previously succeeded, this will (silently) act instead as a genuine
-empty pattern (which will always match).
+empty pattern (which will always match).  Using a user supplied string as
+a pattern has the risk that if the string is empty that it triggers the
+"last successful match" behavior, which can be very confusing. In such
+cases you are recommended to replace C<m/$pattern/> with
+C<m/(?:$pattern)/> to avoid this behavior.
+
+The last successful pattern may be accessed as a variable via
+C<${^LAST_SUCCESSFUL_PATTERN}>. Matching against it, or the empty
+pattern should have the same effect, with the exception that when there
+is no last successful pattern the empty pattern will silently match,
+whereas using the C<${^LAST_SUCCESSFUL_PATTERN}> variable will produce
+undefined warnings (if warnings are enabled). You can check
+C<defined(${^LAST_SUCCESSFUL_PATTERN})> to test if there is a "last
+successful match" in the current scope.
 
 Note that it's possible to confuse Perl into thinking C<//> (the empty
 regex) is really C<//> (the defined-or operator).  Perl is usually pretty
index 1aa1702..d84bd35 100644 (file)
@@ -456,7 +456,7 @@ from C<Devel::DProf>.  The 102% figure has disappeared, for example.  This is
 where we have to use the tools at our disposal, and recognise their pros and
 cons, before using them.  Interestingly, the numbers of calls for each
 subroutine are identical in the two reports, it's the percentages which differ.
-As the author of C<Devel::Proviler> writes:
+As the author of C<Devel::Profiler> writes:
 
  ...running HTML::Template's test suite under Devel::DProf shows
  output() taking NO time but Devel::Profiler shows around 10% of the
@@ -490,7 +490,7 @@ C<-d> flag to Perl at runtime.
  words with only capital letters: 1316
  words with only vowels: 1701
 
-C<Devel::SmallProf> writes it's output into a file called F<smallprof.out>, by
+C<Devel::SmallProf> writes its output into a file called F<smallprof.out>, by
 default.  The format of the file looks like this:
 
  <num> <time> <ctime> <line>:<text>
index 4368ddb..22306e7 100644 (file)
@@ -135,7 +135,7 @@ values should be given here.
 
 All possible messages the program can print out and what they mean.  You
 may wish to follow the same documentation style as the Perl documentation;
-see L<perldiag> for more details (and look at the POD source as well).
+see perldiag(1) for more details (and look at the POD source as well).
 
 If applicable, please include details on what the user should do to
 correct the error; documenting an error as indicating "the input buffer is
index 4a9776e..81b4434 100644 (file)
@@ -2102,6 +2102,12 @@ Since Windows needs to know whether the target is a directory or not when
 creating the link the target Perl will only create the link as a directory
 link when the target exists and is a directory.
 
+Windows does not recognize forward slashes as path separators in
+symbolic links.  Hence on Windows, any C</> in the I<OLDFILE>
+parameter to symlink() are converted to C<\>.  This is reflected in
+the result returned by readlink(), the C<\> in the result are not
+converted back to C</>.
+
 (VMS)
 Implemented on 64 bit VMS 8.3.  VMS requires the symbolic link to be in Unix
 syntax if it is intended to resolve to a valid path.
@@ -2345,6 +2351,18 @@ ensure you have that library installed when building perl.
 
 =head1 EOL Platforms
 
+=head2 (Perl 5.37.1)
+
+The following platforms were supported by a previous version of
+Perl but have been officially removed from Perl's source code
+as of 5.37.1:
+
+=over
+
+=item Ultrix
+
+=back
+
 =head2 (Perl 5.36)
 
 The following platforms were supported by a previous version of
@@ -2514,7 +2532,6 @@ of any trouble.
         SVR2
         TI1500
         TitanOS
-        Ultrix
         Unisys Dynix
 
 The following platforms have their own source code distributions and
index ef00abb..300237f 100644 (file)
@@ -453,7 +453,8 @@ L</Overview> above.
 
 A single C</x> tells
 the regular expression parser to ignore most whitespace that is neither
-backslashed nor within a bracketed character class.  You can use this to
+backslashed nor within a bracketed character class, nor within the characters
+of a multi-character metapattern like C<(?i: ... )>.  You can use this to
 break up your regular expression into more readable parts.
 Also, the C<"#"> character is treated as a metacharacter introducing a
 comment that runs up to the pattern's closing delimiter, or to the end
@@ -1206,9 +1207,13 @@ require C<(??{})>.)
 
 Capture group contents are dynamically scoped and available to you outside the
 pattern until the end of the enclosing block or until the next successful
-match, whichever comes first.  (See L<perlsyn/"Compound Statements">.)
-You can refer to them by absolute number (using C<"$1"> instead of C<"\g1">,
-I<etc>); or by name via the C<%+> hash, using C<"$+{I<name>}">.
+match in the same scope, whichever comes first.
+See L<perlsyn/"Compound Statements"> and
+L<perlvar/"Scoping Rules of Regex Variables"> for more details.
+
+You can access the contents of a capture group by absolute number (using
+C<"$1"> instead of C<"\g1">, I<etc>); or by name via the C<%+> hash,
+using C<"$+{I<name>}">.
 
 Braces are required in referring to named capture groups, but are optional for
 absolute or relative numbered ones.  Braces are safer when creating a regex by
@@ -1990,6 +1995,18 @@ keep track of the number of nested parentheses. For example:
   /the (\S+)(?{ $color = $^N }) (\S+)(?{ $animal = $^N })/i;
   print "color = $color, animal = $animal\n";
 
+The use of this construct disables some optimisations globally in the
+pattern, and the pattern may execute much slower as a consequence.
+Use a C<*> instead of the C<?> block to create an optimistic form of
+this construct. C<(*{ ... })> should not disable any optimisations.
+
+=item C<(*{ I<code> })>
+X<(*{})> X<regex, optimistic code>
+
+This is *exactly* the same as C<(?{ I<code> })> with the exception
+that it does not disable B<any> optimisations at all in the regex engine.
+How often it is executed may vary from perl release to perl release.
+In a failing match it may not even be executed at all.
 
 =item C<(??{ I<code> })>
 X<(??{})>
@@ -2047,6 +2064,9 @@ consuming any input string will also result in a fatal error.  The depth
 at which that happens is compiled into perl, so it can be changed with a
 custom build.
 
+The use of this construct disables some optimisations globally in the pattern,
+and the pattern may execute much slower as a consequence.
+
 =item C<(?I<PARNO>)> C<(?-I<PARNO>)> C<(?+I<PARNO>)> C<(?R)> C<(?0)>
 X<(?PARNO)> X<(?1)> X<(?R)> X<(?0)> X<(?-1)> X<(?+1)> X<(?-PARNO)> X<(?+PARNO)>
 X<regex, recursive> X<regexp, recursive> X<regular expression, recursive>
@@ -2201,7 +2221,15 @@ Full syntax: C<< (?(?=I<lookahead>)I<then>|I<else>) >>
 =item C<(?{ I<CODE> })>
 
 Treats the return value of the code block as the condition.
-Full syntax: C<< (?(?{ I<code> })I<then>|I<else>) >>
+Full syntax: C<< (?(?{ I<CODE> })I<then>|I<else>) >>
+
+Note use of this construct may globally affect the performance
+of the pattern. Consider using C<(*{ I<CODE> })>
+
+=item C<(*{ I<CODE> })>
+
+Treats the return value of the code block as the condition.
+Full syntax: C<< (?(*{ I<CODE> })I<then>|I<else>) >>
 
 =item C<(R)>
 
@@ -2703,7 +2731,7 @@ accent of some type.  These are considered to be in the script of the
 master character, and so never cause a script run to not match.
 
 The other one is "Common".  This consists of mostly punctuation, emoji,
-and characters used in mathematics and music, the ASCII digits C<0>
+characters used in mathematics and music, the ASCII digits C<0>
 through C<9>, and full-width forms of these digits.  These characters
 can appear intermixed in text in many of the world's scripts.  These
 also don't cause a script run to not match.  But like other scripts, all
@@ -3293,14 +3321,15 @@ part of this regular expression needs to be converted explicitly
 
 =head2 Embedded Code Execution Frequency
 
-The exact rules for how often C<(??{})> and C<(?{})> are executed in a pattern
-are unspecified.  In the case of a successful match you can assume that
-they DWIM and will be executed in left to right order the appropriate
-number of times in the accepting path of the pattern as would any other
-meta-pattern.  How non-accepting pathways and match failures affect the
-number of times a pattern is executed is specifically unspecified and
-may vary depending on what optimizations can be applied to the pattern
-and is likely to change from version to version.
+The exact rules for how often C<(?{})> and C<(??{})> are executed in a pattern
+are unspecified, and this is even more true of C<(*{})>.
+In the case of a successful match you can assume that they DWIM and
+will be executed in left to right order the appropriate number of times in the
+accepting path of the pattern as would any other meta-pattern. How non-
+accepting pathways and match failures affect the number of times a pattern is
+executed is specifically unspecified and may vary depending on what
+optimizations can be applied to the pattern and is likely to change from
+version to version.
 
 For instance in
 
@@ -3326,6 +3355,13 @@ example:
 
 will output "o" twice.
 
+For historical and consistency reasons the use of normal code blocks
+anywhere in a pattern will disable certain optimisations. As of 5.37.7
+you can use an "optimistic" codeblock, C<(*{ ... })> as a replacement
+for C<(?{ ... })>, if you do *not* wish to disable these optimisations.
+This may result in the code block being called less often than it might
+have been had they not been optimistic.
+
 =head2 PCRE/Python Support
 
 As of Perl 5.10.0, Perl supports several Python/PCRE-specific extensions
index 9f59461..51c0ba7 100644 (file)
@@ -129,11 +129,11 @@ If this is in C<< rx->extflags >> it will be passed to
 C<Perl_fbm_instr> by C<pp_split> which will treat the subject string
 as a multi-line string.
 
-=for apidoc Amnh||RXf_PMf_MULTILINE
-=for apidoc_item  RXf_PMf_SINGLELINE
+=for apidoc Amnh||RXf_PMf_EXTENDED
 =for apidoc_item  RXf_PMf_FOLD
-=for apidoc_item  RXf_PMf_EXTENDED
 =for apidoc_item  RXf_PMf_KEEPCOPY
+=for apidoc_item  RXf_PMf_MULTILINE
+=for apidoc_item  RXf_PMf_SINGLELINE
 
 =item C</s> - RXf_PMf_SINGLELINE
 
@@ -192,12 +192,12 @@ SKIPWHITE and WHITE extflags.  To do this, the Perl engine does:
 These flags can be set during compilation to enable optimizations in
 the C<split> operator.
 
-=for apidoc Amnh||RXf_SPLIT
+=for apidoc Amnh||RXf_NO_INPLACE_SUBST
+=for apidoc_item  RXf_NULL
 =for apidoc_item  RXf_SKIPWHITE
+=for apidoc_item  RXf_SPLIT
 =for apidoc_item  RXf_START_ONLY
 =for apidoc_item  RXf_WHITE
-=for apidoc_item  RXf_NULL
-=for apidoc_item  RXf_NO_INPLACE_SUBST
 
 =over 4
 
@@ -507,19 +507,19 @@ C<%+> or C<%+>, if any:
     RXapif_FIRSTKEY
     RXapif_NEXTKEY
 
-=for apidoc Amnh ||RXapif_CLEAR
+=for apidoc Amnh ||RXapif_ALL
+=for apidoc_item   RXapif_CLEAR
 =for apidoc_item   RXapif_DELETE
 =for apidoc_item   RXapif_EXISTS
 =for apidoc_item   RXapif_FETCH
 =for apidoc_item   RXapif_FIRSTKEY
 =for apidoc_item   RXapif_NEXTKEY
-=for apidoc_item   RXapif_SCALAR
-=for apidoc_item   RXapif_STORE
-=for apidoc_item   RXapif_ALL
 =for apidoc_item   RXapif_ONE
 =for apidoc_item   RXapif_REGNAME
 =for apidoc_item   RXapif_REGNAMES
 =for apidoc_item   RXapif_REGNAMES_COUNT
+=for apidoc_item   RXapif_SCALAR
+=for apidoc_item   RXapif_STORE
 
 If C<%+> or C<%-> is being operated on, if any.
 
@@ -844,9 +844,9 @@ number of bytes from the logical start of the buffer to the physical start
 characters in the offset. The latter is needed to support C<@-> and C<@+>
 which work in characters, not bytes.
 
-=for apidoc Amnh||REXEC_COPY_STR
+=for apidoc Amnh ||REXEC_COPY_SKIP_POST
 =for apidoc_item ||REXEC_COPY_SKIP_PRE
-=for apidoc_item ||REXEC_COPY_SKIP_POST
+=for apidoc_item ||REXEC_COPY_STR
 
 =head2 C<wrapped> C<wraplen>
 
index 2fd321b..6934e0b 100644 (file)
@@ -757,7 +757,9 @@ Glob elements can be extracted through the postfix dereferencing feature:
 
 Postfix array and scalar dereferencing I<can> be used in interpolating
 strings (double quotes or the C<qq> operator), but only if the
-C<postderef_qq> feature is enabled.
+C<postderef_qq> feature is enabled. Interpolation of postfix array highest index
+access (C<< ->$#* >>) is also supported when the C<postderef_qq> feature is
+enabled.
 
 =head2 Postfix Reference Slicing
 
index 94a96b0..0a59e2b 100644 (file)
@@ -101,7 +101,6 @@ reference to that variable.
 
     $aref = \@array;         # $aref now holds a reference to @array
     $href = \%hash;          # $href now holds a reference to %hash
-    $sref = \$scalar;        # $sref now holds a reference to $scalar
 
 Once the reference is stored in a variable like $aref or $href, you
 can copy it or store it just the same as any other scalar value:
index 2cb25c7..ca37c71 100644 (file)
@@ -63,7 +63,7 @@ many examples.  The first part of the tutorial will progress from the
 simplest word searches to the basic regular expression concepts.  If
 you master the first part, you will have all the tools needed to solve
 about 98% of your needs.  The second part of the tutorial is for those
-comfortable with the basics and hungry for more power tools.  It
+comfortable with the basics, and hungry for more power tools.  It
 discusses the more advanced regular expression operators and
 introduces the latest cutting-edge innovations.
 
@@ -690,49 +690,51 @@ of what Perl does when it tries to match the regexp
 
 =over 4
 
-=item Z<>0. Start with the first letter in the string C<'a'>.
+=item 1.
 
-E<nbsp>
+Start with the first letter in the string C<'a'>.
 
-=item Z<>1. Try the first alternative in the first group C<'abd'>.
+=item 2.
 
-E<nbsp>
+Try the first alternative in the first group C<'abd'>.
 
-=item Z<>2.  Match C<'a'> followed by C<'b'>. So far so good.
+=item 3.
 
-E<nbsp>
+Match C<'a'> followed by C<'b'>. So far so good.
 
-=item Z<>3.  C<'d'> in the regexp doesn't match C<'c'> in the string - a
+=item 4.
+
+C<'d'> in the regexp doesn't match C<'c'> in the string - a
 dead end.  So backtrack two characters and pick the second alternative
 in the first group C<'abc'>.
 
-E<nbsp>
+=item 5.
 
-=item Z<>4.  Match C<'a'> followed by C<'b'> followed by C<'c'>.  We are on a roll
+Match C<'a'> followed by C<'b'> followed by C<'c'>.  We are on a roll
 and have satisfied the first group. Set C<$1> to C<'abc'>.
 
-E<nbsp>
+=item 6.
 
-=item Z<>5 Move on to the second group and pick the first alternative C<'df'>.
+Move on to the second group and pick the first alternative C<'df'>.
 
-E<nbsp>
+=item 7.
 
-=item Z<>6 Match the C<'d'>.
+Match the C<'d'>.
 
-E<nbsp>
+=item 8.
 
-=item Z<>7.  C<'f'> in the regexp doesn't match C<'e'> in the string, so a dead
+C<'f'> in the regexp doesn't match C<'e'> in the string, so a dead
 end.  Backtrack one character and pick the second alternative in the
 second group C<'d'>.
 
-E<nbsp>
+=item 9.
 
-=item Z<>8.  C<'d'> matches. The second grouping is satisfied, so set
+C<'d'> matches. The second grouping is satisfied, so set
 C<$2> to C<'d'>.
 
-E<nbsp>
+=item 10.
 
-=item Z<>9.  We are at the end of the regexp, so we are done! We have
+We are at the end of the regexp, so we are done! We have
 matched C<'abcd'> out of the string C<"abcde">.
 
 =back
@@ -1322,36 +1324,38 @@ backtracking.  Here is a step-by-step analysis of the example
 
 =over 4
 
-=item Z<>0.  Start with the first letter in the string C<'t'>.
+=item 1.
+
+Start with the first letter in the string C<'t'>.
 
-E<nbsp>
+=item 2.
 
-=item Z<>1.  The first quantifier C<'.*'> starts out by matching the whole
-string "C<the cat in the hat>".
+The first quantifier C<'.*'> starts out by matching the whole
+string C<"the cat in the hat">.
 
-E<nbsp>
+=item 3.
 
-=item Z<>2.  C<'a'> in the regexp element C<'at'> doesn't match the end
+C<'a'> in the regexp element C<'at'> doesn't match the end
 of the string.  Backtrack one character.
 
-E<nbsp>
+=item 4.
 
-=item Z<>3.  C<'a'> in the regexp element C<'at'> still doesn't match
+C<'a'> in the regexp element C<'at'> still doesn't match
 the last letter of the string C<'t'>, so backtrack one more character.
 
-E<nbsp>
+=item 5.
 
-=item Z<>4.  Now we can match the C<'a'> and the C<'t'>.
+Now we can match the C<'a'> and the C<'t'>.
 
-E<nbsp>
+=item 6.
 
-=item Z<>5.  Move on to the third element C<'.*'>.  Since we are at the
+Move on to the third element C<'.*'>.  Since we are at the
 end of the string and C<'.*'> can match 0 times, assign it the empty
 string.
 
-E<nbsp>
+=item 7.
 
-=item Z<>6.  We are done!
+We are done!
 
 =back
 
@@ -2465,10 +2469,10 @@ parentheses and the second alternative C<\([^()]*\)>  matching a
 substring delimited by parentheses.  The problem with this regexp is
 that it is pathological: it has nested indeterminate quantifiers
 of the form C<(a+|b)+>.  We discussed in Part 1 how nested quantifiers
-like this could take an exponentially long time to execute if no match
-were possible.  To prevent the exponential blowup, we need to prevent
-useless backtracking at some point.  This can be done by enclosing the
-inner quantifier as an independent subexpression:
+like this could take an exponentially long time to execute if there
+is no match possible.  To prevent the exponential blowup, we need to
+prevent useless backtracking at some point.  This can be done by
+enclosing the inner quantifier as an independent subexpression:
 
     $x =~ /\( ( (?> [ ^ () ]+ ) | \([ ^ () ]* \) )+ \)/xx;
 
index 817e2f2..6ed5703 100644 (file)
@@ -440,7 +440,7 @@ B<-D14> is equivalent to B<-Dtls>):
 All these flags require B<-DDEBUGGING> when you compile the Perl
 executable (but see C<:opd> in L<Devel::Peek> or L<re/'debug' mode>
 which may change this).
-See the F<INSTALL> file in the Perl source distribution
+See the L<INSTALL> file in the Perl source distribution
 for how to do this.
 
 If you're just trying to get a print out of each line of Perl code
@@ -1405,6 +1405,32 @@ with tainting enabled.
 
 Perl may be built to ignore this variable.
 
+=item PERL_RAND_SEED
+X<PERL_RAND_SEED>
+
+When set to an integer value this value will be used to seed the perl
+internal random number generator used for C<rand()> when it is used
+without an explicit C<srand()> call or for when an explicit no-argument
+C<srand()> call is made.
+
+Normally calling C<rand()> prior to calling C<srand()> or calling
+C<srand()> explicitly with no arguments should result in the random
+number generator using "best efforts" to seed the generator state with a
+relatively high quality random seed. When this environment variable is
+set then the seeds used will be deterministically computed from the
+value provided in the env var in such a way that the application process
+and any forks or threads should continue to have their own unique seed but
+that the program may be run twice with identical results as far as
+C<rand()> goes (assuming all else is equal).
+
+PERL_RAND_SEED is intended for performance measurements and debugging
+and is explicitly NOT intended for stable testing. The only guarantee is
+that a specific perl executable will produce the same results twice in a
+row, there is no guarantee that the results will be the same between
+perl releases or on different architectures.
+
+Ignored if perl is run setuid or setgid.
+
 =back
 
 Perl also has environment variables that control how Perl handles data
index 75d4e0f..ba66ab7 100644 (file)
@@ -23,7 +23,7 @@ well as several other useful L<named features|feature/AVAILABLE FEATURES>).
 
     use v5.36;
 
-Regarding aesthetics of code lay out, about the only thing Larry
+Regarding aesthetics of code layout, about the only thing Larry
 cares strongly about is that the closing curly bracket of
 a multi-line BLOCK should line up with the keyword that started the construct.
 Beyond that, he has other preferences that aren't so strong:
@@ -225,7 +225,7 @@ Don't use slash as a delimiter when your regexp has slashes or backslashes.
 
 =item *
 
-Use the new C<and> and C<or> operators to avoid having to parenthesize
+Use the C<and> and C<or> operators to avoid having to parenthesize
 list operators so much, and to reduce the incidence of punctuation
 operators like C<&&> and C<||>.  Call your subroutines as if they were
 functions or list operators to avoid excessive ampersands and parentheses.
index 30d0395..642d7f3 100644 (file)
@@ -8,32 +8,32 @@ perlsub - Perl subroutines
 To declare subroutines:
 X<subroutine, declaration> X<sub>
 
-    sub NAME;                    # A "forward" declaration.
-    sub NAME(PROTO);             #  ditto, but with prototypes
-    sub NAME : ATTRS;            #  with attributes
-    sub NAME(PROTO) : ATTRS;     #  with attributes and prototypes
+    sub NAME;                       # A "forward" declaration.
+    sub NAME(PROTO);                #  ditto, but with prototypes
+    sub NAME : ATTRS;               #  with attributes
+    sub NAME(PROTO) : ATTRS;        #  with attributes and prototypes
 
-    sub NAME BLOCK               # A declaration and a definition.
-    sub NAME(PROTO) BLOCK        #  ditto, but with prototypes
-    sub NAME : ATTRS BLOCK       #  with attributes
-    sub NAME(PROTO) : ATTRS BLOCK #  with prototypes and attributes
+    sub NAME BLOCK                  # A declaration and a definition.
+    sub NAME(PROTO) BLOCK           #  ditto, but with prototypes
+    sub NAME : ATTRS BLOCK          #  with attributes
+    sub NAME(PROTO) : ATTRS BLOCK   #  with prototypes and attributes
 
     use feature 'signatures';
-    sub NAME(SIG) BLOCK                    # with signature
-    sub NAME :ATTRS (SIG) BLOCK            # with signature, attributes
-    sub NAME :prototype(PROTO) (SIG) BLOCK # with signature, prototype
+    sub NAME(SIG) BLOCK                     # with signature
+    sub NAME :ATTRS (SIG) BLOCK             # with signature, attributes
+    sub NAME :prototype(PROTO) (SIG) BLOCK  # with signature, prototype
 
 To define an anonymous subroutine at runtime:
 X<subroutine, anonymous>
 
-    $subref = sub BLOCK;                # no proto
-    $subref = sub (PROTO) BLOCK;        # with proto
-    $subref = sub : ATTRS BLOCK;        # with attributes
-    $subref = sub (PROTO) : ATTRS BLOCK; # with proto and attributes
+    $subref = sub BLOCK;                    # no proto
+    $subref = sub (PROTO) BLOCK;            # with proto
+    $subref = sub : ATTRS BLOCK;            # with attributes
+    $subref = sub (PROTO) : ATTRS BLOCK;    # with proto and attributes
 
     use feature 'signatures';
-    $subref = sub (SIG) BLOCK;           # with signature
-    $subref = sub : ATTRS(SIG) BLOCK;    # with signature, attributes
+    $subref = sub (SIG) BLOCK;          # with signature
+    $subref = sub : ATTRS(SIG) BLOCK;   # with signature, attributes
 
 To import subroutines:
 X<import>
@@ -43,10 +43,10 @@ X<import>
 To call subroutines:
 X<subroutine, call> X<call>
 
-    NAME(LIST);           # & is optional with parentheses.
-    NAME LIST;    # Parentheses optional if predeclared/imported.
-    &NAME(LIST);   # Circumvent prototypes.
-    &NAME;        # Makes current @_ visible to called subroutine.
+    NAME(LIST);     # & is optional with parentheses.
+    NAME LIST;      # Parentheses optional if predeclared/imported.
+    &NAME(LIST);    # Circumvent prototypes.
+    &NAME;          # Makes current @_ visible to called subroutine.
 
 =head1 DESCRIPTION
 
@@ -70,7 +70,7 @@ X<subroutine, parameter> X<parameter>
 
 In a subroutine that uses signatures (see L</Signatures> below),
 arguments are assigned into lexical variables introduced by the
-signature.  In the current implementation of perl they are also
+signature.  In the current implementation of Perl they are also
 accessible in the C<@_> array in the same way as for non-signature
 subroutines, but accessing them in this manner is now discouraged inside
 such a signature-using subroutine.
@@ -115,11 +115,11 @@ X<subroutine, return value> X<return value> X<return>
 Example:
 
     sub max {
-       my $max = shift(@_);
-       foreach $foo (@_) {
-           $max = $foo if $max < $foo;
-       }
-       return $max;
+        my $max = shift(@_);
+        foreach $foo (@_) {
+            $max = $foo if $max < $foo;
+        }
+        return $max;
     }
     $bestday = max($mon,$tue,$wed,$thu,$fri);
 
@@ -129,28 +129,28 @@ Example:
     #  that start with whitespace
 
     sub get_line {
-       $thisline = $lookahead;  # global variables!
-       LINE: while (defined($lookahead = <STDIN>)) {
-           if ($lookahead =~ /^[ \t]/) {
-               $thisline .= $lookahead;
-           }
-           else {
-               last LINE;
-           }
-       }
-       return $thisline;
-    }
-
-    $lookahead = <STDIN>;      # get first line
+        $thisline = $lookahead;  # global variables!
+        LINE: while (defined($lookahead = <STDIN>)) {
+            if ($lookahead =~ /^[ \t]/) {
+                $thisline .= $lookahead;
+            }
+            else {
+                last LINE;
+            }
+        }
+        return $thisline;
+    }
+
+    $lookahead = <STDIN>;       # get first line
     while (defined($line = get_line())) {
-       ...
+        ...
     }
 
 Assigning to a list of private variables to name your arguments:
 
     sub maybeset {
-       my($key, $value) = @_;
-       $Foo{$key} = $value unless $Foo{$key};
+        my($key, $value) = @_;
+        $Foo{$key} = $value unless $Foo{$key};
     }
 
 Because the assignment copies the values, this also has the effect
@@ -161,7 +161,7 @@ X<call-by-reference> X<call-by-value>
 
     upcase_in($v1, $v2);  # this changes $v1 and $v2
     sub upcase_in {
-       for (@_) { tr/a-z/A-Z/ }
+        for (@_) { tr/a-z/A-Z/ }
     }
 
 You aren't allowed to modify constants in this way, of course.  If an
@@ -177,10 +177,10 @@ of changing them in place:
 
     ($v3, $v4) = upcase($v1, $v2);  # this doesn't change $v1 and $v2
     sub upcase {
-       return unless defined wantarray;  # void context, do nothing
-       my @parms = @_;
-       for (@parms) { tr/a-z/A-Z/ }
-       return wantarray ? @parms : $parms[0];
+        return unless defined wantarray;  # void context, do nothing
+        my @parms = @_;
+        for (@parms) { tr/a-z/A-Z/ }
+        return wantarray ? @parms : $parms[0];
     }
 
 Notice how this (unprototyped) function doesn't care whether it was
@@ -195,11 +195,11 @@ definition even if we fed it things like this:
 
 Do not, however, be tempted to do this:
 
-    (@a, @b)   = upcase(@list1, @list2);
+    (@x, @y)   = upcase(@list1, @list2);
 
 Like the flattened incoming parameter list, the return list is also
 flattened on return.  So all you have managed to do here is stored
-everything in C<@a> and made C<@b> empty.  See 
+everything in C<@x> and made C<@y> empty.  See
 L</Pass by Reference> for alternatives.
 
 A subroutine may be called using an explicit C<&> prefix.  The
@@ -220,13 +220,13 @@ time of the call is visible to subroutine instead.  This is an
 efficiency mechanism that new users may wish to avoid.
 X<recursion>
 
-    &foo(1,2,3);       # pass three arguments
-    foo(1,2,3);                # the same
+    &foo(1,2,3);        # pass three arguments
+    foo(1,2,3);         # the same
 
-    foo();             # pass a null list
-    &foo();            # the same
+    foo();              # pass a null list
+    &foo();             # the same
 
-    &foo;              # foo() get current args, like foo(@_) !!
+    &foo;               # foo() get current args, like foo(@_) !!
     use strict 'subs';
     foo;                # like foo() iff sub foo predeclared, else
                         # a compile-time error
@@ -247,9 +247,9 @@ your subroutine's name.
 
     use v5.16;
     my $factorial = sub {
-      my ($x) = @_;
-      return 1 if $x == 1;
-      return($x * __SUB__->( $x - 1 ) );
+        my ($x) = @_;
+        return 1 if $x == 1;
+        return($x * __SUB__->( $x - 1 ) );
     };
 
 The behavior of C<__SUB__> within a regex code block (such as C</(?{...})/>)
@@ -259,8 +259,8 @@ Subroutines whose names are in all upper case are reserved to the Perl
 core, as are modules whose names are in all lower case.  A subroutine in
 all capitals is a loosely-held convention meaning it will be called
 indirectly by the run-time system itself, usually due to a triggered event.
-Subroutines whose name start with a left parenthesis are also reserved the 
-same way.  The following is a list of some subroutines that currently do 
+Subroutines whose name start with a left parenthesis are also reserved the
+same way.  The following is a list of some subroutines that currently do
 special, pre-defined things.
 
 =over
@@ -279,23 +279,23 @@ C<DESTROY>, C<DOES>
 
 =item documented in L<perltie>
 
-C<BINMODE>, C<CLEAR>, C<CLOSE>, C<DELETE>, C<DESTROY>, C<EOF>, C<EXISTS>, 
-C<EXTEND>, C<FETCH>, C<FETCHSIZE>, C<FILENO>, C<FIRSTKEY>, C<GETC>, 
-C<NEXTKEY>, C<OPEN>, C<POP>, C<PRINT>, C<PRINTF>, C<PUSH>, C<READ>, 
-C<READLINE>, C<SCALAR>, C<SEEK>, C<SHIFT>, C<SPLICE>, C<STORE>, 
-C<STORESIZE>, C<TELL>, C<TIEARRAY>, C<TIEHANDLE>, C<TIEHASH>, 
+C<BINMODE>, C<CLEAR>, C<CLOSE>, C<DELETE>, C<DESTROY>, C<EOF>, C<EXISTS>,
+C<EXTEND>, C<FETCH>, C<FETCHSIZE>, C<FILENO>, C<FIRSTKEY>, C<GETC>,
+C<NEXTKEY>, C<OPEN>, C<POP>, C<PRINT>, C<PRINTF>, C<PUSH>, C<READ>,
+C<READLINE>, C<SCALAR>, C<SEEK>, C<SHIFT>, C<SPLICE>, C<STORE>,
+C<STORESIZE>, C<TELL>, C<TIEARRAY>, C<TIEHANDLE>, C<TIEHASH>,
 C<TIESCALAR>, C<UNSHIFT>, C<UNTIE>, C<WRITE>
 
 =item documented in L<PerlIO::via>
 
-C<BINMODE>, C<CLEARERR>, C<CLOSE>, C<EOF>, C<ERROR>, C<FDOPEN>, C<FILENO>, 
-C<FILL>, C<FLUSH>, C<OPEN>, C<POPPED>, C<PUSHED>, C<READ>, C<SEEK>, 
+C<BINMODE>, C<CLEARERR>, C<CLOSE>, C<EOF>, C<ERROR>, C<FDOPEN>, C<FILENO>,
+C<FILL>, C<FLUSH>, C<OPEN>, C<POPPED>, C<PUSHED>, C<READ>, C<SEEK>,
 C<SETLINEBUF>, C<SYSOPEN>, C<TELL>, C<UNREAD>, C<UTF8>, C<WRITE>
 
 =item documented in L<perlfunc>
 
-L<< C<import> | perlfunc/use >>, L<< C<unimport> | perlfunc/use >>,
-L<< C<INC> | perlfunc/require >>
+L<< C<import>|perlfunc/use >>, L<< C<unimport>|perlfunc/use >>,
+L<< C<INC>|perlfunc/require >>
 
 =item documented in L<UNIVERSAL>
 
@@ -335,7 +335,7 @@ block, after any name or attributes.
 
 For example,
 
-    sub foo :lvalue ($a, $b = 1, @c) { .... }
+    sub foo :lvalue ($x, $y = 1, @z) { .... }
 
 The signature declares lexical variables that are
 in scope for the block.  When the subroutine is called, the signature
@@ -348,7 +348,7 @@ Positional parameters are handled by simply naming scalar variables in
 the signature.  For example,
 
     sub foo ($left, $right) {
-       return $left + $right;
+        return $left + $right;
     }
 
 takes two positional parameters, which must be filled at runtime by
@@ -357,18 +357,18 @@ not permitted to pass more arguments than expected.  So the above is
 equivalent to
 
     sub foo {
-       die "Too many arguments for subroutine" unless @_ <= 2;
-       die "Too few arguments for subroutine" unless @_ >= 2;
-       my $left = $_[0];
-       my $right = $_[1];
-       return $left + $right;
+        die "Too many arguments for subroutine" unless @_ <= 2;
+        die "Too few arguments for subroutine" unless @_ >= 2;
+        my $left = $_[0];
+        my $right = $_[1];
+        return $left + $right;
     }
 
 An argument can be ignored by omitting the main part of the name from
 a parameter declaration, leaving just a bare C<$> sigil.  For example,
 
     sub foo ($first, $, $third) {
-       return "first=$first, third=$third";
+        return "first=$first, third=$third";
     }
 
 Although the ignored argument doesn't go into a variable, it is still
@@ -378,7 +378,7 @@ A positional parameter is made optional by giving a default value,
 separated from the parameter name by C<=>:
 
     sub foo ($left, $right = 0) {
-       return $left + $right;
+        return $left + $right;
     }
 
 The above subroutine may be called with either one or two arguments.
@@ -389,7 +389,7 @@ For example,
 
     my $auto_id = 0;
     sub foo ($thing, $id = $auto_id++) {
-       print "$thing has ID $id";
+        print "$thing has ID $id";
     }
 
 automatically assigns distinct sequential IDs to things for which no
@@ -398,14 +398,32 @@ refer to parameters earlier in the signature, making the default for
 one parameter vary according to the earlier parameters.  For example,
 
     sub foo ($first_name, $surname, $nickname = $first_name) {
-       print "$first_name $surname is known as \"$nickname\"";
+        print "$first_name $surname is known as \"$nickname\"";
+    }
+
+A default value expression can also be written using the C<//=> operator,
+where it will be evaluated and used if the caller omitted a value or the
+value provided was C<undef>.
+
+    sub foo ($name //= "world") {
+        print "Hello, $name";
+    }
+
+    foo(undef);  # will print "Hello, world"
+
+Similarly, the C<||=> operator can be used to provide a default
+expression to be used whenever the caller provided a false value (and
+remember that a missing or C<undef> value are also false).
+
+    sub foo ($x ||= 10) {
+        return 5 + $x;
     }
 
 An optional parameter can be nameless just like a mandatory parameter.
 For example,
 
     sub foo ($thing, $ = 1) {
-       print $thing;
+        print $thing;
     }
 
 The parameter's default value will still be evaluated if the corresponding
@@ -417,7 +435,7 @@ category is enabled.  If a nameless optional parameter's default value
 is not important, it may be omitted just as the parameter's name was:
 
     sub foo ($thing, $=) {
-       print $thing;
+        print $thing;
     }
 
 Optional positional parameters must come after all mandatory positional
@@ -431,7 +449,7 @@ After positional parameters, additional arguments may be captured in a
 slurpy parameter.  The simplest form of this is just an array variable:
 
     sub foo ($filter, @inputs) {
-       print $filter->($_) foreach @inputs;
+        print $filter->($_) foreach @inputs;
     }
 
 With a slurpy parameter in the signature, there is no upper limit on how
@@ -440,7 +458,7 @@ just like a positional parameter, in which case its only effect is to
 turn off the argument limit that would otherwise apply:
 
     sub foo ($thing, @) {
-       print $thing;
+        print $thing;
     }
 
 A slurpy parameter may instead be a hash, in which case the arguments
@@ -451,7 +469,7 @@ duplicates then the later instance takes precedence over the earlier,
 as with standard hash construction.
 
     sub foo ($filter, %inputs) {
-       print $filter->($_, $inputs{$_}) foreach sort keys %inputs;
+        print $filter->($_, $inputs{$_}) foreach sort keys %inputs;
     }
 
 A slurpy hash parameter may be nameless just like other kinds of
@@ -459,7 +477,7 @@ parameter.  It still insists that the number of arguments available to
 it be even, even though they're not being put into a variable.
 
     sub foo ($thing, %) {
-       print $thing;
+        print $thing;
     }
 
 A slurpy parameter, either array or hash, must be the last thing in the
@@ -472,7 +490,7 @@ A signature may be entirely empty, in which case all it does is check
 that the caller passed no arguments:
 
     sub foo () {
-       return 123;
+        return 123;
     }
 
 Prior to Perl 5.36 these were considered experimental, and emitted a
@@ -483,7 +501,7 @@ statement such as:
 
     no warnings 'experimental::signatures';
 
-In the current perl implementation, when using a signature the arguments
+In the current Perl implementation, when using a signature the arguments
 are still also available in the special array variable C<@_>.  However,
 accessing them via this array is now discouraged, and should not be
 relied upon in newly-written code as this ability may change in a future
@@ -532,7 +550,7 @@ of calls to the subroutine, and the signature puts argument values into
 lexical variables at runtime.  You can therefore write
 
     sub foo :prototype($$) ($left, $right) {
-       return $left + $right;
+        return $left + $right;
     }
 
 The prototype attribute, and any other attributes, must come before
@@ -545,11 +563,11 @@ X<lexical scope> X<attributes, my>
 
 Synopsis:
 
-    my $foo;           # declare $foo lexically local
-    my (@wid, %get);   # declare list of variables local
-    my $foo = "flurp"; # declare $foo lexical, and init it
-    my @oof = @bar;    # declare @oof lexical, and init it
-    my $x : Foo = $y;  # similar, with an attribute applied
+    my $foo;            # declare $foo lexically local
+    my (@wid, %get);    # declare list of variables local
+    my $foo = "flurp";  # declare $foo lexical, and init it
+    my @oof = @bar;     # declare @oof lexical, and init it
+    my $x : Foo = $y;   # similar, with an attribute applied
 
 B<WARNING>: The use of attribute lists on C<my> declarations is still
 evolving.  The current semantics and interface are subject to change.
@@ -579,7 +597,7 @@ to the lexical $x variable because both the C<my> and the C<sub>
 occurred at the same scope, presumably file scope.
 
     my $x = 10;
-    sub bumpx { $x++ } 
+    sub bumpx { $x++ }
 
 An C<eval()>, however, can see lexical variables of the scope it is
 being evaluated in, so long as the names aren't hidden by declarations within
@@ -591,22 +609,22 @@ to initialize your variables.  (If no initializer is given for a
 particular variable, it is created with the undefined value.)  Commonly
 this is used to name input parameters to a subroutine.  Examples:
 
-    $arg = "fred";       # "global" variable
+    $arg = "fred";          # "global" variable
     $n = cube_root(27);
     print "$arg thinks the root is $n\n";
- fred thinks the root is 3
   # outputs: fred thinks the root is 3
 
     sub cube_root {
-       my $arg = shift;  # name doesn't matter
-       $arg **= 1/3;
-       return $arg;
+        my $arg = shift;  # name doesn't matter
+        $arg **= 1/3;
+        return $arg;
     }
 
 The C<my> is simply a modifier on something you might assign to.  So when
 you do assign to variables in its argument list, C<my> doesn't
 change whether those variables are viewed as a scalar or an array.  So
 
-    my ($foo) = <STDIN>;               # WRONG?
+    my ($foo) = <STDIN>;                # WRONG?
     my @FOO = <STDIN>;
 
 both supply a list context to the right-hand side, while
@@ -615,7 +633,7 @@ both supply a list context to the right-hand side, while
 
 supplies a scalar context.  But the following declares only one variable:
 
-    my $foo, $bar = 1;                 # WRONG
+    my $foo, $bar = 1;                  # WRONG
 
 That has the same effect as
 
@@ -653,12 +671,12 @@ it.  Similarly, in the conditional
     } elsif ($answer =~ /^no$/i) {
         user_disagrees();
     } else {
-       chomp $answer;
+        chomp $answer;
         die "'$answer' is neither 'yes' nor 'no'";
     }
 
 the scope of $answer extends from its declaration through the rest
-of that conditional, including any C<elsif> and C<else> clauses, 
+of that conditional, including any C<elsif> and C<else> clauses,
 but not beyond it.  See L<perlsyn/"Simple Statements"> for information
 on the scope of variables in statements with modifiers.
 
@@ -701,7 +719,7 @@ Variables declared with C<my> are not part of any package and are therefore
 never fully qualified with the package name.  In particular, you're not
 allowed to try to make a package variable (or other global) lexical:
 
-    my $pack::var;     # ERROR!  Illegal syntax
+    my $pack::var;      # ERROR!  Illegal syntax
 
 In fact, a dynamic variable (also known as package or global variables)
 are still accessible using the fully qualified C<::> notation even while a
@@ -739,7 +757,8 @@ L<perlref/"Function Templates"> for something of a work-around to
 this.
 
 =head2 Persistent Private Variables
-X<state> X<state variable> X<static> X<variable, persistent> X<variable, static> X<closure>
+X<state> X<state variable> X<static> X<variable, persistent>
+X<variable, static> X<closure>
 
 There are two ways to build persistent private variables in Perl 5.10.
 First, you can simply use the C<state> feature.  Or, you can use closures,
@@ -772,7 +791,7 @@ And this example uses anonymous subroutines to create separate counters:
 
     use feature 'state';
     sub create_counter {
-       return sub { state $x; return ++$x }
+        return sub { state $x; return ++$x }
     }
 
 Also, since C<$x> is lexical, it can't be reached or modified by any Perl
@@ -789,7 +808,7 @@ of the assignment involves any parentheses is currently undefined.
 Just because a lexical variable is lexically (also called statically)
 scoped to its enclosing block, C<eval>, or C<do> FILE, this doesn't mean that
 within a function it works like a C static.  It normally works more
-like a C auto, but with implicit garbage collection.  
+like a C auto, but with implicit garbage collection.
 
 Unlike local variables in C or C++, Perl's lexical variables don't
 necessarily get recycled just because their scope has exited.
@@ -808,10 +827,10 @@ C's static variables, just enclose the whole function in an extra block,
 and put the static variable outside the function but in the block.
 
     {
-       my $secret_val = 0;
-       sub gimme_another {
-           return ++$secret_val;
-       }
+        my $secret_val = 0;
+        sub gimme_another {
+            return ++$secret_val;
+        }
     }
     # $secret_val now becomes unreachable by the outside
     # world, but retains its value between calls to gimme_another
@@ -825,10 +844,10 @@ code block around it to make sure it gets executed before your program
 starts to run:
 
     BEGIN {
-       my $secret_val = 0;
-       sub gimme_another {
-           return ++$secret_val;
-       }
+        my $secret_val = 0;
+        sub gimme_another {
+            return ++$secret_val;
+        }
     }
 
 See L<perlmod/"BEGIN, UNITCHECK, CHECK, INIT and END"> about the
@@ -855,19 +874,19 @@ Synopsis:
 
     # localization of values
 
-    local $foo;                       # make $foo dynamically local
-    local (@wid, %get);               # make list of variables local
+    local $foo;                # make $foo dynamically local
+    local (@wid, %get);        # make list of variables local
     local $foo = "flurp";      # make $foo dynamic, and init it
-    local @oof = @bar;        # make @oof dynamic, and init it
+    local @oof = @bar;        # make @oof dynamic, and init it
 
     local $hash{key} = "val";  # sets a local value for this hash entry
     delete local $hash{key};   # delete this entry for the current block
     local ($cond ? $v1 : $v2); # several types of lvalues support
-                              # localization
+                               # localization
 
     # localization of symbols
 
-    local *FH;                # localize $FH, @FH, %FH, &FH  ...
+    local *FH;                 # localize $FH, @FH, %FH, &FH  ...
     local *merlyn = *randal;   # now $merlyn is really $randal, plus
                                #     @merlyn is really @randal, etc
     local *merlyn = 'randal';  # SAME THING: promote 'randal' to *randal
@@ -903,8 +922,8 @@ variables outside the loop.
 X<local, context>
 
 A C<local> is simply a modifier on an lvalue expression.  When you assign to
-a C<local>ized variable, the C<local> doesn't change whether its list is viewed
-as a scalar or an array.  So
+a C<local>ized variable, the C<local> doesn't change whether its list is
+viewed as a scalar or an array.  So
 
     local($foo) = <STDIN>;
     local @FOO = <STDIN>;
@@ -928,13 +947,13 @@ This feature allows code like this to work :
     { local $/ = undef; $slurp = <FILE>; }
 
 Note, however, that this restricts localization of some values ; for
-example, the following statement dies, as of perl 5.10.0, with an error
+example, the following statement dies, as of Perl 5.10.0, with an error
 I<Modification of a read-only value attempted>, because the $1 variable is
 magical and read-only :
 
     local $1 = 2;
 
-One exception is the default scalar variable: starting with perl 5.14
+One exception is the default scalar variable: starting with Perl 5.14
 C<local($_)> will always strip all magic from $_, to make it possible
 to safely reuse $_ in a subroutine.
 
@@ -964,7 +983,8 @@ will not have any effect on the internal value of the input record
 separator.
 
 =head3 Localization of elements of composite types
-X<local, composite type element> X<local, array element> X<local, hash element>
+X<local, composite type element> X<local, array element>
+X<local, hash element>
 
 It's also worth taking a moment to explain what happens when you
 C<local>ize a member of a composite type (i.e. an array or hash element).
@@ -980,20 +1000,20 @@ skipped elements with C<undef>.  For instance, if you say
     %hash = ( 'This' => 'is', 'a' => 'test' );
     @ary  = ( 0..5 );
     {
-         local($ary[5]) = 6;
-         local($hash{'a'}) = 'drill';
-         while (my $e = pop(@ary)) {
-             print "$e . . .\n";
-             last unless $e > 3;
-         }
-         if (@ary) {
-             $hash{'only a'} = 'test';
-             delete $hash{'a'};
-         }
+        local($ary[5]) = 6;
+        local($hash{'a'}) = 'drill';
+        while (my $e = pop(@ary)) {
+            print "$e . . .\n";
+            last unless $e > 3;
+        }
+        if (@ary) {
+            $hash{'only a'} = 'test';
+            delete $hash{'a'};
+        }
     }
     print join(' ', map { "$_ $hash{$_}" } sort keys %hash),".\n";
     print "The array has ",scalar(@ary)," elements: ",
-          join(', ', map { defined $_ ? $_ : 'undef' } @ary),"\n";
+        join(', ', map { defined $_ ? $_ : 'undef' } @ary),"\n";
 
 Perl will print
 
@@ -1009,7 +1029,8 @@ on array elements specified using negative indexes is particularly
 surprising, and is very likely to change.
 
 =head3 Localized deletion of elements of composite types
-X<delete> X<local, composite type element> X<local, array element> X<local, hash element>
+X<delete> X<local, composite type element> X<local, array element>
+X<local, hash element>
 
 You can use the C<delete local $array[$idx]> and C<delete local $hash{key}>
 constructs to delete a composite type entry for the current block and restore
@@ -1037,23 +1058,23 @@ scoped to the C<do> block.  Slices are
 also accepted.
 
     my %hash = (
-     a => [ 7, 8, 9 ],
-     b => 1,
+        a => [ 7, 8, 9 ],
+        b => 1,
     )
 
     {
-     my $a = delete local $hash{a};
-     # $a is [ 7, 8, 9 ]
-     # %hash is (b => 1)
+        my $x = delete local $hash{a};
+        # $x is [ 7, 8, 9 ]
+        # %hash is (b => 1)
 
-     {
-      my @nums = delete local @$a[0, 2]
-      # @nums is (7, 9)
-      # $a is [ undef, 8 ]
+        {
+            my @nums = delete local @$x[0, 2]
+            # @nums is (7, 9)
+            # $x is [ undef, 8 ]
 
-      $a[0] = 999; # will be erased when the scope ends
-     }
-     # $a is back to [ 7, 8, 9 ]
+            $x[0] = 999; # will be erased when the scope ends
+        }
+        # $x is back to [ 7, 8, 9 ]
 
     }
     # %hash is back to its original state
@@ -1068,10 +1089,10 @@ To do this, you have to declare the subroutine to return an lvalue.
 
     my $val;
     sub canmod : lvalue {
-       $val;  # or:  return $val;
+        $val;  # or:  return $val;
     }
     sub nomod {
-       $val;
+        $val;
     }
 
     canmod() = 5;   # assigns to $val
@@ -1171,11 +1192,11 @@ So, in general, "state" subroutines are faster.  But "my" subs are
 necessary if you want to create closures:
 
     sub whatever {
-       my $x = shift;
-       my sub inner {
-           ... do something with $x ...
-       }
-       inner();
+        my $x = shift;
+        my sub inner {
+            ... do something with $x ...
+        }
+        inner();
     }
 
 In this example, a new C<$x> is created when C<whatever> is called, and
@@ -1193,12 +1214,12 @@ inside an inner scope:
     sub foo { ... }
 
     sub bar {
-       my sub foo { ... }
-       {
-           # need to use the outer foo here
-           our sub foo;
-           foo();
-       }
+        my sub foo { ... }
+        {
+            # need to use the outer foo here
+            our sub foo;
+            foo();
+        }
     }
 
 and to make a subroutine visible to other packages in the same scope:
@@ -1208,9 +1229,9 @@ and to make a subroutine visible to other packages in the same scope:
     our sub do_something { ... }
 
     sub do_something_with_caller {
-       package DB;
-       () = caller 1;          # sets @DB::args
-       do_something(@args);    # uses MySneakyModule::do_something
+        package DB;
+        () = caller 1;          # sets @DB::args
+        do_something(@args);    # uses MySneakyModule::do_something
     }
 
 =head2 Passing Symbol Table Entries (typeglobs)
@@ -1223,7 +1244,7 @@ mechanism is generally easier to work with.  See below.
 
 Sometimes you don't want to pass the value of an array to a subroutine
 but rather the name of it, so that the subroutine can modify the global
-copy of it rather than working with a local copy.  In perl you can
+copy of it rather than working with a local copy.  In Perl you can
 refer to all objects of a particular name by prefixing the name
 with a star: C<*foo>.  This is often known as a "typeglob", because the
 star on the front can be thought of as a wildcard match for all the
@@ -1235,10 +1256,10 @@ subroutine.  When assigned to, it causes the name mentioned to refer to
 whatever C<*> value was assigned to it.  Example:
 
     sub doubleary {
-       local(*someary) = @_;
-       foreach $elem (@someary) {
-           $elem *= 2;
-       }
+        local(*someary) = @_;
+        foreach $elem (@someary) {
+            $elem *= 2;
+        }
     }
     doubleary(*foo);
     doubleary(*bar);
@@ -1269,17 +1290,17 @@ I<must> use C<local> instead of C<my>.
 
 You need to give a global variable a temporary value, especially $_.
 
-The global variables, like C<@ARGV> or the punctuation variables, must be 
+The global variables, like C<@ARGV> or the punctuation variables, must be
 C<local>ized with C<local()>.  This block reads in F</etc/motd>, and splits
 it up into chunks separated by lines of equal signs, which are placed
 in C<@Fields>.
 
     {
-       local @ARGV = ("/etc/motd");
+        local @ARGV = ("/etc/motd");
         local $/ = undef;
-        local $_ = <>; 
-       @Fields = split /^\s*=+\s*$/;
-    } 
+        local $_ = <>;
+        @Fields = split /^\s*=+\s*$/;
+    }
 
 It particular, it's important to C<local>ize $_ in any routine that assigns
 to it.  Look out for implicit assignments in C<while> conditionals.
@@ -1309,9 +1330,9 @@ a local alias.
     {
         local *grow = \&shrink; # only until this block exits
         grow();                # really calls shrink()
-       move();                # if move() grow()s, it shrink()s too
+        move();                # if move() grow()s, it shrink()s too
     }
-    grow();                   # get the real grow() again
+    grow();                    # get the real grow() again
 
 See L<perlref/"Function Templates"> for more about manipulating
 functions by name in this way.
@@ -1324,9 +1345,9 @@ You can C<local>ize just one element of an aggregate.  Usually this
 is done on dynamics:
 
     {
-       local $SIG{INT} = 'IGNORE';
-       funct();                            # uninterruptible
-    } 
+        local $SIG{INT} = 'IGNORE';
+        funct();                            # uninterruptible
+    }
     # interruptibility automatically restored here
 
 But it also works on lexically declared aggregates.
@@ -1346,15 +1367,15 @@ Here are a few simple examples.  First, let's pass in several arrays
 to a function and have it C<pop> all of then, returning a new list
 of all their former last elements:
 
-    @tailings = popmany ( \@a, \@b, \@c, \@d );
+    @tailings = popmany ( \@w, \@x, \@y, \@z );
 
     sub popmany {
-       my $aref;
-       my @retlist;
-       foreach $aref ( @_ ) {
-           push @retlist, pop @$aref;
-       }
-       return @retlist;
+        my $aref;
+        my @retlist;
+        foreach $aref ( @_ ) {
+            push @retlist, pop @$aref;
+        }
+        return @retlist;
     }
 
 Here's how you might write a function that returns a
@@ -1362,13 +1383,13 @@ list of keys occurring in all the hashes passed to it:
 
     @common = inter( \%foo, \%bar, \%joe );
     sub inter {
-       my ($k, $href, %seen); # locals
-       foreach $href (@_) {
-           while ( $k = each %$href ) {
-               $seen{$k}++;
-           }
-       }
-       return grep { $seen{$_} == @_ } keys %seen;
+        my ($k, $href, %seen); # locals
+        foreach $href (@_) {
+            while ( $k = each %$href ) {
+                $seen{$k}++;
+            }
+        }
+        return grep { $seen{$_} == @_ } keys %seen;
     }
 
 So far, we're using just the normal list return mechanism.
@@ -1379,12 +1400,12 @@ a little expensive.
 
 Where people get into trouble is here:
 
-    (@a, @b) = func(@c, @d);
+    (@w, @x) = func(@y, @z);
 or
-    (%a, %b) = func(%c, %d);
+    (%w, %x) = func(%y, %z);
 
-That syntax simply won't work.  It sets just C<@a> or C<%a> and
-clears the C<@b> or C<%b>.  Plus the function didn't get passed
+That syntax simply won't work.  It sets just C<@w> or C<%w> and
+clears the C<@x> or C<%x>.  Plus the function didn't get passed
 into two separate arrays or hashes: it got one long list in C<@_>,
 as always.
 
@@ -1393,28 +1414,28 @@ cleaner code, although not so nice to look at.  Here's a function that
 takes two array references as arguments, returning the two array elements
 in order of how many elements they have in them:
 
-    ($aref, $bref) = func(\@c, \@d);
-    print "@$aref has more than @$bref\n";
+    ($wref, $xref) = func(\@y, \@z);
+    print "@$wref has more than @$xref\n";
     sub func {
-       my ($cref, $dref) = @_;
-       if (@$cref > @$dref) {
-           return ($cref, $dref);
-       } else {
-           return ($dref, $cref);
-       }
+        my ($yref, $zref) = @_;
+        if (@$yref > @$zref) {
+            return ($yref, $zref);
+        } else {
+            return ($zref, $yref);
+        }
     }
 
 It turns out that you can actually do this also:
 
-    (*a, *b) = func(\@c, \@d);
-    print "@a has more than @b\n";
+    (*w, *x) = func(\@y, \@z);
+    print "@w has more than @x\n";
     sub func {
-       local (*c, *d) = @_;
-       if (@c > @d) {
-           return (\@c, \@d);
-       } else {
-           return (\@d, \@c);
-       }
+        local (*y, *z) = @_;
+        if (@y > @z) {
+            return (\@y, \@z);
+        } else {
+            return (\@z, \@y);
+        }
     }
 
 Here we're using the typeglobs to do symbol table aliasing.  It's
@@ -1428,23 +1449,23 @@ For example:
 
     splutter(\*STDOUT);
     sub splutter {
-       my $fh = shift;
-       print $fh "her um well a hmmm\n";
+        my $fh = shift;
+        print $fh "her um well a hmmm\n";
     }
 
     $rec = get_rec(\*STDIN);
     sub get_rec {
-       my $fh = shift;
-       return scalar <$fh>;
+        my $fh = shift;
+        return scalar <$fh>;
     }
 
 If you're planning on generating new filehandles, you could do this.
 Notice to pass back just the bare *FH, not its reference.
 
     sub openit {
-       my $path = shift;
-       local *FH;
-       return open (FH, $path) ? *FH : undef;
+        my $path = shift;
+        local *FH;
+        return open (FH, $path) ? *FH : undef;
     }
 
 =head2 Prototypes
@@ -1485,22 +1506,22 @@ subroutines that work like built-in functions, here are prototypes
 for some other functions that parse almost exactly like the
 corresponding built-in.
 
-   Declared as            Called as
-
-   sub mylink ($$)        mylink $old, $new
-   sub myvec ($$$)        myvec $var, $offset, 1
-   sub myindex ($$;$)     myindex &getstring, "substr"
-   sub mysyswrite ($$$;$)  mysyswrite $buf, 0, length($buf) - $off, $off
-   sub myreverse (@)      myreverse $a, $b, $c
-   sub myjoin ($@)        myjoin ":", $a, $b, $c
-   sub mypop (\@)         mypop @array
-   sub mysplice (\@$$@)           mysplice @array, 0, 2, @pushme
-   sub mykeys (\[%@])     mykeys $hashref->%*
-   sub myopen (*;$)       myopen HANDLE, $name
-   sub mypipe (**)        mypipe READHANDLE, WRITEHANDLE
-   sub mygrep (&@)        mygrep { /foo/ } $a, $b, $c
-   sub myrand (;$)        myrand 42
-   sub mytime ()          mytime
+    Declared as             Called as
+
+    sub mylink ($$)         mylink $old, $new
+    sub myvec ($$$)         myvec $var, $offset, 1
+    sub myindex ($$;$)      myindex &getstring, "substr"
+    sub mysyswrite ($$$;$)  mysyswrite $buf, 0, length($buf) - $off, $off
+    sub myreverse (@)       myreverse $x, $y, $z
+    sub myjoin ($@)         myjoin ":", $x, $y, $z
+    sub mypop (\@)          mypop @array
+    sub mysplice (\@$$@)    mysplice @array, 0, 2, @pushme
+    sub mykeys (\[%@])      mykeys $hashref->%*
+    sub myopen (*;$)        myopen HANDLE, $name
+    sub mypipe (**)         mypipe READHANDLE, WRITEHANDLE
+    sub mygrep (&@)         mygrep { /foo/ } $x, $y, $z
+    sub myrand (;$)         myrand 42
+    sub mytime ()           mytime
 
 Any backslashed prototype character represents an actual argument
 that must start with that character (optionally preceded by C<my>,
@@ -1542,8 +1563,8 @@ follows:
     use Symbol 'qualify_to_ref';
 
     sub foo (*) {
-       my $fh = qualify_to_ref(shift, caller);
-       ...
+        my $fh = qualify_to_ref(shift, caller);
+        ...
     }
 
 The C<+> prototype is a special alternative to C<$> that will act like
@@ -1580,26 +1601,26 @@ without a prototype.  If you want to force a unary function to have the
 same precedence as a list operator, add C<;> to the end of the prototype:
 
     sub mygetprotobynumber($;);
-    mygetprotobynumber $a > $b; # parsed as mygetprotobynumber($a > $b)
+    mygetprotobynumber $x > $y; # parsed as mygetprotobynumber($x > $y)
 
 The interesting thing about C<&> is that you can generate new syntax with it,
 provided it's in the initial position:
 X<&>
 
     sub try (&@) {
-       my($try,$catch) = @_;
-       eval { &$try };
-       if ($@) {
-           local $_ = $@;
-           &$catch;
-       }
+        my($try,$catch) = @_;
+        eval { &$try };
+        if ($@) {
+            local $_ = $@;
+            &$catch;
+        }
     }
     sub catch (&) { $_[0] }
 
     try {
-       die "phooey";
+        die "phooey";
     } catch {
-       /phooey/ and print "unphooey\n";
+        /phooey/ and print "unphooey\n";
     };
 
 That prints C<"unphooey">.  (Yes, there are still unresolved
@@ -1612,12 +1633,12 @@ And here's a reimplementation of the Perl C<grep> operator:
 X<grep>
 
     sub mygrep (&@) {
-       my $code = shift;
-       my @result;
-       foreach $_ (@_) {
-           push(@result, $_) if &$code;
-       }
-       @result;
+        my $code = shift;
+        my @result;
+        foreach $_ (@_) {
+            push(@result, $_) if &$code;
+        }
+        @result;
     }
 
 Some folks would prefer full alphanumeric prototypes.  Alphanumerics have
@@ -1642,8 +1663,8 @@ silent impositions of differing list versus scalar contexts.  For example,
 if you decide that a function should take just one parameter, like this:
 
     sub func ($) {
-       my $n = shift;
-       print "you gave me $n\n";
+        my $n = shift;
+        print "you gave me $n\n";
     }
 
 and someone has been calling it with an array or expression
@@ -1664,10 +1685,10 @@ until after the BLOCK is completely defined.  This means that a recursive
 function with a prototype has to be predeclared for the prototype to take
 effect, like so:
 
-       sub foo($$);
-       sub foo($$) {
-               foo 1, 2;
-       }
+    sub foo($$);
+    sub foo($$) {
+        foo 1, 2;
+    }
 
 This is all very powerful, of course, and should be used only in moderation
 to make the world a better place.
@@ -1684,17 +1705,17 @@ L<constant> for an easy way to declare most constants.)
 
 The following functions would all be inlined:
 
-    sub pi ()          { 3.14159 }             # Not exact, but close.
-    sub PI ()          { 4 * atan2 1, 1 }      # As good as it gets,
-                                               # and it's inlined, too!
-    sub ST_DEV ()      { 0 }
-    sub ST_INO ()      { 1 }
+    sub pi ()           { 3.14159 }             # Not exact, but close.
+    sub PI ()           { 4 * atan2 1, 1 }      # As good as it gets,
+                                                # and it's inlined, too!
+    sub ST_DEV ()       { 0 }
+    sub ST_INO ()       { 1 }
 
-    sub FLAG_FOO ()    { 1 << 8 }
-    sub FLAG_BAR ()    { 1 << 9 }
-    sub FLAG_MASK ()   { FLAG_FOO | FLAG_BAR }
+    sub FLAG_FOO ()     { 1 << 8 }
+    sub FLAG_BAR ()     { 1 << 9 }
+    sub FLAG_MASK ()    { FLAG_FOO | FLAG_BAR }
 
-    sub OPT_BAZ ()     { not (0x1B58 & FLAG_MASK) }
+    sub OPT_BAZ ()      { not (0x1B58 & FLAG_MASK) }
 
     sub N () { int(OPT_BAZ) / 3 }
 
@@ -1707,12 +1728,12 @@ inner scopes.)  You can countermand inlining by using an explicit
 C<return>:
 
     sub baz_val () {
-       if (OPT_BAZ) {
-           return 23;
-       }
-       else {
-           return 42;
-       }
+        if (OPT_BAZ) {
+            return 23;
+        }
+        else {
+            return 42;
+        }
     }
     sub bonk_val () { return 12345 }
 
@@ -1795,19 +1816,19 @@ L<B::Deparse>.  Consider this example of two subroutines returning
 C<1>, one with a C<()> prototype causing it to be inlined, and one
 without (with deparse output truncated for clarity):
 
$ perl -MO=Deparse -le 'sub ONE { 1 } if (ONE) { print ONE if ONE }'
- sub ONE {
-     1;
- }
- if (ONE ) {
-     print ONE() if ONE ;
- }
   $ perl -MO=Deparse -e 'sub ONE { 1 } if (ONE) { print ONE if ONE }'
   sub ONE {
+        1;
   }
   if (ONE ) {
+        print ONE() if ONE ;
   }
 
$ perl -MO=Deparse -le 'sub ONE () { 1 } if (ONE) { print ONE if ONE }'
- sub ONE () { 1 }
- do {
-     print 1
- };
   $ perl -MO=Deparse -e 'sub ONE () { 1 } if (ONE) { print ONE if ONE }'
   sub ONE () { 1 }
   do {
+        print 1
   };
 
 If you redefine a subroutine that was eligible for inlining, you'll
 get a warning by default.  You can use this warning to tell whether or
@@ -1852,8 +1873,8 @@ built-in name with the special package qualifier C<CORE::>.  For example,
 saying C<CORE::open()> always refers to the built-in C<open()>, even
 if the current package has imported some other subroutine called
 C<&open()> from elsewhere.  Even though it looks like a regular
-function call, it isn't: the CORE:: prefix in that case is part of Perl's
-syntax, and works for any keyword, regardless of what is in the CORE
+function call, it isn't: the C<CORE::> prefix in that case is part of Perl's
+syntax, and works for any keyword, regardless of what is in the C<CORE>
 package.  Taking a reference to it, that is, C<\&CORE::open>, only works
 for some keywords.  See L<CORE>.
 
@@ -1886,30 +1907,30 @@ that understands regular expressions.
     @EXPORT_OK = 'glob';
 
     sub import {
-       my $pkg = shift;
-       return unless @_;
-       my $sym = shift;
-       my $where = ($sym =~ s/^GLOBAL_// ? 'CORE::GLOBAL' : caller(0));
-       $pkg->export($where, $sym, @_);
+        my $pkg = shift;
+        return unless @_;
+        my $sym = shift;
+        my $where = ($sym =~ s/^GLOBAL_// ? 'CORE::GLOBAL' : caller(0));
+        $pkg->export($where, $sym, @_);
     }
 
     sub glob {
-       my $pat = shift;
-       my @got;
-       if (opendir my $d, '.') { 
-           @got = grep /$pat/, readdir $d; 
-           closedir $d;   
-       }
-       return @got;
+        my $pat = shift;
+        my @got;
+        if (opendir my $d, '.') {
+            @got = grep /$pat/, readdir $d;
+            closedir $d;
+        }
+        return @got;
     }
     1;
 
 And here's how it could be (ab)used:
 
-    #use REGlob 'GLOBAL_glob';     # override glob() in ALL namespaces
+    #use REGlob 'GLOBAL_glob';      # override glob() in ALL namespaces
     package Foo;
-    use REGlob 'glob';             # override glob() in Foo:: only
-    print for <^[a-z_]+\.pm\$>;            # show all pragmatic modules
+    use REGlob 'glob';              # override glob() in Foo:: only
+    print for <^[a-z_]+\.pm\$>;     # show all pragmatic modules
 
 The initial comment shows a contrived, even dangerous example.
 By overriding C<glob> globally, you would be forcing the new (and
@@ -1919,9 +1940,9 @@ those namespaces.  Naturally, this should be done with extreme caution--if
 it must be done at all.
 
 The C<REGlob> example above does not implement all the support needed to
-cleanly override perl's C<glob> operator.  The built-in C<glob> has
+cleanly override Perl's C<glob> operator.  The built-in C<glob> has
 different behaviors depending on whether it appears in a scalar or list
-context, but our C<REGlob> doesn't.  Indeed, many perl built-in have such
+context, but our C<REGlob> doesn't.  Indeed, many Perl built-ins have such
 context sensitive behaviors, and these must be adequately supported by
 a properly written override.  For a fully functional example of overriding
 C<glob>, study the implementation of C<File::DosGlob> in the standard
@@ -2036,11 +2057,11 @@ Examples of valid syntax (even though the attributes are unknown):
 
 Examples of invalid syntax:
 
-    sub fnord : switch(10,foo(); # ()-string not balanced
-    sub snoid : Ugly('(');       # ()-string not balanced
-    sub xyzzy : 5x5;             # "5x5" not a valid identifier
-    sub plugh : Y2::north;       # "Y2::north" not a simple identifier
-    sub snurt : foo + bar;       # "+" not a colon or space
+    sub fnord : switch(10,foo();    # ()-string not balanced
+    sub snoid : Ugly('(');          # ()-string not balanced
+    sub xyzzy : 5x5;                # "5x5" not a valid identifier
+    sub plugh : Y2::north;          # "Y2::north" not a simple identifier
+    sub snurt : foo + bar;          # "+" not a colon or space
 
 The attribute list is passed as a list of constant strings to the code
 which associates them with the subroutine.  In particular, the second example
@@ -2055,8 +2076,11 @@ see L<attributes> and L<Attribute::Handlers>.
 =head1 SEE ALSO
 
 See L<perlref/"Function Templates"> for more about references and closures.
-See L<perlxs> if you'd like to learn about calling C subroutines from Perl.  
-See L<perlembed> if you'd like to learn about calling Perl subroutines from C.  
+See L<perlxs> if you'd like to learn about calling C subroutines from Perl.
+See L<perlembed> if you'd like to learn about calling Perl subroutines from C.
 See L<perlmod> to learn about bundling up your functions in separate files.
 See L<perlmodlib> to learn what library modules come standard on your system.
 See L<perlootut> to learn how to make object method calls.
+
+=for vi
+# ex: set sts=0 sw=4 et:
index 8e6909b..5245c80 100644 (file)
@@ -1155,7 +1155,8 @@ shell:
 =head2 Experimental Details on given and when
 
 As previously mentioned, the "switch" feature is considered highly
-experimental; it is subject to change with little notice.  In particular,
+experimental (it is also scheduled to be removed in perl 5.42.0);
+it is subject to change with little notice.  In particular,
 C<when> has tricky behaviours that are expected to change to become less
 tricky in the future.  Do not rely upon its current (mis)implementation.
 Before Perl 5.18, C<given> also had tricky behaviours that you should still
index c6f0fba..4ddb4c4 100644 (file)
@@ -183,7 +183,7 @@ a whole character instead of only a single byte.
 
 The C<tr///> operator translates whole characters.  (Note that the
 C<tr///CU> functionality has been removed.  For similar functionality to
-that, see C<pack('U0', ...)> and C<pack('C0', ...)>).
+that, see S<C<pack('U0', ...)>> and S<C<pack('C0', ...)>>).
 
 =item *
 
@@ -1177,13 +1177,15 @@ C<\p{}> or C<\P{}> construct.
     if ($txt =~ /\p{IsForeign}+/) { ... }
 
 
-Note that the effect is compile-time and immutable once defined.
-However, the subroutines are passed a single parameter, which is 0 if
+The subroutines are passed a single parameter, which is 0 if
 case-sensitive matching is in effect and non-zero if caseless matching
 is in effect.  The subroutine may return different values depending on
-the value of the flag, and one set of values will immutably be in effect
-for all case-sensitive matches, and the other set for all case-insensitive
-matches.
+the value of the flag.  But the subroutine is never called more than
+once for each flag value (zero vs non-zero).  The return value is saved
+and used instead of calling the sub ever again.  If the sub is defined
+at the time the pattern is compiled, it will be called then; if not, it
+will be called the first time its value (for that flag) is needed during
+execution.
 
 Note that if the regular expression is tainted, then Perl will die rather
 than calling the subroutine when the name of the subroutine is
@@ -1679,7 +1681,7 @@ If you're writing code, such as an editor, that is supposed to be able
 to handle any Unicode text data, then you shouldn't be using these code
 points yourself, and instead allow them in the input.  If you need
 sentinels, they should instead be something that isn't legal Unicode.
-For UTF-8 data, you can use the bytes 0xC1 and 0xC2 as sentinels, as
+For UTF-8 data, you can use the bytes 0xC0 and 0xC1 as sentinels, as
 they never appear in well-formed UTF-8.  (There are equivalents for
 UTF-EBCDIC).  You can also store your Unicode code points in integer
 variables and use negative values as sentinels.
index c5b60e9..db6f2c4 100644 (file)
@@ -121,9 +121,9 @@ another name.
 
 Back before Perl had the XS system for connecting with C libraries,
 programmers used to get library constants by reading through the C
-header files. You may still see C<require 'syscall.ph'> or similar
+header files. You may still see S<C<require 'syscall.ph'>> or similar
 around - the F<.ph> file should be created by running F<h2ph> on the
-corresponding F<.h> file. See the F<h2ph> documentation for more on how
+corresponding F<.h> file. See the L<h2ph> documentation for more on how
 to convert a whole bunch of header files at once.
 
 =item L<h2xs>
index 8e6a0f2..54d2be3 100644 (file)
@@ -542,6 +542,23 @@ by default inserted into C<%INC> in place of a filename.  Note, however,
 that the hook may have set the C<%INC> entry by itself to provide some more
 specific info.
 
+=item $INC
+X<$INC>
+
+As of 5.37.7 when an C<@INC> hook is executed the index of the C<@INC>
+array that holds the hook will be localized into the C<$INC> variable.
+When the hook returns the integer successor of its value will be used to
+determine the next index in C<@INC> that will be checked, thus if it is
+set to -1 (or C<undef>) the traversal over the C<@INC> array will be
+restarted from its beginning.
+
+Normally traversal through the C<@INC> array is from beginning to end
+(C<0 .. $#INC>), and if the C<@INC> array is modified by the hook the
+iterator may be left in a state where newly added entries are skipped.
+Changing this value allows an C<@INC> hook to rewrite the C<@INC> array
+and tell Perl where to continue afterwards. See L<perlfunc/require> for
+details on C<@INC> hooks.
+
 =item $INPLACE_EDIT
 
 =item $^I
@@ -577,13 +594,61 @@ Then
     $^M = 'a' x (1 << 16);
 
 would allocate a 64K buffer for use in an emergency.  See the
-F<INSTALL> file in the Perl distribution for information on how to
+L<INSTALL> file in the Perl distribution for information on how to
 add custom C compilation flags when compiling perl.  To discourage casual
 use of this advanced feature, there is no L<English|English> long name for
 this variable.
 
 This variable was added in Perl 5.004.
 
+=item ${^MAX_NESTED_EVAL_BEGIN_BLOCKS}
+
+This variable determines the maximum number C<eval EXPR>/C<BEGIN> or
+C<require>/C<BEGIN> block nesting that is allowed. This means it also
+controls the maximum nesting of C<use> statements as well.
+
+The default of 1000 should be sufficiently large for normal working
+purposes, and if you must raise it then you should be conservative
+with your choice or you may encounter segfaults from exhaustion of
+the C stack. It seems unlikely that real code has a use depth above
+1000, but we have left this configurable just in case.
+
+When set to C<0> then C<BEGIN> blocks inside of C<eval EXPR> or
+C<require EXPR> are forbidden entirely and will trigger an exception
+which will terminate the compilation and in the case of C<require>
+will throw an exception, or in the case of C<eval> return the error in
+C<$@> as usual.
+
+Consider the code
+
+ perl -le'sub f { eval "BEGIN { f() }"; } f()'
+
+each invocation of C<f()> will consume considerable C stack, and this
+variable is used to cause code like this to die instead of exhausting
+the C stack and triggering a segfault. Needless to say code like this is
+unusual, it is unlikely you will actually need to raise the setting.
+However it may be useful to set it to 0 for a limited time period to
+prevent BEGIN{} blocks from being executed during an C<eval EXPR>.
+
+Note that setting this to 1 would NOT affect code like this:
+
+    BEGIN { $n += 1; BEGIN { $n += 2; BEGIN { $n += 4 } } }
+
+The reason is that BEGIN blocks are executed immediately after they are
+completed, thus the innermost will execute before the ones which contain
+it have even finished compiling, and the depth will not go above 1. In
+fact the above code is equivalent to
+
+    BEGIN { $n+=4 }
+    BEGIN { $n+=2 }
+    BEGIN { $n+=1 }
+
+which makes it obvious why a ${^MAX_EVAL_BEGIN_DEPTH} of 1 would not
+block this code.
+
+Only C<BEGIN>'s executed inside of an C<eval> or C<require> (possibly via
+C<use>) are affected.
+
 =item $OSNAME
 
 =item $^O
@@ -682,7 +747,7 @@ The C<$SIG{__DIE__}> hook is called even inside an C<eval()>. It was
 never intended to happen this way, but an implementation glitch made
 this possible. This used to be deprecated, as it allowed strange action
 at a distance like rewriting a pending exception in C<$@>. Plans to
-rectify this have been scrapped, as users found that rewriting a 
+rectify this have been scrapped, as users found that rewriting a
 pending exception is actually a useful feature, and not a bug.
 
 The C<$SIG{__DIE__}> doesn't support C<'IGNORE'>; it has the same
@@ -714,6 +779,71 @@ and use an C<END{}> or CORE::GLOBAL::die override instead.
 See L<perlfunc/die>, L<perlfunc/warn>, L<perlfunc/eval>, and
 L<warnings> for additional information.
 
+=item %{^HOOK}
+X<%{^HOOK}>
+
+This hash contains coderefs which are called when various perl keywords
+which are hard or impossible to wrap are called. The keys of this hash
+are named after the keyword that is being hooked, followed by two
+underbars and then a phase term; either "before" or "after".
+
+Perl will throw an error if you attempt modify a key which is not
+documented to exist, or if you attempt to store anything other than a
+code reference or undef in the hash.  If you wish to use an object to
+implement a hook you can use currying to embed the object into an
+anonymous code reference.
+
+Currently there is only one keyword which can be hooked, C<require>, but
+it is expected that in future releases there will be additional keywords
+with hook support.
+
+=over 4
+
+=item require__before
+
+The routine indicated by C<${^HOOK}{require__before}> is called by
+C<require> B<before> it checks C<%INC>, looks up C<@INC>, calls INC
+hooks, or compiles any code.  It is called with a single argument, the
+filename for the item being required (package names are converted to
+paths).  It may alter this filename to change what file is loaded.  If
+the hook dies during execution then it will block the require from executing.
+
+In order to make it easy to perform an action with shared state both
+before and after the require keyword was executed the C<require__before>
+hook may return a "post-action" coderef which will in turn be executed when
+the C<require> completes.  This coderef will be executed regardless as to
+whether the require completed succesfully or threw an exception.  It will
+be called with the filename that was required.  You can check %INC to
+determine if the require was successful.  Any other return from the
+C<require__before> hook will be silently ignored.
+
+C<require__before> hooks are called in FIFO order, and if the hook
+returns a code reference those code references will be called in FILO
+order.  In other words if A requires B requires C, then
+C<require__before> will be called first for A, then B and then C, and
+the post-action code reference will executed first for C, then B and
+then finally A.
+
+Well behaved code should ensure that when setting up a
+C<require__before> hook that any prior installed hook will be called,
+and that their return value, if a code reference, will be called as
+well.  See L<perlfunc/require> for an example implementation.
+
+=item require__after
+
+The routine indicated by C<${^HOOK}{require__after}> is called by
+C<require> B<after> the require completes.  It is called with a single
+argument, the filename for the item being required (package names are
+converted to paths).  It is executed when the C<require> completes,
+either via exception or via completion of the require statement, and you
+can check C<%INC> to determine if the require was successful.
+
+The C<require__after> hook is called for each required file in FILO
+order. In other words if A requires B requires C, then C<require__after>
+will be called first for C, then B and then A.
+
+=back
+
 =item $BASETIME
 
 =item $^T
@@ -823,49 +953,77 @@ command or referenced as a file.
 =head2 Variables related to regular expressions
 
 Most of the special variables related to regular expressions are side
-effects.  Perl sets these variables when it has a successful match, so
-you should check the match result before using them.  For instance:
+effects. Perl sets these variables when it has completed a match
+successfully, so you should check the match result before using them.
+For instance:
 
     if( /P(A)TT(ER)N/ ) {
         print "I found $1 and $2\n";
     }
 
-These variables are read-only and dynamically-scoped, unless we note
-otherwise.
+These variables are read-only and behave similarly to a dynamically
+scoped variable, with only a few exceptions which are explicitly
+documented as behaving otherwise.  See the following section for more
+details.
 
-The dynamic nature of the regular expression variables means that
-their value is limited to the block that they are in, as demonstrated
-by this bit of code:
+=head3 Scoping Rules of Regex Variables
 
-    my $outer = 'Wallace and Grommit';
-    my $inner = 'Mutt and Jeff';
+Regular expression variables allow the programmer to access the state of
+the most recent I<successful> regex match in the current dynamic scope.
 
-    my $pattern = qr/(\S+) and (\S+)/;
+The variables themselves are global and unscoped, but the data they
+access is scoped similarly to dynamically scoped variables, in that
+every successful match behaves as though it localizes a global state
+object to the current block or file scope.
+(See L<perlsyn/"Compound Statements"> for more details on dynamic
+scoping and the C<local> keyword.)
 
-    sub show_n { print "\$1 is $1; \$2 is $2\n" }
+A I<successful match> includes any successful match performed by the
+search and replace operator C<s///> as well as those performed by the
+C<m//> operator.
 
-    {
-    OUTER:
-        show_n() if $outer =~ m/$pattern/;
+Consider the following code:
 
-        INNER: {
-            show_n() if $inner =~ m/$pattern/;
-        }
+    my @state;
+    sub matchit {
+        push @state, $1;            # pushes "baz"
+        my $str = shift;
+        $str =~ /(zat)/;            # matches "zat"
+        push @state, $1;            # pushes "zat"
+    }
 
-        show_n();
+    {
+        $str = "foo bar baz blorp zat";
+        $str =~ /(foo)/;            # matches "foo"
+        push @state, $1;            # pushes "foo"
+        {
+            $str =~ /(pizza)/;      # does NOT match
+            push @state, $1;        # pushes "foo"
+            $str =~ /(bar)/;        # matches "bar"
+            push @state, $1;        # pushes "bar"
+            $str =~ /(baz)/;        # matches "baz"
+            matchit($str);          # see above
+            push @state, $1;        # pushes "baz"
+        }
+        $str =~ s/noodles/rice/;    # does NOT match
+        push @state, $1;            # pushes "foo"
+        $str =~ s/(blorp)/zwoop/;   # matches "blorp"
+        push @state, $1;            # pushes "blorp"
     }
+    # the following prints "foo, foo, bar, baz, zat, baz, foo, blorp"
+    print join ",", @state;
 
-The output shows that while in the C<OUTER> block, the values of C<$1>
-and C<$2> are from the match against C<$outer>.  Inside the C<INNER>
-block, the values of C<$1> and C<$2> are from the match against
-C<$inner>, but only until the end of the block (i.e. the dynamic
-scope).  After the C<INNER> block completes, the values of C<$1> and
-C<$2> return to the values for the match against C<$outer> even though
-we have not made another match:
+Notice that each successful match in the exact same scope overrides the
+match context of the previous successful match, but that unsuccessful
+matches do not. Also note that in an inner nested scope the previous
+state from an outer dynamic scope persists until it has been overriden
+by another successful match, but that when the inner nested scope exits
+whatever match context was in effect before the inner successful match
+is restored when the scope concludes.
 
-    $1 is Wallace; $2 is Grommit
-    $1 is Mutt; $2 is Jeff
-    $1 is Wallace; $2 is Grommit
+It is a known issue that C<goto LABEL> may interact poorly with the
+dynamically scoped match context. This may not be fixable, and is
+considered to be one of many good reasons to avoid C<goto LABEL>.
 
 =head3 Performance issues
 
@@ -907,8 +1065,8 @@ difference in something like
     $str =~ /x/g # one char copied a million times, not a million chars
 
 In Perl 5.20.0 a new copy-on-write system was enabled by default, which
-finally fixes all performance issues with these three variables, and makes
-them safe to use anywhere.
+finally fixes most of the performance issues with these three variables, and
+makes them safe to use anywhere.
 
 The C<Devel::NYTProf> and C<Devel::FindAmpersand> modules can help you
 find uses of these problematic match variables in your code.
@@ -919,14 +1077,14 @@ find uses of these problematic match variables in your code.
 X<$1> X<$2> X<$3> X<$I<digits>>
 
 Contains the subpattern from the corresponding set of capturing
-parentheses from the last successful pattern match, not counting patterns
-matched in nested blocks that have been exited already.
+parentheses from the last successful pattern match in the current
+dynamic scope. (See L</Scoping Rules of Regex Variables>.)
 
 Note there is a distinction between a capture buffer which matches
 the empty string a capture buffer which is optional. Eg, C<(x?)> and
 C<(x)?> The latter may be undef, the former not.
 
-These variables are read-only and dynamically-scoped.
+These variables are read-only.
 
 Mnemonic: like \digits.
 
@@ -966,75 +1124,71 @@ This variable was added in 5.25.7
 =item $&
 X<$&> X<$MATCH>
 
-The string matched by the last successful pattern match (not counting
-any matches hidden within a BLOCK or C<eval()> enclosed by the current
-BLOCK).
+The string matched by the last successful pattern match.
+(See L</Scoping Rules of Regex Variables>.)
 
 See L</Performance issues> above for the serious performance implications
 of using this variable (even once) in your code.
 
-This variable is read-only and dynamically-scoped.
+This variable is read-only, and its value is dynamically scoped.
 
 Mnemonic: like C<&> in some editors.
 
 =item ${^MATCH}
 X<${^MATCH}>
 
-This is similar to C<$&> (C<$MATCH>) except that it does not incur the
-performance penalty associated with that variable.
+It is only guaranteed to return a defined value when the pattern was
+compiled or executed with the C</p> modifier.
 
-See L</Performance issues> above.
+This is similar to C<$&> (C<$MATCH>) except that to use it you must
+use the C</p> modifier when executing the pattern, and it does not incur
+and performance penalty associated with that variable.
 
-In Perl v5.18 and earlier, it is only guaranteed
-to return a defined value when the pattern was compiled or executed with
-the C</p> modifier.  In Perl v5.20, the C</p> modifier does nothing, so
-C<${^MATCH}> does the same thing as C<$MATCH>.
+See L</Performance issues> above.
 
 This variable was added in Perl v5.10.0.
 
-This variable is read-only and dynamically-scoped.
+This variable is read-only, and its value is dynamically scoped.
 
 =item $PREMATCH
 
 =item $`
-X<$`> X<$PREMATCH> X<${^PREMATCH}>
+X<$`> X<$PREMATCH>
 
 The string preceding whatever was matched by the last successful
-pattern match, not counting any matches hidden within a BLOCK or C<eval>
-enclosed by the current BLOCK.
+pattern match. (See L</Scoping Rules of Regex Variables>).
 
 See L</Performance issues> above for the serious performance implications
 of using this variable (even once) in your code.
 
-This variable is read-only and dynamically-scoped.
+This variable is read-only, and its value is dynamically scoped.
 
 Mnemonic: C<`> often precedes a quoted string.
 
 =item ${^PREMATCH}
-X<$`> X<${^PREMATCH}>
+X<${^PREMATCH}>
 
-This is similar to C<$`> ($PREMATCH) except that it does not incur the
-performance penalty associated with that variable.
+It is only guaranteed to return a defined value when the pattern was
+executed with the C</p> modifier.
+
+This is similar to C<$`> ($PREMATCH) except that to use it you must
+use the C</p> modifier when executing the pattern, and it does not incur
+and performance penalty associated with that variable.
 
 See L</Performance issues> above.
 
-In Perl v5.18 and earlier, it is only guaranteed
-to return a defined value when the pattern was compiled or executed with
-the C</p> modifier.  In Perl v5.20, the C</p> modifier does nothing, so
-C<${^PREMATCH}> does the same thing as C<$PREMATCH>.
 
 This variable was added in Perl v5.10.0.
 
-This variable is read-only and dynamically-scoped.
+This variable is read-only, and its value is dynamically scoped.
 
 =item $POSTMATCH
 
 =item $'
-X<$'> X<$POSTMATCH> X<${^POSTMATCH}> X<@->
+X<$'> X<$POSTMATCH> X<@->
 
 The string following whatever was matched by the last successful
-pattern match (not counting any matches hidden within a BLOCK or C<eval()>
-enclosed by the current BLOCK).  Example:
+pattern match. (See L</Scoping Rules of Regex Variables>). Example:
 
     local $_ = 'abcdefghi';
     /def/;
@@ -1043,26 +1197,25 @@ enclosed by the current BLOCK).  Example:
 See L</Performance issues> above for the serious performance implications
 of using this variable (even once) in your code.
 
-This variable is read-only and dynamically-scoped.
+This variable is read-only, and its value is dynamically scoped.
 
 Mnemonic: C<'> often follows a quoted string.
 
 =item ${^POSTMATCH}
-X<${^POSTMATCH}> X<$'> X<$POSTMATCH>
+X<${^POSTMATCH}>
 
-This is similar to C<$'> (C<$POSTMATCH>) except that it does not incur the
-performance penalty associated with that variable.
+It is only guaranteed to return a defined value when the pattern was
+compiled or executed with the C</p> modifier.
 
-See L</Performance issues> above.
+This is similar to C<$'> (C<$POSTMATCH>) except that to use it you must
+use the C</p> modifier when executing the pattern, and it does not incur
+and performance penalty associated with that variable.
 
-In Perl v5.18 and earlier, it is only guaranteed
-to return a defined value when the pattern was compiled or executed with
-the C</p> modifier.  In Perl v5.20, the C</p> modifier does nothing, so
-C<${^POSTMATCH}> does the same thing as C<$POSTMATCH>.
+See L</Performance issues> above.
 
 This variable was added in Perl v5.10.0.
 
-This variable is read-only and dynamically-scoped.
+This variable is read-only, and its value is dynamically scoped.
 
 =item $LAST_PAREN_MATCH
 
@@ -1070,7 +1223,8 @@ This variable is read-only and dynamically-scoped.
 X<$+> X<$LAST_PAREN_MATCH>
 
 The text matched by the highest used capture group of the last
-successful search pattern.  It is logically equivalent to the highest
+successful search pattern. (See L</Scoping Rules of Regex Variables>).
+It is logically equivalent to the highest
 numbered capture variable (C<$1>, C<$2>, ...) which has a defined value.
 
 This is useful if you don't know which one of a set of alternative patterns
@@ -1078,7 +1232,7 @@ matched.  For example:
 
     /Version: (.*)|Revision: (.*)/ && ($rev = $+);
 
-This variable is read-only and dynamically-scoped.
+This variable is read-only, and its value is dynamically scoped.
 
 Mnemonic: be positive and forward looking.
 
@@ -1088,8 +1242,11 @@ Mnemonic: be positive and forward looking.
 X<$^N> X<$LAST_SUBMATCH_RESULT>
 
 The text matched by the used group most-recently closed (i.e. the group
-with the rightmost closing parenthesis) of the last successful search
-pattern. This is subtly different from C<$+>. For example in
+with the rightmost closing parenthesis) of the last successful match.
+(See L</Scoping Rules of Regex Variables>).
+
+
+This is subtly different from C<$+>. For example in
 
     "ab" =~ /^((.)(.))$/
 
@@ -1108,6 +1265,8 @@ recently matched.  For example, to effectively capture text to a variable
 By setting and then using C<$var> in this way relieves you from having to
 worry about exactly which numbered set of parentheses they are.
 
+This variable is read-only, and its value is dynamically scoped.
+
 This variable was added in Perl v5.8.0.
 
 Mnemonic: the (possibly) Nested parenthesis that most recently closed.
@@ -1118,15 +1277,24 @@ Mnemonic: the (possibly) Nested parenthesis that most recently closed.
 X<@+> X<@LAST_MATCH_END>
 
 This array holds the offsets of the ends of the last successful
-submatches in the currently active dynamic scope.  C<$+[0]> is
-the offset into the string of the end of the entire match.  This
-is the same value as what the C<pos> function returns when called
-on the variable that was matched against.  The I<n>th element
-of this array holds the offset of the I<n>th submatch, so
-C<$+[1]> is the offset past where C<$1> ends, C<$+[2]> the offset
-past where C<$2> ends, and so on.  You can use C<$#+> to determine
-how many subgroups were in the last successful match.  See the
-examples given for the C<@-> variable.
+match and any matching capture buffers that the pattern contains.
+(See L</Scoping Rules of Regex Variables>)
+
+The number of elements it contains will be one more than the number
+of capture buffers in the pattern, regardless of which capture buffers
+actually matched. You can use this to determine how many capture
+buffers there are in the pattern. (As opposed to C<@-> which may
+have fewer elements.)
+
+C<$+[0]> is the offset into the string of the end of the entire match.
+This is the same value as what the C<pos> function returns when called
+on the variable that was matched against. The I<n>th element of this
+array holds the offset of the I<n>th submatch, so C<$+[1]> is the offset
+past where C<$1> ends, C<$+[2]> the offset past where C<$2> ends, and so
+on. You can use C<$#+> to determine how many subgroups were in the last
+successful match. See the examples given for the C<@-> variable.
+
+This variable is read-only, and its value is dynamically scoped.
 
 This variable was added in Perl v5.6.0.
 
@@ -1139,7 +1307,7 @@ X<%+> X<%LAST_PAREN_MATCH> X<%{^CAPTURE}>
 
 Similar to C<@+>, the C<%+> hash allows access to the named capture
 buffers, should they exist, in the last successful match in the
-currently active dynamic scope.
+currently active dynamic scope. (See L</Scoping Rules of Regex Variables>).
 
 For example, C<$+{foo}> is equivalent to C<$1> after the following match:
 
@@ -1163,27 +1331,33 @@ surprising.
 This variable was added in Perl v5.10.0. The C<%{^CAPTURE}> alias was
 added in 5.25.7.
 
-This variable is read-only and dynamically-scoped.
+This variable is read-only, and its value is dynamically scoped.
 
 =item @LAST_MATCH_START
 
 =item @-
 X<@-> X<@LAST_MATCH_START>
 
+This array holds the offsets of the beginnings of the last successful
+match and any capture buffers it contains.
+(See L</Scoping Rules of Regex Variables>).
+
+The number of elements it contains will be one more than the number of
+the highest capture buffers (also called a subgroup) that actually
+matched something. (As opposed to C<@+> which may have fewer elements.)
+
 C<$-[0]> is the offset of the start of the last successful match.
 C<$-[I<n>]> is the offset of the start of the substring matched by
 I<n>-th subpattern, or undef if the subpattern did not match.
 
-Thus, after a match against C<$_>, C<$&> coincides with C<substr $_, $-[0],
-$+[0] - $-[0]>.  Similarly, $I<n> coincides with C<substr $_, $-[n],
-$+[n] - $-[n]> if C<$-[n]> is defined, and $+ coincides with
-C<substr $_, $-[$#-], $+[$#-] - $-[$#-]>.  One can use C<$#-> to find the
-last matched subgroup in the last successful match.  Contrast with
-C<$#+>, the number of subgroups in the regular expression.  Compare
-with C<@+>.
+Thus, after a match against C<$_>, C<$&> coincides with
+C<substr $_, $-[0], $+[0] - $-[0]>.  Similarly, C<$I<n>> coincides
+with C<substr $_, $-[n], $+[n] - $-[n]> if C<$-[n]> is defined, and
+C<$+> coincides with C<substr $_, $-[$#-], $+[$#-] - $-[$#-]>.
+One can use C<$#-> to find the last matched subgroup in the last
+successful match.  Contrast with C<$#+>, the number of subgroups
+in the regular expression.
 
-This array holds the offsets of the beginnings of the last
-successful submatches in the currently active dynamic scope.
 C<$-[0]> is the offset into the string of the beginning of the
 entire match.  The I<n>th element of this array holds the offset
 of the I<n>th submatch, so C<$-[1]> is the offset where C<$1>
@@ -1207,6 +1381,8 @@ After a match against some variable C<$var>:
 
 =back
 
+This variable is read-only, and its value is dynamically scoped.
+
 This variable was added in Perl v5.6.0.
 
 =item %{^CAPTURE_ALL}
@@ -1215,12 +1391,12 @@ X<%{^CAPTURE_ALL}>
 =item %-
 X<%->
 
-Similar to C<%+>, this variable allows access to the named capture groups
-in the last successful match in the currently active dynamic scope.  To
-each capture group name found in the regular expression, it associates a
-reference to an array containing the list of values captured by all
-buffers with that name (should there be several of them), in the order
-where they appear.
+Similar to C<%+>, this variable allows access to the named capture
+groups in the last successful match in the currently active dynamic
+scope. (See L</Scoping Rules of Regex Variables>). To each capture group
+name found in the regular expression, it associates a reference to an
+array containing the list of values captured by all buffers with that
+name (should there be several of them), in the order where they appear.
 
 Here's an example:
 
@@ -1254,12 +1430,33 @@ B<Note:> C<%-> and C<%+> are tied views into a common internal hash
 associated with the last successful regular expression.  Therefore mixing
 iterative access to them via C<each> may have unpredictable results.
 Likewise, if the last successful match changes, then the results may be
-surprising.
+surprising. See L</Scoping Rules of Regex Variables>.
 
 This variable was added in Perl v5.10.0. The C<%{^CAPTURE_ALL}> alias was
 added in 5.25.7.
 
-This variable is read-only and dynamically-scoped.
+This variable is read-only, and its value is dynamically scoped.
+
+=item ${^LAST_SUCCESSFUL_PATTERN}
+
+The last successful pattern that matched in the current scope.  The empty
+pattern defaults to matching to this. For instance:
+
+    if (m/foo/ || m/bar/) {
+        s//BLAH/;
+    }
+
+and
+
+    if (m/foo/ || m/bar/) {
+        s/${^LAST_SUCCESSFUL_PATTERN}/BLAH/;
+    }
+
+are equivalent.
+
+You can use this to debug which pattern matched last, or to match with it again.
+
+Added in Perl 5.37.10.
 
 =item $LAST_REGEXP_CODE_RESULT
 
@@ -1267,7 +1464,10 @@ This variable is read-only and dynamically-scoped.
 X<$^R> X<$LAST_REGEXP_CODE_RESULT>
 
 The result of evaluation of the last successful C<(?{ code })>
-regular expression assertion (see L<perlre>).  May be written to.
+regular expression assertion (see L<perlre>).
+
+This variable may be written to, and its value is scoped normally,
+unlike most other regex variables.
 
 This variable was added in Perl 5.005.
 
@@ -1539,7 +1739,7 @@ Suppose we wrote the following string to a file:
     $string .= "epsilon zeta eta\n\n";
     $string .= "theta\n";
 
-    my $file = 'simple_file.txt'; 
+    my $file = 'simple_file.txt';
     open my $OUT, '>', $file or die;
     print $OUT $string;
     close $OUT or die;
@@ -2168,7 +2368,7 @@ value when the interpreter started to compile the BLOCK.
 
 Each time a statement completes being compiled, the current value of
 C<$^H> is stored with that statement, and can later be retrieved via
-C<(caller($level))[8]>.
+C<(caller($level))[8]>.  See L<perlfunc/caller EXPR>.
 
 When perl begins to parse any block construct that provides a lexical scope
 (e.g., eval body, required file, subroutine body, loop body, or conditional
@@ -2212,15 +2412,14 @@ This variable was added in Perl 5.003.
 =item %^H
 X<%^H>
 
-The C<%^H> hash provides the same scoping semantic as C<$^H>.  This makes
-it useful for implementation of lexically scoped pragmas.  See
-L<perlpragma>.   All the entries are stringified when accessed at
-runtime, so only simple values can be accommodated.  This means no
-pointers to objects, for example.
+The C<%^H> hash provides the same scoping semantics as L<C<$^H>|/$^H>.  This
+makes it useful for implementing lexically scoped pragmas.  See L<perlpragma>.
+All the entries are stringified when accessed at runtime, so only simple values
+can be accommodated.  This means no references to objects, for example.
 
 Each time a statement completes being compiled, the current value of
 C<%^H> is stored with that statement, and can later be retrieved via
-C<(caller($level))[10]>.
+C<(caller($level))[10]>.  See L<perlfunc/caller EXPR>.
 
 When putting items into C<%^H>, in order to avoid conflicting with other
 users of the hash there is a convention regarding which keys to use.
index e0d9803..3715628 100644 (file)
@@ -235,8 +235,8 @@ either don't use it at all, or make sure your entire toolchain and
 application environment support and use it.
 
 OpenVMS Alpha v7.3-1 and later and all version of OpenVMS I64 support
-case sensitivity as a process setting (see C<SET PROCESS
-/CASE_LOOKUP=SENSITIVE>). Perl does not currently support case
+case sensitivity as a process setting (see S<C<SET PROCESS
+/CASE_LOOKUP=SENSITIVE>>). Perl does not currently support case
 sensitivity on VMS, but it may in the future, so Perl programs should
 use the C<< File::Spec->case_tolerant >> method to determine the state, and
 not the C<$^O> variable.
@@ -249,7 +249,7 @@ in the filesystem and CRTL (generally 64-bit OpenVMS v8.3 and later).
 There are a number of limitations and caveats to be aware of when
 working with symbolic links on VMS.  Most notably, the target of a valid
 symbolic link must be expressed as a Unix-style path and it must exist
-on a volume visible from your POSIX root (see the C<SHOW ROOT> command
+on a volume visible from your POSIX root (see the S<C<SHOW ROOT>> command
 in DCL help).  For further details on symbolic link capabilities and
 requirements, see chapter 12 of the CRTL manual that ships with OpenVMS
 v8.3 or later.
index 261f702..dd47b73 100644 (file)
@@ -405,7 +405,15 @@ PP(pp_anoncode)
     if (CvCLONE(cv))
         cv = MUTABLE_CV(sv_2mortal(MUTABLE_SV(cv_clone(cv))));
     EXTEND(SP,1);
-    PUSHs(MUTABLE_SV(cv));
+
+    SV* sv = MUTABLE_SV(cv);
+
+    if (LIKELY(PL_op->op_flags & OPf_REF)) {
+        sv = refto(sv);
+    }
+
+    PUSHs(sv);
+
     RETURN;
 }
 
@@ -730,7 +738,6 @@ S_do_chomp(pTHX_ SV *retval, SV *sv, bool chomping)
     if (chomping) {
         if (s && len) {
             char *temp_buffer = NULL;
-            SV *svrecode = NULL;
             s += --len;
             if (RsPARA(PL_rs)) {
                 if (*s != '\n')
@@ -760,10 +767,10 @@ S_do_chomp(pTHX_ SV *retval, SV *sv, bool chomping)
                         if (is_utf8) {
                             /* Cannot downgrade, therefore cannot possibly match.
                                At this point, temp_buffer is not alloced, and
-                               is the buffer inside PL_rs, so dont free it.
+                               is the buffer inside PL_rs, so don't free it.
                              */
                             assert (temp_buffer == rsptr);
-                            goto nope_free_sv;
+                            goto nope_free_nothing;
                         }
                         rsptr = temp_buffer;
                     }
@@ -796,8 +803,6 @@ S_do_chomp(pTHX_ SV *retval, SV *sv, bool chomping)
 
             nope_free_all:
             Safefree(temp_buffer);
-            nope_free_sv:
-            SvREFCNT_dec(svrecode);
             nope_free_nothing: ;
         }
     } else {
@@ -879,11 +884,21 @@ PP(pp_undef)
         RETPUSHUNDEF;
     }
 
-    sv = TOPs;
-    if (!sv)
-    {
-        SETs(&PL_sv_undef);
-        return NORMAL;
+    if (PL_op->op_private & OPpTARGET_MY) {
+        SV** const padentry = &PAD_SVl(PL_op->op_targ);
+        sv = *padentry;
+        EXTEND(SP,1);sp++;PUTBACK;
+        if ((PL_op->op_private & (OPpLVAL_INTRO|OPpPAD_STATE)) == OPpLVAL_INTRO) {
+            save_clearsv(padentry);
+        }
+    } else {
+        sv = TOPs;
+
+        if (!sv)
+        {
+            SETs(&PL_sv_undef);
+            return NORMAL;
+        }
     }
 
     if (SvTHINKFIRST(sv))
@@ -904,11 +919,11 @@ PP(pp_undef)
                           "Constant subroutine %" SVf " undefined",
                            SVfARG(CvANON((const CV *)sv)
                              ? newSVpvs_flags("(anonymous)", SVs_TEMP)
-                             : sv_2mortal(newSVhek(
+                             : newSVhek_mortal(
                                 CvNAMED(sv)
                                  ? CvNAME_HEK((CV *)sv)
                                  : GvENAME_HEK(CvGV((const CV *)sv))
-                               ))
+                               )
                            ));
         /* FALLTHROUGH */
     case SVt_PVFM:
@@ -925,7 +940,7 @@ PP(pp_undef)
             /* undef *Pkg::meth_name ... */
             bool method_changed
              =   GvCVu((const GV *)sv) && (stash = GvSTASH((const GV *)sv))
-              && HvENAME_get(stash);
+              && HvHasENAME(stash);
             /* undef *Foo:: */
             if((stash = GvHV((const GV *)sv))) {
                 if(HvENAME_get(stash))
@@ -950,7 +965,7 @@ PP(pp_undef)
             /* undef *Foo::ISA */
             if( strEQ(GvNAME((const GV *)sv), "ISA")
              && (stash = GvSTASH((const GV *)sv))
-             && (method_changed || HvENAME(stash)) )
+             && (method_changed || HvHasENAME(stash)) )
                 mro_isa_changed_in(stash);
             else if(method_changed)
                 mro_method_changed_in(
@@ -960,7 +975,9 @@ PP(pp_undef)
             break;
         }
     default:
-        if (SvTYPE(sv) >= SVt_PV && SvPVX_const(sv) && SvLEN(sv)) {
+        if (SvTYPE(sv) >= SVt_PV && SvPVX_const(sv) && SvLEN(sv)
+            && !(PL_op->op_private & OPpUNDEF_KEEP_PV)
+        ) {
             SvPV_free(sv);
             SvPV_set(sv, NULL);
             SvLEN_set(sv, 0);
@@ -969,7 +986,11 @@ PP(pp_undef)
         SvSETMAGIC(sv);
     }
 
-    SETs(&PL_sv_undef);
+
+    if (PL_op->op_private & OPpTARGET_MY)
+        SETs(sv);
+    else
+        SETs(&PL_sv_undef);
     return NORMAL;
 }
 
@@ -1206,6 +1227,20 @@ PP(pp_pow)
         } else {
             SETn( Perl_pow( left, right) );
         }
+#elif IVSIZE == 4 && defined(LONGDOUBLE_DOUBLEDOUBLE) && defined(USE_LONG_DOUBLE)
+    /*
+    Under these conditions, if a known libm bug exists, Perl_pow() could return
+    an incorrect value if the correct value is an integer in the range of around
+    25 or more bits. The error is always quite small, so we work around it by
+    rounding to the nearest integer value ... but only if is_int is true.
+    See https://github.com/Perl/perl5/issues/19625.
+    */
+
+        if (is_int) {
+            SETn( roundl( Perl_pow( left, right) ) );
+        }
+        else SETn( Perl_pow( left, right) );
+
 #else
         SETn( Perl_pow( left, right) );
 #endif  /* HAS_AIX_POWL_NEG_BASE_BUG */
@@ -2662,7 +2697,7 @@ PP(pp_i_multiply)
     tryAMAGICbin_MG(mult_amg, AMGf_assign);
     {
       dPOPTOPiirl_nomg;
-      SETi( left * right );
+      SETi( (IV)((UV)left * (UV)right) );
       RETURN;
     }
 }
@@ -2681,7 +2716,7 @@ PP(pp_i_divide)
 
       /* avoid FPE_INTOVF on some platforms when num is IV_MIN */
       if (value == -1)
-          value = num;
+          value = (IV)-(UV)num;
       else
           value = num / value;
       SETi(value);
@@ -2712,7 +2747,7 @@ PP(pp_i_add)
     tryAMAGICbin_MG(add_amg, AMGf_assign);
     {
       dPOPTOPiirl_ul_nomg;
-      SETi( left + right );
+      SETi( (IV)((UV)left + (UV)right) );
       RETURN;
     }
 }
@@ -2723,7 +2758,7 @@ PP(pp_i_subtract)
     tryAMAGICbin_MG(subtr_amg, AMGf_assign);
     {
       dPOPTOPiirl_ul_nomg;
-      SETi( left - right );
+      SETi( (IV)((UV)left - (UV)right) );
       RETURN;
     }
 }
@@ -2821,7 +2856,7 @@ PP(pp_i_negate)
     {
         SV * const sv = TOPs;
         IV const i = SvIV_nomg(sv);
-        SETi(-i);
+        SETi((IV)-(UV)i);
         return NORMAL;
     }
 }
@@ -2873,10 +2908,16 @@ PP(pp_sin)
 #if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
               ! Perl_isnan(value) &&
 #endif
-              (op_type == OP_LOG ? (value <= 0.0) : (value < 0.0))) {
+              (op_type == OP_LOG ? (value <= 0.0) : (value < 0.0)))
+          {
+              char * mesg;
+              LC_NUMERIC_LOCK(0);
               SET_NUMERIC_STANDARD();
+              mesg = Perl_form(aTHX_ "Can't take %s of %" NVgf, neg_report, value);
+              LC_NUMERIC_UNLOCK;
+
               /* diag_listed_as: Can't take log of %g */
-              DIE(aTHX_ "Can't take %s of %" NVgf, neg_report, value);
+              DIE(aTHX_ "%s", mesg);
           }
       }
       switch (op_type) {
@@ -2906,7 +2947,17 @@ PP(pp_sin)
 PP(pp_rand)
 {
     if (!PL_srand_called) {
-        (void)seedDrand01((Rand_seed_t)seed());
+        Rand_seed_t s;
+        if (PL_srand_override) {
+            /* env var PERL_RAND_SEED has been set so the user wants
+             * consistent srand() initialization. */
+            PERL_SRAND_OVERRIDE_GET(s);
+        } else {
+            /* Pseudo random initialization from context state and possible
+             * random devices */
+            s= (Rand_seed_t)seed();
+        }
+        (void)seedDrand01(s);
         PL_srand_called = TRUE;
     }
     {
@@ -2963,13 +3014,18 @@ PP(pp_srand)
                              "Integer overflow in srand");
             anum = UV_MAX;
         }
-        (void)srand48_deterministic((Rand_seed_t)anum);
     }
     else {
-        anum = seed();
-        (void)seedDrand01((Rand_seed_t)anum);
+        if (PL_srand_override) {
+            /* env var PERL_RAND_SEED has been set so the user wants
+             * consistent srand() initialization. */
+            PERL_SRAND_OVERRIDE_GET(anum);
+        } else {
+            anum = seed();
+        }
     }
 
+    (void)seedDrand01((Rand_seed_t)anum);
     PL_srand_called = TRUE;
     if (anum)
         XPUSHu(anum);
@@ -3086,7 +3142,7 @@ PP(pp_oct)
          SV* const tsv = sv_2mortal(newSVsv(sv));
 
          SvUTF8_on(tsv);
-         sv_utf8_downgrade(tsv, FALSE);
+         (void)sv_utf8_downgrade(tsv, FALSE);
          tmps = SvPV_const(tsv, len);
     }
     if (PL_op->op_type == OP_HEX)
@@ -3184,7 +3240,7 @@ PP(pp_length)
             SvSETMAGIC(TARG);
         }
         else
-            /* TARG is on stack at this point and is overwriten by SETs.
+            /* TARG is on stack at this point and is overwritten by SETs.
              * This branch is the odd one out, so put TARG by default on
              * stack earlier to let local SP go out of liveness sooner */
             SETs(&PL_sv_undef);
@@ -3676,7 +3732,7 @@ PP(pp_crypt)
           * Yes, we made this up.  */
          SV* const tsv = newSVpvn_flags(tmps, len, SVf_UTF8|SVs_TEMP);
 
-         sv_utf8_downgrade(tsv, FALSE);
+         (void)sv_utf8_downgrade(tsv, FALSE);
          tmps = SvPV_const(tsv, len);
     }
 #  ifdef USE_ITHREADS
@@ -3749,7 +3805,7 @@ PP(pp_ucfirst)
 #ifdef USE_LOCALE_CTYPE
 
     if (IN_LC_RUNTIME(LC_CTYPE)) {
-        _CHECK_AND_WARN_PROBLEMATIC_LOCALE;
+        CHECK_AND_WARN_PROBLEMATIC_LOCALE_;
     }
 
 #endif
@@ -3787,7 +3843,7 @@ PP(pp_ucfirst)
              * call to lowercase above has handled this.  But SpecialCasing.txt
              * says we are supposed to remove the COMBINING DOT ABOVE.  We can
              * tell if we have this situation if I ==> i in a turkic locale. */
-            if (   UNLIKELY(PL_in_utf8_turkic_locale)
+            if (   UNLIKELY(IN_UTF8_TURKIC_LOCALE)
                 && IN_LC_RUNTIME(LC_CTYPE)
                 && (UNLIKELY(*s == 'I' && tmpbuf[0] == 'i')))
             {
@@ -3831,7 +3887,7 @@ PP(pp_ucfirst)
 #ifdef USE_LOCALE_CTYPE
 
         if (IN_LC_RUNTIME(LC_CTYPE)) {
-            if (    UNLIKELY(PL_in_utf8_turkic_locale)
+            if (    UNLIKELY(IN_UTF8_TURKIC_LOCALE)
                 && (   (op_type == OP_LCFIRST && UNLIKELY(*s == 'I'))
                     || (op_type == OP_UCFIRST && UNLIKELY(*s == 'i'))))
             {
@@ -4115,7 +4171,7 @@ PP(pp_uc)
 #ifdef USE_LOCALE_CTYPE
 
     if (IN_LC_RUNTIME(LC_CTYPE)) {
-        _CHECK_AND_WARN_PROBLEMATIC_LOCALE;
+        CHECK_AND_WARN_PROBLEMATIC_LOCALE_;
     }
 
 #endif
@@ -4233,7 +4289,7 @@ PP(pp_uc)
 
 #ifdef USE_LOCALE_CTYPE
 
-                        && (LIKELY(   ! PL_in_utf8_turkic_locale
+                        && (LIKELY(   ! IN_UTF8_TURKIC_LOCALE
                                    || ! IN_LC_RUNTIME(LC_CTYPE))
                                    || *s != 'i')
 #endif
@@ -4339,7 +4395,7 @@ PP(pp_uc)
                      * its own loop */
 
 #ifdef USE_LOCALE_CTYPE
-                    if (   UNLIKELY(PL_in_utf8_turkic_locale)
+                    if (   UNLIKELY(IN_UTF8_TURKIC_LOCALE)
                         && UNLIKELY(IN_LC_RUNTIME(LC_CTYPE)))
                     {
                         for (; s < send; s++) {
@@ -4405,7 +4461,7 @@ PP(pp_lc)
 #ifdef USE_LOCALE_CTYPE
 
         && (   LIKELY(! IN_LC_RUNTIME(LC_CTYPE))
-            || LIKELY(! PL_in_utf8_turkic_locale))
+            || LIKELY(! IN_UTF8_TURKIC_LOCALE))
 
 #endif
 
@@ -4437,11 +4493,11 @@ PP(pp_lc)
     if (IN_LC_RUNTIME(LC_CTYPE)) {
         const U8 * next_I;
 
-        _CHECK_AND_WARN_PROBLEMATIC_LOCALE;
+        CHECK_AND_WARN_PROBLEMATIC_LOCALE_;
 
         /* Lowercasing in a Turkic locale can cause non-UTF-8 to need to become
          * UTF-8 for the single case of the character 'I' */
-        if (     UNLIKELY(PL_in_utf8_turkic_locale)
+        if (     UNLIKELY(IN_UTF8_TURKIC_LOCALE)
             && ! DO_UTF8(source)
             &&   (next_I = (U8 *) memchr(s, 'I', len)))
         {
@@ -4498,7 +4554,7 @@ PP(pp_lc)
              * and if so, do it.  We know that there is a DOT because
              * _toLOWER_utf8_flags() wouldn't have returned 'i' unless there
              * was one in a proper position. */
-            if (   UNLIKELY(PL_in_utf8_turkic_locale)
+            if (   UNLIKELY(IN_UTF8_TURKIC_LOCALE)
                 && IN_LC_RUNTIME(LC_CTYPE))
             {
                 if (   UNLIKELY(remove_dot_above)
@@ -4736,7 +4792,7 @@ PP(pp_fc)
 #ifdef USE_LOCALE_CTYPE
 
     if ( IN_LC_RUNTIME(LC_CTYPE) ) { /* Under locale */
-        _CHECK_AND_WARN_PROBLEMATIC_LOCALE;
+        CHECK_AND_WARN_PROBLEMATIC_LOCALE_;
     }
 
 #endif
@@ -4790,7 +4846,7 @@ PP(pp_fc)
             for (; s < send; d++, s++) {
                 if (    UNLIKELY(*s == MICRO_SIGN)
 #ifdef USE_LOCALE_CTYPE
-                    || (   UNLIKELY(PL_in_utf8_turkic_locale)
+                    || (   UNLIKELY(IN_UTF8_TURKIC_LOCALE)
                         && UNLIKELY(IN_LC_RUNTIME(LC_CTYPE))
                         && UNLIKELY(*s == 'I'))
 #endif
@@ -5105,7 +5161,7 @@ S_do_delete_local(pTHX)
     const U8 gimme = GIMME_V;
     const MAGIC *mg;
     HV *stash;
-    const bool sliced = !!(PL_op->op_private & OPpSLICE);
+    const bool sliced = cBOOL(PL_op->op_private & OPpSLICE);
     SV **unsliced_keysv = sliced ? NULL : sp--;
     SV * const osv = POPs;
     SV **mark = sliced ? PL_stack_base + POPMARK : unsliced_keysv-1;
@@ -5321,6 +5377,78 @@ PP(pp_exists)
     RETPUSHNO;
 }
 
+/* OP_HELEMEXISTSOR is a LOGOP not currently available to pure Perl code, but
+ * is defined for use by the core for new features, optimisations, or XS
+ * modules.
+ *
+ * Constructing it consumes two optrees, the first of which must be an
+ * OP_HELEM.
+ *
+ *   OP *o = newLOGOP(OP_HELEMEXISTSOR, 0, helemop, otherop);
+ *
+ * If the hash element exists (by the same rules as OP_EXISTS would find
+ * true) the op pushes it to the stack in the same way as a regular OP_HELEM
+ * and invokes op_next. If the element does not exist, then op_other is
+ * invoked instead. This is roughly equivalent to the perl code
+ *
+ *   exists $hash{$key} ? $hash{$key} : OTHER
+ *
+ * Except that any expressions or side-effects involved in obtaining the HV
+ * or the key are only invoked once, and it is a little more efficient when
+ * run on regular (non-magical) HVs.
+ *
+ * Combined with the OPpHELEMEXISTSOR_DELETE flag in op_private, this
+ * additionally deletes the element if found.
+ *
+ * On a tied HV, the 'EXISTS' method will be run as expected. If the method
+ * returns true then either the 'FETCH' or 'DELETE' method will also be run
+ * as required.
+ */
+
+PP(pp_helemexistsor)
+{
+    dSP;
+    SV *keysv = POPs;
+    HV *hv = MUTABLE_HV(POPs);
+    bool is_delete = PL_op->op_private & OPpHELEMEXISTSOR_DELETE;
+
+    assert(SvTYPE(hv) == SVt_PVHV);
+
+    bool hv_is_magical = UNLIKELY(SvMAGICAL(hv));
+
+    SV *val = NULL;
+
+    /* For magical HVs we have to ensure we invoke the EXISTS method first.
+     * For regular HVs we can just skip this and use the "pointer or NULL"
+     * result of the real hv_* functions
+     */
+    if(hv_is_magical && !hv_exists_ent(hv, keysv, 0))
+        goto other;
+
+    if(is_delete) {
+        val = hv_delete_ent(hv, keysv, 0, 0);
+    }
+    else {
+        HE *he = hv_fetch_ent(hv, keysv, 0, 0);
+        val = he ? HeVAL(he) : NULL;
+
+        /* A magical HV hasn't yet actually invoked the FETCH method. We must
+         * ask it to do so now
+         */
+        if(hv_is_magical && val)
+            SvGETMAGIC(val);
+    }
+
+    if(!val) {
+other:
+        PUTBACK;
+        return cLOGOP->op_other;
+    }
+
+    PUSHs(val);
+    RETURN;
+}
+
 PP(pp_hslice)
 {
     dSP; dMARK; dORIGMARK;
@@ -5513,6 +5641,51 @@ PP(pp_anonlist)
     RETURN;
 }
 
+/* When an anonlist or anonhash will (1) be empty and (2) return an RV
+ * pointing to the new AV/HV, the peephole optimizer can swap in this
+ * simpler function and op_null the originally associated PUSHMARK. */
+PP(pp_emptyavhv)
+{
+    dSP;
+    OP * const op = PL_op;
+    SV * rv;
+    SV * const sv = MUTABLE_SV( newSV_type(
+                                (op->op_private & OPpEMPTYAVHV_IS_HV) ?
+                                    SVt_PVHV :
+                                    SVt_PVAV ) );
+
+    /* Is it an assignment, just a stack push, or both?*/
+    if (op->op_private & OPpTARGET_MY) {
+        SV** const padentry = &PAD_SVl(op->op_targ);
+        rv = *padentry;
+        /* Since the op_targ is very likely to be an undef SVt_IV from
+         * a previous iteration, converting it to a live RV can
+         * typically be special-cased.*/
+        if (SvTYPE(rv) == SVt_IV && !SvOK(rv)) {
+            SvFLAGS(rv) = (SVt_IV | SVf_ROK);
+            SvRV_set(rv, sv);
+        } else {
+           sv_setrv_noinc_mg(rv, sv);
+        }
+        if ((op->op_private & (OPpLVAL_INTRO|OPpPAD_STATE)) == OPpLVAL_INTRO) {
+            save_clearsv(padentry);
+        }
+        if (GIMME_V == G_VOID) {
+            RETURN; /* skip extending and pushing */
+        }
+    } else {
+        /* Inlined newRV_noinc */
+        SV * refsv = newSV_type_mortal(SVt_IV);
+        SvRV_set(refsv, sv);
+        SvROK_on(refsv);
+
+        rv = refsv;
+    }
+
+    XPUSHs(rv);
+    RETURN;
+}
+
 PP(pp_anonhash)
 {
     dSP; dMARK; dORIGMARK;
@@ -5783,7 +5956,7 @@ PP(pp_push)
         /* SPAGAIN; not needed: SP is assigned to immediately below */
     }
     else {
-        /* PL_delaymagic is restored by JUMPENV_POP on dieing, so we
+        /* PL_delaymagic is restored by JMPENV_POP on dieing, so we
          * only need to save locally, not on the save stack */
         U16 old_delaymagic = PL_delaymagic;
 
@@ -5839,17 +6012,38 @@ PP(pp_unshift)
         /* SPAGAIN; not needed: SP is assigned to immediately below */
     }
     else {
-        /* PL_delaymagic is restored by JUMPENV_POP on dieing, so we
+        /* PL_delaymagic is restored by JMPENV_POP on dieing, so we
          * only need to save locally, not on the save stack */
         U16 old_delaymagic = PL_delaymagic;
         SSize_t i = 0;
 
         av_unshift(ary, SP - MARK);
         PL_delaymagic = DM_DELAY;
-        while (MARK < SP) {
-            SV * const sv = newSVsv(*++MARK);
-            (void)av_store(ary, i++, sv);
+
+        if (!SvMAGICAL(ary)) {
+            /* The av_unshift above means that many of the checks inside
+             * av_store are unnecessary. If ary does not have magic attached
+             * then a simple direct assignment is possible here. */
+            while (MARK < SP) {
+                SV * const sv = newSVsv(*++MARK);
+                assert( !SvTIED_mg((const SV *)ary, PERL_MAGIC_tied) );
+                assert( i >= 0 );
+                assert( !SvREADONLY(ary) );
+                assert( AvREAL(ary) || !AvREIFY(ary) );
+                assert( i <= AvMAX(ary) );
+                assert( i <= AvFILLp(ary) );
+                if (AvREAL(ary))
+                    SvREFCNT_dec(AvARRAY(ary)[i]);
+                AvARRAY(ary)[i] = sv;
+                i++;
+            }
+        } else {
+            while (MARK < SP) {
+                SV * const sv = newSVsv(*++MARK);
+                (void)av_store(ary, i++, sv);
+            }
         }
+
         if (PL_delaymagic & DM_ARRAY_ISA)
             mg_set(MUTABLE_SV(ary));
         PL_delaymagic = old_delaymagic;
@@ -6009,7 +6203,7 @@ PP(pp_split)
     const bool do_utf8 = DO_UTF8(sv);
     const bool in_uni_8_bit = IN_UNI_8_BIT;
     const char *strend = s + len;
-    PMOP *pm = cPMOPx(PL_op);
+    PMOP *pm = cPMOP;
     REGEXP *rx;
     SV *dstr;
     const char *m;
@@ -6306,7 +6500,7 @@ PP(pp_split)
             /* we never pass the REXEC_COPY_STR flag, so it should
              * never get copied */
             assert(!RX_MATCH_COPIED(rx));
-            m = RX_OFFS(rx)[0].start + orig;
+            m = RX_OFFS_START(rx,0) + orig;
 
             if (gimme_scalar) {
                 iters++;
@@ -6321,8 +6515,8 @@ PP(pp_split)
             if (RX_NPARENS(rx)) {
                 I32 i;
                 for (i = 1; i <= (I32)RX_NPARENS(rx); i++) {
-                    s = RX_OFFS(rx)[i].start + orig;
-                    m = RX_OFFS(rx)[i].end + orig;
+                    s = orig + RX_OFFS_START(rx,i);
+                    m = orig + RX_OFFS_END(rx,i);
 
                     /* japhy (07/27/01) -- the (m && s) test doesn't catch
                        parens that didn't match -- they should be set to
@@ -6344,7 +6538,7 @@ PP(pp_split)
 
                 }
             }
-            s = RX_OFFS(rx)[0].end + orig;
+            s = RX_OFFS_END(rx,0) + orig;
         }
     }
 
@@ -6554,8 +6748,7 @@ PP(pp_coreargs)
        to come in between two things this function does (stack reset and
        arg pushing).  This seems the easiest way to do it. */
     if (pushmark) {
-        PUTBACK;
-        (void)Perl_pp_pushmark(aTHX);
+        PUSHMARK(SP);
     }
 
     EXTEND(SP, maxargs == I32_MAX ? numargs : maxargs);
@@ -6924,10 +7117,25 @@ PP(pp_anonconst)
 {
     dSP;
     dTOPss;
-    SETs(sv_2mortal((SV *)newCONSTSUB(SvTYPE(CopSTASH(PL_curcop))==SVt_PVHV
-                                        ? CopSTASH(PL_curcop)
-                                        : NULL,
-                                      NULL, SvREFCNT_inc_simple_NN(sv))));
+
+    CV* constsub = newCONSTSUB(
+        SvTYPE(CopSTASH(PL_curcop))==SVt_PVHV ? CopSTASH(PL_curcop) : NULL,
+        NULL,
+        SvREFCNT_inc_simple_NN(sv)
+    );
+
+    SV* ret_sv = sv_2mortal((SV *)constsub);
+
+    /* Prior to Perl 5.38 anonconst ops always fed into srefgen.
+       5.38 redefined anonconst to create the reference without srefgen.
+       OPf_REF was added to the op. In case some XS code out there creates
+       anonconst the old way, we accommodate OPf_REF's absence here.
+    */
+    if (LIKELY(PL_op->op_flags & OPf_REF)) {
+        ret_sv = refto(ret_sv);
+    }
+
+    SETs(ret_sv);
     RETURN;
 }
 
@@ -7104,14 +7312,20 @@ PP(pp_argdefelem)
     assert(ix <= SSize_t_MAX);
 #endif
 
-    if (AvFILL(defav) >= ix) {
-        dSP;
-        SV **svp = av_fetch(defav, ix, FALSE);
-        SV  *val = svp ? *svp : &PL_sv_undef;
-        XPUSHs(val);
-        RETURN;
-    }
-    return cLOGOPo->op_other;
+    if (AvFILL(defav) < ix)
+        return cLOGOPo->op_other;
+
+    SV **svp = av_fetch(defav, ix, FALSE);
+    SV  *val = svp ? *svp : &PL_sv_undef;
+
+    if ((PL_op->op_private & OPpARG_IF_UNDEF) && !SvOK(val))
+        return cLOGOPo->op_other;
+    if ((PL_op->op_private & OPpARG_IF_FALSE) && !SvTRUE(val))
+        return cLOGOPo->op_other;
+
+    dSP;
+    XPUSHs(val);
+    RETURN;
 }
 
 
@@ -7215,28 +7429,22 @@ PP(pp_cmpchain_dup)
 
 PP(pp_is_bool)
 {
-    dSP;
-    dTARGET;
-    SV *arg = POPs;
+    SV *arg = *PL_stack_sp;
 
     SvGETMAGIC(arg);
 
-    sv_setbool_mg(TARG, SvIsBOOL(arg));
-    PUSHs(TARG);
-    RETURN;
+    *PL_stack_sp = boolSV(SvIsBOOL(arg));
+    return NORMAL;
 }
 
 PP(pp_is_weak)
 {
-    dSP;
-    dTARGET;
-    SV *arg = POPs;
+    SV *arg = *PL_stack_sp;
 
     SvGETMAGIC(arg);
 
-    sv_setbool_mg(TARG, SvROK(arg) && SvWEAKREF(arg));
-    PUSHs(TARG);
-    RETURN;
+    *PL_stack_sp = boolSV(SvWEAKREF(arg));
+    return NORMAL;
 }
 
 PP(pp_weaken)
@@ -7343,6 +7551,16 @@ PP(pp_floor)
     RETURN;
 }
 
+PP(pp_is_tainted)
+{
+    SV *arg = *PL_stack_sp;
+
+    SvGETMAGIC(arg);
+
+    *PL_stack_sp = boolSV(SvTAINTED(arg));
+    return NORMAL;
+}
+
 /*
  * ex: set ts=8 sts=4 sw=4 et:
  */
index d773e3f..65d07ce 100644 (file)
@@ -24,28 +24,28 @@ Stack marker variable for the XSUB.  See C<L</dMARK>>.
 Opening bracket for arguments on a callback.  See C<L</PUTBACK>> and
 L<perlcall>.
 
-=for apidoc Amns||dSP
+=for apidoc Amn;||dSP
 Declares a local copy of perl's stack pointer for the XSUB, available via
 the C<SP> macro.  See C<L</SP>>.
 
-=for apidoc ms||djSP
+=for apidoc m;||djSP
 
 Declare Just C<SP>.  This is actually identical to C<dSP>, and declares
 a local copy of perl's stack pointer, available via the C<SP> macro.
 See C<L<perlapi/SP>>.  (Available for backward source code compatibility with
 the old (Perl 5.005) thread model.)
 
-=for apidoc Amns||dMARK
+=for apidoc Amn;||dMARK
 Declare a stack marker variable, C<mark>, for the XSUB.  See C<L</MARK>> and
 C<L</dORIGMARK>>.
 
-=for apidoc Amns||dORIGMARK
+=for apidoc Amn;||dORIGMARK
 Saves the original stack mark for the XSUB.  See C<L</ORIGMARK>>.
 
 =for apidoc AmnU||ORIGMARK
 The original stack mark for the XSUB.  See C<L</dORIGMARK>>.
 
-=for apidoc Amns||SPAGAIN
+=for apidoc Amn;||SPAGAIN
 Refetch the stack pointer.  Used after a callback.  See L<perlcall>.
 
 =cut */
@@ -55,7 +55,7 @@ Refetch the stack pointer.  Used after a callback.  See L<perlcall>.
 #define MARK mark
 
 /*
-=for apidoc Amns||TARG
+=for apidoc Amn;||TARG
 
 C<TARG> is short for "target".  It is an entry in the pad that an OPs
 C<op_targ> refers to.  It is scratchpad space, often used as a return
@@ -103,8 +103,8 @@ value for the OP, but some use it for other purposes.
 #define GETTARGET targ = PAD_SV(PL_op->op_targ)
 
 /*
-=for apidoc Amns||dTARGET
-Declare that this function uses C<TARG>
+=for apidoc Amn;||dTARGET
+Declare that this function uses C<TARG>, and initializes it
 
 =cut
 */
@@ -119,7 +119,7 @@ Declare that this function uses C<TARG>
 #define DIE return Perl_die
 
 /*
-=for apidoc Amns||PUTBACK
+=for apidoc Amn;||PUTBACK
 Closing bracket for XSUB arguments.  This is usually handled by C<xsubpp>.
 See C<L</PUSHMARK>> and L<perlcall> for other uses.
 
@@ -201,6 +201,10 @@ C<TARG>, so C<dTARGET> or C<dXSTARG> should be called to declare it.  Do not
 call multiple C<TARG>-oriented macros to return lists from XSUB's - see
 C<L</mPUSHp>> instead.  See also C<L</XPUSHp>> and C<L</mXPUSHp>>.
 
+=for apidoc Am|void|PUSHpvs|"literal string"
+A variation on C<PUSHp> that takes a literal string and calculates its size
+directly.
+
 =for apidoc Am|void|PUSHn|NV nv
 Push a double onto the stack.  The stack must have room for this element.
 Handles 'set' magic.  Uses C<TARG>, so C<dTARGET> or C<dXSTARG> should be
@@ -234,6 +238,10 @@ C<dTARGET> or C<dXSTARG> should be called to declare it.  Do not call
 multiple C<TARG>-oriented macros to return lists from XSUB's - see
 C<L</mXPUSHp>> instead.  See also C<L</PUSHp>> and C<L</mPUSHp>>.
 
+=for apidoc Am|void|XPUSHpvs|"literal string"
+A variation on C<XPUSHp> that takes a literal string and calculates its size
+directly.
+
 =for apidoc Am|void|XPUSHn|NV nv
 Push a double onto the stack, extending the stack if necessary.  Handles
 'set' magic.  Uses C<TARG>, so C<dTARGET> or C<dXSTARG> should be called to
@@ -270,6 +278,10 @@ Push a string onto the stack.  The stack must have room for this element.
 The C<len> indicates the length of the string.  Does not use C<TARG>.
 See also C<L</PUSHp>>, C<L</mXPUSHp>> and C<L</XPUSHp>>.
 
+=for apidoc Am|void|mPUSHpvs|"literal string"
+A variation on C<mPUSHp> that takes a literal string and calculates its size
+directly.
+
 =for apidoc Am|void|mPUSHn|NV nv
 Push a double onto the stack.  The stack must have room for this element.
 Does not use C<TARG>.  See also C<L</PUSHn>>, C<L</mXPUSHn>> and C<L</XPUSHn>>.
@@ -297,6 +309,10 @@ Push a string onto the stack, extending the stack if necessary.  The C<len>
 indicates the length of the string.  Does not use C<TARG>.  See also
 C<L</XPUSHp>>, C<mPUSHp> and C<PUSHp>.
 
+=for apidoc Am|void|mXPUSHpvs|"literal string"
+A variation on C<mXPUSHp> that takes a literal string and calculates its size
+directly.
+
 =for apidoc Am|void|mXPUSHn|NV nv
 Push a double onto the stack, extending the stack if necessary.
 Does not use C<TARG>.  See also C<L</XPUSHn>>, C<L</mPUSHn>> and C<L</PUSHn>>.
@@ -316,11 +332,11 @@ Does not use C<TARG>.  See also C<L</XPUSHu>>, C<L</mPUSHu>> and C<L</PUSHu>>.
  * requested to be extended (which is likely to be less than PL_stack_max)
  */
 #if defined DEBUGGING && !defined DEBUGGING_RE_ONLY
-#  define EXTEND_HWM_SET(p, n)                      \
-        STMT_START {                                \
-            SSize_t ix = (p) - PL_stack_base + (n); \
-            if (ix > PL_curstackinfo->si_stack_hwm) \
-                PL_curstackinfo->si_stack_hwm = ix; \
+#  define EXTEND_HWM_SET(p, n)                                     \
+        STMT_START {                                               \
+            SSize_t extend_hwm_set_ix = (p) - PL_stack_base + (n); \
+            if (extend_hwm_set_ix > PL_curstackinfo->si_stack_hwm) \
+                PL_curstackinfo->si_stack_hwm = extend_hwm_set_ix; \
         } STMT_END
 #else
 #  define EXTEND_HWM_SET(p, n) NOOP
@@ -382,7 +398,7 @@ Does not use C<TARG>.  See also C<L</XPUSHu>>, C<L</mPUSHu>> and C<L</PUSHu>>.
 #  define EXTEND_SKIP(p, n) STMT_START {                                \
                                 EXTEND_HWM_SET(p, n);                   \
                                 assert(!_EXTEND_NEEDS_GROW(p,n));       \
-                          } STMT_END
+                            } STMT_END
 
 
 #  define EXTEND(p,n)   STMT_START {                                    \
@@ -390,7 +406,8 @@ Does not use C<TARG>.  See also C<L</XPUSHu>>, C<L</mPUSHu>> and C<L</PUSHu>>.
                          if (UNLIKELY(_EXTEND_NEEDS_GROW(p,n))) {       \
                            sp = stack_grow(sp,p,_EXTEND_SAFE_N(n));     \
                            PERL_UNUSED_VAR(sp);                         \
-                         } } STMT_END
+                         }                                              \
+                        } STMT_END
 /* Same thing, but update mark register too. */
 #  define MEXTEND(p,n)  STMT_START {                                    \
                          EXTEND_HWM_SET(p, n);                          \
@@ -399,7 +416,8 @@ Does not use C<TARG>.  See also C<L</XPUSHu>>, C<L</mPUSHu>> and C<L</PUSHu>>.
                            sp = stack_grow(sp,p,_EXTEND_SAFE_N(n));     \
                            mark = PL_stack_base + markoff;              \
                            PERL_UNUSED_VAR(sp);                         \
-                         } } STMT_END
+                         }                                              \
+                        } STMT_END
 #endif
 
 
@@ -472,6 +490,7 @@ Does not use C<TARG>.  See also C<L</XPUSHu>>, C<L</mPUSHu>> and C<L</PUSHu>>.
 #define PUSHs(s)       (*++sp = (s))
 #define PUSHTARG       STMT_START { SvSETMAGIC(TARG); PUSHs(TARG); } STMT_END
 #define PUSHp(p,l)     STMT_START { sv_setpvn(TARG, (p), (l)); PUSHTARG; } STMT_END
+#define PUSHpvs(s)      PUSHp("" s "", sizeof(s)-1)
 #define PUSHn(n)       STMT_START { TARGn(n,1); PUSHs(TARG); } STMT_END
 #define PUSHi(i)       STMT_START { TARGi(i,1); PUSHs(TARG); } STMT_END
 #define PUSHu(u)       STMT_START { TARGu(u,1); PUSHs(TARG); } STMT_END
@@ -479,6 +498,7 @@ Does not use C<TARG>.  See also C<L</XPUSHu>>, C<L</mPUSHu>> and C<L</PUSHu>>.
 #define XPUSHs(s)      STMT_START { EXTEND(sp,1); *++sp = (s); } STMT_END
 #define XPUSHTARG      STMT_START { SvSETMAGIC(TARG); XPUSHs(TARG); } STMT_END
 #define XPUSHp(p,l)    STMT_START { sv_setpvn(TARG, (p), (l)); XPUSHTARG; } STMT_END
+#define XPUSHpvs(s)     XPUSHp("" s "", sizeof(s)-1)
 #define XPUSHn(n)      STMT_START { TARGn(n,1); XPUSHs(TARG); } STMT_END
 #define XPUSHi(i)      STMT_START { TARGi(i,1); XPUSHs(TARG); } STMT_END
 #define XPUSHu(u)      STMT_START { TARGu(u,1); XPUSHs(TARG); } STMT_END
@@ -487,6 +507,7 @@ Does not use C<TARG>.  See also C<L</XPUSHu>>, C<L</mPUSHu>> and C<L</PUSHu>>.
 #define mPUSHs(s)      PUSHs(sv_2mortal(s))
 #define PUSHmortal     PUSHs(sv_newmortal())
 #define mPUSHp(p,l)    PUSHs(newSVpvn_flags((p), (l), SVs_TEMP))
+#define mPUSHpvs(s)     mPUSHp("" s "", sizeof(s)-1)
 #define mPUSHn(n)      sv_setnv(PUSHmortal, (NV)(n))
 #define mPUSHi(i)      sv_setiv(PUSHmortal, (IV)(i))
 #define mPUSHu(u)      sv_setuv(PUSHmortal, (UV)(u))
@@ -494,6 +515,7 @@ Does not use C<TARG>.  See also C<L</XPUSHu>>, C<L</mPUSHu>> and C<L</PUSHu>>.
 #define mXPUSHs(s)     XPUSHs(sv_2mortal(s))
 #define XPUSHmortal    XPUSHs(sv_newmortal())
 #define mXPUSHp(p,l)   STMT_START { EXTEND(sp,1); mPUSHp((p), (l)); } STMT_END
+#define mXPUSHpvs(s)    mXPUSHp("" s "", sizeof(s)-1)
 #define mXPUSHn(n)     STMT_START { EXTEND(sp,1); mPUSHn(n); } STMT_END
 #define mXPUSHi(i)     STMT_START { EXTEND(sp,1); mPUSHi(i); } STMT_END
 #define mXPUSHu(u)     STMT_START { EXTEND(sp,1); mPUSHu(u); } STMT_END
@@ -682,7 +704,7 @@ True if this op will be the return value of an lvalue subroutine
 /* Used in various places that need to dereference a glob or globref */
 #  define MAYBE_DEREF_GV_flags(sv,phlags)                          \
     (                                                               \
-        (void)(phlags & SV_GMAGIC && (SvGETMAGIC(sv),0)),            \
+        (void)(((phlags) & SV_GMAGIC) && (SvGETMAGIC(sv),0)),        \
         isGV_with_GP(sv)                                              \
           ? (GV *)(sv)                                                \
           : SvROK(sv) && SvTYPE(SvRV(sv)) <= SVt_PVLV &&               \
index 9de77af..d3cd605 100644 (file)
@@ -35,9 +35,6 @@
 #include "perl.h"
 #include "feature.h"
 
-#define RUN_PP_CATCHABLY(thispp) \
-    STMT_START { if (CATCH_GET) return docatch(thispp); } STMT_END
-
 #define dopopto_cursub() \
     (PL_curstackinfo->si_cxsubix >= 0        \
         ? PL_curstackinfo->si_cxsubix        \
@@ -81,7 +78,7 @@ PP(pp_regcreset)
 PP(pp_regcomp)
 {
     dSP;
-    PMOP *pm = (PMOP*)cLOGOP->op_other;
+    PMOP *pm = cPMOPx(cLOGOP->op_other);
     SV **args;
     int nargs;
     REGEXP *re = NULL;
@@ -192,7 +189,7 @@ PP(pp_substcont)
 {
     dSP;
     PERL_CONTEXT *cx = CX_CUR();
-    PMOP * const pm = (PMOP*) cLOGOP->op_other;
+    PMOP * const pm = cPMOPx(cLOGOP->op_other);
     SV * const dstr = cx->sb_dstr;
     char *s = cx->sb_s;
     char *m = cx->sb_m;
@@ -323,14 +320,14 @@ PP(pp_substcont)
         s = orig + (m - s);
         cx->sb_strend = s + (cx->sb_strend - m);
     }
-    cx->sb_m = m = RX_OFFS(rx)[0].start + orig;
+    cx->sb_m = m = RX_OFFS_START(rx,0) + orig;
     if (m > s) {
         if (DO_UTF8(dstr) && !SvUTF8(cx->sb_targ))
             sv_catpvn_nomg_utf8_upgrade(dstr, s, m - s, nsv);
         else
             sv_catpvn_nomg(dstr, s, m-s);
     }
-    cx->sb_s = RX_OFFS(rx)[0].end + orig;
+    cx->sb_s = RX_OFFS_END(rx,0) + orig;
     { /* Update the pos() information. */
         SV * const sv
             = (pm->op_pmflags & PMf_NONDESTRUCT) ? cx->sb_dstr : cx->sb_targ;
@@ -382,6 +379,7 @@ Perl_rxres_save(pTHX_ void **rsp, REGEXP *rx)
     PERL_ARGS_ASSERT_RXRES_SAVE;
     PERL_UNUSED_CONTEXT;
 
+    /* deal with regexp_paren_pair items */
     if (!p || p[1] < RX_NPARENS(rx)) {
 #ifdef PERL_ANY_COW
         i = 7 + (RX_NPARENS(rx)+1) * 2;
@@ -410,8 +408,8 @@ Perl_rxres_save(pTHX_ void **rsp, REGEXP *rx)
     *p++ = (UV)RX_SUBOFFSET(rx);
     *p++ = (UV)RX_SUBCOFFSET(rx);
     for (i = 0; i <= RX_NPARENS(rx); ++i) {
-        *p++ = (UV)RX_OFFS(rx)[i].start;
-        *p++ = (UV)RX_OFFS(rx)[i].end;
+        *p++ = (UV)RX_OFFSp(rx)[i].start;
+        *p++ = (UV)RX_OFFSp(rx)[i].end;
     }
 }
 
@@ -441,8 +439,8 @@ S_rxres_restore(pTHX_ void **rsp, REGEXP *rx)
     RX_SUBOFFSET(rx) = (I32)*p++;
     RX_SUBCOFFSET(rx) = (I32)*p++;
     for (i = 0; i <= RX_NPARENS(rx); ++i) {
-        RX_OFFS(rx)[i].start = (I32)(*p++);
-        RX_OFFS(rx)[i].end = (I32)(*p++);
+        RX_OFFSp(rx)[i].start = (I32)(*p++);
+        RX_OFFSp(rx)[i].end = (I32)(*p++);
     }
 }
 
@@ -574,7 +572,9 @@ PP(pp_formline)
             source = (U8 *)f;
             f += to_copy;
             trans = '~';
-            item_is_utf8 = targ_is_utf8 ? !!DO_UTF8(formsv) : !!SvUTF8(formsv);
+            item_is_utf8 = (targ_is_utf8)
+                           ? cBOOL(DO_UTF8(formsv))
+                           : cBOOL(SvUTF8(formsv));
             goto append;
 
         case FF_SKIP: /* skip <arg> chars in format */
@@ -876,15 +876,16 @@ PP(pp_formline)
             {
                 Size_t max = SvLEN(PL_formtarget) - (t - SvPVX(PL_formtarget));
                 int len;
-                DECLARATION_FOR_LC_NUMERIC_MANIPULATION;
-                STORE_LC_NUMERIC_SET_TO_NEEDED();
                 arg &= ~(FORM_NUM_POINT|FORM_NUM_BLANK);
 #ifdef USE_QUADMATH
                 {
                     int len;
                     if (!quadmath_format_valid(fmt))
                         Perl_croak_nocontext("panic: quadmath invalid format \"%s\"", fmt);
-                    len = quadmath_snprintf(t, max, fmt, (int) fieldsize, (int) arg, value);
+                    WITH_LC_NUMERIC_SET_TO_NEEDED(
+                        len = quadmath_snprintf(t, max, fmt, (int) fieldsize,
+                                               (int) arg, value);
+                    );
                     if (len == -1)
                         Perl_croak_nocontext("panic: quadmath_snprintf failed, format \"%s\"", fmt);
                 }
@@ -895,7 +896,6 @@ PP(pp_formline)
                 GCC_DIAG_RESTORE_STMT;
 #endif
                 PERL_MY_SNPRINTF_POST_GUARD(len, max);
-                RESTORE_LC_NUMERIC();
             }
             t += fieldsize;
             break;
@@ -969,6 +969,11 @@ PP(pp_formline)
 /* also used for: pp_mapstart() */
 PP(pp_grepstart)
 {
+    /* See the code comments at the start of pp_grepwhile() and
+     * pp_mapwhile() for an explanation of how the stack is used
+     * during a grep or map.
+     */
+
     dSP;
     SV *src;
 
@@ -979,8 +984,8 @@ PP(pp_grepstart)
         RETURNOP(PL_op->op_next->op_next);
     }
     PL_stack_sp = PL_stack_base + TOPMARK + 1;
-    Perl_pp_pushmark(aTHX);                            /* push dst */
-    Perl_pp_pushmark(aTHX);                            /* push src */
+    PUSHMARK(PL_stack_sp);                             /* push dst */
+    PUSHMARK(PL_stack_sp);                             /* push src */
     ENTER_with_name("grep");                                   /* enter outer scope */
 
     SAVETMPS;
@@ -998,14 +1003,70 @@ PP(pp_grepstart)
 
     PUTBACK;
     if (PL_op->op_type == OP_MAPSTART)
-        Perl_pp_pushmark(aTHX);                        /* push top */
-    return ((LOGOP*)PL_op->op_next)->op_other;
+        PUSHMARK(PL_stack_sp);                 /* push top */
+    return cLOGOPx(PL_op->op_next)->op_other;
 }
 
 /* pp_grepwhile() lives in pp_hot.c */
 
 PP(pp_mapwhile)
 {
+    /* Understanding the stack during a map.
+     *
+     * 'map expr, args' is implemented in the form of
+     *
+     *     grepstart; // which handles map too
+     *     do {
+     *          expr;
+     *          mapwhile;
+     *     } while (args);
+     *
+     * The stack examples below are in the form of 'perl -Ds' output,
+     * where any stack element indexed by PL_markstack_ptr[i] has a star
+     * just to the right of it.  In addition, the corresponding i value
+     * is displayed under the indexed stack element.
+     *
+     * On entry to mapwhile, the stack looks like this:
+     *
+     *      =>   *  A1..An  X1  *  X2..Xn  C  *  R1..Rn  *  E1..En
+     *      [-3]           [-2]          [-1]        [0]
+     *
+     * where:
+     *   A1..An   Accumulated results from all previous iterations of expr
+     *   X1..Xn   Random garbage
+     *   C        The current (just processed) arg, still aliased to $_.
+     *   R1..Rn   The args remaining to be processed.
+     *   E1..En   the (list) result of the just-executed map expression.
+     *
+     * Note that it is easiest to think of stack marks [-1] and [-2] as both
+     * being one too high, and so it would make more sense to have had the
+     * marks like this:
+     *
+     *      =>   *  A1..An  *  X1..Xn  *  C  R1..Rn  *  E1..En
+     *      [-3]       [-2]       [-1]           [0]
+     *
+     * where the stack is divided neatly into 4 groups:
+     *   - accumulated results
+     *   - discards and/or holes proactively created for later result storage
+     *   - being, or yet to be, processed,
+     *   - results of last expr
+     * But off-by-one is the way it is currently, and it works as long as
+     * we keep it consistent and bear it in mind.
+     *
+     * pp_mapwhile() does the following:
+     *
+     * - If there isn't enough space in the X1..Xn zone to insert the
+     *   expression results, grow the stack and shift up everything above C.
+     * - move E1..En to just above An
+     * - at the same time, manipulate the tmps stack so that temporaries
+     *   from executing expr can be freed without prematurely freeing
+     *   E1..En.
+     * - if on last iteration, pop all the marks, reset the stack pointer
+     *   and update the return args based on caller context.
+     * - else alias $_ to the next arg.
+     *
+     */
+
     dSP;
     const U8 gimme = GIMME_V;
     I32 items = (SP - PL_stack_base) - TOPMARK; /* how many new items */
@@ -1162,7 +1223,7 @@ PP(pp_flip)
     dSP;
 
     if (GIMME_V == G_LIST) {
-        RETURNOP(((LOGOP*)cUNOP->op_first)->op_other);
+        RETURNOP(cLOGOPx(cUNOP->op_first)->op_other);
     }
     else {
         dTOPss;
@@ -1191,7 +1252,7 @@ PP(pp_flip)
             else {
                 sv_setiv(targ, 0);
                 SP--;
-                RETURNOP(((LOGOP*)cUNOP->op_first)->op_other);
+                RETURNOP(cLOGOPx(cUNOP->op_first)->op_other);
             }
         }
         SvPVCLEAR(TARG);
@@ -1300,7 +1361,7 @@ PP(pp_flop)
         }
 
         if (flop) {
-            sv_setiv(PAD_SV(((UNOP*)cUNOP->op_first)->op_first->op_targ), 0);
+            sv_setiv(PAD_SV(cUNOPx(cUNOP->op_first)->op_first->op_targ), 0);
             sv_catpvs(targ, "E0");
         }
         SETs(targ);
@@ -1657,25 +1718,53 @@ void
 Perl_qerror(pTHX_ SV *err)
 {
     PERL_ARGS_ASSERT_QERROR;
+    if (err!=NULL) {
+        if (PL_in_eval) {
+            if (PL_in_eval & EVAL_KEEPERR) {
+                    Perl_ck_warner(aTHX_ packWARN(WARN_MISC), "\t(in cleanup) %" SVf,
+                                                        SVfARG(err));
+            }
+            else {
+                sv_catsv(ERRSV, err);
+            }
+        }
+        else if (PL_errors)
+            sv_catsv(PL_errors, err);
+        else
+            Perl_warn(aTHX_ "%" SVf, SVfARG(err));
 
-    if (PL_in_eval) {
-        if (PL_in_eval & EVAL_KEEPERR) {
-                Perl_ck_warner(aTHX_ packWARN(WARN_MISC), "\t(in cleanup) %" SVf,
-                                                    SVfARG(err));
+        if (PL_parser) {
+            ++PL_parser->error_count;
+        }
+    }
+
+    if ( PL_parser && (err == NULL ||
+         PL_parser->error_count >= PERL_STOP_PARSING_AFTER_N_ERRORS)
+    ) {
+        const char * const name = OutCopFILE(PL_curcop);
+        SV * errsv = NULL;
+        U8 raw_error_count = PERL_PARSE_ERROR_COUNT(PL_parser->error_count);
+
+        if (PL_in_eval) {
+            errsv = ERRSV;
+        }
+
+        if (err == NULL) {
+            abort_execution(errsv, name);
         }
         else
-            sv_catsv(ERRSV, err);
+        if (raw_error_count >= PERL_STOP_PARSING_AFTER_N_ERRORS) {
+            if (errsv) {
+                Perl_croak(aTHX_ "%" SVf "%s has too many errors.\n",
+                    SVfARG(errsv), name);
+            } else {
+                Perl_croak(aTHX_ "%s has too many errors.\n", name);
+            }
+        }
     }
-    else if (PL_errors)
-        sv_catsv(PL_errors, err);
-    else
-        Perl_warn(aTHX_ "%" SVf, SVfARG(err));
-    if (PL_parser)
-        ++PL_parser->error_count;
 }
 
 
-
 /* pop a CXt_EVAL context and in addition, if it was a require then
  * based on action:
  *     0: do nothing extra;
@@ -1954,7 +2043,7 @@ PP(pp_caller)
       else (void)POPs;
     }
 
-    cx = caller_cx(count + !!(PL_op->op_private & OPpOFFBYONE), &dbcx);
+    cx = caller_cx(count + cBOOL(PL_op->op_private & OPpOFFBYONE), &dbcx);
     if (!cx) {
         if (gimme != G_LIST) {
             EXTEND(SP, 1);
@@ -2067,7 +2156,7 @@ PP(pp_caller)
     mPUSHi(CopHINTS_get(cx->blk_oldcop));
     {
         SV * mask ;
-        STRLEN * const old_warnings = cx->blk_oldcop->cop_warnings ;
+        char *old_warnings = cx->blk_oldcop->cop_warnings;
 
         if  (old_warnings == pWARN_NONE)
             mask = newSVpvn(WARN_NONEstring, WARNsize) ;
@@ -2078,7 +2167,7 @@ PP(pp_caller)
             mask = newSVpvn(WARN_ALLstring, WARNsize) ;
         }
         else
-            mask = newSVpvn((char *) (old_warnings + 1), old_warnings[0]);
+            mask = newSVpvn(old_warnings, RCPV_LEN(old_warnings));
         mPUSHs(mask);
     }
 
@@ -2255,6 +2344,7 @@ PP(pp_enteriter)
         SV * const sv = POPs;
         itervarp = (void *)sv;
         if (LIKELY(isGV(sv))) {                /* symbol table variable */
+            SvREFCNT_inc_simple_void(sv);
             itersave = GvSV(sv);
             SvREFCNT_inc_simple_void(itersave);
             cxflags = CXp_FOR_GV;
@@ -2267,6 +2357,7 @@ PP(pp_enteriter)
             assert(SvMAGIC(sv)->mg_type == PERL_MAGIC_lvref);
             itersave = NULL;
             cxflags = CXp_FOR_LVREF;
+            SvREFCNT_inc_simple_void(sv);
         }
     }
     /* OPpITER_DEF (implicit $_) should only occur with a GV iter var */
@@ -2635,25 +2726,33 @@ S_unwind_loop(pTHX)
                 OP_NAME(PL_op));
     }
     else {
-        dSP;
         STRLEN label_len;
-        const char * const label =
-            PL_op->op_flags & OPf_STACKED
-                ? SvPV(TOPs,label_len)
-                : (label_len = strlen(cPVOP->op_pv), cPVOP->op_pv);
-        const U32 label_flags =
-            PL_op->op_flags & OPf_STACKED
-                ? SvUTF8(POPs)
-                : (cPVOP->op_private & OPpPV_IS_UTF8) ? SVf_UTF8 : 0;
-        PUTBACK;
+        const char * label;
+        U32 label_flags;
+        SV *sv;
+
+        if (PL_op->op_flags & OPf_STACKED) {
+            dSP;
+            sv = POPs;
+            PUTBACK;
+            label       = SvPV(sv, label_len);
+            label_flags = SvUTF8(sv);
+        }
+        else {
+            sv          = NULL; /* not needed, but shuts up compiler warn */
+            label       = cPVOP->op_pv;
+            label_len   = strlen(label);
+            label_flags = (cPVOP->op_private & OPpPV_IS_UTF8) ? SVf_UTF8 : 0;
+        }
+
         cxix = dopoptolabel(label, label_len, label_flags);
         if (cxix < 0)
             /* diag_listed_as: Label not found for "last %s" */
             Perl_croak(aTHX_ "Label not found for \"%s %" SVf "\"",
                                        OP_NAME(PL_op),
                                        SVfARG(PL_op->op_flags & OPf_STACKED
-                                              && !SvGMAGICAL(TOPp1s)
-                                              ? TOPp1s
+                                              && !SvGMAGICAL(sv)
+                                              ? sv
                                               : newSVpvn_flags(label,
                                                     label_len,
                                                     label_flags | SVs_TEMP)));
@@ -2878,6 +2977,7 @@ PP(pp_goto)
             PERL_CONTEXT *cx;
             CV *cv = MUTABLE_CV(SvRV(sv));
             AV *arg = GvAV(PL_defgv);
+            CV *old_cv = NULL;
 
             while (!CvROOT(cv) && !CvXSUB(cv)) {
                 const GV * const gv = CvGV(cv);
@@ -2981,7 +3081,13 @@ PP(pp_goto)
 
             if (CxTYPE(cx) == CXt_SUB) {
                 CvDEPTH(cx->blk_sub.cv) = cx->blk_sub.olddepth;
-                SvREFCNT_dec_NN(cx->blk_sub.cv);
+                /*on XS calls defer freeing the old CV as it could
+                 * prematurely set PL_op to NULL, which could cause
+                 * e..g XS subs using GIMME_V to SEGV */
+                if (CvISXSUB(cv))
+                    old_cv = cx->blk_sub.cv;
+                else
+                    SvREFCNT_dec_NN(cx->blk_sub.cv);
             }
 
             /* Now do some callish stuff. */
@@ -2989,10 +3095,13 @@ PP(pp_goto)
                 const SSize_t items = arg ? AvFILL(arg) + 1 : 0;
                 const bool m = arg ? cBOOL(SvRMAGICAL(arg)) : 0;
                 SV** mark;
+                UNOP fake_goto_op;
 
                 ENTER;
                 SAVETMPS;
                 SAVEFREESV(cv); /* later, undo the 'avoid premature free' hack */
+                if (old_cv)
+                    SAVEFREESV(old_cv); /* ditto, deferred freeing of old CV */
 
                 /* put GvAV(defgv) back onto stack */
                 if (items) {
@@ -3025,6 +3134,19 @@ PP(pp_goto)
                 PL_comppad = cx->blk_sub.prevcomppad;
                 PL_curpad = LIKELY(PL_comppad) ? AvARRAY(PL_comppad) : NULL;
 
+                /* Make a temporary a copy of the current GOTO op on the C
+                 * stack, but with a modified gimme (we can't modify the
+                 * real GOTO op as that's not thread-safe). This allows XS
+                 * users of GIMME_V to get the correct calling context,
+                 * even though there is no longer a CXt_SUB frame to
+                 * provide that information.
+                 */
+                Copy(PL_op, &fake_goto_op, 1, UNOP);
+                fake_goto_op.op_flags =
+                                  (fake_goto_op.op_flags & ~OPf_WANT)
+                                | (cx->blk_gimme & G_WANT);
+                PL_op = (OP*)&fake_goto_op;
+
                 /* XS subs don't have a CXt_SUB, so pop it;
                  * this is a cx_popblock(), less all the stuff we already did
                  * for cx_topblock() earlier */
@@ -3214,7 +3336,7 @@ PP(pp_goto)
                     ? 2
                     : 1;
             if (enterops[i])
-                deprecate("\"goto\" to jump into a construct");
+                deprecate(WARN_DEPRECATED__GOTO_CONSTRUCT, "Use of \"goto\" to jump into a construct");
         }
 
         /* pop unwanted frames */
@@ -3322,17 +3444,65 @@ S_save_lines(pTHX_ AV *array, SV *sv)
 /*
 =for apidoc docatch
 
-Check for the cases 0 or 3 of cur_env.je_ret, only used inside an eval context.
+Interpose, for the current op and RUNOPS loop,
 
-0 is used as continue inside eval,
+    - a new JMPENV stack catch frame, and
+    - an inner RUNOPS loop to run all the remaining ops following the
+      current PL_op.
 
-3 is used for a die caught by an inner eval - continue inner loop
+Then handle any exceptions raised while in that loop.
+For a caught eval at this level, re-enter the loop with the specified
+restart op (i.e. the op following the OP_LEAVETRY etc); otherwise re-throw
+the exception.
 
-See F<cop.h>: je_mustcatch, when set at any runlevel to TRUE, means eval ops must
-establish a local jmpenv to handle exception traps.
+docatch() is intended to be used like this:
+
+    PP(pp_entertry)
+    {
+        if (CATCH_GET)
+            return docatch(Perl_pp_entertry);
+
+        ... rest of function ...
+        return PL_op->op_next;
+    }
+
+If a new catch frame isn't needed, the op behaves normally. Otherwise it
+calls docatch(), which recursively calls pp_entertry(), this time with
+CATCH_GET() false, so the rest of the body of the entertry is run. Then
+docatch() calls CALLRUNOPS() which executes all the ops following the
+entertry. When the loop finally finishes, control returns to docatch(),
+which pops the JMPENV and returns to the parent pp_entertry(), which
+itself immediately returns. Note that *all* subsequent ops are run within
+the inner RUNOPS loop, not just the body of the eval. For example, in
+
+    sub TIEARRAY { eval {1}; my $x }
+    tie @a, "main";
+
+at the point the 'my' is executed, the C stack will look something like:
+
+    #10 main()
+    #9  perl_run()              # JMPENV_PUSH level 1 here
+    #8  S_run_body()
+    #7  Perl_runops_standard()  # main RUNOPS loop
+    #6  Perl_pp_tie()
+    #5  Perl_call_sv()
+    #4  Perl_runops_standard()  # unguarded RUNOPS loop: no new JMPENV
+    #3  Perl_pp_entertry()
+    #2  S_docatch()             # JMPENV_PUSH level 2 here
+    #1  Perl_runops_standard()  # docatch()'s RUNOPs loop
+    #0  Perl_pp_padsv()
+
+Basically, any section of the perl core which starts a RUNOPS loop may
+make a promise that it will catch any exceptions and restart the loop if
+necessary. If it's not prepared to do that (like call_sv() isn't), then
+it sets CATCH_GET() to true, so that any later eval-like code knows to
+set up a new handler and loop (via docatch()).
+
+See L<perlinterp/"Exception handing"> for further details.
 
 =cut
 */
+
 STATIC OP *
 S_docatch(pTHX_ Perl_ppaddr_t firstpp)
 {
@@ -3340,18 +3510,23 @@ S_docatch(pTHX_ Perl_ppaddr_t firstpp)
     OP * const oldop = PL_op;
     dJMPENV;
 
-    assert(CATCH_GET == TRUE);
-
+    assert(CATCH_GET);
     JMPENV_PUSH(ret);
+    assert(!CATCH_GET);
+
     switch (ret) {
-    case 0:
+    case 0: /* normal flow-of-control return from JMPENV_PUSH */
+
+        /* re-run the current op, this time executing the full body of the
+         * pp function */
         PL_op = firstpp(aTHX);
  redo_body:
         if (PL_op) {
             CALLRUNOPS(aTHX);
         }
         break;
-    case 3:
+
+    case 3: /* an exception raised within an eval */
         if (PL_restartjmpenv == PL_top_env) {
             /* die caught by an inner eval - continue inner loop */
 
@@ -3363,10 +3538,11 @@ S_docatch(pTHX_ Perl_ppaddr_t firstpp)
             goto redo_body;
         }
         /* FALLTHROUGH */
+
     default:
         JMPENV_POP;
         PL_op = oldop;
-        JMPENV_JUMP(ret);
+        JMPENV_JUMP(ret); /* re-throw the exception */
         NOT_REACHED; /* NOTREACHED */
     }
     JMPENV_POP;
@@ -3443,16 +3619,39 @@ Perl_find_runcv_where(pTHX_ U8 cond, IV arg, U32 *db_seqp)
 }
 
 
-/* Run yyparse() in a setjmp wrapper. Returns:
+/* S_try_yyparse():
+ *
+ * Run yyparse() in a setjmp wrapper. Returns:
  *   0: yyparse() successful
  *   1: yyparse() failed
  *   3: yyparse() died
+ *
+ * This is used to trap Perl_croak() calls that are executed
+ * during the compilation process and before the code has been
+ * completely compiled. It is expected to be called from
+ * doeval_compile() only. The parameter 'caller_op' is
+ * only used in DEBUGGING to validate the logic is working
+ * correctly.
+ *
+ * See also try_run_unitcheck().
+ *
  */
 STATIC int
-S_try_yyparse(pTHX_ int gramtype)
+S_try_yyparse(pTHX_ int gramtype, OP *caller_op)
 {
-    int ret;
+    /* if we die during compilation PL_restartop and PL_restartjmpenv
+     * will be set by Perl_die_unwind(). We need to restore their values
+     * if that happens as they are intended for the case where the code
+     * compiles and dies during execution, not where it dies during
+     * compilation. PL_restartop and caller_op->op_next should be the
+     * same anyway, and when compilation fails then caller_op->op_next is
+     * used as the next op after the compile.
+     */
+    JMPENV *restartjmpenv = PL_restartjmpenv;
+    OP *restartop = PL_restartop;
     dJMPENV;
+    int ret;
+    PERL_UNUSED_ARG(caller_op); /* only used in debugging builds */
 
     assert(CxTYPE(CX_CUR()) == CXt_EVAL);
     JMPENV_PUSH(ret);
@@ -3461,6 +3660,11 @@ S_try_yyparse(pTHX_ int gramtype)
         ret = yyparse(gramtype) ? 1 : 0;
         break;
     case 3:
+        /* yyparse() died and we trapped the error. We need to restore
+         * the old PL_restartjmpenv and PL_restartop values. */
+        assert(PL_restartop == caller_op->op_next); /* we expect these to match */
+        PL_restartjmpenv = restartjmpenv;
+        PL_restartop = restartop;
         break;
     default:
         JMPENV_POP;
@@ -3471,6 +3675,67 @@ S_try_yyparse(pTHX_ int gramtype)
     return ret;
 }
 
+/* S_try_run_unitcheck()
+ *
+ * Run PL_unitcheckav in a setjmp wrapper via call_list.
+ * Returns:
+ *   0: unitcheck blocks ran without error
+ *   3: a unitcheck block died
+ *
+ * This is used to trap Perl_croak() calls that are executed
+ * during UNITCHECK blocks executed after the compilation
+ * process has completed but before the code itself has been
+ * executed via the normal run loops. It is expected to be called
+ * from doeval_compile() only. The parameter 'caller_op' is
+ * only used in DEBUGGING to validate the logic is working
+ * correctly.
+ *
+ * See also try_yyparse().
+ */
+STATIC int
+S_try_run_unitcheck(pTHX_ OP* caller_op)
+{
+    /* if we die during compilation PL_restartop and PL_restartjmpenv
+     * will be set by Perl_die_unwind(). We need to restore their values
+     * if that happens as they are intended for the case where the code
+     * compiles and dies during execution, not where it dies during
+     * compilation. UNITCHECK runs after compilation completes, and
+     * if it dies we will execute the PL_restartop anyway via the
+     * failed compilation code path. PL_restartop and caller_op->op_next
+     * should be the same anyway, and when compilation fails then
+     * caller_op->op_next is  used as the next op after the compile.
+     */
+    JMPENV *restartjmpenv = PL_restartjmpenv;
+    OP *restartop = PL_restartop;
+    dJMPENV;
+    int ret;
+    PERL_UNUSED_ARG(caller_op); /* only used in debugging builds */
+
+    assert(CxTYPE(CX_CUR()) == CXt_EVAL);
+    JMPENV_PUSH(ret);
+    switch (ret) {
+    case 0:
+        call_list(PL_scopestack_ix, PL_unitcheckav);
+        break;
+    case 3:
+        /* call_list died */
+        /* call_list() died and we trapped the error. We should restore
+         * the old PL_restartjmpenv and PL_restartop values, as they are
+         * used only in the case where the code was actually run.
+         * The assert validates that we will still execute the PL_restartop.
+         */
+        assert(PL_restartop == caller_op->op_next); /* we expect these to match */
+        PL_restartjmpenv = restartjmpenv;
+        PL_restartop = restartop;
+        break;
+    default:
+        JMPENV_POP;
+        JMPENV_JUMP(ret);
+        NOT_REACHED; /* NOTREACHED */
+    }
+    JMPENV_POP;
+    return ret;
+}
 
 /* Compile a require/do or an eval ''.
  *
@@ -3610,22 +3875,30 @@ S_doeval_compile(pTHX_ U8 gimme, CV* outside, U32 seq, HV *hh)
 
     CALL_BLOCK_HOOKS(bhk_eval, saveop);
 
-    /* note that yyparse() may raise an exception, e.g. C<BEGIN{die}>,
-     * so honour CATCH_GET and trap it here if necessary */
+    /* we should never be CATCH_GET true here, as our immediate callers should
+     * always handle that case. */
+    assert(!CATCH_GET);
+    /* compile the code */
 
 
-    /* compile the code */
-    yystatus = (!in_require && CATCH_GET) ? S_try_yyparse(aTHX_ GRAMPROG) : yyparse(GRAMPROG);
+    yystatus = (!in_require)
+               ? S_try_yyparse(aTHX_ GRAMPROG, saveop)
+               : yyparse(GRAMPROG);
 
     if (yystatus || PL_parser->error_count || !PL_eval_root) {
         PERL_CONTEXT *cx;
         SV *errsv;
 
         PL_op = saveop;
-        /* note that if yystatus == 3, then the require/eval died during
-         * compilation, so the EVAL CX block has already been popped, and
-         * various vars restored */
         if (yystatus != 3) {
+            /* note that if yystatus == 3, then the require/eval died during
+             * compilation, so the EVAL CX block has already been popped, and
+             * various vars restored. This block applies similar steps after
+             * the other "failed to compile" cases in yyparse, eg, where
+             * yystatus=1, "failed, but did not die". */
+
+            if (!in_require)
+                invoke_exception_hook(ERRSV,FALSE);
             if (PL_eval_root) {
                 op_free(PL_eval_root);
                 PL_eval_root = NULL;
@@ -3633,6 +3906,10 @@ S_doeval_compile(pTHX_ U8 gimme, CV* outside, U32 seq, HV *hh)
             SP = PL_stack_base + POPMARK;      /* pop original mark */
             cx = CX_CUR();
             assert(CxTYPE(cx) == CXt_EVAL);
+            /* If we are in an eval we need to make sure that $SIG{__DIE__}
+             * handler is invoked so we simulate that part of the
+             * Perl_die_unwind() process. In a require we will croak
+             * so it will happen there. */
             /* pop the CXt_EVAL, and if was a require, croak */
             S_pop_eval_context_maybe_croak(aTHX_ cx, ERRSV, 2);
         }
@@ -3646,6 +3923,7 @@ S_doeval_compile(pTHX_ U8 gimme, CV* outside, U32 seq, HV *hh)
         if (!*(SvPV_nolen_const(errsv)))
             sv_setpvs(errsv, "Compilation error");
 
+
         if (gimme != G_LIST) PUSHs(&PL_sv_undef);
         PUTBACK;
         return FALSE;
@@ -3673,9 +3951,31 @@ S_doeval_compile(pTHX_ U8 gimme, CV* outside, U32 seq, HV *hh)
         }
     }
 
-    if (PL_unitcheckav) {
+    if (PL_unitcheckav && av_count(PL_unitcheckav)>0) {
         OP *es = PL_eval_start;
-        call_list(PL_scopestack_ix, PL_unitcheckav);
+        /* TODO: are we sure we shouldn't do S_try_run_unitcheck()
+        * when `in_require` is true? */
+        if (in_require) {
+            call_list(PL_scopestack_ix, PL_unitcheckav);
+        }
+        else if (S_try_run_unitcheck(aTHX_ saveop)) {
+            /* there was an error! */
+
+            /* Restore PL_OP */
+            PL_op = saveop;
+
+            SV *errsv = ERRSV;
+            if (!*(SvPV_nolen_const(errsv))) {
+                /* This happens when using:
+                 * eval qq# UNITCHECK { die "\x00"; } #;
+                 */
+                sv_setpvs(errsv, "Unit check error");
+            }
+
+            if (gimme != G_LIST) PUSHs(&PL_sv_undef);
+            PUTBACK;
+            return FALSE;
+        }
         PL_eval_start = es;
     }
 
@@ -3934,6 +4234,46 @@ S_require_file(pTHX_ SV *sv)
     if (!(name && len > 0 && *name))
         DIE(aTHX_ "Missing or undefined argument to %s", op_name);
 
+    if (
+        PL_hook__require__before
+        && SvROK(PL_hook__require__before)
+        && SvTYPE(SvRV(PL_hook__require__before)) == SVt_PVCV
+    ) {
+        SV* name_sv = sv_mortalcopy(sv);
+        SV *post_hook__require__before_sv = NULL;
+
+        ENTER_with_name("call_PRE_REQUIRE");
+        SAVETMPS;
+        EXTEND(SP, 1);
+        PUSHMARK(SP);
+        PUSHs(name_sv); /* always use the object for method calls */
+        PUTBACK;
+        int count = call_sv(PL_hook__require__before, G_SCALAR);
+        SPAGAIN;
+        if (count && SvOK(*SP) && SvROK(*SP) && SvTYPE(SvRV(*SP)) == SVt_PVCV)
+            post_hook__require__before_sv = SvREFCNT_inc_simple_NN(*SP);
+        if (!sv_streq(name_sv,sv)) {
+            /* they modified the name argument, so do some sleight of hand */
+            name = SvPV_nomg_const(name_sv, len);
+            if (!(name && len > 0 && *name))
+                DIE(aTHX_ "Missing or undefined argument to %s via %%{^HOOK}{require__before}",
+                        op_name);
+            sv = SvREFCNT_inc_simple_NN(name_sv);
+        }
+        FREETMPS;
+        LEAVE_with_name("call_PRE_REQUIRE");
+        if (post_hook__require__before_sv) {
+            MORTALDESTRUCTOR_SV(post_hook__require__before_sv, newSVsv(sv));
+        }
+    }
+    if (
+        PL_hook__require__after
+        && SvROK(PL_hook__require__after)
+        && SvTYPE(SvRV(PL_hook__require__after)) == SVt_PVCV
+    ) {
+        MORTALDESTRUCTOR_SV(PL_hook__require__after, newSVsv(sv));
+    }
+
 #ifndef VMS
         /* try to return earlier (save the SAFE_PATHNAME check) if INC already got the name */
         if (op_is_require) {
@@ -3996,7 +4336,7 @@ S_require_file(pTHX_ SV *sv)
 
         /*XXX OPf_KIDS should always be true? -dapm 4/2017 */
         if (PL_op->op_flags & OPf_KIDS) {
-            SVOP * const kid = (SVOP*)cUNOP->op_first;
+            SVOP * const kid = cSVOPx(cUNOP->op_first);
 
             if (kid->op_type == OP_CONST && (kid->op_private & OPpCONST_BARE)) {
                 /* Make sure that a bareword module name (e.g. ::Foo::Bar)
@@ -4059,58 +4399,145 @@ S_require_file(pTHX_ SV *sv)
      *
      * For searchable paths, just search @INC normally
      */
+    AV *inc_checked = (AV*)sv_2mortal((SV*)newAV());
     if (!tryrsfp && !(errno == EACCES && !path_searchable)) {
-        AV * const ar = GvAVn(PL_incgv);
-        SSize_t i;
+        SSize_t inc_idx;
 #ifdef VMS
         if (vms_unixname)
 #endif
         {
-            SV *nsv = sv;
+            AV *incdir_av = (AV*)sv_2mortal((SV*)newAV());
+            SV *nsv = sv; /* non const copy we can change if necessary */
             namesv = newSV_type(SVt_PV);
-            for (i = 0; i <= AvFILL(ar); i++) {
-                SV * const dirsv = *av_fetch(ar, i, TRUE);
+            AV *inc_ar = GvAVn(PL_incgv);
+            SSize_t incdir_continue_inc_idx = -1;
+
+            for (
+                inc_idx = 0;
+                (AvFILL(incdir_av)>=0 /* we have INCDIR items pending */
+                    || inc_idx <= AvFILL(inc_ar));  /* @INC entries remain */
+                inc_idx++
+            ) {
+                SV *dirsv;
+
+                /* do we have any pending INCDIR items? */
+                if (AvFILL(incdir_av)>=0) {
+                    /* yep, shift it out */
+                    dirsv = av_shift(incdir_av);
+                    if (AvFILL(incdir_av)<0) {
+                        /* incdir is now empty, continue from where
+                         * we left off after we process this entry  */
+                        inc_idx = incdir_continue_inc_idx;
+                    }
+                } else {
+                    dirsv = *av_fetch(inc_ar, inc_idx, TRUE);
+                }
+
+                if (SvGMAGICAL(dirsv)) {
+                    SvGETMAGIC(dirsv);
+                    dirsv = newSVsv_nomg(dirsv);
+                } else {
+                    /* on the other hand, since we aren't copying we do need
+                     * to increment */
+                    SvREFCNT_inc(dirsv);
+                }
+                if (!SvOK(dirsv))
+                    continue;
+
+                av_push(inc_checked, dirsv);
 
-                SvGETMAGIC(dirsv);
                 if (SvROK(dirsv)) {
                     int count;
                     SV **svp;
                     SV *loader = dirsv;
+                    UV diruv = PTR2UV(SvRV(dirsv));
 
                     if (SvTYPE(SvRV(loader)) == SVt_PVAV
                         && !SvOBJECT(SvRV(loader)))
                     {
                         loader = *av_fetch(MUTABLE_AV(SvRV(loader)), 0, TRUE);
-                        SvGETMAGIC(loader);
+                        if (SvGMAGICAL(loader)) {
+                            SvGETMAGIC(loader);
+                            SV *l = sv_newmortal();
+                            sv_setsv_nomg(l, loader);
+                            loader = l;
+                        }
                     }
 
-                    Perl_sv_setpvf(aTHX_ namesv, "/loader/0x%" UVxf "/%s",
-                                   PTR2UV(SvRV(dirsv)), name);
-                    tryname = SvPVX_const(namesv);
-                    tryrsfp = NULL;
-
                     if (SvPADTMP(nsv)) {
                         nsv = sv_newmortal();
                         SvSetSV_nosteal(nsv,sv);
                     }
 
-                    ENTER_with_name("call_INC");
-                    SAVETMPS;
-                    EXTEND(SP, 2);
+                    const char *method = NULL;
+                    bool is_incdir = FALSE;
+                    SV * inc_idx_sv = save_scalar(PL_incgv);
+                    sv_setiv(inc_idx_sv,inc_idx);
+                    if (sv_isobject(loader)) {
+                        /* if it is an object and it has an INC method, then
+                         * call the method.
+                         */
+                        HV *pkg = SvSTASH(SvRV(loader));
+                        GV * gv = gv_fetchmethod_pvn_flags(pkg, "INC", 3, GV_AUTOLOAD);
+                        if (gv && isGV(gv)) {
+                            method = "INC";
+                        } else {
+                            /* no point to autoload here, it would have been found above */
+                            gv = gv_fetchmethod_pvn_flags(pkg, "INCDIR", 6, 0);
+                            if (gv && isGV(gv)) {
+                                method = "INCDIR";
+                                is_incdir = TRUE;
+                            }
+                        }
+                        /* But if we have no method, check if this is a
+                         * coderef, if it is then we treat it as an
+                         * unblessed coderef would be treated: we
+                         * execute it. If it is some other and it is in
+                         * an array ref wrapper, then really we don't
+                         * know what to do with it, (why use the
+                         * wrapper?) and we throw an exception to help
+                         * debug. If it is not in a wrapper assume it
+                         * has an overload and treat it as a string.
+                         * Maybe in the future we can detect if it does
+                         * have overloading and throw an error if not.
+                         */
+                        if (!method) {
+                            if (SvTYPE(SvRV(loader)) != SVt_PVCV) {
+                                if (amagic_applies(loader,string_amg,AMGf_unary))
+                                    goto treat_as_string;
+                                else {
+                                    croak("Can't locate object method \"INC\", nor"
+                                          " \"INCDIR\" nor string overload via"
+                                          " package %" HvNAMEf_QUOTEDPREFIX " %s"
+                                          " in @INC", pkg,
+                                          dirsv == loader
+                                          ? "in object hook"
+                                          : "in object in ARRAY hook"
+                                    );
+                                }
+                            }
+                        }
+                    }
 
+                    Perl_sv_setpvf(aTHX_ namesv, "/loader/0x%" UVxf "/%s",
+                                   diruv, name);
+                    tryname = SvPVX_const(namesv);
+                    tryrsfp = NULL;
+
+                    ENTER_with_name("call_INC_hook");
+                    SAVETMPS;
+                    EXTEND(SP, 2 + ((method && (loader != dirsv)) ? 1 : 0));
                     PUSHMARK(SP);
-                    PUSHs(dirsv);
+                    PUSHs(method ? loader : dirsv); /* always use the object for method calls */
                     PUSHs(nsv);
+                    if (method && (loader != dirsv)) /* add the args array for method calls */
+                        PUSHs(dirsv);
                     PUTBACK;
-                    if (SvGMAGICAL(loader)) {
-                        SV *l = sv_newmortal();
-                        sv_setsv_nomg(l, loader);
-                        loader = l;
+                    if (method) {
+                        count = call_method(method, G_LIST|G_EVAL);
+                    } else {
+                        count = call_sv(loader, G_LIST|G_EVAL);
                     }
-                    if (sv_isobject(loader))
-                        count = call_method("INC", G_LIST);
-                    else
-                        count = call_sv(loader, G_LIST);
                     SPAGAIN;
 
                     if (count > 0) {
@@ -4118,6 +4545,48 @@ S_require_file(pTHX_ SV *sv)
                         SV *arg;
 
                         SP -= count - 1;
+
+                        if (is_incdir) {
+                            /* push the stringified returned items into the
+                             * incdir_av array for processing immediately
+                             * afterwards. we deliberately stringify or copy
+                             * "special" arguments, so that overload logic for
+                             * instance applies, but so that the end result is
+                             * stable. We speficially do *not* support returning
+                             * coderefs from an INCDIR call. */
+                            while (count-->0) {
+                                arg = SP[i++];
+                                SvGETMAGIC(arg);
+                                if (!SvOK(arg))
+                                    continue;
+                                if (SvROK(arg)) {
+                                    STRLEN l;
+                                    char *pv = SvPV(arg,l);
+                                    arg = newSVpvn(pv,l);
+                                }
+                                else if (SvGMAGICAL(arg)) {
+                                    arg = newSVsv_nomg(arg);
+                                }
+                                else {
+                                    SvREFCNT_inc(arg);
+                                }
+                                av_push(incdir_av, arg);
+                            }
+                            /* We copy $INC into incdir_continue_inc_idx
+                             * so that when we finish processing the items
+                             * we just inserted into incdir_av we can continue
+                             * as though we had just finished executing the INCDIR
+                             * hook. We honour $INC here just like we would for
+                             * an INC hook, the hook might have rewritten @INC
+                             * at the same time as returning something to us.
+                             */
+                            inc_idx_sv = GvSVn(PL_incgv);
+                            incdir_continue_inc_idx = SvOK(inc_idx_sv)
+                                                      ? SvIV(inc_idx_sv) : -1;
+
+                            goto done_hook;
+                        }
+
                         arg = SP[i++];
 
                         if (SvROK(arg) && (SvTYPE(SvRV(arg)) <= SVt_PVLV)
@@ -4166,15 +4635,62 @@ S_require_file(pTHX_ SV *sv)
                             tryrsfp = PerlIO_open(BIT_BUCKET,
                                                   PERL_SCRIPT_MODE);
                         }
+                        done_hook:
                         SP--;
+                    } else {
+                        SV *errsv= ERRSV;
+                        if (SvTRUE(errsv) && !SvROK(errsv)) {
+                            STRLEN l;
+                            char *pv= SvPV(errsv,l);
+                            /* Heuristic to tell if this error message
+                             * includes the standard line number info:
+                             * check if the line ends in digit dot newline.
+                             * If it does then we add some extra info so
+                             * its obvious this is coming from a hook.
+                             * If it is a user generated error we try to
+                             * leave it alone. l>12 is to ensure the
+                             * other checks are in string, but also
+                             * accounts for "at ... line 1.\n" to a
+                             * certain extent. Really we should check
+                             * further, but this is good enough for back
+                             * compat I think.
+                             */
+                            if (l>=12 && pv[l-1] == '\n' && pv[l-2] == '.' && isDIGIT(pv[l-3]))
+                                sv_catpvf(errsv, "%s %s hook died--halting @INC search",
+                                          method ? method : "INC",
+                                          method ? "method" : "sub");
+                            croak_sv(errsv);
+                        }
                     }
 
                     /* FREETMPS may free our filter_cache */
                     SvREFCNT_inc_simple_void(filter_cache);
 
+                    /*
+                     Let the hook override which @INC entry we visit
+                     next by setting $INC to a different value than it
+                     was before we called the hook. If they have
+                     completely rewritten the array they might want us
+                     to start traversing from the beginning, which is
+                     represented by -1. We use undef as an equivalent of
+                     -1. This can't be used as a way to call a hook
+                     twice, as we still dedupe.
+                     We have to do this before we LEAVE, as we localized
+                     $INC before we called the hook.
+                    */
+                    inc_idx_sv = GvSVn(PL_incgv);
+                    inc_idx = SvOK(inc_idx_sv) ? SvIV(inc_idx_sv) : -1;
+
                     PUTBACK;
                     FREETMPS;
-                    LEAVE_with_name("call_INC");
+                    LEAVE_with_name("call_INC_hook");
+
+                    /*
+                     It is possible that @INC has been replaced and that inc_ar
+                     now points at a freed AV. So we have to refresh it from
+                     the GV to be sure.
+                    */
+                    inc_ar = GvAVn(PL_incgv);
 
                     /* Now re-mortalize it. */
                     sv_2mortal(filter_cache);
@@ -4182,8 +4698,24 @@ S_require_file(pTHX_ SV *sv)
                     /* Adjust file name if the hook has set an %INC entry.
                        This needs to happen after the FREETMPS above.  */
                     svp = hv_fetch(GvHVn(PL_incgv), name, len, 0);
-                    if (svp)
-                        tryname = SvPV_nolen_const(*svp);
+                    /* we have to make sure that the value is not undef
+                     * or the empty string, if it is then we should not
+                     * set tryname to it as this will break error messages.
+                     *
+                     * This might happen if an @INC hook evals the module
+                     * which was required in the first place and which
+                     * triggered the @INC hook, and that eval dies.
+                     * See https://github.com/Perl/perl5/issues/20535
+                     */
+                    if (svp && SvOK(*svp)) {
+                        STRLEN len;
+                        const char *tmp_pv = SvPV_const(*svp,len);
+                        /* we also guard against the deliberate empty string.
+                         * We do not guard against '0', if people want to set their
+                         * file name to 0 that is up to them. */
+                        if (len)
+                            tryname = tmp_pv;
+                    }
 
                     if (tryrsfp) {
                         hook_sv = dirsv;
@@ -4201,12 +4733,13 @@ S_require_file(pTHX_ SV *sv)
                         filter_sub = NULL;
                     }
                 }
-                else if (path_searchable) {
+                else
+                    treat_as_string:
+                    if (path_searchable) {
                     /* match against a plain @INC element (non-searchable
                      * paths are only matched against refs in @INC) */
                     const char *dir;
                     STRLEN dirlen;
-
                     if (SvOK(dirsv)) {
                         dir = SvPV_nomg_const(dirsv, dirlen);
                     } else {
@@ -4286,14 +4819,15 @@ S_require_file(pTHX_ SV *sv)
                 DIE(aTHX_ "Can't locate %s:   %s: %s",
                     name, tryname, Strerror(saved_errno));
             } else {
-                if (path_searchable) {         /* did we lookup @INC? */
-                    AV * const ar = GvAVn(PL_incgv);
+                if (path_searchable) {          /* did we lookup @INC? */
                     SSize_t i;
                     SV *const msg = newSVpvs_flags("", SVs_TEMP);
                     SV *const inc = newSVpvs_flags("", SVs_TEMP);
-                    for (i = 0; i <= AvFILL(ar); i++) {
+                    for (i = 0; i <= AvFILL(inc_checked); i++) {
+                        SV **svp= av_fetch(inc_checked, i, TRUE);
+                        if (!svp || !*svp) continue;
                         sv_catpvs(inc, " ");
-                        sv_catsv(inc, *av_fetch(ar, i, TRUE));
+                        sv_catsv(inc, *svp);
                     }
                     if (memENDPs(name, len, ".pm")) {
                         const char *e = name + len - (sizeof(".pm") - 1);
@@ -4347,7 +4881,7 @@ S_require_file(pTHX_ SV *sv)
 
                     /* diag_listed_as: Can't locate %s */
                     DIE(aTHX_
-                        "Can't locate %s in @INC%" SVf " (@INC contains:%" SVf ")",
+                        "Can't locate %s in @INC%" SVf " (@INC entries checked:%" SVf ")",
                         name, msg, inc);
                 }
             }
@@ -4361,7 +4895,7 @@ S_require_file(pTHX_ SV *sv)
             /* the complication is to match the logic from doopen_pm() so
              * we don't treat do "sda1" as a previously successful "do".
             */
-            bool do_warn = namesv && ckWARN_d(WARN_DEPRECATED)
+            bool do_warn = namesv && ckWARN_d(WARN_DEPRECATED__DOT_IN_INC)
                 && PerlLIO_stat(name, &st) == 0 && !S_ISDIR(st.st_mode) && !S_ISBLK(st.st_mode)
                 && (io = PerlIO_openn(aTHX_ ":", PERL_SCRIPT_MODE, -1, 0, 0, NULL, 1, &sv)) != NULL;
             if (io)
@@ -4369,7 +4903,7 @@ S_require_file(pTHX_ SV *sv)
 
             RESTORE_ERRNO;
             if (do_warn) {
-                Perl_warner(aTHX_ packWARN(WARN_DEPRECATED),
+                Perl_warner(aTHX_ packWARN(WARN_DEPRECATED__DOT_IN_INC),
                 "do \"%s\" failed, '.' is no longer in @INC; "
                 "did you mean do \"./%s\"?",
                 name, name);
@@ -4389,10 +4923,13 @@ S_require_file(pTHX_ SV *sv)
         (void)hv_store(GvHVn(PL_incgv),
                        unixname, unixlen, newSVpv(tryname,0),0);
     } else {
+        /* store the hook in the sv, note we have to *copy* hook_sv,
+         * we don't want modifications to it to change @INC - see GH #20577
+         */
         SV** const svp = hv_fetch(GvHVn(PL_incgv), unixname, unixlen, 0);
         if (!svp)
             (void)hv_store(GvHVn(PL_incgv),
-                           unixname, unixlen, SvREFCNT_inc_simple(hook_sv), 0 );
+                           unixname, unixlen, newSVsv(hook_sv), 0 );
     }
 
     /* Now parse the file */
@@ -4441,7 +4978,15 @@ S_require_file(pTHX_ SV *sv)
 
 PP(pp_require)
 {
-    RUN_PP_CATCHABLY(Perl_pp_require);
+    /* If a suitable JMPENV catch frame isn't present, call docatch(),
+     * which will:
+     *   - add such a frame, and
+     *   - start a new RUNOPS loop, which will (as the first op to run),
+     *     recursively call this pp function again.
+     * The main body of this function is then executed by the inner call.
+     */
+    if (CATCH_GET)
+        return docatch(Perl_pp_require);
 
     {
         dSP;
@@ -4484,7 +5029,17 @@ PP(pp_entereval)
     bool bytes;
     I32 old_savestack_ix;
 
-    RUN_PP_CATCHABLY(Perl_pp_entereval);
+    /* If a suitable JMPENV catch frame isn't present, call docatch(),
+     * which will:
+     *   - add such a frame, and
+     *   - start a new RUNOPS loop, which will (as the first op to run),
+     *     recursively call this pp function again.
+     * The main body of this function is then executed by the inner call.
+     */
+    if (CATCH_GET)
+        return docatch(Perl_pp_entereval);
+
+    assert(!CATCH_GET);
 
     gimme = GIMME_V;
     was = PL_breakable_sub_gen;
@@ -4542,9 +5097,9 @@ PP(pp_entereval)
 
     if (PERLDB_NAMEEVAL && CopLINE(PL_curcop)) {
         SV * const temp_sv = sv_newmortal();
-        Perl_sv_setpvf(aTHX_ temp_sv, "_<(eval %lu)[%s:%" IVdf "]",
+        Perl_sv_setpvf(aTHX_ temp_sv, "_<(eval %lu)[%s:%" LINE_Tf "]",
                        (unsigned long)++PL_evalseq,
-                       CopFILE(PL_curcop), (IV)CopLINE(PL_curcop));
+                       CopFILE(PL_curcop), CopLINE(PL_curcop));
         tmpbuf = SvPVX(temp_sv);
         len = SvCUR(temp_sv);
     }
@@ -4602,6 +5157,9 @@ PP(pp_entereval)
         } else if (!saved_delete) {
             (void)hv_delete(PL_defstash, tmpbuf, len, G_DISCARD);
         }
+        if (PL_op->op_private & OPpEVAL_EVALSV)
+            /* signal compiletime failure to our eval_sv() caller */
+            *++PL_stack_sp = NULL;
         return PL_op->op_next;
     }
 }
@@ -4616,6 +5174,7 @@ PP(pp_leaveeval)
     PERL_CONTEXT *cx;
     OP *retop;
     int failed;
+    bool override_return = FALSE; /* is feature 'module_true' in effect? */
     CV *evalcv;
     bool keep;
 
@@ -4627,8 +5186,57 @@ PP(pp_leaveeval)
     oldsp = PL_stack_base + cx->blk_oldsp;
     gimme = cx->blk_gimme;
 
-    /* did require return a false value? */
-    failed =    CxOLD_OP_TYPE(cx) == OP_REQUIRE
+    bool is_require= CxOLD_OP_TYPE(cx) == OP_REQUIRE;
+    if (is_require) {
+        /* We are in an require. Check if use feature 'module_true' is enabled,
+         * and if so later on correct any returns from the require. */
+
+        /* we might be called for an OP_LEAVEEVAL or OP_RETURN opcode
+         * and the parse tree will look different for either case.
+         * so find the right op to check later */
+        if (OP_TYPE_IS_OR_WAS(PL_op, OP_RETURN)) {
+            if (PL_op->op_flags & OPf_SPECIAL)
+                override_return = true;
+        }
+        else if ((PL_op->op_flags & OPf_KIDS) && OP_TYPE_IS_OR_WAS(PL_op, OP_LEAVEEVAL)){
+            COP *old_pl_curcop = PL_curcop;
+            OP *check = cUNOPx(PL_op)->op_first;
+
+            /* ok, we found something to check, we need to scan through
+             * it and find the last OP_NEXTSTATE it contains and then read the
+             * feature state out of the COP data it contains.
+             */
+            if (check) {
+                if (!OP_TYPE_IS(check,OP_STUB)) {
+                    const OP *kid = cLISTOPx(check)->op_first;
+                    const OP *last_state = NULL;
+
+                    for (; kid; kid = OpSIBLING(kid)) {
+                        if (
+                               OP_TYPE_IS_OR_WAS(kid, OP_NEXTSTATE)
+                            || OP_TYPE_IS_OR_WAS(kid, OP_DBSTATE)
+                        ){
+                            last_state = kid;
+                        }
+                    }
+                    if (last_state) {
+                        PL_curcop = cCOPx(last_state);
+                        if (FEATURE_MODULE_TRUE_IS_ENABLED) {
+                            override_return = TRUE;
+                        }
+                    } else {
+                        NOT_REACHED; /* NOTREACHED */
+                    }
+                }
+            } else {
+                NOT_REACHED; /* NOTREACHED */
+            }
+            PL_curcop = old_pl_curcop;
+        }
+    }
+
+    /* we might override this later if 'module_true' is enabled */
+    failed =    is_require
              && !(gimme == G_SCALAR
                     ? SvTRUE_NN(*PL_stack_sp)
                     : PL_stack_sp > oldsp);
@@ -4658,6 +5266,19 @@ PP(pp_leaveeval)
 #endif
     CvDEPTH(evalcv) = 0;
 
+    if (override_return) {
+        /* make sure that we use a standard return when feature 'module_load'
+         * is enabled. Returns from require are problematic (consider what happens
+         * when it is called twice) */
+        if (gimme == G_SCALAR) {
+            /* this following is an optimization of POPs()/PUSHs().
+             * and does the same thing with less bookkeeping */
+            *PL_stack_sp = &PL_sv_yes;
+        }
+        assert(gimme == G_VOID || gimme == G_SCALAR);
+        failed = 0;
+    }
+
     /* pop the CXt_EVAL, and if a require failed, croak */
     S_pop_eval_context_maybe_croak(aTHX_ cx, NULL, failed);
 
@@ -4679,7 +5300,15 @@ PP(pp_entertrycatch)
     PERL_CONTEXT *cx;
     const U8 gimme = GIMME_V;
 
-    RUN_PP_CATCHABLY(Perl_pp_entertrycatch);
+    /* If a suitable JMPENV catch frame isn't present, call docatch(),
+     * which will:
+     *   - add such a frame, and
+     *   - start a new RUNOPS loop, which will (as the first op to run),
+     *     recursively call this pp function again.
+     * The main body of this function is then executed by the inner call.
+     */
+    if (CATCH_GET)
+        return docatch(Perl_pp_entertrycatch);
 
     assert(!CATCH_GET);
 
@@ -4760,7 +5389,15 @@ PP(pp_entertry)
 {
     OP *retop = cLOGOP->op_other->op_next;
 
-    RUN_PP_CATCHABLY(Perl_pp_entertry);
+    /* If a suitable JMPENV catch frame isn't present, call docatch(),
+     * which will:
+     *   - add such a frame, and
+     *   - start a new RUNOPS loop, which will (as the first op to run),
+     *     recursively call this pp function again.
+     * The main body of this function is then executed by the inner call.
+     */
+    if (CATCH_GET)
+        return docatch(Perl_pp_entertry);
 
     assert(!CATCH_GET);
 
@@ -4849,7 +5486,7 @@ PP(pp_leavegiven)
 STATIC PMOP *
 S_make_matcher(pTHX_ REGEXP *re)
 {
-    PMOP *matcher = (PMOP *) newPMOP(OP_MATCH, OPf_WANT_SCALAR | OPf_STACKED);
+    PMOP *matcher = cPMOPx(newPMOP(OP_MATCH, OPf_WANT_SCALAR | OPf_STACKED));
 
     PERL_ARGS_ASSERT_MAKE_MATCHER;
 
@@ -5587,9 +6224,9 @@ S_doparseform(pTHX_ SV *sv)
     if (mg) {
         /* still the same as previously-compiled string? */
         SV *old = mg->mg_obj;
-        if ( !(!!SvUTF8(old) ^ !!SvUTF8(sv))
-              && len == SvCUR(old)
-              && strnEQ(SvPVX(old), s, len)
+        if ( ! (cBOOL(SvUTF8(old)) ^ cBOOL(SvUTF8(sv)))
+            && len == SvCUR(old)
+            && strnEQ(SvPVX(old), s, len)
         ) {
             DEBUG_f(PerlIO_printf(Perl_debug_log,"Re-using compiled format\n"));
             return mg;
index 3fe9728..3ec24a0 100644 (file)
@@ -58,6 +58,7 @@ PP(pp_nextstate)
 PP(pp_gvsv)
 {
     dSP;
+    assert(SvTYPE(cGVOP_gv) == SVt_PVGV);
     EXTEND(SP,1);
     if (UNLIKELY(PL_op->op_private & OPpLVAL_INTRO))
         PUSHs(save_scalar(cGVOP_gv));
@@ -96,6 +97,9 @@ PP(pp_stringify)
 PP(pp_gv)
 {
     dSP;
+    /* cGVOP_gv might be a real GV or might be an RV to a CV */
+    assert(SvTYPE(cGVOP_gv) == SVt_PVGV ||
+           (SvTYPE(cGVOP_gv) <= SVt_PVMG && SvROK(cGVOP_gv) && SvTYPE(SvRV(cGVOP_gv)) == SVt_PVCV));
     XPUSHs(MUTABLE_SV(cGVOP_gv));
     RETURN;
 }
@@ -123,6 +127,98 @@ PP(pp_and)
     }
 }
 
+/*
+ * Mashup of simple padsv + sassign OPs
+ * Doesn't support the following lengthy and unlikely sassign case:
+ *    (UNLIKELY(PL_op->op_private & OPpASSIGN_CV_TO_GV))
+ *  These cases have a separate optimization, so are not handled here:
+ *    (PL_op->op_private & OPpASSIGN_BACKWARDS) {or,and,dor}assign
+*/
+
+PP(pp_padsv_store)
+{
+    dSP;
+    OP * const op = PL_op;
+    SV** const padentry = &PAD_SVl(op->op_targ);
+    SV* targ = *padentry; /* lvalue to assign into */
+    SV* const val = TOPs; /* RHS value to assign */
+
+    /* !OPf_STACKED is not handled by this OP */
+    assert(op->op_flags & OPf_STACKED);
+
+    /* Inlined, simplified pp_padsv here */
+    if ((op->op_private & (OPpLVAL_INTRO|OPpPAD_STATE)) == OPpLVAL_INTRO) {
+        save_clearsv(padentry);
+    }
+
+    /* Inlined, simplified pp_sassign from here */
+    assert(TAINTING_get || !TAINT_get);
+    if (UNLIKELY(TAINT_get) && !SvTAINTED(val))
+        TAINT_NOT;
+
+    if (
+      UNLIKELY(SvTEMP(targ)) && !SvSMAGICAL(targ) && SvREFCNT(targ) == 1 &&
+      (!isGV_with_GP(targ) || SvFAKE(targ)) && ckWARN(WARN_MISC)
+    )
+        Perl_warner(aTHX_
+            packWARN(WARN_MISC), "Useless assignment to a temporary"
+        );
+    SvSetMagicSV(targ, val);
+
+    SETs(targ);
+    RETURN;
+}
+
+/* A mashup of simplified AELEMFAST_LEX + SASSIGN OPs */
+
+PP(pp_aelemfastlex_store)
+{
+    dSP;
+    OP * const op = PL_op;
+    SV* const val = TOPs; /* RHS value to assign */
+    AV * const av = MUTABLE_AV(PAD_SV(op->op_targ));
+    const I8 key   = (I8)PL_op->op_private;
+    SV * targ = NULL;
+
+    /* !OPf_STACKED is not handled by this OP */
+    assert(op->op_flags & OPf_STACKED);
+
+    /* Inlined, simplified pp_aelemfast here */
+    assert(SvTYPE(av) == SVt_PVAV);
+
+    /* inlined av_fetch() for simple cases ... */
+    if (!SvRMAGICAL(av) && key >=0 && key <= AvFILLp(av)) {
+        targ = AvARRAY(av)[key];
+    }
+    /* ... else do it the hard way */
+    if (!targ) {
+        SV **svp = av_fetch(av, key, 1);
+
+        if (svp)
+            targ = *svp;
+        else
+            DIE(aTHX_ PL_no_aelem, (int)key);
+    }
+
+    /* Inlined, simplified pp_sassign from here */
+    assert(TAINTING_get || !TAINT_get);
+    if (UNLIKELY(TAINT_get) && !SvTAINTED(val))
+        TAINT_NOT;
+
+    /* This assertion is a deviation from pp_sassign, which uses an if()
+     * condition to check for "Useless assignment to a temporary" and
+     * warns if the condition is true. Here, the condition should NEVER
+     * be true when the LHS is the result of an array fetch. The
+     * assertion is here as a final check that this remains the case.
+     */
+    assert(!(SvTEMP(targ) && SvREFCNT(targ) == 1 && !SvSMAGICAL(targ)));
+
+    SvSetMagicSV(targ, val);
+
+    SETs(targ);
+    RETURN;
+}
+
 PP(pp_sassign)
 {
     dSP;
@@ -1638,6 +1734,9 @@ PP(pp_aelemfast)
         if (sv) {
             PUSHs(sv);
             RETURN;
+        } else if (!lval) {
+            PUSHs(&PL_sv_undef);
+            RETURN;
         }
     }
 
@@ -1774,12 +1873,7 @@ PP(pp_print)
 PERL_STATIC_INLINE OP*
 S_padhv_rv2hv_common(pTHX_ HV *hv, U8 gimme, bool is_keys, bool has_targ)
 {
-    bool is_tied;
-    bool is_bool;
-    MAGIC *mg;
     dSP;
-    IV  i;
-    SV *sv;
 
     assert(PL_op->op_type == OP_PADHV || PL_op->op_type == OP_RV2HV);
 
@@ -1795,12 +1889,17 @@ S_padhv_rv2hv_common(pTHX_ HV *hv, U8 gimme, bool is_keys, bool has_targ)
     if (gimme == G_VOID)
         return NORMAL;
 
-    is_bool = (     PL_op->op_private & OPpTRUEBOOL
-              || (  PL_op->op_private & OPpMAYBE_TRUEBOOL
-                  && block_gimme() == G_VOID));
-    is_tied = SvRMAGICAL(hv) && (mg = mg_find(MUTABLE_SV(hv), PERL_MAGIC_tied));
+    bool is_bool = (     PL_op->op_private & OPpTRUEBOOL
+                   || (  PL_op->op_private & OPpMAYBE_TRUEBOOL
+                      && block_gimme() == G_VOID));
+
+    MAGIC *is_tied_mg = SvRMAGICAL(hv)
+                        ? mg_find(MUTABLE_SV(hv), PERL_MAGIC_tied)
+                        : NULL;
 
-    if (UNLIKELY(is_tied)) {
+    IV  i = 0;
+    SV *sv = NULL;
+    if (UNLIKELY(is_tied_mg)) {
         if (is_keys && !is_bool) {
             i = 0;
             while (hv_iternext(hv))
@@ -1808,7 +1907,7 @@ S_padhv_rv2hv_common(pTHX_ HV *hv, U8 gimme, bool is_keys, bool has_targ)
             goto push_i;
         }
         else {
-            sv = magic_scalarpack(hv, mg);
+            sv = magic_scalarpack(hv, is_tied_mg);
             goto push_sv;
         }
     }
@@ -2223,7 +2322,7 @@ PP(pp_aassign)
     SV **relem;
     SV **lelem;
     U8 gimme;
-    /* PL_delaymagic is restored by JUMPENV_POP on dieing, so we
+    /* PL_delaymagic is restored by JMPENV_POP on dieing, so we
      * only need to save locally, not on the save stack */
     U16 old_delaymagic = PL_delaymagic;
 #ifdef DEBUGGING
@@ -3091,7 +3190,7 @@ PP(pp_match)
     if (global && (gimme != G_LIST || (dynpm->op_pmflags & PMf_CONTINUE))) {
         if (!mg)
             mg = sv_magicext_mglob(TARG);
-        MgBYTEPOS_set(mg, TARG, truebase, RXp_OFFS(prog)[0].end);
+        MgBYTEPOS_set(mg, TARG, truebase, RXp_OFFS_END(prog,0));
         if (RXp_ZERO_LEN(prog))
             mg->mg_flags |= MGf_MINMATCH;
         else
@@ -3106,38 +3205,90 @@ PP(pp_match)
     /* push captures on stack */
 
     {
-        const I32 nparens = RXp_NPARENS(prog);
-        I32 i = (global && !nparens) ? 1 : 0;
+        const I32 logical_nparens = RXp_LOGICAL_NPARENS(prog);
+        /* This following statement is *devious* code. If we are in a global
+           match and the pattern has no parens in it we should return $&
+           (offset pair 0). So we set logical_paren to 1 when we should return
+           $&, otherwise we set it to 0.
+
+           This allows us to simply add logical_nparens to logical_paren to
+           compute the number of elements we are going to return.
+
+           In the loop intit we "not" it with: logical_paren = !logical_paren
+           which results in it being 0 inside the loop when we want to return
+           $&, and results in it being 1 when we want to return the parens.
+           Thus we either loop over 1..logical_nparens, or just over 0.
+
+           This is an elegant way to do this code wise, but is super devious
+           and potentially confusing. When I first saw this logic I thought
+           "WTF?". But it makes sense after you poke it a while.
+
+           Frankly I probably would have done it differently, but it works so
+           I am leaving it. - Yves */
+        I32 logical_paren = (global && !logical_nparens) ? 1 : 0;
+        I32 *l2p = RXp_LOGICAL_TO_PARNO(prog);
+        /* this is used to step through the physical parens associated
+         * with a given logical paren. */
+        I32 *p2l_next = RXp_PARNO_TO_LOGICAL_NEXT(prog);
 
         SPAGAIN;                       /* EVAL blocks could move the stack. */
-        EXTEND(SP, nparens + i);
-        EXTEND_MORTAL(nparens + i);
-        for (i = !i; i <= nparens; i++) {
-            if (LIKELY((RXp_OFFS(prog)[i].start != -1)
-                     && RXp_OFFS(prog)[i].end   != -1 ))
-            {
-                const I32 len = RXp_OFFS(prog)[i].end - RXp_OFFS(prog)[i].start;
-                const char * const s = RXp_OFFS(prog)[i].start + truebase;
-                if (UNLIKELY(  RXp_OFFS(prog)[i].end   < 0
-                            || RXp_OFFS(prog)[i].start < 0
-                            || len < 0
-                            || len > strend - s)
-                )
-                    DIE(aTHX_ "panic: pp_match start/end pointers, i=%ld, "
-                        "start=%ld, end=%ld, s=%p, strend=%p, len=%" UVuf,
-                        (long) i, (long) RXp_OFFS(prog)[i].start,
-                        (long)RXp_OFFS(prog)[i].end, s, strend, (UV) len);
-                PUSHs(newSVpvn_flags(s, len,
-                    (DO_UTF8(TARG))
-                    ? SVf_UTF8|SVs_TEMP
-                    : SVs_TEMP)
-                );
-            } else {
-                PUSHs(sv_newmortal());
+        EXTEND(SP, logical_nparens + logical_paren);    /* devious code ... */
+        EXTEND_MORTAL(logical_nparens + logical_paren); /* ... see above */
+
+        /* loop over the logical parens in the pattern. This may not
+           correspond to the actual paren checked, as branch reset may
+           mean that there is more than one paren "behind" the logical
+           parens. Eg, in /(?|(a)|(b))/ there are two parens, but one
+           logical paren. */
+        for (logical_paren = !logical_paren;
+             logical_paren <= logical_nparens;
+             logical_paren++)
+        {
+            /* now convert the logical_paren to the physical parens which
+               are "behind" it. If branch reset was not used then
+               physical_paren and logical_paren are the same as each other
+               and we will only perform one iteration of the loop */
+            I32 phys_paren = l2p ? l2p[logical_paren] : logical_paren;
+            SSize_t offs_start, offs_end;
+            /* We check the loop invariants below and break out of the loop
+               explicitly if our checks fail, so we use while (1) here to
+               avoid double testing a conditional. */
+            while (1) {
+                /* Check end offset first, as the start might be >=0 even
+                   though the end is -1, so testing the end first helps
+                   use avoid the start check.  Really we should be able to
+                   get away with ONLY testing the end, but testing both
+                   doesn't hurt much and preserves sanity. */
+                if (((offs_end   = RXp_OFFS_END(prog, phys_paren))   != -1) &&
+                    ((offs_start = RXp_OFFS_START(prog, phys_paren)) != -1))
+                {
+                    const SSize_t len = offs_end - offs_start;
+                    const char * const s = offs_start + truebase;
+                    if ( UNLIKELY( len < 0 || len > strend - s) ) {
+                        DIE(aTHX_ "panic: pp_match start/end pointers, paren=%" I32df ", "
+                            "start=%zd, end=%zd, s=%p, strend=%p, len=%zd",
+                            phys_paren, offs_start, offs_end, s, strend, len);
+                    }
+                    PUSHs(newSVpvn_flags(s, len,
+                        (DO_UTF8(TARG))
+                        ? SVf_UTF8|SVs_TEMP
+                        : SVs_TEMP)
+                    );
+                    break;
+                } else if (!p2l_next || !(phys_paren = p2l_next[phys_paren])) {
+                    /* Either logical_paren and phys_paren are the same and
+                       we won't have a p2l_next, or they aren't the same (and
+                       we do have a p2l_next) but we have exhausted the list
+                       of physical parens associated with this logical paren.
+                       Either way we are done, and we can push undef and break
+                       out of the loop. */
+                    PUSHs(sv_newmortal());
+                    break;
+                }
             }
         }
         if (global) {
-            curpos = (UV)RXp_OFFS(prog)[0].end;
+            curpos = (UV)RXp_OFFS_END(prog,0);
             had_zerolen = RXp_ZERO_LEN(prog);
             PUTBACK;                   /* EVAL blocks may use stack */
             r_flags |= REXEC_IGNOREPOS | REXEC_NOT_FIRST;
@@ -3286,14 +3437,19 @@ Perl_do_readline(pTHX)
                 || SNARF_EOF(gimme, PL_rs, io, sv)
                 || PerlIO_error(fp)))
         {
-            PerlIO_clearerr(fp);
             if (IoFLAGS(io) & IOf_ARGV) {
                 fp = nextargv(PL_last_in_gv, PL_op->op_flags & OPf_SPECIAL);
-                if (fp)
+                if (fp) {
                     continue;
+                }
                 (void)do_close(PL_last_in_gv, FALSE);
             }
             else if (type == OP_GLOB) {
+                /* clear any errors here so we only fail on the pclose()
+                   failing, which should only happen on the child
+                   failing
+                */
+                PerlIO_clearerr(fp);
                 if (!do_close(PL_last_in_gv, FALSE)) {
                     Perl_ck_warner(aTHX_ packWARN(WARN_GLOB),
                                    "glob failed (child exited with status %d%s)",
@@ -3390,10 +3546,9 @@ PP(pp_helem)
         MAGIC *mg;
         HV *stash;
 
-        /* If we can determine whether the element exists,
-         * Try to preserve the existenceness of a tied hash
+        /* Try to preserve the existence of a tied hash
          * element by using EXISTS and DELETE if possible.
-         * Fallback to FETCH and STORE otherwise. */
+         * Fall back to FETCH and STORE otherwise. */
         if (SvCANEXISTDELETE(hv))
             preeminent = hv_exists_ent(hv, keysv, 0);
     }
@@ -3476,7 +3631,7 @@ S_softref2xv_lite(pTHX_ SV *const sv, const char *const what,
  * op_aux points to an array of unions of UV / IV / SV* / PADOFFSET.
  * Each of these either contains a set of actions, or an argument, such as
  * an IV to use as an array index, or a lexical var to retrieve.
- * Several actions re stored per UV; we keep shifting new actions off the
+ * Several actions are stored per UV; we keep shifting new actions off the
  * one UV, and only reload when it becomes zero.
  */
 
@@ -3491,7 +3646,7 @@ PP(pp_multideref)
     PL_multideref_pc = items;
 
     while (1) {
-        /* there are three main classes of action; the first retrieve
+        /* there are three main classes of action; the first retrieves
          * the initial AV or HV from a variable or the stack; the second
          * does the equivalent of an unrolled (/DREFAV, rv2av, aelem),
          * the third an unrolled (/DREFHV, rv2hv, helem).
@@ -3635,10 +3790,9 @@ PP(pp_multideref)
                         MAGIC *mg;
                         HV *stash;
 
-                        /* If we can determine whether the element exist,
-                         * Try to preserve the existenceness of a tied array
+                        /* Try to preserve the existence of a tied array
                          * element by using EXISTS and DELETE if possible.
-                         * Fallback to FETCH and STORE otherwise. */
+                         * Fall back to FETCH and STORE otherwise. */
                         if (SvCANEXISTDELETE(av))
                             preeminent = av_exists(av, elem);
                     }
@@ -3828,10 +3982,9 @@ PP(pp_multideref)
                         MAGIC *mg;
                         HV *stash;
 
-                        /* If we can determine whether the element exist,
-                         * Try to preserve the existenceness of a tied hash
+                        /* Try to preserve the existence of a tied hash
                          * element by using EXISTS and DELETE if possible.
-                         * Fallback to FETCH and STORE otherwise. */
+                         * Fall back to FETCH and STORE otherwise. */
                         if (SvCANEXISTDELETE(hv))
                             preeminent = hv_exists_ent(hv, keysv, 0);
                     }
@@ -3972,7 +4125,7 @@ PP(pp_iter)
                 if (UNLIKELY(pad_it)) {
                     /* We're "beyond the end" of the iterator here, filling the
                        extra lexicals with undef, so we mustn't do anything
-                       (further) to the the iterator itself at this point.
+                       (further) to the iterator itself at this point.
                        (Observe how the other two blocks modify the iterator's
                        value) */
                 }
@@ -4248,7 +4401,6 @@ PP(pp_subst)
     STRLEN len;
     int force_on_match = 0;
     const I32 oldsave = PL_savestack_ix;
-    STRLEN slen;
     bool doutf8 = FALSE; /* whether replacement is in utf8 */
 #ifdef PERL_ANY_COW
     bool was_cow;
@@ -4314,10 +4466,12 @@ PP(pp_subst)
         DIE(aTHX_ "panic: pp_subst, pm=%p, orig=%p", pm, orig);
 
     strend = orig + len;
-    slen = DO_UTF8(TARG) ? utf8_length((U8*)orig, (U8*)strend) : len;
-    maxiters = 2 * slen + 10;  /* We can match twice at each
-                                   position, once with zero-length,
-                                   second time with non-zero. */
+    /* We can match twice at each position, once with zero-length,
+     * second time with non-zero.
+     * Don't handle utf8 specially; we can use length-in-bytes as an
+     * upper bound on length-in-characters, and avoid the cpu-cost of
+     * computing a tighter bound. */
+    maxiters = 2 * len + 10;
 
     /* handle the empty pattern */
     if (!RX_PRELEN(rx) && PL_curpm && !prog->mother_re) {
@@ -4415,8 +4569,8 @@ PP(pp_subst)
             char *d, *m;
             if (RXp_MATCH_TAINTED(prog)) /* run time pattern taint, eg locale */
                 rxtainted |= SUBST_TAINT_PAT;
-            m = orig + RXp_OFFS(prog)[0].start;
-            d = orig + RXp_OFFS(prog)[0].end;
+            m = orig + RXp_OFFS_START(prog,0);
+            d = orig + RXp_OFFS_END(prog,0);
             s = orig;
             if (m - s > strend - d) {  /* faster to shorten from end */
                 I32 i;
@@ -4446,7 +4600,7 @@ PP(pp_subst)
         }
         else {
             char *d, *m;
-            d = s = RXp_OFFS(prog)[0].start + orig;
+            d = s = RXp_OFFS_START(prog,0) + orig;
             do {
                 I32 i;
                 if (UNLIKELY(iters++ > maxiters))
@@ -4454,7 +4608,7 @@ PP(pp_subst)
                 /* run time pattern taint, eg locale */
                 if (UNLIKELY(RXp_MATCH_TAINTED(prog)))
                     rxtainted |= SUBST_TAINT_PAT;
-                m = RXp_OFFS(prog)[0].start + orig;
+                m = RXp_OFFS_START(prog,0) + orig;
                 if ((i = m - s)) {
                     if (s != d)
                         Move(s, d, i, char);
@@ -4464,7 +4618,7 @@ PP(pp_subst)
                     Copy(c, d, clen, char);
                     d += clen;
                 }
-                s = RXp_OFFS(prog)[0].end + orig;
+                s = RXp_OFFS_END(prog,0) + orig;
             } while (CALLREGEXEC(rx, s, strend, orig,
                                  s == m, /* don't match same null twice */
                                  TARG, NULL,
@@ -4507,7 +4661,7 @@ PP(pp_subst)
         if (RXp_MATCH_TAINTED(prog)) /* run time pattern taint, eg locale */
             rxtainted |= SUBST_TAINT_PAT;
         repl = dstr;
-        s = RXp_OFFS(prog)[0].start + orig;
+        s = RXp_OFFS_START(prog,0) + orig;
         dstr = newSVpvn_flags(orig, s-orig,
                     SVs_TEMP | (DO_UTF8(TARG) ? SVf_UTF8 : 0));
         if (!c) {
@@ -4537,9 +4691,9 @@ PP(pp_subst)
                 s = orig + (old_s - old_orig);
                 strend = s + (strend - old_s);
             }
-            m = RXp_OFFS(prog)[0].start + orig;
+            m = RXp_OFFS_START(prog,0) + orig;
             sv_catpvn_nomg_maybeutf8(dstr, s, m - s, DO_UTF8(TARG));
-            s = RXp_OFFS(prog)[0].end + orig;
+            s = RXp_OFFS_END(prog,0) + orig;
             if (first) {
                 /* replacement already stringified */
               if (clen)
@@ -4625,6 +4779,57 @@ PP(pp_subst)
 
 PP(pp_grepwhile)
 {
+    /* Understanding the stack during a grep.
+     *
+     * 'grep expr, args' is implemented in the form of
+     *     grepstart;
+     *     do {
+     *          expr;
+     *          grepwhile;
+     *     } while (args);
+     *
+     * The stack examples below are in the form of 'perl -Ds' output,
+     * where any stack element indexed by PL_markstack_ptr[i] has a star
+     * just to the right of it.  In addition, the corresponding i value
+     * is displayed under the indexed stack element.
+     *
+     * On entry to grepwhile, the stack looks like this:
+     *
+     *      =>   *  M1..Mn  X1  *  X2..Xn  C  *  R1..Rn  BOOL
+     *       [-2]          [-1]           [0]
+     *
+     * where:
+     *   M1..Mn   Accumulated args which have been matched so far.
+     *   X1..Xn   Random discardable elements from previous iterations.
+     *   C        The current (just processed) arg, still aliased to $_.
+     *   R1..Rn   The args remaining to be processed.
+     *   BOOL     the result of the just-executed grep expression.
+     *
+     * Note that it is easiest to think of the top two stack marks as both
+     * being one too high, and so it would make more sense to have had the
+     * marks like this:
+     *
+     *      =>   *  M1..Mn  *  X1..Xn  *  C  R1..Rn  BOOL
+     *      [-2]       [-1]        [0]
+     *
+     * where the stack is divided neatly into 3 groups:
+     *   - matched,
+     *   - discarded,
+     *   - being, or yet to be, processed.
+     * But off-by-one is the way it is currently, and it works as long as
+     * we keep it consistent and bear it in mind.
+     *
+     * pp_grepwhile() does the following:
+     *
+     * - for a match, replace the X1 pointer with a pointer to C and bump
+     *     PL_markstack_ptr[-1]
+     * - if more args to process, bump PL_markstack_ptr[0] and update the
+     *     $_ alias, else
+     * - remove top 3 MARKs and return M1..Mn, or a scalar,
+     *     or void as appropriate.
+     *
+     */
+
     dSP;
     dPOPss;
 
@@ -4756,13 +4961,9 @@ Perl_leave_adjust_stacks(pTHX_ SV **from_sp, SV **to_sp, U8 gimme, int pass)
             assert(from_sp == SP);
             EXTEND(SP, 1);
             *++SP = &PL_sv_undef;
-            to_sp = SP;
-            nargs   = 0;
-        }
-        else {
-            from_sp = SP;
-            nargs   = 1;
         }
+        from_sp = SP;
+        nargs   = 1;
     }
 
     /* common code for G_SCALAR and G_LIST */
@@ -5048,7 +5249,8 @@ Perl_clear_defarray(pTHX_ AV* av, bool abandon)
     else {
         const SSize_t size = AvFILLp(av) + 1;
         /* The ternary gives consistency with av_extend() */
-        AV *newav = newAV_alloc_x(size < 4 ? 4 : size);
+        AV *newav = newAV_alloc_x(size < PERL_ARRAY_NEW_MIN_KEY ?
+                                         PERL_ARRAY_NEW_MIN_KEY : size);
         AvREIFY_only(newav);
         PAD_SVl(0) = MUTABLE_SV(newav);
         SvREFCNT_dec_NN(av);
@@ -5439,10 +5641,9 @@ PP(pp_aelem)
         MAGIC *mg;
         HV *stash;
 
-        /* If we can determine whether the element exist,
-         * Try to preserve the existenceness of a tied array
+        /* Try to preserve the existence of a tied array
          * element by using EXISTS and DELETE if possible.
-         * Fallback to FETCH and STORE otherwise. */
+         * Fall back to FETCH and STORE otherwise. */
         if (SvCANEXISTDELETE(av))
             preeminent = av_exists(av, elem);
     }
@@ -5658,7 +5859,7 @@ PP(pp_method_named)
 {
     dSP;
     GV* gv;
-    SV* const meth = cMETHOPx_meth(PL_op);
+    SV* const meth = cMETHOP_meth;
     HV* const stash = opmethod_stash(meth);
 
     if (LIKELY(SvTYPE(stash) == SVt_PVHV)) {
@@ -5677,7 +5878,7 @@ PP(pp_method_super)
     dSP;
     GV* gv;
     HV* cache;
-    SV* const meth = cMETHOPx_meth(PL_op);
+    SV* const meth = cMETHOP_meth;
     HV* const stash = CopSTASH(PL_curcop);
     /* Actually, SUPER doesn't need real object's (or class') stash at all,
      * as it uses CopSTASH. However, we must ensure that object(class) is
@@ -5699,12 +5900,12 @@ PP(pp_method_redir)
 {
     dSP;
     GV* gv;
-    SV* const meth = cMETHOPx_meth(PL_op);
-    HV* stash = gv_stashsv(cMETHOPx_rclass(PL_op), 0);
+    SV* const meth = cMETHOP_meth;
+    HV* stash = gv_stashsv(cMETHOP_rclass, 0);
     opmethod_stash(meth); /* not used but needed for error checks */
 
     if (stash) { METHOD_CHECK_CACHE(stash, stash, meth); }
-    else stash = MUTABLE_HV(cMETHOPx_rclass(PL_op));
+    else stash = MUTABLE_HV(cMETHOP_rclass);
 
     gv = gv_fetchmethod_sv_flags(stash, meth, GV_AUTOLOAD|GV_CROAK);
     assert(gv);
@@ -5718,11 +5919,11 @@ PP(pp_method_redir_super)
     dSP;
     GV* gv;
     HV* cache;
-    SV* const meth = cMETHOPx_meth(PL_op);
-    HV* stash = gv_stashsv(cMETHOPx_rclass(PL_op), 0);
+    SV* const meth = cMETHOP_meth;
+    HV* stash = gv_stashsv(cMETHOP_rclass, 0);
     opmethod_stash(meth); /* not used but needed for error checks */
 
-    if (UNLIKELY(!stash)) stash = MUTABLE_HV(cMETHOPx_rclass(PL_op));
+    if (UNLIKELY(!stash)) stash = MUTABLE_HV(cMETHOP_rclass);
     else if ((cache = HvMROMETA(stash)->super)) {
          METHOD_CHECK_CACHE(stash, cache, meth);
     }
index 41f72b7..4442287 100644 (file)
@@ -541,22 +541,24 @@ STATIC const char *
 S_group_end(pTHX_ const char *patptr, const char *patend, char ender)
 {
     PERL_ARGS_ASSERT_GROUP_END;
+    Size_t opened = 0;  /* number of pending opened brackets */
 
     while (patptr < patend) {
         const char c = *patptr++;
 
-        if (isSPACE(c))
-            continue;
-        else if (c == ender)
+        if (opened == 0 && c == ender)
             return patptr-1;
         else if (c == '#') {
             while (patptr < patend && *patptr != '\n')
                 patptr++;
             continue;
-        } else if (c == '(')
-            patptr = group_end(patptr, patend, ')') + 1;
-        else if (c == '[')
-            patptr = group_end(patptr, patend, ']') + 1;
+        } else if (c == '(' || c == '[')
+            ++opened;
+        else if (c == ')' || c == ']') {
+            if (opened == 0)
+                Perl_croak(aTHX_ "Mismatched brackets in template");
+            --opened;
+        }
     }
     Perl_croak(aTHX_ "No group ending character '%c' found in template",
                ender);
@@ -937,6 +939,7 @@ S_unpack_rec(pTHX_ tempsym_t* symptr, const char *s, const char *strbeg, const c
             const U32 group_modifiers = TYPE_MODIFIERS(datumtype & ~symptr->flags);
             symptr->flags |= group_modifiers;
             symptr->patend = savsym.grpend;
+            /* cppcheck-suppress autoVariables */
             symptr->previous = &savsym;
             symptr->level++;
             PUTBACK;
@@ -2247,6 +2250,7 @@ S_pack_rec(pTHX_ SV *cat, tempsym_t* symptr, SV **beglist, SV **endlist )
             symptr->flags |= group_modifiers;
             symptr->patend = savsym.grpend;
             symptr->level++;
+            /* cppcheck-suppress autoVariables */
             symptr->previous = &lookahead;
             while (len--) {
                 U32 was_utf8;
index 2490968..a3a8f45 100644 (file)
-/* -*- buffer-read-only: t -*-
+/* -*- mode: C; buffer-read-only: t -*-
    !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!!
    This file is built by opcode.pl from its data.
    Any changes made here will be lost!
  */
 
-PERL_CALLCONV OP *Perl_do_kv(pTHX);
-PERL_CALLCONV OP *Perl_pp_aassign(pTHX);
-PERL_CALLCONV OP *Perl_pp_abs(pTHX);
-PERL_CALLCONV OP *Perl_pp_accept(pTHX);
-PERL_CALLCONV OP *Perl_pp_add(pTHX);
-PERL_CALLCONV OP *Perl_pp_aeach(pTHX);
-PERL_CALLCONV OP *Perl_pp_aelem(pTHX);
-PERL_CALLCONV OP *Perl_pp_aelemfast(pTHX);
-PERL_CALLCONV OP *Perl_pp_akeys(pTHX);
-PERL_CALLCONV OP *Perl_pp_alarm(pTHX);
-PERL_CALLCONV OP *Perl_pp_and(pTHX);
-PERL_CALLCONV OP *Perl_pp_anoncode(pTHX);
-PERL_CALLCONV OP *Perl_pp_anonconst(pTHX);
-PERL_CALLCONV OP *Perl_pp_anonhash(pTHX);
-PERL_CALLCONV OP *Perl_pp_anonlist(pTHX);
-PERL_CALLCONV OP *Perl_pp_argcheck(pTHX);
-PERL_CALLCONV OP *Perl_pp_argdefelem(pTHX);
-PERL_CALLCONV OP *Perl_pp_argelem(pTHX);
-PERL_CALLCONV OP *Perl_pp_aslice(pTHX);
-PERL_CALLCONV OP *Perl_pp_atan2(pTHX);
-PERL_CALLCONV OP *Perl_pp_av2arylen(pTHX);
-PERL_CALLCONV OP *Perl_pp_avhvswitch(pTHX);
-PERL_CALLCONV OP *Perl_pp_backtick(pTHX);
-PERL_CALLCONV OP *Perl_pp_bind(pTHX);
-PERL_CALLCONV OP *Perl_pp_binmode(pTHX);
-PERL_CALLCONV OP *Perl_pp_bit_and(pTHX);
-PERL_CALLCONV OP *Perl_pp_bit_or(pTHX);
-PERL_CALLCONV OP *Perl_pp_bless(pTHX);
-PERL_CALLCONV OP *Perl_pp_blessed(pTHX);
-PERL_CALLCONV OP *Perl_pp_break(pTHX);
-PERL_CALLCONV OP *Perl_pp_caller(pTHX);
-PERL_CALLCONV OP *Perl_pp_catch(pTHX);
-PERL_CALLCONV OP *Perl_pp_ceil(pTHX);
-PERL_CALLCONV OP *Perl_pp_chdir(pTHX);
-PERL_CALLCONV OP *Perl_pp_chop(pTHX);
-PERL_CALLCONV OP *Perl_pp_chown(pTHX);
-PERL_CALLCONV OP *Perl_pp_chr(pTHX);
-PERL_CALLCONV OP *Perl_pp_chroot(pTHX);
-PERL_CALLCONV OP *Perl_pp_clonecv(pTHX);
-PERL_CALLCONV OP *Perl_pp_close(pTHX);
-PERL_CALLCONV OP *Perl_pp_closedir(pTHX);
-PERL_CALLCONV OP *Perl_pp_cmpchain_and(pTHX);
-PERL_CALLCONV OP *Perl_pp_cmpchain_dup(pTHX);
-PERL_CALLCONV OP *Perl_pp_complement(pTHX);
-PERL_CALLCONV OP *Perl_pp_concat(pTHX);
-PERL_CALLCONV OP *Perl_pp_cond_expr(pTHX);
-PERL_CALLCONV OP *Perl_pp_const(pTHX);
-PERL_CALLCONV OP *Perl_pp_continue(pTHX);
-PERL_CALLCONV OP *Perl_pp_coreargs(pTHX);
-PERL_CALLCONV OP *Perl_pp_crypt(pTHX);
-PERL_CALLCONV OP *Perl_pp_dbmopen(pTHX);
-PERL_CALLCONV OP *Perl_pp_dbstate(pTHX);
-PERL_CALLCONV OP *Perl_pp_defined(pTHX);
-PERL_CALLCONV OP *Perl_pp_delete(pTHX);
-PERL_CALLCONV OP *Perl_pp_die(pTHX);
-PERL_CALLCONV OP *Perl_pp_divide(pTHX);
-PERL_CALLCONV OP *Perl_pp_each(pTHX);
-PERL_CALLCONV OP *Perl_pp_ehostent(pTHX);
-PERL_CALLCONV OP *Perl_pp_enter(pTHX);
-PERL_CALLCONV OP *Perl_pp_entereval(pTHX);
-PERL_CALLCONV OP *Perl_pp_entergiven(pTHX);
-PERL_CALLCONV OP *Perl_pp_enteriter(pTHX);
-PERL_CALLCONV OP *Perl_pp_enterloop(pTHX);
-PERL_CALLCONV OP *Perl_pp_entersub(pTHX);
-PERL_CALLCONV OP *Perl_pp_entertry(pTHX);
-PERL_CALLCONV OP *Perl_pp_entertrycatch(pTHX);
-PERL_CALLCONV OP *Perl_pp_enterwhen(pTHX);
-PERL_CALLCONV OP *Perl_pp_enterwrite(pTHX);
-PERL_CALLCONV OP *Perl_pp_eof(pTHX);
-PERL_CALLCONV OP *Perl_pp_eq(pTHX);
-PERL_CALLCONV OP *Perl_pp_exec(pTHX);
-PERL_CALLCONV OP *Perl_pp_exists(pTHX);
-PERL_CALLCONV OP *Perl_pp_exit(pTHX);
-PERL_CALLCONV OP *Perl_pp_fc(pTHX);
-PERL_CALLCONV OP *Perl_pp_fileno(pTHX);
-PERL_CALLCONV OP *Perl_pp_flip(pTHX);
-PERL_CALLCONV OP *Perl_pp_flock(pTHX);
-PERL_CALLCONV OP *Perl_pp_floor(pTHX);
-PERL_CALLCONV OP *Perl_pp_flop(pTHX);
-PERL_CALLCONV OP *Perl_pp_fork(pTHX);
-PERL_CALLCONV OP *Perl_pp_formline(pTHX);
-PERL_CALLCONV OP *Perl_pp_ftis(pTHX);
-PERL_CALLCONV OP *Perl_pp_ftlink(pTHX);
-PERL_CALLCONV OP *Perl_pp_ftrowned(pTHX);
-PERL_CALLCONV OP *Perl_pp_ftrread(pTHX);
-PERL_CALLCONV OP *Perl_pp_fttext(pTHX);
-PERL_CALLCONV OP *Perl_pp_fttty(pTHX);
-PERL_CALLCONV OP *Perl_pp_ge(pTHX);
-PERL_CALLCONV OP *Perl_pp_gelem(pTHX);
-PERL_CALLCONV OP *Perl_pp_getc(pTHX);
-PERL_CALLCONV OP *Perl_pp_getlogin(pTHX);
-PERL_CALLCONV OP *Perl_pp_getpeername(pTHX);
-PERL_CALLCONV OP *Perl_pp_getpgrp(pTHX);
-PERL_CALLCONV OP *Perl_pp_getppid(pTHX);
-PERL_CALLCONV OP *Perl_pp_getpriority(pTHX);
-PERL_CALLCONV OP *Perl_pp_ggrent(pTHX);
-PERL_CALLCONV OP *Perl_pp_ghostent(pTHX);
-PERL_CALLCONV OP *Perl_pp_glob(pTHX);
-PERL_CALLCONV OP *Perl_pp_gmtime(pTHX);
-PERL_CALLCONV OP *Perl_pp_gnetent(pTHX);
-PERL_CALLCONV OP *Perl_pp_goto(pTHX);
-PERL_CALLCONV OP *Perl_pp_gprotoent(pTHX);
-PERL_CALLCONV OP *Perl_pp_gpwent(pTHX);
-PERL_CALLCONV OP *Perl_pp_grepstart(pTHX);
-PERL_CALLCONV OP *Perl_pp_grepwhile(pTHX);
-PERL_CALLCONV OP *Perl_pp_gservent(pTHX);
-PERL_CALLCONV OP *Perl_pp_gt(pTHX);
-PERL_CALLCONV OP *Perl_pp_gv(pTHX);
-PERL_CALLCONV OP *Perl_pp_gvsv(pTHX);
-PERL_CALLCONV OP *Perl_pp_helem(pTHX);
-PERL_CALLCONV OP *Perl_pp_hintseval(pTHX);
-PERL_CALLCONV OP *Perl_pp_hslice(pTHX);
-PERL_CALLCONV OP *Perl_pp_i_add(pTHX);
-PERL_CALLCONV OP *Perl_pp_i_divide(pTHX);
-PERL_CALLCONV OP *Perl_pp_i_eq(pTHX);
-PERL_CALLCONV OP *Perl_pp_i_ge(pTHX);
-PERL_CALLCONV OP *Perl_pp_i_gt(pTHX);
-PERL_CALLCONV OP *Perl_pp_i_le(pTHX);
-PERL_CALLCONV OP *Perl_pp_i_lt(pTHX);
-PERL_CALLCONV OP *Perl_pp_i_modulo(pTHX);
-PERL_CALLCONV OP *Perl_pp_i_multiply(pTHX);
-PERL_CALLCONV OP *Perl_pp_i_ncmp(pTHX);
-PERL_CALLCONV OP *Perl_pp_i_ne(pTHX);
-PERL_CALLCONV OP *Perl_pp_i_negate(pTHX);
-PERL_CALLCONV OP *Perl_pp_i_subtract(pTHX);
-PERL_CALLCONV OP *Perl_pp_index(pTHX);
-PERL_CALLCONV OP *Perl_pp_int(pTHX);
-PERL_CALLCONV OP *Perl_pp_introcv(pTHX);
-PERL_CALLCONV OP *Perl_pp_ioctl(pTHX);
-PERL_CALLCONV OP *Perl_pp_is_bool(pTHX);
-PERL_CALLCONV OP *Perl_pp_is_weak(pTHX);
-PERL_CALLCONV OP *Perl_pp_isa(pTHX);
-PERL_CALLCONV OP *Perl_pp_iter(pTHX);
-PERL_CALLCONV OP *Perl_pp_join(pTHX);
-PERL_CALLCONV OP *Perl_pp_kvaslice(pTHX);
-PERL_CALLCONV OP *Perl_pp_kvhslice(pTHX);
-PERL_CALLCONV OP *Perl_pp_last(pTHX);
-PERL_CALLCONV OP *Perl_pp_lc(pTHX);
-PERL_CALLCONV OP *Perl_pp_le(pTHX);
-PERL_CALLCONV OP *Perl_pp_leave(pTHX);
-PERL_CALLCONV OP *Perl_pp_leaveeval(pTHX);
-PERL_CALLCONV OP *Perl_pp_leavegiven(pTHX);
-PERL_CALLCONV OP *Perl_pp_leaveloop(pTHX);
-PERL_CALLCONV OP *Perl_pp_leavesub(pTHX);
-PERL_CALLCONV OP *Perl_pp_leavesublv(pTHX);
-PERL_CALLCONV OP *Perl_pp_leavetry(pTHX);
-PERL_CALLCONV OP *Perl_pp_leavetrycatch(pTHX);
-PERL_CALLCONV OP *Perl_pp_leavewhen(pTHX);
-PERL_CALLCONV OP *Perl_pp_leavewrite(pTHX);
-PERL_CALLCONV OP *Perl_pp_left_shift(pTHX);
-PERL_CALLCONV OP *Perl_pp_length(pTHX);
-PERL_CALLCONV OP *Perl_pp_link(pTHX);
-PERL_CALLCONV OP *Perl_pp_list(pTHX);
-PERL_CALLCONV OP *Perl_pp_listen(pTHX);
-PERL_CALLCONV OP *Perl_pp_lock(pTHX);
-PERL_CALLCONV OP *Perl_pp_lslice(pTHX);
-PERL_CALLCONV OP *Perl_pp_lt(pTHX);
-PERL_CALLCONV OP *Perl_pp_lvavref(pTHX);
-PERL_CALLCONV OP *Perl_pp_lvref(pTHX);
-PERL_CALLCONV OP *Perl_pp_lvrefslice(pTHX);
-PERL_CALLCONV OP *Perl_pp_mapwhile(pTHX);
-PERL_CALLCONV OP *Perl_pp_match(pTHX);
-PERL_CALLCONV OP *Perl_pp_method(pTHX);
-PERL_CALLCONV OP *Perl_pp_method_named(pTHX);
-PERL_CALLCONV OP *Perl_pp_method_redir(pTHX);
-PERL_CALLCONV OP *Perl_pp_method_redir_super(pTHX);
-PERL_CALLCONV OP *Perl_pp_method_super(pTHX);
-PERL_CALLCONV OP *Perl_pp_mkdir(pTHX);
-PERL_CALLCONV OP *Perl_pp_modulo(pTHX);
-PERL_CALLCONV OP *Perl_pp_multiconcat(pTHX);
-PERL_CALLCONV OP *Perl_pp_multideref(pTHX);
-PERL_CALLCONV OP *Perl_pp_multiply(pTHX);
-PERL_CALLCONV OP *Perl_pp_nbit_and(pTHX);
-PERL_CALLCONV OP *Perl_pp_nbit_or(pTHX);
-PERL_CALLCONV OP *Perl_pp_ncmp(pTHX);
-PERL_CALLCONV OP *Perl_pp_ncomplement(pTHX);
-PERL_CALLCONV OP *Perl_pp_ne(pTHX);
-PERL_CALLCONV OP *Perl_pp_negate(pTHX);
-PERL_CALLCONV OP *Perl_pp_next(pTHX);
-PERL_CALLCONV OP *Perl_pp_nextstate(pTHX);
-PERL_CALLCONV OP *Perl_pp_not(pTHX);
-PERL_CALLCONV OP *Perl_pp_null(pTHX);
-PERL_CALLCONV OP *Perl_pp_oct(pTHX);
-PERL_CALLCONV OP *Perl_pp_once(pTHX);
-PERL_CALLCONV OP *Perl_pp_open(pTHX);
-PERL_CALLCONV OP *Perl_pp_open_dir(pTHX);
-PERL_CALLCONV OP *Perl_pp_or(pTHX);
-PERL_CALLCONV OP *Perl_pp_ord(pTHX);
-PERL_CALLCONV OP *Perl_pp_pack(pTHX);
-PERL_CALLCONV OP *Perl_pp_padav(pTHX);
-PERL_CALLCONV OP *Perl_pp_padcv(pTHX);
-PERL_CALLCONV OP *Perl_pp_padhv(pTHX);
-PERL_CALLCONV OP *Perl_pp_padrange(pTHX);
-PERL_CALLCONV OP *Perl_pp_padsv(pTHX);
-PERL_CALLCONV OP *Perl_pp_pipe_op(pTHX);
-PERL_CALLCONV OP *Perl_pp_poptry(pTHX);
-PERL_CALLCONV OP *Perl_pp_pos(pTHX);
-PERL_CALLCONV OP *Perl_pp_postdec(pTHX);
-PERL_CALLCONV OP *Perl_pp_postinc(pTHX);
-PERL_CALLCONV OP *Perl_pp_pow(pTHX);
-PERL_CALLCONV OP *Perl_pp_predec(pTHX);
-PERL_CALLCONV OP *Perl_pp_preinc(pTHX);
-PERL_CALLCONV OP *Perl_pp_print(pTHX);
-PERL_CALLCONV OP *Perl_pp_prototype(pTHX);
-PERL_CALLCONV OP *Perl_pp_prtf(pTHX);
-PERL_CALLCONV OP *Perl_pp_push(pTHX);
-PERL_CALLCONV OP *Perl_pp_pushdefer(pTHX);
-PERL_CALLCONV OP *Perl_pp_pushmark(pTHX);
-PERL_CALLCONV OP *Perl_pp_qr(pTHX);
-PERL_CALLCONV OP *Perl_pp_quotemeta(pTHX);
-PERL_CALLCONV OP *Perl_pp_rand(pTHX);
-PERL_CALLCONV OP *Perl_pp_range(pTHX);
-PERL_CALLCONV OP *Perl_pp_rcatline(pTHX);
-PERL_CALLCONV OP *Perl_pp_readdir(pTHX);
-PERL_CALLCONV OP *Perl_pp_readline(pTHX);
-PERL_CALLCONV OP *Perl_pp_readlink(pTHX);
-PERL_CALLCONV OP *Perl_pp_redo(pTHX);
-PERL_CALLCONV OP *Perl_pp_ref(pTHX);
-PERL_CALLCONV OP *Perl_pp_refaddr(pTHX);
-PERL_CALLCONV OP *Perl_pp_refassign(pTHX);
-PERL_CALLCONV OP *Perl_pp_refgen(pTHX);
-PERL_CALLCONV OP *Perl_pp_reftype(pTHX);
-PERL_CALLCONV OP *Perl_pp_regcomp(pTHX);
-PERL_CALLCONV OP *Perl_pp_regcreset(pTHX);
-PERL_CALLCONV OP *Perl_pp_rename(pTHX);
-PERL_CALLCONV OP *Perl_pp_repeat(pTHX);
-PERL_CALLCONV OP *Perl_pp_require(pTHX);
-PERL_CALLCONV OP *Perl_pp_reset(pTHX);
-PERL_CALLCONV OP *Perl_pp_return(pTHX);
-PERL_CALLCONV OP *Perl_pp_reverse(pTHX);
-PERL_CALLCONV OP *Perl_pp_rewinddir(pTHX);
-PERL_CALLCONV OP *Perl_pp_right_shift(pTHX);
-PERL_CALLCONV OP *Perl_pp_rmdir(pTHX);
-PERL_CALLCONV OP *Perl_pp_runcv(pTHX);
-PERL_CALLCONV OP *Perl_pp_rv2av(pTHX);
-PERL_CALLCONV OP *Perl_pp_rv2cv(pTHX);
-PERL_CALLCONV OP *Perl_pp_rv2gv(pTHX);
-PERL_CALLCONV OP *Perl_pp_rv2sv(pTHX);
-PERL_CALLCONV OP *Perl_pp_sassign(pTHX);
-PERL_CALLCONV OP *Perl_pp_sbit_and(pTHX);
-PERL_CALLCONV OP *Perl_pp_sbit_or(pTHX);
-PERL_CALLCONV OP *Perl_pp_schop(pTHX);
-PERL_CALLCONV OP *Perl_pp_scmp(pTHX);
-PERL_CALLCONV OP *Perl_pp_scomplement(pTHX);
-PERL_CALLCONV OP *Perl_pp_seekdir(pTHX);
-PERL_CALLCONV OP *Perl_pp_select(pTHX);
-PERL_CALLCONV OP *Perl_pp_semctl(pTHX);
-PERL_CALLCONV OP *Perl_pp_semget(pTHX);
-PERL_CALLCONV OP *Perl_pp_seq(pTHX);
-PERL_CALLCONV OP *Perl_pp_setpgrp(pTHX);
-PERL_CALLCONV OP *Perl_pp_setpriority(pTHX);
-PERL_CALLCONV OP *Perl_pp_shift(pTHX);
-PERL_CALLCONV OP *Perl_pp_shmwrite(pTHX);
-PERL_CALLCONV OP *Perl_pp_shostent(pTHX);
-PERL_CALLCONV OP *Perl_pp_shutdown(pTHX);
-PERL_CALLCONV OP *Perl_pp_sin(pTHX);
-PERL_CALLCONV OP *Perl_pp_sle(pTHX);
-PERL_CALLCONV OP *Perl_pp_sleep(pTHX);
-PERL_CALLCONV OP *Perl_pp_smartmatch(pTHX);
-PERL_CALLCONV OP *Perl_pp_sne(pTHX);
-PERL_CALLCONV OP *Perl_pp_socket(pTHX);
-PERL_CALLCONV OP *Perl_pp_sockpair(pTHX);
-PERL_CALLCONV OP *Perl_pp_sort(pTHX);
-PERL_CALLCONV OP *Perl_pp_splice(pTHX);
-PERL_CALLCONV OP *Perl_pp_split(pTHX);
-PERL_CALLCONV OP *Perl_pp_sprintf(pTHX);
-PERL_CALLCONV OP *Perl_pp_srand(pTHX);
-PERL_CALLCONV OP *Perl_pp_srefgen(pTHX);
-PERL_CALLCONV OP *Perl_pp_sselect(pTHX);
-PERL_CALLCONV OP *Perl_pp_ssockopt(pTHX);
-PERL_CALLCONV OP *Perl_pp_stat(pTHX);
-PERL_CALLCONV OP *Perl_pp_stringify(pTHX);
-PERL_CALLCONV OP *Perl_pp_stub(pTHX);
-PERL_CALLCONV OP *Perl_pp_study(pTHX);
-PERL_CALLCONV OP *Perl_pp_subst(pTHX);
-PERL_CALLCONV OP *Perl_pp_substcont(pTHX);
-PERL_CALLCONV OP *Perl_pp_substr(pTHX);
-PERL_CALLCONV OP *Perl_pp_subtract(pTHX);
-PERL_CALLCONV OP *Perl_pp_syscall(pTHX);
-PERL_CALLCONV OP *Perl_pp_sysopen(pTHX);
-PERL_CALLCONV OP *Perl_pp_sysread(pTHX);
-PERL_CALLCONV OP *Perl_pp_sysseek(pTHX);
-PERL_CALLCONV OP *Perl_pp_system(pTHX);
-PERL_CALLCONV OP *Perl_pp_syswrite(pTHX);
-PERL_CALLCONV OP *Perl_pp_tell(pTHX);
-PERL_CALLCONV OP *Perl_pp_telldir(pTHX);
-PERL_CALLCONV OP *Perl_pp_tie(pTHX);
-PERL_CALLCONV OP *Perl_pp_tied(pTHX);
-PERL_CALLCONV OP *Perl_pp_time(pTHX);
-PERL_CALLCONV OP *Perl_pp_tms(pTHX);
-PERL_CALLCONV OP *Perl_pp_trans(pTHX);
-PERL_CALLCONV OP *Perl_pp_truncate(pTHX);
-PERL_CALLCONV OP *Perl_pp_uc(pTHX);
-PERL_CALLCONV OP *Perl_pp_ucfirst(pTHX);
-PERL_CALLCONV OP *Perl_pp_umask(pTHX);
-PERL_CALLCONV OP *Perl_pp_undef(pTHX);
-PERL_CALLCONV OP *Perl_pp_unpack(pTHX);
-PERL_CALLCONV OP *Perl_pp_unshift(pTHX);
-PERL_CALLCONV OP *Perl_pp_unstack(pTHX);
-PERL_CALLCONV OP *Perl_pp_untie(pTHX);
-PERL_CALLCONV OP *Perl_pp_unweaken(pTHX);
-PERL_CALLCONV OP *Perl_pp_vec(pTHX);
-PERL_CALLCONV OP *Perl_pp_wait(pTHX);
-PERL_CALLCONV OP *Perl_pp_waitpid(pTHX);
-PERL_CALLCONV OP *Perl_pp_wantarray(pTHX);
-PERL_CALLCONV OP *Perl_pp_warn(pTHX);
-PERL_CALLCONV OP *Perl_pp_weaken(pTHX);
-PERL_CALLCONV OP *Perl_pp_xor(pTHX);
-PERL_CALLCONV OP *Perl_unimplemented_op(pTHX);
+PERL_CALLCONV PP(do_kv) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_aassign) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_abs) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_accept) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_add) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_aeach) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_aelem) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_aelemfast) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_aelemfastlex_store) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_akeys) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_alarm) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_and) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_anoncode) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_anonconst) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_anonhash) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_anonlist) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_argcheck) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_argdefelem) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_argelem) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_aslice) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_atan2) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_av2arylen) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_avhvswitch) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_backtick) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_bind) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_binmode) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_bit_and) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_bit_or) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_bless) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_blessed) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_break) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_caller) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_catch) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_ceil) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_chdir) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_chop) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_chown) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_chr) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_chroot) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_clonecv) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_close) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_closedir) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_cmpchain_and) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_cmpchain_dup) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_complement) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_concat) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_cond_expr) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_const) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_continue) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_coreargs) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_crypt) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_dbmopen) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_dbstate) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_defined) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_delete) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_die) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_divide) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_each) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_ehostent) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_emptyavhv) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_enter) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_entereval) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_entergiven) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_enteriter) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_enterloop) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_entersub) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_entertry) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_entertrycatch) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_enterwhen) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_enterwrite) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_eof) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_eq) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_exec) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_exists) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_exit) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_fc) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_fileno) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_flip) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_flock) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_floor) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_flop) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_fork) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_formline) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_ftis) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_ftlink) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_ftrowned) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_ftrread) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_fttext) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_fttty) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_ge) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_gelem) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_getc) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_getlogin) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_getpeername) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_getpgrp) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_getppid) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_getpriority) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_ggrent) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_ghostent) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_glob) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_gmtime) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_gnetent) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_goto) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_gprotoent) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_gpwent) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_grepstart) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_grepwhile) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_gservent) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_gt) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_gv) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_gvsv) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_helem) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_helemexistsor) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_hintseval) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_hslice) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_i_add) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_i_divide) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_i_eq) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_i_ge) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_i_gt) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_i_le) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_i_lt) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_i_modulo) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_i_multiply) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_i_ncmp) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_i_ne) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_i_negate) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_i_subtract) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_index) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_initfield) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_int) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_introcv) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_ioctl) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_is_bool) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_is_tainted) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_is_weak) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_isa) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_iter) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_join) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_kvaslice) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_kvhslice) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_last) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_lc) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_le) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_leave) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_leaveeval) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_leavegiven) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_leaveloop) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_leavesub) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_leavesublv) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_leavetry) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_leavetrycatch) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_leavewhen) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_leavewrite) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_left_shift) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_length) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_link) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_list) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_listen) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_lock) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_lslice) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_lt) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_lvavref) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_lvref) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_lvrefslice) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_mapwhile) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_match) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_method) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_method_named) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_method_redir) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_method_redir_super) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_method_super) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_methstart) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_mkdir) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_modulo) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_multiconcat) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_multideref) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_multiply) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_nbit_and) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_nbit_or) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_ncmp) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_ncomplement) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_ne) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_negate) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_next) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_nextstate) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_not) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_null) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_oct) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_once) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_open) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_open_dir) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_or) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_ord) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_pack) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_padav) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_padcv) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_padhv) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_padrange) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_padsv) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_padsv_store) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_pipe_op) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_poptry) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_pos) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_postdec) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_postinc) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_pow) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_predec) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_preinc) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_print) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_prototype) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_prtf) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_push) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_pushdefer) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_pushmark) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_qr) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_quotemeta) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_rand) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_range) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_rcatline) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_readdir) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_readline) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_readlink) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_redo) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_ref) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_refaddr) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_refassign) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_refgen) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_reftype) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_regcomp) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_regcreset) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_rename) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_repeat) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_require) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_reset) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_return) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_reverse) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_rewinddir) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_right_shift) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_rmdir) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_runcv) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_rv2av) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_rv2cv) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_rv2gv) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_rv2sv) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_sassign) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_sbit_and) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_sbit_or) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_schop) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_scmp) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_scomplement) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_seekdir) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_select) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_semctl) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_semget) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_seq) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_setpgrp) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_setpriority) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_shift) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_shmwrite) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_shostent) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_shutdown) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_sin) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_sle) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_sleep) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_smartmatch) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_sne) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_socket) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_sockpair) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_sort) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_splice) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_split) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_sprintf) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_srand) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_srefgen) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_sselect) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_ssockopt) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_stat) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_stringify) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_stub) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_study) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_subst) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_substcont) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_substr) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_subtract) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_syscall) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_sysopen) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_sysread) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_sysseek) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_system) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_syswrite) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_tell) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_telldir) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_tie) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_tied) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_time) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_tms) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_trans) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_truncate) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_uc) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_ucfirst) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_umask) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_undef) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_unpack) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_unshift) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_unstack) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_untie) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_unweaken) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_vec) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_wait) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_waitpid) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_wantarray) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_warn) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_weaken) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(pp_xor) __attribute__visibility__("hidden");
+PERL_CALLCONV PP(unimplemented_op) __attribute__visibility__("hidden");
 
-/* ex: set ro: */
+/* ex: set ro ft=c: */
index 8cc90a1..20919f6 100644 (file)
@@ -716,6 +716,24 @@ PP(pp_sort)
 
     ENTER;
     SAVEVPTR(PL_sortcop);
+
+    /* Important flag meanings:
+     *
+     *  OPf_STACKED        sort <function_name> args
+     *
+     * (OPf_STACKED
+     * |OPf_SPECIAL)       sort { <block> } args
+     *
+     *  ----               standard block; e.g. sort { $a <=> $b } args
+     *
+     *
+     *  OPpSORT_NUMERIC    { $a <=> $b } (as opposed to $a cmp $b)
+     *  OPpSORT_INTEGER    ditto in scope of 'use integer'
+     *  OPpSORT_DESCEND    { $b <=> $a }
+     *  OPpSORT_REVERSE    @a= reverse sort ....;
+     *  OPpSORT_INPLACE    @a = sort @a;
+     */
+
     if (flags & OPf_STACKED) {
         if (flags & OPf_SPECIAL) {
             OP *nullop = OpSIBLING(cLISTOP->op_first);  /* pass pushmark */
@@ -888,10 +906,10 @@ PP(pp_sort)
 
                     if (hasargs) {
                         /* This is mostly copied from pp_entersub */
-                        AV * const av = MUTABLE_AV(PAD_SVl(0));
+                        AV * const av0 = MUTABLE_AV(PAD_SVl(0));
 
                         cx->blk_sub.savearray = GvAV(PL_defgv);
-                        GvAV(PL_defgv) = MUTABLE_AV(SvREFCNT_inc_simple(av));
+                        GvAV(PL_defgv) = MUTABLE_AV(SvREFCNT_inc_simple(av0));
                     }
 
                 }
index 6cf3124..b18911b 100644 (file)
@@ -30,8 +30,6 @@
 #define PERL_IN_PP_SYS_C
 #include "perl.h"
 #include "time64.h"
-#include "syscall_emulator.h"
-#define syscall syscall_emulator
 
 #ifdef I_SHADOW
 /* Shadow password support for solaris - pdo@cs.umd.edu
 # endif
 #endif
 
+#ifdef I_SYS_SYSCALL
+# include <sys/syscall.h>
+#endif
+
 /* XXX Configure test needed.
    h_errno might not be a simple 'int', especially for multi-threaded
    applications, see "extern int errno in perl.h".  Creating such
@@ -934,7 +936,8 @@ PP(pp_tie)
        stash = gv_stashsv(*MARK, 0);
        if (!stash) {
            if (SvROK(*MARK))
-               DIE(aTHX_ "Can't locate object method \"%s\" via package \"%" SVf "\"",
+               DIE(aTHX_ "Can't locate object method %" PVf_QUOTEDPREFIX
+                         " via package %" SVf_QUOTEDPREFIX,
                    methname, SVfARG(*MARK));
            else if (isGV(*MARK)) {
                /* If the glob doesn't name an existing package, using
@@ -942,15 +945,17 @@ PP(pp_tie)
                 * generate the name for the error message explicitly. */
                SV *stashname = sv_newmortal();
                gv_fullname4(stashname, (GV *) *MARK, NULL, FALSE);
-               DIE(aTHX_ "Can't locate object method \"%s\" via package \"%" SVf "\"",
+               DIE(aTHX_ "Can't locate object method %" PVf_QUOTEDPREFIX
+                         " via package %" SVf_QUOTEDPREFIX,
                    methname, SVfARG(stashname));
            }
            else {
                SV *stashname = !SvPOK(*MARK) ? &PL_sv_no
                              : SvCUR(*MARK)  ? *MARK
                              :                 newSVpvs_flags("main", SVs_TEMP);
-               DIE(aTHX_ "Can't locate object method \"%s\" via package \"%" SVf "\""
-                   " (perhaps you forgot to load \"%" SVf "\"?)",
+               DIE(aTHX_ "Can't locate object method %" PVf_QUOTEDPREFIX
+                         " via package %" SVf_QUOTEDPREFIX
+                   " (perhaps you forgot to load %" SVf_QUOTEDPREFIX "?)",
                    methname, SVfARG(stashname), SVfARG(stashname));
            }
        }
@@ -959,7 +964,8 @@ PP(pp_tie)
             * been deleted from the symbol table, which this one can't
             * be, since we just looked it up by name.
             */
-           DIE(aTHX_ "Can't locate object method \"%s\" via package \"%" HEKf "\"",
+           DIE(aTHX_ "Can't locate object method %" PVf_QUOTEDPREFIX
+                     " via package %" HEKf_QUOTEDPREFIX ,
                methname, HvENAME_HEK_NN(stash));
        }
         ENTER_with_name("call_TIE");
@@ -1167,7 +1173,10 @@ PP(pp_sselect)
                 Perl_croak_no_modify();
         }
         else if (SvIsCOW(sv)) sv_force_normal_flags(sv, 0);
-        if (!SvPOK(sv)) {
+        if (SvPOK(sv)) {
+            if (SvUTF8(sv)) sv_utf8_downgrade(sv, FALSE);
+        }
+        else {
             if (!SvPOKp(sv))
                 Perl_ck_warner(aTHX_ packWARN(WARN_MISC),
                                     "Non-string passed as bitmask");
@@ -1313,6 +1322,10 @@ typeglob.  As C<PL_defoutgv> "owns" a reference on its typeglob, the reference
 count of the passed in typeglob is increased by one, and the reference count
 of the typeglob that C<PL_defoutgv> points to is decreased by one.
 
+=for apidoc AmnU||PL_defoutgv
+
+See C<L</setdefout>>.
+
 =cut
 */
 
@@ -1339,7 +1352,7 @@ PP(pp_select)
     if (!egv)
         egv = PL_defoutgv;
     hv = isGV_with_GP(egv) ? GvSTASH(egv) : NULL;
-    gvp = hv && HvENAME(hv)
+    gvp = hv && HvHasENAME(hv)
                 ? (GV**)hv_fetch(hv, GvNAME(egv), HEK_UTF8(GvNAME_HEK(egv)) ? -GvNAMELEN(egv) : GvNAMELEN(egv), FALSE)
                 : NULL;
     if (gvp && *gvp == egv) {
@@ -1845,9 +1858,8 @@ PP(pp_sysread)
            reading to:  */
         SvCUR_set(bufsv, offset);
 
-        read_target = sv_newmortal();
-        SvUPGRADE(read_target, SVt_PV);
-        buffer = SvGROW(read_target, (STRLEN)(length + 1));
+        read_target = newSV_type_mortal(SVt_PV);
+        buffer = sv_grow_fresh(read_target, (STRLEN)(length + 1));
     }
 
     if (PL_op->op_type == OP_SYSREAD) {
@@ -2274,7 +2286,8 @@ PP(pp_truncate)
 
         if (PL_op->op_flags & OPf_SPECIAL
                        ? (tmpgv = gv_fetchsv(sv, 0, SVt_PVIO), 1)
-                       : !!(tmpgv = MAYBE_DEREF_GV(sv)) ) {
+                       : cBOOL(tmpgv = MAYBE_DEREF_GV(sv)) )
+        {
             io = GvIO(tmpgv);
             if (!io)
                 result = 0;
@@ -2676,6 +2689,9 @@ PP(pp_shutdown)
     RETPUSHUNDEF;
 }
 
+#ifndef PERL_GETSOCKOPT_SIZE
+#define PERL_GETSOCKOPT_SIZE 1024
+#endif
 
 /* also used for: pp_gsockopt() */
 
@@ -2683,7 +2699,7 @@ PP(pp_ssockopt)
 {
     dSP;
     const int optype = PL_op->op_type;
-    SV * const sv = (optype == OP_GSOCKOPT) ? sv_2mortal(newSV(257)) : POPs;
+    SV * const sv = (optype == OP_GSOCKOPT) ? sv_2mortal(newSV(PERL_GETSOCKOPT_SIZE+1)) : POPs;
     const unsigned int optname = (unsigned int) POPi;
     const unsigned int lvl = (unsigned int) POPi;
     GV * const gv = MUTABLE_GV(POPs);
@@ -2702,14 +2718,14 @@ PP(pp_ssockopt)
         /* Note: there used to be an explicit SvGROW(sv,257) here, but
          * this is redundant given the sv initialization ternary above */
         (void)SvPOK_only(sv);
-        SvCUR_set(sv,256);
+        SvCUR_set(sv, PERL_GETSOCKOPT_SIZE);
         *SvEND(sv) ='\0';
         len = SvCUR(sv);
         if (PerlSock_getsockopt(fd, lvl, optname, SvPVX(sv), &len) < 0)
             goto nuts2;
 #if defined(_AIX)
         /* XXX Configure test: does getsockopt set the length properly? */
-        if (len == 256)
+        if (len == PERL_GETSOCKOPT_SIZE)
             len = sizeof(int);
 #endif
         SvCUR_set(sv, len);
@@ -2720,7 +2736,7 @@ PP(pp_ssockopt)
             const char *buf;
             int aint;
             SvGETMAGIC(sv);
-            if (SvPOKp(sv)) {
+            if (SvPOK(sv) && !SvIsBOOL(sv)) { /* sv is originally a string */
                 STRLEN l;
                 buf = SvPVbyte_nomg(sv, l);
                 len = l;
@@ -2829,7 +2845,8 @@ PP(pp_stat)
     SV* sv;
 
     if (PL_op->op_flags & OPf_REF ? (gv = cGVOP_gv, 1)
-                                  : !!(sv=POPs, gv = MAYBE_DEREF_GV(sv))) {
+                                  : cBOOL((sv=POPs, gv = MAYBE_DEREF_GV(sv))))
+    {
         if (PL_op->op_type == OP_LSTAT) {
             if (gv != PL_defgv) {
             do_fstat_warning_check:
@@ -2837,7 +2854,7 @@ PP(pp_stat)
                                "lstat() on filehandle%s%" SVf,
                                 gv ? " " : "",
                                 SVfARG(gv
-                                        ? sv_2mortal(newSVhek(GvENAME_HEK(gv)))
+                                        ? newSVhek_mortal(GvENAME_HEK(gv))
                                         : &PL_sv_no));
             } else if (PL_laststype != OP_LSTAT)
                 /* diag_listed_as: The stat preceding %s wasn't an lstat */
@@ -2976,7 +2993,13 @@ PP(pp_stat)
             Stat_t s;
             CLANG_DIAG_IGNORE_STMT(-Wtautological-compare);
             GCC_DIAG_IGNORE_STMT(-Wtype-limits);
+#if defined(__HP_cc) || defined(__HP_aCC)
+#pragma diag_suppress 2186
+#endif
             neg = PL_statcache.st_ino < 0;
+#if defined(__HP_cc) || defined(__HP_aCC)
+#pragma diag_default 2186
+#endif
             GCC_DIAG_RESTORE_STMT;
             CLANG_DIAG_RESTORE_STMT;
             if (neg) {
@@ -3098,9 +3121,11 @@ S_ft_return_true(pTHX_ SV *ret) {
 #define FT_RETURNUNDEF return S_ft_return_false(aTHX_ &PL_sv_undef)
 #define FT_RETURNYES   return S_ft_return_true(aTHX_ &PL_sv_yes)
 
+/* NB: OPf_REF implies '-X _' and thus no arg on the stack */
 #define tryAMAGICftest_MG(chr) STMT_START { \
-        if ( (SvFLAGS(*PL_stack_sp) & (SVf_ROK|SVs_GMG)) \
-                && PL_op->op_flags & OPf_KIDS) {     \
+        if (   !(PL_op->op_flags & OPf_REF)                   \
+            && (SvFLAGS(*PL_stack_sp) & (SVf_ROK|SVs_GMG)))   \
+        {                                                     \
             OP *next = S_try_amagic_ftest(aTHX_ chr);  \
             if (next) return next;                       \
         }                                                 \
@@ -4225,6 +4250,7 @@ PP(pp_fork)
     sigset_t oldmask, newmask;
 #endif
 
+
     EXTEND(SP, 1);
     PERL_FLUSHALL_FOR_CHILD;
 #ifdef HAS_SIGPROCMASK
@@ -4252,6 +4278,9 @@ PP(pp_fork)
 #ifdef PERL_USES_PL_PIDSTATUS
         hv_clear(PL_pidstatus);        /* no kids, so don't wait for 'em */
 #endif
+        PERL_SRAND_OVERRIDE_NEXT_CHILD();
+    } else {
+        PERL_SRAND_OVERRIDE_NEXT_PARENT();
     }
     PUSHi(childpid);
     RETURN;
@@ -4264,6 +4293,19 @@ PP(pp_fork)
     childpid = PerlProc_fork();
     if (childpid == -1)
         RETPUSHUNDEF;
+    else if (childpid) {
+        /* we are in the parent */
+        PERL_SRAND_OVERRIDE_NEXT_PARENT();
+    }
+    else {
+        /* This is part of the logic supporting the env var
+         * PERL_RAND_SEED which causes use of rand() without an
+         * explicit srand() to use a deterministic seed. This logic is
+         * intended to give most forked children of a process a
+         * deterministic but different srand seed.
+         */
+        PERL_SRAND_OVERRIDE_NEXT_CHILD();
+    }
     PUSHi(childpid);
     RETURN;
 #else
@@ -5494,20 +5536,28 @@ PP(pp_gpwent)
     case OP_GPWNAM:
       {
         const char* const name = POPpbytex;
+        GETPWNAM_LOCK;
         pwent  = getpwnam(name);
+        GETPWNAM_UNLOCK;
       }
       break;
     case OP_GPWUID:
       {
         Uid_t uid = POPi;
+        GETPWUID_LOCK;
         pwent = getpwuid(uid);
+        GETPWUID_UNLOCK;
       }
         break;
     case OP_GPWENT:
 #   ifdef HAS_GETPWENT
         pwent  = getpwent();
 #ifdef POSIX_BC   /* In some cases pw_passwd has invalid addresses */
-        if (pwent) pwent = getpwnam(pwent->pw_name);
+        if (pwent) {
+            GETPWNAM_LOCK;
+            pwent = getpwnam(pwent->pw_name);
+            GETPWNAM_UNLOCK;
+        }
 #endif
 #   else
         DIE(aTHX_ PL_no_func, "getpwent");
@@ -5552,8 +5602,10 @@ PP(pp_gpwent)
          * has a different API than the Solaris/IRIX one. */
 #   if defined(HAS_GETSPNAM) && !defined(_AIX)
         {
+            const struct spwd * spwent;
             dSAVE_ERRNO;
-            const struct spwd * const spwent = getspnam(pwent->pw_name);
+            GETSPNAM_LOCK;
+            spwent = getspnam(pwent->pw_name);
                           /* Save and restore errno so that
                            * underprivileged attempts seem
                            * to have never made the unsuccessful
@@ -5561,6 +5613,7 @@ PP(pp_gpwent)
             RESTORE_ERRNO;
             if (spwent && spwent->sp_pwdp)
                 sv_setpv(sv, spwent->sp_pwdp);
+            GETSPNAM_UNLOCK;
         }
 #   endif
 #   ifdef PWPASSWD
index 91a4443..4ef9466 100644 (file)
-/* -*- buffer-read-only: t -*-
+/* -*- mode: C; buffer-read-only: t -*-
  *
  *    proto.h
  *
  *    Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
- *    2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by Larry Wall and others
+ *    2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013,
+ *    2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022
+ *    by Larry Wall and others
  *
  *    You may distribute under the terms of either the GNU General Public
  *    License or the Artistic License, as specified in the README file.
  *
  * !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!!
- * This file is built by regen/embed.pl from data in embed.fnc,
- * regen/embed.pl, regen/opcodes, intrpvar.h and perlvars.h.
+ * This file is built by regen/embed.pl from embed.fnc, intrpvar.h,
+ * perlvars.h, regen/opcodes, regen/embed.pl, regen/embed_lib.pl and
+ * regen/HeaderParser.pm.
  * Any changes made here will be lost!
  *
  * Edit those files and run 'make regen_headers' to effect changes.
  */
 
 START_EXTERN_C
-#ifndef NO_MATHOMS
-PERL_CALLCONV UV       ASCII_TO_NEED(const UV enc, const UV ch)
-                       __attribute__deprecated__
-                       __attribute__warn_unused_result__
-                       __attribute__pure__;
-#define PERL_ARGS_ASSERT_ASCII_TO_NEED
-#endif
-
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE I32 *       Perl_CvDEPTH(const CV * const sv);
-#define PERL_ARGS_ASSERT_CVDEPTH       \
-       assert(sv)
-#endif
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE GV *        Perl_CvGV(pTHX_ CV *sv);
-#define PERL_ARGS_ASSERT_CVGV  \
-       assert(sv)
-#endif
-PERL_CALLCONV int      Perl_Gv_AMupdate(pTHX_ HV* stash, bool destructing);
-#define PERL_ARGS_ASSERT_GV_AMUPDATE   \
-       assert(stash)
-#ifndef NO_MATHOMS
-PERL_CALLCONV UV       NATIVE_TO_NEED(const UV enc, const UV ch)
-                       __attribute__deprecated__
-                       __attribute__warn_unused_result__
-                       __attribute__pure__;
-#define PERL_ARGS_ASSERT_NATIVE_TO_NEED
-#endif
+PERL_CALLCONV int
+Perl_Gv_AMupdate(pTHX_ HV *stash, bool destructing);
+#define PERL_ARGS_ASSERT_GV_AMUPDATE            \
+        assert(stash)
 
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE I32 Perl_POPMARK(pTHX);
-#define PERL_ARGS_ASSERT_POPMARK
-#endif
-PERL_CALLCONV const char *     Perl_PerlIO_context_layers(pTHX_ const char *mode);
+PERL_CALLCONV const char *
+Perl_PerlIO_context_layers(pTHX_ const char *mode);
 #define PERL_ARGS_ASSERT_PERLIO_CONTEXT_LAYERS
-PERL_CALLCONV int      Perl_PerlLIO_dup2_cloexec(pTHX_ int oldfd, int newfd);
-#define PERL_ARGS_ASSERT_PERLLIO_DUP2_CLOEXEC
-PERL_CALLCONV int      Perl_PerlLIO_dup_cloexec(pTHX_ int oldfd)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_PERLLIO_DUP_CLOEXEC
 
-PERL_CALLCONV int      Perl_PerlLIO_open3_cloexec(pTHX_ const char *file, int flag, int perm)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_PERLLIO_OPEN3_CLOEXEC \
-       assert(file)
+PERL_CALLCONV int
+Perl_PerlLIO_dup2_cloexec(pTHX_ int oldfd, int newfd)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_PERLLIO_DUP2_CLOEXEC
 
-PERL_CALLCONV int      Perl_PerlLIO_open_cloexec(pTHX_ const char *file, int flag)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_PERLLIO_OPEN_CLOEXEC  \
-       assert(file)
+PERL_CALLCONV int
+Perl_PerlLIO_dup_cloexec(pTHX_ int oldfd)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_PERLLIO_DUP_CLOEXEC
 
-/* PERL_CALLCONV const XOP *   Perl_custom_op_xop(pTHX_ const OP *o); */
-#define PERL_ARGS_ASSERT_PERL_CUSTOM_OP_XOP
-PERL_CALLCONV const char*      Perl_setlocale(const int category, const char* locale);
+PERL_CALLCONV int
+Perl_PerlLIO_open3_cloexec(pTHX_ const char *file, int flag, int perm)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_PERLLIO_OPEN3_CLOEXEC  \
+        assert(file)
+
+PERL_CALLCONV int
+Perl_PerlLIO_open_cloexec(pTHX_ const char *file, int flag)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_PERLLIO_OPEN_CLOEXEC   \
+        assert(file)
+
+/* PERL_CALLCONV const XOP *
+Perl_custom_op_xop(pTHX_ const OP *o); */
+
+PERL_CALLCONV HV *
+Perl_localeconv(pTHX);
+#define PERL_ARGS_ASSERT_PERL_LOCALECONV
+
+PERL_CALLCONV const char *
+Perl_setlocale(const int category, const char *locale);
 #define PERL_ARGS_ASSERT_PERL_SETLOCALE
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE struct regexp *     Perl_ReANY(const REGEXP * const re);
-#define PERL_ARGS_ASSERT_REANY \
-       assert(re)
-#endif
-PERL_CALLCONV void*    Perl_Slab_Alloc(pTHX_ size_t sz)
-                       __attribute__warn_unused_result__;
+
+PERL_CALLCONV void *
+Perl_Slab_Alloc(pTHX_ size_t sz)
+        __attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_SLAB_ALLOC
 
-PERL_CALLCONV void     Perl_Slab_Free(pTHX_ void *op);
-#define PERL_ARGS_ASSERT_SLAB_FREE     \
-       assert(op)
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE void        Perl_SvAMAGIC_off(SV *sv);
-#define PERL_ARGS_ASSERT_SVAMAGIC_OFF  \
-       assert(sv)
-#endif
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE void        Perl_SvAMAGIC_on(SV *sv);
-#define PERL_ARGS_ASSERT_SVAMAGIC_ON   \
-       assert(sv)
-#endif
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE void        Perl_SvREFCNT_dec(pTHX_ SV *sv);
-#define PERL_ARGS_ASSERT_SVREFCNT_DEC
-#endif
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE void        Perl_SvREFCNT_dec_NN(pTHX_ SV *sv);
-#define PERL_ARGS_ASSERT_SVREFCNT_DEC_NN       \
-       assert(sv)
-#endif
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE SV *        Perl_SvREFCNT_inc(SV *sv);
-#define PERL_ARGS_ASSERT_SVREFCNT_INC
-#endif
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE SV *        Perl_SvREFCNT_inc_NN(SV *sv);
-#define PERL_ARGS_ASSERT_SVREFCNT_INC_NN       \
-       assert(sv)
-#endif
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE void        Perl_SvREFCNT_inc_void(SV *sv);
-#define PERL_ARGS_ASSERT_SVREFCNT_INC_VOID
-#endif
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE bool        Perl_SvTRUE(pTHX_ SV *sv);
-#define PERL_ARGS_ASSERT_SVTRUE
-#endif
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE bool        Perl_SvTRUE_NN(pTHX_ SV *sv);
-#define PERL_ARGS_ASSERT_SVTRUE_NN     \
-       assert(sv)
-#endif
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE bool        Perl_SvTRUE_common(pTHX_ SV *sv, const bool sv_2bool_is_fallback);
-#define PERL_ARGS_ASSERT_SVTRUE_COMMON \
-       assert(sv)
-#endif
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE bool        Perl_SvTRUE_nomg(pTHX_ SV *sv);
-#define PERL_ARGS_ASSERT_SVTRUE_NOMG
-#endif
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE I32 Perl_TOPMARK(pTHX);
-#define PERL_ARGS_ASSERT_TOPMARK
-#endif
-PERL_CALLCONV char *   Perl__byte_dump_string(pTHX_ const U8 * const start, const STRLEN len, const bool format);
-#define PERL_ARGS_ASSERT__BYTE_DUMP_STRING     \
-       assert(start)
-PERL_CALLCONV void     Perl__force_out_malformed_utf8_message(pTHX_ const U8 *const p, const U8 * const e, const U32 flags, const bool die_here);
-#define PERL_ARGS_ASSERT__FORCE_OUT_MALFORMED_UTF8_MESSAGE     \
-       assert(p); assert(e)
-PERL_CALLCONV Size_t   Perl__inverse_folds(pTHX_ const UV cp, U32 * first_folds_to, const U32 ** remaining_folds_to)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT__INVERSE_FOLDS        \
-       assert(first_folds_to); assert(remaining_folds_to)
-
-PERL_CALLCONV bool     Perl__is_in_locale_category(pTHX_ const bool compiling, const int category);
+PERL_CALLCONV void
+Perl_Slab_Free(pTHX_ void *op);
+#define PERL_ARGS_ASSERT_SLAB_FREE              \
+        assert(op)
+
+/* PERL_CALLCONV void
+SvREFCNT_dec_set_NULL(pTHX_ SV *sv); */
+
+PERL_CALLCONV char *
+Perl__byte_dump_string(pTHX_ const U8 * const start, const STRLEN len, const bool format);
+#define PERL_ARGS_ASSERT__BYTE_DUMP_STRING      \
+        assert(start)
+
+PERL_CALLCONV void
+Perl__force_out_malformed_utf8_message(pTHX_ const U8 * const p, const U8 * const e, const U32 flags, const bool die_here);
+#define PERL_ARGS_ASSERT__FORCE_OUT_MALFORMED_UTF8_MESSAGE \
+        assert(p); assert(e)
+
+PERL_CALLCONV Size_t
+Perl__inverse_folds(pTHX_ const UV cp, U32 *first_folds_to, const U32 **remaining_folds_to)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT__INVERSE_FOLDS         \
+        assert(first_folds_to); assert(remaining_folds_to)
+
+PERL_CALLCONV bool
+Perl__is_in_locale_category(pTHX_ const bool compiling, const int category);
 #define PERL_ARGS_ASSERT__IS_IN_LOCALE_CATEGORY
-PERL_CALLCONV bool     Perl__is_uni_FOO(pTHX_ const U8 classnum, const UV c)
-                       __attribute__warn_unused_result__;
+
+PERL_CALLCONV bool
+Perl__is_uni_FOO(pTHX_ const U8 classnum, const UV c)
+        __attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT__IS_UNI_FOO
 
-PERL_CALLCONV bool     Perl__is_uni_perl_idcont(pTHX_ UV c)
-                       __attribute__warn_unused_result__;
+PERL_CALLCONV bool
+Perl__is_uni_perl_idcont(pTHX_ UV c)
+        __attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT__IS_UNI_PERL_IDCONT
 
-PERL_CALLCONV bool     Perl__is_uni_perl_idstart(pTHX_ UV c)
-                       __attribute__warn_unused_result__;
+PERL_CALLCONV bool
+Perl__is_uni_perl_idstart(pTHX_ UV c)
+        __attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT__IS_UNI_PERL_IDSTART
 
-PERL_CALLCONV bool     Perl__is_utf8_FOO(pTHX_ const U8 classnum, const U8 *p, const U8 * const e)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT__IS_UTF8_FOO  \
-       assert(p); assert(e)
-
-PERL_CALLCONV bool     Perl__is_utf8_perl_idcont(pTHX_ const U8 *p, const U8 * const e)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT__IS_UTF8_PERL_IDCONT  \
-       assert(p); assert(e)
-
-PERL_CALLCONV bool     Perl__is_utf8_perl_idstart(pTHX_ const U8 *p, const U8 * const e)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT__IS_UTF8_PERL_IDSTART \
-       assert(p); assert(e)
-
-PERL_CALLCONV UV       Perl__to_uni_fold_flags(pTHX_ UV c, U8 *p, STRLEN *lenp, U8 flags);
-#define PERL_ARGS_ASSERT__TO_UNI_FOLD_FLAGS    \
-       assert(p); assert(lenp)
-PERL_CALLCONV UV       Perl__to_utf8_fold_flags(pTHX_ const U8 *p, const U8 *e, U8* ustrp, STRLEN *lenp, U8 flags);
-#define PERL_ARGS_ASSERT__TO_UTF8_FOLD_FLAGS   \
-       assert(p); assert(ustrp)
-PERL_CALLCONV UV       Perl__to_utf8_lower_flags(pTHX_ const U8 *p, const U8* e, U8* ustrp, STRLEN *lenp, bool flags);
-#define PERL_ARGS_ASSERT__TO_UTF8_LOWER_FLAGS  \
-       assert(p); assert(ustrp)
-PERL_CALLCONV UV       Perl__to_utf8_title_flags(pTHX_ const U8 *p, const U8* e, U8* ustrp, STRLEN *lenp, bool flags);
-#define PERL_ARGS_ASSERT__TO_UTF8_TITLE_FLAGS  \
-       assert(p); assert(ustrp)
-PERL_CALLCONV UV       Perl__to_utf8_upper_flags(pTHX_ const U8 *p, const U8 *e, U8* ustrp, STRLEN *lenp, bool flags);
-#define PERL_ARGS_ASSERT__TO_UTF8_UPPER_FLAGS  \
-       assert(p); assert(ustrp)
-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)
-PERL_CALLCONV void     Perl__warn_problematic_locale(void);
+PERL_CALLCONV bool
+Perl__is_utf8_FOO(pTHX_ const U8 classnum, const U8 *p, const U8 * const e)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT__IS_UTF8_FOO           \
+        assert(p); assert(e)
+
+PERL_CALLCONV bool
+Perl__is_utf8_perl_idcont(pTHX_ const U8 *p, const U8 * const e)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT__IS_UTF8_PERL_IDCONT   \
+        assert(p); assert(e)
+
+PERL_CALLCONV bool
+Perl__is_utf8_perl_idstart(pTHX_ const U8 *p, const U8 * const e)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT__IS_UTF8_PERL_IDSTART  \
+        assert(p); assert(e)
+
+PERL_CALLCONV UV
+Perl__to_uni_fold_flags(pTHX_ UV c, U8 *p, STRLEN *lenp, U8 flags);
+#define PERL_ARGS_ASSERT__TO_UNI_FOLD_FLAGS     \
+        assert(p); assert(lenp)
+
+PERL_CALLCONV UV
+Perl__to_utf8_fold_flags(pTHX_ const U8 *p, const U8 *e, U8 *ustrp, STRLEN *lenp, U8 flags);
+#define PERL_ARGS_ASSERT__TO_UTF8_FOLD_FLAGS    \
+        assert(p); assert(ustrp)
+
+PERL_CALLCONV UV
+Perl__to_utf8_lower_flags(pTHX_ const U8 *p, const U8 *e, U8 *ustrp, STRLEN *lenp, bool flags);
+#define PERL_ARGS_ASSERT__TO_UTF8_LOWER_FLAGS   \
+        assert(p); assert(ustrp)
+
+PERL_CALLCONV UV
+Perl__to_utf8_title_flags(pTHX_ const U8 *p, const U8 *e, U8 *ustrp, STRLEN *lenp, bool flags);
+#define PERL_ARGS_ASSERT__TO_UTF8_TITLE_FLAGS   \
+        assert(p); assert(ustrp)
+
+PERL_CALLCONV UV
+Perl__to_utf8_upper_flags(pTHX_ const U8 *p, const U8 *e, U8 *ustrp, STRLEN *lenp, bool flags);
+#define PERL_ARGS_ASSERT__TO_UTF8_UPPER_FLAGS   \
+        assert(p); assert(ustrp)
+
+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)
+
+PERL_CALLCONV void
+Perl__warn_problematic_locale(void);
 #define PERL_ARGS_ASSERT__WARN_PROBLEMATIC_LOCALE
-PERL_CALLCONV_NO_RET void      Perl_abort_execution(pTHX_ const char * const msg, const char * const name)
-                       __attribute__noreturn__;
-#define PERL_ARGS_ASSERT_ABORT_EXECUTION       \
-       assert(msg); assert(name)
 
-PERL_CALLCONV LOGOP*   Perl_alloc_LOGOP(pTHX_ I32 type, OP *first, OP *other);
+PERL_CALLCONV_NO_RET void
+Perl_abort_execution(pTHX_ SV *msg_sv, const char * const name)
+        __attribute__noreturn__
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_ABORT_EXECUTION        \
+        assert(name)
+
+PERL_CALLCONV LOGOP *
+Perl_alloc_LOGOP(pTHX_ I32 type, OP *first, OP *other)
+        __attribute__visibility__("hidden");
 #define PERL_ARGS_ASSERT_ALLOC_LOGOP
-PERL_CALLCONV PADOFFSET        Perl_allocmy(pTHX_ const char *const name, const STRLEN len, const U32 flags);
-#define PERL_ARGS_ASSERT_ALLOCMY       \
-       assert(name)
-PERL_CALLCONV SV*      Perl_amagic_call(pTHX_ SV* left, SV* right, int method, int dir);
-#define PERL_ARGS_ASSERT_AMAGIC_CALL   \
-       assert(left); assert(right)
-PERL_CALLCONV SV *     Perl_amagic_deref_call(pTHX_ SV *ref, int method);
-#define PERL_ARGS_ASSERT_AMAGIC_DEREF_CALL     \
-       assert(ref)
-PERL_CALLCONV bool     Perl_amagic_is_enabled(pTHX_ int method);
+
+PERL_CALLCONV PADOFFSET
+Perl_allocmy(pTHX_ const char * const name, const STRLEN len, const U32 flags)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_ALLOCMY                \
+        assert(name)
+
+PERL_CALLCONV bool
+Perl_amagic_applies(pTHX_ SV *sv, int method, int flags);
+#define PERL_ARGS_ASSERT_AMAGIC_APPLIES         \
+        assert(sv)
+
+PERL_CALLCONV SV *
+Perl_amagic_call(pTHX_ SV *left, SV *right, int method, int dir);
+#define PERL_ARGS_ASSERT_AMAGIC_CALL            \
+        assert(left); assert(right)
+
+PERL_CALLCONV SV *
+Perl_amagic_deref_call(pTHX_ SV *ref, int method);
+#define PERL_ARGS_ASSERT_AMAGIC_DEREF_CALL      \
+        assert(ref)
+
+PERL_CALLCONV bool
+Perl_amagic_is_enabled(pTHX_ int method)
+        __attribute__visibility__("hidden");
 #define PERL_ARGS_ASSERT_AMAGIC_IS_ENABLED
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE void        Perl_append_utf8_from_native_byte(const U8 byte, U8** dest);
-#define PERL_ARGS_ASSERT_APPEND_UTF8_FROM_NATIVE_BYTE  \
-       assert(dest)
-#endif
-PERL_CALLCONV I32      Perl_apply(pTHX_ I32 type, SV** mark, SV** sp);
-#define PERL_ARGS_ASSERT_APPLY \
-       assert(mark); assert(sp)
-PERL_CALLCONV void     Perl_apply_attrs_string(pTHX_ const char *stashpv, CV *cv, const char *attrstr, STRLEN len);
-#define PERL_ARGS_ASSERT_APPLY_ATTRS_STRING    \
-       assert(stashpv); assert(cv); assert(attrstr)
-PERL_CALLCONV void     Perl_atfork_lock(void);
+
+PERL_CALLCONV I32
+Perl_apply(pTHX_ I32 type, SV **mark, SV **sp)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_APPLY                  \
+        assert(mark); assert(sp)
+
+PERL_CALLCONV void
+Perl_apply_attrs_string(pTHX_ const char *stashpv, CV *cv, const char *attrstr, STRLEN len);
+#define PERL_ARGS_ASSERT_APPLY_ATTRS_STRING     \
+        assert(stashpv); assert(cv); assert(attrstr)
+
+PERL_CALLCONV OP *
+Perl_apply_builtin_cv_attributes(pTHX_ CV *cv, OP *attrlist);
+#define PERL_ARGS_ASSERT_APPLY_BUILTIN_CV_ATTRIBUTES \
+        assert(cv)
+
+PERL_CALLCONV void
+Perl_atfork_lock(void);
 #define PERL_ARGS_ASSERT_ATFORK_LOCK
-PERL_CALLCONV void     Perl_atfork_unlock(void);
-#define PERL_ARGS_ASSERT_ATFORK_UNLOCK
-PERL_CALLCONV SV**     Perl_av_arylen_p(pTHX_ AV *av);
-#define PERL_ARGS_ASSERT_AV_ARYLEN_P   \
-       assert(av)
-PERL_CALLCONV void     Perl_av_clear(pTHX_ AV *av);
-#define PERL_ARGS_ASSERT_AV_CLEAR      \
-       assert(av)
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE Size_t      Perl_av_count(pTHX_ AV *av)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_AV_COUNT      \
-       assert(av)
-#endif
 
-PERL_CALLCONV void     Perl_av_create_and_push(pTHX_ AV **const avp, SV *const val);
-#define PERL_ARGS_ASSERT_AV_CREATE_AND_PUSH    \
-       assert(avp); assert(val)
-PERL_CALLCONV SV**     Perl_av_create_and_unshift_one(pTHX_ AV **const avp, SV *const val);
-#define PERL_ARGS_ASSERT_AV_CREATE_AND_UNSHIFT_ONE     \
-       assert(avp); assert(val)
-PERL_CALLCONV SV*      Perl_av_delete(pTHX_ AV *av, SSize_t key, I32 flags);
-#define PERL_ARGS_ASSERT_AV_DELETE     \
-       assert(av)
-PERL_CALLCONV bool     Perl_av_exists(pTHX_ AV *av, SSize_t key)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_AV_EXISTS     \
-       assert(av)
-
-PERL_CALLCONV void     Perl_av_extend(pTHX_ AV *av, SSize_t key);
-#define PERL_ARGS_ASSERT_AV_EXTEND     \
-       assert(av)
-PERL_CALLCONV void     Perl_av_extend_guts(pTHX_ AV *av, SSize_t key, SSize_t *maxp, SV ***allocp, SV ***arrayp);
-#define PERL_ARGS_ASSERT_AV_EXTEND_GUTS        \
-       assert(maxp); assert(allocp); assert(arrayp)
-PERL_CALLCONV SV**     Perl_av_fetch(pTHX_ AV *av, SSize_t key, I32 lval)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_AV_FETCH      \
-       assert(av)
-
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE SV**        Perl_av_fetch_simple(pTHX_ AV *av, SSize_t key, I32 lval)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_AV_FETCH_SIMPLE       \
-       assert(av)
-#endif
+PERL_CALLCONV void
+Perl_atfork_unlock(void);
+#define PERL_ARGS_ASSERT_ATFORK_UNLOCK
 
-PERL_CALLCONV void     Perl_av_fill(pTHX_ AV *av, SSize_t fill);
-#define PERL_ARGS_ASSERT_AV_FILL       \
-       assert(av)
-PERL_CALLCONV IV*      Perl_av_iter_p(pTHX_ AV *av);
-#define PERL_ARGS_ASSERT_AV_ITER_P     \
-       assert(av)
-PERL_CALLCONV SSize_t  Perl_av_len(pTHX_ AV *av)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_AV_LEN        \
-       assert(av)
-
-PERL_CALLCONV AV*      Perl_av_make(pTHX_ SSize_t size, SV **strp)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_AV_MAKE       \
-       assert(strp)
-
-PERL_CALLCONV AV*      Perl_av_new_alloc(pTHX_ SSize_t size, bool zeroflag)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_AV_NEW_ALLOC
-
-PERL_CALLCONV SV*      Perl_av_nonelem(pTHX_ AV *av, SSize_t ix);
-#define PERL_ARGS_ASSERT_AV_NONELEM    \
-       assert(av)
-PERL_CALLCONV SV*      Perl_av_pop(pTHX_ AV *av);
-#define PERL_ARGS_ASSERT_AV_POP        \
-       assert(av)
-PERL_CALLCONV void     Perl_av_push(pTHX_ AV *av, SV *val);
-#define PERL_ARGS_ASSERT_AV_PUSH       \
-       assert(av); assert(val)
-PERL_CALLCONV void     Perl_av_reify(pTHX_ AV *av);
-#define PERL_ARGS_ASSERT_AV_REIFY      \
-       assert(av)
-PERL_CALLCONV SV*      Perl_av_shift(pTHX_ AV *av)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_AV_SHIFT      \
-       assert(av)
-
-PERL_CALLCONV SV**     Perl_av_store(pTHX_ AV *av, SSize_t key, SV *val);
-#define PERL_ARGS_ASSERT_AV_STORE      \
-       assert(av)
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE SV**        Perl_av_store_simple(pTHX_ AV *av, SSize_t key, SV *val);
-#define PERL_ARGS_ASSERT_AV_STORE_SIMPLE       \
-       assert(av)
-#endif
-/* PERL_CALLCONV SSize_t       av_tindex(pTHX_ AV *av)
-                       __attribute__warn_unused_result__; */
-#define PERL_ARGS_ASSERT_AV_TINDEX
-
-/* PERL_CALLCONV SSize_t       av_top_index(pTHX_ AV *av)
-                       __attribute__warn_unused_result__; */
-#define PERL_ARGS_ASSERT_AV_TOP_INDEX
-
-PERL_CALLCONV void     Perl_av_undef(pTHX_ AV *av);
-#define PERL_ARGS_ASSERT_AV_UNDEF      \
-       assert(av)
-PERL_CALLCONV void     Perl_av_unshift(pTHX_ AV *av, SSize_t num);
-#define PERL_ARGS_ASSERT_AV_UNSHIFT    \
-       assert(av)
-PERL_CALLCONV OP*      Perl_bind_match(pTHX_ I32 type, OP *left, OP *right)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_BIND_MATCH    \
-       assert(left); assert(right)
-
-PERL_CALLCONV OP*      Perl_block_end(pTHX_ I32 floor, OP* seq)
-                       __attribute__warn_unused_result__;
+PERL_CALLCONV SV **
+Perl_av_arylen_p(pTHX_ AV *av);
+#define PERL_ARGS_ASSERT_AV_ARYLEN_P            \
+        assert(av)
+
+PERL_CALLCONV void
+Perl_av_clear(pTHX_ AV *av);
+#define PERL_ARGS_ASSERT_AV_CLEAR               \
+        assert(av)
+
+PERL_CALLCONV void
+Perl_av_create_and_push(pTHX_ AV ** const avp, SV * const val);
+#define PERL_ARGS_ASSERT_AV_CREATE_AND_PUSH     \
+        assert(avp); assert(val)
+
+PERL_CALLCONV SV **
+Perl_av_create_and_unshift_one(pTHX_ AV ** const avp, SV * const val);
+#define PERL_ARGS_ASSERT_AV_CREATE_AND_UNSHIFT_ONE \
+        assert(avp); assert(val)
+
+PERL_CALLCONV SV *
+Perl_av_delete(pTHX_ AV *av, SSize_t key, I32 flags);
+#define PERL_ARGS_ASSERT_AV_DELETE              \
+        assert(av)
+
+PERL_CALLCONV void
+Perl_av_dump(pTHX_ AV *av);
+#define PERL_ARGS_ASSERT_AV_DUMP
+
+PERL_CALLCONV bool
+Perl_av_exists(pTHX_ AV *av, SSize_t key)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_AV_EXISTS              \
+        assert(av)
+
+PERL_CALLCONV void
+Perl_av_extend(pTHX_ AV *av, SSize_t key);
+#define PERL_ARGS_ASSERT_AV_EXTEND              \
+        assert(av)
+
+PERL_CALLCONV void
+Perl_av_extend_guts(pTHX_ AV *av, SSize_t key, SSize_t *maxp, SV ***allocp, SV ***arrayp)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_AV_EXTEND_GUTS         \
+        assert(maxp); assert(allocp); assert(arrayp)
+
+PERL_CALLCONV SV **
+Perl_av_fetch(pTHX_ AV *av, SSize_t key, I32 lval)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_AV_FETCH               \
+        assert(av)
+
+PERL_CALLCONV void
+Perl_av_fill(pTHX_ AV *av, SSize_t fill);
+#define PERL_ARGS_ASSERT_AV_FILL                \
+        assert(av)
+
+PERL_CALLCONV IV *
+Perl_av_iter_p(pTHX_ AV *av);
+#define PERL_ARGS_ASSERT_AV_ITER_P              \
+        assert(av)
+
+PERL_CALLCONV SSize_t
+Perl_av_len(pTHX_ AV *av)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_AV_LEN                 \
+        assert(av)
+
+PERL_CALLCONV AV *
+Perl_av_make(pTHX_ SSize_t size, SV **strp)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_AV_MAKE                \
+        assert(strp)
+
+PERL_CALLCONV SV *
+Perl_av_nonelem(pTHX_ AV *av, SSize_t ix)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_AV_NONELEM             \
+        assert(av)
+
+PERL_CALLCONV SV *
+Perl_av_pop(pTHX_ AV *av);
+#define PERL_ARGS_ASSERT_AV_POP                 \
+        assert(av)
+
+PERL_CALLCONV void
+Perl_av_push(pTHX_ AV *av, SV *val);
+#define PERL_ARGS_ASSERT_AV_PUSH                \
+        assert(av); assert(val)
+
+PERL_CALLCONV void
+Perl_av_reify(pTHX_ AV *av);
+#define PERL_ARGS_ASSERT_AV_REIFY               \
+        assert(av)
+
+PERL_CALLCONV SV *
+Perl_av_shift(pTHX_ AV *av)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_AV_SHIFT               \
+        assert(av)
+
+PERL_CALLCONV SV **
+Perl_av_store(pTHX_ AV *av, SSize_t key, SV *val);
+#define PERL_ARGS_ASSERT_AV_STORE               \
+        assert(av)
+
+/* PERL_CALLCONV SSize_t
+av_tindex(pTHX_ AV *av)
+        __attribute__warn_unused_result__; */
+
+/* PERL_CALLCONV SSize_t
+av_top_index(pTHX_ AV *av)
+        __attribute__warn_unused_result__; */
+
+PERL_CALLCONV void
+Perl_av_undef(pTHX_ AV *av);
+#define PERL_ARGS_ASSERT_AV_UNDEF               \
+        assert(av)
+
+PERL_CALLCONV void
+Perl_av_unshift(pTHX_ AV *av, SSize_t num);
+#define PERL_ARGS_ASSERT_AV_UNSHIFT             \
+        assert(av)
+
+PERL_CALLCONV OP *
+Perl_bind_match(pTHX_ I32 type, OP *left, OP *right)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_BIND_MATCH             \
+        assert(left); assert(right)
+
+PERL_CALLCONV OP *
+Perl_block_end(pTHX_ I32 floor, OP *seq)
+        __attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_BLOCK_END
 
-PERL_CALLCONV U8       Perl_block_gimme(pTHX)
-                       __attribute__warn_unused_result__;
+PERL_CALLCONV U8
+Perl_block_gimme(pTHX)
+        __attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_BLOCK_GIMME
 
-PERL_CALLCONV int      Perl_block_start(pTHX_ int full)
-                       __attribute__warn_unused_result__;
+PERL_CALLCONV int
+Perl_block_start(pTHX_ int full)
+        __attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_BLOCK_START
 
-PERL_CALLCONV void     Perl_blockhook_register(pTHX_ BHK *hk);
-#define PERL_ARGS_ASSERT_BLOCKHOOK_REGISTER    \
-       assert(hk)
-PERL_CALLCONV void     Perl_boot_core_PerlIO(pTHX);
+PERL_CALLCONV void
+Perl_blockhook_register(pTHX_ BHK *hk);
+#define PERL_ARGS_ASSERT_BLOCKHOOK_REGISTER     \
+        assert(hk)
+
+PERL_CALLCONV void
+Perl_boot_core_PerlIO(pTHX)
+        __attribute__visibility__("hidden");
 #define PERL_ARGS_ASSERT_BOOT_CORE_PERLIO
-PERL_CALLCONV void     Perl_boot_core_UNIVERSAL(pTHX);
+
+PERL_CALLCONV void
+Perl_boot_core_UNIVERSAL(pTHX)
+        __attribute__visibility__("hidden");
 #define PERL_ARGS_ASSERT_BOOT_CORE_UNIVERSAL
-PERL_CALLCONV void     Perl_boot_core_builtin(pTHX);
+
+PERL_CALLCONV void
+Perl_boot_core_builtin(pTHX)
+        __attribute__visibility__("hidden");
 #define PERL_ARGS_ASSERT_BOOT_CORE_BUILTIN
-PERL_CALLCONV void     Perl_boot_core_mro(pTHX);
+
+PERL_CALLCONV void
+Perl_boot_core_mro(pTHX)
+        __attribute__visibility__("hidden");
 #define PERL_ARGS_ASSERT_BOOT_CORE_MRO
-PERL_CALLCONV int      Perl_bytes_cmp_utf8(pTHX_ const U8 *b, STRLEN blen, const U8 *u, STRLEN ulen);
-#define PERL_ARGS_ASSERT_BYTES_CMP_UTF8        \
-       assert(b); assert(u)
-PERL_CALLCONV U8*      Perl_bytes_from_utf8(pTHX_ const U8 *s, STRLEN *lenp, bool *is_utf8p);
-#define PERL_ARGS_ASSERT_BYTES_FROM_UTF8       \
-       assert(s); assert(lenp); assert(is_utf8p)
-PERL_CALLCONV U8*      Perl_bytes_from_utf8_loc(const U8 *s, STRLEN *lenp, bool *is_utf8p, const U8 ** first_unconverted);
-#define PERL_ARGS_ASSERT_BYTES_FROM_UTF8_LOC   \
-       assert(s); assert(lenp); assert(is_utf8p)
-PERL_CALLCONV U8*      Perl_bytes_to_utf8(pTHX_ const U8 *s, STRLEN *lenp);
-#define PERL_ARGS_ASSERT_BYTES_TO_UTF8 \
-       assert(s); assert(lenp)
-PERL_CALLCONV I32      Perl_call_argv(pTHX_ const char* sub_name, I32 flags, char** argv);
-#define PERL_ARGS_ASSERT_CALL_ARGV     \
-       assert(sub_name); assert(argv)
-PERL_CALLCONV void     Perl_call_atexit(pTHX_ ATEXIT_t fn, void *ptr);
+
+PERL_CALLCONV OP *
+Perl_build_infix_plugin(pTHX_ OP *lhs, OP *rhs, void *tokendata)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_BUILD_INFIX_PLUGIN     \
+        assert(lhs); assert(rhs); assert(tokendata)
+
+PERL_CALLCONV int
+Perl_bytes_cmp_utf8(pTHX_ const U8 *b, STRLEN blen, const U8 *u, STRLEN ulen);
+#define PERL_ARGS_ASSERT_BYTES_CMP_UTF8         \
+        assert(b); assert(u)
+
+PERL_CALLCONV U8 *
+Perl_bytes_from_utf8(pTHX_ const U8 *s, STRLEN *lenp, bool *is_utf8p);
+#define PERL_ARGS_ASSERT_BYTES_FROM_UTF8        \
+        assert(s); assert(lenp); assert(is_utf8p)
+
+PERL_CALLCONV U8 *
+Perl_bytes_from_utf8_loc(const U8 *s, STRLEN *lenp, bool *is_utf8p, const U8 **first_unconverted);
+#define PERL_ARGS_ASSERT_BYTES_FROM_UTF8_LOC    \
+        assert(s); assert(lenp); assert(is_utf8p)
+
+PERL_CALLCONV U8 *
+Perl_bytes_to_utf8(pTHX_ const U8 *s, STRLEN *lenp);
+#define PERL_ARGS_ASSERT_BYTES_TO_UTF8          \
+        assert(s); assert(lenp)
+
+PERL_CALLCONV I32
+Perl_call_argv(pTHX_ const char *sub_name, I32 flags, char **argv);
+#define PERL_ARGS_ASSERT_CALL_ARGV              \
+        assert(sub_name); assert(argv)
+
+PERL_CALLCONV void
+Perl_call_atexit(pTHX_ ATEXIT_t fn, void *ptr);
 #define PERL_ARGS_ASSERT_CALL_ATEXIT
-PERL_CALLCONV void     Perl_call_list(pTHX_ I32 oldscope, AV *paramList);
-#define PERL_ARGS_ASSERT_CALL_LIST     \
-       assert(paramList)
-PERL_CALLCONV I32      Perl_call_method(pTHX_ const char* methname, I32 flags);
-#define PERL_ARGS_ASSERT_CALL_METHOD   \
-       assert(methname)
-PERL_CALLCONV I32      Perl_call_pv(pTHX_ const char* sub_name, I32 flags);
-#define PERL_ARGS_ASSERT_CALL_PV       \
-       assert(sub_name)
-PERL_CALLCONV I32      Perl_call_sv(pTHX_ SV* sv, volatile I32 flags);
-#define PERL_ARGS_ASSERT_CALL_SV       \
-       assert(sv)
-PERL_CALLCONV const PERL_CONTEXT *     Perl_caller_cx(pTHX_ I32 level, const PERL_CONTEXT **dbcxp);
+
+PERL_CALLCONV void
+Perl_call_list(pTHX_ I32 oldscope, AV *paramList);
+#define PERL_ARGS_ASSERT_CALL_LIST              \
+        assert(paramList)
+
+PERL_CALLCONV I32
+Perl_call_method(pTHX_ const char *methname, I32 flags);
+#define PERL_ARGS_ASSERT_CALL_METHOD            \
+        assert(methname)
+
+PERL_CALLCONV I32
+Perl_call_pv(pTHX_ const char *sub_name, I32 flags);
+#define PERL_ARGS_ASSERT_CALL_PV                \
+        assert(sub_name)
+
+PERL_CALLCONV I32
+Perl_call_sv(pTHX_ SV *sv, volatile I32 flags);
+#define PERL_ARGS_ASSERT_CALL_SV                \
+        assert(sv)
+
+PERL_CALLCONV const PERL_CONTEXT *
+Perl_caller_cx(pTHX_ I32 level, const PERL_CONTEXT **dbcxp);
 #define PERL_ARGS_ASSERT_CALLER_CX
-PERL_CALLCONV Malloc_t Perl_calloc(MEM_SIZE elements, MEM_SIZE size)
-                       __attribute__malloc__
-                       __attribute__warn_unused_result__;
+
+PERL_CALLCONV Malloc_t
+Perl_calloc(MEM_SIZE elements, MEM_SIZE size)
+        __attribute__malloc__
+        __attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_CALLOC
 
-PERL_CALLCONV bool     Perl_cando(pTHX_ Mode_t mode, bool effective, const Stat_t* statbufp)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_CANDO \
-       assert(statbufp)
+PERL_CALLCONV bool
+Perl_cando(pTHX_ Mode_t mode, bool effective, const Stat_t *statbufp)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_CANDO                  \
+        assert(statbufp)
 
-PERL_CALLCONV I32      Perl_cast_i32(NV f)
-                       __attribute__warn_unused_result__;
+PERL_CALLCONV I32
+Perl_cast_i32(NV f)
+        __attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_CAST_I32
 
-PERL_CALLCONV IV       Perl_cast_iv(NV f)
-                       __attribute__warn_unused_result__;
+PERL_CALLCONV IV
+Perl_cast_iv(NV f)
+        __attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_CAST_IV
 
-PERL_CALLCONV U32      Perl_cast_ulong(NV f)
-                       __attribute__warn_unused_result__;
+PERL_CALLCONV U32
+Perl_cast_ulong(NV f)
+        __attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_CAST_ULONG
 
-PERL_CALLCONV UV       Perl_cast_uv(NV f)
-                       __attribute__warn_unused_result__;
+PERL_CALLCONV UV
+Perl_cast_uv(NV f)
+        __attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_CAST_UV
 
-PERL_CALLCONV bool     Perl_check_utf8_print(pTHX_ const U8 *s, const STRLEN len);
-#define PERL_ARGS_ASSERT_CHECK_UTF8_PRINT      \
-       assert(s)
-PERL_CALLCONV OP *     Perl_ck_anoncode(pTHX_ OP *o)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_CK_ANONCODE   \
-       assert(o)
-
-PERL_CALLCONV OP *     Perl_ck_backtick(pTHX_ OP *o)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_CK_BACKTICK   \
-       assert(o)
-
-PERL_CALLCONV OP *     Perl_ck_bitop(pTHX_ OP *o)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_CK_BITOP      \
-       assert(o)
-
-PERL_CALLCONV OP *     Perl_ck_cmp(pTHX_ OP *o)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_CK_CMP        \
-       assert(o)
-
-PERL_CALLCONV OP *     Perl_ck_concat(pTHX_ OP *o)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_CK_CONCAT     \
-       assert(o)
-
-PERL_CALLCONV OP *     Perl_ck_defined(pTHX_ OP *o)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_CK_DEFINED    \
-       assert(o)
-
-PERL_CALLCONV OP *     Perl_ck_delete(pTHX_ OP *o)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_CK_DELETE     \
-       assert(o)
-
-PERL_CALLCONV OP *     Perl_ck_each(pTHX_ OP *o)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_CK_EACH       \
-       assert(o)
-
-PERL_CALLCONV OP*      Perl_ck_entersub_args_core(pTHX_ OP *entersubop, GV *namegv, SV *protosv);
-#define PERL_ARGS_ASSERT_CK_ENTERSUB_ARGS_CORE \
-       assert(entersubop); assert(namegv); assert(protosv)
-PERL_CALLCONV OP*      Perl_ck_entersub_args_list(pTHX_ OP *entersubop);
-#define PERL_ARGS_ASSERT_CK_ENTERSUB_ARGS_LIST \
-       assert(entersubop)
-PERL_CALLCONV OP*      Perl_ck_entersub_args_proto(pTHX_ OP *entersubop, GV *namegv, SV *protosv);
-#define PERL_ARGS_ASSERT_CK_ENTERSUB_ARGS_PROTO        \
-       assert(entersubop); assert(namegv); assert(protosv)
-PERL_CALLCONV OP*      Perl_ck_entersub_args_proto_or_list(pTHX_ OP *entersubop, GV *namegv, SV *protosv);
-#define PERL_ARGS_ASSERT_CK_ENTERSUB_ARGS_PROTO_OR_LIST        \
-       assert(entersubop); assert(namegv); assert(protosv)
-PERL_CALLCONV OP *     Perl_ck_eof(pTHX_ OP *o)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_CK_EOF        \
-       assert(o)
-
-PERL_CALLCONV OP *     Perl_ck_eval(pTHX_ OP *o)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_CK_EVAL       \
-       assert(o)
-
-PERL_CALLCONV OP *     Perl_ck_exec(pTHX_ OP *o)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_CK_EXEC       \
-       assert(o)
-
-PERL_CALLCONV OP *     Perl_ck_exists(pTHX_ OP *o)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_CK_EXISTS     \
-       assert(o)
-
-PERL_CALLCONV OP *     Perl_ck_ftst(pTHX_ OP *o)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_CK_FTST       \
-       assert(o)
-
-PERL_CALLCONV OP *     Perl_ck_fun(pTHX_ OP *o)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_CK_FUN        \
-       assert(o)
-
-PERL_CALLCONV OP *     Perl_ck_glob(pTHX_ OP *o)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_CK_GLOB       \
-       assert(o)
-
-PERL_CALLCONV OP *     Perl_ck_grep(pTHX_ OP *o)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_CK_GREP       \
-       assert(o)
-
-PERL_CALLCONV OP *     Perl_ck_index(pTHX_ OP *o)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_CK_INDEX      \
-       assert(o)
-
-PERL_CALLCONV OP *     Perl_ck_isa(pTHX_ OP *o)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_CK_ISA        \
-       assert(o)
-
-PERL_CALLCONV OP *     Perl_ck_join(pTHX_ OP *o)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_CK_JOIN       \
-       assert(o)
-
-PERL_CALLCONV OP *     Perl_ck_length(pTHX_ OP *o)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_CK_LENGTH     \
-       assert(o)
-
-PERL_CALLCONV OP *     Perl_ck_lfun(pTHX_ OP *o)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_CK_LFUN       \
-       assert(o)
-
-PERL_CALLCONV OP *     Perl_ck_listiob(pTHX_ OP *o)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_CK_LISTIOB    \
-       assert(o)
-
-PERL_CALLCONV OP *     Perl_ck_match(pTHX_ OP *o)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_CK_MATCH      \
-       assert(o)
-
-PERL_CALLCONV OP *     Perl_ck_method(pTHX_ OP *o)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_CK_METHOD     \
-       assert(o)
-
-PERL_CALLCONV OP *     Perl_ck_null(pTHX_ OP *o)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_CK_NULL       \
-       assert(o)
-
-PERL_CALLCONV OP *     Perl_ck_open(pTHX_ OP *o)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_CK_OPEN       \
-       assert(o)
-
-PERL_CALLCONV OP *     Perl_ck_prototype(pTHX_ OP *o)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_CK_PROTOTYPE  \
-       assert(o)
-
-PERL_CALLCONV OP *     Perl_ck_readline(pTHX_ OP *o)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_CK_READLINE   \
-       assert(o)
-
-PERL_CALLCONV OP *     Perl_ck_refassign(pTHX_ OP *o)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_CK_REFASSIGN  \
-       assert(o)
-
-PERL_CALLCONV OP *     Perl_ck_repeat(pTHX_ OP *o)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_CK_REPEAT     \
-       assert(o)
-
-PERL_CALLCONV OP *     Perl_ck_require(pTHX_ OP *o)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_CK_REQUIRE    \
-       assert(o)
-
-PERL_CALLCONV OP *     Perl_ck_return(pTHX_ OP *o)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_CK_RETURN     \
-       assert(o)
-
-PERL_CALLCONV OP *     Perl_ck_rfun(pTHX_ OP *o)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_CK_RFUN       \
-       assert(o)
-
-PERL_CALLCONV OP *     Perl_ck_rvconst(pTHX_ OP *o)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_CK_RVCONST    \
-       assert(o)
-
-PERL_CALLCONV OP *     Perl_ck_sassign(pTHX_ OP *o)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_CK_SASSIGN    \
-       assert(o)
-
-PERL_CALLCONV OP *     Perl_ck_select(pTHX_ OP *o)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_CK_SELECT     \
-       assert(o)
-
-PERL_CALLCONV OP *     Perl_ck_shift(pTHX_ OP *o)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_CK_SHIFT      \
-       assert(o)
-
-PERL_CALLCONV OP *     Perl_ck_smartmatch(pTHX_ OP *o)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_CK_SMARTMATCH \
-       assert(o)
-
-PERL_CALLCONV OP *     Perl_ck_sort(pTHX_ OP *o)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_CK_SORT       \
-       assert(o)
-
-PERL_CALLCONV OP *     Perl_ck_spair(pTHX_ OP *o)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_CK_SPAIR      \
-       assert(o)
-
-PERL_CALLCONV OP *     Perl_ck_split(pTHX_ OP *o)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_CK_SPLIT      \
-       assert(o)
-
-PERL_CALLCONV OP *     Perl_ck_stringify(pTHX_ OP *o)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_CK_STRINGIFY  \
-       assert(o)
-
-PERL_CALLCONV OP *     Perl_ck_subr(pTHX_ OP *o)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_CK_SUBR       \
-       assert(o)
-
-PERL_CALLCONV OP *     Perl_ck_substr(pTHX_ OP *o)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_CK_SUBSTR     \
-       assert(o)
-
-PERL_CALLCONV OP *     Perl_ck_svconst(pTHX_ OP *o)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_CK_SVCONST    \
-       assert(o)
-
-PERL_CALLCONV OP *     Perl_ck_tell(pTHX_ OP *o)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_CK_TELL       \
-       assert(o)
-
-PERL_CALLCONV OP *     Perl_ck_trunc(pTHX_ OP *o)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_CK_TRUNC      \
-       assert(o)
-
-PERL_CALLCONV OP *     Perl_ck_trycatch(pTHX_ OP *o)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_CK_TRYCATCH   \
-       assert(o)
-
-PERL_CALLCONV void     Perl_ck_warner(pTHX_ U32 err, const char* pat, ...)
-                       __attribute__format__(__printf__,pTHX_2,pTHX_3);
-#define PERL_ARGS_ASSERT_CK_WARNER     \
-       assert(pat)
-
-PERL_CALLCONV void     Perl_ck_warner_d(pTHX_ U32 err, const char* pat, ...)
-                       __attribute__format__(__printf__,pTHX_2,pTHX_3);
-#define PERL_ARGS_ASSERT_CK_WARNER_D   \
-       assert(pat)
-
-PERL_CALLCONV bool     Perl_ckwarn(pTHX_ U32 w)
-                       __attribute__warn_unused_result__
-                       __attribute__pure__;
+PERL_CALLCONV bool
+Perl_check_utf8_print(pTHX_ const U8 *s, const STRLEN len)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_CHECK_UTF8_PRINT       \
+        assert(s)
+
+PERL_CALLCONV OP *
+Perl_ck_entersub_args_core(pTHX_ OP *entersubop, GV *namegv, SV *protosv)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_CK_ENTERSUB_ARGS_CORE  \
+        assert(entersubop); assert(namegv); assert(protosv)
+
+PERL_CALLCONV OP *
+Perl_ck_entersub_args_list(pTHX_ OP *entersubop);
+#define PERL_ARGS_ASSERT_CK_ENTERSUB_ARGS_LIST  \
+        assert(entersubop)
+
+PERL_CALLCONV OP *
+Perl_ck_entersub_args_proto(pTHX_ OP *entersubop, GV *namegv, SV *protosv);
+#define PERL_ARGS_ASSERT_CK_ENTERSUB_ARGS_PROTO \
+        assert(entersubop); assert(namegv); assert(protosv)
+
+PERL_CALLCONV OP *
+Perl_ck_entersub_args_proto_or_list(pTHX_ OP *entersubop, GV *namegv, SV *protosv);
+#define PERL_ARGS_ASSERT_CK_ENTERSUB_ARGS_PROTO_OR_LIST \
+        assert(entersubop); assert(namegv); assert(protosv)
+
+PERL_CALLCONV void
+Perl_ck_warner(pTHX_ U32 err, const char *pat, ...)
+        __attribute__format__(__printf__,pTHX_2,pTHX_3);
+#define PERL_ARGS_ASSERT_CK_WARNER              \
+        assert(pat)
+
+PERL_CALLCONV void
+Perl_ck_warner_d(pTHX_ U32 err, const char *pat, ...)
+        __attribute__format__(__printf__,pTHX_2,pTHX_3);
+#define PERL_ARGS_ASSERT_CK_WARNER_D            \
+        assert(pat)
+
+PERL_CALLCONV bool
+Perl_ckwarn(pTHX_ U32 w)
+        __attribute__warn_unused_result__
+        __attribute__pure__;
 #define PERL_ARGS_ASSERT_CKWARN
 
-PERL_CALLCONV bool     Perl_ckwarn_d(pTHX_ U32 w)
-                       __attribute__warn_unused_result__
-                       __attribute__pure__;
+PERL_CALLCONV bool
+Perl_ckwarn_d(pTHX_ U32 w)
+        __attribute__warn_unused_result__
+        __attribute__pure__;
 #define PERL_ARGS_ASSERT_CKWARN_D
 
-PERL_CALLCONV void     Perl_clear_defarray(pTHX_ AV* av, bool abandon);
-#define PERL_ARGS_ASSERT_CLEAR_DEFARRAY        \
-       assert(av)
-PERL_CALLCONV const COP*       Perl_closest_cop(pTHX_ const COP *cop, const OP *o, const OP *curop, bool opnext);
-#define PERL_ARGS_ASSERT_CLOSEST_COP   \
-       assert(cop)
-PERL_CALLCONV OP*      Perl_cmpchain_extend(pTHX_ I32 type, OP* ch, OP* right)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_CMPCHAIN_EXTEND       \
-       assert(ch)
-
-PERL_CALLCONV OP*      Perl_cmpchain_finish(pTHX_ OP* ch)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_CMPCHAIN_FINISH       \
-       assert(ch)
-
-PERL_CALLCONV OP*      Perl_cmpchain_start(pTHX_ I32 type, OP* left, OP* right)
-                       __attribute__warn_unused_result__;
+PERL_CALLCONV void
+Perl_clear_defarray(pTHX_ AV *av, bool abandon);
+#define PERL_ARGS_ASSERT_CLEAR_DEFARRAY         \
+        assert(av)
+
+PERL_CALLCONV const COP *
+Perl_closest_cop(pTHX_ const COP *cop, const OP *o, const OP *curop, bool opnext)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_CLOSEST_COP            \
+        assert(cop)
+
+PERL_CALLCONV OP *
+Perl_cmpchain_extend(pTHX_ I32 type, OP *ch, OP *right)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_CMPCHAIN_EXTEND        \
+        assert(ch)
+
+PERL_CALLCONV OP *
+Perl_cmpchain_finish(pTHX_ OP *ch)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_CMPCHAIN_FINISH        \
+        assert(ch)
+
+PERL_CALLCONV OP *
+Perl_cmpchain_start(pTHX_ I32 type, OP *left, OP *right)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
 #define PERL_ARGS_ASSERT_CMPCHAIN_START
 
-PERL_CALLCONV const char *     Perl_cntrl_to_mnemonic(const U8 c)
-                       __attribute__warn_unused_result__;
+PERL_CALLCONV const char *
+Perl_cntrl_to_mnemonic(const U8 c)
+        __attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_CNTRL_TO_MNEMONIC
 
-PERL_CALLCONV const char *     Perl_cop_fetch_label(pTHX_ COP *const cop, STRLEN *len, U32 *flags);
-#define PERL_ARGS_ASSERT_COP_FETCH_LABEL       \
-       assert(cop)
-PERL_CALLCONV void     Perl_cop_store_label(pTHX_ COP *const cop, const char *label, STRLEN len, U32 flags);
-#define PERL_ARGS_ASSERT_COP_STORE_LABEL       \
-       assert(cop); assert(label)
-PERL_CALLCONV SV *     Perl_core_prototype(pTHX_ SV *sv, const char *name, const int code, int * const opnum);
-#define PERL_ARGS_ASSERT_CORE_PROTOTYPE        \
-       assert(name)
-PERL_CALLCONV OP *     Perl_coresub_op(pTHX_ SV *const coreargssv, const int code, const int opnum);
-#define PERL_ARGS_ASSERT_CORESUB_OP    \
-       assert(coreargssv)
-PERL_CALLCONV void     Perl_create_eval_scope(pTHX_ OP *retop, U32 flags);
+PERL_CALLCONV const char *
+Perl_cop_fetch_label(pTHX_ COP * const cop, STRLEN *len, U32 *flags);
+#define PERL_ARGS_ASSERT_COP_FETCH_LABEL        \
+        assert(cop)
+
+PERL_CALLCONV void
+Perl_cop_store_label(pTHX_ COP * const cop, const char *label, STRLEN len, U32 flags);
+#define PERL_ARGS_ASSERT_COP_STORE_LABEL        \
+        assert(cop); assert(label)
+
+PERL_CALLCONV SV *
+Perl_core_prototype(pTHX_ SV *sv, const char *name, const int code, int * const opnum)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_CORE_PROTOTYPE         \
+        assert(name)
+
+PERL_CALLCONV OP *
+Perl_coresub_op(pTHX_ SV * const coreargssv, const int code, const int opnum)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_CORESUB_OP             \
+        assert(coreargssv)
+
+PERL_CALLCONV void
+Perl_create_eval_scope(pTHX_ OP *retop, U32 flags)
+        __attribute__visibility__("hidden");
 #define PERL_ARGS_ASSERT_CREATE_EVAL_SCOPE
-PERL_CALLCONV_NO_RET void      Perl_croak(pTHX_ const char* pat, ...)
-                       __attribute__noreturn__
-                       __attribute__format__null_ok__(__printf__,pTHX_1,pTHX_2);
+
+PERL_CALLCONV_NO_RET void
+Perl_croak(pTHX_ const char *pat, ...)
+        __attribute__noreturn__
+        __attribute__format__null_ok__(__printf__,pTHX_1,pTHX_2);
 #define PERL_ARGS_ASSERT_CROAK
 
-PERL_CALLCONV_NO_RET void      Perl_croak_caller(const char* pat, ...)
-                       __attribute__noreturn__
-                       __attribute__format__null_ok__(__printf__,1,2);
+PERL_CALLCONV_NO_RET void
+Perl_croak_caller(const char *pat, ...)
+        __attribute__noreturn__
+        __attribute__visibility__("hidden")
+        __attribute__format__null_ok__(__printf__,1,2);
 #define PERL_ARGS_ASSERT_CROAK_CALLER
 
-PERL_CALLCONV_NO_RET void      Perl_croak_memory_wrap(void)
-                       __attribute__noreturn__;
+PERL_STATIC_NO_RET void
+Perl_croak_memory_wrap(void)
+        __attribute__noreturn__;
 #define PERL_ARGS_ASSERT_CROAK_MEMORY_WRAP
 
-PERL_CALLCONV_NO_RET void      Perl_croak_no_mem(void)
-                       __attribute__noreturn__;
+PERL_CALLCONV_NO_RET void
+Perl_croak_no_mem(void)
+        __attribute__noreturn__
+        __attribute__visibility__("hidden");
 #define PERL_ARGS_ASSERT_CROAK_NO_MEM
 
-PERL_CALLCONV_NO_RET void      Perl_croak_no_modify(void)
-                       __attribute__noreturn__;
+PERL_CALLCONV_NO_RET void
+Perl_croak_no_modify(void)
+        __attribute__noreturn__;
 #define PERL_ARGS_ASSERT_CROAK_NO_MODIFY
 
-PERL_CALLCONV_NO_RET void      Perl_croak_popstack(void)
-                       __attribute__noreturn__;
+PERL_CALLCONV_NO_RET void
+Perl_croak_popstack(void)
+        __attribute__noreturn__;
 #define PERL_ARGS_ASSERT_CROAK_POPSTACK
 
-PERL_CALLCONV_NO_RET void      Perl_croak_sv(pTHX_ SV *baseex)
-                       __attribute__noreturn__;
-#define PERL_ARGS_ASSERT_CROAK_SV      \
-       assert(baseex)
+PERL_CALLCONV_NO_RET void
+Perl_croak_sv(pTHX_ SV *baseex)
+        __attribute__noreturn__;
+#define PERL_ARGS_ASSERT_CROAK_SV               \
+        assert(baseex)
 
-PERL_CALLCONV_NO_RET void      Perl_croak_xs_usage(const CV *const cv, const char *const params)
-                       __attribute__noreturn__;
-#define PERL_ARGS_ASSERT_CROAK_XS_USAGE        \
-       assert(cv); assert(params)
+PERL_CALLCONV_NO_RET void
+Perl_croak_xs_usage(const CV * const cv, const char * const params)
+        __attribute__noreturn__;
+#define PERL_ARGS_ASSERT_CROAK_XS_USAGE         \
+        assert(cv); assert(params)
 
-PERL_CALLCONV Signal_t Perl_csighandler1(int sig);
+PERL_CALLCONV Signal_t
+Perl_csighandler1(int sig);
 #define PERL_ARGS_ASSERT_CSIGHANDLER1
-PERL_CALLCONV Signal_t Perl_csighandler3(int sig, Siginfo_t *info, void *uap);
+
+PERL_CALLCONV Signal_t
+Perl_csighandler3(int sig, Siginfo_t *info, void *uap);
 #define PERL_ARGS_ASSERT_CSIGHANDLER3
-PERL_CALLCONV regexp_engine const *    Perl_current_re_engine(pTHX);
-#define PERL_ARGS_ASSERT_CURRENT_RE_ENGINE
-#ifndef NO_MATHOMS
-PERL_CALLCONV const char *     Perl_custom_op_desc(pTHX_ const OP *o)
-                       __attribute__deprecated__
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_CUSTOM_OP_DESC        \
-       assert(o)
-#endif
 
-PERL_CALLCONV XOPRETANY        Perl_custom_op_get_field(pTHX_ const OP *o, const xop_flags_enum field)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_CUSTOM_OP_GET_FIELD   \
-       assert(o)
-
-#ifndef NO_MATHOMS
-PERL_CALLCONV const char *     Perl_custom_op_name(pTHX_ const OP *o)
-                       __attribute__deprecated__
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_CUSTOM_OP_NAME        \
-       assert(o)
-#endif
+PERL_CALLCONV regexp_engine const *
+Perl_current_re_engine(pTHX);
+#define PERL_ARGS_ASSERT_CURRENT_RE_ENGINE
 
-PERL_CALLCONV void     Perl_custom_op_register(pTHX_ Perl_ppaddr_t ppaddr, const XOP *xop);
-#define PERL_ARGS_ASSERT_CUSTOM_OP_REGISTER    \
-       assert(ppaddr); assert(xop)
-PERL_CALLCONV void     Perl_cv_ckproto_len_flags(pTHX_ const CV* cv, const GV* gv, const char* p, const STRLEN len, const U32 flags);
-#define PERL_ARGS_ASSERT_CV_CKPROTO_LEN_FLAGS  \
-       assert(cv)
-PERL_CALLCONV CV*      Perl_cv_clone(pTHX_ CV* proto);
-#define PERL_ARGS_ASSERT_CV_CLONE      \
-       assert(proto)
-PERL_CALLCONV CV*      Perl_cv_clone_into(pTHX_ CV* proto, CV *target);
-#define PERL_ARGS_ASSERT_CV_CLONE_INTO \
-       assert(proto); assert(target)
-PERL_CALLCONV SV*      Perl_cv_const_sv(const CV *const cv)
-                       __attribute__warn_unused_result__;
+PERL_CALLCONV XOPRETANY
+Perl_custom_op_get_field(pTHX_ const OP *o, const xop_flags_enum field)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_CUSTOM_OP_GET_FIELD    \
+        assert(o)
+
+PERL_CALLCONV void
+Perl_custom_op_register(pTHX_ Perl_ppaddr_t ppaddr, const XOP *xop);
+#define PERL_ARGS_ASSERT_CUSTOM_OP_REGISTER     \
+        assert(ppaddr); assert(xop)
+
+PERL_CALLCONV void
+Perl_cv_ckproto_len_flags(pTHX_ const CV *cv, const GV *gv, const char *p, const STRLEN len, const U32 flags);
+#define PERL_ARGS_ASSERT_CV_CKPROTO_LEN_FLAGS   \
+        assert(cv)
+
+PERL_CALLCONV CV *
+Perl_cv_clone(pTHX_ CV *proto);
+#define PERL_ARGS_ASSERT_CV_CLONE               \
+        assert(proto)
+
+PERL_CALLCONV CV *
+Perl_cv_clone_into(pTHX_ CV *proto, CV *target)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_CV_CLONE_INTO          \
+        assert(proto); assert(target)
+
+PERL_CALLCONV SV *
+Perl_cv_const_sv(const CV * const cv)
+        __attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_CV_CONST_SV
 
-PERL_CALLCONV SV*      Perl_cv_const_sv_or_av(const CV *const cv)
-                       __attribute__warn_unused_result__;
+PERL_CALLCONV SV *
+Perl_cv_const_sv_or_av(const CV * const cv)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
 #define PERL_ARGS_ASSERT_CV_CONST_SV_OR_AV
 
-PERL_CALLCONV void     Perl_cv_forget_slab(pTHX_ CV *cv);
+PERL_CALLCONV void
+Perl_cv_forget_slab(pTHX_ CV *cv)
+        __attribute__visibility__("hidden");
 #define PERL_ARGS_ASSERT_CV_FORGET_SLAB
-PERL_CALLCONV void     Perl_cv_get_call_checker(pTHX_ CV *cv, Perl_call_checker *ckfun_p, SV **ckobj_p);
-#define PERL_ARGS_ASSERT_CV_GET_CALL_CHECKER   \
-       assert(cv); assert(ckfun_p); assert(ckobj_p)
-PERL_CALLCONV void     Perl_cv_get_call_checker_flags(pTHX_ CV *cv, U32 gflags, Perl_call_checker *ckfun_p, SV **ckobj_p, U32 *ckflags_p);
-#define PERL_ARGS_ASSERT_CV_GET_CALL_CHECKER_FLAGS     \
-       assert(cv); assert(ckfun_p); assert(ckobj_p); assert(ckflags_p)
-PERL_CALLCONV SV *     Perl_cv_name(pTHX_ CV *cv, SV *sv, U32 flags);
-#define PERL_ARGS_ASSERT_CV_NAME       \
-       assert(cv)
-PERL_CALLCONV void     Perl_cv_set_call_checker(pTHX_ CV *cv, Perl_call_checker ckfun, SV *ckobj);
-#define PERL_ARGS_ASSERT_CV_SET_CALL_CHECKER   \
-       assert(cv); assert(ckfun); assert(ckobj)
-PERL_CALLCONV void     Perl_cv_set_call_checker_flags(pTHX_ CV *cv, Perl_call_checker ckfun, SV *ckobj, U32 ckflags);
-#define PERL_ARGS_ASSERT_CV_SET_CALL_CHECKER_FLAGS     \
-       assert(cv); assert(ckfun); assert(ckobj)
-PERL_CALLCONV void     Perl_cv_undef(pTHX_ CV* cv);
-#define PERL_ARGS_ASSERT_CV_UNDEF      \
-       assert(cv)
-PERL_CALLCONV void     Perl_cv_undef_flags(pTHX_ CV* cv, U32 flags);
-#define PERL_ARGS_ASSERT_CV_UNDEF_FLAGS        \
-       assert(cv)
-PERL_CALLCONV GV *     Perl_cvgv_from_hek(pTHX_ CV* cv);
-#define PERL_ARGS_ASSERT_CVGV_FROM_HEK \
-       assert(cv)
-PERL_CALLCONV void     Perl_cvgv_set(pTHX_ CV* cv, GV* gv);
-#define PERL_ARGS_ASSERT_CVGV_SET      \
-       assert(cv)
-PERL_CALLCONV void     Perl_cvstash_set(pTHX_ CV* cv, HV* stash);
-#define PERL_ARGS_ASSERT_CVSTASH_SET   \
-       assert(cv)
-PERL_CALLCONV void     Perl_cx_dump(pTHX_ PERL_CONTEXT* cx);
-#define PERL_ARGS_ASSERT_CX_DUMP       \
-       assert(cx)
-PERL_CALLCONV I32      Perl_cxinc(pTHX)
-                       __attribute__warn_unused_result__;
+
+PERL_CALLCONV void
+Perl_cv_get_call_checker(pTHX_ CV *cv, Perl_call_checker *ckfun_p, SV **ckobj_p);
+#define PERL_ARGS_ASSERT_CV_GET_CALL_CHECKER    \
+        assert(cv); assert(ckfun_p); assert(ckobj_p)
+
+PERL_CALLCONV void
+Perl_cv_get_call_checker_flags(pTHX_ CV *cv, U32 gflags, Perl_call_checker *ckfun_p, SV **ckobj_p, U32 *ckflags_p);
+#define PERL_ARGS_ASSERT_CV_GET_CALL_CHECKER_FLAGS \
+        assert(cv); assert(ckfun_p); assert(ckobj_p); assert(ckflags_p)
+
+PERL_CALLCONV SV *
+Perl_cv_name(pTHX_ CV *cv, SV *sv, U32 flags);
+#define PERL_ARGS_ASSERT_CV_NAME                \
+        assert(cv)
+
+PERL_CALLCONV void
+Perl_cv_set_call_checker(pTHX_ CV *cv, Perl_call_checker ckfun, SV *ckobj);
+#define PERL_ARGS_ASSERT_CV_SET_CALL_CHECKER    \
+        assert(cv); assert(ckfun); assert(ckobj)
+
+PERL_CALLCONV void
+Perl_cv_set_call_checker_flags(pTHX_ CV *cv, Perl_call_checker ckfun, SV *ckobj, U32 ckflags);
+#define PERL_ARGS_ASSERT_CV_SET_CALL_CHECKER_FLAGS \
+        assert(cv); assert(ckfun); assert(ckobj)
+
+PERL_CALLCONV void
+Perl_cv_undef(pTHX_ CV *cv);
+#define PERL_ARGS_ASSERT_CV_UNDEF               \
+        assert(cv)
+
+PERL_CALLCONV void
+Perl_cv_undef_flags(pTHX_ CV *cv, U32 flags)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_CV_UNDEF_FLAGS         \
+        assert(cv)
+
+PERL_CALLCONV GV *
+Perl_cvgv_from_hek(pTHX_ CV *cv);
+#define PERL_ARGS_ASSERT_CVGV_FROM_HEK          \
+        assert(cv)
+
+PERL_CALLCONV void
+Perl_cvgv_set(pTHX_ CV *cv, GV *gv);
+#define PERL_ARGS_ASSERT_CVGV_SET               \
+        assert(cv)
+
+PERL_CALLCONV void
+Perl_cvstash_set(pTHX_ CV *cv, HV *stash);
+#define PERL_ARGS_ASSERT_CVSTASH_SET            \
+        assert(cv)
+
+PERL_CALLCONV void
+Perl_cx_dump(pTHX_ PERL_CONTEXT *cx);
+#define PERL_ARGS_ASSERT_CX_DUMP                \
+        assert(cx)
+
+PERL_CALLCONV I32
+Perl_cxinc(pTHX)
+        __attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_CXINC
 
-PERL_CALLCONV void     Perl_deb(pTHX_ const char* pat, ...)
-                       __attribute__format__(__printf__,pTHX_1,pTHX_2);
-#define PERL_ARGS_ASSERT_DEB   \
-       assert(pat)
+PERL_CALLCONV void
+Perl_deb(pTHX_ const char *pat, ...)
+        __attribute__format__(__printf__,pTHX_1,pTHX_2);
+#define PERL_ARGS_ASSERT_DEB                    \
+        assert(pat)
 
-PERL_CALLCONV void     Perl_deb_stack_all(pTHX);
+PERL_CALLCONV void
+Perl_deb_stack_all(pTHX)
+        __attribute__visibility__("hidden");
 #define PERL_ARGS_ASSERT_DEB_STACK_ALL
-PERL_CALLCONV I32      Perl_debop(pTHX_ const OP* o);
-#define PERL_ARGS_ASSERT_DEBOP \
-       assert(o)
-PERL_CALLCONV void     Perl_debprofdump(pTHX);
+
+PERL_CALLCONV I32
+Perl_debop(pTHX_ const OP *o);
+#define PERL_ARGS_ASSERT_DEBOP                  \
+        assert(o)
+
+PERL_CALLCONV void
+Perl_debprofdump(pTHX);
 #define PERL_ARGS_ASSERT_DEBPROFDUMP
-PERL_CALLCONV I32      Perl_debstack(pTHX);
+
+PERL_CALLCONV I32
+Perl_debstack(pTHX);
 #define PERL_ARGS_ASSERT_DEBSTACK
-PERL_CALLCONV I32      Perl_debstackptrs(pTHX);
+
+PERL_CALLCONV I32
+Perl_debstackptrs(pTHX);
 #define PERL_ARGS_ASSERT_DEBSTACKPTRS
-PERL_CALLCONV void     Perl_debug_hash_seed(pTHX_ bool via_debug_h);
+
+PERL_CALLCONV void
+Perl_debug_hash_seed(pTHX_ bool via_debug_h)
+        __attribute__visibility__("hidden");
 #define PERL_ARGS_ASSERT_DEBUG_HASH_SEED
-PERL_CALLCONV SV *     Perl_defelem_target(pTHX_ SV *sv, MAGIC *mg)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_DEFELEM_TARGET        \
-       assert(sv)
 
-PERL_CALLCONV void     Perl_delete_eval_scope(pTHX);
+PERL_CALLCONV SV *
+Perl_defelem_target(pTHX_ SV *sv, MAGIC *mg)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_DEFELEM_TARGET         \
+        assert(sv)
+
+PERL_CALLCONV void
+Perl_delete_eval_scope(pTHX)
+        __attribute__visibility__("hidden");
 #define PERL_ARGS_ASSERT_DELETE_EVAL_SCOPE
-PERL_CALLCONV char*    Perl_delimcpy(char* to, const char* to_end, const char* from, const char* from_end, const int delim, I32* retlen);
-#define PERL_ARGS_ASSERT_DELIMCPY      \
-       assert(to); assert(to_end); assert(from); assert(from_end); assert(retlen)
-PERL_CALLCONV char*    Perl_delimcpy_no_escape(char* to, const char* to_end, const char* from, const char* from_end, const int delim, I32* retlen);
-#define PERL_ARGS_ASSERT_DELIMCPY_NO_ESCAPE    \
-       assert(to); assert(to_end); assert(from); assert(from_end); assert(retlen)
-PERL_CALLCONV void     Perl_despatch_signals(pTHX);
-#define PERL_ARGS_ASSERT_DESPATCH_SIGNALS
-PERL_CALLCONV_NO_RET OP*       Perl_die(pTHX_ const char* pat, ...)
-                       __attribute__noreturn__
-                       __attribute__format__null_ok__(__printf__,pTHX_1,pTHX_2);
-#define PERL_ARGS_ASSERT_DIE
 
-PERL_CALLCONV_NO_RET OP*       Perl_die_sv(pTHX_ SV *baseex)
-                       __attribute__noreturn__;
-#define PERL_ARGS_ASSERT_DIE_SV        \
-       assert(baseex)
+PERL_CALLCONV char *
+Perl_delimcpy(char *to, const char *to_end, const char *from, const char *from_end, const int delim, I32 *retlen);
+#define PERL_ARGS_ASSERT_DELIMCPY               \
+        assert(to); assert(to_end); assert(from); assert(from_end); assert(retlen)
 
-PERL_CALLCONV_NO_RET void      Perl_die_unwind(pTHX_ SV* msv)
-                       __attribute__noreturn__;
-#define PERL_ARGS_ASSERT_DIE_UNWIND    \
-       assert(msv)
+PERL_CALLCONV char *
+Perl_delimcpy_no_escape(char *to, const char *to_end, const char *from, const char *from_end, const int delim, I32 *retlen);
+#define PERL_ARGS_ASSERT_DELIMCPY_NO_ESCAPE     \
+        assert(to); assert(to_end); assert(from); assert(from_end); assert(retlen)
 
-#ifndef NO_MATHOMS
-PERL_CALLCONV bool     Perl_do_aexec(pTHX_ SV* really, SV** mark, SV** sp);
-#define PERL_ARGS_ASSERT_DO_AEXEC      \
-       assert(mark); assert(sp)
-#endif
-PERL_CALLCONV bool     Perl_do_aexec5(pTHX_ SV* really, SV** mark, SV** sp, int fd, int do_report);
-#define PERL_ARGS_ASSERT_DO_AEXEC5     \
-       assert(mark); assert(sp)
-#ifndef NO_MATHOMS
-PERL_CALLCONV int      Perl_do_binmode(pTHX_ PerlIO *fp, int iotype, int mode)
-                       __attribute__deprecated__;
-#define PERL_ARGS_ASSERT_DO_BINMODE    \
-       assert(fp)
-#endif
+PERL_CALLCONV void
+Perl_despatch_signals(pTHX);
+#define PERL_ARGS_ASSERT_DESPATCH_SIGNALS
+
+PERL_CALLCONV_NO_RET OP *
+Perl_die(pTHX_ const char *pat, ...)
+        __attribute__noreturn__
+        __attribute__format__null_ok__(__printf__,pTHX_1,pTHX_2);
+#define PERL_ARGS_ASSERT_DIE
 
-PERL_CALLCONV bool     Perl_do_close(pTHX_ GV* gv, bool not_implicit);
+PERL_CALLCONV_NO_RET OP *
+Perl_die_sv(pTHX_ SV *baseex)
+        __attribute__noreturn__;
+#define PERL_ARGS_ASSERT_DIE_SV                 \
+        assert(baseex)
+
+PERL_CALLCONV_NO_RET void
+Perl_die_unwind(pTHX_ SV *msv)
+        __attribute__noreturn__
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_DIE_UNWIND             \
+        assert(msv)
+
+PERL_CALLCONV bool
+Perl_do_aexec5(pTHX_ SV *really, SV **mark, SV **sp, int fd, int do_report)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_DO_AEXEC5              \
+        assert(mark); assert(sp)
+
+PERL_CALLCONV bool
+Perl_do_close(pTHX_ GV *gv, bool is_explicit);
 #define PERL_ARGS_ASSERT_DO_CLOSE
-PERL_CALLCONV void     Perl_do_dump_pad(pTHX_ I32 level, PerlIO *file, PADLIST *padlist, int full);
-#define PERL_ARGS_ASSERT_DO_DUMP_PAD   \
-       assert(file)
-PERL_CALLCONV bool     Perl_do_eof(pTHX_ GV* gv);
-#define PERL_ARGS_ASSERT_DO_EOF        \
-       assert(gv)
-PERL_CALLCONV void     Perl_do_gv_dump(pTHX_ I32 level, PerlIO *file, const char *name, GV *sv);
-#define PERL_ARGS_ASSERT_DO_GV_DUMP    \
-       assert(file); assert(name)
-PERL_CALLCONV void     Perl_do_gvgv_dump(pTHX_ I32 level, PerlIO *file, const char *name, GV *sv);
-#define PERL_ARGS_ASSERT_DO_GVGV_DUMP  \
-       assert(file); assert(name)
-PERL_CALLCONV void     Perl_do_hv_dump(pTHX_ I32 level, PerlIO *file, const char *name, HV *sv);
-#define PERL_ARGS_ASSERT_DO_HV_DUMP    \
-       assert(file); assert(name)
-PERL_CALLCONV void     Perl_do_join(pTHX_ SV *sv, SV *delim, SV **mark, SV **sp);
-#define PERL_ARGS_ASSERT_DO_JOIN       \
-       assert(sv); assert(delim); assert(mark); assert(sp)
-PERL_CALLCONV void     Perl_do_magic_dump(pTHX_ I32 level, PerlIO *file, const MAGIC *mg, I32 nest, I32 maxnest, bool dumpops, STRLEN pvlim);
-#define PERL_ARGS_ASSERT_DO_MAGIC_DUMP \
-       assert(file)
-PERL_CALLCONV I32      Perl_do_ncmp(pTHX_ SV *const left, SV *const right)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_DO_NCMP       \
-       assert(left); assert(right)
-
-PERL_CALLCONV void     Perl_do_op_dump(pTHX_ I32 level, PerlIO *file, const OP *o);
-#define PERL_ARGS_ASSERT_DO_OP_DUMP    \
-       assert(file)
-#ifndef NO_MATHOMS
-PERL_CALLCONV bool     Perl_do_open(pTHX_ GV* gv, const char* name, I32 len, int as_raw, int rawmode, int rawperm, PerlIO* supplied_fp);
-#define PERL_ARGS_ASSERT_DO_OPEN       \
-       assert(gv); assert(name)
-#endif
-PERL_CALLCONV bool     Perl_do_open6(pTHX_ GV *gv, const char *oname, STRLEN len, PerlIO *supplied_fp, SV **svp, U32 num);
-#define PERL_ARGS_ASSERT_DO_OPEN6      \
-       assert(gv); assert(oname)
-#ifndef NO_MATHOMS
-PERL_CALLCONV bool     Perl_do_open9(pTHX_ GV *gv, const char *name, I32 len, int as_raw, int rawmode, int rawperm, PerlIO *supplied_fp, SV *svs, I32 num)
-                       __attribute__deprecated__;
-#define PERL_ARGS_ASSERT_DO_OPEN9      \
-       assert(gv); assert(name); assert(svs)
-#endif
 
-PERL_CALLCONV bool     Perl_do_open_raw(pTHX_ GV *gv, const char *oname, STRLEN len, int rawmode, int rawperm, Stat_t *statbufp);
-#define PERL_ARGS_ASSERT_DO_OPEN_RAW   \
-       assert(gv); assert(oname)
-PERL_CALLCONV bool     Perl_do_openn(pTHX_ GV *gv, const char *oname, I32 len, int as_raw, int rawmode, int rawperm, PerlIO *supplied_fp, SV **svp, I32 num);
-#define PERL_ARGS_ASSERT_DO_OPENN      \
-       assert(gv); assert(oname)
-PERL_CALLCONV void     Perl_do_pmop_dump(pTHX_ I32 level, PerlIO *file, const PMOP *pm);
-#define PERL_ARGS_ASSERT_DO_PMOP_DUMP  \
-       assert(file)
-PERL_CALLCONV bool     Perl_do_print(pTHX_ SV* sv, PerlIO* fp);
-#define PERL_ARGS_ASSERT_DO_PRINT      \
-       assert(fp)
-PERL_CALLCONV OP*      Perl_do_readline(pTHX)
-                       __attribute__warn_unused_result__;
+PERL_CALLCONV void
+Perl_do_dump_pad(pTHX_ I32 level, PerlIO *file, PADLIST *padlist, int full)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_DO_DUMP_PAD            \
+        assert(file)
+
+PERL_CALLCONV bool
+Perl_do_eof(pTHX_ GV *gv)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_DO_EOF                 \
+        assert(gv)
+
+PERL_CALLCONV void
+Perl_do_gv_dump(pTHX_ I32 level, PerlIO *file, const char *name, GV *sv);
+#define PERL_ARGS_ASSERT_DO_GV_DUMP             \
+        assert(file); assert(name)
+
+PERL_CALLCONV void
+Perl_do_gvgv_dump(pTHX_ I32 level, PerlIO *file, const char *name, GV *sv);
+#define PERL_ARGS_ASSERT_DO_GVGV_DUMP           \
+        assert(file); assert(name)
+
+PERL_CALLCONV void
+Perl_do_hv_dump(pTHX_ I32 level, PerlIO *file, const char *name, HV *sv);
+#define PERL_ARGS_ASSERT_DO_HV_DUMP             \
+        assert(file); assert(name)
+
+PERL_CALLCONV void
+Perl_do_join(pTHX_ SV *sv, SV *delim, SV **mark, SV **sp);
+#define PERL_ARGS_ASSERT_DO_JOIN                \
+        assert(sv); assert(delim); assert(mark); assert(sp)
+
+PERL_CALLCONV void
+Perl_do_magic_dump(pTHX_ I32 level, PerlIO *file, const MAGIC *mg, I32 nest, I32 maxnest, bool dumpops, STRLEN pvlim);
+#define PERL_ARGS_ASSERT_DO_MAGIC_DUMP          \
+        assert(file)
+
+PERL_CALLCONV I32
+Perl_do_ncmp(pTHX_ SV * const left, SV * const right)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_DO_NCMP                \
+        assert(left); assert(right)
+
+PERL_CALLCONV void
+Perl_do_op_dump(pTHX_ I32 level, PerlIO *file, const OP *o);
+#define PERL_ARGS_ASSERT_DO_OP_DUMP             \
+        assert(file)
+
+PERL_CALLCONV bool
+Perl_do_open6(pTHX_ GV *gv, const char *oname, STRLEN len, PerlIO *supplied_fp, SV **svp, U32 num)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_DO_OPEN6               \
+        assert(gv); assert(oname)
+
+PERL_CALLCONV bool
+Perl_do_open_raw(pTHX_ GV *gv, const char *oname, STRLEN len, int rawmode, int rawperm, Stat_t *statbufp)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_DO_OPEN_RAW            \
+        assert(gv); assert(oname)
+
+PERL_CALLCONV bool
+Perl_do_openn(pTHX_ GV *gv, const char *oname, I32 len, int as_raw, int rawmode, int rawperm, PerlIO *supplied_fp, SV **svp, I32 num);
+#define PERL_ARGS_ASSERT_DO_OPENN               \
+        assert(gv); assert(oname)
+
+PERL_CALLCONV void
+Perl_do_pmop_dump(pTHX_ I32 level, PerlIO *file, const PMOP *pm);
+#define PERL_ARGS_ASSERT_DO_PMOP_DUMP           \
+        assert(file)
+
+PERL_CALLCONV bool
+Perl_do_print(pTHX_ SV *sv, PerlIO *fp)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_DO_PRINT               \
+        assert(fp)
+
+PERL_CALLCONV OP *
+Perl_do_readline(pTHX)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
 #define PERL_ARGS_ASSERT_DO_READLINE
 
-PERL_CALLCONV bool     Perl_do_seek(pTHX_ GV* gv, Off_t pos, int whence);
+PERL_CALLCONV bool
+Perl_do_seek(pTHX_ GV *gv, Off_t pos, int whence)
+        __attribute__visibility__("hidden");
 #define PERL_ARGS_ASSERT_DO_SEEK
-PERL_CALLCONV void     Perl_do_sprintf(pTHX_ SV* sv, SSize_t len, SV** sarg);
-#define PERL_ARGS_ASSERT_DO_SPRINTF    \
-       assert(sv); assert(sarg)
-PERL_CALLCONV void     Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bool dumpops, STRLEN pvlim);
-#define PERL_ARGS_ASSERT_DO_SV_DUMP    \
-       assert(file)
-PERL_CALLCONV Off_t    Perl_do_sysseek(pTHX_ GV* gv, Off_t pos, int whence);
-#define PERL_ARGS_ASSERT_DO_SYSSEEK    \
-       assert(gv)
-PERL_CALLCONV Off_t    Perl_do_tell(pTHX_ GV* gv)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_DO_TELL       \
-       assert(gv)
-
-PERL_CALLCONV Size_t   Perl_do_trans(pTHX_ SV* sv);
-#define PERL_ARGS_ASSERT_DO_TRANS      \
-       assert(sv)
-PERL_CALLCONV I16      Perl_do_uniprop_match(const char * const key, const U16 key_len)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_DO_UNIPROP_MATCH      \
-       assert(key)
-
-PERL_CALLCONV UV       Perl_do_vecget(pTHX_ SV* sv, STRLEN offset, int size);
-#define PERL_ARGS_ASSERT_DO_VECGET     \
-       assert(sv)
-PERL_CALLCONV void     Perl_do_vecset(pTHX_ SV* sv);
-#define PERL_ARGS_ASSERT_DO_VECSET     \
-       assert(sv)
-PERL_CALLCONV void     Perl_do_vop(pTHX_ I32 optype, SV* sv, SV* left, SV* right);
-#define PERL_ARGS_ASSERT_DO_VOP        \
-       assert(sv); assert(left); assert(right)
-PERL_CALLCONV OP*      Perl_dofile(pTHX_ OP* term, I32 force_builtin);
-#define PERL_ARGS_ASSERT_DOFILE        \
-       assert(term)
-PERL_CALLCONV bool     Perl_doing_taint(int argc, char** argv, char** env)
-                       __attribute__warn_unused_result__;
+
+PERL_CALLCONV void
+Perl_do_sprintf(pTHX_ SV *sv, SSize_t len, SV **sarg);
+#define PERL_ARGS_ASSERT_DO_SPRINTF             \
+        assert(sv); assert(sarg)
+
+PERL_CALLCONV void
+Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bool dumpops, STRLEN pvlim);
+#define PERL_ARGS_ASSERT_DO_SV_DUMP             \
+        assert(file)
+
+PERL_CALLCONV Off_t
+Perl_do_sysseek(pTHX_ GV *gv, Off_t pos, int whence)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_DO_SYSSEEK             \
+        assert(gv)
+
+PERL_CALLCONV Off_t
+Perl_do_tell(pTHX_ GV *gv)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_DO_TELL                \
+        assert(gv)
+
+PERL_CALLCONV Size_t
+Perl_do_trans(pTHX_ SV *sv)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_DO_TRANS               \
+        assert(sv)
+
+PERL_CALLCONV I16
+Perl_do_uniprop_match(const char * const key, const U16 key_len)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_DO_UNIPROP_MATCH       \
+        assert(key)
+
+PERL_CALLCONV UV
+Perl_do_vecget(pTHX_ SV *sv, STRLEN offset, int size)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_DO_VECGET              \
+        assert(sv)
+
+PERL_CALLCONV void
+Perl_do_vecset(pTHX_ SV *sv)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_DO_VECSET              \
+        assert(sv)
+
+PERL_CALLCONV void
+Perl_do_vop(pTHX_ I32 optype, SV *sv, SV *left, SV *right)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_DO_VOP                 \
+        assert(sv); assert(left); assert(right)
+
+PERL_CALLCONV OP *
+Perl_dofile(pTHX_ OP *term, I32 force_builtin)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_DOFILE                 \
+        assert(term)
+
+PERL_CALLCONV bool
+Perl_doing_taint(int argc, char **argv, char **env)
+        __attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_DOING_TAINT
 
-PERL_CALLCONV OP *     Perl_doref(pTHX_ OP *o, I32 type, bool set_op_ref);
-#define PERL_ARGS_ASSERT_DOREF \
-       assert(o)
-PERL_CALLCONV void     Perl_dounwind(pTHX_ I32 cxix);
+PERL_CALLCONV OP *
+Perl_doref(pTHX_ OP *o, I32 type, bool set_op_ref);
+#define PERL_ARGS_ASSERT_DOREF                  \
+        assert(o)
+
+PERL_CALLCONV void
+Perl_dounwind(pTHX_ I32 cxix);
 #define PERL_ARGS_ASSERT_DOUNWIND
-PERL_CALLCONV U8       Perl_dowantarray(pTHX)
-                       __attribute__warn_unused_result__;
+
+PERL_CALLCONV U8
+Perl_dowantarray(pTHX)
+        __attribute__deprecated__
+        __attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_DOWANTARRAY
 
-PERL_CALLCONV void     Perl_drand48_init_r(perl_drand48_t *random_state, U32 seed);
-#define PERL_ARGS_ASSERT_DRAND48_INIT_R        \
-       assert(random_state)
-PERL_CALLCONV double   Perl_drand48_r(perl_drand48_t *random_state);
-#define PERL_ARGS_ASSERT_DRAND48_R     \
-       assert(random_state)
-PERL_CALLCONV void     Perl_dump_all(pTHX);
+PERL_CALLCONV void
+Perl_drand48_init_r(perl_drand48_t *random_state, U32 seed);
+#define PERL_ARGS_ASSERT_DRAND48_INIT_R         \
+        assert(random_state)
+
+PERL_CALLCONV double
+Perl_drand48_r(perl_drand48_t *random_state);
+#define PERL_ARGS_ASSERT_DRAND48_R              \
+        assert(random_state)
+
+PERL_CALLCONV void
+Perl_dump_all(pTHX);
 #define PERL_ARGS_ASSERT_DUMP_ALL
-PERL_CALLCONV void     Perl_dump_all_perl(pTHX_ bool justperl);
+
+PERL_CALLCONV void
+Perl_dump_all_perl(pTHX_ bool justperl)
+        __attribute__visibility__("hidden");
 #define PERL_ARGS_ASSERT_DUMP_ALL_PERL
-PERL_CALLCONV void     Perl_dump_eval(pTHX);
+
+PERL_CALLCONV void
+Perl_dump_eval(pTHX);
 #define PERL_ARGS_ASSERT_DUMP_EVAL
-PERL_CALLCONV void     Perl_dump_form(pTHX_ const GV* gv);
-#define PERL_ARGS_ASSERT_DUMP_FORM     \
-       assert(gv)
-PERL_CALLCONV void     Perl_dump_indent(pTHX_ I32 level, PerlIO *file, const char* pat, ...)
-                       __attribute__format__(__printf__,pTHX_3,pTHX_4);
-#define PERL_ARGS_ASSERT_DUMP_INDENT   \
-       assert(file); assert(pat)
-
-PERL_CALLCONV void     Perl_dump_packsubs(pTHX_ const HV* stash);
-#define PERL_ARGS_ASSERT_DUMP_PACKSUBS \
-       assert(stash)
-PERL_CALLCONV void     Perl_dump_packsubs_perl(pTHX_ const HV* stash, bool justperl);
-#define PERL_ARGS_ASSERT_DUMP_PACKSUBS_PERL    \
-       assert(stash)
-PERL_CALLCONV void     Perl_dump_sub(pTHX_ const GV* gv);
-#define PERL_ARGS_ASSERT_DUMP_SUB      \
-       assert(gv)
-PERL_CALLCONV void     Perl_dump_sub_perl(pTHX_ const GV* gv, bool justperl);
-#define PERL_ARGS_ASSERT_DUMP_SUB_PERL \
-       assert(gv)
-PERL_CALLCONV void     Perl_dump_vindent(pTHX_ I32 level, PerlIO *file, const char* pat, va_list *args);
-#define PERL_ARGS_ASSERT_DUMP_VINDENT  \
-       assert(file); assert(pat)
-PERL_CALLCONV STRLEN*  Perl_dup_warnings(pTHX_ STRLEN* warnings);
+
+PERL_CALLCONV void
+Perl_dump_form(pTHX_ const GV *gv);
+#define PERL_ARGS_ASSERT_DUMP_FORM              \
+        assert(gv)
+
+PERL_CALLCONV void
+Perl_dump_indent(pTHX_ I32 level, PerlIO *file, const char *pat, ...)
+        __attribute__format__(__printf__,pTHX_3,pTHX_4);
+#define PERL_ARGS_ASSERT_DUMP_INDENT            \
+        assert(file); assert(pat)
+
+PERL_CALLCONV void
+Perl_dump_packsubs(pTHX_ const HV *stash);
+#define PERL_ARGS_ASSERT_DUMP_PACKSUBS          \
+        assert(stash)
+
+PERL_CALLCONV void
+Perl_dump_packsubs_perl(pTHX_ const HV *stash, bool justperl)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_DUMP_PACKSUBS_PERL     \
+        assert(stash)
+
+PERL_CALLCONV void
+Perl_dump_sub(pTHX_ const GV *gv);
+#define PERL_ARGS_ASSERT_DUMP_SUB               \
+        assert(gv)
+
+PERL_CALLCONV void
+Perl_dump_sub_perl(pTHX_ const GV *gv, bool justperl)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_DUMP_SUB_PERL          \
+        assert(gv)
+
+PERL_CALLCONV void
+Perl_dump_vindent(pTHX_ I32 level, PerlIO *file, const char *pat, va_list *args);
+#define PERL_ARGS_ASSERT_DUMP_VINDENT           \
+        assert(file); assert(pat)
+
+PERL_CALLCONV char  *
+Perl_dup_warnings(pTHX_ char *warnings);
 #define PERL_ARGS_ASSERT_DUP_WARNINGS
-PERL_CALLCONV void     Perl_emulate_cop_io(pTHX_ const COP *const c, SV *const sv);
-#define PERL_ARGS_ASSERT_EMULATE_COP_IO        \
-       assert(c); assert(sv)
-PERL_CALLCONV SV*      Perl_eval_pv(pTHX_ const char* p, I32 croak_on_error);
-#define PERL_ARGS_ASSERT_EVAL_PV       \
-       assert(p)
-PERL_CALLCONV I32      Perl_eval_sv(pTHX_ SV* sv, I32 flags);
-#define PERL_ARGS_ASSERT_EVAL_SV       \
-       assert(sv)
-PERL_CALLCONV void     Perl_fbm_compile(pTHX_ SV* sv, U32 flags);
-#define PERL_ARGS_ASSERT_FBM_COMPILE   \
-       assert(sv)
-PERL_CALLCONV char*    Perl_fbm_instr(pTHX_ unsigned char* big, unsigned char* bigend, SV* littlestr, U32 flags)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_FBM_INSTR     \
-       assert(big); assert(bigend); assert(littlestr)
-
-PERL_CALLCONV SV*      Perl_filter_add(pTHX_ filter_t funcp, SV* datasv);
+
+PERL_CALLCONV void
+Perl_emulate_cop_io(pTHX_ const COP * const c, SV * const sv);
+#define PERL_ARGS_ASSERT_EMULATE_COP_IO         \
+        assert(c); assert(sv)
+
+PERL_CALLCONV SV *
+Perl_eval_pv(pTHX_ const char *p, I32 croak_on_error);
+#define PERL_ARGS_ASSERT_EVAL_PV                \
+        assert(p)
+
+PERL_CALLCONV I32
+Perl_eval_sv(pTHX_ SV *sv, I32 flags);
+#define PERL_ARGS_ASSERT_EVAL_SV                \
+        assert(sv)
+
+PERL_CALLCONV void
+Perl_fbm_compile(pTHX_ SV *sv, U32 flags);
+#define PERL_ARGS_ASSERT_FBM_COMPILE            \
+        assert(sv)
+
+PERL_CALLCONV char *
+Perl_fbm_instr(pTHX_ unsigned char *big, unsigned char *bigend, SV *littlestr, U32 flags)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_FBM_INSTR              \
+        assert(big); assert(bigend); assert(littlestr)
+
+PERL_CALLCONV SV *
+Perl_filter_add(pTHX_ filter_t funcp, SV *datasv);
 #define PERL_ARGS_ASSERT_FILTER_ADD
-PERL_CALLCONV void     Perl_filter_del(pTHX_ filter_t funcp);
-#define PERL_ARGS_ASSERT_FILTER_DEL    \
-       assert(funcp)
-PERL_CALLCONV I32      Perl_filter_read(pTHX_ int idx, SV *buf_sv, int maxlen)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_FILTER_READ   \
-       assert(buf_sv)
-
-PERL_CALLCONV void     Perl_finalize_optree(pTHX_ OP* o);
-#define PERL_ARGS_ASSERT_FINALIZE_OPTREE       \
-       assert(o)
-PERL_CALLCONV CV *     Perl_find_lexical_cv(pTHX_ PADOFFSET off);
+
+PERL_CALLCONV void
+Perl_filter_del(pTHX_ filter_t funcp);
+#define PERL_ARGS_ASSERT_FILTER_DEL             \
+        assert(funcp)
+
+PERL_CALLCONV I32
+Perl_filter_read(pTHX_ int idx, SV *buf_sv, int maxlen)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_FILTER_READ            \
+        assert(buf_sv)
+
+PERL_CALLCONV CV *
+Perl_find_lexical_cv(pTHX_ PADOFFSET off)
+        __attribute__visibility__("hidden");
 #define PERL_ARGS_ASSERT_FIND_LEXICAL_CV
-PERL_CALLCONV CV*      Perl_find_runcv(pTHX_ U32 *db_seqp)
-                       __attribute__warn_unused_result__;
+
+PERL_CALLCONV CV *
+Perl_find_runcv(pTHX_ U32 *db_seqp)
+        __attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_FIND_RUNCV
 
-PERL_CALLCONV CV*      Perl_find_runcv_where(pTHX_ U8 cond, IV arg, U32 *db_seqp)
-                       __attribute__warn_unused_result__;
+PERL_CALLCONV CV *
+Perl_find_runcv_where(pTHX_ U8 cond, IV arg, U32 *db_seqp)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
 #define PERL_ARGS_ASSERT_FIND_RUNCV_WHERE
 
-PERL_CALLCONV SV*      Perl_find_rundefsv(pTHX);
+PERL_CALLCONV SV *
+Perl_find_rundefsv(pTHX);
 #define PERL_ARGS_ASSERT_FIND_RUNDEFSV
-PERL_CALLCONV PADOFFSET        Perl_find_rundefsvoffset(pTHX)
-                       __attribute__deprecated__;
-#define PERL_ARGS_ASSERT_FIND_RUNDEFSVOFFSET
-
-PERL_CALLCONV char*    Perl_find_script(pTHX_ const char *scriptname, bool dosearch, const char *const *const search_ext, I32 flags);
-#define PERL_ARGS_ASSERT_FIND_SCRIPT   \
-       assert(scriptname)
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE I32 Perl_foldEQ(const char* a, const char* b, I32 len);
-#define PERL_ARGS_ASSERT_FOLDEQ        \
-       assert(a); assert(b)
-#endif
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE I32 Perl_foldEQ_latin1(const char* a, const char* b, I32 len);
-#define PERL_ARGS_ASSERT_FOLDEQ_LATIN1 \
-       assert(a); assert(b)
-#endif
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE I32 Perl_foldEQ_locale(const char* a, const char* b, I32 len);
-#define PERL_ARGS_ASSERT_FOLDEQ_LOCALE \
-       assert(a); assert(b)
-#endif
-/* PERL_CALLCONV I32   foldEQ_utf8(pTHX_ const char *s1, char **pe1, UV l1, bool u1, const char *s2, char **pe2, UV l2, bool u2); */
-#define PERL_ARGS_ASSERT_FOLDEQ_UTF8
-PERL_CALLCONV I32      Perl_foldEQ_utf8_flags(pTHX_ const char *s1, char **pe1, UV l1, bool u1, const char *s2, char **pe2, UV l2, bool u2, U32 flags);
-#define PERL_ARGS_ASSERT_FOLDEQ_UTF8_FLAGS     \
-       assert(s1); assert(s2)
-PERL_CALLCONV char*    Perl_form(pTHX_ const char* pat, ...)
-                       __attribute__format__(__printf__,pTHX_1,pTHX_2);
-#define PERL_ARGS_ASSERT_FORM  \
-       assert(pat)
-
-PERL_CALLCONV void     Perl_free_tied_hv_pool(pTHX);
+
+PERL_CALLCONV char *
+Perl_find_script(pTHX_ const char *scriptname, bool dosearch, const char * const * const search_ext, I32 flags)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_FIND_SCRIPT            \
+        assert(scriptname)
+
+/* PERL_CALLCONV I32
+foldEQ_utf8(pTHX_ const char *s1, char **pe1, UV l1, bool u1, const char *s2, char **pe2, UV l2, bool u2); */
+
+PERL_CALLCONV I32
+Perl_foldEQ_utf8_flags(pTHX_ const char *s1, char **pe1, UV l1, bool u1, const char *s2, char **pe2, UV l2, bool u2, U32 flags);
+#define PERL_ARGS_ASSERT_FOLDEQ_UTF8_FLAGS      \
+        assert(s1); assert(s2)
+
+PERL_CALLCONV void
+Perl_forbid_outofblock_ops(pTHX_ OP *o, const char *blockname);
+#define PERL_ARGS_ASSERT_FORBID_OUTOFBLOCK_OPS  \
+        assert(o); assert(blockname)
+
+PERL_CALLCONV void
+Perl_force_locale_unlock(void)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_FORCE_LOCALE_UNLOCK
+
+PERL_CALLCONV char *
+Perl_form(pTHX_ const char *pat, ...)
+        __attribute__format__(__printf__,pTHX_1,pTHX_2);
+#define PERL_ARGS_ASSERT_FORM                   \
+        assert(pat)
+
+PERL_CALLCONV void
+Perl_free_tied_hv_pool(pTHX)
+        __attribute__visibility__("hidden");
 #define PERL_ARGS_ASSERT_FREE_TIED_HV_POOL
-PERL_CALLCONV void     Perl_free_tmps(pTHX);
+
+PERL_CALLCONV void
+Perl_free_tmps(pTHX);
 #define PERL_ARGS_ASSERT_FREE_TMPS
-PERL_CALLCONV SV*      Perl_get_and_check_backslash_N_name(pTHX_ const char* s, const char* e, const bool is_utf8, const char** error_msg)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_GET_AND_CHECK_BACKSLASH_N_NAME        \
-       assert(s); assert(e); assert(error_msg)
-
-PERL_CALLCONV AV*      Perl_get_av(pTHX_ const char *name, I32 flags);
-#define PERL_ARGS_ASSERT_GET_AV        \
-       assert(name)
-PERL_CALLCONV void*    Perl_get_context(void)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_GET_CONTEXT
-
-PERL_CALLCONV CV*      Perl_get_cv(pTHX_ const char* name, I32 flags);
-#define PERL_ARGS_ASSERT_GET_CV        \
-       assert(name)
-PERL_CALLCONV CV*      Perl_get_cvn_flags(pTHX_ const char* name, STRLEN len, I32 flags);
-#define PERL_ARGS_ASSERT_GET_CVN_FLAGS \
-       assert(name)
-PERL_CALLCONV void     Perl_get_db_sub(pTHX_ SV **svp, CV *cv);
-#define PERL_ARGS_ASSERT_GET_DB_SUB    \
-       assert(cv)
-PERL_CALLCONV const char *     Perl_get_deprecated_property_msg(const Size_t warning_offset)
-                       __attribute__warn_unused_result__;
+
+PERL_CALLCONV SV *
+Perl_get_and_check_backslash_N_name(pTHX_ const char *s, const char *e, const bool is_utf8, const char **error_msg)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_GET_AND_CHECK_BACKSLASH_N_NAME \
+        assert(s); assert(e); assert(error_msg)
+
+PERL_CALLCONV AV *
+Perl_get_av(pTHX_ const char *name, I32 flags);
+#define PERL_ARGS_ASSERT_GET_AV                 \
+        assert(name)
+
+PERL_CALLCONV CV *
+Perl_get_cv(pTHX_ const char *name, I32 flags);
+#define PERL_ARGS_ASSERT_GET_CV                 \
+        assert(name)
+
+PERL_CALLCONV CV *
+Perl_get_cvn_flags(pTHX_ const char *name, STRLEN len, I32 flags);
+#define PERL_ARGS_ASSERT_GET_CVN_FLAGS          \
+        assert(name)
+
+PERL_CALLCONV void
+Perl_get_db_sub(pTHX_ SV **svp, CV *cv);
+#define PERL_ARGS_ASSERT_GET_DB_SUB             \
+        assert(cv)
+
+PERL_CALLCONV const char *
+Perl_get_deprecated_property_msg(const Size_t warning_offset)
+        __attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_GET_DEPRECATED_PROPERTY_MSG
 
-PERL_CALLCONV void     Perl_get_hash_seed(pTHX_ unsigned char * const seed_buffer);
-#define PERL_ARGS_ASSERT_GET_HASH_SEED \
-       assert(seed_buffer)
-PERL_CALLCONV HV*      Perl_get_hv(pTHX_ const char *name, I32 flags);
-#define PERL_ARGS_ASSERT_GET_HV        \
-       assert(name)
-PERL_CALLCONV const char*      Perl_get_no_modify(pTHX)
-                       __attribute__warn_unused_result__
-                       __attribute__pure__;
+PERL_CALLCONV int
+Perl_get_extended_os_errno(void)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_GET_EXTENDED_OS_ERRNO
+
+PERL_CALLCONV void
+Perl_get_hash_seed(pTHX_ unsigned char * const seed_buffer)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_GET_HASH_SEED          \
+        assert(seed_buffer)
+
+PERL_CALLCONV HV *
+Perl_get_hv(pTHX_ const char *name, I32 flags);
+#define PERL_ARGS_ASSERT_GET_HV                 \
+        assert(name)
+
+PERL_CALLCONV const char *
+Perl_get_no_modify(pTHX)
+        __attribute__deprecated__
+        __attribute__warn_unused_result__
+        __attribute__pure__
+        __attribute__visibility__("hidden");
 #define PERL_ARGS_ASSERT_GET_NO_MODIFY
 
-PERL_CALLCONV char**   Perl_get_op_descs(pTHX)
-                       __attribute__warn_unused_result__
-                       __attribute__pure__;
+PERL_CALLCONV char **
+Perl_get_op_descs(pTHX)
+        __attribute__deprecated__
+        __attribute__warn_unused_result__
+        __attribute__pure__;
 #define PERL_ARGS_ASSERT_GET_OP_DESCS
 
-PERL_CALLCONV char**   Perl_get_op_names(pTHX)
-                       __attribute__warn_unused_result__
-                       __attribute__pure__;
+PERL_CALLCONV char **
+Perl_get_op_names(pTHX)
+        __attribute__deprecated__
+        __attribute__warn_unused_result__
+        __attribute__pure__;
 #define PERL_ARGS_ASSERT_GET_OP_NAMES
 
-PERL_CALLCONV U32*     Perl_get_opargs(pTHX)
-                       __attribute__warn_unused_result__
-                       __attribute__pure__;
+PERL_CALLCONV U32 *
+Perl_get_opargs(pTHX)
+        __attribute__deprecated__
+        __attribute__warn_unused_result__
+        __attribute__pure__
+        __attribute__visibility__("hidden");
 #define PERL_ARGS_ASSERT_GET_OPARGS
 
-PERL_CALLCONV PPADDR_t*        Perl_get_ppaddr(pTHX)
-                       __attribute__warn_unused_result__
-                       __attribute__pure__;
+PERL_CALLCONV PPADDR_t *
+Perl_get_ppaddr(pTHX)
+        __attribute__deprecated__
+        __attribute__warn_unused_result__
+        __attribute__pure__;
 #define PERL_ARGS_ASSERT_GET_PPADDR
 
-PERL_CALLCONV SV *     Perl_get_prop_definition(pTHX_ const int table_index)
-                       __attribute__warn_unused_result__;
+PERL_CALLCONV SV *
+Perl_get_prop_definition(pTHX_ const int table_index)
+        __attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_GET_PROP_DEFINITION
 
-PERL_CALLCONV const char * const *     Perl_get_prop_values(const int table_index)
-                       __attribute__warn_unused_result__;
+PERL_CALLCONV const char * const *
+Perl_get_prop_values(const int table_index)
+        __attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_GET_PROP_VALUES
 
-PERL_CALLCONV REGEXP * Perl_get_re_arg(pTHX_ SV *sv);
+PERL_CALLCONV REGEXP *
+Perl_get_re_arg(pTHX_ SV *sv);
 #define PERL_ARGS_ASSERT_GET_RE_ARG
-PERL_CALLCONV SV*      Perl_get_sv(pTHX_ const char *name, I32 flags);
-#define PERL_ARGS_ASSERT_GET_SV        \
-       assert(name)
-PERL_CALLCONV MGVTBL*  Perl_get_vtbl(pTHX_ int vtbl_id)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_GET_VTBL
-
-PERL_CALLCONV int      Perl_getcwd_sv(pTHX_ SV* sv);
-#define PERL_ARGS_ASSERT_GETCWD_SV     \
-       assert(sv)
-PERL_CALLCONV void     Perl_gp_free(pTHX_ GV* gv);
+
+PERL_CALLCONV SV *
+Perl_get_sv(pTHX_ const char *name, I32 flags);
+#define PERL_ARGS_ASSERT_GET_SV                 \
+        assert(name)
+
+PERL_CALLCONV int
+Perl_getcwd_sv(pTHX_ SV *sv);
+#define PERL_ARGS_ASSERT_GETCWD_SV              \
+        assert(sv)
+
+PERL_CALLCONV void
+Perl_gp_free(pTHX_ GV *gv);
 #define PERL_ARGS_ASSERT_GP_FREE
-PERL_CALLCONV GP*      Perl_gp_ref(pTHX_ GP* gp);
+
+PERL_CALLCONV GP *
+Perl_gp_ref(pTHX_ GP *gp);
 #define PERL_ARGS_ASSERT_GP_REF
-PERL_CALLCONV bool     Perl_grok_atoUV(const char* pv, UV* valptr, const char** endptr);
-#define PERL_ARGS_ASSERT_GROK_ATOUV    \
-       assert(pv); assert(valptr)
-PERL_CALLCONV UV       Perl_grok_bin(pTHX_ const char* start, STRLEN* len_p, I32* flags, NV *result);
-#define PERL_ARGS_ASSERT_GROK_BIN      \
-       assert(start); assert(len_p); assert(flags)
-PERL_CALLCONV UV       Perl_grok_bin_oct_hex(pTHX_ const char* start, STRLEN* len_p, I32* flags, NV *result, const unsigned shift, const U8 lookup_bit, const char prefix);
-#define PERL_ARGS_ASSERT_GROK_BIN_OCT_HEX      \
-       assert(start); assert(len_p); assert(flags)
-PERL_CALLCONV UV       Perl_grok_hex(pTHX_ const char* start, STRLEN* len_p, I32* flags, NV *result);
-#define PERL_ARGS_ASSERT_GROK_HEX      \
-       assert(start); assert(len_p); assert(flags)
-PERL_CALLCONV int      Perl_grok_infnan(pTHX_ const char** sp, const char *send);
-#define PERL_ARGS_ASSERT_GROK_INFNAN   \
-       assert(sp); assert(send)
-PERL_CALLCONV int      Perl_grok_number(pTHX_ const char *pv, STRLEN len, UV *valuep);
-#define PERL_ARGS_ASSERT_GROK_NUMBER   \
-       assert(pv)
-PERL_CALLCONV int      Perl_grok_number_flags(pTHX_ const char *pv, STRLEN len, UV *valuep, U32 flags);
-#define PERL_ARGS_ASSERT_GROK_NUMBER_FLAGS     \
-       assert(pv)
-PERL_CALLCONV bool     Perl_grok_numeric_radix(pTHX_ const char **sp, const char *send)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_GROK_NUMERIC_RADIX    \
-       assert(sp); assert(send)
-
-PERL_CALLCONV UV       Perl_grok_oct(pTHX_ const char* start, STRLEN* len_p, I32* flags, NV *result);
-#define PERL_ARGS_ASSERT_GROK_OCT      \
-       assert(start); assert(len_p); assert(flags)
-#ifndef NO_MATHOMS
-PERL_CALLCONV GV*      Perl_gv_AVadd(pTHX_ GV *gv);
-#define PERL_ARGS_ASSERT_GV_AVADD
-#endif
-#ifndef NO_MATHOMS
-PERL_CALLCONV GV*      Perl_gv_HVadd(pTHX_ GV *gv);
-#define PERL_ARGS_ASSERT_GV_HVADD
-#endif
-#ifndef NO_MATHOMS
-PERL_CALLCONV GV*      Perl_gv_IOadd(pTHX_ GV* gv);
-#define PERL_ARGS_ASSERT_GV_IOADD
-#endif
-PERL_CALLCONV GV*      Perl_gv_add_by_type(pTHX_ GV *gv, svtype type);
+
+PERL_CALLCONV bool
+Perl_grok_atoUV(const char *pv, UV *valptr, const char **endptr);
+#define PERL_ARGS_ASSERT_GROK_ATOUV             \
+        assert(pv); assert(valptr)
+
+PERL_CALLCONV UV
+Perl_grok_bin(pTHX_ const char *start, STRLEN *len_p, I32 *flags, NV *result);
+#define PERL_ARGS_ASSERT_GROK_BIN               \
+        assert(start); assert(len_p); assert(flags)
+
+PERL_CALLCONV UV
+Perl_grok_bin_oct_hex(pTHX_ const char *start, STRLEN *len_p, I32 *flags, NV *result, const unsigned shift, const U8 lookup_bit, const char prefix);
+#define PERL_ARGS_ASSERT_GROK_BIN_OCT_HEX       \
+        assert(start); assert(len_p); assert(flags)
+
+PERL_CALLCONV UV
+Perl_grok_hex(pTHX_ const char *start, STRLEN *len_p, I32 *flags, NV *result);
+#define PERL_ARGS_ASSERT_GROK_HEX               \
+        assert(start); assert(len_p); assert(flags)
+
+PERL_CALLCONV int
+Perl_grok_infnan(pTHX_ const char **sp, const char *send);
+#define PERL_ARGS_ASSERT_GROK_INFNAN            \
+        assert(sp); assert(send)
+
+PERL_CALLCONV int
+Perl_grok_number(pTHX_ const char *pv, STRLEN len, UV *valuep);
+#define PERL_ARGS_ASSERT_GROK_NUMBER            \
+        assert(pv)
+
+PERL_CALLCONV int
+Perl_grok_number_flags(pTHX_ const char *pv, STRLEN len, UV *valuep, U32 flags);
+#define PERL_ARGS_ASSERT_GROK_NUMBER_FLAGS      \
+        assert(pv)
+
+PERL_CALLCONV bool
+Perl_grok_numeric_radix(pTHX_ const char **sp, const char *send)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_GROK_NUMERIC_RADIX     \
+        assert(sp); assert(send)
+
+PERL_CALLCONV UV
+Perl_grok_oct(pTHX_ const char *start, STRLEN *len_p, I32 *flags, NV *result);
+#define PERL_ARGS_ASSERT_GROK_OCT               \
+        assert(start); assert(len_p); assert(flags)
+
+PERL_CALLCONV GV *
+Perl_gv_add_by_type(pTHX_ GV *gv, svtype type);
 #define PERL_ARGS_ASSERT_GV_ADD_BY_TYPE
-/* PERL_CALLCONV GV*   gv_autoload4(pTHX_ HV* stash, const char* name, STRLEN len, I32 method)
-                       __attribute__warn_unused_result__; */
-#define PERL_ARGS_ASSERT_GV_AUTOLOAD4
-
-PERL_CALLCONV GV*      Perl_gv_autoload_pv(pTHX_ HV* stash, const char* namepv, U32 flags)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_GV_AUTOLOAD_PV        \
-       assert(namepv)
-
-PERL_CALLCONV GV*      Perl_gv_autoload_pvn(pTHX_ HV* stash, const char* name, STRLEN len, U32 flags)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_GV_AUTOLOAD_PVN       \
-       assert(name)
-
-PERL_CALLCONV GV*      Perl_gv_autoload_sv(pTHX_ HV* stash, SV* namesv, U32 flags)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_GV_AUTOLOAD_SV        \
-       assert(namesv)
-
-PERL_CALLCONV void     Perl_gv_check(pTHX_ HV* stash);
-#define PERL_ARGS_ASSERT_GV_CHECK      \
-       assert(stash)
-PERL_CALLCONV SV*      Perl_gv_const_sv(pTHX_ GV* gv)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_GV_CONST_SV   \
-       assert(gv)
-
-PERL_CALLCONV void     Perl_gv_dump(pTHX_ GV* gv);
-#define PERL_ARGS_ASSERT_GV_DUMP
-#ifndef NO_MATHOMS
-PERL_CALLCONV void     Perl_gv_efullname(pTHX_ SV* sv, const GV* gv)
-                       __attribute__deprecated__;
-#define PERL_ARGS_ASSERT_GV_EFULLNAME  \
-       assert(sv); assert(gv)
-#endif
 
-#ifndef NO_MATHOMS
-PERL_CALLCONV void     Perl_gv_efullname3(pTHX_ SV* sv, const GV* gv, const char* prefix);
-#define PERL_ARGS_ASSERT_GV_EFULLNAME3 \
-       assert(sv); assert(gv)
-#endif
-PERL_CALLCONV void     Perl_gv_efullname4(pTHX_ SV* sv, const GV* gv, const char* prefix, bool keepmain);
-#define PERL_ARGS_ASSERT_GV_EFULLNAME4 \
-       assert(sv); assert(gv)
-PERL_CALLCONV GV*      Perl_gv_fetchfile(pTHX_ const char* name);
-#define PERL_ARGS_ASSERT_GV_FETCHFILE  \
-       assert(name)
-PERL_CALLCONV GV*      Perl_gv_fetchfile_flags(pTHX_ const char *const name, const STRLEN len, const U32 flags);
-#define PERL_ARGS_ASSERT_GV_FETCHFILE_FLAGS    \
-       assert(name)
-/* PERL_CALLCONV GV*   gv_fetchmeth(pTHX_ HV* stash, const char* name, STRLEN len, I32 level); */
-#define PERL_ARGS_ASSERT_GV_FETCHMETH
-/* PERL_CALLCONV GV*   gv_fetchmeth_autoload(pTHX_ HV* stash, const char* name, STRLEN len, I32 level); */
-#define PERL_ARGS_ASSERT_GV_FETCHMETH_AUTOLOAD
-PERL_CALLCONV GV*      Perl_gv_fetchmeth_pv(pTHX_ HV* stash, const char* name, I32 level, U32 flags);
-#define PERL_ARGS_ASSERT_GV_FETCHMETH_PV       \
-       assert(name)
-PERL_CALLCONV GV*      Perl_gv_fetchmeth_pv_autoload(pTHX_ HV* stash, const char* name, I32 level, U32 flags);
-#define PERL_ARGS_ASSERT_GV_FETCHMETH_PV_AUTOLOAD      \
-       assert(name)
-PERL_CALLCONV GV*      Perl_gv_fetchmeth_pvn(pTHX_ HV* stash, const char* name, STRLEN len, I32 level, U32 flags);
-#define PERL_ARGS_ASSERT_GV_FETCHMETH_PVN      \
-       assert(name)
-PERL_CALLCONV GV*      Perl_gv_fetchmeth_pvn_autoload(pTHX_ HV* stash, const char* name, STRLEN len, I32 level, U32 flags);
-#define PERL_ARGS_ASSERT_GV_FETCHMETH_PVN_AUTOLOAD     \
-       assert(name)
-PERL_CALLCONV GV*      Perl_gv_fetchmeth_sv(pTHX_ HV* stash, SV* namesv, I32 level, U32 flags);
-#define PERL_ARGS_ASSERT_GV_FETCHMETH_SV       \
-       assert(namesv)
-PERL_CALLCONV GV*      Perl_gv_fetchmeth_sv_autoload(pTHX_ HV* stash, SV* namesv, I32 level, U32 flags);
-#define PERL_ARGS_ASSERT_GV_FETCHMETH_SV_AUTOLOAD      \
-       assert(namesv)
-#ifndef NO_MATHOMS
-PERL_CALLCONV GV*      Perl_gv_fetchmethod(pTHX_ HV* stash, const char* name);
-#define PERL_ARGS_ASSERT_GV_FETCHMETHOD        \
-       assert(stash); assert(name)
-#endif
-PERL_CALLCONV GV*      Perl_gv_fetchmethod_autoload(pTHX_ HV* stash, const char* name, I32 autoload);
-#define PERL_ARGS_ASSERT_GV_FETCHMETHOD_AUTOLOAD       \
-       assert(stash); assert(name)
-PERL_CALLCONV GV*      Perl_gv_fetchmethod_pv_flags(pTHX_ HV* stash, const char* name, U32 flags);
-#define PERL_ARGS_ASSERT_GV_FETCHMETHOD_PV_FLAGS       \
-       assert(stash); assert(name)
-PERL_CALLCONV GV*      Perl_gv_fetchmethod_pvn_flags(pTHX_ HV* stash, const char* name, const STRLEN len, U32 flags);
-#define PERL_ARGS_ASSERT_GV_FETCHMETHOD_PVN_FLAGS      \
-       assert(stash); assert(name)
-PERL_CALLCONV GV*      Perl_gv_fetchmethod_sv_flags(pTHX_ HV* stash, SV* namesv, U32 flags);
-#define PERL_ARGS_ASSERT_GV_FETCHMETHOD_SV_FLAGS       \
-       assert(stash); assert(namesv)
-PERL_CALLCONV GV*      Perl_gv_fetchpv(pTHX_ const char *nambeg, I32 flags, const svtype sv_type);
-#define PERL_ARGS_ASSERT_GV_FETCHPV    \
-       assert(nambeg)
-PERL_CALLCONV GV*      Perl_gv_fetchpvn_flags(pTHX_ const char* name, STRLEN len, I32 flags, const svtype sv_type);
-#define PERL_ARGS_ASSERT_GV_FETCHPVN_FLAGS     \
-       assert(name)
-PERL_CALLCONV GV*      Perl_gv_fetchsv(pTHX_ SV *name, I32 flags, const svtype sv_type);
-#define PERL_ARGS_ASSERT_GV_FETCHSV    \
-       assert(name)
-#ifndef NO_MATHOMS
-PERL_CALLCONV void     Perl_gv_fullname(pTHX_ SV* sv, const GV* gv)
-                       __attribute__deprecated__;
-#define PERL_ARGS_ASSERT_GV_FULLNAME   \
-       assert(sv); assert(gv)
-#endif
+/* PERL_CALLCONV GV *
+gv_autoload4(pTHX_ HV *stash, const char *name, STRLEN len, I32 method)
+        __attribute__warn_unused_result__; */
+
+PERL_CALLCONV GV *
+Perl_gv_autoload_pv(pTHX_ HV *stash, const char *namepv, U32 flags)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_GV_AUTOLOAD_PV         \
+        assert(namepv)
+
+PERL_CALLCONV GV *
+Perl_gv_autoload_pvn(pTHX_ HV *stash, const char *name, STRLEN len, U32 flags)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_GV_AUTOLOAD_PVN        \
+        assert(name)
+
+PERL_CALLCONV GV *
+Perl_gv_autoload_sv(pTHX_ HV *stash, SV *namesv, U32 flags)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_GV_AUTOLOAD_SV         \
+        assert(namesv)
+
+PERL_CALLCONV void
+Perl_gv_check(pTHX_ HV *stash);
+#define PERL_ARGS_ASSERT_GV_CHECK               \
+        assert(stash)
+
+PERL_CALLCONV SV *
+Perl_gv_const_sv(pTHX_ GV *gv)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_GV_CONST_SV            \
+        assert(gv)
+
+PERL_CALLCONV void
+Perl_gv_dump(pTHX_ GV *gv);
+#define PERL_ARGS_ASSERT_GV_DUMP
 
-#ifndef NO_MATHOMS
-PERL_CALLCONV void     Perl_gv_fullname3(pTHX_ SV* sv, const GV* gv, const char* prefix);
-#define PERL_ARGS_ASSERT_GV_FULLNAME3  \
-       assert(sv); assert(gv)
-#endif
-PERL_CALLCONV void     Perl_gv_fullname4(pTHX_ SV* sv, const GV* gv, const char* prefix, bool keepmain);
-#define PERL_ARGS_ASSERT_GV_FULLNAME4  \
-       assert(sv); assert(gv)
-PERL_CALLCONV CV*      Perl_gv_handler(pTHX_ HV* stash, I32 id)
-                       __attribute__warn_unused_result__;
+PERL_CALLCONV void
+Perl_gv_efullname4(pTHX_ SV *sv, const GV *gv, const char *prefix, bool keepmain);
+#define PERL_ARGS_ASSERT_GV_EFULLNAME4          \
+        assert(sv); assert(gv)
+
+PERL_CALLCONV GV *
+Perl_gv_fetchfile(pTHX_ const char *name);
+#define PERL_ARGS_ASSERT_GV_FETCHFILE           \
+        assert(name)
+
+PERL_CALLCONV GV *
+Perl_gv_fetchfile_flags(pTHX_ const char * const name, const STRLEN len, const U32 flags);
+#define PERL_ARGS_ASSERT_GV_FETCHFILE_FLAGS     \
+        assert(name)
+
+/* PERL_CALLCONV GV *
+gv_fetchmeth(pTHX_ HV *stash, const char *name, STRLEN len, I32 level); */
+
+/* PERL_CALLCONV GV *
+gv_fetchmeth_autoload(pTHX_ HV *stash, const char *name, STRLEN len, I32 level); */
+
+PERL_CALLCONV GV *
+Perl_gv_fetchmeth_pv(pTHX_ HV *stash, const char *name, I32 level, U32 flags);
+#define PERL_ARGS_ASSERT_GV_FETCHMETH_PV        \
+        assert(name)
+
+PERL_CALLCONV GV *
+Perl_gv_fetchmeth_pv_autoload(pTHX_ HV *stash, const char *name, I32 level, U32 flags);
+#define PERL_ARGS_ASSERT_GV_FETCHMETH_PV_AUTOLOAD \
+        assert(name)
+
+PERL_CALLCONV GV *
+Perl_gv_fetchmeth_pvn(pTHX_ HV *stash, const char *name, STRLEN len, I32 level, U32 flags);
+#define PERL_ARGS_ASSERT_GV_FETCHMETH_PVN       \
+        assert(name)
+
+PERL_CALLCONV GV *
+Perl_gv_fetchmeth_pvn_autoload(pTHX_ HV *stash, const char *name, STRLEN len, I32 level, U32 flags);
+#define PERL_ARGS_ASSERT_GV_FETCHMETH_PVN_AUTOLOAD \
+        assert(name)
+
+PERL_CALLCONV GV *
+Perl_gv_fetchmeth_sv(pTHX_ HV *stash, SV *namesv, I32 level, U32 flags);
+#define PERL_ARGS_ASSERT_GV_FETCHMETH_SV        \
+        assert(namesv)
+
+PERL_CALLCONV GV *
+Perl_gv_fetchmeth_sv_autoload(pTHX_ HV *stash, SV *namesv, I32 level, U32 flags);
+#define PERL_ARGS_ASSERT_GV_FETCHMETH_SV_AUTOLOAD \
+        assert(namesv)
+
+PERL_CALLCONV GV *
+Perl_gv_fetchmethod_autoload(pTHX_ HV *stash, const char *name, I32 autoload);
+#define PERL_ARGS_ASSERT_GV_FETCHMETHOD_AUTOLOAD \
+        assert(stash); assert(name)
+
+PERL_CALLCONV GV *
+Perl_gv_fetchmethod_pv_flags(pTHX_ HV *stash, const char *name, U32 flags);
+#define PERL_ARGS_ASSERT_GV_FETCHMETHOD_PV_FLAGS \
+        assert(stash); assert(name)
+
+PERL_CALLCONV GV *
+Perl_gv_fetchmethod_pvn_flags(pTHX_ HV *stash, const char *name, const STRLEN len, U32 flags);
+#define PERL_ARGS_ASSERT_GV_FETCHMETHOD_PVN_FLAGS \
+        assert(stash); assert(name)
+
+PERL_CALLCONV GV *
+Perl_gv_fetchmethod_sv_flags(pTHX_ HV *stash, SV *namesv, U32 flags);
+#define PERL_ARGS_ASSERT_GV_FETCHMETHOD_SV_FLAGS \
+        assert(stash); assert(namesv)
+
+PERL_CALLCONV GV *
+Perl_gv_fetchpv(pTHX_ const char *nambeg, I32 flags, const svtype sv_type);
+#define PERL_ARGS_ASSERT_GV_FETCHPV             \
+        assert(nambeg)
+
+PERL_CALLCONV GV *
+Perl_gv_fetchpvn_flags(pTHX_ const char *name, STRLEN len, I32 flags, const svtype sv_type);
+#define PERL_ARGS_ASSERT_GV_FETCHPVN_FLAGS      \
+        assert(name)
+
+PERL_CALLCONV GV *
+Perl_gv_fetchsv(pTHX_ SV *name, I32 flags, const svtype sv_type);
+#define PERL_ARGS_ASSERT_GV_FETCHSV             \
+        assert(name)
+
+PERL_CALLCONV void
+Perl_gv_fullname4(pTHX_ SV *sv, const GV *gv, const char *prefix, bool keepmain);
+#define PERL_ARGS_ASSERT_GV_FULLNAME4           \
+        assert(sv); assert(gv)
+
+PERL_CALLCONV CV *
+Perl_gv_handler(pTHX_ HV *stash, I32 id)
+        __attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_GV_HANDLER
 
-/* PERL_CALLCONV void  gv_init(pTHX_ GV* gv, HV* stash, const char* name, STRLEN len, int multi); */
-#define PERL_ARGS_ASSERT_GV_INIT
-PERL_CALLCONV void     Perl_gv_init_pv(pTHX_ GV* gv, HV* stash, const char* name, U32 flags);
-#define PERL_ARGS_ASSERT_GV_INIT_PV    \
-       assert(gv); assert(name)
-PERL_CALLCONV void     Perl_gv_init_pvn(pTHX_ GV* gv, HV* stash, const char* name, STRLEN len, U32 flags);
-#define PERL_ARGS_ASSERT_GV_INIT_PVN   \
-       assert(gv); assert(name)
-PERL_CALLCONV void     Perl_gv_init_sv(pTHX_ GV* gv, HV* stash, SV* namesv, U32 flags);
-#define PERL_ARGS_ASSERT_GV_INIT_SV    \
-       assert(gv); assert(namesv)
-PERL_CALLCONV void     Perl_gv_name_set(pTHX_ GV* gv, const char *name, U32 len, U32 flags);
-#define PERL_ARGS_ASSERT_GV_NAME_SET   \
-       assert(gv); assert(name)
-PERL_CALLCONV GV *     Perl_gv_override(pTHX_ const char * const name, const STRLEN len);
-#define PERL_ARGS_ASSERT_GV_OVERRIDE   \
-       assert(name)
-PERL_CALLCONV void     Perl_gv_setref(pTHX_ SV *const dsv, SV *const ssv);
-#define PERL_ARGS_ASSERT_GV_SETREF     \
-       assert(dsv); assert(ssv)
-PERL_CALLCONV HV*      Perl_gv_stashpv(pTHX_ const char* name, I32 flags);
-#define PERL_ARGS_ASSERT_GV_STASHPV    \
-       assert(name)
-PERL_CALLCONV HV*      Perl_gv_stashpvn(pTHX_ const char* name, U32 namelen, I32 flags);
-#define PERL_ARGS_ASSERT_GV_STASHPVN   \
-       assert(name)
-PERL_CALLCONV HV*      Perl_gv_stashsv(pTHX_ SV* sv, I32 flags);
-#define PERL_ARGS_ASSERT_GV_STASHSV    \
-       assert(sv)
-PERL_CALLCONV void     Perl_gv_try_downgrade(pTHX_ GV* gv);
-#define PERL_ARGS_ASSERT_GV_TRY_DOWNGRADE      \
-       assert(gv)
-PERL_CALLCONV struct xpvhv_aux*        Perl_hv_auxalloc(pTHX_ HV *hv);
-#define PERL_ARGS_ASSERT_HV_AUXALLOC   \
-       assert(hv)
-PERL_CALLCONV AV**     Perl_hv_backreferences_p(pTHX_ HV *hv);
-#define PERL_ARGS_ASSERT_HV_BACKREFERENCES_P   \
-       assert(hv)
-PERL_CALLCONV SV*      Perl_hv_bucket_ratio(pTHX_ HV *hv)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_HV_BUCKET_RATIO       \
-       assert(hv)
-
-PERL_CALLCONV void     Perl_hv_clear(pTHX_ HV *hv);
+/* PERL_CALLCONV void
+gv_init(pTHX_ GV *gv, HV *stash, const char *name, STRLEN len, int multi); */
+
+PERL_CALLCONV void
+Perl_gv_init_pv(pTHX_ GV *gv, HV *stash, const char *name, U32 flags);
+#define PERL_ARGS_ASSERT_GV_INIT_PV             \
+        assert(gv); assert(name)
+
+PERL_CALLCONV void
+Perl_gv_init_pvn(pTHX_ GV *gv, HV *stash, const char *name, STRLEN len, U32 flags);
+#define PERL_ARGS_ASSERT_GV_INIT_PVN            \
+        assert(gv); assert(name)
+
+PERL_CALLCONV void
+Perl_gv_init_sv(pTHX_ GV *gv, HV *stash, SV *namesv, U32 flags);
+#define PERL_ARGS_ASSERT_GV_INIT_SV             \
+        assert(gv); assert(namesv)
+
+PERL_CALLCONV void
+Perl_gv_name_set(pTHX_ GV *gv, const char *name, U32 len, U32 flags);
+#define PERL_ARGS_ASSERT_GV_NAME_SET            \
+        assert(gv); assert(name)
+
+PERL_CALLCONV GV *
+Perl_gv_override(pTHX_ const char * const name, const STRLEN len);
+#define PERL_ARGS_ASSERT_GV_OVERRIDE            \
+        assert(name)
+
+PERL_CALLCONV void
+Perl_gv_setref(pTHX_ SV * const dsv, SV * const ssv)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_GV_SETREF              \
+        assert(dsv); assert(ssv)
+
+PERL_CALLCONV HV *
+Perl_gv_stashpv(pTHX_ const char *name, I32 flags);
+#define PERL_ARGS_ASSERT_GV_STASHPV             \
+        assert(name)
+
+PERL_CALLCONV HV *
+Perl_gv_stashpvn(pTHX_ const char *name, U32 namelen, I32 flags);
+#define PERL_ARGS_ASSERT_GV_STASHPVN            \
+        assert(name)
+
+PERL_CALLCONV HV *
+Perl_gv_stashsv(pTHX_ SV *sv, I32 flags);
+#define PERL_ARGS_ASSERT_GV_STASHSV             \
+        assert(sv)
+
+PERL_CALLCONV void
+Perl_gv_try_downgrade(pTHX_ GV *gv);
+#define PERL_ARGS_ASSERT_GV_TRY_DOWNGRADE       \
+        assert(gv)
+
+PERL_CALLCONV struct xpvhv_aux *
+Perl_hv_auxalloc(pTHX_ HV *hv)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_HV_AUXALLOC            \
+        assert(hv)
+
+PERL_CALLCONV AV **
+Perl_hv_backreferences_p(pTHX_ HV *hv)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_HV_BACKREFERENCES_P    \
+        assert(hv)
+
+PERL_CALLCONV SV *
+Perl_hv_bucket_ratio(pTHX_ HV *hv)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_HV_BUCKET_RATIO        \
+        assert(hv)
+
+PERL_CALLCONV void
+Perl_hv_clear(pTHX_ HV *hv);
 #define PERL_ARGS_ASSERT_HV_CLEAR
-PERL_CALLCONV void     Perl_hv_clear_placeholders(pTHX_ HV *hv);
-#define PERL_ARGS_ASSERT_HV_CLEAR_PLACEHOLDERS \
-       assert(hv)
-PERL_CALLCONV void*    Perl_hv_common(pTHX_ HV *hv, SV *keysv, const char* key, STRLEN klen, int flags, int action, SV *val, U32 hash);
+
+PERL_CALLCONV void
+Perl_hv_clear_placeholders(pTHX_ HV *hv);
+#define PERL_ARGS_ASSERT_HV_CLEAR_PLACEHOLDERS  \
+        assert(hv)
+
+PERL_CALLCONV void *
+Perl_hv_common(pTHX_ HV *hv, SV *keysv, const char *key, STRLEN klen, int flags, int action, SV *val, U32 hash);
 #define PERL_ARGS_ASSERT_HV_COMMON
-PERL_CALLCONV void*    Perl_hv_common_key_len(pTHX_ HV *hv, const char *key, I32 klen_i32, const int action, SV *val, const U32 hash);
-#define PERL_ARGS_ASSERT_HV_COMMON_KEY_LEN     \
-       assert(key)
-PERL_CALLCONV HV *     Perl_hv_copy_hints_hv(pTHX_ HV *const ohv)
-                       __attribute__warn_unused_result__;
+
+PERL_CALLCONV void *
+Perl_hv_common_key_len(pTHX_ HV *hv, const char *key, I32 klen_i32, const int action, SV *val, const U32 hash);
+#define PERL_ARGS_ASSERT_HV_COMMON_KEY_LEN      \
+        assert(key)
+
+PERL_CALLCONV HV *
+Perl_hv_copy_hints_hv(pTHX_ HV * const ohv)
+        __attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_HV_COPY_HINTS_HV
 
-PERL_CALLCONV void     Perl_hv_delayfree_ent(pTHX_ HV *notused, HE *entry);
+PERL_CALLCONV void
+Perl_hv_delayfree_ent(pTHX_ HV *notused, HE *entry);
 #define PERL_ARGS_ASSERT_HV_DELAYFREE_ENT
-#ifndef NO_MATHOMS
-PERL_CALLCONV SV*      Perl_hv_delete(pTHX_ HV *hv, const char *key, I32 klen, I32 flags);
-#define PERL_ARGS_ASSERT_HV_DELETE     \
-       assert(key)
-#endif
-#ifndef NO_MATHOMS
-PERL_CALLCONV SV*      Perl_hv_delete_ent(pTHX_ HV *hv, SV *keysv, I32 flags, U32 hash);
-#define PERL_ARGS_ASSERT_HV_DELETE_ENT \
-       assert(keysv)
-#endif
-PERL_CALLCONV HE**     Perl_hv_eiter_p(pTHX_ HV *hv)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_HV_EITER_P    \
-       assert(hv)
-
-PERL_CALLCONV void     Perl_hv_eiter_set(pTHX_ HV *hv, HE *eiter);
-#define PERL_ARGS_ASSERT_HV_EITER_SET  \
-       assert(hv)
-PERL_CALLCONV void     Perl_hv_ename_add(pTHX_ HV *hv, const char *name, U32 len, U32 flags);
-#define PERL_ARGS_ASSERT_HV_ENAME_ADD  \
-       assert(hv); assert(name)
-PERL_CALLCONV void     Perl_hv_ename_delete(pTHX_ HV *hv, const char *name, U32 len, U32 flags);
-#define PERL_ARGS_ASSERT_HV_ENAME_DELETE       \
-       assert(hv); assert(name)
-#ifndef NO_MATHOMS
-PERL_CALLCONV bool     Perl_hv_exists(pTHX_ HV *hv, const char *key, I32 klen)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_HV_EXISTS     \
-       assert(key)
-#endif
 
-#ifndef NO_MATHOMS
-PERL_CALLCONV bool     Perl_hv_exists_ent(pTHX_ HV *hv, SV *keysv, U32 hash)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_HV_EXISTS_ENT \
-       assert(keysv)
-#endif
-
-#ifndef NO_MATHOMS
-PERL_CALLCONV SV**     Perl_hv_fetch(pTHX_ HV *hv, const char *key, I32 klen, I32 lval);
-#define PERL_ARGS_ASSERT_HV_FETCH      \
-       assert(key)
-#endif
-#ifndef NO_MATHOMS
-PERL_CALLCONV HE*      Perl_hv_fetch_ent(pTHX_ HV *hv, SV *keysv, I32 lval, U32 hash);
-#define PERL_ARGS_ASSERT_HV_FETCH_ENT  \
-       assert(keysv)
-#endif
-PERL_CALLCONV STRLEN   Perl_hv_fill(pTHX_ HV *const hv);
-#define PERL_ARGS_ASSERT_HV_FILL       \
-       assert(hv)
-PERL_CALLCONV void     Perl_hv_free_ent(pTHX_ HV *notused, HE *entry);
+PERL_CALLCONV void
+Perl_hv_dump(pTHX_ HV *hv);
+#define PERL_ARGS_ASSERT_HV_DUMP
+
+PERL_CALLCONV HE **
+Perl_hv_eiter_p(pTHX_ HV *hv)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_HV_EITER_P             \
+        assert(hv)
+
+PERL_CALLCONV void
+Perl_hv_eiter_set(pTHX_ HV *hv, HE *eiter);
+#define PERL_ARGS_ASSERT_HV_EITER_SET           \
+        assert(hv)
+
+PERL_CALLCONV void
+Perl_hv_ename_add(pTHX_ HV *hv, const char *name, U32 len, U32 flags)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_HV_ENAME_ADD           \
+        assert(hv); assert(name)
+
+PERL_CALLCONV void
+Perl_hv_ename_delete(pTHX_ HV *hv, const char *name, U32 len, U32 flags)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_HV_ENAME_DELETE        \
+        assert(hv); assert(name)
+
+PERL_CALLCONV STRLEN
+Perl_hv_fill(pTHX_ HV * const hv);
+#define PERL_ARGS_ASSERT_HV_FILL                \
+        assert(hv)
+
+PERL_CALLCONV void
+Perl_hv_free_ent(pTHX_ HV *notused, HE *entry);
 #define PERL_ARGS_ASSERT_HV_FREE_ENT
-PERL_CALLCONV I32      Perl_hv_iterinit(pTHX_ HV *hv);
-#define PERL_ARGS_ASSERT_HV_ITERINIT   \
-       assert(hv)
-PERL_CALLCONV char*    Perl_hv_iterkey(pTHX_ HE* entry, I32* retlen)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_HV_ITERKEY    \
-       assert(entry); assert(retlen)
-
-PERL_CALLCONV SV*      Perl_hv_iterkeysv(pTHX_ HE* entry)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_HV_ITERKEYSV  \
-       assert(entry)
-
-#ifndef NO_MATHOMS
-PERL_CALLCONV HE*      Perl_hv_iternext(pTHX_ HV *hv)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_HV_ITERNEXT   \
-       assert(hv)
-#endif
 
-PERL_CALLCONV HE*      Perl_hv_iternext_flags(pTHX_ HV *hv, I32 flags)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_HV_ITERNEXT_FLAGS     \
-       assert(hv)
-
-PERL_CALLCONV SV*      Perl_hv_iternextsv(pTHX_ HV *hv, char **key, I32 *retlen)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_HV_ITERNEXTSV \
-       assert(hv); assert(key); assert(retlen)
-
-PERL_CALLCONV SV*      Perl_hv_iterval(pTHX_ HV *hv, HE *entry)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_HV_ITERVAL    \
-       assert(hv); assert(entry)
-
-PERL_CALLCONV void     Perl_hv_ksplit(pTHX_ HV *hv, IV newmax);
-#define PERL_ARGS_ASSERT_HV_KSPLIT     \
-       assert(hv)
-#ifndef NO_MATHOMS
-PERL_CALLCONV void     Perl_hv_magic(pTHX_ HV *hv, GV *gv, int how);
-#define PERL_ARGS_ASSERT_HV_MAGIC      \
-       assert(hv)
-#endif
-PERL_CALLCONV void     Perl_hv_name_set(pTHX_ HV *hv, const char *name, U32 len, U32 flags);
-#define PERL_ARGS_ASSERT_HV_NAME_SET   \
-       assert(hv)
-PERL_CALLCONV I32      Perl_hv_placeholders_get(pTHX_ const HV *hv)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_HV_PLACEHOLDERS_GET   \
-       assert(hv)
-
-PERL_CALLCONV SSize_t* Perl_hv_placeholders_p(pTHX_ HV *hv)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_HV_PLACEHOLDERS_P     \
-       assert(hv)
-
-PERL_CALLCONV void     Perl_hv_placeholders_set(pTHX_ HV *hv, I32 ph);
-#define PERL_ARGS_ASSERT_HV_PLACEHOLDERS_SET   \
-       assert(hv)
-PERL_CALLCONV void     Perl_hv_pushkv(pTHX_ HV *hv, U32 flags);
-#define PERL_ARGS_ASSERT_HV_PUSHKV     \
-       assert(hv)
-PERL_CALLCONV void     Perl_hv_rand_set(pTHX_ HV *hv, U32 new_xhv_rand);
-#define PERL_ARGS_ASSERT_HV_RAND_SET   \
-       assert(hv)
-PERL_CALLCONV I32*     Perl_hv_riter_p(pTHX_ HV *hv)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_HV_RITER_P    \
-       assert(hv)
-
-PERL_CALLCONV void     Perl_hv_riter_set(pTHX_ HV *hv, I32 riter);
-#define PERL_ARGS_ASSERT_HV_RITER_SET  \
-       assert(hv)
-PERL_CALLCONV SV*      Perl_hv_scalar(pTHX_ HV *hv)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_HV_SCALAR     \
-       assert(hv)
-
-#ifndef NO_MATHOMS
-PERL_CALLCONV SV**     Perl_hv_store(pTHX_ HV *hv, const char *key, I32 klen, SV *val, U32 hash);
-#define PERL_ARGS_ASSERT_HV_STORE
-#endif
-#ifndef NO_MATHOMS
-PERL_CALLCONV HE*      Perl_hv_store_ent(pTHX_ HV *hv, SV *key, SV *val, U32 hash);
-#define PERL_ARGS_ASSERT_HV_STORE_ENT
-#endif
-#ifndef NO_MATHOMS
-PERL_CALLCONV SV**     Perl_hv_store_flags(pTHX_ HV *hv, const char *key, I32 klen, SV *val, U32 hash, int flags);
-#define PERL_ARGS_ASSERT_HV_STORE_FLAGS
-#endif
-/* PERL_CALLCONV void  hv_undef(pTHX_ HV *hv); */
-#define PERL_ARGS_ASSERT_HV_UNDEF
-PERL_CALLCONV void     Perl_hv_undef_flags(pTHX_ HV *hv, U32 flags);
+PERL_CALLCONV I32
+Perl_hv_iterinit(pTHX_ HV *hv);
+#define PERL_ARGS_ASSERT_HV_ITERINIT            \
+        assert(hv)
+
+PERL_CALLCONV char *
+Perl_hv_iterkey(pTHX_ HE *entry, I32 *retlen)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_HV_ITERKEY             \
+        assert(entry); assert(retlen)
+
+PERL_CALLCONV SV *
+Perl_hv_iterkeysv(pTHX_ HE *entry)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_HV_ITERKEYSV           \
+        assert(entry)
+
+PERL_CALLCONV HE *
+Perl_hv_iternext_flags(pTHX_ HV *hv, I32 flags)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_HV_ITERNEXT_FLAGS      \
+        assert(hv)
+
+PERL_CALLCONV SV *
+Perl_hv_iternextsv(pTHX_ HV *hv, char **key, I32 *retlen)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_HV_ITERNEXTSV          \
+        assert(hv); assert(key); assert(retlen)
+
+PERL_CALLCONV SV *
+Perl_hv_iterval(pTHX_ HV *hv, HE *entry)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_HV_ITERVAL             \
+        assert(hv); assert(entry)
+
+PERL_CALLCONV void
+Perl_hv_ksplit(pTHX_ HV *hv, IV newmax);
+#define PERL_ARGS_ASSERT_HV_KSPLIT              \
+        assert(hv)
+
+PERL_CALLCONV void
+Perl_hv_name_set(pTHX_ HV *hv, const char *name, U32 len, U32 flags);
+#define PERL_ARGS_ASSERT_HV_NAME_SET            \
+        assert(hv)
+
+PERL_CALLCONV I32
+Perl_hv_placeholders_get(pTHX_ const HV *hv)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_HV_PLACEHOLDERS_GET    \
+        assert(hv)
+
+PERL_CALLCONV SSize_t *
+Perl_hv_placeholders_p(pTHX_ HV *hv)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_HV_PLACEHOLDERS_P      \
+        assert(hv)
+
+PERL_CALLCONV void
+Perl_hv_placeholders_set(pTHX_ HV *hv, I32 ph);
+#define PERL_ARGS_ASSERT_HV_PLACEHOLDERS_SET    \
+        assert(hv)
+
+PERL_CALLCONV void
+Perl_hv_pushkv(pTHX_ HV *hv, U32 flags)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_HV_PUSHKV              \
+        assert(hv)
+
+PERL_CALLCONV void
+Perl_hv_rand_set(pTHX_ HV *hv, U32 new_xhv_rand);
+#define PERL_ARGS_ASSERT_HV_RAND_SET            \
+        assert(hv)
+
+PERL_CALLCONV I32 *
+Perl_hv_riter_p(pTHX_ HV *hv)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_HV_RITER_P             \
+        assert(hv)
+
+PERL_CALLCONV void
+Perl_hv_riter_set(pTHX_ HV *hv, I32 riter);
+#define PERL_ARGS_ASSERT_HV_RITER_SET           \
+        assert(hv)
+
+PERL_CALLCONV SV *
+Perl_hv_scalar(pTHX_ HV *hv)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_HV_SCALAR              \
+        assert(hv)
+
+/* PERL_CALLCONV SV **
+hv_stores(pTHX_ HV *hv, const char * const key, SV *val); */
+
+/* PERL_CALLCONV void
+hv_undef(pTHX_ HV *hv); */
+
+PERL_CALLCONV void
+Perl_hv_undef_flags(pTHX_ HV *hv, U32 flags);
 #define PERL_ARGS_ASSERT_HV_UNDEF_FLAGS
-/* PERL_CALLCONV I32   ibcmp(pTHX_ const char* a, const char* b, I32 len)
-                       __attribute__warn_unused_result__
-                       __attribute__pure__; */
-#define PERL_ARGS_ASSERT_IBCMP
-
-/* PERL_CALLCONV I32   ibcmp_locale(pTHX_ const char* a, const char* b, I32 len)
-                       __attribute__warn_unused_result__
-                       __attribute__pure__; */
-#define PERL_ARGS_ASSERT_IBCMP_LOCALE
-
-/* PERL_CALLCONV I32   ibcmp_utf8(pTHX_ const char *s1, char **pe1, UV l1, bool u1, const char *s2, char **pe2, UV l2, bool u2); */
-#define PERL_ARGS_ASSERT_IBCMP_UTF8
-PERL_CALLCONV void     Perl_init_argv_symbols(pTHX_ int argc, char **argv);
-#define PERL_ARGS_ASSERT_INIT_ARGV_SYMBOLS     \
-       assert(argv)
-PERL_CALLCONV void     Perl_init_constants(pTHX);
+
+/* PERL_CALLCONV I32
+ibcmp(pTHX_ const char *a, const char *b, I32 len)
+        __attribute__warn_unused_result__
+        __attribute__pure__; */
+
+/* PERL_CALLCONV I32
+ibcmp_locale(pTHX_ const char *a, const char *b, I32 len)
+        __attribute__warn_unused_result__
+        __attribute__pure__; */
+
+/* PERL_CALLCONV I32
+ibcmp_utf8(pTHX_ const char *s1, char **pe1, UV l1, bool u1, const char *s2, char **pe2, UV l2, bool u2); */
+
+PERL_CALLCONV STRLEN
+Perl_infix_plugin_standard(pTHX_ char *operator_ptr, STRLEN operator_len, struct Perl_custom_infix **def);
+#define PERL_ARGS_ASSERT_INFIX_PLUGIN_STANDARD  \
+        assert(operator_ptr); assert(def)
+
+PERL_CALLCONV void
+Perl_init_argv_symbols(pTHX_ int argc, char **argv)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_INIT_ARGV_SYMBOLS      \
+        assert(argv)
+
+PERL_CALLCONV void
+Perl_init_constants(pTHX)
+        __attribute__visibility__("hidden");
 #define PERL_ARGS_ASSERT_INIT_CONSTANTS
-PERL_CALLCONV void     Perl_init_dbargs(pTHX);
+
+PERL_CALLCONV void
+Perl_init_dbargs(pTHX)
+        __attribute__visibility__("hidden");
 #define PERL_ARGS_ASSERT_INIT_DBARGS
-PERL_CALLCONV void     Perl_init_debugger(pTHX);
+
+PERL_CALLCONV void
+Perl_init_debugger(pTHX)
+        __attribute__visibility__("hidden");
 #define PERL_ARGS_ASSERT_INIT_DEBUGGER
-PERL_CALLCONV int      Perl_init_i18nl10n(pTHX_ int printwarn);
-#define PERL_ARGS_ASSERT_INIT_I18NL10N
-#ifndef NO_MATHOMS
-PERL_CALLCONV int      Perl_init_i18nl14n(pTHX_ int printwarn)
-                       __attribute__deprecated__;
-#define PERL_ARGS_ASSERT_INIT_I18NL14N
-#endif
 
-PERL_CALLCONV void     Perl_init_named_cv(pTHX_ CV *cv, OP *nameop);
-#define PERL_ARGS_ASSERT_INIT_NAMED_CV \
-       assert(cv); assert(nameop)
-PERL_CALLCONV void     Perl_init_stacks(pTHX);
-#define PERL_ARGS_ASSERT_INIT_STACKS
-PERL_CALLCONV void     Perl_init_tm(pTHX_ struct tm *ptm);
-#define PERL_ARGS_ASSERT_INIT_TM       \
-       assert(ptm)
-PERL_CALLCONV void     Perl_init_uniprops(pTHX);
-#define PERL_ARGS_ASSERT_INIT_UNIPROPS
-#ifndef NO_MATHOMS
-PERL_CALLCONV char*    Perl_instr(const char* big, const char* little)
-                       __attribute__warn_unused_result__
-                       __attribute__pure__;
-#define PERL_ARGS_ASSERT_INSTR \
-       assert(big); assert(little)
-#endif
+PERL_CALLCONV int
+Perl_init_i18nl10n(pTHX_ int printwarn);
+#define PERL_ARGS_ASSERT_INIT_I18NL10N
 
-PERL_CALLCONV U32      Perl_intro_my(pTHX);
-#define PERL_ARGS_ASSERT_INTRO_MY
-PERL_CALLCONV OP*      Perl_invert(pTHX_ OP* cmd)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_INVERT
+PERL_CALLCONV void
+Perl_init_named_cv(pTHX_ CV *cv, OP *nameop);
+#define PERL_ARGS_ASSERT_INIT_NAMED_CV          \
+        assert(cv); assert(nameop)
 
-PERL_CALLCONV void     Perl_invmap_dump(pTHX_ SV* invlist, UV * map);
-#define PERL_ARGS_ASSERT_INVMAP_DUMP   \
-       assert(invlist); assert(map)
-PERL_CALLCONV bool     Perl_io_close(pTHX_ IO* io, GV *gv, bool not_implicit, bool warn_on_fail);
-#define PERL_ARGS_ASSERT_IO_CLOSE      \
-       assert(io)
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE Size_t      Perl_isC9_STRICT_UTF8_CHAR(const U8 * const s0, const U8 * const e)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_ISC9_STRICT_UTF8_CHAR \
-       assert(s0); assert(e)
-#endif
+PERL_CALLCONV void
+Perl_init_stacks(pTHX);
+#define PERL_ARGS_ASSERT_INIT_STACKS
 
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE Size_t      Perl_isSTRICT_UTF8_CHAR(const U8 * const s0, const U8 * const e)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_ISSTRICT_UTF8_CHAR    \
-       assert(s0); assert(e)
-#endif
+PERL_CALLCONV void
+Perl_init_tm(pTHX_ struct tm *ptm);
+#define PERL_ARGS_ASSERT_INIT_TM                \
+        assert(ptm)
 
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE Size_t      Perl_isUTF8_CHAR(const U8 * const s0, const U8 * const e)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_ISUTF8_CHAR   \
-       assert(s0); assert(e)
-#endif
+PERL_CALLCONV void
+Perl_init_uniprops(pTHX)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_INIT_UNIPROPS
 
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE Size_t      Perl_isUTF8_CHAR_flags(const U8 * const s0, const U8 * const e, const U32 flags)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_ISUTF8_CHAR_FLAGS     \
-       assert(s0); assert(e)
-#endif
+PERL_CALLCONV U32
+Perl_intro_my(pTHX);
+#define PERL_ARGS_ASSERT_INTRO_MY
 
-/* PERL_CALLCONV bool  is_ascii_string(const U8* const s, STRLEN len)
-                       __attribute__warn_unused_result__
-                       __attribute__pure__; */
-#define PERL_ARGS_ASSERT_IS_ASCII_STRING
-
-/* PERL_CALLCONV bool  is_c9strict_utf8_string(const U8 *s, STRLEN len)
-                       __attribute__warn_unused_result__; */
-#define PERL_ARGS_ASSERT_IS_C9STRICT_UTF8_STRING
-
-/* PERL_CALLCONV bool  is_c9strict_utf8_string_loc(const U8 *s, STRLEN len, const U8 **ep); */
-#define PERL_ARGS_ASSERT_IS_C9STRICT_UTF8_STRING_LOC
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE bool        Perl_is_c9strict_utf8_string_loclen(const U8 *s, STRLEN len, const U8 **ep, STRLEN *el);
-#define PERL_ARGS_ASSERT_IS_C9STRICT_UTF8_STRING_LOCLEN        \
-       assert(s)
-#endif
-/* PERL_CALLCONV bool  is_invariant_string(const U8* const s, STRLEN len)
-                       __attribute__warn_unused_result__
-                       __attribute__pure__; */
-#define PERL_ARGS_ASSERT_IS_INVARIANT_STRING
+PERL_CALLCONV OP *
+Perl_invert(pTHX_ OP *cmd)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_INVERT
 
-PERL_CALLCONV I32      Perl_is_lvalue_sub(pTHX)
-                       __attribute__warn_unused_result__;
+PERL_CALLCONV void
+Perl_invmap_dump(pTHX_ SV *invlist, UV *map)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_INVMAP_DUMP            \
+        assert(invlist); assert(map)
+
+PERL_CALLCONV bool
+Perl_io_close(pTHX_ IO *io, GV *gv, bool is_explicit, bool warn_on_fail)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_IO_CLOSE               \
+        assert(io)
+
+/* PERL_CALLCONV bool
+is_ascii_string(const U8 * const s, STRLEN len)
+        __attribute__warn_unused_result__
+        __attribute__pure__; */
+
+/* PERL_CALLCONV bool
+is_c9strict_utf8_string(const U8 *s, STRLEN len)
+        __attribute__warn_unused_result__; */
+
+/* PERL_CALLCONV bool
+is_c9strict_utf8_string_loc(const U8 *s, STRLEN len, const U8 **ep); */
+
+/* PERL_CALLCONV bool
+is_invariant_string(const U8 * const s, STRLEN len)
+        __attribute__warn_unused_result__
+        __attribute__pure__; */
+
+PERL_CALLCONV I32
+Perl_is_lvalue_sub(pTHX)
+        __attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_IS_LVALUE_SUB
 
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE bool        Perl_is_safe_syscall(pTHX_ const char *pv, STRLEN len, const char *what, const char *op_name)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_IS_SAFE_SYSCALL       \
-       assert(pv); assert(what); assert(op_name)
-#endif
-
-/* PERL_CALLCONV bool  is_strict_utf8_string(const U8 *s, STRLEN len)
-                       __attribute__warn_unused_result__; */
-#define PERL_ARGS_ASSERT_IS_STRICT_UTF8_STRING
-
-/* PERL_CALLCONV bool  is_strict_utf8_string_loc(const U8 *s, STRLEN len, const U8 **ep); */
-#define PERL_ARGS_ASSERT_IS_STRICT_UTF8_STRING_LOC
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE bool        Perl_is_strict_utf8_string_loclen(const U8 *s, STRLEN len, const U8 **ep, STRLEN *el);
-#define PERL_ARGS_ASSERT_IS_STRICT_UTF8_STRING_LOCLEN  \
-       assert(s)
-#endif
-PERL_CALLCONV Size_t   Perl_is_utf8_FF_helper_(const U8 * const s0, const U8 * const e, const bool require_partial)
-                       __attribute__warn_unused_result__
-                       __attribute__pure__;
-#define PERL_ARGS_ASSERT_IS_UTF8_FF_HELPER_    \
-       assert(s0); assert(e)
-
-#ifndef NO_MATHOMS
-PERL_CALLCONV STRLEN   Perl_is_utf8_char(const U8 *s)
-                       __attribute__deprecated__;
-#define PERL_ARGS_ASSERT_IS_UTF8_CHAR  \
-       assert(s)
-#endif
-
-#ifndef NO_MATHOMS
-PERL_CALLCONV STRLEN   Perl_is_utf8_char_buf(const U8 *buf, const U8 *buf_end);
-#define PERL_ARGS_ASSERT_IS_UTF8_CHAR_BUF      \
-       assert(buf); assert(buf_end)
-#endif
-PERL_CALLCONV STRLEN   Perl_is_utf8_char_helper_(const U8 * const s, const U8 * e, const U32 flags)
-                       __attribute__warn_unused_result__
-                       __attribute__pure__;
-#define PERL_ARGS_ASSERT_IS_UTF8_CHAR_HELPER_  \
-       assert(s); assert(e)
-
-/* PERL_CALLCONV bool  is_utf8_fixed_width_buf_flags(const U8 * const s, STRLEN len, const U32 flags); */
-#define PERL_ARGS_ASSERT_IS_UTF8_FIXED_WIDTH_BUF_FLAGS
-/* PERL_CALLCONV bool  is_utf8_fixed_width_buf_loc_flags(const U8 * const s, STRLEN len, const U8 **ep, const U32 flags); */
-#define PERL_ARGS_ASSERT_IS_UTF8_FIXED_WIDTH_BUF_LOC_FLAGS
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE bool        Perl_is_utf8_fixed_width_buf_loclen_flags(const U8 * const s, STRLEN len, const U8 **ep, STRLEN *el, const U32 flags);
-#define PERL_ARGS_ASSERT_IS_UTF8_FIXED_WIDTH_BUF_LOCLEN_FLAGS  \
-       assert(s)
-#endif
-/* PERL_CALLCONV bool  is_utf8_invariant_string(const U8* const s, STRLEN len)
-                       __attribute__warn_unused_result__; */
-#define PERL_ARGS_ASSERT_IS_UTF8_INVARIANT_STRING
-
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE bool        Perl_is_utf8_invariant_string_loc(const U8* const s, STRLEN len, const U8 ** ep)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_IS_UTF8_INVARIANT_STRING_LOC  \
-       assert(s)
-#endif
-
-/* PERL_CALLCONV bool  is_utf8_string(const U8 *s, STRLEN len)
-                       __attribute__warn_unused_result__; */
-#define PERL_ARGS_ASSERT_IS_UTF8_STRING
-
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE bool        Perl_is_utf8_string_flags(const U8 *s, STRLEN len, const U32 flags)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_IS_UTF8_STRING_FLAGS  \
-       assert(s)
-#endif
-
-#ifndef NO_MATHOMS
-PERL_CALLCONV bool     Perl_is_utf8_string_loc(const U8 *s, const STRLEN len, const U8 **ep);
-#define PERL_ARGS_ASSERT_IS_UTF8_STRING_LOC    \
-       assert(s); assert(ep)
-#endif
-/* PERL_CALLCONV bool  is_utf8_string_loc_flags(const U8 *s, STRLEN len, const U8 **ep, const U32 flags); */
-#define PERL_ARGS_ASSERT_IS_UTF8_STRING_LOC_FLAGS
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE bool        Perl_is_utf8_string_loclen(const U8 *s, STRLEN len, const U8 **ep, STRLEN *el);
-#define PERL_ARGS_ASSERT_IS_UTF8_STRING_LOCLEN \
-       assert(s)
-#endif
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE bool        Perl_is_utf8_string_loclen_flags(const U8 *s, STRLEN len, const U8 **ep, STRLEN *el, const U32 flags);
-#define PERL_ARGS_ASSERT_IS_UTF8_STRING_LOCLEN_FLAGS   \
-       assert(s)
-#endif
-/* PERL_CALLCONV bool  is_utf8_valid_partial_char(const U8 * const s0, const U8 * const e)
-                       __attribute__warn_unused_result__
-                       __attribute__pure__; */
-#define PERL_ARGS_ASSERT_IS_UTF8_VALID_PARTIAL_CHAR
-
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE bool        Perl_is_utf8_valid_partial_char_flags(const U8 * const s0, const U8 * const e, const U32 flags)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_IS_UTF8_VALID_PARTIAL_CHAR_FLAGS      \
-       assert(s0); assert(e)
-#endif
-
-PERL_CALLCONV bool     Perl_isinfnan(NV nv)
-                       __attribute__warn_unused_result__
-                       __attribute__pure__;
+/* PERL_CALLCONV bool
+is_strict_utf8_string(const U8 *s, STRLEN len)
+        __attribute__warn_unused_result__; */
+
+/* PERL_CALLCONV bool
+is_strict_utf8_string_loc(const U8 *s, STRLEN len, const U8 **ep); */
+
+PERL_CALLCONV Size_t
+Perl_is_utf8_FF_helper_(const U8 * const s0, const U8 * const e, const bool require_partial)
+        __attribute__warn_unused_result__
+        __attribute__pure__;
+#define PERL_ARGS_ASSERT_IS_UTF8_FF_HELPER_     \
+        assert(s0); assert(e)
+
+PERL_CALLCONV STRLEN
+Perl_is_utf8_char_helper_(const U8 * const s, const U8 *e, const U32 flags)
+        __attribute__warn_unused_result__
+        __attribute__pure__;
+#define PERL_ARGS_ASSERT_IS_UTF8_CHAR_HELPER_   \
+        assert(s); assert(e)
+
+/* PERL_CALLCONV bool
+is_utf8_fixed_width_buf_flags(const U8 * const s, STRLEN len, const U32 flags); */
+
+/* PERL_CALLCONV bool
+is_utf8_fixed_width_buf_loc_flags(const U8 * const s, STRLEN len, const U8 **ep, const U32 flags); */
+
+/* PERL_CALLCONV bool
+is_utf8_invariant_string(const U8 * const s, STRLEN len)
+        __attribute__warn_unused_result__; */
+
+/* PERL_CALLCONV bool
+is_utf8_string(const U8 *s, STRLEN len)
+        __attribute__warn_unused_result__; */
+
+/* PERL_CALLCONV bool
+is_utf8_string_loc_flags(const U8 *s, STRLEN len, const U8 **ep, const U32 flags); */
+
+/* PERL_CALLCONV bool
+is_utf8_valid_partial_char(const U8 * const s0, const U8 * const e)
+        __attribute__warn_unused_result__
+        __attribute__pure__; */
+
+PERL_CALLCONV bool
+Perl_isinfnan(NV nv)
+        __attribute__warn_unused_result__
+        __attribute__pure__;
 #define PERL_ARGS_ASSERT_ISINFNAN
 
-PERL_CALLCONV bool     Perl_isinfnansv(pTHX_ SV *sv);
-#define PERL_ARGS_ASSERT_ISINFNANSV    \
-       assert(sv)
-PERL_CALLCONV OP*      Perl_jmaybe(pTHX_ OP *o);
-#define PERL_ARGS_ASSERT_JMAYBE        \
-       assert(o)
-PERL_CALLCONV I32      Perl_keyword(pTHX_ const char *name, I32 len, bool all_keywords)
-                       __attribute__warn_unused_result__
-                       __attribute__pure__;
-#define PERL_ARGS_ASSERT_KEYWORD       \
-       assert(name)
-
-PERL_CALLCONV int      Perl_keyword_plugin_standard(pTHX_ char* keyword_ptr, STRLEN keyword_len, OP** op_ptr);
-#define PERL_ARGS_ASSERT_KEYWORD_PLUGIN_STANDARD       \
-       assert(keyword_ptr); assert(op_ptr)
-PERL_CALLCONV void     Perl_leave_adjust_stacks(pTHX_ SV **from_sp, SV **to_sp, U8 gimme, int filter);
-#define PERL_ARGS_ASSERT_LEAVE_ADJUST_STACKS   \
-       assert(from_sp); assert(to_sp)
-PERL_CALLCONV void     Perl_leave_scope(pTHX_ I32 base);
+PERL_CALLCONV bool
+Perl_isinfnansv(pTHX_ SV *sv)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_ISINFNANSV             \
+        assert(sv)
+
+PERL_CALLCONV OP *
+Perl_jmaybe(pTHX_ OP *o)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_JMAYBE                 \
+        assert(o)
+
+PERL_CALLCONV I32
+Perl_keyword(pTHX_ const char *name, I32 len, bool all_keywords)
+        __attribute__warn_unused_result__
+        __attribute__pure__
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_KEYWORD                \
+        assert(name)
+
+PERL_CALLCONV int
+Perl_keyword_plugin_standard(pTHX_ char *keyword_ptr, STRLEN keyword_len, OP **op_ptr);
+#define PERL_ARGS_ASSERT_KEYWORD_PLUGIN_STANDARD \
+        assert(keyword_ptr); assert(op_ptr)
+
+PERL_CALLCONV void
+Perl_leave_adjust_stacks(pTHX_ SV **from_sp, SV **to_sp, U8 gimme, int filter);
+#define PERL_ARGS_ASSERT_LEAVE_ADJUST_STACKS    \
+        assert(from_sp); assert(to_sp)
+
+PERL_CALLCONV void
+Perl_leave_scope(pTHX_ I32 base);
 #define PERL_ARGS_ASSERT_LEAVE_SCOPE
-PERL_CALLCONV bool     Perl_lex_bufutf8(pTHX);
+
+PERL_CALLCONV bool
+Perl_lex_bufutf8(pTHX);
 #define PERL_ARGS_ASSERT_LEX_BUFUTF8
-PERL_CALLCONV void     Perl_lex_discard_to(pTHX_ char* ptr);
-#define PERL_ARGS_ASSERT_LEX_DISCARD_TO        \
-       assert(ptr)
-PERL_CALLCONV char*    Perl_lex_grow_linestr(pTHX_ STRLEN len);
+
+PERL_CALLCONV void
+Perl_lex_discard_to(pTHX_ char *ptr);
+#define PERL_ARGS_ASSERT_LEX_DISCARD_TO         \
+        assert(ptr)
+
+PERL_CALLCONV char *
+Perl_lex_grow_linestr(pTHX_ STRLEN len);
 #define PERL_ARGS_ASSERT_LEX_GROW_LINESTR
-PERL_CALLCONV bool     Perl_lex_next_chunk(pTHX_ U32 flags);
+
+PERL_CALLCONV bool
+Perl_lex_next_chunk(pTHX_ U32 flags);
 #define PERL_ARGS_ASSERT_LEX_NEXT_CHUNK
-PERL_CALLCONV I32      Perl_lex_peek_unichar(pTHX_ U32 flags);
+
+PERL_CALLCONV I32
+Perl_lex_peek_unichar(pTHX_ U32 flags);
 #define PERL_ARGS_ASSERT_LEX_PEEK_UNICHAR
-PERL_CALLCONV void     Perl_lex_read_space(pTHX_ U32 flags);
+
+PERL_CALLCONV void
+Perl_lex_read_space(pTHX_ U32 flags);
 #define PERL_ARGS_ASSERT_LEX_READ_SPACE
-PERL_CALLCONV void     Perl_lex_read_to(pTHX_ char* ptr);
-#define PERL_ARGS_ASSERT_LEX_READ_TO   \
-       assert(ptr)
-PERL_CALLCONV I32      Perl_lex_read_unichar(pTHX_ U32 flags);
+
+PERL_CALLCONV void
+Perl_lex_read_to(pTHX_ char *ptr);
+#define PERL_ARGS_ASSERT_LEX_READ_TO            \
+        assert(ptr)
+
+PERL_CALLCONV I32
+Perl_lex_read_unichar(pTHX_ U32 flags);
 #define PERL_ARGS_ASSERT_LEX_READ_UNICHAR
-PERL_CALLCONV void     Perl_lex_start(pTHX_ SV* line, PerlIO *rsfp, U32 flags);
+
+PERL_CALLCONV void
+Perl_lex_start(pTHX_ SV *line, PerlIO *rsfp, U32 flags);
 #define PERL_ARGS_ASSERT_LEX_START
-PERL_CALLCONV void     Perl_lex_stuff_pv(pTHX_ const char* pv, U32 flags);
-#define PERL_ARGS_ASSERT_LEX_STUFF_PV  \
-       assert(pv)
-PERL_CALLCONV void     Perl_lex_stuff_pvn(pTHX_ const char* pv, STRLEN len, U32 flags);
-#define PERL_ARGS_ASSERT_LEX_STUFF_PVN \
-       assert(pv)
-PERL_CALLCONV void     Perl_lex_stuff_sv(pTHX_ SV* sv, U32 flags);
-#define PERL_ARGS_ASSERT_LEX_STUFF_SV  \
-       assert(sv)
-PERL_CALLCONV void     Perl_lex_unstuff(pTHX_ char* ptr);
-#define PERL_ARGS_ASSERT_LEX_UNSTUFF   \
-       assert(ptr)
-PERL_CALLCONV OP*      Perl_list(pTHX_ OP* o);
+
+PERL_CALLCONV void
+Perl_lex_stuff_pv(pTHX_ const char *pv, U32 flags);
+#define PERL_ARGS_ASSERT_LEX_STUFF_PV           \
+        assert(pv)
+
+PERL_CALLCONV void
+Perl_lex_stuff_pvn(pTHX_ const char *pv, STRLEN len, U32 flags);
+#define PERL_ARGS_ASSERT_LEX_STUFF_PVN          \
+        assert(pv)
+
+PERL_CALLCONV void
+Perl_lex_stuff_sv(pTHX_ SV *sv, U32 flags);
+#define PERL_ARGS_ASSERT_LEX_STUFF_SV           \
+        assert(sv)
+
+PERL_CALLCONV void
+Perl_lex_unstuff(pTHX_ char *ptr);
+#define PERL_ARGS_ASSERT_LEX_UNSTUFF            \
+        assert(ptr)
+
+PERL_CALLCONV OP *
+Perl_list(pTHX_ OP *o)
+        __attribute__visibility__("hidden");
 #define PERL_ARGS_ASSERT_LIST
-PERL_CALLCONV HV*      Perl_load_charnames(pTHX_ SV * char_name, const char * context, const STRLEN context_len, const char ** error_msg)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_LOAD_CHARNAMES        \
-       assert(char_name); assert(context); assert(error_msg)
-
-PERL_CALLCONV void     Perl_load_module(pTHX_ U32 flags, SV* name, SV* ver, ...);
-#define PERL_ARGS_ASSERT_LOAD_MODULE   \
-       assert(name)
-PERL_CALLCONV OP*      Perl_localize(pTHX_ OP *o, I32 lex);
-#define PERL_ARGS_ASSERT_LOCALIZE      \
-       assert(o)
-PERL_CALLCONV I32      Perl_looks_like_number(pTHX_ SV *const sv)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_LOOKS_LIKE_NUMBER     \
-       assert(sv)
-
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE unsigned    Perl_lsbit_pos32(U32 word)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_LSBIT_POS32
-#endif
 
-PERL_CALLCONV int      Perl_magic_clear_all_env(pTHX_ SV* sv, MAGIC* mg);
-#define PERL_ARGS_ASSERT_MAGIC_CLEAR_ALL_ENV   \
-       assert(sv); assert(mg)
-PERL_CALLCONV int      Perl_magic_cleararylen_p(pTHX_ SV* sv, MAGIC* mg);
-#define PERL_ARGS_ASSERT_MAGIC_CLEARARYLEN_P   \
-       assert(sv); assert(mg)
-PERL_CALLCONV int      Perl_magic_clearenv(pTHX_ SV* sv, MAGIC* mg);
-#define PERL_ARGS_ASSERT_MAGIC_CLEARENV        \
-       assert(sv); assert(mg)
-PERL_CALLCONV int      Perl_magic_clearhint(pTHX_ SV* sv, MAGIC* mg);
-#define PERL_ARGS_ASSERT_MAGIC_CLEARHINT       \
-       assert(sv); assert(mg)
-PERL_CALLCONV int      Perl_magic_clearhints(pTHX_ SV* sv, MAGIC* mg);
-#define PERL_ARGS_ASSERT_MAGIC_CLEARHINTS      \
-       assert(sv); assert(mg)
-PERL_CALLCONV int      Perl_magic_clearisa(pTHX_ SV* sv, MAGIC* mg);
-#define PERL_ARGS_ASSERT_MAGIC_CLEARISA        \
-       assert(mg)
-PERL_CALLCONV int      Perl_magic_clearpack(pTHX_ SV* sv, MAGIC* mg);
-#define PERL_ARGS_ASSERT_MAGIC_CLEARPACK       \
-       assert(sv); assert(mg)
-PERL_CALLCONV int      Perl_magic_clearsig(pTHX_ SV* sv, MAGIC* mg);
-#define PERL_ARGS_ASSERT_MAGIC_CLEARSIG        \
-       assert(sv); assert(mg)
-PERL_CALLCONV int      Perl_magic_copycallchecker(pTHX_ SV* sv, MAGIC *mg, SV *nsv, const char *name, I32 namlen);
-#define PERL_ARGS_ASSERT_MAGIC_COPYCALLCHECKER \
-       assert(sv); assert(mg); assert(nsv)
-PERL_CALLCONV void     Perl_magic_dump(pTHX_ const MAGIC *mg);
+PERL_CALLCONV HV *
+Perl_load_charnames(pTHX_ SV *char_name, const char *context, const STRLEN context_len, const char **error_msg)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_LOAD_CHARNAMES         \
+        assert(char_name); assert(context); assert(error_msg)
+
+PERL_CALLCONV void
+Perl_load_module(pTHX_ U32 flags, SV *name, SV *ver, ...);
+#define PERL_ARGS_ASSERT_LOAD_MODULE            \
+        assert(name)
+
+PERL_CALLCONV_NO_RET void
+Perl_locale_panic(const char *msg, const char *file_name, const line_t line, const int errnum)
+        __attribute__noreturn__;
+#define PERL_ARGS_ASSERT_LOCALE_PANIC           \
+        assert(msg); assert(file_name)
+
+PERL_CALLCONV OP *
+Perl_localize(pTHX_ OP *o, I32 lex)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_LOCALIZE               \
+        assert(o)
+
+PERL_CALLCONV I32
+Perl_looks_like_number(pTHX_ SV * const sv)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_LOOKS_LIKE_NUMBER      \
+        assert(sv)
+
+PERL_CALLCONV int
+Perl_magic_clear_all_env(pTHX_ SV *sv, MAGIC *mg)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_MAGIC_CLEAR_ALL_ENV    \
+        assert(sv); assert(mg)
+
+PERL_CALLCONV int
+Perl_magic_cleararylen_p(pTHX_ SV *sv, MAGIC *mg)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_MAGIC_CLEARARYLEN_P    \
+        assert(sv); assert(mg)
+
+PERL_CALLCONV int
+Perl_magic_clearenv(pTHX_ SV *sv, MAGIC *mg)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_MAGIC_CLEARENV         \
+        assert(sv); assert(mg)
+
+PERL_CALLCONV int
+Perl_magic_clearhint(pTHX_ SV *sv, MAGIC *mg)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_MAGIC_CLEARHINT        \
+        assert(sv); assert(mg)
+
+PERL_CALLCONV int
+Perl_magic_clearhints(pTHX_ SV *sv, MAGIC *mg)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_MAGIC_CLEARHINTS       \
+        assert(sv); assert(mg)
+
+PERL_CALLCONV int
+Perl_magic_clearhook(pTHX_ SV *sv, MAGIC *mg)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_MAGIC_CLEARHOOK        \
+        assert(mg)
+
+PERL_CALLCONV int
+Perl_magic_clearhookall(pTHX_ SV *sv, MAGIC *mg)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_MAGIC_CLEARHOOKALL     \
+        assert(mg)
+
+PERL_CALLCONV int
+Perl_magic_clearisa(pTHX_ SV *sv, MAGIC *mg)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_MAGIC_CLEARISA         \
+        assert(mg)
+
+PERL_CALLCONV int
+Perl_magic_clearpack(pTHX_ SV *sv, MAGIC *mg)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_MAGIC_CLEARPACK        \
+        assert(sv); assert(mg)
+
+PERL_CALLCONV int
+Perl_magic_clearsig(pTHX_ SV *sv, MAGIC *mg)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_MAGIC_CLEARSIG         \
+        assert(sv); assert(mg)
+
+PERL_CALLCONV int
+Perl_magic_copycallchecker(pTHX_ SV *sv, MAGIC *mg, SV *nsv, const char *name, I32 namlen)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_MAGIC_COPYCALLCHECKER  \
+        assert(sv); assert(mg); assert(nsv)
+
+PERL_CALLCONV void
+Perl_magic_dump(pTHX_ const MAGIC *mg);
 #define PERL_ARGS_ASSERT_MAGIC_DUMP
-PERL_CALLCONV int      Perl_magic_existspack(pTHX_ SV* sv, const MAGIC* mg);
-#define PERL_ARGS_ASSERT_MAGIC_EXISTSPACK      \
-       assert(sv); assert(mg)
-PERL_CALLCONV int      Perl_magic_freearylen_p(pTHX_ SV* sv, MAGIC* mg);
-#define PERL_ARGS_ASSERT_MAGIC_FREEARYLEN_P    \
-       assert(sv); assert(mg)
-PERL_CALLCONV int      Perl_magic_freemglob(pTHX_ SV* sv, MAGIC* mg);
-#define PERL_ARGS_ASSERT_MAGIC_FREEMGLOB       \
-       assert(sv); assert(mg)
-PERL_CALLCONV int      Perl_magic_freeovrld(pTHX_ SV* sv, MAGIC* mg);
-#define PERL_ARGS_ASSERT_MAGIC_FREEOVRLD       \
-       assert(sv); assert(mg)
-PERL_CALLCONV int      Perl_magic_freeutf8(pTHX_ SV* sv, MAGIC* mg);
-#define PERL_ARGS_ASSERT_MAGIC_FREEUTF8        \
-       assert(sv); assert(mg)
-PERL_CALLCONV int      Perl_magic_get(pTHX_ SV* sv, MAGIC* mg);
-#define PERL_ARGS_ASSERT_MAGIC_GET     \
-       assert(sv); assert(mg)
-PERL_CALLCONV int      Perl_magic_getarylen(pTHX_ SV* sv, const MAGIC* mg);
-#define PERL_ARGS_ASSERT_MAGIC_GETARYLEN       \
-       assert(sv); assert(mg)
-PERL_CALLCONV int      Perl_magic_getdebugvar(pTHX_ SV* sv, MAGIC* mg);
-#define PERL_ARGS_ASSERT_MAGIC_GETDEBUGVAR     \
-       assert(sv); assert(mg)
-PERL_CALLCONV int      Perl_magic_getdefelem(pTHX_ SV* sv, MAGIC* mg);
-#define PERL_ARGS_ASSERT_MAGIC_GETDEFELEM      \
-       assert(sv); assert(mg)
-PERL_CALLCONV int      Perl_magic_getnkeys(pTHX_ SV* sv, MAGIC* mg);
-#define PERL_ARGS_ASSERT_MAGIC_GETNKEYS        \
-       assert(sv); assert(mg)
-PERL_CALLCONV int      Perl_magic_getpack(pTHX_ SV* sv, MAGIC* mg);
-#define PERL_ARGS_ASSERT_MAGIC_GETPACK \
-       assert(sv); assert(mg)
-PERL_CALLCONV int      Perl_magic_getpos(pTHX_ SV* sv, MAGIC* mg);
-#define PERL_ARGS_ASSERT_MAGIC_GETPOS  \
-       assert(sv); assert(mg)
-PERL_CALLCONV int      Perl_magic_getsig(pTHX_ SV* sv, MAGIC* mg);
-#define PERL_ARGS_ASSERT_MAGIC_GETSIG  \
-       assert(sv); assert(mg)
-PERL_CALLCONV int      Perl_magic_getsubstr(pTHX_ SV* sv, MAGIC* mg);
-#define PERL_ARGS_ASSERT_MAGIC_GETSUBSTR       \
-       assert(sv); assert(mg)
-PERL_CALLCONV int      Perl_magic_gettaint(pTHX_ SV* sv, MAGIC* mg);
-#define PERL_ARGS_ASSERT_MAGIC_GETTAINT        \
-       assert(sv); assert(mg)
-PERL_CALLCONV int      Perl_magic_getuvar(pTHX_ SV* sv, MAGIC* mg);
-#define PERL_ARGS_ASSERT_MAGIC_GETUVAR \
-       assert(sv); assert(mg)
-PERL_CALLCONV int      Perl_magic_getvec(pTHX_ SV* sv, MAGIC* mg);
-#define PERL_ARGS_ASSERT_MAGIC_GETVEC  \
-       assert(sv); assert(mg)
-PERL_CALLCONV int      Perl_magic_killbackrefs(pTHX_ SV *sv, MAGIC *mg);
-#define PERL_ARGS_ASSERT_MAGIC_KILLBACKREFS    \
-       assert(sv); assert(mg)
-PERL_CALLCONV SV*      Perl_magic_methcall(pTHX_ SV *sv, const MAGIC *mg, SV *meth, U32 flags, U32 argc, ...);
-#define PERL_ARGS_ASSERT_MAGIC_METHCALL        \
-       assert(sv); assert(mg); assert(meth)
-PERL_CALLCONV int      Perl_magic_nextpack(pTHX_ SV *sv, MAGIC *mg, SV *key);
-#define PERL_ARGS_ASSERT_MAGIC_NEXTPACK        \
-       assert(sv); assert(mg); assert(key)
-PERL_CALLCONV U32      Perl_magic_regdata_cnt(pTHX_ SV* sv, MAGIC* mg);
-#define PERL_ARGS_ASSERT_MAGIC_REGDATA_CNT     \
-       assert(sv); assert(mg)
-PERL_CALLCONV int      Perl_magic_regdatum_get(pTHX_ SV* sv, MAGIC* mg);
-#define PERL_ARGS_ASSERT_MAGIC_REGDATUM_GET    \
-       assert(sv); assert(mg)
-PERL_CALLCONV SV*      Perl_magic_scalarpack(pTHX_ HV *hv, MAGIC *mg);
-#define PERL_ARGS_ASSERT_MAGIC_SCALARPACK      \
-       assert(hv); assert(mg)
-PERL_CALLCONV int      Perl_magic_set(pTHX_ SV* sv, MAGIC* mg);
-#define PERL_ARGS_ASSERT_MAGIC_SET     \
-       assert(sv); assert(mg)
-PERL_CALLCONV int      Perl_magic_set_all_env(pTHX_ SV* sv, MAGIC* mg);
-#define PERL_ARGS_ASSERT_MAGIC_SET_ALL_ENV     \
-       assert(sv); assert(mg)
-PERL_CALLCONV int      Perl_magic_setarylen(pTHX_ SV* sv, MAGIC* mg);
-#define PERL_ARGS_ASSERT_MAGIC_SETARYLEN       \
-       assert(sv); assert(mg)
-PERL_CALLCONV int      Perl_magic_setdbline(pTHX_ SV* sv, MAGIC* mg);
-#define PERL_ARGS_ASSERT_MAGIC_SETDBLINE       \
-       assert(sv); assert(mg)
-PERL_CALLCONV int      Perl_magic_setdebugvar(pTHX_ SV* sv, MAGIC* mg);
-#define PERL_ARGS_ASSERT_MAGIC_SETDEBUGVAR     \
-       assert(sv); assert(mg)
-PERL_CALLCONV int      Perl_magic_setdefelem(pTHX_ SV* sv, MAGIC* mg);
-#define PERL_ARGS_ASSERT_MAGIC_SETDEFELEM      \
-       assert(sv); assert(mg)
-PERL_CALLCONV int      Perl_magic_setenv(pTHX_ SV* sv, MAGIC* mg);
-#define PERL_ARGS_ASSERT_MAGIC_SETENV  \
-       assert(sv); assert(mg)
-PERL_CALLCONV int      Perl_magic_sethint(pTHX_ SV* sv, MAGIC* mg);
-#define PERL_ARGS_ASSERT_MAGIC_SETHINT \
-       assert(sv); assert(mg)
-PERL_CALLCONV int      Perl_magic_setisa(pTHX_ SV* sv, MAGIC* mg);
-#define PERL_ARGS_ASSERT_MAGIC_SETISA  \
-       assert(sv); assert(mg)
-PERL_CALLCONV int      Perl_magic_setlvref(pTHX_ SV* sv, MAGIC* mg);
-#define PERL_ARGS_ASSERT_MAGIC_SETLVREF        \
-       assert(sv); assert(mg)
-PERL_CALLCONV int      Perl_magic_setmglob(pTHX_ SV* sv, MAGIC* mg);
-#define PERL_ARGS_ASSERT_MAGIC_SETMGLOB        \
-       assert(sv); assert(mg)
-PERL_CALLCONV int      Perl_magic_setnkeys(pTHX_ SV* sv, MAGIC* mg);
-#define PERL_ARGS_ASSERT_MAGIC_SETNKEYS        \
-       assert(sv); assert(mg)
-PERL_CALLCONV int      Perl_magic_setnonelem(pTHX_ SV* sv, MAGIC* mg);
-#define PERL_ARGS_ASSERT_MAGIC_SETNONELEM      \
-       assert(sv); assert(mg)
-PERL_CALLCONV int      Perl_magic_setpack(pTHX_ SV* sv, MAGIC* mg);
-#define PERL_ARGS_ASSERT_MAGIC_SETPACK \
-       assert(sv); assert(mg)
-PERL_CALLCONV int      Perl_magic_setpos(pTHX_ SV* sv, MAGIC* mg);
-#define PERL_ARGS_ASSERT_MAGIC_SETPOS  \
-       assert(sv); assert(mg)
-PERL_CALLCONV int      Perl_magic_setregexp(pTHX_ SV* sv, MAGIC* mg);
-#define PERL_ARGS_ASSERT_MAGIC_SETREGEXP       \
-       assert(sv); assert(mg)
-PERL_CALLCONV int      Perl_magic_setsig(pTHX_ SV* sv, MAGIC* mg);
-#define PERL_ARGS_ASSERT_MAGIC_SETSIG  \
-       assert(mg)
-PERL_CALLCONV int      Perl_magic_setsigall(pTHX_ SV* sv, MAGIC* mg);
-#define PERL_ARGS_ASSERT_MAGIC_SETSIGALL       \
-       assert(sv); assert(mg)
-PERL_CALLCONV int      Perl_magic_setsubstr(pTHX_ SV* sv, MAGIC* mg);
-#define PERL_ARGS_ASSERT_MAGIC_SETSUBSTR       \
-       assert(sv); assert(mg)
-PERL_CALLCONV int      Perl_magic_settaint(pTHX_ SV* sv, MAGIC* mg);
-#define PERL_ARGS_ASSERT_MAGIC_SETTAINT        \
-       assert(sv); assert(mg)
-PERL_CALLCONV int      Perl_magic_setutf8(pTHX_ SV* sv, MAGIC* mg);
-#define PERL_ARGS_ASSERT_MAGIC_SETUTF8 \
-       assert(sv); assert(mg)
-PERL_CALLCONV int      Perl_magic_setuvar(pTHX_ SV* sv, MAGIC* mg);
-#define PERL_ARGS_ASSERT_MAGIC_SETUVAR \
-       assert(sv); assert(mg)
-PERL_CALLCONV int      Perl_magic_setvec(pTHX_ SV* sv, MAGIC* mg);
-#define PERL_ARGS_ASSERT_MAGIC_SETVEC  \
-       assert(sv); assert(mg)
-PERL_CALLCONV U32      Perl_magic_sizepack(pTHX_ SV* sv, MAGIC* mg);
-#define PERL_ARGS_ASSERT_MAGIC_SIZEPACK        \
-       assert(sv); assert(mg)
-PERL_CALLCONV int      Perl_magic_wipepack(pTHX_ SV* sv, MAGIC* mg);
-#define PERL_ARGS_ASSERT_MAGIC_WIPEPACK        \
-       assert(sv); assert(mg)
-PERL_CALLCONV Malloc_t Perl_malloc(MEM_SIZE nbytes)
-                       __attribute__malloc__
-                       __attribute__warn_unused_result__;
+
+PERL_CALLCONV int
+Perl_magic_existspack(pTHX_ SV *sv, const MAGIC *mg)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_MAGIC_EXISTSPACK       \
+        assert(sv); assert(mg)
+
+PERL_CALLCONV int
+Perl_magic_freearylen_p(pTHX_ SV *sv, MAGIC *mg)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_MAGIC_FREEARYLEN_P     \
+        assert(sv); assert(mg)
+
+PERL_CALLCONV int
+Perl_magic_freedestruct(pTHX_ SV *sv, MAGIC *mg)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_MAGIC_FREEDESTRUCT     \
+        assert(sv); assert(mg)
+
+PERL_CALLCONV int
+Perl_magic_freemglob(pTHX_ SV *sv, MAGIC *mg)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_MAGIC_FREEMGLOB        \
+        assert(sv); assert(mg)
+
+PERL_CALLCONV int
+Perl_magic_freeovrld(pTHX_ SV *sv, MAGIC *mg)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_MAGIC_FREEOVRLD        \
+        assert(sv); assert(mg)
+
+PERL_CALLCONV int
+Perl_magic_freeutf8(pTHX_ SV *sv, MAGIC *mg)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_MAGIC_FREEUTF8         \
+        assert(sv); assert(mg)
+
+PERL_CALLCONV int
+Perl_magic_get(pTHX_ SV *sv, MAGIC *mg)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_MAGIC_GET              \
+        assert(sv); assert(mg)
+
+PERL_CALLCONV int
+Perl_magic_getarylen(pTHX_ SV *sv, const MAGIC *mg)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_MAGIC_GETARYLEN        \
+        assert(sv); assert(mg)
+
+PERL_CALLCONV int
+Perl_magic_getdebugvar(pTHX_ SV *sv, MAGIC *mg)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_MAGIC_GETDEBUGVAR      \
+        assert(sv); assert(mg)
+
+PERL_CALLCONV int
+Perl_magic_getdefelem(pTHX_ SV *sv, MAGIC *mg)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_MAGIC_GETDEFELEM       \
+        assert(sv); assert(mg)
+
+PERL_CALLCONV int
+Perl_magic_getnkeys(pTHX_ SV *sv, MAGIC *mg)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_MAGIC_GETNKEYS         \
+        assert(sv); assert(mg)
+
+PERL_CALLCONV int
+Perl_magic_getpack(pTHX_ SV *sv, MAGIC *mg)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_MAGIC_GETPACK          \
+        assert(sv); assert(mg)
+
+PERL_CALLCONV int
+Perl_magic_getpos(pTHX_ SV *sv, MAGIC *mg)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_MAGIC_GETPOS           \
+        assert(sv); assert(mg)
+
+PERL_CALLCONV int
+Perl_magic_getsig(pTHX_ SV *sv, MAGIC *mg)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_MAGIC_GETSIG           \
+        assert(sv); assert(mg)
+
+PERL_CALLCONV int
+Perl_magic_getsubstr(pTHX_ SV *sv, MAGIC *mg)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_MAGIC_GETSUBSTR        \
+        assert(sv); assert(mg)
+
+PERL_CALLCONV int
+Perl_magic_gettaint(pTHX_ SV *sv, MAGIC *mg)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_MAGIC_GETTAINT         \
+        assert(sv); assert(mg)
+
+PERL_CALLCONV int
+Perl_magic_getuvar(pTHX_ SV *sv, MAGIC *mg)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_MAGIC_GETUVAR          \
+        assert(sv); assert(mg)
+
+PERL_CALLCONV int
+Perl_magic_getvec(pTHX_ SV *sv, MAGIC *mg)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_MAGIC_GETVEC           \
+        assert(sv); assert(mg)
+
+PERL_CALLCONV int
+Perl_magic_killbackrefs(pTHX_ SV *sv, MAGIC *mg)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_MAGIC_KILLBACKREFS     \
+        assert(sv); assert(mg)
+
+PERL_CALLCONV SV *
+Perl_magic_methcall(pTHX_ SV *sv, const MAGIC *mg, SV *meth, U32 flags, U32 argc, ...)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_MAGIC_METHCALL         \
+        assert(sv); assert(mg); assert(meth)
+
+PERL_CALLCONV int
+Perl_magic_nextpack(pTHX_ SV *sv, MAGIC *mg, SV *key)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_MAGIC_NEXTPACK         \
+        assert(sv); assert(mg); assert(key)
+
+PERL_CALLCONV U32
+Perl_magic_regdata_cnt(pTHX_ SV *sv, MAGIC *mg)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_MAGIC_REGDATA_CNT      \
+        assert(sv); assert(mg)
+
+PERL_CALLCONV int
+Perl_magic_regdatum_get(pTHX_ SV *sv, MAGIC *mg)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_MAGIC_REGDATUM_GET     \
+        assert(sv); assert(mg)
+
+PERL_CALLCONV SV *
+Perl_magic_scalarpack(pTHX_ HV *hv, MAGIC *mg)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_MAGIC_SCALARPACK       \
+        assert(hv); assert(mg)
+
+PERL_CALLCONV int
+Perl_magic_set(pTHX_ SV *sv, MAGIC *mg)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_MAGIC_SET              \
+        assert(sv); assert(mg)
+
+PERL_CALLCONV int
+Perl_magic_set_all_env(pTHX_ SV *sv, MAGIC *mg)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_MAGIC_SET_ALL_ENV      \
+        assert(sv); assert(mg)
+
+PERL_CALLCONV int
+Perl_magic_setarylen(pTHX_ SV *sv, MAGIC *mg)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_MAGIC_SETARYLEN        \
+        assert(sv); assert(mg)
+
+PERL_CALLCONV int
+Perl_magic_setdbline(pTHX_ SV *sv, MAGIC *mg)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_MAGIC_SETDBLINE        \
+        assert(sv); assert(mg)
+
+PERL_CALLCONV int
+Perl_magic_setdebugvar(pTHX_ SV *sv, MAGIC *mg)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_MAGIC_SETDEBUGVAR      \
+        assert(sv); assert(mg)
+
+PERL_CALLCONV int
+Perl_magic_setdefelem(pTHX_ SV *sv, MAGIC *mg)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_MAGIC_SETDEFELEM       \
+        assert(sv); assert(mg)
+
+PERL_CALLCONV int
+Perl_magic_setenv(pTHX_ SV *sv, MAGIC *mg)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_MAGIC_SETENV           \
+        assert(sv); assert(mg)
+
+PERL_CALLCONV int
+Perl_magic_sethint(pTHX_ SV *sv, MAGIC *mg)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_MAGIC_SETHINT          \
+        assert(sv); assert(mg)
+
+PERL_CALLCONV int
+Perl_magic_sethook(pTHX_ SV *sv, MAGIC *mg)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_MAGIC_SETHOOK          \
+        assert(mg)
+
+PERL_CALLCONV int
+Perl_magic_sethookall(pTHX_ SV *sv, MAGIC *mg)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_MAGIC_SETHOOKALL       \
+        assert(sv); assert(mg)
+
+PERL_CALLCONV int
+Perl_magic_setisa(pTHX_ SV *sv, MAGIC *mg)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_MAGIC_SETISA           \
+        assert(sv); assert(mg)
+
+PERL_CALLCONV int
+Perl_magic_setlvref(pTHX_ SV *sv, MAGIC *mg)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_MAGIC_SETLVREF         \
+        assert(sv); assert(mg)
+
+PERL_CALLCONV int
+Perl_magic_setmglob(pTHX_ SV *sv, MAGIC *mg)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_MAGIC_SETMGLOB         \
+        assert(sv); assert(mg)
+
+PERL_CALLCONV int
+Perl_magic_setnkeys(pTHX_ SV *sv, MAGIC *mg)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_MAGIC_SETNKEYS         \
+        assert(sv); assert(mg)
+
+PERL_CALLCONV int
+Perl_magic_setnonelem(pTHX_ SV *sv, MAGIC *mg)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_MAGIC_SETNONELEM       \
+        assert(sv); assert(mg)
+
+PERL_CALLCONV int
+Perl_magic_setpack(pTHX_ SV *sv, MAGIC *mg)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_MAGIC_SETPACK          \
+        assert(sv); assert(mg)
+
+PERL_CALLCONV int
+Perl_magic_setpos(pTHX_ SV *sv, MAGIC *mg)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_MAGIC_SETPOS           \
+        assert(sv); assert(mg)
+
+PERL_CALLCONV int
+Perl_magic_setregexp(pTHX_ SV *sv, MAGIC *mg)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_MAGIC_SETREGEXP        \
+        assert(sv); assert(mg)
+
+PERL_CALLCONV int
+Perl_magic_setsig(pTHX_ SV *sv, MAGIC *mg)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_MAGIC_SETSIG           \
+        assert(mg)
+
+PERL_CALLCONV int
+Perl_magic_setsigall(pTHX_ SV *sv, MAGIC *mg)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_MAGIC_SETSIGALL        \
+        assert(sv); assert(mg)
+
+PERL_CALLCONV int
+Perl_magic_setsubstr(pTHX_ SV *sv, MAGIC *mg)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_MAGIC_SETSUBSTR        \
+        assert(sv); assert(mg)
+
+PERL_CALLCONV int
+Perl_magic_settaint(pTHX_ SV *sv, MAGIC *mg)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_MAGIC_SETTAINT         \
+        assert(sv); assert(mg)
+
+PERL_CALLCONV int
+Perl_magic_setutf8(pTHX_ SV *sv, MAGIC *mg)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_MAGIC_SETUTF8          \
+        assert(sv); assert(mg)
+
+PERL_CALLCONV int
+Perl_magic_setuvar(pTHX_ SV *sv, MAGIC *mg)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_MAGIC_SETUVAR          \
+        assert(sv); assert(mg)
+
+PERL_CALLCONV int
+Perl_magic_setvec(pTHX_ SV *sv, MAGIC *mg)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_MAGIC_SETVEC           \
+        assert(sv); assert(mg)
+
+PERL_CALLCONV U32
+Perl_magic_sizepack(pTHX_ SV *sv, MAGIC *mg)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_MAGIC_SIZEPACK         \
+        assert(sv); assert(mg)
+
+PERL_CALLCONV int
+Perl_magic_wipepack(pTHX_ SV *sv, MAGIC *mg)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_MAGIC_WIPEPACK         \
+        assert(sv); assert(mg)
+
+PERL_CALLCONV Malloc_t
+Perl_malloc(MEM_SIZE nbytes)
+        __attribute__malloc__
+        __attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_MALLOC
 
-PERL_CALLCONV I32 *    Perl_markstack_grow(pTHX);
+PERL_CALLCONV I32 *
+Perl_markstack_grow(pTHX);
 #define PERL_ARGS_ASSERT_MARKSTACK_GROW
-PERL_CALLCONV SV*      Perl_mess(pTHX_ const char* pat, ...)
-                       __attribute__format__(__printf__,pTHX_1,pTHX_2);
-#define PERL_ARGS_ASSERT_MESS  \
-       assert(pat)
-
-PERL_CALLCONV SV*      Perl_mess_sv(pTHX_ SV* basemsg, bool consume);
-#define PERL_ARGS_ASSERT_MESS_SV       \
-       assert(basemsg)
-PERL_CALLCONV Free_t   Perl_mfree(Malloc_t where);
+
+PERL_CALLCONV int
+Perl_mbtowc_(pTHX_ const wchar_t *pwc, const char *s, const Size_t len);
+#define PERL_ARGS_ASSERT_MBTOWC_
+
+PERL_CALLCONV SV *
+Perl_mess(pTHX_ const char *pat, ...)
+        __attribute__format__(__printf__,pTHX_1,pTHX_2);
+#define PERL_ARGS_ASSERT_MESS                   \
+        assert(pat)
+
+PERL_CALLCONV SV *
+Perl_mess_sv(pTHX_ SV *basemsg, bool consume);
+#define PERL_ARGS_ASSERT_MESS_SV                \
+        assert(basemsg)
+
+PERL_CALLCONV Free_t
+Perl_mfree(Malloc_t where);
 #define PERL_ARGS_ASSERT_MFREE
-PERL_CALLCONV int      Perl_mg_clear(pTHX_ SV* sv);
-#define PERL_ARGS_ASSERT_MG_CLEAR      \
-       assert(sv)
-PERL_CALLCONV int      Perl_mg_copy(pTHX_ SV *sv, SV *nsv, const char *key, I32 klen);
-#define PERL_ARGS_ASSERT_MG_COPY       \
-       assert(sv); assert(nsv)
-PERL_CALLCONV MAGIC*   Perl_mg_find(const SV* sv, int type)
-                       __attribute__warn_unused_result__;
+
+PERL_CALLCONV int
+Perl_mg_clear(pTHX_ SV *sv);
+#define PERL_ARGS_ASSERT_MG_CLEAR               \
+        assert(sv)
+
+PERL_CALLCONV int
+Perl_mg_copy(pTHX_ SV *sv, SV *nsv, const char *key, I32 klen);
+#define PERL_ARGS_ASSERT_MG_COPY                \
+        assert(sv); assert(nsv)
+
+PERL_CALLCONV MAGIC *
+Perl_mg_find(const SV *sv, int type)
+        __attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_MG_FIND
 
-PERL_CALLCONV MAGIC*   Perl_mg_find_mglob(pTHX_ SV* sv)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_MG_FIND_MGLOB \
-       assert(sv)
+PERL_CALLCONV MAGIC *
+Perl_mg_find_mglob(pTHX_ SV *sv)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_MG_FIND_MGLOB          \
+        assert(sv)
 
-PERL_CALLCONV MAGIC*   Perl_mg_findext(const SV* sv, int type, const MGVTBL *vtbl)
-                       __attribute__warn_unused_result__;
+PERL_CALLCONV MAGIC *
+Perl_mg_findext(const SV *sv, int type, const MGVTBL *vtbl)
+        __attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_MG_FINDEXT
 
-PERL_CALLCONV int      Perl_mg_free(pTHX_ SV* sv);
-#define PERL_ARGS_ASSERT_MG_FREE       \
-       assert(sv)
-PERL_CALLCONV void     Perl_mg_free_type(pTHX_ SV* sv, int how);
-#define PERL_ARGS_ASSERT_MG_FREE_TYPE  \
-       assert(sv)
-PERL_CALLCONV void     Perl_mg_freeext(pTHX_ SV* sv, int how, const MGVTBL *vtbl);
-#define PERL_ARGS_ASSERT_MG_FREEEXT    \
-       assert(sv)
-PERL_CALLCONV int      Perl_mg_get(pTHX_ SV* sv);
-#define PERL_ARGS_ASSERT_MG_GET        \
-       assert(sv)
-PERL_CALLCONV U32      Perl_mg_length(pTHX_ SV* sv)
-                       __attribute__deprecated__;
-#define PERL_ARGS_ASSERT_MG_LENGTH     \
-       assert(sv)
-
-PERL_CALLCONV void     Perl_mg_localize(pTHX_ SV* sv, SV* nsv, bool setmagic);
-#define PERL_ARGS_ASSERT_MG_LOCALIZE   \
-       assert(sv); assert(nsv)
-PERL_CALLCONV void     Perl_mg_magical(SV* sv);
-#define PERL_ARGS_ASSERT_MG_MAGICAL    \
-       assert(sv)
-PERL_CALLCONV int      Perl_mg_set(pTHX_ SV* sv);
-#define PERL_ARGS_ASSERT_MG_SET        \
-       assert(sv)
-PERL_CALLCONV I32      Perl_mg_size(pTHX_ SV* sv);
-#define PERL_ARGS_ASSERT_MG_SIZE       \
-       assert(sv)
-PERL_CALLCONV void     Perl_mini_mktime(struct tm *ptm);
-#define PERL_ARGS_ASSERT_MINI_MKTIME   \
-       assert(ptm)
-PERL_CALLCONV int      Perl_mode_from_discipline(pTHX_ const char* s, STRLEN len);
+PERL_CALLCONV int
+Perl_mg_free(pTHX_ SV *sv);
+#define PERL_ARGS_ASSERT_MG_FREE                \
+        assert(sv)
+
+PERL_CALLCONV void
+Perl_mg_free_type(pTHX_ SV *sv, int how);
+#define PERL_ARGS_ASSERT_MG_FREE_TYPE           \
+        assert(sv)
+
+PERL_CALLCONV void
+Perl_mg_freeext(pTHX_ SV *sv, int how, const MGVTBL *vtbl);
+#define PERL_ARGS_ASSERT_MG_FREEEXT             \
+        assert(sv)
+
+PERL_CALLCONV int
+Perl_mg_get(pTHX_ SV *sv);
+#define PERL_ARGS_ASSERT_MG_GET                 \
+        assert(sv)
+
+PERL_CALLCONV void
+Perl_mg_localize(pTHX_ SV *sv, SV *nsv, bool setmagic)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_MG_LOCALIZE            \
+        assert(sv); assert(nsv)
+
+PERL_CALLCONV void
+Perl_mg_magical(SV *sv);
+#define PERL_ARGS_ASSERT_MG_MAGICAL             \
+        assert(sv)
+
+PERL_CALLCONV int
+Perl_mg_set(pTHX_ SV *sv);
+#define PERL_ARGS_ASSERT_MG_SET                 \
+        assert(sv)
+
+PERL_CALLCONV I32
+Perl_mg_size(pTHX_ SV *sv);
+#define PERL_ARGS_ASSERT_MG_SIZE                \
+        assert(sv)
+
+PERL_CALLCONV void
+Perl_mini_mktime(struct tm *ptm);
+#define PERL_ARGS_ASSERT_MINI_MKTIME            \
+        assert(ptm)
+
+PERL_CALLCONV int
+Perl_mode_from_discipline(pTHX_ const char *s, STRLEN len)
+        __attribute__visibility__("hidden");
 #define PERL_ARGS_ASSERT_MODE_FROM_DISCIPLINE
-PERL_CALLCONV void *   Perl_more_bodies(pTHX_ const svtype sv_type, const size_t body_size, const size_t arena_size);
-#define PERL_ARGS_ASSERT_MORE_BODIES
-PERL_CALLCONV const char*      Perl_moreswitches(pTHX_ const char* s);
-#define PERL_ARGS_ASSERT_MORESWITCHES  \
-       assert(s)
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE char *      Perl_mortal_getenv(const char * str)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_MORTAL_GETENV \
-       assert(str)
-#endif
 
-PERL_CALLCONV const struct mro_alg *   Perl_mro_get_from_name(pTHX_ SV *name);
-#define PERL_ARGS_ASSERT_MRO_GET_FROM_NAME     \
-       assert(name)
-PERL_CALLCONV AV*      Perl_mro_get_linear_isa(pTHX_ HV* stash);
-#define PERL_ARGS_ASSERT_MRO_GET_LINEAR_ISA    \
-       assert(stash)
-PERL_CALLCONV SV*      Perl_mro_get_private_data(pTHX_ struct mro_meta *const smeta, const struct mro_alg *const which);
-#define PERL_ARGS_ASSERT_MRO_GET_PRIVATE_DATA  \
-       assert(smeta); assert(which)
-PERL_CALLCONV void     Perl_mro_isa_changed_in(pTHX_ HV* stash);
-#define PERL_ARGS_ASSERT_MRO_ISA_CHANGED_IN    \
-       assert(stash)
-PERL_CALLCONV struct mro_meta* Perl_mro_meta_init(pTHX_ HV* stash);
-#define PERL_ARGS_ASSERT_MRO_META_INIT \
-       assert(stash)
-PERL_CALLCONV void     Perl_mro_method_changed_in(pTHX_ HV* stash);
-#define PERL_ARGS_ASSERT_MRO_METHOD_CHANGED_IN \
-       assert(stash)
-PERL_CALLCONV void     Perl_mro_package_moved(pTHX_ HV * const stash, HV * const oldstash, const GV * const gv, U32 flags);
-#define PERL_ARGS_ASSERT_MRO_PACKAGE_MOVED     \
-       assert(gv)
-PERL_CALLCONV void     Perl_mro_register(pTHX_ const struct mro_alg *mro);
-#define PERL_ARGS_ASSERT_MRO_REGISTER  \
-       assert(mro)
-PERL_CALLCONV void     Perl_mro_set_mro(pTHX_ struct mro_meta *const meta, SV *const name);
-#define PERL_ARGS_ASSERT_MRO_SET_MRO   \
-       assert(meta); assert(name)
-PERL_CALLCONV SV*      Perl_mro_set_private_data(pTHX_ struct mro_meta *const smeta, const struct mro_alg *const which, SV *const data);
-#define PERL_ARGS_ASSERT_MRO_SET_PRIVATE_DATA  \
-       assert(smeta); assert(which); assert(data)
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE unsigned    Perl_msbit_pos32(U32 word)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_MSBIT_POS32
-#endif
+PERL_CALLCONV void *
+Perl_more_bodies(pTHX_ const svtype sv_type, const size_t body_size, const size_t arena_size);
+#define PERL_ARGS_ASSERT_MORE_BODIES
 
-PERL_CALLCONV SV*      Perl_multiconcat_stringify(pTHX_ const OP* o);
-#define PERL_ARGS_ASSERT_MULTICONCAT_STRINGIFY \
-       assert(o)
-PERL_CALLCONV SV*      Perl_multideref_stringify(pTHX_ const OP* o, CV *cv);
-#define PERL_ARGS_ASSERT_MULTIDEREF_STRINGIFY  \
-       assert(o)
-PERL_CALLCONV NV       Perl_my_atof(pTHX_ const char *s);
-#define PERL_ARGS_ASSERT_MY_ATOF       \
-       assert(s)
-PERL_CALLCONV char*    Perl_my_atof2(pTHX_ const char *orig, NV* value);
-#define PERL_ARGS_ASSERT_MY_ATOF2      \
-       assert(orig); assert(value)
-PERL_CALLCONV char*    Perl_my_atof3(pTHX_ const char *orig, NV* value, const STRLEN len);
-#define PERL_ARGS_ASSERT_MY_ATOF3      \
-       assert(orig); assert(value)
-PERL_CALLCONV OP *     Perl_my_attrs(pTHX_ OP *o, OP *attrs);
-#define PERL_ARGS_ASSERT_MY_ATTRS      \
-       assert(o)
-PERL_CALLCONV void     Perl_my_clearenv(pTHX);
+PERL_CALLCONV const char *
+Perl_moreswitches(pTHX_ const char *s);
+#define PERL_ARGS_ASSERT_MORESWITCHES           \
+        assert(s)
+
+PERL_CALLCONV void
+Perl_mortal_destructor_sv(pTHX_ SV *coderef, SV *args);
+#define PERL_ARGS_ASSERT_MORTAL_DESTRUCTOR_SV   \
+        assert(coderef)
+
+PERL_CALLCONV void
+Perl_mortal_svfunc_x(pTHX_ SVFUNC_t f, SV *p);
+#define PERL_ARGS_ASSERT_MORTAL_SVFUNC_X
+
+PERL_CALLCONV const struct mro_alg *
+Perl_mro_get_from_name(pTHX_ SV *name);
+#define PERL_ARGS_ASSERT_MRO_GET_FROM_NAME      \
+        assert(name)
+
+PERL_CALLCONV AV *
+Perl_mro_get_linear_isa(pTHX_ HV *stash);
+#define PERL_ARGS_ASSERT_MRO_GET_LINEAR_ISA     \
+        assert(stash)
+
+PERL_CALLCONV SV *
+Perl_mro_get_private_data(pTHX_ struct mro_meta * const smeta, const struct mro_alg * const which);
+#define PERL_ARGS_ASSERT_MRO_GET_PRIVATE_DATA   \
+        assert(smeta); assert(which)
+
+PERL_CALLCONV void
+Perl_mro_isa_changed_in(pTHX_ HV *stash)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_MRO_ISA_CHANGED_IN     \
+        assert(stash)
+
+PERL_CALLCONV struct mro_meta *
+Perl_mro_meta_init(pTHX_ HV *stash);
+#define PERL_ARGS_ASSERT_MRO_META_INIT          \
+        assert(stash)
+
+PERL_CALLCONV void
+Perl_mro_method_changed_in(pTHX_ HV *stash);
+#define PERL_ARGS_ASSERT_MRO_METHOD_CHANGED_IN  \
+        assert(stash)
+
+PERL_CALLCONV void
+Perl_mro_package_moved(pTHX_ HV * const stash, HV * const oldstash, const GV * const gv, U32 flags);
+#define PERL_ARGS_ASSERT_MRO_PACKAGE_MOVED      \
+        assert(gv)
+
+PERL_CALLCONV void
+Perl_mro_register(pTHX_ const struct mro_alg *mro);
+#define PERL_ARGS_ASSERT_MRO_REGISTER           \
+        assert(mro)
+
+PERL_CALLCONV void
+Perl_mro_set_mro(pTHX_ struct mro_meta * const meta, SV * const name);
+#define PERL_ARGS_ASSERT_MRO_SET_MRO            \
+        assert(meta); assert(name)
+
+PERL_CALLCONV SV *
+Perl_mro_set_private_data(pTHX_ struct mro_meta * const smeta, const struct mro_alg * const which, SV * const data);
+#define PERL_ARGS_ASSERT_MRO_SET_PRIVATE_DATA   \
+        assert(smeta); assert(which); assert(data)
+
+PERL_CALLCONV SV *
+Perl_multiconcat_stringify(pTHX_ const OP *o);
+#define PERL_ARGS_ASSERT_MULTICONCAT_STRINGIFY  \
+        assert(o)
+
+PERL_CALLCONV SV *
+Perl_multideref_stringify(pTHX_ const OP *o, CV *cv);
+#define PERL_ARGS_ASSERT_MULTIDEREF_STRINGIFY   \
+        assert(o)
+
+PERL_CALLCONV NV
+Perl_my_atof(pTHX_ const char *s);
+#define PERL_ARGS_ASSERT_MY_ATOF                \
+        assert(s)
+
+PERL_CALLCONV char *
+Perl_my_atof2(pTHX_ const char *orig, NV *value);
+#define PERL_ARGS_ASSERT_MY_ATOF2               \
+        assert(orig); assert(value)
+
+PERL_CALLCONV char *
+Perl_my_atof3(pTHX_ const char *orig, NV *value, const STRLEN len);
+#define PERL_ARGS_ASSERT_MY_ATOF3               \
+        assert(orig); assert(value)
+
+PERL_CALLCONV OP *
+Perl_my_attrs(pTHX_ OP *o, OP *attrs)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_MY_ATTRS               \
+        assert(o)
+
+PERL_CALLCONV void
+Perl_my_clearenv(pTHX);
 #define PERL_ARGS_ASSERT_MY_CLEARENV
-PERL_CALLCONV int      Perl_my_dirfd(DIR* dir);
+
+PERL_CALLCONV int
+Perl_my_dirfd(DIR *dir);
 #define PERL_ARGS_ASSERT_MY_DIRFD
-PERL_CALLCONV_NO_RET void      Perl_my_exit(pTHX_ U32 status)
-                       __attribute__noreturn__;
+
+PERL_CALLCONV_NO_RET void
+Perl_my_exit(pTHX_ U32 status)
+        __attribute__noreturn__;
 #define PERL_ARGS_ASSERT_MY_EXIT
 
-PERL_CALLCONV_NO_RET void      Perl_my_failure_exit(pTHX)
-                       __attribute__noreturn__;
+PERL_CALLCONV_NO_RET void
+Perl_my_failure_exit(pTHX)
+        __attribute__noreturn__;
 #define PERL_ARGS_ASSERT_MY_FAILURE_EXIT
 
-PERL_CALLCONV I32      Perl_my_fflush_all(pTHX);
+PERL_CALLCONV I32
+Perl_my_fflush_all(pTHX);
 #define PERL_ARGS_ASSERT_MY_FFLUSH_ALL
-PERL_CALLCONV Pid_t    Perl_my_fork(void);
+
+PERL_CALLCONV Pid_t
+Perl_my_fork(void);
 #define PERL_ARGS_ASSERT_MY_FORK
-/* PERL_CALLCONV I32   my_lstat(pTHX); */
-#define PERL_ARGS_ASSERT_MY_LSTAT
-PERL_CALLCONV I32      Perl_my_lstat_flags(pTHX_ const U32 flags);
+
+/* PERL_CALLCONV I32
+my_lstat(pTHX); */
+
+PERL_CALLCONV I32
+Perl_my_lstat_flags(pTHX_ const U32 flags);
 #define PERL_ARGS_ASSERT_MY_LSTAT_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    \
-       assert(templte)
-
-PERL_CALLCONV PerlIO*  Perl_my_popen_list(pTHX_ const char* mode, int n, SV ** args);
-#define PERL_ARGS_ASSERT_MY_POPEN_LIST \
-       assert(mode); assert(args)
-PERL_CALLCONV void     Perl_my_setenv(pTHX_ const char* nam, const char* val);
+
+PERL_CALLCONV int
+Perl_my_mkostemp_cloexec(char *templte, int flags)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_MY_MKOSTEMP_CLOEXEC    \
+        assert(templte)
+
+PERL_CALLCONV int
+Perl_my_mkstemp_cloexec(char *templte)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_MY_MKSTEMP_CLOEXEC     \
+        assert(templte)
+
+PERL_CALLCONV PerlIO *
+Perl_my_popen_list(pTHX_ const char *mode, int n, SV **args);
+#define PERL_ARGS_ASSERT_MY_POPEN_LIST          \
+        assert(mode); assert(args)
+
+PERL_CALLCONV void
+Perl_my_setenv(pTHX_ const char *nam, const char *val);
 #define PERL_ARGS_ASSERT_MY_SETENV
-PERL_CALLCONV int      Perl_my_snprintf(char *buffer, const Size_t len, const char *format, ...)
-                       __attribute__format__(__printf__,3,4);
-#define PERL_ARGS_ASSERT_MY_SNPRINTF   \
-       assert(buffer); assert(format)
 
-PERL_CALLCONV int      Perl_my_socketpair(int family, int type, int protocol, int fd[2]);
+PERL_CALLCONV int
+Perl_my_snprintf(char *buffer, const Size_t len, const char *format, ...)
+        __attribute__format__(__printf__,3,4);
+#define PERL_ARGS_ASSERT_MY_SNPRINTF            \
+        assert(buffer); assert(format)
+
+PERL_CALLCONV int
+Perl_my_socketpair(int family, int type, int protocol, int fd[2]);
 #define PERL_ARGS_ASSERT_MY_SOCKETPAIR
-/* PERL_CALLCONV I32   my_stat(pTHX); */
-#define PERL_ARGS_ASSERT_MY_STAT
-PERL_CALLCONV I32      Perl_my_stat_flags(pTHX_ const U32 flags);
+
+/* PERL_CALLCONV I32
+my_stat(pTHX); */
+
+PERL_CALLCONV I32
+Perl_my_stat_flags(pTHX_ const U32 flags);
 #define PERL_ARGS_ASSERT_MY_STAT_FLAGS
-PERL_CALLCONV char*    Perl_my_strerror(pTHX_ const int errnum);
-#define PERL_ARGS_ASSERT_MY_STRERROR
-PERL_CALLCONV char *   Perl_my_strftime(pTHX_ const char *fmt, int sec, int min, int hour, int mday, int mon, int year, int wday, int yday, int isdst)
-                       __attribute__format__(__strftime__,pTHX_1,0);
-#define PERL_ARGS_ASSERT_MY_STRFTIME   \
-       assert(fmt)
-
-PERL_CALLCONV NV       Perl_my_strtod(const char * const s, char ** e)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_MY_STRTOD     \
-       assert(s)
-
-PERL_CALLCONV void     Perl_my_unexec(pTHX);
+
+PERL_CALLCONV const char *
+Perl_my_strerror(pTHX_ const int errnum, utf8ness_t *utf8ness)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_MY_STRERROR            \
+        assert(utf8ness)
+
+PERL_CALLCONV char *
+Perl_my_strftime(pTHX_ const char *fmt, int sec, int min, int hour, int mday, int mon, int year, int wday, int yday, int isdst)
+        __attribute__format__(__strftime__,pTHX_1,0);
+#define PERL_ARGS_ASSERT_MY_STRFTIME            \
+        assert(fmt)
+
+PERL_CALLCONV char *
+Perl_my_strftime8_temp(pTHX_ const char *fmt, int sec, int min, int hour, int mday, int mon, int year, int wday, int yday, int isdst, utf8ness_t *utf8ness)
+        __attribute__format__(__strftime__,pTHX_1,0);
+#define PERL_ARGS_ASSERT_MY_STRFTIME8_TEMP      \
+        assert(fmt)
+
+PERL_CALLCONV NV
+Perl_my_strtod(const char * const s, char **e)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_MY_STRTOD              \
+        assert(s)
+
+PERL_CALLCONV void
+Perl_my_unexec(pTHX)
+        __attribute__visibility__("hidden");
 #define PERL_ARGS_ASSERT_MY_UNEXEC
-PERL_CALLCONV int      Perl_my_vsnprintf(char *buffer, const Size_t len, const char *format, va_list ap);
-#define PERL_ARGS_ASSERT_MY_VSNPRINTF  \
-       assert(buffer); assert(format)
-PERL_CALLCONV OP*      Perl_newANONATTRSUB(pTHX_ I32 floor, OP *proto, OP *attrs, OP *block);
+
+PERL_CALLCONV int
+Perl_my_vsnprintf(char *buffer, const Size_t len, const char *format, va_list ap);
+#define PERL_ARGS_ASSERT_MY_VSNPRINTF           \
+        assert(buffer); assert(format)
+
+PERL_CALLCONV OP *
+Perl_newANONATTRSUB(pTHX_ I32 floor, OP *proto, OP *attrs, OP *block);
 #define PERL_ARGS_ASSERT_NEWANONATTRSUB
-PERL_CALLCONV OP*      Perl_newANONHASH(pTHX_ OP* o)
-                       __attribute__warn_unused_result__;
+
+PERL_CALLCONV OP *
+Perl_newANONHASH(pTHX_ OP *o)
+        __attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_NEWANONHASH
 
-PERL_CALLCONV OP*      Perl_newANONLIST(pTHX_ OP* o)
-                       __attribute__warn_unused_result__;
+PERL_CALLCONV OP *
+Perl_newANONLIST(pTHX_ OP *o)
+        __attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_NEWANONLIST
 
-PERL_CALLCONV OP*      Perl_newANONSUB(pTHX_ I32 floor, OP* proto, OP* block);
+PERL_CALLCONV OP *
+Perl_newANONSUB(pTHX_ I32 floor, OP *proto, OP *block);
 #define PERL_ARGS_ASSERT_NEWANONSUB
-PERL_CALLCONV OP*      Perl_newASSIGNOP(pTHX_ I32 flags, OP* left, I32 optype, OP* right)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_NEWASSIGNOP
 
-/* PERL_CALLCONV CV*   newATTRSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block); */
-#define PERL_ARGS_ASSERT_NEWATTRSUB
-PERL_CALLCONV CV*      Perl_newATTRSUB_x(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block, bool o_is_gv);
-#define PERL_ARGS_ASSERT_NEWATTRSUB_X
-#ifndef NO_MATHOMS
-PERL_CALLCONV AV*      Perl_newAV(pTHX)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_NEWAV
-#endif
+PERL_CALLCONV OP *
+Perl_newARGDEFELEMOP(pTHX_ I32 flags, OP *expr, I32 argindex)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_NEWARGDEFELEMOP        \
+        assert(expr)
 
-PERL_CALLCONV OP*      Perl_newAVREF(pTHX_ OP* o)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_NEWAVREF      \
-       assert(o)
+PERL_CALLCONV OP *
+Perl_newASSIGNOP(pTHX_ I32 flags, OP *left, I32 optype, OP *right)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_NEWASSIGNOP
 
-/* PERL_CALLCONV AV*   newAV_alloc_x(pTHX_ SSize_t size)
-                       __attribute__warn_unused_result__; */
-#define PERL_ARGS_ASSERT_NEWAV_ALLOC_X
+/* PERL_CALLCONV CV *
+newATTRSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block); */
 
-/* PERL_CALLCONV AV*   newAV_alloc_xz(pTHX_ SSize_t size)
-                       __attribute__warn_unused_result__; */
-#define PERL_ARGS_ASSERT_NEWAV_ALLOC_XZ
+PERL_CALLCONV CV *
+Perl_newATTRSUB_x(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block, bool o_is_gv);
+#define PERL_ARGS_ASSERT_NEWATTRSUB_X
 
-PERL_CALLCONV OP*      Perl_newBINOP(pTHX_ I32 type, I32 flags, OP* first, OP* last)
-                       __attribute__warn_unused_result__;
+PERL_CALLCONV OP *
+Perl_newAVREF(pTHX_ OP *o)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_NEWAVREF               \
+        assert(o)
+
+/* PERL_CALLCONV AV *
+newAV_alloc_x(pTHX_ SSize_t size)
+        __attribute__warn_unused_result__; */
+
+/* PERL_CALLCONV AV *
+newAV_alloc_xz(pTHX_ SSize_t size)
+        __attribute__warn_unused_result__; */
+
+PERL_CALLCONV AV *
+Perl_newAVav(pTHX_ AV *oav)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_NEWAVAV
+
+PERL_CALLCONV AV *
+Perl_newAVhv(pTHX_ HV *ohv)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_NEWAVHV
+
+PERL_CALLCONV OP *
+Perl_newBINOP(pTHX_ I32 type, I32 flags, OP *first, OP *last)
+        __attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_NEWBINOP
 
-PERL_CALLCONV OP*      Perl_newCONDOP(pTHX_ I32 flags, OP* first, OP* trueop, OP* falseop)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_NEWCONDOP     \
-       assert(first)
+PERL_CALLCONV OP *
+Perl_newCONDOP(pTHX_ I32 flags, OP *first, OP *trueop, OP *falseop)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_NEWCONDOP              \
+        assert(first)
 
-PERL_CALLCONV CV*      Perl_newCONSTSUB(pTHX_ HV* stash, const char* name, SV* sv);
+PERL_CALLCONV CV *
+Perl_newCONSTSUB(pTHX_ HV *stash, const char *name, SV *sv);
 #define PERL_ARGS_ASSERT_NEWCONSTSUB
-PERL_CALLCONV CV*      Perl_newCONSTSUB_flags(pTHX_ HV* stash, const char* name, STRLEN len, U32 flags, SV* sv);
+
+PERL_CALLCONV CV *
+Perl_newCONSTSUB_flags(pTHX_ HV *stash, const char *name, STRLEN len, U32 flags, SV *sv);
 #define PERL_ARGS_ASSERT_NEWCONSTSUB_FLAGS
-PERL_CALLCONV OP*      Perl_newCVREF(pTHX_ I32 flags, OP* o)
-                       __attribute__warn_unused_result__;
+
+PERL_CALLCONV OP *
+Perl_newCVREF(pTHX_ I32 flags, OP *o)
+        __attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_NEWCVREF
 
-PERL_CALLCONV OP*      Perl_newDEFEROP(pTHX_ I32 flags, OP *block)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_NEWDEFEROP    \
-       assert(block)
+PERL_CALLCONV OP *
+Perl_newDEFEROP(pTHX_ I32 flags, OP *block)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_NEWDEFEROP             \
+        assert(block)
 
-PERL_CALLCONV OP*      Perl_newDEFSVOP(pTHX)
-                       __attribute__warn_unused_result__;
+PERL_CALLCONV OP *
+Perl_newDEFSVOP(pTHX)
+        __attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_NEWDEFSVOP
 
-PERL_CALLCONV void     Perl_newFORM(pTHX_ I32 floor, OP* o, OP* block);
+PERL_CALLCONV void
+Perl_newFORM(pTHX_ I32 floor, OP *o, OP *block);
 #define PERL_ARGS_ASSERT_NEWFORM
-PERL_CALLCONV OP*      Perl_newFOROP(pTHX_ I32 flags, OP* sv, OP* expr, OP* block, OP* cont)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_NEWFOROP      \
-       assert(expr)
-
-PERL_CALLCONV OP*      Perl_newGIVENOP(pTHX_ OP* cond, OP* block, PADOFFSET defsv_off)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_NEWGIVENOP    \
-       assert(cond); assert(block)
-
-PERL_CALLCONV GP *     Perl_newGP(pTHX_ GV *const gv);
-#define PERL_ARGS_ASSERT_NEWGP \
-       assert(gv)
-PERL_CALLCONV OP*      Perl_newGVOP(pTHX_ I32 type, I32 flags, GV* gv)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_NEWGVOP       \
-       assert(gv)
-
-PERL_CALLCONV OP*      Perl_newGVREF(pTHX_ I32 type, OP* o)
-                       __attribute__warn_unused_result__;
+
+PERL_CALLCONV OP *
+Perl_newFOROP(pTHX_ I32 flags, OP *sv, OP *expr, OP *block, OP *cont)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_NEWFOROP               \
+        assert(expr)
+
+PERL_CALLCONV OP *
+Perl_newGIVENOP(pTHX_ OP *cond, OP *block, PADOFFSET defsv_off)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_NEWGIVENOP             \
+        assert(cond); assert(block)
+
+PERL_CALLCONV GP *
+Perl_newGP(pTHX_ GV * const gv);
+#define PERL_ARGS_ASSERT_NEWGP                  \
+        assert(gv)
+
+PERL_CALLCONV OP *
+Perl_newGVOP(pTHX_ I32 type, I32 flags, GV *gv)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_NEWGVOP                \
+        assert(gv)
+
+PERL_CALLCONV OP *
+Perl_newGVREF(pTHX_ I32 type, OP *o)
+        __attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_NEWGVREF
 
-/* PERL_CALLCONV GV*   newGVgen(pTHX_ const char* pack); */
-#define PERL_ARGS_ASSERT_NEWGVGEN
-PERL_CALLCONV GV*      Perl_newGVgen_flags(pTHX_ const char* pack, U32 flags)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_NEWGVGEN_FLAGS        \
-       assert(pack)
-
-#ifndef NO_MATHOMS
-PERL_CALLCONV HV*      Perl_newHV(pTHX)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_NEWHV
-#endif
+/* PERL_CALLCONV GV *
+newGVgen(pTHX_ const char *pack); */
 
-PERL_CALLCONV OP*      Perl_newHVREF(pTHX_ OP* o)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_NEWHVREF      \
-       assert(o)
+PERL_CALLCONV GV *
+Perl_newGVgen_flags(pTHX_ const char *pack, U32 flags)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_NEWGVGEN_FLAGS         \
+        assert(pack)
 
-PERL_CALLCONV HV*      Perl_newHVhv(pTHX_ HV *hv)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_NEWHVHV
+PERL_CALLCONV OP *
+Perl_newHVREF(pTHX_ OP *o)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_NEWHVREF               \
+        assert(o)
 
-#ifndef NO_MATHOMS
-PERL_CALLCONV IO*      Perl_newIO(pTHX)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_NEWIO
-#endif
+PERL_CALLCONV HV *
+Perl_newHVhv(pTHX_ HV *hv)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_NEWHVHV
 
-PERL_CALLCONV OP*      Perl_newLISTOP(pTHX_ I32 type, I32 flags, OP* first, OP* last)
-                       __attribute__warn_unused_result__;
+PERL_CALLCONV OP *
+Perl_newLISTOP(pTHX_ I32 type, I32 flags, OP *first, OP *last)
+        __attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_NEWLISTOP
 
-PERL_CALLCONV OP*      Perl_newLOGOP(pTHX_ I32 optype, I32 flags, OP *first, OP *other)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_NEWLOGOP      \
-       assert(first); assert(other)
-
-PERL_CALLCONV OP*      Perl_newLOOPEX(pTHX_ I32 type, OP* label)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_NEWLOOPEX     \
-       assert(label)
-
-PERL_CALLCONV OP*      Perl_newLOOPOP(pTHX_ I32 flags, I32 debuggable, OP* expr, OP* block)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_NEWLOOPOP
-
-PERL_CALLCONV OP*      Perl_newMETHOP(pTHX_ I32 type, I32 flags, OP* dynamic_meth)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_NEWMETHOP     \
-       assert(dynamic_meth)
-
-PERL_CALLCONV OP*      Perl_newMETHOP_named(pTHX_ I32 type, I32 flags, SV* const_meth)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_NEWMETHOP_NAMED       \
-       assert(const_meth)
-
-PERL_CALLCONV CV *     Perl_newMYSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block);
-#define PERL_ARGS_ASSERT_NEWMYSUB      \
-       assert(o)
-PERL_CALLCONV OP*      Perl_newNULLLIST(pTHX)
-                       __attribute__warn_unused_result__;
+PERL_CALLCONV OP *
+Perl_newLOGOP(pTHX_ I32 optype, I32 flags, OP *first, OP *other)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_NEWLOGOP               \
+        assert(first); assert(other)
+
+PERL_CALLCONV OP *
+Perl_newLOOPEX(pTHX_ I32 type, OP *label)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_NEWLOOPEX              \
+        assert(label)
+
+PERL_CALLCONV OP *
+Perl_newLOOPOP(pTHX_ I32 flags, I32 debuggable, OP *expr, OP *block)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_NEWLOOPOP              \
+        assert(expr)
+
+PERL_CALLCONV OP *
+Perl_newMETHOP(pTHX_ I32 type, I32 flags, OP *dynamic_meth)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_NEWMETHOP              \
+        assert(dynamic_meth)
+
+PERL_CALLCONV OP *
+Perl_newMETHOP_named(pTHX_ I32 type, I32 flags, SV * const_meth)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_NEWMETHOP_NAMED        \
+        assert(const_meth)
+
+PERL_CALLCONV CV *
+Perl_newMYSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block);
+#define PERL_ARGS_ASSERT_NEWMYSUB               \
+        assert(o)
+
+PERL_CALLCONV OP *
+Perl_newNULLLIST(pTHX)
+        __attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_NEWNULLLIST
 
-PERL_CALLCONV OP*      Perl_newOP(pTHX_ I32 optype, I32 flags)
-                       __attribute__warn_unused_result__;
+PERL_CALLCONV OP *
+Perl_newOP(pTHX_ I32 optype, I32 flags)
+        __attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_NEWOP
 
-PERL_CALLCONV PADNAMELIST *    Perl_newPADNAMELIST(size_t max)
-                       __attribute__warn_unused_result__;
+PERL_CALLCONV PADNAMELIST *
+Perl_newPADNAMELIST(size_t max)
+        __attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_NEWPADNAMELIST
 
-PERL_CALLCONV PADNAME *        Perl_newPADNAMEouter(PADNAME *outer)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_NEWPADNAMEOUTER       \
-       assert(outer)
-
-PERL_CALLCONV PADNAME *        Perl_newPADNAMEpvn(const char *s, STRLEN len)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_NEWPADNAMEPVN \
-       assert(s)
-
-PERL_CALLCONV OP*      Perl_newPMOP(pTHX_ I32 type, I32 flags)
-                       __attribute__warn_unused_result__;
+PERL_CALLCONV PADNAME *
+Perl_newPADNAMEouter(PADNAME *outer)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_NEWPADNAMEOUTER        \
+        assert(outer)
+
+PERL_CALLCONV PADNAME *
+Perl_newPADNAMEpvn(const char *s, STRLEN len)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_NEWPADNAMEPVN          \
+        assert(s)
+
+PERL_CALLCONV OP *
+Perl_newPMOP(pTHX_ I32 type, I32 flags)
+        __attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_NEWPMOP
 
-PERL_CALLCONV void     Perl_newPROG(pTHX_ OP* o);
-#define PERL_ARGS_ASSERT_NEWPROG       \
-       assert(o)
-PERL_CALLCONV OP*      Perl_newPVOP(pTHX_ I32 type, I32 flags, char* pv)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_NEWPVOP
-
-PERL_CALLCONV OP*      Perl_newRANGE(pTHX_ I32 flags, OP* left, OP* right)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_NEWRANGE      \
-       assert(left); assert(right)
-
-PERL_CALLCONV SV*      Perl_newRV(pTHX_ SV *const sv)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_NEWRV \
-       assert(sv)
+PERL_CALLCONV void
+Perl_newPROG(pTHX_ OP *o);
+#define PERL_ARGS_ASSERT_NEWPROG                \
+        assert(o)
 
-PERL_CALLCONV SV*      Perl_newRV_noinc(pTHX_ SV *const tmpRef)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_NEWRV_NOINC   \
-       assert(tmpRef)
+PERL_CALLCONV OP *
+Perl_newPVOP(pTHX_ I32 type, I32 flags, char *pv)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_NEWPVOP
 
-PERL_CALLCONV OP*      Perl_newSLICEOP(pTHX_ I32 flags, OP* subscript, OP* listop)
-                       __attribute__warn_unused_result__;
+PERL_CALLCONV OP *
+Perl_newRANGE(pTHX_ I32 flags, OP *left, OP *right)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_NEWRANGE               \
+        assert(left); assert(right)
+
+PERL_CALLCONV SV *
+Perl_newRV(pTHX_ SV * const sv)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_NEWRV                  \
+        assert(sv)
+
+PERL_CALLCONV OP *
+Perl_newSLICEOP(pTHX_ I32 flags, OP *subscript, OP *listop)
+        __attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_NEWSLICEOP
 
-PERL_CALLCONV OP*      Perl_newSTATEOP(pTHX_ I32 flags, char* label, OP* o)
-                       __attribute__warn_unused_result__;
+PERL_CALLCONV OP *
+Perl_newSTATEOP(pTHX_ I32 flags, char *label, OP *o)
+        __attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_NEWSTATEOP
 
-PERL_CALLCONV CV*      Perl_newSTUB(pTHX_ GV *gv, bool fake);
-#define PERL_ARGS_ASSERT_NEWSTUB       \
-       assert(gv)
-#ifndef NO_MATHOMS
-PERL_CALLCONV CV*      Perl_newSUB(pTHX_ I32 floor, OP* o, OP* proto, OP* block);
-#define PERL_ARGS_ASSERT_NEWSUB
-#endif
-PERL_CALLCONV SV*      Perl_newSV(pTHX_ const STRLEN len)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_NEWSV
-
-PERL_CALLCONV OP*      Perl_newSVOP(pTHX_ I32 type, I32 flags, SV* sv)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_NEWSVOP       \
-       assert(sv)
-
-PERL_CALLCONV OP*      Perl_newSVREF(pTHX_ OP* o)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_NEWSVREF      \
-       assert(o)
-
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE SV* Perl_newSV_type(pTHX_ const svtype type)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_NEWSV_TYPE
-#endif
-
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_FORCE_INLINE SV*   Perl_newSV_type_mortal(pTHX_ const svtype type)
-                       __attribute__warn_unused_result__
-                       __attribute__always_inline__;
-#define PERL_ARGS_ASSERT_NEWSV_TYPE_MORTAL
-#endif
+PERL_CALLCONV CV *
+Perl_newSTUB(pTHX_ GV *gv, bool fake)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_NEWSTUB                \
+        assert(gv)
 
-PERL_CALLCONV SV*      Perl_newSVavdefelem(pTHX_ AV *av, SSize_t ix, bool extendible)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_NEWSVAVDEFELEM        \
-       assert(av)
+PERL_CALLCONV SV *
+Perl_newSV(pTHX_ const STRLEN len)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_NEWSV
 
-PERL_CALLCONV SV*      Perl_newSVhek(pTHX_ const HEK *const hek)
-                       __attribute__warn_unused_result__;
+PERL_CALLCONV OP *
+Perl_newSVOP(pTHX_ I32 type, I32 flags, SV *sv)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_NEWSVOP                \
+        assert(sv)
+
+PERL_CALLCONV OP *
+Perl_newSVREF(pTHX_ OP *o)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_NEWSVREF               \
+        assert(o)
+
+PERL_CALLCONV SV *
+Perl_newSV_false(pTHX)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_NEWSV_FALSE
+
+PERL_CALLCONV SV *
+Perl_newSV_true(pTHX)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_NEWSV_TRUE
+
+PERL_CALLCONV SV *
+Perl_newSVavdefelem(pTHX_ AV *av, SSize_t ix, bool extendible)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_NEWSVAVDEFELEM         \
+        assert(av)
+
+PERL_CALLCONV SV *
+Perl_newSVbool(pTHX_ const bool bool_val)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_NEWSVBOOL
+
+PERL_CALLCONV SV *
+Perl_newSVhek(pTHX_ const HEK * const hek)
+        __attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_NEWSVHEK
 
-PERL_CALLCONV SV*      Perl_newSViv(pTHX_ const IV i)
-                       __attribute__warn_unused_result__;
+PERL_CALLCONV SV *
+Perl_newSVhek_mortal(pTHX_ const HEK * const hek)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_NEWSVHEK_MORTAL
+
+PERL_CALLCONV SV *
+Perl_newSViv(pTHX_ const IV i)
+        __attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_NEWSVIV
 
-PERL_CALLCONV SV*      Perl_newSVnv(pTHX_ const NV n)
-                       __attribute__warn_unused_result__;
+PERL_CALLCONV SV *
+Perl_newSVnv(pTHX_ const NV n)
+        __attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_NEWSVNV
 
-PERL_CALLCONV SV*      Perl_newSVpv(pTHX_ const char *const s, const STRLEN len)
-                       __attribute__warn_unused_result__;
+PERL_CALLCONV SV *
+Perl_newSVpv(pTHX_ const char * const s, const STRLEN len)
+        __attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_NEWSVPV
 
-PERL_CALLCONV SV*      Perl_newSVpv_share(pTHX_ const char* s, U32 hash)
-                       __attribute__warn_unused_result__;
+PERL_CALLCONV SV *
+Perl_newSVpv_share(pTHX_ const char *s, U32 hash)
+        __attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_NEWSVPV_SHARE
 
-PERL_CALLCONV SV*      Perl_newSVpvf(pTHX_ const char *const pat, ...)
-                       __attribute__warn_unused_result__
-                       __attribute__format__(__printf__,pTHX_1,pTHX_2);
-#define PERL_ARGS_ASSERT_NEWSVPVF      \
-       assert(pat)
+PERL_CALLCONV SV *
+Perl_newSVpvf(pTHX_ const char * const pat, ...)
+        __attribute__warn_unused_result__
+        __attribute__format__(__printf__,pTHX_1,pTHX_2);
+#define PERL_ARGS_ASSERT_NEWSVPVF               \
+        assert(pat)
 
-PERL_CALLCONV SV*      Perl_newSVpvn(pTHX_ const char *const buffer, const STRLEN len)
-                       __attribute__warn_unused_result__;
+PERL_CALLCONV SV *
+Perl_newSVpvn(pTHX_ const char * const buffer, const STRLEN len)
+        __attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_NEWSVPVN
 
-PERL_CALLCONV SV*      Perl_newSVpvn_flags(pTHX_ const char *const s, const STRLEN len, const U32 flags)
-                       __attribute__warn_unused_result__;
+PERL_CALLCONV SV *
+Perl_newSVpvn_flags(pTHX_ const char * const s, const STRLEN len, const U32 flags)
+        __attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_NEWSVPVN_FLAGS
 
-PERL_CALLCONV SV*      Perl_newSVpvn_share(pTHX_ const char* s, I32 len, U32 hash)
-                       __attribute__warn_unused_result__;
+PERL_CALLCONV SV *
+Perl_newSVpvn_share(pTHX_ const char *s, I32 len, U32 hash)
+        __attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_NEWSVPVN_SHARE
 
-PERL_CALLCONV SV*      Perl_newSVrv(pTHX_ SV *const rv, const char *const classname);
-#define PERL_ARGS_ASSERT_NEWSVRV       \
-       assert(rv)
-#ifndef NO_MATHOMS
-PERL_CALLCONV SV*      Perl_newSVsv(pTHX_ SV *const old)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_NEWSVSV
-#endif
+PERL_CALLCONV SV *
+Perl_newSVrv(pTHX_ SV * const rv, const char * const classname);
+#define PERL_ARGS_ASSERT_NEWSVRV                \
+        assert(rv)
 
-PERL_CALLCONV SV*      Perl_newSVsv_flags(pTHX_ SV *const old, I32 flags)
-                       __attribute__warn_unused_result__;
+PERL_CALLCONV SV *
+Perl_newSVsv_flags(pTHX_ SV * const old, I32 flags)
+        __attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_NEWSVSV_FLAGS
 
-/* PERL_CALLCONV SV*   newSVsv_nomg(pTHX_ SV *const old)
-                       __attribute__warn_unused_result__; */
-#define PERL_ARGS_ASSERT_NEWSVSV_NOMG
+/* PERL_CALLCONV SV *
+newSVsv_nomg(pTHX_ SV * const old)
+        __attribute__warn_unused_result__; */
 
-PERL_CALLCONV SV*      Perl_newSVuv(pTHX_ const UV u)
-                       __attribute__warn_unused_result__;
+PERL_CALLCONV SV *
+Perl_newSVuv(pTHX_ const UV u)
+        __attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_NEWSVUV
 
-PERL_CALLCONV OP*      Perl_newTRYCATCHOP(pTHX_ I32 flags, OP* tryblock, OP *catchvar, OP* catchblock)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_NEWTRYCATCHOP \
-       assert(tryblock); assert(catchvar); assert(catchblock)
+PERL_CALLCONV OP *
+Perl_newTRYCATCHOP(pTHX_ I32 flags, OP *tryblock, OP *catchvar, OP *catchblock)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_NEWTRYCATCHOP          \
+        assert(tryblock); assert(catchvar); assert(catchblock)
 
-PERL_CALLCONV OP*      Perl_newUNOP(pTHX_ I32 type, I32 flags, OP* first)
-                       __attribute__warn_unused_result__;
+PERL_CALLCONV OP *
+Perl_newUNOP(pTHX_ I32 type, I32 flags, OP *first)
+        __attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_NEWUNOP
 
-PERL_CALLCONV OP*      Perl_newUNOP_AUX(pTHX_ I32 type, I32 flags, OP* first, UNOP_AUX_item *aux)
-                       __attribute__warn_unused_result__;
+PERL_CALLCONV OP *
+Perl_newUNOP_AUX(pTHX_ I32 type, I32 flags, OP *first, UNOP_AUX_item *aux)
+        __attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_NEWUNOP_AUX
 
-PERL_CALLCONV OP*      Perl_newWHENOP(pTHX_ OP* cond, OP* block)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_NEWWHENOP     \
-       assert(block)
+PERL_CALLCONV OP *
+Perl_newWHENOP(pTHX_ OP *cond, OP *block)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_NEWWHENOP              \
+        assert(block)
 
-PERL_CALLCONV OP*      Perl_newWHILEOP(pTHX_ I32 flags, I32 debuggable, LOOP* loop, OP* expr, OP* block, OP* cont, I32 has_my)
-                       __attribute__warn_unused_result__;
+PERL_CALLCONV OP *
+Perl_newWHILEOP(pTHX_ I32 flags, I32 debuggable, LOOP *loop, OP *expr, OP *block, OP *cont, I32 has_my)
+        __attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_NEWWHILEOP
 
-PERL_CALLCONV CV*      Perl_newXS(pTHX_ const char *name, XSUBADDR_t subaddr, const char *filename);
-#define PERL_ARGS_ASSERT_NEWXS \
-       assert(subaddr); assert(filename)
-PERL_CALLCONV CV *     Perl_newXS_deffile(pTHX_ const char *name, XSUBADDR_t subaddr);
-#define PERL_ARGS_ASSERT_NEWXS_DEFFILE \
-       assert(name); assert(subaddr)
-PERL_CALLCONV CV *     Perl_newXS_flags(pTHX_ const char *name, XSUBADDR_t subaddr, const char *const filename, const char *const proto, U32 flags);
-#define PERL_ARGS_ASSERT_NEWXS_FLAGS   \
-       assert(subaddr); assert(filename)
-PERL_CALLCONV CV *     Perl_newXS_len_flags(pTHX_ const char *name, STRLEN len, XSUBADDR_t subaddr, const char *const filename, const char *const proto, SV **const_svp, U32 flags);
-#define PERL_ARGS_ASSERT_NEWXS_LEN_FLAGS       \
-       assert(subaddr)
-PERL_CALLCONV PERL_SI* Perl_new_stackinfo(pTHX_ I32 stitems, I32 cxitems)
-                       __attribute__warn_unused_result__;
+PERL_CALLCONV CV *
+Perl_newXS(pTHX_ const char *name, XSUBADDR_t subaddr, const char *filename);
+#define PERL_ARGS_ASSERT_NEWXS                  \
+        assert(subaddr); assert(filename)
+
+PERL_CALLCONV CV *
+Perl_newXS_deffile(pTHX_ const char *name, XSUBADDR_t subaddr);
+#define PERL_ARGS_ASSERT_NEWXS_DEFFILE          \
+        assert(name); assert(subaddr)
+
+PERL_CALLCONV CV *
+Perl_newXS_flags(pTHX_ const char *name, XSUBADDR_t subaddr, const char * const filename, const char * const proto, U32 flags);
+#define PERL_ARGS_ASSERT_NEWXS_FLAGS            \
+        assert(subaddr); assert(filename)
+
+PERL_CALLCONV CV *
+Perl_newXS_len_flags(pTHX_ const char *name, STRLEN len, XSUBADDR_t subaddr, const char * const filename, const char * const proto, SV ** const_svp, U32 flags)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_NEWXS_LEN_FLAGS        \
+        assert(subaddr)
+
+PERL_CALLCONV PERL_SI *
+Perl_new_stackinfo(pTHX_ I32 stitems, I32 cxitems)
+        __attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_NEW_STACKINFO
 
-PERL_CALLCONV SV*      Perl_new_version(pTHX_ SV *ver);
-#define PERL_ARGS_ASSERT_NEW_VERSION   \
-       assert(ver)
-PERL_CALLCONV STRLEN * Perl_new_warnings_bitfield(pTHX_ STRLEN *buffer, const char *const bits, STRLEN size)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_NEW_WARNINGS_BITFIELD \
-       assert(bits)
-
-PERL_CALLCONV PerlIO*  Perl_nextargv(pTHX_ GV* gv, bool nomagicopen);
-#define PERL_ARGS_ASSERT_NEXTARGV      \
-       assert(gv)
-PERL_CALLCONV char*    Perl_ninstr(const char* big, const char* bigend, const char* little, const char* lend)
-                       __attribute__warn_unused_result__
-                       __attribute__pure__;
-#define PERL_ARGS_ASSERT_NINSTR        \
-       assert(big); assert(bigend); assert(little); assert(lend)
-
-PERL_CALLCONV void     Perl_no_bareword_filehandle(pTHX_ const char *fhname);
-#define PERL_ARGS_ASSERT_NO_BAREWORD_FILEHANDLE        \
-       assert(fhname)
-PERL_CALLCONV_NO_RET void      Perl_noperl_die(const char* pat, ...)
-                       __attribute__noreturn__
-                       __attribute__format__(__printf__,1,2);
-#define PERL_ARGS_ASSERT_NOPERL_DIE    \
-       assert(pat)
-
-PERL_CALLCONV int      Perl_nothreadhook(pTHX);
+PERL_CALLCONV SV *
+Perl_new_version(pTHX_ SV *ver);
+#define PERL_ARGS_ASSERT_NEW_VERSION            \
+        assert(ver)
+
+PERL_CALLCONV char *
+Perl_new_warnings_bitfield(pTHX_ char *buffer, const char * const bits, STRLEN size)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_NEW_WARNINGS_BITFIELD  \
+        assert(bits)
+
+PERL_CALLCONV PerlIO *
+Perl_nextargv(pTHX_ GV *gv, bool nomagicopen)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_NEXTARGV               \
+        assert(gv)
+
+PERL_CALLCONV char *
+Perl_ninstr(const char *big, const char *bigend, const char *little, const char *lend)
+        __attribute__warn_unused_result__
+        __attribute__pure__;
+#define PERL_ARGS_ASSERT_NINSTR                 \
+        assert(big); assert(bigend); assert(little); assert(lend)
+
+PERL_CALLCONV void
+Perl_no_bareword_filehandle(pTHX_ const char *fhname)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_NO_BAREWORD_FILEHANDLE \
+        assert(fhname)
+
+PERL_CALLCONV_NO_RET void
+Perl_noperl_die(const char *pat, ...)
+        __attribute__noreturn__
+        __attribute__format__(__printf__,1,2);
+#define PERL_ARGS_ASSERT_NOPERL_DIE             \
+        assert(pat)
+
+PERL_CALLCONV int
+Perl_nothreadhook(pTHX);
 #define PERL_ARGS_ASSERT_NOTHREADHOOK
-PERL_CALLCONV void     Perl_notify_parser_that_changed_to_utf8(pTHX);
-#define PERL_ARGS_ASSERT_NOTIFY_PARSER_THAT_CHANGED_TO_UTF8
-PERL_CALLCONV OP*      Perl_oopsAV(pTHX_ OP* o)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_OOPSAV        \
-       assert(o)
 
-PERL_CALLCONV OP*      Perl_oopsHV(pTHX_ OP* o)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_OOPSHV        \
-       assert(o)
+PERL_CALLCONV void
+Perl_notify_parser_that_changed_to_utf8(pTHX)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_NOTIFY_PARSER_THAT_CHANGED_TO_UTF8
 
-PERL_CALLCONV OP*      Perl_op_append_elem(pTHX_ I32 optype, OP* first, OP* last);
+PERL_CALLCONV OP *
+Perl_oopsAV(pTHX_ OP *o)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_OOPSAV                 \
+        assert(o)
+
+PERL_CALLCONV OP *
+Perl_oopsHV(pTHX_ OP *o)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_OOPSHV                 \
+        assert(o)
+
+PERL_CALLCONV OP *
+Perl_op_append_elem(pTHX_ I32 optype, OP *first, OP *last);
 #define PERL_ARGS_ASSERT_OP_APPEND_ELEM
-PERL_CALLCONV OP*      Perl_op_append_list(pTHX_ I32 optype, OP* first, OP* last);
+
+PERL_CALLCONV OP *
+Perl_op_append_list(pTHX_ I32 optype, OP *first, OP *last);
 #define PERL_ARGS_ASSERT_OP_APPEND_LIST
-PERL_CALLCONV OPclass  Perl_op_class(pTHX_ const OP *o);
+
+PERL_CALLCONV OPclass
+Perl_op_class(pTHX_ const OP *o);
 #define PERL_ARGS_ASSERT_OP_CLASS
-PERL_CALLCONV void     Perl_op_clear(pTHX_ OP* o);
-#define PERL_ARGS_ASSERT_OP_CLEAR      \
-       assert(o)
-PERL_CALLCONV OP*      Perl_op_contextualize(pTHX_ OP* o, I32 context);
-#define PERL_ARGS_ASSERT_OP_CONTEXTUALIZE      \
-       assert(o)
-PERL_CALLCONV OP*      Perl_op_convert_list(pTHX_ I32 optype, I32 flags, OP* o)
-                       __attribute__warn_unused_result__;
+
+PERL_CALLCONV void
+Perl_op_clear(pTHX_ OP *o);
+#define PERL_ARGS_ASSERT_OP_CLEAR               \
+        assert(o)
+
+PERL_CALLCONV OP *
+Perl_op_contextualize(pTHX_ OP *o, I32 context);
+#define PERL_ARGS_ASSERT_OP_CONTEXTUALIZE       \
+        assert(o)
+
+PERL_CALLCONV OP *
+Perl_op_convert_list(pTHX_ I32 optype, I32 flags, OP *o)
+        __attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_OP_CONVERT_LIST
 
-PERL_CALLCONV void     Perl_op_dump(pTHX_ const OP *o);
-#define PERL_ARGS_ASSERT_OP_DUMP       \
-       assert(o)
-PERL_CALLCONV void     Perl_op_free(pTHX_ OP* arg);
+PERL_CALLCONV void
+Perl_op_dump(pTHX_ const OP *o);
+#define PERL_ARGS_ASSERT_OP_DUMP                \
+        assert(o)
+
+PERL_CALLCONV OP *
+Perl_op_force_list(pTHX_ OP *o);
+#define PERL_ARGS_ASSERT_OP_FORCE_LIST
+
+PERL_CALLCONV void
+Perl_op_free(pTHX_ OP *arg);
 #define PERL_ARGS_ASSERT_OP_FREE
-PERL_CALLCONV OP*      Perl_op_linklist(pTHX_ OP *o);
-#define PERL_ARGS_ASSERT_OP_LINKLIST   \
-       assert(o)
-/* PERL_CALLCONV OP*   op_lvalue(pTHX_ OP* o, I32 type); */
-#define PERL_ARGS_ASSERT_OP_LVALUE
-PERL_CALLCONV OP*      Perl_op_lvalue_flags(pTHX_ OP* o, I32 type, U32 flags);
+
+PERL_CALLCONV OP *
+Perl_op_linklist(pTHX_ OP *o);
+#define PERL_ARGS_ASSERT_OP_LINKLIST            \
+        assert(o)
+
+/* PERL_CALLCONV OP *
+op_lvalue(pTHX_ OP *o, I32 type); */
+
+PERL_CALLCONV OP *
+Perl_op_lvalue_flags(pTHX_ OP *o, I32 type, U32 flags);
 #define PERL_ARGS_ASSERT_OP_LVALUE_FLAGS
-PERL_CALLCONV void     Perl_op_null(pTHX_ OP* o);
-#define PERL_ARGS_ASSERT_OP_NULL       \
-       assert(o)
-PERL_CALLCONV OP*      Perl_op_parent(OP *o);
-#define PERL_ARGS_ASSERT_OP_PARENT     \
-       assert(o)
-PERL_CALLCONV OP*      Perl_op_prepend_elem(pTHX_ I32 optype, OP* first, OP* last);
+
+PERL_CALLCONV void
+Perl_op_null(pTHX_ OP *o);
+#define PERL_ARGS_ASSERT_OP_NULL                \
+        assert(o)
+
+PERL_CALLCONV OP *
+Perl_op_parent(OP *o);
+#define PERL_ARGS_ASSERT_OP_PARENT              \
+        assert(o)
+
+PERL_CALLCONV OP *
+Perl_op_prepend_elem(pTHX_ I32 optype, OP *first, OP *last);
 #define PERL_ARGS_ASSERT_OP_PREPEND_ELEM
-PERL_CALLCONV void     Perl_op_refcnt_lock(pTHX);
+
+PERL_CALLCONV void
+Perl_op_refcnt_lock(pTHX);
 #define PERL_ARGS_ASSERT_OP_REFCNT_LOCK
-PERL_CALLCONV void     Perl_op_refcnt_unlock(pTHX);
+
+PERL_CALLCONV void
+Perl_op_refcnt_unlock(pTHX);
 #define PERL_ARGS_ASSERT_OP_REFCNT_UNLOCK
-PERL_CALLCONV OP*      Perl_op_scope(pTHX_ OP* o);
+
+PERL_CALLCONV OP *
+Perl_op_scope(pTHX_ OP *o);
 #define PERL_ARGS_ASSERT_OP_SCOPE
-PERL_CALLCONV OP*      Perl_op_sibling_splice(OP *parent, OP *start, int del_count, OP* insert);
+
+PERL_CALLCONV OP *
+Perl_op_sibling_splice(OP *parent, OP *start, int del_count, OP *insert);
 #define PERL_ARGS_ASSERT_OP_SIBLING_SPLICE
-PERL_CALLCONV OP*      Perl_op_unscope(pTHX_ OP* o);
+
+PERL_CALLCONV OP *
+Perl_op_unscope(pTHX_ OP *o)
+        __attribute__visibility__("hidden");
 #define PERL_ARGS_ASSERT_OP_UNSCOPE
-PERL_CALLCONV OP*      Perl_op_wrap_finally(pTHX_ OP *block, OP *finally)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_OP_WRAP_FINALLY       \
-       assert(block); assert(finally)
-
-PERL_CALLCONV void     Perl_optimize_optree(pTHX_ OP* o);
-#define PERL_ARGS_ASSERT_OPTIMIZE_OPTREE       \
-       assert(o)
-#ifndef NO_MATHOMS
-PERL_CALLCONV void     Perl_pack_cat(pTHX_ SV *cat, const char *pat, const char *patend, SV **beglist, SV **endlist, SV ***next_in_list, U32 flags)
-                       __attribute__deprecated__;
-#define PERL_ARGS_ASSERT_PACK_CAT      \
-       assert(cat); assert(pat); assert(patend); assert(beglist); assert(endlist); assert(next_in_list)
-#endif
 
-PERL_CALLCONV void     Perl_package(pTHX_ OP* o);
-#define PERL_ARGS_ASSERT_PACKAGE       \
-       assert(o)
-PERL_CALLCONV void     Perl_package_version(pTHX_ OP* v);
-#define PERL_ARGS_ASSERT_PACKAGE_VERSION       \
-       assert(v)
-PERL_CALLCONV void     Perl_packlist(pTHX_ SV *cat, const char *pat, const char *patend, SV **beglist, SV **endlist);
-#define PERL_ARGS_ASSERT_PACKLIST      \
-       assert(cat); assert(pat); assert(patend); assert(beglist); assert(endlist)
-PERL_CALLCONV PADOFFSET        Perl_pad_add_anon(pTHX_ CV* func, I32 optype);
-#define PERL_ARGS_ASSERT_PAD_ADD_ANON  \
-       assert(func)
-PERL_CALLCONV PADOFFSET        Perl_pad_add_name_pv(pTHX_ const char *name, const U32 flags, HV *typestash, HV *ourstash);
-#define PERL_ARGS_ASSERT_PAD_ADD_NAME_PV       \
-       assert(name)
-PERL_CALLCONV PADOFFSET        Perl_pad_add_name_pvn(pTHX_ const char *namepv, STRLEN namelen, U32 flags, HV *typestash, HV *ourstash);
-#define PERL_ARGS_ASSERT_PAD_ADD_NAME_PVN      \
-       assert(namepv)
-PERL_CALLCONV PADOFFSET        Perl_pad_add_name_sv(pTHX_ SV *name, U32 flags, HV *typestash, HV *ourstash);
-#define PERL_ARGS_ASSERT_PAD_ADD_NAME_SV       \
-       assert(name)
-PERL_CALLCONV void     Perl_pad_add_weakref(pTHX_ CV* func);
-#define PERL_ARGS_ASSERT_PAD_ADD_WEAKREF       \
-       assert(func)
-PERL_CALLCONV PADOFFSET        Perl_pad_alloc(pTHX_ I32 optype, U32 tmptype);
+PERL_CALLCONV OP *
+Perl_op_wrap_finally(pTHX_ OP *block, OP *finally)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_OP_WRAP_FINALLY        \
+        assert(block); assert(finally)
+
+PERL_CALLCONV void
+Perl_package(pTHX_ OP *o)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_PACKAGE                \
+        assert(o)
+
+PERL_CALLCONV void
+Perl_package_version(pTHX_ OP *v)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_PACKAGE_VERSION        \
+        assert(v)
+
+PERL_CALLCONV void
+Perl_packlist(pTHX_ SV *cat, const char *pat, const char *patend, SV **beglist, SV **endlist);
+#define PERL_ARGS_ASSERT_PACKLIST               \
+        assert(cat); assert(pat); assert(patend); assert(beglist); assert(endlist)
+
+PERL_CALLCONV PADOFFSET
+Perl_pad_add_anon(pTHX_ CV *func, I32 optype);
+#define PERL_ARGS_ASSERT_PAD_ADD_ANON           \
+        assert(func)
+
+PERL_CALLCONV PADOFFSET
+Perl_pad_add_name_pv(pTHX_ const char *name, const U32 flags, HV *typestash, HV *ourstash);
+#define PERL_ARGS_ASSERT_PAD_ADD_NAME_PV        \
+        assert(name)
+
+PERL_CALLCONV PADOFFSET
+Perl_pad_add_name_pvn(pTHX_ const char *namepv, STRLEN namelen, U32 flags, HV *typestash, HV *ourstash);
+#define PERL_ARGS_ASSERT_PAD_ADD_NAME_PVN       \
+        assert(namepv)
+
+PERL_CALLCONV PADOFFSET
+Perl_pad_add_name_sv(pTHX_ SV *name, U32 flags, HV *typestash, HV *ourstash);
+#define PERL_ARGS_ASSERT_PAD_ADD_NAME_SV        \
+        assert(name)
+
+PERL_CALLCONV void
+Perl_pad_add_weakref(pTHX_ CV *func)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_PAD_ADD_WEAKREF        \
+        assert(func)
+
+PERL_CALLCONV PADOFFSET
+Perl_pad_alloc(pTHX_ I32 optype, U32 tmptype);
 #define PERL_ARGS_ASSERT_PAD_ALLOC
-PERL_CALLCONV void     Perl_pad_block_start(pTHX_ int full);
+
+PERL_CALLCONV void
+Perl_pad_block_start(pTHX_ int full)
+        __attribute__visibility__("hidden");
 #define PERL_ARGS_ASSERT_PAD_BLOCK_START
-#ifndef NO_MATHOMS
-PERL_CALLCONV HV*      Perl_pad_compname_type(pTHX_ const PADOFFSET po)
-                       __attribute__deprecated__
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_PAD_COMPNAME_TYPE
-#endif
 
-PERL_CALLCONV PADOFFSET        Perl_pad_findmy_pv(pTHX_ const char* name, U32 flags);
-#define PERL_ARGS_ASSERT_PAD_FINDMY_PV \
-       assert(name)
-PERL_CALLCONV PADOFFSET        Perl_pad_findmy_pvn(pTHX_ const char* namepv, STRLEN namelen, U32 flags);
-#define PERL_ARGS_ASSERT_PAD_FINDMY_PVN        \
-       assert(namepv)
-PERL_CALLCONV PADOFFSET        Perl_pad_findmy_sv(pTHX_ SV* name, U32 flags);
-#define PERL_ARGS_ASSERT_PAD_FINDMY_SV \
-       assert(name)
-PERL_CALLCONV void     Perl_pad_fixup_inner_anons(pTHX_ PADLIST *padlist, CV *old_cv, CV *new_cv);
-#define PERL_ARGS_ASSERT_PAD_FIXUP_INNER_ANONS \
-       assert(padlist); assert(old_cv); assert(new_cv)
-PERL_CALLCONV void     Perl_pad_free(pTHX_ PADOFFSET po);
+PERL_CALLCONV PADOFFSET
+Perl_pad_findmy_pv(pTHX_ const char *name, U32 flags);
+#define PERL_ARGS_ASSERT_PAD_FINDMY_PV          \
+        assert(name)
+
+PERL_CALLCONV PADOFFSET
+Perl_pad_findmy_pvn(pTHX_ const char *namepv, STRLEN namelen, U32 flags);
+#define PERL_ARGS_ASSERT_PAD_FINDMY_PVN         \
+        assert(namepv)
+
+PERL_CALLCONV PADOFFSET
+Perl_pad_findmy_sv(pTHX_ SV *name, U32 flags);
+#define PERL_ARGS_ASSERT_PAD_FINDMY_SV          \
+        assert(name)
+
+PERL_CALLCONV void
+Perl_pad_fixup_inner_anons(pTHX_ PADLIST *padlist, CV *old_cv, CV *new_cv)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_PAD_FIXUP_INNER_ANONS  \
+        assert(padlist); assert(old_cv); assert(new_cv)
+
+PERL_CALLCONV void
+Perl_pad_free(pTHX_ PADOFFSET po)
+        __attribute__visibility__("hidden");
 #define PERL_ARGS_ASSERT_PAD_FREE
-PERL_CALLCONV OP *     Perl_pad_leavemy(pTHX);
+
+PERL_CALLCONV OP *
+Perl_pad_leavemy(pTHX)
+        __attribute__visibility__("hidden");
 #define PERL_ARGS_ASSERT_PAD_LEAVEMY
-PERL_CALLCONV PADLIST* Perl_pad_new(pTHX_ int flags)
-                       __attribute__warn_unused_result__;
+
+PERL_CALLCONV PADLIST *
+Perl_pad_new(pTHX_ int flags)
+        __attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_PAD_NEW
 
-PERL_CALLCONV void     Perl_pad_push(pTHX_ PADLIST *padlist, int depth);
-#define PERL_ARGS_ASSERT_PAD_PUSH      \
-       assert(padlist)
-PERL_CALLCONV void     Perl_pad_swipe(pTHX_ PADOFFSET po, bool refadjust);
+PERL_CALLCONV void
+Perl_pad_push(pTHX_ PADLIST *padlist, int depth);
+#define PERL_ARGS_ASSERT_PAD_PUSH               \
+        assert(padlist)
+
+PERL_CALLCONV void
+Perl_pad_swipe(pTHX_ PADOFFSET po, bool refadjust)
+        __attribute__visibility__("hidden");
 #define PERL_ARGS_ASSERT_PAD_SWIPE
-PERL_CALLCONV void     Perl_pad_tidy(pTHX_ padtidy_type type);
+
+PERL_CALLCONV void
+Perl_pad_tidy(pTHX_ padtidy_type type);
 #define PERL_ARGS_ASSERT_PAD_TIDY
-PERL_CALLCONV PAD **   Perl_padlist_store(pTHX_ PADLIST *padlist, I32 key, PAD *val);
-#define PERL_ARGS_ASSERT_PADLIST_STORE \
-       assert(padlist)
-PERL_CALLCONV void     Perl_padname_free(pTHX_ PADNAME *pn);
-#define PERL_ARGS_ASSERT_PADNAME_FREE  \
-       assert(pn)
-PERL_CALLCONV PADNAME *        Perl_padnamelist_fetch(PADNAMELIST *pnl, SSize_t key)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_PADNAMELIST_FETCH     \
-       assert(pnl)
-
-PERL_CALLCONV void     Perl_padnamelist_free(pTHX_ PADNAMELIST *pnl);
-#define PERL_ARGS_ASSERT_PADNAMELIST_FREE      \
-       assert(pnl)
-PERL_CALLCONV PADNAME **       Perl_padnamelist_store(pTHX_ PADNAMELIST *pnl, SSize_t key, PADNAME *val);
-#define PERL_ARGS_ASSERT_PADNAMELIST_STORE     \
-       assert(pnl)
-PERL_CALLCONV OP*      Perl_parse_arithexpr(pTHX_ U32 flags);
+
+PERL_CALLCONV PAD **
+Perl_padlist_store(pTHX_ PADLIST *padlist, I32 key, PAD *val)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_PADLIST_STORE          \
+        assert(padlist)
+
+PERL_CALLCONV void
+Perl_padname_free(pTHX_ PADNAME *pn);
+#define PERL_ARGS_ASSERT_PADNAME_FREE           \
+        assert(pn)
+
+PERL_CALLCONV PADNAME *
+Perl_padnamelist_fetch(PADNAMELIST *pnl, SSize_t key)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_PADNAMELIST_FETCH      \
+        assert(pnl)
+
+PERL_CALLCONV void
+Perl_padnamelist_free(pTHX_ PADNAMELIST *pnl);
+#define PERL_ARGS_ASSERT_PADNAMELIST_FREE       \
+        assert(pnl)
+
+PERL_CALLCONV PADNAME **
+Perl_padnamelist_store(pTHX_ PADNAMELIST *pnl, SSize_t key, PADNAME *val);
+#define PERL_ARGS_ASSERT_PADNAMELIST_STORE      \
+        assert(pnl)
+
+PERL_CALLCONV OP *
+Perl_parse_arithexpr(pTHX_ U32 flags);
 #define PERL_ARGS_ASSERT_PARSE_ARITHEXPR
-PERL_CALLCONV OP*      Perl_parse_barestmt(pTHX_ U32 flags);
+
+PERL_CALLCONV OP *
+Perl_parse_barestmt(pTHX_ U32 flags);
 #define PERL_ARGS_ASSERT_PARSE_BARESTMT
-PERL_CALLCONV OP*      Perl_parse_block(pTHX_ U32 flags);
+
+PERL_CALLCONV OP *
+Perl_parse_block(pTHX_ U32 flags);
 #define PERL_ARGS_ASSERT_PARSE_BLOCK
-PERL_CALLCONV OP*      Perl_parse_fullexpr(pTHX_ U32 flags);
+
+PERL_CALLCONV OP *
+Perl_parse_fullexpr(pTHX_ U32 flags);
 #define PERL_ARGS_ASSERT_PARSE_FULLEXPR
-PERL_CALLCONV OP*      Perl_parse_fullstmt(pTHX_ U32 flags);
+
+PERL_CALLCONV OP *
+Perl_parse_fullstmt(pTHX_ U32 flags);
 #define PERL_ARGS_ASSERT_PARSE_FULLSTMT
-PERL_CALLCONV SV*      Perl_parse_label(pTHX_ U32 flags);
+
+PERL_CALLCONV SV *
+Perl_parse_label(pTHX_ U32 flags);
 #define PERL_ARGS_ASSERT_PARSE_LABEL
-PERL_CALLCONV OP*      Perl_parse_listexpr(pTHX_ U32 flags);
+
+PERL_CALLCONV OP *
+Perl_parse_listexpr(pTHX_ U32 flags);
 #define PERL_ARGS_ASSERT_PARSE_LISTEXPR
-PERL_CALLCONV OP*      Perl_parse_stmtseq(pTHX_ U32 flags);
+
+PERL_CALLCONV OP *
+Perl_parse_stmtseq(pTHX_ U32 flags);
 #define PERL_ARGS_ASSERT_PARSE_STMTSEQ
-PERL_CALLCONV OP*      Perl_parse_subsignature(pTHX_ U32 flags);
+
+PERL_CALLCONV OP *
+Perl_parse_subsignature(pTHX_ U32 flags);
 #define PERL_ARGS_ASSERT_PARSE_SUBSIGNATURE
-PERL_CALLCONV OP*      Perl_parse_termexpr(pTHX_ U32 flags);
+
+PERL_CALLCONV OP *
+Perl_parse_termexpr(pTHX_ U32 flags);
 #define PERL_ARGS_ASSERT_PARSE_TERMEXPR
-PERL_CALLCONV U32      Perl_parse_unicode_opts(pTHX_ const char **popt);
-#define PERL_ARGS_ASSERT_PARSE_UNICODE_OPTS    \
-       assert(popt)
-PERL_CALLCONV void     Perl_parser_free(pTHX_ const yy_parser *parser);
-#define PERL_ARGS_ASSERT_PARSER_FREE   \
-       assert(parser)
-PERL_CALLCONV void     Perl_peep(pTHX_ OP* o);
+
+PERL_CALLCONV U32
+Perl_parse_unicode_opts(pTHX_ const char **popt)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_PARSE_UNICODE_OPTS     \
+        assert(popt)
+
+PERL_CALLCONV void
+Perl_parser_free(pTHX_ const yy_parser *parser)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_PARSER_FREE            \
+        assert(parser)
+
+PERL_CALLCONV void
+Perl_peep(pTHX_ OP *o)
+        __attribute__visibility__("hidden");
 #define PERL_ARGS_ASSERT_PEEP
-PERL_CALLCONV PerlInterpreter* perl_alloc(void);
+
+PERL_CALLCONV PerlInterpreter *
+perl_alloc(void);
 #define PERL_ARGS_ASSERT_PERL_ALLOC
-PERL_CALLCONV void     perl_construct(PerlInterpreter *my_perl);
-#define PERL_ARGS_ASSERT_PERL_CONSTRUCT        \
-       assert(my_perl)
-PERL_CALLCONV int      perl_destruct(PerlInterpreter *my_perl);
-#define PERL_ARGS_ASSERT_PERL_DESTRUCT \
-       assert(my_perl)
-PERL_CALLCONV void     perl_free(PerlInterpreter *my_perl);
-#define PERL_ARGS_ASSERT_PERL_FREE     \
-       assert(my_perl)
-PERL_CALLCONV int      perl_parse(PerlInterpreter *my_perl, XSINIT_t xsinit, int argc, char** argv, char** env);
-#define PERL_ARGS_ASSERT_PERL_PARSE    \
-       assert(my_perl)
-PERL_CALLCONV int      perl_run(PerlInterpreter *my_perl);
-#define PERL_ARGS_ASSERT_PERL_RUN      \
-       assert(my_perl)
-PERL_CALLCONV Signal_t Perl_perly_sighandler(int sig, Siginfo_t *info, void *uap, bool safe);
+
+PERL_CALLCONV void
+perl_construct(PerlInterpreter *my_perl);
+#define PERL_ARGS_ASSERT_PERL_CONSTRUCT         \
+        assert(my_perl)
+
+PERL_CALLCONV int
+perl_destruct(PerlInterpreter *my_perl);
+#define PERL_ARGS_ASSERT_PERL_DESTRUCT          \
+        assert(my_perl)
+
+PERL_CALLCONV void
+perl_free(PerlInterpreter *my_perl);
+#define PERL_ARGS_ASSERT_PERL_FREE              \
+        assert(my_perl)
+
+PERL_CALLCONV int
+perl_parse(PerlInterpreter *my_perl, XSINIT_t xsinit, int argc, char **argv, char **env);
+#define PERL_ARGS_ASSERT_PERL_PARSE             \
+        assert(my_perl)
+
+PERL_CALLCONV int
+perl_run(PerlInterpreter *my_perl);
+#define PERL_ARGS_ASSERT_PERL_RUN               \
+        assert(my_perl)
+
+PERL_CALLCONV Signal_t
+Perl_perly_sighandler(int sig, Siginfo_t *info, void *uap, bool safe);
 #define PERL_ARGS_ASSERT_PERLY_SIGHANDLER
-/* PERL_CALLCONV const char *const     phase_name(pTHX_ enum perl_phase); */
-#define PERL_ARGS_ASSERT_PHASE_NAME
-PERL_CALLCONV void     Perl_pmop_dump(pTHX_ PMOP* pm);
+
+/* PERL_CALLCONV const char * const
+phase_name(pTHX_ enum perl_phase); */
+
+PERL_CALLCONV void
+Perl_pmop_dump(pTHX_ PMOP *pm);
 #define PERL_ARGS_ASSERT_PMOP_DUMP
-PERL_CALLCONV OP*      Perl_pmruntime(pTHX_ OP *o, OP *expr, OP *repl, UV flags, I32 floor);
-#define PERL_ARGS_ASSERT_PMRUNTIME     \
-       assert(o); assert(expr)
-PERL_CALLCONV void     Perl_pop_scope(pTHX);
+
+PERL_CALLCONV OP *
+Perl_pmruntime(pTHX_ OP *o, OP *expr, OP *repl, UV flags, I32 floor)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_PMRUNTIME              \
+        assert(o); assert(expr)
+
+PERL_CALLCONV void
+Perl_pop_scope(pTHX);
 #define PERL_ARGS_ASSERT_POP_SCOPE
-PERL_CALLCONV void     Perl_populate_isa(pTHX_ const char *name, STRLEN len, ...);
-#define PERL_ARGS_ASSERT_POPULATE_ISA  \
-       assert(name)
-PERL_CALLCONV REGEXP*  Perl_pregcomp(pTHX_ SV * const pattern, const U32 flags);
-#define PERL_ARGS_ASSERT_PREGCOMP      \
-       assert(pattern)
-PERL_CALLCONV I32      Perl_pregexec(pTHX_ REGEXP * const prog, char* stringarg, char* strend, char* strbeg, SSize_t minend, SV* screamer, U32 nosave);
-#define PERL_ARGS_ASSERT_PREGEXEC      \
-       assert(prog); assert(stringarg); assert(strend); assert(strbeg); assert(screamer)
-PERL_CALLCONV void     Perl_pregfree(pTHX_ REGEXP* r);
+
+PERL_CALLCONV void
+Perl_populate_isa(pTHX_ const char *name, STRLEN len, ...)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_POPULATE_ISA           \
+        assert(name)
+
+PERL_CALLCONV REGEXP *
+Perl_pregcomp(pTHX_ SV * const pattern, const U32 flags);
+#define PERL_ARGS_ASSERT_PREGCOMP               \
+        assert(pattern)
+
+PERL_CALLCONV I32
+Perl_pregexec(pTHX_ REGEXP * const prog, char *stringarg, char *strend, char *strbeg, SSize_t minend, SV *screamer, U32 nosave);
+#define PERL_ARGS_ASSERT_PREGEXEC               \
+        assert(prog); assert(stringarg); assert(strend); assert(strbeg); \
+        assert(screamer)
+
+PERL_CALLCONV void
+Perl_pregfree(pTHX_ REGEXP *r);
 #define PERL_ARGS_ASSERT_PREGFREE
-PERL_CALLCONV void     Perl_pregfree2(pTHX_ REGEXP *rx);
-#define PERL_ARGS_ASSERT_PREGFREE2     \
-       assert(rx)
-PERL_CALLCONV const char*      Perl_prescan_version(pTHX_ const char *s, bool strict, const char** errstr, bool *sqv, int *ssaw_decimal, int *swidth, bool *salpha);
-#define PERL_ARGS_ASSERT_PRESCAN_VERSION       \
-       assert(s)
-PERL_CALLCONV void*    Perl_ptr_table_fetch(pTHX_ PTR_TBL_t *const tbl, const void *const sv)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_PTR_TABLE_FETCH       \
-       assert(tbl)
-
-PERL_CALLCONV void     Perl_ptr_table_free(pTHX_ PTR_TBL_t *const tbl);
+
+PERL_CALLCONV void
+Perl_pregfree2(pTHX_ REGEXP *rx);
+#define PERL_ARGS_ASSERT_PREGFREE2              \
+        assert(rx)
+
+PERL_CALLCONV const char *
+Perl_prescan_version(pTHX_ const char *s, bool strict, const char **errstr, bool *sqv, int *ssaw_decimal, int *swidth, bool *salpha);
+#define PERL_ARGS_ASSERT_PRESCAN_VERSION        \
+        assert(s)
+
+PERL_CALLCONV void *
+Perl_ptr_table_fetch(pTHX_ PTR_TBL_t * const tbl, const void * const sv)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_PTR_TABLE_FETCH        \
+        assert(tbl)
+
+PERL_CALLCONV void
+Perl_ptr_table_free(pTHX_ PTR_TBL_t * const tbl);
 #define PERL_ARGS_ASSERT_PTR_TABLE_FREE
-PERL_CALLCONV PTR_TBL_t*       Perl_ptr_table_new(pTHX)
-                       __attribute__warn_unused_result__;
+
+PERL_CALLCONV PTR_TBL_t *
+Perl_ptr_table_new(pTHX)
+        __attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_PTR_TABLE_NEW
 
-PERL_CALLCONV void     Perl_ptr_table_split(pTHX_ PTR_TBL_t *const tbl);
-#define PERL_ARGS_ASSERT_PTR_TABLE_SPLIT       \
-       assert(tbl)
-PERL_CALLCONV void     Perl_ptr_table_store(pTHX_ PTR_TBL_t *const tbl, const void *const oldsv, void *const newsv);
-#define PERL_ARGS_ASSERT_PTR_TABLE_STORE       \
-       assert(tbl); assert(newsv)
-PERL_CALLCONV void     Perl_push_scope(pTHX);
+PERL_CALLCONV void
+Perl_ptr_table_split(pTHX_ PTR_TBL_t * const tbl);
+#define PERL_ARGS_ASSERT_PTR_TABLE_SPLIT        \
+        assert(tbl)
+
+PERL_CALLCONV void
+Perl_ptr_table_store(pTHX_ PTR_TBL_t * const tbl, const void * const oldsv, void * const newsv);
+#define PERL_ARGS_ASSERT_PTR_TABLE_STORE        \
+        assert(tbl); assert(newsv)
+
+PERL_CALLCONV void
+Perl_push_scope(pTHX);
 #define PERL_ARGS_ASSERT_PUSH_SCOPE
-PERL_CALLCONV char*    Perl_pv_display(pTHX_ SV *dsv, const char *pv, STRLEN cur, STRLEN len, STRLEN pvlim);
-#define PERL_ARGS_ASSERT_PV_DISPLAY    \
-       assert(dsv); assert(pv)
-PERL_CALLCONV char*    Perl_pv_escape(pTHX_ SV *dsv, char const * const str, const STRLEN count, const STRLEN max, STRLEN * const escaped, const U32 flags);
-#define PERL_ARGS_ASSERT_PV_ESCAPE     \
-       assert(str)
-PERL_CALLCONV char*    Perl_pv_pretty(pTHX_ SV *dsv, char const * const str, const STRLEN count, const STRLEN max, char const * const start_color, char const * const end_color, const U32 flags);
-#define PERL_ARGS_ASSERT_PV_PRETTY     \
-       assert(dsv); assert(str)
-PERL_CALLCONV char*    Perl_pv_uni_display(pTHX_ SV *dsv, const U8 *spv, STRLEN len, STRLEN pvlim, UV flags);
-#define PERL_ARGS_ASSERT_PV_UNI_DISPLAY        \
-       assert(dsv); assert(spv)
-PERL_CALLCONV void     Perl_qerror(pTHX_ SV* err);
-#define PERL_ARGS_ASSERT_QERROR        \
-       assert(err)
-PERL_CALLCONV REGEXP*  Perl_re_compile(pTHX_ SV * const pattern, U32 orig_rx_flags);
-#define PERL_ARGS_ASSERT_RE_COMPILE    \
-       assert(pattern)
-PERL_CALLCONV char*    Perl_re_intuit_start(pTHX_ REGEXP * const rx, SV* sv, const char* const strbeg, char* strpos, char* strend, const U32 flags, re_scream_pos_data *data);
-#define PERL_ARGS_ASSERT_RE_INTUIT_START       \
-       assert(rx); assert(strbeg); assert(strpos); assert(strend)
-PERL_CALLCONV SV*      Perl_re_intuit_string(pTHX_ REGEXP  *const r);
-#define PERL_ARGS_ASSERT_RE_INTUIT_STRING      \
-       assert(r)
-PERL_CALLCONV REGEXP*  Perl_re_op_compile(pTHX_ SV ** const patternp, int pat_count, OP *expr, const regexp_engine* eng, REGEXP *old_re, bool *is_bare_re, const U32 rx_flags, const U32 pm_flags);
-#define PERL_ARGS_ASSERT_RE_OP_COMPILE \
-       assert(eng)
-PERL_CALLCONV Malloc_t Perl_realloc(Malloc_t where, MEM_SIZE nbytes)
-                       __attribute__warn_unused_result__;
+
+PERL_CALLCONV char *
+Perl_pv_display(pTHX_ SV *dsv, const char *pv, STRLEN cur, STRLEN len, STRLEN pvlim);
+#define PERL_ARGS_ASSERT_PV_DISPLAY             \
+        assert(dsv); assert(pv)
+
+PERL_CALLCONV char *
+Perl_pv_escape(pTHX_ SV *dsv, char const * const str, const STRLEN count, STRLEN max, STRLEN * const escaped, U32 flags);
+#define PERL_ARGS_ASSERT_PV_ESCAPE              \
+        assert(str)
+
+PERL_CALLCONV char *
+Perl_pv_pretty(pTHX_ SV *dsv, char const * const str, const STRLEN count, const STRLEN max, char const * const start_color, char const * const end_color, const U32 flags);
+#define PERL_ARGS_ASSERT_PV_PRETTY              \
+        assert(dsv); assert(str)
+
+PERL_CALLCONV char *
+Perl_pv_uni_display(pTHX_ SV *dsv, const U8 *spv, STRLEN len, STRLEN pvlim, UV flags);
+#define PERL_ARGS_ASSERT_PV_UNI_DISPLAY         \
+        assert(dsv); assert(spv)
+
+PERL_CALLCONV void
+Perl_qerror(pTHX_ SV *err);
+#define PERL_ARGS_ASSERT_QERROR
+
+PERL_CALLCONV char *
+Perl_rcpv_copy(pTHX_ char * const pv);
+#define PERL_ARGS_ASSERT_RCPV_COPY
+
+PERL_CALLCONV char *
+Perl_rcpv_free(pTHX_ char * const pv);
+#define PERL_ARGS_ASSERT_RCPV_FREE
+
+PERL_CALLCONV char *
+Perl_rcpv_new(pTHX_ const char * const pv, STRLEN len, U32 flags)
+        __attribute__malloc__
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_RCPV_NEW
+
+PERL_CALLCONV REGEXP *
+Perl_re_compile(pTHX_ SV * const pattern, U32 orig_rx_flags);
+#define PERL_ARGS_ASSERT_RE_COMPILE             \
+        assert(pattern)
+
+PERL_CALLCONV char *
+Perl_re_intuit_start(pTHX_ REGEXP * const rx, SV *sv, const char * const strbeg, char *strpos, char *strend, const U32 flags, re_scream_pos_data *data);
+#define PERL_ARGS_ASSERT_RE_INTUIT_START        \
+        assert(rx); assert(strbeg); assert(strpos); assert(strend)
+
+PERL_CALLCONV SV *
+Perl_re_intuit_string(pTHX_ REGEXP  * const r);
+#define PERL_ARGS_ASSERT_RE_INTUIT_STRING       \
+        assert(r)
+
+PERL_CALLCONV REGEXP *
+Perl_re_op_compile(pTHX_ SV ** const patternp, int pat_count, OP *expr, const regexp_engine *eng, REGEXP *old_re, bool *is_bare_re, const U32 rx_flags, const U32 pm_flags);
+#define PERL_ARGS_ASSERT_RE_OP_COMPILE          \
+        assert(eng)
+
+PERL_CALLCONV Malloc_t
+Perl_realloc(Malloc_t where, MEM_SIZE nbytes)
+        __attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_REALLOC
 
-PERL_CALLCONV void     Perl_reentrant_free(pTHX);
+PERL_CALLCONV void
+Perl_reentrant_free(pTHX);
 #define PERL_ARGS_ASSERT_REENTRANT_FREE
-PERL_CALLCONV void     Perl_reentrant_init(pTHX);
+
+PERL_CALLCONV void
+Perl_reentrant_init(pTHX);
 #define PERL_ARGS_ASSERT_REENTRANT_INIT
-PERL_CALLCONV void*    Perl_reentrant_retry(const char *f, ...);
-#define PERL_ARGS_ASSERT_REENTRANT_RETRY       \
-       assert(f)
-PERL_CALLCONV void     Perl_reentrant_size(pTHX);
+
+PERL_CALLCONV void *
+Perl_reentrant_retry(const char *f, ...);
+#define PERL_ARGS_ASSERT_REENTRANT_RETRY        \
+        assert(f)
+
+PERL_CALLCONV void
+Perl_reentrant_size(pTHX);
 #define PERL_ARGS_ASSERT_REENTRANT_SIZE
-PERL_CALLCONV HV *     Perl_refcounted_he_chain_2hv(pTHX_ const struct refcounted_he *c, U32 flags);
+
+PERL_CALLCONV HV *
+Perl_refcounted_he_chain_2hv(pTHX_ const struct refcounted_he *c, U32 flags);
 #define PERL_ARGS_ASSERT_REFCOUNTED_HE_CHAIN_2HV
-PERL_CALLCONV SV *     Perl_refcounted_he_fetch_pv(pTHX_ const struct refcounted_he *chain, const char *key, U32 hash, U32 flags);
-#define PERL_ARGS_ASSERT_REFCOUNTED_HE_FETCH_PV        \
-       assert(key)
-PERL_CALLCONV SV *     Perl_refcounted_he_fetch_pvn(pTHX_ const struct refcounted_he *chain, const char *keypv, STRLEN keylen, U32 hash, U32 flags);
-#define PERL_ARGS_ASSERT_REFCOUNTED_HE_FETCH_PVN       \
-       assert(keypv)
-PERL_CALLCONV SV *     Perl_refcounted_he_fetch_sv(pTHX_ const struct refcounted_he *chain, SV *key, U32 hash, U32 flags);
-#define PERL_ARGS_ASSERT_REFCOUNTED_HE_FETCH_SV        \
-       assert(key)
-PERL_CALLCONV void     Perl_refcounted_he_free(pTHX_ struct refcounted_he *he);
+
+PERL_CALLCONV SV *
+Perl_refcounted_he_fetch_pv(pTHX_ const struct refcounted_he *chain, const char *key, U32 hash, U32 flags);
+#define PERL_ARGS_ASSERT_REFCOUNTED_HE_FETCH_PV \
+        assert(key)
+
+PERL_CALLCONV SV *
+Perl_refcounted_he_fetch_pvn(pTHX_ const struct refcounted_he *chain, const char *keypv, STRLEN keylen, U32 hash, U32 flags);
+#define PERL_ARGS_ASSERT_REFCOUNTED_HE_FETCH_PVN \
+        assert(keypv)
+
+PERL_CALLCONV SV *
+Perl_refcounted_he_fetch_sv(pTHX_ const struct refcounted_he *chain, SV *key, U32 hash, U32 flags);
+#define PERL_ARGS_ASSERT_REFCOUNTED_HE_FETCH_SV \
+        assert(key)
+
+PERL_CALLCONV void
+Perl_refcounted_he_free(pTHX_ struct refcounted_he *he);
 #define PERL_ARGS_ASSERT_REFCOUNTED_HE_FREE
-PERL_CALLCONV struct refcounted_he *   Perl_refcounted_he_inc(pTHX_ struct refcounted_he *he);
+
+PERL_CALLCONV struct refcounted_he *
+Perl_refcounted_he_inc(pTHX_ struct refcounted_he *he);
 #define PERL_ARGS_ASSERT_REFCOUNTED_HE_INC
-PERL_CALLCONV struct refcounted_he *   Perl_refcounted_he_new_pv(pTHX_ struct refcounted_he *parent, const char *key, U32 hash, SV *value, U32 flags);
-#define PERL_ARGS_ASSERT_REFCOUNTED_HE_NEW_PV  \
-       assert(key)
-PERL_CALLCONV struct refcounted_he *   Perl_refcounted_he_new_pvn(pTHX_ struct refcounted_he *parent, const char *keypv, STRLEN keylen, U32 hash, SV *value, U32 flags);
-#define PERL_ARGS_ASSERT_REFCOUNTED_HE_NEW_PVN \
-       assert(keypv)
-PERL_CALLCONV struct refcounted_he *   Perl_refcounted_he_new_sv(pTHX_ struct refcounted_he *parent, SV *key, U32 hash, SV *value, U32 flags);
-#define PERL_ARGS_ASSERT_REFCOUNTED_HE_NEW_SV  \
-       assert(key)
-PERL_CALLCONV SV*      Perl_reg_named_buff(pTHX_ REGEXP * const rx, SV * const key, SV * const value, const U32 flags);
-#define PERL_ARGS_ASSERT_REG_NAMED_BUFF        \
-       assert(rx)
-PERL_CALLCONV SV*      Perl_reg_named_buff_all(pTHX_ REGEXP * const rx, const U32 flags);
-#define PERL_ARGS_ASSERT_REG_NAMED_BUFF_ALL    \
-       assert(rx)
-PERL_CALLCONV bool     Perl_reg_named_buff_exists(pTHX_ REGEXP * const rx, SV * const key, const U32 flags);
-#define PERL_ARGS_ASSERT_REG_NAMED_BUFF_EXISTS \
-       assert(rx); assert(key)
-PERL_CALLCONV SV*      Perl_reg_named_buff_fetch(pTHX_ REGEXP * const rx, SV * const namesv, const U32 flags);
-#define PERL_ARGS_ASSERT_REG_NAMED_BUFF_FETCH  \
-       assert(rx); assert(namesv)
-PERL_CALLCONV SV*      Perl_reg_named_buff_firstkey(pTHX_ REGEXP * const rx, const U32 flags);
-#define PERL_ARGS_ASSERT_REG_NAMED_BUFF_FIRSTKEY       \
-       assert(rx)
-PERL_CALLCONV SV*      Perl_reg_named_buff_iter(pTHX_ REGEXP * const rx, const SV * const lastkey, const U32 flags);
-#define PERL_ARGS_ASSERT_REG_NAMED_BUFF_ITER   \
-       assert(rx)
-PERL_CALLCONV SV*      Perl_reg_named_buff_nextkey(pTHX_ REGEXP * const rx, const U32 flags);
-#define PERL_ARGS_ASSERT_REG_NAMED_BUFF_NEXTKEY        \
-       assert(rx)
-PERL_CALLCONV SV*      Perl_reg_named_buff_scalar(pTHX_ REGEXP * const rx, const U32 flags);
-#define PERL_ARGS_ASSERT_REG_NAMED_BUFF_SCALAR \
-       assert(rx)
-PERL_CALLCONV void     Perl_reg_numbered_buff_fetch(pTHX_ REGEXP * const rx, const I32 paren, SV * const sv);
-#define PERL_ARGS_ASSERT_REG_NUMBERED_BUFF_FETCH       \
-       assert(rx)
-PERL_CALLCONV I32      Perl_reg_numbered_buff_length(pTHX_ REGEXP * const rx, const SV * const sv, const I32 paren);
-#define PERL_ARGS_ASSERT_REG_NUMBERED_BUFF_LENGTH      \
-       assert(rx); assert(sv)
-PERL_CALLCONV void     Perl_reg_numbered_buff_store(pTHX_ REGEXP * const rx, const I32 paren, SV const * const value);
-#define PERL_ARGS_ASSERT_REG_NUMBERED_BUFF_STORE       \
-       assert(rx)
-PERL_CALLCONV SV*      Perl_reg_qr_package(pTHX_ REGEXP * const rx);
-#define PERL_ARGS_ASSERT_REG_QR_PACKAGE        \
-       assert(rx)
-PERL_CALLCONV REGEXP*  Perl_reg_temp_copy(pTHX_ REGEXP* dsv, REGEXP* ssv);
-#define PERL_ARGS_ASSERT_REG_TEMP_COPY \
-       assert(ssv)
-PERL_CALLCONV void     Perl_regdump(pTHX_ const regexp* r);
-#define PERL_ARGS_ASSERT_REGDUMP       \
-       assert(r)
-PERL_CALLCONV I32      Perl_regexec_flags(pTHX_ REGEXP *const rx, char *stringarg, char *strend, char *strbeg, SSize_t minend, SV *sv, void *data, U32 flags);
-#define PERL_ARGS_ASSERT_REGEXEC_FLAGS \
-       assert(rx); assert(stringarg); assert(strend); assert(strbeg); assert(sv)
-PERL_CALLCONV void     Perl_regfree_internal(pTHX_ REGEXP *const rx);
-#define PERL_ARGS_ASSERT_REGFREE_INTERNAL      \
-       assert(rx)
-PERL_CALLCONV void     Perl_reginitcolors(pTHX);
+
+PERL_CALLCONV struct refcounted_he *
+Perl_refcounted_he_new_pv(pTHX_ struct refcounted_he *parent, const char *key, U32 hash, SV *value, U32 flags);
+#define PERL_ARGS_ASSERT_REFCOUNTED_HE_NEW_PV   \
+        assert(key)
+
+PERL_CALLCONV struct refcounted_he *
+Perl_refcounted_he_new_pvn(pTHX_ struct refcounted_he *parent, const char *keypv, STRLEN keylen, U32 hash, SV *value, U32 flags);
+#define PERL_ARGS_ASSERT_REFCOUNTED_HE_NEW_PVN  \
+        assert(keypv)
+
+PERL_CALLCONV struct refcounted_he *
+Perl_refcounted_he_new_sv(pTHX_ struct refcounted_he *parent, SV *key, U32 hash, SV *value, U32 flags);
+#define PERL_ARGS_ASSERT_REFCOUNTED_HE_NEW_SV   \
+        assert(key)
+
+PERL_CALLCONV SV *
+Perl_reg_named_buff(pTHX_ REGEXP * const rx, SV * const key, SV * const value, const U32 flags);
+#define PERL_ARGS_ASSERT_REG_NAMED_BUFF         \
+        assert(rx)
+
+PERL_CALLCONV SV *
+Perl_reg_named_buff_all(pTHX_ REGEXP * const rx, const U32 flags);
+#define PERL_ARGS_ASSERT_REG_NAMED_BUFF_ALL     \
+        assert(rx)
+
+PERL_CALLCONV bool
+Perl_reg_named_buff_exists(pTHX_ REGEXP * const rx, SV * const key, const U32 flags);
+#define PERL_ARGS_ASSERT_REG_NAMED_BUFF_EXISTS  \
+        assert(rx); assert(key)
+
+PERL_CALLCONV SV *
+Perl_reg_named_buff_fetch(pTHX_ REGEXP * const rx, SV * const namesv, const U32 flags);
+#define PERL_ARGS_ASSERT_REG_NAMED_BUFF_FETCH   \
+        assert(rx); assert(namesv)
+
+PERL_CALLCONV SV *
+Perl_reg_named_buff_firstkey(pTHX_ REGEXP * const rx, const U32 flags);
+#define PERL_ARGS_ASSERT_REG_NAMED_BUFF_FIRSTKEY \
+        assert(rx)
+
+PERL_CALLCONV SV *
+Perl_reg_named_buff_iter(pTHX_ REGEXP * const rx, const SV * const lastkey, const U32 flags);
+#define PERL_ARGS_ASSERT_REG_NAMED_BUFF_ITER    \
+        assert(rx)
+
+PERL_CALLCONV SV *
+Perl_reg_named_buff_nextkey(pTHX_ REGEXP * const rx, const U32 flags);
+#define PERL_ARGS_ASSERT_REG_NAMED_BUFF_NEXTKEY \
+        assert(rx)
+
+PERL_CALLCONV SV *
+Perl_reg_named_buff_scalar(pTHX_ REGEXP * const rx, const U32 flags);
+#define PERL_ARGS_ASSERT_REG_NAMED_BUFF_SCALAR  \
+        assert(rx)
+
+PERL_CALLCONV void
+Perl_reg_numbered_buff_fetch(pTHX_ REGEXP * const re, const I32 paren, SV * const sv);
+#define PERL_ARGS_ASSERT_REG_NUMBERED_BUFF_FETCH \
+        assert(re)
+
+PERL_CALLCONV void
+Perl_reg_numbered_buff_fetch_flags(pTHX_ REGEXP * const re, const I32 paren, SV * const sv, U32 flags);
+#define PERL_ARGS_ASSERT_REG_NUMBERED_BUFF_FETCH_FLAGS \
+        assert(re)
+
+PERL_CALLCONV I32
+Perl_reg_numbered_buff_length(pTHX_ REGEXP * const rx, const SV * const sv, const I32 paren);
+#define PERL_ARGS_ASSERT_REG_NUMBERED_BUFF_LENGTH \
+        assert(rx); assert(sv)
+
+PERL_CALLCONV void
+Perl_reg_numbered_buff_store(pTHX_ REGEXP * const rx, const I32 paren, SV const * const value);
+#define PERL_ARGS_ASSERT_REG_NUMBERED_BUFF_STORE \
+        assert(rx)
+
+PERL_CALLCONV SV *
+Perl_reg_qr_package(pTHX_ REGEXP * const rx);
+#define PERL_ARGS_ASSERT_REG_QR_PACKAGE         \
+        assert(rx)
+
+PERL_CALLCONV REGEXP *
+Perl_reg_temp_copy(pTHX_ REGEXP *dsv, REGEXP *ssv);
+#define PERL_ARGS_ASSERT_REG_TEMP_COPY          \
+        assert(ssv)
+
+PERL_CALLCONV void
+Perl_regdump(pTHX_ const regexp *r);
+#define PERL_ARGS_ASSERT_REGDUMP                \
+        assert(r)
+
+PERL_CALLCONV I32
+Perl_regexec_flags(pTHX_ REGEXP * const rx, char *stringarg, char *strend, char *strbeg, SSize_t minend, SV *sv, void *data, U32 flags);
+#define PERL_ARGS_ASSERT_REGEXEC_FLAGS          \
+        assert(rx); assert(stringarg); assert(strend); assert(strbeg); assert(sv)
+
+PERL_CALLCONV void
+Perl_regfree_internal(pTHX_ REGEXP * const rx);
+#define PERL_ARGS_ASSERT_REGFREE_INTERNAL       \
+        assert(rx)
+
+PERL_CALLCONV void
+Perl_reginitcolors(pTHX);
 #define PERL_ARGS_ASSERT_REGINITCOLORS
-PERL_CALLCONV regnode* Perl_regnext(pTHX_ regnode* p)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_REGNEXT
-
-PERL_CALLCONV void     Perl_repeatcpy(char* to, const char* from, I32 len, IV count);
-#define PERL_ARGS_ASSERT_REPEATCPY     \
-       assert(to); assert(from)
-PERL_CALLCONV void     Perl_report_evil_fh(pTHX_ const GV *gv);
+
+PERL_CALLCONV void
+Perl_repeatcpy(char *to, const char *from, I32 len, IV count);
+#define PERL_ARGS_ASSERT_REPEATCPY              \
+        assert(to); assert(from)
+
+PERL_CALLCONV void
+Perl_report_evil_fh(pTHX_ const GV *gv)
+        __attribute__visibility__("hidden");
 #define PERL_ARGS_ASSERT_REPORT_EVIL_FH
-PERL_CALLCONV void     Perl_report_uninit(pTHX_ const SV *uninit_sv);
+
+PERL_CALLCONV void
+Perl_report_uninit(pTHX_ const SV *uninit_sv);
 #define PERL_ARGS_ASSERT_REPORT_UNINIT
-PERL_CALLCONV void     Perl_report_wrongway_fh(pTHX_ const GV *gv, const char have);
+
+PERL_CALLCONV void
+Perl_report_wrongway_fh(pTHX_ const GV *gv, const char have)
+        __attribute__visibility__("hidden");
 #define PERL_ARGS_ASSERT_REPORT_WRONGWAY_FH
-PERL_CALLCONV void     Perl_require_pv(pTHX_ const char* pv);
-#define PERL_ARGS_ASSERT_REQUIRE_PV    \
-       assert(pv)
-PERL_CALLCONV char*    Perl_rninstr(const char* big, const char* bigend, const char* little, const char* lend)
-                       __attribute__warn_unused_result__
-                       __attribute__pure__;
-#define PERL_ARGS_ASSERT_RNINSTR       \
-       assert(big); assert(bigend); assert(little); assert(lend)
-
-PERL_CALLCONV void     Perl_rpeep(pTHX_ OP* o);
+
+PERL_CALLCONV void
+Perl_require_pv(pTHX_ const char *pv);
+#define PERL_ARGS_ASSERT_REQUIRE_PV             \
+        assert(pv)
+
+PERL_CALLCONV void
+Perl_resume_compcv(pTHX_ struct suspended_compcv *buffer, bool save);
+#define PERL_ARGS_ASSERT_RESUME_COMPCV          \
+        assert(buffer)
+
+/* PERL_CALLCONV void
+resume_compcv_and_save(pTHX_ struct suspended_compcv *buffer); */
+
+/* PERL_CALLCONV void
+resume_compcv_final(pTHX_ struct suspended_compcv *buffer); */
+
+PERL_CALLCONV char *
+Perl_rninstr(const char *big, const char *bigend, const char *little, const char *lend)
+        __attribute__warn_unused_result__
+        __attribute__pure__;
+#define PERL_ARGS_ASSERT_RNINSTR                \
+        assert(big); assert(bigend); assert(little); assert(lend)
+
+PERL_CALLCONV void
+Perl_rpeep(pTHX_ OP *o)
+        __attribute__visibility__("hidden");
 #define PERL_ARGS_ASSERT_RPEEP
-PERL_CALLCONV Sighandler_t     Perl_rsignal(pTHX_ int i, Sighandler_t t);
+
+PERL_CALLCONV Sighandler_t
+Perl_rsignal(pTHX_ int i, Sighandler_t t);
 #define PERL_ARGS_ASSERT_RSIGNAL
-PERL_CALLCONV int      Perl_rsignal_restore(pTHX_ int i, Sigsave_t* t);
+
+PERL_CALLCONV int
+Perl_rsignal_restore(pTHX_ int i, Sigsave_t *t)
+        __attribute__visibility__("hidden");
 #define PERL_ARGS_ASSERT_RSIGNAL_RESTORE
-PERL_CALLCONV int      Perl_rsignal_save(pTHX_ int i, Sighandler_t t1, Sigsave_t* save);
-#define PERL_ARGS_ASSERT_RSIGNAL_SAVE  \
-       assert(save)
-PERL_CALLCONV Sighandler_t     Perl_rsignal_state(pTHX_ int i);
+
+PERL_CALLCONV int
+Perl_rsignal_save(pTHX_ int i, Sighandler_t t1, Sigsave_t *save)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_RSIGNAL_SAVE           \
+        assert(save)
+
+PERL_CALLCONV Sighandler_t
+Perl_rsignal_state(pTHX_ int i);
 #define PERL_ARGS_ASSERT_RSIGNAL_STATE
-PERL_CALLCONV int      Perl_runops_debug(pTHX);
+
+PERL_CALLCONV int
+Perl_runops_debug(pTHX);
 #define PERL_ARGS_ASSERT_RUNOPS_DEBUG
-PERL_CALLCONV int      Perl_runops_standard(pTHX);
+
+PERL_CALLCONV int
+Perl_runops_standard(pTHX);
 #define PERL_ARGS_ASSERT_RUNOPS_STANDARD
-PERL_CALLCONV CV*      Perl_rv2cv_op_cv(pTHX_ OP *cvop, U32 flags);
-#define PERL_ARGS_ASSERT_RV2CV_OP_CV   \
-       assert(cvop)
-PERL_CALLCONV void     Perl_rxres_save(pTHX_ void **rsp, REGEXP *rx);
-#define PERL_ARGS_ASSERT_RXRES_SAVE    \
-       assert(rsp); assert(rx)
-PERL_CALLCONV Malloc_t Perl_safesyscalloc(MEM_SIZE elements, MEM_SIZE size)
-                       __attribute__malloc__
-                       __attribute__warn_unused_result__;
+
+PERL_CALLCONV CV *
+Perl_rv2cv_op_cv(pTHX_ OP *cvop, U32 flags);
+#define PERL_ARGS_ASSERT_RV2CV_OP_CV            \
+        assert(cvop)
+
+PERL_CALLCONV void
+Perl_rxres_save(pTHX_ void **rsp, REGEXP *rx)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_RXRES_SAVE             \
+        assert(rsp); assert(rx)
+
+PERL_CALLCONV Malloc_t
+Perl_safesyscalloc(MEM_SIZE elements, MEM_SIZE size)
+        __attribute__malloc__
+        __attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_SAFESYSCALLOC
 
-PERL_CALLCONV Free_t   Perl_safesysfree(Malloc_t where);
+PERL_CALLCONV Free_t
+Perl_safesysfree(Malloc_t where);
 #define PERL_ARGS_ASSERT_SAFESYSFREE
-PERL_CALLCONV Malloc_t Perl_safesysmalloc(MEM_SIZE nbytes)
-                       __attribute__malloc__
-                       __attribute__warn_unused_result__;
+
+PERL_CALLCONV Malloc_t
+Perl_safesysmalloc(MEM_SIZE nbytes)
+        __attribute__malloc__
+        __attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_SAFESYSMALLOC
 
-PERL_CALLCONV Malloc_t Perl_safesysrealloc(Malloc_t where, MEM_SIZE nbytes)
-                       __attribute__warn_unused_result__;
+PERL_CALLCONV Malloc_t
+Perl_safesysrealloc(Malloc_t where, MEM_SIZE nbytes)
+        __attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_SAFESYSREALLOC
 
-PERL_CALLCONV void     Perl_save_I16(pTHX_ I16* intp);
-#define PERL_ARGS_ASSERT_SAVE_I16      \
-       assert(intp)
-PERL_CALLCONV void     Perl_save_I32(pTHX_ I32* intp);
-#define PERL_ARGS_ASSERT_SAVE_I32      \
-       assert(intp)
-PERL_CALLCONV void     Perl_save_I8(pTHX_ I8* bytep);
-#define PERL_ARGS_ASSERT_SAVE_I8       \
-       assert(bytep)
-PERL_CALLCONV void     Perl_save_adelete(pTHX_ AV *av, SSize_t key);
-#define PERL_ARGS_ASSERT_SAVE_ADELETE  \
-       assert(av)
-/* PERL_CALLCONV void  save_aelem(pTHX_ AV* av, SSize_t idx, SV **sptr); */
-#define PERL_ARGS_ASSERT_SAVE_AELEM
-PERL_CALLCONV void     Perl_save_aelem_flags(pTHX_ AV* av, SSize_t idx, SV **sptr, const U32 flags);
-#define PERL_ARGS_ASSERT_SAVE_AELEM_FLAGS      \
-       assert(av); assert(sptr)
-PERL_CALLCONV I32      Perl_save_alloc(pTHX_ I32 size, I32 pad);
+PERL_CALLCONV void
+Perl_save_I16(pTHX_ I16 *intp);
+#define PERL_ARGS_ASSERT_SAVE_I16               \
+        assert(intp)
+
+PERL_CALLCONV void
+Perl_save_I32(pTHX_ I32 *intp);
+#define PERL_ARGS_ASSERT_SAVE_I32               \
+        assert(intp)
+
+PERL_CALLCONV void
+Perl_save_I8(pTHX_ I8 *bytep);
+#define PERL_ARGS_ASSERT_SAVE_I8                \
+        assert(bytep)
+
+PERL_CALLCONV void
+Perl_save_adelete(pTHX_ AV *av, SSize_t key);
+#define PERL_ARGS_ASSERT_SAVE_ADELETE           \
+        assert(av)
+
+/* PERL_CALLCONV void
+save_aelem(pTHX_ AV *av, SSize_t idx, SV **sptr); */
+
+PERL_CALLCONV void
+Perl_save_aelem_flags(pTHX_ AV *av, SSize_t idx, SV **sptr, const U32 flags);
+#define PERL_ARGS_ASSERT_SAVE_AELEM_FLAGS       \
+        assert(av); assert(sptr)
+
+PERL_CALLCONV SSize_t
+Perl_save_alloc(pTHX_ SSize_t size, I32 pad);
 #define PERL_ARGS_ASSERT_SAVE_ALLOC
-PERL_CALLCONV void     Perl_save_aptr(pTHX_ AV** aptr);
-#define PERL_ARGS_ASSERT_SAVE_APTR     \
-       assert(aptr)
-PERL_CALLCONV AV*      Perl_save_ary(pTHX_ GV* gv);
-#define PERL_ARGS_ASSERT_SAVE_ARY      \
-       assert(gv)
-PERL_CALLCONV void     Perl_save_bool(pTHX_ bool* boolp);
-#define PERL_ARGS_ASSERT_SAVE_BOOL     \
-       assert(boolp)
-PERL_CALLCONV void     Perl_save_clearsv(pTHX_ SV** svp);
-#define PERL_ARGS_ASSERT_SAVE_CLEARSV  \
-       assert(svp)
-PERL_CALLCONV void     Perl_save_delete(pTHX_ HV *hv, char *key, I32 klen);
-#define PERL_ARGS_ASSERT_SAVE_DELETE   \
-       assert(hv); assert(key)
-PERL_CALLCONV void     Perl_save_destructor(pTHX_ DESTRUCTORFUNC_NOCONTEXT_t f, void* p);
-#define PERL_ARGS_ASSERT_SAVE_DESTRUCTOR       \
-       assert(p)
-PERL_CALLCONV void     Perl_save_destructor_x(pTHX_ DESTRUCTORFUNC_t f, void* p);
+
+PERL_CALLCONV void
+Perl_save_aptr(pTHX_ AV **aptr);
+#define PERL_ARGS_ASSERT_SAVE_APTR              \
+        assert(aptr)
+
+PERL_CALLCONV AV *
+Perl_save_ary(pTHX_ GV *gv);
+#define PERL_ARGS_ASSERT_SAVE_ARY               \
+        assert(gv)
+
+PERL_CALLCONV void
+Perl_save_bool(pTHX_ bool *boolp);
+#define PERL_ARGS_ASSERT_SAVE_BOOL              \
+        assert(boolp)
+
+PERL_CALLCONV void
+Perl_save_clearsv(pTHX_ SV **svp);
+#define PERL_ARGS_ASSERT_SAVE_CLEARSV           \
+        assert(svp)
+
+PERL_CALLCONV void
+Perl_save_delete(pTHX_ HV *hv, char *key, I32 klen);
+#define PERL_ARGS_ASSERT_SAVE_DELETE            \
+        assert(hv); assert(key)
+
+PERL_CALLCONV void
+Perl_save_destructor(pTHX_ DESTRUCTORFUNC_NOCONTEXT_t f, void *p);
+#define PERL_ARGS_ASSERT_SAVE_DESTRUCTOR        \
+        assert(p)
+
+PERL_CALLCONV void
+Perl_save_destructor_x(pTHX_ DESTRUCTORFUNC_t f, void *p);
 #define PERL_ARGS_ASSERT_SAVE_DESTRUCTOR_X
-#ifndef NO_MATHOMS
-PERL_CALLCONV void     Perl_save_freeop(pTHX_ OP* o);
-#define PERL_ARGS_ASSERT_SAVE_FREEOP
-#endif
-#ifndef NO_MATHOMS
-PERL_CALLCONV void     Perl_save_freepv(pTHX_ char* pv);
-#define PERL_ARGS_ASSERT_SAVE_FREEPV
-#endif
-#ifndef NO_MATHOMS
-PERL_CALLCONV void     Perl_save_freesv(pTHX_ SV* sv);
-#define PERL_ARGS_ASSERT_SAVE_FREESV
-#endif
-PERL_CALLCONV void     Perl_save_generic_pvref(pTHX_ char** str);
-#define PERL_ARGS_ASSERT_SAVE_GENERIC_PVREF    \
-       assert(str)
-PERL_CALLCONV void     Perl_save_generic_svref(pTHX_ SV** sptr);
-#define PERL_ARGS_ASSERT_SAVE_GENERIC_SVREF    \
-       assert(sptr)
-PERL_CALLCONV void     Perl_save_gp(pTHX_ GV* gv, I32 empty);
-#define PERL_ARGS_ASSERT_SAVE_GP       \
-       assert(gv)
-PERL_CALLCONV HV*      Perl_save_hash(pTHX_ GV* gv);
-#define PERL_ARGS_ASSERT_SAVE_HASH     \
-       assert(gv)
-PERL_CALLCONV void     Perl_save_hdelete(pTHX_ HV *hv, SV *keysv);
-#define PERL_ARGS_ASSERT_SAVE_HDELETE  \
-       assert(hv); assert(keysv)
-/* PERL_CALLCONV void  save_helem(pTHX_ HV *hv, SV *key, SV **sptr); */
-#define PERL_ARGS_ASSERT_SAVE_HELEM
-PERL_CALLCONV void     Perl_save_helem_flags(pTHX_ HV *hv, SV *key, SV **sptr, const U32 flags);
-#define PERL_ARGS_ASSERT_SAVE_HELEM_FLAGS      \
-       assert(hv); assert(key); assert(sptr)
-PERL_CALLCONV void     Perl_save_hints(pTHX);
+
+PERL_CALLCONV void
+Perl_save_freercpv(pTHX_ char *rcpv);
+#define PERL_ARGS_ASSERT_SAVE_FREERCPV          \
+        assert(rcpv)
+
+PERL_CALLCONV void
+Perl_save_generic_pvref(pTHX_ char **str);
+#define PERL_ARGS_ASSERT_SAVE_GENERIC_PVREF     \
+        assert(str)
+
+PERL_CALLCONV void
+Perl_save_generic_svref(pTHX_ SV **sptr);
+#define PERL_ARGS_ASSERT_SAVE_GENERIC_SVREF     \
+        assert(sptr)
+
+PERL_CALLCONV void
+Perl_save_gp(pTHX_ GV *gv, I32 empty);
+#define PERL_ARGS_ASSERT_SAVE_GP                \
+        assert(gv)
+
+PERL_CALLCONV HV *
+Perl_save_hash(pTHX_ GV *gv);
+#define PERL_ARGS_ASSERT_SAVE_HASH              \
+        assert(gv)
+
+PERL_CALLCONV void
+Perl_save_hdelete(pTHX_ HV *hv, SV *keysv);
+#define PERL_ARGS_ASSERT_SAVE_HDELETE           \
+        assert(hv); assert(keysv)
+
+/* PERL_CALLCONV void
+save_helem(pTHX_ HV *hv, SV *key, SV **sptr); */
+
+PERL_CALLCONV void
+Perl_save_helem_flags(pTHX_ HV *hv, SV *key, SV **sptr, const U32 flags);
+#define PERL_ARGS_ASSERT_SAVE_HELEM_FLAGS       \
+        assert(hv); assert(key); assert(sptr)
+
+PERL_CALLCONV void
+Perl_save_hints(pTHX);
 #define PERL_ARGS_ASSERT_SAVE_HINTS
-PERL_CALLCONV void     Perl_save_hptr(pTHX_ HV** hptr);
-#define PERL_ARGS_ASSERT_SAVE_HPTR     \
-       assert(hptr)
-PERL_CALLCONV void     Perl_save_int(pTHX_ int* intp);
-#define PERL_ARGS_ASSERT_SAVE_INT      \
-       assert(intp)
-PERL_CALLCONV void     Perl_save_item(pTHX_ SV* item);
-#define PERL_ARGS_ASSERT_SAVE_ITEM     \
-       assert(item)
-PERL_CALLCONV void     Perl_save_iv(pTHX_ IV *ivp);
-#define PERL_ARGS_ASSERT_SAVE_IV       \
-       assert(ivp)
-#ifndef NO_MATHOMS
-PERL_CALLCONV void     Perl_save_list(pTHX_ SV** sarg, I32 maxsarg)
-                       __attribute__deprecated__;
-#define PERL_ARGS_ASSERT_SAVE_LIST     \
-       assert(sarg)
-#endif
 
-#ifndef NO_MATHOMS
-PERL_CALLCONV void     Perl_save_long(pTHX_ long* longp)
-                       __attribute__deprecated__;
-#define PERL_ARGS_ASSERT_SAVE_LONG     \
-       assert(longp)
-#endif
+PERL_CALLCONV void
+Perl_save_hptr(pTHX_ HV **hptr);
+#define PERL_ARGS_ASSERT_SAVE_HPTR              \
+        assert(hptr)
 
-#ifndef NO_MATHOMS
-PERL_CALLCONV void     Perl_save_mortalizesv(pTHX_ SV* sv);
-#define PERL_ARGS_ASSERT_SAVE_MORTALIZESV      \
-       assert(sv)
-#endif
-#ifndef NO_MATHOMS
-PERL_CALLCONV void     Perl_save_nogv(pTHX_ GV* gv)
-                       __attribute__deprecated__;
-#define PERL_ARGS_ASSERT_SAVE_NOGV     \
-       assert(gv)
-#endif
+PERL_CALLCONV void
+Perl_save_int(pTHX_ int *intp);
+#define PERL_ARGS_ASSERT_SAVE_INT               \
+        assert(intp)
 
-#ifndef NO_MATHOMS
-PERL_CALLCONV void     Perl_save_op(pTHX);
-#define PERL_ARGS_ASSERT_SAVE_OP
-#endif
-PERL_CALLCONV void     Perl_save_padsv_and_mortalize(pTHX_ PADOFFSET off);
+PERL_CALLCONV void
+Perl_save_item(pTHX_ SV *item);
+#define PERL_ARGS_ASSERT_SAVE_ITEM              \
+        assert(item)
+
+PERL_CALLCONV void
+Perl_save_iv(pTHX_ IV *ivp);
+#define PERL_ARGS_ASSERT_SAVE_IV                \
+        assert(ivp)
+
+PERL_CALLCONV void
+Perl_save_padsv_and_mortalize(pTHX_ PADOFFSET off);
 #define PERL_ARGS_ASSERT_SAVE_PADSV_AND_MORTALIZE
-PERL_CALLCONV void     Perl_save_pptr(pTHX_ char** pptr);
-#define PERL_ARGS_ASSERT_SAVE_PPTR     \
-       assert(pptr)
-PERL_CALLCONV void     Perl_save_pushi32ptr(pTHX_ const I32 i, void *const ptr, const int type);
+
+PERL_CALLCONV void
+Perl_save_pptr(pTHX_ char **pptr);
+#define PERL_ARGS_ASSERT_SAVE_PPTR              \
+        assert(pptr)
+
+PERL_CALLCONV void
+Perl_save_pushi32ptr(pTHX_ const I32 i, void * const ptr, const int type);
 #define PERL_ARGS_ASSERT_SAVE_PUSHI32PTR
-PERL_CALLCONV void     Perl_save_pushptr(pTHX_ void *const ptr, const int type);
+
+PERL_CALLCONV void
+Perl_save_pushptr(pTHX_ void * const ptr, const int type);
 #define PERL_ARGS_ASSERT_SAVE_PUSHPTR
-PERL_CALLCONV void     Perl_save_pushptrptr(pTHX_ void *const ptr1, void *const ptr2, const int type);
+
+PERL_CALLCONV void
+Perl_save_pushptrptr(pTHX_ void * const ptr1, void * const ptr2, const int type);
 #define PERL_ARGS_ASSERT_SAVE_PUSHPTRPTR
-PERL_CALLCONV void     Perl_save_re_context(pTHX);
+
+PERL_CALLCONV void
+Perl_save_rcpv(pTHX_ char **prcpv);
+#define PERL_ARGS_ASSERT_SAVE_RCPV              \
+        assert(prcpv)
+
+PERL_CALLCONV void
+Perl_save_re_context(pTHX);
 #define PERL_ARGS_ASSERT_SAVE_RE_CONTEXT
-PERL_CALLCONV SV*      Perl_save_scalar(pTHX_ GV* gv);
-#define PERL_ARGS_ASSERT_SAVE_SCALAR   \
-       assert(gv)
-PERL_CALLCONV void     Perl_save_set_svflags(pTHX_ SV *sv, U32 mask, U32 val);
-#define PERL_ARGS_ASSERT_SAVE_SET_SVFLAGS      \
-       assert(sv)
-PERL_CALLCONV void     Perl_save_shared_pvref(pTHX_ char** str);
-#define PERL_ARGS_ASSERT_SAVE_SHARED_PVREF     \
-       assert(str)
-PERL_CALLCONV void     Perl_save_sptr(pTHX_ SV** sptr);
-#define PERL_ARGS_ASSERT_SAVE_SPTR     \
-       assert(sptr)
-PERL_CALLCONV void     Perl_save_strlen(pTHX_ STRLEN* ptr);
-#define PERL_ARGS_ASSERT_SAVE_STRLEN   \
-       assert(ptr)
-PERL_CALLCONV SV*      Perl_save_svref(pTHX_ SV** sptr);
-#define PERL_ARGS_ASSERT_SAVE_SVREF    \
-       assert(sptr)
-PERL_CALLCONV void     Perl_save_vptr(pTHX_ void *ptr);
-#define PERL_ARGS_ASSERT_SAVE_VPTR     \
-       assert(ptr)
-PERL_CALLCONV char*    Perl_savepv(pTHX_ const char* pv)
-                       __attribute__malloc__
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_SAVEPV
-
-PERL_CALLCONV char*    Perl_savepvn(pTHX_ const char* pv, Size_t len)
-                       __attribute__malloc__
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_SAVEPVN
-
-PERL_CALLCONV char*    Perl_savesharedpv(pTHX_ const char* pv)
-                       __attribute__malloc__
-                       __attribute__warn_unused_result__;
+
+PERL_CALLCONV SV *
+Perl_save_scalar(pTHX_ GV *gv);
+#define PERL_ARGS_ASSERT_SAVE_SCALAR            \
+        assert(gv)
+
+PERL_CALLCONV void
+Perl_save_set_svflags(pTHX_ SV *sv, U32 mask, U32 val);
+#define PERL_ARGS_ASSERT_SAVE_SET_SVFLAGS       \
+        assert(sv)
+
+PERL_CALLCONV void
+Perl_save_shared_pvref(pTHX_ char **str);
+#define PERL_ARGS_ASSERT_SAVE_SHARED_PVREF      \
+        assert(str)
+
+PERL_CALLCONV void
+Perl_save_sptr(pTHX_ SV **sptr);
+#define PERL_ARGS_ASSERT_SAVE_SPTR              \
+        assert(sptr)
+
+PERL_CALLCONV void
+Perl_save_strlen(pTHX_ STRLEN *ptr);
+#define PERL_ARGS_ASSERT_SAVE_STRLEN            \
+        assert(ptr)
+
+PERL_CALLCONV SV *
+Perl_save_svref(pTHX_ SV **sptr);
+#define PERL_ARGS_ASSERT_SAVE_SVREF             \
+        assert(sptr)
+
+PERL_CALLCONV void
+Perl_save_vptr(pTHX_ void *ptr);
+#define PERL_ARGS_ASSERT_SAVE_VPTR              \
+        assert(ptr)
+
+PERL_CALLCONV char *
+Perl_savesharedpv(pTHX_ const char *pv)
+        __attribute__malloc__
+        __attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_SAVESHAREDPV
 
-PERL_CALLCONV char*    Perl_savesharedpvn(pTHX_ const char *const pv, const STRLEN len)
-                       __attribute__malloc__
-                       __attribute__warn_unused_result__;
+PERL_CALLCONV char *
+Perl_savesharedpvn(pTHX_ const char * const pv, const STRLEN len)
+        __attribute__malloc__
+        __attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_SAVESHAREDPVN
 
-PERL_CALLCONV char*    Perl_savesharedsvpv(pTHX_ SV *sv)
-                       __attribute__malloc__
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_SAVESHAREDSVPV        \
-       assert(sv)
-
-PERL_CALLCONV void     Perl_savestack_grow(pTHX);
+PERL_CALLCONV void
+Perl_savestack_grow(pTHX);
 #define PERL_ARGS_ASSERT_SAVESTACK_GROW
-PERL_CALLCONV void     Perl_savestack_grow_cnt(pTHX_ I32 need);
+
+PERL_CALLCONV void
+Perl_savestack_grow_cnt(pTHX_ I32 need);
 #define PERL_ARGS_ASSERT_SAVESTACK_GROW_CNT
-PERL_CALLCONV char*    Perl_savesvpv(pTHX_ SV* sv)
-                       __attribute__malloc__
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_SAVESVPV      \
-       assert(sv)
 
-PERL_CALLCONV void     Perl_savetmps(pTHX);
+PERL_CALLCONV void
+Perl_savetmps(pTHX);
 #define PERL_ARGS_ASSERT_SAVETMPS
-PERL_CALLCONV OP*      Perl_sawparens(pTHX_ OP* o);
+
+PERL_CALLCONV OP *
+Perl_sawparens(pTHX_ OP *o)
+        __attribute__visibility__("hidden");
 #define PERL_ARGS_ASSERT_SAWPARENS
-PERL_CALLCONV OP*      Perl_scalar(pTHX_ OP* o);
+
+PERL_CALLCONV OP *
+Perl_scalar(pTHX_ OP *o)
+        __attribute__visibility__("hidden");
 #define PERL_ARGS_ASSERT_SCALAR
-PERL_CALLCONV OP*      Perl_scalarvoid(pTHX_ OP* o);
-#define PERL_ARGS_ASSERT_SCALARVOID    \
-       assert(o)
-PERL_CALLCONV NV       Perl_scan_bin(pTHX_ const char* start, STRLEN len, STRLEN* retlen);
-#define PERL_ARGS_ASSERT_SCAN_BIN      \
-       assert(start); assert(retlen)
-PERL_CALLCONV NV       Perl_scan_hex(pTHX_ const char* start, STRLEN len, STRLEN* retlen);
-#define PERL_ARGS_ASSERT_SCAN_HEX      \
-       assert(start); assert(retlen)
-PERL_CALLCONV char*    Perl_scan_num(pTHX_ const char* s, YYSTYPE *lvalp);
-#define PERL_ARGS_ASSERT_SCAN_NUM      \
-       assert(s); assert(lvalp)
-PERL_CALLCONV NV       Perl_scan_oct(pTHX_ const char* start, STRLEN len, STRLEN* retlen);
-#define PERL_ARGS_ASSERT_SCAN_OCT      \
-       assert(start); assert(retlen)
-PERL_CALLCONV char*    Perl_scan_str(pTHX_ char *start, int keep_quoted, int keep_delims, int re_reparse, char **delimp)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_SCAN_STR      \
-       assert(start)
-
-PERL_CALLCONV const char*      Perl_scan_version(pTHX_ const char *s, SV *rv, bool qv);
-#define PERL_ARGS_ASSERT_SCAN_VERSION  \
-       assert(s); assert(rv)
-PERL_CALLCONV char*    Perl_scan_vstring(pTHX_ const char *s, const char *const e, SV *sv);
-#define PERL_ARGS_ASSERT_SCAN_VSTRING  \
-       assert(s); assert(e); assert(sv)
-PERL_CALLCONV char*    Perl_scan_word(pTHX_ char *s, char *dest, STRLEN destlen, int allow_package, STRLEN *slp);
-#define PERL_ARGS_ASSERT_SCAN_WORD     \
-       assert(s); assert(dest); assert(slp)
-PERL_CALLCONV U32      Perl_seed(pTHX);
+
+PERL_CALLCONV OP *
+Perl_scalarvoid(pTHX_ OP *o)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_SCALARVOID             \
+        assert(o)
+
+PERL_CALLCONV NV
+Perl_scan_bin(pTHX_ const char *start, STRLEN len, STRLEN *retlen);
+#define PERL_ARGS_ASSERT_SCAN_BIN               \
+        assert(start); assert(retlen)
+
+PERL_CALLCONV NV
+Perl_scan_hex(pTHX_ const char *start, STRLEN len, STRLEN *retlen);
+#define PERL_ARGS_ASSERT_SCAN_HEX               \
+        assert(start); assert(retlen)
+
+PERL_CALLCONV char *
+Perl_scan_num(pTHX_ const char *s, YYSTYPE *lvalp);
+#define PERL_ARGS_ASSERT_SCAN_NUM               \
+        assert(s); assert(lvalp)
+
+PERL_CALLCONV NV
+Perl_scan_oct(pTHX_ const char *start, STRLEN len, STRLEN *retlen);
+#define PERL_ARGS_ASSERT_SCAN_OCT               \
+        assert(start); assert(retlen)
+
+PERL_CALLCONV char *
+Perl_scan_str(pTHX_ char *start, int keep_quoted, int keep_delims, int re_reparse, char **delimp)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_SCAN_STR               \
+        assert(start)
+
+PERL_CALLCONV const char *
+Perl_scan_version(pTHX_ const char *s, SV *rv, bool qv);
+#define PERL_ARGS_ASSERT_SCAN_VERSION           \
+        assert(s); assert(rv)
+
+PERL_CALLCONV char *
+Perl_scan_vstring(pTHX_ const char *s, const char * const e, SV *sv);
+#define PERL_ARGS_ASSERT_SCAN_VSTRING           \
+        assert(s); assert(e); assert(sv)
+
+PERL_CALLCONV char *
+Perl_scan_word(pTHX_ char *s, char *dest, STRLEN destlen, int allow_package, STRLEN *slp);
+#define PERL_ARGS_ASSERT_SCAN_WORD              \
+        assert(s); assert(dest); assert(slp)
+
+PERL_CALLCONV char *
+Perl_scan_word6(pTHX_ char *s, char *dest, STRLEN destlen, int allow_package, STRLEN *slp, bool warn_tick);
+#define PERL_ARGS_ASSERT_SCAN_WORD6             \
+        assert(s); assert(dest); assert(slp)
+
+PERL_CALLCONV U32
+Perl_seed(pTHX);
 #define PERL_ARGS_ASSERT_SEED
-PERL_CALLCONV void     Perl_set_caret_X(pTHX);
+
+PERL_CALLCONV void
+Perl_set_caret_X(pTHX);
 #define PERL_ARGS_ASSERT_SET_CARET_X
-PERL_CALLCONV void     Perl_set_context(void *t);
-#define PERL_ARGS_ASSERT_SET_CONTEXT   \
-       assert(t)
-PERL_CALLCONV void     Perl_set_numeric_standard(pTHX);
+
+PERL_CALLCONV void
+Perl_set_context(void *t);
+#define PERL_ARGS_ASSERT_SET_CONTEXT            \
+        assert(t)
+
+PERL_CALLCONV void
+Perl_set_numeric_standard(pTHX);
 #define PERL_ARGS_ASSERT_SET_NUMERIC_STANDARD
-PERL_CALLCONV void     Perl_set_numeric_underlying(pTHX);
+
+PERL_CALLCONV void
+Perl_set_numeric_underlying(pTHX);
 #define PERL_ARGS_ASSERT_SET_NUMERIC_UNDERLYING
-PERL_CALLCONV void     Perl_setdefout(pTHX_ GV* gv);
-#define PERL_ARGS_ASSERT_SETDEFOUT     \
-       assert(gv)
-PERL_CALLCONV void     Perl_setfd_cloexec(int fd);
+
+PERL_CALLCONV void
+Perl_setdefout(pTHX_ GV *gv);
+#define PERL_ARGS_ASSERT_SETDEFOUT              \
+        assert(gv)
+
+PERL_CALLCONV void
+Perl_setfd_cloexec(int fd)
+        __attribute__visibility__("hidden");
 #define PERL_ARGS_ASSERT_SETFD_CLOEXEC
-PERL_CALLCONV void     Perl_setfd_cloexec_for_nonsysfd(pTHX_ int fd);
+
+PERL_CALLCONV void
+Perl_setfd_cloexec_for_nonsysfd(pTHX_ int fd)
+        __attribute__visibility__("hidden");
 #define PERL_ARGS_ASSERT_SETFD_CLOEXEC_FOR_NONSYSFD
-PERL_CALLCONV void     Perl_setfd_cloexec_or_inhexec_by_sysfdness(pTHX_ int fd);
+
+PERL_CALLCONV void
+Perl_setfd_cloexec_or_inhexec_by_sysfdness(pTHX_ int fd)
+        __attribute__visibility__("hidden");
 #define PERL_ARGS_ASSERT_SETFD_CLOEXEC_OR_INHEXEC_BY_SYSFDNESS
-PERL_CALLCONV void     Perl_setfd_inhexec(int fd);
+
+PERL_CALLCONV void
+Perl_setfd_inhexec(int fd)
+        __attribute__visibility__("hidden");
 #define PERL_ARGS_ASSERT_SETFD_INHEXEC
-PERL_CALLCONV void     Perl_setfd_inhexec_for_sysfd(pTHX_ int fd);
+
+PERL_CALLCONV void
+Perl_setfd_inhexec_for_sysfd(pTHX_ int fd)
+        __attribute__visibility__("hidden");
 #define PERL_ARGS_ASSERT_SETFD_INHEXEC_FOR_SYSFD
-PERL_CALLCONV HEK*     Perl_share_hek(pTHX_ const char* str, SSize_t len, U32 hash);
-#define PERL_ARGS_ASSERT_SHARE_HEK     \
-       assert(str)
-PERL_CALLCONV Signal_t Perl_sighandler1(int sig);
+
+PERL_CALLCONV HEK *
+Perl_share_hek(pTHX_ const char *str, SSize_t len, U32 hash);
+#define PERL_ARGS_ASSERT_SHARE_HEK              \
+        assert(str)
+
+PERL_CALLCONV Signal_t
+Perl_sighandler1(int sig)
+        __attribute__visibility__("hidden");
 #define PERL_ARGS_ASSERT_SIGHANDLER1
-PERL_CALLCONV Signal_t Perl_sighandler3(int sig, Siginfo_t *info, void *uap);
+
+PERL_CALLCONV Signal_t
+Perl_sighandler3(int sig, Siginfo_t *info, void *uap)
+        __attribute__visibility__("hidden");
 #define PERL_ARGS_ASSERT_SIGHANDLER3
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE unsigned    Perl_single_1bit_pos32(U32 word)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_SINGLE_1BIT_POS32
-#endif
 
-PERL_CALLCONV char*    Perl_skipspace_flags(pTHX_ char *s, U32 flags)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_SKIPSPACE_FLAGS       \
-       assert(s)
-
-PERL_CALLCONV void     Perl_sortsv(pTHX_ SV** array, size_t num_elts, SVCOMPARE_t cmp);
-#define PERL_ARGS_ASSERT_SORTSV        \
-       assert(cmp)
-PERL_CALLCONV void     Perl_sortsv_flags(pTHX_ SV** array, size_t num_elts, SVCOMPARE_t cmp, U32 flags);
-#define PERL_ARGS_ASSERT_SORTSV_FLAGS  \
-       assert(cmp)
-PERL_CALLCONV SV**     Perl_stack_grow(pTHX_ SV** sp, SV** p, SSize_t n);
-#define PERL_ARGS_ASSERT_STACK_GROW    \
-       assert(sp); assert(p)
-PERL_CALLCONV PerlIO*  Perl_start_glob(pTHX_ SV *tmpglob, IO *io);
-#define PERL_ARGS_ASSERT_START_GLOB    \
-       assert(tmpglob); assert(io)
-PERL_CALLCONV I32      Perl_start_subparse(pTHX_ I32 is_format, U32 flags);
+PERL_CALLCONV char *
+Perl_skipspace_flags(pTHX_ char *s, U32 flags)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_SKIPSPACE_FLAGS        \
+        assert(s)
+
+PERL_CALLCONV void
+Perl_sortsv(pTHX_ SV **array, size_t num_elts, SVCOMPARE_t cmp);
+#define PERL_ARGS_ASSERT_SORTSV                 \
+        assert(cmp)
+
+PERL_CALLCONV void
+Perl_sortsv_flags(pTHX_ SV **array, size_t num_elts, SVCOMPARE_t cmp, U32 flags);
+#define PERL_ARGS_ASSERT_SORTSV_FLAGS           \
+        assert(cmp)
+
+PERL_CALLCONV SV **
+Perl_stack_grow(pTHX_ SV **sp, SV **p, SSize_t n);
+#define PERL_ARGS_ASSERT_STACK_GROW             \
+        assert(sp); assert(p)
+
+PERL_CALLCONV PerlIO *
+Perl_start_glob(pTHX_ SV *tmpglob, IO *io)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_START_GLOB             \
+        assert(tmpglob); assert(io)
+
+PERL_CALLCONV I32
+Perl_start_subparse(pTHX_ I32 is_format, U32 flags);
 #define PERL_ARGS_ASSERT_START_SUBPARSE
-PERL_CALLCONV NV       Perl_str_to_version(pTHX_ SV *sv)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_STR_TO_VERSION        \
-       assert(sv)
-
-PERL_CALLCONV void     Perl_sub_crush_depth(pTHX_ CV* cv);
-#define PERL_ARGS_ASSERT_SUB_CRUSH_DEPTH       \
-       assert(cv)
-#ifndef NO_MATHOMS
-PERL_CALLCONV bool     Perl_sv_2bool(pTHX_ SV *const sv);
-#define PERL_ARGS_ASSERT_SV_2BOOL      \
-       assert(sv)
-#endif
-PERL_CALLCONV bool     Perl_sv_2bool_flags(pTHX_ SV *sv, I32 flags);
-#define PERL_ARGS_ASSERT_SV_2BOOL_FLAGS        \
-       assert(sv)
-PERL_CALLCONV CV*      Perl_sv_2cv(pTHX_ SV* sv, HV **const st, GV **const gvp, const I32 lref);
-#define PERL_ARGS_ASSERT_SV_2CV        \
-       assert(st); assert(gvp)
-PERL_CALLCONV IO*      Perl_sv_2io(pTHX_ SV *const sv);
-#define PERL_ARGS_ASSERT_SV_2IO        \
-       assert(sv)
-#ifndef NO_MATHOMS
-PERL_CALLCONV IV       Perl_sv_2iv(pTHX_ SV *sv);
-#define PERL_ARGS_ASSERT_SV_2IV        \
-       assert(sv)
-#endif
-PERL_CALLCONV IV       Perl_sv_2iv_flags(pTHX_ SV *const sv, const I32 flags);
-#define PERL_ARGS_ASSERT_SV_2IV_FLAGS  \
-       assert(sv)
-PERL_CALLCONV SV*      Perl_sv_2mortal(pTHX_ SV *const sv);
-#define PERL_ARGS_ASSERT_SV_2MORTAL
-PERL_CALLCONV SV*      Perl_sv_2num(pTHX_ SV *const sv);
-#define PERL_ARGS_ASSERT_SV_2NUM       \
-       assert(sv)
-PERL_CALLCONV NV       Perl_sv_2nv_flags(pTHX_ SV *const sv, const I32 flags);
-#define PERL_ARGS_ASSERT_SV_2NV_FLAGS  \
-       assert(sv)
-#ifndef NO_MATHOMS
-PERL_CALLCONV char*    Perl_sv_2pv(pTHX_ SV *sv, STRLEN *lp);
-#define PERL_ARGS_ASSERT_SV_2PV        \
-       assert(sv)
-#endif
-PERL_CALLCONV char*    Perl_sv_2pv_flags(pTHX_ SV *const sv, STRLEN *const lp, const U32 flags);
-#define PERL_ARGS_ASSERT_SV_2PV_FLAGS  \
-       assert(sv)
-#ifndef NO_MATHOMS
-PERL_CALLCONV char*    Perl_sv_2pv_nolen(pTHX_ SV* sv)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_SV_2PV_NOLEN  \
-       assert(sv)
-#endif
-
-#ifndef NO_MATHOMS
-PERL_CALLCONV char*    Perl_sv_2pvbyte(pTHX_ SV *sv, STRLEN *const lp);
-#define PERL_ARGS_ASSERT_SV_2PVBYTE    \
-       assert(sv)
-#endif
-PERL_CALLCONV char*    Perl_sv_2pvbyte_flags(pTHX_ SV *sv, STRLEN *const lp, const U32 flags);
-#define PERL_ARGS_ASSERT_SV_2PVBYTE_FLAGS      \
-       assert(sv)
-#ifndef NO_MATHOMS
-PERL_CALLCONV char*    Perl_sv_2pvbyte_nolen(pTHX_ SV* sv)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_SV_2PVBYTE_NOLEN      \
-       assert(sv)
-#endif
 
-#ifndef NO_MATHOMS
-PERL_CALLCONV char*    Perl_sv_2pvutf8(pTHX_ SV *sv, STRLEN *const lp);
-#define PERL_ARGS_ASSERT_SV_2PVUTF8    \
-       assert(sv)
-#endif
-PERL_CALLCONV char*    Perl_sv_2pvutf8_flags(pTHX_ SV *sv, STRLEN *const lp, const U32 flags);
-#define PERL_ARGS_ASSERT_SV_2PVUTF8_FLAGS      \
-       assert(sv)
-#ifndef NO_MATHOMS
-PERL_CALLCONV char*    Perl_sv_2pvutf8_nolen(pTHX_ SV* sv)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_SV_2PVUTF8_NOLEN      \
-       assert(sv)
-#endif
+PERL_CALLCONV NV
+Perl_str_to_version(pTHX_ SV *sv)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_STR_TO_VERSION         \
+        assert(sv)
+
+PERL_CALLCONV void
+Perl_sub_crush_depth(pTHX_ CV *cv)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_SUB_CRUSH_DEPTH        \
+        assert(cv)
+
+PERL_CALLCONV void
+Perl_suspend_compcv(pTHX_ struct suspended_compcv *buffer);
+#define PERL_ARGS_ASSERT_SUSPEND_COMPCV         \
+        assert(buffer)
+
+PERL_CALLCONV bool
+Perl_sv_2bool_flags(pTHX_ SV *sv, I32 flags);
+#define PERL_ARGS_ASSERT_SV_2BOOL_FLAGS         \
+        assert(sv)
+
+PERL_CALLCONV CV *
+Perl_sv_2cv(pTHX_ SV *sv, HV ** const st, GV ** const gvp, const I32 lref);
+#define PERL_ARGS_ASSERT_SV_2CV                 \
+        assert(st); assert(gvp)
+
+PERL_CALLCONV IO *
+Perl_sv_2io(pTHX_ SV * const sv);
+#define PERL_ARGS_ASSERT_SV_2IO                 \
+        assert(sv)
+
+PERL_CALLCONV IV
+Perl_sv_2iv_flags(pTHX_ SV * const sv, const I32 flags);
+#define PERL_ARGS_ASSERT_SV_2IV_FLAGS           \
+        assert(sv)
+
+PERL_CALLCONV SV *
+Perl_sv_2mortal(pTHX_ SV * const sv);
+#define PERL_ARGS_ASSERT_SV_2MORTAL
 
-#ifndef NO_MATHOMS
-PERL_CALLCONV UV       Perl_sv_2uv(pTHX_ SV *sv);
-#define PERL_ARGS_ASSERT_SV_2UV        \
-       assert(sv)
-#endif
-PERL_CALLCONV UV       Perl_sv_2uv_flags(pTHX_ SV *const sv, const I32 flags);
-#define PERL_ARGS_ASSERT_SV_2UV_FLAGS  \
-       assert(sv)
-PERL_CALLCONV void     Perl_sv_backoff(SV *const sv);
-#define PERL_ARGS_ASSERT_SV_BACKOFF    \
-       assert(sv)
-PERL_CALLCONV SV*      Perl_sv_bless(pTHX_ SV *const sv, HV *const stash);
-#define PERL_ARGS_ASSERT_SV_BLESS      \
-       assert(sv); assert(stash)
-PERL_CALLCONV bool     Perl_sv_cat_decode(pTHX_ SV* dsv, SV *encoding, SV *ssv, int *offset, char* tstr, int tlen);
-#define PERL_ARGS_ASSERT_SV_CAT_DECODE \
-       assert(dsv); assert(encoding); assert(ssv); assert(offset); assert(tstr)
-PERL_CALLCONV void     Perl_sv_catpv(pTHX_ SV *const dsv, const char* sstr);
-#define PERL_ARGS_ASSERT_SV_CATPV      \
-       assert(dsv)
-PERL_CALLCONV void     Perl_sv_catpv_flags(pTHX_ SV *dsv, const char *sstr, const I32 flags);
-#define PERL_ARGS_ASSERT_SV_CATPV_FLAGS        \
-       assert(dsv); assert(sstr)
-PERL_CALLCONV void     Perl_sv_catpv_mg(pTHX_ SV *const dsv, const char *const sstr);
-#define PERL_ARGS_ASSERT_SV_CATPV_MG   \
-       assert(dsv)
-PERL_CALLCONV void     Perl_sv_catpvf(pTHX_ SV *const sv, const char *const pat, ...)
-                       __attribute__format__(__printf__,pTHX_2,pTHX_3);
-#define PERL_ARGS_ASSERT_SV_CATPVF     \
-       assert(sv); assert(pat)
-
-PERL_CALLCONV void     Perl_sv_catpvf_mg(pTHX_ SV *const sv, const char *const pat, ...)
-                       __attribute__format__(__printf__,pTHX_2,pTHX_3);
-#define PERL_ARGS_ASSERT_SV_CATPVF_MG  \
-       assert(sv); assert(pat)
-
-#ifndef NO_MATHOMS
-PERL_CALLCONV void     Perl_sv_catpvn(pTHX_ SV *dsv, const char *sstr, STRLEN len);
-#define PERL_ARGS_ASSERT_SV_CATPVN     \
-       assert(dsv); assert(sstr)
-#endif
-PERL_CALLCONV void     Perl_sv_catpvn_flags(pTHX_ SV *const dsv, const char *sstr, const STRLEN len, const I32 flags);
-#define PERL_ARGS_ASSERT_SV_CATPVN_FLAGS       \
-       assert(dsv); assert(sstr)
-#ifndef NO_MATHOMS
-PERL_CALLCONV void     Perl_sv_catpvn_mg(pTHX_ SV *dsv, const char *sstr, STRLEN len);
-#define PERL_ARGS_ASSERT_SV_CATPVN_MG  \
-       assert(dsv); assert(sstr)
-#endif
-#ifndef NO_MATHOMS
-PERL_CALLCONV void     Perl_sv_catsv(pTHX_ SV *dsv, SV *sstr);
-#define PERL_ARGS_ASSERT_SV_CATSV      \
-       assert(dsv)
-#endif
-PERL_CALLCONV void     Perl_sv_catsv_flags(pTHX_ SV *const dsv, SV *const sstr, const I32 flags);
-#define PERL_ARGS_ASSERT_SV_CATSV_FLAGS        \
-       assert(dsv)
-#ifndef NO_MATHOMS
-PERL_CALLCONV void     Perl_sv_catsv_mg(pTHX_ SV *dsv, SV *sstr);
-#define PERL_ARGS_ASSERT_SV_CATSV_MG   \
-       assert(dsv)
-#endif
-PERL_CALLCONV void     Perl_sv_chop(pTHX_ SV *const sv, const char *const ptr);
-#define PERL_ARGS_ASSERT_SV_CHOP       \
-       assert(sv)
-PERL_CALLCONV I32      Perl_sv_clean_all(pTHX);
+PERL_CALLCONV SV *
+Perl_sv_2num(pTHX_ SV * const sv)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_SV_2NUM                \
+        assert(sv)
+
+PERL_CALLCONV NV
+Perl_sv_2nv_flags(pTHX_ SV * const sv, const I32 flags);
+#define PERL_ARGS_ASSERT_SV_2NV_FLAGS           \
+        assert(sv)
+
+PERL_CALLCONV char *
+Perl_sv_2pv_flags(pTHX_ SV * const sv, STRLEN * const lp, const U32 flags);
+#define PERL_ARGS_ASSERT_SV_2PV_FLAGS           \
+        assert(sv)
+
+PERL_CALLCONV char *
+Perl_sv_2pvbyte_flags(pTHX_ SV *sv, STRLEN * const lp, const U32 flags);
+#define PERL_ARGS_ASSERT_SV_2PVBYTE_FLAGS       \
+        assert(sv)
+
+PERL_CALLCONV char *
+Perl_sv_2pvutf8_flags(pTHX_ SV *sv, STRLEN * const lp, const U32 flags);
+#define PERL_ARGS_ASSERT_SV_2PVUTF8_FLAGS       \
+        assert(sv)
+
+PERL_CALLCONV UV
+Perl_sv_2uv_flags(pTHX_ SV * const sv, const I32 flags);
+#define PERL_ARGS_ASSERT_SV_2UV_FLAGS           \
+        assert(sv)
+
+PERL_CALLCONV void
+Perl_sv_backoff(SV * const sv);
+#define PERL_ARGS_ASSERT_SV_BACKOFF             \
+        assert(sv)
+
+PERL_CALLCONV SV *
+Perl_sv_bless(pTHX_ SV * const sv, HV * const stash);
+#define PERL_ARGS_ASSERT_SV_BLESS               \
+        assert(sv); assert(stash)
+
+PERL_CALLCONV bool
+Perl_sv_cat_decode(pTHX_ SV *dsv, SV *encoding, SV *ssv, int *offset, char *tstr, int tlen);
+#define PERL_ARGS_ASSERT_SV_CAT_DECODE          \
+        assert(dsv); assert(encoding); assert(ssv); assert(offset); assert(tstr)
+
+PERL_CALLCONV void
+Perl_sv_catpv(pTHX_ SV * const dsv, const char *sstr);
+#define PERL_ARGS_ASSERT_SV_CATPV               \
+        assert(dsv)
+
+PERL_CALLCONV void
+Perl_sv_catpv_flags(pTHX_ SV *dsv, const char *sstr, const I32 flags);
+#define PERL_ARGS_ASSERT_SV_CATPV_FLAGS         \
+        assert(dsv); assert(sstr)
+
+PERL_CALLCONV void
+Perl_sv_catpv_mg(pTHX_ SV * const dsv, const char * const sstr);
+#define PERL_ARGS_ASSERT_SV_CATPV_MG            \
+        assert(dsv)
+
+PERL_CALLCONV void
+Perl_sv_catpvf(pTHX_ SV * const sv, const char * const pat, ...)
+        __attribute__format__(__printf__,pTHX_2,pTHX_3);
+#define PERL_ARGS_ASSERT_SV_CATPVF              \
+        assert(sv); assert(pat)
+
+PERL_CALLCONV void
+Perl_sv_catpvf_mg(pTHX_ SV * const sv, const char * const pat, ...)
+        __attribute__format__(__printf__,pTHX_2,pTHX_3);
+#define PERL_ARGS_ASSERT_SV_CATPVF_MG           \
+        assert(sv); assert(pat)
+
+PERL_CALLCONV void
+Perl_sv_catpvn_flags(pTHX_ SV * const dsv, const char *sstr, const STRLEN len, const I32 flags);
+#define PERL_ARGS_ASSERT_SV_CATPVN_FLAGS        \
+        assert(dsv); assert(sstr)
+
+PERL_CALLCONV void
+Perl_sv_catsv_flags(pTHX_ SV * const dsv, SV * const sstr, const I32 flags);
+#define PERL_ARGS_ASSERT_SV_CATSV_FLAGS         \
+        assert(dsv)
+
+PERL_CALLCONV void
+Perl_sv_chop(pTHX_ SV * const sv, const char * const ptr);
+#define PERL_ARGS_ASSERT_SV_CHOP                \
+        assert(sv)
+
+PERL_CALLCONV I32
+Perl_sv_clean_all(pTHX)
+        __attribute__visibility__("hidden");
 #define PERL_ARGS_ASSERT_SV_CLEAN_ALL
-PERL_CALLCONV void     Perl_sv_clean_objs(pTHX);
+
+PERL_CALLCONV void
+Perl_sv_clean_objs(pTHX)
+        __attribute__visibility__("hidden");
 #define PERL_ARGS_ASSERT_SV_CLEAN_OBJS
-PERL_CALLCONV void     Perl_sv_clear(pTHX_ SV *const orig_sv);
-#define PERL_ARGS_ASSERT_SV_CLEAR      \
-       assert(orig_sv)
-PERL_CALLCONV I32      Perl_sv_cmp(pTHX_ SV *const sv1, SV *const sv2);
+
+PERL_CALLCONV void
+Perl_sv_clear(pTHX_ SV * const orig_sv);
+#define PERL_ARGS_ASSERT_SV_CLEAR               \
+        assert(orig_sv)
+
+PERL_CALLCONV I32
+Perl_sv_cmp(pTHX_ SV * const sv1, SV * const sv2);
 #define PERL_ARGS_ASSERT_SV_CMP
-PERL_CALLCONV I32      Perl_sv_cmp_flags(pTHX_ SV *const sv1, SV *const sv2, const U32 flags);
+
+PERL_CALLCONV I32
+Perl_sv_cmp_flags(pTHX_ SV * const sv1, SV * const sv2, const U32 flags);
 #define PERL_ARGS_ASSERT_SV_CMP_FLAGS
-PERL_CALLCONV I32      Perl_sv_cmp_locale(pTHX_ SV *const sv1, SV *const sv2);
+
+PERL_CALLCONV I32
+Perl_sv_cmp_locale(pTHX_ SV * const sv1, SV * const sv2);
 #define PERL_ARGS_ASSERT_SV_CMP_LOCALE
-PERL_CALLCONV I32      Perl_sv_cmp_locale_flags(pTHX_ SV *const sv1, SV *const sv2, const U32 flags);
+
+PERL_CALLCONV I32
+Perl_sv_cmp_locale_flags(pTHX_ SV * const sv1, SV * const sv2, const U32 flags);
 #define PERL_ARGS_ASSERT_SV_CMP_LOCALE_FLAGS
-#ifndef NO_MATHOMS
-PERL_CALLCONV void     Perl_sv_copypv(pTHX_ SV *const dsv, SV *const ssv);
-#define PERL_ARGS_ASSERT_SV_COPYPV     \
-       assert(dsv); assert(ssv)
-#endif
-PERL_CALLCONV void     Perl_sv_copypv_flags(pTHX_ SV *const dsv, SV *const ssv, const I32 flags);
-#define PERL_ARGS_ASSERT_SV_COPYPV_FLAGS       \
-       assert(dsv); assert(ssv)
-/* PERL_CALLCONV void  sv_copypv_nomg(pTHX_ SV *const dsv, SV *const ssv); */
-#define PERL_ARGS_ASSERT_SV_COPYPV_NOMG
-PERL_CALLCONV void     Perl_sv_dec(pTHX_ SV *const sv);
+
+PERL_CALLCONV void
+Perl_sv_copypv_flags(pTHX_ SV * const dsv, SV * const ssv, const I32 flags);
+#define PERL_ARGS_ASSERT_SV_COPYPV_FLAGS        \
+        assert(dsv); assert(ssv)
+
+/* PERL_CALLCONV void
+sv_copypv_nomg(pTHX_ SV * const dsv, SV * const ssv); */
+
+PERL_CALLCONV void
+Perl_sv_dec(pTHX_ SV * const sv);
 #define PERL_ARGS_ASSERT_SV_DEC
-PERL_CALLCONV void     Perl_sv_dec_nomg(pTHX_ SV *const sv);
+
+PERL_CALLCONV void
+Perl_sv_dec_nomg(pTHX_ SV * const sv);
 #define PERL_ARGS_ASSERT_SV_DEC_NOMG
-PERL_CALLCONV void     Perl_sv_del_backref(pTHX_ SV *const tsv, SV *const sv);
-#define PERL_ARGS_ASSERT_SV_DEL_BACKREF        \
-       assert(tsv); assert(sv)
-PERL_CALLCONV bool     Perl_sv_derived_from(pTHX_ SV* sv, const char *const name)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_SV_DERIVED_FROM       \
-       assert(sv); assert(name)
-
-PERL_CALLCONV bool     Perl_sv_derived_from_pv(pTHX_ SV* sv, const char *const name, U32 flags)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_SV_DERIVED_FROM_PV    \
-       assert(sv); assert(name)
-
-PERL_CALLCONV bool     Perl_sv_derived_from_pvn(pTHX_ SV* sv, const char *const name, const STRLEN len, U32 flags)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_SV_DERIVED_FROM_PVN   \
-       assert(sv); assert(name)
-
-PERL_CALLCONV bool     Perl_sv_derived_from_sv(pTHX_ SV* sv, SV *namesv, U32 flags)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_SV_DERIVED_FROM_SV    \
-       assert(sv); assert(namesv)
-
-PERL_CALLCONV bool     Perl_sv_destroyable(pTHX_ SV *sv);
+
+PERL_CALLCONV void
+Perl_sv_del_backref(pTHX_ SV * const tsv, SV * const sv);
+#define PERL_ARGS_ASSERT_SV_DEL_BACKREF         \
+        assert(tsv); assert(sv)
+
+PERL_CALLCONV bool
+Perl_sv_derived_from(pTHX_ SV *sv, const char * const name)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_SV_DERIVED_FROM        \
+        assert(sv); assert(name)
+
+PERL_CALLCONV bool
+Perl_sv_derived_from_hv(pTHX_ SV *sv, HV *hv)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_SV_DERIVED_FROM_HV     \
+        assert(sv); assert(hv)
+
+PERL_CALLCONV bool
+Perl_sv_derived_from_pv(pTHX_ SV *sv, const char * const name, U32 flags)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_SV_DERIVED_FROM_PV     \
+        assert(sv); assert(name)
+
+PERL_CALLCONV bool
+Perl_sv_derived_from_pvn(pTHX_ SV *sv, const char * const name, const STRLEN len, U32 flags)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_SV_DERIVED_FROM_PVN    \
+        assert(sv); assert(name)
+
+PERL_CALLCONV bool
+Perl_sv_derived_from_sv(pTHX_ SV *sv, SV *namesv, U32 flags)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_SV_DERIVED_FROM_SV     \
+        assert(sv); assert(namesv)
+
+PERL_CALLCONV bool
+Perl_sv_destroyable(pTHX_ SV *sv);
 #define PERL_ARGS_ASSERT_SV_DESTROYABLE
-PERL_CALLCONV bool     Perl_sv_does(pTHX_ SV* sv, const char *const name)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_SV_DOES       \
-       assert(sv); assert(name)
-
-PERL_CALLCONV bool     Perl_sv_does_pv(pTHX_ SV* sv, const char *const name, U32 flags)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_SV_DOES_PV    \
-       assert(sv); assert(name)
-
-PERL_CALLCONV bool     Perl_sv_does_pvn(pTHX_ SV* sv, const char *const name, const STRLEN len, U32 flags)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_SV_DOES_PVN   \
-       assert(sv); assert(name)
-
-PERL_CALLCONV bool     Perl_sv_does_sv(pTHX_ SV* sv, SV* namesv, U32 flags)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_SV_DOES_SV    \
-       assert(sv); assert(namesv)
-
-PERL_CALLCONV void     Perl_sv_dump(pTHX_ SV* sv);
+
+PERL_CALLCONV bool
+Perl_sv_does(pTHX_ SV *sv, const char * const name)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_SV_DOES                \
+        assert(sv); assert(name)
+
+PERL_CALLCONV bool
+Perl_sv_does_pv(pTHX_ SV *sv, const char * const name, U32 flags)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_SV_DOES_PV             \
+        assert(sv); assert(name)
+
+PERL_CALLCONV bool
+Perl_sv_does_pvn(pTHX_ SV *sv, const char * const name, const STRLEN len, U32 flags)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_SV_DOES_PVN            \
+        assert(sv); assert(name)
+
+PERL_CALLCONV bool
+Perl_sv_does_sv(pTHX_ SV *sv, SV *namesv, U32 flags)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_SV_DOES_SV             \
+        assert(sv); assert(namesv)
+
+PERL_CALLCONV void
+Perl_sv_dump(pTHX_ SV *sv);
 #define PERL_ARGS_ASSERT_SV_DUMP
-#ifndef NO_MATHOMS
-PERL_CALLCONV I32      Perl_sv_eq(pTHX_ SV* sv1, SV* sv2);
-#define PERL_ARGS_ASSERT_SV_EQ
-#endif
-PERL_CALLCONV I32      Perl_sv_eq_flags(pTHX_ SV* sv1, SV* sv2, const U32 flags);
+
+PERL_CALLCONV void
+Perl_sv_dump_depth(pTHX_ SV *sv, I32 depth);
+#define PERL_ARGS_ASSERT_SV_DUMP_DEPTH
+
+PERL_CALLCONV I32
+Perl_sv_eq_flags(pTHX_ SV *sv1, SV *sv2, const U32 flags);
 #define PERL_ARGS_ASSERT_SV_EQ_FLAGS
-#ifndef NO_MATHOMS
-PERL_CALLCONV void     Perl_sv_force_normal(pTHX_ SV *sv);
-#define PERL_ARGS_ASSERT_SV_FORCE_NORMAL       \
-       assert(sv)
-#endif
-PERL_CALLCONV void     Perl_sv_force_normal_flags(pTHX_ SV *const sv, const U32 flags);
-#define PERL_ARGS_ASSERT_SV_FORCE_NORMAL_FLAGS \
-       assert(sv)
-PERL_CALLCONV void     Perl_sv_free(pTHX_ SV *const sv);
+
+PERL_CALLCONV void
+Perl_sv_force_normal_flags(pTHX_ SV * const sv, const U32 flags);
+#define PERL_ARGS_ASSERT_SV_FORCE_NORMAL_FLAGS  \
+        assert(sv)
+
+PERL_CALLCONV void
+Perl_sv_free(pTHX_ SV * const sv);
 #define PERL_ARGS_ASSERT_SV_FREE
-PERL_CALLCONV void     Perl_sv_free2(pTHX_ SV *const sv, const U32 refcnt);
-#define PERL_ARGS_ASSERT_SV_FREE2      \
-       assert(sv)
-PERL_CALLCONV void     Perl_sv_free_arenas(pTHX);
+
+PERL_CALLCONV void
+Perl_sv_free2(pTHX_ SV * const sv, const U32 refcnt);
+#define PERL_ARGS_ASSERT_SV_FREE2               \
+        assert(sv)
+
+PERL_CALLCONV void
+Perl_sv_free_arenas(pTHX)
+        __attribute__visibility__("hidden");
 #define PERL_ARGS_ASSERT_SV_FREE_ARENAS
-PERL_CALLCONV SV*      Perl_sv_get_backrefs(SV *const sv);
-#define PERL_ARGS_ASSERT_SV_GET_BACKREFS       \
-       assert(sv)
-PERL_CALLCONV char*    Perl_sv_gets(pTHX_ SV *const sv, PerlIO *const fp, I32 append);
-#define PERL_ARGS_ASSERT_SV_GETS       \
-       assert(sv); assert(fp)
-PERL_CALLCONV char*    Perl_sv_grow(pTHX_ SV *const sv, STRLEN newlen);
-#define PERL_ARGS_ASSERT_SV_GROW       \
-       assert(sv)
-PERL_CALLCONV char*    Perl_sv_grow_fresh(pTHX_ SV *const sv, STRLEN newlen);
-#define PERL_ARGS_ASSERT_SV_GROW_FRESH \
-       assert(sv)
-PERL_CALLCONV void     Perl_sv_inc(pTHX_ SV *const sv);
+
+PERL_CALLCONV SV *
+Perl_sv_get_backrefs(SV * const sv);
+#define PERL_ARGS_ASSERT_SV_GET_BACKREFS        \
+        assert(sv)
+
+PERL_CALLCONV char *
+Perl_sv_gets(pTHX_ SV * const sv, PerlIO * const fp, I32 append);
+#define PERL_ARGS_ASSERT_SV_GETS                \
+        assert(sv); assert(fp)
+
+PERL_CALLCONV char *
+Perl_sv_grow(pTHX_ SV * const sv, STRLEN newlen);
+#define PERL_ARGS_ASSERT_SV_GROW                \
+        assert(sv)
+
+PERL_CALLCONV char *
+Perl_sv_grow_fresh(pTHX_ SV * const sv, STRLEN newlen);
+#define PERL_ARGS_ASSERT_SV_GROW_FRESH          \
+        assert(sv)
+
+PERL_CALLCONV void
+Perl_sv_inc(pTHX_ SV * const sv);
 #define PERL_ARGS_ASSERT_SV_INC
-PERL_CALLCONV void     Perl_sv_inc_nomg(pTHX_ SV *const sv);
+
+PERL_CALLCONV void
+Perl_sv_inc_nomg(pTHX_ SV * const sv);
 #define PERL_ARGS_ASSERT_SV_INC_NOMG
-#ifndef NO_MATHOMS
-PERL_CALLCONV void     Perl_sv_insert(pTHX_ SV *const bigstr, const STRLEN offset, const STRLEN len, const char *const little, const STRLEN littlelen);
-#define PERL_ARGS_ASSERT_SV_INSERT     \
-       assert(bigstr); assert(little)
-#endif
-PERL_CALLCONV void     Perl_sv_insert_flags(pTHX_ SV *const bigstr, const STRLEN offset, const STRLEN len, const char *little, const STRLEN littlelen, const U32 flags);
-#define PERL_ARGS_ASSERT_SV_INSERT_FLAGS       \
-       assert(bigstr); assert(little)
-PERL_CALLCONV int      Perl_sv_isa(pTHX_ SV* sv, const char *const name);
-#define PERL_ARGS_ASSERT_SV_ISA        \
-       assert(name)
-PERL_CALLCONV bool     Perl_sv_isa_sv(pTHX_ SV* sv, SV* namesv)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_SV_ISA_SV     \
-       assert(sv); assert(namesv)
-
-PERL_CALLCONV int      Perl_sv_isobject(pTHX_ SV* sv);
+
+PERL_CALLCONV void
+Perl_sv_insert_flags(pTHX_ SV * const bigstr, const STRLEN offset, const STRLEN len, const char *little, const STRLEN littlelen, const U32 flags);
+#define PERL_ARGS_ASSERT_SV_INSERT_FLAGS        \
+        assert(bigstr); assert(little)
+
+PERL_CALLCONV int
+Perl_sv_isa(pTHX_ SV *sv, const char * const name);
+#define PERL_ARGS_ASSERT_SV_ISA                 \
+        assert(name)
+
+PERL_CALLCONV bool
+Perl_sv_isa_sv(pTHX_ SV *sv, SV *namesv)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_SV_ISA_SV              \
+        assert(sv); assert(namesv)
+
+PERL_CALLCONV int
+Perl_sv_isobject(pTHX_ SV *sv);
 #define PERL_ARGS_ASSERT_SV_ISOBJECT
-#ifndef NO_MATHOMS
-PERL_CALLCONV IV       Perl_sv_iv(pTHX_ SV* sv)
-                       __attribute__deprecated__;
-#define PERL_ARGS_ASSERT_SV_IV \
-       assert(sv)
-#endif
 
-PERL_CALLCONV STRLEN   Perl_sv_len(pTHX_ SV *const sv);
+PERL_CALLCONV STRLEN
+Perl_sv_len(pTHX_ SV * const sv);
 #define PERL_ARGS_ASSERT_SV_LEN
-PERL_CALLCONV STRLEN   Perl_sv_len_utf8(pTHX_ SV *const sv);
+
+PERL_CALLCONV STRLEN
+Perl_sv_len_utf8(pTHX_ SV * const sv);
 #define PERL_ARGS_ASSERT_SV_LEN_UTF8
-PERL_CALLCONV STRLEN   Perl_sv_len_utf8_nomg(pTHX_ SV *const sv);
-#define PERL_ARGS_ASSERT_SV_LEN_UTF8_NOMG      \
-       assert(sv)
-PERL_CALLCONV void     Perl_sv_magic(pTHX_ SV *const sv, SV *const obj, const int how, const char *const name, const I32 namlen);
-#define PERL_ARGS_ASSERT_SV_MAGIC      \
-       assert(sv)
-PERL_CALLCONV MAGIC *  Perl_sv_magicext(pTHX_ SV *const sv, SV *const obj, const int how, const MGVTBL *const vtbl, const char *const name, const I32 namlen);
-#define PERL_ARGS_ASSERT_SV_MAGICEXT   \
-       assert(sv)
-PERL_CALLCONV MAGIC *  Perl_sv_magicext_mglob(pTHX_ SV *sv);
-#define PERL_ARGS_ASSERT_SV_MAGICEXT_MGLOB     \
-       assert(sv)
-#ifndef NO_MATHOMS
-PERL_CALLCONV SV*      Perl_sv_mortalcopy(pTHX_ SV *const oldsv)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_SV_MORTALCOPY
-#endif
 
-PERL_CALLCONV SV*      Perl_sv_mortalcopy_flags(pTHX_ SV *const oldsv, U32 flags)
-                       __attribute__warn_unused_result__;
+PERL_CALLCONV STRLEN
+Perl_sv_len_utf8_nomg(pTHX_ SV * const sv);
+#define PERL_ARGS_ASSERT_SV_LEN_UTF8_NOMG       \
+        assert(sv)
+
+PERL_CALLCONV void
+Perl_sv_magic(pTHX_ SV * const sv, SV * const obj, const int how, const char * const name, const I32 namlen);
+#define PERL_ARGS_ASSERT_SV_MAGIC               \
+        assert(sv)
+
+PERL_CALLCONV MAGIC *
+Perl_sv_magicext(pTHX_ SV * const sv, SV * const obj, const int how, const MGVTBL * const vtbl, const char * const name, const I32 namlen);
+#define PERL_ARGS_ASSERT_SV_MAGICEXT            \
+        assert(sv)
+
+PERL_CALLCONV MAGIC *
+Perl_sv_magicext_mglob(pTHX_ SV *sv);
+#define PERL_ARGS_ASSERT_SV_MAGICEXT_MGLOB      \
+        assert(sv)
+
+PERL_CALLCONV SV *
+Perl_sv_mortalcopy_flags(pTHX_ SV * const oldsv, U32 flags)
+        __attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_SV_MORTALCOPY_FLAGS
 
-PERL_CALLCONV SV*      Perl_sv_newmortal(pTHX)
-                       __attribute__warn_unused_result__;
+PERL_CALLCONV SV *
+Perl_sv_newmortal(pTHX)
+        __attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_SV_NEWMORTAL
 
-PERL_CALLCONV SV*      Perl_sv_newref(pTHX_ SV *const sv);
+PERL_CALLCONV SV *
+Perl_sv_newref(pTHX_ SV * const sv);
 #define PERL_ARGS_ASSERT_SV_NEWREF
-#ifndef NO_MATHOMS
-PERL_CALLCONV void     Perl_sv_nolocking(pTHX_ SV *sv)
-                       __attribute__deprecated__;
-#define PERL_ARGS_ASSERT_SV_NOLOCKING
-#endif
 
-PERL_CALLCONV void     Perl_sv_nosharing(pTHX_ SV *sv);
+PERL_CALLCONV void
+Perl_sv_nosharing(pTHX_ SV *sv);
 #define PERL_ARGS_ASSERT_SV_NOSHARING
-#ifndef NO_MATHOMS
-PERL_CALLCONV void     Perl_sv_nounlocking(pTHX_ SV *sv)
-                       __attribute__deprecated__;
-#define PERL_ARGS_ASSERT_SV_NOUNLOCKING
-#endif
 
-/* PERL_CALLCONV bool  sv_numeq(pTHX_ SV* sv1, SV* sv2); */
-#define PERL_ARGS_ASSERT_SV_NUMEQ
-PERL_CALLCONV bool     Perl_sv_numeq_flags(pTHX_ SV* sv1, SV* sv2, const U32 flags);
+/* PERL_CALLCONV bool
+sv_numeq(pTHX_ SV *sv1, SV *sv2); */
+
+PERL_CALLCONV bool
+Perl_sv_numeq_flags(pTHX_ SV *sv1, SV *sv2, const U32 flags);
 #define PERL_ARGS_ASSERT_SV_NUMEQ_FLAGS
-#ifndef NO_MATHOMS
-PERL_CALLCONV NV       Perl_sv_nv(pTHX_ SV* sv)
-                       __attribute__deprecated__;
-#define PERL_ARGS_ASSERT_SV_NV \
-       assert(sv)
-#endif
 
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE bool        Perl_sv_only_taint_gmagic(SV *sv);
-#define PERL_ARGS_ASSERT_SV_ONLY_TAINT_GMAGIC  \
-       assert(sv)
-#endif
-PERL_CALLCONV char*    Perl_sv_peek(pTHX_ SV* sv);
+PERL_CALLCONV char *
+Perl_sv_peek(pTHX_ SV *sv);
 #define PERL_ARGS_ASSERT_SV_PEEK
-PERL_CALLCONV void     Perl_sv_pos_b2u(pTHX_ SV *const sv, I32 *const offsetp);
-#define PERL_ARGS_ASSERT_SV_POS_B2U    \
-       assert(offsetp)
-PERL_CALLCONV STRLEN   Perl_sv_pos_b2u_flags(pTHX_ SV *const sv, STRLEN const offset, U32 flags);
-#define PERL_ARGS_ASSERT_SV_POS_B2U_FLAGS      \
-       assert(sv)
-PERL_CALLCONV void     Perl_sv_pos_u2b(pTHX_ SV *const sv, I32 *const offsetp, I32 *const lenp);
-#define PERL_ARGS_ASSERT_SV_POS_U2B    \
-       assert(offsetp)
-PERL_CALLCONV STRLEN   Perl_sv_pos_u2b_flags(pTHX_ SV *const sv, STRLEN uoffset, STRLEN *const lenp, U32 flags);
-#define PERL_ARGS_ASSERT_SV_POS_U2B_FLAGS      \
-       assert(sv)
-#ifndef NO_MATHOMS
-PERL_CALLCONV char*    Perl_sv_pv(pTHX_ SV *sv)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_SV_PV \
-       assert(sv)
-#endif
-
-#ifndef NO_MATHOMS
-PERL_CALLCONV char*    Perl_sv_pvbyte(pTHX_ SV *sv)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_SV_PVBYTE     \
-       assert(sv)
-#endif
-
-#ifndef NO_MATHOMS
-PERL_CALLCONV char*    Perl_sv_pvbyten(pTHX_ SV *sv, STRLEN *lp)
-                       __attribute__deprecated__;
-#define PERL_ARGS_ASSERT_SV_PVBYTEN    \
-       assert(sv); assert(lp)
-#endif
 
-PERL_CALLCONV char*    Perl_sv_pvbyten_force(pTHX_ SV *const sv, STRLEN *const lp);
-#define PERL_ARGS_ASSERT_SV_PVBYTEN_FORCE      \
-       assert(sv)
-#ifndef NO_MATHOMS
-PERL_CALLCONV char*    Perl_sv_pvn(pTHX_ SV *sv, STRLEN *lp)
-                       __attribute__deprecated__;
-#define PERL_ARGS_ASSERT_SV_PVN        \
-       assert(sv); assert(lp)
-#endif
-
-#ifndef NO_MATHOMS
-PERL_CALLCONV char*    Perl_sv_pvn_force(pTHX_ SV* sv, STRLEN* lp);
-#define PERL_ARGS_ASSERT_SV_PVN_FORCE  \
-       assert(sv)
-#endif
-PERL_CALLCONV char*    Perl_sv_pvn_force_flags(pTHX_ SV *const sv, STRLEN *const lp, const U32 flags);
-#define PERL_ARGS_ASSERT_SV_PVN_FORCE_FLAGS    \
-       assert(sv)
-#ifndef NO_MATHOMS
-PERL_CALLCONV char*    Perl_sv_pvn_nomg(pTHX_ SV* sv, STRLEN* lp)
-                       __attribute__deprecated__;
-#define PERL_ARGS_ASSERT_SV_PVN_NOMG   \
-       assert(sv)
-#endif
-
-#ifndef NO_MATHOMS
-PERL_CALLCONV char*    Perl_sv_pvutf8(pTHX_ SV *sv)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_SV_PVUTF8     \
-       assert(sv)
-#endif
+PERL_CALLCONV void
+Perl_sv_pos_b2u(pTHX_ SV * const sv, I32 * const offsetp);
+#define PERL_ARGS_ASSERT_SV_POS_B2U             \
+        assert(offsetp)
+
+PERL_CALLCONV STRLEN
+Perl_sv_pos_b2u_flags(pTHX_ SV * const sv, STRLEN const offset, U32 flags);
+#define PERL_ARGS_ASSERT_SV_POS_B2U_FLAGS       \
+        assert(sv)
+
+PERL_CALLCONV void
+Perl_sv_pos_u2b(pTHX_ SV * const sv, I32 * const offsetp, I32 * const lenp);
+#define PERL_ARGS_ASSERT_SV_POS_U2B             \
+        assert(offsetp)
+
+PERL_CALLCONV STRLEN
+Perl_sv_pos_u2b_flags(pTHX_ SV * const sv, STRLEN uoffset, STRLEN * const lenp, U32 flags);
+#define PERL_ARGS_ASSERT_SV_POS_U2B_FLAGS       \
+        assert(sv)
+
+PERL_CALLCONV char *
+Perl_sv_pvbyten_force(pTHX_ SV * const sv, STRLEN * const lp);
+#define PERL_ARGS_ASSERT_SV_PVBYTEN_FORCE       \
+        assert(sv)
+
+PERL_CALLCONV char *
+Perl_sv_pvn_force_flags(pTHX_ SV * const sv, STRLEN * const lp, const U32 flags);
+#define PERL_ARGS_ASSERT_SV_PVN_FORCE_FLAGS     \
+        assert(sv)
+
+PERL_CALLCONV char *
+Perl_sv_pvutf8n_force(pTHX_ SV * const sv, STRLEN * const lp);
+#define PERL_ARGS_ASSERT_SV_PVUTF8N_FORCE       \
+        assert(sv)
+
+PERL_CALLCONV char *
+Perl_sv_recode_to_utf8(pTHX_ SV *sv, SV *encoding);
+#define PERL_ARGS_ASSERT_SV_RECODE_TO_UTF8      \
+        assert(sv); assert(encoding)
+
+PERL_CALLCONV SV *
+Perl_sv_ref(pTHX_ SV *dst, const SV * const sv, const int ob);
+#define PERL_ARGS_ASSERT_SV_REF                 \
+        assert(sv)
+
+PERL_CALLCONV const char *
+Perl_sv_reftype(pTHX_ const SV * const sv, const int ob)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_SV_REFTYPE             \
+        assert(sv)
+
+PERL_CALLCONV void
+Perl_sv_replace(pTHX_ SV * const sv, SV * const nsv);
+#define PERL_ARGS_ASSERT_SV_REPLACE             \
+        assert(sv); assert(nsv)
+
+PERL_CALLCONV void
+Perl_sv_report_used(pTHX);
+#define PERL_ARGS_ASSERT_SV_REPORT_USED
 
-#ifndef NO_MATHOMS
-PERL_CALLCONV char*    Perl_sv_pvutf8n(pTHX_ SV *sv, STRLEN *lp)
-                       __attribute__deprecated__;
-#define PERL_ARGS_ASSERT_SV_PVUTF8N    \
-       assert(sv); assert(lp)
-#endif
+PERL_CALLCONV void
+Perl_sv_reset(pTHX_ const char *s, HV * const stash);
+#define PERL_ARGS_ASSERT_SV_RESET               \
+        assert(s)
 
-PERL_CALLCONV char*    Perl_sv_pvutf8n_force(pTHX_ SV *const sv, STRLEN *const lp);
-#define PERL_ARGS_ASSERT_SV_PVUTF8N_FORCE      \
-       assert(sv)
-PERL_CALLCONV char*    Perl_sv_recode_to_utf8(pTHX_ SV* sv, SV *encoding);
-#define PERL_ARGS_ASSERT_SV_RECODE_TO_UTF8     \
-       assert(sv); assert(encoding)
-PERL_CALLCONV SV*      Perl_sv_ref(pTHX_ SV *dst, const SV *const sv, const int ob);
-#define PERL_ARGS_ASSERT_SV_REF        \
-       assert(sv)
-PERL_CALLCONV const char*      Perl_sv_reftype(pTHX_ const SV *const sv, const int ob)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_SV_REFTYPE    \
-       assert(sv)
-
-PERL_CALLCONV void     Perl_sv_replace(pTHX_ SV *const sv, SV *const nsv);
-#define PERL_ARGS_ASSERT_SV_REPLACE    \
-       assert(sv); assert(nsv)
-PERL_CALLCONV void     Perl_sv_report_used(pTHX);
-#define PERL_ARGS_ASSERT_SV_REPORT_USED
-PERL_CALLCONV void     Perl_sv_reset(pTHX_ const char* s, HV *const stash);
-#define PERL_ARGS_ASSERT_SV_RESET      \
-       assert(s)
-PERL_CALLCONV void     Perl_sv_resetpvn(pTHX_ const char* s, STRLEN len, HV *const stash);
+PERL_CALLCONV void
+Perl_sv_resetpvn(pTHX_ const char *s, STRLEN len, HV * const stash)
+        __attribute__visibility__("hidden");
 #define PERL_ARGS_ASSERT_SV_RESETPVN
-PERL_CALLCONV SV*      Perl_sv_rvunweaken(pTHX_ SV *const sv);
-#define PERL_ARGS_ASSERT_SV_RVUNWEAKEN \
-       assert(sv)
-PERL_CALLCONV SV*      Perl_sv_rvweaken(pTHX_ SV *const sv);
-#define PERL_ARGS_ASSERT_SV_RVWEAKEN   \
-       assert(sv)
-PERL_CALLCONV void     Perl_sv_set_undef(pTHX_ SV *sv);
-#define PERL_ARGS_ASSERT_SV_SET_UNDEF  \
-       assert(sv)
-PERL_CALLCONV void     Perl_sv_sethek(pTHX_ SV *const sv, const HEK *const hek);
-#define PERL_ARGS_ASSERT_SV_SETHEK     \
-       assert(sv)
-PERL_CALLCONV void     Perl_sv_setiv(pTHX_ SV *const sv, const IV num);
-#define PERL_ARGS_ASSERT_SV_SETIV      \
-       assert(sv)
-PERL_CALLCONV void     Perl_sv_setiv_mg(pTHX_ SV *const sv, const IV i);
-#define PERL_ARGS_ASSERT_SV_SETIV_MG   \
-       assert(sv)
-PERL_CALLCONV void     Perl_sv_setnv(pTHX_ SV *const sv, const NV num);
-#define PERL_ARGS_ASSERT_SV_SETNV      \
-       assert(sv)
-PERL_CALLCONV void     Perl_sv_setnv_mg(pTHX_ SV *const sv, const NV num);
-#define PERL_ARGS_ASSERT_SV_SETNV_MG   \
-       assert(sv)
-PERL_CALLCONV void     Perl_sv_setpv(pTHX_ SV *const sv, const char *const ptr);
-#define PERL_ARGS_ASSERT_SV_SETPV      \
-       assert(sv)
-PERL_CALLCONV char  *  Perl_sv_setpv_bufsize(pTHX_ SV *const sv, const STRLEN cur, const STRLEN len);
-#define PERL_ARGS_ASSERT_SV_SETPV_BUFSIZE      \
-       assert(sv)
-PERL_CALLCONV void     Perl_sv_setpv_mg(pTHX_ SV *const sv, const char *const ptr);
-#define PERL_ARGS_ASSERT_SV_SETPV_MG   \
-       assert(sv)
-PERL_CALLCONV void     Perl_sv_setpvf(pTHX_ SV *const sv, const char *const pat, ...)
-                       __attribute__format__(__printf__,pTHX_2,pTHX_3);
-#define PERL_ARGS_ASSERT_SV_SETPVF     \
-       assert(sv); assert(pat)
-
-PERL_CALLCONV void     Perl_sv_setpvf_mg(pTHX_ SV *const sv, const char *const pat, ...)
-                       __attribute__format__(__printf__,pTHX_2,pTHX_3);
-#define PERL_ARGS_ASSERT_SV_SETPVF_MG  \
-       assert(sv); assert(pat)
-
-#ifndef NO_MATHOMS
-PERL_CALLCONV void     Perl_sv_setpviv(pTHX_ SV *const sv, const IV num)
-                       __attribute__deprecated__;
-#define PERL_ARGS_ASSERT_SV_SETPVIV    \
-       assert(sv)
-#endif
-
-#ifndef NO_MATHOMS
-PERL_CALLCONV void     Perl_sv_setpviv_mg(pTHX_ SV *const sv, const IV iv)
-                       __attribute__deprecated__;
-#define PERL_ARGS_ASSERT_SV_SETPVIV_MG \
-       assert(sv)
-#endif
 
-PERL_CALLCONV void     Perl_sv_setpvn(pTHX_ SV *const sv, const char *const ptr, const STRLEN len);
-#define PERL_ARGS_ASSERT_SV_SETPVN     \
-       assert(sv)
-PERL_CALLCONV void     Perl_sv_setpvn_fresh(pTHX_ SV *const sv, const char *const ptr, const STRLEN len);
-#define PERL_ARGS_ASSERT_SV_SETPVN_FRESH       \
-       assert(sv)
-PERL_CALLCONV void     Perl_sv_setpvn_mg(pTHX_ SV *const sv, const char *const ptr, const STRLEN len);
-#define PERL_ARGS_ASSERT_SV_SETPVN_MG  \
-       assert(sv); assert(ptr)
-PERL_CALLCONV SV*      Perl_sv_setref_iv(pTHX_ SV *const rv, const char *const classname, const IV iv);
-#define PERL_ARGS_ASSERT_SV_SETREF_IV  \
-       assert(rv)
-PERL_CALLCONV SV*      Perl_sv_setref_nv(pTHX_ SV *const rv, const char *const classname, const NV nv);
-#define PERL_ARGS_ASSERT_SV_SETREF_NV  \
-       assert(rv)
-PERL_CALLCONV SV*      Perl_sv_setref_pv(pTHX_ SV *const rv, const char *const classname, void *const pv);
-#define PERL_ARGS_ASSERT_SV_SETREF_PV  \
-       assert(rv)
-PERL_CALLCONV SV*      Perl_sv_setref_pvn(pTHX_ SV *const rv, const char *const classname, const char *const pv, const STRLEN n);
-#define PERL_ARGS_ASSERT_SV_SETREF_PVN \
-       assert(rv); assert(pv)
-PERL_CALLCONV SV*      Perl_sv_setref_uv(pTHX_ SV *const rv, const char *const classname, const UV uv);
-#define PERL_ARGS_ASSERT_SV_SETREF_UV  \
-       assert(rv)
-PERL_CALLCONV void     Perl_sv_setrv_inc(pTHX_ SV *const sv, SV *const ref);
-#define PERL_ARGS_ASSERT_SV_SETRV_INC  \
-       assert(sv); assert(ref)
-PERL_CALLCONV void     Perl_sv_setrv_inc_mg(pTHX_ SV *const sv, SV *const ref);
-#define PERL_ARGS_ASSERT_SV_SETRV_INC_MG       \
-       assert(sv); assert(ref)
-PERL_CALLCONV void     Perl_sv_setrv_noinc(pTHX_ SV *const sv, SV *const ref);
-#define PERL_ARGS_ASSERT_SV_SETRV_NOINC        \
-       assert(sv); assert(ref)
-PERL_CALLCONV void     Perl_sv_setrv_noinc_mg(pTHX_ SV *const sv, SV *const ref);
-#define PERL_ARGS_ASSERT_SV_SETRV_NOINC_MG     \
-       assert(sv); assert(ref)
-#ifndef NO_MATHOMS
-PERL_CALLCONV void     Perl_sv_setsv(pTHX_ SV *dsv, SV *ssv);
-#define PERL_ARGS_ASSERT_SV_SETSV      \
-       assert(dsv)
-#endif
-PERL_CALLCONV void     Perl_sv_setsv_flags(pTHX_ SV *dsv, SV *ssv, const I32 flags);
-#define PERL_ARGS_ASSERT_SV_SETSV_FLAGS        \
-       assert(dsv)
-PERL_CALLCONV void     Perl_sv_setsv_mg(pTHX_ SV *const dsv, SV *const ssv);
-#define PERL_ARGS_ASSERT_SV_SETSV_MG   \
-       assert(dsv)
-PERL_CALLCONV void     Perl_sv_setuv(pTHX_ SV *const sv, const UV num);
-#define PERL_ARGS_ASSERT_SV_SETUV      \
-       assert(sv)
-PERL_CALLCONV void     Perl_sv_setuv_mg(pTHX_ SV *const sv, const UV u);
-#define PERL_ARGS_ASSERT_SV_SETUV_MG   \
-       assert(sv)
-/* PERL_CALLCONV bool  sv_streq(pTHX_ SV* sv1, SV* sv2); */
-#define PERL_ARGS_ASSERT_SV_STREQ
-PERL_CALLCONV bool     Perl_sv_streq_flags(pTHX_ SV* sv1, SV* sv2, const U32 flags);
+PERL_CALLCONV SV *
+Perl_sv_rvunweaken(pTHX_ SV * const sv);
+#define PERL_ARGS_ASSERT_SV_RVUNWEAKEN          \
+        assert(sv)
+
+PERL_CALLCONV SV *
+Perl_sv_rvweaken(pTHX_ SV * const sv);
+#define PERL_ARGS_ASSERT_SV_RVWEAKEN            \
+        assert(sv)
+
+PERL_CALLCONV void
+Perl_sv_set_bool(pTHX_ SV *sv, const bool bool_val);
+#define PERL_ARGS_ASSERT_SV_SET_BOOL            \
+        assert(sv)
+
+PERL_CALLCONV void
+Perl_sv_set_false(pTHX_ SV *sv);
+#define PERL_ARGS_ASSERT_SV_SET_FALSE           \
+        assert(sv)
+
+PERL_CALLCONV void
+Perl_sv_set_true(pTHX_ SV *sv);
+#define PERL_ARGS_ASSERT_SV_SET_TRUE            \
+        assert(sv)
+
+PERL_CALLCONV void
+Perl_sv_set_undef(pTHX_ SV *sv);
+#define PERL_ARGS_ASSERT_SV_SET_UNDEF           \
+        assert(sv)
+
+PERL_CALLCONV void
+Perl_sv_sethek(pTHX_ SV * const sv, const HEK * const hek);
+#define PERL_ARGS_ASSERT_SV_SETHEK              \
+        assert(sv)
+
+PERL_CALLCONV void
+Perl_sv_setiv(pTHX_ SV * const sv, const IV num);
+#define PERL_ARGS_ASSERT_SV_SETIV               \
+        assert(sv)
+
+PERL_CALLCONV void
+Perl_sv_setiv_mg(pTHX_ SV * const sv, const IV i);
+#define PERL_ARGS_ASSERT_SV_SETIV_MG            \
+        assert(sv)
+
+PERL_CALLCONV void
+Perl_sv_setnv(pTHX_ SV * const sv, const NV num);
+#define PERL_ARGS_ASSERT_SV_SETNV               \
+        assert(sv)
+
+PERL_CALLCONV void
+Perl_sv_setnv_mg(pTHX_ SV * const sv, const NV num);
+#define PERL_ARGS_ASSERT_SV_SETNV_MG            \
+        assert(sv)
+
+PERL_CALLCONV void
+Perl_sv_setpv(pTHX_ SV * const sv, const char * const ptr);
+#define PERL_ARGS_ASSERT_SV_SETPV               \
+        assert(sv)
+
+PERL_CALLCONV char  *
+Perl_sv_setpv_bufsize(pTHX_ SV * const sv, const STRLEN cur, const STRLEN len);
+#define PERL_ARGS_ASSERT_SV_SETPV_BUFSIZE       \
+        assert(sv)
+
+PERL_CALLCONV void
+Perl_sv_setpv_mg(pTHX_ SV * const sv, const char * const ptr);
+#define PERL_ARGS_ASSERT_SV_SETPV_MG            \
+        assert(sv)
+
+PERL_CALLCONV void
+Perl_sv_setpvf(pTHX_ SV * const sv, const char * const pat, ...)
+        __attribute__format__(__printf__,pTHX_2,pTHX_3);
+#define PERL_ARGS_ASSERT_SV_SETPVF              \
+        assert(sv); assert(pat)
+
+PERL_CALLCONV void
+Perl_sv_setpvf_mg(pTHX_ SV * const sv, const char * const pat, ...)
+        __attribute__format__(__printf__,pTHX_2,pTHX_3);
+#define PERL_ARGS_ASSERT_SV_SETPVF_MG           \
+        assert(sv); assert(pat)
+
+PERL_CALLCONV void
+Perl_sv_setpvn(pTHX_ SV * const sv, const char * const ptr, const STRLEN len);
+#define PERL_ARGS_ASSERT_SV_SETPVN              \
+        assert(sv)
+
+PERL_CALLCONV void
+Perl_sv_setpvn_fresh(pTHX_ SV * const sv, const char * const ptr, const STRLEN len);
+#define PERL_ARGS_ASSERT_SV_SETPVN_FRESH        \
+        assert(sv)
+
+PERL_CALLCONV void
+Perl_sv_setpvn_mg(pTHX_ SV * const sv, const char * const ptr, const STRLEN len);
+#define PERL_ARGS_ASSERT_SV_SETPVN_MG           \
+        assert(sv); assert(ptr)
+
+PERL_CALLCONV SV *
+Perl_sv_setref_iv(pTHX_ SV * const rv, const char * const classname, const IV iv);
+#define PERL_ARGS_ASSERT_SV_SETREF_IV           \
+        assert(rv)
+
+PERL_CALLCONV SV *
+Perl_sv_setref_nv(pTHX_ SV * const rv, const char * const classname, const NV nv);
+#define PERL_ARGS_ASSERT_SV_SETREF_NV           \
+        assert(rv)
+
+PERL_CALLCONV SV *
+Perl_sv_setref_pv(pTHX_ SV * const rv, const char * const classname, void * const pv);
+#define PERL_ARGS_ASSERT_SV_SETREF_PV           \
+        assert(rv)
+
+PERL_CALLCONV SV *
+Perl_sv_setref_pvn(pTHX_ SV * const rv, const char * const classname, const char * const pv, const STRLEN n);
+#define PERL_ARGS_ASSERT_SV_SETREF_PVN          \
+        assert(rv); assert(pv)
+
+PERL_CALLCONV SV *
+Perl_sv_setref_uv(pTHX_ SV * const rv, const char * const classname, const UV uv);
+#define PERL_ARGS_ASSERT_SV_SETREF_UV           \
+        assert(rv)
+
+PERL_CALLCONV void
+Perl_sv_setrv_inc(pTHX_ SV * const sv, SV * const ref);
+#define PERL_ARGS_ASSERT_SV_SETRV_INC           \
+        assert(sv); assert(ref)
+
+PERL_CALLCONV void
+Perl_sv_setrv_inc_mg(pTHX_ SV * const sv, SV * const ref);
+#define PERL_ARGS_ASSERT_SV_SETRV_INC_MG        \
+        assert(sv); assert(ref)
+
+PERL_CALLCONV void
+Perl_sv_setrv_noinc(pTHX_ SV * const sv, SV * const ref);
+#define PERL_ARGS_ASSERT_SV_SETRV_NOINC         \
+        assert(sv); assert(ref)
+
+PERL_CALLCONV void
+Perl_sv_setrv_noinc_mg(pTHX_ SV * const sv, SV * const ref);
+#define PERL_ARGS_ASSERT_SV_SETRV_NOINC_MG      \
+        assert(sv); assert(ref)
+
+PERL_CALLCONV void
+Perl_sv_setsv_flags(pTHX_ SV *dsv, SV *ssv, const I32 flags);
+#define PERL_ARGS_ASSERT_SV_SETSV_FLAGS         \
+        assert(dsv)
+
+PERL_CALLCONV void
+Perl_sv_setsv_mg(pTHX_ SV * const dsv, SV * const ssv);
+#define PERL_ARGS_ASSERT_SV_SETSV_MG            \
+        assert(dsv)
+
+PERL_CALLCONV void
+Perl_sv_setuv(pTHX_ SV * const sv, const UV num);
+#define PERL_ARGS_ASSERT_SV_SETUV               \
+        assert(sv)
+
+PERL_CALLCONV void
+Perl_sv_setuv_mg(pTHX_ SV * const sv, const UV u);
+#define PERL_ARGS_ASSERT_SV_SETUV_MG            \
+        assert(sv)
+
+/* PERL_CALLCONV bool
+sv_streq(pTHX_ SV *sv1, SV *sv2); */
+
+PERL_CALLCONV bool
+Perl_sv_streq_flags(pTHX_ SV *sv1, SV *sv2, const U32 flags);
 #define PERL_ARGS_ASSERT_SV_STREQ_FLAGS
-PERL_CALLCONV SV*      Perl_sv_string_from_errnum(pTHX_ int errnum, SV* tgtsv);
+
+PERL_CALLCONV SV *
+Perl_sv_string_from_errnum(pTHX_ int errnum, SV *tgtsv);
 #define PERL_ARGS_ASSERT_SV_STRING_FROM_ERRNUM
-#ifndef NO_MATHOMS
-PERL_CALLCONV void     Perl_sv_taint(pTHX_ SV* sv);
-#define PERL_ARGS_ASSERT_SV_TAINT      \
-       assert(sv)
-#endif
-PERL_CALLCONV bool     Perl_sv_tainted(pTHX_ SV *const sv)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_SV_TAINTED    \
-       assert(sv)
 
-PERL_CALLCONV I32      Perl_sv_true(pTHX_ SV *const sv);
+PERL_CALLCONV bool
+Perl_sv_tainted(pTHX_ SV * const sv)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_SV_TAINTED             \
+        assert(sv)
+
+PERL_CALLCONV I32
+Perl_sv_true(pTHX_ SV * const sv);
 #define PERL_ARGS_ASSERT_SV_TRUE
-PERL_CALLCONV char*    Perl_sv_uni_display(pTHX_ SV *dsv, SV *ssv, STRLEN pvlim, UV flags)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_SV_UNI_DISPLAY        \
-       assert(dsv); assert(ssv)
-
-PERL_CALLCONV int      Perl_sv_unmagic(pTHX_ SV *const sv, const int type);
-#define PERL_ARGS_ASSERT_SV_UNMAGIC    \
-       assert(sv)
-PERL_CALLCONV int      Perl_sv_unmagicext(pTHX_ SV *const sv, const int type, MGVTBL *vtbl);
-#define PERL_ARGS_ASSERT_SV_UNMAGICEXT \
-       assert(sv)
-#ifndef NO_MATHOMS
-PERL_CALLCONV void     Perl_sv_unref(pTHX_ SV* sv);
-#define PERL_ARGS_ASSERT_SV_UNREF      \
-       assert(sv)
-#endif
-PERL_CALLCONV void     Perl_sv_unref_flags(pTHX_ SV *const ref, const U32 flags);
-#define PERL_ARGS_ASSERT_SV_UNREF_FLAGS        \
-       assert(ref)
-PERL_CALLCONV void     Perl_sv_untaint(pTHX_ SV *const sv);
-#define PERL_ARGS_ASSERT_SV_UNTAINT    \
-       assert(sv)
-PERL_CALLCONV void     Perl_sv_upgrade(pTHX_ SV *const sv, svtype new_type);
-#define PERL_ARGS_ASSERT_SV_UPGRADE    \
-       assert(sv)
-#ifndef NO_MATHOMS
-PERL_CALLCONV void     Perl_sv_usepvn(pTHX_ SV* sv, char* ptr, STRLEN len);
-#define PERL_ARGS_ASSERT_SV_USEPVN     \
-       assert(sv)
-#endif
-PERL_CALLCONV void     Perl_sv_usepvn_flags(pTHX_ SV *const sv, char* ptr, const STRLEN len, const U32 flags);
-#define PERL_ARGS_ASSERT_SV_USEPVN_FLAGS       \
-       assert(sv)
-#ifndef NO_MATHOMS
-PERL_CALLCONV void     Perl_sv_usepvn_mg(pTHX_ SV *sv, char *ptr, STRLEN len);
-#define PERL_ARGS_ASSERT_SV_USEPVN_MG  \
-       assert(sv)
-#endif
-PERL_CALLCONV bool     Perl_sv_utf8_decode(pTHX_ SV *const sv);
-#define PERL_ARGS_ASSERT_SV_UTF8_DECODE        \
-       assert(sv)
-#ifndef NO_MATHOMS
-PERL_CALLCONV bool     Perl_sv_utf8_downgrade(pTHX_ SV *const sv, const bool fail_ok);
-#define PERL_ARGS_ASSERT_SV_UTF8_DOWNGRADE     \
-       assert(sv)
-#endif
-PERL_CALLCONV bool     Perl_sv_utf8_downgrade_flags(pTHX_ SV *const sv, const bool fail_ok, const U32 flags);
-#define PERL_ARGS_ASSERT_SV_UTF8_DOWNGRADE_FLAGS       \
-       assert(sv)
-/* PERL_CALLCONV bool  sv_utf8_downgrade_nomg(pTHX_ SV *const sv, const bool fail_ok); */
-#define PERL_ARGS_ASSERT_SV_UTF8_DOWNGRADE_NOMG
-PERL_CALLCONV void     Perl_sv_utf8_encode(pTHX_ SV *const sv);
-#define PERL_ARGS_ASSERT_SV_UTF8_ENCODE        \
-       assert(sv)
-#ifndef NO_MATHOMS
-PERL_CALLCONV STRLEN   Perl_sv_utf8_upgrade(pTHX_ SV *sv);
-#define PERL_ARGS_ASSERT_SV_UTF8_UPGRADE       \
-       assert(sv)
-#endif
-/* PERL_CALLCONV STRLEN        sv_utf8_upgrade_flags(pTHX_ SV *const sv, const I32 flags); */
-#define PERL_ARGS_ASSERT_SV_UTF8_UPGRADE_FLAGS
-PERL_CALLCONV STRLEN   Perl_sv_utf8_upgrade_flags_grow(pTHX_ SV *const sv, const I32 flags, STRLEN extra);
-#define PERL_ARGS_ASSERT_SV_UTF8_UPGRADE_FLAGS_GROW    \
-       assert(sv)
-/* PERL_CALLCONV STRLEN        sv_utf8_upgrade_nomg(pTHX_ SV *sv); */
-#define PERL_ARGS_ASSERT_SV_UTF8_UPGRADE_NOMG
-#ifndef NO_MATHOMS
-PERL_CALLCONV UV       Perl_sv_uv(pTHX_ SV* sv)
-                       __attribute__deprecated__;
-#define PERL_ARGS_ASSERT_SV_UV \
-       assert(sv)
-#endif
 
-PERL_CALLCONV void     Perl_sv_vcatpvf(pTHX_ SV *const sv, const char *const pat, va_list *const args);
-#define PERL_ARGS_ASSERT_SV_VCATPVF    \
-       assert(sv); assert(pat)
-PERL_CALLCONV void     Perl_sv_vcatpvf_mg(pTHX_ SV *const sv, const char *const pat, va_list *const args);
-#define PERL_ARGS_ASSERT_SV_VCATPVF_MG \
-       assert(sv); assert(pat)
-PERL_CALLCONV void     Perl_sv_vcatpvfn(pTHX_ SV *const sv, const char *const pat, const STRLEN patlen, va_list *const args, SV **const svargs, const Size_t sv_count, bool *const maybe_tainted);
-#define PERL_ARGS_ASSERT_SV_VCATPVFN   \
-       assert(sv); assert(pat)
-PERL_CALLCONV void     Perl_sv_vcatpvfn_flags(pTHX_ SV *const sv, const char *const pat, const STRLEN patlen, va_list *const args, SV **const svargs, const Size_t sv_count, bool *const maybe_tainted, const U32 flags);
-#define PERL_ARGS_ASSERT_SV_VCATPVFN_FLAGS     \
-       assert(sv); assert(pat)
-PERL_CALLCONV void     Perl_sv_vsetpvf(pTHX_ SV *const sv, const char *const pat, va_list *const args);
-#define PERL_ARGS_ASSERT_SV_VSETPVF    \
-       assert(sv); assert(pat)
-PERL_CALLCONV void     Perl_sv_vsetpvf_mg(pTHX_ SV *const sv, const char *const pat, va_list *const args);
-#define PERL_ARGS_ASSERT_SV_VSETPVF_MG \
-       assert(sv); assert(pat)
-PERL_CALLCONV void     Perl_sv_vsetpvfn(pTHX_ SV *const sv, const char *const pat, const STRLEN patlen, va_list *const args, SV **const svargs, const Size_t sv_count, bool *const maybe_tainted);
-#define PERL_ARGS_ASSERT_SV_VSETPVFN   \
-       assert(sv); assert(pat)
-PERL_CALLCONV void     Perl_switch_to_global_locale(void);
+PERL_CALLCONV char *
+Perl_sv_uni_display(pTHX_ SV *dsv, SV *ssv, STRLEN pvlim, UV flags)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_SV_UNI_DISPLAY         \
+        assert(dsv); assert(ssv)
+
+PERL_CALLCONV int
+Perl_sv_unmagic(pTHX_ SV * const sv, const int type);
+#define PERL_ARGS_ASSERT_SV_UNMAGIC             \
+        assert(sv)
+
+PERL_CALLCONV int
+Perl_sv_unmagicext(pTHX_ SV * const sv, const int type, const MGVTBL *vtbl);
+#define PERL_ARGS_ASSERT_SV_UNMAGICEXT          \
+        assert(sv)
+
+PERL_CALLCONV void
+Perl_sv_unref_flags(pTHX_ SV * const ref, const U32 flags);
+#define PERL_ARGS_ASSERT_SV_UNREF_FLAGS         \
+        assert(ref)
+
+PERL_CALLCONV void
+Perl_sv_untaint(pTHX_ SV * const sv);
+#define PERL_ARGS_ASSERT_SV_UNTAINT             \
+        assert(sv)
+
+PERL_CALLCONV void
+Perl_sv_upgrade(pTHX_ SV * const sv, svtype new_type);
+#define PERL_ARGS_ASSERT_SV_UPGRADE             \
+        assert(sv)
+
+PERL_CALLCONV void
+Perl_sv_usepvn_flags(pTHX_ SV * const sv, char *ptr, const STRLEN len, const U32 flags);
+#define PERL_ARGS_ASSERT_SV_USEPVN_FLAGS        \
+        assert(sv)
+
+PERL_CALLCONV bool
+Perl_sv_utf8_decode(pTHX_ SV * const sv);
+#define PERL_ARGS_ASSERT_SV_UTF8_DECODE         \
+        assert(sv)
+
+PERL_CALLCONV bool
+Perl_sv_utf8_downgrade_flags(pTHX_ SV * const sv, const bool fail_ok, const U32 flags);
+#define PERL_ARGS_ASSERT_SV_UTF8_DOWNGRADE_FLAGS \
+        assert(sv)
+
+/* PERL_CALLCONV bool
+sv_utf8_downgrade_nomg(pTHX_ SV * const sv, const bool fail_ok); */
+
+PERL_CALLCONV void
+Perl_sv_utf8_encode(pTHX_ SV * const sv);
+#define PERL_ARGS_ASSERT_SV_UTF8_ENCODE         \
+        assert(sv)
+
+/* PERL_CALLCONV STRLEN
+sv_utf8_upgrade_flags(pTHX_ SV * const sv, const I32 flags); */
+
+PERL_CALLCONV STRLEN
+Perl_sv_utf8_upgrade_flags_grow(pTHX_ SV * const sv, const I32 flags, STRLEN extra);
+#define PERL_ARGS_ASSERT_SV_UTF8_UPGRADE_FLAGS_GROW \
+        assert(sv)
+
+/* PERL_CALLCONV STRLEN
+sv_utf8_upgrade_nomg(pTHX_ SV *sv); */
+
+PERL_CALLCONV void
+Perl_sv_vcatpvf(pTHX_ SV * const sv, const char * const pat, va_list * const args);
+#define PERL_ARGS_ASSERT_SV_VCATPVF             \
+        assert(sv); assert(pat)
+
+PERL_CALLCONV void
+Perl_sv_vcatpvf_mg(pTHX_ SV * const sv, const char * const pat, va_list * const args);
+#define PERL_ARGS_ASSERT_SV_VCATPVF_MG          \
+        assert(sv); assert(pat)
+
+PERL_CALLCONV void
+Perl_sv_vcatpvfn(pTHX_ SV * const sv, const char * const pat, const STRLEN patlen, va_list * const args, SV ** const svargs, const Size_t sv_count, bool * const maybe_tainted);
+#define PERL_ARGS_ASSERT_SV_VCATPVFN            \
+        assert(sv); assert(pat)
+
+PERL_CALLCONV void
+Perl_sv_vcatpvfn_flags(pTHX_ SV * const sv, const char * const pat, const STRLEN patlen, va_list * const args, SV ** const svargs, const Size_t sv_count, bool * const maybe_tainted, const U32 flags);
+#define PERL_ARGS_ASSERT_SV_VCATPVFN_FLAGS      \
+        assert(sv); assert(pat)
+
+PERL_CALLCONV void
+Perl_sv_vsetpvf(pTHX_ SV * const sv, const char * const pat, va_list * const args);
+#define PERL_ARGS_ASSERT_SV_VSETPVF             \
+        assert(sv); assert(pat)
+
+PERL_CALLCONV void
+Perl_sv_vsetpvf_mg(pTHX_ SV * const sv, const char * const pat, va_list * const args);
+#define PERL_ARGS_ASSERT_SV_VSETPVF_MG          \
+        assert(sv); assert(pat)
+
+PERL_CALLCONV void
+Perl_sv_vsetpvfn(pTHX_ SV * const sv, const char * const pat, const STRLEN patlen, va_list * const args, SV ** const svargs, const Size_t sv_count, bool * const maybe_tainted);
+#define PERL_ARGS_ASSERT_SV_VSETPVFN            \
+        assert(sv); assert(pat)
+
+PERL_CALLCONV void
+Perl_switch_to_global_locale(pTHX);
 #define PERL_ARGS_ASSERT_SWITCH_TO_GLOBAL_LOCALE
-PERL_CALLCONV bool     Perl_sync_locale(void);
+
+PERL_CALLCONV bool
+Perl_sync_locale(pTHX);
 #define PERL_ARGS_ASSERT_SYNC_LOCALE
-PERL_CALLCONV void     Perl_sys_init(int* argc, char*** argv);
-#define PERL_ARGS_ASSERT_SYS_INIT      \
-       assert(argc); assert(argv)
-PERL_CALLCONV void     Perl_sys_init3(int* argc, char*** argv, char*** env);
-#define PERL_ARGS_ASSERT_SYS_INIT3     \
-       assert(argc); assert(argv); assert(env)
-PERL_CALLCONV void     Perl_sys_term(void);
+
+PERL_CALLCONV void
+Perl_sys_init(int *argc, char ***argv);
+#define PERL_ARGS_ASSERT_SYS_INIT               \
+        assert(argc); assert(argv)
+
+PERL_CALLCONV void
+Perl_sys_init3(int *argc, char ***argv, char ***env);
+#define PERL_ARGS_ASSERT_SYS_INIT3              \
+        assert(argc); assert(argv); assert(env)
+
+PERL_CALLCONV void
+Perl_sys_term(void);
 #define PERL_ARGS_ASSERT_SYS_TERM
-PERL_CALLCONV void     Perl_taint_env(pTHX);
+
+PERL_CALLCONV void
+Perl_taint_env(pTHX);
 #define PERL_ARGS_ASSERT_TAINT_ENV
-PERL_CALLCONV void     Perl_taint_proper(pTHX_ const char* f, const char *const s);
-#define PERL_ARGS_ASSERT_TAINT_PROPER  \
-       assert(s)
-PERL_CALLCONV void     Perl_thread_locale_init(void);
+
+PERL_CALLCONV void
+Perl_taint_proper(pTHX_ const char *f, const char * const s);
+#define PERL_ARGS_ASSERT_TAINT_PROPER           \
+        assert(s)
+
+PERL_CALLCONV void
+Perl_thread_locale_init(pTHX);
 #define PERL_ARGS_ASSERT_THREAD_LOCALE_INIT
-PERL_CALLCONV void     Perl_thread_locale_term(void);
+
+PERL_CALLCONV void
+Perl_thread_locale_term(pTHX);
 #define PERL_ARGS_ASSERT_THREAD_LOCALE_TERM
-PERL_CALLCONV OP *     Perl_tied_method(pTHX_ SV *methname, SV **sp, SV *const sv, const MAGIC *const mg, const U32 flags, U32 argc, ...);
-#define PERL_ARGS_ASSERT_TIED_METHOD   \
-       assert(methname); assert(sp); assert(sv); assert(mg)
-PERL_CALLCONV SSize_t  Perl_tmps_grow_p(pTHX_ SSize_t ix);
-#define PERL_ARGS_ASSERT_TMPS_GROW_P
-/* PERL_CALLCONV UV    to_uni_fold(pTHX_ UV c, U8 *p, STRLEN *lenp); */
-#define PERL_ARGS_ASSERT_TO_UNI_FOLD
-PERL_CALLCONV UV       Perl_to_uni_lower(pTHX_ UV c, U8 *p, STRLEN *lenp);
-#define PERL_ARGS_ASSERT_TO_UNI_LOWER  \
-       assert(p); assert(lenp)
-PERL_CALLCONV UV       Perl_to_uni_title(pTHX_ UV c, U8 *p, STRLEN *lenp);
-#define PERL_ARGS_ASSERT_TO_UNI_TITLE  \
-       assert(p); assert(lenp)
-PERL_CALLCONV UV       Perl_to_uni_upper(pTHX_ UV c, U8 *p, STRLEN *lenp);
-#define PERL_ARGS_ASSERT_TO_UNI_UPPER  \
-       assert(p); assert(lenp)
-PERL_CALLCONV bool     Perl_try_amagic_bin(pTHX_ int method, int flags);
-#define PERL_ARGS_ASSERT_TRY_AMAGIC_BIN
-PERL_CALLCONV bool     Perl_try_amagic_un(pTHX_ int method, int flags);
-#define PERL_ARGS_ASSERT_TRY_AMAGIC_UN
-#ifndef NO_MATHOMS
-PERL_CALLCONV SSize_t  Perl_unpack_str(pTHX_ const char *pat, const char *patend, const char *s, const char *strbeg, const char *strend, char **new_s, I32 ocnt, U32 flags)
-                       __attribute__deprecated__;
-#define PERL_ARGS_ASSERT_UNPACK_STR    \
-       assert(pat); assert(patend); assert(s); assert(strend)
-#endif
 
-PERL_CALLCONV SSize_t  Perl_unpackstring(pTHX_ const char *pat, const char *patend, const char *s, const char *strend, U32 flags);
-#define PERL_ARGS_ASSERT_UNPACKSTRING  \
-       assert(pat); assert(patend); assert(s); assert(strend)
-PERL_CALLCONV void     Perl_unshare_hek(pTHX_ HEK* hek);
-#define PERL_ARGS_ASSERT_UNSHARE_HEK
-PERL_CALLCONV void     Perl_unsharepvn(pTHX_ const char* sv, I32 len, U32 hash);
-#define PERL_ARGS_ASSERT_UNSHAREPVN
-PERL_CALLCONV SV*      Perl_upg_version(pTHX_ SV *ver, bool qv);
-#define PERL_ARGS_ASSERT_UPG_VERSION   \
-       assert(ver)
-PERL_CALLCONV U8*      Perl_utf16_to_utf8(pTHX_ U8* p, U8 *d, Size_t bytelen, Size_t *newlen);
-#define PERL_ARGS_ASSERT_UTF16_TO_UTF8 \
-       assert(p); assert(d); assert(newlen)
-PERL_CALLCONV U8*      Perl_utf16_to_utf8_base(pTHX_ U8* p, U8 *d, Size_t bytelen, Size_t *newlen, const bool high, const bool low);
-#define PERL_ARGS_ASSERT_UTF16_TO_UTF8_BASE    \
-       assert(p); assert(d); assert(newlen)
-PERL_CALLCONV U8*      Perl_utf16_to_utf8_reversed(pTHX_ U8* p, U8 *d, Size_t bytelen, Size_t *newlen);
-#define PERL_ARGS_ASSERT_UTF16_TO_UTF8_REVERSED        \
-       assert(p); assert(d); assert(newlen)
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE IV  Perl_utf8_distance(pTHX_ const U8 *a, const U8 *b)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_UTF8_DISTANCE \
-       assert(a); assert(b)
-#endif
+PERL_CALLCONV OP *
+Perl_tied_method(pTHX_ SV *methname, SV **sp, SV * const sv, const MAGIC * const mg, const U32 flags, U32 argc, ...)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_TIED_METHOD            \
+        assert(methname); assert(sp); assert(sv); assert(mg)
 
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE U8* Perl_utf8_hop(const U8 *s, SSize_t off)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_UTF8_HOP      \
-       assert(s)
-#endif
+PERL_CALLCONV SSize_t
+Perl_tmps_grow_p(pTHX_ SSize_t ix);
+#define PERL_ARGS_ASSERT_TMPS_GROW_P
 
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE U8* Perl_utf8_hop_back(const U8 *s, SSize_t off, const U8 *start)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_UTF8_HOP_BACK \
-       assert(s); assert(start)
-#endif
+/* PERL_CALLCONV UV
+to_uni_fold(pTHX_ UV c, U8 *p, STRLEN *lenp); */
 
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE U8* Perl_utf8_hop_forward(const U8 *s, SSize_t off, const U8 *end)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_UTF8_HOP_FORWARD      \
-       assert(s); assert(end)
-#endif
+PERL_CALLCONV UV
+Perl_to_uni_lower(pTHX_ UV c, U8 *p, STRLEN *lenp);
+#define PERL_ARGS_ASSERT_TO_UNI_LOWER           \
+        assert(p); assert(lenp)
 
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE U8* Perl_utf8_hop_safe(const U8 *s, SSize_t off, const U8 *start, const U8 *end)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_UTF8_HOP_SAFE \
-       assert(s); assert(start); assert(end)
-#endif
+PERL_CALLCONV UV
+Perl_to_uni_title(pTHX_ UV c, U8 *p, STRLEN *lenp);
+#define PERL_ARGS_ASSERT_TO_UNI_TITLE           \
+        assert(p); assert(lenp)
 
-PERL_CALLCONV STRLEN   Perl_utf8_length(pTHX_ const U8* s, const U8 *e)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_UTF8_LENGTH   \
-       assert(s); assert(e)
-
-PERL_CALLCONV U8*      Perl_utf8_to_bytes(pTHX_ U8 *s, STRLEN *lenp);
-#define PERL_ARGS_ASSERT_UTF8_TO_BYTES \
-       assert(s); assert(lenp)
-PERL_CALLCONV U8*      Perl_utf8_to_utf16_base(pTHX_ U8* s, U8 *d, Size_t bytelen, Size_t *newlen, const bool high, const bool low);
-#define PERL_ARGS_ASSERT_UTF8_TO_UTF16_BASE    \
-       assert(s); assert(d); assert(newlen)
-#ifndef NO_MATHOMS
-PERL_CALLCONV UV       Perl_utf8_to_uvchr(pTHX_ const U8 *s, STRLEN *retlen)
-                       __attribute__deprecated__;
-#define PERL_ARGS_ASSERT_UTF8_TO_UVCHR \
-       assert(s)
-#endif
+PERL_CALLCONV UV
+Perl_to_uni_upper(pTHX_ UV c, U8 *p, STRLEN *lenp);
+#define PERL_ARGS_ASSERT_TO_UNI_UPPER           \
+        assert(p); assert(lenp)
 
-PERL_CALLCONV UV       Perl_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)
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE UV  Perl_utf8_to_uvchr_buf_helper(pTHX_ const U8 *s, const U8 *send, STRLEN *retlen);
-#define PERL_ARGS_ASSERT_UTF8_TO_UVCHR_BUF_HELPER      \
-       assert(s); assert(send)
-#endif
-#ifndef NO_MATHOMS
-PERL_CALLCONV UV       Perl_utf8_to_uvuni(pTHX_ const U8 *s, STRLEN *retlen)
-                       __attribute__deprecated__;
-#define PERL_ARGS_ASSERT_UTF8_TO_UVUNI \
-       assert(s)
-#endif
+PERL_CALLCONV bool
+Perl_try_amagic_bin(pTHX_ int method, int flags);
+#define PERL_ARGS_ASSERT_TRY_AMAGIC_BIN
 
-PERL_CALLCONV UV       Perl_utf8_to_uvuni_buf(pTHX_ const U8 *s, const U8 *send, STRLEN *retlen)
-                       __attribute__deprecated__;
-#define PERL_ARGS_ASSERT_UTF8_TO_UVUNI_BUF     \
-       assert(s); assert(send)
-
-PERL_CALLCONV UV       Perl_utf8n_to_uvchr(const U8 *s, STRLEN curlen, STRLEN *retlen, const U32 flags);
-#define PERL_ARGS_ASSERT_UTF8N_TO_UVCHR        \
-       assert(s)
-PERL_CALLCONV UV       Perl_utf8n_to_uvchr_error(const U8 *s, STRLEN curlen, STRLEN *retlen, const U32 flags, U32 * errors);
-#define PERL_ARGS_ASSERT_UTF8N_TO_UVCHR_ERROR  \
-       assert(s)
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE UV  Perl_utf8n_to_uvchr_msgs(const U8 *s, STRLEN curlen, STRLEN *retlen, const U32 flags, U32 * errors, AV ** msgs);
-#define PERL_ARGS_ASSERT_UTF8N_TO_UVCHR_MSGS   \
-       assert(s)
-#endif
-#ifndef NO_MATHOMS
-PERL_CALLCONV UV       Perl_utf8n_to_uvuni(pTHX_ const U8 *s, STRLEN curlen, STRLEN *retlen, U32 flags)
-                       __attribute__deprecated__;
-#define PERL_ARGS_ASSERT_UTF8N_TO_UVUNI        \
-       assert(s)
-#endif
+PERL_CALLCONV bool
+Perl_try_amagic_un(pTHX_ int method, int flags);
+#define PERL_ARGS_ASSERT_TRY_AMAGIC_UN
 
-PERL_CALLCONV void     Perl_utilize(pTHX_ int aver, I32 floor, OP* version, OP* idop, OP* arg);
-#define PERL_ARGS_ASSERT_UTILIZE       \
-       assert(idop)
-/* PERL_CALLCONV U8*   uvchr_to_utf8(pTHX_ U8 *d, UV uv); */
-#define PERL_ARGS_ASSERT_UVCHR_TO_UTF8
-/* PERL_CALLCONV U8*   uvchr_to_utf8_flags(pTHX_ U8 *d, UV uv, UV flags); */
-#define PERL_ARGS_ASSERT_UVCHR_TO_UTF8_FLAGS
-/* PERL_CALLCONV U8*   uvchr_to_utf8_flags_msgs(pTHX_ U8 *d, UV uv, UV flags, HV ** msgs); */
-#define PERL_ARGS_ASSERT_UVCHR_TO_UTF8_FLAGS_MSGS
-PERL_CALLCONV U8*      Perl_uvoffuni_to_utf8_flags(pTHX_ U8 *d, UV uv, UV flags);
-#define PERL_ARGS_ASSERT_UVOFFUNI_TO_UTF8_FLAGS        \
-       assert(d)
-PERL_CALLCONV U8*      Perl_uvoffuni_to_utf8_flags_msgs(pTHX_ U8 *d, UV input_uv, const UV flags, HV** msgs);
-#define PERL_ARGS_ASSERT_UVOFFUNI_TO_UTF8_FLAGS_MSGS   \
-       assert(d)
-PERL_CALLCONV U8*      Perl_uvuni_to_utf8(pTHX_ U8 *d, UV uv);
-#define PERL_ARGS_ASSERT_UVUNI_TO_UTF8 \
-       assert(d)
-#ifndef NO_MATHOMS
-PERL_CALLCONV U8*      Perl_uvuni_to_utf8_flags(pTHX_ U8 *d, UV uv, UV flags)
-                       __attribute__deprecated__;
-#define PERL_ARGS_ASSERT_UVUNI_TO_UTF8_FLAGS   \
-       assert(d)
-#endif
+PERL_CALLCONV SSize_t
+Perl_unpackstring(pTHX_ const char *pat, const char *patend, const char *s, const char *strend, U32 flags);
+#define PERL_ARGS_ASSERT_UNPACKSTRING           \
+        assert(pat); assert(patend); assert(s); assert(strend)
 
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE UV  Perl_valid_utf8_to_uvchr(const U8 *s, STRLEN *retlen)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_VALID_UTF8_TO_UVCHR   \
-       assert(s)
-#endif
+PERL_CALLCONV void
+Perl_unshare_hek(pTHX_ HEK *hek);
+#define PERL_ARGS_ASSERT_UNSHARE_HEK
 
-#ifndef NO_MATHOMS
-PERL_CALLCONV UV       Perl_valid_utf8_to_uvuni(pTHX_ const U8 *s, STRLEN *retlen)
-                       __attribute__deprecated__;
-#define PERL_ARGS_ASSERT_VALID_UTF8_TO_UVUNI   \
-       assert(s)
-#endif
+PERL_CALLCONV void
+Perl_unsharepvn(pTHX_ const char *sv, I32 len, U32 hash);
+#define PERL_ARGS_ASSERT_UNSHAREPVN
 
-PERL_CALLCONV bool     Perl_validate_proto(pTHX_ SV *name, SV *proto, bool warn, bool curstash);
-#define PERL_ARGS_ASSERT_VALIDATE_PROTO        \
-       assert(name)
-PERL_CALLCONV int      Perl_vcmp(pTHX_ SV *lhv, SV *rhv);
-#define PERL_ARGS_ASSERT_VCMP  \
-       assert(lhv); assert(rhv)
-PERL_CALLCONV_NO_RET void      Perl_vcroak(pTHX_ const char* pat, va_list* args)
-                       __attribute__noreturn__;
+PERL_CALLCONV SV *
+Perl_upg_version(pTHX_ SV *ver, bool qv);
+#define PERL_ARGS_ASSERT_UPG_VERSION            \
+        assert(ver)
+
+PERL_CALLCONV U8 *
+Perl_utf16_to_utf8(pTHX_ U8 *p, U8 *d, Size_t bytelen, Size_t *newlen);
+#define PERL_ARGS_ASSERT_UTF16_TO_UTF8          \
+        assert(p); assert(d); assert(newlen)
+
+PERL_CALLCONV U8 *
+Perl_utf16_to_utf8_base(pTHX_ U8 *p, U8 *d, Size_t bytelen, Size_t *newlen, const bool high, const bool low);
+#define PERL_ARGS_ASSERT_UTF16_TO_UTF8_BASE     \
+        assert(p); assert(d); assert(newlen)
+
+PERL_CALLCONV U8 *
+Perl_utf16_to_utf8_reversed(pTHX_ U8 *p, U8 *d, Size_t bytelen, Size_t *newlen);
+#define PERL_ARGS_ASSERT_UTF16_TO_UTF8_REVERSED \
+        assert(p); assert(d); assert(newlen)
+
+PERL_CALLCONV STRLEN
+Perl_utf8_length(pTHX_ const U8 *s0, const U8 *e)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_UTF8_LENGTH            \
+        assert(s0); assert(e)
+
+PERL_CALLCONV U8 *
+Perl_utf8_to_bytes(pTHX_ U8 *s, STRLEN *lenp);
+#define PERL_ARGS_ASSERT_UTF8_TO_BYTES          \
+        assert(s); assert(lenp)
+
+PERL_CALLCONV U8 *
+Perl_utf8_to_utf16_base(pTHX_ U8 *s, U8 *d, Size_t bytelen, Size_t *newlen, const bool high, const bool low);
+#define PERL_ARGS_ASSERT_UTF8_TO_UTF16_BASE     \
+        assert(s); assert(d); assert(newlen)
+
+PERL_CALLCONV UV
+Perl_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)
+
+PERL_CALLCONV UV
+Perl_utf8n_to_uvchr(const U8 *s, STRLEN curlen, STRLEN *retlen, const U32 flags);
+#define PERL_ARGS_ASSERT_UTF8N_TO_UVCHR         \
+        assert(s)
+
+PERL_CALLCONV UV
+Perl_utf8n_to_uvchr_error(const U8 *s, STRLEN curlen, STRLEN *retlen, const U32 flags, U32 *errors);
+#define PERL_ARGS_ASSERT_UTF8N_TO_UVCHR_ERROR   \
+        assert(s)
+
+PERL_CALLCONV void
+Perl_utilize(pTHX_ int aver, I32 floor, OP *version, OP *idop, OP *arg)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_UTILIZE                \
+        assert(idop)
+
+/* PERL_CALLCONV U8 *
+uvchr_to_utf8(pTHX_ U8 *d, UV uv); */
+
+/* PERL_CALLCONV U8 *
+uvchr_to_utf8_flags(pTHX_ U8 *d, UV uv, UV flags); */
+
+/* PERL_CALLCONV U8 *
+uvchr_to_utf8_flags_msgs(pTHX_ U8 *d, UV uv, UV flags, HV **msgs); */
+
+PERL_CALLCONV U8 *
+Perl_uvoffuni_to_utf8_flags(pTHX_ U8 *d, UV uv, UV flags);
+#define PERL_ARGS_ASSERT_UVOFFUNI_TO_UTF8_FLAGS \
+        assert(d)
+
+PERL_CALLCONV U8 *
+Perl_uvoffuni_to_utf8_flags_msgs(pTHX_ U8 *d, UV input_uv, const UV flags, HV **msgs);
+#define PERL_ARGS_ASSERT_UVOFFUNI_TO_UTF8_FLAGS_MSGS \
+        assert(d)
+
+PERL_CALLCONV U8 *
+Perl_uvuni_to_utf8(pTHX_ U8 *d, UV uv);
+#define PERL_ARGS_ASSERT_UVUNI_TO_UTF8          \
+        assert(d)
+
+PERL_CALLCONV bool
+Perl_validate_proto(pTHX_ SV *name, SV *proto, bool warn, bool curstash);
+#define PERL_ARGS_ASSERT_VALIDATE_PROTO         \
+        assert(name)
+
+PERL_CALLCONV int
+Perl_vcmp(pTHX_ SV *lhv, SV *rhv);
+#define PERL_ARGS_ASSERT_VCMP                   \
+        assert(lhv); assert(rhv)
+
+PERL_CALLCONV_NO_RET void
+Perl_vcroak(pTHX_ const char *pat, va_list *args)
+        __attribute__noreturn__;
 #define PERL_ARGS_ASSERT_VCROAK
 
-PERL_CALLCONV void     Perl_vdeb(pTHX_ const char* pat, va_list* args);
-#define PERL_ARGS_ASSERT_VDEB  \
-       assert(pat)
-PERL_CALLCONV char*    Perl_vform(pTHX_ const char* pat, va_list* args);
-#define PERL_ARGS_ASSERT_VFORM \
-       assert(pat)
-PERL_CALLCONV void     Perl_vivify_defelem(pTHX_ SV* sv);
-#define PERL_ARGS_ASSERT_VIVIFY_DEFELEM        \
-       assert(sv)
-PERL_CALLCONV SV*      Perl_vivify_ref(pTHX_ SV* sv, U32 to_what)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_VIVIFY_REF    \
-       assert(sv)
-
-PERL_CALLCONV void     Perl_vload_module(pTHX_ U32 flags, SV* name, SV* ver, va_list* args);
-#define PERL_ARGS_ASSERT_VLOAD_MODULE  \
-       assert(name)
-PERL_CALLCONV SV*      Perl_vmess(pTHX_ const char* pat, va_list* args);
-#define PERL_ARGS_ASSERT_VMESS \
-       assert(pat)
-PERL_CALLCONV SV*      Perl_vnewSVpvf(pTHX_ const char *const pat, va_list *const args)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_VNEWSVPVF     \
-       assert(pat)
-
-PERL_CALLCONV SV*      Perl_vnormal(pTHX_ SV *vs);
-#define PERL_ARGS_ASSERT_VNORMAL       \
-       assert(vs)
-PERL_CALLCONV SV*      Perl_vnumify(pTHX_ SV *vs);
-#define PERL_ARGS_ASSERT_VNUMIFY       \
-       assert(vs)
-PERL_CALLCONV SV*      Perl_vstringify(pTHX_ SV *vs);
-#define PERL_ARGS_ASSERT_VSTRINGIFY    \
-       assert(vs)
-PERL_CALLCONV SV*      Perl_vverify(pTHX_ SV *vs);
-#define PERL_ARGS_ASSERT_VVERIFY       \
-       assert(vs)
-PERL_CALLCONV void     Perl_vwarn(pTHX_ const char* pat, va_list* args);
-#define PERL_ARGS_ASSERT_VWARN \
-       assert(pat)
-PERL_CALLCONV void     Perl_vwarner(pTHX_ U32 err, const char* pat, va_list* args);
-#define PERL_ARGS_ASSERT_VWARNER       \
-       assert(pat)
-PERL_CALLCONV I32      Perl_wait4pid(pTHX_ Pid_t pid, int* statusp, int flags);
-#define PERL_ARGS_ASSERT_WAIT4PID      \
-       assert(statusp)
-PERL_CALLCONV void     Perl_warn(pTHX_ const char* pat, ...)
-                       __attribute__format__(__printf__,pTHX_1,pTHX_2);
-#define PERL_ARGS_ASSERT_WARN  \
-       assert(pat)
-
-PERL_CALLCONV void     Perl_warn_sv(pTHX_ SV *baseex);
-#define PERL_ARGS_ASSERT_WARN_SV       \
-       assert(baseex)
-PERL_CALLCONV void     Perl_warner(pTHX_ U32 err, const char* pat, ...)
-                       __attribute__format__(__printf__,pTHX_2,pTHX_3);
-#define PERL_ARGS_ASSERT_WARNER        \
-       assert(pat)
-
-PERL_CALLCONV I32      Perl_was_lvalue_sub(pTHX)
-                       __attribute__warn_unused_result__;
+PERL_CALLCONV void
+Perl_vdeb(pTHX_ const char *pat, va_list *args);
+#define PERL_ARGS_ASSERT_VDEB                   \
+        assert(pat)
+
+PERL_CALLCONV char *
+Perl_vform(pTHX_ const char *pat, va_list *args);
+#define PERL_ARGS_ASSERT_VFORM                  \
+        assert(pat)
+
+PERL_CALLCONV void
+Perl_vivify_defelem(pTHX_ SV *sv);
+#define PERL_ARGS_ASSERT_VIVIFY_DEFELEM         \
+        assert(sv)
+
+PERL_CALLCONV SV *
+Perl_vivify_ref(pTHX_ SV *sv, U32 to_what)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_VIVIFY_REF             \
+        assert(sv)
+
+PERL_CALLCONV void
+Perl_vload_module(pTHX_ U32 flags, SV *name, SV *ver, va_list *args);
+#define PERL_ARGS_ASSERT_VLOAD_MODULE           \
+        assert(name)
+
+PERL_CALLCONV SV *
+Perl_vmess(pTHX_ const char *pat, va_list *args);
+#define PERL_ARGS_ASSERT_VMESS                  \
+        assert(pat)
+
+PERL_CALLCONV SV *
+Perl_vnewSVpvf(pTHX_ const char * const pat, va_list * const args)
+        __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_VNEWSVPVF              \
+        assert(pat)
+
+PERL_CALLCONV SV *
+Perl_vnormal(pTHX_ SV *vs);
+#define PERL_ARGS_ASSERT_VNORMAL                \
+        assert(vs)
+
+PERL_CALLCONV SV *
+Perl_vnumify(pTHX_ SV *vs);
+#define PERL_ARGS_ASSERT_VNUMIFY                \
+        assert(vs)
+
+PERL_CALLCONV SV *
+Perl_vstringify(pTHX_ SV *vs);
+#define PERL_ARGS_ASSERT_VSTRINGIFY             \
+        assert(vs)
+
+PERL_CALLCONV SV *
+Perl_vverify(pTHX_ SV *vs);
+#define PERL_ARGS_ASSERT_VVERIFY                \
+        assert(vs)
+
+PERL_CALLCONV void
+Perl_vwarn(pTHX_ const char *pat, va_list *args);
+#define PERL_ARGS_ASSERT_VWARN                  \
+        assert(pat)
+
+PERL_CALLCONV void
+Perl_vwarner(pTHX_ U32 err, const char *pat, va_list *args);
+#define PERL_ARGS_ASSERT_VWARNER                \
+        assert(pat)
+
+PERL_CALLCONV I32
+Perl_wait4pid(pTHX_ Pid_t pid, int *statusp, int flags)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_WAIT4PID               \
+        assert(statusp)
+
+PERL_CALLCONV void
+Perl_warn(pTHX_ const char *pat, ...)
+        __attribute__format__(__printf__,pTHX_1,pTHX_2);
+#define PERL_ARGS_ASSERT_WARN                   \
+        assert(pat)
+
+PERL_CALLCONV void
+Perl_warn_sv(pTHX_ SV *baseex);
+#define PERL_ARGS_ASSERT_WARN_SV                \
+        assert(baseex)
+
+PERL_CALLCONV void
+Perl_warner(pTHX_ U32 err, const char *pat, ...)
+        __attribute__format__(__printf__,pTHX_2,pTHX_3);
+#define PERL_ARGS_ASSERT_WARNER                 \
+        assert(pat)
+
+PERL_CALLCONV I32
+Perl_was_lvalue_sub(pTHX)
+        __attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_WAS_LVALUE_SUB
 
-PERL_CALLCONV void     Perl_watch(pTHX_ char** addr);
-#define PERL_ARGS_ASSERT_WATCH \
-       assert(addr)
-/* PERL_CALLCONV I32   whichsig(pTHX_ const char* sig); */
-#define PERL_ARGS_ASSERT_WHICHSIG
-PERL_CALLCONV I32      Perl_whichsig_pv(pTHX_ const char* sig);
-#define PERL_ARGS_ASSERT_WHICHSIG_PV   \
-       assert(sig)
-PERL_CALLCONV I32      Perl_whichsig_pvn(pTHX_ const char* sig, STRLEN len);
-#define PERL_ARGS_ASSERT_WHICHSIG_PVN  \
-       assert(sig)
-PERL_CALLCONV I32      Perl_whichsig_sv(pTHX_ SV* sigsv);
-#define PERL_ARGS_ASSERT_WHICHSIG_SV   \
-       assert(sigsv)
-PERL_CALLCONV void     Perl_wrap_keyword_plugin(pTHX_ Perl_keyword_plugin_t new_plugin, Perl_keyword_plugin_t *old_plugin_p);
-#define PERL_ARGS_ASSERT_WRAP_KEYWORD_PLUGIN   \
-       assert(new_plugin); assert(old_plugin_p)
-PERL_CALLCONV void     Perl_wrap_op_checker(pTHX_ Optype opcode, Perl_check_t new_checker, Perl_check_t *old_checker_p);
-#define PERL_ARGS_ASSERT_WRAP_OP_CHECKER       \
-       assert(new_checker); assert(old_checker_p)
-PERL_CALLCONV void     Perl_write_to_stderr(pTHX_ SV* msv);
-#define PERL_ARGS_ASSERT_WRITE_TO_STDERR       \
-       assert(msv)
-PERL_CALLCONV void     Perl_xs_boot_epilog(pTHX_ const I32 ax);
+PERL_CALLCONV void
+Perl_watch(pTHX_ char **addr)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_WATCH                  \
+        assert(addr)
+
+/* PERL_CALLCONV I32
+whichsig(pTHX_ const char *sig); */
+
+PERL_CALLCONV I32
+Perl_whichsig_pv(pTHX_ const char *sig);
+#define PERL_ARGS_ASSERT_WHICHSIG_PV            \
+        assert(sig)
+
+PERL_CALLCONV I32
+Perl_whichsig_pvn(pTHX_ const char *sig, STRLEN len);
+#define PERL_ARGS_ASSERT_WHICHSIG_PVN           \
+        assert(sig)
+
+PERL_CALLCONV I32
+Perl_whichsig_sv(pTHX_ SV *sigsv);
+#define PERL_ARGS_ASSERT_WHICHSIG_SV            \
+        assert(sigsv)
+
+PERL_CALLCONV void
+Perl_wrap_infix_plugin(pTHX_ Perl_infix_plugin_t new_plugin, Perl_infix_plugin_t *old_plugin_p);
+#define PERL_ARGS_ASSERT_WRAP_INFIX_PLUGIN      \
+        assert(new_plugin); assert(old_plugin_p)
+
+PERL_CALLCONV void
+Perl_wrap_keyword_plugin(pTHX_ Perl_keyword_plugin_t new_plugin, Perl_keyword_plugin_t *old_plugin_p);
+#define PERL_ARGS_ASSERT_WRAP_KEYWORD_PLUGIN    \
+        assert(new_plugin); assert(old_plugin_p)
+
+PERL_CALLCONV void
+Perl_wrap_op_checker(pTHX_ Optype opcode, Perl_check_t new_checker, Perl_check_t *old_checker_p);
+#define PERL_ARGS_ASSERT_WRAP_OP_CHECKER        \
+        assert(new_checker); assert(old_checker_p)
+
+PERL_CALLCONV void
+Perl_write_to_stderr(pTHX_ SV *msv)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_WRITE_TO_STDERR        \
+        assert(msv)
+
+PERL_CALLCONV void
+Perl_xs_boot_epilog(pTHX_ const I32 ax);
 #define PERL_ARGS_ASSERT_XS_BOOT_EPILOG
-PERL_CALLCONV I32      Perl_xs_handshake(const U32 key, void * v_my_perl, const char * file, ...);
-#define PERL_ARGS_ASSERT_XS_HANDSHAKE  \
-       assert(v_my_perl); assert(file)
-PERL_CALLCONV int      Perl_yyerror(pTHX_ const char *const s);
-#define PERL_ARGS_ASSERT_YYERROR       \
-       assert(s)
-PERL_CALLCONV int      Perl_yyerror_pv(pTHX_ const char *const s, U32 flags);
-#define PERL_ARGS_ASSERT_YYERROR_PV    \
-       assert(s)
-PERL_CALLCONV int      Perl_yyerror_pvn(pTHX_ const char *const s, STRLEN len, U32 flags);
+
+PERL_CALLCONV I32
+Perl_xs_handshake(const U32 key, void *v_my_perl, const char *file, ...);
+#define PERL_ARGS_ASSERT_XS_HANDSHAKE           \
+        assert(v_my_perl); assert(file)
+
+PERL_CALLCONV int
+Perl_yyerror(pTHX_ const char * const s)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_YYERROR                \
+        assert(s)
+
+PERL_CALLCONV int
+Perl_yyerror_pv(pTHX_ const char * const s, U32 flags)
+        __attribute__visibility__("hidden");
+#define PERL_ARGS_ASSERT_YYERROR_PV             \
+        assert(s)
+
+PERL_CALLCONV int
+Perl_yyerror_pvn(pTHX_ const char * const s, STRLEN len, U32 flags)
+        __attribute__visibility__("hidden");
 #define PERL_ARGS_ASSERT_YYERROR_PVN
-PERL_CALLCONV int      Perl_yylex(pTHX);
+
+PERL_CALLCONV int
+Perl_yylex(pTHX);
 #define PERL_ARGS_ASSERT_YYLEX
-PERL_CALLCONV int      Perl_yyparse(pTHX_ int gramtype);
+
+PERL_CALLCONV int
+Perl_yyparse(pTHX_ int gramtype)
+        __attribute__visibility__("hidden");
 #define PERL_ARGS_ASSERT_YYPARSE
-PERL_CALLCONV void     Perl_yyquit(pTHX);
+
+PERL_CALLCONV void
+Perl_yyquit(pTHX)
+        __attribute__visibility__("hidden");
 #define PERL_ARGS_ASSERT_YYQUIT
-PERL_CALLCONV void     Perl_yyunlex(pTHX);
+
+PERL_CALLCONV void
+Perl_yyunlex(pTHX)
+        __attribute__visibility__("hidden");
 #define PERL_ARGS_ASSERT_YYUNLEX
-#if ! defined(HAS_MEMRCHR) && (defined(PERL_CORE) || defined(PERL_EXT))
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE void *      S_my_memrchr(const char * s, const char c, const STRLEN len);
-#define PERL_ARGS_ASSERT_MY_MEMRCHR    \
-       assert(s)
-#endif
-#endif
-#if !(!defined(PERL_EXT_RE_BUILD))
-#  if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C)
-PERL_CALLCONV SV*      Perl_get_re_gclass_nonbitmap_data(pTHX_ const regexp *prog, const struct regnode *node, bool doinit, SV **listsvp, SV **lonly_utf8_locale, SV **output_invlist);
-#define PERL_ARGS_ASSERT_GET_RE_GCLASS_NONBITMAP_DATA  \
-       assert(node)
-#  endif
-#endif
-#if !(defined(DEBUGGING))
-#  if !defined(NV_PRESERVES_UV)
-#    if defined(PERL_IN_SV_C)
-STATIC int     S_sv_2iuv_non_preserve(pTHX_ SV *const sv);
-#define PERL_ARGS_ASSERT_SV_2IUV_NON_PRESERVE  \
-       assert(sv)
-#    endif
-#  endif
-#endif
-#if !(defined(HAS_NL_LANGINFO) && defined(PERL_LANGINFO_H))
-PERL_CALLCONV const char*      Perl_langinfo(const int item);
-#define PERL_ARGS_ASSERT_PERL_LANGINFO
-#endif
-#if !(defined(HAS_NL_LANGINFO))
-#  if defined(PERL_IN_LOCALE_C)
-STATIC const char*     S_my_nl_langinfo(const int item, bool toggle);
-#define PERL_ARGS_ASSERT_MY_NL_LANGINFO
-#  endif
-#endif
-#if !(defined(PERL_DEFAULT_DO_EXEC3_IMPLEMENTATION))
-PERL_CALLCONV bool     Perl_do_exec(pTHX_ const char* cmd);
-#define PERL_ARGS_ASSERT_DO_EXEC       \
-       assert(cmd)
-#endif
-#if !(defined(PERL_USE_3ARG_SIGHANDLER))
-PERL_CALLCONV Signal_t Perl_csighandler(int sig);
-#define PERL_ARGS_ASSERT_CSIGHANDLER
-PERL_CALLCONV Signal_t Perl_sighandler(int sig);
-#define PERL_ARGS_ASSERT_SIGHANDLER
-#endif
-#if !(defined(_MSC_VER))
-PERL_CALLCONV_NO_RET int       Perl_magic_regdatum_set(pTHX_ SV* sv, MAGIC* mg)
-                       __attribute__noreturn__;
-#define PERL_ARGS_ASSERT_MAGIC_REGDATUM_SET    \
-       assert(sv); assert(mg)
+
+#if defined(DEBUGGING)
+PERL_CALLCONV int
+Perl_get_debug_opts(pTHX_ const char **s, bool givehelp)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_GET_DEBUG_OPTS        \
+        assert(s)
+
+PERL_CALLCONV void
+Perl_hv_assert(pTHX_ HV *hv);
+# define PERL_ARGS_ASSERT_HV_ASSERT             \
+        assert(hv)
+
+PERL_CALLCONV void
+Perl_pad_setsv(pTHX_ PADOFFSET po, SV *sv);
+# define PERL_ARGS_ASSERT_PAD_SETSV             \
+        assert(sv)
+
+PERL_CALLCONV SV *
+Perl_pad_sv(pTHX_ PADOFFSET po);
+# define PERL_ARGS_ASSERT_PAD_SV
+
+PERL_CALLCONV void
+Perl_set_padlist(CV *cv, PADLIST *padlist);
+# define PERL_ARGS_ASSERT_SET_PADLIST           \
+        assert(cv)
+
+#endif /* defined(DEBUGGING) */
+#if defined(DEBUG_LEAKING_SCALARS_FORK_DUMP)
+PERL_CALLCONV void
+Perl_dump_sv_child(pTHX_ SV *sv)
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_DUMP_SV_CHILD         \
+        assert(sv)
 
 #endif
 #if !defined(EBCDIC)
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE unsigned int        Perl_variant_byte_number(PERL_UINTMAX_T word)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_VARIANT_BYTE_NUMBER
+
+# if !defined(PERL_NO_INLINE_FUNCTIONS)
+PERL_STATIC_INLINE unsigned int
+Perl_variant_byte_number(PERL_UINTMAX_T word)
+        __attribute__warn_unused_result__;
+#   define PERL_ARGS_ASSERT_VARIANT_BYTE_NUMBER
+
+# endif
 #endif
+#if defined(F_FREESP) && !defined(HAS_CHSIZE) && !defined(HAS_TRUNCATE)
+PERL_CALLCONV I32
+Perl_my_chsize(pTHX_ int fd, Off_t length)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_MY_CHSIZE
 
 #endif
 #if !defined(HAS_GETENV_LEN)
-PERL_CALLCONV char*    Perl_getenv_len(pTHX_ const char *env_elem, unsigned long *len);
-#define PERL_ARGS_ASSERT_GETENV_LEN    \
-       assert(env_elem); assert(len)
-#endif
-#if !defined(HAS_MKDIR) || !defined(HAS_RMDIR)
-#  if defined(PERL_IN_PP_SYS_C)
-STATIC int     S_dooneliner(pTHX_ const char *cmd, const char *filename)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_DOONELINER    \
-       assert(cmd); assert(filename)
-
-#  endif
+PERL_CALLCONV char *
+Perl_getenv_len(pTHX_ const char *env_elem, unsigned long *len)
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_GETENV_LEN            \
+        assert(env_elem); assert(len)
+
 #endif
 #if !defined(HAS_MKOSTEMP)
-PERL_CALLCONV int      Perl_my_mkostemp(char *templte, int flags);
-#define PERL_ARGS_ASSERT_MY_MKOSTEMP   \
-       assert(templte)
+PERL_CALLCONV int
+Perl_my_mkostemp(char *templte, int flags)
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_MY_MKOSTEMP           \
+        assert(templte)
+
 #endif
 #if !defined(HAS_MKSTEMP)
-PERL_CALLCONV int      Perl_my_mkstemp(char *templte);
-#define PERL_ARGS_ASSERT_MY_MKSTEMP    \
-       assert(templte)
-#endif
-#if !defined(HAS_RENAME)
-PERL_CALLCONV I32      Perl_same_dirent(pTHX_ const char* a, const char* b);
-#define PERL_ARGS_ASSERT_SAME_DIRENT   \
-       assert(a); assert(b)
-#endif
-#if !defined(HAS_SIGNBIT)
-PERL_CALLCONV int      Perl_signbit(NV f)
-                       __attribute__warn_unused_result__
-                       __attribute__pure__;
-#define PERL_ARGS_ASSERT_PERL_SIGNBIT
+PERL_CALLCONV int
+Perl_my_mkstemp(char *templte)
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_MY_MKSTEMP            \
+        assert(templte)
 
 #endif
-#if !defined(HAS_STRLCAT)
-PERL_CALLCONV Size_t   Perl_my_strlcat(char *dst, const char *src, Size_t size);
-#define PERL_ARGS_ASSERT_MY_STRLCAT
-#endif
-#if !defined(HAS_STRLCPY)
-PERL_CALLCONV Size_t   Perl_my_strlcpy(char *dst, const char *src, Size_t size);
-#define PERL_ARGS_ASSERT_MY_STRLCPY
-#endif
-#if !defined(HAS_STRNLEN)
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE Size_t      Perl_my_strnlen(const char *str, Size_t maxlen);
-#define PERL_ARGS_ASSERT_MY_STRNLEN    \
-       assert(str)
-#endif
-#endif
-#if !defined(HAS_TRUNCATE) && !defined(HAS_CHSIZE) && defined(F_FREESP)
-PERL_CALLCONV I32      Perl_my_chsize(pTHX_ int fd, Off_t length)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_MY_CHSIZE
+#if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
+PERL_CALLCONV I32
+Perl_do_ipcctl(pTHX_ I32 optype, SV **mark, SV **sp)
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_DO_IPCCTL             \
+        assert(mark); assert(sp)
+
+PERL_CALLCONV I32
+Perl_do_ipcget(pTHX_ I32 optype, SV **mark, SV **sp)
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_DO_IPCGET             \
+        assert(mark); assert(sp)
+
+PERL_CALLCONV I32
+Perl_do_msgrcv(pTHX_ SV **mark, SV **sp)
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_DO_MSGRCV             \
+        assert(mark); assert(sp)
+
+PERL_CALLCONV I32
+Perl_do_msgsnd(pTHX_ SV **mark, SV **sp)
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_DO_MSGSND             \
+        assert(mark); assert(sp)
+
+PERL_CALLCONV I32
+Perl_do_semop(pTHX_ SV **mark, SV **sp)
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_DO_SEMOP              \
+        assert(mark); assert(sp)
+
+PERL_CALLCONV I32
+Perl_do_shmio(pTHX_ I32 optype, SV **mark, SV **sp)
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_DO_SHMIO              \
+        assert(mark); assert(sp)
+
+#endif /* defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM) */
+#if defined(HAS_NL_LANGINFO) && defined(PERL_LANGINFO_H)
+PERL_CALLCONV const char *
+Perl_langinfo(const nl_item item);
+# define PERL_ARGS_ASSERT_PERL_LANGINFO
 
-#endif
-#if !defined(NV_PRESERVES_UV)
-#  if defined(DEBUGGING)
-#    if defined(PERL_IN_SV_C)
-STATIC int     S_sv_2iuv_non_preserve(pTHX_ SV *const sv, I32 numtype);
-#define PERL_ARGS_ASSERT_SV_2IUV_NON_PRESERVE  \
-       assert(sv)
-#    endif
-#  endif
-#endif
-#if !defined(PERL_DISABLE_PMC)
-#  if defined(PERL_IN_PP_CTL_C)
-STATIC PerlIO *        S_doopen_pm(pTHX_ SV *name)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_DOOPEN_PM     \
-       assert(name)
-
-#  endif
-#endif
-#if !defined(PERL_EXT_RE_BUILD)
-#  if defined(PERL_IN_REGCOMP_C)
-STATIC void    S__append_range_to_invlist(pTHX_ SV* const invlist, const UV start, const UV end);
-#define PERL_ARGS_ASSERT__APPEND_RANGE_TO_INVLIST      \
-       assert(invlist)
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE UV* S__invlist_array_init(SV* const invlist, const bool will_have_0)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT__INVLIST_ARRAY_INIT   \
-       assert(invlist)
-#endif
+PERL_CALLCONV const char *
+Perl_langinfo8(const nl_item item, utf8ness_t *utf8ness);
+# define PERL_ARGS_ASSERT_PERL_LANGINFO8
 
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE IV* S_get_invlist_previous_index_addr(SV* invlist)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_GET_INVLIST_PREVIOUS_INDEX_ADDR       \
-       assert(invlist)
-#endif
+#else
+PERL_CALLCONV const char *
+Perl_langinfo(const int item);
+# define PERL_ARGS_ASSERT_PERL_LANGINFO
 
-STATIC void    S_initialize_invlist_guts(pTHX_ SV* invlist, const Size_t initial_size);
-#define PERL_ARGS_ASSERT_INITIALIZE_INVLIST_GUTS       \
-       assert(invlist)
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE void        S_invlist_clear(pTHX_ SV* invlist);
-#define PERL_ARGS_ASSERT_INVLIST_CLEAR \
-       assert(invlist)
-#endif
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE UV  S_invlist_max(const SV* const invlist)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_INVLIST_MAX   \
-       assert(invlist)
-#endif
+PERL_CALLCONV const char *
+Perl_langinfo8(const int item, utf8ness_t *utf8ness);
+# define PERL_ARGS_ASSERT_PERL_LANGINFO8
 
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE IV  S_invlist_previous_index(SV* const invlist)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_INVLIST_PREVIOUS_INDEX        \
-       assert(invlist)
 #endif
+#if defined(HAS_PIPE)
+PERL_CALLCONV int
+Perl_PerlProc_pipe_cloexec(pTHX_ int *pipefd)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_PERLPROC_PIPE_CLOEXEC \
+        assert(pipefd)
 
-STATIC void    S_invlist_replace_list_destroys_src(pTHX_ SV *dest, SV *src);
-#define PERL_ARGS_ASSERT_INVLIST_REPLACE_LIST_DESTROYS_SRC     \
-       assert(dest); assert(src)
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE void        S_invlist_set_previous_index(SV* const invlist, const IV index);
-#define PERL_ARGS_ASSERT_INVLIST_SET_PREVIOUS_INDEX    \
-       assert(invlist)
-#endif
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE void        S_invlist_trim(SV* invlist);
-#define PERL_ARGS_ASSERT_INVLIST_TRIM  \
-       assert(invlist)
-#endif
-#  endif
-#  if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C)
-PERL_CALLCONV SV*      Perl_get_regclass_nonbitmap_data(pTHX_ const regexp *prog, const struct regnode *node, bool doinit, SV **listsvp, SV **lonly_utf8_locale, SV **output_invlist);
-#define PERL_ARGS_ASSERT_GET_REGCLASS_NONBITMAP_DATA   \
-       assert(node)
-#  endif
-#endif
-#if !defined(PERL_IMPLICIT_SYS)
-PERL_CALLCONV I32      Perl_my_pclose(pTHX_ PerlIO* ptr);
-#define PERL_ARGS_ASSERT_MY_PCLOSE
-PERL_CALLCONV PerlIO*  Perl_my_popen(pTHX_ const char* cmd, const char* mode);
-#define PERL_ARGS_ASSERT_MY_POPEN      \
-       assert(cmd); assert(mode)
-#endif
-#if !defined(PERL_IS_MINIPERL)
-#  if defined(PERL_IN_PERL_C)
-STATIC SV *    S_incpush_if_exists(pTHX_ AV *const av, SV *dir, SV *const stem);
-#define PERL_ARGS_ASSERT_INCPUSH_IF_EXISTS     \
-       assert(av); assert(dir); assert(stem)
-#  endif
-#endif
-#if !defined(PERL_NO_INLINE_FUNCTIONS)
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE void        Perl_cx_popblock(pTHX_ PERL_CONTEXT *cx);
-#define PERL_ARGS_ASSERT_CX_POPBLOCK   \
-       assert(cx)
-#endif
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE void        Perl_cx_popeval(pTHX_ PERL_CONTEXT *cx);
-#define PERL_ARGS_ASSERT_CX_POPEVAL    \
-       assert(cx)
-#endif
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE void        Perl_cx_popformat(pTHX_ PERL_CONTEXT *cx);
-#define PERL_ARGS_ASSERT_CX_POPFORMAT  \
-       assert(cx)
-#endif
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE void        Perl_cx_popgiven(pTHX_ PERL_CONTEXT *cx);
-#define PERL_ARGS_ASSERT_CX_POPGIVEN   \
-       assert(cx)
-#endif
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE void        Perl_cx_poploop(pTHX_ PERL_CONTEXT *cx);
-#define PERL_ARGS_ASSERT_CX_POPLOOP    \
-       assert(cx)
-#endif
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE void        Perl_cx_popsub(pTHX_ PERL_CONTEXT *cx);
-#define PERL_ARGS_ASSERT_CX_POPSUB     \
-       assert(cx)
-#endif
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE void        Perl_cx_popsub_args(pTHX_ PERL_CONTEXT *cx);
-#define PERL_ARGS_ASSERT_CX_POPSUB_ARGS        \
-       assert(cx)
-#endif
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE void        Perl_cx_popsub_common(pTHX_ PERL_CONTEXT *cx);
-#define PERL_ARGS_ASSERT_CX_POPSUB_COMMON      \
-       assert(cx)
-#endif
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE void        Perl_cx_popwhen(pTHX_ PERL_CONTEXT *cx);
-#define PERL_ARGS_ASSERT_CX_POPWHEN    \
-       assert(cx)
-#endif
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE PERL_CONTEXT *      Perl_cx_pushblock(pTHX_ U8 type, U8 gimme, SV** sp, I32 saveix);
-#define PERL_ARGS_ASSERT_CX_PUSHBLOCK  \
-       assert(sp)
-#endif
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE void        Perl_cx_pusheval(pTHX_ PERL_CONTEXT *cx, OP *retop, SV *namesv);
-#define PERL_ARGS_ASSERT_CX_PUSHEVAL   \
-       assert(cx)
-#endif
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE void        Perl_cx_pushformat(pTHX_ PERL_CONTEXT *cx, CV *cv, OP *retop, GV *gv);
-#define PERL_ARGS_ASSERT_CX_PUSHFORMAT \
-       assert(cx); assert(cv)
-#endif
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE void        Perl_cx_pushgiven(pTHX_ PERL_CONTEXT *cx, SV *orig_defsv);
-#define PERL_ARGS_ASSERT_CX_PUSHGIVEN  \
-       assert(cx)
-#endif
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE void        Perl_cx_pushloop_for(pTHX_ PERL_CONTEXT *cx, void *itervarp, SV *itersave);
-#define PERL_ARGS_ASSERT_CX_PUSHLOOP_FOR       \
-       assert(cx); assert(itervarp)
-#endif
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE void        Perl_cx_pushloop_plain(pTHX_ PERL_CONTEXT *cx);
-#define PERL_ARGS_ASSERT_CX_PUSHLOOP_PLAIN     \
-       assert(cx)
-#endif
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE void        Perl_cx_pushsub(pTHX_ PERL_CONTEXT *cx, CV *cv, OP *retop, bool hasargs);
-#define PERL_ARGS_ASSERT_CX_PUSHSUB    \
-       assert(cx); assert(cv)
-#endif
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE void        Perl_cx_pushtry(pTHX_ PERL_CONTEXT *cx, OP *retop);
-#define PERL_ARGS_ASSERT_CX_PUSHTRY    \
-       assert(cx)
-#endif
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE void        Perl_cx_pushwhen(pTHX_ PERL_CONTEXT *cx);
-#define PERL_ARGS_ASSERT_CX_PUSHWHEN   \
-       assert(cx)
-#endif
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE void        Perl_cx_topblock(pTHX_ PERL_CONTEXT *cx);
-#define PERL_ARGS_ASSERT_CX_TOPBLOCK   \
-       assert(cx)
-#endif
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE U8  Perl_gimme_V(pTHX);
-#define PERL_ARGS_ASSERT_GIMME_V
-#endif
-#endif
-#if !defined(PERL_NO_UTF16_FILTER)
-#  if defined(PERL_IN_TOKE_C)
-STATIC U8*     S_add_utf16_textfilter(pTHX_ U8 *const s, bool reversed);
-#define PERL_ARGS_ASSERT_ADD_UTF16_TEXTFILTER  \
-       assert(s)
-STATIC I32     S_utf16_textfilter(pTHX_ int idx, SV *sv, int maxlen);
-#define PERL_ARGS_ASSERT_UTF16_TEXTFILTER      \
-       assert(sv)
-#  endif
-#endif
-#if !defined(PURIFY)
-#  if defined(PERL_IN_HV_C)
-STATIC HE*     S_new_he(pTHX)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_NEW_HE
-
-#  endif
-#endif
-#if !defined(SETUID_SCRIPTS_ARE_SECURE_NOW)
-#  if defined(PERL_IN_PERL_C)
-STATIC void    S_validate_suid(pTHX_ PerlIO *rsfp);
-#define PERL_ARGS_ASSERT_VALIDATE_SUID \
-       assert(rsfp)
-#  endif
-#endif
-#if !defined(USE_ITHREADS)
-/* PERL_CALLCONV void  CopFILEGV_set(pTHX_ COP * c, GV * gv); */
-#define PERL_ARGS_ASSERT_COPFILEGV_SET
-#endif
-#if !defined(WIN32)
-PERL_CALLCONV bool     Perl_do_exec3(pTHX_ const char *incmd, int fd, int do_report);
-#define PERL_ARGS_ASSERT_DO_EXEC3      \
-       assert(incmd)
 #endif
-#if 0  /* Not currently used, but may be needed in the future */
-#  if defined(PERL_IN_UTF8_C)
-STATIC void    S_warn_on_first_deprecated_use(pTHX_ const char * const name, const char * const alternative, const bool use_locale, const char * const file, const unsigned line);
-#define PERL_ARGS_ASSERT_WARN_ON_FIRST_DEPRECATED_USE  \
-       assert(name); assert(alternative); assert(file)
-#  endif
-#endif
-#if defined (HAS_SOCKETPAIR) ||     (defined (HAS_SOCKET) && defined(SOCK_DGRAM) &&    defined(AF_INET) && defined(PF_INET))
-PERL_CALLCONV int      Perl_PerlSock_socketpair_cloexec(pTHX_ int domain, int type, int protocol, int *pairfd)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_PERLSOCK_SOCKETPAIR_CLOEXEC   \
-       assert(pairfd)
+#if !defined(HAS_RENAME)
+PERL_CALLCONV I32
+Perl_same_dirent(pTHX_ const char *a, const char *b)
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_SAME_DIRENT           \
+        assert(a); assert(b)
 
 #endif
-#if defined(DEBUGGING)
-PERL_CALLCONV int      Perl_get_debug_opts(pTHX_ const char **s, bool givehelp)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_GET_DEBUG_OPTS        \
-       assert(s)
-
-PERL_CALLCONV void     Perl_hv_assert(pTHX_ HV *hv);
-#define PERL_ARGS_ASSERT_HV_ASSERT     \
-       assert(hv)
-PERL_CALLCONV void     Perl_pad_setsv(pTHX_ PADOFFSET po, SV* sv);
-#define PERL_ARGS_ASSERT_PAD_SETSV     \
-       assert(sv)
-PERL_CALLCONV SV*      Perl_pad_sv(pTHX_ PADOFFSET po);
-#define PERL_ARGS_ASSERT_PAD_SV
-PERL_CALLCONV void     Perl_set_padlist(CV * cv, PADLIST * padlist);
-#define PERL_ARGS_ASSERT_SET_PADLIST   \
-       assert(cv)
-#  if defined(PERL_IN_LOCALE_C)
-#    if defined(USE_LOCALE)
-STATIC void    S_print_bytes_for_locale(pTHX_ const char * const s, const char * const e, const bool is_utf8);
-#define PERL_ARGS_ASSERT_PRINT_BYTES_FOR_LOCALE        \
-       assert(s); assert(e)
-STATIC void    S_print_collxfrm_input_and_return(pTHX_ const char * const s, const char * const e, const STRLEN * const xlen, const bool is_utf8);
-#define PERL_ARGS_ASSERT_PRINT_COLLXFRM_INPUT_AND_RETURN       \
-       assert(s); assert(e)
-STATIC char *  S_setlocale_debug_string(const int category, const char* const locale, const char* const retval)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_SETLOCALE_DEBUG_STRING
-
-#    endif
-#  endif
-#  if defined(PERL_IN_PAD_C)
-STATIC void    S_cv_dump(pTHX_ const CV *cv, const char *title);
-#define PERL_ARGS_ASSERT_CV_DUMP       \
-       assert(cv); assert(title)
-#  endif
-#  if defined(PERL_IN_REGCOMP_C)
-STATIC void    S_dump_trie(pTHX_ const struct _reg_trie_data *trie, HV* widecharmap, AV *revcharmap, U32 depth);
-#define PERL_ARGS_ASSERT_DUMP_TRIE     \
-       assert(trie); assert(revcharmap)
-STATIC void    S_dump_trie_interim_list(pTHX_ const struct _reg_trie_data *trie, HV* widecharmap, AV *revcharmap, U32 next_alloc, U32 depth);
-#define PERL_ARGS_ASSERT_DUMP_TRIE_INTERIM_LIST        \
-       assert(trie); assert(revcharmap)
-STATIC void    S_dump_trie_interim_table(pTHX_ const struct _reg_trie_data *trie, HV* widecharmap, AV *revcharmap, U32 next_alloc, U32 depth);
-#define PERL_ARGS_ASSERT_DUMP_TRIE_INTERIM_TABLE       \
-       assert(trie); assert(revcharmap)
-STATIC const regnode*  S_dumpuntil(pTHX_ const regexp *r, const regnode *start, const regnode *node, const regnode *last, const regnode *plast, SV* sv, I32 indent, U32 depth);
-#define PERL_ARGS_ASSERT_DUMPUNTIL     \
-       assert(r); assert(start); assert(node); assert(sv)
-STATIC bool    S_put_charclass_bitmap_innards(pTHX_ SV* sv, char* bitmap, SV* nonbitmap_invlist, SV* only_utf8_locale_invlist, const regnode * const node, const U8 flags, const bool force_as_is_display);
-#define PERL_ARGS_ASSERT_PUT_CHARCLASS_BITMAP_INNARDS  \
-       assert(sv)
-STATIC SV*     S_put_charclass_bitmap_innards_common(pTHX_ SV* invlist, SV* posixes, SV* only_utf8, SV* not_utf8, SV* only_utf8_locale, const bool invert);
-#define PERL_ARGS_ASSERT_PUT_CHARCLASS_BITMAP_INNARDS_COMMON   \
-       assert(invlist)
-STATIC void    S_put_charclass_bitmap_innards_invlist(pTHX_ SV *sv, SV* invlist);
-#define PERL_ARGS_ASSERT_PUT_CHARCLASS_BITMAP_INNARDS_INVLIST  \
-       assert(sv); assert(invlist)
-STATIC void    S_put_code_point(pTHX_ SV* sv, UV c);
-#define PERL_ARGS_ASSERT_PUT_CODE_POINT        \
-       assert(sv)
-STATIC void    S_put_range(pTHX_ SV* sv, UV start, const UV end, const bool allow_literals);
-#define PERL_ARGS_ASSERT_PUT_RANGE     \
-       assert(sv)
-PERL_CALLCONV int      Perl_re_indentf(pTHX_ const char *fmt, U32 depth, ...);
-#define PERL_ARGS_ASSERT_RE_INDENTF    \
-       assert(fmt)
-STATIC void    S_regdump_extflags(pTHX_ const char *lead, const U32 flags);
-#define PERL_ARGS_ASSERT_REGDUMP_EXTFLAGS
-STATIC void    S_regdump_intflags(pTHX_ const char *lead, const U32 flags);
-#define PERL_ARGS_ASSERT_REGDUMP_INTFLAGS
-STATIC regnode_offset  S_regnode_guts_debug(pTHX_ RExC_state_t *pRExC_state, const U8 op, const STRLEN extra_len);
-#define PERL_ARGS_ASSERT_REGNODE_GUTS_DEBUG    \
-       assert(pRExC_state)
-STATIC bool    S_regtail_study(pTHX_ RExC_state_t *pRExC_state, regnode_offset p, const regnode_offset val, U32 depth)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_REGTAIL_STUDY \
-       assert(pRExC_state); assert(p); assert(val)
-
-#  endif
-#  if defined(PERL_IN_REGEXEC_C)
-STATIC void    S_debug_start_match(pTHX_ const REGEXP *prog, const bool do_utf8, const char *start, const char *end, const char *blurb);
-#define PERL_ARGS_ASSERT_DEBUG_START_MATCH     \
-       assert(prog); assert(start); assert(end); assert(blurb)
-STATIC void    S_dump_exec_pos(pTHX_ const char *locinput, const regnode *scan, const char *loc_regeol, const char *loc_bostr, const char *loc_reg_starttry, const bool do_utf8, const U32 depth);
-#define PERL_ARGS_ASSERT_DUMP_EXEC_POS \
-       assert(locinput); assert(scan); assert(loc_regeol); assert(loc_bostr); assert(loc_reg_starttry)
-PERL_CALLCONV int      Perl_re_exec_indentf(pTHX_ const char *fmt, U32 depth, ...);
-#define PERL_ARGS_ASSERT_RE_EXEC_INDENTF       \
-       assert(fmt)
-#  endif
-#  if defined(PERL_IN_SV_C)
-STATIC void    S_del_sv(pTHX_ SV *p);
-#define PERL_ARGS_ASSERT_DEL_SV        \
-       assert(p)
-#  endif
-#  if defined(PERL_IN_TOKE_C)
-STATIC void    S_printbuf(pTHX_ const char *const fmt, const char *const s)
-                       __attribute__format__(__printf__,pTHX_1,0);
-#define PERL_ARGS_ASSERT_PRINTBUF      \
-       assert(fmt); assert(s)
-
-STATIC int     S_tokereport(pTHX_ I32 rv, const YYSTYPE* lvalp);
-#define PERL_ARGS_ASSERT_TOKEREPORT    \
-       assert(lvalp)
-#  endif
-#endif
-#if defined(DEBUGGING) && defined(ENABLE_REGEX_SETS_DEBUGGING)
-#  if defined(PERL_IN_REGCOMP_C)
-STATIC void    S_dump_regex_sets_structures(pTHX_ RExC_state_t *pRExC_state, AV * stack, const IV fence, AV * fence_stack);
-#define PERL_ARGS_ASSERT_DUMP_REGEX_SETS_STRUCTURES    \
-       assert(pRExC_state); assert(stack); assert(fence_stack)
-#  endif
-#endif
-#if defined(DEBUG_LEAKING_SCALARS_FORK_DUMP)
-PERL_CALLCONV void     Perl_dump_sv_child(pTHX_ SV *sv);
-#define PERL_ARGS_ASSERT_DUMP_SV_CHILD \
-       assert(sv)
-#endif
-#if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
-PERL_CALLCONV I32      Perl_do_ipcctl(pTHX_ I32 optype, SV** mark, SV** sp);
-#define PERL_ARGS_ASSERT_DO_IPCCTL     \
-       assert(mark); assert(sp)
-PERL_CALLCONV I32      Perl_do_ipcget(pTHX_ I32 optype, SV** mark, SV** sp);
-#define PERL_ARGS_ASSERT_DO_IPCGET     \
-       assert(mark); assert(sp)
-PERL_CALLCONV I32      Perl_do_msgrcv(pTHX_ SV** mark, SV** sp);
-#define PERL_ARGS_ASSERT_DO_MSGRCV     \
-       assert(mark); assert(sp)
-PERL_CALLCONV I32      Perl_do_msgsnd(pTHX_ SV** mark, SV** sp);
-#define PERL_ARGS_ASSERT_DO_MSGSND     \
-       assert(mark); assert(sp)
-PERL_CALLCONV I32      Perl_do_semop(pTHX_ SV** mark, SV** sp);
-#define PERL_ARGS_ASSERT_DO_SEMOP      \
-       assert(mark); assert(sp)
-PERL_CALLCONV I32      Perl_do_shmio(pTHX_ I32 optype, SV** mark, SV** sp);
-#define PERL_ARGS_ASSERT_DO_SHMIO      \
-       assert(mark); assert(sp)
-#endif
-#if defined(HAS_NL_LANGINFO)
-#  if defined(PERL_IN_LOCALE_C)
-STATIC const char*     S_my_nl_langinfo(const nl_item item, bool toggle);
-#define PERL_ARGS_ASSERT_MY_NL_LANGINFO
-#  endif
-#endif
-#if defined(HAS_NL_LANGINFO) && defined(PERL_LANGINFO_H)
-PERL_CALLCONV const char*      Perl_langinfo(const nl_item item);
-#define PERL_ARGS_ASSERT_PERL_LANGINFO
-#endif
-#if defined(HAS_PIPE)
-PERL_CALLCONV int      Perl_PerlProc_pipe_cloexec(pTHX_ int *pipefd)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_PERLPROC_PIPE_CLOEXEC \
-       assert(pipefd)
+#if !defined(HAS_SIGNBIT)
+PERL_CALLCONV int
+Perl_signbit(NV f)
+        __attribute__warn_unused_result__
+        __attribute__pure__;
+# define PERL_ARGS_ASSERT_PERL_SIGNBIT
 
 #endif
 #if defined(HAS_SOCKET)
-PERL_CALLCONV int      Perl_PerlSock_accept_cloexec(pTHX_ int listenfd, struct sockaddr *addr, Sock_size_t *addrlen)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_PERLSOCK_ACCEPT_CLOEXEC
-
-PERL_CALLCONV int      Perl_PerlSock_socket_cloexec(pTHX_ int domain, int type, int protocol)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_PERLSOCK_SOCKET_CLOEXEC
+PERL_CALLCONV int
+Perl_PerlSock_accept_cloexec(pTHX_ int listenfd, struct sockaddr *addr, Sock_size_t *addrlen)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_PERLSOCK_ACCEPT_CLOEXEC
+
+PERL_CALLCONV int
+Perl_PerlSock_socket_cloexec(pTHX_ int domain, int type, int protocol)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_PERLSOCK_SOCKET_CLOEXEC
+
+#endif /* defined(HAS_SOCKET) */
+#if   defined(HAS_SOCKETPAIR) ||                                     \
+    ( defined(AF_INET) && defined(HAS_SOCKET) && defined(PF_INET) && \
+      defined(SOCK_DGRAM) )
+PERL_CALLCONV int
+Perl_PerlSock_socketpair_cloexec(pTHX_ int domain, int type, int protocol, int *pairfd)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_PERLSOCK_SOCKETPAIR_CLOEXEC \
+        assert(pairfd)
 
 #endif
-#if defined(HAVE_INTERP_INTERN)
-PERL_CALLCONV void     Perl_sys_intern_clear(pTHX);
-#define PERL_ARGS_ASSERT_SYS_INTERN_CLEAR
-PERL_CALLCONV void     Perl_sys_intern_init(pTHX);
-#define PERL_ARGS_ASSERT_SYS_INTERN_INIT
-#  if defined(USE_ITHREADS)
-PERL_CALLCONV void     Perl_sys_intern_dup(pTHX_ struct interp_intern* src, struct interp_intern* dst);
-#define PERL_ARGS_ASSERT_SYS_INTERN_DUP        \
-       assert(src); assert(dst)
-#  endif
-#endif
-#if defined(MULTIPLICITY)
-PERL_CALLCONV_NO_RET void      Perl_croak_nocontext(const char* pat, ...)
-                       __attribute__noreturn__
-                       __attribute__format__null_ok__(__printf__,1,2);
-#define PERL_ARGS_ASSERT_CROAK_NOCONTEXT
-
-PERL_CALLCONV void     Perl_deb_nocontext(const char* pat, ...)
-                       __attribute__format__(__printf__,1,2);
-#define PERL_ARGS_ASSERT_DEB_NOCONTEXT \
-       assert(pat)
-
-PERL_CALLCONV_NO_RET OP*       Perl_die_nocontext(const char* pat, ...)
-                       __attribute__noreturn__
-                       __attribute__format__null_ok__(__printf__,1,2);
-#define PERL_ARGS_ASSERT_DIE_NOCONTEXT
-
-PERL_CALLCONV char*    Perl_form_nocontext(const char* pat, ...)
-                       __attribute__format__(__printf__,1,2);
-#define PERL_ARGS_ASSERT_FORM_NOCONTEXT        \
-       assert(pat)
-
-#ifndef NO_MATHOMS
-PERL_CALLCONV int      Perl_fprintf_nocontext(PerlIO *stream, const char *format, ...)
-                       __attribute__deprecated__
-                       __attribute__format__(__printf__,2,3);
-#define PERL_ARGS_ASSERT_FPRINTF_NOCONTEXT     \
-       assert(stream); assert(format)
-#endif
+#if !defined(HAS_STRLCPY)
+STATIC Size_t
+Perl_my_strlcpy(char *dst, const char *src, Size_t size);
+# define PERL_ARGS_ASSERT_MY_STRLCPY
 
-PERL_CALLCONV void     Perl_load_module_nocontext(U32 flags, SV* name, SV* ver, ...);
-#define PERL_ARGS_ASSERT_LOAD_MODULE_NOCONTEXT \
-       assert(name)
-PERL_CALLCONV SV*      Perl_mess_nocontext(const char* pat, ...)
-                       __attribute__format__(__printf__,1,2);
-#define PERL_ARGS_ASSERT_MESS_NOCONTEXT        \
-       assert(pat)
-
-PERL_CALLCONV void*    Perl_my_cxt_init(pTHX_ int *indexp, size_t size);
-#define PERL_ARGS_ASSERT_MY_CXT_INIT   \
-       assert(indexp)
-PERL_CALLCONV SV*      Perl_newSVpvf_nocontext(const char *const pat, ...)
-                       __attribute__format__(__printf__,1,2);
-#define PERL_ARGS_ASSERT_NEWSVPVF_NOCONTEXT    \
-       assert(pat)
-
-#ifndef NO_MATHOMS
-PERL_CALLCONV int      Perl_printf_nocontext(const char *format, ...)
-                       __attribute__deprecated__
-                       __attribute__format__(__printf__,1,2);
-#define PERL_ARGS_ASSERT_PRINTF_NOCONTEXT      \
-       assert(format)
 #endif
+#if defined(HAVE_INTERP_INTERN)
+PERL_CALLCONV void
+Perl_sys_intern_clear(pTHX);
+# define PERL_ARGS_ASSERT_SYS_INTERN_CLEAR
+
+PERL_CALLCONV void
+Perl_sys_intern_init(pTHX);
+# define PERL_ARGS_ASSERT_SYS_INTERN_INIT
+
+# if defined(USE_ITHREADS)
+PERL_CALLCONV void
+Perl_sys_intern_dup(pTHX_ struct interp_intern *src, struct interp_intern *dst);
+#   define PERL_ARGS_ASSERT_SYS_INTERN_DUP      \
+        assert(src); assert(dst)
+
+# endif
+#endif /* defined(HAVE_INTERP_INTERN) */
+#if defined(_MSC_VER)
+PERL_CALLCONV int
+Perl_magic_regdatum_set(pTHX_ SV *sv, MAGIC *mg)
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_MAGIC_REGDATUM_SET    \
+        assert(sv); assert(mg)
 
-PERL_CALLCONV void     Perl_sv_catpvf_mg_nocontext(SV *const sv, const char *const pat, ...)
-                       __attribute__format__(__printf__,2,3);
-#define PERL_ARGS_ASSERT_SV_CATPVF_MG_NOCONTEXT        \
-       assert(sv); assert(pat)
-
-PERL_CALLCONV void     Perl_sv_catpvf_nocontext(SV *const sv, const char *const pat, ...)
-                       __attribute__format__(__printf__,2,3);
-#define PERL_ARGS_ASSERT_SV_CATPVF_NOCONTEXT   \
-       assert(sv); assert(pat)
-
-PERL_CALLCONV void     Perl_sv_setpvf_mg_nocontext(SV *const sv, const char *const pat, ...)
-                       __attribute__format__(__printf__,2,3);
-#define PERL_ARGS_ASSERT_SV_SETPVF_MG_NOCONTEXT        \
-       assert(sv); assert(pat)
-
-PERL_CALLCONV void     Perl_sv_setpvf_nocontext(SV *const sv, const char *const pat, ...)
-                       __attribute__format__(__printf__,2,3);
-#define PERL_ARGS_ASSERT_SV_SETPVF_NOCONTEXT   \
-       assert(sv); assert(pat)
-
-PERL_CALLCONV void     Perl_warn_nocontext(const char* pat, ...)
-                       __attribute__format__(__printf__,1,2);
-#define PERL_ARGS_ASSERT_WARN_NOCONTEXT        \
-       assert(pat)
-
-PERL_CALLCONV void     Perl_warner_nocontext(U32 err, const char* pat, ...)
-                       __attribute__format__(__printf__,2,3);
-#define PERL_ARGS_ASSERT_WARNER_NOCONTEXT      \
-       assert(pat)
+#else
+PERL_CALLCONV_NO_RET int
+Perl_magic_regdatum_set(pTHX_ SV *sv, MAGIC *mg)
+        __attribute__noreturn__
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_MAGIC_REGDATUM_SET    \
+        assert(sv); assert(mg)
 
 #endif
+#if defined(MULTIPLICITY)
+PERL_CALLCONV_NO_RET void
+Perl_croak_nocontext(const char *pat, ...)
+        __attribute__noreturn__
+        __attribute__format__null_ok__(__printf__,1,2);
+# define PERL_ARGS_ASSERT_CROAK_NOCONTEXT
+
+PERL_CALLCONV void
+Perl_deb_nocontext(const char *pat, ...)
+        __attribute__format__(__printf__,1,2);
+# define PERL_ARGS_ASSERT_DEB_NOCONTEXT         \
+        assert(pat)
+
+PERL_CALLCONV_NO_RET OP *
+Perl_die_nocontext(const char *pat, ...)
+        __attribute__noreturn__
+        __attribute__format__null_ok__(__printf__,1,2);
+# define PERL_ARGS_ASSERT_DIE_NOCONTEXT
+
+PERL_CALLCONV char *
+Perl_form_nocontext(const char *pat, ...)
+        __attribute__format__(__printf__,1,2);
+# define PERL_ARGS_ASSERT_FORM_NOCONTEXT        \
+        assert(pat)
+
+PERL_CALLCONV void
+Perl_load_module_nocontext(U32 flags, SV *name, SV *ver, ...);
+# define PERL_ARGS_ASSERT_LOAD_MODULE_NOCONTEXT \
+        assert(name)
+
+PERL_CALLCONV SV *
+Perl_mess_nocontext(const char *pat, ...)
+        __attribute__format__(__printf__,1,2);
+# define PERL_ARGS_ASSERT_MESS_NOCONTEXT        \
+        assert(pat)
+
+PERL_CALLCONV void *
+Perl_my_cxt_init(pTHX_ int *indexp, size_t size);
+# define PERL_ARGS_ASSERT_MY_CXT_INIT           \
+        assert(indexp)
+
+PERL_CALLCONV SV *
+Perl_newSVpvf_nocontext(const char * const pat, ...)
+        __attribute__format__(__printf__,1,2);
+# define PERL_ARGS_ASSERT_NEWSVPVF_NOCONTEXT    \
+        assert(pat)
+
+PERL_CALLCONV void
+Perl_sv_catpvf_mg_nocontext(SV * const sv, const char * const pat, ...)
+        __attribute__format__(__printf__,2,3);
+# define PERL_ARGS_ASSERT_SV_CATPVF_MG_NOCONTEXT \
+        assert(sv); assert(pat)
+
+PERL_CALLCONV void
+Perl_sv_catpvf_nocontext(SV * const sv, const char * const pat, ...)
+        __attribute__format__(__printf__,2,3);
+# define PERL_ARGS_ASSERT_SV_CATPVF_NOCONTEXT   \
+        assert(sv); assert(pat)
+
+PERL_CALLCONV void
+Perl_sv_setpvf_mg_nocontext(SV * const sv, const char * const pat, ...)
+        __attribute__format__(__printf__,2,3);
+# define PERL_ARGS_ASSERT_SV_SETPVF_MG_NOCONTEXT \
+        assert(sv); assert(pat)
+
+PERL_CALLCONV void
+Perl_sv_setpvf_nocontext(SV * const sv, const char * const pat, ...)
+        __attribute__format__(__printf__,2,3);
+# define PERL_ARGS_ASSERT_SV_SETPVF_NOCONTEXT   \
+        assert(sv); assert(pat)
+
+PERL_CALLCONV void
+Perl_warn_nocontext(const char *pat, ...)
+        __attribute__format__(__printf__,1,2);
+# define PERL_ARGS_ASSERT_WARN_NOCONTEXT        \
+        assert(pat)
+
+PERL_CALLCONV void
+Perl_warner_nocontext(U32 err, const char *pat, ...)
+        __attribute__format__(__printf__,2,3);
+# define PERL_ARGS_ASSERT_WARNER_NOCONTEXT      \
+        assert(pat)
+
+#endif /* defined(MULTIPLICITY) */
 #if defined(MYMALLOC)
-PERL_CALLCONV void     Perl_dump_mstats(pTHX_ const char* s);
-#define PERL_ARGS_ASSERT_DUMP_MSTATS   \
-       assert(s)
-PERL_CALLCONV int      Perl_get_mstats(pTHX_ perl_mstats_t *buf, int buflen, int level);
-#define PERL_ARGS_ASSERT_GET_MSTATS    \
-       assert(buf)
-PERL_CALLCONV MEM_SIZE Perl_malloc_good_size(size_t nbytes)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_MALLOC_GOOD_SIZE
-
-PERL_CALLCONV MEM_SIZE Perl_malloced_size(void *p)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_MALLOCED_SIZE \
-       assert(p)
-
-#endif
+PERL_CALLCONV void
+Perl_dump_mstats(pTHX_ const char *s);
+# define PERL_ARGS_ASSERT_DUMP_MSTATS           \
+        assert(s)
+
+PERL_CALLCONV int
+Perl_get_mstats(pTHX_ perl_mstats_t *buf, int buflen, int level);
+# define PERL_ARGS_ASSERT_GET_MSTATS            \
+        assert(buf)
+
+PERL_CALLCONV MEM_SIZE
+Perl_malloc_good_size(size_t nbytes)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_MALLOC_GOOD_SIZE
+
+PERL_CALLCONV MEM_SIZE
+Perl_malloced_size(void *p)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_MALLOCED_SIZE         \
+        assert(p)
+
+#endif /* defined(MYMALLOC) */
+#if !defined(NO_MATHOMS)
+PERL_CALLCONV bool
+Perl_do_aexec(pTHX_ SV *really, SV **mark, SV **sp);
+# define PERL_ARGS_ASSERT_DO_AEXEC              \
+        assert(mark); assert(sp)
+
+PERL_CALLCONV bool
+Perl_do_open(pTHX_ GV *gv, const char *name, I32 len, int as_raw, int rawmode, int rawperm, PerlIO *supplied_fp);
+# define PERL_ARGS_ASSERT_DO_OPEN               \
+        assert(gv); assert(name)
+
+PERL_CALLCONV GV *
+Perl_gv_AVadd(pTHX_ GV *gv);
+# define PERL_ARGS_ASSERT_GV_AVADD
+
+PERL_CALLCONV GV *
+Perl_gv_HVadd(pTHX_ GV *gv);
+# define PERL_ARGS_ASSERT_GV_HVADD
+
+PERL_CALLCONV GV *
+Perl_gv_IOadd(pTHX_ GV *gv);
+# define PERL_ARGS_ASSERT_GV_IOADD
+
+PERL_CALLCONV void
+Perl_gv_efullname3(pTHX_ SV *sv, const GV *gv, const char *prefix);
+# define PERL_ARGS_ASSERT_GV_EFULLNAME3         \
+        assert(sv); assert(gv)
+
+PERL_CALLCONV GV *
+Perl_gv_fetchmethod(pTHX_ HV *stash, const char *name);
+# define PERL_ARGS_ASSERT_GV_FETCHMETHOD        \
+        assert(stash); assert(name)
+
+PERL_CALLCONV void
+Perl_gv_fullname3(pTHX_ SV *sv, const GV *gv, const char *prefix);
+# define PERL_ARGS_ASSERT_GV_FULLNAME3          \
+        assert(sv); assert(gv)
+
+PERL_CALLCONV SV *
+Perl_hv_delete(pTHX_ HV *hv, const char *key, I32 klen, I32 flags);
+# define PERL_ARGS_ASSERT_HV_DELETE             \
+        assert(key)
+
+PERL_CALLCONV SV *
+Perl_hv_delete_ent(pTHX_ HV *hv, SV *keysv, I32 flags, U32 hash);
+# define PERL_ARGS_ASSERT_HV_DELETE_ENT         \
+        assert(keysv)
+
+PERL_CALLCONV bool
+Perl_hv_exists(pTHX_ HV *hv, const char *key, I32 klen)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_HV_EXISTS             \
+        assert(key)
+
+PERL_CALLCONV bool
+Perl_hv_exists_ent(pTHX_ HV *hv, SV *keysv, U32 hash)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_HV_EXISTS_ENT         \
+        assert(keysv)
+
+PERL_CALLCONV SV **
+Perl_hv_fetch(pTHX_ HV *hv, const char *key, I32 klen, I32 lval);
+# define PERL_ARGS_ASSERT_HV_FETCH              \
+        assert(key)
+
+PERL_CALLCONV HE *
+Perl_hv_fetch_ent(pTHX_ HV *hv, SV *keysv, I32 lval, U32 hash);
+# define PERL_ARGS_ASSERT_HV_FETCH_ENT          \
+        assert(keysv)
+
+PERL_CALLCONV HE *
+Perl_hv_iternext(pTHX_ HV *hv)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_HV_ITERNEXT           \
+        assert(hv)
+
+PERL_CALLCONV void
+Perl_hv_magic(pTHX_ HV *hv, GV *gv, int how);
+# define PERL_ARGS_ASSERT_HV_MAGIC              \
+        assert(hv)
+
+PERL_CALLCONV SV **
+Perl_hv_store(pTHX_ HV *hv, const char *key, I32 klen, SV *val, U32 hash);
+# define PERL_ARGS_ASSERT_HV_STORE
+
+PERL_CALLCONV HE *
+Perl_hv_store_ent(pTHX_ HV *hv, SV *key, SV *val, U32 hash);
+# define PERL_ARGS_ASSERT_HV_STORE_ENT
+
+PERL_CALLCONV SV **
+Perl_hv_store_flags(pTHX_ HV *hv, const char *key, I32 klen, SV *val, U32 hash, int flags);
+# define PERL_ARGS_ASSERT_HV_STORE_FLAGS
+
+PERL_CALLCONV char *
+Perl_instr(const char *big, const char *little)
+        __attribute__warn_unused_result__
+        __attribute__pure__;
+# define PERL_ARGS_ASSERT_INSTR                 \
+        assert(big); assert(little)
+
+PERL_CALLCONV STRLEN
+Perl_is_utf8_char_buf(const U8 *buf, const U8 *buf_end);
+# define PERL_ARGS_ASSERT_IS_UTF8_CHAR_BUF      \
+        assert(buf); assert(buf_end)
+
+PERL_CALLCONV bool
+Perl_is_utf8_string_loc(const U8 *s, const STRLEN len, const U8 **ep);
+# define PERL_ARGS_ASSERT_IS_UTF8_STRING_LOC    \
+        assert(s); assert(ep)
+
+PERL_CALLCONV AV *
+Perl_newAV(pTHX)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_NEWAV
+
+PERL_CALLCONV HV *
+Perl_newHV(pTHX)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_NEWHV
+
+PERL_CALLCONV IO *
+Perl_newIO(pTHX)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_NEWIO
+
+PERL_CALLCONV CV *
+Perl_newSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *block);
+# define PERL_ARGS_ASSERT_NEWSUB
+
+PERL_CALLCONV SV *
+Perl_newSVsv(pTHX_ SV * const old)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_NEWSVSV
+
+PERL_CALLCONV void
+Perl_save_freeop(pTHX_ OP *o);
+# define PERL_ARGS_ASSERT_SAVE_FREEOP
+
+PERL_CALLCONV void
+Perl_save_freepv(pTHX_ char *pv);
+# define PERL_ARGS_ASSERT_SAVE_FREEPV
+
+PERL_CALLCONV void
+Perl_save_freesv(pTHX_ SV *sv);
+# define PERL_ARGS_ASSERT_SAVE_FREESV
+
+PERL_CALLCONV void
+Perl_save_mortalizesv(pTHX_ SV *sv);
+# define PERL_ARGS_ASSERT_SAVE_MORTALIZESV      \
+        assert(sv)
+
+PERL_CALLCONV void
+Perl_save_op(pTHX);
+# define PERL_ARGS_ASSERT_SAVE_OP
+
+PERL_CALLCONV bool
+Perl_sv_2bool(pTHX_ SV * const sv);
+# define PERL_ARGS_ASSERT_SV_2BOOL              \
+        assert(sv)
+
+PERL_CALLCONV IV
+Perl_sv_2iv(pTHX_ SV *sv);
+# define PERL_ARGS_ASSERT_SV_2IV                \
+        assert(sv)
+
+PERL_CALLCONV char *
+Perl_sv_2pv(pTHX_ SV *sv, STRLEN *lp);
+# define PERL_ARGS_ASSERT_SV_2PV                \
+        assert(sv)
+
+PERL_CALLCONV char *
+Perl_sv_2pv_nolen(pTHX_ SV *sv)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_SV_2PV_NOLEN          \
+        assert(sv)
+
+PERL_CALLCONV char *
+Perl_sv_2pvbyte(pTHX_ SV *sv, STRLEN * const lp);
+# define PERL_ARGS_ASSERT_SV_2PVBYTE            \
+        assert(sv)
+
+PERL_CALLCONV char *
+Perl_sv_2pvbyte_nolen(pTHX_ SV *sv)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_SV_2PVBYTE_NOLEN      \
+        assert(sv)
+
+PERL_CALLCONV char *
+Perl_sv_2pvutf8(pTHX_ SV *sv, STRLEN * const lp);
+# define PERL_ARGS_ASSERT_SV_2PVUTF8            \
+        assert(sv)
+
+PERL_CALLCONV char *
+Perl_sv_2pvutf8_nolen(pTHX_ SV *sv)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_SV_2PVUTF8_NOLEN      \
+        assert(sv)
+
+PERL_CALLCONV UV
+Perl_sv_2uv(pTHX_ SV *sv);
+# define PERL_ARGS_ASSERT_SV_2UV                \
+        assert(sv)
+
+PERL_CALLCONV void
+Perl_sv_catpvn(pTHX_ SV *dsv, const char *sstr, STRLEN len);
+# define PERL_ARGS_ASSERT_SV_CATPVN             \
+        assert(dsv); assert(sstr)
+
+PERL_CALLCONV void
+Perl_sv_catpvn_mg(pTHX_ SV *dsv, const char *sstr, STRLEN len);
+# define PERL_ARGS_ASSERT_SV_CATPVN_MG          \
+        assert(dsv); assert(sstr)
+
+PERL_CALLCONV void
+Perl_sv_catsv(pTHX_ SV *dsv, SV *sstr);
+# define PERL_ARGS_ASSERT_SV_CATSV              \
+        assert(dsv)
+
+PERL_CALLCONV void
+Perl_sv_catsv_mg(pTHX_ SV *dsv, SV *sstr);
+# define PERL_ARGS_ASSERT_SV_CATSV_MG           \
+        assert(dsv)
+
+PERL_CALLCONV void
+Perl_sv_copypv(pTHX_ SV * const dsv, SV * const ssv);
+# define PERL_ARGS_ASSERT_SV_COPYPV             \
+        assert(dsv); assert(ssv)
+
+PERL_CALLCONV I32
+Perl_sv_eq(pTHX_ SV *sv1, SV *sv2);
+# define PERL_ARGS_ASSERT_SV_EQ
+
+PERL_CALLCONV void
+Perl_sv_force_normal(pTHX_ SV *sv);
+# define PERL_ARGS_ASSERT_SV_FORCE_NORMAL       \
+        assert(sv)
+
+PERL_CALLCONV void
+Perl_sv_insert(pTHX_ SV * const bigstr, const STRLEN offset, const STRLEN len, const char * const little, const STRLEN littlelen);
+# define PERL_ARGS_ASSERT_SV_INSERT             \
+        assert(bigstr); assert(little)
+
+PERL_CALLCONV SV *
+Perl_sv_mortalcopy(pTHX_ SV * const oldsv)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_SV_MORTALCOPY
+
+PERL_CALLCONV void
+Perl_sv_nolocking(pTHX_ SV *sv)
+        __attribute__deprecated__;
+# define PERL_ARGS_ASSERT_SV_NOLOCKING
+
+PERL_CALLCONV void
+Perl_sv_nounlocking(pTHX_ SV *sv)
+        __attribute__deprecated__;
+# define PERL_ARGS_ASSERT_SV_NOUNLOCKING
+
+PERL_CALLCONV char *
+Perl_sv_pv(pTHX_ SV *sv)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_SV_PV                 \
+        assert(sv)
+
+PERL_CALLCONV char *
+Perl_sv_pvbyte(pTHX_ SV *sv)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_SV_PVBYTE             \
+        assert(sv)
+
+PERL_CALLCONV char *
+Perl_sv_pvn_force(pTHX_ SV *sv, STRLEN *lp);
+# define PERL_ARGS_ASSERT_SV_PVN_FORCE          \
+        assert(sv)
+
+PERL_CALLCONV char *
+Perl_sv_pvutf8(pTHX_ SV *sv)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_SV_PVUTF8             \
+        assert(sv)
+
+PERL_CALLCONV void
+Perl_sv_setsv(pTHX_ SV *dsv, SV *ssv);
+# define PERL_ARGS_ASSERT_SV_SETSV              \
+        assert(dsv)
+
+PERL_CALLCONV void
+Perl_sv_taint(pTHX_ SV *sv);
+# define PERL_ARGS_ASSERT_SV_TAINT              \
+        assert(sv)
+
+PERL_CALLCONV void
+Perl_sv_unref(pTHX_ SV *sv);
+# define PERL_ARGS_ASSERT_SV_UNREF              \
+        assert(sv)
+
+PERL_CALLCONV void
+Perl_sv_usepvn(pTHX_ SV *sv, char *ptr, STRLEN len);
+# define PERL_ARGS_ASSERT_SV_USEPVN             \
+        assert(sv)
+
+PERL_CALLCONV void
+Perl_sv_usepvn_mg(pTHX_ SV *sv, char *ptr, STRLEN len);
+# define PERL_ARGS_ASSERT_SV_USEPVN_MG          \
+        assert(sv)
+
+PERL_CALLCONV bool
+Perl_sv_utf8_downgrade(pTHX_ SV * const sv, const bool fail_ok);
+# define PERL_ARGS_ASSERT_SV_UTF8_DOWNGRADE     \
+        assert(sv)
+
+PERL_CALLCONV STRLEN
+Perl_sv_utf8_upgrade(pTHX_ SV *sv);
+# define PERL_ARGS_ASSERT_SV_UTF8_UPGRADE       \
+        assert(sv)
+
+PERL_CALLCONV UV
+Perl_utf8_to_uvchr(pTHX_ const U8 *s, STRLEN *retlen)
+        __attribute__deprecated__;
+# define PERL_ARGS_ASSERT_UTF8_TO_UVCHR         \
+        assert(s)
+
+PERL_CALLCONV UV
+Perl_utf8_to_uvuni(pTHX_ const U8 *s, STRLEN *retlen)
+        __attribute__deprecated__;
+# define PERL_ARGS_ASSERT_UTF8_TO_UVUNI         \
+        assert(s)
+
+PERL_CALLCONV UV
+Perl_utf8n_to_uvuni(pTHX_ const U8 *s, STRLEN curlen, STRLEN *retlen, U32 flags)
+        __attribute__deprecated__;
+# define PERL_ARGS_ASSERT_UTF8N_TO_UVUNI        \
+        assert(s)
+
+# if defined(PERL_DONT_CREATE_GVSV)
+PERL_CALLCONV GV *
+Perl_gv_SVadd(pTHX_ GV *gv);
+#   define PERL_ARGS_ASSERT_GV_SVADD
+
+# endif
+# if defined(PERL_IN_MATHOMS_C) || defined(PERL_IN_OP_C) || \
+     defined(PERL_IN_PERLY_C)   || defined(PERL_IN_TOKE_C)
+PERL_CALLCONV OP *
+Perl_ref(pTHX_ OP *o, I32 type);
+#   define PERL_ARGS_ASSERT_REF
+
+# endif
+# if defined(USE_LOCALE_COLLATE)
+PERL_CALLCONV char *
+Perl_sv_collxfrm(pTHX_ SV * const sv, STRLEN * const nxp);
+#   define PERL_ARGS_ASSERT_SV_COLLXFRM         \
+        assert(sv); assert(nxp)
+
+# endif
+#endif /* !defined(NO_MATHOMS) */
 #if defined(PERL_ANY_COW)
-PERL_CALLCONV SV*      Perl_sv_setsv_cow(pTHX_ SV* dsv, SV* ssv);
-#define PERL_ARGS_ASSERT_SV_SETSV_COW  \
-       assert(ssv)
-#endif
-#if defined(PERL_CORE)
-PERL_CALLCONV void     Perl_opslab_force_free(pTHX_ OPSLAB *slab);
-#define PERL_ARGS_ASSERT_OPSLAB_FORCE_FREE     \
-       assert(slab)
-PERL_CALLCONV void     Perl_opslab_free(pTHX_ OPSLAB *slab);
-#define PERL_ARGS_ASSERT_OPSLAB_FREE   \
-       assert(slab)
-PERL_CALLCONV void     Perl_opslab_free_nopad(pTHX_ OPSLAB *slab);
-#define PERL_ARGS_ASSERT_OPSLAB_FREE_NOPAD     \
-       assert(slab)
-PERL_CALLCONV void     Perl_parser_free_nexttoke_ops(pTHX_ yy_parser *parser, OPSLAB *slab);
-#define PERL_ARGS_ASSERT_PARSER_FREE_NEXTTOKE_OPS      \
-       assert(parser); assert(slab)
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE bool        S_should_warn_nl(const char *pv)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_SHOULD_WARN_NL        \
-       assert(pv)
-#endif
-
-#  if defined(PERL_DEBUG_READONLY_OPS)
-PERL_CALLCONV void     Perl_Slab_to_ro(pTHX_ OPSLAB *slab);
-#define PERL_ARGS_ASSERT_SLAB_TO_RO    \
-       assert(slab)
-PERL_CALLCONV void     Perl_Slab_to_rw(pTHX_ OPSLAB *const slab);
-#define PERL_ARGS_ASSERT_SLAB_TO_RW    \
-       assert(slab)
-#  endif
-#endif
-#if defined(PERL_CORE) || defined (PERL_EXT)
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE bool        Perl_is_utf8_non_invariant_string(const U8* const s, STRLEN len)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_IS_UTF8_NON_INVARIANT_STRING  \
-       assert(s)
-#endif
+PERL_CALLCONV SV *
+Perl_sv_setsv_cow(pTHX_ SV *dsv, SV *ssv);
+# define PERL_ARGS_ASSERT_SV_SETSV_COW          \
+        assert(ssv)
 
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE STRLEN      S_sv_or_pv_pos_u2b(pTHX_ SV *sv, const char *pv, STRLEN pos, STRLEN *lenp);
-#define PERL_ARGS_ASSERT_SV_OR_PV_POS_U2B      \
-       assert(sv); assert(pv)
-#endif
 #endif
+#if defined(PERL_CORE)
+PERL_CALLCONV void
+Perl_opslab_force_free(pTHX_ OPSLAB *slab)
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_OPSLAB_FORCE_FREE     \
+        assert(slab)
+
+PERL_CALLCONV void
+Perl_opslab_free(pTHX_ OPSLAB *slab)
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_OPSLAB_FREE           \
+        assert(slab)
+
+PERL_CALLCONV void
+Perl_opslab_free_nopad(pTHX_ OPSLAB *slab)
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_OPSLAB_FREE_NOPAD     \
+        assert(slab)
+
+PERL_CALLCONV void
+Perl_parser_free_nexttoke_ops(pTHX_ yy_parser *parser, OPSLAB *slab)
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_PARSER_FREE_NEXTTOKE_OPS \
+        assert(parser); assert(slab)
+
+# if defined(PERL_DEBUG_READONLY_OPS)
+PERL_CALLCONV void
+Perl_Slab_to_ro(pTHX_ OPSLAB *slab);
+#   define PERL_ARGS_ASSERT_SLAB_TO_RO          \
+        assert(slab)
+
+PERL_CALLCONV void
+Perl_Slab_to_rw(pTHX_ OPSLAB * const slab);
+#   define PERL_ARGS_ASSERT_SLAB_TO_RW          \
+        assert(slab)
+
+# endif /* defined(PERL_DEBUG_READONLY_OPS) */
+# if !defined(PERL_NO_INLINE_FUNCTIONS)
+PERL_STATIC_INLINE bool
+S_should_warn_nl(const char *pv)
+        __attribute__warn_unused_result__;
+#   define PERL_ARGS_ASSERT_SHOULD_WARN_NL      \
+        assert(pv)
+
+# endif
+#endif /* defined(PERL_CORE) */
 #if defined(PERL_CORE) || defined(PERL_EXT)
-PERL_CALLCONV bool     Perl_isSCRIPT_RUN(pTHX_ const U8 *s, const U8 *send, const bool utf8_target)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_ISSCRIPT_RUN  \
-       assert(s); assert(send)
-
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE Size_t      S_variant_under_utf8_count(const U8* const s, const U8* const e)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_VARIANT_UNDER_UTF8_COUNT      \
-       assert(s); assert(e)
-#endif
-
-#endif
-#if defined(PERL_CR_FILTER)
-#  if defined(PERL_IN_TOKE_C)
-STATIC I32     S_cr_textfilter(pTHX_ int idx, SV *sv, int maxlen);
-#define PERL_ARGS_ASSERT_CR_TEXTFILTER
-STATIC void    S_strip_return(pTHX_ SV *sv);
-#define PERL_ARGS_ASSERT_STRIP_RETURN  \
-       assert(sv)
-#  endif
-#endif
+PERL_CALLCONV bool
+Perl_isSCRIPT_RUN(pTHX_ const U8 *s, const U8 *send, const bool utf8_target)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_ISSCRIPT_RUN          \
+        assert(s); assert(send)
+
+#endif /* defined(PERL_CORE) || defined(PERL_EXT) */
+#if defined(PERL_CORE) || defined(PERL_USE_VOLATILE_API)
+PERL_CALLCONV void
+Perl_finalize_optree(pTHX_ OP *o);
+# define PERL_ARGS_ASSERT_FINALIZE_OPTREE       \
+        assert(o)
+
+PERL_CALLCONV void
+Perl_optimize_optree(pTHX_ OP *o);
+# define PERL_ARGS_ASSERT_OPTIMIZE_OPTREE       \
+        assert(o)
+
+#endif /* defined(PERL_CORE) || defined(PERL_USE_VOLATILE_API) */
 #if defined(PERL_DEBUG_READONLY_COW)
-PERL_CALLCONV void     Perl_sv_buf_to_ro(pTHX_ SV *sv);
-#define PERL_ARGS_ASSERT_SV_BUF_TO_RO  \
-       assert(sv)
-#  if defined(PERL_IN_SV_C)
-STATIC void    S_sv_buf_to_rw(pTHX_ SV *sv);
-#define PERL_ARGS_ASSERT_SV_BUF_TO_RW  \
-       assert(sv)
-#  endif
+PERL_CALLCONV void
+Perl_sv_buf_to_ro(pTHX_ SV *sv)
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_SV_BUF_TO_RO          \
+        assert(sv)
+
 #endif
 #if defined(PERL_DEBUG_READONLY_OPS)
-PERL_CALLCONV PADOFFSET        Perl_op_refcnt_dec(pTHX_ OP *o);
-#define PERL_ARGS_ASSERT_OP_REFCNT_DEC \
-       assert(o)
-PERL_CALLCONV OP *     Perl_op_refcnt_inc(pTHX_ OP *o);
-#define PERL_ARGS_ASSERT_OP_REFCNT_INC
-#endif
+PERL_CALLCONV PADOFFSET
+Perl_op_refcnt_dec(pTHX_ OP *o);
+# define PERL_ARGS_ASSERT_OP_REFCNT_DEC         \
+        assert(o)
+
+PERL_CALLCONV OP *
+Perl_op_refcnt_inc(pTHX_ OP *o);
+# define PERL_ARGS_ASSERT_OP_REFCNT_INC
+
+#endif /* defined(PERL_DEBUG_READONLY_OPS) */
 #if defined(PERL_DEFAULT_DO_EXEC3_IMPLEMENTATION)
-PERL_CALLCONV bool     Perl_do_exec(pTHX_ const char* cmd);
-#define PERL_ARGS_ASSERT_DO_EXEC       \
-       assert(cmd)
-#endif
-#if defined(PERL_DONT_CREATE_GVSV)
-#ifndef NO_MATHOMS
-PERL_CALLCONV GV*      Perl_gv_SVadd(pTHX_ GV *gv);
-#define PERL_ARGS_ASSERT_GV_SVADD
-#endif
+PERL_CALLCONV bool
+Perl_do_exec(pTHX_ const char *cmd)
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_DO_EXEC               \
+        assert(cmd)
+
+#else
+PERL_CALLCONV bool
+Perl_do_exec(pTHX_ const char *cmd)
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_DO_EXEC               \
+        assert(cmd)
+
 #endif
 #if defined(PERL_IMPLICIT_SYS)
-PERL_CALLCONV PerlInterpreter* perl_alloc_using(struct IPerlMem *ipM, struct IPerlMem *ipMS, struct IPerlMem *ipMP, struct IPerlEnv *ipE, struct IPerlStdIO *ipStd, struct IPerlLIO *ipLIO, struct IPerlDir *ipD, struct IPerlSock *ipS, struct IPerlProc *ipP);
-#define PERL_ARGS_ASSERT_PERL_ALLOC_USING      \
-       assert(ipM); assert(ipMS); assert(ipMP); assert(ipE); assert(ipStd); assert(ipLIO); assert(ipD); assert(ipS); assert(ipP)
-#  if defined(USE_ITHREADS)
-PERL_CALLCONV PerlInterpreter* perl_clone_using(PerlInterpreter *proto_perl, UV flags, struct IPerlMem* ipM, struct IPerlMem* ipMS, struct IPerlMem* ipMP, struct IPerlEnv* ipE, struct IPerlStdIO* ipStd, struct IPerlLIO* ipLIO, struct IPerlDir* ipD, struct IPerlSock* ipS, struct IPerlProc* ipP);
-#define PERL_ARGS_ASSERT_PERL_CLONE_USING      \
-       assert(proto_perl); assert(ipM); assert(ipMS); assert(ipMP); assert(ipE); assert(ipStd); assert(ipLIO); assert(ipD); assert(ipS); assert(ipP)
-#  endif
-#endif
+PERL_CALLCONV PerlInterpreter *
+perl_alloc_using(struct IPerlMem *ipM, struct IPerlMem *ipMS, struct IPerlMem *ipMP, struct IPerlEnv *ipE, struct IPerlStdIO *ipStd, struct IPerlLIO *ipLIO, struct IPerlDir *ipD, struct IPerlSock *ipS, struct IPerlProc *ipP);
+# define PERL_ARGS_ASSERT_PERL_ALLOC_USING      \
+        assert(ipM); assert(ipMS); assert(ipMP); assert(ipE); assert(ipStd); \
+        assert(ipLIO); assert(ipD); assert(ipS); assert(ipP)
+
+# if defined(USE_ITHREADS)
+PERL_CALLCONV PerlInterpreter *
+perl_clone_using(PerlInterpreter *proto_perl, UV flags, struct IPerlMem *ipM, struct IPerlMem *ipMS, struct IPerlMem *ipMP, struct IPerlEnv *ipE, struct IPerlStdIO *ipStd, struct IPerlLIO *ipLIO, struct IPerlDir *ipD, struct IPerlSock *ipS, struct IPerlProc *ipP);
+#   define PERL_ARGS_ASSERT_PERL_CLONE_USING    \
+        assert(proto_perl); assert(ipM); assert(ipMS); assert(ipMP); assert(ipE); \
+        assert(ipStd); assert(ipLIO); assert(ipD); assert(ipS); assert(ipP)
+
+# endif
+#else /* if !defined(PERL_IMPLICIT_SYS) */
+PERL_CALLCONV I32
+Perl_my_pclose(pTHX_ PerlIO *ptr);
+# define PERL_ARGS_ASSERT_MY_PCLOSE
+
+PERL_CALLCONV PerlIO *
+Perl_my_popen(pTHX_ const char *cmd, const char *mode);
+# define PERL_ARGS_ASSERT_MY_POPEN              \
+        assert(cmd); assert(mode)
+
+#endif /* !defined(PERL_IMPLICIT_SYS) */
 #if defined(PERL_IN_AV_C)
-STATIC MAGIC*  S_get_aux_mg(pTHX_ AV *av);
-#define PERL_ARGS_ASSERT_GET_AUX_MG    \
-       assert(av)
-#endif
+STATIC MAGIC *
+S_get_aux_mg(pTHX_ AV *av);
+# define PERL_ARGS_ASSERT_GET_AUX_MG            \
+        assert(av)
+
+#endif
+#if defined(PERL_IN_CLASS_C) || defined(PERL_IN_OP_C)    || \
+    defined(PERL_IN_PAD_C)   || defined(PERL_IN_PERLY_C) || \
+    defined(PERL_IN_TOKE_C)
+PERL_CALLCONV void
+Perl_class_add_ADJUST(pTHX_ HV *stash, CV *cv);
+# define PERL_ARGS_ASSERT_CLASS_ADD_ADJUST      \
+        assert(stash); assert(cv)
+
+PERL_CALLCONV void
+Perl_class_add_field(pTHX_ HV *stash, PADNAME *pn);
+# define PERL_ARGS_ASSERT_CLASS_ADD_FIELD       \
+        assert(stash); assert(pn)
+
+PERL_CALLCONV void
+Perl_class_apply_attributes(pTHX_ HV *stash, OP *attrlist);
+# define PERL_ARGS_ASSERT_CLASS_APPLY_ATTRIBUTES \
+        assert(stash)
+
+PERL_CALLCONV void
+Perl_class_apply_field_attributes(pTHX_ PADNAME *pn, OP *attrlist);
+# define PERL_ARGS_ASSERT_CLASS_APPLY_FIELD_ATTRIBUTES \
+        assert(pn)
+
+PERL_CALLCONV void
+Perl_class_prepare_initfield_parse(pTHX);
+# define PERL_ARGS_ASSERT_CLASS_PREPARE_INITFIELD_PARSE
+
+PERL_CALLCONV void
+Perl_class_prepare_method_parse(pTHX_ CV *cv);
+# define PERL_ARGS_ASSERT_CLASS_PREPARE_METHOD_PARSE \
+        assert(cv)
+
+PERL_CALLCONV void
+Perl_class_seal_stash(pTHX_ HV *stash);
+# define PERL_ARGS_ASSERT_CLASS_SEAL_STASH      \
+        assert(stash)
+
+PERL_CALLCONV void
+Perl_class_set_field_defop(pTHX_ PADNAME *pn, OPCODE defmode, OP *defop);
+# define PERL_ARGS_ASSERT_CLASS_SET_FIELD_DEFOP \
+        assert(pn); assert(defop)
+
+PERL_CALLCONV void
+Perl_class_setup_stash(pTHX_ HV *stash);
+# define PERL_ARGS_ASSERT_CLASS_SETUP_STASH     \
+        assert(stash)
+
+PERL_CALLCONV OP *
+Perl_class_wrap_method_body(pTHX_ OP *o);
+# define PERL_ARGS_ASSERT_CLASS_WRAP_METHOD_BODY
+
+PERL_CALLCONV void
+Perl_croak_kw_unless_class(pTHX_ const char *kw);
+# define PERL_ARGS_ASSERT_CROAK_KW_UNLESS_CLASS \
+        assert(kw)
+
+#endif /* defined(PERL_IN_CLASS_C) || defined(PERL_IN_OP_C)    ||
+          defined(PERL_IN_PAD_C)   || defined(PERL_IN_PERLY_C) ||
+          defined(PERL_IN_TOKE_C) */
 #if defined(PERL_IN_DEB_C)
-STATIC void    S_deb_stack_n(pTHX_ SV** stack_base, I32 stack_min, I32 stack_max, I32 mark_min, I32 mark_max);
-#define PERL_ARGS_ASSERT_DEB_STACK_N   \
-       assert(stack_base)
+STATIC void
+S_deb_stack_n(pTHX_ SV **stack_base, I32 stack_min, I32 stack_max, I32 mark_min, I32 mark_max);
+# define PERL_ARGS_ASSERT_DEB_STACK_N           \
+        assert(stack_base)
+
 #endif
 #if defined(PERL_IN_DOIO_C)
-STATIC bool    S_argvout_final(pTHX_ MAGIC *mg, IO *io, bool not_implicit);
-#define PERL_ARGS_ASSERT_ARGVOUT_FINAL \
-       assert(mg); assert(io)
-STATIC void    S_exec_failed(pTHX_ const char *cmd, int fd, int do_report);
-#define PERL_ARGS_ASSERT_EXEC_FAILED   \
-       assert(cmd)
-STATIC bool    S_ingroup(pTHX_ Gid_t testgid, bool effective)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_INGROUP
-
-STATIC bool    S_openn_cleanup(pTHX_ GV *gv, IO *io, PerlIO *fp, char *mode, const char *oname, PerlIO *saveifp, PerlIO *saveofp, int savefd, char savetype, int writing, bool was_fdopen, const char *type, Stat_t *statbufp);
-#define PERL_ARGS_ASSERT_OPENN_CLEANUP \
-       assert(gv); assert(io); assert(mode); assert(oname)
-STATIC IO *    S_openn_setup(pTHX_ GV *gv, char *mode, PerlIO **saveifp, PerlIO **saveofp, int *savefd, char *savetype);
-#define PERL_ARGS_ASSERT_OPENN_SETUP   \
-       assert(gv); assert(mode); assert(saveifp); assert(saveofp); assert(savefd); assert(savetype)
-#endif
+STATIC bool
+S_argvout_final(pTHX_ MAGIC *mg, IO *io, bool is_explicit);
+# define PERL_ARGS_ASSERT_ARGVOUT_FINAL         \
+        assert(mg); assert(io)
+
+STATIC void
+S_exec_failed(pTHX_ const char *cmd, int fd, int do_report);
+# define PERL_ARGS_ASSERT_EXEC_FAILED           \
+        assert(cmd)
+
+STATIC bool
+S_ingroup(pTHX_ Gid_t testgid, bool effective)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_INGROUP
+
+STATIC bool
+S_openn_cleanup(pTHX_ GV *gv, IO *io, PerlIO *fp, char *mode, const char *oname, PerlIO *saveifp, PerlIO *saveofp, int savefd, char savetype, int writing, bool was_fdopen, const char *type, Stat_t *statbufp);
+# define PERL_ARGS_ASSERT_OPENN_CLEANUP         \
+        assert(gv); assert(io); assert(mode); assert(oname)
+
+STATIC IO *
+S_openn_setup(pTHX_ GV *gv, char *mode, PerlIO **saveifp, PerlIO **saveofp, int *savefd, char *savetype);
+# define PERL_ARGS_ASSERT_OPENN_SETUP           \
+        assert(gv); assert(mode); assert(saveifp); assert(saveofp); assert(savefd); \
+        assert(savetype)
+
+#endif /* defined(PERL_IN_DOIO_C) */
 #if defined(PERL_IN_DOOP_C)
-STATIC Size_t  S_do_trans_complex(pTHX_ SV * const sv, const OPtrans_map * const tbl)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_DO_TRANS_COMPLEX      \
-       assert(sv); assert(tbl)
-
-STATIC Size_t  S_do_trans_count(pTHX_ SV * const sv, const OPtrans_map * const tbl)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_DO_TRANS_COUNT        \
-       assert(sv); assert(tbl)
-
-STATIC Size_t  S_do_trans_count_invmap(pTHX_ SV * const sv, AV * const map)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_DO_TRANS_COUNT_INVMAP \
-       assert(sv); assert(map)
-
-STATIC Size_t  S_do_trans_invmap(pTHX_ SV * const sv, AV * const map)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_DO_TRANS_INVMAP       \
-       assert(sv); assert(map)
-
-STATIC Size_t  S_do_trans_simple(pTHX_ SV * const sv, const OPtrans_map * const tbl)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_DO_TRANS_SIMPLE       \
-       assert(sv); assert(tbl)
+STATIC Size_t
+S_do_trans_complex(pTHX_ SV * const sv, const OPtrans_map * const tbl)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_DO_TRANS_COMPLEX      \
+        assert(sv); assert(tbl)
+
+STATIC Size_t
+S_do_trans_count(pTHX_ SV * const sv, const OPtrans_map * const tbl)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_DO_TRANS_COUNT        \
+        assert(sv); assert(tbl)
+
+STATIC Size_t
+S_do_trans_count_invmap(pTHX_ SV * const sv, AV * const map)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_DO_TRANS_COUNT_INVMAP \
+        assert(sv); assert(map)
+
+STATIC Size_t
+S_do_trans_invmap(pTHX_ SV * const sv, AV * const map)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_DO_TRANS_INVMAP       \
+        assert(sv); assert(map)
+
+STATIC Size_t
+S_do_trans_simple(pTHX_ SV * const sv, const OPtrans_map * const tbl)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_DO_TRANS_SIMPLE       \
+        assert(sv); assert(tbl)
+
+#endif /* defined(PERL_IN_DOOP_C) */
+#if defined(PERL_IN_DOOP_C)    || defined(PERL_IN_OP_C)        || \
+    defined(PERL_IN_PP_C)      || defined(PERL_IN_REGCOMP_ANY) || \
+    defined(PERL_IN_REGEXEC_C) || defined(PERL_IN_TOKE_C)      || \
+    defined(PERL_IN_UTF8_C)
+
+PERL_CALLCONV SSize_t
+Perl__invlist_search(SV * const invlist, const UV cp)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT__INVLIST_SEARCH       \
+        assert(invlist)
+
+#endif /* defined(PERL_IN_DOOP_C)    || defined(PERL_IN_OP_C)        ||
+          defined(PERL_IN_PP_C)      || defined(PERL_IN_REGCOMP_ANY) ||
+          defined(PERL_IN_REGEXEC_C) || defined(PERL_IN_TOKE_C)      ||
+          defined(PERL_IN_UTF8_C) */
+#if defined(PERL_IN_DOOP_C) || defined(PERL_IN_OP_C) || \
+    defined(PERL_IN_REGCOMP_ANY)
+
+#endif
+#if defined(PERL_IN_DOOP_C)      || defined(PERL_IN_OP_C) || \
+    defined(PERL_IN_REGCOMP_ANY) || defined(PERL_IN_UTF8_C)
+PERL_CALLCONV SV *
+Perl__add_range_to_invlist(pTHX_ SV *invlist, UV start, UV end)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT__ADD_RANGE_TO_INVLIST
+
+/* PERL_CALLCONV void
+_invlist_intersection(pTHX_ SV * const a, SV * const b, SV **i); */
+
+PERL_CALLCONV void
+Perl__invlist_intersection_maybe_complement_2nd(pTHX_ SV * const a, SV * const b, const bool complement_b, SV **i);
+# define PERL_ARGS_ASSERT__INVLIST_INTERSECTION_MAYBE_COMPLEMENT_2ND \
+        assert(b); assert(i)
+
+PERL_CALLCONV void
+Perl__invlist_invert(pTHX_ SV * const invlist);
+# define PERL_ARGS_ASSERT__INVLIST_INVERT       \
+        assert(invlist)
+
+/* PERL_CALLCONV void
+_invlist_subtract(pTHX_ SV * const a, SV * const b, SV **result); */
+
+/* PERL_CALLCONV void
+_invlist_union(pTHX_ SV * const a, SV * const b, SV **output); */
+
+PERL_CALLCONV void
+Perl__invlist_union_maybe_complement_2nd(pTHX_ SV * const a, SV * const b, const bool complement_b, SV **output);
+# define PERL_ARGS_ASSERT__INVLIST_UNION_MAYBE_COMPLEMENT_2ND \
+        assert(b); assert(output)
+
+PERL_CALLCONV SV *
+Perl__new_invlist(pTHX_ IV initial_size)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT__NEW_INVLIST
+
+PERL_CALLCONV SV *
+Perl__setup_canned_invlist(pTHX_ const STRLEN size, const UV element0, UV **other_elements_ptr)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT__SETUP_CANNED_INVLIST \
+        assert(other_elements_ptr)
+
+#endif /* defined(PERL_IN_DOOP_C)      || defined(PERL_IN_OP_C) ||
+          defined(PERL_IN_REGCOMP_ANY) || defined(PERL_IN_UTF8_C) */
+#if defined(PERL_IN_DQUOTE_C) || defined(PERL_IN_REGCOMP_C) || \
+    defined(PERL_IN_TOKE_C)
+PERL_CALLCONV const char *
+Perl_form_alien_digit_msg(pTHX_ const U8 which, const STRLEN valids_len, const char * const first_bad, const char * const send, const bool UTF, const bool braced)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_FORM_ALIEN_DIGIT_MSG  \
+        assert(first_bad); assert(send)
+
+PERL_CALLCONV bool
+Perl_grok_bslash_c(pTHX_ const char source, U8 *result, const char **message, U32 *packed_warn)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_GROK_BSLASH_C         \
+        assert(result); assert(message)
+
+PERL_CALLCONV bool
+Perl_grok_bslash_o(pTHX_ char **s, const char * const send, UV *uv, const char **message, U32 *packed_warn, const bool strict, const bool allow_UV_MAX, const bool utf8)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_GROK_BSLASH_O         \
+        assert(s); assert(send); assert(uv); assert(message)
+
+PERL_CALLCONV bool
+Perl_grok_bslash_x(pTHX_ char **s, const char * const send, UV *uv, const char **message, U32 *packed_warn, const bool strict, const bool allow_UV_MAX, const bool utf8)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_GROK_BSLASH_X         \
+        assert(s); assert(send); assert(uv); assert(message)
+
+#endif /* defined(PERL_IN_DQUOTE_C) || defined(PERL_IN_REGCOMP_C) ||
+          defined(PERL_IN_TOKE_C) */
+#if defined(PERL_IN_DQUOTE_C) || defined(PERL_IN_REGCOMP_C) || \
+    defined(PERL_IN_TOKE_C)   || defined(PERL_IN_UTF8_C)
+PERL_CALLCONV const char *
+Perl_form_cp_too_large_msg(pTHX_ const U8 which, const char *string, const Size_t len, const UV cp)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_FORM_CP_TOO_LARGE_MSG
 
 #endif
 #if defined(PERL_IN_DUMP_C)
-STATIC CV*     S_deb_curcv(pTHX_ I32 ix);
-#define PERL_ARGS_ASSERT_DEB_CURCV
-STATIC void    S_debprof(pTHX_ const OP *o);
-#define PERL_ARGS_ASSERT_DEBPROF       \
-       assert(o)
-STATIC SV*     S_pm_description(pTHX_ const PMOP *pm);
-#define PERL_ARGS_ASSERT_PM_DESCRIPTION        \
-       assert(pm)
-STATIC UV      S_sequence_num(pTHX_ const OP *o);
-#define PERL_ARGS_ASSERT_SEQUENCE_NUM
-#endif
-#if defined(PERL_IN_DUMP_C) || defined(PERL_IN_HV_C) || defined(PERL_IN_SV_C) || defined(PERL_IN_SCOPE_C)
-PERL_CALLCONV void     Perl_hv_kill_backrefs(pTHX_ HV *hv);
-#define PERL_ARGS_ASSERT_HV_KILL_BACKREFS      \
-       assert(hv)
-#endif
+STATIC CV *
+S_deb_curcv(pTHX_ I32 ix);
+# define PERL_ARGS_ASSERT_DEB_CURCV
+
+STATIC void
+S_debprof(pTHX_ const OP *o);
+# define PERL_ARGS_ASSERT_DEBPROF               \
+        assert(o)
+
+STATIC SV *
+S_pm_description(pTHX_ const PMOP *pm);
+# define PERL_ARGS_ASSERT_PM_DESCRIPTION        \
+        assert(pm)
+
+STATIC UV
+S_sequence_num(pTHX_ const OP *o);
+# define PERL_ARGS_ASSERT_SEQUENCE_NUM
+
+#endif /* defined(PERL_IN_DUMP_C) */
+#if defined(PERL_IN_DUMP_C)  || defined(PERL_IN_HV_C) || \
+    defined(PERL_IN_SCOPE_C) || defined(PERL_IN_SV_C)
+PERL_CALLCONV void
+Perl_hv_kill_backrefs(pTHX_ HV *hv)
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_HV_KILL_BACKREFS      \
+        assert(hv)
+
+#endif
+#if defined(PERL_IN_DUMP_C) || defined(PERL_IN_OP_C) || \
+    defined(PERL_IN_REGCOMP_ANY)
+PERL_CALLCONV void
+Perl__invlist_dump(pTHX_ PerlIO *file, I32 level, const char * const indent, SV * const invlist);
+# define PERL_ARGS_ASSERT__INVLIST_DUMP         \
+        assert(file); assert(indent); assert(invlist)
+
+#endif
+#if defined(PERL_IN_GLOBALS_C) || defined(PERL_IN_OP_C) || \
+    defined(PERL_IN_PEEP_C)
+PERL_CALLCONV OP *
+Perl_ck_anoncode(pTHX_ OP *o)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_CK_ANONCODE           \
+        assert(o)
+
+PERL_CALLCONV OP *
+Perl_ck_backtick(pTHX_ OP *o)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_CK_BACKTICK           \
+        assert(o)
+
+PERL_CALLCONV OP *
+Perl_ck_bitop(pTHX_ OP *o)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_CK_BITOP              \
+        assert(o)
+
+PERL_CALLCONV OP *
+Perl_ck_cmp(pTHX_ OP *o)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_CK_CMP                \
+        assert(o)
+
+PERL_CALLCONV OP *
+Perl_ck_concat(pTHX_ OP *o)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_CK_CONCAT             \
+        assert(o)
+
+PERL_CALLCONV OP *
+Perl_ck_defined(pTHX_ OP *o)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_CK_DEFINED            \
+        assert(o)
+
+PERL_CALLCONV OP *
+Perl_ck_delete(pTHX_ OP *o)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_CK_DELETE             \
+        assert(o)
+
+PERL_CALLCONV OP *
+Perl_ck_each(pTHX_ OP *o)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_CK_EACH               \
+        assert(o)
+
+PERL_CALLCONV OP *
+Perl_ck_eof(pTHX_ OP *o)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_CK_EOF                \
+        assert(o)
+
+PERL_CALLCONV OP *
+Perl_ck_eval(pTHX_ OP *o)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_CK_EVAL               \
+        assert(o)
+
+PERL_CALLCONV OP *
+Perl_ck_exec(pTHX_ OP *o)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_CK_EXEC               \
+        assert(o)
+
+PERL_CALLCONV OP *
+Perl_ck_exists(pTHX_ OP *o)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_CK_EXISTS             \
+        assert(o)
+
+PERL_CALLCONV OP *
+Perl_ck_ftst(pTHX_ OP *o)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_CK_FTST               \
+        assert(o)
+
+PERL_CALLCONV OP *
+Perl_ck_fun(pTHX_ OP *o)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_CK_FUN                \
+        assert(o)
+
+PERL_CALLCONV OP *
+Perl_ck_glob(pTHX_ OP *o)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_CK_GLOB               \
+        assert(o)
+
+PERL_CALLCONV OP *
+Perl_ck_grep(pTHX_ OP *o)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_CK_GREP               \
+        assert(o)
+
+PERL_CALLCONV OP *
+Perl_ck_helemexistsor(pTHX_ OP *o)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_CK_HELEMEXISTSOR      \
+        assert(o)
+
+PERL_CALLCONV OP *
+Perl_ck_index(pTHX_ OP *o)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_CK_INDEX              \
+        assert(o)
+
+PERL_CALLCONV OP *
+Perl_ck_isa(pTHX_ OP *o)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_CK_ISA                \
+        assert(o)
+
+PERL_CALLCONV OP *
+Perl_ck_join(pTHX_ OP *o)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_CK_JOIN               \
+        assert(o)
+
+PERL_CALLCONV OP *
+Perl_ck_length(pTHX_ OP *o)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_CK_LENGTH             \
+        assert(o)
+
+PERL_CALLCONV OP *
+Perl_ck_lfun(pTHX_ OP *o)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_CK_LFUN               \
+        assert(o)
+
+PERL_CALLCONV OP *
+Perl_ck_listiob(pTHX_ OP *o)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_CK_LISTIOB            \
+        assert(o)
+
+PERL_CALLCONV OP *
+Perl_ck_match(pTHX_ OP *o)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_CK_MATCH              \
+        assert(o)
+
+PERL_CALLCONV OP *
+Perl_ck_method(pTHX_ OP *o)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_CK_METHOD             \
+        assert(o)
+
+PERL_CALLCONV OP *
+Perl_ck_null(pTHX_ OP *o)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_CK_NULL               \
+        assert(o)
+
+PERL_CALLCONV OP *
+Perl_ck_open(pTHX_ OP *o)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_CK_OPEN               \
+        assert(o)
+
+PERL_CALLCONV OP *
+Perl_ck_prototype(pTHX_ OP *o)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_CK_PROTOTYPE          \
+        assert(o)
+
+PERL_CALLCONV OP *
+Perl_ck_readline(pTHX_ OP *o)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_CK_READLINE           \
+        assert(o)
+
+PERL_CALLCONV OP *
+Perl_ck_refassign(pTHX_ OP *o)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_CK_REFASSIGN          \
+        assert(o)
+
+PERL_CALLCONV OP *
+Perl_ck_repeat(pTHX_ OP *o)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_CK_REPEAT             \
+        assert(o)
+
+PERL_CALLCONV OP *
+Perl_ck_require(pTHX_ OP *o)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_CK_REQUIRE            \
+        assert(o)
+
+PERL_CALLCONV OP *
+Perl_ck_return(pTHX_ OP *o)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_CK_RETURN             \
+        assert(o)
+
+PERL_CALLCONV OP *
+Perl_ck_rfun(pTHX_ OP *o)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_CK_RFUN               \
+        assert(o)
+
+PERL_CALLCONV OP *
+Perl_ck_rvconst(pTHX_ OP *o)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_CK_RVCONST            \
+        assert(o)
+
+PERL_CALLCONV OP *
+Perl_ck_sassign(pTHX_ OP *o)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_CK_SASSIGN            \
+        assert(o)
+
+PERL_CALLCONV OP *
+Perl_ck_select(pTHX_ OP *o)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_CK_SELECT             \
+        assert(o)
+
+PERL_CALLCONV OP *
+Perl_ck_shift(pTHX_ OP *o)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_CK_SHIFT              \
+        assert(o)
+
+PERL_CALLCONV OP *
+Perl_ck_smartmatch(pTHX_ OP *o)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_CK_SMARTMATCH         \
+        assert(o)
+
+PERL_CALLCONV OP *
+Perl_ck_sort(pTHX_ OP *o)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_CK_SORT               \
+        assert(o)
+
+PERL_CALLCONV OP *
+Perl_ck_spair(pTHX_ OP *o)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_CK_SPAIR              \
+        assert(o)
+
+PERL_CALLCONV OP *
+Perl_ck_split(pTHX_ OP *o)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_CK_SPLIT              \
+        assert(o)
+
+PERL_CALLCONV OP *
+Perl_ck_stringify(pTHX_ OP *o)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_CK_STRINGIFY          \
+        assert(o)
+
+PERL_CALLCONV OP *
+Perl_ck_subr(pTHX_ OP *o)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_CK_SUBR               \
+        assert(o)
+
+PERL_CALLCONV OP *
+Perl_ck_substr(pTHX_ OP *o)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_CK_SUBSTR             \
+        assert(o)
+
+PERL_CALLCONV OP *
+Perl_ck_svconst(pTHX_ OP *o)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_CK_SVCONST            \
+        assert(o)
+
+PERL_CALLCONV OP *
+Perl_ck_tell(pTHX_ OP *o)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_CK_TELL               \
+        assert(o)
+
+PERL_CALLCONV OP *
+Perl_ck_trunc(pTHX_ OP *o)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_CK_TRUNC              \
+        assert(o)
+
+PERL_CALLCONV OP *
+Perl_ck_trycatch(pTHX_ OP *o)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_CK_TRYCATCH           \
+        assert(o)
+
+#endif /* defined(PERL_IN_GLOBALS_C) || defined(PERL_IN_OP_C) ||
+          defined(PERL_IN_PEEP_C) */
 #if defined(PERL_IN_GV_C)
-STATIC bool    S_find_default_stash(pTHX_ HV **stash, const char *name, STRLEN len, const U32 is_utf8, const I32 add, const svtype sv_type);
-#define PERL_ARGS_ASSERT_FIND_DEFAULT_STASH    \
-       assert(stash); assert(name)
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE GV* S_gv_fetchmeth_internal(pTHX_ HV* stash, SV* meth, const char* name, STRLEN len, I32 level, U32 flags);
-#define PERL_ARGS_ASSERT_GV_FETCHMETH_INTERNAL
-#endif
-STATIC void    S_gv_init_svtype(pTHX_ GV *gv, const svtype sv_type);
-#define PERL_ARGS_ASSERT_GV_INIT_SVTYPE        \
-       assert(gv)
-STATIC bool    S_gv_is_in_main(pTHX_ const char *name, STRLEN len, const U32 is_utf8);
-#define PERL_ARGS_ASSERT_GV_IS_IN_MAIN \
-       assert(name)
-STATIC bool    S_gv_magicalize(pTHX_ GV *gv, HV *stash, const char *name, STRLEN len, const svtype sv_type);
-#define PERL_ARGS_ASSERT_GV_MAGICALIZE \
-       assert(gv); assert(stash); assert(name)
-STATIC void    S_gv_magicalize_isa(pTHX_ GV *gv);
-#define PERL_ARGS_ASSERT_GV_MAGICALIZE_ISA     \
-       assert(gv)
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE HV* S_gv_stashpvn_internal(pTHX_ const char* name, U32 namelen, I32 flags);
-#define PERL_ARGS_ASSERT_GV_STASHPVN_INTERNAL  \
-       assert(name)
-#endif
-STATIC void    S_maybe_multimagic_gv(pTHX_ GV *gv, const char *name, const svtype sv_type);
-#define PERL_ARGS_ASSERT_MAYBE_MULTIMAGIC_GV   \
-       assert(gv); assert(name)
-STATIC bool    S_parse_gv_stash_name(pTHX_ HV **stash, GV **gv, const char **name, STRLEN *len, const char *nambeg, STRLEN full_len, const U32 is_utf8, const I32 add);
-#define PERL_ARGS_ASSERT_PARSE_GV_STASH_NAME   \
-       assert(stash); assert(gv); assert(name); assert(len); assert(nambeg)
-STATIC void    S_require_tie_mod(pTHX_ GV *gv, const char varname, const char * name, STRLEN len, const U32 flags);
-#define PERL_ARGS_ASSERT_REQUIRE_TIE_MOD       \
-       assert(gv); assert(varname); assert(name)
-#endif
-#if defined(PERL_IN_GV_C) || defined(PERL_IN_SV_C) || defined(PERL_IN_PAD_C) || defined(PERL_IN_OP_C)
-PERL_CALLCONV void     Perl_sv_add_backref(pTHX_ SV *const tsv, SV *const sv);
-#define PERL_ARGS_ASSERT_SV_ADD_BACKREF        \
-       assert(tsv); assert(sv)
+STATIC bool
+S_find_default_stash(pTHX_ HV **stash, const char *name, STRLEN len, const U32 is_utf8, const I32 add, const svtype sv_type);
+# define PERL_ARGS_ASSERT_FIND_DEFAULT_STASH    \
+        assert(stash); assert(name)
+
+STATIC void
+S_gv_init_svtype(pTHX_ GV *gv, const svtype sv_type);
+# define PERL_ARGS_ASSERT_GV_INIT_SVTYPE        \
+        assert(gv)
+
+STATIC bool
+S_gv_is_in_main(pTHX_ const char *name, STRLEN len, const U32 is_utf8);
+# define PERL_ARGS_ASSERT_GV_IS_IN_MAIN         \
+        assert(name)
+
+STATIC bool
+S_gv_magicalize(pTHX_ GV *gv, HV *stash, const char *name, STRLEN len, const svtype sv_type);
+# define PERL_ARGS_ASSERT_GV_MAGICALIZE         \
+        assert(gv); assert(stash); assert(name)
+
+STATIC void
+S_gv_magicalize_isa(pTHX_ GV *gv);
+# define PERL_ARGS_ASSERT_GV_MAGICALIZE_ISA     \
+        assert(gv)
+
+STATIC void
+S_maybe_multimagic_gv(pTHX_ GV *gv, const char *name, const svtype sv_type);
+# define PERL_ARGS_ASSERT_MAYBE_MULTIMAGIC_GV   \
+        assert(gv); assert(name)
+
+STATIC bool
+S_parse_gv_stash_name(pTHX_ HV **stash, GV **gv, const char **name, STRLEN *len, const char *nambeg, STRLEN full_len, const U32 is_utf8, const I32 add);
+# define PERL_ARGS_ASSERT_PARSE_GV_STASH_NAME   \
+        assert(stash); assert(gv); assert(name); assert(len); assert(nambeg)
+
+STATIC void
+S_require_tie_mod(pTHX_ GV *gv, const char varname, const char *name, STRLEN len, const U32 flags);
+# define PERL_ARGS_ASSERT_REQUIRE_TIE_MOD       \
+        assert(gv); assert(varname); assert(name)
+
+# if !defined(PERL_NO_INLINE_FUNCTIONS)
+PERL_STATIC_INLINE GV *
+S_gv_fetchmeth_internal(pTHX_ HV *stash, SV *meth, const char *name, STRLEN len, I32 level, U32 flags);
+#   define PERL_ARGS_ASSERT_GV_FETCHMETH_INTERNAL
+
+PERL_STATIC_INLINE HV *
+S_gv_stashpvn_internal(pTHX_ const char *name, U32 namelen, I32 flags);
+#   define PERL_ARGS_ASSERT_GV_STASHPVN_INTERNAL \
+        assert(name)
+
+# endif /* !defined(PERL_NO_INLINE_FUNCTIONS) */
+#endif /* defined(PERL_IN_GV_C) */
+#if defined(PERL_IN_GV_C)  || defined(PERL_IN_OP_C) || \
+    defined(PERL_IN_PAD_C) || defined(PERL_IN_SV_C)
+PERL_CALLCONV void
+Perl_sv_add_backref(pTHX_ SV * const tsv, SV * const sv)
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_SV_ADD_BACKREF        \
+        assert(tsv); assert(sv)
+
 #endif
 #if defined(PERL_IN_GV_C) || defined(PERL_IN_UNIVERSAL_C)
-PERL_CALLCONV HV*      Perl_gv_stashsvpvn_cached(pTHX_ SV *namesv, const char* name, U32 namelen, I32 flags);
+PERL_CALLCONV HV *
+Perl_gv_stashsvpvn_cached(pTHX_ SV *namesv, const char *name, U32 namelen, I32 flags)
+        __attribute__visibility__("hidden");
+
 #endif
 #if defined(PERL_IN_HV_C)
-STATIC void    S_clear_placeholders(pTHX_ HV *hv, U32 items);
-#define PERL_ARGS_ASSERT_CLEAR_PLACEHOLDERS    \
-       assert(hv)
-STATIC void    S_hsplit(pTHX_ HV *hv, STRLEN const oldsize, STRLEN newsize);
-#define PERL_ARGS_ASSERT_HSPLIT        \
-       assert(hv)
-STATIC struct xpvhv_aux*       S_hv_auxinit(pTHX_ HV *hv);
-#define PERL_ARGS_ASSERT_HV_AUXINIT    \
-       assert(hv)
-STATIC SV*     S_hv_delete_common(pTHX_ HV *hv, SV *keysv, const char *key, STRLEN klen, int k_flags, I32 d_flags, U32 hash);
-#define PERL_ARGS_ASSERT_HV_DELETE_COMMON
-STATIC SV*     S_hv_free_ent_ret(pTHX_ HE *entry);
-#define PERL_ARGS_ASSERT_HV_FREE_ENT_RET       \
-       assert(entry)
-STATIC void    S_hv_free_entries(pTHX_ HV *hv);
-#define PERL_ARGS_ASSERT_HV_FREE_ENTRIES       \
-       assert(hv)
-STATIC void    S_hv_magic_check(HV *hv, bool *needs_copy, bool *needs_store);
-#define PERL_ARGS_ASSERT_HV_MAGIC_CHECK        \
-       assert(hv); assert(needs_copy); assert(needs_store)
-PERL_STATIC_NO_RET void        S_hv_notallowed(pTHX_ int flags, const char *key, I32 klen, const char *msg)
-                       __attribute__noreturn__;
-#define PERL_ARGS_ASSERT_HV_NOTALLOWED \
-       assert(key); assert(msg)
-
-STATIC SV *    S_refcounted_he_value(pTHX_ const struct refcounted_he *he);
-#define PERL_ARGS_ASSERT_REFCOUNTED_HE_VALUE   \
-       assert(he)
-STATIC HEK*    S_save_hek_flags(const char *str, I32 len, U32 hash, int flags)
-                       __attribute__malloc__
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_SAVE_HEK_FLAGS        \
-       assert(str)
-
-STATIC HEK*    S_share_hek_flags(pTHX_ const char *str, STRLEN len, U32 hash, int flags)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_SHARE_HEK_FLAGS       \
-       assert(str)
-
-STATIC void    S_unshare_hek_or_pvn(pTHX_ const HEK* hek, const char* str, I32 len, U32 hash);
-#define PERL_ARGS_ASSERT_UNSHARE_HEK_OR_PVN
-#endif
+STATIC void
+S_clear_placeholders(pTHX_ HV *hv, U32 items);
+# define PERL_ARGS_ASSERT_CLEAR_PLACEHOLDERS    \
+        assert(hv)
+
+STATIC void
+S_hsplit(pTHX_ HV *hv, STRLEN const oldsize, STRLEN newsize);
+# define PERL_ARGS_ASSERT_HSPLIT                \
+        assert(hv)
+
+STATIC struct xpvhv_aux *
+S_hv_auxinit(pTHX_ HV *hv);
+# define PERL_ARGS_ASSERT_HV_AUXINIT            \
+        assert(hv)
+
+STATIC SV *
+S_hv_delete_common(pTHX_ HV *hv, SV *keysv, const char *key, STRLEN klen, int k_flags, I32 d_flags, U32 hash);
+# define PERL_ARGS_ASSERT_HV_DELETE_COMMON
+
+STATIC SV *
+S_hv_free_ent_ret(pTHX_ HE *entry);
+# define PERL_ARGS_ASSERT_HV_FREE_ENT_RET       \
+        assert(entry)
+
+STATIC void
+S_hv_free_entries(pTHX_ HV *hv);
+# define PERL_ARGS_ASSERT_HV_FREE_ENTRIES       \
+        assert(hv)
+
+STATIC void
+S_hv_magic_check(HV *hv, bool *needs_copy, bool *needs_store);
+# define PERL_ARGS_ASSERT_HV_MAGIC_CHECK        \
+        assert(hv); assert(needs_copy); assert(needs_store)
+
+PERL_STATIC_NO_RET void
+S_hv_notallowed(pTHX_ int flags, const char *key, I32 klen, const char *msg)
+        __attribute__noreturn__;
+# define PERL_ARGS_ASSERT_HV_NOTALLOWED         \
+        assert(key); assert(msg)
+
+STATIC SV *
+S_refcounted_he_value(pTHX_ const struct refcounted_he *he);
+# define PERL_ARGS_ASSERT_REFCOUNTED_HE_VALUE   \
+        assert(he)
+
+STATIC HEK *
+S_save_hek_flags(const char *str, I32 len, U32 hash, int flags)
+        __attribute__malloc__
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_SAVE_HEK_FLAGS        \
+        assert(str)
+
+STATIC HEK *
+S_share_hek_flags(pTHX_ const char *str, STRLEN len, U32 hash, int flags)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_SHARE_HEK_FLAGS       \
+        assert(str)
+
+STATIC void
+S_unshare_hek_or_pvn(pTHX_ const HEK *hek, const char *str, I32 len, U32 hash);
+# define PERL_ARGS_ASSERT_UNSHARE_HEK_OR_PVN
+
+# if !defined(PURIFY)
+STATIC HE *
+S_new_he(pTHX)
+        __attribute__warn_unused_result__;
+#   define PERL_ARGS_ASSERT_NEW_HE
+
+# endif
+#endif /* defined(PERL_IN_HV_C) */
 #if defined(PERL_IN_HV_C) || defined(PERL_IN_MG_C) || defined(PERL_IN_SV_C)
-PERL_CALLCONV void     Perl_sv_kill_backrefs(pTHX_ SV *const sv, AV *const av);
-#define PERL_ARGS_ASSERT_SV_KILL_BACKREFS      \
-       assert(sv)
+PERL_CALLCONV void
+Perl_sv_kill_backrefs(pTHX_ SV * const sv, AV * const av)
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_SV_KILL_BACKREFS      \
+        assert(sv)
+
 #endif
 #if defined(PERL_IN_HV_C) || defined(PERL_IN_SV_C)
-PERL_CALLCONV SV*      Perl_hfree_next_entry(pTHX_ HV *hv, STRLEN *indexp);
-#define PERL_ARGS_ASSERT_HFREE_NEXT_ENTRY      \
-       assert(hv); assert(indexp)
-#endif
-#if defined(PERL_IN_LOCALE_C)
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE const char *        S_save_to_buffer(const char * string, char **buf, Size_t *buf_size, const Size_t offset)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_SAVE_TO_BUFFER        \
-       assert(buf_size)
-#endif
+PERL_CALLCONV SV *
+Perl_hfree_next_entry(pTHX_ HV *hv, STRLEN *indexp)
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_HFREE_NEXT_ENTRY      \
+        assert(hv); assert(indexp)
 
-#  if defined(USE_LOCALE)
-STATIC const char*     S_category_name(const int category);
-#define PERL_ARGS_ASSERT_CATEGORY_NAME
-STATIC void    S_new_collate(pTHX_ const char* newcoll);
-#define PERL_ARGS_ASSERT_NEW_COLLATE
-STATIC void    S_new_ctype(pTHX_ const char* newctype);
-#define PERL_ARGS_ASSERT_NEW_CTYPE     \
-       assert(newctype)
-STATIC void    S_new_numeric(pTHX_ const char* newnum);
-#define PERL_ARGS_ASSERT_NEW_NUMERIC
-STATIC void    S_restore_switched_locale(pTHX_ const int category, const char * const original_locale);
-#define PERL_ARGS_ASSERT_RESTORE_SWITCHED_LOCALE
-STATIC void    S_set_numeric_radix(pTHX_ const bool use_locale);
-#define PERL_ARGS_ASSERT_SET_NUMERIC_RADIX
-STATIC char*   S_stdize_locale(pTHX_ char* locs);
-#define PERL_ARGS_ASSERT_STDIZE_LOCALE \
-       assert(locs)
-STATIC const char*     S_switch_category_locale_to_template(pTHX_ const int switch_category, const int template_category, const char * template_locale);
-#define PERL_ARGS_ASSERT_SWITCH_CATEGORY_LOCALE_TO_TEMPLATE
-#    if defined(USE_POSIX_2008_LOCALE)
-STATIC const char*     S_emulate_setlocale(const int category, const char* locale, unsigned int index, const bool is_index_valid);
-#define PERL_ARGS_ASSERT_EMULATE_SETLOCALE
-#    endif
-#    if defined(WIN32)
-STATIC char*   S_win32_setlocale(pTHX_ int category, const char* locale);
-#define PERL_ARGS_ASSERT_WIN32_SETLOCALE
-#    endif
-#  endif
-#endif
-#if defined(PERL_IN_LOCALE_C) || defined(PERL_IN_SV_C) || defined(PERL_IN_MATHOMS_C)
-#  if defined(USE_LOCALE_COLLATE)
-PERL_CALLCONV char*    Perl__mem_collxfrm(pTHX_ const char* input_string, STRLEN len, STRLEN* xlen, bool utf8);
-#define PERL_ARGS_ASSERT__MEM_COLLXFRM \
-       assert(input_string); assert(xlen)
-#  endif
 #endif
+#if defined(PERL_IN_LOCALE_C)
+STATIC utf8ness_t
+S_get_locale_string_utf8ness_i(pTHX_ const char *string, const locale_utf8ness_t known_utf8, const char *locale, const unsigned cat_index);
+# define PERL_ARGS_ASSERT_GET_LOCALE_STRING_UTF8NESS_I
+
+STATIC bool
+S_is_locale_utf8(pTHX_ const char *locale);
+# define PERL_ARGS_ASSERT_IS_LOCALE_UTF8        \
+        assert(locale)
+
+# if defined(HAS_LOCALECONV)
+STATIC HV *
+S_my_localeconv(pTHX_ const int item);
+#   define PERL_ARGS_ASSERT_MY_LOCALECONV
+
+STATIC void
+S_populate_hash_from_localeconv(pTHX_ HV *hv, const char *locale, const U32 which_mask, const lconv_offset_t *strings[2], const lconv_offset_t *integers);
+#   define PERL_ARGS_ASSERT_POPULATE_HASH_FROM_LOCALECONV \
+        assert(hv); assert(locale); assert(strings)
+
+# endif /* defined(HAS_LOCALECONV) */
+# if defined(USE_LOCALE)
+STATIC unsigned int
+S_get_category_index(const int category, const char *locale);
+#   define PERL_ARGS_ASSERT_GET_CATEGORY_INDEX
+
+STATIC int
+S_get_category_index_nowarn(const int category);
+#   define PERL_ARGS_ASSERT_GET_CATEGORY_INDEX_NOWARN
+
+STATIC void
+S_new_LC_ALL(pTHX_ const char *unused, bool force);
+#   define PERL_ARGS_ASSERT_NEW_LC_ALL
+
+STATIC void
+S_restore_toggled_locale_i(pTHX_ const unsigned cat_index, const char *original_locale, const line_t caller_line);
+#   define PERL_ARGS_ASSERT_RESTORE_TOGGLED_LOCALE_I
+
+STATIC const char *
+S_save_to_buffer(const char *string, const char **buf, Size_t *buf_size);
+#   define PERL_ARGS_ASSERT_SAVE_TO_BUFFER
+
+PERL_STATIC_NO_RET void
+S_setlocale_failure_panic_i(pTHX_ const unsigned int cat_index, const char *current, const char *failed, const line_t caller_0_line, const line_t caller_1_line)
+        __attribute__noreturn__;
+#   define PERL_ARGS_ASSERT_SETLOCALE_FAILURE_PANIC_I \
+        assert(failed)
+
+STATIC const char *
+S_stdize_locale(pTHX_ const int category, const char *input_locale, const char **buf, Size_t *buf_size, line_t caller_line);
+#   define PERL_ARGS_ASSERT_STDIZE_LOCALE
+
+STATIC const char *
+S_toggle_locale_i(pTHX_ const unsigned switch_cat_index, const char *new_locale, const line_t caller_line);
+#   define PERL_ARGS_ASSERT_TOGGLE_LOCALE_I     \
+        assert(new_locale)
+
+#   if defined(DEBUGGING)
+STATIC char *
+S_my_setlocale_debug_string_i(pTHX_ const unsigned cat_index, const char *locale, const char *retval, const line_t line)
+        __attribute__warn_unused_result__;
+#     define PERL_ARGS_ASSERT_MY_SETLOCALE_DEBUG_STRING_I
+
+#   endif
+#   if defined(HAS_NL_LANGINFO) || defined(HAS_NL_LANGINFO_L)
+STATIC const char *
+S_my_langinfo_i(pTHX_ const nl_item item, const unsigned int cat_index, const char *locale, const char **retbufp, Size_t *retbuf_sizep, utf8ness_t *utf8ness);
+#     define PERL_ARGS_ASSERT_MY_LANGINFO_I     \
+        assert(locale); assert(retbufp)
+
+#   else
+STATIC const char *
+S_my_langinfo_i(pTHX_ const int item, const unsigned int cat_index, const char *locale, const char **retbufp, Size_t *retbuf_sizep, utf8ness_t *utf8ness);
+#     define PERL_ARGS_ASSERT_MY_LANGINFO_I     \
+        assert(locale); assert(retbufp)
+
+#   endif
+#   if !defined(PERL_NO_INLINE_FUNCTIONS)
+PERL_STATIC_INLINE const char *
+S_mortalized_pv_copy(pTHX_ const char * const pv)
+        __attribute__warn_unused_result__;
+#     define PERL_ARGS_ASSERT_MORTALIZED_PV_COPY
+
+#   endif
+#   if defined(USE_LOCALE_COLLATE)
+STATIC void
+S_new_collate(pTHX_ const char *newcoll, bool force);
+#     define PERL_ARGS_ASSERT_NEW_COLLATE       \
+        assert(newcoll)
+
+#     if defined(DEBUGGING)
+STATIC void
+S_print_collxfrm_input_and_return(pTHX_ const char *s, const char *e, const char *xbuf, const STRLEN xlen, const bool is_utf8);
+#       define PERL_ARGS_ASSERT_PRINT_COLLXFRM_INPUT_AND_RETURN \
+        assert(s); assert(e)
+
+#     endif
+#   endif /* defined(USE_LOCALE_COLLATE) */
+#   if defined(USE_LOCALE_CTYPE)
+STATIC bool
+S_is_codeset_name_UTF8(const char *name);
+#     define PERL_ARGS_ASSERT_IS_CODESET_NAME_UTF8 \
+        assert(name)
+
+STATIC void
+S_new_ctype(pTHX_ const char *newctype, bool force);
+#     define PERL_ARGS_ASSERT_NEW_CTYPE         \
+        assert(newctype)
+
+#   endif /* defined(USE_LOCALE_CTYPE) */
+#   if defined(USE_LOCALE_NUMERIC)
+STATIC void
+S_new_numeric(pTHX_ const char *newnum, bool force);
+#     define PERL_ARGS_ASSERT_NEW_NUMERIC       \
+        assert(newnum)
+
+#   endif
+#   if defined(USE_PERL_SWITCH_LOCALE_CONTEXT) || defined(DEBUGGING)
+STATIC const char *
+S_get_LC_ALL_display(pTHX);
+#     define PERL_ARGS_ASSERT_GET_LC_ALL_DISPLAY
+
+#   endif
+#   if defined(USE_POSIX_2008_LOCALE)
+STATIC const char *
+S_emulate_setlocale_i(pTHX_ const unsigned int index, const char *new_locale, const recalc_lc_all_t recalc_LC_ALL, const line_t line);
+#     define PERL_ARGS_ASSERT_EMULATE_SETLOCALE_I
+
+STATIC const char *
+S_my_querylocale_i(pTHX_ const unsigned int index);
+#     define PERL_ARGS_ASSERT_MY_QUERYLOCALE_I
+
+STATIC const char *
+S_setlocale_from_aggregate_LC_ALL(pTHX_ const char *locale, const line_t line);
+#     define PERL_ARGS_ASSERT_SETLOCALE_FROM_AGGREGATE_LC_ALL \
+        assert(locale)
+
+STATIC locale_t
+S_use_curlocale_scratch(pTHX);
+#     define PERL_ARGS_ASSERT_USE_CURLOCALE_SCRATCH
+
+#     if defined(USE_QUERYLOCALE)
+STATIC const char *
+S_calculate_LC_ALL(pTHX_ const locale_t cur_obj);
+#       define PERL_ARGS_ASSERT_CALCULATE_LC_ALL
+
+#     else
+STATIC const char *
+S_update_PL_curlocales_i(pTHX_ const unsigned int index, const char *new_locale, recalc_lc_all_t recalc_LC_ALL);
+#       define PERL_ARGS_ASSERT_UPDATE_PL_CURLOCALES_I \
+        assert(new_locale)
+
+#     endif
+#   elif  defined(USE_LOCALE_THREADS) &&                  \
+         !defined(USE_THREAD_SAFE_LOCALE) &&              \
+         !defined(USE_THREAD_SAFE_LOCALE_EMULATION) /* &&
+         !defined(USE_POSIX_2008_LOCALE) */
+STATIC const char *
+S_less_dicey_setlocale_r(pTHX_ const int category, const char *locale);
+#     define PERL_ARGS_ASSERT_LESS_DICEY_SETLOCALE_R
+
+STATIC void
+S_less_dicey_void_setlocale_i(pTHX_ const unsigned cat_index, const char *locale, const line_t line);
+#     define PERL_ARGS_ASSERT_LESS_DICEY_VOID_SETLOCALE_I \
+        assert(locale)
+
+#     if 0
+STATIC bool
+S_less_dicey_bool_setlocale_r(pTHX_ const int cat, const char *locale);
+#       define PERL_ARGS_ASSERT_LESS_DICEY_BOOL_SETLOCALE_R \
+        assert(locale)
+
+#     endif
+#   endif /*  defined(USE_LOCALE_THREADS) &&
+             !defined(USE_POSIX_2008_LOCALE) &&
+             !defined(USE_THREAD_SAFE_LOCALE) &&
+             !defined(USE_THREAD_SAFE_LOCALE_EMULATION) */
+#   if !(  defined(USE_POSIX_2008_LOCALE) && defined(USE_QUERYLOCALE) ) && \
+        ( !defined(LC_ALL) || defined(USE_POSIX_2008_LOCALE) ||            \
+           defined(WIN32) )
+STATIC const char *
+S_calculate_LC_ALL(pTHX_ const char **individ_locales);
+#     define PERL_ARGS_ASSERT_CALCULATE_LC_ALL  \
+        assert(individ_locales)
+
+#   endif
+#   if defined(WIN32)
+STATIC wchar_t *
+S_Win_byte_string_to_wstring(const UINT code_page, const char *byte_string);
+#     define PERL_ARGS_ASSERT_WIN_BYTE_STRING_TO_WSTRING
+
+STATIC char *
+S_Win_wstring_to_byte_string(const UINT code_page, const wchar_t *wstring);
+#     define PERL_ARGS_ASSERT_WIN_WSTRING_TO_BYTE_STRING
+
+STATIC const char *
+S_win32_setlocale(pTHX_ int category, const char *locale);
+#     define PERL_ARGS_ASSERT_WIN32_SETLOCALE
+
+STATIC const char *
+S_wrap_wsetlocale(pTHX_ const int category, const char *locale);
+#     define PERL_ARGS_ASSERT_WRAP_WSETLOCALE
+
+#   endif /* defined(WIN32) */
+#   if   defined(WIN32) || \
+       ( defined(USE_POSIX_2008_LOCALE) && !defined(USE_QUERYLOCALE) )
+STATIC const char *
+S_find_locale_from_environment(pTHX_ const unsigned int index);
+#     define PERL_ARGS_ASSERT_FIND_LOCALE_FROM_ENVIRONMENT
+
+#   endif
+# endif /* defined(USE_LOCALE) */
+# if defined(USE_POSIX_2008_LOCALE) || defined(DEBUGGING)
+STATIC const char *
+S_get_displayable_string(pTHX_ const char * const s, const char * const e, const bool is_utf8);
+#   define PERL_ARGS_ASSERT_GET_DISPLAYABLE_STRING \
+        assert(s); assert(e)
+
+# endif
+#endif /* defined(PERL_IN_LOCALE_C) */
 #if defined(PERL_IN_MALLOC_C)
-STATIC int     S_adjust_size_and_find_bucket(size_t *nbytes_p);
-#define PERL_ARGS_ASSERT_ADJUST_SIZE_AND_FIND_BUCKET   \
-       assert(nbytes_p)
+STATIC int
+S_adjust_size_and_find_bucket(size_t *nbytes_p);
+# define PERL_ARGS_ASSERT_ADJUST_SIZE_AND_FIND_BUCKET \
+        assert(nbytes_p)
+
 #endif
 #if defined(PERL_IN_MG_C)
-STATIC void    S_fixup_errno_string(pTHX_ SV* sv);
-#define PERL_ARGS_ASSERT_FIXUP_ERRNO_STRING    \
-       assert(sv)
-STATIC SV*     S_magic_methcall1(pTHX_ SV *sv, const MAGIC *mg, SV *meth, U32 flags, int n, SV *val);
-#define PERL_ARGS_ASSERT_MAGIC_METHCALL1       \
-       assert(sv); assert(mg); assert(meth)
-STATIC int     S_magic_methpack(pTHX_ SV *sv, const MAGIC *mg, SV *meth);
-#define PERL_ARGS_ASSERT_MAGIC_METHPACK        \
-       assert(sv); assert(mg); assert(meth)
-STATIC void    S_restore_magic(pTHX_ const void *p);
-#define PERL_ARGS_ASSERT_RESTORE_MAGIC
-STATIC void    S_save_magic_flags(pTHX_ I32 mgs_ix, SV *sv, U32 flags);
-#define PERL_ARGS_ASSERT_SAVE_MAGIC_FLAGS      \
-       assert(sv)
-STATIC void    S_unwind_handler_stack(pTHX_ const void *p);
-#define PERL_ARGS_ASSERT_UNWIND_HANDLER_STACK
-#endif
+STATIC void
+S_fixup_errno_string(pTHX_ SV *sv);
+# define PERL_ARGS_ASSERT_FIXUP_ERRNO_STRING    \
+        assert(sv)
+
+STATIC SV *
+S_magic_methcall1(pTHX_ SV *sv, const MAGIC *mg, SV *meth, U32 flags, int n, SV *val);
+# define PERL_ARGS_ASSERT_MAGIC_METHCALL1       \
+        assert(sv); assert(mg); assert(meth)
+
+STATIC int
+S_magic_methpack(pTHX_ SV *sv, const MAGIC *mg, SV *meth);
+# define PERL_ARGS_ASSERT_MAGIC_METHPACK        \
+        assert(sv); assert(mg); assert(meth)
+
+STATIC void
+S_restore_magic(pTHX_ const void *p);
+# define PERL_ARGS_ASSERT_RESTORE_MAGIC
+
+STATIC void
+S_save_magic_flags(pTHX_ SSize_t mgs_ix, SV *sv, U32 flags);
+# define PERL_ARGS_ASSERT_SAVE_MAGIC_FLAGS      \
+        assert(sv)
+
+STATIC void
+S_unwind_handler_stack(pTHX_ const void *p);
+# define PERL_ARGS_ASSERT_UNWIND_HANDLER_STACK
+
+#endif /* defined(PERL_IN_MG_C) */
 #if defined(PERL_IN_MG_C) || defined(PERL_IN_PP_C)
-PERL_CALLCONV bool     Perl_translate_substr_offsets(STRLEN curlen, IV pos1_iv, bool pos1_is_uv, IV len_iv, bool len_is_uv, STRLEN *posp, STRLEN *lenp);
-#define PERL_ARGS_ASSERT_TRANSLATE_SUBSTR_OFFSETS      \
-       assert(posp); assert(lenp)
+PERL_CALLCONV bool
+Perl_translate_substr_offsets(STRLEN curlen, IV pos1_iv, bool pos1_is_uv, IV len_iv, bool len_is_uv, STRLEN *posp, STRLEN *lenp)
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_TRANSLATE_SUBSTR_OFFSETS \
+        assert(posp); assert(lenp)
+
 #endif
 #if defined(PERL_IN_MRO_C)
-STATIC void    S_mro_clean_isarev(pTHX_ HV * const isa, const char * const name, const STRLEN len, HV * const exceptions, U32 hash, U32 flags);
-#define PERL_ARGS_ASSERT_MRO_CLEAN_ISAREV      \
-       assert(isa); assert(name)
-STATIC void    S_mro_gather_and_rename(pTHX_ HV * const stashes, HV * const seen_stashes, HV *stash, HV *oldstash, SV *namesv);
-#define PERL_ARGS_ASSERT_MRO_GATHER_AND_RENAME \
-       assert(stashes); assert(seen_stashes); assert(namesv)
-STATIC AV*     S_mro_get_linear_isa_dfs(pTHX_ HV* stash, U32 level);
-#define PERL_ARGS_ASSERT_MRO_GET_LINEAR_ISA_DFS        \
-       assert(stash)
-#endif
+STATIC void
+S_mro_clean_isarev(pTHX_ HV * const isa, const char * const name, const STRLEN len, HV * const exceptions, U32 hash, U32 flags);
+# define PERL_ARGS_ASSERT_MRO_CLEAN_ISAREV      \
+        assert(isa); assert(name)
+
+STATIC void
+S_mro_gather_and_rename(pTHX_ HV * const stashes, HV * const seen_stashes, HV *stash, HV *oldstash, SV *namesv);
+# define PERL_ARGS_ASSERT_MRO_GATHER_AND_RENAME \
+        assert(stashes); assert(seen_stashes); assert(namesv)
+
+STATIC AV *
+S_mro_get_linear_isa_dfs(pTHX_ HV *stash, U32 level);
+# define PERL_ARGS_ASSERT_MRO_GET_LINEAR_ISA_DFS \
+        assert(stash)
+
+#endif /* defined(PERL_IN_MRO_C) */
 #if defined(PERL_IN_NUMERIC_C)
-STATIC void    S_output_non_portable(pTHX_ const U8 shift);
-#define PERL_ARGS_ASSERT_OUTPUT_NON_PORTABLE
+STATIC void
+S_output_non_portable(pTHX_ const U8 shift);
+# define PERL_ARGS_ASSERT_OUTPUT_NON_PORTABLE
+
 #endif
 #if defined(PERL_IN_OP_C)
-STATIC void    S_apply_attrs(pTHX_ HV *stash, SV *target, OP *attrs);
-#define PERL_ARGS_ASSERT_APPLY_ATTRS   \
-       assert(stash); assert(target)
-STATIC void    S_apply_attrs_my(pTHX_ HV *stash, OP *target, OP *attrs, OP **imopsp);
-#define PERL_ARGS_ASSERT_APPLY_ATTRS_MY        \
-       assert(stash); assert(target); assert(imopsp)
-STATIC I32     S_assignment_type(pTHX_ const OP *o)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_ASSIGNMENT_TYPE
-
-STATIC void    S_bad_type_gv(pTHX_ I32 n, GV *gv, const OP *kid, const char *t);
-#define PERL_ARGS_ASSERT_BAD_TYPE_GV   \
-       assert(gv); assert(kid); assert(t)
-STATIC void    S_bad_type_pv(pTHX_ I32 n, const char *t, const OP *o, const OP *kid);
-#define PERL_ARGS_ASSERT_BAD_TYPE_PV   \
-       assert(t); assert(o); assert(kid)
-STATIC void    S_clear_special_blocks(pTHX_ const char *const fullname, GV *const gv, CV *const cv);
-#define PERL_ARGS_ASSERT_CLEAR_SPECIAL_BLOCKS  \
-       assert(fullname); assert(gv); assert(cv)
-STATIC void    S_cop_free(pTHX_ COP *cop);
-#define PERL_ARGS_ASSERT_COP_FREE      \
-       assert(cop)
-STATIC OP *    S_dup_attrlist(pTHX_ OP *o);
-#define PERL_ARGS_ASSERT_DUP_ATTRLIST  \
-       assert(o)
-STATIC void    S_finalize_op(pTHX_ OP* o);
-#define PERL_ARGS_ASSERT_FINALIZE_OP   \
-       assert(o)
-STATIC void    S_find_and_forget_pmops(pTHX_ OP *o);
-#define PERL_ARGS_ASSERT_FIND_AND_FORGET_PMOPS \
-       assert(o)
-STATIC OP*     S_fold_constants(pTHX_ OP * const o);
-#define PERL_ARGS_ASSERT_FOLD_CONSTANTS        \
-       assert(o)
-STATIC OP*     S_force_list(pTHX_ OP* arg, bool nullit);
-#define PERL_ARGS_ASSERT_FORCE_LIST
-STATIC void    S_forget_pmop(pTHX_ PMOP *const o);
-#define PERL_ARGS_ASSERT_FORGET_PMOP   \
-       assert(o)
-STATIC void    S_gen_constant_list(pTHX_ OP* o);
-#define PERL_ARGS_ASSERT_GEN_CONSTANT_LIST
-STATIC void    S_inplace_aassign(pTHX_ OP* o);
-#define PERL_ARGS_ASSERT_INPLACE_AASSIGN       \
-       assert(o)
-STATIC bool    S_is_handle_constructor(const OP *o, I32 numargs)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_IS_HANDLE_CONSTRUCTOR \
-       assert(o)
-
-STATIC OP*     S_listkids(pTHX_ OP* o);
-#define PERL_ARGS_ASSERT_LISTKIDS
-STATIC bool    S_looks_like_bool(pTHX_ const OP* o);
-#define PERL_ARGS_ASSERT_LOOKS_LIKE_BOOL       \
-       assert(o)
-STATIC OP*     S_modkids(pTHX_ OP *o, I32 type);
-#define PERL_ARGS_ASSERT_MODKIDS
-STATIC void    S_move_proto_attr(pTHX_ OP **proto, OP **attrs, const GV *name, bool curstash);
-#define PERL_ARGS_ASSERT_MOVE_PROTO_ATTR       \
-       assert(proto); assert(attrs); assert(name)
-STATIC OP *    S_my_kid(pTHX_ OP *o, OP *attrs, OP **imopsp);
-#define PERL_ARGS_ASSERT_MY_KID        \
-       assert(imopsp)
-STATIC OP*     S_newGIVWHENOP(pTHX_ OP* cond, OP *block, I32 enter_opcode, I32 leave_opcode, PADOFFSET entertarg);
-#define PERL_ARGS_ASSERT_NEWGIVWHENOP  \
-       assert(block)
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE OP* S_newMETHOP_internal(pTHX_ I32 type, I32 flags, OP* dynamic_meth, SV* const_meth);
-#define PERL_ARGS_ASSERT_NEWMETHOP_INTERNAL
-#endif
-STATIC OP*     S_new_logop(pTHX_ I32 type, I32 flags, OP **firstp, OP **otherp)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_NEW_LOGOP     \
-       assert(firstp); assert(otherp)
-
-STATIC void    S_no_bareword_allowed(pTHX_ OP *o);
-#define PERL_ARGS_ASSERT_NO_BAREWORD_ALLOWED   \
-       assert(o)
-STATIC OP*     S_no_fh_allowed(pTHX_ OP *o)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_NO_FH_ALLOWED \
-       assert(o)
-
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE OP* S_op_integerize(pTHX_ OP *o);
-#define PERL_ARGS_ASSERT_OP_INTEGERIZE \
-       assert(o)
-#endif
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE OP* S_op_std_init(pTHX_ OP *o);
-#define PERL_ARGS_ASSERT_OP_STD_INIT   \
-       assert(o)
-#endif
-STATIC void    S_optimize_op(pTHX_ OP* o);
-#define PERL_ARGS_ASSERT_OPTIMIZE_OP   \
-       assert(o)
-STATIC OP*     S_pmtrans(pTHX_ OP* o, OP* expr, OP* repl);
-#define PERL_ARGS_ASSERT_PMTRANS       \
-       assert(o); assert(expr); assert(repl)
-STATIC bool    S_process_special_blocks(pTHX_ I32 floor, const char *const fullname, GV *const gv, CV *const cv);
-#define PERL_ARGS_ASSERT_PROCESS_SPECIAL_BLOCKS        \
-       assert(fullname); assert(gv); assert(cv)
-STATIC OP*     S_ref_array_or_hash(pTHX_ OP* cond);
-#define PERL_ARGS_ASSERT_REF_ARRAY_OR_HASH
-STATIC OP*     S_refkids(pTHX_ OP* o, I32 type);
-#define PERL_ARGS_ASSERT_REFKIDS
-STATIC bool    S_scalar_mod_type(const OP *o, I32 type)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_SCALAR_MOD_TYPE
-
-STATIC OP*     S_scalarboolean(pTHX_ OP *o);
-#define PERL_ARGS_ASSERT_SCALARBOOLEAN \
-       assert(o)
-STATIC OP*     S_scalarkids(pTHX_ OP* o);
-#define PERL_ARGS_ASSERT_SCALARKIDS
-STATIC OP*     S_search_const(pTHX_ OP *o)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_SEARCH_CONST  \
-       assert(o)
-
-STATIC void    S_simplify_sort(pTHX_ OP *o);
-#define PERL_ARGS_ASSERT_SIMPLIFY_SORT \
-       assert(o)
-STATIC OP*     S_too_few_arguments_pv(pTHX_ OP *o, const char* name, U32 flags)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_TOO_FEW_ARGUMENTS_PV  \
-       assert(o); assert(name)
-
-STATIC OP*     S_too_many_arguments_pv(pTHX_ OP *o, const char* name, U32 flags);
-#define PERL_ARGS_ASSERT_TOO_MANY_ARGUMENTS_PV \
-       assert(o); assert(name)
-STATIC OP*     S_traverse_op_tree(pTHX_ OP* top, OP* o);
-#define PERL_ARGS_ASSERT_TRAVERSE_OP_TREE      \
-       assert(top); assert(o)
-STATIC OP*     S_voidnonfinal(pTHX_ OP* o);
-#define PERL_ARGS_ASSERT_VOIDNONFINAL
-#  if defined(USE_ITHREADS)
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE void        S_op_relocate_sv(pTHX_ SV** svp, PADOFFSET* targp);
-#define PERL_ARGS_ASSERT_OP_RELOCATE_SV        \
-       assert(svp); assert(targp)
-#endif
-#  endif
+STATIC void
+S_apply_attrs(pTHX_ HV *stash, SV *target, OP *attrs);
+# define PERL_ARGS_ASSERT_APPLY_ATTRS           \
+        assert(stash); assert(target)
+
+STATIC void
+S_apply_attrs_my(pTHX_ HV *stash, OP *target, OP *attrs, OP **imopsp);
+# define PERL_ARGS_ASSERT_APPLY_ATTRS_MY        \
+        assert(stash); assert(target); assert(imopsp)
+
+STATIC I32
+S_assignment_type(pTHX_ const OP *o)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_ASSIGNMENT_TYPE
+
+STATIC void
+S_bad_type_gv(pTHX_ I32 n, GV *gv, const OP *kid, const char *t);
+# define PERL_ARGS_ASSERT_BAD_TYPE_GV           \
+        assert(gv); assert(kid); assert(t)
+
+STATIC void
+S_bad_type_pv(pTHX_ I32 n, const char *t, const OP *o, const OP *kid);
+# define PERL_ARGS_ASSERT_BAD_TYPE_PV           \
+        assert(t); assert(o); assert(kid)
+
+STATIC void
+S_clear_special_blocks(pTHX_ const char * const fullname, GV * const gv, CV * const cv);
+# define PERL_ARGS_ASSERT_CLEAR_SPECIAL_BLOCKS  \
+        assert(fullname); assert(gv); assert(cv)
+
+STATIC void
+S_cop_free(pTHX_ COP *cop);
+# define PERL_ARGS_ASSERT_COP_FREE              \
+        assert(cop)
+
+STATIC OP *
+S_dup_attrlist(pTHX_ OP *o);
+# define PERL_ARGS_ASSERT_DUP_ATTRLIST          \
+        assert(o)
+
+STATIC void
+S_find_and_forget_pmops(pTHX_ OP *o);
+# define PERL_ARGS_ASSERT_FIND_AND_FORGET_PMOPS \
+        assert(o)
+
+STATIC OP *
+S_fold_constants(pTHX_ OP * const o);
+# define PERL_ARGS_ASSERT_FOLD_CONSTANTS        \
+        assert(o)
+
+STATIC OP *
+S_force_list(pTHX_ OP *arg, bool nullit);
+# define PERL_ARGS_ASSERT_FORCE_LIST
+
+STATIC void
+S_forget_pmop(pTHX_ PMOP * const o);
+# define PERL_ARGS_ASSERT_FORGET_PMOP           \
+        assert(o)
+
+STATIC void
+S_gen_constant_list(pTHX_ OP *o);
+# define PERL_ARGS_ASSERT_GEN_CONSTANT_LIST
+
+STATIC void
+S_inplace_aassign(pTHX_ OP *o);
+# define PERL_ARGS_ASSERT_INPLACE_AASSIGN       \
+        assert(o)
+
+STATIC bool
+S_is_handle_constructor(const OP *o, I32 numargs)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_IS_HANDLE_CONSTRUCTOR \
+        assert(o)
+
+STATIC OP *
+S_listkids(pTHX_ OP *o);
+# define PERL_ARGS_ASSERT_LISTKIDS
+
+STATIC bool
+S_looks_like_bool(pTHX_ const OP *o);
+# define PERL_ARGS_ASSERT_LOOKS_LIKE_BOOL       \
+        assert(o)
+
+STATIC OP *
+S_modkids(pTHX_ OP *o, I32 type);
+# define PERL_ARGS_ASSERT_MODKIDS
+
+STATIC void
+S_move_proto_attr(pTHX_ OP **proto, OP **attrs, const GV *name, bool curstash);
+# define PERL_ARGS_ASSERT_MOVE_PROTO_ATTR       \
+        assert(proto); assert(attrs); assert(name)
+
+STATIC OP *
+S_my_kid(pTHX_ OP *o, OP *attrs, OP **imopsp);
+# define PERL_ARGS_ASSERT_MY_KID                \
+        assert(imopsp)
+
+STATIC OP *
+S_newGIVWHENOP(pTHX_ OP *cond, OP *block, I32 enter_opcode, I32 leave_opcode, PADOFFSET entertarg);
+# define PERL_ARGS_ASSERT_NEWGIVWHENOP          \
+        assert(block)
+
+STATIC OP *
+S_new_logop(pTHX_ I32 type, I32 flags, OP **firstp, OP **otherp)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_NEW_LOGOP             \
+        assert(firstp); assert(otherp)
+
+STATIC OP *
+S_no_fh_allowed(pTHX_ OP *o)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_NO_FH_ALLOWED         \
+        assert(o)
+
+STATIC OP *
+S_pmtrans(pTHX_ OP *o, OP *expr, OP *repl);
+# define PERL_ARGS_ASSERT_PMTRANS               \
+        assert(o); assert(expr); assert(repl)
+
+STATIC bool
+S_process_special_blocks(pTHX_ I32 floor, const char * const fullname, GV * const gv, CV * const cv);
+# define PERL_ARGS_ASSERT_PROCESS_SPECIAL_BLOCKS \
+        assert(fullname); assert(gv); assert(cv)
+
+STATIC OP *
+S_ref_array_or_hash(pTHX_ OP *cond);
+# define PERL_ARGS_ASSERT_REF_ARRAY_OR_HASH
+
+STATIC OP *
+S_refkids(pTHX_ OP *o, I32 type);
+# define PERL_ARGS_ASSERT_REFKIDS
+
+STATIC bool
+S_scalar_mod_type(const OP *o, I32 type)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_SCALAR_MOD_TYPE
+
+STATIC OP *
+S_scalarboolean(pTHX_ OP *o);
+# define PERL_ARGS_ASSERT_SCALARBOOLEAN         \
+        assert(o)
+
+STATIC OP *
+S_scalarkids(pTHX_ OP *o);
+# define PERL_ARGS_ASSERT_SCALARKIDS
+
+STATIC OP *
+S_search_const(pTHX_ OP *o)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_SEARCH_CONST          \
+        assert(o)
+
+STATIC void
+S_simplify_sort(pTHX_ OP *o);
+# define PERL_ARGS_ASSERT_SIMPLIFY_SORT         \
+        assert(o)
+
+STATIC OP *
+S_too_few_arguments_pv(pTHX_ OP *o, const char *name, U32 flags)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_TOO_FEW_ARGUMENTS_PV  \
+        assert(o); assert(name)
+
+STATIC OP *
+S_too_many_arguments_pv(pTHX_ OP *o, const char *name, U32 flags);
+# define PERL_ARGS_ASSERT_TOO_MANY_ARGUMENTS_PV \
+        assert(o); assert(name)
+
+STATIC OP *
+S_voidnonfinal(pTHX_ OP *o);
+# define PERL_ARGS_ASSERT_VOIDNONFINAL
+
+# if !defined(PERL_NO_INLINE_FUNCTIONS)
+PERL_STATIC_INLINE OP *
+S_newMETHOP_internal(pTHX_ I32 type, I32 flags, OP *dynamic_meth, SV * const_meth);
+#   define PERL_ARGS_ASSERT_NEWMETHOP_INTERNAL
+
+PERL_STATIC_INLINE OP *
+S_op_integerize(pTHX_ OP *o);
+#   define PERL_ARGS_ASSERT_OP_INTEGERIZE       \
+        assert(o)
+
+PERL_STATIC_INLINE OP *
+S_op_std_init(pTHX_ OP *o);
+#   define PERL_ARGS_ASSERT_OP_STD_INIT         \
+        assert(o)
+
+# endif /* !defined(PERL_NO_INLINE_FUNCTIONS) */
+#endif /* defined(PERL_IN_OP_C) */
+#if defined(PERL_IN_OP_C) || defined(PERL_IN_PEEP_C)
+PERL_CALLCONV void
+Perl_check_hash_fields_and_hekify(pTHX_ UNOP *rop, SVOP *key_op, int real)
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_CHECK_HASH_FIELDS_AND_HEKIFY
+
+PERL_CALLCONV void
+Perl_no_bareword_allowed(pTHX_ OP *o)
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_NO_BAREWORD_ALLOWED   \
+        assert(o)
+
+PERL_CALLCONV void
+Perl_op_prune_chain_head(OP **op_p)
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_OP_PRUNE_CHAIN_HEAD   \
+        assert(op_p)
+
+PERL_CALLCONV SV *
+Perl_op_varname(pTHX_ const OP *o)
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_OP_VARNAME            \
+        assert(o)
+
+PERL_CALLCONV void
+Perl_warn_elem_scalar_context(pTHX_ const OP *o, SV *name, bool is_hash, bool is_slice)
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_WARN_ELEM_SCALAR_CONTEXT \
+        assert(o); assert(name)
+
+#endif /* defined(PERL_IN_OP_C) || defined(PERL_IN_PEEP_C) */
+#if defined(PERL_IN_OP_C) || defined(PERL_IN_REGCOMP_ANY)
+
 #endif
 #if defined(PERL_IN_OP_C) || defined(PERL_IN_SV_C)
-PERL_CALLCONV void     Perl_report_redefined_cv(pTHX_ const SV *name, const CV *old_cv, SV * const *new_const_svp);
-#define PERL_ARGS_ASSERT_REPORT_REDEFINED_CV   \
-       assert(name); assert(old_cv)
-#endif
+PERL_CALLCONV void
+Perl_report_redefined_cv(pTHX_ const SV *name, const CV *old_cv, SV * const *new_const_svp)
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_REPORT_REDEFINED_CV   \
+        assert(name); assert(old_cv)
+
+PERL_CALLCONV SV *
+Perl_varname(pTHX_ const GV * const gv, const char gvtype, PADOFFSET targ, const SV * const keyname, SSize_t aindex, int subscript_type)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_VARNAME
+
+#endif /* defined(PERL_IN_OP_C) || defined(PERL_IN_SV_C) */
 #if defined(PERL_IN_PAD_C)
-STATIC PADOFFSET       S_pad_alloc_name(pTHX_ PADNAME *name, U32 flags, HV *typestash, HV *ourstash);
-#define PERL_ARGS_ASSERT_PAD_ALLOC_NAME        \
-       assert(name)
-STATIC void    S_pad_check_dup(pTHX_ PADNAME *name, U32 flags, const HV *ourstash);
-#define PERL_ARGS_ASSERT_PAD_CHECK_DUP \
-       assert(name)
-STATIC PADOFFSET       S_pad_findlex(pTHX_ const char *namepv, STRLEN namelen, U32 flags, const CV* cv, U32 seq, int warn, SV** out_capture, PADNAME** out_name, int *out_flags);
-#define PERL_ARGS_ASSERT_PAD_FINDLEX   \
-       assert(namepv); assert(cv); assert(out_name); assert(out_flags)
-STATIC void    S_pad_reset(pTHX);
-#define PERL_ARGS_ASSERT_PAD_RESET
-#endif
-#if defined(PERL_IN_PAD_C) || defined(PERL_IN_OP_C)
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE bool        S_PadnameIN_SCOPE(const PADNAME * const pn, const U32 seq);
-#define PERL_ARGS_ASSERT_PADNAMEIN_SCOPE       \
-       assert(pn)
-#endif
-#endif
-#if defined(PERL_IN_PERLY_C) || defined(PERL_IN_OP_C) || defined(PERL_IN_TOKE_C)
-#ifndef NO_MATHOMS
-PERL_CALLCONV OP*      Perl_ref(pTHX_ OP* o, I32 type);
-#define PERL_ARGS_ASSERT_REF
-#endif
-#endif
+STATIC PADOFFSET
+S_pad_alloc_name(pTHX_ PADNAME *name, U32 flags, HV *typestash, HV *ourstash);
+# define PERL_ARGS_ASSERT_PAD_ALLOC_NAME        \
+        assert(name)
+
+STATIC void
+S_pad_check_dup(pTHX_ PADNAME *name, U32 flags, const HV *ourstash);
+# define PERL_ARGS_ASSERT_PAD_CHECK_DUP         \
+        assert(name)
+
+STATIC PADOFFSET
+S_pad_findlex(pTHX_ const char *namepv, STRLEN namelen, U32 flags, const CV *cv, U32 seq, int warn, SV **out_capture, PADNAME **out_name, int *out_flags);
+# define PERL_ARGS_ASSERT_PAD_FINDLEX           \
+        assert(namepv); assert(cv); assert(out_name); assert(out_flags)
+
+STATIC void
+S_pad_reset(pTHX);
+# define PERL_ARGS_ASSERT_PAD_RESET
+
+# if defined(DEBUGGING)
+STATIC void
+S_cv_dump(pTHX_ const CV *cv, const char *title);
+#   define PERL_ARGS_ASSERT_CV_DUMP             \
+        assert(cv); assert(title)
+
+# endif
+#endif /* defined(PERL_IN_PAD_C) */
+#if defined(PERL_IN_PEEP_C)
+STATIC void
+S_finalize_op(pTHX_ OP *o);
+# define PERL_ARGS_ASSERT_FINALIZE_OP           \
+        assert(o)
+
+STATIC void
+S_optimize_op(pTHX_ OP *o);
+# define PERL_ARGS_ASSERT_OPTIMIZE_OP           \
+        assert(o)
+
+STATIC OP *
+S_traverse_op_tree(pTHX_ OP *top, OP *o);
+# define PERL_ARGS_ASSERT_TRAVERSE_OP_TREE      \
+        assert(top); assert(o)
+
+#endif /* defined(PERL_IN_PEEP_C) */
 #if defined(PERL_IN_PERL_C)
-STATIC void    S_find_beginning(pTHX_ SV* linestr_sv, PerlIO *rsfp);
-#define PERL_ARGS_ASSERT_FIND_BEGINNING        \
-       assert(linestr_sv); assert(rsfp)
-STATIC void    S_forbid_setid(pTHX_ const char flag, const bool suidscript);
-#define PERL_ARGS_ASSERT_FORBID_SETID
-STATIC void    S_incpush(pTHX_ const char *const dir, STRLEN len, U32 flags);
-#define PERL_ARGS_ASSERT_INCPUSH       \
-       assert(dir)
-STATIC void    S_incpush_use_sep(pTHX_ const char *p, STRLEN len, U32 flags);
-#define PERL_ARGS_ASSERT_INCPUSH_USE_SEP       \
-       assert(p)
-STATIC void    S_init_ids(pTHX);
-#define PERL_ARGS_ASSERT_INIT_IDS
-STATIC void    S_init_interp(pTHX);
-#define PERL_ARGS_ASSERT_INIT_INTERP
-STATIC void    S_init_main_stash(pTHX);
-#define PERL_ARGS_ASSERT_INIT_MAIN_STASH
-STATIC void    S_init_perllib(pTHX);
-#define PERL_ARGS_ASSERT_INIT_PERLLIB
-STATIC void    S_init_postdump_symbols(pTHX_ int argc, char **argv, char **env);
-#define PERL_ARGS_ASSERT_INIT_POSTDUMP_SYMBOLS \
-       assert(argv)
-STATIC void    S_init_predump_symbols(pTHX);
-#define PERL_ARGS_ASSERT_INIT_PREDUMP_SYMBOLS
-STATIC SV*     S_mayberelocate(pTHX_ const char *const dir, STRLEN len, U32 flags);
-#define PERL_ARGS_ASSERT_MAYBERELOCATE \
-       assert(dir)
-PERL_STATIC_NO_RET void        S_minus_v(pTHX)
-                       __attribute__noreturn__;
-#define PERL_ARGS_ASSERT_MINUS_V
-
-PERL_STATIC_NO_RET void        S_my_exit_jump(pTHX)
-                       __attribute__noreturn__;
-#define PERL_ARGS_ASSERT_MY_EXIT_JUMP
-
-STATIC void    S_nuke_stacks(pTHX);
-#define PERL_ARGS_ASSERT_NUKE_STACKS
-STATIC PerlIO *        S_open_script(pTHX_ const char *scriptname, bool dosearch, bool *suidscript);
-#define PERL_ARGS_ASSERT_OPEN_SCRIPT   \
-       assert(scriptname); assert(suidscript)
-STATIC void*   S_parse_body(pTHX_ char **env, XSINIT_t xsinit);
-#define PERL_ARGS_ASSERT_PARSE_BODY
-PERL_STATIC_NO_RET void        S_run_body(pTHX_ I32 oldscope)
-                       __attribute__noreturn__;
-#define PERL_ARGS_ASSERT_RUN_BODY
-
-PERL_STATIC_NO_RET void        S_usage(pTHX)
-                       __attribute__noreturn__;
-#define PERL_ARGS_ASSERT_USAGE
-
-#endif
+STATIC void
+S_find_beginning(pTHX_ SV *linestr_sv, PerlIO *rsfp);
+# define PERL_ARGS_ASSERT_FIND_BEGINNING        \
+        assert(linestr_sv); assert(rsfp)
+
+STATIC void
+S_forbid_setid(pTHX_ const char flag, const bool suidscript);
+# define PERL_ARGS_ASSERT_FORBID_SETID
+
+STATIC void
+S_incpush(pTHX_ const char * const dir, STRLEN len, U32 flags);
+# define PERL_ARGS_ASSERT_INCPUSH               \
+        assert(dir)
+
+STATIC void
+S_incpush_use_sep(pTHX_ const char *p, STRLEN len, U32 flags);
+# define PERL_ARGS_ASSERT_INCPUSH_USE_SEP       \
+        assert(p)
+
+STATIC void
+S_init_ids(pTHX);
+# define PERL_ARGS_ASSERT_INIT_IDS
+
+STATIC void
+S_init_interp(pTHX);
+# define PERL_ARGS_ASSERT_INIT_INTERP
+
+STATIC void
+S_init_main_stash(pTHX);
+# define PERL_ARGS_ASSERT_INIT_MAIN_STASH
+
+STATIC void
+S_init_perllib(pTHX);
+# define PERL_ARGS_ASSERT_INIT_PERLLIB
+
+STATIC void
+S_init_postdump_symbols(pTHX_ int argc, char **argv, char **env);
+# define PERL_ARGS_ASSERT_INIT_POSTDUMP_SYMBOLS \
+        assert(argv)
+
+STATIC void
+S_init_predump_symbols(pTHX);
+# define PERL_ARGS_ASSERT_INIT_PREDUMP_SYMBOLS
+
+STATIC SV *
+S_mayberelocate(pTHX_ const char * const dir, STRLEN len, U32 flags);
+# define PERL_ARGS_ASSERT_MAYBERELOCATE         \
+        assert(dir)
+
+PERL_STATIC_NO_RET void
+S_minus_v(pTHX)
+        __attribute__noreturn__;
+# define PERL_ARGS_ASSERT_MINUS_V
+
+PERL_STATIC_NO_RET void
+S_my_exit_jump(pTHX)
+        __attribute__noreturn__;
+# define PERL_ARGS_ASSERT_MY_EXIT_JUMP
+
+STATIC void
+S_nuke_stacks(pTHX);
+# define PERL_ARGS_ASSERT_NUKE_STACKS
+
+STATIC PerlIO *
+S_open_script(pTHX_ const char *scriptname, bool dosearch, bool *suidscript);
+# define PERL_ARGS_ASSERT_OPEN_SCRIPT           \
+        assert(scriptname); assert(suidscript)
+
+STATIC void *
+S_parse_body(pTHX_ char **env, XSINIT_t xsinit);
+# define PERL_ARGS_ASSERT_PARSE_BODY
+
+PERL_STATIC_NO_RET void
+S_run_body(pTHX_ I32 oldscope)
+        __attribute__noreturn__;
+# define PERL_ARGS_ASSERT_RUN_BODY
+
+PERL_STATIC_NO_RET void
+S_usage(pTHX)
+        __attribute__noreturn__;
+# define PERL_ARGS_ASSERT_USAGE
+
+# if !defined(PERL_IS_MINIPERL)
+STATIC SV *
+S_incpush_if_exists(pTHX_ AV * const av, SV *dir, SV * const stem);
+#   define PERL_ARGS_ASSERT_INCPUSH_IF_EXISTS   \
+        assert(av); assert(dir); assert(stem)
+
+# endif
+# if !defined(SETUID_SCRIPTS_ARE_SECURE_NOW)
+STATIC void
+S_validate_suid(pTHX_ PerlIO *rsfp);
+#   define PERL_ARGS_ASSERT_VALIDATE_SUID       \
+        assert(rsfp)
+
+# endif
+#endif /* defined(PERL_IN_PERL_C) */
+#if defined(PERL_IN_PERL_C) || defined(PERL_IN_REGCOMP_ANY) || \
+    defined(PERL_IN_UTF8_C)
+PERL_CALLCONV bool
+Perl__invlistEQ(pTHX_ SV * const a, SV * const b, const bool complement_b);
+# define PERL_ARGS_ASSERT__INVLISTEQ            \
+        assert(a); assert(b)
+
+PERL_CALLCONV SV *
+Perl__new_invlist_C_array(pTHX_ const UV * const list)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT__NEW_INVLIST_C_ARRAY  \
+        assert(list)
+
+#endif /* defined(PERL_IN_PERL_C) || defined(PERL_IN_REGCOMP_ANY) ||
+          defined(PERL_IN_UTF8_C) */
 #if defined(PERL_IN_PP_C)
-STATIC size_t  S_do_chomp(pTHX_ SV *retval, SV *sv, bool chomping);
-#define PERL_ARGS_ASSERT_DO_CHOMP      \
-       assert(retval); assert(sv)
-STATIC OP*     S_do_delete_local(pTHX);
-#define PERL_ARGS_ASSERT_DO_DELETE_LOCAL
-STATIC SV*     S_refto(pTHX_ SV* sv)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_REFTO \
-       assert(sv)
-
-#endif
+STATIC size_t
+S_do_chomp(pTHX_ SV *retval, SV *sv, bool chomping);
+# define PERL_ARGS_ASSERT_DO_CHOMP              \
+        assert(retval); assert(sv)
+
+STATIC OP *
+S_do_delete_local(pTHX);
+# define PERL_ARGS_ASSERT_DO_DELETE_LOCAL
+
+STATIC SV *
+S_refto(pTHX_ SV *sv)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_REFTO                 \
+        assert(sv)
+
+#endif /* defined(PERL_IN_PP_C) */
 #if defined(PERL_IN_PP_C) || defined(PERL_IN_PP_HOT_C)
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE bool        S_lossless_NV_to_IV(const NV nv, IV * ivp)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_LOSSLESS_NV_TO_IV     \
-       assert(ivp)
-#endif
 
-PERL_CALLCONV GV*      Perl_softref2xv(pTHX_ SV *const sv, const char *const what, const svtype type, SV ***spp)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_SOFTREF2XV    \
-       assert(sv); assert(what); assert(spp)
+PERL_CALLCONV GV *
+Perl_softref2xv(pTHX_ SV * const sv, const char * const what, const svtype type, SV ***spp)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_SOFTREF2XV            \
+        assert(sv); assert(what); assert(spp)
 
 #endif
-#if defined(PERL_IN_PP_CTL_C)
-STATIC PerlIO *        S_check_type_and_open(pTHX_ SV *name)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_CHECK_TYPE_AND_OPEN   \
-       assert(name)
-
-STATIC void    S_destroy_matcher(pTHX_ PMOP* matcher);
-#define PERL_ARGS_ASSERT_DESTROY_MATCHER       \
-       assert(matcher)
-STATIC OP*     S_do_smartmatch(pTHX_ HV* seen_this, HV* seen_other, const bool copied);
-#define PERL_ARGS_ASSERT_DO_SMARTMATCH
-STATIC OP*     S_docatch(pTHX_ Perl_ppaddr_t firstpp)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_DOCATCH
-
-STATIC bool    S_doeval_compile(pTHX_ U8 gimme, CV* outside, U32 seq, HV* hh);
-#define PERL_ARGS_ASSERT_DOEVAL_COMPILE
-STATIC OP*     S_dofindlabel(pTHX_ OP *o, const char *label, STRLEN len, U32 flags, OP **opstack, OP **oplimit)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_DOFINDLABEL   \
-       assert(o); assert(label); assert(opstack); assert(oplimit)
-
-STATIC MAGIC * S_doparseform(pTHX_ SV *sv);
-#define PERL_ARGS_ASSERT_DOPARSEFORM   \
-       assert(sv)
-STATIC I32     S_dopoptoeval(pTHX_ I32 startingblock)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_DOPOPTOEVAL
-
-STATIC I32     S_dopoptogivenfor(pTHX_ I32 startingblock)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_DOPOPTOGIVENFOR
-
-STATIC I32     S_dopoptolabel(pTHX_ const char *label, STRLEN len, U32 flags)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_DOPOPTOLABEL  \
-       assert(label)
-
-STATIC I32     S_dopoptoloop(pTHX_ I32 startingblock)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_DOPOPTOLOOP
-
-STATIC I32     S_dopoptosub_at(pTHX_ const PERL_CONTEXT* cxstk, I32 startingblock)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_DOPOPTOSUB_AT \
-       assert(cxstk)
-
-STATIC I32     S_dopoptowhen(pTHX_ I32 startingblock)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_DOPOPTOWHEN
-
-STATIC PMOP*   S_make_matcher(pTHX_ REGEXP* re)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_MAKE_MATCHER  \
-       assert(re)
-
-STATIC bool    S_matcher_matches_sv(pTHX_ PMOP* matcher, SV* sv)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_MATCHER_MATCHES_SV    \
-       assert(matcher); assert(sv)
-
-STATIC bool    S_num_overflow(NV value, I32 fldsize, I32 frcsize)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_NUM_OVERFLOW
-
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE bool        S_path_is_searchable(const char *name)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_PATH_IS_SEARCHABLE    \
-       assert(name)
-#endif
+#if defined(PERL_IN_PP_C) || defined(PERL_IN_UTF8_C)
+PERL_CALLCONV UV
+Perl__to_upper_title_latin1(pTHX_ const U8 c, U8 *p, STRLEN *lenp, const char S_or_s)
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT__TO_UPPER_TITLE_LATIN1 \
+        assert(p); assert(lenp)
 
-STATIC I32     S_run_user_filter(pTHX_ int idx, SV *buf_sv, int maxlen)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_RUN_USER_FILTER       \
-       assert(buf_sv)
-
-STATIC void    S_rxres_free(pTHX_ void** rsp);
-#define PERL_ARGS_ASSERT_RXRES_FREE    \
-       assert(rsp)
-STATIC void    S_rxres_restore(pTHX_ void **rsp, REGEXP *rx);
-#define PERL_ARGS_ASSERT_RXRES_RESTORE \
-       assert(rsp); assert(rx)
-STATIC void    S_save_lines(pTHX_ AV *array, SV *sv);
-#define PERL_ARGS_ASSERT_SAVE_LINES    \
-       assert(sv)
-#endif
-#if defined(PERL_IN_PP_HOT_C)
-STATIC void    S_do_oddball(pTHX_ SV **oddkey, SV **firstkey);
-#define PERL_ARGS_ASSERT_DO_ODDBALL    \
-       assert(oddkey); assert(firstkey)
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE HV* S_opmethod_stash(pTHX_ SV* meth);
-#define PERL_ARGS_ASSERT_OPMETHOD_STASH        \
-       assert(meth)
-#endif
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_FORCE_INLINE bool  S_should_we_output_Debug_r(pTHX_ regexp * prog)
-                       __attribute__warn_unused_result__
-                       __attribute__always_inline__;
-#define PERL_ARGS_ASSERT_SHOULD_WE_OUTPUT_DEBUG_R      \
-       assert(prog)
 #endif
+#if defined(PERL_IN_PP_CTL_C)
+STATIC PerlIO *
+S_check_type_and_open(pTHX_ SV *name)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_CHECK_TYPE_AND_OPEN   \
+        assert(name)
+
+STATIC void
+S_destroy_matcher(pTHX_ PMOP *matcher);
+# define PERL_ARGS_ASSERT_DESTROY_MATCHER       \
+        assert(matcher)
+
+STATIC OP *
+S_do_smartmatch(pTHX_ HV *seen_this, HV *seen_other, const bool copied);
+# define PERL_ARGS_ASSERT_DO_SMARTMATCH
+
+STATIC OP *
+S_docatch(pTHX_ Perl_ppaddr_t firstpp)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_DOCATCH
+
+STATIC bool
+S_doeval_compile(pTHX_ U8 gimme, CV *outside, U32 seq, HV *hh);
+# define PERL_ARGS_ASSERT_DOEVAL_COMPILE
+
+STATIC OP *
+S_dofindlabel(pTHX_ OP *o, const char *label, STRLEN len, U32 flags, OP **opstack, OP **oplimit)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_DOFINDLABEL           \
+        assert(o); assert(label); assert(opstack); assert(oplimit)
+
+STATIC MAGIC *
+S_doparseform(pTHX_ SV *sv);
+# define PERL_ARGS_ASSERT_DOPARSEFORM           \
+        assert(sv)
+
+STATIC I32
+S_dopoptoeval(pTHX_ I32 startingblock)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_DOPOPTOEVAL
+
+STATIC I32
+S_dopoptogivenfor(pTHX_ I32 startingblock)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_DOPOPTOGIVENFOR
+
+STATIC I32
+S_dopoptolabel(pTHX_ const char *label, STRLEN len, U32 flags)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_DOPOPTOLABEL          \
+        assert(label)
+
+STATIC I32
+S_dopoptoloop(pTHX_ I32 startingblock)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_DOPOPTOLOOP
+
+STATIC I32
+S_dopoptosub_at(pTHX_ const PERL_CONTEXT *cxstk, I32 startingblock)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_DOPOPTOSUB_AT         \
+        assert(cxstk)
+
+STATIC I32
+S_dopoptowhen(pTHX_ I32 startingblock)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_DOPOPTOWHEN
+
+STATIC PMOP *
+S_make_matcher(pTHX_ REGEXP *re)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_MAKE_MATCHER          \
+        assert(re)
+
+STATIC bool
+S_matcher_matches_sv(pTHX_ PMOP *matcher, SV *sv)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_MATCHER_MATCHES_SV    \
+        assert(matcher); assert(sv)
+
+STATIC bool
+S_num_overflow(NV value, I32 fldsize, I32 frcsize)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_NUM_OVERFLOW
+
+STATIC I32
+S_run_user_filter(pTHX_ int idx, SV *buf_sv, int maxlen)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_RUN_USER_FILTER       \
+        assert(buf_sv)
+
+STATIC void
+S_rxres_free(pTHX_ void **rsp);
+# define PERL_ARGS_ASSERT_RXRES_FREE            \
+        assert(rsp)
+
+STATIC void
+S_rxres_restore(pTHX_ void **rsp, REGEXP *rx);
+# define PERL_ARGS_ASSERT_RXRES_RESTORE         \
+        assert(rsp); assert(rx)
+
+STATIC void
+S_save_lines(pTHX_ AV *array, SV *sv);
+# define PERL_ARGS_ASSERT_SAVE_LINES            \
+        assert(sv)
+
+# if !defined(PERL_DISABLE_PMC)
+STATIC PerlIO *
+S_doopen_pm(pTHX_ SV *name)
+        __attribute__warn_unused_result__;
+#   define PERL_ARGS_ASSERT_DOOPEN_PM           \
+        assert(name)
+
+# endif
+# if !defined(PERL_NO_INLINE_FUNCTIONS)
+PERL_STATIC_INLINE bool
+S_path_is_searchable(const char *name)
+        __attribute__warn_unused_result__;
+#   define PERL_ARGS_ASSERT_PATH_IS_SEARCHABLE  \
+        assert(name)
+
+# endif
+#endif /* defined(PERL_IN_PP_CTL_C) */
+#if defined(PERL_IN_PP_CTL_C) || defined(PERL_IN_UTIL_C)
+PERL_CALLCONV bool
+Perl_invoke_exception_hook(pTHX_ SV *ex, bool warn)
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_INVOKE_EXCEPTION_HOOK
 
 #endif
+#if defined(PERL_IN_PP_HOT_C)
+STATIC void
+S_do_oddball(pTHX_ SV **oddkey, SV **firstkey);
+# define PERL_ARGS_ASSERT_DO_ODDBALL            \
+        assert(oddkey); assert(firstkey)
+
+# if !defined(PERL_NO_INLINE_FUNCTIONS)
+PERL_STATIC_INLINE HV *
+S_opmethod_stash(pTHX_ SV *meth);
+#   define PERL_ARGS_ASSERT_OPMETHOD_STASH      \
+        assert(meth)
+
+PERL_STATIC_FORCE_INLINE bool
+S_should_we_output_Debug_r(pTHX_ regexp *prog)
+        __attribute__warn_unused_result__
+        __attribute__always_inline__;
+#   define PERL_ARGS_ASSERT_SHOULD_WE_OUTPUT_DEBUG_R \
+        assert(prog)
+
+# endif /* !defined(PERL_NO_INLINE_FUNCTIONS) */
+#endif /* defined(PERL_IN_PP_HOT_C) */
 #if defined(PERL_IN_PP_PACK_C)
-STATIC int     S_div128(pTHX_ SV *pnum, bool *done);
-#define PERL_ARGS_ASSERT_DIV128        \
-       assert(pnum); assert(done)
-STATIC char    S_first_symbol(const char *pat, const char *patend);
-#define PERL_ARGS_ASSERT_FIRST_SYMBOL  \
-       assert(pat); assert(patend)
-STATIC const char *    S_get_num(pTHX_ const char *patptr, SSize_t *lenptr)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_GET_NUM       \
-       assert(patptr); assert(lenptr)
-
-STATIC const char *    S_group_end(pTHX_ const char *patptr, const char *patend, char ender);
-#define PERL_ARGS_ASSERT_GROUP_END     \
-       assert(patptr); assert(patend)
-STATIC SV*     S_is_an_int(pTHX_ const char *s, STRLEN l)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_IS_AN_INT     \
-       assert(s)
-
-STATIC SSize_t S_measure_struct(pTHX_ struct tempsym* symptr);
-#define PERL_ARGS_ASSERT_MEASURE_STRUCT        \
-       assert(symptr)
-STATIC SV*     S_mul128(pTHX_ SV *sv, U8 m);
-#define PERL_ARGS_ASSERT_MUL128        \
-       assert(sv)
-STATIC char *  S_my_bytes_to_utf8(const U8 *start, STRLEN len, char *dest, const bool needs_swap)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_MY_BYTES_TO_UTF8      \
-       assert(start); assert(dest)
-
-STATIC bool    S_need_utf8(const char *pat, const char *patend);
-#define PERL_ARGS_ASSERT_NEED_UTF8     \
-       assert(pat); assert(patend)
-STATIC bool    S_next_symbol(pTHX_ struct tempsym* symptr);
-#define PERL_ARGS_ASSERT_NEXT_SYMBOL   \
-       assert(symptr)
-STATIC SV **   S_pack_rec(pTHX_ SV *cat, struct tempsym* symptr, SV **beglist, SV **endlist);
-#define PERL_ARGS_ASSERT_PACK_REC      \
-       assert(cat); assert(symptr); assert(beglist); assert(endlist)
-STATIC char *  S_sv_exp_grow(pTHX_ SV *sv, STRLEN needed)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_SV_EXP_GROW   \
-       assert(sv)
-
-STATIC SSize_t S_unpack_rec(pTHX_ struct tempsym* symptr, const char *s, const char *strbeg, const char *strend, const char **new_s);
-#define PERL_ARGS_ASSERT_UNPACK_REC    \
-       assert(symptr); assert(s); assert(strbeg); assert(strend)
-#endif
+STATIC int
+S_div128(pTHX_ SV *pnum, bool *done);
+# define PERL_ARGS_ASSERT_DIV128                \
+        assert(pnum); assert(done)
+
+STATIC char
+S_first_symbol(const char *pat, const char *patend);
+# define PERL_ARGS_ASSERT_FIRST_SYMBOL          \
+        assert(pat); assert(patend)
+
+STATIC const char *
+S_get_num(pTHX_ const char *patptr, SSize_t *lenptr)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_GET_NUM               \
+        assert(patptr); assert(lenptr)
+
+STATIC const char *
+S_group_end(pTHX_ const char *patptr, const char *patend, char ender);
+# define PERL_ARGS_ASSERT_GROUP_END             \
+        assert(patptr); assert(patend)
+
+STATIC SV *
+S_is_an_int(pTHX_ const char *s, STRLEN l)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_IS_AN_INT             \
+        assert(s)
+
+STATIC SSize_t
+S_measure_struct(pTHX_ struct tempsym *symptr);
+# define PERL_ARGS_ASSERT_MEASURE_STRUCT        \
+        assert(symptr)
+
+STATIC SV *
+S_mul128(pTHX_ SV *sv, U8 m);
+# define PERL_ARGS_ASSERT_MUL128                \
+        assert(sv)
+
+STATIC char *
+S_my_bytes_to_utf8(const U8 *start, STRLEN len, char *dest, const bool needs_swap)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_MY_BYTES_TO_UTF8      \
+        assert(start); assert(dest)
+
+STATIC bool
+S_need_utf8(const char *pat, const char *patend);
+# define PERL_ARGS_ASSERT_NEED_UTF8             \
+        assert(pat); assert(patend)
+
+STATIC bool
+S_next_symbol(pTHX_ struct tempsym *symptr);
+# define PERL_ARGS_ASSERT_NEXT_SYMBOL           \
+        assert(symptr)
+
+STATIC SV **
+S_pack_rec(pTHX_ SV *cat, struct tempsym *symptr, SV **beglist, SV **endlist);
+# define PERL_ARGS_ASSERT_PACK_REC              \
+        assert(cat); assert(symptr); assert(beglist); assert(endlist)
+
+STATIC char *
+S_sv_exp_grow(pTHX_ SV *sv, STRLEN needed)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_SV_EXP_GROW           \
+        assert(sv)
+
+STATIC SSize_t
+S_unpack_rec(pTHX_ struct tempsym *symptr, const char *s, const char *strbeg, const char *strend, const char **new_s);
+# define PERL_ARGS_ASSERT_UNPACK_REC            \
+        assert(symptr); assert(s); assert(strbeg); assert(strend)
+
+#endif /* defined(PERL_IN_PP_PACK_C) */
 #if defined(PERL_IN_PP_SORT_C)
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE I32 S_amagic_cmp(pTHX_ SV *const str1, SV *const str2);
-#define PERL_ARGS_ASSERT_AMAGIC_CMP    \
-       assert(str1); assert(str2)
-#endif
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE I32 S_amagic_cmp_desc(pTHX_ SV *const str1, SV *const str2);
-#define PERL_ARGS_ASSERT_AMAGIC_CMP_DESC       \
-       assert(str1); assert(str2)
-#endif
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE I32 S_amagic_i_ncmp(pTHX_ SV *const a, SV *const b);
-#define PERL_ARGS_ASSERT_AMAGIC_I_NCMP \
-       assert(a); assert(b)
-#endif
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE I32 S_amagic_i_ncmp_desc(pTHX_ SV *const a, SV *const b);
-#define PERL_ARGS_ASSERT_AMAGIC_I_NCMP_DESC    \
-       assert(a); assert(b)
-#endif
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE I32 S_amagic_ncmp(pTHX_ SV *const a, SV *const b);
-#define PERL_ARGS_ASSERT_AMAGIC_NCMP   \
-       assert(a); assert(b)
-#endif
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE I32 S_amagic_ncmp_desc(pTHX_ SV *const a, SV *const b);
-#define PERL_ARGS_ASSERT_AMAGIC_NCMP_DESC      \
-       assert(a); assert(b)
-#endif
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE I32 S_cmp_desc(pTHX_ SV *const str1, SV *const str2);
-#define PERL_ARGS_ASSERT_CMP_DESC      \
-       assert(str1); assert(str2)
-#endif
-STATIC I32     S_sortcv(pTHX_ SV *const a, SV *const b);
-#define PERL_ARGS_ASSERT_SORTCV        \
-       assert(a); assert(b)
-STATIC I32     S_sortcv_stacked(pTHX_ SV *const a, SV *const b);
-#define PERL_ARGS_ASSERT_SORTCV_STACKED        \
-       assert(a); assert(b)
-STATIC I32     S_sortcv_xsub(pTHX_ SV *const a, SV *const b);
-#define PERL_ARGS_ASSERT_SORTCV_XSUB   \
-       assert(a); assert(b)
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_FORCE_INLINE void  S_sortsv_flags_impl(pTHX_ SV** array, size_t num_elts, SVCOMPARE_t cmp, U32 flags)
-                       __attribute__always_inline__;
-#define PERL_ARGS_ASSERT_SORTSV_FLAGS_IMPL     \
-       assert(cmp)
-#endif
-
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE I32 S_sv_i_ncmp(pTHX_ SV *const a, SV *const b);
-#define PERL_ARGS_ASSERT_SV_I_NCMP     \
-       assert(a); assert(b)
-#endif
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE I32 S_sv_i_ncmp_desc(pTHX_ SV *const a, SV *const b);
-#define PERL_ARGS_ASSERT_SV_I_NCMP_DESC        \
-       assert(a); assert(b)
-#endif
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE I32 S_sv_ncmp(pTHX_ SV *const a, SV *const b);
-#define PERL_ARGS_ASSERT_SV_NCMP       \
-       assert(a); assert(b)
-#endif
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE I32 S_sv_ncmp_desc(pTHX_ SV *const a, SV *const b);
-#define PERL_ARGS_ASSERT_SV_NCMP_DESC  \
-       assert(a); assert(b)
-#endif
-#  if defined(USE_LOCALE_COLLATE)
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE I32 S_amagic_cmp_locale(pTHX_ SV *const str1, SV *const str2);
-#define PERL_ARGS_ASSERT_AMAGIC_CMP_LOCALE     \
-       assert(str1); assert(str2)
-#endif
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE I32 S_amagic_cmp_locale_desc(pTHX_ SV *const str1, SV *const str2);
-#define PERL_ARGS_ASSERT_AMAGIC_CMP_LOCALE_DESC        \
-       assert(str1); assert(str2)
-#endif
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE I32 S_cmp_locale_desc(pTHX_ SV *const str1, SV *const str2);
-#define PERL_ARGS_ASSERT_CMP_LOCALE_DESC       \
-       assert(str1); assert(str2)
-#endif
-#  endif
-#endif
+STATIC I32
+S_sortcv(pTHX_ SV * const a, SV * const b);
+# define PERL_ARGS_ASSERT_SORTCV                \
+        assert(a); assert(b)
+
+STATIC I32
+S_sortcv_stacked(pTHX_ SV * const a, SV * const b);
+# define PERL_ARGS_ASSERT_SORTCV_STACKED        \
+        assert(a); assert(b)
+
+STATIC I32
+S_sortcv_xsub(pTHX_ SV * const a, SV * const b);
+# define PERL_ARGS_ASSERT_SORTCV_XSUB           \
+        assert(a); assert(b)
+
+# if !defined(PERL_NO_INLINE_FUNCTIONS)
+PERL_STATIC_INLINE I32
+S_amagic_cmp(pTHX_ SV * const str1, SV * const str2);
+#   define PERL_ARGS_ASSERT_AMAGIC_CMP          \
+        assert(str1); assert(str2)
+
+PERL_STATIC_INLINE I32
+S_amagic_cmp_desc(pTHX_ SV * const str1, SV * const str2);
+#   define PERL_ARGS_ASSERT_AMAGIC_CMP_DESC     \
+        assert(str1); assert(str2)
+
+PERL_STATIC_INLINE I32
+S_amagic_i_ncmp(pTHX_ SV * const a, SV * const b);
+#   define PERL_ARGS_ASSERT_AMAGIC_I_NCMP       \
+        assert(a); assert(b)
+
+PERL_STATIC_INLINE I32
+S_amagic_i_ncmp_desc(pTHX_ SV * const a, SV * const b);
+#   define PERL_ARGS_ASSERT_AMAGIC_I_NCMP_DESC  \
+        assert(a); assert(b)
+
+PERL_STATIC_INLINE I32
+S_amagic_ncmp(pTHX_ SV * const a, SV * const b);
+#   define PERL_ARGS_ASSERT_AMAGIC_NCMP         \
+        assert(a); assert(b)
+
+PERL_STATIC_INLINE I32
+S_amagic_ncmp_desc(pTHX_ SV * const a, SV * const b);
+#   define PERL_ARGS_ASSERT_AMAGIC_NCMP_DESC    \
+        assert(a); assert(b)
+
+PERL_STATIC_INLINE I32
+S_cmp_desc(pTHX_ SV * const str1, SV * const str2);
+#   define PERL_ARGS_ASSERT_CMP_DESC            \
+        assert(str1); assert(str2)
+
+PERL_STATIC_FORCE_INLINE void
+S_sortsv_flags_impl(pTHX_ SV **array, size_t num_elts, SVCOMPARE_t cmp, U32 flags)
+        __attribute__always_inline__;
+#   define PERL_ARGS_ASSERT_SORTSV_FLAGS_IMPL   \
+        assert(cmp)
+
+PERL_STATIC_INLINE I32
+S_sv_i_ncmp(pTHX_ SV * const a, SV * const b);
+#   define PERL_ARGS_ASSERT_SV_I_NCMP           \
+        assert(a); assert(b)
+
+PERL_STATIC_INLINE I32
+S_sv_i_ncmp_desc(pTHX_ SV * const a, SV * const b);
+#   define PERL_ARGS_ASSERT_SV_I_NCMP_DESC      \
+        assert(a); assert(b)
+
+PERL_STATIC_INLINE I32
+S_sv_ncmp(pTHX_ SV * const a, SV * const b);
+#   define PERL_ARGS_ASSERT_SV_NCMP             \
+        assert(a); assert(b)
+
+PERL_STATIC_INLINE I32
+S_sv_ncmp_desc(pTHX_ SV * const a, SV * const b);
+#   define PERL_ARGS_ASSERT_SV_NCMP_DESC        \
+        assert(a); assert(b)
+
+#   if defined(USE_LOCALE_COLLATE)
+PERL_STATIC_INLINE I32
+S_amagic_cmp_locale(pTHX_ SV * const str1, SV * const str2);
+#     define PERL_ARGS_ASSERT_AMAGIC_CMP_LOCALE \
+        assert(str1); assert(str2)
+
+PERL_STATIC_INLINE I32
+S_amagic_cmp_locale_desc(pTHX_ SV * const str1, SV * const str2);
+#     define PERL_ARGS_ASSERT_AMAGIC_CMP_LOCALE_DESC \
+        assert(str1); assert(str2)
+
+PERL_STATIC_INLINE I32
+S_cmp_locale_desc(pTHX_ SV * const str1, SV * const str2);
+#     define PERL_ARGS_ASSERT_CMP_LOCALE_DESC   \
+        assert(str1); assert(str2)
+
+#   endif /* defined(USE_LOCALE_COLLATE) */
+# endif /* !defined(PERL_NO_INLINE_FUNCTIONS) */
+#endif /* defined(PERL_IN_PP_SORT_C) */
 #if defined(PERL_IN_PP_SYS_C)
-STATIC OP*     S_doform(pTHX_ CV *cv, GV *gv, OP *retop);
-#define PERL_ARGS_ASSERT_DOFORM        \
-       assert(cv); assert(gv)
-STATIC SV *    S_space_join_names_mortal(pTHX_ char *const *array);
-#define PERL_ARGS_ASSERT_SPACE_JOIN_NAMES_MORTAL
-#endif
-#if defined(PERL_IN_REGCOMP_C)
-STATIC void    S_add_above_Latin1_folds(pTHX_ RExC_state_t *pRExC_state, const U8 cp, SV** invlist);
-#define PERL_ARGS_ASSERT_ADD_ABOVE_LATIN1_FOLDS        \
-       assert(pRExC_state); assert(invlist)
-STATIC U32     S_add_data(RExC_state_t* const pRExC_state, const char* const s, const U32 n)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_ADD_DATA      \
-       assert(pRExC_state); assert(s)
-
-STATIC AV*     S_add_multi_match(pTHX_ AV* multi_char_matches, SV* multi_string, const STRLEN cp_count);
-#define PERL_ARGS_ASSERT_ADD_MULTI_MATCH       \
-       assert(multi_string)
-STATIC void    S_change_engine_size(pTHX_ RExC_state_t *pRExC_state, const Ptrdiff_t size);
-#define PERL_ARGS_ASSERT_CHANGE_ENGINE_SIZE    \
-       assert(pRExC_state)
-STATIC REGEXP* S_compile_wildcard(pTHX_ const char * subpattern, const STRLEN len, const bool ignore_case)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_COMPILE_WILDCARD      \
-       assert(subpattern)
-
-STATIC U8      S_compute_EXACTish(RExC_state_t *pRExC_state);
-#define PERL_ARGS_ASSERT_COMPUTE_EXACTISH      \
-       assert(pRExC_state)
-STATIC regnode *       S_construct_ahocorasick_from_trie(pTHX_ RExC_state_t *pRExC_state, regnode *source, U32 depth);
-#define PERL_ARGS_ASSERT_CONSTRUCT_AHOCORASICK_FROM_TRIE       \
-       assert(pRExC_state); assert(source)
-STATIC int     S_edit_distance(const UV *src, const UV *tgt, const STRLEN x, const STRLEN y, const SSize_t maxDistance)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_EDIT_DISTANCE \
-       assert(src); assert(tgt)
-
-STATIC I32     S_execute_wildcard(pTHX_ REGEXP * const prog, char* stringarg, char* strend, char* strbeg, SSize_t minend, SV* screamer, U32 nosave);
-#define PERL_ARGS_ASSERT_EXECUTE_WILDCARD      \
-       assert(prog); assert(stringarg); assert(strend); assert(strbeg); assert(screamer)
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE Size_t      S_find_first_differing_byte_pos(const U8 * s1, const U8 * s2, const Size_t max);
-#define PERL_ARGS_ASSERT_FIND_FIRST_DIFFERING_BYTE_POS \
-       assert(s1); assert(s2)
-#endif
-STATIC SV *    S_get_ANYOFM_contents(pTHX_ const regnode * n)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_GET_ANYOFM_CONTENTS   \
-       assert(n)
-
-STATIC SV*     S_get_ANYOF_cp_list_for_ssc(pTHX_ const RExC_state_t *pRExC_state, const regnode_charclass* const node);
-#define PERL_ARGS_ASSERT_GET_ANYOF_CP_LIST_FOR_SSC     \
-       assert(pRExC_state); assert(node)
-STATIC U32     S_get_quantifier_value(pTHX_ RExC_state_t *pRExC_state, const char * start, const char * end);
-#define PERL_ARGS_ASSERT_GET_QUANTIFIER_VALUE  \
-       assert(pRExC_state); assert(start); assert(end)
-STATIC bool    S_grok_bslash_N(pTHX_ RExC_state_t *pRExC_state, regnode_offset* nodep, UV *code_point_p, int* cp_count, I32 *flagp, const bool strict, const U32 depth);
-#define PERL_ARGS_ASSERT_GROK_BSLASH_N \
-       assert(pRExC_state); assert(flagp)
-STATIC regnode_offset  S_handle_named_backref(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, char * backref_parse_start, char ch);
-#define PERL_ARGS_ASSERT_HANDLE_NAMED_BACKREF  \
-       assert(pRExC_state); assert(flagp); assert(backref_parse_start)
-STATIC bool    S_handle_names_wildcard(pTHX_ const char * wname, const STRLEN wname_len, SV ** prop_definition, AV ** strings);
-#define PERL_ARGS_ASSERT_HANDLE_NAMES_WILDCARD \
-       assert(wname); assert(prop_definition); assert(strings)
-STATIC int     S_handle_possible_posix(pTHX_ RExC_state_t *pRExC_state, const char* const s, char ** updated_parse_ptr, AV** posix_warnings, const bool check_only);
-#define PERL_ARGS_ASSERT_HANDLE_POSSIBLE_POSIX \
-       assert(pRExC_state); assert(s)
-STATIC regnode_offset  S_handle_regex_sets(pTHX_ RExC_state_t *pRExC_state, SV ** return_invlist, I32 *flagp, U32 depth);
-#define PERL_ARGS_ASSERT_HANDLE_REGEX_SETS     \
-       assert(pRExC_state); assert(flagp)
-STATIC SV *    S_handle_user_defined_property(pTHX_ const char * name, const STRLEN name_len, const bool is_utf8, const bool to_fold, const bool runtime, const bool deferrable, SV* contents, bool *user_defined_ptr, SV * msg, const STRLEN level);
-#define PERL_ARGS_ASSERT_HANDLE_USER_DEFINED_PROPERTY  \
-       assert(name); assert(contents); assert(user_defined_ptr); assert(msg)
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE SV* S_invlist_contents(pTHX_ SV* const invlist, const bool traditional_style)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_INVLIST_CONTENTS      \
-       assert(invlist)
-#endif
-
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE bool        S_invlist_is_iterating(const SV* const invlist)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_INVLIST_IS_ITERATING  \
-       assert(invlist)
-#endif
-
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE UV  S_invlist_lowest(SV* const invlist)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_INVLIST_LOWEST        \
-       assert(invlist)
-#endif
-
-STATIC bool    S_is_ssc_worth_it(const RExC_state_t * pRExC_state, const regnode_ssc * ssc);
-#define PERL_ARGS_ASSERT_IS_SSC_WORTH_IT       \
-       assert(pRExC_state); assert(ssc)
-STATIC U32     S_join_exact(pTHX_ RExC_state_t *pRExC_state, regnode *scan, UV *min_subtract, bool *unfolded_multi_char, U32 flags, regnode *val, U32 depth);
-#define PERL_ARGS_ASSERT_JOIN_EXACT    \
-       assert(pRExC_state); assert(scan); assert(min_subtract); assert(unfolded_multi_char)
-STATIC SV*     S_make_exactf_invlist(pTHX_ RExC_state_t *pRExC_state, regnode *node)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_MAKE_EXACTF_INVLIST   \
-       assert(pRExC_state); assert(node)
-
-STATIC I32     S_make_trie(pTHX_ RExC_state_t *pRExC_state, regnode *startbranch, regnode *first, regnode *last, regnode *tail, U32 word_count, U32 flags, U32 depth);
-#define PERL_ARGS_ASSERT_MAKE_TRIE     \
-       assert(pRExC_state); assert(startbranch); assert(first); assert(last); assert(tail)
-STATIC void    S_nextchar(pTHX_ RExC_state_t *pRExC_state);
-#define PERL_ARGS_ASSERT_NEXTCHAR      \
-       assert(pRExC_state)
-STATIC U8      S_optimize_regclass(pTHX_ RExC_state_t *pRExC_state, SV* cp_list, SV* only_utf8_locale_list, SV* upper_latin1_only_utf8_matches, const U32 has_runtime_dependency, const U32 posixl, U8 * anyof_flags, bool * invert, regnode_offset * ret, I32 *flagp);
-#define PERL_ARGS_ASSERT_OPTIMIZE_REGCLASS     \
-       assert(pRExC_state); assert(anyof_flags); assert(invert); assert(ret); assert(flagp)
-STATIC void    S_output_posix_warnings(pTHX_ RExC_state_t *pRExC_state, AV* posix_warnings);
-#define PERL_ARGS_ASSERT_OUTPUT_POSIX_WARNINGS \
-       assert(pRExC_state); assert(posix_warnings)
-STATIC void    S_parse_lparen_question_flags(pTHX_ RExC_state_t *pRExC_state);
-#define PERL_ARGS_ASSERT_PARSE_LPAREN_QUESTION_FLAGS   \
-       assert(pRExC_state)
-STATIC SV *    S_parse_uniprop_string(pTHX_ const char * const name, Size_t name_len, const bool is_utf8, const bool to_fold, const bool runtime, const bool deferrable, AV ** strings, bool * user_defined_ptr, SV * msg, const STRLEN level);
-#define PERL_ARGS_ASSERT_PARSE_UNIPROP_STRING  \
-       assert(name); assert(user_defined_ptr); assert(msg)
-STATIC void    S_populate_ANYOF_from_invlist(pTHX_ regnode *node, SV** invlist_ptr);
-#define PERL_ARGS_ASSERT_POPULATE_ANYOF_FROM_INVLIST   \
-       assert(node); assert(invlist_ptr)
-STATIC void    S_rck_elide_nothing(pTHX_ regnode *node);
-#define PERL_ARGS_ASSERT_RCK_ELIDE_NOTHING     \
-       assert(node)
-PERL_STATIC_NO_RET void        S_re_croak(pTHX_ bool utf8, const char* pat, ...)
-                       __attribute__noreturn__
-                       __attribute__format__(__printf__,pTHX_2,pTHX_3);
-#define PERL_ARGS_ASSERT_RE_CROAK      \
-       assert(pat)
-
-STATIC regnode_offset  S_reg(pTHX_ RExC_state_t *pRExC_state, I32 paren, I32 *flagp, U32 depth);
-#define PERL_ARGS_ASSERT_REG   \
-       assert(pRExC_state); assert(flagp)
-STATIC regnode_offset  S_reg2Lanode(pTHX_ RExC_state_t *pRExC_state, const U8 op, const U32 arg1, const I32 arg2);
-#define PERL_ARGS_ASSERT_REG2LANODE    \
-       assert(pRExC_state)
-STATIC regnode_offset  S_reg_la_NOTHING(pTHX_ RExC_state_t *pRExC_state, U32 flags, const char *type);
-#define PERL_ARGS_ASSERT_REG_LA_NOTHING        \
-       assert(pRExC_state); assert(type)
-STATIC regnode_offset  S_reg_la_OPFAIL(pTHX_ RExC_state_t *pRExC_state, U32 flags, const char *type);
-#define PERL_ARGS_ASSERT_REG_LA_OPFAIL \
-       assert(pRExC_state); assert(type)
-STATIC regnode_offset  S_reg_node(pTHX_ RExC_state_t *pRExC_state, U8 op);
-#define PERL_ARGS_ASSERT_REG_NODE      \
-       assert(pRExC_state)
-STATIC SV *    S_reg_scan_name(pTHX_ RExC_state_t *pRExC_state, U32 flags);
-#define PERL_ARGS_ASSERT_REG_SCAN_NAME \
-       assert(pRExC_state)
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE char *      S_reg_skipcomment(RExC_state_t *pRExC_state, char * p);
-#define PERL_ARGS_ASSERT_REG_SKIPCOMMENT       \
-       assert(pRExC_state); assert(p)
-#endif
-STATIC regnode_offset  S_reganode(pTHX_ RExC_state_t *pRExC_state, U8 op, U32 arg);
-#define PERL_ARGS_ASSERT_REGANODE      \
-       assert(pRExC_state)
-STATIC regnode_offset  S_regatom(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth);
-#define PERL_ARGS_ASSERT_REGATOM       \
-       assert(pRExC_state); assert(flagp)
-STATIC regnode_offset  S_regbranch(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, I32 first, U32 depth);
-#define PERL_ARGS_ASSERT_REGBRANCH     \
-       assert(pRExC_state); assert(flagp)
-STATIC regnode_offset  S_regclass(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth, const bool stop_at_1, bool allow_multi_fold, const bool silence_non_portable, const bool strict, bool optimizable, SV** ret_invlist);
-#define PERL_ARGS_ASSERT_REGCLASS      \
-       assert(pRExC_state); assert(flagp)
-STATIC unsigned int    S_regex_set_precedence(const U8 my_operator)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_REGEX_SET_PRECEDENCE
-
-STATIC void    S_reginsert(pTHX_ RExC_state_t *pRExC_state, const U8 op, const regnode_offset operand, const U32 depth);
-#define PERL_ARGS_ASSERT_REGINSERT     \
-       assert(pRExC_state)
-STATIC regnode_offset  S_regnode_guts(pTHX_ RExC_state_t *pRExC_state, const STRLEN extra_len);
-#define PERL_ARGS_ASSERT_REGNODE_GUTS  \
-       assert(pRExC_state)
-STATIC regnode_offset  S_regpiece(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth);
-#define PERL_ARGS_ASSERT_REGPIECE      \
-       assert(pRExC_state); assert(flagp)
-STATIC regnode_offset  S_regpnode(pTHX_ RExC_state_t *pRExC_state, U8 op, SV * arg);
-#define PERL_ARGS_ASSERT_REGPNODE      \
-       assert(pRExC_state); assert(arg)
-STATIC bool    S_regtail(pTHX_ RExC_state_t * pRExC_state, const regnode_offset p, const regnode_offset val, const U32 depth)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_REGTAIL       \
-       assert(pRExC_state); assert(p); assert(val)
-
-STATIC void    S_scan_commit(pTHX_ const RExC_state_t *pRExC_state, struct scan_data_t *data, SSize_t *minlenp, int is_inf);
-#define PERL_ARGS_ASSERT_SCAN_COMMIT   \
-       assert(pRExC_state); assert(data); assert(minlenp)
-STATIC void    S_set_ANYOF_arg(pTHX_ RExC_state_t* const pRExC_state, regnode* const node, SV* const cp_list, SV* const runtime_defns, SV* const only_utf8_locale_list);
-#define PERL_ARGS_ASSERT_SET_ANYOF_ARG \
-       assert(pRExC_state); assert(node)
-STATIC void    S_set_regex_pv(pTHX_ RExC_state_t *pRExC_state, REGEXP *Rx);
-#define PERL_ARGS_ASSERT_SET_REGEX_PV  \
-       assert(pRExC_state); assert(Rx)
-STATIC void    S_skip_to_be_ignored_text(pTHX_ RExC_state_t *pRExC_state, char ** p, const bool force_to_xmod);
-#define PERL_ARGS_ASSERT_SKIP_TO_BE_IGNORED_TEXT       \
-       assert(pRExC_state); assert(p)
-STATIC void    S_ssc_add_range(pTHX_ regnode_ssc *ssc, UV const start, UV const end);
-#define PERL_ARGS_ASSERT_SSC_ADD_RANGE \
-       assert(ssc)
-STATIC void    S_ssc_and(pTHX_ const RExC_state_t *pRExC_state, regnode_ssc *ssc, const regnode_charclass *and_with);
-#define PERL_ARGS_ASSERT_SSC_AND       \
-       assert(pRExC_state); assert(ssc); assert(and_with)
-STATIC void    S_ssc_anything(pTHX_ regnode_ssc *ssc);
-#define PERL_ARGS_ASSERT_SSC_ANYTHING  \
-       assert(ssc)
-STATIC void    S_ssc_clear_locale(regnode_ssc *ssc);
-#define PERL_ARGS_ASSERT_SSC_CLEAR_LOCALE      \
-       assert(ssc)
-STATIC void    S_ssc_cp_and(pTHX_ regnode_ssc *ssc, UV const cp);
-#define PERL_ARGS_ASSERT_SSC_CP_AND    \
-       assert(ssc)
-STATIC void    S_ssc_finalize(pTHX_ RExC_state_t *pRExC_state, regnode_ssc *ssc);
-#define PERL_ARGS_ASSERT_SSC_FINALIZE  \
-       assert(pRExC_state); assert(ssc)
-STATIC void    S_ssc_init(pTHX_ const RExC_state_t *pRExC_state, regnode_ssc *ssc);
-#define PERL_ARGS_ASSERT_SSC_INIT      \
-       assert(pRExC_state); assert(ssc)
-STATIC void    S_ssc_intersection(pTHX_ regnode_ssc *ssc, SV* const invlist, const bool invert_2nd);
-#define PERL_ARGS_ASSERT_SSC_INTERSECTION      \
-       assert(ssc); assert(invlist)
-STATIC int     S_ssc_is_anything(const regnode_ssc *ssc)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_SSC_IS_ANYTHING       \
-       assert(ssc)
-
-STATIC int     S_ssc_is_cp_posixl_init(const RExC_state_t *pRExC_state, const regnode_ssc *ssc)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_SSC_IS_CP_POSIXL_INIT \
-       assert(pRExC_state); assert(ssc)
-
-STATIC void    S_ssc_or(pTHX_ const RExC_state_t *pRExC_state, regnode_ssc *ssc, const regnode_charclass *or_with);
-#define PERL_ARGS_ASSERT_SSC_OR        \
-       assert(pRExC_state); assert(ssc); assert(or_with)
-STATIC void    S_ssc_union(pTHX_ regnode_ssc *ssc, SV* const invlist, const bool invert_2nd);
-#define PERL_ARGS_ASSERT_SSC_UNION     \
-       assert(ssc); assert(invlist)
-STATIC SSize_t S_study_chunk(pTHX_ RExC_state_t *pRExC_state, regnode **scanp, SSize_t *minlenp, SSize_t *deltap, regnode *last, struct scan_data_t *data, I32 stopparen, U32 recursed_depth, regnode_ssc *and_withp, U32 flags, U32 depth, bool was_mutate_ok);
-#define PERL_ARGS_ASSERT_STUDY_CHUNK   \
-       assert(pRExC_state); assert(scanp); assert(minlenp); assert(deltap); assert(last)
-#endif
-#if defined(PERL_IN_REGCOMP_C) || defined (PERL_IN_DUMP_C) || defined(PERL_IN_OP_C)
-PERL_CALLCONV void     Perl__invlist_dump(pTHX_ PerlIO *file, I32 level, const char* const indent, SV* const invlist);
-#define PERL_ARGS_ASSERT__INVLIST_DUMP \
-       assert(file); assert(indent); assert(invlist)
-#endif
-#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_DOOP_C) || defined(PERL_IN_OP_C)
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE SV* S_add_cp_to_invlist(pTHX_ SV* invlist, const UV cp)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_ADD_CP_TO_INVLIST
-#endif
-
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE void        S_invlist_extend(pTHX_ SV* const invlist, const UV len);
-#define PERL_ARGS_ASSERT_INVLIST_EXTEND        \
-       assert(invlist)
-#endif
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE UV  S_invlist_highest(SV* const invlist)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_INVLIST_HIGHEST       \
-       assert(invlist)
-#endif
-
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE void        S_invlist_set_len(pTHX_ SV* const invlist, const UV len, const bool offset);
-#define PERL_ARGS_ASSERT_INVLIST_SET_LEN       \
-       assert(invlist)
-#endif
-#endif
-#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_DOOP_C) || defined(PERL_IN_OP_C) || defined(PERL_IN_UTF8_C)
-PERL_CALLCONV SV*      Perl__add_range_to_invlist(pTHX_ SV* invlist, UV start, UV end)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT__ADD_RANGE_TO_INVLIST
-
-/* PERL_CALLCONV void  _invlist_intersection(pTHX_ SV* const a, SV* const b, SV** i); */
-#define PERL_ARGS_ASSERT__INVLIST_INTERSECTION
-PERL_CALLCONV void     Perl__invlist_intersection_maybe_complement_2nd(pTHX_ SV* const a, SV* const b, const bool complement_b, SV** i);
-#define PERL_ARGS_ASSERT__INVLIST_INTERSECTION_MAYBE_COMPLEMENT_2ND    \
-       assert(b); assert(i)
-PERL_CALLCONV void     Perl__invlist_invert(pTHX_ SV* const invlist);
-#define PERL_ARGS_ASSERT__INVLIST_INVERT       \
-       assert(invlist)
-/* PERL_CALLCONV void  _invlist_subtract(pTHX_ SV* const a, SV* const b, SV** result); */
-#define PERL_ARGS_ASSERT__INVLIST_SUBTRACT
-/* PERL_CALLCONV void  _invlist_union(pTHX_ SV* const a, SV* const b, SV** output); */
-#define PERL_ARGS_ASSERT__INVLIST_UNION
-PERL_CALLCONV void     Perl__invlist_union_maybe_complement_2nd(pTHX_ SV* const a, SV* const b, const bool complement_b, SV** output);
-#define PERL_ARGS_ASSERT__INVLIST_UNION_MAYBE_COMPLEMENT_2ND   \
-       assert(b); assert(output)
-PERL_CALLCONV SV*      Perl__new_invlist(pTHX_ IV initial_size)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT__NEW_INVLIST
-
-PERL_CALLCONV SV*      Perl__setup_canned_invlist(pTHX_ const STRLEN size, const UV element0, UV** other_elements_ptr)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT__SETUP_CANNED_INVLIST \
-       assert(other_elements_ptr)
-
-#endif
-#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_DQUOTE_C) || defined(PERL_IN_TOKE_C)
-PERL_CALLCONV const char *     Perl_form_alien_digit_msg(pTHX_ const U8 which, const STRLEN valids_len, const char * const first_bad, const char * const send, const bool UTF, const bool braced)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_FORM_ALIEN_DIGIT_MSG  \
-       assert(first_bad); assert(send)
-
-PERL_CALLCONV bool     Perl_grok_bslash_c(pTHX_ const char source, U8 * result, const char** message, U32 * packed_warn)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_GROK_BSLASH_C \
-       assert(result); assert(message)
-
-PERL_CALLCONV bool     Perl_grok_bslash_o(pTHX_ char** s, const char* const send, UV* uv, const char** message, U32 * packed_warn, const bool strict, const bool allow_UV_MAX, const bool utf8)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_GROK_BSLASH_O \
-       assert(s); assert(send); assert(uv); assert(message)
-
-PERL_CALLCONV bool     Perl_grok_bslash_x(pTHX_ char** s, const char* const send, UV* uv, const char** message, U32 * packed_warn, const bool strict, const bool allow_UV_MAX, const bool utf8)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_GROK_BSLASH_X \
-       assert(s); assert(send); assert(uv); assert(message)
-
-#endif
-#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_DQUOTE_C) || defined(PERL_IN_TOKE_C) || defined(PERL_IN_UTF8_C)
-PERL_CALLCONV const char *     Perl_form_cp_too_large_msg(pTHX_ const U8 which, const char * string, const Size_t len, const UV cp)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_FORM_CP_TOO_LARGE_MSG
-
-#endif
-#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_OP_C)
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE STRLEN*     S_get_invlist_iter_addr(SV* invlist)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_GET_INVLIST_ITER_ADDR \
-       assert(invlist)
-#endif
-
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE void        S_invlist_iterfinish(SV* invlist);
-#define PERL_ARGS_ASSERT_INVLIST_ITERFINISH    \
-       assert(invlist)
-#endif
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE void        S_invlist_iterinit(SV* invlist);
-#define PERL_ARGS_ASSERT_INVLIST_ITERINIT      \
-       assert(invlist)
-#endif
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE bool        S_invlist_iternext(SV* invlist, UV* start, UV* end)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_INVLIST_ITERNEXT      \
-       assert(invlist); assert(start); assert(end)
-#endif
-
-#endif
-#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_PERL_C) || defined(PERL_IN_UTF8_C)
-PERL_CALLCONV bool     Perl__invlistEQ(pTHX_ SV* const a, SV* const b, const bool complement_b);
-#define PERL_ARGS_ASSERT__INVLISTEQ    \
-       assert(a); assert(b)
-PERL_CALLCONV SV*      Perl__new_invlist_C_array(pTHX_ const UV* const list)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT__NEW_INVLIST_C_ARRAY  \
-       assert(list)
-
-#endif
-#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_PP_C) || defined(PERL_IN_TOKE_C) || defined(PERL_IN_UNIVERSAL_C)
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE const char *        S_get_regex_charset_name(const U32 flags, STRLEN* const lenp);
-#define PERL_ARGS_ASSERT_GET_REGEX_CHARSET_NAME        \
-       assert(lenp)
-#endif
-#endif
-#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C)
-PERL_CALLCONV int      Perl_re_printf(pTHX_ const char *fmt, ...)
-                       __attribute__format__(__printf__,pTHX_1,pTHX_2);
-#define PERL_ARGS_ASSERT_RE_PRINTF     \
-       assert(fmt)
-
-PERL_CALLCONV void     Perl_regprop(pTHX_ const regexp *prog, SV* sv, const regnode* o, const regmatch_info *reginfo, const RExC_state_t *pRExC_state);
-#define PERL_ARGS_ASSERT_REGPROP       \
-       assert(sv); assert(o)
-#endif
-#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C)    || defined(PERL_IN_PP_C) || defined(PERL_IN_OP_C)               || defined(PERL_IN_TOKE_C) || defined(PERL_IN_UTF8_C)           || defined(PERL_IN_DOOP_C)
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE bool        S__invlist_contains_cp(SV* const invlist, const UV cp)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT__INVLIST_CONTAINS_CP  \
-       assert(invlist)
-#endif
-
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE UV  S__invlist_len(SV* const invlist)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT__INVLIST_LEN  \
-       assert(invlist)
-#endif
-
-PERL_CALLCONV SSize_t  Perl__invlist_search(SV* const invlist, const UV cp)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT__INVLIST_SEARCH       \
-       assert(invlist)
-
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE bool*       S_get_invlist_offset_addr(SV* invlist)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_GET_INVLIST_OFFSET_ADDR       \
-       assert(invlist)
-#endif
+STATIC OP *
+S_doform(pTHX_ CV *cv, GV *gv, OP *retop);
+# define PERL_ARGS_ASSERT_DOFORM                \
+        assert(cv); assert(gv)
+
+STATIC SV *
+S_space_join_names_mortal(pTHX_ char * const *array);
+# define PERL_ARGS_ASSERT_SPACE_JOIN_NAMES_MORTAL
+
+# if !defined(HAS_MKDIR) || !defined(HAS_RMDIR)
+STATIC int
+S_dooneliner(pTHX_ const char *cmd, const char *filename)
+        __attribute__warn_unused_result__;
+#   define PERL_ARGS_ASSERT_DOONELINER          \
+        assert(cmd); assert(filename)
+
+# endif
+#endif /* defined(PERL_IN_PP_SYS_C) */
+#if defined(PERL_IN_REGCOMP_ANY)
+PERL_CALLCONV void
+Perl_add_above_Latin1_folds(pTHX_ RExC_state_t *pRExC_state, const U8 cp, SV **invlist)
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_ADD_ABOVE_LATIN1_FOLDS \
+        assert(pRExC_state); assert(invlist)
+
+PERL_CALLCONV regnode *
+Perl_construct_ahocorasick_from_trie(pTHX_ RExC_state_t *pRExC_state, regnode *source, U32 depth)
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_CONSTRUCT_AHOCORASICK_FROM_TRIE \
+        assert(pRExC_state); assert(source)
+
+PERL_CALLCONV SV *
+Perl_get_ANYOFHbbm_contents(pTHX_ const regnode *n)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_GET_ANYOFHBBM_CONTENTS \
+        assert(n)
+
+PERL_CALLCONV SV *
+Perl_get_ANYOFM_contents(pTHX_ const regnode *n)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_GET_ANYOFM_CONTENTS   \
+        assert(n)
+
+PERL_CALLCONV bool
+Perl_is_ssc_worth_it(const RExC_state_t *pRExC_state, const regnode_ssc *ssc)
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_IS_SSC_WORTH_IT       \
+        assert(pRExC_state); assert(ssc)
+
+PERL_CALLCONV U32
+Perl_join_exact(pTHX_ RExC_state_t *pRExC_state, regnode *scan, UV *min_subtract, bool *unfolded_multi_char, U32 flags, regnode *val, U32 depth)
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_JOIN_EXACT            \
+        assert(pRExC_state); assert(scan); assert(min_subtract); assert(unfolded_multi_char)
+
+PERL_CALLCONV I32
+Perl_make_trie(pTHX_ RExC_state_t *pRExC_state, regnode *startbranch, regnode *first, regnode *last, regnode *tail, U32 word_count, U32 flags, U32 depth)
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_MAKE_TRIE             \
+        assert(pRExC_state); assert(startbranch); assert(first); assert(last); \
+        assert(tail)
+
+PERL_CALLCONV void
+Perl_populate_anyof_bitmap_from_invlist(pTHX_ regnode *node, SV **invlist_ptr)
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_POPULATE_ANYOF_BITMAP_FROM_INVLIST \
+        assert(node); assert(invlist_ptr)
+
+PERL_CALLCONV U32
+Perl_reg_add_data(RExC_state_t * const pRExC_state, const char * const s, const U32 n)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_REG_ADD_DATA          \
+        assert(pRExC_state); assert(s)
+
+PERL_CALLCONV void
+Perl_scan_commit(pTHX_ const RExC_state_t *pRExC_state, struct scan_data_t *data, SSize_t *minlenp, int is_inf)
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_SCAN_COMMIT           \
+        assert(pRExC_state); assert(data); assert(minlenp)
+
+PERL_CALLCONV void
+Perl_set_ANYOF_arg(pTHX_ RExC_state_t * const pRExC_state, regnode * const node, SV * const cp_list, SV * const runtime_defns, SV * const only_utf8_locale_list)
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_SET_ANYOF_ARG         \
+        assert(pRExC_state); assert(node)
+
+PERL_CALLCONV void
+Perl_ssc_finalize(pTHX_ RExC_state_t *pRExC_state, regnode_ssc *ssc)
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_SSC_FINALIZE          \
+        assert(pRExC_state); assert(ssc)
+
+PERL_CALLCONV void
+Perl_ssc_init(pTHX_ const RExC_state_t *pRExC_state, regnode_ssc *ssc)
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_SSC_INIT              \
+        assert(pRExC_state); assert(ssc)
+
+PERL_CALLCONV SSize_t
+Perl_study_chunk(pTHX_ RExC_state_t *pRExC_state, regnode **scanp, SSize_t *minlenp, SSize_t *deltap, regnode *last, struct scan_data_t *data, I32 stopparen, U32 recursed_depth, regnode_ssc *and_withp, U32 flags, U32 depth, bool was_mutate_ok)
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_STUDY_CHUNK           \
+        assert(pRExC_state); assert(scanp); assert(minlenp); assert(deltap); \
+        assert(last)
+
+# if defined(PERL_IN_REGCOMP_TRIE_C) && defined(DEBUGGING)
+STATIC void
+S_dump_trie(pTHX_ const struct _reg_trie_data *trie, HV *widecharmap, AV *revcharmap, U32 depth);
+#   define PERL_ARGS_ASSERT_DUMP_TRIE           \
+        assert(trie); assert(revcharmap)
+
+STATIC void
+S_dump_trie_interim_list(pTHX_ const struct _reg_trie_data *trie, HV *widecharmap, AV *revcharmap, U32 next_alloc, U32 depth);
+#   define PERL_ARGS_ASSERT_DUMP_TRIE_INTERIM_LIST \
+        assert(trie); assert(revcharmap)
+
+STATIC void
+S_dump_trie_interim_table(pTHX_ const struct _reg_trie_data *trie, HV *widecharmap, AV *revcharmap, U32 next_alloc, U32 depth);
+#   define PERL_ARGS_ASSERT_DUMP_TRIE_INTERIM_TABLE \
+        assert(trie); assert(revcharmap)
+
+# endif /* defined(PERL_IN_REGCOMP_TRIE_C) && defined(DEBUGGING) */
+# if !defined(PERL_NO_INLINE_FUNCTIONS)
+PERL_STATIC_INLINE SV *
+S_invlist_contents(pTHX_ SV * const invlist, const bool traditional_style)
+        __attribute__warn_unused_result__;
+#   define PERL_ARGS_ASSERT_INVLIST_CONTENTS    \
+        assert(invlist)
+
+PERL_STATIC_INLINE UV
+S_invlist_highest_range_start(SV * const invlist)
+        __attribute__warn_unused_result__;
+#   define PERL_ARGS_ASSERT_INVLIST_HIGHEST_RANGE_START \
+        assert(invlist)
+
+PERL_STATIC_INLINE bool
+S_invlist_is_iterating(const SV * const invlist)
+        __attribute__warn_unused_result__;
+#   define PERL_ARGS_ASSERT_INVLIST_IS_ITERATING \
+        assert(invlist)
+
+PERL_STATIC_INLINE UV
+S_invlist_lowest(SV * const invlist)
+        __attribute__warn_unused_result__;
+#   define PERL_ARGS_ASSERT_INVLIST_LOWEST      \
+        assert(invlist)
+
+# endif /* !defined(PERL_NO_INLINE_FUNCTIONS) */
+#endif /* defined(PERL_IN_REGCOMP_ANY) */
+#if defined(PERL_IN_REGCOMP_ANY) || defined(PERL_IN_SV_C)
+PERL_CALLCONV SV *
+Perl_invlist_clone(pTHX_ SV * const invlist, SV *newlist);
+# define PERL_ARGS_ASSERT_INVLIST_CLONE         \
+        assert(invlist)
 
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE UV* S_invlist_array(SV* const invlist)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_INVLIST_ARRAY \
-       assert(invlist)
 #endif
+#if defined(PERL_IN_REGCOMP_C)
+STATIC AV *
+S_add_multi_match(pTHX_ AV *multi_char_matches, SV *multi_string, const STRLEN cp_count);
+# define PERL_ARGS_ASSERT_ADD_MULTI_MATCH       \
+        assert(multi_string)
+
+STATIC void
+S_change_engine_size(pTHX_ RExC_state_t *pRExC_state, const Ptrdiff_t size);
+# define PERL_ARGS_ASSERT_CHANGE_ENGINE_SIZE    \
+        assert(pRExC_state)
+
+STATIC REGEXP *
+S_compile_wildcard(pTHX_ const char *subpattern, const STRLEN len, const bool ignore_case)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_COMPILE_WILDCARD      \
+        assert(subpattern)
+
+STATIC U8
+S_compute_EXACTish(RExC_state_t *pRExC_state);
+# define PERL_ARGS_ASSERT_COMPUTE_EXACTISH      \
+        assert(pRExC_state)
+
+STATIC int
+S_edit_distance(const UV *src, const UV *tgt, const STRLEN x, const STRLEN y, const SSize_t maxDistance)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_EDIT_DISTANCE         \
+        assert(src); assert(tgt)
+
+STATIC I32
+S_execute_wildcard(pTHX_ REGEXP * const prog, char *stringarg, char *strend, char *strbeg, SSize_t minend, SV *screamer, U32 nosave);
+# define PERL_ARGS_ASSERT_EXECUTE_WILDCARD      \
+        assert(prog); assert(stringarg); assert(strend); assert(strbeg); \
+        assert(screamer)
+
+STATIC U32
+S_get_quantifier_value(pTHX_ RExC_state_t *pRExC_state, const char *start, const char *end);
+# define PERL_ARGS_ASSERT_GET_QUANTIFIER_VALUE  \
+        assert(pRExC_state); assert(start); assert(end)
+
+STATIC bool
+S_grok_bslash_N(pTHX_ RExC_state_t *pRExC_state, regnode_offset *nodep, UV *code_point_p, int *cp_count, I32 *flagp, const bool strict, const U32 depth);
+# define PERL_ARGS_ASSERT_GROK_BSLASH_N         \
+        assert(pRExC_state); assert(flagp)
+
+STATIC regnode_offset
+S_handle_named_backref(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, char *backref_parse_start, char ch);
+# define PERL_ARGS_ASSERT_HANDLE_NAMED_BACKREF  \
+        assert(pRExC_state); assert(flagp); assert(backref_parse_start)
+
+STATIC bool
+S_handle_names_wildcard(pTHX_ const char *wname, const STRLEN wname_len, SV **prop_definition, AV **strings);
+# define PERL_ARGS_ASSERT_HANDLE_NAMES_WILDCARD \
+        assert(wname); assert(prop_definition); assert(strings)
+
+STATIC int
+S_handle_possible_posix(pTHX_ RExC_state_t *pRExC_state, const char * const s, char **updated_parse_ptr, AV **posix_warnings, const bool check_only);
+# define PERL_ARGS_ASSERT_HANDLE_POSSIBLE_POSIX \
+        assert(pRExC_state); assert(s)
+
+STATIC regnode_offset
+S_handle_regex_sets(pTHX_ RExC_state_t *pRExC_state, SV **return_invlist, I32 *flagp, U32 depth);
+# define PERL_ARGS_ASSERT_HANDLE_REGEX_SETS     \
+        assert(pRExC_state); assert(flagp)
+
+STATIC SV *
+S_handle_user_defined_property(pTHX_ const char *name, const STRLEN name_len, const bool is_utf8, const bool to_fold, const bool runtime, const bool deferrable, SV *contents, bool *user_defined_ptr, SV *msg, const STRLEN level);
+# define PERL_ARGS_ASSERT_HANDLE_USER_DEFINED_PROPERTY \
+        assert(name); assert(contents); assert(user_defined_ptr); assert(msg)
+
+STATIC void
+S_nextchar(pTHX_ RExC_state_t *pRExC_state);
+# define PERL_ARGS_ASSERT_NEXTCHAR              \
+        assert(pRExC_state)
+
+STATIC U8
+S_optimize_regclass(pTHX_ RExC_state_t *pRExC_state, SV *cp_list, SV *only_utf8_locale_list, SV *upper_latin1_only_utf8_matches, const U32 has_runtime_dependency, const U32 posixl, U8 *anyof_flags, bool *invert, regnode_offset *ret, I32 *flagp);
+# define PERL_ARGS_ASSERT_OPTIMIZE_REGCLASS     \
+        assert(pRExC_state); assert(anyof_flags); assert(invert); assert(ret); \
+        assert(flagp)
+
+STATIC void
+S_output_posix_warnings(pTHX_ RExC_state_t *pRExC_state, AV *posix_warnings);
+# define PERL_ARGS_ASSERT_OUTPUT_POSIX_WARNINGS \
+        assert(pRExC_state); assert(posix_warnings)
+
+STATIC void
+S_parse_lparen_question_flags(pTHX_ RExC_state_t *pRExC_state);
+# define PERL_ARGS_ASSERT_PARSE_LPAREN_QUESTION_FLAGS \
+        assert(pRExC_state)
+
+STATIC SV *
+S_parse_uniprop_string(pTHX_ const char * const name, Size_t name_len, const bool is_utf8, const bool to_fold, const bool runtime, const bool deferrable, AV **strings, bool *user_defined_ptr, SV *msg, const STRLEN level);
+# define PERL_ARGS_ASSERT_PARSE_UNIPROP_STRING  \
+        assert(name); assert(user_defined_ptr); assert(msg)
+
+PERL_STATIC_NO_RET void
+S_re_croak(pTHX_ bool utf8, const char *pat, ...)
+        __attribute__noreturn__
+        __attribute__format__(__printf__,pTHX_2,pTHX_3);
+# define PERL_ARGS_ASSERT_RE_CROAK              \
+        assert(pat)
+
+STATIC regnode_offset
+S_reg(pTHX_ RExC_state_t *pRExC_state, I32 paren, I32 *flagp, U32 depth);
+# define PERL_ARGS_ASSERT_REG                   \
+        assert(pRExC_state); assert(flagp)
+
+STATIC regnode_offset
+S_reg1node(pTHX_ RExC_state_t *pRExC_state, U8 op, U32 arg);
+# define PERL_ARGS_ASSERT_REG1NODE              \
+        assert(pRExC_state)
+
+STATIC regnode_offset
+S_reg2node(pTHX_ RExC_state_t *pRExC_state, const U8 op, const U32 arg1, const I32 arg2);
+# define PERL_ARGS_ASSERT_REG2NODE              \
+        assert(pRExC_state)
+
+STATIC regnode_offset
+S_reg_la_NOTHING(pTHX_ RExC_state_t *pRExC_state, U32 flags, const char *type);
+# define PERL_ARGS_ASSERT_REG_LA_NOTHING        \
+        assert(pRExC_state); assert(type)
+
+STATIC regnode_offset
+S_reg_la_OPFAIL(pTHX_ RExC_state_t *pRExC_state, U32 flags, const char *type);
+# define PERL_ARGS_ASSERT_REG_LA_OPFAIL         \
+        assert(pRExC_state); assert(type)
+
+STATIC regnode_offset
+S_reg_node(pTHX_ RExC_state_t *pRExC_state, U8 op);
+# define PERL_ARGS_ASSERT_REG_NODE              \
+        assert(pRExC_state)
+
+STATIC SV *
+S_reg_scan_name(pTHX_ RExC_state_t *pRExC_state, U32 flags);
+# define PERL_ARGS_ASSERT_REG_SCAN_NAME         \
+        assert(pRExC_state)
+
+STATIC regnode_offset
+S_regatom(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth);
+# define PERL_ARGS_ASSERT_REGATOM               \
+        assert(pRExC_state); assert(flagp)
+
+STATIC regnode_offset
+S_regbranch(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, I32 first, U32 depth);
+# define PERL_ARGS_ASSERT_REGBRANCH             \
+        assert(pRExC_state); assert(flagp)
+
+STATIC regnode_offset
+S_regclass(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth, const bool stop_at_1, bool allow_multi_fold, const bool silence_non_portable, const bool strict, bool optimizable, SV **ret_invlist);
+# define PERL_ARGS_ASSERT_REGCLASS              \
+        assert(pRExC_state); assert(flagp)
+
+STATIC unsigned int
+S_regex_set_precedence(const U8 my_operator)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_REGEX_SET_PRECEDENCE
+
+STATIC void
+S_reginsert(pTHX_ RExC_state_t *pRExC_state, const U8 op, const regnode_offset operand, const U32 depth);
+# define PERL_ARGS_ASSERT_REGINSERT             \
+        assert(pRExC_state)
+
+STATIC regnode_offset
+S_regnode_guts(pTHX_ RExC_state_t *pRExC_state, const STRLEN extra_len);
+# define PERL_ARGS_ASSERT_REGNODE_GUTS          \
+        assert(pRExC_state)
+
+STATIC regnode_offset
+S_regpiece(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth);
+# define PERL_ARGS_ASSERT_REGPIECE              \
+        assert(pRExC_state); assert(flagp)
+
+STATIC regnode_offset
+S_regpnode(pTHX_ RExC_state_t *pRExC_state, U8 op, SV *arg);
+# define PERL_ARGS_ASSERT_REGPNODE              \
+        assert(pRExC_state); assert(arg)
+
+STATIC bool
+S_regtail(pTHX_ RExC_state_t *pRExC_state, const regnode_offset p, const regnode_offset val, const U32 depth)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_REGTAIL               \
+        assert(pRExC_state); assert(p); assert(val)
+
+STATIC void
+S_set_regex_pv(pTHX_ RExC_state_t *pRExC_state, REGEXP *Rx);
+# define PERL_ARGS_ASSERT_SET_REGEX_PV          \
+        assert(pRExC_state); assert(Rx)
+
+STATIC void
+S_skip_to_be_ignored_text(pTHX_ RExC_state_t *pRExC_state, char **p, const bool force_to_xmod);
+# define PERL_ARGS_ASSERT_SKIP_TO_BE_IGNORED_TEXT \
+        assert(pRExC_state); assert(p)
+
+# if defined(DEBUGGING)
+STATIC regnode_offset
+S_regnode_guts_debug(pTHX_ RExC_state_t *pRExC_state, const U8 op, const STRLEN extra_len);
+#   define PERL_ARGS_ASSERT_REGNODE_GUTS_DEBUG  \
+        assert(pRExC_state)
+
+STATIC bool
+S_regtail_study(pTHX_ RExC_state_t *pRExC_state, regnode_offset p, const regnode_offset val, U32 depth)
+        __attribute__warn_unused_result__;
+#   define PERL_ARGS_ASSERT_REGTAIL_STUDY       \
+        assert(pRExC_state); assert(p); assert(val)
+
+#   if defined(ENABLE_REGEX_SETS_DEBUGGING)
+STATIC void
+S_dump_regex_sets_structures(pTHX_ RExC_state_t *pRExC_state, AV *stack, const IV fence, AV *fence_stack);
+#     define PERL_ARGS_ASSERT_DUMP_REGEX_SETS_STRUCTURES \
+        assert(pRExC_state); assert(stack); assert(fence_stack)
+
+#   endif
+# endif /* defined(DEBUGGING) */
+# if !defined(PERL_NO_INLINE_FUNCTIONS)
+PERL_STATIC_INLINE Size_t
+S_find_first_differing_byte_pos(const U8 *s1, const U8 *s2, const Size_t max);
+#   define PERL_ARGS_ASSERT_FIND_FIRST_DIFFERING_BYTE_POS \
+        assert(s1); assert(s2)
+
+PERL_STATIC_INLINE char *
+S_reg_skipcomment(RExC_state_t *pRExC_state, char *p);
+#   define PERL_ARGS_ASSERT_REG_SKIPCOMMENT     \
+        assert(pRExC_state); assert(p)
+
+# endif /* !defined(PERL_NO_INLINE_FUNCTIONS) */
+#endif /* defined(PERL_IN_REGCOMP_C) */
+#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGCOMP_INVLIST_C)
+PERL_CALLCONV void
+Perl_populate_bitmap_from_invlist(pTHX_ SV *invlist, const UV offset, const U8 *bitmap, const Size_t len)
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_POPULATE_BITMAP_FROM_INVLIST \
+        assert(invlist); assert(bitmap)
+
+PERL_CALLCONV void
+Perl_populate_invlist_from_bitmap(pTHX_ const U8 *bitmap, const Size_t bitmap_len, SV **invlist, const UV offset)
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_POPULATE_INVLIST_FROM_BITMAP \
+        assert(bitmap); assert(invlist)
+
+#endif /* defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGCOMP_INVLIST_C) */
+#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C) || \
+    defined(PERL_IN_TOKE_C)
+PERL_CALLCONV bool
+Perl_is_grapheme(pTHX_ const U8 *strbeg, const U8 *s, const U8 *strend, const UV cp)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_IS_GRAPHEME           \
+        assert(strbeg); assert(s); assert(strend)
+
+#endif
+#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C) || \
+    defined(PERL_IN_UTF8_C)
+PERL_CALLCONV UV
+Perl__to_fold_latin1(const U8 c, U8 *p, STRLEN *lenp, const unsigned int flags);
+# define PERL_ARGS_ASSERT__TO_FOLD_LATIN1       \
+        assert(p); assert(lenp)
 
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE bool        S_is_invlist(const SV* const invlist)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_IS_INVLIST
-#endif
-
-#endif
-#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C) || defined(PERL_IN_TOKE_C)
-PERL_CALLCONV bool     Perl_is_grapheme(pTHX_ const U8 * strbeg, const U8 * s, const U8 *strend, const UV cp)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_IS_GRAPHEME   \
-       assert(strbeg); assert(s); assert(strend)
-
-#endif
-#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C) || defined(PERL_IN_UTF8_C)
-PERL_CALLCONV UV       Perl__to_fold_latin1(const U8 c, U8 *p, STRLEN *lenp, const unsigned int flags);
-#define PERL_ARGS_ASSERT__TO_FOLD_LATIN1       \
-       assert(p); assert(lenp)
-#endif
-#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_SV_C)
-PERL_CALLCONV SV*      Perl_invlist_clone(pTHX_ SV* const invlist, SV* newlist);
-#define PERL_ARGS_ASSERT_INVLIST_CLONE \
-       assert(invlist)
 #endif
 #if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_TOKE_C)
-PERL_CALLCONV bool     Perl_regcurly(const char *s, const char *e, const char * result[5])
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_REGCURLY      \
-       assert(s); assert(e)
-
-#endif
+PERL_CALLCONV bool
+Perl_regcurly(const char *s, const char *e, const char *result[5])
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_REGCURLY              \
+        assert(s); assert(e)
+
+#endif
+#if defined(PERL_IN_REGCOMP_DEBUG_C) && defined(DEBUGGING)
+STATIC U8
+S_put_charclass_bitmap_innards(pTHX_ SV *sv, char *bitmap, SV *nonbitmap_invlist, SV *only_utf8_locale_invlist, const regnode * const node, const U8 flags, const bool force_as_is_display);
+# define PERL_ARGS_ASSERT_PUT_CHARCLASS_BITMAP_INNARDS \
+        assert(sv)
+
+STATIC SV *
+S_put_charclass_bitmap_innards_common(pTHX_ SV *invlist, SV *posixes, SV *only_utf8, SV *not_utf8, SV *only_utf8_locale, const bool invert);
+# define PERL_ARGS_ASSERT_PUT_CHARCLASS_BITMAP_INNARDS_COMMON \
+        assert(invlist)
+
+STATIC void
+S_put_charclass_bitmap_innards_invlist(pTHX_ SV *sv, SV *invlist);
+# define PERL_ARGS_ASSERT_PUT_CHARCLASS_BITMAP_INNARDS_INVLIST \
+        assert(sv); assert(invlist)
+
+STATIC void
+S_put_code_point(pTHX_ SV *sv, UV c);
+# define PERL_ARGS_ASSERT_PUT_CODE_POINT        \
+        assert(sv)
+
+STATIC void
+S_put_range(pTHX_ SV *sv, UV start, const UV end, const bool allow_literals);
+# define PERL_ARGS_ASSERT_PUT_RANGE             \
+        assert(sv)
+
+STATIC void
+S_regdump_extflags(pTHX_ const char *lead, const U32 flags);
+# define PERL_ARGS_ASSERT_REGDUMP_EXTFLAGS
+
+STATIC void
+S_regdump_intflags(pTHX_ const char *lead, const U32 flags);
+# define PERL_ARGS_ASSERT_REGDUMP_INTFLAGS
+
+#endif /* defined(PERL_IN_REGCOMP_DEBUG_C) && defined(DEBUGGING) */
+#if defined(PERL_IN_REGCOMP_INVLIST_C) && !defined(PERL_EXT_RE_BUILD)
+STATIC void
+S__append_range_to_invlist(pTHX_ SV * const invlist, const UV start, const UV end);
+# define PERL_ARGS_ASSERT__APPEND_RANGE_TO_INVLIST \
+        assert(invlist)
+
+STATIC void
+S_initialize_invlist_guts(pTHX_ SV *invlist, const Size_t initial_size);
+# define PERL_ARGS_ASSERT_INITIALIZE_INVLIST_GUTS \
+        assert(invlist)
+
+STATIC void
+S_invlist_replace_list_destroys_src(pTHX_ SV *dest, SV *src);
+# define PERL_ARGS_ASSERT_INVLIST_REPLACE_LIST_DESTROYS_SRC \
+        assert(dest); assert(src)
+
+# if !defined(PERL_NO_INLINE_FUNCTIONS)
+PERL_STATIC_INLINE UV *
+S__invlist_array_init(SV * const invlist, const bool will_have_0)
+        __attribute__warn_unused_result__;
+#   define PERL_ARGS_ASSERT__INVLIST_ARRAY_INIT \
+        assert(invlist)
+
+PERL_STATIC_INLINE IV *
+S_get_invlist_previous_index_addr(SV *invlist)
+        __attribute__warn_unused_result__;
+#   define PERL_ARGS_ASSERT_GET_INVLIST_PREVIOUS_INDEX_ADDR \
+        assert(invlist)
+
+PERL_STATIC_INLINE void
+S_invlist_clear(pTHX_ SV *invlist);
+#   define PERL_ARGS_ASSERT_INVLIST_CLEAR       \
+        assert(invlist)
+
+PERL_STATIC_INLINE UV
+S_invlist_max(const SV * const invlist)
+        __attribute__warn_unused_result__;
+#   define PERL_ARGS_ASSERT_INVLIST_MAX         \
+        assert(invlist)
+
+PERL_STATIC_INLINE IV
+S_invlist_previous_index(SV * const invlist)
+        __attribute__warn_unused_result__;
+#   define PERL_ARGS_ASSERT_INVLIST_PREVIOUS_INDEX \
+        assert(invlist)
+
+PERL_STATIC_INLINE void
+S_invlist_set_previous_index(SV * const invlist, const IV index);
+#   define PERL_ARGS_ASSERT_INVLIST_SET_PREVIOUS_INDEX \
+        assert(invlist)
+
+PERL_STATIC_INLINE void
+S_invlist_trim(SV *invlist);
+#   define PERL_ARGS_ASSERT_INVLIST_TRIM        \
+        assert(invlist)
+
+# endif /* !defined(PERL_NO_INLINE_FUNCTIONS) */
+#endif /* defined(PERL_IN_REGCOMP_INVLIST_C) && !defined(PERL_EXT_RE_BUILD) */
+#if defined(PERL_IN_REGCOMP_STUDY_C)
+STATIC SV *
+S_get_ANYOF_cp_list_for_ssc(pTHX_ const RExC_state_t *pRExC_state, const regnode_charclass * const node);
+# define PERL_ARGS_ASSERT_GET_ANYOF_CP_LIST_FOR_SSC \
+        assert(pRExC_state); assert(node)
+
+STATIC SV *
+S_make_exactf_invlist(pTHX_ RExC_state_t *pRExC_state, regnode *node)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_MAKE_EXACTF_INVLIST   \
+        assert(pRExC_state); assert(node)
+
+STATIC void
+S_rck_elide_nothing(pTHX_ regnode *node);
+# define PERL_ARGS_ASSERT_RCK_ELIDE_NOTHING     \
+        assert(node)
+
+STATIC void
+S_ssc_add_range(pTHX_ regnode_ssc *ssc, UV const start, UV const end);
+# define PERL_ARGS_ASSERT_SSC_ADD_RANGE         \
+        assert(ssc)
+
+STATIC void
+S_ssc_and(pTHX_ const RExC_state_t *pRExC_state, regnode_ssc *ssc, const regnode_charclass *and_with);
+# define PERL_ARGS_ASSERT_SSC_AND               \
+        assert(pRExC_state); assert(ssc); assert(and_with)
+
+STATIC void
+S_ssc_anything(pTHX_ regnode_ssc *ssc);
+# define PERL_ARGS_ASSERT_SSC_ANYTHING          \
+        assert(ssc)
+
+STATIC void
+S_ssc_clear_locale(regnode_ssc *ssc);
+# define PERL_ARGS_ASSERT_SSC_CLEAR_LOCALE      \
+        assert(ssc)
+
+STATIC void
+S_ssc_cp_and(pTHX_ regnode_ssc *ssc, UV const cp);
+# define PERL_ARGS_ASSERT_SSC_CP_AND            \
+        assert(ssc)
+
+STATIC void
+S_ssc_intersection(pTHX_ regnode_ssc *ssc, SV * const invlist, const bool invert_2nd);
+# define PERL_ARGS_ASSERT_SSC_INTERSECTION      \
+        assert(ssc); assert(invlist)
+
+STATIC int
+S_ssc_is_anything(const regnode_ssc *ssc)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_SSC_IS_ANYTHING       \
+        assert(ssc)
+
+STATIC int
+S_ssc_is_cp_posixl_init(const RExC_state_t *pRExC_state, const regnode_ssc *ssc)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_SSC_IS_CP_POSIXL_INIT \
+        assert(pRExC_state); assert(ssc)
+
+STATIC void
+S_ssc_or(pTHX_ const RExC_state_t *pRExC_state, regnode_ssc *ssc, const regnode_charclass *or_with);
+# define PERL_ARGS_ASSERT_SSC_OR                \
+        assert(pRExC_state); assert(ssc); assert(or_with)
+
+STATIC void
+S_ssc_union(pTHX_ regnode_ssc *ssc, SV * const invlist, const bool invert_2nd);
+# define PERL_ARGS_ASSERT_SSC_UNION             \
+        assert(ssc); assert(invlist)
+
+STATIC void
+S_unwind_scan_frames(pTHX_ const void *p);
+# define PERL_ARGS_ASSERT_UNWIND_SCAN_FRAMES    \
+        assert(p)
+
+#endif /* defined(PERL_IN_REGCOMP_STUDY_C) */
 #if defined(PERL_IN_REGEXEC_C)
-STATIC LB_enum S_advance_one_LB(pTHX_ U8 ** curpos, const U8 * const strend, const bool utf8_target)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_ADVANCE_ONE_LB        \
-       assert(curpos); assert(strend)
-
-STATIC SB_enum S_advance_one_SB(pTHX_ U8 ** curpos, const U8 * const strend, const bool utf8_target)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_ADVANCE_ONE_SB        \
-       assert(curpos); assert(strend)
-
-STATIC WB_enum S_advance_one_WB(pTHX_ U8 ** curpos, const U8 * const strend, const bool utf8_target, const bool skip_Extend_Format)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_ADVANCE_ONE_WB        \
-       assert(curpos); assert(strend)
-
-STATIC GCB_enum        S_backup_one_GCB(pTHX_ const U8 * const strbeg, U8 ** curpos, const bool utf8_target)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_BACKUP_ONE_GCB        \
-       assert(strbeg); assert(curpos)
-
-STATIC LB_enum S_backup_one_LB(pTHX_ const U8 * const strbeg, U8 ** curpos, const bool utf8_target)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_BACKUP_ONE_LB \
-       assert(strbeg); assert(curpos)
-
-STATIC SB_enum S_backup_one_SB(pTHX_ const U8 * const strbeg, U8 ** curpos, const bool utf8_target)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_BACKUP_ONE_SB \
-       assert(strbeg); assert(curpos)
-
-STATIC WB_enum S_backup_one_WB(pTHX_ WB_enum * previous, const U8 * const strbeg, U8 ** curpos, const bool utf8_target)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_BACKUP_ONE_WB \
-       assert(previous); assert(strbeg); assert(curpos)
-
-STATIC char*   S_find_byclass(pTHX_ regexp * prog, const regnode *c, char *s, const char *strend, regmatch_info *reginfo)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_FIND_BYCLASS  \
-       assert(prog); assert(c); assert(s); assert(strend)
-
-STATIC U8 *    S_find_next_masked(U8 * s, const U8 * send, const U8 byte, const U8 mask)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_FIND_NEXT_MASKED      \
-       assert(s); assert(send)
-
-STATIC U8 *    S_find_span_end(U8* s, const U8 * send, const U8 span_byte)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_FIND_SPAN_END \
-       assert(s); assert(send)
-
-STATIC U8 *    S_find_span_end_mask(U8 * s, const U8 * send, const U8 span_byte, const U8 mask)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_FIND_SPAN_END_MASK    \
-       assert(s); assert(send)
-
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE I32 S_foldEQ_latin1_s2_folded(const char* a, const char* b, I32 len);
-#define PERL_ARGS_ASSERT_FOLDEQ_LATIN1_S2_FOLDED       \
-       assert(a); assert(b)
-#endif
-STATIC bool    S_isFOO_lc(pTHX_ const U8 classnum, const U8 character)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_ISFOO_LC
-
-STATIC bool    S_isFOO_utf8_lc(pTHX_ const U8 classnum, const U8* character, const U8* e)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_ISFOO_UTF8_LC \
-       assert(character); assert(e)
-
-STATIC bool    S_isGCB(pTHX_ const GCB_enum before, const GCB_enum after, const U8 * const strbeg, const U8 * const curpos, const bool utf8_target)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_ISGCB \
-       assert(strbeg); assert(curpos)
-
-STATIC bool    S_isLB(pTHX_ LB_enum before, LB_enum after, const U8 * const strbeg, const U8 * const curpos, const U8 * const strend, const bool utf8_target)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_ISLB  \
-       assert(strbeg); assert(curpos); assert(strend)
-
-STATIC bool    S_isSB(pTHX_ SB_enum before, SB_enum after, const U8 * const strbeg, const U8 * const curpos, const U8 * const strend, const bool utf8_target)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_ISSB  \
-       assert(strbeg); assert(curpos); assert(strend)
-
-STATIC bool    S_isWB(pTHX_ WB_enum previous, WB_enum before, WB_enum after, const U8 * const strbeg, const U8 * const curpos, const U8 * const strend, const bool utf8_target)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_ISWB  \
-       assert(strbeg); assert(curpos); assert(strend)
-
-STATIC I32     S_reg_check_named_buff_matched(const regexp *rex, const regnode *scan)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_REG_CHECK_NAMED_BUFF_MATCHED  \
-       assert(rex); assert(scan)
-
-STATIC void    S_regcp_restore(pTHX_ regexp *rex, I32 ix, U32 *maxopenparen_p _pDEPTH);
-#define PERL_ARGS_ASSERT_REGCP_RESTORE \
-       assert(rex); assert(maxopenparen_p)
-STATIC void    S_regcppop(pTHX_ regexp *rex, U32 *maxopenparen_p _pDEPTH);
-#define PERL_ARGS_ASSERT_REGCPPOP      \
-       assert(rex); assert(maxopenparen_p)
-STATIC CHECKPOINT      S_regcppush(pTHX_ const regexp *rex, I32 parenfloor, U32 maxopenparen _pDEPTH);
-#define PERL_ARGS_ASSERT_REGCPPUSH     \
-       assert(rex)
-STATIC U8*     S_reghop3(U8 *s, SSize_t off, const U8 *lim)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_REGHOP3       \
-       assert(s); assert(lim)
-
-STATIC U8*     S_reghop4(U8 *s, SSize_t off, const U8 *llim, const U8 *rlim)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_REGHOP4       \
-       assert(s); assert(llim); assert(rlim)
-
-STATIC U8*     S_reghopmaybe3(U8 *s, SSize_t off, const U8 * const lim)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_REGHOPMAYBE3  \
-       assert(s); assert(lim)
-
-STATIC bool    S_reginclass(pTHX_ regexp * const prog, const regnode * const n, const U8 * const p, const U8 * const p_end, bool const utf8_target)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_REGINCLASS    \
-       assert(n); assert(p); assert(p_end)
-
-STATIC SSize_t S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_REGMATCH      \
-       assert(reginfo); assert(startpos); assert(prog)
-
-STATIC I32     S_regrepeat(pTHX_ regexp *prog, char **startposp, const regnode *p, char *loceol, regmatch_info *const reginfo, I32 max _pDEPTH)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_REGREPEAT     \
-       assert(prog); assert(startposp); assert(p); assert(loceol); assert(reginfo)
-
-STATIC bool    S_regtry(pTHX_ regmatch_info *reginfo, char **startposp)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_REGTRY        \
-       assert(reginfo); assert(startposp)
-
-STATIC bool    S_to_byte_substr(pTHX_ regexp * prog);
-#define PERL_ARGS_ASSERT_TO_BYTE_SUBSTR        \
-       assert(prog)
-STATIC void    S_to_utf8_substr(pTHX_ regexp * prog);
-#define PERL_ARGS_ASSERT_TO_UTF8_SUBSTR        \
-       assert(prog)
-#endif
+STATIC LB_enum
+S_advance_one_LB(pTHX_ U8 **curpos, const U8 * const strend, const bool utf8_target)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_ADVANCE_ONE_LB        \
+        assert(curpos); assert(strend)
+
+STATIC SB_enum
+S_advance_one_SB(pTHX_ U8 **curpos, const U8 * const strend, const bool utf8_target)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_ADVANCE_ONE_SB        \
+        assert(curpos); assert(strend)
+
+STATIC WB_enum
+S_advance_one_WB(pTHX_ U8 **curpos, const U8 * const strend, const bool utf8_target, const bool skip_Extend_Format)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_ADVANCE_ONE_WB        \
+        assert(curpos); assert(strend)
+
+STATIC GCB_enum
+S_backup_one_GCB(pTHX_ const U8 * const strbeg, U8 **curpos, const bool utf8_target)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_BACKUP_ONE_GCB        \
+        assert(strbeg); assert(curpos)
+
+STATIC LB_enum
+S_backup_one_LB(pTHX_ const U8 * const strbeg, U8 **curpos, const bool utf8_target)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_BACKUP_ONE_LB         \
+        assert(strbeg); assert(curpos)
+
+STATIC SB_enum
+S_backup_one_SB(pTHX_ const U8 * const strbeg, U8 **curpos, const bool utf8_target)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_BACKUP_ONE_SB         \
+        assert(strbeg); assert(curpos)
+
+STATIC WB_enum
+S_backup_one_WB(pTHX_ WB_enum *previous, const U8 * const strbeg, U8 **curpos, const bool utf8_target)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_BACKUP_ONE_WB         \
+        assert(previous); assert(strbeg); assert(curpos)
+
+STATIC char *
+S_find_byclass(pTHX_ regexp *prog, const regnode *c, char *s, const char *strend, regmatch_info *reginfo)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_FIND_BYCLASS          \
+        assert(prog); assert(c); assert(s); assert(strend)
+
+STATIC U8 *
+S_find_next_masked(U8 *s, const U8 *send, const U8 byte, const U8 mask)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_FIND_NEXT_MASKED      \
+        assert(s); assert(send)
+
+STATIC U8 *
+S_find_span_end(U8 *s, const U8 *send, const U8 span_byte)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_FIND_SPAN_END         \
+        assert(s); assert(send)
+
+STATIC U8 *
+S_find_span_end_mask(U8 *s, const U8 *send, const U8 span_byte, const U8 mask)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_FIND_SPAN_END_MASK    \
+        assert(s); assert(send)
+
+STATIC bool
+S_isFOO_lc(pTHX_ const U8 classnum, const U8 character)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_ISFOO_LC
+
+STATIC bool
+S_isFOO_utf8_lc(pTHX_ const U8 classnum, const U8 *character, const U8 *e)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_ISFOO_UTF8_LC         \
+        assert(character); assert(e)
+
+STATIC bool
+S_isGCB(pTHX_ const GCB_enum before, const GCB_enum after, const U8 * const strbeg, const U8 * const curpos, const bool utf8_target)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_ISGCB                 \
+        assert(strbeg); assert(curpos)
+
+STATIC bool
+S_isLB(pTHX_ LB_enum before, LB_enum after, const U8 * const strbeg, const U8 * const curpos, const U8 * const strend, const bool utf8_target)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_ISLB                  \
+        assert(strbeg); assert(curpos); assert(strend)
+
+STATIC bool
+S_isSB(pTHX_ SB_enum before, SB_enum after, const U8 * const strbeg, const U8 * const curpos, const U8 * const strend, const bool utf8_target)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_ISSB                  \
+        assert(strbeg); assert(curpos); assert(strend)
+
+STATIC bool
+S_isWB(pTHX_ WB_enum previous, WB_enum before, WB_enum after, const U8 * const strbeg, const U8 * const curpos, const U8 * const strend, const bool utf8_target)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_ISWB                  \
+        assert(strbeg); assert(curpos); assert(strend)
+
+STATIC I32
+S_reg_check_named_buff_matched(const regexp *rex, const regnode *scan)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_REG_CHECK_NAMED_BUFF_MATCHED \
+        assert(rex); assert(scan)
+
+STATIC void
+S_regcp_restore(pTHX_ regexp *rex, I32 ix, U32 *maxopenparen_p comma_pDEPTH);
+# define PERL_ARGS_ASSERT_REGCP_RESTORE         \
+        assert(rex); assert(maxopenparen_p)
+
+STATIC void
+S_regcppop(pTHX_ regexp *rex, U32 *maxopenparen_p comma_pDEPTH);
+# define PERL_ARGS_ASSERT_REGCPPOP              \
+        assert(rex); assert(maxopenparen_p)
+
+STATIC CHECKPOINT
+S_regcppush(pTHX_ const regexp *rex, I32 parenfloor, U32 maxopenparen comma_pDEPTH);
+# define PERL_ARGS_ASSERT_REGCPPUSH             \
+        assert(rex)
+
+STATIC U8 *
+S_reghop3(U8 *s, SSize_t off, const U8 *lim)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_REGHOP3               \
+        assert(s); assert(lim)
+
+STATIC U8 *
+S_reghop4(U8 *s, SSize_t off, const U8 *llim, const U8 *rlim)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_REGHOP4               \
+        assert(s); assert(llim); assert(rlim)
+
+STATIC U8 *
+S_reghopmaybe3(U8 *s, SSize_t off, const U8 * const lim)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_REGHOPMAYBE3          \
+        assert(s); assert(lim)
+
+STATIC bool
+S_reginclass(pTHX_ regexp * const prog, const regnode * const n, const U8 * const p, const U8 * const p_end, bool const utf8_target)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_REGINCLASS            \
+        assert(n); assert(p); assert(p_end)
+
+STATIC SSize_t
+S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_REGMATCH              \
+        assert(reginfo); assert(startpos); assert(prog)
+
+STATIC I32
+S_regrepeat(pTHX_ regexp *prog, char **startposp, const regnode *p, char *loceol, regmatch_info * const reginfo, I32 max comma_pDEPTH)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_REGREPEAT             \
+        assert(prog); assert(startposp); assert(p); assert(loceol); assert(reginfo); \
+        assert(max)
+
+STATIC bool
+S_regtry(pTHX_ regmatch_info *reginfo, char **startposp)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_REGTRY                \
+        assert(reginfo); assert(startposp)
+
+STATIC bool
+S_to_byte_substr(pTHX_ regexp *prog);
+# define PERL_ARGS_ASSERT_TO_BYTE_SUBSTR        \
+        assert(prog)
+
+STATIC void
+S_to_utf8_substr(pTHX_ regexp *prog);
+# define PERL_ARGS_ASSERT_TO_UTF8_SUBSTR        \
+        assert(prog)
+
+# if defined(DEBUGGING)
+STATIC void
+S_debug_start_match(pTHX_ const REGEXP *prog, const bool do_utf8, const char *start, const char *end, const char *blurb);
+#   define PERL_ARGS_ASSERT_DEBUG_START_MATCH   \
+        assert(prog); assert(start); assert(end); assert(blurb)
+
+STATIC void
+S_dump_exec_pos(pTHX_ const char *locinput, const regnode *scan, const char *loc_regeol, const char *loc_bostr, const char *loc_reg_starttry, const bool do_utf8, const U32 depth);
+#   define PERL_ARGS_ASSERT_DUMP_EXEC_POS       \
+        assert(locinput); assert(scan); assert(loc_regeol); assert(loc_bostr); \
+        assert(loc_reg_starttry)
+
+PERL_CALLCONV int
+Perl_re_exec_indentf(pTHX_ const char *fmt, U32 depth, ...)
+        __attribute__visibility__("hidden");
+#   define PERL_ARGS_ASSERT_RE_EXEC_INDENTF     \
+        assert(fmt)
+
+# endif /* defined(DEBUGGING) */
+# if !defined(PERL_NO_INLINE_FUNCTIONS)
+PERL_STATIC_INLINE void
+S_capture_clear(pTHX_ regexp *rex, U16 from_ix, U16 to_ix, const char *str comma_pDEPTH);
+#   define PERL_ARGS_ASSERT_CAPTURE_CLEAR       \
+        assert(rex); assert(str)
+
+PERL_STATIC_INLINE I32
+S_foldEQ_latin1_s2_folded(pTHX_ const char *a, const char *b, I32 len);
+#   define PERL_ARGS_ASSERT_FOLDEQ_LATIN1_S2_FOLDED \
+        assert(a); assert(b)
+
+PERL_STATIC_INLINE void
+S_unwind_paren(pTHX_ regexp *rex, U32 lp, U32 lcp comma_pDEPTH);
+#   define PERL_ARGS_ASSERT_UNWIND_PAREN        \
+        assert(rex)
+
+# endif /* !defined(PERL_NO_INLINE_FUNCTIONS) */
+#endif /* defined(PERL_IN_REGEXEC_C) */
+#if defined(PERL_IN_REGEX_ENGINE)
+
+# if defined(DEBUGGING)
+PERL_CALLCONV void
+Perl_debug_peep(pTHX_ const char *str, const RExC_state_t *pRExC_state, regnode *scan, U32 depth, U32 flags)
+        __attribute__visibility__("hidden");
+#   define PERL_ARGS_ASSERT_DEBUG_PEEP          \
+        assert(str); assert(pRExC_state)
+
+PERL_CALLCONV void
+Perl_debug_show_study_flags(pTHX_ U32 flags, const char *open_str, const char *close_str)
+        __attribute__visibility__("hidden");
+#   define PERL_ARGS_ASSERT_DEBUG_SHOW_STUDY_FLAGS \
+        assert(open_str); assert(close_str)
+
+PERL_CALLCONV void
+Perl_debug_studydata(pTHX_ const char *where, scan_data_t *data, U32 depth, int is_inf, SSize_t min, SSize_t stopmin, SSize_t delta)
+        __attribute__visibility__("hidden");
+#   define PERL_ARGS_ASSERT_DEBUG_STUDYDATA     \
+        assert(where)
+
+PERL_CALLCONV const regnode *
+Perl_dumpuntil(pTHX_ const regexp *r, const regnode *start, const regnode *node, const regnode *last, const regnode *plast, SV *sv, I32 indent, U32 depth)
+        __attribute__visibility__("hidden");
+#   define PERL_ARGS_ASSERT_DUMPUNTIL           \
+        assert(r); assert(start); assert(node); assert(sv)
+
+PERL_CALLCONV int
+Perl_re_indentf(pTHX_ const char *fmt, U32 depth, ...)
+        __attribute__visibility__("hidden");
+#   define PERL_ARGS_ASSERT_RE_INDENTF          \
+        assert(fmt)
+
+PERL_CALLCONV int
+Perl_re_printf(pTHX_ const char *fmt, ...)
+        __attribute__visibility__("hidden")
+        __attribute__format__(__printf__,pTHX_1,pTHX_2);
+#   define PERL_ARGS_ASSERT_RE_PRINTF           \
+        assert(fmt)
+
+PERL_CALLCONV void
+Perl_regprop(pTHX_ const regexp *prog, SV *sv, const regnode *o, const regmatch_info *reginfo, const RExC_state_t *pRExC_state)
+        __attribute__visibility__("hidden");
+#   define PERL_ARGS_ASSERT_REGPROP             \
+        assert(sv); assert(o)
+
+# endif /* defined(DEBUGGING) */
+# if defined(PERL_EXT_RE_BUILD)
+PERL_CALLCONV SV *
+Perl_get_re_gclass_aux_data(pTHX_ const regexp *prog, const struct regnode *node, bool doinit, SV **listsvp, SV **lonly_utf8_locale, SV **output_invlist)
+        __attribute__visibility__("hidden");
+#   define PERL_ARGS_ASSERT_GET_RE_GCLASS_AUX_DATA \
+        assert(node)
+
+# else
+PERL_CALLCONV SV *
+Perl_get_regclass_aux_data(pTHX_ const regexp *prog, const struct regnode *node, bool doinit, SV **listsvp, SV **lonly_utf8_locale, SV **output_invlist)
+        __attribute__visibility__("hidden");
+#   define PERL_ARGS_ASSERT_GET_REGCLASS_AUX_DATA \
+        assert(node)
+
+# endif
+# if !defined(PERL_NO_INLINE_FUNCTIONS)
+PERL_STATIC_INLINE bool
+Perl_check_regnode_after(pTHX_ const regnode *p, const STRLEN extra)
+        __attribute__warn_unused_result__;
+#   define PERL_ARGS_ASSERT_CHECK_REGNODE_AFTER
+
+PERL_STATIC_INLINE regnode *
+Perl_regnext(pTHX_ const regnode *p)
+        __attribute__warn_unused_result__;
+#   define PERL_ARGS_ASSERT_REGNEXT
+
+PERL_STATIC_INLINE regnode *
+Perl_regnode_after(pTHX_ const regnode *p, bool varies)
+        __attribute__warn_unused_result__;
+#   define PERL_ARGS_ASSERT_REGNODE_AFTER
+
+# endif /* !defined(PERL_NO_INLINE_FUNCTIONS) */
+#endif /* defined(PERL_IN_REGEX_ENGINE) */
 #if defined(PERL_IN_SCOPE_C)
-STATIC void    S_save_pushptri32ptr(pTHX_ void *const ptr1, const I32 i, void *const ptr2, const int type);
-#define PERL_ARGS_ASSERT_SAVE_PUSHPTRI32PTR
-STATIC SV*     S_save_scalar_at(pTHX_ SV **sptr, const U32 flags);
-#define PERL_ARGS_ASSERT_SAVE_SCALAR_AT        \
-       assert(sptr)
-#endif
-#if defined(PERL_IN_SV_C)
-STATIC char *  S_F0convert(NV nv, char *const endbuf, STRLEN *const len);
-#define PERL_ARGS_ASSERT_F0CONVERT     \
-       assert(endbuf); assert(len)
-STATIC void    S_anonymise_cv_maybe(pTHX_ GV *gv, CV *cv);
-#define PERL_ARGS_ASSERT_ANONYMISE_CV_MAYBE    \
-       assert(gv); assert(cv)
-STATIC void    S_assert_uft8_cache_coherent(pTHX_ const char *const func, STRLEN from_cache, STRLEN real, SV *const sv);
-#define PERL_ARGS_ASSERT_ASSERT_UFT8_CACHE_COHERENT    \
-       assert(func); assert(sv)
-STATIC bool    S_curse(pTHX_ SV * const sv, const bool check_refcnt);
-#define PERL_ARGS_ASSERT_CURSE \
-       assert(sv)
-STATIC STRLEN  S_expect_number(pTHX_ const char **const pattern)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_EXPECT_NUMBER \
-       assert(pattern)
-
-STATIC SSize_t S_find_array_subscript(pTHX_ const AV *const av, const SV *const val);
-#define PERL_ARGS_ASSERT_FIND_ARRAY_SUBSCRIPT  \
-       assert(val)
-STATIC SV *    S_find_hash_subscript(pTHX_ const HV *const hv, const SV *const val);
-#define PERL_ARGS_ASSERT_FIND_HASH_SUBSCRIPT   \
-       assert(val)
-STATIC SV*     S_find_uninit_var(pTHX_ const OP *const obase, const SV *const uninit_sv, bool match, const char **desc_p);
-#define PERL_ARGS_ASSERT_FIND_UNINIT_VAR       \
-       assert(desc_p)
-STATIC bool    S_glob_2number(pTHX_ GV* const gv);
-#define PERL_ARGS_ASSERT_GLOB_2NUMBER  \
-       assert(gv)
-STATIC void    S_glob_assign_glob(pTHX_ SV *const dsv, SV *const ssv, const int dtype);
-#define PERL_ARGS_ASSERT_GLOB_ASSIGN_GLOB      \
-       assert(dsv); assert(ssv)
-PERL_CALLCONV SV *     Perl_more_sv(pTHX);
-#define PERL_ARGS_ASSERT_MORE_SV
-STATIC void    S_not_a_number(pTHX_ SV *const sv);
-#define PERL_ARGS_ASSERT_NOT_A_NUMBER  \
-       assert(sv)
-STATIC void    S_not_incrementable(pTHX_ SV *const sv);
-#define PERL_ARGS_ASSERT_NOT_INCREMENTABLE     \
-       assert(sv)
-STATIC PTR_TBL_ENT_t * S_ptr_table_find(PTR_TBL_t *const tbl, const void *const sv)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_PTR_TABLE_FIND        \
-       assert(tbl)
-
-STATIC bool    S_sv_2iuv_common(pTHX_ SV *const sv);
-#define PERL_ARGS_ASSERT_SV_2IUV_COMMON        \
-       assert(sv)
-STATIC void    S_sv_add_arena(pTHX_ char *const ptr, const U32 size, const U32 flags);
-#define PERL_ARGS_ASSERT_SV_ADD_ARENA  \
-       assert(ptr)
-STATIC const char *    S_sv_display(pTHX_ SV *const sv, char *tmpbuf, STRLEN tmpbuf_size);
-#define PERL_ARGS_ASSERT_SV_DISPLAY    \
-       assert(sv); assert(tmpbuf)
-STATIC STRLEN  S_sv_pos_b2u_midway(pTHX_ const U8 *const s, const U8 *const target, const U8 *end, STRLEN endu);
-#define PERL_ARGS_ASSERT_SV_POS_B2U_MIDWAY     \
-       assert(s); assert(target); assert(end)
-STATIC STRLEN  S_sv_pos_u2b_cached(pTHX_ SV *const sv, MAGIC **const mgp, const U8 *const start, const U8 *const send, STRLEN uoffset, STRLEN uoffset0, STRLEN boffset0);
-#define PERL_ARGS_ASSERT_SV_POS_U2B_CACHED     \
-       assert(sv); assert(mgp); assert(start); assert(send)
-STATIC STRLEN  S_sv_pos_u2b_forwards(const U8 *const start, const U8 *const send, STRLEN *const uoffset, bool *const at_end, bool *canonical_position);
-#define PERL_ARGS_ASSERT_SV_POS_U2B_FORWARDS   \
-       assert(start); assert(send); assert(uoffset); assert(at_end); assert(canonical_position)
-STATIC STRLEN  S_sv_pos_u2b_midway(const U8 *const start, const U8 *send, STRLEN uoffset, const STRLEN uend);
-#define PERL_ARGS_ASSERT_SV_POS_U2B_MIDWAY     \
-       assert(start); assert(send)
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE void        S_sv_unglob(pTHX_ SV *const sv, U32 flags);
-#define PERL_ARGS_ASSERT_SV_UNGLOB     \
-       assert(sv)
-#endif
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE char *      S_uiv_2buf(char *const buf, const IV iv, UV uv, const int is_uv, char **const peob)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_UIV_2BUF      \
-       assert(buf); assert(peob)
-#endif
+STATIC void
+S_save_pushptri32ptr(pTHX_ void * const ptr1, const I32 i, void * const ptr2, const int type);
+# define PERL_ARGS_ASSERT_SAVE_PUSHPTRI32PTR
 
-STATIC void    S_utf8_mg_len_cache_update(pTHX_ SV *const sv, MAGIC **const mgp, const STRLEN ulen);
-#define PERL_ARGS_ASSERT_UTF8_MG_LEN_CACHE_UPDATE      \
-       assert(sv); assert(mgp)
-STATIC void    S_utf8_mg_pos_cache_update(pTHX_ SV *const sv, MAGIC **const mgp, const STRLEN byte, const STRLEN utf8, const STRLEN blen);
-#define PERL_ARGS_ASSERT_UTF8_MG_POS_CACHE_UPDATE      \
-       assert(sv); assert(mgp)
-STATIC I32     S_visit(pTHX_ SVFUNC_t f, const U32 flags, const U32 mask);
-#define PERL_ARGS_ASSERT_VISIT \
-       assert(f)
-#  if defined(USE_ITHREADS)
-STATIC SV*     S_sv_dup_common(pTHX_ const SV *const ssv, CLONE_PARAMS *const param)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_SV_DUP_COMMON \
-       assert(ssv); assert(param)
-
-STATIC SV **   S_sv_dup_inc_multiple(pTHX_ SV *const *source, SV **dest, SSize_t items, CLONE_PARAMS *const param);
-#define PERL_ARGS_ASSERT_SV_DUP_INC_MULTIPLE   \
-       assert(source); assert(dest); assert(param)
-STATIC void    S_unreferenced_to_tmp_stack(pTHX_ AV *const unreferenced);
-#define PERL_ARGS_ASSERT_UNREFERENCED_TO_TMP_STACK     \
-       assert(unreferenced)
-#  endif
-#endif
-#if defined(PERL_IN_SV_C) || defined (PERL_IN_OP_C)
-PERL_CALLCONV SV *     Perl_varname(pTHX_ const GV *const gv, const char gvtype, PADOFFSET targ, const SV *const keyname, SSize_t aindex, int subscript_type)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_VARNAME
+STATIC SV *
+S_save_scalar_at(pTHX_ SV **sptr, const U32 flags);
+# define PERL_ARGS_ASSERT_SAVE_SCALAR_AT        \
+        assert(sptr)
 
-#endif
+#endif /* defined(PERL_IN_SCOPE_C) */
+#if defined(PERL_IN_SV_C)
+STATIC char *
+S_F0convert(NV nv, char * const endbuf, STRLEN * const len);
+# define PERL_ARGS_ASSERT_F0CONVERT             \
+        assert(endbuf); assert(len)
+
+STATIC void
+S_anonymise_cv_maybe(pTHX_ GV *gv, CV *cv);
+# define PERL_ARGS_ASSERT_ANONYMISE_CV_MAYBE    \
+        assert(gv); assert(cv)
+
+STATIC void
+S_assert_uft8_cache_coherent(pTHX_ const char * const func, STRLEN from_cache, STRLEN real, SV * const sv);
+# define PERL_ARGS_ASSERT_ASSERT_UFT8_CACHE_COHERENT \
+        assert(func); assert(sv)
+
+STATIC bool
+S_curse(pTHX_ SV * const sv, const bool check_refcnt);
+# define PERL_ARGS_ASSERT_CURSE                 \
+        assert(sv)
+
+STATIC STRLEN
+S_expect_number(pTHX_ const char ** const pattern)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_EXPECT_NUMBER         \
+        assert(pattern)
+
+STATIC SSize_t
+S_find_array_subscript(pTHX_ const AV * const av, const SV * const val);
+# define PERL_ARGS_ASSERT_FIND_ARRAY_SUBSCRIPT  \
+        assert(val)
+
+STATIC SV *
+S_find_hash_subscript(pTHX_ const HV * const hv, const SV * const val);
+# define PERL_ARGS_ASSERT_FIND_HASH_SUBSCRIPT   \
+        assert(val)
+
+STATIC SV *
+S_find_uninit_var(pTHX_ const OP * const obase, const SV * const uninit_sv, bool match, const char **desc_p);
+# define PERL_ARGS_ASSERT_FIND_UNINIT_VAR       \
+        assert(desc_p)
+
+STATIC bool
+S_glob_2number(pTHX_ GV * const gv);
+# define PERL_ARGS_ASSERT_GLOB_2NUMBER          \
+        assert(gv)
+
+STATIC void
+S_glob_assign_glob(pTHX_ SV * const dsv, SV * const ssv, const int dtype);
+# define PERL_ARGS_ASSERT_GLOB_ASSIGN_GLOB      \
+        assert(dsv); assert(ssv)
+
+PERL_CALLCONV SV *
+Perl_more_sv(pTHX);
+# define PERL_ARGS_ASSERT_MORE_SV
+
+STATIC void
+S_not_a_number(pTHX_ SV * const sv);
+# define PERL_ARGS_ASSERT_NOT_A_NUMBER          \
+        assert(sv)
+
+STATIC void
+S_not_incrementable(pTHX_ SV * const sv);
+# define PERL_ARGS_ASSERT_NOT_INCREMENTABLE     \
+        assert(sv)
+
+STATIC PTR_TBL_ENT_t *
+S_ptr_table_find(PTR_TBL_t * const tbl, const void * const sv)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_PTR_TABLE_FIND        \
+        assert(tbl)
+
+STATIC bool
+S_sv_2iuv_common(pTHX_ SV * const sv);
+# define PERL_ARGS_ASSERT_SV_2IUV_COMMON        \
+        assert(sv)
+
+STATIC void
+S_sv_add_arena(pTHX_ char * const ptr, const U32 size, const U32 flags);
+# define PERL_ARGS_ASSERT_SV_ADD_ARENA          \
+        assert(ptr)
+
+STATIC const char *
+S_sv_display(pTHX_ SV * const sv, char *tmpbuf, STRLEN tmpbuf_size);
+# define PERL_ARGS_ASSERT_SV_DISPLAY            \
+        assert(sv); assert(tmpbuf)
+
+STATIC STRLEN
+S_sv_pos_b2u_midway(pTHX_ const U8 * const s, const U8 * const target, const U8 *end, STRLEN endu);
+# define PERL_ARGS_ASSERT_SV_POS_B2U_MIDWAY     \
+        assert(s); assert(target); assert(end)
+
+STATIC STRLEN
+S_sv_pos_u2b_cached(pTHX_ SV * const sv, MAGIC ** const mgp, const U8 * const start, const U8 * const send, STRLEN uoffset, STRLEN uoffset0, STRLEN boffset0);
+# define PERL_ARGS_ASSERT_SV_POS_U2B_CACHED     \
+        assert(sv); assert(mgp); assert(start); assert(send)
+
+STATIC STRLEN
+S_sv_pos_u2b_forwards(const U8 * const start, const U8 * const send, STRLEN * const uoffset, bool * const at_end, bool *canonical_position);
+# define PERL_ARGS_ASSERT_SV_POS_U2B_FORWARDS   \
+        assert(start); assert(send); assert(uoffset); assert(at_end); assert(canonical_position)
+
+STATIC STRLEN
+S_sv_pos_u2b_midway(const U8 * const start, const U8 *send, STRLEN uoffset, const STRLEN uend);
+# define PERL_ARGS_ASSERT_SV_POS_U2B_MIDWAY     \
+        assert(start); assert(send)
+
+STATIC void
+S_utf8_mg_len_cache_update(pTHX_ SV * const sv, MAGIC ** const mgp, const STRLEN ulen);
+# define PERL_ARGS_ASSERT_UTF8_MG_LEN_CACHE_UPDATE \
+        assert(sv); assert(mgp)
+
+STATIC void
+S_utf8_mg_pos_cache_update(pTHX_ SV * const sv, MAGIC ** const mgp, const STRLEN byte, const STRLEN utf8, const STRLEN blen);
+# define PERL_ARGS_ASSERT_UTF8_MG_POS_CACHE_UPDATE \
+        assert(sv); assert(mgp)
+
+STATIC I32
+S_visit(pTHX_ SVFUNC_t f, const U32 flags, const U32 mask);
+# define PERL_ARGS_ASSERT_VISIT                 \
+        assert(f)
+
+# if defined(DEBUGGING)
+STATIC void
+S_del_sv(pTHX_ SV *p);
+#   define PERL_ARGS_ASSERT_DEL_SV              \
+        assert(p)
+
+# endif
+# if !defined(NV_PRESERVES_UV)
+#   if defined(DEBUGGING)
+STATIC int
+S_sv_2iuv_non_preserve(pTHX_ SV * const sv, I32 numtype);
+#     define PERL_ARGS_ASSERT_SV_2IUV_NON_PRESERVE \
+        assert(sv)
+
+#   else
+STATIC int
+S_sv_2iuv_non_preserve(pTHX_ SV * const sv);
+#     define PERL_ARGS_ASSERT_SV_2IUV_NON_PRESERVE \
+        assert(sv)
+
+#   endif
+# endif /* !defined(NV_PRESERVES_UV) */
+# if defined(PERL_DEBUG_READONLY_COW)
+STATIC void
+S_sv_buf_to_rw(pTHX_ SV *sv);
+#   define PERL_ARGS_ASSERT_SV_BUF_TO_RW        \
+        assert(sv)
+
+# endif
+# if !defined(PERL_NO_INLINE_FUNCTIONS)
+PERL_STATIC_INLINE void
+S_sv_unglob(pTHX_ SV * const sv, U32 flags);
+#   define PERL_ARGS_ASSERT_SV_UNGLOB           \
+        assert(sv)
+
+PERL_STATIC_INLINE char *
+S_uiv_2buf(char * const buf, const IV iv, UV uv, const int is_uv, char ** const peob)
+        __attribute__warn_unused_result__;
+#   define PERL_ARGS_ASSERT_UIV_2BUF            \
+        assert(buf); assert(peob)
+
+# endif /* !defined(PERL_NO_INLINE_FUNCTIONS) */
+# if defined(USE_ITHREADS)
+STATIC SV *
+S_sv_dup_common(pTHX_ const SV * const ssv, CLONE_PARAMS * const param)
+        __attribute__warn_unused_result__;
+#   define PERL_ARGS_ASSERT_SV_DUP_COMMON       \
+        assert(ssv); assert(param)
+
+STATIC void
+S_sv_dup_hvaux(pTHX_ const SV * const ssv, SV *dsv, CLONE_PARAMS * const param);
+#   define PERL_ARGS_ASSERT_SV_DUP_HVAUX        \
+        assert(ssv); assert(dsv); assert(param)
+
+STATIC SV **
+S_sv_dup_inc_multiple(pTHX_ SV * const *source, SV **dest, SSize_t items, CLONE_PARAMS * const param);
+#   define PERL_ARGS_ASSERT_SV_DUP_INC_MULTIPLE \
+        assert(source); assert(dest); assert(param)
+
+STATIC void
+S_unreferenced_to_tmp_stack(pTHX_ AV * const unreferenced);
+#   define PERL_ARGS_ASSERT_UNREFERENCED_TO_TMP_STACK \
+        assert(unreferenced)
+
+# endif /* defined(USE_ITHREADS) */
+#endif /* defined(PERL_IN_SV_C) */
 #if defined(PERL_IN_TOKE_C)
-STATIC int     S_ao(pTHX_ int toketype);
-#define PERL_ARGS_ASSERT_AO
-STATIC void    S_check_uni(pTHX);
-#define PERL_ARGS_ASSERT_CHECK_UNI
-STATIC void    S_checkcomma(pTHX_ const char *s, const char *name, const char *what);
-#define PERL_ARGS_ASSERT_CHECKCOMMA    \
-       assert(s); assert(name); assert(what)
-STATIC char *  S_filter_gets(pTHX_ SV *sv, STRLEN append)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_FILTER_GETS   \
-       assert(sv)
-
-STATIC HV *    S_find_in_my_stash(pTHX_ const char *pkgname, STRLEN len)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_FIND_IN_MY_STASH      \
-       assert(pkgname)
-
-STATIC void    S_force_ident(pTHX_ const char *s, int kind);
-#define PERL_ARGS_ASSERT_FORCE_IDENT   \
-       assert(s)
-STATIC void    S_force_ident_maybe_lex(pTHX_ char pit);
-#define PERL_ARGS_ASSERT_FORCE_IDENT_MAYBE_LEX
-STATIC void    S_force_next(pTHX_ I32 type);
-#define PERL_ARGS_ASSERT_FORCE_NEXT
-STATIC char*   S_force_strict_version(pTHX_ char *s);
-#define PERL_ARGS_ASSERT_FORCE_STRICT_VERSION  \
-       assert(s)
-STATIC char*   S_force_version(pTHX_ char *s, int guessing);
-#define PERL_ARGS_ASSERT_FORCE_VERSION \
-       assert(s)
-STATIC char*   S_force_word(pTHX_ char *start, int token, int check_keyword, int allow_pack);
-#define PERL_ARGS_ASSERT_FORCE_WORD    \
-       assert(start)
-STATIC SV*     S_get_and_check_backslash_N_name_wrapper(pTHX_ const char* s, const char* const e)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_GET_AND_CHECK_BACKSLASH_N_NAME_WRAPPER        \
-       assert(s); assert(e)
-
-STATIC void    S_incline(pTHX_ const char *s, const char *end);
-#define PERL_ARGS_ASSERT_INCLINE       \
-       assert(s); assert(end)
-STATIC int     S_intuit_method(pTHX_ char *s, SV *ioname, CV *cv);
-#define PERL_ARGS_ASSERT_INTUIT_METHOD \
-       assert(s)
-STATIC int     S_intuit_more(pTHX_ char *s, char *e);
-#define PERL_ARGS_ASSERT_INTUIT_MORE   \
-       assert(s); assert(e)
-STATIC I32     S_lop(pTHX_ I32 f, U8 x, char *s);
-#define PERL_ARGS_ASSERT_LOP   \
-       assert(s)
-PERL_STATIC_NO_RET void        S_missingterm(pTHX_ char *s, STRLEN len)
-                       __attribute__noreturn__;
-#define PERL_ARGS_ASSERT_MISSINGTERM
-
-STATIC SV*     S_new_constant(pTHX_ const char *s, STRLEN len, const char *key, STRLEN keylen, SV *sv, SV *pv, const char *type, STRLEN typelen, const char ** error_msg);
-#define PERL_ARGS_ASSERT_NEW_CONSTANT  \
-       assert(key); assert(sv)
-STATIC void    S_no_op(pTHX_ const char *const what, char *s);
-#define PERL_ARGS_ASSERT_NO_OP \
-       assert(what)
-STATIC void    S_parse_ident(pTHX_ char **s, char **d, char * const e, int allow_package, bool is_utf8, bool check_dollar, bool tick_warn);
-#define PERL_ARGS_ASSERT_PARSE_IDENT   \
-       assert(s); assert(d); assert(e)
-STATIC int     S_pending_ident(pTHX);
-#define PERL_ARGS_ASSERT_PENDING_IDENT
-STATIC char*   S_scan_const(pTHX_ char *start)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_SCAN_CONST    \
-       assert(start)
-
-STATIC char*   S_scan_formline(pTHX_ char *s)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_SCAN_FORMLINE \
-       assert(s)
-
-STATIC char*   S_scan_heredoc(pTHX_ char *s)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_SCAN_HEREDOC  \
-       assert(s)
-
-STATIC char*   S_scan_ident(pTHX_ char *s, char *dest, STRLEN destlen, I32 ck_uni);
-#define PERL_ARGS_ASSERT_SCAN_IDENT    \
-       assert(s); assert(dest)
-STATIC char*   S_scan_inputsymbol(pTHX_ char *start)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_SCAN_INPUTSYMBOL      \
-       assert(start)
-
-STATIC char*   S_scan_pat(pTHX_ char *start, I32 type)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_SCAN_PAT      \
-       assert(start)
-
-STATIC char*   S_scan_subst(pTHX_ char *start)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_SCAN_SUBST    \
-       assert(start)
-
-STATIC char*   S_scan_trans(pTHX_ char *start)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_SCAN_TRANS    \
-       assert(start)
-
-STATIC I32     S_sublex_done(pTHX)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_SUBLEX_DONE
-
-STATIC I32     S_sublex_push(pTHX)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_SUBLEX_PUSH
-
-STATIC I32     S_sublex_start(pTHX)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_SUBLEX_START
-
-STATIC char*   S_swallow_bom(pTHX_ U8 *s)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_SWALLOW_BOM   \
-       assert(s)
-
-STATIC char *  S_tokenize_use(pTHX_ int is_use, char *s)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_TOKENIZE_USE  \
-       assert(s)
-
-STATIC SV*     S_tokeq(pTHX_ SV *sv);
-#define PERL_ARGS_ASSERT_TOKEQ \
-       assert(sv)
-STATIC void    S_update_debugger_info(pTHX_ SV *orig_sv, const char *const buf, STRLEN len);
-#define PERL_ARGS_ASSERT_UPDATE_DEBUGGER_INFO
-STATIC int     S_yywarn(pTHX_ const char *const s, U32 flags);
-#define PERL_ARGS_ASSERT_YYWARN        \
-       assert(s)
-#endif
+STATIC int
+S_ao(pTHX_ int toketype);
+# define PERL_ARGS_ASSERT_AO
+
+STATIC void
+S_check_uni(pTHX);
+# define PERL_ARGS_ASSERT_CHECK_UNI
+
+STATIC void
+S_checkcomma(pTHX_ const char *s, const char *name, const char *what);
+# define PERL_ARGS_ASSERT_CHECKCOMMA            \
+        assert(s); assert(name); assert(what)
+
+STATIC char *
+S_filter_gets(pTHX_ SV *sv, STRLEN append)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_FILTER_GETS           \
+        assert(sv)
+
+STATIC HV *
+S_find_in_my_stash(pTHX_ const char *pkgname, STRLEN len)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_FIND_IN_MY_STASH      \
+        assert(pkgname)
+
+STATIC void
+S_force_ident(pTHX_ const char *s, int kind);
+# define PERL_ARGS_ASSERT_FORCE_IDENT           \
+        assert(s)
+
+STATIC void
+S_force_ident_maybe_lex(pTHX_ char pit);
+# define PERL_ARGS_ASSERT_FORCE_IDENT_MAYBE_LEX
+
+STATIC void
+S_force_next(pTHX_ I32 type);
+# define PERL_ARGS_ASSERT_FORCE_NEXT
+
+STATIC char *
+S_force_strict_version(pTHX_ char *s);
+# define PERL_ARGS_ASSERT_FORCE_STRICT_VERSION  \
+        assert(s)
+
+STATIC char *
+S_force_version(pTHX_ char *s, int guessing);
+# define PERL_ARGS_ASSERT_FORCE_VERSION         \
+        assert(s)
+
+STATIC char *
+S_force_word(pTHX_ char *start, int token, int check_keyword, int allow_pack);
+# define PERL_ARGS_ASSERT_FORCE_WORD            \
+        assert(start)
+
+STATIC SV *
+S_get_and_check_backslash_N_name_wrapper(pTHX_ const char *s, const char * const e)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_GET_AND_CHECK_BACKSLASH_N_NAME_WRAPPER \
+        assert(s); assert(e)
+
+STATIC void
+S_incline(pTHX_ const char *s, const char *end);
+# define PERL_ARGS_ASSERT_INCLINE               \
+        assert(s); assert(end)
+
+STATIC int
+S_intuit_method(pTHX_ char *s, SV *ioname, CV *cv);
+# define PERL_ARGS_ASSERT_INTUIT_METHOD         \
+        assert(s)
+
+STATIC int
+S_intuit_more(pTHX_ char *s, char *e);
+# define PERL_ARGS_ASSERT_INTUIT_MORE           \
+        assert(s); assert(e)
+
+STATIC I32
+S_lop(pTHX_ I32 f, U8 x, char *s);
+# define PERL_ARGS_ASSERT_LOP                   \
+        assert(s)
+
+PERL_STATIC_NO_RET void
+S_missingterm(pTHX_ char *s, STRLEN len)
+        __attribute__noreturn__;
+# define PERL_ARGS_ASSERT_MISSINGTERM
+
+STATIC SV *
+S_new_constant(pTHX_ const char *s, STRLEN len, const char *key, STRLEN keylen, SV *sv, SV *pv, const char *type, STRLEN typelen, const char **error_msg);
+# define PERL_ARGS_ASSERT_NEW_CONSTANT          \
+        assert(key); assert(sv)
+
+STATIC void
+S_no_op(pTHX_ const char * const what, char *s);
+# define PERL_ARGS_ASSERT_NO_OP                 \
+        assert(what)
+
+STATIC void
+S_parse_ident(pTHX_ char **s, char **d, char * const e, int allow_package, bool is_utf8, bool check_dollar, bool tick_warn);
+# define PERL_ARGS_ASSERT_PARSE_IDENT           \
+        assert(s); assert(d); assert(e)
+
+STATIC int
+S_pending_ident(pTHX);
+# define PERL_ARGS_ASSERT_PENDING_IDENT
+
+STATIC char *
+S_scan_const(pTHX_ char *start)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_SCAN_CONST            \
+        assert(start)
+
+STATIC char *
+S_scan_formline(pTHX_ char *s)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_SCAN_FORMLINE         \
+        assert(s)
+
+STATIC char *
+S_scan_heredoc(pTHX_ char *s)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_SCAN_HEREDOC          \
+        assert(s)
+
+STATIC char *
+S_scan_ident(pTHX_ char *s, char *dest, STRLEN destlen, I32 ck_uni);
+# define PERL_ARGS_ASSERT_SCAN_IDENT            \
+        assert(s); assert(dest)
+
+STATIC char *
+S_scan_inputsymbol(pTHX_ char *start)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_SCAN_INPUTSYMBOL      \
+        assert(start)
+
+STATIC char *
+S_scan_pat(pTHX_ char *start, I32 type)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_SCAN_PAT              \
+        assert(start)
+
+STATIC char *
+S_scan_subst(pTHX_ char *start)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_SCAN_SUBST            \
+        assert(start)
+
+STATIC char *
+S_scan_trans(pTHX_ char *start)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_SCAN_TRANS            \
+        assert(start)
+
+STATIC I32
+S_sublex_done(pTHX)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_SUBLEX_DONE
+
+STATIC I32
+S_sublex_push(pTHX)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_SUBLEX_PUSH
+
+STATIC I32
+S_sublex_start(pTHX)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_SUBLEX_START
+
+STATIC char *
+S_swallow_bom(pTHX_ U8 *s)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_SWALLOW_BOM           \
+        assert(s)
+
+STATIC char *
+S_tokenize_use(pTHX_ int is_use, char *s)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_TOKENIZE_USE          \
+        assert(s)
+
+STATIC SV *
+S_tokeq(pTHX_ SV *sv);
+# define PERL_ARGS_ASSERT_TOKEQ                 \
+        assert(sv)
+
+STATIC void
+S_update_debugger_info(pTHX_ SV *orig_sv, const char * const buf, STRLEN len);
+# define PERL_ARGS_ASSERT_UPDATE_DEBUGGER_INFO
+
+STATIC int
+S_yywarn(pTHX_ const char * const s, U32 flags);
+# define PERL_ARGS_ASSERT_YYWARN                \
+        assert(s)
+
+# if defined(DEBUGGING)
+STATIC void
+S_printbuf(pTHX_ const char * const fmt, const char * const s)
+        __attribute__format__(__printf__,pTHX_1,0);
+#   define PERL_ARGS_ASSERT_PRINTBUF            \
+        assert(fmt); assert(s)
+
+STATIC int
+S_tokereport(pTHX_ I32 rv, const YYSTYPE *lvalp);
+#   define PERL_ARGS_ASSERT_TOKEREPORT          \
+        assert(lvalp)
+
+# endif /* defined(DEBUGGING) */
+# if defined(PERL_CR_FILTER)
+STATIC I32
+S_cr_textfilter(pTHX_ int idx, SV *sv, int maxlen);
+#   define PERL_ARGS_ASSERT_CR_TEXTFILTER
+
+STATIC void
+S_strip_return(pTHX_ SV *sv);
+#   define PERL_ARGS_ASSERT_STRIP_RETURN        \
+        assert(sv)
+
+# endif /* defined(PERL_CR_FILTER) */
+# if !defined(PERL_NO_UTF16_FILTER)
+STATIC U8 *
+S_add_utf16_textfilter(pTHX_ U8 * const s, bool reversed);
+#   define PERL_ARGS_ASSERT_ADD_UTF16_TEXTFILTER \
+        assert(s)
+
+STATIC I32
+S_utf16_textfilter(pTHX_ int idx, SV *sv, int maxlen);
+#   define PERL_ARGS_ASSERT_UTF16_TEXTFILTER    \
+        assert(sv)
+
+# endif /* !defined(PERL_NO_UTF16_FILTER) */
+#endif /* defined(PERL_IN_TOKE_C) */
 #if defined(PERL_IN_UNIVERSAL_C)
-STATIC bool    S_isa_lookup(pTHX_ HV *stash, SV *namesv, const char * name, STRLEN len, U32 flags);
-STATIC bool    S_sv_derived_from_svpvn(pTHX_ SV *sv, SV *namesv, const char * name, const STRLEN len, U32 flags);
-#endif
-#if defined(PERL_IN_UTF8_C)
-STATIC UV      S__to_utf8_case(pTHX_ const UV original, const U8 *p, U8* ustrp, STRLEN *lenp, SV *invlist, const I32 * const invmap, const U32 * const * const aux_tables, const U8 * const aux_table_lengths, const char * const normal);
-#define PERL_ARGS_ASSERT__TO_UTF8_CASE \
-       assert(ustrp); assert(lenp); assert(invlist); assert(invmap); assert(normal)
-STATIC UV      S_check_locale_boundary_crossing(pTHX_ const U8* const p, const UV result, U8* const ustrp, STRLEN *lenp)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_CHECK_LOCALE_BOUNDARY_CROSSING        \
-       assert(p); assert(ustrp); assert(lenp)
-
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE int S_does_utf8_overflow(const U8 * const s, const U8 * e, const bool consider_overlongs)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_DOES_UTF8_OVERFLOW    \
-       assert(s); assert(e)
-#endif
+STATIC bool
+S_isa_lookup(pTHX_ HV *stash, SV *namesv, const char *name, STRLEN len, U32 flags);
 
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE int S_isFF_overlong(const U8 * const s, const STRLEN len)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_ISFF_OVERLONG \
-       assert(s)
-#endif
+STATIC bool
+S_sv_derived_from_svpvn(pTHX_ SV *sv, SV *namesv, const char *name, const STRLEN len, U32 flags);
 
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE bool        S_is_utf8_common(pTHX_ const U8 *const p, const U8 *const e, SV* const invlist)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_IS_UTF8_COMMON        \
-       assert(p); assert(e)
-#endif
-
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE int S_is_utf8_overlong(const U8 * const s, const STRLEN len)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_IS_UTF8_OVERLONG      \
-       assert(s)
-#endif
-
-STATIC HV *    S_new_msg_hv(pTHX_ const char * const message, U32 categories, U32 flag)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_NEW_MSG_HV    \
-       assert(message)
-
-STATIC UV      S_to_case_cp_list(pTHX_ const UV original, const U32 ** const remaining_list, Size_t * remaining_count, SV *invlist, const I32 * const invmap, const U32 * const * const aux_tables, const U8 * const aux_table_lengths, const char * const normal);
-#define PERL_ARGS_ASSERT_TO_CASE_CP_LIST       \
-       assert(invlist); assert(invmap); assert(normal)
-STATIC U8      S_to_lower_latin1(const U8 c, U8 *p, STRLEN *lenp, const char dummy)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_TO_LOWER_LATIN1
-
-STATIC UV      S_turkic_fc(pTHX_ const U8 * const p, const U8 * const e, U8* ustrp, STRLEN *lenp);
-#define PERL_ARGS_ASSERT_TURKIC_FC     \
-       assert(p); assert(e); assert(ustrp); assert(lenp)
-STATIC UV      S_turkic_lc(pTHX_ const U8 * const p0, const U8 * const e, U8* ustrp, STRLEN *lenp);
-#define PERL_ARGS_ASSERT_TURKIC_LC     \
-       assert(p0); assert(e); assert(ustrp); assert(lenp)
-STATIC UV      S_turkic_uc(pTHX_ const U8 * const p, const U8 * const e, U8* ustrp, STRLEN *lenp);
-#define PERL_ARGS_ASSERT_TURKIC_UC     \
-       assert(p); assert(e); assert(ustrp); assert(lenp)
-STATIC char *  S_unexpected_non_continuation_text(pTHX_ const U8 * const s, STRLEN print_len, const STRLEN non_cont_byte_pos, const STRLEN expect_len)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_UNEXPECTED_NON_CONTINUATION_TEXT      \
-       assert(s)
-
-#endif
-#if defined(PERL_IN_UTF8_C) || defined(PERL_IN_PP_C)
-PERL_CALLCONV UV       Perl__to_upper_title_latin1(pTHX_ const U8 c, U8 *p, STRLEN *lenp, const char S_or_s);
-#define PERL_ARGS_ASSERT__TO_UPPER_TITLE_LATIN1        \
-       assert(p); assert(lenp)
 #endif
+#if defined(PERL_IN_UTF8_C)
+STATIC UV
+S__to_utf8_case(pTHX_ const UV original, const U8 *p, U8 *ustrp, STRLEN *lenp, SV *invlist, const I32 * const invmap, const U32 * const * const aux_tables, const U8 * const aux_table_lengths, const char * const normal);
+# define PERL_ARGS_ASSERT__TO_UTF8_CASE         \
+        assert(ustrp); assert(lenp); assert(invlist); assert(invmap); assert(normal)
+
+STATIC UV
+S_check_locale_boundary_crossing(pTHX_ const U8 * const p, const UV result, U8 * const ustrp, STRLEN *lenp)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_CHECK_LOCALE_BOUNDARY_CROSSING \
+        assert(p); assert(ustrp); assert(lenp)
+
+STATIC HV *
+S_new_msg_hv(pTHX_ const char * const message, U32 categories, U32 flag)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_NEW_MSG_HV            \
+        assert(message)
+
+STATIC UV
+S_to_case_cp_list(pTHX_ const UV original, const U32 ** const remaining_list, Size_t *remaining_count, SV *invlist, const I32 * const invmap, const U32 * const * const aux_tables, const U8 * const aux_table_lengths, const char * const normal);
+# define PERL_ARGS_ASSERT_TO_CASE_CP_LIST       \
+        assert(invlist); assert(invmap); assert(normal)
+
+STATIC U8
+S_to_lower_latin1(const U8 c, U8 *p, STRLEN *lenp, const char dummy)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_TO_LOWER_LATIN1
+
+STATIC UV
+S_turkic_fc(pTHX_ const U8 * const p, const U8 * const e, U8 *ustrp, STRLEN *lenp);
+# define PERL_ARGS_ASSERT_TURKIC_FC             \
+        assert(p); assert(e); assert(ustrp); assert(lenp)
+
+STATIC UV
+S_turkic_lc(pTHX_ const U8 * const p0, const U8 * const e, U8 *ustrp, STRLEN *lenp);
+# define PERL_ARGS_ASSERT_TURKIC_LC             \
+        assert(p0); assert(e); assert(ustrp); assert(lenp)
+
+STATIC UV
+S_turkic_uc(pTHX_ const U8 * const p, const U8 * const e, U8 *ustrp, STRLEN *lenp);
+# define PERL_ARGS_ASSERT_TURKIC_UC             \
+        assert(p); assert(e); assert(ustrp); assert(lenp)
+
+STATIC char *
+S_unexpected_non_continuation_text(pTHX_ const U8 * const s, STRLEN print_len, const STRLEN non_cont_byte_pos, const STRLEN expect_len)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_UNEXPECTED_NON_CONTINUATION_TEXT \
+        assert(s)
+
+# if 0
+STATIC void
+S_warn_on_first_deprecated_use(pTHX_ U32 category, const char * const name, const char * const alternative, const bool use_locale, const char * const file, const unsigned line);
+#   define PERL_ARGS_ASSERT_WARN_ON_FIRST_DEPRECATED_USE \
+        assert(name); assert(alternative); assert(file)
+
+# endif
+# if !defined(PERL_NO_INLINE_FUNCTIONS)
+PERL_STATIC_INLINE int
+S_does_utf8_overflow(const U8 * const s, const U8 *e, const bool consider_overlongs)
+        __attribute__warn_unused_result__;
+#   define PERL_ARGS_ASSERT_DOES_UTF8_OVERFLOW  \
+        assert(s); assert(e)
+
+PERL_STATIC_INLINE int
+S_isFF_overlong(const U8 * const s, const STRLEN len)
+        __attribute__warn_unused_result__;
+#   define PERL_ARGS_ASSERT_ISFF_OVERLONG       \
+        assert(s)
+
+PERL_STATIC_INLINE bool
+S_is_utf8_common(pTHX_ const U8 * const p, const U8 * const e, SV * const invlist)
+        __attribute__warn_unused_result__;
+#   define PERL_ARGS_ASSERT_IS_UTF8_COMMON      \
+        assert(p); assert(e)
+
+PERL_STATIC_INLINE int
+S_is_utf8_overlong(const U8 * const s, const STRLEN len)
+        __attribute__warn_unused_result__;
+#   define PERL_ARGS_ASSERT_IS_UTF8_OVERLONG    \
+        assert(s)
+
+# endif /* !defined(PERL_NO_INLINE_FUNCTIONS) */
+#endif /* defined(PERL_IN_UTF8_C) */
 #if defined(PERL_IN_UTIL_C)
-STATIC bool    S_ckwarn_common(pTHX_ U32 w);
-#define PERL_ARGS_ASSERT_CKWARN_COMMON
-STATIC bool    S_invoke_exception_hook(pTHX_ SV *ex, bool warn);
-#define PERL_ARGS_ASSERT_INVOKE_EXCEPTION_HOOK
-STATIC SV*     S_mess_alloc(pTHX);
-#define PERL_ARGS_ASSERT_MESS_ALLOC
-STATIC SV *    S_with_queued_errors(pTHX_ SV *ex);
-#define PERL_ARGS_ASSERT_WITH_QUEUED_ERRORS    \
-       assert(ex)
-STATIC void    S_xs_version_bootcheck(pTHX_ U32 items, U32 ax, const char *xs_p, STRLEN xs_len);
-#define PERL_ARGS_ASSERT_XS_VERSION_BOOTCHECK  \
-       assert(xs_p)
-#  if defined(PERL_MEM_LOG) && !defined(PERL_MEM_LOG_NOIMPL)
-STATIC void    S_mem_log_common(enum mem_log_type mlt, const UV n, const UV typesize, const char *type_name, const SV *sv, Malloc_t oldalloc, Malloc_t newalloc, const char *filename, const int linenumber, const char *funcname);
-#define PERL_ARGS_ASSERT_MEM_LOG_COMMON        \
-       assert(type_name); assert(filename); assert(funcname)
-#  endif
-#endif
+STATIC bool
+S_ckwarn_common(pTHX_ U32 w);
+# define PERL_ARGS_ASSERT_CKWARN_COMMON
+
+STATIC SV *
+S_mess_alloc(pTHX);
+# define PERL_ARGS_ASSERT_MESS_ALLOC
+
+STATIC SV *
+S_with_queued_errors(pTHX_ SV *ex);
+# define PERL_ARGS_ASSERT_WITH_QUEUED_ERRORS    \
+        assert(ex)
+
+STATIC void
+S_xs_version_bootcheck(pTHX_ U32 items, U32 ax, const char *xs_p, STRLEN xs_len);
+# define PERL_ARGS_ASSERT_XS_VERSION_BOOTCHECK  \
+        assert(xs_p)
+
+# if defined(PERL_MEM_LOG) && !defined(PERL_MEM_LOG_NOIMPL)
+STATIC void
+S_mem_log_common(enum mem_log_type mlt, const UV n, const UV typesize, const char *type_name, const SV *sv, Malloc_t oldalloc, Malloc_t newalloc, const char *filename, const int linenumber, const char *funcname);
+#   define PERL_ARGS_ASSERT_MEM_LOG_COMMON      \
+        assert(type_name); assert(filename); assert(funcname)
+
+# endif
+# if !defined(PERL_NO_INLINE_FUNCTIONS)
+PERL_STATIC_INLINE U32
+S_ptr_hash(PTRV u);
+#   define PERL_ARGS_ASSERT_PTR_HASH
+
+# endif
+# if defined(PERL_USES_PL_PIDSTATUS)
+STATIC void
+S_pidgone(pTHX_ Pid_t pid, int status);
+#   define PERL_ARGS_ASSERT_PIDGONE
+
+# endif
+#endif /* defined(PERL_IN_UTIL_C) */
 #if defined(PERL_MEM_LOG)
-PERL_CALLCONV Malloc_t Perl_mem_log_alloc(const UV nconst, UV typesize, const char *type_name, Malloc_t newalloc, const char *filename, const int linenumber, const char *funcname);
-#define PERL_ARGS_ASSERT_MEM_LOG_ALLOC \
-       assert(type_name); assert(filename); assert(funcname)
-PERL_CALLCONV void     Perl_mem_log_del_sv(const SV *sv, const char *filename, int linenumber, const char *funcname);
-#define PERL_ARGS_ASSERT_MEM_LOG_DEL_SV        \
-       assert(sv); assert(filename); assert(funcname)
-PERL_CALLCONV Malloc_t Perl_mem_log_free(Malloc_t oldalloc, const char *filename, const int linenumber, const char *funcname);
-#define PERL_ARGS_ASSERT_MEM_LOG_FREE  \
-       assert(filename); assert(funcname)
-PERL_CALLCONV void     Perl_mem_log_new_sv(const SV *sv, const char *filename, int linenumber, const char *funcname);
-#define PERL_ARGS_ASSERT_MEM_LOG_NEW_SV        \
-       assert(sv); assert(filename); assert(funcname)
-PERL_CALLCONV Malloc_t Perl_mem_log_realloc(const UV n, const UV typesize, const char *type_name, Malloc_t oldalloc, Malloc_t newalloc, const char *filename, const int linenumber, const char *funcname);
-#define PERL_ARGS_ASSERT_MEM_LOG_REALLOC       \
-       assert(type_name); assert(filename); assert(funcname)
-#endif
-#if defined(PERL_USES_PL_PIDSTATUS) && defined(PERL_IN_UTIL_C)
-STATIC void    S_pidgone(pTHX_ Pid_t pid, int status);
-#define PERL_ARGS_ASSERT_PIDGONE
-#endif
+PERL_CALLCONV Malloc_t
+Perl_mem_log_alloc(const UV nconst, UV typesize, const char *type_name, Malloc_t newalloc, const char *filename, const int linenumber, const char *funcname);
+# define PERL_ARGS_ASSERT_MEM_LOG_ALLOC         \
+        assert(type_name); assert(filename); assert(funcname)
+
+PERL_CALLCONV void
+Perl_mem_log_del_sv(const SV *sv, const char *filename, int linenumber, const char *funcname);
+# define PERL_ARGS_ASSERT_MEM_LOG_DEL_SV        \
+        assert(sv); assert(filename); assert(funcname)
+
+PERL_CALLCONV Malloc_t
+Perl_mem_log_free(Malloc_t oldalloc, const char *filename, const int linenumber, const char *funcname);
+# define PERL_ARGS_ASSERT_MEM_LOG_FREE          \
+        assert(filename); assert(funcname)
+
+PERL_CALLCONV void
+Perl_mem_log_new_sv(const SV *sv, const char *filename, int linenumber, const char *funcname);
+# define PERL_ARGS_ASSERT_MEM_LOG_NEW_SV        \
+        assert(sv); assert(filename); assert(funcname)
+
+PERL_CALLCONV Malloc_t
+Perl_mem_log_realloc(const UV n, const UV typesize, const char *type_name, Malloc_t oldalloc, Malloc_t newalloc, const char *filename, const int linenumber, const char *funcname);
+# define PERL_ARGS_ASSERT_MEM_LOG_REALLOC       \
+        assert(type_name); assert(filename); assert(funcname)
+
+#endif /* defined(PERL_MEM_LOG) */
+#if !defined(PERL_NO_INLINE_FUNCTIONS)
+PERL_STATIC_INLINE I32 *
+Perl_CvDEPTH(const CV * const sv);
+# define PERL_ARGS_ASSERT_CVDEPTH               \
+        assert(sv)
+
+PERL_STATIC_INLINE GV *
+Perl_CvGV(pTHX_ CV *sv);
+# define PERL_ARGS_ASSERT_CVGV                  \
+        assert(sv)
+
+PERL_STATIC_INLINE I32
+Perl_POPMARK(pTHX);
+# define PERL_ARGS_ASSERT_POPMARK
+
+PERL_STATIC_INLINE struct regexp *
+Perl_ReANY(const REGEXP * const re);
+# define PERL_ARGS_ASSERT_REANY                 \
+        assert(re)
+
+PERL_STATIC_INLINE void
+Perl_SvAMAGIC_off(SV *sv);
+# define PERL_ARGS_ASSERT_SVAMAGIC_OFF          \
+        assert(sv)
+
+PERL_STATIC_INLINE void
+Perl_SvAMAGIC_on(SV *sv);
+# define PERL_ARGS_ASSERT_SVAMAGIC_ON           \
+        assert(sv)
+
+PERL_STATIC_INLINE void
+Perl_SvGETMAGIC(pTHX_ SV *sv);
+# define PERL_ARGS_ASSERT_SVGETMAGIC            \
+        assert(sv)
+
+PERL_STATIC_INLINE IV
+Perl_SvIV(pTHX_ SV *sv);
+# define PERL_ARGS_ASSERT_SVIV                  \
+        assert(sv)
+
+PERL_STATIC_INLINE IV
+Perl_SvIV_nomg(pTHX_ SV *sv);
+# define PERL_ARGS_ASSERT_SVIV_NOMG             \
+        assert(sv)
+
+PERL_STATIC_INLINE NV
+Perl_SvNV(pTHX_ SV *sv);
+# define PERL_ARGS_ASSERT_SVNV                  \
+        assert(sv)
+
+PERL_STATIC_INLINE NV
+Perl_SvNV_nomg(pTHX_ SV *sv);
+# define PERL_ARGS_ASSERT_SVNV_NOMG             \
+        assert(sv)
+
+PERL_STATIC_FORCE_INLINE bool
+Perl_SvPVXtrue(pTHX_ SV *sv)
+        __attribute__always_inline__;
+# define PERL_ARGS_ASSERT_SVPVXTRUE             \
+        assert(sv)
+
+PERL_STATIC_INLINE void
+Perl_SvREFCNT_dec(pTHX_ SV *sv);
+# define PERL_ARGS_ASSERT_SVREFCNT_DEC
+
+PERL_STATIC_INLINE void
+Perl_SvREFCNT_dec_NN(pTHX_ SV *sv);
+# define PERL_ARGS_ASSERT_SVREFCNT_DEC_NN       \
+        assert(sv)
+
+PERL_STATIC_INLINE SV *
+Perl_SvREFCNT_dec_ret_NULL(pTHX_ SV *sv);
+# define PERL_ARGS_ASSERT_SVREFCNT_DEC_RET_NULL
+
+PERL_STATIC_INLINE SV *
+Perl_SvREFCNT_inc(SV *sv);
+# define PERL_ARGS_ASSERT_SVREFCNT_INC
+
+PERL_STATIC_INLINE SV *
+Perl_SvREFCNT_inc_NN(SV *sv);
+# define PERL_ARGS_ASSERT_SVREFCNT_INC_NN       \
+        assert(sv)
+
+PERL_STATIC_INLINE void
+Perl_SvREFCNT_inc_void(SV *sv);
+# define PERL_ARGS_ASSERT_SVREFCNT_INC_VOID
+
+PERL_STATIC_INLINE bool
+Perl_SvTRUE(pTHX_ SV *sv);
+# define PERL_ARGS_ASSERT_SVTRUE
+
+PERL_STATIC_INLINE bool
+Perl_SvTRUE_NN(pTHX_ SV *sv);
+# define PERL_ARGS_ASSERT_SVTRUE_NN             \
+        assert(sv)
+
+PERL_STATIC_INLINE bool
+Perl_SvTRUE_common(pTHX_ SV *sv, const bool sv_2bool_is_fallback);
+# define PERL_ARGS_ASSERT_SVTRUE_COMMON         \
+        assert(sv)
+
+PERL_STATIC_INLINE bool
+Perl_SvTRUE_nomg(pTHX_ SV *sv);
+# define PERL_ARGS_ASSERT_SVTRUE_NOMG
+
+PERL_STATIC_INLINE UV
+Perl_SvUV(pTHX_ SV *sv);
+# define PERL_ARGS_ASSERT_SVUV                  \
+        assert(sv)
+
+PERL_STATIC_INLINE UV
+Perl_SvUV_nomg(pTHX_ SV *sv);
+# define PERL_ARGS_ASSERT_SVUV_NOMG             \
+        assert(sv)
+
+PERL_STATIC_INLINE I32
+Perl_TOPMARK(pTHX);
+# define PERL_ARGS_ASSERT_TOPMARK
+
+PERL_STATIC_INLINE void
+Perl_append_utf8_from_native_byte(const U8 byte, U8 **dest);
+# define PERL_ARGS_ASSERT_APPEND_UTF8_FROM_NATIVE_BYTE \
+        assert(dest)
+
+PERL_STATIC_INLINE Size_t
+Perl_av_count(pTHX_ AV *av)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_AV_COUNT              \
+        assert(av)
+
+PERL_STATIC_INLINE SV **
+Perl_av_fetch_simple(pTHX_ AV *av, SSize_t key, I32 lval)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_AV_FETCH_SIMPLE       \
+        assert(av)
+
+PERL_STATIC_INLINE AV *
+Perl_av_new_alloc(pTHX_ SSize_t size, bool zeroflag)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_AV_NEW_ALLOC
+
+PERL_STATIC_INLINE void
+Perl_av_push_simple(pTHX_ AV *av, SV *val);
+# define PERL_ARGS_ASSERT_AV_PUSH_SIMPLE        \
+        assert(av); assert(val)
+
+PERL_STATIC_INLINE SV **
+Perl_av_store_simple(pTHX_ AV *av, SSize_t key, SV *val);
+# define PERL_ARGS_ASSERT_AV_STORE_SIMPLE       \
+        assert(av)
+
+PERL_STATIC_INLINE I32
+Perl_foldEQ(pTHX_ const char *a, const char *b, I32 len);
+# define PERL_ARGS_ASSERT_FOLDEQ                \
+        assert(a); assert(b)
+
+PERL_STATIC_INLINE I32
+Perl_foldEQ_latin1(pTHX_ const char *a, const char *b, I32 len);
+# define PERL_ARGS_ASSERT_FOLDEQ_LATIN1         \
+        assert(a); assert(b)
+
+PERL_STATIC_INLINE I32
+Perl_foldEQ_locale(pTHX_ const char *a, const char *b, I32 len);
+# define PERL_ARGS_ASSERT_FOLDEQ_LOCALE         \
+        assert(a); assert(b)
+
+PERL_STATIC_INLINE MGVTBL *
+Perl_get_vtbl(pTHX_ int vtbl_id)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_GET_VTBL
+
+PERL_STATIC_INLINE Size_t
+Perl_isC9_STRICT_UTF8_CHAR(const U8 * const s0, const U8 * const e)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_ISC9_STRICT_UTF8_CHAR \
+        assert(s0); assert(e)
+
+PERL_STATIC_INLINE Size_t
+Perl_isSTRICT_UTF8_CHAR(const U8 * const s0, const U8 * const e)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_ISSTRICT_UTF8_CHAR    \
+        assert(s0); assert(e)
+
+PERL_STATIC_INLINE Size_t
+Perl_isUTF8_CHAR(const U8 * const s0, const U8 * const e)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_ISUTF8_CHAR           \
+        assert(s0); assert(e)
+
+PERL_STATIC_INLINE Size_t
+Perl_isUTF8_CHAR_flags(const U8 * const s0, const U8 * const e, const U32 flags)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_ISUTF8_CHAR_FLAGS     \
+        assert(s0); assert(e)
+
+PERL_STATIC_INLINE bool
+Perl_is_c9strict_utf8_string_loclen(const U8 *s, STRLEN len, const U8 **ep, STRLEN *el);
+# define PERL_ARGS_ASSERT_IS_C9STRICT_UTF8_STRING_LOCLEN \
+        assert(s)
+
+PERL_STATIC_INLINE bool
+Perl_is_safe_syscall(pTHX_ const char *pv, STRLEN len, const char *what, const char *op_name)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_IS_SAFE_SYSCALL       \
+        assert(pv); assert(what); assert(op_name)
+
+PERL_STATIC_INLINE bool
+Perl_is_strict_utf8_string_loclen(const U8 *s, STRLEN len, const U8 **ep, STRLEN *el);
+# define PERL_ARGS_ASSERT_IS_STRICT_UTF8_STRING_LOCLEN \
+        assert(s)
+
+PERL_STATIC_INLINE bool
+Perl_is_utf8_fixed_width_buf_loclen_flags(const U8 * const s, STRLEN len, const U8 **ep, STRLEN *el, const U32 flags);
+# define PERL_ARGS_ASSERT_IS_UTF8_FIXED_WIDTH_BUF_LOCLEN_FLAGS \
+        assert(s)
+
+PERL_STATIC_INLINE bool
+Perl_is_utf8_invariant_string_loc(const U8 * const s, STRLEN len, const U8 **ep)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_IS_UTF8_INVARIANT_STRING_LOC \
+        assert(s)
+
+PERL_STATIC_INLINE bool
+Perl_is_utf8_string_flags(const U8 *s, STRLEN len, const U32 flags)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_IS_UTF8_STRING_FLAGS  \
+        assert(s)
+
+PERL_STATIC_INLINE bool
+Perl_is_utf8_string_loclen(const U8 *s, STRLEN len, const U8 **ep, STRLEN *el);
+# define PERL_ARGS_ASSERT_IS_UTF8_STRING_LOCLEN \
+        assert(s)
+
+PERL_STATIC_INLINE bool
+Perl_is_utf8_string_loclen_flags(const U8 *s, STRLEN len, const U8 **ep, STRLEN *el, const U32 flags);
+# define PERL_ARGS_ASSERT_IS_UTF8_STRING_LOCLEN_FLAGS \
+        assert(s)
+
+PERL_STATIC_INLINE bool
+Perl_is_utf8_valid_partial_char_flags(const U8 * const s0, const U8 * const e, const U32 flags)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_IS_UTF8_VALID_PARTIAL_CHAR_FLAGS \
+        assert(s0); assert(e)
+
+PERL_STATIC_INLINE unsigned
+Perl_lsbit_pos32(U32 word)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_LSBIT_POS32
+
+PERL_STATIC_INLINE char *
+Perl_mortal_getenv(const char *str)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_MORTAL_GETENV         \
+        assert(str)
+
+PERL_STATIC_INLINE unsigned
+Perl_msbit_pos32(U32 word)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_MSBIT_POS32
+
+PERL_STATIC_INLINE OP *
+Perl_newPADxVOP(pTHX_ I32 type, I32 flags, PADOFFSET padix)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_NEWPADXVOP
+
+PERL_STATIC_INLINE SV *
+Perl_newRV_noinc(pTHX_ SV * const tmpRef)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_NEWRV_NOINC           \
+        assert(tmpRef)
+
+PERL_STATIC_INLINE SV *
+Perl_newSV_type(pTHX_ const svtype type)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_NEWSV_TYPE
+
+PERL_STATIC_FORCE_INLINE SV *
+Perl_newSV_type_mortal(pTHX_ const svtype type)
+        __attribute__warn_unused_result__
+        __attribute__always_inline__;
+# define PERL_ARGS_ASSERT_NEWSV_TYPE_MORTAL
+
+PERL_STATIC_INLINE char *
+Perl_savepv(pTHX_ const char *pv)
+        __attribute__malloc__
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_SAVEPV
+
+PERL_STATIC_INLINE char *
+Perl_savepvn(pTHX_ const char *pv, Size_t len)
+        __attribute__malloc__
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_SAVEPVN
+
+PERL_STATIC_INLINE char *
+Perl_savesharedsvpv(pTHX_ SV *sv)
+        __attribute__malloc__
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_SAVESHAREDSVPV        \
+        assert(sv)
+
+PERL_STATIC_INLINE char *
+Perl_savesvpv(pTHX_ SV *sv)
+        __attribute__malloc__
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_SAVESVPV              \
+        assert(sv)
+
+PERL_STATIC_INLINE unsigned
+Perl_single_1bit_pos32(U32 word)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_SINGLE_1BIT_POS32
+
+PERL_STATIC_INLINE bool
+Perl_sv_only_taint_gmagic(SV *sv);
+# define PERL_ARGS_ASSERT_SV_ONLY_TAINT_GMAGIC  \
+        assert(sv)
+
+PERL_STATIC_INLINE char *
+Perl_sv_pvbyten_force_wrapper(pTHX_ SV * const sv, STRLEN * const lp, const U32 dummy);
+# define PERL_ARGS_ASSERT_SV_PVBYTEN_FORCE_WRAPPER \
+        assert(sv)
+
+PERL_STATIC_INLINE char *
+Perl_sv_pvutf8n_force_wrapper(pTHX_ SV * const sv, STRLEN * const lp, const U32 dummy);
+# define PERL_ARGS_ASSERT_SV_PVUTF8N_FORCE_WRAPPER \
+        assert(sv)
+
+PERL_STATIC_INLINE char  *
+Perl_sv_setpv_freshbuf(pTHX_ SV * const sv);
+# define PERL_ARGS_ASSERT_SV_SETPV_FRESHBUF     \
+        assert(sv)
+
+PERL_STATIC_INLINE IV
+Perl_utf8_distance(pTHX_ const U8 *a, const U8 *b)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_UTF8_DISTANCE         \
+        assert(a); assert(b)
+
+PERL_STATIC_INLINE U8 *
+Perl_utf8_hop(const U8 *s, SSize_t off)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_UTF8_HOP              \
+        assert(s)
+
+PERL_STATIC_INLINE U8 *
+Perl_utf8_hop_back(const U8 *s, SSize_t off, const U8 *start)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_UTF8_HOP_BACK         \
+        assert(s); assert(start)
+
+PERL_STATIC_INLINE U8 *
+Perl_utf8_hop_forward(const U8 *s, SSize_t off, const U8 *end)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_UTF8_HOP_FORWARD      \
+        assert(s); assert(end)
+
+PERL_STATIC_INLINE U8 *
+Perl_utf8_hop_safe(const U8 *s, SSize_t off, const U8 *start, const U8 *end)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_UTF8_HOP_SAFE         \
+        assert(s); assert(start); assert(end)
+
+PERL_STATIC_INLINE UV
+Perl_utf8_to_uvchr_buf_helper(pTHX_ const U8 *s, const U8 *send, STRLEN *retlen);
+# define PERL_ARGS_ASSERT_UTF8_TO_UVCHR_BUF_HELPER \
+        assert(s); assert(send)
+
+PERL_STATIC_INLINE UV
+Perl_utf8n_to_uvchr_msgs(const U8 *s, STRLEN curlen, STRLEN *retlen, const U32 flags, U32 *errors, AV **msgs);
+# define PERL_ARGS_ASSERT_UTF8N_TO_UVCHR_MSGS   \
+        assert(s)
+
+PERL_STATIC_INLINE UV
+Perl_valid_utf8_to_uvchr(const U8 *s, STRLEN *retlen)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_VALID_UTF8_TO_UVCHR   \
+        assert(s)
+
+PERL_STATIC_INLINE void
+Perl_cx_popblock(pTHX_ PERL_CONTEXT *cx);
+# define PERL_ARGS_ASSERT_CX_POPBLOCK           \
+        assert(cx)
+
+PERL_STATIC_INLINE void
+Perl_cx_popeval(pTHX_ PERL_CONTEXT *cx);
+# define PERL_ARGS_ASSERT_CX_POPEVAL            \
+        assert(cx)
+
+PERL_STATIC_INLINE void
+Perl_cx_popformat(pTHX_ PERL_CONTEXT *cx);
+# define PERL_ARGS_ASSERT_CX_POPFORMAT          \
+        assert(cx)
+
+PERL_STATIC_INLINE void
+Perl_cx_popgiven(pTHX_ PERL_CONTEXT *cx);
+# define PERL_ARGS_ASSERT_CX_POPGIVEN           \
+        assert(cx)
+
+PERL_STATIC_INLINE void
+Perl_cx_poploop(pTHX_ PERL_CONTEXT *cx);
+# define PERL_ARGS_ASSERT_CX_POPLOOP            \
+        assert(cx)
+
+PERL_STATIC_INLINE void
+Perl_cx_popsub(pTHX_ PERL_CONTEXT *cx);
+# define PERL_ARGS_ASSERT_CX_POPSUB             \
+        assert(cx)
+
+PERL_STATIC_INLINE void
+Perl_cx_popsub_args(pTHX_ PERL_CONTEXT *cx);
+# define PERL_ARGS_ASSERT_CX_POPSUB_ARGS        \
+        assert(cx)
+
+PERL_STATIC_INLINE void
+Perl_cx_popsub_common(pTHX_ PERL_CONTEXT *cx);
+# define PERL_ARGS_ASSERT_CX_POPSUB_COMMON      \
+        assert(cx)
+
+PERL_STATIC_INLINE void
+Perl_cx_popwhen(pTHX_ PERL_CONTEXT *cx);
+# define PERL_ARGS_ASSERT_CX_POPWHEN            \
+        assert(cx)
+
+PERL_STATIC_INLINE PERL_CONTEXT *
+Perl_cx_pushblock(pTHX_ U8 type, U8 gimme, SV **sp, I32 saveix);
+# define PERL_ARGS_ASSERT_CX_PUSHBLOCK          \
+        assert(sp)
+
+PERL_STATIC_INLINE void
+Perl_cx_pusheval(pTHX_ PERL_CONTEXT *cx, OP *retop, SV *namesv);
+# define PERL_ARGS_ASSERT_CX_PUSHEVAL           \
+        assert(cx)
+
+PERL_STATIC_INLINE void
+Perl_cx_pushformat(pTHX_ PERL_CONTEXT *cx, CV *cv, OP *retop, GV *gv);
+# define PERL_ARGS_ASSERT_CX_PUSHFORMAT         \
+        assert(cx); assert(cv)
+
+PERL_STATIC_INLINE void
+Perl_cx_pushgiven(pTHX_ PERL_CONTEXT *cx, SV *orig_defsv);
+# define PERL_ARGS_ASSERT_CX_PUSHGIVEN          \
+        assert(cx)
+
+PERL_STATIC_INLINE void
+Perl_cx_pushloop_for(pTHX_ PERL_CONTEXT *cx, void *itervarp, SV *itersave);
+# define PERL_ARGS_ASSERT_CX_PUSHLOOP_FOR       \
+        assert(cx); assert(itervarp)
+
+PERL_STATIC_INLINE void
+Perl_cx_pushloop_plain(pTHX_ PERL_CONTEXT *cx);
+# define PERL_ARGS_ASSERT_CX_PUSHLOOP_PLAIN     \
+        assert(cx)
+
+PERL_STATIC_INLINE void
+Perl_cx_pushsub(pTHX_ PERL_CONTEXT *cx, CV *cv, OP *retop, bool hasargs);
+# define PERL_ARGS_ASSERT_CX_PUSHSUB            \
+        assert(cx); assert(cv)
+
+PERL_STATIC_INLINE void
+Perl_cx_pushtry(pTHX_ PERL_CONTEXT *cx, OP *retop);
+# define PERL_ARGS_ASSERT_CX_PUSHTRY            \
+        assert(cx)
+
+PERL_STATIC_INLINE void
+Perl_cx_pushwhen(pTHX_ PERL_CONTEXT *cx);
+# define PERL_ARGS_ASSERT_CX_PUSHWHEN           \
+        assert(cx)
+
+PERL_STATIC_INLINE void
+Perl_cx_topblock(pTHX_ PERL_CONTEXT *cx);
+# define PERL_ARGS_ASSERT_CX_TOPBLOCK           \
+        assert(cx)
+
+PERL_STATIC_INLINE U8
+Perl_gimme_V(pTHX);
+# define PERL_ARGS_ASSERT_GIMME_V
+
+# if !defined(HAS_STRLCAT)
+PERL_STATIC_INLINE Size_t
+Perl_my_strlcat(char *dst, const char *src, Size_t size);
+#   define PERL_ARGS_ASSERT_MY_STRLCAT
+
+# endif
+# if !defined(HAS_STRNLEN)
+PERL_STATIC_INLINE Size_t
+Perl_my_strnlen(const char *str, Size_t maxlen);
+#   define PERL_ARGS_ASSERT_MY_STRNLEN          \
+        assert(str)
+
+# endif
+# if defined(PERL_CORE) || defined(PERL_EXT)
+PERL_STATIC_INLINE bool
+Perl_is_utf8_non_invariant_string(const U8 * const s, STRLEN len)
+        __attribute__warn_unused_result__;
+#   define PERL_ARGS_ASSERT_IS_UTF8_NON_INVARIANT_STRING \
+        assert(s)
+
+PERL_STATIC_INLINE STRLEN
+S_sv_or_pv_pos_u2b(pTHX_ SV *sv, const char *pv, STRLEN pos, STRLEN *lenp);
+#   define PERL_ARGS_ASSERT_SV_OR_PV_POS_U2B    \
+        assert(sv); assert(pv)
+
+PERL_STATIC_INLINE Size_t
+S_variant_under_utf8_count(const U8 * const s, const U8 * const e)
+        __attribute__warn_unused_result__;
+#   define PERL_ARGS_ASSERT_VARIANT_UNDER_UTF8_COUNT \
+        assert(s); assert(e)
+
+#   if !defined(HAS_MEMRCHR)
+PERL_STATIC_INLINE void *
+S_my_memrchr(const char *s, const char c, const STRLEN len);
+#     define PERL_ARGS_ASSERT_MY_MEMRCHR        \
+        assert(s)
+
+#   endif
+# endif /* defined(PERL_CORE) || defined(PERL_EXT) */
+# if defined(PERL_IN_DOOP_C)    || defined(PERL_IN_OP_C)        || \
+     defined(PERL_IN_PP_C)      || defined(PERL_IN_REGCOMP_ANY) || \
+     defined(PERL_IN_REGEXEC_C) || defined(PERL_IN_TOKE_C)      || \
+     defined(PERL_IN_UTF8_C)
+PERL_STATIC_INLINE bool
+S__invlist_contains_cp(SV * const invlist, const UV cp)
+        __attribute__warn_unused_result__;
+#   define PERL_ARGS_ASSERT__INVLIST_CONTAINS_CP \
+        assert(invlist)
+
+PERL_STATIC_INLINE UV
+S__invlist_len(SV * const invlist)
+        __attribute__warn_unused_result__;
+#   define PERL_ARGS_ASSERT__INVLIST_LEN        \
+        assert(invlist)
+
+PERL_STATIC_INLINE bool *
+S_get_invlist_offset_addr(SV *invlist)
+        __attribute__warn_unused_result__;
+#   define PERL_ARGS_ASSERT_GET_INVLIST_OFFSET_ADDR \
+        assert(invlist)
+
+PERL_STATIC_INLINE UV *
+S_invlist_array(SV * const invlist)
+        __attribute__warn_unused_result__;
+#   define PERL_ARGS_ASSERT_INVLIST_ARRAY       \
+        assert(invlist)
+
+PERL_STATIC_INLINE bool
+S_is_invlist(const SV * const invlist)
+        __attribute__warn_unused_result__;
+#   define PERL_ARGS_ASSERT_IS_INVLIST
+
+# endif /* defined(PERL_IN_DOOP_C)    || defined(PERL_IN_OP_C)        ||
+           defined(PERL_IN_PP_C)      || defined(PERL_IN_REGCOMP_ANY) ||
+           defined(PERL_IN_REGEXEC_C) || defined(PERL_IN_TOKE_C)      ||
+           defined(PERL_IN_UTF8_C) */
+# if defined(PERL_IN_DOOP_C) || defined(PERL_IN_OP_C) || \
+     defined(PERL_IN_REGCOMP_ANY)
+PERL_STATIC_INLINE SV *
+S_add_cp_to_invlist(pTHX_ SV *invlist, const UV cp)
+        __attribute__warn_unused_result__;
+#   define PERL_ARGS_ASSERT_ADD_CP_TO_INVLIST
+
+PERL_STATIC_INLINE void
+S_invlist_extend(pTHX_ SV * const invlist, const UV len);
+#   define PERL_ARGS_ASSERT_INVLIST_EXTEND      \
+        assert(invlist)
+
+PERL_STATIC_INLINE UV
+S_invlist_highest(SV * const invlist)
+        __attribute__warn_unused_result__;
+#   define PERL_ARGS_ASSERT_INVLIST_HIGHEST     \
+        assert(invlist)
+
+PERL_STATIC_INLINE void
+S_invlist_set_len(pTHX_ SV * const invlist, const UV len, const bool offset);
+#   define PERL_ARGS_ASSERT_INVLIST_SET_LEN     \
+        assert(invlist)
+
+# endif /* defined(PERL_IN_DOOP_C) || defined(PERL_IN_OP_C) ||
+           defined(PERL_IN_REGCOMP_ANY) */
+# if defined(PERL_IN_OP_C) || defined(PERL_IN_PAD_C)
+PERL_STATIC_INLINE bool
+S_PadnameIN_SCOPE(const PADNAME * const pn, const U32 seq);
+#   define PERL_ARGS_ASSERT_PADNAMEIN_SCOPE     \
+        assert(pn)
+
+# endif
+# if defined(PERL_IN_OP_C) || defined(PERL_IN_REGCOMP_ANY)
+PERL_STATIC_INLINE STRLEN *
+S_get_invlist_iter_addr(SV *invlist)
+        __attribute__warn_unused_result__;
+#   define PERL_ARGS_ASSERT_GET_INVLIST_ITER_ADDR \
+        assert(invlist)
+
+PERL_STATIC_INLINE void
+S_invlist_iterfinish(SV *invlist);
+#   define PERL_ARGS_ASSERT_INVLIST_ITERFINISH  \
+        assert(invlist)
+
+PERL_STATIC_INLINE void
+S_invlist_iterinit(SV *invlist);
+#   define PERL_ARGS_ASSERT_INVLIST_ITERINIT    \
+        assert(invlist)
+
+PERL_STATIC_INLINE bool
+S_invlist_iternext(SV *invlist, UV *start, UV *end)
+        __attribute__warn_unused_result__;
+#   define PERL_ARGS_ASSERT_INVLIST_ITERNEXT    \
+        assert(invlist); assert(start); assert(end)
+
+# endif /* defined(PERL_IN_OP_C) || defined(PERL_IN_REGCOMP_ANY) */
+# if defined(PERL_IN_PP_C) || defined(PERL_IN_PP_HOT_C)
+PERL_STATIC_INLINE bool
+S_lossless_NV_to_IV(const NV nv, IV *ivp)
+        __attribute__warn_unused_result__;
+#   define PERL_ARGS_ASSERT_LOSSLESS_NV_TO_IV   \
+        assert(ivp)
+
+# endif
+# if defined(PERL_IN_PP_C)   || defined(PERL_IN_REGCOMP_ANY) || \
+     defined(PERL_IN_TOKE_C) || defined(PERL_IN_UNIVERSAL_C)
+PERL_STATIC_INLINE const char *
+S_get_regex_charset_name(const U32 flags, STRLEN * const lenp);
+#   define PERL_ARGS_ASSERT_GET_REGEX_CHARSET_NAME \
+        assert(lenp)
+
+# endif
+# if defined(U64TYPE)
+PERL_STATIC_INLINE unsigned
+Perl_lsbit_pos64(U64 word)
+        __attribute__warn_unused_result__;
+#   define PERL_ARGS_ASSERT_LSBIT_POS64
+
+PERL_STATIC_INLINE unsigned
+Perl_msbit_pos64(U64 word)
+        __attribute__warn_unused_result__;
+#   define PERL_ARGS_ASSERT_MSBIT_POS64
+
+PERL_STATIC_INLINE unsigned
+Perl_single_1bit_pos64(U64 word)
+        __attribute__warn_unused_result__;
+#   define PERL_ARGS_ASSERT_SINGLE_1BIT_POS64
+
+# endif /* defined(U64TYPE) */
+# if defined(USE_ITHREADS)
+PERL_STATIC_INLINE AV *
+Perl_cop_file_avn(pTHX_ const COP *cop);
+#   define PERL_ARGS_ASSERT_COP_FILE_AVN        \
+        assert(cop)
+
+#   if !defined(PERL_IMPLICIT_SYS)
+PERL_STATIC_INLINE bool
+S_PerlEnv_putenv(pTHX_ char *str);
+#     define PERL_ARGS_ASSERT_PERLENV_PUTENV    \
+        assert(str)
+
+#   endif
+# endif /* defined(USE_ITHREADS) */
+# if !defined(WIN32)
+PERL_STATIC_INLINE void *
+Perl_get_context(void)
+        __attribute__warn_unused_result__;
+#   define PERL_ARGS_ASSERT_GET_CONTEXT
+
+# endif
+#endif /* !defined(PERL_NO_INLINE_FUNCTIONS) */
 #if defined(PERL_USE_3ARG_SIGHANDLER)
-PERL_CALLCONV Signal_t Perl_csighandler(int sig, Siginfo_t *info, void *uap);
-#define PERL_ARGS_ASSERT_CSIGHANDLER
-PERL_CALLCONV Signal_t Perl_sighandler(int sig, Siginfo_t *info, void *uap);
-#define PERL_ARGS_ASSERT_SIGHANDLER
-#endif
-#if defined(U64TYPE)   /* HAS_QUAD undefined outside of core */
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE unsigned    Perl_lsbit_pos64(U64 word)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_LSBIT_POS64
-#endif
+PERL_CALLCONV Signal_t
+Perl_csighandler(int sig, Siginfo_t *info, void *uap);
+# define PERL_ARGS_ASSERT_CSIGHANDLER
 
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE unsigned    Perl_msbit_pos64(U64 word)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_MSBIT_POS64
-#endif
+PERL_CALLCONV Signal_t
+Perl_sighandler(int sig, Siginfo_t *info, void *uap)
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_SIGHANDLER
 
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE unsigned    Perl_single_1bit_pos64(U64 word)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_SINGLE_1BIT_POS64
-#endif
+#else /* if !defined(PERL_USE_3ARG_SIGHANDLER) */
+PERL_CALLCONV Signal_t
+Perl_csighandler(int sig);
+# define PERL_ARGS_ASSERT_CSIGHANDLER
+
+PERL_CALLCONV Signal_t
+Perl_sighandler(int sig)
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_SIGHANDLER
+
+#endif /* !defined(PERL_USE_3ARG_SIGHANDLER) */
+#if defined(U64TYPE)
 
 #endif
 #if defined(UNLINK_ALL_VERSIONS)
-PERL_CALLCONV I32      Perl_unlnk(pTHX_ const char* f);
-#define PERL_ARGS_ASSERT_UNLNK \
-       assert(f)
+PERL_CALLCONV I32
+Perl_unlnk(pTHX_ const char *f);
+# define PERL_ARGS_ASSERT_UNLNK                 \
+        assert(f)
+
 #endif
 #if defined(USE_C_BACKTRACE)
-PERL_CALLCONV bool     Perl_dump_c_backtrace(pTHX_ PerlIO* fp, int max_depth, int skip);
-#define PERL_ARGS_ASSERT_DUMP_C_BACKTRACE      \
-       assert(fp)
-/* PERL_CALLCONV void  free_c_backtrace(pTHX_ Perl_c_backtrace* bt); */
-#define PERL_ARGS_ASSERT_FREE_C_BACKTRACE
-PERL_CALLCONV Perl_c_backtrace*        Perl_get_c_backtrace(pTHX_ int max_depth, int skip);
-#define PERL_ARGS_ASSERT_GET_C_BACKTRACE
-PERL_CALLCONV SV*      Perl_get_c_backtrace_dump(pTHX_ int max_depth, int skip);
-#define PERL_ARGS_ASSERT_GET_C_BACKTRACE_DUMP
-#endif
+PERL_CALLCONV bool
+Perl_dump_c_backtrace(pTHX_ PerlIO *fp, int max_depth, int skip);
+# define PERL_ARGS_ASSERT_DUMP_C_BACKTRACE      \
+        assert(fp)
+
+/* PERL_CALLCONV void
+free_c_backtrace(pTHX_ Perl_c_backtrace *bt); */
+
+PERL_CALLCONV Perl_c_backtrace *
+Perl_get_c_backtrace(pTHX_ int max_depth, int skip)
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_GET_C_BACKTRACE
+
+PERL_CALLCONV SV *
+Perl_get_c_backtrace_dump(pTHX_ int max_depth, int skip);
+# define PERL_ARGS_ASSERT_GET_C_BACKTRACE_DUMP
+
+#endif /* defined(USE_C_BACKTRACE) */
 #if defined(USE_DTRACE)
-PERL_CALLCONV void     Perl_dtrace_probe_call(pTHX_ CV *cv, bool is_call);
-#define PERL_ARGS_ASSERT_DTRACE_PROBE_CALL     \
-       assert(cv)
-PERL_CALLCONV void     Perl_dtrace_probe_load(pTHX_ const char *name, bool is_loading);
-#define PERL_ARGS_ASSERT_DTRACE_PROBE_LOAD     \
-       assert(name)
-PERL_CALLCONV void     Perl_dtrace_probe_op(pTHX_ const OP *op);
-#define PERL_ARGS_ASSERT_DTRACE_PROBE_OP       \
-       assert(op)
-PERL_CALLCONV void     Perl_dtrace_probe_phase(pTHX_ enum perl_phase phase);
-#define PERL_ARGS_ASSERT_DTRACE_PROBE_PHASE
-#endif
+PERL_CALLCONV void
+Perl_dtrace_probe_call(pTHX_ CV *cv, bool is_call);
+# define PERL_ARGS_ASSERT_DTRACE_PROBE_CALL     \
+        assert(cv)
+
+PERL_CALLCONV void
+Perl_dtrace_probe_load(pTHX_ const char *name, bool is_loading);
+# define PERL_ARGS_ASSERT_DTRACE_PROBE_LOAD     \
+        assert(name)
+
+PERL_CALLCONV void
+Perl_dtrace_probe_op(pTHX_ const OP *op);
+# define PERL_ARGS_ASSERT_DTRACE_PROBE_OP       \
+        assert(op)
+
+PERL_CALLCONV void
+Perl_dtrace_probe_phase(pTHX_ enum perl_phase phase);
+# define PERL_ARGS_ASSERT_DTRACE_PROBE_PHASE
+
+#endif /* defined(USE_DTRACE) */
 #if defined(USE_ITHREADS)
-PERL_CALLCONV PADOFFSET        Perl_alloccopstash(pTHX_ HV *hv);
-#define PERL_ARGS_ASSERT_ALLOCCOPSTASH \
-       assert(hv)
-PERL_CALLCONV void*    Perl_any_dup(pTHX_ void* v, const PerlInterpreter* proto_perl)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_ANY_DUP       \
-       assert(proto_perl)
-
-PERL_CALLCONV void     Perl_clone_params_del(CLONE_PARAMS *param);
-#define PERL_ARGS_ASSERT_CLONE_PARAMS_DEL      \
-       assert(param)
-PERL_CALLCONV CLONE_PARAMS *   Perl_clone_params_new(PerlInterpreter *const from, PerlInterpreter *const to)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_CLONE_PARAMS_NEW      \
-       assert(from); assert(to)
-
-#ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE AV* Perl_cop_file_avn(pTHX_ const COP *cop);
-#define PERL_ARGS_ASSERT_COP_FILE_AVN  \
-       assert(cop)
-#endif
-PERL_CALLCONV PERL_CONTEXT*    Perl_cx_dup(pTHX_ PERL_CONTEXT* cx, I32 ix, I32 max, CLONE_PARAMS* param)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_CX_DUP        \
-       assert(param)
-
-PERL_CALLCONV DIR*     Perl_dirp_dup(pTHX_ DIR *const dp, CLONE_PARAMS *const param)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_DIRP_DUP      \
-       assert(param)
-
-PERL_CALLCONV PerlIO*  Perl_fp_dup(pTHX_ PerlIO *const fp, const char type, CLONE_PARAMS *const param);
-#define PERL_ARGS_ASSERT_FP_DUP        \
-       assert(param)
-PERL_CALLCONV GP*      Perl_gp_dup(pTHX_ GP *const gp, CLONE_PARAMS *const param)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_GP_DUP        \
-       assert(param)
-
-PERL_CALLCONV HE*      Perl_he_dup(pTHX_ const HE* e, bool shared, CLONE_PARAMS* param)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_HE_DUP        \
-       assert(param)
-
-PERL_CALLCONV HEK*     Perl_hek_dup(pTHX_ HEK* e, CLONE_PARAMS* param)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_HEK_DUP       \
-       assert(param)
-
-PERL_CALLCONV MAGIC*   Perl_mg_dup(pTHX_ MAGIC *mg, CLONE_PARAMS *const param)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_MG_DUP        \
-       assert(param)
-
-PERL_CALLCONV struct mro_meta* Perl_mro_meta_dup(pTHX_ struct mro_meta* smeta, CLONE_PARAMS* param);
-#define PERL_ARGS_ASSERT_MRO_META_DUP  \
-       assert(smeta); assert(param)
-PERL_CALLCONV OP*      Perl_newPADOP(pTHX_ I32 type, I32 flags, SV* sv)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_NEWPADOP      \
-       assert(sv)
-
-PERL_CALLCONV PADLIST *        Perl_padlist_dup(pTHX_ PADLIST *srcpad, CLONE_PARAMS *param)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_PADLIST_DUP   \
-       assert(srcpad); assert(param)
-
-PERL_CALLCONV PADNAME *        Perl_padname_dup(pTHX_ PADNAME *src, CLONE_PARAMS *param)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_PADNAME_DUP   \
-       assert(src); assert(param)
-
-PERL_CALLCONV PADNAMELIST *    Perl_padnamelist_dup(pTHX_ PADNAMELIST *srcpad, CLONE_PARAMS *param)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_PADNAMELIST_DUP       \
-       assert(srcpad); assert(param)
-
-PERL_CALLCONV yy_parser*       Perl_parser_dup(pTHX_ const yy_parser *const proto, CLONE_PARAMS *const param);
-#define PERL_ARGS_ASSERT_PARSER_DUP    \
-       assert(param)
-PERL_CALLCONV PerlInterpreter* perl_clone(PerlInterpreter *proto_perl, UV flags);
-#define PERL_ARGS_ASSERT_PERL_CLONE    \
-       assert(proto_perl)
-PERL_CALLCONV void     Perl_re_dup_guts(pTHX_ const REGEXP *sstr, REGEXP *dstr, CLONE_PARAMS* param);
-#define PERL_ARGS_ASSERT_RE_DUP_GUTS   \
-       assert(sstr); assert(dstr); assert(param)
-PERL_CALLCONV void*    Perl_regdupe_internal(pTHX_ REGEXP * const r, CLONE_PARAMS* param);
-#define PERL_ARGS_ASSERT_REGDUPE_INTERNAL      \
-       assert(r); assert(param)
-PERL_CALLCONV void     Perl_rvpv_dup(pTHX_ SV *const dsv, const SV *const ssv, CLONE_PARAMS *const param);
-#define PERL_ARGS_ASSERT_RVPV_DUP      \
-       assert(dsv); assert(ssv); assert(param)
-PERL_CALLCONV PERL_SI* Perl_si_dup(pTHX_ PERL_SI* si, CLONE_PARAMS* param)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_SI_DUP        \
-       assert(param)
-
-PERL_CALLCONV ANY*     Perl_ss_dup(pTHX_ PerlInterpreter* proto_perl, CLONE_PARAMS* param)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_SS_DUP        \
-       assert(proto_perl); assert(param)
-
-PERL_CALLCONV SV*      Perl_sv_dup(pTHX_ const SV *const ssv, CLONE_PARAMS *const param)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_SV_DUP        \
-       assert(param)
-
-PERL_CALLCONV SV*      Perl_sv_dup_inc(pTHX_ const SV *const ssv, CLONE_PARAMS *const param)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_SV_DUP_INC    \
-       assert(param)
+PERL_CALLCONV PADOFFSET
+Perl_alloccopstash(pTHX_ HV *hv);
+# define PERL_ARGS_ASSERT_ALLOCCOPSTASH         \
+        assert(hv)
+
+PERL_CALLCONV void *
+Perl_any_dup(pTHX_ void *v, const PerlInterpreter *proto_perl)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_ANY_DUP               \
+        assert(proto_perl)
+
+PERL_CALLCONV void
+Perl_clone_params_del(CLONE_PARAMS *param);
+# define PERL_ARGS_ASSERT_CLONE_PARAMS_DEL      \
+        assert(param)
+
+PERL_CALLCONV CLONE_PARAMS *
+Perl_clone_params_new(PerlInterpreter * const from, PerlInterpreter * const to)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_CLONE_PARAMS_NEW      \
+        assert(from); assert(to)
+
+PERL_CALLCONV PERL_CONTEXT *
+Perl_cx_dup(pTHX_ PERL_CONTEXT *cx, I32 ix, I32 max, CLONE_PARAMS *param)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_CX_DUP                \
+        assert(param)
+
+PERL_CALLCONV DIR *
+Perl_dirp_dup(pTHX_ DIR * const dp, CLONE_PARAMS * const param)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_DIRP_DUP              \
+        assert(param)
+
+PERL_CALLCONV PerlIO *
+Perl_fp_dup(pTHX_ PerlIO * const fp, const char type, CLONE_PARAMS * const param);
+# define PERL_ARGS_ASSERT_FP_DUP                \
+        assert(param)
+
+PERL_CALLCONV GP *
+Perl_gp_dup(pTHX_ GP * const gp, CLONE_PARAMS * const param)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_GP_DUP                \
+        assert(param)
+
+PERL_CALLCONV HE *
+Perl_he_dup(pTHX_ const HE *e, bool shared, CLONE_PARAMS *param)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_HE_DUP                \
+        assert(param)
+
+PERL_CALLCONV HEK *
+Perl_hek_dup(pTHX_ HEK *e, CLONE_PARAMS *param)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_HEK_DUP               \
+        assert(param)
+
+PERL_CALLCONV MAGIC *
+Perl_mg_dup(pTHX_ MAGIC *mg, CLONE_PARAMS * const param)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_MG_DUP                \
+        assert(param)
+
+PERL_CALLCONV struct mro_meta *
+Perl_mro_meta_dup(pTHX_ struct mro_meta *smeta, CLONE_PARAMS *param)
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_MRO_META_DUP          \
+        assert(smeta); assert(param)
+
+PERL_CALLCONV OP *
+Perl_newPADOP(pTHX_ I32 type, I32 flags, SV *sv)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_NEWPADOP              \
+        assert(sv)
+
+PERL_CALLCONV PADLIST *
+Perl_padlist_dup(pTHX_ PADLIST *srcpad, CLONE_PARAMS *param)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_PADLIST_DUP           \
+        assert(srcpad); assert(param)
+
+PERL_CALLCONV PADNAME *
+Perl_padname_dup(pTHX_ PADNAME *src, CLONE_PARAMS *param)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_PADNAME_DUP           \
+        assert(src); assert(param)
+
+PERL_CALLCONV PADNAMELIST *
+Perl_padnamelist_dup(pTHX_ PADNAMELIST *srcpad, CLONE_PARAMS *param)
+        __attribute__warn_unused_result__
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_PADNAMELIST_DUP       \
+        assert(srcpad); assert(param)
+
+PERL_CALLCONV yy_parser *
+Perl_parser_dup(pTHX_ const yy_parser * const proto, CLONE_PARAMS * const param);
+# define PERL_ARGS_ASSERT_PARSER_DUP            \
+        assert(param)
+
+PERL_CALLCONV PerlInterpreter *
+perl_clone(PerlInterpreter *proto_perl, UV flags);
+# define PERL_ARGS_ASSERT_PERL_CLONE            \
+        assert(proto_perl)
+
+PERL_CALLCONV void
+Perl_re_dup_guts(pTHX_ const REGEXP *sstr, REGEXP *dstr, CLONE_PARAMS *param);
+# define PERL_ARGS_ASSERT_RE_DUP_GUTS           \
+        assert(sstr); assert(dstr); assert(param)
+
+PERL_CALLCONV void *
+Perl_regdupe_internal(pTHX_ REGEXP * const r, CLONE_PARAMS *param);
+# define PERL_ARGS_ASSERT_REGDUPE_INTERNAL      \
+        assert(r); assert(param)
+
+PERL_CALLCONV void
+Perl_rvpv_dup(pTHX_ SV * const dsv, const SV * const ssv, CLONE_PARAMS * const param);
+# define PERL_ARGS_ASSERT_RVPV_DUP              \
+        assert(dsv); assert(ssv); assert(param)
+
+PERL_CALLCONV PERL_SI *
+Perl_si_dup(pTHX_ PERL_SI *si, CLONE_PARAMS *param)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_SI_DUP                \
+        assert(param)
+
+PERL_CALLCONV ANY *
+Perl_ss_dup(pTHX_ PerlInterpreter *proto_perl, CLONE_PARAMS *param)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_SS_DUP                \
+        assert(proto_perl); assert(param)
+
+PERL_CALLCONV SV *
+Perl_sv_dup(pTHX_ const SV * const ssv, CLONE_PARAMS * const param)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_SV_DUP                \
+        assert(param)
+
+PERL_CALLCONV SV *
+Perl_sv_dup_inc(pTHX_ const SV * const ssv, CLONE_PARAMS * const param)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_SV_DUP_INC            \
+        assert(param)
+
+# if defined(PERL_IN_OP_C) || defined(PERL_IN_PEEP_C)
+PERL_CALLCONV void
+Perl_op_relocate_sv(pTHX_ SV **svp, PADOFFSET *targp)
+        __attribute__visibility__("hidden");
+#   define PERL_ARGS_ASSERT_OP_RELOCATE_SV      \
+        assert(svp); assert(targp)
+
+# endif
+#else /* if !defined(USE_ITHREADS) */
+/* PERL_CALLCONV void
+CopFILEGV_set(pTHX_ COP *c, GV *gv); */
 
-#endif
-#if defined(USE_LOCALE)                    && (   defined(PERL_IN_LOCALE_C)            || defined(PERL_IN_MG_C)                || defined (PERL_EXT_POSIX)             || defined (PERL_EXT_LANGINFO))
-PERL_CALLCONV bool     Perl__is_cur_LC_category_utf8(pTHX_ int category);
-#define PERL_ARGS_ASSERT__IS_CUR_LC_CATEGORY_UTF8
 #endif
 #if defined(USE_LOCALE_COLLATE)
-PERL_CALLCONV int      Perl_magic_freecollxfrm(pTHX_ SV* sv, MAGIC* mg);
-#define PERL_ARGS_ASSERT_MAGIC_FREECOLLXFRM    \
-       assert(sv); assert(mg)
-PERL_CALLCONV int      Perl_magic_setcollxfrm(pTHX_ SV* sv, MAGIC* mg);
-#define PERL_ARGS_ASSERT_MAGIC_SETCOLLXFRM     \
-       assert(sv); assert(mg)
-#ifndef NO_MATHOMS
-PERL_CALLCONV char*    Perl_mem_collxfrm(pTHX_ const char* input_string, STRLEN len, STRLEN* xlen)
-                       __attribute__deprecated__;
-#define PERL_ARGS_ASSERT_MEM_COLLXFRM  \
-       assert(input_string); assert(xlen)
-#endif
-
-#ifndef NO_MATHOMS
-PERL_CALLCONV char*    Perl_sv_collxfrm(pTHX_ SV *const sv, STRLEN *const nxp);
-#define PERL_ARGS_ASSERT_SV_COLLXFRM   \
-       assert(sv); assert(nxp)
-#endif
-PERL_CALLCONV char*    Perl_sv_collxfrm_flags(pTHX_ SV *const sv, STRLEN *const nxp, I32 const flags);
-#define PERL_ARGS_ASSERT_SV_COLLXFRM_FLAGS     \
-       assert(sv); assert(nxp)
-#endif
+PERL_CALLCONV int
+Perl_magic_freecollxfrm(pTHX_ SV *sv, MAGIC *mg)
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_MAGIC_FREECOLLXFRM    \
+        assert(sv); assert(mg)
+
+PERL_CALLCONV int
+Perl_magic_setcollxfrm(pTHX_ SV *sv, MAGIC *mg)
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_MAGIC_SETCOLLXFRM     \
+        assert(sv); assert(mg)
+
+PERL_CALLCONV SV *
+Perl_strxfrm(pTHX_ SV *src);
+# define PERL_ARGS_ASSERT_STRXFRM               \
+        assert(src)
+
+PERL_CALLCONV char *
+Perl_sv_collxfrm_flags(pTHX_ SV * const sv, STRLEN * const nxp, I32 const flags);
+# define PERL_ARGS_ASSERT_SV_COLLXFRM_FLAGS     \
+        assert(sv); assert(nxp)
+
+# if defined(PERL_IN_LOCALE_C) || defined(PERL_IN_MATHOMS_C) || \
+     defined(PERL_IN_SV_C)
+PERL_CALLCONV char *
+Perl_mem_collxfrm_(pTHX_ const char *input_string, STRLEN len, STRLEN *xlen, bool utf8)
+        __attribute__visibility__("hidden");
+#   define PERL_ARGS_ASSERT_MEM_COLLXFRM_       \
+        assert(input_string); assert(xlen)
+
+# endif
+#endif /* defined(USE_LOCALE_COLLATE) */
 #if defined(USE_PERLIO)
-PERL_CALLCONV void     Perl_PerlIO_clearerr(pTHX_ PerlIO *f);
-#define PERL_ARGS_ASSERT_PERLIO_CLEARERR
-PERL_CALLCONV int      Perl_PerlIO_close(pTHX_ PerlIO *f);
-#define PERL_ARGS_ASSERT_PERLIO_CLOSE
-PERL_CALLCONV int      Perl_PerlIO_eof(pTHX_ PerlIO *f);
-#define PERL_ARGS_ASSERT_PERLIO_EOF
-PERL_CALLCONV int      Perl_PerlIO_error(pTHX_ PerlIO *f);
-#define PERL_ARGS_ASSERT_PERLIO_ERROR
-PERL_CALLCONV int      Perl_PerlIO_fileno(pTHX_ PerlIO *f);
-#define PERL_ARGS_ASSERT_PERLIO_FILENO
-PERL_CALLCONV int      Perl_PerlIO_fill(pTHX_ PerlIO *f);
-#define PERL_ARGS_ASSERT_PERLIO_FILL
-PERL_CALLCONV int      Perl_PerlIO_flush(pTHX_ PerlIO *f);
-#define PERL_ARGS_ASSERT_PERLIO_FLUSH
-PERL_CALLCONV STDCHAR *        Perl_PerlIO_get_base(pTHX_ PerlIO *f);
-#define PERL_ARGS_ASSERT_PERLIO_GET_BASE
-PERL_CALLCONV SSize_t  Perl_PerlIO_get_bufsiz(pTHX_ PerlIO *f)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_PERLIO_GET_BUFSIZ
-
-PERL_CALLCONV SSize_t  Perl_PerlIO_get_cnt(pTHX_ PerlIO *f)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_PERLIO_GET_CNT
-
-PERL_CALLCONV STDCHAR *        Perl_PerlIO_get_ptr(pTHX_ PerlIO *f);
-#define PERL_ARGS_ASSERT_PERLIO_GET_PTR
-PERL_CALLCONV SSize_t  Perl_PerlIO_read(pTHX_ PerlIO *f, void *vbuf, Size_t count);
-#define PERL_ARGS_ASSERT_PERLIO_READ   \
-       assert(vbuf)
-PERL_CALLCONV void     Perl_PerlIO_restore_errno(pTHX_ PerlIO *f);
-#define PERL_ARGS_ASSERT_PERLIO_RESTORE_ERRNO
-PERL_CALLCONV void     Perl_PerlIO_save_errno(pTHX_ PerlIO *f);
-#define PERL_ARGS_ASSERT_PERLIO_SAVE_ERRNO
-PERL_CALLCONV int      Perl_PerlIO_seek(pTHX_ PerlIO *f, Off_t offset, int whence);
-#define PERL_ARGS_ASSERT_PERLIO_SEEK
-PERL_CALLCONV void     Perl_PerlIO_set_cnt(pTHX_ PerlIO *f, SSize_t cnt);
-#define PERL_ARGS_ASSERT_PERLIO_SET_CNT
-PERL_CALLCONV void     Perl_PerlIO_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR *ptr, SSize_t cnt);
-#define PERL_ARGS_ASSERT_PERLIO_SET_PTRCNT
-PERL_CALLCONV void     Perl_PerlIO_setlinebuf(pTHX_ PerlIO *f);
-#define PERL_ARGS_ASSERT_PERLIO_SETLINEBUF
-PERL_CALLCONV PerlIO * Perl_PerlIO_stderr(pTHX)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_PERLIO_STDERR
-
-PERL_CALLCONV PerlIO * Perl_PerlIO_stdin(pTHX)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_PERLIO_STDIN
-
-PERL_CALLCONV PerlIO * Perl_PerlIO_stdout(pTHX)
-                       __attribute__warn_unused_result__;
-#define PERL_ARGS_ASSERT_PERLIO_STDOUT
-
-PERL_CALLCONV Off_t    Perl_PerlIO_tell(pTHX_ PerlIO *f);
-#define PERL_ARGS_ASSERT_PERLIO_TELL
-PERL_CALLCONV SSize_t  Perl_PerlIO_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count);
-#define PERL_ARGS_ASSERT_PERLIO_UNREAD \
-       assert(vbuf)
-PERL_CALLCONV SSize_t  Perl_PerlIO_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count);
-#define PERL_ARGS_ASSERT_PERLIO_WRITE  \
-       assert(vbuf)
+PERL_CALLCONV void
+Perl_PerlIO_clearerr(pTHX_ PerlIO *f);
+# define PERL_ARGS_ASSERT_PERLIO_CLEARERR
+
+PERL_CALLCONV int
+Perl_PerlIO_close(pTHX_ PerlIO *f);
+# define PERL_ARGS_ASSERT_PERLIO_CLOSE
+
+PERL_CALLCONV int
+Perl_PerlIO_eof(pTHX_ PerlIO *f);
+# define PERL_ARGS_ASSERT_PERLIO_EOF
+
+PERL_CALLCONV int
+Perl_PerlIO_error(pTHX_ PerlIO *f);
+# define PERL_ARGS_ASSERT_PERLIO_ERROR
+
+PERL_CALLCONV int
+Perl_PerlIO_fileno(pTHX_ PerlIO *f);
+# define PERL_ARGS_ASSERT_PERLIO_FILENO
+
+PERL_CALLCONV int
+Perl_PerlIO_fill(pTHX_ PerlIO *f);
+# define PERL_ARGS_ASSERT_PERLIO_FILL
+
+PERL_CALLCONV int
+Perl_PerlIO_flush(pTHX_ PerlIO *f);
+# define PERL_ARGS_ASSERT_PERLIO_FLUSH
+
+PERL_CALLCONV STDCHAR *
+Perl_PerlIO_get_base(pTHX_ PerlIO *f);
+# define PERL_ARGS_ASSERT_PERLIO_GET_BASE
+
+PERL_CALLCONV SSize_t
+Perl_PerlIO_get_bufsiz(pTHX_ PerlIO *f)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_PERLIO_GET_BUFSIZ
+
+PERL_CALLCONV SSize_t
+Perl_PerlIO_get_cnt(pTHX_ PerlIO *f)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_PERLIO_GET_CNT
+
+PERL_CALLCONV STDCHAR *
+Perl_PerlIO_get_ptr(pTHX_ PerlIO *f);
+# define PERL_ARGS_ASSERT_PERLIO_GET_PTR
+
+PERL_CALLCONV SSize_t
+Perl_PerlIO_read(pTHX_ PerlIO *f, void *vbuf, Size_t count);
+# define PERL_ARGS_ASSERT_PERLIO_READ           \
+        assert(vbuf)
+
+PERL_CALLCONV void
+Perl_PerlIO_restore_errno(pTHX_ PerlIO *f);
+# define PERL_ARGS_ASSERT_PERLIO_RESTORE_ERRNO
+
+PERL_CALLCONV void
+Perl_PerlIO_save_errno(pTHX_ PerlIO *f);
+# define PERL_ARGS_ASSERT_PERLIO_SAVE_ERRNO
+
+PERL_CALLCONV int
+Perl_PerlIO_seek(pTHX_ PerlIO *f, Off_t offset, int whence);
+# define PERL_ARGS_ASSERT_PERLIO_SEEK
+
+PERL_CALLCONV void
+Perl_PerlIO_set_cnt(pTHX_ PerlIO *f, SSize_t cnt);
+# define PERL_ARGS_ASSERT_PERLIO_SET_CNT
+
+PERL_CALLCONV void
+Perl_PerlIO_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR *ptr, SSize_t cnt);
+# define PERL_ARGS_ASSERT_PERLIO_SET_PTRCNT
+
+PERL_CALLCONV void
+Perl_PerlIO_setlinebuf(pTHX_ PerlIO *f);
+# define PERL_ARGS_ASSERT_PERLIO_SETLINEBUF
+
+PERL_CALLCONV PerlIO *
+Perl_PerlIO_stderr(pTHX)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_PERLIO_STDERR
+
+PERL_CALLCONV PerlIO *
+Perl_PerlIO_stdin(pTHX)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_PERLIO_STDIN
+
+PERL_CALLCONV PerlIO *
+Perl_PerlIO_stdout(pTHX)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_PERLIO_STDOUT
+
+PERL_CALLCONV Off_t
+Perl_PerlIO_tell(pTHX_ PerlIO *f);
+# define PERL_ARGS_ASSERT_PERLIO_TELL
+
+PERL_CALLCONV SSize_t
+Perl_PerlIO_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count);
+# define PERL_ARGS_ASSERT_PERLIO_UNREAD         \
+        assert(vbuf)
+
+PERL_CALLCONV SSize_t
+Perl_PerlIO_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count);
+# define PERL_ARGS_ASSERT_PERLIO_WRITE          \
+        assert(vbuf)
+
+#endif /* defined(USE_PERLIO) */
+#if defined(USE_PERL_SWITCH_LOCALE_CONTEXT)
+PERL_CALLCONV void
+Perl_switch_locale_context(void);
+# define PERL_ARGS_ASSERT_SWITCH_LOCALE_CONTEXT
+
 #endif
 #if defined(USE_QUADMATH)
-PERL_CALLCONV bool     Perl_quadmath_format_needed(const char* format);
-#define PERL_ARGS_ASSERT_QUADMATH_FORMAT_NEEDED        \
-       assert(format)
-PERL_CALLCONV bool     Perl_quadmath_format_valid(const char* format);
-#define PERL_ARGS_ASSERT_QUADMATH_FORMAT_VALID \
-       assert(format)
-#endif
+PERL_CALLCONV bool
+Perl_quadmath_format_needed(const char *format)
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_QUADMATH_FORMAT_NEEDED \
+        assert(format)
+
+PERL_CALLCONV bool
+Perl_quadmath_format_valid(const char *format)
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_QUADMATH_FORMAT_VALID \
+        assert(format)
+
+#endif /* defined(USE_QUADMATH) */
+#if defined(VMS) || defined(WIN32)
+PERL_CALLCONV int
+Perl_do_aspawn(pTHX_ SV *really, SV **mark, SV **sp);
+# define PERL_ARGS_ASSERT_DO_ASPAWN             \
+        assert(mark); assert(sp)
+
+PERL_CALLCONV int
+Perl_do_spawn(pTHX_ char *cmd);
+# define PERL_ARGS_ASSERT_DO_SPAWN              \
+        assert(cmd)
+
+PERL_CALLCONV int
+Perl_do_spawn_nowait(pTHX_ char *cmd);
+# define PERL_ARGS_ASSERT_DO_SPAWN_NOWAIT       \
+        assert(cmd)
+
+#endif /* defined(VMS) || defined(WIN32) */
 #if defined(WIN32)
-PERL_CALLCONV_NO_RET void      win32_croak_not_implemented(const char * fname)
-                       __attribute__noreturn__;
-#define PERL_ARGS_ASSERT_WIN32_CROAK_NOT_IMPLEMENTED   \
-       assert(fname)
+PERL_CALLCONV void *
+Perl_get_context(void)
+        __attribute__warn_unused_result__;
+# define PERL_ARGS_ASSERT_GET_CONTEXT
+
+PERL_CALLCONV bool
+Perl_get_win32_message_utf8ness(pTHX_ const char *string)
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_GET_WIN32_MESSAGE_UTF8NESS
+
+PERL_CALLCONV_NO_RET void
+win32_croak_not_implemented(const char *fname)
+        __attribute__noreturn__;
+# define PERL_ARGS_ASSERT_WIN32_CROAK_NOT_IMPLEMENTED \
+        assert(fname)
+
+#else /* if !defined(WIN32) */
+PERL_CALLCONV bool
+Perl_do_exec3(pTHX_ const char *incmd, int fd, int do_report)
+        __attribute__visibility__("hidden");
+# define PERL_ARGS_ASSERT_DO_EXEC3              \
+        assert(incmd)
 
 #endif
-#if defined(WIN32) || defined(VMS)
-PERL_CALLCONV int      Perl_do_aspawn(pTHX_ SV* really, SV** mark, SV** sp);
-#define PERL_ARGS_ASSERT_DO_ASPAWN     \
-       assert(mark); assert(sp)
-PERL_CALLCONV int      Perl_do_spawn(pTHX_ char* cmd);
-#define PERL_ARGS_ASSERT_DO_SPAWN      \
-       assert(cmd)
-PERL_CALLCONV int      Perl_do_spawn_nowait(pTHX_ char* cmd);
-#define PERL_ARGS_ASSERT_DO_SPAWN_NOWAIT       \
-       assert(cmd)
-#endif
-#if defined(_MSC_VER)
-PERL_CALLCONV int      Perl_magic_regdatum_set(pTHX_ SV* sv, MAGIC* mg);
-#define PERL_ARGS_ASSERT_MAGIC_REGDATUM_SET    \
-       assert(sv); assert(mg)
-#endif
+
 #ifdef PERL_CORE
 #  include "pp_proto.h"
 #endif
 END_EXTERN_C
 
-/* ex: set ro: */
+/* ex: set ro ft=c: */
index e3204e3..8ada7f0 100644 (file)
@@ -1,4 +1,4 @@
-/* -*- buffer-read-only: t -*-
+/* -*- mode: C; buffer-read-only: t -*-
  *
  *    reentr.c
  *
@@ -677,4 +677,4 @@ Perl_reentrant_retry(const char *f, ...)
     return retptr;
 }
 
-/* ex: set ro: */
+/* ex: set ro ft=c: */
index 2e8c13e..4d39ab2 100644 (file)
@@ -1,4 +1,4 @@
-/* -*- buffer-read-only: t -*-
+/* -*- mode: C; buffer-read-only: t -*-
  *
  *    regcharclass.h
  *
 
 /* Generated from:
  * 688d673ec947f7ccf898b4eae9848139d4d33676b688dee54f449f8bf9d3bbd2 lib/Unicode/UCD.pm
- * c7698811e9adb6cc98fb996a7de4be2b6532f2ac67e76055cc8afdbf6ee18af3 lib/unicore/ArabicShaping.txt
- * 24a74555f918bbe99f5b3f1b83cf36fc0e205bb8a600a6a3aa539c710a3dcf27 lib/unicore/BidiBrackets.txt
- * 7a5c74cedc1616a9af0a9d22e108ae592d86fe93649c144ae6ba49f193a44122 lib/unicore/BidiMirroring.txt
- * 598870dddef7b34b5a972916528c456aff2765b79cd4f9647fb58ceb767e7f17 lib/unicore/Blocks.txt
- * a566cd48687b2cd897e02501118b2413c14ae86d318f9abbbba97feb84189f0f lib/unicore/CaseFolding.txt
- * 3360762fc3295cea54ab251c31df621d05ba4b94d46c60eaac29aa16d70ad1e0 lib/unicore/CompositionExclusions.txt
- * 7e058dec02147098bc9c28d86209f0f251bba0538f3b5a705ad02ea3bb709fe0 lib/unicore/DAge.txt
- * e3eddd7d469cd1b0feed7528defad1a1cc7c6a9ceb0ae4446a6d10921ed2e7bc lib/unicore/DCoreProperties.txt
- * b2c444c20730b097787fdf50bd7d6dd3fc5256ab8084f5b35b11c8776eca674c lib/unicore/DNormalizationProps.txt
- * f901ac011aa32a09224d6555da71e2532c59c1d3381322829de0e3b880507250 lib/unicore/EastAsianWidth.txt
- * 5995522f01633073911dad1edb74d13aa832f42862c0392a79627b85d52f2391 lib/unicore/EquivalentUnifiedIdeograph.txt
- * cd1c9367cba438afa965fcb5edc6ed3ec6e685fd5dd21c0cc20c026f04beb0e5 lib/unicore/HangulSyllableType.txt
- * 3f3f368fccdb37f350ecedc20b37fa71ab31c04e847884c77780d34283539f73 lib/unicore/IdStatus.txt
- * 45a150c23961b58d7784704af6c4daccd6517d97b6489e53d13bbdbf9e4f065f lib/unicore/IdType.txt
- * d8704c8725568813a947ff2ef38bcf1f05e2a6fbea6876ba384890f187a8bf61 lib/unicore/IndicPositionalCategory.txt
- * c7b969b653dc278fb66ab4136223d320e30ad19367eb791ae60dcc6d92071b16 lib/unicore/IndicSyllabicCategory.txt
- * 39ff89e0a329e1ccce6d54fad8cf82e90926901928c0ca9b9a2ad5681f330dd9 lib/unicore/Jamo.txt
- * 9e06e9f35c6959fb91dcc7993f90d58523c3079bc62c6b25f828b4cdebc5d70c lib/unicore/LineBreak.txt
- * 14b3b677d33f95c51423dce6eef4a6a28b4b160451ecedee4b91edb6745cf4a3 lib/unicore/NameAliases.txt
- * db5745688affcdc0c3927a1ee0667018a96a7b24513f866d5235e98fef6c2436 lib/unicore/NamedSequences.txt
- * 6bddfdb850417a5bee6deff19290fd1b138589909afb50f5a049f343bf2c6722 lib/unicore/PropList.txt
- * eb755757e20b72b330b2948df3cf2ff7adb0e31bb060140dc09dafb132ace2cd lib/unicore/PropValueAliases.txt
- * 859d7225f2d2a460b3ccb1d61a7945f8cc219acdf5aa53b66b7a1e4bf6ebfc87 lib/unicore/PropertyAliases.txt
- * d37eedf63ff9c48bac863d5f76862373d6cf5269fd21253d499e2430d638c01d lib/unicore/ScriptExtensions.txt
- * 52db475c4ec445e73b0b16915448c357614946ad7062843c563e00d7535c6510 lib/unicore/Scripts.txt
- * c667b45908fd269af25fd55d2fc5bbc157fb1b77675936e25c513ce32e080334 lib/unicore/SpecialCasing.txt
- * 36018e68657fdcb3485f636630ffe8c8532e01c977703d2803f5b89d6c5feafb lib/unicore/UnicodeData.txt
- * 869ff43dd012f924d03c89fc268c88f0e7eea72f0228b91ca30455afdb84f8fd lib/unicore/VerticalOrientation.txt
- * ddc7d4d1f3838573b94fc5d83ff7217e63c47b22ae1cd40c5fe1a54efc15589b lib/unicore/auxiliary/GCBTest.txt
- * 97e79f1f8d9cd76d120f2420381a01abc00a7c78a2aa583fa3f9627264a99742 lib/unicore/auxiliary/GraphemeBreakProperty.txt
- * 488dbb6a7e1d0070d4aa7c175352c818ff6425172850d1b40c6177726658cb05 lib/unicore/auxiliary/LBTest.txt
- * 7e42dd749dbb94aa44b13faf9df6319d9a16ce2ea09a3a094fcfbb5962168040 lib/unicore/auxiliary/SBTest.txt
- * 7092ca4117cec891c25c7724132efc519e1dece01ae9fd6068035a9db04d526e lib/unicore/auxiliary/SentenceBreakProperty.txt
- * 8094b544ec1580c7e41ac0187805cc1aeb330a90301ec7505563e1a59318284e lib/unicore/auxiliary/WBTest.txt
- * 7716752aad296d4ab23ff4ed0a2746fc5328750ff84e9e7d6f3828ee9eaef742 lib/unicore/auxiliary/WordBreakProperty.txt
- * b597836124298b8f7fa076273802840cfc3271a25f5c397a082e120954b82c3c lib/unicore/emoji/emoji.txt
- * e5fe51acc74e3e83b4fb4c7b25f3c34491d6eb8095c9955d0712dafbca7b3c2b lib/unicore/extracted/DBidiClass.txt
- * cd0a14176d93bf440b77a582a0d678190fc0688b15442d4cfb250bf2e27956af lib/unicore/extracted/DBinaryProperties.txt
- * 12b0c3af9b600b49488d66545a3e7844ea980809627201bf9afeebe1c9f16f4e lib/unicore/extracted/DCombiningClass.txt
- * f76064b298cfbd715ba542e7894f7a507d32da2f011070d1d01df95cad9817d6 lib/unicore/extracted/DDecompositionType.txt
- * f9bef074cc916db57fece99d54a4505f8e7c7b17481619e3f0005211f7717d4b lib/unicore/extracted/DEastAsianWidth.txt
- * cde679c8461976ed40d7edf61ae98cbb947540831f06f5bc7da7decbf91a1420 lib/unicore/extracted/DGeneralCategory.txt
- * 9bb891831328713603a486a4a03df7f7987c3e1e8144a6d1ac71fd061ef3f732 lib/unicore/extracted/DJoinGroup.txt
- * e97c65bbea0a69d2fae6ec4182b09e519e13232e20bd804b3004edc0f36bb0d4 lib/unicore/extracted/DJoinType.txt
- * 43f6df50e4878f501b417e366b0ee097ae5ccb2d4ce942026bed3d62d78e7887 lib/unicore/extracted/DLineBreak.txt
- * a04502ebb36a45d83cbe48a7d8132ea8143edb7b3d34d0aa6afe4a9685049741 lib/unicore/extracted/DNumType.txt
- * 11075771b112e8e7ccf6ffa637c4c91eadc3ef3db0517b24e605df8fd3624239 lib/unicore/extracted/DNumValues.txt
- * 1e514199c3fa46f5df6148d272db7bddbfd5e89c9710e39773ef9d734f344a2f lib/unicore/mktables
- * c72bbdeda99714db1c8024d3311da4aef3c0db3b9b9f11455a7cfe10d5e9aba3 lib/unicore/version
+ * eb840f36e0a7446293578c684a54c6d83d249abde7bdd4dfa89794af1d7fe9e9 lib/unicore/ArabicShaping.txt
+ * 333ae1e99db0504ca8a046a07dc45b5e7aa91869c685e6bf955ebe674804827a lib/unicore/BidiBrackets.txt
+ * b4b9e1d87d8ea273613880de9d2b2f0b0b696244b42152bfa0a3106e7d983a20 lib/unicore/BidiMirroring.txt
+ * 529dc5d0f6386d52f2f56e004bbfab48ce2d587eea9d38ba546c4052491bd820 lib/unicore/Blocks.txt
+ * cdd49e55eae3bbf1f0a3f6580c974a0263cb86a6a08daa10fbf705b4808a56f7 lib/unicore/CaseFolding.txt
+ * 3b019c0a33c3140cbc920c078f4f9af2680ba4f71869c8d4de5190667c70b6a3 lib/unicore/CompositionExclusions.txt
+ * 7570877e0fa197c45338f7c41a02636da4e14c8dba6a3611a01cd30bf329d5ca lib/unicore/DAge.txt
+ * d367290bc0867e6b484c68370530bdd1a08b6b32404601b8c7accaf83e05628d lib/unicore/DCoreProperties.txt
+ * d5687a48c95c7d6e1ec59cb29c0f2e8b052018eb069a4371b7368d0561e12a29 lib/unicore/DNormalizationProps.txt
+ * 743e7bc435c04ab1a8459710b1c3cad56eedced5b806b4659b6e69b85d0adf2a lib/unicore/EastAsianWidth.txt
+ * f2e04bae8c856fad3a16353a99d4cc2de6c72770260379f5e4974a97548aad2a lib/unicore/EquivalentUnifiedIdeograph.txt
+ * 9a3ab36d36a22bdb84de7a17b17e9b9c242134f0080f0a8b4b28d209465a8fc8 lib/unicore/HangulSyllableType.txt
+ * 790bc9595795c0e0a3860a21a7f97157a134b61a4fc4ab03c7d315d07c9a6eb7 lib/unicore/IdStatus.txt
+ * 71d3ed8f15cd5d8cd00cdebe62015ff26356462774b261b4a2b83d3bf46b1639 lib/unicore/IdType.txt
+ * 0ce56c1294da405c0a0a0071582ac839fd229bbf97bdd260462ee571309d4ec4 lib/unicore/IndicPositionalCategory.txt
+ * ffae561a51b47ddbbe267fdd8505ac3776b85b2932268809127acee84200b573 lib/unicore/IndicSyllabicCategory.txt
+ * 14733bcb6731ae0c07485bf59a41cb3db08785a50bd2b46b836b4341eab7ee46 lib/unicore/Jamo.txt
+ * 012bca868e2c4e59a5a10a7546baf0c6fb1b2ef458c277f054915c8a49d292bf lib/unicore/LineBreak.txt
+ * 3e39509e8fae3e5d50ba73759d0b97194501d14a9c63107a6372a46b38be18e8 lib/unicore/NameAliases.txt
+ * 1d5202155f14841973aa540b1625f4befbde185ac77ce5aceaaaa0501a68bd66 lib/unicore/NamedSequences.txt
+ * fb9ac8cc154a80cad6caac9897af55a4e75176af6f4e2bb6edc2bf8b1d57f326 lib/unicore/NormTest.txt
+ * e05c0a2811d113dae4abd832884199a3ea8d187ee1b872d8240a788a96540bfd lib/unicore/PropList.txt
+ * 13a7666843abea5c6b7eb8c057c57ab9bb2ba96cfc936e204224dd67d71cafad lib/unicore/PropValueAliases.txt
+ * e4935149af407fa455901832b710bccb63d2453e46d09190e234d019bcfbba45 lib/unicore/PropertyAliases.txt
+ * 7e07313d9d0bee42220c476b64485995130ae30917bbcf7780b602d677d7e33f lib/unicore/ScriptExtensions.txt
+ * cca85d830f46aece2e7c1459ef1249993dca8f2e46d51e869255be140d7ea4b0 lib/unicore/Scripts.txt
+ * 78b29c64b5840d25c11a9f31b665ee551b8a499eca6c70d770fcad7dd710f494 lib/unicore/SpecialCasing.txt
+ * 806e9aed65037197f1ec85e12be6e8cd870fc5608b4de0fffd990f689f376a73 lib/unicore/UnicodeData.txt
+ * ca6d332f485a6f5f452b29b4a74146af0f2c17b7577aa4c821d597210f70611a lib/unicore/VerticalOrientation.txt
+ * 0d2080d0def294a4b7660801cc03ddfe5866ff300c789c2cc1b50fd7802b2d97 lib/unicore/auxiliary/GCBTest.txt
+ * 5a0f8748575432f8ff95e1dd5bfaa27bda1a844809e17d6939ee912bba6568a1 lib/unicore/auxiliary/GraphemeBreakProperty.txt
+ * 371bde4052aa593b108684ae292d8ea2dbb93c19990e0cdf416fa7239557aac3 lib/unicore/auxiliary/LBTest.txt
+ * f62279d8fd10935ba0cf0d8417a1dcbe7ab0d4e62f59c17e02cbe40f580c4162 lib/unicore/auxiliary/SBTest.txt
+ * 61e4ba975b0a5bc1a76ee931b94914395d7289ef624e3c0d4d6b9460ee387bea lib/unicore/auxiliary/SentenceBreakProperty.txt
+ * 2a676130c71194245e7c74a837e58330f202600d8ddcf4518129dd476f26e18e lib/unicore/auxiliary/WBTest.txt
+ * 5188a56e91593467c2e912601ebc78750e6adc9b04541b8c5becb5441e388ce2 lib/unicore/auxiliary/WordBreakProperty.txt
+ * 29071dba22c72c27783a73016afb8ffaeb025866740791f9c2d0b55cc45a3470 lib/unicore/emoji/emoji.txt
+ * 4841f2090c2dbc592d3ce43bb74c2191b3da50fb9a0d00274f1448c202851b02 lib/unicore/extracted/DBidiClass.txt
+ * f10a35451429137f7348825f22d624b6390c526ead3d8e756d2af9e5ed5b2b67 lib/unicore/extracted/DBinaryProperties.txt
+ * ca54f6360cd288ad92113415bf1f77749015abe11cbd6798d21f7fa81f04205d lib/unicore/extracted/DCombiningClass.txt
+ * db059ce45e3cec49bfda56e262fa658b3a5561b1648de266c818d2a08a85b78a lib/unicore/extracted/DDecompositionType.txt
+ * d62e6950f086e53f47c593a38342621f8838f48c49a1de070cf83d3959bd1688 lib/unicore/extracted/DEastAsianWidth.txt
+ * fe29a45c0882500e591140aaa5c4f5067e6a5d746806148af34400c48b9c06f9 lib/unicore/extracted/DGeneralCategory.txt
+ * e13ca1344b16023aa38c6ada39f9658536fc6bb7c3c24d579f0bc316a4f4f1e0 lib/unicore/extracted/DJoinGroup.txt
+ * c4870b11e2b8b7d0eb70b99ce85608e5c28a399efa316cca97238a58ae160e5e lib/unicore/extracted/DJoinType.txt
+ * 3f4f32ed2a577344a508114527e721d7a8b633d32f38945d47fe0c743650c585 lib/unicore/extracted/DLineBreak.txt
+ * 710abf2d581ac9c57f244c0834f9d9969d9781e0396adccd330eaae658ac7d6b lib/unicore/extracted/DNumType.txt
+ * 6bd30f385f3baf3ab5d5308c111a81de87bea5f494ba0ba69e8ab45263b8c34d lib/unicore/extracted/DNumValues.txt
+ * f7265069b38ba9a0675a18600e241b1ec6fc8c55fd806fe4c13bc5d8cb0dc508 lib/unicore/mktables
+ * 55d90fdc3f902e5c0b16b3378f9eaa36e970a1c09723c33de7d47d0370044012 lib/unicore/version
  * 0a6b5ab33bb1026531f816efe81aea1a8ffcd34a27cbea37dd6a70a63d73c844 regen/charset_translations.pl
  * acc94e4afc339fe2cf2ae74d6e1cbcf2c396328d78e56236ad314eadbfc84125 regen/regcharclass.pl
  * b2f896452d2b30da3e04800f478c60c1fd0b03d6b668689b020f1e3cf1f1cdd9 regen/regcharclass_multi_char_folds.pl
- * ex: set ro: */
+ * ex: set ro ft=c: */
index 7442e66..3e755fa 100644 (file)
  * with the POSIX routines of the same names.
 */
 
-#ifdef PERL_EXT_RE_BUILD
-#include "re_top.h"
-#endif
-
 /*
  * pregcomp and pregexec -- regsub and regerror are not used in perl
  *
@@ -95,7 +91,7 @@
  *          #ifndef PERL_IN_XSUB_RE
  *          ...
  *          #endif
- *      blocks, so there is only one defintion for them in the whole
+ *      blocks, so there is only one definition for them in the whole
  *      executable, the one in regcomp.c (or regexec.c).  The implication of
  *      that is any debugging info that comes from them is controlled only by
  *      -Dr.  Further, any static function they call will also be the version
  * access data that we don't want to duplicate.
  */
 
+#ifdef PERL_EXT_RE_BUILD
+#include "re_top.h"
+#endif
+
 #include "EXTERN.h"
+#define PERL_IN_REGEX_ENGINE
+#define PERL_IN_REGCOMP_ANY
 #define PERL_IN_REGCOMP_C
 #include "perl.h"
 
-#define REG_COMP_C
 #ifdef PERL_IN_XSUB_RE
 #  include "re_comp.h"
 EXTERN_C const struct regexp_engine my_reg_engine;
@@ -142,1296 +143,7 @@ EXTERN_C const struct regexp_engine wild_reg_engine;
 
 #include "invlist_inline.h"
 #include "unicode_constants.h"
-
-#ifndef STATIC
-#define        STATIC  static
-#endif
-
-/* this is a chain of data about sub patterns we are processing that
-   need to be handled separately/specially in study_chunk. Its so
-   we can simulate recursion without losing state.  */
-struct scan_frame;
-typedef struct scan_frame {
-    regnode *last_regnode;      /* last node to process in this frame */
-    regnode *next_regnode;      /* next node to process when last is reached */
-    U32 prev_recursed_depth;
-    I32 stopparen;              /* what stopparen do we use */
-    bool in_gosub;              /* this or an outer frame is for GOSUB */
-
-    struct scan_frame *this_prev_frame; /* this previous frame */
-    struct scan_frame *prev_frame;      /* previous frame */
-    struct scan_frame *next_frame;      /* next frame */
-} scan_frame;
-
-/* Certain characters are output as a sequence with the first being a
- * backslash. */
-#define isBACKSLASHED_PUNCT(c)  memCHRs("-[]\\^", c)
-
-
-struct RExC_state_t {
-    U32                flags;                  /* RXf_* are we folding, multilining? */
-    U32                pm_flags;               /* PMf_* stuff from the calling PMOP */
-    char       *precomp;               /* uncompiled string. */
-    char       *precomp_end;           /* pointer to end of uncompiled string. */
-    REGEXP     *rx_sv;                 /* The SV that is the regexp. */
-    regexp     *rx;                    /* perl core regexp structure */
-    regexp_internal    *rxi;           /* internal data for regexp object
-                                           pprivate field */
-    char       *start;                 /* Start of input for compile */
-    char       *end;                   /* End of input for compile */
-    char       *parse;                 /* Input-scan pointer. */
-    char        *copy_start;            /* start of copy of input within
-                                           constructed parse string */
-    char        *save_copy_start;       /* Provides one level of saving
-                                           and restoring 'copy_start' */
-    char        *copy_start_in_input;   /* Position in input string
-                                           corresponding to copy_start */
-    SSize_t    whilem_seen;            /* number of WHILEM in this expr */
-    regnode    *emit_start;            /* Start of emitted-code area */
-    regnode_offset emit;               /* Code-emit pointer */
-    I32                naughty;                /* How bad is this pattern? */
-    I32                sawback;                /* Did we see \1, ...? */
-    SSize_t    size;                   /* Number of regnode equivalents in
-                                           pattern */
-    Size_t      sets_depth;              /* Counts recursion depth of already-
-                                           compiled regex set patterns */
-    U32                seen;
-
-    I32      parens_buf_size;           /* #slots malloced open/close_parens */
-    regnode_offset *open_parens;       /* offsets to open parens */
-    regnode_offset *close_parens;      /* offsets to close parens */
-    HV         *paren_names;           /* Paren names */
-
-    /* position beyond 'precomp' of the warning message furthest away from
-     * 'precomp'.  During the parse, no warnings are raised for any problems
-     * earlier in the parse than this position.  This works if warnings are
-     * raised the first time a given spot is parsed, and if only one
-     * independent warning is raised for any given spot */
-    Size_t     latest_warn_offset;
-
-    I32         npar;                   /* Capture buffer count so far in the
-                                           parse, (OPEN) plus one. ("par" 0 is
-                                           the whole pattern)*/
-    I32         total_par;              /* During initial parse, is either 0,
-                                           or -1; the latter indicating a
-                                           reparse is needed.  After that pass,
-                                           it is what 'npar' became after the
-                                           pass.  Hence, it being > 0 indicates
-                                           we are in a reparse situation */
-    I32                nestroot;               /* root parens we are in - used by
-                                           accept */
-    I32                seen_zerolen;
-    regnode     *end_op;                /* END node in program */
-    I32                utf8;           /* whether the pattern is utf8 or not */
-    I32                orig_utf8;      /* whether the pattern was originally in utf8 */
-                                /* XXX use this for future optimisation of case
-                                 * where pattern must be upgraded to utf8. */
-    I32                uni_semantics;  /* If a d charset modifier should use unicode
-                                   rules, even if the pattern is not in
-                                   utf8 */
-
-    I32         recurse_count;          /* Number of recurse regops we have generated */
-    regnode    **recurse;              /* Recurse regops */
-    U8          *study_chunk_recursed;  /* bitmap of which subs we have moved
-                                           through */
-    U32         study_chunk_recursed_bytes;  /* bytes in bitmap */
-    I32                in_lookaround;
-    I32                contains_locale;
-    I32                override_recoding;
-    I32         recode_x_to_native;
-    I32                in_multi_char_class;
-    int                code_index;             /* next code_blocks[] slot */
-    struct reg_code_blocks *code_blocks;/* positions of literal (?{})
-                                            within pattern */
-    SSize_t     maxlen;                        /* mininum possible number of chars in string to match */
-    scan_frame *frame_head;
-    scan_frame *frame_last;
-    U32         frame_count;
-    AV         *warn_text;
-    HV         *unlexed_names;
-    SV         *runtime_code_qr;       /* qr with the runtime code blocks */
-#ifdef DEBUGGING
-    const char  *lastparse;
-    I32         lastnum;
-    U32         study_chunk_recursed_count;
-    AV          *paren_name_list;       /* idx -> name */
-    SV          *mysv1;
-    SV          *mysv2;
-
-#define RExC_lastparse (pRExC_state->lastparse)
-#define RExC_lastnum   (pRExC_state->lastnum)
-#define RExC_paren_name_list    (pRExC_state->paren_name_list)
-#define RExC_study_chunk_recursed_count    (pRExC_state->study_chunk_recursed_count)
-#define RExC_mysv      (pRExC_state->mysv1)
-#define RExC_mysv1     (pRExC_state->mysv1)
-#define RExC_mysv2     (pRExC_state->mysv2)
-
-#endif
-    bool        seen_d_op;
-    bool        strict;
-    bool        study_started;
-    bool        in_script_run;
-    bool        use_BRANCHJ;
-    bool        sWARN_EXPERIMENTAL__VLB;
-    bool        sWARN_EXPERIMENTAL__REGEX_SETS;
-};
-
-#define RExC_flags     (pRExC_state->flags)
-#define RExC_pm_flags  (pRExC_state->pm_flags)
-#define RExC_precomp   (pRExC_state->precomp)
-#define RExC_copy_start_in_input (pRExC_state->copy_start_in_input)
-#define RExC_copy_start_in_constructed  (pRExC_state->copy_start)
-#define RExC_save_copy_start_in_constructed  (pRExC_state->save_copy_start)
-#define RExC_precomp_end (pRExC_state->precomp_end)
-#define RExC_rx_sv     (pRExC_state->rx_sv)
-#define RExC_rx                (pRExC_state->rx)
-#define RExC_rxi       (pRExC_state->rxi)
-#define RExC_start     (pRExC_state->start)
-#define RExC_end       (pRExC_state->end)
-#define RExC_parse     (pRExC_state->parse)
-#define RExC_latest_warn_offset (pRExC_state->latest_warn_offset )
-#define RExC_whilem_seen       (pRExC_state->whilem_seen)
-#define RExC_seen_d_op (pRExC_state->seen_d_op) /* Seen something that differs
-                                                   under /d from /u ? */
-
-#define RExC_emit      (pRExC_state->emit)
-#define RExC_emit_start        (pRExC_state->emit_start)
-#define RExC_sawback   (pRExC_state->sawback)
-#define RExC_seen      (pRExC_state->seen)
-#define RExC_size      (pRExC_state->size)
-#define RExC_maxlen        (pRExC_state->maxlen)
-#define RExC_npar      (pRExC_state->npar)
-#define RExC_total_parens      (pRExC_state->total_par)
-#define RExC_parens_buf_size   (pRExC_state->parens_buf_size)
-#define RExC_nestroot   (pRExC_state->nestroot)
-#define RExC_seen_zerolen      (pRExC_state->seen_zerolen)
-#define RExC_utf8      (pRExC_state->utf8)
-#define RExC_uni_semantics     (pRExC_state->uni_semantics)
-#define RExC_orig_utf8 (pRExC_state->orig_utf8)
-#define RExC_open_parens       (pRExC_state->open_parens)
-#define RExC_close_parens      (pRExC_state->close_parens)
-#define RExC_end_op    (pRExC_state->end_op)
-#define RExC_paren_names       (pRExC_state->paren_names)
-#define RExC_recurse   (pRExC_state->recurse)
-#define RExC_recurse_count     (pRExC_state->recurse_count)
-#define RExC_sets_depth         (pRExC_state->sets_depth)
-#define RExC_study_chunk_recursed        (pRExC_state->study_chunk_recursed)
-#define RExC_study_chunk_recursed_bytes  \
-                                   (pRExC_state->study_chunk_recursed_bytes)
-#define RExC_in_lookaround     (pRExC_state->in_lookaround)
-#define RExC_contains_locale   (pRExC_state->contains_locale)
-#define RExC_recode_x_to_native (pRExC_state->recode_x_to_native)
-
-#ifdef EBCDIC
-#  define SET_recode_x_to_native(x)                                         \
-                    STMT_START { RExC_recode_x_to_native = (x); } STMT_END
-#else
-#  define SET_recode_x_to_native(x) NOOP
-#endif
-
-#define RExC_in_multi_char_class (pRExC_state->in_multi_char_class)
-#define RExC_frame_head (pRExC_state->frame_head)
-#define RExC_frame_last (pRExC_state->frame_last)
-#define RExC_frame_count (pRExC_state->frame_count)
-#define RExC_strict (pRExC_state->strict)
-#define RExC_study_started      (pRExC_state->study_started)
-#define RExC_warn_text (pRExC_state->warn_text)
-#define RExC_in_script_run      (pRExC_state->in_script_run)
-#define RExC_use_BRANCHJ        (pRExC_state->use_BRANCHJ)
-#define RExC_warned_WARN_EXPERIMENTAL__VLB (pRExC_state->sWARN_EXPERIMENTAL__VLB)
-#define RExC_warned_WARN_EXPERIMENTAL__REGEX_SETS (pRExC_state->sWARN_EXPERIMENTAL__REGEX_SETS)
-#define RExC_unlexed_names (pRExC_state->unlexed_names)
-
-
-/***********************************************************************/
-/* UTILITY MACROS FOR ADVANCING OR SETTING THE PARSE "CURSOR" RExC_parse
- *
- * All of these macros depend on the above RExC_ accessor macros, which
- * in turns depend on a variable pRExC_state being in scope where they
- * are used. This is the standard regexp parser context variable which is
- * passed into every non-trivial parse function in this file.
- *
- * Note that the UTF macro is itself a wrapper around RExC_utf8, so all
- * of the macros which do not take an argument will operate on the
- * pRExC_state structure *only*.
- *
- * Please do NOT modify RExC_parse without using these macros. In the
- * future these macros will be extended for enhanced debugging and trace
- * output during the parse process.
- */
-
-/* RExC_parse_incf(flag)
- *
- * Increment RExC_parse to point at the next codepoint, while doing
- * the right thing depending on whether we are parsing UTF-8 strings
- * or not. The 'flag' argument determines if content is UTF-8 or not,
- * intended for cases where this is NOT governed by the UTF macro.
- *
- * Use RExC_parse_inc() if UTF-8ness is controlled by the UTF macro.
- *
- * WARNING: Does NOT take into account RExC_end; it is the callers
- * responsibility to make sure there are enough octets left in
- * RExC_parse to ensure that when processing UTF-8 we would not read
- * past the end of the string.
- */
-#define RExC_parse_incf(flag) STMT_START {              \
-    RExC_parse += (flag) ? UTF8SKIP(RExC_parse) : 1;    \
-} STMT_END
-
-/* RExC_parse_inc_safef(flag)
- *
- * Safely increment RExC_parse to point at the next codepoint,
- * doing the right thing depending on whether we are parsing
- * UTF-8 strings or not and NOT reading past the end of the buffer.
- * The 'flag' argument determines if content is UTF-8 or not,
- * intended for cases where this is NOT governed by the UTF macro.
- *
- * Use RExC_parse_safe() if UTF-8ness is controlled by the UTF macro.
- *
- * NOTE: Will NOT read past RExC_end when content is UTF-8.
- */
-#define RExC_parse_inc_safef(flag) STMT_START {                     \
-    RExC_parse += (flag) ? UTF8_SAFE_SKIP(RExC_parse,RExC_end) : 1; \
-} STMT_END
-
-/* RExC_parse_inc()
- *
- * Increment RExC_parse to point at the next codepoint,
- * doing the right thing depending on whether we are parsing
- * UTF-8 strings or not.
- *
- * WARNING: Does NOT take into account RExC_end, it is the callers
- * responsibility to make sure there are enough octets left in
- * RExC_parse to ensure that when processing UTF-8 we would not read
- * past the end of the string.
- *
- * NOTE: whether we are parsing UTF-8 or not is determined by the
- * UTF macro which is defined as cBOOL(RExC_parse_utf8), thus this
- * macro operates on the pRExC_state structure only.
- */
-#define RExC_parse_inc() RExC_parse_incf(UTF)
-
-/* RExC_parse_inc_safe()
- *
- * Safely increment RExC_parse to point at the next codepoint,
- * doing the right thing depending on whether we are parsing
- * UTF-8 strings or not and NOT reading past the end of the buffer.
- *
- * NOTE: whether we are parsing UTF-8 or not is determined by the
- * UTF macro which is defined as cBOOL(RExC_parse_utf8), thus this
- * macro operates on the pRExC_state structure only.
- */
-#define RExC_parse_inc_safe() RExC_parse_inc_safef(UTF)
-
-/* RExC_parse_inc_utf8()
- *
- * Increment RExC_parse to point at the next utf8 codepoint,
- * assumes content is UTF-8.
- *
- * WARNING: Does NOT take into account RExC_end; it is the callers
- * responsibility to make sure there are enough octets left in RExC_parse
- * to ensure that when processing UTF-8 we would not read past the end
- * of the string.
- */
-#define RExC_parse_inc_utf8() STMT_START {  \
-    RExC_parse += UTF8SKIP(RExC_parse);     \
-} STMT_END
-
-/* RExC_parse_inc_if_char()
- *
- * Increment RExC_parse to point at the next codepoint, if and only
- * if the current parse point is NOT a NULL, while doing the right thing
- * depending on whether we are parsing UTF-8 strings or not.
- *
- * WARNING: Does NOT take into account RExC_end, it is the callers
- * responsibility to make sure there are enough octets left in RExC_parse
- * to ensure that when processing UTF-8 we would not read past the end
- * of the string.
- *
- * NOTE: whether we are parsing UTF-8 or not is determined by the
- * UTF macro which is defined as cBOOL(RExC_parse_utf8), thus this
- * macro operates on the pRExC_state structure only.
- */
-#define RExC_parse_inc_if_char() STMT_START {         \
-    RExC_parse += SKIP_IF_CHAR(RExC_parse,RExC_end);  \
-} STMT_END
-
-/* RExC_parse_inc_by(n_octets)
- *
- * Increment the parse cursor by the number of octets specified by
- * the 'n_octets' argument.
- *
- * NOTE: Does NOT check ANY constraints. It is the callers responsibility
- * that this will not move past the end of the string, or leave the
- * pointer in the middle of a UTF-8 sequence.
- *
- * Typically used to advanced past previously analyzed content.
- */
-#define RExC_parse_inc_by(n_octets) STMT_START {  \
-    RExC_parse += (n_octets);                     \
-} STMT_END
-
-/* RExC_parse_set(to_ptr)
- *
- * Sets the RExC_parse pointer to the pointer specified by the 'to'
- * argument. No validation whatsoever is performed on the to pointer.
- */
-#define RExC_parse_set(to_ptr) STMT_START { \
-    RExC_parse = (to_ptr);                  \
-} STMT_END
-
-/**********************************************************************/
-
-/* Heuristic check on the complexity of the pattern: if TOO_NAUGHTY, we set
- * a flag to disable back-off on the fixed/floating substrings - if it's
- * a high complexity pattern we assume the benefit of avoiding a full match
- * is worth the cost of checking for the substrings even if they rarely help.
- */
-#define RExC_naughty   (pRExC_state->naughty)
-#define TOO_NAUGHTY (10)
-#define MARK_NAUGHTY(add) \
-    if (RExC_naughty < TOO_NAUGHTY) \
-        RExC_naughty += (add)
-#define MARK_NAUGHTY_EXP(exp, add) \
-    if (RExC_naughty < TOO_NAUGHTY) \
-        RExC_naughty += RExC_naughty / (exp) + (add)
-
-#define        isNON_BRACE_QUANTIFIER(c)   ((c) == '*' || (c) == '+' || (c) == '?')
-#define        isQUANTIFIER(s,e)  (   isNON_BRACE_QUANTIFIER(*s)                      \
-                            || ((*s) == '{' && regcurly(s, e, NULL)))
-
-/*
- * Flags to be passed up.
- */
-#define        HASWIDTH        0x01    /* Known to not match null strings, could match
-                                   non-null ones. */
-#define        SIMPLE          0x02    /* Exactly one character wide */
-                                /* (or LNBREAK as a special case) */
-#define POSTPONED      0x08    /* (?1),(?&name), (??{...}) or similar */
-#define TRYAGAIN       0x10    /* Weeded out a declaration. */
-#define RESTART_PARSE   0x20    /* Need to redo the parse */
-#define NEED_UTF8       0x40    /* In conjunction with RESTART_PARSE, need to
-                                   calcuate sizes as UTF-8 */
-
-#define REG_NODE_NUM(x) ((x) ? (int)((x)-RExC_emit_start) : -1)
-
-/* whether trie related optimizations are enabled */
-#if PERL_ENABLE_EXTENDED_TRIE_OPTIMISATION
-#define TRIE_STUDY_OPT
-#define FULL_TRIE_STUDY
-#define TRIE_STCLASS
-#endif
-
-/* About the term "restudy" and the var "restudied" and the defines
- * "SCF_TRIE_RESTUDY" and "SCF_TRIE_DOING_RESTUDY": All of these relate to
- * doing multiple study_chunk() calls over the same set of opcodes for* the
- * purpose of enhanced TRIE optimizations.
- *
- * Specifically, when TRIE_STUDY_OPT is defined, and it is defined in normal
- * builds, (see above), during compilation SCF_TRIE_RESTUDY may be enabled
- * which then causes the Perl_re_op_compile() to then call the optimizer
- * S_study_chunk() a second time to perform additional optimizations,
- * including the aho_corasick startclass optimization.
- * This additional pass will only happen once, which is managed by the
- * 'restudied' variable in Perl_re_op_compile().
- *
- * When this second pass is under way the flags passed into study_chunk() will
- * include SCF_TRIE_DOING_RESTUDY and this flag is and must be cascaded down
- * to any recursive calls to S_study_chunk().
- *
- * IMPORTANT: Any logic in study_chunk() that emits warnings should check that
- * the SCF_TRIE_DOING_RESTUDY flag is NOT set in 'flags', or the warning may
- * be produced twice.
- *
- * See commit 07be1b83a6b2d24b492356181ddf70e1c7917ae3 and
- * 688e03912e3bff2d2419c457d8b0e1bab3eb7112 for more details.
- */
-
-
-#define PBYTE(u8str,paren) ((U8*)(u8str))[(paren) >> 3]
-#define PBITVAL(paren) (1 << ((paren) & 7))
-#define PAREN_OFFSET(depth) \
-    (RExC_study_chunk_recursed + (depth) * RExC_study_chunk_recursed_bytes)
-#define PAREN_TEST(depth, paren) \
-    (PBYTE(PAREN_OFFSET(depth), paren) & PBITVAL(paren))
-#define PAREN_SET(depth, paren) \
-    (PBYTE(PAREN_OFFSET(depth), paren) |= PBITVAL(paren))
-#define PAREN_UNSET(depth, paren) \
-    (PBYTE(PAREN_OFFSET(depth), paren) &= ~PBITVAL(paren))
-
-#define REQUIRE_UTF8(flagp) STMT_START {                                   \
-                                     if (!UTF) {                           \
-                                         *flagp = RESTART_PARSE|NEED_UTF8; \
-                                         return 0;                         \
-                                     }                                     \
-                             } STMT_END
-
-/* /u is to be chosen if we are supposed to use Unicode rules, or if the
- * pattern is in UTF-8.  This latter condition is in case the outermost rules
- * are locale.  See GH #17278 */
-#define toUSE_UNI_CHARSET_NOT_DEPENDS (RExC_uni_semantics || UTF)
-
-/* Change from /d into /u rules, and restart the parse.  RExC_uni_semantics is
- * a flag that indicates we need to override /d with /u as a result of
- * something in the pattern.  It should only be used in regards to calling
- * set_regex_charset() or get_regex_charset() */
-#define REQUIRE_UNI_RULES(flagp, restart_retval)                            \
-    STMT_START {                                                            \
-            if (DEPENDS_SEMANTICS) {                                        \
-                set_regex_charset(&RExC_flags, REGEX_UNICODE_CHARSET);      \
-                RExC_uni_semantics = 1;                                     \
-                if (RExC_seen_d_op && LIKELY(! IN_PARENS_PASS)) {           \
-                    /* No need to restart the parse if we haven't seen      \
-                     * anything that differs between /u and /d, and no need \
-                     * to restart immediately if we're going to reparse     \
-                     * anyway to count parens */                            \
-                    *flagp |= RESTART_PARSE;                                \
-                    return restart_retval;                                  \
-                }                                                           \
-            }                                                               \
-    } STMT_END
-
-#define REQUIRE_BRANCHJ(flagp, restart_retval)                              \
-    STMT_START {                                                            \
-                RExC_use_BRANCHJ = 1;                                       \
-                *flagp |= RESTART_PARSE;                                    \
-                return restart_retval;                                      \
-    } STMT_END
-
-/* Until we have completed the parse, we leave RExC_total_parens at 0 or
- * less.  After that, it must always be positive, because the whole re is
- * considered to be surrounded by virtual parens.  Setting it to negative
- * indicates there is some construct that needs to know the actual number of
- * parens to be properly handled.  And that means an extra pass will be
- * required after we've counted them all */
-#define ALL_PARENS_COUNTED (RExC_total_parens > 0)
-#define REQUIRE_PARENS_PASS                                                 \
-    STMT_START {  /* No-op if have completed a pass */                      \
-                    if (! ALL_PARENS_COUNTED) RExC_total_parens = -1;       \
-    } STMT_END
-#define IN_PARENS_PASS (RExC_total_parens < 0)
-
-
-/* This is used to return failure (zero) early from the calling function if
- * various flags in 'flags' are set.  Two flags always cause a return:
- * 'RESTART_PARSE' and 'NEED_UTF8'.   'extra' can be used to specify any
- * additional flags that should cause a return; 0 if none.  If the return will
- * be done, '*flagp' is first set to be all of the flags that caused the
- * return. */
-#define RETURN_FAIL_ON_RESTART_OR_FLAGS(flags,flagp,extra)                  \
-    STMT_START {                                                            \
-            if ((flags) & (RESTART_PARSE|NEED_UTF8|(extra))) {              \
-                *(flagp) = (flags) & (RESTART_PARSE|NEED_UTF8|(extra));     \
-                return 0;                                                   \
-            }                                                               \
-    } STMT_END
-
-#define MUST_RESTART(flags) ((flags) & (RESTART_PARSE))
-
-#define RETURN_FAIL_ON_RESTART(flags,flagp)                                 \
-                        RETURN_FAIL_ON_RESTART_OR_FLAGS( flags, flagp, 0)
-#define RETURN_FAIL_ON_RESTART_FLAGP(flagp)                                 \
-                                    if (MUST_RESTART(*(flagp))) return 0
-
-/* This converts the named class defined in regcomp.h to its equivalent class
- * number defined in handy.h. */
-#define namedclass_to_classnum(class)  ((int) ((class) / 2))
-#define classnum_to_namedclass(classnum)  ((classnum) * 2)
-
-#define _invlist_union_complement_2nd(a, b, output) \
-                        _invlist_union_maybe_complement_2nd(a, b, TRUE, output)
-#define _invlist_intersection_complement_2nd(a, b, output) \
-                 _invlist_intersection_maybe_complement_2nd(a, b, TRUE, output)
-
-/* We add a marker if we are deferring expansion of a property that is both
- * 1) potentiallly user-defined; and
- * 2) could also be an official Unicode property.
- *
- * Without this marker, any deferred expansion can only be for a user-defined
- * one.  This marker shouldn't conflict with any that could be in a legal name,
- * and is appended to its name to indicate this.  There is a string and
- * character form */
-#define DEFERRED_COULD_BE_OFFICIAL_MARKERs  "~"
-#define DEFERRED_COULD_BE_OFFICIAL_MARKERc  '~'
-
-/* What is infinity for optimization purposes */
-#define OPTIMIZE_INFTY  SSize_t_MAX
-
-/* About scan_data_t.
-
-  During optimisation we recurse through the regexp program performing
-  various inplace (keyhole style) optimisations. In addition study_chunk
-  and scan_commit populate this data structure with information about
-  what strings MUST appear in the pattern. We look for the longest
-  string that must appear at a fixed location, and we look for the
-  longest string that may appear at a floating location. So for instance
-  in the pattern:
-
-    /FOO[xX]A.*B[xX]BAR/
-
-  Both 'FOO' and 'A' are fixed strings. Both 'B' and 'BAR' are floating
-  strings (because they follow a .* construct). study_chunk will identify
-  both FOO and BAR as being the longest fixed and floating strings respectively.
-
-  The strings can be composites, for instance
-
-     /(f)(o)(o)/
-
-  will result in a composite fixed substring 'foo'.
-
-  For each string some basic information is maintained:
-
-  - min_offset
-    This is the position the string must appear at, or not before.
-    It also implicitly (when combined with minlenp) tells us how many
-    characters must match before the string we are searching for.
-    Likewise when combined with minlenp and the length of the string it
-    tells us how many characters must appear after the string we have
-    found.
-
-  - max_offset
-    Only used for floating strings. This is the rightmost point that
-    the string can appear at. If set to OPTIMIZE_INFTY it indicates that the
-    string can occur infinitely far to the right.
-    For fixed strings, it is equal to min_offset.
-
-  - minlenp
-    A pointer to the minimum number of characters of the pattern that the
-    string was found inside. This is important as in the case of positive
-    lookahead or positive lookbehind we can have multiple patterns
-    involved. Consider
-
-    /(?=FOO).*F/
-
-    The minimum length of the pattern overall is 3, the minimum length
-    of the lookahead part is 3, but the minimum length of the part that
-    will actually match is 1. So 'FOO's minimum length is 3, but the
-    minimum length for the F is 1. This is important as the minimum length
-    is used to determine offsets in front of and behind the string being
-    looked for.  Since strings can be composites this is the length of the
-    pattern at the time it was committed with a scan_commit. Note that
-    the length is calculated by study_chunk, so that the minimum lengths
-    are not known until the full pattern has been compiled, thus the
-    pointer to the value.
-
-  - lookbehind
-
-    In the case of lookbehind the string being searched for can be
-    offset past the start point of the final matching string.
-    If this value was just blithely removed from the min_offset it would
-    invalidate some of the calculations for how many chars must match
-    before or after (as they are derived from min_offset and minlen and
-    the length of the string being searched for).
-    When the final pattern is compiled and the data is moved from the
-    scan_data_t structure into the regexp structure the information
-    about lookbehind is factored in, with the information that would
-    have been lost precalculated in the end_shift field for the
-    associated string.
-
-  The fields pos_min and pos_delta are used to store the minimum offset
-  and the delta to the maximum offset at the current point in the pattern.
-
-*/
-
-struct scan_data_substrs {
-    SV      *str;       /* longest substring found in pattern */
-    SSize_t min_offset; /* earliest point in string it can appear */
-    SSize_t max_offset; /* latest point in string it can appear */
-    SSize_t *minlenp;   /* pointer to the minlen relevant to the string */
-    SSize_t lookbehind; /* is the pos of the string modified by LB */
-    I32 flags;          /* per substring SF_* and SCF_* flags */
-};
-
-typedef struct scan_data_t {
-    /*I32 len_min;      unused */
-    /*I32 len_delta;    unused */
-    SSize_t pos_min;
-    SSize_t pos_delta;
-    SV *last_found;
-    SSize_t last_end;      /* min value, <0 unless valid. */
-    SSize_t last_start_min;
-    SSize_t last_start_max;
-    U8      cur_is_floating; /* whether the last_* values should be set as
-                              * the next fixed (0) or floating (1)
-                              * substring */
-
-    /* [0] is longest fixed substring so far, [1] is longest float so far */
-    struct scan_data_substrs  substrs[2];
-
-    I32 flags;             /* common SF_* and SCF_* flags */
-    I32 whilem_c;
-    SSize_t *last_closep;
-    regnode **last_close_opp; /* pointer to pointer to last CLOSE regop
-                                 seen. DO NOT DEREFERENCE the regnode
-                                 pointer - the op may have been optimized
-                                 away */
-    regnode_ssc *start_class;
-} scan_data_t;
-
-/*
- * Forward declarations for pregcomp()'s friends.
- */
-
-static const scan_data_t zero_scan_data = {
-    0, 0, NULL, 0, 0, 0, 0,
-    {
-        { NULL, 0, 0, 0, 0, 0 },
-        { NULL, 0, 0, 0, 0, 0 },
-    },
-    0, 0, NULL, NULL, NULL
-};
-
-/* study flags */
-
-#define SF_BEFORE_SEOL         0x0001
-#define SF_BEFORE_MEOL         0x0002
-#define SF_BEFORE_EOL          (SF_BEFORE_SEOL|SF_BEFORE_MEOL)
-
-#define SF_IS_INF              0x0040
-#define SF_HAS_PAR             0x0080
-#define SF_IN_PAR              0x0100
-#define SF_HAS_EVAL            0x0200
-
-
-/* SCF_DO_SUBSTR is the flag that tells the regexp analyzer to track the
- * longest substring in the pattern. When it is not set the optimiser keeps
- * track of position, but does not keep track of the actual strings seen,
- *
- * So for instance /foo/ will be parsed with SCF_DO_SUBSTR being true, but
- * /foo/i will not.
- *
- * Similarly, /foo.*(blah|erm|huh).*fnorble/ will have "foo" and "fnorble"
- * parsed with SCF_DO_SUBSTR on, but while processing the (...) it will be
- * turned off because of the alternation (BRANCH). */
-#define SCF_DO_SUBSTR          0x0400
-
-#define SCF_DO_STCLASS_AND     0x0800
-#define SCF_DO_STCLASS_OR      0x1000
-#define SCF_DO_STCLASS         (SCF_DO_STCLASS_AND|SCF_DO_STCLASS_OR)
-#define SCF_WHILEM_VISITED_POS 0x2000
-
-#define SCF_TRIE_RESTUDY        0x4000 /* Need to do restudy in study_chunk()?
-                                          Search for "restudy" in this file
-                                          to find a detailed explanation.*/
-#define SCF_SEEN_ACCEPT         0x8000
-#define SCF_TRIE_DOING_RESTUDY 0x10000 /* Are we in restudy right now?
-                                          Search for "restudy" in this file
-                                          to find a detailed explanation. */
-#define SCF_IN_DEFINE          0x20000
-
-
-
-#define UTF cBOOL(RExC_utf8)
-
-/* The enums for all these are ordered so things work out correctly */
-#define LOC (get_regex_charset(RExC_flags) == REGEX_LOCALE_CHARSET)
-#define DEPENDS_SEMANTICS (get_regex_charset(RExC_flags)                    \
-                                                     == REGEX_DEPENDS_CHARSET)
-#define UNI_SEMANTICS (get_regex_charset(RExC_flags) == REGEX_UNICODE_CHARSET)
-#define AT_LEAST_UNI_SEMANTICS (get_regex_charset(RExC_flags)                \
-                                                     >= REGEX_UNICODE_CHARSET)
-#define ASCII_RESTRICTED (get_regex_charset(RExC_flags)                      \
-                                            == REGEX_ASCII_RESTRICTED_CHARSET)
-#define AT_LEAST_ASCII_RESTRICTED (get_regex_charset(RExC_flags)             \
-                                            >= REGEX_ASCII_RESTRICTED_CHARSET)
-#define ASCII_FOLD_RESTRICTED (get_regex_charset(RExC_flags)                 \
-                                        == REGEX_ASCII_MORE_RESTRICTED_CHARSET)
-
-#define FOLD cBOOL(RExC_flags & RXf_PMf_FOLD)
-
-/* For programs that want to be strictly Unicode compatible by dying if any
- * attempt is made to match a non-Unicode code point against a Unicode
- * property.  */
-#define ALWAYS_WARN_SUPER  ckDEAD(packWARN(WARN_NON_UNICODE))
-
-#define OOB_NAMEDCLASS         -1
-
-/* There is no code point that is out-of-bounds, so this is problematic.  But
- * its only current use is to initialize a variable that is always set before
- * looked at. */
-#define OOB_UNICODE            0xDEADBEEF
-
-#define CHR_SVLEN(sv) (UTF ? sv_len_utf8(sv) : SvCUR(sv))
-
-
-/* length of regex to show in messages that don't mark a position within */
-#define RegexLengthToShowInErrorMessages 127
-
-/*
- * If MARKER[12] are adjusted, be sure to adjust the constants at the top
- * of t/op/regmesg.t, the tests in t/op/re_tests, and those in
- * op/pragma/warn/regcomp.
- */
-#define MARKER1 "<-- HERE"    /* marker as it appears in the description */
-#define MARKER2 " <-- HERE "  /* marker as it appears within the regex */
-
-#define REPORT_LOCATION " in regex; marked by " MARKER1    \
-                        " in m/%" UTF8f MARKER2 "%" UTF8f "/"
-
-/* The code in this file in places uses one level of recursion with parsing
- * rebased to an alternate string constructed by us in memory.  This can take
- * the form of something that is completely different from the input, or
- * something that uses the input as part of the alternate.  In the first case,
- * there should be no possibility of an error, as we are in complete control of
- * the alternate string.  But in the second case we don't completely control
- * the input portion, so there may be errors in that.  Here's an example:
- *      /[abc\x{DF}def]/ui
- * is handled specially because \x{df} folds to a sequence of more than one
- * character: 'ss'.  What is done is to create and parse an alternate string,
- * which looks like this:
- *      /(?:\x{DF}|[abc\x{DF}def])/ui
- * where it uses the input unchanged in the middle of something it constructs,
- * which is a branch for the DF outside the character class, and clustering
- * parens around the whole thing. (It knows enough to skip the DF inside the
- * class while in this substitute parse.) 'abc' and 'def' may have errors that
- * need to be reported.  The general situation looks like this:
- *
- *                                       |<------- identical ------>|
- *              sI                       tI               xI       eI
- * Input:       ---------------------------------------------------------------
- * Constructed:         ---------------------------------------------------
- *                      sC               tC               xC       eC     EC
- *                                       |<------- identical ------>|
- *
- * sI..eI   is the portion of the input pattern we are concerned with here.
- * sC..EC   is the constructed substitute parse string.
- *  sC..tC  is constructed by us
- *  tC..eC  is an exact duplicate of the portion of the input pattern tI..eI.
- *          In the diagram, these are vertically aligned.
- *  eC..EC  is also constructed by us.
- * xC       is the position in the substitute parse string where we found a
- *          problem.
- * xI       is the position in the original pattern corresponding to xC.
- *
- * We want to display a message showing the real input string.  Thus we need to
- * translate from xC to xI.  We know that xC >= tC, since the portion of the
- * string sC..tC has been constructed by us, and so shouldn't have errors.  We
- * get:
- *      xI = tI + (xC - tC)
- *
- * When the substitute parse is constructed, the code needs to set:
- *      RExC_start (sC)
- *      RExC_end (eC)
- *      RExC_copy_start_in_input  (tI)
- *      RExC_copy_start_in_constructed (tC)
- * and restore them when done.
- *
- * During normal processing of the input pattern, both
- * 'RExC_copy_start_in_input' and 'RExC_copy_start_in_constructed' are set to
- * sI, so that xC equals xI.
- */
-
-#define sI              RExC_precomp
-#define eI              RExC_precomp_end
-#define sC              RExC_start
-#define eC              RExC_end
-#define tI              RExC_copy_start_in_input
-#define tC              RExC_copy_start_in_constructed
-#define xI(xC)          (tI + (xC - tC))
-#define xI_offset(xC)   (xI(xC) - sI)
-
-#define REPORT_LOCATION_ARGS(xC)                                            \
-    UTF8fARG(UTF,                                                           \
-             (xI(xC) > eI) /* Don't run off end */                          \
-              ? eI - sI   /* Length before the <--HERE */                   \
-              : ((xI_offset(xC) >= 0)                                       \
-                 ? xI_offset(xC)                                            \
-                 : (Perl_croak(aTHX_ "panic: %s: %d: negative offset: %"    \
-                                    IVdf " trying to output message for "   \
-                                    " pattern %.*s",                        \
-                                    __FILE__, __LINE__, (IV) xI_offset(xC), \
-                                    ((int) (eC - sC)), sC), 0)),            \
-             sI),         /* The input pattern printed up to the <--HERE */ \
-    UTF8fARG(UTF,                                                           \
-             (xI(xC) > eI) ? 0 : eI - xI(xC), /* Length after <--HERE */    \
-             (xI(xC) > eI) ? eI : xI(xC))     /* pattern after <--HERE */
-
-/* Used to point after bad bytes for an error message, but avoid skipping
- * past a nul byte. */
-#define SKIP_IF_CHAR(s, e) (!*(s) ? 0 : UTF ? UTF8_SAFE_SKIP(s, e) : 1)
-
-/* Set up to clean up after our imminent demise */
-#define PREPARE_TO_DIE                                                      \
-    STMT_START {                                                           \
-        if (RExC_rx_sv)                                                     \
-            SAVEFREESV(RExC_rx_sv);                                         \
-        if (RExC_open_parens)                                               \
-            SAVEFREEPV(RExC_open_parens);                                   \
-        if (RExC_close_parens)                                              \
-            SAVEFREEPV(RExC_close_parens);                                  \
-    } STMT_END
-
-/*
- * Calls SAVEDESTRUCTOR_X if needed, then calls Perl_croak with the given
- * arg. Show regex, up to a maximum length. If it's too long, chop and add
- * "...".
- */
-#define _FAIL(code) STMT_START {                                       \
-    const char *ellipses = "";                                         \
-    IV len = RExC_precomp_end - RExC_precomp;                          \
-                                                                        \
-    PREPARE_TO_DIE;                                                    \
-    if (len > RegexLengthToShowInErrorMessages) {                      \
-        /* chop 10 shorter than the max, to ensure meaning of "..." */ \
-        len = RegexLengthToShowInErrorMessages - 10;                   \
-        ellipses = "...";                                              \
-    }                                                                  \
-    code;                                                               \
-} STMT_END
-
-#define        FAIL(msg) _FAIL(                            \
-    Perl_croak(aTHX_ "%s in regex m/%" UTF8f "%s/",        \
-            msg, UTF8fARG(UTF, len, RExC_precomp), ellipses))
-
-#define        FAIL2(msg,arg) _FAIL(                       \
-    Perl_croak(aTHX_ msg " in regex m/%" UTF8f "%s/",      \
-            arg, UTF8fARG(UTF, len, RExC_precomp), ellipses))
-
-#define        FAIL3(msg,arg1,arg2) _FAIL(                         \
-    Perl_croak(aTHX_ msg " in regex m/%" UTF8f "%s/",      \
-     arg1, arg2, UTF8fARG(UTF, len, RExC_precomp), ellipses))
-
-/*
- * Simple_vFAIL -- like FAIL, but marks the current location in the scan
- */
-#define        Simple_vFAIL(m) STMT_START {                                    \
-    Perl_croak(aTHX_ "%s" REPORT_LOCATION,                             \
-            m, REPORT_LOCATION_ARGS(RExC_parse));                      \
-} STMT_END
-
-/*
- * Calls SAVEDESTRUCTOR_X if needed, then Simple_vFAIL()
- */
-#define        vFAIL(m) STMT_START {                           \
-    PREPARE_TO_DIE;                                     \
-    Simple_vFAIL(m);                                   \
-} STMT_END
-
-/*
- * Like Simple_vFAIL(), but accepts two arguments.
- */
-#define        Simple_vFAIL2(m,a1) STMT_START {                        \
-    S_re_croak(aTHX_ UTF, m REPORT_LOCATION, a1,               \
-                      REPORT_LOCATION_ARGS(RExC_parse));       \
-} STMT_END
-
-/*
- * Calls SAVEDESTRUCTOR_X if needed, then Simple_vFAIL2().
- */
-#define        vFAIL2(m,a1) STMT_START {                       \
-    PREPARE_TO_DIE;                                     \
-    Simple_vFAIL2(m, a1);                              \
-} STMT_END
-
-
-/*
- * Like Simple_vFAIL(), but accepts three arguments.
- */
-#define        Simple_vFAIL3(m, a1, a2) STMT_START {                   \
-    S_re_croak(aTHX_ UTF, m REPORT_LOCATION, a1, a2,           \
-            REPORT_LOCATION_ARGS(RExC_parse));                 \
-} STMT_END
-
-/*
- * Calls SAVEDESTRUCTOR_X if needed, then Simple_vFAIL3().
- */
-#define        vFAIL3(m,a1,a2) STMT_START {                    \
-    PREPARE_TO_DIE;                                     \
-    Simple_vFAIL3(m, a1, a2);                          \
-} STMT_END
-
-/*
- * Like Simple_vFAIL(), but accepts four arguments.
- */
-#define        Simple_vFAIL4(m, a1, a2, a3) STMT_START {               \
-    S_re_croak(aTHX_ UTF, m REPORT_LOCATION, a1, a2, a3,       \
-            REPORT_LOCATION_ARGS(RExC_parse));                 \
-} STMT_END
-
-#define        vFAIL4(m,a1,a2,a3) STMT_START {                 \
-    PREPARE_TO_DIE;                                     \
-    Simple_vFAIL4(m, a1, a2, a3);                      \
-} STMT_END
-
-/* A specialized version of vFAIL2 that works with UTF8f */
-#define vFAIL2utf8f(m, a1) STMT_START {             \
-    PREPARE_TO_DIE;                                 \
-    S_re_croak(aTHX_ UTF, m REPORT_LOCATION, a1,  \
-            REPORT_LOCATION_ARGS(RExC_parse));      \
-} STMT_END
-
-#define vFAIL3utf8f(m, a1, a2) STMT_START {             \
-    PREPARE_TO_DIE;                                     \
-    S_re_croak(aTHX_ UTF, m REPORT_LOCATION, a1, a2,  \
-            REPORT_LOCATION_ARGS(RExC_parse));          \
-} STMT_END
-
-/* Setting this to NULL is a signal to not output warnings */
-#define TURN_OFF_WARNINGS_IN_SUBSTITUTE_PARSE                               \
-    STMT_START {                                                            \
-      RExC_save_copy_start_in_constructed  = RExC_copy_start_in_constructed;\
-      RExC_copy_start_in_constructed = NULL;                                \
-    } STMT_END
-#define RESTORE_WARNINGS                                                    \
-    RExC_copy_start_in_constructed = RExC_save_copy_start_in_constructed
-
-/* Since a warning can be generated multiple times as the input is reparsed, we
- * output it the first time we come to that point in the parse, but suppress it
- * otherwise.  'RExC_copy_start_in_constructed' being NULL is a flag to not
- * generate any warnings */
-#define TO_OUTPUT_WARNINGS(loc)                                         \
-  (   RExC_copy_start_in_constructed                                    \
-   && ((xI(loc)) - RExC_precomp) > (Ptrdiff_t) RExC_latest_warn_offset)
-
-/* After we've emitted a warning, we save the position in the input so we don't
- * output it again */
-#define UPDATE_WARNINGS_LOC(loc)                                        \
-    STMT_START {                                                        \
-        if (TO_OUTPUT_WARNINGS(loc)) {                                  \
-            RExC_latest_warn_offset = MAX(sI, MIN(eI, xI(loc)))         \
-                                                       - RExC_precomp;  \
-        }                                                               \
-    } STMT_END
-
-/* 'warns' is the output of the packWARNx macro used in 'code' */
-#define _WARN_HELPER(loc, warns, code)                                  \
-    STMT_START {                                                        \
-        if (! RExC_copy_start_in_constructed) {                         \
-            Perl_croak( aTHX_ "panic! %s: %d: Tried to warn when none"  \
-                              " expected at '%s'",                      \
-                              __FILE__, __LINE__, loc);                 \
-        }                                                               \
-        if (TO_OUTPUT_WARNINGS(loc)) {                                  \
-            if (ckDEAD(warns))                                          \
-                PREPARE_TO_DIE;                                         \
-            code;                                                       \
-            UPDATE_WARNINGS_LOC(loc);                                   \
-        }                                                               \
-    } STMT_END
-
-/* m is not necessarily a "literal string", in this macro */
-#define warn_non_literal_string(loc, packed_warn, m)                    \
-    _WARN_HELPER(loc, packed_warn,                                      \
-                      Perl_warner(aTHX_ packed_warn,                    \
-                                       "%s" REPORT_LOCATION,            \
-                                  m, REPORT_LOCATION_ARGS(loc)))
-#define reg_warn_non_literal_string(loc, m)                             \
-                warn_non_literal_string(loc, packWARN(WARN_REGEXP), m)
-
-#define ckWARN2_non_literal_string(loc, packwarn, m, a1)                    \
-    STMT_START {                                                            \
-                char * format;                                              \
-                Size_t format_size = strlen(m) + strlen(REPORT_LOCATION)+ 1;\
-                Newx(format, format_size, char);                            \
-                my_strlcpy(format, m, format_size);                         \
-                my_strlcat(format, REPORT_LOCATION, format_size);           \
-                SAVEFREEPV(format);                                         \
-                _WARN_HELPER(loc, packwarn,                                 \
-                      Perl_ck_warner(aTHX_ packwarn,                        \
-                                        format,                             \
-                                        a1, REPORT_LOCATION_ARGS(loc)));    \
-    } STMT_END
-
-#define        ckWARNreg(loc,m)                                                \
-    _WARN_HELPER(loc, packWARN(WARN_REGEXP),                            \
-                      Perl_ck_warner(aTHX_ packWARN(WARN_REGEXP),       \
-                                          m REPORT_LOCATION,           \
-                                          REPORT_LOCATION_ARGS(loc)))
-
-#define        vWARN(loc, m)                                                   \
-    _WARN_HELPER(loc, packWARN(WARN_REGEXP),                            \
-                      Perl_warner(aTHX_ packWARN(WARN_REGEXP),          \
-                                       m REPORT_LOCATION,               \
-                                       REPORT_LOCATION_ARGS(loc)))      \
-
-#define        vWARN_dep(loc, m)                                               \
-    _WARN_HELPER(loc, packWARN(WARN_DEPRECATED),                        \
-                      Perl_warner(aTHX_ packWARN(WARN_DEPRECATED),      \
-                                       m REPORT_LOCATION,               \
-                                       REPORT_LOCATION_ARGS(loc)))
-
-#define        ckWARNdep(loc,m)                                                \
-    _WARN_HELPER(loc, packWARN(WARN_DEPRECATED),                        \
-                      Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED), \
-                                            m REPORT_LOCATION,          \
-                                            REPORT_LOCATION_ARGS(loc)))
-
-#define        ckWARNregdep(loc,m)                                                 \
-    _WARN_HELPER(loc, packWARN2(WARN_DEPRECATED, WARN_REGEXP),              \
-                      Perl_ck_warner_d(aTHX_ packWARN2(WARN_DEPRECATED,     \
-                                                      WARN_REGEXP),         \
-                                             m REPORT_LOCATION,             \
-                                             REPORT_LOCATION_ARGS(loc)))
-
-#define        ckWARN2reg_d(loc,m, a1)                                             \
-    _WARN_HELPER(loc, packWARN(WARN_REGEXP),                                \
-                      Perl_ck_warner_d(aTHX_ packWARN(WARN_REGEXP),         \
-                                            m REPORT_LOCATION,              \
-                                            a1, REPORT_LOCATION_ARGS(loc)))
-
-#define        ckWARN2reg(loc, m, a1)                                              \
-    _WARN_HELPER(loc, packWARN(WARN_REGEXP),                                \
-                      Perl_ck_warner(aTHX_ packWARN(WARN_REGEXP),           \
-                                          m REPORT_LOCATION,               \
-                                          a1, REPORT_LOCATION_ARGS(loc)))
-
-#define        vWARN3(loc, m, a1, a2)                                              \
-    _WARN_HELPER(loc, packWARN(WARN_REGEXP),                                \
-                      Perl_warner(aTHX_ packWARN(WARN_REGEXP),              \
-                                       m REPORT_LOCATION,                   \
-                                       a1, a2, REPORT_LOCATION_ARGS(loc)))
-
-#define        ckWARN3reg(loc, m, a1, a2)                                          \
-    _WARN_HELPER(loc, packWARN(WARN_REGEXP),                                \
-                      Perl_ck_warner(aTHX_ packWARN(WARN_REGEXP),           \
-                                          m REPORT_LOCATION,                \
-                                          a1, a2,                           \
-                                          REPORT_LOCATION_ARGS(loc)))
-
-#define        vWARN4(loc, m, a1, a2, a3)                                      \
-    _WARN_HELPER(loc, packWARN(WARN_REGEXP),                            \
-                      Perl_warner(aTHX_ packWARN(WARN_REGEXP),          \
-                                       m REPORT_LOCATION,               \
-                                       a1, a2, a3,                      \
-                                       REPORT_LOCATION_ARGS(loc)))
-
-#define        ckWARN4reg(loc, m, a1, a2, a3)                                  \
-    _WARN_HELPER(loc, packWARN(WARN_REGEXP),                            \
-                      Perl_ck_warner(aTHX_ packWARN(WARN_REGEXP),       \
-                                          m REPORT_LOCATION,            \
-                                          a1, a2, a3,                   \
-                                          REPORT_LOCATION_ARGS(loc)))
-
-#define        vWARN5(loc, m, a1, a2, a3, a4)                                  \
-    _WARN_HELPER(loc, packWARN(WARN_REGEXP),                            \
-                      Perl_warner(aTHX_ packWARN(WARN_REGEXP),          \
-                                       m REPORT_LOCATION,              \
-                                       a1, a2, a3, a4,                  \
-                                       REPORT_LOCATION_ARGS(loc)))
-
-#define        ckWARNexperimental(loc, class, m)                               \
-    STMT_START {                                                        \
-        if (! RExC_warned_ ## class) { /* warn once per compilation */  \
-            RExC_warned_ ## class = 1;                                  \
-            _WARN_HELPER(loc, packWARN(class),                          \
-                      Perl_ck_warner_d(aTHX_ packWARN(class),           \
-                                            m REPORT_LOCATION,          \
-                                            REPORT_LOCATION_ARGS(loc)));\
-        }                                                               \
-    } STMT_END
-
-#define ckWARNexperimental_with_arg(loc, class, m, arg)                 \
-    STMT_START {                                                        \
-        if (! RExC_warned_ ## class) { /* warn once per compilation */  \
-            RExC_warned_ ## class = 1;                                  \
-            _WARN_HELPER(loc, packWARN(class),                          \
-                      Perl_ck_warner_d(aTHX_ packWARN(class),           \
-                                       m REPORT_LOCATION,               \
-                                       arg, REPORT_LOCATION_ARGS(loc)));\
-        }                                                               \
-    } STMT_END
-
-/* Convert between a pointer to a node and its offset from the beginning of the
- * program */
-#define REGNODE_p(offset)    (RExC_emit_start + (offset))
-#define REGNODE_OFFSET(node) ((node) - RExC_emit_start)
-
-#define ProgLen(ri) ri->proglen
-#define SetProgLen(ri,x) ri->proglen = x
-
-#if PERL_ENABLE_EXPERIMENTAL_REGEX_OPTIMISATIONS
-#define EXPERIMENTAL_INPLACESCAN
-#endif /*PERL_ENABLE_EXPERIMENTAL_REGEX_OPTIMISATIONS*/
-
-#ifdef DEBUGGING
-int
-Perl_re_printf(pTHX_ const char *fmt, ...)
-{
-    va_list ap;
-    int result;
-    PerlIO *f= Perl_debug_log;
-    PERL_ARGS_ASSERT_RE_PRINTF;
-    va_start(ap, fmt);
-    result = PerlIO_vprintf(f, fmt, ap);
-    va_end(ap);
-    return result;
-}
-
-int
-Perl_re_indentf(pTHX_ const char *fmt, U32 depth, ...)
-{
-    va_list ap;
-    int result;
-    PerlIO *f= Perl_debug_log;
-    PERL_ARGS_ASSERT_RE_INDENTF;
-    va_start(ap, depth);
-    PerlIO_printf(f, "%*s", ( (int)depth % 20 ) * 2, "");
-    result = PerlIO_vprintf(f, fmt, ap);
-    va_end(ap);
-    return result;
-}
-#endif /* DEBUGGING */
-
-#define DEBUG_RExC_seen()                                                   \
-        DEBUG_OPTIMISE_MORE_r({                                             \
-            Perl_re_printf( aTHX_ "RExC_seen: ");                           \
-                                                                            \
-            if (RExC_seen & REG_ZERO_LEN_SEEN)                              \
-                Perl_re_printf( aTHX_ "REG_ZERO_LEN_SEEN ");                \
-                                                                            \
-            if (RExC_seen & REG_LOOKBEHIND_SEEN)                            \
-                Perl_re_printf( aTHX_ "REG_LOOKBEHIND_SEEN ");              \
-                                                                            \
-            if (RExC_seen & REG_GPOS_SEEN)                                  \
-                Perl_re_printf( aTHX_ "REG_GPOS_SEEN ");                    \
-                                                                            \
-            if (RExC_seen & REG_RECURSE_SEEN)                               \
-                Perl_re_printf( aTHX_ "REG_RECURSE_SEEN ");                 \
-                                                                            \
-            if (RExC_seen & REG_TOP_LEVEL_BRANCHES_SEEN)                    \
-                Perl_re_printf( aTHX_ "REG_TOP_LEVEL_BRANCHES_SEEN ");      \
-                                                                            \
-            if (RExC_seen & REG_VERBARG_SEEN)                               \
-                Perl_re_printf( aTHX_ "REG_VERBARG_SEEN ");                 \
-                                                                            \
-            if (RExC_seen & REG_CUTGROUP_SEEN)                              \
-                Perl_re_printf( aTHX_ "REG_CUTGROUP_SEEN ");                \
-                                                                            \
-            if (RExC_seen & REG_RUN_ON_COMMENT_SEEN)                        \
-                Perl_re_printf( aTHX_ "REG_RUN_ON_COMMENT_SEEN ");          \
-                                                                            \
-            if (RExC_seen & REG_UNFOLDED_MULTI_SEEN)                        \
-                Perl_re_printf( aTHX_ "REG_UNFOLDED_MULTI_SEEN ");          \
-                                                                            \
-            if (RExC_seen & REG_UNBOUNDED_QUANTIFIER_SEEN)                  \
-                Perl_re_printf( aTHX_ "REG_UNBOUNDED_QUANTIFIER_SEEN ");    \
-                                                                            \
-            Perl_re_printf( aTHX_ "\n");                                    \
-        });
-
-#define DEBUG_SHOW_STUDY_FLAG(flags,flag) \
-  if ((flags) & flag) Perl_re_printf( aTHX_  "%s ", #flag)
-
-
-#ifdef DEBUGGING
-static void
-S_debug_show_study_flags(pTHX_ U32 flags, const char *open_str,
-                                    const char *close_str)
-{
-    if (!flags)
-        return;
-
-    Perl_re_printf( aTHX_  "%s", open_str);
-    DEBUG_SHOW_STUDY_FLAG(flags, SF_BEFORE_SEOL);
-    DEBUG_SHOW_STUDY_FLAG(flags, SF_BEFORE_MEOL);
-    DEBUG_SHOW_STUDY_FLAG(flags, SF_IS_INF);
-    DEBUG_SHOW_STUDY_FLAG(flags, SF_HAS_PAR);
-    DEBUG_SHOW_STUDY_FLAG(flags, SF_IN_PAR);
-    DEBUG_SHOW_STUDY_FLAG(flags, SF_HAS_EVAL);
-    DEBUG_SHOW_STUDY_FLAG(flags, SCF_DO_SUBSTR);
-    DEBUG_SHOW_STUDY_FLAG(flags, SCF_DO_STCLASS_AND);
-    DEBUG_SHOW_STUDY_FLAG(flags, SCF_DO_STCLASS_OR);
-    DEBUG_SHOW_STUDY_FLAG(flags, SCF_DO_STCLASS);
-    DEBUG_SHOW_STUDY_FLAG(flags, SCF_WHILEM_VISITED_POS);
-    DEBUG_SHOW_STUDY_FLAG(flags, SCF_TRIE_RESTUDY);
-    DEBUG_SHOW_STUDY_FLAG(flags, SCF_SEEN_ACCEPT);
-    DEBUG_SHOW_STUDY_FLAG(flags, SCF_TRIE_DOING_RESTUDY);
-    DEBUG_SHOW_STUDY_FLAG(flags, SCF_IN_DEFINE);
-    Perl_re_printf( aTHX_  "%s", close_str);
-}
-
-
-static void
-S_debug_studydata(pTHX_ const char *where, scan_data_t *data,
-                    U32 depth, int is_inf,
-                    SSize_t min, SSize_t stopmin, SSize_t delta)
-{
-    DECLARE_AND_GET_RE_DEBUG_FLAGS;
-
-    DEBUG_OPTIMISE_MORE_r({
-        if (!data)
-            return;
-        Perl_re_indentf(aTHX_  "%s: M/S/D: %" IVdf "/%" IVdf "/%" IVdf " Pos:%" IVdf "/%" IVdf " Flags: 0x%" UVXf,
-            depth,
-            where,
-            min, stopmin, delta,
-            (IV)data->pos_min,
-            (IV)data->pos_delta,
-            (UV)data->flags
-        );
-
-        S_debug_show_study_flags(aTHX_ data->flags," [","]");
-
-        Perl_re_printf( aTHX_
-            " Whilem_c: %" IVdf " Lcp: %" IVdf " %s",
-            (IV)data->whilem_c,
-            (IV)(data->last_closep ? *((data)->last_closep) : -1),
-            is_inf ? "INF " : ""
-        );
-
-        if (data->last_found) {
-            int i;
-            Perl_re_printf(aTHX_
-                "Last:'%s' %" IVdf ":%" IVdf "/%" IVdf,
-                    SvPVX_const(data->last_found),
-                    (IV)data->last_end,
-                    (IV)data->last_start_min,
-                    (IV)data->last_start_max
-            );
-
-            for (i = 0; i < 2; i++) {
-                Perl_re_printf(aTHX_
-                    " %s%s: '%s' @ %" IVdf "/%" IVdf,
-                    data->cur_is_floating == i ? "*" : "",
-                    i ? "Float" : "Fixed",
-                    SvPVX_const(data->substrs[i].str),
-                    (IV)data->substrs[i].min_offset,
-                    (IV)data->substrs[i].max_offset
-                );
-                S_debug_show_study_flags(aTHX_ data->substrs[i].flags," [","]");
-            }
-        }
-
-        Perl_re_printf( aTHX_ "\n");
-    });
-}
-
-
-static void
-S_debug_peep(pTHX_ const char *str, const RExC_state_t *pRExC_state,
-                regnode *scan, U32 depth, U32 flags)
-{
-    DECLARE_AND_GET_RE_DEBUG_FLAGS;
-
-    DEBUG_OPTIMISE_r({
-        regnode *Next;
-
-        if (!scan)
-            return;
-        Next = regnext(scan);
-        regprop(RExC_rx, RExC_mysv, scan, NULL, pRExC_state);
-        Perl_re_indentf( aTHX_   "%s>%3d: %s (%d)",
-            depth,
-            str,
-            REG_NODE_NUM(scan), SvPV_nolen_const(RExC_mysv),
-            Next ? (REG_NODE_NUM(Next)) : 0 );
-        S_debug_show_study_flags(aTHX_ flags," [ ","]");
-        Perl_re_printf( aTHX_  "\n");
-   });
-}
-
-
-#  define DEBUG_STUDYDATA(where, data, depth, is_inf, min, stopmin, delta) \
-                    S_debug_studydata(aTHX_ where, data, depth, is_inf, min, stopmin, delta)
-
-#  define DEBUG_PEEP(str, scan, depth, flags)   \
-                    S_debug_peep(aTHX_ str, pRExC_state, scan, depth, flags)
-
-#else
-#  define DEBUG_STUDYDATA(where, data, depth, is_inf, min, stopmin, delta) NOOP
-#  define DEBUG_PEEP(str, scan, depth, flags)         NOOP
-#endif
-
+#include "regcomp_internal.h"
 
 /* =========================================================
  * BEGIN edit_distance stuff.
@@ -1526,7 +238,7 @@ S_edit_distance(const UV* src,
 
     PERL_ARGS_ASSERT_EDIT_DISTANCE;
 
-    /* intialize matrix start values */
+    /* initialize matrix start values */
     Newx(scores, ( (x + 2) * (y + 2)), UV);
     scores[0] = score_ceil;
     scores[1 * (y + 2) + 0] = score_ceil;
@@ -1578,9534 +290,2171 @@ S_edit_distance(const UV* src,
 /* END of edit_distance() stuff
  * ========================================================= */
 
-/* Mark that we cannot extend a found fixed substring at this point.
-   Update the longest found anchored substring or the longest found
-   floating substrings if needed. */
-
-STATIC void
-S_scan_commit(pTHX_ const RExC_state_t *pRExC_state, scan_data_t *data,
-                    SSize_t *minlenp, int is_inf)
+/* add a data member to the struct reg_data attached to this regex, it should
+ * always return a non-zero return. the 's' argument is the type of the items
+ * being added and the n is the number of items. The length of 's' should match
+ * the number of items. */
+U32
+Perl_reg_add_data(RExC_state_t* const pRExC_state, const char* const s, const U32 n)
 {
-    const STRLEN l = CHR_SVLEN(data->last_found);
-    SV * const longest_sv = data->substrs[data->cur_is_floating].str;
-    const STRLEN old_l = CHR_SVLEN(longest_sv);
-    DECLARE_AND_GET_RE_DEBUG_FLAGS;
+    U32 count = RExC_rxi->data ? RExC_rxi->data->count : 1;
 
-    PERL_ARGS_ASSERT_SCAN_COMMIT;
-
-    if ((l >= old_l) && ((l > old_l) || (data->flags & SF_BEFORE_EOL))) {
-        const U8 i = data->cur_is_floating;
-        SvSetMagicSV(longest_sv, data->last_found);
-        data->substrs[i].min_offset = l ? data->last_start_min : data->pos_min;
-
-        if (!i) /* fixed */
-            data->substrs[0].max_offset = data->substrs[0].min_offset;
-        else { /* float */
-            data->substrs[1].max_offset =
-                      (is_inf)
-                       ? OPTIMIZE_INFTY
-                       : (l
-                          ? data->last_start_max
-                          /* temporary underflow guard for 5.32 */
-                          : data->pos_delta < 0 ? OPTIMIZE_INFTY
-                          : (data->pos_delta > OPTIMIZE_INFTY - data->pos_min
-                                         ? OPTIMIZE_INFTY
-                                         : data->pos_min + data->pos_delta));
-        }
-
-        data->substrs[i].flags &= ~SF_BEFORE_EOL;
-        data->substrs[i].flags |= data->flags & SF_BEFORE_EOL;
-        data->substrs[i].minlenp = minlenp;
-        data->substrs[i].lookbehind = 0;
-    }
+    PERL_ARGS_ASSERT_REG_ADD_DATA;
 
-    SvCUR_set(data->last_found, 0);
-    {
-        SV * const sv = data->last_found;
-        if (SvUTF8(sv) && SvMAGICAL(sv)) {
-            MAGIC * const mg = mg_find(sv, PERL_MAGIC_utf8);
-            if (mg)
-                mg->mg_len = 0;
-        }
-    }
-    data->last_end = -1;
-    data->flags &= ~SF_BEFORE_EOL;
-    DEBUG_STUDYDATA("commit", data, 0, is_inf, -1, -1, -1);
-}
-
-/* An SSC is just a regnode_charclass_posix with an extra field: the inversion
- * list that describes which code points it matches */
-
-STATIC void
-S_ssc_anything(pTHX_ regnode_ssc *ssc)
-{
-    /* Set the SSC 'ssc' to match an empty string or any code point */
-
-    PERL_ARGS_ASSERT_SSC_ANYTHING;
-
-    assert(is_ANYOF_SYNTHETIC(ssc));
-
-    /* mortalize so won't leak */
-    ssc->invlist = sv_2mortal(_add_range_to_invlist(NULL, 0, UV_MAX));
-    ANYOF_FLAGS(ssc) |= SSC_MATCHES_EMPTY_STRING;  /* Plus matches empty */
+    /* in the below expression we have (count + n - 1), the minus one is there
+     * because the struct that we allocate already contains a slot for 1 data
+     * item, so we do not need to allocate it the first time. IOW, the
+     * sizeof(*RExC_rxi->data) already accounts for one of the elements we need
+     * to allocate. See struct reg_data in regcomp.h
+     */
+    Renewc(RExC_rxi->data,
+           sizeof(*RExC_rxi->data) + (sizeof(void*) * (count + n - 1)),
+           char, struct reg_data);
+    /* however in the data->what expression we use (count + n) and do not
+     * subtract one from the result because the data structure contains a
+     * pointer to an array, and does not allocate the first element as part of
+     * the data struct. */
+    if (count > 1)
+        Renew(RExC_rxi->data->what, (count + n), U8);
+    else {
+        /* when count == 1 it means we have not initialized anything.
+         * we always fill the 0 slot of the data array with a '%' entry, which
+         * means "zero" (all the other types are letters) which exists purely
+         * so the return from reg_add_data is ALWAYS true, so we can tell it apart
+         * from a "no value" idx=0 in places where we would return an index
+         * into reg_add_data.  This is particularly important with the new "single
+         * pass, usually, but not always" strategy that we use, where the code
+         * will use a 0 to represent "not able to compute this yet".
+         */
+        Newx(RExC_rxi->data->what, n+1, U8);
+        /* fill in the placeholder slot of 0 with a what of '%', we use
+         * this because it sorta looks like a zero (0/0) and it is not a letter
+         * like any of the other "whats", this type should never be created
+         * any other way but here. '%' happens to also not appear in this
+         * file for any other reason (at the time of writing this comment)*/
+        RExC_rxi->data->what[0]= '%';
+        RExC_rxi->data->data[0]= NULL;
+    }
+    RExC_rxi->data->count = count + n;
+    Copy(s, RExC_rxi->data->what + count, n, U8);
+    assert(count>0);
+    return count;
 }
 
-STATIC int
-S_ssc_is_anything(const regnode_ssc *ssc)
+/*XXX: todo make this not included in a non debugging perl, but appears to be
+ * used anyway there, in 'use re' */
+#ifndef PERL_IN_XSUB_RE
+void
+Perl_reginitcolors(pTHX)
 {
-    /* Returns TRUE if the SSC 'ssc' can match the empty string and any code
-     * point; FALSE otherwise.  Thus, this is used to see if using 'ssc' buys
-     * us anything: if the function returns TRUE, 'ssc' hasn't been restricted
-     * in any way, so there's no point in using it */
-
-    UV start, end;
-    bool ret;
-
-    PERL_ARGS_ASSERT_SSC_IS_ANYTHING;
-
-    assert(is_ANYOF_SYNTHETIC(ssc));
-
-    if (! (ANYOF_FLAGS(ssc) & SSC_MATCHES_EMPTY_STRING)) {
-        return FALSE;
-    }
-
-    /* See if the list consists solely of the range 0 - Infinity */
-    invlist_iterinit(ssc->invlist);
-    ret = invlist_iternext(ssc->invlist, &start, &end)
-          && start == 0
-          && end == UV_MAX;
-
-    invlist_iterfinish(ssc->invlist);
-
-    if (ret) {
-        return TRUE;
-    }
-
-    /* If e.g., both \w and \W are set, matches everything */
-    if (ANYOF_POSIXL_SSC_TEST_ANY_SET(ssc)) {
-        int i;
-        for (i = 0; i < ANYOF_POSIXL_MAX; i += 2) {
-            if (ANYOF_POSIXL_TEST(ssc, i) && ANYOF_POSIXL_TEST(ssc, i+1)) {
-                return TRUE;
+    const char * const s = PerlEnv_getenv("PERL_RE_COLORS");
+    if (s) {
+        char *t = savepv(s);
+        int i = 0;
+        PL_colors[0] = t;
+        while (++i < 6) {
+            t = strchr(t, '\t');
+            if (t) {
+                *t = '\0';
+                PL_colors[i] = ++t;
             }
+            else
+                PL_colors[i] = t = (char *)"";
         }
+    } else {
+        int i = 0;
+        while (i < 6)
+            PL_colors[i++] = (char *)"";
     }
-
-    return FALSE;
-}
-
-STATIC void
-S_ssc_init(pTHX_ const RExC_state_t *pRExC_state, regnode_ssc *ssc)
-{
-    /* Initializes the SSC 'ssc'.  This includes setting it to match an empty
-     * string, any code point, or any posix class under locale */
-
-    PERL_ARGS_ASSERT_SSC_INIT;
-
-    Zero(ssc, 1, regnode_ssc);
-    set_ANYOF_SYNTHETIC(ssc);
-    ARG_SET(ssc, ANYOF_ONLY_HAS_BITMAP);
-    ssc_anything(ssc);
-
-    /* If any portion of the regex is to operate under locale rules that aren't
-     * fully known at compile time, initialization includes it.  The reason
-     * this isn't done for all regexes is that the optimizer was written under
-     * the assumption that locale was all-or-nothing.  Given the complexity and
-     * lack of documentation in the optimizer, and that there are inadequate
-     * test cases for locale, many parts of it may not work properly, it is
-     * safest to avoid locale unless necessary. */
-    if (RExC_contains_locale) {
-        ANYOF_POSIXL_SETALL(ssc);
-    }
-    else {
-        ANYOF_POSIXL_ZERO(ssc);
-    }
+    PL_colorset = 1;
 }
+#endif
 
-STATIC int
-S_ssc_is_cp_posixl_init(const RExC_state_t *pRExC_state,
-                        const regnode_ssc *ssc)
-{
-    /* Returns TRUE if the SSC 'ssc' is in its initial state with regard only
-     * to the list of code points matched, and locale posix classes; hence does
-     * not check its flags) */
 
-    UV start, end;
-    bool ret;
+#ifdef TRIE_STUDY_OPT
+/* search for "restudy" in this file for a detailed explanation */
+#define CHECK_RESTUDY_GOTO_butfirst(dOsomething)            \
+    STMT_START {                                            \
+        if (                                                \
+              (data.flags & SCF_TRIE_RESTUDY)               \
+              && ! restudied++                              \
+        ) {                                                 \
+            dOsomething;                                    \
+            goto reStudy;                                   \
+        }                                                   \
+    } STMT_END
+#else
+#define CHECK_RESTUDY_GOTO_butfirst
+#endif
 
-    PERL_ARGS_ASSERT_SSC_IS_CP_POSIXL_INIT;
+/*
+ * pregcomp - compile a regular expression into internal code
+ *
+ * Decides which engine's compiler to call based on the hint currently in
+ * scope
+ */
 
-    assert(is_ANYOF_SYNTHETIC(ssc));
+#ifndef PERL_IN_XSUB_RE
 
-    invlist_iterinit(ssc->invlist);
-    ret = invlist_iternext(ssc->invlist, &start, &end)
-          && start == 0
-          && end == UV_MAX;
+/* return the currently in-scope regex engine (or the default if none)  */
 
-    invlist_iterfinish(ssc->invlist);
+regexp_engine const *
+Perl_current_re_engine(pTHX)
+{
+    if (IN_PERL_COMPILETIME) {
+        HV * const table = GvHV(PL_hintgv);
+        SV **ptr;
 
-    if (! ret) {
-        return FALSE;
+        if (!table || !(PL_hints & HINT_LOCALIZE_HH))
+            return &PL_core_reg_engine;
+        ptr = hv_fetchs(table, "regcomp", FALSE);
+        if ( !(ptr && SvIOK(*ptr) && SvIV(*ptr)))
+            return &PL_core_reg_engine;
+        return INT2PTR(regexp_engine*, SvIV(*ptr));
     }
-
-    if (RExC_contains_locale && ! ANYOF_POSIXL_SSC_TEST_ALL_SET(ssc)) {
-        return FALSE;
+    else {
+        SV *ptr;
+        if (!PL_curcop->cop_hints_hash)
+            return &PL_core_reg_engine;
+        ptr = cop_hints_fetch_pvs(PL_curcop, "regcomp", 0);
+        if ( !(ptr && SvIOK(ptr) && SvIV(ptr)))
+            return &PL_core_reg_engine;
+        return INT2PTR(regexp_engine*, SvIV(ptr));
     }
-
-    return TRUE;
 }
 
-#define INVLIST_INDEX 0
-#define ONLY_LOCALE_MATCHES_INDEX 1
-#define DEFERRED_USER_DEFINED_INDEX 2
 
-STATIC SV*
-S_get_ANYOF_cp_list_for_ssc(pTHX_ const RExC_state_t *pRExC_state,
-                               const regnode_charclass* const node)
+REGEXP *
+Perl_pregcomp(pTHX_ SV * const pattern, const U32 flags)
 {
-    /* Returns a mortal inversion list defining which code points are matched
-     * by 'node', which is of type ANYOF.  Handles complementing the result if
-     * appropriate.  If some code points aren't knowable at this time, the
-     * returned list must, and will, contain every code point that is a
-     * possibility. */
-
-    SV* invlist = NULL;
-    SV* only_utf8_locale_invlist = NULL;
-    unsigned int i;
-    const U32 n = ARG(node);
-    bool new_node_has_latin1 = FALSE;
-    const U8 flags = (inRANGE(OP(node), ANYOFH, ANYOFRb))
-                      ? 0
-                      : ANYOF_FLAGS(node);
-
-    PERL_ARGS_ASSERT_GET_ANYOF_CP_LIST_FOR_SSC;
+    regexp_engine const *eng = current_re_engine();
+    DECLARE_AND_GET_RE_DEBUG_FLAGS;
 
-    /* Look at the data structure created by S_set_ANYOF_arg() */
-    if (n != ANYOF_ONLY_HAS_BITMAP) {
-        SV * const rv = MUTABLE_SV(RExC_rxi->data->data[n]);
-        AV * const av = MUTABLE_AV(SvRV(rv));
-        SV **const ary = AvARRAY(av);
-        assert(RExC_rxi->data->what[n] == 's');
+    PERL_ARGS_ASSERT_PREGCOMP;
 
-        if (av_tindex_skip_len_mg(av) >= DEFERRED_USER_DEFINED_INDEX) {
+    /* Dispatch a request to compile a regexp to correct regexp engine. */
+    DEBUG_COMPILE_r({
+        Perl_re_printf( aTHX_  "Using engine %" UVxf "\n",
+                        PTR2UV(eng));
+    });
+    return CALLREGCOMP_ENG(eng, pattern, flags);
+}
+#endif
 
-            /* Here there are things that won't be known until runtime -- we
-             * have to assume it could be anything */
-            invlist = sv_2mortal(_new_invlist(1));
-            return _add_range_to_invlist(invlist, 0, UV_MAX);
-        }
-        else if (ary[INVLIST_INDEX]) {
+/*
+=for apidoc re_compile
 
-            /* Use the node's inversion list */
-            invlist = sv_2mortal(invlist_clone(ary[INVLIST_INDEX], NULL));
-        }
+Compile the regular expression pattern C<pattern>, returning a pointer to the
+compiled object for later matching with the internal regex engine.
 
-        /* Get the code points valid only under UTF-8 locales */
-        if (   (flags & ANYOFL_FOLD)
-            &&  av_tindex_skip_len_mg(av) >= ONLY_LOCALE_MATCHES_INDEX)
-        {
-            only_utf8_locale_invlist = ary[ONLY_LOCALE_MATCHES_INDEX];
-        }
-    }
+This function is typically used by a custom regexp engine C<.comp()> function
+to hand off to the core regexp engine those patterns it doesn't want to handle
+itself (typically passing through the same flags it was called with).  In
+almost all other cases, a regexp should be compiled by calling L</C<pregcomp>>
+to compile using the currently active regexp engine.
 
-    if (! invlist) {
-        invlist = sv_2mortal(_new_invlist(0));
-    }
+If C<pattern> is already a C<REGEXP>, this function does nothing but return a
+pointer to the input.  Otherwise the PV is extracted and treated like a string
+representing a pattern.  See L<perlre>.
 
-    /* An ANYOF node contains a bitmap for the first NUM_ANYOF_CODE_POINTS
-     * code points, and an inversion list for the others, but if there are code
-     * points that should match only conditionally on the target string being
-     * UTF-8, those are placed in the inversion list, and not the bitmap.
-     * Since there are circumstances under which they could match, they are
-     * included in the SSC.  But if the ANYOF node is to be inverted, we have
-     * to exclude them here, so that when we invert below, the end result
-     * actually does include them.  (Think about "\xe0" =~ /[^\xc0]/di;).  We
-     * have to do this here before we add the unconditionally matched code
-     * points */
-    if (flags & ANYOF_INVERT) {
-        _invlist_intersection_complement_2nd(invlist,
-                                             PL_UpperLatin1,
-                                             &invlist);
-    }
+The possible flags for C<rx_flags> are documented in L<perlreapi>.  Their names
+all begin with C<RXf_>.
 
-    /* Add in the points from the bit map */
-    if (! inRANGE(OP(node), ANYOFH, ANYOFRb)) {
-        for (i = 0; i < NUM_ANYOF_CODE_POINTS; i++) {
-            if (ANYOF_BITMAP_TEST(node, i)) {
-                unsigned int start = i++;
+=cut
 
-                for (;    i < NUM_ANYOF_CODE_POINTS
-                       && ANYOF_BITMAP_TEST(node, i); ++i)
-                {
-                    /* empty */
-                }
-                invlist = _add_range_to_invlist(invlist, start, i-1);
-                new_node_has_latin1 = TRUE;
-            }
-        }
-    }
+ * public entry point for the perl core's own regex compiling code.
+ * It's actually a wrapper for Perl_re_op_compile that only takes an SV
+ * pattern rather than a list of OPs, and uses the internal engine rather
+ * than the current one */
 
-    /* If this can match all upper Latin1 code points, have to add them
-     * as well.  But don't add them if inverting, as when that gets done below,
-     * it would exclude all these characters, including the ones it shouldn't
-     * that were added just above */
-    if (! (flags & ANYOF_INVERT) && OP(node) == ANYOFD
-        && (flags & ANYOF_SHARED_d_MATCHES_ALL_NON_UTF8_NON_ASCII_non_d_WARN_SUPER))
-    {
-        _invlist_union(invlist, PL_UpperLatin1, &invlist);
-    }
+REGEXP *
+Perl_re_compile(pTHX_ SV * const pattern, U32 rx_flags)
+{
+    SV *pat = pattern; /* defeat constness! */
 
-    /* Similarly for these */
-    if (flags & ANYOF_MATCHES_ALL_ABOVE_BITMAP) {
-        _invlist_union_complement_2nd(invlist, PL_InBitmap, &invlist);
-    }
+    PERL_ARGS_ASSERT_RE_COMPILE;
 
-    if (flags & ANYOF_INVERT) {
-        _invlist_invert(invlist);
-    }
-    else if (flags & ANYOFL_FOLD) {
-        if (new_node_has_latin1) {
+    return Perl_re_op_compile(aTHX_ &pat, 1, NULL,
+#ifdef PERL_IN_XSUB_RE
+                                &my_reg_engine,
+#else
+                                &PL_core_reg_engine,
+#endif
+                                NULL, NULL, rx_flags, 0);
+}
 
-            /* Under /li, any 0-255 could fold to any other 0-255, depending on
-             * the locale.  We can skip this if there are no 0-255 at all. */
-            _invlist_union(invlist, PL_Latin1, &invlist);
+static void
+S_free_codeblocks(pTHX_ struct reg_code_blocks *cbs)
+{
+    int n;
 
-            invlist = add_cp_to_invlist(invlist, LATIN_SMALL_LETTER_DOTLESS_I);
-            invlist = add_cp_to_invlist(invlist, LATIN_CAPITAL_LETTER_I_WITH_DOT_ABOVE);
-        }
-        else {
-            if (_invlist_contains_cp(invlist, LATIN_SMALL_LETTER_DOTLESS_I)) {
-                invlist = add_cp_to_invlist(invlist, 'I');
-            }
-            if (_invlist_contains_cp(invlist,
-                                        LATIN_CAPITAL_LETTER_I_WITH_DOT_ABOVE))
-            {
-                invlist = add_cp_to_invlist(invlist, 'i');
-            }
+    if (--cbs->refcnt > 0)
+        return;
+    for (n = 0; n < cbs->count; n++) {
+        REGEXP *rx = cbs->cb[n].src_regex;
+        if (rx) {
+            cbs->cb[n].src_regex = NULL;
+            SvREFCNT_dec_NN(rx);
         }
     }
+    Safefree(cbs->cb);
+    Safefree(cbs);
+}
 
-    /* Similarly add the UTF-8 locale possible matches.  These have to be
-     * deferred until after the non-UTF-8 locale ones are taken care of just
-     * above, or it leads to wrong results under ANYOF_INVERT */
-    if (only_utf8_locale_invlist) {
-        _invlist_union_maybe_complement_2nd(invlist,
-                                            only_utf8_locale_invlist,
-                                            flags & ANYOF_INVERT,
-                                            &invlist);
-    }
 
-    return invlist;
+static struct reg_code_blocks *
+S_alloc_code_blocks(pTHX_  int ncode)
+{
+     struct reg_code_blocks *cbs;
+    Newx(cbs, 1, struct reg_code_blocks);
+    cbs->count = ncode;
+    cbs->refcnt = 1;
+    SAVEDESTRUCTOR_X(S_free_codeblocks, cbs);
+    if (ncode)
+        Newx(cbs->cb, ncode, struct reg_code_block);
+    else
+        cbs->cb = NULL;
+    return cbs;
 }
 
-/* These two functions currently do the exact same thing */
-#define ssc_init_zero          ssc_init
 
-#define ssc_add_cp(ssc, cp)   ssc_add_range((ssc), (cp), (cp))
-#define ssc_match_all_cp(ssc) ssc_add_range(ssc, 0, UV_MAX)
-
-/* 'AND' a given class with another one.  Can create false positives.  'ssc'
- * should not be inverted.  'and_with->flags & ANYOF_MATCHES_POSIXL' should be
- * 0 if 'and_with' is a regnode_charclass instead of a regnode_ssc. */
+/* upgrade pattern pat_p of length plen_p to UTF8, and if there are code
+ * blocks, recalculate the indices. Update pat_p and plen_p in-place to
+ * point to the realloced string and length.
+ *
+ * This is essentially a copy of Perl_bytes_to_utf8() with the code index
+ * stuff added */
 
-STATIC void
-S_ssc_and(pTHX_ const RExC_state_t *pRExC_state, regnode_ssc *ssc,
-                const regnode_charclass *and_with)
+static void
+S_pat_upgrade_to_utf8(pTHX_ RExC_state_t * const pRExC_state,
+                    char **pat_p, STRLEN *plen_p, int num_code_blocks)
 {
-    /* Accumulate into SSC 'ssc' its 'AND' with 'and_with', which is either
-     * another SSC or a regular ANYOF class.  Can create false positives. */
-
-    SV* anded_cp_list;
-    U8  and_with_flags = inRANGE(OP(and_with), ANYOFH, ANYOFRb)
-                          ? 0
-                          : ANYOF_FLAGS(and_with);
-    U8  anded_flags;
-
-    PERL_ARGS_ASSERT_SSC_AND;
-
-    assert(is_ANYOF_SYNTHETIC(ssc));
-
-    /* 'and_with' is used as-is if it too is an SSC; otherwise have to extract
-     * the code point inversion list and just the relevant flags */
-    if (is_ANYOF_SYNTHETIC(and_with)) {
-        anded_cp_list = ((regnode_ssc *)and_with)->invlist;
-        anded_flags = and_with_flags;
-
-        /* XXX This is a kludge around what appears to be deficiencies in the
-         * optimizer.  If we make S_ssc_anything() add in the WARN_SUPER flag,
-         * there are paths through the optimizer where it doesn't get weeded
-         * out when it should.  And if we don't make some extra provision for
-         * it like the code just below, it doesn't get added when it should.
-         * This solution is to add it only when AND'ing, which is here, and
-         * only when what is being AND'ed is the pristine, original node
-         * matching anything.  Thus it is like adding it to ssc_anything() but
-         * only when the result is to be AND'ed.  Probably the same solution
-         * could be adopted for the same problem we have with /l matching,
-         * which is solved differently in S_ssc_init(), and that would lead to
-         * fewer false positives than that solution has.  But if this solution
-         * creates bugs, the consequences are only that a warning isn't raised
-         * that should be; while the consequences for having /l bugs is
-         * incorrect matches */
-        if (ssc_is_anything((regnode_ssc *)and_with)) {
-            anded_flags |= ANYOF_SHARED_d_MATCHES_ALL_NON_UTF8_NON_ASCII_non_d_WARN_SUPER;
-        }
-    }
-    else {
-        anded_cp_list = get_ANYOF_cp_list_for_ssc(pRExC_state, and_with);
-        if (OP(and_with) == ANYOFD) {
-            anded_flags = and_with_flags & ANYOF_COMMON_FLAGS;
-        }
-        else {
-            anded_flags = and_with_flags
-            &( ANYOF_COMMON_FLAGS
-              |ANYOF_SHARED_d_MATCHES_ALL_NON_UTF8_NON_ASCII_non_d_WARN_SUPER
-              |ANYOF_SHARED_d_UPPER_LATIN1_UTF8_STRING_MATCHES_non_d_RUNTIME_USER_PROP);
-            if (ANYOFL_UTF8_LOCALE_REQD(and_with_flags)) {
-                anded_flags &=
-                    ANYOFL_SHARED_UTF8_LOCALE_fold_HAS_MATCHES_nonfold_REQD;
-            }
-        }
-    }
-
-    ANYOF_FLAGS(ssc) &= anded_flags;
-
-    /* Below, C1 is the list of code points in 'ssc'; P1, its posix classes.
-     * C2 is the list of code points in 'and-with'; P2, its posix classes.
-     * 'and_with' may be inverted.  When not inverted, we have the situation of
-     * computing:
-     *  (C1 | P1) & (C2 | P2)
-     *                     =  (C1 & (C2 | P2)) | (P1 & (C2 | P2))
-     *                     =  ((C1 & C2) | (C1 & P2)) | ((P1 & C2) | (P1 & P2))
-     *                    <=  ((C1 & C2) |       P2)) | ( P1       | (P1 & P2))
-     *                    <=  ((C1 & C2) | P1 | P2)
-     * Alternatively, the last few steps could be:
-     *                     =  ((C1 & C2) | (C1 & P2)) | ((P1 & C2) | (P1 & P2))
-     *                    <=  ((C1 & C2) |  C1      ) | (      C2  | (P1 & P2))
-     *                    <=  (C1 | C2 | (P1 & P2))
-     * We favor the second approach if either P1 or P2 is non-empty.  This is
-     * because these components are a barrier to doing optimizations, as what
-     * they match cannot be known until the moment of matching as they are
-     * dependent on the current locale, 'AND"ing them likely will reduce or
-     * eliminate them.
-     * But we can do better if we know that C1,P1 are in their initial state (a
-     * frequent occurrence), each matching everything:
-     *  (<everything>) & (C2 | P2) =  C2 | P2
-     * Similarly, if C2,P2 are in their initial state (again a frequent
-     * occurrence), the result is a no-op
-     *  (C1 | P1) & (<everything>) =  C1 | P1
-     *
-     * Inverted, we have
-     *  (C1 | P1) & ~(C2 | P2)  =  (C1 | P1) & (~C2 & ~P2)
-     *                          =  (C1 & (~C2 & ~P2)) | (P1 & (~C2 & ~P2))
-     *                         <=  (C1 & ~C2) | (P1 & ~P2)
-     * */
-
-    if ((and_with_flags & ANYOF_INVERT)
-        && ! is_ANYOF_SYNTHETIC(and_with))
-    {
-        unsigned int i;
-
-        ssc_intersection(ssc,
-                         anded_cp_list,
-                         FALSE /* Has already been inverted */
-                         );
-
-        /* If either P1 or P2 is empty, the intersection will be also; can skip
-         * the loop */
-        if (! (and_with_flags & ANYOF_MATCHES_POSIXL)) {
-            ANYOF_POSIXL_ZERO(ssc);
-        }
-        else if (ANYOF_POSIXL_SSC_TEST_ANY_SET(ssc)) {
-
-            /* Note that the Posix class component P from 'and_with' actually
-             * looks like:
-             *      P = Pa | Pb | ... | Pn
-             * where each component is one posix class, such as in [\w\s].
-             * Thus
-             *      ~P = ~(Pa | Pb | ... | Pn)
-             *         = ~Pa & ~Pb & ... & ~Pn
-             *        <= ~Pa | ~Pb | ... | ~Pn
-             * The last is something we can easily calculate, but unfortunately
-             * is likely to have many false positives.  We could do better
-             * in some (but certainly not all) instances if two classes in
-             * P have known relationships.  For example
-             *      :lower: <= :alpha: <= :alnum: <= \w <= :graph: <= :print:
-             * So
-             *      :lower: & :print: = :lower:
-             * And similarly for classes that must be disjoint.  For example,
-             * since \s and \w can have no elements in common based on rules in
-             * the POSIX standard,
-             *      \w & ^\S = nothing
-             * Unfortunately, some vendor locales do not meet the Posix
-             * standard, in particular almost everything by Microsoft.
-             * The loop below just changes e.g., \w into \W and vice versa */
-
-            regnode_charclass_posixl temp;
-            int add = 1;    /* To calculate the index of the complement */
-
-            Zero(&temp, 1, regnode_charclass_posixl);
-            ANYOF_POSIXL_ZERO(&temp);
-            for (i = 0; i < ANYOF_MAX; i++) {
-                assert(i % 2 != 0
-                       || ! ANYOF_POSIXL_TEST((regnode_charclass_posixl*) and_with, i)
-                       || ! ANYOF_POSIXL_TEST((regnode_charclass_posixl*) and_with, i + 1));
-
-                if (ANYOF_POSIXL_TEST((regnode_charclass_posixl*) and_with, i)) {
-                    ANYOF_POSIXL_SET(&temp, i + add);
-                }
-                add = 0 - add; /* 1 goes to -1; -1 goes to 1 */
-            }
-            ANYOF_POSIXL_AND(&temp, ssc);
-
-        } /* else ssc already has no posixes */
-    } /* else: Not inverted.  This routine is a no-op if 'and_with' is an SSC
-         in its initial state */
-    else if (! is_ANYOF_SYNTHETIC(and_with)
-             || ! ssc_is_cp_posixl_init(pRExC_state, (regnode_ssc *)and_with))
-    {
-        /* But if 'ssc' is in its initial state, the result is just 'and_with';
-         * copy it over 'ssc' */
-        if (ssc_is_cp_posixl_init(pRExC_state, ssc)) {
-            if (is_ANYOF_SYNTHETIC(and_with)) {
-                StructCopy(and_with, ssc, regnode_ssc);
-            }
-            else {
-                ssc->invlist = anded_cp_list;
-                ANYOF_POSIXL_ZERO(ssc);
-                if (and_with_flags & ANYOF_MATCHES_POSIXL) {
-                    ANYOF_POSIXL_OR((regnode_charclass_posixl*) and_with, ssc);
-                }
-            }
-        }
-        else if (ANYOF_POSIXL_SSC_TEST_ANY_SET(ssc)
-                 || (and_with_flags & ANYOF_MATCHES_POSIXL))
-        {
-            /* One or the other of P1, P2 is non-empty. */
-            if (and_with_flags & ANYOF_MATCHES_POSIXL) {
-                ANYOF_POSIXL_AND((regnode_charclass_posixl*) and_with, ssc);
-            }
-            ssc_union(ssc, anded_cp_list, FALSE);
-        }
-        else { /* P1 = P2 = empty */
-            ssc_intersection(ssc, anded_cp_list, FALSE);
-        }
-    }
-}
-
-STATIC void
-S_ssc_or(pTHX_ const RExC_state_t *pRExC_state, regnode_ssc *ssc,
-               const regnode_charclass *or_with)
-{
-    /* Accumulate into SSC 'ssc' its 'OR' with 'or_with', which is either
-     * another SSC or a regular ANYOF class.  Can create false positives if
-     * 'or_with' is to be inverted. */
+    U8 *const src = (U8*)*pat_p;
+    U8 *dst, *d;
+    int n=0;
+    STRLEN s = 0;
+    bool do_end = 0;
+    DECLARE_AND_GET_RE_DEBUG_FLAGS;
 
-    SV* ored_cp_list;
-    U8 ored_flags;
-    U8  or_with_flags = inRANGE(OP(or_with), ANYOFH, ANYOFRb)
-                         ? 0
-                         : ANYOF_FLAGS(or_with);
+    DEBUG_PARSE_r(Perl_re_printf( aTHX_
+        "UTF8 mismatch! Converting to utf8 for resizing and compile\n"));
 
-    PERL_ARGS_ASSERT_SSC_OR;
+    /* 1 for each byte + 1 for each byte that expands to two, + trailing NUL */
+    Newx(dst, *plen_p + variant_under_utf8_count(src, src + *plen_p) + 1, U8);
+    d = dst;
 
-    assert(is_ANYOF_SYNTHETIC(ssc));
+    while (s < *plen_p) {
+        append_utf8_from_native_byte(src[s], &d);
 
-    /* 'or_with' is used as-is if it too is an SSC; otherwise have to extract
-     * the code point inversion list and just the relevant flags */
-    if (is_ANYOF_SYNTHETIC(or_with)) {
-        ored_cp_list = ((regnode_ssc*) or_with)->invlist;
-        ored_flags = or_with_flags;
-    }
-    else {
-        ored_cp_list = get_ANYOF_cp_list_for_ssc(pRExC_state, or_with);
-        ored_flags = or_with_flags & ANYOF_COMMON_FLAGS;
-        if (OP(or_with) != ANYOFD) {
-            ored_flags
-            |= or_with_flags
-             & ( ANYOF_SHARED_d_MATCHES_ALL_NON_UTF8_NON_ASCII_non_d_WARN_SUPER
-                |ANYOF_SHARED_d_UPPER_LATIN1_UTF8_STRING_MATCHES_non_d_RUNTIME_USER_PROP);
-            if (ANYOFL_UTF8_LOCALE_REQD(or_with_flags)) {
-                ored_flags |=
-                    ANYOFL_SHARED_UTF8_LOCALE_fold_HAS_MATCHES_nonfold_REQD;
+        if (n < num_code_blocks) {
+            assert(pRExC_state->code_blocks);
+            if (!do_end && pRExC_state->code_blocks->cb[n].start == s) {
+                pRExC_state->code_blocks->cb[n].start = d - dst - 1;
+                assert(*(d - 1) == '(');
+                do_end = 1;
             }
-        }
-    }
-
-    ANYOF_FLAGS(ssc) |= ored_flags;
-
-    /* Below, C1 is the list of code points in 'ssc'; P1, its posix classes.
-     * C2 is the list of code points in 'or-with'; P2, its posix classes.
-     * 'or_with' may be inverted.  When not inverted, we have the simple
-     * situation of computing:
-     *  (C1 | P1) | (C2 | P2)  =  (C1 | C2) | (P1 | P2)
-     * If P1|P2 yields a situation with both a class and its complement are
-     * set, like having both \w and \W, this matches all code points, and we
-     * can delete these from the P component of the ssc going forward.  XXX We
-     * might be able to delete all the P components, but I (khw) am not certain
-     * about this, and it is better to be safe.
-     *
-     * Inverted, we have
-     *  (C1 | P1) | ~(C2 | P2)  =  (C1 | P1) | (~C2 & ~P2)
-     *                         <=  (C1 | P1) | ~C2
-     *                         <=  (C1 | ~C2) | P1
-     * (which results in actually simpler code than the non-inverted case)
-     * */
-
-    if ((or_with_flags & ANYOF_INVERT)
-        && ! is_ANYOF_SYNTHETIC(or_with))
-    {
-        /* We ignore P2, leaving P1 going forward */
-    }   /* else  Not inverted */
-    else if (or_with_flags & ANYOF_MATCHES_POSIXL) {
-        ANYOF_POSIXL_OR((regnode_charclass_posixl*)or_with, ssc);
-        if (ANYOF_POSIXL_SSC_TEST_ANY_SET(ssc)) {
-            unsigned int i;
-            for (i = 0; i < ANYOF_MAX; i += 2) {
-                if (ANYOF_POSIXL_TEST(ssc, i) && ANYOF_POSIXL_TEST(ssc, i + 1))
-                {
-                    ssc_match_all_cp(ssc);
-                    ANYOF_POSIXL_CLEAR(ssc, i);
-                    ANYOF_POSIXL_CLEAR(ssc, i+1);
-                }
+            else if (do_end && pRExC_state->code_blocks->cb[n].end == s) {
+                pRExC_state->code_blocks->cb[n].end = d - dst - 1;
+                assert(*(d - 1) == ')');
+                do_end = 0;
+                n++;
             }
         }
+        s++;
     }
-
-    ssc_union(ssc,
-              ored_cp_list,
-              FALSE /* Already has been inverted */
-              );
-}
-
-STATIC void
-S_ssc_union(pTHX_ regnode_ssc *ssc, SV* const invlist, const bool invert2nd)
-{
-    PERL_ARGS_ASSERT_SSC_UNION;
-
-    assert(is_ANYOF_SYNTHETIC(ssc));
-
-    _invlist_union_maybe_complement_2nd(ssc->invlist,
-                                        invlist,
-                                        invert2nd,
-                                        &ssc->invlist);
-}
-
-STATIC void
-S_ssc_intersection(pTHX_ regnode_ssc *ssc,
-                         SV* const invlist,
-                         const bool invert2nd)
-{
-    PERL_ARGS_ASSERT_SSC_INTERSECTION;
-
-    assert(is_ANYOF_SYNTHETIC(ssc));
-
-    _invlist_intersection_maybe_complement_2nd(ssc->invlist,
-                                               invlist,
-                                               invert2nd,
-                                               &ssc->invlist);
-}
-
-STATIC void
-S_ssc_add_range(pTHX_ regnode_ssc *ssc, const UV start, const UV end)
-{
-    PERL_ARGS_ASSERT_SSC_ADD_RANGE;
-
-    assert(is_ANYOF_SYNTHETIC(ssc));
-
-    ssc->invlist = _add_range_to_invlist(ssc->invlist, start, end);
-}
-
-STATIC void
-S_ssc_cp_and(pTHX_ regnode_ssc *ssc, const UV cp)
-{
-    /* AND just the single code point 'cp' into the SSC 'ssc' */
-
-    SV* cp_list = _new_invlist(2);
-
-    PERL_ARGS_ASSERT_SSC_CP_AND;
-
-    assert(is_ANYOF_SYNTHETIC(ssc));
-
-    cp_list = add_cp_to_invlist(cp_list, cp);
-    ssc_intersection(ssc, cp_list,
-                     FALSE /* Not inverted */
-                     );
-    SvREFCNT_dec_NN(cp_list);
-}
-
-STATIC void
-S_ssc_clear_locale(regnode_ssc *ssc)
-{
-    /* Set the SSC 'ssc' to not match any locale things */
-    PERL_ARGS_ASSERT_SSC_CLEAR_LOCALE;
-
-    assert(is_ANYOF_SYNTHETIC(ssc));
-
-    ANYOF_POSIXL_ZERO(ssc);
-    ANYOF_FLAGS(ssc) &= ~ANYOF_LOCALE_FLAGS;
-}
-
-STATIC bool
-S_is_ssc_worth_it(const RExC_state_t * pRExC_state, const regnode_ssc * ssc)
-{
-    /* The synthetic start class is used to hopefully quickly winnow down
-     * places where a pattern could start a match in the target string.  If it
-     * doesn't really narrow things down that much, there isn't much point to
-     * having the overhead of using it.  This function uses some very crude
-     * heuristics to decide if to use the ssc or not.
-     *
-     * It returns TRUE if 'ssc' rules out more than half what it considers to
-     * be the "likely" possible matches, but of course it doesn't know what the
-     * actual things being matched are going to be; these are only guesses
-     *
-     * For /l matches, it assumes that the only likely matches are going to be
-     *      in the 0-255 range, uniformly distributed, so half of that is 127
-     * For /a and /d matches, it assumes that the likely matches will be just
-     *      the ASCII range, so half of that is 63
-     * For /u and there isn't anything matching above the Latin1 range, it
-     *      assumes that that is the only range likely to be matched, and uses
-     *      half that as the cut-off: 127.  If anything matches above Latin1,
-     *      it assumes that all of Unicode could match (uniformly), except for
-     *      non-Unicode code points and things in the General Category "Other"
-     *      (unassigned, private use, surrogates, controls and formats).  This
-     *      is a much large number. */
-
-    U32 count = 0;      /* Running total of number of code points matched by
-                           'ssc' */
-    UV start, end;      /* Start and end points of current range in inversion
-                           XXX outdated.  UTF-8 locales are common, what about invert? list */
-    const U32 max_code_points = (LOC)
-                                ?  256
-                                : ((  ! UNI_SEMANTICS
-                                    ||  invlist_highest(ssc->invlist) < 256)
-                                  ? 128
-                                  : NON_OTHER_COUNT);
-    const U32 max_match = max_code_points / 2;
-
-    PERL_ARGS_ASSERT_IS_SSC_WORTH_IT;
-
-    invlist_iterinit(ssc->invlist);
-    while (invlist_iternext(ssc->invlist, &start, &end)) {
-        if (start >= max_code_points) {
-            break;
-        }
-        end = MIN(end, max_code_points - 1);
-        count += end - start + 1;
-        if (count >= max_match) {
-            invlist_iterfinish(ssc->invlist);
-            return FALSE;
-        }
-    }
-
-    return TRUE;
-}
-
-
-STATIC void
-S_ssc_finalize(pTHX_ RExC_state_t *pRExC_state, regnode_ssc *ssc)
-{
-    /* The inversion list in the SSC is marked mortal; now we need a more
-     * permanent copy, which is stored the same way that is done in a regular
-     * ANYOF node, with the first NUM_ANYOF_CODE_POINTS code points in a bit
-     * map */
-
-    SV* invlist = invlist_clone(ssc->invlist, NULL);
-
-    PERL_ARGS_ASSERT_SSC_FINALIZE;
-
-    assert(is_ANYOF_SYNTHETIC(ssc));
-
-    /* The code in this file assumes that all but these flags aren't relevant
-     * to the SSC, except SSC_MATCHES_EMPTY_STRING, which should be cleared
-     * by the time we reach here */
-    assert(! (ANYOF_FLAGS(ssc)
-        & ~( ANYOF_COMMON_FLAGS
-            |ANYOF_SHARED_d_MATCHES_ALL_NON_UTF8_NON_ASCII_non_d_WARN_SUPER
-            |ANYOF_SHARED_d_UPPER_LATIN1_UTF8_STRING_MATCHES_non_d_RUNTIME_USER_PROP)));
-
-    populate_ANYOF_from_invlist( (regnode *) ssc, &invlist);
-
-    set_ANYOF_arg(pRExC_state, (regnode *) ssc, invlist, NULL, NULL);
-    SvREFCNT_dec(invlist);
-
-    /* Make sure is clone-safe */
-    ssc->invlist = NULL;
-
-    if (ANYOF_POSIXL_SSC_TEST_ANY_SET(ssc)) {
-        ANYOF_FLAGS(ssc) |= ANYOF_MATCHES_POSIXL;
-        OP(ssc) = ANYOFPOSIXL;
-    }
-    else if (RExC_contains_locale) {
-        OP(ssc) = ANYOFL;
-    }
-
-    assert(! (ANYOF_FLAGS(ssc) & ANYOF_LOCALE_FLAGS) || RExC_contains_locale);
+    *d = '\0';
+    *plen_p = d - dst;
+    *pat_p = (char*) dst;
+    SAVEFREEPV(*pat_p);
+    RExC_orig_utf8 = RExC_utf8 = 1;
 }
 
-#define TRIE_LIST_ITEM(state,idx) (trie->states[state].trans.list)[ idx ]
-#define TRIE_LIST_CUR(state)  ( TRIE_LIST_ITEM( state, 0 ).forid )
-#define TRIE_LIST_LEN(state) ( TRIE_LIST_ITEM( state, 0 ).newstate )
-#define TRIE_LIST_USED(idx)  ( trie->states[state].trans.list         \
-                               ? (TRIE_LIST_CUR( idx ) - 1)           \
-                               : 0 )
-
 
-#ifdef DEBUGGING
-/*
-   dump_trie(trie,widecharmap,revcharmap)
-   dump_trie_interim_list(trie,widecharmap,revcharmap,next_alloc)
-   dump_trie_interim_table(trie,widecharmap,revcharmap,next_alloc)
-
-   These routines dump out a trie in a somewhat readable format.
-   The _interim_ variants are used for debugging the interim
-   tables that are used to generate the final compressed
-   representation which is what dump_trie expects.
-
-   Part of the reason for their existence is to provide a form
-   of documentation as to how the different representations function.
 
-*/
-
-/*
-  Dumps the final compressed table form of the trie to Perl_debug_log.
-  Used for debugging make_trie().
-*/
+/* S_concat_pat(): concatenate a list of args to the pattern string pat,
+ * while recording any code block indices, and handling overloading,
+ * nested qr// objects etc.  If pat is null, it will allocate a new
+ * string, or just return the first arg, if there's only one.
+ *
+ * Returns the malloced/updated pat.
+ * patternp and pat_count is the array of SVs to be concatted;
+ * oplist is the optional list of ops that generated the SVs;
+ * recompile_p is a pointer to a boolean that will be set if
+ *   the regex will need to be recompiled.
+ * delim, if non-null is an SV that will be inserted between each element
+ */
 
-STATIC void
-S_dump_trie(pTHX_ const struct _reg_trie_data *trie, HV *widecharmap,
-            AV *revcharmap, U32 depth)
+static SV*
+S_concat_pat(pTHX_ RExC_state_t * const pRExC_state,
+                SV *pat, SV ** const patternp, int pat_count,
+                OP *oplist, bool *recompile_p, SV *delim)
 {
-    U32 state;
-    SV *sv=sv_newmortal();
-    int colwidth= widecharmap ? 6 : 4;
-    U16 word;
-    DECLARE_AND_GET_RE_DEBUG_FLAGS;
+    SV **svp;
+    int n = 0;
+    bool use_delim = FALSE;
+    bool alloced = FALSE;
 
-    PERL_ARGS_ASSERT_DUMP_TRIE;
-
-    Perl_re_indentf( aTHX_  "Char : %-6s%-6s%-4s ",
-        depth+1, "Match","Base","Ofs" );
-
-    for( state = 0 ; state < trie->uniquecharcount ; state++ ) {
-        SV ** const tmp = av_fetch( revcharmap, state, 0);
-        if ( tmp ) {
-            Perl_re_printf( aTHX_  "%*s",
-                colwidth,
-                pv_pretty(sv, SvPV_nolen_const(*tmp), SvCUR(*tmp), colwidth,
-                            PL_colors[0], PL_colors[1],
-                            (SvUTF8(*tmp) ? PERL_PV_ESCAPE_UNI : 0) |
-                            PERL_PV_ESCAPE_FIRSTCHAR
-                )
-            );
-        }
+    /* if we know we have at least two args, create an empty string,
+     * then concatenate args to that. For no args, return an empty string */
+    if (!pat && pat_count != 1) {
+        pat = newSVpvs("");
+        SAVEFREESV(pat);
+        alloced = TRUE;
     }
-    Perl_re_printf( aTHX_  "\n");
-    Perl_re_indentf( aTHX_ "State|-----------------------", depth+1);
-
-    for( state = 0 ; state < trie->uniquecharcount ; state++ )
-        Perl_re_printf( aTHX_  "%.*s", colwidth, "--------");
-    Perl_re_printf( aTHX_  "\n");
-
-    for( state = 1 ; state < trie->statecount ; state++ ) {
-        const U32 base = trie->states[ state ].trans.base;
 
-        Perl_re_indentf( aTHX_  "#%4" UVXf "|", depth+1, (UV)state);
+    for (svp = patternp; svp < patternp + pat_count; svp++) {
+        SV *sv;
+        SV *rx  = NULL;
+        STRLEN orig_patlen = 0;
+        bool code = 0;
+        SV *msv = use_delim ? delim : *svp;
+        if (!msv) msv = &PL_sv_undef;
 
-        if ( trie->states[ state ].wordnum ) {
-            Perl_re_printf( aTHX_  " W%4X", trie->states[ state ].wordnum );
-        } else {
-            Perl_re_printf( aTHX_  "%6s", "" );
+        /* if we've got a delimiter, we go round the loop twice for each
+         * svp slot (except the last), using the delimiter the second
+         * time round */
+        if (use_delim) {
+            svp--;
+            use_delim = FALSE;
         }
+        else if (delim)
+            use_delim = TRUE;
 
-        Perl_re_printf( aTHX_  " @%4" UVXf " ", (UV)base );
+        if (SvTYPE(msv) == SVt_PVAV) {
+            /* we've encountered an interpolated array within
+             * the pattern, e.g. /...@a..../. Expand the list of elements,
+             * then recursively append elements.
+             * The code in this block is based on S_pushav() */
 
-        if ( base ) {
-            U32 ofs = 0;
+            AV *const av = (AV*)msv;
+            const SSize_t maxarg = AvFILL(av) + 1;
+            SV **array;
 
-            while( ( base + ofs  < trie->uniquecharcount ) ||
-                   ( base + ofs - trie->uniquecharcount < trie->lasttrans
-                     && trie->trans[ base + ofs - trie->uniquecharcount ].check
-                                                                    != state))
-                    ofs++;
+            if (oplist) {
+                assert(oplist->op_type == OP_PADAV
+                    || oplist->op_type == OP_RV2AV);
+                oplist = OpSIBLING(oplist);
+            }
 
-            Perl_re_printf( aTHX_  "+%2" UVXf "[ ", (UV)ofs);
+            if (SvRMAGICAL(av)) {
+                SSize_t i;
 
-            for ( ofs = 0 ; ofs < trie->uniquecharcount ; ofs++ ) {
-                if ( ( base + ofs >= trie->uniquecharcount )
-                        && ( base + ofs - trie->uniquecharcount
-                                                        < trie->lasttrans )
-                        && trie->trans[ base + ofs
-                                    - trie->uniquecharcount ].check == state )
-                {
-                   Perl_re_printf( aTHX_  "%*" UVXf, colwidth,
-                    (UV)trie->trans[ base + ofs - trie->uniquecharcount ].next
-                   );
-                } else {
-                    Perl_re_printf( aTHX_  "%*s", colwidth,"   ." );
+                Newx(array, maxarg, SV*);
+                SAVEFREEPV(array);
+                for (i=0; i < maxarg; i++) {
+                    SV ** const svp = av_fetch(av, i, FALSE);
+                    array[i] = svp ? *svp : &PL_sv_undef;
                 }
             }
+            else
+                array = AvARRAY(av);
 
-            Perl_re_printf( aTHX_  "]");
+            if (maxarg > 0) {
+                pat = S_concat_pat(aTHX_ pRExC_state, pat,
+                                   array, maxarg, NULL, recompile_p,
+                                   /* $" */
+                                   GvSV((gv_fetchpvs("\"", GV_ADDMULTI, SVt_PV))));
+            }
+            else if (!pat) {
+                pat = newSVpvs_flags("", SVs_TEMP);
+            }
 
+            continue;
         }
-        Perl_re_printf( aTHX_  "\n" );
-    }
-    Perl_re_indentf( aTHX_  "word_info N:(prev,len)=",
-                                depth);
-    for (word=1; word <= trie->wordcount; word++) {
-        Perl_re_printf( aTHX_  " %d:(%d,%d)",
-            (int)word, (int)(trie->wordinfo[word].prev),
-            (int)(trie->wordinfo[word].len));
-    }
-    Perl_re_printf( aTHX_  "\n" );
-}
-/*
-  Dumps a fully constructed but uncompressed trie in list form.
-  List tries normally only are used for construction when the number of
-  possible chars (trie->uniquecharcount) is very high.
-  Used for debugging make_trie().
-*/
-STATIC void
-S_dump_trie_interim_list(pTHX_ const struct _reg_trie_data *trie,
-                         HV *widecharmap, AV *revcharmap, U32 next_alloc,
-                         U32 depth)
-{
-    U32 state;
-    SV *sv=sv_newmortal();
-    int colwidth= widecharmap ? 6 : 4;
-    DECLARE_AND_GET_RE_DEBUG_FLAGS;
-
-    PERL_ARGS_ASSERT_DUMP_TRIE_INTERIM_LIST;
 
-    /* print out the table precompression.  */
-    Perl_re_indentf( aTHX_  "State :Word | Transition Data\n",
-            depth+1 );
-    Perl_re_indentf( aTHX_  "%s",
-            depth+1, "------:-----+-----------------\n" );
 
-    for( state=1 ; state < next_alloc ; state ++ ) {
-        U16 charid;
+        /* we make the assumption here that each op in the list of
+         * op_siblings maps to one SV pushed onto the stack,
+         * except for code blocks, with have both an OP_NULL and
+         * an OP_CONST.
+         * This allows us to match up the list of SVs against the
+         * list of OPs to find the next code block.
+         *
+         * Note that       PUSHMARK PADSV PADSV ..
+         * is optimised to
+         *                 PADRANGE PADSV  PADSV  ..
+         * so the alignment still works. */
 
-        Perl_re_indentf( aTHX_  " %4" UVXf " :",
-            depth+1, (UV)state  );
-        if ( ! trie->states[ state ].wordnum ) {
-            Perl_re_printf( aTHX_  "%5s| ","");
-        } else {
-            Perl_re_printf( aTHX_  "W%4x| ",
-                trie->states[ state ].wordnum
-            );
+        if (oplist) {
+            if (oplist->op_type == OP_NULL
+                && (oplist->op_flags & OPf_SPECIAL))
+            {
+                assert(n < pRExC_state->code_blocks->count);
+                pRExC_state->code_blocks->cb[n].start = pat ? SvCUR(pat) : 0;
+                pRExC_state->code_blocks->cb[n].block = oplist;
+                pRExC_state->code_blocks->cb[n].src_regex = NULL;
+                n++;
+                code = 1;
+                oplist = OpSIBLING(oplist); /* skip CONST */
+                assert(oplist);
+            }
+            oplist = OpSIBLING(oplist);;
         }
-        for( charid = 1 ; charid <= TRIE_LIST_USED( state ) ; charid++ ) {
-            SV ** const tmp = av_fetch( revcharmap,
-                                        TRIE_LIST_ITEM(state, charid).forid, 0);
-            if ( tmp ) {
-                Perl_re_printf( aTHX_  "%*s:%3X=%4" UVXf " | ",
-                    colwidth,
-                    pv_pretty(sv, SvPV_nolen_const(*tmp), SvCUR(*tmp),
-                              colwidth,
-                              PL_colors[0], PL_colors[1],
-                              (SvUTF8(*tmp) ? PERL_PV_ESCAPE_UNI : 0)
-                              | PERL_PV_ESCAPE_FIRSTCHAR
-                    ) ,
-                    TRIE_LIST_ITEM(state, charid).forid,
-                    (UV)TRIE_LIST_ITEM(state, charid).newstate
-                );
-                if (!(charid % 10))
-                    Perl_re_printf( aTHX_  "\n%*s| ",
-                        (int)((depth * 2) + 14), "");
-            }
-        }
-        Perl_re_printf( aTHX_  "\n");
-    }
-}
-
-/*
-  Dumps a fully constructed but uncompressed trie in table form.
-  This is the normal DFA style state transition table, with a few
-  twists to facilitate compression later.
-  Used for debugging make_trie().
-*/
-STATIC void
-S_dump_trie_interim_table(pTHX_ const struct _reg_trie_data *trie,
-                          HV *widecharmap, AV *revcharmap, U32 next_alloc,
-                          U32 depth)
-{
-    U32 state;
-    U16 charid;
-    SV *sv=sv_newmortal();
-    int colwidth= widecharmap ? 6 : 4;
-    DECLARE_AND_GET_RE_DEBUG_FLAGS;
 
-    PERL_ARGS_ASSERT_DUMP_TRIE_INTERIM_TABLE;
+        /* apply magic and QR overloading to arg */
 
-    /*
-       print out the table precompression so that we can do a visual check
-       that they are identical.
-     */
-
-    Perl_re_indentf( aTHX_  "Char : ", depth+1 );
-
-    for( charid = 0 ; charid < trie->uniquecharcount ; charid++ ) {
-        SV ** const tmp = av_fetch( revcharmap, charid, 0);
-        if ( tmp ) {
-            Perl_re_printf( aTHX_  "%*s",
-                colwidth,
-                pv_pretty(sv, SvPV_nolen_const(*tmp), SvCUR(*tmp), colwidth,
-                            PL_colors[0], PL_colors[1],
-                            (SvUTF8(*tmp) ? PERL_PV_ESCAPE_UNI : 0) |
-                            PERL_PV_ESCAPE_FIRSTCHAR
-                )
-            );
+        SvGETMAGIC(msv);
+        if (SvROK(msv) && SvAMAGIC(msv)) {
+            SV *sv = AMG_CALLunary(msv, regexp_amg);
+            if (sv) {
+                if (SvROK(sv))
+                    sv = SvRV(sv);
+                if (SvTYPE(sv) != SVt_REGEXP)
+                    Perl_croak(aTHX_ "Overloaded qr did not return a REGEXP");
+                msv = sv;
+            }
         }
-    }
 
-    Perl_re_printf( aTHX_ "\n");
-    Perl_re_indentf( aTHX_  "State+-", depth+1 );
+        /* try concatenation overload ... */
+        if (pat && (SvAMAGIC(pat) || SvAMAGIC(msv)) &&
+                (sv = amagic_call(pat, msv, concat_amg, AMGf_assign)))
+        {
+            sv_setsv(pat, sv);
+            /* overloading involved: all bets are off over literal
+             * code. Pretend we haven't seen it */
+            if (n)
+                pRExC_state->code_blocks->count -= n;
+            n = 0;
+        }
+        else {
+            /* ... or failing that, try "" overload */
+            while (SvAMAGIC(msv)
+                    && (sv = AMG_CALLunary(msv, string_amg))
+                    && sv != msv
+                    &&  !(   SvROK(msv)
+                          && SvROK(sv)
+                          && SvRV(msv) == SvRV(sv))
+            ) {
+                msv = sv;
+                SvGETMAGIC(msv);
+            }
+            if (SvROK(msv) && SvTYPE(SvRV(msv)) == SVt_REGEXP)
+                msv = SvRV(msv);
 
-    for( charid=0 ; charid < trie->uniquecharcount ; charid++ ) {
-        Perl_re_printf( aTHX_  "%.*s", colwidth,"--------");
-    }
+            if (pat) {
+                /* this is a partially unrolled
+                 *     sv_catsv_nomg(pat, msv);
+                 * that allows us to adjust code block indices if
+                 * needed */
+                STRLEN dlen;
+                char *dst = SvPV_force_nomg(pat, dlen);
+                orig_patlen = dlen;
+                if (SvUTF8(msv) && !SvUTF8(pat)) {
+                    S_pat_upgrade_to_utf8(aTHX_ pRExC_state, &dst, &dlen, n);
+                    sv_setpvn(pat, dst, dlen);
+                    SvUTF8_on(pat);
+                }
+                sv_catsv_nomg(pat, msv);
+                rx = msv;
+            }
+            else {
+                /* We have only one SV to process, but we need to verify
+                 * it is properly null terminated or we will fail asserts
+                 * later. In theory we probably shouldn't get such SV's,
+                 * but if we do we should handle it gracefully. */
+                if ( SvTYPE(msv) != SVt_PV || (SvLEN(msv) > SvCUR(msv) && *(SvEND(msv)) == 0) || SvIsCOW_shared_hash(msv) ) {
+                    /* not a string, or a string with a trailing null */
+                    pat = msv;
+                } else {
+                    /* a string with no trailing null, we need to copy it
+                     * so it has a trailing null */
+                    pat = sv_2mortal(newSVsv(msv));
+                }
+            }
 
-    Perl_re_printf( aTHX_  "\n" );
+            if (code)
+                pRExC_state->code_blocks->cb[n-1].end = SvCUR(pat)-1;
+        }
 
-    for( state=1 ; state < next_alloc ; state += trie->uniquecharcount ) {
+        /* extract any code blocks within any embedded qr//'s */
+        if (rx && SvTYPE(rx) == SVt_REGEXP
+            && RX_ENGINE((REGEXP*)rx)->op_comp)
+        {
 
-        Perl_re_indentf( aTHX_  "%4" UVXf " : ",
-            depth+1,
-            (UV)TRIE_NODENUM( state ) );
+            RXi_GET_DECL(ReANY((REGEXP *)rx), ri);
+            if (ri->code_blocks && ri->code_blocks->count) {
+                int i;
+                /* the presence of an embedded qr// with code means
+                 * we should always recompile: the text of the
+                 * qr// may not have changed, but it may be a
+                 * different closure than last time */
+                *recompile_p = 1;
+                if (pRExC_state->code_blocks) {
+                    int new_count = pRExC_state->code_blocks->count
+                            + ri->code_blocks->count;
+                    Renew(pRExC_state->code_blocks->cb,
+                            new_count, struct reg_code_block);
+                    pRExC_state->code_blocks->count = new_count;
+                }
+                else
+                    pRExC_state->code_blocks = S_alloc_code_blocks(aTHX_
+                                                    ri->code_blocks->count);
 
-        for( charid = 0 ; charid < trie->uniquecharcount ; charid++ ) {
-            UV v=(UV)SAFE_TRIE_NODENUM( trie->trans[ state + charid ].next );
-            if (v)
-                Perl_re_printf( aTHX_  "%*" UVXf, colwidth, v );
-            else
-                Perl_re_printf( aTHX_  "%*s", colwidth, "." );
-        }
-        if ( ! trie->states[ TRIE_NODENUM( state ) ].wordnum ) {
-            Perl_re_printf( aTHX_  " (%4" UVXf ")\n",
-                                            (UV)trie->trans[ state ].check );
-        } else {
-            Perl_re_printf( aTHX_  " (%4" UVXf ") W%4X\n",
-                                            (UV)trie->trans[ state ].check,
-            trie->states[ TRIE_NODENUM( state ) ].wordnum );
+                for (i=0; i < ri->code_blocks->count; i++) {
+                    struct reg_code_block *src, *dst;
+                    STRLEN offset =  orig_patlen
+                        + ReANY((REGEXP *)rx)->pre_prefix;
+                    assert(n < pRExC_state->code_blocks->count);
+                    src = &ri->code_blocks->cb[i];
+                    dst = &pRExC_state->code_blocks->cb[n];
+                    dst->start     = src->start + offset;
+                    dst->end       = src->end   + offset;
+                    dst->block     = src->block;
+                    dst->src_regex  = (REGEXP*) SvREFCNT_inc( (SV*)
+                                            src->src_regex
+                                                ? src->src_regex
+                                                : (REGEXP*)rx);
+                    n++;
+                }
+            }
         }
     }
-}
-
-#endif
+    /* avoid calling magic multiple times on a single element e.g. =~ $qr */
+    if (alloced)
+        SvSETMAGIC(pat);
 
+    return pat;
+}
 
-/* make_trie(startbranch,first,last,tail,word_count,flags,depth)
-  startbranch: the first branch in the whole branch sequence
-  first      : start branch of sequence of branch-exact nodes.
-               May be the same as startbranch
-  last       : Thing following the last branch.
-               May be the same as tail.
-  tail       : item following the branch sequence
-  count      : words in the sequence
-  flags      : currently the OP() type we will be building one of /EXACT(|F|FA|FU|FU_SS|L|FLU8)/
-  depth      : indent depth
-
-Inplace optimizes a sequence of 2 or more Branch-Exact nodes into a TRIE node.
-
-A trie is an N'ary tree where the branches are determined by digital
-decomposition of the key. IE, at the root node you look up the 1st character and
-follow that branch repeat until you find the end of the branches. Nodes can be
-marked as "accepting" meaning they represent a complete word. Eg:
-
-  /he|she|his|hers/
-
-would convert into the following structure. Numbers represent states, letters
-following numbers represent valid transitions on the letter from that state, if
-the number is in square brackets it represents an accepting state, otherwise it
-will be in parenthesis.
-
-      +-h->+-e->[3]-+-r->(8)-+-s->[9]
-      |    |
-      |   (2)
-      |    |
-     (1)   +-i->(6)-+-s->[7]
-      |
-      +-s->(3)-+-h->(4)-+-e->[5]
-
-      Accept Word Mapping: 3=>1 (he),5=>2 (she), 7=>3 (his), 9=>4 (hers)
-
-This shows that when matching against the string 'hers' we will begin at state 1
-read 'h' and move to state 2, read 'e' and move to state 3 which is accepting,
-then read 'r' and go to state 8 followed by 's' which takes us to state 9 which
-is also accepting. Thus we know that we can match both 'he' and 'hers' with a
-single traverse. We store a mapping from accepting to state to which word was
-matched, and then when we have multiple possibilities we try to complete the
-rest of the regex in the order in which they occurred in the alternation.
-
-The only prior NFA like behaviour that would be changed by the TRIE support is
-the silent ignoring of duplicate alternations which are of the form:
-
- / (DUPE|DUPE) X? (?{ ... }) Y /x
-
-Thus EVAL blocks following a trie may be called a different number of times with
-and without the optimisation. With the optimisations dupes will be silently
-ignored. This inconsistent behaviour of EVAL type nodes is well established as
-the following demonstrates:
-
- 'words'=~/(word|word|word)(?{ print $1 })[xyz]/
-
-which prints out 'word' three times, but
-
- 'words'=~/(word|word|word)(?{ print $1 })S/
-
-which doesnt print it out at all. This is due to other optimisations kicking in.
-
-Example of what happens on a structural level:
-
-The regexp /(ac|ad|ab)+/ will produce the following debug output:
-
-   1: CURLYM[1] {1,32767}(18)
-   5:   BRANCH(8)
-   6:     EXACT <ac>(16)
-   8:   BRANCH(11)
-   9:     EXACT <ad>(16)
-  11:   BRANCH(14)
-  12:     EXACT <ab>(16)
-  16:   SUCCEED(0)
-  17:   NOTHING(18)
-  18: END(0)
-
-This would be optimizable with startbranch=5, first=5, last=16, tail=16
-and should turn into:
-
-   1: CURLYM[1] {1,32767}(18)
-   5:   TRIE(16)
-        [Words:3 Chars Stored:6 Unique Chars:4 States:5 NCP:1]
-          <ac>
-          <ad>
-          <ab>
-  16:   SUCCEED(0)
-  17:   NOTHING(18)
-  18: END(0)
-
-Cases where tail != last would be like /(?foo|bar)baz/:
-
-   1: BRANCH(4)
-   2:   EXACT <foo>(8)
-   4: BRANCH(7)
-   5:   EXACT <bar>(8)
-   7: TAIL(8)
-   8: EXACT <baz>(10)
-  10: END(0)
-
-which would be optimizable with startbranch=1, first=1, last=7, tail=8
-and would end up looking like:
-
-    1: TRIE(8)
-      [Words:2 Chars Stored:6 Unique Chars:5 States:7 NCP:1]
-        <foo>
-        <bar>
-   7: TAIL(8)
-   8: EXACT <baz>(10)
-  10: END(0)
 
-    d = uvchr_to_utf8_flags(d, uv, 0);
-
-is the recommended Unicode-aware way of saying
-
-    *(d++) = uv;
-*/
 
-#define TRIE_STORE_REVCHAR(val)                                            \
-    STMT_START {                                                           \
-        if (UTF) {                                                        \
-            SV *zlopp = newSV(UTF8_MAXBYTES);                             \
-            unsigned char *flrbbbbb = (unsigned char *) SvPVX(zlopp);     \
-            unsigned char *const kapow = uvchr_to_utf8(flrbbbbb, val);     \
-            *kapow = '\0';                                                 \
-            SvCUR_set(zlopp, kapow - flrbbbbb);                                   \
-            SvPOK_on(zlopp);                                              \
-            SvUTF8_on(zlopp);                                             \
-            av_push(revcharmap, zlopp);                                           \
-        } else {                                                          \
-            char ooooff = (char)val;                                           \
-            av_push(revcharmap, newSVpvn(&ooooff, 1));                    \
-        }                                                                 \
-        } STMT_END
-
-/* This gets the next character from the input, folding it if not already
- * folded. */
-#define TRIE_READ_CHAR STMT_START {                                           \
-    wordlen++;                                                                \
-    if ( UTF ) {                                                              \
-        /* if it is UTF then it is either already folded, or does not need    \
-         * folding */                                                         \
-        uvc = valid_utf8_to_uvchr( (const U8*) uc, &len);                     \
-    }                                                                         \
-    else if (folder == PL_fold_latin1) {                                      \
-        /* This folder implies Unicode rules, which in the range expressible  \
-         *  by not UTF is the lower case, with the two exceptions, one of     \
-         *  which should have been taken care of before calling this */       \
-        assert(*uc != LATIN_SMALL_LETTER_SHARP_S);                            \
-        uvc = toLOWER_L1(*uc);                                                \
-        if (UNLIKELY(uvc == MICRO_SIGN)) uvc = GREEK_SMALL_LETTER_MU;         \
-        len = 1;                                                              \
-    } else {                                                                  \
-        /* raw data, will be folded later if needed */                        \
-        uvc = (U32)*uc;                                                       \
-        len = 1;                                                              \
-    }                                                                         \
-} STMT_END
-
-
-
-#define TRIE_LIST_PUSH(state,fid,ns) STMT_START {               \
-    if ( TRIE_LIST_CUR( state ) >=TRIE_LIST_LEN( state ) ) {    \
-        U32 ging = TRIE_LIST_LEN( state ) * 2;                  \
-        Renew( trie->states[ state ].trans.list, ging, reg_trie_trans_le ); \
-        TRIE_LIST_LEN( state ) = ging;                          \
-    }                                                           \
-    TRIE_LIST_ITEM( state, TRIE_LIST_CUR( state ) ).forid = fid;     \
-    TRIE_LIST_ITEM( state, TRIE_LIST_CUR( state ) ).newstate = ns;   \
-    TRIE_LIST_CUR( state )++;                                   \
-} STMT_END
-
-#define TRIE_LIST_NEW(state) STMT_START {                       \
-    Newx( trie->states[ state ].trans.list,                     \
-        4, reg_trie_trans_le );                                 \
-     TRIE_LIST_CUR( state ) = 1;                                \
-     TRIE_LIST_LEN( state ) = 4;                                \
-} STMT_END
-
-#define TRIE_HANDLE_WORD(state) STMT_START {                    \
-    U16 dupe= trie->states[ state ].wordnum;                    \
-    regnode * const noper_next = regnext( noper );              \
-                                                                \
-    DEBUG_r({                                                   \
-        /* store the word for dumping */                        \
-        SV* tmp;                                                \
-        if (OP(noper) != NOTHING)                               \
-            tmp = newSVpvn_utf8(STRING(noper), STR_LEN(noper), UTF);   \
-        else                                                    \
-            tmp = newSVpvn_utf8( "", 0, UTF );                 \
-        av_push( trie_words, tmp );                             \
-    });                                                         \
-                                                                \
-    curword++;                                                  \
-    trie->wordinfo[curword].prev   = 0;                         \
-    trie->wordinfo[curword].len    = wordlen;                   \
-    trie->wordinfo[curword].accept = state;                     \
-                                                                \
-    if ( noper_next < tail ) {                                  \
-        if (!trie->jump)                                        \
-            trie->jump = (U16 *) PerlMemShared_calloc( word_count + 1, \
-                                                 sizeof(U16) ); \
-        trie->jump[curword] = (U16)(noper_next - convert);      \
-        if (!jumper)                                            \
-            jumper = noper_next;                                \
-        if (!nextbranch)                                        \
-            nextbranch= regnext(cur);                           \
-    }                                                           \
-                                                                \
-    if ( dupe ) {                                               \
-        /* It's a dupe. Pre-insert into the wordinfo[].prev   */\
-        /* chain, so that when the bits of chain are later    */\
-        /* linked together, the dups appear in the chain      */\
-        trie->wordinfo[curword].prev = trie->wordinfo[dupe].prev; \
-        trie->wordinfo[dupe].prev = curword;                    \
-    } else {                                                    \
-        /* we haven't inserted this word yet.                */ \
-        trie->states[ state ].wordnum = curword;                \
-    }                                                           \
-} STMT_END
-
-
-#define TRIE_TRANS_STATE(state,base,ucharcount,charid,special)         \
-     ( ( base + charid >=  ucharcount                                  \
-         && base + charid < ubound                                     \
-         && state == trie->trans[ base - ucharcount + charid ].check   \
-         && trie->trans[ base - ucharcount + charid ].next )           \
-           ? trie->trans[ base - ucharcount + charid ].next            \
-           : ( state==1 ? special : 0 )                                        \
-      )
-
-#define TRIE_BITMAP_SET_FOLDED(trie, uvc, folder)           \
-STMT_START {                                                \
-    TRIE_BITMAP_SET(trie, uvc);                             \
-    /* store the folded codepoint */                        \
-    if ( folder )                                           \
-        TRIE_BITMAP_SET(trie, folder[(U8) uvc ]);           \
-                                                            \
-    if ( !UTF ) {                                           \
-        /* store first byte of utf8 representation of */    \
-        /* variant codepoints */                            \
-        if (! UVCHR_IS_INVARIANT(uvc)) {                    \
-            TRIE_BITMAP_SET(trie, UTF8_TWO_BYTE_HI(uvc));   \
-        }                                                   \
-    }                                                       \
-} STMT_END
-#define MADE_TRIE       1
-#define MADE_JUMP_TRIE  2
-#define MADE_EXACT_TRIE 4
+/* see if there are any run-time code blocks in the pattern.
+ * False positives are allowed */
 
-STATIC I32
-S_make_trie(pTHX_ RExC_state_t *pRExC_state, regnode *startbranch,
-                  regnode *first, regnode *last, regnode *tail,
-                  U32 word_count, U32 flags, U32 depth)
+static bool
+S_has_runtime_code(pTHX_ RExC_state_t * const pRExC_state,
+                    char *pat, STRLEN plen)
 {
-    /* first pass, loop through and scan words */
-    reg_trie_data *trie;
-    HV *widecharmap = NULL;
-    AV *revcharmap = newAV();
-    regnode *cur;
-    STRLEN len = 0;
-    UV uvc = 0;
-    U16 curword = 0;
-    U32 next_alloc = 0;
-    regnode *jumper = NULL;
-    regnode *nextbranch = NULL;
-    regnode *convert = NULL;
-    U32 *prev_states; /* temp array mapping each state to previous one */
-    /* we just use folder as a flag in utf8 */
-    const U8 * folder = NULL;
-
-    /* in the below add_data call we are storing either 'tu' or 'tuaa'
-     * which stands for one trie structure, one hash, optionally followed
-     * by two arrays */
-#ifdef DEBUGGING
-    const U32 data_slot = add_data( pRExC_state, STR_WITH_LEN("tuaa"));
-    AV *trie_words = NULL;
-    /* along with revcharmap, this only used during construction but both are
-     * useful during debugging so we store them in the struct when debugging.
-     */
-#else
-    const U32 data_slot = add_data( pRExC_state, STR_WITH_LEN("tu"));
-    STRLEN trie_charcount=0;
-#endif
-    SV *re_trie_maxbuff;
-    DECLARE_AND_GET_RE_DEBUG_FLAGS;
-
-    PERL_ARGS_ASSERT_MAKE_TRIE;
-#ifndef DEBUGGING
-    PERL_UNUSED_ARG(depth);
-#endif
-
-    switch (flags) {
-        case EXACT: case EXACT_REQ8: case EXACTL: break;
-        case EXACTFAA:
-        case EXACTFUP:
-        case EXACTFU:
-        case EXACTFLU8: folder = PL_fold_latin1; break;
-        case EXACTF:  folder = PL_fold; break;
-        default: Perl_croak( aTHX_ "panic! In trie construction, unknown node type %u %s", (unsigned) flags, PL_reg_name[flags] );
-    }
-
-    trie = (reg_trie_data *) PerlMemShared_calloc( 1, sizeof(reg_trie_data) );
-    trie->refcount = 1;
-    trie->startstate = 1;
-    trie->wordcount = word_count;
-    RExC_rxi->data->data[ data_slot ] = (void*)trie;
-    trie->charmap = (U16 *) PerlMemShared_calloc( 256, sizeof(U16) );
-    if (flags == EXACT || flags == EXACT_REQ8 || flags == EXACTL)
-        trie->bitmap = (char *) PerlMemShared_calloc( ANYOF_BITMAP_SIZE, 1 );
-    trie->wordinfo = (reg_trie_wordinfo *) PerlMemShared_calloc(
-                       trie->wordcount+1, sizeof(reg_trie_wordinfo));
-
-    DEBUG_r({
-        trie_words = newAV();
-    });
-
-    re_trie_maxbuff = get_sv(RE_TRIE_MAXBUF_NAME, GV_ADD);
-    assert(re_trie_maxbuff);
-    if (!SvIOK(re_trie_maxbuff)) {
-        sv_setiv(re_trie_maxbuff, RE_TRIE_MAXBUF_INIT);
-    }
-    DEBUG_TRIE_COMPILE_r({
-        Perl_re_indentf( aTHX_
-          "make_trie start==%d, first==%d, last==%d, tail==%d depth=%d\n",
-          depth+1,
-          REG_NODE_NUM(startbranch), REG_NODE_NUM(first),
-          REG_NODE_NUM(last), REG_NODE_NUM(tail), (int)depth);
-    });
-
-   /* Find the node we are going to overwrite */
-    if ( first == startbranch && OP( last ) != BRANCH ) {
-        /* whole branch chain */
-        convert = first;
-    } else {
-        /* branch sub-chain */
-        convert = NEXTOPER( first );
-    }
-
-    /*  -- First loop and Setup --
-
-       We first traverse the branches and scan each word to determine if it
-       contains widechars, and how many unique chars there are, this is
-       important as we have to build a table with at least as many columns as we
-       have unique chars.
-
-       We use an array of integers to represent the character codes 0..255
-       (trie->charmap) and we use a an HV* to store Unicode characters. We use
-       the native representation of the character value as the key and IV's for
-       the coded index.
-
-       *TODO* If we keep track of how many times each character is used we can
-       remap the columns so that the table compression later on is more
-       efficient in terms of memory by ensuring the most common value is in the
-       middle and the least common are on the outside.  IMO this would be better
-       than a most to least common mapping as theres a decent chance the most
-       common letter will share a node with the least common, meaning the node
-       will not be compressible. With a middle is most common approach the worst
-       case is when we have the least common nodes twice.
-
-     */
-
-    for ( cur = first ; cur < last ; cur = regnext( cur ) ) {
-        regnode *noper = NEXTOPER( cur );
-        const U8 *uc;
-        const U8 *e;
-        int foldlen = 0;
-        U32 wordlen      = 0;         /* required init */
-        STRLEN minchars = 0;
-        STRLEN maxchars = 0;
-        bool set_bit = trie->bitmap ? 1 : 0; /*store the first char in the
-                                               bitmap?*/
-
-        if (OP(noper) == NOTHING) {
-            /* skip past a NOTHING at the start of an alternation
-             * eg, /(?:)a|(?:b)/ should be the same as /a|b/
-             *
-             * If the next node is not something we are supposed to process
-             * we will just ignore it due to the condition guarding the
-             * next block.
-             */
+    int n = 0;
+    STRLEN s;
 
-            regnode *noper_next= regnext(noper);
-            if (noper_next < tail)
-                noper= noper_next;
-        }
+    PERL_UNUSED_CONTEXT;
 
-        if (    noper < tail
-            && (    OP(noper) == flags
-                || (flags == EXACT && OP(noper) == EXACT_REQ8)
-                || (flags == EXACTFU && (   OP(noper) == EXACTFU_REQ8
-                                         || OP(noper) == EXACTFUP))))
+    for (s = 0; s < plen; s++) {
+        if (   pRExC_state->code_blocks
+            && n < pRExC_state->code_blocks->count
+            && s == pRExC_state->code_blocks->cb[n].start)
         {
-            uc= (U8*)STRING(noper);
-            e= uc + STR_LEN(noper);
-        } else {
-            trie->minlen= 0;
+            s = pRExC_state->code_blocks->cb[n].end;
+            n++;
             continue;
         }
+        /* TODO ideally should handle [..], (#..), /#.../x to reduce false
+         * positives here */
+        if (pat[s] == '(' && s+2 <= plen && pat[s+1] == '?' &&
+            (pat[s+2] == '{'
+                || (s + 2 <= plen && pat[s+2] == '?' && pat[s+3] == '{'))
+        )
+            return 1;
+    }
+    return 0;
+}
 
+/* Handle run-time code blocks. We will already have compiled any direct
+ * or indirect literal code blocks. Now, take the pattern 'pat' and make a
+ * copy of it, but with any literal code blocks blanked out and
+ * appropriate chars escaped; then feed it into
+ *
+ *    eval "qr'modified_pattern'"
+ *
+ * For example,
+ *
+ *       a\bc(?{"this was literal"})def'ghi\\jkl(?{"this is runtime"})mno
+ *
+ * becomes
+ *
+ *    qr'a\\bc_______________________def\'ghi\\\\jkl(?{"this is runtime"})mno'
+ *
+ * After eval_sv()-ing that, grab any new code blocks from the returned qr
+ * and merge them with any code blocks of the original regexp.
+ *
+ * If the pat is non-UTF8, while the evalled qr is UTF8, don't merge;
+ * instead, just save the qr and return FALSE; this tells our caller that
+ * the original pattern needs upgrading to utf8.
+ */
 
-        if ( set_bit ) { /* bitmap only alloced when !(UTF&&Folding) */
-            TRIE_BITMAP_SET(trie,*uc); /* store the raw first byte
-                                          regardless of encoding */
-            if (OP( noper ) == EXACTFUP) {
-                /* false positives are ok, so just set this */
-                TRIE_BITMAP_SET(trie, LATIN_SMALL_LETTER_SHARP_S);
-            }
-        }
-
-        for ( ; uc < e ; uc += len ) {  /* Look at each char in the current
-                                           branch */
-            TRIE_CHARCOUNT(trie)++;
-            TRIE_READ_CHAR;
-
-            /* TRIE_READ_CHAR returns the current character, or its fold if /i
-             * is in effect.  Under /i, this character can match itself, or
-             * anything that folds to it.  If not under /i, it can match just
-             * itself.  Most folds are 1-1, for example k, K, and KELVIN SIGN
-             * all fold to k, and all are single characters.   But some folds
-             * expand to more than one character, so for example LATIN SMALL
-             * LIGATURE FFI folds to the three character sequence 'ffi'.  If
-             * the string beginning at 'uc' is 'ffi', it could be matched by
-             * three characters, or just by the one ligature character. (It
-             * could also be matched by two characters: LATIN SMALL LIGATURE FF
-             * followed by 'i', or by 'f' followed by LATIN SMALL LIGATURE FI).
-             * (Of course 'I' and/or 'F' instead of 'i' and 'f' can also
-             * match.)  The trie needs to know the minimum and maximum number
-             * of characters that could match so that it can use size alone to
-             * quickly reject many match attempts.  The max is simple: it is
-             * the number of folded characters in this branch (since a fold is
-             * never shorter than what folds to it. */
-
-            maxchars++;
-
-            /* And the min is equal to the max if not under /i (indicated by
-             * 'folder' being NULL), or there are no multi-character folds.  If
-             * there is a multi-character fold, the min is incremented just
-             * once, for the character that folds to the sequence.  Each
-             * character in the sequence needs to be added to the list below of
-             * characters in the trie, but we count only the first towards the
-             * min number of characters needed.  This is done through the
-             * variable 'foldlen', which is returned by the macros that look
-             * for these sequences as the number of bytes the sequence
-             * occupies.  Each time through the loop, we decrement 'foldlen' by
-             * how many bytes the current char occupies.  Only when it reaches
-             * 0 do we increment 'minchars' or look for another multi-character
-             * sequence. */
-            if (folder == NULL) {
-                minchars++;
-            }
-            else if (foldlen > 0) {
-                foldlen -= (UTF) ? UTF8SKIP(uc) : 1;
-            }
-            else {
-                minchars++;
-
-                /* See if *uc is the beginning of a multi-character fold.  If
-                 * so, we decrement the length remaining to look at, to account
-                 * for the current character this iteration.  (We can use 'uc'
-                 * instead of the fold returned by TRIE_READ_CHAR because the
-                 * macro is smart enough to account for any unfolded
-                 * characters. */
-                if (UTF) {
-                    if ((foldlen = is_MULTI_CHAR_FOLD_utf8_safe(uc, e))) {
-                        foldlen -= UTF8SKIP(uc);
-                    }
-                }
-                else if ((foldlen = is_MULTI_CHAR_FOLD_latin1_safe(uc, e))) {
-                    foldlen--;
-                }
-            }
-
-            /* The current character (and any potential folds) should be added
-             * to the possible matching characters for this position in this
-             * branch */
-            if ( uvc < 256 ) {
-                if ( folder ) {
-                    U8 folded= folder[ (U8) uvc ];
-                    if ( !trie->charmap[ folded ] ) {
-                        trie->charmap[ folded ]=( ++trie->uniquecharcount );
-                        TRIE_STORE_REVCHAR( folded );
-                    }
-                }
-                if ( !trie->charmap[ uvc ] ) {
-                    trie->charmap[ uvc ]=( ++trie->uniquecharcount );
-                    TRIE_STORE_REVCHAR( uvc );
-                }
-                if ( set_bit ) {
-                    /* store the codepoint in the bitmap, and its folded
-                     * equivalent. */
-                    TRIE_BITMAP_SET_FOLDED(trie, uvc, folder);
-                    set_bit = 0; /* We've done our bit :-) */
-                }
-            } else {
-
-                /* XXX We could come up with the list of code points that fold
-                 * to this using PL_utf8_foldclosures, except not for
-                 * multi-char folds, as there may be multiple combinations
-                 * there that could work, which needs to wait until runtime to
-                 * resolve (The comment about LIGATURE FFI above is such an
-                 * example */
-
-                SV** svpp;
-                if ( !widecharmap )
-                    widecharmap = newHV();
-
-                svpp = hv_fetch( widecharmap, (char*)&uvc, sizeof( UV ), 1 );
-
-                if ( !svpp )
-                    Perl_croak( aTHX_ "error creating/fetching widecharmap entry for 0x%" UVXf, uvc );
-
-                if ( !SvTRUE( *svpp ) ) {
-                    sv_setiv( *svpp, ++trie->uniquecharcount );
-                    TRIE_STORE_REVCHAR(uvc);
-                }
-            }
-        } /* end loop through characters in this branch of the trie */
-
-        /* We take the min and max for this branch and combine to find the min
-         * and max for all branches processed so far */
-        if( cur == first ) {
-            trie->minlen = minchars;
-            trie->maxlen = maxchars;
-        } else if (minchars < trie->minlen) {
-            trie->minlen = minchars;
-        } else if (maxchars > trie->maxlen) {
-            trie->maxlen = maxchars;
-        }
-    } /* end first pass */
-    DEBUG_TRIE_COMPILE_r(
-        Perl_re_indentf( aTHX_
-                "TRIE(%s): W:%d C:%d Uq:%d Min:%d Max:%d\n",
-                depth+1,
-                ( widecharmap ? "UTF8" : "NATIVE" ), (int)word_count,
-                (int)TRIE_CHARCOUNT(trie), trie->uniquecharcount,
-                (int)trie->minlen, (int)trie->maxlen )
-    );
-
-    /*
-        We now know what we are dealing with in terms of unique chars and
-        string sizes so we can calculate how much memory a naive
-        representation using a flat table  will take. If it's over a reasonable
-        limit (as specified by ${^RE_TRIE_MAXBUF}) we use a more memory
-        conservative but potentially much slower representation using an array
-        of lists.
-
-        At the end we convert both representations into the same compressed
-        form that will be used in regexec.c for matching with. The latter
-        is a form that cannot be used to construct with but has memory
-        properties similar to the list form and access properties similar
-        to the table form making it both suitable for fast searches and
-        small enough that its feasable to store for the duration of a program.
+static bool
+S_compile_runtime_code(pTHX_ RExC_state_t * const pRExC_state,
+    char *pat, STRLEN plen)
+{
+    SV *qr;
 
-        See the comment in the code where the compressed table is produced
-        inplace from the flat tabe representation for an explanation of how
-        the compression works.
+    DECLARE_AND_GET_RE_DEBUG_FLAGS;
 
-    */
+    if (pRExC_state->runtime_code_qr) {
+        /* this is the second time we've been called; this should
+         * only happen if the main pattern got upgraded to utf8
+         * during compilation; re-use the qr we compiled first time
+         * round (which should be utf8 too)
+         */
+        qr = pRExC_state->runtime_code_qr;
+        pRExC_state->runtime_code_qr = NULL;
+        assert(RExC_utf8 && SvUTF8(qr));
+    }
+    else {
+        int n = 0;
+        STRLEN s;
+        char *p, *newpat;
+        int newlen = plen + 7; /* allow for "qr''xx\0" extra chars */
+        SV *sv, *qr_ref;
+        dSP;
 
+        /* determine how many extra chars we need for ' and \ escaping */
+        for (s = 0; s < plen; s++) {
+            if (pat[s] == '\'' || pat[s] == '\\')
+                newlen++;
+        }
 
-    Newx(prev_states, TRIE_CHARCOUNT(trie) + 2, U32);
-    prev_states[1] = 0;
+        Newx(newpat, newlen, char);
+        p = newpat;
+        *p++ = 'q'; *p++ = 'r'; *p++ = '\'';
 
-    if ( (IV)( ( TRIE_CHARCOUNT(trie) + 1 ) * trie->uniquecharcount + 1)
-                                                    > SvIV(re_trie_maxbuff) )
-    {
-        /*
-            Second Pass -- Array Of Lists Representation
-
-            Each state will be represented by a list of charid:state records
-            (reg_trie_trans_le) the first such element holds the CUR and LEN
-            points of the allocated array. (See defines above).
-
-            We build the initial structure using the lists, and then convert
-            it into the compressed table form which allows faster lookups
-            (but cant be modified once converted).
-        */
-
-        STRLEN transcount = 1;
-
-        DEBUG_TRIE_COMPILE_MORE_r( Perl_re_indentf( aTHX_  "Compiling trie using list compiler\n",
-            depth+1));
-
-        trie->states = (reg_trie_state *)
-            PerlMemShared_calloc( TRIE_CHARCOUNT(trie) + 2,
-                                  sizeof(reg_trie_state) );
-        TRIE_LIST_NEW(1);
-        next_alloc = 2;
-
-        for ( cur = first ; cur < last ; cur = regnext( cur ) ) {
-
-            regnode *noper   = NEXTOPER( cur );
-            U32 state        = 1;         /* required init */
-            U16 charid       = 0;         /* sanity init */
-            U32 wordlen      = 0;         /* required init */
-
-            if (OP(noper) == NOTHING) {
-                regnode *noper_next= regnext(noper);
-                if (noper_next < tail)
-                    noper= noper_next;
-                /* we will undo this assignment if noper does not
-                 * point at a trieable type in the else clause of
-                 * the following statement. */
-            }
-
-            if (    noper < tail
-                && (    OP(noper) == flags
-                    || (flags == EXACT && OP(noper) == EXACT_REQ8)
-                    || (flags == EXACTFU && (   OP(noper) == EXACTFU_REQ8
-                                             || OP(noper) == EXACTFUP))))
+        for (s = 0; s < plen; s++) {
+            if (   pRExC_state->code_blocks
+                && n < pRExC_state->code_blocks->count
+                && s == pRExC_state->code_blocks->cb[n].start)
             {
-                const U8 *uc= (U8*)STRING(noper);
-                const U8 *e= uc + STR_LEN(noper);
-
-                for ( ; uc < e ; uc += len ) {
-
-                    TRIE_READ_CHAR;
-
-                    if ( uvc < 256 ) {
-                        charid = trie->charmap[ uvc ];
-                    } else {
-                        SV** const svpp = hv_fetch( widecharmap,
-                                                    (char*)&uvc,
-                                                    sizeof( UV ),
-                                                    0);
-                        if ( !svpp ) {
-                            charid = 0;
-                        } else {
-                            charid=(U16)SvIV( *svpp );
-                        }
-                    }
-                    /* charid is now 0 if we dont know the char read, or
-                     * nonzero if we do */
-                    if ( charid ) {
-
-                        U16 check;
-                        U32 newstate = 0;
-
-                        charid--;
-                        if ( !trie->states[ state ].trans.list ) {
-                            TRIE_LIST_NEW( state );
-                        }
-                        for ( check = 1;
-                              check <= TRIE_LIST_USED( state );
-                              check++ )
-                        {
-                            if ( TRIE_LIST_ITEM( state, check ).forid
-                                                                    == charid )
-                            {
-                                newstate = TRIE_LIST_ITEM( state, check ).newstate;
-                                break;
-                            }
-                        }
-                        if ( ! newstate ) {
-                            newstate = next_alloc++;
-                            prev_states[newstate] = state;
-                            TRIE_LIST_PUSH( state, charid, newstate );
-                            transcount++;
-                        }
-                        state = newstate;
-                    } else {
-                        Perl_croak( aTHX_ "panic! In trie construction, no char mapping for %" IVdf, uvc );
-                    }
-                }
-            } else {
-                /* If we end up here it is because we skipped past a NOTHING, but did not end up
-                 * on a trieable type. So we need to reset noper back to point at the first regop
-                 * in the branch before we call TRIE_HANDLE_WORD()
-                */
-                noper= NEXTOPER(cur);
-            }
-            TRIE_HANDLE_WORD(state);
-
-        } /* end second pass */
-
-        /* next alloc is the NEXT state to be allocated */
-        trie->statecount = next_alloc;
-        trie->states = (reg_trie_state *)
-            PerlMemShared_realloc( trie->states,
-                                   next_alloc
-                                   * sizeof(reg_trie_state) );
-
-        /* and now dump it out before we compress it */
-        DEBUG_TRIE_COMPILE_MORE_r(dump_trie_interim_list(trie, widecharmap,
-                                                         revcharmap, next_alloc,
-                                                         depth+1)
-        );
-
-        trie->trans = (reg_trie_trans *)
-            PerlMemShared_calloc( transcount, sizeof(reg_trie_trans) );
-        {
-            U32 state;
-            U32 tp = 0;
-            U32 zp = 0;
-
-
-            for( state=1 ; state < next_alloc ; state ++ ) {
-                U32 base=0;
-
-                /*
-                DEBUG_TRIE_COMPILE_MORE_r(
-                    Perl_re_printf( aTHX_  "tp: %d zp: %d ",tp,zp)
-                );
+                /* blank out literal code block so that they aren't
+                 * recompiled: eg change from/to:
+                 *     /(?{xyz})/
+                 *     /(?=====)/
+                 * and
+                 *     /(??{xyz})/
+                 *     /(?======)/
+                 * and
+                 *     /(?(?{xyz}))/
+                 *     /(?(?=====))/
                 */
-
-                if (trie->states[state].trans.list) {
-                    U16 minid=TRIE_LIST_ITEM( state, 1).forid;
-                    U16 maxid=minid;
-                    U16 idx;
-
-                    for( idx = 2 ; idx <= TRIE_LIST_USED( state ) ; idx++ ) {
-                        const U16 forid = TRIE_LIST_ITEM( state, idx).forid;
-                        if ( forid < minid ) {
-                            minid=forid;
-                        } else if ( forid > maxid ) {
-                            maxid=forid;
-                        }
-                    }
-                    if ( transcount < tp + maxid - minid + 1) {
-                        transcount *= 2;
-                        trie->trans = (reg_trie_trans *)
-                            PerlMemShared_realloc( trie->trans,
-                                                     transcount
-                                                     * sizeof(reg_trie_trans) );
-                        Zero( trie->trans + (transcount / 2),
-                              transcount / 2,
-                              reg_trie_trans );
-                    }
-                    base = trie->uniquecharcount + tp - minid;
-                    if ( maxid == minid ) {
-                        U32 set = 0;
-                        for ( ; zp < tp ; zp++ ) {
-                            if ( ! trie->trans[ zp ].next ) {
-                                base = trie->uniquecharcount + zp - minid;
-                                trie->trans[ zp ].next = TRIE_LIST_ITEM( state,
-                                                                   1).newstate;
-                                trie->trans[ zp ].check = state;
-                                set = 1;
-                                break;
-                            }
-                        }
-                        if ( !set ) {
-                            trie->trans[ tp ].next = TRIE_LIST_ITEM( state,
-                                                                   1).newstate;
-                            trie->trans[ tp ].check = state;
-                            tp++;
-                            zp = tp;
-                        }
-                    } else {
-                        for ( idx=1; idx <= TRIE_LIST_USED( state ) ; idx++ ) {
-                            const U32 tid = base
-                                           - trie->uniquecharcount
-                                           + TRIE_LIST_ITEM( state, idx ).forid;
-                            trie->trans[ tid ].next = TRIE_LIST_ITEM( state,
-                                                                idx ).newstate;
-                            trie->trans[ tid ].check = state;
-                        }
-                        tp += ( maxid - minid + 1 );
-                    }
-                    Safefree(trie->states[ state ].trans.list);
+                assert(pat[s]   == '(');
+                assert(pat[s+1] == '?');
+                *p++ = '(';
+                *p++ = '?';
+                s += 2;
+                while (s < pRExC_state->code_blocks->cb[n].end) {
+                    *p++ = '=';
+                    s++;
                 }
-                /*
-                DEBUG_TRIE_COMPILE_MORE_r(
-                    Perl_re_printf( aTHX_  " base: %d\n",base);
-                );
-                */
-                trie->states[ state ].trans.base=base;
+                *p++ = ')';
+                n++;
+                continue;
             }
-            trie->lasttrans = tp + 1;
+            if (pat[s] == '\'' || pat[s] == '\\')
+                *p++ = '\\';
+            *p++ = pat[s];
         }
-    } else {
-        /*
-           Second Pass -- Flat Table Representation.
-
-           we dont use the 0 slot of either trans[] or states[] so we add 1 to
-           each.  We know that we will need Charcount+1 trans at most to store
-           the data (one row per char at worst case) So we preallocate both
-           structures assuming worst case.
-
-           We then construct the trie using only the .next slots of the entry
-           structs.
-
-           We use the .check field of the first entry of the node temporarily
-           to make compression both faster and easier by keeping track of how
-           many non zero fields are in the node.
-
-           Since trans are numbered from 1 any 0 pointer in the table is a FAIL
-           transition.
-
-           There are two terms at use here: state as a TRIE_NODEIDX() which is
-           a number representing the first entry of the node, and state as a
-           TRIE_NODENUM() which is the trans number. state 1 is TRIE_NODEIDX(1)
-           and TRIE_NODENUM(1), state 2 is TRIE_NODEIDX(2) and TRIE_NODENUM(3)
-           if there are 2 entrys per node. eg:
-
-             A B       A B
-          1. 2 4    1. 3 7
-          2. 0 3    3. 0 5
-          3. 0 0    5. 0 0
-          4. 0 0    7. 0 0
-
-           The table is internally in the right hand, idx form. However as we
-           also have to deal with the states array which is indexed by nodenum
-           we have to use TRIE_NODENUM() to convert.
-
-        */
-        DEBUG_TRIE_COMPILE_MORE_r( Perl_re_indentf( aTHX_  "Compiling trie using table compiler\n",
-            depth+1));
-
-        trie->trans = (reg_trie_trans *)
-            PerlMemShared_calloc( ( TRIE_CHARCOUNT(trie) + 1 )
-                                  * trie->uniquecharcount + 1,
-                                  sizeof(reg_trie_trans) );
-        trie->states = (reg_trie_state *)
-            PerlMemShared_calloc( TRIE_CHARCOUNT(trie) + 2,
-                                  sizeof(reg_trie_state) );
-        next_alloc = trie->uniquecharcount + 1;
-
-
-        for ( cur = first ; cur < last ; cur = regnext( cur ) ) {
-
-            regnode *noper   = NEXTOPER( cur );
-
-            U32 state        = 1;         /* required init */
-
-            U16 charid       = 0;         /* sanity init */
-            U32 accept_state = 0;         /* sanity init */
-
-            U32 wordlen      = 0;         /* required init */
-
-            if (OP(noper) == NOTHING) {
-                regnode *noper_next= regnext(noper);
-                if (noper_next < tail)
-                    noper= noper_next;
-                /* we will undo this assignment if noper does not
-                 * point at a trieable type in the else clause of
-                 * the following statement. */
-            }
-
-            if (    noper < tail
-                && (    OP(noper) == flags
-                    || (flags == EXACT && OP(noper) == EXACT_REQ8)
-                    || (flags == EXACTFU && (   OP(noper) == EXACTFU_REQ8
-                                             || OP(noper) == EXACTFUP))))
-            {
-                const U8 *uc= (U8*)STRING(noper);
-                const U8 *e= uc + STR_LEN(noper);
-
-                for ( ; uc < e ; uc += len ) {
-
-                    TRIE_READ_CHAR;
-
-                    if ( uvc < 256 ) {
-                        charid = trie->charmap[ uvc ];
-                    } else {
-                        SV* const * const svpp = hv_fetch( widecharmap,
-                                                           (char*)&uvc,
-                                                           sizeof( UV ),
-                                                           0);
-                        charid = svpp ? (U16)SvIV(*svpp) : 0;
-                    }
-                    if ( charid ) {
-                        charid--;
-                        if ( !trie->trans[ state + charid ].next ) {
-                            trie->trans[ state + charid ].next = next_alloc;
-                            trie->trans[ state ].check++;
-                            prev_states[TRIE_NODENUM(next_alloc)]
-                                    = TRIE_NODENUM(state);
-                            next_alloc += trie->uniquecharcount;
-                        }
-                        state = trie->trans[ state + charid ].next;
-                    } else {
-                        Perl_croak( aTHX_ "panic! In trie construction, no char mapping for %" IVdf, uvc );
-                    }
-                    /* charid is now 0 if we dont know the char read, or
-                     * nonzero if we do */
-                }
-            } else {
-                /* If we end up here it is because we skipped past a NOTHING, but did not end up
-                 * on a trieable type. So we need to reset noper back to point at the first regop
-                 * in the branch before we call TRIE_HANDLE_WORD().
-                */
-                noper= NEXTOPER(cur);
+        *p++ = '\'';
+        if (pRExC_state->pm_flags & RXf_PMf_EXTENDED) {
+            *p++ = 'x';
+            if (pRExC_state->pm_flags & RXf_PMf_EXTENDED_MORE) {
+                *p++ = 'x';
             }
-            accept_state = TRIE_NODENUM( state );
-            TRIE_HANDLE_WORD(accept_state);
-
-        } /* end second pass */
+        }
+        *p++ = '\0';
+        DEBUG_COMPILE_r({
+            Perl_re_printf( aTHX_
+                "%sre-parsing pattern for runtime code:%s %s\n",
+                PL_colors[4], PL_colors[5], newpat);
+        });
 
-        /* and now dump it out before we compress it */
-        DEBUG_TRIE_COMPILE_MORE_r(dump_trie_interim_table(trie, widecharmap,
-                                                          revcharmap,
-                                                          next_alloc, depth+1));
+        sv = newSVpvn_flags(newpat, p-newpat-1, RExC_utf8 ? SVf_UTF8 : 0);
+        Safefree(newpat);
 
+        ENTER;
+        SAVETMPS;
+        save_re_context();
+        PUSHSTACKi(PERLSI_REQUIRE);
+        /* G_RE_REPARSING causes the toker to collapse \\ into \ when
+         * parsing qr''; normally only q'' does this. It also alters
+         * hints handling */
+        eval_sv(sv, G_SCALAR|G_RE_REPARSING);
+        SvREFCNT_dec_NN(sv);
+        SPAGAIN;
+        qr_ref = POPs;
+        PUTBACK;
         {
-        /*
-           * Inplace compress the table.*
-
-           For sparse data sets the table constructed by the trie algorithm will
-           be mostly 0/FAIL transitions or to put it another way mostly empty.
-           (Note that leaf nodes will not contain any transitions.)
-
-           This algorithm compresses the tables by eliminating most such
-           transitions, at the cost of a modest bit of extra work during lookup:
-
-           - Each states[] entry contains a .base field which indicates the
-           index in the state[] array wheres its transition data is stored.
-
-           - If .base is 0 there are no valid transitions from that node.
-
-           - If .base is nonzero then charid is added to it to find an entry in
-           the trans array.
-
-           -If trans[states[state].base+charid].check!=state then the
-           transition is taken to be a 0/Fail transition. Thus if there are fail
-           transitions at the front of the node then the .base offset will point
-           somewhere inside the previous nodes data (or maybe even into a node
-           even earlier), but the .check field determines if the transition is
-           valid.
-
-           XXX - wrong maybe?
-           The following process inplace converts the table to the compressed
-           table: We first do not compress the root node 1,and mark all its
-           .check pointers as 1 and set its .base pointer as 1 as well. This
-           allows us to do a DFA construction from the compressed table later,
-           and ensures that any .base pointers we calculate later are greater
-           than 0.
-
-           - We set 'pos' to indicate the first entry of the second node.
-
-           - We then iterate over the columns of the node, finding the first and
-           last used entry at l and m. We then copy l..m into pos..(pos+m-l),
-           and set the .check pointers accordingly, and advance pos
-           appropriately and repreat for the next node. Note that when we copy
-           the next pointers we have to convert them from the original
-           NODEIDX form to NODENUM form as the former is not valid post
-           compression.
-
-           - If a node has no transitions used we mark its base as 0 and do not
-           advance the pos pointer.
-
-           - If a node only has one transition we use a second pointer into the
-           structure to fill in allocated fail transitions from other states.
-           This pointer is independent of the main pointer and scans forward
-           looking for null transitions that are allocated to a state. When it
-           finds one it writes the single transition into the "hole".  If the
-           pointer doesnt find one the single transition is appended as normal.
-
-           - Once compressed we can Renew/realloc the structures to release the
-           excess space.
-
-           See "Table-Compression Methods" in sec 3.9 of the Red Dragon,
-           specifically Fig 3.47 and the associated pseudocode.
-
-           demq
-        */
-        const U32 laststate = TRIE_NODENUM( next_alloc );
-        U32 state, charid;
-        U32 pos = 0, zp=0;
-        trie->statecount = laststate;
-
-        for ( state = 1 ; state < laststate ; state++ ) {
-            U8 flag = 0;
-            const U32 stateidx = TRIE_NODEIDX( state );
-            const U32 o_used = trie->trans[ stateidx ].check;
-            U32 used = trie->trans[ stateidx ].check;
-            trie->trans[ stateidx ].check = 0;
-
-            for ( charid = 0;
-                  used && charid < trie->uniquecharcount;
-                  charid++ )
-            {
-                if ( flag || trie->trans[ stateidx + charid ].next ) {
-                    if ( trie->trans[ stateidx + charid ].next ) {
-                        if (o_used == 1) {
-                            for ( ; zp < pos ; zp++ ) {
-                                if ( ! trie->trans[ zp ].next ) {
-                                    break;
-                                }
-                            }
-                            trie->states[ state ].trans.base
-                                                    = zp
-                                                      + trie->uniquecharcount
-                                                      - charid ;
-                            trie->trans[ zp ].next
-                                = SAFE_TRIE_NODENUM( trie->trans[ stateidx
-                                                             + charid ].next );
-                            trie->trans[ zp ].check = state;
-                            if ( ++zp > pos ) pos = zp;
-                            break;
-                        }
-                        used--;
-                    }
-                    if ( !flag ) {
-                        flag = 1;
-                        trie->states[ state ].trans.base
-                                       = pos + trie->uniquecharcount - charid ;
-                    }
-                    trie->trans[ pos ].next
-                        = SAFE_TRIE_NODENUM(
-                                       trie->trans[ stateidx + charid ].next );
-                    trie->trans[ pos ].check = state;
-                    pos++;
-                }
-            }
-        }
-        trie->lasttrans = pos + 1;
-        trie->states = (reg_trie_state *)
-            PerlMemShared_realloc( trie->states, laststate
-                                   * sizeof(reg_trie_state) );
-        DEBUG_TRIE_COMPILE_MORE_r(
-            Perl_re_indentf( aTHX_  "Alloc: %d Orig: %" IVdf " elements, Final:%" IVdf ". Savings of %%%5.2f\n",
-                depth+1,
-                (int)( ( TRIE_CHARCOUNT(trie) + 1 ) * trie->uniquecharcount
-                       + 1 ),
-                (IV)next_alloc,
-                (IV)pos,
-                ( ( next_alloc - pos ) * 100 ) / (double)next_alloc );
-            );
-
-        } /* end table compress */
-    }
-    DEBUG_TRIE_COMPILE_MORE_r(
-            Perl_re_indentf( aTHX_  "Statecount:%" UVxf " Lasttrans:%" UVxf "\n",
-                depth+1,
-                (UV)trie->statecount,
-                (UV)trie->lasttrans)
-    );
-    /* resize the trans array to remove unused space */
-    trie->trans = (reg_trie_trans *)
-        PerlMemShared_realloc( trie->trans, trie->lasttrans
-                               * sizeof(reg_trie_trans) );
-
-    {   /* Modify the program and insert the new TRIE node */
-        U8 nodetype =(U8) flags;
-        char *str=NULL;
-
-#ifdef DEBUGGING
-        regnode *optimize = NULL;
-#endif /* DEBUGGING */
-        /*
-           This means we convert either the first branch or the first Exact,
-           depending on whether the thing following (in 'last') is a branch
-           or not and whther first is the startbranch (ie is it a sub part of
-           the alternation or is it the whole thing.)
-           Assuming its a sub part we convert the EXACT otherwise we convert
-           the whole branch sequence, including the first.
-         */
-        /* Find the node we are going to overwrite */
-        if ( first != startbranch || OP( last ) == BRANCH ) {
-            /* branch sub-chain */
-            NEXT_OFF( first ) = (U16)(last - first);
-            /* whole branch chain */
-        }
-        /* But first we check to see if there is a common prefix we can
-           split out as an EXACT and put in front of the TRIE node.  */
-        trie->startstate= 1;
-        if ( trie->bitmap && !widecharmap && !trie->jump  ) {
-            /* we want to find the first state that has more than
-             * one transition, if that state is not the first state
-             * then we have a common prefix which we can remove.
-             */
-            U32 state;
-            for ( state = 1 ; state < trie->statecount-1 ; state++ ) {
-                U32 ofs = 0;
-                I32 first_ofs = -1; /* keeps track of the ofs of the first
-                                       transition, -1 means none */
-                U32 count = 0;
-                const U32 base = trie->states[ state ].trans.base;
-
-                /* does this state terminate an alternation? */
-                if ( trie->states[state].wordnum )
-                        count = 1;
-
-                for ( ofs = 0 ; ofs < trie->uniquecharcount ; ofs++ ) {
-                    if ( ( base + ofs >= trie->uniquecharcount ) &&
-                         ( base + ofs - trie->uniquecharcount < trie->lasttrans ) &&
-                         trie->trans[ base + ofs - trie->uniquecharcount ].check == state )
-                    {
-                        if ( ++count > 1 ) {
-                            /* we have more than one transition */
-                            SV **tmp;
-                            U8 *ch;
-                            /* if this is the first state there is no common prefix
-                             * to extract, so we can exit */
-                            if ( state == 1 ) break;
-                            tmp = av_fetch( revcharmap, ofs, 0);
-                            ch = (U8*)SvPV_nolen_const( *tmp );
-
-                            /* if we are on count 2 then we need to initialize the
-                             * bitmap, and store the previous char if there was one
-                             * in it*/
-                            if ( count == 2 ) {
-                                /* clear the bitmap */
-                                Zero(trie->bitmap, ANYOF_BITMAP_SIZE, char);
-                                DEBUG_OPTIMISE_r(
-                                    Perl_re_indentf( aTHX_  "New Start State=%" UVuf " Class: [",
-                                        depth+1,
-                                        (UV)state));
-                                if (first_ofs >= 0) {
-                                    SV ** const tmp = av_fetch( revcharmap, first_ofs, 0);
-                                    const U8 * const ch = (U8*)SvPV_nolen_const( *tmp );
-
-                                    TRIE_BITMAP_SET_FOLDED(trie,*ch, folder);
-                                    DEBUG_OPTIMISE_r(
-                                        Perl_re_printf( aTHX_  "%s", (char*)ch)
-                                    );
-                                }
-                            }
-                            /* store the current firstchar in the bitmap */
-                            TRIE_BITMAP_SET_FOLDED(trie,*ch, folder);
-                            DEBUG_OPTIMISE_r(Perl_re_printf( aTHX_ "%s", ch));
-                        }
-                        first_ofs = ofs;
-                    }
-                }
-                if ( count == 1 ) {
-                    /* This state has only one transition, its transition is part
-                     * of a common prefix - we need to concatenate the char it
-                     * represents to what we have so far. */
-                    SV **tmp = av_fetch( revcharmap, first_ofs, 0);
-                    STRLEN len;
-                    char *ch = SvPV( *tmp, len );
-                    DEBUG_OPTIMISE_r({
-                        SV *sv=sv_newmortal();
-                        Perl_re_indentf( aTHX_  "Prefix State: %" UVuf " Ofs:%" UVuf " Char='%s'\n",
-                            depth+1,
-                            (UV)state, (UV)first_ofs,
-                            pv_pretty(sv, SvPV_nolen_const(*tmp), SvCUR(*tmp), 6,
-                                PL_colors[0], PL_colors[1],
-                                (SvUTF8(*tmp) ? PERL_PV_ESCAPE_UNI : 0) |
-                                PERL_PV_ESCAPE_FIRSTCHAR
-                            )
-                        );
-                    });
-                    if ( state==1 ) {
-                        OP( convert ) = nodetype;
-                        str=STRING(convert);
-                        setSTR_LEN(convert, 0);
-                    }
-                    assert( ( STR_LEN(convert) + len ) < 256 );
-                    setSTR_LEN(convert, (U8)(STR_LEN(convert) + len));
-                    while (len--)
-                        *str++ = *ch++;
-                } else {
-#ifdef DEBUGGING
-                    if (state>1)
-                        DEBUG_OPTIMISE_r(Perl_re_printf( aTHX_ "]\n"));
-#endif
-                    break;
-                }
-            }
-            trie->prefixlen = (state-1);
-            if (str) {
-                regnode *n = convert+NODE_SZ_STR(convert);
-                assert( NODE_SZ_STR(convert) <= U16_MAX );
-                NEXT_OFF(convert) = (U16)(NODE_SZ_STR(convert));
-                trie->startstate = state;
-                trie->minlen -= (state - 1);
-                trie->maxlen -= (state - 1);
-#ifdef DEBUGGING
-               /* At least the UNICOS C compiler choked on this
-                * being argument to DEBUG_r(), so let's just have
-                * it right here. */
-               if (
-#ifdef PERL_EXT_RE_BUILD
-                   1
-#else
-                   DEBUG_r_TEST
-#endif
-                   ) {
-                   U32 word = trie->wordcount;
-                   while (word--) {
-                       SV ** const tmp = av_fetch( trie_words, word, 0 );
-                       if (tmp) {
-                           if ( STR_LEN(convert) <= SvCUR(*tmp) )
-                               sv_chop(*tmp, SvPV_nolen(*tmp) + STR_LEN(convert));
-                           else
-                               sv_chop(*tmp, SvPV_nolen(*tmp) + SvCUR(*tmp));
-                       }
-                   }
-               }
-#endif
-                if (trie->maxlen) {
-                    convert = n;
-                } else {
-                    NEXT_OFF(convert) = (U16)(tail - convert);
-                    DEBUG_r(optimize= n);
-                }
-            }
-        }
-        if (!jumper)
-            jumper = last;
-        if ( trie->maxlen ) {
-            NEXT_OFF( convert ) = (U16)(tail - convert);
-            ARG_SET( convert, data_slot );
-            /* Store the offset to the first unabsorbed branch in
-               jump[0], which is otherwise unused by the jump logic.
-               We use this when dumping a trie and during optimisation. */
-            if (trie->jump)
-                trie->jump[0] = (U16)(nextbranch - convert);
-
-            /* If the start state is not accepting (meaning there is no empty string/NOTHING)
-             *   and there is a bitmap
-             *   and the first "jump target" node we found leaves enough room
-             * then convert the TRIE node into a TRIEC node, with the bitmap
-             * embedded inline in the opcode - this is hypothetically faster.
-             */
-            if ( !trie->states[trie->startstate].wordnum
-                 && trie->bitmap
-                 && ( (char *)jumper - (char *)convert) >= (int)sizeof(struct regnode_charclass) )
-            {
-                OP( convert ) = TRIEC;
-                Copy(trie->bitmap, ((struct regnode_charclass *)convert)->bitmap, ANYOF_BITMAP_SIZE, char);
-                PerlMemShared_free(trie->bitmap);
-                trie->bitmap= NULL;
-            } else
-                OP( convert ) = TRIE;
-
-            /* store the type in the flags */
-            convert->flags = nodetype;
-            DEBUG_r({
-            optimize = convert
-                      + NODE_STEP_REGNODE
-                      + regarglen[ OP( convert ) ];
-            });
-            /* XXX We really should free up the resource in trie now,
-                   as we won't use them - (which resources?) dmq */
-        }
-        /* needed for dumping*/
-        DEBUG_r(if (optimize) {
-            /*
-                Try to clean up some of the debris left after the
-                optimisation.
-             */
-            while( optimize < jumper ) {
-                OP( optimize ) = OPTIMIZED;
-                optimize++;
-            }
-        });
-    } /* end node insert */
-
-    /*  Finish populating the prev field of the wordinfo array.  Walk back
-     *  from each accept state until we find another accept state, and if
-     *  so, point the first word's .prev field at the second word. If the
-     *  second already has a .prev field set, stop now. This will be the
-     *  case either if we've already processed that word's accept state,
-     *  or that state had multiple words, and the overspill words were
-     *  already linked up earlier.
-     */
-    {
-        U16 word;
-        U32 state;
-        U16 prev;
-
-        for (word=1; word <= trie->wordcount; word++) {
-            prev = 0;
-            if (trie->wordinfo[word].prev)
-                continue;
-            state = trie->wordinfo[word].accept;
-            while (state) {
-                state = prev_states[state];
-                if (!state)
-                    break;
-                prev = trie->states[state].wordnum;
-                if (prev)
-                    break;
-            }
-            trie->wordinfo[word].prev = prev;
+            SV * const errsv = ERRSV;
+            if (SvTRUE_NN(errsv))
+                /* use croak_sv ? */
+                Perl_croak_nocontext("%" SVf, SVfARG(errsv));
         }
-        Safefree(prev_states);
-    }
-
-
-    /* and now dump out the compressed format */
-    DEBUG_TRIE_COMPILE_r(dump_trie(trie, widecharmap, revcharmap, depth+1));
-
-    RExC_rxi->data->data[ data_slot + 1 ] = (void*)widecharmap;
-#ifdef DEBUGGING
-    RExC_rxi->data->data[ data_slot + TRIE_WORDS_OFFSET ] = (void*)trie_words;
-    RExC_rxi->data->data[ data_slot + 3 ] = (void*)revcharmap;
-#else
-    SvREFCNT_dec_NN(revcharmap);
-#endif
-    return trie->jump
-           ? MADE_JUMP_TRIE
-           : trie->startstate>1
-             ? MADE_EXACT_TRIE
-             : MADE_TRIE;
-}
-
-STATIC regnode *
-S_construct_ahocorasick_from_trie(pTHX_ RExC_state_t *pRExC_state, regnode *source, U32 depth)
-{
-/* The Trie is constructed and compressed now so we can build a fail array if
- * it's needed
-
-   This is basically the Aho-Corasick algorithm. Its from exercise 3.31 and
-   3.32 in the
-   "Red Dragon" -- Compilers, principles, techniques, and tools. Aho, Sethi,
-   Ullman 1985/88
-   ISBN 0-201-10088-6
-
-   We find the fail state for each state in the trie, this state is the longest
-   proper suffix of the current state's 'word' that is also a proper prefix of
-   another word in our trie. State 1 represents the word '' and is thus the
-   default fail state. This allows the DFA not to have to restart after its
-   tried and failed a word at a given point, it simply continues as though it
-   had been matching the other word in the first place.
-   Consider
-      'abcdgu'=~/abcdefg|cdgu/
-   When we get to 'd' we are still matching the first word, we would encounter
-   'g' which would fail, which would bring us to the state representing 'd' in
-   the second word where we would try 'g' and succeed, proceeding to match
-   'cdgu'.
- */
- /* add a fail transition */
-    const U32 trie_offset = ARG(source);
-    reg_trie_data *trie=(reg_trie_data *)RExC_rxi->data->data[trie_offset];
-    U32 *q;
-    const U32 ucharcount = trie->uniquecharcount;
-    const U32 numstates = trie->statecount;
-    const U32 ubound = trie->lasttrans + ucharcount;
-    U32 q_read = 0;
-    U32 q_write = 0;
-    U32 charid;
-    U32 base = trie->states[ 1 ].trans.base;
-    U32 *fail;
-    reg_ac_data *aho;
-    const U32 data_slot = add_data( pRExC_state, STR_WITH_LEN("T"));
-    regnode *stclass;
-    DECLARE_AND_GET_RE_DEBUG_FLAGS;
-
-    PERL_ARGS_ASSERT_CONSTRUCT_AHOCORASICK_FROM_TRIE;
-    PERL_UNUSED_CONTEXT;
-#ifndef DEBUGGING
-    PERL_UNUSED_ARG(depth);
-#endif
+        assert(SvROK(qr_ref));
+        qr = SvRV(qr_ref);
+        assert(SvTYPE(qr) == SVt_REGEXP && RX_ENGINE((REGEXP*)qr)->op_comp);
+        /* the leaving below frees the tmp qr_ref.
+         * Give qr a life of its own */
+        SvREFCNT_inc(qr);
+        POPSTACK;
+        FREETMPS;
+        LEAVE;
 
-    if ( OP(source) == TRIE ) {
-        struct regnode_1 *op = (struct regnode_1 *)
-            PerlMemShared_calloc(1, sizeof(struct regnode_1));
-        StructCopy(source, op, struct regnode_1);
-        stclass = (regnode *)op;
-    } else {
-        struct regnode_charclass *op = (struct regnode_charclass *)
-            PerlMemShared_calloc(1, sizeof(struct regnode_charclass));
-        StructCopy(source, op, struct regnode_charclass);
-        stclass = (regnode *)op;
-    }
-    OP(stclass)+=2; /* convert the TRIE type to its AHO-CORASICK equivalent */
-
-    ARG_SET( stclass, data_slot );
-    aho = (reg_ac_data *) PerlMemShared_calloc( 1, sizeof(reg_ac_data) );
-    RExC_rxi->data->data[ data_slot ] = (void*)aho;
-    aho->trie=trie_offset;
-    aho->states=(reg_trie_state *)PerlMemShared_malloc( numstates * sizeof(reg_trie_state) );
-    Copy( trie->states, aho->states, numstates, reg_trie_state );
-    Newx( q, numstates, U32);
-    aho->fail = (U32 *) PerlMemShared_calloc( numstates, sizeof(U32) );
-    aho->refcount = 1;
-    fail = aho->fail;
-    /* initialize fail[0..1] to be 1 so that we always have
-       a valid final fail state */
-    fail[ 0 ] = fail[ 1 ] = 1;
-
-    for ( charid = 0; charid < ucharcount ; charid++ ) {
-        const U32 newstate = TRIE_TRANS_STATE( 1, base, ucharcount, charid, 0 );
-        if ( newstate ) {
-            q[ q_write ] = newstate;
-            /* set to point at the root */
-            fail[ q[ q_write++ ] ]=1;
-        }
     }
-    while ( q_read < q_write) {
-        const U32 cur = q[ q_read++ % numstates ];
-        base = trie->states[ cur ].trans.base;
-
-        for ( charid = 0 ; charid < ucharcount ; charid++ ) {
-            const U32 ch_state = TRIE_TRANS_STATE( cur, base, ucharcount, charid, 1 );
-            if (ch_state) {
-                U32 fail_state = cur;
-                U32 fail_base;
-                do {
-                    fail_state = fail[ fail_state ];
-                    fail_base = aho->states[ fail_state ].trans.base;
-                } while ( !TRIE_TRANS_STATE( fail_state, fail_base, ucharcount, charid, 1 ) );
 
-                fail_state = TRIE_TRANS_STATE( fail_state, fail_base, ucharcount, charid, 1 );
-                fail[ ch_state ] = fail_state;
-                if ( !aho->states[ ch_state ].wordnum && aho->states[ fail_state ].wordnum )
-                {
-                        aho->states[ ch_state ].wordnum =  aho->states[ fail_state ].wordnum;
-                }
-                q[ q_write++ % numstates] = ch_state;
-            }
-        }
-    }
-    /* restore fail[0..1] to 0 so that we "fall out" of the AC loop
-       when we fail in state 1, this allows us to use the
-       charclass scan to find a valid start char. This is based on the principle
-       that theres a good chance the string being searched contains lots of stuff
-       that cant be a start char.
-     */
-    fail[ 0 ] = fail[ 1 ] = 0;
-    DEBUG_TRIE_COMPILE_r({
-        Perl_re_indentf( aTHX_  "Stclass Failtable (%" UVuf " states): 0",
-                      depth, (UV)numstates
-        );
-        for( q_read=1; q_read<numstates; q_read++ ) {
-            Perl_re_printf( aTHX_  ", %" UVuf, (UV)fail[q_read]);
-        }
-        Perl_re_printf( aTHX_  "\n");
-    });
-    Safefree(q);
-    /*RExC_seen |= REG_TRIEDFA_SEEN;*/
-    return stclass;
-}
-
-
-/* The below joins as many adjacent EXACTish nodes as possible into a single
- * one.  The regop may be changed if the node(s) contain certain sequences that
- * require special handling.  The joining is only done if:
- * 1) there is room in the current conglomerated node to entirely contain the
- *    next one.
- * 2) they are compatible node types
- *
- * The adjacent nodes actually may be separated by NOTHING-kind nodes, and
- * these get optimized out
- *
- * XXX khw thinks this should be enhanced to fill EXACT (at least) nodes as full
- * as possible, even if that means splitting an existing node so that its first
- * part is moved to the preceding node.  This would maximise the efficiency of
- * memEQ during matching.
- *
- * If a node is to match under /i (folded), the number of characters it matches
- * can be different than its character length if it contains a multi-character
- * fold.  *min_subtract is set to the total delta number of characters of the
- * input nodes.
- *
- * And *unfolded_multi_char is set to indicate whether or not the node contains
- * an unfolded multi-char fold.  This happens when it won't be known until
- * runtime whether the fold is valid or not; namely
- *  1) for EXACTF nodes that contain LATIN SMALL LETTER SHARP S, as only if the
- *      target string being matched against turns out to be UTF-8 is that fold
- *      valid; or
- *  2) for EXACTFL nodes whose folding rules depend on the locale in force at
- *      runtime.
- * (Multi-char folds whose components are all above the Latin1 range are not
- * run-time locale dependent, and have already been folded by the time this
- * function is called.)
- *
- * This is as good a place as any to discuss the design of handling these
- * multi-character fold sequences.  It's been wrong in Perl for a very long
- * time.  There are three code points in Unicode whose multi-character folds
- * were long ago discovered to mess things up.  The previous designs for
- * dealing with these involved assigning a special node for them.  This
- * approach doesn't always work, as evidenced by this example:
- *      "\xDFs" =~ /s\xDF/ui    # Used to fail before these patches
- * Both sides fold to "sss", but if the pattern is parsed to create a node that
- * would match just the \xDF, it won't be able to handle the case where a
- * successful match would have to cross the node's boundary.  The new approach
- * that hopefully generally solves the problem generates an EXACTFUP node
- * that is "sss" in this case.
- *
- * It turns out that there are problems with all multi-character folds, and not
- * just these three.  Now the code is general, for all such cases.  The
- * approach taken is:
- * 1)   This routine examines each EXACTFish node that could contain multi-
- *      character folded sequences.  Since a single character can fold into
- *      such a sequence, the minimum match length for this node is less than
- *      the number of characters in the node.  This routine returns in
- *      *min_subtract how many characters to subtract from the actual
- *      length of the string to get a real minimum match length; it is 0 if
- *      there are no multi-char foldeds.  This delta is used by the caller to
- *      adjust the min length of the match, and the delta between min and max,
- *      so that the optimizer doesn't reject these possibilities based on size
- *      constraints.
- *
- * 2)   For the sequence involving the LATIN SMALL LETTER SHARP S (U+00DF)
- *      under /u, we fold it to 'ss' in regatom(), and in this routine, after
- *      joining, we scan for occurrences of the sequence 'ss' in non-UTF-8
- *      EXACTFU nodes.  The node type of such nodes is then changed to
- *      EXACTFUP, indicating it is problematic, and needs careful handling.
- *      (The procedures in step 1) above are sufficient to handle this case in
- *      UTF-8 encoded nodes.)  The reason this is problematic is that this is
- *      the only case where there is a possible fold length change in non-UTF-8
- *      patterns.  By reserving a special node type for problematic cases, the
- *      far more common regular EXACTFU nodes can be processed faster.
- *      regexec.c takes advantage of this.
- *
- *      EXACTFUP has been created as a grab-bag for (hopefully uncommon)
- *      problematic cases.   These all only occur when the pattern is not
- *      UTF-8.  In addition to the 'ss' sequence where there is a possible fold
- *      length change, it handles the situation where the string cannot be
- *      entirely folded.  The strings in an EXACTFish node are folded as much
- *      as possible during compilation in regcomp.c.  This saves effort in
- *      regex matching.  By using an EXACTFUP node when it is not possible to
- *      fully fold at compile time, regexec.c can know that everything in an
- *      EXACTFU node is folded, so folding can be skipped at runtime.  The only
- *      case where folding in EXACTFU nodes can't be done at compile time is
- *      the presumably uncommon MICRO SIGN, when the pattern isn't UTF-8.  This
- *      is because its fold requires UTF-8 to represent.  Thus EXACTFUP nodes
- *      handle two very different cases.  Alternatively, there could have been
- *      a node type where there are length changes, one for unfolded, and one
- *      for both.  If yet another special case needed to be created, the number
- *      of required node types would have to go to 7.  khw figures that even
- *      though there are plenty of node types to spare, that the maintenance
- *      cost wasn't worth the small speedup of doing it that way, especially
- *      since he thinks the MICRO SIGN is rarely encountered in practice.
- *
- *      There are other cases where folding isn't done at compile time, but
- *      none of them are under /u, and hence not for EXACTFU nodes.  The folds
- *      in EXACTFL nodes aren't known until runtime, and vary as the locale
- *      changes.  Some folds in EXACTF depend on if the runtime target string
- *      is UTF-8 or not.  (regatom() will create an EXACTFU node even under /di
- *      when no fold in it depends on the UTF-8ness of the target string.)
- *
- * 3)   A problem remains for unfolded multi-char folds. (These occur when the
- *      validity of the fold won't be known until runtime, and so must remain
- *      unfolded for now.  This happens for the sharp s in EXACTF and EXACTFAA
- *      nodes when the pattern isn't in UTF-8.  (Note, BTW, that there cannot
- *      be an EXACTF node with a UTF-8 pattern.)  They also occur for various
- *      folds in EXACTFL nodes, regardless of the UTF-ness of the pattern.)
- *      The reason this is a problem is that the optimizer part of regexec.c
- *      (probably unwittingly, in Perl_regexec_flags()) makes an assumption
- *      that a character in the pattern corresponds to at most a single
- *      character in the target string.  (And I do mean character, and not byte
- *      here, unlike other parts of the documentation that have never been
- *      updated to account for multibyte Unicode.)  Sharp s in EXACTF and
- *      EXACTFL nodes can match the two character string 'ss'; in EXACTFAA
- *      nodes it can match "\x{17F}\x{17F}".  These, along with other ones in
- *      EXACTFL nodes, violate the assumption, and they are the only instances
- *      where it is violated.  I'm reluctant to try to change the assumption,
- *      as the code involved is impenetrable to me (khw), so instead the code
- *      here punts.  This routine examines EXACTFL nodes, and (when the pattern
- *      isn't UTF-8) EXACTF and EXACTFAA for such unfolded folds, and returns a
- *      boolean indicating whether or not the node contains such a fold.  When
- *      it is true, the caller sets a flag that later causes the optimizer in
- *      this file to not set values for the floating and fixed string lengths,
- *      and thus avoids the optimizer code in regexec.c that makes the invalid
- *      assumption.  Thus, there is no optimization based on string lengths for
- *      EXACTFL nodes that contain these few folds, nor for non-UTF8-pattern
- *      EXACTF and EXACTFAA nodes that contain the sharp s.  (The reason the
- *      assumption is wrong only in these cases is that all other non-UTF-8
- *      folds are 1-1; and, for UTF-8 patterns, we pre-fold all other folds to
- *      their expanded versions.  (Again, we can't prefold sharp s to 'ss' in
- *      EXACTF nodes because we don't know at compile time if it actually
- *      matches 'ss' or not.  For EXACTF nodes it will match iff the target
- *      string is in UTF-8.  This is in contrast to EXACTFU nodes, where it
- *      always matches; and EXACTFAA where it never does.  In an EXACTFAA node
- *      in a UTF-8 pattern, sharp s is folded to "\x{17F}\x{17F}, avoiding the
- *      problem; but in a non-UTF8 pattern, folding it to that above-Latin1
- *      string would require the pattern to be forced into UTF-8, the overhead
- *      of which we want to avoid.  Similarly the unfolded multi-char folds in
- *      EXACTFL nodes will match iff the locale at the time of match is a UTF-8
- *      locale.)
- *
- *      Similarly, the code that generates tries doesn't currently handle
- *      not-already-folded multi-char folds, and it looks like a pain to change
- *      that.  Therefore, trie generation of EXACTFAA nodes with the sharp s
- *      doesn't work.  Instead, such an EXACTFAA is turned into a new regnode,
- *      EXACTFAA_NO_TRIE, which the trie code knows not to handle.  Most people
- *      using /iaa matching will be doing so almost entirely with ASCII
- *      strings, so this should rarely be encountered in practice */
-
-STATIC U32
-S_join_exact(pTHX_ RExC_state_t *pRExC_state, regnode *scan,
-                   UV *min_subtract, bool *unfolded_multi_char,
-                   U32 flags, regnode *val, U32 depth)
-{
-    /* Merge several consecutive EXACTish nodes into one. */
-
-    regnode *n = regnext(scan);
-    U32 stringok = 1;
-    regnode *next = scan + NODE_SZ_STR(scan);
-    U32 merged = 0;
-    U32 stopnow = 0;
-#ifdef DEBUGGING
-    regnode *stop = scan;
-    DECLARE_AND_GET_RE_DEBUG_FLAGS;
-#else
-    PERL_UNUSED_ARG(depth);
-#endif
-
-    PERL_ARGS_ASSERT_JOIN_EXACT;
-#ifndef EXPERIMENTAL_INPLACESCAN
-    PERL_UNUSED_ARG(flags);
-    PERL_UNUSED_ARG(val);
-#endif
-    DEBUG_PEEP("join", scan, depth, 0);
-
-    assert(PL_regkind[OP(scan)] == EXACT);
-
-    /* Look through the subsequent nodes in the chain.  Skip NOTHING, merge
-     * EXACT ones that are mergeable to the current one. */
-    while (    n
-           && (    PL_regkind[OP(n)] == NOTHING
-               || (stringok && PL_regkind[OP(n)] == EXACT))
-           && NEXT_OFF(n)
-           && NEXT_OFF(scan) + NEXT_OFF(n) < I16_MAX)
-    {
-
-        if (OP(n) == TAIL || n > next)
-            stringok = 0;
-        if (PL_regkind[OP(n)] == NOTHING) {
-            DEBUG_PEEP("skip:", n, depth, 0);
-            NEXT_OFF(scan) += NEXT_OFF(n);
-            next = n + NODE_STEP_REGNODE;
-#ifdef DEBUGGING
-            if (stringok)
-                stop = n;
-#endif
-            n = regnext(n);
-        }
-        else if (stringok) {
-            const unsigned int oldl = STR_LEN(scan);
-            regnode * const nnext = regnext(n);
-
-            /* XXX I (khw) kind of doubt that this works on platforms (should
-             * Perl ever run on one) where U8_MAX is above 255 because of lots
-             * of other assumptions */
-            /* Don't join if the sum can't fit into a single node */
-            if (oldl + STR_LEN(n) > U8_MAX)
-                break;
-
-            /* Joining something that requires UTF-8 with something that
-             * doesn't, means the result requires UTF-8. */
-            if (OP(scan) == EXACT && (OP(n) == EXACT_REQ8)) {
-                OP(scan) = EXACT_REQ8;
-            }
-            else if (OP(scan) == EXACT_REQ8 && (OP(n) == EXACT)) {
-                ;   /* join is compatible, no need to change OP */
-            }
-            else if ((OP(scan) == EXACTFU) && (OP(n) == EXACTFU_REQ8)) {
-                OP(scan) = EXACTFU_REQ8;
-            }
-            else if ((OP(scan) == EXACTFU_REQ8) && (OP(n) == EXACTFU)) {
-                ;   /* join is compatible, no need to change OP */
-            }
-            else if (OP(scan) == EXACTFU && OP(n) == EXACTFU) {
-                ;   /* join is compatible, no need to change OP */
-            }
-            else if (OP(scan) == EXACTFU && OP(n) == EXACTFU_S_EDGE) {
-
-                 /* Under /di, temporary EXACTFU_S_EDGE nodes are generated,
-                  * which can join with EXACTFU ones.  We check for this case
-                  * here.  These need to be resolved to either EXACTFU or
-                  * EXACTF at joining time.  They have nothing in them that
-                  * would forbid them from being the more desirable EXACTFU
-                  * nodes except that they begin and/or end with a single [Ss].
-                  * The reason this is problematic is because they could be
-                  * joined in this loop with an adjacent node that ends and/or
-                  * begins with [Ss] which would then form the sequence 'ss',
-                  * which matches differently under /di than /ui, in which case
-                  * EXACTFU can't be used.  If the 'ss' sequence doesn't get
-                  * formed, the nodes get absorbed into any adjacent EXACTFU
-                  * node.  And if the only adjacent node is EXACTF, they get
-                  * absorbed into that, under the theory that a longer node is
-                  * better than two shorter ones, even if one is EXACTFU.  Note
-                  * that EXACTFU_REQ8 is generated only for UTF-8 patterns,
-                  * and the EXACTFU_S_EDGE ones only for non-UTF-8.  */
-
-                if (STRING(n)[STR_LEN(n)-1] == 's') {
-
-                    /* Here the joined node would end with 's'.  If the node
-                     * following the combination is an EXACTF one, it's better to
-                     * join this trailing edge 's' node with that one, leaving the
-                     * current one in 'scan' be the more desirable EXACTFU */
-                    if (OP(nnext) == EXACTF) {
-                        break;
-                    }
-
-                    OP(scan) = EXACTFU_S_EDGE;
-
-                }   /* Otherwise, the beginning 's' of the 2nd node just
-                       becomes an interior 's' in 'scan' */
-            }
-            else if (OP(scan) == EXACTF && OP(n) == EXACTF) {
-                ;   /* join is compatible, no need to change OP */
-            }
-            else if (OP(scan) == EXACTF && OP(n) == EXACTFU_S_EDGE) {
-
-                /* EXACTF nodes are compatible for joining with EXACTFU_S_EDGE
-                 * nodes.  But the latter nodes can be also joined with EXACTFU
-                 * ones, and that is a better outcome, so if the node following
-                 * 'n' is EXACTFU, quit now so that those two can be joined
-                 * later */
-                if (OP(nnext) == EXACTFU) {
-                    break;
-                }
-
-                /* The join is compatible, and the combined node will be
-                 * EXACTF.  (These don't care if they begin or end with 's' */
-            }
-            else if (OP(scan) == EXACTFU_S_EDGE && OP(n) == EXACTFU_S_EDGE) {
-                if (   STRING(scan)[STR_LEN(scan)-1] == 's'
-                    && STRING(n)[0] == 's')
-                {
-                    /* When combined, we have the sequence 'ss', which means we
-                     * have to remain /di */
-                    OP(scan) = EXACTF;
-                }
-            }
-            else if (OP(scan) == EXACTFU_S_EDGE && OP(n) == EXACTFU) {
-                if (STRING(n)[0] == 's') {
-                    ;   /* Here the join is compatible and the combined node
-                           starts with 's', no need to change OP */
-                }
-                else {  /* Now the trailing 's' is in the interior */
-                    OP(scan) = EXACTFU;
-                }
-            }
-            else if (OP(scan) == EXACTFU_S_EDGE && OP(n) == EXACTF) {
-
-                /* The join is compatible, and the combined node will be
-                 * EXACTF.  (These don't care if they begin or end with 's' */
-                OP(scan) = EXACTF;
-            }
-            else if (OP(scan) != OP(n)) {
-
-                /* The only other compatible joinings are the same node type */
-                break;
-            }
-
-            DEBUG_PEEP("merg", n, depth, 0);
-            merged++;
-
-            NEXT_OFF(scan) += NEXT_OFF(n);
-            assert( ( STR_LEN(scan) + STR_LEN(n) ) < 256 );
-            setSTR_LEN(scan, (U8)(STR_LEN(scan) + STR_LEN(n)));
-            next = n + NODE_SZ_STR(n);
-            /* Now we can overwrite *n : */
-            Move(STRING(n), STRING(scan) + oldl, STR_LEN(n), char);
-#ifdef DEBUGGING
-            stop = next - 1;
-#endif
-            n = nnext;
-            if (stopnow) break;
-        }
-
-#ifdef EXPERIMENTAL_INPLACESCAN
-        if (flags && !NEXT_OFF(n)) {
-            DEBUG_PEEP("atch", val, depth, 0);
-            if (reg_off_by_arg[OP(n)]) {
-                ARG_SET(n, val - n);
-            }
-            else {
-                NEXT_OFF(n) = val - n;
-            }
-            stopnow = 1;
-        }
-#endif
-    }
-
-    /* This temporary node can now be turned into EXACTFU, and must, as
-     * regexec.c doesn't handle it */
-    if (OP(scan) == EXACTFU_S_EDGE) {
-        OP(scan) = EXACTFU;
-    }
-
-    *min_subtract = 0;
-    *unfolded_multi_char = FALSE;
-
-    /* Here, all the adjacent mergeable EXACTish nodes have been merged.  We
-     * can now analyze for sequences of problematic code points.  (Prior to
-     * this final joining, sequences could have been split over boundaries, and
-     * hence missed).  The sequences only happen in folding, hence for any
-     * non-EXACT EXACTish node */
-    if (OP(scan) != EXACT && OP(scan) != EXACT_REQ8 && OP(scan) != EXACTL) {
-        U8* s0 = (U8*) STRING(scan);
-        U8* s = s0;
-        U8* s_end = s0 + STR_LEN(scan);
-
-        int total_count_delta = 0;  /* Total delta number of characters that
-                                       multi-char folds expand to */
-
-        /* One pass is made over the node's string looking for all the
-         * possibilities.  To avoid some tests in the loop, there are two main
-         * cases, for UTF-8 patterns (which can't have EXACTF nodes) and
-         * non-UTF-8 */
-        if (UTF) {
-            U8* folded = NULL;
-
-            if (OP(scan) == EXACTFL) {
-                U8 *d;
-
-                /* An EXACTFL node would already have been changed to another
-                 * node type unless there is at least one character in it that
-                 * is problematic; likely a character whose fold definition
-                 * won't be known until runtime, and so has yet to be folded.
-                 * For all but the UTF-8 locale, folds are 1-1 in length, but
-                 * to handle the UTF-8 case, we need to create a temporary
-                 * folded copy using UTF-8 locale rules in order to analyze it.
-                 * This is because our macros that look to see if a sequence is
-                 * a multi-char fold assume everything is folded (otherwise the
-                 * tests in those macros would be too complicated and slow).
-                 * Note that here, the non-problematic folds will have already
-                 * been done, so we can just copy such characters.  We actually
-                 * don't completely fold the EXACTFL string.  We skip the
-                 * unfolded multi-char folds, as that would just create work
-                 * below to figure out the size they already are */
-
-                Newx(folded, UTF8_MAX_FOLD_CHAR_EXPAND * STR_LEN(scan) + 1, U8);
-                d = folded;
-                while (s < s_end) {
-                    STRLEN s_len = UTF8SKIP(s);
-                    if (! is_PROBLEMATIC_LOCALE_FOLD_utf8(s)) {
-                        Copy(s, d, s_len, U8);
-                        d += s_len;
-                    }
-                    else if (is_FOLDS_TO_MULTI_utf8(s)) {
-                        *unfolded_multi_char = TRUE;
-                        Copy(s, d, s_len, U8);
-                        d += s_len;
-                    }
-                    else if (isASCII(*s)) {
-                        *(d++) = toFOLD(*s);
-                    }
-                    else {
-                        STRLEN len;
-                        _toFOLD_utf8_flags(s, s_end, d, &len, FOLD_FLAGS_FULL);
-                        d += len;
-                    }
-                    s += s_len;
-                }
-
-                /* Point the remainder of the routine to look at our temporary
-                 * folded copy */
-                s = folded;
-                s_end = d;
-            } /* End of creating folded copy of EXACTFL string */
-
-            /* Examine the string for a multi-character fold sequence.  UTF-8
-             * patterns have all characters pre-folded by the time this code is
-             * executed */
-            while (s < s_end - 1) /* Can stop 1 before the end, as minimum
-                                     length sequence we are looking for is 2 */
-            {
-                int count = 0;  /* How many characters in a multi-char fold */
-                int len = is_MULTI_CHAR_FOLD_utf8_safe(s, s_end);
-                if (! len) {    /* Not a multi-char fold: get next char */
-                    s += UTF8SKIP(s);
-                    continue;
-                }
-
-                { /* Here is a generic multi-char fold. */
-                    U8* multi_end  = s + len;
-
-                    /* Count how many characters are in it.  In the case of
-                     * /aa, no folds which contain ASCII code points are
-                     * allowed, so check for those, and skip if found. */
-                    if (OP(scan) != EXACTFAA && OP(scan) != EXACTFAA_NO_TRIE) {
-                        count = utf8_length(s, multi_end);
-                        s = multi_end;
-                    }
-                    else {
-                        while (s < multi_end) {
-                            if (isASCII(*s)) {
-                                s++;
-                                goto next_iteration;
-                            }
-                            else {
-                                s += UTF8SKIP(s);
-                            }
-                            count++;
-                        }
-                    }
-                }
-
-                /* The delta is how long the sequence is minus 1 (1 is how long
-                 * the character that folds to the sequence is) */
-                total_count_delta += count - 1;
-              next_iteration: ;
-            }
-
-            /* We created a temporary folded copy of the string in EXACTFL
-             * nodes.  Therefore we need to be sure it doesn't go below zero,
-             * as the real string could be shorter */
-            if (OP(scan) == EXACTFL) {
-                int total_chars = utf8_length((U8*) STRING(scan),
-                                           (U8*) STRING(scan) + STR_LEN(scan));
-                if (total_count_delta > total_chars) {
-                    total_count_delta = total_chars;
-                }
-            }
-
-            *min_subtract += total_count_delta;
-            Safefree(folded);
-        }
-        else if (OP(scan) == EXACTFAA) {
-
-            /* Non-UTF-8 pattern, EXACTFAA node.  There can't be a multi-char
-             * fold to the ASCII range (and there are no existing ones in the
-             * upper latin1 range).  But, as outlined in the comments preceding
-             * this function, we need to flag any occurrences of the sharp s.
-             * This character forbids trie formation (because of added
-             * complexity) */
-#if    UNICODE_MAJOR_VERSION > 3 /* no multifolds in early Unicode */   \
-   || (UNICODE_MAJOR_VERSION == 3 && (   UNICODE_DOT_VERSION > 0)       \
-                                      || UNICODE_DOT_DOT_VERSION > 0)
-            while (s < s_end) {
-                if (*s == LATIN_SMALL_LETTER_SHARP_S) {
-                    OP(scan) = EXACTFAA_NO_TRIE;
-                    *unfolded_multi_char = TRUE;
-                    break;
-                }
-                s++;
-            }
-        }
-        else if (OP(scan) != EXACTFAA_NO_TRIE) {
-
-            /* Non-UTF-8 pattern, not EXACTFAA node.  Look for the multi-char
-             * folds that are all Latin1.  As explained in the comments
-             * preceding this function, we look also for the sharp s in EXACTF
-             * and EXACTFL nodes; it can be in the final position.  Otherwise
-             * we can stop looking 1 byte earlier because have to find at least
-             * two characters for a multi-fold */
-            const U8* upper = (OP(scan) == EXACTF || OP(scan) == EXACTFL)
-                              ? s_end
-                              : s_end -1;
-
-            while (s < upper) {
-                int len = is_MULTI_CHAR_FOLD_latin1_safe(s, s_end);
-                if (! len) {    /* Not a multi-char fold. */
-                    if (*s == LATIN_SMALL_LETTER_SHARP_S
-                        && (OP(scan) == EXACTF || OP(scan) == EXACTFL))
-                    {
-                        *unfolded_multi_char = TRUE;
-                    }
-                    s++;
-                    continue;
-                }
-
-                if (len == 2
-                    && isALPHA_FOLD_EQ(*s, 's')
-                    && isALPHA_FOLD_EQ(*(s+1), 's'))
-                {
-
-                    /* EXACTF nodes need to know that the minimum length
-                     * changed so that a sharp s in the string can match this
-                     * ss in the pattern, but they remain EXACTF nodes, as they
-                     * won't match this unless the target string is in UTF-8,
-                     * which we don't know until runtime.  EXACTFL nodes can't
-                     * transform into EXACTFU nodes */
-                    if (OP(scan) != EXACTF && OP(scan) != EXACTFL) {
-                        OP(scan) = EXACTFUP;
-                    }
-                }
-
-                *min_subtract += len - 1;
-                s += len;
-            }
-#endif
-        }
-    }
-
-#ifdef DEBUGGING
-    /* Allow dumping but overwriting the collection of skipped
-     * ops and/or strings with fake optimized ops */
-    n = scan + NODE_SZ_STR(scan);
-    while (n <= stop) {
-        OP(n) = OPTIMIZED;
-        FLAGS(n) = 0;
-        NEXT_OFF(n) = 0;
-        n++;
-    }
-#endif
-    DEBUG_OPTIMISE_r(if (merged){DEBUG_PEEP("finl", scan, depth, 0);});
-    return stopnow;
-}
-
-/* REx optimizer.  Converts nodes into quicker variants "in place".
-   Finds fixed substrings.  */
-
-/* Stops at toplevel WHILEM as well as at "last". At end *scanp is set
-   to the position after last scanned or to NULL. */
-
-#define INIT_AND_WITHP \
-    assert(!and_withp); \
-    Newx(and_withp, 1, regnode_ssc); \
-    SAVEFREEPV(and_withp)
-
-
-static void
-S_unwind_scan_frames(pTHX_ const void *p)
-{
-    scan_frame *f= (scan_frame *)p;
-    do {
-        scan_frame *n= f->next_frame;
-        Safefree(f);
-        f= n;
-    } while (f);
-}
-
-/* Follow the next-chain of the current node and optimize away
-   all the NOTHINGs from it.
- */
-STATIC void
-S_rck_elide_nothing(pTHX_ regnode *node)
-{
-    PERL_ARGS_ASSERT_RCK_ELIDE_NOTHING;
-
-    if (OP(node) != CURLYX) {
-        const int max = (reg_off_by_arg[OP(node)]
-                        ? I32_MAX
-                          /* I32 may be smaller than U16 on CRAYs! */
-                        : (I32_MAX < U16_MAX ? I32_MAX : U16_MAX));
-        int off = (reg_off_by_arg[OP(node)] ? ARG(node) : NEXT_OFF(node));
-        int noff;
-        regnode *n = node;
-
-        /* Skip NOTHING and LONGJMP. */
-        while (
-            (n = regnext(n))
-            && (
-                (PL_regkind[OP(n)] == NOTHING && (noff = NEXT_OFF(n)))
-                || ((OP(n) == LONGJMP) && (noff = ARG(n)))
-            )
-            && off + noff < max
-        ) {
-            off += noff;
-        }
-        if (reg_off_by_arg[OP(node)])
-            ARG(node) = off;
-        else
-            NEXT_OFF(node) = off;
-    }
-    return;
-}
-
-/* the return from this sub is the minimum length that could possibly match */
-STATIC SSize_t
-S_study_chunk(pTHX_
-    RExC_state_t *pRExC_state,
-    regnode **scanp,        /* Start here (read-write). */
-    SSize_t *minlenp,       /* used for the minlen of substrings? */
-    SSize_t *deltap,        /* Write maxlen-minlen here. */
-    regnode *last,          /* Stop before this one. */
-    scan_data_t *data,      /* string data about the pattern */
-    I32 stopparen,          /* treat CLOSE-N as END, see GOSUB */
-    U32 recursed_depth,     /* how deep have we recursed via GOSUB */
-    regnode_ssc *and_withp, /* Valid if flags & SCF_DO_STCLASS_OR */
-    U32 flags,              /* flags controlling this call, see SCF_ flags */
-    U32 depth,              /* how deep have we recursed period */
-    bool was_mutate_ok      /* TRUE if in-place optimizations are allowed.
-                               FALSE only if the caller (recursively) was
-                               prohibited from modifying the regops, because
-                               a higher caller is holding a ptr to them. */
-)
-{
-    /* vars about the regnodes we are working with */
-    regnode *scan = *scanp; /* the current opcode we are inspecting */
-    regnode *next = NULL;   /* the next opcode beyond scan, tmp var */
-    regnode *first_non_open = scan; /* FIXME: should this init to NULL?
-                                       the first non open regop, if the init
-                                       val IS an OPEN then we will skip past
-                                       it just after the var decls section */
-    I32 code = 0;           /* temp var used to hold the optype of a regop */
-
-    /* vars about the min and max length of the pattern */
-    SSize_t min = 0;    /* min length of this part of the pattern */
-    SSize_t stopmin = OPTIMIZE_INFTY; /* min length accounting for ACCEPT
-                                         this is adjusted down if we find
-                                         an ACCEPT */
-    SSize_t delta = 0;  /* difference between min and max length
-                           (not accounting for stopmin) */
-
-    /* vars about capture buffers in the pattern */
-    I32 pars = 0;       /* count of OPEN opcodes */
-    I32 is_par = OP(scan) == OPEN ? ARG(scan) : 0; /* is this op an OPEN? */
-
-    /* vars about whether this pattern contains something that can match
-     * infinitely long strings, eg, X* or X+ */
-    int is_inf = (flags & SCF_DO_SUBSTR) && (data->flags & SF_IS_INF);
-    int is_inf_internal = 0;           /* The studied chunk is infinite */
-
-    /* scan_data_t (struct) is used to hold information about the substrings
-     * and start class we have extracted from the string */
-    scan_data_t data_fake; /* temp var used for recursing in some cases */
-
-    SV *re_trie_maxbuff = NULL; /* temp var used to hold whether we can do
-                                   trie optimizations */
-
-    scan_frame *frame = NULL;  /* used as part of fake recursion */
-
-    DECLARE_AND_GET_RE_DEBUG_FLAGS;
-
-    PERL_ARGS_ASSERT_STUDY_CHUNK;
-    RExC_study_started= 1;
-
-    Zero(&data_fake, 1, scan_data_t);
-
-    if ( depth == 0 ) {
-        while (first_non_open && OP(first_non_open) == OPEN)
-            first_non_open=regnext(first_non_open);
-    }
-
-  fake_study_recurse:
-    DEBUG_r(
-        RExC_study_chunk_recursed_count++;
-    );
-    DEBUG_OPTIMISE_MORE_r(
-    {
-        Perl_re_indentf( aTHX_  "study_chunk stopparen=%ld recursed_count=%lu depth=%lu recursed_depth=%lu scan=%p last=%p",
-            depth, (long)stopparen,
-            (unsigned long)RExC_study_chunk_recursed_count,
-            (unsigned long)depth, (unsigned long)recursed_depth,
-            scan,
-            last);
-        if (recursed_depth) {
-            U32 i;
-            U32 j;
-            for ( j = 0 ; j < recursed_depth ; j++ ) {
-                for ( i = 0 ; i < (U32)RExC_total_parens ; i++ ) {
-                    if (PAREN_TEST(j, i) && (!j || !PAREN_TEST(j - 1, i))) {
-                        Perl_re_printf( aTHX_ " %d",(int)i);
-                        break;
-                    }
-                }
-                if ( j + 1 < recursed_depth ) {
-                    Perl_re_printf( aTHX_  ",");
-                }
-            }
-        }
-        Perl_re_printf( aTHX_ "\n");
-    }
-    );
-    while ( scan && OP(scan) != END && scan < last ){
-        UV min_subtract = 0;    /* How mmany chars to subtract from the minimum
-                                   node length to get a real minimum (because
-                                   the folded version may be shorter) */
-        bool unfolded_multi_char = FALSE;
-        /* avoid mutating ops if we are anywhere within the recursed or
-         * enframed handling for a GOSUB: the outermost level will handle it.
-         */
-        bool mutate_ok = was_mutate_ok && !(frame && frame->in_gosub);
-        /* Peephole optimizer: */
-        DEBUG_STUDYDATA("Peep", data, depth, is_inf, min, stopmin, delta);
-        DEBUG_PEEP("Peep", scan, depth, flags);
-
-
-        /* The reason we do this here is that we need to deal with things like
-         * /(?:f)(?:o)(?:o)/ which cant be dealt with by the normal EXACT
-         * parsing code, as each (?:..) is handled by a different invocation of
-         * reg() -- Yves
-         */
-        if (PL_regkind[OP(scan)] == EXACT
-            && OP(scan) != LEXACT
-            && OP(scan) != LEXACT_REQ8
-            && mutate_ok
-        ) {
-            join_exact(pRExC_state, scan, &min_subtract, &unfolded_multi_char,
-                    0, NULL, depth + 1);
-        }
-
-        /* Follow the next-chain of the current node and optimize
-           away all the NOTHINGs from it.
-         */
-        rck_elide_nothing(scan);
-
-        /* The principal pseudo-switch.  Cannot be a switch, since we look into
-         * several different things.  */
-        if ( OP(scan) == DEFINEP ) {
-            SSize_t minlen = 0;
-            SSize_t deltanext = 0;
-            SSize_t fake_last_close = 0;
-            regnode *fake_last_close_op = NULL;
-            U32 f = SCF_IN_DEFINE | (flags & SCF_TRIE_DOING_RESTUDY);
-
-            StructCopy(&zero_scan_data, &data_fake, scan_data_t);
-            scan = regnext(scan);
-            assert( OP(scan) == IFTHEN );
-            DEBUG_PEEP("expect IFTHEN", scan, depth, flags);
-
-            data_fake.last_closep= &fake_last_close;
-            data_fake.last_close_opp= &fake_last_close_op;
-            minlen = *minlenp;
-            next = regnext(scan);
-            scan = NEXTOPER(NEXTOPER(scan));
-            DEBUG_PEEP("scan", scan, depth, flags);
-            DEBUG_PEEP("next", next, depth, flags);
-
-            /* we suppose the run is continuous, last=next...
-             * NOTE we dont use the return here! */
-            /* DEFINEP study_chunk() recursion */
-            (void)study_chunk(pRExC_state, &scan, &minlen,
-                              &deltanext, next, &data_fake, stopparen,
-                              recursed_depth, NULL, f, depth+1, mutate_ok);
-
-            scan = next;
-        } else
-        if (
-            OP(scan) == BRANCH  ||
-            OP(scan) == BRANCHJ ||
-            OP(scan) == IFTHEN
-        ) {
-            next = regnext(scan);
-            code = OP(scan);
-
-            /* The op(next)==code check below is to see if we
-             * have "BRANCH-BRANCH", "BRANCHJ-BRANCHJ", "IFTHEN-IFTHEN"
-             * IFTHEN is special as it might not appear in pairs.
-             * Not sure whether BRANCH-BRANCHJ is possible, regardless
-             * we dont handle it cleanly. */
-            if (OP(next) == code || code == IFTHEN) {
-                /* NOTE - There is similar code to this block below for
-                 * handling TRIE nodes on a re-study.  If you change stuff here
-                 * check there too. */
-                SSize_t max1 = 0, min1 = OPTIMIZE_INFTY, num = 0;
-                regnode_ssc accum;
-                regnode * const startbranch=scan;
-
-                if (flags & SCF_DO_SUBSTR) {
-                    /* Cannot merge strings after this. */
-                    scan_commit(pRExC_state, data, minlenp, is_inf);
-                }
-
-                if (flags & SCF_DO_STCLASS)
-                    ssc_init_zero(pRExC_state, &accum);
-
-                while (OP(scan) == code) {
-                    SSize_t deltanext, minnext, fake_last_close = 0;
-                    regnode *fake_last_close_op = NULL;
-                    U32 f = (flags & SCF_TRIE_DOING_RESTUDY);
-                    regnode_ssc this_class;
-
-                    DEBUG_PEEP("Branch", scan, depth, flags);
-
-                    num++;
-                    StructCopy(&zero_scan_data, &data_fake, scan_data_t);
-                    if (data) {
-                        data_fake.whilem_c = data->whilem_c;
-                        data_fake.last_closep = data->last_closep;
-                        data_fake.last_close_opp = data->last_close_opp;
-                    }
-                    else {
-                        data_fake.last_closep = &fake_last_close;
-                        data_fake.last_close_opp = &fake_last_close_op;
-                    }
-
-                    data_fake.pos_delta = delta;
-                    next = regnext(scan);
-
-                    scan = NEXTOPER(scan); /* everything */
-                    if (code != BRANCH)    /* everything but BRANCH */
-                        scan = NEXTOPER(scan);
-
-                    if (flags & SCF_DO_STCLASS) {
-                        ssc_init(pRExC_state, &this_class);
-                        data_fake.start_class = &this_class;
-                        f |= SCF_DO_STCLASS_AND;
-                    }
-                    if (flags & SCF_WHILEM_VISITED_POS)
-                        f |= SCF_WHILEM_VISITED_POS;
-
-                    /* we suppose the run is continuous, last=next...*/
-                    /* recurse study_chunk() for each BRANCH in an alternation */
-                    minnext = study_chunk(pRExC_state, &scan, minlenp,
-                                      &deltanext, next, &data_fake, stopparen,
-                                      recursed_depth, NULL, f, depth+1,
-                                      mutate_ok);
-
-                    if (min1 > minnext)
-                        min1 = minnext;
-                    if (deltanext == OPTIMIZE_INFTY) {
-                        is_inf = is_inf_internal = 1;
-                        max1 = OPTIMIZE_INFTY;
-                    } else if (max1 < minnext + deltanext)
-                        max1 = minnext + deltanext;
-                    scan = next;
-                    if (data_fake.flags & (SF_HAS_PAR|SF_IN_PAR))
-                        pars++;
-                    if (data_fake.flags & SCF_SEEN_ACCEPT) {
-                        if ( stopmin > minnext)
-                            stopmin = min + min1;
-                        flags &= ~SCF_DO_SUBSTR;
-                        if (data)
-                            data->flags |= SCF_SEEN_ACCEPT;
-                    }
-                    if (data) {
-                        if (data_fake.flags & SF_HAS_EVAL)
-                            data->flags |= SF_HAS_EVAL;
-                        data->whilem_c = data_fake.whilem_c;
-                    }
-                    if (flags & SCF_DO_STCLASS)
-                        ssc_or(pRExC_state, &accum, (regnode_charclass*)&this_class);
-                    DEBUG_STUDYDATA("end BRANCH", data, depth, is_inf, min, stopmin, delta);
-                }
-                if (code == IFTHEN && num < 2) /* Empty ELSE branch */
-                    min1 = 0;
-                if (flags & SCF_DO_SUBSTR) {
-                    data->pos_min += min1;
-                    if (data->pos_delta >= OPTIMIZE_INFTY - (max1 - min1))
-                        data->pos_delta = OPTIMIZE_INFTY;
-                    else
-                        data->pos_delta += max1 - min1;
-                    if (max1 != min1 || is_inf)
-                        data->cur_is_floating = 1;
-                }
-                min += min1;
-                if (delta == OPTIMIZE_INFTY
-                 || OPTIMIZE_INFTY - delta - (max1 - min1) < 0)
-                    delta = OPTIMIZE_INFTY;
-                else
-                    delta += max1 - min1;
-                if (flags & SCF_DO_STCLASS_OR) {
-                    ssc_or(pRExC_state, data->start_class, (regnode_charclass*) &accum);
-                    if (min1) {
-                        ssc_and(pRExC_state, data->start_class, (regnode_charclass *) and_withp);
-                        flags &= ~SCF_DO_STCLASS;
-                    }
-                }
-                else if (flags & SCF_DO_STCLASS_AND) {
-                    if (min1) {
-                        ssc_and(pRExC_state, data->start_class, (regnode_charclass *) &accum);
-                        flags &= ~SCF_DO_STCLASS;
-                    }
-                    else {
-                        /* Switch to OR mode: cache the old value of
-                         * data->start_class */
-                        INIT_AND_WITHP;
-                        StructCopy(data->start_class, and_withp, regnode_ssc);
-                        flags &= ~SCF_DO_STCLASS_AND;
-                        StructCopy(&accum, data->start_class, regnode_ssc);
-                        flags |= SCF_DO_STCLASS_OR;
-                    }
-                }
-                DEBUG_STUDYDATA("pre TRIE", data, depth, is_inf, min, stopmin, delta);
-
-                if (PERL_ENABLE_TRIE_OPTIMISATION
-                    && OP(startbranch) == BRANCH
-                    && mutate_ok
-                ) {
-                /* demq.
-
-                   Assuming this was/is a branch we are dealing with: 'scan'
-                   now points at the item that follows the branch sequence,
-                   whatever it is. We now start at the beginning of the
-                   sequence and look for subsequences of
-
-                   BRANCH->EXACT=>x1
-                   BRANCH->EXACT=>x2
-                   tail
-
-                   which would be constructed from a pattern like
-                   /A|LIST|OF|WORDS/
-
-                   If we can find such a subsequence we need to turn the first
-                   element into a trie and then add the subsequent branch exact
-                   strings to the trie.
-
-                   We have two cases
-
-                     1. patterns where the whole set of branches can be
-                        converted.
-
-                     2. patterns where only a subset can be converted.
-
-                   In case 1 we can replace the whole set with a single regop
-                   for the trie. In case 2 we need to keep the start and end
-                   branches so
-
-                     'BRANCH EXACT; BRANCH EXACT; BRANCH X'
-                     becomes BRANCH TRIE; BRANCH X;
-
-                  There is an additional case, that being where there is a
-                  common prefix, which gets split out into an EXACT like node
-                  preceding the TRIE node.
-
-                  If x(1..n)==tail then we can do a simple trie, if not we make
-                  a "jump" trie, such that when we match the appropriate word
-                  we "jump" to the appropriate tail node. Essentially we turn
-                  a nested if into a case structure of sorts.
-
-                */
-
-                    int made=0;
-                    if (!re_trie_maxbuff) {
-                        re_trie_maxbuff = get_sv(RE_TRIE_MAXBUF_NAME, 1);
-                        if (!SvIOK(re_trie_maxbuff))
-                            sv_setiv(re_trie_maxbuff, RE_TRIE_MAXBUF_INIT);
-                    }
-                    if ( SvIV(re_trie_maxbuff)>=0  ) {
-                        regnode *cur;
-                        regnode *first = (regnode *)NULL;
-                        regnode *prev = (regnode *)NULL;
-                        regnode *tail = scan;
-                        U8 trietype = 0;
-                        U32 count=0;
-
-                        /* var tail is used because there may be a TAIL
-                           regop in the way. Ie, the exacts will point to the
-                           thing following the TAIL, but the last branch will
-                           point at the TAIL. So we advance tail. If we
-                           have nested (?:) we may have to move through several
-                           tails.
-                         */
-
-                        while ( OP( tail ) == TAIL ) {
-                            /* this is the TAIL generated by (?:) */
-                            tail = regnext( tail );
-                        }
-
-
-                        DEBUG_TRIE_COMPILE_r({
-                            regprop(RExC_rx, RExC_mysv, tail, NULL, pRExC_state);
-                            Perl_re_indentf( aTHX_  "%s %" UVuf ":%s\n",
-                              depth+1,
-                              "Looking for TRIE'able sequences. Tail node is ",
-                              (UV) REGNODE_OFFSET(tail),
-                              SvPV_nolen_const( RExC_mysv )
-                            );
-                        });
-
-                        /*
-
-                            Step through the branches
-                                cur represents each branch,
-                                noper is the first thing to be matched as part
-                                      of that branch
-                                noper_next is the regnext() of that node.
-
-                            We normally handle a case like this
-                            /FOO[xyz]|BAR[pqr]/ via a "jump trie" but we also
-                            support building with NOJUMPTRIE, which restricts
-                            the trie logic to structures like /FOO|BAR/.
-
-                            If noper is a trieable nodetype then the branch is
-                            a possible optimization target. If we are building
-                            under NOJUMPTRIE then we require that noper_next is
-                            the same as scan (our current position in the regex
-                            program).
-
-                            Once we have two or more consecutive such branches
-                            we can create a trie of the EXACT's contents and
-                            stitch it in place into the program.
-
-                            If the sequence represents all of the branches in
-                            the alternation we replace the entire thing with a
-                            single TRIE node.
-
-                            Otherwise when it is a subsequence we need to
-                            stitch it in place and replace only the relevant
-                            branches. This means the first branch has to remain
-                            as it is used by the alternation logic, and its
-                            next pointer, and needs to be repointed at the item
-                            on the branch chain following the last branch we
-                            have optimized away.
-
-                            This could be either a BRANCH, in which case the
-                            subsequence is internal, or it could be the item
-                            following the branch sequence in which case the
-                            subsequence is at the end (which does not
-                            necessarily mean the first node is the start of the
-                            alternation).
-
-                            TRIE_TYPE(X) is a define which maps the optype to a
-                            trietype.
-
-                                optype          |  trietype
-                                ----------------+-----------
-                                NOTHING         | NOTHING
-                                EXACT           | EXACT
-                                EXACT_REQ8     | EXACT
-                                EXACTFU         | EXACTFU
-                                EXACTFU_REQ8   | EXACTFU
-                                EXACTFUP        | EXACTFU
-                                EXACTFAA        | EXACTFAA
-                                EXACTL          | EXACTL
-                                EXACTFLU8       | EXACTFLU8
-
-
-                        */
-#define TRIE_TYPE(X) ( ( NOTHING == (X) )                                   \
-                       ? NOTHING                                            \
-                       : ( EXACT == (X) || EXACT_REQ8 == (X) )             \
-                         ? EXACT                                            \
-                         : (     EXACTFU == (X)                             \
-                              || EXACTFU_REQ8 == (X)                       \
-                              || EXACTFUP == (X) )                          \
-                           ? EXACTFU                                        \
-                           : ( EXACTFAA == (X) )                            \
-                             ? EXACTFAA                                     \
-                             : ( EXACTL == (X) )                            \
-                               ? EXACTL                                     \
-                               : ( EXACTFLU8 == (X) )                       \
-                                 ? EXACTFLU8                                \
-                                 : 0 )
-
-                        /* dont use tail as the end marker for this traverse */
-                        for ( cur = startbranch ; cur != scan ; cur = regnext( cur ) ) {
-                            regnode * const noper = NEXTOPER( cur );
-                            U8 noper_type = OP( noper );
-                            U8 noper_trietype = TRIE_TYPE( noper_type );
-#if defined(DEBUGGING) || defined(NOJUMPTRIE)
-                            regnode * const noper_next = regnext( noper );
-                            U8 noper_next_type = (noper_next && noper_next < tail) ? OP(noper_next) : 0;
-                            U8 noper_next_trietype = (noper_next && noper_next < tail) ? TRIE_TYPE( noper_next_type ) :0;
-#endif
-
-                            DEBUG_TRIE_COMPILE_r({
-                                regprop(RExC_rx, RExC_mysv, cur, NULL, pRExC_state);
-                                Perl_re_indentf( aTHX_  "- %d:%s (%d)",
-                                   depth+1,
-                                   REG_NODE_NUM(cur), SvPV_nolen_const( RExC_mysv ), REG_NODE_NUM(cur) );
-
-                                regprop(RExC_rx, RExC_mysv, noper, NULL, pRExC_state);
-                                Perl_re_printf( aTHX_  " -> %d:%s",
-                                    REG_NODE_NUM(noper), SvPV_nolen_const(RExC_mysv));
-
-                                if ( noper_next ) {
-                                  regprop(RExC_rx, RExC_mysv, noper_next, NULL, pRExC_state);
-                                  Perl_re_printf( aTHX_ "\t=> %d:%s\t",
-                                    REG_NODE_NUM(noper_next), SvPV_nolen_const(RExC_mysv));
-                                }
-                                Perl_re_printf( aTHX_  "(First==%d,Last==%d,Cur==%d,tt==%s,ntt==%s,nntt==%s)\n",
-                                   REG_NODE_NUM(first), REG_NODE_NUM(prev), REG_NODE_NUM(cur),
-                                   PL_reg_name[trietype], PL_reg_name[noper_trietype], PL_reg_name[noper_next_trietype]
-                                );
-                            });
-
-                            /* Is noper a trieable nodetype that can be merged
-                             * with the current trie (if there is one)? */
-                            if ( noper_trietype
-                                  &&
-                                  (
-                                        ( noper_trietype == NOTHING )
-                                        || ( trietype == NOTHING )
-                                        || ( trietype == noper_trietype )
-                                  )
-#ifdef NOJUMPTRIE
-                                  && noper_next >= tail
-#endif
-                                  && count < U16_MAX)
-                            {
-                                /* Handle mergable triable node Either we are
-                                 * the first node in a new trieable sequence,
-                                 * in which case we do some bookkeeping,
-                                 * otherwise we update the end pointer. */
-                                if ( !first ) {
-                                    first = cur;
-                                    if ( noper_trietype == NOTHING ) {
-#if !defined(DEBUGGING) && !defined(NOJUMPTRIE)
-                                        regnode * const noper_next = regnext( noper );
-                                        U8 noper_next_type = (noper_next && noper_next < tail) ? OP(noper_next) : 0;
-                                        U8 noper_next_trietype = noper_next_type ? TRIE_TYPE( noper_next_type ) :0;
-#endif
-
-                                        if ( noper_next_trietype ) {
-                                            trietype = noper_next_trietype;
-                                        } else if (noper_next_type)  {
-                                            /* a NOTHING regop is 1 regop wide.
-                                             * We need at least two for a trie
-                                             * so we can't merge this in */
-                                            first = NULL;
-                                        }
-                                    } else {
-                                        trietype = noper_trietype;
-                                    }
-                                } else {
-                                    if ( trietype == NOTHING )
-                                        trietype = noper_trietype;
-                                    prev = cur;
-                                }
-                                if (first)
-                                    count++;
-                            } /* end handle mergable triable node */
-                            else {
-                                /* handle unmergable node -
-                                 * noper may either be a triable node which can
-                                 * not be tried together with the current trie,
-                                 * or a non triable node */
-                                if ( prev ) {
-                                    /* If last is set and trietype is not
-                                     * NOTHING then we have found at least two
-                                     * triable branch sequences in a row of a
-                                     * similar trietype so we can turn them
-                                     * into a trie. If/when we allow NOTHING to
-                                     * start a trie sequence this condition
-                                     * will be required, and it isn't expensive
-                                     * so we leave it in for now. */
-                                    if ( trietype && trietype != NOTHING )
-                                        make_trie( pRExC_state,
-                                                startbranch, first, cur, tail,
-                                                count, trietype, depth+1 );
-                                    prev = NULL; /* note: we clear/update
-                                                    first, trietype etc below,
-                                                    so we dont do it here */
-                                }
-                                if ( noper_trietype
-#ifdef NOJUMPTRIE
-                                     && noper_next >= tail
-#endif
-                                ){
-                                    /* noper is triable, so we can start a new
-                                     * trie sequence */
-                                    count = 1;
-                                    first = cur;
-                                    trietype = noper_trietype;
-                                } else if (first) {
-                                    /* if we already saw a first but the
-                                     * current node is not triable then we have
-                                     * to reset the first information. */
-                                    count = 0;
-                                    first = NULL;
-                                    trietype = 0;
-                                }
-                            } /* end handle unmergable node */
-                        } /* loop over branches */
-                        DEBUG_TRIE_COMPILE_r({
-                            regprop(RExC_rx, RExC_mysv, cur, NULL, pRExC_state);
-                            Perl_re_indentf( aTHX_  "- %s (%d) <SCAN FINISHED> ",
-                              depth+1, SvPV_nolen_const( RExC_mysv ), REG_NODE_NUM(cur));
-                            Perl_re_printf( aTHX_  "(First==%d, Last==%d, Cur==%d, tt==%s)\n",
-                               REG_NODE_NUM(first), REG_NODE_NUM(prev), REG_NODE_NUM(cur),
-                               PL_reg_name[trietype]
-                            );
-
-                        });
-                        if ( prev && trietype ) {
-                            if ( trietype != NOTHING ) {
-                                /* the last branch of the sequence was part of
-                                 * a trie, so we have to construct it here
-                                 * outside of the loop */
-                                made= make_trie( pRExC_state, startbranch,
-                                                 first, scan, tail, count,
-                                                 trietype, depth+1 );
-#ifdef TRIE_STUDY_OPT
-                                if ( ((made == MADE_EXACT_TRIE &&
-                                     startbranch == first)
-                                     || ( first_non_open == first )) &&
-                                     depth==0 ) {
-                                    flags |= SCF_TRIE_RESTUDY;
-                                    if ( startbranch == first
-                                         && scan >= tail )
-                                    {
-                                        RExC_seen &=~REG_TOP_LEVEL_BRANCHES_SEEN;
-                                    }
-                                }
-#endif
-                            } else {
-                                /* at this point we know whatever we have is a
-                                 * NOTHING sequence/branch AND if 'startbranch'
-                                 * is 'first' then we can turn the whole thing
-                                 * into a NOTHING
-                                 */
-                                if ( startbranch == first ) {
-                                    regnode *opt;
-                                    /* the entire thing is a NOTHING sequence,
-                                     * something like this: (?:|) So we can
-                                     * turn it into a plain NOTHING op. */
-                                    DEBUG_TRIE_COMPILE_r({
-                                        regprop(RExC_rx, RExC_mysv, cur, NULL, pRExC_state);
-                                        Perl_re_indentf( aTHX_  "- %s (%d) <NOTHING BRANCH SEQUENCE>\n",
-                                          depth+1,
-                                          SvPV_nolen_const( RExC_mysv ), REG_NODE_NUM(cur));
-
-                                    });
-                                    OP(startbranch)= NOTHING;
-                                    NEXT_OFF(startbranch)= tail - startbranch;
-                                    for ( opt= startbranch + 1; opt < tail ; opt++ )
-                                        OP(opt)= OPTIMIZED;
-                                }
-                            }
-                        } /* end if ( prev) */
-                    } /* TRIE_MAXBUF is non zero */
-                } /* do trie */
-                DEBUG_STUDYDATA("after TRIE", data, depth, is_inf, min, stopmin, delta);
-            }
-            else if ( code == BRANCHJ ) {  /* single branch is optimized. */
-                scan = NEXTOPER(NEXTOPER(scan));
-            } else                     /* single branch is optimized. */
-                scan = NEXTOPER(scan);
-            continue;
-        } else if (OP(scan) == SUSPEND || OP(scan) == GOSUB) {
-            I32 paren = 0;
-            regnode *start = NULL;
-            regnode *end = NULL;
-            U32 my_recursed_depth= recursed_depth;
-
-            if (OP(scan) != SUSPEND) { /* GOSUB */
-                /* Do setup, note this code has side effects beyond
-                 * the rest of this block. Specifically setting
-                 * RExC_recurse[] must happen at least once during
-                 * study_chunk(). */
-                paren = ARG(scan);
-                RExC_recurse[ARG2L(scan)] = scan;
-                start = REGNODE_p(RExC_open_parens[paren]);
-                end   = REGNODE_p(RExC_close_parens[paren]);
-
-                /* NOTE we MUST always execute the above code, even
-                 * if we do nothing with a GOSUB */
-                if (
-                    ( flags & SCF_IN_DEFINE )
-                    ||
-                    (
-                        (is_inf_internal || is_inf || (data && data->flags & SF_IS_INF))
-                        &&
-                        ( (flags & (SCF_DO_STCLASS | SCF_DO_SUBSTR)) == 0 )
-                    )
-                ) {
-                    /* no need to do anything here if we are in a define. */
-                    /* or we are after some kind of infinite construct
-                     * so we can skip recursing into this item.
-                     * Since it is infinite we will not change the maxlen
-                     * or delta, and if we miss something that might raise
-                     * the minlen it will merely pessimise a little.
-                     *
-                     * Iow /(?(DEFINE)(?<foo>foo|food))a+(?&foo)/
-                     * might result in a minlen of 1 and not of 4,
-                     * but this doesn't make us mismatch, just try a bit
-                     * harder than we should.
-                     *
-                     * However we must assume this GOSUB is infinite, to
-                     * avoid wrongly applying other optimizations in the
-                     * enclosing scope - see GH 18096, for example.
-                     */
-                    is_inf = is_inf_internal = 1;
-                    scan= regnext(scan);
-                    continue;
-                }
-
-                if (
-                    !recursed_depth
-                    || !PAREN_TEST(recursed_depth - 1, paren)
-                ) {
-                    /* it is quite possible that there are more efficient ways
-                     * to do this. We maintain a bitmap per level of recursion
-                     * of which patterns we have entered so we can detect if a
-                     * pattern creates a possible infinite loop. When we
-                     * recurse down a level we copy the previous levels bitmap
-                     * down. When we are at recursion level 0 we zero the top
-                     * level bitmap. It would be nice to implement a different
-                     * more efficient way of doing this. In particular the top
-                     * level bitmap may be unnecessary.
-                     */
-                    if (!recursed_depth) {
-                        Zero(RExC_study_chunk_recursed, RExC_study_chunk_recursed_bytes, U8);
-                    } else {
-                        Copy(PAREN_OFFSET(recursed_depth - 1),
-                             PAREN_OFFSET(recursed_depth),
-                             RExC_study_chunk_recursed_bytes, U8);
-                    }
-                    /* we havent recursed into this paren yet, so recurse into it */
-                    DEBUG_STUDYDATA("gosub-set", data, depth, is_inf, min, stopmin, delta);
-                    PAREN_SET(recursed_depth, paren);
-                    my_recursed_depth= recursed_depth + 1;
-                } else {
-                    DEBUG_STUDYDATA("gosub-inf", data, depth, is_inf, min, stopmin, delta);
-                    /* some form of infinite recursion, assume infinite length
-                     * */
-                    if (flags & SCF_DO_SUBSTR) {
-                        scan_commit(pRExC_state, data, minlenp, is_inf);
-                        data->cur_is_floating = 1;
-                    }
-                    is_inf = is_inf_internal = 1;
-                    if (flags & SCF_DO_STCLASS_OR) /* Allow everything */
-                        ssc_anything(data->start_class);
-                    flags &= ~SCF_DO_STCLASS;
-
-                    start= NULL; /* reset start so we dont recurse later on. */
-                }
-            } else {
-                paren = stopparen;
-                start = scan + 2;
-                end = regnext(scan);
-            }
-            if (start) {
-                scan_frame *newframe;
-                assert(end);
-                if (!RExC_frame_last) {
-                    Newxz(newframe, 1, scan_frame);
-                    SAVEDESTRUCTOR_X(S_unwind_scan_frames, newframe);
-                    RExC_frame_head= newframe;
-                    RExC_frame_count++;
-                } else if (!RExC_frame_last->next_frame) {
-                    Newxz(newframe, 1, scan_frame);
-                    RExC_frame_last->next_frame= newframe;
-                    newframe->prev_frame= RExC_frame_last;
-                    RExC_frame_count++;
-                } else {
-                    newframe= RExC_frame_last->next_frame;
-                }
-                RExC_frame_last= newframe;
-
-                newframe->next_regnode = regnext(scan);
-                newframe->last_regnode = last;
-                newframe->stopparen = stopparen;
-                newframe->prev_recursed_depth = recursed_depth;
-                newframe->this_prev_frame= frame;
-                newframe->in_gosub = (
-                    (frame && frame->in_gosub) || OP(scan) == GOSUB
-                );
-
-                DEBUG_STUDYDATA("frame-new", data, depth, is_inf, min, stopmin, delta);
-                DEBUG_PEEP("fnew", scan, depth, flags);
-
-                frame = newframe;
-                scan =  start;
-                stopparen = paren;
-                last = end;
-                depth = depth + 1;
-                recursed_depth= my_recursed_depth;
-
-                continue;
-            }
-        }
-        else if (PL_regkind[OP(scan)] == EXACT && ! isEXACTFish(OP(scan))) {
-            SSize_t bytelen = STR_LEN(scan), charlen;
-            UV uc;
-            assert(bytelen);
-            if (UTF) {
-                const U8 * const s = (U8*)STRING(scan);
-                uc = utf8_to_uvchr_buf(s, s + bytelen, NULL);
-                charlen = utf8_length(s, s + bytelen);
-            } else {
-                uc = *((U8*)STRING(scan));
-                charlen = bytelen;
-            }
-            min += charlen;
-            if (flags & SCF_DO_SUBSTR) { /* Update longest substr. */
-                /* The code below prefers earlier match for fixed
-                   offset, later match for variable offset.  */
-                if (data->last_end == -1) { /* Update the start info. */
-                    data->last_start_min = data->pos_min;
-                    data->last_start_max =
-                        is_inf ? OPTIMIZE_INFTY
-                        : (data->pos_delta > OPTIMIZE_INFTY - data->pos_min)
-                            ? OPTIMIZE_INFTY : data->pos_min + data->pos_delta;
-                }
-                sv_catpvn(data->last_found, STRING(scan), bytelen);
-                if (UTF)
-                    SvUTF8_on(data->last_found);
-                {
-                    SV * const sv = data->last_found;
-                    MAGIC * const mg = SvUTF8(sv) && SvMAGICAL(sv) ?
-                        mg_find(sv, PERL_MAGIC_utf8) : NULL;
-                    if (mg && mg->mg_len >= 0)
-                        mg->mg_len += charlen;
-                }
-                data->last_end = data->pos_min + charlen;
-                data->pos_min += charlen; /* As in the first entry. */
-                data->flags &= ~SF_BEFORE_EOL;
-            }
-
-            /* ANDing the code point leaves at most it, and not in locale, and
-             * can't match null string */
-            if (flags & SCF_DO_STCLASS_AND) {
-                ssc_cp_and(data->start_class, uc);
-                ANYOF_FLAGS(data->start_class) &= ~SSC_MATCHES_EMPTY_STRING;
-                ssc_clear_locale(data->start_class);
-            }
-            else if (flags & SCF_DO_STCLASS_OR) {
-                ssc_add_cp(data->start_class, uc);
-                ssc_and(pRExC_state, data->start_class, (regnode_charclass *) and_withp);
-
-                /* See commit msg 749e076fceedeb708a624933726e7989f2302f6a */
-                ANYOF_FLAGS(data->start_class) &= ~SSC_MATCHES_EMPTY_STRING;
-            }
-            flags &= ~SCF_DO_STCLASS;
-            DEBUG_STUDYDATA("end EXACT", data, depth, is_inf, min, stopmin, delta);
-        }
-        else if (PL_regkind[OP(scan)] == EXACT) {
-            /* But OP != EXACT!, so is EXACTFish */
-            SSize_t bytelen = STR_LEN(scan), charlen;
-            const U8 * s = (U8*)STRING(scan);
-
-            /* Replace a length 1 ASCII fold pair node with an ANYOFM node,
-             * with the mask set to the complement of the bit that differs
-             * between upper and lower case, and the lowest code point of the
-             * pair (which the '&' forces) */
-            if (     bytelen == 1
-                &&   isALPHA_A(*s)
-                &&  (         OP(scan) == EXACTFAA
-                     || (     OP(scan) == EXACTFU
-                         && ! HAS_NONLATIN1_SIMPLE_FOLD_CLOSURE(*s)))
-                &&   mutate_ok
-            ) {
-                U8 mask = ~ ('A' ^ 'a'); /* These differ in just one bit */
-
-                OP(scan) = ANYOFM;
-                ARG_SET(scan, *s & mask);
-                FLAGS(scan) = mask;
-                /* We're not EXACTFish any more, so restudy.
-                 * Search for "restudy" in this file to find
-                 * a comment with details. */
-                continue;
-            }
-
-            /* Search for fixed substrings supports EXACT only. */
-            if (flags & SCF_DO_SUBSTR) {
-                assert(data);
-                scan_commit(pRExC_state, data, minlenp, is_inf);
-            }
-            charlen = UTF ? (SSize_t) utf8_length(s, s + bytelen) : bytelen;
-            if (unfolded_multi_char) {
-                RExC_seen |= REG_UNFOLDED_MULTI_SEEN;
-            }
-            min += charlen - min_subtract;
-            assert (min >= 0);
-            if ((SSize_t)min_subtract < OPTIMIZE_INFTY
-                && delta < OPTIMIZE_INFTY - (SSize_t)min_subtract
-            ) {
-                delta += min_subtract;
-            } else {
-                delta = OPTIMIZE_INFTY;
-            }
-            if (flags & SCF_DO_SUBSTR) {
-                data->pos_min += charlen - min_subtract;
-                if (data->pos_min < 0) {
-                    data->pos_min = 0;
-                }
-                if ((SSize_t)min_subtract < OPTIMIZE_INFTY
-                    && data->pos_delta < OPTIMIZE_INFTY - (SSize_t)min_subtract
-                ) {
-                    data->pos_delta += min_subtract;
-                } else {
-                    data->pos_delta = OPTIMIZE_INFTY;
-                }
-                if (min_subtract) {
-                    data->cur_is_floating = 1; /* float */
-                }
-            }
-
-            if (flags & SCF_DO_STCLASS) {
-                SV* EXACTF_invlist = make_exactf_invlist(pRExC_state, scan);
-
-                assert(EXACTF_invlist);
-                if (flags & SCF_DO_STCLASS_AND) {
-                    if (OP(scan) != EXACTFL)
-                        ssc_clear_locale(data->start_class);
-                    ANYOF_FLAGS(data->start_class) &= ~SSC_MATCHES_EMPTY_STRING;
-                    ANYOF_POSIXL_ZERO(data->start_class);
-                    ssc_intersection(data->start_class, EXACTF_invlist, FALSE);
-                }
-                else {  /* SCF_DO_STCLASS_OR */
-                    ssc_union(data->start_class, EXACTF_invlist, FALSE);
-                    ssc_and(pRExC_state, data->start_class, (regnode_charclass *) and_withp);
-
-                    /* See commit msg 749e076fceedeb708a624933726e7989f2302f6a */
-                    ANYOF_FLAGS(data->start_class) &= ~SSC_MATCHES_EMPTY_STRING;
-                }
-                flags &= ~SCF_DO_STCLASS;
-                SvREFCNT_dec(EXACTF_invlist);
-            }
-            DEBUG_STUDYDATA("end EXACTish", data, depth, is_inf, min, stopmin, delta);
-        }
-        else if (REGNODE_VARIES(OP(scan))) {
-            SSize_t mincount, maxcount, minnext, deltanext, pos_before = 0;
-            I32 fl = 0;
-            U32 f = flags;
-            regnode * const oscan = scan;
-            regnode_ssc this_class;
-            regnode_ssc *oclass = NULL;
-            I32 next_is_eval = 0;
-
-            switch (PL_regkind[OP(scan)]) {
-            case WHILEM:               /* End of (?:...)* . */
-                scan = NEXTOPER(scan);
-                goto finish;
-            case PLUS:
-                if (flags & (SCF_DO_SUBSTR | SCF_DO_STCLASS)) {
-                    next = NEXTOPER(scan);
-                    if (   (     PL_regkind[OP(next)] == EXACT
-                            && ! isEXACTFish(OP(next)))
-                        || (flags & SCF_DO_STCLASS))
-                    {
-                        mincount = 1;
-                        maxcount = REG_INFTY;
-                        next = regnext(scan);
-                        scan = NEXTOPER(scan);
-                        goto do_curly;
-                    }
-                }
-                if (flags & SCF_DO_SUBSTR)
-                    data->pos_min++;
-                /* This will bypass the formal 'min += minnext * mincount'
-                 * calculation in the do_curly path, so assumes min width
-                 * of the PLUS payload is exactly one. */
-                min++;
-                /* FALLTHROUGH */
-            case STAR:
-                next = NEXTOPER(scan);
-
-                /* This temporary node can now be turned into EXACTFU, and
-                 * must, as regexec.c doesn't handle it */
-                if (OP(next) == EXACTFU_S_EDGE && mutate_ok) {
-                    OP(next) = EXACTFU;
-                }
-
-                if (     STR_LEN(next) == 1
-                    &&   isALPHA_A(* STRING(next))
-                    && (         OP(next) == EXACTFAA
-                        || (     OP(next) == EXACTFU
-                            && ! HAS_NONLATIN1_SIMPLE_FOLD_CLOSURE(* STRING(next))))
-                    &&   mutate_ok
-                ) {
-                    /* These differ in just one bit */
-                    U8 mask = ~ ('A' ^ 'a');
-
-                    assert(isALPHA_A(* STRING(next)));
-
-                    /* Then replace it by an ANYOFM node, with
-                    * the mask set to the complement of the
-                    * bit that differs between upper and lower
-                    * case, and the lowest code point of the
-                    * pair (which the '&' forces) */
-                    OP(next) = ANYOFM;
-                    ARG_SET(next, *STRING(next) & mask);
-                    FLAGS(next) = mask;
-                }
-
-                if (flags & SCF_DO_STCLASS) {
-                    mincount = 0;
-                    maxcount = REG_INFTY;
-                    next = regnext(scan);
-                    scan = NEXTOPER(scan);
-                    goto do_curly;
-                }
-                if (flags & SCF_DO_SUBSTR) {
-                    scan_commit(pRExC_state, data, minlenp, is_inf);
-                    /* Cannot extend fixed substrings */
-                    data->cur_is_floating = 1; /* float */
-                }
-                is_inf = is_inf_internal = 1;
-                scan = regnext(scan);
-                goto optimize_curly_tail;
-            case CURLY:
-                if (stopparen>0 && (OP(scan)==CURLYN || OP(scan)==CURLYM)
-                    && (scan->flags == stopparen))
-                {
-                    mincount = 1;
-                    maxcount = 1;
-                } else {
-                    mincount = ARG1(scan);
-                    maxcount = ARG2(scan);
-                }
-                next = regnext(scan);
-                if (OP(scan) == CURLYX) {
-                    I32 lp = (data ? *(data->last_closep) : 0);
-                    scan->flags = ((lp <= (I32)U8_MAX) ? (U8)lp : U8_MAX);
-                }
-                scan = NEXTOPER(scan) + EXTRA_STEP_2ARGS;
-                next_is_eval = (OP(scan) == EVAL);
-              do_curly:
-                if (flags & SCF_DO_SUBSTR) {
-                    if (mincount == 0)
-                        scan_commit(pRExC_state, data, minlenp, is_inf);
-                    /* Cannot extend fixed substrings */
-                    pos_before = data->pos_min;
-                }
-                if (data) {
-                    fl = data->flags;
-                    data->flags &= ~(SF_HAS_PAR|SF_IN_PAR|SF_HAS_EVAL);
-                    if (is_inf)
-                        data->flags |= SF_IS_INF;
-                }
-                if (flags & SCF_DO_STCLASS) {
-                    ssc_init(pRExC_state, &this_class);
-                    oclass = data->start_class;
-                    data->start_class = &this_class;
-                    f |= SCF_DO_STCLASS_AND;
-                    f &= ~SCF_DO_STCLASS_OR;
-                }
-                /* Exclude from super-linear cache processing any {n,m}
-                   regops for which the combination of input pos and regex
-                   pos is not enough information to determine if a match
-                   will be possible.
-
-                   For example, in the regex /foo(bar\s*){4,8}baz/ with the
-                   regex pos at the \s*, the prospects for a match depend not
-                   only on the input position but also on how many (bar\s*)
-                   repeats into the {4,8} we are. */
-               if ((mincount > 1) || (maxcount > 1 && maxcount != REG_INFTY))
-                    f &= ~SCF_WHILEM_VISITED_POS;
-
-                /* This will finish on WHILEM, setting scan, or on NULL: */
-                /* recurse study_chunk() on loop bodies */
-                minnext = study_chunk(pRExC_state, &scan, minlenp, &deltanext,
-                                  last, data, stopparen, recursed_depth, NULL,
-                                  (mincount == 0
-                                   ? (f & ~SCF_DO_SUBSTR)
-                                   : f)
-                                  , depth+1, mutate_ok);
-
-                if (data && data->flags & SCF_SEEN_ACCEPT) {
-                    if (mincount > 1)
-                        mincount = 1;
-                }
-
-                if (flags & SCF_DO_STCLASS)
-                    data->start_class = oclass;
-                if (mincount == 0 || minnext == 0) {
-                    if (flags & SCF_DO_STCLASS_OR) {
-                        ssc_or(pRExC_state, data->start_class, (regnode_charclass *) &this_class);
-                    }
-                    else if (flags & SCF_DO_STCLASS_AND) {
-                        /* Switch to OR mode: cache the old value of
-                         * data->start_class */
-                        INIT_AND_WITHP;
-                        StructCopy(data->start_class, and_withp, regnode_ssc);
-                        flags &= ~SCF_DO_STCLASS_AND;
-                        StructCopy(&this_class, data->start_class, regnode_ssc);
-                        flags |= SCF_DO_STCLASS_OR;
-                        ANYOF_FLAGS(data->start_class)
-                                                |= SSC_MATCHES_EMPTY_STRING;
-                    }
-                } else {               /* Non-zero len */
-                    if (flags & SCF_DO_STCLASS_OR) {
-                        ssc_or(pRExC_state, data->start_class, (regnode_charclass *) &this_class);
-                        ssc_and(pRExC_state, data->start_class, (regnode_charclass *) and_withp);
-                    }
-                    else if (flags & SCF_DO_STCLASS_AND)
-                        ssc_and(pRExC_state, data->start_class, (regnode_charclass *) &this_class);
-                    flags &= ~SCF_DO_STCLASS;
-                }
-                if (!scan)             /* It was not CURLYX, but CURLY. */
-                    scan = next;
-                if (((flags & (SCF_TRIE_DOING_RESTUDY|SCF_DO_SUBSTR))==SCF_DO_SUBSTR)
-                    /* ? quantifier ok, except for (?{ ... }) */
-                    && (next_is_eval || !(mincount == 0 && maxcount == 1))
-                    && (minnext == 0) && (deltanext == 0)
-                    && data && !(data->flags & (SF_HAS_PAR|SF_IN_PAR))
-                    && maxcount <= REG_INFTY/3) /* Complement check for big
-                                                   count */
-                {
-                    _WARN_HELPER(RExC_precomp_end, packWARN(WARN_REGEXP),
-                        Perl_ck_warner(aTHX_ packWARN(WARN_REGEXP),
-                            "Quantifier unexpected on zero-length expression "
-                            "in regex m/%" UTF8f "/",
-                             UTF8fARG(UTF, RExC_precomp_end - RExC_precomp,
-                                  RExC_precomp)));
-                }
-
-                if ( ( minnext > 0 && mincount >= SSize_t_MAX / minnext )
-                    || min >= SSize_t_MAX - minnext * mincount )
-                {
-                    FAIL("Regexp out of space");
-                }
-
-                min += minnext * mincount;
-                is_inf_internal |= deltanext == OPTIMIZE_INFTY
-                         || (maxcount == REG_INFTY && minnext + deltanext > 0);
-                is_inf |= is_inf_internal;
-                if (is_inf) {
-                    delta = OPTIMIZE_INFTY;
-                } else {
-                    delta += (minnext + deltanext) * maxcount
-                             - minnext * mincount;
-                }
-
-                if (data && data->flags & SCF_SEEN_ACCEPT) {
-                    if (flags & SCF_DO_SUBSTR) {
-                        scan_commit(pRExC_state, data, minlenp, is_inf);
-                        flags &= ~SCF_DO_SUBSTR;
-                    }
-                    if (stopmin > min)
-                        stopmin = min;
-                    DEBUG_STUDYDATA("after-whilem accept", data, depth, is_inf, min, stopmin, delta);
-                }
-                /* Try powerful optimization CURLYX => CURLYN. */
-                if (  OP(oscan) == CURLYX && data
-                      && data->flags & SF_IN_PAR
-                      && !(data->flags & SF_HAS_EVAL)
-                      && !deltanext && minnext == 1
-                      && mutate_ok
-                ) {
-                    /* Try to optimize to CURLYN.  */
-                    regnode *nxt = NEXTOPER(oscan) + EXTRA_STEP_2ARGS;
-                    regnode * const nxt1 = nxt;
-#ifdef DEBUGGING
-                    regnode *nxt2;
-#endif
-
-                    /* Skip open. */
-                    nxt = regnext(nxt);
-                    if (!REGNODE_SIMPLE(OP(nxt))
-                        && !(PL_regkind[OP(nxt)] == EXACT
-                             && STR_LEN(nxt) == 1))
-                        goto nogo;
-#ifdef DEBUGGING
-                    nxt2 = nxt;
-#endif
-                    nxt = regnext(nxt);
-                    if (OP(nxt) != CLOSE)
-                        goto nogo;
-                    if (RExC_open_parens) {
-
-                        /*open->CURLYM*/
-                        RExC_open_parens[ARG(nxt1)] = REGNODE_OFFSET(oscan);
-
-                        /*close->while*/
-                        RExC_close_parens[ARG(nxt1)] = REGNODE_OFFSET(nxt) + 2;
-                    }
-                    /* Now we know that nxt2 is the only contents: */
-                    oscan->flags = (U8)ARG(nxt);
-                    OP(oscan) = CURLYN;
-                    OP(nxt1) = NOTHING;        /* was OPEN. */
-
-#ifdef DEBUGGING
-                    OP(nxt1 + 1) = OPTIMIZED; /* was count. */
-                    NEXT_OFF(nxt1+ 1) = 0; /* just for consistency. */
-                    NEXT_OFF(nxt2) = 0;        /* just for consistency with CURLY. */
-                    OP(nxt) = OPTIMIZED;       /* was CLOSE. */
-                    OP(nxt + 1) = OPTIMIZED; /* was count. */
-                    NEXT_OFF(nxt+ 1) = 0; /* just for consistency. */
-#endif
-                }
-              nogo:
-
-                /* Try optimization CURLYX => CURLYM. */
-                if (  OP(oscan) == CURLYX && data
-                      && !(data->flags & SF_HAS_PAR)
-                      && !(data->flags & SF_HAS_EVAL)
-                      && !deltanext    /* atom is fixed width */
-                      && minnext != 0  /* CURLYM can't handle zero width */
-                         /* Nor characters whose fold at run-time may be
-                          * multi-character */
-                      && ! (RExC_seen & REG_UNFOLDED_MULTI_SEEN)
-                      && mutate_ok
-                ) {
-                    /* XXXX How to optimize if data == 0? */
-                    /* Optimize to a simpler form.  */
-                    regnode *nxt = NEXTOPER(oscan) + EXTRA_STEP_2ARGS; /* OPEN */
-                    regnode *nxt2;
-
-                    OP(oscan) = CURLYM;
-                    while ( (nxt2 = regnext(nxt)) /* skip over embedded stuff*/
-                            && (OP(nxt2) != WHILEM))
-                        nxt = nxt2;
-                    OP(nxt2)  = SUCCEED; /* Whas WHILEM */
-                    /* Need to optimize away parenths. */
-                    if ((data->flags & SF_IN_PAR) && OP(nxt) == CLOSE) {
-                        /* Set the parenth number.  */
-                        regnode *nxt1 = NEXTOPER(oscan) + EXTRA_STEP_2ARGS; /* OPEN*/
-
-                        oscan->flags = (U8)ARG(nxt);
-                        if (RExC_open_parens) {
-                             /*open->CURLYM*/
-                            RExC_open_parens[ARG(nxt1)] = REGNODE_OFFSET(oscan);
-
-                            /*close->NOTHING*/
-                            RExC_close_parens[ARG(nxt1)] = REGNODE_OFFSET(nxt2)
-                                                         + 1;
-                        }
-                        OP(nxt1) = OPTIMIZED;  /* was OPEN. */
-                        OP(nxt) = OPTIMIZED;   /* was CLOSE. */
-
-#ifdef DEBUGGING
-                        OP(nxt1 + 1) = OPTIMIZED; /* was count. */
-                        OP(nxt + 1) = OPTIMIZED; /* was count. */
-                        NEXT_OFF(nxt1 + 1) = 0; /* just for consistency. */
-                        NEXT_OFF(nxt + 1) = 0; /* just for consistency. */
-#endif
-#if 0
-                        while ( nxt1 && (OP(nxt1) != WHILEM)) {
-                            regnode *nnxt = regnext(nxt1);
-                            if (nnxt == nxt) {
-                                if (reg_off_by_arg[OP(nxt1)])
-                                    ARG_SET(nxt1, nxt2 - nxt1);
-                                else if (nxt2 - nxt1 < U16_MAX)
-                                    NEXT_OFF(nxt1) = nxt2 - nxt1;
-                                else
-                                    OP(nxt) = NOTHING; /* Cannot beautify */
-                            }
-                            nxt1 = nnxt;
-                        }
-#endif
-                        /* Optimize again: */
-                        /* recurse study_chunk() on optimised CURLYX => CURLYM */
-                        study_chunk(pRExC_state, &nxt1, minlenp, &deltanext, nxt,
-                                    NULL, stopparen, recursed_depth, NULL, 0,
-                                    depth+1, mutate_ok);
-                    }
-                    else
-                        oscan->flags = 0;
-                }
-                else if ((OP(oscan) == CURLYX)
-                         && (flags & SCF_WHILEM_VISITED_POS)
-                         /* See the comment on a similar expression above.
-                            However, this time it's not a subexpression
-                            we care about, but the expression itself. */
-                         && (maxcount == REG_INFTY)
-                         && data) {
-                    /* This stays as CURLYX, we can put the count/of pair. */
-                    /* Find WHILEM (as in regexec.c) */
-                    regnode *nxt = oscan + NEXT_OFF(oscan);
-
-                    if (OP(PREVOPER(nxt)) == NOTHING) /* LONGJMP */
-                        nxt += ARG(nxt);
-                    nxt = PREVOPER(nxt);
-                    if (nxt->flags & 0xf) {
-                        /* we've already set whilem count on this node */
-                    } else if (++data->whilem_c < 16) {
-                        assert(data->whilem_c <= RExC_whilem_seen);
-                        nxt->flags = (U8)(data->whilem_c
-                            | (RExC_whilem_seen << 4)); /* On WHILEM */
-                    }
-                }
-                if (data && fl & (SF_HAS_PAR|SF_IN_PAR))
-                    pars++;
-                if (flags & SCF_DO_SUBSTR) {
-                    SV *last_str = NULL;
-                    STRLEN last_chrs = 0;
-                    int counted = mincount != 0;
-
-                    if (data->last_end > 0 && mincount != 0) { /* Ends with a
-                                                                  string. */
-                        SSize_t b = pos_before >= data->last_start_min
-                            ? pos_before : data->last_start_min;
-                        STRLEN l;
-                        const char * const s = SvPV_const(data->last_found, l);
-                        SSize_t old = b - data->last_start_min;
-                        assert(old >= 0);
-
-                        if (UTF)
-                            old = utf8_hop_forward((U8*)s, old,
-                                               (U8 *) SvEND(data->last_found))
-                                - (U8*)s;
-                        l -= old;
-                        /* Get the added string: */
-                        last_str = newSVpvn_utf8(s  + old, l, UTF);
-                        last_chrs = UTF ? utf8_length((U8*)(s + old),
-                                            (U8*)(s + old + l)) : l;
-                        if (deltanext == 0 && pos_before == b) {
-                            /* What was added is a constant string */
-                            if (mincount > 1) {
-
-                                SvGROW(last_str, (mincount * l) + 1);
-                                repeatcpy(SvPVX(last_str) + l,
-                                          SvPVX_const(last_str), l,
-                                          mincount - 1);
-                                SvCUR_set(last_str, SvCUR(last_str) * mincount);
-                                /* Add additional parts. */
-                                SvCUR_set(data->last_found,
-                                          SvCUR(data->last_found) - l);
-                                sv_catsv(data->last_found, last_str);
-                                {
-                                    SV * sv = data->last_found;
-                                    MAGIC *mg =
-                                        SvUTF8(sv) && SvMAGICAL(sv) ?
-                                        mg_find(sv, PERL_MAGIC_utf8) : NULL;
-                                    if (mg && mg->mg_len >= 0)
-                                        mg->mg_len += last_chrs * (mincount-1);
-                                }
-                                last_chrs *= mincount;
-                                data->last_end += l * (mincount - 1);
-                            }
-                        } else {
-                            /* start offset must point into the last copy */
-                            data->last_start_min += minnext * (mincount - 1);
-                            data->last_start_max =
-                              is_inf
-                               ? OPTIMIZE_INFTY
-                               : data->last_start_max +
-                                 (maxcount - 1) * (minnext + data->pos_delta);
-                        }
-                    }
-                    /* It is counted once already... */
-                    data->pos_min += minnext * (mincount - counted);
-#if 0
-    Perl_re_printf( aTHX_  "counted=%" UVuf " deltanext=%" UVuf
-                              " OPTIMIZE_INFTY=%" UVuf " minnext=%" UVuf
-                              " maxcount=%" UVuf " mincount=%" UVuf
-                              " data->pos_delta=%" UVuf "\n",
-        (UV)counted, (UV)deltanext, (UV)OPTIMIZE_INFTY, (UV)minnext,
-        (UV)maxcount, (UV)mincount, (UV)data->pos_delta);
-    if (deltanext != OPTIMIZE_INFTY)
-        Perl_re_printf( aTHX_  "LHS=%" UVuf " RHS=%" UVuf "\n",
-            (UV)(-counted * deltanext + (minnext + deltanext) * maxcount
-            - minnext * mincount), (UV)(OPTIMIZE_INFTY - data->pos_delta));
-#endif
-                    if (deltanext == OPTIMIZE_INFTY
-                        || data->pos_delta == OPTIMIZE_INFTY
-                        || -counted * deltanext + (minnext + deltanext) * maxcount - minnext * mincount >= OPTIMIZE_INFTY - data->pos_delta)
-                        data->pos_delta = OPTIMIZE_INFTY;
-                    else
-                        data->pos_delta += - counted * deltanext +
-                        (minnext + deltanext) * maxcount - minnext * mincount;
-                    if (mincount != maxcount) {
-                         /* Cannot extend fixed substrings found inside
-                            the group.  */
-                        scan_commit(pRExC_state, data, minlenp, is_inf);
-                        if (mincount && last_str) {
-                            SV * const sv = data->last_found;
-                            MAGIC * const mg = SvUTF8(sv) && SvMAGICAL(sv) ?
-                                mg_find(sv, PERL_MAGIC_utf8) : NULL;
-
-                            if (mg)
-                                mg->mg_len = -1;
-                            sv_setsv(sv, last_str);
-                            data->last_end = data->pos_min;
-                            data->last_start_min = data->pos_min - last_chrs;
-                            data->last_start_max = is_inf
-                                ? OPTIMIZE_INFTY
-                                : data->pos_min + data->pos_delta - last_chrs;
-                        }
-                        data->cur_is_floating = 1; /* float */
-                    }
-                    SvREFCNT_dec(last_str);
-                }
-                if (data && (fl & SF_HAS_EVAL))
-                    data->flags |= SF_HAS_EVAL;
-              optimize_curly_tail:
-                rck_elide_nothing(oscan);
-                continue;
-
-            default:
-                Perl_croak(aTHX_ "panic: unexpected varying REx opcode %d",
-                                                                    OP(scan));
-            case REF:
-            case CLUMP:
-                if (flags & SCF_DO_SUBSTR) {
-                    /* Cannot expect anything... */
-                    scan_commit(pRExC_state, data, minlenp, is_inf);
-                    data->cur_is_floating = 1; /* float */
-                }
-                is_inf = is_inf_internal = 1;
-                if (flags & SCF_DO_STCLASS_OR) {
-                    if (OP(scan) == CLUMP) {
-                        /* Actually is any start char, but very few code points
-                         * aren't start characters */
-                        ssc_match_all_cp(data->start_class);
-                    }
-                    else {
-                        ssc_anything(data->start_class);
-                    }
-                }
-                flags &= ~SCF_DO_STCLASS;
-                break;
-            }
-        }
-        else if (OP(scan) == LNBREAK) {
-            if (flags & SCF_DO_STCLASS) {
-                if (flags & SCF_DO_STCLASS_AND) {
-                    ssc_intersection(data->start_class,
-                                    PL_XPosix_ptrs[_CC_VERTSPACE], FALSE);
-                    ssc_clear_locale(data->start_class);
-                    ANYOF_FLAGS(data->start_class)
-                                                &= ~SSC_MATCHES_EMPTY_STRING;
-                }
-                else if (flags & SCF_DO_STCLASS_OR) {
-                    ssc_union(data->start_class,
-                              PL_XPosix_ptrs[_CC_VERTSPACE],
-                              FALSE);
-                    ssc_and(pRExC_state, data->start_class, (regnode_charclass *) and_withp);
-
-                    /* See commit msg for
-                     * 749e076fceedeb708a624933726e7989f2302f6a */
-                    ANYOF_FLAGS(data->start_class)
-                                                &= ~SSC_MATCHES_EMPTY_STRING;
-                }
-                flags &= ~SCF_DO_STCLASS;
-            }
-            min++;
-            if (delta != OPTIMIZE_INFTY)
-                delta++;    /* Because of the 2 char string cr-lf */
-            if (flags & SCF_DO_SUBSTR) {
-                /* Cannot expect anything... */
-                scan_commit(pRExC_state, data, minlenp, is_inf);
-                data->pos_min += 1;
-                if (data->pos_delta != OPTIMIZE_INFTY) {
-                    data->pos_delta += 1;
-                }
-                data->cur_is_floating = 1; /* float */
-            }
-        }
-        else if (REGNODE_SIMPLE(OP(scan))) {
-
-            if (flags & SCF_DO_SUBSTR) {
-                scan_commit(pRExC_state, data, minlenp, is_inf);
-                data->pos_min++;
-            }
-            min++;
-            if (flags & SCF_DO_STCLASS) {
-                bool invert = 0;
-                SV* my_invlist = NULL;
-                U8 namedclass;
-
-                /* See commit msg 749e076fceedeb708a624933726e7989f2302f6a */
-                ANYOF_FLAGS(data->start_class) &= ~SSC_MATCHES_EMPTY_STRING;
-
-                /* Some of the logic below assumes that switching
-                   locale on will only add false positives. */
-                switch (OP(scan)) {
-
-                default:
-#ifdef DEBUGGING
-                   Perl_croak(aTHX_ "panic: unexpected simple REx opcode %d",
-                                                                     OP(scan));
-#endif
-                case SANY:
-                    if (flags & SCF_DO_STCLASS_OR) /* Allow everything */
-                        ssc_match_all_cp(data->start_class);
-                    break;
-
-                case REG_ANY:
-                    {
-                        SV* REG_ANY_invlist = _new_invlist(2);
-                        REG_ANY_invlist = add_cp_to_invlist(REG_ANY_invlist,
-                                                            '\n');
-                        if (flags & SCF_DO_STCLASS_OR) {
-                            ssc_union(data->start_class,
-                                      REG_ANY_invlist,
-                                      TRUE /* TRUE => invert, hence all but \n
-                                            */
-                                      );
-                        }
-                        else if (flags & SCF_DO_STCLASS_AND) {
-                            ssc_intersection(data->start_class,
-                                             REG_ANY_invlist,
-                                             TRUE  /* TRUE => invert */
-                                             );
-                            ssc_clear_locale(data->start_class);
-                        }
-                        SvREFCNT_dec_NN(REG_ANY_invlist);
-                    }
-                    break;
-
-                case ANYOFD:
-                case ANYOFL:
-                case ANYOFPOSIXL:
-                case ANYOFH:
-                case ANYOFHb:
-                case ANYOFHr:
-                case ANYOFHs:
-                case ANYOF:
-                    if (flags & SCF_DO_STCLASS_AND)
-                        ssc_and(pRExC_state, data->start_class,
-                                (regnode_charclass *) scan);
-                    else
-                        ssc_or(pRExC_state, data->start_class,
-                                                          (regnode_charclass *) scan);
-                    break;
-
-                case NANYOFM: /* NANYOFM already contains the inversion of the
-                                 input ANYOF data, so, unlike things like
-                                 NPOSIXA, don't change 'invert' to TRUE */
-                    /* FALLTHROUGH */
-                case ANYOFM:
-                  {
-                    SV* cp_list = get_ANYOFM_contents(scan);
-
-                    if (flags & SCF_DO_STCLASS_OR) {
-                        ssc_union(data->start_class, cp_list, invert);
-                    }
-                    else if (flags & SCF_DO_STCLASS_AND) {
-                        ssc_intersection(data->start_class, cp_list, invert);
-                    }
-
-                    SvREFCNT_dec_NN(cp_list);
-                    break;
-                  }
-
-                case ANYOFR:
-                case ANYOFRb:
-                  {
-                    SV* cp_list = NULL;
-
-                    cp_list = _add_range_to_invlist(cp_list,
-                                        ANYOFRbase(scan),
-                                        ANYOFRbase(scan) + ANYOFRdelta(scan));
-
-                    if (flags & SCF_DO_STCLASS_OR) {
-                        ssc_union(data->start_class, cp_list, invert);
-                    }
-                    else if (flags & SCF_DO_STCLASS_AND) {
-                        ssc_intersection(data->start_class, cp_list, invert);
-                    }
-
-                    SvREFCNT_dec_NN(cp_list);
-                    break;
-                  }
-
-                case NPOSIXL:
-                    invert = 1;
-                    /* FALLTHROUGH */
-
-                case POSIXL:
-                    namedclass = classnum_to_namedclass(FLAGS(scan)) + invert;
-                    if (flags & SCF_DO_STCLASS_AND) {
-                        bool was_there = cBOOL(
-                                          ANYOF_POSIXL_TEST(data->start_class,
-                                                                 namedclass));
-                        ANYOF_POSIXL_ZERO(data->start_class);
-                        if (was_there) {    /* Do an AND */
-                            ANYOF_POSIXL_SET(data->start_class, namedclass);
-                        }
-                        /* No individual code points can now match */
-                        data->start_class->invlist
-                                                = sv_2mortal(_new_invlist(0));
-                    }
-                    else {
-                        int complement = namedclass + ((invert) ? -1 : 1);
-
-                        assert(flags & SCF_DO_STCLASS_OR);
-
-                        /* If the complement of this class was already there,
-                         * the result is that they match all code points,
-                         * (\d + \D == everything).  Remove the classes from
-                         * future consideration.  Locale is not relevant in
-                         * this case */
-                        if (ANYOF_POSIXL_TEST(data->start_class, complement)) {
-                            ssc_match_all_cp(data->start_class);
-                            ANYOF_POSIXL_CLEAR(data->start_class, namedclass);
-                            ANYOF_POSIXL_CLEAR(data->start_class, complement);
-                        }
-                        else {  /* The usual case; just add this class to the
-                                   existing set */
-                            ANYOF_POSIXL_SET(data->start_class, namedclass);
-                        }
-                    }
-                    break;
-
-                case NPOSIXA:   /* For these, we always know the exact set of
-                                   what's matched */
-                    invert = 1;
-                    /* FALLTHROUGH */
-                case POSIXA:
-                    my_invlist = invlist_clone(PL_Posix_ptrs[FLAGS(scan)], NULL);
-                    goto join_posix_and_ascii;
-
-                case NPOSIXD:
-                case NPOSIXU:
-                    invert = 1;
-                    /* FALLTHROUGH */
-                case POSIXD:
-                case POSIXU:
-                    my_invlist = invlist_clone(PL_XPosix_ptrs[FLAGS(scan)], NULL);
-
-                    /* NPOSIXD matches all upper Latin1 code points unless the
-                     * target string being matched is UTF-8, which is
-                     * unknowable until match time.  Since we are going to
-                     * invert, we want to get rid of all of them so that the
-                     * inversion will match all */
-                    if (OP(scan) == NPOSIXD) {
-                        _invlist_subtract(my_invlist, PL_UpperLatin1,
-                                          &my_invlist);
-                    }
-
-                  join_posix_and_ascii:
-
-                    if (flags & SCF_DO_STCLASS_AND) {
-                        ssc_intersection(data->start_class, my_invlist, invert);
-                        ssc_clear_locale(data->start_class);
-                    }
-                    else {
-                        assert(flags & SCF_DO_STCLASS_OR);
-                        ssc_union(data->start_class, my_invlist, invert);
-                    }
-                    SvREFCNT_dec(my_invlist);
-                }
-                if (flags & SCF_DO_STCLASS_OR)
-                    ssc_and(pRExC_state, data->start_class, (regnode_charclass *) and_withp);
-                flags &= ~SCF_DO_STCLASS;
-            }
-        }
-        else if (PL_regkind[OP(scan)] == EOL && flags & SCF_DO_SUBSTR) {
-            data->flags |= (OP(scan) == MEOL
-                            ? SF_BEFORE_MEOL
-                            : SF_BEFORE_SEOL);
-            scan_commit(pRExC_state, data, minlenp, is_inf);
-
-        }
-        else if (  PL_regkind[OP(scan)] == BRANCHJ
-                 /* Lookbehind, or need to calculate parens/evals/stclass: */
-                   && (scan->flags || data || (flags & SCF_DO_STCLASS))
-                   && (OP(scan) == IFMATCH || OP(scan) == UNLESSM))
-        {
-            if ( !PERL_ENABLE_POSITIVE_ASSERTION_STUDY
-                || OP(scan) == UNLESSM )
-            {
-                /* Negative Lookahead/lookbehind
-                   In this case we can't do fixed string optimisation.
-                */
-
-                bool is_positive = OP(scan) == IFMATCH ? 1 : 0;
-                SSize_t deltanext, minnext;
-                SSize_t fake_last_close = 0;
-                regnode *fake_last_close_op = NULL;
-                regnode *cur_last_close_op;
-                regnode *nscan;
-                regnode_ssc intrnl;
-                U32 f = (flags & SCF_TRIE_DOING_RESTUDY);
-
-                StructCopy(&zero_scan_data, &data_fake, scan_data_t);
-                if (data) {
-                    data_fake.whilem_c = data->whilem_c;
-                    data_fake.last_closep = data->last_closep;
-                    data_fake.last_close_opp = data->last_close_opp;
-                }
-                else {
-                    data_fake.last_closep = &fake_last_close;
-                    data_fake.last_close_opp = &fake_last_close_op;
-                }
-
-                /* remember the last_close_op we saw so we can see if
-                 * we are dealing with variable length lookbehind that
-                 * contains capturing buffers, which are considered
-                 * experimental */
-                cur_last_close_op= *(data_fake.last_close_opp);
-
-                data_fake.pos_delta = delta;
-                if ( flags & SCF_DO_STCLASS && !scan->flags
-                     && OP(scan) == IFMATCH ) { /* Lookahead */
-                    ssc_init(pRExC_state, &intrnl);
-                    data_fake.start_class = &intrnl;
-                    f |= SCF_DO_STCLASS_AND;
-                }
-                if (flags & SCF_WHILEM_VISITED_POS)
-                    f |= SCF_WHILEM_VISITED_POS;
-                next = regnext(scan);
-                nscan = NEXTOPER(NEXTOPER(scan));
-
-                /* recurse study_chunk() for lookahead body */
-                minnext = study_chunk(pRExC_state, &nscan, minlenp, &deltanext,
-                                      last, &data_fake, stopparen,
-                                      recursed_depth, NULL, f, depth+1,
-                                      mutate_ok);
-
-                if (scan->flags) {
-                    if (   deltanext < 0
-                        || deltanext > (I32) U8_MAX
-                        || minnext > (I32)U8_MAX
-                        || minnext + deltanext > (I32)U8_MAX)
-                    {
-                        FAIL2("Lookbehind longer than %" UVuf " not implemented",
-                              (UV)U8_MAX);
-                    }
-
-                    /* The 'next_off' field has been repurposed to count the
-                     * additional starting positions to try beyond the initial
-                     * one.  (This leaves it at 0 for non-variable length
-                     * matches to avoid breakage for those not using this
-                     * extension) */
-                    if (deltanext)  {
-                        scan->next_off = deltanext;
-                        if (
-                            /* See a CLOSE op inside this lookbehind? */
-                            cur_last_close_op != *(data_fake.last_close_opp)
-                            /* and not doing restudy. see: restudied */
-                            && !(flags & SCF_TRIE_DOING_RESTUDY)
-                        ) {
-                            /* this is positive variable length lookbehind with
-                             * capture buffers inside of it */
-                            ckWARNexperimental_with_arg(RExC_parse,
-                                WARN_EXPERIMENTAL__VLB,
-                                "Variable length %s lookbehind with capturing is experimental",
-                                is_positive ? "positive" : "negative");
-                        }
-                    }
-                    scan->flags = (U8)minnext + deltanext;
-                }
-                if (data) {
-                    if (data_fake.flags & (SF_HAS_PAR|SF_IN_PAR))
-                        pars++;
-                    if (data_fake.flags & SF_HAS_EVAL)
-                        data->flags |= SF_HAS_EVAL;
-                    data->whilem_c = data_fake.whilem_c;
-                }
-                if (f & SCF_DO_STCLASS_AND) {
-                    if (flags & SCF_DO_STCLASS_OR) {
-                        /* OR before, AND after: ideally we would recurse with
-                         * data_fake to get the AND applied by study of the
-                         * remainder of the pattern, and then derecurse;
-                         * *** HACK *** for now just treat as "no information".
-                         * See [perl #56690].
-                         */
-                        ssc_init(pRExC_state, data->start_class);
-                    }  else {
-                        /* AND before and after: combine and continue.  These
-                         * assertions are zero-length, so can match an EMPTY
-                         * string */
-                        ssc_and(pRExC_state, data->start_class, (regnode_charclass *) &intrnl);
-                        ANYOF_FLAGS(data->start_class)
-                                                   |= SSC_MATCHES_EMPTY_STRING;
-                    }
-                }
-                DEBUG_STUDYDATA("end LOOKAROUND", data, depth, is_inf, min, stopmin, delta);
-            }
-#if PERL_ENABLE_POSITIVE_ASSERTION_STUDY
-            else {
-                /* Positive Lookahead/lookbehind
-                   In this case we can do fixed string optimisation,
-                   but we must be careful about it. Note in the case of
-                   lookbehind the positions will be offset by the minimum
-                   length of the pattern, something we won't know about
-                   until after the recurse.
-                */
-                SSize_t deltanext, fake_last_close = 0;
-                regnode *last_close_op = NULL;
-                regnode *nscan;
-                regnode_ssc intrnl;
-                U32 f = (flags & SCF_TRIE_DOING_RESTUDY);
-                /* We use SAVEFREEPV so that when the full compile
-                    is finished perl will clean up the allocated
-                    minlens when it's all done. This way we don't
-                    have to worry about freeing them when we know
-                    they wont be used, which would be a pain.
-                 */
-                SSize_t *minnextp;
-                Newx( minnextp, 1, SSize_t );
-                SAVEFREEPV(minnextp);
-
-                if (data) {
-                    StructCopy(data, &data_fake, scan_data_t);
-                    if ((flags & SCF_DO_SUBSTR) && data->last_found) {
-                        f |= SCF_DO_SUBSTR;
-                        if (scan->flags)
-                            scan_commit(pRExC_state, &data_fake, minlenp, is_inf);
-                        data_fake.last_found=newSVsv(data->last_found);
-                    }
-                }
-                else {
-                    data_fake.last_closep = &fake_last_close;
-                    data_fake.last_close_opp = &fake_last_close_opp;
-                }
-                data_fake.flags = 0;
-                data_fake.substrs[0].flags = 0;
-                data_fake.substrs[1].flags = 0;
-                data_fake.pos_delta = delta;
-                if (is_inf)
-                    data_fake.flags |= SF_IS_INF;
-                if ( flags & SCF_DO_STCLASS && !scan->flags
-                     && OP(scan) == IFMATCH ) { /* Lookahead */
-                    ssc_init(pRExC_state, &intrnl);
-                    data_fake.start_class = &intrnl;
-                    f |= SCF_DO_STCLASS_AND;
-                }
-                if (flags & SCF_WHILEM_VISITED_POS)
-                    f |= SCF_WHILEM_VISITED_POS;
-                next = regnext(scan);
-                nscan = NEXTOPER(NEXTOPER(scan));
-
-                /* positive lookahead study_chunk() recursion */
-                *minnextp = study_chunk(pRExC_state, &nscan, minnextp,
-                                        &deltanext, last, &data_fake,
-                                        stopparen, recursed_depth, NULL,
-                                        f, depth+1, mutate_ok);
-                if (scan->flags) {
-                    assert(0);  /* This code has never been tested since this
-                                   is normally not compiled */
-                    if (   deltanext < 0
-                        || deltanext > (I32) U8_MAX
-                        || *minnextp > (I32)U8_MAX
-                        || *minnextp + deltanext > (I32)U8_MAX)
-                    {
-                        FAIL2("Lookbehind longer than %" UVuf " not implemented",
-                              (UV)U8_MAX);
-                    }
-
-                    if (deltanext) {
-                        scan->next_off = deltanext;
-                    }
-                    scan->flags = (U8)*minnextp + deltanext;
-                }
-
-                *minnextp += min;
-
-                if (f & SCF_DO_STCLASS_AND) {
-                    ssc_and(pRExC_state, data->start_class, (regnode_charclass *) &intrnl);
-                    ANYOF_FLAGS(data->start_class) |= SSC_MATCHES_EMPTY_STRING;
-                }
-                if (data) {
-                    if (data_fake.flags & (SF_HAS_PAR|SF_IN_PAR))
-                        pars++;
-                    if (data_fake.flags & SF_HAS_EVAL)
-                        data->flags |= SF_HAS_EVAL;
-                    data->whilem_c = data_fake.whilem_c;
-                    if ((flags & SCF_DO_SUBSTR) && data_fake.last_found) {
-                        int i;
-                        if (RExC_rx->minlen < *minnextp)
-                            RExC_rx->minlen = *minnextp;
-                        scan_commit(pRExC_state, &data_fake, minnextp, is_inf);
-                        SvREFCNT_dec_NN(data_fake.last_found);
-
-                        for (i = 0; i < 2; i++) {
-                            if (data_fake.substrs[i].minlenp != minlenp) {
-                                data->substrs[i].min_offset =
-                                            data_fake.substrs[i].min_offset;
-                                data->substrs[i].max_offset =
-                                            data_fake.substrs[i].max_offset;
-                                data->substrs[i].minlenp =
-                                            data_fake.substrs[i].minlenp;
-                                data->substrs[i].lookbehind += scan->flags;
-                            }
-                        }
-                    }
-                }
-            }
-#endif
-        }
-        else if (OP(scan) == OPEN) {
-            if (stopparen != (I32)ARG(scan))
-                pars++;
-        }
-        else if (OP(scan) == CLOSE) {
-            if (stopparen == (I32)ARG(scan)) {
-                break;
-            }
-            if ((I32)ARG(scan) == is_par) {
-                next = regnext(scan);
-
-                if ( next && (OP(next) != WHILEM) && next < last)
-                    is_par = 0;                /* Disable optimization */
-            }
-            if (data) {
-                *(data->last_closep) = ARG(scan);
-                *(data->last_close_opp) = scan;
-            }
-        }
-        else if (OP(scan) == EVAL) {
-            if (data)
-                data->flags |= SF_HAS_EVAL;
-        }
-        else if ( PL_regkind[OP(scan)] == ENDLIKE ) {
-            if (flags & SCF_DO_SUBSTR) {
-                scan_commit(pRExC_state, data, minlenp, is_inf);
-                flags &= ~SCF_DO_SUBSTR;
-            }
-            if (OP(scan)==ACCEPT) {
-                /* m{(*ACCEPT)x} does not have to start with 'x' */
-                flags &= ~SCF_DO_STCLASS;
-                if (data)
-                    data->flags |= SCF_SEEN_ACCEPT;
-                if (stopmin > min)
-                    stopmin = min;
-            }
-        }
-        else if (OP(scan) == COMMIT) {
-            /* gh18770: m{abc(*COMMIT)xyz} must fail on "abc abcxyz", so we
-             * must not end up with "abcxyz" as a fixed substring else we'll
-             * skip straight to attempting to match at offset 4.
-             */
-            if (flags & SCF_DO_SUBSTR) {
-                scan_commit(pRExC_state, data, minlenp, is_inf);
-                flags &= ~SCF_DO_SUBSTR;
-            }
-        }
-        else if (OP(scan) == LOGICAL && scan->flags == 2) /* Embedded follows */
-        {
-                if (flags & SCF_DO_SUBSTR) {
-                    scan_commit(pRExC_state, data, minlenp, is_inf);
-                    data->cur_is_floating = 1; /* float */
-                }
-                is_inf = is_inf_internal = 1;
-                if (flags & SCF_DO_STCLASS_OR) /* Allow everything */
-                    ssc_anything(data->start_class);
-                flags &= ~SCF_DO_STCLASS;
-        }
-        else if (OP(scan) == GPOS) {
-            if (!(RExC_rx->intflags & PREGf_GPOS_FLOAT) &&
-                !(delta || is_inf || (data && data->pos_delta)))
-            {
-                if (!(RExC_rx->intflags & PREGf_ANCH) && (flags & SCF_DO_SUBSTR))
-                    RExC_rx->intflags |= PREGf_ANCH_GPOS;
-                if (RExC_rx->gofs < (STRLEN)min)
-                    RExC_rx->gofs = min;
-            } else {
-                RExC_rx->intflags |= PREGf_GPOS_FLOAT;
-                RExC_rx->gofs = 0;
-            }
-        }
-#ifdef TRIE_STUDY_OPT
-#ifdef FULL_TRIE_STUDY
-        else if (PL_regkind[OP(scan)] == TRIE) {
-            /* NOTE - There is similar code to this block above for handling
-               BRANCH nodes on the initial study.  If you change stuff here
-               check there too. */
-            regnode *trie_node= scan;
-            regnode *tail= regnext(scan);
-            reg_trie_data *trie = (reg_trie_data*)RExC_rxi->data->data[ ARG(scan) ];
-            SSize_t max1 = 0, min1 = OPTIMIZE_INFTY;
-            regnode_ssc accum;
-
-            if (flags & SCF_DO_SUBSTR) { /* XXXX Add !SUSPEND? */
-                /* Cannot merge strings after this. */
-                scan_commit(pRExC_state, data, minlenp, is_inf);
-            }
-            if (flags & SCF_DO_STCLASS)
-                ssc_init_zero(pRExC_state, &accum);
-
-            if (!trie->jump) {
-                min1= trie->minlen;
-                max1= trie->maxlen;
-            } else {
-                const regnode *nextbranch= NULL;
-                U32 word;
-
-                for ( word=1 ; word <= trie->wordcount ; word++)
-                {
-                    SSize_t deltanext = 0, minnext = 0;
-                    U32 f = (flags & SCF_TRIE_DOING_RESTUDY);
-                    SSize_t fake_last_close = 0;
-                    regnode *fake_last_close_op = NULL;
-                    regnode_ssc this_class;
-
-                    StructCopy(&zero_scan_data, &data_fake, scan_data_t);
-                    if (data) {
-                        data_fake.whilem_c = data->whilem_c;
-                        data_fake.last_closep = data->last_closep;
-                        data_fake.last_close_opp = data->last_close_opp;
-                    }
-                    else {
-                        data_fake.last_closep = &fake_last_close;
-                        data_fake.last_close_opp = &fake_last_close_op;
-                    }
-                    data_fake.pos_delta = delta;
-                    if (flags & SCF_DO_STCLASS) {
-                        ssc_init(pRExC_state, &this_class);
-                        data_fake.start_class = &this_class;
-                        f |= SCF_DO_STCLASS_AND;
-                    }
-                    if (flags & SCF_WHILEM_VISITED_POS)
-                        f |= SCF_WHILEM_VISITED_POS;
-
-                    if (trie->jump[word]) {
-                        if (!nextbranch)
-                            nextbranch = trie_node + trie->jump[0];
-                        scan= trie_node + trie->jump[word];
-                        /* We go from the jump point to the branch that follows
-                           it. Note this means we need the vestigal unused
-                           branches even though they arent otherwise used. */
-                        /* optimise study_chunk() for TRIE */
-                        minnext = study_chunk(pRExC_state, &scan, minlenp,
-                            &deltanext, (regnode *)nextbranch, &data_fake,
-                            stopparen, recursed_depth, NULL, f, depth+1,
-                            mutate_ok);
-                    }
-                    if (nextbranch && PL_regkind[OP(nextbranch)]==BRANCH)
-                        nextbranch= regnext((regnode*)nextbranch);
-
-                    if (min1 > (SSize_t)(minnext + trie->minlen))
-                        min1 = minnext + trie->minlen;
-                    if (deltanext == OPTIMIZE_INFTY) {
-                        is_inf = is_inf_internal = 1;
-                        max1 = OPTIMIZE_INFTY;
-                    } else if (max1 < (SSize_t)(minnext + deltanext + trie->maxlen))
-                        max1 = minnext + deltanext + trie->maxlen;
-
-                    if (data_fake.flags & (SF_HAS_PAR|SF_IN_PAR))
-                        pars++;
-                    if (data_fake.flags & SCF_SEEN_ACCEPT) {
-                        if ( stopmin > min + min1)
-                            stopmin = min + min1;
-                        flags &= ~SCF_DO_SUBSTR;
-                        if (data)
-                            data->flags |= SCF_SEEN_ACCEPT;
-                    }
-                    if (data) {
-                        if (data_fake.flags & SF_HAS_EVAL)
-                            data->flags |= SF_HAS_EVAL;
-                        data->whilem_c = data_fake.whilem_c;
-                    }
-                    if (flags & SCF_DO_STCLASS)
-                        ssc_or(pRExC_state, &accum, (regnode_charclass *) &this_class);
-                }
-                DEBUG_STUDYDATA("after JUMPTRIE", data, depth, is_inf, min, stopmin, delta);
-            }
-            if (flags & SCF_DO_SUBSTR) {
-                data->pos_min += min1;
-                data->pos_delta += max1 - min1;
-                if (max1 != min1 || is_inf)
-                    data->cur_is_floating = 1; /* float */
-            }
-            min += min1;
-            if (delta != OPTIMIZE_INFTY) {
-                if (OPTIMIZE_INFTY - (max1 - min1) >= delta)
-                    delta += max1 - min1;
-                else
-                    delta = OPTIMIZE_INFTY;
-            }
-            if (flags & SCF_DO_STCLASS_OR) {
-                ssc_or(pRExC_state, data->start_class, (regnode_charclass *) &accum);
-                if (min1) {
-                    ssc_and(pRExC_state, data->start_class, (regnode_charclass *) and_withp);
-                    flags &= ~SCF_DO_STCLASS;
-                }
-            }
-            else if (flags & SCF_DO_STCLASS_AND) {
-                if (min1) {
-                    ssc_and(pRExC_state, data->start_class, (regnode_charclass *) &accum);
-                    flags &= ~SCF_DO_STCLASS;
-                }
-                else {
-                    /* Switch to OR mode: cache the old value of
-                     * data->start_class */
-                    INIT_AND_WITHP;
-                    StructCopy(data->start_class, and_withp, regnode_ssc);
-                    flags &= ~SCF_DO_STCLASS_AND;
-                    StructCopy(&accum, data->start_class, regnode_ssc);
-                    flags |= SCF_DO_STCLASS_OR;
-                }
-            }
-            scan= tail;
-            DEBUG_STUDYDATA("after TRIE study", data, depth, is_inf, min, stopmin, delta);
-            continue;
-        }
-#else
-        else if (PL_regkind[OP(scan)] == TRIE) {
-            reg_trie_data *trie = (reg_trie_data*)RExC_rxi->data->data[ ARG(scan) ];
-            U8*bang=NULL;
-
-            min += trie->minlen;
-            delta += (trie->maxlen - trie->minlen);
-            flags &= ~SCF_DO_STCLASS; /* xxx */
-            if (flags & SCF_DO_SUBSTR) {
-                /* Cannot expect anything... */
-                scan_commit(pRExC_state, data, minlenp, is_inf);
-                data->pos_min += trie->minlen;
-                data->pos_delta += (trie->maxlen - trie->minlen);
-                if (trie->maxlen != trie->minlen)
-                    data->cur_is_floating = 1; /* float */
-            }
-            if (trie->jump) /* no more substrings -- for now /grr*/
-               flags &= ~SCF_DO_SUBSTR;
-        }
-
-#endif /* old or new */
-#endif /* TRIE_STUDY_OPT */
-
-        else if (OP(scan) == REGEX_SET) {
-            Perl_croak(aTHX_ "panic: %s regnode should be resolved"
-                             " before optimization", PL_reg_name[REGEX_SET]);
-        }
-
-        /* Else: zero-length, ignore. */
-        scan = regnext(scan);
-    }
-
-  finish:
-    if (frame) {
-        /* we need to unwind recursion. */
-        depth = depth - 1;
-
-        DEBUG_STUDYDATA("frame-end", data, depth, is_inf, min, stopmin, delta);
-        DEBUG_PEEP("fend", scan, depth, flags);
-
-        /* restore previous context */
-        last = frame->last_regnode;
-        scan = frame->next_regnode;
-        stopparen = frame->stopparen;
-        recursed_depth = frame->prev_recursed_depth;
-
-        RExC_frame_last = frame->prev_frame;
-        frame = frame->this_prev_frame;
-        goto fake_study_recurse;
-    }
-
-    assert(!frame);
-    DEBUG_STUDYDATA("pre-fin", data, depth, is_inf, min, stopmin, delta);
-
-    /* is this pattern infinite? Eg, consider /(a|b+)/ */
-    if (is_inf_internal)
-        delta = OPTIMIZE_INFTY;
-
-    /* deal with (*ACCEPT), Eg, consider /(foo(*ACCEPT)|bop)bar/ */
-    if (min > stopmin) {
-        /*
-        At this point 'min' represents the minimum length string we can
-        match while *ignoring* the implication of ACCEPT, and 'delta'
-        represents the difference between the minimum length and maximum
-        length, and if the pattern matches an infinitely long string
-        (consider the + and * quantifiers) then we use the special delta
-        value of OPTIMIZE_INFTY to represent it. 'stopmin' is the
-        minimum length that can be matched *and* accepted.
-
-        A pattern is accepted when matching was successful *and*
-        complete, and thus there is no further matching needing to be
-        done, no backtracking to occur, etc. Prior to the introduction
-        of ACCEPT the only opcode that signaled acceptance was the END
-        opcode, which is always the very last opcode in a regex program.
-        ACCEPT is thus conceptually an early successful return out of
-        the matching process. stopmin starts out as OPTIMIZE_INFTY to
-        represent "the entire pattern", and is ratched down to the
-        "current min" if necessary when an ACCEPT opcode is encountered.
-
-        Thus stopmin might be smaller than min if we saw an (*ACCEPT),
-        and we now need to account for it in both min and delta.
-        Consider that in a pattern /AB/ normally the min length it can
-        match can be computed as min(A)+min(B). But (*ACCEPT) means
-        that it might be something else, not even neccesarily min(A) at
-        all. Consider
-
-             A  = /(foo(*ACCEPT)|x+)/
-             B  = /whop/
-             AB = /(foo(*ACCEPT)|x+)whop/
-
-        The min for A is 1 for "x" and the delta for A is OPTIMIZE_INFTY
-        for "xxxxx...", its stopmin is 3 for "foo". The min for B is 4 for
-        "whop", and the delta of 0 as the pattern is of fixed length, the
-        stopmin would be OPTIMIZE_INFTY as it does not contain an ACCEPT.
-        When handling AB we expect to see a min of 5 for "xwhop", and a
-        delta of OPTIMIZE_INFTY for "xxxxx...whop", and a stopmin of 3
-        for "foo". This should result in a final min of 3 for "foo", and
-        a final delta of OPTIMIZE_INFTY for "xxxxx...whop".
-
-        In something like /(dude(*ACCEPT)|irk)x{3,7}/ we would have a
-        min of 6 for "irkxxx" and a delta of 4 for "irkxxxxxxx", and the
-        stop min would be 4 for "dude". This should result in a final
-        min of 4 for "dude", and a final delta of 6, for "irkxxxxxxx".
-
-        When min is smaller than stopmin then we can ignore it. In the
-        fragment /(x{10,20}(*ACCEPT)|a)b+/, we would have a min of 2,
-        and a delta of OPTIMIZE_INFTY, and a stopmin of 10. Obviously
-        the ACCEPT doesn't reduce the minimum length of the string that
-        might be matched, nor affect the maximum length.
-
-        In something like /foo(*ACCEPT)ba?r/ we would have a min of 5
-        for "foobr", a delta of 1 for "foobar", and a stopmin of 3 for
-        "foo". We currently turn this into a min of 3 for "foo" and a
-        delta of 3 for "foobar" even though technically "foobar" isn't
-        possible. ACCEPT affects some aspects of the optimizer, like
-        length computations and mandatory substring optimizations, but
-        there are other optimzations this routine perfoms that are not
-        affected and this compromise simplifies implementation.
-
-        It might be helpful to consider that this C function is called
-        recursively on the pattern in a bottom up fashion, and that the
-        min returned by a nested call may be marked as coming from an
-        ACCEPT, causing its callers to treat the returned min as a
-        stopmin as the recursion unwinds. Thus a single ACCEPT can affect
-        multiple calls into this function in different ways.
-        */
-
-        if (OPTIMIZE_INFTY - delta >= min - stopmin)
-            delta += min - stopmin;
-        else
-            delta = OPTIMIZE_INFTY;
-        min = stopmin;
-    }
-
-    *scanp = scan;
-    *deltap = delta;
-
-    if (flags & SCF_DO_SUBSTR && is_inf)
-        data->pos_delta = OPTIMIZE_INFTY - data->pos_min;
-    if (is_par > (I32)U8_MAX)
-        is_par = 0;
-    if (is_par && pars==1 && data) {
-        data->flags |= SF_IN_PAR;
-        data->flags &= ~SF_HAS_PAR;
-    }
-    else if (pars && data) {
-        data->flags |= SF_HAS_PAR;
-        data->flags &= ~SF_IN_PAR;
-    }
-    if (flags & SCF_DO_STCLASS_OR)
-        ssc_and(pRExC_state, data->start_class, (regnode_charclass *) and_withp);
-    if (flags & SCF_TRIE_RESTUDY)
-        data->flags |=         SCF_TRIE_RESTUDY;
-
-
-    if (!(RExC_seen & REG_UNBOUNDED_QUANTIFIER_SEEN)) {
-        if (min > OPTIMIZE_INFTY - delta)
-            RExC_maxlen = OPTIMIZE_INFTY;
-        else if (RExC_maxlen < min + delta)
-            RExC_maxlen = min + delta;
-    }
-    DEBUG_STUDYDATA("post-fin", data, depth, is_inf, min, stopmin, delta);
-    return min;
-}
-
-/* add a data member to the struct reg_data attached to this regex, it should
- * always return a non-zero return. the 's' argument is the type of the items
- * being added and the n is the number of items. The length of 's' should match
- * the number of items. */
-STATIC U32
-S_add_data(RExC_state_t* const pRExC_state, const char* const s, const U32 n)
-{
-    U32 count = RExC_rxi->data ? RExC_rxi->data->count : 1;
-
-    PERL_ARGS_ASSERT_ADD_DATA;
-
-    /* in the below expression we have (count + n - 1), the minus one is there
-     * because the struct that we allocate already contains a slot for 1 data
-     * item, so we do not need to allocate it the first time. IOW, the
-     * sizeof(*RExC_rxi->data) already accounts for one of the elements we need
-     * to allocate. See struct reg_data in regcomp.h
-     */
-    Renewc(RExC_rxi->data,
-           sizeof(*RExC_rxi->data) + (sizeof(void*) * (count + n - 1)),
-           char, struct reg_data);
-    /* however in the data->what expression we use (count + n) and do not
-     * subtract one from the result because the data structure contains a
-     * pointer to an array, and does not allocate the first element as part of
-     * the data struct. */
-    if (count > 1)
-        Renew(RExC_rxi->data->what, (count + n), U8);
-    else {
-        /* when count == 1 it means we have not initialized anything.
-         * we always fill the 0 slot of the data array with a '%' entry, which
-         * means "zero" (all the other types are letters) which exists purely
-         * so the return from add_data is ALWAYS true, so we can tell it apart
-         * from a "no value" idx=0 in places where we would return an index
-         * into add_data.  This is particularly important with the new "single
-         * pass, usually, but not always" strategy that we use, where the code
-         * will use a 0 to represent "not able to compute this yet".
-         */
-        Newx(RExC_rxi->data->what, n+1, U8);
-        /* fill in the placeholder slot of 0 with a what of '%', we use
-         * this because it sorta looks like a zero (0/0) and it is not a letter
-         * like any of the other "whats", this type should never be created
-         * any other way but here. '%' happens to also not appear in this
-         * file for any other reason (at the time of writing this comment)*/
-        RExC_rxi->data->what[0]= '%';
-        RExC_rxi->data->data[0]= NULL;
-    }
-    RExC_rxi->data->count = count + n;
-    Copy(s, RExC_rxi->data->what + count, n, U8);
-    assert(count>0);
-    return count;
-}
-
-/*XXX: todo make this not included in a non debugging perl, but appears to be
- * used anyway there, in 'use re' */
-#ifndef PERL_IN_XSUB_RE
-void
-Perl_reginitcolors(pTHX)
-{
-    const char * const s = PerlEnv_getenv("PERL_RE_COLORS");
-    if (s) {
-        char *t = savepv(s);
-        int i = 0;
-        PL_colors[0] = t;
-        while (++i < 6) {
-            t = strchr(t, '\t');
-            if (t) {
-                *t = '\0';
-                PL_colors[i] = ++t;
-            }
-            else
-                PL_colors[i] = t = (char *)"";
-        }
-    } else {
-        int i = 0;
-        while (i < 6)
-            PL_colors[i++] = (char *)"";
-    }
-    PL_colorset = 1;
-}
-#endif
-
-
-#ifdef TRIE_STUDY_OPT
-/* search for "restudy" in this file for a detailed explanation */
-#define CHECK_RESTUDY_GOTO_butfirst(dOsomething)            \
-    STMT_START {                                            \
-        if (                                                \
-              (data.flags & SCF_TRIE_RESTUDY)               \
-              && ! restudied++                              \
-        ) {                                                 \
-            dOsomething;                                    \
-            goto reStudy;                                   \
-        }                                                   \
-    } STMT_END
-#else
-#define CHECK_RESTUDY_GOTO_butfirst
-#endif
-
-/*
- * pregcomp - compile a regular expression into internal code
- *
- * Decides which engine's compiler to call based on the hint currently in
- * scope
- */
-
-#ifndef PERL_IN_XSUB_RE
-
-/* return the currently in-scope regex engine (or the default if none)  */
-
-regexp_engine const *
-Perl_current_re_engine(pTHX)
-{
-    if (IN_PERL_COMPILETIME) {
-        HV * const table = GvHV(PL_hintgv);
-        SV **ptr;
-
-        if (!table || !(PL_hints & HINT_LOCALIZE_HH))
-            return &PL_core_reg_engine;
-        ptr = hv_fetchs(table, "regcomp", FALSE);
-        if ( !(ptr && SvIOK(*ptr) && SvIV(*ptr)))
-            return &PL_core_reg_engine;
-        return INT2PTR(regexp_engine*, SvIV(*ptr));
-    }
-    else {
-        SV *ptr;
-        if (!PL_curcop->cop_hints_hash)
-            return &PL_core_reg_engine;
-        ptr = cop_hints_fetch_pvs(PL_curcop, "regcomp", 0);
-        if ( !(ptr && SvIOK(ptr) && SvIV(ptr)))
-            return &PL_core_reg_engine;
-        return INT2PTR(regexp_engine*, SvIV(ptr));
-    }
-}
-
-
-REGEXP *
-Perl_pregcomp(pTHX_ SV * const pattern, const U32 flags)
-{
-    regexp_engine const *eng = current_re_engine();
-    DECLARE_AND_GET_RE_DEBUG_FLAGS;
-
-    PERL_ARGS_ASSERT_PREGCOMP;
-
-    /* Dispatch a request to compile a regexp to correct regexp engine. */
-    DEBUG_COMPILE_r({
-        Perl_re_printf( aTHX_  "Using engine %" UVxf "\n",
-                        PTR2UV(eng));
-    });
-    return CALLREGCOMP_ENG(eng, pattern, flags);
-}
-#endif
-
-/*
-=for apidoc re_compile
-
-Compile the regular expression pattern C<pattern>, returning a pointer to the
-compiled object for later matching with the internal regex engine.
-
-This function is typically used by a custom regexp engine C<.comp()> function
-to hand off to the core regexp engine those patterns it doesn't want to handle
-itself (typically passing through the same flags it was called with).  In
-almost all other cases, a regexp should be compiled by calling L</C<pregcomp>>
-to compile using the currently active regexp engine.
-
-If C<pattern> is already a C<REGEXP>, this function does nothing but return a
-pointer to the input.  Otherwise the PV is extracted and treated like a string
-representing a pattern.  See L<perlre>.
-
-The possible flags for C<rx_flags> are documented in L<perlreapi>.  Their names
-all begin with C<RXf_>.
-
-=cut
-
- * public entry point for the perl core's own regex compiling code.
- * It's actually a wrapper for Perl_re_op_compile that only takes an SV
- * pattern rather than a list of OPs, and uses the internal engine rather
- * than the current one */
-
-REGEXP *
-Perl_re_compile(pTHX_ SV * const pattern, U32 rx_flags)
-{
-    SV *pat = pattern; /* defeat constness! */
-
-    PERL_ARGS_ASSERT_RE_COMPILE;
-
-    return Perl_re_op_compile(aTHX_ &pat, 1, NULL,
-#ifdef PERL_IN_XSUB_RE
-                                &my_reg_engine,
-#else
-                                &PL_core_reg_engine,
-#endif
-                                NULL, NULL, rx_flags, 0);
-}
-
-static void
-S_free_codeblocks(pTHX_ struct reg_code_blocks *cbs)
-{
-    int n;
-
-    if (--cbs->refcnt > 0)
-        return;
-    for (n = 0; n < cbs->count; n++) {
-        REGEXP *rx = cbs->cb[n].src_regex;
-        if (rx) {
-            cbs->cb[n].src_regex = NULL;
-            SvREFCNT_dec_NN(rx);
-        }
-    }
-    Safefree(cbs->cb);
-    Safefree(cbs);
-}
-
-
-static struct reg_code_blocks *
-S_alloc_code_blocks(pTHX_  int ncode)
-{
-     struct reg_code_blocks *cbs;
-    Newx(cbs, 1, struct reg_code_blocks);
-    cbs->count = ncode;
-    cbs->refcnt = 1;
-    SAVEDESTRUCTOR_X(S_free_codeblocks, cbs);
-    if (ncode)
-        Newx(cbs->cb, ncode, struct reg_code_block);
-    else
-        cbs->cb = NULL;
-    return cbs;
-}
-
-
-/* upgrade pattern pat_p of length plen_p to UTF8, and if there are code
- * blocks, recalculate the indices. Update pat_p and plen_p in-place to
- * point to the realloced string and length.
- *
- * This is essentially a copy of Perl_bytes_to_utf8() with the code index
- * stuff added */
-
-static void
-S_pat_upgrade_to_utf8(pTHX_ RExC_state_t * const pRExC_state,
-                    char **pat_p, STRLEN *plen_p, int num_code_blocks)
-{
-    U8 *const src = (U8*)*pat_p;
-    U8 *dst, *d;
-    int n=0;
-    STRLEN s = 0;
-    bool do_end = 0;
-    DECLARE_AND_GET_RE_DEBUG_FLAGS;
-
-    DEBUG_PARSE_r(Perl_re_printf( aTHX_
-        "UTF8 mismatch! Converting to utf8 for resizing and compile\n"));
-
-    /* 1 for each byte + 1 for each byte that expands to two, + trailing NUL */
-    Newx(dst, *plen_p + variant_under_utf8_count(src, src + *plen_p) + 1, U8);
-    d = dst;
-
-    while (s < *plen_p) {
-        append_utf8_from_native_byte(src[s], &d);
-
-        if (n < num_code_blocks) {
-            assert(pRExC_state->code_blocks);
-            if (!do_end && pRExC_state->code_blocks->cb[n].start == s) {
-                pRExC_state->code_blocks->cb[n].start = d - dst - 1;
-                assert(*(d - 1) == '(');
-                do_end = 1;
-            }
-            else if (do_end && pRExC_state->code_blocks->cb[n].end == s) {
-                pRExC_state->code_blocks->cb[n].end = d - dst - 1;
-                assert(*(d - 1) == ')');
-                do_end = 0;
-                n++;
-            }
-        }
-        s++;
-    }
-    *d = '\0';
-    *plen_p = d - dst;
-    *pat_p = (char*) dst;
-    SAVEFREEPV(*pat_p);
-    RExC_orig_utf8 = RExC_utf8 = 1;
-}
-
-
-
-/* S_concat_pat(): concatenate a list of args to the pattern string pat,
- * while recording any code block indices, and handling overloading,
- * nested qr// objects etc.  If pat is null, it will allocate a new
- * string, or just return the first arg, if there's only one.
- *
- * Returns the malloced/updated pat.
- * patternp and pat_count is the array of SVs to be concatted;
- * oplist is the optional list of ops that generated the SVs;
- * recompile_p is a pointer to a boolean that will be set if
- *   the regex will need to be recompiled.
- * delim, if non-null is an SV that will be inserted between each element
- */
-
-static SV*
-S_concat_pat(pTHX_ RExC_state_t * const pRExC_state,
-                SV *pat, SV ** const patternp, int pat_count,
-                OP *oplist, bool *recompile_p, SV *delim)
-{
-    SV **svp;
-    int n = 0;
-    bool use_delim = FALSE;
-    bool alloced = FALSE;
-
-    /* if we know we have at least two args, create an empty string,
-     * then concatenate args to that. For no args, return an empty string */
-    if (!pat && pat_count != 1) {
-        pat = newSVpvs("");
-        SAVEFREESV(pat);
-        alloced = TRUE;
-    }
-
-    for (svp = patternp; svp < patternp + pat_count; svp++) {
-        SV *sv;
-        SV *rx  = NULL;
-        STRLEN orig_patlen = 0;
-        bool code = 0;
-        SV *msv = use_delim ? delim : *svp;
-        if (!msv) msv = &PL_sv_undef;
-
-        /* if we've got a delimiter, we go round the loop twice for each
-         * svp slot (except the last), using the delimiter the second
-         * time round */
-        if (use_delim) {
-            svp--;
-            use_delim = FALSE;
-        }
-        else if (delim)
-            use_delim = TRUE;
-
-        if (SvTYPE(msv) == SVt_PVAV) {
-            /* we've encountered an interpolated array within
-             * the pattern, e.g. /...@a..../. Expand the list of elements,
-             * then recursively append elements.
-             * The code in this block is based on S_pushav() */
-
-            AV *const av = (AV*)msv;
-            const SSize_t maxarg = AvFILL(av) + 1;
-            SV **array;
-
-            if (oplist) {
-                assert(oplist->op_type == OP_PADAV
-                    || oplist->op_type == OP_RV2AV);
-                oplist = OpSIBLING(oplist);
-            }
-
-            if (SvRMAGICAL(av)) {
-                SSize_t i;
-
-                Newx(array, maxarg, SV*);
-                SAVEFREEPV(array);
-                for (i=0; i < maxarg; i++) {
-                    SV ** const svp = av_fetch(av, i, FALSE);
-                    array[i] = svp ? *svp : &PL_sv_undef;
-                }
-            }
-            else
-                array = AvARRAY(av);
-
-            pat = S_concat_pat(aTHX_ pRExC_state, pat,
-                                array, maxarg, NULL, recompile_p,
-                                /* $" */
-                                GvSV((gv_fetchpvs("\"", GV_ADDMULTI, SVt_PV))));
-
-            continue;
-        }
-
-
-        /* we make the assumption here that each op in the list of
-         * op_siblings maps to one SV pushed onto the stack,
-         * except for code blocks, with have both an OP_NULL and
-         * an OP_CONST.
-         * This allows us to match up the list of SVs against the
-         * list of OPs to find the next code block.
-         *
-         * Note that       PUSHMARK PADSV PADSV ..
-         * is optimised to
-         *                 PADRANGE PADSV  PADSV  ..
-         * so the alignment still works. */
-
-        if (oplist) {
-            if (oplist->op_type == OP_NULL
-                && (oplist->op_flags & OPf_SPECIAL))
-            {
-                assert(n < pRExC_state->code_blocks->count);
-                pRExC_state->code_blocks->cb[n].start = pat ? SvCUR(pat) : 0;
-                pRExC_state->code_blocks->cb[n].block = oplist;
-                pRExC_state->code_blocks->cb[n].src_regex = NULL;
-                n++;
-                code = 1;
-                oplist = OpSIBLING(oplist); /* skip CONST */
-                assert(oplist);
-            }
-            oplist = OpSIBLING(oplist);;
-        }
-
-        /* apply magic and QR overloading to arg */
-
-        SvGETMAGIC(msv);
-        if (SvROK(msv) && SvAMAGIC(msv)) {
-            SV *sv = AMG_CALLunary(msv, regexp_amg);
-            if (sv) {
-                if (SvROK(sv))
-                    sv = SvRV(sv);
-                if (SvTYPE(sv) != SVt_REGEXP)
-                    Perl_croak(aTHX_ "Overloaded qr did not return a REGEXP");
-                msv = sv;
-            }
-        }
-
-        /* try concatenation overload ... */
-        if (pat && (SvAMAGIC(pat) || SvAMAGIC(msv)) &&
-                (sv = amagic_call(pat, msv, concat_amg, AMGf_assign)))
-        {
-            sv_setsv(pat, sv);
-            /* overloading involved: all bets are off over literal
-             * code. Pretend we haven't seen it */
-            if (n)
-                pRExC_state->code_blocks->count -= n;
-            n = 0;
-        }
-        else {
-            /* ... or failing that, try "" overload */
-            while (SvAMAGIC(msv)
-                    && (sv = AMG_CALLunary(msv, string_amg))
-                    && sv != msv
-                    &&  !(   SvROK(msv)
-                          && SvROK(sv)
-                          && SvRV(msv) == SvRV(sv))
-            ) {
-                msv = sv;
-                SvGETMAGIC(msv);
-            }
-            if (SvROK(msv) && SvTYPE(SvRV(msv)) == SVt_REGEXP)
-                msv = SvRV(msv);
-
-            if (pat) {
-                /* this is a partially unrolled
-                 *     sv_catsv_nomg(pat, msv);
-                 * that allows us to adjust code block indices if
-                 * needed */
-                STRLEN dlen;
-                char *dst = SvPV_force_nomg(pat, dlen);
-                orig_patlen = dlen;
-                if (SvUTF8(msv) && !SvUTF8(pat)) {
-                    S_pat_upgrade_to_utf8(aTHX_ pRExC_state, &dst, &dlen, n);
-                    sv_setpvn(pat, dst, dlen);
-                    SvUTF8_on(pat);
-                }
-                sv_catsv_nomg(pat, msv);
-                rx = msv;
-            }
-            else {
-                /* We have only one SV to process, but we need to verify
-                 * it is properly null terminated or we will fail asserts
-                 * later. In theory we probably shouldn't get such SV's,
-                 * but if we do we should handle it gracefully. */
-                if ( SvTYPE(msv) != SVt_PV || (SvLEN(msv) > SvCUR(msv) && *(SvEND(msv)) == 0) || SvIsCOW_shared_hash(msv) ) {
-                    /* not a string, or a string with a trailing null */
-                    pat = msv;
-                } else {
-                    /* a string with no trailing null, we need to copy it
-                     * so it has a trailing null */
-                    pat = sv_2mortal(newSVsv(msv));
-                }
-            }
-
-            if (code)
-                pRExC_state->code_blocks->cb[n-1].end = SvCUR(pat)-1;
-        }
-
-        /* extract any code blocks within any embedded qr//'s */
-        if (rx && SvTYPE(rx) == SVt_REGEXP
-            && RX_ENGINE((REGEXP*)rx)->op_comp)
-        {
-
-            RXi_GET_DECL(ReANY((REGEXP *)rx), ri);
-            if (ri->code_blocks && ri->code_blocks->count) {
-                int i;
-                /* the presence of an embedded qr// with code means
-                 * we should always recompile: the text of the
-                 * qr// may not have changed, but it may be a
-                 * different closure than last time */
-                *recompile_p = 1;
-                if (pRExC_state->code_blocks) {
-                    int new_count = pRExC_state->code_blocks->count
-                            + ri->code_blocks->count;
-                    Renew(pRExC_state->code_blocks->cb,
-                            new_count, struct reg_code_block);
-                    pRExC_state->code_blocks->count = new_count;
-                }
-                else
-                    pRExC_state->code_blocks = S_alloc_code_blocks(aTHX_
-                                                    ri->code_blocks->count);
-
-                for (i=0; i < ri->code_blocks->count; i++) {
-                    struct reg_code_block *src, *dst;
-                    STRLEN offset =  orig_patlen
-                        + ReANY((REGEXP *)rx)->pre_prefix;
-                    assert(n < pRExC_state->code_blocks->count);
-                    src = &ri->code_blocks->cb[i];
-                    dst = &pRExC_state->code_blocks->cb[n];
-                    dst->start     = src->start + offset;
-                    dst->end       = src->end   + offset;
-                    dst->block     = src->block;
-                    dst->src_regex  = (REGEXP*) SvREFCNT_inc( (SV*)
-                                            src->src_regex
-                                                ? src->src_regex
-                                                : (REGEXP*)rx);
-                    n++;
-                }
-            }
-        }
-    }
-    /* avoid calling magic multiple times on a single element e.g. =~ $qr */
-    if (alloced)
-        SvSETMAGIC(pat);
-
-    return pat;
-}
-
-
-
-/* see if there are any run-time code blocks in the pattern.
- * False positives are allowed */
-
-static bool
-S_has_runtime_code(pTHX_ RExC_state_t * const pRExC_state,
-                    char *pat, STRLEN plen)
-{
-    int n = 0;
-    STRLEN s;
-
-    PERL_UNUSED_CONTEXT;
-
-    for (s = 0; s < plen; s++) {
-        if (   pRExC_state->code_blocks
-            && n < pRExC_state->code_blocks->count
-            && s == pRExC_state->code_blocks->cb[n].start)
-        {
-            s = pRExC_state->code_blocks->cb[n].end;
-            n++;
-            continue;
-        }
-        /* TODO ideally should handle [..], (#..), /#.../x to reduce false
-         * positives here */
-        if (pat[s] == '(' && s+2 <= plen && pat[s+1] == '?' &&
-            (pat[s+2] == '{'
-                || (s + 2 <= plen && pat[s+2] == '?' && pat[s+3] == '{'))
-        )
-            return 1;
-    }
-    return 0;
-}
-
-/* Handle run-time code blocks. We will already have compiled any direct
- * or indirect literal code blocks. Now, take the pattern 'pat' and make a
- * copy of it, but with any literal code blocks blanked out and
- * appropriate chars escaped; then feed it into
- *
- *    eval "qr'modified_pattern'"
- *
- * For example,
- *
- *       a\bc(?{"this was literal"})def'ghi\\jkl(?{"this is runtime"})mno
- *
- * becomes
- *
- *    qr'a\\bc_______________________def\'ghi\\\\jkl(?{"this is runtime"})mno'
- *
- * After eval_sv()-ing that, grab any new code blocks from the returned qr
- * and merge them with any code blocks of the original regexp.
- *
- * If the pat is non-UTF8, while the evalled qr is UTF8, don't merge;
- * instead, just save the qr and return FALSE; this tells our caller that
- * the original pattern needs upgrading to utf8.
- */
-
-static bool
-S_compile_runtime_code(pTHX_ RExC_state_t * const pRExC_state,
-    char *pat, STRLEN plen)
-{
-    SV *qr;
-
-    DECLARE_AND_GET_RE_DEBUG_FLAGS;
-
-    if (pRExC_state->runtime_code_qr) {
-        /* this is the second time we've been called; this should
-         * only happen if the main pattern got upgraded to utf8
-         * during compilation; re-use the qr we compiled first time
-         * round (which should be utf8 too)
-         */
-        qr = pRExC_state->runtime_code_qr;
-        pRExC_state->runtime_code_qr = NULL;
-        assert(RExC_utf8 && SvUTF8(qr));
-    }
-    else {
-        int n = 0;
-        STRLEN s;
-        char *p, *newpat;
-        int newlen = plen + 7; /* allow for "qr''xx\0" extra chars */
-        SV *sv, *qr_ref;
-        dSP;
-
-        /* determine how many extra chars we need for ' and \ escaping */
-        for (s = 0; s < plen; s++) {
-            if (pat[s] == '\'' || pat[s] == '\\')
-                newlen++;
-        }
-
-        Newx(newpat, newlen, char);
-        p = newpat;
-        *p++ = 'q'; *p++ = 'r'; *p++ = '\'';
-
-        for (s = 0; s < plen; s++) {
-            if (   pRExC_state->code_blocks
-                && n < pRExC_state->code_blocks->count
-                && s == pRExC_state->code_blocks->cb[n].start)
-            {
-                /* blank out literal code block so that they aren't
-                 * recompiled: eg change from/to:
-                 *     /(?{xyz})/
-                 *     /(?=====)/
-                 * and
-                 *     /(??{xyz})/
-                 *     /(?======)/
-                 * and
-                 *     /(?(?{xyz}))/
-                 *     /(?(?=====))/
-                */
-                assert(pat[s]   == '(');
-                assert(pat[s+1] == '?');
-                *p++ = '(';
-                *p++ = '?';
-                s += 2;
-                while (s < pRExC_state->code_blocks->cb[n].end) {
-                    *p++ = '=';
-                    s++;
-                }
-                *p++ = ')';
-                n++;
-                continue;
-            }
-            if (pat[s] == '\'' || pat[s] == '\\')
-                *p++ = '\\';
-            *p++ = pat[s];
-        }
-        *p++ = '\'';
-        if (pRExC_state->pm_flags & RXf_PMf_EXTENDED) {
-            *p++ = 'x';
-            if (pRExC_state->pm_flags & RXf_PMf_EXTENDED_MORE) {
-                *p++ = 'x';
-            }
-        }
-        *p++ = '\0';
-        DEBUG_COMPILE_r({
-            Perl_re_printf( aTHX_
-                "%sre-parsing pattern for runtime code:%s %s\n",
-                PL_colors[4], PL_colors[5], newpat);
-        });
-
-        sv = newSVpvn_flags(newpat, p-newpat-1, RExC_utf8 ? SVf_UTF8 : 0);
-        Safefree(newpat);
-
-        ENTER;
-        SAVETMPS;
-        save_re_context();
-        PUSHSTACKi(PERLSI_REQUIRE);
-        /* G_RE_REPARSING causes the toker to collapse \\ into \ when
-         * parsing qr''; normally only q'' does this. It also alters
-         * hints handling */
-        eval_sv(sv, G_SCALAR|G_RE_REPARSING);
-        SvREFCNT_dec_NN(sv);
-        SPAGAIN;
-        qr_ref = POPs;
-        PUTBACK;
-        {
-            SV * const errsv = ERRSV;
-            if (SvTRUE_NN(errsv))
-                /* use croak_sv ? */
-                Perl_croak_nocontext("%" SVf, SVfARG(errsv));
-        }
-        assert(SvROK(qr_ref));
-        qr = SvRV(qr_ref);
-        assert(SvTYPE(qr) == SVt_REGEXP && RX_ENGINE((REGEXP*)qr)->op_comp);
-        /* the leaving below frees the tmp qr_ref.
-         * Give qr a life of its own */
-        SvREFCNT_inc(qr);
-        POPSTACK;
-        FREETMPS;
-        LEAVE;
-
-    }
-
-    if (!RExC_utf8 && SvUTF8(qr)) {
-        /* first time through; the pattern got upgraded; save the
-         * qr for the next time through */
-        assert(!pRExC_state->runtime_code_qr);
-        pRExC_state->runtime_code_qr = qr;
-        return 0;
-    }
-
-
-    /* extract any code blocks within the returned qr//  */
-
-
-    /* merge the main (r1) and run-time (r2) code blocks into one */
-    {
-        RXi_GET_DECL(ReANY((REGEXP *)qr), r2);
-        struct reg_code_block *new_block, *dst;
-        RExC_state_t * const r1 = pRExC_state; /* convenient alias */
-        int i1 = 0, i2 = 0;
-        int r1c, r2c;
-
-        if (!r2->code_blocks || !r2->code_blocks->count) /* we guessed wrong */
-        {
-            SvREFCNT_dec_NN(qr);
-            return 1;
-        }
-
-        if (!r1->code_blocks)
-            r1->code_blocks = S_alloc_code_blocks(aTHX_ 0);
-
-        r1c = r1->code_blocks->count;
-        r2c = r2->code_blocks->count;
-
-        Newx(new_block, r1c + r2c, struct reg_code_block);
-
-        dst = new_block;
-
-        while (i1 < r1c || i2 < r2c) {
-            struct reg_code_block *src;
-            bool is_qr = 0;
-
-            if (i1 == r1c) {
-                src = &r2->code_blocks->cb[i2++];
-                is_qr = 1;
-            }
-            else if (i2 == r2c)
-                src = &r1->code_blocks->cb[i1++];
-            else if (  r1->code_blocks->cb[i1].start
-                     < r2->code_blocks->cb[i2].start)
-            {
-                src = &r1->code_blocks->cb[i1++];
-                assert(src->end < r2->code_blocks->cb[i2].start);
-            }
-            else {
-                assert(  r1->code_blocks->cb[i1].start
-                       > r2->code_blocks->cb[i2].start);
-                src = &r2->code_blocks->cb[i2++];
-                is_qr = 1;
-                assert(src->end < r1->code_blocks->cb[i1].start);
-            }
-
-            assert(pat[src->start] == '(');
-            assert(pat[src->end]   == ')');
-            dst->start     = src->start;
-            dst->end       = src->end;
-            dst->block     = src->block;
-            dst->src_regex  = is_qr ? (REGEXP*) SvREFCNT_inc( (SV*) qr)
-                                    : src->src_regex;
-            dst++;
-        }
-        r1->code_blocks->count += r2c;
-        Safefree(r1->code_blocks->cb);
-        r1->code_blocks->cb = new_block;
-    }
-
-    SvREFCNT_dec_NN(qr);
-    return 1;
-}
-
-
-STATIC bool
-S_setup_longest(pTHX_ RExC_state_t *pRExC_state,
-                      struct reg_substr_datum  *rsd,
-                      struct scan_data_substrs *sub,
-                      STRLEN longest_length)
-{
-    /* This is the common code for setting up the floating and fixed length
-     * string data extracted from Perl_re_op_compile() below.  Returns a boolean
-     * as to whether succeeded or not */
-
-    I32 t;
-    SSize_t ml;
-    bool eol  = cBOOL(sub->flags & SF_BEFORE_EOL);
-    bool meol = cBOOL(sub->flags & SF_BEFORE_MEOL);
-
-    if (! (longest_length
-           || (eol /* Can't have SEOL and MULTI */
-               && (! meol || (RExC_flags & RXf_PMf_MULTILINE)))
-          )
-            /* See comments for join_exact for why REG_UNFOLDED_MULTI_SEEN */
-        || (RExC_seen & REG_UNFOLDED_MULTI_SEEN))
-    {
-        return FALSE;
-    }
-
-    /* copy the information about the longest from the reg_scan_data
-        over to the program. */
-    if (SvUTF8(sub->str)) {
-        rsd->substr      = NULL;
-        rsd->utf8_substr = sub->str;
-    } else {
-        rsd->substr      = sub->str;
-        rsd->utf8_substr = NULL;
-    }
-    /* end_shift is how many chars that must be matched that
-        follow this item. We calculate it ahead of time as once the
-        lookbehind offset is added in we lose the ability to correctly
-        calculate it.*/
-    ml = sub->minlenp ? *(sub->minlenp) : (SSize_t)longest_length;
-    rsd->end_shift = ml - sub->min_offset
-        - longest_length
-            /* XXX SvTAIL is always false here - did you mean FBMcf_TAIL
-             * intead? - DAPM
-            + (SvTAIL(sub->str) != 0)
-            */
-        + sub->lookbehind;
-
-    t = (eol/* Can't have SEOL and MULTI */
-         && (! meol || (RExC_flags & RXf_PMf_MULTILINE)));
-    fbm_compile(sub->str, t ? FBMcf_TAIL : 0);
-
-    return TRUE;
-}
-
-STATIC void
-S_set_regex_pv(pTHX_ RExC_state_t *pRExC_state, REGEXP *Rx)
-{
-    /* Calculates and sets in the compiled pattern 'Rx' the string to compile,
-     * properly wrapped with the right modifiers */
-
-    bool has_p     = ((RExC_rx->extflags & RXf_PMf_KEEPCOPY) == RXf_PMf_KEEPCOPY);
-    bool has_charset = RExC_utf8 || (get_regex_charset(RExC_rx->extflags)
-                                                != REGEX_DEPENDS_CHARSET);
-
-    /* The caret is output if there are any defaults: if not all the STD
-        * flags are set, or if no character set specifier is needed */
-    bool has_default =
-                (((RExC_rx->extflags & RXf_PMf_STD_PMMOD) != RXf_PMf_STD_PMMOD)
-                || ! has_charset);
-    bool has_runon = ((RExC_seen & REG_RUN_ON_COMMENT_SEEN)
-                                                == REG_RUN_ON_COMMENT_SEEN);
-    U8 reganch = (U8)((RExC_rx->extflags & RXf_PMf_STD_PMMOD)
-                        >> RXf_PMf_STD_PMMOD_SHIFT);
-    const char *fptr = STD_PAT_MODS;        /*"msixxn"*/
-    char *p;
-    STRLEN pat_len = RExC_precomp_end - RExC_precomp;
-
-    /* We output all the necessary flags; we never output a minus, as all
-        * those are defaults, so are
-        * covered by the caret */
-    const STRLEN wraplen = pat_len + has_p + has_runon
-        + has_default       /* If needs a caret */
-        + PL_bitcount[reganch] /* 1 char for each set standard flag */
-
-            /* If needs a character set specifier */
-        + ((has_charset) ? MAX_CHARSET_NAME_LENGTH : 0)
-        + (sizeof("(?:)") - 1);
-
-    PERL_ARGS_ASSERT_SET_REGEX_PV;
-
-    /* make sure PL_bitcount bounds not exceeded */
-    STATIC_ASSERT_STMT(sizeof(STD_PAT_MODS) <= 8);
-
-    p = sv_grow(MUTABLE_SV(Rx), wraplen + 1); /* +1 for the ending NUL */
-    SvPOK_on(Rx);
-    if (RExC_utf8)
-        SvFLAGS(Rx) |= SVf_UTF8;
-    *p++='('; *p++='?';
-
-    /* If a default, cover it using the caret */
-    if (has_default) {
-        *p++= DEFAULT_PAT_MOD;
-    }
-    if (has_charset) {
-        STRLEN len;
-        const char* name;
-
-        name = get_regex_charset_name(RExC_rx->extflags, &len);
-        if (strEQ(name, DEPENDS_PAT_MODS)) {  /* /d under UTF-8 => /u */
-            assert(RExC_utf8);
-            name = UNICODE_PAT_MODS;
-            len = sizeof(UNICODE_PAT_MODS) - 1;
-        }
-        Copy(name, p, len, char);
-        p += len;
-    }
-    if (has_p)
-        *p++ = KEEPCOPY_PAT_MOD; /*'p'*/
-    {
-        char ch;
-        while((ch = *fptr++)) {
-            if(reganch & 1)
-                *p++ = ch;
-            reganch >>= 1;
-        }
-    }
-
-    *p++ = ':';
-    Copy(RExC_precomp, p, pat_len, char);
-    assert ((RX_WRAPPED(Rx) - p) < 16);
-    RExC_rx->pre_prefix = p - RX_WRAPPED(Rx);
-    p += pat_len;
-
-    /* Adding a trailing \n causes this to compile properly:
-            my $R = qr / A B C # D E/x; /($R)/
-        Otherwise the parens are considered part of the comment */
-    if (has_runon)
-        *p++ = '\n';
-    *p++ = ')';
-    *p = 0;
-    SvCUR_set(Rx, p - RX_WRAPPED(Rx));
-}
-
-/*
- * Perl_re_op_compile - the perl internal RE engine's function to compile a
- * regular expression into internal code.
- * The pattern may be passed either as:
- *    a list of SVs (patternp plus pat_count)
- *    a list of OPs (expr)
- * If both are passed, the SV list is used, but the OP list indicates
- * which SVs are actually pre-compiled code blocks
- *
- * The SVs in the list have magic and qr overloading applied to them (and
- * the list may be modified in-place with replacement SVs in the latter
- * case).
- *
- * If the pattern hasn't changed from old_re, then old_re will be
- * returned.
- *
- * eng is the current engine. If that engine has an op_comp method, then
- * handle directly (i.e. we assume that op_comp was us); otherwise, just
- * do the initial concatenation of arguments and pass on to the external
- * engine.
- *
- * If is_bare_re is not null, set it to a boolean indicating whether the
- * arg list reduced (after overloading) to a single bare regex which has
- * been returned (i.e. /$qr/).
- *
- * orig_rx_flags contains RXf_* flags. See perlreapi.pod for more details.
- *
- * pm_flags contains the PMf_* flags, typically based on those from the
- * pm_flags field of the related PMOP. Currently we're only interested in
- * PMf_HAS_CV, PMf_IS_QR, PMf_USE_RE_EVAL, PMf_WILDCARD.
- *
- * For many years this code had an initial sizing pass that calculated
- * (sometimes incorrectly, leading to security holes) the size needed for the
- * compiled pattern.  That was changed by commit
- * 7c932d07cab18751bfc7515b4320436273a459e2 in 5.29, which reallocs the size, a
- * node at a time, as parsing goes along.  Patches welcome to fix any obsolete
- * references to this sizing pass.
- *
- * Now, an initial crude guess as to the size needed is made, based on the
- * length of the pattern.  Patches welcome to improve that guess.  That amount
- * of space is malloc'd and then immediately freed, and then clawed back node
- * by node.  This design is to minimze, to the extent possible, memory churn
- * when doing the reallocs.
- *
- * A separate parentheses counting pass may be needed in some cases.
- * (Previously the sizing pass did this.)  Patches welcome to reduce the number
- * of these cases.
- *
- * The existence of a sizing pass necessitated design decisions that are no
- * longer needed.  There are potential areas of simplification.
- *
- * Beware that the optimization-preparation code in here knows about some
- * of the structure of the compiled regexp.  [I'll say.]
- */
-
-REGEXP *
-Perl_re_op_compile(pTHX_ SV ** const patternp, int pat_count,
-                    OP *expr, const regexp_engine* eng, REGEXP *old_re,
-                     bool *is_bare_re, const U32 orig_rx_flags, const U32 pm_flags)
-{
-    REGEXP *Rx;         /* Capital 'R' means points to a REGEXP */
-    STRLEN plen;
-    char *exp;
-    regnode *scan;
-    I32 flags;
-    SSize_t minlen = 0;
-    U32 rx_flags;
-    SV *pat;
-    SV** new_patternp = patternp;
-
-    /* these are all flags - maybe they should be turned
-     * into a single int with different bit masks */
-    I32 sawlookahead = 0;
-    I32 sawplus = 0;
-    I32 sawopen = 0;
-    I32 sawminmod = 0;
-
-    regex_charset initial_charset = get_regex_charset(orig_rx_flags);
-    bool recompile = 0;
-    bool runtime_code = 0;
-    scan_data_t data;
-    RExC_state_t RExC_state;
-    RExC_state_t * const pRExC_state = &RExC_state;
-#ifdef TRIE_STUDY_OPT
-    /* search for "restudy" in this file for a detailed explanation */
-    int restudied = 0;
-    RExC_state_t copyRExC_state;
-#endif
-    DECLARE_AND_GET_RE_DEBUG_FLAGS;
-
-    PERL_ARGS_ASSERT_RE_OP_COMPILE;
-
-    DEBUG_r(if (!PL_colorset) reginitcolors());
-
-
-    pRExC_state->warn_text = NULL;
-    pRExC_state->unlexed_names = NULL;
-    pRExC_state->code_blocks = NULL;
-
-    if (is_bare_re)
-        *is_bare_re = FALSE;
-
-    if (expr && (expr->op_type == OP_LIST ||
-                (expr->op_type == OP_NULL && expr->op_targ == OP_LIST))) {
-        /* allocate code_blocks if needed */
-        OP *o;
-        int ncode = 0;
-
-        for (o = cLISTOPx(expr)->op_first; o; o = OpSIBLING(o))
-            if (o->op_type == OP_NULL && (o->op_flags & OPf_SPECIAL))
-                ncode++; /* count of DO blocks */
-
-        if (ncode)
-            pRExC_state->code_blocks = S_alloc_code_blocks(aTHX_ ncode);
-    }
-
-    if (!pat_count) {
-        /* compile-time pattern with just OP_CONSTs and DO blocks */
-
-        int n;
-        OP *o;
-
-        /* find how many CONSTs there are */
-        assert(expr);
-        n = 0;
-        if (expr->op_type == OP_CONST)
-            n = 1;
-        else
-            for (o = cLISTOPx(expr)->op_first; o; o = OpSIBLING(o)) {
-                if (o->op_type == OP_CONST)
-                    n++;
-            }
-
-        /* fake up an SV array */
-
-        assert(!new_patternp);
-        Newx(new_patternp, n, SV*);
-        SAVEFREEPV(new_patternp);
-        pat_count = n;
-
-        n = 0;
-        if (expr->op_type == OP_CONST)
-            new_patternp[n] = cSVOPx_sv(expr);
-        else
-            for (o = cLISTOPx(expr)->op_first; o; o = OpSIBLING(o)) {
-                if (o->op_type == OP_CONST)
-                    new_patternp[n++] = cSVOPo_sv;
-            }
-
-    }
-
-    DEBUG_PARSE_r(Perl_re_printf( aTHX_
-        "Assembling pattern from %d elements%s\n", pat_count,
-            orig_rx_flags & RXf_SPLIT ? " for split" : ""));
-
-    /* set expr to the first arg op */
-
-    if (pRExC_state->code_blocks && pRExC_state->code_blocks->count
-         && expr->op_type != OP_CONST)
-    {
-            expr = cLISTOPx(expr)->op_first;
-            assert(   expr->op_type == OP_PUSHMARK
-                   || (expr->op_type == OP_NULL && expr->op_targ == OP_PUSHMARK)
-                   || expr->op_type == OP_PADRANGE);
-            expr = OpSIBLING(expr);
-    }
-
-    pat = S_concat_pat(aTHX_ pRExC_state, NULL, new_patternp, pat_count,
-                        expr, &recompile, NULL);
-
-    /* handle bare (possibly after overloading) regex: foo =~ $re */
-    {
-        SV *re = pat;
-        if (SvROK(re))
-            re = SvRV(re);
-        if (SvTYPE(re) == SVt_REGEXP) {
-            if (is_bare_re)
-                *is_bare_re = TRUE;
-            SvREFCNT_inc(re);
-            DEBUG_PARSE_r(Perl_re_printf( aTHX_
-                "Precompiled pattern%s\n",
-                    orig_rx_flags & RXf_SPLIT ? " for split" : ""));
-
-            return (REGEXP*)re;
-        }
-    }
-
-    exp = SvPV_nomg(pat, plen);
-
-    if (!eng->op_comp) {
-        if ((SvUTF8(pat) && IN_BYTES)
-                || SvGMAGICAL(pat) || SvAMAGIC(pat))
-        {
-            /* make a temporary copy; either to convert to bytes,
-             * or to avoid repeating get-magic / overloaded stringify */
-            pat = newSVpvn_flags(exp, plen, SVs_TEMP |
-                                        (IN_BYTES ? 0 : SvUTF8(pat)));
-        }
-        return CALLREGCOMP_ENG(eng, pat, orig_rx_flags);
-    }
-
-    /* ignore the utf8ness if the pattern is 0 length */
-    RExC_utf8 = RExC_orig_utf8 = (plen == 0 || IN_BYTES) ? 0 : SvUTF8(pat);
-    RExC_uni_semantics = 0;
-    RExC_contains_locale = 0;
-    RExC_strict = cBOOL(pm_flags & RXf_PMf_STRICT);
-    RExC_in_script_run = 0;
-    RExC_study_started = 0;
-    pRExC_state->runtime_code_qr = NULL;
-    RExC_frame_head= NULL;
-    RExC_frame_last= NULL;
-    RExC_frame_count= 0;
-    RExC_latest_warn_offset = 0;
-    RExC_use_BRANCHJ = 0;
-    RExC_warned_WARN_EXPERIMENTAL__VLB = 0;
-    RExC_warned_WARN_EXPERIMENTAL__REGEX_SETS = 0;
-    RExC_total_parens = 0;
-    RExC_open_parens = NULL;
-    RExC_close_parens = NULL;
-    RExC_paren_names = NULL;
-    RExC_size = 0;
-    RExC_seen_d_op = FALSE;
-#ifdef DEBUGGING
-    RExC_paren_name_list = NULL;
-#endif
-
-    DEBUG_r({
-        RExC_mysv1= sv_newmortal();
-        RExC_mysv2= sv_newmortal();
-    });
-
-    DEBUG_COMPILE_r({
-            SV *dsv= sv_newmortal();
-            RE_PV_QUOTED_DECL(s, RExC_utf8, dsv, exp, plen, PL_dump_re_max_len);
-            Perl_re_printf( aTHX_  "%sCompiling REx%s %s\n",
-                          PL_colors[4], PL_colors[5], s);
-        });
-
-    /* we jump here if we have to recompile, e.g., from upgrading the pattern
-     * to utf8 */
-
-    if ((pm_flags & PMf_USE_RE_EVAL)
-                /* this second condition covers the non-regex literal case,
-                 * i.e.  $foo =~ '(?{})'. */
-                || (IN_PERL_COMPILETIME && (PL_hints & HINT_RE_EVAL))
-    )
-        runtime_code = S_has_runtime_code(aTHX_ pRExC_state, exp, plen);
-
-  redo_parse:
-    /* return old regex if pattern hasn't changed */
-    /* XXX: note in the below we have to check the flags as well as the
-     * pattern.
-     *
-     * Things get a touch tricky as we have to compare the utf8 flag
-     * independently from the compile flags.  */
-
-    if (   old_re
-        && !recompile
-        && !!RX_UTF8(old_re) == !!RExC_utf8
-        && ( RX_COMPFLAGS(old_re) == ( orig_rx_flags & RXf_PMf_FLAGCOPYMASK ) )
-        && RX_PRECOMP(old_re)
-        && RX_PRELEN(old_re) == plen
-        && memEQ(RX_PRECOMP(old_re), exp, plen)
-        && !runtime_code /* with runtime code, always recompile */ )
-    {
-        DEBUG_COMPILE_r({
-            SV *dsv= sv_newmortal();
-            RE_PV_QUOTED_DECL(s, RExC_utf8, dsv, exp, plen, PL_dump_re_max_len);
-            Perl_re_printf( aTHX_  "%sSkipping recompilation of unchanged REx%s %s\n",
-                          PL_colors[4], PL_colors[5], s);
-        });
-        return old_re;
-    }
-
-    /* Allocate the pattern's SV */
-    RExC_rx_sv = Rx = (REGEXP*) newSV_type(SVt_REGEXP);
-    RExC_rx = ReANY(Rx);
-    if ( RExC_rx == NULL )
-        FAIL("Regexp out of space");
-
-    rx_flags = orig_rx_flags;
-
-    if (   toUSE_UNI_CHARSET_NOT_DEPENDS
-        && initial_charset == REGEX_DEPENDS_CHARSET)
-    {
-
-        /* Set to use unicode semantics if the pattern is in utf8 and has the
-         * 'depends' charset specified, as it means unicode when utf8  */
-        set_regex_charset(&rx_flags, REGEX_UNICODE_CHARSET);
-        RExC_uni_semantics = 1;
-    }
-
-    RExC_pm_flags = pm_flags;
-
-    if (runtime_code) {
-        assert(TAINTING_get || !TAINT_get);
-        if (TAINT_get)
-            Perl_croak(aTHX_ "Eval-group in insecure regular expression");
-
-        if (!S_compile_runtime_code(aTHX_ pRExC_state, exp, plen)) {
-            /* whoops, we have a non-utf8 pattern, whilst run-time code
-             * got compiled as utf8. Try again with a utf8 pattern */
-            S_pat_upgrade_to_utf8(aTHX_ pRExC_state, &exp, &plen,
-                pRExC_state->code_blocks ? pRExC_state->code_blocks->count : 0);
-            goto redo_parse;
-        }
-    }
-    assert(!pRExC_state->runtime_code_qr);
-
-    RExC_sawback = 0;
-
-    RExC_seen = 0;
-    RExC_maxlen = 0;
-    RExC_in_lookaround = 0;
-    RExC_seen_zerolen = *exp == '^' ? -1 : 0;
-    RExC_recode_x_to_native = 0;
-    RExC_in_multi_char_class = 0;
-
-    RExC_start = RExC_copy_start_in_constructed = RExC_copy_start_in_input = RExC_precomp = exp;
-    RExC_precomp_end = RExC_end = exp + plen;
-    RExC_nestroot = 0;
-    RExC_whilem_seen = 0;
-    RExC_end_op = NULL;
-    RExC_recurse = NULL;
-    RExC_study_chunk_recursed = NULL;
-    RExC_study_chunk_recursed_bytes= 0;
-    RExC_recurse_count = 0;
-    RExC_sets_depth = 0;
-    pRExC_state->code_index = 0;
-
-    /* Initialize the string in the compiled pattern.  This is so that there is
-     * something to output if necessary */
-    set_regex_pv(pRExC_state, Rx);
-
-    DEBUG_PARSE_r({
-        Perl_re_printf( aTHX_
-            "Starting parse and generation\n");
-        RExC_lastnum=0;
-        RExC_lastparse=NULL;
-    });
-
-    /* Allocate space and zero-initialize. Note, the two step process
-       of zeroing when in debug mode, thus anything assigned has to
-       happen after that */
-    if (!  RExC_size) {
-
-        /* On the first pass of the parse, we guess how big this will be.  Then
-         * we grow in one operation to that amount and then give it back.  As
-         * we go along, we re-allocate what we need.
-         *
-         * XXX Currently the guess is essentially that the pattern will be an
-         * EXACT node with one byte input, one byte output.  This is crude, and
-         * better heuristics are welcome.
-         *
-         * On any subsequent passes, we guess what we actually computed in the
-         * latest earlier pass.  Such a pass probably didn't complete so is
-         * missing stuff.  We could improve those guesses by knowing where the
-         * parse stopped, and use the length so far plus apply the above
-         * assumption to what's left. */
-        RExC_size = STR_SZ(RExC_end - RExC_start);
-    }
-
-    Newxc(RExC_rxi, sizeof(regexp_internal) + RExC_size, char, regexp_internal);
-    if ( RExC_rxi == NULL )
-        FAIL("Regexp out of space");
-
-    Zero(RExC_rxi, sizeof(regexp_internal) + RExC_size, char);
-    RXi_SET( RExC_rx, RExC_rxi );
-
-    /* We start from 0 (over from 0 in the case this is a reparse.  The first
-     * node parsed will give back any excess memory we have allocated so far).
-     * */
-    RExC_size = 0;
-
-    /* non-zero initialization begins here */
-    RExC_rx->engine= eng;
-    RExC_rx->extflags = rx_flags;
-    RXp_COMPFLAGS(RExC_rx) = orig_rx_flags & RXf_PMf_FLAGCOPYMASK;
-
-    if (pm_flags & PMf_IS_QR) {
-        RExC_rxi->code_blocks = pRExC_state->code_blocks;
-        if (RExC_rxi->code_blocks) {
-            RExC_rxi->code_blocks->refcnt++;
-        }
-    }
-
-    RExC_rx->intflags = 0;
-
-    RExC_flags = rx_flags;     /* don't let top level (?i) bleed */
-    RExC_parse_set(exp);
-
-    /* This NUL is guaranteed because the pattern comes from an SV*, and the sv
-     * code makes sure the final byte is an uncounted NUL.  But should this
-     * ever not be the case, lots of things could read beyond the end of the
-     * buffer: loops like
-     *      while(isFOO(*RExC_parse)) RExC_parse_inc_by(1);
-     *      strchr(RExC_parse, "foo");
-     * etc.  So it is worth noting. */
-    assert(*RExC_end == '\0');
-
-    RExC_naughty = 0;
-    RExC_npar = 1;
-    RExC_parens_buf_size = 0;
-    RExC_emit_start = RExC_rxi->program;
-    pRExC_state->code_index = 0;
-
-    *((char*) RExC_emit_start) = (char) REG_MAGIC;
-    RExC_emit = 1;
-
-    /* Do the parse */
-    if (reg(pRExC_state, 0, &flags, 1)) {
-
-        /* Success!, But we may need to redo the parse knowing how many parens
-         * there actually are */
-        if (IN_PARENS_PASS) {
-            flags |= RESTART_PARSE;
-        }
-
-        /* We have that number in RExC_npar */
-        RExC_total_parens = RExC_npar;
-    }
-    else if (! MUST_RESTART(flags)) {
-        ReREFCNT_dec(Rx);
-        Perl_croak(aTHX_ "panic: reg returned failure to re_op_compile, flags=%#" UVxf, (UV) flags);
-    }
-
-    /* Here, we either have success, or we have to redo the parse for some reason */
-    if (MUST_RESTART(flags)) {
-
-        /* It's possible to write a regexp in ascii that represents Unicode
-        codepoints outside of the byte range, such as via \x{100}. If we
-        detect such a sequence we have to convert the entire pattern to utf8
-        and then recompile, as our sizing calculation will have been based
-        on 1 byte == 1 character, but we will need to use utf8 to encode
-        at least some part of the pattern, and therefore must convert the whole
-        thing.
-        -- dmq */
-        if (flags & NEED_UTF8) {
-
-            /* We have stored the offset of the final warning output so far.
-             * That must be adjusted.  Any variant characters between the start
-             * of the pattern and this warning count for 2 bytes in the final,
-             * so just add them again */
-            if (UNLIKELY(RExC_latest_warn_offset > 0)) {
-                RExC_latest_warn_offset +=
-                            variant_under_utf8_count((U8 *) exp, (U8 *) exp
-                                                + RExC_latest_warn_offset);
-            }
-            S_pat_upgrade_to_utf8(aTHX_ pRExC_state, &exp, &plen,
-            pRExC_state->code_blocks ? pRExC_state->code_blocks->count : 0);
-            DEBUG_PARSE_r(Perl_re_printf( aTHX_ "Need to redo parse after upgrade\n"));
-        }
-        else {
-            DEBUG_PARSE_r(Perl_re_printf( aTHX_ "Need to redo parse\n"));
-        }
-
-        if (ALL_PARENS_COUNTED) {
-            /* Make enough room for all the known parens, and zero it */
-            Renew(RExC_open_parens, RExC_total_parens, regnode_offset);
-            Zero(RExC_open_parens, RExC_total_parens, regnode_offset);
-            RExC_open_parens[0] = 1;    /* +1 for REG_MAGIC */
-
-            Renew(RExC_close_parens, RExC_total_parens, regnode_offset);
-            Zero(RExC_close_parens, RExC_total_parens, regnode_offset);
-        }
-        else { /* Parse did not complete.  Reinitialize the parentheses
-                  structures */
-            RExC_total_parens = 0;
-            if (RExC_open_parens) {
-                Safefree(RExC_open_parens);
-                RExC_open_parens = NULL;
-            }
-            if (RExC_close_parens) {
-                Safefree(RExC_close_parens);
-                RExC_close_parens = NULL;
-            }
-        }
-
-        /* Clean up what we did in this parse */
-        SvREFCNT_dec_NN(RExC_rx_sv);
-
-        goto redo_parse;
-    }
-
-    /* Here, we have successfully parsed and generated the pattern's program
-     * for the regex engine.  We are ready to finish things up and look for
-     * optimizations. */
-
-    /* Update the string to compile, with correct modifiers, etc */
-    set_regex_pv(pRExC_state, Rx);
-
-    RExC_rx->nparens = RExC_total_parens - 1;
-
-    /* Uses the upper 4 bits of the FLAGS field, so keep within that size */
-    if (RExC_whilem_seen > 15)
-        RExC_whilem_seen = 15;
-
-    DEBUG_PARSE_r({
-        Perl_re_printf( aTHX_
-            "Required size %" IVdf " nodes\n", (IV)RExC_size);
-        RExC_lastnum=0;
-        RExC_lastparse=NULL;
-    });
-
-    SetProgLen(RExC_rxi,RExC_size);
-
-    DEBUG_DUMP_PRE_OPTIMIZE_r({
-        SV * const sv = sv_newmortal();
-        RXi_GET_DECL(RExC_rx, ri);
-        DEBUG_RExC_seen();
-        Perl_re_printf( aTHX_ "Program before optimization:\n");
-
-        (void)dumpuntil(RExC_rx, ri->program, ri->program + 1, NULL, NULL,
-                        sv, 0, 0);
-    });
-
-    DEBUG_OPTIMISE_r(
-        Perl_re_printf( aTHX_  "Starting post parse optimization\n");
-    );
-
-    /* XXXX To minimize changes to RE engine we always allocate
-       3-units-long substrs field. */
-    Newx(RExC_rx->substrs, 1, struct reg_substr_data);
-    if (RExC_recurse_count) {
-        Newx(RExC_recurse, RExC_recurse_count, regnode *);
-        SAVEFREEPV(RExC_recurse);
-    }
-
-    if (RExC_seen & REG_RECURSE_SEEN) {
-        /* Note, RExC_total_parens is 1 + the number of parens in a pattern.
-         * So its 1 if there are no parens. */
-        RExC_study_chunk_recursed_bytes= (RExC_total_parens >> 3) +
-                                         ((RExC_total_parens & 0x07) != 0);
-        Newx(RExC_study_chunk_recursed,
-             RExC_study_chunk_recursed_bytes * RExC_total_parens, U8);
-        SAVEFREEPV(RExC_study_chunk_recursed);
-    }
-
-  reStudy:
-    RExC_rx->minlen = minlen = sawlookahead = sawplus = sawopen = sawminmod = 0;
-    DEBUG_r(
-        RExC_study_chunk_recursed_count= 0;
-    );
-    Zero(RExC_rx->substrs, 1, struct reg_substr_data);
-    if (RExC_study_chunk_recursed) {
-        Zero(RExC_study_chunk_recursed,
-             RExC_study_chunk_recursed_bytes * RExC_total_parens, U8);
-    }
-
-
-#ifdef TRIE_STUDY_OPT
-    /* search for "restudy" in this file for a detailed explanation */
-    if (!restudied) {
-        StructCopy(&zero_scan_data, &data, scan_data_t);
-        copyRExC_state = RExC_state;
-    } else {
-        U32 seen=RExC_seen;
-        DEBUG_OPTIMISE_r(Perl_re_printf( aTHX_ "Restudying\n"));
-
-        RExC_state = copyRExC_state;
-        if (seen & REG_TOP_LEVEL_BRANCHES_SEEN)
-            RExC_seen |= REG_TOP_LEVEL_BRANCHES_SEEN;
-        else
-            RExC_seen &= ~REG_TOP_LEVEL_BRANCHES_SEEN;
-        StructCopy(&zero_scan_data, &data, scan_data_t);
-    }
-#else
-    StructCopy(&zero_scan_data, &data, scan_data_t);
-#endif
-
-    /* Dig out information for optimizations. */
-    RExC_rx->extflags = RExC_flags; /* was pm_op */
-    /*dmq: removed as part of de-PMOP: pm->op_pmflags = RExC_flags; */
-
-    if (UTF)
-        SvUTF8_on(Rx); /* Unicode in it? */
-    RExC_rxi->regstclass = NULL;
-    if (RExC_naughty >= TOO_NAUGHTY)   /* Probably an expensive pattern. */
-        RExC_rx->intflags |= PREGf_NAUGHTY;
-    scan = RExC_rxi->program + 1;              /* First BRANCH. */
-
-    /* testing for BRANCH here tells us whether there is "must appear"
-       data in the pattern. If there is then we can use it for optimisations */
-    if (!(RExC_seen & REG_TOP_LEVEL_BRANCHES_SEEN)) { /*  Only one top-level choice.
-                                                  */
-        SSize_t fake_deltap;
-        STRLEN longest_length[2];
-        regnode_ssc ch_class; /* pointed to by data */
-        int stclass_flag;
-        SSize_t last_close = 0; /* pointed to by data */
-        regnode *first= scan;
-        regnode *first_next= regnext(first);
-        regnode *last_close_op= NULL;
-        int i;
-
-        /*
-         * Skip introductions and multiplicators >= 1
-         * so that we can extract the 'meat' of the pattern that must
-         * match in the large if() sequence following.
-         * NOTE that EXACT is NOT covered here, as it is normally
-         * picked up by the optimiser separately.
-         *
-         * This is unfortunate as the optimiser isnt handling lookahead
-         * properly currently.
-         *
-         */
-        while ((OP(first) == OPEN && (sawopen = 1)) ||
-               /* An OR of *one* alternative - should not happen now. */
-            (OP(first) == BRANCH && OP(first_next) != BRANCH) ||
-            /* for now we can't handle lookbehind IFMATCH*/
-            (OP(first) == IFMATCH && !first->flags && (sawlookahead = 1)) ||
-            (OP(first) == PLUS) ||
-            (OP(first) == MINMOD) ||
-               /* An {n,m} with n>0 */
-            (PL_regkind[OP(first)] == CURLY && ARG1(first) > 0) ||
-            (OP(first) == NOTHING && PL_regkind[OP(first_next)] != END ))
-        {
-                /*
-                 * the only op that could be a regnode is PLUS, all the rest
-                 * will be regnode_1 or regnode_2.
-                 *
-                 * (yves doesn't think this is true)
-                 */
-                if (OP(first) == PLUS)
-                    sawplus = 1;
-                else {
-                    if (OP(first) == MINMOD)
-                        sawminmod = 1;
-                    first += regarglen[OP(first)];
-                }
-                first = NEXTOPER(first);
-                first_next= regnext(first);
-        }
-
-        /* Starting-point info. */
-      again:
-        DEBUG_PEEP("first:", first, 0, 0);
-        /* Ignore EXACT as we deal with it later. */
-        if (PL_regkind[OP(first)] == EXACT) {
-            if (! isEXACTFish(OP(first))) {
-                NOOP;  /* Empty, get anchored substr later. */
-            }
-            else
-                RExC_rxi->regstclass = first;
-        }
-#ifdef TRIE_STCLASS
-        else if (PL_regkind[OP(first)] == TRIE &&
-                ((reg_trie_data *)RExC_rxi->data->data[ ARG(first) ])->minlen>0)
-        {
-            /* this can happen only on restudy
-             * Search for "restudy" in this file to find
-             * a comment with details. */
-            RExC_rxi->regstclass = construct_ahocorasick_from_trie(pRExC_state, (regnode *)first, 0);
-        }
-#endif
-        else if (REGNODE_SIMPLE(OP(first)))
-            RExC_rxi->regstclass = first;
-        else if (PL_regkind[OP(first)] == BOUND ||
-                 PL_regkind[OP(first)] == NBOUND)
-            RExC_rxi->regstclass = first;
-        else if (PL_regkind[OP(first)] == BOL) {
-            RExC_rx->intflags |= (OP(first) == MBOL
-                           ? PREGf_ANCH_MBOL
-                           : PREGf_ANCH_SBOL);
-            first = NEXTOPER(first);
-            goto again;
-        }
-        else if (OP(first) == GPOS) {
-            RExC_rx->intflags |= PREGf_ANCH_GPOS;
-            first = NEXTOPER(first);
-            goto again;
-        }
-        else if ((!sawopen || !RExC_sawback) &&
-            !sawlookahead &&
-            (OP(first) == STAR &&
-            PL_regkind[OP(NEXTOPER(first))] == REG_ANY) &&
-            !(RExC_rx->intflags & PREGf_ANCH) && !pRExC_state->code_blocks)
-        {
-            /* turn .* into ^.* with an implied $*=1 */
-            const int type =
-                (OP(NEXTOPER(first)) == REG_ANY)
-                    ? PREGf_ANCH_MBOL
-                    : PREGf_ANCH_SBOL;
-            RExC_rx->intflags |= (type | PREGf_IMPLICIT);
-            first = NEXTOPER(first);
-            goto again;
-        }
-        if (sawplus && !sawminmod && !sawlookahead
-            && (!sawopen || !RExC_sawback)
-            && !pRExC_state->code_blocks) /* May examine pos and $& */
-            /* x+ must match at the 1st pos of run of x's */
-            RExC_rx->intflags |= PREGf_SKIP;
-
-        /* Scan is after the zeroth branch, first is atomic matcher. */
-#ifdef TRIE_STUDY_OPT
-        /* search for "restudy" in this file for a detailed explanation */
-        DEBUG_PARSE_r(
-            if (!restudied)
-                Perl_re_printf( aTHX_  "first at %" IVdf "\n",
-                              (IV)(first - scan + 1))
-        );
-#else
-        DEBUG_PARSE_r(
-            Perl_re_printf( aTHX_  "first at %" IVdf "\n",
-                (IV)(first - scan + 1))
-        );
-#endif
-
-
-        /*
-        * If there's something expensive in the r.e., find the
-        * longest literal string that must appear and make it the
-        * regmust.  Resolve ties in favor of later strings, since
-        * the regstart check works with the beginning of the r.e.
-        * and avoiding duplication strengthens checking.  Not a
-        * strong reason, but sufficient in the absence of others.
-        * [Now we resolve ties in favor of the earlier string if
-        * it happens that c_offset_min has been invalidated, since the
-        * earlier string may buy us something the later one won't.]
-        */
-
-        data.substrs[0].str = newSVpvs("");
-        data.substrs[1].str = newSVpvs("");
-        data.last_found = newSVpvs("");
-        data.cur_is_floating = 0; /* initially any found substring is fixed */
-        ENTER_with_name("study_chunk");
-        SAVEFREESV(data.substrs[0].str);
-        SAVEFREESV(data.substrs[1].str);
-        SAVEFREESV(data.last_found);
-        first = scan;
-        if (!RExC_rxi->regstclass) {
-            ssc_init(pRExC_state, &ch_class);
-            data.start_class = &ch_class;
-            stclass_flag = SCF_DO_STCLASS_AND;
-        } else                         /* XXXX Check for BOUND? */
-            stclass_flag = 0;
-        data.last_closep = &last_close;
-        data.last_close_opp = &last_close_op;
-
-        DEBUG_RExC_seen();
-        /*
-         * MAIN ENTRY FOR study_chunk() FOR m/PATTERN/
-         * (NO top level branches)
-         */
-        minlen = study_chunk(pRExC_state, &first, &minlen, &fake_deltap,
-                             scan + RExC_size, /* Up to end */
-            &data, -1, 0, NULL,
-            SCF_DO_SUBSTR | SCF_WHILEM_VISITED_POS | stclass_flag
-                          | (restudied ? SCF_TRIE_DOING_RESTUDY : 0),
-            0, TRUE);
-        /* search for "restudy" in this file for a detailed explanation
-         * of 'restudied' and SCF_TRIE_DOING_RESTUDY */
-
-
-        CHECK_RESTUDY_GOTO_butfirst(LEAVE_with_name("study_chunk"));
-
-
-        if ( RExC_total_parens == 1 && !data.cur_is_floating
-             && data.last_start_min == 0 && data.last_end > 0
-             && !RExC_seen_zerolen
-             && !(RExC_seen & REG_VERBARG_SEEN)
-             && !(RExC_seen & REG_GPOS_SEEN)
-        ){
-            RExC_rx->extflags |= RXf_CHECK_ALL;
-        }
-        scan_commit(pRExC_state, &data,&minlen, 0);
-
-
-        /* XXX this is done in reverse order because that's the way the
-         * code was before it was parameterised. Don't know whether it
-         * actually needs doing in reverse order. DAPM */
-        for (i = 1; i >= 0; i--) {
-            longest_length[i] = CHR_SVLEN(data.substrs[i].str);
-
-            if (   !(   i
-                     && SvCUR(data.substrs[0].str)  /* ok to leave SvCUR */
-                     &&    data.substrs[0].min_offset
-                        == data.substrs[1].min_offset
-                     &&    SvCUR(data.substrs[0].str)
-                        == SvCUR(data.substrs[1].str)
-                    )
-                && S_setup_longest (aTHX_ pRExC_state,
-                                        &(RExC_rx->substrs->data[i]),
-                                        &(data.substrs[i]),
-                                        longest_length[i]))
-            {
-                RExC_rx->substrs->data[i].min_offset =
-                        data.substrs[i].min_offset - data.substrs[i].lookbehind;
-
-                RExC_rx->substrs->data[i].max_offset = data.substrs[i].max_offset;
-                /* Don't offset infinity */
-                if (data.substrs[i].max_offset < OPTIMIZE_INFTY)
-                    RExC_rx->substrs->data[i].max_offset -= data.substrs[i].lookbehind;
-                SvREFCNT_inc_simple_void_NN(data.substrs[i].str);
-            }
-            else {
-                RExC_rx->substrs->data[i].substr      = NULL;
-                RExC_rx->substrs->data[i].utf8_substr = NULL;
-                longest_length[i] = 0;
-            }
-        }
-
-        LEAVE_with_name("study_chunk");
-
-        if (RExC_rxi->regstclass
-            && (OP(RExC_rxi->regstclass) == REG_ANY || OP(RExC_rxi->regstclass) == SANY))
-            RExC_rxi->regstclass = NULL;
-
-        if ((!(RExC_rx->substrs->data[0].substr || RExC_rx->substrs->data[0].utf8_substr)
-              || RExC_rx->substrs->data[0].min_offset)
-            && stclass_flag
-            && ! (ANYOF_FLAGS(data.start_class) & SSC_MATCHES_EMPTY_STRING)
-            && is_ssc_worth_it(pRExC_state, data.start_class))
-        {
-            const U32 n = add_data(pRExC_state, STR_WITH_LEN("f"));
-
-            ssc_finalize(pRExC_state, data.start_class);
-
-            Newx(RExC_rxi->data->data[n], 1, regnode_ssc);
-            StructCopy(data.start_class,
-                       (regnode_ssc*)RExC_rxi->data->data[n],
-                       regnode_ssc);
-            RExC_rxi->regstclass = (regnode*)RExC_rxi->data->data[n];
-            RExC_rx->intflags &= ~PREGf_SKIP;  /* Used in find_byclass(). */
-            DEBUG_COMPILE_r({ SV *sv = sv_newmortal();
-                      regprop(RExC_rx, sv, (regnode*)data.start_class, NULL, pRExC_state);
-                      Perl_re_printf( aTHX_
-                                    "synthetic stclass \"%s\".\n",
-                                    SvPVX_const(sv));});
-            data.start_class = NULL;
-        }
-
-        /* A temporary algorithm prefers floated substr to fixed one of
-         * same length to dig more info. */
-        i = (longest_length[0] <= longest_length[1]);
-        RExC_rx->substrs->check_ix = i;
-        RExC_rx->check_end_shift  = RExC_rx->substrs->data[i].end_shift;
-        RExC_rx->check_substr     = RExC_rx->substrs->data[i].substr;
-        RExC_rx->check_utf8       = RExC_rx->substrs->data[i].utf8_substr;
-        RExC_rx->check_offset_min = RExC_rx->substrs->data[i].min_offset;
-        RExC_rx->check_offset_max = RExC_rx->substrs->data[i].max_offset;
-        if (!i && (RExC_rx->intflags & (PREGf_ANCH_SBOL|PREGf_ANCH_GPOS)))
-            RExC_rx->intflags |= PREGf_NOSCAN;
-
-        if ((RExC_rx->check_substr || RExC_rx->check_utf8) ) {
-            RExC_rx->extflags |= RXf_USE_INTUIT;
-            if (SvTAIL(RExC_rx->check_substr ? RExC_rx->check_substr : RExC_rx->check_utf8))
-                RExC_rx->extflags |= RXf_INTUIT_TAIL;
-        }
-
-        /* XXX Unneeded? dmq (shouldn't as this is handled elsewhere)
-        if ( (STRLEN)minlen < longest_length[1] )
-            minlen= longest_length[1];
-        if ( (STRLEN)minlen < longest_length[0] )
-            minlen= longest_length[0];
-        */
-    }
-    else {
-        /* Several toplevels. Best we can is to set minlen. */
-        SSize_t fake_deltap;
-        regnode_ssc ch_class;
-        SSize_t last_close = 0;
-        regnode *last_close_op = NULL;
-
-        DEBUG_PARSE_r(Perl_re_printf( aTHX_  "\nMulti Top Level\n"));
-
-        scan = RExC_rxi->program + 1;
-        ssc_init(pRExC_state, &ch_class);
-        data.start_class = &ch_class;
-        data.last_closep = &last_close;
-        data.last_close_opp = &last_close_op;
-
-        DEBUG_RExC_seen();
-        /*
-         * MAIN ENTRY FOR study_chunk() FOR m/P1|P2|.../
-         * (patterns WITH top level branches)
-         */
-        minlen = study_chunk(pRExC_state,
-            &scan, &minlen, &fake_deltap, scan + RExC_size, &data, -1, 0, NULL,
-            SCF_DO_STCLASS_AND|SCF_WHILEM_VISITED_POS|(restudied
-                                                      ? SCF_TRIE_DOING_RESTUDY
-                                                      : 0),
-            0, TRUE);
-        /* search for "restudy" in this file for a detailed explanation
-         * of 'restudied' and SCF_TRIE_DOING_RESTUDY */
-
-        CHECK_RESTUDY_GOTO_butfirst(NOOP);
-
-        RExC_rx->check_substr = NULL;
-        RExC_rx->check_utf8 = NULL;
-        RExC_rx->substrs->data[0].substr      = NULL;
-        RExC_rx->substrs->data[0].utf8_substr = NULL;
-        RExC_rx->substrs->data[1].substr      = NULL;
-        RExC_rx->substrs->data[1].utf8_substr = NULL;
-
-        if (! (ANYOF_FLAGS(data.start_class) & SSC_MATCHES_EMPTY_STRING)
-            && is_ssc_worth_it(pRExC_state, data.start_class))
-        {
-            const U32 n = add_data(pRExC_state, STR_WITH_LEN("f"));
-
-            ssc_finalize(pRExC_state, data.start_class);
-
-            Newx(RExC_rxi->data->data[n], 1, regnode_ssc);
-            StructCopy(data.start_class,
-                       (regnode_ssc*)RExC_rxi->data->data[n],
-                       regnode_ssc);
-            RExC_rxi->regstclass = (regnode*)RExC_rxi->data->data[n];
-            RExC_rx->intflags &= ~PREGf_SKIP;  /* Used in find_byclass(). */
-            DEBUG_COMPILE_r({ SV* sv = sv_newmortal();
-                      regprop(RExC_rx, sv, (regnode*)data.start_class, NULL, pRExC_state);
-                      Perl_re_printf( aTHX_
-                                    "synthetic stclass \"%s\".\n",
-                                    SvPVX_const(sv));});
-            data.start_class = NULL;
-        }
-    }
-
-    if (RExC_seen & REG_UNBOUNDED_QUANTIFIER_SEEN) {
-        RExC_rx->extflags |= RXf_UNBOUNDED_QUANTIFIER_SEEN;
-        RExC_rx->maxlen = REG_INFTY;
-    }
-    else {
-        RExC_rx->maxlen = RExC_maxlen;
-    }
-
-    /* Guard against an embedded (?=) or (?<=) with a longer minlen than
-       the "real" pattern. */
-    DEBUG_OPTIMISE_r({
-        Perl_re_printf( aTHX_ "minlen: %" IVdf " RExC_rx->minlen:%" IVdf " maxlen:%" IVdf "\n",
-                      (IV)minlen, (IV)RExC_rx->minlen, (IV)RExC_maxlen);
-    });
-    RExC_rx->minlenret = minlen;
-    if (RExC_rx->minlen < minlen)
-        RExC_rx->minlen = minlen;
-
-    if (RExC_seen & REG_RECURSE_SEEN ) {
-        RExC_rx->intflags |= PREGf_RECURSE_SEEN;
-        Newx(RExC_rx->recurse_locinput, RExC_rx->nparens + 1, char *);
-    }
-    if (RExC_seen & REG_GPOS_SEEN)
-        RExC_rx->intflags |= PREGf_GPOS_SEEN;
-    if (RExC_seen & REG_LOOKBEHIND_SEEN)
-        RExC_rx->extflags |= RXf_NO_INPLACE_SUBST; /* inplace might break the
-                                                lookbehind */
-    if (pRExC_state->code_blocks)
-        RExC_rx->extflags |= RXf_EVAL_SEEN;
-    if (RExC_seen & REG_VERBARG_SEEN)
-    {
-        RExC_rx->intflags |= PREGf_VERBARG_SEEN;
-        RExC_rx->extflags |= RXf_NO_INPLACE_SUBST; /* don't understand this! Yves */
-    }
-    if (RExC_seen & REG_CUTGROUP_SEEN)
-        RExC_rx->intflags |= PREGf_CUTGROUP_SEEN;
-    if (pm_flags & PMf_USE_RE_EVAL)
-        RExC_rx->intflags |= PREGf_USE_RE_EVAL;
-    if (RExC_paren_names)
-        RXp_PAREN_NAMES(RExC_rx) = MUTABLE_HV(SvREFCNT_inc(RExC_paren_names));
-    else
-        RXp_PAREN_NAMES(RExC_rx) = NULL;
-
-    /* If we have seen an anchor in our pattern then we set the extflag RXf_IS_ANCHORED
-     * so it can be used in pp.c */
-    if (RExC_rx->intflags & PREGf_ANCH)
-        RExC_rx->extflags |= RXf_IS_ANCHORED;
-
-
-    {
-        /* this is used to identify "special" patterns that might result
-         * in Perl NOT calling the regex engine and instead doing the match "itself",
-         * particularly special cases in split//. By having the regex compiler
-         * do this pattern matching at a regop level (instead of by inspecting the pattern)
-         * we avoid weird issues with equivalent patterns resulting in different behavior,
-         * AND we allow non Perl engines to get the same optimizations by the setting the
-         * flags appropriately - Yves */
-        regnode *first = RExC_rxi->program + 1;
-        U8 fop = OP(first);
-        regnode *next = NEXTOPER(first);
-        /* It's safe to read through *next only if OP(first) is a regop of
-         * the right type (not EXACT, for example).
-         */
-        U8 nop = (fop == NOTHING || fop == MBOL || fop == SBOL || fop == PLUS)
-                ? OP(next) : 0;
-
-        if (PL_regkind[fop] == NOTHING && nop == END)
-            RExC_rx->extflags |= RXf_NULL;
-        else if ((fop == MBOL || (fop == SBOL && !first->flags)) && nop == END)
-            /* when fop is SBOL first->flags will be true only when it was
-             * produced by parsing /\A/, and not when parsing /^/. This is
-             * very important for the split code as there we want to
-             * treat /^/ as /^/m, but we do not want to treat /\A/ as /^/m.
-             * See rt #122761 for more details. -- Yves */
-            RExC_rx->extflags |= RXf_START_ONLY;
-        else if (fop == PLUS
-                 && PL_regkind[nop] == POSIXD && FLAGS(next) == _CC_SPACE
-                 && OP(regnext(first)) == END)
-            RExC_rx->extflags |= RXf_WHITE;
-        else if ( RExC_rx->extflags & RXf_SPLIT
-                  && (PL_regkind[fop] == EXACT && ! isEXACTFish(fop))
-                  && STR_LEN(first) == 1
-                  && *(STRING(first)) == ' '
-                  && OP(regnext(first)) == END )
-            RExC_rx->extflags |= (RXf_SKIPWHITE|RXf_WHITE);
-
-    }
-
-    if (RExC_contains_locale) {
-        RXp_EXTFLAGS(RExC_rx) |= RXf_TAINTED;
-    }
-
-#ifdef DEBUGGING
-    if (RExC_paren_names) {
-        RExC_rxi->name_list_idx = add_data( pRExC_state, STR_WITH_LEN("a"));
-        RExC_rxi->data->data[RExC_rxi->name_list_idx]
-                                   = (void*)SvREFCNT_inc(RExC_paren_name_list);
-    } else
-#endif
-    RExC_rxi->name_list_idx = 0;
-
-    while ( RExC_recurse_count > 0 ) {
-        const regnode *scan = RExC_recurse[ --RExC_recurse_count ];
-        /*
-         * This data structure is set up in study_chunk() and is used
-         * to calculate the distance between a GOSUB regopcode and
-         * the OPEN/CURLYM (CURLYM's are special and can act like OPEN's)
-         * it refers to.
-         *
-         * If for some reason someone writes code that optimises
-         * away a GOSUB opcode then the assert should be changed to
-         * an if(scan) to guard the ARG2L_SET() - Yves
-         *
-         */
-        assert(scan && OP(scan) == GOSUB);
-        ARG2L_SET( scan, RExC_open_parens[ARG(scan)] - REGNODE_OFFSET(scan));
-    }
-
-    Newxz(RExC_rx->offs, RExC_total_parens, regexp_paren_pair);
-    /* assume we don't need to swap parens around before we match */
-    DEBUG_TEST_r({
-        Perl_re_printf( aTHX_ "study_chunk_recursed_count: %lu\n",
-            (unsigned long)RExC_study_chunk_recursed_count);
-    });
-    DEBUG_DUMP_r({
-        DEBUG_RExC_seen();
-        Perl_re_printf( aTHX_ "Final program:\n");
-        regdump(RExC_rx);
-    });
-
-    if (RExC_open_parens) {
-        Safefree(RExC_open_parens);
-        RExC_open_parens = NULL;
-    }
-    if (RExC_close_parens) {
-        Safefree(RExC_close_parens);
-        RExC_close_parens = NULL;
-    }
-
-#ifdef USE_ITHREADS
-    /* under ithreads the ?pat? PMf_USED flag on the pmop is simulated
-     * by setting the regexp SV to readonly-only instead. If the
-     * pattern's been recompiled, the USEDness should remain. */
-    if (old_re && SvREADONLY(old_re))
-        SvREADONLY_on(Rx);
-#endif
-    return Rx;
-}
-
-
-SV*
-Perl_reg_named_buff(pTHX_ REGEXP * const rx, SV * const key, SV * const value,
-                    const U32 flags)
-{
-    PERL_ARGS_ASSERT_REG_NAMED_BUFF;
-
-    PERL_UNUSED_ARG(value);
-
-    if (flags & RXapif_FETCH) {
-        return reg_named_buff_fetch(rx, key, flags);
-    } else if (flags & (RXapif_STORE | RXapif_DELETE | RXapif_CLEAR)) {
-        Perl_croak_no_modify();
-        return NULL;
-    } else if (flags & RXapif_EXISTS) {
-        return reg_named_buff_exists(rx, key, flags)
-            ? &PL_sv_yes
-            : &PL_sv_no;
-    } else if (flags & RXapif_REGNAMES) {
-        return reg_named_buff_all(rx, flags);
-    } else if (flags & (RXapif_SCALAR | RXapif_REGNAMES_COUNT)) {
-        return reg_named_buff_scalar(rx, flags);
-    } else {
-        Perl_croak(aTHX_ "panic: Unknown flags %d in named_buff", (int)flags);
-        return NULL;
-    }
-}
-
-SV*
-Perl_reg_named_buff_iter(pTHX_ REGEXP * const rx, const SV * const lastkey,
-                         const U32 flags)
-{
-    PERL_ARGS_ASSERT_REG_NAMED_BUFF_ITER;
-    PERL_UNUSED_ARG(lastkey);
-
-    if (flags & RXapif_FIRSTKEY)
-        return reg_named_buff_firstkey(rx, flags);
-    else if (flags & RXapif_NEXTKEY)
-        return reg_named_buff_nextkey(rx, flags);
-    else {
-        Perl_croak(aTHX_ "panic: Unknown flags %d in named_buff_iter",
-                                            (int)flags);
-        return NULL;
-    }
-}
-
-SV*
-Perl_reg_named_buff_fetch(pTHX_ REGEXP * const r, SV * const namesv,
-                          const U32 flags)
-{
-    SV *ret;
-    struct regexp *const rx = ReANY(r);
-
-    PERL_ARGS_ASSERT_REG_NAMED_BUFF_FETCH;
-
-    if (rx && RXp_PAREN_NAMES(rx)) {
-        HE *he_str = hv_fetch_ent( RXp_PAREN_NAMES(rx), namesv, 0, 0 );
-        if (he_str) {
-            IV i;
-            SV* sv_dat=HeVAL(he_str);
-            I32 *nums=(I32*)SvPVX(sv_dat);
-            AV * const retarray = (flags & RXapif_ALL) ? newAV() : NULL;
-            for ( i=0; i<SvIVX(sv_dat); i++ ) {
-                if ((I32)(rx->nparens) >= nums[i]
-                    && rx->offs[nums[i]].start != -1
-                    && rx->offs[nums[i]].end != -1)
-                {
-                    ret = newSVpvs("");
-                    CALLREG_NUMBUF_FETCH(r, nums[i], ret);
-                    if (!retarray)
-                        return ret;
-                } else {
-                    if (retarray)
-                        ret = newSV_type(SVt_NULL);
-                }
-                if (retarray)
-                    av_push(retarray, ret);
-            }
-            if (retarray)
-                return newRV_noinc(MUTABLE_SV(retarray));
-        }
-    }
-    return NULL;
-}
-
-bool
-Perl_reg_named_buff_exists(pTHX_ REGEXP * const r, SV * const key,
-                           const U32 flags)
-{
-    struct regexp *const rx = ReANY(r);
-
-    PERL_ARGS_ASSERT_REG_NAMED_BUFF_EXISTS;
-
-    if (rx && RXp_PAREN_NAMES(rx)) {
-        if (flags & RXapif_ALL) {
-            return hv_exists_ent(RXp_PAREN_NAMES(rx), key, 0);
-        } else {
-            SV *sv = CALLREG_NAMED_BUFF_FETCH(r, key, flags);
-            if (sv) {
-                SvREFCNT_dec_NN(sv);
-                return TRUE;
-            } else {
-                return FALSE;
-            }
-        }
-    } else {
-        return FALSE;
-    }
-}
-
-SV*
-Perl_reg_named_buff_firstkey(pTHX_ REGEXP * const r, const U32 flags)
-{
-    struct regexp *const rx = ReANY(r);
-
-    PERL_ARGS_ASSERT_REG_NAMED_BUFF_FIRSTKEY;
-
-    if ( rx && RXp_PAREN_NAMES(rx) ) {
-        (void)hv_iterinit(RXp_PAREN_NAMES(rx));
-
-        return CALLREG_NAMED_BUFF_NEXTKEY(r, NULL, flags & ~RXapif_FIRSTKEY);
-    } else {
-        return FALSE;
-    }
-}
-
-SV*
-Perl_reg_named_buff_nextkey(pTHX_ REGEXP * const r, const U32 flags)
-{
-    struct regexp *const rx = ReANY(r);
-    DECLARE_AND_GET_RE_DEBUG_FLAGS;
-
-    PERL_ARGS_ASSERT_REG_NAMED_BUFF_NEXTKEY;
-
-    if (rx && RXp_PAREN_NAMES(rx)) {
-        HV *hv = RXp_PAREN_NAMES(rx);
-        HE *temphe;
-        while ( (temphe = hv_iternext_flags(hv, 0)) ) {
-            IV i;
-            IV parno = 0;
-            SV* sv_dat = HeVAL(temphe);
-            I32 *nums = (I32*)SvPVX(sv_dat);
-            for ( i = 0; i < SvIVX(sv_dat); i++ ) {
-                if ((I32)(rx->lastparen) >= nums[i] &&
-                    rx->offs[nums[i]].start != -1 &&
-                    rx->offs[nums[i]].end != -1)
-                {
-                    parno = nums[i];
-                    break;
-                }
-            }
-            if (parno || flags & RXapif_ALL) {
-                return newSVhek(HeKEY_hek(temphe));
-            }
-        }
-    }
-    return NULL;
-}
-
-SV*
-Perl_reg_named_buff_scalar(pTHX_ REGEXP * const r, const U32 flags)
-{
-    SV *ret;
-    AV *av;
-    SSize_t length;
-    struct regexp *const rx = ReANY(r);
-
-    PERL_ARGS_ASSERT_REG_NAMED_BUFF_SCALAR;
-
-    if (rx && RXp_PAREN_NAMES(rx)) {
-        if (flags & (RXapif_ALL | RXapif_REGNAMES_COUNT)) {
-            return newSViv(HvTOTALKEYS(RXp_PAREN_NAMES(rx)));
-        } else if (flags & RXapif_ONE) {
-            ret = CALLREG_NAMED_BUFF_ALL(r, (flags | RXapif_REGNAMES));
-            av = MUTABLE_AV(SvRV(ret));
-            length = av_count(av);
-            SvREFCNT_dec_NN(ret);
-            return newSViv(length);
-        } else {
-            Perl_croak(aTHX_ "panic: Unknown flags %d in named_buff_scalar",
-                                                (int)flags);
-            return NULL;
-        }
-    }
-    return &PL_sv_undef;
-}
-
-SV*
-Perl_reg_named_buff_all(pTHX_ REGEXP * const r, const U32 flags)
-{
-    struct regexp *const rx = ReANY(r);
-    AV *av = newAV();
-
-    PERL_ARGS_ASSERT_REG_NAMED_BUFF_ALL;
-
-    if (rx && RXp_PAREN_NAMES(rx)) {
-        HV *hv= RXp_PAREN_NAMES(rx);
-        HE *temphe;
-        (void)hv_iterinit(hv);
-        while ( (temphe = hv_iternext_flags(hv, 0)) ) {
-            IV i;
-            IV parno = 0;
-            SV* sv_dat = HeVAL(temphe);
-            I32 *nums = (I32*)SvPVX(sv_dat);
-            for ( i = 0; i < SvIVX(sv_dat); i++ ) {
-                if ((I32)(rx->lastparen) >= nums[i] &&
-                    rx->offs[nums[i]].start != -1 &&
-                    rx->offs[nums[i]].end != -1)
-                {
-                    parno = nums[i];
-                    break;
-                }
-            }
-            if (parno || flags & RXapif_ALL) {
-                av_push(av, newSVhek(HeKEY_hek(temphe)));
-            }
-        }
-    }
-
-    return newRV_noinc(MUTABLE_SV(av));
-}
-
-void
-Perl_reg_numbered_buff_fetch(pTHX_ REGEXP * const r, const I32 paren,
-                             SV * const sv)
-{
-    struct regexp *const rx = ReANY(r);
-    char *s = NULL;
-    SSize_t i = 0;
-    SSize_t s1, t1;
-    I32 n = paren;
-
-    PERL_ARGS_ASSERT_REG_NUMBERED_BUFF_FETCH;
-
-    if (      n == RX_BUFF_IDX_CARET_PREMATCH
-           || n == RX_BUFF_IDX_CARET_FULLMATCH
-           || n == RX_BUFF_IDX_CARET_POSTMATCH
-       )
-    {
-        bool keepcopy = cBOOL(rx->extflags & RXf_PMf_KEEPCOPY);
-        if (!keepcopy) {
-            /* on something like
-             *    $r = qr/.../;
-             *    /$qr/p;
-             * the KEEPCOPY is set on the PMOP rather than the regex */
-            if (PL_curpm && r == PM_GETRE(PL_curpm))
-                 keepcopy = cBOOL(PL_curpm->op_pmflags & PMf_KEEPCOPY);
-        }
-        if (!keepcopy)
-            goto ret_undef;
-    }
-
-    if (!rx->subbeg)
-        goto ret_undef;
-
-    if (n == RX_BUFF_IDX_CARET_FULLMATCH)
-        /* no need to distinguish between them any more */
-        n = RX_BUFF_IDX_FULLMATCH;
-
-    if ((n == RX_BUFF_IDX_PREMATCH || n == RX_BUFF_IDX_CARET_PREMATCH)
-        && rx->offs[0].start != -1)
-    {
-        /* $`, ${^PREMATCH} */
-        i = rx->offs[0].start;
-        s = rx->subbeg;
-    }
-    else
-    if ((n == RX_BUFF_IDX_POSTMATCH || n == RX_BUFF_IDX_CARET_POSTMATCH)
-        && rx->offs[0].end != -1)
-    {
-        /* $', ${^POSTMATCH} */
-        s = rx->subbeg - rx->suboffset + rx->offs[0].end;
-        i = rx->sublen + rx->suboffset - rx->offs[0].end;
-    }
-    else
-    if (inRANGE(n, 0, (I32)rx->nparens) &&
-        (s1 = rx->offs[n].start) != -1  &&
-        (t1 = rx->offs[n].end) != -1)
-    {
-        /* $&, ${^MATCH},  $1 ... */
-        i = t1 - s1;
-        s = rx->subbeg + s1 - rx->suboffset;
-    } else {
-        goto ret_undef;
-    }
-
-    assert(s >= rx->subbeg);
-    assert((STRLEN)rx->sublen >= (STRLEN)((s - rx->subbeg) + i) );
-    if (i >= 0) {
-#ifdef NO_TAINT_SUPPORT
-        sv_setpvn(sv, s, i);
-#else
-        const int oldtainted = TAINT_get;
-        TAINT_NOT;
-        sv_setpvn(sv, s, i);
-        TAINT_set(oldtainted);
-#endif
-        if (RXp_MATCH_UTF8(rx))
-            SvUTF8_on(sv);
-        else
-            SvUTF8_off(sv);
-        if (TAINTING_get) {
-            if (RXp_MATCH_TAINTED(rx)) {
-                if (SvTYPE(sv) >= SVt_PVMG) {
-                    MAGIC* const mg = SvMAGIC(sv);
-                    MAGIC* mgt;
-                    TAINT;
-                    SvMAGIC_set(sv, mg->mg_moremagic);
-                    SvTAINT(sv);
-                    if ((mgt = SvMAGIC(sv))) {
-                        mg->mg_moremagic = mgt;
-                        SvMAGIC_set(sv, mg);
-                    }
-                } else {
-                    TAINT;
-                    SvTAINT(sv);
-                }
-            } else
-                SvTAINTED_off(sv);
-        }
-    } else {
-      ret_undef:
-        sv_set_undef(sv);
-        return;
-    }
-}
-
-void
-Perl_reg_numbered_buff_store(pTHX_ REGEXP * const rx, const I32 paren,
-                                                         SV const * const value)
-{
-    PERL_ARGS_ASSERT_REG_NUMBERED_BUFF_STORE;
-
-    PERL_UNUSED_ARG(rx);
-    PERL_UNUSED_ARG(paren);
-    PERL_UNUSED_ARG(value);
-
-    if (!PL_localizing)
-        Perl_croak_no_modify();
-}
-
-I32
-Perl_reg_numbered_buff_length(pTHX_ REGEXP * const r, const SV * const sv,
-                              const I32 paren)
-{
-    struct regexp *const rx = ReANY(r);
-    I32 i;
-    I32 s1, t1;
-
-    PERL_ARGS_ASSERT_REG_NUMBERED_BUFF_LENGTH;
-
-    if (   paren == RX_BUFF_IDX_CARET_PREMATCH
-        || paren == RX_BUFF_IDX_CARET_FULLMATCH
-        || paren == RX_BUFF_IDX_CARET_POSTMATCH
-    )
-    {
-        bool keepcopy = cBOOL(rx->extflags & RXf_PMf_KEEPCOPY);
-        if (!keepcopy) {
-            /* on something like
-             *    $r = qr/.../;
-             *    /$qr/p;
-             * the KEEPCOPY is set on the PMOP rather than the regex */
-            if (PL_curpm && r == PM_GETRE(PL_curpm))
-                 keepcopy = cBOOL(PL_curpm->op_pmflags & PMf_KEEPCOPY);
-        }
-        if (!keepcopy)
-            goto warn_undef;
-    }
-
-    /* Some of this code was originally in C<Perl_magic_len> in F<mg.c> */
-    switch (paren) {
-      case RX_BUFF_IDX_CARET_PREMATCH: /* ${^PREMATCH} */
-      case RX_BUFF_IDX_PREMATCH:       /* $` */
-        if (rx->offs[0].start != -1) {
-                        i = rx->offs[0].start;
-                        if (i > 0) {
-                                s1 = 0;
-                                t1 = i;
-                                goto getlen;
-                        }
-            }
-        return 0;
-
-      case RX_BUFF_IDX_CARET_POSTMATCH: /* ${^POSTMATCH} */
-      case RX_BUFF_IDX_POSTMATCH:       /* $' */
-            if (rx->offs[0].end != -1) {
-                        i = rx->sublen - rx->offs[0].end;
-                        if (i > 0) {
-                                s1 = rx->offs[0].end;
-                                t1 = rx->sublen;
-                                goto getlen;
-                        }
-            }
-        return 0;
-
-      default: /* $& / ${^MATCH}, $1, $2, ... */
-            if (paren <= (I32)rx->nparens &&
-            (s1 = rx->offs[paren].start) != -1 &&
-            (t1 = rx->offs[paren].end) != -1)
-            {
-            i = t1 - s1;
-            goto getlen;
-        } else {
-          warn_undef:
-            if (ckWARN(WARN_UNINITIALIZED))
-                report_uninit((const SV *)sv);
-            return 0;
-        }
-    }
-  getlen:
-    if (i > 0 && RXp_MATCH_UTF8(rx)) {
-        const char * const s = rx->subbeg - rx->suboffset + s1;
-        const U8 *ep;
-        STRLEN el;
-
-        i = t1 - s1;
-        if (is_utf8_string_loclen((U8*)s, i, &ep, &el))
-            i = el;
-    }
-    return i;
-}
-
-SV*
-Perl_reg_qr_package(pTHX_ REGEXP * const rx)
-{
-    PERL_ARGS_ASSERT_REG_QR_PACKAGE;
-        PERL_UNUSED_ARG(rx);
-        if (0)
-            return NULL;
-        else
-            return newSVpvs("Regexp");
-}
-
-/* Scans the name of a named buffer from the pattern.
- * If flags is REG_RSN_RETURN_NULL returns null.
- * If flags is REG_RSN_RETURN_NAME returns an SV* containing the name
- * If flags is REG_RSN_RETURN_DATA returns the data SV* corresponding
- * to the parsed name as looked up in the RExC_paren_names hash.
- * If there is an error throws a vFAIL().. type exception.
- */
-
-#define REG_RSN_RETURN_NULL    0
-#define REG_RSN_RETURN_NAME    1
-#define REG_RSN_RETURN_DATA    2
-
-STATIC SV*
-S_reg_scan_name(pTHX_ RExC_state_t *pRExC_state, U32 flags)
-{
-    char *name_start = RExC_parse;
-    SV* sv_name;
-
-    PERL_ARGS_ASSERT_REG_SCAN_NAME;
-
-    assert (RExC_parse <= RExC_end);
-    if (RExC_parse == RExC_end) NOOP;
-    else if (isIDFIRST_lazy_if_safe(RExC_parse, RExC_end, UTF)) {
-         /* Note that the code here assumes well-formed UTF-8.  Skip IDFIRST by
-          * using do...while */
-        if (UTF)
-            do {
-                RExC_parse_inc_utf8();
-            } while (   RExC_parse < RExC_end
-                     && isWORDCHAR_utf8_safe((U8*)RExC_parse, (U8*) RExC_end));
-        else
-            do {
-                RExC_parse_inc_by(1);
-            } while (RExC_parse < RExC_end && isWORDCHAR(*RExC_parse));
-    } else {
-        RExC_parse_inc_by(1); /* so the <- from the vFAIL is after the offending
-                         character */
-        vFAIL("Group name must start with a non-digit word character");
-    }
-    sv_name = newSVpvn_flags(name_start, (int)(RExC_parse - name_start),
-                             SVs_TEMP | (UTF ? SVf_UTF8 : 0));
-    if ( flags == REG_RSN_RETURN_NAME)
-        return sv_name;
-    else if (flags==REG_RSN_RETURN_DATA) {
-        HE *he_str = NULL;
-        SV *sv_dat = NULL;
-        if ( ! sv_name )      /* should not happen*/
-            Perl_croak(aTHX_ "panic: no svname in reg_scan_name");
-        if (RExC_paren_names)
-            he_str = hv_fetch_ent( RExC_paren_names, sv_name, 0, 0 );
-        if ( he_str )
-            sv_dat = HeVAL(he_str);
-        if ( ! sv_dat ) {   /* Didn't find group */
-
-            /* It might be a forward reference; we can't fail until we
-                * know, by completing the parse to get all the groups, and
-                * then reparsing */
-            if (ALL_PARENS_COUNTED)  {
-                vFAIL("Reference to nonexistent named group");
-            }
-            else {
-                REQUIRE_PARENS_PASS;
-            }
-        }
-        return sv_dat;
-    }
-
-    Perl_croak(aTHX_ "panic: bad flag %lx in reg_scan_name",
-                     (unsigned long) flags);
-}
-
-#define DEBUG_PARSE_MSG(funcname)     DEBUG_PARSE_r({           \
-    if (RExC_lastparse!=RExC_parse) {                           \
-        Perl_re_printf( aTHX_  "%s",                            \
-            Perl_pv_pretty(aTHX_ RExC_mysv1, RExC_parse,        \
-                RExC_end - RExC_parse, 16,                      \
-                "", "",                                         \
-                PERL_PV_ESCAPE_UNI_DETECT |                     \
-                PERL_PV_PRETTY_ELLIPSES   |                     \
-                PERL_PV_PRETTY_LTGT       |                     \
-                PERL_PV_ESCAPE_RE         |                     \
-                PERL_PV_PRETTY_EXACTSIZE                        \
-            )                                                   \
-        );                                                      \
-    } else                                                      \
-        Perl_re_printf( aTHX_ "%16s","");                       \
-                                                                \
-    if (RExC_lastnum!=RExC_emit)                                \
-       Perl_re_printf( aTHX_ "|%4zu", RExC_emit);                \
-    else                                                        \
-       Perl_re_printf( aTHX_ "|%4s","");                        \
-    Perl_re_printf( aTHX_ "|%*s%-4s",                           \
-        (int)((depth*2)), "",                                   \
-        (funcname)                                              \
-    );                                                          \
-    RExC_lastnum=RExC_emit;                                     \
-    RExC_lastparse=RExC_parse;                                  \
-})
+    if (!RExC_utf8 && SvUTF8(qr)) {
+        /* first time through; the pattern got upgraded; save the
+         * qr for the next time through */
+        assert(!pRExC_state->runtime_code_qr);
+        pRExC_state->runtime_code_qr = qr;
+        return 0;
+    }
 
 
+    /* extract any code blocks within the returned qr//  */
 
-#define DEBUG_PARSE(funcname)     DEBUG_PARSE_r({           \
-    DEBUG_PARSE_MSG((funcname));                            \
-    Perl_re_printf( aTHX_ "%4s","\n");                                  \
-})
-#define DEBUG_PARSE_FMT(funcname,fmt,args)     DEBUG_PARSE_r({\
-    DEBUG_PARSE_MSG((funcname));                            \
-    Perl_re_printf( aTHX_ fmt "\n",args);                               \
-})
 
-/* This section of code defines the inversion list object and its methods.  The
- * interfaces are highly subject to change, so as much as possible is static to
- * this file.  An inversion list is here implemented as a malloc'd C UV array
- * as an SVt_INVLIST scalar.
- *
- * An inversion list for Unicode is an array of code points, sorted by ordinal
- * number.  Each element gives the code point that begins a range that extends
- * up-to but not including the code point given by the next element.  The final
- * element gives the first code point of a range that extends to the platform's
- * infinity.  The even-numbered elements (invlist[0], invlist[2], invlist[4],
- * ...) give ranges whose code points are all in the inversion list.  We say
- * that those ranges are in the set.  The odd-numbered elements give ranges
- * whose code points are not in the inversion list, and hence not in the set.
- * Thus, element [0] is the first code point in the list.  Element [1]
- * is the first code point beyond that not in the list; and element [2] is the
- * first code point beyond that that is in the list.  In other words, the first
- * range is invlist[0]..(invlist[1]-1), and all code points in that range are
- * in the inversion list.  The second range is invlist[1]..(invlist[2]-1), and
- * all code points in that range are not in the inversion list.  The third
- * range invlist[2]..(invlist[3]-1) gives code points that are in the inversion
- * list, and so forth.  Thus every element whose index is divisible by two
- * gives the beginning of a range that is in the list, and every element whose
- * index is not divisible by two gives the beginning of a range not in the
- * list.  If the final element's index is divisible by two, the inversion list
- * extends to the platform's infinity; otherwise the highest code point in the
- * inversion list is the contents of that element minus 1.
- *
- * A range that contains just a single code point N will look like
- *  invlist[i]   == N
- *  invlist[i+1] == N+1
- *
- * If N is UV_MAX (the highest representable code point on the machine), N+1 is
- * impossible to represent, so element [i+1] is omitted.  The single element
- * inversion list
- *  invlist[0] == UV_MAX
- * contains just UV_MAX, but is interpreted as matching to infinity.
- *
- * Taking the complement (inverting) an inversion list is quite simple, if the
- * first element is 0, remove it; otherwise add a 0 element at the beginning.
- * This implementation reserves an element at the beginning of each inversion
- * list to always contain 0; there is an additional flag in the header which
- * indicates if the list begins at the 0, or is offset to begin at the next
- * element.  This means that the inversion list can be inverted without any
- * copying; just flip the flag.
- *
- * More about inversion lists can be found in "Unicode Demystified"
- * Chapter 13 by Richard Gillam, published by Addison-Wesley.
- *
- * The inversion list data structure is currently implemented as an SV pointing
- * to an array of UVs that the SV thinks are bytes.  This allows us to have an
- * array of UV whose memory management is automatically handled by the existing
- * facilities for SV's.
- *
- * Some of the methods should always be private to the implementation, and some
- * should eventually be made public */
+    /* merge the main (r1) and run-time (r2) code blocks into one */
+    {
+        RXi_GET_DECL(ReANY((REGEXP *)qr), r2);
+        struct reg_code_block *new_block, *dst;
+        RExC_state_t * const r1 = pRExC_state; /* convenient alias */
+        int i1 = 0, i2 = 0;
+        int r1c, r2c;
 
-/* The header definitions are in F<invlist_inline.h> */
+        if (!r2->code_blocks || !r2->code_blocks->count) /* we guessed wrong */
+        {
+            SvREFCNT_dec_NN(qr);
+            return 1;
+        }
 
-#ifndef PERL_IN_XSUB_RE
+        if (!r1->code_blocks)
+            r1->code_blocks = S_alloc_code_blocks(aTHX_ 0);
 
-PERL_STATIC_INLINE UV*
-S__invlist_array_init(SV* const invlist, const bool will_have_0)
-{
-    /* Returns a pointer to the first element in the inversion list's array.
-     * This is called upon initialization of an inversion list.  Where the
-     * array begins depends on whether the list has the code point U+0000 in it
-     * or not.  The other parameter tells it whether the code that follows this
-     * call is about to put a 0 in the inversion list or not.  The first
-     * element is either the element reserved for 0, if TRUE, or the element
-     * after it, if FALSE */
+        r1c = r1->code_blocks->count;
+        r2c = r2->code_blocks->count;
+
+        Newx(new_block, r1c + r2c, struct reg_code_block);
 
-    bool* offset = get_invlist_offset_addr(invlist);
-    UV* zero_addr = (UV *) SvPVX(invlist);
+        dst = new_block;
 
-    PERL_ARGS_ASSERT__INVLIST_ARRAY_INIT;
+        while (i1 < r1c || i2 < r2c) {
+            struct reg_code_block *src;
+            bool is_qr = 0;
 
-    /* Must be empty */
-    assert(! _invlist_len(invlist));
+            if (i1 == r1c) {
+                src = &r2->code_blocks->cb[i2++];
+                is_qr = 1;
+            }
+            else if (i2 == r2c)
+                src = &r1->code_blocks->cb[i1++];
+            else if (  r1->code_blocks->cb[i1].start
+                     < r2->code_blocks->cb[i2].start)
+            {
+                src = &r1->code_blocks->cb[i1++];
+                assert(src->end < r2->code_blocks->cb[i2].start);
+            }
+            else {
+                assert(  r1->code_blocks->cb[i1].start
+                       > r2->code_blocks->cb[i2].start);
+                src = &r2->code_blocks->cb[i2++];
+                is_qr = 1;
+                assert(src->end < r1->code_blocks->cb[i1].start);
+            }
 
-    *zero_addr = 0;
+            assert(pat[src->start] == '(');
+            assert(pat[src->end]   == ')');
+            dst->start     = src->start;
+            dst->end       = src->end;
+            dst->block     = src->block;
+            dst->src_regex  = is_qr ? (REGEXP*) SvREFCNT_inc( (SV*) qr)
+                                    : src->src_regex;
+            dst++;
+        }
+        r1->code_blocks->count += r2c;
+        Safefree(r1->code_blocks->cb);
+        r1->code_blocks->cb = new_block;
+    }
 
-    /* 1^1 = 0; 1^0 = 1 */
-    *offset = 1 ^ will_have_0;
-    return zero_addr + *offset;
+    SvREFCNT_dec_NN(qr);
+    return 1;
 }
 
-STATIC void
-S_invlist_replace_list_destroys_src(pTHX_ SV * dest, SV * src)
+
+STATIC bool
+S_setup_longest(pTHX_ RExC_state_t *pRExC_state,
+                      struct reg_substr_datum  *rsd,
+                      struct scan_data_substrs *sub,
+                      STRLEN longest_length)
 {
-    /* Replaces the inversion list in 'dest' with the one from 'src'.  It
-     * steals the list from 'src', so 'src' is made to have a NULL list.  This
-     * is similar to what SvSetMagicSV() would do, if it were implemented on
-     * inversion lists, though this routine avoids a copy */
-
-    const UV src_len          = _invlist_len(src);
-    const bool src_offset     = *get_invlist_offset_addr(src);
-    const STRLEN src_byte_len = SvLEN(src);
-    char * array              = SvPVX(src);
-
-#ifndef NO_TAINT_SUPPORT
-    const int oldtainted = TAINT_get;
-#endif
+    /* This is the common code for setting up the floating and fixed length
+     * string data extracted from Perl_re_op_compile() below.  Returns a boolean
+     * as to whether succeeded or not */
 
-    PERL_ARGS_ASSERT_INVLIST_REPLACE_LIST_DESTROYS_SRC;
-
-    assert(is_invlist(src));
-    assert(is_invlist(dest));
-    assert(! invlist_is_iterating(src));
-    assert(SvCUR(src) == 0 || SvCUR(src) < SvLEN(src));
-
-    /* Make sure it ends in the right place with a NUL, as our inversion list
-     * manipulations aren't careful to keep this true, but sv_usepvn_flags()
-     * asserts it */
-    array[src_byte_len - 1] = '\0';
-
-    TAINT_NOT;      /* Otherwise it breaks */
-    sv_usepvn_flags(dest,
-                    (char *) array,
-                    src_byte_len - 1,
-
-                    /* This flag is documented to cause a copy to be avoided */
-                    SV_HAS_TRAILING_NUL);
-    TAINT_set(oldtainted);
-    SvPV_set(src, 0);
-    SvLEN_set(src, 0);
-    SvCUR_set(src, 0);
-
-    /* Finish up copying over the other fields in an inversion list */
-    *get_invlist_offset_addr(dest) = src_offset;
-    invlist_set_len(dest, src_len, src_offset);
-    *get_invlist_previous_index_addr(dest) = 0;
-    invlist_iterfinish(dest);
-}
+    I32 t;
+    SSize_t ml;
+    bool eol  = cBOOL(sub->flags & SF_BEFORE_EOL);
+    bool meol = cBOOL(sub->flags & SF_BEFORE_MEOL);
 
-PERL_STATIC_INLINE IV*
-S_get_invlist_previous_index_addr(SV* invlist)
-{
-    /* Return the address of the IV that is reserved to hold the cached index
-     * */
-    PERL_ARGS_ASSERT_GET_INVLIST_PREVIOUS_INDEX_ADDR;
+    if (! (longest_length
+           || (eol /* Can't have SEOL and MULTI */
+               && (! meol || (RExC_flags & RXf_PMf_MULTILINE)))
+          )
+            /* See comments for join_exact for why REG_UNFOLDED_MULTI_SEEN */
+        || (RExC_seen & REG_UNFOLDED_MULTI_SEEN))
+    {
+        return FALSE;
+    }
+
+    /* copy the information about the longest from the reg_scan_data
+        over to the program. */
+    if (SvUTF8(sub->str)) {
+        rsd->substr      = NULL;
+        rsd->utf8_substr = sub->str;
+    } else {
+        rsd->substr      = sub->str;
+        rsd->utf8_substr = NULL;
+    }
+    /* end_shift is how many chars that must be matched that
+        follow this item. We calculate it ahead of time as once the
+        lookbehind offset is added in we lose the ability to correctly
+        calculate it.*/
+    ml = sub->minlenp ? *(sub->minlenp) : (SSize_t)longest_length;
+    rsd->end_shift = ml - sub->min_offset
+        - longest_length
+            /* XXX SvTAIL is always false here - did you mean FBMcf_TAIL
+             * intead? - DAPM
+            + (SvTAIL(sub->str) != 0)
+            */
+        + sub->lookbehind;
 
-    assert(is_invlist(invlist));
+    t = (eol/* Can't have SEOL and MULTI */
+         && (! meol || (RExC_flags & RXf_PMf_MULTILINE)));
+    fbm_compile(sub->str, t ? FBMcf_TAIL : 0);
 
-    return &(((XINVLIST*) SvANY(invlist))->prev_index);
+    return TRUE;
 }
 
-PERL_STATIC_INLINE IV
-S_invlist_previous_index(SV* const invlist)
+STATIC void
+S_set_regex_pv(pTHX_ RExC_state_t *pRExC_state, REGEXP *Rx)
 {
-    /* Returns cached index of previous search */
+    /* Calculates and sets in the compiled pattern 'Rx' the string to compile,
+     * properly wrapped with the right modifiers */
 
-    PERL_ARGS_ASSERT_INVLIST_PREVIOUS_INDEX;
+    bool has_p     = ((RExC_rx->extflags & RXf_PMf_KEEPCOPY) == RXf_PMf_KEEPCOPY);
+    bool has_charset = RExC_utf8 || (get_regex_charset(RExC_rx->extflags)
+                                                != REGEX_DEPENDS_CHARSET);
 
-    return *get_invlist_previous_index_addr(invlist);
-}
+    /* The caret is output if there are any defaults: if not all the STD
+        * flags are set, or if no character set specifier is needed */
+    bool has_default =
+                (((RExC_rx->extflags & RXf_PMf_STD_PMMOD) != RXf_PMf_STD_PMMOD)
+                || ! has_charset);
+    bool has_runon = ((RExC_seen & REG_RUN_ON_COMMENT_SEEN)
+                                                == REG_RUN_ON_COMMENT_SEEN);
+    U8 reganch = (U8)((RExC_rx->extflags & RXf_PMf_STD_PMMOD)
+                        >> RXf_PMf_STD_PMMOD_SHIFT);
+    const char *fptr = STD_PAT_MODS;        /*"msixxn"*/
+    char *p;
+    STRLEN pat_len = RExC_precomp_end - RExC_precomp;
 
-PERL_STATIC_INLINE void
-S_invlist_set_previous_index(SV* const invlist, const IV index)
-{
-    /* Caches <index> for later retrieval */
+    /* We output all the necessary flags; we never output a minus, as all
+        * those are defaults, so are
+        * covered by the caret */
+    const STRLEN wraplen = pat_len + has_p + has_runon
+        + has_default       /* If needs a caret */
+        + PL_bitcount[reganch] /* 1 char for each set standard flag */
 
-    PERL_ARGS_ASSERT_INVLIST_SET_PREVIOUS_INDEX;
+            /* If needs a character set specifier */
+        + ((has_charset) ? MAX_CHARSET_NAME_LENGTH : 0)
+        + (sizeof("(?:)") - 1);
 
-    assert(index == 0 || index < (int) _invlist_len(invlist));
+    PERL_ARGS_ASSERT_SET_REGEX_PV;
 
-    *get_invlist_previous_index_addr(invlist) = index;
-}
+    /* make sure PL_bitcount bounds not exceeded */
+    STATIC_ASSERT_STMT(sizeof(STD_PAT_MODS) <= 8);
 
-PERL_STATIC_INLINE void
-S_invlist_trim(SV* invlist)
-{
-    /* Free the not currently-being-used space in an inversion list */
+    p = sv_grow(MUTABLE_SV(Rx), wraplen + 1); /* +1 for the ending NUL */
+    SvPOK_on(Rx);
+    if (RExC_utf8)
+        SvFLAGS(Rx) |= SVf_UTF8;
+    *p++='('; *p++='?';
 
-    /* But don't free up the space needed for the 0 UV that is always at the
-     * beginning of the list, nor the trailing NUL */
-    const UV min_size = TO_INTERNAL_SIZE(1) + 1;
+    /* If a default, cover it using the caret */
+    if (has_default) {
+        *p++= DEFAULT_PAT_MOD;
+    }
+    if (has_charset) {
+        STRLEN len;
+        const char* name;
 
-    PERL_ARGS_ASSERT_INVLIST_TRIM;
+        name = get_regex_charset_name(RExC_rx->extflags, &len);
+        if (strEQ(name, DEPENDS_PAT_MODS)) {  /* /d under UTF-8 => /u */
+            assert(RExC_utf8);
+            name = UNICODE_PAT_MODS;
+            len = sizeof(UNICODE_PAT_MODS) - 1;
+        }
+        Copy(name, p, len, char);
+        p += len;
+    }
+    if (has_p)
+        *p++ = KEEPCOPY_PAT_MOD; /*'p'*/
+    {
+        char ch;
+        while((ch = *fptr++)) {
+            if(reganch & 1)
+                *p++ = ch;
+            reganch >>= 1;
+        }
+    }
 
-    assert(is_invlist(invlist));
+    *p++ = ':';
+    Copy(RExC_precomp, p, pat_len, char);
+    assert ((RX_WRAPPED(Rx) - p) < 16);
+    RExC_rx->pre_prefix = p - RX_WRAPPED(Rx);
+    p += pat_len;
 
-    SvPV_renew(invlist, MAX(min_size, SvCUR(invlist) + 1));
+    /* Adding a trailing \n causes this to compile properly:
+            my $R = qr / A B C # D E/x; /($R)/
+        Otherwise the parens are considered part of the comment */
+    if (has_runon)
+        *p++ = '\n';
+    *p++ = ')';
+    *p = 0;
+    SvCUR_set(Rx, p - RX_WRAPPED(Rx));
 }
 
-PERL_STATIC_INLINE void
-S_invlist_clear(pTHX_ SV* invlist)    /* Empty the inversion list */
+/*
+ * Perl_re_op_compile - the perl internal RE engine's function to compile a
+ * regular expression into internal code.
+ * The pattern may be passed either as:
+ *    a list of SVs (patternp plus pat_count)
+ *    a list of OPs (expr)
+ * If both are passed, the SV list is used, but the OP list indicates
+ * which SVs are actually pre-compiled code blocks
+ *
+ * The SVs in the list have magic and qr overloading applied to them (and
+ * the list may be modified in-place with replacement SVs in the latter
+ * case).
+ *
+ * If the pattern hasn't changed from old_re, then old_re will be
+ * returned.
+ *
+ * eng is the current engine. If that engine has an op_comp method, then
+ * handle directly (i.e. we assume that op_comp was us); otherwise, just
+ * do the initial concatenation of arguments and pass on to the external
+ * engine.
+ *
+ * If is_bare_re is not null, set it to a boolean indicating whether the
+ * arg list reduced (after overloading) to a single bare regex which has
+ * been returned (i.e. /$qr/).
+ *
+ * orig_rx_flags contains RXf_* flags. See perlreapi.pod for more details.
+ *
+ * pm_flags contains the PMf_* flags, typically based on those from the
+ * pm_flags field of the related PMOP. Currently we're only interested in
+ * PMf_HAS_CV, PMf_IS_QR, PMf_USE_RE_EVAL, PMf_WILDCARD.
+ *
+ * For many years this code had an initial sizing pass that calculated
+ * (sometimes incorrectly, leading to security holes) the size needed for the
+ * compiled pattern.  That was changed by commit
+ * 7c932d07cab18751bfc7515b4320436273a459e2 in 5.29, which reallocs the size, a
+ * node at a time, as parsing goes along.  Patches welcome to fix any obsolete
+ * references to this sizing pass.
+ *
+ * Now, an initial crude guess as to the size needed is made, based on the
+ * length of the pattern.  Patches welcome to improve that guess.  That amount
+ * of space is malloc'd and then immediately freed, and then clawed back node
+ * by node.  This design is to minimize, to the extent possible, memory churn
+ * when doing the reallocs.
+ *
+ * A separate parentheses counting pass may be needed in some cases.
+ * (Previously the sizing pass did this.)  Patches welcome to reduce the number
+ * of these cases.
+ *
+ * The existence of a sizing pass necessitated design decisions that are no
+ * longer needed.  There are potential areas of simplification.
+ *
+ * Beware that the optimization-preparation code in here knows about some
+ * of the structure of the compiled regexp.  [I'll say.]
+ */
+
+REGEXP *
+Perl_re_op_compile(pTHX_ SV ** const patternp, int pat_count,
+                    OP *expr, const regexp_engine* eng, REGEXP *old_re,
+                     bool *is_bare_re, const U32 orig_rx_flags, const U32 pm_flags)
 {
-    PERL_ARGS_ASSERT_INVLIST_CLEAR;
-
-    assert(is_invlist(invlist));
+    REGEXP *Rx;         /* Capital 'R' means points to a REGEXP */
+    STRLEN plen;
+    char *exp;
+    regnode *scan;
+    I32 flags;
+    SSize_t minlen = 0;
+    U32 rx_flags;
+    SV *pat;
+    SV** new_patternp = patternp;
 
-    invlist_set_len(invlist, 0, 0);
-    invlist_trim(invlist);
-}
+    /* these are all flags - maybe they should be turned
+     * into a single int with different bit masks */
+    I32 sawlookahead = 0;
+    I32 sawplus = 0;
+    I32 sawopen = 0;
+    I32 sawminmod = 0;
 
-#endif /* ifndef PERL_IN_XSUB_RE */
+    regex_charset initial_charset = get_regex_charset(orig_rx_flags);
+    bool recompile = 0;
+    bool runtime_code = 0;
+    scan_data_t data;
+    RExC_state_t RExC_state;
+    RExC_state_t * const pRExC_state = &RExC_state;
+#ifdef TRIE_STUDY_OPT
+    /* search for "restudy" in this file for a detailed explanation */
+    int restudied = 0;
+    RExC_state_t copyRExC_state;
+#endif
+    DECLARE_AND_GET_RE_DEBUG_FLAGS;
 
-PERL_STATIC_INLINE bool
-S_invlist_is_iterating(const SV* const invlist)
-{
-    PERL_ARGS_ASSERT_INVLIST_IS_ITERATING;
+    PERL_ARGS_ASSERT_RE_OP_COMPILE;
 
-    /* get_invlist_iter_addr()'s sv is non-const only because it returns a
-     * value that can be used to modify the invlist, it doesn't modify the
-     * invlist itself */
-    return *(get_invlist_iter_addr((SV*)invlist)) < (STRLEN) UV_MAX;
-}
+    DEBUG_r(if (!PL_colorset) reginitcolors());
 
-#ifndef PERL_IN_XSUB_RE
 
-PERL_STATIC_INLINE UV
-S_invlist_max(const SV* const invlist)
-{
-    /* Returns the maximum number of elements storable in the inversion list's
-     * array, without having to realloc() */
+    pRExC_state->warn_text = NULL;
+    pRExC_state->unlexed_names = NULL;
+    pRExC_state->code_blocks = NULL;
 
-    PERL_ARGS_ASSERT_INVLIST_MAX;
+    if (is_bare_re)
+        *is_bare_re = FALSE;
 
-    assert(is_invlist(invlist));
+    if (expr && (expr->op_type == OP_LIST ||
+                (expr->op_type == OP_NULL && expr->op_targ == OP_LIST))) {
+        /* allocate code_blocks if needed */
+        OP *o;
+        int ncode = 0;
 
-    /* Assumes worst case, in which the 0 element is not counted in the
-     * inversion list, so subtracts 1 for that */
-    return SvLEN(invlist) == 0  /* This happens under _new_invlist_C_array */
-           ? FROM_INTERNAL_SIZE(SvCUR(invlist)) - 1
-           : FROM_INTERNAL_SIZE(SvLEN(invlist)) - 1;
-}
+        for (o = cLISTOPx(expr)->op_first; o; o = OpSIBLING(o))
+            if (o->op_type == OP_NULL && (o->op_flags & OPf_SPECIAL))
+                ncode++; /* count of DO blocks */
 
-STATIC void
-S_initialize_invlist_guts(pTHX_ SV* invlist, const Size_t initial_size)
-{
-    PERL_ARGS_ASSERT_INITIALIZE_INVLIST_GUTS;
+        if (ncode)
+            pRExC_state->code_blocks = S_alloc_code_blocks(aTHX_ ncode);
+    }
 
-    /* First 1 is in case the zero element isn't in the list; second 1 is for
-     * trailing NUL */
-    SvGROW(invlist, TO_INTERNAL_SIZE(initial_size + 1) + 1);
-    invlist_set_len(invlist, 0, 0);
+    if (!pat_count) {
+        /* compile-time pattern with just OP_CONSTs and DO blocks */
 
-    /* Force iterinit() to be used to get iteration to work */
-    invlist_iterfinish(invlist);
+        int n;
+        OP *o;
 
-    *get_invlist_previous_index_addr(invlist) = 0;
-    SvPOK_on(invlist);  /* This allows B to extract the PV */
-}
+        /* find how many CONSTs there are */
+        assert(expr);
+        n = 0;
+        if (expr->op_type == OP_CONST)
+            n = 1;
+        else
+            for (o = cLISTOPx(expr)->op_first; o; o = OpSIBLING(o)) {
+                if (o->op_type == OP_CONST)
+                    n++;
+            }
 
-SV*
-Perl__new_invlist(pTHX_ IV initial_size)
-{
+        /* fake up an SV array */
 
-    /* Return a pointer to a newly constructed inversion list, with enough
-     * space to store 'initial_size' elements.  If that number is negative, a
-     * system default is used instead */
+        assert(!new_patternp);
+        Newx(new_patternp, n, SV*);
+        SAVEFREEPV(new_patternp);
+        pat_count = n;
 
-    SV* new_list;
+        n = 0;
+        if (expr->op_type == OP_CONST)
+            new_patternp[n] = cSVOPx_sv(expr);
+        else
+            for (o = cLISTOPx(expr)->op_first; o; o = OpSIBLING(o)) {
+                if (o->op_type == OP_CONST)
+                    new_patternp[n++] = cSVOPo_sv;
+            }
 
-    if (initial_size < 0) {
-        initial_size = 10;
     }
 
-    new_list = newSV_type(SVt_INVLIST);
-    initialize_invlist_guts(new_list, initial_size);
-
-    return new_list;
-}
-
-SV*
-Perl__new_invlist_C_array(pTHX_ const UV* const list)
-{
-    /* Return a pointer to a newly constructed inversion list, initialized to
-     * point to <list>, which has to be in the exact correct inversion list
-     * form, including internal fields.  Thus this is a dangerous routine that
-     * should not be used in the wrong hands.  The passed in 'list' contains
-     * several header fields at the beginning that are not part of the
-     * inversion list body proper */
-
-    const STRLEN length = (STRLEN) list[0];
-    const UV version_id =          list[1];
-    const bool offset   =    cBOOL(list[2]);
-#define HEADER_LENGTH 3
-    /* If any of the above changes in any way, you must change HEADER_LENGTH
-     * (if appropriate) and regenerate INVLIST_VERSION_ID by running
-     *      perl -E 'say int(rand 2**31-1)'
-     */
-#define INVLIST_VERSION_ID 148565664 /* This is a combination of a version and
-                                        data structure type, so that one being
-                                        passed in can be validated to be an
-                                        inversion list of the correct vintage.
-                                       */
-
-    SV* invlist = newSV_type(SVt_INVLIST);
+    DEBUG_PARSE_r(Perl_re_printf( aTHX_
+        "Assembling pattern from %d elements%s\n", pat_count,
+            orig_rx_flags & RXf_SPLIT ? " for split" : ""));
 
-    PERL_ARGS_ASSERT__NEW_INVLIST_C_ARRAY;
+    /* set expr to the first arg op */
 
-    if (version_id != INVLIST_VERSION_ID) {
-        Perl_croak(aTHX_ "panic: Incorrect version for previously generated inversion list");
+    if (pRExC_state->code_blocks && pRExC_state->code_blocks->count
+         && expr->op_type != OP_CONST)
+    {
+            expr = cLISTOPx(expr)->op_first;
+            assert(   expr->op_type == OP_PUSHMARK
+                   || (expr->op_type == OP_NULL && expr->op_targ == OP_PUSHMARK)
+                   || expr->op_type == OP_PADRANGE);
+            expr = OpSIBLING(expr);
     }
 
-    /* The generated array passed in includes header elements that aren't part
-     * of the list proper, so start it just after them */
-    SvPV_set(invlist, (char *) (list + HEADER_LENGTH));
-
-    SvLEN_set(invlist, 0);  /* Means we own the contents, and the system
-                               shouldn't touch it */
-
-    *(get_invlist_offset_addr(invlist)) = offset;
-
-    /* The 'length' passed to us is the physical number of elements in the
-     * inversion list.  But if there is an offset the logical number is one
-     * less than that */
-    invlist_set_len(invlist, length  - offset, offset);
-
-    invlist_set_previous_index(invlist, 0);
-
-    /* Initialize the iteration pointer. */
-    invlist_iterfinish(invlist);
-
-    SvREADONLY_on(invlist);
-    SvPOK_on(invlist);
-
-    return invlist;
-}
+    pat = S_concat_pat(aTHX_ pRExC_state, NULL, new_patternp, pat_count,
+                        expr, &recompile, NULL);
 
-STATIC void
-S__append_range_to_invlist(pTHX_ SV* const invlist,
-                                 const UV start, const UV end)
-{
-   /* Subject to change or removal.  Append the range from 'start' to 'end' at
-    * the end of the inversion list.  The range must be above any existing
-    * ones. */
+    /* handle bare (possibly after overloading) regex: foo =~ $re */
+    {
+        SV *re = pat;
+        if (SvROK(re))
+            re = SvRV(re);
+        if (SvTYPE(re) == SVt_REGEXP) {
+            if (is_bare_re)
+                *is_bare_re = TRUE;
+            SvREFCNT_inc(re);
+            DEBUG_PARSE_r(Perl_re_printf( aTHX_
+                "Precompiled pattern%s\n",
+                    orig_rx_flags & RXf_SPLIT ? " for split" : ""));
 
-    UV* array;
-    UV max = invlist_max(invlist);
-    UV len = _invlist_len(invlist);
-    bool offset;
+            return (REGEXP*)re;
+        }
+    }
 
-    PERL_ARGS_ASSERT__APPEND_RANGE_TO_INVLIST;
+    exp = SvPV_nomg(pat, plen);
 
-    if (len == 0) { /* Empty lists must be initialized */
-        offset = start != 0;
-        array = _invlist_array_init(invlist, ! offset);
-    }
-    else {
-        /* Here, the existing list is non-empty. The current max entry in the
-         * list is generally the first value not in the set, except when the
-         * set extends to the end of permissible values, in which case it is
-         * the first entry in that final set, and so this call is an attempt to
-         * append out-of-order */
-
-        UV final_element = len - 1;
-        array = invlist_array(invlist);
-        if (   array[final_element] > start
-            || ELEMENT_RANGE_MATCHES_INVLIST(final_element))
+    if (!eng->op_comp) {
+        if ((SvUTF8(pat) && IN_BYTES)
+                || SvGMAGICAL(pat) || SvAMAGIC(pat))
         {
-            Perl_croak(aTHX_ "panic: attempting to append to an inversion list, but wasn't at the end of the list, final=%" UVuf ", start=%" UVuf ", match=%c",
-                     array[final_element], start,
-                     ELEMENT_RANGE_MATCHES_INVLIST(final_element) ? 't' : 'f');
-        }
-
-        /* Here, it is a legal append.  If the new range begins 1 above the end
-         * of the range below it, it is extending the range below it, so the
-         * new first value not in the set is one greater than the newly
-         * extended range.  */
-        offset = *get_invlist_offset_addr(invlist);
-        if (array[final_element] == start) {
-            if (end != UV_MAX) {
-                array[final_element] = end + 1;
-            }
-            else {
-                /* But if the end is the maximum representable on the machine,
-                 * assume that infinity was actually what was meant.  Just let
-                 * the range that this would extend to have no end */
-                invlist_set_len(invlist, len - 1, offset);
-            }
-            return;
+            /* make a temporary copy; either to convert to bytes,
+             * or to avoid repeating get-magic / overloaded stringify */
+            pat = newSVpvn_flags(exp, plen, SVs_TEMP |
+                                        (IN_BYTES ? 0 : SvUTF8(pat)));
         }
+        return CALLREGCOMP_ENG(eng, pat, orig_rx_flags);
     }
 
-    /* Here the new range doesn't extend any existing set.  Add it */
-
-    len += 2;  /* Includes an element each for the start and end of range */
-
-    /* If wll overflow the existing space, extend, which may cause the array to
-     * be moved */
-    if (max < len) {
-        invlist_extend(invlist, len);
-
-        /* Have to set len here to avoid assert failure in invlist_array() */
-        invlist_set_len(invlist, len, offset);
+    /* ignore the utf8ness if the pattern is 0 length */
+    RExC_utf8 = RExC_orig_utf8 = (plen == 0 || IN_BYTES) ? 0 : SvUTF8(pat);
+    RExC_uni_semantics = 0;
+    RExC_contains_locale = 0;
+    RExC_strict = cBOOL(pm_flags & RXf_PMf_STRICT);
+    RExC_in_script_run = 0;
+    RExC_study_started = 0;
+    pRExC_state->runtime_code_qr = NULL;
+    RExC_frame_head= NULL;
+    RExC_frame_last= NULL;
+    RExC_frame_count= 0;
+    RExC_latest_warn_offset = 0;
+    RExC_use_BRANCHJ = 0;
+    RExC_warned_WARN_EXPERIMENTAL__VLB = 0;
+    RExC_warned_WARN_EXPERIMENTAL__REGEX_SETS = 0;
+    RExC_logical_total_parens = 0;
+    RExC_total_parens = 0;
+    RExC_logical_to_parno = NULL;
+    RExC_parno_to_logical = NULL;
+    RExC_open_parens = NULL;
+    RExC_close_parens = NULL;
+    RExC_paren_names = NULL;
+    RExC_size = 0;
+    RExC_seen_d_op = FALSE;
+#ifdef DEBUGGING
+    RExC_paren_name_list = NULL;
+#endif
 
-        array = invlist_array(invlist);
-    }
-    else {
-        invlist_set_len(invlist, len, offset);
-    }
+    DEBUG_r({
+        RExC_mysv1= sv_newmortal();
+        RExC_mysv2= sv_newmortal();
+    });
 
-    /* The next item on the list starts the range, the one after that is
-     * one past the new range.  */
-    array[len - 2] = start;
-    if (end != UV_MAX) {
-        array[len - 1] = end + 1;
-    }
-    else {
-        /* But if the end is the maximum representable on the machine, just let
-         * the range have no end */
-        invlist_set_len(invlist, len - 1, offset);
-    }
-}
+    DEBUG_COMPILE_r({
+            SV *dsv= sv_newmortal();
+            RE_PV_QUOTED_DECL(s, RExC_utf8, dsv, exp, plen, PL_dump_re_max_len);
+            Perl_re_printf( aTHX_  "%sCompiling REx%s %s\n",
+                          PL_colors[4], PL_colors[5], s);
+        });
 
-SSize_t
-Perl__invlist_search(SV* const invlist, const UV cp)
-{
-    /* Searches the inversion list for the entry that contains the input code
-     * point <cp>.  If <cp> is not in the list, -1 is returned.  Otherwise, the
-     * return value is the index into the list's array of the range that
-     * contains <cp>, that is, 'i' such that
-     * array[i] <= cp < array[i+1]
-     */
+    /* we jump here if we have to recompile, e.g., from upgrading the pattern
+     * to utf8 */
 
-    IV low = 0;
-    IV mid;
-    IV high = _invlist_len(invlist);
-    const IV highest_element = high - 1;
-    const UV* array;
+    if ((pm_flags & PMf_USE_RE_EVAL)
+                /* this second condition covers the non-regex literal case,
+                 * i.e.  $foo =~ '(?{})'. */
+                || (IN_PERL_COMPILETIME && (PL_hints & HINT_RE_EVAL))
+    )
+        runtime_code = S_has_runtime_code(aTHX_ pRExC_state, exp, plen);
 
-    PERL_ARGS_ASSERT__INVLIST_SEARCH;
+  redo_parse:
+    /* return old regex if pattern hasn't changed */
+    /* XXX: note in the below we have to check the flags as well as the
+     * pattern.
+     *
+     * Things get a touch tricky as we have to compare the utf8 flag
+     * independently from the compile flags.  */
 
-    /* If list is empty, return failure. */
-    if (UNLIKELY(high == 0)) {
-        return -1;
+    if (   old_re
+        && !recompile
+        && cBOOL(RX_UTF8(old_re)) == cBOOL(RExC_utf8)
+        && ( RX_COMPFLAGS(old_re) == ( orig_rx_flags & RXf_PMf_FLAGCOPYMASK ) )
+        && RX_PRELEN(old_re) == plen
+        && memEQ(RX_PRECOMP(old_re), exp, plen)
+        && !runtime_code /* with runtime code, always recompile */ )
+    {
+        DEBUG_COMPILE_r({
+            SV *dsv= sv_newmortal();
+            RE_PV_QUOTED_DECL(s, RExC_utf8, dsv, exp, plen, PL_dump_re_max_len);
+            Perl_re_printf( aTHX_  "%sSkipping recompilation of unchanged REx%s %s\n",
+                          PL_colors[4], PL_colors[5], s);
+        });
+        return old_re;
     }
 
-    /* (We can't get the array unless we know the list is non-empty) */
-    array = invlist_array(invlist);
-
-    mid = invlist_previous_index(invlist);
-    assert(mid >=0);
-    if (UNLIKELY(mid > highest_element)) {
-        mid = highest_element;
-    }
+    /* Allocate the pattern's SV */
+    RExC_rx_sv = Rx = (REGEXP*) newSV_type(SVt_REGEXP);
+    RExC_rx = ReANY(Rx);
+    if ( RExC_rx == NULL )
+        FAIL("Regexp out of space");
 
-    /* <mid> contains the cache of the result of the previous call to this
-     * function (0 the first time).  See if this call is for the same result,
-     * or if it is for mid-1.  This is under the theory that calls to this
-     * function will often be for related code points that are near each other.
-     * And benchmarks show that caching gives better results.  We also test
-     * here if the code point is within the bounds of the list.  These tests
-     * replace others that would have had to be made anyway to make sure that
-     * the array bounds were not exceeded, and these give us extra information
-     * at the same time */
-    if (cp >= array[mid]) {
-        if (cp >= array[highest_element]) {
-            return highest_element;
-        }
-
-        /* Here, array[mid] <= cp < array[highest_element].  This means that
-         * the final element is not the answer, so can exclude it; it also
-         * means that <mid> is not the final element, so can refer to 'mid + 1'
-         * safely */
-        if (cp < array[mid + 1]) {
-            return mid;
-        }
-        high--;
-        low = mid + 1;
-    }
-    else { /* cp < aray[mid] */
-        if (cp < array[0]) { /* Fail if outside the array */
-            return -1;
-        }
-        high = mid;
-        if (cp >= array[mid - 1]) {
-            goto found_entry;
-        }
-    }
+    rx_flags = orig_rx_flags;
 
-    /* Binary search.  What we are looking for is <i> such that
-     * array[i] <= cp < array[i+1]
-     * The loop below converges on the i+1.  Note that there may not be an
-     * (i+1)th element in the array, and things work nonetheless */
-    while (low < high) {
-        mid = (low + high) / 2;
-        assert(mid <= highest_element);
-        if (array[mid] <= cp) { /* cp >= array[mid] */
-            low = mid + 1;
+    if (   toUSE_UNI_CHARSET_NOT_DEPENDS
+        && initial_charset == REGEX_DEPENDS_CHARSET)
+    {
 
-            /* We could do this extra test to exit the loop early.
-            if (cp < array[low]) {
-                return mid;
-            }
-            */
-        }
-        else { /* cp < array[mid] */
-            high = mid;
-        }
+        /* Set to use unicode semantics if the pattern is in utf8 and has the
+         * 'depends' charset specified, as it means unicode when utf8  */
+        set_regex_charset(&rx_flags, REGEX_UNICODE_CHARSET);
+        RExC_uni_semantics = 1;
     }
 
-  found_entry:
-    high--;
-    invlist_set_previous_index(invlist, high);
-    return high;
-}
+    RExC_pm_flags = pm_flags;
 
-void
-Perl__invlist_union_maybe_complement_2nd(pTHX_ SV* const a, SV* const b,
-                                         const bool complement_b, SV** output)
-{
-    /* Take the union of two inversion lists and point '*output' to it.  On
-     * input, '*output' MUST POINT TO NULL OR TO AN SV* INVERSION LIST (possibly
-     * even 'a' or 'b').  If to an inversion list, the contents of the original
-     * list will be replaced by the union.  The first list, 'a', may be
-     * NULL, in which case a copy of the second list is placed in '*output'.
-     * If 'complement_b' is TRUE, the union is taken of the complement
-     * (inversion) of 'b' instead of b itself.
-     *
-     * The basis for this comes from "Unicode Demystified" Chapter 13 by
-     * Richard Gillam, published by Addison-Wesley, and explained at some
-     * length there.  The preface says to incorporate its examples into your
-     * code at your own risk.
-     *
-     * The algorithm is like a merge sort. */
-
-    const UV* array_a;    /* a's array */
-    const UV* array_b;
-    UV len_a;      /* length of a's array */
-    UV len_b;
-
-    SV* u;                     /* the resulting union */
-    UV* array_u;
-    UV len_u = 0;
-
-    UV i_a = 0;                    /* current index into a's array */
-    UV i_b = 0;
-    UV i_u = 0;
-
-    /* running count, as explained in the algorithm source book; items are
-     * stopped accumulating and are output when the count changes to/from 0.
-     * The count is incremented when we start a range that's in an input's set,
-     * and decremented when we start a range that's not in a set.  So this
-     * variable can be 0, 1, or 2.  When it is 0 neither input is in their set,
-     * and hence nothing goes into the union; 1, just one of the inputs is in
-     * its set (and its current range gets added to the union); and 2 when both
-     * inputs are in their sets.  */
-    UV count = 0;
-
-    PERL_ARGS_ASSERT__INVLIST_UNION_MAYBE_COMPLEMENT_2ND;
-    assert(a != b);
-    assert(*output == NULL || is_invlist(*output));
-
-    len_b = _invlist_len(b);
-    if (len_b == 0) {
-
-        /* Here, 'b' is empty, hence it's complement is all possible code
-         * points.  So if the union includes the complement of 'b', it includes
-         * everything, and we need not even look at 'a'.  It's easiest to
-         * create a new inversion list that matches everything.  */
-        if (complement_b) {
-            SV* everything = _add_range_to_invlist(NULL, 0, UV_MAX);
-
-            if (*output == NULL) { /* If the output didn't exist, just point it
-                                      at the new list */
-                *output = everything;
-            }
-            else { /* Otherwise, replace its contents with the new list */
-                invlist_replace_list_destroys_src(*output, everything);
-                SvREFCNT_dec_NN(everything);
-            }
+    if (runtime_code) {
+        assert(TAINTING_get || !TAINT_get);
+        if (TAINT_get)
+            Perl_croak(aTHX_ "Eval-group in insecure regular expression");
 
-            return;
+        if (!S_compile_runtime_code(aTHX_ pRExC_state, exp, plen)) {
+            /* whoops, we have a non-utf8 pattern, whilst run-time code
+             * got compiled as utf8. Try again with a utf8 pattern */
+            S_pat_upgrade_to_utf8(aTHX_ pRExC_state, &exp, &plen,
+                pRExC_state->code_blocks ? pRExC_state->code_blocks->count : 0);
+            goto redo_parse;
         }
+    }
+    assert(!pRExC_state->runtime_code_qr);
 
-        /* Here, we don't want the complement of 'b', and since 'b' is empty,
-         * the union will come entirely from 'a'.  If 'a' is NULL or empty, the
-         * output will be empty */
+    RExC_sawback = 0;
 
-        if (a == NULL || _invlist_len(a) == 0) {
-            if (*output == NULL) {
-                *output = _new_invlist(0);
-            }
-            else {
-                invlist_clear(*output);
-            }
-            return;
-        }
+    RExC_seen = 0;
+    RExC_maxlen = 0;
+    RExC_in_lookaround = 0;
+    RExC_seen_zerolen = *exp == '^' ? -1 : 0;
+    RExC_recode_x_to_native = 0;
+    RExC_in_multi_char_class = 0;
 
-        /* Here, 'a' is not empty, but 'b' is, so 'a' entirely determines the
-         * union.  We can just return a copy of 'a' if '*output' doesn't point
-         * to an existing list */
-        if (*output == NULL) {
-            *output = invlist_clone(a, NULL);
-            return;
-        }
+    RExC_start = RExC_copy_start_in_constructed = RExC_copy_start_in_input = RExC_precomp = exp;
+    RExC_precomp_end = RExC_end = exp + plen;
+    RExC_nestroot = 0;
+    RExC_whilem_seen = 0;
+    RExC_end_op = NULL;
+    RExC_recurse = NULL;
+    RExC_study_chunk_recursed = NULL;
+    RExC_study_chunk_recursed_bytes= 0;
+    RExC_recurse_count = 0;
+    RExC_sets_depth = 0;
+    pRExC_state->code_index = 0;
 
-        /* If the output is to overwrite 'a', we have a no-op, as it's
-         * already in 'a' */
-        if (*output == a) {
-            return;
-        }
+    /* Initialize the string in the compiled pattern.  This is so that there is
+     * something to output if necessary */
+    set_regex_pv(pRExC_state, Rx);
 
-        /* Here, '*output' is to be overwritten by 'a' */
-        u = invlist_clone(a, NULL);
-        invlist_replace_list_destroys_src(*output, u);
-        SvREFCNT_dec_NN(u);
+    DEBUG_PARSE_r({
+        Perl_re_printf( aTHX_
+            "Starting parse and generation\n");
+        RExC_lastnum=0;
+        RExC_lastparse=NULL;
+    });
 
-        return;
+    /* Allocate space and zero-initialize. Note, the two step process
+       of zeroing when in debug mode, thus anything assigned has to
+       happen after that */
+    if (!  RExC_size) {
+
+        /* On the first pass of the parse, we guess how big this will be.  Then
+         * we grow in one operation to that amount and then give it back.  As
+         * we go along, we re-allocate what we need.
+         *
+         * XXX Currently the guess is essentially that the pattern will be an
+         * EXACT node with one byte input, one byte output.  This is crude, and
+         * better heuristics are welcome.
+         *
+         * On any subsequent passes, we guess what we actually computed in the
+         * latest earlier pass.  Such a pass probably didn't complete so is
+         * missing stuff.  We could improve those guesses by knowing where the
+         * parse stopped, and use the length so far plus apply the above
+         * assumption to what's left. */
+        RExC_size = STR_SZ(RExC_end - RExC_start);
     }
 
-    /* Here 'b' is not empty.  See about 'a' */
+    Newxc(RExC_rxi, sizeof(regexp_internal) + RExC_size, char, regexp_internal);
+    if ( RExC_rxi == NULL )
+        FAIL("Regexp out of space");
 
-    if (a == NULL || ((len_a = _invlist_len(a)) == 0)) {
+    Zero(RExC_rxi, sizeof(regexp_internal) + RExC_size, char);
+    RXi_SET( RExC_rx, RExC_rxi );
 
-        /* Here, 'a' is empty (and b is not).  That means the union will come
-         * entirely from 'b'.  If '*output' is NULL, we can directly return a
-         * clone of 'b'.  Otherwise, we replace the contents of '*output' with
-         * the clone */
+    /* We start from 0 (over from 0 in the case this is a reparse.  The first
+     * node parsed will give back any excess memory we have allocated so far).
+     * */
+    RExC_size = 0;
 
-        SV ** dest = (*output == NULL) ? output : &u;
-        *dest = invlist_clone(b, NULL);
-        if (complement_b) {
-            _invlist_invert(*dest);
-        }
+    /* non-zero initialization begins here */
+    RExC_rx->engine= eng;
+    RExC_rx->extflags = rx_flags;
+    RXp_COMPFLAGS(RExC_rx) = orig_rx_flags & RXf_PMf_FLAGCOPYMASK;
 
-        if (dest == &u) {
-            invlist_replace_list_destroys_src(*output, u);
-            SvREFCNT_dec_NN(u);
+    if (pm_flags & PMf_IS_QR) {
+        RExC_rxi->code_blocks = pRExC_state->code_blocks;
+        if (RExC_rxi->code_blocks) {
+            RExC_rxi->code_blocks->refcnt++;
         }
-
-        return;
     }
 
-    /* Here both lists exist and are non-empty */
-    array_a = invlist_array(a);
-    array_b = invlist_array(b);
-
-    /* If are to take the union of 'a' with the complement of b, set it
-     * up so are looking at b's complement. */
-    if (complement_b) {
-
-        /* To complement, we invert: if the first element is 0, remove it.  To
-         * do this, we just pretend the array starts one later */
-        if (array_b[0] == 0) {
-            array_b++;
-            len_b--;
-        }
-        else {
+    RExC_rx->intflags = 0;
 
-            /* But if the first element is not zero, we pretend the list starts
-             * at the 0 that is always stored immediately before the array. */
-            array_b--;
-            len_b++;
-        }
-    }
+    RExC_flags = rx_flags;     /* don't let top level (?i) bleed */
+    RExC_parse_set(exp);
 
-    /* Size the union for the worst case: that the sets are completely
-     * disjoint */
-    u = _new_invlist(len_a + len_b);
-
-    /* Will contain U+0000 if either component does */
-    array_u = _invlist_array_init(u, (    len_a > 0 && array_a[0] == 0)
-                                      || (len_b > 0 && array_b[0] == 0));
-
-    /* Go through each input list item by item, stopping when have exhausted
-     * one of them */
-    while (i_a < len_a && i_b < len_b) {
-        UV cp;     /* The element to potentially add to the union's array */
-        bool cp_in_set;   /* is it in the input list's set or not */
-
-        /* We need to take one or the other of the two inputs for the union.
-         * Since we are merging two sorted lists, we take the smaller of the
-         * next items.  In case of a tie, we take first the one that is in its
-         * set.  If we first took the one not in its set, it would decrement
-         * the count, possibly to 0 which would cause it to be output as ending
-         * the range, and the next time through we would take the same number,
-         * and output it again as beginning the next range.  By doing it the
-         * opposite way, there is no possibility that the count will be
-         * momentarily decremented to 0, and thus the two adjoining ranges will
-         * be seamlessly merged.  (In a tie and both are in the set or both not
-         * in the set, it doesn't matter which we take first.) */
-        if (       array_a[i_a] < array_b[i_b]
-            || (   array_a[i_a] == array_b[i_b]
-                && ELEMENT_RANGE_MATCHES_INVLIST(i_a)))
-        {
-            cp_in_set = ELEMENT_RANGE_MATCHES_INVLIST(i_a);
-            cp = array_a[i_a++];
-        }
-        else {
-            cp_in_set = ELEMENT_RANGE_MATCHES_INVLIST(i_b);
-            cp = array_b[i_b++];
-        }
+    /* This NUL is guaranteed because the pattern comes from an SV*, and the sv
+     * code makes sure the final byte is an uncounted NUL.  But should this
+     * ever not be the case, lots of things could read beyond the end of the
+     * buffer: loops like
+     *      while(isFOO(*RExC_parse)) RExC_parse_inc_by(1);
+     *      strchr(RExC_parse, "foo");
+     * etc.  So it is worth noting. */
+    assert(*RExC_end == '\0');
 
-        /* Here, have chosen which of the two inputs to look at.  Only output
-         * if the running count changes to/from 0, which marks the
-         * beginning/end of a range that's in the set */
-        if (cp_in_set) {
-            if (count == 0) {
-                array_u[i_u++] = cp;
-            }
-            count++;
-        }
-        else {
-            count--;
-            if (count == 0) {
-                array_u[i_u++] = cp;
-            }
-        }
-    }
+    RExC_naughty = 0;
+    RExC_npar = 1;
+    RExC_logical_npar = 1;
+    RExC_parens_buf_size = 0;
+    RExC_emit_start = RExC_rxi->program;
+    pRExC_state->code_index = 0;
 
+    *((char*) RExC_emit_start) = (char) REG_MAGIC;
+    RExC_emit = NODE_STEP_REGNODE;
 
-    /* The loop above increments the index into exactly one of the input lists
-     * each iteration, and ends when either index gets to its list end.  That
-     * means the other index is lower than its end, and so something is
-     * remaining in that one.  We decrement 'count', as explained below, if
-     * that list is in its set.  (i_a and i_b each currently index the element
-     * beyond the one we care about.) */
-    if (   (i_a != len_a && PREV_RANGE_MATCHES_INVLIST(i_a))
-        || (i_b != len_b && PREV_RANGE_MATCHES_INVLIST(i_b)))
-    {
-        count--;
-    }
+    /* Do the parse */
+    if (reg(pRExC_state, 0, &flags, 1)) {
 
-    /* Above we decremented 'count' if the list that had unexamined elements in
-     * it was in its set.  This has made it so that 'count' being non-zero
-     * means there isn't anything left to output; and 'count' equal to 0 means
-     * that what is left to output is precisely that which is left in the
-     * non-exhausted input list.
-     *
-     * To see why, note first that the exhausted input obviously has nothing
-     * left to add to the union.  If it was in its set at its end, that means
-     * the set extends from here to the platform's infinity, and hence so does
-     * the union and the non-exhausted set is irrelevant.  The exhausted set
-     * also contributed 1 to 'count'.  If 'count' was 2, it got decremented to
-     * 1, but if it was 1, the non-exhausted set wasn't in its set, and so
-     * 'count' remains at 1.  This is consistent with the decremented 'count'
-     * != 0 meaning there's nothing left to add to the union.
-     *
-     * But if the exhausted input wasn't in its set, it contributed 0 to
-     * 'count', and the rest of the union will be whatever the other input is.
-     * If 'count' was 0, neither list was in its set, and 'count' remains 0;
-     * otherwise it gets decremented to 0.  This is consistent with 'count'
-     * == 0 meaning the remainder of the union is whatever is left in the
-     * non-exhausted list. */
-    if (count != 0) {
-        len_u = i_u;
-    }
-    else {
-        IV copy_count = len_a - i_a;
-        if (copy_count > 0) {   /* The non-exhausted input is 'a' */
-            Copy(array_a + i_a, array_u + i_u, copy_count, UV);
-        }
-        else { /* The non-exhausted input is b */
-            copy_count = len_b - i_b;
-            Copy(array_b + i_b, array_u + i_u, copy_count, UV);
+        /* Success!, But we may need to redo the parse knowing how many parens
+         * there actually are */
+        if (IN_PARENS_PASS) {
+            flags |= RESTART_PARSE;
         }
-        len_u = i_u + copy_count;
-    }
 
-    /* Set the result to the final length, which can change the pointer to
-     * array_u, so re-find it.  (Note that it is unlikely that this will
-     * change, as we are shrinking the space, not enlarging it) */
-    if (len_u != _invlist_len(u)) {
-        invlist_set_len(u, len_u, *get_invlist_offset_addr(u));
-        invlist_trim(u);
-        array_u = invlist_array(u);
-    }
-
-    if (*output == NULL) {  /* Simply return the new inversion list */
-        *output = u;
+        /* We have that number in RExC_npar */
+        RExC_total_parens = RExC_npar;
+        RExC_logical_total_parens = RExC_logical_npar;
     }
-    else {
-        /* Otherwise, overwrite the inversion list that was in '*output'.  We
-         * could instead free '*output', and then set it to 'u', but experience
-         * has shown [perl #127392] that if the input is a mortal, we can get a
-         * huge build-up of these during regex compilation before they get
-         * freed. */
-        invlist_replace_list_destroys_src(*output, u);
-        SvREFCNT_dec_NN(u);
+    else if (! MUST_RESTART(flags)) {
+        ReREFCNT_dec(Rx);
+        Perl_croak(aTHX_ "panic: reg returned failure to re_op_compile, flags=%#" UVxf, (UV) flags);
     }
 
-    return;
-}
+    /* Here, we either have success, or we have to redo the parse for some reason */
+    if (MUST_RESTART(flags)) {
 
-void
-Perl__invlist_intersection_maybe_complement_2nd(pTHX_ SV* const a, SV* const b,
-                                               const bool complement_b, SV** i)
-{
-    /* Take the intersection of two inversion lists and point '*i' to it.  On
-     * input, '*i' MUST POINT TO NULL OR TO AN SV* INVERSION LIST (possibly
-     * even 'a' or 'b').  If to an inversion list, the contents of the original
-     * list will be replaced by the intersection.  The first list, 'a', may be
-     * NULL, in which case '*i' will be an empty list.  If 'complement_b' is
-     * TRUE, the result will be the intersection of 'a' and the complement (or
-     * inversion) of 'b' instead of 'b' directly.
-     *
-     * The basis for this comes from "Unicode Demystified" Chapter 13 by
-     * Richard Gillam, published by Addison-Wesley, and explained at some
-     * length there.  The preface says to incorporate its examples into your
-     * code at your own risk.  In fact, it had bugs
-     *
-     * The algorithm is like a merge sort, and is essentially the same as the
-     * union above
-     */
+        /* It's possible to write a regexp in ascii that represents Unicode
+        codepoints outside of the byte range, such as via \x{100}. If we
+        detect such a sequence we have to convert the entire pattern to utf8
+        and then recompile, as our sizing calculation will have been based
+        on 1 byte == 1 character, but we will need to use utf8 to encode
+        at least some part of the pattern, and therefore must convert the whole
+        thing.
+        -- dmq */
+        if (flags & NEED_UTF8) {
 
-    const UV* array_a;         /* a's array */
-    const UV* array_b;
-    UV len_a;  /* length of a's array */
-    UV len_b;
-
-    SV* r;                  /* the resulting intersection */
-    UV* array_r;
-    UV len_r = 0;
-
-    UV i_a = 0;                    /* current index into a's array */
-    UV i_b = 0;
-    UV i_r = 0;
-
-    /* running count of how many of the two inputs are postitioned at ranges
-     * that are in their sets.  As explained in the algorithm source book,
-     * items are stopped accumulating and are output when the count changes
-     * to/from 2.  The count is incremented when we start a range that's in an
-     * input's set, and decremented when we start a range that's not in a set.
-     * Only when it is 2 are we in the intersection. */
-    UV count = 0;
-
-    PERL_ARGS_ASSERT__INVLIST_INTERSECTION_MAYBE_COMPLEMENT_2ND;
-    assert(a != b);
-    assert(*i == NULL || is_invlist(*i));
-
-    /* Special case if either one is empty */
-    len_a = (a == NULL) ? 0 : _invlist_len(a);
-    if ((len_a == 0) || ((len_b = _invlist_len(b)) == 0)) {
-        if (len_a != 0 && complement_b) {
-
-            /* Here, 'a' is not empty, therefore from the enclosing 'if', 'b'
-             * must be empty.  Here, also we are using 'b's complement, which
-             * hence must be every possible code point.  Thus the intersection
-             * is simply 'a'. */
-
-            if (*i == a) {  /* No-op */
-                return;
+            /* We have stored the offset of the final warning output so far.
+             * That must be adjusted.  Any variant characters between the start
+             * of the pattern and this warning count for 2 bytes in the final,
+             * so just add them again */
+            if (UNLIKELY(RExC_latest_warn_offset > 0)) {
+                RExC_latest_warn_offset +=
+                            variant_under_utf8_count((U8 *) exp, (U8 *) exp
+                                                + RExC_latest_warn_offset);
             }
+            S_pat_upgrade_to_utf8(aTHX_ pRExC_state, &exp, &plen,
+            pRExC_state->code_blocks ? pRExC_state->code_blocks->count : 0);
+            DEBUG_PARSE_r(Perl_re_printf( aTHX_ "Need to redo parse after upgrade\n"));
+        }
+        else {
+            DEBUG_PARSE_r(Perl_re_printf( aTHX_ "Need to redo parse\n"));
+        }
 
-            if (*i == NULL) {
-                *i = invlist_clone(a, NULL);
-                return;
-            }
+        if (ALL_PARENS_COUNTED) {
+            /* Make enough room for all the known parens, and zero it */
+            Renew(RExC_open_parens, RExC_total_parens, regnode_offset);
+            Zero(RExC_open_parens, RExC_total_parens, regnode_offset);
+            RExC_open_parens[0] = 1;    /* +1 for REG_MAGIC */
 
-            r = invlist_clone(a, NULL);
-            invlist_replace_list_destroys_src(*i, r);
-            SvREFCNT_dec_NN(r);
-            return;
+            Renew(RExC_close_parens, RExC_total_parens, regnode_offset);
+            Zero(RExC_close_parens, RExC_total_parens, regnode_offset);
+            /* we do NOT reinitialize  RExC_logical_to_parno and
+             * RExC_parno_to_logical here. We need their data on the second
+             * pass */
         }
-
-        /* Here, 'a' or 'b' is empty and not using the complement of 'b'.  The
-         * intersection must be empty */
-        if (*i == NULL) {
-            *i = _new_invlist(0);
-            return;
+        else { /* Parse did not complete.  Reinitialize the parentheses
+                  structures */
+            RExC_total_parens = 0;
+            if (RExC_open_parens) {
+                Safefree(RExC_open_parens);
+                RExC_open_parens = NULL;
+            }
+            if (RExC_close_parens) {
+                Safefree(RExC_close_parens);
+                RExC_close_parens = NULL;
+            }
+            if (RExC_logical_to_parno) {
+                Safefree(RExC_logical_to_parno);
+                RExC_logical_to_parno = NULL;
+            }
+            if (RExC_parno_to_logical) {
+                Safefree(RExC_parno_to_logical);
+                RExC_parno_to_logical = NULL;
+            }
         }
 
-        invlist_clear(*i);
-        return;
+        /* Clean up what we did in this parse */
+        SvREFCNT_dec_NN(RExC_rx_sv);
+
+        goto redo_parse;
     }
 
-    /* Here both lists exist and are non-empty */
-    array_a = invlist_array(a);
-    array_b = invlist_array(b);
+    /* Here, we have successfully parsed and generated the pattern's program
+     * for the regex engine.  We are ready to finish things up and look for
+     * optimizations. */
+
+    /* Update the string to compile, with correct modifiers, etc */
+    set_regex_pv(pRExC_state, Rx);
 
-    /* If are to take the intersection of 'a' with the complement of b, set it
-     * up so are looking at b's complement. */
-    if (complement_b) {
+    RExC_rx->nparens = RExC_total_parens - 1;
+    RExC_rx->logical_nparens = RExC_logical_total_parens - 1;
 
-        /* To complement, we invert: if the first element is 0, remove it.  To
-         * do this, we just pretend the array starts one later */
-        if (array_b[0] == 0) {
-            array_b++;
-            len_b--;
-        }
-        else {
+    /* Uses the upper 4 bits of the FLAGS field, so keep within that size */
+    if (RExC_whilem_seen > 15)
+        RExC_whilem_seen = 15;
 
-            /* But if the first element is not zero, we pretend the list starts
-             * at the 0 that is always stored immediately before the array. */
-            array_b--;
-            len_b++;
-        }
-    }
+    DEBUG_PARSE_r({
+        Perl_re_printf( aTHX_
+            "Required size %" IVdf " nodes\n", (IV)RExC_size);
+        RExC_lastnum=0;
+        RExC_lastparse=NULL;
+    });
 
-    /* Size the intersection for the worst case: that the intersection ends up
-     * fragmenting everything to be completely disjoint */
-    r= _new_invlist(len_a + len_b);
-
-    /* Will contain U+0000 iff both components do */
-    array_r = _invlist_array_init(r,    len_a > 0 && array_a[0] == 0
-                                     && len_b > 0 && array_b[0] == 0);
-
-    /* Go through each list item by item, stopping when have exhausted one of
-     * them */
-    while (i_a < len_a && i_b < len_b) {
-        UV cp;     /* The element to potentially add to the intersection's
-                       array */
-        bool cp_in_set;        /* Is it in the input list's set or not */
-
-        /* We need to take one or the other of the two inputs for the
-         * intersection.  Since we are merging two sorted lists, we take the
-         * smaller of the next items.  In case of a tie, we take first the one
-         * that is not in its set (a difference from the union algorithm).  If
-         * we first took the one in its set, it would increment the count,
-         * possibly to 2 which would cause it to be output as starting a range
-         * in the intersection, and the next time through we would take that
-         * same number, and output it again as ending the set.  By doing the
-         * opposite of this, there is no possibility that the count will be
-         * momentarily incremented to 2.  (In a tie and both are in the set or
-         * both not in the set, it doesn't matter which we take first.) */
-        if (       array_a[i_a] < array_b[i_b]
-            || (   array_a[i_a] == array_b[i_b]
-                && ! ELEMENT_RANGE_MATCHES_INVLIST(i_a)))
-        {
-            cp_in_set = ELEMENT_RANGE_MATCHES_INVLIST(i_a);
-            cp = array_a[i_a++];
-        }
-        else {
-            cp_in_set = ELEMENT_RANGE_MATCHES_INVLIST(i_b);
-            cp= array_b[i_b++];
-        }
+    SetProgLen(RExC_rxi,RExC_size);
 
-        /* Here, have chosen which of the two inputs to look at.  Only output
-         * if the running count changes to/from 2, which marks the
-         * beginning/end of a range that's in the intersection */
-        if (cp_in_set) {
-            count++;
-            if (count == 2) {
-                array_r[i_r++] = cp;
-            }
-        }
-        else {
-            if (count == 2) {
-                array_r[i_r++] = cp;
-            }
-            count--;
-        }
+    DEBUG_DUMP_PRE_OPTIMIZE_r({
+        SV * const sv = sv_newmortal();
+        RXi_GET_DECL(RExC_rx, ri);
+        DEBUG_RExC_seen();
+        Perl_re_printf( aTHX_ "Program before optimization:\n");
 
-    }
+        (void)dumpuntil(RExC_rx, ri->program, ri->program + 1, NULL, NULL,
+                        sv, 0, 0);
+    });
 
-    /* The loop above increments the index into exactly one of the input lists
-     * each iteration, and ends when either index gets to its list end.  That
-     * means the other index is lower than its end, and so something is
-     * remaining in that one.  We increment 'count', as explained below, if the
-     * exhausted list was in its set.  (i_a and i_b each currently index the
-     * element beyond the one we care about.) */
-    if (   (i_a == len_a && PREV_RANGE_MATCHES_INVLIST(i_a))
-        || (i_b == len_b && PREV_RANGE_MATCHES_INVLIST(i_b)))
-    {
-        count++;
-    }
+    DEBUG_OPTIMISE_r(
+        Perl_re_printf( aTHX_  "Starting post parse optimization\n");
+    );
 
-    /* Above we incremented 'count' if the exhausted list was in its set.  This
-     * has made it so that 'count' being below 2 means there is nothing left to
-     * output; otheriwse what's left to add to the intersection is precisely
-     * that which is left in the non-exhausted input list.
-     *
-     * To see why, note first that the exhausted input obviously has nothing
-     * left to affect the intersection.  If it was in its set at its end, that
-     * means the set extends from here to the platform's infinity, and hence
-     * anything in the non-exhausted's list will be in the intersection, and
-     * anything not in it won't be.  Hence, the rest of the intersection is
-     * precisely what's in the non-exhausted list  The exhausted set also
-     * contributed 1 to 'count', meaning 'count' was at least 1.  Incrementing
-     * it means 'count' is now at least 2.  This is consistent with the
-     * incremented 'count' being >= 2 means to add the non-exhausted list to
-     * the intersection.
-     *
-     * But if the exhausted input wasn't in its set, it contributed 0 to
-     * 'count', and the intersection can't include anything further; the
-     * non-exhausted set is irrelevant.  'count' was at most 1, and doesn't get
-     * incremented.  This is consistent with 'count' being < 2 meaning nothing
-     * further to add to the intersection. */
-    if (count < 2) { /* Nothing left to put in the intersection. */
-        len_r = i_r;
-    }
-    else { /* copy the non-exhausted list, unchanged. */
-        IV copy_count = len_a - i_a;
-        if (copy_count > 0) {   /* a is the one with stuff left */
-            Copy(array_a + i_a, array_r + i_r, copy_count, UV);
-        }
-        else {  /* b is the one with stuff left */
-            copy_count = len_b - i_b;
-            Copy(array_b + i_b, array_r + i_r, copy_count, UV);
-        }
-        len_r = i_r + copy_count;
+    /* XXXX To minimize changes to RE engine we always allocate
+       3-units-long substrs field. */
+    Newx(RExC_rx->substrs, 1, struct reg_substr_data);
+    if (RExC_recurse_count) {
+        Newx(RExC_recurse, RExC_recurse_count, regnode *);
+        SAVEFREEPV(RExC_recurse);
     }
 
-    /* Set the result to the final length, which can change the pointer to
-     * array_r, so re-find it.  (Note that it is unlikely that this will
-     * change, as we are shrinking the space, not enlarging it) */
-    if (len_r != _invlist_len(r)) {
-        invlist_set_len(r, len_r, *get_invlist_offset_addr(r));
-        invlist_trim(r);
-        array_r = invlist_array(r);
+    if (RExC_seen & REG_RECURSE_SEEN) {
+        /* Note, RExC_total_parens is 1 + the number of parens in a pattern.
+         * So its 1 if there are no parens. */
+        RExC_study_chunk_recursed_bytes= (RExC_total_parens >> 3) +
+                                         ((RExC_total_parens & 0x07) != 0);
+        Newx(RExC_study_chunk_recursed,
+             RExC_study_chunk_recursed_bytes * RExC_total_parens, U8);
+        SAVEFREEPV(RExC_study_chunk_recursed);
     }
 
-    if (*i == NULL) { /* Simply return the calculated intersection */
-        *i = r;
-    }
-    else { /* Otherwise, replace the existing inversion list in '*i'.  We could
-              instead free '*i', and then set it to 'r', but experience has
-              shown [perl #127392] that if the input is a mortal, we can get a
-              huge build-up of these during regex compilation before they get
-              freed. */
-        if (len_r) {
-            invlist_replace_list_destroys_src(*i, r);
-        }
-        else {
-            invlist_clear(*i);
-        }
-        SvREFCNT_dec_NN(r);
+  reStudy:
+    RExC_rx->minlen = minlen = sawlookahead = sawplus = sawopen = sawminmod = 0;
+    DEBUG_r(
+        RExC_study_chunk_recursed_count= 0;
+    );
+    Zero(RExC_rx->substrs, 1, struct reg_substr_data);
+    if (RExC_study_chunk_recursed) {
+        Zero(RExC_study_chunk_recursed,
+             RExC_study_chunk_recursed_bytes * RExC_total_parens, U8);
     }
 
-    return;
-}
 
-SV*
-Perl__add_range_to_invlist(pTHX_ SV* invlist, UV start, UV end)
-{
-    /* Add the range from 'start' to 'end' inclusive to the inversion list's
-     * set.  A pointer to the inversion list is returned.  This may actually be
-     * a new list, in which case the passed in one has been destroyed.  The
-     * passed-in inversion list can be NULL, in which case a new one is created
-     * with just the one range in it.  The new list is not necessarily
-     * NUL-terminated.  Space is not freed if the inversion list shrinks as a
-     * result of this function.  The gain would not be large, and in many
-     * cases, this is called multiple times on a single inversion list, so
-     * anything freed may almost immediately be needed again.
-     *
-     * This used to mostly call the 'union' routine, but that is much more
-     * heavyweight than really needed for a single range addition */
-
-    UV* array;              /* The array implementing the inversion list */
-    UV len;                 /* How many elements in 'array' */
-    SSize_t i_s;            /* index into the invlist array where 'start'
-                               should go */
-    SSize_t i_e = 0;        /* And the index where 'end' should go */
-    UV cur_highest;         /* The highest code point in the inversion list
-                               upon entry to this function */
-
-    /* This range becomes the whole inversion list if none already existed */
-    if (invlist == NULL) {
-        invlist = _new_invlist(2);
-        _append_range_to_invlist(invlist, start, end);
-        return invlist;
-    }
+#ifdef TRIE_STUDY_OPT
+    /* search for "restudy" in this file for a detailed explanation */
+    if (!restudied) {
+        StructCopy(&zero_scan_data, &data, scan_data_t);
+        copyRExC_state = RExC_state;
+    } else {
+        U32 seen=RExC_seen;
+        DEBUG_OPTIMISE_r(Perl_re_printf( aTHX_ "Restudying\n"));
 
-    /* Likewise, if the inversion list is currently empty */
-    len = _invlist_len(invlist);
-    if (len == 0) {
-        _append_range_to_invlist(invlist, start, end);
-        return invlist;
+        RExC_state = copyRExC_state;
+        if (seen & REG_TOP_LEVEL_BRANCHES_SEEN)
+            RExC_seen |= REG_TOP_LEVEL_BRANCHES_SEEN;
+        else
+            RExC_seen &= ~REG_TOP_LEVEL_BRANCHES_SEEN;
+        StructCopy(&zero_scan_data, &data, scan_data_t);
     }
+#else
+    StructCopy(&zero_scan_data, &data, scan_data_t);
+#endif
 
-    /* Starting here, we have to know the internals of the list */
-    array = invlist_array(invlist);
+    /* Dig out information for optimizations. */
+    RExC_rx->extflags = RExC_flags; /* was pm_op */
+    /*dmq: removed as part of de-PMOP: pm->op_pmflags = RExC_flags; */
 
-    /* If the new range ends higher than the current highest ... */
-    cur_highest = invlist_highest(invlist);
-    if (end > cur_highest) {
+    if (UTF)
+        SvUTF8_on(Rx); /* Unicode in it? */
+    RExC_rxi->regstclass = NULL;
+    if (RExC_naughty >= TOO_NAUGHTY)   /* Probably an expensive pattern. */
+        RExC_rx->intflags |= PREGf_NAUGHTY;
+    scan = RExC_rxi->program + 1;              /* First BRANCH. */
 
-        /* If the whole range is higher, we can just append it */
-        if (start > cur_highest) {
-            _append_range_to_invlist(invlist, start, end);
-            return invlist;
-        }
+    /* testing for BRANCH here tells us whether there is "must appear"
+       data in the pattern. If there is then we can use it for optimisations */
+    if (!(RExC_seen & REG_TOP_LEVEL_BRANCHES_SEEN)) { /*  Only one top-level choice.
+                                                  */
+        SSize_t fake_deltap;
+        STRLEN longest_length[2];
+        regnode_ssc ch_class; /* pointed to by data */
+        int stclass_flag;
+        SSize_t last_close = 0; /* pointed to by data */
+        regnode *first= scan;
+        regnode *first_next= regnext(first);
+        regnode *last_close_op= NULL;
+        int i;
+
+        /*
+         * Skip introductions and multiplicators >= 1
+         * so that we can extract the 'meat' of the pattern that must
+         * match in the large if() sequence following.
+         * NOTE that EXACT is NOT covered here, as it is normally
+         * picked up by the optimiser separately.
+         *
+         * This is unfortunate as the optimiser isnt handling lookahead
+         * properly currently.
+         *
+         */
+        while (1)
+        {
+            if (OP(first) == OPEN)
+                sawopen = 1;
+            else
+            if (OP(first) == IFMATCH && !FLAGS(first))
+                /* for now we can't handle lookbehind IFMATCH */
+                sawlookahead = 1;
+            else
+            if (OP(first) == PLUS)
+                sawplus = 1;
+            else
+            if (OP(first) == MINMOD)
+                sawminmod = 1;
+            else
+            if (!(
+                /* An OR of *one* alternative - should not happen now. */
+                (OP(first) == BRANCH && OP(first_next) != BRANCH) ||
+                /* An {n,m} with n>0 */
+                (REGNODE_TYPE(OP(first)) == CURLY && ARG1i(first) > 0) ||
+                (OP(first) == NOTHING && REGNODE_TYPE(OP(first_next)) != END)
+            )){
+                break;
+            }
 
-        /* Otherwise, add the portion that is higher ... */
-        _append_range_to_invlist(invlist, cur_highest + 1, end);
+            first = REGNODE_AFTER(first);
+            first_next= regnext(first);
+        }
 
-        /* ... and continue on below to handle the rest.  As a result of the
-         * above append, we know that the index of the end of the range is the
-         * final even numbered one of the array.  Recall that the final element
-         * always starts a range that extends to infinity.  If that range is in
-         * the set (meaning the set goes from here to infinity), it will be an
-         * even index, but if it isn't in the set, it's odd, and the final
-         * range in the set is one less, which is even. */
-        if (end == UV_MAX) {
-            i_e = len;
+        /* Starting-point info. */
+      again:
+        DEBUG_PEEP("first:", first, 0, 0);
+        /* Ignore EXACT as we deal with it later. */
+        if (REGNODE_TYPE(OP(first)) == EXACT) {
+            if (! isEXACTFish(OP(first))) {
+                NOOP;  /* Empty, get anchored substr later. */
+            }
+            else
+                RExC_rxi->regstclass = first;
         }
-        else {
-            i_e = len - 2;
+#ifdef TRIE_STCLASS
+        else if (REGNODE_TYPE(OP(first)) == TRIE &&
+                ((reg_trie_data *)RExC_rxi->data->data[ ARG1u(first) ])->minlen>0)
+        {
+            /* this can happen only on restudy
+             * Search for "restudy" in this file to find
+             * a comment with details. */
+            RExC_rxi->regstclass = construct_ahocorasick_from_trie(pRExC_state, (regnode *)first, 0);
         }
-    }
+#endif
+        else if (REGNODE_SIMPLE(OP(first)))
+            RExC_rxi->regstclass = first;
+        else if (REGNODE_TYPE(OP(first)) == BOUND ||
+                 REGNODE_TYPE(OP(first)) == NBOUND)
+            RExC_rxi->regstclass = first;
+        else if (REGNODE_TYPE(OP(first)) == BOL) {
+            RExC_rx->intflags |= (OP(first) == MBOL
+                           ? PREGf_ANCH_MBOL
+                           : PREGf_ANCH_SBOL);
+            first = REGNODE_AFTER(first);
+            goto again;
+        }
+        else if (OP(first) == GPOS) {
+            RExC_rx->intflags |= PREGf_ANCH_GPOS;
+            first = REGNODE_AFTER_type(first,tregnode_GPOS);
+            goto again;
+        }
+        else if ((!sawopen || !RExC_sawback) &&
+            !sawlookahead &&
+            (OP(first) == STAR &&
+            REGNODE_TYPE(OP(REGNODE_AFTER(first))) == REG_ANY) &&
+            !(RExC_rx->intflags & PREGf_ANCH) && !(RExC_seen & REG_PESSIMIZE_SEEN))
+        {
+            /* turn .* into ^.* with an implied $*=1 */
+            const int type =
+                (OP(REGNODE_AFTER(first)) == REG_ANY)
+                    ? PREGf_ANCH_MBOL
+                    : PREGf_ANCH_SBOL;
+            RExC_rx->intflags |= (type | PREGf_IMPLICIT);
+            first = REGNODE_AFTER(first);
+            goto again;
+        }
+        if (sawplus && !sawminmod && !sawlookahead
+            && (!sawopen || !RExC_sawback)
+            && !(RExC_seen & REG_PESSIMIZE_SEEN)) /* May examine pos and $& */
+            /* x+ must match at the 1st pos of run of x's */
+            RExC_rx->intflags |= PREGf_SKIP;
 
-    /* We have dealt with appending, now see about prepending.  If the new
-     * range starts lower than the current lowest ... */
-    if (start < array[0]) {
+        /* Scan is after the zeroth branch, first is atomic matcher. */
+#ifdef TRIE_STUDY_OPT
+        /* search for "restudy" in this file for a detailed explanation */
+        DEBUG_PARSE_r(
+            if (!restudied)
+                Perl_re_printf( aTHX_  "first at %" IVdf "\n",
+                              (IV)(first - scan + 1))
+        );
+#else
+        DEBUG_PARSE_r(
+            Perl_re_printf( aTHX_  "first at %" IVdf "\n",
+                (IV)(first - scan + 1))
+        );
+#endif
 
-        /* Adding something which has 0 in it is somewhat tricky, and uncommon.
-         * Let the union code handle it, rather than having to know the
-         * trickiness in two code places.  */
-        if (UNLIKELY(start == 0)) {
-            SV* range_invlist;
 
-            range_invlist = _new_invlist(2);
-            _append_range_to_invlist(range_invlist, start, end);
+        /*
+        * If there's something expensive in the r.e., find the
+        * longest literal string that must appear and make it the
+        * regmust.  Resolve ties in favor of later strings, since
+        * the regstart check works with the beginning of the r.e.
+        * and avoiding duplication strengthens checking.  Not a
+        * strong reason, but sufficient in the absence of others.
+        * [Now we resolve ties in favor of the earlier string if
+        * it happens that c_offset_min has been invalidated, since the
+        * earlier string may buy us something the later one won't.]
+        */
 
-            _invlist_union(invlist, range_invlist, &invlist);
+        data.substrs[0].str = newSVpvs("");
+        data.substrs[1].str = newSVpvs("");
+        data.last_found = newSVpvs("");
+        data.cur_is_floating = 0; /* initially any found substring is fixed */
+        ENTER_with_name("study_chunk");
+        SAVEFREESV(data.substrs[0].str);
+        SAVEFREESV(data.substrs[1].str);
+        SAVEFREESV(data.last_found);
+        first = scan;
+        if (!RExC_rxi->regstclass) {
+            ssc_init(pRExC_state, &ch_class);
+            data.start_class = &ch_class;
+            stclass_flag = SCF_DO_STCLASS_AND;
+        } else                         /* XXXX Check for BOUND? */
+            stclass_flag = 0;
+        data.last_closep = &last_close;
+        data.last_close_opp = &last_close_op;
 
-            SvREFCNT_dec_NN(range_invlist);
+        DEBUG_RExC_seen();
+        /*
+         * MAIN ENTRY FOR study_chunk() FOR m/PATTERN/
+         * (NO top level branches)
+         */
+        minlen = study_chunk(pRExC_state, &first, &minlen, &fake_deltap,
+                             scan + RExC_size, /* Up to end */
+            &data, -1, 0, NULL,
+            SCF_DO_SUBSTR | SCF_WHILEM_VISITED_POS | stclass_flag
+                          | (restudied ? SCF_TRIE_DOING_RESTUDY : 0),
+            0, TRUE);
+        /* search for "restudy" in this file for a detailed explanation
+         * of 'restudied' and SCF_TRIE_DOING_RESTUDY */
 
-            return invlist;
-        }
 
-        /* If the whole new range comes before the first entry, and doesn't
-         * extend it, we have to insert it as an additional range */
-        if (end < array[0] - 1) {
-            i_s = i_e = -1;
-            goto splice_in_new_range;
-        }
+        CHECK_RESTUDY_GOTO_butfirst(LEAVE_with_name("study_chunk"));
 
-        /* Here the new range adjoins the existing first range, extending it
-         * downwards. */
-        array[0] = start;
 
-        /* And continue on below to handle the rest.  We know that the index of
-         * the beginning of the range is the first one of the array */
-        i_s = 0;
-    }
-    else { /* Not prepending any part of the new range to the existing list.
-            * Find where in the list it should go.  This finds i_s, such that:
-            *     invlist[i_s] <= start < array[i_s+1]
-            */
-        i_s = _invlist_search(invlist, start);
-    }
+        if ( RExC_total_parens == 1 && !data.cur_is_floating
+             && data.last_start_min == 0 && data.last_end > 0
+             && !RExC_seen_zerolen
+             && !(RExC_seen & REG_VERBARG_SEEN)
+             && !(RExC_seen & REG_GPOS_SEEN)
+        ){
+            RExC_rx->extflags |= RXf_CHECK_ALL;
+        }
+        scan_commit(pRExC_state, &data,&minlen, 0);
 
-    /* At this point, any extending before the beginning of the inversion list
-     * and/or after the end has been done.  This has made it so that, in the
-     * code below, each endpoint of the new range is either in a range that is
-     * in the set, or is in a gap between two ranges that are.  This means we
-     * don't have to worry about exceeding the array bounds.
-     *
-     * Find where in the list the new range ends (but we can skip this if we
-     * have already determined what it is, or if it will be the same as i_s,
-     * which we already have computed) */
-    if (i_e == 0) {
-        i_e = (start == end)
-              ? i_s
-              : _invlist_search(invlist, end);
-    }
 
-    /* Here generally invlist[i_e] <= end < array[i_e+1].  But if invlist[i_e]
-     * is a range that goes to infinity there is no element at invlist[i_e+1],
-     * so only the first relation holds. */
+        /* XXX this is done in reverse order because that's the way the
+         * code was before it was parameterised. Don't know whether it
+         * actually needs doing in reverse order. DAPM */
+        for (i = 1; i >= 0; i--) {
+            longest_length[i] = CHR_SVLEN(data.substrs[i].str);
 
-    if ( ! ELEMENT_RANGE_MATCHES_INVLIST(i_s)) {
+            if (   !(   i
+                     && SvCUR(data.substrs[0].str)  /* ok to leave SvCUR */
+                     &&    data.substrs[0].min_offset
+                        == data.substrs[1].min_offset
+                     &&    SvCUR(data.substrs[0].str)
+                        == SvCUR(data.substrs[1].str)
+                    )
+                && S_setup_longest (aTHX_ pRExC_state,
+                                        &(RExC_rx->substrs->data[i]),
+                                        &(data.substrs[i]),
+                                        longest_length[i]))
+            {
+                RExC_rx->substrs->data[i].min_offset =
+                        data.substrs[i].min_offset - data.substrs[i].lookbehind;
 
-        /* Here, the ranges on either side of the beginning of the new range
-         * are in the set, and this range starts in the gap between them.
-         *
-         * The new range extends the range above it downwards if the new range
-         * ends at or above that range's start */
-        const bool extends_the_range_above = (   end == UV_MAX
-                                              || end + 1 >= array[i_s+1]);
-
-        /* The new range extends the range below it upwards if it begins just
-         * after where that range ends */
-        if (start == array[i_s]) {
-
-            /* If the new range fills the entire gap between the other ranges,
-             * they will get merged together.  Other ranges may also get
-             * merged, depending on how many of them the new range spans.  In
-             * the general case, we do the merge later, just once, after we
-             * figure out how many to merge.  But in the case where the new
-             * range exactly spans just this one gap (possibly extending into
-             * the one above), we do the merge here, and an early exit.  This
-             * is done here to avoid having to special case later. */
-            if (i_e - i_s <= 1) {
-
-                /* If i_e - i_s == 1, it means that the new range terminates
-                 * within the range above, and hence 'extends_the_range_above'
-                 * must be true.  (If the range above it extends to infinity,
-                 * 'i_s+2' will be above the array's limit, but 'len-i_s-2'
-                 * will be 0, so no harm done.) */
-                if (extends_the_range_above) {
-                    Move(array + i_s + 2, array + i_s, len - i_s - 2, UV);
-                    invlist_set_len(invlist,
-                                    len - 2,
-                                    *(get_invlist_offset_addr(invlist)));
-                    return invlist;
-                }
-
-                /* Here, i_e must == i_s.  We keep them in sync, as they apply
-                 * to the same range, and below we are about to decrement i_s
-                 * */
-                i_e--;
+                RExC_rx->substrs->data[i].max_offset = data.substrs[i].max_offset;
+                /* Don't offset infinity */
+                if (data.substrs[i].max_offset < OPTIMIZE_INFTY)
+                    RExC_rx->substrs->data[i].max_offset -= data.substrs[i].lookbehind;
+                SvREFCNT_inc_simple_void_NN(data.substrs[i].str);
             }
-
-            /* Here, the new range is adjacent to the one below.  (It may also
-             * span beyond the range above, but that will get resolved later.)
-             * Extend the range below to include this one. */
-            array[i_s] = (end == UV_MAX) ? UV_MAX : end + 1;
-            i_s--;
-            start = array[i_s];
-        }
-        else if (extends_the_range_above) {
-
-            /* Here the new range only extends the range above it, but not the
-             * one below.  It merges with the one above.  Again, we keep i_e
-             * and i_s in sync if they point to the same range */
-            if (i_e == i_s) {
-                i_e++;
+            else {
+                RExC_rx->substrs->data[i].substr      = NULL;
+                RExC_rx->substrs->data[i].utf8_substr = NULL;
+                longest_length[i] = 0;
             }
-            i_s++;
-            array[i_s] = start;
         }
-    }
 
-    /* Here, we've dealt with the new range start extending any adjoining
-     * existing ranges.
-     *
-     * If the new range extends to infinity, it is now the final one,
-     * regardless of what was there before */
-    if (UNLIKELY(end == UV_MAX)) {
-        invlist_set_len(invlist, i_s + 1, *(get_invlist_offset_addr(invlist)));
-        return invlist;
-    }
+        LEAVE_with_name("study_chunk");
 
-    /* If i_e started as == i_s, it has also been dealt with,
-     * and been updated to the new i_s, which will fail the following if */
-    if (! ELEMENT_RANGE_MATCHES_INVLIST(i_e)) {
+        if (RExC_rxi->regstclass
+            && (OP(RExC_rxi->regstclass) == REG_ANY || OP(RExC_rxi->regstclass) == SANY))
+            RExC_rxi->regstclass = NULL;
 
-        /* Here, the ranges on either side of the end of the new range are in
-         * the set, and this range ends in the gap between them.
-         *
-         * If this range is adjacent to (hence extends) the range above it, it
-         * becomes part of that range; likewise if it extends the range below,
-         * it becomes part of that range */
-        if (end + 1 == array[i_e+1]) {
-            i_e++;
-            array[i_e] = start;
-        }
-        else if (start <= array[i_e]) {
-            array[i_e] = end + 1;
-            i_e--;
-        }
-    }
+        if ((!(RExC_rx->substrs->data[0].substr || RExC_rx->substrs->data[0].utf8_substr)
+              || RExC_rx->substrs->data[0].min_offset)
+            && stclass_flag
+            && ! (ANYOF_FLAGS(data.start_class) & SSC_MATCHES_EMPTY_STRING)
+            && is_ssc_worth_it(pRExC_state, data.start_class))
+        {
+            const U32 n = reg_add_data(pRExC_state, STR_WITH_LEN("f"));
 
-    if (i_s == i_e) {
+            ssc_finalize(pRExC_state, data.start_class);
 
-        /* If the range fits entirely in an existing range (as possibly already
-         * extended above), it doesn't add anything new */
-        if (ELEMENT_RANGE_MATCHES_INVLIST(i_s)) {
-            return invlist;
+            Newx(RExC_rxi->data->data[n], 1, regnode_ssc);
+            StructCopy(data.start_class,
+                       (regnode_ssc*)RExC_rxi->data->data[n],
+                       regnode_ssc);
+            RExC_rxi->regstclass = (regnode*)RExC_rxi->data->data[n];
+            RExC_rx->intflags &= ~PREGf_SKIP;  /* Used in find_byclass(). */
+            DEBUG_COMPILE_r({ SV *sv = sv_newmortal();
+                      regprop(RExC_rx, sv, (regnode*)data.start_class, NULL, pRExC_state);
+                      Perl_re_printf( aTHX_
+                                    "synthetic stclass \"%s\".\n",
+                                    SvPVX_const(sv));});
+            data.start_class = NULL;
         }
 
-        /* Here, no part of the range is in the list.  Must add it.  It will
-         * occupy 2 more slots */
-      splice_in_new_range:
+        /* A temporary algorithm prefers floated substr to fixed one of
+         * same length to dig more info. */
+        i = (longest_length[0] <= longest_length[1]);
+        RExC_rx->substrs->check_ix = i;
+        RExC_rx->check_end_shift  = RExC_rx->substrs->data[i].end_shift;
+        RExC_rx->check_substr     = RExC_rx->substrs->data[i].substr;
+        RExC_rx->check_utf8       = RExC_rx->substrs->data[i].utf8_substr;
+        RExC_rx->check_offset_min = RExC_rx->substrs->data[i].min_offset;
+        RExC_rx->check_offset_max = RExC_rx->substrs->data[i].max_offset;
+        if (!i && (RExC_rx->intflags & (PREGf_ANCH_SBOL|PREGf_ANCH_GPOS)))
+            RExC_rx->intflags |= PREGf_NOSCAN;
 
-        invlist_extend(invlist, len + 2);
-        array = invlist_array(invlist);
-        /* Move the rest of the array down two slots. Don't include any
-         * trailing NUL */
-        Move(array + i_e + 1, array + i_e + 3, len - i_e - 1, UV);
+        if ((RExC_rx->check_substr || RExC_rx->check_utf8) ) {
+            RExC_rx->extflags |= RXf_USE_INTUIT;
+            if (SvTAIL(RExC_rx->check_substr ? RExC_rx->check_substr : RExC_rx->check_utf8))
+                RExC_rx->extflags |= RXf_INTUIT_TAIL;
+        }
 
-        /* Do the actual splice */
-        array[i_e+1] = start;
-        array[i_e+2] = end + 1;
-        invlist_set_len(invlist, len + 2, *(get_invlist_offset_addr(invlist)));
-        return invlist;
+        /* XXX Unneeded? dmq (shouldn't as this is handled elsewhere)
+        if ( (STRLEN)minlen < longest_length[1] )
+            minlen= longest_length[1];
+        if ( (STRLEN)minlen < longest_length[0] )
+            minlen= longest_length[0];
+        */
     }
+    else {
+        /* Several toplevels. Best we can is to set minlen. */
+        SSize_t fake_deltap;
+        regnode_ssc ch_class;
+        SSize_t last_close = 0;
+        regnode *last_close_op = NULL;
 
-    /* Here the new range crossed the boundaries of a pre-existing range.  The
-     * code above has adjusted things so that both ends are in ranges that are
-     * in the set.  This means everything in between must also be in the set.
-     * Just squash things together */
-    Move(array + i_e + 1, array + i_s + 1, len - i_e - 1, UV);
-    invlist_set_len(invlist,
-                    len - i_e + i_s,
-                    *(get_invlist_offset_addr(invlist)));
-
-    return invlist;
-}
-
-SV*
-Perl__setup_canned_invlist(pTHX_ const STRLEN size, const UV element0,
-                                 UV** other_elements_ptr)
-{
-    /* Create and return an inversion list whose contents are to be populated
-     * by the caller.  The caller gives the number of elements (in 'size') and
-     * the very first element ('element0').  This function will set
-     * '*other_elements_ptr' to an array of UVs, where the remaining elements
-     * are to be placed.
-     *
-     * Obviously there is some trust involved that the caller will properly
-     * fill in the other elements of the array.
-     *
-     * (The first element needs to be passed in, as the underlying code does
-     * things differently depending on whether it is zero or non-zero) */
-
-    SV* invlist = _new_invlist(size);
-    bool offset;
-
-    PERL_ARGS_ASSERT__SETUP_CANNED_INVLIST;
+        DEBUG_PARSE_r(Perl_re_printf( aTHX_  "\nMulti Top Level\n"));
 
-    invlist = add_cp_to_invlist(invlist, element0);
-    offset = *get_invlist_offset_addr(invlist);
+        scan = RExC_rxi->program + 1;
+        ssc_init(pRExC_state, &ch_class);
+        data.start_class = &ch_class;
+        data.last_closep = &last_close;
+        data.last_close_opp = &last_close_op;
 
-    invlist_set_len(invlist, size, offset);
-    *other_elements_ptr = invlist_array(invlist) + 1;
-    return invlist;
-}
+        DEBUG_RExC_seen();
+        /*
+         * MAIN ENTRY FOR study_chunk() FOR m/P1|P2|.../
+         * (patterns WITH top level branches)
+         */
+        minlen = study_chunk(pRExC_state,
+            &scan, &minlen, &fake_deltap, scan + RExC_size, &data, -1, 0, NULL,
+            SCF_DO_STCLASS_AND|SCF_WHILEM_VISITED_POS|(restudied
+                                                      ? SCF_TRIE_DOING_RESTUDY
+                                                      : 0),
+            0, TRUE);
+        /* search for "restudy" in this file for a detailed explanation
+         * of 'restudied' and SCF_TRIE_DOING_RESTUDY */
 
-#endif
+        CHECK_RESTUDY_GOTO_butfirst(NOOP);
 
-#ifndef PERL_IN_XSUB_RE
-void
-Perl__invlist_invert(pTHX_ SV* const invlist)
-{
-    /* Complement the input inversion list.  This adds a 0 if the list didn't
-     * have a zero; removes it otherwise.  As described above, the data
-     * structure is set up so that this is very efficient */
+        RExC_rx->check_substr = NULL;
+        RExC_rx->check_utf8 = NULL;
+        RExC_rx->substrs->data[0].substr      = NULL;
+        RExC_rx->substrs->data[0].utf8_substr = NULL;
+        RExC_rx->substrs->data[1].substr      = NULL;
+        RExC_rx->substrs->data[1].utf8_substr = NULL;
 
-    PERL_ARGS_ASSERT__INVLIST_INVERT;
+        if (! (ANYOF_FLAGS(data.start_class) & SSC_MATCHES_EMPTY_STRING)
+            && is_ssc_worth_it(pRExC_state, data.start_class))
+        {
+            const U32 n = reg_add_data(pRExC_state, STR_WITH_LEN("f"));
 
-    assert(! invlist_is_iterating(invlist));
+            ssc_finalize(pRExC_state, data.start_class);
 
-    /* The inverse of matching nothing is matching everything */
-    if (_invlist_len(invlist) == 0) {
-        _append_range_to_invlist(invlist, 0, UV_MAX);
-        return;
+            Newx(RExC_rxi->data->data[n], 1, regnode_ssc);
+            StructCopy(data.start_class,
+                       (regnode_ssc*)RExC_rxi->data->data[n],
+                       regnode_ssc);
+            RExC_rxi->regstclass = (regnode*)RExC_rxi->data->data[n];
+            RExC_rx->intflags &= ~PREGf_SKIP;  /* Used in find_byclass(). */
+            DEBUG_COMPILE_r({ SV* sv = sv_newmortal();
+                      regprop(RExC_rx, sv, (regnode*)data.start_class, NULL, pRExC_state);
+                      Perl_re_printf( aTHX_
+                                    "synthetic stclass \"%s\".\n",
+                                    SvPVX_const(sv));});
+            data.start_class = NULL;
+        }
     }
 
-    *get_invlist_offset_addr(invlist) = ! *get_invlist_offset_addr(invlist);
-}
-
-SV*
-Perl_invlist_clone(pTHX_ SV* const invlist, SV* new_invlist)
-{
-    /* Return a new inversion list that is a copy of the input one, which is
-     * unchanged.  The new list will not be mortal even if the old one was. */
-
-    const STRLEN nominal_length = _invlist_len(invlist);
-    const STRLEN physical_length = SvCUR(invlist);
-    const bool offset = *(get_invlist_offset_addr(invlist));
-
-    PERL_ARGS_ASSERT_INVLIST_CLONE;
-
-    if (new_invlist == NULL) {
-        new_invlist = _new_invlist(nominal_length);
+    if (RExC_seen & REG_UNBOUNDED_QUANTIFIER_SEEN) {
+        RExC_rx->extflags |= RXf_UNBOUNDED_QUANTIFIER_SEEN;
+        RExC_rx->maxlen = REG_INFTY;
     }
     else {
-        sv_upgrade(new_invlist, SVt_INVLIST);
-        initialize_invlist_guts(new_invlist, nominal_length);
+        RExC_rx->maxlen = RExC_maxlen;
     }
 
-    *(get_invlist_offset_addr(new_invlist)) = offset;
-    invlist_set_len(new_invlist, nominal_length, offset);
-    Copy(SvPVX(invlist), SvPVX(new_invlist), physical_length, char);
-
-    return new_invlist;
-}
-
-#endif
+    /* Guard against an embedded (?=) or (?<=) with a longer minlen than
+       the "real" pattern. */
+    DEBUG_OPTIMISE_r({
+        Perl_re_printf( aTHX_ "minlen: %" IVdf " RExC_rx->minlen:%" IVdf " maxlen:%" IVdf "\n",
+                      (IV)minlen, (IV)RExC_rx->minlen, (IV)RExC_maxlen);
+    });
+    RExC_rx->minlenret = minlen;
+    if (RExC_rx->minlen < minlen)
+        RExC_rx->minlen = minlen;
 
-PERL_STATIC_INLINE UV
-S_invlist_lowest(SV* const invlist)
-{
-    /* Returns the lowest code point that matches an inversion list.  This API
-     * has an ambiguity, as it returns 0 under either the lowest is actually
-     * 0, or if the list is empty.  If this distinction matters to you, check
-     * for emptiness before calling this function */
+    if (RExC_seen & REG_RECURSE_SEEN ) {
+        RExC_rx->intflags |= PREGf_RECURSE_SEEN;
+        Newx(RExC_rx->recurse_locinput, RExC_rx->nparens + 1, char *);
+    }
+    if (RExC_seen & REG_GPOS_SEEN)
+        RExC_rx->intflags |= PREGf_GPOS_SEEN;
 
-    UV len = _invlist_len(invlist);
-    UV *array;
+    if (RExC_seen & REG_PESSIMIZE_SEEN)
+        RExC_rx->intflags |= PREGf_PESSIMIZE_SEEN;
 
-    PERL_ARGS_ASSERT_INVLIST_LOWEST;
+    if (RExC_seen & REG_LOOKBEHIND_SEEN)
+        RExC_rx->extflags |= RXf_NO_INPLACE_SUBST; /* inplace might break the
+                                                lookbehind */
+    if (pRExC_state->code_blocks)
+        RExC_rx->extflags |= RXf_EVAL_SEEN;
 
-    if (len == 0) {
-        return 0;
+    if (RExC_seen & REG_VERBARG_SEEN) {
+        RExC_rx->intflags |= PREGf_VERBARG_SEEN;
+        RExC_rx->extflags |= RXf_NO_INPLACE_SUBST; /* don't understand this! Yves */
     }
 
-    array = invlist_array(invlist);
+    if (RExC_seen & REG_CUTGROUP_SEEN)
+        RExC_rx->intflags |= PREGf_CUTGROUP_SEEN;
 
-    return array[0];
-}
+    if (pm_flags & PMf_USE_RE_EVAL)
+        RExC_rx->intflags |= PREGf_USE_RE_EVAL;
 
-STATIC SV *
-S_invlist_contents(pTHX_ SV* const invlist, const bool traditional_style)
-{
-    /* Get the contents of an inversion list into a string SV so that they can
-     * be printed out.  If 'traditional_style' is TRUE, it uses the format
-     * traditionally done for debug tracing; otherwise it uses a format
-     * suitable for just copying to the output, with blanks between ranges and
-     * a dash between range components */
-
-    UV start, end;
-    SV* output;
-    const char intra_range_delimiter = (traditional_style ? '\t' : '-');
-    const char inter_range_delimiter = (traditional_style ? '\n' : ' ');
-
-    if (traditional_style) {
-        output = newSVpvs("\n");
-    }
-    else {
-        output = newSVpvs("");
-    }
+    if (RExC_paren_names)
+        RXp_PAREN_NAMES(RExC_rx) = MUTABLE_HV(SvREFCNT_inc(RExC_paren_names));
+    else
+        RXp_PAREN_NAMES(RExC_rx) = NULL;
 
-    PERL_ARGS_ASSERT_INVLIST_CONTENTS;
+    /* If we have seen an anchor in our pattern then we set the extflag RXf_IS_ANCHORED
+     * so it can be used in pp.c */
+    if (RExC_rx->intflags & PREGf_ANCH)
+        RExC_rx->extflags |= RXf_IS_ANCHORED;
 
-    assert(! invlist_is_iterating(invlist));
 
-    invlist_iterinit(invlist);
-    while (invlist_iternext(invlist, &start, &end)) {
-        if (end == UV_MAX) {
-            Perl_sv_catpvf(aTHX_ output, "%04" UVXf "%cINFTY%c",
-                                          start, intra_range_delimiter,
-                                                 inter_range_delimiter);
-        }
-        else if (end != start) {
-            Perl_sv_catpvf(aTHX_ output, "%04" UVXf "%c%04" UVXf "%c",
-                                          start,
-                                                   intra_range_delimiter,
-                                                  end, inter_range_delimiter);
-        }
-        else {
-            Perl_sv_catpvf(aTHX_ output, "%04" UVXf "%c",
-                                          start, inter_range_delimiter);
+    {
+        /* this is used to identify "special" patterns that might result
+         * in Perl NOT calling the regex engine and instead doing the match "itself",
+         * particularly special cases in split//. By having the regex compiler
+         * do this pattern matching at a regop level (instead of by inspecting the pattern)
+         * we avoid weird issues with equivalent patterns resulting in different behavior,
+         * AND we allow non Perl engines to get the same optimizations by the setting the
+         * flags appropriately - Yves */
+        regnode *first = RExC_rxi->program + 1;
+        U8 fop = OP(first);
+        regnode *next = NULL;
+        U8 nop = 0;
+        if (fop == NOTHING || fop == MBOL || fop == SBOL || fop == PLUS) {
+            next = REGNODE_AFTER(first);
+            nop = OP(next);
         }
+        /* It's safe to read through *next only if OP(first) is a regop of
+         * the right type (not EXACT, for example).
+         */
+        if (REGNODE_TYPE(fop) == NOTHING && nop == END)
+            RExC_rx->extflags |= RXf_NULL;
+        else if ((fop == MBOL || (fop == SBOL && !FLAGS(first))) && nop == END)
+            /* when fop is SBOL first->flags will be true only when it was
+             * produced by parsing /\A/, and not when parsing /^/. This is
+             * very important for the split code as there we want to
+             * treat /^/ as /^/m, but we do not want to treat /\A/ as /^/m.
+             * See rt #122761 for more details. -- Yves */
+            RExC_rx->extflags |= RXf_START_ONLY;
+        else if (fop == PLUS
+                 && REGNODE_TYPE(nop) == POSIXD && FLAGS(next) == CC_SPACE_
+                 && OP(regnext(first)) == END)
+            RExC_rx->extflags |= RXf_WHITE;
+        else if ( RExC_rx->extflags & RXf_SPLIT
+                  && (REGNODE_TYPE(fop) == EXACT && ! isEXACTFish(fop))
+                  && STR_LEN(first) == 1
+                  && *(STRING(first)) == ' '
+                  && OP(regnext(first)) == END )
+            RExC_rx->extflags |= (RXf_SKIPWHITE|RXf_WHITE);
+
     }
 
-    if (SvCUR(output) && ! traditional_style) {/* Get rid of trailing blank */
-        SvCUR_set(output, SvCUR(output) - 1);
+    if (RExC_contains_locale) {
+        RXp_EXTFLAGS(RExC_rx) |= RXf_TAINTED;
     }
 
-    return output;
-}
+#ifdef DEBUGGING
+    if (RExC_paren_names) {
+        RExC_rxi->name_list_idx = reg_add_data( pRExC_state, STR_WITH_LEN("a"));
+        RExC_rxi->data->data[RExC_rxi->name_list_idx]
+                                   = (void*)SvREFCNT_inc(RExC_paren_name_list);
+    } else
+#endif
+    RExC_rxi->name_list_idx = 0;
 
-#ifndef PERL_IN_XSUB_RE
-void
-Perl__invlist_dump(pTHX_ PerlIO *file, I32 level,
-                         const char * const indent, SV* const invlist)
-{
-    /* Designed to be called only by do_sv_dump().  Dumps out the ranges of the
-     * inversion list 'invlist' to 'file' at 'level'  Each line is prefixed by
-     * the string 'indent'.  The output looks like this:
-         [0] 0x000A .. 0x000D
-         [2] 0x0085
-         [4] 0x2028 .. 0x2029
-         [6] 0x3104 .. INFTY
-     * This means that the first range of code points matched by the list are
-     * 0xA through 0xD; the second range contains only the single code point
-     * 0x85, etc.  An inversion list is an array of UVs.  Two array elements
-     * are used to define each range (except if the final range extends to
-     * infinity, only a single element is needed).  The array index of the
-     * first element for the corresponding range is given in brackets. */
-
-    UV start, end;
-    STRLEN count = 0;
-
-    PERL_ARGS_ASSERT__INVLIST_DUMP;
-
-    if (invlist_is_iterating(invlist)) {
-        Perl_dump_indent(aTHX_ level, file,
-             "%sCan't dump inversion list because is in middle of iterating\n",
-             indent);
-        return;
+    while ( RExC_recurse_count > 0 ) {
+        const regnode *scan = RExC_recurse[ --RExC_recurse_count ];
+        /*
+         * This data structure is set up in study_chunk() and is used
+         * to calculate the distance between a GOSUB regopcode and
+         * the OPEN/CURLYM (CURLYM's are special and can act like OPEN's)
+         * it refers to.
+         *
+         * If for some reason someone writes code that optimises
+         * away a GOSUB opcode then the assert should be changed to
+         * an if(scan) to guard the ARG2i_SET() - Yves
+         *
+         */
+        assert(scan && OP(scan) == GOSUB);
+        ARG2i_SET( scan, RExC_open_parens[ARG1u(scan)] - REGNODE_OFFSET(scan));
+    }
+    if (RExC_logical_total_parens != RExC_total_parens) {
+        Newxz(RExC_parno_to_logical_next, RExC_total_parens, I32);
+        /* we rebuild this below */
+        Zero(RExC_logical_to_parno, RExC_total_parens, I32);
+        for( int parno = RExC_total_parens-1 ; parno > 0 ; parno-- ) {
+            int logical_parno= RExC_parno_to_logical[parno];
+            assert(logical_parno);
+            RExC_parno_to_logical_next[parno]= RExC_logical_to_parno[logical_parno];
+            RExC_logical_to_parno[logical_parno] = parno;
+        }
+        RExC_rx->logical_to_parno = RExC_logical_to_parno;
+        RExC_rx->parno_to_logical = RExC_parno_to_logical;
+        RExC_rx->parno_to_logical_next = RExC_parno_to_logical_next;
+        RExC_logical_to_parno = NULL;
+        RExC_parno_to_logical = NULL;
+        RExC_parno_to_logical_next = NULL;
+    } else {
+        RExC_rx->logical_to_parno = NULL;
+        RExC_rx->parno_to_logical = NULL;
+        RExC_rx->parno_to_logical_next = NULL;
+    }
+
+    Newxz(RXp_OFFSp(RExC_rx), RExC_total_parens, regexp_paren_pair);
+    /* assume we don't need to swap parens around before we match */
+    DEBUG_TEST_r({
+        Perl_re_printf( aTHX_ "study_chunk_recursed_count: %lu\n",
+            (unsigned long)RExC_study_chunk_recursed_count);
+    });
+    DEBUG_DUMP_r({
+        DEBUG_RExC_seen();
+        Perl_re_printf( aTHX_ "Final program:\n");
+        regdump(RExC_rx);
+    });
+
+    if (RExC_open_parens) {
+        Safefree(RExC_open_parens);
+        RExC_open_parens = NULL;
+    }
+    if (RExC_close_parens) {
+        Safefree(RExC_close_parens);
+        RExC_close_parens = NULL;
     }
-
-    invlist_iterinit(invlist);
-    while (invlist_iternext(invlist, &start, &end)) {
-        if (end == UV_MAX) {
-            Perl_dump_indent(aTHX_ level, file,
-                                       "%s[%" UVuf "] 0x%04" UVXf " .. INFTY\n",
-                                   indent, (UV)count, start);
-        }
-        else if (end != start) {
-            Perl_dump_indent(aTHX_ level, file,
-                                    "%s[%" UVuf "] 0x%04" UVXf " .. 0x%04" UVXf "\n",
-                                indent, (UV)count, start,         end);
-        }
-        else {
-            Perl_dump_indent(aTHX_ level, file, "%s[%" UVuf "] 0x%04" UVXf "\n",
-                                            indent, (UV)count, start);
-        }
-        count += 2;
+    if (RExC_logical_to_parno) {
+        Safefree(RExC_logical_to_parno);
+        RExC_logical_to_parno = NULL;
+    }
+    if (RExC_parno_to_logical) {
+        Safefree(RExC_parno_to_logical);
+        RExC_parno_to_logical = NULL;
     }
-}
 
+#ifdef USE_ITHREADS
+    /* under ithreads the ?pat? PMf_USED flag on the pmop is simulated
+     * by setting the regexp SV to readonly-only instead. If the
+     * pattern's been recompiled, the USEDness should remain. */
+    if (old_re && SvREADONLY(old_re))
+        SvREADONLY_on(Rx);
 #endif
+    return Rx;
+}
 
-#if defined(PERL_ARGS_ASSERT__INVLISTEQ) && !defined(PERL_IN_XSUB_RE)
-bool
-Perl__invlistEQ(pTHX_ SV* const a, SV* const b, const bool complement_b)
-{
-    /* Return a boolean as to if the two passed in inversion lists are
-     * identical.  The final argument, if TRUE, says to take the complement of
-     * the second inversion list before doing the comparison */
-
-    const UV len_a = _invlist_len(a);
-    UV len_b = _invlist_len(b);
-
-    const UV* array_a = NULL;
-    const UV* array_b = NULL;
-
-    PERL_ARGS_ASSERT__INVLISTEQ;
-
-    /* This code avoids accessing the arrays unless it knows the length is
-     * non-zero */
 
-    if (len_a == 0) {
-        if (len_b == 0) {
-            return ! complement_b;
-        }
-    }
-    else {
-        array_a = invlist_array(a);
-    }
 
-    if (len_b != 0) {
-        array_b = invlist_array(b);
-    }
+SV*
+Perl_reg_qr_package(pTHX_ REGEXP * const rx)
+{
+    PERL_ARGS_ASSERT_REG_QR_PACKAGE;
+        PERL_UNUSED_ARG(rx);
+        if (0)
+            return NULL;
+        else
+            return newSVpvs("Regexp");
+}
 
-    /* If are to compare 'a' with the complement of b, set it
-     * up so are looking at b's complement. */
-    if (complement_b) {
+/* Scans the name of a named buffer from the pattern.
+ * If flags is REG_RSN_RETURN_NULL returns null.
+ * If flags is REG_RSN_RETURN_NAME returns an SV* containing the name
+ * If flags is REG_RSN_RETURN_DATA returns the data SV* corresponding
+ * to the parsed name as looked up in the RExC_paren_names hash.
+ * If there is an error throws a vFAIL().. type exception.
+ */
 
-        /* The complement of nothing is everything, so <a> would have to have
-         * just one element, starting at zero (ending at infinity) */
-        if (len_b == 0) {
-            return (len_a == 1 && array_a[0] == 0);
-        }
-        if (array_b[0] == 0) {
+#define REG_RSN_RETURN_NULL    0
+#define REG_RSN_RETURN_NAME    1
+#define REG_RSN_RETURN_DATA    2
 
-            /* Otherwise, to complement, we invert.  Here, the first element is
-             * 0, just remove it.  To do this, we just pretend the array starts
-             * one later */
+STATIC SV*
+S_reg_scan_name(pTHX_ RExC_state_t *pRExC_state, U32 flags)
+{
+    char *name_start = RExC_parse;
+    SV* sv_name;
 
-            array_b++;
-            len_b--;
-        }
-        else {
+    PERL_ARGS_ASSERT_REG_SCAN_NAME;
 
-            /* But if the first element is not zero, we pretend the list starts
-             * at the 0 that is always stored immediately before the array. */
-            array_b--;
-            len_b++;
-        }
+    assert (RExC_parse <= RExC_end);
+    if (RExC_parse == RExC_end) NOOP;
+    else if (isIDFIRST_lazy_if_safe(RExC_parse, RExC_end, UTF)) {
+         /* Note that the code here assumes well-formed UTF-8.  Skip IDFIRST by
+          * using do...while */
+        if (UTF)
+            do {
+                RExC_parse_inc_utf8();
+            } while (   RExC_parse < RExC_end
+                     && isWORDCHAR_utf8_safe((U8*)RExC_parse, (U8*) RExC_end));
+        else
+            do {
+                RExC_parse_inc_by(1);
+            } while (RExC_parse < RExC_end && isWORDCHAR(*RExC_parse));
+    } else {
+        RExC_parse_inc_by(1); /* so the <- from the vFAIL is after the offending
+                         character */
+        vFAIL("Group name must start with a non-digit word character");
     }
+    sv_name = newSVpvn_flags(name_start, (int)(RExC_parse - name_start),
+                             SVs_TEMP | (UTF ? SVf_UTF8 : 0));
+    if ( flags == REG_RSN_RETURN_NAME)
+        return sv_name;
+    else if (flags==REG_RSN_RETURN_DATA) {
+        HE *he_str = NULL;
+        SV *sv_dat = NULL;
+        if ( ! sv_name )      /* should not happen*/
+            Perl_croak(aTHX_ "panic: no svname in reg_scan_name");
+        if (RExC_paren_names)
+            he_str = hv_fetch_ent( RExC_paren_names, sv_name, 0, 0 );
+        if ( he_str )
+            sv_dat = HeVAL(he_str);
+        if ( ! sv_dat ) {   /* Didn't find group */
 
-    return    len_a == len_b
-           && memEQ(array_a, array_b, len_a * sizeof(array_a[0]));
-
-}
-#endif
-
-/*
- * As best we can, determine the characters that can match the start of
- * the given EXACTF-ish node.  This is for use in creating ssc nodes, so there
- * can be false positive matches
- *
- * Returns the invlist as a new SV*; it is the caller's responsibility to
- * call SvREFCNT_dec() when done with it.
- */
-STATIC SV*
-S_make_exactf_invlist(pTHX_ RExC_state_t *pRExC_state, regnode *node)
-{
-    const U8 * s = (U8*)STRING(node);
-    SSize_t bytelen = STR_LEN(node);
-    UV uc;
-    /* Start out big enough for 2 separate code points */
-    SV* invlist = _new_invlist(4);
-
-    PERL_ARGS_ASSERT_MAKE_EXACTF_INVLIST;
-
-    if (! UTF) {
-        uc = *s;
-
-        /* We punt and assume can match anything if the node begins
-         * with a multi-character fold.  Things are complicated.  For
-         * example, /ffi/i could match any of:
-         *  "\N{LATIN SMALL LIGATURE FFI}"
-         *  "\N{LATIN SMALL LIGATURE FF}I"
-         *  "F\N{LATIN SMALL LIGATURE FI}"
-         *  plus several other things; and making sure we have all the
-         *  possibilities is hard. */
-        if (is_MULTI_CHAR_FOLD_latin1_safe(s, s + bytelen)) {
-            invlist = _add_range_to_invlist(invlist, 0, UV_MAX);
-        }
-        else {
-            /* Any Latin1 range character can potentially match any
-             * other depending on the locale, and in Turkic locales, U+130 and
-             * U+131 */
-            if (OP(node) == EXACTFL) {
-                _invlist_union(invlist, PL_Latin1, &invlist);
-                invlist = add_cp_to_invlist(invlist,
-                                                LATIN_SMALL_LETTER_DOTLESS_I);
-                invlist = add_cp_to_invlist(invlist,
-                                        LATIN_CAPITAL_LETTER_I_WITH_DOT_ABOVE);
+            /* It might be a forward reference; we can't fail until we
+                * know, by completing the parse to get all the groups, and
+                * then reparsing */
+            if (ALL_PARENS_COUNTED)  {
+                vFAIL("Reference to nonexistent named group");
             }
             else {
-                /* But otherwise, it matches at least itself.  We can
-                 * quickly tell if it has a distinct fold, and if so,
-                 * it matches that as well */
-                invlist = add_cp_to_invlist(invlist, uc);
-                if (IS_IN_SOME_FOLD_L1(uc))
-                    invlist = add_cp_to_invlist(invlist, PL_fold_latin1[uc]);
-            }
-
-            /* Some characters match above-Latin1 ones under /i.  This
-             * is true of EXACTFL ones when the locale is UTF-8 */
-            if (HAS_NONLATIN1_SIMPLE_FOLD_CLOSURE(uc)
-                && (! isASCII(uc) || ! inRANGE(OP(node), EXACTFAA,
-                                                         EXACTFAA_NO_TRIE)))
-            {
-                add_above_Latin1_folds(pRExC_state, (U8) uc, &invlist);
+                REQUIRE_PARENS_PASS;
             }
         }
+        return sv_dat;
     }
-    else {  /* Pattern is UTF-8 */
-        U8 folded[UTF8_MAX_FOLD_CHAR_EXPAND * UTF8_MAXBYTES_CASE + 1] = { '\0' };
-        const U8* e = s + bytelen;
-        IV fc;
-
-        fc = uc = utf8_to_uvchr_buf(s, s + bytelen, NULL);
-
-        /* The only code points that aren't folded in a UTF EXACTFish
-         * node are the problematic ones in EXACTFL nodes */
-        if (OP(node) == EXACTFL && is_PROBLEMATIC_LOCALE_FOLDEDS_START_cp(uc)) {
-            /* We need to check for the possibility that this EXACTFL
-             * node begins with a multi-char fold.  Therefore we fold
-             * the first few characters of it so that we can make that
-             * check */
-            U8 *d = folded;
-            int i;
-
-            fc = -1;
-            for (i = 0; i < UTF8_MAX_FOLD_CHAR_EXPAND && s < e; i++) {
-                if (isASCII(*s)) {
-                    *(d++) = (U8) toFOLD(*s);
-                    if (fc < 0) {       /* Save the first fold */
-                        fc = *(d-1);
-                    }
-                    s++;
-                }
-                else {
-                    STRLEN len;
-                    UV fold = toFOLD_utf8_safe(s, e, d, &len);
-                    if (fc < 0) {       /* Save the first fold */
-                        fc = fold;
-                    }
-                    d += len;
-                    s += UTF8SKIP(s);
-                }
-            }
-
-            /* And set up so the code below that looks in this folded
-             * buffer instead of the node's string */
-            e = d;
-            s = folded;
-        }
-
-        /* When we reach here 's' points to the fold of the first
-         * character(s) of the node; and 'e' points to far enough along
-         * the folded string to be just past any possible multi-char
-         * fold.
-         *
-         * Like the non-UTF case above, we punt if the node begins with a
-         * multi-char fold  */
-
-        if (is_MULTI_CHAR_FOLD_utf8_safe(s, e)) {
-            invlist = _add_range_to_invlist(invlist, 0, UV_MAX);
-        }
-        else {  /* Single char fold */
-            unsigned int k;
-            U32 first_fold;
-            const U32 * remaining_folds;
-            Size_t folds_count;
-
-            /* It matches itself */
-            invlist = add_cp_to_invlist(invlist, fc);
-
-            /* ... plus all the things that fold to it, which are found in
-             * PL_utf8_foldclosures */
-            folds_count = _inverse_folds(fc, &first_fold,
-                                                &remaining_folds);
-            for (k = 0; k < folds_count; k++) {
-                UV c = (k == 0) ? first_fold : remaining_folds[k-1];
 
-                /* /aa doesn't allow folds between ASCII and non- */
-                if (   inRANGE(OP(node), EXACTFAA, EXACTFAA_NO_TRIE)
-                    && isASCII(c) != isASCII(fc))
-                {
-                    continue;
-                }
-
-                invlist = add_cp_to_invlist(invlist, c);
-            }
+    Perl_croak(aTHX_ "panic: bad flag %lx in reg_scan_name",
+                     (unsigned long) flags);
+}
 
-            if (OP(node) == EXACTFL) {
+#define DEBUG_PARSE_MSG(funcname)     DEBUG_PARSE_r({           \
+    if (RExC_lastparse!=RExC_parse) {                           \
+        Perl_re_printf( aTHX_  "%s",                            \
+            Perl_pv_pretty(aTHX_ RExC_mysv1, RExC_parse,        \
+                RExC_end - RExC_parse, 16,                      \
+                "", "",                                         \
+                PERL_PV_ESCAPE_UNI_DETECT |                     \
+                PERL_PV_PRETTY_ELLIPSES   |                     \
+                PERL_PV_PRETTY_LTGT       |                     \
+                PERL_PV_ESCAPE_RE         |                     \
+                PERL_PV_PRETTY_EXACTSIZE                        \
+            )                                                   \
+        );                                                      \
+    } else                                                      \
+        Perl_re_printf( aTHX_ "%16s","");                       \
+                                                                \
+    if (RExC_lastnum!=RExC_emit)                                \
+       Perl_re_printf( aTHX_ "|%4zu", RExC_emit);                \
+    else                                                        \
+       Perl_re_printf( aTHX_ "|%4s","");                        \
+    Perl_re_printf( aTHX_ "|%*s%-4s",                           \
+        (int)((depth*2)), "",                                   \
+        (funcname)                                              \
+    );                                                          \
+    RExC_lastnum=RExC_emit;                                     \
+    RExC_lastparse=RExC_parse;                                  \
+})
 
-                /* If either [iI] are present in an EXACTFL node the above code
-                 * should have added its normal case pair, but under a Turkish
-                 * locale they could match instead the case pairs from it.  Add
-                 * those as potential matches as well */
-                if (isALPHA_FOLD_EQ(fc, 'I')) {
-                    invlist = add_cp_to_invlist(invlist,
-                                                LATIN_SMALL_LETTER_DOTLESS_I);
-                    invlist = add_cp_to_invlist(invlist,
-                                        LATIN_CAPITAL_LETTER_I_WITH_DOT_ABOVE);
-                }
-                else if (fc == LATIN_SMALL_LETTER_DOTLESS_I) {
-                    invlist = add_cp_to_invlist(invlist, 'I');
-                }
-                else if (fc == LATIN_CAPITAL_LETTER_I_WITH_DOT_ABOVE) {
-                    invlist = add_cp_to_invlist(invlist, 'i');
-                }
-            }
-        }
-    }
 
-    return invlist;
-}
 
-#undef HEADER_LENGTH
-#undef TO_INTERNAL_SIZE
-#undef FROM_INTERNAL_SIZE
-#undef INVLIST_VERSION_ID
+#define DEBUG_PARSE(funcname)     DEBUG_PARSE_r({           \
+    DEBUG_PARSE_MSG((funcname));                            \
+    Perl_re_printf( aTHX_ "%4s","\n");                                  \
+})
+#define DEBUG_PARSE_FMT(funcname,fmt,args)     DEBUG_PARSE_r({\
+    DEBUG_PARSE_MSG((funcname));                            \
+    Perl_re_printf( aTHX_ fmt "\n",args);                               \
+})
 
-/* End of inversion list object */
 
 STATIC void
 S_parse_lparen_question_flags(pTHX_ RExC_state_t *pRExC_state)
@@ -11375,12 +2724,6 @@ S_parse_lparen_question_flags(pTHX_ RExC_state_t *pRExC_state)
  * is a trifle forced, but the need to tie the tails of the branches to what
  * follows makes it hard to avoid.
  */
-#define REGTAIL(x,y,z) regtail((x),(y),(z),depth+1)
-#ifdef DEBUGGING
-#define REGTAIL_STUDY(x,y,z) regtail_study((x),(y),(z),depth+1)
-#else
-#define REGTAIL_STUDY(x,y,z) regtail((x),(y),(z),depth+1)
-#endif
 
 STATIC regnode_offset
 S_handle_named_backref(pTHX_ RExC_state_t *pRExC_state,
@@ -11408,12 +2751,12 @@ S_handle_named_backref(pTHX_ RExC_state_t *pRExC_state,
     }
 
     if (sv_dat) {
-        num = add_data( pRExC_state, STR_WITH_LEN("S"));
+        num = reg_add_data( pRExC_state, STR_WITH_LEN("S"));
         RExC_rxi->data->data[num]=(void*)sv_dat;
         SvREFCNT_inc_simple_void_NN(sv_dat);
     }
     RExC_sawback = 1;
-    ret = reganode(pRExC_state,
+    ret = reg2node(pRExC_state,
                    ((! FOLD)
                      ? REFN
                      : (ASCII_FOLD_RESTRICTED)
@@ -11423,7 +2766,9 @@ S_handle_named_backref(pTHX_ RExC_state_t *pRExC_state,
                          : (LOC)
                            ? REFFLN
                            : REFFN),
-                    num);
+                    num, RExC_nestroot);
+    if (RExC_nestroot && num >= (U32)RExC_nestroot)
+        FLAGS(REGNODE_p(ret)) = VOLATILE_REF;
     *flagp |= HASWIDTH;
 
     nextchar(pRExC_state);
@@ -11432,7 +2777,7 @@ S_handle_named_backref(pTHX_ RExC_state_t *pRExC_state,
 
 /* reg_la_NOTHING()
  *
- * Maybe parse a parenthezised lookaround construct that is equivalent to a
+ * Maybe parse a parenthesized lookaround construct that is equivalent to a
  * NOTHING regop when the construct is empty.
  *
  * Calls skip_to_be_ignored_text() before checking if the construct is empty.
@@ -11482,7 +2827,7 @@ S_reg_la_NOTHING(pTHX_ RExC_state_t *pRExC_state, U32 flags,
 
 /* reg_la_OPFAIL()
  *
- * Maybe parse a parenthezised lookaround construct that is equivalent to a
+ * Maybe parse a parenthesized lookaround construct that is equivalent to a
  * OPFAIL regop when the construct is empty.
  *
  * Calls skip_to_be_ignored_text() before checking if the construct is empty.
@@ -11516,7 +2861,7 @@ S_reg_la_OPFAIL(pTHX_ RExC_state_t *pRExC_state, U32 flags,
         vFAIL2("Sequence (%s... not terminated", type);
 
     if (*RExC_parse == ')') {
-        regnode_offset ret= reganode(pRExC_state, OPFAIL, 0);
+        regnode_offset ret= reg1node(pRExC_state, OPFAIL, 0);
         nextchar(pRExC_state);
         return ret; /* return produced regop */
     }
@@ -11595,6 +2940,7 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I32 paren, I32 *flagp, U32 depth)
     regnode_offset br;
     regnode_offset lastbr;
     regnode_offset ender = 0;
+    I32 logical_parno = 0;
     I32 parno = 0;
     I32 flags;
     U32 oregflags = RExC_flags;
@@ -11605,6 +2951,7 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I32 paren, I32 *flagp, U32 depth)
     I32 num; /* numeric backreferences */
     SV * max_open;  /* Max number of unclosed parens */
     I32 was_in_lookaround = RExC_in_lookaround;
+    I32 fake_eval = 0; /* matches paren */
 
     /* The difference between the following variables can be seen with  *
      * the broken pattern /(?:foo/ where segment_parse_start will point *
@@ -11661,6 +3008,11 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I32 paren, I32 *flagp, U32 depth)
             goto parse_rest;
         }
         else if ( *RExC_parse == '*') { /* (*VERB:ARG), (*construct:...) */
+            if (RExC_parse[1] == '{') { /* (*{ ... }) optimistic EVAL */
+                fake_eval = '{';
+                goto handle_qmark;
+            }
+
             char *start_verb = RExC_parse + 1;
             STRLEN verb_len;
             char *start_arg = NULL;
@@ -11902,7 +3254,7 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I32 paren, I32 *flagp, U32 depth)
                          * See also: S_reg_la_OPFAIL() */
 
                         /* Note: OPFAIL is *not* zerolen. */
-                        ret = reganode(pRExC_state, OPFAIL, 0);
+                        ret = reg1node(pRExC_state, OPFAIL, 0);
                         nextchar(pRExC_state);
                         return ret;
                     }
@@ -11951,27 +3303,29 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I32 paren, I32 *flagp, U32 depth)
                     (int) verb_len, start_verb);
             }
             if (internal_argval == -1) {
-                ret = reganode(pRExC_state, op, 0);
+                ret = reg1node(pRExC_state, op, 0);
             } else {
-                ret = reg2Lanode(pRExC_state, op, 0, internal_argval);
+                ret = reg2node(pRExC_state, op, 0, internal_argval);
             }
             RExC_seen |= REG_VERBARG_SEEN;
             if (start_arg) {
                 SV *sv = newSVpvn( start_arg, RExC_parse - start_arg);
-                ARG(REGNODE_p(ret)) = add_data( pRExC_state,
+                ARG1u(REGNODE_p(ret)) = reg_add_data( pRExC_state,
                                         STR_WITH_LEN("S"));
-                RExC_rxi->data->data[ARG(REGNODE_p(ret))]=(void*)sv;
+                RExC_rxi->data->data[ARG1u(REGNODE_p(ret))]=(void*)sv;
                 FLAGS(REGNODE_p(ret)) = 1;
             } else {
                 FLAGS(REGNODE_p(ret)) = 0;
             }
             if ( internal_argval != -1 )
-                ARG2L_SET(REGNODE_p(ret), internal_argval);
+                ARG2i_SET(REGNODE_p(ret), internal_argval);
             nextchar(pRExC_state);
             return ret;
         }
         else if (*RExC_parse == '?') { /* (?...) */
-            bool is_logical = 0;
+          handle_qmark:
+            ; /* make sure the label has a statement associated with it*/
+            bool is_logical = 0, is_optimistic = 0;
             const char * const seqstart = RExC_parse;
             const char * endptr;
             const char non_existent_group_msg[]
@@ -11984,8 +3338,14 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I32 paren, I32 *flagp, U32 depth)
             }
 
             RExC_parse_inc_by(1);   /* past the '?' */
-            paren = *RExC_parse;    /* might be a trailing NUL, if not
-                                       well-formed */
+            if (!fake_eval) {
+                paren = *RExC_parse;    /* might be a trailing NUL, if not
+                                           well-formed */
+                is_optimistic = 0;
+            } else {
+                is_optimistic = 1;
+                paren = fake_eval;
+            }
             RExC_parse_inc();
             if (RExC_parse > RExC_end) {
                 paren = '\0';
@@ -12104,14 +3464,15 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I32 paren, I32 *flagp, U32 depth)
                             SvIV_set(sv_dat, 1);
                         }
 #ifdef DEBUGGING
-                        /* Yes this does cause a memory leak in debugging Perls
-                         * */
+                        /* No, this does not cause a memory leak under
+                         * debugging. RExC_paren_name_list is freed later
+                         * on in the dump process. - Yves
+                         */
                         if (!av_store(RExC_paren_name_list,
                                       RExC_npar, SvREFCNT_inc_NN(svname)))
                             SvREFCNT_dec_NN(svname);
 #endif
 
-                        /*sv_dump(sv_dat);*/
                     }
                     nextchar(pRExC_state);
                     paren = 1;
@@ -12130,7 +3491,7 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I32 paren, I32 *flagp, U32 depth)
                 /* branch reset, behave like a (?:...) except that
                    buffers in alternations share the same numbers */
                 paren = ':';
-                after_freeze = freeze_paren = RExC_npar;
+                after_freeze = freeze_paren = RExC_logical_npar;
 
                 /* XXX This construct currently requires an extra pass.
                  * Investigation would be required to see if that could be
@@ -12219,7 +3580,6 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I32 paren, I32 *flagp, U32 depth)
                 if (*RExC_parse!=')')
                     vFAIL("Expecting close bracket");
 
-              gen_recurse_regop:
                 if (paren == '-' || paren == '+') {
 
                     /* Don't overflow */
@@ -12256,7 +3616,26 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I32 paren, I32 *flagp, U32 depth)
                         vFAIL(non_existent_group_msg);
                     }
                 }
+                else
+                if (num && num < RExC_logical_npar) {
+                    num = RExC_logical_to_parno[num];
+                }
+                else
+                if (ALL_PARENS_COUNTED) {
+                    if (num < RExC_logical_total_parens) {
+                        num = RExC_logical_to_parno[num];
+                    }
+                    else {
+                        RExC_parse_inc_by(1);
+                        vFAIL(non_existent_group_msg);
+                    }
+                }
+                else {
+                    REQUIRE_PARENS_PASS;
+                }
 
+
+              gen_recurse_regop:
                 if (num >= RExC_npar) {
 
                     /* It might be a forward reference; we can't fail until we
@@ -12274,20 +3653,20 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I32 paren, I32 *flagp, U32 depth)
                 }
 
                 /* We keep track how many GOSUB items we have produced.
-                   To start off the ARG2L() of the GOSUB holds its "id",
+                   To start off the ARG2i() of the GOSUB holds its "id",
                    which is used later in conjunction with RExC_recurse
                    to calculate the offset we need to jump for the GOSUB,
                    which it will store in the final representation.
                    We have to defer the actual calculation until much later
                    as the regop may move.
                  */
-                ret = reg2Lanode(pRExC_state, GOSUB, num, RExC_recurse_count);
+                ret = reg2node(pRExC_state, GOSUB, num, RExC_recurse_count);
                 RExC_recurse_count++;
                 DEBUG_OPTIMISE_MORE_r(Perl_re_printf( aTHX_
                     "%*s%*s Recurse #%" UVuf " to %" IVdf "\n",
                             22, "|    |", (int)(depth * 2 + 1), "",
-                            (UV)ARG(REGNODE_p(ret)),
-                            (IV)ARG2L(REGNODE_p(ret))));
+                            (UV)ARG1u(REGNODE_p(ret)),
+                            (IV)ARG2i(REGNODE_p(ret))));
                 RExC_seen |= REG_RECURSE_SEEN;
 
                 *flagp |= POSTPONED;
@@ -12335,37 +3714,42 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I32 paren, I32 *flagp, U32 depth)
                 RExC_parse_set(RExC_start + cb->end);
                 o = cb->block;
                 if (cb->src_regex) {
-                    n = add_data(pRExC_state, STR_WITH_LEN("rl"));
+                    n = reg_add_data(pRExC_state, STR_WITH_LEN("rl"));
                     RExC_rxi->data->data[n] =
                         (void*)SvREFCNT_inc((SV*)cb->src_regex);
                     RExC_rxi->data->data[n+1] = (void*)o;
                 }
                 else {
-                    n = add_data(pRExC_state,
+                    n = reg_add_data(pRExC_state,
                             (RExC_pm_flags & PMf_HAS_CV) ? "L" : "l", 1);
                     RExC_rxi->data->data[n] = (void*)o;
                 }
                 pRExC_state->code_index++;
                 nextchar(pRExC_state);
+                if (!is_optimistic)
+                    RExC_seen |= REG_PESSIMIZE_SEEN;
 
                 if (is_logical) {
                     regnode_offset eval;
                     ret = reg_node(pRExC_state, LOGICAL);
+                    FLAGS(REGNODE_p(ret)) = 2;
 
-                    eval = reg2Lanode(pRExC_state, EVAL,
+                    eval = reg2node(pRExC_state, EVAL,
                                        n,
 
                                        /* for later propagation into (??{})
                                         * return value */
                                        RExC_flags & RXf_PMf_COMPILETIME
                                       );
-                    FLAGS(REGNODE_p(ret)) = 2;
+                    FLAGS(REGNODE_p(eval)) = is_optimistic * EVAL_OPTIMISTIC_FLAG;
                     if (! REGTAIL(pRExC_state, ret, eval)) {
                         REQUIRE_BRANCHJ(flagp, 0);
                     }
                     return ret;
                 }
-                ret = reg2Lanode(pRExC_state, EVAL, n, 0);
+                ret = reg2node(pRExC_state, EVAL, n, 0);
+                FLAGS(REGNODE_p(ret)) = is_optimistic * EVAL_OPTIMISTIC_FLAG;
+
                 return ret;
             }
             case '(':           /* (?(?{...})...) and (?(?=...)...) */
@@ -12379,7 +3763,8 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I32 paren, I32 *flagp, U32 depth)
                                 || RExC_parse[1] == '<'
                                 || RExC_parse[1] == '{'))
                         || (       RExC_parse[0] == '*'        /* (?(*...)) */
-                            && (   memBEGINs(RExC_parse + 1,
+                            && (   RExC_parse[1] == '{'
+                            || (   memBEGINs(RExC_parse + 1,
                                          (Size_t) (RExC_end - (RExC_parse + 1)),
                                          "pla:")
                                 || memBEGINs(RExC_parse + 1,
@@ -12402,7 +3787,7 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I32 paren, I32 *flagp, U32 depth)
                                          "negative_lookahead:")
                                 || memBEGINs(RExC_parse + 1,
                                          (Size_t) (RExC_end - (RExC_parse + 1)),
-                                         "negative_lookbehind:"))))
+                                         "negative_lookbehind:")))))
                 ) { /* Lookahead or eval. */
                     I32 flag;
                     regnode_offset tail;
@@ -12434,18 +3819,18 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I32 paren, I32 *flagp, U32 depth)
                     }
                     RExC_parse_inc_by(1);
                     if (sv_dat) {
-                        num = add_data( pRExC_state, STR_WITH_LEN("S"));
+                        num = reg_add_data( pRExC_state, STR_WITH_LEN("S"));
                         RExC_rxi->data->data[num]=(void*)sv_dat;
                         SvREFCNT_inc_simple_void_NN(sv_dat);
                     }
-                    ret = reganode(pRExC_state, GROUPPN, num);
+                    ret = reg1node(pRExC_state, GROUPPN, num);
                     goto insert_if_check_paren;
                 }
                 else if (memBEGINs(RExC_parse,
                                    (STRLEN) (RExC_end - RExC_parse),
                                    "DEFINE"))
                 {
-                    ret = reganode(pRExC_state, DEFINEP, 0);
+                    ret = reg1node(pRExC_state, DEFINEP, 0);
                     RExC_parse_inc_by(DEFINE_len);
                     is_define = 1;
                     goto insert_if_check_paren;
@@ -12479,7 +3864,7 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I32 paren, I32 *flagp, U32 depth)
                         if (sv_dat)
                             parno = 1 + *((I32 *)SvPVX(sv_dat));
                     }
-                    ret = reganode(pRExC_state, INSUBP, parno);
+                    ret = reg1node(pRExC_state, INSUBP, parno);
                     goto insert_if_check_paren;
                 }
                 else if (inRANGE(RExC_parse[0], '1', '9')) {
@@ -12496,7 +3881,7 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I32 paren, I32 *flagp, U32 depth)
                     else {
                         vFAIL("panic: grok_atoUV returned FALSE");
                     }
-                    ret = reganode(pRExC_state, GROUPP, parno);
+                    ret = reg1node(pRExC_state, GROUPP, parno);
 
                  insert_if_check_paren:
                     if (UCHARAT(RExC_parse) != ')') {
@@ -12505,7 +3890,7 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I32 paren, I32 *flagp, U32 depth)
                     }
                     nextchar(pRExC_state);
                   insert_if:
-                    if (! REGTAIL(pRExC_state, ret, reganode(pRExC_state,
+                    if (! REGTAIL(pRExC_state, ret, reg1node(pRExC_state,
                                                              IFTHEN, 0)))
                     {
                         REQUIRE_BRANCHJ(flagp, 0);
@@ -12516,7 +3901,7 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I32 paren, I32 *flagp, U32 depth)
                         FAIL2("panic: regbranch returned failure, flags=%#" UVxf,
                               (UV) flags);
                     } else
-                    if (! REGTAIL(pRExC_state, br, reganode(pRExC_state,
+                    if (! REGTAIL(pRExC_state, br, reg1node(pRExC_state,
                                                              LONGJMP, 0)))
                     {
                         REQUIRE_BRANCHJ(flagp, 0);
@@ -12530,7 +3915,7 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I32 paren, I32 *flagp, U32 depth)
                             vFAIL("(?(DEFINE)....) does not allow branches");
 
                         /* Fake one for optimizer.  */
-                        lastbr = reganode(pRExC_state, IFTHEN, 0);
+                        lastbr = reg1node(pRExC_state, IFTHEN, 0);
 
                         if (!regbranch(pRExC_state, &flags, 1, depth+1)) {
                             RETURN_FAIL_ON_RESTART(flags, flagp);
@@ -12563,8 +3948,7 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I32 paren, I32 *flagp, U32 depth)
                         }
                         if (! REGTAIL(pRExC_state,
                                       REGNODE_OFFSET(
-                                                 NEXTOPER(
-                                                 NEXTOPER(REGNODE_p(lastbr)))),
+                                        REGNODE_AFTER(REGNODE_p(lastbr))),
                                       ender))
                         {
                             REQUIRE_BRANCHJ(flagp, 0);
@@ -12618,6 +4002,11 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I32 paren, I32 *flagp, U32 depth)
           capturing_parens:
             parno = RExC_npar;
             RExC_npar++;
+            if (RExC_npar >= U16_MAX)
+                FAIL2("Too many capture groups (limit is %" UVuf ")", (UV)RExC_npar);
+
+            logical_parno = RExC_logical_npar;
+            RExC_logical_npar++;
             if (! ALL_PARENS_COUNTED) {
                 /* If we are in our first pass through (and maybe only pass),
                  * we  need to allocate memory for the capturing parentheses
@@ -12641,9 +4030,12 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I32 paren, I32 *flagp, U32 depth)
                      * */
                     Newxz(RExC_close_parens, RExC_parens_buf_size,
                             regnode_offset);
-                    /* we dont know where end op starts yet, so we dont need to
+                    /* we don't know where end op starts yet, so we don't need to
                      * set RExC_close_parens[0] like we do RExC_open_parens[0]
                      * above */
+
+                    Newxz(RExC_logical_to_parno, RExC_parens_buf_size, I32);
+                    Newxz(RExC_parno_to_logical, RExC_parens_buf_size, I32);
                 }
                 else if (RExC_npar > RExC_parens_buf_size) {
                     I32 old_size = RExC_parens_buf_size;
@@ -12659,10 +4051,18 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I32 paren, I32 *flagp, U32 depth)
                             regnode_offset);
                     Zero(RExC_close_parens + old_size,
                             RExC_parens_buf_size - old_size, regnode_offset);
+
+                    Renew(RExC_logical_to_parno, RExC_parens_buf_size, I32);
+                    Zero(RExC_logical_to_parno + old_size,
+                         RExC_parens_buf_size - old_size, I32);
+
+                    Renew(RExC_parno_to_logical, RExC_parens_buf_size, I32);
+                    Zero(RExC_parno_to_logical + old_size,
+                         RExC_parens_buf_size - old_size, I32);
                 }
             }
 
-            ret = reganode(pRExC_state, OPEN, parno);
+            ret = reg1node(pRExC_state, OPEN, parno);
             if (!RExC_nestroot)
                 RExC_nestroot = parno;
             if (RExC_open_parens && !RExC_open_parens[parno])
@@ -12673,7 +4073,11 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I32 paren, I32 *flagp, U32 depth)
                     (IV)parno, ret));
                 RExC_open_parens[parno]= ret;
             }
-
+            if (RExC_parno_to_logical) {
+                RExC_parno_to_logical[parno] = logical_parno;
+                if (RExC_logical_to_parno && !RExC_logical_to_parno[logical_parno])
+                    RExC_logical_to_parno[logical_parno] = parno;
+            }
             is_open = 1;
         } else {
             /* with RXf_PMf_NOCAPTURE treat (...) as (?:...) */
@@ -12687,6 +4091,7 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I32 paren, I32 *flagp, U32 depth)
    parse_rest:
     /* Pick up the branches, linking them together. */
     segment_parse_start = RExC_parse;
+    I32 npar_before_regbranch = RExC_npar - 1;
     br = regbranch(pRExC_state, &flags, 1, depth+1);
 
     /*     branch_len = (paren != 0); */
@@ -12698,9 +4103,13 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I32 paren, I32 *flagp, U32 depth)
     if (*RExC_parse == '|') {
         if (RExC_use_BRANCHJ) {
             reginsert(pRExC_state, BRANCHJ, br, depth+1);
+            ARG2a_SET(REGNODE_p(br), npar_before_regbranch);
+            ARG2b_SET(REGNODE_p(br), (U16)RExC_npar - 1);
         }
         else {
             reginsert(pRExC_state, BRANCH, br, depth+1);
+            ARG1a_SET(REGNODE_p(br), (U16)npar_before_regbranch);
+            ARG1b_SET(REGNODE_p(br), (U16)RExC_npar - 1);
         }
         have_branch = 1;
     }
@@ -12720,19 +4129,19 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I32 paren, I32 *flagp, U32 depth)
         if (RExC_use_BRANCHJ) {
             bool shut_gcc_up;
 
-            ender = reganode(pRExC_state, LONGJMP, 0);
+            ender = reg1node(pRExC_state, LONGJMP, 0);
 
             /* Append to the previous. */
             shut_gcc_up = REGTAIL(pRExC_state,
-                         REGNODE_OFFSET(NEXTOPER(NEXTOPER(REGNODE_p(lastbr)))),
+                         REGNODE_OFFSET(REGNODE_AFTER(REGNODE_p(lastbr))),
                          ender);
             PERL_UNUSED_VAR(shut_gcc_up);
         }
         nextchar(pRExC_state);
         if (freeze_paren) {
-            if (RExC_npar > after_freeze)
-                after_freeze = RExC_npar;
-            RExC_npar = freeze_paren;
+            if (RExC_logical_npar > after_freeze)
+                after_freeze = RExC_logical_npar;
+            RExC_logical_npar = freeze_paren;
         }
         br = regbranch(pRExC_state, &flags, 0, depth+1);
 
@@ -12743,6 +4152,22 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I32 paren, I32 *flagp, U32 depth)
         if (!  REGTAIL(pRExC_state, lastbr, br)) {  /* BRANCH -> BRANCH. */
             REQUIRE_BRANCHJ(flagp, 0);
         }
+        assert(OP(REGNODE_p(br)) == BRANCH || OP(REGNODE_p(br))==BRANCHJ);
+        assert(OP(REGNODE_p(lastbr)) == BRANCH || OP(REGNODE_p(lastbr))==BRANCHJ);
+        if (OP(REGNODE_p(br)) == BRANCH) {
+            if (OP(REGNODE_p(lastbr)) == BRANCH)
+                ARG1b_SET(REGNODE_p(lastbr),ARG1a(REGNODE_p(br)));
+            else
+                ARG2b_SET(REGNODE_p(lastbr),ARG1a(REGNODE_p(br)));
+        }
+        else
+        if (OP(REGNODE_p(br)) == BRANCHJ) {
+            if (OP(REGNODE_p(lastbr)) == BRANCH)
+                ARG1b_SET(REGNODE_p(lastbr),ARG2a(REGNODE_p(br)));
+            else
+                ARG2b_SET(REGNODE_p(lastbr),ARG2a(REGNODE_p(br)));
+        }
+
         lastbr = br;
         *flagp |= flags & (HASWIDTH | POSTPONED);
     }
@@ -12756,7 +4181,7 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I32 paren, I32 *flagp, U32 depth)
             ender = reg_node(pRExC_state, TAIL);
             break;
         case 1: case 2:
-            ender = reganode(pRExC_state, CLOSE, parno);
+            ender = reg1node(pRExC_state, CLOSE, parno);
             if ( RExC_close_parens ) {
                 DEBUG_OPTIMISE_MORE_r(Perl_re_printf( aTHX_
                         "%*s%*s Setting close paren #%" IVdf " to %zu\n",
@@ -12816,6 +4241,14 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I32 paren, I32 *flagp, U32 depth)
                           (IV)(ender - lastbr)
             );
         });
+        if (OP(REGNODE_p(lastbr)) == BRANCH) {
+            ARG1b_SET(REGNODE_p(lastbr),(U16)RExC_npar-1);
+        }
+        else
+        if (OP(REGNODE_p(lastbr)) == BRANCHJ) {
+            ARG2b_SET(REGNODE_p(lastbr),(U16)RExC_npar-1);
+        }
+
         if (! REGTAIL(pRExC_state, lastbr, ender)) {
             REQUIRE_BRANCHJ(flagp, 0);
         }
@@ -12827,33 +4260,35 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I32 paren, I32 *flagp, U32 depth)
 
             /* Hook the tails of the branches to the closing node. */
             for (br = REGNODE_p(ret); br; br = regnext(br)) {
-                const U8 op = PL_regkind[OP(br)];
+                const U8 op = REGNODE_TYPE(OP(br));
+                regnode *nextoper = REGNODE_AFTER(br);
                 if (op == BRANCH) {
                     if (! REGTAIL_STUDY(pRExC_state,
-                                        REGNODE_OFFSET(NEXTOPER(br)),
+                                        REGNODE_OFFSET(nextoper),
                                         ender))
                     {
                         REQUIRE_BRANCHJ(flagp, 0);
                     }
-                    if ( OP(NEXTOPER(br)) != NOTHING
-                         || regnext(NEXTOPER(br)) != REGNODE_p(ender))
+                    if ( OP(nextoper) != NOTHING
+                         || regnext(nextoper) != REGNODE_p(ender))
                         is_nothing= 0;
                 }
                 else if (op == BRANCHJ) {
                     bool shut_gcc_up = REGTAIL_STUDY(pRExC_state,
-                                        REGNODE_OFFSET(NEXTOPER(NEXTOPER(br))),
+                                        REGNODE_OFFSET(nextoper),
                                         ender);
                     PERL_UNUSED_VAR(shut_gcc_up);
                     /* for now we always disable this optimisation * /
-                    if ( OP(NEXTOPER(NEXTOPER(br))) != NOTHING
-                         || regnext(NEXTOPER(NEXTOPER(br))) != REGNODE_p(ender))
+                    regnode *nopr= REGNODE_AFTER_type(br,tregnode_BRANCHJ);
+                    if ( OP(nopr) != NOTHING
+                         || regnext(nopr) != REGNODE_p(ender))
                     */
                         is_nothing= 0;
                 }
             }
             if (is_nothing) {
                 regnode * ret_as_regnode = REGNODE_p(ret);
-                br= PL_regkind[OP(ret_as_regnode)] != BRANCH
+                br= REGNODE_TYPE(OP(ret_as_regnode)) != BRANCH
                                ? regnext(ret_as_regnode)
                                : ret_as_regnode;
                 DEBUG_PARSE_r({
@@ -12873,7 +4308,7 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I32 paren, I32 *flagp, U32 depth)
                 OP(br)= NOTHING;
                 if (OP(REGNODE_p(ender)) == TAIL) {
                     NEXT_OFF(br)= 0;
-                    RExC_emit= REGNODE_OFFSET(br) + 1;
+                    RExC_emit= REGNODE_OFFSET(br) + NODE_STEP_REGNODE;
                 } else {
                     regnode *opt;
                     for ( opt= br + 1; opt < REGNODE_p(ender) ; opt++ )
@@ -12931,8 +4366,8 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I32 paren, I32 *flagp, U32 depth)
         NOT_REACHED; /* NOTREACHED */
     }
 
-    if (after_freeze > RExC_npar)
-        RExC_npar = after_freeze;
+    if (after_freeze > RExC_logical_npar)
+        RExC_logical_npar = after_freeze;
 
     RExC_in_lookaround = was_in_lookaround;
 
@@ -12957,6 +4392,7 @@ S_regbranch(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, I32 first, U32 depth)
     regnode_offset ret;
     regnode_offset chain = 0;
     regnode_offset latest;
+    regnode *branch_node = NULL;
     I32 flags = 0, c = 0;
     DECLARE_AND_GET_RE_DEBUG_FLAGS;
 
@@ -12967,10 +4403,14 @@ S_regbranch(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, I32 first, U32 depth)
     if (first)
         ret = 0;
     else {
-        if (RExC_use_BRANCHJ)
-            ret = reganode(pRExC_state, BRANCHJ, 0);
-        else {
-            ret = reg_node(pRExC_state, BRANCH);
+        if (RExC_use_BRANCHJ) {
+            ret = reg2node(pRExC_state, BRANCHJ, 0, 0);
+            branch_node = REGNODE_p(ret);
+            ARG2a_SET(branch_node, (U16)RExC_npar-1);
+        } else {
+            ret = reg1node(pRExC_state, BRANCH, 0);
+            branch_node = REGNODE_p(ret);
+            ARG1a_SET(branch_node, (U16)RExC_npar-1);
         }
     }
 
@@ -13010,9 +4450,8 @@ S_regbranch(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, I32 first, U32 depth)
             ret = chain;
     }
     if (c == 1) {
-        *flagp |= flags&SIMPLE;
+        *flagp |= flags & SIMPLE;
     }
-
     return ret;
 }
 
@@ -13205,6 +4644,7 @@ S_regpiece(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth)
     const char * const origparse = RExC_parse;
     I32 min;
     I32 max = REG_INFTY;
+    I32 npar_before = RExC_npar-1;
 
     /* Save the original in case we change the emitted regop to a FAIL. */
     const regnode_offset orig_emit = RExC_emit;
@@ -13220,6 +4660,7 @@ S_regpiece(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth)
         RETURN_FAIL_ON_RESTART_OR_FLAGS(flags, flagp, TRYAGAIN);
         FAIL2("panic: regatom returned failure, flags=%#" UVxf, (UV) flags);
     }
+    I32 npar_after = RExC_npar-1;
 
     op = *RExC_parse;
     switch (op) {
@@ -13275,7 +4716,7 @@ S_regpiece(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth)
                 reginsert(pRExC_state, OPFAIL, orig_emit, depth+1);
                 ckWARNreg(RExC_parse, "Quantifier {n,m} with n > m can't match");
                 NEXT_OFF(REGNODE_p(orig_emit)) =
-                                    regarglen[OPFAIL] + NODE_STEP_REGNODE;
+                                    REGNODE_ARG_LEN(OPFAIL) + NODE_STEP_REGNODE;
                 return ret;
             }
             else if (min == max && *RExC_parse == '?') {
@@ -13301,22 +4742,12 @@ S_regpiece(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth)
      * Check and possibly adjust a zero width operand */
     if (! (flags & (HASWIDTH|POSTPONED))) {
         if (max > REG_INFTY/3) {
-            if (origparse[0] == '\\' && origparse[1] == 'K') {
-                vFAIL2utf8f(
-                           "%" UTF8f " is forbidden - matches null string"
-                           " many times",
-                           UTF8fARG(UTF, (RExC_parse >= origparse
-                                         ? RExC_parse - origparse
-                                         : 0),
-                           origparse));
-            } else {
-                ckWARN2reg(RExC_parse,
-                           "%" UTF8f " matches null string many times",
-                           UTF8fARG(UTF, (RExC_parse >= origparse
-                                         ? RExC_parse - origparse
-                                         : 0),
-                           origparse));
-            }
+            ckWARN2reg(RExC_parse,
+                       "%" UTF8f " matches null string many times",
+                       UTF8fARG(UTF, (RExC_parse >= origparse
+                                     ? RExC_parse - origparse
+                                     : 0),
+                       origparse));
         }
 
         /* There's no point in trying to match something 0 length more than
@@ -13373,13 +4804,13 @@ S_regpiece(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth)
         if (RExC_use_BRANCHJ) {
             reginsert(pRExC_state, LONGJMP, ret, depth+1);
             reginsert(pRExC_state, NOTHING, ret, depth+1);
-            NEXT_OFF(REGNODE_p(ret)) = 3;        /* Go over LONGJMP. */
+            REGNODE_STEP_OVER(ret,tregnode_NOTHING,tregnode_LONGJMP);
         }
         reginsert(pRExC_state, CURLYX, ret, depth+1);
-
         if (RExC_use_BRANCHJ)
-            NEXT_OFF(REGNODE_p(ret)) = 3;   /* Go over NOTHING to
-                                               LONGJMP. */
+            /* Go over NOTHING to LONGJMP. */
+            REGNODE_STEP_OVER(ret,tregnode_CURLYX,tregnode_NOTHING);
+
         if (! REGTAIL(pRExC_state, ret, reg_node(pRExC_state,
                                                   NOTHING)))
         {
@@ -13392,8 +4823,19 @@ S_regpiece(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth)
     /* Finish up the CURLY/CURLYX case */
     FLAGS(REGNODE_p(ret)) = 0;
 
-    ARG1_SET(REGNODE_p(ret), (U16)min);
-    ARG2_SET(REGNODE_p(ret), (U16)max);
+    ARG1i_SET(REGNODE_p(ret), min);
+    ARG2i_SET(REGNODE_p(ret), max);
+
+    /* if we had a npar_after then we need to increment npar_before,
+     * we want to track the range of parens we need to reset each iteration
+     */
+    if (npar_after!=npar_before) {
+        ARG3a_SET(REGNODE_p(ret), (U16)npar_before+1);
+        ARG3b_SET(REGNODE_p(ret), (U16)npar_after);
+    } else {
+        ARG3a_SET(REGNODE_p(ret), 0);
+        ARG3b_SET(REGNODE_p(ret), 0);
+    }
 
   done_main_op:
 
@@ -13936,14 +5378,6 @@ S_backref_value(char *p, char *e)
     return I32_MAX;
 }
 
-#ifdef DEBUGGING
-#define REGNODE_GUTS(state,op,extra_size) \
-    regnode_guts_debug(state,op,extra_size)
-#else
-#define REGNODE_GUTS(state,op,extra_size) \
-    regnode_guts(state,extra_size)
-#endif
-
 
 /*
  - regatom - the lowest level
@@ -13981,7 +5415,7 @@ S_backref_value(char *p, char *e)
                 cases for each unambiguous special:
                     handle this special;
                     break;
-                cases for each ambigous special/literal:
+                cases for each ambiguous special/literal:
                     disambiguate;
                     if (special)  handle here
                     else goto defchar;
@@ -14515,6 +5949,21 @@ S_regatom(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth)
                         if (num < 1)
                             vFAIL("Reference to nonexistent or unclosed group");
                     }
+                    else
+                    if (num < RExC_logical_npar) {
+                        num = RExC_logical_to_parno[num];
+                    }
+                    else
+                    if (ALL_PARENS_COUNTED)  {
+                        if (num < RExC_logical_total_parens)
+                            num = RExC_logical_to_parno[num];
+                        else {
+                            num = -1;
+                        }
+                    }
+                    else{
+                        REQUIRE_PARENS_PASS;
+                    }
                 }
                 else {
                     num = S_backref_value(RExC_parse, RExC_end);
@@ -14528,7 +5977,7 @@ S_regatom(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth)
                     if (    /* any numeric escape < 10 is always a backref */
                            num > 9
                             /* any numeric escape < RExC_npar is a backref */
-                        && num >= RExC_npar
+                        && num >= RExC_logical_npar
                             /* cannot be an octal escape if it starts with [89]
                              * */
                         && ! inRANGE(*RExC_parse, '8', '9')
@@ -14540,6 +5989,19 @@ S_regatom(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth)
                         RExC_parse_set(atom_parse_start);
                         goto defchar;
                     }
+                    if (num < RExC_logical_npar) {
+                        num = RExC_logical_to_parno[num];
+                    }
+                    else
+                    if (ALL_PARENS_COUNTED) {
+                        if (num < RExC_logical_total_parens) {
+                            num = RExC_logical_to_parno[num];
+                        } else {
+                            num = -1;
+                        }
+                    } else {
+                        REQUIRE_PARENS_PASS;
+                    }
                 }
 
                 /* At this point RExC_parse points at a numeric escape like
@@ -14556,9 +6018,10 @@ S_regatom(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth)
                 else while (isDIGIT(*RExC_parse)) {
                     RExC_parse_inc_by(1);
                 }
+                if (num < 0)
+                    vFAIL("Reference to nonexistent group");
 
                 if (num >= (I32)RExC_npar) {
-
                     /* It might be a forward reference; we can't fail until we
                      * know, by completing the parse to get all the groups, and
                      * then reparsing */
@@ -14572,7 +6035,7 @@ S_regatom(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth)
                     }
                 }
                 RExC_sawback = 1;
-                ret = reganode(pRExC_state,
+                ret = reg2node(pRExC_state,
                                ((! FOLD)
                                  ? REF
                                  : (ASCII_FOLD_RESTRICTED)
@@ -14582,7 +6045,9 @@ S_regatom(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth)
                                      : (LOC)
                                        ? REFFL
                                        : REFF),
-                                num);
+                                num, RExC_nestroot);
+                if (RExC_nestroot && num >= RExC_nestroot)
+                    FLAGS(REGNODE_p(ret)) = VOLATILE_REF;
                 if (OP(REGNODE_p(ret)) == REFF) {
                     RExC_seen_d_op = TRUE;
                 }
@@ -14702,7 +6167,7 @@ S_regatom(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth)
              * change, it works */
             ret = REGNODE_GUTS(pRExC_state, node_type, current_string_nodes);
             FILL_NODE(ret, node_type);
-            RExC_emit++;
+            RExC_emit += NODE_STEP_REGNODE;
 
             s = STRING(REGNODE_p(ret));
 
@@ -15352,7 +6817,7 @@ S_regatom(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth)
              * eventually we'll have to artificially chunk the pattern into
              * multiple nodes. */
             if (! LOC && (node_type == EXACT || node_type == LEXACT)) {
-                Size_t overhead = 1 + regarglen[OP(REGNODE_p(ret))];
+                Size_t overhead = 1 + REGNODE_ARG_LEN(OP(REGNODE_p(ret)));
                 Size_t overhead_expansion = 0;
                 char temp[256];
                 Size_t max_nodes_for_string;
@@ -15371,7 +6836,7 @@ S_regatom(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth)
                  * to save the string in the EXACT case before growing, and
                  * then copy it afterwards to its new location */
                 if (node_type == EXACT) {
-                    overhead_expansion = regarglen[LEXACT] - regarglen[EXACT];
+                    overhead_expansion = REGNODE_ARG_LEN(LEXACT) - REGNODE_ARG_LEN(EXACT);
                     RExC_emit += overhead_expansion;
                     Copy(s0, temp, len, char);
                 }
@@ -15978,19 +7443,18 @@ S_regatom(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth)
 }
 
 
-STATIC void
-S_populate_ANYOF_from_invlist(pTHX_ regnode *node, SV** invlist_ptr)
+void
+Perl_populate_anyof_bitmap_from_invlist(pTHX_ regnode *node, SV** invlist_ptr)
 {
     /* Uses the inversion list '*invlist_ptr' to populate the ANYOF 'node'.  It
      * sets up the bitmap and any flags, removing those code points from the
      * inversion list, setting it to NULL should it become completely empty */
 
 
-    PERL_ARGS_ASSERT_POPULATE_ANYOF_FROM_INVLIST;
-    assert(PL_regkind[OP(node)] == ANYOF);
+    PERL_ARGS_ASSERT_POPULATE_ANYOF_BITMAP_FROM_INVLIST;
 
     /* There is no bitmap for this node type */
-    if (inRANGE(OP(node), ANYOFH, ANYOFRb)) {
+    if (REGNODE_TYPE(OP(node))  != ANYOF) {
         return;
     }
 
@@ -16008,10 +7472,6 @@ S_populate_ANYOF_from_invlist(pTHX_ regnode *node, SV** invlist_ptr)
             UV high;
             int i;
 
-            if (end == UV_MAX && start <= NUM_ANYOF_CODE_POINTS) {
-                ANYOF_FLAGS(node) |= ANYOF_MATCHES_ALL_ABOVE_BITMAP;
-            }
-
             /* Quit if are above what we should change */
             if (start >= NUM_ANYOF_CODE_POINTS) {
                 break;
@@ -16030,14 +7490,10 @@ S_populate_ANYOF_from_invlist(pTHX_ regnode *node, SV** invlist_ptr)
         invlist_iterfinish(*invlist_ptr);
 
         /* Done with loop; remove any code points that are in the bitmap from
-         * *invlist_ptr; similarly for code points above the bitmap if we have
-         * a flag to match all of them anyways */
+         * *invlist_ptr */
         if (change_invlist) {
             _invlist_subtract(*invlist_ptr, PL_InBitmap, invlist_ptr);
         }
-        if (ANYOF_FLAGS(node) & ANYOF_MATCHES_ALL_ABOVE_BITMAP) {
-            _invlist_intersection(*invlist_ptr, PL_InBitmap, invlist_ptr);
-        }
 
         /* If have completely emptied it, remove it completely */
         if (_invlist_len(*invlist_ptr) == 0) {
@@ -16070,7 +7526,7 @@ S_populate_ANYOF_from_invlist(pTHX_ regnode *node, SV** invlist_ptr)
         if (posix_warnings) {                                               \
             if (! RExC_warn_text ) RExC_warn_text =                         \
                                          (AV *) sv_2mortal((SV *) newAV()); \
-            av_push(RExC_warn_text, Perl_newSVpvf(aTHX_                     \
+            av_push_simple(RExC_warn_text, Perl_newSVpvf(aTHX_                     \
                                              WARNING_PREFIX                 \
                                              text                           \
                                              REPORT_LOCATION,               \
@@ -16955,7 +8411,7 @@ S_handle_regex_sets(pTHX_ RExC_state_t *pRExC_state, SV** return_invlist,
      * with pronouncing it called it Reverse Polish instead, but now that YOU
      * know how to pronounce it you can use the correct term, thus giving due
      * credit to the person who invented it, and impressing your geek friends.
-     * Wikipedia says that the pronounciation of "Ł" has been changing so that
+     * Wikipedia says that the pronunciation of "Ł" has been changing so that
      * it is now more like an English initial W (as in wonk) than an L.)
      *
      * This means that, for example, 'a | b & c' is stored on the stack as
@@ -17087,7 +8543,7 @@ redo_curchar:
                             * which isn't legal */
                         || RExC_emit != orig_emit
                                       + NODE_STEP_REGNODE
-                                      + regarglen[REGEX_SET])
+                                      + REGNODE_ARG_LEN(REGEX_SET))
                     {
                         vFAIL("Expecting interpolated extended charclass");
                     }
@@ -17120,7 +8576,7 @@ redo_curchar:
                 }
 
                 /* Stack the position of this undealt-with left paren */
-                av_push(fence_stack, newSViv(fence));
+                av_push_simple(fence_stack, newSViv(fence));
                 fence = top_index + 1;
                 break;
 
@@ -17262,8 +8718,8 @@ redo_curchar:
                     /* Place the operator before the operand */
 
                     SV* lhs = av_pop(stack);
-                    av_push(stack, newSVuv(curchar));
-                    av_push(stack, lhs);
+                    av_push_simple(stack, newSVuv(curchar));
+                    av_push_simple(stack, lhs);
                     break;
                 }
 
@@ -17304,9 +8760,8 @@ redo_curchar:
                      * */
                     lhs = av_pop(stack);
                     assert(IS_OPERAND(lhs));
-
-                    av_push(stack, newSVuv(curchar));
-                    av_push(stack, lhs);
+                    av_push_simple(stack, newSVuv(curchar));
+                    av_push_simple(stack, lhs);
                     break;
                 }
 
@@ -17367,7 +8822,7 @@ redo_curchar:
                  * stacked operation */
                 only_to_avoid_leaks = av_pop(stack);
                 SvREFCNT_dec(only_to_avoid_leaks);
-                av_push(stack, rhs);
+                av_push_simple(stack, rhs);
                 goto redo_curchar;
 
             case '!':   /* Highest priority, right associative */
@@ -17382,7 +8837,7 @@ redo_curchar:
                 }
                 else { /* Otherwise, since it's right associative, just push
                           onto the stack */
-                    av_push(stack, newSVuv(curchar));
+                    av_push_simple(stack, newSVuv(curchar));
                 }
                 break;
 
@@ -17443,7 +8898,7 @@ redo_curchar:
 
             /* Here there was nothing on the stack or the top element was
              * another operand.  Just add this new one */
-            av_push(stack, current);
+            av_push_simple(stack, current);
 
         } /* End of switch on next parse token */
 
@@ -17571,8 +9026,7 @@ redo_curchar:
             assert(OP(REGNODE_p(node)) == ANYOF);
 
             OP(REGNODE_p(node)) = ANYOFL;
-            ANYOF_FLAGS(REGNODE_p(node))
-                    |= ANYOFL_SHARED_UTF8_LOCALE_fold_HAS_MATCHES_nonfold_REQD;
+            ANYOF_FLAGS(REGNODE_p(node)) |= ANYOFL_UTF8_LOCALE_REQD;
         }
     }
 
@@ -17626,7 +9080,7 @@ S_dump_regex_sets_structures(pTHX_ RExC_state_t *pRExC_state,
     else {
         PerlIO_printf(Perl_debug_log, "Fence_stack: \n");
         for (i = fence_stack_top; i >= 0; i--) {
-            SV ** element_ptr = av_fetch(fence_stack, i, FALSE);
+            SV ** element_ptr = av_fetch_simple(fence_stack, i, FALSE);
             if (! element_ptr) {
             }
 
@@ -17641,8 +9095,8 @@ S_dump_regex_sets_structures(pTHX_ RExC_state_t *pRExC_state,
 #undef IS_OPERATOR
 #undef IS_OPERAND
 
-STATIC void
-S_add_above_Latin1_folds(pTHX_ RExC_state_t *pRExC_state, const U8 cp, SV** invlist)
+void
+Perl_add_above_Latin1_folds(pTHX_ RExC_state_t *pRExC_state, const U8 cp, SV** invlist)
 {
     /* This adds the Latin1/above-Latin1 folding rules.
      *
@@ -17775,7 +9229,6 @@ S_find_first_differing_byte_pos(const U8 * s1, const U8 * s2, const Size_t max)
     return s1 - start;
 }
 
-
 STATIC AV *
 S_add_multi_match(pTHX_ AV* multi_char_matches, SV* multi_string, const STRLEN cp_count)
 {
@@ -17810,15 +9263,15 @@ S_add_multi_match(pTHX_ AV* multi_char_matches, SV* multi_string, const STRLEN c
     }
 
     if (av_exists(multi_char_matches, cp_count)) {
-        this_array_ptr = (AV**) av_fetch(multi_char_matches, cp_count, FALSE);
+        this_array_ptr = (AV**) av_fetch_simple(multi_char_matches, cp_count, FALSE);
         this_array = *this_array_ptr;
     }
     else {
         this_array = newAV();
-        av_store(multi_char_matches, cp_count,
+        av_store_simple(multi_char_matches, cp_count,
                  (SV*) this_array);
     }
-    av_push(this_array, multi_string);
+    av_push_simple(this_array, multi_string);
 
     return multi_char_matches;
 }
@@ -17944,7 +9397,7 @@ S_regclass(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth,
 
     /* In a range, if one of the endpoints is non-character-set portable,
      * meaning that it hard-codes a code point that may mean a different
-     * charactger in ASCII vs. EBCDIC, as opposed to, say, a literal 'A' or a
+     * character in ASCII vs. EBCDIC, as opposed to, say, a literal 'A' or a
      * mnemonic '\t' which each mean the same character no matter which
      * character set the platform is on. */
     unsigned int non_portable_endpoint = 0;
@@ -18142,7 +9595,7 @@ S_regclass(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth,
                         TRUE /* checking only */);
         }
         else if (  strict && ! skip_white
-                 && (   _generic_isCC(value, _CC_VERTSPACE)
+                 && (   generic_isCC_(value, CC_VERTSPACE_)
                      || is_VERTWS_cp_high(value)))
         {
             vFAIL("Literal vertical space in [] is illegal except under /x");
@@ -18387,8 +9840,8 @@ S_regclass(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth,
                                 * points. */
                                 AV * this_string = (AV *) av_shift( strings);
                                 STRLEN cp_count = av_count(this_string);
-                                SV * final = newSV(cp_count * 4);
-                                SvPVCLEAR(final);
+                                SV * final = newSV(cp_count ? cp_count * 4 : 1);
+                                SvPVCLEAR_FRESH(final);
 
                                 /* Create another string of sequences of \x{...} */
                                 while (av_count(this_string) > 0) {
@@ -18438,14 +9891,14 @@ S_regclass(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth,
 
                         /* We don't know yet what this matches, so have to flag
                          * it */
-                        anyof_flags |= ANYOF_SHARED_d_UPPER_LATIN1_UTF8_STRING_MATCHES_non_d_RUNTIME_USER_PROP;
+                        anyof_flags |= ANYOF_HAS_EXTRA_RUNTIME_MATCHES;
                     }
                     else {
                         assert (prop_definition && is_invlist(prop_definition));
 
                         /* Here we do have the complete property definition
                          *
-                         * Temporary workaround for [perl #133136].  For this
+                         * Temporary workaround for [GH #16520].  For this
                          * precise input that is in the .t that is failing,
                          * load utf8.pm, which is what the test wants, so that
                          * that .t passes */
@@ -18638,7 +10091,7 @@ S_regclass(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth,
 
             if (LOC && namedclass < ANYOF_POSIXL_MAX
 #ifndef HAS_ISASCII
-                && classnum != _CC_ASCII
+                && classnum != CC_ASCII_
 #endif
             ) {
                 SV* scratch_list = NULL;
@@ -18708,13 +10161,13 @@ S_regclass(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth,
                         /* Here, should be \h, \H, \v, or \V.  None of /d, /i
                          * nor /l make a difference in what these match,
                          * therefore we just add what they match to cp_list. */
-                        if (classnum != _CC_VERTSPACE) {
+                        if (classnum != CC_VERTSPACE_) {
                             assert(   namedclass == ANYOF_HORIZWS
                                    || namedclass == ANYOF_NHORIZWS);
 
                             /* It turns out that \h is just a synonym for
                              * XPosixBlank */
-                            classnum = _CC_BLANK;
+                            classnum = CC_BLANK_;
                         }
 
                         _invlist_union_maybe_complement_2nd(
@@ -18727,9 +10180,9 @@ S_regclass(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth,
                     }
                 }
                 else if (   AT_LEAST_UNI_SEMANTICS
-                         || classnum == _CC_ASCII
-                         || (DEPENDS_SEMANTICS && (   classnum == _CC_DIGIT
-                                                   || classnum == _CC_XDIGIT)))
+                         || classnum == CC_ASCII_
+                         || (DEPENDS_SEMANTICS && (   classnum == CC_DIGIT_
+                                                   || classnum == CC_XDIGIT_)))
                 {
                     /* We usually have to worry about /d affecting what POSIX
                      * classes match, with special code needed because we won't
@@ -19007,7 +10460,7 @@ S_regclass(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth,
                              * are in the same series, which is the same range.
                              * */
                             index_start = _invlist_search(
-                                                    PL_XPosix_ptrs[_CC_DIGIT],
+                                                    PL_XPosix_ptrs[CC_DIGIT_],
                                                     prevvalue);
 
                             /* Warn if the range starts and ends with a digit,
@@ -19015,7 +10468,7 @@ S_regclass(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth,
                             if (   index_start >= 0
                                 && ELEMENT_RANGE_MATCHES_INVLIST(index_start)
                                 && (index_final =
-                                    _invlist_search(PL_XPosix_ptrs[_CC_DIGIT],
+                                    _invlist_search(PL_XPosix_ptrs[CC_DIGIT_],
                                                     value)) != index_start
                                 && index_final >= 0
                                 && ELEMENT_RANGE_MATCHES_INVLIST(index_final))
@@ -19143,7 +10596,7 @@ S_regclass(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth,
                 AV** this_array_ptr;
                 SV* this_sequence;
 
-                this_array_ptr = (AV**) av_fetch(multi_char_matches,
+                this_array_ptr = (AV**) av_fetch_simple(multi_char_matches,
                                                  cp_count, FALSE);
                 while ((this_sequence = av_pop(*this_array_ptr)) !=
                                                                 &PL_sv_undef)
@@ -19441,7 +10894,7 @@ S_regclass(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth,
                 _invlist_subtract(only_non_utf8_list, cp_list,
                                   &only_non_utf8_list);
                 if (_invlist_len(only_non_utf8_list) != 0) {
-                    anyof_flags |= ANYOF_SHARED_d_MATCHES_ALL_NON_UTF8_NON_ASCII_non_d_WARN_SUPER;
+                    anyof_flags |= ANYOFD_NON_UTF8_MATCHES_ALL_NON_ASCII__shared;
                 }
                 SvREFCNT_dec_NN(only_non_utf8_list);
             }
@@ -19526,8 +10979,7 @@ S_regclass(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth,
         }
 
         if (warn_super) {
-            anyof_flags
-             |= ANYOF_SHARED_d_MATCHES_ALL_NON_UTF8_NON_ASCII_non_d_WARN_SUPER;
+            anyof_flags |= ANYOF_WARN_SUPER__shared;
 
             /* Because an ANYOF node is the only one that warns, this node
              * can't be optimized into something else */
@@ -19563,24 +11015,34 @@ S_regclass(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth,
             }
         }
         if (    only_utf8_locale_list
-            || (cp_list && (   _invlist_contains_cp(cp_list, LATIN_CAPITAL_LETTER_I_WITH_DOT_ABOVE)
-                            || _invlist_contains_cp(cp_list, LATIN_SMALL_LETTER_DOTLESS_I))))
+            || (    cp_list
+                && (   _invlist_contains_cp(cp_list,
+                                        LATIN_CAPITAL_LETTER_I_WITH_DOT_ABOVE)
+                    || _invlist_contains_cp(cp_list,
+                                            LATIN_SMALL_LETTER_DOTLESS_I))))
         {
             has_runtime_dependency |= HAS_L_RUNTIME_DEPENDENCY;
-            anyof_flags
-                 |= ANYOFL_FOLD
-                 |  ANYOFL_SHARED_UTF8_LOCALE_fold_HAS_MATCHES_nonfold_REQD;
+            anyof_flags |= ANYOFL_FOLD|ANYOF_HAS_EXTRA_RUNTIME_MATCHES;
         }
         else if (cp_list && invlist_lowest(cp_list) < 256) {
             /* If nothing is below 256, has no locale dependency; otherwise it
              * does */
             anyof_flags |= ANYOFL_FOLD;
             has_runtime_dependency |= HAS_L_RUNTIME_DEPENDENCY;
+
+            /* In a Turkish locale these could match, notify the run-time code
+             * to check for that */
+            if (   _invlist_contains_cp(cp_list, 'I')
+                || _invlist_contains_cp(cp_list, 'i'))
+            {
+                anyof_flags |= ANYOFL_FOLD|ANYOF_HAS_EXTRA_RUNTIME_MATCHES;
+            }
         }
     }
     else if (   DEPENDS_SEMANTICS
              && (    upper_latin1_only_utf8_matches
-                 || (anyof_flags & ANYOF_SHARED_d_MATCHES_ALL_NON_UTF8_NON_ASCII_non_d_WARN_SUPER)))
+                 || (  anyof_flags
+                     & ANYOFD_NON_UTF8_MATCHES_ALL_NON_ASCII__shared)))
     {
         RExC_seen_d_op = TRUE;
         has_runtime_dependency |= HAS_D_RUNTIME_DEPENDENCY;
@@ -19655,9 +11117,9 @@ S_regclass(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth,
         }
     }
 
-    ret = REGNODE_GUTS(pRExC_state, op, regarglen[op]);
+    ret = REGNODE_GUTS(pRExC_state, op, REGNODE_ARG_LEN(op));
     FILL_NODE(ret, op);        /* We set the argument later */
-    RExC_emit += 1 + regarglen[op];
+    RExC_emit += NODE_STEP_REGNODE + REGNODE_ARG_LEN(op);
     ANYOF_FLAGS(REGNODE_p(ret)) = anyof_flags;
 
     /* Here, <cp_list> contains all the code points we can determine at
@@ -19666,7 +11128,7 @@ S_regclass(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth,
      * <cp_list>.  While we are at it, see if everything above 255 is in the
      * list, and if so, set a flag to speed up execution */
 
-    populate_ANYOF_from_invlist(REGNODE_p(ret), &cp_list);
+    populate_anyof_bitmap_from_invlist(REGNODE_p(ret), &cp_list);
 
     if (posixl) {
         ANYOF_POSIXL_SET_TO_BITMAP(REGNODE_p(ret), posixl);
@@ -19690,7 +11152,7 @@ S_regclass(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth,
         else {
             cp_list = upper_latin1_only_utf8_matches;
         }
-        ANYOF_FLAGS(REGNODE_p(ret)) |= ANYOF_SHARED_d_UPPER_LATIN1_UTF8_STRING_MATCHES_non_d_RUNTIME_USER_PROP;
+        ANYOF_FLAGS(REGNODE_p(ret)) |= ANYOF_HAS_EXTRA_RUNTIME_MATCHES;
     }
 
     set_ANYOF_arg(pRExC_state, REGNODE_p(ret), cp_list,
@@ -19787,10 +11249,7 @@ S_optimize_regclass(pTHX_
                 if (*invert) {
                     goto return_OPFAIL;
                 }
-                else {
-                    goto return_SANY;
-                }
-                return op;
+                goto return_SANY;
             }
         }
 
@@ -20009,7 +11468,7 @@ S_optimize_regclass(pTHX_
                     }
                     else {
 
-                        /* Here, the only possible fold lowest_cp particpates in
+                        /* Here, the only possible fold lowest_cp participates in
                          * is with start[1].  /i or not isn't relevant */
                         op = EXACTFU;
                     }
@@ -20194,7 +11653,7 @@ S_optimize_regclass(pTHX_
 
             *ret = REGNODE_GUTS(pRExC_state, op, len);
             FILL_NODE(*ret, op);
-            RExC_emit += 1 + STR_SZ(len);
+            RExC_emit += NODE_STEP_REGNODE + STR_SZ(len);
             setSTR_LEN(REGNODE_p(*ret), len);
             if (len == 1) {
                 *STRINGs(REGNODE_p(*ret)) = (U8) value;
@@ -20202,6 +11661,7 @@ S_optimize_regclass(pTHX_
             else {
                 uvchr_to_utf8((U8 *) STRINGs(REGNODE_p(*ret)), value);
             }
+
             return op;
         }
     }
@@ -20306,7 +11766,7 @@ S_optimize_regclass(pTHX_
                 ANYOFM_mask = ~ bits_differing; /* This goes into FLAGS */
 
                 /* The argument is the lowest code point */
-                *ret = reganode(pRExC_state, op, lowest_cp);
+                *ret = reg1node(pRExC_state, op, lowest_cp);
                 FLAGS(REGNODE_p(*ret)) = ANYOFM_mask;
             }
 
@@ -20348,7 +11808,7 @@ S_optimize_regclass(pTHX_
             }
 
             for (posix_class = 0;
-                 posix_class <= _HIGHEST_REGCOMP_DOT_H_SYNC;
+                 posix_class <= HIGHEST_REGCOMP_DOT_H_SYNC_;
                  posix_class++)
             {
                 SV** our_code_points = &cp_list;
@@ -20409,10 +11869,12 @@ S_optimize_regclass(pTHX_
                     }
                     else {  /* POSIXD, inverted.  If this doesn't have this
                                flag set, it isn't /d. */
-                        if (! (*anyof_flags & ANYOF_SHARED_d_MATCHES_ALL_NON_UTF8_NON_ASCII_non_d_WARN_SUPER))
+                        if (! ( *anyof_flags
+                               & ANYOFD_NON_UTF8_MATCHES_ALL_NON_ASCII__shared))
                         {
                             continue;
                         }
+
                         our_code_points = &cp_list;
                     }
 
@@ -20427,7 +11889,19 @@ S_optimize_regclass(pTHX_
                     {
                         /* Here, they precisely match.  Optimize this ANYOF
                          * node into its equivalent POSIX one of the correct
-                         * type, possibly inverted */
+                         * type, possibly inverted.
+                         *
+                         * Some of these nodes match a single range of
+                         * characters (or [:alpha:] matches two parallel ranges
+                         * on ASCII platforms).  The array lookup at execution
+                         * time could be replaced by a range check for such
+                         * nodes.  But regnodes are a finite resource, and the
+                         * possible performance boost isn't large, so this
+                         * hasn't been done.  An attempt to use just one node
+                         * (and its inverse) to encompass all such cases was
+                         * made in d62feba66bf43f35d092bb026694f927e9f94d38.
+                         * But the shifting/masking it used ended up being
+                         * slower than the array look up, so it was reverted */
                         op = (try_inverted)
                             ? type + NPOSIXA - POSIXA
                             : type;
@@ -20455,7 +11929,7 @@ S_optimize_regclass(pTHX_
         &&   *anyof_flags == 0
         &&   start[0] < (1 << ANYOFR_BASE_BITS)
         &&   end[0] - start[0]
-                < ((1U << (sizeof(((struct regnode_1 *)NULL)->arg1)
+                < ((1U << (sizeof(ARG1u_LOC(NULL))
                                * CHARBITS - ANYOFR_BASE_BITS))))
 
     {
@@ -20463,7 +11937,7 @@ S_optimize_regclass(pTHX_
         U8 high_utf8[UTF8_MAXBYTES+1];
 
         op = ANYOFR;
-        *ret = reganode(pRExC_state, op,
+        *ret = reg1node(pRExC_state, op,
                         (start[0] | (end[0] - start[0]) << ANYOFR_BASE_BITS));
 
         /* Place the lowest UTF-8 start byte in the flags field, so as to allow
@@ -20489,7 +11963,7 @@ S_optimize_regclass(pTHX_
     }
 
     /* If didn't find an optimization and there is no need for a bitmap,
-     * optimize to indicate that */
+     * of the lowest code points, optimize to indicate that */
     if (     lowest_cp >= NUM_ANYOF_CODE_POINTS
         && ! LOC
         && ! upper_latin1_only_utf8_matches
@@ -20529,25 +12003,58 @@ S_optimize_regclass(pTHX_
                 Size_t len = find_first_differing_byte_pos(low_utf8,
                                                            high_utf8,
                                                    MIN(low_len, high_len));
-
                 if (len == 1) {
 
                     /* No need to convert to I8 for EBCDIC as this is an exact
                      * match */
                     *anyof_flags = low_utf8[0];
-                    op = ANYOFHb;
+
+                    if (high_len == 2) {
+                        /* If the elements matched all have a 2-byte UTF-8
+                         * representation, with the first byte being the same,
+                         * we can use a compact, fast regnode. capable of
+                         * matching any combination of continuation byte
+                         * patterns.
+                         *
+                         * (A similar regnode could be created for the Latin1
+                         * range; the complication being that it could match
+                         * non-UTF8 targets.  The internal bitmap would serve
+                         * both cases; with some extra code in regexec.c) */
+                        op = ANYOFHbbm;
+                        *ret = REGNODE_GUTS(pRExC_state, op, REGNODE_ARG_LEN(op));
+                        FILL_NODE(*ret, op);
+                        FIRST_BYTE((struct regnode_bbm *) REGNODE_p(*ret)) = low_utf8[0],
+
+                        /* The 64 bit (or 32 on EBCCDIC) map can be looked up
+                         * directly based on the continuation byte, without
+                         * needing to convert to code point */
+                        populate_bitmap_from_invlist(
+                            cp_list,
+
+                            /* The base code point is from the start byte */
+                            TWO_BYTE_UTF8_TO_NATIVE(low_utf8[0],
+                                                    UTF_CONTINUATION_MARK | 0),
+
+                            ((struct regnode_bbm *) REGNODE_p(*ret))->bitmap,
+                            REGNODE_BBM_BITMAP_LEN);
+                        RExC_emit += NODE_STEP_REGNODE + REGNODE_ARG_LEN(op);
+                        return op;
+                    }
+                    else {
+                        op = ANYOFHb;
+                    }
                 }
                 else {
                     op = ANYOFHs;
                     *ret = REGNODE_GUTS(pRExC_state, op,
-                                       regarglen[op] + STR_SZ(len));
+                                       REGNODE_ARG_LEN(op) + STR_SZ(len));
                     FILL_NODE(*ret, op);
-                    ((struct regnode_anyofhs *) REGNODE_p(*ret))->str_len
+                    STR_LEN_U8((struct regnode_anyofhs *) REGNODE_p(*ret))
                                                                     = len;
                     Copy(low_utf8,  /* Add the common bytes */
                     ((struct regnode_anyofhs *) REGNODE_p(*ret))->string,
                        len, U8);
-                    RExC_emit += NODE_SZ_STR(REGNODE_p(*ret));
+                    RExC_emit = REGNODE_OFFSET(REGNODE_AFTER_varies(REGNODE_p(*ret)));
                     set_ANYOF_arg(pRExC_state, REGNODE_p(*ret), cp_list,
                                               NULL, only_utf8_locale_list);
                     return op;
@@ -20586,7 +12093,7 @@ S_optimize_regclass(pTHX_
 
   return_OPFAIL:
     op = OPFAIL;
-    *ret = reganode(pRExC_state, op, 0);
+    *ret = reg1node(pRExC_state, op, 0);
     return op;
 
   return_SANY:
@@ -20598,19 +12105,21 @@ S_optimize_regclass(pTHX_
 
 #undef HAS_NONLOCALE_RUNTIME_PROPERTY_DEFINITION
 
-STATIC void
-S_set_ANYOF_arg(pTHX_ RExC_state_t* const pRExC_state,
+void
+Perl_set_ANYOF_arg(pTHX_ RExC_state_t* const pRExC_state,
                 regnode* const node,
                 SV* const cp_list,
                 SV* const runtime_defns,
                 SV* const only_utf8_locale_list)
 {
     /* Sets the arg field of an ANYOF-type node 'node', using information about
-     * the node passed-in.  If there is nothing outside the node's bitmap, the
-     * arg is set to ANYOF_ONLY_HAS_BITMAP.  Otherwise, it sets the argument to
-     * the count returned by add_data(), having allocated and stored an array,
-     * av, as follows:
+     * the node passed-in.  If only the bitmap is needed to determine what
+     * matches, the arg is set appropriately to either
+     *      1) ANYOF_MATCHES_NONE_OUTSIDE_BITMAP_VALUE
+     *      2) ANYOF_MATCHES_ALL_OUTSIDE_BITMAP_VALUE
      *
+     * Otherwise, it sets the argument to the count returned by reg_add_data(),
+     * having allocated and stored an array, av, as follows:
      *  av[0] stores the inversion list defining this class as far as known at
      *        this time, or PL_sv_undef if nothing definite is now known.
      *  av[1] stores the inversion list of code points that match only if the
@@ -20623,52 +12132,152 @@ S_set_ANYOF_arg(pTHX_ RExC_state_t* const pRExC_state,
 
     PERL_ARGS_ASSERT_SET_ANYOF_ARG;
 
-    if (! cp_list && ! runtime_defns && ! only_utf8_locale_list) {
-        assert(! (ANYOF_FLAGS(node)
-                & ANYOF_SHARED_d_UPPER_LATIN1_UTF8_STRING_MATCHES_non_d_RUNTIME_USER_PROP));
-        ARG_SET(node, ANYOF_ONLY_HAS_BITMAP);
-    }
-    else {
-        AV * const av = newAV();
-        SV *rv;
+    /* If this is set, the final disposition won't be known until runtime, so
+     * we can't do any of the compile time optimizations */
+    if (! runtime_defns) {
 
-        if (cp_list) {
-            av_store(av, INVLIST_INDEX, SvREFCNT_inc_NN(cp_list));
-        }
+        /* On plain ANYOF nodes without the possibility of a runtime locale
+         * making a difference, maybe there's no information to be gleaned
+         * except for what's in the bitmap */
+        if (REGNODE_TYPE(OP(node)) == ANYOF && ! only_utf8_locale_list) {
 
-        /* (Note that if any of this changes, the size calculations in
-         * S_optimize_regclass() might need to be updated.) */
+            /* There are two such cases:
+             *  1)  there is no list of code points matched outside the bitmap
+             */
+            if (! cp_list) {
+                ARG1u_SET(node, ANYOF_MATCHES_NONE_OUTSIDE_BITMAP_VALUE);
+                return;
+            }
 
-        if (only_utf8_locale_list) {
-            av_store(av, ONLY_LOCALE_MATCHES_INDEX,
-                                     SvREFCNT_inc_NN(only_utf8_locale_list));
-        }
+            /*  2)  the list indicates everything outside the bitmap matches */
+            if (   invlist_highest(cp_list) == UV_MAX
+                && invlist_highest_range_start(cp_list)
+                                                       <= NUM_ANYOF_CODE_POINTS)
+            {
+                ARG1u_SET(node, ANYOF_MATCHES_ALL_OUTSIDE_BITMAP_VALUE);
+                return;
+            }
 
-        if (runtime_defns) {
-            av_store(av, DEFERRED_USER_DEFINED_INDEX,
-                         SvREFCNT_inc_NN(runtime_defns));
+            /* In all other cases there are things outside the bitmap that we
+             * may need to check at runtime. */
         }
 
-        rv = newRV_noinc(MUTABLE_SV(av));
-        n = add_data(pRExC_state, STR_WITH_LEN("s"));
-        RExC_rxi->data->data[n] = (void*)rv;
-        ARG_SET(node, n);
+        /* Here, we have resolved all the possible run-time matches, and they
+         * are stored in one or both of two possible lists.  (While some match
+         * only under certain runtime circumstances, we know all the possible
+         * ones for each such circumstance.)
+         *
+         * It may very well be that the pattern being compiled contains an
+         * identical class, already encountered.  Reusing that class here saves
+         * space.  Look through all classes so far encountered. */
+        U32 existing_items = RExC_rxi->data ? RExC_rxi->data->count : 0;
+        for (unsigned int i = 0; i < existing_items; i++) {
+
+            /* Only look at auxiliary data of this type */
+            if (RExC_rxi->data->what[i] != 's') {
+                continue;
+            }
+
+            SV * const rv = MUTABLE_SV(RExC_rxi->data->data[i]);
+            AV * const av = MUTABLE_AV(SvRV(rv));
+
+            /* If the already encountered class has data that won't be known
+             * until runtime (stored in the final element of the array), we
+             * can't share */
+            if (av_top_index(av) > ONLY_LOCALE_MATCHES_INDEX) {
+                continue;
+            }
+
+            SV ** stored_cp_list_ptr = av_fetch(av, INVLIST_INDEX,
+                                                false /* no lvalue */);
+
+            /* The new and the existing one both have to have or both not
+             * have this element, for this one to duplicate that one */
+            if (cBOOL(cp_list) != cBOOL(stored_cp_list_ptr)) {
+                continue;
+            }
+
+            /* If the inversion lists aren't equivalent, can't share */
+            if (cp_list && ! _invlistEQ(cp_list,
+                                        *stored_cp_list_ptr,
+                                        FALSE /* don't complement */))
+            {
+                continue;
+            }
+
+            /* Similarly for the other list */
+            SV ** stored_only_utf8_locale_list_ptr = av_fetch(
+                                                av,
+                                                ONLY_LOCALE_MATCHES_INDEX,
+                                                false /* no lvalue */);
+            if (   cBOOL(only_utf8_locale_list)
+                != cBOOL(stored_only_utf8_locale_list_ptr))
+            {
+                continue;
+            }
+
+            if (only_utf8_locale_list && ! _invlistEQ(
+                                         only_utf8_locale_list,
+                                         *stored_only_utf8_locale_list_ptr,
+                                         FALSE /* don't complement */))
+            {
+                continue;
+            }
+
+            /* Here, the existence and contents of both compile-time lists
+             * are identical between the new and existing data.  Re-use the
+             * existing one */
+            ARG1u_SET(node, i);
+            return;
+        } /* end of loop through existing classes */
+    }
+
+    /* Here, we need to create a new auxiliary data element; either because
+     * this doesn't duplicate an existing one, or we can't tell at this time if
+     * it eventually will */
+
+    AV * const av = newAV();
+    SV *rv;
+
+    if (cp_list) {
+        av_store_simple(av, INVLIST_INDEX, SvREFCNT_inc_NN(cp_list));
+    }
+
+    /* (Note that if any of this changes, the size calculations in
+     * S_optimize_regclass() might need to be updated.) */
+
+    if (only_utf8_locale_list) {
+        av_store_simple(av, ONLY_LOCALE_MATCHES_INDEX,
+                                       SvREFCNT_inc_NN(only_utf8_locale_list));
+    }
+
+    if (runtime_defns) {
+        av_store_simple(av, DEFERRED_USER_DEFINED_INDEX,
+                     SvREFCNT_inc_NN(runtime_defns));
     }
+
+    rv = newRV_noinc(MUTABLE_SV(av));
+    n = reg_add_data(pRExC_state, STR_WITH_LEN("s"));
+    RExC_rxi->data->data[n] = (void*)rv;
+    ARG1u_SET(node, n);
 }
 
 SV *
 
 #if !defined(PERL_IN_XSUB_RE) || defined(PLUGGABLE_RE_EXTENSION)
-Perl_get_regclass_nonbitmap_data(pTHX_ const regexp *prog, const regnode* node, bool doinit, SV** listsvp, SV** only_utf8_locale_ptr, SV** output_invlist)
+Perl_get_regclass_aux_data(pTHX_ const regexp *prog, const regnode* node, bool doinit, SV** listsvp, SV** only_utf8_locale_ptr, SV** output_invlist)
 #else
-Perl_get_re_gclass_nonbitmap_data(pTHX_ const regexp *prog, const regnode* node, bool doinit, SV** listsvp, SV** only_utf8_locale_ptr, SV** output_invlist)
+Perl_get_re_gclass_aux_data(pTHX_ const regexp *prog, const regnode* node, bool doinit, SV** listsvp, SV** only_utf8_locale_ptr, SV** output_invlist)
 #endif
 
 {
     /* For internal core use only.
      * Returns the inversion list for the input 'node' in the regex 'prog'.
      * If <doinit> is 'true', will attempt to create the inversion list if not
-     *    already done.
+     *    already done.  If it is created, it will add to the normal inversion
+     *    list any that comes from user-defined properties.  It croaks if this
+     *    is called before such a list is ready to be generated, that is when a
+     *    user-defined property has been declared, buyt still not yet defined.
      * If <listsvp> is non-null, will return the printable contents of the
      *    property definition.  This can be used to get debugging information
      *    even before the inversion list exists, by calling this function with
@@ -20695,18 +12304,18 @@ Perl_get_re_gclass_nonbitmap_data(pTHX_ const regexp *prog, const regnode* node,
     SV *si  = NULL;         /* Input initialization string */
     SV* invlist = NULL;
 
-    RXi_GET_DECL(prog, progi);
+    RXi_GET_DECL_NULL(prog, progi);
     const struct reg_data * const data = prog ? progi->data : NULL;
 
 #if !defined(PERL_IN_XSUB_RE) || defined(PLUGGABLE_RE_EXTENSION)
-    PERL_ARGS_ASSERT_GET_REGCLASS_NONBITMAP_DATA;
+    PERL_ARGS_ASSERT_GET_REGCLASS_AUX_DATA;
 #else
-    PERL_ARGS_ASSERT_GET_RE_GCLASS_NONBITMAP_DATA;
+    PERL_ARGS_ASSERT_GET_RE_GCLASS_AUX_DATA;
 #endif
     assert(! output_invlist || listsvp);
 
     if (data && data->count) {
-        const U32 n = ARG(node);
+        const U32 n = ARG1u(node);
 
         if (data->what[n] == 's') {
             SV * const rv = MUTABLE_SV(data->data[n]);
@@ -21072,7 +12681,7 @@ S_regnode_guts(pTHX_ RExC_state_t *pRExC_state, const STRLEN extra_size)
 STATIC regnode_offset
 S_regnode_guts_debug(pTHX_ RExC_state_t *pRExC_state, const U8 op, const STRLEN extra_size) {
     PERL_ARGS_ASSERT_REGNODE_GUTS_DEBUG;
-    assert(extra_size >= regarglen[op] || PL_regkind[op] == ANYOF);
+    assert(extra_size >= REGNODE_ARG_LEN(op) || REGNODE_TYPE(op) == ANYOF);
     return S_regnode_guts(aTHX_ pRExC_state, extra_size);
 }
 
@@ -21086,12 +12695,12 @@ S_regnode_guts_debug(pTHX_ RExC_state_t *pRExC_state, const U8 op, const STRLEN
 STATIC regnode_offset /* Location. */
 S_reg_node(pTHX_ RExC_state_t *pRExC_state, U8 op)
 {
-    const regnode_offset ret = REGNODE_GUTS(pRExC_state, op, regarglen[op]);
+    const regnode_offset ret = REGNODE_GUTS(pRExC_state, op, REGNODE_ARG_LEN(op));
     regnode_offset ptr = ret;
 
     PERL_ARGS_ASSERT_REG_NODE;
 
-    assert(regarglen[op] == 0);
+    assert(REGNODE_ARG_LEN(op) == 0);
 
     FILL_ADVANCE_NODE(ptr, op);
     RExC_emit = ptr;
@@ -21099,20 +12708,20 @@ S_reg_node(pTHX_ RExC_state_t *pRExC_state, U8 op)
 }
 
 /*
-- reganode - emit a node with an argument
+- reg1node - emit a node with an argument
 */
 STATIC regnode_offset /* Location. */
-S_reganode(pTHX_ RExC_state_t *pRExC_state, U8 op, U32 arg)
+S_reg1node(pTHX_ RExC_state_t *pRExC_state, U8 op, U32 arg)
 {
-    const regnode_offset ret = REGNODE_GUTS(pRExC_state, op, regarglen[op]);
+    const regnode_offset ret = REGNODE_GUTS(pRExC_state, op, REGNODE_ARG_LEN(op));
     regnode_offset ptr = ret;
 
-    PERL_ARGS_ASSERT_REGANODE;
+    PERL_ARGS_ASSERT_REG1NODE;
 
     /* ANYOF are special cased to allow non-length 1 args */
-    assert(regarglen[op] == 1);
+    assert(REGNODE_ARG_LEN(op) == 1);
 
-    FILL_ADVANCE_NODE_ARG(ptr, op, arg);
+    FILL_ADVANCE_NODE_ARG1u(ptr, op, arg);
     RExC_emit = ptr;
     return(ret);
 }
@@ -21123,7 +12732,7 @@ S_reganode(pTHX_ RExC_state_t *pRExC_state, U8 op, U32 arg)
 STATIC regnode_offset /* Location. */
 S_regpnode(pTHX_ RExC_state_t *pRExC_state, U8 op, SV * arg)
 {
-    const regnode_offset ret = REGNODE_GUTS(pRExC_state, op, regarglen[op]);
+    const regnode_offset ret = REGNODE_GUTS(pRExC_state, op, REGNODE_ARG_LEN(op));
     regnode_offset ptr = ret;
 
     PERL_ARGS_ASSERT_REGPNODE;
@@ -21134,18 +12743,18 @@ S_regpnode(pTHX_ RExC_state_t *pRExC_state, U8 op, SV * arg)
 }
 
 STATIC regnode_offset
-S_reg2Lanode(pTHX_ RExC_state_t *pRExC_state, const U8 op, const U32 arg1, const I32 arg2)
+S_reg2node(pTHX_ RExC_state_t *pRExC_state, const U8 op, const U32 arg1, const I32 arg2)
 {
     /* emit a node with U32 and I32 arguments */
 
-    const regnode_offset ret = REGNODE_GUTS(pRExC_state, op, regarglen[op]);
+    const regnode_offset ret = REGNODE_GUTS(pRExC_state, op, REGNODE_ARG_LEN(op));
     regnode_offset ptr = ret;
 
-    PERL_ARGS_ASSERT_REG2LANODE;
+    PERL_ARGS_ASSERT_REG2NODE;
 
-    assert(regarglen[op] == 2);
+    assert(REGNODE_ARG_LEN(op) == 2);
 
-    FILL_ADVANCE_NODE_2L_ARG(ptr, op, arg1, arg2);
+    FILL_ADVANCE_NODE_2ui_ARG(ptr, op, arg1, arg2);
     RExC_emit = ptr;
     return(ret);
 }
@@ -21160,7 +12769,7 @@ S_reg2Lanode(pTHX_ RExC_state_t *pRExC_state, const U8 op, const U32 arg1, const
 * set up NEXT_OFF() of the inserted node if needed. Something like this:
 *
 *   reginsert(pRExC, OPFAIL, orig_emit, depth+1);
-*   NEXT_OFF(orig_emit) = regarglen[OPFAIL] + NODE_STEP_REGNODE;
+*   NEXT_OFF(REGNODE_p(orig_emit)) = REGNODE_ARG_LEN(OPFAIL) + NODE_STEP_REGNODE;
 *
 * ALSO NOTE - FLAGS(newly-inserted-operator) will be set to 0 as well.
 */
@@ -21171,15 +12780,14 @@ S_reginsert(pTHX_ RExC_state_t *pRExC_state, const U8 op,
     regnode *src;
     regnode *dst;
     regnode *place;
-    const int offset = regarglen[(U8)op];
+    const int offset = REGNODE_ARG_LEN((U8)op);
     const int size = NODE_STEP_REGNODE + offset;
     DECLARE_AND_GET_RE_DEBUG_FLAGS;
 
     PERL_ARGS_ASSERT_REGINSERT;
     PERL_UNUSED_CONTEXT;
     PERL_UNUSED_ARG(depth);
-/* (PL_regkind[(U8)op] == CURLY ? EXTRA_STEP_2ARGS : 0); */
-    DEBUG_PARSE_FMT("inst"," - %s", PL_reg_name[op]);
+    DEBUG_PARSE_FMT("inst"," - %s", REGNODE_NAME(op));
     assert(!RExC_study_started); /* I believe we should never use reginsert once we have started
                                     studying. If this is wrong then we need to adjust RExC_recurse
                                     below like we do with RExC_open_parens/RExC_close_parens. */
@@ -21223,7 +12831,7 @@ S_reginsert(pTHX_ RExC_state_t *pRExC_state, const U8 op,
     }
 
     place = REGNODE_p(operand);        /* Op node, where operand used to be. */
-    src = NEXTOPER(place);
+    src = place + 1; /* NOT REGNODE_AFTER! */
     FLAGS(place) = 0;
     FILL_NODE(operand, op);
 
@@ -21263,7 +12871,7 @@ S_regtail(pTHX_ RExC_state_t * pRExC_state,
             Perl_re_printf( aTHX_  "~ %s (%zu) %s %s\n",
                 SvPV_nolen_const(RExC_mysv), scan,
                     (temp == NULL ? "->" : ""),
-                    (temp == NULL ? PL_reg_name[OP(REGNODE_p(val))] : "")
+                    (temp == NULL ? REGNODE_NAME(OP(REGNODE_p(val))) : "")
             );
         });
         if (temp == NULL)
@@ -21273,9 +12881,9 @@ S_regtail(pTHX_ RExC_state_t * pRExC_state,
 
     /* Populate this node's next pointer */
     assert(val >= scan);
-    if (reg_off_by_arg[OP(REGNODE_p(scan))]) {
+    if (REGNODE_OFF_BY_ARG(OP(REGNODE_p(scan)))) {
         assert((UV) (val - scan) <= U32_MAX);
-        ARG_SET(REGNODE_p(scan), val - scan);
+        ARG1u_SET(REGNODE_p(scan), val - scan);
     }
     else {
         if (val - scan > U16_MAX) {
@@ -21332,7 +12940,7 @@ S_regtail_study(pTHX_ RExC_state_t *pRExC_state, regnode_offset p,
     for (;;) {
         regnode * const temp = regnext(REGNODE_p(scan));
 #ifdef EXPERIMENTAL_INPLACESCAN
-        if (PL_regkind[OP(REGNODE_p(scan))] == EXACT) {
+        if (REGNODE_TYPE(OP(REGNODE_p(scan))) == EXACT) {
             bool unfolded_multi_char;  /* Unexamined in this routine */
             if (join_exact(pRExC_state, scan, &min,
                            &unfolded_multi_char, 1, REGNODE_p(val), depth+1))
@@ -21340,7 +12948,7 @@ S_regtail_study(pTHX_ RExC_state_t *pRExC_state, regnode_offset p,
         }
 #endif
         if ( exact ) {
-            if (PL_regkind[OP(REGNODE_p(scan))] == EXACT) {
+            if (REGNODE_TYPE(OP(REGNODE_p(scan))) == EXACT) {
                 if (exact == PSEUDO )
                     exact= OP(REGNODE_p(scan));
                 else if (exact != OP(REGNODE_p(scan)) )
@@ -21356,7 +12964,7 @@ S_regtail_study(pTHX_ RExC_state_t *pRExC_state, regnode_offset p,
             Perl_re_printf( aTHX_  "~ %s (%zu) -> %s\n",
                 SvPV_nolen_const(RExC_mysv),
                 scan,
-                PL_reg_name[exact]);
+                REGNODE_NAME(exact));
         });
         if (temp == NULL)
             break;
@@ -21372,9 +12980,9 @@ S_regtail_study(pTHX_ RExC_state_t *pRExC_state, regnode_offset p,
                       (IV)(val - scan)
         );
     });
-    if (reg_off_by_arg[OP(REGNODE_p(scan))]) {
+    if (REGNODE_OFF_BY_ARG(OP(REGNODE_p(scan)))) {
         assert((UV) (val - scan) <= U32_MAX);
-        ARG_SET(REGNODE_p(scan), val - scan);
+        ARG1u_SET(REGNODE_p(scan), val - scan);
     }
     else {
         if (val - scan > U16_MAX) {
@@ -21391,14 +12999,14 @@ S_regtail_study(pTHX_ RExC_state_t *pRExC_state, regnode_offset p,
 }
 #endif
 
-STATIC SV*
-S_get_ANYOFM_contents(pTHX_ const regnode * n) {
+SV*
+Perl_get_ANYOFM_contents(pTHX_ const regnode * n) {
 
     /* Returns an inversion list of all the code points matched by the
      * ANYOFM/NANYOFM node 'n' */
 
     SV * cp_list = _new_invlist(-1);
-    const U8 lowest = (U8) ARG(n);
+    const U8 lowest = (U8) ARG1u(n);
     unsigned int i;
     U8 count = 0;
     U8 needed = 1U << PL_bitcount[ (U8) ~ FLAGS(n)];
@@ -21408,7 +13016,7 @@ S_get_ANYOFM_contents(pTHX_ const regnode * n) {
     /* Starting with the lowest code point, any code point that ANDed with the
      * mask yields the lowest code point is in the set */
     for (i = lowest; i <= 0xFF; i++) {
-        if ((i & FLAGS(n)) == ARG(n)) {
+        if ((i & FLAGS(n)) == ARG1u(n)) {
             cp_list = add_cp_to_invlist(cp_list, i);
             count++;
 
@@ -21424,679 +13032,22 @@ S_get_ANYOFM_contents(pTHX_ const regnode * n) {
     return cp_list;
 }
 
-/*
- - regdump - dump a regexp onto Perl_debug_log in vaguely comprehensible form
- */
-#ifdef DEBUGGING
-
-static void
-S_regdump_intflags(pTHX_ const char *lead, const U32 flags)
-{
-    int bit;
-    int set=0;
-
-    ASSUME(REG_INTFLAGS_NAME_SIZE <= sizeof(flags)*8);
-
-    for (bit=0; bit<REG_INTFLAGS_NAME_SIZE; bit++) {
-        if (flags & (1<<bit)) {
-            if (!set++ && lead)
-                Perl_re_printf( aTHX_  "%s", lead);
-            Perl_re_printf( aTHX_  "%s ", PL_reg_intflags_name[bit]);
-        }
-    }
-    if (lead)  {
-        if (set)
-            Perl_re_printf( aTHX_  "\n");
-        else
-            Perl_re_printf( aTHX_  "%s[none-set]\n", lead);
-    }
-}
-
-static void
-S_regdump_extflags(pTHX_ const char *lead, const U32 flags)
-{
-    int bit;
-    int set=0;
-    regex_charset cs;
-
-    ASSUME(REG_EXTFLAGS_NAME_SIZE <= sizeof(flags)*8);
-
-    for (bit=0; bit<REG_EXTFLAGS_NAME_SIZE; bit++) {
-        if (flags & (1U<<bit)) {
-            if ((1U<<bit) & RXf_PMf_CHARSET) { /* Output separately, below */
-                continue;
-            }
-            if (!set++ && lead)
-                Perl_re_printf( aTHX_  "%s", lead);
-            Perl_re_printf( aTHX_  "%s ", PL_reg_extflags_name[bit]);
-        }
-    }
-    if ((cs = get_regex_charset(flags)) != REGEX_DEPENDS_CHARSET) {
-            if (!set++ && lead) {
-                Perl_re_printf( aTHX_  "%s", lead);
-            }
-            switch (cs) {
-                case REGEX_UNICODE_CHARSET:
-                    Perl_re_printf( aTHX_  "UNICODE");
-                    break;
-                case REGEX_LOCALE_CHARSET:
-                    Perl_re_printf( aTHX_  "LOCALE");
-                    break;
-                case REGEX_ASCII_RESTRICTED_CHARSET:
-                    Perl_re_printf( aTHX_  "ASCII-RESTRICTED");
-                    break;
-                case REGEX_ASCII_MORE_RESTRICTED_CHARSET:
-                    Perl_re_printf( aTHX_  "ASCII-MORE_RESTRICTED");
-                    break;
-                default:
-                    Perl_re_printf( aTHX_  "UNKNOWN CHARACTER SET");
-                    break;
-            }
-    }
-    if (lead)  {
-        if (set)
-            Perl_re_printf( aTHX_  "\n");
-        else
-            Perl_re_printf( aTHX_  "%s[none-set]\n", lead);
-    }
-}
-#endif
-
-void
-Perl_regdump(pTHX_ const regexp *r)
-{
-#ifdef DEBUGGING
-    int i;
-    SV * const sv = sv_newmortal();
-    SV *dsv= sv_newmortal();
-    RXi_GET_DECL(r, ri);
-    DECLARE_AND_GET_RE_DEBUG_FLAGS;
-
-    PERL_ARGS_ASSERT_REGDUMP;
-
-    (void)dumpuntil(r, ri->program, ri->program + 1, NULL, NULL, sv, 0, 0);
-
-    /* Header fields of interest. */
-    for (i = 0; i < 2; i++) {
-        if (r->substrs->data[i].substr) {
-            RE_PV_QUOTED_DECL(s, 0, dsv,
-                            SvPVX_const(r->substrs->data[i].substr),
-                            RE_SV_DUMPLEN(r->substrs->data[i].substr),
-                            PL_dump_re_max_len);
-            Perl_re_printf( aTHX_
-                          "%s %s%s at %" IVdf "..%" UVuf " ",
-                          i ? "floating" : "anchored",
-                          s,
-                          RE_SV_TAIL(r->substrs->data[i].substr),
-                          (IV)r->substrs->data[i].min_offset,
-                          (UV)r->substrs->data[i].max_offset);
-        }
-        else if (r->substrs->data[i].utf8_substr) {
-            RE_PV_QUOTED_DECL(s, 1, dsv,
-                            SvPVX_const(r->substrs->data[i].utf8_substr),
-                            RE_SV_DUMPLEN(r->substrs->data[i].utf8_substr),
-                            30);
-            Perl_re_printf( aTHX_
-                          "%s utf8 %s%s at %" IVdf "..%" UVuf " ",
-                          i ? "floating" : "anchored",
-                          s,
-                          RE_SV_TAIL(r->substrs->data[i].utf8_substr),
-                          (IV)r->substrs->data[i].min_offset,
-                          (UV)r->substrs->data[i].max_offset);
-        }
-    }
-
-    if (r->check_substr || r->check_utf8)
-        Perl_re_printf( aTHX_
-                      (const char *)
-                      (   r->check_substr == r->substrs->data[1].substr
-                       && r->check_utf8   == r->substrs->data[1].utf8_substr
-                       ? "(checking floating" : "(checking anchored"));
-    if (r->intflags & PREGf_NOSCAN)
-        Perl_re_printf( aTHX_  " noscan");
-    if (r->extflags & RXf_CHECK_ALL)
-        Perl_re_printf( aTHX_  " isall");
-    if (r->check_substr || r->check_utf8)
-        Perl_re_printf( aTHX_  ") ");
-
-    if (ri->regstclass) {
-        regprop(r, sv, ri->regstclass, NULL, NULL);
-        Perl_re_printf( aTHX_  "stclass %s ", SvPVX_const(sv));
-    }
-    if (r->intflags & PREGf_ANCH) {
-        Perl_re_printf( aTHX_  "anchored");
-        if (r->intflags & PREGf_ANCH_MBOL)
-            Perl_re_printf( aTHX_  "(MBOL)");
-        if (r->intflags & PREGf_ANCH_SBOL)
-            Perl_re_printf( aTHX_  "(SBOL)");
-        if (r->intflags & PREGf_ANCH_GPOS)
-            Perl_re_printf( aTHX_  "(GPOS)");
-        Perl_re_printf( aTHX_ " ");
-    }
-    if (r->intflags & PREGf_GPOS_SEEN)
-        Perl_re_printf( aTHX_  "GPOS:%" UVuf " ", (UV)r->gofs);
-    if (r->intflags & PREGf_SKIP)
-        Perl_re_printf( aTHX_  "plus ");
-    if (r->intflags & PREGf_IMPLICIT)
-        Perl_re_printf( aTHX_  "implicit ");
-    Perl_re_printf( aTHX_  "minlen %" IVdf " ", (IV)r->minlen);
-    if (r->extflags & RXf_EVAL_SEEN)
-        Perl_re_printf( aTHX_  "with eval ");
-    Perl_re_printf( aTHX_  "\n");
-    DEBUG_FLAGS_r({
-        regdump_extflags("r->extflags: ", r->extflags);
-        regdump_intflags("r->intflags: ", r->intflags);
-    });
-#else
-    PERL_ARGS_ASSERT_REGDUMP;
-    PERL_UNUSED_CONTEXT;
-    PERL_UNUSED_ARG(r);
-#endif /* DEBUGGING */
-}
-
-/* Should be synchronized with ANYOF_ #defines in regcomp.h */
-#ifdef DEBUGGING
-
-#  if   _CC_WORDCHAR != 0 || _CC_DIGIT != 1        || _CC_ALPHA != 2    \
-     || _CC_LOWER != 3    || _CC_UPPER != 4        || _CC_PUNCT != 5    \
-     || _CC_PRINT != 6    || _CC_ALPHANUMERIC != 7 || _CC_GRAPH != 8    \
-     || _CC_CASED != 9    || _CC_SPACE != 10       || _CC_BLANK != 11   \
-     || _CC_XDIGIT != 12  || _CC_CNTRL != 13       || _CC_ASCII != 14   \
-     || _CC_VERTSPACE != 15
-#   error Need to adjust order of anyofs[]
-#  endif
-static const char * const anyofs[] = {
-    "\\w",
-    "\\W",
-    "\\d",
-    "\\D",
-    "[:alpha:]",
-    "[:^alpha:]",
-    "[:lower:]",
-    "[:^lower:]",
-    "[:upper:]",
-    "[:^upper:]",
-    "[:punct:]",
-    "[:^punct:]",
-    "[:print:]",
-    "[:^print:]",
-    "[:alnum:]",
-    "[:^alnum:]",
-    "[:graph:]",
-    "[:^graph:]",
-    "[:cased:]",
-    "[:^cased:]",
-    "\\s",
-    "\\S",
-    "[:blank:]",
-    "[:^blank:]",
-    "[:xdigit:]",
-    "[:^xdigit:]",
-    "[:cntrl:]",
-    "[:^cntrl:]",
-    "[:ascii:]",
-    "[:^ascii:]",
-    "\\v",
-    "\\V"
-};
-#endif
-
-/*
-- regprop - printable representation of opcode, with run time support
-*/
-
-void
-Perl_regprop(pTHX_ const regexp *prog, SV *sv, const regnode *o, const regmatch_info *reginfo, const RExC_state_t *pRExC_state)
-{
-#ifdef DEBUGGING
-    int k;
-    RXi_GET_DECL(prog, progi);
-    DECLARE_AND_GET_RE_DEBUG_FLAGS;
-
-    PERL_ARGS_ASSERT_REGPROP;
-
-    SvPVCLEAR(sv);
-
-    if (OP(o) > REGNODE_MAX) {          /* regnode.type is unsigned */
-        if (pRExC_state) {  /* This gives more info, if we have it */
-            FAIL3("panic: corrupted regexp opcode %d > %d",
-                  (int)OP(o), (int)REGNODE_MAX);
-        }
-        else {
-            Perl_croak(aTHX_ "panic: corrupted regexp opcode %d > %d",
-                             (int)OP(o), (int)REGNODE_MAX);
-        }
-    }
-    sv_catpv(sv, PL_reg_name[OP(o)]); /* Take off const! */
-
-    k = PL_regkind[OP(o)];
-
-    if (k == EXACT) {
-        sv_catpvs(sv, " ");
-        /* Using is_utf8_string() (via PERL_PV_UNI_DETECT)
-         * is a crude hack but it may be the best for now since
-         * we have no flag "this EXACTish node was UTF-8"
-         * --jhi */
-        pv_pretty(sv, STRING(o), STR_LEN(o), PL_dump_re_max_len,
-                  PL_colors[0], PL_colors[1],
-                  PERL_PV_ESCAPE_UNI_DETECT |
-                  PERL_PV_ESCAPE_NONASCII   |
-                  PERL_PV_PRETTY_ELLIPSES   |
-                  PERL_PV_PRETTY_LTGT       |
-                  PERL_PV_PRETTY_NOCLEAR
-                  );
-    } else if (k == TRIE) {
-        /* print the details of the trie in dumpuntil instead, as
-         * progi->data isn't available here */
-        const char op = OP(o);
-        const U32 n = ARG(o);
-        const reg_ac_data * const ac = IS_TRIE_AC(op) ?
-               (reg_ac_data *)progi->data->data[n] :
-               NULL;
-        const reg_trie_data * const trie
-            = (reg_trie_data*)progi->data->data[!IS_TRIE_AC(op) ? n : ac->trie];
-
-        Perl_sv_catpvf(aTHX_ sv, "-%s", PL_reg_name[o->flags]);
-        DEBUG_TRIE_COMPILE_r({
-          if (trie->jump)
-            sv_catpvs(sv, "(JUMP)");
-          Perl_sv_catpvf(aTHX_ sv,
-            "<S:%" UVuf "/%" IVdf " W:%" UVuf " L:%" UVuf "/%" UVuf " C:%" UVuf "/%" UVuf ">",
-            (UV)trie->startstate,
-            (IV)trie->statecount-1, /* -1 because of the unused 0 element */
-            (UV)trie->wordcount,
-            (UV)trie->minlen,
-            (UV)trie->maxlen,
-            (UV)TRIE_CHARCOUNT(trie),
-            (UV)trie->uniquecharcount
-          );
-        });
-        if ( IS_ANYOF_TRIE(op) || trie->bitmap ) {
-            sv_catpvs(sv, "[");
-            (void) put_charclass_bitmap_innards(sv,
-                                                ((IS_ANYOF_TRIE(op))
-                                                 ? ANYOF_BITMAP(o)
-                                                 : TRIE_BITMAP(trie)),
-                                                NULL,
-                                                NULL,
-                                                NULL,
-                                                0,
-                                                FALSE
-                                               );
-            sv_catpvs(sv, "]");
-        }
-    } else if (k == CURLY) {
-        U32 lo = ARG1(o), hi = ARG2(o);
-        if (OP(o) == CURLYM || OP(o) == CURLYN || OP(o) == CURLYX)
-            Perl_sv_catpvf(aTHX_ sv, "[%d]", o->flags); /* Parenth number */
-        Perl_sv_catpvf(aTHX_ sv, "{%u,", (unsigned) lo);
-        if (hi == REG_INFTY)
-            sv_catpvs(sv, "INFTY");
-        else
-            Perl_sv_catpvf(aTHX_ sv, "%u", (unsigned) hi);
-        sv_catpvs(sv, "}");
-    }
-    else if (k == WHILEM && o->flags)                  /* Ordinal/of */
-        Perl_sv_catpvf(aTHX_ sv, "[%d/%d]", o->flags & 0xf, o->flags>>4);
-    else if (k == REF || k == OPEN || k == CLOSE
-             || k == GROUPP || OP(o)==ACCEPT)
-    {
-        AV *name_list= NULL;
-        U32 parno= OP(o) == ACCEPT ? (U32)ARG2L(o) : ARG(o);
-        Perl_sv_catpvf(aTHX_ sv, "%" UVuf, (UV)parno);        /* Parenth number */
-        if ( RXp_PAREN_NAMES(prog) ) {
-            name_list= MUTABLE_AV(progi->data->data[progi->name_list_idx]);
-        } else if ( pRExC_state ) {
-            name_list= RExC_paren_name_list;
-        }
-        if ( name_list ) {
-            if ( k != REF || (OP(o) < REFN)) {
-                SV **name= av_fetch(name_list, parno, 0 );
-                if (name)
-                    Perl_sv_catpvf(aTHX_ sv, " '%" SVf "'", SVfARG(*name));
-            }
-            else
-            if (parno > 0) {
-                /* parno must always be larger than 0 for this block
-                 * as it represents a slot into the data array, which
-                 * has the 0 slot reserved for a placeholder so any valid
-                 * index into it is always true, eg non-zero
-                 * see the '%' "what" type and the implementation of
-                 * S_add_data()
-                 */
-                SV *sv_dat= MUTABLE_SV(progi->data->data[ parno ]);
-                I32 *nums=(I32*)SvPVX(sv_dat);
-                SV **name= av_fetch(name_list, nums[0], 0 );
-                I32 n;
-                if (name) {
-                    for ( n=0; n<SvIVX(sv_dat); n++ ) {
-                        Perl_sv_catpvf(aTHX_ sv, "%s%" IVdf,
-                                    (n ? "," : ""), (IV)nums[n]);
-                    }
-                    Perl_sv_catpvf(aTHX_ sv, " '%" SVf "'", SVfARG(*name));
-                }
-            }
-        }
-        if ( k == REF && reginfo) {
-            U32 n = ARG(o);  /* which paren pair */
-            I32 ln = prog->offs[n].start;
-            if (prog->lastparen < n || ln == -1 || prog->offs[n].end == -1)
-                Perl_sv_catpvf(aTHX_ sv, ": FAIL");
-            else if (ln == prog->offs[n].end)
-                Perl_sv_catpvf(aTHX_ sv, ": ACCEPT - EMPTY STRING");
-            else {
-                const char *s = reginfo->strbeg + ln;
-                Perl_sv_catpvf(aTHX_ sv, ": ");
-                Perl_pv_pretty( aTHX_ sv, s, prog->offs[n].end - prog->offs[n].start, 32, 0, 0,
-                    PERL_PV_ESCAPE_UNI_DETECT|PERL_PV_PRETTY_NOCLEAR|PERL_PV_PRETTY_ELLIPSES|PERL_PV_PRETTY_QUOTE );
-            }
-        }
-    } else if (k == GOSUB) {
-        AV *name_list= NULL;
-        if ( RXp_PAREN_NAMES(prog) ) {
-            name_list= MUTABLE_AV(progi->data->data[progi->name_list_idx]);
-        } else if ( pRExC_state ) {
-            name_list= RExC_paren_name_list;
-        }
-
-        /* Paren and offset */
-        Perl_sv_catpvf(aTHX_ sv, "%d[%+d:%d]", (int)ARG(o),(int)ARG2L(o),
-                (int)((o + (int)ARG2L(o)) - progi->program) );
-        if (name_list) {
-            SV **name= av_fetch(name_list, ARG(o), 0 );
-            if (name)
-                Perl_sv_catpvf(aTHX_ sv, " '%" SVf "'", SVfARG(*name));
-        }
-    }
-    else if (k == LOGICAL)
-        /* 2: embedded, otherwise 1 */
-        Perl_sv_catpvf(aTHX_ sv, "[%d]", o->flags);
-    else if (k == ANYOF || k == ANYOFR) {
-        U8 flags;
-        char * bitmap;
-        U32 arg;
-        bool do_sep = FALSE;    /* Do we need to separate various components of
-                                   the output? */
-        /* Set if there is still an unresolved user-defined property */
-        SV *unresolved                = NULL;
-
-        /* Things that are ignored except when the runtime locale is UTF-8 */
-        SV *only_utf8_locale_invlist = NULL;
-
-        /* Code points that don't fit in the bitmap */
-        SV *nonbitmap_invlist = NULL;
-
-        /* And things that aren't in the bitmap, but are small enough to be */
-        SV* bitmap_range_not_in_bitmap = NULL;
-
-        bool inverted;
-
-        if (inRANGE(OP(o), ANYOFH, ANYOFRb)) {
-            flags = 0;
-            bitmap = NULL;
-            arg = 0;
-        }
-        else {
-            flags = ANYOF_FLAGS(o);
-            bitmap = ANYOF_BITMAP(o);
-            arg = ARG(o);
-        }
-
-        if (OP(o) == ANYOFL || OP(o) == ANYOFPOSIXL) {
-            if (ANYOFL_UTF8_LOCALE_REQD(flags)) {
-                sv_catpvs(sv, "{utf8-locale-reqd}");
-            }
-            if (flags & ANYOFL_FOLD) {
-                sv_catpvs(sv, "{i}");
-            }
-        }
-
-        inverted = flags & ANYOF_INVERT;
-
-        /* If there is stuff outside the bitmap, get it */
-        if (arg != ANYOF_ONLY_HAS_BITMAP) {
-            if (inRANGE(OP(o), ANYOFR, ANYOFRb)) {
-                nonbitmap_invlist = _add_range_to_invlist(nonbitmap_invlist,
-                                            ANYOFRbase(o),
-                                            ANYOFRbase(o) + ANYOFRdelta(o));
-            }
-            else {
-#if !defined(PERL_IN_XSUB_RE) || defined(PLUGGABLE_RE_EXTENSION)
-                (void) get_regclass_nonbitmap_data(prog, o, FALSE,
-                                                &unresolved,
-                                                &only_utf8_locale_invlist,
-                                                &nonbitmap_invlist);
-#else
-                (void) get_re_gclass_nonbitmap_data(prog, o, FALSE,
-                                                &unresolved,
-                                                &only_utf8_locale_invlist,
-                                                &nonbitmap_invlist);
-#endif
-            }
-
-            /* The non-bitmap data may contain stuff that could fit in the
-             * bitmap.  This could come from a user-defined property being
-             * finally resolved when this call was done; or much more likely
-             * because there are matches that require UTF-8 to be valid, and so
-             * aren't in the bitmap (or ANYOFR).  This is teased apart later */
-            _invlist_intersection(nonbitmap_invlist,
-                                  PL_InBitmap,
-                                  &bitmap_range_not_in_bitmap);
-            /* Leave just the things that don't fit into the bitmap */
-            _invlist_subtract(nonbitmap_invlist,
-                              PL_InBitmap,
-                              &nonbitmap_invlist);
-        }
-
-        /* Obey this flag to add all above-the-bitmap code points */
-        if (flags & ANYOF_MATCHES_ALL_ABOVE_BITMAP) {
-            nonbitmap_invlist = _add_range_to_invlist(nonbitmap_invlist,
-                                                      NUM_ANYOF_CODE_POINTS,
-                                                      UV_MAX);
-        }
-
-        /* Ready to start outputting.  First, the initial left bracket */
-        Perl_sv_catpvf(aTHX_ sv, "[%s", PL_colors[0]);
-
-        /* ANYOFH by definition doesn't have anything that will fit inside the
-         * bitmap;  ANYOFR may or may not. */
-        if (  ! inRANGE(OP(o), ANYOFH, ANYOFHr)
-            && (   ! inRANGE(OP(o), ANYOFR, ANYOFRb)
-                ||   ANYOFRbase(o) < NUM_ANYOF_CODE_POINTS))
-        {
-            /* Then all the things that could fit in the bitmap */
-            do_sep = put_charclass_bitmap_innards(sv,
-                                                  bitmap,
-                                                  bitmap_range_not_in_bitmap,
-                                                  only_utf8_locale_invlist,
-                                                  o,
-                                                  flags,
-
-                                                  /* Can't try inverting for a
-                                                   * better display if there
-                                                   * are things that haven't
-                                                   * been resolved */
-                                                  unresolved != NULL
-                                            || inRANGE(OP(o), ANYOFR, ANYOFRb));
-            SvREFCNT_dec(bitmap_range_not_in_bitmap);
-
-            /* If there are user-defined properties which haven't been defined
-             * yet, output them.  If the result is not to be inverted, it is
-             * clearest to output them in a separate [] from the bitmap range
-             * stuff.  If the result is to be complemented, we have to show
-             * everything in one [], as the inversion applies to the whole
-             * thing.  Use {braces} to separate them from anything in the
-             * bitmap and anything above the bitmap. */
-            if (unresolved) {
-                if (inverted) {
-                    if (! do_sep) { /* If didn't output anything in the bitmap
-                                     */
-                        sv_catpvs(sv, "^");
-                    }
-                    sv_catpvs(sv, "{");
-                }
-                else if (do_sep) {
-                    Perl_sv_catpvf(aTHX_ sv,"%s][%s", PL_colors[1],
-                                                      PL_colors[0]);
-                }
-                sv_catsv(sv, unresolved);
-                if (inverted) {
-                    sv_catpvs(sv, "}");
-                }
-                do_sep = ! inverted;
-            }
-        }
-
-        /* And, finally, add the above-the-bitmap stuff */
-        if (nonbitmap_invlist && _invlist_len(nonbitmap_invlist)) {
-            SV* contents;
-
-            /* See if truncation size is overridden */
-            const STRLEN dump_len = (PL_dump_re_max_len > 256)
-                                    ? PL_dump_re_max_len
-                                    : 256;
-
-            /* This is output in a separate [] */
-            if (do_sep) {
-                Perl_sv_catpvf(aTHX_ sv,"%s][%s", PL_colors[1], PL_colors[0]);
-            }
-
-            /* And, for easy of understanding, it is shown in the
-             * uncomplemented form if possible.  The one exception being if
-             * there are unresolved items, where the inversion has to be
-             * delayed until runtime */
-            if (inverted && ! unresolved) {
-                _invlist_invert(nonbitmap_invlist);
-                _invlist_subtract(nonbitmap_invlist, PL_InBitmap, &nonbitmap_invlist);
-            }
-
-            contents = invlist_contents(nonbitmap_invlist,
-                                        FALSE /* output suitable for catsv */
-                                       );
-
-            /* If the output is shorter than the permissible maximum, just do it. */
-            if (SvCUR(contents) <= dump_len) {
-                sv_catsv(sv, contents);
-            }
-            else {
-                const char * contents_string = SvPVX(contents);
-                STRLEN i = dump_len;
-
-                /* Otherwise, start at the permissible max and work back to the
-                 * first break possibility */
-                while (i > 0 && contents_string[i] != ' ') {
-                    i--;
-                }
-                if (i == 0) {       /* Fail-safe.  Use the max if we couldn't
-                                       find a legal break */
-                    i = dump_len;
-                }
-
-                sv_catpvn(sv, contents_string, i);
-                sv_catpvs(sv, "...");
-            }
-
-            SvREFCNT_dec_NN(contents);
-            SvREFCNT_dec_NN(nonbitmap_invlist);
-        }
-
-        /* And finally the matching, closing ']' */
-        Perl_sv_catpvf(aTHX_ sv, "%s]", PL_colors[1]);
-
-        if (OP(o) == ANYOFHs) {
-            Perl_sv_catpvf(aTHX_ sv, " (Leading UTF-8 bytes=%s", _byte_dump_string((U8 *) ((struct regnode_anyofhs *) o)->string, FLAGS(o), 1));
-        }
-        else if (inRANGE(OP(o), ANYOFH, ANYOFRb)) {
-            U8 lowest = (OP(o) != ANYOFHr)
-                         ? FLAGS(o)
-                         : LOWEST_ANYOF_HRx_BYTE(FLAGS(o));
-            U8 highest = (OP(o) == ANYOFHr)
-                         ? HIGHEST_ANYOF_HRx_BYTE(FLAGS(o))
-                         : (OP(o) == ANYOFH || OP(o) == ANYOFR)
-                           ? 0xFF
-                           : lowest;
-#ifndef EBCDIC
-            if (OP(o) != ANYOFR || ! isASCII(ANYOFRbase(o) + ANYOFRdelta(o)))
-#endif
-            {
-                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) {
-        SV * cp_list = get_ANYOFM_contents(o);
-
-        Perl_sv_catpvf(aTHX_ sv, "[%s", PL_colors[0]);
-        if (OP(o) == NANYOFM) {
-            _invlist_invert(cp_list);
-        }
-
-        put_charclass_bitmap_innards(sv, NULL, cp_list, NULL, NULL, 0, TRUE);
-        Perl_sv_catpvf(aTHX_ sv, "%s]", PL_colors[1]);
-
-        SvREFCNT_dec(cp_list);
-    }
-    else if (k == POSIXD || k == NPOSIXD) {
-        U8 index = FLAGS(o) * 2;
-        if (index < C_ARRAY_LENGTH(anyofs)) {
-            if (*anyofs[index] != '[')  {
-                sv_catpvs(sv, "[");
-            }
-            sv_catpv(sv, anyofs[index]);
-            if (*anyofs[index] != '[')  {
-                sv_catpvs(sv, "]");
-            }
-        }
-        else {
-            Perl_sv_catpvf(aTHX_ sv, "[illegal type=%d])", index);
-        }
-    }
-    else if (k == BOUND || k == NBOUND) {
-        /* Must be synced with order of 'bound_type' in regcomp.h */
-        const char * const bounds[] = {
-            "",      /* Traditional */
-            "{gcb}",
-            "{lb}",
-            "{sb}",
-            "{wb}"
-        };
-        assert(FLAGS(o) < C_ARRAY_LENGTH(bounds));
-        sv_catpv(sv, bounds[FLAGS(o)]);
-    }
-    else if (k == BRANCHJ && (OP(o) == UNLESSM || OP(o) == IFMATCH)) {
-        Perl_sv_catpvf(aTHX_ sv, "[%d", -(o->flags));
-        if (o->next_off) {
-            Perl_sv_catpvf(aTHX_ sv, "..-%d", o->flags - o->next_off);
-        }
-        Perl_sv_catpvf(aTHX_ sv, "]");
-    }
-    else if (OP(o) == SBOL)
-        Perl_sv_catpvf(aTHX_ sv, " /%s/", o->flags ? "\\A" : "^");
-
-    /* add on the verb argument if there is one */
-    if ( ( k == VERB || OP(o) == ACCEPT || OP(o) == OPFAIL ) && o->flags) {
-        if ( ARG(o) )
-            Perl_sv_catpvf(aTHX_ sv, ":%" SVf,
-                       SVfARG((MUTABLE_SV(progi->data->data[ ARG( o ) ]))));
-        else
-            sv_catpvs(sv, ":NULL");
-    }
-#else
-    PERL_UNUSED_CONTEXT;
-    PERL_UNUSED_ARG(sv);
-    PERL_UNUSED_ARG(o);
-    PERL_UNUSED_ARG(prog);
-    PERL_UNUSED_ARG(reginfo);
-    PERL_UNUSED_ARG(pRExC_state);
-#endif /* DEBUGGING */
-}
-
+SV *
+Perl_get_ANYOFHbbm_contents(pTHX_ const regnode * n) {
+    PERL_ARGS_ASSERT_GET_ANYOFHBBM_CONTENTS;
+
+    SV * cp_list = NULL;
+    populate_invlist_from_bitmap(
+              ((struct regnode_bbm *) n)->bitmap,
+              REGNODE_BBM_BITMAP_LEN * CHARBITS,
+              &cp_list,
+
+              /* The base cp is from the start byte plus a zero continuation */
+              TWO_BYTE_UTF8_TO_NATIVE(FIRST_BYTE((struct regnode_bbm *) n),
+                                      UTF_CONTINUATION_MARK | 0));
+    return cp_list;
+}
+
 
 
 SV *
@@ -22183,7 +13134,13 @@ Perl_pregfree2(pTHX_ REGEXP *rx)
 #ifdef PERL_ANY_COW
     SvREFCNT_dec(r->saved_copy);
 #endif
-    Safefree(r->offs);
+    Safefree(RXp_OFFSp(r));
+    if (r->logical_to_parno) {
+        Safefree(r->logical_to_parno);
+        Safefree(r->parno_to_logical);
+        Safefree(r->parno_to_logical_next);
+    }
+
     SvREFCNT_dec(r->qr_anoncv);
     if (r->recurse_locinput)
         Safefree(r->recurse_locinput);
@@ -22281,12 +13238,12 @@ Perl_reg_temp_copy(pTHX_ REGEXP *dsv, REGEXP *ssv)
      */
     memcpy(&(drx->xpv_cur), &(srx->xpv_cur),
            sizeof(regexp) - STRUCT_OFFSET(regexp, xpv_cur));
+
     if (!islv)
         SvLEN_set(dsv, 0);
-    if (srx->offs) {
+    if (RXp_OFFSp(srx)) {
         const I32 npar = srx->nparens+1;
-        Newx(drx->offs, npar, regexp_paren_pair);
-        Copy(srx->offs, drx->offs, npar, regexp_paren_pair);
+        NewCopy(RXp_OFFSp(srx), RXp_OFFSp(drx), npar, regexp_paren_pair);
     }
     if (srx->substrs) {
         int i;
@@ -22301,9 +13258,26 @@ Perl_reg_temp_copy(pTHX_ REGEXP *dsv, REGEXP *ssv)
         /* check_substr and check_utf8, if non-NULL, point to either their
            anchored or float namesakes, and don't hold a second reference.  */
     }
+    if (srx->logical_to_parno) {
+        NewCopy(srx->logical_to_parno,
+                drx->logical_to_parno,
+                srx->nparens+1, I32);
+        NewCopy(srx->parno_to_logical,
+                drx->parno_to_logical,
+                srx->nparens+1, I32);
+        NewCopy(srx->parno_to_logical_next,
+                drx->parno_to_logical_next,
+                srx->nparens+1, I32);
+    } else {
+        drx->logical_to_parno = NULL;
+        drx->parno_to_logical = NULL;
+        drx->parno_to_logical_next = NULL;
+    }
+    drx->logical_nparens = srx->logical_nparens;
+
     RX_MATCH_COPIED_off(dsv);
 #ifdef PERL_ANY_COW
-    drx->saved_copy = NULL;
+    RXp_SAVED_COPY(drx) = NULL;
 #endif
     drx->mother_re = ReREFCNT_inc(srx->mother_re ? srx->mother_re : ssv);
     SvREFCNT_inc_void(drx->qr_anoncv);
@@ -22416,6 +13390,10 @@ Perl_regfree_internal(pTHX_ REGEXP * const rx)
                             PerlMemShared_free(trie->bitmap);
                         if (trie->jump)
                             PerlMemShared_free(trie->jump);
+                        if (trie->j_before_paren)
+                            PerlMemShared_free(trie->j_before_paren);
+                        if (trie->j_after_paren)
+                            PerlMemShared_free(trie->j_after_paren);
                         PerlMemShared_free(trie->wordinfo);
                         /* do this last!!!! */
                         PerlMemShared_free(ri->data->data[n]);
@@ -22423,7 +13401,7 @@ Perl_regfree_internal(pTHX_ REGEXP * const rx)
                 }
                 break;
             case '%':
-                /* NO-OP a '%' data contains a null pointer, so that add_data
+                /* NO-OP a '%' data contains a null pointer, so that reg_add_data
                  * always returns non-zero, this should only ever happen in the
                  * 0 index */
                 assert(n==0);
@@ -22440,8 +13418,6 @@ Perl_regfree_internal(pTHX_ REGEXP * const rx)
     Safefree(ri);
 }
 
-#define av_dup_inc(s, t)       MUTABLE_AV(sv_dup_inc((const SV *)s, t))
-#define hv_dup_inc(s, t)       MUTABLE_HV(sv_dup_inc((const SV *)s, t))
 #define SAVEPVN(p, n)  ((p) ? savepvn(p, n) : NULL)
 
 /*
@@ -22472,8 +13448,7 @@ Perl_re_dup_guts(pTHX_ const REGEXP *sstr, REGEXP *dstr, CLONE_PARAMS *param)
     PERL_ARGS_ASSERT_RE_DUP_GUTS;
 
     npar = r->nparens+1;
-    Newx(ret->offs, npar, regexp_paren_pair);
-    Copy(r->offs, ret->offs, npar, regexp_paren_pair);
+    NewCopy(RXp_OFFSp(r), RXp_OFFSp(ret), npar, regexp_paren_pair);
 
     if (ret->substrs) {
         /* Do it this way to avoid reading from *r after the StructCopy().
@@ -22527,13 +13502,26 @@ Perl_re_dup_guts(pTHX_ const REGEXP *sstr, REGEXP *dstr, CLONE_PARAMS *param)
         RXi_SET(ret, CALLREGDUPE_PVT(dstr, param));
 
     if (RX_MATCH_COPIED(dstr))
-        ret->subbeg  = SAVEPVN(ret->subbeg, ret->sublen);
+        RXp_SUBBEG(ret)  = SAVEPVN(RXp_SUBBEG(ret), RXp_SUBLEN(ret));
     else
-        ret->subbeg = NULL;
+        RXp_SUBBEG(ret) = NULL;
 #ifdef PERL_ANY_COW
-    ret->saved_copy = NULL;
+    RXp_SAVED_COPY(ret) = NULL;
 #endif
 
+    if (r->logical_to_parno) {
+        /* we use total_parens for all three just for symmetry */
+        ret->logical_to_parno = (I32*)SAVEPVN((char*)(r->logical_to_parno), (1+r->nparens) * sizeof(I32));
+        ret->parno_to_logical = (I32*)SAVEPVN((char*)(r->parno_to_logical), (1+r->nparens) * sizeof(I32));
+        ret->parno_to_logical_next = (I32*)SAVEPVN((char*)(r->parno_to_logical_next), (1+r->nparens) * sizeof(I32));
+    } else {
+        ret->logical_to_parno = NULL;
+        ret->parno_to_logical = NULL;
+        ret->parno_to_logical_next = NULL;
+    }
+
+    ret->logical_nparens = r->logical_nparens;
+
     /* Whether mother_re be set or no, we need to copy the string.  We
        cannot refrain from copying it when the storage points directly to
        our mother regexp, because that's
@@ -22658,7 +13646,7 @@ Perl_regdupe_internal(pTHX_ REGEXP * const rx, CLONE_PARAMS *param)
                 break;
             case '%':
                 /* this is a placeholder type, it exists purely so that
-                 * add_data always returns a non-zero value, this type of
+                 * reg_add_data always returns a non-zero value, this type of
                  * entry should ONLY be present in the 0 slot of the array */
                 assert(i == 0);
                 d->data[i]= ri->data->data[i];
@@ -22674,6 +13662,15 @@ Perl_regdupe_internal(pTHX_ REGEXP * const rx, CLONE_PARAMS *param)
     else
         reti->data = NULL;
 
+    if (ri->regstclass && !reti->regstclass) {
+        /* Assume that the regstclass is a regnode which is inside of the
+         * program which we have to copy over */
+        regnode *node= ri->regstclass;
+        assert(node >= ri->program && (node - ri->program) < len);
+        reti->regstclass = reti->program + (node - ri->program);
+    }
+
+
     reti->name_list_idx = ri->name_list_idx;
 
     SetProgLen(reti, len);
@@ -22683,33 +13680,6 @@ Perl_regdupe_internal(pTHX_ REGEXP * const rx, CLONE_PARAMS *param)
 
 #endif    /* USE_ITHREADS */
 
-#ifndef PERL_IN_XSUB_RE
-
-/*
- - regnext - dig the "next" pointer out of a node
- */
-regnode *
-Perl_regnext(pTHX_ regnode *p)
-{
-    I32 offset;
-
-    if (!p)
-        return(NULL);
-
-    if (OP(p) > REGNODE_MAX) {         /* regnode.type is unsigned */
-        Perl_croak(aTHX_ "Corrupted regexp opcode %d > %d",
-                                                (int)OP(p), (int)REGNODE_MAX);
-    }
-
-    offset = (reg_off_by_arg[OP(p)] ? ARG(p) : NEXT_OFF(p));
-    if (offset == 0)
-        return(NULL);
-
-    return(p+offset);
-}
-
-#endif
-
 STATIC void
 S_re_croak(pTHX_ bool utf8, const char* pat,...)
 {
@@ -22778,776 +13748,6 @@ Perl_save_re_context(pTHX)
 }
 #endif
 
-#ifdef DEBUGGING
-
-STATIC void
-S_put_code_point(pTHX_ SV *sv, UV c)
-{
-    PERL_ARGS_ASSERT_PUT_CODE_POINT;
-
-    if (c > 255) {
-        Perl_sv_catpvf(aTHX_ sv, "\\x{%04" UVXf "}", c);
-    }
-    else if (isPRINT(c)) {
-        const char string = (char) c;
-
-        /* We use {phrase} as metanotation in the class, so also escape literal
-         * braces */
-        if (isBACKSLASHED_PUNCT(c) || c == '{' || c == '}')
-            sv_catpvs(sv, "\\");
-        sv_catpvn(sv, &string, 1);
-    }
-    else if (isMNEMONIC_CNTRL(c)) {
-        Perl_sv_catpvf(aTHX_ sv, "%s", cntrl_to_mnemonic((U8) c));
-    }
-    else {
-        Perl_sv_catpvf(aTHX_ sv, "\\x%02X", (U8) c);
-    }
-}
-
-STATIC void
-S_put_range(pTHX_ SV *sv, UV start, const UV end, const bool allow_literals)
-{
-    /* Appends to 'sv' a displayable version of the range of code points from
-     * 'start' to 'end'.  Mnemonics (like '\r') are used for the few controls
-     * that have them, when they occur at the beginning or end of the range.
-     * It uses hex to output the remaining code points, unless 'allow_literals'
-     * is true, in which case the printable ASCII ones are output as-is (though
-     * some of these will be escaped by put_code_point()).
-     *
-     * NOTE:  This is designed only for printing ranges of code points that fit
-     *        inside an ANYOF bitmap.  Higher code points are simply suppressed
-     */
-
-    const unsigned int min_range_count = 3;
-
-    assert(start <= end);
-
-    PERL_ARGS_ASSERT_PUT_RANGE;
-
-    while (start <= end) {
-        UV this_end;
-        const char * format;
-
-        if (    end - start < min_range_count
-            && (end - start <= 2 || (isPRINT_A(start) && isPRINT_A(end))))
-        {
-            /* Output a range of 1 or 2 chars individually, or longer ranges
-             * when printable */
-            for (; start <= end; start++) {
-                put_code_point(sv, start);
-            }
-            break;
-        }
-
-        /* If permitted by the input options, and there is a possibility that
-         * this range contains a printable literal, look to see if there is
-         * one. */
-        if (allow_literals && start <= MAX_PRINT_A) {
-
-            /* If the character at the beginning of the range isn't an ASCII
-             * printable, effectively split the range into two parts:
-             *  1) the portion before the first such printable,
-             *  2) the rest
-             * and output them separately. */
-            if (! isPRINT_A(start)) {
-                UV temp_end = start + 1;
-
-                /* There is no point looking beyond the final possible
-                 * printable, in MAX_PRINT_A */
-                UV max = MIN(end, MAX_PRINT_A);
-
-                while (temp_end <= max && ! isPRINT_A(temp_end)) {
-                    temp_end++;
-                }
-
-                /* Here, temp_end points to one beyond the first printable if
-                 * found, or to one beyond 'max' if not.  If none found, make
-                 * sure that we use the entire range */
-                if (temp_end > MAX_PRINT_A) {
-                    temp_end = end + 1;
-                }
-
-                /* Output the first part of the split range: the part that
-                 * doesn't have printables, with the parameter set to not look
-                 * for literals (otherwise we would infinitely recurse) */
-                put_range(sv, start, temp_end - 1, FALSE);
-
-                /* The 2nd part of the range (if any) starts here. */
-                start = temp_end;
-
-                /* We do a continue, instead of dropping down, because even if
-                 * the 2nd part is non-empty, it could be so short that we want
-                 * to output it as individual characters, as tested for at the
-                 * top of this loop.  */
-                continue;
-            }
-
-            /* Here, 'start' is a printable ASCII.  If it is an alphanumeric,
-             * output a sub-range of just the digits or letters, then process
-             * the remaining portion as usual. */
-            if (isALPHANUMERIC_A(start)) {
-                UV mask = (isDIGIT_A(start))
-                           ? _CC_DIGIT
-                             : isUPPER_A(start)
-                               ? _CC_UPPER
-                               : _CC_LOWER;
-                UV temp_end = start + 1;
-
-                /* Find the end of the sub-range that includes just the
-                 * characters in the same class as the first character in it */
-                while (temp_end <= end && _generic_isCC_A(temp_end, mask)) {
-                    temp_end++;
-                }
-                temp_end--;
-
-                /* For short ranges, don't duplicate the code above to output
-                 * them; just call recursively */
-                if (temp_end - start < min_range_count) {
-                    put_range(sv, start, temp_end, FALSE);
-                }
-                else {  /* Output as a range */
-                    put_code_point(sv, start);
-                    sv_catpvs(sv, "-");
-                    put_code_point(sv, temp_end);
-                }
-                start = temp_end + 1;
-                continue;
-            }
-
-            /* We output any other printables as individual characters */
-            if (isPUNCT_A(start) || isSPACE_A(start)) {
-                while (start <= end && (isPUNCT_A(start)
-                                        || isSPACE_A(start)))
-                {
-                    put_code_point(sv, start);
-                    start++;
-                }
-                continue;
-            }
-        } /* End of looking for literals */
-
-        /* Here is not to output as a literal.  Some control characters have
-         * mnemonic names.  Split off any of those at the beginning and end of
-         * the range to print mnemonically.  It isn't possible for many of
-         * these to be in a row, so this won't overwhelm with output */
-        if (   start <= end
-            && (isMNEMONIC_CNTRL(start) || isMNEMONIC_CNTRL(end)))
-        {
-            while (isMNEMONIC_CNTRL(start) && start <= end) {
-                put_code_point(sv, start);
-                start++;
-            }
-
-            /* If this didn't take care of the whole range ... */
-            if (start <= end) {
-
-                /* Look backwards from the end to find the final non-mnemonic
-                 * */
-                UV temp_end = end;
-                while (isMNEMONIC_CNTRL(temp_end)) {
-                    temp_end--;
-                }
-
-                /* And separately output the interior range that doesn't start
-                 * or end with mnemonics */
-                put_range(sv, start, temp_end, FALSE);
-
-                /* Then output the mnemonic trailing controls */
-                start = temp_end + 1;
-                while (start <= end) {
-                    put_code_point(sv, start);
-                    start++;
-                }
-                break;
-            }
-        }
-
-        /* As a final resort, output the range or subrange as hex. */
-
-        if (start >= NUM_ANYOF_CODE_POINTS) {
-            this_end = end;
-        }
-        else {  /* Have to split range at the bitmap boundary */
-            this_end = (end < NUM_ANYOF_CODE_POINTS)
-                        ? end
-                        : NUM_ANYOF_CODE_POINTS - 1;
-        }
-#if NUM_ANYOF_CODE_POINTS > 256
-        format = (this_end < 256)
-                 ? "\\x%02" UVXf "-\\x%02" UVXf
-                 : "\\x{%04" UVXf "}-\\x{%04" UVXf "}";
-#else
-        format = "\\x%02" UVXf "-\\x%02" UVXf;
-#endif
-        GCC_DIAG_IGNORE_STMT(-Wformat-nonliteral);
-        Perl_sv_catpvf(aTHX_ sv, format, start, this_end);
-        GCC_DIAG_RESTORE_STMT;
-        break;
-    }
-}
-
-STATIC void
-S_put_charclass_bitmap_innards_invlist(pTHX_ SV *sv, SV* invlist)
-{
-    /* Concatenate onto the PV in 'sv' a displayable form of the inversion list
-     * 'invlist' */
-
-    UV start, end;
-    bool allow_literals = TRUE;
-
-    PERL_ARGS_ASSERT_PUT_CHARCLASS_BITMAP_INNARDS_INVLIST;
-
-    /* Generally, it is more readable if printable characters are output as
-     * literals, but if a range (nearly) spans all of them, it's best to output
-     * it as a single range.  This code will use a single range if all but 2
-     * ASCII printables are in it */
-    invlist_iterinit(invlist);
-    while (invlist_iternext(invlist, &start, &end)) {
-
-        /* If the range starts beyond the final printable, it doesn't have any
-         * in it */
-        if (start > MAX_PRINT_A) {
-            break;
-        }
-
-        /* In both ASCII and EBCDIC, a SPACE is the lowest printable.  To span
-         * all but two, the range must start and end no later than 2 from
-         * either end */
-        if (start < ' ' + 2 && end > MAX_PRINT_A - 2) {
-            if (end > MAX_PRINT_A) {
-                end = MAX_PRINT_A;
-            }
-            if (start < ' ') {
-                start = ' ';
-            }
-            if (end - start >= MAX_PRINT_A - ' ' - 2) {
-                allow_literals = FALSE;
-            }
-            break;
-        }
-    }
-    invlist_iterfinish(invlist);
-
-    /* Here we have figured things out.  Output each range */
-    invlist_iterinit(invlist);
-    while (invlist_iternext(invlist, &start, &end)) {
-        if (start >= NUM_ANYOF_CODE_POINTS) {
-            break;
-        }
-        put_range(sv, start, end, allow_literals);
-    }
-    invlist_iterfinish(invlist);
-
-    return;
-}
-
-STATIC SV*
-S_put_charclass_bitmap_innards_common(pTHX_
-        SV* invlist,            /* The bitmap */
-        SV* posixes,            /* Under /l, things like [:word:], \S */
-        SV* only_utf8,          /* Under /d, matches iff the target is UTF-8 */
-        SV* not_utf8,           /* /d, matches iff the target isn't UTF-8 */
-        SV* only_utf8_locale,   /* Under /l, matches if the locale is UTF-8 */
-        const bool invert       /* Is the result to be inverted? */
-)
-{
-    /* Create and return an SV containing a displayable version of the bitmap
-     * and associated information determined by the input parameters.  If the
-     * output would have been only the inversion indicator '^', NULL is instead
-     * returned. */
-
-    SV * output;
-
-    PERL_ARGS_ASSERT_PUT_CHARCLASS_BITMAP_INNARDS_COMMON;
-
-    if (invert) {
-        output = newSVpvs("^");
-    }
-    else {
-        output = newSVpvs("");
-    }
-
-    /* First, the code points in the bitmap that are unconditionally there */
-    put_charclass_bitmap_innards_invlist(output, invlist);
-
-    /* Traditionally, these have been placed after the main code points */
-    if (posixes) {
-        sv_catsv(output, posixes);
-    }
-
-    if (only_utf8 && _invlist_len(only_utf8)) {
-        Perl_sv_catpvf(aTHX_ output, "%s{utf8}%s", PL_colors[1], PL_colors[0]);
-        put_charclass_bitmap_innards_invlist(output, only_utf8);
-    }
-
-    if (not_utf8 && _invlist_len(not_utf8)) {
-        Perl_sv_catpvf(aTHX_ output, "%s{not utf8}%s", PL_colors[1], PL_colors[0]);
-        put_charclass_bitmap_innards_invlist(output, not_utf8);
-    }
-
-    if (only_utf8_locale && _invlist_len(only_utf8_locale)) {
-        Perl_sv_catpvf(aTHX_ output, "%s{utf8 locale}%s", PL_colors[1], PL_colors[0]);
-        put_charclass_bitmap_innards_invlist(output, only_utf8_locale);
-
-        /* This is the only list in this routine that can legally contain code
-         * points outside the bitmap range.  The call just above to
-         * 'put_charclass_bitmap_innards_invlist' will simply suppress them, so
-         * output them here.  There's about a half-dozen possible, and none in
-         * contiguous ranges longer than 2 */
-        if (invlist_highest(only_utf8_locale) >= NUM_ANYOF_CODE_POINTS) {
-            UV start, end;
-            SV* above_bitmap = NULL;
-
-            _invlist_subtract(only_utf8_locale, PL_InBitmap, &above_bitmap);
-
-            invlist_iterinit(above_bitmap);
-            while (invlist_iternext(above_bitmap, &start, &end)) {
-                UV i;
-
-                for (i = start; i <= end; i++) {
-                    put_code_point(output, i);
-                }
-            }
-            invlist_iterfinish(above_bitmap);
-            SvREFCNT_dec_NN(above_bitmap);
-        }
-    }
-
-    if (invert && SvCUR(output) == 1) {
-        return NULL;
-    }
-
-    return output;
-}
-
-STATIC bool
-S_put_charclass_bitmap_innards(pTHX_ SV *sv,
-                                     char *bitmap,
-                                     SV *nonbitmap_invlist,
-                                     SV *only_utf8_locale_invlist,
-                                     const regnode * const node,
-                                     const U8 flags,
-                                     const bool force_as_is_display)
-{
-    /* Appends to 'sv' a displayable version of the innards of the bracketed
-     * character class defined by the other arguments:
-     *  'bitmap' points to the bitmap, or NULL if to ignore that.
-     *  'nonbitmap_invlist' is an inversion list of the code points that are in
-     *      the bitmap range, but for some reason aren't in the bitmap; NULL if
-     *      none.  The reasons for this could be that they require some
-     *      condition such as the target string being or not being in UTF-8
-     *      (under /d), or because they came from a user-defined property that
-     *      was not resolved at the time of the regex compilation (under /u)
-     *  'only_utf8_locale_invlist' is an inversion list of the code points that
-     *      are valid only if the runtime locale is a UTF-8 one; NULL if none
-     *  'node' is the regex pattern ANYOF node.  It is needed only when the
-     *      above two parameters are not null, and is passed so that this
-     *      routine can tease apart the various reasons for them.
-     *  'flags' is the flags field of 'node'
-     *  'force_as_is_display' is TRUE if this routine should definitely NOT try
-     *      to invert things to see if that leads to a cleaner display.  If
-     *      FALSE, this routine is free to use its judgment about doing this.
-     *
-     * It returns TRUE if there was actually something output.  (It may be that
-     * the bitmap, etc is empty.)
-     *
-     * When called for outputting the bitmap of a non-ANYOF node, just pass the
-     * bitmap, with the succeeding parameters set to NULL, and the final one to
-     * FALSE.
-     */
-
-    /* In general, it tries to display the 'cleanest' representation of the
-     * innards, choosing whether to display them inverted or not, regardless of
-     * whether the class itself is to be inverted.  However,  there are some
-     * cases where it can't try inverting, as what actually matches isn't known
-     * until runtime, and hence the inversion isn't either. */
-
-    bool inverting_allowed = ! force_as_is_display;
-
-    int i;
-    STRLEN orig_sv_cur = SvCUR(sv);
-
-    SV* invlist;            /* Inversion list we accumulate of code points that
-                               are unconditionally matched */
-    SV* only_utf8 = NULL;   /* Under /d, list of matches iff the target is
-                               UTF-8 */
-    SV* not_utf8 =  NULL;   /* /d, list of matches iff the target isn't UTF-8
-                             */
-    SV* posixes = NULL;     /* Under /l, string of things like [:word:], \D */
-    SV* only_utf8_locale = NULL;    /* Under /l, list of matches if the locale
-                                       is UTF-8 */
-
-    SV* as_is_display;      /* The output string when we take the inputs
-                               literally */
-    SV* inverted_display;   /* The output string when we invert the inputs */
-
-    bool invert = cBOOL(flags & ANYOF_INVERT);  /* Is the input to be inverted
-                                                   to match? */
-    /* We are biased in favor of displaying things without them being inverted,
-     * as that is generally easier to understand */
-    const int bias = 5;
-
-    PERL_ARGS_ASSERT_PUT_CHARCLASS_BITMAP_INNARDS;
-
-    /* Start off with whatever code points are passed in.  (We clone, so we
-     * don't change the caller's list) */
-    if (nonbitmap_invlist) {
-        assert(invlist_highest(nonbitmap_invlist) < NUM_ANYOF_CODE_POINTS);
-        invlist = invlist_clone(nonbitmap_invlist, NULL);
-    }
-    else {  /* Worst case size is every other code point is matched */
-        invlist = _new_invlist(NUM_ANYOF_CODE_POINTS / 2);
-    }
-
-    if (flags) {
-        if (OP(node) == ANYOFD) {
-
-            /* This flag indicates that the code points below 0x100 in the
-             * nonbitmap list are precisely the ones that match only when the
-             * target is UTF-8 (they should all be non-ASCII). */
-            if (flags & ANYOF_SHARED_d_UPPER_LATIN1_UTF8_STRING_MATCHES_non_d_RUNTIME_USER_PROP)
-            {
-                _invlist_intersection(invlist, PL_UpperLatin1, &only_utf8);
-                _invlist_subtract(invlist, only_utf8, &invlist);
-            }
-
-            /* And this flag for matching all non-ASCII 0xFF and below */
-            if (flags & ANYOF_SHARED_d_MATCHES_ALL_NON_UTF8_NON_ASCII_non_d_WARN_SUPER)
-            {
-                not_utf8 = invlist_clone(PL_UpperLatin1, NULL);
-            }
-        }
-        else if (OP(node) == ANYOFL || OP(node) == ANYOFPOSIXL) {
-
-            /* If either of these flags are set, what matches isn't
-             * determinable except during execution, so don't know enough here
-             * to invert */
-            if (flags & (ANYOFL_FOLD|ANYOF_MATCHES_POSIXL)) {
-                inverting_allowed = FALSE;
-            }
-
-            /* What the posix classes match also varies at runtime, so these
-             * will be output symbolically. */
-            if (ANYOF_POSIXL_TEST_ANY_SET(node)) {
-                int i;
-
-                posixes = newSVpvs("");
-                for (i = 0; i < ANYOF_POSIXL_MAX; i++) {
-                    if (ANYOF_POSIXL_TEST(node, i)) {
-                        sv_catpv(posixes, anyofs[i]);
-                    }
-                }
-            }
-        }
-    }
-
-    /* Accumulate the bit map into the unconditional match list */
-    if (bitmap) {
-        for (i = 0; i < NUM_ANYOF_CODE_POINTS; i++) {
-            if (BITMAP_TEST(bitmap, i)) {
-                int start = i++;
-                for (;
-                     i < NUM_ANYOF_CODE_POINTS && BITMAP_TEST(bitmap, i);
-                     i++)
-                { /* empty */ }
-                invlist = _add_range_to_invlist(invlist, start, i-1);
-            }
-        }
-    }
-
-    /* Make sure that the conditional match lists don't have anything in them
-     * that match unconditionally; otherwise the output is quite confusing.
-     * This could happen if the code that populates these misses some
-     * duplication. */
-    if (only_utf8) {
-        _invlist_subtract(only_utf8, invlist, &only_utf8);
-    }
-    if (not_utf8) {
-        _invlist_subtract(not_utf8, invlist, &not_utf8);
-    }
-
-    if (only_utf8_locale_invlist) {
-
-        /* Since this list is passed in, we have to make a copy before
-         * modifying it */
-        only_utf8_locale = invlist_clone(only_utf8_locale_invlist, NULL);
-
-        _invlist_subtract(only_utf8_locale, invlist, &only_utf8_locale);
-
-        /* And, it can get really weird for us to try outputting an inverted
-         * form of this list when it has things above the bitmap, so don't even
-         * try */
-        if (invlist_highest(only_utf8_locale) >= NUM_ANYOF_CODE_POINTS) {
-            inverting_allowed = FALSE;
-        }
-    }
-
-    /* Calculate what the output would be if we take the input as-is */
-    as_is_display = put_charclass_bitmap_innards_common(invlist,
-                                                    posixes,
-                                                    only_utf8,
-                                                    not_utf8,
-                                                    only_utf8_locale,
-                                                    invert);
-
-    /* If have to take the output as-is, just do that */
-    if (! inverting_allowed) {
-        if (as_is_display) {
-            sv_catsv(sv, as_is_display);
-            SvREFCNT_dec_NN(as_is_display);
-        }
-    }
-    else { /* But otherwise, create the output again on the inverted input, and
-              use whichever version is shorter */
-
-        int inverted_bias, as_is_bias;
-
-        /* We will apply our bias to whichever of the results doesn't have
-         * the '^' */
-        if (invert) {
-            invert = FALSE;
-            as_is_bias = bias;
-            inverted_bias = 0;
-        }
-        else {
-            invert = TRUE;
-            as_is_bias = 0;
-            inverted_bias = bias;
-        }
-
-        /* Now invert each of the lists that contribute to the output,
-         * excluding from the result things outside the possible range */
-
-        /* For the unconditional inversion list, we have to add in all the
-         * conditional code points, so that when inverted, they will be gone
-         * from it */
-        _invlist_union(only_utf8, invlist, &invlist);
-        _invlist_union(not_utf8, invlist, &invlist);
-        _invlist_union(only_utf8_locale, invlist, &invlist);
-        _invlist_invert(invlist);
-        _invlist_intersection(invlist, PL_InBitmap, &invlist);
-
-        if (only_utf8) {
-            _invlist_invert(only_utf8);
-            _invlist_intersection(only_utf8, PL_UpperLatin1, &only_utf8);
-        }
-        else if (not_utf8) {
-
-            /* If a code point matches iff the target string is not in UTF-8,
-             * then complementing the result has it not match iff not in UTF-8,
-             * which is the same thing as matching iff it is UTF-8. */
-            only_utf8 = not_utf8;
-            not_utf8 = NULL;
-        }
-
-        if (only_utf8_locale) {
-            _invlist_invert(only_utf8_locale);
-            _invlist_intersection(only_utf8_locale,
-                                  PL_InBitmap,
-                                  &only_utf8_locale);
-        }
-
-        inverted_display = put_charclass_bitmap_innards_common(
-                                            invlist,
-                                            posixes,
-                                            only_utf8,
-                                            not_utf8,
-                                            only_utf8_locale, invert);
-
-        /* Use the shortest representation, taking into account our bias
-         * against showing it inverted */
-        if (   inverted_display
-            && (   ! as_is_display
-                || (  SvCUR(inverted_display) + inverted_bias
-                    < SvCUR(as_is_display)    + as_is_bias)))
-        {
-            sv_catsv(sv, inverted_display);
-        }
-        else if (as_is_display) {
-            sv_catsv(sv, as_is_display);
-        }
-
-        SvREFCNT_dec(as_is_display);
-        SvREFCNT_dec(inverted_display);
-    }
-
-    SvREFCNT_dec_NN(invlist);
-    SvREFCNT_dec(only_utf8);
-    SvREFCNT_dec(not_utf8);
-    SvREFCNT_dec(posixes);
-    SvREFCNT_dec(only_utf8_locale);
-
-    return SvCUR(sv) > orig_sv_cur;
-}
-
-#define CLEAR_OPTSTART                                                       \
-    if (optstart) STMT_START {                                               \
-        DEBUG_OPTIMISE_r(Perl_re_printf( aTHX_                                           \
-                              " (%" IVdf " nodes)\n", (IV)(node - optstart))); \
-        optstart=NULL;                                                       \
-    } STMT_END
-
-#define DUMPUNTIL(b,e)                                                       \
-                    CLEAR_OPTSTART;                                          \
-                    node=dumpuntil(r,start,(b),(e),last,sv,indent+1,depth+1);
-
-STATIC const regnode *
-S_dumpuntil(pTHX_ const regexp *r, const regnode *start, const regnode *node,
-            const regnode *last, const regnode *plast,
-            SV* sv, I32 indent, U32 depth)
-{
-    U8 op = PSEUDO;    /* Arbitrary non-END op. */
-    const regnode *next;
-    const regnode *optstart= NULL;
-
-    RXi_GET_DECL(r, ri);
-    DECLARE_AND_GET_RE_DEBUG_FLAGS;
-
-    PERL_ARGS_ASSERT_DUMPUNTIL;
-
-#ifdef DEBUG_DUMPUNTIL
-    Perl_re_printf( aTHX_  "--- %d : %d - %d - %d\n", indent, node-start,
-        last ? last-start : 0, plast ? plast-start : 0);
-#endif
-
-    if (plast && plast < last)
-        last= plast;
-
-    while (PL_regkind[op] != END && (!last || node < last)) {
-        assert(node);
-        /* While that wasn't END last time... */
-        NODE_ALIGN(node);
-        op = OP(node);
-        if (op == CLOSE || op == SRCLOSE || op == WHILEM)
-            indent--;
-        next = regnext((regnode *)node);
-
-        /* Where, what. */
-        if (OP(node) == OPTIMIZED) {
-            if (!optstart && RE_DEBUG_FLAG(RE_DEBUG_COMPILE_OPTIMISE))
-                optstart = node;
-            else
-                goto after_print;
-        } else
-            CLEAR_OPTSTART;
-
-        regprop(r, sv, node, NULL, NULL);
-        Perl_re_printf( aTHX_  "%4" IVdf ":%*s%s", (IV)(node - start),
-                      (int)(2*indent + 1), "", SvPVX_const(sv));
-
-        if (OP(node) != OPTIMIZED) {
-            if (next == NULL)          /* Next ptr. */
-                Perl_re_printf( aTHX_  " (0)");
-            else if (PL_regkind[(U8)op] == BRANCH
-                     && PL_regkind[OP(next)] != BRANCH )
-                Perl_re_printf( aTHX_  " (FAIL)");
-            else
-                Perl_re_printf( aTHX_  " (%" IVdf ")", (IV)(next - start));
-            Perl_re_printf( aTHX_ "\n");
-        }
-
-      after_print:
-        if (PL_regkind[(U8)op] == BRANCHJ) {
-            assert(next);
-            {
-                const regnode *nnode = (OP(next) == LONGJMP
-                                       ? regnext((regnode *)next)
-                                       : next);
-                if (last && nnode > last)
-                    nnode = last;
-                DUMPUNTIL(NEXTOPER(NEXTOPER(node)), nnode);
-            }
-        }
-        else if (PL_regkind[(U8)op] == BRANCH) {
-            assert(next);
-            DUMPUNTIL(NEXTOPER(node), next);
-        }
-        else if ( PL_regkind[(U8)op]  == TRIE ) {
-            const regnode *this_trie = node;
-            const char op = OP(node);
-            const U32 n = ARG(node);
-            const reg_ac_data * const ac = op>=AHOCORASICK ?
-               (reg_ac_data *)ri->data->data[n] :
-               NULL;
-            const reg_trie_data * const trie =
-                (reg_trie_data*)ri->data->data[op<AHOCORASICK ? n : ac->trie];
-#ifdef DEBUGGING
-            AV *const trie_words
-                           = MUTABLE_AV(ri->data->data[n + TRIE_WORDS_OFFSET]);
-#endif
-            const regnode *nextbranch= NULL;
-            I32 word_idx;
-            SvPVCLEAR(sv);
-            for (word_idx= 0; word_idx < (I32)trie->wordcount; word_idx++) {
-                SV ** const elem_ptr = av_fetch(trie_words, word_idx, 0);
-
-                Perl_re_indentf( aTHX_  "%s ",
-                    indent+3,
-                    elem_ptr
-                    ? pv_pretty(sv, SvPV_nolen_const(*elem_ptr),
-                                SvCUR(*elem_ptr), PL_dump_re_max_len,
-                                PL_colors[0], PL_colors[1],
-                                (SvUTF8(*elem_ptr)
-                                 ? PERL_PV_ESCAPE_UNI
-                                 : 0)
-                                | PERL_PV_PRETTY_ELLIPSES
-                                | PERL_PV_PRETTY_LTGT
-                            )
-                    : "???"
-                );
-                if (trie->jump) {
-                    U16 dist= trie->jump[word_idx+1];
-                    Perl_re_printf( aTHX_  "(%" UVuf ")\n",
-                               (UV)((dist ? this_trie + dist : next) - start));
-                    if (dist) {
-                        if (!nextbranch)
-                            nextbranch= this_trie + trie->jump[0];
-                        DUMPUNTIL(this_trie + dist, nextbranch);
-                    }
-                    if (nextbranch && PL_regkind[OP(nextbranch)]==BRANCH)
-                        nextbranch= regnext((regnode *)nextbranch);
-                } else {
-                    Perl_re_printf( aTHX_  "\n");
-                }
-            }
-            if (last && next > last)
-                node= last;
-            else
-                node= next;
-        }
-        else if ( op == CURLY ) {   /* "next" might be very big: optimizer */
-            DUMPUNTIL(NEXTOPER(node) + EXTRA_STEP_2ARGS,
-                    NEXTOPER(node) + EXTRA_STEP_2ARGS + 1);
-        }
-        else if (PL_regkind[(U8)op] == CURLY && op != CURLYX) {
-            assert(next);
-            DUMPUNTIL(NEXTOPER(node) + EXTRA_STEP_2ARGS, next);
-        }
-        else if ( op == PLUS || op == STAR) {
-            DUMPUNTIL(NEXTOPER(node), NEXTOPER(node) + 1);
-        }
-        else if (PL_regkind[(U8)op] == EXACT || op == ANYOFHs) {
-            /* Literal string, where present. */
-            node += NODE_SZ_STR(node) - 1;
-            node = NEXTOPER(node);
-        }
-        else {
-            node = NEXTOPER(node);
-            node += regarglen[(U8)op];
-        }
-        if (op == CURLYX || op == OPEN || op == SROPEN)
-            indent++;
-    }
-    CLEAR_OPTSTART;
-#ifdef DEBUG_DUMPUNTIL
-    Perl_re_printf( aTHX_  "--- %d\n", (int)indent);
-#endif
-    return node;
-}
-
-#endif /* DEBUGGING */
-
 #ifndef PERL_IN_XSUB_RE
 
 #  include "uni_keywords.h"
@@ -23578,39 +13778,39 @@ Perl_init_uniprops(pTHX)
 
     /* Set up the inversion list interpreter-level variables */
 
-    PL_XPosix_ptrs[_CC_ASCII] = _new_invlist_C_array(uni_prop_ptrs[UNI_ASCII]);
-    PL_XPosix_ptrs[_CC_ALPHANUMERIC] = _new_invlist_C_array(uni_prop_ptrs[UNI_XPOSIXALNUM]);
-    PL_XPosix_ptrs[_CC_ALPHA] = _new_invlist_C_array(uni_prop_ptrs[UNI_XPOSIXALPHA]);
-    PL_XPosix_ptrs[_CC_BLANK] = _new_invlist_C_array(uni_prop_ptrs[UNI_XPOSIXBLANK]);
-    PL_XPosix_ptrs[_CC_CASED] =  _new_invlist_C_array(uni_prop_ptrs[UNI_CASED]);
-    PL_XPosix_ptrs[_CC_CNTRL] = _new_invlist_C_array(uni_prop_ptrs[UNI_XPOSIXCNTRL]);
-    PL_XPosix_ptrs[_CC_DIGIT] = _new_invlist_C_array(uni_prop_ptrs[UNI_XPOSIXDIGIT]);
-    PL_XPosix_ptrs[_CC_GRAPH] = _new_invlist_C_array(uni_prop_ptrs[UNI_XPOSIXGRAPH]);
-    PL_XPosix_ptrs[_CC_LOWER] = _new_invlist_C_array(uni_prop_ptrs[UNI_XPOSIXLOWER]);
-    PL_XPosix_ptrs[_CC_PRINT] = _new_invlist_C_array(uni_prop_ptrs[UNI_XPOSIXPRINT]);
-    PL_XPosix_ptrs[_CC_PUNCT] = _new_invlist_C_array(uni_prop_ptrs[UNI_XPOSIXPUNCT]);
-    PL_XPosix_ptrs[_CC_SPACE] = _new_invlist_C_array(uni_prop_ptrs[UNI_XPOSIXSPACE]);
-    PL_XPosix_ptrs[_CC_UPPER] = _new_invlist_C_array(uni_prop_ptrs[UNI_XPOSIXUPPER]);
-    PL_XPosix_ptrs[_CC_VERTSPACE] = _new_invlist_C_array(uni_prop_ptrs[UNI_VERTSPACE]);
-    PL_XPosix_ptrs[_CC_WORDCHAR] = _new_invlist_C_array(uni_prop_ptrs[UNI_XPOSIXWORD]);
-    PL_XPosix_ptrs[_CC_XDIGIT] = _new_invlist_C_array(uni_prop_ptrs[UNI_XPOSIXXDIGIT]);
-
-    PL_Posix_ptrs[_CC_ASCII] = _new_invlist_C_array(uni_prop_ptrs[UNI_ASCII]);
-    PL_Posix_ptrs[_CC_ALPHANUMERIC] = _new_invlist_C_array(uni_prop_ptrs[UNI_POSIXALNUM]);
-    PL_Posix_ptrs[_CC_ALPHA] = _new_invlist_C_array(uni_prop_ptrs[UNI_POSIXALPHA]);
-    PL_Posix_ptrs[_CC_BLANK] = _new_invlist_C_array(uni_prop_ptrs[UNI_POSIXBLANK]);
-    PL_Posix_ptrs[_CC_CASED] = PL_Posix_ptrs[_CC_ALPHA];
-    PL_Posix_ptrs[_CC_CNTRL] = _new_invlist_C_array(uni_prop_ptrs[UNI_POSIXCNTRL]);
-    PL_Posix_ptrs[_CC_DIGIT] = _new_invlist_C_array(uni_prop_ptrs[UNI_POSIXDIGIT]);
-    PL_Posix_ptrs[_CC_GRAPH] = _new_invlist_C_array(uni_prop_ptrs[UNI_POSIXGRAPH]);
-    PL_Posix_ptrs[_CC_LOWER] = _new_invlist_C_array(uni_prop_ptrs[UNI_POSIXLOWER]);
-    PL_Posix_ptrs[_CC_PRINT] = _new_invlist_C_array(uni_prop_ptrs[UNI_POSIXPRINT]);
-    PL_Posix_ptrs[_CC_PUNCT] = _new_invlist_C_array(uni_prop_ptrs[UNI_POSIXPUNCT]);
-    PL_Posix_ptrs[_CC_SPACE] = _new_invlist_C_array(uni_prop_ptrs[UNI_POSIXSPACE]);
-    PL_Posix_ptrs[_CC_UPPER] = _new_invlist_C_array(uni_prop_ptrs[UNI_POSIXUPPER]);
-    PL_Posix_ptrs[_CC_VERTSPACE] = NULL;
-    PL_Posix_ptrs[_CC_WORDCHAR] = _new_invlist_C_array(uni_prop_ptrs[UNI_POSIXWORD]);
-    PL_Posix_ptrs[_CC_XDIGIT] = _new_invlist_C_array(uni_prop_ptrs[UNI_POSIXXDIGIT]);
+    PL_XPosix_ptrs[CC_ASCII_] = _new_invlist_C_array(uni_prop_ptrs[UNI_ASCII]);
+    PL_XPosix_ptrs[CC_ALPHANUMERIC_] = _new_invlist_C_array(uni_prop_ptrs[UNI_XPOSIXALNUM]);
+    PL_XPosix_ptrs[CC_ALPHA_] = _new_invlist_C_array(uni_prop_ptrs[UNI_XPOSIXALPHA]);
+    PL_XPosix_ptrs[CC_BLANK_] = _new_invlist_C_array(uni_prop_ptrs[UNI_XPOSIXBLANK]);
+    PL_XPosix_ptrs[CC_CASED_] =  _new_invlist_C_array(uni_prop_ptrs[UNI_CASED]);
+    PL_XPosix_ptrs[CC_CNTRL_] = _new_invlist_C_array(uni_prop_ptrs[UNI_XPOSIXCNTRL]);
+    PL_XPosix_ptrs[CC_DIGIT_] = _new_invlist_C_array(uni_prop_ptrs[UNI_XPOSIXDIGIT]);
+    PL_XPosix_ptrs[CC_GRAPH_] = _new_invlist_C_array(uni_prop_ptrs[UNI_XPOSIXGRAPH]);
+    PL_XPosix_ptrs[CC_LOWER_] = _new_invlist_C_array(uni_prop_ptrs[UNI_XPOSIXLOWER]);
+    PL_XPosix_ptrs[CC_PRINT_] = _new_invlist_C_array(uni_prop_ptrs[UNI_XPOSIXPRINT]);
+    PL_XPosix_ptrs[CC_PUNCT_] = _new_invlist_C_array(uni_prop_ptrs[UNI_XPOSIXPUNCT]);
+    PL_XPosix_ptrs[CC_SPACE_] = _new_invlist_C_array(uni_prop_ptrs[UNI_XPOSIXSPACE]);
+    PL_XPosix_ptrs[CC_UPPER_] = _new_invlist_C_array(uni_prop_ptrs[UNI_XPOSIXUPPER]);
+    PL_XPosix_ptrs[CC_VERTSPACE_] = _new_invlist_C_array(uni_prop_ptrs[UNI_VERTSPACE]);
+    PL_XPosix_ptrs[CC_WORDCHAR_] = _new_invlist_C_array(uni_prop_ptrs[UNI_XPOSIXWORD]);
+    PL_XPosix_ptrs[CC_XDIGIT_] = _new_invlist_C_array(uni_prop_ptrs[UNI_XPOSIXXDIGIT]);
+
+    PL_Posix_ptrs[CC_ASCII_] = _new_invlist_C_array(uni_prop_ptrs[UNI_ASCII]);
+    PL_Posix_ptrs[CC_ALPHANUMERIC_] = _new_invlist_C_array(uni_prop_ptrs[UNI_POSIXALNUM]);
+    PL_Posix_ptrs[CC_ALPHA_] = _new_invlist_C_array(uni_prop_ptrs[UNI_POSIXALPHA]);
+    PL_Posix_ptrs[CC_BLANK_] = _new_invlist_C_array(uni_prop_ptrs[UNI_POSIXBLANK]);
+    PL_Posix_ptrs[CC_CASED_] = PL_Posix_ptrs[CC_ALPHA_];
+    PL_Posix_ptrs[CC_CNTRL_] = _new_invlist_C_array(uni_prop_ptrs[UNI_POSIXCNTRL]);
+    PL_Posix_ptrs[CC_DIGIT_] = _new_invlist_C_array(uni_prop_ptrs[UNI_POSIXDIGIT]);
+    PL_Posix_ptrs[CC_GRAPH_] = _new_invlist_C_array(uni_prop_ptrs[UNI_POSIXGRAPH]);
+    PL_Posix_ptrs[CC_LOWER_] = _new_invlist_C_array(uni_prop_ptrs[UNI_POSIXLOWER]);
+    PL_Posix_ptrs[CC_PRINT_] = _new_invlist_C_array(uni_prop_ptrs[UNI_POSIXPRINT]);
+    PL_Posix_ptrs[CC_PUNCT_] = _new_invlist_C_array(uni_prop_ptrs[UNI_POSIXPUNCT]);
+    PL_Posix_ptrs[CC_SPACE_] = _new_invlist_C_array(uni_prop_ptrs[UNI_POSIXSPACE]);
+    PL_Posix_ptrs[CC_UPPER_] = _new_invlist_C_array(uni_prop_ptrs[UNI_POSIXUPPER]);
+    PL_Posix_ptrs[CC_VERTSPACE_] = NULL;
+    PL_Posix_ptrs[CC_WORDCHAR_] = _new_invlist_C_array(uni_prop_ptrs[UNI_POSIXWORD]);
+    PL_Posix_ptrs[CC_XDIGIT_] = _new_invlist_C_array(uni_prop_ptrs[UNI_POSIXXDIGIT]);
 
     PL_GCB_invlist = _new_invlist_C_array(_Perl_GCB_invlist);
     PL_SB_invlist = _new_invlist_C_array(_Perl_SB_invlist);
@@ -24377,8 +14577,6 @@ S_parse_uniprop_string(pTHX_
     } /* End of parsing through the lhs of the property name (or all of it if
          no rhs) */
 
-#  define STRLENs(s)  (sizeof("" s "") - 1)
-
     /* If there is a single package name 'utf8::', it is ambiguous.  It could
      * be for a user-defined property, or it could be a Unicode property, as
      * all of them are considered to be for that package.  For the purposes of
@@ -24415,7 +14613,7 @@ S_parse_uniprop_string(pTHX_
             &&  name[i] != '+'
             &&  name[i] != '_'
             &&  name[i] != '{'
-                /* A backslash means the real delimitter is the next character,
+                /* A backslash means the real delimiter is the next character,
                  * but it must be punctuation */
             && (name[i] != '\\' || (i < name_len && isPUNCT_A(name[i+1]))))
         {
@@ -24434,7 +14632,7 @@ S_parse_uniprop_string(pTHX_
                 const char * const * prop_values;
                 bool escaped = 0;
 
-                /* Backslash => delimitter is the character following.  We
+                /* Backslash => delimiter is the character following.  We
                  * already checked that it is punctuation */
                 if (open == '\\') {
                     open = name[i++];
@@ -24683,15 +14881,15 @@ S_parse_uniprop_string(pTHX_
                 }
 
                 this_string = newAV();
-                av_push(this_string, newSVuv(cp));
+                av_push_simple(this_string, newSVuv(cp));
 
                 do {
                     cp = valid_utf8_to_uvchr((U8 *) remaining, &character_len);
-                    av_push(this_string, newSVuv(cp));
+                    av_push_simple(this_string, newSVuv(cp));
                     remaining += character_len;
                 } while (remaining < SvEND(character));
 
-                av_push(*strings, (SV *) this_string);
+                av_push_simple(*strings, (SV *) this_string);
             }
 
             return prop_definition;
@@ -24900,7 +15098,7 @@ S_parse_uniprop_string(pTHX_
         &&  name[non_pkg_begin+0] == 'I'
         && (name[non_pkg_begin+1] == 'n' || name[non_pkg_begin+1] == 's'))
     {
-        /* Names that start with In have different characterstics than those
+        /* Names that start with In have different characteristics than those
          * that start with Is */
         if (name[non_pkg_begin+1] == 's') {
             starts_with_Is = TRUE;
@@ -25466,7 +15664,7 @@ S_parse_uniprop_string(pTHX_
     if (table_index > MAX_UNI_KEYWORD_INDEX) {
         Size_t warning_offset = table_index / MAX_UNI_KEYWORD_INDEX;
         table_index %= MAX_UNI_KEYWORD_INDEX;
-        Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED),
+        Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED__UNICODE_PROPERTY_NAME),
                 "Use of '%.*s' in \\p{} or \\P{} is deprecated because: %s",
                 (int) name_len, name,
                 get_deprecated_property_msg(warning_offset));
@@ -25751,9 +15949,9 @@ S_handle_names_wildcard(pTHX_ const char * wname, /* wildcard name to match */
              * so we could match anywhere in that string.  We have to rule out
              * matching a code point line */
             char * this_name_start = all_names_start
-                                                + RX_OFFS(subpattern_re)->start;
+                                                + RX_OFFS_START(subpattern_re,0);
             char * this_name_end   = all_names_start
-                                                + RX_OFFS(subpattern_re)->end;
+                                                + RX_OFFS_END(subpattern_re,0);
             char * cp_start;
             char * cp_end;
             UV cp = 0;      /* Silences some compilers */
@@ -25842,7 +16040,7 @@ S_handle_names_wildcard(pTHX_ const char * wname, /* wildcard name to match */
                     }
 
                     is_multi = TRUE;
-                    av_push(this_string, newSVuv(cp));
+                    av_push_simple(this_string, newSVuv(cp));
                 }
             }
 
@@ -25851,7 +16049,7 @@ S_handle_names_wildcard(pTHX_ const char * wname, /* wildcard name to match */
                     *strings = newAV();
                 }
 
-                av_push(*strings, (SV *) this_string);
+                av_push_simple(*strings, (SV *) this_string);
             }
             else {  /* Only a single code point */
                 *prop_definition = add_cp_to_invlist(*prop_definition, cp);
index b10b322..31c91e6 100644 (file)
 
 #if ! defined(PERL_REGCOMP_H_) && (   defined(PERL_CORE)            \
                                    || defined(PERL_EXT_RE_BUILD))
+
 #define PERL_REGCOMP_H_
 
+#ifndef RE_PESSIMISTIC_PARENS
+/* Define this to 1 if you want to enable a really aggressive and
+ * inefficient paren cleanup during backtracking which should ensure
+ * correctness. Doing so should fix any bugs related to backreferences,
+ * at the cost of saving and restoring paren state far more than we
+ * necessarily must.
+ *
+ * When it is set to 0 we try to optimize away unnecessary save/restore
+ * operations which could potentially introduce bugs. We should pass our
+ * test suite with this as 0, but setting it to 1 might fix cases we do
+ * not currently test for. If setting this to 1 does fix a bug, then
+ * review the code related to storing and restoring paren state.
+ *
+ * See comment for VOLATILE_REF below for more details of a
+ * related case.
+ */
+#define RE_PESSIMISTIC_PARENS 0
+#endif
+
+/* a VOLATILE_REF is a ref which is inside of a capturing group and it
+ * refers to the capturing group it is inside of or to a following capture
+ * group which might be affected by what this capture group matches, and
+ * thus the ref requires additional backtracking support. For example:
+ *
+ *  "xa=xaaa" =~ /^(xa|=?\1a){2}\z/
+ *
+ * should not match.  In older perls the matching process would go like this:
+ *
+ * Iter 1: "xa" matches in capture group.
+ * Iter 2: "xa" does not match, goes to next alternation.
+ *         "=" matches in =?
+ *         Bifurcates here (= might not match)
+ *         "xa" matches via \1 from previous iteration
+ *         "a" matches via "a" at end of second alternation
+ *         # at this point $1 is "=xaa"
+ *         \z  does not match -> backtracks.
+ * Backtracks to Iter 2 "=?" Bifurcation point where we have NOT matched "="
+ *         "=xaa" matches via \1 (as $1 has not been reset)
+ *         "a" matches via "a" at end of second alternation
+ *         "\z" does match. -> Pattern matches overall.
+ *
+ * What should happen and now does happen instead is:
+ *
+ * Backtracks to Iter 2 "=?" Bifurcation point where we have NOT matched "=",
+ *         \1 does not match as it is "xa" (as $1 was reset when backtracked)
+ *         and the current character in the string is an "="
+ *
+ * The fact that \1 in this case is marked as a VOLATILE_REF is what ensures
+ * that we reset the capture buffer properly.
+ *
+ * See 59db194299c94c6707095797c3df0e2f67ff82b2
+ * and 38508ce8fc3a1bd12a3bb65e9d4ceb9b396a18db
+ * for more details.
+ */
+#define VOLATILE_REF 1
+
 #include "regcharclass.h"
 
 /* Convert branch sequences to more efficient trie ops? */
@@ -81,6 +138,7 @@ typedef struct regexp_internal {
 #define RXi_SET(x,y) (x)->pprivate = (void*)(y)   
 #define RXi_GET(x)   ((regexp_internal *)((x)->pprivate))
 #define RXi_GET_DECL(r,ri) regexp_internal *ri = RXi_GET(r)
+#define RXi_GET_DECL_NULL(r,ri) regexp_internal *ri = (r) ? RXi_GET(r) : NULL
 /*
  * Flags stored in regexp->intflags
  * These are used only internally to the regexp engine
@@ -106,6 +164,7 @@ typedef struct regexp_internal {
 #define PREGf_ANCH_SBOL         0x00000800
 #define PREGf_ANCH_GPOS         0x00001000
 #define PREGf_RECURSE_SEEN      0x00002000
+#define PREGf_PESSIMIZE_SEEN    0x00004000
 
 #define PREGf_ANCH              \
     ( PREGf_ANCH_SBOL | PREGf_ANCH_GPOS | PREGf_ANCH_MBOL )
@@ -119,16 +178,36 @@ typedef struct regexp_internal {
  * change things without care. If you look at regexp.h you will see it
  * contains this:
  *
+ * union regnode_head {
+ *   struct {
+ *     union {
+ *       U8 flags;
+ *       U8 str_len_u8;
+ *       U8 first_byte;
+ *     } u_8;
+ *     U8  type;
+ *     U16 next_off;
+ *   } data;
+ *   U32 data_u32;
+ * };
+ *
  * struct regnode {
- *   U8  flags;
- *   U8  type;
- *   U16 next_off;
+ *   union regnode_head head;
  * };
  *
- * This structure is the base unit of elements in the regexp program. When
- * we increment our way through the program we increment by the size of this
- * structure, and in all cases where regnode sizing is considered it is in
- * units of this structure.
+ * Which really is a complicated and alignment friendly version of
+ *
+ *  struct {
+ *    U8  flags;
+ *    U8  type;
+ *    U16 next_off;
+ *  };
+ *
+ * This structure is the base unit of elements in the regexp program.
+ * When we increment our way through the program we increment by the
+ * size of this structure (32 bits), and in all cases where regnode
+ * sizing is considered it is in units of this structure. All regnodes
+ * have a union regnode_head as their first parameter.
  *
  * This implies that no regnode style structure should contain 64 bit
  * aligned members. Since the base regnode is 32 bits any member might
@@ -151,36 +230,40 @@ typedef struct regexp_internal {
  * we already have support for in the data array.
  */
 
+union regnode_arg {
+    I32 i32;
+    U32 u32;
+    struct {
+        U16 u16a;
+        U16 u16b;
+    } hi_lo;
+};
+
+
 struct regnode_string {
-    U8 str_len;
-    U8  type;
-    U16 next_off;
+    union regnode_head head;
     char string[1];
 };
 
 struct regnode_lstring { /* Constructed this way to keep the string aligned. */
-    U8 flags;
-    U8  type;
-    U16 next_off;
-    U32 str_len;    /* Only 18 bits allowed before would overflow 'next_off' */
+    union regnode_head head;
+    U32 str_len_u32;    /* Only 18 bits allowed before would overflow 'next_off' */
     char string[1];
 };
 
 struct regnode_anyofhs { /* Constructed this way to keep the string aligned. */
-    U8 str_len;
-    U8  type;
-    U16 next_off;
-    U32 arg1;                           /* set by set_ANYOF_arg() */
+    union regnode_head head;
+    union regnode_arg arg1;
     char string[1];
 };
 
-/* Argument bearing node - workhorse, 
-   arg1 is often for the data field */
+/* Argument bearing node - workhorse, ARG1u() is often used for the data field
+ * Can store either a signed 32 bit value via ARG1i() or unsigned 32 bit value
+ * via ARG1u(), or two unsigned 16 bit values via ARG1a() or ARG1b()
+ */
 struct regnode_1 {
-    U8 flags;
-    U8  type;
-    U16 next_off;
-    U32 arg1;
+    union regnode_head head;
+    union regnode_arg arg1;
 };
 
 /* Node whose argument is 'SV *'.  This needs to be used very carefully in
@@ -199,31 +282,48 @@ struct regnode_1 {
  * then use inline functions to copy the data in or out.
  * */
 struct regnode_p {
-    U8 flags;
-    U8  type;
-    U16 next_off;
+    union regnode_head head;
     char arg1_sv_ptr_bytes[sizeof(SV *)];
 };
 
-/* Similar to a regnode_1 but with an extra signed argument */
-struct regnode_2L {
-    U8 flags;
-    U8  type;
-    U16 next_off;
-    U32 arg1;
-    I32 arg2;
+/* "Two Node" - similar to a regnode_1 but with space for an extra 32
+ * bit value, or two 16 bit valus. The first fields must match regnode_1.
+ * Extra field can be accessed as (U32)ARG2u() (I32)ARG2i() or (U16)ARG2a()
+ * and (U16)ARG2b() */
+struct regnode_2 {
+    union regnode_head head;
+    union regnode_arg arg1;
+    union regnode_arg arg2;
 };
 
-/* 'Two field' -- Two 16 bit unsigned args */
-struct regnode_2 {
-    U8 flags;
-    U8  type;
-    U16 next_off;
-    U16 arg1;
-    U16 arg2;
+/* "Three Node" - similar to a regnode_2 but with space for an additional
+ * 32 bit value, or two 16 bit values. The first fields must match regnode_2.
+ * The extra field can be accessed as (U32)ARG3u() (I32)ARG3i() or (U16)ARG3a()
+ * and (U16)ARG3b().
+ * Currently used for the CURLY style regops used to represent quantifers,
+ * storing the min and of the quantifier via ARG1i() and ARG2i(), along with
+ * ARG3a() and ARG3b() which are used to store information about the number of
+ * parens before and inside the quantified expression. */
+struct regnode_3 {
+    union regnode_head head;
+    union regnode_arg arg1;
+    union regnode_arg arg2;
+    union regnode_arg arg3;
 };
 
-#define ANYOF_BITMAP_SIZE      (NUM_ANYOF_CODE_POINTS / 8)   /* 8 bits/Byte */
+#define REGNODE_BBM_BITMAP_LEN                                                  \
+                      /* 6 info bits requires 64 bits; 5 => 32 */               \
+                    ((1 << (UTF_CONTINUATION_BYTE_INFO_BITS)) / CHARBITS)
+
+/* Used for matching any two-byte UTF-8 character whose start byte is known.
+ * The array is a bitmap capable of representing any possible continuation
+ * byte. */
+struct regnode_bbm {
+    union regnode_head head;
+    U8 bitmap[REGNODE_BBM_BITMAP_LEN];
+};
+
+#define ANYOF_BITMAP_SIZE      (NUM_ANYOF_CODE_POINTS / CHARBITS)
 
 /* Note that these form structs which are supersets of the next smaller one, by
  * appending fields.  Alignment problems can occur if one of those optional
@@ -235,22 +335,18 @@ struct regnode_2 {
  * the code that inserts and deletes regnodes.  The basic single-argument
  * regnode has a U32, which is what reganode() allocates as a unit.  Therefore
  * no field can require stricter alignment than U32. */
-
+    
 /* also used by trie */
 struct regnode_charclass {
-    U8 flags;
-    U8  type;
-    U16 next_off;
-    U32 arg1;                           /* set by set_ANYOF_arg() */
+    union regnode_head head;
+    union regnode_arg arg1;
     char bitmap[ANYOF_BITMAP_SIZE];    /* only compile-time */
 };
 
 /* has runtime (locale) \d, \w, ..., [:posix:] classes */
 struct regnode_charclass_posixl {
-    U8 flags;                      /* ANYOF_MATCHES_POSIXL bit must go here */
-    U8  type;
-    U16 next_off;
-    U32 arg1;
+    union regnode_head head;
+    union regnode_arg arg1;
     char bitmap[ANYOF_BITMAP_SIZE];            /* both compile-time ... */
     U32 classflags;                            /* and run-time */
 };
@@ -269,10 +365,8 @@ struct regnode_charclass_posixl {
  * never a next node.
  */
 struct regnode_ssc {
-    U8 flags;                      /* ANYOF_MATCHES_POSIXL bit must go here */
-    U8  type;
-    U16 next_off;
-    U32 arg1;
+    union regnode_head head;
+    union regnode_arg arg1;
     char bitmap[ANYOF_BITMAP_SIZE];    /* both compile-time ... */
     U32 classflags;                    /* ... and run-time */
 
@@ -289,31 +383,34 @@ struct regnode_ssc {
  *  to 12 regnode units on 32-bit systems, (hence the minimum this can be (if
  *  not 0) is 11 there.  Even if things get tightly packed on a 64-bit system,
  *  it still would be more than 1. */
-#define set_ANYOF_SYNTHETIC(n) STMT_START{ OP(n) = ANYOF;              \
-                                           NEXT_OFF(n) = 1;            \
-                               } STMT_END
-#define is_ANYOF_SYNTHETIC(n) (PL_regkind[OP(n)] == ANYOF && NEXT_OFF(n) == 1)
+#define set_ANYOF_SYNTHETIC(n)  \
+    STMT_START{                 \
+        OP(n) = ANYOF;          \
+        NEXT_OFF(n) = 1;        \
+    } STMT_END
+
+#define is_ANYOF_SYNTHETIC(n) (REGNODE_TYPE(OP(n)) == ANYOF && NEXT_OFF(n) == 1)
 
 /* XXX fix this description.
    Impose a limit of REG_INFTY on various pattern matching operations
    to limit stack growth and to avoid "infinite" recursions.
 */
-/* The default size for REG_INFTY is U16_MAX, which is the same as
-   USHORT_MAX (see perl.h).  Unfortunately U16 isn't necessarily 16 bits
-   (see handy.h).  On the Cray C90, sizeof(short)==4 and hence U16_MAX is
-   ((1<<32)-1), while on the Cray T90, sizeof(short)==8 and U16_MAX is
-   ((1<<64)-1).  To limit stack growth to reasonable sizes, supply a
+/* The default size for REG_INFTY is I32_MAX, which is the same as UINT_MAX
+   (see perl.h). Unfortunately I32 isn't necessarily 32 bits (see handy.h).
+   On the Cray C90, or Cray T90, I32_MAX is considerably larger than it
+   might be elsewhere. To limit stack growth to reasonable sizes, supply a
    smaller default.
         --Andy Dougherty  11 June 1998
+        --Amended by Yves Orton 15 Jan 2023
 */
-#if SHORTSIZE > 2
+#if INTSIZE > 4
 #  ifndef REG_INFTY
-#    define REG_INFTY  nBIT_UMAX(16)
+#    define REG_INFTY  nBIT_IMAX(32)
 #  endif
 #endif
 
 #ifndef REG_INFTY
-#  define REG_INFTY U16_MAX
+#  define REG_INFTY I32_MAX
 #endif
 
 #define ARG_VALUE(arg) (arg)
@@ -323,23 +420,48 @@ struct regnode_ssc {
 #undef ARG1
 #undef ARG2
 
-#define ARG(p) ARG_VALUE(ARG_LOC(p))
+/* convention: each arg is is 32 bits, with the "u" suffix
+ * being unsigned 32 bits, the "i" suffix being signed 32 bits,
+ * and the "a" and "b" suffixes being unsigned 16 bit fields.
+ *
+ * We provide all 4 macros for each case for consistency, even
+ * though they arent all used.
+ */
+
+#define ARG1u(p) ARG_VALUE(ARG1u_LOC(p))
+#define ARG1i(p) ARG_VALUE(ARG1i_LOC(p))
+#define ARG1a(p) ARG_VALUE(ARG1a_LOC(p))
+#define ARG1b(p) ARG_VALUE(ARG1b_LOC(p))
+
+#define ARG2u(p) ARG_VALUE(ARG2u_LOC(p))
+#define ARG2i(p) ARG_VALUE(ARG2i_LOC(p))
+#define ARG2a(p) ARG_VALUE(ARG2a_LOC(p))
+#define ARG2b(p) ARG_VALUE(ARG2b_LOC(p))
+
+#define ARG3u(p) ARG_VALUE(ARG3u_LOC(p))
+#define ARG3i(p) ARG_VALUE(ARG3i_LOC(p))
+#define ARG3a(p) ARG_VALUE(ARG3a_LOC(p))
+#define ARG3b(p) ARG_VALUE(ARG3b_LOC(p))
+
 #define ARGp(p) ARGp_VALUE_inline(p)
-#define ARG1(p) ARG_VALUE(ARG1_LOC(p))
-#define ARG2(p) ARG_VALUE(ARG2_LOC(p))
-#define ARG2L(p) ARG_VALUE(ARG2L_LOC(p))
-
-#define ARG_SET(p, val) ARG__SET(ARG_LOC(p), (val))
-#define ARG1_SET(p, val) ARG__SET(ARG1_LOC(p), (val))
-#define ARG2_SET(p, val) ARG__SET(ARG2_LOC(p), (val))
-#define ARG2L_SET(p, val) ARG__SET(ARG2L_LOC(p), (val))
-#define ARGp_SET(p, val) ARGp_SET_inline((p),(val))
 
-#undef NEXT_OFF
-#undef NODE_ALIGN
+#define ARG1u_SET(p, val) ARG__SET(ARG1u_LOC(p), (val))
+#define ARG1i_SET(p, val) ARG__SET(ARG1i_LOC(p), (val))
+#define ARG1a_SET(p, val) ARG__SET(ARG1a_LOC(p), (val))
+#define ARG1b_SET(p, val) ARG__SET(ARG1b_LOC(p), (val))
+
+#define ARG2u_SET(p, val) ARG__SET(ARG2u_LOC(p), (val))
+#define ARG2i_SET(p, val) ARG__SET(ARG2i_LOC(p), (val))
+#define ARG2a_SET(p, val) ARG__SET(ARG2a_LOC(p), (val))
+#define ARG2b_SET(p, val) ARG__SET(ARG2b_LOC(p), (val))
+
+#define ARG3u_SET(p, val) ARG__SET(ARG3u_LOC(p), (val))
+#define ARG3i_SET(p, val) ARG__SET(ARG3i_LOC(p), (val))
+#define ARG3a_SET(p, val) ARG__SET(ARG3a_LOC(p), (val))
+#define ARG3b_SET(p, val) ARG__SET(ARG3b_LOC(p), (val))
+
+#define ARGp_SET(p, val) ARGp_SET_inline((p),(val))
 
-#define NEXT_OFF(p) ((p)->next_off)
-#define NODE_ALIGN(node)
 /* the following define was set to 0xde in 075abff3
  * as part of some linting logic. I have set it to 0
  * as otherwise in every place where we /might/ set flags
@@ -349,23 +471,32 @@ struct regnode_ssc {
  * is changed from 0 then at the very least make sure
  * that SBOL for /^/ sets the flags to 0 explicitly.
  * -- Yves */
-#define NODE_ALIGN_FILL(node) ((node)->flags = 0)
 
+#define NODE_ALIGN(node)
 #define SIZE_ALIGN NODE_ALIGN
 
 #undef OP
 #undef OPERAND
 #undef STRING
+#undef NEXT_OFF
+#undef NODE_ALIGN
 
-#define        OP(p)           ((p)->type)
-#define FLAGS(p)       ((p)->flags)    /* Caution: Doesn't apply to all      \
+#define NEXT_OFF(p)     ((p)->head.data.next_off)
+#define OP(p)           ((p)->head.data.type)
+#define STR_LEN_U8(p)   ((p)->head.data.u_8.str_len_u8)
+#define FIRST_BYTE(p)   ((p)->head.data.u_8.first_byte)
+#define FLAGS(p)        ((p)->head.data.u_8.flags) /* Caution: Doesn't apply to all      \
                                            regnode types.  For some, it's the \
                                            character set of the regnode */
-#define        STR_LENs(p)     (__ASSERT_(OP(p) != LEXACT && OP(p) != LEXACT_REQ8)  \
-                                    ((struct regnode_string *)p)->str_len)
-#define        STRINGs(p)      (__ASSERT_(OP(p) != LEXACT && OP(p) != LEXACT_REQ8)  \
+#define STR_LENs(p)    (__ASSERT_(OP(p) != LEXACT && OP(p) != LEXACT_REQ8)  \
+                                    STR_LEN_U8((struct regnode_string *)p))
+#define STRINGs(p)     (__ASSERT_(OP(p) != LEXACT && OP(p) != LEXACT_REQ8)  \
                                     ((struct regnode_string *)p)->string)
-#define        OPERANDs(p)     STRINGs(p)
+#define OPERANDs(p)    STRINGs(p)
+
+#define PARNO(p)        ARG1u(p)          /* APPLIES for OPEN and CLOSE only */
+
+#define NODE_ALIGN_FILL(node) (FLAGS(node) = 0)
 
 /* Long strings.  Currently limited to length 18 bits, which handles a 262000
  * byte string.  The limiting factor is the 16 bit 'next_off' field, which
@@ -379,55 +510,158 @@ struct regnode_ssc {
  * node to be an ARG2L, using the second 32 bit field for the length, and not
  * using the flags nor next_off fields at all.  One could have an llstring node
  * and even an lllstring type. */
-#define        STR_LENl(p)     (__ASSERT_(OP(p) == LEXACT || OP(p) == LEXACT_REQ8)  \
-                                    (((struct regnode_lstring *)p)->str_len))
-#define        STRINGl(p)      (__ASSERT_(OP(p) == LEXACT || OP(p) == LEXACT_REQ8)  \
+#define STR_LENl(p)    (__ASSERT_(OP(p) == LEXACT || OP(p) == LEXACT_REQ8)  \
+                                    (((struct regnode_lstring *)p)->str_len_u32))
+#define STRINGl(p)     (__ASSERT_(OP(p) == LEXACT || OP(p) == LEXACT_REQ8)  \
                                     (((struct regnode_lstring *)p)->string))
-#define        OPERANDl(p)     STRINGl(p)
+#define OPERANDl(p)    STRINGl(p)
 
-#define        STR_LEN(p)      ((OP(p) == LEXACT || OP(p) == LEXACT_REQ8)           \
+#define STR_LEN(p)     ((OP(p) == LEXACT || OP(p) == LEXACT_REQ8)           \
                                                ? STR_LENl(p) : STR_LENs(p))
-#define        STRING(p)       ((OP(p) == LEXACT || OP(p) == LEXACT_REQ8)           \
+#define STRING(p)      ((OP(p) == LEXACT || OP(p) == LEXACT_REQ8)           \
                                                ? STRINGl(p)  : STRINGs(p))
-#define        OPERAND(p)      STRING(p)
+#define OPERAND(p)     STRING(p)
 
 /* The number of (smallest) regnode equivalents that a string of length l bytes
- * occupies */
+ * occupies - Used by the REGNODE_AFTER() macros and functions. */
 #define STR_SZ(l)      (((l) + sizeof(regnode) - 1) / sizeof(regnode))
 
-/* The number of (smallest) regnode equivalents that the EXACTISH node 'p'
- * occupies */
-#define NODE_SZ_STR(p) (STR_SZ(STR_LEN(p)) + 1 + regarglen[(p)->type])
-
 #define setSTR_LEN(p,v)                                                     \
     STMT_START{                                                             \
         if (OP(p) == LEXACT || OP(p) == LEXACT_REQ8)                        \
-            ((struct regnode_lstring *)(p))->str_len = (v);                 \
+            ((struct regnode_lstring *)(p))->str_len_u32 = (v);             \
         else                                                                \
-            ((struct regnode_string *)(p))->str_len = (v);                  \
+            STR_LEN_U8((struct regnode_string *)(p)) = (v);                 \
     } STMT_END
 
 #define ANYOFR_BASE_BITS    20
-#define ANYOFRbase(p)   (ARG(p) & nBIT_MASK(ANYOFR_BASE_BITS))
-#define ANYOFRdelta(p)  (ARG(p) >> ANYOFR_BASE_BITS)
+#define ANYOFRbase(p)   (ARG1u(p) & nBIT_MASK(ANYOFR_BASE_BITS))
+#define ANYOFRdelta(p)  (ARG1u(p) >> ANYOFR_BASE_BITS)
 
 #undef NODE_ALIGN
 #undef ARG_LOC
-#undef NEXTOPER
-#undef PREVOPER
 
-#define        NODE_ALIGN(node)
-#define        ARG_LOC(p)      (((struct regnode_1 *)p)->arg1)
+#define NODE_ALIGN(node)
 #define ARGp_BYTES_LOC(p)  (((struct regnode_p *)p)->arg1_sv_ptr_bytes)
-#define        ARG1_LOC(p)     (((struct regnode_2 *)p)->arg1)
-#define        ARG2_LOC(p)     (((struct regnode_2 *)p)->arg2)
-#define ARG2L_LOC(p)   (((struct regnode_2L *)p)->arg2)
-
+#define ARG1u_LOC(p)    (((struct regnode_1 *)p)->arg1.u32)
+#define ARG1i_LOC(p)    (((struct regnode_1 *)p)->arg1.i32)
+#define ARG1a_LOC(p)    (((struct regnode_1 *)p)->arg1.hi_lo.u16a)
+#define ARG1b_LOC(p)    (((struct regnode_1 *)p)->arg1.hi_lo.u16b)
+#define ARG2u_LOC(p)    (((struct regnode_2 *)p)->arg2.u32)
+#define ARG2i_LOC(p)    (((struct regnode_2 *)p)->arg2.i32)
+#define ARG2a_LOC(p)    (((struct regnode_2 *)p)->arg2.hi_lo.u16a)
+#define ARG2b_LOC(p)    (((struct regnode_2 *)p)->arg2.hi_lo.u16b)
+#define ARG3u_LOC(p)    (((struct regnode_3 *)p)->arg3.u32)
+#define ARG3i_LOC(p)    (((struct regnode_3 *)p)->arg3.i32)
+#define ARG3a_LOC(p)    (((struct regnode_3 *)p)->arg3.hi_lo.u16a)
+#define ARG3b_LOC(p)    (((struct regnode_3 *)p)->arg3.hi_lo.u16b)
+
+/* These should no longer be used directly in most cases. Please use
+ * the REGNODE_AFTER() macros instead. */
 #define NODE_STEP_REGNODE      1       /* sizeof(regnode)/sizeof(regnode) */
-#define EXTRA_STEP_2ARGS       EXTRA_SIZE(struct regnode_2)
 
-#define        NEXTOPER(p)     ((p) + NODE_STEP_REGNODE)
-#define        PREVOPER(p)     ((p) - NODE_STEP_REGNODE)
+/* Core macros for computing "the regnode after this one". See also
+ * Perl_regnode_after() in reginline.h
+ *
+ * At the struct level regnodes are a linked list, with each node pointing
+ * at the next (via offsets), usually via the C<next_off> field in the
+ * structure. Where there is a need for a node to have two children the
+ * immediate physical successor of the node in the compiled program is used
+ * to represent one of them. A good example is the BRANCH construct,
+ * consider the pattern C</head(?:[ab]foo|[cd]bar)tail/>
+ *
+ *      1: EXACT <head> (3)
+ *      3: BRANCH (8)
+ *      4:   ANYOFR[ab] (6)
+ *      6:   EXACT <foo> (14)
+ *      8: BRANCH (FAIL)
+ *      9:   ANYOFR[cd] (11)
+ *     11:   EXACT <bar> (14)
+ *     13: TAIL (14)
+ *     14: EXACT <tail> (16)
+ *     16: END (0)
+ *
+ * The numbers in parens at the end of each line show the "next_off" value
+ * for that regnode in the program. We can see that the C<next_off> of
+ * the first BRANCH node (#3) is the second BRANCH node (#8), and indicates
+ * where execution should go if the regnodes *following* the BRANCH node fail
+ * to accept the input string. Thus to find the "next BRANCH" we would do
+ * C<Perl_regnext()> and follow the C<next_off> pointer, and to find
+ * the "BRANCHes contents" we would use C<REGNODE_AFTER()>.
+ *
+ * Be aware that C<REGNODE_AFTER()> is not guaranteed to give a *useful*
+ * result once the regex peephole optimizer has run (it will be correct
+ * however!). By the time code in regexec.c executes various regnodes
+ * may have been optimized out of the C<next_off> chain. An example
+ * can be seen above, node 13 will never be reached during execution
+ * flow as it has been stitched out of the C<next_off> chain. Both 6 and
+ * 11 would have pointed at it during compilation, but it exists only to
+ * facilitate the construction of the BRANCH structure and is effectively
+ * a NOOP, and thus the optimizer adjusts the links so it is skipped
+ * from execution time flow. In regexec.c it is only safe to use
+ * REGNODE_AFTER() on specific node types.
+ *
+ * Conversely during compilation C<Perl_regnext()> may not work properly
+ * as the C<next_off> may not be known until "later", (such as in the
+ * case of BRANCH nodes) and thus in regcomp.c the REGNODE_AFTER() macro
+ * is used very heavily instead.
+ *
+ * There are several variants of the REGNODE_AFTER_xxx() macros which
+ * are intended for use in different situations depending on how
+ * confident the code is about what type of node it is trying to find a
+ * successor for.
+ *
+ * So for instance if you know you are dealing with a known node type of
+ * constant size then you should use REGNODE_AFTER_type(n,TYPE).
+ *
+ * If you have a regnode pointer and you know you are dealing with a
+ * regnode type of constant size and you have already extracted its
+ * opcode use: REGNODE_AFTER_opcode(n,OPCODE).
+ *
+ * If you have a regnode and you know it is variable size then you
+ * you can produce optimized code by using REGNODE_AFTER_varies(n).
+ *
+ * If you have a regnode pointer and nothing else use: REGNODE_AFTER(n)
+ * This is the safest option and wraps C<Perl_regnode_after()>. It
+ * should produce the correct result regardless of its argument. The
+ * other options only produce correct results under specific
+ * constraints.
+ */
+#define        REGNODE_AFTER_PLUS(p,extra)    ((p) + NODE_STEP_REGNODE + (extra))
+/* under DEBUGGING we check that all REGNODE_AFTER optimized macros did the
+ * same thing that Perl_regnode_after() would have done. Note that when
+ * not compiled under DEBUGGING the assert_() macro is empty. Thus we
+ * don't have to implement different versions for DEBUGGING and not DEBUGGING,
+ * and explains why all the macros use REGNODE_AFTER_PLUS_DEBUG() under the
+ * hood. */
+#define REGNODE_AFTER_PLUS_DEBUG(p,extra) \
+    (assert_(check_regnode_after(p,extra))  REGNODE_AFTER_PLUS((p),(extra)))
+
+/* find the regnode after this p by using the opcode we previously extracted
+ * with OP(p) */
+#define REGNODE_AFTER_opcode(p,op)          REGNODE_AFTER_PLUS_DEBUG((p),REGNODE_ARG_LEN(op))
+
+/* find the regnode after this p by using the size of the struct associated with
+ * the opcode for p. use this when you *know* that p is pointer to a given type*/
+#define REGNODE_AFTER_type(p,t)             REGNODE_AFTER_PLUS_DEBUG((p),EXTRA_SIZE(t))
+
+/* find the regnode after this p by using OP(p) to find the regnode type of p */
+#define REGNODE_AFTER_varies(p)            regnode_after(p,TRUE)
+
+/* find the regnode after this p by using OP(p) to find the regnode type of p */
+#define REGNODE_AFTER(p)            regnode_after(p,FALSE)
+
+
+/* REGNODE_BEFORE() is trickier to deal with in terms of validation, execution.
+ * All the places that use it assume that p will be one struct regnode large.
+ * So to validate it we do the math to go backwards and then validate that the
+ * type of regnode we landed on is actually one regnode large. In theory if
+ * things go wrong the opcode should be illegal or say the item should be larger
+ * than it is, etc. */
+#define        REGNODE_BEFORE_BASE(p)        ((p) - NODE_STEP_REGNODE)
+#define        REGNODE_BEFORE_BASE_DEBUG(p)        \
+    (assert_(check_regnode_after(REGNODE_BEFORE_BASE(p),0))  REGNODE_BEFORE_BASE(p))
+#define REGNODE_BEFORE(p) REGNODE_BEFORE_BASE_DEBUG(p)
 
 #define FILL_NODE(offset, op)                                           \
     STMT_START {                                                        \
@@ -439,24 +673,24 @@ struct regnode_ssc {
                     FILL_NODE(offset, op);                              \
                     (offset)++;                                         \
     } STMT_END
-#define FILL_ADVANCE_NODE_ARG(offset, op, arg)                          \
+#define FILL_ADVANCE_NODE_ARG1u(offset, op, arg)                        \
     STMT_START {                                                        \
-                    ARG_SET(REGNODE_p(offset), arg);                    \
+                    ARG1u_SET(REGNODE_p(offset), arg);                  \
                     FILL_ADVANCE_NODE(offset, op);                      \
                     /* This is used generically for other operations    \
                      * that have a longer argument */                   \
-                    (offset) += regarglen[op];                          \
+                    (offset) += REGNODE_ARG_LEN(op);                    \
     } STMT_END
-#define FILL_ADVANCE_NODE_ARGp(offset, op, arg)                          \
+#define FILL_ADVANCE_NODE_ARGp(offset, op, arg)                         \
     STMT_START {                                                        \
-                    ARGp_SET(REGNODE_p(offset), arg);                    \
+                    ARGp_SET(REGNODE_p(offset), arg);                   \
                     FILL_ADVANCE_NODE(offset, op);                      \
-                    (offset) += regarglen[op];                          \
+                    (offset) += REGNODE_ARG_LEN(op);                    \
     } STMT_END
-#define FILL_ADVANCE_NODE_2L_ARG(offset, op, arg1, arg2)                \
+#define FILL_ADVANCE_NODE_2ui_ARG(offset, op, arg1, arg2)               \
     STMT_START {                                                        \
-                    ARG_SET(REGNODE_p(offset), arg1);                   \
-                    ARG2L_SET(REGNODE_p(offset), arg2);                 \
+                    ARG1u_SET(REGNODE_p(offset), arg1);                 \
+                    ARG2i_SET(REGNODE_p(offset), arg2);                 \
                     FILL_ADVANCE_NODE(offset, op);                      \
                     (offset) += 2;                                      \
     } STMT_END
@@ -479,104 +713,137 @@ ARGp_SET_inline(struct regnode *node, SV *ptr) {
 
 #define REG_MAGIC 0234
 
-/* An ANYOF node is basically a bitmap with the index being a code point.  If
- * the bit for that code point is 1, the code point matches;  if 0, it doesn't
- * match (complemented if inverted).  There is an additional mechanism to deal
- * with cases where the bitmap is insufficient in and of itself.  This #define
- * indicates if the bitmap does fully represent what this ANYOF node can match.
- * The ARG is set to this special value (since 0, 1, ... are legal, but will
- * never reach this high). */
-#define ANYOF_ONLY_HAS_BITMAP  ((U32) -1)
-
-/* When the bitmap isn't completely sufficient for handling the ANYOF node,
- * flags (in node->flags of the ANYOF node) get set to indicate this.  These
- * are perennially in short supply.  Beyond several cases where warnings need
- * to be raised under certain circumstances, currently, there are six cases
- * where the bitmap alone isn't sufficient.  We could use six flags to
- * represent the 6 cases, but to save flags bits, we play some games.  The
- * cases are:
+/* An ANYOF node matches a single code point based on specified criteria.  It
+ * now comes in several styles, but originally it was just a 256 element
+ * bitmap, indexed by the code point (which was always just a byte).  If the
+ * corresponding bit for a code point is 1, the code point matches; if 0, it
+ * doesn't match (complemented if inverted).  This worked fine before Unicode
+ * existed, but making a bit map long enough to accommodate a bit for every
+ * possible Unicode code point is prohibitively large.  Therefore it is made
+ * much much smaller, and an inversion list is created to handle code points
+ * not represented by the bitmap.  (It is now possible to compile the bitmap to
+ * a larger size to avoid the slower inversion list lookup for however big the
+ * bitmap is set to, but this is rarely done).  If the bitmap is sufficient to
+ * specify all possible matches (with nothing outside it matching), no
+ * inversion list is needed nor included, and the argument to the ANYOF node is
+ * set to the following: */
+
+#define ANYOF_MATCHES_ALL_OUTSIDE_BITMAP_VALUE   U32_MAX
+#define ANYOF_MATCHES_ALL_OUTSIDE_BITMAP(node)                              \
+                    (ARG1u(node) == ANYOF_MATCHES_ALL_OUTSIDE_BITMAP_VALUE)
+
+#define ANYOF_MATCHES_NONE_OUTSIDE_BITMAP_VALUE                             \
+   /* Assumes ALL is odd */  (ANYOF_MATCHES_ALL_OUTSIDE_BITMAP_VALUE - 1)
+#define ANYOF_MATCHES_NONE_OUTSIDE_BITMAP(node)                             \
+                    (ARG1u(node) == ANYOF_MATCHES_NONE_OUTSIDE_BITMAP_VALUE)
+
+#define ANYOF_ONLY_HAS_BITMAP_MASK  ANYOF_MATCHES_NONE_OUTSIDE_BITMAP_VALUE
+#define ANYOF_ONLY_HAS_BITMAP(node)                                         \
+  ((ARG1u(node) & ANYOF_ONLY_HAS_BITMAP_MASK) == ANYOF_ONLY_HAS_BITMAP_MASK)
+
+#define ANYOF_HAS_AUX(node)  (! ANYOF_ONLY_HAS_BITMAP(node))
+
+/* There are also ANYOFM nodes, used when the bit patterns representing the
+ * matched code points happen to be such that they can be checked by ANDing
+ * with a mask.  The regex compiler looks for and silently optimizes to using
+ * this node type in the few cases where it works out.  The eight octal digits
+ * form such a group.  These nodes are simple and fast and no further
+ * discussion is needed here.
+ *
+ * And, there are ANYOFH-ish nodes which match only code points that aren't in
+ * the bitmap  (the H stands for High).  These are common for expressing
+ * Unicode properties concerning non-Latin scripts.  They dispense with the
+ * bitmap altogether and don't need any of the flags discussed below.
+ *
+ * And, there are ANYOFR-ish nodes which match within a single range.
+ *
+ * When there is a need to specify what matches outside the bitmap, it is done
+ * by allocating an AV as part of the pattern's compiled form, and the argument
+ * to the node instead of being ANYOF_ONLY_HAS_BITMAP, points to that AV.
+ *
+ * (Actually, that is an oversimplification.  The AV is placed into the
+ * pattern's struct reg_data, and what is stored in the node's argument field
+ * is its index into that struct.  And the inversion list is just one element,
+ * the zeroth, of the AV.)
  *
- *  1)  The bitmap has a compiled-in very finite size.  So something else needs
- *      to be used to specify if a code point that is too large for the bitmap
- *      actually matches.  The mechanism currently is an inversion
- *      list.  ANYOF_ONLY_HAS_BITMAP, described above, being TRUE indicates
- *      there are no matches of too-large code points.  But if it is FALSE,
- *      then almost certainly there are matches too large for the bitmap.  (The
- *      other cases, described below, either imply this one or are extremely
- *      rare in practice.)  So we can just assume that a too-large code point
- *      will need something beyond the bitmap if ANYOF_ONLY_HAS_BITMAP is
- *      FALSE, instead of having a separate flag for this.
- *  2)  A subset of item 1) is if all possible code points outside the bitmap
- *      match.  This is a common occurrence when the class is complemented,
- *      like /[^ij]/.  Therefore a bit is reserved to indicate this,
- *      rather than having an inversion list created,
- *      ANYOF_MATCHES_ALL_ABOVE_BITMAP.
- *  3)  Under /d rules, it can happen that code points that are in the upper
+ * There are certain situations where a single inversion list can't handle all
+ * the complexity.  These are dealt with by having extra elements in the AV, by
+ * specifying flag bits in the ANYOF node, and/or special code.  As an example,
+ * there are instances where what the ANYOF node matches is not completely
+ * known until runtime.  In these cases, a flag is set, and the bitmap has a 1
+ * for the code points which are known at compile time to be 1, and a 0 for the
+ * ones that are known to be 0, or require runtime resolution.  Some missing
+ * information can be found by merely seeing if the pattern is UTF-8 or not;
+ * other cases require looking at the extra elements in the AV.
+ *
+ * There are 5 cases where the bitmap is insufficient.  These are specified by
+ * flags in the node's flags field.  We could use five bits to represent the 5
+ * cases, but to save flags bits (which are perennially in short supply), we
+ * play some games.  The cases are:
+ *
+ *  1)  As already mentioned, if some code points outside the bitmap match, and
+ *      some do not, an inversion list is specified to indicate which ones.
+ *
+ *  2)  Under /d rules, it can happen that code points that are in the upper
  *      latin1 range (\x80-\xFF or their equivalents on EBCDIC platforms) match
  *      only if the runtime target string being matched against is UTF-8.  For
- *      example /[\w[:punct:]]/d.  This happens only for posix classes (with a
- *      couple of exceptions, like \d where it doesn't happen), and all such
- *      ones also have above-bitmap matches.  Thus, 3) implies 1) as well.
+ *      example /[\w[:punct:]]/d.  This happens only for certain posix classes,
+ *      and all such ones also have above-bitmap matches.
+ *
  *      Note that /d rules are no longer encouraged; 'use 5.14' or higher
- *      deselects them.  But a flag is required so that they can be properly
- *      handled.  But it can be a shared flag: see 5) below.
- *  4)  Also under /d rules, something like /[\Wfoo]/ will match everything in
+ *      deselects them.  But they are still supported, and a flag is required
+ *      so that they can be properly handled.  But it can be a shared flag: see
+ *      4) below.
+ *
+ *  3)  Also under /d rules, something like /[\Wfoo]/ will match everything in
  *      the \x80-\xFF range, unless the string being matched against is UTF-8.
  *      An inversion list could be created for this case, but this is
  *      relatively common, and it turns out that it's all or nothing:  if any
  *      one of these code points matches, they all do.  Hence a single bit
  *      suffices.  We use a shared flag that doesn't take up space by itself:
- *      ANYOF_SHARED_d_MATCHES_ALL_NON_UTF8_NON_ASCII_non_d_WARN_SUPER.  This
- *      also implies 1), with one exception: [:^cntrl:].
- *  5)  A user-defined \p{} property may not have been defined by the time the
+ *      ANYOFD_NON_UTF8_MATCHES_ALL_NON_ASCII__shared.  This also means there
+ *      is an inversion list for the things that don't fit into the bitmap.
+ *
+ *  4)  A user-defined \p{} property may not have been defined by the time the
  *      regex is compiled.  In this case, we don't know until runtime what it
  *      will match, so we have to assume it could match anything, including
  *      code points that ordinarily would be in the bitmap.  A flag bit is
- *      necessary to indicate this, though it can be shared with the item 3)
- *      flag, as that only occurs under /d, and this only occurs under non-d.
- *      This case is quite uncommon in the field, and the /(?[ ...])/ construct
- *      is a better way to accomplish what this feature does.  This case also
- *      implies 1).
- *      ANYOF_SHARED_d_UPPER_LATIN1_UTF8_STRING_MATCHES_non_d_RUNTIME_USER_PROP
- *      is the shared flag.
- *  6)  /[foo]/il may have folds that are only valid if the runtime locale is a
- *      UTF-8 one.  These are quite rare, so it would be good to avoid the
- *      expense of looking for them.  But /l matching is slow anyway, and we've
- *      traditionally not worried too much about its performance.  And this
- *      condition requires the ANYOFL_FOLD flag to be set, so testing for
- *      that flag would be sufficient to rule out most cases of this.  So it is
- *      unclear if this should have a flag or not.  But, this flag can be
- *      shared with another, so it doesn't occupy extra space.
+ *      necessary to indicate this, though we can use the
+ *      ANYOF_HAS_EXTRA_RUNTIME_MATCHES flag, along with the node not being
+ *      ANYOFD.  The information required to construct the property is stored
+ *      in the AV pointed to by the node's argument.  This case is quite
+ *      uncommon in the field, and the /(?[...])/ construct is a better way to
+ *      accomplish what this feature does.
  *
- * At the moment, there is one spare bit, but this could be increased by
- * various tricks:
- *
- * If just one more bit is needed, as of this writing it seems to khw that the
- * best choice would be to make ANYOF_MATCHES_ALL_ABOVE_BITMAP not a flag, but
- * something like
+ *  5)  /[foo]/il may have folds that are only valid if the runtime locale is a
+ *      UTF-8 one.  The ANYOF_HAS_EXTRA_RUNTIME_MATCHES flag can also be used
+ *      for these.  The list is stored in a different element of the AV, so its
+ *      existence differentiates this case from that of 4), along with the node
+ *      being ANYOFL, with the ANYOFL_FOLD flag being set.  There are a few
+ *      additional folds valid only if the UTF-8 locale is a Turkic one which
+ *      is tested for explicitly.
  *
- *      #define ANYOF_MATCHES_ALL_ABOVE_BITMAP      ((U32) -2)
+ * Note that the user-defined property flag and the /il flag can affect whether
+ * an ASCII character matches in the bitmap or not.
  *
- * and access it through the ARG like ANYOF_ONLY_HAS_BITMAP is.  This flag is
- * used by all ANYOF node types, and it could be used to avoid calling the
- * handler function, as the macro REGINCLASS in regexec.c does now for other
- * cases.
+ * And this still isn't the end of the story.  In some cases, warnings are
+ * supposed to be raised when matching certain categories of code points in the
+ * target string.  Flags are set to indicate this.  This adds up to a bunch of
+ * flags required, and we only have 8 available.  That is why we share some.
+ * At the moment, there are two spare flag bits, but this could be increased by
+ * various tricks:
  *
- * Another possibility is based on the fact that ANYOF_MATCHES_POSIXL is
- * redundant with the node type ANYOFPOSIXL.  That flag could be removed, but
- * at the expense of extra code in regexec.c.  The flag has been retained
- * because it allows us to see if we need to call reginclass, or just use the
- * bitmap in one test.
+ * ANYOF_MATCHES_POSIXL is redundant with the node type ANYOFPOSIXL.  That flag
+ * could be removed, but at the expense of having to write extra code, which
+ * would take up space, and writing this turns out to be not hard, but not
+ * trivial.
  *
  * If this is done, an extension would be to make all ANYOFL nodes contain the
- * extra 32 bits that ANYOFPOSIXL ones do.  The posix flags only occupy 30
- * bits, so the ANYOFL_SHARED_UTF8_LOCALE_fold_HAS_MATCHES_nonfold_REQD flags
- * and ANYOFL_FOLD could be moved to that extra space, but it would mean extra
- * instructions, as there are currently places in the code that assume those
- * two bits are zero.
- *
- * All told, 5 bits could be available for other uses if all of the above were
- * done.
+ * extra 32 bits that ANYOFPOSIXL ones do, doubling each instance's size.  The
+ * posix flags only occupy 30 bits, so the ANYOFL_FOLD  and
+ * ANYOFL_UTF8_LOCALE_REQD bits could be moved to that extra space, but it
+ * would also mean extra instructions, as there are currently places in the
+ * code that assume those two bits are zero.
  *
  * Some flags are not used in synthetic start class (SSC) nodes, so could be
  * shared should new flags be needed for SSCs, like SSC_MATCHES_EMPTY_STRING
@@ -602,48 +869,39 @@ ARGp_SET_inline(struct regnode *node, SV *ptr) {
  * then.  Only set under /l; never in an SSC  */
 #define ANYOFL_FOLD                             0x04
 
-/* Shared bit set only with ANYOFL and SSC nodes:
- *    If ANYOFL_FOLD is set, this flag indicates there are potential matches
- *      valid only if the locale is a UTF-8 one.
- *    If ANYOFL_FOLD is NOT set, this flag means to warn if the runtime locale
- *       isn't a UTF-8 one (and the generated node assumes a UTF-8 locale).
- *       None of INVERT, POSIXL,
- *       ANYOF_SHARED_d_UPPER_LATIN1_UTF8_STRING_MATCHES_non_d_RUNTIME_USER_PROP
- *       can be set.  */
-#define ANYOFL_SHARED_UTF8_LOCALE_fold_HAS_MATCHES_nonfold_REQD        0x08
-
-/* Convenience macros for teasing apart the meanings when reading the above bit
- * */
-#define ANYOFL_SOME_FOLDS_ONLY_IN_UTF8_LOCALE(flags)                        \
-    ((flags & ( ANYOFL_FOLD /* Both bits are set */                         \
-               |ANYOFL_SHARED_UTF8_LOCALE_fold_HAS_MATCHES_nonfold_REQD))   \
-             == ( ANYOFL_FOLD                                               \
-                 |ANYOFL_SHARED_UTF8_LOCALE_fold_HAS_MATCHES_nonfold_REQD))
-
-#define  ANYOFL_UTF8_LOCALE_REQD(flags)                                     \
-    ((flags & ( ANYOFL_FOLD /* Only REQD bit is set */                      \
-               |ANYOFL_SHARED_UTF8_LOCALE_fold_HAS_MATCHES_nonfold_REQD))   \
-             == ANYOFL_SHARED_UTF8_LOCALE_fold_HAS_MATCHES_nonfold_REQD)
+/* Warn if the runtime locale isn't a UTF-8 one (and the generated node assumes
+ * a UTF-8 locale. */
+#define ANYOFL_UTF8_LOCALE_REQD                 0x08
 
 /* Spare: Be sure to change ANYOF_FLAGS_ALL if this gets used  0x10 */
 
-/* If set, the node matches every code point NUM_ANYOF_CODE_POINTS and above.
- * Can be in an SSC */
-#define ANYOF_MATCHES_ALL_ABOVE_BITMAP          0x20
-
-/* Shared bit:
- *      Under /d it means the ANYOFD node matches more things if the target
- *          string is encoded in UTF-8; any such things will be non-ASCII,
- *          characters that are < 256, and can be accessed via the inversion
- *          list.
- *      When not under /d, it means the ANYOF node contains a user-defined
- *      property that wasn't yet defined at the time the regex was compiled,
- *      and so must be looked up at runtime, by creating an inversion list.
- * (These uses are mutually exclusive because a user-defined property is
- * specified by \p{}, and \p{} implies /u which deselects /d).  The long macro
- * name is to make sure that you are cautioned about its shared nature.  Only
- * the non-/d meaning can be in an SSC */
-#define ANYOF_SHARED_d_UPPER_LATIN1_UTF8_STRING_MATCHES_non_d_RUNTIME_USER_PROP  0x40
+/* Spare: Be sure to change ANYOF_FLAGS_ALL if this gets used  0x20 */
+
+/* Shared bit that indicates that there are potential additional matches stored
+ * outside the bitmap, as pointed to by the AV given by the node's argument.
+ * The node type is used at runtime (in conjunction with this flag and other
+ * information available then) to decide if the flag should be acted upon.
+ * This extra information is needed because of at least one of the following
+ * three reasons.
+ *      Under /d and the matched string is in UTF-8, it means the ANYOFD node
+ *          matches more things than in the bitmap.  Those things will be any
+ *          code point too high for the bitmap, but crucially, any non-ASCII
+ *          characters that match iff when using Unicode rules.  These all are
+ *          < 256.
+ *
+ *      Under /l and ANYOFL_FOLD is set, this flag may indicate there are
+ *          potential matches valid only if the locale is a UTF-8 one.  If so,
+ *          a list of them is stored in the AV.
+ *
+ *      For any non-ANYOFD node, there may be a user-defined property that
+ *          wasn't yet defined at the time the regex was compiled, and so must
+ *          be looked up at runtime, The information required to do so will
+ *          also be in the AV.
+ *
+ *      Note that an ANYOFL node may contain both a user-defined property, and
+ *      folds not always valid.  The important thing is that there is an AV to
+ *      look at. */
+#define ANYOF_HAS_EXTRA_RUNTIME_MATCHES 0x40
 
 /* Shared bit:
  *      Under /d it means the ANYOFD node matches all non-ASCII Latin1
@@ -652,13 +910,16 @@ ARGp_SET_inline(struct regnode *node, SV *ptr) {
  *          matching against an above-Unicode code point.
  * (These uses are mutually exclusive because the warning requires a \p{}, and
  * \p{} implies /u which deselects /d).  An SSC node only has this bit set if
- * what is meant is the warning.  The long macro name is to make sure that you
- * are cautioned about its shared nature */
-#define ANYOF_SHARED_d_MATCHES_ALL_NON_UTF8_NON_ASCII_non_d_WARN_SUPER 0x80
+ * what is meant is the warning.  The names are to make sure that you are
+ * cautioned about its shared nature */
+#define ANYOFD_NON_UTF8_MATCHES_ALL_NON_ASCII__shared 0x80
+#define ANYOF_WARN_SUPER__shared                      0x80
 
-#define ANYOF_FLAGS_ALL                ((U8) ~0x10)
+#define ANYOF_FLAGS_ALL                ((U8) ~(0x10|0x20))
 
-#define ANYOF_LOCALE_FLAGS (ANYOFL_FOLD | ANYOF_MATCHES_POSIXL)
+#define ANYOF_LOCALE_FLAGS (  ANYOFL_FOLD               \
+                            | ANYOF_MATCHES_POSIXL      \
+                            | ANYOFL_UTF8_LOCALE_REQD)
 
 /* These are the flags that apply to both regular ANYOF nodes and synthetic
  * start class nodes during construction of the SSC.  During finalization of
@@ -669,48 +930,48 @@ ARGp_SET_inline(struct regnode *node, SV *ptr) {
 /* Should be synchronized with a table in regprop() */
 /* 2n should be the normal one, paired with its complement at 2n+1 */
 
-#define ANYOF_ALPHA    ((_CC_ALPHA) * 2)
+#define ANYOF_ALPHA    ((CC_ALPHA_) * 2)
 #define ANYOF_NALPHA   ((ANYOF_ALPHA) + 1)
-#define ANYOF_ALPHANUMERIC   ((_CC_ALPHANUMERIC) * 2)    /* [[:alnum:]] isalnum(3), utf8::IsAlnum */
+#define ANYOF_ALPHANUMERIC   ((CC_ALPHANUMERIC_) * 2)    /* [[:alnum:]] isalnum(3), utf8::IsAlnum */
 #define ANYOF_NALPHANUMERIC  ((ANYOF_ALPHANUMERIC) + 1)
-#define ANYOF_ASCII    ((_CC_ASCII) * 2)
+#define ANYOF_ASCII    ((CC_ASCII_) * 2)
 #define ANYOF_NASCII   ((ANYOF_ASCII) + 1)
-#define ANYOF_BLANK    ((_CC_BLANK) * 2)     /* GNU extension: space and tab: non-vertical space */
+#define ANYOF_BLANK    ((CC_BLANK_) * 2)     /* GNU extension: space and tab: non-vertical space */
 #define ANYOF_NBLANK   ((ANYOF_BLANK) + 1)
-#define ANYOF_CASED    ((_CC_CASED) * 2)    /* Pseudo class for [:lower:] or
+#define ANYOF_CASED    ((CC_CASED_) * 2)    /* Pseudo class for [:lower:] or
                                                [:upper:] under /i */
 #define ANYOF_NCASED   ((ANYOF_CASED) + 1)
-#define ANYOF_CNTRL    ((_CC_CNTRL) * 2)
+#define ANYOF_CNTRL    ((CC_CNTRL_) * 2)
 #define ANYOF_NCNTRL   ((ANYOF_CNTRL) + 1)
-#define ANYOF_DIGIT    ((_CC_DIGIT) * 2)     /* \d */
+#define ANYOF_DIGIT    ((CC_DIGIT_) * 2)     /* \d */
 #define ANYOF_NDIGIT   ((ANYOF_DIGIT) + 1)
-#define ANYOF_GRAPH    ((_CC_GRAPH) * 2)
+#define ANYOF_GRAPH    ((CC_GRAPH_) * 2)
 #define ANYOF_NGRAPH   ((ANYOF_GRAPH) + 1)
-#define ANYOF_LOWER    ((_CC_LOWER) * 2)
+#define ANYOF_LOWER    ((CC_LOWER_) * 2)
 #define ANYOF_NLOWER   ((ANYOF_LOWER) + 1)
-#define ANYOF_PRINT    ((_CC_PRINT) * 2)
+#define ANYOF_PRINT    ((CC_PRINT_) * 2)
 #define ANYOF_NPRINT   ((ANYOF_PRINT) + 1)
-#define ANYOF_PUNCT    ((_CC_PUNCT) * 2)
+#define ANYOF_PUNCT    ((CC_PUNCT_) * 2)
 #define ANYOF_NPUNCT   ((ANYOF_PUNCT) + 1)
-#define ANYOF_SPACE    ((_CC_SPACE) * 2)     /* \s */
+#define ANYOF_SPACE    ((CC_SPACE_) * 2)     /* \s */
 #define ANYOF_NSPACE   ((ANYOF_SPACE) + 1)
-#define ANYOF_UPPER    ((_CC_UPPER) * 2)
+#define ANYOF_UPPER    ((CC_UPPER_) * 2)
 #define ANYOF_NUPPER   ((ANYOF_UPPER) + 1)
-#define ANYOF_WORDCHAR ((_CC_WORDCHAR) * 2)  /* \w, PL_utf8_alnum, utf8::IsWord, ALNUM */
+#define ANYOF_WORDCHAR ((CC_WORDCHAR_) * 2)  /* \w, PL_utf8_alnum, utf8::IsWord, ALNUM */
 #define ANYOF_NWORDCHAR   ((ANYOF_WORDCHAR) + 1)
-#define ANYOF_XDIGIT   ((_CC_XDIGIT) * 2)
+#define ANYOF_XDIGIT   ((CC_XDIGIT_) * 2)
 #define ANYOF_NXDIGIT  ((ANYOF_XDIGIT) + 1)
 
 /* pseudo classes below this, not stored in the class bitmap, but used as flags
    during compilation of char classes */
 
-#define ANYOF_VERTWS    ((_CC_VERTSPACE) * 2)
+#define ANYOF_VERTWS    ((CC_VERTSPACE_) * 2)
 #define ANYOF_NVERTWS   ((ANYOF_VERTWS)+1)
 
 /* It is best if this is the last one, as all above it are stored as bits in a
  * bitmap, and it isn't part of that bitmap */
-#if _CC_VERTSPACE != _HIGHEST_REGCOMP_DOT_H_SYNC
-#   error Problem with handy.h _HIGHEST_REGCOMP_DOT_H_SYNC #define
+#if CC_VERTSPACE_ != HIGHEST_REGCOMP_DOT_H_SYNC_
+#   error Problem with handy.h HIGHEST_REGCOMP_DOT_H_SYNC_ #define
 #endif
 
 #define ANYOF_POSIXL_MAX (ANYOF_VERTWS) /* So upper loop limit is written:
@@ -720,7 +981,7 @@ ARGp_SET_inline(struct regnode *node, SV *ptr) {
 #define ANYOF_MAX      ANYOF_POSIXL_MAX
 
 #if (ANYOF_POSIXL_MAX > 32)   /* Must fit in 32-bit word */
-#   error Problem with handy.h _CC_foo #defines
+#   error Problem with handy.h CC_foo_ #defines
 #endif
 
 #define ANYOF_HORIZWS  ((ANYOF_POSIXL_MAX)+2) /* = (ANYOF_NVERTWS + 1) */
@@ -740,9 +1001,13 @@ ARGp_SET_inline(struct regnode *node, SV *ptr) {
 
 /* Utility macros for the bitmap and classes of ANYOF */
 
-#define ANYOF_FLAGS(p)         ((p)->flags)
+#define BITMAP_BYTE(p, c)      (( (U8*) (p)) [ ( ( (UV) (c)) >> 3) ] )
+#define BITMAP_BIT(c)          (1U << ((c) & 7))
+#define BITMAP_TEST(p, c)      (BITMAP_BYTE(p, c) & BITMAP_BIT((U8)(c)))
+
+#define ANYOF_FLAGS(p)          (FLAGS(p))
 
-#define ANYOF_BIT(c)           (1U << ((c) & 7))
+#define ANYOF_BIT(c)           BITMAP_BIT(c)
 
 #define ANYOF_POSIXL_BITMAP(p)  (((regnode_charclass_posixl*) (p))->classflags)
 
@@ -794,7 +1059,7 @@ ARGp_SET_inline(struct regnode *node, SV *ptr) {
 #define ANYOF_BITMAP_BYTE(p, c)        BITMAP_BYTE(ANYOF_BITMAP(p), c)
 #define ANYOF_BITMAP_SET(p, c) (ANYOF_BITMAP_BYTE(p, c) |=  ANYOF_BIT(c))
 #define ANYOF_BITMAP_CLEAR(p,c)        (ANYOF_BITMAP_BYTE(p, c) &= ~ANYOF_BIT(c))
-#define ANYOF_BITMAP_TEST(p, c)        cBOOL(ANYOF_BITMAP_BYTE(p, c) &   ANYOF_BIT(c))
+#define ANYOF_BITMAP_TEST(p, c)        cBOOL(ANYOF_BITMAP_BYTE(p, c) & ANYOF_BIT(c))
 
 #define ANYOF_BITMAP_SETALL(p)         \
         memset (ANYOF_BITMAP(p), 255, ANYOF_BITMAP_SIZE)
@@ -828,6 +1093,7 @@ ARGp_SET_inline(struct regnode *node, SV *ptr) {
 #define REG_UNFOLDED_MULTI_SEEN             0x00000400
 /* spare */
 #define REG_UNBOUNDED_QUANTIFIER_SEEN       0x00001000
+#define REG_PESSIMIZE_SEEN                  0x00002000
 
 
 START_EXTERN_C
@@ -976,6 +1242,11 @@ struct _reg_trie_data {
     char            *bitmap;         /* stclass bitmap */
     U16            *jump;           /* optional 1 indexed array of offsets before tail 
                                         for the node following a given word. */
+    U16             *j_before_paren; /* optional 1 indexed array of parno reset data
+                                        for the given jump. */
+    U16             *j_after_paren;  /* optional 1 indexed array of parno reset data
+                                        for the given jump. */
+
     reg_trie_wordinfo *wordinfo;     /* array of info per word */
     U16             uniquecharcount; /* unique chars in trie (width of trans table) */
     U32             startstate;      /* initial state - used for common prefix optimisation */
@@ -985,6 +1256,8 @@ struct _reg_trie_data {
     U32             statecount;      /* Build only - number of states in the states array 
                                         (including the unused zero state) */
     U32             wordcount;       /* Build only */
+    U16             before_paren;
+    U16             after_paren;
 #ifdef DEBUGGING
     STRLEN          charcount;       /* Build only */
 #endif
@@ -1026,10 +1299,6 @@ typedef struct _reg_ac_data reg_ac_data;
 #define IS_ANYOF_TRIE(op) ((op)==TRIEC || (op)==AHOCORASICKC)
 #define IS_TRIE_AC(op) ((op)>=AHOCORASICK)
 
-
-#define BITMAP_BYTE(p, c)      (( (U8*) p) [ ( ( (UV) (c)) >> 3) ] )
-#define BITMAP_TEST(p, c)      (BITMAP_BYTE(p, c) &   ANYOF_BIT((U8)c))
-
 /* these defines assume uniquecharcount is the correct variable, and state may be evaluated twice */
 #define TRIE_NODENUM(state) (((state)-1)/(trie->uniquecharcount)+1)
 #define SAFE_TRIE_NODENUM(state) ((state) ? (((state)-1)/(trie->uniquecharcount)+1) : (state))
@@ -1184,7 +1453,7 @@ re.pm, especially to the documentation.
                      /* get_sv() can return NULL during global destruction. */ \
         re_debug_flags_sv = PL_curcop ? get_sv(RE_DEBUG_FLAGS, GV_ADD) : NULL; \
         if (re_debug_flags_sv) {                                               \
-            if (!SvIOK(re_debug_flags_sv)) /* If doesnt exist set to default */\
+            if (!SvIOK(re_debug_flags_sv)) /* If doesn't exist set to default */\
                 sv_setuv(re_debug_flags_sv,                                    \
                         /* These defaults should be kept in sync with re.pm */ \
                             RE_DEBUG_COMPILE_DUMP | RE_DEBUG_EXECUTE_MASK );   \
@@ -1234,7 +1503,7 @@ re.pm, especially to the documentation.
 #define FIRST_NON_ASCII_DECIMAL_DIGIT 0x660  /* ARABIC_INDIC_DIGIT_ZERO */
 
 typedef enum {
-        TRADITIONAL_BOUND = _CC_WORDCHAR,
+        TRADITIONAL_BOUND = CC_WORDCHAR_,
         GCB_BOUND,
         LB_BOUND,
         SB_BOUND,
@@ -1266,6 +1535,27 @@ typedef enum {
                                   (LOWEST_ANYOF_HRx_BYTE(b)                 \
           + ((MAX_ANYOF_HRx_BYTE - LOWEST_ANYOF_HRx_BYTE(b)) >> ((b) & 3)))
 
+#if !defined(PERL_IN_XSUB_RE) || defined(PLUGGABLE_RE_EXTENSION)
+#  define GET_REGCLASS_AUX_DATA(a,b,c,d,e,f)  get_regclass_aux_data(a,b,c,d,e,f)
+#else
+#  define GET_REGCLASS_AUX_DATA(a,b,c,d,e,f)  get_re_gclass_aux_data(a,b,c,d,e,f)
+#endif
+
+#define REGNODE_TYPE(node)              (PL_regnode_info[(node)].type)
+#define REGNODE_OFF_BY_ARG(node)        (PL_regnode_info[(node)].off_by_arg)
+#define REGNODE_ARG_LEN(node)           (PL_regnode_info[(node)].arg_len)
+#define REGNODE_ARG_LEN_VARIES(node)    (PL_regnode_info[(node)].arg_len_varies)
+#define REGNODE_NAME(node)              (PL_regnode_name[(node)])
+
+#if defined(PERL_IN_REGEX_ENGINE)
+#include "reginline.h"
+#endif
+
+#define EVAL_OPTIMISTIC_FLAG    128
+#define EVAL_FLAGS_MASK         (EVAL_OPTIMISTIC_FLAG-1)
+
+
+
 #endif /* PERL_REGCOMP_H_ */
 
 /*
index bdf6e47..2c0f4a0 100644 (file)
@@ -89,13 +89,28 @@ ANYOFL      ANYOF,      sv charclass S    ; Like ANYOF, but /l is in effect
 ANYOFPOSIXL ANYOF,      sv charclass_posixl S    ; Like ANYOFL, but matches [[:posix:]] classes
 
 # 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.
-ANYOFHs     ANYOF,      sv 1 S    ; Like ANYOFHb, but has a string field that gives the leading matchable UTF-8 bytes; flags field is len
+ANYOFH      ANYOFH,     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     ANYOFH,     sv 1 S    ; Like ANYOFH, but all matches share the same UTF-8 start byte, given in the flags field
+ANYOFHr     ANYOFH,     sv 1 S    ; Like ANYOFH, but the flags field contains packed bounds for all matchable UTF-8 start bytes.
+ANYOFHs     ANYOFH,     sv:str 1 S    ; Like ANYOFHb, but has a string field that gives the leading matchable UTF-8 bytes; flags field is len
 ANYOFR      ANYOFR,     packed 1  S  ; Matches any character in the range given by its packed args: upper 12 bits is the max delta from the base lower 20; the flags field contains the lowest matchable UTF-8 start byte
 ANYOFRb     ANYOFR,     packed 1  S ; Like ANYOFR, but all matches share the same UTF-8 start byte, given in the flags field
-# There is no ANYOFRr because khw doesn't think there are likely to be real-world cases where such a large range is used.
+# There is no ANYOFRr because khw doesn't think there are likely to be
+# real-world cases where such a large range is used.
+#
+# And khw doesn't believe an ANYOFRs (which would behave like ANYOFHs) is
+# actually worth it.  On two-byte UTF-8, the first byte alone is all we need,
+# and ANYOFR already does that.  And we don't consider non-Unicode code points
+# or EBCDIC for performance decisions.  If we had it, we would be comparing the
+# strings, and if they are equal convert to UV and then test to see if it is in
+# the range.  The fast DFA we now use to do the conversion is slower than
+# comparing the strings, but not by much, and negligible in 2 or 3 byte
+# operations.  (We don't have to compare the final byte as it has to be
+# different or else this wouldn't be a range.)  So we might as well displense
+# with the comparisons that ANYOFRs would do, and go directly to do the
+# conversion .
+
+ANYOFHbbm   ANYOFHbbm   none bbm S ; Like ANYOFHb, but only for 2-byte UTF-8 characters; uses a bitmap to match the continuation byte
 
 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
@@ -125,7 +140,7 @@ CLUMP       CLUMP,      no 0 V    ; Match any extended grapheme cluster sequence
 #*               pointer of each individual branch points; each branch
 #*               starts with the operand node of a BRANCH node.
 #*
-BRANCH      BRANCH,     node 0 V  ; Match this alternative, or the next...
+BRANCH      BRANCH,     node 1 V  ; Match this alternative, or the next...
 
 #*Literals
 # NOTE: the relative ordering of these types is important do not change it
@@ -199,13 +214,13 @@ TAIL        NOTHING,    no        ; Match empty string. Can jump here from outsi
 #*               (one character per match) are implemented with STAR
 #*               and PLUS for speed and to minimize recursive plunges.
 #*
-STAR        STAR,       node 0 V  ; Match this (simple) thing 0 or more times.
-PLUS        PLUS,       node 0 V  ; Match this (simple) thing 1 or more times.
+STAR        STAR,       node 0 V  ; Match this (simple) thing 0 or more times: /A{0,}B/ where A is width 1 char
+PLUS        PLUS,       node 0 V  ; Match this (simple) thing 1 or more times: /A{1,}B/ where A is width 1 char
 
-CURLY       CURLY,      sv 2 V    ; Match this simple thing {n,m} times.
-CURLYN      CURLY,      no 2 V    ; Capture next-after-this simple thing 
-CURLYM      CURLY,      no 2 V    ; Capture this medium-complex thing {n,m} times. 
-CURLYX      CURLY,      sv 2 V    ; Match this complex thing {n,m} times.
+CURLY       CURLY,      sv 3 V    ; Match this (simple) thing {n,m} times: /A{m,n}B/ where A is width 1 char
+CURLYN      CURLY,      no 3 V    ; Capture next-after-this simple thing: /(A){m,n}B/ where A is width 1 char
+CURLYM      CURLY,      no 3 V    ; Capture this medium-complex thing {n,m} times: /(A){m,n}B/ where A is fixed-length
+CURLYX      CURLY,      sv 3 V    ; Match/Capture this complex thing {n,m} times.
 
 #*This terminator creates a loop structure for CURLYX
 WHILEM      WHILEM,     no 0 V    ; Do curly processing and see if rest matches.
@@ -218,26 +233,26 @@ CLOSE       CLOSE,      num 1     ; Close corresponding OPEN of #n.
 SROPEN      SROPEN,     none      ; Same as OPEN, but for script run
 SRCLOSE     SRCLOSE,    none      ; Close preceding SROPEN
 
-REF         REF,        num 1 V   ; Match some already matched string
-REFF        REF,        num 1 V   ; Match already matched string, using /di rules.
-REFFL       REF,        num 1 V   ; Match already matched string, using /li rules.
+REF         REF,        num 2 V   ; Match some already matched string
+REFF        REF,        num 2 V   ; Match already matched string, using /di rules.
+REFFL       REF,        num 2 V   ; Match already matched string, using /li rules.
 # N?REFF[AU] could have been implemented using the FLAGS field of the
 # regnode, but by having a separate node type, we can use the existing switch
 # statement to avoid some tests
-REFFU       REF,        num 1 V   ; Match already matched string, usng /ui.
-REFFA       REF,        num 1 V   ; Match already matched string, using /aai rules.
+REFFU       REF,        num 2 V   ; Match already matched string, usng /ui.
+REFFA       REF,        num 2 V   ; Match already matched string, using /aai rules.
 
 #*Named references.  Code in regcomp.c assumes that these all are after
 #*the numbered references
-REFN        REF,        no-sv 1 V ; Match some already matched string
-REFFN       REF,        no-sv 1 V ; Match already matched string, using /di rules.
-REFFLN      REF,        no-sv 1 V ; Match already matched string, using /li rules.
-REFFUN      REF,        num   1 V ; Match already matched string, using /ui rules.
-REFFAN      REF,        num   1 V ; Match already matched string, using /aai rules.
+REFN        REF,        no-sv 2 V ; Match some already matched string
+REFFN       REF,        no-sv 2 V ; Match already matched string, using /di rules.
+REFFLN      REF,        no-sv 2 V ; Match already matched string, using /li rules.
+REFFUN      REF,        num   2 V ; Match already matched string, using /ui rules.
+REFFAN      REF,        num   2 V ; Match already matched string, using /aai rules.
 
 #*Support for long RE
 LONGJMP     LONGJMP,    off 1 . 1 ; Jump far away.
-BRANCHJ     BRANCHJ,    off 1 V 1 ; BRANCH with long offset.
+BRANCHJ     BRANCHJ,    off 2 V 1 ; BRANCH with long offset.
 
 #*Special Case Regops
 IFMATCH     BRANCHJ,    off 1 . 1 ; Succeeds if the following matches; non-zero flags "f", next_off "o" means lookbehind assertion starting "f..(f-o)" characters before current
@@ -248,7 +263,7 @@ GROUPP      GROUPP,     num 1     ; Whether the group matched.
 
 #*The heavy worker
 
-EVAL        EVAL,       evl/flags 2L ; Execute some Perl code.
+EVAL        EVAL,       evl/flags 2 ; Execute some Perl code.
 
 #*Modifiers
 
@@ -259,7 +274,7 @@ LOGICAL     LOGICAL,    no        ; Next opcode should set the flag only.
 RENUM       BRANCHJ,    off 1 . 1 ; Group with independently numbered parens.
 
 #*Regex Subroutines
-GOSUB       GOSUB,      num/ofs 2L    ; recurse to paren arg1 at (signed) ofs arg2
+GOSUB       GOSUB,      num/ofs 2    ; recurse to paren arg1 at (signed) ofs arg2
 
 #*Special conditionals
 GROUPPN     GROUPPN,    no-sv 1   ; Whether the group matched.
@@ -269,7 +284,7 @@ DEFINEP     DEFINEP,    none 1    ; Never execute directly.
 #*Backtracking Verbs
 ENDLIKE     ENDLIKE,    none      ; Used only for the type field of verbs
 OPFAIL      ENDLIKE,    no-sv 1   ; Same as (?!), but with verb arg
-ACCEPT      ENDLIKE,    no-sv/num 2L   ; Accepts the current matched string, with verbar
+ACCEPT      ENDLIKE,    no-sv/num 2   ; Accepts the current matched string, with verbar
 
 #*Verbs With Arguments
 VERB        VERB,       no-sv 1   ; Used only for the type field of verbs
@@ -329,3 +344,4 @@ MARKPOINT       next:FAIL
 SKIP            next:FAIL
 CUTGROUP        next:FAIL
 KEEPS           next:FAIL
+REF             next:FAIL
index 42cb7aa..bb5c3ab 100644 (file)
@@ -384,9 +384,6 @@ END
  * is A-Z; all other code points map to themselves */
 END
         output_table(\@ascii_fold, "PL_fold");
-
-        # This table is also the correct folding for the default C locale
-        output_table(\@ascii_fold, "PL_fold_locale");
     }
 
     {
index 5d2f297..37558e8 100644 (file)
@@ -17,7 +17,7 @@
 #
 # This script is normally invoked from regen.pl.
 
-require 5.004; # keep this compatible, an old perl is all we may have before
+require 5.004;  # keep this compatible, an old perl is all we may have before
                 # we build the new one
 
 use strict;
@@ -29,6 +29,7 @@ BEGIN {
 }
 
 my $unflagged_pointers;
+my @az = ('a'..'z');
 
 #
 # See database of global and static function prototypes in embed.fnc
@@ -48,7 +49,7 @@ sub full_name ($$) { # Returns the function name with potentially the
                      # prefixes 'S_' or 'Perl_'
     my ($func, $flags) = @_;
 
-    return "Perl_$func" if $flags =~ /p/;
+    return "Perl_$func" if $flags =~ /[ps]/;
     return "S_$func" if $flags =~ /[SIi]/;
     return $func;
 }
@@ -58,32 +59,53 @@ sub open_print_header {
 
     return open_new($file, '>',
                     { file => $file, style => '*', by => 'regen/embed.pl',
-                      from => ['data in embed.fnc', 'regen/embed.pl',
-                               'regen/opcodes', 'intrpvar.h', 'perlvars.h'],
+                      from => [
+                               'embed.fnc',
+                               'intrpvar.h',
+                               'perlvars.h',
+                               'regen/opcodes',
+                               'regen/embed.pl',
+                               'regen/embed_lib.pl',
+                               'regen/HeaderParser.pm',
+                           ],
                       final => "\nEdit those files and run 'make regen_headers' to effect changes.\n",
-                      copyright => [1993 .. 2009], quote => $quote });
+                      copyright => [1993 .. 2022],
+                      quote => $quote });
 }
 
-my ($embed, $core, $ext, $api) = setup_embed();
+
+sub open_buf_out {
+    $_[0] //= "";
+    open my $fh,">", \$_[0]
+        or die "Failed to open buffer: $!";
+    return $fh;
+}
 
 # generate proto.h
-{
-    my $pr = open_print_header("proto.h");
-    print $pr "START_EXTERN_C\n";
+sub generate_proto_h {
+    my ($all)= @_;
+    my $pr = open_buf_out(my $proto_buffer);
     my $ret;
 
-    foreach (@$embed) {
-        if (@$_ == 1) {
-            print $pr "$_->[0]\n";
+    foreach (@$all) {
+        if ($_->{type} ne "content") {
+            print $pr "$_->{line}";
             next;
         }
+        my $embed= $_->{embed}
+            or next;
+
+        my $level= $_->{level};
+        my $ind= $level ? " " : "";
+        $ind .= "  " x ($level-1) if $level>1;
+        my $inner_ind= $ind ? "  " : " ";
 
-        my ($flags,$retval,$plain_func,@args) = @$_;
-        if ($flags =~ / ( [^AabCDdEefFGhIiMmNnOoPpRrSsTUuWXx] ) /x) {
+        my ($flags,$retval,$plain_func,$args) = @{$embed}{qw(flags return_type name args)};
+        if ($flags =~ / ( [^AabCDdEefFGhIiMmNnOoPpRrSsTUuWXx;] ) /x) {
             die_at_end "flag $1 is not legal (for function $plain_func)";
         }
         my @nonnull;
-        my $args_assert_line = ( $flags !~ /G/ );
+        my $args_assert_line = ( $flags !~ /[Gm]/ );
         my $has_depth = ( $flags =~ /W/ );
         my $has_context = ( $flags !~ /T/ );
         my $never_returns = ( $flags =~ /r/ );
@@ -106,22 +128,32 @@ my ($embed, $core, $ext, $api) = setup_embed();
         die_at_end "$plain_func: u flag only usable with m" if $flags =~ /u/
                                                             && $flags !~ /m/;
 
+        my ($static_flag, @extra_static_flags)= $flags =~/([SsIi])/g;
+
+        if (@extra_static_flags) {
+            my $flags_str = join ", ", $static_flag, @extra_static_flags;
+            $flags_str =~ s/, (\w)\z/ and $1/;
+            die_at_end "$plain_func: flags $flags_str are mutually exclusive\n";
+        }
+
         my $static_inline = 0;
-        if ($flags =~ /([SIi])/) {
+        if ($static_flag) {
             my $type;
             if ($never_returns) {
                 $type = {
                     'S' => 'PERL_STATIC_NO_RET',
+                    's' => 'PERL_STATIC_NO_RET',
                     'i' => 'PERL_STATIC_INLINE_NO_RET',
                     'I' => 'PERL_STATIC_FORCE_INLINE_NO_RET'
-                }->{$1};
+                }->{$static_flag};
             }
             else {
                 $type = {
                     'S' => 'STATIC',
+                    's' => 'STATIC',
                     'i' => 'PERL_STATIC_INLINE',
                     'I' => 'PERL_STATIC_FORCE_INLINE'
-                }->{$1};
+                }->{$static_flag};
             }
             $retval = "$type $retval";
             die_at_end "Don't declare static function '$plain_func' pure" if $flags =~ /P/;
@@ -140,15 +172,17 @@ my ($embed, $core, $ext, $api) = setup_embed();
 
         die_at_end "For '$plain_func', M flag requires p flag"
                                             if $flags =~ /M/ && $flags !~ /p/;
-        die_at_end "For '$plain_func', C flag requires one of [pIimb] flags"
-                                                  if $flags =~ /C/
-                                                  && ($flags !~ /[Iibmp]/
-
-                                                     # Notwithstanding the
-                                                     # above, if the name
-                                                     # won't clash with a
-                                                     # user name, it's ok.
-                                                  && $plain_func !~ /^[Pp]erl/);
+        my $C_required_flags = '[pIimbs]';
+        die_at_end
+            "For '$plain_func', C flag requires one of $C_required_flags] flags"
+                                                if $flags =~ /C/
+                                                && ($flags !~ /$C_required_flags/
+
+                                                   # Notwithstanding the
+                                                   # above, if the name won't
+                                                   # clash with a user name,
+                                                   # it's ok.
+                                                && $plain_func !~ /^[Pp]erl/);
 
         die_at_end "For '$plain_func', X flag requires one of [Iip] flags"
                                             if $flags =~ /X/ && $flags !~ /[Iip]/;
@@ -164,25 +198,39 @@ my ($embed, $core, $ext, $api) = setup_embed();
                                             if $flags =~ /I/ && $flags =~ /i/;
 
         $ret = "";
-        $ret .= "$retval\t$func(";
+        $ret .= "$retval\n";
+        $ret .= "$func(";
         if ( $has_context ) {
-            $ret .= @args ? "pTHX_ " : "pTHX";
+            $ret .= @$args ? "pTHX_ " : "pTHX";
         }
-        if (@args) {
+        if (@$args) {
             die_at_end "n flag is contradicted by having arguments"
                                                                 if $flags =~ /n/;
             my $n;
-            for my $arg ( @args ) {
+            for my $arg ( @$args ) {
                 ++$n;
-                if (   $args_assert_line
-                   && $arg =~ /\*/
-                   && $arg !~ /\b(NN|NULLOK)\b/ )
-               {
+                if ($arg =~ / ^ " (.+) " $ /x) {    # Handle literal string
+                    my $name = $1;
+
+                    # Make the string a legal C identifier; 'p' is arbitrary,
+                    # and is because C reserves leading underscores
+                    $name =~ s/^\W/p/a;
+                    $name =~ s/\W/_/ag;
+
+                    $arg = "const char * const $name";
+                    die_at_end 'm flag required for "literal" argument'
+                                                            unless $flags =~ /m/;
+                }
+                elsif (   $args_assert_line
+                       && $arg =~ /\*/
+                       && $arg !~ /\b(NN|NULLOK)\b/ )
+                {
                     warn "$func: $arg needs NN or NULLOK\n";
                     ++$unflagged_pointers;
                 }
                 my $nn = ( $arg =~ s/\s*\bNN\b\s+// );
                 push( @nonnull, $n ) if $nn;
+                my $nz = ( $arg =~ s/\s*\bNZ\b\s+// );
 
                 my $nullok = ( $arg =~ s/\s*\bNULLOK\b\s+// ); # strip NULLOK with no effect
 
@@ -195,16 +243,16 @@ my ($embed, $core, $ext, $api) = setup_embed();
                      && ($temp_arg !~ /\w+\s+(\w+)(?:\[\d+\])?\s*$/) ) {
                     die_at_end "$func: $arg ($n) doesn't have a name\n";
                 }
-                if (defined $1 && $nn && !($commented_out && !$binarycompat)) {
+                if (defined $1 && ($nn||$nz) && !($commented_out && !$binarycompat)) {
                     push @names_of_nn, $1;
                 }
             }
-            $ret .= join ", ", @args;
+            $ret .= join ", ", @$args;
         }
         else {
             $ret .= "void" if !$has_context;
         }
-        $ret .= " _pDEPTH" if $has_depth;
+        $ret .= " comma_pDEPTH" if $has_depth;
         $ret .= ")";
         my @attrs;
         if ( $flags =~ /r/ ) {
@@ -225,25 +273,33 @@ my ($embed, $core, $ext, $api) = setup_embed();
         if ( $flags =~ /I/ ) {
             push @attrs, "__attribute__always_inline__";
         }
+        # roughly the inverse of the rules used in makedef.pl
+        if ( $flags !~ /[AbCeIimSX]/ ) {
+            push @attrs, '__attribute__visibility__("hidden")'
+        }
         if( $flags =~ /f/ ) {
-            my $prefix = $has_context ? 'pTHX_' : '';
-            my ($args, $pat);
-            if ($args[-1] eq '...') {
-                $args  = scalar @args;
-                $pat   = $args - 1;
-                $args  = $prefix . $args;
+            my $prefix  = $has_context ? 'pTHX_' : '';
+            my ($argc, $pat);
+            if (!defined $args->[1]) {
+                use Data::Dumper;
+                die Dumper($_);
+            }
+            if ($args->[-1] eq '...') {
+                $argc   = scalar @$args;
+                $pat    = $argc - 1;
+                $argc   = $prefix . $argc;
             }
             else {
                 # don't check args, and guess which arg is the pattern
                 # (one of 'fmt', 'pat', 'f'),
-                $args = 0;
-                my @fmts = grep $args[$_] =~ /\b(f|pat|fmt)$/, 0..$#args;
+                $argc = 0;
+                my @fmts = grep $args->[$_] =~ /\b(f|pat|fmt)$/, 0..$#$args;
                 if (@fmts != 1) {
                     die "embed.pl: '$plain_func': can't determine pattern arg\n";
                 }
                 $pat = $fmts[0] + 1;
             }
-            my $macro  = grep($_ == $pat, @nonnull)
+            my $macro   = grep($_ == $pat, @nonnull)
                                 ? '__attribute__format__'
                                 : '__attribute__format__null_ok__';
             if ($plain_func =~ /strftime/) {
@@ -251,275 +307,361 @@ my ($embed, $core, $ext, $api) = setup_embed();
             }
             else {
                 push @attrs, sprintf "%s(__printf__,%s%d,%s)", $macro,
-                                    $prefix, $pat, $args;
+                                    $prefix, $pat, $argc;
             }
         }
-        elsif ((grep { $_ eq '...' } @args) && $flags !~ /F/) {
+        elsif ((grep { $_ eq '...' } @$args) && $flags !~ /F/) {
             die_at_end "$plain_func: Function with '...' arguments must have"
                      . " f or F flag";
         }
         if ( @attrs ) {
             $ret .= "\n";
-            $ret .= join( "\n", map { "\t\t\t$_" } @attrs );
+            $ret .= join( "\n", map { (" " x 8) . $_ } @attrs );
         }
         $ret .= ";";
         $ret = "/* $ret */" if $commented_out;
 
-        $ret .= "\n#define PERL_ARGS_ASSERT_\U$plain_func\E"
-                                            if $args_assert_line || @names_of_nn;
-        $ret .= "\t\\\n\t" . join '; ', map "assert($_)", @names_of_nn
-                                                                if @names_of_nn;
+        if ($args_assert_line || @names_of_nn) {
+            $ret .= "\n#${ind}define PERL_ARGS_ASSERT_\U$plain_func\E";
+            if (@names_of_nn) {
+                $ret .= " \\\n";
+                my $def = " " x 8;
+                foreach my $ix (0..$#names_of_nn) {
+                    $def .= "assert($names_of_nn[$ix])";
+                    if ($ix == $#names_of_nn) {
+                        $def .= "\n";
+                    } elsif (length $def > 70) {
+                        $ret .= $def . "; \\\n";
+                        $def = " " x 8;
+                    } else {
+                        $def .= "; ";
+                    }
+                }
+                $ret .= $def;
+            }
+        }
+        $ret .= "\n";
+
+        $ret = "#${ind}ifndef PERL_NO_INLINE_FUNCTIONS\n$ret\n#${ind}endif"
+            if $static_inline;
+        $ret = "#${ind}ifndef NO_MATHOMS\n$ret\n#${ind}endif"
+            if $binarycompat;
 
-        $ret = "#ifndef PERL_NO_INLINE_FUNCTIONS\n$ret\n#endif" if $static_inline;
-        $ret = "#ifndef NO_MATHOMS\n$ret\n#endif" if $binarycompat;
         $ret .= @attrs ? "\n\n" : "\n";
 
         print $pr $ret;
     }
 
-    print $pr <<'EOF';
-#ifdef PERL_CORE
-#  include "pp_proto.h"
-#endif
-END_EXTERN_C
-EOF
 
-    read_only_bottom_close_and_rename($pr) if ! $error_count;
+    close $pr;
+
+    my $clean= normalize_group_content($proto_buffer);
+
+    my $fh = open_print_header("proto.h");
+    print $fh <<~"EOF";
+    START_EXTERN_C
+    $clean
+    #ifdef PERL_CORE
+    #  include "pp_proto.h"
+    #endif
+    END_EXTERN_C
+    EOF
+
+    read_only_bottom_close_and_rename($fh) if ! $error_count;
+}
+
+{
+    my $hp= HeaderParser->new();
+    sub normalize_group_content {
+        open my $in, "<", \$_[0]
+            or die "Failed to open buffer: $!";
+        $hp->parse_fh($in);
+        my $ppc= sub {
+            my ($self, $line_data)= @_;
+            # re-align defines so that the definitions line up at the 48th col
+            # as much as possible.
+            if ($line_data->{sub_type} eq "#define") {
+                $line_data->{line}=~s/^(\s*#\s*define\s+\S+?(?:\([^()]*\))?\s)(\s*)(\S+)/
+                    sprintf "%-48s%s", $1, $3/e;
+            }
+        };
+        my $clean= $hp->lines_as_str($hp->group_content(),$ppc);
+        return $clean;
+    }
+}
+
+sub normalize_and_print {
+    my ($file, $buffer)= @_;
+    my $fh = open_print_header($file);
+    print $fh normalize_group_content($buffer);
+    read_only_bottom_close_and_rename($fh);
 }
 
-die_at_end "$unflagged_pointers pointer arguments to clean up\n" if $unflagged_pointers;
 
 sub readvars {
     my ($file, $pre) = @_;
-    local (*FILE, $_);
+    my $hp= HeaderParser->new()->read_file($file);
     my %seen;
-    open(FILE, '<', $file)
-        or die "embed.pl: Can't open $file: $!\n";
-    while (<FILE>) {
-        s/[ \t]*#.*//;         # Delete comments.
-        if (/PERLVARA?I?C?\($pre,\s*(\w+)/) {
-            die_at_end "duplicate symbol $1 while processing $file line $.\n"
-                if $seen{$1}++;
+    foreach my $line_data (@{$hp->lines}) {
+        #next unless $line_data->is_content;
+        my $line= $line_data->line;
+        if ($line=~m/^\s*PERLVARA?I?C?\(\s*$pre\s*,\s*(\w+)/){
+            $seen{$1}++
+                and
+                die_at_end "duplicate symbol $1 while processing $file line "
+                       . ($line_data->start_line_num) . "\n"
         }
     }
-    close(FILE);
-    return sort keys %seen;
+    my @keys= sort { lc($a) cmp lc($b) ||
+                        $a  cmp    $b }
+              keys %seen;
+    return @keys;
 }
 
-my @intrp = readvars 'intrpvar.h','I';
-my @globvar = readvars 'perlvars.h','G';
+sub add_indent {
+    #my ($ret, $add, $width)= @_;
+    my $width= $_[2] || 48;
+    $_[0] .= " " x ($width-length($_[0])) if length($_[0])<$width;
+    $_[0] .= " " unless $_[0]=~/\s\z/;
+    if (defined $_[1]) {
+        $_[0] .= $_[1];
+    }
+    return $_[0];
+}
 
-sub hide {
-    my ($from, $to, $indent) = @_;
+sub indent_define {
+    my ($from, $to, $indent, $width) = @_;
     $indent = '' unless defined $indent;
-    my $t = int(length("$indent$from") / 8);
-    "#${indent}define $from" . "\t" x ($t < 3 ? 3 - $t : 1) . "$to\n";
+    my $ret= "#${indent}define $from";
+    add_indent($ret,"$to\n",$width);
 }
 
-sub multon ($$$) {
-    my ($sym,$pre,$ptr) = @_;
-    hide("PL_$sym", "($ptr$pre$sym)");
+sub multon {
+    my ($sym,$pre,$ptr,$ind) = @_;
+    $ind//="";
+    indent_define("PL_$sym", "($ptr$pre$sym)", $ind);
 }
 
-my $em = open_print_header('embed.h');
-
-print $em <<'END';
-/* (Doing namespace management portably in C is really gross.) */
-
-/* By defining PERL_NO_SHORT_NAMES (not done by default) the short forms
- * (like warn instead of Perl_warn) for the API are not defined.
- * Not defining the short forms is a good thing for cleaner embedding.
- * BEWARE that a bunch of macros don't have long names, so either must be
- * added or don't use them if you define this symbol */
-
-#ifndef PERL_NO_SHORT_NAMES
-
-/* Hide global symbols */
-
-END
-
-my @az = ('a'..'z');
-
 sub embed_h {
-    my ($guard, $funcs) = @_;
-    print $em "$guard\n" if $guard;
+    my ($em, $guard, $funcs) = @_;
 
     my $lines;
     foreach (@$funcs) {
-        if (@$_ == 1) {
-            my $cond = $_->[0];
-            # Indent the conditionals if we are wrapped in an #if/#endif pair.
-            $cond =~ s/#(.*)/#  $1/ if $guard;
-            $lines .= "$cond\n";
+        if ($_->{type} ne "content") {
+            $lines .= $_->{line};
             next;
         }
+        my $level= $_->{level};
+        my $embed= $_->{embed} or next;
+        my ($flags,$retval,$func,$args) = @{$embed}{qw(flags return_type name args)};
         my $ret = "";
-        my ($flags,$retval,$func,@args) = @$_;
+        my $ind= $level ? " " : "";
+        $ind .= "  " x ($level-1) if $level>1;
+        my $inner_ind= $ind ? "  " : " ";
         unless ($flags =~ /[omM]/) {
-            my $args = scalar @args;
+            my $argc = scalar @$args;
             if ($flags =~ /T/) {
                 my $full_name = full_name($func, $flags);
-                next if $full_name eq $func;   # Don't output a no-op.
-                $ret = hide($func, $full_name);
-            }
-            elsif ($args and $args[$args-1] =~ /\.\.\./) {
-                if ($flags =~ /p/) {
-                    # we're out of luck for varargs functions under CPP
-                    # So we can only do these macros for non-MULTIPLICITY perls:
-                    $ret = "#ifndef MULTIPLICITY\n"
-                        . hide($func, full_name($func, $flags)) . "#endif\n";
-                }
+                next if $full_name eq $func;    # Don't output a no-op.
+                $ret = indent_define($func, $full_name, $ind);
             }
             else {
-                my $alist = join(",", @az[0..$args-1]);
-                $ret = "#define $func($alist)";
-                my $t = int(length($ret) / 8);
-                $ret .=  "\t" x ($t < 4 ? 4 - $t : 1);
-                $ret .= full_name($func, $flags) . "(aTHX";
-                $ret .= "_ " if $alist;
-                $ret .= $alist;
+                my $use_va_list = $argc && $args->[-1] =~ /\.\.\./;
+
+                if($use_va_list) {
+                    # CPP has trouble with empty __VA_ARGS__ and comma joining,
+                    # so we'll have to eat an extra params here.
+                    if($argc < 2) {
+                        die "Cannot use ... as the only parameter to a macro ($func)\n";
+                    }
+                    $argc -= 2;
+                }
+
+                my $paramlist   = join(",", @az[0..$argc-1],
+                    $use_va_list ? ("...") : ());
+                my $replacelist = join(",", @az[0..$argc-1],
+                    $use_va_list ? ("__VA_ARGS__") : ());
+                $ret = "#${ind}define $func($paramlist) ";
+                add_indent($ret,full_name($func, $flags) . "(aTHX");
+                $ret .= "_ " if $replacelist;
+                $ret .= $replacelist;
                 if ($flags =~ /W/) {
-                    if ($alist) {
-                        $ret .= " _aDEPTH";
+                    if ($replacelist) {
+                        $ret .= " comma_aDEPTH";
                     } else {
                         die "Can't use W without other args (currently)";
                     }
                 }
                 $ret .= ")\n";
+                if($use_va_list) {
+                    # Make them available to !MULTIPLICITY or PERL_CORE
+                    $ret = "#${ind}if !defined(MULTIPLICITY) || defined(PERL_CORE)\n" .
+                           $ret .
+                           "#${ind}endif\n";
+                }
             }
-            $ret = "#ifndef NO_MATHOMS\n$ret#endif\n" if $flags =~ /b/;
+            $ret = "#${ind}ifndef NO_MATHOMS\n$ret#${ind}endif\n" if $flags =~ /b/;
         }
         $lines .= $ret;
     }
-    # Prune empty #if/#endif pairs.
-    while ($lines =~ s/#\s*if[^\n]+\n#\s*endif\n//) {
-    }
-    # Merge adjacent blocks.
-    while ($lines =~ s/(#ifndef MULTIPLICITY
-[^\n]+
-)#endif
-#ifndef MULTIPLICITY
-/$1/) {
+    # remove empty blocks
+    1 while $lines =~ s/^#\s*if.*\n#\s*endif.*\n//mg
+         or $lines =~ s/^(#\s*if)\s+(.*)\n#else.*\n/$1 !($2)\n/mg;
+    if ($guard) {
+        print $em "$guard /* guard */\n";
+        $lines=~s/^#(\s*)/"#".(length($1)?"  ":" ").$1/mge;
     }
-
     print $em $lines;
     print $em "#endif\n" if $guard;
 }
 
-embed_h('', $api);
-embed_h('#if defined(PERL_CORE) || defined(PERL_EXT)', $ext);
-embed_h('#ifdef PERL_CORE', $core);
+sub generate_embed_h {
+    my ($all, $api, $ext, $core)= @_;
 
-print $em <<'END';
+    my $em= open_buf_out(my $embed_buffer);
 
-#endif /* #ifndef PERL_NO_SHORT_NAMES */
+    print $em <<~'END';
+    /* (Doing namespace management portably in C is really gross.) */
 
-/* Compatibility stubs.  Compile extensions with -DPERL_NOCOMPAT to
-   disable them.
- */
+    /* By defining PERL_NO_SHORT_NAMES (not done by default) the short forms
+     * (like warn instead of Perl_warn) for the API are not defined.
+     * Not defining the short forms is a good thing for cleaner embedding.
+     * BEWARE that a bunch of macros don't have long names, so either must be
+     * added or don't use them if you define this symbol */
 
-#if !defined(PERL_CORE)
-#  define sv_setptrobj(rv,ptr,name)    sv_setref_iv(rv,name,PTR2IV(ptr))
-#  define sv_setptrref(rv,ptr)         sv_setref_iv(rv,NULL,PTR2IV(ptr))
-#endif
+    #ifndef PERL_NO_SHORT_NAMES
 
-#if !defined(PERL_CORE) && !defined(PERL_NOCOMPAT)
+    /* Hide global symbols */
 
-/* Compatibility for various misnamed functions.  All functions
-   in the API that begin with "perl_" (not "Perl_") take an explicit
-   interpreter context pointer.
-   The following are not like that, but since they had a "perl_"
-   prefix in previous versions, we provide compatibility macros.
- */
-#  define perl_atexit(a,b)             call_atexit(a,b)
-END
+    END
 
-foreach (@$embed) {
-    my ($flags, $retval, $func, @args) = @$_;
-    next unless $func;
-    next unless $flags =~ /O/;
+    embed_h($em, '', $api);
+    embed_h($em, '#if defined(PERL_CORE) || defined(PERL_EXT)', $ext);
+    embed_h($em, '#if defined(PERL_CORE)', $core);
 
-    my $alist = join ",", @az[0..$#args];
-    my $ret = "#  define perl_$func($alist)";
-    my $t = (length $ret) >> 3;
-    $ret .=  "\t" x ($t < 5 ? 5 - $t : 1);
-    print $em "$ret$func($alist)\n";
-}
+    print $em <<~'END';
 
-my @nocontext;
-{
-    my (%has_va, %has_nocontext);
-    foreach (@$embed) {
-        next unless @$_ > 1;
-        ++$has_va{$_->[2]} if $_->[-1] =~ /\.\.\./;
-        ++$has_nocontext{$1} if $_->[2] =~ /(.*)_nocontext/;
+    #endif      /* #ifndef PERL_NO_SHORT_NAMES */
+
+    #if !defined(PERL_CORE)
+    /* Compatibility stubs.  Compile extensions with -DPERL_NOCOMPAT to
+     * disable them.
+     */
+    #  define sv_setptrobj(rv,ptr,name) sv_setref_iv(rv,name,PTR2IV(ptr))
+    #  define sv_setptrref(rv,ptr)              sv_setref_iv(rv,NULL,PTR2IV(ptr))
+    #endif
+
+    #if !defined(PERL_CORE) && !defined(PERL_NOCOMPAT)
+
+    /* Compatibility for various misnamed functions.  All functions
+       in the API that begin with "perl_" (not "Perl_") take an explicit
+       interpreter context pointer.
+       The following are not like that, but since they had a "perl_"
+       prefix in previous versions, we provide compatibility macros.
+     */
+    #  define perl_atexit(a,b)          call_atexit(a,b)
+    END
+
+    foreach (@$all) {
+        my $embed= $_->{embed} or next;
+        my ($flags, $retval, $func, $args) = @{$embed}{qw(flags return_type name args)};
+        next unless $flags =~ /O/;
+
+        my $alist = join ",", @az[0..$#$args];
+        my $ret = "#  define perl_$func($alist) ";
+        print $em add_indent($ret,"$func($alist)\n");
     }
 
-    @nocontext = sort grep {
-        $has_nocontext{$_}
-            && !/printf/ # Not clear to me why these are skipped but they are.
-    } keys %has_va;
-}
+    my @nocontext;
+    {
+        my (%has_va, %has_nocontext);
+        foreach (@$all) {
+            my $embed= $_->{embed}
+                or next;
+            ++$has_va{$embed->{name}} if @{$embed->{args}} and $embed->{args}[-1] =~ /\.\.\./;
+            ++$has_nocontext{$1} if $embed->{name} =~ /(.*)_nocontext/;
+        }
 
-print $em <<'END';
+        @nocontext = sort grep {
+            $has_nocontext{$_}
+                && !/printf/ # Not clear to me why these are skipped but they are.
+        } keys %has_va;
+    }
 
-/* varargs functions can't be handled with CPP macros. :-(
-   This provides a set of compatibility functions that don't take
-   an extra argument but grab the context pointer using the macro
-   dTHX.
- */
-#if defined(MULTIPLICITY) && !defined(PERL_NO_SHORT_NAMES)
-END
+    print $em <<~'END';
 
-foreach (@nocontext) {
-    print $em hide($_, "Perl_${_}_nocontext", "  ");
-}
+    /* varargs functions can't be handled with CPP macros. :-(
+       This provides a set of compatibility functions that don't take
+       an extra argument but grab the context pointer using the macro
+       dTHX.
+     */
+    #if defined(MULTIPLICITY) && !defined(PERL_NO_SHORT_NAMES)
+    END
+
+    foreach (@nocontext) {
+        print $em indent_define($_, "Perl_${_}_nocontext", "  ");
+    }
 
-print $em <<'END';
-#endif
+    print $em <<~'END';
+    #endif
 
-#endif /* !defined(PERL_CORE) && !defined(PERL_NOCOMPAT) */
+    #endif /* !defined(PERL_CORE) && !defined(PERL_NOCOMPAT) */
 
-#if !defined(MULTIPLICITY)
-/* undefined symbols, point them back at the usual ones */
-END
+    #if !defined(MULTIPLICITY)
+    /* undefined symbols, point them back at the usual ones */
+    END
 
-foreach (@nocontext) {
-    print $em hide("Perl_${_}_nocontext", "Perl_$_", "  ");
+    foreach (@nocontext) {
+        print $em indent_define("Perl_${_}_nocontext", "Perl_$_", "  ");
+    }
+
+    print $em "#endif\n";
+    close $em;
+
+    normalize_and_print('embed.h',$embed_buffer)
+        unless $error_count;
 }
 
-print $em <<'END';
-#endif
-END
+sub generate_embedvar_h {
+    my $em = open_buf_out(my $embedvar_buffer);
 
-read_only_bottom_close_and_rename($em) if ! $error_count;
+    print $em "#if defined(MULTIPLICITY)\n",
+              indent_define("vTHX","aTHX"," ");
 
-$em = open_print_header('embedvar.h');
 
-print $em <<'END';
-#if defined(MULTIPLICITY)
-#  define vTHX aTHX
-END
+    my @intrp = readvars 'intrpvar.h','I';
+    #my @globvar = readvars 'perlvars.h','G';
 
-my $sym;
 
-for $sym (@intrp) {
-    if ($sym eq 'sawampersand') {
-        print $em "#ifndef PL_sawampersand\n";
-    }
-    print $em multon($sym,'I','vTHX->');
-    if ($sym eq 'sawampersand') {
-        print $em "#endif\n";
+    for my $sym (@intrp) {
+        my $ind = " ";
+        if ($sym eq 'sawampersand') {
+            print $em "# if !defined(PL_sawampersand)\n";
+            $ind = "   ";
+        }
+        my $line = multon($sym, 'I', 'vTHX->', $ind);
+        print $em $line;
+        if ($sym eq 'sawampersand') {
+            print $em "# endif /* !defined(PL_sawampersand) */\n";
+        }
     }
-}
 
-print $em <<'END';
+    print $em "#endif       /* MULTIPLICITY */\n";
+    close $em;
 
-#endif /* MULTIPLICITY */
-END
+    normalize_and_print('embedvar.h',$embedvar_buffer)
+        unless $error_count;
+}
 
-read_only_bottom_close_and_rename($em) if ! $error_count;
+sub update_headers {
+    my ($all, $api, $ext, $core) = setup_embed(); # see regen/embed_lib.pl
+    generate_proto_h($all);
+    die_at_end "$unflagged_pointers pointer arguments to clean up\n" if $unflagged_pointers;
+    generate_embed_h($all, $api, $ext, $core);
+    generate_embedvar_h();
+    die "$error_count errors found" if $error_count;
+}
 
-die "$error_count errors found" if $error_count;
+update_headers() unless caller;
 
 # ex: set ts=8 sts=4 sw=4 noet:
index 0ef91b2..c826cdb 100644 (file)
@@ -1,5 +1,16 @@
 #!/usr/bin/perl -w
+BEGIN {
+    for $n (qw(lib regen)) {
+        if (-e "../$n") {
+            push @INC, "../$n";
+        } elsif (-e "./$n") {
+            push @INC, "./$n";
+        }
+    }
+}
 use strict;
+use warnings;
+use HeaderParser;
 
 # read embed.fnc and regen/opcodes, needed by regen/embed.pl, makedef.pl,
 # autodoc.pl and t/porting/diag.t
@@ -7,158 +18,82 @@ use strict;
 require 5.004; # keep this compatible, an old perl is all we may have before
                 # we build the new one
 
-# Records the current pre-processor state:
-my @state;
-# Nested structure to group functions by the pre-processor conditions that
-# control when they are compiled:
-my %groups;
-
-sub current_group {
-    my $group = \%groups;
-    # Nested #if blocks are effectively &&ed together
-    # For embed.fnc, ordering within the && isn't relevant, so we can
-    # sort them to try to group more functions together.
-    foreach (sort @state) {
-        $group->{$_} ||= {};
-        $group = $group->{$_};
-    }
-    return $group->{''} ||= [];
-}
-
-sub add_level {
-    my ($level, $indent, $wanted) = @_;
-    my $funcs = $level->{''};
-    my @entries;
-    if ($funcs) {
-        if (!defined $wanted) {
-            @entries = @$funcs;
-        } else {
-            foreach (@$funcs) {
-                if ($_->[0] =~ /[AC]/) { # 'C' is like 'A' for our purposes
-                                         # here
-                    push @entries, $_ if $wanted eq 'A';
-                } elsif ($_->[0] =~ /E/) {
-                    push @entries, $_ if $wanted eq 'E';
-                } else {
-                    push @entries, $_ if $wanted eq '';
-                }
-            }
-        }
-        @entries = sort {$a->[2] cmp $b->[2]} @entries;
-    }
-    foreach (sort grep {length $_} keys %$level) {
-        my @conditional = add_level($level->{$_}, $indent . '  ', $wanted);
-        push @entries,
-            ["#${indent}if $_"], @conditional, ["#${indent}endif"]
-                if @conditional;
-    }
-    return @entries;
-}
-
 sub setup_embed {
     my $prefix = shift || '';
-    open IN, '<', $prefix . 'embed.fnc' or die $!;
-
-    my @embed;
-    my %seen;
-    my $macro_depth = 0;
-
-    while (<IN>) {
-        chomp;
-        next if /^:/;
-        next if /^$/;
-        while (s|\\$||) {
-            $_ .= <IN>;
-            chomp;
-        }
-        s/\s+$//;
-        my @args;
-        if (/^\s*(#|$)/) {
-            @args = $_;
-        }
-        else {
-            @args = split /\s*\|\s*/, $_;
-        }
-        if (@args == 1) {
-            if ($args[0] !~ /^#\s*(?:if|ifdef|ifndef|else|endif)/) {
-                die "Illegal line $. '$args[0]' in embed.fnc";
-            }
-            $macro_depth++ if $args[0] =~/^#\s*if(n?def)?\b/;
-            $macro_depth-- if $args[0] =~/^#\s*endif\b/;
-            die "More #endif than #if in embed.fnc:$." if $macro_depth < 0;
-        }
-        else  {
-            die "Illegal line (less than 3 fields) in embed.fnc:$.: $_"
-                unless @args >= 3;
-            my $name = $args[2];
-            # only check for duplicates outside of #if's - otherwise
-            # they may be alternate definitions of the same function
-            if ($macro_depth == 0) {
-                die "Duplicate function name: '$name' in embed.fnc:$."
-                    if exists $seen{$name};
-            }
-            $seen{$name} = 1;
-        }
-
-        push @embed, \@args;
-    }
-    die "More #if than #endif by the end of embed.fnc" if $macro_depth != 0;
-
-    close IN or die "Problem reading embed.fnc: $!";
-
-    open IN, '<', $prefix . 'regen/opcodes' or die $!;
+    my $parser= HeaderParser->new(
+        pre_process_content => sub {
+            my ($self,$line_data)= @_;
+            # HeaderParser knows how to parse and normalize embed_fnc.
+            # calling this here ensures sets up the embed subpacket.
+            $self->tidy_embed_fnc_entry($line_data);
+            my $embed= $line_data->{embed}
+                or return;
+        },
+        post_process_grouped_content => sub {
+            # sort the group content by name.
+            @{$_[1]}=
+                sort {
+                    $a->{embed}{name} cmp $b->{embed}{name}
+                } @{$_[1]};
+        },
+    )->read_file($prefix . 'embed.fnc');
+    my $lines= $parser->lines();
+
+    # add the opcode checker functions automatically.
+    open my $in_fh, '<', $prefix . 'regen/opcodes' or die $!;
     {
         my %syms;
 
-        while (<IN>) {
-            chomp;
-            next unless $_;
-            next if /^#/;
-            my $check = (split /\t+/, $_)[2];
+        my $line_num = 0;
+        while (my $line= <$in_fh>) {
+            $line_num++;
+            chomp($line);
+            next unless $line;
+            next if $line=~/^#/;
+            my $check = (split /\t+/, $line)[2];
             next if $syms{$check}++;
 
             # These are all indirectly referenced by globals.c.
-            push @embed, ['pR', 'OP *', $check, 'NN OP *o'];
+            my $new= HeaderLine->new(
+                cond => [["defined(PERL_IN_GLOBALS_C) || defined(PERL_IN_OP_C) || defined(PERL_IN_PEEP_C)"]],
+                raw => "pR|OP *|$check|NN OP *o",
+                line => "pR|OP *|$check|NN OP *o",
+                type => "content",
+                level => 1,
+                source => 'regen/opcodes',
+                start_line_num => $line_num,
+            );
+            $parser->tidy_embed_fnc_entry($new);
+            push @$lines, $new;
         }
     }
-    close IN or die "Problem reading regen/opcodes: $!";
+    close $in_fh
+        or die "Problem reading regen/opcodes: $!";
 
     # Cluster entries in embed.fnc that have the same #ifdef guards.
     # Also, split out at the top level the three classes of functions.
-    # Output structure is actually the same as input structure - an
-    # (ordered) list of array references, where the elements in the
-    # reference determine what it is - a reference to a 1-element array is a
-    # pre-processor directive, a reference to 2+ element array is a function.
-
-    my $current = current_group();
-
-    foreach (@embed) {
-        if (@$_ > 1) {
-            push @$current, $_;
-            next;
-        }
-        $_->[0] =~ s/^#\s+/#/;
-        $_->[0] =~ /^\S*/;
-        $_->[0] =~ s/^#ifdef\s+(\S+)/#if defined($1)/;
-        $_->[0] =~ s/^#ifndef\s+(\S+)/#if !defined($1)/;
-        if ($_->[0] =~ /^#if\s*(.*)/) {
-            push @state, $1;
-        } elsif ($_->[0] =~ /^#else\s*$/) {
-            die "Unmatched #else in embed.fnc" unless @state;
-            $state[-1] = "!($state[-1])";
-        } elsif ($_->[0] =~ m!^#endif\s*(?:/\*.*\*/)?$!) {
-            die "Unmatched #endif in embed.fnc" unless @state;
-            pop @state;
-        } else {
-            die "Unhandled pre-processor directive '$_->[0]' in embed.fnc";
-        }
-        $current = current_group();
-    }
-
-    return ([add_level(\%groups, '')],
-            [add_level(\%groups, '', '')],    # core
-            [add_level(\%groups, '', 'E')],   # ext
-            [add_level(\%groups, '', 'A')]);  # api
+    # The result for each group_content() calls is an arrayref containing
+    # HeaderLine objects, with the embed.fnc data prenormalized, and each
+    # conditional clause containing a sorted list of functions, with
+    # any further conditional clauses following.
+    # Note this is a normalized and relatively smart grouping, and we can
+    # handle if/elif and etc properly. At the cost of being a touch slow.
+
+    return (
+        $parser->group_content($lines,
+                sub { $_[1]->{embed} }),                # everything
+        $parser->group_content($lines,
+                sub { $_[1]->{embed} &&
+                      $_[1]->{embed}{flags}=~/[AC]/ }), # only API and private API
+        $parser->group_content($lines,
+                sub { $_[1]->{embed} &&
+                      $_[1]->{embed}{flags}!~/[AC]/ &&  # otherwise Extensions
+                      $_[1]->{embed}{flags}=~/[E]/ }),
+        $parser->group_content($lines,
+                sub { $_[1]->{embed} &&
+                      $_[1]->{embed}{flags}!~/[AC]/ &&  # everything else.
+                      $_[1]->{embed}{flags}!~/[E]/ }),
+    );
 }
 
 1;
index ee54ed9..aeb04ed 100644 (file)
@@ -11,8 +11,9 @@
 # This script is normally invoked from regen.pl.
 
 BEGIN {
-    require './regen/regen_lib.pl';
     push @INC, './lib';
+    require './regen/regen_lib.pl';
+    require './regen/HeaderParser.pm';
 }
 
 use strict;
@@ -23,26 +24,28 @@ use warnings;
 
 # (feature name) => (internal name, used in %^H and macro names)
 my %feature = (
-    say             => 'say',
-    state           => 'state',
-    switch          => 'switch',
-    bitwise         => 'bitwise',
-    evalbytes       => 'evalbytes',
-    current_sub     => '__SUB__',
-    refaliasing     => 'refaliasing',
-    postderef_qq    => 'postderef_qq',
-    unicode_eval    => 'unieval',
-    declared_refs   => 'myref',
-    unicode_strings => 'unicode',
-    fc              => 'fc',
-    signatures      => 'signatures',
-    isa             => 'isa',
-    indirect        => 'indirect',
-    multidimensional => 'multidimensional',
-    bareword_filehandles => 'bareword_filehandles',
-    try             => 'try',
-    defer           => 'defer',
+    say                     => 'say',
+    state                   => 'state',
+    switch                  => 'switch',
+    bitwise                 => 'bitwise',
+    evalbytes               => 'evalbytes',
+    current_sub             => '__SUB__',
+    refaliasing             => 'refaliasing',
+    postderef_qq            => 'postderef_qq',
+    unicode_eval            => 'unieval',
+    declared_refs           => 'myref',
+    unicode_strings         => 'unicode',
+    fc                      => 'fc',
+    signatures              => 'signatures',
+    isa                     => 'isa',
+    indirect                => 'indirect',
+    multidimensional        => 'multidimensional',
+    bareword_filehandles    => 'bareword_filehandles',
+    try                     => 'try',
+    defer                   => 'defer',
     extra_paired_delimiters => 'more_delims',
+    module_true             => 'module_true',
+    class                   => 'class',
 );
 
 # NOTE: If a feature is ever enabled in a non-contiguous range of Perl
@@ -62,6 +65,11 @@ use constant V5_35  => sort grep {; $_ ne 'switch'
                                  && $_ ne 'indirect'
                                  && $_ ne 'multidimensional' } +V5_27, qw{isa signatures};
 
+use constant V5_37  => sort grep {; $_ ne 'bareword_filehandles' } +V5_35, qw{module_true};
+
+#
+# when updating features please also update the Pod entry for L</"FEATURES CHEAT SHEET">
+#
 my %feature_bundle = (
     all     => [ sort keys %feature ],
     default => [ qw{indirect multidimensional bareword_filehandles} ],
@@ -86,6 +94,8 @@ my %feature_bundle = (
     "5.33"  => [ +V5_27 ],
     # using 5.35 features bundle
     "5.35"  => [ +V5_35 ],
+    # using 5.37 features bundle
+    "5.37"  => [ +V5_37 ],
 );
 
 my @noops = qw( postderef lexical_subs );
@@ -142,12 +152,15 @@ for my $bund (
 my $HintShift;
 my $HintMask;
 my $Uni8Bit;
+my $hp = HeaderParser->new()->read_file("perl.h");
 
-open "perl.h", "<", "perl.h" or die "$0 cannot open perl.h: $!";
-while (readline "perl.h") {
-    next unless /#\s*define\s+(HINT_FEATURE_MASK|HINT_UNI_8_BIT)/;
+foreach my $line_data (@{$hp->lines}) {
+    next unless $line_data->{type} eq "content"
+            and $line_data->{sub_type} eq "#define";
+    my $line = $line_data->{line};
+    next unless $line=~/^\s*#\s*define\s+(HINT_FEATURE_MASK|HINT_UNI_8_BIT)/;
     my $is_u8b = $1 =~ 8;
-    /(0x[A-Fa-f0-9]+)/ or die "No hex number in:\n\n$_\n ";
+    $line=~/(0x[A-Fa-f0-9]+)/ or die "No hex number in:\n\n$line\n ";
     if ($is_u8b) {
        $Uni8Bit = $1;
     }
@@ -155,21 +168,19 @@ while (readline "perl.h") {
        my $hex = $HintMask = $1;
        my $bits = sprintf "%b", oct $1;
        $bits =~ /^0*1+(0*)\z/
-        or die "Non-contiguous bits in $bits (binary for $hex):\n\n$_\n ";
+         or die "Non-contiguous bits in $bits (binary for $hex):\n\n$line\n ";
        $HintShift = length $1;
        my $bits_needed =
            length sprintf "%b", scalar keys %UniqueBundles;
        $bits =~ /1{$bits_needed}/
            or die "Not enough bits (need $bits_needed)"
-                . " in $bits (binary for $hex):\n\n$_\n ";
+                 . " in $bits (binary for $hex):\n\n$line\n ";
     }
     if ($Uni8Bit && $HintMask) { last }
 }
 die "No HINT_FEATURE_MASK defined in perl.h" unless $HintMask;
 die "No HINT_UNI_8_BIT defined in perl.h"    unless $Uni8Bit;
 
-close "perl.h";
-
 my @HintedBundles =
     ('default', grep !/[^\d.]/, sort values %UniqueBundles);
 
@@ -298,8 +309,13 @@ for (@HintedBundles) {
 print $h <<'EOH';
 #define FEATURE_BUNDLE_CUSTOM  (HINT_FEATURE_MASK >> HINT_FEATURE_SHIFT)
 
-#define CURRENT_HINTS \
+/* this is preserved for testing and asserts */
+#define OLD_CURRENT_HINTS \
     (PL_curcop == &PL_compiling ? PL_hints : PL_curcop->cop_hints)
+/* this is the same thing, but simpler (no if) as PL_hints expands
+   to PL_compiling.cop_hints */
+#define CURRENT_HINTS \
+    PL_curcop->cop_hints
 #define CURRENT_FEATURE_BUNDLE \
     ((CURRENT_HINTS & HINT_FEATURE_MASK) >> HINT_FEATURE_SHIFT)
 
@@ -485,8 +501,7 @@ read_only_bottom_close_and_rename($h);
 
 __END__
 package feature;
-
-our $VERSION = '1.72';
+our $VERSION = '1.82';
 
 FEATURES
 
@@ -508,13 +523,13 @@ feature - Perl pragma to enable new features
     say "The case-folded version of $x is: " . fc $x;
 
 
-    # set features to match the :5.10 bundle, which may turn off or on
-    # multiple features (see below)
-    use feature ':5.10';
+    # set features to match the :5.36 bundle, which may turn off or on
+    # multiple features (see "FEATURE BUNDLES" below)
+    use feature ':5.36';
 
 
-    # implicitly loads :5.10 feature bundle
-    use v5.10;
+    # implicitly loads :5.36 feature bundle
+    use v5.36;
 
 =head1 DESCRIPTION
 
@@ -556,6 +571,8 @@ disable I<all> features (an unusual request!) use C<no feature ':all'>.
 
 =head1 AVAILABLE FEATURES
 
+Read L</"FEATURE BUNDLES"> for the feature cheat sheet summary.
+
 =head2 The 'say' feature
 
 C<use feature 'say'> tells the compiler to enable the Raku-inspired
@@ -588,6 +605,9 @@ given/when construct.
 See L<perlsyn/"Switch Statements"> for details.
 
 This feature is available starting with Perl 5.10.
+It is deprecated starting with Perl 5.38, and using
+C<given>, C<when> or smartmatch will throw a warning.
+It will be removed in Perl 5.42.
 
 =head2 The 'unicode_strings' feature
 
@@ -678,9 +698,10 @@ regardless of what feature declarations are in scope.
 =head2 The 'postderef' and 'postderef_qq' features
 
 The 'postderef_qq' feature extends the applicability of L<postfix
-dereference syntax|perlref/Postfix Dereference Syntax> so that postfix array
-and scalar dereference are available in double-quotish interpolations. For
-example, it makes the following two statements equivalent:
+dereference syntax|perlref/Postfix Dereference Syntax> so that
+postfix array dereference, postfix scalar dereference, and
+postfix array highest index access are available in double-quotish interpolations.
+For example, it makes the following two statements equivalent:
 
   my $s = "[@{ $h->{a} }]";
   my $s = "[$h->{a}->@*]";
@@ -771,7 +792,7 @@ warn when you use the feature, unless you have explicitly disabled the warning:
     no warnings "experimental::declared_refs";
 
 This allows a reference to a variable to be declared with C<my>, C<state>,
-our C<our>, or localized with C<local>.  It is intended mainly for use in
+or C<our>, or localized with C<local>.  It is intended mainly for use in
 conjunction with the "refaliasing" feature.  See L<perlref/Declaring a
 Reference to a Variable> for examples.
 
@@ -823,7 +844,7 @@ previous versions, it was simply on all the time.
 You can use the L<multidimensional> module on CPAN to disable
 multidimensional array emulation for older versions of Perl.
 
-=head2 The 'bareword_filehandles' feature.
+=head2 The 'bareword_filehandles' feature
 
 This feature enables bareword filehandles for builtin functions
 operations, a generally discouraged practice.  It is enabled by
@@ -839,7 +860,7 @@ previous versions it was simply on all the time.
 You can use the L<bareword::filehandles> module on CPAN to disable
 bareword filehandles for older versions of perl.
 
-=head2 The 'try' feature.
+=head2 The 'try' feature
 
 B<WARNING>: This feature is still experimental and the implementation may
 change or be removed in future versions of Perl.  For this reason, Perl will
@@ -877,6 +898,10 @@ This feature enables the use of more paired string delimiters than the
 traditional four, S<C<< <  > >>>, S<C<( )>>, S<C<{ }>>, and S<C<[ ]>>.  When
 this feature is on, for example, you can say S<C<qrE<171>patE<187>>>.
 
+As with any usage of non-ASCII delimiters in a UTF-8-encoded source file, you
+will want to ensure the parser will decode the source code from UTF-8 bytes
+with a declaration such as C<use utf8>.
+
 This feature is available starting in Perl 5.36.
 
 The complete list of accepted paired delimiters as of Unicode 14.0 is:
@@ -1269,6 +1294,25 @@ The complete list of accepted paired delimiters as of Unicode 14.0 is:
  🢫  🢪    U+1F8AB, U+1F8AA RIGHT/LEFTWARDS FRONT-TILTED SHADOWED WHITE
                           ARROW
 
+=head2 The 'module_true' feature
+
+This feature removes the need to return a true value at the end of a module
+loaded with C<require> or C<use>. Any errors during compilation will cause
+failures, but reaching the end of the module when this feature is in effect
+will prevent C<perl> from throwing an exception that the module "did not return
+a true value".
+
+=head2 The 'class' feature
+
+B<WARNING>: This feature is still experimental and the implementation may
+change or be removed in future versions of Perl.  For this reason, Perl will
+warn when you use the feature, unless you have explicitly disabled the warning:
+
+    no warnings "experimental::class";
+
+This feature enables the C<class> block syntax and other associated keywords
+which implement the "new" object system, previously codenamed "Corinna".
+
 =head1 FEATURE BUNDLES
 
 It's possible to load multiple features together, using
@@ -1311,12 +1355,12 @@ main compilation unit (that is, the one-liner that follows C<-E>).
 By explicitly requiring a minimum Perl version number for your program, with
 the C<use VERSION> construct.  That is,
 
-    use v5.10.0;
+    use v5.36.0;
 
 will do an implicit
 
     no feature ':all';
-    use feature ':5.10';
+    use feature ':5.36';
 
 and so on.  Note how the trailing sub-version
 is automatically stripped from the
@@ -1324,7 +1368,7 @@ version.
 
 But to avoid portability warnings (see L<perlfunc/use>), you may prefer:
 
-    use 5.010;
+    use 5.036;
 
 with the same effect.
 
index 7164fe2..2438436 100644 (file)
@@ -51,6 +51,10 @@ my %feature_kw = (
     catch     => 'try',
     finally   => 'try',
     defer     => 'defer',
+    class     => 'class',
+    field     => 'class',
+    method    => 'class',
+    ADJUST    => 'class',
 );
 
 my %pos = map { ($_ => 1) } @{$by_strength{'+'}};
@@ -119,6 +123,7 @@ __END__
 +__DATA__
 +__END__
 -__SUB__
++ADJUST
 +AUTOLOAD
 +BEGIN
 +UNITCHECK
@@ -144,6 +149,7 @@ __END__
 -chown
 -chr
 -chroot
+-class
 -close
 -closedir
 -cmp
@@ -179,6 +185,7 @@ __END__
 -exp
 -fc
 -fcntl
+-field
 -fileno
 +finally
 -flock
@@ -244,6 +251,7 @@ __END__
 -lt
 +m
 +map
+-method
 -mkdir
 -msgctl
 -msgget
index b30f790..3ba86f9 100644 (file)
@@ -74,12 +74,6 @@ foreach my $file (@ext) {
                 $package = $1;
                 last;
             }
-            elsif (/^\s*package\s*$/) {
-                # If they're hiding their package name, we ignore them
-                ++$ignore{"/$path"};
-                $package='';
-                last;
-            }
         }
         close $fh
             or die "Can't close $file: $!";
index 215c710..5c8a37c 100644 (file)
@@ -168,10 +168,17 @@ my %mg =
                      desc => 'Tied scalar or handle' },
      qr => { char => 'r', vtable => 'regexp', value_magic => 1, 
              readonly_acceptable => 1, desc => 'Precompiled qr// regex' },
+
+     hook => { char => 'Z',
+         vtable => 'hook', desc => '%{^HOOK} hash' },
+     hookelem => { char => 'z',
+         vtable => 'hookelem', desc => '%{^HOOK} hash element' },
+
      sig => { char => 'S', vtable => 'sig',
                      desc => '%SIG hash' },
      sigelem => { char => 's', vtable => 'sigelem',
                   desc => '%SIG hash element' },
+
      taint => { char => 't', vtable => 'taint', value_magic => 1,
                 desc => 'Taintedness' },
      uvar => { char => 'U', vtable => 'uvar',
@@ -202,21 +209,28 @@ my %mg =
                 desc => 'Extra data for restricted hashes' },
      arylen_p => { char => '@', value_magic => 1,
                    desc => 'To move arylen out of XPVAV' },
-     ext => { char => '~', desc => 'Available for use by extensions',
+     ext => { char => '~', desc => 'Variable magic available for use by extensions',
               readonly_acceptable => 1 },
+     extvalue => { char => '^', desc => 'Value magic available for use by extensions',
+              readonly_acceptable => 1, value_magic => 1 },
      checkcall => { char => ']', value_magic => 1, vtable => 'checkcall',
                     desc => 'Inlining/mutation of call to this CV'},
      debugvar => { char => '*', desc => '$DB::single, signal, trace vars',
                    vtable => 'debugvar' },
      lvref => { char => '\\', vtable => 'lvref',
                   desc => "Lvalue reference constructor" },
+     destruct => {
+        char        => "X",
+        vtable      => 'destruct',
+        desc        => "destruct callback",
+        value_magic => 1,
+     },
 );
 
 
-# %sig
+# %vtable_conf
 #
 # This hash is mainly concerned with populating the vtable.
-# (despite the name it has nothing to do with signals!)
 #
 # These have a subtly different "namespace" from the magic types.
 #
@@ -245,9 +259,9 @@ my %mg =
 #    dup
 #    local
 #       For each specified method, add a vtable function pointer
-#       of the form "Perl_magic_$sig{foo}{get}" etc
+#       of the form "Perl_magic_$vtable_conf{foo}{get}" etc
 
-my %sig =
+my %vtable_conf =
     (
      'sv' => {get => 'get', set => 'set'},
      'env' => {set => 'set_all_env', clear => 'clear_all_env'},
@@ -255,6 +269,10 @@ my %sig =
      'sig' => { set => 'setsigall' },
      'sigelem' => {get => 'getsig', set => 'setsig', clear => 'clearsig',
                    cond => '#ifndef PERL_MICRO'},
+
+     'hook' => { set => 'sethookall', clear => 'clearhookall' },
+     'hookelem' => {set => 'sethook', clear => 'clearhook'},
+
      'pack' => {len => 'sizepack', clear => 'wipepack'},
      'packelem' => {get => 'getpack', set => 'setpack', clear => 'clearpack'},
      'dbline' => {set => 'setdbline'},
@@ -287,6 +305,7 @@ my %sig =
      'checkcall' => {copy => 'copycallchecker'},
      'debugvar' => { set => 'setdebugvar', get => 'getdebugvar' },
      'lvref' => {set => 'setlvref'},
+     'destruct' => {free => 'freedestruct'},
 );
 
 
@@ -427,6 +446,7 @@ EOH
                     ($desc, @cont) = $desc =~ /(.{1,$desc_wrap})(?: |\z)/g
                 }
             }
+            s/\s+\z// for $desc, @cont;
             printf $format, $type, $vtbl, $desc;
             printf $format, '', '', $_ foreach @cont;
         }
@@ -453,9 +473,9 @@ EOH
 }
 
 
-# Process %sig - everything goes to mg_vtable.h
+# Process %vtable_conf - everything goes to mg_vtable.h
 
-my @names = sort keys %sig;
+my @names = sort keys %vtable_conf;
 {
     my $want = join ",\n    ", (map {"want_vtbl_$_"} @names), 'magic_vtable_max';
     my $names = join qq{",\n    "}, @names;
@@ -503,7 +523,7 @@ my @vtable_names;
 my @aliases;
 
 while (my $name = shift @names) {
-    my $data = $sig{$name};
+    my $data = $vtable_conf{$name};
     push @vtable_names, $name;
     my @funcs = map {
         $data->{$_} ? "Perl_magic_$data->{$_}" : 0;
index b192371..bcb002d 100644 (file)
@@ -13,7 +13,7 @@ use Unicode::UCD 'prop_invlist';
 # an application to see if the code point "i" has a particular property, it
 # just does
 #    'PL_charclass[i] & BIT'
-# The bit names are of the form '_CC_property_suffix', where 'CC' stands for
+# The bit names are of the form 'CC_property_suffix_', where 'CC' stands for
 # character class, and 'property' is the corresponding property, and 'suffix'
 # is one of '_A' to mean the property is true only if the corresponding code
 # point is ASCII, and '_L1' means that the range includes any Latin1
@@ -277,7 +277,7 @@ foreach my $bit_name (sort keys %bit_names) {
     foreach my $cp (@code_points) {
         last if $cp > 0xFF;
         $bits[$cp] .= '|' if $bits[$cp];
-        $bits[$cp] .= "(1U<<_CC_$bit_name)";
+        $bits[$cp] .= "(1U<<CC_${bit_name}_)";
     }
 }
 
index 12b9ce2..6391740 100644 (file)
@@ -11,12 +11,15 @@ use Unicode::UCD qw(prop_aliases
                     num
                     charblock
                    );
+use constant DEBUG => $ENV{DEBUG} // 0;
 require './regen/regen_lib.pl';
 require './regen/charset_translations.pl';
 require './lib/unicore/UCD.pl';
 require './regen/mph.pl';
 use re "/aa";
 
+print "Starting...\n" if DEBUG;
+
 # This program outputs charclass_invlists.h, which contains various inversion
 # lists in the form of C arrays that are to be used as-is for inversion lists.
 # Thus, the lists it contains are essentially pre-compiled, and need only a
@@ -72,10 +75,10 @@ print $out_fh <<'EOF';
  * encompassing all of the Unicode BMP, and thus including all the economically
  * important world scripts.  At 12 most of them are: including Arabic,
  * Cyrillic, Greek, Hebrew, Indian subcontinent, Latin, and Thai; but not Han,
- * Japanese, nor Korean.  (The regarglen structure in regnodes.h is a U8, and
- * the trie types TRIEC and AHOCORASICKC are larger than U8 for shift values
- * above 12.)  Be sure to benchmark before changing, as larger sizes do
- * significantly slow down the test suite */
+ * Japanese, nor Korean.  The regnode sizing data structure in regnodes.h currently
+ * uses a U8, and the trie types TRIEC and AHOCORASICKC are larger than U8 for
+ * shift values above 12.)  Be sure to benchmark before changing, as larger sizes
+ * do significantly slow down the test suite. */
 
 EOF
 
@@ -346,6 +349,8 @@ sub output_invlist ($$;$) {
     my $invlist = shift;     # Reference to inversion list array
     my $charset = shift // "";  # name of character set for comment
 
+    print "  output_invlist($name) $charset\n" if DEBUG;
+
     die "No inversion list for $name" unless defined $invlist
                                              && ref $invlist eq 'ARRAY';
 
@@ -392,6 +397,8 @@ sub output_invmap ($$$$$$$) {
                                 # property's standard possible values
     my $charset = shift // "";  # name of character set for comment
 
+    print "  output_invmap($name,$prop_name) $charset\n" if DEBUG;
+
     # Output the inversion map $invmap for property $prop_name, but use $name
     # as the actual data structure's name.
 
@@ -753,7 +760,7 @@ sub output_invmap ($$$$$$$) {
         switch_pound_if($name, $where, $charset);
 
         # The inversion lists here have to be UV because inversion lists are
-        # capable of storing any code point, and even though the the ones here
+        # capable of storing any code point, and even though the ones here
         # are only Unicode ones, which need just 21 bits, they are linked to
         # directly, rather than copied.  The inversion map and aux tables also
         # only need be 21 bits, and so we can get away with declaring them
@@ -968,6 +975,7 @@ sub mk_invlist_from_sorted_cp_list {
     return @invlist;
 }
 
+print "Reading Case Folding rules.\n" if DEBUG;
 # Read in the Case Folding rules, and construct arrays of code points for the
 # properties we need.
 my ($cp_ref, $folds_ref, $format, $default) = prop_invmap("Case_Folding");
@@ -975,6 +983,9 @@ die "Could not find inversion map for Case_Folding" unless defined $format;
 die "Incorrect format '$format' for Case_Folding inversion map"
                                                     unless $format eq 'al'
                                                            || $format eq 'a';
+print "Finished reading Case Folding rules.\n" if DEBUG;
+
+
 sub _Perl_IVCF {
 
     # This creates a map of the inversion of case folding. i.e., given a
@@ -2460,6 +2471,8 @@ end_file_pound_if;
 #
 # An initial & means to use the subroutine from this file instead of an
 # official inversion list.
+#
+print "Computing unicode properties\n" if DEBUG;
 
 # Below is the list of property names to generate.  '&' means to use the
 # subroutine to generate the inversion list instead of the generic code
@@ -3083,6 +3096,8 @@ foreach my $prop (@props) {
     }
 }
 
+print "Finished computing unicode properties\n" if DEBUG;
+
 print $out_fh "\nconst char * const deprecated_property_msgs[] = {\n\t";
 print $out_fh join ",\n\t", map { "\"$_\"" } @deprecated_messages;
 print $out_fh "\n};\n";
@@ -3163,6 +3178,7 @@ my %joined_values;
 # the C compiler.
 my @values_indices;
 
+print "Computing short unicode properties\n" if DEBUG;
 # Go through each property which is specifiable by \p{prop=value}, and create
 # a hash with the keys being the canonicalized short property names, and the
 # values for each property being all possible values that it can take on.
@@ -3194,6 +3210,7 @@ for my $property (sort { prop_name_for_cmp($a) cmp prop_name_for_cmp($b) }
         }
     }
 }
+print "Finished computing short unicode properties\n" if DEBUG;
 
 # Also include the old style block names, using the recipe given in
 # Unicode::UCD
@@ -3201,6 +3218,7 @@ foreach my $block (prop_values('block')) {
     push @{$all_values{'blk'}}, charblock((prop_invlist("block=$block"))[0]);
 }
 
+print "Creating property tables\n" if DEBUG;
 # Now create output tables for each property in @equals_properties (the keys
 # in %all_values) each containing that property's possible values as computed
 # just above.
@@ -3280,6 +3298,8 @@ output_WB_table();
 
 end_file_pound_if;
 
+print "Computing fold data\n" if DEBUG;
+
 print $out_fh <<"EOF";
 
 /* More than one code point may have the same code point as their fold.  This
@@ -3299,7 +3319,10 @@ my @sources = qw(regen/mk_invlists.pl
                );
 {
     # Depend on mktables’ own sources.  It’s a shorter list of files than
-    # those that Unicode::UCD uses.
+    # those that Unicode::UCD uses.  Some may not actually have an effect on
+    # the output of this program, but easier to just include all of them, and
+    # no real harm in doing so, as it is rare for one such to change without
+    # the others doing so as well.
     if (! open my $mktables_list, '<', $sources_list) {
 
           # This should force a rebuild once $sources_list exists
@@ -3350,6 +3373,8 @@ my $uni_pl = open_new('lib/unicore/uni_keywords.pl', '>',
 
 read_only_bottom_close_and_rename($uni_pl, \@sources);
 
+print "Computing minimal perfect hash for unicode properties.\n" if DEBUG;
+
 if (my $file= $ENV{DUMP_KEYWORDS_FILE}) {
     require Data::Dumper;
 
index 4300856..547879b 100644 (file)
@@ -199,7 +199,7 @@ use strict;
     # find which ops use 0,1,2,3 or 4 bits of op_private for arg count info
 
     $args0{$_} = 1 for qw(entersub avhvswitch
-                       rv2hv);                  # UNOPs that usurp bit 0
+                       rv2hv aelemfastlex_store);                  # UNOPs that usurp bit 0
 
     # Historically, bit ops used bit 0 to indicate 'use integer' in scope;
     # For now, ban use of bits 0..1 as an arg count, in order to detect
@@ -318,7 +318,7 @@ addbits($_, 7 => qw(OPpLVAL_INTRO LVINTRO))
     for qw(gvsv rv2sv rv2hv rv2gv rv2av aelem helem aslice split
            hslice delete padsv padav padhv enteriter entersub padrange
            pushmark cond_expr refassign lvref lvrefslice lvavref multideref
-           multiconcat),
+           multiconcat padsv_store undef emptyavhv),
            'list', # this gets set in my_attrs() for some reason
            ;
 
@@ -499,7 +499,8 @@ addbits($_, 7 => qw(OPpPV_IS_UTF8 UTF)) for qw(last redo next goto dump);
 #   \state $foo = ...
 
 addbits($_, 6 => qw(OPpPAD_STATE STATE))  for qw(padav padhv padsv lvavref
-                                                 lvref refassign pushmark);
+                                                 lvref refassign pushmark
+                                                 padsv_store undef emptyavhv);
 
 # NB: both sassign and aassign use the 'OPpASSIGN' naming convention
 # for their private flags
@@ -626,7 +627,7 @@ addbits('padrange',
 
 
 
-for (qw(aelemfast aelemfast_lex)) {
+for (qw(aelemfast aelemfast_lex aelemfastlex_store)) {
     addbits($_,
         '0..7' =>  {
                 label     => 'key',
@@ -738,6 +739,8 @@ addbits('entereval',
     3 => qw(OPpEVAL_BYTES        BYTES  ),
     4 => qw(OPpEVAL_COPHH        COPHH  ), # Construct %^H from COP hints
     5 => qw(OPpEVAL_RE_REPARSING REPARSE), # eval_sv(..., G_RE_REPARSING)
+    6 => qw(OPpEVAL_EVALSV       EVALSV ), # called from eval_sv()
+
 );
 
 
@@ -851,6 +854,39 @@ addbits('pushdefer',
     7 => qw(OPpDEFER_FINALLY FINALLY),
 );
 
+# undef does not have the T flag set in regen/opcodes (and therefore
+# automatically get the TARGMY flag added), as this causes S_maybe_targlex
+# to do an unwanted optimization prior to Perl_rpeep.
+addbits('undef',
+    4 => qw(OPpTARGET_MY TARGMY),
+    5 => qw(OPpUNDEF_KEEP_PV KEEP_PV),
+);
+
+addbits('emptyavhv',
+  # 7       OPpLVAL_INTRO
+  # 6       OPpPAD_STATE
+    5 => qw(OPpEMPTYAVHV_IS_HV ANONHASH),
+  # 4       OPpTARGET_MY
+);
+
+addbits('argdefelem',
+    7 => qw(OPpARG_IF_UNDEF  IF_UNDEF),
+    6 => qw(OPpARG_IF_FALSE  IF_FALSE),
+);
+
+addbits('helemexistsor',
+    7 => qw(OPpHELEMEXISTSOR_DELETE DELETE),
+);
+
+addbits('methstart',
+    7 => qw(OPpINITFIELDS INITFIELDS),
+);
+
+addbits('initfield',
+    1 => qw(OPpINITFIELD_AV INITFIELD_AV),
+    2 => qw(OPpINITFIELD_HV INITFIELD_HV),
+);
+
 1;
 
 # ex: set ts=8 sts=4 sw=4 et:
index 6f63115..812368f 100644 (file)
 #
 # This script is normally invoked from regen.pl.
 
-use strict;
+use v5.26;
+use warnings;
+
+sub generate_opcode_h;
+sub generate_opcode_h_epilogue;
+sub generate_opcode_h_prologue;
+sub generate_opcode_h_defines;
+sub generate_opcode_h_opnames;
+sub generate_opcode_h_pl_check;
+sub generate_opcode_h_pl_opargs;
+sub generate_opcode_h_pl_ppaddr;
+
+sub generate_opnames_h;
+sub generate_opnames_h_opcode_enum;
+sub generate_opnames_h_epilogue;
+sub generate_opnames_h_opcode_predicates;
+
+sub generate_pp_proto_h;
+
+sub generate_b_op_private_pm;
+
 my $restrict_to_core = "if defined(PERL_CORE) || defined(PERL_EXT)";
 
 BEGIN {
@@ -24,23 +44,6 @@ BEGIN {
     require './regen/regen_lib.pl';
 }
 
-my $oc = open_new('opcode.h', '>',
-                  {by => 'regen/opcode.pl', from => 'its data',
-                   file => 'opcode.h', style => '*',
-                   copyright => [1993 .. 2007]});
-
-my $on = open_new('opnames.h', '>',
-                  { by => 'regen/opcode.pl', from => 'its data', style => '*',
-                    file => 'opnames.h', copyright => [1999 .. 2008] });
-
-my $oprivpm = open_new('lib/B/Op_private.pm', '>',
-                  { by => 'regen/opcode.pl',
-                    from => "data in\nregen/op_private "
-                           ."and pod embedded in regen/opcode.pl",
-                    style => '#',
-                    file => 'lib/B/Op_private.pm',
-                    copyright => [2014 .. 2014] });
-
 # Read 'opcodes' data.
 
 my %seen;
@@ -918,21 +921,119 @@ require './regen/op_private';
 #use Data::Dumper;
 #print Dumper \%LABELS, \%DEFINES, \%FLAGS, \%BITFIELDS;
 
-print $oc "#$restrict_to_core\n\n";
+# Emit allowed argument types.
+
+my $ARGBITS = 32;
 
-# Emit defines.
+my %argnum = (
+    'S',  1,        # scalar
+    'L',  2,        # list
+    'A',  3,        # array value
+    'H',  4,        # hash value
+    'C',  5,        # code value
+    'F',  6,        # file value
+    'R',  7,        # scalar reference
+);
 
-{
+my %opclass = (
+    '0',  0,        # baseop
+    '1',  1,        # unop
+    '2',  2,        # binop
+    '|',  3,        # logop
+    '@',  4,        # listop
+    '/',  5,        # pmop
+    '$',  6,        # svop_or_padop
+    '#',  7,        # padop
+    '"',  8,        # pvop_or_svop
+    '{',  9,        # loop
+    ';',  10,       # cop
+    '%',  11,       # baseop_or_unop
+    '-',  12,       # filestatop
+    '}',  13,       # loopexop
+    '.',  14,       # methop
+    '+',  15,       # unop_aux
+);
+
+my %opflags = (
+    'm' =>   1,     # needs stack mark
+    'f' =>   2,     # fold constants
+    's' =>   4,     # always produces scalar
+    't' =>   8,     # needs target scalar
+    'T' =>   8 | 16,    # ... which may be lexical
+    'i' =>   0,     # always produces integer (unused since e7311069)
+    'I' =>  32,     # has corresponding int op
+    'd' =>  64,     # danger, make temp copy in list assignment
+    'u' => 128,     # defaults to $_
+);
+
+generate_opcode_h;
+generate_opnames_h;
+generate_pp_proto_h;
+generate_b_op_private_pm;
+
+sub gen_op_is_macro {
+    my ($op_is, $macname) = @_;
+    if (keys %$op_is) {
+        
+        # get opnames whose numbers are lowest and highest
+        my ($first, @rest) = sort {
+            $op_is->{$a} <=> $op_is->{$b}
+        } keys %$op_is;
+        
+        my $last = pop @rest;   # @rest slurped, get its last
+        die "Invalid range of ops: $first .. $last\n" unless $last;
+
+        print "\n#define $macname(op)   \\\n\t(";
+
+        # verify that op-ct matches 1st..last range (and fencepost)
+        # (we know there are no dups)
+        if ( $op_is->{$last} - $op_is->{$first} == scalar @rest + 1) {
+            
+            # contiguous ops -> optimized version
+            print "(op) >= OP_" . uc($first)
+                . " && (op) <= OP_" . uc($last);
+        }
+        else {
+            print join(" || \\\n\t ",
+                           map { "(op) == OP_" . uc() } sort keys %$op_is);
+        }
+        print ")\n";
+    }
+}
+
+sub generate_opcode_h {
+    my $oc = open_new( 'opcode.h', '>', {
+        by        => 'regen/opcode.pl',
+        copyright => [1993 .. 2007],
+        file      => 'opcode.h',
+        from      => 'its data',
+        style     => '*',
+    });
+
+    my $old = select $oc;
+
+    generate_opcode_h_prologue;
+    generate_opcode_h_defines;
+    generate_opcode_h_opnames;
+    generate_opcode_h_pl_ppaddr;
+    generate_opcode_h_pl_check;
+    generate_opcode_h_pl_opargs;
+    generate_opcode_h_epilogue;
+
+    select $old;
+}
+
+my @unimplemented;
+sub generate_opcode_h_defines {
     my $last_cond = '';
-    my @unimplemented;
 
     sub unimplemented {
         if (@unimplemented) {
-            print $oc "#else\n";
+            print "#else\n";
             foreach (@unimplemented) {
-                print $oc "#define $_ Perl_unimplemented_op\n";
+                print "#define $_ Perl_unimplemented_op\n";
             }
-            print $oc "#endif\n";
+            print "#endif\n";
             @unimplemented = ();
         }
 
@@ -947,289 +1048,277 @@ print $oc "#$restrict_to_core\n\n";
             unimplemented();
             $last_cond = $cond;
             if ($last_cond) {
-                print $oc "$last_cond\n";
+                print "$last_cond\n";
             }
         }
         push @unimplemented, $op_func if $last_cond;
-        print $oc "#define $op_func $impl\n" if $impl ne $op_func;
+        print "#define $op_func $impl\n" if $impl ne $op_func;
     }
     # If the last op was conditional, we need to close it out:
     unimplemented();
-}
-print $oc "\n#endif /* End of $restrict_to_core */\n\n";
 
-print $on "typedef enum opcode {\n";
+    print "\n#endif /* End of $restrict_to_core */\n\n";
+}
 
-my $i = 0;
-for (@ops) {
-      print $on "\t", tab(3,"OP_\U$_"), " = ", $i++, ",\n";
+sub generate_opcode_h_epilogue {
+    print "\n\n";
+    OP_PRIVATE::print_defines(select);
+    OP_PRIVATE::print_PL_op_private_tables(select);
+    read_only_bottom_close_and_rename(select);
 }
-print $on "\t", tab(3,"OP_max"), "\n";
-print $on "} opcode;\n";
-print $on "\n#define MAXO ", scalar @ops, "\n";
-print $on "#define OP_FREED MAXO\n";
 
-# Emit op names and descriptions.
+sub generate_opcode_h_prologue {
+    print "#$restrict_to_core\n\n";
+}
 
-print $oc <<'END';
-START_EXTERN_C
+sub generate_opcode_h_opnames {
+    # Emit op names and descriptions.
+    print <<~'END';
+    START_EXTERN_C
 
-#ifndef DOINIT
-EXTCONST char* const PL_op_name[];
-#else
-EXTCONST char* const PL_op_name[] = {
-END
+    EXTCONST char* const PL_op_name[] INIT({
+    END
 
-for (@ops) {
-    print $oc qq(\t"$_",\n);
-}
+    for (@ops) {
+        print qq(\t"$_",\n);
+    }
 
-print $oc <<'END';
-        "freed",
-};
-#endif
+    print <<~'END';
+            "freed",
+    });
 
-#ifndef DOINIT
-EXTCONST char* const PL_op_desc[];
-#else
-EXTCONST char* const PL_op_desc[] = {
-END
+    EXTCONST char* const PL_op_desc[] INIT({
+    END
 
-for (@ops) {
-    my($safe_desc) = $desc{$_};
+    for (@ops) {
+        my($safe_desc) = $desc{$_};
 
-    # Have to escape double quotes and escape characters.
-    $safe_desc =~ s/([\\"])/\\$1/g;
+        # Have to escape double quotes and escape characters.
+        $safe_desc =~ s/([\\"])/\\$1/g;
 
-    print $oc qq(\t"$safe_desc",\n);
-}
+        print qq(\t"$safe_desc",\n);
+    }
 
-print $oc <<'END';
+    print <<~'END';
         "freed op",
-};
-#endif
-
-END_EXTERN_C
-END
+    });
 
-# Emit ppcode switch array.
-
-print $oc <<'END';
+    END_EXTERN_C
+    END
+}
 
-START_EXTERN_C
+sub generate_opcode_h_pl_check {
+    print <<~'END';
 
-EXT Perl_ppaddr_t PL_ppaddr[] /* or perlvars.h */
-#if defined(DOINIT)
-= {
-END
+    EXT Perl_check_t PL_check[] /* or perlvars.h */
+    INIT({
+    END
 
-for (@ops) {
-    my $op_func = "Perl_pp_$_";
-    my $name = $alias{$_};
-    if ($name && $name->[0] ne $op_func) {
-        print $oc "\t$op_func,\t/* implemented by $name->[0] */\n";
-    }
-    else {
-        print $oc "\t$op_func,\n";
+    for (@ops) {
+        print "\t", tab(3, "Perl_$check{$_},"), "\t/* $_ */\n";
     }
-}
 
-print $oc <<'END';
+    print <<~'END';
+    });
+    END
 }
-#endif
-;
 
-EXT Perl_check_t PL_check[] /* or perlvars.h */
-#if defined(DOINIT)
-= {
-END
+sub generate_opcode_h_pl_opargs {
+    my $OCSHIFT = 8;
+    my $OASHIFT = 12;
 
-for (@ops) {
-    print $oc "\t", tab(3, "Perl_$check{$_},"), "\t/* $_ */\n";
-}
+    print <<~'END';
 
-print $oc <<'END';
-}
-#endif
-;
+    EXTCONST U32 PL_opargs[] INIT({
+    END
 
-#ifndef DOINIT
-EXTCONST U32 PL_opargs[];
-#else
-EXTCONST U32 PL_opargs[] = {
-END
+    for my $op (@ops) {
+        my $argsum = 0;
+        my $flags = $flags{$op};
+        for my $flag (keys %opflags) {
+            if ($flags =~ s/$flag//) {
+                die "Flag collision for '$op' ($flags{$op}, $flag)\n"
+                    if $argsum & $opflags{$flag};
+                $argsum |= $opflags{$flag};
+            }
+        }
+        die qq[Opcode '$op' has no class indicator ($flags{$op} => $flags)\n]
+            unless exists $opclass{$flags};
+        $argsum |= $opclass{$flags} << $OCSHIFT;
+        my $argshift = $OASHIFT;
+        for my $arg (split(' ',$args{$op})) {
+            if ($arg =~ s/^D//) {
+                # handle 1st, just to put D 1st.
+            }
+            if ($arg =~ /^F/) {
+                # record opnums of these opnames
+                $arg =~ s/s//;
+                $arg =~ s/-//;
+                $arg =~ s/\+//;
+            } elsif ($arg =~ /^S./) {
+                $arg =~ s/<//;
+                $arg =~ s/\|//;
+            }
+            my $argnum = ($arg =~ s/\?//) ? 8 : 0;
+            die "op = $op, arg = $arg\n"
+                unless exists $argnum{$arg};
+            $argnum += $argnum{$arg};
+            die "Argument overflow for '$op'\n"
+                if $argshift >= $ARGBITS ||
+                $argnum > ((1 << ($ARGBITS - $argshift)) - 1);
+            $argsum += $argnum << $argshift;
+            $argshift += 4;
+        }
+        $argsum = sprintf("0x%08x", $argsum);
+        print "\t", tab(3, "$argsum,"), "/* $op */\n";
+    }
 
-# Emit allowed argument types.
+    print <<~'END';
+    });
 
-my $ARGBITS = 32;
+    END_EXTERN_C
+    END
+}
 
-my %argnum = (
-    'S',  1,           # scalar
-    'L',  2,           # list
-    'A',  3,           # array value
-    'H',  4,           # hash value
-    'C',  5,           # code value
-    'F',  6,           # file value
-    'R',  7,           # scalar reference
-);
+sub generate_opcode_h_pl_ppaddr {
+    # Emit ppcode switch array.
 
-my %opclass = (
-    '0',  0,           # baseop
-    '1',  1,           # unop
-    '2',  2,           # binop
-    '|',  3,           # logop
-    '@',  4,           # listop
-    '/',  5,           # pmop
-    '$',  6,           # svop_or_padop
-    '#',  7,           # padop
-    '"',  8,           # pvop_or_svop
-    '{',  9,           # loop
-    ';',  10,          # cop
-    '%',  11,          # baseop_or_unop
-    '-',  12,          # filestatop
-    '}',  13,          # loopexop
-    '.',  14,          # methop
-    '+',  15,          # unop_aux
-);
+    print <<~'END';
 
-my %opflags = (
-    'm' =>   1,                # needs stack mark
-    'f' =>   2,                # fold constants
-    's' =>   4,                # always produces scalar
-    't' =>   8,                # needs target scalar
-    'T' =>   8 | 16,   # ... which may be lexical
-    'i' =>   0,                # always produces integer (unused since e7311069)
-    'I' =>  32,                # has corresponding int op
-    'd' =>  64,                # danger, make temp copy in list assignment
-    'u' => 128,                # defaults to $_
-);
+    START_EXTERN_C
 
-my %OP_IS_SOCKET;      # /Fs/
-my %OP_IS_FILETEST;    # /F-/
-my %OP_IS_FT_ACCESS;   # /F-+/
-my %OP_IS_NUMCOMPARE;  # /S</
-my %OP_IS_DIRHOP;      # /Fd/
-my %OP_IS_INFIX_BIT;   # /S\|/
-
-my $OCSHIFT = 8;
-my $OASHIFT = 12;
-
-for my $op (@ops) {
-    my $argsum = 0;
-    my $flags = $flags{$op};
-    for my $flag (keys %opflags) {
-        if ($flags =~ s/$flag//) {
-            die "Flag collision for '$op' ($flags{$op}, $flag)\n"
-                if $argsum & $opflags{$flag};
-            $argsum |= $opflags{$flag};
-        }
-    }
-    die qq[Opcode '$op' has no class indicator ($flags{$op} => $flags)\n]
-        unless exists $opclass{$flags};
-    $argsum |= $opclass{$flags} << $OCSHIFT;
-    my $argshift = $OASHIFT;
-    for my $arg (split(' ',$args{$op})) {
-        if ($arg =~ s/^D//) {
-            # handle 1st, just to put D 1st.
-            $OP_IS_DIRHOP{$op}   = $opnum{$op};
-        }
-        if ($arg =~ /^F/) {
-            # record opnums of these opnames
-            $OP_IS_SOCKET{$op}   = $opnum{$op} if $arg =~ s/s//;
-            $OP_IS_FILETEST{$op} = $opnum{$op} if $arg =~ s/-//;
-            $OP_IS_FT_ACCESS{$op} = $opnum{$op} if $arg =~ s/\+//;
-        }
-        elsif ($arg =~ /^S./) {
-            $OP_IS_NUMCOMPARE{$op} = $opnum{$op} if $arg =~ s/<//;
-            $OP_IS_INFIX_BIT {$op} = $opnum{$op} if $arg =~ s/\|//;
+    EXT Perl_ppaddr_t PL_ppaddr[] /* or perlvars.h */
+    INIT({
+    END
+
+    for (@ops) {
+        my $op_func = "Perl_pp_$_";
+        my $name = $alias{$_};
+        if ($name && $name->[0] ne $op_func) {
+            print "\t$op_func,\t/* implemented by $name->[0] */\n";
+        } else {
+            print "\t$op_func,\n";
         }
-        my $argnum = ($arg =~ s/\?//) ? 8 : 0;
-        die "op = $op, arg = $arg\n"
-            unless exists $argnum{$arg};
-        $argnum += $argnum{$arg};
-        die "Argument overflow for '$op'\n"
-            if $argshift >= $ARGBITS ||
-               $argnum > ((1 << ($ARGBITS - $argshift)) - 1);
-        $argsum += $argnum << $argshift;
-        $argshift += 4;
     }
-    $argsum = sprintf("0x%08x", $argsum);
-    print $oc "\t", tab(3, "$argsum,"), "/* $op */\n";
+
+    print <<~'END';
+    });
+    END
 }
 
-print $oc <<'END';
-};
-#endif
+sub generate_opnames_h {
+    my $on = open_new('opnames.h', '>', {
+        by => 'regen/opcode.pl',
+        from => 'its data',
+        style => '*',
+        file => 'opnames.h',
+        copyright => [1999 .. 2008],
+    });
 
-END_EXTERN_C
-END
+    my $old = select $on;
 
-# Emit OP_IS_* macros
+    generate_opnames_h_opcode_enum;
+    generate_opnames_h_opcode_predicates;
+    generate_opnames_h_epilogue;
 
-print $on <<'EO_OP_IS_COMMENT';
+    select $old;
+}
 
-/* the OP_IS_* macros are optimized to a simple range check because
-    all the member OPs are contiguous in regen/opcodes table.
-    opcode.pl verifies the range contiguity, or generates an OR-equals
-    expression */
-EO_OP_IS_COMMENT
+sub generate_opnames_h_opcode_enum {
+    print "typedef enum opcode {\n";
 
-gen_op_is_macro( \%OP_IS_SOCKET, 'OP_IS_SOCKET');
-gen_op_is_macro( \%OP_IS_FILETEST, 'OP_IS_FILETEST');
-gen_op_is_macro( \%OP_IS_FT_ACCESS, 'OP_IS_FILETEST_ACCESS');
-gen_op_is_macro( \%OP_IS_NUMCOMPARE, 'OP_IS_NUMCOMPARE');
-gen_op_is_macro( \%OP_IS_DIRHOP, 'OP_IS_DIRHOP');
-gen_op_is_macro( \%OP_IS_INFIX_BIT, 'OP_IS_INFIX_BIT');
+    my $i = 0;
+    for (@ops) {
+        print "\t", tab(3,"OP_\U$_"), " = ", $i++, ",\n";
+    }
 
-sub gen_op_is_macro {
-    my ($op_is, $macname) = @_;
-    if (keys %$op_is) {
-        
-        # get opnames whose numbers are lowest and highest
-        my ($first, @rest) = sort {
-            $op_is->{$a} <=> $op_is->{$b}
-        } keys %$op_is;
-        
-        my $last = pop @rest;  # @rest slurped, get its last
-        die "Invalid range of ops: $first .. $last\n" unless $last;
+    print "\t", tab(3,"OP_max"), "\n";
+    print "} opcode;\n";
+    print "\n#define MAXO ", scalar @ops, "\n";
+    print "#define OP_FREED MAXO\n";
+}
 
-        print $on "\n#define $macname(op)      \\\n\t(";
+sub generate_opnames_h_epilogue {
+    read_only_bottom_close_and_rename(select);
+}
 
-        # verify that op-ct matches 1st..last range (and fencepost)
-        # (we know there are no dups)
-        if ( $op_is->{$last} - $op_is->{$first} == scalar @rest + 1) {
-            
-            # contiguous ops -> optimized version
-            print $on "(op) >= OP_" . uc($first)
-                . " && (op) <= OP_" . uc($last);
-        }
-        else {
-            print $on join(" || \\\n\t ",
-                           map { "(op) == OP_" . uc() } sort keys %$op_is);
+sub generate_opnames_h_opcode_predicates {
+    # Emit OP_IS_* macros
+    print <<~'EO_OP_IS_COMMENT';
+
+    /* the OP_IS_* macros are optimized to a simple range check because
+        all the member OPs are contiguous in regen/opcodes table.
+        opcode.pl verifies the range contiguity, or generates an OR-equals
+        expression */
+    EO_OP_IS_COMMENT
+
+    my %OP_IS_SOCKET;                    # /Fs/
+    my %OP_IS_FILETEST;                  # /F-/
+    my %OP_IS_FT_ACCESS;                 # /F-+/
+    my %OP_IS_NUMCOMPARE;                # /S</
+    my %OP_IS_DIRHOP;                    # /Fd/
+    my %OP_IS_INFIX_BIT;                 # /S\|/
+
+    for my $op (@ops) {
+        for my $arg (split(' ',$args{$op})) {
+            if ($arg =~ s/^D//) {
+                # handle 1st, just to put D 1st.
+                $OP_IS_DIRHOP{$op}   = $opnum{$op};
+            }
+            if ($arg =~ /^F/) {
+                # record opnums of these opnames
+                $OP_IS_SOCKET{$op}   = $opnum{$op} if $arg =~ s/s//;
+                $OP_IS_FILETEST{$op} = $opnum{$op} if $arg =~ s/-//;
+                $OP_IS_FT_ACCESS{$op} = $opnum{$op} if $arg =~ s/\+//;
+            } elsif ($arg =~ /^S./) {
+                $OP_IS_NUMCOMPARE{$op} = $opnum{$op} if $arg =~ s/<//;
+                $OP_IS_INFIX_BIT {$op} = $opnum{$op} if $arg =~ s/\|//;
+            }
         }
-        print $on ")\n";
     }
+
+    gen_op_is_macro( \%OP_IS_SOCKET, 'OP_IS_SOCKET');
+    gen_op_is_macro( \%OP_IS_FILETEST, 'OP_IS_FILETEST');
+    gen_op_is_macro( \%OP_IS_FT_ACCESS, 'OP_IS_FILETEST_ACCESS');
+    gen_op_is_macro( \%OP_IS_NUMCOMPARE, 'OP_IS_NUMCOMPARE');
+    gen_op_is_macro( \%OP_IS_DIRHOP, 'OP_IS_DIRHOP');
+    gen_op_is_macro( \%OP_IS_INFIX_BIT, 'OP_IS_INFIX_BIT');
 }
 
-my $pp = open_new('pp_proto.h', '>',
-                  { by => 'opcode.pl', from => 'its data' });
+sub generate_pp_proto_h {
+    my $pp = open_new('pp_proto.h', '>', {
+        by => 'opcode.pl',
+        from => 'its data',
+    });
+
+    my $old = select $pp;
 
-{
     my %funcs;
     for (@ops) {
-        my $name = $alias{$_} ? $alias{$_}[0] : "Perl_pp_$_";
+        my $name = $alias{$_} ? $alias{$_}[0] : "pp_$_";
+        $name =~ s/^Perl_//;
         ++$funcs{$name};
     }
-    print $pp "PERL_CALLCONV OP *$_(pTHX);\n" foreach sort keys %funcs;
-}
 
-print $oc "\n\n";
-OP_PRIVATE::print_defines($oc);
-OP_PRIVATE::print_PL_op_private_tables($oc);
+    for (sort keys %funcs) {
+        print $pp qq{PERL_CALLCONV PP($_) __attribute__visibility__("hidden");\n};
+    }
 
-OP_PRIVATE::print_B_Op_private($oprivpm);
+    read_only_bottom_close_and_rename(select);
 
-foreach ($oc, $on, $pp, $oprivpm) {
-    read_only_bottom_close_and_rename($_);
+    select $old;
 }
 
+sub generate_b_op_private_pm {
+    my $oprivpm = open_new('lib/B/Op_private.pm', '>', {
+        by          => 'regen/opcode.pl',
+        from        => "data in\nregen/op_private and pod embedded in regen/opcode.pl",
+        style       => '#',
+        file        => 'lib/B/Op_private.pm',
+        copyright   => [2014 .. 2014],
+    });
+
+    OP_PRIVATE::print_B_Op_private($oprivpm);
+
+    read_only_bottom_close_and_rename($oprivpm);
+}
index 7b0316f..9bdf5c5 100644 (file)
@@ -53,6 +53,7 @@ gvsv          scalar variable         ck_null         ds$
 gv             glob value              ck_null         ds$     
 gelem          glob elem               ck_null         ds2     S S
 padsv          private variable        ck_null         ds0
+padsv_store    padsv scalar assignment ck_sassign      s1      S S
 padav          private array           ck_null         d0
 padhv          private hash            ck_null         d0
 padany         private value           ck_null         d0
@@ -222,6 +223,7 @@ quotemeta   quotemeta               ck_fun          fstu%   S?
 rv2av          array dereference       ck_rvconst      dt1     
 aelemfast      constant array element  ck_null         ds$     A S
 aelemfast_lex  constant lexical array element  ck_null         d0      A S
+aelemfastlex_store     const lexical array element store       ck_null         d1      A S
 aelem          array element           ck_null         s2      A S
 aslice         array slice             ck_null         m@      A L
 kvaslice       index/value array slice ck_null         m@      A L
@@ -259,6 +261,7 @@ list                list                    ck_null         m@      L
 lslice         list slice              ck_null         2       H L L
 anonlist       anonymous array ([])    ck_fun          ms@     L
 anonhash       anonymous hash ({})     ck_fun          ms@     L
+emptyavhv      empty anon hash/array   ck_fun          sT@     L
 
 splice         splice                  ck_fun          m@      A S? S? L
 push           push                    ck_fun          imsT@   A L
@@ -584,8 +587,8 @@ poptry              pop try                 ck_null         @
 catch          catch {} block          ck_null         |
 pushdefer      push defer {} block     ck_null         |
 
-is_bool                boolean type test       ck_null         fsT1
-is_weak                weakref type test       ck_null         fsT1
+is_bool                boolean type test       ck_null         fs1
+is_weak                weakref type test       ck_null         fs1
 weaken         reference weaken        ck_null         1
 unweaken       reference unweaken      ck_null         1
 blessed                blessed                 ck_null         fs1
@@ -593,3 +596,10 @@ refaddr            refaddr                 ck_null         fsT1
 reftype                reftype                 ck_null         fsT1
 ceil           ceil                    ck_null         fsT1
 floor          floor                   ck_null         fsT1
+is_tainted     is_tainted              ck_null         fs1
+
+# exists-or; not currently exposed as a Perl-callable op
+helemexistsor  hash element exists or  ck_helemexistsor        |       S S
+
+methstart      method start            ck_null         +
+initfield      initialise field        ck_null         +
index 6d35de7..94a53db 100644 (file)
@@ -9,6 +9,7 @@
 # from information stored in
 #
 #    regcomp.sym
+#    op_reg_common.h
 #    regexp.h
 #
 # pod/perldebguts.pod is not completely regenerated.  Only the table of
 # Accepts the standard regen_lib -q and -v args.
 #
 # This script is normally invoked from regen.pl.
+#
+# F<regcomp.sym> defines the opcodes and states used in the regex
+# engine, it also includes documentation on the opcodes. This script
+# parses those definitions out and turns them into typedefs, defines,
+# and data structures, and maybe even code which the regex engine can
+# use to operate.
+#
+# F<regexp.h> and op_reg_common.h contain defines C<RXf_xxx> and
+# C<PREGf_xxx> that are used in flags in our code. These defines are
+# parsed out and data structures are created to allow the debug mode of
+# the regex engine to show things such as which flags were set during
+# compilation. In some cases we transform the C code in the header files
+# into perl code which we execute to C<eval()> the contents. For instance
+# in a situation like this:
+#
+#   #define RXf_X 0x1   /* the X mode */
+#   #define RXf_Y 0x2   /* the Y mode */
+#   #define RXf_Z (X|Y) /* the Z mode */
+#
+# this script might end up eval()ing something like C<0x1> and then
+# C<0x2> and then C<(0x1|0x2)> the results of which it then might use in
+# constructing a data structure, or pod in perldebguts, or a comment in
+# C<regnodes.h>. It also would separate out the "X", "Y", and "Z" and
+# use them, and would also use the data in the line comment if present.
+#
+# If you compile a regex under perl -Mre=Debug,ALL you can see much
+# of the content that this file generates and parses out of its input
+# files.
 
 BEGIN {
     # Get function prototypes
     require './regen/regen_lib.pl';
+    require './regen/HeaderParser.pm';
 }
 
 use strict;
@@ -51,8 +81,8 @@ use strict;
 # id            Both    integer value for this opcode/state
 # optype        Both    Either 'op' or 'state'
 # line_num      Both    line_num number of the input file for this item.
-# type          Op      Type of node (aka regkind)
-# code          Op      Apparently not used
+# type          Op      Type of node (aka regnode_kind)
+# code          Op      Meta about the node, used to detect variable length nodes
 # suffix        Op      which regnode struct this uses, so if this is '1', it
 #                       uses 'struct regnode_1'
 # flags         Op      S for simple; V for varies
@@ -272,10 +302,10 @@ sub print_process_EXACTish {
     print $out <<EOP,
 
 /* Is 'op', known to be of type EXACT, folding? */
-#define isEXACTFish(op) (__ASSERT_(PL_regkind[op] == EXACT) (PL_EXACTFish_bitmask & (1U << (op - EXACT))))
+#define isEXACTFish(op) (__ASSERT_(REGNODE_TYPE(op) == EXACT) (PL_EXACTFish_bitmask & (1U << (op - EXACT))))
 
 /* Do only UTF-8 target strings match 'op', known to be of type EXACT? */
-#define isEXACT_REQ8(op) (__ASSERT_(PL_regkind[op] == EXACT) (PL_EXACT_REQ8_bitmask & (1U << (op - EXACT))))
+#define isEXACT_REQ8(op) (__ASSERT_(REGNODE_TYPE(op) == EXACT) (PL_EXACT_REQ8_bitmask & (1U << (op - EXACT))))
 
 #ifndef DOINIT
 EXTCONST U32 PL_EXACTFish_bitmask;
@@ -456,105 +486,102 @@ sub print_state_def_line
     print $fh "\n"; # Blank line separates groups for clarity
 }
 
-sub print_regkind {
+sub print_typedefs {
     my ($out)= @_;
     print $out <<EOP;
 
-/* PL_regkind[] What type of regop or state is this. */
+/* typedefs for regex nodes - one typedef per node type */
 
-#ifndef DOINIT
-EXTCONST U8 PL_regkind[];
-#else
-EXTCONST U8 PL_regkind[] = {
 EOP
-    use Data::Dumper;
-    foreach my $node (@all) {
-        print Dumper($node) if !defined $node->{type} or !defined( $node->{name} );
-        printf $out "\t%*s\t/* %*s */\n",
-            -1 - $twidth, "$node->{type},", -$base_name_width, $node->{name};
-        print $out "\t/* ------------ States ------------- */\n"
-            if $node->{id} == $#ops and $node->{id} != $#all;
+    my $len= 0;
+    foreach my $node (@ops) {
+        if ($node->{suffix} and $len < length($node->{suffix})) {
+            $len= length $node->{suffix};
+        }
+    }
+    $len += length "struct regnode_";
+    $len = (int($len/5)+2)*5;
+    my $prefix= "tregnode";
+
+    foreach my $node (sort { $a->{name} cmp $b->{name} } @ops) {
+        my $struct_name= "struct regnode";
+        if (my $suffix= $node->{suffix}) {
+            $struct_name .= "_$suffix";
+        }
+        $node->{typedef}= $prefix . "_" . $node->{name};
+        printf $out "typedef %*s %s;\n", -$len, $struct_name, $node->{typedef};
     }
-
     print $out <<EOP;
-};
-#endif
-EOP
-}
 
-sub wrap_ifdef_print {
-    my $out= shift;
-    my $token= shift;
-    print $out <<EOP;
+/* end typedefs */
 
-#ifdef $token
 EOP
-    $_->($out) for @_;
-    print $out <<EOP;
-#endif /* $token */
 
-EOP
 }
 
-sub print_regarglen {
-    my ($out)= @_;
-    print $out <<EOP;
-
-/* regarglen[] - How large is the argument part of the node (in regnodes) */
-
-static const U8 regarglen[] = {
-EOP
-
-    foreach my $node (@ops) {
-        my $size= 0;
-        $size= "EXTRA_SIZE(struct regnode_$node->{suffix})" if $node->{suffix};
 
-        printf $out "\t%*s\t/* %*s */\n", -37, "$size,", -$rwidth, $node->{name};
-    }
 
-    print $out <<EOP;
-};
-EOP
-}
 
-sub print_reg_off_by_arg {
+sub print_regnode_info {
     my ($out)= @_;
     print $out <<EOP;
 
-/* reg_off_by_arg[] - Which argument holds the offset to the next node */
+/* PL_regnode_info[] - Opcode/state names in string form, for debugging */
 
-static const char reg_off_by_arg[] = {
+#ifndef DOINIT
+EXTCONST struct regnode_meta PL_regnode_info[];
+#else
+EXTCONST struct regnode_meta PL_regnode_info[] = {
 EOP
+    my @fields= qw(type arg_len arg_len_varies off_by_arg);
+    foreach my $node_idx (0..$#all) {
+        my $node= $all[$node_idx];
+        {
+            my $size= 0;
+            $size= "EXTRA_SIZE($node->{typedef})" if $node->{suffix};
+            $node->{arg_len}= $size;
 
-    foreach my $node (@ops) {
-        my $size= $node->{longj} || 0;
-
-        printf $out "\t%d,\t/* %*s */\n", $size, -$rwidth, $node->{name};
+        }
+        {
+            my $varies= 0;
+            $varies= 1 if $node->{code} and $node->{code}=~"str";
+            $node->{arg_len_varies}= $varies;
+        }
+        $node->{off_by_arg}= $node->{longj} || 0;
+        print $out "    {\n";
+        print $out "        /* #$node_idx $node->{optype} $node->{name} */\n";
+        foreach my $f_idx (0..$#fields) {
+            my $field= $fields[$f_idx];
+            printf $out  "        .%s = %s", $field, $node->{$field} // 0;
+            printf $out $f_idx == $#fields ? "\n" : ",\n";
+        }
+        print $out "    }";
+        print $out $node_idx==$#all ? "\n" : ",\n";
     }
 
     print $out <<EOP;
 };
+#endif /* DOINIT */
 
 EOP
 }
 
-sub print_reg_name {
+
+sub print_regnode_name {
     my ($out)= @_;
     print $out <<EOP;
 
-/* reg_name[] - Opcode/state names in string form, for debugging */
+/* PL_regnode_name[] - Opcode/state names in string form, for debugging */
 
 #ifndef DOINIT
-EXTCONST char * PL_reg_name[];
+EXTCONST char * PL_regnode_name[];
 #else
-EXTCONST char * const PL_reg_name[] = {
+EXTCONST char * const PL_regnode_name[] = {
 EOP
 
     my $ofs= 0;
     my $sym= "";
     foreach my $node (@all) {
-        my $size= $node->{longj} || 0;
-
         printf $out "\t%*s\t/* $sym%#04x */\n",
             -3 - $base_name_width, qq("$node->{name}",), $node->{id} - $ofs;
         if ( $node->{id} == $#ops and @ops != @all ) {
@@ -587,39 +614,44 @@ EOP
     my $val= 0;
     my %reverse;
     my $REG_EXTFLAGS_NAME_SIZE= 0;
+    my $hp= HeaderParser->new();
     foreach my $file ( "op_reg_common.h", "regexp.h" ) {
-        open my $in_fh, "<", $file or die "Can't read '$file': $!";
-        while (<$in_fh>) {
+        $hp->read_file($file);
+        foreach my $line_info (@{$hp->lines}) {
+            next unless $line_info->{type}     eq "content"
+                    and $line_info->{sub_type} eq "#define";
+            my $line= $line_info->{line};
+            $line=~s/\s*\\\n\s*/ /g;
 
             # optional leading '_'.  Return symbol in $1, and strip it from
             # comment of line.  Currently doesn't handle comments running onto
             # next line
-            if (s/^ \# \s* define \s+ ( _? RXf_ \w+ ) \s+ //xi) {
-                chomp;
+            if ($line=~s/^ \# \s* define \s+ ( _? RXf_ \w+ ) \s+ //xi) {
+                chomp($line);
                 my $define= $1;
                 my $orig= $_;
-                s{ /\* .*? \*/ }{ }x;    # Replace comments by a blank
+                $line=~s{ /\* .*? \*/ }{ }x;    # Replace comments by a blank
 
                 # Replace any prior defined symbols by their values
                 foreach my $key ( keys %definitions ) {
-                    s/\b$key\b/$definitions{$key}/g;
+                    $line=~s/\b$key\b/$definitions{$key}/g;
                 }
 
                 # Remove the U suffix from unsigned int literals
-                s/\b([0-9]+)U\b/$1/g;
+                $line=~s/\b([0-9]+)U\b/$1/g;
 
-                my $newval= eval $_;     # Get numeric definition
+                my $newval= eval $line;     # Get numeric definition
 
                 $definitions{$define}= $newval;
 
-                next unless $_ =~ /<</;    # Bit defines use left shift
+                next unless $line =~ /<</;    # Bit defines use left shift
                 if ( $val & $newval ) {
                     my @names= ( $define, $reverse{$newval} );
                     s/PMf_// for @names;
                     if ( $names[0] ne $names[1] ) {
                         die sprintf
                             "ERROR: both $define and $reverse{$newval} use 0x%08X (%s:%s)",
-                            $newval, $orig, $_;
+                            $newval, $orig, $line;
                     }
                     next;
                 }
@@ -693,29 +725,48 @@ EOP
     my $val= 0;
     my %reverse;
     my $REG_INTFLAGS_NAME_SIZE= 0;
+    my $hp= HeaderParser->new();
+    my $last_val = 0;
     foreach my $file ("regcomp.h") {
-        open my $fh, "<", $file or die "Can't read $file: $!";
-        while (<$fh>) {
+        $hp->read_file($file);
+        my @bit_tuples;
+        foreach my $line_info (@{$hp->lines}) {
+            next unless $line_info->{type}     eq "content"
+                    and $line_info->{sub_type} eq "#define";
+            my $line= $line_info->{line};
+            $line=~s/\s*\\\n\s*/ /g;
 
             # optional leading '_'.  Return symbol in $1, and strip it from
             # comment of line
             if (
-                m/^ \# \s* define \s+ ( PREGf_ ( \w+ ) ) \s+ 0x([0-9a-f]+)(?:\s*\/\*(.*)\*\/)?/xi
-                )
-            {
-                chomp;
+                $line =~ m/^ \# \s* define \s+ ( PREGf_ ( \w+ ) ) \s+ 0x([0-9a-f]+)(?:\s*\/\*(.*)\*\/)?/xi
+            ){
+                chomp $line;
                 my $define= $1;
                 my $abbr= $2;
                 my $hex= $3;
                 my $comment= $4;
                 my $val= hex($hex);
+                my $bin= sprintf "%b", $val;
+                if ($bin=~/1.*?1/) { die "Not expecting multiple bits in PREGf" }
+                my $bit= length($bin) - 1 ;
                 $comment= $comment ? " - $comment" : "";
-
-                printf $out qq(\t%-30s/* 0x%08x - %s%s */\n), qq("$abbr",),
-                    $val, $define, $comment;
-                $REG_INTFLAGS_NAME_SIZE++;
+                if ($bit_tuples[$bit]) {
+                    die "Duplicate PREGf bit '$bit': $define $val ($hex)";
+                }
+                $bit_tuples[$bit]= [ $bit, $val, $abbr, $define, $comment ];
+            }
+        }
+        foreach my $i (0..$#bit_tuples) {
+            my $bit_tuple= $bit_tuples[$i];
+            if (!$bit_tuple) {
+                $bit_tuple= [ $i, 1<<$i, "", "", "*UNUSED*" ];
             }
+            my ($bit, $val, $abbr, $define, $comment)= @$bit_tuple;
+            printf $out qq(\t%-30s/* (1<<%2d) - 0x%08x - %s%s */\n),
+                qq("$abbr",), $bit, $val, $define, $comment;
         }
+        $REG_INTFLAGS_NAME_SIZE=0+@bit_tuples;
     }
 
     print $out <<EOP;
@@ -802,18 +853,25 @@ END_OF_DESCR
 
 my $confine_to_core = 'defined(PERL_CORE) || defined(PERL_EXT_RE_BUILD)';
 read_definition("regcomp.sym");
+if ($ENV{DUMP}) {
+    require Data::Dumper;
+    print Data::Dumper::Dumper(\@all);
+    exit(1);
+}
 my $out= open_new( 'regnodes.h', '>',
-    { by => 'regen/regcomp.pl', from => 'regcomp.sym' } );
+    {
+        by      => 'regen/regcomp.pl',
+        from    => [ 'regcomp.sym', 'op_reg_common.h', 'regexp.h' ],
+    },
+);
 print $out "#if $confine_to_core\n\n";
+print_typedefs($out);
 print_state_defs($out);
-print_regkind($out);
-wrap_ifdef_print(
-    $out,
-    "REG_COMP_C",
-    \&print_regarglen,
-    \&print_reg_off_by_arg
-);
-print_reg_name($out);
+
+print_regnode_name($out);
+print_regnode_info($out);
+
+
 print_reg_extflags_name($out);
 print_reg_intflags_name($out);
 print_process_flags($out);
index 0eb5654..1e41840 100644 (file)
@@ -3,6 +3,7 @@ use strict;
 our (@Changed, $TAP);
 use File::Compare;
 use Symbol;
+use Carp;
 use Text::Wrap();
 
 # Common functions needed by the regen scripts
@@ -36,8 +37,11 @@ sub safer_unlink {
 sub open_new {
     my ($final_name, $mode, $header, $force) = @_;
     my $name = $final_name . '-new';
-    my $lang = $final_name =~ /\.pod$/ ? 'Pod' :
-        $final_name =~ /\.(?:c|h|inc|tab|act)$/ ? 'C' : 'Perl';
+    my $lang =
+        $final_name =~ /\.pod\z/ ? 'Pod' :
+        $final_name =~ /\.(?:c|h|inc|tab|act)\z/ ? 'C' :
+        $final_name =~ /\.gitignore\z/ ? 'None' :
+        'Perl';
     if ($force && -e $final_name) {
         chmod 0777, $name if $Needs_Write;
         CORE::unlink $final_name
@@ -94,13 +98,21 @@ sub close_and_rename {
                 $fail = "'$name' and '$final_name' differ";
             }
         }
+        # If someone wants to run t/porting/regen.t and keep the
+        # changes then they can set this env var, otherwise we
+        # unlink the generated file regardless.
+        my $keep_changes= $ENV{"REGEN_T_KEEP_CHANGES"};
+        safer_unlink($name) unless $keep_changes;
         if ($fail) {
             print STDOUT "not ok - $0 $final_name\n";
             die "$fail\n";
         } else {
             print STDOUT "ok - $0 $final_name\n";
         }
-        safer_unlink($name);
+        # If we get here then the file hasn't changed, and we should
+        # delete the new version if they have requested we keep changes
+        # as we wont have deleted it above like we would normally.
+        safer_unlink($name) if $keep_changes;
         return;
     }
     unless ($force) {
@@ -119,7 +131,12 @@ sub close_and_rename {
     rename $name, $final_name or die "renaming $name to $final_name: $!";
 }
 
-my %lang_opener = (Perl => '# ', Pod => '', C => '/* ');
+my %lang_opener = (
+    Perl => '# ',
+    Pod  => '',
+    C    => '/* ',
+    None => '# ',
+);
 
 sub read_only_top {
     my %args = @_;
@@ -129,7 +146,8 @@ sub read_only_top {
         unless exists $lang_opener{$lang};
     my $style = $args{style} ? " $args{style} " : '   ';
 
-    my $raw = "-*- buffer-read-only: t -*-\n";
+    # Generate the "modeline" for syntax highlighting based on the language
+    my $raw = "-*- " . ($lang eq 'None' ? "" : "mode: $lang; ") . "buffer-read-only: t -*-\n";
 
     if ($args{file}) {
         $raw .= "\n   $args{file}\n";
@@ -175,6 +193,7 @@ EOM
 sub read_only_bottom_close_and_rename {
     my ($fh, $sources) = @_;
     my ($name, $lang, $final_name) = @{*{$fh}}{qw(name lang final_name)};
+    confess "bad fh in read_only_bottom_close_and_rename" unless $name;
     die "No final name specified at open time for $name"
         unless $final_name;
 
@@ -192,14 +211,16 @@ sub read_only_bottom_close_and_rename {
             $comment .= "$digest $file\n";
         }
     }
-    $comment .= "ex: set ro:";
+    $comment .= "ex: set ro" . ($lang eq 'None' ? "" : " ft=\L$lang\E") . ":";
 
-    if (defined $lang && $lang eq 'Perl') {
-        $comment =~ s/^/# /mg;
-    } elsif (!defined $lang or $lang ne 'Pod') {
+    if ($lang eq 'Pod') {
+        # nothing
+    } elsif ($lang eq 'C') {
         $comment =~ s/^/ * /mg;
         $comment =~ s! \* !/* !;
         $comment .= " */";
+    } else {
+        $comment =~ s/^/# /mg;
     }
     print $fh "\n$comment\n";
 
index 00c4983..8ed976f 100644 (file)
@@ -594,7 +594,7 @@ foreach my $list (qw(Punctuation Symbol)) {
 
         if ($is_Symbol) {
 
-            # Skip if the the direction is followed by a vertical motion
+            # Skip if the direction is followed by a vertical motion
             # (which defeats the left-right directionality).
             if (        $name =~ / ^ .* $no_barb_re
                                    \b (UP|DOWN|NORTH|SOUTH) /gx
@@ -869,7 +869,7 @@ foreach my $charset (get_supported_code_pages()) {
     $max_PRINT_A = sprintf "0x%02X", $max_PRINT_A;
     print $out_fh <<"EOT";
 
-#   ifdef PERL_IN_REGCOMP_C
+#   ifdef PERL_IN_REGCOMP_ANY
 #     define MAX_PRINT_A  $max_PRINT_A   /* The max code point that isPRINT_A */
 #   endif
 EOT
@@ -931,7 +931,7 @@ $count = 0x110000 - $count;
 print $out_fh <<~"EOT";
 
     /* The number of code points not matching \\pC */
-    #ifdef PERL_IN_REGCOMP_C
+    #ifdef PERL_IN_REGCOMP_ANY
     #  define NON_OTHER_COUNT  $count
     #endif
     EOT
index 525306b..1c0811e 100644 (file)
@@ -5,18 +5,18 @@
 #    lib/warnings.pm
 #    warnings.h
 #
-# from information hardcoded into this script (the $TREE hash), plus the
+# from information hardcoded into this script (the $WARNING_TREE hash), plus the
 # template for warnings.pm in the DATA section.
 #
 # When changing the number of warnings, t/op/caller.t should change to
 # correspond with the value of $BYTES in lib/warnings.pm
 #
-# With an argument of 'tree', just dump the contents of $TREE and exits.
+# With an argument of 'tree', just dump the contents of $WARNING_TREE and exits.
 # Also accepts the standard regen_lib -q and -v args.
 #
 # This script is normally invoked from regen.pl.
 
-$VERSION = '1.58';
+$VERSION = '1.65';
 
 BEGIN {
     require './regen/regen_lib.pl';
@@ -44,7 +44,7 @@ sub DEFAULT_OFF () { 2 }
 # created. But the warnings category 'io' WILL include all the mask bits
 # necessary to turn on 'pipe', 'unopened' etc.
 
-my $TREE = {
+our $WARNING_TREE = {
 'all' => [ 5.008, {
         'io'            => [ 5.008, {
                                 'pipe'          => [ 5.008, DEFAULT_OFF],
@@ -74,7 +74,16 @@ my $TREE = {
                                 'debugging'     => [ 5.008, DEFAULT_ON],
                                 'malloc'        => [ 5.008, DEFAULT_ON],
                            }],
-        'deprecated'    => [ 5.008, DEFAULT_ON],
+        'deprecated'    => [ 5.008, DEFAULT_ON, {
+                                'deprecated::goto_construct'           => [ 5.011003, DEFAULT_ON],
+                                'deprecated::unicode_property_name'    => [ 5.011003, DEFAULT_ON],
+                                'deprecated::dot_in_inc'               => [ 5.025011, DEFAULT_ON],
+                                'deprecated::version_downgrade'        => [ 5.035009, DEFAULT_ON],
+                                'deprecated::delimiter_will_be_paired' => [ 5.035010, DEFAULT_ON],
+                                'deprecated::apostrophe_as_package_separator'
+                                                                       => [ 5.037009, DEFAULT_ON],
+                                'deprecated::smartmatch'               => [ 5.037010, DEFAULT_ON],
+                        }],
         'void'          => [ 5.008, DEFAULT_OFF],
         'recursion'     => [ 5.008, DEFAULT_OFF],
         'redefine'      => [ 5.008, DEFAULT_OFF],
@@ -146,6 +155,8 @@ my $TREE = {
                                     [ 5.035, DEFAULT_ON],
                                 'experimental::extra_paired_delimiters' =>
                                     [ 5.035, DEFAULT_ON],
+                                'experimental::class' =>
+                                    [ 5.037, DEFAULT_ON ],
                         }],
 
         'missing'       => [ 5.021, DEFAULT_OFF],
@@ -169,6 +180,19 @@ my %VALUE_TO_NAME; # (index_number => [ 'NAME', version ], ...);
 
 my %NAME_TO_VALUE; # ('NAME'       => index_number,       ....);
 
+# the experiments were successful (or abandonned),
+# so no warning bit is needed anymore
+my %NO_BIT_FOR = map { ( uc $_ => 1, $_ => 1 ) } qw(
+  experimental::lexical_subs
+  experimental::postderef
+  experimental::signatures
+  experimental::bitwise
+  experimental::alpha_assertions
+  experimental::script_run
+  experimental::isa
+  experimental::smartmatch
+);
+
 ###########################################################################
 
 # Generate a hash with keys being the version number and values
@@ -189,12 +213,12 @@ sub valueWalk
         die "Value associated with key '$k' is not an ARRAY reference"
             if !ref $v || ref $v ne 'ARRAY' ;
 
-        my ($ver, $rest) = @{ $v } ;
+        my ($ver, $rest, $rest2) = @{ $v } ;
+        my $ref = ref $rest ? $rest : $rest2;
         push @{ $v_list->{$ver} }, $k;
 
-        if (ref $rest)
-          { valueWalk ($rest, $v_list) }
-
+        if (ref $ref)
+          { valueWalk ($ref, $v_list) }
     }
 }
 
@@ -218,6 +242,7 @@ sub orderValues
     my $index = 0;
     foreach my $ver ( sort { $a <=> $b } keys %v_list ) {
         foreach my $name (@{ $v_list{$ver} } ) {
+            next if $NO_BIT_FOR{$name};
             $VALUE_TO_NAME{ $index } = [ uc $name, $ver ] ;
             $NAME_TO_VALUE{ uc $name } = $index ++ ;
         }
@@ -242,17 +267,19 @@ sub walk
     foreach $k (sort keys %$tree) {
         $v = $tree->{$k};
         die "duplicate key $k\n" if defined $CATEGORIES{$k} ;
+        next if $NO_BIT_FOR{$k};
         die "Can't find key '$k'"
             if ! defined $NAME_TO_VALUE{uc $k} ;
         push @{ $CATEGORIES{$k} }, $NAME_TO_VALUE{uc $k} ;
         die "Value associated with key '$k' is not an ARRAY reference"
             if !ref $v || ref $v ne 'ARRAY' ;
 
-        my ($ver, $rest) = @{ $v } ;
-        if (ref $rest)
-          { push (@{ $CATEGORIES{$k} }, walk ($rest)) }
-        elsif ($rest == DEFAULT_ON)
+        my ($ver, $rest, $rest2) = @{ $v } ;
+        my $ref = ref $rest ? $rest : $rest2;
+        if (!ref $rest and $rest == DEFAULT_ON)
           { push @DEFAULTS, $NAME_TO_VALUE{uc $k} }
+        if (ref $ref)
+          { push (@{ $CATEGORIES{$k} }, walk ($ref)) }
 
         push @list, @{ $CATEGORIES{$k} } ;
     }
@@ -301,12 +328,13 @@ sub warningsTree
     my $rv = '';
 
     while ($k = shift @keys) {
+        next if $NO_BIT_FOR{$k};
         $v = $tree->{$k};
         die "Value associated with key '$k' is not an ARRAY reference"
             if !ref $v || ref $v ne 'ARRAY' ;
 
         my $offset ;
-        if ($tree ne $TREE) {
+        if ($tree ne $WARNING_TREE) {
             $rv .= $prefix . "|\n" ;
             $rv .= $prefix . "+- $k" ;
             $offset = ' ' x ($max + 4) ;
@@ -316,12 +344,13 @@ sub warningsTree
             $offset = ' ' x ($max + 1) ;
         }
 
-        my ($ver, $rest) = @{ $v } ;
-        if (ref $rest)
+        my ($ver, $rest, $rest2) = @{ $v } ;
+        my $ref = ref $rest ? $rest : $rest2;
+        if (ref $ref)
         {
             my $bar = @keys ? "|" : " ";
             $rv .= " -" . "-" x ($max - length $k ) . "+\n" ;
-            $rv .= warningsTree ($rest, $prefix . $bar . $offset )
+            $rv .= warningsTree ($ref, $prefix . $bar . $offset )
         }
         else
           { $rv .= "\n" }
@@ -375,142 +404,151 @@ sub mkOct
 
 
 ###########################################################################
+sub main {
 
-if (@ARGV && $ARGV[0] eq "tree")
-{
-    print warningsTree($TREE, "    ") ;
-    exit ;
-}
+    if (@ARGV && $ARGV[0] eq "tree")
+    {
+        print warningsTree($WARNING_TREE, "    ") ;
+        exit ;
+    }
 
-my ($warn_h, $warn_pm) = map {
-    open_new($_, '>', { by => 'regen/warnings.pl' });
-} 'warnings.h', 'lib/warnings.pm';
+    my ($warn_h, $warn_pm) = map {
+        open_new($_, '>', { by => 'regen/warnings.pl' });
+    } 'warnings.h', 'lib/warnings.pm';
 
-my ($index, $warn_size);
+    my ($index, $warn_size);
 
-# generate warnings.h
+    # generate warnings.h
 
-print $warn_h warnings_h_boilerplate_1();
+    print $warn_h warnings_h_boilerplate_1();
 
-$index = orderValues($TREE);
+    $index = orderValues($WARNING_TREE);
 
-die <<EOM if $index > 255 ;
-Too many warnings categories -- max is 255
-rewrite packWARN* & unpackWARN* macros
-EOM
+    die <<~EOM if $index > 255 ;
+    Too many warnings categories -- max is 255
+    rewrite packWARN* & unpackWARN* macros
+    EOM
 
-walk ($TREE) ;
-for (my $i = $index; $i & 3; $i++) {
-    push @{$CATEGORIES{all}}, $i;
-}
+    walk ($WARNING_TREE) ;
+    for (my $i = $index; $i & 3; $i++) {
+        push @{$CATEGORIES{all}}, $i;
+    }
 
-$index *= 2 ;
-$warn_size = int($index / 8) + ($index % 8 != 0) ;
-
-my $k ;
-my $last_ver = 0;
-my @names;
-foreach $k (sort { $a <=> $b } keys %VALUE_TO_NAME) {
-    my ($name, $version) = @{ $VALUE_TO_NAME{$k} };
-    print $warn_h "\n/* Warnings Categories added in Perl $version */\n\n"
-        if $last_ver != $version ;
-    $name =~ y/:/_/;
-    $name = "WARN_$name";
-    print $warn_h tab(6, "#define $name"), " $k\n" ;
-    push @names, $name;
-    $last_ver = $version ;
-}
+    $index *= 2 ;
+    $warn_size = int($index / 8) + ($index % 8 != 0) ;
+
+    my $k ;
+    my $last_ver = 0;
+    my @names;
+    foreach $k (sort { $a <=> $b } keys %VALUE_TO_NAME) {
+        my ($name, $version) = @{ $VALUE_TO_NAME{$k} };
+        print $warn_h "\n/* Warnings Categories added in Perl $version */\n\n"
+            if $last_ver != $version ;
+        $name =~ y/:/_/;
+        $name = "WARN_$name";
+        print $warn_h tab(6, "#define $name"), " $k\n" ;
+        push @names, $name;
+        $last_ver = $version ;
+    }
 
-print $warn_h tab(6, '#define WARNsize'),      " $warn_size\n" ;
-print $warn_h tab(6, '#define WARN_ALLstring'), ' "', ('\125' x $warn_size) , "\"\n" ;
-print $warn_h tab(6, '#define WARN_NONEstring'), ' "', ('\0' x $warn_size) , "\"\n" ;
+    print $warn_h tab(6, '#define WARNsize'),   " $warn_size\n" ;
+    print $warn_h tab(6, '#define WARN_ALLstring'), ' "', ('\125' x $warn_size) , "\"\n" ;
+    print $warn_h tab(6, '#define WARN_NONEstring'), ' "', ('\0' x $warn_size) , "\"\n" ;
 
-print $warn_h warnings_h_boilerplate_2();
+    print $warn_h warnings_h_boilerplate_2();
 
-print $warn_h "\n\n/*\n" ;
-print $warn_h map { "=for apidoc Amnh||$_\n" } @names;
-print $warn_h "\n=cut\n*/\n\n" ;
-print $warn_h "/* end of file warnings.h */\n";
+    print $warn_h "\n\n/*\n" ;
+    print $warn_h map { "=for apidoc Amnh||$_\n" } @names;
+    print $warn_h "\n=cut\n*/\n\n" ;
+    print $warn_h "/* end of file warnings.h */\n";
 
-read_only_bottom_close_and_rename($warn_h);
+    read_only_bottom_close_and_rename($warn_h);
 
 
-# generate warnings.pm
+    # generate warnings.pm
 
-while (<DATA>) {
-    last if /^VERSION$/ ;
-    print $warn_pm $_ ;
-}
+    while (<DATA>) {
+        last if /^VERSION$/ ;
+        print $warn_pm $_ ;
+    }
 
-print $warn_pm qq(our \$VERSION = "$::VERSION";\n);
+    print $warn_pm qq(our \$VERSION = "$::VERSION";\n);
 
-while (<DATA>) {
-    last if /^KEYWORDS$/ ;
-    print $warn_pm $_ ;
-}
+    while (<DATA>) {
+        last if /^KEYWORDS$/ ;
+        print $warn_pm $_ ;
+    }
 
-my $last_ver = 0;
-print $warn_pm "our %Offsets = (" ;
-foreach my $k (sort { $a <=> $b } keys %VALUE_TO_NAME) {
-    my ($name, $version) = @{ $VALUE_TO_NAME{$k} };
-    $name = lc $name;
-    $k *= 2 ;
-    if ( $last_ver != $version ) {
-        print $warn_pm "\n";
-        print $warn_pm tab(6, "    # Warnings Categories added in Perl $version");
-        print $warn_pm "\n";
+    $last_ver = 0;
+    print $warn_pm "our %Offsets = (" ;
+    foreach my $k (sort { $a <=> $b } keys %VALUE_TO_NAME) {
+        my ($name, $version) = @{ $VALUE_TO_NAME{$k} };
+        $name = lc $name;
+        $k *= 2 ;
+        if ( $last_ver != $version ) {
+            print $warn_pm "\n";
+            print $warn_pm tab(6, "    # Warnings Categories added in Perl $version");
+            print $warn_pm "\n";
+        }
+        print $warn_pm tab(6, "    '$name'"), "=> $k,\n" ;
+        $last_ver = $version;
     }
-    print $warn_pm tab(6, "    '$name'"), "=> $k,\n" ;
-    $last_ver = $version;
-}
 
-print $warn_pm ");\n\n" ;
+    print $warn_pm ");\n\n" ;
 
-print $warn_pm "our %Bits = (\n" ;
-foreach my $k (sort keys  %CATEGORIES) {
+    print $warn_pm "our %Bits = (\n" ;
+    foreach my $k (sort keys  %CATEGORIES) {
 
-    my $v = $CATEGORIES{$k} ;
-    my @list = sort { $a <=> $b } @$v ;
+        my $v = $CATEGORIES{$k} ;
+        my @list = sort { $a <=> $b } @$v ;
 
-    print $warn_pm tab(6, "    '$k'"), '=> "',
-                mkHex($warn_size, map $_ * 2 , @list),
-                '", # [', mkRange(@list), "]\n" ;
-}
+        print $warn_pm tab(6, "    '$k'"), '=> "',
+                    mkHex($warn_size, map $_ * 2 , @list),
+                    '", # [', mkRange(@list), "]\n" ;
+    }
 
-print $warn_pm ");\n\n" ;
+    print $warn_pm ");\n\n" ;
 
-print $warn_pm "our %DeadBits = (\n" ;
-foreach my $k (sort keys  %CATEGORIES) {
+    print $warn_pm "our %DeadBits = (\n" ;
+    foreach my $k (sort keys  %CATEGORIES) {
 
-    my $v = $CATEGORIES{$k} ;
-    my @list = sort { $a <=> $b } @$v ;
+        my $v = $CATEGORIES{$k} ;
+        my @list = sort { $a <=> $b } @$v ;
 
-    print $warn_pm tab(6, "    '$k'"), '=> "',
-                mkHex($warn_size, map $_ * 2 + 1 , @list),
-                '", # [', mkRange(@list), "]\n" ;
-}
+        print $warn_pm tab(6, "    '$k'"), '=> "',
+                    mkHex($warn_size, map $_ * 2 + 1 , @list),
+                    '", # [', mkRange(@list), "]\n" ;
+    }
+
+    print $warn_pm ");\n\n" ;
 
-print $warn_pm ");\n\n" ;
-print $warn_pm "# These are used by various things, including our own tests\n";
-print $warn_pm tab(6, 'our $NONE'), '=  "', ('\0' x $warn_size) , "\";\n" ;
-print $warn_pm tab(6, 'our $DEFAULT'), '=  "',
-                    mkHex($warn_size, map $_ * 2, @DEFAULTS),
-                    '"; # [', mkRange(sort { $a <=> $b } @DEFAULTS), "]\n" ;
-print $warn_pm tab(6, 'our $LAST_BIT'), '=  ' . "$index ;\n" ;
-print $warn_pm tab(6, 'our $BYTES'),    '=  ' . "$warn_size ;\n" ;
-while (<DATA>) {
-    if ($_ eq "=for warnings.pl tree-goes-here\n") {
-      print $warn_pm warningsTree($TREE, "    ");
-      next;
+    print $warn_pm "our %NoOp = (\n" ;
+    foreach my $k ( grep /\A[a-z:_]+\z/, sort keys %NO_BIT_FOR ) {
+        print $warn_pm tab(6, "    '$k'"), "=> 1,\n";
     }
-    print $warn_pm $_ ;
-}
 
-read_only_bottom_close_and_rename($warn_pm);
+    print $warn_pm ");\n\n" ;
+    print $warn_pm "# These are used by various things, including our own tests\n";
+    print $warn_pm tab(6, 'our $NONE'), '=  "', ('\0' x $warn_size) , "\";\n" ;
+    print $warn_pm tab(6, 'our $DEFAULT'), '=  "',
+                        mkHex($warn_size, map $_ * 2, @DEFAULTS),
+                        '"; # [', mkRange(sort { $a <=> $b } @DEFAULTS), "]\n" ;
+    print $warn_pm tab(6, 'our $LAST_BIT'), '=  ' . "$index ;\n" ;
+    print $warn_pm tab(6, 'our $BYTES'),    '=  ' . "$warn_size ;\n" ;
+    while (<DATA>) {
+        if ($_ eq "=for warnings.pl tree-goes-here\n") {
+          print $warn_pm warningsTree($WARNING_TREE, "    ");
+          next;
+        }
+        print $warn_pm $_ ;
+    }
 
-exit(0);
+    read_only_bottom_close_and_rename($warn_pm);
 
+    exit(0);
+}
 
+main() unless caller();
 # -----------------------------------------------------------------
 
 sub warnings_h_boilerplate_1 { return <<'EOM'; }
@@ -519,7 +557,6 @@ sub warnings_h_boilerplate_1 { return <<'EOM'; }
 #define Perl_Warn_Bit_(x)           (1 << ((x) % 8))
 #define PerlWarnIsSet_(a, x)        ((a)[Perl_Warn_Off_(x)] & Perl_Warn_Bit_(x))
 
-
 #define G_WARN_OFF             0       /* $^W == 0 */
 #define G_WARN_ON              1       /* -w flag and $^W != 0 */
 #define G_WARN_ALL_ON          2       /* -W flag */
@@ -528,8 +565,8 @@ sub warnings_h_boilerplate_1 { return <<'EOM'; }
 #define G_WARN_ALL_MASK                (G_WARN_ALL_ON|G_WARN_ALL_OFF)
 
 #define pWARN_STD              NULL
-#define pWARN_ALL              (STRLEN *) &PL_WARN_ALL    /* use warnings 'all' */
-#define pWARN_NONE             (STRLEN *) &PL_WARN_NONE   /* no  warnings 'all' */
+#define pWARN_ALL               &PL_WARN_ALL    /* use warnings 'all' */
+#define pWARN_NONE              &PL_WARN_NONE   /* no  warnings 'all' */
 
 #define specialWARN(x)         ((x) == pWARN_STD || (x) == pWARN_ALL ||        \
                                  (x) == pWARN_NONE)
@@ -547,13 +584,18 @@ sub warnings_h_boilerplate_2 { return <<'EOM'; }
 #define isLEXWARN_off \
         cBOOL(!PL_curcop || PL_curcop->cop_warnings == pWARN_STD)
 #define isWARN_ONCE    (PL_dowarn & (G_WARN_ON|G_WARN_ONCE))
-#define isWARN_on(c,x) (PerlWarnIsSet_((U8 *)(c + 1), 2*(x)))
-#define isWARNf_on(c,x)        (PerlWarnIsSet_((U8 *)(c + 1), 2*(x)+1))
+#define hasWARNBIT(c,x) (RCPV_LEN(c) > (2*(x)/8))
+#define isWARN_on(c,x)  (hasWARNBIT(c,x) \
+                        ? PerlWarnIsSet_((U8 *)(c), 2*(x)) \
+                        : 0)
+#define isWARNf_on(c,x) (hasWARNBIT(c,x) \
+                        ? PerlWarnIsSet_((U8 *)(c), 2*(x)+1) \
+                        : 0)
 
 #define DUP_WARNINGS(p) Perl_dup_warnings(aTHX_ p)
 
 #define free_and_set_cop_warnings(cmp,w) STMT_START { \
-  if (!specialWARN((cmp)->cop_warnings)) PerlMemShared_free((cmp)->cop_warnings); \
+  if (!specialWARN((cmp)->cop_warnings)) rcpv_free((cmp)->cop_warnings); \
   (cmp)->cop_warnings = w; \
 } STMT_END
 
@@ -698,6 +740,7 @@ sub _bits {
 
     $mask = _expand_bits($mask);
     foreach my $word ( @_ ) {
+        next if $NoOp{$word};
         if ($word eq 'FATAL') {
             $fatal = 1;
             $no_fatal = 0;
@@ -759,6 +802,7 @@ sub unimport
 
     $mask = _expand_bits($mask);
     foreach my $word ( @_ ) {
+        next if $NoOp{$word};
         if ($word eq 'FATAL') {
             next;
         }
@@ -819,7 +863,7 @@ sub __chk
             unless defined $offset;
     }
     else {
-        $category = (caller(1))[0] ;
+        $category = caller(1);
         $offset = $Offsets{$category};
         Croaker("package '$category' not registered for warnings")
             unless defined $offset ;
@@ -1102,6 +1146,13 @@ which is equivalent to:
     no warnings  'experimental';
     use warnings 'experimental::somefeature';
 
+As experimental features become regular features of Perl,
+the corresponding warnings are not printed anymore.
+They also stop being listed in the L</Category Hierarchy> below.
+
+It is still possible to request turning on or off these warnings,
+but doing so has no effect.
+
 =head2 What's wrong with B<-w> and C<$^W>
 
 Although very useful, the big problem with using B<-w> on the command
index 56422df..e96b622 100644 (file)
@@ -71,6 +71,7 @@
  * regular-expression syntax might require a total rethink.
  */
 #include "EXTERN.h"
+#define PERL_IN_REGEX_ENGINE
 #define PERL_IN_REGEXEC_C
 #include "perl.h"
 
@@ -100,7 +101,7 @@ static const char sets_utf8_locale_required[] =
 
 #define CHECK_AND_WARN_NON_UTF8_CTYPE_LOCALE_IN_SETS(n)                     \
     STMT_START {                                                            \
-        if (! IN_UTF8_CTYPE_LOCALE && ANYOFL_UTF8_LOCALE_REQD(FLAGS(n))) {  \
+        if (! IN_UTF8_CTYPE_LOCALE && (FLAGS(n) & ANYOFL_UTF8_LOCALE_REQD)){\
           Perl_ck_warner(aTHX_ packWARN(WARN_LOCALE),                       \
                                              sets_utf8_locale_required);    \
         }                                                                   \
@@ -119,7 +120,7 @@ static const char non_utf8_target_but_utf8_required[]
 } STMT_END
 
 #ifndef STATIC
-#define        STATIC  static
+#define STATIC  static
 #endif
 
 /*
@@ -177,36 +178,36 @@ static const char non_utf8_target_but_utf8_required[]
  * VERBS must NOT be included. JUMPABLE is used to determine  if we can ignore a
  * node that is in between two EXACT like nodes when ascertaining what the required
  * "follow" character is. This should probably be moved to regex compile time
- * although it may be done at run time beause of the REF possibility - more
+ * although it may be done at run time because of the REF possibility - more
  * investigation required. -- demerphq
 */
 #define JUMPABLE(rn) (                                                             \
     OP(rn) == OPEN ||                                                              \
     (OP(rn) == CLOSE &&                                                            \
-     !EVAL_CLOSE_PAREN_IS(cur_eval,ARG(rn)) ) ||                                   \
+     !EVAL_CLOSE_PAREN_IS(cur_eval,PARNO(rn)) ) ||                                 \
     OP(rn) == EVAL ||                                                              \
     OP(rn) == SUSPEND || OP(rn) == IFMATCH ||                                      \
     OP(rn) == PLUS || OP(rn) == MINMOD ||                                          \
     OP(rn) == KEEPS ||                                                             \
-    (PL_regkind[OP(rn)] == CURLY && ARG1(rn) > 0)                                  \
+    (REGNODE_TYPE(OP(rn)) == CURLY && ARG1i(rn) > 0)                                  \
 )
-#define IS_EXACT(rn) (PL_regkind[OP(rn)] == EXACT)
+#define IS_EXACT(rn) (REGNODE_TYPE(OP(rn)) == EXACT)
 
-#define HAS_TEXT(rn) ( IS_EXACT(rn) || PL_regkind[OP(rn)] == REF )
+#define HAS_TEXT(rn) ( IS_EXACT(rn) || REGNODE_TYPE(OP(rn)) == REF )
 
 /*
   Search for mandatory following text node; for lookahead, the text must
-  follow but for lookbehind (rn->flags != 0) we skip to the next step.
+  follow but for lookbehind (FLAGS(rn) != 0) we skip to the next step.
 */
 #define FIND_NEXT_IMPT(rn) STMT_START {                                   \
     while (JUMPABLE(rn)) { \
         const OPCODE type = OP(rn); \
-        if (type == SUSPEND || PL_regkind[type] == CURLY) \
-            rn = NEXTOPER(NEXTOPER(rn)); \
+        if (type == SUSPEND || REGNODE_TYPE(type) == CURLY) \
+            rn = REGNODE_AFTER_opcode(rn,type); \
         else if (type == PLUS) \
-            rn = NEXTOPER(rn); \
+            rn = REGNODE_AFTER_type(rn,tregnode_PLUS); \
         else if (type == IFMATCH) \
-            rn = (rn->flags == 0) ? NEXTOPER(NEXTOPER(rn)) : rn + ARG(rn); \
+            rn = (FLAGS(rn) == 0) ? REGNODE_AFTER_type(rn,tregnode_IFMATCH) : rn + ARG1u(rn); \
         else rn += NEXT_OFF(rn); \
     } \
 } STMT_END
@@ -218,29 +219,31 @@ static void S_setup_eval_state(pTHX_ regmatch_info *const reginfo);
 static void S_cleanup_regmatch_info_aux(pTHX_ void *arg);
 static regmatch_state * S_push_slab(pTHX);
 
-#define REGCP_PAREN_ELEMS 3
 #define REGCP_OTHER_ELEMS 3
 #define REGCP_FRAME_ELEMS 1
 /* REGCP_FRAME_ELEMS are not part of the REGCP_OTHER_ELEMS and
  * are needed for the regexp context stack bookkeeping. */
 
 STATIC CHECKPOINT
-S_regcppush(pTHX_ const regexp *rex, I32 parenfloor, U32 maxopenparen _pDEPTH)
+S_regcppush(pTHX_ const regexp *rex, I32 parenfloor, U32 maxopenparen comma_pDEPTH)
 {
     const int retval = PL_savestack_ix;
-    const int paren_elems_to_push =
-                (maxopenparen - parenfloor) * REGCP_PAREN_ELEMS;
+    /* Number of bytes about to be stored in the stack */
+    const SSize_t paren_bytes_to_push = sizeof(*RXp_OFFSp(rex)) * (maxopenparen - parenfloor);
+    /* Number of savestack[] entries to be filled by the paren data */
+    /* Rounding is performed in case we are few elements short */
+    const int paren_elems_to_push = (paren_bytes_to_push + sizeof(*PL_savestack) - 1) / sizeof(*PL_savestack);
     const UV total_elems = paren_elems_to_push + REGCP_OTHER_ELEMS;
     const UV elems_shifted = total_elems << SAVE_TIGHT_SHIFT;
-    I32 p;
+
     DECLARE_AND_GET_RE_DEBUG_FLAGS;
 
     PERL_ARGS_ASSERT_REGCPPUSH;
 
     if (paren_elems_to_push < 0)
-        Perl_croak(aTHX_ "panic: paren_elems_to_push, %i < 0, maxopenparen: %i parenfloor: %i REGCP_PAREN_ELEMS: %u",
+        Perl_croak(aTHX_ "panic: paren_elems_to_push, %i < 0, maxopenparen: %i parenfloor: %i",
                    (int)paren_elems_to_push, (int)maxopenparen,
-                   (int)parenfloor, (unsigned)REGCP_PAREN_ELEMS);
+                   (int)parenfloor);
 
     if ((elems_shifted >> SAVE_TIGHT_SHIFT) != total_elems)
         Perl_croak(aTHX_ "panic: paren_elems_to_push offset %" UVuf
@@ -249,37 +252,50 @@ S_regcppush(pTHX_ const regexp *rex, I32 parenfloor, U32 maxopenparen _pDEPTH)
                    (unsigned long)maxopenparen,
                    (long)parenfloor);
 
-    SSGROW(total_elems + REGCP_FRAME_ELEMS);
-
     DEBUG_BUFFERS_r(
         if ((int)maxopenparen > (int)parenfloor)
             Perl_re_exec_indentf( aTHX_
                 "rex=0x%" UVxf " offs=0x%" UVxf ": saving capture indices:\n",
                 depth,
                 PTR2UV(rex),
-                PTR2UV(rex->offs)
+                PTR2UV(RXp_OFFSp(rex))
             );
     );
-    for (p = parenfloor+1; p <= (I32)maxopenparen;  p++) {
-/* REGCP_PARENS_ELEMS are pushed per pairs of parentheses. */
-        SSPUSHIV(rex->offs[p].end);
-        SSPUSHIV(rex->offs[p].start);
-        SSPUSHINT(rex->offs[p].start_tmp);
-        DEBUG_BUFFERS_r(Perl_re_exec_indentf( aTHX_
-            "    \\%" UVuf ": %" IVdf "(%" IVdf ")..%" IVdf "\n",
-            depth,
-            (UV)p,
-            (IV)rex->offs[p].start,
-            (IV)rex->offs[p].start_tmp,
-            (IV)rex->offs[p].end
-        ));
-    }
+
+    SSGROW(total_elems + REGCP_FRAME_ELEMS);
+    assert((IV)PL_savestack_max > (IV)(total_elems + REGCP_FRAME_ELEMS));
+
+    /* memcpy the offs inside the stack - it's faster than for loop */
+    memcpy(&PL_savestack[PL_savestack_ix], RXp_OFFSp(rex) + parenfloor + 1, paren_bytes_to_push);
+    PL_savestack_ix += paren_elems_to_push;
+
+    DEBUG_BUFFERS_r({
+       I32 p;
+        for (p = parenfloor + 1; p <= (I32)maxopenparen; p++) {
+            Perl_re_exec_indentf(aTHX_
+                "    \\%" UVuf " %" IVdf " (%" IVdf ") .. %" IVdf " (regcppush)\n",
+                depth,
+                (UV)p,
+                (IV)RXp_OFFSp(rex)[p].start,
+                (IV)RXp_OFFSp(rex)[p].start_tmp,
+                (IV)RXp_OFFSp(rex)[p].end
+            );
+        }
+    });
+
 /* REGCP_OTHER_ELEMS are pushed in any case, parentheses or no. */
     SSPUSHINT(maxopenparen);
-    SSPUSHINT(rex->lastparen);
-    SSPUSHINT(rex->lastcloseparen);
+    SSPUSHINT(RXp_LASTPAREN(rex));
+    SSPUSHINT(RXp_LASTCLOSEPAREN(rex));
     SSPUSHUV(SAVEt_REGCONTEXT | elems_shifted); /* Magic cookie. */
 
+
+    DEBUG_BUFFERS_r({
+        Perl_re_exec_indentf(aTHX_
+                "finished regcppush returning %" IVdf " cur: %" IVdf "\n",
+                depth, retval, PL_savestack_ix);
+    });
+
     return retval;
 }
 
@@ -305,41 +321,83 @@ S_regcppush(pTHX_ const regexp *rex, I32 parenfloor, U32 maxopenparen _pDEPTH)
     regcpblow(cp)
 
 /* set the start and end positions of capture ix */
-#define CLOSE_CAPTURE(ix, s, e)                                            \
-    rex->offs[ix].start = s;                                               \
-    rex->offs[ix].end = e;                                                 \
-    if (ix > rex->lastparen)                                               \
-        rex->lastparen = ix;                                               \
-    rex->lastcloseparen = ix;                                              \
-    DEBUG_BUFFERS_r(Perl_re_exec_indentf( aTHX_                            \
-        "CLOSE: rex=0x%" UVxf " offs=0x%" UVxf ": \\%" UVuf ": set %" IVdf "..%" IVdf " max: %" UVuf "\n", \
-        depth,                                                             \
-        PTR2UV(rex),                                                       \
-        PTR2UV(rex->offs),                                                 \
-        (UV)ix,                                                            \
-        (IV)rex->offs[ix].start,                                           \
-        (IV)rex->offs[ix].end,                                             \
-        (UV)rex->lastparen                                                 \
+#define CLOSE_ANY_CAPTURE(rex, ix, s, e)                                    \
+    RXp_OFFSp(rex)[(ix)].start = (s);                                       \
+    RXp_OFFSp(rex)[(ix)].end = (e)
+
+#define CLOSE_CAPTURE(rex, ix, s, e)                                        \
+    CLOSE_ANY_CAPTURE(rex, ix, s, e);                                       \
+    if (ix > RXp_LASTPAREN(rex))                                            \
+        RXp_LASTPAREN(rex) = (ix);                                          \
+    RXp_LASTCLOSEPAREN(rex) = (ix);                                         \
+    DEBUG_BUFFERS_r(Perl_re_exec_indentf( aTHX_                             \
+        "CLOSE: rex=0x%" UVxf " offs=0x%" UVxf ": \\%" UVuf ": set %" IVdf " .. %" IVdf " max: %" UVuf "\n", \
+        depth,                                                              \
+        PTR2UV(rex),                                                        \
+        PTR2UV(RXp_OFFSp(rex)),                                             \
+        (UV)(ix),                                                           \
+        (IV)RXp_OFFSp(rex)[ix].start,                                       \
+        (IV)RXp_OFFSp(rex)[ix].end,                                         \
+        (UV)RXp_LASTPAREN(rex)                                              \
     ))
 
-#define UNWIND_PAREN(lp, lcp)               \
-    DEBUG_BUFFERS_r(Perl_re_exec_indentf( aTHX_  \
-        "UNWIND_PAREN: rex=0x%" UVxf " offs=0x%" UVxf ": invalidate (%" UVuf "..%" UVuf "] set lcp: %" UVuf "\n", \
-        depth,                              \
-        PTR2UV(rex),                        \
-        PTR2UV(rex->offs),                  \
-        (UV)(lp),                           \
-        (UV)(rex->lastparen),               \
-        (UV)(lcp)                           \
-    ));                                     \
-    for (n = rex->lastparen; n > lp; n--)   \
-        rex->offs[n].end = -1;              \
-    rex->lastparen = n;                     \
-    rex->lastcloseparen = lcp;
+/* the lp and lcp args match the relevant members of the
+ * regexp structure, but in practice they should all be U16
+ * instead as we have a hard limit of U16_MAX parens. See
+ * line 4003 or so of regcomp.c where we parse OPEN parens
+ * of various types. */
+PERL_STATIC_INLINE void
+S_unwind_paren(pTHX_ regexp *rex, U32 lp, U32 lcp comma_pDEPTH) {
+    PERL_ARGS_ASSERT_UNWIND_PAREN;
+    U32 n;
+    DECLARE_AND_GET_RE_DEBUG_FLAGS;
+    DEBUG_BUFFERS_r(Perl_re_exec_indentf( aTHX_
+        "UNWIND_PAREN: rex=0x%" UVxf " offs=0x%" UVxf
+        ": invalidate (%" UVuf " .. %" UVuf ") set lcp: %" UVuf "\n",
+        depth,
+        PTR2UV(rex),
+        PTR2UV(RXp_OFFSp(rex)),
+        (UV)(lp),
+        (UV)(RXp_LASTPAREN(rex)),
+        (UV)(lcp)
+    ));
+    for (n = RXp_LASTPAREN(rex); n > lp; n--) {
+        RXp_OFFSp(rex)[n].end = -1;
+    }
+    RXp_LASTPAREN(rex) = n;
+    RXp_LASTCLOSEPAREN(rex) = lcp;
+}
+#define UNWIND_PAREN(lp,lcp) unwind_paren(rex,lp,lcp)
+
+PERL_STATIC_INLINE void
+S_capture_clear(pTHX_ regexp *rex, U16 from_ix, U16 to_ix, const char *str comma_pDEPTH) {
+    PERL_ARGS_ASSERT_CAPTURE_CLEAR;
+    PERL_UNUSED_ARG(str); /* only used for debugging */
+    U16 my_ix;
+    DECLARE_AND_GET_RE_DEBUG_FLAGS;
+    for ( my_ix = from_ix; my_ix <= to_ix; my_ix++ ) {
+        DEBUG_BUFFERS_r(Perl_re_exec_indentf( aTHX_
+                "CAPTURE_CLEAR %s \\%" IVdf ": "
+                "%" IVdf "(%" IVdf ") .. %" IVdf
+                " => "
+                "%" IVdf "(%" IVdf ") .. %" IVdf
+                "\n",
+            depth, str, (IV)my_ix,
+            (IV)RXp_OFFSp(rex)[my_ix].start,
+            (IV)RXp_OFFSp(rex)[my_ix].start_tmp,
+            (IV)RXp_OFFSp(rex)[my_ix].end,
+            (IV)-1, (IV)-1, (IV)-1));
+        RXp_OFFSp(rex)[my_ix].start = -1;
+        RXp_OFFSp(rex)[my_ix].start_tmp = -1;
+        RXp_OFFSp(rex)[my_ix].end = -1;
+    }
+}
 
+#define CAPTURE_CLEAR(from_ix, to_ix, str) \
+    if (from_ix) capture_clear(rex,from_ix, to_ix, str)
 
 STATIC void
-S_regcppop(pTHX_ regexp *rex, U32 *maxopenparen_p _pDEPTH)
+S_regcppop(pTHX_ regexp *rex, U32 *maxopenparen_p comma_pDEPTH)
 {
     UV i;
     U32 paren;
@@ -347,44 +405,62 @@ S_regcppop(pTHX_ regexp *rex, U32 *maxopenparen_p _pDEPTH)
 
     PERL_ARGS_ASSERT_REGCPPOP;
 
+
+    DEBUG_BUFFERS_r({
+        Perl_re_exec_indentf(aTHX_
+                "starting regcppop at %" IVdf "\n",
+                depth, PL_savestack_ix);
+    });
+
     /* Pop REGCP_OTHER_ELEMS before the parentheses loop starts. */
     i = SSPOPUV;
     assert((i & SAVE_MASK) == SAVEt_REGCONTEXT); /* Check that the magic cookie is there. */
     i >>= SAVE_TIGHT_SHIFT; /* Parentheses elements to pop. */
-    rex->lastcloseparen = SSPOPINT;
-    rex->lastparen = SSPOPINT;
+    RXp_LASTCLOSEPAREN(rex) = SSPOPINT;
+    RXp_LASTPAREN(rex) = SSPOPINT;
     *maxopenparen_p = SSPOPINT;
 
     i -= REGCP_OTHER_ELEMS;
     /* Now restore the parentheses context. */
     DEBUG_BUFFERS_r(
-        if (i || rex->lastparen + 1 <= rex->nparens)
+        if (i || RXp_LASTPAREN(rex) + 1 <= rex->nparens)
             Perl_re_exec_indentf( aTHX_
                 "rex=0x%" UVxf " offs=0x%" UVxf ": restoring capture indices to:\n",
                 depth,
                 PTR2UV(rex),
-                PTR2UV(rex->offs)
+                PTR2UV(RXp_OFFSp(rex))
             );
     );
-    paren = *maxopenparen_p;
-    for ( ; i > 0; i -= REGCP_PAREN_ELEMS) {
-        SSize_t tmps;
-        rex->offs[paren].start_tmp = SSPOPINT;
-        rex->offs[paren].start = SSPOPIV;
-        tmps = SSPOPIV;
-        if (paren <= rex->lastparen)
-            rex->offs[paren].end = tmps;
-        DEBUG_BUFFERS_r( Perl_re_exec_indentf( aTHX_
-            "    \\%" UVuf ": %" IVdf "(%" IVdf ")..%" IVdf "%s\n",
-            depth,
-            (UV)paren,
-            (IV)rex->offs[paren].start,
-            (IV)rex->offs[paren].start_tmp,
-            (IV)rex->offs[paren].end,
-            (paren > rex->lastparen ? "(skipped)" : ""));
-        );
-        paren--;
-    }
+    /* substract remaining elements from the stack */
+    PL_savestack_ix -= i;
+
+    /* static assert that offs struc size is not less than stack elem size */
+    STATIC_ASSERT_STMT(sizeof(*RXp_OFFSp(rex)) >= sizeof(*PL_savestack));
+
+    /* calculate actual number of offs/capture groups stored */
+    /* by doing integer division (leaving potential alignment aside) */
+    i = (i * sizeof(*PL_savestack)) / sizeof(*RXp_OFFSp(rex));
+
+    /* calculate paren starting point */
+    /* i is our number of entries which we are subtracting from *maxopenparen_p */
+    /* and we are storing + 1 this to get the beginning */
+    paren = *maxopenparen_p - i + 1;
+
+    /* restore them */
+    memcpy(RXp_OFFSp(rex) + paren, &PL_savestack[PL_savestack_ix], i * sizeof(*RXp_OFFSp(rex)));
+
+    DEBUG_BUFFERS_r(
+        for (; paren <= *maxopenparen_p; ++paren) {
+            Perl_re_exec_indentf(aTHX_
+                "    \\%" UVuf " %" IVdf "(%" IVdf ") .. %" IVdf " %s (regcppop)\n",
+                depth,
+                (UV)paren,
+                (IV)RXp_OFFSp(rex)[paren].start,
+                (IV)RXp_OFFSp(rex)[paren].start_tmp,
+                (IV)RXp_OFFSp(rex)[paren].end,
+                (paren > RXp_LASTPAREN(rex) ? "(skipped)" : ""));
+        }
+    );
 #if 1
     /* It would seem that the similar code in regtry()
      * already takes care of this, and in fact it is in
@@ -395,25 +471,31 @@ S_regcppop(pTHX_ regexp *rex, U32 *maxopenparen_p _pDEPTH)
      * this code seems to be necessary or otherwise
      * this erroneously leaves $1 defined: "1" =~ /^(?:(\d)x)?\d$/
      * --jhi updated by dapm */
-    for (i = rex->lastparen + 1; i <= rex->nparens; i++) {
-        if (i > *maxopenparen_p)
-            rex->offs[i].start = -1;
-        rex->offs[i].end = -1;
+    for (i = RXp_LASTPAREN(rex) + 1; i <= rex->nparens; i++) {
+        if (i > *maxopenparen_p) {
+            RXp_OFFSp(rex)[i].start = -1;
+        }
+        RXp_OFFSp(rex)[i].end = -1;
         DEBUG_BUFFERS_r( Perl_re_exec_indentf( aTHX_
-            "    \\%" UVuf ": %s   ..-1 undeffing\n",
+            "    \\%" UVuf ": %s   ..-1 undeffing (regcppop)\n",
             depth,
             (UV)i,
             (i > *maxopenparen_p) ? "-1" : "  "
         ));
     }
 #endif
+    DEBUG_BUFFERS_r({
+        Perl_re_exec_indentf(aTHX_
+                "finished regcppop at %" IVdf "\n",
+                depth, PL_savestack_ix);
+    });
 }
 
 /* restore the parens and associated vars at savestack position ix,
  * but without popping the stack */
 
 STATIC void
-S_regcp_restore(pTHX_ regexp *rex, I32 ix, U32 *maxopenparen_p _pDEPTH)
+S_regcp_restore(pTHX_ regexp *rex, I32 ix, U32 *maxopenparen_p comma_pDEPTH)
 {
     I32 tmpix = PL_savestack_ix;
     PERL_ARGS_ASSERT_REGCP_RESTORE;
@@ -430,7 +512,7 @@ S_isFOO_lc(pTHX_ const U8 classnum, const U8 character)
 {
     /* Returns a boolean as to whether or not 'character' is a member of the
      * Posix character class given by 'classnum' that should be equivalent to a
-     * value in the typedef '_char_class_number'.
+     * value in the typedef 'char_class_number_'.
      *
      * Ideally this could be replaced by a just an array of function pointers
      * to the C library functions that implement the macros this calls.
@@ -441,33 +523,40 @@ S_isFOO_lc(pTHX_ const U8 classnum, const U8 character)
      * optimizer strips it away).  But we don't particularly care about
      * performance with locales anyway. */
 
-    switch ((_char_class_number) classnum) {
-        case _CC_ENUM_ALPHANUMERIC: return isALPHANUMERIC_LC(character);
-        case _CC_ENUM_ALPHA:     return isALPHA_LC(character);
-        case _CC_ENUM_ASCII:     return isASCII_LC(character);
-        case _CC_ENUM_BLANK:     return isBLANK_LC(character);
-        case _CC_ENUM_CASED:     return    isLOWER_LC(character)
-                                        || isUPPER_LC(character);
-        case _CC_ENUM_CNTRL:     return isCNTRL_LC(character);
-        case _CC_ENUM_DIGIT:     return isDIGIT_LC(character);
-        case _CC_ENUM_GRAPH:     return isGRAPH_LC(character);
-        case _CC_ENUM_LOWER:     return isLOWER_LC(character);
-        case _CC_ENUM_PRINT:     return isPRINT_LC(character);
-        case _CC_ENUM_PUNCT:     return isPUNCT_LC(character);
-        case _CC_ENUM_SPACE:     return isSPACE_LC(character);
-        case _CC_ENUM_UPPER:     return isUPPER_LC(character);
-        case _CC_ENUM_WORDCHAR:  return isWORDCHAR_LC(character);
-        case _CC_ENUM_XDIGIT:    return isXDIGIT_LC(character);
+    if (IN_UTF8_CTYPE_LOCALE) {
+        return cBOOL(generic_isCC_(character, classnum));
+    }
+
+    switch ((char_class_number_) classnum) {
+        case CC_ENUM_ALPHANUMERIC_: return isU8_ALPHANUMERIC_LC(character);
+        case CC_ENUM_ALPHA_:        return    isU8_ALPHA_LC(character);
+        case CC_ENUM_ASCII_:        return    isU8_ASCII_LC(character);
+        case CC_ENUM_BLANK_:        return    isU8_BLANK_LC(character);
+        case CC_ENUM_CASED_:        return    isU8_CASED_LC(character);
+        case CC_ENUM_CNTRL_:        return    isU8_CNTRL_LC(character);
+        case CC_ENUM_DIGIT_:        return    isU8_DIGIT_LC(character);
+        case CC_ENUM_GRAPH_:        return    isU8_GRAPH_LC(character);
+        case CC_ENUM_LOWER_:        return    isU8_LOWER_LC(character);
+        case CC_ENUM_PRINT_:        return    isU8_PRINT_LC(character);
+        case CC_ENUM_PUNCT_:        return    isU8_PUNCT_LC(character);
+        case CC_ENUM_SPACE_:        return    isU8_SPACE_LC(character);
+        case CC_ENUM_UPPER_:        return    isU8_UPPER_LC(character);
+        case CC_ENUM_WORDCHAR_:     return isU8_WORDCHAR_LC(character);
+        case CC_ENUM_XDIGIT_:       return   isU8_XDIGIT_LC(character);
         default:    /* VERTSPACE should never occur in locales */
-            Perl_croak(aTHX_ "panic: isFOO_lc() has an unexpected character class '%d'", classnum);
+            break;
     }
 
+    Perl_croak(aTHX_
+               "panic: isFOO_lc() has an unexpected character class '%d'",
+               classnum);
+
     NOT_REACHED; /* NOTREACHED */
     return FALSE;
 }
 
 PERL_STATIC_INLINE I32
-S_foldEQ_latin1_s2_folded(const char *s1, const char *s2, I32 len)
+S_foldEQ_latin1_s2_folded(pTHX_ const char *s1, const char *s2, I32 len)
 {
     /* Compare non-UTF-8 using Unicode (Latin1) semantics.  s2 must already be
      * folded.  Works on all folds representable without UTF-8, except for
@@ -500,7 +589,7 @@ S_isFOO_utf8_lc(pTHX_ const U8 classnum, const U8* character, const U8* e)
     /* Returns a boolean as to whether or not the (well-formed) UTF-8-encoded
      * 'character' is a member of the Posix character class given by 'classnum'
      * that should be equivalent to a value in the typedef
-     * '_char_class_number'.
+     * 'char_class_number_'.
      *
      * This just calls isFOO_lc on the code point for the character if it is in
      * the range 0-255.  Outside that range, all characters use Unicode
@@ -520,17 +609,16 @@ S_isFOO_utf8_lc(pTHX_ const U8 classnum, const U8* character, const U8* e)
 
     _CHECK_AND_OUTPUT_WIDE_LOCALE_UTF8_MSG(character, e);
 
-    switch ((_char_class_number) classnum) {
-        case _CC_ENUM_SPACE:     return is_XPERLSPACE_high(character);
-        case _CC_ENUM_BLANK:     return is_HORIZWS_high(character);
-        case _CC_ENUM_XDIGIT:    return is_XDIGIT_high(character);
-        case _CC_ENUM_VERTSPACE: return is_VERTWS_high(character);
+    switch ((char_class_number_) classnum) {
+        case CC_ENUM_SPACE_:     return is_XPERLSPACE_high(character);
+        case CC_ENUM_BLANK_:     return is_HORIZWS_high(character);
+        case CC_ENUM_XDIGIT_:    return is_XDIGIT_high(character);
+        case CC_ENUM_VERTSPACE_: return is_VERTWS_high(character);
         default:
             return _invlist_contains_cp(PL_XPosix_ptrs[classnum],
                                         utf8_to_uvchr_buf(character, e, NULL));
     }
-
-    return FALSE; /* Things like CNTRL are always below 256 */
+    NOT_REACHED; /* NOTREACHED */
 }
 
 STATIC U8 *
@@ -1111,7 +1199,7 @@ Perl_re_intuit_start(pTHX_
             && prog->intflags & PREGf_ANCH
             && prog->check_offset_max != SSize_t_MAX)
         {
-            SSize_t check_len = SvCUR(check) - !!SvTAIL(check);
+            SSize_t check_len = SvCUR(check) - cBOOL(SvTAIL(check));
             const char * const anchor =
                         (prog->intflags & PREGf_ANCH_GPOS ? strpos : strbeg);
             SSize_t targ_len = (char*)end_point - anchor;
@@ -1478,11 +1566,11 @@ Perl_re_intuit_start(pTHX_
      * (trie stclasses are too expensive to use here, we are better off to
      * leave it to regmatch itself) */
 
-    if (progi->regstclass && PL_regkind[OP(progi->regstclass)]!=TRIE) {
+    if (progi->regstclass && REGNODE_TYPE(OP(progi->regstclass))!=TRIE) {
         const U8* const str = (U8*)STRING(progi->regstclass);
 
         /* XXX this value could be pre-computed */
-        const SSize_t cl_l = (PL_regkind[OP(progi->regstclass)] == EXACT
+        const SSize_t cl_l = (REGNODE_TYPE(OP(progi->regstclass)) == EXACT
                     ?  (reginfo->is_utf8_pat
                         ? (SSize_t)utf8_distance(str + STR_LEN(progi->regstclass), str)
                         : (SSize_t)STR_LEN(progi->regstclass))
@@ -1693,15 +1781,15 @@ Perl_re_intuit_start(pTHX_
     const enum { trie_plain, trie_utf8, trie_utf8_fold, trie_latin_utf8_fold,       \
                  trie_utf8_exactfa_fold, trie_latin_utf8_exactfa_fold,              \
                  trie_utf8l, trie_flu8, trie_flu8_latin }                           \
-                    trie_type = ((scan->flags == EXACT)                             \
+                    trie_type = ((FLAGS(scan) == EXACT)                             \
                                  ? (utf8_target ? trie_utf8 : trie_plain)           \
-                                 : (scan->flags == EXACTL)                          \
+                                 : (FLAGS(scan) == EXACTL)                          \
                                     ? (utf8_target ? trie_utf8l : trie_plain)       \
-                                    : (scan->flags == EXACTFAA)                     \
+                                    : (FLAGS(scan) == EXACTFAA)                     \
                                       ? (utf8_target                                \
                                          ? trie_utf8_exactfa_fold                   \
                                          : trie_latin_utf8_exactfa_fold)            \
-                                      : (scan->flags == EXACTFLU8                   \
+                                      : (FLAGS(scan) == EXACTFLU8                   \
                                          ? (utf8_target                             \
                                            ? trie_flu8                              \
                                            : trie_flu8_latin)                       \
@@ -1717,7 +1805,7 @@ STMT_START {
     U8 flags = FOLD_FLAGS_FULL;                                                     \
     switch (trie_type) {                                                            \
     case trie_flu8:                                                                 \
-        _CHECK_AND_WARN_PROBLEMATIC_LOCALE;                                         \
+        CHECK_AND_WARN_PROBLEMATIC_LOCALE_;                                         \
         if (UTF8_IS_ABOVE_LATIN1(*uc)) {                                            \
             _CHECK_AND_OUTPUT_WIDE_LOCALE_UTF8_MSG(uc, uc_end);                     \
         }                                                                           \
@@ -1742,7 +1830,7 @@ STMT_START {
         }                                                                           \
         break;                                                                      \
     case trie_flu8_latin:                                                           \
-        _CHECK_AND_WARN_PROBLEMATIC_LOCALE;                                         \
+        CHECK_AND_WARN_PROBLEMATIC_LOCALE_;                                         \
         goto do_trie_latin_utf8_fold;                                               \
     case trie_latin_utf8_exactfa_fold:                                              \
         flags |= FOLD_FLAGS_NOMIX_ASCII;                                            \
@@ -1763,7 +1851,7 @@ STMT_START {
         }                                                                           \
         break;                                                                      \
     case trie_utf8l:                                                                \
-        _CHECK_AND_WARN_PROBLEMATIC_LOCALE;                                         \
+        CHECK_AND_WARN_PROBLEMATIC_LOCALE_;                                         \
         if (utf8_target && UTF8_IS_ABOVE_LATIN1(*uc)) {                             \
             _CHECK_AND_OUTPUT_WIDE_LOCALE_UTF8_MSG(uc, uc_end);                     \
         }                                                                           \
@@ -1793,6 +1881,9 @@ STMT_START {
     dump_exec_pos(li,s,(reginfo->strend),(reginfo->strbeg), \
                 startpos, doutf8, depth)
 
+#define GET_ANYOFH_INVLIST(prog, n)                                         \
+                        GET_REGCLASS_AUX_DATA(prog, n, TRUE, 0, NULL, NULL)
+
 #define REXEC_FBC_UTF8_SCAN(CODE)                           \
     STMT_START {                                            \
         while (s < strend) {                                \
@@ -2183,7 +2274,7 @@ S_find_byclass(pTHX_ regexp * prog, const regnode *c, char *s,
     U8 c2;
     char *e = NULL;
 
-    /* In some cases we accept only the first occurence of 'x' in a sequence of
+    /* In some cases we accept only the first occurrence of 'x' in a sequence of
      * them.  This variable points to just beyond the end of the previous
      * occurrence of 'x', hence we can tell if we are in a sequence.  (Having
      * it point to beyond the 'x' allows us to work for UTF-8 without having to
@@ -2197,7 +2288,7 @@ S_find_byclass(pTHX_ regexp * prog, const regnode *c, char *s,
     bool to_complement = FALSE; /* Invert the result?  Taking the xor of this
                                    with a result inverts that result, as 0^1 =
                                    1 and 1^1 = 0 */
-    _char_class_number classnum;
+    char_class_number_ classnum;
 
     RXi_GET_DECL(prog,progi);
 
@@ -2208,12 +2299,13 @@ S_find_byclass(pTHX_ regexp * prog, const regnode *c, char *s,
      * for it isn't; 'b' stands for byte), and the UTF8ness of the pattern
      * ('p8' and 'pb'. */
     switch (with_tp_UTF8ness(OP(c), utf8_target, is_utf8_pat)) {
+        SV * anyofh_list;
 
       case ANYOFPOSIXL_t8_pb:
       case ANYOFPOSIXL_t8_p8:
       case ANYOFL_t8_pb:
       case ANYOFL_t8_p8:
-        _CHECK_AND_WARN_PROBLEMATIC_LOCALE;
+        CHECK_AND_WARN_PROBLEMATIC_LOCALE_;
         CHECK_AND_WARN_NON_UTF8_CTYPE_LOCALE_IN_SETS(c);
 
         /* FALLTHROUGH */
@@ -2230,7 +2322,7 @@ S_find_byclass(pTHX_ regexp * prog, const regnode *c, char *s,
       case ANYOFPOSIXL_tb_p8:
       case ANYOFL_tb_pb:
       case ANYOFL_tb_p8:
-        _CHECK_AND_WARN_PROBLEMATIC_LOCALE;
+        CHECK_AND_WARN_PROBLEMATIC_LOCALE_;
         CHECK_AND_WARN_NON_UTF8_CTYPE_LOCALE_IN_SETS(c);
 
         /* FALLTHROUGH */
@@ -2239,22 +2331,22 @@ S_find_byclass(pTHX_ regexp * prog, const regnode *c, char *s,
       case ANYOFD_tb_p8:
       case ANYOF_tb_pb:
       case ANYOF_tb_p8:
-        if (ANYOF_FLAGS(c) & ~ ANYOF_MATCHES_ALL_ABOVE_BITMAP) {
+        if (! ANYOF_FLAGS(c) && ANYOF_MATCHES_NONE_OUTSIDE_BITMAP(c)) {
             /* We know that s is in the bitmap range since the target isn't
              * UTF-8, so what happens for out-of-range values is not relevant,
              * so exclude that from the flags */
-            REXEC_FBC_NON_UTF8_CLASS_SCAN(reginclass(prog,c, (U8*)s, (U8*)s+1,
-                                                     0));
+            REXEC_FBC_NON_UTF8_CLASS_SCAN(ANYOF_BITMAP_TEST(c, *((U8*)s)));
         }
         else {
-            REXEC_FBC_NON_UTF8_CLASS_SCAN(ANYOF_BITMAP_TEST(c, *((U8*)s)));
+            REXEC_FBC_NON_UTF8_CLASS_SCAN(reginclass(prog,c, (U8*)s, (U8*)s+1,
+                                                     0));
         }
         break;
 
-      case ANYOFM_tb_pb: /* ARG() is the base byte; FLAGS() the mask byte */
+      case ANYOFM_tb_pb: /* ARG1u() is the base byte; FLAGS() the mask byte */
       case ANYOFM_tb_p8:
         REXEC_FBC_NON_UTF8_FIND_NEXT_SCAN(
-             find_next_masked((U8 *) s, (U8 *) strend, (U8) ARG(c), FLAGS(c)));
+             find_next_masked((U8 *) s, (U8 *) strend, (U8) ARG1u(c), FLAGS(c)));
         break;
 
       case ANYOFM_t8_pb:
@@ -2263,13 +2355,13 @@ S_find_byclass(pTHX_ regexp * prog, const regnode *c, char *s,
          * we do anyway for performance reasons, as otherwise we would have to
          * examine all the continuation characters */
         REXEC_FBC_UTF8_FIND_NEXT_SCAN(
-             find_next_masked((U8 *) s, (U8 *) strend, (U8) ARG(c), FLAGS(c)));
+             find_next_masked((U8 *) s, (U8 *) strend, (U8) ARG1u(c), FLAGS(c)));
         break;
 
       case NANYOFM_tb_pb:
       case NANYOFM_tb_p8:
         REXEC_FBC_NON_UTF8_FIND_NEXT_SCAN(
-           find_span_end_mask((U8 *) s, (U8 *) strend, (U8) ARG(c), FLAGS(c)));
+           find_span_end_mask((U8 *) s, (U8 *) strend, (U8) ARG1u(c), FLAGS(c)));
         break;
 
       case NANYOFM_t8_pb:
@@ -2277,7 +2369,7 @@ S_find_byclass(pTHX_ regexp * prog, const regnode *c, char *s,
                                   variants. */
         REXEC_FBC_UTF8_FIND_NEXT_SCAN(
                         (char *) find_span_end_mask((U8 *) s, (U8 *) strend,
-                                                    (U8) ARG(c), FLAGS(c)));
+                                                    (U8) ARG1u(c), FLAGS(c)));
         break;
 
       /* These nodes all require at least one code point to be in UTF-8 to
@@ -2286,6 +2378,8 @@ S_find_byclass(pTHX_ regexp * prog, const regnode *c, char *s,
       case ANYOFH_tb_p8:
       case ANYOFHb_tb_pb:
       case ANYOFHb_tb_p8:
+      case ANYOFHbbm_tb_pb:
+      case ANYOFHbbm_tb_p8:
       case ANYOFHr_tb_pb:
       case ANYOFHr_tb_p8:
       case ANYOFHs_tb_pb:
@@ -2298,9 +2392,13 @@ S_find_byclass(pTHX_ regexp * prog, const regnode *c, char *s,
 
       case ANYOFH_t8_pb:
       case ANYOFH_t8_p8:
+        anyofh_list = GET_ANYOFH_INVLIST(prog, c);
         REXEC_FBC_UTF8_CLASS_SCAN(
               (   (U8) NATIVE_UTF8_TO_I8(*s) >= ANYOF_FLAGS(c)
-               && reginclass(prog, c, (U8*)s, (U8*) strend, 1 /* is utf8 */)));
+               && _invlist_contains_cp(anyofh_list,
+                                       utf8_to_uvchr_buf((U8 *) s,
+                                                         (U8 *) strend,
+                                                         NULL))));
         break;
 
       case ANYOFHb_t8_pb:
@@ -2309,29 +2407,53 @@ S_find_byclass(pTHX_ regexp * prog, const regnode *c, char *s,
             /* We know what the first byte of any matched string should be. */
             U8 first_byte = FLAGS(c);
 
+            anyofh_list = GET_ANYOFH_INVLIST(prog, c);
             REXEC_FBC_FIND_NEXT_UTF8_BYTE_SCAN(first_byte,
-                    reginclass(prog, c, (U8*)s, (U8*) strend, 1 /* is utf8 */));
+                   _invlist_contains_cp(anyofh_list,
+                                           utf8_to_uvchr_buf((U8 *) s,
+                                                              (U8 *) strend,
+                                                              NULL)));
+        }
+        break;
+
+      case ANYOFHbbm_t8_pb:
+      case ANYOFHbbm_t8_p8:
+        {
+            /* We know what the first byte of any matched string should be. */
+            U8 first_byte = FLAGS(c);
+
+            /* And a bitmap defines all the legal 2nd byte matches */
+            REXEC_FBC_FIND_NEXT_UTF8_BYTE_SCAN(first_byte,
+                               (    s < strend
+                                && BITMAP_TEST(((struct regnode_bbm *) c)->bitmap,
+                                            (U8) s[1] & UTF_CONTINUATION_MASK)));
         }
         break;
 
       case ANYOFHr_t8_pb:
       case ANYOFHr_t8_p8:
+        anyofh_list = GET_ANYOFH_INVLIST(prog, c);
         REXEC_FBC_UTF8_CLASS_SCAN(
                     (   inRANGE(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,
-                                                           1 /* is utf8 */)));
+                   && _invlist_contains_cp(anyofh_list,
+                                           utf8_to_uvchr_buf((U8 *) s,
+                                                              (U8 *) strend,
+                                                              NULL))));
         break;
 
       case ANYOFHs_t8_pb:
       case ANYOFHs_t8_p8:
+        anyofh_list = GET_ANYOFH_INVLIST(prog, c);
         REXEC_FBC_FIND_NEXT_UTF8_STRING_SCAN(
                         ((struct regnode_anyofhs *) c)->string,
                         /* Note FLAGS is the string length in this regnode */
                         ((struct regnode_anyofhs *) c)->string + FLAGS(c),
-                        reginclass(prog, c, (U8*)s, (U8*) strend,
-                                   1 /* is utf8 */));
+                        _invlist_contains_cp(anyofh_list,
+                                             utf8_to_uvchr_buf((U8 *) s,
+                                                               (U8 *) strend,
+                                                               NULL)));
         break;
 
       case ANYOFR_tb_pb:
@@ -2374,16 +2496,16 @@ S_find_byclass(pTHX_ regexp * prog, const regnode *c, char *s,
         /* Latin1 folds are not affected by /a, except it excludes the sharp s,
          * which these functions don't handle anyway */
         fold_array = PL_fold_latin1;
-        folder = foldEQ_latin1_s2_folded;
+        folder = S_foldEQ_latin1_s2_folded;
         goto do_exactf_non_utf8;
 
       case EXACTF_tb_pb:
         fold_array = PL_fold;
-        folder = foldEQ;
+        folder = Perl_foldEQ;
         goto do_exactf_non_utf8;
 
       case EXACTFL_tb_pb:
-        _CHECK_AND_WARN_PROBLEMATIC_LOCALE;
+        CHECK_AND_WARN_PROBLEMATIC_LOCALE_;
 
         if (IN_UTF8_CTYPE_LOCALE) {
             utf8_fold_flags = FOLDEQ_LOCALE;
@@ -2391,7 +2513,7 @@ S_find_byclass(pTHX_ regexp * prog, const regnode *c, char *s,
         }
 
         fold_array = PL_fold_locale;
-        folder = foldEQ_locale;
+        folder = Perl_foldEQ_locale;
         goto do_exactf_non_utf8;
 
       case EXACTFU_tb_pb:
@@ -2399,7 +2521,7 @@ S_find_byclass(pTHX_ regexp * prog, const regnode *c, char *s,
          * don't have to worry here about this single special case in the
          * Latin1 range */
         fold_array = PL_fold_latin1;
-        folder = foldEQ_latin1_s2_folded;
+        folder = S_foldEQ_latin1_s2_folded;
 
         /* FALLTHROUGH */
 
@@ -2418,7 +2540,7 @@ S_find_byclass(pTHX_ regexp * prog, const regnode *c, char *s,
 
         /* We know that we have to match at least 'ln' bytes (which is the same
          * as characters, since not utf8).  If we have to match 3 characters,
-         * and there are only 2 availabe, we know without trying that it will
+         * and there are only 2 available, we know without trying that it will
          * fail; so don't start a match past the required minimum number from
          * the far end */
         e = HOP3c(strend, -((SSize_t)ln), s);
@@ -2435,7 +2557,7 @@ S_find_byclass(pTHX_ regexp * prog, const regnode *c, char *s,
                 }
 
                 /* Check that the rest of the node matches */
-                if (   (ln == 1 || folder(s + 1, pat_string + 1, ln - 1))
+                if (   (ln == 1 || folder(aTHX_ s + 1, pat_string + 1, ln - 1))
                     && (reginfo->intuit || regtry(reginfo, &s)) )
                 {
                     goto got_it;
@@ -2459,7 +2581,7 @@ S_find_byclass(pTHX_ regexp * prog, const regnode *c, char *s,
                         break;
                     }
 
-                    if (   (ln == 1 || folder(s + 1, pat_string + 1, ln - 1))
+                    if (   (ln == 1 || folder(aTHX_ s + 1, pat_string + 1, ln - 1))
                         && (reginfo->intuit || regtry(reginfo, &s)) )
                     {
                         goto got_it;
@@ -2471,7 +2593,7 @@ S_find_byclass(pTHX_ regexp * prog, const regnode *c, char *s,
                        should actually happen only in EXACTFL nodes */
                 while (s <= e) {
                     if (    (*(U8*)s == c1 || *(U8*)s == c2)
-                        && (ln == 1 || folder(s + 1, pat_string + 1, ln - 1))
+                        && (ln == 1 || folder(aTHX_ s + 1, pat_string + 1, ln - 1))
                         && (reginfo->intuit || regtry(reginfo, &s)) )
                     {
                         goto got_it;
@@ -2504,7 +2626,7 @@ S_find_byclass(pTHX_ regexp * prog, const regnode *c, char *s,
       case EXACTFL_tb_p8:
       case EXACTFL_t8_pb:
       case EXACTFL_t8_p8:
-        _CHECK_AND_WARN_PROBLEMATIC_LOCALE;
+        CHECK_AND_WARN_PROBLEMATIC_LOCALE_;
         utf8_fold_flags = FOLDEQ_LOCALE;
         goto do_exactf_utf8;
 
@@ -2635,7 +2757,7 @@ S_find_byclass(pTHX_ regexp * prog, const regnode *c, char *s,
 
       case NBOUNDL_tb_pb:
       case NBOUNDL_tb_p8:
-        _CHECK_AND_WARN_PROBLEMATIC_LOCALE;
+        CHECK_AND_WARN_PROBLEMATIC_LOCALE_;
         if (FLAGS(c) == TRADITIONAL_BOUND) {
             FBC_NBOUND_NON_UTF8(isWORDCHAR_LC);
             break;
@@ -2648,7 +2770,7 @@ S_find_byclass(pTHX_ regexp * prog, const regnode *c, char *s,
 
       case BOUNDL_tb_pb:
       case BOUNDL_tb_p8:
-        _CHECK_AND_WARN_PROBLEMATIC_LOCALE;
+        CHECK_AND_WARN_PROBLEMATIC_LOCALE_;
         if (FLAGS(c) == TRADITIONAL_BOUND) {
             FBC_BOUND_NON_UTF8(isWORDCHAR_LC);
             break;
@@ -2779,7 +2901,7 @@ S_find_byclass(pTHX_ regexp * prog, const regnode *c, char *s,
 
       case BOUNDL_t8_pb:
       case BOUNDL_t8_p8:
-        _CHECK_AND_WARN_PROBLEMATIC_LOCALE;
+        CHECK_AND_WARN_PROBLEMATIC_LOCALE_;
         if (FLAGS(c) == TRADITIONAL_BOUND) {
             FBC_BOUND_UTF8(isWORDCHAR_LC, isWORDCHAR_LC_uvchr,
                            isWORDCHAR_LC_utf8_safe);
@@ -2793,7 +2915,7 @@ S_find_byclass(pTHX_ regexp * prog, const regnode *c, char *s,
 
       case NBOUNDL_t8_pb:
       case NBOUNDL_t8_p8:
-        _CHECK_AND_WARN_PROBLEMATIC_LOCALE;
+        CHECK_AND_WARN_PROBLEMATIC_LOCALE_;
         if (FLAGS(c) == TRADITIONAL_BOUND) {
             FBC_NBOUND_UTF8(isWORDCHAR_LC, isWORDCHAR_LC_uvchr,
                             isWORDCHAR_LC_utf8_safe);
@@ -2990,7 +3112,7 @@ S_find_byclass(pTHX_ regexp * prog, const regnode *c, char *s,
         break;
 
       /* The argument to all the POSIX node types is the class number to pass
-       * to _generic_isCC() to build a mask for searching in PL_charclass[] */
+       * to generic_isCC_() to build a mask for searching in PL_charclass[] */
 
       case NPOSIXL_t8_pb:
       case NPOSIXL_t8_p8:
@@ -2999,7 +3121,7 @@ S_find_byclass(pTHX_ regexp * prog, const regnode *c, char *s,
 
       case POSIXL_t8_pb:
       case POSIXL_t8_p8:
-        _CHECK_AND_WARN_PROBLEMATIC_LOCALE;
+        CHECK_AND_WARN_PROBLEMATIC_LOCALE_;
         REXEC_FBC_UTF8_CLASS_SCAN(
             to_complement ^ cBOOL(isFOO_utf8_lc(FLAGS(c), (U8 *) s,
                                                           (U8 *) strend)));
@@ -3012,7 +3134,7 @@ S_find_byclass(pTHX_ regexp * prog, const regnode *c, char *s,
 
       case POSIXL_tb_pb:
       case POSIXL_tb_p8:
-        _CHECK_AND_WARN_PROBLEMATIC_LOCALE;
+        CHECK_AND_WARN_PROBLEMATIC_LOCALE_;
         REXEC_FBC_NON_UTF8_CLASS_SCAN(
                                 to_complement ^ cBOOL(isFOO_lc(FLAGS(c), *s)));
         break;
@@ -3022,7 +3144,7 @@ S_find_byclass(pTHX_ regexp * prog, const regnode *c, char *s,
         /* The complement of something that matches only ASCII matches all
          * non-ASCII, plus everything in ASCII that isn't in the class. */
         REXEC_FBC_UTF8_CLASS_SCAN(   ! isASCII_utf8_safe(s, strend)
-                                  || ! _generic_isCC_A(*s, FLAGS(c)));
+                                  || ! generic_isCC_A_(*s, FLAGS(c)));
         break;
 
       case POSIXA_t8_pb:
@@ -3031,7 +3153,7 @@ S_find_byclass(pTHX_ regexp * prog, const regnode *c, char *s,
          * byte invariant character.  But we do anyway for performance reasons,
          * as otherwise we would have to examine all the continuation
          * characters */
-        REXEC_FBC_UTF8_CLASS_SCAN(_generic_isCC_A(*s, FLAGS(c)));
+        REXEC_FBC_UTF8_CLASS_SCAN(generic_isCC_A_(*s, FLAGS(c)));
         break;
 
       case NPOSIXD_tb_pb:
@@ -3046,7 +3168,7 @@ S_find_byclass(pTHX_ regexp * prog, const regnode *c, char *s,
       case POSIXA_tb_pb:
       case POSIXA_tb_p8:
         REXEC_FBC_NON_UTF8_CLASS_SCAN(
-                        to_complement ^ cBOOL(_generic_isCC_A(*s, FLAGS(c))));
+                        to_complement ^ cBOOL(generic_isCC_A_(*s, FLAGS(c))));
         break;
 
       case NPOSIXU_tb_pb:
@@ -3057,7 +3179,7 @@ S_find_byclass(pTHX_ regexp * prog, const regnode *c, char *s,
       case POSIXU_tb_pb:
       case POSIXU_tb_p8:
             REXEC_FBC_NON_UTF8_CLASS_SCAN(
-                                 to_complement ^ cBOOL(_generic_isCC(*s,
+                                 to_complement ^ cBOOL(generic_isCC_(*s,
                                                                     FLAGS(c))));
         break;
 
@@ -3072,7 +3194,7 @@ S_find_byclass(pTHX_ regexp * prog, const regnode *c, char *s,
       case POSIXD_t8_p8:
       case POSIXU_t8_pb:
       case POSIXU_t8_p8:
-        classnum = (_char_class_number) FLAGS(c);
+        classnum = (char_class_number_) FLAGS(c);
         switch (classnum) {
           default:
             REXEC_FBC_UTF8_CLASS_SCAN(
@@ -3083,27 +3205,27 @@ S_find_byclass(pTHX_ regexp * prog, const regnode *c, char *s,
                                                                 NULL))));
             break;
 
-          case _CC_ENUM_SPACE:
+          case CC_ENUM_SPACE_:
             REXEC_FBC_UTF8_CLASS_SCAN(
                         to_complement ^ cBOOL(isSPACE_utf8_safe(s, strend)));
             break;
 
-          case _CC_ENUM_BLANK:
+          case CC_ENUM_BLANK_:
             REXEC_FBC_UTF8_CLASS_SCAN(
                         to_complement ^ cBOOL(isBLANK_utf8_safe(s, strend)));
             break;
 
-          case _CC_ENUM_XDIGIT:
+          case CC_ENUM_XDIGIT_:
             REXEC_FBC_UTF8_CLASS_SCAN(
                         to_complement ^ cBOOL(isXDIGIT_utf8_safe(s, strend)));
             break;
 
-          case _CC_ENUM_VERTSPACE:
+          case CC_ENUM_VERTSPACE_:
             REXEC_FBC_UTF8_CLASS_SCAN(
                         to_complement ^ cBOOL(isVERTWS_utf8_safe(s, strend)));
             break;
 
-          case _CC_ENUM_CNTRL:
+          case CC_ENUM_CNTRL_:
             REXEC_FBC_UTF8_CLASS_SCAN(
                         to_complement ^ cBOOL(isCNTRL_utf8_safe(s, strend)));
             break;
@@ -3121,7 +3243,7 @@ S_find_byclass(pTHX_ regexp * prog, const regnode *c, char *s,
         {
             DECL_TRIE_TYPE(c);
             /* what trie are we using right now */
-            reg_ac_data *aho = (reg_ac_data*)progi->data->data[ ARG( c ) ];
+            reg_ac_data *aho = (reg_ac_data*)progi->data->data[ ARG1u( c ) ];
             reg_trie_data *trie = (reg_trie_data*)progi->data->data[aho->trie];
             HV *widecharmap = MUTABLE_HV(progi->data->data[ aho->trie + 1 ]);
 
@@ -3393,29 +3515,29 @@ S_reg_set_capture_string(pTHX_ REGEXP * const rx,
             /* Create a new COW SV to share the match string and store
              * in saved_copy, unless the current COW SV in saved_copy
              * is valid and suitable for our purpose */
-            if ((   prog->saved_copy
-                 && SvIsCOW(prog->saved_copy)
-                 && SvPOKp(prog->saved_copy)
+            if ((   RXp_SAVED_COPY(prog)
+                 && SvIsCOW(RXp_SAVED_COPY(prog))
+                 && SvPOKp(RXp_SAVED_COPY(prog))
                  && SvIsCOW(sv)
                  && SvPOKp(sv)
-                 && SvPVX(sv) == SvPVX(prog->saved_copy)))
+                 && SvPVX(sv) == SvPVX(RXp_SAVED_COPY(prog))))
             {
                 /* just reuse saved_copy SV */
                 if (RXp_MATCH_COPIED(prog)) {
-                    Safefree(prog->subbeg);
+                    Safefree(RXp_SUBBEG(prog));
                     RXp_MATCH_COPIED_off(prog);
                 }
             }
             else {
                 /* create new COW SV to share string */
                 RXp_MATCH_COPY_FREE(prog);
-                prog->saved_copy = sv_setsv_cow(prog->saved_copy, sv);
+                RXp_SAVED_COPY(prog) = sv_setsv_cow(RXp_SAVED_COPY(prog), sv);
             }
-            prog->subbeg = (char *)SvPVX_const(prog->saved_copy);
-            assert (SvPOKp(prog->saved_copy));
-            prog->sublen  = strend - strbeg;
-            prog->suboffset = 0;
-            prog->subcoffset = 0;
+            RXp_SUBBEG(prog) = (char *)SvPVX_const(RXp_SAVED_COPY(prog));
+            assert (SvPOKp(RXp_SAVED_COPY(prog)));
+            RXp_SUBLEN(prog)  = strend - strbeg;
+            RXp_SUBOFFSET(prog) = 0;
+            RXp_SUBCOFFSET(prog) = 0;
         } else
 #endif
         {
@@ -3427,19 +3549,20 @@ S_reg_set_capture_string(pTHX_ REGEXP * const rx,
                 && !(prog->extflags & RXf_PMf_KEEPCOPY) /* //p */
                 && !(PL_sawampersand & SAWAMPERSAND_RIGHT)
             ) { /* don't copy $' part of string */
+                SSize_t offs_end;
                 U32 n = 0;
                 max = -1;
                 /* calculate the right-most part of the string covered
                  * by a capture. Due to lookahead, this may be to
                  * the right of $&, so we have to scan all captures */
-                while (n <= prog->lastparen) {
-                    if (prog->offs[n].end > max)
-                        max = prog->offs[n].end;
+                while (n <= RXp_LASTPAREN(prog)) {
+                    if ((offs_end = RXp_OFFS_END(prog,n)) > max)
+                        max = offs_end;
                     n++;
                 }
                 if (max == -1)
                     max = (PL_sawampersand & SAWAMPERSAND_LEFT)
-                            ? prog->offs[0].start
+                            ? RXp_OFFS_START(prog,0)
                             : 0;
                 assert(max >= 0 && max <= strend - strbeg);
             }
@@ -3453,18 +3576,19 @@ S_reg_set_capture_string(pTHX_ REGEXP * const rx,
                 /* calculate the left-most part of the string covered
                  * by a capture. Due to lookbehind, this may be to
                  * the left of $&, so we have to scan all captures */
-                while (min && n <= prog->lastparen) {
-                    if (   prog->offs[n].start != -1
-                        && prog->offs[n].start < min)
+                while (min && n <= RXp_LASTPAREN(prog)) {
+                    I32 start = RXp_OFFS_START(prog,n);
+                    if (   start != -1
+                        && start < min)
                     {
-                        min = prog->offs[n].start;
+                        min = start;
                     }
                     n++;
                 }
                 if ((PL_sawampersand & SAWAMPERSAND_RIGHT)
-                    && min >  prog->offs[0].end
+                    && min >  RXp_OFFS_END(prog,0)
                 )
-                    min = prog->offs[0].end;
+                    min = RXp_OFFS_END(prog,0);
 
             }
 
@@ -3472,20 +3596,20 @@ S_reg_set_capture_string(pTHX_ REGEXP * const rx,
             sublen = max - min;
 
             if (RXp_MATCH_COPIED(prog)) {
-                if (sublen > prog->sublen)
-                    prog->subbeg =
-                            (char*)saferealloc(prog->subbeg, sublen+1);
+                if (sublen > RXp_SUBLEN(prog))
+                    RXp_SUBBEG(prog) =
+                            (char*)saferealloc(RXp_SUBBEG(prog), sublen+1);
             }
             else
-                prog->subbeg = (char*)safemalloc(sublen+1);
-            Copy(strbeg + min, prog->subbeg, sublen, char);
-            prog->subbeg[sublen] = '\0';
-            prog->suboffset = min;
-            prog->sublen = sublen;
+                RXp_SUBBEG(prog) = (char*)safemalloc(sublen+1);
+            Copy(strbeg + min, RXp_SUBBEG(prog), sublen, char);
+            RXp_SUBBEG(prog)[sublen] = '\0';
+            RXp_SUBOFFSET(prog) = min;
+            RXp_SUBLEN(prog) = sublen;
             RXp_MATCH_COPIED_on(prog);
         }
-        prog->subcoffset = prog->suboffset;
-        if (prog->suboffset && utf8_target) {
+        RXp_SUBCOFFSET(prog) = RXp_SUBOFFSET(prog);
+        if (RXp_SUBOFFSET(prog) && utf8_target) {
             /* Convert byte offset to chars.
              * XXX ideally should only compute this if @-/@+
              * has been seen, a la PL_sawampersand ??? */
@@ -3501,19 +3625,19 @@ S_reg_set_capture_string(pTHX_ REGEXP * const rx,
              *   $x = "\x{100}" x 1E6; 1 while $x =~ /(.)/g;
              * from going quadratic */
             if (SvPOKp(sv) && SvPVX(sv) == strbeg)
-                prog->subcoffset = sv_pos_b2u_flags(sv, prog->subcoffset,
+                RXp_SUBCOFFSET(prog) = sv_pos_b2u_flags(sv, RXp_SUBCOFFSET(prog),
                                                 SV_GMAGIC|SV_CONST_RETURN);
             else
-                prog->subcoffset = utf8_length((U8*)strbeg,
-                                    (U8*)(strbeg+prog->suboffset));
+                RXp_SUBCOFFSET(prog) = utf8_length((U8*)strbeg,
+                                    (U8*)(strbeg+RXp_SUBOFFSET(prog)));
         }
     }
     else {
         RXp_MATCH_COPY_FREE(prog);
-        prog->subbeg = strbeg;
-        prog->suboffset = 0;
-        prog->subcoffset = 0;
-        prog->sublen = strend - strbeg;
+        RXp_SUBBEG(prog) = strbeg;
+        RXp_SUBOFFSET(prog) = 0;
+        RXp_SUBCOFFSET(prog) = 0;
+        RXp_SUBLEN(prog) = strend - strbeg;
     }
 }
 
@@ -3665,12 +3789,13 @@ Perl_regexec_flags(pTHX_ REGEXP * const rx, char *stringarg, char *strend,
 
             /* match via INTUIT shouldn't have any captures.
              * Let @-, @+, $^N know */
-            prog->lastparen = prog->lastcloseparen = 0;
+            RXp_LASTPAREN(prog) = RXp_LASTCLOSEPAREN(prog) = 0;
             RXp_MATCH_UTF8_set(prog, utf8_target);
-            prog->offs[0].start = s - strbeg;
-            prog->offs[0].end = utf8_target
+            SSize_t match_start = s - strbeg;
+            SSize_t match_end = utf8_target
                 ? (char*)utf8_hop_forward((U8*)s, prog->minlenret, (U8 *) strend) - strbeg
                 : s - strbeg + prog->minlenret;
+            CLOSE_ANY_CAPTURE(prog, 0, match_start, match_end);
             if ( !(flags & REXEC_NOT_FIRST) )
                 S_reg_set_capture_string(aTHX_ rx,
                                         strbeg, strend,
@@ -3775,16 +3900,16 @@ Perl_regexec_flags(pTHX_ REGEXP * const rx, char *stringarg, char *strend,
            to the re, and switch the buffer each match. If we fail,
            we switch it back; otherwise we leave it swapped.
         */
-        swap = prog->offs;
+        swap = RXp_OFFSp(prog);
         /* avoid leak if we die, or clean up anyway if match completes */
         SAVEFREEPV(swap);
-        Newxz(prog->offs, (prog->nparens + 1), regexp_paren_pair);
+        Newxz(RXp_OFFSp(prog), (prog->nparens + 1), regexp_paren_pair);
         DEBUG_BUFFERS_r(Perl_re_exec_indentf( aTHX_
             "rex=0x%" UVxf " saving  offs: orig=0x%" UVxf " new=0x%" UVxf "\n",
             0,
             PTR2UV(prog),
             PTR2UV(swap),
-            PTR2UV(prog->offs)
+            PTR2UV(RXp_OFFSp(prog))
         ));
     }
 
@@ -4009,7 +4134,7 @@ Perl_regexec_flags(pTHX_ REGEXP * const rx, char *stringarg, char *strend,
         if (minlen) {
             const OPCODE op = OP(progi->regstclass);
             /* don't bother with what can't match */
-            if (PL_regkind[op] != EXACT && PL_regkind[op] != TRIE)
+            if (REGNODE_TYPE(op) != EXACT && REGNODE_TYPE(op) != TRIE)
                 strend = HOPc(strend, -(minlen - 1));
         }
         DEBUG_EXECUTE_r({
@@ -4155,7 +4280,7 @@ Perl_regexec_flags(pTHX_ REGEXP * const rx, char *stringarg, char *strend,
     /* s/// doesn't like it if $& is earlier than where we asked it to
      * start searching (which can happen on something like /.\G/) */
     if (       (flags & REXEC_FAIL_ON_UNDERFLOW)
-            && (prog->offs[0].start < stringarg - strbeg))
+            && (RXp_OFFS_START(prog,0) < stringarg - strbeg))
     {
         /* this should only be possible under \G */
         assert(prog->intflags & PREGf_GPOS_SEEN);
@@ -4195,11 +4320,11 @@ Perl_regexec_flags(pTHX_ REGEXP * const rx, char *stringarg, char *strend,
             "rex=0x%" UVxf " rolling back offs: 0x%" UVxf " will be freed; restoring data to =0x%" UVxf "\n",
             0,
             PTR2UV(prog),
-            PTR2UV(prog->offs),
+            PTR2UV(RXp_OFFSp(prog)),
             PTR2UV(swap)
         ));
 
-        Copy(swap, prog->offs, prog->nparens + 1, regexp_paren_pair);
+        Copy(swap, RXp_OFFSp(prog), prog->nparens + 1, regexp_paren_pair);
     }
 
     /* clean up; this will trigger destructors that will free all slabs
@@ -4242,17 +4367,17 @@ S_regtry(pTHX_ regmatch_info *reginfo, char **startposp)
 
     reginfo->cutpoint=NULL;
 
-    prog->offs[0].start = *startposp - reginfo->strbeg;
-    prog->lastparen = 0;
-    prog->lastcloseparen = 0;
+    RXp_OFFSp(prog)[0].start = *startposp - reginfo->strbeg;
+    RXp_LASTPAREN(prog) = 0;
+    RXp_LASTCLOSEPAREN(prog) = 0;
 
     /* XXXX What this code is doing here?!!!  There should be no need
-       to do this again and again, prog->lastparen should take care of
+       to do this again and again, RXp_LASTPAREN(prog) should take care of
        this!  --ilya*/
 
     /* Tests pat.t#187 and split.t#{13,14} seem to depend on this code.
      * Actually, the code in regcppop() (which Ilya may be meaning by
-     * prog->lastparen), is not needed at all by the test suite
+     * RXp_LASTPAREN(prog)), is not needed at all by the test suite
      * (op/regexp, op/pat, op/split), but that code is needed otherwise
      * this erroneously leaves $1 defined: "1" =~ /^(?:(\d)x)?\d$/
      * Meanwhile, this code *is* needed for the
@@ -4269,9 +4394,9 @@ S_regtry(pTHX_ regmatch_info *reginfo, char **startposp)
      * places it is called, and related regcp() routines. - Yves */
 #if 1
     if (prog->nparens) {
-        regexp_paren_pair *pp = prog->offs;
+        regexp_paren_pair *pp = RXp_OFFSp(prog);
         I32 i;
-        for (i = prog->nparens; i > (I32)prog->lastparen; i--) {
+        for (i = prog->nparens; i > (I32)RXp_LASTPAREN(prog); i--) {
             ++pp;
             pp->start = -1;
             pp->end = -1;
@@ -4281,7 +4406,7 @@ S_regtry(pTHX_ regmatch_info *reginfo, char **startposp)
     REGCP_SET(lastcp);
     result = regmatch(reginfo, *startposp, progi->program + 1);
     if (result != -1) {
-        prog->offs[0].end = result;
+        RXp_OFFSp(prog)[0].end = result;
         return 1;
     }
     if (reginfo->cutpoint)
@@ -4385,14 +4510,20 @@ S_dump_exec_pos(pTHX_ const char *locinput,
 
     PERL_ARGS_ASSERT_DUMP_EXEC_POS;
 
-    while (utf8_target && UTF8_IS_CONTINUATION(*(U8*)(locinput - pref_len)))
-        pref_len++;
+    if (utf8_target) {
+        while (UTF8_IS_CONTINUATION(*(U8*)(locinput - pref_len))) {
+            pref_len++;
+        }
+    }
     pref0_len = pref_len  - (locinput - loc_reg_starttry);
     if (l + pref_len < (5 + taill) && l < loc_regeol - locinput)
         l = ( loc_regeol - locinput > (5 + taill) - pref_len
               ? (5 + taill) - pref_len : loc_regeol - locinput);
-    while (utf8_target && UTF8_IS_CONTINUATION(*(U8*)(locinput + l)))
-        l--;
+    if (utf8_target) {
+        while (UTF8_IS_CONTINUATION(*(U8*)(locinput + l))) {
+            l--;
+        }
+    }
     if (pref0_len < 0)
         pref0_len = 0;
     if (pref0_len > pref_len)
@@ -4429,7 +4560,7 @@ S_dump_exec_pos(pTHX_ const char *locinput,
 /* reg_check_named_buff_matched()
  * Checks to see if a named buffer has matched. The data array of
  * buffer numbers corresponding to the buffer is expected to reside
- * in the regexp->data->data array in the slot stored in the ARG() of
+ * in the regexp->data->data array in the slot stored in the ARG1u() of
  * node involved. Note that this routine doesn't actually care about the
  * name, that information is not preserved from compilation to execution.
  * Returns the index of the leftmost defined buffer with the given name
@@ -4440,14 +4571,14 @@ S_reg_check_named_buff_matched(const regexp *rex, const regnode *scan)
 {
     I32 n;
     RXi_GET_DECL(rex,rexi);
-    SV *sv_dat= MUTABLE_SV(rexi->data->data[ ARG( scan ) ]);
+    SV *sv_dat= MUTABLE_SV(rexi->data->data[ ARG1u( scan ) ]);
     I32 *nums=(I32*)SvPVX(sv_dat);
 
     PERL_ARGS_ASSERT_REG_CHECK_NAMED_BUFF_MATCHED;
 
     for ( n=0; n<SvIVX(sv_dat); n++ ) {
-        if ((I32)rex->lastparen >= nums[n] &&
-            rex->offs[nums[n]].end != -1)
+        if ((I32)RXp_LASTPAREN(rex) >= nums[n] &&
+            RXp_OFFS_END(rex,nums[n]) != -1)
         {
             return nums[n];
         }
@@ -4576,7 +4707,7 @@ S_setup_EXACTISH_ST(pTHX_ const regnode * const text_node,
     if (   (op == EXACTF && utf8_target)
         || (op == EXACTFL && IN_UTF8_CTYPE_LOCALE))
     {
-        if (op == EXACTFL && PL_in_utf8_turkic_locale) {
+        if (op == EXACTFL && IN_UTF8_TURKIC_LOCALE) {
             op = TURKISH;
         }
         else {
@@ -4868,7 +4999,7 @@ S_setup_EXACTISH_ST(pTHX_ const regnode * const text_node,
 
             /* Add this character to the list of possible matches */
             if (utf8_target) {
-                uvchr_to_utf8(matches[m->count], fold_from);
+                uvchr_to_utf8(matches[(U8) m->count], fold_from);
                 lengths[m->count] = UVCHR_SKIP(fold_from);
                 m->count++;
             }
@@ -5301,7 +5432,7 @@ S_isLB(pTHX_ LB_enum before,
 
             /* Here, we have the character preceding the span of spaces all set
              * up.  We follow LB18: "Break after spaces" unless the table shows
-             * that is overriden */
+             * that is overridden */
             return LB_table[prev][after] != LB_NOBREAK_EVEN_WITH_SP_BETWEEN;
 
         case LB_CM_ZWJ_foo:
@@ -5314,7 +5445,7 @@ S_isLB(pTHX_ LB_enum before,
             while (prev == LB_Combining_Mark || prev == LB_ZWJ);
 
             /* Here, 'prev' is that first earlier non-CM character.  If the CM
-             * attatches to it, then it inherits the behavior of 'prev'.  If it
+             * attaches to it, then it inherits the behavior of 'prev'.  If it
              * doesn't attach, it is to be treated as an AL */
             if (! LB_CM_ATTACHES_TO(prev)) {
                 prev = LB_Alphabetic;
@@ -5735,7 +5866,7 @@ S_backup_one_SB(pTHX_ const U8 * const strbeg, U8 ** curpos, const bool utf8_tar
         }
 
         /* Back up over Extend and Format.  curpos is always just to the right
-         * of the characater whose value we are getting */
+         * of the character whose value we are getting */
         do {
             U8 * prev_prev_char_pos;
             if ((prev_prev_char_pos = reghopmaybe3((U8 *) prev_char_pos, -1,
@@ -6035,7 +6166,7 @@ S_backup_one_WB(pTHX_ WB_enum * previous, const U8 * const strbeg, U8 ** curpos,
         }
 
         /* Back up over Extend and Format.  curpos is always just to the right
-         * of the characater whose value we are getting */
+         * of the character whose value we are getting */
         do {
             U8 * prev_prev_char_pos;
             if ((prev_prev_char_pos = reghopmaybe3((U8 *) prev_char_pos,
@@ -6081,7 +6212,7 @@ S_backup_one_WB(pTHX_ WB_enum * previous, const U8 * const strbeg, U8 ** curpos,
 #define sayNO goto no
 #define sayNO_SILENT goto no_silent
 
-/* we dont use STMT_START/END here because it leads to
+/* we don't use STMT_START/END here because it leads to
    "unreachable code" warnings, which are bogus, but distracting. */
 #define CACHEsayNO \
     if (ST.cache_mask) \
@@ -6136,7 +6267,7 @@ S_backup_one_WB(pTHX_ WB_enum * previous, const U8 * const strbeg, U8 ** curpos,
         Perl_re_printf( aTHX_                               \
             "%*s" pp " %s%s%s%s%s\n",                       \
             INDENT_CHARS(depth), "",                        \
-            PL_reg_name[st->resume_state],                  \
+            REGNODE_NAME(st->resume_state),                  \
             ((st==yes_state||st==mark_state) ? "[" : ""),   \
             ((st==yes_state) ? "Y" : ""),                   \
             ((st==mark_state) ? "M" : ""),                  \
@@ -6358,13 +6489,15 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
     CV *last_pushed_cv = NULL; /* most recently called (?{}) CV */
     U32 maxopenparen = 0;       /* max '(' index seen so far */
     int to_complement;  /* Invert the result? */
-    _char_class_number classnum;
+    char_class_number_ classnum;
     bool is_utf8_pat = reginfo->is_utf8_pat;
     bool match = FALSE;
     I32 orig_savestack_ix = PL_savestack_ix;
     U8 * script_run_begin = NULL;
     char *match_end= NULL; /* where a match MUST end to be considered successful */
     bool is_accepted = FALSE; /* have we hit an ACCEPT opcode? */
+    re_fold_t folder = NULL;  /* used by various EXACTish regops */
+    const U8 * fold_array = NULL; /* used by various EXACTish regops */
 
 /* Solaris Studio 12.3 messes up fetching PL_charclass['\n'] */
 #if (defined(__SUNPRO_C) && (__SUNPRO_C == 0x5120) && defined(__x86_64) && defined(USE_64_BIT_ALL))
@@ -6416,7 +6549,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
                     INDENT_CHARS(depth), "",
                     (IV)(scan - rexi->program),
                     SvPVX_const(prop),
-                    (PL_regkind[OP(scan)] == END || !rnext) ?
+                    (REGNODE_TYPE(OP(scan)) == END || !rnext) ?
                         0 : (IV)(rnext - rexi->program));
             }
         );
@@ -6427,6 +6560,8 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
         assert(nextbyte < 256 && (nextbyte >= 0 || nextbyte == NEXTCHR_EOS));
 
         switch (state_num) {
+            SV * anyofh_list;
+
         case SBOL: /*  /^../ and /\A../  */
             if (locinput == reginfo->strbeg)
                 break;
@@ -6447,15 +6582,15 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
 
         case KEEPS: /*   \K  */
             /* update the startpoint */
-            st->u.keeper.val = rex->offs[0].start;
-            rex->offs[0].start = locinput - reginfo->strbeg;
+            st->u.keeper.val = RXp_OFFS_START(rex,0);
+            RXp_OFFSp(rex)[0].start = locinput - reginfo->strbeg;
             PUSH_STATE_GOTO(KEEPS_next, next, locinput, loceol,
                             script_run_begin);
             NOT_REACHED; /* NOTREACHED */
 
         case KEEPS_next_fail:
             /* rollback the start point change */
-            rex->offs[0].start = st->u.keeper.val;
+            RXp_OFFSp(rex)[0].start = st->u.keeper.val;
             sayNO_SILENT;
             NOT_REACHED; /* NOTREACHED */
 
@@ -6560,16 +6695,21 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
 
                 /* what trie are we using right now */
                 reg_trie_data * const trie
-                    = (reg_trie_data*)rexi->data->data[ ARG( scan ) ];
-                HV * widecharmap = MUTABLE_HV(rexi->data->data[ ARG( scan ) + 1 ]);
+                    = (reg_trie_data*)rexi->data->data[ ARG1u( scan ) ];
+                ST.before_paren = trie->before_paren;
+                ST.after_paren = trie->after_paren;
+                assert(ST.before_paren<=rex->nparens);
+                assert(ST.after_paren<=rex->nparens);
+
+                HV * widecharmap = MUTABLE_HV(rexi->data->data[ ARG1u( scan ) + 1 ]);
                 U32 state = trie->startstate;
 
-                if (scan->flags == EXACTL || scan->flags == EXACTFLU8) {
-                    _CHECK_AND_WARN_PROBLEMATIC_LOCALE;
+                if (FLAGS(scan) == EXACTL || FLAGS(scan) == EXACTFLU8) {
+                    CHECK_AND_WARN_PROBLEMATIC_LOCALE_;
                     if (utf8_target
                         && ! NEXTCHR_IS_EOS
                         && UTF8_IS_ABOVE_LATIN1(nextbyte)
-                        && scan->flags == EXACTL)
+                        && FLAGS(scan) == EXACTL)
                     {
                         /* We only output for EXACTL, as we let the folder
                          * output this message for EXACTFLU8 to avoid
@@ -6610,6 +6750,8 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
                 U32 accepted = 0; /* have we seen any accepting states? */
 
                 ST.jump = trie->jump;
+                ST.j_before_paren = trie->j_before_paren;
+                ST.j_after_paren= trie->j_after_paren;
                 ST.me = scan;
                 ST.firstpos = NULL;
                 ST.longfold = FALSE; /* char longer if folded => it's harder */
@@ -6713,6 +6855,10 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
         case TRIE_next_fail: /* we failed - try next alternative */
         {
             U8 *uc;
+            if (RE_PESSIMISTIC_PARENS) {
+                REGCP_UNWIND(ST.lastcp);
+                regcppop(rex,&maxopenparen);
+            }
             if ( ST.jump ) {
                 /* undo any captures done in the tail part of a branch,
                  * e.g.
@@ -6721,6 +6867,10 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
                  * rest of the branch */
                 REGCP_UNWIND(ST.cp);
                 UNWIND_PAREN(ST.lastparen, ST.lastcloseparen);
+                if (ST.after_paren) {
+                    assert(ST.before_paren<=rex->nparens && ST.after_paren<=rex->nparens);
+                    CAPTURE_CLEAR(ST.before_paren+1, ST.after_paren, "TRIE_next_fail");
+                }
             }
             if (!--ST.accepted) {
                 DEBUG_EXECUTE_r({
@@ -6738,7 +6888,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
                 U16 word;
                 U16 const nextword = ST.nextword;
                 reg_trie_wordinfo * const wordinfo
-                    = ((reg_trie_data*)rexi->data->data[ARG(ST.me)])->wordinfo;
+                    = ((reg_trie_data*)rexi->data->data[ARG1u(ST.me)])->wordinfo;
                 for (word=ST.topword; word; word=wordinfo[word].prev) {
                     if (word > nextword && (!min || word < min))
                         min = word;
@@ -6753,8 +6903,8 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
             }
 
             if ( ST.jump ) {
-                ST.lastparen = rex->lastparen;
-                ST.lastcloseparen = rex->lastcloseparen;
+                ST.lastparen = RXp_LASTPAREN(rex);
+                ST.lastcloseparen = RXp_LASTCLOSEPAREN(rex);
                 REGCP_SET(ST.cp);
             }
 
@@ -6762,7 +6912,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
             {
                 U32 chars; /* how many chars to skip */
                 reg_trie_data * const trie
-                    = (reg_trie_data*)rexi->data->data[ARG(ST.me)];
+                    = (reg_trie_data*)rexi->data->data[ARG1u(ST.me)];
 
                 assert((trie->wordinfo[ST.nextword].len - trie->prefixlen)
                             >=  ST.firstchars);
@@ -6810,10 +6960,16 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
                         uc += chars;
                 }
             }
+            if (ST.jump && ST.jump[ST.nextword]) {
+                scan = ST.me + ST.jump[ST.nextword];
+                ST.before_paren = ST.j_before_paren[ST.nextword];
+                assert(ST.before_paren <= rex->nparens);
+                ST.after_paren = ST.j_after_paren[ST.nextword];
+                assert(ST.after_paren <= rex->nparens);
+            } else {
+                scan = ST.me + NEXT_OFF(ST.me);
+            }
 
-            scan = ST.me + ((ST.jump && ST.jump[ST.nextword])
-                            ? ST.jump[ST.nextword]
-                            : NEXT_OFF(ST.me));
 
             DEBUG_EXECUTE_r({
                 Perl_re_exec_indentf( aTHX_  "%sTRIE matched word #%d, continuing%s\n",
@@ -6825,6 +6981,10 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
             });
 
             if ( ST.accepted > 1 || has_cutgroup || ST.jump ) {
+                if (RE_PESSIMISTIC_PARENS) {
+                    (void)regcppush(rex, 0, maxopenparen);
+                    REGCP_SET(ST.lastcp);
+                }
                 PUSH_STATE_GOTO(TRIE_next, scan, (char*)uc, loceol,
                                 script_run_begin);
                 NOT_REACHED; /* NOTREACHED */
@@ -6832,7 +6992,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
             /* only one choice left - just continue */
             DEBUG_EXECUTE_r({
                 AV *const trie_words
-                    = MUTABLE_AV(rexi->data->data[ARG(ST.me)+TRIE_WORDS_OFFSET]);
+                    = MUTABLE_AV(rexi->data->data[ARG1u(ST.me)+TRIE_WORDS_OFFSET]);
                 SV ** const tmp = trie_words
                         ? av_fetch(trie_words, ST.nextword - 1, 0) : NULL;
                 SV *sv= tmp ? sv_newmortal() : NULL;
@@ -6869,11 +7029,11 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
             goto join_short_long_exact;
 
         case EXACTL:             /*  /abc/l       */
-            _CHECK_AND_WARN_PROBLEMATIC_LOCALE;
+            CHECK_AND_WARN_PROBLEMATIC_LOCALE_;
 
             /* Complete checking would involve going through every character
              * matched by the string to see if any is above latin1.  But the
-             * comparision otherwise might very well be a fast assembly
+             * comparison otherwise might very well be a fast assembly
              * language routine, and I (khw) don't think slowing things down
              * just to check for this warning is worth it.  So this just checks
              * the first character */
@@ -6972,13 +7132,11 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
 
         case EXACTFL:            /*  /abc/il      */
           {
-            re_fold_t folder;
-            const U8 * fold_array;
             const char * s;
             U32 fold_utf8_flags;
 
-            _CHECK_AND_WARN_PROBLEMATIC_LOCALE;
-            folder = foldEQ_locale;
+            CHECK_AND_WARN_PROBLEMATIC_LOCALE_;
+            folder = Perl_foldEQ_locale;
             fold_array = PL_fold_locale;
             fold_utf8_flags = FOLDEQ_LOCALE;
             goto do_exactf;
@@ -6991,7 +7149,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
             }
             fold_utf8_flags =  FOLDEQ_LOCALE | FOLDEQ_S2_ALREADY_FOLDED
                                              | FOLDEQ_S2_FOLDS_SANE;
-            folder = foldEQ_latin1_s2_folded;
+            folder = S_foldEQ_latin1_s2_folded;
             fold_array = PL_fold_latin1;
             goto do_exactf;
 
@@ -7001,18 +7159,24 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
             }
             assert(is_utf8_pat);
             fold_utf8_flags = FOLDEQ_S2_ALREADY_FOLDED;
+#ifdef DEBUGGING
+            /* this is only used in an assert check, so we restrict it to DEBUGGING mode.
+             * In theory neither of these variables should be used in this mode. */
+            folder = NULL;
+            fold_array = NULL;
+#endif
             goto do_exactf;
 
         case EXACTFUP:          /*  /foo/iu, and something is problematic in
                                     'foo' so can't take shortcuts. */
             assert(! is_utf8_pat);
-            folder = foldEQ_latin1;
+            folder = Perl_foldEQ_latin1;
             fold_array = PL_fold_latin1;
             fold_utf8_flags = 0;
             goto do_exactf;
 
         case EXACTFU:            /*  /abc/iu      */
-            folder = foldEQ_latin1_s2_folded;
+            folder = S_foldEQ_latin1_s2_folded;
             fold_array = PL_fold_latin1;
             fold_utf8_flags = FOLDEQ_S2_ALREADY_FOLDED;
             goto do_exactf;
@@ -7022,7 +7186,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
             assert(! is_utf8_pat);
             /* FALLTHROUGH */
         case EXACTFAA:            /*  /abc/iaa     */
-            folder = foldEQ_latin1_s2_folded;
+            folder = S_foldEQ_latin1_s2_folded;
             fold_array = PL_fold_latin1;
             fold_utf8_flags = FOLDEQ_UTF8_NOMIX_ASCII;
             if (is_utf8_pat || ! utf8_target) {
@@ -7039,7 +7203,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
         case EXACTF:             /*  /abc/i    This node only generated for
                                                non-utf8 patterns */
             assert(! is_utf8_pat);
-            folder = foldEQ;
+            folder = Perl_foldEQ;
             fold_array = PL_fold;
             fold_utf8_flags = 0;
 
@@ -7067,6 +7231,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
             }
 
             /* Neither the target nor the pattern are utf8 */
+            assert(fold_array);
             if (UCHARAT(s) != nextbyte
                 && !NEXTCHR_IS_EOS
                 && UCHARAT(s) != fold_array[nextbyte])
@@ -7075,7 +7240,8 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
             }
             if (loceol - locinput < ln)
                 sayNO;
-            if (ln > 1 && ! folder(locinput, s, ln))
+            assert(folder);
+            if (ln > 1 && ! folder(aTHX_ locinput, s, ln))
                 sayNO;
             locinput += ln;
             break;
@@ -7088,7 +7254,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
         case BOUNDL:  /*  /\b/l  */
         {
             bool b1, b2;
-            _CHECK_AND_WARN_PROBLEMATIC_LOCALE;
+            CHECK_AND_WARN_PROBLEMATIC_LOCALE_;
 
             if (FLAGS(scan) != TRADITIONAL_BOUND) {
                 CHECK_AND_WARN_NON_UTF8_CTYPE_LOCALE_IN_BOUND;
@@ -7359,7 +7525,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
 
         case ANYOFPOSIXL:
         case ANYOFL:  /*  /[abc]/l      */
-            _CHECK_AND_WARN_PROBLEMATIC_LOCALE;
+            CHECK_AND_WARN_PROBLEMATIC_LOCALE_;
             CHECK_AND_WARN_NON_UTF8_CTYPE_LOCALE_IN_SETS(scan);
 
             /* FALLTHROUGH */
@@ -7368,7 +7534,8 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
             if (NEXTCHR_IS_EOS || locinput >= loceol)
                 sayNO;
             if (  (! utf8_target || UTF8_IS_INVARIANT(*locinput))
-                && ! (ANYOF_FLAGS(scan) & ~ ANYOF_MATCHES_ALL_ABOVE_BITMAP))
+                && ! ANYOF_FLAGS(scan)
+                && ANYOF_MATCHES_NONE_OUTSIDE_BITMAP(scan))
             {
                 if (! ANYOF_BITMAP_TEST(scan, * (U8 *) (locinput))) {
                     sayNO;
@@ -7387,7 +7554,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
 
         case ANYOFM:
             if (   NEXTCHR_IS_EOS
-                || (UCHARAT(locinput) & FLAGS(scan)) != ARG(scan)
+                || (UCHARAT(locinput) & FLAGS(scan)) != ARG1u(scan)
                 || locinput >= loceol)
             {
                 sayNO;
@@ -7397,7 +7564,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
 
         case NANYOFM:
             if (   NEXTCHR_IS_EOS
-                || (UCHARAT(locinput) & FLAGS(scan)) == ARG(scan)
+                || (UCHARAT(locinput) & FLAGS(scan)) == ARG1u(scan)
                 || locinput >= loceol)
             {
                 sayNO;
@@ -7409,8 +7576,11 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
             if (   ! utf8_target
                 ||   NEXTCHR_IS_EOS
                 ||   ANYOF_FLAGS(scan) > NATIVE_UTF8_TO_I8(*locinput)
-                || ! reginclass(rex, scan, (U8*)locinput, (U8*) loceol,
-                                                                   utf8_target))
+                || ! (anyofh_list = GET_ANYOFH_INVLIST(rex, scan))
+                || ! _invlist_contains_cp(anyofh_list,
+                                          utf8_to_uvchr_buf((U8 *) locinput,
+                                                            (U8 *) loceol,
+                                                            NULL)))
             {
                 sayNO;
             }
@@ -7421,8 +7591,24 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
             if (   ! utf8_target
                 ||   NEXTCHR_IS_EOS
                 ||   ANYOF_FLAGS(scan) != (U8) *locinput
-                || ! reginclass(rex, scan, (U8*)locinput, (U8*) loceol,
-                                                                  utf8_target))
+                || ! (anyofh_list = GET_ANYOFH_INVLIST(rex, scan))
+                || ! _invlist_contains_cp(anyofh_list,
+                                          utf8_to_uvchr_buf((U8 *) locinput,
+                                                            (U8 *) loceol,
+                                                            NULL)))
+            {
+                sayNO;
+            }
+            goto increment_locinput;
+            break;
+
+        case ANYOFHbbm:
+            if (   ! utf8_target
+                ||   NEXTCHR_IS_EOS
+                ||   ANYOF_FLAGS(scan) != (U8) locinput[0]
+                ||   locinput >= reginfo->strend
+                || ! BITMAP_TEST(( (struct regnode_bbm *) scan)->bitmap,
+                                   (U8) locinput[1] & UTF_CONTINUATION_MASK))
             {
                 sayNO;
             }
@@ -7435,8 +7621,11 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
                 || ! 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))
+                || ! (anyofh_list = GET_ANYOFH_INVLIST(rex, scan))
+                || ! _invlist_contains_cp(anyofh_list,
+                                          utf8_to_uvchr_buf((U8 *) locinput,
+                                                            (U8 *) loceol,
+                                                            NULL)))
             {
                 sayNO;
             }
@@ -7448,8 +7637,11 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
                 ||   NEXTCHR_IS_EOS
                 ||   loceol - locinput < FLAGS(scan)
                 ||   memNE(locinput, ((struct regnode_anyofhs *) scan)->string, FLAGS(scan))
-                || ! reginclass(rex, scan, (U8*)locinput, (U8*) loceol,
-                                                                   utf8_target))
+                || ! (anyofh_list = GET_ANYOFH_INVLIST(rex, scan))
+                || ! _invlist_contains_cp(anyofh_list,
+                                          utf8_to_uvchr_buf((U8 *) locinput,
+                                                            (U8 *) loceol,
+                                                            NULL)))
             {
                 sayNO;
             }
@@ -7514,7 +7706,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
             /* FALLTHROUGH */
 
         case POSIXL:    /* \w or [:punct:] etc. under /l */
-            _CHECK_AND_WARN_PROBLEMATIC_LOCALE;
+            CHECK_AND_WARN_PROBLEMATIC_LOCALE_;
             if (NEXTCHR_IS_EOS || locinput >= loceol)
                 sayNO;
 
@@ -7585,7 +7777,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
 
           join_nposixa:
 
-            if (! (to_complement ^ cBOOL(_generic_isCC_A(nextbyte,
+            if (! (to_complement ^ cBOOL(generic_isCC_A_(nextbyte,
                                                                 FLAGS(scan)))))
             {
                 sayNO;
@@ -7606,11 +7798,11 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
                 sayNO;
             }
 
-            /* Use _generic_isCC() for characters within Latin1.  (Note that
+            /* Use generic_isCC_() for characters within Latin1.  (Note that
              * UTF8_IS_INVARIANT works even on non-UTF-8 strings, or else
              * wouldn't be invariant) */
             if (UTF8_IS_INVARIANT(nextbyte) || ! utf8_target) {
-                if (! (to_complement ^ cBOOL(_generic_isCC(nextbyte,
+                if (! (to_complement ^ cBOOL(generic_isCC_(nextbyte,
                                                            FLAGS(scan)))))
                 {
                     sayNO;
@@ -7619,7 +7811,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
             }
             else if (UTF8_IS_NEXT_CHAR_DOWNGRADEABLE(locinput, reginfo->strend)) {
                 if (! (to_complement
-                       ^ cBOOL(_generic_isCC(EIGHT_BIT_UTF8_TO_NATIVE(nextbyte,
+                       ^ cBOOL(generic_isCC_(EIGHT_BIT_UTF8_TO_NATIVE(nextbyte,
                                                                *(locinput + 1)),
                                              FLAGS(scan)))))
                 {
@@ -7629,7 +7821,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
             }
             else {  /* Handle above Latin-1 code points */
               utf8_posix_above_latin1:
-                classnum = (_char_class_number) FLAGS(scan);
+                classnum = (char_class_number_) FLAGS(scan);
                 switch (classnum) {
                     default:
                         if (! (to_complement
@@ -7642,36 +7834,36 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
                             sayNO;
                         }
                         break;
-                    case _CC_ENUM_SPACE:
+                    case CC_ENUM_SPACE_:
                         if (! (to_complement
                                     ^ cBOOL(is_XPERLSPACE_high(locinput))))
                         {
                             sayNO;
                         }
                         break;
-                    case _CC_ENUM_BLANK:
+                    case CC_ENUM_BLANK_:
                         if (! (to_complement
                                         ^ cBOOL(is_HORIZWS_high(locinput))))
                         {
                             sayNO;
                         }
                         break;
-                    case _CC_ENUM_XDIGIT:
+                    case CC_ENUM_XDIGIT_:
                         if (! (to_complement
                                         ^ cBOOL(is_XDIGIT_high(locinput))))
                         {
                             sayNO;
                         }
                         break;
-                    case _CC_ENUM_VERTSPACE:
+                    case CC_ENUM_VERTSPACE_:
                         if (! (to_complement
                                         ^ cBOOL(is_VERTWS_high(locinput))))
                         {
                             sayNO;
                         }
                         break;
-                    case _CC_ENUM_CNTRL:    /* These can't match above Latin1 */
-                    case _CC_ENUM_ASCII:
+                    case CC_ENUM_CNTRL_:    /* These can't match above Latin1 */
+                    case CC_ENUM_ASCII_:
                         if (! to_complement) {
                             sayNO;
                         }
@@ -7740,29 +7932,29 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
             const U8 *fold_array;
             UV utf8_fold_flags;
 
-            _CHECK_AND_WARN_PROBLEMATIC_LOCALE;
-            folder = foldEQ_locale;
+            CHECK_AND_WARN_PROBLEMATIC_LOCALE_;
+            folder = Perl_foldEQ_locale;
             fold_array = PL_fold_locale;
             type = REFFL;
             utf8_fold_flags = FOLDEQ_LOCALE;
             goto do_nref;
 
         case REFFAN:  /*  /\g{name}/iaa  */
-            folder = foldEQ_latin1;
+            folder = Perl_foldEQ_latin1;
             fold_array = PL_fold_latin1;
             type = REFFA;
             utf8_fold_flags = FOLDEQ_UTF8_NOMIX_ASCII;
             goto do_nref;
 
         case REFFUN:  /*  /\g{name}/iu  */
-            folder = foldEQ_latin1;
+            folder = Perl_foldEQ_latin1;
             fold_array = PL_fold_latin1;
             type = REFFU;
             utf8_fold_flags = 0;
             goto do_nref;
 
         case REFFN:  /*  /\g{name}/i  */
-            folder = foldEQ;
+            folder = Perl_foldEQ;
             fold_array = PL_fold;
             type = REFF;
             utf8_fold_flags = 0;
@@ -7785,30 +7977,32 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
             goto do_nref_ref_common;
 
         case REFFL:  /*  /\1/il  */
-            _CHECK_AND_WARN_PROBLEMATIC_LOCALE;
-            folder = foldEQ_locale;
+            CHECK_AND_WARN_PROBLEMATIC_LOCALE_;
+            folder = Perl_foldEQ_locale;
             fold_array = PL_fold_locale;
             utf8_fold_flags = FOLDEQ_LOCALE;
             goto do_ref;
 
         case REFFA:  /*  /\1/iaa  */
-            folder = foldEQ_latin1;
+            folder = Perl_foldEQ_latin1;
             fold_array = PL_fold_latin1;
             utf8_fold_flags = FOLDEQ_UTF8_NOMIX_ASCII;
             goto do_ref;
 
         case REFFU:  /*  /\1/iu  */
-            folder = foldEQ_latin1;
+            folder = Perl_foldEQ_latin1;
             fold_array = PL_fold_latin1;
             utf8_fold_flags = 0;
             goto do_ref;
 
         case REFF:  /*  /\1/i  */
-            folder = foldEQ;
+            folder = Perl_foldEQ;
             fold_array = PL_fold;
             utf8_fold_flags = 0;
             goto do_ref;
 
+#undef  ST
+#define ST st->u.backref
         case REF:  /*  /\1/    */
             folder = NULL;
             fold_array = NULL;
@@ -7816,16 +8010,37 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
 
           do_ref:
             type = OP(scan);
-            n = ARG(scan);  /* which paren pair */
+            n = ARG1u(scan);  /* which paren pair */
+            if (rex->logical_to_parno) {
+                n = rex->logical_to_parno[n];
+                do {
+                    if ( RXp_LASTPAREN(rex) < n ||
+                         RXp_OFFS_START(rex,n) == -1 ||
+                         RXp_OFFS_END(rex,n) == -1
+                    ) {
+                        n = rex->parno_to_logical_next[n];
+                    }
+                    else {
+                        break;
+                    }
+                } while(n);
+                
+                if (!n) /* this means there is nothing that matched */
+                    sayNO;
+            }
 
           do_nref_ref_common:
-            ln = rex->offs[n].start;
-            endref = rex->offs[n].end;
             reginfo->poscache_iter = reginfo->poscache_maxiter; /* Void cache */
-            if (rex->lastparen < n || ln == -1 || endref == -1)
+            if (RXp_LASTPAREN(rex) < n)
+                sayNO;
+
+            ln = RXp_OFFSp(rex)[n].start;
+            endref = RXp_OFFSp(rex)[n].end;
+            if (ln == -1 || endref == -1)
                 sayNO;                 /* Do not match unless seen CLOSEn. */
+
             if (ln == endref)
-                break;
+                goto ref_yes;
 
             s = reginfo->strbeg + ln;
             if (type != REF    /* REF can do byte comparison */
@@ -7844,7 +8059,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
                     sayNO;
                 }
                 locinput = limit;
-                break;
+                goto ref_yes;
             }
 
             /* Not utf8:  Inline the first character, for speed. */
@@ -7861,11 +8076,29 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
                 sayNO;
             if (ln > 1 && (type == REF
                            ? memNE(s, locinput, ln)
-                           : ! folder(locinput, s, ln)))
+                           : ! folder(aTHX_ locinput, s, ln)))
                 sayNO;
             locinput += ln;
-            break;
         }
+        ref_yes:
+            if (FLAGS(scan)) { /* == VOLATILE_REF but only other value is 0 */
+                ST.cp = regcppush(rex, ARG2u(scan) - 1, maxopenparen);
+                REGCP_SET(ST.lastcp);
+                PUSH_STATE_GOTO(REF_next, next, locinput, loceol,
+                                script_run_begin);
+            }
+            break;
+            NOT_REACHED; /* NOTREACHED */
+
+        case REF_next:
+            sayYES;
+            break;
+
+        case REF_next_fail:
+            REGCP_UNWIND(ST.lastcp);
+            regcppop(rex, &maxopenparen);
+            sayNO;
+            break;
 
         case NOTHING: /* null op; e.g. the 'nothing' following
                        * the '*' in m{(a+|b)*}' */
@@ -7886,7 +8119,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
             U32 arg;
 
         case GOSUB: /*    /(...(?1))/   /(...(?&foo))/   */
-            arg= (U32)ARG(scan);
+            arg = ARG1u(scan);
             if (cur_eval && cur_eval->locinput == locinput) {
                 if ( ++nochange_depth > max_nochange_depth )
                     Perl_croak(aTHX_
@@ -7898,7 +8131,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
             re_sv = rex_sv;
             re = rex;
             rei = rexi;
-            startpoint = scan + ARG2L(scan);
+            startpoint = scan + ARG2i(scan);
             EVAL_CLOSE_PAREN_SET( st, arg );
             /* Detect infinite recursion
              *
@@ -7953,13 +8186,13 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
                 CV *newcv;
 
                 /* save *all* paren positions */
-                regcppush(rex, 0, maxopenparen);
+                ST.cp = regcppush(rex, 0, maxopenparen);
                 REGCP_SET(ST.lastcp);
 
                 if (!caller_cv)
                     caller_cv = find_runcv(NULL);
 
-                n = ARG(scan);
+                n = ARG1u(scan);
 
                 if (rexi->data->what[n] == 'r') { /* code from an external qr */
                     newcv = (ReANY(
@@ -8084,7 +8317,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
                 DEBUG_STATE_r( Perl_re_printf( aTHX_
                     "  re EVAL PL_op=0x%" UVxf "\n", PTR2UV(nop)) );
 
-                rex->offs[0].end = locinput - reginfo->strbeg;
+                RXp_OFFSp(rex)[0].end = locinput - reginfo->strbeg;
                 if (reginfo->info_aux_eval->pos_magic)
                     MgBYTEPOS_set(reginfo->info_aux_eval->pos_magic,
                                   reginfo->sv, reginfo->strbeg,
@@ -8118,7 +8351,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
                 PL_op = NULL;
 
                 re_sv = NULL;
-                if (logical == 0) {       /*   (?{})/   */
+                if (logical == 0) {       /* /(?{ ... })/ and /(*{ ... })/ */
                     SV *replsv = save_scalar(PL_replgv);
                     sv_setsv(replsv, ret); /* $^R */
                     SvSETMAGIC(replsv);
@@ -8127,7 +8360,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
                     sw = cBOOL(SvTRUE_NN(ret));
                     logical = 0;
                 }
-                else {                   /*  /(??{})  */
+                else {                   /*  /(??{ ... })  */
                     /*  if its overloaded, let the regex compiler handle
                      *  it; otherwise extract regex, or stringify  */
                     if (SvGMAGICAL(ret))
@@ -8170,7 +8403,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
                 }
             }
 
-                /* only /(??{})/  from now on */
+                /* only /(??{ ... })/  from now on */
                 logical = 0;
                 {
                     /* extract RE object from returned value; compiling if
@@ -8195,11 +8428,11 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
                         /* if we got here, it should be an engine which
                          * supports compiling code blocks and stuff */
                         assert(rex->engine && rex->engine->op_comp);
-                        assert(!(scan->flags & ~RXf_PMf_COMPILETIME));
+                        assert(!(FLAGS(scan) & ~RXf_PMf_COMPILETIME));
                         re_sv = rex->engine->op_comp(aTHX_ &ret, 1, NULL,
                                     rex->engine, NULL, NULL,
                                     /* copy /msixn etc to inner pattern */
-                                    ARG2L(scan),
+                                    ARG2i(scan),
                                     pm_flags);
 
                         if (!(SvFLAGS(ret)
@@ -8215,12 +8448,12 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
                     re = ReANY(re_sv);
                 }
                 RXp_MATCH_COPIED_off(re);
-                re->subbeg = rex->subbeg;
-                re->sublen = rex->sublen;
-                re->suboffset = rex->suboffset;
-                re->subcoffset = rex->subcoffset;
-                re->lastparen = 0;
-                re->lastcloseparen = 0;
+                RXp_SUBBEG(re) = RXp_SUBBEG(rex);
+                RXp_SUBLEN(re) = RXp_SUBLEN(rex);
+                RXp_SUBOFFSET(re) = RXp_SUBOFFSET(rex);
+                RXp_SUBCOFFSET(re) = RXp_SUBCOFFSET(rex);
+                RXp_LASTPAREN(re) = 0;
+                RXp_LASTCLOSEPAREN(re) = 0;
                 rei = RXi_GET(re);
                 DEBUG_EXECUTE_r(
                     debug_start_match(re_sv, utf8_target, locinput,
@@ -8230,9 +8463,11 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
                 EVAL_CLOSE_PAREN_CLEAR(st); /* ST.close_paren = 0;
                                              * close_paren only for GOSUB */
                 ST.prev_recurse_locinput= NULL; /* only used for GOSUB */
-                /* Save all the seen positions so far. */
+
+                /* note we saved the paren state earlier:
                 ST.cp = regcppush(rex, 0, maxopenparen);
                 REGCP_SET(ST.lastcp);
+                */
                 /* and set maxopenparen to 0, since we are starting a "fresh" match */
                 maxopenparen = 0;
                 /* run the pattern returned from (??{...}) */
@@ -8322,6 +8557,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
 
         case EVAL_B_fail: /* unsuccessful B in (?{...})B */
             REGCP_UNWIND(ST.lastcp);
+            regcppop(rex, &maxopenparen);
             sayNO;
 
         case EVAL_postponed_AB_fail: /* unsuccessfully ran A or B in (??{A})B */
@@ -8354,17 +8590,17 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
 #undef ST
 
         case OPEN: /*  (  */
-            n = ARG(scan);  /* which paren pair */
-            rex->offs[n].start_tmp = locinput - reginfo->strbeg;
+            n = PARNO(scan);  /* which paren pair */
+            RXp_OFFSp(rex)[n].start_tmp = locinput - reginfo->strbeg;
             if (n > maxopenparen)
                 maxopenparen = n;
             DEBUG_BUFFERS_r(Perl_re_exec_indentf( aTHX_
                 "OPEN: rex=0x%" UVxf " offs=0x%" UVxf ": \\%" UVuf ": set %" IVdf " tmp; maxopenparen=%" UVuf "\n",
                 depth,
                 PTR2UV(rex),
-                PTR2UV(rex->offs),
+                PTR2UV(RXp_OFFSp(rex)),
                 (UV)n,
-                (IV)rex->offs[n].start_tmp,
+                (IV)RXp_OFFSp(rex)[n].start_tmp,
                 (UV)maxopenparen
             ));
             lastopen = n;
@@ -8376,8 +8612,8 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
 
 
         case CLOSE:  /*  )  */
-            n = ARG(scan);  /* which paren pair */
-            CLOSE_CAPTURE(n, rex->offs[n].start_tmp,
+            n = PARNO(scan);  /* which paren pair */
+            CLOSE_CAPTURE(rex, n, RXp_OFFSp(rex)[n].start_tmp,
                              locinput - reginfo->strbeg);
             if ( EVAL_CLOSE_PAREN_IS( cur_eval, n ) )
                 goto fake_end;
@@ -8396,28 +8632,31 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
 
         case ACCEPT:  /*  (*ACCEPT)  */
             is_accepted = true;
-            if (scan->flags)
-                sv_yes_mark = MUTABLE_SV(rexi->data->data[ ARG( scan ) ]);
-            utmp = (U32)ARG2L(scan);
+            if (FLAGS(scan))
+                sv_yes_mark = MUTABLE_SV(rexi->data->data[ ARG1u( scan ) ]);
+            utmp = ARG2u(scan);
 
             if ( utmp ) {
                 regnode *cursor;
                 for (
                     cursor = scan;
                     cursor && ( OP(cursor) != END );
-                    cursor = ( PL_regkind[ OP(cursor) ] == END )
-                             ? NEXTOPER(cursor)
+                    cursor = (
+                               REGNODE_TYPE( OP(cursor) ) == END
+                               || REGNODE_TYPE( OP(cursor) ) == WHILEM
+                             )
+                             ? REGNODE_AFTER(cursor)
                              : regnext(cursor)
                 ){
                     if ( OP(cursor) != CLOSE )
                         continue;
 
-                    n = ARG(cursor);
+                    n = PARNO(cursor);
 
                     if ( n > lastopen ) /* might be OPEN/CLOSE in the way */
                         continue;       /* so skip this one */
 
-                    CLOSE_CAPTURE(n, rex->offs[n].start_tmp,
+                    CLOSE_CAPTURE(rex, n, RXp_OFFSp(rex)[n].start_tmp,
                                      locinput - reginfo->strbeg);
 
                     if ( n == utmp || EVAL_CLOSE_PAREN_IS(cur_eval, n) )
@@ -8428,8 +8667,8 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
             /* NOTREACHED */
 
         case GROUPP:  /*  (?(1))  */
-            n = ARG(scan);  /* which paren pair */
-            sw = cBOOL(rex->lastparen >= n && rex->offs[n].end != -1);
+            n = ARG1u(scan);  /* which paren pair */
+            sw = cBOOL(RXp_LASTPAREN(rex) >= n && RXp_OFFS_END(rex,n) != -1);
             break;
 
         case GROUPPN:  /*  (?(<name>))  */
@@ -8438,7 +8677,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
             break;
 
         case INSUBP:   /*  (?(R))  */
-            n = ARG(scan);
+            n = ARG1u(scan);
             /* this does not need to use EVAL_CLOSE_PAREN macros, as the arg
              * of SCAN is already set up as matches a eval.close_paren */
             sw = cur_eval && (n == 0 || CUR_EVAL.close_paren == n);
@@ -8451,16 +8690,16 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
         case IFTHEN:   /*  (?(cond)A|B)  */
             reginfo->poscache_iter = reginfo->poscache_maxiter; /* Void cache */
             if (sw)
-                next = NEXTOPER(NEXTOPER(scan));
+                next = REGNODE_AFTER_type(scan,tregnode_IFTHEN);
             else {
-                next = scan + ARG(scan);
+                next = scan + ARG1u(scan);
                 if (OP(next) == IFTHEN) /* Fake one. */
-                    next = NEXTOPER(NEXTOPER(next));
+                    next = REGNODE_AFTER_type(next,tregnode_IFTHEN);
             }
             break;
 
         case LOGICAL:  /* modifier for EVAL and IFMATCH */
-            logical = scan->flags;
+            logical = FLAGS(scan) & EVAL_FLAGS_MASK; /* reserve a bit for optimistic eval */
             break;
 
 /*******************************************************************
@@ -8551,16 +8790,16 @@ NULL
         case CURLYX:    /* start of /A*B/  (for complex A) */
         {
             /* No need to save/restore up to this paren */
-            I32 parenfloor = scan->flags;
+            I32 parenfloor = FLAGS(scan);
 
             assert(next); /* keep Coverity happy */
-            if (OP(PREVOPER(next)) == NOTHING) /* LONGJMP */
-                next += ARG(next);
+            if (OP(REGNODE_BEFORE(next)) == NOTHING) /* LONGJMP */
+                next += ARG1u(next);
 
             /* XXXX Probably it is better to teach regpush to support
                parenfloor > maxopenparen ... */
-            if (parenfloor > (I32)rex->lastparen)
-                parenfloor = rex->lastparen; /* Pessimization... */
+            if (parenfloor > (I32)RXp_LASTPAREN(rex))
+                parenfloor = RXp_LASTPAREN(rex); /* Pessimization... */
 
             ST.prev_curlyx= cur_curlyx;
             cur_curlyx = st;
@@ -8576,7 +8815,7 @@ NULL
             ST.count = -1;     /* this will be updated by WHILEM */
             ST.lastloc = NULL;  /* this will be updated by WHILEM */
 
-            PUSH_YES_STATE_GOTO(CURLYX_end, PREVOPER(next), locinput, loceol,
+            PUSH_YES_STATE_GOTO(CURLYX_end, REGNODE_BEFORE(next), locinput, loceol,
                                 script_run_begin);
             NOT_REACHED; /* NOTREACHED */
         }
@@ -8601,25 +8840,26 @@ NULL
             /* see the discussion above about CURLYX/WHILEM */
             I32 n;
             int min, max;
+            /* U16 first_paren, last_paren; */
             regnode *A;
 
             assert(cur_curlyx); /* keep Coverity happy */
 
-            min = ARG1(cur_curlyx->u.curlyx.me);
-            max = ARG2(cur_curlyx->u.curlyx.me);
-            A = NEXTOPER(cur_curlyx->u.curlyx.me) + EXTRA_STEP_2ARGS;
+            min = ARG1i(cur_curlyx->u.curlyx.me);
+            max = ARG2i(cur_curlyx->u.curlyx.me);
+            /* first_paren = ARG3a(cur_curlyx->u.curlyx.me); */
+            /* last_paren = ARG3b(cur_curlyx->u.curlyx.me);  */
+            A = REGNODE_AFTER(cur_curlyx->u.curlyx.me);
             n = ++cur_curlyx->u.curlyx.count; /* how many A's matched */
             ST.save_lastloc = cur_curlyx->u.curlyx.lastloc;
             ST.cache_offset = 0;
             ST.cache_mask = 0;
 
-
             DEBUG_EXECUTE_r( Perl_re_exec_indentf( aTHX_  "WHILEM: matched %ld out of %d..%d\n",
                   depth, (long)n, min, max)
             );
 
             /* First just match a string of min A's. */
-
             if (n < min) {
                 ST.cp = regcppush(rex, cur_curlyx->u.curlyx.parenfloor, maxopenparen);
                 cur_curlyx->u.curlyx.lastloc = locinput;
@@ -8644,7 +8884,7 @@ NULL
              * The idea here is that for certain types of CURLYX/WHILEM -
              * principally those whose upper bound is infinity (and
              * excluding regexes that have things like \1 and other very
-             * non-regular expresssiony things), then if a pattern like
+             * non-regular expressiony things), then if a pattern like
              * /....A*.../ fails and we backtrack to the WHILEM, then we
              * make a note that this particular WHILEM op was at string
              * position 47 (say) when the rest of pattern failed. Then, if
@@ -8665,20 +8905,20 @@ NULL
              * op (string-length x #WHILEMs) times do we allocate the
              * cache.
              *
-             * The top 4 bits of scan->flags byte say how many different
+             * The top 4 bits of FLAGS(scan) byte say how many different
              * relevant CURLLYX/WHILEM op pairs there are, while the
              * bottom 4-bits is the identifying index number of this
              * WHILEM.
              */
 
-            if (scan->flags) {
+            if (FLAGS(scan)) {
 
                 if (!reginfo->poscache_maxiter) {
                     /* start the countdown: Postpone detection until we
                      * know the match is not *that* much linear. */
                     reginfo->poscache_maxiter
                         =    (reginfo->strend - reginfo->strbeg + 1)
-                           * (scan->flags>>4);
+                           * (FLAGS(scan)>>4);
                     /* possible overflow for long strings and many CURLYX's */
                     if (reginfo->poscache_maxiter < 0)
                         reginfo->poscache_maxiter = I32_MAX;
@@ -8711,9 +8951,9 @@ NULL
                     SSize_t offset, mask;
 
                     reginfo->poscache_iter = -1; /* stop eventual underflow */
-                    offset  = (scan->flags & 0xf) - 1
+                    offset  = (FLAGS(scan) & 0xf) - 1
                                 +   (locinput - reginfo->strbeg)
-                                  * (scan->flags>>4);
+                                  * (FLAGS(scan)>>4);
                     mask    = 1 << (offset % 8);
                     offset /= 8;
                     if (reginfo->info_aux->poscache[offset] & mask) {
@@ -8782,18 +9022,8 @@ NULL
             DEBUG_EXECUTE_r(Perl_re_exec_indentf( aTHX_  "WHILEM: failed, trying continuation...\n",
                 depth)
             );
-          do_whilem_B_max:
-            if (cur_curlyx->u.curlyx.count >= REG_INFTY
-                && ckWARN(WARN_REGEXP)
-                && !reginfo->warned)
-            {
-                reginfo->warned        = TRUE;
-                Perl_warner(aTHX_ packWARN(WARN_REGEXP),
-                     "Complex regular subexpression recursion limit (%d) "
-                     "exceeded",
-                     REG_INFTY - 1);
-            }
 
+          do_whilem_B_max:
             /* now try B */
             ST.save_curlyx = cur_curlyx;
             cur_curlyx = cur_curlyx->u.curlyx.prev_curlyx;
@@ -8804,18 +9034,8 @@ NULL
         case WHILEM_B_min_fail: /* just failed to match B in a minimal match */
             cur_curlyx = ST.save_curlyx;
 
-            if (cur_curlyx->u.curlyx.count >= /*max*/ARG2(cur_curlyx->u.curlyx.me)) {
+            if (cur_curlyx->u.curlyx.count >= /*max*/ARG2i(cur_curlyx->u.curlyx.me)) {
                 /* Maximum greed exceeded */
-                if (cur_curlyx->u.curlyx.count >= REG_INFTY
-                    && ckWARN(WARN_REGEXP)
-                    && !reginfo->warned)
-                {
-                    reginfo->warned    = TRUE;
-                    Perl_warner(aTHX_ packWARN(WARN_REGEXP),
-                        "Complex regular subexpression recursion "
-                        "limit (%d) exceeded",
-                        REG_INFTY - 1);
-                }
                 cur_curlyx->u.curlyx.count--;
                 CACHEsayNO;
             }
@@ -8824,11 +9044,10 @@ NULL
             );
             /* Try grabbing another A and see if it helps. */
             cur_curlyx->u.curlyx.lastloc = locinput;
-            ST.cp = regcppush(rex, cur_curlyx->u.curlyx.parenfloor,
-                            maxopenparen);
+            ST.cp = regcppush(rex, cur_curlyx->u.curlyx.parenfloor, maxopenparen);
             REGCP_SET(ST.lastcp);
             PUSH_STATE_GOTO(WHILEM_A_min,
-                /*A*/ NEXTOPER(ST.save_curlyx->u.curlyx.me) + EXTRA_STEP_2ARGS,
+                /*A*/ REGNODE_AFTER(ST.save_curlyx->u.curlyx.me),
                 locinput, loceol, script_run_begin);
             NOT_REACHED; /* NOTREACHED */
 
@@ -8836,18 +9055,28 @@ NULL
 #define ST st->u.branch
 
         case BRANCHJ:      /*  /(...|A|...)/ with long next pointer */
-            next = scan + ARG(scan);
+            next = scan + ARG1u(scan);
             if (next == scan)
                 next = NULL;
-            scan = NEXTOPER(scan);
-            /* FALLTHROUGH */
+            ST.before_paren = ARG2a(scan);
+            ST.after_paren = ARG2b(scan);
+            goto branch_logic;
+            NOT_REACHED; /* NOTREACHED */
 
         case BRANCH:       /*  /(...|A|...)/ */
-            scan = NEXTOPER(scan); /* scan now points to inner node */
-            ST.lastparen = rex->lastparen;
-            ST.lastcloseparen = rex->lastcloseparen;
+            ST.before_paren = ARG1a(scan);
+            ST.after_paren = ARG1b(scan);
+          branch_logic:
+            scan = REGNODE_AFTER_opcode(scan,state_num); /* scan now points to inner node */
+            assert(scan);
+            ST.lastparen = RXp_LASTPAREN(rex);
+            ST.lastcloseparen = RXp_LASTCLOSEPAREN(rex);
             ST.next_branch = next;
             REGCP_SET(ST.cp);
+            if (RE_PESSIMISTIC_PARENS) {
+                regcppush(rex, 0, maxopenparen);
+                REGCP_SET(ST.lastcp);
+            }
 
             /* Now go into the branch */
             if (has_cutgroup) {
@@ -8860,8 +9089,8 @@ NULL
             NOT_REACHED; /* NOTREACHED */
 
         case CUTGROUP:  /*  /(*THEN)/  */
-            sv_yes_mark = st->u.mark.mark_name = scan->flags
-                ? MUTABLE_SV(rexi->data->data[ ARG( scan ) ])
+            sv_yes_mark = st->u.mark.mark_name = FLAGS(scan)
+                ? MUTABLE_SV(rexi->data->data[ ARG1u( scan ) ])
                 : NULL;
             PUSH_STATE_GOTO(CUTGROUP_next, next, locinput, loceol,
                             script_run_begin);
@@ -8884,8 +9113,13 @@ NULL
                 do_cutgroup = 0;
                 no_final = 0;
             }
+            if (RE_PESSIMISTIC_PARENS) {
+                REGCP_UNWIND(ST.lastcp);
+                regcppop(rex,&maxopenparen);
+            }
             REGCP_UNWIND(ST.cp);
             UNWIND_PAREN(ST.lastparen, ST.lastcloseparen);
+            CAPTURE_CLEAR(ST.before_paren+1, ST.after_paren, "BRANCH_next_fail");
             scan = ST.next_branch;
             /* no more branches? */
             if (!scan || (OP(scan) != BRANCH && OP(scan) != BRANCHJ)) {
@@ -8916,14 +9150,14 @@ NULL
              */
 
             ST.me = scan;
-            scan = NEXTOPER(scan) + NODE_STEP_REGNODE;
+            scan = REGNODE_AFTER_type(scan, tregnode_CURLYM);
 
-            ST.lastparen      = rex->lastparen;
-            ST.lastcloseparen = rex->lastcloseparen;
+            ST.lastparen      = RXp_LASTPAREN(rex);
+            ST.lastcloseparen = RXp_LASTCLOSEPAREN(rex);
 
             /* if paren positive, emulate an OPEN/CLOSE around A */
-            if (ST.me->flags) {
-                U32 paren = ST.me->flags;
+            if (FLAGS(ST.me)) {
+                U32 paren = FLAGS(ST.me);
                 lastopen = paren;
                 if (paren > maxopenparen)
                     maxopenparen = paren;
@@ -8938,7 +9172,7 @@ NULL
             ST.Binfo.count = -1;
             REGCP_SET(ST.cp);
 
-            if (!(ST.minmod ? ARG1(ST.me) : ARG2(ST.me))) /* min/max */
+            if (!(ST.minmod ? ARG1i(ST.me) : ARG2i(ST.me))) /* min/max */
                 goto curlym_do_B;
 
           curlym_do_A: /* execute the A in /A{m,n}B/  */
@@ -8961,19 +9195,27 @@ NULL
                     ST.alen = locinput - st->locinput;
                 }
                 if (ST.alen == 0)
-                    ST.count = ST.minmod ? ARG1(ST.me) : ARG2(ST.me);
+                    ST.count = ST.minmod ? ARG1i(ST.me) : ARG2i(ST.me);
             }
             DEBUG_EXECUTE_r(
                 Perl_re_exec_indentf( aTHX_  "CURLYM now matched %" IVdf " times, len=%" IVdf "...\n",
                           depth, (IV) ST.count, (IV)ST.alen)
             );
 
-            if (EVAL_CLOSE_PAREN_IS_TRUE(cur_eval,(U32)ST.me->flags))
+            if (FLAGS(ST.me)) {
+                /* emulate CLOSE: mark current A as captured */
+                U32 paren = (U32)FLAGS(ST.me);
+                CLOSE_CAPTURE(rex, paren,
+                    HOPc(locinput, -ST.alen) - reginfo->strbeg,
+                    locinput - reginfo->strbeg);
+            }
+
+            if (EVAL_CLOSE_PAREN_IS_TRUE(cur_eval,(U32)FLAGS(ST.me)))
                 goto fake_end;
 
 
             if (!is_accepted) {
-                I32 max = (ST.minmod ? ARG1(ST.me) : ARG2(ST.me));
+                I32 max = (ST.minmod ? ARG1i(ST.me) : ARG2i(ST.me));
                 if ( max == REG_INFTY || ST.count < max )
                     goto curlym_do_A; /* try to match another A */
             }
@@ -8983,8 +9225,8 @@ NULL
             REGCP_UNWIND(ST.cp);
 
 
-            if (ST.minmod || ST.count < ARG1(ST.me) /* min*/
-                || EVAL_CLOSE_PAREN_IS_TRUE(cur_eval,(U32)ST.me->flags))
+            if (ST.minmod || ST.count < ARG1i(ST.me) /* min*/
+                || EVAL_CLOSE_PAREN_IS_TRUE(cur_eval,(U32)FLAGS(ST.me)))
                 sayNO;
 
           curlym_do_B: /* execute the B in /A{m,n}B/  */
@@ -8998,7 +9240,7 @@ NULL
                     regnode *text_node = ST.B;
                     if (! HAS_TEXT(text_node))
                         FIND_NEXT_IMPT(text_node);
-                    if (PL_regkind[OP(text_node)] == EXACT) {
+                    if (REGNODE_TYPE(OP(text_node)) == EXACT) {
                         if (! S_setup_EXACTISH_ST(aTHX_ text_node,
                                                         &ST.Binfo, reginfo))
                         {
@@ -9033,17 +9275,18 @@ NULL
             }
 
           curlym_close_B:
-            if (ST.me->flags) {
+            if (FLAGS(ST.me)) {
                 /* emulate CLOSE: mark current A as captured */
-                U32 paren = (U32)ST.me->flags;
+                U32 paren = (U32)FLAGS(ST.me);
                 if (ST.count || is_accepted) {
-                    CLOSE_CAPTURE(paren,
+                    CLOSE_CAPTURE(rex, paren,
                         HOPc(locinput, -ST.alen) - reginfo->strbeg,
                         locinput - reginfo->strbeg);
                 }
                 else
-                    rex->offs[paren].end = -1;
-                if (EVAL_CLOSE_PAREN_IS_TRUE(cur_eval,(U32)ST.me->flags))
+                    RXp_OFFSp(rex)[paren].end = -1;
+
+                if (EVAL_CLOSE_PAREN_IS_TRUE(cur_eval,(U32)FLAGS(ST.me)))
                 {
                     if (ST.count || is_accepted)
                         goto fake_end;
@@ -9063,13 +9306,13 @@ NULL
             REGCP_UNWIND(ST.cp);
             UNWIND_PAREN(ST.lastparen, ST.lastcloseparen);
             if (ST.minmod) {
-                I32 max = ARG2(ST.me);
+                I32 max = ARG2i(ST.me);
                 if (max != REG_INFTY && ST.count == max)
                     sayNO;
                 goto curlym_do_A; /* try to match a further A */
             }
             /* backtrack one A */
-            if (ST.count == ARG1(ST.me) /* min */)
+            if (ST.count == ARG1i(ST.me) /* min */)
                 sayNO;
             ST.count--;
             SET_locinput(HOPc(locinput, -ST.alen));
@@ -9078,42 +9321,42 @@ NULL
 #undef ST
 #define ST st->u.curly
 
-#define CURLY_SETPAREN(paren, success) \
-    if (paren) { \
-        if (success) { \
-            CLOSE_CAPTURE(paren, HOPc(locinput, -1) - reginfo->strbeg, \
-                                 locinput - reginfo->strbeg); \
-        } \
-        else { \
-            rex->offs[paren].end = -1; \
-            rex->lastparen      = ST.lastparen; \
-            rex->lastcloseparen = ST.lastcloseparen; \
-        } \
+#define CURLY_SETPAREN(paren, success)                                      \
+    if (paren) {                                                            \
+        if (success) {                                                      \
+            CLOSE_CAPTURE(rex, paren, HOPc(locinput, -1) - reginfo->strbeg, \
+                                 locinput - reginfo->strbeg);               \
+        }                                                                   \
+        else {                                                              \
+            RXp_OFFSp(rex)[paren].end = -1;                                 \
+            RXp_LASTPAREN(rex)  = ST.lastparen;                             \
+            RXp_LASTCLOSEPAREN(rex) = ST.lastcloseparen;                    \
+        }                                                                   \
     }
 
         case STAR:             /*  /A*B/ where A is width 1 char */
             ST.paren = 0;
             ST.min = 0;
             ST.max = REG_INFTY;
-            scan = NEXTOPER(scan);
+            scan = REGNODE_AFTER_type(scan,tregnode_STAR);
             goto repeat;
 
         case PLUS:             /*  /A+B/ where A is width 1 char */
             ST.paren = 0;
             ST.min = 1;
             ST.max = REG_INFTY;
-            scan = NEXTOPER(scan);
+            scan = REGNODE_AFTER_type(scan,tregnode_PLUS);
             goto repeat;
 
         case CURLYN:           /*  /(A){m,n}B/ where A is width 1 char */
-            ST.paren = scan->flags;    /* Which paren to set */
-            ST.lastparen      = rex->lastparen;
-            ST.lastcloseparen = rex->lastcloseparen;
+            ST.paren = FLAGS(scan);     /* Which paren to set */
+            ST.lastparen      = RXp_LASTPAREN(rex);
+            ST.lastcloseparen = RXp_LASTCLOSEPAREN(rex);
             if (ST.paren > maxopenparen)
                 maxopenparen = ST.paren;
-            ST.min = ARG1(scan);  /* min to match */
-            ST.max = ARG2(scan);  /* max to match */
-            scan = regnext(NEXTOPER(scan) + NODE_STEP_REGNODE);
+            ST.min = ARG1i(scan);  /* min to match */
+            ST.max = ARG2i(scan);  /* max to match */
+            scan = regnext(REGNODE_AFTER_type(scan, tregnode_CURLYN));
 
             /* handle the single-char capture called as a GOSUB etc */
             if (EVAL_CLOSE_PAREN_IS_TRUE(cur_eval,(U32)ST.paren))
@@ -9129,9 +9372,9 @@ NULL
 
         case CURLY:            /*  /A{m,n}B/ where A is width 1 char */
             ST.paren = 0;
-            ST.min = ARG1(scan);  /* min to match */
-            ST.max = ARG2(scan);  /* max to match */
-            scan = NEXTOPER(scan) + NODE_STEP_REGNODE;
+            ST.min = ARG1i(scan);  /* min to match */
+            ST.max = ARG2i(scan);  /* max to match */
+            scan = REGNODE_AFTER_type(scan, tregnode_CURLY);
           repeat:
             /*
             * Lookahead to avoid useless match attempts
@@ -9155,7 +9398,7 @@ NULL
                 if (! HAS_TEXT(text_node))
                     ST.Binfo.count = 0;
                 else {
-                    if ( PL_regkind[OP(text_node)] != EXACT ) {
+                    if ( REGNODE_TYPE(OP(text_node)) != EXACT ) {
                         ST.Binfo.count = 0;
                     }
                     else {
@@ -9213,12 +9456,15 @@ NULL
                 /* avoid taking address of locinput, so it can remain
                  * a register var */
                 char *li = locinput;
-                ST.count = regrepeat(rex, &li, ST.A, loceol, reginfo, ST.max);
+                if (ST.max)
+                    ST.count = regrepeat(rex, &li, ST.A, loceol, reginfo, ST.max);
+                else
+                    ST.count = 0;
                 if (ST.count < ST.min)
                     sayNO;
                 SET_locinput(li);
                 if ((ST.count > ST.min)
-                    && (PL_regkind[OP(ST.B)] == EOL) && (OP(ST.B) != MEOL))
+                    && (REGNODE_TYPE(OP(ST.B)) == EOL) && (OP(ST.B) != MEOL))
                 {
                     /* A{m,n} must come at the end of the string, there's
                      * no point in backing off ... */
@@ -9236,7 +9482,10 @@ NULL
 
         case CURLY_B_min_fail:
             /* failed to find B in a non-greedy match. */
-
+            if (RE_PESSIMISTIC_PARENS) {
+                REGCP_UNWIND(ST.lastcp);
+                regcppop(rex, &maxopenparen); /* Restore some previous $<digit>s? */
+            }
             REGCP_UNWIND(ST.cp);
             if (ST.paren) {
                 UNWIND_PAREN(ST.lastparen, ST.lastcloseparen);
@@ -9349,6 +9598,10 @@ NULL
             }
 
           curly_try_B_min:
+            if (RE_PESSIMISTIC_PARENS) {
+                (void)regcppush(rex, 0, maxopenparen);
+                REGCP_SET(ST.lastcp);
+            }
             CURLY_SETPAREN(ST.paren, ST.count);
             PUSH_STATE_GOTO(CURLY_B_min, ST.B, locinput, loceol,
                             script_run_begin);
@@ -9362,16 +9615,26 @@ NULL
                     &&  locinput + ST.Binfo.min_length <= loceol
                     &&  S_test_EXACTISH_ST(locinput, ST.Binfo)))
             {
+                if (RE_PESSIMISTIC_PARENS) {
+                    (void)regcppush(rex, 0, maxopenparen);
+                    REGCP_SET(ST.lastcp);
+                }
                 CURLY_SETPAREN(ST.paren, ST.count);
                 PUSH_STATE_GOTO(CURLY_B_max, ST.B, locinput, loceol,
                                 script_run_begin);
                 NOT_REACHED; /* NOTREACHED */
             }
-            /* FALLTHROUGH */
+            goto CURLY_B_all_failed;
+            NOT_REACHED; /* NOTREACHED */
 
         case CURLY_B_max_fail:
             /* failed to find B in a greedy match */
 
+            if (RE_PESSIMISTIC_PARENS) {
+                REGCP_UNWIND(ST.lastcp);
+                regcppop(rex, &maxopenparen); /* Restore some previous $<digit>s? */
+            }
+          CURLY_B_all_failed:
             REGCP_UNWIND(ST.cp);
             if (ST.paren) {
                 UNWIND_PAREN(ST.lastparen, ST.lastcloseparen);
@@ -9475,10 +9738,10 @@ NULL
             ST.wanted = 1;
           ifmatch_trivial_fail_test:
             ST.prev_match_end= match_end;
-            ST.count = scan->next_off + 1; /* next_off repurposed to be
+            ST.count = NEXT_OFF(scan) + 1; /* next_off repurposed to be
                                               lookbehind count, requires
                                               non-zero flags */
-            if (! scan->flags) {    /* 'flags' zero means lookahed */
+            if (! FLAGS(scan)) {    /* 'flags' zero means lookahed */
 
                 /* Lookahead starts here and ends at the normal place */
                 ST.start = locinput;
@@ -9486,7 +9749,7 @@ NULL
                 match_end = NULL;
             }
             else {
-                PERL_UINT_FAST8_T back_count = scan->flags;
+                PERL_UINT_FAST8_T back_count = FLAGS(scan);
                 char * s;
                 match_end = locinput;
 
@@ -9514,7 +9777,7 @@ NULL
                     sayNO;
 
                 /* Here, we didn't want it to match, so is actually success */
-                next = scan + ARG(scan);
+                next = scan + ARG1u(scan);
                 if (next == scan)
                     next = NULL;
                 break;
@@ -9526,7 +9789,7 @@ NULL
             logical = 0; /* XXX: reset state of logical once it has been saved into ST */
 
             /* execute body of (?...A) */
-            PUSH_YES_STATE_GOTO(IFMATCH_A, NEXTOPER(NEXTOPER(scan)), ST.start,
+            PUSH_YES_STATE_GOTO(IFMATCH_A, REGNODE_AFTER(scan), ST.start,
                                 ST.end, script_run_begin);
             NOT_REACHED; /* NOTREACHED */
 
@@ -9564,7 +9827,7 @@ NULL
                 loceol = st->loceol;
                 script_run_begin = st->sr0;
             }
-            scan = ST.me + ARG(ST.me);
+            scan = ST.me + ARG1u(ST.me);
             if (scan == ST.me)
                 scan = NULL;
             continue; /* execute B */
@@ -9574,7 +9837,7 @@ NULL
 
         case LONGJMP: /*  alternative with many branches compiles to
                        * (BRANCHJ; EXACT ...; LONGJMP ) x N */
-            next = scan + ARG(scan);
+            next = scan + ARG1u(scan);
             if (next == scan)
                 next = NULL;
             break;
@@ -9584,8 +9847,8 @@ NULL
             /* FALLTHROUGH */
 
         case PRUNE:   /*  (*PRUNE)   */
-            if (scan->flags)
-                sv_yes_mark = sv_commit = MUTABLE_SV(rexi->data->data[ ARG( scan ) ]);
+            if (FLAGS(scan))
+                sv_yes_mark = sv_commit = MUTABLE_SV(rexi->data->data[ ARG1u( scan ) ]);
             PUSH_STATE_GOTO(COMMIT_next, next, locinput, loceol,
                             script_run_begin);
             NOT_REACHED; /* NOTREACHED */
@@ -9597,8 +9860,8 @@ NULL
             NOT_REACHED; /* NOTREACHED */
 
         case OPFAIL:   /* (*FAIL)  */
-            if (scan->flags)
-                sv_commit = MUTABLE_SV(rexi->data->data[ ARG( scan ) ]);
+            if (FLAGS(scan))
+                sv_commit = MUTABLE_SV(rexi->data->data[ ARG1u( scan ) ]);
             if (logical) {
                 /* deal with (?(?!)X|Y) properly,
                  * make sure we trigger the no branch
@@ -9614,7 +9877,7 @@ NULL
         case MARKPOINT: /*  (*MARK:foo)  */
             ST.prev_mark = mark_state;
             ST.mark_name = sv_commit = sv_yes_mark
-                = MUTABLE_SV(rexi->data->data[ ARG( scan ) ]);
+                = MUTABLE_SV(rexi->data->data[ ARG1u( scan ) ]);
             mark_state = st;
             ST.mark_loc = locinput;
             PUSH_YES_STATE_GOTO(MARKPOINT_next, next, locinput, loceol,
@@ -9647,7 +9910,7 @@ NULL
             NOT_REACHED; /* NOTREACHED */
 
         case SKIP:  /*  (*SKIP)  */
-            if (!scan->flags) {
+            if (!FLAGS(scan)) {
                 /* (*SKIP) : if we fail we cut here*/
                 ST.mark_name = NULL;
                 ST.mark_loc = locinput;
@@ -9658,7 +9921,7 @@ NULL
                    otherwise do nothing.  Meaning we need to scan
                  */
                 regmatch_state *cur = mark_state;
-                SV *find = MUTABLE_SV(rexi->data->data[ ARG( scan ) ]);
+                SV *find = MUTABLE_SV(rexi->data->data[ ARG1u( scan ) ]);
 
                 while (cur) {
                     if ( sv_eq( cur->u.mark.mark_name,
@@ -9753,7 +10016,7 @@ NULL
                     Perl_re_exec_indentf( aTHX_ "%4s #%-3d %-10s %s\n",
                         depth,
                         i ? "    " : "push",
-                        depth - i, PL_reg_name[cur->resume_state],
+                        depth - i, REGNODE_NAME(cur->resume_state),
                         (curyes == cur) ? "yes" : ""
                     );
                     if (curyes == cur)
@@ -9844,7 +10107,7 @@ NULL
          * When popping the save stack, all these locals would be undone;
          * bypass this by setting the outermost saved $^R to the latest
          * value */
-        /* I dont know if this is needed or works properly now.
+        /* I don't know if this is needed or works properly now.
          * see code related to PL_replgv elsewhere in this file.
          * Yves
          */
@@ -9945,7 +10208,7 @@ NULL
  */
 STATIC I32
 S_regrepeat(pTHX_ regexp *prog, char **startposp, const regnode *p,
-            char * loceol, regmatch_info *const reginfo, I32 max _pDEPTH)
+            char * loceol, regmatch_info *const reginfo, I32 max comma_pDEPTH)
 {
     char *scan;     /* Pointer to current position in target string */
     I32 c;
@@ -9953,7 +10216,7 @@ S_regrepeat(pTHX_ regexp *prog, char **startposp, const regnode *p,
     I32 hardcount = 0;  /* How many matches so far */
     bool utf8_target = reginfo->is_utf8_target;
     unsigned int to_complement = 0;  /* Invert the result? */
-    _char_class_number classnum;
+    char_class_number_ classnum;
 
     PERL_ARGS_ASSERT_REGREPEAT;
 
@@ -9993,6 +10256,8 @@ S_regrepeat(pTHX_ regexp *prog, char **startposp, const regnode *p,
      * count doesn't exceed the maximum permissible */
 
     switch (with_t_UTF8ness(OP(p), utf8_target)) {
+        SV * anyofh_list;
+
       case REG_ANY_t8:
         while (scan < this_eol && hardcount < max && *scan != '\n') {
             scan += UTF8SKIP(scan);
@@ -10034,7 +10299,7 @@ S_regrepeat(pTHX_ regexp *prog, char **startposp, const regnode *p,
       case EXACTFL_tb:
       case EXACTFLU8_t8:
       case EXACTFLU8_tb:
-        _CHECK_AND_WARN_PROBLEMATIC_LOCALE;
+        CHECK_AND_WARN_PROBLEMATIC_LOCALE_;
         /* FALLTHROUGH */
 
       case EXACT_REQ8_t8:
@@ -10137,7 +10402,7 @@ S_regrepeat(pTHX_ regexp *prog, char **startposp, const regnode *p,
              * and the rest matched as well, but could have false positives */
 
             do {
-                PERL_INT_FAST8_T i;
+                int i;
                 U8 * matches = Binfo.matches;
 
                 /* The first bytes were definitive.  Look at the remaining */
@@ -10175,7 +10440,7 @@ S_regrepeat(pTHX_ regexp *prog, char **startposp, const regnode *p,
          * there were no initial bytes that could rule out anything
          * definitively. Use brute force to examine all the possibilities */
         while (scan < this_eol && hardcount < max) {
-            PERL_INT_FAST8_T i;
+            int i;
             U8 * matches = Binfo.matches;
 
             for (i = 0; i < Binfo.count; i++) {
@@ -10198,8 +10463,8 @@ S_regrepeat(pTHX_ regexp *prog, char **startposp, const regnode *p,
 
       case ANYOFPOSIXL_t8:
       case ANYOFL_t8:
-        _CHECK_AND_WARN_PROBLEMATIC_LOCALE;
-         CHECK_AND_WARN_NON_UTF8_CTYPE_LOCALE_IN_SETS(p);
+        CHECK_AND_WARN_PROBLEMATIC_LOCALE_;
+        CHECK_AND_WARN_NON_UTF8_CTYPE_LOCALE_IN_SETS(p);
 
         /* FALLTHROUGH */
       case ANYOFD_t8:
@@ -10215,13 +10480,13 @@ S_regrepeat(pTHX_ regexp *prog, char **startposp, const regnode *p,
 
       case ANYOFPOSIXL_tb:
       case ANYOFL_tb:
-        _CHECK_AND_WARN_PROBLEMATIC_LOCALE;
-         CHECK_AND_WARN_NON_UTF8_CTYPE_LOCALE_IN_SETS(p);
+        CHECK_AND_WARN_PROBLEMATIC_LOCALE_;
+        CHECK_AND_WARN_NON_UTF8_CTYPE_LOCALE_IN_SETS(p);
         /* FALLTHROUGH */
 
       case ANYOFD_tb:
       case ANYOF_tb:
-        if (ANYOF_FLAGS(p) & ~ ANYOF_MATCHES_ALL_ABOVE_BITMAP) {
+        if (ANYOF_FLAGS(p) || ANYOF_HAS_AUX(p)) {
             while (   scan < this_eol
                    && reginclass(prog, p, (U8*)scan, (U8*)scan+1, 0))
                 scan++;
@@ -10244,13 +10509,13 @@ S_regrepeat(pTHX_ regexp *prog, char **startposp, const regnode *p,
 
       case ANYOFM_tb:
         scan = (char *) find_span_end_mask((U8 *) scan, (U8 *) this_eol,
-                                           (U8) ARG(p), FLAGS(p));
+                                           (U8) ARG1u(p), FLAGS(p));
         break;
 
       case NANYOFM_t8:
         while (     hardcount < max
                &&   scan < this_eol
-               &&  (*scan & FLAGS(p)) != ARG(p))
+               &&  (*scan & FLAGS(p)) != ARG1u(p))
         {
             scan += UTF8SKIP(scan);
             hardcount++;
@@ -10259,20 +10524,25 @@ S_regrepeat(pTHX_ regexp *prog, char **startposp, const regnode *p,
 
       case NANYOFM_tb:
         scan = (char *) find_next_masked((U8 *) scan, (U8 *) this_eol,
-                                         (U8) ARG(p), FLAGS(p));
+                                         (U8) ARG1u(p), FLAGS(p));
         break;
 
       case ANYOFH_tb: /* ANYOFH only can match UTF-8 targets */
       case ANYOFHb_tb:
+      case ANYOFHbbm_tb:
       case ANYOFHr_tb:
       case ANYOFHs_tb:
         break;
 
       case ANYOFH_t8:
+        anyofh_list = GET_ANYOFH_INVLIST(prog, p);
         while (  hardcount < max
                && scan < this_eol
                && NATIVE_UTF8_TO_I8(*scan) >= ANYOF_FLAGS(p)
-               && reginclass(prog, p, (U8*)scan, (U8*) this_eol, TRUE))
+               && _invlist_contains_cp(anyofh_list,
+                                             utf8_to_uvchr_buf((U8 *) scan,
+                                                               (U8 *) this_eol,
+                                                               NULL)))
         {
             scan += UTF8SKIP(scan);
             hardcount++;
@@ -10281,24 +10551,44 @@ S_regrepeat(pTHX_ regexp *prog, char **startposp, const regnode *p,
 
       case ANYOFHb_t8:
         /* we know the first byte must be the FLAGS field */
+        anyofh_list = GET_ANYOFH_INVLIST(prog, p);
         while (   hardcount < max
                && scan < this_eol
                && (U8) *scan == ANYOF_FLAGS(p)
-               && reginclass(prog, p, (U8*)scan, (U8*) this_eol, TRUE))
+               && _invlist_contains_cp(anyofh_list,
+                                             utf8_to_uvchr_buf((U8 *) scan,
+                                                               (U8 *) this_eol,
+                                                               NULL)))
         {
             scan += UTF8SKIP(scan);
             hardcount++;
         }
         break;
 
+      case ANYOFHbbm_t8:
+        while (   hardcount < max
+               && scan + 1 < this_eol
+               && (U8) *scan == ANYOF_FLAGS(p)
+               && BITMAP_TEST(( (struct regnode_bbm *) p)->bitmap,
+                                (U8) scan[1] & UTF_CONTINUATION_MASK))
+        {
+            scan += 2;  /* This node only matces 2-byte UTF-8 */
+            hardcount++;
+        }
+        break;
+
       case ANYOFHr_t8:
+        anyofh_list = GET_ANYOFH_INVLIST(prog, p);
         while (  hardcount < max
                && scan < this_eol
                && inRANGE(NATIVE_UTF8_TO_I8(*scan),
                           LOWEST_ANYOF_HRx_BYTE(ANYOF_FLAGS(p)),
                           HIGHEST_ANYOF_HRx_BYTE(ANYOF_FLAGS(p)))
                && NATIVE_UTF8_TO_I8(*scan) >= ANYOF_FLAGS(p)
-               && reginclass(prog, p, (U8*)scan, (U8*) this_eol, TRUE))
+               && _invlist_contains_cp(anyofh_list,
+                                             utf8_to_uvchr_buf((U8 *) scan,
+                                                               (U8 *) this_eol,
+                                                               NULL)))
         {
             scan += UTF8SKIP(scan);
             hardcount++;
@@ -10306,10 +10596,14 @@ S_regrepeat(pTHX_ regexp *prog, char **startposp, const regnode *p,
         break;
 
       case ANYOFHs_t8:
+        anyofh_list = GET_ANYOFH_INVLIST(prog, p);
         while (   hardcount < max
                && scan + FLAGS(p) < this_eol
                && memEQ(scan, ((struct regnode_anyofhs *) p)->string, FLAGS(p))
-               && reginclass(prog, p, (U8*)scan, (U8*) this_eol, TRUE))
+               && _invlist_contains_cp(anyofh_list,
+                                             utf8_to_uvchr_buf((U8 *) scan,
+                                                               (U8 *) this_eol,
+                                                               NULL)))
         {
             scan += UTF8SKIP(scan);
             hardcount++;
@@ -10371,7 +10665,7 @@ S_regrepeat(pTHX_ regexp *prog, char **startposp, const regnode *p,
         /* FALLTHROUGH */
 
       case POSIXL_tb:
-        _CHECK_AND_WARN_PROBLEMATIC_LOCALE;
+        CHECK_AND_WARN_PROBLEMATIC_LOCALE_;
         while (   scan < this_eol
                && to_complement ^ cBOOL(isFOO_lc(FLAGS(p), *scan)))
         {
@@ -10408,7 +10702,7 @@ S_regrepeat(pTHX_ regexp *prog, char **startposp, const regnode *p,
         /* FALLTHROUGH */
 
       case POSIXA_tb:
-        while (scan < this_eol && _generic_isCC_A((U8) *scan, FLAGS(p))) {
+        while (scan < this_eol && generic_isCC_A_((U8) *scan, FLAGS(p))) {
             scan++;
         }
         break;
@@ -10417,7 +10711,7 @@ S_regrepeat(pTHX_ regexp *prog, char **startposp, const regnode *p,
         /* FALLTHROUGH */
 
       case NPOSIXA_tb:
-        while (scan < this_eol && ! _generic_isCC_A((U8) *scan, FLAGS(p))) {
+        while (scan < this_eol && ! generic_isCC_A_((U8) *scan, FLAGS(p))) {
             scan++;
         }
         break;
@@ -10428,7 +10722,7 @@ S_regrepeat(pTHX_ regexp *prog, char **startposp, const regnode *p,
          * non-ASCII, plus everything in ASCII that isn't in the class. */
         while (   hardcount < max && scan < this_eol
                && (   ! isASCII_utf8_safe(scan, loceol)
-                   || ! _generic_isCC_A((U8) *scan, FLAGS(p))))
+                   || ! generic_isCC_A_((U8) *scan, FLAGS(p))))
             {
                 scan += UTF8SKIP(scan);
                 hardcount++;
@@ -10441,7 +10735,7 @@ S_regrepeat(pTHX_ regexp *prog, char **startposp, const regnode *p,
 
       case POSIXU_tb:
         while (   scan < this_eol
-               && to_complement ^ cBOOL(_generic_isCC((U8) *scan, FLAGS(p))))
+               && to_complement ^ cBOOL(generic_isCC_((U8) *scan, FLAGS(p))))
         {
             scan++;
         }
@@ -10454,7 +10748,7 @@ S_regrepeat(pTHX_ regexp *prog, char **startposp, const regnode *p,
 
       case POSIXD_t8:
       case POSIXU_t8:
-        classnum = (_char_class_number) FLAGS(p);
+        classnum = (char_class_number_) FLAGS(p);
         switch (classnum) {
           default:
             while (   hardcount < max && scan < this_eol
@@ -10472,7 +10766,7 @@ S_regrepeat(pTHX_ regexp *prog, char **startposp, const regnode *p,
              * for making the loops as tight as possible.  It could be
              * refactored to save space instead. */
 
-          case _CC_ENUM_SPACE:
+          case CC_ENUM_SPACE_:
             while (   hardcount < max
                    && scan < this_eol
                    && (to_complement
@@ -10482,7 +10776,7 @@ S_regrepeat(pTHX_ regexp *prog, char **startposp, const regnode *p,
                 hardcount++;
             }
             break;
-          case _CC_ENUM_BLANK:
+          case CC_ENUM_BLANK_:
             while (   hardcount < max
                    && scan < this_eol
                    && (to_complement
@@ -10492,7 +10786,7 @@ S_regrepeat(pTHX_ regexp *prog, char **startposp, const regnode *p,
                 hardcount++;
             }
             break;
-          case _CC_ENUM_XDIGIT:
+          case CC_ENUM_XDIGIT_:
             while (   hardcount < max
                    && scan < this_eol
                    && (to_complement
@@ -10502,7 +10796,7 @@ S_regrepeat(pTHX_ regexp *prog, char **startposp, const regnode *p,
                 hardcount++;
             }
             break;
-          case _CC_ENUM_VERTSPACE:
+          case CC_ENUM_VERTSPACE_:
             while (   hardcount < max
                    && scan < this_eol
                    && (to_complement
@@ -10512,7 +10806,7 @@ S_regrepeat(pTHX_ regexp *prog, char **startposp, const regnode *p,
                 hardcount++;
             }
             break;
-          case _CC_ENUM_CNTRL:
+          case CC_ENUM_CNTRL_:
             while (   hardcount < max
                    && scan < this_eol
                    && (to_complement
@@ -10549,7 +10843,7 @@ S_regrepeat(pTHX_ regexp *prog, char **startposp, const regnode *p,
 
     default:
         Perl_croak(aTHX_ "panic: regrepeat() called with unrecognized"
-                         " node type %d='%s'", OP(p), PL_reg_name[OP(p)]);
+                         " node type %d='%s'", OP(p), REGNODE_NAME(OP(p)));
         NOT_REACHED; /* NOTREACHED */
 
     }
@@ -10615,7 +10909,7 @@ S_reginclass(pTHX_ regexp * const prog, const regnode * const n, const U8* const
         }
         if (     c > 255
             &&  (OP(n) == ANYOFL || OP(n) == ANYOFPOSIXL)
-            && ! ANYOFL_UTF8_LOCALE_REQD(flags))
+            && ! (flags & ANYOFL_UTF8_LOCALE_REQD))
         {
             _CHECK_AND_OUTPUT_WIDE_LOCALE_CP_MSG(c);
         }
@@ -10625,11 +10919,10 @@ S_reginclass(pTHX_ regexp * const prog, const regnode * const n, const U8* const
     if (c < NUM_ANYOF_CODE_POINTS && ! inRANGE(OP(n), ANYOFH, ANYOFHb)) {
         if (ANYOF_BITMAP_TEST(n, c))
             match = TRUE;
-        else if ((flags
-                & ANYOF_SHARED_d_MATCHES_ALL_NON_UTF8_NON_ASCII_non_d_WARN_SUPER)
-                  && OP(n) == ANYOFD
-                  && ! utf8_target
-                  && ! isASCII(c))
+        else if (  (flags & ANYOFD_NON_UTF8_MATCHES_ALL_NON_ASCII__shared)
+                 && OP(n) == ANYOFD
+                 && ! utf8_target
+                 && ! isASCII(c))
         {
             match = TRUE;
         }
@@ -10678,108 +10971,124 @@ S_reginclass(pTHX_ regexp * const prog, const regnode * const n, const U8* const
         }
     }
 
-
     /* If the bitmap didn't (or couldn't) match, and something outside the
      * bitmap could match, try that. */
     if (!match) {
-        if (c >= NUM_ANYOF_CODE_POINTS
-            && (flags & ANYOF_MATCHES_ALL_ABOVE_BITMAP))
+        if (      c >= NUM_ANYOF_CODE_POINTS
+            &&    ANYOF_ONLY_HAS_BITMAP(n)
+            && ! (flags & ANYOF_HAS_EXTRA_RUNTIME_MATCHES))
         {
-            match = TRUE;      /* Everything above the bitmap matches */
-        }
-            /* Here doesn't match everything above the bitmap.  If there is
-             * some information available beyond the bitmap, we may find a
-             * match in it.  If so, this is most likely because the code point
-             * is outside the bitmap range.  But rarely, it could be because of
-             * some other reason.  If so, various flags are set to indicate
-             * this possibility.  On ANYOFD nodes, there may be matches that
-             * happen only when the target string is UTF-8; or for other node
-             * types, because runtime lookup is needed, regardless of the
-             * UTF-8ness of the target string.  Finally, under /il, there may
-             * be some matches only possible if the locale is a UTF-8 one. */
-        else if (    ARG(n) != ANYOF_ONLY_HAS_BITMAP
-                 && (   c >= NUM_ANYOF_CODE_POINTS
-                     || (   (flags & ANYOF_SHARED_d_UPPER_LATIN1_UTF8_STRING_MATCHES_non_d_RUNTIME_USER_PROP)
-                         && (   UNLIKELY(OP(n) != ANYOFD)
-                             || (utf8_target && ! isASCII_uni(c)
+            /* In this case, the ARG is set up so that the final bit indicates
+             * whether it matches or not */
+            match = ARG1u(n) & 1;
+        }
+        else
+            /* Here, the main way it could match is if the code point is
+             * outside the bitmap and an inversion list exists to handle such
+             * things.  The other ways all occur when a flag is set to indicate
+             * we need special handling.  That handling doesn't come in to
+             * effect for ANYOFD nodes unless the target string is UTF-8 and
+             * that matters to code point being matched. */
+             if (    c >= NUM_ANYOF_CODE_POINTS
+                 || (   (flags & ANYOF_HAS_EXTRA_RUNTIME_MATCHES)
+                     && (   UNLIKELY(OP(n) != ANYOFD)
+                         || (utf8_target && ! isASCII_uvchr(c)
 #                               if NUM_ANYOF_CODE_POINTS > 256
-                                                                 && c < 256
+                                                               && c < 256
 #                               endif
-                                )))
-                     || (   ANYOFL_SOME_FOLDS_ONLY_IN_UTF8_LOCALE(flags)
-                         && IN_UTF8_CTYPE_LOCALE)))
+                                                                         ))))
         {
-            SV* only_utf8_locale = NULL;
-            SV * const definition =
-#if !defined(PERL_IN_XSUB_RE) || defined(PLUGGABLE_RE_EXTENSION)
-                get_regclass_nonbitmap_data(prog, n, TRUE, 0,
-                                            &only_utf8_locale, NULL);
-#else
-                get_re_gclass_nonbitmap_data(prog, n, TRUE, 0,
-                                             &only_utf8_locale, NULL);
-#endif
-            if (definition) {
-                U8 utf8_buffer[2];
-                U8 * utf8_p;
-                if (utf8_target) {
-                    utf8_p = (U8 *) p;
-                } else { /* Convert to utf8 */
-                    utf8_p = utf8_buffer;
-                    append_utf8_from_native_byte(*p, &utf8_p);
-                    utf8_p = utf8_buffer;
+            /* Here, we have an inversion list for outside-the-bitmap code
+             * points and/or the flag is set indicating special handling is
+             * needed.  The flag is set when there is auxiliary data beyond the
+             * normal inversion list, or if there is the possibility of a
+             * special Turkic locale match, even without auxiliary data.
+             *
+             * First check if there is an inversion list and/or auxiliary data.
+             * */
+            if (ANYOF_HAS_AUX(n)) {
+                SV* only_utf8_locale = NULL;
+
+                /* This call will return in 'definition' the union of the base
+                 * non-bitmap inversion list, if any, plus the deferred
+                 * definitions of user-defined properties, if any.  It croaks
+                 * if there is such a property but which still has no definition
+                 * available */
+                SV * const definition = GET_REGCLASS_AUX_DATA(prog, n, TRUE, 0,
+                                                      &only_utf8_locale, NULL);
+                if (definition) {
+                    /* Most likely is the outside-the-bitmap inversion list. */
+                    if (_invlist_contains_cp(definition, c)) {
+                        match = TRUE;
+                    }
+                    else /* Failing that, hardcode the two tests for a Turkic
+                            locale */
+                         if (   UNLIKELY(IN_UTF8_TURKIC_LOCALE)
+                             && isALPHA_FOLD_EQ(*p, 'i'))
+                    {
+                        /* Turkish locales have these hard-coded rules
+                         * overriding normal ones */
+                        if (*p == 'i') {
+                            if (_invlist_contains_cp(definition,
+                                         LATIN_CAPITAL_LETTER_I_WITH_DOT_ABOVE))
+                            {
+                                match = TRUE;
+                            }
+                        }
+                        else if (_invlist_contains_cp(definition,
+                                                 LATIN_SMALL_LETTER_DOTLESS_I))
+                        {
+                            match = TRUE;
+                        }
+                    }
                 }
 
-                /* Turkish locales have these hard-coded rules overriding
-                 * normal ones */
-                if (   UNLIKELY(PL_in_utf8_turkic_locale)
-                    && isALPHA_FOLD_EQ(*p, 'i'))
+                if (   UNLIKELY(only_utf8_locale)
+                    && UNLIKELY(IN_UTF8_CTYPE_LOCALE)
+                    && ! match)
                 {
-                    if (*p == 'i') {
-                        if (_invlist_contains_cp(definition,
-                                       LATIN_CAPITAL_LETTER_I_WITH_DOT_ABOVE))
-                        {
+                    match = _invlist_contains_cp(only_utf8_locale, c);
+                }
+            }
+
+            /* In a Turkic locale under folding, hard-code the I i case pair
+             * matches; these wouldn't have the ANYOF_HAS_EXTRA_RUNTIME_MATCHES
+             * flag set unless [Ii] were match possibilities */
+            if (UNLIKELY(IN_UTF8_TURKIC_LOCALE) && ! match) {
+                if (utf8_target) {
+                    if (c == LATIN_CAPITAL_LETTER_I_WITH_DOT_ABOVE) {
+                        if (ANYOF_BITMAP_TEST(n, 'i')) {
                             match = TRUE;
                         }
                     }
-                    else if (*p == 'I') {
-                        if (_invlist_contains_cp(definition,
-                                                LATIN_SMALL_LETTER_DOTLESS_I))
-                        {
+                    else if (c == LATIN_SMALL_LETTER_DOTLESS_I) {
+                        if (ANYOF_BITMAP_TEST(n, 'I')) {
                             match = TRUE;
                         }
                     }
                 }
-                else if (_invlist_contains_cp(definition, c)) {
-                    match = TRUE;
-                }
-            }
-            if (! match && only_utf8_locale && IN_UTF8_CTYPE_LOCALE) {
-                match = _invlist_contains_cp(only_utf8_locale, c);
-            }
-        }
 
-        /* In a Turkic locale under folding, hard-code the I i case pair
-         * matches */
-        if (     UNLIKELY(PL_in_utf8_turkic_locale)
-            && ! match
-            &&   (flags & ANYOFL_FOLD)
-            &&   utf8_target)
-        {
-            if (c == LATIN_CAPITAL_LETTER_I_WITH_DOT_ABOVE) {
-                if (ANYOF_BITMAP_TEST(n, 'i')) {
-                    match = TRUE;
+#if NUM_ANYOF_CODE_POINTS > 256
+                /* Larger bitmap means these special cases aren't handled
+                 * outside the bitmap above. */
+                if (*p == 'i') {
+                    if (ANYOF_BITMAP_TEST(n,
+                                        LATIN_CAPITAL_LETTER_I_WITH_DOT_ABOVE))
+                    {
+                        match = TRUE;
+                    }
                 }
-            }
-            else if (c == LATIN_SMALL_LETTER_DOTLESS_I) {
-                if (ANYOF_BITMAP_TEST(n, 'I')) {
-                    match = TRUE;
+                else if (*p == 'I') {
+                    if (ANYOF_BITMAP_TEST(n, LATIN_SMALL_LETTER_DOTLESS_I)) {
+                        match = TRUE;
+                    }
                 }
+#endif
             }
         }
 
-        if (UNICODE_IS_SUPER(c)
-            && (flags
-               & ANYOF_SHARED_d_MATCHES_ALL_NON_UTF8_NON_ASCII_non_d_WARN_SUPER)
+        if (   UNICODE_IS_SUPER(c)
+            && (flags & ANYOF_WARN_SUPER__shared)
             && OP(n) != ANYOFD
             && ckWARN_d(WARN_NON_UNICODE))
         {
@@ -10965,21 +11274,21 @@ S_setup_eval_state(pTHX_ regmatch_info *const reginfo)
         /*  Here is a serious problem: we cannot rewrite subbeg,
             since it may be needed if this match fails.  Thus
             $` inside (?{}) could fail... */
-        eval_state->subbeg     = rex->subbeg;
-        eval_state->sublen     = rex->sublen;
-        eval_state->suboffset  = rex->suboffset;
-        eval_state->subcoffset = rex->subcoffset;
+        eval_state->subbeg     = RXp_SUBBEG(rex);
+        eval_state->sublen     = RXp_SUBLEN(rex);
+        eval_state->suboffset  = RXp_SUBOFFSET(rex);
+        eval_state->subcoffset = RXp_SUBCOFFSET(rex);
 #ifdef PERL_ANY_COW
-        eval_state->saved_copy = rex->saved_copy;
+        eval_state->saved_copy = RXp_SAVED_COPY(rex);
 #endif
         RXp_MATCH_COPIED_off(rex);
     }
     else
         eval_state->subbeg = NULL;
-    rex->subbeg = (char *)reginfo->strbeg;
-    rex->suboffset = 0;
-    rex->subcoffset = 0;
-    rex->sublen = reginfo->strend - reginfo->strbeg;
+    RXp_SUBBEG(rex) = (char *)reginfo->strbeg;
+    RXp_SUBOFFSET(rex) = 0;
+    RXp_SUBCOFFSET(rex) = 0;
+    RXp_SUBLEN(rex) = reginfo->strend - reginfo->strbeg;
 }
 
 
@@ -11000,12 +11309,12 @@ S_cleanup_regmatch_info_aux(pTHX_ void *arg)
 
         if (eval_state->subbeg) {
             regexp * const rex = eval_state->rex;
-            rex->subbeg     = eval_state->subbeg;
-            rex->sublen     = eval_state->sublen;
-            rex->suboffset  = eval_state->suboffset;
-            rex->subcoffset = eval_state->subcoffset;
+            RXp_SUBBEG(rex) = eval_state->subbeg;
+            RXp_SUBLEN(rex)     = eval_state->sublen;
+            RXp_SUBOFFSET(rex)  = eval_state->suboffset;
+            RXp_SUBCOFFSET(rex) = eval_state->subcoffset;
 #ifdef PERL_ANY_COW
-            rex->saved_copy = eval_state->saved_copy;
+            RXp_SAVED_COPY(rex) = eval_state->saved_copy;
 #endif
             RXp_MATCH_COPIED_on(rex);
         }
@@ -11247,7 +11556,7 @@ Perl_isSCRIPT_RUN(pTHX_ const U8 * s, const U8 * send, const bool utf8_target)
 
 
     /* Things that match /\d/u */
-    SV * decimals_invlist = PL_XPosix_ptrs[_CC_DIGIT];
+    SV * decimals_invlist = PL_XPosix_ptrs[CC_DIGIT_];
     UV * decimals_array = invlist_array(decimals_invlist);
 
     /* What code point is the digit '0' of the script run? (0 meaning FALSE if
@@ -11424,7 +11733,7 @@ Perl_isSCRIPT_RUN(pTHX_ const U8 * s, const U8 * send, const bool utf8_target)
          *
          * Negative script numbers signify that the value may be any of several
          * scripts, and we need to look at auxiliary information to make our
-         * deterimination.  But if both are non-negative, we can fail now */
+         * determination.  But if both are non-negative, we can fail now */
         if (LIKELY(script_of_char >= 0)) {
             const SCX_enum * search_in;
             PERL_UINT_FAST8_T search_in_len;
@@ -11612,9 +11921,462 @@ Perl_isSCRIPT_RUN(pTHX_ const U8 * s, const U8 * send, const bool utf8_target)
 
     return retval;
 }
-
 #endif /* ifndef PERL_IN_XSUB_RE */
 
+/* Buffer logic. */
+SV*
+Perl_reg_named_buff(pTHX_ REGEXP * const rx, SV * const key, SV * const value,
+                    const U32 flags)
+{
+    PERL_ARGS_ASSERT_REG_NAMED_BUFF;
+
+    PERL_UNUSED_ARG(value);
+
+    if (flags & RXapif_FETCH) {
+        return reg_named_buff_fetch(rx, key, flags);
+    } else if (flags & (RXapif_STORE | RXapif_DELETE | RXapif_CLEAR)) {
+        Perl_croak_no_modify();
+        return NULL;
+    } else if (flags & RXapif_EXISTS) {
+        return reg_named_buff_exists(rx, key, flags)
+            ? &PL_sv_yes
+            : &PL_sv_no;
+    } else if (flags & RXapif_REGNAMES) {
+        return reg_named_buff_all(rx, flags);
+    } else if (flags & (RXapif_SCALAR | RXapif_REGNAMES_COUNT)) {
+        return reg_named_buff_scalar(rx, flags);
+    } else {
+        Perl_croak(aTHX_ "panic: Unknown flags %d in named_buff", (int)flags);
+        return NULL;
+    }
+}
+
+SV*
+Perl_reg_named_buff_iter(pTHX_ REGEXP * const rx, const SV * const lastkey,
+                         const U32 flags)
+{
+    PERL_ARGS_ASSERT_REG_NAMED_BUFF_ITER;
+    PERL_UNUSED_ARG(lastkey);
+
+    if (flags & RXapif_FIRSTKEY)
+        return reg_named_buff_firstkey(rx, flags);
+    else if (flags & RXapif_NEXTKEY)
+        return reg_named_buff_nextkey(rx, flags);
+    else {
+        Perl_croak(aTHX_ "panic: Unknown flags %d in named_buff_iter",
+                                            (int)flags);
+        return NULL;
+    }
+}
+
+SV*
+Perl_reg_named_buff_fetch(pTHX_ REGEXP * const r, SV * const namesv,
+                          const U32 flags)
+{
+    SV *ret;
+    struct regexp *const rx = ReANY(r);
+
+    PERL_ARGS_ASSERT_REG_NAMED_BUFF_FETCH;
+
+    if (rx && RXp_PAREN_NAMES(rx)) {
+        HE *he_str = hv_fetch_ent( RXp_PAREN_NAMES(rx), namesv, 0, 0 );
+        if (he_str) {
+            IV i;
+            SV* sv_dat=HeVAL(he_str);
+            I32 *nums=(I32*)SvPVX(sv_dat);
+            AV * const retarray = (flags & RXapif_ALL) ? newAV_alloc_x(SvIVX(sv_dat)) : NULL;
+            for ( i=0; i<SvIVX(sv_dat); i++ ) {
+                if ((I32)(rx->nparens) >= nums[i]
+                    && RXp_OFFS_VALID(rx,nums[i]))
+                {
+                    ret = newSVpvs("");
+                    Perl_reg_numbered_buff_fetch_flags(aTHX_ r, nums[i], ret, REG_FETCH_ABSOLUTE);
+                    if (!retarray)
+                        return ret;
+                } else {
+                    if (retarray)
+                        ret = newSV_type(SVt_NULL);
+                }
+                if (retarray)
+                    av_push_simple(retarray, ret);
+            }
+            if (retarray)
+                return newRV_noinc(MUTABLE_SV(retarray));
+        }
+    }
+    return NULL;
+}
+
+bool
+Perl_reg_named_buff_exists(pTHX_ REGEXP * const r, SV * const key,
+                           const U32 flags)
+{
+    struct regexp *const rx = ReANY(r);
+
+    PERL_ARGS_ASSERT_REG_NAMED_BUFF_EXISTS;
+
+    if (rx && RXp_PAREN_NAMES(rx)) {
+        if (flags & RXapif_ALL) {
+            return hv_exists_ent(RXp_PAREN_NAMES(rx), key, 0);
+        } else {
+            SV *sv = CALLREG_NAMED_BUFF_FETCH(r, key, flags);
+            if (sv) {
+                SvREFCNT_dec_NN(sv);
+                return TRUE;
+            } else {
+                return FALSE;
+            }
+        }
+    } else {
+        return FALSE;
+    }
+}
+
+SV*
+Perl_reg_named_buff_firstkey(pTHX_ REGEXP * const r, const U32 flags)
+{
+    struct regexp *const rx = ReANY(r);
+
+    PERL_ARGS_ASSERT_REG_NAMED_BUFF_FIRSTKEY;
+
+    if ( rx && RXp_PAREN_NAMES(rx) ) {
+        (void)hv_iterinit(RXp_PAREN_NAMES(rx));
+
+        return CALLREG_NAMED_BUFF_NEXTKEY(r, NULL, flags & ~RXapif_FIRSTKEY);
+    } else {
+        return FALSE;
+    }
+}
+
+SV*
+Perl_reg_named_buff_nextkey(pTHX_ REGEXP * const r, const U32 flags)
+{
+    struct regexp *const rx = ReANY(r);
+    DECLARE_AND_GET_RE_DEBUG_FLAGS;
+
+    PERL_ARGS_ASSERT_REG_NAMED_BUFF_NEXTKEY;
+
+    if (rx && RXp_PAREN_NAMES(rx)) {
+        HV *hv = RXp_PAREN_NAMES(rx);
+        HE *temphe;
+        while ( (temphe = hv_iternext_flags(hv, 0)) ) {
+            IV i;
+            IV parno = 0;
+            SV* sv_dat = HeVAL(temphe);
+            I32 *nums = (I32*)SvPVX(sv_dat);
+            for ( i = 0; i < SvIVX(sv_dat); i++ ) {
+                if ((I32)(RXp_LASTPAREN(rx)) >= nums[i] &&
+                    RXp_OFFS_VALID(rx,nums[i]))
+                {
+                    parno = nums[i];
+                    break;
+                }
+            }
+            if (parno || flags & RXapif_ALL) {
+                return newSVhek(HeKEY_hek(temphe));
+            }
+        }
+    }
+    return NULL;
+}
+
+SV*
+Perl_reg_named_buff_scalar(pTHX_ REGEXP * const r, const U32 flags)
+{
+    SV *ret;
+    AV *av;
+    SSize_t length;
+    struct regexp *const rx = ReANY(r);
+
+    PERL_ARGS_ASSERT_REG_NAMED_BUFF_SCALAR;
+
+    if (rx && RXp_PAREN_NAMES(rx)) {
+        if (flags & (RXapif_ALL | RXapif_REGNAMES_COUNT)) {
+            return newSViv(HvTOTALKEYS(RXp_PAREN_NAMES(rx)));
+        } else if (flags & RXapif_ONE) {
+            ret = CALLREG_NAMED_BUFF_ALL(r, (flags | RXapif_REGNAMES));
+            av = MUTABLE_AV(SvRV(ret));
+            length = av_count(av);
+            SvREFCNT_dec_NN(ret);
+            return newSViv(length);
+        } else {
+            Perl_croak(aTHX_ "panic: Unknown flags %d in named_buff_scalar",
+                                                (int)flags);
+            return NULL;
+        }
+    }
+    return &PL_sv_undef;
+}
+
+SV*
+Perl_reg_named_buff_all(pTHX_ REGEXP * const r, const U32 flags)
+{
+    struct regexp *const rx = ReANY(r);
+    AV *av = newAV();
+
+    PERL_ARGS_ASSERT_REG_NAMED_BUFF_ALL;
+
+    if (rx && RXp_PAREN_NAMES(rx)) {
+        HV *hv= RXp_PAREN_NAMES(rx);
+        HE *temphe;
+        (void)hv_iterinit(hv);
+        while ( (temphe = hv_iternext_flags(hv, 0)) ) {
+            IV i;
+            IV parno = 0;
+            SV* sv_dat = HeVAL(temphe);
+            I32 *nums = (I32*)SvPVX(sv_dat);
+            for ( i = 0; i < SvIVX(sv_dat); i++ ) {
+                if ((I32)(RXp_LASTPAREN(rx)) >= nums[i] &&
+                    RXp_OFFS_VALID(rx,nums[i]))
+                {
+                    parno = nums[i];
+                    break;
+                }
+            }
+            if (parno || flags & RXapif_ALL) {
+                av_push_simple(av, newSVhek(HeKEY_hek(temphe)));
+            }
+        }
+    }
+
+    return newRV_noinc(MUTABLE_SV(av));
+}
+
+void
+Perl_reg_numbered_buff_fetch(pTHX_ REGEXP * const re, const I32 paren,
+                             SV * const sv)
+{
+    PERL_ARGS_ASSERT_REG_NUMBERED_BUFF_FETCH;
+    Perl_reg_numbered_buff_fetch_flags(aTHX_ re, paren, sv, 0);
+}
+
+#ifndef PERL_IN_XSUB_RE
+
+void
+Perl_reg_numbered_buff_fetch_flags(pTHX_ REGEXP * const re, const I32 paren,
+                                   SV * const sv, U32 flags)
+{
+    struct regexp *const rx = ReANY(re);
+    char *s = NULL;
+    SSize_t i,t = 0;
+    SSize_t s1, t1;
+    I32 n = paren;
+    I32 logical_nparens = rx->logical_nparens ? rx->logical_nparens : rx->nparens;
+
+    PERL_ARGS_ASSERT_REG_NUMBERED_BUFF_FETCH_FLAGS;
+
+    if (      n == RX_BUFF_IDX_CARET_PREMATCH
+           || n == RX_BUFF_IDX_CARET_FULLMATCH
+           || n == RX_BUFF_IDX_CARET_POSTMATCH
+       )
+    {
+        bool keepcopy = cBOOL(rx->extflags & RXf_PMf_KEEPCOPY);
+        if (!keepcopy) {
+            /* on something like
+             *    $r = qr/.../;
+             *    /$qr/p;
+             * the KEEPCOPY is set on the PMOP rather than the regex */
+            if (PL_curpm && re == PM_GETRE(PL_curpm))
+                 keepcopy = cBOOL(PL_curpm->op_pmflags & PMf_KEEPCOPY);
+        }
+        if (!keepcopy)
+            goto ret_undef;
+    }
+
+    if (!RXp_SUBBEG(rx))
+        goto ret_undef;
+
+    if (n == RX_BUFF_IDX_CARET_FULLMATCH)
+        /* no need to distinguish between them any more */
+        n = RX_BUFF_IDX_FULLMATCH;
+
+    if ((n == RX_BUFF_IDX_PREMATCH || n == RX_BUFF_IDX_CARET_PREMATCH)
+        && (i = RXp_OFFS_START(rx,0)) != -1)
+    {
+        /* $`, ${^PREMATCH} */
+        s = RXp_SUBBEG(rx);
+    }
+    else
+    if ((n == RX_BUFF_IDX_POSTMATCH || n == RX_BUFF_IDX_CARET_POSTMATCH)
+        && (t = RXp_OFFS_END(rx,0)) != -1)
+    {
+        /* $', ${^POSTMATCH} */
+        s = RXp_SUBBEG(rx) - RXp_SUBOFFSET(rx) + t;
+        i = RXp_SUBLEN(rx) + RXp_SUBOFFSET(rx) - t;
+    }
+    else /* when flags is true we do an absolute lookup, and compare against rx->nparens */
+    if (inRANGE(n, 0, flags ? (I32)rx->nparens : logical_nparens)) {
+        I32 *map = (!flags && n) ? rx->logical_to_parno : NULL;
+        I32 true_parno = map ? map[n] : n;
+        do {
+            if (((s1 = RXp_OFFS_START(rx,true_parno)) != -1)  &&
+                ((t1 = RXp_OFFS_END(rx,true_parno)) != -1))
+            {
+                /* $&, ${^MATCH}, $1 ... */
+                i = t1 - s1;
+                s = RXp_SUBBEG(rx) + s1 - RXp_SUBOFFSET(rx);
+                goto found_it;
+            }
+            else if (map) {
+                true_parno = rx->parno_to_logical_next[true_parno];
+            }
+            else {
+                break;
+            }
+        } while (true_parno);
+        goto ret_undef;
+    } else {
+        goto ret_undef;
+    }
+
+  found_it:
+    assert(s >= RXp_SUBBEG(rx));
+    assert((STRLEN)RXp_SUBLEN(rx) >= (STRLEN)((s - RXp_SUBBEG(rx)) + i) );
+    if (i >= 0) {
+#ifdef NO_TAINT_SUPPORT
+        sv_setpvn(sv, s, i);
+#else
+        const int oldtainted = TAINT_get;
+        TAINT_NOT;
+        sv_setpvn(sv, s, i);
+        TAINT_set(oldtainted);
+#endif
+        if (RXp_MATCH_UTF8(rx))
+            SvUTF8_on(sv);
+        else
+            SvUTF8_off(sv);
+        if (TAINTING_get) {
+            if (RXp_MATCH_TAINTED(rx)) {
+                if (SvTYPE(sv) >= SVt_PVMG) {
+                    MAGIC* const mg = SvMAGIC(sv);
+                    MAGIC* mgt;
+                    TAINT;
+                    SvMAGIC_set(sv, mg->mg_moremagic);
+                    SvTAINT(sv);
+                    if ((mgt = SvMAGIC(sv))) {
+                        mg->mg_moremagic = mgt;
+                        SvMAGIC_set(sv, mg);
+                    }
+                } else {
+                    TAINT;
+                    SvTAINT(sv);
+                }
+            } else
+                SvTAINTED_off(sv);
+        }
+    } else {
+      ret_undef:
+        sv_set_undef(sv);
+        return;
+    }
+}
+
+#endif
+
+void
+Perl_reg_numbered_buff_store(pTHX_ REGEXP * const rx, const I32 paren,
+                                                         SV const * const value)
+{
+    PERL_ARGS_ASSERT_REG_NUMBERED_BUFF_STORE;
+
+    PERL_UNUSED_ARG(rx);
+    PERL_UNUSED_ARG(paren);
+    PERL_UNUSED_ARG(value);
+
+    if (!PL_localizing)
+        Perl_croak_no_modify();
+}
+
+I32
+Perl_reg_numbered_buff_length(pTHX_ REGEXP * const r, const SV * const sv,
+                              const I32 paren)
+{
+    struct regexp *const rx = ReANY(r);
+    I32 i,j;
+    I32 s1, t1;
+    I32 logical_nparens = rx->logical_nparens ? rx->logical_nparens : rx->nparens;
+
+    PERL_ARGS_ASSERT_REG_NUMBERED_BUFF_LENGTH;
+
+    if (   paren == RX_BUFF_IDX_CARET_PREMATCH
+        || paren == RX_BUFF_IDX_CARET_FULLMATCH
+        || paren == RX_BUFF_IDX_CARET_POSTMATCH
+    )
+    {
+        bool keepcopy = cBOOL(rx->extflags & RXf_PMf_KEEPCOPY);
+        if (!keepcopy) {
+            /* on something like
+             *    $r = qr/.../;
+             *    /$qr/p;
+             * the KEEPCOPY is set on the PMOP rather than the regex */
+            if (PL_curpm && r == PM_GETRE(PL_curpm))
+                 keepcopy = cBOOL(PL_curpm->op_pmflags & PMf_KEEPCOPY);
+        }
+        if (!keepcopy)
+            goto warn_undef;
+    }
+
+    /* Some of this code was originally in C<Perl_magic_len> in F<mg.c> */
+    switch (paren) {
+      case RX_BUFF_IDX_CARET_PREMATCH: /* ${^PREMATCH} */
+      case RX_BUFF_IDX_PREMATCH:       /* $` */
+        if ( (i = RXp_OFFS_START(rx,0)) != -1) {
+            if (i > 0) {
+                s1 = 0;
+                t1 = i;
+                goto getlen;
+            }
+        }
+        return 0;
+
+      case RX_BUFF_IDX_CARET_POSTMATCH: /* ${^POSTMATCH} */
+      case RX_BUFF_IDX_POSTMATCH:       /* $' */
+        if ( (j = RXp_OFFS_END(rx,0)) != -1 ) {
+            i = RXp_SUBLEN(rx) - j;
+            if (i > 0) {
+                s1 = j;
+                t1 = RXp_SUBLEN(rx);
+                goto getlen;
+            }
+        }
+        return 0;
+
+      default: /* $& / ${^MATCH}, $1, $2, ... */
+        if (paren <= logical_nparens) {
+            I32 true_paren = rx->logical_to_parno
+                             ? rx->logical_to_parno[paren]
+                             : paren;
+            do {
+                if (((s1 = RXp_OFFS_START(rx,true_paren)) != -1) &&
+                    ((t1 = RXp_OFFS_END(rx,true_paren)) != -1))
+                {
+                    i = t1 - s1;
+                    goto getlen;
+                } else if (rx->parno_to_logical_next) {
+                    true_paren = rx->parno_to_logical_next[true_paren];
+                } else {
+                    break;
+                }
+            } while(true_paren);
+        }
+      warn_undef:
+        if (ckWARN(WARN_UNINITIALIZED))
+            report_uninit((const SV *)sv);
+        return 0;
+    }
+  getlen:
+    if (i > 0 && RXp_MATCH_UTF8(rx)) {
+        const char * const s = RXp_SUBBEG(rx) - RXp_SUBOFFSET(rx) + s1;
+        const U8 *ep;
+        STRLEN el;
+
+        i = t1 - s1;
+        if (is_utf8_string_loclen((U8*)s, i, &ep, &el))
+            i = el;
+    }
+    return i;
+}
+
 /*
  * ex: set ts=8 sts=4 sw=4 et:
  */
index 7bd7162..243cf24 100644 (file)
 
 typedef SSize_t regnode_offset;
 
+struct regnode_meta {
+    U8 type;
+    U8 arg_len;
+    U8 arg_len_varies;
+    U8 off_by_arg;
+};
+
+/* this ensures that on alignment sensitive platforms
+ * this struct is aligned on 32 bit boundaries */
+union regnode_head {
+    struct {
+        union {
+            U8 flags;
+            U8 str_len_u8;
+            U8 first_byte;
+        } u_8;
+        U8  type;
+        U16 next_off;
+    } data;
+    U32 data_u32;
+};
+
 struct regnode {
-    U8 flags;
-    U8  type;
-    U16 next_off;
+    union regnode_head head;
 };
 
 typedef struct regnode regnode;
@@ -39,7 +59,7 @@ struct regexp;
 
 struct reg_substr_datum {
     SSize_t min_offset; /* min pos (in chars) that substr must appear */
-    SSize_t max_offset  /* max pos (in chars) that substr must appear */;
+    SSize_t max_offset; /* max pos (in chars) that substr must appear */
     SV *substr;                /* non-utf8 variant */
     SV *utf8_substr;   /* utf8 variant */
     SSize_t end_shift;  /* how many fixed chars must end the string */
@@ -55,11 +75,13 @@ struct reg_substr_data {
 #    define SV_SAVED_COPY
 #  endif
 
-/* offsets within a string of a particular /(.)/ capture */
-
+/* offsets within a string of a particular /(.)/ capture
+ * if you change this by adding new non-temporary fields
+ * then be sure to update Perl_rxres_save() in pp_ctl.c */
 typedef struct regexp_paren_pair {
     SSize_t start;
     SSize_t end;
+
     /* 'start_tmp' records a new opening position before the matching end
      * has been found, so that the old start and end values are still
      * valid, e.g.
@@ -69,7 +91,7 @@ typedef struct regexp_paren_pair {
     SSize_t start_tmp;
 } regexp_paren_pair;
 
-#  if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_UTF8_C)
+#  if defined(PERL_IN_REGCOMP_ANY) || defined(PERL_IN_UTF8_C)
 #    define _invlist_union(a, b, output) _invlist_union_maybe_complement_2nd(a, b, FALSE, output)
 #    define _invlist_intersection(a, b, output) _invlist_intersection_maybe_complement_2nd(a, b, FALSE, output)
 
@@ -118,13 +140,23 @@ typedef struct regexp {
      * Information about the match that the perl core uses to manage things
      */
 
+    /* see comment in regcomp_internal.h about branch reset to understand
+       the distinction between physical and logical capture buffers */
+    U32 nparens;                    /* physical number of capture buffers */
+    U32 logical_nparens;            /* logical_number of capture buffers */
+    I32 *logical_to_parno;          /* map logical parno to first physcial */
+    I32 *parno_to_logical;          /* map every physical parno to logical */
+    I32 *parno_to_logical_next;     /* map every physical parno to the next
+                                       physical with the same logical id */
+
     U32 extflags;      /* Flags used both externally and internally */
-    U32 nparens;       /* number of capture buffers */
+    SSize_t maxlen;    /* maximum possible number of chars in string to match */
     SSize_t minlen;    /* minimum possible number of chars in string to match */
-    SSize_t minlenret; /* mininum possible number of chars in $& */
+    SSize_t minlenret; /* minimum possible number of chars in $& */
     STRLEN gofs;       /* chars left of pos that we search from */
                        /* substring data about strings that must appear in
                         * the final match, used for optimisations */
+
     struct reg_substr_data *substrs;
 
     /* private engine specific data */
@@ -142,6 +174,7 @@ typedef struct regexp {
     char **recurse_locinput; /* used to detect infinite recursion, XXX: move to internal */
     U32 lastcloseparen;      /* last close paren matched ($^N) */
 
+
     /*---------------------------------------------------------------------- */
 
     /* offset from wrapped to the start of precomp */
@@ -158,7 +191,6 @@ typedef struct regexp {
     SSize_t sublen;     /* Length of string pointed by subbeg */
     SSize_t suboffset;  /* byte offset of subbeg from logical start of str */
     SSize_t subcoffset; /* suboffset equiv, but in chars (for @-/@+) */
-    SSize_t maxlen;  /* minimum possible number of chars in string to match */
 
     /*---------------------------------------------------------------------- */
 
@@ -167,7 +199,20 @@ typedef struct regexp {
 } regexp;
 
 
-#  define RXp_PAREN_NAMES(rx)  ((rx)->paren_names)
+#define RXp_PAREN_NAMES(rx) ((rx)->paren_names)
+
+#define RXp_OFFS_START(rx,n) \
+     RXp_OFFSp(rx)[(n)].start 
+
+#define RXp_OFFS_END(rx,n) \
+     RXp_OFFSp(rx)[(n)].end 
+
+#define RXp_OFFS_VALID(rx,n) \
+     (RXp_OFFSp(rx)[(n)].end != -1 && RXp_OFFSp(rx)[(n)].start != -1 )
+
+#define RX_OFFS_START(rx_sv,n)  RXp_OFFS_START(ReANY(rx_sv),n)
+#define RX_OFFS_END(rx_sv,n)    RXp_OFFS_END(ReANY(rx_sv),n)
+#define RX_OFFS_VALID(rx_sv,n)  RXp_OFFS_VALID(ReANY(rx_sv),n)
 
 /* used for high speed searches */
 typedef struct re_scream_pos_data_s
@@ -526,30 +571,53 @@ and check for NULL.
 #  define RX_COMPFLAGS(rx_sv)             RXp_COMPFLAGS(ReANY(rx_sv))
 #  define RXp_ENGINE(prog)                ((prog)->engine)
 #  define RX_ENGINE(rx_sv)                (RXp_ENGINE(ReANY(rx_sv)))
-#  define RXp_SUBBEG(prog)                (prog->subbeg)
+#  define RXp_SUBBEG(prog)                ((prog)->subbeg)
 #  define RX_SUBBEG(rx_sv)                (RXp_SUBBEG(ReANY(rx_sv)))
-#  define RXp_SUBOFFSET(prog)             (prog->suboffset)
+#  define RXp_SUBOFFSET(prog)             ((prog)->suboffset)
 #  define RX_SUBOFFSET(rx_sv)             (RXp_SUBOFFSET(ReANY(rx_sv)))
-#  define RX_SUBCOFFSET(rx_sv)            (ReANY(rx_sv)->subcoffset)
-#  define RXp_OFFS(prog)                  (prog->offs)
-#  define RX_OFFS(rx_sv)                  (RXp_OFFS(ReANY(rx_sv)))
-#  define RXp_NPARENS(prog)               (prog->nparens)
+#  define RXp_SUBCOFFSET(prog)            ((prog)->subcoffset)
+#  define RX_SUBCOFFSET(rx_sv)            (RXp_SUBCOFFSET(ReANY(rx_sv)))
+#  define RXp_OFFSp(prog)                 ((prog)->offs)
+#  define RX_OFFSp(rx_sv)                 (RXp_OFFSp(ReANY(rx_sv)))
+#  define RXp_LOGICAL_NPARENS(prog)       ((prog)->logical_nparens)
+#  define RX_LOGICAL_NPARENS(rx_sv)       (RXp_LOGICAL_NPARENS(ReANY(rx_sv)))
+#  define RXp_LOGICAL_TO_PARNO(prog)      ((prog)->logical_to_parno)
+#  define RX_LOGICAL_TO_PARNO(rx_sv)      (RXp_LOGICAL_TO_PARNO(ReANY(rx_sv)))
+#  define RXp_PARNO_TO_LOGICAL(prog)      ((prog)->parno_to_logical)
+#  define RX_PARNO_TO_LOGICAL(rx_sv)      (RXp_PARNO_TO_LOGICAL(ReANY(rx_sv)))
+#  define RXp_PARNO_TO_LOGICAL_NEXT(prog) ((prog)->parno_to_logical_next)
+#  define RX_PARNO_TO_LOGICAL_NEXT(rx_sv) (RXp_PARNO_TO_LOGICAL_NEXT(ReANY(rx_sv)))
+#  define RXp_NPARENS(prog)               ((prog)->nparens)
 #  define RX_NPARENS(rx_sv)               (RXp_NPARENS(ReANY(rx_sv)))
-#  define RX_SUBLEN(rx_sv)                (ReANY(rx_sv)->sublen)
-#  define RXp_MINLEN(prog)                (prog->minlen)
+#  define RXp_SUBLEN(prog)                ((prog)->sublen)
+#  define RX_SUBLEN(rx_sv)                (RXp_SUBLEN(ReANY(rx_sv)))
+#  define RXp_MINLEN(prog)                ((prog)->minlen)
 #  define RX_MINLEN(rx_sv)                (RXp_MINLEN(ReANY(rx_sv)))
-#  define RXp_MINLENRET(prog)             (prog->minlenret)
+#  define RXp_MINLENRET(prog)             ((prog)->minlenret)
 #  define RX_MINLENRET(rx_sv)             (RXp_MINLENRET(ReANY(rx_sv)))
-#  define RXp_GOFS(prog)                  (prog->gofs)
+#  define RXp_GOFS(prog)                  ((prog)->gofs)
 #  define RX_GOFS(rx_sv)                  (RXp_GOFS(ReANY(rx_sv)))
-#  define RX_LASTPAREN(rx_sv)             (ReANY(rx_sv)->lastparen)
-#  define RX_LASTCLOSEPAREN(rx_sv)        (ReANY(rx_sv)->lastcloseparen)
-#  define RXp_SAVED_COPY(prog)            (prog->saved_copy)
+#  define RXp_LASTPAREN(prog)             ((prog)->lastparen)
+#  define RX_LASTPAREN(rx_sv)             (RXp_LASTPAREN(ReANY(rx_sv)))
+#  define RXp_LASTCLOSEPAREN(prog)        ((prog)->lastcloseparen)
+#  define RX_LASTCLOSEPAREN(rx_sv)        (RXp_LASTCLOSEPAREN(ReANY(rx_sv)))
+#  define RXp_SAVED_COPY(prog)            ((prog)->saved_copy)
 #  define RX_SAVED_COPY(rx_sv)            (RXp_SAVED_COPY(ReANY(rx_sv)))
+#  define RXp_SUBSTRS(prog)               ((prog)->substrs)
+#  define RX_SUBSTRS(rx_sv)               (RXp_SUBSTRS(ReANY(rx_sv)))
+#  define RXp_PPRIVATE(prog)              ((prog)->pprivate)
+#  define RX_PPRIVATE(rx_sv)              (RXp_PPRIVATE(ReANY(rx_sv)))
+#  define RXp_QR_ANONCV(prog)             ((prog)->qr_anoncv)
+#  define RX_QR_ANONCV(rx_sv)             (RXp_QR_ANONCV(ReANY(rx_sv)))
+#  define RXp_MOTHER_RE(prog)             ((prog)->mother_re)
+#  define RX_MOTHER_RE(rx_sv)             (RXp_MOTHER_RE(ReANY(rx_sv)))
+#  define RXp_PRE_PREFIX(prog)            ((prog)->pre_prefix)
+#  define RX_PRE_PREFIX(rx_sv)            (RXp_PRE_PREFIX(ReANY(rx_sv)))
+
 /* last match was zero-length */
 #  define RXp_ZERO_LEN(prog) \
-        (RXp_OFFS(prog)[0].start + (SSize_t)RXp_GOFS(prog) \
-          == RXp_OFFS(prog)[0].end)
+        (RXp_OFFS_START(prog,0) + (SSize_t)RXp_GOFS(prog) \
+          == RXp_OFFS_END(prog,0))
 #  define RX_ZERO_LEN(rx_sv)              (RXp_ZERO_LEN(ReANY(rx_sv)))
 
 #endif /* PLUGGABLE_RE_EXTENSION */
@@ -557,20 +625,24 @@ and check for NULL.
 /* Stuff that needs to be included in the pluggable extension goes below here */
 
 #ifdef PERL_ANY_COW
-#  define RXp_MATCH_COPY_FREE(prog) \
-        STMT_START {if (RXp_SAVED_COPY(prog)) { \
-            SV_CHECK_THINKFIRST_COW_DROP(RXp_SAVED_COPY(prog)); \
-        } \
-        if (RXp_MATCH_COPIED(prog)) { \
-            Safefree(RXp_SUBBEG(prog)); \
-            RXp_MATCH_COPIED_off(prog); \
-        }} STMT_END
+#  define RXp_MATCH_COPY_FREE(prog)                                 \
+    STMT_START {                                                    \
+        if (RXp_SAVED_COPY(prog)) {                                 \
+            SV_CHECK_THINKFIRST_COW_DROP(RXp_SAVED_COPY(prog));     \
+        }                                                           \
+        if (RXp_MATCH_COPIED(prog)) {                               \
+            Safefree(RXp_SUBBEG(prog));                             \
+            RXp_MATCH_COPIED_off(prog);                             \
+        }                                                           \
+    } STMT_END
 #else
-#  define RXp_MATCH_COPY_FREE(prog) \
-        STMT_START {if (RXp_MATCH_COPIED(prog)) { \
-            Safefree(RXp_SUBBEG(prog)); \
-            RXp_MATCH_COPIED_off(prog); \
-        }} STMT_END
+#  define RXp_MATCH_COPY_FREE(prog)                     \
+    STMT_START {                                        \
+        if (RXp_MATCH_COPIED(prog)) {                   \
+            Safefree(RXp_SUBBEG(prog));                 \
+            RXp_MATCH_COPIED_off(prog);                 \
+        }                                               \
+    } STMT_END
 #endif
 #define RX_MATCH_COPY_FREE(rx_sv)       RXp_MATCH_COPY_FREE(ReANY(rx_sv))
 
@@ -779,43 +851,71 @@ typedef struct regmatch_state {
             struct regmatch_state *prev_yes_state;
         } yes;
 
+
+        /* NOTE: Regarding 'cp' and 'lastcp' in the following structs...
+         *
+         * In the majority of cases we use 'cp' for the "normal"
+         * checkpoint for paren saves, and 'lastcp' for the addtional
+         * paren saves that are done only under RE_PESSIMISTIC_PARENS.
+         *
+         * There may be a few cases where both are used always.
+         * Regardless they tend be used something like this:
+         *
+         *   ST.cp = regcppush(rex, 0, maxopenparen);
+         *   REGCP_SET(ST.lastcp);
+         *
+         * thus ST.cp holds the checkpoint from before we push parens,
+         * and ST.lastcp holds the checkpoint from afterwards.
+         */
+
         /* branchlike members */
         /* this is a fake union member that matches the first elements
          * of each member that needs to behave like a branch */
         struct {
             /* this first element must match u.yes */
             struct regmatch_state *prev_yes_state;
-            U32 lastparen;
-            U32 lastcloseparen;
-            CHECKPOINT cp;
+            U32         lastparen;
+            U32         lastcloseparen;
+            CHECKPOINT  cp;         /* see note above "struct branchlike" */
+            CHECKPOINT  lastcp;     /* see note above "struct branchlike" */
+            U16         before_paren;
+            U16         after_paren;
 
         } branchlike;
 
         struct {
             /* the first elements must match u.branchlike */
             struct regmatch_state *prev_yes_state;
-            U32 lastparen;
-            U32 lastcloseparen;
-            CHECKPOINT cp;
-
-            regnode *next_branch; /* next branch node */
+            U32         lastparen;
+            U32         lastcloseparen;
+            CHECKPOINT  cp;         /* see note above "struct branchlike" */
+            CHECKPOINT  lastcp;     /* see note above "struct branchlike" */
+            U16         before_paren;
+            U16         after_paren;
+
+            regnode *next_branch;   /* next branch node */
         } branch;
 
         struct {
             /* the first elements must match u.branchlike */
             struct regmatch_state *prev_yes_state;
-            U32 lastparen;
-            U32 lastcloseparen;
-            CHECKPOINT cp;
-
-            U32                accepted; /* how many accepting states left */
-            bool       longfold;/* saw a fold with a 1->n char mapping */
-            U16         *jump;  /* positive offsets from me */
-            regnode    *me;    /* Which node am I - needed for jump tries*/
-            U8         *firstpos;/* pos in string of first trie match */
-            U32                firstchars;/* len in chars of firstpos from start */
-            U16                nextword;/* next word to try */
-            U16                topword; /* longest accepted word */
+            U32         lastparen;
+            U32         lastcloseparen;
+            CHECKPOINT  cp;         /* see note above "struct branchlike" */
+            CHECKPOINT  lastcp;     /* see note above "struct branchlike" */
+            U16         before_paren;
+            U16         after_paren;
+
+            U32         accepted;   /* how many accepting states left */
+            bool        longfold;   /* saw a fold with a 1->n char mapping */
+            U16         *jump;      /* positive offsets from me */
+            U16         *j_before_paren;
+            U16         *j_after_paren;
+            regnode     *me;        /* Which node am I - needed for jump tries*/
+            U8          *firstpos;  /* pos in string of first trie match */
+            U32         firstchars; /* len in chars of firstpos from start */
+            U16         nextword;   /* next word to try */
+            U16         topword;    /* longest accepted word */
         } trie;
 
         /* special types - these members are used to store state for special
@@ -826,31 +926,31 @@ typedef struct regmatch_state {
             struct regmatch_state *prev_curlyx;
             struct regmatch_state *prev_eval;
             REGEXP     *prev_rex;
-            CHECKPOINT cp;     /* remember current savestack indexes */
-            CHECKPOINT lastcp;
-            U32         close_paren; /* which close bracket is our end (+1) */
-            regnode    *B;     /* the node following us  */
+            CHECKPOINT  cp;             /* see note above "struct branchlike" */
+            CHECKPOINT  lastcp;         /* see note above "struct branchlike" */
+            U32         close_paren;    /* which close bracket is our end (+1) */
+            regnode     *B;             /* the node following us  */
             char        *prev_recurse_locinput;
         } eval;
 
         struct {
             /* this first element must match u.yes */
             struct regmatch_state *prev_yes_state;
-            I32 wanted;
-            I32 logical;       /* saved copy of 'logical' var */
-            U8  count;          /* number of beginning positions */
-            char *start;
-            char *end;
-            regnode  *me; /* the IFMATCH/SUSPEND/UNLESSM node  */
-            char *prev_match_end;
-        } ifmatch; /* and SUSPEND/UNLESSM */
+            I32     wanted;
+            I32     logical;    /* saved copy of 'logical' var */
+            U8      count;      /* number of beginning positions */
+            char    *start;
+            char    *end;
+            regnode *me;        /* the IFMATCH/SUSPEND/UNLESSM node  */
+            char    *prev_match_end;
+        } ifmatch;              /* and SUSPEND/UNLESSM */
 
         struct {
             /* this first element must match u.yes */
             struct regmatch_state *prev_yes_state;
             struct regmatch_state *prev_mark;
-            SVmark_name;
-            char *mark_loc;
+            SV      *mark_name;
+            char    *mark_loc;
         } mark;
 
         struct {
@@ -863,24 +963,25 @@ typedef struct regmatch_state {
             /* this first element must match u.yes */
             struct regmatch_state *prev_yes_state;
             struct regmatch_state *prev_curlyx; /* previous cur_curlyx */
-            regnode    *me;    /* the CURLYX node  */
-            regnode    *B;     /* the B node in /A*B/  */
-            CHECKPOINT cp;     /* remember current savestack index */
+            regnode     *me;        /* the CURLYX node  */
+            regnode     *B;         /* the B node in /A*B/  */
+            CHECKPOINT  cp;         /* see note above "struct branchlike" */
+            CHECKPOINT  lastcp;     /* see note above "struct branchlike" */
             bool       minmod;
-            int                parenfloor;/* how far back to strip paren data */
+            int         parenfloor; /* how far back to strip paren data */
 
             /* these two are modified by WHILEM */
-            int                count;  /* how many instances of A we've matched */
-            char       *lastloc;/* where previous A matched (0-len detect) */
+            int         count;      /* how many instances of A we've matched */
+            char        *lastloc;   /* where previous A matched (0-len detect) */
         } curlyx;
 
         struct {
             /* this first element must match u.yes */
             struct regmatch_state *prev_yes_state;
             struct regmatch_state *save_curlyx;
-            CHECKPOINT cp;     /* remember current savestack indexes */
-            CHECKPOINT lastcp;
-            char       *save_lastloc;  /* previous curlyx.lastloc */
+            CHECKPOINT  cp;             /* see note above "struct branchlike" */
+            CHECKPOINT  lastcp;         /* see note above "struct branchlike" */
+            char        *save_lastloc;  /* previous curlyx.lastloc */
             I32                cache_offset;
             I32                cache_mask;
         } whilem;
@@ -888,30 +989,36 @@ typedef struct regmatch_state {
         struct {
             /* this first element must match u.yes */
             struct regmatch_state *prev_yes_state;
-            CHECKPOINT cp;
-            U32 lastparen;
-            U32 lastcloseparen;
-            I32 alen;          /* length of first-matched A string */
-            I32 count;
-            bool minmod;
-            regnode *A, *B;    /* the nodes corresponding to /A*B/  */
-            regnode *me;       /* the curlym node */
+            U32         lastparen;
+            U32         lastcloseparen;
+            CHECKPOINT  cp;         /* see note above "struct branchlike" */
+            CHECKPOINT  lastcp;     /* see note above "struct branchlike" */
+            I32         alen;       /* length of first-matched A string */
+            I32         count;
+            bool        minmod;
+            regnode     *A, *B;     /* the nodes corresponding to /A*B/  */
+            regnode     *me;        /* the curlym node */
             struct next_matchable_info Binfo;
         } curlym;
 
         struct {
-            U32 paren;
-            CHECKPOINT cp;
-            U32 lastparen;
-            U32 lastcloseparen;
-            char *maxpos;      /* highest possible point in string to match */
-            char *oldloc;      /* the previous locinput */
-            int count;
-            int min, max;      /* {m,n} */
-            regnode *A, *B;    /* the nodes corresponding to /A*B/  */
+            U32         paren;
+            U32         lastparen;
+            U32         lastcloseparen;
+            CHECKPOINT  cp;         /* see note above "struct branchlike" */
+            CHECKPOINT  lastcp;     /* see note above "struct branchlike" */
+            char        *maxpos;    /* highest possible point in string to match */
+            char        *oldloc;    /* the previous locinput */
+            int         count;
+            int         min, max;   /* {m,n} */
+            regnode     *A, *B;     /* the nodes corresponding to /A*B/  */
             struct next_matchable_info Binfo;
         } curly; /* and CURLYN/PLUS/STAR */
 
+        struct {
+            CHECKPOINT  cp;
+            CHECKPOINT  lastcp;
+        } backref; /* REF and friends */
     } u;
 } regmatch_state;
 
@@ -930,6 +1037,7 @@ typedef struct regmatch_slab {
 } regmatch_slab;
 
 
+#define REG_FETCH_ABSOLUTE 1
 
 /*
  * ex: set ts=8 sts=4 sw=4 et:
index 36e7998..17a8422 100644 (file)
-/* -*- buffer-read-only: t -*-
+/* -*- mode: C; buffer-read-only: t -*-
    !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!!
-   This file is built by regen/regcomp.pl from regcomp.sym.
+   This file is built by regen/regcomp.pl from regcomp.sym, op_reg_common.h
+   and regexp.h.
    Any changes made here will be lost!
  */
 
 #if defined(PERL_CORE) || defined(PERL_EXT_RE_BUILD)
 
+
+/* typedefs for regex nodes - one typedef per node type */
+
+typedef struct regnode_2                         tregnode_ACCEPT;
+typedef struct regnode_1                         tregnode_AHOCORASICK;
+typedef struct regnode_charclass                 tregnode_AHOCORASICKC;
+typedef struct regnode_charclass                 tregnode_ANYOF;
+typedef struct regnode_charclass                 tregnode_ANYOFD;
+typedef struct regnode_1                         tregnode_ANYOFH;
+typedef struct regnode_1                         tregnode_ANYOFHb;
+typedef struct regnode_bbm                       tregnode_ANYOFHbbm;
+typedef struct regnode_1                         tregnode_ANYOFHr;
+typedef struct regnode_1                         tregnode_ANYOFHs;
+typedef struct regnode_charclass                 tregnode_ANYOFL;
+typedef struct regnode_1                         tregnode_ANYOFM;
+typedef struct regnode_charclass_posixl          tregnode_ANYOFPOSIXL;
+typedef struct regnode_1                         tregnode_ANYOFR;
+typedef struct regnode_1                         tregnode_ANYOFRb;
+typedef struct regnode                           tregnode_BOUND;
+typedef struct regnode                           tregnode_BOUNDA;
+typedef struct regnode                           tregnode_BOUNDL;
+typedef struct regnode                           tregnode_BOUNDU;
+typedef struct regnode_1                         tregnode_BRANCH;
+typedef struct regnode_2                         tregnode_BRANCHJ;
+typedef struct regnode_1                         tregnode_CLOSE;
+typedef struct regnode                           tregnode_CLUMP;
+typedef struct regnode_1                         tregnode_COMMIT;
+typedef struct regnode_3                         tregnode_CURLY;
+typedef struct regnode_3                         tregnode_CURLYM;
+typedef struct regnode_3                         tregnode_CURLYN;
+typedef struct regnode_3                         tregnode_CURLYX;
+typedef struct regnode_1                         tregnode_CUTGROUP;
+typedef struct regnode_1                         tregnode_DEFINEP;
+typedef struct regnode                           tregnode_END;
+typedef struct regnode                           tregnode_ENDLIKE;
+typedef struct regnode                           tregnode_EOS;
+typedef struct regnode_2                         tregnode_EVAL;
+typedef struct regnode                           tregnode_EXACT;
+typedef struct regnode                           tregnode_EXACTF;
+typedef struct regnode                           tregnode_EXACTFAA;
+typedef struct regnode                           tregnode_EXACTFAA_NO_TRIE;
+typedef struct regnode                           tregnode_EXACTFL;
+typedef struct regnode                           tregnode_EXACTFLU8;
+typedef struct regnode                           tregnode_EXACTFU;
+typedef struct regnode                           tregnode_EXACTFUP;
+typedef struct regnode                           tregnode_EXACTFU_REQ8;
+typedef struct regnode                           tregnode_EXACTFU_S_EDGE;
+typedef struct regnode                           tregnode_EXACTL;
+typedef struct regnode                           tregnode_EXACT_REQ8;
+typedef struct regnode_2                         tregnode_GOSUB;
+typedef struct regnode                           tregnode_GPOS;
+typedef struct regnode_1                         tregnode_GROUPP;
+typedef struct regnode_1                         tregnode_GROUPPN;
+typedef struct regnode_1                         tregnode_IFMATCH;
+typedef struct regnode_1                         tregnode_IFTHEN;
+typedef struct regnode_1                         tregnode_INSUBP;
+typedef struct regnode                           tregnode_KEEPS;
+typedef struct regnode_1                         tregnode_LEXACT;
+typedef struct regnode_1                         tregnode_LEXACT_REQ8;
+typedef struct regnode                           tregnode_LNBREAK;
+typedef struct regnode                           tregnode_LOGICAL;
+typedef struct regnode_1                         tregnode_LONGJMP;
+typedef struct regnode                           tregnode_LOOKBEHIND_END;
+typedef struct regnode_1                         tregnode_MARKPOINT;
+typedef struct regnode                           tregnode_MBOL;
+typedef struct regnode                           tregnode_MEOL;
+typedef struct regnode                           tregnode_MINMOD;
+typedef struct regnode_1                         tregnode_NANYOFM;
+typedef struct regnode                           tregnode_NBOUND;
+typedef struct regnode                           tregnode_NBOUNDA;
+typedef struct regnode                           tregnode_NBOUNDL;
+typedef struct regnode                           tregnode_NBOUNDU;
+typedef struct regnode                           tregnode_NOTHING;
+typedef struct regnode                           tregnode_NPOSIXA;
+typedef struct regnode                           tregnode_NPOSIXD;
+typedef struct regnode                           tregnode_NPOSIXL;
+typedef struct regnode                           tregnode_NPOSIXU;
+typedef struct regnode_1                         tregnode_OPEN;
+typedef struct regnode_1                         tregnode_OPFAIL;
+typedef struct regnode                           tregnode_OPTIMIZED;
+typedef struct regnode                           tregnode_PLUS;
+typedef struct regnode                           tregnode_POSIXA;
+typedef struct regnode                           tregnode_POSIXD;
+typedef struct regnode                           tregnode_POSIXL;
+typedef struct regnode                           tregnode_POSIXU;
+typedef struct regnode_1                         tregnode_PRUNE;
+typedef struct regnode                           tregnode_PSEUDO;
+typedef struct regnode_2                         tregnode_REF;
+typedef struct regnode_2                         tregnode_REFF;
+typedef struct regnode_2                         tregnode_REFFA;
+typedef struct regnode_2                         tregnode_REFFAN;
+typedef struct regnode_2                         tregnode_REFFL;
+typedef struct regnode_2                         tregnode_REFFLN;
+typedef struct regnode_2                         tregnode_REFFN;
+typedef struct regnode_2                         tregnode_REFFU;
+typedef struct regnode_2                         tregnode_REFFUN;
+typedef struct regnode_2                         tregnode_REFN;
+typedef struct regnode_p                         tregnode_REGEX_SET;
+typedef struct regnode                           tregnode_REG_ANY;
+typedef struct regnode_1                         tregnode_RENUM;
+typedef struct regnode                           tregnode_SANY;
+typedef struct regnode                           tregnode_SBOL;
+typedef struct regnode                           tregnode_SEOL;
+typedef struct regnode_1                         tregnode_SKIP;
+typedef struct regnode                           tregnode_SRCLOSE;
+typedef struct regnode                           tregnode_SROPEN;
+typedef struct regnode                           tregnode_STAR;
+typedef struct regnode                           tregnode_SUCCEED;
+typedef struct regnode_1                         tregnode_SUSPEND;
+typedef struct regnode                           tregnode_TAIL;
+typedef struct regnode_1                         tregnode_TRIE;
+typedef struct regnode_charclass                 tregnode_TRIEC;
+typedef struct regnode_1                         tregnode_UNLESSM;
+typedef struct regnode_1                         tregnode_VERB;
+typedef struct regnode                           tregnode_WHILEM;
+
+/* end typedefs */
+
 /* Regops and State definitions */
 
-#define REGNODE_MAX            110
-#define REGMATCH_STATE_MAX     150
+#define REGNODE_MAX            111
+#define REGMATCH_STATE_MAX     153
 
 /* -- For regexec.c to switch on target being utf8 (t8) or not (tb, b='byte'); */
 #define with_t_UTF8ness(op, t_utf8) (((op) << 1) + (cBOOL(t_utf8)))
 #define ANYOFRb_t8_pb                     110  /*      0x06e */
 #define ANYOFRb_t8_p8                     111  /*      0x06f */
 
-#define ANYOFM                       28        /* 0x1c Like ANYOF, but matches
+#define ANYOFHbbm                    28        /* 0x1c Like ANYOFHb, but only
+                                                  for 2-byte UTF-8 characters;
+                                                  uses a bitmap to match the
+                                                  continuation byte */
+#define ANYOFHbbm_tb                    56     /*      0x038 */
+#define ANYOFHbbm_t8                    57     /*      0x039 */
+#define ANYOFHbbm_tb_pb                   112  /*      0x070 */
+#define ANYOFHbbm_tb_p8                   113  /*      0x071 */
+#define ANYOFHbbm_t8_pb                   114  /*      0x072 */
+#define ANYOFHbbm_t8_p8                   115  /*      0x073 */
+
+#define ANYOFM                       29        /* 0x1d Like ANYOF, but matches
                                                   an invariant byte as
                                                   determined by the mask and
                                                   arg */
-#define ANYOFM_tb                       56     /*      0x038 */
-#define ANYOFM_t8                       57     /*      0x039 */
-#define ANYOFM_tb_pb                      112  /*      0x070 */
-#define ANYOFM_tb_p8                      113  /*      0x071 */
-#define ANYOFM_t8_pb                      114  /*      0x072 */
-#define ANYOFM_t8_p8                      115  /*      0x073 */
-
-#define NANYOFM                      29        /* 0x1d complement of ANYOFM */
-#define NANYOFM_tb                      58     /*      0x03a */
-#define NANYOFM_t8                      59     /*      0x03b */
-#define NANYOFM_tb_pb                     116  /*      0x074 */
-#define NANYOFM_tb_p8                     117  /*      0x075 */
-#define NANYOFM_t8_pb                     118  /*      0x076 */
-#define NANYOFM_t8_p8                     119  /*      0x077 */
-
-#define POSIXD                       30        /* 0x1e Some [[:class:]] under
+#define ANYOFM_tb                       58     /*      0x03a */
+#define ANYOFM_t8                       59     /*      0x03b */
+#define ANYOFM_tb_pb                      116  /*      0x074 */
+#define ANYOFM_tb_p8                      117  /*      0x075 */
+#define ANYOFM_t8_pb                      118  /*      0x076 */
+#define ANYOFM_t8_p8                      119  /*      0x077 */
+
+#define NANYOFM                      30        /* 0x1e complement of ANYOFM */
+#define NANYOFM_tb                      60     /*      0x03c */
+#define NANYOFM_t8                      61     /*      0x03d */
+#define NANYOFM_tb_pb                     120  /*      0x078 */
+#define NANYOFM_tb_p8                     121  /*      0x079 */
+#define NANYOFM_t8_pb                     122  /*      0x07a */
+#define NANYOFM_t8_p8                     123  /*      0x07b */
+
+#define POSIXD                       31        /* 0x1f Some [[:class:]] under
                                                   /d; the FLAGS field gives
                                                   which one */
-#define POSIXD_tb                       60     /*      0x03c */
-#define POSIXD_t8                       61     /*      0x03d */
-#define POSIXD_tb_pb                      120  /*      0x078 */
-#define POSIXD_tb_p8                      121  /*      0x079 */
-#define POSIXD_t8_pb                      122  /*      0x07a */
-#define POSIXD_t8_p8                      123  /*      0x07b */
-
-#define POSIXL                       31        /* 0x1f Some [[:class:]] under
+#define POSIXD_tb                       62     /*      0x03e */
+#define POSIXD_t8                       63     /*      0x03f */
+#define POSIXD_tb_pb                      124  /*      0x07c */
+#define POSIXD_tb_p8                      125  /*      0x07d */
+#define POSIXD_t8_pb                      126  /*      0x07e */
+#define POSIXD_t8_p8                      127  /*      0x07f */
+
+#define POSIXL                       32        /* 0x20 Some [[:class:]] under
                                                   /l; the FLAGS field gives
                                                   which one */
-#define POSIXL_tb                       62     /*      0x03e */
-#define POSIXL_t8                       63     /*      0x03f */
-#define POSIXL_tb_pb                      124  /*      0x07c */
-#define POSIXL_tb_p8                      125  /*      0x07d */
-#define POSIXL_t8_pb                      126  /*      0x07e */
-#define POSIXL_t8_p8                      127  /*      0x07f */
-
-#define POSIXU                       32        /* 0x20 Some [[:class:]] under
+#define POSIXL_tb                       64     /*      0x040 */
+#define POSIXL_t8                       65     /*      0x041 */
+#define POSIXL_tb_pb                      128  /*      0x080 */
+#define POSIXL_tb_p8                      129  /*      0x081 */
+#define POSIXL_t8_pb                      130  /*      0x082 */
+#define POSIXL_t8_p8                      131  /*      0x083 */
+
+#define POSIXU                       33        /* 0x21 Some [[:class:]] under
                                                   /u; the FLAGS field gives
                                                   which one */
-#define POSIXU_tb                       64     /*      0x040 */
-#define POSIXU_t8                       65     /*      0x041 */
-#define POSIXU_tb_pb                      128  /*      0x080 */
-#define POSIXU_tb_p8                      129  /*      0x081 */
-#define POSIXU_t8_pb                      130  /*      0x082 */
-#define POSIXU_t8_p8                      131  /*      0x083 */
-
-#define POSIXA                       33        /* 0x21 Some [[:class:]] under
+#define POSIXU_tb                       66     /*      0x042 */
+#define POSIXU_t8                       67     /*      0x043 */
+#define POSIXU_tb_pb                      132  /*      0x084 */
+#define POSIXU_tb_p8                      133  /*      0x085 */
+#define POSIXU_t8_pb                      134  /*      0x086 */
+#define POSIXU_t8_p8                      135  /*      0x087 */
+
+#define POSIXA                       34        /* 0x22 Some [[:class:]] under
                                                   /a; the FLAGS field gives
                                                   which one */
-#define POSIXA_tb                       66     /*      0x042 */
-#define POSIXA_t8                       67     /*      0x043 */
-#define POSIXA_tb_pb                      132  /*      0x084 */
-#define POSIXA_tb_p8                      133  /*      0x085 */
-#define POSIXA_t8_pb                      134  /*      0x086 */
-#define POSIXA_t8_p8                      135  /*      0x087 */
-
-#define NPOSIXD                      34        /* 0x22 complement of POSIXD,
+#define POSIXA_tb                       68     /*      0x044 */
+#define POSIXA_t8                       69     /*      0x045 */
+#define POSIXA_tb_pb                      136  /*      0x088 */
+#define POSIXA_tb_p8                      137  /*      0x089 */
+#define POSIXA_t8_pb                      138  /*      0x08a */
+#define POSIXA_t8_p8                      139  /*      0x08b */
+
+#define NPOSIXD                      35        /* 0x23 complement of POSIXD,
                                                   [[:^class:]] */
-#define NPOSIXD_tb                      68     /*      0x044 */
-#define NPOSIXD_t8                      69     /*      0x045 */
-#define NPOSIXD_tb_pb                     136  /*      0x088 */
-#define NPOSIXD_tb_p8                     137  /*      0x089 */
-#define NPOSIXD_t8_pb                     138  /*      0x08a */
-#define NPOSIXD_t8_p8                     139  /*      0x08b */
-
-#define NPOSIXL                      35        /* 0x23 complement of POSIXL,
+#define NPOSIXD_tb                      70     /*      0x046 */
+#define NPOSIXD_t8                      71     /*      0x047 */
+#define NPOSIXD_tb_pb                     140  /*      0x08c */
+#define NPOSIXD_tb_p8                     141  /*      0x08d */
+#define NPOSIXD_t8_pb                     142  /*      0x08e */
+#define NPOSIXD_t8_p8                     143  /*      0x08f */
+
+#define NPOSIXL                      36        /* 0x24 complement of POSIXL,
                                                   [[:^class:]] */
-#define NPOSIXL_tb                      70     /*      0x046 */
-#define NPOSIXL_t8                      71     /*      0x047 */
-#define NPOSIXL_tb_pb                     140  /*      0x08c */
-#define NPOSIXL_tb_p8                     141  /*      0x08d */
-#define NPOSIXL_t8_pb                     142  /*      0x08e */
-#define NPOSIXL_t8_p8                     143  /*      0x08f */
-
-#define NPOSIXU                      36        /* 0x24 complement of POSIXU,
+#define NPOSIXL_tb                      72     /*      0x048 */
+#define NPOSIXL_t8                      73     /*      0x049 */
+#define NPOSIXL_tb_pb                     144  /*      0x090 */
+#define NPOSIXL_tb_p8                     145  /*      0x091 */
+#define NPOSIXL_t8_pb                     146  /*      0x092 */
+#define NPOSIXL_t8_p8                     147  /*      0x093 */
+
+#define NPOSIXU                      37        /* 0x25 complement of POSIXU,
                                                   [[:^class:]] */
-#define NPOSIXU_tb                      72     /*      0x048 */
-#define NPOSIXU_t8                      73     /*      0x049 */
-#define NPOSIXU_tb_pb                     144  /*      0x090 */
-#define NPOSIXU_tb_p8                     145  /*      0x091 */
-#define NPOSIXU_t8_pb                     146  /*      0x092 */
-#define NPOSIXU_t8_p8                     147  /*      0x093 */
-
-#define NPOSIXA                      37        /* 0x25 complement of POSIXA,
+#define NPOSIXU_tb                      74     /*      0x04a */
+#define NPOSIXU_t8                      75     /*      0x04b */
+#define NPOSIXU_tb_pb                     148  /*      0x094 */
+#define NPOSIXU_tb_p8                     149  /*      0x095 */
+#define NPOSIXU_t8_pb                     150  /*      0x096 */
+#define NPOSIXU_t8_p8                     151  /*      0x097 */
+
+#define NPOSIXA                      38        /* 0x26 complement of POSIXA,
                                                   [[:^class:]] */
-#define NPOSIXA_tb                      74     /*      0x04a */
-#define NPOSIXA_t8                      75     /*      0x04b */
-#define NPOSIXA_tb_pb                     148  /*      0x094 */
-#define NPOSIXA_tb_p8                     149  /*      0x095 */
-#define NPOSIXA_t8_pb                     150  /*      0x096 */
-#define NPOSIXA_t8_p8                     151  /*      0x097 */
-
-#define CLUMP                        38        /* 0x26 Match any extended
+#define NPOSIXA_tb                      76     /*      0x04c */
+#define NPOSIXA_t8                      77     /*      0x04d */
+#define NPOSIXA_tb_pb                     152  /*      0x098 */
+#define NPOSIXA_tb_p8                     153  /*      0x099 */
+#define NPOSIXA_t8_pb                     154  /*      0x09a */
+#define NPOSIXA_t8_p8                     155  /*      0x09b */
+
+#define CLUMP                        39        /* 0x27 Match any extended
                                                   grapheme cluster sequence */
-#define CLUMP_tb                        76     /*      0x04c */
-#define CLUMP_t8                        77     /*      0x04d */
-#define CLUMP_tb_pb                       152  /*      0x098 */
-#define CLUMP_tb_p8                       153  /*      0x099 */
-#define CLUMP_t8_pb                       154  /*      0x09a */
-#define CLUMP_t8_p8                       155  /*      0x09b */
-
-#define BRANCH                       39        /* 0x27 Match this alternative,
+#define CLUMP_tb                        78     /*      0x04e */
+#define CLUMP_t8                        79     /*      0x04f */
+#define CLUMP_tb_pb                       156  /*      0x09c */
+#define CLUMP_tb_p8                       157  /*      0x09d */
+#define CLUMP_t8_pb                       158  /*      0x09e */
+#define CLUMP_t8_p8                       159  /*      0x09f */
+
+#define BRANCH                       40        /* 0x28 Match this alternative,
                                                   or the next... */
-#define BRANCH_tb                       78     /*      0x04e */
-#define BRANCH_t8                       79     /*      0x04f */
-#define BRANCH_tb_pb                      156  /*      0x09c */
-#define BRANCH_tb_p8                      157  /*      0x09d */
-#define BRANCH_t8_pb                      158  /*      0x09e */
-#define BRANCH_t8_p8                      159  /*      0x09f */
-
-#define EXACT                        40        /* 0x28 Match this string
+#define BRANCH_tb                       80     /*      0x050 */
+#define BRANCH_t8                       81     /*      0x051 */
+#define BRANCH_tb_pb                      160  /*      0x0a0 */
+#define BRANCH_tb_p8                      161  /*      0x0a1 */
+#define BRANCH_t8_pb                      162  /*      0x0a2 */
+#define BRANCH_t8_p8                      163  /*      0x0a3 */
+
+#define EXACT                        41        /* 0x29 Match this string
                                                   (flags field is the length).
                                                */
-#define EXACT_tb                        80     /*      0x050 */
-#define EXACT_t8                        81     /*      0x051 */
-#define EXACT_tb_pb                       160  /*      0x0a0 */
-#define EXACT_tb_p8                       161  /*      0x0a1 */
-#define EXACT_t8_pb                       162  /*      0x0a2 */
-#define EXACT_t8_p8                       163  /*      0x0a3 */
-
-#define LEXACT                       41        /* 0x29 Match this long string
+#define EXACT_tb                        82     /*      0x052 */
+#define EXACT_t8                        83     /*      0x053 */
+#define EXACT_tb_pb                       164  /*      0x0a4 */
+#define EXACT_tb_p8                       165  /*      0x0a5 */
+#define EXACT_t8_pb                       166  /*      0x0a6 */
+#define EXACT_t8_p8                       167  /*      0x0a7 */
+
+#define LEXACT                       42        /* 0x2a Match this long string
                                                   (preceded by length; flags
                                                   unused). */
-#define LEXACT_tb                       82     /*      0x052 */
-#define LEXACT_t8                       83     /*      0x053 */
-#define LEXACT_tb_pb                      164  /*      0x0a4 */
-#define LEXACT_tb_p8                      165  /*      0x0a5 */
-#define LEXACT_t8_pb                      166  /*      0x0a6 */
-#define LEXACT_t8_p8                      167  /*      0x0a7 */
-
-#define EXACTL                       42        /* 0x2a Like EXACT, but /l is
+#define LEXACT_tb                       84     /*      0x054 */
+#define LEXACT_t8                       85     /*      0x055 */
+#define LEXACT_tb_pb                      168  /*      0x0a8 */
+#define LEXACT_tb_p8                      169  /*      0x0a9 */
+#define LEXACT_t8_pb                      170  /*      0x0aa */
+#define LEXACT_t8_p8                      171  /*      0x0ab */
+
+#define EXACTL                       43        /* 0x2b Like EXACT, but /l is
                                                   in effect (used so
                                                   locale-related warnings can
                                                   be checked for) */
-#define EXACTL_tb                       84     /*      0x054 */
-#define EXACTL_t8                       85     /*      0x055 */
-#define EXACTL_tb_pb                      168  /*      0x0a8 */
-#define EXACTL_tb_p8                      169  /*      0x0a9 */
-#define EXACTL_t8_pb                      170  /*      0x0aa */
-#define EXACTL_t8_p8                      171  /*      0x0ab */
-
-#define EXACTF                       43        /* 0x2b Like EXACT, but match
+#define EXACTL_tb                       86     /*      0x056 */
+#define EXACTL_t8                       87     /*      0x057 */
+#define EXACTL_tb_pb                      172  /*      0x0ac */
+#define EXACTL_tb_p8                      173  /*      0x0ad */
+#define EXACTL_t8_pb                      174  /*      0x0ae */
+#define EXACTL_t8_p8                      175  /*      0x0af */
+
+#define EXACTF                       44        /* 0x2c Like EXACT, but match
                                                   using /id rules; (string not
                                                   UTF-8, ASCII folded;
                                                   non-ASCII not) */
-#define EXACTF_tb                       86     /*      0x056 */
-#define EXACTF_t8                       87     /*      0x057 */
-#define EXACTF_tb_pb                      172  /*      0x0ac */
-#define EXACTF_tb_p8                      173  /*      0x0ad */
-#define EXACTF_t8_pb                      174  /*      0x0ae */
-#define EXACTF_t8_p8                      175  /*      0x0af */
-
-#define EXACTFL                      44        /* 0x2c Like EXACT, but match
+#define EXACTF_tb                       88     /*      0x058 */
+#define EXACTF_t8                       89     /*      0x059 */
+#define EXACTF_tb_pb                      176  /*      0x0b0 */
+#define EXACTF_tb_p8                      177  /*      0x0b1 */
+#define EXACTF_t8_pb                      178  /*      0x0b2 */
+#define EXACTF_t8_p8                      179  /*      0x0b3 */
+
+#define EXACTFL                      45        /* 0x2d Like EXACT, but match
                                                   using /il rules; (string not
                                                   likely to be folded) */
-#define EXACTFL_tb                      88     /*      0x058 */
-#define EXACTFL_t8                      89     /*      0x059 */
-#define EXACTFL_tb_pb                     176  /*      0x0b0 */
-#define EXACTFL_tb_p8                     177  /*      0x0b1 */
-#define EXACTFL_t8_pb                     178  /*      0x0b2 */
-#define EXACTFL_t8_p8                     179  /*      0x0b3 */
-
-#define EXACTFU                      45        /* 0x2d Like EXACT, but match
+#define EXACTFL_tb                      90     /*      0x05a */
+#define EXACTFL_t8                      91     /*      0x05b */
+#define EXACTFL_tb_pb                     180  /*      0x0b4 */
+#define EXACTFL_tb_p8                     181  /*      0x0b5 */
+#define EXACTFL_t8_pb                     182  /*      0x0b6 */
+#define EXACTFL_t8_p8                     183  /*      0x0b7 */
+
+#define EXACTFU                      46        /* 0x2e Like EXACT, but match
                                                   using /iu rules; (string
                                                   folded) */
-#define EXACTFU_tb                      90     /*      0x05a */
-#define EXACTFU_t8                      91     /*      0x05b */
-#define EXACTFU_tb_pb                     180  /*      0x0b4 */
-#define EXACTFU_tb_p8                     181  /*      0x0b5 */
-#define EXACTFU_t8_pb                     182  /*      0x0b6 */
-#define EXACTFU_t8_p8                     183  /*      0x0b7 */
-
-#define EXACTFAA                     46        /* 0x2e Like EXACT, but match
+#define EXACTFU_tb                      92     /*      0x05c */
+#define EXACTFU_t8                      93     /*      0x05d */
+#define EXACTFU_tb_pb                     184  /*      0x0b8 */
+#define EXACTFU_tb_p8                     185  /*      0x0b9 */
+#define EXACTFU_t8_pb                     186  /*      0x0ba */
+#define EXACTFU_t8_p8                     187  /*      0x0bb */
+
+#define EXACTFAA                     47        /* 0x2f Like EXACT, but match
                                                   using /iaa rules; (string
                                                   folded except MICRO in
                                                   non-UTF8 patterns; doesn't
                                                   contain SHARP S unless
                                                   UTF-8; folded length <=
                                                   unfolded) */
-#define EXACTFAA_tb                     92     /*      0x05c */
-#define EXACTFAA_t8                     93     /*      0x05d */
-#define EXACTFAA_tb_pb                    184  /*      0x0b8 */
-#define EXACTFAA_tb_p8                    185  /*      0x0b9 */
-#define EXACTFAA_t8_pb                    186  /*      0x0ba */
-#define EXACTFAA_t8_p8                    187  /*      0x0bb */
-
-#define EXACTFAA_NO_TRIE             47        /* 0x2f Like EXACTFAA, (string
+#define EXACTFAA_tb                     94     /*      0x05e */
+#define EXACTFAA_t8                     95     /*      0x05f */
+#define EXACTFAA_tb_pb                    188  /*      0x0bc */
+#define EXACTFAA_tb_p8                    189  /*      0x0bd */
+#define EXACTFAA_t8_pb                    190  /*      0x0be */
+#define EXACTFAA_t8_p8                    191  /*      0x0bf */
+
+#define EXACTFAA_NO_TRIE             48        /* 0x30 Like EXACTFAA, (string
                                                   not UTF-8, folded except:
                                                   MICRO, SHARP S; folded
                                                   length <= unfolded, not
                                                   currently trie-able) */
-#define EXACTFAA_NO_TRIE_tb             94     /*      0x05e */
-#define EXACTFAA_NO_TRIE_t8             95     /*      0x05f */
-#define EXACTFAA_NO_TRIE_tb_pb            188  /*      0x0bc */
-#define EXACTFAA_NO_TRIE_tb_p8            189  /*      0x0bd */
-#define EXACTFAA_NO_TRIE_t8_pb            190  /*      0x0be */
-#define EXACTFAA_NO_TRIE_t8_p8            191  /*      0x0bf */
-
-#define EXACTFUP                     48        /* 0x30 Like EXACT, but match
+#define EXACTFAA_NO_TRIE_tb             96     /*      0x060 */
+#define EXACTFAA_NO_TRIE_t8             97     /*      0x061 */
+#define EXACTFAA_NO_TRIE_tb_pb            192  /*      0x0c0 */
+#define EXACTFAA_NO_TRIE_tb_p8            193  /*      0x0c1 */
+#define EXACTFAA_NO_TRIE_t8_pb            194  /*      0x0c2 */
+#define EXACTFAA_NO_TRIE_t8_p8            195  /*      0x0c3 */
+
+#define EXACTFUP                     49        /* 0x31 Like EXACT, but match
                                                   using /iu rules; (string not
                                                   UTF-8, folded except MICRO:
                                                   hence Problematic) */
-#define EXACTFUP_tb                     96     /*      0x060 */
-#define EXACTFUP_t8                     97     /*      0x061 */
-#define EXACTFUP_tb_pb                    192  /*      0x0c0 */
-#define EXACTFUP_tb_p8                    193  /*      0x0c1 */
-#define EXACTFUP_t8_pb                    194  /*      0x0c2 */
-#define EXACTFUP_t8_p8                    195  /*      0x0c3 */
-
-#define EXACTFLU8                    49        /* 0x31 Like EXACTFU, but use
+#define EXACTFUP_tb                     98     /*      0x062 */
+#define EXACTFUP_t8                     99     /*      0x063 */
+#define EXACTFUP_tb_pb                    196  /*      0x0c4 */
+#define EXACTFUP_tb_p8                    197  /*      0x0c5 */
+#define EXACTFUP_t8_pb                    198  /*      0x0c6 */
+#define EXACTFUP_t8_p8                    199  /*      0x0c7 */
+
+#define EXACTFLU8                    50        /* 0x32 Like EXACTFU, but use
                                                   /il, UTF-8, (string is
                                                   folded, and everything in it
                                                   is above 255 */
-#define EXACTFLU8_tb                    98     /*      0x062 */
-#define EXACTFLU8_t8                    99     /*      0x063 */
-#define EXACTFLU8_tb_pb                   196  /*      0x0c4 */
-#define EXACTFLU8_tb_p8                   197  /*      0x0c5 */
-#define EXACTFLU8_t8_pb                   198  /*      0x0c6 */
-#define EXACTFLU8_t8_p8                   199  /*      0x0c7 */
-
-#define EXACT_REQ8                   50        /* 0x32 Like EXACT, but only
+#define EXACTFLU8_tb                   100     /*      0x064 */
+#define EXACTFLU8_t8                   101     /*      0x065 */
+#define EXACTFLU8_tb_pb                   200  /*      0x0c8 */
+#define EXACTFLU8_tb_p8                   201  /*      0x0c9 */
+#define EXACTFLU8_t8_pb                   202  /*      0x0ca */
+#define EXACTFLU8_t8_p8                   203  /*      0x0cb */
+
+#define EXACT_REQ8                   51        /* 0x33 Like EXACT, but only
                                                   UTF-8 encoded targets can
                                                   match */
-#define EXACT_REQ8_tb                  100     /*      0x064 */
-#define EXACT_REQ8_t8                  101     /*      0x065 */
-#define EXACT_REQ8_tb_pb                  200  /*      0x0c8 */
-#define EXACT_REQ8_tb_p8                  201  /*      0x0c9 */
-#define EXACT_REQ8_t8_pb                  202  /*      0x0ca */
-#define EXACT_REQ8_t8_p8                  203  /*      0x0cb */
-
-#define LEXACT_REQ8                  51        /* 0x33 Like LEXACT, but only
+#define EXACT_REQ8_tb                  102     /*      0x066 */
+#define EXACT_REQ8_t8                  103     /*      0x067 */
+#define EXACT_REQ8_tb_pb                  204  /*      0x0cc */
+#define EXACT_REQ8_tb_p8                  205  /*      0x0cd */
+#define EXACT_REQ8_t8_pb                  206  /*      0x0ce */
+#define EXACT_REQ8_t8_p8                  207  /*      0x0cf */
+
+#define LEXACT_REQ8                  52        /* 0x34 Like LEXACT, but only
                                                   UTF-8 encoded targets can
                                                   match */
-#define LEXACT_REQ8_tb                 102     /*      0x066 */
-#define LEXACT_REQ8_t8                 103     /*      0x067 */
-#define LEXACT_REQ8_tb_pb                 204  /*      0x0cc */
-#define LEXACT_REQ8_tb_p8                 205  /*      0x0cd */
-#define LEXACT_REQ8_t8_pb                 206  /*      0x0ce */
-#define LEXACT_REQ8_t8_p8                 207  /*      0x0cf */
-
-#define EXACTFU_REQ8                 52        /* 0x34 Like EXACTFU, but only
+#define LEXACT_REQ8_tb                 104     /*      0x068 */
+#define LEXACT_REQ8_t8                 105     /*      0x069 */
+#define LEXACT_REQ8_tb_pb                 208  /*      0x0d0 */
+#define LEXACT_REQ8_tb_p8                 209  /*      0x0d1 */
+#define LEXACT_REQ8_t8_pb                 210  /*      0x0d2 */
+#define LEXACT_REQ8_t8_p8                 211  /*      0x0d3 */
+
+#define EXACTFU_REQ8                 53        /* 0x35 Like EXACTFU, but only
                                                   UTF-8 encoded targets can
                                                   match */
-#define EXACTFU_REQ8_tb                104     /*      0x068 */
-#define EXACTFU_REQ8_t8                105     /*      0x069 */
-#define EXACTFU_REQ8_tb_pb                208  /*      0x0d0 */
-#define EXACTFU_REQ8_tb_p8                209  /*      0x0d1 */
-#define EXACTFU_REQ8_t8_pb                210  /*      0x0d2 */
-#define EXACTFU_REQ8_t8_p8                211  /*      0x0d3 */
-
-#define EXACTFU_S_EDGE               53        /* 0x35 /di rules, but nothing
+#define EXACTFU_REQ8_tb                106     /*      0x06a */
+#define EXACTFU_REQ8_t8                107     /*      0x06b */
+#define EXACTFU_REQ8_tb_pb                212  /*      0x0d4 */
+#define EXACTFU_REQ8_tb_p8                213  /*      0x0d5 */
+#define EXACTFU_REQ8_t8_pb                214  /*      0x0d6 */
+#define EXACTFU_REQ8_t8_p8                215  /*      0x0d7 */
+
+#define EXACTFU_S_EDGE               54        /* 0x36 /di rules, but nothing
                                                   in it precludes /ui, except
                                                   begins and/or ends with
                                                   [Ss]; (string not UTF-8;
                                                   compile-time only) */
-#define EXACTFU_S_EDGE_tb              106     /*      0x06a */
-#define EXACTFU_S_EDGE_t8              107     /*      0x06b */
-#define EXACTFU_S_EDGE_tb_pb              212  /*      0x0d4 */
-#define EXACTFU_S_EDGE_tb_p8              213  /*      0x0d5 */
-#define EXACTFU_S_EDGE_t8_pb              214  /*      0x0d6 */
-#define EXACTFU_S_EDGE_t8_p8              215  /*      0x0d7 */
-
-#define LNBREAK                      54        /* 0x36 generic newline pattern
+#define EXACTFU_S_EDGE_tb              108     /*      0x06c */
+#define EXACTFU_S_EDGE_t8              109     /*      0x06d */
+#define EXACTFU_S_EDGE_tb_pb              216  /*      0x0d8 */
+#define EXACTFU_S_EDGE_tb_p8              217  /*      0x0d9 */
+#define EXACTFU_S_EDGE_t8_pb              218  /*      0x0da */
+#define EXACTFU_S_EDGE_t8_p8              219  /*      0x0db */
+
+#define LNBREAK                      55        /* 0x37 generic newline pattern
                                                */
-#define LNBREAK_tb                     108     /*      0x06c */
-#define LNBREAK_t8                     109     /*      0x06d */
-#define LNBREAK_tb_pb                     216  /*      0x0d8 */
-#define LNBREAK_tb_p8                     217  /*      0x0d9 */
-#define LNBREAK_t8_pb                     218  /*      0x0da */
-#define LNBREAK_t8_p8                     219  /*      0x0db */
-
-#define TRIE                         55        /* 0x37 Match many
+#define LNBREAK_tb                     110     /*      0x06e */
+#define LNBREAK_t8                     111     /*      0x06f */
+#define LNBREAK_tb_pb                     220  /*      0x0dc */
+#define LNBREAK_tb_p8                     221  /*      0x0dd */
+#define LNBREAK_t8_pb                     222  /*      0x0de */
+#define LNBREAK_t8_p8                     223  /*      0x0df */
+
+#define TRIE                         56        /* 0x38 Match many
                                                   EXACT(F[ALU]?)? at once.
                                                   flags==type */
-#define TRIE_tb                        110     /*      0x06e */
-#define TRIE_t8                        111     /*      0x06f */
-#define TRIE_tb_pb                        220  /*      0x0dc */
-#define TRIE_tb_p8                        221  /*      0x0dd */
-#define TRIE_t8_pb                        222  /*      0x0de */
-#define TRIE_t8_p8                        223  /*      0x0df */
-
-#define TRIEC                        56        /* 0x38 Same as TRIE, but with
+#define TRIE_tb                        112     /*      0x070 */
+#define TRIE_t8                        113     /*      0x071 */
+#define TRIE_tb_pb                        224  /*      0x0e0 */
+#define TRIE_tb_p8                        225  /*      0x0e1 */
+#define TRIE_t8_pb                        226  /*      0x0e2 */
+#define TRIE_t8_p8                        227  /*      0x0e3 */
+
+#define TRIEC                        57        /* 0x39 Same as TRIE, but with
                                                   embedded charclass data */
-#define TRIEC_tb                       112     /*      0x070 */
-#define TRIEC_t8                       113     /*      0x071 */
-#define TRIEC_tb_pb                       224  /*      0x0e0 */
-#define TRIEC_tb_p8                       225  /*      0x0e1 */
-#define TRIEC_t8_pb                       226  /*      0x0e2 */
-#define TRIEC_t8_p8                       227  /*      0x0e3 */
-
-#define AHOCORASICK                  57        /* 0x39 Aho Corasick stclass.
+#define TRIEC_tb                       114     /*      0x072 */
+#define TRIEC_t8                       115     /*      0x073 */
+#define TRIEC_tb_pb                       228  /*      0x0e4 */
+#define TRIEC_tb_p8                       229  /*      0x0e5 */
+#define TRIEC_t8_pb                       230  /*      0x0e6 */
+#define TRIEC_t8_p8                       231  /*      0x0e7 */
+
+#define AHOCORASICK                  58        /* 0x3a Aho Corasick stclass.
                                                   flags==type */
-#define AHOCORASICK_tb                 114     /*      0x072 */
-#define AHOCORASICK_t8                 115     /*      0x073 */
-#define AHOCORASICK_tb_pb                 228  /*      0x0e4 */
-#define AHOCORASICK_tb_p8                 229  /*      0x0e5 */
-#define AHOCORASICK_t8_pb                 230  /*      0x0e6 */
-#define AHOCORASICK_t8_p8                 231  /*      0x0e7 */
-
-#define AHOCORASICKC                 58        /* 0x3a Same as AHOCORASICK,
+#define AHOCORASICK_tb                 116     /*      0x074 */
+#define AHOCORASICK_t8                 117     /*      0x075 */
+#define AHOCORASICK_tb_pb                 232  /*      0x0e8 */
+#define AHOCORASICK_tb_p8                 233  /*      0x0e9 */
+#define AHOCORASICK_t8_pb                 234  /*      0x0ea */
+#define AHOCORASICK_t8_p8                 235  /*      0x0eb */
+
+#define AHOCORASICKC                 59        /* 0x3b Same as AHOCORASICK,
                                                   but with embedded charclass
                                                   data */
-#define AHOCORASICKC_tb                116     /*      0x074 */
-#define AHOCORASICKC_t8                117     /*      0x075 */
-#define AHOCORASICKC_tb_pb                232  /*      0x0e8 */
-#define AHOCORASICKC_tb_p8                233  /*      0x0e9 */
-#define AHOCORASICKC_t8_pb                234  /*      0x0ea */
-#define AHOCORASICKC_t8_p8                235  /*      0x0eb */
-
-#define NOTHING                      59        /* 0x3b Match empty string. */
-#define NOTHING_tb                     118     /*      0x076 */
-#define NOTHING_t8                     119     /*      0x077 */
-#define NOTHING_tb_pb                     236  /*      0x0ec */
-#define NOTHING_tb_p8                     237  /*      0x0ed */
-#define NOTHING_t8_pb                     238  /*      0x0ee */
-#define NOTHING_t8_p8                     239  /*      0x0ef */
-
-#define TAIL                         60        /* 0x3c Match empty string. Can
+#define AHOCORASICKC_tb                118     /*      0x076 */
+#define AHOCORASICKC_t8                119     /*      0x077 */
+#define AHOCORASICKC_tb_pb                236  /*      0x0ec */
+#define AHOCORASICKC_tb_p8                237  /*      0x0ed */
+#define AHOCORASICKC_t8_pb                238  /*      0x0ee */
+#define AHOCORASICKC_t8_p8                239  /*      0x0ef */
+
+#define NOTHING                      60        /* 0x3c Match empty string. */
+#define NOTHING_tb                     120     /*      0x078 */
+#define NOTHING_t8                     121     /*      0x079 */
+#define NOTHING_tb_pb                     240  /*      0x0f0 */
+#define NOTHING_tb_p8                     241  /*      0x0f1 */
+#define NOTHING_t8_pb                     242  /*      0x0f2 */
+#define NOTHING_t8_p8                     243  /*      0x0f3 */
+
+#define TAIL                         61        /* 0x3d Match empty string. Can
                                                   jump here from outside. */
-#define TAIL_tb                        120     /*      0x078 */
-#define TAIL_t8                        121     /*      0x079 */
-#define TAIL_tb_pb                        240  /*      0x0f0 */
-#define TAIL_tb_p8                        241  /*      0x0f1 */
-#define TAIL_t8_pb                        242  /*      0x0f2 */
-#define TAIL_t8_p8                        243  /*      0x0f3 */
-
-#define STAR                         61        /* 0x3d Match this (simple)
-                                                  thing 0 or more times. */
-#define STAR_tb                        122     /*      0x07a */
-#define STAR_t8                        123     /*      0x07b */
-#define STAR_tb_pb                        244  /*      0x0f4 */
-#define STAR_tb_p8                        245  /*      0x0f5 */
-#define STAR_t8_pb                        246  /*      0x0f6 */
-#define STAR_t8_p8                        247  /*      0x0f7 */
-
-#define PLUS                         62        /* 0x3e Match this (simple)
-                                                  thing 1 or more times. */
-#define PLUS_tb                        124     /*      0x07c */
-#define PLUS_t8                        125     /*      0x07d */
-#define PLUS_tb_pb                        248  /*      0x0f8 */
-#define PLUS_tb_p8                        249  /*      0x0f9 */
-#define PLUS_t8_pb                        250  /*      0x0fa */
-#define PLUS_t8_p8                        251  /*      0x0fb */
-
-#define CURLY                        63        /* 0x3f Match this simple thing
-                                                  {n,m} times. */
-#define CURLY_tb                       126     /*      0x07e */
-#define CURLY_t8                       127     /*      0x07f */
-#define CURLY_tb_pb                       252  /*      0x0fc */
-#define CURLY_tb_p8                       253  /*      0x0fd */
-#define CURLY_t8_pb                       254  /*      0x0fe */
-#define CURLY_t8_p8                       255  /*      0x0ff */
-
-#define CURLYN                       64        /* 0x40 Capture next-after-this
-                                                  simple thing */
-#define CURLYN_tb                      128     /*      0x080 */
-#define CURLYN_t8                      129     /*      0x081 */
-#define CURLYN_tb_pb                      256  /*      0x100 */
-#define CURLYN_tb_p8                      257  /*      0x101 */
-#define CURLYN_t8_pb                      258  /*      0x102 */
-#define CURLYN_t8_p8                      259  /*      0x103 */
-
-#define CURLYM                       65        /* 0x41 Capture this
+#define TAIL_tb                        122     /*      0x07a */
+#define TAIL_t8                        123     /*      0x07b */
+#define TAIL_tb_pb                        244  /*      0x0f4 */
+#define TAIL_tb_p8                        245  /*      0x0f5 */
+#define TAIL_t8_pb                        246  /*      0x0f6 */
+#define TAIL_t8_p8                        247  /*      0x0f7 */
+
+#define STAR                         62        /* 0x3e Match this (simple)
+                                                  thing 0 or more times:
+                                                  /A{0,}B/ where A is width 1
+                                                  char */
+#define STAR_tb                        124     /*      0x07c */
+#define STAR_t8                        125     /*      0x07d */
+#define STAR_tb_pb                        248  /*      0x0f8 */
+#define STAR_tb_p8                        249  /*      0x0f9 */
+#define STAR_t8_pb                        250  /*      0x0fa */
+#define STAR_t8_p8                        251  /*      0x0fb */
+
+#define PLUS                         63        /* 0x3f Match this (simple)
+                                                  thing 1 or more times:
+                                                  /A{1,}B/ where A is width 1
+                                                  char */
+#define PLUS_tb                        126     /*      0x07e */
+#define PLUS_t8                        127     /*      0x07f */
+#define PLUS_tb_pb                        252  /*      0x0fc */
+#define PLUS_tb_p8                        253  /*      0x0fd */
+#define PLUS_t8_pb                        254  /*      0x0fe */
+#define PLUS_t8_p8                        255  /*      0x0ff */
+
+#define CURLY                        64        /* 0x40 Match this (simple)
+                                                  thing {n,m} times: /A{m,n}B/
+                                                  where A is width 1 char */
+#define CURLY_tb                       128     /*      0x080 */
+#define CURLY_t8                       129     /*      0x081 */
+#define CURLY_tb_pb                       256  /*      0x100 */
+#define CURLY_tb_p8                       257  /*      0x101 */
+#define CURLY_t8_pb                       258  /*      0x102 */
+#define CURLY_t8_p8                       259  /*      0x103 */
+
+#define CURLYN                       65        /* 0x41 Capture next-after-this
+                                                  simple thing: /(A){m,n}B/
+                                                  where A is width 1 char */
+#define CURLYN_tb                      130     /*      0x082 */
+#define CURLYN_t8                      131     /*      0x083 */
+#define CURLYN_tb_pb                      260  /*      0x104 */
+#define CURLYN_tb_p8                      261  /*      0x105 */
+#define CURLYN_t8_pb                      262  /*      0x106 */
+#define CURLYN_t8_p8                      263  /*      0x107 */
+
+#define CURLYM                       66        /* 0x42 Capture this
                                                   medium-complex thing {n,m}
-                                                  times. */
-#define CURLYM_tb                      130     /*      0x082 */
-#define CURLYM_t8                      131     /*      0x083 */
-#define CURLYM_tb_pb                      260  /*      0x104 */
-#define CURLYM_tb_p8                      261  /*      0x105 */
-#define CURLYM_t8_pb                      262  /*      0x106 */
-#define CURLYM_t8_p8                      263  /*      0x107 */
-
-#define CURLYX                       66        /* 0x42 Match this complex
-                                                  thing {n,m} times. */
-#define CURLYX_tb                      132     /*      0x084 */
-#define CURLYX_t8                      133     /*      0x085 */
-#define CURLYX_tb_pb                      264  /*      0x108 */
-#define CURLYX_tb_p8                      265  /*      0x109 */
-#define CURLYX_t8_pb                      266  /*      0x10a */
-#define CURLYX_t8_p8                      267  /*      0x10b */
-
-#define WHILEM                       67        /* 0x43 Do curly processing and
+                                                  times: /(A){m,n}B/ where A
+                                                  is fixed-length */
+#define CURLYM_tb                      132     /*      0x084 */
+#define CURLYM_t8                      133     /*      0x085 */
+#define CURLYM_tb_pb                      264  /*      0x108 */
+#define CURLYM_tb_p8                      265  /*      0x109 */
+#define CURLYM_t8_pb                      266  /*      0x10a */
+#define CURLYM_t8_p8                      267  /*      0x10b */
+
+#define CURLYX                       67        /* 0x43 Match/Capture this
+                                                  complex thing {n,m} times.
+                                               */
+#define CURLYX_tb                      134     /*      0x086 */
+#define CURLYX_t8                      135     /*      0x087 */
+#define CURLYX_tb_pb                      268  /*      0x10c */
+#define CURLYX_tb_p8                      269  /*      0x10d */
+#define CURLYX_t8_pb                      270  /*      0x10e */
+#define CURLYX_t8_p8                      271  /*      0x10f */
+
+#define WHILEM                       68        /* 0x44 Do curly processing and
                                                   see if rest matches. */
-#define WHILEM_tb                      134     /*      0x086 */
-#define WHILEM_t8                      135     /*      0x087 */
-#define WHILEM_tb_pb                      268  /*      0x10c */
-#define WHILEM_tb_p8                      269  /*      0x10d */
-#define WHILEM_t8_pb                      270  /*      0x10e */
-#define WHILEM_t8_p8                      271  /*      0x10f */
-
-#define OPEN                         68        /* 0x44 Mark this point in
+#define WHILEM_tb                      136     /*      0x088 */
+#define WHILEM_t8                      137     /*      0x089 */
+#define WHILEM_tb_pb                      272  /*      0x110 */
+#define WHILEM_tb_p8                      273  /*      0x111 */
+#define WHILEM_t8_pb                      274  /*      0x112 */
+#define WHILEM_t8_p8                      275  /*      0x113 */
+
+#define OPEN                         69        /* 0x45 Mark this point in
                                                   input as start of #n. */
-#define OPEN_tb                        136     /*      0x088 */
-#define OPEN_t8                        137     /*      0x089 */
-#define OPEN_tb_pb                        272  /*      0x110 */
-#define OPEN_tb_p8                        273  /*      0x111 */
-#define OPEN_t8_pb                        274  /*      0x112 */
-#define OPEN_t8_p8                        275  /*      0x113 */
-
-#define CLOSE                        69        /* 0x45 Close corresponding
+#define OPEN_tb                        138     /*      0x08a */
+#define OPEN_t8                        139     /*      0x08b */
+#define OPEN_tb_pb                        276  /*      0x114 */
+#define OPEN_tb_p8                        277  /*      0x115 */
+#define OPEN_t8_pb                        278  /*      0x116 */
+#define OPEN_t8_p8                        279  /*      0x117 */
+
+#define CLOSE                        70        /* 0x46 Close corresponding
                                                   OPEN of #n. */
-#define CLOSE_tb                       138     /*      0x08a */
-#define CLOSE_t8                       139     /*      0x08b */
-#define CLOSE_tb_pb                       276  /*      0x114 */
-#define CLOSE_tb_p8                       277  /*      0x115 */
-#define CLOSE_t8_pb                       278  /*      0x116 */
-#define CLOSE_t8_p8                       279  /*      0x117 */
-
-#define SROPEN                       70        /* 0x46 Same as OPEN, but for
+#define CLOSE_tb                       140     /*      0x08c */
+#define CLOSE_t8                       141     /*      0x08d */
+#define CLOSE_tb_pb                       280  /*      0x118 */
+#define CLOSE_tb_p8                       281  /*      0x119 */
+#define CLOSE_t8_pb                       282  /*      0x11a */
+#define CLOSE_t8_p8                       283  /*      0x11b */
+
+#define SROPEN                       71        /* 0x47 Same as OPEN, but for
                                                   script run */
-#define SROPEN_tb                      140     /*      0x08c */
-#define SROPEN_t8                      141     /*      0x08d */
-#define SROPEN_tb_pb                      280  /*      0x118 */
-#define SROPEN_tb_p8                      281  /*      0x119 */
-#define SROPEN_t8_pb                      282  /*      0x11a */
-#define SROPEN_t8_p8                      283  /*      0x11b */
-
-#define SRCLOSE                      71        /* 0x47 Close preceding SROPEN
+#define SROPEN_tb                      142     /*      0x08e */
+#define SROPEN_t8                      143     /*      0x08f */
+#define SROPEN_tb_pb                      284  /*      0x11c */
+#define SROPEN_tb_p8                      285  /*      0x11d */
+#define SROPEN_t8_pb                      286  /*      0x11e */
+#define SROPEN_t8_p8                      287  /*      0x11f */
+
+#define SRCLOSE                      72        /* 0x48 Close preceding SROPEN
                                                */
-#define SRCLOSE_tb                     142     /*      0x08e */
-#define SRCLOSE_t8                     143     /*      0x08f */
-#define SRCLOSE_tb_pb                     284  /*      0x11c */
-#define SRCLOSE_tb_p8                     285  /*      0x11d */
-#define SRCLOSE_t8_pb                     286  /*      0x11e */
-#define SRCLOSE_t8_p8                     287  /*      0x11f */
-
-#define REF                          72        /* 0x48 Match some already
+#define SRCLOSE_tb                     144     /*      0x090 */
+#define SRCLOSE_t8                     145     /*      0x091 */
+#define SRCLOSE_tb_pb                     288  /*      0x120 */
+#define SRCLOSE_tb_p8                     289  /*      0x121 */
+#define SRCLOSE_t8_pb                     290  /*      0x122 */
+#define SRCLOSE_t8_p8                     291  /*      0x123 */
+
+#define REF                          73        /* 0x49 Match some already
                                                   matched string */
-#define REF_tb                         144     /*      0x090 */
-#define REF_t8                         145     /*      0x091 */
-#define REF_tb_pb                         288  /*      0x120 */
-#define REF_tb_p8                         289  /*      0x121 */
-#define REF_t8_pb                         290  /*      0x122 */
-#define REF_t8_p8                         291  /*      0x123 */
-
-#define REFF                         73        /* 0x49 Match already matched
+#define REF_tb                         146     /*      0x092 */
+#define REF_t8                         147     /*      0x093 */
+#define REF_tb_pb                         292  /*      0x124 */
+#define REF_tb_p8                         293  /*      0x125 */
+#define REF_t8_pb                         294  /*      0x126 */
+#define REF_t8_p8                         295  /*      0x127 */
+
+#define REFF                         74        /* 0x4a Match already matched
                                                   string, using /di rules. */
-#define REFF_tb                        146     /*      0x092 */
-#define REFF_t8                        147     /*      0x093 */
-#define REFF_tb_pb                        292  /*      0x124 */
-#define REFF_tb_p8                        293  /*      0x125 */
-#define REFF_t8_pb                        294  /*      0x126 */
-#define REFF_t8_p8                        295  /*      0x127 */
-
-#define REFFL                        74        /* 0x4a Match already matched
+#define REFF_tb                        148     /*      0x094 */
+#define REFF_t8                        149     /*      0x095 */
+#define REFF_tb_pb                        296  /*      0x128 */
+#define REFF_tb_p8                        297  /*      0x129 */
+#define REFF_t8_pb                        298  /*      0x12a */
+#define REFF_t8_p8                        299  /*      0x12b */
+
+#define REFFL                        75        /* 0x4b Match already matched
                                                   string, using /li rules. */
-#define REFFL_tb                       148     /*      0x094 */
-#define REFFL_t8                       149     /*      0x095 */
-#define REFFL_tb_pb                       296  /*      0x128 */
-#define REFFL_tb_p8                       297  /*      0x129 */
-#define REFFL_t8_pb                       298  /*      0x12a */
-#define REFFL_t8_p8                       299  /*      0x12b */
-
-#define REFFU                        75        /* 0x4b Match already matched
+#define REFFL_tb                       150     /*      0x096 */
+#define REFFL_t8                       151     /*      0x097 */
+#define REFFL_tb_pb                       300  /*      0x12c */
+#define REFFL_tb_p8                       301  /*      0x12d */
+#define REFFL_t8_pb                       302  /*      0x12e */
+#define REFFL_t8_p8                       303  /*      0x12f */
+
+#define REFFU                        76        /* 0x4c Match already matched
                                                   string, usng /ui. */
-#define REFFU_tb                       150     /*      0x096 */
-#define REFFU_t8                       151     /*      0x097 */
-#define REFFU_tb_pb                       300  /*      0x12c */
-#define REFFU_tb_p8                       301  /*      0x12d */
-#define REFFU_t8_pb                       302  /*      0x12e */
-#define REFFU_t8_p8                       303  /*      0x12f */
-
-#define REFFA                        76        /* 0x4c Match already matched
+#define REFFU_tb                       152     /*      0x098 */
+#define REFFU_t8                       153     /*      0x099 */
+#define REFFU_tb_pb                       304  /*      0x130 */
+#define REFFU_tb_p8                       305  /*      0x131 */
+#define REFFU_t8_pb                       306  /*      0x132 */
+#define REFFU_t8_p8                       307  /*      0x133 */
+
+#define REFFA                        77        /* 0x4d Match already matched
                                                   string, using /aai rules. */
-#define REFFA_tb                       152     /*      0x098 */
-#define REFFA_t8                       153     /*      0x099 */
-#define REFFA_tb_pb                       304  /*      0x130 */
-#define REFFA_tb_p8                       305  /*      0x131 */
-#define REFFA_t8_pb                       306  /*      0x132 */
-#define REFFA_t8_p8                       307  /*      0x133 */
-
-#define REFN                         77        /* 0x4d Match some already
+#define REFFA_tb                       154     /*      0x09a */
+#define REFFA_t8                       155     /*      0x09b */
+#define REFFA_tb_pb                       308  /*      0x134 */
+#define REFFA_tb_p8                       309  /*      0x135 */
+#define REFFA_t8_pb                       310  /*      0x136 */
+#define REFFA_t8_p8                       311  /*      0x137 */
+
+#define REFN                         78        /* 0x4e Match some already
                                                   matched string */
-#define REFN_tb                        154     /*      0x09a */
-#define REFN_t8                        155     /*      0x09b */
-#define REFN_tb_pb                        308  /*      0x134 */
-#define REFN_tb_p8                        309  /*      0x135 */
-#define REFN_t8_pb                        310  /*      0x136 */
-#define REFN_t8_p8                        311  /*      0x137 */
-
-#define REFFN                        78        /* 0x4e Match already matched
+#define REFN_tb                        156     /*      0x09c */
+#define REFN_t8                        157     /*      0x09d */
+#define REFN_tb_pb                        312  /*      0x138 */
+#define REFN_tb_p8                        313  /*      0x139 */
+#define REFN_t8_pb                        314  /*      0x13a */
+#define REFN_t8_p8                        315  /*      0x13b */
+
+#define REFFN                        79        /* 0x4f Match already matched
                                                   string, using /di rules. */
-#define REFFN_tb                       156     /*      0x09c */
-#define REFFN_t8                       157     /*      0x09d */
-#define REFFN_tb_pb                       312  /*      0x138 */
-#define REFFN_tb_p8                       313  /*      0x139 */
-#define REFFN_t8_pb                       314  /*      0x13a */
-#define REFFN_t8_p8                       315  /*      0x13b */
-
-#define REFFLN                       79        /* 0x4f Match already matched
+#define REFFN_tb                       158     /*      0x09e */
+#define REFFN_t8                       159     /*      0x09f */
+#define REFFN_tb_pb                       316  /*      0x13c */
+#define REFFN_tb_p8                       317  /*      0x13d */
+#define REFFN_t8_pb                       318  /*      0x13e */
+#define REFFN_t8_p8                       319  /*      0x13f */
+
+#define REFFLN                       80        /* 0x50 Match already matched
                                                   string, using /li rules. */
-#define REFFLN_tb                      158     /*      0x09e */
-#define REFFLN_t8                      159     /*      0x09f */
-#define REFFLN_tb_pb                      316  /*      0x13c */
-#define REFFLN_tb_p8                      317  /*      0x13d */
-#define REFFLN_t8_pb                      318  /*      0x13e */
-#define REFFLN_t8_p8                      319  /*      0x13f */
-
-#define REFFUN                       80        /* 0x50 Match already matched
+#define REFFLN_tb                      160     /*      0x0a0 */
+#define REFFLN_t8                      161     /*      0x0a1 */
+#define REFFLN_tb_pb                      320  /*      0x140 */
+#define REFFLN_tb_p8                      321  /*      0x141 */
+#define REFFLN_t8_pb                      322  /*      0x142 */
+#define REFFLN_t8_p8                      323  /*      0x143 */
+
+#define REFFUN                       81        /* 0x51 Match already matched
                                                   string, using /ui rules. */
-#define REFFUN_tb                      160     /*      0x0a0 */
-#define REFFUN_t8                      161     /*      0x0a1 */
-#define REFFUN_tb_pb                      320  /*      0x140 */
-#define REFFUN_tb_p8                      321  /*      0x141 */
-#define REFFUN_t8_pb                      322  /*      0x142 */
-#define REFFUN_t8_p8                      323  /*      0x143 */
-
-#define REFFAN                       81        /* 0x51 Match already matched
+#define REFFUN_tb                      162     /*      0x0a2 */
+#define REFFUN_t8                      163     /*      0x0a3 */
+#define REFFUN_tb_pb                      324  /*      0x144 */
+#define REFFUN_tb_p8                      325  /*      0x145 */
+#define REFFUN_t8_pb                      326  /*      0x146 */
+#define REFFUN_t8_p8                      327  /*      0x147 */
+
+#define REFFAN                       82        /* 0x52 Match already matched
                                                   string, using /aai rules. */
-#define REFFAN_tb                      162     /*      0x0a2 */
-#define REFFAN_t8                      163     /*      0x0a3 */
-#define REFFAN_tb_pb                      324  /*      0x144 */
-#define REFFAN_tb_p8                      325  /*      0x145 */
-#define REFFAN_t8_pb                      326  /*      0x146 */
-#define REFFAN_t8_p8                      327  /*      0x147 */
-
-#define LONGJMP                      82        /* 0x52 Jump far away. */
-#define LONGJMP_tb                     164     /*      0x0a4 */
-#define LONGJMP_t8                     165     /*      0x0a5 */
-#define LONGJMP_tb_pb                     328  /*      0x148 */
-#define LONGJMP_tb_p8                     329  /*      0x149 */
-#define LONGJMP_t8_pb                     330  /*      0x14a */
-#define LONGJMP_t8_p8                     331  /*      0x14b */
-
-#define BRANCHJ                      83        /* 0x53 BRANCH with long
+#define REFFAN_tb                      164     /*      0x0a4 */
+#define REFFAN_t8                      165     /*      0x0a5 */
+#define REFFAN_tb_pb                      328  /*      0x148 */
+#define REFFAN_tb_p8                      329  /*      0x149 */
+#define REFFAN_t8_pb                      330  /*      0x14a */
+#define REFFAN_t8_p8                      331  /*      0x14b */
+
+#define LONGJMP                      83        /* 0x53 Jump far away. */
+#define LONGJMP_tb                     166     /*      0x0a6 */
+#define LONGJMP_t8                     167     /*      0x0a7 */
+#define LONGJMP_tb_pb                     332  /*      0x14c */
+#define LONGJMP_tb_p8                     333  /*      0x14d */
+#define LONGJMP_t8_pb                     334  /*      0x14e */
+#define LONGJMP_t8_p8                     335  /*      0x14f */
+
+#define BRANCHJ                      84        /* 0x54 BRANCH with long
                                                   offset. */
-#define BRANCHJ_tb                     166     /*      0x0a6 */
-#define BRANCHJ_t8                     167     /*      0x0a7 */
-#define BRANCHJ_tb_pb                     332  /*      0x14c */
-#define BRANCHJ_tb_p8                     333  /*      0x14d */
-#define BRANCHJ_t8_pb                     334  /*      0x14e */
-#define BRANCHJ_t8_p8                     335  /*      0x14f */
-
-#define IFMATCH                      84        /* 0x54 Succeeds if the
+#define BRANCHJ_tb                     168     /*      0x0a8 */
+#define BRANCHJ_t8                     169     /*      0x0a9 */
+#define BRANCHJ_tb_pb                     336  /*      0x150 */
+#define BRANCHJ_tb_p8                     337  /*      0x151 */
+#define BRANCHJ_t8_pb                     338  /*      0x152 */
+#define BRANCHJ_t8_p8                     339  /*      0x153 */
+
+#define IFMATCH                      85        /* 0x55 Succeeds if the
                                                   following matches; non-zero
                                                   flags "f", next_off "o"
                                                   means lookbehind assertion
                                                   starting "f..(f-o)"
                                                   characters before current */
-#define IFMATCH_tb                     168     /*      0x0a8 */
-#define IFMATCH_t8                     169     /*      0x0a9 */
-#define IFMATCH_tb_pb                     336  /*      0x150 */
-#define IFMATCH_tb_p8                     337  /*      0x151 */
-#define IFMATCH_t8_pb                     338  /*      0x152 */
-#define IFMATCH_t8_p8                     339  /*      0x153 */
-
-#define UNLESSM                      85        /* 0x55 Fails if the following
+#define IFMATCH_tb                     170     /*      0x0aa */
+#define IFMATCH_t8                     171     /*      0x0ab */
+#define IFMATCH_tb_pb                     340  /*      0x154 */
+#define IFMATCH_tb_p8                     341  /*      0x155 */
+#define IFMATCH_t8_pb                     342  /*      0x156 */
+#define IFMATCH_t8_p8                     343  /*      0x157 */
+
+#define UNLESSM                      86        /* 0x56 Fails if the following
                                                   matches; non-zero flags "f",
                                                   next_off "o" means
                                                   lookbehind assertion
                                                   starting "f..(f-o)"
                                                   characters before current */
-#define UNLESSM_tb                     170     /*      0x0aa */
-#define UNLESSM_t8                     171     /*      0x0ab */
-#define UNLESSM_tb_pb                     340  /*      0x154 */
-#define UNLESSM_tb_p8                     341  /*      0x155 */
-#define UNLESSM_t8_pb                     342  /*      0x156 */
-#define UNLESSM_t8_p8                     343  /*      0x157 */
-
-#define SUSPEND                      86        /* 0x56 "Independent" sub-RE.
+#define UNLESSM_tb                     172     /*      0x0ac */
+#define UNLESSM_t8                     173     /*      0x0ad */
+#define UNLESSM_tb_pb                     344  /*      0x158 */
+#define UNLESSM_tb_p8                     345  /*      0x159 */
+#define UNLESSM_t8_pb                     346  /*      0x15a */
+#define UNLESSM_t8_p8                     347  /*      0x15b */
+
+#define SUSPEND                      87        /* 0x57 "Independent" sub-RE.
                                                */
-#define SUSPEND_tb                     172     /*      0x0ac */
-#define SUSPEND_t8                     173     /*      0x0ad */
-#define SUSPEND_tb_pb                     344  /*      0x158 */
-#define SUSPEND_tb_p8                     345  /*      0x159 */
-#define SUSPEND_t8_pb                     346  /*      0x15a */
-#define SUSPEND_t8_p8                     347  /*      0x15b */
-
-#define IFTHEN                       87        /* 0x57 Switch, should be
+#define SUSPEND_tb                     174     /*      0x0ae */
+#define SUSPEND_t8                     175     /*      0x0af */
+#define SUSPEND_tb_pb                     348  /*      0x15c */
+#define SUSPEND_tb_p8                     349  /*      0x15d */
+#define SUSPEND_t8_pb                     350  /*      0x15e */
+#define SUSPEND_t8_p8                     351  /*      0x15f */
+
+#define IFTHEN                       88        /* 0x58 Switch, should be
                                                   preceded by switcher. */
-#define IFTHEN_tb                      174     /*      0x0ae */
-#define IFTHEN_t8                      175     /*      0x0af */
-#define IFTHEN_tb_pb                      348  /*      0x15c */
-#define IFTHEN_tb_p8                      349  /*      0x15d */
-#define IFTHEN_t8_pb                      350  /*      0x15e */
-#define IFTHEN_t8_p8                      351  /*      0x15f */
-
-#define GROUPP                       88        /* 0x58 Whether the group
+#define IFTHEN_tb                      176     /*      0x0b0 */
+#define IFTHEN_t8                      177     /*      0x0b1 */
+#define IFTHEN_tb_pb                      352  /*      0x160 */
+#define IFTHEN_tb_p8                      353  /*      0x161 */
+#define IFTHEN_t8_pb                      354  /*      0x162 */
+#define IFTHEN_t8_p8                      355  /*      0x163 */
+
+#define GROUPP                       89        /* 0x59 Whether the group
                                                   matched. */
-#define GROUPP_tb                      176     /*      0x0b0 */
-#define GROUPP_t8                      177     /*      0x0b1 */
-#define GROUPP_tb_pb                      352  /*      0x160 */
-#define GROUPP_tb_p8                      353  /*      0x161 */
-#define GROUPP_t8_pb                      354  /*      0x162 */
-#define GROUPP_t8_p8                      355  /*      0x163 */
-
-#define EVAL                         89        /* 0x59 Execute some Perl code.
+#define GROUPP_tb                      178     /*      0x0b2 */
+#define GROUPP_t8                      179     /*      0x0b3 */
+#define GROUPP_tb_pb                      356  /*      0x164 */
+#define GROUPP_tb_p8                      357  /*      0x165 */
+#define GROUPP_t8_pb                      358  /*      0x166 */
+#define GROUPP_t8_p8                      359  /*      0x167 */
+
+#define EVAL                         90        /* 0x5a Execute some Perl code.
                                                */
-#define EVAL_tb                        178     /*      0x0b2 */
-#define EVAL_t8                        179     /*      0x0b3 */
-#define EVAL_tb_pb                        356  /*      0x164 */
-#define EVAL_tb_p8                        357  /*      0x165 */
-#define EVAL_t8_pb                        358  /*      0x166 */
-#define EVAL_t8_p8                        359  /*      0x167 */
-
-#define MINMOD                       90        /* 0x5a Next operator is not
+#define EVAL_tb                        180     /*      0x0b4 */
+#define EVAL_t8                        181     /*      0x0b5 */
+#define EVAL_tb_pb                        360  /*      0x168 */
+#define EVAL_tb_p8                        361  /*      0x169 */
+#define EVAL_t8_pb                        362  /*      0x16a */
+#define EVAL_t8_p8                        363  /*      0x16b */
+
+#define MINMOD                       91        /* 0x5b Next operator is not
                                                   greedy. */
-#define MINMOD_tb                      180     /*      0x0b4 */
-#define MINMOD_t8                      181     /*      0x0b5 */
-#define MINMOD_tb_pb                      360  /*      0x168 */
-#define MINMOD_tb_p8                      361  /*      0x169 */
-#define MINMOD_t8_pb                      362  /*      0x16a */
-#define MINMOD_t8_p8                      363  /*      0x16b */
-
-#define LOGICAL                      91        /* 0x5b Next opcode should set
+#define MINMOD_tb                      182     /*      0x0b6 */
+#define MINMOD_t8                      183     /*      0x0b7 */
+#define MINMOD_tb_pb                      364  /*      0x16c */
+#define MINMOD_tb_p8                      365  /*      0x16d */
+#define MINMOD_t8_pb                      366  /*      0x16e */
+#define MINMOD_t8_p8                      367  /*      0x16f */
+
+#define LOGICAL                      92        /* 0x5c Next opcode should set
                                                   the flag only. */
-#define LOGICAL_tb                     182     /*      0x0b6 */
-#define LOGICAL_t8                     183     /*      0x0b7 */
-#define LOGICAL_tb_pb                     364  /*      0x16c */
-#define LOGICAL_tb_p8                     365  /*      0x16d */
-#define LOGICAL_t8_pb                     366  /*      0x16e */
-#define LOGICAL_t8_p8                     367  /*      0x16f */
-
-#define RENUM                        92        /* 0x5c Group with
+#define LOGICAL_tb                     184     /*      0x0b8 */
+#define LOGICAL_t8                     185     /*      0x0b9 */
+#define LOGICAL_tb_pb                     368  /*      0x170 */
+#define LOGICAL_tb_p8                     369  /*      0x171 */
+#define LOGICAL_t8_pb                     370  /*      0x172 */
+#define LOGICAL_t8_p8                     371  /*      0x173 */
+
+#define RENUM                        93        /* 0x5d Group with
                                                   independently numbered
                                                   parens. */
-#define RENUM_tb                       184     /*      0x0b8 */
-#define RENUM_t8                       185     /*      0x0b9 */
-#define RENUM_tb_pb                       368  /*      0x170 */
-#define RENUM_tb_p8                       369  /*      0x171 */
-#define RENUM_t8_pb                       370  /*      0x172 */
-#define RENUM_t8_p8                       371  /*      0x173 */
-
-#define GOSUB                        93        /* 0x5d recurse to paren arg1
+#define RENUM_tb                       186     /*      0x0ba */
+#define RENUM_t8                       187     /*      0x0bb */
+#define RENUM_tb_pb                       372  /*      0x174 */
+#define RENUM_tb_p8                       373  /*      0x175 */
+#define RENUM_t8_pb                       374  /*      0x176 */
+#define RENUM_t8_p8                       375  /*      0x177 */
+
+#define GOSUB                        94        /* 0x5e recurse to paren arg1
                                                   at (signed) ofs arg2 */
-#define GOSUB_tb                       186     /*      0x0ba */
-#define GOSUB_t8                       187     /*      0x0bb */
-#define GOSUB_tb_pb                       372  /*      0x174 */
-#define GOSUB_tb_p8                       373  /*      0x175 */
-#define GOSUB_t8_pb                       374  /*      0x176 */
-#define GOSUB_t8_p8                       375  /*      0x177 */
-
-#define GROUPPN                      94        /* 0x5e Whether the group
+#define GOSUB_tb                       188     /*      0x0bc */
+#define GOSUB_t8                       189     /*      0x0bd */
+#define GOSUB_tb_pb                       376  /*      0x178 */
+#define GOSUB_tb_p8                       377  /*      0x179 */
+#define GOSUB_t8_pb                       378  /*      0x17a */
+#define GOSUB_t8_p8                       379  /*      0x17b */
+
+#define GROUPPN                      95        /* 0x5f Whether the group
                                                   matched. */
-#define GROUPPN_tb                     188     /*      0x0bc */
-#define GROUPPN_t8                     189     /*      0x0bd */
-#define GROUPPN_tb_pb                     376  /*      0x178 */
-#define GROUPPN_tb_p8                     377  /*      0x179 */
-#define GROUPPN_t8_pb                     378  /*      0x17a */
-#define GROUPPN_t8_p8                     379  /*      0x17b */
-
-#define INSUBP                       95        /* 0x5f Whether we are in a
+#define GROUPPN_tb                     190     /*      0x0be */
+#define GROUPPN_t8                     191     /*      0x0bf */
+#define GROUPPN_tb_pb                     380  /*      0x17c */
+#define GROUPPN_tb_p8                     381  /*      0x17d */
+#define GROUPPN_t8_pb                     382  /*      0x17e */
+#define GROUPPN_t8_p8                     383  /*      0x17f */
+
+#define INSUBP                       96        /* 0x60 Whether we are in a
                                                   specific recurse. */
-#define INSUBP_tb                      190     /*      0x0be */
-#define INSUBP_t8                      191     /*      0x0bf */
-#define INSUBP_tb_pb                      380  /*      0x17c */
-#define INSUBP_tb_p8                      381  /*      0x17d */
-#define INSUBP_t8_pb                      382  /*      0x17e */
-#define INSUBP_t8_p8                      383  /*      0x17f */
-
-#define DEFINEP                      96        /* 0x60 Never execute directly.
+#define INSUBP_tb                      192     /*      0x0c0 */
+#define INSUBP_t8                      193     /*      0x0c1 */
+#define INSUBP_tb_pb                      384  /*      0x180 */
+#define INSUBP_tb_p8                      385  /*      0x181 */
+#define INSUBP_t8_pb                      386  /*      0x182 */
+#define INSUBP_t8_p8                      387  /*      0x183 */
+
+#define DEFINEP                      97        /* 0x61 Never execute directly.
                                                */
-#define DEFINEP_tb                     192     /*      0x0c0 */
-#define DEFINEP_t8                     193     /*      0x0c1 */
-#define DEFINEP_tb_pb                     384  /*      0x180 */
-#define DEFINEP_tb_p8                     385  /*      0x181 */
-#define DEFINEP_t8_pb                     386  /*      0x182 */
-#define DEFINEP_t8_p8                     387  /*      0x183 */
-
-#define ENDLIKE                      97        /* 0x61 Used only for the type
+#define DEFINEP_tb                     194     /*      0x0c2 */
+#define DEFINEP_t8                     195     /*      0x0c3 */
+#define DEFINEP_tb_pb                     388  /*      0x184 */
+#define DEFINEP_tb_p8                     389  /*      0x185 */
+#define DEFINEP_t8_pb                     390  /*      0x186 */
+#define DEFINEP_t8_p8                     391  /*      0x187 */
+
+#define ENDLIKE                      98        /* 0x62 Used only for the type
                                                   field of verbs */
-#define ENDLIKE_tb                     194     /*      0x0c2 */
-#define ENDLIKE_t8                     195     /*      0x0c3 */
-#define ENDLIKE_tb_pb                     388  /*      0x184 */
-#define ENDLIKE_tb_p8                     389  /*      0x185 */
-#define ENDLIKE_t8_pb                     390  /*      0x186 */
-#define ENDLIKE_t8_p8                     391  /*      0x187 */
-
-#define OPFAIL                       98        /* 0x62 Same as (?!), but with
+#define ENDLIKE_tb                     196     /*      0x0c4 */
+#define ENDLIKE_t8                     197     /*      0x0c5 */
+#define ENDLIKE_tb_pb                     392  /*      0x188 */
+#define ENDLIKE_tb_p8                     393  /*      0x189 */
+#define ENDLIKE_t8_pb                     394  /*      0x18a */
+#define ENDLIKE_t8_p8                     395  /*      0x18b */
+
+#define OPFAIL                       99        /* 0x63 Same as (?!), but with
                                                   verb arg */
-#define OPFAIL_tb                      196     /*      0x0c4 */
-#define OPFAIL_t8                      197     /*      0x0c5 */
-#define OPFAIL_tb_pb                      392  /*      0x188 */
-#define OPFAIL_tb_p8                      393  /*      0x189 */
-#define OPFAIL_t8_pb                      394  /*      0x18a */
-#define OPFAIL_t8_p8                      395  /*      0x18b */
-
-#define ACCEPT                       99        /* 0x63 Accepts the current
+#define OPFAIL_tb                      198     /*      0x0c6 */
+#define OPFAIL_t8                      199     /*      0x0c7 */
+#define OPFAIL_tb_pb                      396  /*      0x18c */
+#define OPFAIL_tb_p8                      397  /*      0x18d */
+#define OPFAIL_t8_pb                      398  /*      0x18e */
+#define OPFAIL_t8_p8                      399  /*      0x18f */
+
+#define ACCEPT                      100        /* 0x64 Accepts the current
                                                   matched string, with verbar
                                                */
-#define ACCEPT_tb                      198     /*      0x0c6 */
-#define ACCEPT_t8                      199     /*      0x0c7 */
-#define ACCEPT_tb_pb                      396  /*      0x18c */
-#define ACCEPT_tb_p8                      397  /*      0x18d */
-#define ACCEPT_t8_pb                      398  /*      0x18e */
-#define ACCEPT_t8_p8                      399  /*      0x18f */
-
-#define VERB                        100        /* 0x64 Used only for the type
+#define ACCEPT_tb                      200     /*      0x0c8 */
+#define ACCEPT_t8                      201     /*      0x0c9 */
+#define ACCEPT_tb_pb                      400  /*      0x190 */
+#define ACCEPT_tb_p8                      401  /*      0x191 */
+#define ACCEPT_t8_pb                      402  /*      0x192 */
+#define ACCEPT_t8_p8                      403  /*      0x193 */
+
+#define VERB                        101        /* 0x65 Used only for the type
                                                   field of verbs */
-#define VERB_tb                        200     /*      0x0c8 */
-#define VERB_t8                        201     /*      0x0c9 */
-#define VERB_tb_pb                        400  /*      0x190 */
-#define VERB_tb_p8                        401  /*      0x191 */
-#define VERB_t8_pb                        402  /*      0x192 */
-#define VERB_t8_p8                        403  /*      0x193 */
-
-#define PRUNE                       101        /* 0x65 Pattern fails at this
+#define VERB_tb                        202     /*      0x0ca */
+#define VERB_t8                        203     /*      0x0cb */
+#define VERB_tb_pb                        404  /*      0x194 */
+#define VERB_tb_p8                        405  /*      0x195 */
+#define VERB_t8_pb                        406  /*      0x196 */
+#define VERB_t8_p8                        407  /*      0x197 */
+
+#define PRUNE                       102        /* 0x66 Pattern fails at this
                                                   startpoint if
                                                   no-backtracking through this
                                                */
-#define PRUNE_tb                       202     /*      0x0ca */
-#define PRUNE_t8                       203     /*      0x0cb */
-#define PRUNE_tb_pb                       404  /*      0x194 */
-#define PRUNE_tb_p8                       405  /*      0x195 */
-#define PRUNE_t8_pb                       406  /*      0x196 */
-#define PRUNE_t8_p8                       407  /*      0x197 */
-
-#define MARKPOINT                   102        /* 0x66 Push the current
+#define PRUNE_tb                       204     /*      0x0cc */
+#define PRUNE_t8                       205     /*      0x0cd */
+#define PRUNE_tb_pb                       408  /*      0x198 */
+#define PRUNE_tb_p8                       409  /*      0x199 */
+#define PRUNE_t8_pb                       410  /*      0x19a */
+#define PRUNE_t8_p8                       411  /*      0x19b */
+
+#define MARKPOINT                   103        /* 0x67 Push the current
                                                   location for rollback by
                                                   cut. */
-#define MARKPOINT_tb                   204     /*      0x0cc */
-#define MARKPOINT_t8                   205     /*      0x0cd */
-#define MARKPOINT_tb_pb                   408  /*      0x198 */
-#define MARKPOINT_tb_p8                   409  /*      0x199 */
-#define MARKPOINT_t8_pb                   410  /*      0x19a */
-#define MARKPOINT_t8_p8                   411  /*      0x19b */
-
-#define SKIP                        103        /* 0x67 On failure skip forward
+#define MARKPOINT_tb                   206     /*      0x0ce */
+#define MARKPOINT_t8                   207     /*      0x0cf */
+#define MARKPOINT_tb_pb                   412  /*      0x19c */
+#define MARKPOINT_tb_p8                   413  /*      0x19d */
+#define MARKPOINT_t8_pb                   414  /*      0x19e */
+#define MARKPOINT_t8_p8                   415  /*      0x19f */
+
+#define SKIP                        104        /* 0x68 On failure skip forward
                                                   (to the mark) before
                                                   retrying */
-#define SKIP_tb                        206     /*      0x0ce */
-#define SKIP_t8                        207     /*      0x0cf */
-#define SKIP_tb_pb                        412  /*      0x19c */
-#define SKIP_tb_p8                        413  /*      0x19d */
-#define SKIP_t8_pb                        414  /*      0x19e */
-#define SKIP_t8_p8                        415  /*      0x19f */
-
-#define COMMIT                      104        /* 0x68 Pattern fails outright
+#define SKIP_tb                        208     /*      0x0d0 */
+#define SKIP_t8                        209     /*      0x0d1 */
+#define SKIP_tb_pb                        416  /*      0x1a0 */
+#define SKIP_tb_p8                        417  /*      0x1a1 */
+#define SKIP_t8_pb                        418  /*      0x1a2 */
+#define SKIP_t8_p8                        419  /*      0x1a3 */
+
+#define COMMIT                      105        /* 0x69 Pattern fails outright
                                                   if backtracking through this
                                                */
-#define COMMIT_tb                      208     /*      0x0d0 */
-#define COMMIT_t8                      209     /*      0x0d1 */
-#define COMMIT_tb_pb                      416  /*      0x1a0 */
-#define COMMIT_tb_p8                      417  /*      0x1a1 */
-#define COMMIT_t8_pb                      418  /*      0x1a2 */
-#define COMMIT_t8_p8                      419  /*      0x1a3 */
-
-#define CUTGROUP                    105        /* 0x69 On failure go to the
+#define COMMIT_tb                      210     /*      0x0d2 */
+#define COMMIT_t8                      211     /*      0x0d3 */
+#define COMMIT_tb_pb                      420  /*      0x1a4 */
+#define COMMIT_tb_p8                      421  /*      0x1a5 */
+#define COMMIT_t8_pb                      422  /*      0x1a6 */
+#define COMMIT_t8_p8                      423  /*      0x1a7 */
+
+#define CUTGROUP                    106        /* 0x6a On failure go to the
                                                   next alternation in the
                                                   group */
-#define CUTGROUP_tb                    210     /*      0x0d2 */
-#define CUTGROUP_t8                    211     /*      0x0d3 */
-#define CUTGROUP_tb_pb                    420  /*      0x1a4 */
-#define CUTGROUP_tb_p8                    421  /*      0x1a5 */
-#define CUTGROUP_t8_pb                    422  /*      0x1a6 */
-#define CUTGROUP_t8_p8                    423  /*      0x1a7 */
-
-#define KEEPS                       106        /* 0x6a $& begins here. */
-#define KEEPS_tb                       212     /*      0x0d4 */
-#define KEEPS_t8                       213     /*      0x0d5 */
-#define KEEPS_tb_pb                       424  /*      0x1a8 */
-#define KEEPS_tb_p8                       425  /*      0x1a9 */
-#define KEEPS_t8_pb                       426  /*      0x1aa */
-#define KEEPS_t8_p8                       427  /*      0x1ab */
-
-#define LOOKBEHIND_END              107        /* 0x6b Return from lookbehind
+#define CUTGROUP_tb                    212     /*      0x0d4 */
+#define CUTGROUP_t8                    213     /*      0x0d5 */
+#define CUTGROUP_tb_pb                    424  /*      0x1a8 */
+#define CUTGROUP_tb_p8                    425  /*      0x1a9 */
+#define CUTGROUP_t8_pb                    426  /*      0x1aa */
+#define CUTGROUP_t8_p8                    427  /*      0x1ab */
+
+#define KEEPS                       107        /* 0x6b $& begins here. */
+#define KEEPS_tb                       214     /*      0x0d6 */
+#define KEEPS_t8                       215     /*      0x0d7 */
+#define KEEPS_tb_pb                       428  /*      0x1ac */
+#define KEEPS_tb_p8                       429  /*      0x1ad */
+#define KEEPS_t8_pb                       430  /*      0x1ae */
+#define KEEPS_t8_p8                       431  /*      0x1af */
+
+#define LOOKBEHIND_END              108        /* 0x6c Return from lookbehind
                                                   (IFMATCH/UNLESSM) and
                                                   validate position */
-#define LOOKBEHIND_END_tb              214     /*      0x0d6 */
-#define LOOKBEHIND_END_t8              215     /*      0x0d7 */
-#define LOOKBEHIND_END_tb_pb              428  /*      0x1ac */
-#define LOOKBEHIND_END_tb_p8              429  /*      0x1ad */
-#define LOOKBEHIND_END_t8_pb              430  /*      0x1ae */
-#define LOOKBEHIND_END_t8_p8              431  /*      0x1af */
-
-#define OPTIMIZED                   108        /* 0x6c Placeholder for dump.
+#define LOOKBEHIND_END_tb              216     /*      0x0d8 */
+#define LOOKBEHIND_END_t8              217     /*      0x0d9 */
+#define LOOKBEHIND_END_tb_pb              432  /*      0x1b0 */
+#define LOOKBEHIND_END_tb_p8              433  /*      0x1b1 */
+#define LOOKBEHIND_END_t8_pb              434  /*      0x1b2 */
+#define LOOKBEHIND_END_t8_p8              435  /*      0x1b3 */
+
+#define OPTIMIZED                   109        /* 0x6d Placeholder for dump.
                                                */
-#define OPTIMIZED_tb                   216     /*      0x0d8 */
-#define OPTIMIZED_t8                   217     /*      0x0d9 */
-#define OPTIMIZED_tb_pb                   432  /*      0x1b0 */
-#define OPTIMIZED_tb_p8                   433  /*      0x1b1 */
-#define OPTIMIZED_t8_pb                   434  /*      0x1b2 */
-#define OPTIMIZED_t8_p8                   435  /*      0x1b3 */
-
-#define PSEUDO                      109        /* 0x6d Pseudo opcode for
+#define OPTIMIZED_tb                   218     /*      0x0da */
+#define OPTIMIZED_t8                   219     /*      0x0db */
+#define OPTIMIZED_tb_pb                   436  /*      0x1b4 */
+#define OPTIMIZED_tb_p8                   437  /*      0x1b5 */
+#define OPTIMIZED_t8_pb                   438  /*      0x1b6 */
+#define OPTIMIZED_t8_p8                   439  /*      0x1b7 */
+
+#define PSEUDO                      110        /* 0x6e Pseudo opcode for
                                                   internal use. */
-#define PSEUDO_tb                      218     /*      0x0da */
-#define PSEUDO_t8                      219     /*      0x0db */
-#define PSEUDO_tb_pb                      436  /*      0x1b4 */
-#define PSEUDO_tb_p8                      437  /*      0x1b5 */
-#define PSEUDO_t8_pb                      438  /*      0x1b6 */
-#define PSEUDO_t8_p8                      439  /*      0x1b7 */
-
-#define REGEX_SET                   110        /* 0x6e Regex set, temporary
+#define PSEUDO_tb                      220     /*      0x0dc */
+#define PSEUDO_t8                      221     /*      0x0dd */
+#define PSEUDO_tb_pb                      440  /*      0x1b8 */
+#define PSEUDO_tb_p8                      441  /*      0x1b9 */
+#define PSEUDO_t8_pb                      442  /*      0x1ba */
+#define PSEUDO_t8_p8                      443  /*      0x1bb */
+
+#define REGEX_SET                   111        /* 0x6f Regex set, temporary
                                                   node used in
                                                   pre-optimization compilation
                                                */
-#define REGEX_SET_tb                   220     /*      0x0dc */
-#define REGEX_SET_t8                   221     /*      0x0dd */
-#define REGEX_SET_tb_pb                   440  /*      0x1b8 */
-#define REGEX_SET_tb_p8                   441  /*      0x1b9 */
-#define REGEX_SET_t8_pb                   442  /*      0x1ba */
-#define REGEX_SET_t8_p8                   443  /*      0x1bb */
+#define REGEX_SET_tb                   222     /*      0x0de */
+#define REGEX_SET_t8                   223     /*      0x0df */
+#define REGEX_SET_tb_pb                   444  /*      0x1bc */
+#define REGEX_SET_tb_p8                   445  /*      0x1bd */
+#define REGEX_SET_t8_pb                   446  /*      0x1be */
+#define REGEX_SET_t8_p8                   447  /*      0x1bf */
 
        /* ------------ States ------------- */
-#define TRIE_next                   111        /* 0x6f state for TRIE */
-#define TRIE_next_tb                   222     /*      0x0de */
-#define TRIE_next_t8                   223     /*      0x0df */
-#define TRIE_next_tb_pb                   444  /*      0x1bc */
-#define TRIE_next_tb_p8                   445  /*      0x1bd */
-#define TRIE_next_t8_pb                   446  /*      0x1be */
-#define TRIE_next_t8_p8                   447  /*      0x1bf */
-
-#define TRIE_next_fail              112        /* 0x70 state for TRIE */
-#define TRIE_next_fail_tb              224     /*      0x0e0 */
-#define TRIE_next_fail_t8              225     /*      0x0e1 */
-#define TRIE_next_fail_tb_pb              448  /*      0x1c0 */
-#define TRIE_next_fail_tb_p8              449  /*      0x1c1 */
-#define TRIE_next_fail_t8_pb              450  /*      0x1c2 */
-#define TRIE_next_fail_t8_p8              451  /*      0x1c3 */
-
-#define EVAL_B                      113        /* 0x71 state for EVAL */
-#define EVAL_B_tb                      226     /*      0x0e2 */
-#define EVAL_B_t8                      227     /*      0x0e3 */
-#define EVAL_B_tb_pb                      452  /*      0x1c4 */
-#define EVAL_B_tb_p8                      453  /*      0x1c5 */
-#define EVAL_B_t8_pb                      454  /*      0x1c6 */
-#define EVAL_B_t8_p8                      455  /*      0x1c7 */
-
-#define EVAL_B_fail                 114        /* 0x72 state for EVAL */
-#define EVAL_B_fail_tb                 228     /*      0x0e4 */
-#define EVAL_B_fail_t8                 229     /*      0x0e5 */
-#define EVAL_B_fail_tb_pb                 456  /*      0x1c8 */
-#define EVAL_B_fail_tb_p8                 457  /*      0x1c9 */
-#define EVAL_B_fail_t8_pb                 458  /*      0x1ca */
-#define EVAL_B_fail_t8_p8                 459  /*      0x1cb */
-
-#define EVAL_postponed_AB           115        /* 0x73 state for EVAL */
-#define EVAL_postponed_AB_tb           230     /*      0x0e6 */
-#define EVAL_postponed_AB_t8           231     /*      0x0e7 */
-#define EVAL_postponed_AB_tb_pb           460  /*      0x1cc */
-#define EVAL_postponed_AB_tb_p8           461  /*      0x1cd */
-#define EVAL_postponed_AB_t8_pb           462  /*      0x1ce */
-#define EVAL_postponed_AB_t8_p8           463  /*      0x1cf */
-
-#define EVAL_postponed_AB_fail      116        /* 0x74 state for EVAL */
-#define EVAL_postponed_AB_fail_tb      232     /*      0x0e8 */
-#define EVAL_postponed_AB_fail_t8      233     /*      0x0e9 */
-#define EVAL_postponed_AB_fail_tb_pb      464  /*      0x1d0 */
-#define EVAL_postponed_AB_fail_tb_p8      465  /*      0x1d1 */
-#define EVAL_postponed_AB_fail_t8_pb      466  /*      0x1d2 */
-#define EVAL_postponed_AB_fail_t8_p8      467  /*      0x1d3 */
-
-#define CURLYX_end                  117        /* 0x75 state for CURLYX */
-#define CURLYX_end_tb                  234     /*      0x0ea */
-#define CURLYX_end_t8                  235     /*      0x0eb */
-#define CURLYX_end_tb_pb                  468  /*      0x1d4 */
-#define CURLYX_end_tb_p8                  469  /*      0x1d5 */
-#define CURLYX_end_t8_pb                  470  /*      0x1d6 */
-#define CURLYX_end_t8_p8                  471  /*      0x1d7 */
-
-#define CURLYX_end_fail             118        /* 0x76 state for CURLYX */
-#define CURLYX_end_fail_tb             236     /*      0x0ec */
-#define CURLYX_end_fail_t8             237     /*      0x0ed */
-#define CURLYX_end_fail_tb_pb             472  /*      0x1d8 */
-#define CURLYX_end_fail_tb_p8             473  /*      0x1d9 */
-#define CURLYX_end_fail_t8_pb             474  /*      0x1da */
-#define CURLYX_end_fail_t8_p8             475  /*      0x1db */
-
-#define WHILEM_A_pre                119        /* 0x77 state for WHILEM */
-#define WHILEM_A_pre_tb                238     /*      0x0ee */
-#define WHILEM_A_pre_t8                239     /*      0x0ef */
-#define WHILEM_A_pre_tb_pb                476  /*      0x1dc */
-#define WHILEM_A_pre_tb_p8                477  /*      0x1dd */
-#define WHILEM_A_pre_t8_pb                478  /*      0x1de */
-#define WHILEM_A_pre_t8_p8                479  /*      0x1df */
-
-#define WHILEM_A_pre_fail           120        /* 0x78 state for WHILEM */
-#define WHILEM_A_pre_fail_tb           240     /*      0x0f0 */
-#define WHILEM_A_pre_fail_t8           241     /*      0x0f1 */
-#define WHILEM_A_pre_fail_tb_pb           480  /*      0x1e0 */
-#define WHILEM_A_pre_fail_tb_p8           481  /*      0x1e1 */
-#define WHILEM_A_pre_fail_t8_pb           482  /*      0x1e2 */
-#define WHILEM_A_pre_fail_t8_p8           483  /*      0x1e3 */
-
-#define WHILEM_A_min                121        /* 0x79 state for WHILEM */
-#define WHILEM_A_min_tb                242     /*      0x0f2 */
-#define WHILEM_A_min_t8                243     /*      0x0f3 */
-#define WHILEM_A_min_tb_pb                484  /*      0x1e4 */
-#define WHILEM_A_min_tb_p8                485  /*      0x1e5 */
-#define WHILEM_A_min_t8_pb                486  /*      0x1e6 */
-#define WHILEM_A_min_t8_p8                487  /*      0x1e7 */
-
-#define WHILEM_A_min_fail           122        /* 0x7a state for WHILEM */
-#define WHILEM_A_min_fail_tb           244     /*      0x0f4 */
-#define WHILEM_A_min_fail_t8           245     /*      0x0f5 */
-#define WHILEM_A_min_fail_tb_pb           488  /*      0x1e8 */
-#define WHILEM_A_min_fail_tb_p8           489  /*      0x1e9 */
-#define WHILEM_A_min_fail_t8_pb           490  /*      0x1ea */
-#define WHILEM_A_min_fail_t8_p8           491  /*      0x1eb */
-
-#define WHILEM_A_max                123        /* 0x7b state for WHILEM */
-#define WHILEM_A_max_tb                246     /*      0x0f6 */
-#define WHILEM_A_max_t8                247     /*      0x0f7 */
-#define WHILEM_A_max_tb_pb                492  /*      0x1ec */
-#define WHILEM_A_max_tb_p8                493  /*      0x1ed */
-#define WHILEM_A_max_t8_pb                494  /*      0x1ee */
-#define WHILEM_A_max_t8_p8                495  /*      0x1ef */
-
-#define WHILEM_A_max_fail           124        /* 0x7c state for WHILEM */
-#define WHILEM_A_max_fail_tb           248     /*      0x0f8 */
-#define WHILEM_A_max_fail_t8           249     /*      0x0f9 */
-#define WHILEM_A_max_fail_tb_pb           496  /*      0x1f0 */
-#define WHILEM_A_max_fail_tb_p8           497  /*      0x1f1 */
-#define WHILEM_A_max_fail_t8_pb           498  /*      0x1f2 */
-#define WHILEM_A_max_fail_t8_p8           499  /*      0x1f3 */
-
-#define WHILEM_B_min                125        /* 0x7d state for WHILEM */
-#define WHILEM_B_min_tb                250     /*      0x0fa */
-#define WHILEM_B_min_t8                251     /*      0x0fb */
-#define WHILEM_B_min_tb_pb                500  /*      0x1f4 */
-#define WHILEM_B_min_tb_p8                501  /*      0x1f5 */
-#define WHILEM_B_min_t8_pb                502  /*      0x1f6 */
-#define WHILEM_B_min_t8_p8                503  /*      0x1f7 */
-
-#define WHILEM_B_min_fail           126        /* 0x7e state for WHILEM */
-#define WHILEM_B_min_fail_tb           252     /*      0x0fc */
-#define WHILEM_B_min_fail_t8           253     /*      0x0fd */
-#define WHILEM_B_min_fail_tb_pb           504  /*      0x1f8 */
-#define WHILEM_B_min_fail_tb_p8           505  /*      0x1f9 */
-#define WHILEM_B_min_fail_t8_pb           506  /*      0x1fa */
-#define WHILEM_B_min_fail_t8_p8           507  /*      0x1fb */
-
-#define WHILEM_B_max                127        /* 0x7f state for WHILEM */
-#define WHILEM_B_max_tb                254     /*      0x0fe */
-#define WHILEM_B_max_t8                255     /*      0x0ff */
-#define WHILEM_B_max_tb_pb                508  /*      0x1fc */
-#define WHILEM_B_max_tb_p8                509  /*      0x1fd */
-#define WHILEM_B_max_t8_pb                510  /*      0x1fe */
-#define WHILEM_B_max_t8_p8                511  /*      0x1ff */
-
-#define WHILEM_B_max_fail           128        /* 0x80 state for WHILEM */
-#define WHILEM_B_max_fail_tb           256     /*      0x100 */
-#define WHILEM_B_max_fail_t8           257     /*      0x101 */
-#define WHILEM_B_max_fail_tb_pb           512  /*      0x200 */
-#define WHILEM_B_max_fail_tb_p8           513  /*      0x201 */
-#define WHILEM_B_max_fail_t8_pb           514  /*      0x202 */
-#define WHILEM_B_max_fail_t8_p8           515  /*      0x203 */
-
-#define BRANCH_next                 129        /* 0x81 state for BRANCH */
-#define BRANCH_next_tb                 258     /*      0x102 */
-#define BRANCH_next_t8                 259     /*      0x103 */
-#define BRANCH_next_tb_pb                 516  /*      0x204 */
-#define BRANCH_next_tb_p8                 517  /*      0x205 */
-#define BRANCH_next_t8_pb                 518  /*      0x206 */
-#define BRANCH_next_t8_p8                 519  /*      0x207 */
-
-#define BRANCH_next_fail            130        /* 0x82 state for BRANCH */
-#define BRANCH_next_fail_tb            260     /*      0x104 */
-#define BRANCH_next_fail_t8            261     /*      0x105 */
-#define BRANCH_next_fail_tb_pb            520  /*      0x208 */
-#define BRANCH_next_fail_tb_p8            521  /*      0x209 */
-#define BRANCH_next_fail_t8_pb            522  /*      0x20a */
-#define BRANCH_next_fail_t8_p8            523  /*      0x20b */
-
-#define CURLYM_A                    131        /* 0x83 state for CURLYM */
-#define CURLYM_A_tb                    262     /*      0x106 */
-#define CURLYM_A_t8                    263     /*      0x107 */
-#define CURLYM_A_tb_pb                    524  /*      0x20c */
-#define CURLYM_A_tb_p8                    525  /*      0x20d */
-#define CURLYM_A_t8_pb                    526  /*      0x20e */
-#define CURLYM_A_t8_p8                    527  /*      0x20f */
-
-#define CURLYM_A_fail               132        /* 0x84 state for CURLYM */
-#define CURLYM_A_fail_tb               264     /*      0x108 */
-#define CURLYM_A_fail_t8               265     /*      0x109 */
-#define CURLYM_A_fail_tb_pb               528  /*      0x210 */
-#define CURLYM_A_fail_tb_p8               529  /*      0x211 */
-#define CURLYM_A_fail_t8_pb               530  /*      0x212 */
-#define CURLYM_A_fail_t8_p8               531  /*      0x213 */
-
-#define CURLYM_B                    133        /* 0x85 state for CURLYM */
-#define CURLYM_B_tb                    266     /*      0x10a */
-#define CURLYM_B_t8                    267     /*      0x10b */
-#define CURLYM_B_tb_pb                    532  /*      0x214 */
-#define CURLYM_B_tb_p8                    533  /*      0x215 */
-#define CURLYM_B_t8_pb                    534  /*      0x216 */
-#define CURLYM_B_t8_p8                    535  /*      0x217 */
-
-#define CURLYM_B_fail               134        /* 0x86 state for CURLYM */
-#define CURLYM_B_fail_tb               268     /*      0x10c */
-#define CURLYM_B_fail_t8               269     /*      0x10d */
-#define CURLYM_B_fail_tb_pb               536  /*      0x218 */
-#define CURLYM_B_fail_tb_p8               537  /*      0x219 */
-#define CURLYM_B_fail_t8_pb               538  /*      0x21a */
-#define CURLYM_B_fail_t8_p8               539  /*      0x21b */
-
-#define IFMATCH_A                   135        /* 0x87 state for IFMATCH */
-#define IFMATCH_A_tb                   270     /*      0x10e */
-#define IFMATCH_A_t8                   271     /*      0x10f */
-#define IFMATCH_A_tb_pb                   540  /*      0x21c */
-#define IFMATCH_A_tb_p8                   541  /*      0x21d */
-#define IFMATCH_A_t8_pb                   542  /*      0x21e */
-#define IFMATCH_A_t8_p8                   543  /*      0x21f */
-
-#define IFMATCH_A_fail              136        /* 0x88 state for IFMATCH */
-#define IFMATCH_A_fail_tb              272     /*      0x110 */
-#define IFMATCH_A_fail_t8              273     /*      0x111 */
-#define IFMATCH_A_fail_tb_pb              544  /*      0x220 */
-#define IFMATCH_A_fail_tb_p8              545  /*      0x221 */
-#define IFMATCH_A_fail_t8_pb              546  /*      0x222 */
-#define IFMATCH_A_fail_t8_p8              547  /*      0x223 */
-
-#define CURLY_B_min                 137        /* 0x89 state for CURLY */
-#define CURLY_B_min_tb                 274     /*      0x112 */
-#define CURLY_B_min_t8                 275     /*      0x113 */
-#define CURLY_B_min_tb_pb                 548  /*      0x224 */
-#define CURLY_B_min_tb_p8                 549  /*      0x225 */
-#define CURLY_B_min_t8_pb                 550  /*      0x226 */
-#define CURLY_B_min_t8_p8                 551  /*      0x227 */
-
-#define CURLY_B_min_fail            138        /* 0x8a state for CURLY */
-#define CURLY_B_min_fail_tb            276     /*      0x114 */
-#define CURLY_B_min_fail_t8            277     /*      0x115 */
-#define CURLY_B_min_fail_tb_pb            552  /*      0x228 */
-#define CURLY_B_min_fail_tb_p8            553  /*      0x229 */
-#define CURLY_B_min_fail_t8_pb            554  /*      0x22a */
-#define CURLY_B_min_fail_t8_p8            555  /*      0x22b */
-
-#define CURLY_B_max                 139        /* 0x8b state for CURLY */
-#define CURLY_B_max_tb                 278     /*      0x116 */
-#define CURLY_B_max_t8                 279     /*      0x117 */
-#define CURLY_B_max_tb_pb                 556  /*      0x22c */
-#define CURLY_B_max_tb_p8                 557  /*      0x22d */
-#define CURLY_B_max_t8_pb                 558  /*      0x22e */
-#define CURLY_B_max_t8_p8                 559  /*      0x22f */
-
-#define CURLY_B_max_fail            140        /* 0x8c state for CURLY */
-#define CURLY_B_max_fail_tb            280     /*      0x118 */
-#define CURLY_B_max_fail_t8            281     /*      0x119 */
-#define CURLY_B_max_fail_tb_pb            560  /*      0x230 */
-#define CURLY_B_max_fail_tb_p8            561  /*      0x231 */
-#define CURLY_B_max_fail_t8_pb            562  /*      0x232 */
-#define CURLY_B_max_fail_t8_p8            563  /*      0x233 */
-
-#define COMMIT_next                 141        /* 0x8d state for COMMIT */
-#define COMMIT_next_tb                 282     /*      0x11a */
-#define COMMIT_next_t8                 283     /*      0x11b */
-#define COMMIT_next_tb_pb                 564  /*      0x234 */
-#define COMMIT_next_tb_p8                 565  /*      0x235 */
-#define COMMIT_next_t8_pb                 566  /*      0x236 */
-#define COMMIT_next_t8_p8                 567  /*      0x237 */
-
-#define COMMIT_next_fail            142        /* 0x8e state for COMMIT */
-#define COMMIT_next_fail_tb            284     /*      0x11c */
-#define COMMIT_next_fail_t8            285     /*      0x11d */
-#define COMMIT_next_fail_tb_pb            568  /*      0x238 */
-#define COMMIT_next_fail_tb_p8            569  /*      0x239 */
-#define COMMIT_next_fail_t8_pb            570  /*      0x23a */
-#define COMMIT_next_fail_t8_p8            571  /*      0x23b */
-
-#define MARKPOINT_next              143        /* 0x8f state for MARKPOINT */
-#define MARKPOINT_next_tb              286     /*      0x11e */
-#define MARKPOINT_next_t8              287     /*      0x11f */
-#define MARKPOINT_next_tb_pb              572  /*      0x23c */
-#define MARKPOINT_next_tb_p8              573  /*      0x23d */
-#define MARKPOINT_next_t8_pb              574  /*      0x23e */
-#define MARKPOINT_next_t8_p8              575  /*      0x23f */
-
-#define MARKPOINT_next_fail         144        /* 0x90 state for MARKPOINT */
-#define MARKPOINT_next_fail_tb         288     /*      0x120 */
-#define MARKPOINT_next_fail_t8         289     /*      0x121 */
-#define MARKPOINT_next_fail_tb_pb         576  /*      0x240 */
-#define MARKPOINT_next_fail_tb_p8         577  /*      0x241 */
-#define MARKPOINT_next_fail_t8_pb         578  /*      0x242 */
-#define MARKPOINT_next_fail_t8_p8         579  /*      0x243 */
-
-#define SKIP_next                   145        /* 0x91 state for SKIP */
-#define SKIP_next_tb                   290     /*      0x122 */
-#define SKIP_next_t8                   291     /*      0x123 */
-#define SKIP_next_tb_pb                   580  /*      0x244 */
-#define SKIP_next_tb_p8                   581  /*      0x245 */
-#define SKIP_next_t8_pb                   582  /*      0x246 */
-#define SKIP_next_t8_p8                   583  /*      0x247 */
-
-#define SKIP_next_fail              146        /* 0x92 state for SKIP */
-#define SKIP_next_fail_tb              292     /*      0x124 */
-#define SKIP_next_fail_t8              293     /*      0x125 */
-#define SKIP_next_fail_tb_pb              584  /*      0x248 */
-#define SKIP_next_fail_tb_p8              585  /*      0x249 */
-#define SKIP_next_fail_t8_pb              586  /*      0x24a */
-#define SKIP_next_fail_t8_p8              587  /*      0x24b */
-
-#define CUTGROUP_next               147        /* 0x93 state for CUTGROUP */
-#define CUTGROUP_next_tb               294     /*      0x126 */
-#define CUTGROUP_next_t8               295     /*      0x127 */
-#define CUTGROUP_next_tb_pb               588  /*      0x24c */
-#define CUTGROUP_next_tb_p8               589  /*      0x24d */
-#define CUTGROUP_next_t8_pb               590  /*      0x24e */
-#define CUTGROUP_next_t8_p8               591  /*      0x24f */
-
-#define CUTGROUP_next_fail          148        /* 0x94 state for CUTGROUP */
-#define CUTGROUP_next_fail_tb          296     /*      0x128 */
-#define CUTGROUP_next_fail_t8          297     /*      0x129 */
-#define CUTGROUP_next_fail_tb_pb          592  /*      0x250 */
-#define CUTGROUP_next_fail_tb_p8          593  /*      0x251 */
-#define CUTGROUP_next_fail_t8_pb          594  /*      0x252 */
-#define CUTGROUP_next_fail_t8_p8          595  /*      0x253 */
-
-#define KEEPS_next                  149        /* 0x95 state for KEEPS */
-#define KEEPS_next_tb                  298     /*      0x12a */
-#define KEEPS_next_t8                  299     /*      0x12b */
-#define KEEPS_next_tb_pb                  596  /*      0x254 */
-#define KEEPS_next_tb_p8                  597  /*      0x255 */
-#define KEEPS_next_t8_pb                  598  /*      0x256 */
-#define KEEPS_next_t8_p8                  599  /*      0x257 */
-
-#define KEEPS_next_fail             150        /* 0x96 state for KEEPS */
-#define KEEPS_next_fail_tb             300     /*      0x12c */
-#define KEEPS_next_fail_t8             301     /*      0x12d */
-#define KEEPS_next_fail_tb_pb             600  /*      0x258 */
-#define KEEPS_next_fail_tb_p8             601  /*      0x259 */
-#define KEEPS_next_fail_t8_pb             602  /*      0x25a */
-#define KEEPS_next_fail_t8_p8             603  /*      0x25b */
-
-
-/* PL_regkind[] What type of regop or state is this. */
+#define TRIE_next                   112        /* 0x70 state for TRIE */
+#define TRIE_next_tb                   224     /*      0x0e0 */
+#define TRIE_next_t8                   225     /*      0x0e1 */
+#define TRIE_next_tb_pb                   448  /*      0x1c0 */
+#define TRIE_next_tb_p8                   449  /*      0x1c1 */
+#define TRIE_next_t8_pb                   450  /*      0x1c2 */
+#define TRIE_next_t8_p8                   451  /*      0x1c3 */
+
+#define TRIE_next_fail              113        /* 0x71 state for TRIE */
+#define TRIE_next_fail_tb              226     /*      0x0e2 */
+#define TRIE_next_fail_t8              227     /*      0x0e3 */
+#define TRIE_next_fail_tb_pb              452  /*      0x1c4 */
+#define TRIE_next_fail_tb_p8              453  /*      0x1c5 */
+#define TRIE_next_fail_t8_pb              454  /*      0x1c6 */
+#define TRIE_next_fail_t8_p8              455  /*      0x1c7 */
+
+#define EVAL_B                      114        /* 0x72 state for EVAL */
+#define EVAL_B_tb                      228     /*      0x0e4 */
+#define EVAL_B_t8                      229     /*      0x0e5 */
+#define EVAL_B_tb_pb                      456  /*      0x1c8 */
+#define EVAL_B_tb_p8                      457  /*      0x1c9 */
+#define EVAL_B_t8_pb                      458  /*      0x1ca */
+#define EVAL_B_t8_p8                      459  /*      0x1cb */
+
+#define EVAL_B_fail                 115        /* 0x73 state for EVAL */
+#define EVAL_B_fail_tb                 230     /*      0x0e6 */
+#define EVAL_B_fail_t8                 231     /*      0x0e7 */
+#define EVAL_B_fail_tb_pb                 460  /*      0x1cc */
+#define EVAL_B_fail_tb_p8                 461  /*      0x1cd */
+#define EVAL_B_fail_t8_pb                 462  /*      0x1ce */
+#define EVAL_B_fail_t8_p8                 463  /*      0x1cf */
+
+#define EVAL_postponed_AB           116        /* 0x74 state for EVAL */
+#define EVAL_postponed_AB_tb           232     /*      0x0e8 */
+#define EVAL_postponed_AB_t8           233     /*      0x0e9 */
+#define EVAL_postponed_AB_tb_pb           464  /*      0x1d0 */
+#define EVAL_postponed_AB_tb_p8           465  /*      0x1d1 */
+#define EVAL_postponed_AB_t8_pb           466  /*      0x1d2 */
+#define EVAL_postponed_AB_t8_p8           467  /*      0x1d3 */
+
+#define EVAL_postponed_AB_fail      117        /* 0x75 state for EVAL */
+#define EVAL_postponed_AB_fail_tb      234     /*      0x0ea */
+#define EVAL_postponed_AB_fail_t8      235     /*      0x0eb */
+#define EVAL_postponed_AB_fail_tb_pb      468  /*      0x1d4 */
+#define EVAL_postponed_AB_fail_tb_p8      469  /*      0x1d5 */
+#define EVAL_postponed_AB_fail_t8_pb      470  /*      0x1d6 */
+#define EVAL_postponed_AB_fail_t8_p8      471  /*      0x1d7 */
+
+#define CURLYX_end                  118        /* 0x76 state for CURLYX */
+#define CURLYX_end_tb                  236     /*      0x0ec */
+#define CURLYX_end_t8                  237     /*      0x0ed */
+#define CURLYX_end_tb_pb                  472  /*      0x1d8 */
+#define CURLYX_end_tb_p8                  473  /*      0x1d9 */
+#define CURLYX_end_t8_pb                  474  /*      0x1da */
+#define CURLYX_end_t8_p8                  475  /*      0x1db */
+
+#define CURLYX_end_fail             119        /* 0x77 state for CURLYX */
+#define CURLYX_end_fail_tb             238     /*      0x0ee */
+#define CURLYX_end_fail_t8             239     /*      0x0ef */
+#define CURLYX_end_fail_tb_pb             476  /*      0x1dc */
+#define CURLYX_end_fail_tb_p8             477  /*      0x1dd */
+#define CURLYX_end_fail_t8_pb             478  /*      0x1de */
+#define CURLYX_end_fail_t8_p8             479  /*      0x1df */
+
+#define WHILEM_A_pre                120        /* 0x78 state for WHILEM */
+#define WHILEM_A_pre_tb                240     /*      0x0f0 */
+#define WHILEM_A_pre_t8                241     /*      0x0f1 */
+#define WHILEM_A_pre_tb_pb                480  /*      0x1e0 */
+#define WHILEM_A_pre_tb_p8                481  /*      0x1e1 */
+#define WHILEM_A_pre_t8_pb                482  /*      0x1e2 */
+#define WHILEM_A_pre_t8_p8                483  /*      0x1e3 */
+
+#define WHILEM_A_pre_fail           121        /* 0x79 state for WHILEM */
+#define WHILEM_A_pre_fail_tb           242     /*      0x0f2 */
+#define WHILEM_A_pre_fail_t8           243     /*      0x0f3 */
+#define WHILEM_A_pre_fail_tb_pb           484  /*      0x1e4 */
+#define WHILEM_A_pre_fail_tb_p8           485  /*      0x1e5 */
+#define WHILEM_A_pre_fail_t8_pb           486  /*      0x1e6 */
+#define WHILEM_A_pre_fail_t8_p8           487  /*      0x1e7 */
+
+#define WHILEM_A_min                122        /* 0x7a state for WHILEM */
+#define WHILEM_A_min_tb                244     /*      0x0f4 */
+#define WHILEM_A_min_t8                245     /*      0x0f5 */
+#define WHILEM_A_min_tb_pb                488  /*      0x1e8 */
+#define WHILEM_A_min_tb_p8                489  /*      0x1e9 */
+#define WHILEM_A_min_t8_pb                490  /*      0x1ea */
+#define WHILEM_A_min_t8_p8                491  /*      0x1eb */
+
+#define WHILEM_A_min_fail           123        /* 0x7b state for WHILEM */
+#define WHILEM_A_min_fail_tb           246     /*      0x0f6 */
+#define WHILEM_A_min_fail_t8           247     /*      0x0f7 */
+#define WHILEM_A_min_fail_tb_pb           492  /*      0x1ec */
+#define WHILEM_A_min_fail_tb_p8           493  /*      0x1ed */
+#define WHILEM_A_min_fail_t8_pb           494  /*      0x1ee */
+#define WHILEM_A_min_fail_t8_p8           495  /*      0x1ef */
+
+#define WHILEM_A_max                124        /* 0x7c state for WHILEM */
+#define WHILEM_A_max_tb                248     /*      0x0f8 */
+#define WHILEM_A_max_t8                249     /*      0x0f9 */
+#define WHILEM_A_max_tb_pb                496  /*      0x1f0 */
+#define WHILEM_A_max_tb_p8                497  /*      0x1f1 */
+#define WHILEM_A_max_t8_pb                498  /*      0x1f2 */
+#define WHILEM_A_max_t8_p8                499  /*      0x1f3 */
+
+#define WHILEM_A_max_fail           125        /* 0x7d state for WHILEM */
+#define WHILEM_A_max_fail_tb           250     /*      0x0fa */
+#define WHILEM_A_max_fail_t8           251     /*      0x0fb */
+#define WHILEM_A_max_fail_tb_pb           500  /*      0x1f4 */
+#define WHILEM_A_max_fail_tb_p8           501  /*      0x1f5 */
+#define WHILEM_A_max_fail_t8_pb           502  /*      0x1f6 */
+#define WHILEM_A_max_fail_t8_p8           503  /*      0x1f7 */
+
+#define WHILEM_B_min                126        /* 0x7e state for WHILEM */
+#define WHILEM_B_min_tb                252     /*      0x0fc */
+#define WHILEM_B_min_t8                253     /*      0x0fd */
+#define WHILEM_B_min_tb_pb                504  /*      0x1f8 */
+#define WHILEM_B_min_tb_p8                505  /*      0x1f9 */
+#define WHILEM_B_min_t8_pb                506  /*      0x1fa */
+#define WHILEM_B_min_t8_p8                507  /*      0x1fb */
+
+#define WHILEM_B_min_fail           127        /* 0x7f state for WHILEM */
+#define WHILEM_B_min_fail_tb           254     /*      0x0fe */
+#define WHILEM_B_min_fail_t8           255     /*      0x0ff */
+#define WHILEM_B_min_fail_tb_pb           508  /*      0x1fc */
+#define WHILEM_B_min_fail_tb_p8           509  /*      0x1fd */
+#define WHILEM_B_min_fail_t8_pb           510  /*      0x1fe */
+#define WHILEM_B_min_fail_t8_p8           511  /*      0x1ff */
+
+#define WHILEM_B_max                128        /* 0x80 state for WHILEM */
+#define WHILEM_B_max_tb                256     /*      0x100 */
+#define WHILEM_B_max_t8                257     /*      0x101 */
+#define WHILEM_B_max_tb_pb                512  /*      0x200 */
+#define WHILEM_B_max_tb_p8                513  /*      0x201 */
+#define WHILEM_B_max_t8_pb                514  /*      0x202 */
+#define WHILEM_B_max_t8_p8                515  /*      0x203 */
+
+#define WHILEM_B_max_fail           129        /* 0x81 state for WHILEM */
+#define WHILEM_B_max_fail_tb           258     /*      0x102 */
+#define WHILEM_B_max_fail_t8           259     /*      0x103 */
+#define WHILEM_B_max_fail_tb_pb           516  /*      0x204 */
+#define WHILEM_B_max_fail_tb_p8           517  /*      0x205 */
+#define WHILEM_B_max_fail_t8_pb           518  /*      0x206 */
+#define WHILEM_B_max_fail_t8_p8           519  /*      0x207 */
+
+#define BRANCH_next                 130        /* 0x82 state for BRANCH */
+#define BRANCH_next_tb                 260     /*      0x104 */
+#define BRANCH_next_t8                 261     /*      0x105 */
+#define BRANCH_next_tb_pb                 520  /*      0x208 */
+#define BRANCH_next_tb_p8                 521  /*      0x209 */
+#define BRANCH_next_t8_pb                 522  /*      0x20a */
+#define BRANCH_next_t8_p8                 523  /*      0x20b */
+
+#define BRANCH_next_fail            131        /* 0x83 state for BRANCH */
+#define BRANCH_next_fail_tb            262     /*      0x106 */
+#define BRANCH_next_fail_t8            263     /*      0x107 */
+#define BRANCH_next_fail_tb_pb            524  /*      0x20c */
+#define BRANCH_next_fail_tb_p8            525  /*      0x20d */
+#define BRANCH_next_fail_t8_pb            526  /*      0x20e */
+#define BRANCH_next_fail_t8_p8            527  /*      0x20f */
+
+#define CURLYM_A                    132        /* 0x84 state for CURLYM */
+#define CURLYM_A_tb                    264     /*      0x108 */
+#define CURLYM_A_t8                    265     /*      0x109 */
+#define CURLYM_A_tb_pb                    528  /*      0x210 */
+#define CURLYM_A_tb_p8                    529  /*      0x211 */
+#define CURLYM_A_t8_pb                    530  /*      0x212 */
+#define CURLYM_A_t8_p8                    531  /*      0x213 */
+
+#define CURLYM_A_fail               133        /* 0x85 state for CURLYM */
+#define CURLYM_A_fail_tb               266     /*      0x10a */
+#define CURLYM_A_fail_t8               267     /*      0x10b */
+#define CURLYM_A_fail_tb_pb               532  /*      0x214 */
+#define CURLYM_A_fail_tb_p8               533  /*      0x215 */
+#define CURLYM_A_fail_t8_pb               534  /*      0x216 */
+#define CURLYM_A_fail_t8_p8               535  /*      0x217 */
+
+#define CURLYM_B                    134        /* 0x86 state for CURLYM */
+#define CURLYM_B_tb                    268     /*      0x10c */
+#define CURLYM_B_t8                    269     /*      0x10d */
+#define CURLYM_B_tb_pb                    536  /*      0x218 */
+#define CURLYM_B_tb_p8                    537  /*      0x219 */
+#define CURLYM_B_t8_pb                    538  /*      0x21a */
+#define CURLYM_B_t8_p8                    539  /*      0x21b */
+
+#define CURLYM_B_fail               135        /* 0x87 state for CURLYM */
+#define CURLYM_B_fail_tb               270     /*      0x10e */
+#define CURLYM_B_fail_t8               271     /*      0x10f */
+#define CURLYM_B_fail_tb_pb               540  /*      0x21c */
+#define CURLYM_B_fail_tb_p8               541  /*      0x21d */
+#define CURLYM_B_fail_t8_pb               542  /*      0x21e */
+#define CURLYM_B_fail_t8_p8               543  /*      0x21f */
+
+#define IFMATCH_A                   136        /* 0x88 state for IFMATCH */
+#define IFMATCH_A_tb                   272     /*      0x110 */
+#define IFMATCH_A_t8                   273     /*      0x111 */
+#define IFMATCH_A_tb_pb                   544  /*      0x220 */
+#define IFMATCH_A_tb_p8                   545  /*      0x221 */
+#define IFMATCH_A_t8_pb                   546  /*      0x222 */
+#define IFMATCH_A_t8_p8                   547  /*      0x223 */
+
+#define IFMATCH_A_fail              137        /* 0x89 state for IFMATCH */
+#define IFMATCH_A_fail_tb              274     /*      0x112 */
+#define IFMATCH_A_fail_t8              275     /*      0x113 */
+#define IFMATCH_A_fail_tb_pb              548  /*      0x224 */
+#define IFMATCH_A_fail_tb_p8              549  /*      0x225 */
+#define IFMATCH_A_fail_t8_pb              550  /*      0x226 */
+#define IFMATCH_A_fail_t8_p8              551  /*      0x227 */
+
+#define CURLY_B_min                 138        /* 0x8a state for CURLY */
+#define CURLY_B_min_tb                 276     /*      0x114 */
+#define CURLY_B_min_t8                 277     /*      0x115 */
+#define CURLY_B_min_tb_pb                 552  /*      0x228 */
+#define CURLY_B_min_tb_p8                 553  /*      0x229 */
+#define CURLY_B_min_t8_pb                 554  /*      0x22a */
+#define CURLY_B_min_t8_p8                 555  /*      0x22b */
+
+#define CURLY_B_min_fail            139        /* 0x8b state for CURLY */
+#define CURLY_B_min_fail_tb            278     /*      0x116 */
+#define CURLY_B_min_fail_t8            279     /*      0x117 */
+#define CURLY_B_min_fail_tb_pb            556  /*      0x22c */
+#define CURLY_B_min_fail_tb_p8            557  /*      0x22d */
+#define CURLY_B_min_fail_t8_pb            558  /*      0x22e */
+#define CURLY_B_min_fail_t8_p8            559  /*      0x22f */
+
+#define CURLY_B_max                 140        /* 0x8c state for CURLY */
+#define CURLY_B_max_tb                 280     /*      0x118 */
+#define CURLY_B_max_t8                 281     /*      0x119 */
+#define CURLY_B_max_tb_pb                 560  /*      0x230 */
+#define CURLY_B_max_tb_p8                 561  /*      0x231 */
+#define CURLY_B_max_t8_pb                 562  /*      0x232 */
+#define CURLY_B_max_t8_p8                 563  /*      0x233 */
+
+#define CURLY_B_max_fail            141        /* 0x8d state for CURLY */
+#define CURLY_B_max_fail_tb            282     /*      0x11a */
+#define CURLY_B_max_fail_t8            283     /*      0x11b */
+#define CURLY_B_max_fail_tb_pb            564  /*      0x234 */
+#define CURLY_B_max_fail_tb_p8            565  /*      0x235 */
+#define CURLY_B_max_fail_t8_pb            566  /*      0x236 */
+#define CURLY_B_max_fail_t8_p8            567  /*      0x237 */
+
+#define COMMIT_next                 142        /* 0x8e state for COMMIT */
+#define COMMIT_next_tb                 284     /*      0x11c */
+#define COMMIT_next_t8                 285     /*      0x11d */
+#define COMMIT_next_tb_pb                 568  /*      0x238 */
+#define COMMIT_next_tb_p8                 569  /*      0x239 */
+#define COMMIT_next_t8_pb                 570  /*      0x23a */
+#define COMMIT_next_t8_p8                 571  /*      0x23b */
+
+#define COMMIT_next_fail            143        /* 0x8f state for COMMIT */
+#define COMMIT_next_fail_tb            286     /*      0x11e */
+#define COMMIT_next_fail_t8            287     /*      0x11f */
+#define COMMIT_next_fail_tb_pb            572  /*      0x23c */
+#define COMMIT_next_fail_tb_p8            573  /*      0x23d */
+#define COMMIT_next_fail_t8_pb            574  /*      0x23e */
+#define COMMIT_next_fail_t8_p8            575  /*      0x23f */
+
+#define MARKPOINT_next              144        /* 0x90 state for MARKPOINT */
+#define MARKPOINT_next_tb              288     /*      0x120 */
+#define MARKPOINT_next_t8              289     /*      0x121 */
+#define MARKPOINT_next_tb_pb              576  /*      0x240 */
+#define MARKPOINT_next_tb_p8              577  /*      0x241 */
+#define MARKPOINT_next_t8_pb              578  /*      0x242 */
+#define MARKPOINT_next_t8_p8              579  /*      0x243 */
+
+#define MARKPOINT_next_fail         145        /* 0x91 state for MARKPOINT */
+#define MARKPOINT_next_fail_tb         290     /*      0x122 */
+#define MARKPOINT_next_fail_t8         291     /*      0x123 */
+#define MARKPOINT_next_fail_tb_pb         580  /*      0x244 */
+#define MARKPOINT_next_fail_tb_p8         581  /*      0x245 */
+#define MARKPOINT_next_fail_t8_pb         582  /*      0x246 */
+#define MARKPOINT_next_fail_t8_p8         583  /*      0x247 */
+
+#define SKIP_next                   146        /* 0x92 state for SKIP */
+#define SKIP_next_tb                   292     /*      0x124 */
+#define SKIP_next_t8                   293     /*      0x125 */
+#define SKIP_next_tb_pb                   584  /*      0x248 */
+#define SKIP_next_tb_p8                   585  /*      0x249 */
+#define SKIP_next_t8_pb                   586  /*      0x24a */
+#define SKIP_next_t8_p8                   587  /*      0x24b */
+
+#define SKIP_next_fail              147        /* 0x93 state for SKIP */
+#define SKIP_next_fail_tb              294     /*      0x126 */
+#define SKIP_next_fail_t8              295     /*      0x127 */
+#define SKIP_next_fail_tb_pb              588  /*      0x24c */
+#define SKIP_next_fail_tb_p8              589  /*      0x24d */
+#define SKIP_next_fail_t8_pb              590  /*      0x24e */
+#define SKIP_next_fail_t8_p8              591  /*      0x24f */
+
+#define CUTGROUP_next               148        /* 0x94 state for CUTGROUP */
+#define CUTGROUP_next_tb               296     /*      0x128 */
+#define CUTGROUP_next_t8               297     /*      0x129 */
+#define CUTGROUP_next_tb_pb               592  /*      0x250 */
+#define CUTGROUP_next_tb_p8               593  /*      0x251 */
+#define CUTGROUP_next_t8_pb               594  /*      0x252 */
+#define CUTGROUP_next_t8_p8               595  /*      0x253 */
+
+#define CUTGROUP_next_fail          149        /* 0x95 state for CUTGROUP */
+#define CUTGROUP_next_fail_tb          298     /*      0x12a */
+#define CUTGROUP_next_fail_t8          299     /*      0x12b */
+#define CUTGROUP_next_fail_tb_pb          596  /*      0x254 */
+#define CUTGROUP_next_fail_tb_p8          597  /*      0x255 */
+#define CUTGROUP_next_fail_t8_pb          598  /*      0x256 */
+#define CUTGROUP_next_fail_t8_p8          599  /*      0x257 */
+
+#define KEEPS_next                  150        /* 0x96 state for KEEPS */
+#define KEEPS_next_tb                  300     /*      0x12c */
+#define KEEPS_next_t8                  301     /*      0x12d */
+#define KEEPS_next_tb_pb                  600  /*      0x258 */
+#define KEEPS_next_tb_p8                  601  /*      0x259 */
+#define KEEPS_next_t8_pb                  602  /*      0x25a */
+#define KEEPS_next_t8_p8                  603  /*      0x25b */
+
+#define KEEPS_next_fail             151        /* 0x97 state for KEEPS */
+#define KEEPS_next_fail_tb             302     /*      0x12e */
+#define KEEPS_next_fail_t8             303     /*      0x12f */
+#define KEEPS_next_fail_tb_pb             604  /*      0x25c */
+#define KEEPS_next_fail_tb_p8             605  /*      0x25d */
+#define KEEPS_next_fail_t8_pb             606  /*      0x25e */
+#define KEEPS_next_fail_t8_p8             607  /*      0x25f */
+
+#define REF_next                    152        /* 0x98 state for REF */
+#define REF_next_tb                    304     /*      0x130 */
+#define REF_next_t8                    305     /*      0x131 */
+#define REF_next_tb_pb                    608  /*      0x260 */
+#define REF_next_tb_p8                    609  /*      0x261 */
+#define REF_next_t8_pb                    610  /*      0x262 */
+#define REF_next_t8_p8                    611  /*      0x263 */
+
+#define REF_next_fail               153        /* 0x99 state for REF */
+#define REF_next_fail_tb               306     /*      0x132 */
+#define REF_next_fail_t8               307     /*      0x133 */
+#define REF_next_fail_tb_pb               612  /*      0x264 */
+#define REF_next_fail_tb_p8               613  /*      0x265 */
+#define REF_next_fail_t8_pb               614  /*      0x266 */
+#define REF_next_fail_t8_p8               615  /*      0x267 */
+
+
+/* PL_regnode_name[] - Opcode/state names in string form, for debugging */
 
 #ifndef DOINIT
-EXTCONST U8 PL_regkind[];
+EXTCONST char * PL_regnode_name[];
 #else
-EXTCONST U8 PL_regkind[] = {
-       END,            /* END                    */
-       END,            /* SUCCEED                */
-       BOL,            /* SBOL                   */
-       BOL,            /* MBOL                   */
-       EOL,            /* SEOL                   */
-       EOL,            /* MEOL                   */
-       EOL,            /* EOS                    */
-       GPOS,           /* GPOS                   */
-       BOUND,          /* BOUND                  */
-       BOUND,          /* BOUNDL                 */
-       BOUND,          /* BOUNDU                 */
-       BOUND,          /* BOUNDA                 */
-       NBOUND,         /* NBOUND                 */
-       NBOUND,         /* NBOUNDL                */
-       NBOUND,         /* NBOUNDU                */
-       NBOUND,         /* NBOUNDA                */
-       REG_ANY,        /* REG_ANY                */
-       REG_ANY,        /* SANY                   */
-       ANYOF,          /* ANYOF                  */
-       ANYOF,          /* ANYOFD                 */
-       ANYOF,          /* ANYOFL                 */
-       ANYOF,          /* ANYOFPOSIXL            */
-       ANYOF,          /* ANYOFH                 */
-       ANYOF,          /* ANYOFHb                */
-       ANYOF,          /* ANYOFHr                */
-       ANYOF,          /* ANYOFHs                */
-       ANYOFR,         /* ANYOFR                 */
-       ANYOFR,         /* ANYOFRb                */
-       ANYOFM,         /* ANYOFM                 */
-       ANYOFM,         /* NANYOFM                */
-       POSIXD,         /* POSIXD                 */
-       POSIXD,         /* POSIXL                 */
-       POSIXD,         /* POSIXU                 */
-       POSIXD,         /* POSIXA                 */
-       NPOSIXD,        /* NPOSIXD                */
-       NPOSIXD,        /* NPOSIXL                */
-       NPOSIXD,        /* NPOSIXU                */
-       NPOSIXD,        /* NPOSIXA                */
-       CLUMP,          /* CLUMP                  */
-       BRANCH,         /* BRANCH                 */
-       EXACT,          /* EXACT                  */
-       EXACT,          /* LEXACT                 */
-       EXACT,          /* EXACTL                 */
-       EXACT,          /* EXACTF                 */
-       EXACT,          /* EXACTFL                */
-       EXACT,          /* EXACTFU                */
-       EXACT,          /* EXACTFAA               */
-       EXACT,          /* EXACTFAA_NO_TRIE       */
-       EXACT,          /* EXACTFUP               */
-       EXACT,          /* EXACTFLU8              */
-       EXACT,          /* EXACT_REQ8             */
-       EXACT,          /* LEXACT_REQ8            */
-       EXACT,          /* EXACTFU_REQ8           */
-       EXACT,          /* EXACTFU_S_EDGE         */
-       LNBREAK,        /* LNBREAK                */
-       TRIE,           /* TRIE                   */
-       TRIE,           /* TRIEC                  */
-       TRIE,           /* AHOCORASICK            */
-       TRIE,           /* AHOCORASICKC           */
-       NOTHING,        /* NOTHING                */
-       NOTHING,        /* TAIL                   */
-       STAR,           /* STAR                   */
-       PLUS,           /* PLUS                   */
-       CURLY,          /* CURLY                  */
-       CURLY,          /* CURLYN                 */
-       CURLY,          /* CURLYM                 */
-       CURLY,          /* CURLYX                 */
-       WHILEM,         /* WHILEM                 */
-       OPEN,           /* OPEN                   */
-       CLOSE,          /* CLOSE                  */
-       SROPEN,         /* SROPEN                 */
-       SRCLOSE,        /* SRCLOSE                */
-       REF,            /* REF                    */
-       REF,            /* REFF                   */
-       REF,            /* REFFL                  */
-       REF,            /* REFFU                  */
-       REF,            /* REFFA                  */
-       REF,            /* REFN                   */
-       REF,            /* REFFN                  */
-       REF,            /* REFFLN                 */
-       REF,            /* REFFUN                 */
-       REF,            /* REFFAN                 */
-       LONGJMP,        /* LONGJMP                */
-       BRANCHJ,        /* BRANCHJ                */
-       BRANCHJ,        /* IFMATCH                */
-       BRANCHJ,        /* UNLESSM                */
-       BRANCHJ,        /* SUSPEND                */
-       BRANCHJ,        /* IFTHEN                 */
-       GROUPP,         /* GROUPP                 */
-       EVAL,           /* EVAL                   */
-       MINMOD,         /* MINMOD                 */
-       LOGICAL,        /* LOGICAL                */
-       BRANCHJ,        /* RENUM                  */
-       GOSUB,          /* GOSUB                  */
-       GROUPPN,        /* GROUPPN                */
-       INSUBP,         /* INSUBP                 */
-       DEFINEP,        /* DEFINEP                */
-       ENDLIKE,        /* ENDLIKE                */
-       ENDLIKE,        /* OPFAIL                 */
-       ENDLIKE,        /* ACCEPT                 */
-       VERB,           /* VERB                   */
-       VERB,           /* PRUNE                  */
-       VERB,           /* MARKPOINT              */
-       VERB,           /* SKIP                   */
-       VERB,           /* COMMIT                 */
-       VERB,           /* CUTGROUP               */
-       KEEPS,          /* KEEPS                  */
-       END,            /* LOOKBEHIND_END         */
-       NOTHING,        /* OPTIMIZED              */
-       PSEUDO,         /* PSEUDO                 */
-       REGEX_SET,      /* REGEX_SET              */
-       /* ------------ States ------------- */
-       TRIE,           /* TRIE_next              */
-       TRIE,           /* TRIE_next_fail         */
-       EVAL,           /* EVAL_B                 */
-       EVAL,           /* EVAL_B_fail            */
-       EVAL,           /* EVAL_postponed_AB      */
-       EVAL,           /* EVAL_postponed_AB_fail */
-       CURLYX,         /* CURLYX_end             */
-       CURLYX,         /* CURLYX_end_fail        */
-       WHILEM,         /* WHILEM_A_pre           */
-       WHILEM,         /* WHILEM_A_pre_fail      */
-       WHILEM,         /* WHILEM_A_min           */
-       WHILEM,         /* WHILEM_A_min_fail      */
-       WHILEM,         /* WHILEM_A_max           */
-       WHILEM,         /* WHILEM_A_max_fail      */
-       WHILEM,         /* WHILEM_B_min           */
-       WHILEM,         /* WHILEM_B_min_fail      */
-       WHILEM,         /* WHILEM_B_max           */
-       WHILEM,         /* WHILEM_B_max_fail      */
-       BRANCH,         /* BRANCH_next            */
-       BRANCH,         /* BRANCH_next_fail       */
-       CURLYM,         /* CURLYM_A               */
-       CURLYM,         /* CURLYM_A_fail          */
-       CURLYM,         /* CURLYM_B               */
-       CURLYM,         /* CURLYM_B_fail          */
-       IFMATCH,        /* IFMATCH_A              */
-       IFMATCH,        /* IFMATCH_A_fail         */
-       CURLY,          /* CURLY_B_min            */
-       CURLY,          /* CURLY_B_min_fail       */
-       CURLY,          /* CURLY_B_max            */
-       CURLY,          /* CURLY_B_max_fail       */
-       COMMIT,         /* COMMIT_next            */
-       COMMIT,         /* COMMIT_next_fail       */
-       MARKPOINT,      /* MARKPOINT_next         */
-       MARKPOINT,      /* MARKPOINT_next_fail    */
-       SKIP,           /* SKIP_next              */
-       SKIP,           /* SKIP_next_fail         */
-       CUTGROUP,       /* CUTGROUP_next          */
-       CUTGROUP,       /* CUTGROUP_next_fail     */
-       KEEPS,          /* KEEPS_next             */
-       KEEPS,          /* KEEPS_next_fail        */
-};
-#endif
-
-#ifdef REG_COMP_C
-
-/* regarglen[] - How large is the argument part of the node (in regnodes) */
-
-static const U8 regarglen[] = {
-       0,                                      /* END          */
-       0,                                      /* SUCCEED      */
-       0,                                      /* SBOL         */
-       0,                                      /* MBOL         */
-       0,                                      /* SEOL         */
-       0,                                      /* MEOL         */
-       0,                                      /* EOS          */
-       0,                                      /* GPOS         */
-       0,                                      /* BOUND        */
-       0,                                      /* BOUNDL       */
-       0,                                      /* BOUNDU       */
-       0,                                      /* BOUNDA       */
-       0,                                      /* NBOUND       */
-       0,                                      /* NBOUNDL      */
-       0,                                      /* NBOUNDU      */
-       0,                                      /* NBOUNDA      */
-       0,                                      /* REG_ANY      */
-       0,                                      /* SANY         */
-       EXTRA_SIZE(struct regnode_charclass),   /* ANYOF        */
-       EXTRA_SIZE(struct regnode_charclass),   /* ANYOFD       */
-       EXTRA_SIZE(struct regnode_charclass),   /* ANYOFL       */
-       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),           /* ANYOFHs      */
-       EXTRA_SIZE(struct regnode_1),           /* ANYOFR       */
-       EXTRA_SIZE(struct regnode_1),           /* ANYOFRb      */
-       EXTRA_SIZE(struct regnode_1),           /* ANYOFM       */
-       EXTRA_SIZE(struct regnode_1),           /* NANYOFM      */
-       0,                                      /* POSIXD       */
-       0,                                      /* POSIXL       */
-       0,                                      /* POSIXU       */
-       0,                                      /* POSIXA       */
-       0,                                      /* NPOSIXD      */
-       0,                                      /* NPOSIXL      */
-       0,                                      /* NPOSIXU      */
-       0,                                      /* NPOSIXA      */
-       0,                                      /* CLUMP        */
-       0,                                      /* BRANCH       */
-       0,                                      /* EXACT        */
-       EXTRA_SIZE(struct regnode_1),           /* LEXACT       */
-       0,                                      /* EXACTL       */
-       0,                                      /* EXACTF       */
-       0,                                      /* EXACTFL      */
-       0,                                      /* EXACTFU      */
-       0,                                      /* EXACTFAA     */
-       0,                                      /* EXACTFAA_NO_TRIE */
-       0,                                      /* EXACTFUP     */
-       0,                                      /* EXACTFLU8    */
-       0,                                      /* EXACT_REQ8   */
-       EXTRA_SIZE(struct regnode_1),           /* LEXACT_REQ8  */
-       0,                                      /* EXACTFU_REQ8 */
-       0,                                      /* EXACTFU_S_EDGE */
-       0,                                      /* LNBREAK      */
-       EXTRA_SIZE(struct regnode_1),           /* TRIE         */
-       EXTRA_SIZE(struct regnode_charclass),   /* TRIEC        */
-       EXTRA_SIZE(struct regnode_1),           /* AHOCORASICK  */
-       EXTRA_SIZE(struct regnode_charclass),   /* AHOCORASICKC */
-       0,                                      /* NOTHING      */
-       0,                                      /* TAIL         */
-       0,                                      /* STAR         */
-       0,                                      /* PLUS         */
-       EXTRA_SIZE(struct regnode_2),           /* CURLY        */
-       EXTRA_SIZE(struct regnode_2),           /* CURLYN       */
-       EXTRA_SIZE(struct regnode_2),           /* CURLYM       */
-       EXTRA_SIZE(struct regnode_2),           /* CURLYX       */
-       0,                                      /* WHILEM       */
-       EXTRA_SIZE(struct regnode_1),           /* OPEN         */
-       EXTRA_SIZE(struct regnode_1),           /* CLOSE        */
-       0,                                      /* SROPEN       */
-       0,                                      /* SRCLOSE      */
-       EXTRA_SIZE(struct regnode_1),           /* REF          */
-       EXTRA_SIZE(struct regnode_1),           /* REFF         */
-       EXTRA_SIZE(struct regnode_1),           /* REFFL        */
-       EXTRA_SIZE(struct regnode_1),           /* REFFU        */
-       EXTRA_SIZE(struct regnode_1),           /* REFFA        */
-       EXTRA_SIZE(struct regnode_1),           /* REFN         */
-       EXTRA_SIZE(struct regnode_1),           /* REFFN        */
-       EXTRA_SIZE(struct regnode_1),           /* REFFLN       */
-       EXTRA_SIZE(struct regnode_1),           /* REFFUN       */
-       EXTRA_SIZE(struct regnode_1),           /* REFFAN       */
-       EXTRA_SIZE(struct regnode_1),           /* LONGJMP      */
-       EXTRA_SIZE(struct regnode_1),           /* BRANCHJ      */
-       EXTRA_SIZE(struct regnode_1),           /* IFMATCH      */
-       EXTRA_SIZE(struct regnode_1),           /* UNLESSM      */
-       EXTRA_SIZE(struct regnode_1),           /* SUSPEND      */
-       EXTRA_SIZE(struct regnode_1),           /* IFTHEN       */
-       EXTRA_SIZE(struct regnode_1),           /* GROUPP       */
-       EXTRA_SIZE(struct regnode_2L),          /* EVAL         */
-       0,                                      /* MINMOD       */
-       0,                                      /* LOGICAL      */
-       EXTRA_SIZE(struct regnode_1),           /* RENUM        */
-       EXTRA_SIZE(struct regnode_2L),          /* GOSUB        */
-       EXTRA_SIZE(struct regnode_1),           /* GROUPPN      */
-       EXTRA_SIZE(struct regnode_1),           /* INSUBP       */
-       EXTRA_SIZE(struct regnode_1),           /* DEFINEP      */
-       0,                                      /* ENDLIKE      */
-       EXTRA_SIZE(struct regnode_1),           /* OPFAIL       */
-       EXTRA_SIZE(struct regnode_2L),          /* ACCEPT       */
-       EXTRA_SIZE(struct regnode_1),           /* VERB         */
-       EXTRA_SIZE(struct regnode_1),           /* PRUNE        */
-       EXTRA_SIZE(struct regnode_1),           /* MARKPOINT    */
-       EXTRA_SIZE(struct regnode_1),           /* SKIP         */
-       EXTRA_SIZE(struct regnode_1),           /* COMMIT       */
-       EXTRA_SIZE(struct regnode_1),           /* CUTGROUP     */
-       0,                                      /* KEEPS        */
-       0,                                      /* LOOKBEHIND_END */
-       0,                                      /* OPTIMIZED    */
-       0,                                      /* PSEUDO       */
-       EXTRA_SIZE(struct regnode_p),           /* REGEX_SET    */
-};
-
-/* reg_off_by_arg[] - Which argument holds the offset to the next node */
-
-static const char reg_off_by_arg[] = {
-       0,      /* END          */
-       0,      /* SUCCEED      */
-       0,      /* SBOL         */
-       0,      /* MBOL         */
-       0,      /* SEOL         */
-       0,      /* MEOL         */
-       0,      /* EOS          */
-       0,      /* GPOS         */
-       0,      /* BOUND        */
-       0,      /* BOUNDL       */
-       0,      /* BOUNDU       */
-       0,      /* BOUNDA       */
-       0,      /* NBOUND       */
-       0,      /* NBOUNDL      */
-       0,      /* NBOUNDU      */
-       0,      /* NBOUNDA      */
-       0,      /* REG_ANY      */
-       0,      /* SANY         */
-       0,      /* ANYOF        */
-       0,      /* ANYOFD       */
-       0,      /* ANYOFL       */
-       0,      /* ANYOFPOSIXL  */
-       0,      /* ANYOFH       */
-       0,      /* ANYOFHb      */
-       0,      /* ANYOFHr      */
-       0,      /* ANYOFHs      */
-       0,      /* ANYOFR       */
-       0,      /* ANYOFRb      */
-       0,      /* ANYOFM       */
-       0,      /* NANYOFM      */
-       0,      /* POSIXD       */
-       0,      /* POSIXL       */
-       0,      /* POSIXU       */
-       0,      /* POSIXA       */
-       0,      /* NPOSIXD      */
-       0,      /* NPOSIXL      */
-       0,      /* NPOSIXU      */
-       0,      /* NPOSIXA      */
-       0,      /* CLUMP        */
-       0,      /* BRANCH       */
-       0,      /* EXACT        */
-       0,      /* LEXACT       */
-       0,      /* EXACTL       */
-       0,      /* EXACTF       */
-       0,      /* EXACTFL      */
-       0,      /* EXACTFU      */
-       0,      /* EXACTFAA     */
-       0,      /* EXACTFAA_NO_TRIE */
-       0,      /* EXACTFUP     */
-       0,      /* EXACTFLU8    */
-       0,      /* EXACT_REQ8   */
-       0,      /* LEXACT_REQ8  */
-       0,      /* EXACTFU_REQ8 */
-       0,      /* EXACTFU_S_EDGE */
-       0,      /* LNBREAK      */
-       0,      /* TRIE         */
-       0,      /* TRIEC        */
-       0,      /* AHOCORASICK  */
-       0,      /* AHOCORASICKC */
-       0,      /* NOTHING      */
-       0,      /* TAIL         */
-       0,      /* STAR         */
-       0,      /* PLUS         */
-       0,      /* CURLY        */
-       0,      /* CURLYN       */
-       0,      /* CURLYM       */
-       0,      /* CURLYX       */
-       0,      /* WHILEM       */
-       0,      /* OPEN         */
-       0,      /* CLOSE        */
-       0,      /* SROPEN       */
-       0,      /* SRCLOSE      */
-       0,      /* REF          */
-       0,      /* REFF         */
-       0,      /* REFFL        */
-       0,      /* REFFU        */
-       0,      /* REFFA        */
-       0,      /* REFN         */
-       0,      /* REFFN        */
-       0,      /* REFFLN       */
-       0,      /* REFFUN       */
-       0,      /* REFFAN       */
-       1,      /* LONGJMP      */
-       1,      /* BRANCHJ      */
-       1,      /* IFMATCH      */
-       1,      /* UNLESSM      */
-       1,      /* SUSPEND      */
-       1,      /* IFTHEN       */
-       0,      /* GROUPP       */
-       0,      /* EVAL         */
-       0,      /* MINMOD       */
-       0,      /* LOGICAL      */
-       1,      /* RENUM        */
-       0,      /* GOSUB        */
-       0,      /* GROUPPN      */
-       0,      /* INSUBP       */
-       0,      /* DEFINEP      */
-       0,      /* ENDLIKE      */
-       0,      /* OPFAIL       */
-       0,      /* ACCEPT       */
-       0,      /* VERB         */
-       0,      /* PRUNE        */
-       0,      /* MARKPOINT    */
-       0,      /* SKIP         */
-       0,      /* COMMIT       */
-       0,      /* CUTGROUP     */
-       0,      /* KEEPS        */
-       0,      /* LOOKBEHIND_END */
-       0,      /* OPTIMIZED    */
-       0,      /* PSEUDO       */
-       0,      /* REGEX_SET    */
-};
-
-#endif /* REG_COMP_C */
-
-
-/* reg_name[] - Opcode/state names in string form, for debugging */
-
-#ifndef DOINIT
-EXTCONST char * PL_reg_name[];
-#else
-EXTCONST char * const PL_reg_name[] = {
+EXTCONST char * const PL_regnode_name[] = {
        "END",                          /* 0000 */
        "SUCCEED",                      /* 0x01 */
        "SBOL",                         /* 0x02 */
@@ -1868,89 +1624,90 @@ EXTCONST char * const PL_reg_name[] = {
        "ANYOFHs",                      /* 0x19 */
        "ANYOFR",                       /* 0x1a */
        "ANYOFRb",                      /* 0x1b */
-       "ANYOFM",                       /* 0x1c */
-       "NANYOFM",                      /* 0x1d */
-       "POSIXD",                       /* 0x1e */
-       "POSIXL",                       /* 0x1f */
-       "POSIXU",                       /* 0x20 */
-       "POSIXA",                       /* 0x21 */
-       "NPOSIXD",                      /* 0x22 */
-       "NPOSIXL",                      /* 0x23 */
-       "NPOSIXU",                      /* 0x24 */
-       "NPOSIXA",                      /* 0x25 */
-       "CLUMP",                        /* 0x26 */
-       "BRANCH",                       /* 0x27 */
-       "EXACT",                        /* 0x28 */
-       "LEXACT",                       /* 0x29 */
-       "EXACTL",                       /* 0x2a */
-       "EXACTF",                       /* 0x2b */
-       "EXACTFL",                      /* 0x2c */
-       "EXACTFU",                      /* 0x2d */
-       "EXACTFAA",                     /* 0x2e */
-       "EXACTFAA_NO_TRIE",             /* 0x2f */
-       "EXACTFUP",                     /* 0x30 */
-       "EXACTFLU8",                    /* 0x31 */
-       "EXACT_REQ8",                   /* 0x32 */
-       "LEXACT_REQ8",                  /* 0x33 */
-       "EXACTFU_REQ8",                 /* 0x34 */
-       "EXACTFU_S_EDGE",               /* 0x35 */
-       "LNBREAK",                      /* 0x36 */
-       "TRIE",                         /* 0x37 */
-       "TRIEC",                        /* 0x38 */
-       "AHOCORASICK",                  /* 0x39 */
-       "AHOCORASICKC",                 /* 0x3a */
-       "NOTHING",                      /* 0x3b */
-       "TAIL",                         /* 0x3c */
-       "STAR",                         /* 0x3d */
-       "PLUS",                         /* 0x3e */
-       "CURLY",                        /* 0x3f */
-       "CURLYN",                       /* 0x40 */
-       "CURLYM",                       /* 0x41 */
-       "CURLYX",                       /* 0x42 */
-       "WHILEM",                       /* 0x43 */
-       "OPEN",                         /* 0x44 */
-       "CLOSE",                        /* 0x45 */
-       "SROPEN",                       /* 0x46 */
-       "SRCLOSE",                      /* 0x47 */
-       "REF",                          /* 0x48 */
-       "REFF",                         /* 0x49 */
-       "REFFL",                        /* 0x4a */
-       "REFFU",                        /* 0x4b */
-       "REFFA",                        /* 0x4c */
-       "REFN",                         /* 0x4d */
-       "REFFN",                        /* 0x4e */
-       "REFFLN",                       /* 0x4f */
-       "REFFUN",                       /* 0x50 */
-       "REFFAN",                       /* 0x51 */
-       "LONGJMP",                      /* 0x52 */
-       "BRANCHJ",                      /* 0x53 */
-       "IFMATCH",                      /* 0x54 */
-       "UNLESSM",                      /* 0x55 */
-       "SUSPEND",                      /* 0x56 */
-       "IFTHEN",                       /* 0x57 */
-       "GROUPP",                       /* 0x58 */
-       "EVAL",                         /* 0x59 */
-       "MINMOD",                       /* 0x5a */
-       "LOGICAL",                      /* 0x5b */
-       "RENUM",                        /* 0x5c */
-       "GOSUB",                        /* 0x5d */
-       "GROUPPN",                      /* 0x5e */
-       "INSUBP",                       /* 0x5f */
-       "DEFINEP",                      /* 0x60 */
-       "ENDLIKE",                      /* 0x61 */
-       "OPFAIL",                       /* 0x62 */
-       "ACCEPT",                       /* 0x63 */
-       "VERB",                         /* 0x64 */
-       "PRUNE",                        /* 0x65 */
-       "MARKPOINT",                    /* 0x66 */
-       "SKIP",                         /* 0x67 */
-       "COMMIT",                       /* 0x68 */
-       "CUTGROUP",                     /* 0x69 */
-       "KEEPS",                        /* 0x6a */
-       "LOOKBEHIND_END",               /* 0x6b */
-       "OPTIMIZED",                    /* 0x6c */
-       "PSEUDO",                       /* 0x6d */
-       "REGEX_SET",                    /* 0x6e */
+       "ANYOFHbbm",                    /* 0x1c */
+       "ANYOFM",                       /* 0x1d */
+       "NANYOFM",                      /* 0x1e */
+       "POSIXD",                       /* 0x1f */
+       "POSIXL",                       /* 0x20 */
+       "POSIXU",                       /* 0x21 */
+       "POSIXA",                       /* 0x22 */
+       "NPOSIXD",                      /* 0x23 */
+       "NPOSIXL",                      /* 0x24 */
+       "NPOSIXU",                      /* 0x25 */
+       "NPOSIXA",                      /* 0x26 */
+       "CLUMP",                        /* 0x27 */
+       "BRANCH",                       /* 0x28 */
+       "EXACT",                        /* 0x29 */
+       "LEXACT",                       /* 0x2a */
+       "EXACTL",                       /* 0x2b */
+       "EXACTF",                       /* 0x2c */
+       "EXACTFL",                      /* 0x2d */
+       "EXACTFU",                      /* 0x2e */
+       "EXACTFAA",                     /* 0x2f */
+       "EXACTFAA_NO_TRIE",             /* 0x30 */
+       "EXACTFUP",                     /* 0x31 */
+       "EXACTFLU8",                    /* 0x32 */
+       "EXACT_REQ8",                   /* 0x33 */
+       "LEXACT_REQ8",                  /* 0x34 */
+       "EXACTFU_REQ8",                 /* 0x35 */
+       "EXACTFU_S_EDGE",               /* 0x36 */
+       "LNBREAK",                      /* 0x37 */
+       "TRIE",                         /* 0x38 */
+       "TRIEC",                        /* 0x39 */
+       "AHOCORASICK",                  /* 0x3a */
+       "AHOCORASICKC",                 /* 0x3b */
+       "NOTHING",                      /* 0x3c */
+       "TAIL",                         /* 0x3d */
+       "STAR",                         /* 0x3e */
+       "PLUS",                         /* 0x3f */
+       "CURLY",                        /* 0x40 */
+       "CURLYN",                       /* 0x41 */
+       "CURLYM",                       /* 0x42 */
+       "CURLYX",                       /* 0x43 */
+       "WHILEM",                       /* 0x44 */
+       "OPEN",                         /* 0x45 */
+       "CLOSE",                        /* 0x46 */
+       "SROPEN",                       /* 0x47 */
+       "SRCLOSE",                      /* 0x48 */
+       "REF",                          /* 0x49 */
+       "REFF",                         /* 0x4a */
+       "REFFL",                        /* 0x4b */
+       "REFFU",                        /* 0x4c */
+       "REFFA",                        /* 0x4d */
+       "REFN",                         /* 0x4e */
+       "REFFN",                        /* 0x4f */
+       "REFFLN",                       /* 0x50 */
+       "REFFUN",                       /* 0x51 */
+       "REFFAN",                       /* 0x52 */
+       "LONGJMP",                      /* 0x53 */
+       "BRANCHJ",                      /* 0x54 */
+       "IFMATCH",                      /* 0x55 */
+       "UNLESSM",                      /* 0x56 */
+       "SUSPEND",                      /* 0x57 */
+       "IFTHEN",                       /* 0x58 */
+       "GROUPP",                       /* 0x59 */
+       "EVAL",                         /* 0x5a */
+       "MINMOD",                       /* 0x5b */
+       "LOGICAL",                      /* 0x5c */
+       "RENUM",                        /* 0x5d */
+       "GOSUB",                        /* 0x5e */
+       "GROUPPN",                      /* 0x5f */
+       "INSUBP",                       /* 0x60 */
+       "DEFINEP",                      /* 0x61 */
+       "ENDLIKE",                      /* 0x62 */
+       "OPFAIL",                       /* 0x63 */
+       "ACCEPT",                       /* 0x64 */
+       "VERB",                         /* 0x65 */
+       "PRUNE",                        /* 0x66 */
+       "MARKPOINT",                    /* 0x67 */
+       "SKIP",                         /* 0x68 */
+       "COMMIT",                       /* 0x69 */
+       "CUTGROUP",                     /* 0x6a */
+       "KEEPS",                        /* 0x6b */
+       "LOOKBEHIND_END",               /* 0x6c */
+       "OPTIMIZED",                    /* 0x6d */
+       "PSEUDO",                       /* 0x6e */
+       "REGEX_SET",                    /* 0x6f */
        /* ------------ States ------------- */
        "TRIE_next",                    /* REGNODE_MAX +0x01 */
        "TRIE_next_fail",               /* REGNODE_MAX +0x02 */
@@ -1992,6 +1749,1096 @@ EXTCONST char * const PL_reg_name[] = {
        "CUTGROUP_next_fail",           /* REGNODE_MAX +0x26 */
        "KEEPS_next",                   /* REGNODE_MAX +0x27 */
        "KEEPS_next_fail",              /* REGNODE_MAX +0x28 */
+       "REF_next",                     /* REGNODE_MAX +0x29 */
+       "REF_next_fail",                /* REGNODE_MAX +0x2a */
+};
+#endif /* DOINIT */
+
+
+/* PL_regnode_info[] - Opcode/state names in string form, for debugging */
+
+#ifndef DOINIT
+EXTCONST struct regnode_meta PL_regnode_info[];
+#else
+EXTCONST struct regnode_meta PL_regnode_info[] = {
+    {
+        /* #0 op END */
+        .type = END,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #1 op SUCCEED */
+        .type = END,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #2 op SBOL */
+        .type = BOL,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #3 op MBOL */
+        .type = BOL,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #4 op SEOL */
+        .type = EOL,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #5 op MEOL */
+        .type = EOL,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #6 op EOS */
+        .type = EOL,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #7 op GPOS */
+        .type = GPOS,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #8 op BOUND */
+        .type = BOUND,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #9 op BOUNDL */
+        .type = BOUND,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #10 op BOUNDU */
+        .type = BOUND,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #11 op BOUNDA */
+        .type = BOUND,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #12 op NBOUND */
+        .type = NBOUND,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #13 op NBOUNDL */
+        .type = NBOUND,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #14 op NBOUNDU */
+        .type = NBOUND,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #15 op NBOUNDA */
+        .type = NBOUND,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #16 op REG_ANY */
+        .type = REG_ANY,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #17 op SANY */
+        .type = REG_ANY,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #18 op ANYOF */
+        .type = ANYOF,
+        .arg_len = EXTRA_SIZE(tregnode_ANYOF),
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #19 op ANYOFD */
+        .type = ANYOF,
+        .arg_len = EXTRA_SIZE(tregnode_ANYOFD),
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #20 op ANYOFL */
+        .type = ANYOF,
+        .arg_len = EXTRA_SIZE(tregnode_ANYOFL),
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #21 op ANYOFPOSIXL */
+        .type = ANYOF,
+        .arg_len = EXTRA_SIZE(tregnode_ANYOFPOSIXL),
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #22 op ANYOFH */
+        .type = ANYOFH,
+        .arg_len = EXTRA_SIZE(tregnode_ANYOFH),
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #23 op ANYOFHb */
+        .type = ANYOFH,
+        .arg_len = EXTRA_SIZE(tregnode_ANYOFHb),
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #24 op ANYOFHr */
+        .type = ANYOFH,
+        .arg_len = EXTRA_SIZE(tregnode_ANYOFHr),
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #25 op ANYOFHs */
+        .type = ANYOFH,
+        .arg_len = EXTRA_SIZE(tregnode_ANYOFHs),
+        .arg_len_varies = 1,
+        .off_by_arg = 0
+    },
+    {
+        /* #26 op ANYOFR */
+        .type = ANYOFR,
+        .arg_len = EXTRA_SIZE(tregnode_ANYOFR),
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #27 op ANYOFRb */
+        .type = ANYOFR,
+        .arg_len = EXTRA_SIZE(tregnode_ANYOFRb),
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #28 op ANYOFHbbm */
+        .type = ANYOFHbbm,
+        .arg_len = EXTRA_SIZE(tregnode_ANYOFHbbm),
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #29 op ANYOFM */
+        .type = ANYOFM,
+        .arg_len = EXTRA_SIZE(tregnode_ANYOFM),
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #30 op NANYOFM */
+        .type = ANYOFM,
+        .arg_len = EXTRA_SIZE(tregnode_NANYOFM),
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #31 op POSIXD */
+        .type = POSIXD,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #32 op POSIXL */
+        .type = POSIXD,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #33 op POSIXU */
+        .type = POSIXD,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #34 op POSIXA */
+        .type = POSIXD,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #35 op NPOSIXD */
+        .type = NPOSIXD,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #36 op NPOSIXL */
+        .type = NPOSIXD,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #37 op NPOSIXU */
+        .type = NPOSIXD,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #38 op NPOSIXA */
+        .type = NPOSIXD,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #39 op CLUMP */
+        .type = CLUMP,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #40 op BRANCH */
+        .type = BRANCH,
+        .arg_len = EXTRA_SIZE(tregnode_BRANCH),
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #41 op EXACT */
+        .type = EXACT,
+        .arg_len = 0,
+        .arg_len_varies = 1,
+        .off_by_arg = 0
+    },
+    {
+        /* #42 op LEXACT */
+        .type = EXACT,
+        .arg_len = EXTRA_SIZE(tregnode_LEXACT),
+        .arg_len_varies = 1,
+        .off_by_arg = 0
+    },
+    {
+        /* #43 op EXACTL */
+        .type = EXACT,
+        .arg_len = 0,
+        .arg_len_varies = 1,
+        .off_by_arg = 0
+    },
+    {
+        /* #44 op EXACTF */
+        .type = EXACT,
+        .arg_len = 0,
+        .arg_len_varies = 1,
+        .off_by_arg = 0
+    },
+    {
+        /* #45 op EXACTFL */
+        .type = EXACT,
+        .arg_len = 0,
+        .arg_len_varies = 1,
+        .off_by_arg = 0
+    },
+    {
+        /* #46 op EXACTFU */
+        .type = EXACT,
+        .arg_len = 0,
+        .arg_len_varies = 1,
+        .off_by_arg = 0
+    },
+    {
+        /* #47 op EXACTFAA */
+        .type = EXACT,
+        .arg_len = 0,
+        .arg_len_varies = 1,
+        .off_by_arg = 0
+    },
+    {
+        /* #48 op EXACTFAA_NO_TRIE */
+        .type = EXACT,
+        .arg_len = 0,
+        .arg_len_varies = 1,
+        .off_by_arg = 0
+    },
+    {
+        /* #49 op EXACTFUP */
+        .type = EXACT,
+        .arg_len = 0,
+        .arg_len_varies = 1,
+        .off_by_arg = 0
+    },
+    {
+        /* #50 op EXACTFLU8 */
+        .type = EXACT,
+        .arg_len = 0,
+        .arg_len_varies = 1,
+        .off_by_arg = 0
+    },
+    {
+        /* #51 op EXACT_REQ8 */
+        .type = EXACT,
+        .arg_len = 0,
+        .arg_len_varies = 1,
+        .off_by_arg = 0
+    },
+    {
+        /* #52 op LEXACT_REQ8 */
+        .type = EXACT,
+        .arg_len = EXTRA_SIZE(tregnode_LEXACT_REQ8),
+        .arg_len_varies = 1,
+        .off_by_arg = 0
+    },
+    {
+        /* #53 op EXACTFU_REQ8 */
+        .type = EXACT,
+        .arg_len = 0,
+        .arg_len_varies = 1,
+        .off_by_arg = 0
+    },
+    {
+        /* #54 op EXACTFU_S_EDGE */
+        .type = EXACT,
+        .arg_len = 0,
+        .arg_len_varies = 1,
+        .off_by_arg = 0
+    },
+    {
+        /* #55 op LNBREAK */
+        .type = LNBREAK,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #56 op TRIE */
+        .type = TRIE,
+        .arg_len = EXTRA_SIZE(tregnode_TRIE),
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #57 op TRIEC */
+        .type = TRIE,
+        .arg_len = EXTRA_SIZE(tregnode_TRIEC),
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #58 op AHOCORASICK */
+        .type = TRIE,
+        .arg_len = EXTRA_SIZE(tregnode_AHOCORASICK),
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #59 op AHOCORASICKC */
+        .type = TRIE,
+        .arg_len = EXTRA_SIZE(tregnode_AHOCORASICKC),
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #60 op NOTHING */
+        .type = NOTHING,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #61 op TAIL */
+        .type = NOTHING,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #62 op STAR */
+        .type = STAR,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #63 op PLUS */
+        .type = PLUS,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #64 op CURLY */
+        .type = CURLY,
+        .arg_len = EXTRA_SIZE(tregnode_CURLY),
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #65 op CURLYN */
+        .type = CURLY,
+        .arg_len = EXTRA_SIZE(tregnode_CURLYN),
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #66 op CURLYM */
+        .type = CURLY,
+        .arg_len = EXTRA_SIZE(tregnode_CURLYM),
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #67 op CURLYX */
+        .type = CURLY,
+        .arg_len = EXTRA_SIZE(tregnode_CURLYX),
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #68 op WHILEM */
+        .type = WHILEM,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #69 op OPEN */
+        .type = OPEN,
+        .arg_len = EXTRA_SIZE(tregnode_OPEN),
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #70 op CLOSE */
+        .type = CLOSE,
+        .arg_len = EXTRA_SIZE(tregnode_CLOSE),
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #71 op SROPEN */
+        .type = SROPEN,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #72 op SRCLOSE */
+        .type = SRCLOSE,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #73 op REF */
+        .type = REF,
+        .arg_len = EXTRA_SIZE(tregnode_REF),
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #74 op REFF */
+        .type = REF,
+        .arg_len = EXTRA_SIZE(tregnode_REFF),
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #75 op REFFL */
+        .type = REF,
+        .arg_len = EXTRA_SIZE(tregnode_REFFL),
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #76 op REFFU */
+        .type = REF,
+        .arg_len = EXTRA_SIZE(tregnode_REFFU),
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #77 op REFFA */
+        .type = REF,
+        .arg_len = EXTRA_SIZE(tregnode_REFFA),
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #78 op REFN */
+        .type = REF,
+        .arg_len = EXTRA_SIZE(tregnode_REFN),
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #79 op REFFN */
+        .type = REF,
+        .arg_len = EXTRA_SIZE(tregnode_REFFN),
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #80 op REFFLN */
+        .type = REF,
+        .arg_len = EXTRA_SIZE(tregnode_REFFLN),
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #81 op REFFUN */
+        .type = REF,
+        .arg_len = EXTRA_SIZE(tregnode_REFFUN),
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #82 op REFFAN */
+        .type = REF,
+        .arg_len = EXTRA_SIZE(tregnode_REFFAN),
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #83 op LONGJMP */
+        .type = LONGJMP,
+        .arg_len = EXTRA_SIZE(tregnode_LONGJMP),
+        .arg_len_varies = 0,
+        .off_by_arg = 1
+    },
+    {
+        /* #84 op BRANCHJ */
+        .type = BRANCHJ,
+        .arg_len = EXTRA_SIZE(tregnode_BRANCHJ),
+        .arg_len_varies = 0,
+        .off_by_arg = 1
+    },
+    {
+        /* #85 op IFMATCH */
+        .type = BRANCHJ,
+        .arg_len = EXTRA_SIZE(tregnode_IFMATCH),
+        .arg_len_varies = 0,
+        .off_by_arg = 1
+    },
+    {
+        /* #86 op UNLESSM */
+        .type = BRANCHJ,
+        .arg_len = EXTRA_SIZE(tregnode_UNLESSM),
+        .arg_len_varies = 0,
+        .off_by_arg = 1
+    },
+    {
+        /* #87 op SUSPEND */
+        .type = BRANCHJ,
+        .arg_len = EXTRA_SIZE(tregnode_SUSPEND),
+        .arg_len_varies = 0,
+        .off_by_arg = 1
+    },
+    {
+        /* #88 op IFTHEN */
+        .type = BRANCHJ,
+        .arg_len = EXTRA_SIZE(tregnode_IFTHEN),
+        .arg_len_varies = 0,
+        .off_by_arg = 1
+    },
+    {
+        /* #89 op GROUPP */
+        .type = GROUPP,
+        .arg_len = EXTRA_SIZE(tregnode_GROUPP),
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #90 op EVAL */
+        .type = EVAL,
+        .arg_len = EXTRA_SIZE(tregnode_EVAL),
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #91 op MINMOD */
+        .type = MINMOD,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #92 op LOGICAL */
+        .type = LOGICAL,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #93 op RENUM */
+        .type = BRANCHJ,
+        .arg_len = EXTRA_SIZE(tregnode_RENUM),
+        .arg_len_varies = 0,
+        .off_by_arg = 1
+    },
+    {
+        /* #94 op GOSUB */
+        .type = GOSUB,
+        .arg_len = EXTRA_SIZE(tregnode_GOSUB),
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #95 op GROUPPN */
+        .type = GROUPPN,
+        .arg_len = EXTRA_SIZE(tregnode_GROUPPN),
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #96 op INSUBP */
+        .type = INSUBP,
+        .arg_len = EXTRA_SIZE(tregnode_INSUBP),
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #97 op DEFINEP */
+        .type = DEFINEP,
+        .arg_len = EXTRA_SIZE(tregnode_DEFINEP),
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #98 op ENDLIKE */
+        .type = ENDLIKE,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #99 op OPFAIL */
+        .type = ENDLIKE,
+        .arg_len = EXTRA_SIZE(tregnode_OPFAIL),
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #100 op ACCEPT */
+        .type = ENDLIKE,
+        .arg_len = EXTRA_SIZE(tregnode_ACCEPT),
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #101 op VERB */
+        .type = VERB,
+        .arg_len = EXTRA_SIZE(tregnode_VERB),
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #102 op PRUNE */
+        .type = VERB,
+        .arg_len = EXTRA_SIZE(tregnode_PRUNE),
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #103 op MARKPOINT */
+        .type = VERB,
+        .arg_len = EXTRA_SIZE(tregnode_MARKPOINT),
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #104 op SKIP */
+        .type = VERB,
+        .arg_len = EXTRA_SIZE(tregnode_SKIP),
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #105 op COMMIT */
+        .type = VERB,
+        .arg_len = EXTRA_SIZE(tregnode_COMMIT),
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #106 op CUTGROUP */
+        .type = VERB,
+        .arg_len = EXTRA_SIZE(tregnode_CUTGROUP),
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #107 op KEEPS */
+        .type = KEEPS,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #108 op LOOKBEHIND_END */
+        .type = END,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #109 op OPTIMIZED */
+        .type = NOTHING,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #110 op PSEUDO */
+        .type = PSEUDO,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #111 op REGEX_SET */
+        .type = REGEX_SET,
+        .arg_len = EXTRA_SIZE(tregnode_REGEX_SET),
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #112 state TRIE_next */
+        .type = TRIE,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #113 state TRIE_next_fail */
+        .type = TRIE,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #114 state EVAL_B */
+        .type = EVAL,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #115 state EVAL_B_fail */
+        .type = EVAL,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #116 state EVAL_postponed_AB */
+        .type = EVAL,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #117 state EVAL_postponed_AB_fail */
+        .type = EVAL,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #118 state CURLYX_end */
+        .type = CURLYX,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #119 state CURLYX_end_fail */
+        .type = CURLYX,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #120 state WHILEM_A_pre */
+        .type = WHILEM,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #121 state WHILEM_A_pre_fail */
+        .type = WHILEM,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #122 state WHILEM_A_min */
+        .type = WHILEM,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #123 state WHILEM_A_min_fail */
+        .type = WHILEM,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #124 state WHILEM_A_max */
+        .type = WHILEM,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #125 state WHILEM_A_max_fail */
+        .type = WHILEM,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #126 state WHILEM_B_min */
+        .type = WHILEM,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #127 state WHILEM_B_min_fail */
+        .type = WHILEM,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #128 state WHILEM_B_max */
+        .type = WHILEM,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #129 state WHILEM_B_max_fail */
+        .type = WHILEM,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #130 state BRANCH_next */
+        .type = BRANCH,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #131 state BRANCH_next_fail */
+        .type = BRANCH,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #132 state CURLYM_A */
+        .type = CURLYM,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #133 state CURLYM_A_fail */
+        .type = CURLYM,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #134 state CURLYM_B */
+        .type = CURLYM,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #135 state CURLYM_B_fail */
+        .type = CURLYM,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #136 state IFMATCH_A */
+        .type = IFMATCH,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #137 state IFMATCH_A_fail */
+        .type = IFMATCH,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #138 state CURLY_B_min */
+        .type = CURLY,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #139 state CURLY_B_min_fail */
+        .type = CURLY,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #140 state CURLY_B_max */
+        .type = CURLY,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #141 state CURLY_B_max_fail */
+        .type = CURLY,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #142 state COMMIT_next */
+        .type = COMMIT,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #143 state COMMIT_next_fail */
+        .type = COMMIT,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #144 state MARKPOINT_next */
+        .type = MARKPOINT,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #145 state MARKPOINT_next_fail */
+        .type = MARKPOINT,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #146 state SKIP_next */
+        .type = SKIP,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #147 state SKIP_next_fail */
+        .type = SKIP,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #148 state CUTGROUP_next */
+        .type = CUTGROUP,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #149 state CUTGROUP_next_fail */
+        .type = CUTGROUP,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #150 state KEEPS_next */
+        .type = KEEPS,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #151 state KEEPS_next_fail */
+        .type = KEEPS,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #152 state REF_next */
+        .type = REF,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    },
+    {
+        /* #153 state REF_next_fail */
+        .type = REF,
+        .arg_len = 0,
+        .arg_len_varies = 0,
+        .off_by_arg = 0
+    }
 };
 #endif /* DOINIT */
 
@@ -2047,24 +2894,26 @@ EXTCONST char * const PL_reg_extflags_name[] = {
 EXTCONST char * PL_reg_intflags_name[];
 #else
 EXTCONST char * const PL_reg_intflags_name[] = {
-       "SKIP",                       /* 0x00000001 - PREGf_SKIP */
-       "IMPLICIT",                   /* 0x00000002 - PREGf_IMPLICIT -  Converted .* to ^.*  */
-       "NAUGHTY",                    /* 0x00000004 - PREGf_NAUGHTY -  how exponential is this pattern?  */
-       "VERBARG_SEEN",               /* 0x00000008 - PREGf_VERBARG_SEEN */
-       "CUTGROUP_SEEN",              /* 0x00000010 - PREGf_CUTGROUP_SEEN */
-       "USE_RE_EVAL",                /* 0x00000020 - PREGf_USE_RE_EVAL -  compiled with "use re 'eval'"  */
-       "NOSCAN",                     /* 0x00000040 - PREGf_NOSCAN */
-       "GPOS_SEEN",                  /* 0x00000100 - PREGf_GPOS_SEEN */
-       "GPOS_FLOAT",                 /* 0x00000200 - PREGf_GPOS_FLOAT */
-       "ANCH_MBOL",                  /* 0x00000400 - PREGf_ANCH_MBOL */
-       "ANCH_SBOL",                  /* 0x00000800 - PREGf_ANCH_SBOL */
-       "ANCH_GPOS",                  /* 0x00001000 - PREGf_ANCH_GPOS */
-       "RECURSE_SEEN",               /* 0x00002000 - PREGf_RECURSE_SEEN */
+       "SKIP",                       /* (1<< 0) - 0x00000001 - PREGf_SKIP */
+       "IMPLICIT",                   /* (1<< 1) - 0x00000002 - PREGf_IMPLICIT -  Converted .* to ^.*  */
+       "NAUGHTY",                    /* (1<< 2) - 0x00000004 - PREGf_NAUGHTY -  how exponential is this pattern?  */
+       "VERBARG_SEEN",               /* (1<< 3) - 0x00000008 - PREGf_VERBARG_SEEN */
+       "CUTGROUP_SEEN",              /* (1<< 4) - 0x00000010 - PREGf_CUTGROUP_SEEN */
+       "USE_RE_EVAL",                /* (1<< 5) - 0x00000020 - PREGf_USE_RE_EVAL -  compiled with "use re 'eval'"  */
+       "NOSCAN",                     /* (1<< 6) - 0x00000040 - PREGf_NOSCAN */
+       "",                           /* (1<< 7) - 0x00000080 - *UNUSED* */
+       "GPOS_SEEN",                  /* (1<< 8) - 0x00000100 - PREGf_GPOS_SEEN */
+       "GPOS_FLOAT",                 /* (1<< 9) - 0x00000200 - PREGf_GPOS_FLOAT */
+       "ANCH_MBOL",                  /* (1<<10) - 0x00000400 - PREGf_ANCH_MBOL */
+       "ANCH_SBOL",                  /* (1<<11) - 0x00000800 - PREGf_ANCH_SBOL */
+       "ANCH_GPOS",                  /* (1<<12) - 0x00001000 - PREGf_ANCH_GPOS */
+       "RECURSE_SEEN",               /* (1<<13) - 0x00002000 - PREGf_RECURSE_SEEN */
+       "PESSIMIZE_SEEN",             /* (1<<14) - 0x00004000 - PREGf_PESSIMIZE_SEEN */
 };
 #endif /* DOINIT */
 
 #ifdef DEBUGGING
-#  define REG_INTFLAGS_NAME_SIZE 13
+#  define REG_INTFLAGS_NAME_SIZE 15
 #endif
 
 /* The following have no fixed length. U8 so we can do strchr() on it. */
@@ -2085,7 +2934,7 @@ EXTCONST U8 PL_varies[] __attribute__deprecated__ = {
 EXTCONST U8 PL_varies_bitmask[];
 #else
 EXTCONST U8 PL_varies_bitmask[] = {
-    0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xE0, 0x0F, 0xFF, 0xCB, 0x00, 0x00, 0x00
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0xC0, 0x1F, 0xFE, 0x97, 0x01, 0x00, 0x00
 };
 #endif /* DOINIT */
 
@@ -2098,8 +2947,8 @@ EXTCONST U8 PL_simple[] __attribute__deprecated__;
 #else
 EXTCONST U8 PL_simple[] __attribute__deprecated__ = {
     REG_ANY, SANY, ANYOF, ANYOFD, ANYOFL, ANYOFPOSIXL, ANYOFH, ANYOFHb,
-    ANYOFHr, ANYOFHs, ANYOFR, ANYOFRb, ANYOFM, NANYOFM, POSIXD, POSIXL,
-    POSIXU, POSIXA, NPOSIXD, NPOSIXL, NPOSIXU, NPOSIXA, REGEX_SET,
+    ANYOFHr, ANYOFHs, ANYOFR, ANYOFRb, ANYOFHbbm, ANYOFM, NANYOFM, POSIXD,
+    POSIXL, POSIXU, POSIXA, NPOSIXD, NPOSIXL, NPOSIXU, NPOSIXA, REGEX_SET,
     0
 };
 #endif /* DOINIT */
@@ -2108,15 +2957,15 @@ EXTCONST U8 PL_simple[] __attribute__deprecated__ = {
 EXTCONST U8 PL_simple_bitmask[];
 #else
 EXTCONST U8 PL_simple_bitmask[] = {
-    0x00, 0x00, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40
+    0x00, 0x00, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80
 };
 #endif /* DOINIT */
 
 /* Is 'op', known to be of type EXACT, folding? */
-#define isEXACTFish(op) (__ASSERT_(PL_regkind[op] == EXACT) (PL_EXACTFish_bitmask & (1U << (op - EXACT))))
+#define isEXACTFish(op) (__ASSERT_(REGNODE_TYPE(op) == EXACT) (PL_EXACTFish_bitmask & (1U << (op - EXACT))))
 
 /* Do only UTF-8 target strings match 'op', known to be of type EXACT? */
-#define isEXACT_REQ8(op) (__ASSERT_(PL_regkind[op] == EXACT) (PL_EXACT_REQ8_bitmask & (1U << (op - EXACT))))
+#define isEXACT_REQ8(op) (__ASSERT_(REGNODE_TYPE(op) == EXACT) (PL_EXACT_REQ8_bitmask & (1U << (op - EXACT))))
 
 #ifndef DOINIT
 EXTCONST U32 PL_EXACTFish_bitmask;
@@ -2128,4 +2977,4 @@ EXTCONST U32 PL_EXACT_REQ8_bitmask = 0x1E00;
 
 #endif /* defined(PERL_CORE) || defined(PERL_EXT_RE_BUILD) */
 
-/* ex: set ro: */
+/* ex: set ro ft=c: */
index f2625d9..28c767f 100644 (file)
@@ -63,10 +63,10 @@ Perl_stack_grow(pTHX_ SV **sp, SV **p, SSize_t n)
     return PL_stack_sp;
 }
 
-#ifndef STRESS_REALLOC
-#define GROW(old) ((old) * 3 / 2)
-#else
+#ifdef STRESS_REALLOC
 #define GROW(old) ((old) + 1)
+#else
+#define GROW(old) ((old) * 3 / 2)
 #endif
 
 PERL_SI *
@@ -166,25 +166,44 @@ Perl_markstack_grow(pTHX)
 void
 Perl_savestack_grow(pTHX)
 {
-    IV new_max;
-#ifdef STRESS_REALLOC
-    new_max = PL_savestack_max + SS_MAXPUSH;
-#else
-    new_max = GROW(PL_savestack_max);
-#endif
-    /* Note that we allocate SS_MAXPUSH slots higher than ss_max
-     * so that SS_ADD_END(), SSGROW() etc can do a simper check */
-    Renew(PL_savestack, new_max + SS_MAXPUSH, ANY);
-    PL_savestack_max = new_max;
+    const I32 by = PL_savestack_max - PL_savestack_ix;
+    Perl_savestack_grow_cnt(aTHX_ by);
 }
 
 void
 Perl_savestack_grow_cnt(pTHX_ I32 need)
 {
-    const IV new_max = PL_savestack_ix + need;
-    /* Note that we allocate SS_MAXPUSH slots higher than ss_max
-     * so that SS_ADD_END(), SSGROW() etc can do a simper check */
-    Renew(PL_savestack, new_max + SS_MAXPUSH, ANY);
+    /* NOTE: PL_savestack_max and PL_savestack_ix are I32.
+     *
+     * This makes sense when you consider that having I32_MAX items on
+     * the stack would be quite large.
+     *
+     * However, we use IV here so that we can detect if the new requested
+     * amount is larger than I32_MAX.
+     */
+    const IV new_floor = PL_savestack_max + need; /* what we need */
+    /* the GROW() macro normally does scales by 1.5 but under
+     * STRESS_REALLOC it simply adds 1 */
+    IV new_max         = GROW(new_floor); /* and some extra */
+
+    /* the new_max < PL_savestack_max is for cases where IV is I32
+     * and we have rolled over from I32_MAX to a small value */
+    if (new_max > I32_MAX || new_max < PL_savestack_max) {
+        if (new_floor > I32_MAX || new_floor < PL_savestack_max) {
+            Perl_croak(aTHX_ "panic: savestack overflows I32_MAX");
+        }
+        new_max = new_floor;
+    }
+
+    /* Note that we add an additional SS_MAXPUSH slots on top of
+     * PL_savestack_max so that SS_ADD_END(), SSGROW() etc can do
+     * a simper check and if necessary realloc *after* apparently
+     * overwriting the current PL_savestack_max. See scope.h.
+     *
+     * The +1 is because new_max/PL_savestack_max is the highest
+     * index, by Renew needs the number of items, which is one
+     * larger than the highest index. */
+    Renew(PL_savestack, new_max + SS_MAXPUSH + 1, ANY);
     PL_savestack_max = new_max;
 }
 
@@ -238,6 +257,27 @@ Perl_free_tmps(pTHX)
     }
 }
 
+/*
+=for apidoc save_scalar_at
+
+A helper function for localizing the SV referenced by C<*sptr>.
+
+If C<SAVEf_KEEPOLDELEM> is set in in C<flags>, the function returns the input
+scalar untouched.
+
+Otherwise it replaces C<*sptr> with a new C<undef> scalar, and returns that.
+The new scalar will have the old one's magic (if any) copied to it.
+If there is such magic, and C<SAVEf_SETMAGIC> is set in in C<flags>, 'set'
+magic will be processed on the new scalar.  If unset, 'set' magic will be
+skipped.  The latter typically means that assignment will soon follow (I<e.g.>,
+S<C<'local $x = $y'>>), and that will handle the magic.
+
+=for apidoc Amnh ||SAVEf_KEEPOLDELEM
+=for apidoc Amnh ||SAVEf_SETMAGIC
+
+=cut
+*/
+
 STATIC SV *
 S_save_scalar_at(pTHX_ SV **sptr, const U32 flags)
 {
@@ -303,6 +343,43 @@ Perl_save_generic_svref(pTHX_ SV **sptr)
     save_pushptrptr(sptr, SvREFCNT_inc(*sptr), SAVEt_GENERIC_SVREF);
 }
 
+
+/*
+=for apidoc save_rcpv
+
+Implements C<SAVERCPV>.
+
+Saves and restores a refcounted string, similar to what
+save_generic_svref would do for a SV*. Can be used to restore
+a refcounted string to its previous state. Performs the 
+appropriate refcount counting so that nothing should leak
+or be prematurely freed.
+
+=cut
+ */
+void
+Perl_save_rcpv(pTHX_ char **prcpv) {
+    PERL_ARGS_ASSERT_SAVE_RCPV;
+    save_pushptrptr(prcpv, rcpv_copy(*prcpv), SAVEt_RCPV);
+}
+
+/*
+=for apidoc save_freercpv
+
+Implements C<SAVEFREERCPV>.
+
+Saves and frees a refcounted string. Calls rcpv_free()
+on the argument when the current pseudo block is finished.
+
+=cut
+ */
+void
+Perl_save_freercpv(pTHX_ char *rcpv) {
+    PERL_ARGS_ASSERT_SAVE_FREERCPV;
+    save_pushptr(rcpv, SAVEt_FREERCPV);
+}
+
+
 /*
 =for apidoc_section $callback
 =for apidoc save_generic_pvref
@@ -410,7 +487,7 @@ Perl_save_gp(pTHX_ GV *gv, I32 empty)
         HV * const stash = GvSTASH(gv);
         bool isa_changed = 0;
 
-        if (stash && HvENAME(stash)) {
+        if (stash && HvHasENAME(stash)) {
             if (memEQs(GvNAME(gv), GvNAMELEN(gv), "ISA"))
                 isa_changed = TRUE;
             else if (GvCVu(gv))
@@ -592,7 +669,7 @@ Perl_save_iv(pTHX_ IV *ivp)
 {
     PERL_ARGS_ASSERT_SAVE_IV;
 
-    SSCHECK(3);
+    SSGROW(3);
     SSPUSHIV(*ivp);
     SSPUSHPTR(ivp);
     SSPUSHUV(SAVEt_IV);
@@ -672,6 +749,20 @@ Perl_save_aptr(pTHX_ AV **aptr)
     save_pushptrptr(*aptr, aptr, SAVEt_APTR);
 }
 
+/*
+=for apidoc_section $callback
+=for apidoc save_pushptr
+
+The refcnt of object C<ptr> will be decremented at the end of the current
+I<pseudo-block>.  C<type> gives the type of C<ptr>, expressed as one of the
+constants in F<scope.h> whose name begins with C<SAVEt_>.
+
+This is the underlying implementation of several macros, like
+C<SAVEFREESV>.
+
+=cut
+*/
+
 void
 Perl_save_pushptr(pTHX_ void *const ptr, const int type)
 {
@@ -690,6 +781,7 @@ Perl_save_clearsv(pTHX_ SV **svp)
     PERL_ARGS_ASSERT_SAVE_CLEARSV;
 
     ASSERT_CURPAD_ACTIVE("save_clearsv");
+    assert(*svp);
     SvPADSTALE_off(*svp); /* mark lexical as active */
     if (UNLIKELY((offset_shifted >> SAVE_TIGHT_SHIFT) != offset)) {
         Perl_croak(aTHX_ "panic: pad offset %" UVuf " out of range (%p-%p)",
@@ -824,6 +916,28 @@ S_save_pushptri32ptr(pTHX_ void *const ptr1, const I32 i, void *const ptr2,
     SS_ADD_END(4);
 }
 
+/*
+=for apidoc_section $callback
+=for apidoc      save_aelem
+=for apidoc_item save_aelem_flags
+
+These each arrange for the value of the array element C<av[idx]> to be restored
+at the end of the enclosing I<pseudo-block>.
+
+In C<save_aelem>, the SV at C**sptr> will be replaced by a new C<undef>
+scalar.  That scalar will inherit any magic from the original C<**sptr>,
+and any 'set' magic will be processed.
+
+In C<save_aelem_flags>, C<SAVEf_KEEPOLDELEM> being set in C<flags> causes
+the function to forgo all that:  the scalar at C<**sptr> is untouched.
+If C<SAVEf_KEEPOLDELEM> is not set, the SV at C**sptr> will be replaced by a
+new C<undef> scalar.  That scalar will inherit any magic from the original
+C<**sptr>.  Any 'set' magic will be processed if and only if C<SAVEf_SETMAGIC>
+is set in in C<flags>.
+
+=cut
+*/
+
 void
 Perl_save_aelem_flags(pTHX_ AV *av, SSize_t idx, SV **sptr,
                             const U32 flags)
@@ -855,6 +969,28 @@ Perl_save_aelem_flags(pTHX_ AV *av, SSize_t idx, SV **sptr,
         sv_2mortal(sv);
 }
 
+/*
+=for apidoc_section $callback
+=for apidoc      save_helem
+=for apidoc_item save_helem_flags
+
+These each arrange for the value of the hash element (in Perlish terms)
+C<$hv{key}]> to be restored at the end of the enclosing I<pseudo-block>.
+
+In C<save_helem>, the SV at C**sptr> will be replaced by a new C<undef>
+scalar.  That scalar will inherit any magic from the original C<**sptr>,
+and any 'set' magic will be processed.
+
+In C<save_helem_flags>, C<SAVEf_KEEPOLDELEM> being set in C<flags> causes
+the function to forgo all that:  the scalar at C<**sptr> is untouched.
+If C<SAVEf_KEEPOLDELEM> is not set, the SV at C**sptr> will be replaced by a
+new C<undef> scalar.  That scalar will inherit any magic from the original
+C<**sptr>.  Any 'set' magic will be processed if and only if C<SAVEf_SETMAGIC>
+is set in in C<flags>.
+
+=cut
+*/
+
 void
 Perl_save_helem_flags(pTHX_ HV *hv, SV *key, SV **sptr, const U32 flags)
 {
@@ -914,10 +1050,10 @@ function.
 =cut
 */
 
-I32
-Perl_save_alloc(pTHX_ I32 size, I32 pad)
+SSize_t
+Perl_save_alloc(pTHX_ SSize_t size, I32 pad)
 {
-    const I32 start = pad + ((char*)&PL_savestack[PL_savestack_ix]
+    const SSize_t start = pad + ((char*)&PL_savestack[PL_savestack_ix]
                           - (char*)PL_savestack);
     const UV elems = 1 + ((size + pad - 1) / sizeof(*PL_savestack));
     const UV elems_shifted = elems << SAVE_TIGHT_SHIFT;
@@ -935,65 +1071,6 @@ Perl_save_alloc(pTHX_ I32 size, I32 pad)
 }
 
 
-static const U8 arg_counts[] = {
-    0, /* SAVEt_ALLOC              */
-    0, /* SAVEt_CLEARPADRANGE      */
-    0, /* SAVEt_CLEARSV            */
-    0, /* SAVEt_REGCONTEXT         */
-    1, /* SAVEt_TMPSFLOOR          */
-    1, /* SAVEt_BOOL               */
-    1, /* SAVEt_COMPILE_WARNINGS   */
-    1, /* SAVEt_COMPPAD            */
-    1, /* SAVEt_FREECOPHH          */
-    1, /* SAVEt_FREEOP             */
-    1, /* SAVEt_FREEPV             */
-    1, /* SAVEt_FREESV             */
-    1, /* SAVEt_I16                */
-    1, /* SAVEt_I32_SMALL          */
-    1, /* SAVEt_I8                 */
-    1, /* SAVEt_INT_SMALL          */
-    1, /* SAVEt_MORTALIZESV        */
-    1, /* SAVEt_NSTAB              */
-    1, /* SAVEt_OP                 */
-    1, /* SAVEt_PARSER             */
-    1, /* SAVEt_STACK_POS          */
-    1, /* SAVEt_READONLY_OFF       */
-    1, /* SAVEt_FREEPADNAME        */
-    1, /* SAVEt_STRLEN_SMALL       */
-    2, /* SAVEt_AV                 */
-    2, /* SAVEt_DESTRUCTOR         */
-    2, /* SAVEt_DESTRUCTOR_X       */
-    2, /* SAVEt_GENERIC_PVREF      */
-    2, /* SAVEt_GENERIC_SVREF      */
-    2, /* SAVEt_GP                 */
-    2, /* SAVEt_GVSV               */
-    2, /* SAVEt_HINTS              */
-    2, /* SAVEt_HPTR               */
-    2, /* SAVEt_HV                 */
-    2, /* SAVEt_I32                */
-    2, /* SAVEt_INT                */
-    2, /* SAVEt_ITEM               */
-    2, /* SAVEt_IV                 */
-    2, /* SAVEt_LONG               */
-    2, /* SAVEt_PPTR               */
-    2, /* SAVEt_SAVESWITCHSTACK    */
-    2, /* SAVEt_SHARED_PVREF       */
-    2, /* SAVEt_SPTR               */
-    2, /* SAVEt_STRLEN             */
-    2, /* SAVEt_SV                 */
-    2, /* SAVEt_SVREF              */
-    2, /* SAVEt_VPTR               */
-    2, /* SAVEt_ADELETE            */
-    2, /* SAVEt_APTR               */
-    3, /* SAVEt_HELEM              */
-    3, /* SAVEt_PADSV_AND_MORTALIZE*/
-    3, /* SAVEt_SET_SVFLAGS        */
-    3, /* SAVEt_GVSLOT             */
-    3, /* SAVEt_AELEM              */
-    3, /* SAVEt_DELETE             */
-    3  /* SAVEt_HINTS_HH           */
-};
-
 
 /*
 =for apidoc_section $callback
@@ -1029,7 +1106,7 @@ Perl_leave_scope(pTHX_ I32 base)
             ap = &PL_savestack[ix];
             uv = ap->any_uv;
             type = (U8)uv & SAVE_MASK;
-            argcount = arg_counts[type];
+            argcount = leave_scope_arg_counts[type];
             PL_savestack_ix = ix - argcount;
             ap -= argcount;
         }
@@ -1102,6 +1179,7 @@ Perl_leave_scope(pTHX_ I32 base)
             a0.any_svp = &GvSV(a0.any_gv);
             goto restore_svp;
 
+
         case SAVEt_GENERIC_SVREF:              /* generic sv */
             a0 = ap[0]; a1 = ap[1];
         restore_svp:
@@ -1114,12 +1192,30 @@ Perl_leave_scope(pTHX_ I32 base)
             break;
         }
 
+        case SAVEt_RCPV:           /* like generic sv, but for struct rcpv */
+        {
+            a0 = ap[0]; a1 = ap[1];
+            char *old = *a0.any_pvp;
+            *a0.any_pvp = a1.any_pv;
+            (void)rcpv_free(old);
+            (void)rcpv_free(a1.any_pv);
+            break;
+        }
+
+        case SAVEt_FREERCPV:           /* like SAVEt_FREEPV but for a RCPV */
+        {
+            a0 = ap[0];
+            char *rcpv = a0.any_pv;
+            (void)rcpv_free(rcpv);
+            break;
+        }
+
         case SAVEt_GVSLOT:                     /* any slot in GV */
         {
             HV * hv;
             a0 = ap[0]; a1 = ap[1]; a2 = ap[2];
             hv = GvSTASH(a0.any_gv);
-            if (hv && HvENAME(hv) && (
+            if (hv && HvHasENAME(hv) && (
                     (a2.any_sv && SvTYPE(a2.any_sv) == SVt_PVCV)
                  || (*a1.any_svp && SvTYPE(*a1.any_svp) == SVt_PVCV)
                ))
@@ -1231,10 +1327,10 @@ Perl_leave_scope(pTHX_ I32 base)
 
             a0 = ap[0]; a1 = ap[1];
             /* possibly taking a method out of circulation */  
-            had_method = !!GvCVu(a0.any_gv);
+            had_method = cBOOL(GvCVu(a0.any_gv));
             gp_free(a0.any_gv);
             GvGP_set(a0.any_gv, (GP*)a1.any_ptr);
-            if ((hv=GvSTASH(a0.any_gv)) && HvENAME_get(hv)) {
+            if ((hv=GvSTASH(a0.any_gv)) && HvHasENAME(hv)) {
                 if (memEQs(GvNAME(a0.any_gv), GvNAMELEN(a0.any_gv), "ISA"))
                     mro_isa_changed_in(hv);
                 else if (had_method || GvCVu(a0.any_gv))
@@ -1317,12 +1413,10 @@ Perl_leave_scope(pTHX_ I32 base)
                         if (SvREADONLY(sv))
                             SvREADONLY_off(sv);
 
-                        if (SvOOK(sv)) { /* OOK or HvAUX */
-                            if (SvTYPE(sv) == SVt_PVHV)
-                                Perl_hv_kill_backrefs(aTHX_ MUTABLE_HV(sv));
-                            else
-                                sv_backoff(sv);
-                        }
+                        if (SvTYPE(sv) == SVt_PVHV && HvHasAUX(sv))
+                            Perl_hv_kill_backrefs(aTHX_ MUTABLE_HV(sv));
+                        else if(SvOOK(sv))
+                            sv_backoff(sv);
 
                         if (SvMAGICAL(sv)) {
                             /* note that backrefs (either in HvAUX or magic)
@@ -1589,8 +1683,19 @@ Perl_leave_scope(pTHX_ I32 base)
             break;
 
         case SAVEt_COMPILE_WARNINGS:
+            /* NOTE: we can't put &PL_compiling or PL_curcop on the save
+             *       stack directly, as we currently cannot translate
+             *       them to the correct addresses after a thread start
+             *       or win32 fork start. - Yves
+             */
+            a0 = ap[0];
+            free_and_set_cop_warnings(&PL_compiling, a0.any_pv);
+            break;
+
+        case SAVEt_CURCOP_WARNINGS:
+            /* NOTE: see comment above about SAVEt_COMPILE_WARNINGS */
             a0 = ap[0];
-        free_and_set_cop_warnings(&PL_compiling, (STRLEN*) a0.any_ptr);
+            free_and_set_cop_warnings(PL_curcop, a0.any_pv);
             break;
 
         case SAVEt_PARSER:
@@ -1741,6 +1846,145 @@ Perl_cx_dump(pTHX_ PERL_CONTEXT *cx)
 #endif /* DEBUGGING */
 }
 
+/*
+=for apidoc_section $callback
+=for apidoc mortal_destructor_sv
+
+This function arranges for either a Perl code reference, or a C function
+reference to be called at the B<end of the current statement>.
+
+The C<coderef> argument determines the type of function that will be
+called. If it is C<SvROK()> it is assumed to be a reference to a CV and
+will arrange for the coderef to be called. If it is not SvROK() then it
+is assumed to be a C<SvIV()> which is C<SvIOK()> whose value is a pointer
+to a C function of type C<DESTRUCTORFUNC_t> created using C<PTR2INT()>.
+Either way the C<args> parameter will be provided to the callback as a
+parameter, although the rules for doing so differ between the Perl and
+C mode. Normally this function is only used directly for the Perl case
+and the wrapper C<mortal_destructor_x()> is used for the C function case.
+
+When operating in Perl callback mode the C<args> parameter may be NULL
+in which case the code reference is called with no arguments, otherwise
+if it is an AV (SvTYPE(args) == SVt_PVAV) then the contents of the AV
+will be used as the arguments to the code reference, and if it is any
+other type then the C<args> SV will be provided as a single argument to
+the code reference.
+
+When operating in a C callback mode the C<args> parameter will be passed
+directly to the C function as a C<void *> pointer. No additional
+processing of the argument will be peformed, and it is the callers
+responsibility to free the C<args> parameter if necessary.
+
+Be aware that there is a signficant difference in timing between the
+I<end of the current statement> and the I<end of the current pseudo
+block>. If you are looking for a mechanism to trigger a function at the
+end of the B<current pseudo block> you should look at
+C<SAVEDESTRUCTORX()> instead of this function.
+
+=for apidoc mortal_svfunc_x
+
+This function arranges for a C function reference to be called at the
+B<end of the current statement> with the arguments provided. It is a
+wrapper around C<mortal_destructor_sv()> which ensures that the latter
+function is called appropriately.
+
+Be aware that there is a signficant difference in timing between the
+I<end of the current statement> and the I<end of the current pseudo
+block>. If you are looking for a mechanism to trigger a function at the
+end of the B<current pseudo block> you should look at
+C<SAVEDESTRUCTORX()> instead of this function.
+
+=for apidoc magic_freedestruct
+
+This function is called via magic to implement the
+C<mortal_destructor_sv()> and C<mortal_destructor_x()> functions. It
+should not be called directly and has no user servicable parts.
+
+=cut
+*/
+
+void
+Perl_mortal_destructor_sv(pTHX_ SV *coderef, SV *args) {
+    PERL_ARGS_ASSERT_MORTAL_DESTRUCTOR_SV;
+    assert(
+        (SvROK(coderef) && SvTYPE(SvRV(coderef)) == SVt_PVCV) /* perl coderef */
+         ||
+        (SvIOK(coderef) && !SvROK(coderef))                  /* C function ref */
+    );
+    SV *variable = newSV_type_mortal(SVt_IV);
+    (void)sv_magicext(variable, coderef, PERL_MAGIC_destruct,
+                      &PL_vtbl_destruct, (char *)args, args ? HEf_SVKEY : 0);
+}
+
+
+void
+Perl_mortal_svfunc_x(pTHX_ SVFUNC_t f, SV *sv) {
+    PERL_ARGS_ASSERT_MORTAL_SVFUNC_X;
+    SV *sviv = newSViv(PTR2IV(f));
+    mortal_destructor_sv(sviv,sv);
+}
+
+
+int
+Perl_magic_freedestruct(pTHX_ SV* sv, MAGIC* mg) {
+    PERL_ARGS_ASSERT_MAGIC_FREEDESTRUCT;
+    dSP;
+    union {
+        SV   *sv;
+        AV   *av;
+        char *pv;
+    } args_any;
+    SV *coderef;
+
+    IV nargs = 0;
+    if (PL_phase == PERL_PHASE_DESTRUCT) {
+        Perl_warn(aTHX_ "Can't call destructor for 0x%p in global destruction\n", sv);
+        return 1;
+    }
+
+    args_any.pv = mg->mg_ptr;
+    coderef = mg->mg_obj;
+
+    /* Deal with C function destructor */
+    if (SvTYPE(coderef) == SVt_IV && !SvROK(coderef)) {
+        SVFUNC_t f = INT2PTR(SVFUNC_t, SvIV(coderef));
+        (f)(aTHX_ args_any.sv);
+        return 0;
+    }
+
+    if (args_any.sv) {
+        if (SvTYPE(args_any.sv) == SVt_PVAV) {
+            nargs = av_len(args_any.av) + 1;
+        } else {
+            nargs = 1;
+        }
+    }
+    PUSHSTACKi(PERLSI_MAGIC);
+    ENTER_with_name("call_freedestruct");
+    SAVETMPS;
+    EXTEND(SP, nargs);
+    PUSHMARK(SP);
+    if (args_any.sv) {
+        if (SvTYPE(args_any.sv) == SVt_PVAV) {
+            IV n;
+            for (n = 0 ; n < nargs ; n++ ) {
+                SV **argp = av_fetch(args_any.av, n, 0);
+                if (argp && *argp)
+                    PUSHs(*argp);
+            }
+        } else {
+            PUSHs(args_any.sv);
+        }
+    }
+    PUTBACK;
+    (void)call_sv(coderef, G_VOID | G_EVAL | G_KEEPERR);
+    FREETMPS;
+    LEAVE_with_name("call_freedestruct");
+    POPSTACK;
+    return 0;
+}
+
+
 /*
  * ex: set ts=8 sts=4 sw=4 et:
  */
index 6111f1e..ee4e861 100644 (file)
@@ -8,76 +8,7 @@
  *
  */
 
-/* *** Update arg_counts[] in scope.c if you modify these */
-
-/* zero args */
-
-#define SAVEt_ALLOC            0
-#define SAVEt_CLEARPADRANGE    1
-#define SAVEt_CLEARSV          2
-#define SAVEt_REGCONTEXT       3
-
-/* one arg */
-
-#define SAVEt_TMPSFLOOR                4
-#define SAVEt_BOOL             5
-#define SAVEt_COMPILE_WARNINGS 6
-#define SAVEt_COMPPAD          7
-#define SAVEt_FREECOPHH                8
-#define SAVEt_FREEOP           9
-#define SAVEt_FREEPV           10
-#define SAVEt_FREESV           11
-#define SAVEt_I16              12
-#define SAVEt_I32_SMALL                13
-#define SAVEt_I8               14
-#define SAVEt_INT_SMALL                15
-#define SAVEt_MORTALIZESV      16
-#define SAVEt_NSTAB            17
-#define SAVEt_OP               18
-#define SAVEt_PARSER           19
-#define SAVEt_STACK_POS                20
-#define SAVEt_READONLY_OFF     21
-#define SAVEt_FREEPADNAME      22
-#define SAVEt_STRLEN_SMALL      23
-
-/* two args */
-
-#define SAVEt_AV               24
-#define SAVEt_DESTRUCTOR       25
-#define SAVEt_DESTRUCTOR_X     26
-#define SAVEt_GENERIC_PVREF    27
-#define SAVEt_GENERIC_SVREF    28
-#define SAVEt_GP               29
-#define SAVEt_GVSV             30
-#define SAVEt_HINTS            31
-#define SAVEt_HPTR             32
-#define SAVEt_HV               33
-#define SAVEt_I32              34
-#define SAVEt_INT              35
-#define SAVEt_ITEM             36
-#define SAVEt_IV               37
-#define SAVEt_LONG             38
-#define SAVEt_PPTR             39
-#define SAVEt_SAVESWITCHSTACK  40
-#define SAVEt_SHARED_PVREF     41
-#define SAVEt_SPTR             42
-#define SAVEt_STRLEN           43
-#define SAVEt_SV               44
-#define SAVEt_SVREF            45
-#define SAVEt_VPTR             46
-#define SAVEt_ADELETE          47
-#define SAVEt_APTR             48
-
-/* three args */
-
-#define SAVEt_HELEM            49
-#define SAVEt_PADSV_AND_MORTALIZE 50
-#define SAVEt_SET_SVFLAGS      51
-#define SAVEt_GVSLOT           52
-#define SAVEt_AELEM            53
-#define SAVEt_DELETE           54
-#define SAVEt_HINTS_HH         55
-
+#include "scope_types.h"
 
 #define SAVEf_SETMAGIC         1
 #define SAVEf_KEEPOLDELEM      2
@@ -96,8 +27,8 @@
  * macros */
 #define SS_MAXPUSH 4
 
-#define SSCHECK(need) if (UNLIKELY(PL_savestack_ix + (I32)(need) > PL_savestack_max)) savestack_grow()
 #define SSGROW(need) if (UNLIKELY(PL_savestack_ix + (I32)(need) > PL_savestack_max)) savestack_grow_cnt(need)
+#define SSCHECK(need) SSGROW(need) /* legacy */
 #define SSPUSHINT(i) (PL_savestack[PL_savestack_ix++].any_i32 = (I32)(i))
 #define SSPUSHLONG(i) (PL_savestack[PL_savestack_ix++].any_long = (long)(i))
 #define SSPUSHBOOL(p) (PL_savestack[PL_savestack_ix++].any_bool = (p))
  * like save_pushptrptr() to half its former size.
  * Of course, doing the size check *after* pushing means we must always
  * ensure there are SS_MAXPUSH free slots on the savestack. This is ensured by
- * savestack_grow() and savestack_grow_cnt always allocating SS_MAXPUSH slots
+ * savestack_grow_cnt always allocating SS_MAXPUSH slots
  * more than asked for, or that it sets PL_savestack_max to
  *
  * These are for internal core use only and are subject to change */
     ix += (need);                                               \
     PL_savestack_ix = ix;                                       \
     assert(ix <= PL_savestack_max + SS_MAXPUSH);                \
-    if (UNLIKELY(ix > PL_savestack_max)) savestack_grow();      \
+    if (UNLIKELY(ix > PL_savestack_max)) savestack_grow_cnt(ix - PL_savestack_max);      \
     assert(PL_savestack_ix <= PL_savestack_max);
 
 #define SS_ADD_INT(i)   ((ssp++)->any_i32 = (I32)(i))
 /*
 =for apidoc_section $callback
 
-=for apidoc Amns||SAVETMPS
+=for apidoc Amn;||SAVETMPS
 Opening bracket for temporaries on a callback.  See C<L</FREETMPS>> and
 L<perlcall>.
 
-=for apidoc Amns||FREETMPS
+=for apidoc Amn;||FREETMPS
 Closing bracket for temporaries on a callback.  See C<L</SAVETMPS>> and
 L<perlcall>.
 
-=for apidoc Amns||ENTER
+=for apidoc Amn;||ENTER
 Opening bracket on a callback.  See C<L</LEAVE>> and L<perlcall>.
 
-=for apidoc Amns||LEAVE
+=for apidoc Amn;||LEAVE
 Closing bracket on a callback.  See C<L</ENTER>> and L<perlcall>.
 
-=for apidoc Ams||ENTER_with_name|"name"
+=for apidoc Am;||ENTER_with_name|"name"
 
 Same as C<L</ENTER>>, but when debugging is enabled it also associates the
 given literal string with the new scope.
 
-=for apidoc Ams||LEAVE_with_name|"name"
+=for apidoc Am;||LEAVE_with_name|"name"
 
 Same as C<L</LEAVE>>, but when debugging is enabled it first checks that the
 scope has the given name. C<name> must be a literal string.
@@ -246,6 +177,8 @@ scope has the given name. C<name> must be a literal string.
 #define SAVECLEARSV(sv)             save_clearsv((SV**)&(sv))
 #define SAVEGENERICSV(s)            save_generic_svref((SV**)&(s))
 #define SAVEGENERICPV(s)            save_generic_pvref((char**)&(s))
+#define SAVERCPV(s)                 save_rcpv((char**)&(s))
+#define SAVEFREERCPV(s)             save_freercpv(s)
 #define SAVESHAREDPV(s)             save_shared_pvref((char**)&(s))
 #define SAVESETSVFLAGS(sv,mask,val) save_set_svflags(sv,mask,val)
 #define SAVEFREECOPHH(h)            save_pushptr((void *)(h), SAVEt_FREECOPHH)
@@ -262,6 +195,12 @@ scope has the given name. C<name> must be a literal string.
 #define SAVEDESTRUCTOR_X(f,p) \
           save_destructor_x((DESTRUCTORFUNC_t)(f), (void*)(p))
 
+#define MORTALSVFUNC_X(f,sv) \
+          mortal_svfunc_x((SVFUNC_t)(f), sv)
+
+#define MORTALDESTRUCTOR_SV(coderef,args) \
+          mortal_destructor_sv(coderef,args)
+
 #define SAVESTACK_POS() \
     STMT_START {                                  \
         dSS_ADD;                                   \
@@ -283,19 +222,28 @@ scope has the given name. C<name> must be a literal string.
         PL_curstackinfo->si_stack = (t);               \
     } STMT_END
 
-/* Need to do the cop warnings like this, rather than a "SAVEFREESHAREDPV",
-   because realloc() means that the value can actually change. Possibly
-   could have done savefreesharedpvREF, but this way actually seems cleaner,
-   as it simplifies the code that does the saves, and reduces the load on the
-   save stack.  */
+/* Note these are special, we can't just use a save_pushptrptr() on them
+ * as the target might change after a fork or thread start. */
 #define SAVECOMPILEWARNINGS() save_pushptr(PL_compiling.cop_warnings, SAVEt_COMPILE_WARNINGS)
+#define SAVECURCOPWARNINGS()  save_pushptr(PL_curcop->cop_warnings, SAVEt_CURCOP_WARNINGS)
+
 
 #define SAVEPARSER(p) save_pushptr((p), SAVEt_PARSER)
 
 #ifdef USE_ITHREADS
 #  define SAVECOPSTASH_FREE(c) SAVEIV((c)->cop_stashoff)
-#  define SAVECOPFILE(c)       SAVEPPTR(CopFILE(c))
-#  define SAVECOPFILE_FREE(c)  SAVESHAREDPV(CopFILE(c))
+#  define SAVECOPFILE_x(c)      SAVEPPTR((c)->cop_file)
+#  define SAVECOPFILE(c)                \
+    STMT_START {                        \
+        SAVECOPFILE_x(c);               \
+        CopFILE_debug((c),"SAVECOPFILE",0);   \
+    } STMT_END
+#  define SAVECOPFILE_FREE_x(c) SAVERCPV((c)->cop_file)
+#  define SAVECOPFILE_FREE(c)           \
+    STMT_START {                        \
+        SAVECOPFILE_FREE_x(c);          \
+        CopFILE_debug((c),"SAVECOPFILE_FREE",0);   \
+    } STMT_END
 #else
 #  /* XXX not refcounted */
 #  define SAVECOPSTASH_FREE(c) SAVESPTR(CopSTASH(c))
@@ -307,12 +255,12 @@ scope has the given name. C<name> must be a literal string.
 
 /*
 =for apidoc_section $stack
-=for apidoc    Am|I32|SSNEW  |Size_t size
-=for apidoc_item |   |SSNEWa |Size_t_size|Size_t align
-=for apidoc_item |   |SSNEWt |Size_t size|type
-=for apidoc_item |   |SSNEWat|Size_t_size|type|Size_t align
+=for apidoc    Am|SSize_t|SSNEW  |Size_t size
+=for apidoc_item |       |SSNEWa |Size_t_size|Size_t align
+=for apidoc_item |       |SSNEWat|Size_t_size|type|Size_t align
+=for apidoc_item |       |SSNEWt |Size_t size|type
 
-These temporarily allocates data on the savestack, returning an I32 index into
+These temporarily allocates data on the savestack, returning an SSize_t index into
 the savestack, because a pointer would get broken if the savestack is moved on
 reallocation.  Use L</C<SSPTR>> to convert the returned index into a pointer.
 
@@ -325,8 +273,8 @@ L</C<MEM_ALIGNBYTES>>.  The alignment will be preserved through savestack
 reallocation B<only> if realloc returns data aligned to a size divisible by
 "align"!
 
-=for apidoc   Am|type  |SSPTR |I32 index|type
-=for apidoc_item|type *|SSPTRt|I32 index|type
+=for apidoc   Am|type  |SSPTR |SSize_t index|type
+=for apidoc_item|type *|SSPTRt|SSize_t index|type
 
 These convert the C<index> returned by L/<C<SSNEW>> and kin into actual pointers.
 
@@ -342,8 +290,8 @@ casts it to a pointer of that C<type>.
     (I32)(align - ((size_t)((caddr_t)&PL_savestack[PL_savestack_ix]) % align)) % align)
 #define SSNEWat(n,t,align)     SSNEWa((n)*sizeof(t), align)
 
-#define SSPTR(off,type)         ((type)  ((char*)PL_savestack + off))
-#define SSPTRt(off,type)        ((type*) ((char*)PL_savestack + off))
+#define SSPTR(off,type)         (assert(sizeof(off) >= sizeof(SSize_t)), (type)  ((char*)PL_savestack + off))
+#define SSPTRt(off,type)        (assert(sizeof(off) >= sizeof(SSize_t)), (type*) ((char*)PL_savestack + off))
 
 #define save_freesv(op)                save_pushptr((void *)(op), SAVEt_FREESV)
 #define save_mortalizesv(op)   save_pushptr((void *)(op), SAVEt_MORTALIZESV)
index 669678a..ae40a2d 100644 (file)
@@ -231,7 +231,10 @@ Public API:
 
 #ifdef DEBUG_LEAKING_SCALARS
 #  define FREE_SV_DEBUG_FILE(sv) STMT_START { \
-        if ((sv)->sv_debug_file) PerlMemShared_free((sv)->sv_debug_file); \
+        if ((sv)->sv_debug_file) {                   \
+            PerlMemShared_free((sv)->sv_debug_file); \
+            sv->sv_debug_file = NULL;                \
+        }                                            \
     } STMT_END
 #  define DEBUG_SV_SERIAL(sv)                                              \
     DEBUG_m(PerlIO_printf(Perl_debug_log, "0x%" UVxf ": (%05ld) del_SV\n",    \
@@ -384,7 +387,7 @@ S_visit(pTHX_ SVFUNC_t f, const U32 flags, const U32 mask)
         const SV * const svend = &sva[SvREFCNT(sva)];
         SV* sv;
         for (sv = sva + 1; sv < svend; ++sv) {
-            if (SvTYPE(sv) != (svtype)SVTYPEMASK
+            if (!SvIS_FREED(sv)
                     && (sv->sv_flags & mask) == flags
                     && SvREFCNT(sv))
             {
@@ -403,7 +406,7 @@ S_visit(pTHX_ SVFUNC_t f, const U32 flags, const U32 mask)
 static void
 do_report_used(pTHX_ SV *const sv)
 {
-    if (SvTYPE(sv) != (svtype)SVTYPEMASK) {
+    if (!SvIS_FREED(sv)) {
         PerlIO_printf(Perl_debug_log, "****\n");
         sv_dump(sv);
     }
@@ -685,7 +688,7 @@ Perl_sv_free_arenas(pTHX)
 /*
   Historically, here were mid-level routines that manage the
   allocation of bodies out of the various arenas. Some of these
-  routines and related definitions remain here, but otherse were
+  routines and related definitions remain here, but others were
   moved into sv_inline.h to facilitate inlining of newSV_type().
 
   There are 4 kinds of arenas:
@@ -698,7 +701,7 @@ Perl_sv_free_arenas(pTHX)
   Arena types 2 & 3 are chained by body-type off an array of
   arena-root pointers, which is indexed by svtype.  Some of the
   larger/less used body types are malloced singly, since a large
-  unused block of them is wasteful.  Also, several svtypes dont have
+  unused block of them is wasteful.  Also, several svtypes don't have
   bodies; the data fits into the sv-head itself.  The arena-root
   pointer thus has a few unused root-pointers (which may be hijacked
   later for arena type 4)
@@ -1041,6 +1044,7 @@ Perl_sv_upgrade(pTHX_ SV *const sv, svtype new_type)
         return;
     case SVt_PVHV:
     case SVt_PVAV:
+    case SVt_PVOBJ:
         assert(new_type_details->body_size);
 
 #ifndef PURIFY
@@ -1056,26 +1060,50 @@ Perl_sv_upgrade(pTHX_ SV *const sv, svtype new_type)
         new_body = new_NOARENAZ(new_type_details);
 #endif
         SvANY(sv) = new_body;
-        if (new_type == SVt_PVAV) {
-            *((XPVAV*) SvANY(sv)) = (XPVAV) {
-                .xmg_stash = NULL, .xmg_u = {.xmg_magic = NULL},
-                .xav_fill = -1, .xav_max = -1, .xav_alloc = 0
+        switch(new_type) {
+        case SVt_PVAV:
+            {
+                XPVAV pvav = {
+                    .xmg_stash = NULL,
+                    .xmg_u = {.xmg_magic = NULL},
+                    .xav_fill = -1, .xav_max = -1, .xav_alloc = 0
                 };
+                *((XPVAV*) SvANY(sv)) = pvav;
+            }
 
             AvREAL_only(sv);
-        } else {
-            *((XPVHV*) SvANY(sv)) = (XPVHV) {
-                .xmg_stash = NULL, .xmg_u = {.xmg_magic = NULL},
-                .xhv_keys = 0,
-                /* start with PERL_HASH_DEFAULT_HvMAX+1 buckets: */
-                .xhv_max = PERL_HASH_DEFAULT_HvMAX
+            break;
+        case SVt_PVHV:
+            {
+                XPVHV pvhv = {
+                    .xmg_stash = NULL,
+                    .xmg_u = {.xmg_magic = NULL},
+                    .xhv_keys = 0,
+                    /* start with PERL_HASH_DEFAULT_HvMAX+1 buckets: */
+                    .xhv_max = PERL_HASH_DEFAULT_HvMAX
                 };
+                *((XPVHV*) SvANY(sv)) = pvhv;
+            }
 
             assert(!SvOK(sv));
             SvOK_off(sv);
 #ifndef NODEFAULT_SHAREKEYS
             HvSHAREKEYS_on(sv);         /* key-sharing on by default */
 #endif
+            break;
+        case SVt_PVOBJ:
+            {
+                XPVOBJ pvo = {
+                    .xmg_stash = NULL, .xmg_u = {.xmg_magic = NULL},
+                    .xobject_maxfield = -1,
+                    .xobject_iter_sv_at = 0,
+                    .xobject_fields = NULL,
+                };
+                *((XPVOBJ*) SvANY(sv)) = pvo;
+            }
+            break;
+        default:
+            NOT_REACHED;
         }
 
         /* SVt_NULL isn't the only thing upgraded to AV or HV.
@@ -1206,7 +1234,7 @@ Perl_hv_auxalloc(pTHX_ HV *hv) {
 
     PERL_ARGS_ASSERT_HV_AUXALLOC;
     assert(SvTYPE(hv) == SVt_PVHV);
-    assert(!SvOOK(hv));
+    assert(!HvHasAUX(hv));
 
 #ifdef PURIFY
     new_body = new_NOARENAZ(&fake_hv_with_aux);
@@ -1230,7 +1258,7 @@ Perl_hv_auxalloc(pTHX_ HV *hv) {
 #endif
 
     SvANY(hv) = (XPVHV *) new_body;
-    SvOOK_on(hv);
+    SvFLAGS(hv) |= SVphv_HasAUX;
     return HvAUX(hv);
 }
 
@@ -1328,7 +1356,7 @@ Perl_sv_grow(pTHX_ SV *const sv, STRLEN newlen)
 
     if (newlen > SvLEN(sv)) {          /* need more room? */
         STRLEN minlen = SvCUR(sv);
-        minlen += (minlen >> PERL_STRLEN_EXPAND_SHIFT) + 10;
+        minlen += (minlen >> PERL_STRLEN_EXPAND_SHIFT) + PERL_STRLEN_NEW_MIN;
         if (newlen < minlen)
             newlen = minlen;
 #ifndef PERL_UNWARANTED_CHUMMINESS_WITH_MALLOC
@@ -1402,10 +1430,8 @@ Perl_sv_grow_fresh(pTHX_ SV *const sv, STRLEN newlen)
         newlen++;
 #endif
 
-    /* 10 is a longstanding, hardcoded minimum length in sv_grow. */
-    /* Just doing the same here for consistency. */
-    if (newlen < 10)
-        newlen = 10;
+    if (newlen < PERL_STRLEN_NEW_MIN)
+        newlen = PERL_STRLEN_NEW_MIN;
 
     s = (char*)safemalloc(newlen);
     SvPV_set(sv, s);
@@ -1435,10 +1461,23 @@ Perl_sv_setiv(pTHX_ SV *const sv, const IV i)
 
     SV_CHECK_THINKFIRST_COW_DROP(sv);
     switch (SvTYPE(sv)) {
+#if NVSIZE <= IVSIZE
+    case SVt_NULL:
+    case SVt_NV:
+        SET_SVANY_FOR_BODYLESS_IV(sv);
+        SvFLAGS(sv) &= ~SVTYPEMASK;
+        SvFLAGS(sv) |= SVt_IV;
+        break;
+#else
     case SVt_NULL:
+        SET_SVANY_FOR_BODYLESS_IV(sv);
+        SvFLAGS(sv) &= ~SVTYPEMASK;
+        SvFLAGS(sv) |= SVt_IV;
+        break;
     case SVt_NV:
         sv_upgrade(sv, SVt_IV);
         break;
+#endif
     case SVt_PV:
         sv_upgrade(sv, SVt_PVIV);
         break;
@@ -1541,8 +1580,15 @@ Perl_sv_setnv(pTHX_ SV *const sv, const NV num)
     switch (SvTYPE(sv)) {
     case SVt_NULL:
     case SVt_IV:
+#if NVSIZE <= IVSIZE
+        SET_SVANY_FOR_BODYLESS_NV(sv);
+        SvFLAGS(sv) &= ~SVTYPEMASK;
+        SvFLAGS(sv) |= SVt_NV;
+        break;
+#else
         sv_upgrade(sv, SVt_NV);
         break;
+#endif
     case SVt_PV:
     case SVt_PVIV:
         sv_upgrade(sv, SVt_PVNV);
@@ -2180,19 +2226,19 @@ S_sv_2iuv_common(pTHX_ SV *const sv)
                 assert (SvIOKp(sv));
             } else {
                 if (((UV)1 << NV_PRESERVES_UV_BITS) >
-                    U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))) {
+                    U_V(Perl_fabs(SvNVX(sv)))) {
                     /* Small enough to preserve all bits. */
                     (void)SvIOKp_on(sv);
                     SvNOK_on(sv);
                     SvIV_set(sv, I_V(SvNVX(sv)));
                     if ((NV)(SvIVX(sv)) == SvNVX(sv))
                         SvIOK_on(sv);
-                    /* Assumption: first non-preserved integer is < IV_MAX,
-                       this NV is in the preserved range, therefore: */
-                    if (!(U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))
-                          < (UV)IV_MAX)) {
-                        Perl_croak(aTHX_ "sv_2iv assumed (U_V(fabs((double)SvNVX(sv))) < (UV)IV_MAX) but SvNVX(sv)=%" NVgf " U_V is 0x%" UVxf ", IV_MAX is 0x%" UVxf "\n", SvNVX(sv), U_V(SvNVX(sv)), (UV)IV_MAX);
-                    }
+                    /* There had been runtime checking for
+                       "U_V(Perl_fabs(SvNVX(sv))) < (UV)IV_MAX" here to ensure
+                       that this NV is in the preserved range, but this should
+                       be always true if the following assertion is true: */
+                    STATIC_ASSERT_STMT(((UV)1 << NV_PRESERVES_UV_BITS) <=
+                                       (UV)IV_MAX);
                 } else {
                     /* IN_UV NOT_INT
                          0      0      already failed to read UV.
@@ -2542,8 +2588,7 @@ Perl_sv_2nv_flags(pTHX_ SV *const sv, const I32 flags)
         /* if that shift count is out of range then Configure's test is
            wonky. We shouldn't be in here with NV_PRESERVES_UV_BITS ==
            UV_BITS */
-        if (((UV)1 << NV_PRESERVES_UV_BITS) >
-            U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))) {
+        if (((UV)1 << NV_PRESERVES_UV_BITS) > U_V(Perl_fabs(SvNVX(sv)))) {
             SvNOK_on(sv); /* Definitely small enough to preserve all bits */
         } else if (!(numtype & IS_NUMBER_IN_UV)) {
             /* Can't use strtol etc to convert this string, so don't try.
@@ -2813,21 +2858,28 @@ char *
 Perl_sv_2pv_flags(pTHX_ SV *const sv, STRLEN *const lp, const U32 flags)
 {
     char *s;
+    bool done_gmagic = FALSE;
 
     PERL_ARGS_ASSERT_SV_2PV_FLAGS;
 
     assert (SvTYPE(sv) != SVt_PVAV && SvTYPE(sv) != SVt_PVHV
          && SvTYPE(sv) != SVt_PVFM);
-    if (SvGMAGICAL(sv) && (flags & SV_GMAGIC))
+    if (SvGMAGICAL(sv) && (flags & SV_GMAGIC)) {
         mg_get(sv);
+        done_gmagic = TRUE;
+    }
+
     if (SvROK(sv)) {
         if (SvAMAGIC(sv)) {
             SV *tmpstr;
+            SV *nsv= (SV *)sv;
             if (flags & SV_SKIP_OVERLOAD)
                 return NULL;
-            tmpstr = AMG_CALLunary(sv, string_amg);
+            if (done_gmagic)
+                nsv = sv_mortalcopy_flags(sv,0);
+            tmpstr = AMG_CALLunary(nsv, string_amg);
             TAINT_IF(tmpstr && SvTAINTED(tmpstr));
-            if (tmpstr && (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
+            if (tmpstr && (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(nsv)))) {
                 /* Unwrap this:  */
                 /* char *pv = lp ? SvPV(tmpstr, *lp) : SvPV_nolen(tmpstr);
                  */
@@ -3039,7 +3091,7 @@ Perl_sv_2pv_flags(pTHX_ SV *const sv, STRLEN *const lp, const U32 flags)
                     DECLARATION_FOR_LC_NUMERIC_MANIPULATION;
                     STORE_LC_NUMERIC_SET_TO_NEEDED();
 
-                    local_radix = _NOT_IN_NUMERIC_STANDARD;
+                    local_radix = NOT_IN_NUMERIC_STANDARD_;
                     if (local_radix && SvCUR(PL_numeric_radix_sv) > 1) {
                         size += SvCUR(PL_numeric_radix_sv) - 1;
                         s = SvGROW_mutable(sv, size);
@@ -3114,8 +3166,8 @@ Perl_sv_2pv_flags(pTHX_ SV *const sv, STRLEN *const lp, const U32 flags)
 
 /*
 =for apidoc sv_copypv
-=for apidoc_item sv_copypv_nomg
 =for apidoc_item sv_copypv_flags
+=for apidoc_item sv_copypv_nomg
 
 These copy a stringified representation of the source SV into the
 destination SV.  They automatically perform coercion of numeric values into
@@ -3292,9 +3344,9 @@ Perl_sv_2bool_flags(pTHX_ SV *sv, I32 flags)
 
 /*
 =for apidoc sv_utf8_upgrade
-=for apidoc_item sv_utf8_upgrade_nomg
 =for apidoc_item sv_utf8_upgrade_flags
 =for apidoc_item sv_utf8_upgrade_flags_grow
+=for apidoc_item sv_utf8_upgrade_nomg
 
 These convert the PV of an SV to its UTF-8-encoded form.
 The SV is forced to string form if it is not already.
@@ -3709,7 +3761,7 @@ S_glob_assign_glob(pTHX_ SV *const dsv, SV *const ssv, const int dtype)
         /* If source has a real method, then a method is
            going to change */
         else if(
-         GvCV((const GV *)ssv) && GvSTASH(dsv) && HvENAME(GvSTASH(dsv))
+         GvCV((const GV *)ssv) && GvSTASH(dsv) && HvHasENAME(GvSTASH(dsv))
         ) {
             mro_changes = 1;
         }
@@ -3718,7 +3770,7 @@ S_glob_assign_glob(pTHX_ SV *const dsv, SV *const ssv, const int dtype)
     /* If dest already had a real method, that's a change as well */
     if(
         !mro_changes && GvGP(MUTABLE_GV(dsv)) && GvCVu((const GV *)dsv)
-     && GvSTASH(dsv) && HvENAME(GvSTASH(dsv))
+     && GvSTASH(dsv) && HvHasENAME(GvSTASH(dsv))
     ) {
         mro_changes = 1;
     }
@@ -3731,7 +3783,7 @@ S_glob_assign_glob(pTHX_ SV *const dsv, SV *const ssv, const int dtype)
         if(memEQs(name, len, "ISA")
          /* The stash may have been detached from the symbol table, so
             check its name. */
-         && GvSTASH(dsv) && HvENAME(GvSTASH(dsv))
+         && GvSTASH(dsv) && HvHasENAME(GvSTASH(dsv))
         )
             mro_changes = 2;
         else {
@@ -3775,11 +3827,13 @@ S_glob_assign_glob(pTHX_ SV *const dsv, SV *const ssv, const int dtype)
         SV * const sref = (SV *)GvAV((const GV *)dsv);
         if (SvSMAGICAL(sref) && (mg = mg_find(sref, PERL_MAGIC_isa))) {
             if (SvTYPE(mg->mg_obj) != SVt_PVAV) {
-                AV * const ary = newAV();
-                av_push(ary, mg->mg_obj); /* takes the refcount */
+                AV * const ary = newAV_alloc_x(2);
+                av_push_simple(ary, mg->mg_obj); /* takes the refcount */
+                av_push_simple(ary, SvREFCNT_inc_simple_NN(dsv));
                 mg->mg_obj = (SV *)ary;
+            } else {
+                av_push((AV *)mg->mg_obj, SvREFCNT_inc_simple_NN(dsv));
             }
-            av_push((AV *)mg->mg_obj, SvREFCNT_inc_simple_NN(dsv));
         }
         else sv_magic(sref, dsv, PERL_MAGIC_isa, NULL, 0);
       }
@@ -3787,7 +3841,7 @@ S_glob_assign_glob(pTHX_ SV *const dsv, SV *const ssv, const int dtype)
     }
     else if(mro_changes == 3) {
         HV * const stash = GvHV(dsv);
-        if(old_stash ? (HV *)HvENAME_get(old_stash) : stash)
+        if(old_stash ? HvHasENAME(old_stash) : cBOOL(stash))
             mro_package_moved(
                 stash, old_stash,
                 (GV *)dsv, 0
@@ -3887,7 +3941,7 @@ Perl_gv_setref(pTHX_ SV *const dsv, SV *const ssv)
                     {
                         SV * const new_const_sv =
                             CvCONST((const CV *)sref)
-                                 ? cv_const_sv((const CV *)sref)
+                                 ? cv_const_sv_or_av((const CV *)sref)
                                  : NULL;
                         HV * const stash = GvSTASH((const GV *)dsv);
                         report_redefined_cv(
@@ -3937,7 +3991,7 @@ Perl_gv_setref(pTHX_ SV *const dsv, SV *const ssv)
                    (len > 1 && name[len-2] == ':' && name[len-1] == ':')
                 || (len == 1 && name[0] == ':')
                 )
-             && (!dref || HvENAME_get(dref))
+             && (!dref || HvHasENAME(dref))
             ) {
                 mro_package_moved(
                     (HV *)sref, (HV *)dref,
@@ -3950,7 +4004,7 @@ Perl_gv_setref(pTHX_ SV *const dsv, SV *const ssv)
          && memEQs(GvNAME((GV*)dsv), GvNAMELEN((GV*)dsv), "ISA")
          /* The stash may have been detached from the symbol table, so
             check its name before doing anything. */
-         && GvSTASH(dsv) && HvENAME(GvSTASH(dsv))
+         && GvSTASH(dsv) && HvHasENAME(GvSTASH(dsv))
         ) {
             MAGIC *mg;
             MAGIC * const omg = dref && SvSMAGICAL(dref)
@@ -3958,8 +4012,8 @@ Perl_gv_setref(pTHX_ SV *const dsv, SV *const ssv)
                                  : NULL;
             if (SvSMAGICAL(sref) && (mg = mg_find(sref, PERL_MAGIC_isa))) {
                 if (SvTYPE(mg->mg_obj) != SVt_PVAV) {
-                    AV * const ary = newAV();
-                    av_push(ary, mg->mg_obj); /* takes the refcount */
+                    AV * const ary = newAV_alloc_xz(4);
+                    av_push_simple(ary, mg->mg_obj); /* takes the refcount */
                     mg->mg_obj = (SV *)ary;
                 }
                 if (omg) {
@@ -4089,9 +4143,14 @@ Perl_sv_setsv_flags(pTHX_ SV *dsv, SV* ssv, const I32 flags)
      * freed) just by testing the or'ed types */
     STATIC_ASSERT_STMT(SVt_NULL == 0);
     STATIC_ASSERT_STMT(SVt_IV   == 1);
+    STATIC_ASSERT_STMT(SVt_NV   == 2);
+#if NVSIZE <= IVSIZE
+    if (both_type <= 2) {
+#else
     if (both_type <= 1) {
-        /* both src and dst are UNDEF/IV/RV, so we can do a lot of
-         * special-casing */
+#endif
+        /* both src and dst are UNDEF/IV/RV - maybe NV depending on config,
+         * so we can do a lot of special-casing */
         U32 sflags;
         U32 new_dflags;
         SV *old_rv = NULL;
@@ -4104,6 +4163,7 @@ Perl_sv_setsv_flags(pTHX_ SV *dsv, SV* ssv, const I32 flags)
                 sv_unref_flags(dsv, 0);
             else
                 old_rv = SvRV(dsv);
+            SvROK_off(dsv);
         }
 
         assert(!SvGMAGICAL(ssv));
@@ -4130,12 +4190,33 @@ Perl_sv_setsv_flags(pTHX_ SV *dsv, SV* ssv, const I32 flags)
                 new_dflags |= (SVf_IOK|SVp_IOK|(sflags & SVf_IVisUV));
             }
         }
+#if NVSIZE <= IVSIZE
+        else if (sflags & SVf_NOK) {
+            SET_SVANY_FOR_BODYLESS_NV(dsv);
+            new_dflags = (SVt_NV|SVf_NOK|SVp_NOK);
+
+            /* both src and dst are <= SVt_MV, so sv_any points to the
+             * head; so access the head directly
+             */
+            assert(    &(ssv->sv_u.svu_nv)
+                    == &(((XPVNV*) SvANY(ssv))->xnv_u.xnv_nv));
+            assert(    &(dsv->sv_u.svu_nv)
+                    == &(((XPVNV*) SvANY(dsv))->xnv_u.xnv_nv));
+            dsv->sv_u.svu_nv = ssv->sv_u.svu_nv;
+        }
+#endif
         else {
             new_dflags = dtype; /* turn off everything except the type */
         }
-        SvFLAGS(dsv) = new_dflags;
-        SvREFCNT_dec(old_rv);
+        /* Should preserve some dsv flags - at least SVs_TEMP, */
+        /* so cannot just set SvFLAGS(dsv) = new_dflags        */
+        /* First clear the flags that we do want to clobber    */
+        (void)SvOK_off(dsv);
+        SvFLAGS(dsv) &= ~SVTYPEMASK;
+        /* Now set the new flags */
+        SvFLAGS(dsv) |= new_dflags;
 
+        SvREFCNT_dec(old_rv);
         return;
     }
 
@@ -4155,7 +4236,9 @@ Perl_sv_setsv_flags(pTHX_ SV *dsv, SV* ssv, const I32 flags)
     SV_CHECK_THINKFIRST_COW_DROP(dsv);
     dtype = SvTYPE(dsv); /* THINKFIRST may have changed type */
 
-    /* There's a lot of redundancy below but we're going for speed here */
+    /* There's a lot of redundancy below but we're going for speed here
+     * Note: some of the cases below do return; rather than break; so the
+     * if-elseif-else logic below this switch does not see all cases. */
 
     switch (stype) {
     case SVt_NULL:
@@ -4243,7 +4326,7 @@ Perl_sv_setsv_flags(pTHX_ SV *dsv, SV* ssv, const I32 flags)
 
     case SVt_INVLIST:
         invlist_clone(ssv, dsv);
-        break;
+        return;
     default:
         {
         const char * const type = sv_reftype(ssv,0);
@@ -4382,7 +4465,7 @@ Perl_sv_setsv_flags(pTHX_ SV *dsv, SV* ssv, const I32 flags)
                 if (reset_isa) {
                     HV * const stash = GvHV(dsv);
                     if(
-                        old_stash ? (HV *)HvENAME_get(old_stash) : stash
+                        old_stash ? HvHasENAME(old_stash) : cBOOL(stash)
                     )
                         mro_package_moved(
                          stash, old_stash,
@@ -4429,11 +4512,11 @@ Perl_sv_setsv_flags(pTHX_ SV *dsv, SV* ssv, const I32 flags)
          * be allocated it is still not worth swiping PADTMPs for short
          * strings, as the savings here are small.
          *
-         * If swiping is not an option, then we see whether it is
-         * worth using copy-on-write.  If the lhs already has a buf-
-         * fer big enough and the string is short, we skip it and fall back
-         * to method 3, since memcpy is faster for short strings than the
-         * later bookkeeping overhead that copy-on-write entails.
+         * If swiping is not an option, then we see whether it is worth using
+         * copy-on-write.  If the lhs already has a buffer big enough and the
+         * string is short, we skip it and fall back to method 3, since memcpy
+         * is faster for short strings than the later bookkeeping overhead that
+         * copy-on-write entails.
 
          * If the rhs is not a copy-on-write string yet, then we also
          * consider whether the buffer is too large relative to the string
@@ -4682,6 +4765,67 @@ Perl_sv_set_undef(pTHX_ SV *sv)
         SvOK_off(sv);
 }
 
+/*
+=for apidoc sv_set_true
+
+Equivalent to C<sv_setsv(sv, &PL_sv_yes)>, but may be made more
+efficient in the future. Doesn't handle set magic.
+
+The perl equivalent is C<$sv = !0;>.
+
+Introduced in perl 5.35.11.
+
+=cut
+*/
+
+void
+Perl_sv_set_true(pTHX_ SV *sv)
+{
+    PERL_ARGS_ASSERT_SV_SET_TRUE;
+    sv_setsv(sv, &PL_sv_yes);
+}
+
+/*
+=for apidoc sv_set_false
+
+Equivalent to C<sv_setsv(sv, &PL_sv_no)>, but may be made more
+efficient in the future. Doesn't handle set magic.
+
+The perl equivalent is C<$sv = !1;>.
+
+Introduced in perl 5.35.11.
+
+=cut
+*/
+
+void
+Perl_sv_set_false(pTHX_ SV *sv)
+{
+    PERL_ARGS_ASSERT_SV_SET_FALSE;
+    sv_setsv(sv, &PL_sv_no);
+}
+
+/*
+=for apidoc sv_set_bool
+
+Equivalent to C<sv_setsv(sv, bool_val ? &Pl_sv_yes : &PL_sv_no)>, but
+may be made more efficient in the future. Doesn't handle set magic.
+
+The perl equivalent is C<$sv = !!$expr;>.
+
+Introduced in perl 5.35.11.
+
+=cut
+*/
+
+void
+Perl_sv_set_bool(pTHX_ SV *sv, const bool bool_val)
+{
+    PERL_ARGS_ASSERT_SV_SET_BOOL;
+    sv_setsv(sv, bool_val ? &PL_sv_yes : &PL_sv_no);
+}
+
+
 void
 Perl_sv_setsv_mg(pTHX_ SV *const dsv, SV *const ssv)
 {
@@ -4719,10 +4863,10 @@ Perl_sv_setsv_cow(pTHX_ SV *dsv, SV *ssv)
             sv_force_normal_flags(dsv, SV_COW_DROP_PV);
         else if (SvPVX_const(dsv))
             Safefree(SvPVX_mutable(dsv));
+        SvUPGRADE(dsv, SVt_COW);
     }
     else
-        new_SV(dsv);
-    SvUPGRADE(dsv, SVt_COW);
+        dsv = newSV_type(SVt_COW);
 
     assert (SvPOK(ssv));
     assert (SvPOKp(ssv));
@@ -4803,11 +4947,11 @@ Perl_sv_setpv_bufsize(pTHX_ SV *const sv, const STRLEN cur, const STRLEN len)
 }
 
 /*
-=for apidoc sv_setpv
-=for apidoc_item sv_setpv_mg
-=for apidoc_item sv_setpvn
-=for apidoc_item sv_setpvn_fresh
-=for apidoc_item sv_setpvn_mg
+=for apidoc            sv_setpv
+=for apidoc_item       sv_setpv_mg
+=for apidoc_item       sv_setpvn
+=for apidoc_item       sv_setpvn_fresh
+=for apidoc_item       sv_setpvn_mg
 =for apidoc_item |void|sv_setpvs|SV* sv|"literal string"
 =for apidoc_item |void|sv_setpvs_mg|SV* sv|"literal string"
 
@@ -4822,7 +4966,7 @@ embedded C<NUL> characters.
 
 In the plain C<pv> forms, C<ptr> points to a NUL-terminated C string.  That is,
 it points to the first byte of the string, and the copy proceeds up through the
-first enountered C<NUL> byte.
+first encountered C<NUL> byte.
 
 In the forms that take a C<ptr> argument, if it is NULL, the SV will become
 undefined.
@@ -4985,8 +5129,8 @@ Perl_sv_sethek(pTHX_ SV *const sv, const HEK *const hek)
 
 /*
 =for apidoc      sv_usepvn
-=for apidoc_item sv_usepvn_mg
 =for apidoc_item sv_usepvn_flags
+=for apidoc_item sv_usepvn_mg
 
 These tell an SV to use C<ptr> for its string value.  Normally SVs have
 their string stored inside the SV, but these tell the SV to use an
@@ -5677,7 +5821,7 @@ Perl_sv_magicext(pTHX_ SV *const sv, SV *const obj, const int how,
             mg->mg_ptr = savepvn(name, namlen);
         else if (namlen == HEf_SVKEY) {
             /* Yes, this is casting away const. This is only for the case of
-               HEf_SVKEY. I think we need to document this aberation of the
+               HEf_SVKEY. I think we need to document this aberration of the
                constness of the API, rather than making name non-const, as
                that change propagating outwards a long way.  */
             mg->mg_ptr = (char*)SvREFCNT_inc_simple_NN((SV *)name);
@@ -5779,7 +5923,7 @@ Perl_sv_magic(pTHX_ SV *const sv, SV *const obj, const int how,
 }
 
 static int
-S_sv_unmagicext_flags(pTHX_ SV *const sv, const int type, MGVTBL *vtbl, const U32 flags)
+S_sv_unmagicext_flags(pTHX_ SV *const sv, const int type, const MGVTBL *vtbl, const U32 flags)
 {
     MAGIC* mg;
     MAGIC** mgp;
@@ -5844,7 +5988,7 @@ Removes all magic of type C<type> with the specified C<vtbl> from an SV.
 */
 
 int
-Perl_sv_unmagicext(pTHX_ SV *const sv, const int type, MGVTBL *vtbl)
+Perl_sv_unmagicext(pTHX_ SV *const sv, const int type, const MGVTBL *vtbl)
 {
     PERL_ARGS_ASSERT_SV_UNMAGICEXT;
     return S_sv_unmagicext_flags(aTHX_ sv, type, vtbl, 1);
@@ -5949,7 +6093,7 @@ Perl_sv_get_backrefs(SV *const sv)
     /* find slot to store array or singleton backref */
 
     if (SvTYPE(sv) == SVt_PVHV) {
-        if (SvOOK(sv)) {
+        if (HvHasAUX(sv)) {
             struct xpvhv_aux * const iter = HvAUX((HV *)sv);
             backrefs = (SV *)iter->xhv_backreferences;
         }
@@ -6056,11 +6200,11 @@ Perl_sv_del_backref(pTHX_ SV *const tsv, SV *const sv)
     PERL_ARGS_ASSERT_SV_DEL_BACKREF;
 
     if (SvTYPE(tsv) == SVt_PVHV) {
-        if (SvOOK(tsv))
+        if (HvHasAUX(tsv))
             svp = (SV**)Perl_hv_backreferences_p(aTHX_ MUTABLE_HV(tsv));
     }
     else if (SvIS_FREED(tsv) && PL_phase == PERL_PHASE_DESTRUCT) {
-        /* It's possible for the the last (strong) reference to tsv to have
+        /* It's possible for the last (strong) reference to tsv to have
            become freed *before* the last thing holding a weak reference.
            If both survive longer than the backreferences array, then when
            the referent's reference count drops to 0 and it is freed, it's
@@ -6447,7 +6591,7 @@ S_anonymise_cv_maybe(pTHX_ GV *gv, CV* cv)
     }
 
     /* if not, anonymise: */
-    gvname = (GvSTASH(gv) && HvNAME(GvSTASH(gv)) && HvENAME(GvSTASH(gv)))
+    gvname = (GvSTASH(gv) && HvHasNAME(GvSTASH(gv)) && HvHasENAME(GvSTASH(gv)))
                     ? newSVhek(HvENAME_HEK(GvSTASH(gv)))
                     : newSVpvn_flags( "__ANON__", 8, 0 );
     sv_catpvs(gvname, "::__ANON__");
@@ -6468,8 +6612,7 @@ and free the body itself.  The SV's head is I<not> freed, although
 its type is set to all 1's so that it won't inadvertently be assumed
 to be live during global destruction etc.
 This function should only be called when C<REFCNT> is zero.  Most of the time
-you'll want to call C<sv_free()> (or its macro wrapper C<SvREFCNT_dec>)
-instead.
+you'll want to call C<SvREFCNT_dec> instead.
 
 =cut
 */
@@ -6494,9 +6637,12 @@ Perl_sv_clear(pTHX_ SV *const orig_sv)
         HV *stash;
 
         assert(SvREFCNT(sv) == 0);
-        assert(SvTYPE(sv) != (svtype)SVTYPEMASK);
-
+        assert(!SvIS_FREED(sv));
+#if NVSIZE <= IVSIZE
+        if (type <= SVt_NV) {
+#else
         if (type <= SVt_IV) {
+#endif
             /* Historically this check on type was needed so that the code to
              * free bodies wasn't reached for these types, because the arena
              * slots were re-used for HEs and pointer table entries. The
@@ -6518,6 +6664,9 @@ Perl_sv_clear(pTHX_ SV *const orig_sv)
              * path, as SvPVX() doesn't point to valid memory.
              *
              * Hence this code is still the most efficient way to handle this.
+             *
+             * Additionally, for bodyless NVs, riding this branch is more
+             * efficient than stepping through the general logic.
              */
 
             if (SvROK(sv))
@@ -6641,6 +6790,17 @@ Perl_sv_clear(pTHX_ SV *const orig_sv)
                 Safefree(AvALLOC(av));
             }
 
+            break;
+        case SVt_PVOBJ:
+            if(ObjectMAXFIELD(sv) > -1) {
+                next_sv = ObjectFIELDS(sv)[ObjectMAXFIELD(sv)--];
+                /* save old iter_sv in top-most field, and pray that it
+                 * doesn't get wiped in the meantime */
+                ObjectFIELDS(sv)[(ObjectITERSVAT(sv) = ObjectMAXFIELD(sv) + 1)] = iter_sv;
+                iter_sv = sv;
+                goto get_next_sv;
+            }
+            Safefree(ObjectFIELDS(sv));
             break;
         case SVt_PVLV:
             if (LvTYPE(sv) == 'T') { /* for tie: return HE to pool */
@@ -6682,7 +6842,7 @@ Perl_sv_clear(pTHX_ SV *const orig_sv)
         case SVt_PVGV:
             if (isGV_with_GP(sv)) {
                 if(GvCVu((const GV *)sv) && (stash = GvSTASH(MUTABLE_GV(sv)))
-                   && HvENAME_get(stash))
+                   && HvHasENAME(stash))
                     mro_method_changed_in(stash);
                 gp_free(MUTABLE_GV(sv));
                 if (GvNAME_HEK(sv))
@@ -6779,7 +6939,7 @@ Perl_sv_clear(pTHX_ SV *const orig_sv)
             U32 arena_index;
             const struct body_details *sv_type_details;
 
-            if (type == SVt_PVHV && SvOOK(sv)) {
+            if (type == SVt_PVHV && HvHasAUX(sv)) {
                 arena_index = HVAUX_ARENA_ROOT_IX;
                 sv_type_details = &fake_hv_with_aux;
             }
@@ -6828,6 +6988,17 @@ Perl_sv_clear(pTHX_ SV *const orig_sv)
                     Safefree(AvALLOC(av));
                     goto free_body;
                 }
+            } else if (SvTYPE(iter_sv) == SVt_PVOBJ) {
+                if (ObjectMAXFIELD(iter_sv) > -1) {
+                    sv = ObjectFIELDS(iter_sv)[ObjectMAXFIELD(iter_sv)--];
+                }
+                else { /* no more fields in the current SV to free */
+                    sv = iter_sv;
+                    type = SvTYPE(sv);
+                    iter_sv = ObjectFIELDS(sv)[ObjectITERSVAT(sv)];
+                    Safefree(ObjectFIELDS(sv));
+                    goto free_body;
+                }
             } else if (SvTYPE(iter_sv) == SVt_PVHV) {
                 sv = Perl_hfree_next_entry(aTHX_ (HV*)iter_sv, &hash_index);
                 if (!sv && !HvTOTALKEYS((HV *)iter_sv)) {
@@ -6901,7 +7072,7 @@ S_curse(pTHX_ SV * const sv, const bool check_refcnt) {
             CV* destructor = NULL;
             struct mro_meta *meta;
 
-            assert (SvOOK(stash));
+            assert (HvHasAUX(stash));
 
             DEBUG_o( Perl_deb(aTHX_ "Looking for DESTROY method for %s\n",
                          HvNAME(stash)) );
@@ -8358,7 +8529,7 @@ Perl_sv_collxfrm_flags(pTHX_ SV *const sv, STRLEN *const nxp, const I32 flags)
             Safefree(mg->mg_ptr);
 
         s = SvPV_flags_const(sv, len, flags);
-        if ((xf = _mem_collxfrm(s, len, &xlen, cBOOL(SvUTF8(sv))))) {
+        if ((xf = mem_collxfrm_(s, len, &xlen, cBOOL(SvUTF8(sv))))) {
             if (! mg) {
                 mg = sv_magicext(sv, 0, PERL_MAGIC_collxfrm, &PL_vtbl_collxfrm,
                                  0, 0);
@@ -8566,7 +8737,7 @@ Perl_sv_gets(pTHX_ SV *const sv, PerlIO *const fp, I32 append)
     SvPOK_only(sv);
     if (!append) {
         /* not appending - "clear" the string by setting SvCUR to 0,
-         * the pv is still avaiable. */
+         * the pv is still available. */
         SvCUR_set(sv,0);
     }
     if (PerlIO_isutf8(fp))
@@ -8813,7 +8984,7 @@ Perl_sv_gets(pTHX_ SV *const sv, PerlIO *const fp, I32 append)
         }
 
         if (shortbuffered) {           /* oh well, must extend */
-            /* we didnt have enough room to fit the line into the target buffer
+            /* we didn't have enough room to fit the line into the target buffer
              * so we must extend the target buffer and keep going */
             cnt = shortbuffered;
             shortbuffered = 0;
@@ -9404,7 +9575,7 @@ Perl_newSVpvn_flags(pTHX_ const char *const s, const STRLEN len, const U32 flags
      * sv_2mortal() and do what it does ourselves here.  Since we have asserted
      * that flags can only have the SVf_UTF8 and/or SVs_TEMP flags set above we
      * can use it to enable the sv flags directly (bypassing SvTEMP_on), which
-     * in turn means we dont need to mask out the SVf_UTF8 flag below, which
+     * in turn means we don't need to mask out the SVf_UTF8 flag below, which
      * means that we eliminate quite a few steps than it looks - Yves
      * (explaining patch by gfx) */
 
@@ -9491,6 +9662,30 @@ Perl_newSVpvn(pTHX_ const char *const buffer, const STRLEN len)
     return sv;
 }
 
+/*
+=for apidoc newSVhek_mortal
+
+Creates a new mortal SV from the hash key structure.  It will generate
+scalars that point to the shared string table where possible.  Returns
+a new (undefined) SV if C<hek> is NULL.
+
+This is more efficient than using sv_2mortal(newSVhek( ... ))
+
+=cut
+*/
+
+SV *
+Perl_newSVhek_mortal(pTHX_ const HEK *const hek)
+{
+    SV * const sv = newSVhek(hek);
+    assert(sv);
+    assert(!SvIMMORTAL(sv));
+
+    PUSH_EXTEND_MORTAL__SV_C(sv);
+    SvTEMP_on(sv);
+    return sv;
+}
+
 /*
 =for apidoc newSVhek
 
@@ -9536,7 +9731,7 @@ Perl_newSVhek(pTHX_ const HEK *const hek)
                 SvUTF8_on (sv);
             return sv;
         }
-        /* This will be overwhelminly the most common case.  */
+        /* This will be overwhelmingly the most common case.  */
         {
             /* Inline most of newSVpvn_share(), because share_hek_hek() is far
                more efficient than sharepvn().  */
@@ -9679,8 +9874,9 @@ Perl_vnewSVpvf(pTHX_ const char *const pat, va_list *const args)
 
     PERL_ARGS_ASSERT_VNEWSVPVF;
 
-    new_SV(sv);
-    sv_vsetpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
+    sv = newSV(1);
+    SvPVCLEAR_FRESH(sv);
+    sv_vcatpvfn_flags(sv, pat, strlen(pat), args, NULL, 0, NULL, 0);
     return sv;
 }
 
@@ -9767,34 +9963,51 @@ Perl_newSVuv(pTHX_ const UV u)
 }
 
 /*
-=for apidoc newRV_noinc
+=for apidoc newSVbool
 
-Creates an RV wrapper for an SV.  The reference count for the original
-SV is B<not> incremented.
+Creates a new SV boolean.
 
 =cut
 */
 
 SV *
-Perl_newRV_noinc(pTHX_ SV *const tmpRef)
+Perl_newSVbool(pTHX_ bool bool_val)
 {
-    SV *sv;
+    PERL_ARGS_ASSERT_NEWSVBOOL;
+    SV *sv = newSVsv(bool_val ? &PL_sv_yes : &PL_sv_no);
 
-    PERL_ARGS_ASSERT_NEWRV_NOINC;
+    return sv;
+}
 
-    new_SV(sv);
+/*
+=for apidoc newSV_true
 
-    /* We're starting from SVt_FIRST, so provided that's
-     * actual 0, we don't have to unset any SV type flags
-     * to promote to SVt_IV. */
-    STATIC_ASSERT_STMT(SVt_FIRST == 0);
+Creates a new SV that is a boolean true.
 
-    SET_SVANY_FOR_BODYLESS_IV(sv);
-    SvFLAGS(sv) |= SVt_IV;
+=cut
+*/
+SV *
+Perl_newSV_true(pTHX)
+{
+    PERL_ARGS_ASSERT_NEWSV_TRUE;
+    SV *sv = newSVsv(&PL_sv_yes);
 
-    SvTEMP_off(tmpRef);
+    return sv;
+}
+
+/*
+=for apidoc newSV_false
 
-    sv_setrv_noinc(sv, tmpRef);
+Creates a new SV that is a boolean false.
+
+=cut
+*/
+
+SV *
+Perl_newSV_false(pTHX)
+{
+    PERL_ARGS_ASSERT_NEWSV_FALSE;
+    SV *sv = newSVsv(&PL_sv_no);
 
     return sv;
 }
@@ -9813,8 +10026,8 @@ Perl_newRV(pTHX_ SV *const sv)
 
 /*
 =for apidoc newSVsv
-=for apidoc_item newSVsv_nomg
 =for apidoc_item newSVsv_flags
+=for apidoc_item newSVsv_nomg
 
 These create a new SV which is an exact duplicate of the original SV
 (using C<sv_setsv>.)
@@ -9833,7 +10046,7 @@ Perl_newSVsv_flags(pTHX_ SV *const old, I32 flags)
 
     if (!old)
         return NULL;
-    if (SvTYPE(old) == (svtype)SVTYPEMASK) {
+    if (SvIS_FREED(old)) {
         Perl_ck_warner_d(aTHX_ packWARN(WARN_INTERNAL), "semi-panic: attempt to dup freed string");
         return NULL;
     }
@@ -9873,7 +10086,7 @@ Perl_sv_resetpvn(pTHX_ const char *s, STRLEN len, HV * const stash)
 
     if (!s) {          /* reset ?? searches */
         MAGIC * const mg = mg_find((const SV *)stash, PERL_MAGIC_symtab);
-        if (mg) {
+        if (mg && mg->mg_len) {
             const U32 count = mg->mg_len / sizeof(PMOP**);
             PMOP **pmp = (PMOP**) mg->mg_ptr;
             PMOP *const *const end = pmp + count;
@@ -9929,7 +10142,7 @@ Perl_sv_resetpvn(pTHX_ const char *s, STRLEN len, HV * const stash)
                 if (GvAV(gv)) {
                     av_clear(GvAV(gv));
                 }
-                if (GvHV(gv) && !HvNAME_get(GvHV(gv))) {
+                if (GvHV(gv) && !HvHasNAME(GvHV(gv))) {
                     hv_clear(GvHV(gv));
                 }
             }
@@ -10196,7 +10409,7 @@ Perl_sv_pvbyten_force(pTHX_ SV *const sv, STRLEN *const lp)
     PERL_ARGS_ASSERT_SV_PVBYTEN_FORCE;
 
     sv_pvn_force(sv,lp);
-    sv_utf8_downgrade(sv,0);
+    (void)sv_utf8_downgrade(sv,0);
     *lp = SvCUR(sv);
     return SvPVX(sv);
 }
@@ -10277,6 +10490,7 @@ Perl_sv_reftype(pTHX_ const SV *const sv, const int ob)
         case SVt_PVIO:         return "IO";
         case SVt_INVLIST:      return "INVLIST";
         case SVt_REGEXP:       return "REGEXP";
+        case SVt_PVOBJ:         return "OBJECT";
         default:               return "UNKNOWN";
         }
     }
@@ -10305,9 +10519,10 @@ Perl_sv_ref(pTHX_ SV *dst, const SV *const sv, const int ob)
         dst = sv_newmortal();
 
     if (ob && SvOBJECT(sv)) {
-        HvNAME_get(SvSTASH(sv))
-                    ? sv_sethek(dst, HvNAME_HEK(SvSTASH(sv)))
-                    : sv_setpvs(dst, "__ANON__");
+        if (HvHasNAME(SvSTASH(sv)))
+            sv_sethek(dst, HvNAME_HEK(SvSTASH(sv)));
+        else
+            sv_setpvs(dst, "__ANON__");
     }
     else {
         const char * reftype = sv_reftype(sv, 0);
@@ -10578,10 +10793,15 @@ Perl_sv_bless(pTHX_ SV *const sv, HV *const stash)
     SvGETMAGIC(sv);
     if (!SvROK(sv))
         Perl_croak(aTHX_ "Can't bless non-reference value");
+    if (HvSTASH_IS_CLASS(stash))
+        Perl_croak(aTHX_ "Attempt to bless into a class");
+
     tmpRef = SvRV(sv);
     if (SvFLAGS(tmpRef) & (SVs_OBJECT|SVf_READONLY|SVf_PROTECT)) {
         if (SvREADONLY(tmpRef))
             Perl_croak_no_modify();
+        if (SvTYPE(tmpRef) == SVt_PVOBJ)
+            Perl_croak(aTHX_ "Can't bless an object reference");
         if (SvOBJECT(tmpRef)) {
             oldstash = SvSTASH(tmpRef);
         }
@@ -10621,7 +10841,7 @@ S_sv_unglob(pTHX_ SV *const sv, U32 flags)
     SvREFCNT_inc_simple_void_NN(sv_2mortal(sv));
     if (GvGP(sv)) {
         if(GvCVu((const GV *)sv) && (stash = GvSTASH(MUTABLE_GV(sv)))
-           && HvNAME_get(stash))
+           && HvHasNAME(stash))
             mro_method_changed_in(stash);
         gp_free(MUTABLE_GV(sv));
     }
@@ -10739,54 +10959,6 @@ Perl_sv_tainted(pTHX_ SV *const sv)
     return FALSE;
 }
 
-#ifndef NO_MATHOMS  /* Can't move these to mathoms.c because call uiv_2buf(),
-                       private to this file */
-
-/*
-=for apidoc sv_setpviv
-=for apidoc_item sv_setpviv_mg
-
-These copy an integer into the given SV, also updating its string value.
-
-They differ only in that C<sv_setpviv_mg> performs 'set' magic; C<sv_setpviv>
-skips any magic.
-
-=cut
-*/
-
-void
-Perl_sv_setpviv(pTHX_ SV *const sv, const IV iv)
-{
-    /* The purpose of this union is to ensure that arr is aligned on
-       a 2 byte boundary, because that is what uiv_2buf() requires */
-    union {
-        char arr[TYPE_CHARS(UV)];
-        U16 dummy;
-    } buf;
-    char *ebuf;
-    char * const ptr = uiv_2buf(buf.arr, iv, 0, 0, &ebuf);
-
-    PERL_ARGS_ASSERT_SV_SETPVIV;
-
-    sv_setpvn(sv, ptr, ebuf - ptr);
-}
-
-void
-Perl_sv_setpviv_mg(pTHX_ SV *const sv, const IV iv)
-{
-    PERL_ARGS_ASSERT_SV_SETPVIV_MG;
-
-    GCC_DIAG_IGNORE_STMT(-Wdeprecated-declarations);
-
-    sv_setpviv(sv, iv);
-
-    GCC_DIAG_RESTORE_STMT;
-
-    SvSETMAGIC(sv);
-}
-
-#endif  /* NO_MATHOMS */
-
 #if defined(MULTIPLICITY)
 
 /* pTHX_ magic can't cope with varargs, so this is a no-context
@@ -10827,10 +10999,10 @@ Perl_sv_setpvf_mg_nocontext(SV *const sv, const char *const pat, ...)
 #endif
 
 /*
-=for apidoc sv_setpvf
-=for apidoc_item sv_setpvf_nocontext
+=for apidoc      sv_setpvf
 =for apidoc_item sv_setpvf_mg
 =for apidoc_item sv_setpvf_mg_nocontext
+=for apidoc_item sv_setpvf_nocontext
 
 These work like C<L</sv_catpvf>> but copy the text into the SV instead of
 appending it.
@@ -10946,9 +11118,9 @@ Perl_sv_catpvf_mg_nocontext(SV *const sv, const char *const pat, ...)
 
 /*
 =for apidoc sv_catpvf
-=for apidoc_item sv_catpvf_nocontext
 =for apidoc_item sv_catpvf_mg
 =for apidoc_item sv_catpvf_mg_nocontext
+=for apidoc_item sv_catpvf_nocontext
 
 These process their arguments like C<sprintf>, and append the formatted
 output to an SV.  As with C<sv_vcatpvfn>, argument reordering is not supporte
@@ -11972,6 +12144,7 @@ Perl_sv_vcatpvfn_flags(pTHX_ SV *const sv, const char *const pat, const STRLEN p
 #endif
     /* we never change this unless USE_LOCALE_NUMERIC */
     bool in_lc_numeric = FALSE;
+    SV *tmp_sv = NULL;
 
     PERL_ARGS_ASSERT_SV_VCATPVFN_FLAGS;
     PERL_UNUSED_ARG(maybe_tainted);
@@ -12077,6 +12250,8 @@ Perl_sv_vcatpvfn_flags(pTHX_ SV *const sv, const char *const pat, const STRLEN p
 
         char c;                       /* the actual format ('d', s' etc) */
 
+        bool escape_it   = FALSE;     /* if this is a string should we quote and escape it? */
+
 
         /* echo everything up to the next format specification */
         for (q = fmtstart; q < patend && *q != '%'; ++q)
@@ -12450,6 +12625,21 @@ Perl_sv_vcatpvfn_flags(pTHX_ SV *const sv, const char *const pat, const STRLEN p
             }
 
         string:
+            if (escape_it) {
+                U32 flags = PERL_PV_PRETTY_QUOTEDPREFIX;
+                if (is_utf8)
+                    flags |= PERL_PV_ESCAPE_UNI;
+
+                if (!tmp_sv) {
+                    /* "blah"... where blah might be made up
+                     * of characters like \x{1234} */
+                    tmp_sv = newSV(1 + (PERL_QUOTEDPREFIX_LEN * 8) + 1 + 3);
+                    sv_2mortal(tmp_sv);
+                }
+                pv_pretty(tmp_sv, eptr, elen, PERL_QUOTEDPREFIX_LEN,
+                            NULL, NULL, flags);
+                eptr = SvPV_const(tmp_sv, elen);
+            }
             if (has_precis && precis < elen)
                 elen = precis;
             break;
@@ -12458,7 +12648,34 @@ Perl_sv_vcatpvfn_flags(pTHX_ SV *const sv, const char *const pat, const STRLEN p
 
         case 'p':
 
-            /* %p extensions:
+            /* BEGIN NOTE
+             *
+             * We want to extend the C level sprintf format API with
+             * custom formats for specific types (eg SV*) and behavior.
+             * However some C compilers are "sprintf aware" and will
+             * throw compile time exceptions when an illegal sprintf is
+             * encountered, so we can't just add new format letters.
+             *
+             * However it turns out the length argument to the %p format
+             * is more or less useless (the size of a pointer does not
+             * change over time) and is not really used in the C level
+             * code. Accordingly we can map our special behavior to
+             * specific "length" options to the %p format. We hide these
+             * mappings behind defines anyway, so nobody needs to know
+             * that HEKf is actually %2p. This keeps the C compiler
+             * happy while allowing us to add new formats.
+             *
+             * Note the existing logic for which number is used for what
+             * is torturous. All negative values are used for SVf, and
+             * non-negative values have arbitrary meanings with no
+             * structure to them. This may change in the future.
+             *
+             * NEVER use the raw %p values directly. Always use the define
+             * as the underlying mapping may change in the future.
+             *
+             * END NOTE
+             *
+             * %p extensions:
              *
              * "%...p" is normally treated like "%...x", except that the
              * number to print is the SV's address (or a pointer address
@@ -12468,23 +12685,44 @@ Perl_sv_vcatpvfn_flags(pTHX_ SV *const sv, const char *const pat, const STRLEN p
              * extensions. These are currently:
              *
              * %-p       (SVf)  Like %s, but gets the string from an SV*
-             *                  arg rather than a char* arg.
+             *                  arg rather than a char* arg. Use C<SVfARG()>
+             *                  to set up the argument properly.
              *                  (This was previously %_).
              *
-             * %-<num>p         Ditto but like %.<num>s (i.e. num is max width)
+             * %-<num>p         Ditto but like %.<num>s (i.e. num is max
+             *                  width), there is no escaped and quoted version
+             *                  of this.
+             *
+             * %1p       (PVf_QUOTEDPREFIX). Like raw %s, but it is escaped
+             *                  and quoted.
+             *
+             * %5p       (SVf_QUOTEDPREFIX) Like SVf, but length restricted,
+             *                  escaped and quoted with pv_pretty. Intended
+             *                  for error messages.
              *
              * %2p       (HEKf) Like %s, but using the key string in a HEK
+             * %7p       (HEKf_QUOTEDPREFIX) ... but escaped and quoted.
              *
              * %3p       (HEKf256) Ditto but like %.256s
+             * %8p       (HEKf256_QUOTEDPREFIX) ... but escaped and quoted
              *
              * %d%lu%4p  (UTF8f) A utf8 string. Consumes 3 args:
              *                       (cBOOL(utf8), len, string_buf).
              *                   It's handled by the "case 'd'" branch
              *                   rather than here.
+             * %d%lu%9p  (UTF8f_QUOTEDPREFIX) .. but escaped and quoted.
              *
-             * %<num>p   where num is 1 or > 4: reserved for future
+             * %6p       (HvNAMEf) Like %s, but using the HvNAME() and HvNAMELEN()
+             * %10p      (HvNAMEf_QUOTEDPREFIX) ... but escaped and quoted
+             *
+             * %<num>p   where num is > 9: reserved for future
              *           extensions. Warns, but then is treated as a
              *           general %p (print hex address) format.
+             *
+             * NOTE: If you add a new magic %p value you will
+             * need to update F<t/porting/diag.t> to be aware of it
+             * on top of adding the various defines and etc. Do not
+             * forget to add it to F<pod/perlguts.pod> as well.
              */
 
             if (   args
@@ -12496,10 +12734,12 @@ Perl_sv_vcatpvfn_flags(pTHX_ SV *const sv, const char *const pat, const STRLEN p
                 && q[-2] != '*'
                 && q[-2] != '$'
             ) {
-                if (left) {                    /* %-p (SVf), %-NNNp */
-                    if (width) {
+                if (left || width == 5) {                /* %-p (SVf), %-NNNp, %5p */
+                    if (left && width) {
                         precis = width;
                         has_precis = TRUE;
+                    } else if (width == 5) {
+                        escape_it = TRUE;
                     }
                     argsv = MUTABLE_SV(va_arg(*args, void*));
                     eptr = SvPV_const(argsv, elen);
@@ -12508,7 +12748,9 @@ Perl_sv_vcatpvfn_flags(pTHX_ SV *const sv, const char *const pat, const STRLEN p
                     width = 0;
                     goto string;
                 }
-                else if (width == 2 || width == 3) {   /* HEKf, HEKf256 */
+                else if (width == 2 || width == 3 ||
+                         width == 7 || width == 8)
+                {        /* HEKf, HEKf256, HEKf_QUOTEDPREFIX, HEKf256_QUOTEDPREFIX */
                     HEK * const hek = va_arg(*args, HEK *);
                     eptr = HEK_KEY(hek);
                     elen = HEK_LEN(hek);
@@ -12518,10 +12760,31 @@ Perl_sv_vcatpvfn_flags(pTHX_ SV *const sv, const char *const pat, const STRLEN p
                         precis = 256;
                         has_precis = TRUE;
                     }
+                    if (width > 5)
+                        escape_it = TRUE;
+                    width = 0;
+                    goto string;
+                }
+                else if (width == 1) {
+                    eptr = va_arg(*args,char *);
+                    elen = strlen(eptr);
+                    escape_it = TRUE;
+                    width = 0;
+                    goto string;
+                }
+                else if (width == 6 || width == 10) {
+                    HV *hv = va_arg(*args, HV *);
+                    eptr = HvNAME(hv);
+                    elen = HvNAMELEN(hv);
+                    if (HvNAMEUTF8(hv))
+                        is_utf8 = TRUE;
+                    if (width == 10)
+                        escape_it = TRUE;
                     width = 0;
                     goto string;
                 }
                 else if (width) {
+                    /* note width=4 or width=9 is handled under %d */
                     Perl_ck_warner_d(aTHX_ packWARN(WARN_INTERNAL),
                          "internal %%<num>p might conflict with future printf extensions");
                 }
@@ -12562,7 +12825,8 @@ Perl_sv_vcatpvfn_flags(pTHX_ SV *const sv, const char *const pat, const STRLEN p
         case 'd':
             /* probably just a plain %d, but it might be the start of the
              * special UTF8f format, which usually looks something like
-             * "%d%lu%4p" (the lu may vary by platform)
+             * "%d%lu%4p" (the lu may vary by platform) or
+             * "%d%lu%9p" for an escaped version.
              */
             assert((UTF8f)[0] == 'd');
             assert((UTF8f)[1] == '%');
@@ -12571,10 +12835,15 @@ Perl_sv_vcatpvfn_flags(pTHX_ SV *const sv, const char *const pat, const STRLEN p
                  && q == fmtstart + 1 /* plain %d, not %....d */
                  && patend >= fmtstart + sizeof(UTF8f) - 1 /* long enough */
                  && *q == '%'
-                 && strnEQ(q + 1, (UTF8f) + 2, sizeof(UTF8f) - 3))
+                 && strnEQ(q + 1, (UTF8f) + 2, sizeof(UTF8f) - 5)
+                 && q[sizeof(UTF8f)-3] == 'p'
+                 && (q[sizeof(UTF8f)-4] == '4' ||
+                     q[sizeof(UTF8f)-4] == '9'))
             {
                 /* The argument has already gone through cBOOL, so the cast
                    is safe. */
+                if (q[sizeof(UTF8f)-4] == '9')
+                    escape_it = TRUE;
                 is_utf8 = (bool)va_arg(*args, int);
                 elen = va_arg(*args, UV);
                 /* if utf8 length is larger than 0x7ffff..., then it might
@@ -13527,21 +13796,6 @@ ptr_table_* functions.
 #endif
 
 
-/* Certain cases in Perl_ss_dup have been merged, by relying on the fact
-   that currently av_dup, gv_dup and hv_dup are the same as sv_dup.
-   If this changes, please unmerge ss_dup.
-   Likewise, sv_dup_inc_multiple() relies on this fact.  */
-#define sv_dup_inc_NN(s,t)     SvREFCNT_inc_NN(sv_dup_inc(s,t))
-#define av_dup(s,t)    MUTABLE_AV(sv_dup((const SV *)s,t))
-#define av_dup_inc(s,t)        MUTABLE_AV(sv_dup_inc((const SV *)s,t))
-#define hv_dup(s,t)    MUTABLE_HV(sv_dup((const SV *)s,t))
-#define hv_dup_inc(s,t)        MUTABLE_HV(sv_dup_inc((const SV *)s,t))
-#define cv_dup(s,t)    MUTABLE_CV(sv_dup((const SV *)s,t))
-#define cv_dup_inc(s,t)        MUTABLE_CV(sv_dup_inc((const SV *)s,t))
-#define io_dup(s,t)    MUTABLE_IO(sv_dup((const SV *)s,t))
-#define io_dup_inc(s,t)        MUTABLE_IO(sv_dup_inc((const SV *)s,t))
-#define gv_dup(s,t)    MUTABLE_GV(sv_dup((const SV *)s,t))
-#define gv_dup_inc(s,t)        MUTABLE_GV(sv_dup_inc((const SV *)s,t))
 #define SAVEPV(p)      ((p) ? savepv(p) : NULL)
 #define SAVEPVN(p,n)   ((p) ? savepvn(p,n) : NULL)
 
@@ -13931,6 +14185,7 @@ struct ptr_tbl_arena {
 };
 
 /*
+=for apidoc_section $embedding
 =for apidoc ptr_table_new
 
 Create a new pointer-mapping table
@@ -14183,6 +14438,86 @@ S_sv_dup_inc_multiple(pTHX_ SV *const *source, SV **dest,
     return dest;
 }
 
+/* duplicate the HvAUX of an HV */
+static void
+S_sv_dup_hvaux(pTHX_ const SV *const ssv, SV *dsv, CLONE_PARAMS *const param)
+{
+    PERL_ARGS_ASSERT_SV_DUP_HVAUX;
+
+    const struct xpvhv_aux * const saux = HvAUX(ssv);
+    struct xpvhv_aux * const daux = HvAUX(dsv);
+    /* This flag isn't copied.  */
+    SvFLAGS(dsv) |= SVphv_HasAUX;
+
+    if (saux->xhv_name_count) {
+        HEK ** const sname = saux->xhv_name_u.xhvnameu_names;
+        const I32 count = saux->xhv_name_count < 0
+            ? -saux->xhv_name_count
+            :  saux->xhv_name_count;
+        HEK **shekp = sname + count;
+        HEK **dhekp;
+        Newx(daux->xhv_name_u.xhvnameu_names, count, HEK *);
+        dhekp = daux->xhv_name_u.xhvnameu_names + count;
+        while (shekp-- > sname) {
+            dhekp--;
+            *dhekp = hek_dup(*shekp, param);
+        }
+    }
+    else {
+        daux->xhv_name_u.xhvnameu_name = hek_dup(saux->xhv_name_u.xhvnameu_name, param);
+    }
+    daux->xhv_name_count = saux->xhv_name_count;
+
+    daux->xhv_aux_flags = saux->xhv_aux_flags;
+#ifdef PERL_HASH_RANDOMIZE_KEYS
+    daux->xhv_rand = saux->xhv_rand;
+    daux->xhv_last_rand = saux->xhv_last_rand;
+#endif
+    daux->xhv_riter = saux->xhv_riter;
+    daux->xhv_eiter = saux->xhv_eiter ? he_dup(saux->xhv_eiter, FALSE, param) : 0;
+    /* backref array needs refcnt=2; see sv_add_backref */
+    daux->xhv_backreferences =
+        (param->flags & CLONEf_JOIN_IN)
+            /* when joining, we let the individual GVs and
+             * CVs add themselves to backref as
+             * needed. This avoids pulling in stuff
+             * that isn't required, and simplifies the
+             * case where stashes aren't cloned back
+             * if they already exist in the parent
+             * thread */
+        ? NULL
+        : saux->xhv_backreferences
+            ? (SvTYPE(saux->xhv_backreferences) == SVt_PVAV)
+                ? MUTABLE_AV(SvREFCNT_inc(
+                      sv_dup_inc((const SV *)
+                        saux->xhv_backreferences, param)))
+                : MUTABLE_AV(sv_dup((const SV *)
+                        saux->xhv_backreferences, param))
+            : 0;
+
+    daux->xhv_mro_meta = saux->xhv_mro_meta
+        ? mro_meta_dup(saux->xhv_mro_meta, param)
+        : 0;
+
+    /* Record stashes for possible cloning in Perl_clone(). */
+    if (HvNAME(ssv))
+        av_push(param->stashes, dsv);
+
+    if (HvSTASH_IS_CLASS(ssv)) {
+        daux->xhv_class_superclass    = hv_dup_inc(saux->xhv_class_superclass,    param);
+        daux->xhv_class_initfields_cv = cv_dup_inc(saux->xhv_class_initfields_cv, param);
+        daux->xhv_class_adjust_blocks = av_dup_inc(saux->xhv_class_adjust_blocks, param);
+        daux->xhv_class_fields        = padnamelist_dup_inc(saux->xhv_class_fields, param);
+        daux->xhv_class_next_fieldix  = saux->xhv_class_next_fieldix;
+        daux->xhv_class_param_map     = hv_dup_inc(saux->xhv_class_param_map,     param);
+
+        /* TODO: This does mean that we can't compile more `field` expressions
+         * in the cloned thread, but surely we're done with compiletime now..?
+         */
+        daux->xhv_class_suspended_initfields_compcv = NULL;
+    }
+}
+
 /* duplicate an SV of any type (including AV, HV etc) */
 
 static SV *
@@ -14192,7 +14527,7 @@ S_sv_dup_common(pTHX_ const SV *const ssv, CLONE_PARAMS *const param)
 
     PERL_ARGS_ASSERT_SV_DUP_COMMON;
 
-    if (SvTYPE(ssv) == (svtype)SVTYPEMASK) {
+    if (SvIS_FREED(ssv)) {
 #ifdef DEBUG_LEAKING_SCALARS_ABORT
         abort();
 #endif
@@ -14302,12 +14637,12 @@ S_sv_dup_common(pTHX_ const SV *const ssv, CLONE_PARAMS *const param)
 
             switch (sv_type) {
             default:
-                Perl_croak(aTHX_ "Bizarre SvTYPE [%" IVdf "]", (IV)SvTYPE(ssv));
+                Perl_croak(param->proto_perl, "Bizarre SvTYPE [%" IVdf "]", (IV)SvTYPE(ssv));
                 NOT_REACHED; /* NOTREACHED */
                 break;
 
             case SVt_PVHV:
-                if (SvOOK(ssv)) {
+                if (HvHasAUX(ssv)) {
                     sv_type_details = &fake_hv_with_aux;
 #ifdef PURIFY
                     new_body = new_NOARENA(sv_type_details);
@@ -14317,6 +14652,7 @@ S_sv_dup_common(pTHX_ const SV *const ssv, CLONE_PARAMS *const param)
                     goto have_body;
                 }
                 /* FALLTHROUGH */
+            case SVt_PVOBJ:
             case SVt_PVGV:
             case SVt_PVIO:
             case SVt_PVFM:
@@ -14355,7 +14691,7 @@ S_sv_dup_common(pTHX_ const SV *const ssv, CLONE_PARAMS *const param)
                  sv_type_details->body_size + sv_type_details->offset, char);
 #endif
 
-            if (sv_type != SVt_PVAV && sv_type != SVt_PVHV
+            if (sv_type != SVt_PVAV && sv_type != SVt_PVHV && sv_type != SVt_PVOBJ
                 && !isGV_with_GP(dsv)
                 && !isREGEXP(dsv)
                 && !(sv_type == SVt_PVIO && !(IoFLAGS(dsv) & IOf_FAKE_DIRP)))
@@ -14491,70 +14827,8 @@ S_sv_dup_common(pTHX_ const SV *const ssv, CLONE_PARAMS *const param)
                             ? he_dup(source, FALSE, param) : 0;
                         ++i;
                     }
-                    if (SvOOK(ssv)) {
-                        const struct xpvhv_aux * const saux = HvAUX(ssv);
-                        struct xpvhv_aux * const daux = HvAUX(dsv);
-                        /* This flag isn't copied.  */
-                        SvOOK_on(dsv);
-
-                        if (saux->xhv_name_count) {
-                            HEK ** const sname = saux->xhv_name_u.xhvnameu_names;
-                            const I32 count
-                             = saux->xhv_name_count < 0
-                                ? -saux->xhv_name_count
-                                :  saux->xhv_name_count;
-                            HEK **shekp = sname + count;
-                            HEK **dhekp;
-                            Newx(daux->xhv_name_u.xhvnameu_names, count, HEK *);
-                            dhekp = daux->xhv_name_u.xhvnameu_names + count;
-                            while (shekp-- > sname) {
-                                dhekp--;
-                                *dhekp = hek_dup(*shekp, param);
-                            }
-                        }
-                        else {
-                            daux->xhv_name_u.xhvnameu_name
-                                = hek_dup(saux->xhv_name_u.xhvnameu_name,
-                                          param);
-                        }
-                        daux->xhv_name_count = saux->xhv_name_count;
-
-                        daux->xhv_aux_flags = saux->xhv_aux_flags;
-#ifdef PERL_HASH_RANDOMIZE_KEYS
-                        daux->xhv_rand = saux->xhv_rand;
-                        daux->xhv_last_rand = saux->xhv_last_rand;
-#endif
-                        daux->xhv_riter = saux->xhv_riter;
-                        daux->xhv_eiter = saux->xhv_eiter
-                            ? he_dup(saux->xhv_eiter, FALSE, param) : 0;
-                        /* backref array needs refcnt=2; see sv_add_backref */
-                        daux->xhv_backreferences =
-                            (param->flags & CLONEf_JOIN_IN)
-                                /* when joining, we let the individual GVs and
-                                 * CVs add themselves to backref as
-                                 * needed. This avoids pulling in stuff
-                                 * that isn't required, and simplifies the
-                                 * case where stashes aren't cloned back
-                                 * if they already exist in the parent
-                                 * thread */
-                            ? NULL
-                            : saux->xhv_backreferences
-                                ? (SvTYPE(saux->xhv_backreferences) == SVt_PVAV)
-                                    ? MUTABLE_AV(SvREFCNT_inc(
-                                          sv_dup_inc((const SV *)
-                                            saux->xhv_backreferences, param)))
-                                    : MUTABLE_AV(sv_dup((const SV *)
-                                            saux->xhv_backreferences, param))
-                                : 0;
-
-                        daux->xhv_mro_meta = saux->xhv_mro_meta
-                            ? mro_meta_dup(saux->xhv_mro_meta, param)
-                            : 0;
-
-                        /* Record stashes for possible cloning in Perl_clone(). */
-                        if (HvNAME(ssv))
-                            av_push(param->stashes, dsv);
-                    }
+                    if (HvHasAUX(ssv))
+                        sv_dup_hvaux(ssv, dsv, param);
                 }
                 else
                     HvARRAY(MUTABLE_HV(dsv)) = NULL;
@@ -14578,6 +14852,9 @@ S_sv_dup_common(pTHX_ const SV *const ssv, CLONE_PARAMS *const param)
                 } else if (CvCONST(dsv)) {
                     CvXSUBANY(dsv).any_ptr =
                         sv_dup_inc((const SV *)CvXSUBANY(dsv).any_ptr, param);
+                } else if (CvREFCOUNTED_ANYSV(dsv)) {
+                    CvXSUBANY(dsv).any_sv =
+                        sv_dup_inc((const SV *)CvXSUBANY(dsv).any_sv, param);
                 }
                 assert(!CvSLABBED(dsv));
                 if (CvDYNFILE(dsv)) CvFILE(dsv) = SAVEPV(CvFILE(dsv));
@@ -14600,7 +14877,7 @@ S_sv_dup_common(pTHX_ const SV *const ssv, CLONE_PARAMS *const param)
                         padlist = padlist_dup(padlist, param);
                     CvPADLIST_set(dsv, padlist);
                 } else
-/* unthreaded perl can't sv_dup so we dont support unthreaded's CvHSCXT */
+/* unthreaded perl can't sv_dup so we don't support unthreaded's CvHSCXT */
                     PoisonPADLIST(dsv);
 
                 CvOUTSIDE(dsv) =
@@ -14608,6 +14885,16 @@ S_sv_dup_common(pTHX_ const SV *const ssv, CLONE_PARAMS *const param)
                     ? cv_dup(    CvOUTSIDE(dsv), param)
                     : cv_dup_inc(CvOUTSIDE(dsv), param);
                 break;
+            case SVt_PVOBJ:
+                {
+                    Size_t fieldcount = ObjectMAXFIELD(ssv) + 1;
+
+                    Newx(ObjectFIELDS(dsv), fieldcount, SV *);
+                    ObjectMAXFIELD(dsv) = fieldcount - 1;
+
+                    sv_dup_inc_multiple(ObjectFIELDS(ssv), ObjectFIELDS(dsv), fieldcount, param);
+                }
+                break;
             }
         }
     }
@@ -14829,7 +15116,7 @@ Perl_si_dup(pTHX_ PERL_SI *si, CLONE_PARAMS* param)
 #define pv_dup(p)      SAVEPV(p)
 #define svp_dup_inc(p,pp)      any_dup(p,pp)
 
-/* map any object to the new equivent - either something in the
+/* map any object to the new equivalent - either something in the
  * ptr table, or something in the interpreter structure
  */
 
@@ -14877,6 +15164,7 @@ Perl_ss_dup(pTHX_ PerlInterpreter *proto_perl, CLONE_PARAMS* param)
     const GV *gv;
     const AV *av;
     const HV *hv;
+    char *pv; /* no const deliberately */
     void* ptr;
     int intval;
     long longval;
@@ -14937,6 +15225,18 @@ Perl_ss_dup(pTHX_ PerlInterpreter *proto_perl, CLONE_PARAMS* param)
                 SvREFCNT_inc_simple_void((SV *)TOPPTR(nss,ix));
             ptr = POPPTR(ss,ix);
             TOPPTR(nss,ix) = svp_dup_inc((SV**)ptr, proto_perl);/* XXXXX */
+            /* this feels very strange, we have a **SV from one thread,
+             * we copy the SV, but dont change the **SV. But in this thread
+             * the target of the **SV could be something from the *other* thread.
+             * So how can this possibly work correctly? */
+            break;
+        case SAVEt_RCPV:
+            pv = (char *)POPPTR(ss,ix);
+            TOPPTR(nss,ix) = rcpv_copy(pv);
+            ptr = POPPTR(ss,ix);
+            (void)rcpv_copy(*((char **)ptr));
+            TOPPTR(nss,ix) = ptr;
+            /* XXXXX: see comment above. */
             break;
         case SAVEt_GVSLOT:             /* any slot in GV */
             sv = (const SV *)POPPTR(ss,ix);
@@ -15066,6 +15366,10 @@ Perl_ss_dup(pTHX_ PerlInterpreter *proto_perl, CLONE_PARAMS* param)
             c = (char*)POPPTR(ss,ix);
             TOPPTR(nss,ix) = pv_dup_inc(c);
             break;
+        case SAVEt_FREERCPV:
+            c = (char *)POPPTR(ss,ix);
+            TOPPTR(nss,ix) = rcpv_copy(c);
+            break;
         case SAVEt_STACK_POS:          /* Position on Perl stack */
             i = POPINT(ss,ix);
             TOPINT(nss,ix) = i;
@@ -15129,9 +15433,11 @@ Perl_ss_dup(pTHX_ PerlInterpreter *proto_perl, CLONE_PARAMS* param)
             sv = (const SV *)POPPTR(ss,ix);
             TOPPTR(nss,ix) = sv_dup(sv, param);
             break;
+        case SAVEt_CURCOP_WARNINGS:
+            /* FALLTHROUGH */
         case SAVEt_COMPILE_WARNINGS:
             ptr = POPPTR(ss,ix);
-            TOPPTR(nss,ix) = DUP_WARNINGS((STRLEN*)ptr);
+            TOPPTR(nss,ix) = DUP_WARNINGS((char*)ptr);
             break;
         case SAVEt_PARSER:
             ptr = POPPTR(ss,ix);
@@ -15278,6 +15584,7 @@ perl_clone_using(PerlInterpreter *proto_perl, UV flags,
 
     /* for each stash, determine whether its objects should be cloned */
     S_visit(proto_perl, do_mark_cloneable_stash, SVt_PVHV, SVTYPEMASK);
+    my_perl->Iphase = PERL_PHASE_CONSTRUCT;
     PERL_SET_THX(my_perl);
 
 #ifdef DEBUGGING
@@ -15293,6 +15600,7 @@ perl_clone_using(PerlInterpreter *proto_perl, UV flags,
     PL_savestack_max = -1;
     PL_sig_pending = 0;
     PL_parser = NULL;
+    PL_eval_begin_nest_depth = proto_perl->Ieval_begin_nest_depth;
     Zero(&PL_debug_pad, 1, struct perl_debug_pad);
     Zero(&PL_padname_undef, 1, PADNAME);
     Zero(&PL_padname_const, 1, PADNAME);
@@ -15362,7 +15670,7 @@ perl_clone_using(PerlInterpreter *proto_perl, UV flags,
     PL_minus_c         = proto_perl->Iminus_c;
 
     PL_localpatches    = proto_perl->Ilocalpatches;
-    PL_splitstr                = proto_perl->Isplitstr;
+    PL_splitstr                = SAVEPV(proto_perl->Isplitstr);
     PL_minus_n         = proto_perl->Iminus_n;
     PL_minus_p         = proto_perl->Iminus_p;
     PL_minus_l         = proto_perl->Iminus_l;
@@ -15427,7 +15735,6 @@ perl_clone_using(PerlInterpreter *proto_perl, UV flags,
     PL_nomemok         = proto_perl->Inomemok;
     PL_an              = proto_perl->Ian;
     PL_evalseq         = proto_perl->Ievalseq;
-    PL_origenviron     = proto_perl->Iorigenviron;     /* XXX not quite right */
     PL_origalen                = proto_perl->Iorigalen;
 
     PL_sighandlerp     = proto_perl->Isighandlerp;
@@ -15439,29 +15746,6 @@ perl_clone_using(PerlInterpreter *proto_perl, UV flags,
     PL_subline         = proto_perl->Isubline;
 
     PL_cv_has_eval     = proto_perl->Icv_has_eval;
-
-#ifdef USE_LOCALE_COLLATE
-    PL_collation_ix    = proto_perl->Icollation_ix;
-    PL_collation_standard = proto_perl->Icollation_standard;
-    PL_collxfrm_base   = proto_perl->Icollxfrm_base;
-    PL_collxfrm_mult   = proto_perl->Icollxfrm_mult;
-    PL_strxfrm_max_cp   = proto_perl->Istrxfrm_max_cp;
-#endif /* USE_LOCALE_COLLATE */
-
-#ifdef USE_LOCALE_NUMERIC
-    PL_numeric_standard        = proto_perl->Inumeric_standard;
-    PL_numeric_underlying      = proto_perl->Inumeric_underlying;
-    PL_numeric_underlying_is_standard  = proto_perl->Inumeric_underlying_is_standard;
-#endif /* !USE_LOCALE_NUMERIC */
-
-    /* Did the locale setup indicate UTF-8? */
-    PL_utf8locale      = proto_perl->Iutf8locale;
-    PL_in_utf8_CTYPE_locale = proto_perl->Iin_utf8_CTYPE_locale;
-    PL_in_utf8_COLLATE_locale = proto_perl->Iin_utf8_COLLATE_locale;
-    my_strlcpy(PL_locale_utf8ness, proto_perl->Ilocale_utf8ness, sizeof(PL_locale_utf8ness));
-#if defined(USE_ITHREADS) && ! defined(USE_THREAD_SAFE_LOCALE)
-    PL_lc_numeric_mutex_depth = 0;
-#endif
     /* Unicode features (see perlrun/-C) */
     PL_unicode         = proto_perl->Iunicode;
 
@@ -15490,6 +15774,8 @@ perl_clone_using(PerlInterpreter *proto_perl, UV flags,
 
     PL_srand_called    = proto_perl->Isrand_called;
     Copy(&(proto_perl->Irandom_state), &PL_random_state, 1, PL_RANDOM_STATE_TYPE);
+    PL_srand_override   = proto_perl->Isrand_override;
+    PL_srand_override_next = proto_perl->Isrand_override_next;
 
     if (flags & CLONEf_COPY_STACKS) {
         /* next allocation will be PL_tmps_stack[PL_tmps_ix+1] */
@@ -15586,9 +15872,7 @@ perl_clone_using(PerlInterpreter *proto_perl, UV flags,
 
     Zero(PL_sv_consts, SV_CONSTS_COUNT, SV*);
 
-    /* This PV will be free'd special way so must set it same way op.c does */
-    PL_compiling.cop_file    = savesharedpv(PL_compiling.cop_file);
-    ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_file, PL_compiling.cop_file);
+    PL_compiling.cop_file    = rcpv_copy(proto_perl->Icompiling.cop_file);
 
     ptr_table_store(PL_ptr_table, &proto_perl->Icompiling, &PL_compiling);
     PL_compiling.cop_warnings = DUP_WARNINGS(PL_compiling.cop_warnings);
@@ -15621,6 +15905,9 @@ perl_clone_using(PerlInterpreter *proto_perl, UV flags,
     PL_diehook         = sv_dup_inc(proto_perl->Idiehook, param);
     PL_warnhook                = sv_dup_inc(proto_perl->Iwarnhook, param);
 
+    PL_hook__require__before = sv_dup_inc(proto_perl->Ihook__require__before, param);
+    PL_hook__require__after  = sv_dup_inc(proto_perl->Ihook__require__after, param);
+
     /* switches */
     PL_patchlevel      = sv_dup_inc(proto_perl->Ipatchlevel, param);
     PL_inplace         = SAVEPV(proto_perl->Iinplace);
@@ -15762,30 +16049,60 @@ perl_clone_using(PerlInterpreter *proto_perl, UV flags,
 
     PL_subname         = sv_dup_inc(proto_perl->Isubname, param);
 
-#if   defined(USE_POSIX_2008_LOCALE)      \
- &&   defined(USE_THREAD_SAFE_LOCALE)     \
- && ! defined(HAS_QUERYLOCALE)
+#ifdef USE_PL_CURLOCALES
     for (i = 0; i < (int) C_ARRAY_LENGTH(PL_curlocales); i++) {
-        PL_curlocales[i] = savepv("."); /* An illegal value */
+        PL_curlocales[i] = SAVEPV("C");
     }
 #endif
+#ifdef USE_PL_CUR_LC_ALL
+    PL_cur_LC_ALL = SAVEPV("C");
+#endif
 #ifdef USE_LOCALE_CTYPE
+    Copy(PL_fold, PL_fold_locale, 256, U8);
+
     /* Should we warn if uses locale? */
+    PL_ctype_name      = SAVEPV("C");
     PL_warn_locale      = sv_dup_inc(proto_perl->Iwarn_locale, param);
+    PL_in_utf8_CTYPE_locale   = false;
+    PL_in_utf8_turkic_locale  = false;
 #endif
 
+    /* Did the locale setup indicate UTF-8? */
+    PL_utf8locale      = false;
+
 #ifdef USE_LOCALE_COLLATE
-    PL_collation_name  = SAVEPV(proto_perl->Icollation_name);
+    PL_in_utf8_COLLATE_locale = false;
+    PL_collation_name  = SAVEPV("C");
+    PL_collation_ix    = proto_perl->Icollation_ix;
+    PL_collation_standard = true;
+    PL_collxfrm_base   = 0;
+    PL_collxfrm_mult   = 0;
+    PL_strxfrm_max_cp   = 0;
+    PL_strxfrm_is_behaved = proto_perl->Istrxfrm_is_behaved;
+    PL_strxfrm_NUL_replacement = '\0';
 #endif /* USE_LOCALE_COLLATE */
 
-#ifdef USE_LOCALE_NUMERIC
-    PL_numeric_name    = SAVEPV(proto_perl->Inumeric_name);
-    PL_numeric_radix_sv        = sv_dup_inc(proto_perl->Inumeric_radix_sv, param);
+#ifdef USE_LOCALE_THREADS
+    assert(PL_locale_mutex_depth <= 0);
+    PL_locale_mutex_depth = 0;
+#endif
 
-#  if defined(HAS_POSIX_2008_LOCALE)
+#ifdef USE_LOCALE_NUMERIC
+    PL_numeric_name    = SAVEPV("C");
+    PL_numeric_radix_sv        = newSVpvs(".");
+    PL_underlying_radix_sv = newSVpvs(".");
+    PL_numeric_standard        = true;
+    PL_numeric_underlying = true;
+    PL_numeric_underlying_is_standard = true;
+
+#  if defined(USE_POSIX_2008_LOCALE)
     PL_underlying_numeric_obj = NULL;
 #  endif
 #endif /* !USE_LOCALE_NUMERIC */
+#if defined(USE_POSIX_2008_LOCALE)
+    PL_scratch_locale_obj = NULL;
+    PL_cur_locale_obj = PL_C_locale_obj;
+#endif
 
 #ifdef HAS_MBRLEN
     PL_mbrlen_ps = proto_perl->Imbrlen_ps;
@@ -15803,6 +16120,9 @@ perl_clone_using(PerlInterpreter *proto_perl, UV flags,
     PL_setlocale_buf = NULL;
     PL_setlocale_bufsize = 0;
 
+    PL_stdize_locale_buf = NULL;
+    PL_stdize_locale_bufsize = 0;
+
     /* Unicode inversion lists */
 
     PL_AboveLatin1            = sv_dup_inc(proto_perl->IAboveLatin1, param);
@@ -15826,12 +16146,12 @@ perl_clone_using(PerlInterpreter *proto_perl, UV flags,
     PL_WB_invlist             = sv_dup_inc(proto_perl->IWB_invlist, param);
     for (i = 0; i < POSIX_CC_COUNT; i++) {
         PL_XPosix_ptrs[i]     = sv_dup_inc(proto_perl->IXPosix_ptrs[i], param);
-        if (i != _CC_CASED && i != _CC_VERTSPACE) {
+        if (i != CC_CASED_ && i != CC_VERTSPACE_) {
             PL_Posix_ptrs[i]  = sv_dup_inc(proto_perl->IPosix_ptrs[i], param);
         }
     }
-    PL_Posix_ptrs[_CC_CASED]  = PL_Posix_ptrs[_CC_ALPHA];
-    PL_Posix_ptrs[_CC_VERTSPACE] = NULL;
+    PL_Posix_ptrs[CC_CASED_]  = PL_Posix_ptrs[CC_ALPHA_];
+    PL_Posix_ptrs[CC_VERTSPACE_] = NULL;
 
     PL_utf8_toupper           = sv_dup_inc(proto_perl->Iutf8_toupper, param);
     PL_utf8_totitle           = sv_dup_inc(proto_perl->Iutf8_totitle, param);
@@ -16322,7 +16642,7 @@ S_find_hash_subscript(pTHX_ const HV *const hv, const SV *const val)
         HE *entry;
         for (entry = array[i]; entry; entry = HeNEXT(entry)) {
             if (HeVAL(entry) == val)
-                return sv_2mortal(newSVhek(HeKEY_hek(entry)));
+                return newSVhek_mortal(HeKEY_hek(entry));
         }
     }
     return NULL;
@@ -16463,8 +16783,19 @@ S_find_uninit_var(pTHX_ const OP *const obase, const SV *const uninit_sv,
     switch (obase->op_type) {
 
     case OP_UNDEF:
-        /* undef should care if its args are undef - any warnings
+        /* the optimizer rewrites '$x = undef' to 'undef $x' for lexical
+         * variables, which can occur as the source of warnings:
+         *   ($x = undef) =~ s/a/b/;
+         * The OPpUNDEF_KEEP_PV flag indicates that this used to be an
+         * assignment op.
+         * Otherwise undef should not care if its args are undef - any warnings
          * will be from tied/magic vars */
+        if (
+            (obase->op_private & (OPpTARGET_MY | OPpUNDEF_KEEP_PV)) == (OPpTARGET_MY | OPpUNDEF_KEEP_PV)
+            && (!match || PAD_SVl(obase->op_targ) == uninit_sv)
+        ) {
+            return varname(NULL, '$', obase->op_targ, NULL, 0, FUV_SUBSCRIPT_NONE);
+        }
         break;
 
     case OP_RV2AV:
@@ -16543,6 +16874,12 @@ S_find_uninit_var(pTHX_ const OP *const obase, const SV *const uninit_sv,
         return varname(NULL, '$', obase->op_targ,
                                     NULL, 0, FUV_SUBSCRIPT_NONE);
 
+    case OP_PADSV_STORE:
+        if (match && PAD_SVl(obase->op_targ) != uninit_sv)
+            goto do_op;
+        return varname(NULL, '$', obase->op_targ,
+                                    NULL, 0, FUV_SUBSCRIPT_NONE);
+
     case OP_GVSV:
         gv = cGVOPx_gv(obase);
         if (!gv || (match && GvSV(gv) != uninit_sv) || !GvSTASH(gv))
@@ -16561,6 +16898,20 @@ S_find_uninit_var(pTHX_ const OP *const obase, const SV *const uninit_sv,
         }
         return varname(NULL, '$', obase->op_targ,
                        NULL, (I8)obase->op_private, FUV_SUBSCRIPT_ARRAY);
+
+    case OP_AELEMFASTLEX_STORE:
+        if (match) {
+            SV **svp;
+            AV *av = MUTABLE_AV(PAD_SV(obase->op_targ));
+            if (!av || SvRMAGICAL(av))
+                goto do_op;
+            svp = av_fetch(av, (I8)obase->op_private, FALSE);
+            if (!svp || *svp != uninit_sv)
+                goto do_op;
+        }
+        return varname(NULL, '$', obase->op_targ,
+                       NULL, (I8)obase->op_private, FUV_SUBSCRIPT_ARRAY);
+
     case OP_AELEMFAST:
         {
             gv = cGVOPx_gv(obase);
@@ -17142,6 +17493,7 @@ S_find_uninit_var(pTHX_ const OP *const obase, const SV *const uninit_sv,
 
 
 /*
+=for apidoc_section $warning
 =for apidoc report_uninit
 
 Print appropriate "Use of uninitialized variable" warning.
index 7b21e71..2cd4ea2 100644 (file)
@@ -38,9 +38,11 @@ The types are:
     SVt_PVCV
     SVt_PVFM
     SVt_PVIO
+    SVt_PVOBJ
 
 These are most easily explained from the bottom up.
 
+C<SVt_PVOBJ> is for object instances of the new `use feature 'class'` kind.
 C<SVt_PVIO> is for I/O objects, C<SVt_PVFM> for formats, C<SVt_PVCV> for
 subroutines, C<SVt_PVHV> for hashes and C<SVt_PVAV> for arrays.
 
@@ -67,10 +69,13 @@ PVMG, we save memory by allocating smaller structs when possible.  All the
 other types are just simpler forms of C<SVt_PVMG>, with fewer internal fields.
 C<SVt_NULL> can only hold undef.  C<SVt_IV> can hold undef, an integer, or a
 reference.  (C<SVt_RV> is an alias for C<SVt_IV>, which exists for backward
-compatibility.)  C<SVt_NV> can hold any of those or a double.  C<SVt_PV> can only
-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.
+compatibility.)  C<SVt_NV> can hold undef or a double. (In builds that support
+headless NVs, these could also hold a reference via a suitable offset, in the
+same way that SVt_IV does, but this is not currently supported and seems to
+be a rare use case.) C<SVt_PV> can hold C<undef>, a string, or a reference.
+C<SVt_PVIV> is a superset of C<SVt_PV> and C<SVt_IV>. C<SVt_PVNV> is a
+superset of C<SVt_PV> and C<SVt_NV>. C<SVt_PVMG> can hold anything C<SVt_PVNV>
+can hold, but it may also be blessed or magical.
 
 =for apidoc AmnU||SVt_NULL
 Type flag for scalars.  See L</svtype>.
@@ -120,6 +125,9 @@ Type flag for formats.  See L</svtype>.
 =for apidoc AmnU||SVt_PVIO
 Type flag for I/O objects.  See L</svtype>.
 
+=for apidoc AmnUx||SVt_PVOBJ
+Type flag for object instances.  See L</svtype>.
+
 =cut
 
   These are ordered so that the simpler types have a lower value; SvUPGRADE
@@ -149,7 +157,8 @@ typedef enum {
         SVt_PVCV,      /* 13 */
         SVt_PVFM,      /* 14 */
         SVt_PVIO,      /* 15 */
-                        /* 16-31: Unused, though one should be reserved for a
+        SVt_PVOBJ,      /* 16 */
+                        /* 17-31: Unused, though one should be reserved for a
                          * freed sv, if the other 3 bits below the flags ones
                          * get allocated */
         SVt_LAST       /* keep last in enum. used to size arrays */
@@ -158,7 +167,7 @@ typedef enum {
 /* *** any alterations to the SV types above need to be reflected in
  * SVt_MASK and the various PL_valid_types_* tables.  As of this writing those
  * tables are in perl.h.  There are also two affected names tables in dump.c,
- * one in B.xs, and 'bodies_by_type[]' in sv.c.
+ * one in B.xs, and 'bodies_by_type[]' in sv_inline.h.
  *
  * The bits that match 0xe0 are CURRENTLY UNUSED
  * The bits above that are for flags, like SVf_IOK */
@@ -273,6 +282,11 @@ struct invlist {
     _SV_HEAD_UNION;
 };
 
+struct object {
+    _SV_HEAD(XPVOBJ*);          /* pointer to xobject body */
+    _SV_HEAD_UNION;
+};
+
 #undef _SV_HEAD
 #undef _SV_HEAD_UNION          /* ensure no pollution */
 
@@ -283,14 +297,14 @@ struct invlist {
 Returns the value of the object's reference count. Exposed
 to perl code via Internals::SvREFCNT().
 
-=for apidoc SvREFCNT_inc
-=for apidoc_item SvREFCNT_inc_NN
-=for apidoc_item SvREFCNT_inc_void
-=for apidoc_item |void|SvREFCNT_inc_void_NN|SV* sv
-=for apidoc_item |SV*|SvREFCNT_inc_simple|SV* sv
-=for apidoc_item |SV*|SvREFCNT_inc_simple_NN|SV* sv
+=for apidoc            SvREFCNT_inc
+=for apidoc_item       SvREFCNT_inc_NN
+=for apidoc_item |SV* |SvREFCNT_inc_simple|SV* sv
+=for apidoc_item |SV* |SvREFCNT_inc_simple_NN|SV* sv
 =for apidoc_item |void|SvREFCNT_inc_simple_void|SV* sv
 =for apidoc_item |void|SvREFCNT_inc_simple_void_NN|SV* sv
+=for apidoc_item       SvREFCNT_inc_void
+=for apidoc_item |void|SvREFCNT_inc_void_NN|SV* sv
 
 These all increment the reference count of the given SV.
 The ones without C<void> in their names return the SV.
@@ -322,13 +336,30 @@ effects and you don't need the return value.
 C<SvREFCNT_inc_simple_void_NN> can only be used with expressions without side
 effects, you don't need the return value, and you know C<sv> is not C<NULL>.
 
-=for apidoc SvREFCNT_dec
+=for apidoc      SvREFCNT_dec
+=for apidoc_item SvREFCNT_dec_set_NULL
+=for apidoc_item SvREFCNT_dec_ret_NULL
 =for apidoc_item SvREFCNT_dec_NN
 
 These decrement the reference count of the given SV.
 
 C<SvREFCNT_dec_NN> may only be used when C<sv> is known to not be C<NULL>.
 
+The function C<SvREFCNT_dec_ret_NULL()> is identical to the
+C<SvREFCNT_dec()> except it returns a NULL C<SV *>.  It is used by
+C<SvREFCNT_dec_set_NULL()> which is a macro which will, when passed a
+non-NULL argument, decrement the reference count of its argument and
+then set it to NULL. You can replace code of the following form:
+
+    if (sv) {
+       SvREFCNT_dec_NN(sv);
+       sv = NULL;
+    }
+
+with
+
+    SvREFCNT_dec_set_NULL(sv);
+
 =for apidoc Am|svtype|SvTYPE|SV* sv
 Returns the type of the SV.  See C<L</svtype>>.
 
@@ -349,12 +380,22 @@ perform the upgrade if necessary.  See C<L</svtype>>.
 #define SvREFCNT_inc_void(sv)          Perl_SvREFCNT_inc_void(MUTABLE_SV(sv))
 
 /* These guys don't need the curly blocks */
-#define SvREFCNT_inc_simple_void(sv)   STMT_START { if (sv) SvREFCNT(sv)++; } STMT_END
+#define SvREFCNT_inc_simple_void(sv)                                   \
+        STMT_START {                                                    \
+            SV * sv_ = MUTABLE_SV(sv);                                  \
+            if (sv_)                                                    \
+                SvREFCNT(sv_)++;                                        \
+        } STMT_END
+
 #define SvREFCNT_inc_simple_NN(sv)     (++(SvREFCNT(sv)),MUTABLE_SV(sv))
 #define SvREFCNT_inc_void_NN(sv)       (void)(++SvREFCNT(MUTABLE_SV(sv)))
 #define SvREFCNT_inc_simple_void_NN(sv)        (void)(++SvREFCNT(MUTABLE_SV(sv)))
 
 #define SvREFCNT_dec(sv)       Perl_SvREFCNT_dec(aTHX_ MUTABLE_SV(sv))
+#define SvREFCNT_dec_set_NULL(sv)                               \
+    STMT_START {                                                \
+        sv = Perl_SvREFCNT_dec_ret_NULL(aTHX_ MUTABLE_SV(sv));  \
+    } STMT_END
 #define SvREFCNT_dec_NN(sv)    Perl_SvREFCNT_dec_NN(aTHX_ MUTABLE_SV(sv))
 
 #define SVTYPEMASK     0xff
@@ -416,9 +457,8 @@ perform the upgrade if necessary.  See C<L</svtype>>.
                                            including PVLV-as-regex. See
                                            isREGEXP().
                                        */
-#define SVf_OOK                0x02000000  /* has valid offset value. For a PVHV this
-                                       means that a hv_aux struct is present
-                                       after the main array */
+#define SVf_OOK                0x02000000  /* has valid offset value */
+#define SVphv_HasAUX    SVf_OOK     /* PVHV has an additional hv_aux struct */
 #define SVf_BREAK      0x04000000  /* refcnt is artificially low - used by
                                        SVs in final arena cleanup.
                                        Set in S_regtry on PL_reg_curpm, so that
@@ -662,6 +702,18 @@ struct xpvio {
 #define IOf_FAKE_DIRP  64      /* xio_dirp is fake (source filters kludge)
                                    Also, when this is set, SvPVX() is valid */
 
+struct xobject {
+    HV*         xmg_stash;
+    union _xmgu xmg_u;
+    SSize_t     xobject_maxfield;
+    SSize_t     xobject_iter_sv_at; /* this is only used by Perl_sv_clear() */
+    SV**        xobject_fields;
+};
+
+#define ObjectMAXFIELD(inst)  ((XPVOBJ *)SvANY(inst))->xobject_maxfield
+#define ObjectITERSVAT(inst)  ((XPVOBJ *)SvANY(inst))->xobject_iter_sv_at
+#define ObjectFIELDS(inst)    ((XPVOBJ *)SvANY(inst))->xobject_fields
+
 /* The following macros define implementation-independent predicates on SVs. */
 
 /*
@@ -746,6 +798,55 @@ Unsets the PV status of an SV.
 Tells an SV that it is a string and disables all other C<OK> bits.
 Will also turn off the UTF-8 status.
 
+=for apidoc Am|U32|SvBoolFlagsOK|SV* sv
+Returns a bool indicating whether the SV has the right flags set such
+that it is safe to call C<BOOL_INTERNALS_sv_isbool()> or
+C<BOOL_INTERNALS_sv_isbool_true()> or
+C<BOOL_INTERNALS_sv_isbool_false()>. Currently equivalent to
+C<SvIandPOK(sv)> or C<SvIOK(sv) && SvPOK(sv)>. Serialization may want to
+unroll this check. If so you are strongly recommended to add code like
+C<assert(SvBoolFlagsOK(sv));> B<before> calling using any of the
+BOOL_INTERNALS macros.
+
+=for apidoc Am|U32|SvIandPOK|SV* sv
+Returns a bool indicating whether the SV is both C<SvPOK()> and
+C<SvIOK()> at the same time. Equivalent to C<SvIOK(sv) && SvPOK(sv)> but
+more efficient.
+
+=for apidoc Am|void|SvIandPOK_on|SV* sv
+Tells an SV that is a string and a number in one operation. Equivalent
+to C<SvIOK_on(sv); SvPOK_on(sv);> but more efficient.
+
+=for apidoc Am|void|SvIandPOK_off|SV* sv
+Unsets the PV and IV status of an SV in one operation. Equivalent to
+C<SvIOK_off(sv); SvPK_off(v);> but more efficient.
+
+=for apidoc Am|bool|BOOL_INTERNALS_sv_isbool|SV* sv
+Checks if a C<SvBoolFlagsOK()> sv is a bool. B<Note> that it is the
+caller's responsibility to ensure that the sv is C<SvBoolFlagsOK()> before
+calling this. This is only useful in specialized logic like
+serialization code where performance is critical and the flags have
+already been checked to be correct. Almost always you should be using
+C<sv_isbool(sv)> instead.
+
+=for apidoc Am|bool|BOOL_INTERNALS_sv_isbool_true|SV* sv
+Checks if a C<SvBoolFlagsOK()> sv is a true bool. B<Note> that it is
+the caller's responsibility to ensure that the sv is C<SvBoolFlagsOK()>
+before calling this. This is only useful in specialized logic like
+serialization code where performance is critical and the flags have
+already been checked to be correct. This is B<NOT> what you should use
+to check if an SV is "true", for that you should be using
+C<SvTRUE(sv)> instead.
+
+=for apidoc Am|bool|BOOL_INTERNALS_sv_isbool_false|SV* sv
+Checks if a C<SvBoolFlagsOK()> sv is a false bool. B<Note> that it is
+the caller's responsibility to ensure that the sv is C<SvBoolFlagsOK()>
+before calling this. This is only useful in specialized logic like
+serialization code where performance is critical and the flags have
+already been checked to be correct. This is B<NOT> what you should use
+to check if an SV is "false", for that you should be using
+C<!SvTRUE(sv)> instead.
+
 =for apidoc Am|bool|SvVOK|SV* sv
 Returns a boolean indicating whether the SV contains a v-string.
 
@@ -784,10 +885,10 @@ This is an unnecessary synonym for L</SvUVX>
 Returns the raw value in the SV's NV slot, without checks or conversions.
 Only use when you are sure C<SvNOK> is true.  See also C<L</SvNV>>.
 
-=for apidoc Am|char*|SvPVX|SV* sv
-=for apidoc_item |char*|SvPVXx|SV* sv
+=for apidoc Am   |char*      |SvPVX|SV* sv
 =for apidoc_item |const char*|SvPVX_const|SV* sv
-=for apidoc_item |char*|SvPVX_mutable|SV* sv
+=for apidoc_item |char*      |SvPVX_mutable|SV* sv
+=for apidoc_item |char*      |SvPVXx|SV* sv
 
 These return a pointer to the physical string in the SV.  The SV must contain a
 string.  Prior to 5.9.3 it is not safe to execute these unless the SV's
@@ -914,6 +1015,20 @@ Set the size of the string buffer for the SV. See C<L</SvLEN>>.
 #define SvIOK_notUV(sv)                ((SvFLAGS(sv) & (SVf_IOK|SVf_IVisUV))   \
                                  == SVf_IOK)
 
+#define SvIandPOK(sv)              ((SvFLAGS(sv) & (SVf_IOK|SVf_POK)) == (SVf_IOK|SVf_POK))
+#define SvIandPOK_on(sv)           (assert_not_glob(sv) \
+                                    (SvFLAGS(sv) |= (SVf_IOK|SVp_IOK|SVf_POK|SVp_POK)))
+#define SvIandPOK_off(sv)          (SvFLAGS(sv) &= ~(SVf_IOK|SVp_IOK|SVf_IVisUV|SVf_POK|SVp_POK))
+
+#define SvBoolFlagsOK(sv)           SvIandPOK(sv)
+
+#define BOOL_INTERNALS_sv_isbool(sv)      (SvIsCOW_static(sv) && \
+        (SvPVX_const(sv) == PL_Yes || SvPVX_const(sv) == PL_No))
+#define BOOL_INTERNALS_sv_isbool_true(sv)      (SvIsCOW_static(sv) && \
+        (SvPVX_const(sv) == PL_Yes))
+#define BOOL_INTERNALS_sv_isbool_false(sv)      (SvIsCOW_static(sv) && \
+        (SvPVX_const(sv) == PL_No))
+
 #define SvIsUV(sv)             (SvFLAGS(sv) & SVf_IVisUV)
 #define SvIsUV_on(sv)          (SvFLAGS(sv) |= SVf_IVisUV)
 #define SvIsUV_off(sv)         (SvFLAGS(sv) &= ~SVf_IVisUV)
@@ -1132,7 +1247,7 @@ C<sv_force_normal> does nothing.
 #define SvTHINKFIRST(sv)       (SvFLAGS(sv) & SVf_THINKFIRST)
 
 #define SVs_PADMY              0
-#define SvPADMY(sv)            !(SvFLAGS(sv) & SVs_PADTMP)
+#define SvPADMY(sv)            (!(SvFLAGS(sv) & SVs_PADTMP))
 #ifndef PERL_CORE
 # define SvPADMY_on(sv)                SvPADTMP_off(sv)
 #endif
@@ -1330,8 +1445,8 @@ object type. Exposed to perl code via Internals::SvREADONLY().
 #ifndef PERL_POISON
 /* Given that these two are new, there can't be any existing code using them
  *  as LVALUEs, so prevent that from happening  */
-#  define SvPVX_mutable(sv)    (0 + (sv)->sv_u.svu_pv)
-#  define SvPVX_const(sv)      ((const char*)(0 + (sv)->sv_u.svu_pv))
+#  define SvPVX_mutable(sv)    ((char *)((sv)->sv_u.svu_pv))
+#  define SvPVX_const(sv)      ((const char*)((sv)->sv_u.svu_pv))
 #else
 /* Except for the poison code, which uses & to scribble over the pointer after
    free() is called.  */
@@ -1351,41 +1466,59 @@ object type. Exposed to perl code via Internals::SvREADONLY().
    Not guaranteed to stay returning void */
 /* Macro won't actually call sv_2iv if already IOK */
 #define SvIV_please(sv) \
-        STMT_START {if (!SvIOKp(sv) && (SvFLAGS(sv) & (SVf_NOK|SVf_POK))) \
-                (void) SvIV(sv); } STMT_END
+        STMT_START {                                                        \
+            SV * sv_ = MUTABLE_SV(sv);                                      \
+            if (!SvIOKp(sv_) && (SvFLAGS(sv_) & (SVf_NOK|SVf_POK)))         \
+                (void) SvIV(sv_);                                           \
+        } STMT_END
 #define SvIV_please_nomg(sv) \
         (!(SvFLAGS(sv) & (SVf_IOK|SVp_IOK)) && (SvFLAGS(sv) & (SVf_NOK|SVf_POK)) \
             ? (sv_2iv_flags(sv, 0), SvIOK(sv))   \
             : SvIOK(sv))
+
 #define SvIV_set(sv, val) \
         STMT_START { \
-                assert(PL_valid_types_IV_set[SvTYPE(sv) & SVt_MASK]);  \
-                assert(!isGV_with_GP(sv));             \
-                (((XPVIV*)  SvANY(sv))->xiv_iv = (val)); } STMT_END
+                SV * sv_ = MUTABLE_SV(sv);                                  \
+                assert(PL_valid_types_IV_set[SvTYPE(sv_) & SVt_MASK]);      \
+                assert(!isGV_with_GP(sv_));                                 \
+                (((XPVIV*)  SvANY(sv_))->xiv_iv = (val));                   \
+        } STMT_END
+
 #define SvNV_set(sv, val) \
         STMT_START { \
-                assert(PL_valid_types_NV_set[SvTYPE(sv) & SVt_MASK]);  \
-                assert(!isGV_with_GP(sv));             \
-                (((XPVNV*)SvANY(sv))->xnv_u.xnv_nv = (val)); } STMT_END
+                SV * sv_ = MUTABLE_SV(sv);                                  \
+                assert(PL_valid_types_NV_set[SvTYPE(sv_) & SVt_MASK]);      \
+                assert(!isGV_with_GP(sv_));                                 \
+                (((XPVNV*)SvANY(sv_))->xnv_u.xnv_nv = (val));               \
+        } STMT_END
+
 #define SvPV_set(sv, val) \
         STMT_START { \
-                assert(PL_valid_types_PVX[SvTYPE(sv) & SVt_MASK]);     \
-                assert(!isGV_with_GP(sv));             \
-                assert(!(SvTYPE(sv) == SVt_PVIO                \
-                     && !(IoFLAGS(sv) & IOf_FAKE_DIRP))); \
-                ((sv)->sv_u.svu_pv = (val)); } STMT_END
+                SV * sv_ = MUTABLE_SV(sv);                                  \
+                assert(PL_valid_types_PVX[SvTYPE(sv_) & SVt_MASK]);         \
+                assert(!isGV_with_GP(sv_));                                \
+                assert(!(SvTYPE(sv_) == SVt_PVIO                           \
+                     && !(IoFLAGS(sv_) & IOf_FAKE_DIRP)));                  \
+                ((sv_)->sv_u.svu_pv = (val));                               \
+        } STMT_END
+
 #define SvUV_set(sv, val) \
         STMT_START { \
-                assert(PL_valid_types_IV_set[SvTYPE(sv) & SVt_MASK]);  \
-                assert(!isGV_with_GP(sv));             \
-                (((XPVUV*)SvANY(sv))->xuv_uv = (val)); } STMT_END
+                SV * sv_ = MUTABLE_SV(sv);                                  \
+                assert(PL_valid_types_IV_set[SvTYPE(sv_) & SVt_MASK]);     \
+                assert(!isGV_with_GP(sv_));                                \
+                (((XPVUV*)SvANY(sv_))->xuv_uv = (val));                     \
+        } STMT_END
+
 #define SvRV_set(sv, val) \
         STMT_START { \
-                assert(PL_valid_types_RV[SvTYPE(sv) & SVt_MASK]);      \
-                assert(!isGV_with_GP(sv));             \
-                assert(!(SvTYPE(sv) == SVt_PVIO                \
-                     && !(IoFLAGS(sv) & IOf_FAKE_DIRP))); \
-                ((sv)->sv_u.svu_rv = (val)); } STMT_END
+                SV * sv_ = MUTABLE_SV(sv);                                  \
+                assert(PL_valid_types_RV[SvTYPE(sv_) & SVt_MASK]);         \
+                assert(!isGV_with_GP(sv_));                                \
+                assert(!(SvTYPE(sv_) == SVt_PVIO                           \
+                     && !(IoFLAGS(sv_) & IOf_FAKE_DIRP)));                  \
+                ((sv_)->sv_u.svu_rv = (val));                               \
+        } STMT_END
 #define SvMAGIC_set(sv, val) \
         STMT_START { assert(SvTYPE(sv) >= SVt_PVMG); \
                 (((XPVMG*)SvANY(sv))->xmg_u.xmg_magic = (val)); } STMT_END
@@ -1414,7 +1547,7 @@ object type. Exposed to perl code via Internals::SvREADONLY().
 =for apidoc Am|void|SvPV_renew|SV* sv|STRLEN len
 Low level micro optimization of C<L</SvGROW>>.  It is generally better to use
 C<SvGROW> instead.  This is because C<SvPV_renew> ignores potential issues that
-C<SvGROW> handles.  C<sv> needs to have a real C<PV> that is unencombered by
+C<SvGROW> handles.  C<sv> needs to have a real C<PV> that is unencumbered by
 things like COW.  Using C<SV_CHECK_THINKFIRST> or
 C<SV_CHECK_THINKFIRST_COW_DROP> before calling this should clean it up, but
 why not just use C<SvGROW> if you're not sure about the provenance?
@@ -1427,6 +1560,19 @@ why not just use C<SvGROW> if you're not sure about the provenance?
                                 (char*)saferealloc((Malloc_t)SvPVX(sv), \
                                                    (MEM_SIZE)((n)))));  \
                  } STMT_END
+/*
+=for apidoc Am|void|SvPV_shrink_to_cur|SV* sv
+
+Trim any trailing unused memory in the PV of C<sv>, which needs to have a real
+C<PV> that is unencumbered by things like COW.  Think first before using this
+functionality.  Is the space saving really worth giving up COW?  Will the
+needed size of C<sv> stay the same?
+
+If the answers are both yes, then use L</C<SV_CHECK_THINKFIRST>> or
+L</C<SV_CHECK_THINKFIRST_COW_DROP>> before calling this.
+
+=cut
+*/
 
 #define SvPV_shrink_to_cur(sv) STMT_START { \
                    const STRLEN _lEnGtH = SvCUR(sv) + 1; \
@@ -1581,19 +1727,19 @@ attention to precisely which outputs are influenced by which inputs.
 
 /*
 =for apidoc_section $SV
-=for apidoc Am|char*|SvPV_force|SV* sv|STRLEN len
-=for apidoc_item ||SvPV_force_nolen|SV* sv
-=for apidoc_item ||SvPVx_force|SV* sv|STRLEN len
-=for apidoc_item ||SvPV_force_nomg|SV* sv|STRLEN len
-=for apidoc_item ||SvPV_force_nomg_nolen|SV * sv
-=for apidoc_item ||SvPV_force_mutable|SV * sv|STRLEN len
-=for apidoc_item ||SvPV_force_flags|SV * sv|STRLEN len|U32 flags
-=for apidoc_item ||SvPV_force_flags_nolen|SV * sv|U32 flags
-=for apidoc_item ||SvPV_force_flags_mutable|SV * sv|STRLEN len|U32 flags
-=for apidoc_item ||SvPVbyte_force
-=for apidoc_item ||SvPVbytex_force
-=for apidoc_item ||SvPVutf8_force
-=for apidoc_item ||SvPVutf8x_force
+=for apidoc Am|char*|SvPV_force              |SV* sv|STRLEN len
+=for apidoc_item   ||SvPV_force_flags        |SV * sv|STRLEN len|U32 flags
+=for apidoc_item   ||SvPV_force_flags_mutable|SV * sv|STRLEN len|U32 flags
+=for apidoc_item   ||SvPV_force_flags_nolen  |SV * sv           |U32 flags
+=for apidoc_item   ||SvPV_force_mutable      |SV * sv|STRLEN len
+=for apidoc_item   ||SvPV_force_nolen        |SV* sv
+=for apidoc_item   ||SvPV_force_nomg         |SV* sv|STRLEN len
+=for apidoc_item   ||SvPV_force_nomg_nolen   |SV * sv
+=for apidoc_item   ||SvPVbyte_force          |SV * sv|STRLEN len
+=for apidoc_item   ||SvPVbytex_force         |SV * sv|STRLEN len
+=for apidoc_item   ||SvPVutf8_force          |SV * sv|STRLEN len
+=for apidoc_item   ||SvPVutf8x_force         |SV * sv|STRLEN len
+=for apidoc_item   ||SvPVx_force             |SV* sv|STRLEN len
 
 These are like C<L</SvPV>>, returning the string in the SV, but will force the
 SV into containing a string (C<L</SvPOK>>), and only a string
@@ -1638,37 +1784,37 @@ downgraded from UTF-8, this croaks.
 C<SvPVbytex_force> is like C<SvPVbyte_force>, but guarantees to evaluate C<sv>
 only once; use the more efficient C<SvPVbyte_force> otherwise.
 
-=for apidoc Am|char*|SvPV|SV* sv|STRLEN len
-=for apidoc_item |char*|SvPVx|SV* sv|STRLEN len
-=for apidoc_item |char*|SvPV_nomg|SV* sv|STRLEN len
-=for apidoc_item |char*|SvPV_nolen|SV* sv
-=for apidoc_item |char*|SvPVx_nolen|SV* sv
-=for apidoc_item |char*|SvPV_nomg_nolen|SV* sv
-=for apidoc_item |char*|SvPV_mutable|SV* sv|STRLEN len
-=for apidoc_item |const char*|SvPV_const|SV* sv|STRLEN len
-=for apidoc_item |const char*|SvPVx_const|SV* sv|STRLEN len
-=for apidoc_item |const char*|SvPV_nolen_const|SV* sv
-=for apidoc_item |const char*|SvPVx_nolen_const|SV* sv
-=for apidoc_item |const char*|SvPV_nomg_const|SV* sv|STRLEN len
+=for apidoc Am   |      char*|SvPV                 |SV* sv|STRLEN len
+=for apidoc_item |const char*|SvPV_const           |SV* sv|STRLEN len
+=for apidoc_item |      char*|SvPV_flags           |SV* sv|STRLEN len|U32 flags
+=for apidoc_item |const char*|SvPV_flags_const     |SV* sv|STRLEN len|U32 flags
+=for apidoc_item |      char*|SvPV_flags_mutable   |SV* sv|STRLEN len|U32 flags
+=for apidoc_item |      char*|SvPV_mutable         |SV* sv|STRLEN len
+=for apidoc_item |      char*|SvPV_nolen           |SV* sv
+=for apidoc_item |const char*|SvPV_nolen_const     |SV* sv
+=for apidoc_item |      char*|SvPV_nomg            |SV* sv|STRLEN len
+=for apidoc_item |const char*|SvPV_nomg_const      |SV* sv|STRLEN len
 =for apidoc_item |const char*|SvPV_nomg_const_nolen|SV* sv
-=for apidoc_item |char *|SvPV_flags|SV * sv|STRLEN len|U32 flags
-=for apidoc_item |const char *|SvPV_flags_const|SV * sv|STRLEN len|U32 flags
-=for apidoc_item |char *|SvPV_flags_mutable|SV * sv|STRLEN len|U32 flags
-=for apidoc_item |char*|SvPVbyte|SV* sv|STRLEN len
-=for apidoc_item |char*|SvPVbyte_nomg|SV* sv|STRLEN len
-=for apidoc_item |char*|SvPVbyte_nolen|SV* sv
-=for apidoc_item |char*|SvPVbytex_nolen|SV* sv
-=for apidoc_item |char*|SvPVbytex|SV* sv|STRLEN len
-=for apidoc_item |char*|SvPVbyte_or_null|SV* sv|STRLEN len
-=for apidoc_item |char*|SvPVbyte_or_null_nomg|SV* sv|STRLEN len
-=for apidoc_item |char*|SvPVutf8|SV* sv|STRLEN len
-=for apidoc_item |char*|SvPVutf8x|SV* sv|STRLEN len
-=for apidoc_item |char*|SvPVutf8_nomg|SV* sv|STRLEN len
-=for apidoc_item |char*|SvPVutf8_nolen|SV* sv
-=for apidoc_item |char*|SvPVutf8_or_null|SV* sv|STRLEN len
-=for apidoc_item |char*|SvPVutf8_or_null_nomg|SV* sv|STRLEN len
-
-All these return a pointer to the string in C<sv>, or a stringified form of
+=for apidoc_item |      char*|SvPV_nomg_nolen      |SV* sv
+=for apidoc_item |      char*|SvPVbyte             |SV* sv|STRLEN len
+=for apidoc_item |      char*|SvPVbyte_nolen       |SV* sv
+=for apidoc_item |      char*|SvPVbyte_nomg        |SV* sv|STRLEN len
+=for apidoc_item |      char*|SvPVbyte_or_null     |SV* sv|STRLEN len
+=for apidoc_item |      char*|SvPVbyte_or_null_nomg|SV* sv|STRLEN len
+=for apidoc_item |      char*|SvPVbytex            |SV* sv|STRLEN len
+=for apidoc_item |      char*|SvPVbytex_nolen      |SV* sv
+=for apidoc_item |      char*|SvPVutf8             |SV* sv|STRLEN len
+=for apidoc_item |      char*|SvPVutf8_nolen       |SV* sv
+=for apidoc_item |      char*|SvPVutf8_nomg        |SV* sv|STRLEN len
+=for apidoc_item |      char*|SvPVutf8_or_null     |SV* sv|STRLEN len
+=for apidoc_item |      char*|SvPVutf8_or_null_nomg|SV* sv|STRLEN len
+=for apidoc_item |      char*|SvPVutf8x            |SV* sv|STRLEN len
+=for apidoc_item |      char*|SvPVx                |SV* sv|STRLEN len
+=for apidoc_item |const char*|SvPVx_const          |SV* sv|STRLEN len
+=for apidoc_item |      char*|SvPVx_nolen          |SV* sv
+=for apidoc_item |const char*|SvPVx_nolen_const    |SV* sv
+
+These each return a pointer to the string in C<sv>, or a stringified form of
 C<sv> if it does not contain a string.  The SV may cache the stringified
 version becoming C<SvPOK>.
 
@@ -1714,13 +1860,11 @@ the string (unless you cast away const yourself).
 The other forms return a mutable pointer so that the string is modifiable by
 the caller; this is emphasized for the ones with C<mutable> in their names.
 
-The forms whose name ends in C<x> are the same as the corresponding form
-without the C<x>, but the C<x> form is guaranteed to evaluate C<sv> exactly
-once, with a slight loss of efficiency.  Use this if C<sv> is an expression
-with side effects.
+As of 5.38, all forms are guaranteed to evaluate C<sv> exactly once.  For
+earlier Perls, use a form whose name ends with C<x> for single evaluation.
 
 C<SvPVutf8> is like C<SvPV>, but converts C<sv> to UTF-8 first if not already
-UTF-8.  Similiarly, the other forms with C<utf8> in their names correspond to
+UTF-8.  Similarly, the other forms with C<utf8> in their names correspond to
 their respective forms without.
 
 C<SvPVutf8_or_null> and C<SvPVutf8_or_null_nomg> don't have corresponding
@@ -1729,62 +1873,17 @@ undef, they return C<NULL>.
 
 C<SvPVbyte> is like C<SvPV>, but converts C<sv> to byte representation first if
 currently encoded as UTF-8.  If C<sv> cannot be downgraded from UTF-8, it
-croaks.  Similiarly, the other forms with C<byte> in their names correspond to
+croaks.  Similarly, the other forms with C<byte> in their names correspond to
 their respective forms without.
 
 C<SvPVbyte_or_null> doesn't have a corresponding non-C<byte> form.  Instead it
 is like C<SvPVbyte>, but when C<sv> is undef, it returns C<NULL>.
 
-=for apidoc Am|IV|SvIV|SV* sv
-=for apidoc_item SvIVx
-=for apidoc_item SvIV_nomg
-
-These coerce the given SV to IV and return it.  The returned value in many
-circumstances will get stored in C<sv>'s IV slot, but not in all cases.  (Use
-C<L</sv_setiv>> to make sure it does).
-
-C<SvIVx> is different from the others in that it is guaranteed to evaluate
-C<sv> exactly once; the others may evaluate it multiple times.  Only use this
-form if C<sv> is an expression with side effects, otherwise use the more
-efficient C<SvIV>.
-
-C<SvIV_nomg> is the same as C<SvIV>, but does not perform 'get' magic.
-
-=for apidoc Am|NV|SvNV|SV* sv
-=for apidoc_item SvNVx
-=for apidoc_item SvNV_nomg
-
-These coerce the given SV to NV and return it.  The returned value in many
-circumstances will get stored in C<sv>'s NV slot, but not in all cases.  (Use
-C<L</sv_setnv>> to make sure it does).
-
-C<SvNVx> is different from the others in that it is guaranteed to evaluate
-C<sv> exactly once; the others may evaluate it multiple times.  Only use this
-form if C<sv> is an expression with side effects, otherwise use the more
-efficient C<SvNV>.
-
-C<SvNV_nomg> is the same as C<SvNV>, but does not perform 'get' magic.
-
-=for apidoc Am|UV|SvUV|SV* sv
-=for apidoc_item SvUVx
-=for apidoc_item SvUV_nomg
-
-These coerce the given SV to UV and return it.  The returned value in many
-circumstances will get stored in C<sv>'s UV slot, but not in all cases.  (Use
-C<L</sv_setuv>> to make sure it does).
-
-C<SvUVx> is different from the others in that it is guaranteed to evaluate
-C<sv> exactly once; the others may evaluate it multiple times.  Only use this
-form if C<sv> is an expression with side effects, otherwise use the more
-efficient C<SvUV>.
-
-C<SvUV_nomg> is the same as C<SvUV>, but does not perform 'get' magic.
-
-=for apidoc SvTRUE
-=for apidoc_item SvTRUEx
-=for apidoc_item SvTRUE_nomg
+=for apidoc      SvTRUE
 =for apidoc_item SvTRUE_NN
+=for apidoc_item SvTRUE_nomg
 =for apidoc_item SvTRUE_nomg_NN
+=for apidoc_item SvTRUEx
 
 These return a boolean indicating whether Perl would evaluate the SV as true or
 false.  See C<L</SvOK>> for a defined/undefined test.
@@ -1817,20 +1916,26 @@ scalar.
 =cut
 */
 
-/* Let us hope that bitmaps for UV and IV are the same */
-#define SvIV(sv) (SvIOK_nog(sv) ? SvIVX(sv) : sv_2iv(sv))
-#define SvUV(sv) (SvUOK_nog(sv) ? SvUVX(sv) : sv_2uv(sv))
-#define SvNV(sv) (SvNOK_nog(sv) ? SvNVX(sv) : sv_2nv(sv))
-
-#define SvIV_nomg(sv) (SvIOK(sv) ? SvIVX(sv) : sv_2iv_flags(sv, 0))
-#define SvUV_nomg(sv) (SvUOK(sv) ? SvUVX(sv) : sv_2uv_flags(sv, 0))
-#define SvNV_nomg(sv) (SvNOK(sv) ? SvNVX(sv) : sv_2nv_flags(sv, 0))
-
-/* ----*/
+/* To pass the action to the functions called by the following macros */
+typedef enum {
+    SvPVutf8_type_,
+    SvPVbyte_type_,
+    SvPVnormal_type_,
+    SvPVforce_type_,
+    SvPVutf8_pure_type_,
+    SvPVbyte_pure_type_
+} PL_SvPVtype;
+
+START_EXTERN_C
+
+/* When this code was written, embed.fnc could not handle function pointer
+ * parameters; perhaps it still can't */
+#ifndef PERL_NO_INLINE_FUNCTIONS
+PERL_STATIC_INLINE char*
+Perl_SvPV_helper(pTHX_ SV *const sv, STRLEN *const lp, const U32 flags, const PL_SvPVtype type, char * (*non_trivial)(pTHX_ SV *, STRLEN * const, const U32), const bool or_null, const U32 return_flags);
+#endif
 
-#define SvPV(sv, len)         SvPV_flags(sv, len, SV_GMAGIC)
-#define SvPV_const(sv, len)   SvPV_flags_const(sv, len, SV_GMAGIC)
-#define SvPV_mutable(sv, len) SvPV_flags_mutable(sv, len, SV_GMAGIC)
+END_EXTERN_C
 
 /* This test is "is there a cached PV that we can use directly?"
  * We can if
@@ -1843,120 +1948,98 @@ scalar.
 #define SvPOK_or_cached_IV(sv) \
     (((SvFLAGS(sv) & (SVf_POK|SVs_GMG)) == SVf_POK) || ((SvFLAGS(sv) & (SVf_IOK|SVp_POK|SVs_GMG)) == (SVf_IOK|SVp_POK)))
 
-#define SvPV_flags(sv, len, flags) \
-    (SvPOK_or_cached_IV(sv) \
-     ? ((len = SvCUR(sv)), SvPVX(sv)) : sv_2pv_flags(sv, &len, flags))
-#define SvPV_flags_const(sv, len, flags) \
-    (SvPOK_or_cached_IV(sv) \
-     ? ((len = SvCUR(sv)), SvPVX_const(sv)) : \
-     (const char*) sv_2pv_flags(sv, &len, (flags|SV_CONST_RETURN)))
-#define SvPV_flags_const_nolen(sv, flags) \
-    (SvPOK_or_cached_IV(sv) \
-     ? SvPVX_const(sv) : \
-     (const char*) sv_2pv_flags(sv, 0, (flags|SV_CONST_RETURN)))
-#define SvPV_flags_mutable(sv, len, flags) \
-    (SvPOK_or_cached_IV(sv) \
-     ? ((len = SvCUR(sv)), SvPVX_mutable(sv)) : \
-     sv_2pv_flags(sv, &len, (flags|SV_MUTABLE_RETURN)))
-
-#define SvPV_force(sv, len) SvPV_force_flags(sv, len, SV_GMAGIC)
-#define SvPV_force_nolen(sv) SvPV_force_flags_nolen(sv, SV_GMAGIC)
+#define SvPV_flags(sv, len, flags)                                          \
+   Perl_SvPV_helper(aTHX_ sv, &len, flags, SvPVnormal_type_,                \
+                    Perl_sv_2pv_flags, FALSE, 0)
+#define SvPV_flags_const(sv, len, flags)                                    \
+   ((const char*) Perl_SvPV_helper(aTHX_ sv, &len, flags, SvPVnormal_type_, \
+                                   Perl_sv_2pv_flags, FALSE,                \
+                                   SV_CONST_RETURN))
+#define SvPV_flags_const_nolen(sv, flags)                                   \
+   ((const char*) Perl_SvPV_helper(aTHX_ sv, NULL, flags, SvPVnormal_type_, \
+                                   Perl_sv_2pv_flags, FALSE,                \
+                                   SV_CONST_RETURN))
+#define SvPV_flags_mutable(sv, len, flags)                                  \
+    Perl_SvPV_helper(aTHX_ sv, &len, flags, SvPVnormal_type_,               \
+                     Perl_sv_2pv_flags, FALSE, SV_MUTABLE_RETURN)
+
+#define SvPV_nolen(sv)                                                      \
+    Perl_SvPV_helper(aTHX_ sv, NULL, SV_GMAGIC, SvPVnormal_type_,           \
+                     Perl_sv_2pv_flags, FALSE, 0)
+
+#define SvPV_nolen_const(sv)  SvPV_flags_const_nolen(sv, SV_GMAGIC)
+
+#define SvPV(sv, len)               SvPV_flags(sv, len, SV_GMAGIC)
+#define SvPV_const(sv, len)         SvPV_flags_const(sv, len, SV_GMAGIC)
+#define SvPV_mutable(sv, len)       SvPV_flags_mutable(sv, len, SV_GMAGIC)
+
+#define SvPV_nomg_nolen(sv)                                                 \
+    Perl_SvPV_helper(aTHX_ sv, NULL, 0, SvPVnormal_type_,Perl_sv_2pv_flags, \
+                     FALSE, 0)
+#define SvPV_nomg(sv, len)          SvPV_flags(sv, len, 0)
+#define SvPV_nomg_const(sv, len)    SvPV_flags_const(sv, len, 0)
+#define SvPV_nomg_const_nolen(sv)   SvPV_flags_const_nolen(sv, 0)
+
+#define SvPV_force_flags(sv, len, flags)                                    \
+    Perl_SvPV_helper(aTHX_ sv, &len, flags, SvPVforce_type_,                \
+                     Perl_sv_pvn_force_flags, FALSE, 0)
+#define SvPV_force_flags_nolen(sv, flags)                                   \
+    Perl_SvPV_helper(aTHX_ sv, NULL, flags, SvPVforce_type_,                \
+                     Perl_sv_pvn_force_flags, FALSE, 0)
+#define SvPV_force_flags_mutable(sv, len, flags)                            \
+    Perl_SvPV_helper(aTHX_ sv, &len, flags, SvPVforce_type_,                \
+                     Perl_sv_pvn_force_flags, FALSE, SV_MUTABLE_RETURN)
+
+#define SvPV_force(sv, len)         SvPV_force_flags(sv, len, SV_GMAGIC)
+#define SvPV_force_nolen(sv)        SvPV_force_flags_nolen(sv, SV_GMAGIC)
 #define SvPV_force_mutable(sv, len) SvPV_force_flags_mutable(sv, len, SV_GMAGIC)
 
-#define SvPV_force_nomg(sv, len) SvPV_force_flags(sv, len, 0)
-#define SvPV_force_nomg_nolen(sv) SvPV_force_flags_nolen(sv, 0)
-
-#define SvPV_force_flags(sv, len, flags) \
-    (SvPOK_pure_nogthink(sv) \
-     ? ((len = SvCUR(sv)), SvPVX(sv)) : sv_pvn_force_flags(sv, &len, flags))
-
-#define SvPV_force_flags_nolen(sv, flags) \
-    (SvPOK_pure_nogthink(sv) \
-     ? SvPVX(sv) : sv_pvn_force_flags(sv, 0, flags))
-
-#define SvPV_force_flags_mutable(sv, len, flags) \
-    (SvPOK_pure_nogthink(sv) \
-     ? ((len = SvCUR(sv)), SvPVX_mutable(sv)) \
-     : sv_pvn_force_flags(sv, &len, flags|SV_MUTABLE_RETURN))
-
-#define SvPV_nolen(sv) \
-    (SvPOK_or_cached_IV(sv) \
-     ? SvPVX(sv) : sv_2pv_flags(sv, 0, SV_GMAGIC))
-
 /* "_nomg" in these defines means no mg_get() */
-#define SvPV_nomg_nolen(sv) \
-    (SvPOK_or_cached_IV(sv) \
-     ? SvPVX(sv) : sv_2pv_flags(sv, 0, 0))
-
-#define SvPV_nolen_const(sv) \
-    (SvPOK_or_cached_IV(sv) \
-     ? SvPVX_const(sv) : sv_2pv_flags(sv, 0, SV_GMAGIC|SV_CONST_RETURN))
-
-#define SvPV_nomg(sv, len) SvPV_flags(sv, len, 0)
-#define SvPV_nomg_const(sv, len) SvPV_flags_const(sv, len, 0)
-#define SvPV_nomg_const_nolen(sv) SvPV_flags_const_nolen(sv, 0)
-
-/* ----*/
-
-#define SvPVutf8(sv, len) \
-    (SvPOK_utf8_nog(sv) \
-     ? ((len = SvCUR(sv)), SvPVX(sv)) : sv_2pvutf8(sv, &len))
-
-#define SvPVutf8_or_null(sv, len) \
-    (SvPOK_utf8_nog(sv) \
-     ? ((len = SvCUR(sv)), SvPVX(sv)) : (SvGETMAGIC(sv), SvOK(sv)) \
-     ? sv_2pvutf8_flags(sv, &len, 0) : ((len = 0), NULL))
-
-#define SvPVutf8_nomg(sv, len) \
-    (SvPOK_utf8_nog(sv) \
-     ? ((len = SvCUR(sv)), SvPVX(sv)) : sv_2pvutf8_flags(sv, &len, 0))
-
-#define SvPVutf8_or_null_nomg(sv, len) \
-    (SvPOK_utf8_nog(sv) \
-     ? ((len = SvCUR(sv)), SvPVX(sv)) : SvOK(sv) \
-     ? sv_2pvutf8_flags(sv, &len, 0) : ((len = 0), NULL))
-
-#define SvPVutf8_force(sv, len) \
-    (SvPOK_utf8_pure_nogthink(sv) \
-     ? ((len = SvCUR(sv)), SvPVX(sv)) : sv_pvutf8n_force(sv, &len))
-
-#define SvPVutf8_nolen(sv) \
-    (SvPOK_utf8_nog(sv) \
-     ? SvPVX(sv) : sv_2pvutf8(sv, 0))
-
-/* ----*/
-
-#define SvPVbyte(sv, len) \
-    (SvPOK_byte_nog(sv) \
-     ? ((len = SvCUR(sv)), SvPVX(sv)) : sv_2pvbyte(sv, &len))
-
-#define SvPVbyte_or_null(sv, len) \
-    (SvPOK_byte_nog(sv) \
-     ? ((len = SvCUR(sv)), SvPVX(sv)) : (SvGETMAGIC(sv), SvOK(sv)) \
-     ? sv_2pvbyte_flags(sv, &len, 0) : ((len = 0), NULL))
-
-#define SvPVbyte_nomg(sv, len) \
-    (SvPOK_byte_nog(sv) \
-     ? ((len = SvCUR(sv)), SvPVX(sv)) : sv_2pvbyte_flags(sv, &len, 0))
-
-#define SvPVbyte_or_null_nomg(sv, len) \
-    (SvPOK_utf8_nog(sv) \
-     ? ((len = SvCUR(sv)), SvPVX(sv)) : SvOK(sv) \
-     ? sv_2pvbyte_flags(sv, &len, 0) : ((len = 0), NULL))
-
-#define SvPVbyte_force(sv, len) \
-    (SvPOK_byte_pure_nogthink(sv) \
-     ? ((len = SvCUR(sv)), SvPVX(sv)) : sv_pvbyten_force(sv, &len))
-
-#define SvPVbyte_nolen(sv) \
-    (SvPOK_byte_nog(sv) \
-     ? SvPVX(sv) : sv_2pvbyte(sv, 0))
-
-
-/* define FOOx(): idempotent versions of FOO(). If possible, use a local
- * var to evaluate the arg once; failing that, use a global if possible;
- * failing that, call a function to do the work
- */
+#define SvPV_force_nomg(sv, len)    SvPV_force_flags(sv, len, 0)
+#define SvPV_force_nomg_nolen(sv)   SvPV_force_flags_nolen(sv, 0)
+
+#define SvPVutf8(sv, len)                                                   \
+    Perl_SvPV_helper(aTHX_ sv, &len, SV_GMAGIC, SvPVutf8_type_,             \
+                     Perl_sv_2pvutf8_flags, FALSE, 0)
+#define SvPVutf8_nomg(sv, len)                                              \
+    Perl_SvPV_helper(aTHX_ sv, &len, 0, SvPVutf8_type_,                     \
+                     Perl_sv_2pvutf8_flags, FALSE, 0)
+#define SvPVutf8_nolen(sv)                                                  \
+    Perl_SvPV_helper(aTHX_ sv, NULL, SV_GMAGIC, SvPVutf8_type_,             \
+                     Perl_sv_2pvutf8_flags, FALSE, 0)
+#define SvPVutf8_or_null(sv, len)                                           \
+    Perl_SvPV_helper(aTHX_ sv, &len, SV_GMAGIC, SvPVutf8_type_,             \
+                     Perl_sv_2pvutf8_flags, TRUE, 0)
+#define SvPVutf8_or_null_nomg(sv, len)                                      \
+    Perl_SvPV_helper(aTHX_ sv, &len, 0, SvPVutf8_type_,                     \
+                     Perl_sv_2pvutf8_flags, TRUE, 0)
+
+#define SvPVbyte(sv, len)                                                   \
+    Perl_SvPV_helper(aTHX_ sv, &len, SV_GMAGIC, SvPVbyte_type_,             \
+                     Perl_sv_2pvbyte_flags, FALSE, 0)
+#define SvPVbyte_nomg(sv, len)                                              \
+    Perl_SvPV_helper(aTHX_ sv, &len, 0, SvPVbyte_type_,                     \
+                     Perl_sv_2pvbyte_flags, FALSE, 0)
+#define SvPVbyte_nolen(sv)                                                  \
+    Perl_SvPV_helper(aTHX_ sv, NULL, SV_GMAGIC, SvPVbyte_type_,             \
+                     Perl_sv_2pvbyte_flags, FALSE, 0)
+#define SvPVbyte_or_null(sv, len)                                           \
+    Perl_SvPV_helper(aTHX_ sv, &len, SV_GMAGIC, SvPVbyte_type_,             \
+                     Perl_sv_2pvbyte_flags, TRUE, 0)
+#define SvPVbyte_or_null_nomg(sv, len)                                      \
+    Perl_SvPV_helper(aTHX_ sv, &len, 0, SvPVbyte_type_,                     \
+                     Perl_sv_2pvbyte_flags, TRUE, 0)
+
+#define SvPVutf8_force(sv, len)                                             \
+    Perl_SvPV_helper(aTHX_ sv, &len, 0, SvPVutf8_pure_type_,                \
+                     Perl_sv_pvutf8n_force_wrapper, FALSE, 0)
+
+#define SvPVbyte_force(sv, len)                                             \
+    Perl_SvPV_helper(aTHX_ sv, &len, 0, SvPVbyte_pure_type_,                \
+                     Perl_sv_pvbyten_force_wrapper, FALSE, 0)
+
+/* define FOOx(): Before FOO(x) was inlined, these were idempotent versions of
+ * FOO(). */
 
 #define SvPVx_force(sv, len) sv_pvn_force(sv, &len)
 #define SvPVutf8x_force(sv, len) sv_pvutf8n_force(sv, &len)
@@ -1966,11 +2049,12 @@ scalar.
 #define SvTRUEx_nomg(sv)   SvTRUE_nomg(sv)
 #define SvTRUE_nomg_NN(sv) SvTRUE_common(sv, TRUE)
 
+#  define SvIVx(sv) SvIV(sv)
+#  define SvUVx(sv) SvUV(sv)
+#  define SvNVx(sv) SvNV(sv)
+
 #if defined(PERL_USE_GCC_BRACE_GROUPS)
 
-#  define SvIVx(sv) ({SV *_sv = MUTABLE_SV(sv); SvIV(_sv); })
-#  define SvUVx(sv) ({SV *_sv = MUTABLE_SV(sv); SvUV(_sv); })
-#  define SvNVx(sv) ({SV *_sv = MUTABLE_SV(sv); SvNV(_sv); })
 #  define SvPVx(sv, len) ({SV *_sv = (sv); SvPV(_sv, len); })
 #  define SvPVx_const(sv, len) ({SV *_sv = (sv); SvPV_const(_sv, len); })
 #  define SvPVx_nolen(sv) ({SV *_sv = (sv); SvPV_nolen(_sv); })
@@ -1984,9 +2068,6 @@ scalar.
 /* These inlined macros use globals, which will require a thread
  * declaration in user code, so we avoid them under threads */
 
-#  define SvIVx(sv) ((PL_Sv = (sv)), SvIV(PL_Sv))
-#  define SvUVx(sv) ((PL_Sv = (sv)), SvUV(PL_Sv))
-#  define SvNVx(sv) ((PL_Sv = (sv)), SvNV(PL_Sv))
 #  define SvPVx(sv, len) ((PL_Sv = (sv)), SvPV(PL_Sv, len))
 #  define SvPVx_const(sv, len) ((PL_Sv = (sv)), SvPV_const(PL_Sv, len))
 #  define SvPVx_nolen(sv) ((PL_Sv = (sv)), SvPV_nolen(PL_Sv))
@@ -1996,30 +2077,6 @@ scalar.
 #  define SvPVbytex_nolen(sv) ((PL_Sv = (sv)), SvPVbyte_nolen(PL_Sv))
 #endif /* __GNU__ */
 
-/*
-=for apidoc Am|bool|SvPVXtrue|SV * sv
-
-Note: This macro may evaluate C<sv> more than once.
-
-Returns a boolean as to whether or not C<sv> contains a PV that is considered
-TRUE.  FALSE is returned if C<sv> doesn't contain a PV, or if the PV it does
-contain is zero length, or consists of just the single character '0'.  Every
-other PV value is considered TRUE.
-
-=cut
-*/
-
-#define SvPVXtrue(sv)  (                                       \
-    ((XPV*)SvANY((sv)))                                        \
-     && (                                                      \
-        ((XPV*)SvANY((sv)))->xpv_cur > 1                       \
-        || (                                                   \
-            ((XPV*)SvANY((sv)))->xpv_cur                       \
-            && *(sv)->sv_u.svu_pv != '0'                        \
-        )                                                      \
-    )                                                          \
-)
-
 #define SvIsCOW(sv)              (SvFLAGS(sv) & SVf_IsCOW)
 #define SvIsCOW_on(sv)           (SvFLAGS(sv) |= SVf_IsCOW)
 #define SvIsCOW_off(sv)          (SvFLAGS(sv) &= ~(SVf_IsCOW|SVppv_STATIC))
@@ -2045,31 +2102,33 @@ Returns the hash for C<sv> created by C<L</newSVpvn_share>>.
 =cut
 */
 
-#define SV_IMMEDIATE_UNREF     1
-#define SV_GMAGIC              2
-#define SV_COW_DROP_PV         4
-#define SV_NOSTEAL             16
-#define SV_CONST_RETURN                32
-#define SV_MUTABLE_RETURN      64
-#define SV_SMAGIC              128
-#define SV_HAS_TRAILING_NUL    256
-#define SV_COW_SHARED_HASH_KEYS        512
+/* Flags used as `U32 flags` arguments to various functions */
+#define SV_IMMEDIATE_UNREF      (1 <<  0) /* 0x0001 -     1 */
+#define SV_GMAGIC               (1 <<  1) /* 0x0002 -     2 */
+#define SV_COW_DROP_PV          (1 <<  2) /* 0x0004 -     4 */
+/* SV_NOT_USED                  (1 <<  3)    0x0008 -     8 */
+#define SV_NOSTEAL              (1 <<  4) /* 0x0010 -    16 */
+#define SV_CONST_RETURN         (1 <<  5) /* 0x0020 -    32 */
+#define SV_MUTABLE_RETURN       (1 <<  6) /* 0x0040 -    64 */
+#define SV_SMAGIC               (1 <<  7) /* 0x0080 -   128 */
+#define SV_HAS_TRAILING_NUL     (1 <<  8) /* 0x0100 -   256 */
+#define SV_COW_SHARED_HASH_KEYS (1 <<  9) /* 0x0200 -   512 */
 /* This one is only enabled for PERL_OLD_COPY_ON_WRITE */
 /* XXX This flag actually enabled for any COW.  But it appears not to do
        anything.  Can we just remove it?  Or will it serve some future
        purpose.  */
-#define SV_COW_OTHER_PVS       1024
+#define SV_COW_OTHER_PVS        (1 << 10) /* 0x0400 -  1024 */
 /* Make sv_2pv_flags return NULL if something is undefined.  */
-#define SV_UNDEF_RETURNS_NULL  2048
+#define SV_UNDEF_RETURNS_NULL   (1 << 11) /* 0x0800 -  2048 */
 /* Tell sv_utf8_upgrade() to not check to see if an upgrade is really needed.
  * This is used when the caller has already determined it is, and avoids
  * redundant work */
-#define SV_FORCE_UTF8_UPGRADE  4096
+#define SV_FORCE_UTF8_UPGRADE   (1 << 12) /* 0x1000 -  4096 */
 /* if (after resolving magic etc), the SV is found to be overloaded,
  * don't call the overload magic, just return as-is */
-#define SV_SKIP_OVERLOAD       8192
-#define SV_CATBYTES            16384
-#define SV_CATUTF8             32768
+#define SV_SKIP_OVERLOAD        (1 << 13) /* 0x2000 -  8192 */
+#define SV_CATBYTES             (1 << 14) /* 0x4000 - 16384 */
+#define SV_CATUTF8              (1 << 15) /* 0x8000 - 32768 */
 
 /* The core is safe for this COW optimisation. XS code on CPAN may not be.
    So only default to doing the COW setup if we're in the core.
@@ -2090,11 +2149,17 @@ Returns the hash for C<sv> created by C<L</newSVpvn_share>>.
 #define sv_usepvn(sv, p, l)    sv_usepvn_flags(sv, p, l, 0)
 #define sv_usepvn_mg(sv, p, l) sv_usepvn_flags(sv, p, l, SV_SMAGIC)
 
-/* We are about to replace the SV's current value. So if it's copy on write
-   we need to normalise it. Use the SV_COW_DROP_PV flag hint to say that
-   the value is about to get thrown away, so drop the PV rather than go to
-   the effort of making a read-write copy only for it to get immediately
-   discarded.  */
+/*
+=for apidoc Am|void|SV_CHECK_THINKFIRST_COW_DROP|SV * sv
+
+Call this when you are about to replace the PV value in C<sv>, which is
+potentially copy-on-write.  It stops any sharing with other SVs, so that no
+Copy on Write (COW) actually happens.  This COW would be useless, as it would
+immediately get changed to something else.  This function also removes any
+other encumbrances that would be problematic when changing C<sv>.
+
+=cut
+*/
 
 #define SV_CHECK_THINKFIRST_COW_DROP(sv) if (SvTHINKFIRST(sv)) \
                                     sv_force_normal_flags(sv, SV_COW_DROP_PV)
@@ -2114,6 +2179,19 @@ Returns the hash for C<sv> created by C<L</newSVpvn_share>>.
 
 #define CAN_COW_FLAGS  (SVp_POK|SVf_POK)
 
+/*
+=for apidoc Am|void|SV_CHECK_THINKFIRST|SV * sv
+
+Remove any encumbrances from C<sv>, that need to be taken care of before it
+is modifiable.  For example if it is Copy on Write (COW), now is the time to
+make that copy.
+
+If you know that you are about to change the PV value of C<sv>, instead use
+L</C<SV_CHECK_THINKFIRST_COW_DROP>> to avoid the write that would be
+immediately written again.
+
+=cut
+*/
 #define SV_CHECK_THINKFIRST(sv) if (SvTHINKFIRST(sv)) \
                                     sv_force_normal_flags(sv, 0)
 
@@ -2184,8 +2262,8 @@ Returns the hash for C<sv> created by C<L</newSVpvn_share>>.
             sv_utf8_upgrade(nsv);                      \
             sv_catsv_nomg(dsv, nsv);                   \
         } STMT_END
-#define sv_catpvn_nomg_maybeutf8(dsv, sstr, slen, is_utf8) \
-        sv_catpvn_flags(dsv, sstr, slen, (is_utf8)?SV_CATUTF8:SV_CATBYTES)
+#define sv_catpvn_nomg_maybeutf8(dsv, sstr, len, is_utf8) \
+        sv_catpvn_flags(dsv, sstr, len, (is_utf8)?SV_CATUTF8:SV_CATBYTES)
 
 #if defined(PERL_CORE) || defined(PERL_EXT)
 # define sv_or_pv_len_utf8(sv, pv, bytelen)          \
@@ -2211,21 +2289,16 @@ for the original SV is incremented.
 /*
 =for apidoc_section $SV
 
-=for apidoc Am|void|SvGETMAGIC|SV* sv
-Invokes C<L</mg_get>> on an SV if it has 'get' magic.  For example, this
-will call C<FETCH> on a tied variable.  This macro evaluates its
-argument more than once.
-
 =for apidoc Am|void|SvSETMAGIC|SV* sv
 Invokes C<L</mg_set>> on an SV if it has 'set' magic.  This is necessary
 after modifying a scalar, in case it is a magical variable like C<$|>
 or a tied variable (it calls C<STORE>).  This macro evaluates its
 argument more than once.
 
-=for apidoc Am|void|SvSetSV|SV* dsv|SV* ssv
-=for apidoc_item SvSetMagicSV
-=for apidoc_item SvSetSV_nosteal
-=for apidoc_item SvSetMagicSV_nosteal
+=for apidoc Am|void|SvSetMagicSV|SV* dsv|SV* ssv
+=for apidoc_item    SvSetMagicSV_nosteal
+=for apidoc_item    SvSetSV
+=for apidoc_item    SvSetSV_nosteal
 
 if C<dsv> is the same as C<ssv>, these do nothing.  Otherwise they all call
 some form of C<L</sv_setsv>>.  They may evaluate their arguments more than
@@ -2268,29 +2341,42 @@ existing size, but instead it is the total size C<sv> should be.
 Ensures that sv is a SVt_PV and that its SvCUR is 0, and that it is
 properly null terminated. Equivalent to sv_setpvs(""), but more efficient.
 
+=for apidoc Am|char *|SvPVCLEAR_FRESH|SV* sv
+
+Like SvPVCLEAR, but optimized for newly-minted SVt_PV/PVIV/PVNV/PVMG
+that already have a PV buffer allocated, but no SvTHINKFIRST.
+
 =cut
 */
 
 #define SvPVCLEAR(sv) sv_setpv_bufsize(sv,0,0)
+#define SvPVCLEAR_FRESH(sv) sv_setpv_freshbuf(sv)
 #define SvSHARE(sv) PL_sharehook(aTHX_ sv)
 #define SvLOCK(sv) PL_lockhook(aTHX_ sv)
 #define SvUNLOCK(sv) PL_unlockhook(aTHX_ sv)
 #define SvDESTROYABLE(sv) PL_destroyhook(aTHX_ sv)
 
-#define SvGETMAGIC(x) ((void)(UNLIKELY(SvGMAGICAL(x)) && mg_get(x)))
 #define SvSETMAGIC(x) STMT_START { if (UNLIKELY(SvSMAGICAL(x))) mg_set(x); } STMT_END
 
 #define SvSetSV_and(dst,src,finally) \
         STMT_START {                                   \
-            if (LIKELY((dst) != (src))) {              \
-                sv_setsv(dst, src);                    \
+            SV * src_ = src;                            \
+            SV * dst_ = dst;                            \
+            if (LIKELY((dst_) != (src_))) {             \
+                sv_setsv(dst_, src_);                   \
                 finally;                               \
             }                                          \
         } STMT_END
+
 #define SvSetSV_nosteal_and(dst,src,finally) \
         STMT_START {                                   \
-            if (LIKELY((dst) != (src))) {                      \
-                sv_setsv_flags(dst, src, SV_GMAGIC | SV_NOSTEAL | SV_DO_COW_SVSETSV);  \
+            SV * src_ = src;                            \
+            SV * dst_ = dst;                            \
+            if (LIKELY((dst_) != (src_))) {             \
+                sv_setsv_flags(dst_, src_,              \
+                        SV_GMAGIC                       \
+                      | SV_NOSTEAL                      \
+                      | SV_DO_COW_SVSETSV);             \
                 finally;                               \
             }                                          \
         } STMT_END
@@ -2374,18 +2460,25 @@ Returns a boolean as to whether or not C<sv> is a GV with a pointer to a GP
 #define isGV_with_GP(pwadak) \
         (((SvFLAGS(pwadak) & (SVp_POK|SVpgv_GP)) == SVpgv_GP)  \
         && (SvTYPE(pwadak) == SVt_PVGV || SvTYPE(pwadak) == SVt_PVLV))
-#define isGV_with_GP_on(sv)    STMT_START {                           \
-        assert (SvTYPE(sv) == SVt_PVGV || SvTYPE(sv) == SVt_PVLV); \
-        assert (!SvPOKp(sv));                                         \
-        assert (!SvIOKp(sv));                                         \
-        (SvFLAGS(sv) |= SVpgv_GP);                                    \
+
+#define isGV_with_GP_on(sv)                                            \
+    STMT_START {                                                      \
+        SV * sv_ = MUTABLE_SV(sv);                                     \
+        assert (SvTYPE(sv_) == SVt_PVGV || SvTYPE(sv_) == SVt_PVLV);   \
+        assert (!SvPOKp(sv_));                                        \
+        assert (!SvIOKp(sv_));                                        \
+        (SvFLAGS(sv_) |= SVpgv_GP);                                   \
     } STMT_END
-#define isGV_with_GP_off(sv)   STMT_START {                           \
-        assert (SvTYPE(sv) == SVt_PVGV || SvTYPE(sv) == SVt_PVLV); \
-        assert (!SvPOKp(sv));                                         \
-        assert (!SvIOKp(sv));                                         \
-        (SvFLAGS(sv) &= ~SVpgv_GP);                                   \
+
+#define isGV_with_GP_off(sv)                                           \
+    STMT_START {                                                       \
+        SV * sv_ = MUTABLE_SV(sv);                                     \
+        assert (SvTYPE(sv_) == SVt_PVGV || SvTYPE(sv_) == SVt_PVLV);   \
+        assert (!SvPOKp(sv_));                                         \
+        assert (!SvIOKp(sv_));                                        \
+        (SvFLAGS(sv_) &= ~SVpgv_GP);                                  \
     } STMT_END
+
 #ifdef PERL_CORE
 # define isGV_or_RVCV(kadawp) \
     (isGV(kadawp) || (SvROK(kadawp) && SvTYPE(SvRV(kadawp)) == SVt_PVCV))
@@ -2587,12 +2680,36 @@ Create a new IO, setting the reference count to 1.
  * trick and store them in SvANY for SvIV() (and friends) to use. */
 
 #  define SET_SVANY_FOR_BODYLESS_IV(sv) \
-        SvANY(sv) =   (XPVIV*)((char*)&(sv->sv_u.svu_iv) \
-                    - STRUCT_OFFSET(XPVIV, xiv_iv))
+    STMT_START {                                            \
+        SV * sv_ = MUTABLE_SV(sv);                          \
+        SvANY(sv_) =   (XPVIV*)((char*)&(sv_->sv_u.svu_iv)  \
+                    - STRUCT_OFFSET(XPVIV, xiv_iv));        \
+    } STMT_END
 
 #  define SET_SVANY_FOR_BODYLESS_NV(sv) \
-        SvANY(sv) =   (XPVNV*)((char*)&(sv->sv_u.svu_nv) \
-                    - STRUCT_OFFSET(XPVNV, xnv_u.xnv_nv))
+    STMT_START {                                            \
+        SV * sv_ = MUTABLE_SV(sv);                          \
+        SvANY(sv_) =   (XPVNV*)((char*)&(sv_->sv_u.svu_nv)  \
+                    - STRUCT_OFFSET(XPVNV, xnv_u.xnv_nv));  \
+    } STMT_END
+
+#if defined(PERL_CORE) && defined(USE_ITHREADS)
+/* Certain cases in Perl_ss_dup have been merged, by relying on the fact
+   that currently av_dup, gv_dup and hv_dup are the same as sv_dup.
+   If this changes, please unmerge ss_dup.
+   Likewise, sv_dup_inc_multiple() relies on this fact.  */
+#  define sv_dup_inc_NN(s,t)   SvREFCNT_inc_NN(sv_dup_inc(s,t))
+#  define av_dup(s,t)  MUTABLE_AV(sv_dup((const SV *)s,t))
+#  define av_dup_inc(s,t)      MUTABLE_AV(sv_dup_inc((const SV *)s,t))
+#  define hv_dup(s,t)  MUTABLE_HV(sv_dup((const SV *)s,t))
+#  define hv_dup_inc(s,t)      MUTABLE_HV(sv_dup_inc((const SV *)s,t))
+#  define cv_dup(s,t)  MUTABLE_CV(sv_dup((const SV *)s,t))
+#  define cv_dup_inc(s,t)      MUTABLE_CV(sv_dup_inc((const SV *)s,t))
+#  define io_dup(s,t)  MUTABLE_IO(sv_dup((const SV *)s,t))
+#  define io_dup_inc(s,t)      MUTABLE_IO(sv_dup_inc((const SV *)s,t))
+#  define gv_dup(s,t)  MUTABLE_GV(sv_dup((const SV *)s,t))
+#  define gv_dup_inc(s,t)      MUTABLE_GV(sv_dup_inc((const SV *)s,t))
+#endif
 
 /*
  * ex: set ts=8 sts=4 sw=4 et:
index 72c865d..10397b2 100644 (file)
@@ -118,33 +118,53 @@ $| = 1;
 #BEGIN { require '../lib/strict.pm'; "strict"->import() };
 #BEGIN { require '../lib/warnings.pm'; "warnings"->import() };
 
-# remove empty elements due to insertion of empty symbols via "''p1'" syntax
-@ARGV = grep($_,@ARGV) if $^O eq 'VMS';
+my $OS = $ENV{FAKE_OS} || $^O;
+
+my $is_vms   = $OS eq "VMS";
+my $is_win32 = $OS eq "MSWin32";
+my $is_os2   = $OS eq "os2";
 
-# String eval to avoid loading File::Glob on non-miniperl.
-# (Windows only uses this script for miniperl.)
-@ARGV = eval 'map glob, @ARGV' if $^O eq 'MSWin32';
+# remove empty elements due to insertion of empty symbols via "''p1'" syntax
+@ARGV = grep($_,@ARGV) if $is_vms;
 
 our $show_elapsed_time = $ENV{HARNESS_TIMER} || 0;
 
+my $dump_tests = 0;
+
 # Cheesy version of Getopt::Std.  We can't replace it with that, because we
 # can't rely on require working.
 {
+    my %opt_vars = (
+       benchmark => \$::benchmark,
+       core      => \$::core,
+       v         => \$::verbose,
+       torture   => \$::torture,
+       utf8      => \$::with_utf8,
+       utf16     => \$::with_utf16,
+       taintwarn => \$::taintwarn,
+       dumptests => \$dump_tests,
+    );
+
     my @argv = ();
     foreach my $idx (0..$#ARGV) {
-       push( @argv, $ARGV[$idx] ), next unless $ARGV[$idx] =~ /^-(\S+)$/;
-       $::benchmark = 1 if $1 eq 'benchmark';
-       $::core    = 1 if $1 eq 'core';
-       $::verbose = 1 if $1 eq 'v';
-       $::torture = 1 if $1 eq 'torture';
-       $::with_utf8 = 1 if $1 eq 'utf8';
-       $::with_utf16 = 1 if $1 eq 'utf16';
-       $::taintwarn = 1 if $1 eq 'taintwarn';
-       if ($1 =~ /^deparse(,.+)?$/) {
+       my $opt;
+       if ($ARGV[$idx] =~ /^-?-(\S+)$/) {
+           $opt = $1;
+       } else {
+           push @argv, $ARGV[$idx];
+           next;
+       }
+       if (my $ref = $opt_vars{$opt}) {
+           $$ref = 1;
+       }
+       elsif ($opt =~ /^deparse(,.+)?$/) {
            $::deparse = 1;
            $::deparse_opts = $1;
             _process_deparse_config();
        }
+       else {
+           die "Unknown option '$opt'\n";
+       }
     }
     @ARGV = @argv;
 }
@@ -157,6 +177,17 @@ if (-f 'TEST' && -f 'harness' && -d '../lib') {
 die "You need to run \"make test_prep\" first to set things up.\n"
   unless -e 'perl' or -e 'perl.exe' or -e 'perl.pm';
 
+if ($is_win32) {
+    # String eval to avoid loading File::Glob on non-miniperl.
+    # (Windows only uses this script for miniperl.)
+    my @argv;
+    if (eval '@argv = map glob, @ARGV; 1') {
+       @ARGV = @argv;
+    } else {
+       die "Failed to glob \@ARGV: $@";
+    }
+}
+
 # check leakage for embedders
 $ENV{PERL_DESTRUCT_LEVEL} = 2 unless exists $ENV{PERL_DESTRUCT_LEVEL};
 # check existence of all symbols
@@ -176,7 +207,7 @@ sub _find_files {
        opendir DIR, $dir or die "Trouble opening $dir: $!";
        foreach my $f (sort { $a cmp $b } readdir DIR) {
            next if $skip{$f};
-
+           $dir =~ s/(?<!\^)\.dir(;1)?$//i if $is_vms; # trim .DIR extension
            my $fullpath = "$dir/$f";
            if (-d $fullpath) {
                _find_files($patt, $fullpath);
@@ -222,7 +253,7 @@ sub _scan_test {
 
     close $script;
 
-    my $perl = $^O eq 'MSWin32' ? '.\perl' : './perl';
+    my $perl = $is_win32 ? '.\perl' : './perl';
     my $lib  = '../lib';
     my $run_dir;
     my $return_dir;
@@ -288,7 +319,7 @@ sub _cmd {
     }
     elsif ($type eq 'perl') {
         my $perl = $options->{perl};
-        my $redir = $^O eq 'VMS' ? '2>&1' : '';
+        my $redir = $is_vms ? '2>&1' : '';
 
         if ($ENV{PERL_VALGRIND}) {
             my $perl_supp = $options->{return_dir} ? "$options->{return_dir}/perl.supp" : "perl.supp";
@@ -379,7 +410,7 @@ sub _quote_args {
     foreach (split(/\s+/,$args)) {
        # In VMS protect with doublequotes because otherwise
        # DCL will lowercase -- unless already doublequoted.
-       $_ = q(").$_.q(") if ($^O eq 'VMS') && !/^\"/ && length($_) > 0;
+       $_ = q(").$_.q(") if $is_vms && !/^\"/ && length($_) > 0;
        $argstring = $argstring . ' ' . $_;
     }
     return $argstring;
@@ -391,7 +422,9 @@ sub _populate_hash {
 }
 
 sub _tests_from_manifest {
-    my ($extensions, $known_extensions) = @_;
+    my ($extensions, $known_extensions, $all) = @_;
+    s/\bCwd\b/PathTools/, s!\bList/Util\b!Scalar/List/Utils!
+       for $extensions, $known_extensions;
     my %skip;
     my %extensions = _populate_hash($extensions);
     my %known_extensions = _populate_hash($known_extensions);
@@ -402,10 +435,14 @@ sub _tests_from_manifest {
     }
 
     my @results;
+    my %non_ext;
+    push @results, \%non_ext if $all;
     my $mani = '../MANIFEST';
     if (open(MANI, $mani)) {
        while (<MANI>) {
-           if (m!^((?:cpan|dist|ext)/(\S+)/+(?:[^/\s]+\.t|test\.pl)|lib/\S+?(?:\.t|test\.pl))\s!) {
+           chomp;
+           my ($file)= split /\t/, $_;
+           if ($file =~ m!^((?:cpan|dist|ext)/(\S+)/+(?:[^/\s]+\.t|test\.pl)|lib/\S+?(?:\.t|test\.pl))\z!) {
                my $t = $1;
                my $extension = $2;
 
@@ -456,6 +493,17 @@ sub _tests_from_manifest {
                    $::path_to_name{$path} = $t;
                }
            }
+           elsif ($file=~m!/(?:test\.pl|[^/\s]+\.t)\z! and $file ne "t/test.pl") {
+               my $munged = $file;
+               next if $munged=~m!^(?:t/)?os2/!        and !$is_os2;
+               next if $munged=~m!^(?:t/)?win32/!      and !$is_win32;
+               next if $munged=~m!^(?:t/)?japh/!       and !($::torture or $ENV{PERL_TORTURE_TEST});
+               next if $munged=~m!^(?:t/)?benchmark/!  and !($::benchmark or $ENV{PERL_BENCHMARK});
+               next if $munged=~m!^(?:t/)?bigmem/!     and !$ENV{PERL_TEST_MEMORY};
+               $munged =~ s!t/!! or $munged = "../$munged";
+
+               $non_ext{$munged}++;
+           }
        }
        close MANI;
     } else {
@@ -464,18 +512,62 @@ sub _tests_from_manifest {
     return @results;
 }
 
+sub dump_tests {
+    my ($ary) = @_;
+    for my $test (sort @$ary) {
+        # convert it to a path from the root of the repo
+        $test=~s!^\.\./!! or $test=~s!^!t/!;
+        print "$test\n";
+    }
+    exit(0);
+}
+
+sub filter_taint_tests {
+    my $tests = shift;
+    require Config;
+    return unless $Config::Config{taint_disabled} eq "define";
+
+    # These are test files which are known to fail with -DNO_TAINT_SUPPORT
+    # but which do not have "taint" in their name, nor have shebang lines
+    # with -t or -T in them. So we exclude them specifically instead.
+    my %known_tainter = map { $_ => 0 } (
+        '../cpan/Test-Harness/t/regression.t',
+        '../cpan/Test-Harness/t/source_handler.t',
+        '../cpan/Test-Harness/t/compat/inc-propagation.t',
+    );
+    @$tests = grep {
+        my $file = $_;
+        open my $ifh, "<", $file
+            or die "Failed to read: '$file': $!";
+        my $line = <$ifh>;
+        my $keep = $file=~/taint/ ? 0 : ($known_tainter{$file} // 1);
+        if ($line=~/^#!.*perl\s+-(\w+)/) {
+            my $switch = $1;
+            if ($switch =~ s/[Tt]//) {
+                $keep = 0;
+            }
+        }
+        $keep
+    } @$tests;
+}
+
+
 unless (@ARGV) {
     # base first, as TEST bails out if that can't run
     # then comp, to validate that require works
     # then run, to validate that -M works
     # then we know we can -MTestInit for everything else, making life simpler
-    foreach my $dir (qw(base comp run cmd io re opbasic op uni mro perf)) {
+
+    # NOTE that _find_tests() is recursive, unlike what test_harness uses.
+    foreach my $dir (qw(base comp run cmd io re opbasic op uni mro class perf test_pl)) {
        _find_tests($dir);
     }
     unless ($::core) {
        _find_tests('porting');
         _find_tests("lib");
     }
+    _find_tests('win32') if $is_win32;
+    _find_tests('os2')  if $is_os2;
     # Config.pm may be broken for make minitest. And this is only a refinement
     # for skipping tests on non-default builds, so it is allowed to fail.
     # What we want to do is make a list of extensions which we did not build.
@@ -504,13 +596,14 @@ unless (@ARGV) {
     # something is that badly wrong.
     push @ARGV, _tests_from_manifest($extensions, $known_extensions);
     unless ($::core) {
-       _find_tests('japh') if $::torture;
+       _find_tests('japh') if $::torture or $ENV{PERL_TORTURE_TEST};
        _find_tests('benchmark') if $::benchmark or $ENV{PERL_BENCHMARK};
        _find_tests('bigmem') if $ENV{PERL_TEST_MEMORY};
     }
 }
 @ARGV= do {
     my @order= (
+       "test_pl",
        "base",
        "comp",
        "run",
@@ -519,8 +612,10 @@ unless (@ARGV) {
        "re",
        "opbasic",
        "op",
+       "op/hook",
        "uni",
        "mro",
+       "class",
        "lib",
        "ext",
        "dist",
@@ -541,6 +636,10 @@ unless (@ARGV) {
     } @ARGV;
 };
 
+dump_tests(\@ARGV) if $dump_tests;
+
+filter_taint_tests(\@ARGV);
+
 if ($::deparse) {
     _testprogs('deparse', '',   @ARGV);
 }
@@ -630,7 +729,7 @@ EOT
        my $te = $::path_to_name{$test} . '.'
                    x ($dotdotdot - length($::path_to_name{$test})) .' ';
 
-       if ($^O ne 'VMS') {  # defer printing on VMS due to piping bug
+       if (!$is_vms) {  # defer printing on VMS due to piping bug
            print $te;
            $te = '';
        }
@@ -648,7 +747,7 @@ EOT
        my %todo;
        while (<$results>) {
            next if /^\s*$/; # skip blank lines
-           if (/^1..$/ && ($^O eq 'VMS')) {
+           if (/^1..$/ && $is_vms) {
                # VMS pipe bug inserts blank lines.
                my $l2 = <$results>;
                if ($l2 =~ /^\s*$/) {
@@ -909,7 +1008,7 @@ sub gather_conf_platform_info {
        @platform = grep /name|cpu/, <$fh>;
        chomp $_ for @platform;
     }
-    unshift @platform, $^O;
+    unshift @platform, $OS;
 
     return (
        conf => \%conf,
index d3048e7..36a3a00 100644 (file)
@@ -1,6 +1,6 @@
 #!./perl
 
-print "1..13\n";
+print "1..15\n";
 
 print "ok 1\n" if 1;
 print "not ok 1\n" unless 1;
@@ -54,3 +54,19 @@ print "not ok 12\n" if $x > 0;
 # This used to cause a segfault
 $x = "".("".do{"foo" for (1)});
 print "ok 13\n";
+
+$x = 0;
+do { ++$x } while 0;
+if ($x == 1) {
+    print "ok 14\n";
+} else {
+    print "not ok 14 # $x\n";
+}
+
+$x = 0;
+do { ++$x } until 1;
+if ($x == 1) {
+    print "ok 15\n";
+} else {
+    print "not ok 15 # $x\n";
+}
index 0999ff9..243ac6e 100644 (file)
@@ -106,7 +106,7 @@ sub somesub {
 &somesub(27, 'main', __FILE__, __LINE__);
 
 package foo;
-&main'somesub(28, 'foo', __FILE__, __LINE__);
+&main::somesub(28, 'foo', __FILE__, __LINE__);
 
 package main;
 $i = 28;
@@ -151,28 +151,28 @@ sub iseof {
 
 {package foo;
 
- sub main'file_package {
+ sub main::file_package {
         local(*F) = @_;
 
         open(F, 'Cmd_subval.tmp') || die "can't open: $!\n";
-       $main'i++;
-        eof F ? print "not ok $main'i\n" : print "ok $main'i\n";
+       $main::i++;
+        eof F ? print "not ok $main::i\n" : print "ok $main::i\n";
  }
 
- sub main'info_package {
+ sub main::info_package {
         local(*F);
 
         open(F, 'Cmd_subval.tmp') || die "can't open: $!\n";
-       $main'i++;
-        eof F ? print "not ok $main'i\n" : print "ok $main'i\n";
+       $main::i++;
+        eof F ? print "not ok $main::i\n" : print "ok $main::i\n";
         &iseof(*F);
  }
 
  sub iseof {
         local(*UNIQ) = @_;
 
-       $main'i++;
-        eof UNIQ ? print "not ok $main'i\n" : print "ok $main'i\n";
+       $main::i++;
+        eof UNIQ ? print "not ok $main::i\n" : print "ok $main::i\n";
  }
 }
 
index fa28868..7b19513 100644 (file)
@@ -1,5 +1,10 @@
 #!./perl
 
+BEGIN {
+    @INC = qw(. ../lib);
+    chdir 't' if -d 't';
+}
+
 print "1..14\n";
 
 $blurfl = 123;
@@ -13,11 +18,14 @@ $bar = 4;
 
 {
     package ABC;
+    no warnings qw(syntax deprecated);
     $blurfl = 5;
     $main'a = $'b;
 }
-
-$ABC'dyick = 6;
+{
+    no warnings qw(syntax deprecated);
+    $ABC'dyick = 6;
+}
 
 $xyz = 2;
 
@@ -28,10 +36,13 @@ $ABC = join(':', sort(keys %ABC::));
 if ('a' lt 'A') {
     print $xyz eq 'bar:main:new:xyz:ABC' ? "ok 1\n" : "not ok 1 '$xyz'\n";
 } else {
-    print $xyz eq 'ABC:bar:main:new:xyz' ? "ok 1\n" : "not ok 1 '$xyz'\n";
+    print $xyz eq 'ABC:BEGIN:bar:main:new:xyz' ? "ok 1\n" : "not ok 1 '$xyz'\n";
 }    
-print $ABC eq 'blurfl:dyick' ? "ok 2\n" : "not ok 2 '$ABC'\n";
-print $main'blurfl == 123 ? "ok 3\n" : "not ok 3\n";
+print $ABC eq 'BEGIN:blurfl:dyick' ? "ok 2\n" : "not ok 2 '$ABC'\n";
+{
+    no warnings qw(syntax deprecated);
+    print $main'blurfl == 123 ? "ok 3\n" : "not ok 3\n";
+}
 
 package ABC;
 
index 8bca628..dbd5ecc 100644 (file)
@@ -367,11 +367,14 @@ like($@, qr/BEGIN failed--compilation aborted/, 'BEGIN 7' );
   is(defined &zlonk, '', 'but no body defined');
 }
 
-# [perl #113016] CORE::print::foo
-sub CORE'print'foo { 43 } # apostrophes intentional; do not tempt fate
-sub CORE'foo'bar { 43 }
-is CORE::print::foo, 43, 'CORE::print::foo is not CORE::print ::foo';
-is scalar eval "CORE::foo'bar", 43, "CORE::foo'bar is not an error";
+{
+    no warnings;
+    # [perl #113016] CORE::print::foo
+    sub CORE'print'foo { 43 } # apostrophes intentional; do not tempt fate
+    sub CORE'foo'bar { 43 }
+    is CORE::print::foo, 43, 'CORE::print::foo is not CORE::print ::foo';
+    is scalar eval "CORE::foo'bar", 43, "CORE::foo'bar is not an error";
+}
 
 # bug #71748
 eval q{
@@ -448,8 +451,10 @@ END
 eval 's/${<<END}//';
 eval 's//${<<END}/';
 print "ok ", ++$test, " - unterminated here-docs in s/// in string eval\n";
-
-sub 'Hello'_he_said (_);
+{
+    no warnings qw(syntax deprecated);
+    sub 'Hello'_he_said (_);
+}
 is prototype "Hello::_he_said", '_', 'initial tick in sub declaration';
 
 {
@@ -471,11 +476,14 @@ is $pkg, 3, '[perl #114942] for my $foo()){} $foo';
 
 # Check that format 'Foo still works after removing the hack from
 # force_word
-$test++;
-format 'one =
+{
+    no warnings qw(syntax deprecated);
+    $test++;
+    format 'one =
 ok @<< - format 'foo still works
 $test
 .
+}
 {
     local $~ = "one";
     write();
index 39891b4..48ae0d2 100644 (file)
@@ -18,7 +18,7 @@ BEGIN {
 # strict
 use strict;
 
-print "1..215\n";
+print "1..216\n";
 
 my $i = 1;
 
@@ -892,3 +892,24 @@ $_ = sub ($$$$$$$) {};
 @_ = (1, 2, 3, prototype(), 4, 5, 6);
 print "not " unless "@_" eq '1 2 3 $$$$$$$ 4 5 6';
 print "ok ", $i++, " - [perl #123514] (got @_)\n";
+
+{
+    my $weird_failure = q<>;
+
+    if (eval 'sub scalarref (\$) { }; scalarref( sub {} ); 1') {
+        print "not ok $i: Unexpected scalarref success!\n";
+    }
+    else {
+        if ($@ !~ m/anonymous subroutine/ || $@ !~ m/scalarref/) {
+            $weird_failure = $@;
+
+            $weird_failure =~ s/^/# /m;
+
+            print "# Unexpected error (or none):$/$weird_failure";
+        }
+
+        print( ($weird_failure ? 'not ok' : 'ok') . " $i - anonsub passed to \\\$\n" );
+    }
+
+    $i++;
+}
index f79480f..aecacd7 100644 (file)
@@ -1,5 +1,9 @@
 #!./perl
 
+# NOTE this script messes with the perl debugger flags, if you run
+# it under the perl debugger (perl -d) it might not work as expected.
+# Look for code related to $^P below and adjust accordingly.
+
 BEGIN {
     chdir 't' if -d 't';
     @INC = '.';
@@ -14,10 +18,14 @@ sub do_require {
 }
 
 # don't make this lexical
-$i = 1;
+our $i = 1;
 
-my @files_to_delete = qw (bleah.pm bleah.do bleah.flg urkkk.pm urkkk.pmc
-krunch.pm krunch.pmc whap.pm whap.pmc);
+our @module_true_tests; # this is set up in a BEGIN later on.
+our $module_true_test_count; # this is set up in a BEGIN later on.
+my @files_to_delete = qw (bleah.pm bleah.do bleah.flg blorn.pm blunge.pm
+urkkk.pm urkkk.pmc krunch.pm krunch.pmc whap.pm whap.pmc
+Demo1.pm Demo2.pm Demo3.pm Demo4.pm);
+push @files_to_delete, "$_->[0].pm" for @module_true_tests;
 
 # there may be another copy of this test script running, or the files may
 # just not have been deleted at the end of the last run; if the former, we
@@ -26,14 +34,13 @@ krunch.pm krunch.pmc whap.pm whap.pmc);
 # to why there might be multiple execution of this test file, I don't
 # know; but this is an experiment to see if random smoke failures go away.
 
-if (grep -e, @files_to_delete) {
+if (!$ENV{NO_SLEEP} and grep -e, @files_to_delete) {
     print "# Sleeping for 20 secs waiting for other process to finish\n";
     sleep 20;
 }
 
-
 my $Is_UTF8   = (${^OPEN} || "") =~ /:utf8/;
-my $total_tests = 58;
+my $total_tests = 58 + $module_true_test_count;
 if ($Is_UTF8) { $total_tests -= 3; }
 print "1..$total_tests\n";
 
@@ -194,6 +201,7 @@ print "ok $i - require() context\n";
 1;
 **BLEAH**
 );
+my ($foo,@foo);
                               delete $INC{"bleah.pm"}; ++$::i;
 $foo = eval q{require bleah}; delete $INC{"bleah.pm"}; ++$::i;
 @foo = eval q{require bleah}; delete $INC{"bleah.pm"}; ++$::i;
@@ -348,6 +356,231 @@ if (defined &DynaLoader::boot_DynaLoader) {
     print "${not}ok $i - require does not localise %^H at run time\n";
 }
 
+
+BEGIN {
+    # These are the test for feature 'module_true', which when in effect
+    # avoids the requirement for a module to return a true value, and
+    # in fact forces the return value to be a simple "true"
+    # (eg, PL_sv_yes, aka 1).
+    # we have a lot of permutations of how this code might trigger, and
+    # etc. so we set up the test set here.
+
+    my @params = (
+            'use v5.37',
+            'use feature ":5.38"',
+            'use feature ":all"',
+            'use feature "module_true"',
+            'no feature "module_true"',
+            '',
+        );
+    my @module_code = (
+            '',
+            'sub foo {};',
+            'sub foo {}; 0;',
+            'sub foo {}; return 0;',
+            'sub foo {}; return (0,0,"some_true_value");',
+            'sub foo {}; return ("some_true_value",1,1);',
+            'sub foo {}; (0, return 0);',
+            'sub foo {}; "some_true_value";',
+            'sub foo {}; return "some_true_value";',
+            'sub foo {}; (0, return "some_true_value");',
+            'sub foo {}; (0, return "some_true_value");',
+            undef,
+        );
+    my @eval_code = (
+            'use PACK;',
+            'require PACK;',
+            '$return_val = require PACK;',
+            '@return_val = require PACK;',
+            'require "PACK.pm";',
+            '$return_val = require "PACK.pm";',
+            '@return_val = require "PACK.pm";',
+    );
+
+    # build a list of tuples. for now this just keeps the test
+    # indent level reasonable for the main test loop, but we could
+    # compute this at BEGIN time and then add the number of tests
+    # to the total count
+    my %seen;
+    foreach my $debugger_state (0,0xA) {
+        foreach my $param_str (@params) {
+            foreach my $mod_code (@module_code) {
+                foreach my $eval_code (@eval_code) {
+                    my $pack_name= sprintf "mttest%d", 0+@module_true_tests;
+                    my $eval_code_munged= $eval_code=~s/PACK/$pack_name/r;
+                    # this asks the debugger to preserve lines from evals.
+                    # it causes nextstate ops to convert to dbstate ops,
+                    # and we need to check that we can handle both cases.
+                    $eval_code_munged= '$^P = ' . $debugger_state .
+                                       '; ' . $eval_code_munged
+                        if $debugger_state;
+
+                    my $param_str_munged = $param_str;
+                    $param_str_munged .= ";\n" if $param_str;
+
+                    my $this_code= defined($mod_code)
+                        ? "package PACK;\n$param_str_munged$mod_code\n"
+                        : "";
+
+                    next if $seen{$eval_code_munged . "|" . $this_code}++;
+                    $this_code=~s/PACK/$pack_name/g;
+
+                    push @module_true_tests,
+                        [$pack_name, $param_str, $this_code, $mod_code, $eval_code_munged];
+
+                    if ($this_code!~/use/ and $this_code !~ /some_true_value/) {
+                        $module_true_test_count += 2;
+                    } elsif ($eval_code_munged=~/return_val/) {
+                        $module_true_test_count += 2;
+                    } else {
+                        $module_true_test_count += 1;
+                    }
+                }
+            }
+        }
+    }
+
+    # and more later on
+    $module_true_test_count += 12;
+}
+
+{
+    foreach my $tuple (@module_true_tests) {
+        my ($pack_name, $param_str, $this_code, $mod_code, $eval_code)= @$tuple;
+
+        write_file("$pack_name.pm", $this_code);
+        %INC = ();
+        # these might be assigned to in the $eval_code
+        my $return_val;
+        my @return_val;
+
+        my $descr= !$this_code ? "empty file loaded" :
+                  !$mod_code ? "default behavior with `$mod_code`" :
+                  "`$param_str` with `$mod_code`";
+        $descr .= " via `$eval_code`";
+
+        my $not = eval "$eval_code 1" ? "" : "not ";
+        my $err= $not ? $@ : "";
+        $^P = 0; # turn the debugger off after the eval.
+
+        if ($this_code=~/use/) {
+            # test the various ways the feature can be turned on
+            $i++;
+            print "${not}ok $i - (AA) $descr did not blow up\n";
+            if ($not) {
+                # we died, show the error:
+                print "# error: $_\n" for split /\n/, $err;
+            }
+            if ($eval_code=~/\$return_val/) {
+                $not = ($return_val && $return_val eq '1') ? "" : "not ";
+                $i++;
+                print "${not}ok $i - (AB) scalar return value "
+                      . "is simple true value <$return_val>\n";
+            }
+            elsif ($eval_code=~/\@return_val/) {
+                $not = (@return_val && $return_val[0] eq '1') ? "" : "not ";
+                $i++;
+                print "${not}ok $i - (AB) list return value "
+                      . "is simple true value <$return_val[0]>\n";
+            }
+        } elsif ($this_code!~/some_true_value/) {
+            # test cases where the feature is not on and return false
+            my $not= $not ? "" : "not ";
+            $i++;
+            print "${not}ok $i - (BA) $descr should die\n";
+            if ($not) {
+                print "# error: $_\n" for split /\n/, $err;
+                print "# code: $_\n" for split /\n/, $this_code || "NO CODE";
+            }
+            $not= $err=~/did not return a true value/ ? "" : "not ";
+            $i++;
+            print "${not}ok $i - (BB) saw expected error\n";
+        } else {
+            #test cases where the feature is not on and return true
+            $i++;
+            print "${not}ok $i - (CA) $descr should not die\n";
+            if ($eval_code=~/return_val/) {
+                $not = ($return_val || @return_val) ? "" : "not ";
+                $i++;
+                print "${not}ok $i - (CB) returned expected value\n";
+            }
+            if ($not) {
+                print "# error: $_\n" for split /\n/, $err;
+                print "# code: $_\n" for split /\n/, $this_code || "NO CODE";
+            }
+        }
+    }
+
+    {
+        write_file('blorn.pm', "package blorn;\nuse v5.37;\nsub foo {};\nno feature 'module_true';\n");
+
+        local $@;
+        my $result = 0;
+        my $not = eval "\$result = require 'blorn.pm'; 1" ? 'not ' : '';
+        $i++;
+        print "${not}ok $i - disabling module_true should not return a true value ($result)\n";
+        $not = $@ =~ /did not return a true value/ ? '' : 'not ';
+        $i++;
+        print "${not}ok $i - ... and should fail to compile without a true return value\n";
+    }
+
+    {
+        write_file('blunge.pm', "package blunge;\nuse feature ':5.38';\n".
+                                "sub bar {};\nno feature 'module_true';\n3;\n");
+
+        local $@;
+        my $result = 0;
+        eval "\$result = require 'blunge.pm'; 1";
+        my $not = $result == 3 ? '' : 'not ';
+        $i++;
+        print "${not}ok $i - disabling 'module_true' and should not override module's return value ($result)\n";
+        $not = $@ eq '' ? '' : 'not ';
+        $i++;
+        print "${not}ok $i - ... but should compile successfully with a provided return value\n";
+    }
+    for $main::test_mode (1..4) {
+        my $pack= "Demo$main::test_mode";
+        write_file("$pack.pm", sprintf(<<'CODE', $pack)=~s/^#//mgr);
+#package %s;
+#use feature 'module_true';
+#
+#return 1 if $main::test_mode == 1;
+#return 0 if $main::test_mode == 2;
+#
+#{
+#  no feature 'module_true';
+#  return 0 if $main::test_mode == 3;
+#}
+#no feature 'module_true';
+CODE
+        local $@;
+        my $result = 0;
+        my $ok= eval "\$result = require '$pack.pm'; 1";
+        my $err= $ok ? "" : $@;
+        if ($main::test_mode >= 3) {
+            my $not = $ok  ? 'not ' : '';
+            $i++;
+            print "${not}ok $i - in $pack disabling module_true "
+                  . "should not return a true value ($result)\n";
+            $not = $err =~ /did not return a true value/ ? '' : 'not ';
+            $i++;
+            print "${not}ok $i - ... and should throw the expected error\n";
+            if ($not) {
+                print "# $_\n" for split /\n/, $err;
+            }
+        } else {
+            my $not = $ok ? '' : 'not ';
+            $i++;
+            print "${not}ok $i - in $pack enabling module_true "
+                  . "should not return a true value ($result)\n";
+            $not = $result == 1 ? "" : "not ";
+            $i++;
+            print "${not}ok $i - ... and should return a simple true value\n";
+        }
+    }
+
+}
+
 ##########################################
 # What follows are UTF-8 specific tests. #
 # Add generic tests before this point.   #
@@ -379,7 +612,7 @@ foreach (sort keys %templates) {
 
 END {
     foreach my $file (@files_to_delete) {
-       1 while unlink $file;
+        1 while unlink $file;
     }
 }
 
index c303d13..6344266 100644 (file)
@@ -8,6 +8,45 @@ BEGIN {
     @INC = '../lib';              # pick up only this build's lib
 }
 
+##############################################################################
+# Test files which cannot be executed at the same time.
+#
+# List all files which might fail when executed at the same time as another
+# test file from the same test directory. Being listed here does not mean
+# the test will be run by itself, it just means it won't be run at the same
+# time as any other file in the same test directory, it might be run at the
+# same time as a file from a different test directory.
+#
+# Ideally this is always empty.
+#
+# Example: ../cpan/IO-Zlib/t/basic.t
+#
+my @_must_be_executed_serially = qw(
+);
+my %must_be_executed_serially = map { $_ => 1 } @_must_be_executed_serially;
+##############################################################################
+
+##############################################################################
+# Test files which must be executed alone.
+#
+# List files which cannot be run at the same time as any other test. Typically
+# this is used to handle tests which are sensitive to load and which might
+# fail if they were run at the same time as something load intensive.
+#
+# Example: ../dist/threads-shared/t/waithires.t
+#
+my @_must_be_executed_alone = qw();
+my %must_be_executed_alone = map { $_ => 1 } @_must_be_executed_alone;
+
+my $OS = $ENV{FAKE_OS} || $^O;
+my $is_linux = $OS eq "linux";
+my $is_win32 = $OS eq "MSWin32";
+
+if (!$is_linux) {
+    $must_be_executed_alone{"../dist/threads-shared/t/waithires.t"} = 1;
+}
+##############################################################################
+
 my $torture; # torture testing?
 
 use TAP::Harness 3.13;
@@ -25,7 +64,13 @@ $Verbose++ while @ARGV && $ARGV[0] eq '-v' && shift;
 my $htoolnm;
 my $hgrind_ct;
 
-if ($ARGV[0] && $ARGV[0] eq '-torture') {
+my $dump_tests = 0;
+if ($ARGV[0] && $ARGV[0] =~ /^-?-dumptests$/) {
+    shift;
+    $dump_tests = 1;
+}
+
+if ($ARGV[0] && $ARGV[0] =~ /^-?-torture$/) {
     shift;
     $torture = 1;
 }
@@ -39,29 +84,7 @@ my (@tests, @re, @anti_re);
 # [.VMS]TEST.COM calls harness with empty arguments, so clean-up @ARGV
 @ARGV = grep $_ && length( $_ ) => @ARGV;
 
-sub _extract_tests;
-sub _extract_tests {
-    # This can probably be done more tersely with a map, but I doubt that it
-    # would be as clear
-    my @results;
-    foreach (@_) {
-       my $ref = ref $_;
-       if ($ref) {
-           if ($ref eq 'ARRAY') {
-               push @results, _extract_tests @$_;
-           } elsif ($ref eq 'HASH') {
-               push @results, _extract_tests values %$_;
-           } else {
-               die "Unknown reference type $ref";
-           }
-       } else {
-           push @results, glob $_;
-       }
-    }
-    @results;
-}
-
-while ($ARGV[0] && $ARGV[0]=~/^-(n?)re/) {
+while ($ARGV[0] && $ARGV[0]=~/^-?-(n?)re/) {
     my $ary= $1 ? \@anti_re : \@re;
 
     if ( $ARGV[0] !~ /=/ ) {
@@ -76,6 +99,7 @@ while ($ARGV[0] && $ARGV[0]=~/^-(n?)re/) {
 
 my $jobs = $ENV{TEST_JOBS};
 my ($rules, $state, $color);
+
 if ($ENV{HARNESS_OPTIONS}) {
     for my $opt ( split /:/, $ENV{HARNESS_OPTIONS} ) {
         if ( $opt =~ /^j(\d*)$/ ) {
@@ -90,6 +114,195 @@ if ($ENV{HARNESS_OPTIONS}) {
     }
 }
 
+$jobs ||= 1;
+
+my %total_time;
+sub _compute_tests_and_ordering($) {
+    my @tests = $_[0]->@*;
+
+    my %dir;
+    my %all_dirs;
+    my %map_file_to_dir;
+
+    if (!$dump_tests) {
+        require App::Prove::State;
+        if (!$state) {
+            # silence unhelpful warnings from App::Prove::State about not having
+            # a save state, unless we actually set the PERL_TEST_STATE we don't care
+            # and we don't need to know if its fresh or not.
+            local $SIG{__WARN__} = $ENV{PERL_TEST_STATE} ? $SIG{__WARN__} : sub {
+                return if $_[0] and $_[0]=~/No saved state/;
+                warn $_[0];
+            };
+            my $state_file = $ENV{PERL_TEST_STATE_FILE} // 'test_state';
+            if ($state_file) { # set PERL_TEST_STATE_FILE to 0 to skip this
+                $state = App::Prove::State->new({ store => $state_file });
+                $state->apply_switch('save');
+                $state->apply_switch('slow') if $jobs > 1;
+            }
+        }
+        # For some reason get_tests returns *all* the tests previously run,
+        # (in the right order), not simply the selection in @tests
+        # (in the right order). Not sure if this is a bug or a feature.
+        # Whatever, *we* are only interested in the ones that are in @tests
+        my %seen;
+        @seen{@tests} = ();
+        @tests = grep {exists $seen{$_} } $state->get_tests(0, @tests);
+    }
+
+    my %times;
+    if ($state) {
+        # Where known, collate the elapsed times by test name
+        foreach ($state->results->tests()) {
+            $times{$_->name} = $_->elapsed();
+        }
+    }
+
+    my %partial_serials;
+    # Preprocess the list of tests
+    for my $file (@tests) {
+        if ($is_win32) {
+            $file =~ s,\\,/,g; # canonicalize path
+        };
+
+        # Keep a list of the distinct directory names, and another list of
+        if ($file =~ m! \A ( (?: \.\. / )?
+                                .*?
+                            )             # $1 is the directory path name
+                            /
+                            ( [^/]* \. (?: t | pl ) ) # $2 is the test name
+                        \z !x)
+        {
+            my $path = $1;
+            my $name = $2;
+
+            $all_dirs{$path} = 1;
+            $map_file_to_dir{$file} = $path;
+            # is this is a file that requires we do special processing
+            # on the directory as a whole?
+            if ($must_be_executed_serially{$file}) {
+                $partial_serials{$path} = 1;
+            }
+        }
+    }
+
+    my %split_partial_serials;
+
+    my @alone_files;
+    # Ready to figure out the timings.
+    for my $file (@tests) {
+        my $file_dir = $map_file_to_dir{$file};
+
+        # if this is a file which must be processed alone
+        if ($must_be_executed_alone{$file}) {
+            push @alone_files, $file;
+            next;
+        }
+
+        # Special handling is needed for a directory that has some test files
+        # to execute serially, and some to execute in parallel.  This loop
+        # gathers information that a later loop will process.
+        if (defined $partial_serials{$file_dir}) {
+            if ($must_be_executed_serially{$file}) {
+                # This is a file to execute serially.  Its time contributes
+                # directly to the total time for this directory.
+                $total_time{$file_dir} += $times{$file} || 0;
+
+                # Save the sequence number with the file for now; below we
+                # will come back to it.
+                push $split_partial_serials{$file_dir}{seq}->@*, [ $1, $file ];
+            }
+            else {
+                # This is a file to execute in parallel after all the
+                # sequential ones are done.  Save its time in the hash to
+                # later calculate its time contribution.
+                push $split_partial_serials{$file_dir}{par}->@*, $file;
+                $total_time{$file} = $times{$file} || 0;
+            }
+        }
+        else {
+            # Treat every file in each non-serial directory as its own
+            # "directory", so that it can be executed in parallel
+            $dir{$file} = { seq => $file };
+            $total_time{$file} = $times{$file} || 0;
+        }
+    }
+
+    undef %all_dirs;
+
+    # Here, everything is complete except for the directories that have both
+    # serial components and parallel components.  The loop just above gathered
+    # the information required to finish setting those up, which we now do.
+    for my $partial_serial_dir (keys %split_partial_serials) {
+
+        # Look at just the serial portion for now.
+        my @seq_list = $split_partial_serials{$partial_serial_dir}{seq}->@*;
+
+        # The 0th element contains the sequence number; the 1th element the
+        # file name.  Get the name, sorted first by the number, then by the
+        # name.  Doing it this way allows sequence numbers to be varying
+        # length, and still get a numeric sort
+        my @sorted_seq_list = map { $_->[1] }
+                                sort {    $a->[0] <=>    $b->[0]
+                                    or lc $a->[1] cmp lc $b->[1] } @seq_list;
+
+        # Now look at the tests to run in parallel.  Sort in descending order
+        # of execution time.
+        my @par_list = sort sort_by_execution_order
+                        $split_partial_serials{$partial_serial_dir}{par}->@*;
+
+        # The total time to execute this directory is the serial time (already
+        # calculated in the previous loop) plus the parallel time.  To
+        # calculate an approximate parallel time, note that the minimum
+        # parallel time is the maximum of each of the test files run in
+        # parallel.  If the number of parallel jobs J is more than the number
+        # of such files, N, it could be that all N get executed in parallel,
+        # so that maximum is the actual value.  But if N > J, a second, or
+        # third, ...  round will be required.  The code below just takes the
+        # longest-running time for each round and adds that to the previous
+        # total.  It is an imperfect estimate, but not unreasonable.
+        my $par_time = 0;
+        for (my $i = 0; $i < @par_list; $i += $jobs) {
+            $par_time += $times{$par_list[$i]} || 0;
+        }
+        $total_time{$partial_serial_dir} += $par_time;
+
+        # Now construct the rules.  Each of the parallel tests is made into a
+        # single element 'seq' structure, like is done for all the other
+        # parallel tests.
+        @par_list = map { { seq => $_ } } @par_list;
+
+        # Then the directory is ordered to have the sequential tests executed
+        # first (serially), then the parallel tests (in parallel)
+
+        $dir{$partial_serial_dir} =
+                                { 'seq' => [ { seq => \@sorted_seq_list },
+                                             { par => \@par_list        },
+                                           ],
+                                };
+    }
+
+    #print STDERR __LINE__, join "\n", sort sort_by_execution_order keys %dir
+
+    # Generate T::H schedule rules that run the contents of each directory
+    # sequentially.
+    my @seq = { par => [ map { $dir{$_} } sort sort_by_execution_order
+                                                                    keys %dir
+                        ]
+               };
+
+    # and lastly add in the files which must be run by themselves without
+    # any other tests /at all/ running at the same time.
+    push @seq, map { +{ seq => $_ } } sort @alone_files if @alone_files;
+
+    return \@seq;
+}
+
+sub sort_by_execution_order {
+    # Directories, ordered by total time descending then name ascending
+    return $total_time{$b} <=> $total_time{$a} || lc $a cmp lc $b;
+}
+
 if (@ARGV) {
     # If you want these run in speed order, just use prove
 
@@ -114,136 +327,53 @@ if (@ARGV) {
     # but for now, run all directories in sequence.
 
     unless (@tests) {
-       my @seq = <base/*.t>;
+        my @seq = <base/*.t>;
+        push @tests, @seq;
 
-        my @last;
-       my @next = qw(comp run cmd);
+        my (@next, @last);
 
         # The remaining core tests are either intermixed with the non-core for
         # more parallelism (if PERL_TEST_HARNESS_ASAP is set non-zero) or done
         # after the above basic sanity tests, before any non-core ones.
         my $which = $ENV{PERL_TEST_HARNESS_ASAP} ? \@last : \@next;
 
-        push @$which, qw(io re opbasic op uni mro lib porting perf);
-       push @$which, 'japh' if $torture;
-       push @$which, 'win32' if $^O eq 'MSWin32';
-       push @$which, 'benchmark' if $ENV{PERL_BENCHMARK};
-       push @$which, 'bigmem' if $ENV{PERL_TEST_MEMORY};
-
-       # Hopefully TAP::Parser::Scheduler will support this syntax soon.
-       # my $next = { par => '{' . join (',', @next) . '}/*.t' };
-       my $next = { par => [
-                            map { "$_/*.t" } @next
-                           ] };
-       @tests = _extract_tests ($next);
-
-       my $last = { par => '{' . join (',', @last) . '}/*.t' };
-       @last = _extract_tests ($last);
-
-       # This is a bit of a game, because we only want to sort these tests in
-       # speed order. base/*.t wants to run first, and ext,lib etc last and in
-       # MANIFEST order
-       if ($jobs) {
-           require App::Prove::State;
-           $state = App::Prove::State->new({ store => 'test_state' });
-           $state->apply_switch('slow', 'save');
-           # For some reason get_tests returns *all* the tests previously run,
-           # (in the right order), not simply the selection in @tests
-           # (in the right order). Not sure if this is a bug or a feature.
-           # Whatever, *we* are only interested in the ones that are in @tests
-           my %seen;
-           @seen{@tests} = ();
-           @tests = grep {exists $seen{$_} } $state->get_tests(0, @tests);
-       }
-       @tests = (@seq, @tests);
-       push @seq, $next;
-
-       push @last,
-           _tests_from_manifest($Config{extensions}, $Config{known_extensions});
-       my %times;
-       if ($state) {
-           # Where known, collate the elapsed times by test name
-           foreach ($state->results->tests()) {
-               $times{$_->name} = $_->elapsed();
-           }
-       }
-
-       my %dir;
-       my %total_time;
-        my %serials;
-        my %all_dirs;
-
-        # Preprocess the list of tests
-       for (@last) {
-           if ($^O eq 'MSWin32') {
-               s,\\,/,g; # canonicalize path
-           };
-
-            # Keep a list of the distinct directory names, and another list of
-            # those which contain a file whose name begins with a 0
-            if ( m! \A (?: \.\. / )?
-                                ( .*? )         # $1 is the directory path name
-                            /
-                                ( [^/]* \.t )   # $2 is the .t name
-                    \z !x)
-            {
-                my $path = $1;
-
-                $all_dirs{$path} = 1;
-                $serials{$path} = 1 if $2 =~ / \A 0 /x;
-            }
+        push @$which, qw(comp run cmd);
+        push @$which, qw(io re opbasic op op/hook uni mro lib class porting perf test_pl);
+        push @$which, 'japh' if $torture or $ENV{PERL_TORTURE_TEST};
+        push @$which, 'win32' if $is_win32;
+        push @$which, 'benchmark' if $ENV{PERL_BENCHMARK};
+        push @$which, 'bigmem' if $ENV{PERL_TEST_MEMORY};
+
+        if (@next) {
+            @next = map { glob ("$_/*.t") } @next;
+            push @tests, @next;
+            push @seq, _compute_tests_and_ordering(\@next)->@*;
         }
 
-        # We assume that the reason a test file's name begins with a 0 is to
-        # order its execution among the tests in its directory.  Hence, a
-        # directory containing such files should be tested in serial order.
-        #
-        # Add exceptions to the above rule
-        for (qw(cpan/IO-Zlib/t ext/File-Find/t)) {
-            $serials{$_} = 1;
-        }
+        @last = map { glob ("$_/*.t") } @last;
 
-        my @nonexistent_serials = grep { not exists $all_dirs{$_} } keys %serials;
-        if (@nonexistent_serials) {
-            die "These directories to be run serially don't exist."
-              . "  Check your spelling:\n" . join "\n", @nonexistent_serials;
-        }
+        my ($non_ext, @ext_from_manifest)=
+            _tests_from_manifest($Config{extensions}, $Config{known_extensions}, "all");
+        push @last, @ext_from_manifest;
 
-        # Remove the serial testing directories from the list of all
-        # directories.  The remaining ones are testable in parallel.  Make the
-        # parallel list a scalar with names separated by '|' so that below
-        # they will be added to a regular expression.
-        my $non_serials = join "|", grep { not exists $serials{$_} } keys %all_dirs;
-        undef %all_dirs;
-        undef %serials;
+        push @seq, _compute_tests_and_ordering(\@last)->@*;
+        push @tests, @last;
 
-       for (@last) {
-            # Treat every file in each non-serial directory as its own
-            # "directory", so that it can be executed in parallel
-            m! \A ( (?: \.\. / )? (?: $non_serials )
-                         / [^/]+ \.t \z | .* [/] ) !x
-                or die "'$_'";
-           push @{$dir{$1}}, $_;
-
-            # This file contributes time to the total needed for the directory
-            # as a whole
-           $total_time{$1} += $times{$_} || 0;
-       }
-        #print STDERR __LINE__, join "\n", sort { $total_time{$b} <=> $total_time{$a} } keys %dir, "  ";
-
-       push @tests, @last;
-
-       # Generate T::H schedule rules that run the contents of each directory
-       # sequentially.
-       push @seq, { par => [ map { s!/$!/*!; { seq => $_ } } sort {
-           # Directories, ordered by total time descending then name ascending
-           $total_time{$b} <=> $total_time{$a} || lc $a cmp lc $b
-       } keys %dir ] };
-
-       $rules = { seq => \@seq };
+        $rules = { seq => \@seq };
+
+        foreach my $test (@tests) {
+            delete $non_ext->{$test};
+        }
+
+        my @in_manifest_but_not_found = sort keys %$non_ext;
+        if (@in_manifest_but_not_found) {
+            die "There are test files which are in MANIFEST but are not found by the t/harness\n",
+                 "directory scanning rules. You should update t/harness line 339 or so.\n",
+                 "Files:\n", map { "    $_\n" } @in_manifest_but_not_found;
+        }
     }
 }
-if ($^O eq 'MSWin32') {
+if ($is_win32) {
     s,\\,/,g for @tests;
 }
 if (@re or @anti_re) {
@@ -269,7 +399,7 @@ if (@re or @anti_re) {
     @tests= @keepers;
 }
 
-# Allow eg ./perl t/harness t/op/lc.t
+# Allow e.g., ./perl t/harness t/op/lc.t
 for (@tests) {
     if (! -f $_ && !/^\.\./ && -f "../$_") {
         $_ = "../$_";
@@ -277,6 +407,10 @@ for (@tests) {
     }
 }
 
+dump_tests(\@tests) if $dump_tests;
+
+filter_taint_tests(\@tests);
+
 my %options;
 
 my $type = 'perl';
@@ -292,72 +426,73 @@ my $h = TAP::Harness->new({
     verbosity   => $Verbose,
     timer       => $ENV{HARNESS_TIMER},
     exec        => sub {
-       my ($harness, $test) = @_;
+        my ($harness, $test) = @_;
 
-       my $options = $options{$test};
-       if (!defined $options) {
-           $options = $options{$test} = _scan_test($test, $type);
-       }
+        my $options = $options{$test};
+        if (!defined $options) {
+            $options = $options{$test} = _scan_test($test, $type);
+        }
 
-       (local $Valgrind_Log = "$test.valgrind-current") =~ s/^.*\///;
+        (local $Valgrind_Log = "$test.valgrind-current") =~ s/^.*\///;
 
-       return [ split ' ', _cmd($options, $type) ];
+        return [ split ' ', _cmd($options, $type) ];
     },
 });
 
 # Print valgrind output after test completes
 if ($ENV{PERL_VALGRIND}) {
     $h->callback(
-                after_test => sub {
-                    my ($job) = @_;
-                    my $test = $job->[0];
-                    my $vfile = "$test.valgrind-current";
-                    $vfile =~ s/^.*\///;
-
-                    if ( (! -z $vfile) && open(my $voutput, '<', $vfile)) {
-                       print "$test: Valgrind output:\n";
-                       print "$test: $_" for <$voutput>;
-                       close($voutput);
-                    }
-
-                    (local $Valgrind_Log = "$test.valgrind-current") =~ s/^.*\///;
-
-                    _check_valgrind(\$htoolnm, \$hgrind_ct, \$test);
-                }
-                );
+                 after_test => sub {
+                     my ($job) = @_;
+                     my $test = $job->[0];
+                     my $vfile = "$test.valgrind-current";
+                     $vfile =~ s/^.*\///;
+
+                     if ( (! -z $vfile) && open(my $voutput, '<', $vfile)) {
+                        print "$test: Valgrind output:\n";
+                        print "$test: $_" for <$voutput>;
+                        close($voutput);
+                     }
+
+                     (local $Valgrind_Log = "$test.valgrind-current") =~ s/^.*\///;
+
+                     _check_valgrind(\$htoolnm, \$hgrind_ct, \$test);
+                 }
+                 );
 }
 
 if ($state) {
     $h->callback(
-                after_test => sub {
-                    $state->observe_test(@_);
-                }
-                );
+                 after_test => sub {
+                     $state->observe_test(@_);
+                 }
+                 );
     $h->callback(
-                after_runtests => sub {
-                    $state->commit(@_);
-                }
-                );
+                 after_runtests => sub {
+                     $state->commit(@_);
+                 }
+                 );
 }
 
 $h->callback(
-            parser_args => sub {
-                my ($args, $job) = @_;
-                my $test = $job->[0];
-                _before_fork($options{$test});
-                push @{ $args->{switches} }, "-I../../lib";
-            }
-            );
+             parser_args => sub {
+                 my ($args, $job) = @_;
+                 my $test = $job->[0];
+                 _before_fork($options{$test});
+                 push @{ $args->{switches} }, "-I../../lib";
+             }
+             );
 
 $h->callback(
-            made_parser => sub {
-                my ($parser, $job) = @_;
-                my $test = $job->[0];
-                my $options = delete $options{$test};
-                _after_fork($options);
-            }
-            );
+             made_parser => sub {
+                 my ($parser, $job) = @_;
+                 my $test = $job->[0];
+                 my $options = delete $options{$test};
+                 _after_fork($options);
+             }
+             );
 
 my $agg = $h->runtests(@tests);
 _cleanup_valgrind(\$htoolnm, \$hgrind_ct);
+printf "Finished test run at %s.\n", scalar(localtime);
 exit $agg->has_errors ? 1 : 0;
index 26a4636..fd700dd 100644 (file)
@@ -19,16 +19,16 @@ use Config;
 
 my $piped;
 eval {
-       pipe my $in, my $out;
-       $piped = 1;
+    pipe my $in, my $out;
+    $piped = 1;
 };
 if (!$piped) {
-       skip_all('pipe not implemented');
-       exit 0;
+    skip_all('pipe not implemented');
+    exit 0;
 }
 unless (exists  $Config{'d_alarm'}) {
-       skip_all('alarm not implemented');
-       exit 0;
+    skip_all('alarm not implemented');
+    exit 0;
 }
 
 # XXX for some reason the stdio layer doesn't seem to interrupt
@@ -36,8 +36,8 @@ unless (exists  $Config{'d_alarm'}) {
 # hang.
 
 if (exists $ENV{PERLIO} && $ENV{PERLIO} =~ /stdio/  ) {
-       skip_all('stdio not supported for this script');
-       exit 0;
+    skip_all('stdio not supported for this script');
+    exit 0;
 }
 
 # on Win32, alarm() won't interrupt the read/write call.
@@ -55,13 +55,13 @@ if ($^O eq 'VMS' || $^O eq 'MSWin32' || $^O eq 'cygwin' || $^O =~ /freebsd/ || $
      ($^O eq 'darwin' && $osmajmin < 9) ||
     ((int($]*1000) & 1) == 0)
 ) {
-       skip_all('various portability issues');
-       exit 0;
+    skip_all('various portability issues');
+    exit 0;
 }
 
 
 
-my ($in, $out, $st, $sigst, $buf);
+my ($in, $out, $st, $sigst, $buf, $pipe_buf_size, $pipe_buf_err);
 
 plan(tests => 10);
 
@@ -69,10 +69,34 @@ plan(tests => 10);
 # make two handles that will always block
 
 sub fresh_io {
-       close $in if $in; close $out if $out;
-       undef $in; undef $out; # use fresh handles each time
-       pipe $in, $out;
-       $sigst = "";
+    close $in if $in; close $out if $out;
+    undef $in; undef $out; # use fresh handles each time
+    pipe $in, $out;
+    $sigst = "";
+    $pipe_buf_err = "";
+
+    # This used to be 1_000_000, but on Linux/ppc64 (POWER7) this kept
+    # consistently failing. At exactly 0x100000 it started passing
+    # again. Now we're asking the kernel what the pipe buffer is, and if
+    # that fails, hoping this number is bigger than any pipe buffer.
+    $pipe_buf_size = eval {
+        use Fcntl qw(F_GETPIPE_SZ);
+        # When F_GETPIPE_SZ isn't implemented then fcntl() raises an exception:
+        #   "Your vendor has not defined Fcntl macro F_GETPIPE_SZ ..."
+        # When F_GETPIPE_SZ is implemented then errors are still possible
+        # (EINVAL, EBADF, ...). These are not exceptions (i.e. these don't die)
+        # but instead these set $! and make fcntl() return undef.
+        fcntl($out, F_GETPIPE_SZ, 0) or die "$!\n";
+    };
+    if ($@ or not $pipe_buf_size) {
+        my $err = $@;;
+        chomp $err;
+        $pipe_buf_size = 0xfffff;
+        $pipe_buf_err = "fcntl F_GETPIPE_SZ failed" . ($err ? " ($err)" : "") .
+                        ", falling back to $pipe_buf_size";
+    };
+    $pipe_buf_size++; # goal is to completely fill the buffer so write one
+                      # byte more then the buffer size
 }
 
 $SIG{PIPE} = 'IGNORE';
@@ -84,9 +108,10 @@ $SIG{ALRM} = sub { $sigst = close($in) ? "ok" : "nok" };
 alarm(1);
 $st = read($in, $buf, 1);
 alarm(0);
-is($sigst, 'ok', 'read/close: sig handler close status');
-ok(!$st, 'read/close: read status');
-ok(!close($in), 'read/close: close status');
+my $result = is($sigst, 'ok', 'read/close: sig handler close status');
+$result &= ok(!$st, 'read/close: read status');
+$result &= ok(!close($in), 'read/close: close status');
+diag($pipe_buf_err) if (not $result and $pipe_buf_err);
 
 # die during read
 
@@ -95,49 +120,43 @@ $SIG{ALRM} = sub { die };
 alarm(1);
 $st = eval { read($in, $buf, 1) };
 alarm(0);
-ok(!$st, 'read/die: read status');
-ok(close($in), 'read/die: close status');
+$result = ok(!$st, 'read/die: read status');
+$result &= ok(close($in), 'read/die: close status');
+diag($pipe_buf_err) if (not $result and $pipe_buf_err);
 
 SKIP: {
     skip "Tests hang on older versions of Darwin", 5
           if $^O eq 'darwin' && $osmajmin < 16;
 
-    # This used to be 1_000_000, but on Linux/ppc64 (POWER7) this kept
-    # consistently failing. At exactly 0x100000 it started passing
-    # again. Now we're asking the kernel what the pipe buffer is, and if
-    # that fails, hoping this number is bigger than any pipe buffer.
-    my $surely_this_arbitrary_number_is_fine = (eval {
-        use Fcntl qw(F_GETPIPE_SZ);
-        fcntl($out, F_GETPIPE_SZ, 0);
-    } || 0xfffff) + 1;
-
     # close during print
 
     fresh_io;
     $SIG{ALRM} = sub { $sigst = close($out) ? "ok" : "nok" };
-    $buf = "a" x $surely_this_arbitrary_number_is_fine . "\n";
+    $buf = "a" x $pipe_buf_size . "\n";
     select $out; $| = 1; select STDOUT;
     alarm(1);
     $st = print $out $buf;
     alarm(0);
-    is($sigst, 'nok', 'print/close: sig handler close status');
-    ok(!$st, 'print/close: print status');
-    ok(!close($out), 'print/close: close status');
+    $result = is($sigst, 'nok', 'print/close: sig handler close status');
+    $result &= ok(!$st, 'print/close: print status');
+    $result &= ok(!close($out), 'print/close: close status');
+    diag($pipe_buf_err) if (not $result and $pipe_buf_err);
 
     # die during print
 
     fresh_io;
     $SIG{ALRM} = sub { die };
-    $buf = "a" x $surely_this_arbitrary_number_is_fine . "\n";
+    $buf = "a" x $pipe_buf_size . "\n";
     select $out; $| = 1; select STDOUT;
     alarm(1);
     $st = eval { print $out $buf };
     alarm(0);
-    ok(!$st, 'print/die: print status');
+    $result = ok(!$st, 'print/die: print status');
     # the close will hang since there's data to flush, so use alarm
     alarm(1);
-    ok(!eval {close($out)}, 'print/die: close status');
+    $result &= ok(!eval {close($out)}, 'print/die: close status');
     alarm(0);
+    diag($pipe_buf_err) if (not $result and $pipe_buf_err);
 
     # close during close
 
index 6eb44fa..fded8cb 100644 (file)
@@ -307,6 +307,80 @@ SKIP:
        "set SO_REUSEADDR from magic");
     isnt(getsockopt($sock, SOL_SOCKET, SO_REUSEADDR), pack("i", 0),
        "check SO_REUSEADDR set correctly");
+
+    # test whether boolean value treated as a number
+    ok(setsockopt($sock, SOL_SOCKET, SO_REUSEADDR, !1),
+       "clear SO_REUSEADDR by a boolean false");
+    is(getsockopt($sock, SOL_SOCKET, SO_REUSEADDR), pack("i", 0),
+       "check SO_REUSEADDR cleared correctly");
+    ok(setsockopt($sock, SOL_SOCKET, SO_REUSEADDR, !0),
+       "set SO_REUSEADDR by a boolean true");
+    isnt(getsockopt($sock, SOL_SOCKET, SO_REUSEADDR), pack("i", 0),
+         "check SO_REUSEADDR set correctly");
+}
+
+# GH #18642 - test whether setsockopt works with a numeric OPTVAL which also
+# has a cached stringified value
+SKIP: {
+    defined(my $IPPROTO_IP = eval { Socket::IPPROTO_IP() })
+        or skip 'no IPPROTO_IP', 4;
+    defined(my $IP_TTL = eval { Socket::IP_TTL() })
+        or skip 'no IP_TTL', 4;
+
+    my $sock;
+    socket($sock, PF_INET, SOCK_STREAM, $tcp) or BAIL_OUT "socket: $!";
+
+    my $ttl = 7;
+    my $integer_only_ttl = 0 + $ttl;
+    ok(setsockopt($sock, $IPPROTO_IP, $IP_TTL, $integer_only_ttl),
+       'setsockopt with an integer-only OPTVAL');
+    my $set_ttl = getsockopt($sock, $IPPROTO_IP, $IP_TTL);
+    is(unpack('i', $set_ttl // ''), $ttl, 'TTL set to desired value');
+
+    my $also_string_ttl = $ttl;
+    my $string = "$also_string_ttl";
+    ok(setsockopt($sock, $IPPROTO_IP, $IP_TTL, $also_string_ttl),
+       'setsockopt with an integer OPTVAL with stringified value');
+    $set_ttl = getsockopt($sock, $IPPROTO_IP, $IP_TTL);
+    is(unpack('i', $set_ttl // ''), $ttl, 'TTL set to desired value');
+}
+
+# GH #19892
+SKIP: {
+    eval { Socket::IPPROTO_TCP(); 1 } or skip 'no IPPROTO_TCP', 1;
+    eval { Socket::SOL_SOCKET(); 1 } or skip 'no SOL_SOCKET', 1;
+    eval { Socket::SO_SNDBUF(); 1 } or skip 'no SO_SNDBUF', 1;
+    skip 'setting socket buffer size requires elevated privileges', 1 if $^O eq 'VMS';
+
+    # The value of SNDBUF_SIZE constant below is changed from #19892 testcase;
+    # original "262144" may be clamped on low-memory systems.
+    fresh_perl_is(<<'EOP', "Ok.\n", {}, 'setsockopt works for a constant that is once stringified');
+use warnings;
+use strict;
+
+use Socket qw'PF_INET SOCK_STREAM IPPROTO_TCP SOL_SOCKET SO_SNDBUF';
+
+use constant { SNDBUF_SIZE => 32768 };
+
+socket(my $sock, PF_INET, SOCK_STREAM, IPPROTO_TCP)
+  or die "Could not create socket - $!\n";
+
+setsockopt($sock,SOL_SOCKET,SO_SNDBUF,SNDBUF_SIZE)
+  or die "Could not set SO_SNDBUF on socket - $!\n";
+
+my $sndBuf=getsockopt($sock,SOL_SOCKET,SO_SNDBUF)
+  or die "Could not get SO_SNDBUF on socket - $!\n";
+
+$sndBuf=unpack('i',$sndBuf);
+
+die "Unexpected SO_SNDBUF value: $sndBuf\n"
+  unless($sndBuf == SNDBUF_SIZE || $sndBuf == 2*SNDBUF_SIZE);
+
+print "Ok.\n";
+exit;
+
+sub bug {SNDBUF_SIZE.''}
+EOP
 }
 
 done_testing();
diff --git a/gnu/usr.bin/perl/t/lib/GH_15109/Apack.pm b/gnu/usr.bin/perl/t/lib/GH_15109/Apack.pm
deleted file mode 100644 (file)
index fa52ec8..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-# for use by caller.t for GH #15109
-package Apack;
-use Bpack;
-1;
diff --git a/gnu/usr.bin/perl/t/lib/GH_15109/Bpack.pm b/gnu/usr.bin/perl/t/lib/GH_15109/Bpack.pm
deleted file mode 100644 (file)
index f9421c8..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-# for use by caller.t for GH #15109
-package Bpack;
-use Cpack;
-1;
diff --git a/gnu/usr.bin/perl/t/lib/GH_15109/Cpack.pm b/gnu/usr.bin/perl/t/lib/GH_15109/Cpack.pm
deleted file mode 100644 (file)
index 94c409b..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-# for use by caller.t for GH #15109
-package Cpack;
-
-
-my $i = 0;
-
-while (my ($package, $file, $line) = caller($i++)) {
-    push @Cpack::callers, "$file:$line";
-}
-
-1;
diff --git a/gnu/usr.bin/perl/t/lib/GH_15109/Foo.pm b/gnu/usr.bin/perl/t/lib/GH_15109/Foo.pm
deleted file mode 100644 (file)
index 1af2547..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-# for use by caller.t for GH #15109
-
-package Foo;
-
-sub import {
-    use warnings; # restore default warnings
-    () = caller(1); # this used to cause valgrind errors
-}
-1;
index b716827..d138e31 100644 (file)
@@ -251,3 +251,52 @@ Type of arg 1 to pop must be array (not private hash) at - line 4, near "%a;"
 Type of arg 1 to shift must be array (not private hash) at - line 5, near "%a;"
 Type of arg 1 to unshift must be array (not private hash) at - line 6, near "1;"
 Execution of - aborted due to compilation errors.
+########
+use feature 'defer';
+no warnings 'experimental::defer';
+defer { return "retval" }
+EXPECT
+Can't "return" out of a "defer" block at - line 3.
+########
+use feature 'defer';
+no warnings 'experimental::defer';
+defer { goto HERE }
+HERE:
+EXPECT
+Can't "goto" out of a "defer" block at - line 3.
+########
+use feature 'defer';
+no warnings 'experimental::defer';
+my $subB = sub {};
+defer { goto &$subB }
+EXPECT
+Can't "goto" out of a "defer" block at - line 4.
+########
+use feature 'defer';
+no warnings 'experimental::defer';
+LOOP: while(1) {
+  defer { last LOOP }
+}
+EXPECT
+Can't "last" out of a "defer" block at - line 4.
+########
+use feature 'try';
+no warnings 'experimental::try';
+try {} catch ($e) {} finally { return "123" }
+EXPECT
+Can't "return" out of a "finally" block at - line 3.
+########
+use feature 'try';
+no warnings 'experimental::try';
+try {} catch ($e) {} finally { goto HERE; }
+HERE:
+EXPECT
+Can't "goto" out of a "finally" block at - line 3.
+########
+use feature 'try';
+no warnings 'experimental::try';
+LOOP: {
+  try {} catch ($e) {} finally { last LOOP; }
+}
+EXPECT
+Can't "last" out of a "finally" block at - line 4.
index b6d943d..083f351 100644 (file)
@@ -2,8 +2,7 @@ __END__
 # NAME foo found where operator expected
 myfunc 1,2,3
 EXPECT
-Number found where operator expected at - line 1, near "myfunc 1"
-       (Do you need to predeclare myfunc?)
+Number found where operator expected (Do you need to predeclare "myfunc"?) at - line 1, near "myfunc 1"
 syntax error at - line 1, near "myfunc 1"
 Execution of - aborted due to compilation errors.
 ########
@@ -14,45 +13,37 @@ $foo;
 myfunc 1,2,3
 EXPECT
 Global symbol "$foo" requires explicit package name (did you forget to declare "my $foo"?) at - line 3.
-Number found where operator expected at - line 4, near "myfunc 1"
-       (Do you need to predeclare myfunc?)
+Number found where operator expected (Do you need to predeclare "myfunc"?) at - line 4, near "myfunc 1"
 syntax error at - line 4, near "myfunc 1"
 Execution of - aborted due to compilation errors.
 ########
-# NAME (Missing operator before ${?) [perl #123737]
+# NAME (Missing operator before "${"?) [perl #123737]
 0${
 EXPECT
-Scalar found where operator expected at - line 1, near "0${"
-       (Missing operator before ${?)
+Scalar found where operator expected (Missing operator before "${"?) at - line 1, near "0${"
 syntax error at - line 1, near "0$"
-Missing right curly or square bracket at - line 1, at end of line
 Execution of - aborted due to compilation errors.
 ########
-# NAME (Missing operator before $#{?) [perl #123737]
+# NAME (Missing operator before "$#{"?) [perl #123737]
 0$#{
 EXPECT
-Array length found where operator expected at - line 1, near "0$#{"
-       (Missing operator before $#{?)
+Array length found where operator expected (Missing operator before "$#{"?) at - line 1, near "0$#{"
 syntax error at - line 1, near "0$#"
-Missing right curly or square bracket at - line 1, at end of line
 Execution of - aborted due to compilation errors.
 ########
-# NAME (Missing operator before @foo) [perl #123737]
+# NAME (Missing operator before "@foo") [perl #123737]
 0@foo
 EXPECT
-Array found where operator expected at - line 1, near "0@foo"
-       (Missing operator before @foo?)
+Array found where operator expected (Missing operator before "@foo"?) at - line 1, near "0@foo"
 syntax error at - line 1, near "0@foo
 "
 Execution of - aborted due to compilation errors.
 ########
-# NAME (Missing operator before @{) [perl #123737]
+# NAME (Missing operator before "@{") [perl #123737]
 0@{
 EXPECT
-Array found where operator expected at - line 1, near "0@{"
-       (Missing operator before @{?)
+Array found where operator expected (Missing operator before "@{"?) at - line 1, near "0@{"
 syntax error at - line 1, near "0@"
-Missing right curly or square bracket at - line 1, at end of line
 Execution of - aborted due to compilation errors.
 ########
 # NAME Unterminated here-doc in string eval
@@ -342,9 +333,8 @@ has cxxc => (
     default => sub { 1 }
 );
 EXPECT
-Bareword found where operator expected at - line 9, near "isa => 'Int"
+Bareword found where operator expected (Do you need to predeclare "isa"?) at - line 9, near "isa => 'Int"
   (Might be a runaway multi-line '' string starting on line 4)
-       (Do you need to predeclare isa?)
 Bad name after Int' at - line 9.
 ########
 # NAME Bad name after :: (with other helpful messages)
@@ -361,9 +351,8 @@ has cxxc => (
     default => sub { 1 }
 );
 EXPECT
-Bareword found where operator expected at - line 9, near "isa => "Foo"
+Bareword found where operator expected (Do you need to predeclare "isa"?) at - line 9, near "isa => "Foo"
   (Might be a runaway multi-line "" string starting on line 4)
-       (Do you need to predeclare isa?)
 Bad name after Foo:: at - line 9.
 ########
 # NAME Unterminated delimiter for here document
@@ -482,10 +471,7 @@ Use of bare << to mean <<"" is forbidden at - line 1.
 # NAME incomplete floating point decimal exponent (#131725)
 1e--5
 EXPECT
-Bareword found where operator expected at - line 1, near "1e"
-       (Missing operator before e?)
-Number found where operator expected at - line 1, near "--5"
-       (Missing operator before 5?)
+Bareword found where operator expected (Missing operator before "e"?) at - line 1, near "1e"
 syntax error at - line 1, near "1e"
 Execution of - aborted due to compilation errors.
 ########
@@ -507,8 +493,7 @@ Execution of - aborted due to compilation errors.
 01.1234567p0;
 07.8p0;
 EXPECT
-Bareword found where operator expected at - line 2, near "8p0"
-       (Missing operator before p0?)
+Bareword found where operator expected (Missing operator before "p0"?) at - line 2, near "8p0"
 syntax error at - line 2, near "8p0"
 Execution of - aborted due to compilation errors.
 ########
@@ -516,8 +501,7 @@ Execution of - aborted due to compilation errors.
 0b1.10p0;
 0b1.2p0;
 EXPECT
-Bareword found where operator expected at - line 2, near "2p0"
-       (Missing operator before p0?)
+Bareword found where operator expected (Missing operator before "p0"?) at - line 2, near "2p0"
 syntax error at - line 2, near "2p0"
 Execution of - aborted due to compilation errors.
 ########
@@ -572,11 +556,7 @@ Execution of - aborted due to compilation errors.
 # NAME [perl #134310] don't confuse S_no_op() with PL_bufptr after s
 0 0x@
 EXPECT
-Number found where operator expected at - line 1, near "0 0x"
-       (Missing operator before  0x?)
-Array found where operator expected at - line 1, near "0x@
-;"
-       (Missing operator before ;?)
+Number found where operator expected (Missing operator before "0x"?) at - line 1, near "0 0x"
 No digits found for hexadecimal literal at - line 1, near "0 0x@"
 syntax error at - line 1, near "0 0x"
 Execution of - aborted due to compilation errors.
index d12c791..ef24bb9 100644 (file)
@@ -103,9 +103,10 @@ EXPECT
 Assigning non-zero to $[ is no longer possible at - line 3.
 ########
 # NAME $^H accidentally enabling all features
-eval 'BEGIN { $^H |= 0x1c020000 } $_ = evalbytes 12345';
+# HINT_FEATURE_MASK | HINT_LOCALIZE_HH
+eval 'BEGIN { $^H |= 0x3c020000 } $_ = evalbytes 12345';
 print $_||$@;
 EXPECT
-Number found where operator expected at (eval 1) line 1, near "evalbytes 12345"
-       (Do you need to predeclare evalbytes?)
+Number found where operator expected (Do you need to predeclare "evalbytes"?) at (eval 1) line 1, near "evalbytes 12345"
 syntax error at (eval 1) line 1, near "evalbytes 12345"
+Execution of (eval 1) aborted due to compilation errors.
index cda8d21..f068d6d 100644 (file)
@@ -90,6 +90,10 @@ unless(defined(&_H2PH_H_)) {
     }
     eval("sub flim () { 0; }") unless defined(&flim);
     eval("sub flam () { 1; }") unless defined(&flam);
+    eval 'sub blli_in_use {
+        my($blli) = @_;
+           eval q({  ($blli->{l2_proto}) ||  ($blli->{l3_proto}); });
+    }' unless defined(&blli_in_use);
     eval 'sub multiline () {"multilinestring";}' unless defined(&multiline);
 }
 1;
index b571751..a4ed563 100644 (file)
@@ -213,11 +213,6 @@ Global symbol "$m" requires explicit package name (did you forget to declare "my
 Global symbol "$d" requires explicit package name (did you forget to declare "my $d"?) at abc.pm line 6.
 Global symbol "$i" requires explicit package name (did you forget to declare "my $i"?) at abc.pm line 6.
 Global symbol "$n" requires explicit package name (did you forget to declare "my $n"?) at abc.pm line 6.
-Global symbol "$e" requires explicit package name (did you forget to declare "my $e"?) at abc.pm line 7.
-Global symbol "$j" requires explicit package name (did you forget to declare "my $j"?) at abc.pm line 7.
-Global symbol "$o" requires explicit package name (did you forget to declare "my $o"?) at abc.pm line 7.
-Global symbol "$p" requires explicit package name (did you forget to declare "my $p"?) at abc.pm line 8.
-Illegal binary digit '2' at abc.pm line 8, at end of line
 abc.pm has too many errors.
 Compilation failed in require at - line 1.
 BEGIN failed--compilation aborted at - line 1.
index 40c649f..ebf6a25 100644 (file)
@@ -545,8 +545,6 @@ if (1 {
 }
 EXPECT
 syntax error at - line 4, near "1 {"
-"my" variable $x masks earlier declaration in same statement at - line 6.
-syntax error at - line 7, near "}"
 Execution of - aborted due to compilation errors.
 ########
 
index 5c173fd..c889f22 100644 (file)
@@ -1943,7 +1943,7 @@ $v = 1 + prototype $fn;
 EXPECT
 Use of uninitialized value in addition (+) at - line 4.
 ########
-use warnings 'uninitialized'; no warnings 'experimental::smartmatch';
+use warnings 'uninitialized'; no warnings 'deprecated';
 my $v;
 my $fn = sub {};
 $v = 1 + (1 ~~ $fn);
@@ -2216,3 +2216,33 @@ 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.
+########
+# GH #20945
+use warnings 'uninitialized';
+my ($v, $x, $y, @arr, %hash);
+
+$v = ($x = undef) + 1;
+$v = 1 + ($x = undef);
+$v = ($x = $y) - 1;
+$v = 1 - ($x = $y);
+$v = ($x = []->[0]) + ($y = [1]->[0]);
+$v = ($x = [1]->[0]) + ($y = []->[0]);
+$v = ($x = ()) * 2;
+(my $z = $y) =~ s/a/b/;
+($arr[0] = undef) =~ s/a/b/;
+($arr[0] = $z) =~ s/a/b/;
+($hash{foo} = undef) =~ s/a/b/;
+($hash{foo} = $z) =~ s/a/b/;
+EXPECT
+Use of uninitialized value $x in addition (+) at - line 5.
+Use of uninitialized value $x in addition (+) at - line 6.
+Use of uninitialized value $x in subtraction (-) at - line 7.
+Use of uninitialized value $x in subtraction (-) at - line 8.
+Use of uninitialized value $x in addition (+) at - line 9.
+Use of uninitialized value $y in addition (+) at - line 10.
+Use of uninitialized value $x in multiplication (*) at - line 11.
+Use of uninitialized value $z in substitution (s///) at - line 12.
+Use of uninitialized value $arr[0] in substitution (s///) at - line 13.
+Use of uninitialized value $arr[0] in substitution (s///) at - line 14.
+Use of uninitialized value $hash{"foo"} in substitution (s///) at - line 15.
+Use of uninitialized value $hash{"foo"} in substitution (s///) at - line 16.
index 3e7cdc5..d9de0a4 100644 (file)
@@ -284,7 +284,6 @@ my @s = @f["]", "a"];
 @h[glob ""];
 @h[readline ""];
 @h[m ""];
-use constant phoo => 1..3;
 @h[+phoo]; # rv2av
 @h[sort foo];
 @h[reverse foo];
@@ -364,7 +363,7 @@ OPTION fatal
 Can't use an array as a reference at - line 3.
 ########
 # op.c
-use warnings 'void' ; no warnings 'experimental::smartmatch'; close STDIN ;
+use warnings 'void' ; no warnings 'deprecated'; close STDIN ;
 #line 2
 1 x 3 ;                        # OP_REPEAT (folded)
 (1) x 3 ;              # OP_REPEAT
@@ -1019,6 +1018,20 @@ sub fred () { 1 }
 EXPECT
 Constant subroutine main::fred redefined at - line 3.
 ########
+# op.c github #20742
+use constant fred => 1, 2;
+use constant fred => 2, 3;
+EXPECT
+OPTIONS regex
+Constant subroutine main::fred redefined at .*lib/constant\.pm line \d+
+########
+# op.c related to github #20742
+# produced an assertion failure
+use constant x => 1, 2;
+sub x () { 1 }
+EXPECT
+Constant subroutine x redefined at - line 4.
+########
 # op.c
 use feature "lexical_subs", "state";
 my sub fred () { 1 }
index e660528..0e33743 100644 (file)
@@ -237,8 +237,8 @@ $a = <FOO> ;
 use warnings 'io' ;
 $a = <FOO> ;
 $a = <FH> ;
-close (FH) or die $! ;
-close (FOO) or die $! ;
+close (FH);
+close (FOO);
 unlink $file ;
 EXPECT
 Filehandle FH opened only for output at - line 5.
index 7d45f3b..05ca583 100644 (file)
@@ -120,7 +120,7 @@ EXPECT
 ########
 # NAME Wide character in non-UTF-8 locale
 require '../loc_tools.pl';
-unless (locales_enabled()) {
+unless (locales_enabled('LC_CTYPE')) {
     print("SKIPPED\n# locales not available\n"),exit;
 }
 eval { require POSIX; POSIX->import("locale_h") };
@@ -150,7 +150,7 @@ Wide character (U+100) in pattern match (m//) at - line 16.
 ########
 # NAME Wide character in UTF-8 locale
 require '../loc_tools.pl';
-unless (locales_enabled()) {
+unless (locales_enabled('LC_CTYPE')) {
     print("SKIPPED\n# locales not available\n"),exit;
 }
 eval { require POSIX; POSIX->import("locale_h") };
@@ -172,6 +172,10 @@ setlocale(&POSIX::LC_CTYPE, $utf8_locales[0]);
 EXPECT
 ########
 # NAME \b{} in non-UTF-8 locale
+require '../loc_tools.pl';
+unless (locales_enabled('LC_CTYPE')) {
+    print("SKIPPED\n# locales not available\n"),exit;
+}
 eval { require POSIX; POSIX->import("locale_h") };
 if ($@) {
     print("SKIPPED\n# no POSIX\n"),exit;
@@ -183,12 +187,12 @@ setlocale(&POSIX::LC_CTYPE, "C");
 no warnings 'locale';
 "a" =~ /\b{gcb}/l;
 EXPECT
-Use of \b{} or \B{} for non-UTF-8 locale is wrong.  Assuming a UTF-8 locale at - line 8.
-Use of \b{} or \B{} for non-UTF-8 locale is wrong.  Assuming a UTF-8 locale at - line 8.
+Use of \b{} or \B{} for non-UTF-8 locale is wrong.  Assuming a UTF-8 locale at - line 12.
+Use of \b{} or \B{} for non-UTF-8 locale is wrong.  Assuming a UTF-8 locale at - line 12.
 ########
 # NAME \b{} in UTF-8 locale
 require '../loc_tools.pl';
-unless (locales_enabled()) {
+unless (locales_enabled('LC_CTYPE')) {
     print("SKIPPED\n# locales not available\n"),exit;
 }
 eval { require POSIX; POSIX->import("locale_h") };
@@ -208,15 +212,19 @@ setlocale(&POSIX::LC_CTYPE, $utf8_locale);
  "abc def" =~ /\b{wb}.*?/;
  "abc def" =~ /\B{wb}.*?/;
 EXPECT
-Use of \b{} or \B{} for non-UTF-8 locale is wrong.  Assuming a UTF-8 locale at - line 16.
-Use of \b{} or \B{} for non-UTF-8 locale is wrong.  Assuming a UTF-8 locale at - line 16.
-Use of \b{} or \B{} for non-UTF-8 locale is wrong.  Assuming a UTF-8 locale at - line 17.
-Use of \b{} or \B{} for non-UTF-8 locale is wrong.  Assuming a UTF-8 locale at - line 17.
-Use of \b{} or \B{} for non-UTF-8 locale is wrong.  Assuming a UTF-8 locale at - line 17.
+OPTION regex
+\AUse of \\b\{\} or \\B\{\} for non-UTF-8 locale is wrong\.  Assuming a UTF-8 locale at - line 16\.
+Use of \\b\{\} or \\B\{\} for non-UTF-8 locale is wrong\.  Assuming a UTF-8 locale at - line 16\.
+Use of \\b\{\} or \\B\{\} for non-UTF-8 locale is wrong\.  Assuming a UTF-8 locale at - line 17\.
+Use of \\b\{\} or \\B\{\} for non-UTF-8 locale is wrong\.  Assuming a UTF-8 locale at - line 17\.
+Use of \\b\{\} or \\B\{\} for non-UTF-8 locale is wrong\.  Assuming a UTF-8 locale at - line 17\.(?:
+Locale '.*' contains \(at least\) the following characters which have
+unexpected meanings: .*
+The Perl program will use the expected meanings; codeset=UTF-8)?\z
 ########
 # NAME (?[ ]) in non-UTF-8 locale
 require '../loc_tools.pl';
-unless (locales_enabled()) {
+unless (locales_enabled('LC_CTYPE')) {
     print("SKIPPED\n# locales not available\n"),exit;
 }
 eval { require POSIX; POSIX->import("locale_h") };
@@ -243,7 +251,7 @@ Use of (?[ ]) for non-UTF-8 locale is wrong.  Assuming a UTF-8 locale at - line
 ########
 # NAME (?[ ]) in UTF-8 locale
 require '../loc_tools.pl';
-unless (locales_enabled()) {
+unless (locales_enabled('LC_CTYPE')) {
     print("SKIPPED\n# locales not available\n"),exit;
 }
 eval { require POSIX; POSIX->import("locale_h") };
index 39f92b0..3ff4b3e 100644 (file)
@@ -261,13 +261,8 @@ Reversed *= operator at - line 5.
 Reversed %= operator at - line 6.
 Reversed &= operator at - line 7.
 Reversed .= operator at - line 8.
-Reversed ^= operator at - line 9.
-Reversed |= operator at - line 10.
-Reversed <= operator at - line 11.
 syntax error at - line 8, near "=."
-syntax error at - line 9, near "=^"
-syntax error at - line 10, near "=|"
-Unterminated <> operator at - line 11.
+Execution of - aborted due to compilation errors.
 ########
 # toke.c
 no warnings 'syntax' ;
@@ -283,9 +278,7 @@ $a =< 2 ;
 $a =/ 2 ;
 EXPECT
 syntax error at - line 8, near "=."
-syntax error at - line 9, near "=^"
-syntax error at - line 10, near "=|"
-Unterminated <> operator at - line 11.
+Execution of - aborted due to compilation errors.
 ########
 # toke.c
 use warnings 'syntax' ;
@@ -415,21 +408,30 @@ sort ("")
 EXPECT
 
 ########
-use warnings 'syntax';
 @foo::bar = 1..3;
 () = "$foo'bar";
 () = "@foo'bar";
 () = "$#foo'bar";
-no warnings 'syntax' ;
+use warnings 'syntax';
+() = "$foo'bar";
+() = "@foo'bar";
+() = "$#foo'bar";
+no warnings 'syntax', 'deprecated' ;
 () = "$foo'bar";
 () = "@foo'bar";
 () = "$#foo'bar";
 EXPECT
-Old package separator used in string at - line 3.
+Old package separator used in string at - line 2.
        (Did you mean "$foo\'bar" instead?)
+Old package separator used in string at - line 3.
+       (Did you mean "@foo\'bar" instead?)
 Old package separator used in string at - line 4.
+       (Did you mean "$#foo\'bar" instead?)
+Old package separator used in string at - line 6.
+       (Did you mean "$foo\'bar" instead?)
+Old package separator used in string at - line 7.
        (Did you mean "@foo\'bar" instead?)
-Old package separator used in string at - line 5.
+Old package separator used in string at - line 8.
        (Did you mean "$#foo\'bar" instead?)
 ########
 use warnings 'syntax'; use utf8;
@@ -437,7 +439,7 @@ use warnings 'syntax'; use utf8;
 () = "$fooл'barл";
 () = "@fooл'barл";
 () = "$#fooл'barл";
-no warnings 'syntax' ;
+no warnings 'syntax', 'deprecated' ;
 () = "$fooл'barл";
 () = "@fooл'barл";
 () = "$#fooл'barл";
@@ -449,6 +451,19 @@ Old package separator used in string at - line 4.
 Old package separator used in string at - line 5.
        (Did you mean "$#fooл\'barл" instead?)
 ########
+# NAME deprecation of ' in names
+sub foo'bar { 1 }
+$a'b = 1;
+@a'c = ();
+%a'd = ();
+package a'e;
+EXPECT
+Old package separator "'" deprecated at - line 1.
+Old package separator "'" deprecated at - line 2.
+Old package separator "'" deprecated at - line 3.
+Old package separator "'" deprecated at - line 4.
+Old package separator "'" deprecated at - line 5.
+########
 # toke.c
 use warnings 'ambiguous' ;
 $a = ${time[2]};
@@ -1047,10 +1062,8 @@ Operator or semicolon missing before %foo at - line 8.
 Ambiguous use of % resolved as operator % at - line 8.
 Operator or semicolon missing before %foo at - line 10.
 Ambiguous use of % resolved as operator % at - line 10.
-Bareword found where operator expected at - line 12, near "$%foo"
-       (Missing operator before foo?)
-Bareword found where operator expected at - line 13, near "$ %foo"
-       (Missing operator before foo?)
+Bareword found where operator expected (Missing operator before "foo"?) at - line 12, near "$%foo"
+Bareword found where operator expected (Missing operator before "foo"?) at - line 13, near "$ %foo"
 Illegal modulus zero at - line 3.
 ########
 # toke.c
@@ -1074,10 +1087,8 @@ Operator or semicolon missing before &foo at - line 8.
 Ambiguous use of & resolved as operator & at - line 8.
 Operator or semicolon missing before &foo at - line 10.
 Ambiguous use of & resolved as operator & at - line 10.
-Bareword found where operator expected at - line 13, near "$&foo"
-       (Missing operator before foo?)
-Bareword found where operator expected at - line 14, near "$ &foo"
-       (Missing operator before foo?)
+Bareword found where operator expected (Missing operator before "foo"?) at - line 13, near "$&foo"
+Bareword found where operator expected (Missing operator before "foo"?) at - line 14, near "$ &foo"
 Undefined subroutine &main::foo called at - line 3.
 ########
 # toke.c
@@ -1276,8 +1287,7 @@ eval q/5 6/;
 no warnings "syntax";
 eval q/5 6/;
 EXPECT
-Number found where operator expected at (eval 1) line 1, near "5 6"
-       (Missing operator before  6?)
+Number found where operator expected (Missing operator before "6"?) at (eval 1) line 1, near "5 6"
 ########
 # toke.c
 use warnings "syntax"; no warnings "deprecated";
@@ -1784,3 +1794,11 @@ Use of '》' is deprecated as a string delimiter at - line 12.
 Use of '‹' is deprecated as a string delimiter at - line 13.
 Use of '›' is deprecated as a string delimiter at - line 14.
 ########
+# NAME check bareword warning is a single error message
+BEGIN { $SIG{__WARN__}= sub { print STDERR "warn: $_[0]" }; }
+sub bar {}
+foo bar;
+EXPECT
+warn: Bareword found where operator expected (Do you need to predeclare "foo"?) at - line 3, near "foo bar"
+syntax error at - line 3, near "foo bar"
+Execution of - aborted due to compilation errors.
index 9a3e0c7..4cc03da 100644 (file)
@@ -15,20 +15,25 @@ use strict;
 use warnings;
 use feature 'state';
 
+my %known_bad_locales = (   # XXX eventually will need version info if and
+                            # when these get fixed.
+    solaris => [ 'vi_VN.UTF-8', ],  # Use of U+A8 segfaults: GH #20578
+);
+
 eval { require POSIX; import POSIX 'locale_h'; };
 my $has_locale_h = ! $@;
 
 my @known_categories = ( qw(LC_ALL LC_COLLATE LC_CTYPE LC_MESSAGES LC_MONETARY
                             LC_NUMERIC LC_TIME LC_ADDRESS LC_IDENTIFICATION
                             LC_MEASUREMENT LC_PAPER LC_TELEPHONE LC_SYNTAX
-                            LC_TOD));
+                            LC_TOD LC_NAME));
 my @platform_categories;
 
-sub is_category_valid($) {
+sub category_excluded($) {
     my $cat_name = shift =~ s/^LC_//r;
 
     # Recognize Configure option to exclude a category
-    return $Config{ccflags} !~ /\bD?NO_LOCALE_$cat_name\b/;
+    return $Config{ccflags} =~ /\bD?NO_LOCALE_$cat_name\b/;
 }
 
 # LC_ALL can be -1 on some platforms.  And, in fact the implementors could
@@ -83,6 +88,9 @@ sub _my_diag($) {
     }
 }
 
+# Larger than any real test
+my $my_count = 1_000_000;
+
 sub _my_fail($) {
     my $message = shift;
     if (defined &main::fail) {
@@ -90,10 +98,40 @@ sub _my_fail($) {
     }
     else {
         local($\, $", $,) = (undef, ' ', '');
-        print "not ok 0 $message\n";
+        print "not ok " . $my_count++ . $message . "\n";
     }
 }
 
+sub valid_locale_categories() {
+    # Returns a list of the locale categories (expressed as strings, like
+    # "LC_ALL) known to this program that are available on this platform.
+
+    return grep { ! category_excluded($_) } @platform_categories;
+}
+
+sub is_category_valid($) {
+    my $name = shift;
+    $name = 'LC_' . $name =~ s/^LC_//r;
+    return grep { $name eq $_ } valid_locale_categories();
+}
+
+# It turns out that strings generated under the control of a given locale
+# category are often affected as well by LC_CTYPE.  If the two categories
+# don't match, one can get mojibake or even core dumps.  (khw thinks it more
+# likely that it's the code set, not the locale that's critical here; but
+# didn't run experiments to verify this.)  Hence, in the code below, CTYPE and
+# the tested categories are all set to the same locale.  If CTYPE isn't
+# available on the platform, LC_ALL is instead used.  One might think to just
+# use LC_ALL all the time, but on Windows
+#    setlocale(LC_ALL, "some_borked_locale")
+# can return success, whereas setting LC_CTYPE to it fails.
+my $master_category;
+$master_category = $category_number{'CTYPE'}
+        if is_category_valid('LC_CTYPE') && defined $category_number{'CTYPE'};
+$master_category = $category_number{'ALL'}
+        if ! defined $master_category
+          && is_category_valid('LC_ALL') && defined $category_number{'ALL'};
+
 sub _trylocale ($$$$) { # For use only by other functions in this file!
 
     # Adds the locale given by the first parameter to the list given by the
@@ -109,7 +147,8 @@ sub _trylocale ($$$$) { # For use only by other functions in this file!
     my $list = shift;
     my $allow_incompatible = shift;
 
-    return if ! $locale || grep { $locale eq $_ } @$list;
+    my $normalized_locale = lc ($locale =~ s/\W//gr);
+    return if ! $locale || grep { $normalized_locale eq lc ($_ =~ s/\W//gr) } @$list;
 
     # This is a toy (pig latin) locale that is not fully implemented on some
     # systems
@@ -122,63 +161,73 @@ sub _trylocale ($$$$) { # For use only by other functions in this file!
     # such systems fully, but we shouldn't disable the user from using
     # locales, as it may work out for them (or not).
     return if    defined $Config{d_setlocale_accepts_any_locale_name}
-              && $locale !~ / ^ (?: C | POSIX | C\.UTF-8 ) $/ix;
+              && $locale !~ / ^ (?: C | POSIX | C\.UTF-?8 ) $/ix;
+
+    if (exists $known_bad_locales{$^O}) {
+        my @bad_locales = $known_bad_locales{$^O}->@*;
+        return if grep { $locale eq $_ } @bad_locales;
+    }
 
     $categories = [ $categories ] unless ref $categories;
 
     my $badutf8 = 0;
     my $plays_well = 1;
+    my $unsupported = 0;
 
     use warnings 'locale';
 
     local $SIG{__WARN__} = sub {
         $badutf8 = 1 if grep { /Malformed UTF-8/ } @_;
+        $unsupported = 1 if grep { /Locale .* is unsupported/i } @_;
         $plays_well = 0 if grep {
-                    /Locale .* may not work well(?#
+                    /The following characters .* may not have the same meaning as the Perl program expects(?#
                    )|The Perl program will use the expected meanings/i
             } @_;
     };
 
-    # Incompatible locales aren't warned about unless using locales.
-    use locale;
+    my $first_time = 1;
+    foreach my $category ($master_category, $categories->@*) {
+        next if ! defined $category || (! $first_time && $category == $master_category);
+        $first_time = 0;
 
-    # Sort the input so CTYPE is first, COLLATE comes after all but ALL.  This
-    # is because locale.c detects bad locales only with CTYPE, and COLLATE on
-    # some platforms can core dump if it is a bad locale.
-    my @sorted;
-    my $has_ctype = 0;
-    my $has_all = 0;
-    my $has_collate = 0;
-    foreach my $category (@$categories) {
-        die "category '$category' must instead be a number"
-                                            unless $category =~ / ^ -? \d+ $ /x;
-        if ($category_name{$category} eq 'CTYPE') {
-            $has_ctype = 1;
+        my $save_locale = setlocale($category);
+        if (! $save_locale) {
+            _my_fail("Verify could save previous locale");
+            return;
         }
-        elsif ($category_name{$category} eq 'ALL') {
-            $has_all = 1;
-        }
-        elsif ($category_name{$category} eq 'COLLATE') {
-            $has_collate = 1;
+
+        # Incompatible locales aren't warned about unless using locales.
+        use locale;
+
+        my $result = setlocale($category, $locale);
+        return unless defined $result;
+
+        no locale;
+
+        # We definitely don't want the locale set to something that is
+        # unsupported
+        if (! setlocale($category, $save_locale)) {
+            my $error_text = "\$!=$!";
+            $error_text .= "; \$^E=$^E" if $^E != $!;
+            die "Couldn't restore locale '$save_locale', category $category;"
+              . $error_text;
         }
-        else {
-            push @sorted, $category unless grep { $_ == $category } @sorted;
+        if ($badutf8) {
+            _my_fail("Verify locale name doesn't contain malformed utf8");
+            return;
         }
-    }
-    push @sorted, $category_number{'COLLATE'} if $has_collate;
-    push @sorted, $category_number{'ALL'} if $has_all;
-    unshift @sorted, $category_number{'CTYPE'} if $has_ctype || ! $allow_incompatible;
 
-    foreach my $category (@sorted) {
-        return unless setlocale($category, $locale);
-        last if $badutf8 || ! $plays_well;
-    }
+        return if $unsupported;
+
+        # Commas in locale names are bad in Windows, and there is a bug in
+        # some versions where setlocale() turns a legal input locale name into
+        # an illegal return value, which it can't later parse.
+        return if $result =~ /,/;
 
-    if ($badutf8) {
-        _my_fail("Verify locale name doesn't contain malformed utf8");
-        return;
+        return unless $plays_well || $allow_incompatible;
     }
-    push @$list, $locale if $plays_well || $allow_incompatible;
+
+    push @$list, $locale;
 }
 
 sub _decode_encodings { # For use only by other functions in this file!
@@ -208,13 +257,6 @@ sub _decode_encodings { # For use only by other functions in this file!
     return @enc;
 }
 
-sub valid_locale_categories() {
-    # Returns a list of the locale categories (expressed as strings, like
-    # "LC_ALL) known to this program that are available on this platform.
-
-    return grep { is_category_valid($_) } @platform_categories;
-}
-
 sub locales_enabled(;$) {
     # If no parameter is specified, the function returns 1 if there is any
     # "safe" locale handling available to the caller; otherwise 0.  Safeness
@@ -318,8 +360,8 @@ sub locales_enabled(;$) {
                     unless defined $number;
             }
 
-            return 0 if     $number <= $max_bad_category_number
-                       || ! is_category_valid($name);
+            return 0 if   $number <= $max_bad_category_number
+                       || category_excluded($name);
 
 
             eval "defined &POSIX::LC_$name";
@@ -374,7 +416,9 @@ sub find_locales ($;$) {
     my $input_categories = shift;
     my $allow_incompatible = shift // 0;
 
-    my @categories = (ref $input_categories) ? $input_categories->@* : $input_categories;
+    my @categories = (ref $input_categories)
+                      ? $input_categories->@*
+                      : $input_categories;
     return unless locales_enabled(\@categories);
 
     # Note, the subroutine call above converts the $categories into a form
@@ -531,17 +575,17 @@ sub is_locale_utf8 ($) { # Return a boolean as to if core Perl thinks the input
 
     my $locale = shift;
 
-    use locale;
     no warnings 'locale'; # We may be trying out a weird locale
+    use locale;
 
     my $save_locale = setlocale(&POSIX::LC_CTYPE());
     if (! $save_locale) {
-        ok(0, "Verify could save previous locale");
+        _my_fail("Verify could save previous locale");
         return 0;
     }
 
     if (! setlocale(&POSIX::LC_CTYPE(), $locale)) {
-        ok(0, "Verify could setlocale to $locale");
+        _my_fail("Verify could setlocale to $locale");
         return 0;
     }
 
@@ -554,7 +598,7 @@ sub is_locale_utf8 ($) { # Return a boolean as to if core Perl thinks the input
     # go through testing all the locales on the platform.
     if (CORE::fc(chr utf8::unicode_to_native(0xdf)) ne "ss") {
         if ($locale =~ /UTF-?8/i) {
-            ok (0, "Verify $locale with UTF-8 in name is a UTF-8 locale");
+            _my_fail("Verify $locale with UTF-8 in name is a UTF-8 locale");
         }
     }
     else {
@@ -562,35 +606,51 @@ sub is_locale_utf8 ($) { # Return a boolean as to if core Perl thinks the input
     }
 
     die "Couldn't restore locale '$save_locale'"
-        unless setlocale(&POSIX::LC_CTYPE(), $save_locale);
+                            unless setlocale(&POSIX::LC_CTYPE(), $save_locale);
 
     return $ret;
 }
 
-sub find_utf8_ctype_locales (;$) { # Return the names of the locales that core
-                                  # Perl thinks are UTF-8 LC_CTYPE locales.
-                                  # Optional parameter is a reference to a
-                                  # list of locales to try; if omitted, this
-                                  # tries all locales it can find on the
-                                  # platform
-    return unless locales_enabled('LC_CTYPE');
+sub classify_locales_wrt_utf8ness($) {
 
-    my $locales_ref = shift;
-    my @return;
+    # Takes the input list of locales, and returns two lists split apart from
+    # it: the UTF-8 ones, and the non-UTF-8 ones.
 
-    if (! defined $locales_ref) {
+    my $locales_ref = shift;
+    my (@utf8, @non_utf8);
 
-        my @locales = find_locales(&POSIX::LC_CTYPE());
-        $locales_ref = \@locales;
+    if (! locales_enabled('LC_CTYPE')) {  # No CTYPE implies all are non-UTF-8
+        @non_utf8 = $locales_ref->@*;
+        return ( \@utf8, \@non_utf8 );
     }
 
     foreach my $locale (@$locales_ref) {
-        push @return, $locale if is_locale_utf8($locale);
+        my $which = (is_locale_utf8($locale)) ? \@utf8 : \@non_utf8;
+        push $which->@*, $locale;
     }
 
-    return @return;
+    return ( \@utf8, \@non_utf8 );
 }
 
+sub find_utf8_ctype_locales (;$) {
+
+    # Return the names of the locales that core Perl thinks are UTF-8 LC_CTYPE
+    # locales.  Optional parameter is a reference to a list of locales to try;
+    # if omitted, this tries all locales it can find on the platform
+
+    return unless locales_enabled('LC_CTYPE');
+
+    my $locales_ref = shift;
+    if (! defined $locales_ref) {
+
+        my @locales = find_locales(&POSIX::LC_CTYPE());
+        $locales_ref = \@locales;
+    }
+
+    my ($utf8_ref, undef) = classify_locales_wrt_utf8ness($locales_ref);
+    return unless $utf8_ref;
+    return $utf8_ref->@*;
+}
 
 sub find_utf8_ctype_locale (;$) { # Return the name of a locale that core Perl
                                   # thinks is a UTF-8 LC_CTYPE non-turkic
@@ -632,7 +692,9 @@ sub find_utf8_turkic_locales (;$) {
         setlocale(&POSIX::LC_CTYPE(), $locale);
         push @return, $locale if uc('i') eq "\x{130}";
     }
-    setlocale(&POSIX::LC_CTYPE(), $save_locale);
+
+    die "Couldn't restore locale '$save_locale'"
+                            unless setlocale(&POSIX::LC_CTYPE(), $save_locale);
 
     return @return;
 }
index 91976e5..9570976 100644 (file)
@@ -86,6 +86,17 @@ print sub { return "ok 1\n" } -> ();
 EXPECT
 ok 1
 ########
+my @void_warnings;
+{
+    use warnings;
+    local $SIG{'__WARN__'} = sub { push @void_warnings, @_ };
+    sub { 1 };
+    1
+}
+"@void_warnings"
+EXPECT
+Useless use of anonymous subroutine in void context at - line 5.
+########
 # [perl #71154] undef &$code makes $code->() die with: Not a CODE reference
 sub __ANON__ { print "42\n" }
 undef &{$x=sub{}};
index ae2ac32..188bedf 100644 (file)
@@ -6,7 +6,7 @@ BEGIN {
     set_up_inc('.', '../lib');
 }
 
-plan (195);
+plan (194);
 
 #
 # @foo, @bar, and @ary are also used from tie-stdarray after tie-ing them
@@ -686,8 +686,4 @@ $#a = -1; $#a++;
        'holes passed to sub do not lose their position (aelem, mg)';
 }
 
-# GH #21235
-fresh_perl_is('my @x;$x[0] = 1;shift @x;$x[22] = 1;$x[25] = 1;','',
-  {}, 'unshifting and growing an array initializes trailing elements');
-
 "We're included by lib/Tie/Array/std.t so we need to return something true";
index dd230b3..4313688 100644 (file)
@@ -112,6 +112,11 @@ eval 'package A; sub PS : lvalue';
 @attrs = eval 'attributes::get \&A::PS';
 is "@attrs", "lvalue";
 
+# Multiple attributes at once
+eval 'package A; sub PS2 : lvalue method';
+@attrs = eval 'attributes::get \&A::PS2';
+is "@attrs", "lvalue method", 'Multiple builtin attributes can be set at once';
+
 # Test attributes on predeclared subroutines, after definition
 eval 'package A; sub PS : lvalue; sub PS { }';
 @attrs = eval 'attributes::get \&A::PS';
index 10fc83f..33401bd 100644 (file)
@@ -6,7 +6,7 @@ BEGIN {
     set_up_inc('../lib');
 }
 
-plan tests => 22;
+plan tests => 26;
 
 my @expect = qw(
 b1
@@ -147,7 +147,6 @@ fresh_perl_is('END { print "ok\n" } INIT { bless {} and exit }', "ok\n",
               {}, 'null PL_curcop in newGP');
 
 # [perl #2754] exit(0) didn't exit from inside a UNITCHECK or CHECK block
-
 my $testblocks =
     join(" ",
         "BEGIN { \$| = 1; }",
@@ -167,21 +166,21 @@ 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"
     );
 
     fresh_perl_is(
         "$testblocks UNITCHECK { exit 0; }",
-        "begin\nunitcheck\ncheck\ninit\nmain\nend",
+        "begin\nunitcheck\ncheck\nend",
         {},
         "UNITCHECK{exit 0} doesn't exit yet"
     );
 
     fresh_perl_is(
         "$testblocks CHECK { exit 0; }",
-        "begin\nunitcheck\ncheck\ninit\nmain\nend",
+        "begin\nunitcheck\ncheck\nend",
         {},
         "CHECK{exit 0} doesn't exit yet"
     );
@@ -189,10 +188,6 @@ SKIP: {
 
 
 SKIP: {
-    if ($^O =~ /^(MSWin32|os2)$/) {
-        skip "non_UNIX plafforms and PERL_EXIT_DESTRUCT_END (RT #132863)", 6;
-    }
-
     fresh_perl_is(
         "$testblocks BEGIN { exit 1; }",
         "begin\nunitcheck\ncheck\nend",
@@ -258,6 +253,34 @@ fresh_perl_like(
     "INIT{die} should exit"
 );
 
+fresh_perl_is(
+    "BEGIN{} BEGIN(){1} print 'done'",
+    "Prototype on BEGIN block ignored at - line 1.\ndone",
+    {},
+    "Prototypes on BEGIN blocks should warn"
+);
+
+SKIP: {
+    skip "Test requires full perl, this is miniperl", 1
+        if is_miniperl;
+
+    fresh_perl_is(
+        "use attributes; BEGIN{} sub BEGIN :blerg {1} print 'done'",
+        "Attribute on BEGIN block ignored at - line 1.\ndone",
+        {},
+        "Attributes on BEGIN blocks should warn"
+    );
+}
+
+fresh_perl_is(
+    'BEGIN() {10} foreach my $p (sort {lc($a) cmp lc($b)} keys %v)',
+    "Prototype on BEGIN block ignored at - line 1.\n"
+    . "syntax error at - line 1, at EOF\n"
+    . "Execution of - aborted due to compilation errors.",
+    {},
+    "Prototype on BEGIN blocks should warn"
+);
+
 TODO: {
     local $TODO = 'RT #2917: INIT{} in eval is wrongly considered too late';
     fresh_perl_is('eval "INIT { print qq(in init); };";', 'in init', {}, 'RT #2917: No constraint on how late INIT blocks can run');
@@ -265,3 +288,7 @@ TODO: {
 
 fresh_perl_is('eval "BEGIN {goto end}"; end:', '', {}, 'RT #113934: goto out of BEGIN causes assertion failure');
 
+fresh_perl_is('package Module::Install::DSL; BEGIN { eval "INIT { print q(INIT fired in eval) }" }',
+    "Treating Module::Install::DSL::INIT block as BEGIN block as workaround at (eval 1) line 1.\n"
+    ."INIT fired in eval", {},
+   'GH Issue #16300: Module::Install::DSL workaround');
index 00bb984..7ae7fab 100644 (file)
@@ -339,14 +339,14 @@ do './op/caller.pl' or die $@;
 # See that callers within a nested series of 'use's gets the right
 # filenames.
 {
-    local @INC = 'lib/GH_15109/';
+    local @INC = 'lib/caller/';
     # Apack use's Bpack which use's Cpack which populates @Cpack::caller
     # with the file:N of all the callers
     eval 'use Apack; 1';
     is($@, "", "GH #15109 - eval");
     is (scalar(@Cpack::callers), 10, "GH #15109 - callers count");
-    like($Cpack::callers[$_], qr{GH_15109/Bpack.pm:3}, "GH #15109 level $_") for 0..2;
-    like($Cpack::callers[$_], qr{GH_15109/Apack.pm:3}, "GH #15109 level $_") for 3..5;
+    like($Cpack::callers[$_], qr{caller/Bpack.pm:3}, "GH #15109 level $_") for 0..2;
+    like($Cpack::callers[$_], qr{caller/Apack.pm:3}, "GH #15109 level $_") for 3..5;
     like($Cpack::callers[$_], qr{\(eval \d+\):1}, "GH #15109 level $_") for 6..8;
     like($Cpack::callers[$_], qr{caller\.t}, "GH #15109 level $_") for 9;
 
index b283e8c..588b4ed 100644 (file)
@@ -15,8 +15,6 @@ BEGIN {
   $^P |= 0x100; # Provide informative "file" names for evals
 }
 
-no warnings 'experimental::smartmatch';
-
 sub lis($$;$) {
   &is(map(@$_ ? "[@{[map $_//'~~u~~', @$_]}]" : 'nought', @_[0,1]), $_[2]);
 }
@@ -375,6 +373,7 @@ test_proto 'break';
 {
   $tests ++;
   my $tmp;
+  no warnings 'deprecated';
   CORE::given(1) {
     CORE::when(1) {
       &mybreak;
@@ -463,6 +462,7 @@ SKIP:
 
 test_proto 'continue';
 $tests ++;
+no warnings 'deprecated';
 CORE::given(1) {
   CORE::when(1) {
     &mycontinue();
@@ -1158,12 +1158,12 @@ like $@, qr'^Undefined format "STDOUT" called',
       File::Spec::Functions::updir,'regen','keywords.pl'
     );
   my %nottest_words = map { $_ => 1 } qw(
-    AUTOLOAD BEGIN CHECK CORE DESTROY END INIT UNITCHECK
+    ADJUST AUTOLOAD BEGIN CHECK CORE DESTROY END INIT UNITCHECK
     __DATA__ __END__
-    and catch cmp default defer do dump else elsif eq eval finally for foreach
-    format ge given goto grep gt if isa last le local lt m map my ne next no
-    or our package print printf q qq qr qw qx redo require return s say sort
-    state sub tr try unless until use when while x xor y
+    and catch class cmp default defer do dump else elsif eq eval field finally
+    for foreach format ge given goto grep gt if isa last le local lt m map
+    method my ne next no or our package print printf q qq qr qw qx redo require
+    return s say sort state sub tr try unless until use when while x xor y
   );
   open my $kh, $keywords_file
     or die "$0 cannot open $keywords_file: $!";
index 39f5864..ee36650 100644 (file)
@@ -15,11 +15,11 @@ BEGIN {
 use B;
 
 my %unsupported = map +($_=>1), qw (
- __DATA__ __END__ AUTOLOAD BEGIN UNITCHECK CORE DESTROY END INIT CHECK
-  and catch cmp default defer do dump else elsif eq eval finally for foreach
-  format ge given goto grep gt if isa last le local lt m map my ne next
-  no  or  our  package  print  printf  q  qq  qr  qw  qx  redo  require
-  return s say sort state sub tr try unless until use
+ __DATA__ __END__ ADJUST AUTOLOAD BEGIN UNITCHECK CORE DESTROY END INIT CHECK
+  and catch class cmp default defer do dump else elsif eq eval field
+  finally for foreach format ge given goto grep gt if isa last le local
+  lt m map method my ne next no or our package print printf q qq qr qw qx
+  redo require return s say sort state sub tr try unless until use
   when while x xor y
 );
 my %args_for = (
index eec1e8e..c657937 100644 (file)
@@ -6,7 +6,7 @@ BEGIN {
     set_up_inc('../lib');
 }
 
-plan tests => 21;
+plan tests => 26;
 
 use utf8;   # Tell EBCDIC translator to make this UTF-8,
 
@@ -101,10 +101,26 @@ like($@, qr/\.{3}propagated at/, '... and appends a phrase');
     like($@."", qr/100\t\.{3}propagated at/,
          'check non-PVs in $@ are propagated');
 }
+{
+    my @error;
+    local $SIG{__DIE__}= sub { push @error, @_ };
+    use strict;
+    my $ok= eval '$intentionally_missing+1';
+    my $eval_error= $@;
+    is($ok,undef,"eval should return undef");
+    is(0+@error,1,"we should have captured 1 error via __DIE__");
+    like( $error[0],
+          qr/Global symbol \"\$intentionally_missing\"/,
+          "The __DIE__ handler should have seen this message");
+    like( $eval_error,
+          qr/Global symbol \"\$intentionally_missing\"/,
+          "The eval error in '\$@' should contain this message");
+    is( $error[0], $eval_error,
+        "__DIE__ handler and \$@ should be the same");
+}
 
 TODO: {
     local $TODO = 'RT #4821: die qr{x} does not check termination';
     my $out = runperl(prog => 'die qr{x}', stderr => 1);
     like($out, qr/at -e line 1./, 'RT #4821: output from die qr{x}');
 }
-
index 97a2427..d8af742 100644 (file)
@@ -266,24 +266,32 @@ for my $k (qw(each keys values)) {
     is join ("-", each %h), '1-2',
        'each on apparently empty hash does not leave RITER set';
 }
-{
+SKIP:{
+    my $code= <<'TEST_CODE';
     my $warned= 0;
     local $SIG{__WARN__}= sub {
         /\QUse of each() on hash after insertion without resetting hash iterator results in undefined behavior\E/
-            and $warned++ for @_;
+            and $warned=1 for @_;
     };
     my %h= map { $_ => $_ } "A".."F";
     while (my ($k, $v)= each %h) {
         $h{"$k$k"}= $v;
     }
-    ok($warned,"each() after insert produces warnings");
+    print "a:$warned,";
     no warnings 'internal';
     $warned= 0;
     %h= map { $_ => $_ } "A".."F";
     while (my ($k, $v)= each %h) {
         $h{"$k$k"}= $v;
     }
-    ok(!$warned, "no warnings 'internal' silences each() after insert warnings");
+    print "b:$warned\n";
+TEST_CODE
+    local $ENV{PERL_HASH_SEED};
+    local $ENV{PERL_PERTURB_KEYS};
+    fresh_perl_like($code,
+            qr/\Aa:1,b:0\z/,
+            undef,
+            'Hash iterator reset warnings fires when expected');
 }
 {
     # Test that the call to hv_iternext_flags() that calls prime_env_iter()
index a9b8c9e..6847a5b 100644 (file)
@@ -6,7 +6,7 @@ BEGIN {
     set_up_inc('../lib');
 }
 
-plan(tests => 140);
+plan(tests => 167);
 
 eval 'pass();';
 
@@ -514,7 +514,7 @@ END_EVAL_TEST
     my $t;
     my $s = "a";
     $s =~ s/a/$t = \%^H;  qq( qq() );/ee;
-    is(Internals::SvREFCNT(%$t), $count_expected, 'RT 63110');
+    refcount_is $t, $count_expected, 'RT 63110';
 }
 
 # make sure default arg eval only adds a hints hash once to entereval
@@ -531,9 +531,9 @@ END_EVAL_TEST
     # test that the CV compiled for the eval is freed by checking that no additional 
     # reference to outside lexicals are made.
     my $x;
-    is(Internals::SvREFCNT($x), 1, "originally only 1 reference");
+    refcount_is \$x, 1+1, "originally only 1 reference"; # + 1 to account for the ref here
     eval '$x';
-    is(Internals::SvREFCNT($x), 1, "execution eval doesn't create new references");
+    refcount_is \$x, 1+1, "execution eval doesn't create new references"; # + 1 the same
 }
 
 fresh_perl_is(<<'EOP', "ok\n", undef, 'RT #70862');
@@ -625,6 +625,7 @@ for("{;", "{") {
     eval $_; is $@ =~ s/eval \d+/eval 1/rag, <<'EOE',
 Missing right curly or square bracket at (eval 1) line 1, at end of line
 syntax error at (eval 1) line 1, at EOF
+Execution of (eval 1) aborted due to compilation errors.
 EOE
        qq'Right line number for eval "$_"';
 }
@@ -697,3 +698,61 @@ pass("eval in freed package does not crash");
     eval q{ { 1; { 1; my $x = bless []; die $x = 0, "die in eval"; } } };
     ::like ($@, qr/die in eval/, "FREETMPS: die eval string exit");
 }
+
+{
+    local ${^MAX_NESTED_EVAL_BEGIN_BLOCKS}= 0;
+    my ($x, $ok);
+    $x = 0;
+    $ok= eval 'BEGIN { $x++ } 1';
+    ::ok(!$ok,'${^MAX_NESTED_EVAL_BEGIN_BLOCKS} = 0 blocks BEGIN blocks entirely');
+    ::like($@,qr/Too many nested BEGIN blocks, maximum of 0 allowed/,
+        'Blocked BEGIN results in expected error');
+    ::is($x,0,'BEGIN really did nothing');
+
+    ${^MAX_NESTED_EVAL_BEGIN_BLOCKS}= 2;
+    $ok= eval 'sub f { my $n= shift; eval q[BEGIN { $x++; f($n-1) if $n>0 } 1] or die $@ } f(3); 1';
+    ::ok(!$ok,'${^MAX_NESTED_EVAL_BEGIN_BLOCKS} = 2 blocked three nested BEGIN blocks');
+    ::like($@,qr/Too many nested BEGIN blocks, maximum of 2 allowed/,
+        'Blocked BEGIN results in expected error');
+    ::is($x,2,'BEGIN really did nothing');
+
+}
+
+{
+    # make sure that none of these segfault.
+    foreach my $line (
+        'eval "UNITCHECK { eval q(UNITCHECK { die; }); print q(A-) }";',
+        'eval "UNITCHECK { eval q(BEGIN     { die; }); print q(A-) }";',
+        'eval "BEGIN     { eval q(UNITCHECK { die; }); print q(A-) }";',
+        'CHECK     { eval "]" } print q"A-";',
+        'INIT      { eval "]" } print q"A-";',
+        'UNITCHECK { eval "]" } print q"A-";',
+        'BEGIN     { eval "]" } print q"A-";',
+        'INIT      { eval q(UNITCHECK { die; } print 0;); print q(A-); }',
+    ) {
+        fresh_perl_is($line . ' print "ok";', "A-ok", {}, "No segfault: $line");
+
+        # sort blocks are somewhat special and things that work in normal blocks
+        # can blow up in sort blocks, so test these constructs specially.
+        my $sort_line= 'my @x= sort { ' . $line . ' } 1,2;';
+        fresh_perl_is($sort_line . ' print "ok";', "A-ok", {},
+            "No segfault inside sort: $sort_line");
+    }
+}
+{
+    # test that all of these cases behave the same
+    for my $fragment ('bar', '1+;', '1+;' x 11, 's/', ']') {
+        fresh_perl_is(
+            # code:
+            'use strict; use warnings; $SIG{__DIE__} = sub { die "X" }; ' .
+            'eval { eval "'.$fragment.'"; print "after eval $@"; };' .
+            'if ($@) { print "outer eval $@" }',
+            # wanted:
+            "after eval X at - line 1.",
+            # opts:
+            {},
+            # name:
+            "test that nested eval '$fragment' calls sig die as expected"
+        );
+    }
+}
index a4d8066..b931a66 100644 (file)
@@ -756,4 +756,20 @@ is(fscope(), 1, 'return via loop in sub');
     }
 }
 
+# the GV of the loop variable didn't have its refcount bumped while being
+# used by the loop, so it was possible to free it mid-loop.  This used to
+# assert/SEGV
+
+{
+    my $f = "a_low_refcnt_package_var";
+    my $i = 0;
+    no strict 'refs';
+    for ${*$f} (5,11,33) {
+        delete $main::{$f};
+        $i++;
+    }
+    is($i, 3, "deleting glob is safe");
+}
+
+
 done_testing();
index 52206c7..82e90fe 100644 (file)
@@ -21,6 +21,8 @@ my $shell = $ENV{SHELL} || '';
 SKIP: {
     skip "This test can only be run under bash or zsh"
         unless $shell =~ m{/(?:ba|z)sh$};
+    skip "LSAN noise failing to create a thread due to limits"
+        if $Config::Config{ccflags} =~ /sanitize=address/;
     my $probe = qx{
         $shell -c 'ulimit -u 1 2>/dev/null && echo good'
     };
index fc0fa52..0a5dbce 100755 (executable)
@@ -100,7 +100,7 @@ sub fork_and_retrieve {
                }
            } else {
                # Fudge it by waiting a bit more:
-               sleep 3;
+               sleep 2;
            }
            my $ppid2 = getppid();
            print $w "$how,$ppid1,$ppid2\n";
index 01f46a0..27dc397 100644 (file)
@@ -19,10 +19,16 @@ elsif ($^O eq 'VMS') {
   map { s/;.*$//; delete $files{lc($_)}; } split /[\n]/, `directory/noheading/notrailing/versions=1 [.op]`,
 }
 else {
+  local %ENV = %ENV;
+  # disable any env vars that might cause ls or dir to add colors or
+  # otherwise modify the output.
+  /COLOR|LS|CLI/i and delete $ENV{$_} for keys %ENV;
+
   map { $files{$_}++ } <op/*>;
-  map { delete $files{$_} } split /\n/, `ls op/* | cat`;
+  map { delete $files{"op/$_"} } split /\n/, `ls op/ | cat`;
 }
-ok( !(keys(%files)),'leftover op/* files' ) or diag(join(' ',sort keys %files));
+ok( !(keys(%files)),'glob and directory listing agree' )
+    or diag(join(' ',sort keys %files));
 
 cmp_ok($/,'eq',"\n",'sane input record separator');
 
index 80c99d2..d951aef 100644 (file)
@@ -11,7 +11,7 @@ BEGIN {
 
 use warnings;
 use strict;
-plan tests => 125;
+plan tests => 133;
 our $TODO;
 
 my $deprecated = 0;
@@ -902,3 +902,51 @@ is $@,'', 'goto the first parameter of a binary expression [perl #132854]';
     eval { f198(); };
     is $@, "", "v5.31.3-198-gd2cd363728";
 }
+
+# GH #19188
+#
+# 'goto &xs_sub' should provide the correct caller context to an XS sub
+
+SKIP:
+{
+    skip "No XS::APItest in miniperl", 6 if is_miniperl();
+
+    require XS::APItest;
+
+    sub f_19188 { goto &XS::APItest::gimme }
+    sub g_19188{ f_19188(); }
+    my ($s, @a);
+
+    f_19188();
+    is ($XS::APItest::GIMME_V, 1, 'xs_goto void (#19188)');
+
+    $s = f_19188();
+    is ($XS::APItest::GIMME_V, 2, 'xs_goto scalar (#19188)');
+
+    @a = f_19188();
+    is ($XS::APItest::GIMME_V, 3, 'xs_goto list (#19188)');
+
+    g_19188();
+    is ($XS::APItest::GIMME_V, 1, 'xs_goto indirect void (#19188)');
+
+    $s = g_19188();
+    is ($XS::APItest::GIMME_V, 2, 'xs_goto indirect scalar (#19188)');
+
+    @a = g_19188();
+    is ($XS::APItest::GIMME_V, 3, 'xs_goto indirect list (#19188)');
+}
+
+# GH #19936 segfault on goto &xs_sub when calling sub is replaced
+SKIP:
+{
+    skip "No XS::APItest in miniperl", 2 if is_miniperl();
+
+    # utf8::is_utf8() is just an example of an XS sub
+    sub foo_19936 { *foo_19936 = {}; goto &utf8::is_utf8 }
+    ok(foo_19936("\x{100}"), "GH #19936 utf8 XS call");
+
+    # the gimme XS function accesses PL_op, which was null before the fix
+    sub bar_19936 { *bar_19936 = {}; goto &XS::APItest::gimme }
+    my @a = bar_19936();
+    is($XS::APItest::GIMME_V, 3, "GH #19936 gimme XS call");
+}
index 0a7bb06..f959bf8 100644 (file)
@@ -7,7 +7,7 @@ BEGIN {
 }
 
 use strict;
-plan(tests => 137);
+plan(tests => 138);
 
 # heredoc without newline (#65838)
 {
@@ -93,7 +93,7 @@ HEREDOC
     fresh_perl_like(
         qq(0<<<<""0\n\n),
         # valgrind and asan reports an error between these two lines
-        qr/^Number found where operator expected at - line 1, near "<<""0"\s+\(Missing operator/,
+        qr/^Number found where operator expected \(Missing operator before "0"\?\) at - line 1, near "<<""0"/,
         {},
         "don't use an invalid oldoldbufptr"
     );
@@ -233,3 +233,13 @@ HEREDOC
         );
     }
 }
+fresh_perl_like(
+q#<<E1;
+${sub{b{]]]{} @{[ <<E2 ]}
+E2
+E1
+#,
+    qr/^syntax error/,
+    {},
+    "GH Issue #17397 - Syntax error inside of here doc causes segfault"
+);
index 5fb80d3..8611e0f 100644 (file)
@@ -138,10 +138,10 @@ sub get_warn() {
 
 { # Test certain things that are not hexfloats and should stay that way.
     eval '0xp3';
-    like(get_warn(), qr/Missing operator before p3/);
+    like(get_warn(), qr/Missing operator before "p3"/);
 
     eval '5p3';
-    like(get_warn(), qr/Missing operator before p3/);
+    like(get_warn(), qr/Missing operator before "p3"/);
 
     my @a;
     eval '@a = 0x3..5';
index 4e81a8a..ef124f3 100644 (file)
@@ -21,7 +21,7 @@ unless (is_miniperl()) {
 
 use strict;
 
-plan(tests => 68 + !is_miniperl() * (3 + 14 * $can_fork));
+plan(tests => 71 + !is_miniperl() * (4 + 14 * $can_fork));
 
 sub get_temp_fh {
     my $f = tempfile();
@@ -179,6 +179,26 @@ is( $INC{'Toto.pm'}, 'xyz',           '  val Toto.pm is correct in %INC' );
 
 pop @INC;
 
+{
+    my $autoloaded;
+    package AutoInc {
+        sub AUTOLOAD {
+            my ($self, $filename) = @_;
+            $autoloaded = our $AUTOLOAD;
+            return ::get_temp_fh($filename);
+        }
+        sub DESTROY {}
+    }
+
+    push @INC, bless {}, "AutoInc";
+    $evalret = eval { require Quux3; 1 };
+    ok($evalret, "require Quux3 via AUTOLOADed INC");
+    ok(exists $INC{"Quux3.pm"}, "Quux3 in %INC");
+    is($autoloaded, "AutoInc::INC", "AUTOLOAD was called for INC");
+
+    pop @INC;
+}
+
 push @INC, sub {
     my ($self, $filename) = @_;
     if ($filename eq 'abc.pl') {
@@ -247,16 +267,17 @@ shift @INC;
     my $data = [];
     unshift @INC, sub { $die, $data };
 
-    my $initial_sub_refcnt = &Internals::SvREFCNT($die);
-    my $initial_data_refcnt = &Internals::SvREFCNT($data);
+    # + 1 to account for prototype-defeating &... calling convention
+    my $initial_sub_refcnt = &Internals::SvREFCNT($die) + 1;
+    my $initial_data_refcnt = &Internals::SvREFCNT($data) + 1;
 
     do "foo";
-    is(&Internals::SvREFCNT($die), $initial_sub_refcnt, "no leaks");
-    is(&Internals::SvREFCNT($data), $initial_data_refcnt, "no leaks");
+    refcount_is $die, $initial_sub_refcnt, "no leaks";
+    refcount_is $data, $initial_data_refcnt, "no leaks";
 
     do "bar";
-    is(&Internals::SvREFCNT($die), $initial_sub_refcnt, "no leaks");
-    is(&Internals::SvREFCNT($data), $initial_data_refcnt, "no leaks");
+    refcount_is $die, $initial_sub_refcnt, "no leaks";
+    refcount_is $data, $initial_data_refcnt, "no leaks";
 
     shift @INC;
 }
@@ -293,13 +314,13 @@ SKIP: {
     $$t = sub { $called ++; !1 };
     delete $INC{'foo.pm'}; # in case another test uses foo
     eval { require foo };
-    is $INCtie::count, 2, # 2nd time for "Can't locate" -- XXX correct?
+    is $INCtie::count, 1,
         'FETCH is called once on undef scalar-tied @INC elem';
     is $called, 1, 'sub in scalar-tied @INC elem is called';
     () = "$INC[0]"; # force a fetch, so the SV is ROK
     $INCtie::count = 0;
     eval { require foo };
-    is $INCtie::count, 2,
+    is $INCtie::count, 1,
         'FETCH is called once on scalar-tied @INC elem holding ref';
     is $called, 2, 'sub in scalar-tied @INC elem holding ref is called';
     $$t = [];
@@ -310,7 +331,7 @@ SKIP: {
     $$t = "string";
     $INCtie::count = 0;
     eval { require foo };
-    is $INCtie::count, 2,
+    is $INCtie::count, 1,
        'FETCH called once on scalar-tied @INC elem returning string';
 }
 
@@ -396,3 +417,12 @@ if ($can_fork) {
 
     is ("@::bbblplast", "0 1 2 3 4 5", "All ran with a filter");
 }
+SKIP:{
+    skip "need fork",1 unless $can_fork;
+    fresh_perl_like('@INC=("A",bless({},"Hook"),"D"); '
+                 .'sub Hook::INCDIR { return "B","C"} '
+                 .'eval "require Frobnitz" or print $@;',
+                  qr/\(\@INC[\w ]+: A Hook=HASH\(0x[A-Fa-f0-9]+\) B C D\)/,
+                  {},
+                  "Check if INCDIR hook works as expected");
+}
index 59be493..f36f289 100755 (executable)
@@ -5,7 +5,11 @@
 use strict;
 use warnings;
 
-BEGIN { chdir 't' if -d 't'; require './test.pl'; }
+BEGIN {
+    chdir "t" if -d "t";
+    require './test.pl';
+    @INC= "../lib";
+}
 
 plan(tests => 53);
 
@@ -131,20 +135,18 @@ SKIP: {
     skip "Different output on EBCDIC (presumably)", 3 if $::IS_EBCDIC;
     fresh_perl_is(
       qq'"ab}"ax;&\0z\x8Ao}\x82x;', <<gibberish,
-Bareword found where operator expected at - line 1, near ""ab}"ax"
-       (Missing operator before ax?)
+Bareword found where operator expected (Missing operator before "ax"?) at - line 1, near ""ab}"ax"
 syntax error at - line 1, near ""ab}"ax"
-Unrecognized character \\x8A; marked by <-- HERE after ab}"ax;&\0z<-- HERE near column 12 at - line 1.
+Execution of - aborted due to compilation errors.
 gibberish
        { stderr => 1 },
       'gibberish containing &\0z - used to crash [perl #123753]'
     );
     fresh_perl_is(
       qq'"ab}"ax;&{+z}\x8Ao}\x82x;', <<gibberish,
-Bareword found where operator expected at - line 1, near ""ab}"ax"
-       (Missing operator before ax?)
+Bareword found where operator expected (Missing operator before "ax"?) at - line 1, near ""ab}"ax"
 syntax error at - line 1, near ""ab}"ax"
-Unrecognized character \\x8A; marked by <-- HERE after }"ax;&{+z}<-- HERE near column 14 at - line 1.
+Execution of - aborted due to compilation errors.
 gibberish
        { stderr => 1 },
       'gibberish containing &{+z} - used to crash [perl #123753]'
index 6635d88..1f97d39 100644 (file)
@@ -227,6 +227,35 @@ is($@, '', 'ex-PVBM assert'.$@);
     cmp_ok($diff, '<',  2,  "time delta is small");
 }
 
+# GH #20132 and parts of GH ##20114
+# During development of OP_PADSV_STORE, interactions with OP_PADRANGE
+# caused BBC failures not picked up by any pre-existing core tests.
+# (Problems only arose in list context, the void/scalar tests have been
+# included for completeness.)
+eval {
+    my $x = {}; my $y;
+    keys %{$y = $x};
+    1;
+};
+is($@, '', 'keys %{$y = $x}');
+
+eval {
+    my $x = {}; my $y;
+    my $foo = keys %{$y = $x};
+    1;
+};
+is($@, '', 'my $foo = keys %{$y = $x}');
+
+eval {
+    my $x = {}; my $y;
+    my @foo = keys %{$y = $x};
+    1;
+};
+is($@, '', 'my @foo = keys %{$y = $x}');
+
+fresh_perl_is('my ($x, $y); (($y = $x))', '', {}, '(($y = $x))');
+fresh_perl_is('my ($x, $y); my $z= (($y = $x))', '', {}, 'my $z= (($y = $x))');
+fresh_perl_is('my ($x, $y); my @z= (($y = $x))', '', {}, 'my @z= (($y = $x))');
 
 done_testing();
 
index 2004a50..b91c4d9 100644 (file)
@@ -434,8 +434,13 @@ EOP
 }
 
 # Check that assigning to $0 properly handles UTF-8-stored strings:
+SKIP:
 {
-
+  # setproctitle() misbehaves on dragonfly
+  # https://bugs.dragonflybsd.org/issues/3319
+  # https://github.com/Perl/perl5/issues/19894
+  skip "setproctitle() is flaky on DragonflyBSD", 11
+      if $^O eq "dragonfly";
   # Test both ASCII and EBCDIC systems:
   my $char = chr( utf8::native_to_unicode(0xe9) );
 
index ff404a9..eaa129a 100644 (file)
@@ -253,7 +253,10 @@ sub OtherSouper::method { "Isidore Ropen, Draft Manager" }
    my @ret = $o->SUPER::method('whatever');
    ::is $ret[0], $o, 'object passed to SUPER::method';
    ::is $ret[1], 'whatever', 'argument passed to SUPER::method';
-   @ret = $o->SUPER'method('whatever');
+   {
+       no warnings qw(syntax deprecated);
+       @ret = $o->SUPER'method('whatever');
+   }
    ::is $ret[0], $o, "object passed to SUPER'method";
    ::is $ret[1], 'whatever', "argument passed to SUPER'method";
    @ret = Saab->SUPER::method;
@@ -428,7 +431,7 @@ is $kalled, 1, 'calling a class method via a magic variable';
     eval {
         NulTest->${ \"method\0Whoops" };
     };
-    like $@, qr/Can't locate object method "method\0Whoops" via package "NulTest" at/,
+    like $@, qr/Can't locate object method "method\\0Whoops" via package "NulTest" at/,
             "method lookup is nul-clean";
 
     *NulTest::AUTOLOAD = sub { our $AUTOLOAD; return $AUTOLOAD };
index 949daa3..93865b0 100644 (file)
@@ -6,7 +6,7 @@ BEGIN {
     set_up_inc(qw '../lib ../cpan/Math-BigInt/lib');
 }
 
-plan tests => 14720;
+plan tests => 14722;
 
 use strict;
 use warnings qw(FATAL all);
@@ -276,11 +276,7 @@ sub list_eq ($$) {
        if (($^O eq 'VMS') && !defined($Config{useieee}) || !$Config{d_double_has_inf});
 
     skip("-- $^O has serious fp indigestion on w-packed infinities", 1)
-       if (
-          ($^O eq 'ultrix')
-          ||
-          ($^O =~ /^svr4/ && -f "/etc/issue" && -f "/etc/.relid") # NCR MP-RAS
-          );
+       if $^O =~ /^svr4/ && -f "/etc/issue" && -f "/etc/.relid";  # NCR MP-RAS
 
     my $inf = eval '2**1000000';
 
@@ -300,9 +296,6 @@ sub list_eq ($$) {
     skip("-- the full range of an IEEE double may not be available in this configuration.", 3)
        if (($^O eq 'VMS') && !defined($Config{useieee}) || !$Config{d_double_style_ieee});
 
-    skip("-- $^O does not like 2**1023", 3)
-       if (($^O eq 'ultrix'));
-
     # This should be about the biggest thing possible on an IEEE double
     my $big = eval '2**1023';
 
@@ -2044,3 +2037,14 @@ SKIP:
     fresh_perl_is('0.0 + unpack("u", "ab")', "", { stderr => 1 },
                   "ensure unpack u of invalid data nul terminates result");
 }
+
+{
+       # [GH #16319] SEGV caused by recursion
+       my $x = eval { pack "[" x 1_000_000 };
+       like("$@", qr{No group ending character \Q']'\E found in template},
+                       "many opening brackets should not smash the stack");
+
+       $x = eval { pack "[(][)]" };
+       like("$@", qr{Mismatched brackets in template},
+                       "should match brackets correctly even without recursion");
+}
index ba4efa7..e007730 100644 (file)
@@ -6,7 +6,7 @@ BEGIN {
     set_up_inc('../lib');
 }
 
-plan tests => 32;
+plan tests => 36;
 
 # [perl #19566]: sv_gets writes directly to its argument via
 # TARG. Test that we respect SvREADONLY.
@@ -289,6 +289,21 @@ is ${^LAST_FH}, undef, '${^LAST_FH} after readline undef';
         '[perl #123790] *x=<y> used to fail an assertion';
 }
 
+SKIP:
+{
+    skip_without_dynamic_extension("IO", 4);
+    my $tmpfile = tempfile();
+    open my $fh, ">", $tmpfile
+        or die "Cannot open $tmpfile: $!";
+    my @layers = PerlIO::get_layers($fh);
+    skip "fgetc doesn't set error flag on failure on solaris likes", 4
+        if $^O eq 'solaris' && $layers[-1] eq 'stdio';
+    ok(!$fh->error, "no error before we try to read");
+    ok(!<$fh>, "fail to readline file opened for write");
+    ok($fh->error, "error after trying to readline file opened for write");
+    ok(!close($fh), "closing the file should fail");
+}
+
 __DATA__
 moo
 moo
index 77b5193..d53fac4 100644 (file)
@@ -265,8 +265,10 @@ is (join('', sort values %$anonhash2), 'BARXYZ');
 # Test bless operator.
 
 package MYHASH;
-
-$object = bless $main'anonhash2;
+{
+    no warnings qw(syntax deprecated);
+    $object = bless $main'anonhash2;
+}
 main::is (ref $object, 'MYHASH');
 main::is ($object->{ABC}, 'XYZ');
 
@@ -290,7 +292,10 @@ sub mymethod {
 $string = "bad";
 $object = "foo";
 $string = "good";
-$main'anonhash2 = "foo";
+{
+    no warnings qw(syntax deprecated);
+    $main'anonhash2 = "foo";
+}
 $string = "";
 
 DESTROY {
@@ -307,7 +312,10 @@ package OBJ;
 
 @ISA = ('BASEOBJ');
 
-$main'object = bless {FOO => 'foo', BAR => 'bar'};
+{
+    no warnings qw(syntax deprecated);
+    $main'object = bless {FOO => 'foo', BAR => 'bar'};
+}
 
 package main;
 
@@ -320,10 +328,13 @@ is ($object->doit("BAR"), 'bar');
 $foo = doit $object "FOO";
 main::is ($foo, 'foo');
 
-sub BASEOBJ'doit {
-    local $ref = shift;
-    die "Not an OBJ" unless ref $ref eq 'OBJ';
-    $ref->{shift()};
+{
+    no warnings qw(syntax deprecated);
+    sub BASEOBJ'doit {
+        local $ref = shift;
+        die "Not an OBJ" unless ref $ref eq 'OBJ';
+        $ref->{shift()};
+    }
 }
 
 package UNIVERSAL;
index 637457b..2d7c587 100644 (file)
@@ -9,7 +9,13 @@ BEGIN {
 use strict;
 use warnings;
 
-plan(tests => 57);
+plan(tests => 73);
+
+
+# Dedupe @INC. In a future patch we /may/ refuse to process items
+# more than once and deduping here will prevent the tests from failing
+# should we make that change.
+my %seen; @INC = grep {!$seen{$_}++} @INC;
 
 my $nonfile = tempfile();
 
@@ -21,7 +27,7 @@ for my $file ($nonfile, ' ') {
        require $file;
     };
 
-    like $@, qr/^Can't locate $file in \@INC \(\@INC contains: @INC\) at/,
+    like $@, qr/^Can't locate $file in \@INC \(\@INC[\w ]+: \Q@INC\E\) at/,
        "correct error message for require '$file'";
 }
 
@@ -85,7 +91,7 @@ for my $file ($nonfile, ' ') {
                 $hint =~ s/\.pm$//;
                 $exp .= " (you may need to install the $hint module)";
             }
-            $exp .= " (\@INC contains: @INC) at";
+            $exp .= " (\@INC entries checked: @INC) at";
         }
         else {
             # undef implies a require which doesn't compile,
@@ -133,14 +139,14 @@ eval {
     require "$nonfile.ph";
 };
 
-like $@, qr/^Can't locate $nonfile\.ph in \@INC \(did you run h2ph\?\) \(\@INC contains: @INC\) at/;
+like $@, qr/^Can't locate $nonfile\.ph in \@INC \(did you run h2ph\?\) \(\@INC[\w ]+: @INC\) at/;
 
 for my $file ("$nonfile.h", ".h") {
     eval {
        require $file
     };
 
-    like $@, qr/^Can't locate \Q$file\E in \@INC \(change \.h to \.ph maybe\?\) \(did you run h2ph\?\) \(\@INC contains: @INC\) at/,
+    like $@, qr/^Can't locate \Q$file\E in \@INC \(change \.h to \.ph maybe\?\) \(did you run h2ph\?\) \(\@INC[\w ]+: @INC\) at/,
        "correct error message for require '$file'";
 }
 
@@ -149,7 +155,7 @@ for my $file ("$nonfile.ph", ".ph") {
        require $file
     };
 
-    like $@, qr/^Can't locate \Q$file\E in \@INC \(did you run h2ph\?\) \(\@INC contains: @INC\) at/,
+    like $@, qr/^Can't locate \Q$file\E in \@INC \(did you run h2ph\?\) \(\@INC[\w ]+: @INC\) at/,
        "correct error message for require '$file'";
 }
 
@@ -283,3 +289,144 @@ like $@, qr/^Can't locate \Q$nonsearch\E at/,
        "check the second attempt also fails");
     like $@, qr/Attempt to reload/, "check we failed for the right reason";
 }
+
+{
+    fresh_perl_like(
+        'unshift @INC, sub { sub { 0 } }; require "asdasd";',
+        qr/asdasd did not return a true value/,
+        { }, '@INC hook blocks do not cause segfault');
+}
+
+{
+    # make sure that modifications to %INC during an INC hooks lifetime
+    # don't result in us having an empty string for the cop_file.
+    # Older perls will output "error at  line 1".
+
+    fresh_perl_like(
+        'use lib qq(./lib); BEGIN{ unshift @INC, '
+       .'sub { if ($_[1] eq "CannotParse.pm" and !$seen++) { '
+       .'eval q(require $_[1]); warn $@; my $code= qq[die qq(error)];'
+       .'open my $fh,"<", q(lib/Dies.pm); return $fh } } } require CannotParse;',
+        qr!\Asyntax error.*?^error at /loader/0x[A-Fa-f0-9]+/CannotParse\.pm line 1\.!ms,
+        { }, 'Inc hooks have the correct cop_file');
+}
+{
+    # this can segfault or assert prior to @INC hardening.
+    fresh_perl_like(
+        'unshift @INC, sub { *INC=["a","b"] }; '
+       .'eval "require Frobnitz" or print $@',
+        qr!\(\@INC[\w ]+: CODE\(0x[A-Fa-f0-9]+\) b\)!,
+        { }, 'INC hooks do not segfault when overwritten');
+}
+{
+    # this is the defined behavior, but in older perls the error message
+    # would lie and say "contains: a b", which is true in the sense that
+    # it is the value of @INC after the require, but not the directory
+    # list that was looked at.
+    fresh_perl_like(
+        '@INC = (sub { @INC=("a","b"); () }, "z"); '
+       .'eval "require Frobnitz" or print $@',
+        qr!\(\@INC[\w ]+: CODE\(0x[A-Fa-f0-9]+\) b\)!,
+        { }, 'INC hooks that overwrite @INC continue as expected (skips a and z)');
+}
+{
+    # as of 5.37.7
+    fresh_perl_like(
+        '@INC = (sub { @INC=qw(a b); undef $INC }, "z"); '
+       .'eval "require Frobnitz" or print $@',
+        qr!\(\@INC[\w ]+: CODE\(0x[A-Fa-f0-9]+\) a b\)!,
+        { }, 'INC hooks that overwrite @INC and undef $INC continue at start');
+}
+{
+    # as of 5.37.7
+    fresh_perl_like(
+        'sub CB::INCDIR { return "b", "c","d" }; '
+       .'@INC = ("a",bless({},"CB"),"e");'
+       .'eval "require Frobnitz" or print $@',
+        qr!\(\@INC[\w ]+: a CB=HASH\(0x[A-Fa-f0-9]+\) b c d e\)!,
+        { }, 'INCDIR works as expected');
+}
+{
+    # as of 5.37.7
+    fresh_perl_like(
+        '@INC = ("a",bless({},"CB"),"e");'
+       .'eval "require Frobnitz" or print $@',
+        qr!Can't locate object method "INC", nor "INCDIR" nor string overload via package "CB" in object hook in \@INC!,
+        { }, 'Objects with no INC or INCDIR method and no overload throw an error');
+}
+{
+    # as of 5.37.7
+    fresh_perl_like(
+        'package CB { use overload q("") => sub { "Fnorble" };} @INC = ("a",bless({},"CB"),"e");'
+       .'eval "require Frobnitz" or print $@',
+        qr!\(\@INC[\w ]+: a Fnorble e\)!,
+        { }, 'Objects with no INC or INCDIR method but with an overload are stringified');
+}
+{
+    # as of 5.37.7
+    fresh_perl_like(
+        'package CB { use overload q(0+) => sub { 12345 }, fallback=>1;} @INC = ("a",bless({},"CB"),"e");'
+       .'eval "require Frobnitz" or print $@',
+        qr!\(\@INC[\w ]+: a 12345 e\)!,
+        { }, 'Objects with no INC or INCDIR method but with an overload with fallback are stringified');
+}
+{
+    # as of 5.37.7
+    fresh_perl_like(
+        '{package CB; use overload qw("")=>sub { "blorg"};} '
+       .'@INC = ("a",bless({},"CB"),"e");'
+       .'eval "require Frobnitz" or print $@',
+        qr!\(\@INC[\w ]+: a blorg e\)!,
+        { }, 'Objects with overload and no INC or INCDIR method are stringified');
+}
+{
+    # as of 5.37.7
+    fresh_perl_like(
+        '@INC = ("a",bless(sub { warn "blessed sub called" },"CB"),"e");'
+       .'eval "require Frobnitz" or print $@',
+        qr!blessed sub called.*\(\@INC[\w ]+: a CB=CODE\(0x[a-fA-F0-9]+\) e\)!s,
+        { }, 'Blessed subs with no hook methods are executed');
+}
+{
+    # as of 5.37.7
+    fresh_perl_like(
+        '@INC = ("a",bless(sub { die "blessed sub called" },"CB"),"e");'
+       .'eval "require Frobnitz" or print $@',
+        qr!INC sub hook died--halting \@INC search!s,
+        { }, 'Blessed subs that die produce expected extra message');
+}
+{
+    # as of 5.37.7
+    fresh_perl_like(
+        'sub CB::INC { die "bad mojo" } '
+       .'@INC = ("a",bless(sub { die "blessed sub called" },"CB"),"e");'
+       .'eval "require Frobnitz" or print $@',
+        qr!bad mojo.*INC method hook died--halting \@INC search!s,
+        { }, 'Blessed subs with methods call method and produce expected message');
+}
+{
+    # as of 5.37.7
+    fresh_perl_like(
+        '@INC = ("a",[bless([],"CB"),1],"e");'
+       .'eval "require Frobnitz" or print $@',
+        qr!Can't locate object method "INC", nor "INCDIR" nor string overload via package "CB" in object in ARRAY hook in \@INC!s,
+        { }, 'Blessed objects with no hook methods in array form produce expected exception');
+}
+{
+    # as of 5.37.7
+    fresh_perl_like(
+        'sub CB::INCDIR { "i" } sub CB2::INCDIR { }'
+       .'@INC = ("a",bless(sub{"b"},"CB"),bless(sub{"c"},"CB2"),"e");'
+       .'eval "require Frobnitz" or print $@',
+        qr!\(\@INC[\w ]+: a CB=CODE\(0x[a-fA-F0-9]+\) i CB2=CODE\(0x[a-fA-F0-9]+\) e\)!s,
+        { }, 'Blessed subs with INCDIR methods call INCDIR');
+}
+{
+    # as of 5.37.7
+    fresh_perl_like(
+        'sub CB::INCDIR { return @{$_[2]} }'
+       .'@INC = ("a",[bless([],"CB"),"b"],"c");'
+       .'eval "require Frobnitz" or print $@',
+        qr!\(\@INC[\w ]+: a ARRAY\(0x[a-fA-F0-9]+\) CB=ARRAY\(0x[a-fA-F0-9]+\) b c\)!s,
+        { }, 'INCDIR ref returns are stringified');
+}
index 04e1003..bf56802 100644 (file)
@@ -598,6 +598,18 @@ Mandatory parameter follows optional parameter at foo line 8, near "\$c,"
 Mandatory parameter follows optional parameter at foo line 8, near "\$d) "
 EOF
 
+sub t206 ($x, $y //= 3) { return $x + $y }
+is eval("t206(5,4)"),     9, '//= present';
+is eval("t206(5)"),       8, '//= absent';
+is eval("t206(4,undef)"), 7, '//= undef';
+is eval("t206(4,0)"),     4, '//= zero';
+
+sub t207 ($x, $y ||= 3) { return $x + $y }
+is eval("t207(5,4)"),     9, '||= present';
+is eval("t207(5)"),       8, '||= absent';
+is eval("t207(4,undef)"), 7, '||= undef';
+is eval("t207(4,0)"),     7, '||= zero';
+
 sub t034 (@abc) { join("/", @abc).";".scalar(@abc) }
 is prototype(\&t034), undef;
 is eval("t034()"), ";0";
@@ -1001,10 +1013,10 @@ like $@, _create_mismatch_regexp('main::t081', 4, 2);
 is $a, 123;
 
 eval "#line 8 foo\nsub t082 (, \$a) { }";
-is $@, qq{syntax error at foo line 8, near "(,"\n};
+is $@, qq{syntax error at foo line 8, near "(,"\nExecution of foo aborted due to compilation errors.\n};
 
 eval "#line 8 foo\nsub t083 (,) { }";
-is $@, qq{syntax error at foo line 8, near "(,"\n};
+is $@, qq{syntax error at foo line 8, near "(,"\nExecution of foo aborted due to compilation errors.\n};
 
 sub t084($a,$b){ $a.$b }
 is prototype(\&t084), undef;
@@ -1120,30 +1132,35 @@ eval "#line 8 foo\nsub t095 (\$a, 123) { }";
 is $@, <<EOF;
 A signature parameter must start with '\$', '\@' or '%' at foo line 8, near ", 1"
 syntax error at foo line 8, near ", 123"
+Execution of foo aborted due to compilation errors.
 EOF
 
 eval "#line 8 foo\nno warnings; sub t096 (\$a 123) { }";
 is $@, <<'EOF';
 Illegal operator following parameter in a subroutine signature at foo line 8, near "($a 123"
 syntax error at foo line 8, near "($a 123"
+Execution of foo aborted due to compilation errors.
 EOF
 
 eval "#line 8 foo\nsub t097 (\$a { }) { }";
 is $@, <<'EOF';
 Illegal operator following parameter in a subroutine signature at foo line 8, near "($a { }"
 syntax error at foo line 8, near "($a { }"
+Execution of foo aborted due to compilation errors.
 EOF
 
 eval "#line 8 foo\nsub t098 (\$a; \$b) { }";
 is $@, <<'EOF';
 Illegal operator following parameter in a subroutine signature at foo line 8, near "($a; "
 syntax error at foo line 8, near "($a; "
+Execution of foo aborted due to compilation errors.
 EOF
 
 eval "#line 8 foo\nsub t099 (\$\$) { }";
 is $@, <<EOF;
 Illegal character following sigil in a subroutine signature at foo line 8, near "(\$"
 syntax error at foo line 8, near "\$\$) "
+Execution of foo aborted due to compilation errors.
 EOF
 
 eval "#line 8 foo\nsub t101 (\@_) { }";
index 10d3539..ca85d15 100644 (file)
@@ -8,7 +8,7 @@ BEGIN {
 use strict;
 use warnings;
 no warnings 'uninitialized';
-no warnings 'experimental::smartmatch';
+no warnings 'deprecated';    # smartmatch is deprecated and will be removed in 5.042
 
 ++$|;
 
@@ -146,7 +146,7 @@ sub NOT_DEF() { undef }
   # re-introduced it will probably crash in one of the many smoke
   # builds.
   fresh_perl_is('print (q(x) ~~ q(x)) | (/x/ ~~ %!)', "1",
-               { switches => [ "-MErrno", "-M-warnings=experimental::smartmatch" ] },
+               { switches => [ "-MErrno", "-M-warnings=deprecated" ] },
                 "don't fill the stack with rubbish");
 }
 
@@ -194,10 +194,10 @@ sub NOT_DEF() { undef }
     # if there was some other operator's arguments left on the stack, as with
     # the test cases.
     fresh_perl_is('print(0->[0 =~ qr/1/ ~~ 0])', '',
-                  { switches => [ "-M-warnings=experimental::smartmatch" ] },
+                  { switches => [ "-M-warnings=deprecated" ] },
                   "don't qr-ify left-side match against a stacked argument");
     fresh_perl_is('print(0->[0 ~~ (0 =~ qr/1/)])', '',
-                  { switches => [ "-M-warnings=experimental::smartmatch" ] },
+                  { switches => [ "-M-warnings=deprecated" ] },
                   "don't qr-ify right-side match against a stacked argument");
 }
 
index 83b0b13..1a429f1 100644 (file)
@@ -237,6 +237,7 @@ eval { @b = sort twoface 4,1 };
 cmp_ok(substr($@,0,4), 'eq', 'good', 'twoface eval');
 
 eval <<'CODE';
+    no warnings qw(deprecated syntax);
     my @result = sort main'Backwards 'one', 'two';
 CODE
 cmp_ok($@,'eq','',q(old skool package));
@@ -900,12 +901,13 @@ cmp_ok($answer,'eq','good','sort subr called from other package');
 # Sorting shouldn't increase the refcount of a sub
 {
     sub sportello {(1+$a) <=> (1+$b)}
-    my $refcnt = &Internals::SvREFCNT(\&sportello);
+    # + 1 to account for prototype-defeating &... calling convention
+    my $refcnt = &Internals::SvREFCNT(\&sportello) + 1;
     @output = sort sportello 3,7,9;
 
     {
         package Doc;
-        ::is($refcnt, &Internals::SvREFCNT(\&::sportello), "sort sub refcnt");
+        ::refcount_is \&::sportello, $refcnt, "sort sub refcnt";
         $fail_msg = q(Modification of a read-only value attempted);
         # Sorting a read-only array in-place shouldn't be allowed
         my @readonly = (1..10);
index ea2a984..abd4ae2 100644 (file)
@@ -30,9 +30,6 @@ if ($^O eq 'VMS') {
     $Is_VMS_VAX = $hw_model < 1024 ? 1 : 0;
 }
 
-# No %Config.
-my $Is_Ultrix_VAX = $^O eq 'ultrix' && `uname -m` =~ /^VAX$/;
-
 # The most generic VAX catcher.
 my $Is_VAX_Float = (pack("d", 1) =~ /^[\x80\x10]\x40/);
 
@@ -55,7 +52,7 @@ while (<DATA>) {
         $data   =~ s/([eE])\-101$/${1}-56/;  # larger exponents
         $result =~ s/([eE])\-102$/${1}-57/;  #  "       "
     }
-    if ($Is_VMS_VAX || $Is_Ultrix_VAX || $Is_VAX_Float) {
+    if ($Is_VMS_VAX || $Is_VAX_Float) {
        # VAX DEC C 5.3 at least since there is no
        # ccflags =~ /float=ieee/ on VAX.
        # AXP is unaffected whether or not it is using ieee.
index aa942df..f8dd302 100755 (executable)
@@ -1189,6 +1189,10 @@ if($Config{nvsize} == 8) {
                                    or
                                $^O eq 'VMS'
                                    or
+                               $^O eq 'hpux'
+                                   or
+                               $^O eq 'aix'
+                                   or
                                ($^O eq 'MSWin32' and
                                 $Config{cc} eq 'cl' and
                                 $Config{ccversion} =~ /^(\d+)/ and
@@ -1215,9 +1219,13 @@ elsif($Config{nvtype} eq 'long double' && $Config{longdblkind} >= 5 && $Config{l
 }
 else {
     # IEEE-754 128-bit long double or __float128
-    cmp_ok(sprintf("%.115g", 0.3), 'eq',
+    TODO: {
+        local $::TODO = 'Extended precision %g formatting' if $^O eq 'hpux';
+
+        cmp_ok(sprintf("%.115g", 0.3), 'eq',
            '0.299999999999999999999999999999999990370350278063820734720110287075363407309491758923059023800306022167205810546875',
            "sprintf( \"%.115g\", 0.3 ) renders correctly");
+    }
 }
 
 done_testing();
index 09de60a..47f7590 100644 (file)
@@ -52,9 +52,12 @@ ok( !eq_array(\@first_run, \@second_run),
 }
 
 # This test checks whether Perl called srand for you.
-@first_run  = `$^X -le "print int rand 100 for 1..100"`;
-sleep(1); # in case our srand() is too time-dependent
-@second_run = `$^X -le "print int rand 100 for 1..100"`;
+{
+    local $ENV{PERL_RAND_SEED};
+    @first_run  = `$^X -le "print int rand 100 for 1..100"`;
+    sleep(1); # in case our srand() is too time-dependent
+    @second_run = `$^X -le "print int rand 100 for 1..100"`;
+}
 
 ok( !eq_array(\@first_run, \@second_run), 'srand() called automatically');
 
index 9ec1c63..32420cc 100755 (executable)
@@ -13,7 +13,7 @@ BEGIN {
 skip_all("Win32 miniperl has no socket select")
   if $^O eq "MSWin32" && is_miniperl();
 
-plan (16);
+plan (23);
 
 my $blank = "";
 eval {select undef, $blank, $blank, 0};
@@ -103,4 +103,81 @@ package _131645{
 }
 tie $tie, _131645::;
 select ($tie, undef, undef, $tie);
-ok("no crash from select $numeric_tie, undef, undef, $numeric_tie")
+ok("no crash from select $numeric_tie, undef, undef, $numeric_tie");
+
+SKIP: {
+    skip "Can't load modules under miniperl", 4 if is_miniperl;
+    my $SKIP_CR = sub {
+        skip shift, 4;
+    };
+
+    if ($^O =~ m<win32|vms>i) {
+        $SKIP_CR->("Perl's 4-arg select() in $^O only works with sockets.");
+    }
+
+    eval { require POSIX } or do {
+        $SKIP_CR->("Failed to load POSIX.pm: $@");
+    };
+
+    my $mask;
+
+    for (my $f=0; $f<100; $f++) {
+        my $fd = POSIX::dup(fileno \*STDOUT);
+
+        if (!defined $fd) {
+            $SKIP_CR->("dup(STDOUT): $!");
+            last UTF8TEST;
+        }
+
+        vec( my $curmask, $fd, 1 ) = 1;
+
+        if ($curmask =~ tr<\x80-\xff><>) {
+            note("FD = $fd");
+            $mask = $curmask;
+            last;
+        }
+    }
+
+
+    if (defined $mask) {
+        utf8::downgrade($mask);
+        my $mask2;
+
+        my $result = select $mask2 = $mask, undef, undef, 0;
+
+        isnt( $result, -1, 'select() read on non-utf8-flagged mask' );
+
+        utf8::upgrade($mask);
+        $result = select $mask2 = $mask, undef, undef, 0;
+
+        isnt( $result, -1, 'select() read on utf8-flagged mask' );
+
+        # ----------------------------------------
+
+        utf8::downgrade($mask);
+        $result = select undef, $mask2 = $mask, undef, 0;
+
+        isnt( $result, -1, 'select() write on non-utf8-flagged mask' );
+
+        utf8::upgrade($mask);
+        $result = select undef, $mask2 = $mask, undef, 0;
+
+        isnt( $result, -1, 'select() write on utf8-flagged mask' );
+    }
+    else {
+        $SKIP_CR->("No suitable file descriptor for UTF-8-flag test found.");
+    }
+}
+
+{
+    my $badmask = "\x{100}";
+
+    eval { select $badmask, undef, undef, 0 };
+    ok( $@, 'select() read fails when given a wide character' );
+
+    eval { select undef, $badmask, undef, 0 };
+    ok( $@, 'select() write fails when given a wide character' );
+
+    eval { select undef, undef, $badmask, 0 };
+    ok( $@, 'select() exception fails when given a wide character' );
+}
index 7aef435..747e316 100644 (file)
@@ -346,7 +346,7 @@ foreach my $x (0 .. 4) {
 #
 my @spam = qw [spam ham bacon beans];
 foreach my $spam (@spam) {
-    no warnings 'experimental::smartmatch';
+    no warnings 'deprecated';
     given (state $spam = $spam) {
         when ($spam [0]) {ok 1, "given"}
         default          {ok 0, "given"}
index 11d7147..e703880 100644 (file)
@@ -6,7 +6,7 @@ BEGIN {
     set_up_inc('../lib');
 }
 
-plan(tests => 62);
+plan(tests => 65);
 
 sub empty_sub {}
 
@@ -426,3 +426,24 @@ eval '
    CORE::state sub b; sub d { sub b {} sub d }
  ';
 eval '()=%e; sub e { sub e; eval q|$x| } e;';
+
+fresh_perl_like(
+    q#<s,,$0[sub{m]]]],}>0,shift#,
+    qr/^syntax error/,
+    {},
+    "GH Issue #16944 - Syntax error with sub and shift causes segfault"
+);
+
+# Bug 20010515.004 (#6998)
+# freeing array used as args to sub
+
+fresh_perl_like(
+    q{my @h = 1 .. 10; bad(@h); sub bad { undef @h; warn "O\n"; print for @_; warn "K\n";}},
+    qr/Use of freed value in iteration/,
+    {},
+    "#6998 freeing array used as args to sub",
+);
+
+# github #21044
+ok( eval { $_->{x} = 1 for sub { undef }->(); 1 }, "check sub return values are modifiable")
+  or diag $@;
index dbfd906..e1c0799 100644 (file)
@@ -8,7 +8,7 @@ BEGIN {
 
 use strict;
 use warnings;
-no warnings 'experimental::smartmatch';
+no warnings 'deprecated';
 
 plan tests => 197;
 
index 30cd6f9..daeb164 100644 (file)
@@ -25,7 +25,7 @@ if ($NoTaintSupport) {
     exit 0;
 }
 
-plan tests => 1058;
+plan tests => 1065;
 
 $| = 1;
 
@@ -145,14 +145,17 @@ my $TEST = 'TEST';
 {
     $ENV{'DCL$PATH'} = '' if $Is_VMS;
 
-    $ENV{PATH} = ($Is_Cygwin) ? '/usr/bin' : '';
+    # Empty path is the same as "." on *nix, so we have to set it
+    # to something or we will fail taint tests. perhaps setting it
+    # to "/" would be better. Anything absolute will do.
+    $ENV{PATH} = $Is_VMS ? 'sys$system:' : '/usr/bin';
     delete @ENV{@MoreEnv};
     $ENV{TERM} = 'dumb';
 
     is(eval { `$echo 1` }, "1\n");
 
     SKIP: {
-        skip "Environment tainting tests skipped", 4
+        skip "Environment tainting tests skipped", 11
           if $Is_MSWin32 || $Is_VMS;
 
        my @vars = ('PATH', @MoreEnv);
@@ -164,6 +167,16 @@ my $TEST = 'TEST';
        }
        is("@vars", "");
 
+        # make sure that the empty path or empty path components
+        # trigger an "Insecure directory in $ENV{PATH}" error.
+        for my $path ("", ".", "/:", ":/", "/::/", ".:/", "/:.") {
+            local $ENV{PATH} = $path;
+            eval {`$echo 1`};
+            ok($@ =~ /Insecure directory in \$ENV\{PATH\}/,
+                "path '$path' is insecure as expected")
+                or diag "$@";
+        }
+
        # tainted $TERM is unsafe only if it contains metachars
        local $ENV{TERM};
        $ENV{TERM} = 'e=mc2';
@@ -2440,6 +2453,7 @@ EOF
        my $desc = "tainted value returned from " . shift(@descriptions);
 
        my $res = do {
+           no warnings 'deprecated';
            given ($_) {
                when ('x') { $letter }
                when ('y') { goto leavegiven }
@@ -2469,7 +2483,7 @@ EOF
 # Tainted values with smartmatch
 # [perl #93590] S_do_smartmatch stealing its own string buffers
 {
-no warnings 'experimental::smartmatch';
+no warnings 'deprecated';
 ok "M$TAINT" ~~ ['m', 'M'], '$tainted ~~ ["whatever", "match"]';
 ok !("M$TAINT" ~~ ['m', undef]), '$tainted ~~ ["whatever", undef]';
 }
index 9cc1599..673ec49 100644 (file)
@@ -731,10 +731,10 @@ $foo{'exit'};
 print "overshot main\n"; # shouldn't reach here
 
 EXPECT
-eval: s0=EVAL-BD-BS-E1-S1-E2-S2-S2-S2-S2-S2-S2-S2-S2-S2-S2-R
-eval: s1=EVAL-BD-BS-E1-S1-E2-S2-S2-S2-S2-S2-S2-S2-S2-S2-S2-R
-eval: s2=EVAL-BD-BS-E1-S1-E2-S2-S2-S2-S2-S2-S2-S2-S2-S2-S2-R
-eval: s3=EVAL-BD-BS-E1-S1-E2-S2-S2-S2-S2-S2-S2-S2-S2-S2-S2-R
+eval: s0=EVAL-BD-BS-E1-S1-E2-S2-R
+eval: s1=EVAL-BD-BS-E1-S1-E2-S2-R
+eval: s2=EVAL-BD-BS-E1-S1-E2-S2-R
+eval: s3=EVAL-BD-BS-E1-S1-E2-S2-R
 require: s0=REQUIRE-0-ERQ-ENDRQ-1-ERQ-ENDRQ-2-ERQ-ENDRQ-3-ERQ-ENDRQ-R
 require: s1=REQUIRE-0-RQ
 require: s2=REQUIRE-0-ERQ-ENDRQ-1-ERQ-ENDRQ-2-ERQ-ENDRQ-3-ERQ-ENDRQ-R
index d8b906d..86505f6 100644 (file)
@@ -165,7 +165,7 @@ $_ = "foo";
 $dummy  =  $var =~ m/ / ; check_count 'm//';
 $dummy  =  $var =~ s/ //; check_count 's///';
 {
-    no warnings 'experimental::smartmatch';
+    no warnings 'deprecated';
     $dummy  =  $var ~~    1 ; check_count '~~';
 }
 $dummy  =  $var =~ y/ //; check_count 'y///';
index 203d9fd..cce5885 100644 (file)
@@ -10,7 +10,7 @@ use strict;
 
 my (@ary, %ary, %hash);
 
-plan 74;
+plan 88;
 
 ok !defined($a);
 
@@ -153,3 +153,58 @@ sub PVBM () { 'foo' }
 my $pvbm = PVBM;
 undef $pvbm;
 ok !defined $pvbm;
+
+# Prior to GH#20077 (Add OPpTARGET_MY optimization to OP_UNDEF), any PV
+# allocation was kept with "$x = undef" but freed with "undef $x". That
+# behaviour was carried over and is expected to still be present.
+# (I totally copied most of this block from other t/op/* files.)
+
+SKIP: {
+    skip_without_dynamic_extension("Devel::Peek", 2);
+
+    my $out = runperl(stderr => 1,
+                  progs => [ split /\n/, <<'EOS' ]);
+    require Devel::Peek;
+    my $f = q(x) x 40; $f = undef;
+    Devel::Peek::Dump($f);
+    undef $f;
+    Devel::Peek::Dump($f);
+EOS
+
+    my ($space, $first, $second) = split /SV =/, $out;
+    like($first, qr/\bPV = 0x[0-9a-f]+\b/, '$x = undef preserves PV allocation');
+    like($second, qr/\bPV = 0\b$/, 'undef $x frees PV allocation');
+}
+
+# Tests suggested for GH#20077 (Add OPpTARGET_MY optimization to OP_UNDEF)
+# (No failures were observed during development, these are just checking
+# that no failures are introduced down the line.)
+
+{
+    my $y= 1; my @x= ($y= undef);
+    is( defined($x[0]), "", 'lval undef assignment in list context');
+    is( defined($y)  , "", 'scalar undef assignment in list context');
+
+    $y= 1; my $z; sub f{$z = shift} f($y=undef);
+    is( defined($y)  , "", 'undef assignment in sub args');
+    is( defined($z)  , "", 'undef assignment reaches @_');
+
+    ($y,$z)=(1,2); sub f{} f(($y=undef),$z);
+    is( defined($y)  , "", 'undef assignment reaches @_');
+    is( $z, 2, 'undef adjacent argument is unchanged');
+}
+
+{
+    my $h= { baz => 1 }; my @k= keys %{($h=undef)||{}};
+    is( defined($h)  , "", 'scalar undef assignment in keys');
+    is( scalar @k, 0, 'undef assignment dor anonhash');
+
+    my $y= 1; my @x= \($y= undef);
+    is( defined($y)  , "", 'scalar undef assignment before reference');
+    is( scalar @x, 1, 'assignment of one element to array');
+    is( defined($x[0]->$*), "", 'assignment of undef element to array');
+}
+
+# GH#20336 - "my $x = undef" pushed &PL_sv_undef onto the stack, but
+#            should be pushing $x (i.e. a mutable copy of &PL_sv_undef)
+is( ++(my $x = undef), 1, '"my $x = undef" pushes $x onto the stack' );
index 0e8b5ce..d7872d9 100644 (file)
@@ -6,12 +6,15 @@ BEGIN {
     set_up_inc('../lib');
 }
 
+use warnings;
+use strict;
 use Config;
 
 plan(tests => 78);
 
 my $exception_134139 = "Use of strings with code points over 0xFF as arguments to vec is forbidden";
 
+my $foo;
 is(vec($foo,0,1), 0);
 is(length($foo), undef);
 vec($foo,0,1) = 1;
@@ -29,11 +32,14 @@ is(vec($foo,1,8), 0xf1);
 is((unpack('C',substr($foo,1,1)) & 255), 0xf1);
 is(vec($foo,2,4), 1);;
 is(vec($foo,3,4), 15);
+
+my $Vec;
 vec($Vec, 0, 32) = 0xbaddacab;
 is($Vec, "\xba\xdd\xac\xab");
 is(vec($Vec, 0, 32), 3135089835);
 
 # ensure vec() handles numericalness correctly
+my ($bar, $baz);
 $foo = $bar = $baz = 0;
 vec($foo = 0,0,1) = 1;
 vec($bar = 0,1,1) = 1;
@@ -44,7 +50,7 @@ ok("$foo $bar $baz" eq "1 2 3");
 
 # error cases
 
-$x = eval { vec $foo, 0, 3 };
+my $x = eval { vec $foo, 0, 3 };
 like($@, qr/^Illegal number of bits in vec/);
 $@ = undef;
 $x = eval { vec $foo, 0, 0 };
@@ -67,7 +73,7 @@ is(vec($x, 0, 8), 255);
 $@ = undef;
 {
     local $@;
-    eval { vec($foo, 1, 8) };
+    eval { my $foo = vec($foo, 1, 8) };
     like($@, qr/$exception_134139/,
         "Caught exception: code point over 0xFF used as argument to vec");
     $@ = undef;
@@ -193,6 +199,7 @@ like($@, qr/^Modification of a read-only value attempted at /,
         my $bytes = (1 << $power);
         my $biglog2 = $Config{sizesize} * 8 - $power;
         for my $i (0..1) {
+            no warnings 'portable';
             my $offset = (1 << $biglog2) - $i;
             $x = vec($s, $offset, $bytes*8);
             is($x, 0, "large offset: bytes=$bytes biglog2=$biglog2 i=$i: rval");
@@ -210,6 +217,7 @@ like($@, qr/^Modification of a read-only value attempted at /,
     my $s = "\x01\x02\x03\x04\x05\x06\x07";
     my $s0 = $s . ("\0" x 8);
 
+            no warnings 'portable';
     for my $bytes (1, 2, 4, 8) {
         for my $offset (0..$bytes) {
             if ($Config{ivsize} < $bytes) {
@@ -236,7 +244,7 @@ like($@, qr/^Modification of a read-only value attempted at /,
     like($@, qr/Negative offset to vec in lvalue context/, "RT131083 lval -1");
 
     $off = ~0;
-    my $v = RT131083(0, vec($s, $off, 8));
+    $v = RT131083(0, vec($s, $off, 8));
     is($v, 0, "RT131083 rval ~0");
     $v = eval { RT131083(1, vec($s, $off, 8)); };
     like($@, qr/Out of memory!/, "RT131083 lval ~0");
@@ -247,7 +255,7 @@ like($@, qr/^Modification of a read-only value attempted at /,
 
     local $@;
     my $foo = "\x{100}" . "\xff\xfe";
-    eval { vec($foo, 1, 8) };
+    eval { my $bar = vec($foo, 1, 8) };
     like($@, qr/$exception_134139/,
         "RT 134139: Use of strings with code points over 0xFF as arguments to 'vec' is now forbidden");
 }
index 6e76fe1..92f946b 100644 (file)
 
     # scalar assign, OP_SASSIGN
    
+    'expr::sassign::undef_lex' => {
+        setup   => 'my $x',
+        code    => '$x = undef',
+    },
+    'expr::sassign::undef_lex_direc' => {
+        setup   => 'my $x',
+        code    => 'undef $x',
+    },
+    'expr::sassign::undef_my_lex' => {
+        setup   => '',
+        code    => 'my $x = undef',
+    },
+    'expr::sassign::undef_my_lex_direc' => {
+        setup   => '',
+        code    => 'undef my $x',
+    },
+
+    'expr::sassign::anonlist' => {
+        setup   => '',
+        code => '$x = []'
+    },
+    'expr::sassign::anonlist_lex' => {
+        setup   => 'my $x',
+        code => '$x = []'
+    },
+    'expr::sassign::my_anonlist_lex' => {
+        setup   => '',
+        code => 'my $x = []'
+    },
+    'expr::sassign::anonhash' => {
+        setup   => '',
+        code => '$x = {}'
+    },
+    'expr::sassign::anonhash_lex' => {
+        setup   => 'my $x',
+        code => '$x = {}'
+    },
+    'expr::sassign::my_anonhash_lex' => {
+        setup   => '',
+        code => 'my $x = {}'
+    },
 
     'expr::sassign::my_conststr' => {
         setup   => '',
         code    => '$r = []; $r = $r1;',
     },
 
+    'expr::sassign::aelemfast_lex_assign' => {
+        desc    => 'lexical $x[0] = 1',
+        setup   => 'my @x',
+        code    => '$x[0] = 1',
+    },
+    'expr::sassign::aelemfast_lex_assign_ref' => {
+        desc    => 'lexical $x[0] = []',
+        setup   => 'my @x',
+        code    => '$x[0] = []',
+    },
+    'expr::sassign::aelemfast_lex_assign_deref' => {
+        desc    => 'lexical $x[0][1]',
+        setup   => 'my @x = ([1,2])',
+        code    => '$x[0][1] = 1',
+    },
+
+    'expr::sassign::bless_lex' => {
+        setup   => 'my $x',
+        code    => '$x = bless {}, "X"'
+    },
 
     'func::grep::bool0' => {
         desc    => 'grep returning 0 items in boolean context',
index ad58203..4651f24 100644 (file)
@@ -712,8 +712,8 @@ test_opcount(0, "builtin::is_bool is replaced with direct opcode",
                 {
                     entersub => 0,
                     is_bool  => 1,
-                    padsv    => 3, # OA_TARGLEX applies so only 3, not 4
-                    sassign  => 0,
+                    padsv    => 3,
+                    padsv_store  => 1,
                 });
 
 test_opcount(0, "builtin::is_bool gets constant-folded",
@@ -781,4 +781,235 @@ test_opcount(0, "builtin::floor is replaced with direct opcode",
                     floor    => 1,
                 });
 
+test_opcount(0, "builtin::is_tainted is replaced with direct opcode",
+                sub { builtin::is_tainted($0); },
+                {
+                    entersub   => 0,
+                    is_tainted => 1,
+                });
+
+# sassign + padsv combinations are replaced by padsv_store
+test_opcount(0, "sassign + padsv replaced by padsv_store",
+                sub { my $y; my $z = $y = 3; },
+                {
+                    padsv        => 1,
+                    padsv_store  => 2,
+                });
+
+# OPpTARGET_MY optimizations on undef
+test_opcount(0, "undef + padsv (undef my \$x) is reduced to undef",
+                sub { undef my $x },
+                {
+                    undef       => 1,
+                    padsv       => 0,
+                    padsv_store => 0,
+                    sassign     => 0,
+                });
+test_opcount(0, "undef + padsv + sassign (my \$x = undef) is reduced to undef",
+                sub { my $x = undef },
+                {
+                    undef       => 1,
+                    padsv       => 0,
+                    padsv_store => 0,
+                    sassign     => 0,
+                });
+test_opcount(0, "undef + padsv (undef \$x) is reduced to undef",
+                sub { my $x; undef $x },
+                {
+                    undef       => 1,
+                    padsv       => 1,
+                    padsv_store => 0,
+                    sassign     => 0,
+                });
+test_opcount(0, "undef + padsv + sassign (\$x = undef) is reduced to undef",
+                sub { my $x; $x = undef },
+                {
+                    undef       => 1,
+                    padsv       => 1,
+                    padsv_store => 0,
+                    sassign     => 0,
+                });
+# Additional test cases requested by demerphq
+test_opcount(0, 'my $y= 1; my @x= ($y= undef);',
+                sub { my $y= 1; my @x= ($y= undef); },
+                {
+                    undef       => 1,
+                    aassign     => 1,
+                    padav       => 1,
+                    padsv       => 0,
+                    padsv_store => 1,
+                    sassign     => 0,
+                });
+
+test_opcount(0, 'my $x= 1; sub f{} f($x=undef);',
+                sub { my $x= 1; sub f{} f($x=undef); },
+                {
+                    undef       => 1,
+                    gv          => 1,
+                    padsv       => 0,
+                    padsv_store => 1,
+                    sassign     => 0,
+                });
+
+test_opcount(0, 'my ($x,$p)=(1,2); sub g{} g(($x=undef),$p);',
+                sub { my ($x,$p)=(1,2); sub g{} g(($x=undef),$p); },
+                {
+                    undef       => 1,
+                    aassign     => 1,
+                    gv          => 1,
+                    padrange    => 1,
+                    padsv       => 3,
+                    padsv_store => 0,
+                    sassign     => 0,
+                });
+
+test_opcount(0, 'my $h= {}; my @k= keys %{($h=undef)||{}};',
+                sub { my $h= {}; my @k= keys %{($h=undef)||{}}; },
+                {
+                    undef       => 1,
+                    aassign     => 1,
+                    emptyavhv   => 2,
+                    padav       => 1,
+                    padsv       => 0,
+                    padsv_store => 0,
+                    sassign     => 0,
+                });
+
+test_opcount(0, 'my $y= 1; my @x= \($y= undef);',
+                sub { my $y= 1; my @x= \($y= undef); },
+                {
+                    undef       => 1,
+                    aassign     => 1,
+                    padav       => 1,
+                    padsv       => 0,
+                    padsv_store => 1,
+                    sassign     => 0,
+                    srefgen     => 1,
+                });
+
+# aelemfast_lex + sassign are replaced by a combined OP
+test_opcount(0, "simple aelemfast_lex + sassign replacement",
+                sub { my @x; $x[0] = "foo" },
+                {
+                    aelemfast_lex      => 0,
+                    aelemfastlex_store => 1,
+                    padav              => 1,
+                    sassign            => 0,
+                });
+
+# aelemfast_lex + sassign are not replaced by a combined OP
+# when key <0 (not handled, to keep the pp_ function simple
+test_opcount(0, "aelemfast_lex + sassign replacement with neg key",
+                sub { my @x = (1,2); $x[-1] = 7 },
+                {
+                    aelemfast_lex      => 0,
+                    aelemfastlex_store => 1,
+                    padav              => 1,
+                    sassign            => 0,
+                });
+
+# aelemfast_lex + sassign optimization does not disrupt multideref
+test_opcount(0, "no aelemfast_lex + sassign replacement with multideref",
+                sub { my @x = ([1,2]); $x[0][1] = 1; },
+                {
+                    aelemfast_lex      => 0,
+                    aelemfastlex_store => 0,
+                    multideref         => 1,
+                    padav              => 1,
+                    sassign            => 1,
+                });
+
+# emptyavhv optimizations
+
+test_opcount(0, "Empty anonlist",
+                sub { [] },
+                {
+                    anonlist  => 0,
+                    emptyavhv => 1,
+                    sassign   => 0,
+                });
+test_opcount(0, "Empty anonlist with global assignment",
+                sub { our $x; $x = [] },
+                {
+                    anonlist  => 0,
+                    emptyavhv => 1,
+                    gvsv      => 1,
+                    pushmark  => 0,
+                    sassign   => 1,
+                });
+test_opcount(0, "Empty anonlist and lexical assignment",
+                sub { my $x; $x = [] },
+                {
+                    anonlist  => 0,
+                    emptyavhv => 1,
+                    padsv     => 1,
+                    pushmark  => 0,
+                    sassign   => 0,
+                });
+test_opcount(0, "Empty anonlist and direct lexical assignment",
+                sub { my $x = [] },
+                {
+                    anonlist  => 0,
+                    emptyavhv => 1,
+                    padsv     => 0,
+                    pushmark  => 0,
+                    sassign   => 0,
+                });
+test_opcount(0, "Empty anonlist ref and direct lexical assignment",
+                sub { my $x = \[] },
+                {
+                    anonlist    => 0,
+                    emptyavhv   => 1,
+                    padsv       => 0,
+                    padsv_store => 1,
+                    pushmark    => 0,
+                    sassign     => 0,
+                    srefgen     => 1,
+                });
+test_opcount(0, "Empty anonhash",
+                sub { {} },
+                {
+                    anonhash  => 0,
+                    emptyavhv => 1,
+                    sassign   => 0,
+                });
+test_opcount(0, "Empty anonhash with global assignment",
+                sub { our $x; $x = {} },
+                {
+                    anonhash  => 0,
+                    emptyavhv => 1,
+                    gvsv      => 1,
+                    pushmark  => 0,
+                    sassign   => 1,
+                });
+test_opcount(0, "Empty anonhash and lexical assignment",
+                sub { my $x; $x = {} },
+                {
+                    anonhash  => 0,
+                    emptyavhv => 1,
+                    padsv     => 1,
+                    pushmark  => 0,
+                    sassign   => 0,
+                });
+test_opcount(0, "Empty anonhash and direct lexical assignment",
+                sub { my $x = {} },
+                {
+                    anonhash  => 0,
+                    emptyavhv => 1,
+                    padsv     => 0,
+                    pushmark  => 0,
+                    sassign   => 0,
+                });
+test_opcount(0, "Empty anonhash ref and direct lexical assignment",
+                sub { my $x = \{} },
+                {
+                    anonhash    => 0,
+                    emptyavhv   => 1,
+                    padsv       => 0,
+                    padsv_store => 1,
+                    pushmark    => 0,
+                    sassign     => 0,
+                    srefgen     => 1,
+                });
+
 done_testing();
index 01b52b2..dd9ade2 100644 (file)
@@ -1,19 +1,58 @@
 #!./perl -w
+BEGIN {
+    chdir ".." if -e "./test.pl";
+    push @INC, "lib";
+}
 use strict;
-require './test.pl';
+require './t/test.pl';
 skip_all("Sorting order differs under EBCDIC") if $::IS_EBCDIC || $::IS_EBCDIC;
 
 use Config;
 
-plan(2);
-
-# Defiantly a white box test...
+my %legacy_different = (
+    # define                       # string
+    'VMS_WE_ARE_CASE_SENSITIVE' => 'VMS_SYMBOL_CASE_AS_IS',
+    'WIN32_NO_REGISTRY'         => 'USE_NO_REGISTRY',
+);
 
 # As we need to call it direct, we'll take advantage of its result ordering:
 my @to_check = qw(bincompat_options non_bincompat_options);
+my @file = qw(perl.h perl.c);
+my @var = qw(PL_bincompat_options non_bincompat_options);
 my @V = map {s/^ //r} Internals::V();
 
 while (my ($index, $sub) = each @to_check) {
     my $got = join ' ', sort &{Config->can($sub)}();
     is($got, $V[$index], "C source code has $sub in sorted order");
+    open my $fh, "<", $file[$index]
+        or die "Failed to open '$file[$index]': $!";
+    my @strs;
+    my @define;
+    while (<$fh>) {
+        if (/$var[$index]\[\]\s*=/ .. /^\s*"";/) {
+            if (/ifdef\s+(\w+)/) {
+                my $name = $1;
+                # ignore PERL_HASH_ vars as they are handled differently
+                # from the rest.
+                $name=~/PERL_HASH_/ and next;
+                push @define, $name;
+            }
+            elsif (/" ([^"]+)"/) {
+                my $name = $1;
+                # ignore PERL_HASH_ vars as they are handled differently
+                # from the rest.
+                $name=~/PERL_HASH_/ and next;
+                push @strs, $name;
+            }
+        }
+    }
+    foreach my $j (0 .. $#strs) {
+        my $want = $legacy_different{$define[$j]} || $define[$j];
+        my $str = $strs[$j];
+        is($strs[$j],$want, "String and define $j are the same ($strs[$j]) for $var[$index] in $file[$index]");
+    }
+    my @sorted_strs = sort @strs;
+    is("@strs","@sorted_strs", "Strings are sorted for $var[$index] in $file[$index]");
 }
+
+done_testing();
index b173d50..7c64d12 100644 (file)
@@ -1,50 +1,24 @@
 # Regenerate this file using:
 #     cd t
 #     ./perl -I../lib porting/customized.t --regen
-Digest::MD5 cpan/Digest-MD5/MD5.xs 3d56a25a9eaed20712d50223c19dd193444072bd
-Digest::MD5 cpan/Digest-MD5/t/files.t 889559c1419ab72f32a24160095018a3240e82ba
+AutoLoader cpan/AutoLoader/t/02AutoSplit.t bb90cda13b88599ad45de4b45799d5218afcb6d8
+Compress::Raw::Bzip2 cpan/Compress-Raw-Bzip2/Bzip2.xs 76ad65475e73a545d0e1513e3dfdc4033db3c7c0
+Compress::Raw::Zlib cpan/Compress-Raw-Zlib/lib/Compress/Raw/Zlib.pm 4198f92e2880d36d6cef4f1be216005b6738ada8
+Compress::Raw::Zlib cpan/Compress-Raw-Zlib/Zlib.xs 2ed95faab364703f6b93f7ffff6e0f2a2b2adedd
+Digest::MD5 cpan/Digest-MD5/MD5.pm cf2fd9d327f3e314e9e66bb6ecb7a62b4ec72767
+Digest::MD5 cpan/Digest-MD5/MD5.xs dc40839d25ba5e2d6f42fc9b81b409f1d0dbfb0e
 ExtUtils::Constant cpan/ExtUtils-Constant/lib/ExtUtils/Constant/Base.pm 7560e1018f806db5689dee78728ccb8374aea741
 ExtUtils::Constant cpan/ExtUtils-Constant/t/Constant.t 165e9c7132b003fd192d32a737b0f51f9ba4999e
-Filter::Util::Call pod/perlfilter.pod 545265af2f45741a0e59eecdd0cfc0c9e490c1e8
+Filter::Util::Call pod/perlfilter.pod d1e217d0bc6083755b9017050b8724472c58275a
+IO::Socket::IP cpan/IO-Socket-IP/lib/IO/Socket/IP.pm a3390d0b3b617a0b810c75941bfc6e6d0be5b785
 Locale::Maketext::Simple cpan/Locale-Maketext-Simple/lib/Locale/Maketext/Simple.pm 57ed38905791a17c150210cd6f42ead22a7707b6
-Math::Complex cpan/Math-Complex/lib/Math/Complex.pm 66f28a17647e2de166909ca66e4ced26f8a0a62e
-Math::Complex cpan/Math-Complex/t/Complex.t 17039e03ee798539e770ea9a0d19a99364278306
-Math::Complex cpan/Math-Complex/t/Trig.t 508f8e27373c08228be13ca5d42b28812ab0e020
-Math::Complex cpan/Math-Complex/t/underbar.t 97e7b9615658eefc67a710d4b258349cc5bace63
-Memoize cpan/Memoize/Memoize.pm 902092ff91cdec9c7b4bd06202eb179e1ce26ca2
-Memoize cpan/Memoize/t/errors.t bcd0c02a4bc47dfda07a97d265d7210849871659
-Memoize cpan/Memoize/t/expmod_t.t a1c3d03fd3ec2e7c6c835f02316475756e1b16b7
-Memoize cpan/Memoize/t/speed.t 89fe8c8928f0164c9ed898b5a427dbbc814e9976
-Memoize cpan/Memoize/t/tie_gdbm.t d81c4f6208f6c925539b3878bff9a8ff1b73a37e
-Net::Ping dist/Net-Ping/t/000_load.t deff5dc2ca54dae28cb19d3631427db127279ac2
-Net::Ping dist/Net-Ping/t/001_new.t 7b24e05672e22edfe3e6b5cc0277f815efe557e5
-Net::Ping dist/Net-Ping/t/010_pingecho.t 218d7a9ee5b6d03ba2544210acaf6585f8dc5503
-Net::Ping dist/Net-Ping/t/450_service.t f6578680f2872d7fc9f24dd75388d55654761875
-Net::Ping dist/Net-Ping/t/500_ping_icmp.t 3eeb60181c01b85f876bd6658644548fdf2e24d4
-Net::Ping dist/Net-Ping/t/501_ping_icmpv6.t cd719bca662b054b676dd2ee6e0c73c7a5e50cf9
-Pod::Perldoc cpan/Pod-Perldoc/lib/Pod/Perldoc.pm d97aa26b722e6e3120b19ee0d7cf9af04dfdfb7f
-Socket cpan/Socket/Socket.pm a993d3a80844b2c89a63d1f815d2e0ed0034a4f5
-Socket cpan/Socket/Socket.xs 146541e7deb5593f0469740a6e38bfd0b42c0329
+MIME::Base64 cpan/MIME-Base64/Base64.xs ad617fe2d01932c35b92defa26d40aba601a95a8
+MIME::Base64 cpan/MIME-Base64/lib/MIME/Base64.pm 18e38d197c7c83f96b24f48bef514e93908e6a82
+Pod::Perldoc cpan/Pod-Perldoc/lib/Pod/Perldoc.pm 582be34c077c9ff44d99914724a0cc2140bcd48c
 Test::Harness cpan/Test-Harness/t/harness.t 38b13cfc479d37d91c104b97dd364a74dfde0f2f
-version vutil.c 8f1e65848649b125b6e2d3a91d54f5e147d12e41
+Time::Piece cpan/Time-Piece/Piece.pm 8cec8b66183ceddb9bf2b6af35dcdd345bc9adfa
+Time::Piece cpan/Time-Piece/Piece.xs 543152540ee17788a638b2c5746b86c3d04401d1
 Win32API::File cpan/Win32API-File/File.pm 8fd212857f821cb26648878b96e57f13bf21b99e
 Win32API::File cpan/Win32API-File/File.xs beb870fed4490d2faa547b4a8576b8d64d1d27c5
-libnet cpan/libnet/lib/Net/Cmd.pm effaa3ba5c2ea320869d0c769aa206fb75d7dd89
-libnet cpan/libnet/lib/Net/Config.pm 0f60601c070988f06a89347df74350b2521f40f1
-libnet cpan/libnet/lib/Net/Domain.pm 9b4c8e8f5a5cc8ce112a3eb5d266baf951b50d50
-libnet cpan/libnet/lib/Net/FTP.pm 46580751a97ddf9fededd846dc16e6d90ecf1fa1
-libnet cpan/libnet/lib/Net/FTP/A.pm 0168df59404d9974b889fd8afb19b99c55f21fdc
-libnet cpan/libnet/lib/Net/FTP/dataconn.pm 8c0285111481d2919305bf2fd5d566d2a4dcccd6
-libnet cpan/libnet/lib/Net/FTP/E.pm ddac78c22e36fd320f2dfe361fac57c3494561c3
-libnet cpan/libnet/lib/Net/FTP/I.pm cf2d9df91339c5b10f343d652e8673e587f8403e
-libnet cpan/libnet/lib/Net/FTP/L.pm 34db024e515a0364d9e4dd7075643b9ce8704853
-libnet cpan/libnet/lib/Net/Netrc.pm e9d809813b976163fe5e0d94dbd2a8f2edac91dc
-libnet cpan/libnet/lib/Net/NNTP.pm 4349ac4c908e6dbcfb16ec77eaf1a9a00d7c6e57
-libnet cpan/libnet/lib/Net/POP3.pm 55a74121d7e6a122f63a12cec945777f6b8aa80b
-libnet cpan/libnet/lib/Net/SMTP.pm 33efbd55e75486fe8201f9c63cf3f0704310a7b6
-libnet cpan/libnet/lib/Net/Time.pm 3c86cd4d4db9ae207070d2e54f4d523b9ad58230
-podlators cpan/podlators/t/general/basic.t 603125aa84703f7bc2c4c838c42f95b26a72eb0a
-podlators cpan/podlators/t/man/empty.t c1c7eac7a3479a2f11fdbdd0914bc2af70489b72
-podlators cpan/podlators/t/man/no-encode.t 80eb9de201bdc0b7170d9cbde856dc32e37378a0
-podlators cpan/podlators/t/text/invalid.t 3d48179b7a0fd3cddb74c18e4f1cd6f66a0a7609
 version cpan/version/lib/version.pm a963b513cf812bd7f4d28b3422efd9904e70a34c
+version cpan/version/t/07locale.t b1cceee71544ce6b6c926d06656a52aabbfe8abf
index d425e5b..d0d426f 100644 (file)
@@ -28,9 +28,12 @@ sub filter_customized {
     return @files
         unless my $customized = $Modules{$m}{CUSTOMIZED};
 
-    my ($pat) = map { qr/$_/ } join '|' => map {
-        ref $_ ? $_ : qr/\b\Q$_\E$/
-    } @{ $customized };
+    my ($pat) = map { qr/$_/ }
+        join ( '|' =>
+            map { ref $_ ? $_ : qr/\b\Q$_\E$/ } @{ $customized },
+            # https://github.com/Perl/perl5/issues/20228
+            qr/pod\/perlfilter\.pod/
+        );
 
     return grep { $_ =~ $pat } @files;
 }
index fcce507..874844a 100755 (executable)
@@ -1,14 +1,18 @@
 #!/usr/bin/perl
 
 BEGIN {
-  @INC = '..' if -f '../TestInit.pm';
+  if (-f './TestInit.pm') {
+    @INC = '.';
+  } elsif (-f '../TestInit.pm') {
+    @INC = '..';
+  }
 }
 use TestInit qw(T); # T is chdir to the top level
 
 use warnings;
 use strict;
 use Config;
-
+use Data::Dumper;
 require './t/test.pl';
 
 if ( $Config{usecrosscompile} ) {
@@ -31,15 +35,20 @@ require './regen/embed_lib.pl';
 # Look for functions that look like they could be diagnostic ones.
 my @functions;
 foreach (@{(setup_embed())[0]}) {
-  next if @$_ < 2;
-  next unless $_->[2]  =~ /warn|(?<!ov)err|(\b|_)die|croak/i;
+  my $embed= $_->{embed}
+    or next;
+  next unless $embed->{name}  =~ /warn|(?<!ov)err|(\b|_)die|croak|deprecate/i;
+  # Skip some known exceptions
+  next if $embed->{name} =~ /croak_kw_unless_class/;
   # The flag p means that this function may have a 'Perl_' prefix
   # The flag S means that this function may have a 'S_' prefix
-  push @functions, $_->[2];
-  push @functions, 'Perl_' . $_->[2] if $_->[0] =~ /p/;
-  push @functions, 'S_' . $_->[2] if $_->[0] =~ /S/;
+  push @functions, $embed->{name};
+  push @functions, 'Perl_' . $embed->{name} if $embed->{flags} =~ /p/;
+  push @functions, 'S_' . $embed->{name} if $embed->{flags} =~ /S/;
 };
 push @functions, 'Perl_mess';
+@functions = sort { length($b) <=> length($a) || $a cmp $b } @functions;
+push @functions, 'PERL_DIAG_(?<wrapper>\w+)';
 
 my $regcomp_fail_re = '\b(?:(?:Simple_)?v)?FAIL[2-4]?(?:utf8f)?\b';
 my $regcomp_re =
@@ -51,18 +60,27 @@ my $text_re = '"(?<text>(?:\\\\"|[^"]|"\s*[A-Z_]+\s*")*)"';
 my $source_msg_call_re = qr/$source_msg_re(?:_nocontext)? \s*
     \( (?: \s* Perl_form \( )? (?:aTHX_)? \s*
     (?:packWARN\d*\((?<category>.*?)\),)? \s*
+    (?:(?<category>WARN_DEPRECATED__\w+)\s*,(?:\s*(?<version_string>"[^"]+")\s*,)?)? \s*
     $text_re /x;
 my $bad_version_re = qr{BADVERSION\([^"]*$text_re};
    $regcomp_fail_re = qr/$regcomp_fail_re\([^"]*$text_re/;
 my $regcomp_call_re = qr/$regcomp_re.*?$text_re/;
 
 my %entries;
-
+my $data_start_line= 0;
 # Get the ignores that are compiled into this file
 my $reading_categorical_exceptions;
+# reset the DATA point to the top of the file, read until we find __DATA__
+# so that $. is "correct" for our purposes.
+seek DATA, 0, 0;
+while (<DATA>) {
+    /^__DATA__/ and last;
+}
 while (<DATA>) {
   chomp;
+  next if /^\s*#/ and !/\S/;
   $entries{$_}{todo} = 1;
+  $entries{$_}{todo_line}= $data_start_line + $.;
   $reading_categorical_exceptions and $entries{$_}{cattodo}=1;
   /__CATEGORIES__/ and ++$reading_categorical_exceptions;
 }
@@ -111,13 +129,16 @@ while (<$diagfh>) {
 
     if (exists $entries{$cur_entry} &&  $entries{$cur_entry}{todo}
                                     && !$entries{$cur_entry}{cattodo}) {
+        my $data_line= $entries{$cur_entry}{todo_line};
         TODO: {
-            local $::TODO = "Remove the TODO entry \"$cur_entry\" from DATA as it is already in $pod near line $.";
+            local $::TODO = "Remove the TODO entry \"$cur_entry\" from DATA "
+                          . "at $0 line $data_line as it is already in $pod near line $.";
             ok($cur_entry);
         }
     }
     # Make sure to init this here, so an actual entry in perldiag
     # overwrites one in DATA.
+    # diag("adding '$cur_entry'");
     $entries{$cur_entry}{todo} = 0;
     $entries{$cur_entry}{line_number} = $.;
   }
@@ -182,7 +203,9 @@ foreach my $cur_entry ( keys %entries) {
 # List from perlguts.pod "Formatted Printing of IVs, UVs, and NVs"
 # Convert from internal formats to ones that the readers will be familiar
 # with, while removing any format modifiers, such as precision, the
-# presence of which would just confuse the pod's explanation
+# presence of which would just confuse the pod's explanation.
+# Note that the 'S' formats get converted into \"%s\" as they inject
+# double quotes.
 my %specialformats = (IVdf => 'd',
                      UVuf => 'd',
                      UVof => 'o',
@@ -192,12 +215,21 @@ my %specialformats = (IVdf => 'd',
                      NVff => 'f',
                      NVgf => 'f',
                      HEKf256=>'s',
+                     HEKf256_QUOTEDPREFIX => 'S',
                      HEKf => 's',
+                     HEKf_QUOTEDPREFIX => 'S',
                      UTF8f=> 's',
+                     UTF8f_QUOTEDPREFIX => 'S',
                      SVf256=>'s',
                      SVf32=> 's',
                      SVf  => 's',
-                     PNf  => 's');
+                     SVf_QUOTEDPREFIX  => 'S',
+                      PVf_QUOTEDPREFIX  => 'S',
+                     PNf  => 's',
+                      HvNAMEf => 's',
+                      HvNAMEf_QUOTEDPREFIX => 'S',
+                  );
+
 my $format_modifiers = qr/ [#0\ +-]*              # optional flags
                          (?: [1-9][0-9]* | \* )? # optional field width
                          (?: \. \d* )?           # optional precision
@@ -205,8 +237,8 @@ my $format_modifiers = qr/ [#0\ +-]*              # optional flags
                        /x;
 
 my $specialformats =
- join '|', sort { length $b cmp length $a } keys %specialformats;
-my $specialformats_re = qr/%$format_modifiers"\s*($specialformats)(\s*")?/;
+ join '|', sort { length($b) <=> length($a) || $a cmp $b } keys %specialformats;
+my $specialformats_re = qr/%$format_modifiers"\s*($specialformats)(\s*(?:"|\z))?/;
 
 # We skip the bodies of most XS functions, but not within these files
 my @include_xs_files = (
@@ -240,8 +272,14 @@ sub standardize {
   elsif ( $name =~ m/^(Invalid version format) \([^\)]*\)/ ) {
     $name = "$1 (\%s)";
   }
-  elsif ($name =~ m/^panic: /) {
-    $name = "panic: \%s";
+  elsif ($name =~ m/^(panic|Usage): /) {
+    $name = "$1: \%s";
+  }
+  else {
+    $name =~ s/ (*plb:^Function\ ")
+                (\w+)
+                (*pla:"\ not\ implemented\ in\ this\ version\ of\ perl\.)
+              /%s/gx;
   }
 
   return $name;
@@ -260,6 +298,7 @@ sub check_file {
   my $sub = 'top of file';
   while (<$codefh>) {
     chomp;
+    my $first_line = $.;
     # Getting too much here isn't a problem; we only use this to skip
     # errors inside of XS modules, which should get documented in the
     # docs for the module.
@@ -272,26 +311,26 @@ sub check_file {
       $listed_as_line = $.+1;
     }
     elsif (m</\*\s*diag_listed_as: (.*?)\s*\z>) {
-      $listed_as = $1;
-      my $finished;
+      my $new_listed_as = $1;
       while (<$codefh>) {
         if (m<\*/>) {
-          $listed_as .= $` =~ s/^\s*/ /r =~ s/\s+\z//r;
+          $new_listed_as .= $` =~ s/^\s*/ /r =~ s/\s+\z//r;
           $listed_as_line = $.+1;
-          $finished = 1;
+          $listed_as= $new_listed_as;
           last;
         }
         else {
-          $listed_as .= s/^\s*/ /r =~ s/\s+\z//r;
+          $new_listed_as .= s/^\s*/ /r =~ s/\s+\z//r;
         }
       }
-      if (!$finished) { $listed_as = undef }
     }
     next if /^#/;
 
     my $multiline = 0;
     # Loop to accumulate the message text all on one line.
-    if (m/(?!^)\b(?:$source_msg_re(?:_nocontext)?|$regcomp_re)\s*\(/) {
+    if (m/(?!^)\b(?:$source_msg_re(?:_nocontext)?|$regcomp_re)\s*\((?<tail>(?:[^()]+|\([^()]+\))+\))?/
+        and !$+{tail}
+    ) {
       while (not m/\);\s*$/) {
         my $nextline = <$codefh>;
         # Means we fell off the end of the file.  Not terribly surprising;
@@ -315,16 +354,32 @@ sub check_file {
     # in later lines.
 
     s/$specialformats_re/"%$specialformats{$1}" .  (defined $2 ? '' : '"')/ge;
+    s/\%S/\\"%s\\"/g; # convert an %S into a quoted %s.
 
     # Remove any remaining format modifiers, but not in %%
     s/ (?<!%) % $format_modifiers ( [dioxXucsfeEgGp] ) /%$1/xg;
 
     # The %"foo" thing needs to happen *before* this regex.
-    # diag($_);
+    # diag(">$_<");
     # DIE is just return Perl_die
-    my ($name, $category, $routine);
+    my ($name, $category, $routine, $wrapper);
     if (/\b$source_msg_call_re/) {
-      ($name, $category, $routine) = ($+{'text'}, $+{'category'}, $+{'routine'});
+      my $version_string;
+      ($name, $category, $routine, $wrapper, $version_string) =
+        ($+{'text'}, $+{'category'}, $+{'routine'}, $+{'wrapper'}, $+{'version_string'});
+      if ($wrapper) {
+        $category = $wrapper if $wrapper=~/WARN/;
+        $routine = "Perl_warner" if $wrapper=~/WARN/;
+        $routine = "yyerror" if $wrapper=~/DIE/;
+      }
+      if ($routine=~/^deprecate/) {
+        $name .= " is deprecated";
+        if ($version_string) {
+            like($version_string, qr/"5\.\d+"/,
+                "version string is of the correct form at $codefn line $first_line");
+        }
+      }
+      # diag(Dumper(\%+,{category=>$category, routine=>$routine, name=>$name}));
       # Sometimes the regexp will pick up too much for the category
       # e.g., WARN_UNINITIALIZED), PL_warn_uninit_sv ... up to the next )
       $category && $category =~ s/\).*//s;
@@ -371,6 +426,7 @@ sub check_file {
                  :  $routine =~ /ckWARN\d*reg_d/? 'S'
                  :  $routine =~ /ckWARN\d*reg/ ?  'W'
                  :  $routine =~ /vWARN\d/      ? '[WDS]'
+                 :  $routine =~ /^deprecate/   ? '[WDS]'
                  :                             '[PFX]';
     my $categories;
     if (defined $category) {
@@ -379,8 +435,9 @@ sub check_file {
         join ", ",
               sort map {s/^WARN_//; lc $_} split /\s*[|,]\s*/, $category;
     }
-    if ($listed_as and $listed_as_line == $. - $multiline) {
+    if ($listed_as) {
       $name = $listed_as;
+      undef $listed_as;
     } else {
       # The form listed in perldiag ignores most sorts of fancy printf
       # formatting, or makes it more perlish.
@@ -442,6 +499,7 @@ sub check_message {
         TODO: {
           no warnings 'once';
           local $::TODO = 'in DATA';
+          # diag(Dumper($entries{$key}));
           # There is no listing, but it is in the list of exceptions.  TODO FAIL.
           fail($key);
           diag(
@@ -463,14 +521,20 @@ sub check_message {
         state %qrs;
         my $qr = $qrs{$severity} ||= qr/$severity/;
 
+        my $pod_line = $entries{$key}{line_number} // "";
+
+        if ($pod_line) {
+            $pod_line = ", at perldiag.pod line $pod_line";
+        }
+
         like($entries{$key}{severity}, $qr,
-          $severity =~ /\[/
-            ? "severity is one of $severity for $key"
-            : "severity is $severity for $key");
+          ($severity =~ /\[/
+            ? "severity is one of $severity"
+            : "severity is $severity") . "for '$name' at $codefn line $.$pod_line");
 
         is($entries{$key}{category}, $categories,
            ($categories ? "categories are [$categories]" : "no category")
-             . " for $key");
+             . " for '$name' at $codefn line $.$pod_line");
       }
     } elsif ($partial) {
       # noop
@@ -504,28 +568,37 @@ sub check_message {
     return $ret;
 }
 
-# Lists all missing things as of the inauguration of this script, so we
-# don't have to go from "meh" to perfect all at once.
-# 
-# PLEASE DO NOT ADD TO THIS LIST.  Instead, write an entry in
-# pod/perldiag.pod for your new (warning|error).  Nevertheless,
-# listing exceptions here when this script is not smart enough
-# to recognize the messages is not so bad, as long as there are
-# entries in perldiag.
-
-# Entries after __CATEGORIES__ are those that are in perldiag but fail the
-# severity/category test.
+# The DATA section includes two types of entries, in two sets separated by a
+# blank line.
+#
+# The first set are entries whose text we think is fully explanatory and don't
+# need further elaboration in perldiag.  This set should consist of very few
+# entries.
+#
+# The second set, after the blank line, consists of TODO entries.  (There are
+# actually two subsets described below.)  This list should basically be just
+# those entries that otherwise would have generated an error upon inauguration
+# of this program, so we didn't have to go from "meh" to perfect all at once.
+# The only valid reason we can think of to add to the list is for cases where
+# this program is not smart enough to recognize the message is something that
+# actually is in perldiag.  Otherwise, DO NOT ADD TO THIS LIST.  Instead,
+# write an entry in pod/perldiag.pod for your new (warning|error).
+#
+# This second set has a subcategory, after the line marked __CATEGORIES__ .
+# These are entries that are in perldiag but fail the severity/category test.
 
-# Also FIXME this test, as the first entry in TODO *is* covered by the
-# description: Malformed UTF-8 character (%s)
 __DATA__
-Malformed UTF-8 character (unexpected non-continuation byte 0x%x, immediately after start byte 0x%x)
+Function "%s" not implemented in this version of perl.
+QUITing...
+Recompile perl with -DDEBUGGING to use -D switch (did you mean -d ?)
+System V IPC is not implemented on this machine
+Terminating on signal SIG%s(%d)
+This version of OS/2 does not support %s.%s
+Usage: %s
 
 Cannot apply "%s" in non-PerlIO perl
-Cannot set timer
 Can't find DLL name for the module `%s' by the handle %d, rc=%u=%x
 Can't find string terminator %c%s%c anywhere before EOF
-Can't fix broken locale name "%s"
 Can't get short module name from a handle
 Can't load DLL `%s', possible problematic module `%s'
 Can't locate %s:   %s
@@ -538,18 +611,15 @@ Can't %s "%s": %s
 Can't %s `%s' with ARGV[0] being `%s' (looking for executables only, not found)
 Can't use string ("%s"%s) as a subroutine ref while "strict refs" in use
 Character(s) in '%c' format wrapped in %s
-chown not implemented!
 clear %s
 Code missing after '/' in pack
 Code missing after '/' in unpack
-Could not find version 1.1 of winsock dll
 Could not find version 2.0 of winsock dll
 '%c' outside of string in pack
 Debug leaking scalars child failed%s with errno %d: %s
 detach of a thread which could not start
 detach on an already detached thread
 detach on a thread with a waiter
--Dp not implemented on this platform
 Empty array reference given to mod2fname
 endhostent not implemented!
 endnetent not implemented!
@@ -557,11 +627,9 @@ endprotoent not implemented!
 endservent not implemented!
 Error loading module '%s': %s
 Error reading "%s": %s
-execl not implemented!
 EVAL without pos change exceeded limit in regex
 Filehandle opened only for %sput
 Filehandle %s opened only for %sput
-Filehandle STD%s reopened as %s only for input
 file_type not implemented on DOS
 filter_del can only delete in reverse order (currently)
 fork() not available
@@ -569,29 +637,6 @@ fork() not implemented!
 YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET! FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!
 free %s
 Free to wrong pool %p not %p
-Function "endnetent" not implemented in this version of perl.
-Function "endprotoent" not implemented in this version of perl.
-Function "endservent" not implemented in this version of perl.
-Function "getnetbyaddr" not implemented in this version of perl.
-Function "getnetbyname" not implemented in this version of perl.
-Function "getnetent" not implemented in this version of perl.
-Function "getprotobyname" not implemented in this version of perl.
-Function "getprotobynumber" not implemented in this version of perl.
-Function "getprotoent" not implemented in this version of perl.
-Function "getservbyport" not implemented in this version of perl.
-Function "getservent" not implemented in this version of perl.
-Function "getsockopt" not implemented in this version of perl.
-Function "recvmsg" not implemented in this version of perl.
-Function "sendmsg" not implemented in this version of perl.
-Function "sethostent" not implemented in this version of perl.
-Function "setnetent" not implemented in this version of perl.
-Function "setprotoent" not implemented in this version of perl.
-Function "setservent"  not implemented in this version of perl.
-Function "setsockopt" not implemented in this version of perl.
-Function "tcdrain" not implemented in this version of perl.
-Function "tcflow" not implemented in this version of perl.
-Function "tcflush" not implemented in this version of perl.
-Function "tcsendbreak" not implemented in this version of perl.
 get %s %p %p %p
 gethostent not implemented!
 getnetbyaddr not implemented!
@@ -607,20 +652,13 @@ Goto undefined subroutine
 Goto undefined subroutine &%s
 Got signal %d
 ()-group starts with a count in %s
-Illegal binary digit '%c' ignored
-Illegal character %sin prototype for %s : %s
-Illegal hexadecimal digit '%c' ignored
 Illegal octal digit '%c' ignored
 INSTALL_PREFIX too long: `%s'
 Invalid argument to sv_cat_decode
 Invalid range "%c-%c" in transliteration operator
 Invalid separator character %c%c%c in PerlIO layer specification %s
-Invalid TOKEN object ignored
 ioctl implemented only on sockets
-ioctlsocket not implemented!
 join with a thread with a waiter
-killpg not implemented!
-List form of pipe open not implemented
 Looks like we have no PM; will not load DLL %s without $ENV{PERL_ASIF_PM}
 Malformed integer in [] in %s
 Malformed %s
@@ -638,17 +676,12 @@ Operator or semicolon missing before %c%s
 Out of memory during list extend
 panic queryaddr
 Parse error
-PerlApp::TextQuery: no arguments, please
 POSIX syntax [%c %c] is reserved for future extensions in regex; marked by <-- HERE in m/%s/
 ptr wrong %p != %p fl=%x nl=%p e=%p for %d
-QUITing...
-Recompile perl with -DDEBUGGING to use -D switch (did you mean -d ?)
 recursion detected in %s
-Regexp *+ operand could be empty in regex; marked by <-- HERE in m/%s/
 Reversed %c= operator
 %s: Can't parse EXE/DLL name: '%s'
 %s(%f) failed
-%sCompilation failed in require
 %s: Error stripping dirs from EXE/DLL/INSTALLDIR name
 sethostent not implemented!
 setnetent not implemented!
@@ -664,19 +697,13 @@ Size magic not implemented
 %s not implemented!
 %s number > %s non-portable
 %srealloc() %signored
-%s in regex m/%s/
 %s on %s %s
-socketpair not implemented!
 %s: %s
 Starting Full Screen process with flag=%d, mytype=%d
 Starting PM process with flag=%d, mytype=%d
-sv_2iv assumed (U_V(fabs((double)SvNVX(sv))) < (UV)IV_MAX) but SvNVX(sv)=%f U_V is 0x%x, IV_MAX is 0x%x
 switching effective gid is not implemented
 switching effective uid is not implemented
-System V IPC is not implemented on this machine
-Terminating on signal SIG%s(%d)
 This perl was compiled without taint support. Cowardly refusing to run with -t or -T flags
-This version of OS/2 does not support %s.%s
 Too deeply nested ()-groups in %s
 Too many args on %s line of "%s"
 U0 mode on a byte string
@@ -686,27 +713,11 @@ Unexpected program mode %d when morphing back from PM
 Unrecognized character %s; marked by <-- HERE after %s<-- HERE near column %d
 Unstable directory path, current directory changed unexpectedly
 Unterminated compressed integer in unpack
-Usage: %s(%s)
-Usage: %s::%s(%s)
-Usage: CODE(0x%x)(%s)
-Usage: File::Copy::rmscopy(from,to[,date_flag])
-Usage: VMS::Filespec::candelete(spec)
-Usage: VMS::Filespec::fileify(spec)
-Usage: VMS::Filespec::pathify(spec)
-Usage: VMS::Filespec::rmsexpand(spec[,defspec])
-Usage: VMS::Filespec::unixify(spec)
-Usage: VMS::Filespec::unixpath(spec)
-Usage: VMS::Filespec::unixrealpath(spec)
-Usage: VMS::Filespec::vmsify(spec)
-Usage: VMS::Filespec::vmspath(spec)
-Usage: VMS::Filespec::vmsrealpath(spec)
 utf8 "\x%X" does not map to Unicode
 Value of logical "%s" too long. Truncating to %i bytes
 waitpid: process %x is not a child of process %x
 Wide character
 Wide character in $/
-win32_get_osfhandle() TBD on this platform
-win32_open_osfhandle() TBD on this platform
 Within []-length '*' not allowed in %s
 Within []-length '%c' not allowed in %s
 Wrong size of loadOrdinals array: expected %d, actual %d
index 6babbe5..83e4867 100644 (file)
@@ -24,12 +24,6 @@ use File::Spec::Functions;
 # Exceptions that are found in dual-life bin dirs but aren't
 # installed by default; some occur only during testing:
 my $not_installed = qr{^(?:
-  \.\./cpan/Archive-Tar/bin/ptar.*
-   |
-  \.\./cpan/JSON-PP/bin/json_pp
-   |
-  \.\./cpan/IO-Compress/bin/zipdetails
-   |
   \.\./cpan/Encode/bin/u(?:cm(?:2table|lint|sort)|nidump)
    |
   \.\./cpan/Module-(?:Metadata|Build)
index 2dd2a66..3e80f84 100644 (file)
@@ -30,10 +30,6 @@ if ( $^O eq "vos" ) {
   skip_all( "VOS combines the read and execute permission bits." );
 }
 
-if ( $^O eq "openbsd" ) {
-  skip_all( "OpenBSD CVS src tree execute permission bits do not match Perl distribution." );
-}
-
 if ( $Config{usecrosscompile} ) {
   skip_all( "Not all files are available during cross-compilation" );
 }
index 3e6d630..b4480df 100644 (file)
@@ -27,7 +27,7 @@ my $yes = `$trial`;
 
 skip_all("Could not run `$trial`") if $?;
 
-my $defined = qr/^[0-9a-fA-F]{8,16}\s+[^Uu]\s+_?/m;
+my $defined = $^O eq "hpux" ? qr/\|/ : qr/^[0-9a-fA-F]{8,16}\s+[^Uu]\s+_?/m;
 
 skip_all("Could not spot definition of PL_Yes in output of `$trial`")
     unless $yes =~ /${defined}PL_Yes/m;
@@ -75,10 +75,14 @@ foreach (sort keys %exported) {
  }
 }
 
+$::TODO = $::TODO; # silence uninitialized warnings
 foreach (sort keys %unexported) {
  SKIP: {
         skip("We don't export '$_'", 1) if $skip{$_};
-        fail("'$_' is defined, but we do not export it");
+        TODO: {
+            local $::TODO = "HPUX exports everything" if $^O eq "hpux";
+            fail("'$_' is defined, but we do not export it");
+        }
     }
 }
 
index 8f9d2e8..318da17 100644 (file)
@@ -93,6 +93,7 @@ DBIx::Profile
 dbm(3)
 dbm_open(3)
 Devel::Apache::Profiler
+Devel::Caller
 Devel::CallParser
 Devel::Callsite
 Devel::Cover
@@ -102,6 +103,7 @@ Devel::InnerPackage
 Devel::NYTProf
 Devel::NYTProf::Apache
 Devel::PPPort
+Devel::ptkdb
 Devel::SawAmpersand
 Devel::Spy
 dirfd(3)
@@ -168,7 +170,8 @@ ioctl(2)
 IPC::Run
 IPC::Shareable
 IPC::Signal
-ispunct(2)
+isalnum(3)
+ispunct(3)
 kill(3)
 langinfo(3)
 LaTeX::Encode
@@ -334,12 +337,15 @@ Switch
 tar(1)
 Template::Declare
 Term::ReadKey
+Term::ReadLine::Gnu
+Term::ReadLine::Perl
 Term::UI
 Term::UI::History
 Test::Harness::TAP
 Test::Inline
 Test::MockObject
 Test::Unit
+Test::Vars
 Text::Autoformat
 Text::Diff
 Text::Soundex
@@ -365,6 +371,7 @@ Unicode::Tussle
 Unicode::Unihan
 unzip(1)
 utime(2)
+Variable::Magic
 Version::Requirements
 vsprintf(3)
 wait(2)
@@ -382,8 +389,9 @@ YAML
 YAML::Syck
 YAML::Tiny
 dist/data-dumper/dumper.pm     ? Should you be using L<...> instead of 1
-dist/devel-ppport/ppport.pm    Apparent broken link    1
 dist/env/lib/env.pm    ? Should you be using F<...> or maybe L<...> instead of 1
+dist/math-complex/lib/math/complex.pm  Verbatim line length including indents exceeds 78 by    3
+dist/math-complex/lib/math/trig.pm     Verbatim line length including indents exceeds 78 by    4
 ext/dynaloader/dynaloader.pm   Verbatim line length including indents exceeds 78 by    1
 ext/hash-util/lib/hash/util.pm Verbatim line length including indents exceeds 78 by    2
 ext/pod-html/corpus/perlvar-copy.pod   ? Should you be using L<...> instead of -1
@@ -412,7 +420,6 @@ pod/perlrun.pod     Verbatim line length including indents exceeds 78 by    3
 pod/perlsolaris.pod    Verbatim line length including indents exceeds 78 by    -1
 pod/perltie.pod        Verbatim line length including indents exceeds 78 by    3
 pod/perltru64.pod      Verbatim line length including indents exceeds 78 by    1
-pod/perlwin32.pod      Verbatim line length including indents exceeds 78 by    1
 porting/epigraphs.pod  Verbatim line length including indents exceeds 78 by    -1
 porting/release_managers_guide.pod     Verbatim line length including indents exceeds 78 by    1
 lib/benchmark.pm       Verbatim line length including indents exceeds 78 by    2
index 406f5df..68da29b 100644 (file)
@@ -9,6 +9,9 @@
 # - freebsd
 # and on other platforms, and if things seem odd, just give up (skip_all).
 #
+# Symbol types for LTO builds don't seem to match their final section, so
+# skip on LTO builds too.
+#
 # Debugging tip: nm output (this script's input) can be faked by
 # giving one command line argument for this script: it should be
 # either the filename to read, or "-" for STDIN.  You can also append
@@ -47,6 +50,15 @@ if ($Config{cc} =~ /g\+\+/) {
     skip_all "on g++";
 }
 
+# ccname is gcc for both gcc and clang
+if ($Config{ccname} eq "gcc" && $Config{ccflags} =~ /-flto\b/) {
+    # If we compile with gcc nm marks PL_no_mem as "D" (normal data) rather than a R (read only)
+    # but the symbol still ends up in the .rodata section of the image on linking.
+    # If we compile with clang 14, nm marks PL_no_mem as "T" (text, aka code) rather than R
+    # but the symbol still ends up in the .rodata section on linking.
+    skip_all "LTO libperl.a flags don't match the final linker sections";
+}
+
 my $libperl_a;
 
 for my $f (qw(../libperl.a libperl.a)) {
@@ -239,6 +251,10 @@ sub nm_parse_darwin {
         $symbols->{o} = $1;
         return;
     } else {
+        if ($^V < v5.39 && !defined $symbols->{o}) {
+            skip_all "nm parser requires an update on Darwin";
+        }
+
         die "$0: undefined current object: $line" unless defined $symbols->{o};
         # 64-bit systems have 16 hexdigits, 32-bit systems have 8.
         if (s/^[0-9a-f]{8}(?:[0-9a-f]{8})? //) {
@@ -317,9 +333,8 @@ unless (exists $symbols{text}) {
 
 # These should always be true for everyone.
 
-ok($symbols{obj}{'pp.o'}, "has object pp.o");
-ok($symbols{text}{'Perl_peep'}, "has text Perl_peep");
-ok($symbols{text}{'Perl_pp_uc'}{'pp.o'}, "has text Perl_pp_uc in pp.o");
+ok($symbols{obj}{'util.o'}, "has object util.o");
+ok($symbols{text}{'Perl_croak'}{'util.o'}, "has text Perl_croak in util.o");
 ok(exists $symbols{data}{const}, "has data const symbols");
 ok($symbols{data}{const}{PL_no_mem}{'globals.o'}, "has PL_no_mem");
 
index 666c2d9..f8910c3 100755 (executable)
@@ -60,11 +60,11 @@ while (<$m>) {
        next;
     } elsif ($separator !~ tr/ //c) {
        # It's all spaces
-       fail("Spaces in entry for $file in MANIFEST at line $.");
+       fail("Spaces in entry for $file in MANIFEST at line $. (run `make manisort` to fix)");
     } elsif ($separator =~ tr/\t//) {
-       fail("Mixed tabs and spaces in entry for $file in MANIFEST at line $.");
+       fail("Mixed tabs and spaces in entry for $file in MANIFEST at line $. (run `make manisort` to fix)");
     } else {
-       fail("Odd whitespace in entry for $file in MANIFEST at line $.");
+       fail("Odd whitespace in entry for $file in MANIFEST at line $. (run `make manisort` to fix)");
     }
 }
 
diff --git a/gnu/usr.bin/perl/t/porting/pending-author.t b/gnu/usr.bin/perl/t/porting/pending-author.t
deleted file mode 100644 (file)
index 883e534..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-#!./perl -w
-
-# What does this test?
-# This uses Porting/checkAUTHORS.pl to check that any pending commit isn't
-# about to break t/porting/authors.t
-#
-# Why do we test this?
-# t/porting/authors.t checks that the AUTHORS file is up to date, accounting
-# for the "Author:" of every commit. However, any pending changes can't be
-# tested, which leaves a gotcha - "make test" can pass, one then commits
-# the passing code, pushes it uptream, and tests fail. So this test attempts
-# to spot that problem before it happens, where it can.
-#
-# It's broken - how do I fix it?
-# It will fail if you're in a git checkout, have uncommitted changes, and the
-# e-mail address that your commit will default to is in AUTHORS, or the list
-# of author aliases in Porting/checkAUTHORS.pl. So one of
-# a) reset your pending changes
-# b) change your git config user.email to the previously-known e-mail address
-# c) add yourself to AUTHORS
-# d) add an alias to Porting/checkAUTHORS.pl
-
-BEGIN {
-    @INC = '..' if -f '../TestInit.pm';
-}
-use TestInit qw(T); # T is chdir to the top level
-use strict;
-use File::Spec;
-
-require './t/test.pl';
-find_git_or_skip('all');
-
-my $devnull = File::Spec->devnull;
-my @lines = `git status --porcelain 2>$devnull`;
-skip_all("git status --porcelain doesn't seem to work here")
-    if $? != 0;
-skip_all("No pending changes")
-    if !grep !/^\?\?/, @lines;
-
-sub get {
-    my $key = shift;
-    my $value = `git config --get user.$key`;
-    unless (defined $value && $value =~ /\S/) {
-       skip_all("git config --get user.$key returned nought");
-    }
-    chomp $value;
-    return $value;
-}
-
-my $email = get('email');
-my $name = get('name');
-
-open my $fh, '|-', "$^X Porting/checkAUTHORS.pl --tap -"
-    or die $!;
-print $fh "Author: $name <$email>\n";
-close $fh or die $!;
index 08f0c72..1b5cd65 100755 (executable)
@@ -447,7 +447,8 @@ my $non_pods = qr/
                            | core .*
                        )
                  $
-               ) | ~$
+               ) | ~$                    # Vim droppings
+                 | \.bak$                # Other editor droppings
                  | \ \(Autosaved\)\.txt$ # Other editor droppings
                  | ^cxx\$demangler_db\.$ # VMS name mangler database
                  | ^typemap\.?$          # typemap files
@@ -455,6 +456,10 @@ my $non_pods = qr/
                  | ^core (?: $ | \. .* )
                  | ^vgcore\.[1-9][0-9]*$
                  | \b Changes \b
+
+                   # This is a pod, but is part of a corpus to test agains; we
+                   # don't care about any issues in it.
+                 | ext\/Pod-Html\/corpus\/perlvar-copy.pod
              /x;
 
 # Matches something that looks like a file name, but is enclosed in C<...>
@@ -1130,7 +1135,8 @@ package My::Pod::Checker {      # Extend Pod::Checker
 
             $self->poderror({ -line => $start_line{$addr} + $i,
                 -msg => $line_length,
-                parameter => "+$exceeds (including " . ($indent - $INDENT) . " from =over's)",
+                parameter => "+$exceeds (including " . ($indent - $INDENT) .
+                             " from =over's and $INDENT as base indent)",
             });
         }
 
@@ -1587,8 +1593,9 @@ sub is_pod_file {
 
     if (-d) {
         # Don't look at files in directories that are for tests, nor those
-        # beginning with a dot
-        if (m!/t\z! || m!/\.!) {
+        # beginning with a dot, nor those in the directory where Windows
+        # builds generate HTML from other POD sources.
+        if (m!/t\z! || m!/\.! || m!^./win32/html\z!) {
             $File::Find::prune = 1;
         }
         return;
@@ -2212,7 +2219,7 @@ following:
 
 1) If a problem is about a link to an unknown module or man page that
    you know exists, re-run the command something like:
-      ./perl -I../lib porting/podcheck.t --add-link MODULE man_page ...
+      ./perl -I../lib porting/podcheck.t --add-link { MODULE | man_page ... }
    (MODULEs should look like Foo::Bar, and man_pages should look like
    bar(3c); don't do this for a module or man page that you aren't sure
    about; instead treat as another type of issue and follow the
index d684fdc..31a8e09 100644 (file)
@@ -3,7 +3,8 @@
 # Verify that all files generated by perl scripts are up to date.
 
 BEGIN {
-    @INC = '..' if -f '../TestInit.pm';
+    push @INC, '..' if -f '../TestInit.pm';
+    push @INC, '.' if -f './TestInit.pm';
 }
 use TestInit qw(T A); # T is chdir to the top level, A makes paths absolute
 use strict;
@@ -26,7 +27,7 @@ if ( $Config{usecrosscompile} ) {
   skip_all( "Not all files are available during cross-compilation" );
 }
 
-my $tests = 24; # I can't see a clean way to calculate this automatically.
+my $tests = 27; # I can't see a clean way to calculate this automatically.
 
 my %skip = ("regen_perly.pl"    => [qw(perly.act perly.h perly.tab)],
             "regen/keywords.pl" => [qw(keywords.c keywords.h)],
@@ -50,29 +51,51 @@ for my $script (keys %other_requirement) {
 
 my @files = map {@$_} sort values %skip;
 
-open my $fh, '<', 'regen.pl'
-    or die "Can't open regen.pl: $!";
+# find out what regen scripts would be executed by regen.pl which
+# is the script that implements `make regen`. We need to know this
+# because we will run regen.pl --tap, and it will in turn
+# so we don't need to execute the scripts it executes directly.
+my %regen_files;
+{
+    open my $fh, '<', 'regen.pl'
+        or die "Can't open regen.pl: $!";
 
-while (<$fh>) {
-    last if /^__END__/;
+    while (<$fh>) {
+        last if /^__END__/;
+    }
+    die "Can't find __END__ in regen.pl"
+        if eof $fh;
+    while (<$fh>) {
+        chomp $_;
+        ++$regen_files{$_};
+    }
+    close $fh
+        or die "Can't close regen.pl: $!";
 }
-die "Can't find __END__ in regen.pl"
-    if eof $fh;
-
-foreach (qw(embed_lib.pl regen_lib.pl uconfig_h.pl
-            regcharclass_multi_char_folds.pl
-            charset_translations.pl
-            mph.pl
-            ),
-         map {chomp $_; $_} <$fh>) {
+
+# This may look a bit weird but it makes sense. We build a skip hash of
+# all the scripts that we want to avoid executing /explicitly/ during
+# our tests. This includes the files listed in %regen_files because we
+# will execute them via regen.pl instead.
+foreach (
+    qw(
+        charset_translations.pl
+        embed_lib.pl
+        mph.pl
+        regcharclass_multi_char_folds.pl
+        regen_lib.pl
+        sorted_types.pl
+        uconfig_h.pl
+    ),
+    keys %regen_files
+) {
     ++$skip{"regen/$_"};
 }
 
-close $fh
-    or die "Can't close regen.pl: $!";
 
 my @progs = grep {!$skip{$_}} <regen/*.pl>;
 push @progs, 'regen.pl', map {"Porting/makemeta $_"} qw(-j -y);
+@progs = sort @progs;
 
 plan (tests => $tests + @files + @progs);
 
@@ -85,7 +108,7 @@ OUTER: foreach my $file (@files) {
     }
     my @bad;
     while (<$fh>) {
-       last if /ex: set ro:/;
+       last if /ex:[^:]+:/;
        unless (/^(?: \* | #)([0-9a-f]+) (\S+)$/) {
            chomp $_;
            fail("Bad line in $file: '$_'");
@@ -104,13 +127,22 @@ OUTER: foreach my $file (@files) {
     }
 }
 
-foreach (@progs) {
-    my $args = qq[-Ilib $_ --tap];
+my @errors;
+foreach my $prog (@progs) {
+    my $args = qq[-Ilib $prog --tap];
     note("./perl $args");
     my $command = "$^X $args";
-    system $command
-        and die <<~"HINT";
-    Hint:  A failure in this file can often be corrected by running:
-     ./perl -Ilib $_
-HINT
+    if (system $command) { # if it exits with an error...
+        $command=~s/\s*--tap//;
+        push @errors, $prog eq "regen.pl"
+                          ? "make regen"
+                          : $command;
+    }
+}
+if ( @errors ) {
+    my $commands= join "\n", sort @errors;
+    die "\n\nERROR. There are generated files which are NOT up to date.\n",
+        "You should run the following commands to update these files:\n\n",
+        $commands, "\n\n",
+        "Once they are regenerated you should commit the changes.\n\n";
 }
index 4da8e99..c95c276 100644 (file)
@@ -1,4 +1,5 @@
 # Test the /a, /d, etc regex modifiers
+# For comprehensive tests, set $ENV{PERL_DEBUG_FULL_TEST} to some true value
 
 BEGIN {
     chdir 't' if -d 't';
@@ -15,33 +16,116 @@ use Config;
 
 plan('no_plan');
 
-# Each case is a valid element of its hash key.  Choose, where available, an
-# ASCII-range, Latin-1 non-ASCII range, and above Latin1 range code point.
+# Each case is a valid element of its hash key.  Choose, where available, at
+# least one of each type: ASCII-range, non-ASCII range Latin-1, and above
+# Latin1 range code point.
 my %testcases = (
-    '\w' => [ ord("A"), utf8::unicode_to_native(0xE2), 0x16B ],   # Below expects these to all be alpha
-    '\d' => [ ord("0"), 0x0662 ],
-    '\s' => [ ord("\t"), utf8::unicode_to_native(0xA0), 0x1680 ],  # Below expects these to be [:blank:]
-    '[:cntrl:]' => [ utf8::unicode_to_native(0x00), utf8::unicode_to_native(0x88) ],
-    '[:graph:]' => [ ord("&"), utf8::unicode_to_native(0xF7), 0x02C7 ], # Below expects these to be
-                                                                     # [:print:]
-    '[:lower:]' => [ ord("g"), utf8::unicode_to_native(0xE3), 0x0127 ],
-    '[:punct:]' => [ ord('`'), ord('^'), ord('~'), ord('<'), ord('='), ord('>'), ord('|'), ord('-'), ord(','), ord(';'), ord(':'), ord('!'), ord('?'), ord('/'), ord('.'), ord('"'), ord('('), ord(')'), ord('['), ord(']'), ord('{'), ord('}'), ord('@'), ord('$'), ord('*'), ord('\\'), ord('&'), ord('#'), ord('%'), ord('+'), ord("'"), utf8::unicode_to_native(0xBF), 0x055C ],
-    '[:upper:]' => [ ord("G"), utf8::unicode_to_native(0xC3), 0x0126 ],
-    '[:xdigit:]' => [ ord("4"), 0xFF15 ],
+    '\w' => [ 0x16B ],
+    '\d' => [ ord("0"), ord("1"), ord("2"), ord("3"), ord("4"), ord("5"),
+              ord("6"), ord("7"), ord("8"), ord("9"),
+              0x0662,
+            ],
+    '[:blank:]' => [ ord("\t"), ord(" "),
+                     0x1680
+                   ],
+    '\s' => [ ord("\t"), ord("\n"), ord("\cK"), ord("\f"), ord("\r"),
+              ord(" "),
+              utf8::unicode_to_native(0x85),
+              utf8::unicode_to_native(0xA0),
+              0x2029,
+            ],
+    '[:graph:]' => [ 0x02C7 ],
+    '[:lower:]' => [ ord("a"), ord("b"), ord("c"), ord("d"), ord("e"),
+                     ord("f"), ord("g"), ord("h"), ord("i"), ord("j"),
+                     ord("k"), ord("l"), ord("m"), ord("n"), ord("o"),
+                     ord("p"), ord("q"), ord("r"), ord("s"), ord("t"),
+                     ord("u"), ord("v"), ord("w"), ord("x"), ord("y"),
+                     ord("z"),
+                     0x0127 ],
+    '[:punct:]' => [ ord('`'), ord('^'), ord('~'), ord('<'), ord('='),
+                     ord('>'), ord('|'), ord('-'), ord(','), ord(';'),
+                     ord(':'), ord('!'), ord('?'), ord('/'), ord('.'),
+                     ord('"'), ord('('), ord(')'), ord('['), ord(']'),
+                     ord('{'), ord('}'), ord('@'), ord('$'), ord('*'),
+                     ord('\\'), ord('&'), ord('#'), ord('%'), ord('+'),
+                     ord("'"),
+                     0x055C
+                   ],
+    '[:upper:]' => [ ord("A"), ord("B"), ord("C"), ord("D"), ord("E"),
+                     ord("F"), ord("G"), ord("H"), ord("I"), ord("J"),
+                     ord("K"), ord("L"), ord("M"), ord("N"), ord("O"),
+                     ord("P"), ord("Q"), ord("R"), ord("S"), ord("T"),
+                     ord("U"), ord("V"), ord("W"), ord("X"), ord("Y"),
+                     ord("Z"),
+                     0x0126
+                   ],
+    '[:xdigit:]' => [ ord("0"), ord("1"), ord("2"), ord("3"), ord("4"),
+                      ord("5"), ord("6"), ord("7"), ord("8"), ord("9"),
+                      ord("A"), ord("B"), ord("C"), ord("D"), ord("E"),
+                      ord("F"), ord("a"), ord("b"), ord("c"), ord("d"),
+                      ord("e"), ord("f"),
+                      0xFF15,
+                    ],
 );
 
-$testcases{'[:digit:]'} = $testcases{'\d'};
-$testcases{'[:alnum:]'} = $testcases{'\w'};
-$testcases{'[:alpha:]'} = $testcases{'\w'};
-$testcases{'[:blank:]'} = $testcases{'\s'};
-$testcases{'[:print:]'} = $testcases{'[:graph:]'};
-$testcases{'[:space:]'} = $testcases{'\s'};
-$testcases{'[:word:]'} = $testcases{'\w'};
+if ($ENV{PERL_DEBUG_FULL_TEST}) {
+    push @{$testcases{'[:cntrl:]'}}, utf8::unicode_to_native($_)
+                                               for (0x00 .. 0x1F, 0x7F .. 0x9F);
+    push @{$testcases{'[:blank:]'}}, utf8::unicode_to_native(0xA0);
+    push @{$testcases{'[:punct:]'}}, utf8::unicode_to_native(0xA1);
+    push @{$testcases{'[:graph:]'}}, utf8::unicode_to_native($_)
+                                                            for (0xA2 .. 0xA6);
+    push @{$testcases{'[:punct:]'}}, utf8::unicode_to_native(0xA7);
+    push @{$testcases{'[:graph:]'}}, utf8::unicode_to_native(0xA8);
+    push @{$testcases{'[:graph:]'}}, utf8::unicode_to_native(0xA9);
+    push @{$testcases{'[:lower:]'}}, utf8::unicode_to_native(0xAA);
+    push @{$testcases{'[:punct:]'}}, utf8::unicode_to_native(0xAB);
+    push @{$testcases{'[:graph:]'}}, utf8::unicode_to_native($_)
+                                                            for (0xAC .. 0xB4);
+    push @{$testcases{'[:lower:]'}}, utf8::unicode_to_native(0xB5);
+    push @{$testcases{'[:punct:]'}}, utf8::unicode_to_native(0xB6);
+    push @{$testcases{'[:punct:]'}}, utf8::unicode_to_native(0xB7);
+    push @{$testcases{'[:graph:]'}}, utf8::unicode_to_native(0xB8);
+    push @{$testcases{'[:graph:]'}}, utf8::unicode_to_native(0xB9);
+    push @{$testcases{'[:lower:]'}}, utf8::unicode_to_native(0xBA);
+    push @{$testcases{'[:punct:]'}}, utf8::unicode_to_native(0xBB);
+    push @{$testcases{'[:graph:]'}}, utf8::unicode_to_native(0xBC);
+    push @{$testcases{'[:graph:]'}}, utf8::unicode_to_native(0xBD);
+    push @{$testcases{'[:graph:]'}}, utf8::unicode_to_native(0xBE);
+    push @{$testcases{'[:punct:]'}}, utf8::unicode_to_native(0xBF);
+    push @{$testcases{'[:upper:]'}}, utf8::unicode_to_native($_)
+                                                            for (0xC0 .. 0xD6);
+    push @{$testcases{'[:graph:]'}}, utf8::unicode_to_native(0xD7);
+    push @{$testcases{'[:upper:]'}}, utf8::unicode_to_native($_)
+                                                            for (0xD8 .. 0xDE);
+    push @{$testcases{'[:lower:]'}}, utf8::unicode_to_native($_)
+                                                            for (0xDF .. 0xF6);
+    push @{$testcases{'[:graph:]'}}, utf8::unicode_to_native(0xF7);
+    push @{$testcases{'[:lower:]'}}, utf8::unicode_to_native($_)
+                                                            for (0xF8 .. 0xF8);
+
+    push @{$testcases{'[:alpha:]'}}, @{$testcases{'[:lower:]'}},
+                                 @{$testcases{'[:upper:]'}};
+    push @{$testcases{'[:alnum:]'}}, @{$testcases{'[:alpha:]'}},
+                                 @{$testcases{'\d'}};
+    push @{$testcases{'\w'}}, @{$testcases{'[:alnum:]'}}, ord("_");
+    push @{$testcases{'[:print:]'}}, @{$testcases{'[:graph:]'}},
+                                ord(" "),
+                                utf8::unicode_to_native(0xA0);
+}
+
+@{$testcases{'[:digit:]'}} = @{$testcases{'\d'}};
+@{$testcases{'[:space:]'}} = @{$testcases{'\s'}};
+@{$testcases{'[:word:]'}}  = @{$testcases{'\w'}};
+
+#use Data::Dumper;
+#$Data::Dumper::Sortkeys = 1;
+#print STDERR Dumper \%testcases;
 
 my $utf8_locale;
 
 my @charsets = qw(a d u aa);
-my $locales_ok = locales_enabled('LC_CTYPE');
+my $locales_ok = locales_enabled([ 'LC_CTYPE', 'LC_ALL' ]);
 if (! is_miniperl() && $locales_ok) {
     require POSIX;
     my $current_locale = POSIX::setlocale( &POSIX::LC_ALL, "C") // "";
@@ -170,8 +254,10 @@ foreach my $charset (@charsets) {
                     if ($bracketed) {
 
                         # Adds an extra char to the character class to make sure
-                        # that the class doesn't get optimized away.
-                        $lb = ($bracketed) ? '[_' : "";
+                        # that the class doesn't get optimized away.  (Make
+                        # sure to not use the character being tested.)
+                        my $extra = ($char eq "_") ? ":" : "_";
+                        $lb = ($bracketed) ? "[$extra" : "";
                         $rb = ($bracketed) ? ']' : "";
                     }
                     else {  # [:posix:] must be inside outer [ ]
@@ -216,6 +302,9 @@ foreach my $charset (@charsets) {
                 # after.  We test with ASCII, Latin1 and Unicode non-word chars
                 foreach my $space_ord (@{$testcases{'\s'}}) {
 
+                    # This is an anomalous character, so skip.
+                    next if $space_ord == ord("\n");
+
                     # Useless to try to test non-utf8 when the ord itself
                     # forces utf8
                     next if $space_ord > 255 && ! $upgrade;
index 7292e46..71f1141 100755 (executable)
@@ -27,7 +27,7 @@ skip_all_without_unicode_tables();
 
 my $has_locales = locales_enabled('LC_CTYPE');
 
-plan tests => 1046;  # Update this when adding/deleting tests.
+plan tests => 1265;  # Update this when adding/deleting tests.
 
 run_tests() unless caller;
 
@@ -35,6 +35,34 @@ run_tests() unless caller;
 # Tests start here.
 #
 sub run_tests {
+    {
+        # see https://github.com/Perl/perl5/issues/12948
+        my $string="ABCDEFGHIJKL";
+        my $pat= "(.)" x length($string);
+        my $ok= $string=~/^$pat\z/;
+        foreach my $n (1 .. length($string)) {
+            $ok= eval sprintf 'is $%d, "%s", q($%d = %s); 1', ($n, substr($string,$n-1,1))x2;
+            ok($ok, "eval for \$$n test");
+            $ok= eval sprintf 'is ${%d}, "%s", q(${%d} = %s); 1', ($n, substr($string,$n-1,1))x2;
+            ok($ok, "eval for \${$n} test");
+
+            $ok= eval sprintf 'is $0%d, "%s", q($0%d = %s); 1', ($n, substr($string,$n-1,1))x2;
+            ok(!$ok, "eval failed as expected for \$0$n test");
+            $ok= eval sprintf 'is ${0%d}, "%s", q(${0%d} = %s); 1', ($n, substr($string,$n-1,1))x2;
+            ok(!$ok, "eval failed as expected for \${0$n} test");
+
+            no strict 'refs';
+            $ok= eval sprintf 'is ${0b%b}, "%s", q(${0b%b} = %s); 1', ($n, substr($string,$n-1,1))x2;
+            ok($ok, sprintf "eval for \${0b%b} test", $n);
+            $ok= eval sprintf 'is ${0x%x}, "%s", q(${0x%x} = %s); 1', ($n, substr($string,$n-1,1))x2;
+            ok($ok, sprintf "eval for \${0x%x} test", $n);
+            $ok= eval sprintf 'is ${0b%08b}, "%s", q(${0b%08b} = %s); 1', ($n, substr($string,$n-1,1))x2;
+            ok($ok, sprintf "eval for \${0b%b} test", $n);
+            $ok= eval sprintf 'is ${0x%04x}, "%s", q(${0x%04x} = %s); 1', ($n, substr($string,$n-1,1))x2;
+            ok($ok, sprintf "eval for \${0x%04x} test", $n);
+        }
+    }
+
     my $sharp_s = uni_to_native("\xdf");
 
     {
@@ -322,7 +350,7 @@ sub run_tests {
 
        #  Defaults assumed if this fails
        eval { require Config; };
-        $::reg_infty   = $Config::Config{reg_infty} // 65535;
+        $::reg_infty   = $Config::Config{reg_infty} // ((1<<31)-1);
         $::reg_infty_m = $::reg_infty - 1;
         $::reg_infty_p = $::reg_infty + 1;
         $::reg_infty_m = $::reg_infty_m;   # Suppress warning.
@@ -330,23 +358,28 @@ sub run_tests {
         # As well as failing if the pattern matches do unexpected things, the
         # next three tests will fail if you should have picked up a lower-than-
         # default value for $reg_infty from Config.pm, but have not.
-
-        is(eval q{('aaa' =~ /(a{1,$::reg_infty_m})/)[0]}, 'aaa', $message);
-        is($@, '', $message);
-        is(eval q{('a' x $::reg_infty_m) =~ /a{$::reg_infty_m}/}, 1, $message);
-        is($@, '', $message);
-        isnt(q{('a' x ($::reg_infty_m - 1)) !~ /a{$::reg_infty_m}/}, 1, $message);
-        is($@, '', $message);
+        SKIP: {
+            skip "REG_INFTY too big to test ($::reg_infty)", 7
+                if $::reg_infty > (1<<16);
+
+            is(eval q{('aaa' =~ /(a{1,$::reg_infty_m})/)[0]}, 'aaa', $message);
+            is($@, '', $message);
+            is(eval q{('a' x $::reg_infty_m) =~ /a{$::reg_infty_m}/}, 1, $message);
+            is($@, '', $message);
+            isnt(q{('a' x ($::reg_infty_m - 1)) !~ /a{$::reg_infty_m}/}, 1, $message);
+            is($@, '', $message);
+
+            # It should be 'a' x 2147483647, but that exhausts memory on
+            # reasonably sized modern machines
+            like('a' x $::reg_infty_m, qr/a{1,}/,
+                 "{1,} matches more times than REG_INFTY");
+        }
 
         eval "'aaa' =~ /a{1,$::reg_infty}/";
         like($@, qr/^\QQuantifier in {,} bigger than/, $message);
         eval "'aaa' =~ /a{1,$::reg_infty_p}/";
         like($@, qr/^\QQuantifier in {,} bigger than/, $message);
 
-        # It should be 'a' x 2147483647, but that exhausts memory on
-        # reasonably sized modern machines
-        like('a' x $::reg_infty_p, qr/a{1,}/,
-             "{1,} matches more times than REG_INFTY");
     }
 
     {
@@ -365,12 +398,17 @@ sub run_tests {
 
         for my $l (@trials) { # Ordered to free memory
             my $a = 'a' x $l;
-           my $message = "Long monster, length = $l";
-           like("ba$a=", qr/a$a=/, $message);
-            unlike("b$a=", qr/a$a=/, $message);
-            like("b$a=", qr/ba+=/, $message);
-
-           like("ba$a=", qr/b(?:a|b)+=/, $message);
+            # we do not use like() or unlike() here as the string
+            # is very long and is not useful if the match fails,
+            # the useful part
+           ok("ba$a=" =~ m/a$a=/, sprintf
+                'Long monster: ("ba".("a" x %d)."=") =~ m/aa...a=/', $l);
+            ok("b$a="  !~ m/a$a=/, sprintf
+                'Long monster: ("b" .("a" x %d)."=") !~ m/aa...a=/', $l);
+            ok("b$a="  =~ m/ba+=/, sprintf
+                'Long monster: ("b" .("a" x %d)."=") =~ m/ba+=/', $l);
+           ok("ba$a=" =~ m/b(?:a|b)+=/, sprintf
+                'Long monster: ("ba".("a" x %d)."=") =~ m/b(?:a|b)+=/', $l);
         }
     }
 
@@ -2345,6 +2383,136 @@ SKIP:
         }, 'ok', {}, 'gh17743: test regexp corruption (2)');
     }
 
+    {
+        # Test branch reset (?|...|...) in list context. This was reported
+        # in GH Issue #20710, in relation to breaking App::pl. See
+        # https://github.com/Perl/perl5/issues/20710#issuecomment-1404549785
+        my $ok = 0;
+        my ($w,$x,$y,$z);
+        $ok = ($x,$y) = "ab"=~/(?|(p)(q)|(x)(y)|(a)(b))/;
+        ok($ok,"Branch reset pattern 1 matched as expected");
+        is($x,"a","Branch reset in list context check 1 (a)");
+        is($y,"b","Branch reset in list context check 2 (b)");
+
+        $ok = ($x,$y,$z) = "xyz"=~/(?|(p)(q)|(x)(y)|(a)(b))(z)/;
+        ok($ok,"Branch reset pattern 2 matched as expected");
+        is($x,"x","Branch reset in list context check 3 (x)");
+        is($y,"y","Branch reset in list context check 4 (y)");
+        is($z,"z","Branch reset in list context check 5 (z)");
+
+        $ok = ($w,$x,$y) = "wpq"=~/(w)(?|(p)(q)|(x)(y)|(a)(b))/;
+        ok($ok,"Branch reset pattern 3 matched as expected");
+        is($w,"w","Branch reset in list context check 6 (w)");
+        is($x,"p","Branch reset in list context check 7 (p)");
+        is($y,"q","Branch reset in list context check 8 (q)");
+
+        $ok = ($w,$x,$y,$z) = "wabz"=~/(w)(?|(p)(q)|(x)(y)|(a)(b))(z)/;
+        ok($ok,"Branch reset pattern 4 matched as expected");
+        is($w,"w","Branch reset in list context check 9  (w)");
+        is($x,"a","Branch reset in list context check 10 (a)");
+        is($y,"b","Branch reset in list context check 11 (b)");
+        is($z,"z","Branch reset in list context check 12 (z)");
+    }
+    {
+        # Test for GH Issue #20826. Save stack overflow introduced in
+        # 92373dea9d7bcc0a017f20cb37192c1d8400767f PR #20530.
+        # Note this test depends on an assert so it will only fail
+        # under DEBUGGING.
+        fresh_perl_is(q{
+            $_ = "x" x 1000;
+            my $pat = '(.)' x 200;
+            $pat = qr/($pat)+/;
+            m/$pat/;
+            print "ok";
+        }, 'ok', {}, 'gh20826: test regex save stack overflow');
+    }
+    {
+        my ($x, $y);
+        ok( "aaa" =~ /(?:(a)?\1)+/,
+            "GH Issue #18865 'aaa' - pattern matches");
+        $x = "($-[0],$+[0])";
+        ok( "aaa" =~ /(?:((?{})a)?\1)+/,
+            "GH Issue #18865 'aaa' - deoptimized pattern matches");
+        $y = "($-[0],$+[0])";
+        {
+            local $::TODO = "Not Yet Implemented";
+            is( $y, $x,
+                "GH Issue #18865 'aaa' - test optimization");
+        }
+        ok( "ababab" =~ /(?:(?:(ab))?\1)+/,
+            "GH Issue #18865 'ababab' - pattern matches");
+        $x = "($-[0],$+[0])";
+        ok( "ababab" =~ /(?:(?:((?{})ab))?\1)+/,
+            "GH Issue #18865 'ababab' - deoptimized pattern matches");
+        $y = "($-[0],$+[0])";
+        {
+            local $::TODO = "Not Yet Implemented";
+            is( $y, $x,
+                "GH Issue #18865 'ababab' - test optimization");
+        }
+        ok( "XaaXbbXb" =~ /(?:X([ab])?\1)+/,
+            "GH Issue #18865 'XaaXbbXb' - pattern matches");
+        $x = "($-[0],$+[0])";
+        ok( "XaaXbbXb" =~ /(?:X((?{})[ab])?\1)+/,
+            "GH Issue #18865 'XaaXbbXb' - deoptimized pattern matches");
+        $y = "($-[0],$+[0])";
+        {
+            local $::TODO = "Not Yet Implemented";
+            is( $y, $x,
+                "GH Issue #18865 'XaaXbbXb' - test optimization");
+        }
+    }
+    {
+        # Test that ${^LAST_SUCCESSFUL_PATTERN} works as expected.
+        # It should match like the empty pattern does, and it should be dynamic
+        # in the same was as $1 is dynamic.
+        my ($str,$pat);
+        $str = "ABCD";
+        $str =~/(D)/;
+        is("$1", "D", '$1 is "D"');
+        $pat = "${^LAST_SUCCESSFUL_PATTERN}";
+        is($pat, "(?^:(D))", 'Outer ${^LAST_SUCCESSFUL_PATTERN} is as expected');
+        {
+            if ($str=~/BX/ || $str=~/(BC)/) {
+                is("$1", "BC",'$1 is now "BC"');
+                $pat = "${^LAST_SUCCESSFUL_PATTERN}";
+                ok($str =~ s//ZZ/, "Empty pattern matched as expected");
+                is($str, "AZZD", "Empty pattern in s/// has result we expected");
+            }
+        }
+        is("$1", "D", '$1 should now be "D" again');
+        is($pat, "(?^:(BC))", 'inner ${^LAST_SUCCESSFUL_PATTERN} is as expected');
+        ok($str=~s//Q/, 'Empty pattern to "Q" was successful');
+        is($str, "AZZQ", "Empty pattern in s/// has result we expected (try2)");
+        $pat = "${^LAST_SUCCESSFUL_PATTERN}";
+        is($pat, "(?^:(D))", 'Outer ${^LAST_SUCCESSFUL_PATTERN} restored to its previous value as expected');
+
+        $str = "ABCD";
+        {
+            if ($str=~/BX/ || $str=~/(BC)/) {
+                is("$1", "BC",'$1 is now "BC"');
+                $pat = "${^LAST_SUCCESSFUL_PATTERN}";
+                ok($str=~s/${^LAST_SUCCESSFUL_PATTERN}/ZZ/, '${^LAST_SUCCESSFUL_PATTERN} matched as expected');
+                is($str, "AZZD", '${^LAST_SUCCESSFUL_PATTERN} in s/// has result we expected');
+            }
+        }
+        is("$1", "D", '$1 should now be "D" again');
+        is($pat, "(?^:(BC))", 'inner ${^LAST_SUCCESSFUL_PATTERN} is as expected');
+        is($str, "AZZD", 'Using ${^LAST_SUCCESSFUL_PATTERN} as a pattern has same result as empty pattern');
+        ok($str=~s/${^LAST_SUCCESSFUL_PATTERN}/Q/, '${^LAST_SUCCESSFUL_PATTERN} to "Q" was successful');
+        is($str, "AZZQ", '${^LAST_SUCCESSFUL_PATTERN} in s/// has result we expected');
+        ok($str=~/ZQ/, "/ZQ/ matched as expected");
+        $pat = "${^LAST_SUCCESSFUL_PATTERN}";
+        is($pat, "(?^:ZQ)", '${^LAST_SUCCESSFUL_PATTERN} changed as expected');
+
+        $str = "foobarfoo";
+        ok($str =~ s/foo//, "matched foo");
+        my $copy= ${^LAST_SUCCESSFUL_PATTERN};
+        ok(defined($copy), '$copy is defined');
+        ok($str =~ s/bar//,"matched bar");
+        ok($str =~ s/$copy/PQR/, 'replaced $copy with PQR');
+        is($str, "PQR", 'final string should be PQR');
+    }
 } # End of sub run_tests
 
 1;
index 088efed..c16313c 100755 (executable)
@@ -1508,19 +1508,25 @@ sub run_tests {
     }
 
     {
-        my $res="";
+        no warnings 'uninitialized';
+        my $res = "";
 
         if ('1' =~ /(?|(?<digit>1)|(?<digit>2))/) {
             $res = "@{$- {digit}}";
         }
-        is($res, "1",
-          "Check that (?|...) doesnt cause dupe entries in the names array");
+        is($res, "1 ",
+          "Check that repeated named captures in branch reset (?|...) work as expected");
+        if ('2' =~ /(?|(?<digit>1)|(?<digit>2))/) {
+            $res = "@{$- {digit}}";
+        }
+        is($res, " 2",
+          "Check that repeated named captures in branch reset (?|...) work as expected");
 
         $res = "";
         if ('11' =~ /(?|(?<digit>1)|(?<digit>2))(?&digit)/) {
             $res = "@{$- {digit}}";
         }
-        is($res, "1",
+        is($res, "1 ",
           "Check that (?&..) to a buffer inside a (?|...) goes to the leftmost");
     }
 
@@ -2138,8 +2144,8 @@ EOP
 
     {   # This was failing unless an explicit /d was added
         my $E0 = uni_to_native("\xE0");
+        utf8::upgrade($E0);
         my $p = qr/[_$E0]/i;
-        utf8::upgrade($p);
         like(uni_to_native("\xC0"), qr/$p/, "Verify \"\\xC0\" =~ /[\\xE0_]/i; pattern in utf8");
     }
 
@@ -2379,11 +2385,10 @@ EOF
         ok(1, $message);  # If it didn't crash, it worked.
     }
 
-    TODO: {   # Was looping
-        todo_skip('Triggers thread clone SEGV. See #86550')
-         if $::running_as_thread && $::running_as_thread;
-        watchdog(10 * ($ENV{PERL_TEST_TIME_OUT_FACTOR} || 1));
+    {   # Was looping
+        watchdog(10);
         like("\x{00DF}", qr/[\x{1E9E}_]*/i, "\"\\x{00DF}\" =~ /[\\x{1E9E}_]*/i was looping");
+        watchdog(0);
     }
 
     {   # Bug #90536, caused failed assertion
@@ -2585,14 +2590,15 @@ Starting parse and generation
 <\g{c}>         |   6|            brnc   
                 |    |              piec   
                 |    |                atom   
-<>              |   8|            tail~ OPEN1 'b' (4) -> REFN
-                |    |            Setting close paren #1 to 8
-                |  10|          lsbr~ tying lastbr REFN0 (6) to ender CLOSE1 'b' (8) offset 2
-                |    |            tail~ REFN0 (6) -> CLOSE
+<>              |   9|            tail~ OPEN1 'b' (4) -> REFN
+                |    |            Setting close paren #1 to 9
+                |  11|          lsbr~ tying lastbr REFN <1> (6) to ender CLOSE1 'b' (9) offset 3
+                |    |            tail~ REFN <1> (6) -> CLOSE
 Unmatched ( in regex; marked by <-- HERE in m/(?{a})( <-- HERE ?<b>\g{c}/ at - line 1.
 Freeing REx: "(?{a})(?<b>\g{c}"
 EOF_DEBUG_OUT
-                      {}, "Github Issue #19350, assert fail in "
+                      {rtrim_result=>1},
+                      "Github Issue #19350, assert fail in "
                           . "Debug => 'ALL' from malformed qr// (heisenbug try $try)");
     }
     {   # Related to GH $19350 but segfaults instead of asserts, and does so reliably, not randomly.
@@ -2612,35 +2618,35 @@ Starting parse and generation
 <\g{c})(?<c>>...|   3|            brnc   
                 |    |              piec   
                 |    |                atom   
-<)(?<c>x)(?&b)> |   5|            tail~ OPEN1 'b' (1) -> REFN
-                |   7|          lsbr~ tying lastbr REFN0 (3) to ender CLOSE1 'b' (5) offset 2
-                |    |            tail~ REFN0 (3) -> CLOSE
+<)(?<c>x)(?&b)> |   6|            tail~ OPEN1 'b' (1) -> REFN
+                |   8|          lsbr~ tying lastbr REFN <1> (3) to ender CLOSE1 'b' (6) offset 3
+                |    |            tail~ REFN <1> (3) -> CLOSE
 <(?<c>x)(?&b)>  |    |      piec   
                 |    |        atom   
 <?<c>x)(?&b)>   |    |          reg    
-<x)(?&b)>       |   9|            brnc   
+<x)(?&b)>       |  10|            brnc
                 |    |              piec   
                 |    |                atom   
-<)(?&b)>        |  11|            tail~ OPEN2 'c' (7) -> EXACT
-                |  13|          lsbr~ tying lastbr EXACT <x> (9) to ender CLOSE2 'c' (11) offset 2
-                |    |            tail~ EXACT <x> (9) -> CLOSE
+<)(?&b)>        |  12|            tail~ OPEN2 'c' (8) -> EXACT
+                |  14|          lsbr~ tying lastbr EXACT <x> (10) to ender CLOSE2 'c' (12) offset 2
+                |    |            tail~ EXACT <x> (10) -> CLOSE
 <(?&b)>         |    |      tail~ OPEN1 'b' (1)  
-                |    |          ~ REFN0 (3)  
-                |    |          ~ CLOSE1 'b' (5) -> OPEN
+                |    |          ~ REFN <1> (3)
+                |    |          ~ CLOSE1 'b' (6) -> OPEN
                 |    |      piec   
                 |    |        atom   
 <?&b)>          |    |          reg    
-<>              |  16|      tail~ OPEN2 'c' (7)  
-                |    |          ~ EXACT <x> (9)  
-                |    |          ~ CLOSE2 'c' (11) -> GOSUB
-                |  17|  lsbr~ tying lastbr OPEN1 'b' (1) to ender END (16) offset 15
+<>              |  17|      tail~ OPEN2 'c' (8)
+                |    |          ~ EXACT <x> (10)
+                |    |          ~ CLOSE2 'c' (12) -> GOSUB
+                |  18|  lsbr~ tying lastbr OPEN1 'b' (1) to ender END (17) offset 16
                 |    |    tail~ OPEN1 'b' (1)  
-                |    |        ~ REFN0 (3)  
-                |    |        ~ CLOSE1 'b' (5)  
-                |    |        ~ OPEN2 'c' (7)  
-                |    |        ~ EXACT <x> (9)  
-                |    |        ~ CLOSE2 'c' (11)  
-                |    |        ~ GOSUB1[+0:13] 'b' (13) -> END
+                |    |        ~ REFN <1> (3)
+                |    |        ~ CLOSE1 'b' (6)
+                |    |        ~ OPEN2 'c' (8)
+                |    |        ~ EXACT <x> (10)
+                |    |        ~ CLOSE2 'c' (12)
+                |    |        ~ GOSUB1[+0:14] 'b' (14) -> END
 Need to redo parse
 Freeing REx: "(?<b>\g{c})(?<c>x)(?&b)"
 Starting parse and generation
@@ -2652,40 +2658,41 @@ Starting parse and generation
 <\g{c})(?<c>>...|   3|            brnc   
                 |    |              piec   
                 |    |                atom   
-<)(?<c>x)(?&b)> |   5|            tail~ OPEN1 'b' (1) -> REFN
-                |   7|          lsbr~ tying lastbr REFN12 'c' (3) to ender CLOSE1 'b' (5) offset 2
-                |    |            tail~ REFN12 'c' (3) -> CLOSE
+<)(?<c>x)(?&b)> |   6|            tail~ OPEN1 'b' (1) -> REFN
+                |   8|          lsbr~ tying lastbr REFN2 'c' <1> (3) to ender CLOSE1 'b' (6) offset 3
+                |    |            tail~ REFN2 'c' <1> (3) -> CLOSE
 <(?<c>x)(?&b)>  |    |      piec   
                 |    |        atom   
 <?<c>x)(?&b)>   |    |          reg    
-<x)(?&b)>       |   9|            brnc   
+<x)(?&b)>       |  10|            brnc
                 |    |              piec   
                 |    |                atom   
-<)(?&b)>        |  11|            tail~ OPEN2 'c' (7) -> EXACT
-                |  13|          lsbr~ tying lastbr EXACT <x> (9) to ender CLOSE2 'c' (11) offset 2
-                |    |            tail~ EXACT <x> (9) -> CLOSE
+<)(?&b)>        |  12|            tail~ OPEN2 'c' (8) -> EXACT
+                |  14|          lsbr~ tying lastbr EXACT <x> (10) to ender CLOSE2 'c' (12) offset 2
+                |    |            tail~ EXACT <x> (10) -> CLOSE
 <(?&b)>         |    |      tail~ OPEN1 'b' (1)  
-                |    |          ~ REFN12 'c' (3)  
-                |    |          ~ CLOSE1 'b' (5) -> OPEN
+                |    |          ~ REFN2 'c' <1> (3)
+                |    |          ~ CLOSE1 'b' (6) -> OPEN
                 |    |      piec   
                 |    |        atom   
 <?&b)>          |    |          reg    
-<>              |  16|      tail~ OPEN2 'c' (7)  
-                |    |          ~ EXACT <x> (9)  
-                |    |          ~ CLOSE2 'c' (11) -> GOSUB
-                |  17|  lsbr~ tying lastbr OPEN1 'b' (1) to ender END (16) offset 15
+<>              |  17|      tail~ OPEN2 'c' (8)
+                |    |          ~ EXACT <x> (10)
+                |    |          ~ CLOSE2 'c' (12) -> GOSUB
+                |  18|  lsbr~ tying lastbr OPEN1 'b' (1) to ender END (17) offset 16
                 |    |    tail~ OPEN1 'b' (1)  
-                |    |        ~ REFN12 'c' (3)  
-                |    |        ~ CLOSE1 'b' (5)  
-                |    |        ~ OPEN2 'c' (7)  
-                |    |        ~ EXACT <x> (9)  
-                |    |        ~ CLOSE2 'c' (11)  
-                |    |        ~ GOSUB1[+0:13] 'b' (13) -> END
-Required size 16 nodes
+                |    |        ~ REFN2 'c' <1> (3)
+                |    |        ~ CLOSE1 'b' (6)
+                |    |        ~ OPEN2 'c' (8)
+                |    |        ~ EXACT <x> (10)
+                |    |        ~ CLOSE2 'c' (12)
+                |    |        ~ GOSUB1[+0:14] 'b' (14) -> END
+Required size 17 nodes
 first at 3
 Freeing REx: "(?<b>\g{c})(?<c>x)(?&b)"
 EOF_DEBUG_OUT
-                      {}, "Related to Github Issue #19350, forward \\g{x} pattern segv under use re Debug => 'PARSE'");
+                      {rtrim_result=>1},
+                      "Related to Github Issue #19350, forward \\g{x} pattern segv under use re Debug => 'PARSE'");
     }
 
     {   # perl-security#140, read/write past buffer end
@@ -2696,6 +2703,12 @@ EOF_DEBUG_OUT
                         {}, "perl-security#140");
     }
 
+    {   # GH 20009
+        my $x = "awesome quotes";
+        utf8::upgrade($x);
+        $x =~ s/^[\x{0301}\x{030C}]+//;
+    }
+
 
     # !!! NOTE that tests that aren't at all likely to crash perl should go
     # a ways above, above these last ones.  There's a comment there that, like
index b626f8e..a735175 100755 (executable)
@@ -24,7 +24,8 @@ BEGIN {
 
 our @global;
 
-plan tests => 508;  # Update this when adding/deleting tests.
+
+plan tests => 527;  # Update this when adding/deleting tests.
 
 run_tests() unless caller;
 
@@ -126,7 +127,66 @@ sub run_tests {
                "Postponed UTF-8 string in non-UTF-8 re doesn't match non-UTF-8";
         }
     }
+    {
+        our $this_counter;
+        ok( "ABDE" =~ /(A(A|B(*ACCEPT)|C)+D)(E)(?{ $this_counter++ })/,
+            "ACCEPT/CURLYX/EVAL - pattern should match");
+        is( "$1-$2", "AB-B",
+            "Make sure that ACCEPT works in CURLYX by using EVAL");
+    }
+    {
+        ok( "AB"=~/(A)(?(*{ 1 })B|C)/, "(?(*{ ... })yes|no) works as expected");
+        ok( "AC"=~/(A)(?(*{ 0 })B|C)/, "(?(*{ ... })yes|no) works as expected");
+    }
 
+    {
+        # Test if $^N and $+ work in (*{ }) (optimistic eval)
+        our @ctl_n = ();
+        our @plus = ();
+        my $nested_tags = qr{
+          (?<nested_tags>
+            <
+                ((\w)+)
+                (*{
+                       push @ctl_n, (defined $^N ? $^N : "undef");
+                       push @plus, (defined $+ ? $+ : "undef");
+                })
+            >
+            (?&nested_tags)*
+            </\s* \w+ \s*>
+          )
+        }x;
+
+        # note the results of this may change from perl to perl as different optimisations
+        # are added or enabled. It is testing that things *work*, not that they produce
+        # a specific output. The whole idea of optimistic eval is to have an eval that
+        # does not disable optimizations in the way a normal eval does.
+        my $c = 0;
+        for my $test (
+            # Test structure:
+            #  [ Expected result, Regex, Expected value(s) of $^N, Expected value(s) of $+, "note" ]
+            [ 1, qr#^$nested_tags$#, "bla blubb <bla><blubb></blubb></bla>", "a b a" ],
+            [ 1, qr#^($nested_tags)$#, "bla blubb <bla><blubb></blubb></bla>", "a b a" ],
+            [ 1, qr#^(|)$nested_tags$#, "bla blubb <bla><blubb></blubb></bla>", "a b a" ],
+            [ 1, qr#^(?:|)$nested_tags$#, "bla blubb <bla><blubb></blubb></bla>", "a b a" ],
+            [ 1, qr#^<(bl|bla)>$nested_tags<(/\1)>$#, "blubb /bla", "b /bla" ],
+        ) { #"#silence vim highlighting
+            $c++;
+            @ctl_n = ();
+            @plus = ();
+            my $match = (("<bla><blubb></blubb></bla>" =~ $test->[1]) ? 1 : 0);
+            push @ctl_n, (defined $^N ? $^N : "undef");
+            push @plus, (defined $+ ? $+ : "undef");
+            ok($test->[0] == $match, "(*{ ... }) match $c");
+            if ($test->[0] != $match) {
+              # unset @ctl_n and @plus
+              @ctl_n = @plus = ();
+            }
+            my $note = $test->[4] ? " - $test->[4]" : "";
+            is("@ctl_n", $test->[2], "(*{ ... }) ctl_n $c$note");
+            is("@plus", $test->[3], "(*{ ... }) plus $c$note");
+        }
+    }
 
     {
         # Test if $^N and $+ work in (?{})
@@ -162,7 +222,9 @@ sub run_tests {
             [ 1, qr#^((??{"(?:bla|)"}))((??{$nested_tags}))$#, "bla blubb <bla><blubb></blubb></bla>", "a b <bla><blubb></blubb></bla>" ],
             [ 1, qr#^((??{"(?!)?"}))((??{$nested_tags}))$#, "bla blubb <bla><blubb></blubb></bla>", "a b <bla><blubb></blubb></bla>" ],
             [ 1, qr#^((??{"(?:|<(/?bla)>)"}))((??{$nested_tags}))\1$#, "bla blubb <bla><blubb></blubb></bla>", "a b <bla><blubb></blubb></bla>" ],
-            [ 0, qr#^((??{"(?!)"}))?((??{$nested_tags}))(?!)$#, "bla blubb undef", "a b undef" ],
+            [ 0, qr#^((??{"(?!)"}))?((??{$nested_tags}))(?!)$#, # changed in perl 5.37.7
+                 "bla blubb blub blu bl b bl b undef",
+                 "a b b u l b l b undef" ],
 
         ) { #"#silence vim highlighting
             $c++;
index ced4fe6..1802fcc 100755 (executable)
@@ -20,7 +20,7 @@ use warnings;
 use 5.010;
 use Config;
 
-plan tests => 2510;  # Update this when adding/deleting tests.
+plan tests => 2514;  # Update this when adding/deleting tests.
 
 run_tests() unless caller;
 
@@ -747,15 +747,25 @@ sub run_tests {
     }
 
     {
-        my $message = 'Match is linear, not quadratic; Bug 22395';
+        my $message = 'Match is quadratic due to eval; See Bug 22395';
         our $count;
         for my $l (10, 100, 1000) {
             $count = 0;
-            ('a' x $l) =~ /(.*)(?{$count++})[bc]/;
-            local $::TODO = "Should be L+1 not L*(L+3)/2 (L=$l)";
-            is($count, $l + 1, $message);
+            ('a' x $l) =~ /(.*)(?{ $count++ })[bc]/;
+            is($count, $l*($l+3)/2+1, $message);
         }
     }
+    {
+        my $message = 'Match is linear, not quadratic; Bug 22395.';
+        our $count;
+        my $ok= 0;
+        for my $l (10, 100, 1000) {
+            $count = 0;
+            ('a' x $l) =~ /(.*)(*{ $count++ })[bc]/;
+            $ok += is($count, $l + 1, $message);
+        }
+        is($ok,3, "Optimistic eval does not disable optimisations");
+    }
 
     {
         my $message = '@-/@+ should not have undefined values; Bug 22614';
@@ -1076,10 +1086,11 @@ SKIP: {
        unless $Config{extensions} =~ / Encode /;
 
     # Test case cut down by jhi
-    fresh_perl_like(<<'EOP', qr!Malformed UTF-8 character \(unexpected end of string\) in substitution \(s///\) at!, {}, 'Segfault using HTML::Entities');
+    fresh_perl_like(<<'EOP', qr!Malformed UTF-8 character \(unexpected end of string\)!, {}, 'Segfault using HTML::Entities');
 use Encode;
 my $t = ord('A') == 193 ? "\xEA" : "\xE9";
 Encode::_utf8_on($t);
+substr($t,0);
 $t =~ s/([^a])//ge;
 EOP
     }
index 857d88e..b483474 100644 (file)
@@ -30,11 +30,11 @@ sub s1 {
     my $refcnt_start = Internals::SvREFCNT($$re_weak_copy);
 
     undef $re;
-    is(Internals::SvREFCNT($$re_weak_copy), $refcnt_start - 1, "refcnt decreased");
+    refcount_is $re_weak_copy, $refcnt_start - 1, "refcnt decreased";
     is("$re_weak_copy", $str_re, "weak copy still equals original");
 
     undef $re_copy2;
-    is(Internals::SvREFCNT($$re_weak_copy), $refcnt_start - 1, "refcnt not decreased");
+    refcount_is $re_weak_copy, $refcnt_start - 1, "refcnt not decreased";
     is("$re_weak_copy", $str_re, "weak copy still equals original");
 }
 s1();
index 3a29d54..10da625 100644 (file)
@@ -478,7 +478,7 @@ a(?:b|c|d)+(.)      acdbcdbe        y       $1      e
 a(?:b|c|d){2}(.)       acdbcdbe        y       $1      b
 a(?:b|c|d){4,5}(.)     acdbcdbe        y       $1      b
 a(?:b|c|d){4,5}?(.)    acdbcdbe        y       $1      d
-((foo)|(bar))* foobar  y       $1-$2-$3        bar-foo-bar
+((foo)|(bar))* foobar  y       $1-$2-$3        bar--bar                # was bar-foo-bar prior to 5.37.10
 :(?:   -       c       -       Sequence (? incomplete
 a(?:b|c|d){6,7}(.)     acdbcdbe        y       $1      e
 a(?:b|c|d){6,7}?(.)    acdbcdbe        y       $1      e
@@ -496,10 +496,12 @@ a(?:b|(c|e){1,2}?|d)+?(.) ace     y       $1$2    ce
 ^(a(?(1)\1)){4}$       aaaaaaaaaa      y       $1      aaaa
 ^(a(?(1)\1)){4}$       aaaaaaaaa       n       -       -
 ^(a(?(1)\1)){4}$       aaaaaaaaaaa     n       -       -
+((?(1)a|b))+   baaa    y       $&      baaa            # GH 7754
+((?(1)aa|b))+  baaaa   y       $&      baaaa           # GH 7754
 ((a{4})+)      aaaaaaaaa       y       $1      aaaaaaaa
 (((aa){2})+)   aaaaaaaaaa      y       $1      aaaaaaaa
 (((a{2}){2})+) aaaaaaaaaa      y       $1      aaaaaaaa
-(?:(f)(o)(o)|(b)(a)(r))*       foobar  y       $1:$2:$3:$4:$5:$6       f:o:o:b:a:r
+(?:(f)(o)(o)|(b)(a)(r))*       foobar  y       $1:$2:$3:$4:$5:$6       :::b:a:r
 (?<=a)b        ab      y       $&      b
 (?<=af?)b      ab      y       $&      b
 (?<=a)b        cb      n       -       -
@@ -962,8 +964,8 @@ tt+$        xxxtt   y       -       -
 (?i)           y       -       -
 (?a:((?u)\w)\W)        \xC0\xC0        y       $&      \xC0\xC0
 '(?!\A)x'm     a\nxb\n y       -       -
-^(a(b)?)+$     aba     y       -$1-$2- -a--
-^(aa(bb)?)+$   aabbaa  y       -$1-$2- -aa--
+^(a(b)?)+$     aba     y       -$1-$2- -a--            
+^(aa(bb)?)+$   aabbaa  y       -$1-$2- -aa--           
 '^.{9}abc.*\n'm        123\nabcabcabcabc\n     y       -       -
 ^(a)?a$        a       y       -$1-    --
 ^(a)?(?(1)a|b)+$       a       n       -       -
@@ -1949,7 +1951,7 @@ A+(*PRUNE)BC(?{}) AAABC   y       $&      AAABC
 /^(.\2?)(.)(?1)$/      abcb    y       $2      b
 /^(.\1?)(?1)$/ aba     y       $1      a
 /^ (\3(?2)\3)? ((.)) (?1) $/x  aaba    y       $2      a
-/^ (a|\3(?1)\2|(?2)) ((b|c)(?4)?) (?1) (d(?1)) $/x     abbcdcabbda     y       $2      b
+/^ (a|\3(?1)\2|(?2)) ((b|c)(?4)?) (?1) (d(?1)) $/x     abbcdcabbda     y       $1-$2-$3-$4     a-b-b-da
 
 # RT #121321 - perl 5.19.10 infinite loops on backrefs > number of capture buffers (npar) where npar>9
 /(a)\2/        a\2     c       -       Reference to nonexistent group in regex
@@ -2043,9 +2045,9 @@ AB\s+\x{100}      AB \x{100}X     y       -       -
 /(?:0)|(?:)(?:[1-9])/  q0      y       $&      0       # [https://github.com/Perl/perl5/issues/17372]
 /\x{_1_0000}/  \x{10000}       y       $&      \x{10000}               # khw doesn't like leading underscores, but don't rmv them accidentally
 /\o{_1_0000}/  \o{10000}       y       $&      \o{10000}
-/(?iaax:A? \K +)/      African_Feh     c       -       \\K + is forbidden - matches null string many times in regex
-/(?iaa:A?\K+)/ African_Feh     c       -       \\K+ is forbidden - matches null string many times in regex
-/(?iaa:A?\K*)/ African_Feh     c       -       \\K* is forbidden - matches null string many times in regex
+/(?iaax:A? \K +)/      African_Feh     y       $&      
+/(?iaa:A?\K+)/ African_Feh     y       $&      
+/(?iaa:A?\K*)/ African_Feh     y       $&      
 ^((\w|<(\s)*(?1)(?3)*>)(?:(?3)*\+(?3)*(?2))*)(?3)*\+   a + b + <c + d> y       $1      a + b           # [GH #18096]
 ^((\w|<(\s)*(?1)(?3)*>)(?:(?3)*\+(?3)*(?2))*)(?3)*\+   a + <b> + c     y       $1      a + <b>         # [GH #18096]
 /0?\xdf\xdf\xdf\xdfs\o{500}|/i \o{600} y       $&                              # [GH #18451]
@@ -2109,6 +2111,51 @@ AB\s+\x{100}     AB \x{100}X     y       -       -
 / (A (*ACCEPT) | BC){2} D{0,4}/x       A       y       $1      A       -       # ACCEPT optimizer check
 
 \p{nv=-0}      \x{660} y       $&      \x{660}
+(?:a|xx){0,4}?b        aaaaab  y       $&      aaaab           # Bug is GH #8369; test is GH #19781
+(?|(?<a>a)|(?<b>b))\1(?&a)(?&b)        bbab    y       $&      bbab            # GH 20653
+(?|(?<a>a)|(?<b>b))(?(<a>)x|y)\1       byb     y       $&      byb             # GH 20653
+(?|(?<a>a)|(?<b>b))(?(<a>)x|y)\1       bxb     n       -       -               # GH 20653
+(?|(?<a>a)|(?<b>b))(?(<a>)x|y)\1       axa     y       $&      axa             # GH 20653
+(?|(?<a>a)|(?<b>b))(?(<a>)x|y)\1       aya     n       -       -               # GH 20653
+(?|(?<a>a)|(?<b>b))    a       y       $1-$+{a}-$+{b}  a-a-            # GH 20653
+(?|(?<a>a)|(?<b>b))    b       y       $1-$+{a}-$+{b}  b--b            # GH 20653
+(?<pre>pre)(?|(?<a>a)(?<b>b)(?<c>c)|(?<d>d)(?<e>e)|(?<f>f))(?<post>post)       preabcpost      y       $2-$3-$4        a-b-c           # GH 20653
+(?<pre>pre)(?|(?<a>a)(?<b>b)(?<c>c)|(?<d>d)(?<e>e)|(?<f>f))(?<post>post)       predepost       y       $2-$3-$4        d-e-            # GH 20653
+(?<pre>pre)(?|(?<a>a)(?<b>b)(?<c>c)|(?<d>d)(?<e>e)|(?<f>f))(?<post>post)       prefpost        y       $2-$3-$4        f--             # GH 20653
+(?<pre>pre)(?|(?<a>a)(?<b>b)(?<c>c)|(?<d>d)(?<e>e)|(?<f>f))(?<post>post)       preabcpost      y       $+{a}-$+{b}-$+{c}       a-b-c           # GH 20653
+((?|(?<a>a)(?-1)|(?<b>b)(?-1)|(?<c>c)(?-1)))   aa      y       $1      aa              # GH 20653
+((?|(?<a>a)(?-1)|(?<b>b)(?-1)|(?<c>c)(?-1)))   bb      y       $1      bb              # GH 20653
+((?|(?<a>a)(?-1)|(?<b>b)(?-1)|(?<c>c)(?-1)))   cc      y       $1      cc              # GH 20653
+
+(?|(a)|(b))    b       y       $+      b               # GH 20912
+(?|(a)(?{$::plus_got=$+})|(b)(?{$::plus_got=$+}))      b       y       $::plus_got     b               # GH 20912
+(?|(a)|(b))    b       y       $^N     b               # GH 20912
+(?|(a)(?{$::caret_n_got=$^N})|(b)(?{$::caret_n_got=$^N}))      b       y       $::caret_n_got  b               # GH 20912
+(?|(a)|(b))    a       y       $+      a               # GH 20912
+(?|(a)(?{$::plus_got=$+})|(b)(?{$::plus_got=$+}))      a       y       $::plus_got     a               # GH 20912
+(?|(a)|(b))    a       y       $^N     a               # GH 20912
+(?|(a)(?{$::caret_n_got=$^N})|(b)(?{$::caret_n_got=$^N}))      a       y       $::caret_n_got  a               # GH 20912
+
+/(([ab]+)|([cd]+)|([ef]+))+/   ace     y       $1-$2-$3-$4=$&  e---e=ace
+/(([ab]+)|([cd]+)|([ef]+))+/   aceb    Ty      $1-$2-$3-$4=$&  b-b--=aceb
+/(([ab]+)|([cd]+)|([ef]+))+/   acebd   Ty      $1-$2-$3-$4=$&  d--d-=acebd
+/(([ab]+)|([cd]+)|([ef]+))+/   acebdf  y       $1-$2-$3-$4=$&  f---f=acebdf
+/((a)(b)(c)|(a)(b)|(a))+/      abcaba  y       $1+$2-$3-$4+$5-$6+$7=$& a+--+-+a=abcaba
+
+/^(xa|=?\1a){2}$/      xa=xaaa n       -       -       # GH 10073 - RT72020
+/^(xa|(?:=|zzzz|)\1a){2}$/     xa=xaaa n       -       -       # GH 10073 - RT72020
+/^(xa|(?:=|zzzz)?\1a){2}$/     xa=xaaa n       -       -       # GH 10073 - RT72020
+/^(xa|[Z=]?\1a){2}$/   xa=xaaa n       -       -       # GH 10073 - RT72020
+/^(xa|([Z=])?\1a){2}$/ xa=xaaa n       -       -       # GH 10073 - RT72020
+/^(xa|([Z=]|zzzz)?\1a){2}$/    xa=xaaa n       -       -       # GH 10073 - RT72020
+/^(xa|(=|)\1a){2}$/    xa=xaaa n       -       -       # GH 10073 - RT72020
+/^(xa|(?:[Z=])?\1a){2}$/       xa=xaaa n       -       -       # GH 10073 - RT72020
+/^(xa|(?:[Z=]|zzzz)?\1a){2}$/  xa=xaaa n       -       -       # GH 10073 - RT72020
+/^(xa|(?:=|)\1a){2}$/  xa=xaaa n       -       -       # GH 10073 - RT72020
+/^(xa|=*\1a){2}$/      xa=xaaa n       -       -       # GH 10073 - RT72020
+/^(xa|[Z=]*\1a){2}$/   xa=xaaa n       -       -       # GH 10073 - RT72020
+/^(xa|(?:[Z=])*\1a){2}$/       xa=xaaa n       -       -       # GH 10073 - RT72020
+/^(xa|(?:[Z=]|zzzz)*\1a){2}$/  xa=xaaa n       -       -       # GH 10073 - RT72020
 
 # Keep these lines at the end of the file
 # pat  string  y/n/etc expr    expected-expr   skip-reason     comment
index 9a26bdb..dc7ec38 100755 (executable)
@@ -108,7 +108,7 @@ sub mark_as_utf8 {
     return @ret;
 }
 
-my $inf_m1 = ($Config::Config{reg_infty} || 65535) - 1;
+my $inf_m1 = ($Config::Config{reg_infty} || ((1<<31)-1)) - 1;
 my $inf_p1 = $inf_m1 + 2;
 
 my $B_hex = sprintf("\\x%02X", ord "B");
index 6980026..ca30560 100644 (file)
@@ -103,6 +103,7 @@ like("a", qr/(?[ (?#comment) [a]])/, "Can have (?#comments)");
 if (! is_miniperl() && locales_enabled('LC_CTYPE')) {
     my $utf8_locale = find_utf8_ctype_locale;
     SKIP: {
+        skip("No LC_ALL on this platform", 8) unless locales_enabled('LC_ALL');
         skip("No utf8 locale available on this platform", 8) unless $utf8_locale;
 
         setlocale(&POSIX::LC_ALL, "C");
index 03a7178..7315191 100755 (executable)
@@ -144,7 +144,7 @@ $nulnul = "\0" x 2;
 my $OP = $qr ? 'qr' : 'm';
 
 $| = 1;
-
+$::normalize_pat = $::normalize_pat; # silence warning
 TEST:
 foreach (@tests) {
     $test_num++;
@@ -181,11 +181,28 @@ foreach (@tests) {
 
     convert_from_ascii(\$expect);
     $expect  = eval qq("$expect"); die $@ if $@;
-    $expect = $repl = '-' if $skip_amp and $input =~ /\$[&\`\']/;
+    my $has_amp = $input =~ /\$[&\`\']/;
+    $expect = $repl = '-' if $skip_amp and $has_amp;
 
     my $todo_qr = $qr_embed_thr && ($result =~ s/t//);
     my $skip = ($skip_amp ? ($result =~ s/B//i) : ($result =~ s/B//));
     ++$skip if $result =~ s/M// && !defined &DynaLoader::boot_DynaLoader;
+    
+    if ($::normalize_pat) {
+        my $opat= $pat;
+        # Convert (x)? to (?:(x)|) and (x)+ to (?:(x))+ and (x)* to (?:(x))*
+        $pat =~ s/\(([\w|.]+)\)\?(?![+*?])/(?:($1)|)/g;
+        $pat =~ s/\(([\w|.]+)\)([+*])(?![+*?])/(?:($1))$2/g;
+        if ($opat eq $pat) {
+            # we didn't change anything, no point in testing it again.
+            $skip++;
+            $reason = "Test not valid for $0";
+        } elsif ($comment=~/!\s*normal/) {
+            $result .= "T";
+            $comment = "# Known to be broken under $0";
+        }
+    }
+
     if ($result =~ s/ ( [Ss] ) //x) {
         if (($1 eq 'S' && $regex_sets) || ($1 eq 's' && ! $regex_sets)) {
             $skip++;
@@ -202,7 +219,7 @@ foreach (@tests) {
     }
     $reason = 'skipping $&' if $reason eq  '' && $skip_amp;
     $result =~ s/B//i unless $skip;
-    my $todo= $result =~ s/T// ? " # TODO" : "";
+    my $todo= ($result =~ s/T// && (!$skip_amp || !$has_amp)) ? " # TODO" : "";
     my $testname= $test_num;
     if ($comment) {
         $comment=~s/^\s*(?:#\s*)?//;
@@ -421,9 +438,28 @@ foreach (@tests) {
             $pat = $modified;
         }
     }
+    if ($::normalize_pat){
+        if (!$skip && ($result eq "y" or $result eq "n")) {
+            my $opat= $pat;
+            # Convert (x)? to (?:(x)|) and (x)+ to (?:(x))+ and (x)* to (?:(x))*
+            $pat =~ s/\(([\w|.]+)\)\?(?![+*?])/(?:($1)|)/g;
+            $pat =~ s/\(([\w|.]+)\)([+*])(?![+*?])/(?:($1))$2/g;
+            # inject an EVAL into the front of the pattern.
+            # this should disable all optimizations.
+            $pat =~ s/\A(.)/$1(?{ \$the_counter++ })/
+                or die $pat;
+        } elsif (!$skip) {
+            $skip = $reason = "Test not applicable to $0";
+        }
+    }
 
     for my $study ('', 'study $subject;', 'utf8::upgrade($subject);',
                   'utf8::upgrade($subject); study $subject;') {
+        if ( $skip ) {
+            print "ok $testname # skipped", length($reason) ? ".  $reason" : '', "\n";
+            next TEST;
+        }
+        our $the_counter = 0; # used in normalization tests
        # Need to make a copy, else the utf8::upgrade of an already studied
        # scalar confuses things.
        my $subject = $subject;
@@ -486,11 +522,7 @@ EOFCODE
            eval $code;
        }
        chomp( my $err = $@ );
-       if ( $skip ) {
-           print "ok $testname # skipped", length($reason) ? ".  $reason" : '', "\n";
-           next TEST;
-       }
-       elsif ($result eq 'c') {
+       if ($result eq 'c') {
            if ($err !~ m!^\Q$expect!) { print "not ok $testname$todo (compile) $input => '$err'\n"; next TEST }
            last;  # no need to study a syntax error
        }
index 7658750..bc03fd3 100644 (file)
@@ -42,9 +42,7 @@ run_tests() unless caller;
 sub run_tests {
 
 
-    watchdog(($ENV{PERL_TEST_TIME_OUT_FACTOR} || 1)
-             * (($::running_as_thread && $::running_as_thread)
-                ? 150 : 540));
+    watchdog((($::running_as_thread && $::running_as_thread) ? 150 : 225));
 
     {
         # [perl #120446]
index 2ce0804..4ab0c22 100755 (executable)
@@ -11,7 +11,7 @@ BEGIN {
     require './loc_tools.pl';
 }
 
-plan(tests => 278);
+plan(tests => 281);
 
 $_ = 'david';
 $a = s/david/rules/r;
@@ -87,9 +87,9 @@ $b = $m =~ s/xxx/yyy/r;
 ok( ! defined tied($b), 's///r magic isn\'t contagious' );
 
 my $ref = \("aaa" =~ s/aaa/bbb/r);
-is (Internals::SvREFCNT($$ref), 1, 's///r does not leak');
+refcount_is $ref, 1, 's///r does not leak';
 $ref = \("aaa" =~ s/aaa/bbb/rg);
-is (Internals::SvREFCNT($$ref), 1, 's///rg does not leak');
+refcount_is $ref, 1, 's///rg does not leak';
 
 $x = 'foo';
 $_ = "x";
@@ -1010,7 +1010,7 @@ eval { for (__PACKAGE__) { s/b/c/; } };
 like $@, qr/^Modification of a read-only value/,
     'read-only COW =~ s/does not match// should croak';
 
-SKIP: {
+{
     my $a_acute = chr utf8::unicode_to_native(0xE1); # LATIN SMALL LETTER A WITH ACUTE
     my $egrave = chr utf8::unicode_to_native(0xE8);  # LATIN SMALL LETTER E WITH GRAVE
     my $u_umlaut = chr utf8::unicode_to_native(0xFC);  # LATIN SMALL LETTER U WITH DIAERESIS
@@ -1059,21 +1059,21 @@ SKIP: {
         '[perl #126319: Segmentation fault in Perl_sv_catpvn_flags with \b{sb}'
     );
 
-SKIP: {
-    if (! locales_enabled('LC_ALL')) {
-        skip "Can't test locale (maybe you are missing POSIX)", 6;
-    }
+    SKIP: {
+        if (! locales_enabled('LC_ALL')) {
+            skip "Can't test locale (maybe you are missing POSIX)", 6;
+        }
 
-    setlocale(&POSIX::LC_ALL, "C");
-    use locale;
-    is("a.b" =~ s/\b/!/gr, "!a!.!b!", '\\b matches ASCII before string, mid, and end, /l');
-    is("$a_acute.$egrave" =~ s/\b/!/gr, "$a_acute.$egrave", '\\b matches Latin1 before string, mid, and end, /l');
-    is("\x{100}\x{101}.\x{102}" =~ s/\b/!/gr, "!\x{100}\x{101}!.!\x{102}!", '\\b matches above-Latin1 before string, mid, and end, /l');
+        setlocale(&POSIX::LC_ALL, "C");
+        use locale;
+        is("a.b" =~ s/\b/!/gr, "!a!.!b!", '\\b matches ASCII before string, mid, and end, /l');
+        is("$a_acute.$egrave" =~ s/\b/!/gr, "$a_acute.$egrave", '\\b matches Latin1 before string, mid, and end, /l');
+        is("\x{100}\x{101}.\x{102}" =~ s/\b/!/gr, "!\x{100}\x{101}!.!\x{102}!", '\\b matches above-Latin1 before string, mid, and end, /l');
 
-    is("..." =~ s/\B/!/gr, "!.!.!.!", '\\B matches ASCII before string, mid, and end, /l');
-    is("$division$division$division" =~ s/\B/!/gr, "!$division!$division!$division!", '\\B matches Latin1 before string, mid, and end, /l');
-    is("\x{2028}\x{2028}\x{2028}" =~ s/\B/!/gr, "!\x{2028}!\x{2028}!\x{2028}!", '\\B matches above-Latin1 before string, mid, and end, /l');
-}
+        is("..." =~ s/\B/!/gr, "!.!.!.!", '\\B matches ASCII before string, mid, and end, /l');
+        is("$division$division$division" =~ s/\B/!/gr, "!$division!$division!$division!", '\\B matches Latin1 before string, mid, and end, /l');
+        is("\x{2028}\x{2028}\x{2028}" =~ s/\B/!/gr, "!\x{2028}!\x{2028}!\x{2028}!", '\\B matches above-Latin1 before string, mid, and end, /l');
+    }
 
 }
 
@@ -1183,3 +1183,20 @@ __EOF__
 {
     fresh_perl_is("s//00000000000format            \0          '0000000\\x{800}/;eval", "", {}, "RT #133882");
 }
+
+{   # GH Issue 20690
+    my @ret;
+    my $str = "abc";
+    for my $upgrade (0,1) {
+        my $copy = $str;
+        utf8::upgrade($copy) if $upgrade;
+        my $r= $copy=~s/b{0}//gr;
+        push @ret, $r;
+    }
+    is( $ret[1], $ret[0], 
+        "Issue #20690 - s/b{0}//gr should work the same for utf8 and non-utf8 strings");
+    is( $ret[0], $str,
+        "Issue #20690 - s/b{0}//gr on non-utf8 string should not remove anything");
+    is( $ret[1], $str,
+        "Issue #20690 - s/b{0}//gr on utf8 string should not remove anything");
+}
index 88a64ad..e317b8a 100644 (file)
@@ -619,19 +619,6 @@ EXPECT
 -w
 "x" =~ /(\G?x)?/;
 ########
-# Bug 20010515.004 (#6998)
-my @h = 1 .. 10;
-bad(@h);
-sub bad {
-   undef @h;
-   warn "O\n";
-   print for @_;
-   warn "K\n";
-}
-EXPECT
-O
-Use of freed value in iteration at - line 7.
-########
 # Bug 20010506.041 (#6952)
 "abcd\x{1234}" =~ /(a)(b[c])(d+)?/i and print "ok\n";
 EXPECT
@@ -817,8 +804,6 @@ meow {
 };
 EXPECT
 syntax error at - line 12, near "used"
-syntax error at - line 12, near "used}"
-Unmatched right curly bracket at - line 14, at end of line
 Execution of - aborted due to compilation errors.
 ######## [perl #112312] crash on syntax error - another test
 # SKIP: !defined &DynaLoader::boot_DynaLoader # miniperl
@@ -849,6 +834,4 @@ sub testo {
 
 EXPECT
 syntax error at - line 15, near "used"
-syntax error at - line 15, near "used}"
-Unmatched right curly bracket at - line 17, at end of line
 Execution of - aborted due to compilation errors.
index 202f355..0033435 100644 (file)
@@ -21,7 +21,15 @@ BEGIN {
     }
 }
 use Config;
+
+if ($^O eq "aix" && ($Config{osvers} =~ /^(\d+)/)[0] < 7) {
+    # https://www.ibm.com/support/pages/apar/IV22174
+    skip_all("old AIX setlocale is broken in some cases");
+}
+
+use I18N::Langinfo qw(langinfo RADIXCHAR);
 my $have_strtod = $Config{d_strtod} eq 'define';
+my $have_localeconv = defined $Config{d_locconv} && $Config{d_locconv} eq 'define';
 my @locales = find_locales( [ 'LC_ALL', 'LC_CTYPE', 'LC_NUMERIC' ]);
 skip_all("no locales available") unless @locales;
 note("locales available: @locales");
@@ -34,8 +42,8 @@ if (defined $ARGV[0] && $ARGV[0] ne "") {
         exit 1
     }
     $debug = 1;
-    $switches = "switches => [ '-DLv' ]";
 }
+$switches = "switches => [ '-DLv' ]" if $debug;
 
 # reset the locale environment
 delete local @ENV{'LANGUAGE', 'LANG', (grep /^LC_[A-Z]+$/, keys %ENV)};
@@ -140,7 +148,7 @@ EOF
         } else {
             $different ||= $_;
             $difference ||= $s;
-            my $radix = localeconv()->{decimal_point};
+            my $radix = langinfo(RADIXCHAR);
 
             # For utf8 locales with a non-ascii radix, it should be encoded as
             # UTF-8 with the internal flag so set.
@@ -163,8 +171,8 @@ EOF
     SKIP: {
         skip("no UTF-8 locale available where LC_NUMERIC radix isn't ASCII", 1 )
             unless $utf8_radix;
-        ok($radix_encoded_as_utf8 == 1, "UTF-8 locale '$utf8_radix' with non-ASCII"
-                                        . " radix is marked UTF-8");
+        is($radix_encoded_as_utf8, 1, "UTF-8 locale '$utf8_radix' with non-ASCII"
+                                    . " radix is marked UTF-8");
     }
 
     SKIP: {
@@ -182,11 +190,11 @@ EOF
 EOF
                 "format() does not look at LC_NUMERIC without 'use locale'");
 
-    {
-    fresh_perl_is(<<'EOF', "$difference\n", { eval $switches },
-    use POSIX;
-    use locale;
-    format STDOUT =
+            {
+                fresh_perl_is(<<'EOF', "$difference\n", { eval $switches },
+                use POSIX;
+                use locale;
+                format STDOUT =
 @.#
 4.179
 .
@@ -195,8 +203,12 @@ EOF
                 "format() looks at LC_NUMERIC with 'use locale'");
             }
 
-            {
-                fresh_perl_is(<<'EOF', ",,", { eval $switches },
+      SKIP: {
+                unless ($have_localeconv) {
+                    skip("no localeconv()", 1);
+                }
+                else {
+                    fresh_perl_is(<<'EOF', ",,", { eval $switches },
     use POSIX;
     no warnings "utf8";
     print localeconv()->{decimal_point};
@@ -204,6 +216,7 @@ EOF
     print localeconv()->{decimal_point};
 EOF
                 "localeconv() looks at LC_NUMERIC with and without 'use locale'");
+                }
             }
 
             {
@@ -442,6 +455,31 @@ EOF
 EOF
                 "1,5\n2,5", { stderr => 'devnull' }, "Can do math when radix is a comma"); # [perl 115800]
 
+            SKIP: {
+                skip "Perl not compiled with 'useithreads'", 1 if ! $Config{'useithreads'};
+
+                local $ENV{LC_ALL} = undef;
+                local $ENV{LC_NUMERIC} = $comma;
+                fresh_perl_is(<<"EOF",
+                    use threads;
+
+                    my \$x = eval "1.25";
+                    print "\$x", "\n";  # number is ok before thread
+                    my \$str_x = "\$x";
+
+                    my \$thr = threads->create(sub {});
+                    \$thr->join();
+
+                    print "\$x\n";  # number stringifies the same after thread
+
+                    my \$y = eval "1.25";
+                    print "\$y\n";  # number is ok after threads
+                    print "\$y" eq "\$str_x" || 0;    # new number stringifies the same as old number
+EOF
+                "1.25\n1.25\n1.25\n1", { eval $switches }, "Thread join doesn't disrupt calling thread"
+                ); # [GH 20155]
+            }
+
           SKIP: {
             unless ($have_strtod) {
                 skip("no strtod()", 1);
@@ -514,7 +552,7 @@ SKIP:
 {
     use locale;
     # look for an english locale (so a < B, hopefully)
-    my ($en) = grep /^en_/, @locales;
+    my ($en) = grep { /^en_/ } find_locales( [ 'LC_COLLATE' ]);
     defined $en
         or skip "didn't find a suitable locale", 1;
     POSIX::setlocale(LC_COLLATE, $en);
@@ -537,4 +575,49 @@ else {
 EOF
 }
 
+SKIP: {   # GH #20085
+    my @utf8_locales = find_utf8_ctype_locales();
+    skip "didn't find a UTF-8 locale", 1 unless @utf8_locales;
+
+    local $ENV{LC_CTYPE} = $utf8_locales[0];
+    local $ENV{LC_ALL} = undef;
+    fresh_perl_is(<<~'EOF', "ok\n", {}, "check that setlocale overrides startup");
+        use POSIX;
+
+        my $a_acute = "\N{LATIN SMALL LETTER A WITH ACUTE}";
+        my $egrave  = "\N{LATIN SMALL LETTER E WITH GRAVE}";
+        my $combo = "$a_acute.$egrave";
+
+        setlocale(&POSIX::LC_ALL, "C");
+        use locale;
+
+        # In a UTF-8 locale, \b matches Latin1 before string, mid, and end
+        if ($combo eq ($combo =~ s/\b/!/gr)) {
+            print "ok\n";
+        }
+        else {
+            print "not ok\n";
+        }
+    EOF
+}
+
+SKIP: {   # GH #20054
+    skip "Even illegal locale names are accepted", 1
+                    if $Config{d_setlocale_accepts_any_locale_name}
+                    && $Config{d_setlocale_accepts_any_locale_name} eq 'define';
+       
+    my @lc_all_locales = find_locales('LC_ALL');
+    my $locale = $lc_all_locales[0];
+    skip "LC_ALL not enabled on this platform", 1 unless $locale;
+
+    local $ENV{LC_ALL} = "This is not a legal locale name";
+    local $ENV{LANG} = "Nor this neither";
+
+    my $fallback = ($^O eq "MSWin32")
+                    ? "system default"
+                    : "standard";
+    fresh_perl_like("", qr/Falling back to the $fallback locale/,
+                    {}, "check that illegal startup environment falls back");
+}
+
 done_testing();
index 9d93673..e59e556 100644 (file)
@@ -48,9 +48,14 @@ END {
     fresh_perl_like("print qq(hello)", qr/define raw/,
                     { stderr => 1, switches => [ '-Di' ] },
                    "-Di defaults to stderr");
-    fresh_perl_like("print qq(hello)", qr/define raw/,
+    SKIP: {
+        skip("Your perl was built without taint support", 1)
+            unless $Config{taint_support};
+
+        fresh_perl_like("print qq(hello)", qr/define raw/,
                     { stderr => 1, switches => [ '-TDi' ] },
                    "Perlio debug output to STDERR with -TDi (no PERLIO_DEBUG)");
+    }
 }
 {
     # -DXv tests
index d92b212..b467855 100644 (file)
@@ -246,7 +246,7 @@ sub _ok {
         $name =~ s/#/\\#/g;
        $out = $pass ? "ok $test - $name" : "not ok $test - $name";
     } else {
-       $out = $pass ? "ok $test" : "not ok $test";
+       $out = $pass ? "ok $test - [$where]" : "not ok $test - [$where]";
     }
 
     if ($TODO) {
@@ -274,8 +274,8 @@ sub _ok {
 }
 
 sub _where {
-    my @caller = caller($Level);
-    return "at $caller[1] line $caller[2]";
+    my (undef, $filename, $lineno) = caller($Level);
+    return "at $filename line $lineno";
 }
 
 # DON'T use this for matches. Use like() instead.
@@ -357,6 +357,16 @@ sub is ($$@) {
     unless ($pass) {
        unshift(@mess, "#      got "._qq($got)."\n",
                       "# expected "._qq($expected)."\n");
+        if (defined $got and defined $expected and
+            (length($got)>20 or length($expected)>20))
+        {
+            my $p = 0;
+            $p++ while substr($got,$p,1) eq substr($expected,$p,1);
+            push @mess,"#  diff at $p\n";
+            push @mess,"#    after "._qq(substr($got,$p-40<0 ? 0 : $p-40,40))."\n";
+            push @mess,"#     have "._qq(substr($got,$p,40))."\n";
+            push @mess,"#     want "._qq(substr($expected,$p,40))."\n";
+        }
     }
     _ok($pass, _where(), $name, @mess);
 }
@@ -476,6 +486,19 @@ sub like_yn ($$$@) {
     _ok($pass, _where(), $name, @mess);
 }
 
+sub refcount_is {
+    # Don't unpack first arg; access it directly via $_[0] to avoid creating
+    # another reference and upsetting the refcount
+    my (undef, $expected, $name, @mess) = @_;
+    my $got = &Internals::SvREFCNT($_[0]) + 1; # +1 to account for the & calling style
+    my $pass = $got == $expected;
+    unless ($pass) {
+        unshift @mess, "#      got $got references\n" .
+                       "# expected $expected\n";
+    }
+    _ok($pass, _where(), $name, @mess);
+}
+
 sub pass {
     _ok(1, '', @_);
 }
@@ -776,6 +799,11 @@ sub untaint_path {
             $path = $path . $sep;
         }
         $path = $path . '/bin';
+    } elsif (!$is_vms and !length $path) {
+        # empty PATH is the same as a path of "." on *nix so to prevent
+        # tests from dieing under taint we need to return something
+        # absolute. Perhaps "/" would be better? Anything absolute will do.
+        $path = "/usr/bin";
     }
 
     $path;
@@ -973,8 +1001,8 @@ sub _num_to_alpha {
     $max_char = 0 if !defined($max_char) or $max_char < 0;
 
     while( 1 ){
-        $alpha = $letters[ $num % 26 ] . $alpha;
-        $num = int( $num / 26 );
+        $alpha = $letters[ $num % @letters ] . $alpha;
+        $num = int( $num / @letters );
         last if $num == 0;
         $num = $num - 1;
 
@@ -1005,6 +1033,9 @@ $::tempfile_regexp = 'tmp_[A-Z]+_[A-Z]+';
 # Avoid ++, avoid ranges, avoid split //
 my $tempfile_count = 0;
 my $max_file_chars = 3;
+# Note that the max number of is NOT 26**3, it is 26**3 + 26**2 + 26,
+# as 3 character files are distinct from 2 character files, from 1 characters
+# files, etc.
 sub tempfile {
     # if you change the format returned by tempfile() you MUST change
     # the $::tempfile_regex define above.
@@ -1075,6 +1106,7 @@ sub fresh_perl {
     # it feels like the least-worse thing is to assume that auto-vivification
     # works. At least, this is only going to be a run-time failure, so won't
     # affect tests using this file but not this function.
+    my $trim= delete $runperl_args->{rtrim_result}; # hide from runperl
     $runperl_args->{progfile} ||= $tmpfile;
     $runperl_args->{stderr}     = 1 unless exists $runperl_args->{stderr};
 
@@ -1086,7 +1118,7 @@ sub fresh_perl {
     my $results = runperl(%$runperl_args);
     my $status = $?;    # Not necessary to save this, but it makes it clear to
                         # future maintainers.
-
+    $results=~s/[ \t]+\n/\n/g if $trim;
     # Clean up the results into something a bit more predictable.
     $results  =~ s/\n+$//;
     $results =~ s/at\s+$::tempfile_regexp\s+line/at - line/g;
@@ -1112,6 +1144,11 @@ sub fresh_perl {
 sub _fresh_perl {
     my($prog, $action, $expect, $runperl_args, $name) = @_;
 
+    local $Level = $Level + 1;
+
+    # strip trailing whitespace if requested - makes some tests easier
+    $expect=~s/[[:blank:]]+\n/\n/g if $runperl_args->{rtrim_result};
+
     my $results = fresh_perl($prog, $runperl_args);
     my $status = $?;
 
@@ -1155,7 +1192,7 @@ sub fresh_perl_is {
     # This will make it so the test author doesn't have to know that.
     $expected =~ s/\n+$//;
 
-    local $Level = 2;
+    local $Level = $Level + 1;
     _fresh_perl($prog, 'eq', $expected, $runperl_args, $name);
 }
 
@@ -1167,7 +1204,7 @@ sub fresh_perl_is {
 
 sub fresh_perl_like {
     my($prog, $expected, $runperl_args, $name) = @_;
-    local $Level = 2;
+    local $Level = $Level + 1;
     _fresh_perl($prog, '=~', $expected, $runperl_args, $name);
 }
 
@@ -1290,6 +1327,13 @@ sub run_multiple_progs {
         my $dummy;
         ($dummy, @prgs) = _setup_one_file(shift);
     }
+    my $taint_disabled;
+    if (! eval {require Config; 1}) {
+        warn "test.pl had problems loading Config: $@";
+        $taint_disabled = '';
+    } else {
+        $taint_disabled = $Config::Config{taint_disabled};
+    }
 
     my $tmpfile = tempfile();
 
@@ -1342,6 +1386,10 @@ sub run_multiple_progs {
         $name = "test from $file at line $line";
     }
 
+        if ($switch=~/[Tt]/ and $taint_disabled eq "define") {
+            $reason{skip} ||= "This perl does not support taint";
+        }
+
        if ($reason{skip}) {
        SKIP:
          {
@@ -1714,17 +1762,58 @@ sub warning_like {
     }
 }
 
-# Set a watchdog to timeout the entire test file
+# Set a watchdog to timeout the entire test file.  The input seconds is
+# multiplied by $ENV{PERL_TEST_TIME_OUT_FACTOR} (default 1; minimum 1).
+# Set this in your profile for slow boxes, or use it to override the timeout
+# temporarily for debugging.
+#
 # NOTE:  If the test file uses 'threads', then call the watchdog() function
 #        _AFTER_ the 'threads' module is loaded.
+{ # Closure
+    my $watchdog;
+    my $watchdog_thread;
+
 sub watchdog ($;$)
 {
     my $timeout = shift;
-    my $method  = shift || "";
+
+    # If cancelling, use the state variables to know which method was used to
+    # create the watchdog.
+    if ($timeout == 0) {
+        if ($watchdog_thread) {
+            $watchdog_thread->kill('KILL');
+            undef $watch_dog_thread;
+        }
+        elsif ($watchdog) {
+            kill('KILL', $watchdog);
+            undef $watch_dog;
+        }
+        else {
+            alarm(0);
+        }
+
+        return;
+    }
+
+    # Make sure these aren't defined.
+    undef $watchdog;
+    undef $watchdog_thread;
+
+    my $method = shift || "";
+
     my $timeout_msg = 'Test process timed out - terminating';
 
+    # Accept either spelling
+    my $timeout_factor = $ENV{PERL_TEST_TIME_OUT_FACTOR}
+                      || $ENV{PERL_TEST_TIMEOUT_FACTOR}
+                      || 1;
+    $timeout_factor = 1 if $timeout_factor < 1;
+    $timeout_factor = $1 if $timeout_factor =~ /^(\d+)$/;
+
     # Valgrind slows perl way down so give it more time before dying.
-    $timeout *= 10 if $ENV{PERL_VALGRIND};
+    $timeout_factor = 10 if $timeout_factor < 10 && $ENV{PERL_VALGRIND};
+
+    $timeout *= $timeout_factor;
 
     my $pid_to_kill = $$;   # PID for this process
 
@@ -1740,7 +1829,9 @@ sub watchdog ($;$)
     if (!$threads_on || $method eq "process") {
 
         # On Windows and VMS, try launching a watchdog process
-        #   using system(1, ...) (see perlport.pod)
+        #   using system(1, ...) (see perlport.pod).  system() returns
+        #   immediately on these platforms with effectively a pid of the new
+        #   process
         if ($is_mswin || $is_vms) {
             # On Windows, try to get the 'real' PID
             if ($is_mswin) {
@@ -1754,7 +1845,7 @@ sub watchdog ($;$)
             return if ($pid_to_kill <= 0);
 
             # Launch watchdog process
-            my $watchdog;
+            undef $watchdog;
             eval {
                 local $SIG{'__WARN__'} = sub {
                     _diag("Watchdog warning: $_[0]");
@@ -1803,7 +1894,7 @@ sub watchdog ($;$)
         }
 
         # Try using fork() to generate a watchdog process
-        my $watchdog;
+        undef $watchdog;
         eval { $watchdog = fork() };
         if (defined($watchdog)) {
             if ($watchdog) {   # Parent process
@@ -1848,10 +1939,16 @@ sub watchdog ($;$)
     # Use a watchdog thread because either 'threads' is loaded,
     #   or fork() failed
     if (eval {require threads; 1}) {
-        'threads'->create(sub {
+        $watchdog_thread = 'threads'->create(sub {
                 # Load POSIX if available
                 eval { require POSIX; };
 
+                $SIG{'KILL'} = sub { threads->exit(); };
+
+                # Detach after the signal handler is set up; the parent knows
+                # not to signal until detached.
+                'threads'->detach();
+
                 # Execute the timeout
                 my $time_left = $timeout;
                 do {
@@ -1864,7 +1961,18 @@ sub watchdog ($;$)
                 POSIX::_exit(1) if (defined(&POSIX::_exit));
                 my $sig = $is_vms ? 'TERM' : 'KILL';
                 kill($sig, $pid_to_kill);
-            })->detach();
+        });
+
+        # Don't proceed until the watchdog has set up its signal handler.
+        # (Otherwise there is a possibility that we will exit with threads
+        # running.)  The watchdog tells us the handler is set by detaching
+        # itself.  (The 'is_running()' is a fail-safe.)
+        while (     $watchdog_thread->is_running()
+               && ! $watchdog_thread->is_detached())
+        {
+            'threads'->yield();
+        }
+
         return;
     }
 
@@ -1884,6 +1992,7 @@ WATCHDOG_VIA_ALARM:
         };
     }
 }
+} # End closure
 
 # Orphaned Docker or Linux containers do not necessarily attach to PID 1. They might attach to 0 instead.
 sub is_linux_container {
index 7fb7f18..36e37f6 100644 (file)
@@ -113,6 +113,7 @@ is( ref Føø::Bær->new, 'Føø::Bær');
 my $new_ascii = "new";
 my $new_latin = "nèw";
 my $e_with_grave = byte_utf8a_to_utf8n("\303\250");
+my $e_with_grave_escaped= $e_with_grave=~s/\x{a8}/\\\\x\\{a8\\}/r;
 my $new_utf8  = "n${e_with_grave}w";
 my $newoct    = "n${e_with_grave}w";
 utf8::decode($new_utf8);
@@ -123,7 +124,8 @@ like( Føø::Bær->$new_utf8, qr/Føø::Bær=HASH/u, "Can access \$new_utf8, [$n
 {
     local $@;
     eval { Føø::Bær->$newoct };
-    like($@, qr/Can't locate object method "n${e_with_grave}w" via package "Føø::Bær"/u, "Can't access [$newoct], stored in a scalar, as a method through a UTF-8 package." );
+    like($@, qr/Can't locate object method "n${e_with_grave_escaped}w" via package "Føø::Bær"/u,
+        "Can't access [$newoct], stored in a scalar, as a method through a UTF-8 package." );
 }
 
 
@@ -139,8 +141,10 @@ like( $pkg_latin_1->$new_latin, qr/Føø::Bær=HASH/u, "Can access \$new_latin,
 like( $pkg_latin_1->$new_utf8, qr/Føø::Bær=HASH/u, "Can access \$new_utf8, [$new_utf8], stored in a scalar, as a method, when the UTF-8 package name is also in a scalar." );
 {
     local $@;
+
     eval { $pkg_latin_1->$newoct };
-    like($@, qr/Can't locate object method "n${e_with_grave}w" via package "Føø::Bær"/u, "Can't access [$newoct], stored in a scalar, as a method, when the UTF-8 package name is also in a scalar.");
+    like($@, qr/Can't locate object method "n${e_with_grave_escaped}w" via package "Føø::Bær"/u,
+        "Can't access [$newoct], stored in a scalar, as a method, when the UTF-8 package name is also in a scalar.");
 }
 
 ok !!Føø::Bær->can($new_ascii), "->can works for [$new_ascii]";
index 3004614..7612c45 100644 (file)
@@ -97,7 +97,7 @@ $uc = ucfirst $u;
 is (length $uc, 1);
 is ($uc, $e_acute, "e acute -> E acute");
 
-my $have_setlocale = locales_enabled('LC_ALL');
+my $have_setlocale = locales_enabled( [ 'LC_ALL', 'LC_CTYPE' ] );
 
 SKIP: {
     if (!$have_setlocale) {
index 1480ebd..84d3ea3 100644 (file)
@@ -34,16 +34,23 @@ ok 1, "sanity check. If we got this far, UTF-8 in package names is legal.";
         $ㄅĽuṞfⳐ = 5;
     }
     
-    $압Ƈ'd읯ⱪ = 6;        #'
-
+    {
+        no warnings qw(syntax deprecated);
+        $압Ƈ'd읯ⱪ = 6;        #'
+    }
+    
     $ꑭʑ = 2;
     
     $ꑭʑ = join(':', sort(keys %ꑭʑ::));
     $압Ƈ = join(':', sort(keys %압Ƈ::));
     
-    ::is $ꑭʑ, 'bar:ニュー:ꑭʑ:압Ƈ', "comp/stash.t test 1";
+    ::is $ꑭʑ, 'BEGIN:bar:ニュー:ꑭʑ:압Ƈ', "comp/stash.t test 1";
     ::is $압Ƈ, "d읯ⱪ:ㄅĽuṞfⳐ", "comp/stash.t test 2";
-    ::is $main'ㄅĽuṞfⳐ, 123, "comp/stash.t test 3";
+
+    {
+        no warnings qw(syntax deprecated);
+        ::is $main'ㄅĽuṞfⳐ, 123, "comp/stash.t test 3";
+    }
 
     package 압Ƈ;
 
index 0df2384..d3aa745 100644 (file)
@@ -267,6 +267,7 @@ eval "sort \x{100}%";
 die $@;
 EOS
 syntax error at (eval 1) line 1, at EOF
+Execution of (eval 1) aborted due to compilation errors.
 EXPECT
 
 # New tests go here ^^^^^
index e329faa..a069aa1 100644 (file)
@@ -287,4 +287,4 @@ plan( tests => 49 );
     # [perl #88138] ' not equivalent to :: before a null
     ${"à'\0b"} = "c";
     is ${"à::\0b"}, "c", "' is equivalent to :: before a null";
-}
\ No newline at end of file
+}
index a8a6768..2c18951 100644 (file)
@@ -41,6 +41,7 @@ plan (tests => 66880);
     eval q<use strict; ${flark::fleem}>;
     is($@, '', q<${package::var} works>);
 
+    no warnings qw(syntax deprecated);
     local $@;
     eval q<use strict; ${fleem'flark}>;
     is($@, '', q<...as does ${package'var}>);
index 77a2351..d7dfb7d 100644 (file)
@@ -34,7 +34,9 @@ Implements the L</TAINT_PROPER> macro, which you should generally use instead.
 void
 Perl_taint_proper(pTHX_ const char *f, const char *const s)
 {
-    /* Output a tainting violation, croaking unless we're just to warn.
+    /* Don't use directly; instead use TAINT_PROPER
+     *
+     * Output a tainting violation, croaking unless we're just to warn.
      * '_proper' is just to throw you off the scent */
 
 #if defined(HAS_SETEUID) && defined(DEBUGGING)
@@ -95,6 +97,8 @@ Implements the L</TAINT_ENV> macro, which you should generally use instead.
 void
 Perl_taint_env(pTHX)
 {
+    /* Don't use directly; instead use TAINT_ENV */
+
     SV** svp;
     const char* const *e;
     static const char* const misc_env[] = {
index dd98a43..474c2b4 100644 (file)
 #  ifdef MUTEX_INIT_NEEDS_MUTEX_ZEROED
     /* Temporary workaround, true bug is deeper. --jhi 1999-02-25 */
 #    define MUTEX_INIT(m) \
-    STMT_START {                                               \
-        int _eC_;                                              \
-        Zero((m), 1, perl_mutex);                               \
-        if ((_eC_ = pthread_mutex_init((m), pthread_mutexattr_default)))       \
-            Perl_croak_nocontext("panic: MUTEX_INIT (%d) [%s:%d]",     \
-                                 _eC_, __FILE__, __LINE__);    \
+    STMT_START {                                                    \
+        int _eC_;                                                   \
+        Zero((m), 1, perl_mutex);                                   \
+        if ((_eC_ = pthread_mutex_init((m), pthread_mutexattr_default)))\
+            Perl_croak_nocontext("panic: MUTEX_INIT (%d) [%s:%d]",  \
+                                 _eC_, __FILE__, __LINE__);         \
     } STMT_END
 #  else
 #    define MUTEX_INIT(m) \
     STMT_START {                                               \
         int _eC_;                                              \
-        if ((_eC_ = pthread_mutex_init((m), pthread_mutexattr_default)))       \
-            Perl_croak_nocontext("panic: MUTEX_INIT (%d) [%s:%d]",     \
-                                 _eC_, __FILE__, __LINE__);    \
+        if ((_eC_ = pthread_mutex_init((m), pthread_mutexattr_default))) \
+            Perl_croak_nocontext("panic: MUTEX_INIT (%d) [%s:%d]", \
+                                 _eC_, __FILE__, __LINE__);     \
     } STMT_END
 #  endif
 
 #    define perl_pthread_mutex_unlock(m) pthread_mutex_unlock(m)
 #  endif
 
-#  define MUTEX_LOCK(m) \
+#  define MUTEX_LOCK(m)                                         \
     STMT_START {                                               \
+        dSAVE_ERRNO;                                            \
         int _eC_;                                              \
-        if ((_eC_ = perl_pthread_mutex_lock((m))))                     \
-            Perl_croak_nocontext("panic: MUTEX_LOCK (%d) [%s:%d]",     \
+        if ((_eC_ = perl_pthread_mutex_lock((m))))             \
+            Perl_croak_nocontext("panic: MUTEX_LOCK (%d) [%s:%d]",\
                                  _eC_, __FILE__, __LINE__);    \
+        RESTORE_ERRNO;                                          \
     } STMT_END
 
-#  define MUTEX_UNLOCK(m) \
+#  define MUTEX_UNLOCK(m)                                       \
     STMT_START {                                               \
+        dSAVE_ERRNO; /* Shouldn't be necessary as panics if fails */\
         int _eC_;                                              \
-        if ((_eC_ = perl_pthread_mutex_unlock((m))))                   \
-            Perl_croak_nocontext("panic: MUTEX_UNLOCK (%d) [%s:%d]",   \
+        if ((_eC_ = perl_pthread_mutex_unlock((m)))) {          \
+            Perl_croak_nocontext(                               \
+                            "panic: MUTEX_UNLOCK (%d) [%s:%d]", \
                                  _eC_, __FILE__, __LINE__);    \
+        }                                                       \
+        RESTORE_ERRNO;                                          \
     } STMT_END
 
-#  define MUTEX_DESTROY(m) \
-    STMT_START {                                               \
-        int _eC_;                                              \
-        if ((_eC_ = pthread_mutex_destroy((m))))               \
-            Perl_croak_nocontext("panic: MUTEX_DESTROY (%d) [%s:%d]",  \
-                                 _eC_, __FILE__, __LINE__);    \
+#  define MUTEX_DESTROY(m)                                                  \
+    STMT_START {                                                           \
+        int _eC_;                                                          \
+        if ((_eC_ = pthread_mutex_destroy((m)))) {                          \
+            dTHX;                                                           \
+            if (PL_phase != PERL_PHASE_DESTRUCT) {                          \
+                Perl_croak_nocontext("panic: MUTEX_DESTROY (%d) [%s:%d]",   \
+                                    _eC_, __FILE__, __LINE__);             \
+            }                                                               \
+        }                                                                   \
     } STMT_END
 #endif /* MUTEX_INIT */
 
     } STMT_END
 
 #  define COND_DESTROY(c) \
-    STMT_START {                                               \
-        int _eC_;                                              \
-        if ((_eC_ = pthread_cond_destroy((c))))                        \
-            Perl_croak_nocontext("panic: COND_DESTROY (%d) [%s:%d]",   \
-                                 _eC_, __FILE__, __LINE__);    \
+    STMT_START {                                                           \
+        int _eC_;                                                          \
+        if ((_eC_ = pthread_cond_destroy((c)))) {                           \
+            dTHX;                                                           \
+            if (PL_phase != PERL_PHASE_DESTRUCT) {                          \
+                Perl_croak_nocontext("panic: COND_DESTROY (%d) [%s:%d]",    \
+                                    _eC_, __FILE__, __LINE__);             \
+            }                                                               \
+        }                                                                   \
     } STMT_END
 #endif /* COND_INIT */
 
@@ -390,12 +404,14 @@ extern PERL_THREAD_LOCAL void *PL_current_context;
 /* We must also call pthread_setspecific() always, as C++ code has to read it
  * with pthreads (the #else side just below) */
 
-#  define PERL_SET_CONTEXT(t)                                           \
-    STMT_START {                                                        \
-        int _eC_;                                                       \
-        if ((_eC_ = pthread_setspecific(PL_thr_key, PL_current_context = (void *)(t)))) \
+#  define PERL_SET_CONTEXT(t)                                               \
+    STMT_START {                                                            \
+        int _eC_;                                                           \
+        if ((_eC_ = pthread_setspecific(PL_thr_key,                         \
+                                        PL_current_context = (void *)(t)))) \
             Perl_croak_nocontext("panic: pthread_setspecific (%d) [%s:%d]", \
-                                 _eC_, __FILE__, __LINE__);             \
+                                 _eC_, __FILE__, __LINE__);                 \
+        PERL_SET_NON_tTHX_CONTEXT(t);                                       \
     } STMT_END
 
 #else
index 52d99cd..4948d6a 100644 (file)
@@ -26,6 +26,33 @@ THE SOFTWARE.
 
 */
 
+
+/*
+ *   This thing all things devours:
+ *   Birds, beasts, trees, flowers;
+ *   Gnaws iron, bites steel;
+ *   Grinds hard stones to meal;
+ *   Slays king, ruins town,
+ *   And beats high mountain down."
+ *
+ * Poor Bilbo sat in the dark thinking of all the horrible names of all the
+ * giants and ogres he had ever heard told of in tales, but not one of them had
+ * done all these things. He had a feeling that the answer was quite different
+ * and that he ought to know it, but he could not think of it. He began to get
+ * frightened, and that is bad for thinking. Gollum began to get out of his
+ * boat. He flapped into the water and paddled to the bank; Bilbo could see his
+ * eyes coming towards him. His tongue seemed to stick in his mouth; he wanted
+ * to shout out: "Give me more time! Give me time!" But all that came out with
+ * a sudden squeal was:
+ *
+ * "Time! Time!"
+ *
+ * Bilbo was saved by pure luck. For that of course was the answer.
+ *
+ *     [p.84 of _The Hobbit_: "Riddles in the Dark"]
+ *
+*/
+
 /*
 
 Programmers who have available to them 64-bit time values as a 'long
@@ -115,40 +142,6 @@ static const short safe_years[SOLAR_CYCLE_LENGTH] = {
 #    define TIME64_TRACE3(format, var1, var2, var3) ((void)0)
 #endif
 
-/* Set up the mutexes for this file.  There are no races possible on
- * non-threaded perls, nor platforms that naturally don't have them.
- * Otherwise, we need to have mutexes.  If we have reentrant versions of the
- * functions below, they automatically will be substituted for the
- * non-reentrant ones.  That solves the problem of the buffers being trashed by
- * another thread, but not of the environment or locale changing during their
- * execution.  To do that, we only need a read lock (which prevents writing by
- * others).  However, if we don't have re-entrant functions, we can gain some
- * measure of thread-safety by using an exclusive lock during their execution.
- * That will protect against any other use of the functions that use the
- * mutexes, which all of core should be using. */
-#ifdef USE_REENTRANT_API  /* This indicates a platform where we need reentrant
-                             versions if have them */
-#  ifdef PERL_REENTR_USING_LOCALTIME_R
-#    define LOCALTIME_LOCK    ENV_LOCALE_READ_LOCK
-#    define LOCALTIME_UNLOCK  ENV_LOCALE_READ_UNLOCK
-#  else
-#    define LOCALTIME_LOCK    ENV_LOCALE_LOCK
-#    define LOCALTIME_UNLOCK  ENV_LOCALE_UNLOCK
-#  endif
-#  ifdef PERL_REENTR_USING_GMTIME_R
-#    define GMTIME_LOCK    ENV_LOCALE_READ_LOCK
-#    define GMTIME_UNLOCK  ENV_LOCALE_READ_UNLOCK
-#  else
-#    define GMTIME_LOCK    ENV_LOCALE_LOCK
-#    define GMTIME_UNLOCK  ENV_LOCALE_UNLOCK
-#  endif
-#else   /* Reentrant not needed, so races not possible */
-#  define LOCALTIME_LOCK    NOOP
-#  define LOCALTIME_UNLOCK  NOOP
-#  define GMTIME_LOCK       NOOP
-#  define GMTIME_UNLOCK     NOOP
-#endif
-
 static int S_is_exception_century(Year year)
 {
     const int is_exception = ((year % 100 == 0) && !(year % 400 == 0));
index ea99050..1f81b36 100644 (file)
@@ -115,6 +115,15 @@ static const char ident_var_zero_multi_digit[] = "Numeric variables with more th
  * 1999-02-27 mjd-perl-patch@plover.com */
 #define isCONTROLVAR(x) (isUPPER(x) || memCHRs("[\\]^_?", (x)))
 
+/* Non-identifier plugin infix operators are allowed any printing character
+ * except spaces, digits, or identifier chars
+ */
+#define isPLUGINFIX(c) (c && !isSPACE(c) && !isDIGIT(c) && !isALPHA(c))
+/* Plugin infix operators may not begin with a quote symbol */
+#define isPLUGINFIX_FIRST(c) (isPLUGINFIX(c) && c != '"' && c != '\'')
+
+#define PLUGINFIX_IS_ENABLED  UNLIKELY(PL_infix_plugin != &Perl_infix_plugin_standard)
+
 #define SPACE_OR_TAB(c) isBLANK_A(c)
 
 #define HEXFP_PEEK(s)     \
@@ -226,6 +235,7 @@ static const char* const lex_state_names[] = {
 #define PRETERMBLOCK(retval) return (PL_expect = XTERMBLOCK,PL_bufptr = s, REPORT(retval))
 #define PREREF(retval) return (PL_expect = XREF,PL_bufptr = s, REPORT(retval))
 #define TERM(retval) return (CLINE, PL_expect = XOPERATOR, PL_bufptr = s, REPORT(retval))
+#define PHASERBLOCK(f) return (pl_yylval.ival=f, PL_expect = XBLOCK, PL_bufptr = s, REPORT((int)PHASER))
 #define POSTDEREF(f) return (PL_bufptr = s, S_postderef(aTHX_ REPORT(f),s[1]))
 #define LOOPX(f) return (PL_bufptr = force_word(s,BAREWORD,TRUE,FALSE), \
                          pl_yylval.ival=f, \
@@ -410,106 +420,121 @@ static struct debug_tokens {
     const char *name;
 } const debug_tokens[] =
 {
-    { ADDOP,           TOKENTYPE_OPNUM,        "ADDOP" },
-    { ANDAND,          TOKENTYPE_NONE,         "ANDAND" },
-    { ANDOP,           TOKENTYPE_NONE,         "ANDOP" },
-    { ANONSUB,         TOKENTYPE_IVAL,         "ANONSUB" },
-    { ANON_SIGSUB,     TOKENTYPE_IVAL,         "ANON_SIGSUB" },
-    { ARROW,           TOKENTYPE_NONE,         "ARROW" },
-    { ASSIGNOP,                TOKENTYPE_OPNUM,        "ASSIGNOP" },
-    { BITANDOP,                TOKENTYPE_OPNUM,        "BITANDOP" },
-    { BITOROP,         TOKENTYPE_OPNUM,        "BITOROP" },
-    { CATCH,           TOKENTYPE_IVAL,         "CATCH" },
-    { CHEQOP,          TOKENTYPE_OPNUM,        "CHEQOP" },
-    { CHRELOP,         TOKENTYPE_OPNUM,        "CHRELOP" },
-    { COLONATTR,       TOKENTYPE_NONE,         "COLONATTR" },
-    { CONTINUE,                TOKENTYPE_NONE,         "CONTINUE" },
-    { DEFAULT,         TOKENTYPE_NONE,         "DEFAULT" },
-    { DO,              TOKENTYPE_NONE,         "DO" },
-    { DOLSHARP,                TOKENTYPE_NONE,         "DOLSHARP" },
-    { DORDOR,          TOKENTYPE_NONE,         "DORDOR" },
-    { DOTDOT,          TOKENTYPE_IVAL,         "DOTDOT" },
-    { ELSE,            TOKENTYPE_NONE,         "ELSE" },
-    { ELSIF,           TOKENTYPE_IVAL,         "ELSIF" },
-    { FOR,             TOKENTYPE_IVAL,         "FOR" },
-    { FORMAT,          TOKENTYPE_NONE,         "FORMAT" },
-    { FORMLBRACK,      TOKENTYPE_NONE,         "FORMLBRACK" },
-    { FORMRBRACK,      TOKENTYPE_NONE,         "FORMRBRACK" },
-    { FUNC,            TOKENTYPE_OPNUM,        "FUNC" },
-    { FUNC0,           TOKENTYPE_OPNUM,        "FUNC0" },
-    { FUNC0OP,         TOKENTYPE_OPVAL,        "FUNC0OP" },
-    { FUNC0SUB,                TOKENTYPE_OPVAL,        "FUNC0SUB" },
-    { FUNC1,           TOKENTYPE_OPNUM,        "FUNC1" },
-    { FUNCMETH,                TOKENTYPE_OPVAL,        "FUNCMETH" },
-    { GIVEN,           TOKENTYPE_IVAL,         "GIVEN" },
-    { HASHBRACK,       TOKENTYPE_NONE,         "HASHBRACK" },
-    { IF,              TOKENTYPE_IVAL,         "IF" },
-    { LABEL,           TOKENTYPE_OPVAL,        "LABEL" },
-    { LOCAL,           TOKENTYPE_IVAL,         "LOCAL" },
-    { LOOPEX,          TOKENTYPE_OPNUM,        "LOOPEX" },
-    { LSTOP,           TOKENTYPE_OPNUM,        "LSTOP" },
-    { LSTOPSUB,                TOKENTYPE_OPVAL,        "LSTOPSUB" },
-    { MATCHOP,         TOKENTYPE_OPNUM,        "MATCHOP" },
-    { METHOD,          TOKENTYPE_OPVAL,        "METHOD" },
-    { MULOP,           TOKENTYPE_OPNUM,        "MULOP" },
-    { MY,              TOKENTYPE_IVAL,         "MY" },
-    { NCEQOP,          TOKENTYPE_OPNUM,        "NCEQOP" },
-    { NCRELOP,         TOKENTYPE_OPNUM,        "NCRELOP" },
-    { NOAMP,           TOKENTYPE_NONE,         "NOAMP" },
-    { NOTOP,           TOKENTYPE_NONE,         "NOTOP" },
-    { OROP,            TOKENTYPE_IVAL,         "OROP" },
-    { OROR,            TOKENTYPE_NONE,         "OROR" },
-    { PACKAGE,         TOKENTYPE_NONE,         "PACKAGE" },
-    DEBUG_TOKEN (IVAL, PERLY_AMPERSAND),
-    DEBUG_TOKEN (IVAL, PERLY_BRACE_CLOSE),
-    DEBUG_TOKEN (IVAL, PERLY_BRACE_OPEN),
-    DEBUG_TOKEN (IVAL, PERLY_BRACKET_CLOSE),
-    DEBUG_TOKEN (IVAL, PERLY_BRACKET_OPEN),
-    DEBUG_TOKEN (IVAL, PERLY_COLON),
-    DEBUG_TOKEN (IVAL, PERLY_COMMA),
-    DEBUG_TOKEN (IVAL, PERLY_DOT),
-    DEBUG_TOKEN (IVAL, PERLY_EQUAL_SIGN),
-    DEBUG_TOKEN (IVAL, PERLY_EXCLAMATION_MARK),
-    DEBUG_TOKEN (IVAL, PERLY_MINUS),
-    DEBUG_TOKEN (IVAL, PERLY_PAREN_OPEN),
-    DEBUG_TOKEN (IVAL, PERLY_PERCENT_SIGN),
-    DEBUG_TOKEN (IVAL, PERLY_PLUS),
-    DEBUG_TOKEN (IVAL, PERLY_QUESTION_MARK),
-    DEBUG_TOKEN (IVAL, PERLY_SEMICOLON),
-    DEBUG_TOKEN (IVAL, PERLY_SLASH),
-    DEBUG_TOKEN (IVAL, PERLY_SNAIL),
-    DEBUG_TOKEN (IVAL, PERLY_STAR),
-    DEBUG_TOKEN (IVAL, PERLY_TILDE),
-    { PLUGEXPR,                TOKENTYPE_OPVAL,        "PLUGEXPR" },
-    { PLUGSTMT,                TOKENTYPE_OPVAL,        "PLUGSTMT" },
-    { PMFUNC,          TOKENTYPE_OPVAL,        "PMFUNC" },
-    { POSTJOIN,                TOKENTYPE_NONE,         "POSTJOIN" },
-    { POSTDEC,         TOKENTYPE_NONE,         "POSTDEC" },
-    { POSTINC,         TOKENTYPE_NONE,         "POSTINC" },
-    { POWOP,           TOKENTYPE_OPNUM,        "POWOP" },
-    { PREDEC,          TOKENTYPE_NONE,         "PREDEC" },
-    { PREINC,          TOKENTYPE_NONE,         "PREINC" },
-    { PRIVATEREF,      TOKENTYPE_OPVAL,        "PRIVATEREF" },
-    { QWLIST,          TOKENTYPE_OPVAL,        "QWLIST" },
-    { REFGEN,          TOKENTYPE_NONE,         "REFGEN" },
-    { REQUIRE,         TOKENTYPE_NONE,         "REQUIRE" },
-    { SHIFTOP,         TOKENTYPE_OPNUM,        "SHIFTOP" },
-    { SIGSUB,          TOKENTYPE_NONE,         "SIGSUB" },
-    { SUB,             TOKENTYPE_NONE,         "SUB" },
-    { SUBLEXEND,       TOKENTYPE_NONE,         "SUBLEXEND" },
-    { SUBLEXSTART,     TOKENTYPE_NONE,         "SUBLEXSTART" },
-    { THING,           TOKENTYPE_OPVAL,        "THING" },
-    { TRY,             TOKENTYPE_IVAL,         "TRY" },
-    { UMINUS,          TOKENTYPE_NONE,         "UMINUS" },
-    { UNIOP,           TOKENTYPE_OPNUM,        "UNIOP" },
-    { UNIOPSUB,                TOKENTYPE_OPVAL,        "UNIOPSUB" },
-    { UNLESS,          TOKENTYPE_IVAL,         "UNLESS" },
-    { UNTIL,           TOKENTYPE_IVAL,         "UNTIL" },
-    { USE,             TOKENTYPE_IVAL,         "USE" },
-    { WHEN,            TOKENTYPE_IVAL,         "WHEN" },
-    { WHILE,           TOKENTYPE_IVAL,         "WHILE" },
-    { BAREWORD,                TOKENTYPE_OPVAL,        "BAREWORD" },
-    { YADAYADA,                TOKENTYPE_IVAL,         "YADAYADA" },
+    DEBUG_TOKEN (OPNUM, ADDOP),
+    DEBUG_TOKEN (NONE,  ANDAND),
+    DEBUG_TOKEN (NONE,  ANDOP),
+    DEBUG_TOKEN (NONE,  ARROW),
+    DEBUG_TOKEN (OPNUM, ASSIGNOP),
+    DEBUG_TOKEN (OPNUM, BITANDOP),
+    DEBUG_TOKEN (OPNUM, BITOROP),
+    DEBUG_TOKEN (OPNUM, CHEQOP),
+    DEBUG_TOKEN (OPNUM, CHRELOP),
+    DEBUG_TOKEN (NONE,  COLONATTR),
+    DEBUG_TOKEN (NONE,  DOLSHARP),
+    DEBUG_TOKEN (NONE,  DORDOR),
+    DEBUG_TOKEN (IVAL,  DOTDOT),
+    DEBUG_TOKEN (NONE,  FORMLBRACK),
+    DEBUG_TOKEN (NONE,  FORMRBRACK),
+    DEBUG_TOKEN (OPNUM, FUNC),
+    DEBUG_TOKEN (OPNUM, FUNC0),
+    DEBUG_TOKEN (OPVAL, FUNC0OP),
+    DEBUG_TOKEN (OPVAL, FUNC0SUB),
+    DEBUG_TOKEN (OPNUM, FUNC1),
+    DEBUG_TOKEN (NONE,  HASHBRACK),
+    DEBUG_TOKEN (IVAL,  KW_CATCH),
+    DEBUG_TOKEN (IVAL,  KW_CLASS),
+    DEBUG_TOKEN (IVAL,  KW_CONTINUE),
+    DEBUG_TOKEN (IVAL,  KW_DEFAULT),
+    DEBUG_TOKEN (IVAL,  KW_DO),
+    DEBUG_TOKEN (IVAL,  KW_ELSE),
+    DEBUG_TOKEN (IVAL,  KW_ELSIF),
+    DEBUG_TOKEN (IVAL,  KW_FIELD),
+    DEBUG_TOKEN (IVAL,  KW_GIVEN),
+    DEBUG_TOKEN (IVAL,  KW_FOR),
+    DEBUG_TOKEN (IVAL,  KW_FORMAT),
+    DEBUG_TOKEN (IVAL,  KW_IF),
+    DEBUG_TOKEN (IVAL,  KW_LOCAL),
+    DEBUG_TOKEN (IVAL,  KW_METHOD_anon),
+    DEBUG_TOKEN (IVAL,  KW_METHOD_named),
+    DEBUG_TOKEN (IVAL,  KW_MY),
+    DEBUG_TOKEN (IVAL,  KW_PACKAGE),
+    DEBUG_TOKEN (IVAL,  KW_REQUIRE),
+    DEBUG_TOKEN (IVAL,  KW_SUB_anon),
+    DEBUG_TOKEN (IVAL,  KW_SUB_anon_sig),
+    DEBUG_TOKEN (IVAL,  KW_SUB_named),
+    DEBUG_TOKEN (IVAL,  KW_SUB_named_sig),
+    DEBUG_TOKEN (IVAL,  KW_TRY),
+    DEBUG_TOKEN (IVAL,  KW_USE_or_NO),
+    DEBUG_TOKEN (IVAL,  KW_UNLESS),
+    DEBUG_TOKEN (IVAL,  KW_UNTIL),
+    DEBUG_TOKEN (IVAL,  KW_WHEN),
+    DEBUG_TOKEN (IVAL,  KW_WHILE),
+    DEBUG_TOKEN (OPVAL, LABEL),
+    DEBUG_TOKEN (OPNUM, LOOPEX),
+    DEBUG_TOKEN (OPNUM, LSTOP),
+    DEBUG_TOKEN (OPVAL, LSTOPSUB),
+    DEBUG_TOKEN (OPNUM, MATCHOP),
+    DEBUG_TOKEN (OPVAL, METHCALL),
+    DEBUG_TOKEN (OPVAL, METHCALL0),
+    DEBUG_TOKEN (OPNUM, MULOP),
+    DEBUG_TOKEN (OPNUM, NCEQOP),
+    DEBUG_TOKEN (OPNUM, NCRELOP),
+    DEBUG_TOKEN (NONE,  NOAMP),
+    DEBUG_TOKEN (NONE,  NOTOP),
+    DEBUG_TOKEN (IVAL,  OROP),
+    DEBUG_TOKEN (NONE,  OROR),
+    DEBUG_TOKEN (IVAL,  PERLY_AMPERSAND),
+    DEBUG_TOKEN (IVAL,  PERLY_BRACE_CLOSE),
+    DEBUG_TOKEN (IVAL,  PERLY_BRACE_OPEN),
+    DEBUG_TOKEN (IVAL,  PERLY_BRACKET_CLOSE),
+    DEBUG_TOKEN (IVAL,  PERLY_BRACKET_OPEN),
+    DEBUG_TOKEN (IVAL,  PERLY_COLON),
+    DEBUG_TOKEN (IVAL,  PERLY_COMMA),
+    DEBUG_TOKEN (IVAL,  PERLY_DOT),
+    DEBUG_TOKEN (IVAL,  PERLY_EQUAL_SIGN),
+    DEBUG_TOKEN (IVAL,  PERLY_EXCLAMATION_MARK),
+    DEBUG_TOKEN (IVAL,  PERLY_MINUS),
+    DEBUG_TOKEN (IVAL,  PERLY_PAREN_OPEN),
+    DEBUG_TOKEN (IVAL,  PERLY_PERCENT_SIGN),
+    DEBUG_TOKEN (IVAL,  PERLY_PLUS),
+    DEBUG_TOKEN (IVAL,  PERLY_QUESTION_MARK),
+    DEBUG_TOKEN (IVAL,  PERLY_SEMICOLON),
+    DEBUG_TOKEN (IVAL,  PERLY_SLASH),
+    DEBUG_TOKEN (IVAL,  PERLY_SNAIL),
+    DEBUG_TOKEN (IVAL,  PERLY_STAR),
+    DEBUG_TOKEN (IVAL,  PERLY_TILDE),
+    DEBUG_TOKEN (OPVAL, PLUGEXPR),
+    DEBUG_TOKEN (OPVAL, PLUGSTMT),
+    DEBUG_TOKEN (PVAL,  PLUGIN_ADD_OP),
+    DEBUG_TOKEN (PVAL,  PLUGIN_ASSIGN_OP),
+    DEBUG_TOKEN (PVAL,  PLUGIN_HIGH_OP),
+    DEBUG_TOKEN (PVAL,  PLUGIN_LOGICAL_AND_OP),
+    DEBUG_TOKEN (PVAL,  PLUGIN_LOGICAL_OR_OP),
+    DEBUG_TOKEN (PVAL,  PLUGIN_LOGICAL_AND_LOW_OP),
+    DEBUG_TOKEN (PVAL,  PLUGIN_LOGICAL_OR_LOW_OP),
+    DEBUG_TOKEN (PVAL,  PLUGIN_LOW_OP),
+    DEBUG_TOKEN (PVAL,  PLUGIN_MUL_OP),
+    DEBUG_TOKEN (PVAL,  PLUGIN_POW_OP),
+    DEBUG_TOKEN (PVAL,  PLUGIN_REL_OP),
+    DEBUG_TOKEN (OPVAL, PMFUNC),
+    DEBUG_TOKEN (NONE,  POSTJOIN),
+    DEBUG_TOKEN (NONE,  POSTDEC),
+    DEBUG_TOKEN (NONE,  POSTINC),
+    DEBUG_TOKEN (OPNUM, POWOP),
+    DEBUG_TOKEN (NONE,  PREDEC),
+    DEBUG_TOKEN (NONE,  PREINC),
+    DEBUG_TOKEN (OPVAL, PRIVATEREF),
+    DEBUG_TOKEN (OPVAL, QWLIST),
+    DEBUG_TOKEN (NONE,  REFGEN),
+    DEBUG_TOKEN (OPNUM, SHIFTOP),
+    DEBUG_TOKEN (NONE,  SUBLEXEND),
+    DEBUG_TOKEN (NONE,  SUBLEXSTART),
+    DEBUG_TOKEN (OPVAL, THING),
+    DEBUG_TOKEN (NONE,  UMINUS),
+    DEBUG_TOKEN (OPNUM, UNIOP),
+    DEBUG_TOKEN (OPVAL, UNIOPSUB),
+    DEBUG_TOKEN (OPVAL, BAREWORD),
+    DEBUG_TOKEN (IVAL,  YADAYADA),
     { 0,               TOKENTYPE_NONE,         NULL }
 };
 
@@ -558,7 +583,7 @@ S_tokereport(pTHX_ I32 rv, const YYSTYPE* lvalp)
                                     PL_op_name[lvalp->ival]);
             break;
         case TOKENTYPE_PVAL:
-            Perl_sv_catpvf(aTHX_ report, "(pval=\"%s\")", lvalp->pval);
+            Perl_sv_catpvf(aTHX_ report, "(pval=%p)", lvalp->pval);
             break;
         case TOKENTYPE_OPVAL:
             if (lvalp->opval) {
@@ -642,6 +667,10 @@ S_no_op(pTHX_ const char *const what, char *s)
 {
     char * const oldbp = PL_bufptr;
     const bool is_first = (PL_oldbufptr == PL_linestart);
+    SV *message = sv_2mortal( newSVpvf(
+                   PERL_DIAG_WARN_SYNTAX("%s found where operator expected"),
+                   what
+                  ) );
 
     PERL_ARGS_ASSERT_NO_OP;
 
@@ -649,34 +678,54 @@ S_no_op(pTHX_ const char *const what, char *s)
         s = oldbp;
     else
         PL_bufptr = s;
-    yywarn(Perl_form(aTHX_ "%s found where operator expected", what), UTF ? SVf_UTF8 : 0);
+
     if (ckWARN_d(WARN_SYNTAX)) {
-        if (is_first)
-            Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
-                    "\t(Missing semicolon on previous line?)\n");
-        else if (PL_oldoldbufptr && isIDFIRST_lazy_if_safe(PL_oldoldbufptr,
-                                                           PL_bufend,
-                                                           UTF))
-        {
+        bool has_more = FALSE;
+        if (is_first) {
+            has_more = TRUE;
+            sv_catpvs(message,
+                    " (Missing semicolon on previous line?)");
+        }
+        else if (PL_oldoldbufptr) {
+            /* yyerror (via yywarn) would do this itself, so we should too */
             const char *t;
             for (t = PL_oldoldbufptr;
-                 (isWORDCHAR_lazy_if_safe(t, PL_bufend, UTF) || *t == ':');
+                 t < PL_bufptr && isSPACE(*t);
                  t += UTF ? UTF8SKIP(t) : 1)
             {
                 NOOP;
             }
-            if (t < PL_bufptr && isSPACE(*t))
-                Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
-                        "\t(Do you need to predeclare %" UTF8f "?)\n",
-                      UTF8fARG(UTF, t - PL_oldoldbufptr, PL_oldoldbufptr));
+            /* see if we can identify the cause of the warning */
+            if (isIDFIRST_lazy_if_safe(t,PL_bufend,UTF))
+            {
+                const char *t_start= t;
+                for ( ;
+                     (isWORDCHAR_lazy_if_safe(t, PL_bufend, UTF) || *t == ':');
+                     t += UTF ? UTF8SKIP(t) : 1)
+                {
+                    NOOP;
+                }
+                if (t < PL_bufptr && isSPACE(*t)) {
+                    has_more = TRUE;
+                    sv_catpvf( message,
+                            " (Do you need to predeclare \"%" UTF8f "\"?)",
+                          UTF8fARG(UTF, t - t_start, t_start));
+                }
+            }
         }
-        else {
+        if (!has_more) {
+            const char *t= oldbp;
             assert(s >= oldbp);
-            Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
-                    "\t(Missing operator before %" UTF8f "?)\n",
-                     UTF8fARG(UTF, s - oldbp, oldbp));
+            while (t < s && isSPACE(*t)) {
+                t += UTF ? UTF8SKIP(t) : 1;
+            }
+
+            sv_catpvf(message,
+                    " (Missing operator before \"%" UTF8f "\"?)",
+                     UTF8fARG(UTF, s - t, t));
         }
     }
+    yywarn(SvPV_nolen(message), UTF ? SVf_UTF8 : 0);
     PL_bufptr = oldbp;
 }
 
@@ -852,7 +901,7 @@ Perl_lex_start(pTHX_ SV *line, PerlIO *rsfp, U32 flags)
     Newxz(parser->lex_shared, 1, LEXSHARED);
 
     if (line) {
-        STRLEN len;
+        Size_t len;
         const U8* first_bad_char_loc;
 
         s = SvPV_const(line, len);
@@ -2194,7 +2243,7 @@ S_newSV_maybe_utf8(pTHX_ const char *const start, STRLEN len)
  * Arguments:
  *   char *start : buffer position (must be within PL_linestr)
  *   int token   : PL_next* will be this type of bare word
- *                 (e.g., METHOD,BAREWORD)
+ *                 (e.g., METHCALL0,BAREWORD)
  *   int check_keyword : if true, Perl checks to make sure the word isn't
  *       a keyword (do this if the word is a label, e.g. goto FOO)
  *   int allow_pack : if true, : characters will also be allowed (require,
@@ -2214,7 +2263,7 @@ S_force_word(pTHX_ char *start, int token, int check_keyword, int allow_pack)
     if (   isIDFIRST_lazy_if_safe(s, PL_bufend, UTF)
         || (allow_pack && *s == ':' && s[1] == ':') )
     {
-        s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, allow_pack, &len);
+        s = scan_word6(s, PL_tokenbuf, sizeof PL_tokenbuf, allow_pack, &len, allow_pack);
         if (check_keyword) {
           char *s2 = PL_tokenbuf;
           STRLEN len2 = len;
@@ -2225,7 +2274,7 @@ S_force_word(pTHX_ char *start, int token, int check_keyword, int allow_pack)
           if (keyword(s2, len2, 0))
             return start;
         }
-        if (token == METHOD) {
+        if (token == METHCALL0) {
             s = skipspace(s);
             if (*s == '(')
                 PL_expect = XTERM;
@@ -2382,8 +2431,8 @@ S_force_strict_version(pTHX_ char *s)
         s = (char *)scan_version(s, ver, 0);
         version = newSVOP(OP_CONST, 0, ver);
     }
-    else if ((*s != ';' && *s != '{' && *s != '}' )
-             && (s = skipspace(s), (*s != ';' && *s != '{' && *s != '}' )))
+    else if ((*s != ';' && *s != ':' && *s != '{' && *s != '}' )
+             && (s = skipspace(s), (*s != ';' && *s != ':' && *s != '{' && *s != '}' )))
     {
         PL_bufptr = s;
         if (errstr)
@@ -3032,7 +3081,7 @@ Perl_get_and_check_backslash_N_name(pTHX_ const char* s,
     stops on:
         @ and $ where it appears to be a var, but not for $ as tail anchor
         \l \L \u \U \Q \E
-        (?{  or  (??{
+        (?{  or  (??{ or (*{
 
   In transliterations:
     characters are VERY literal, except for - not at the start or end
@@ -3069,7 +3118,7 @@ Perl_get_and_check_backslash_N_name(pTHX_ const char* s,
   The structure of the code is
       while (there's a character to process) {
           handle transliteration ranges
-          skip regexp comments /(?#comment)/ and codes /(?{code})/
+          skip regexp comments /(?#comment)/ and codes /(?{code})/ ((*{code})/
           skip #-initiated comments in //x patterns
           check for embedded arrays
           check for embedded scalars
@@ -3592,9 +3641,9 @@ S_scan_const(pTHX_ char *start)
         }
             /* skip for regexp comments /(?#comment)/, except for the last
              * char, which will be done separately.  Stop on (?{..}) and
-             * friends */
-        else if (*s == '(' && PL_lex_inpat && s[1] == '?' && !in_charclass) {
-            if (s[2] == '#') {
+             * friends (??{ ... }) or (*{ ... }) */
+        else if (*s == '(' && PL_lex_inpat && (s[1] == '?' || s[1] == '*') && !in_charclass) {
+            if (s[1] == '?' && s[2] == '#') {
                 if (s_is_utf8) {
                     PERL_UINT_FAST8_T  len = UTF8SKIP(s);
 
@@ -3609,10 +3658,13 @@ S_scan_const(pTHX_ char *start)
                     *d++ = *s++;
                 }
             }
-            else if (!PL_lex_casemods
-                     && (    s[2] == '{' /* This should match regcomp.c */
-                         || (s[2] == '?' && s[3] == '{')))
-            {
+            else
+            if (!PL_lex_casemods &&
+                /* The following should match regcomp.c */
+                ((s[1] == '?' && (s[2] == '{'                        /* (?{ ... })  */
+                              || (s[2] == '?' && s[3] == '{'))) ||   /* (??{ ... }) */
+                 (s[1] == '*' && (s[2] == '{' )))                    /* (*{ ... })  */
+            ){
                 break;
             }
         }
@@ -4564,7 +4616,7 @@ S_intuit_more(pTHX_ char *s, char *e)
  * Does all the checking to disambiguate
  *   foo bar
  * between foo(bar) and bar->foo.  Returns 0 if not a method, otherwise
- * FUNCMETH (bar->foo(args)) or METHOD (bar->foo args).
+ * METHCALL (bar->foo(args)) or METHCALL0 (bar->foo args).
  *
  * First argument is the stuff after the first token, e.g. "bar".
  *
@@ -4620,10 +4672,10 @@ S_intuit_method(pTHX_ char *start, SV *ioname, CV *cv)
             s = skipspace(s);
         PL_bufptr = SvPVX(PL_linestr) + start_off;
         PL_expect = XREF;
-        return *s == '(' ? FUNCMETH : METHOD;
+        return *s == '(' ? METHCALL : METHCALL0;
     }
 
-    s = scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
+    s = scan_word6(s, tmpbuf, sizeof tmpbuf, TRUE, &len, FALSE);
     /* start is the beginning of the possible filehandle/object,
      * and s is the end of it
      * tmpbuf is a copy of it (but with single quotes as double colons)
@@ -4653,7 +4705,7 @@ S_intuit_method(pTHX_ char *start, SV *ioname, CV *cv)
             PL_expect = XTERM;
             force_next(BAREWORD);
             PL_bufptr = s;
-            return *s == '(' ? FUNCMETH : METHOD;
+            return *s == '(' ? METHCALL : METHCALL0;
         }
     }
     return 0;
@@ -4767,7 +4819,7 @@ Perl_filter_del(pTHX_ filter_t funcp)
     /* if filter is on top of stack (usual case) just pop it off */
     datasv = FILTER_DATA(AvFILLp(PL_rsfp_filters));
     if (IoANY(datasv) == FPTR2DPTR(void *, funcp)) {
-        sv_free(av_pop(PL_rsfp_filters));
+        SvREFCNT_dec(av_pop(PL_rsfp_filters));
 
         return;
     }
@@ -5066,7 +5118,23 @@ yyl_sigvar(pTHX_ char *s)
             PL_oldbufptr = s;
 
             ++s;
-            NEXTVAL_NEXTTOKE.ival = 0;
+            NEXTVAL_NEXTTOKE.ival = OP_SASSIGN;
+            force_next(ASSIGNOP);
+            PL_expect = XTERM;
+        }
+        else if(*s == '/' && s[1] == '/' && s[2] == '=') {
+            PL_oldbufptr = s;
+
+            s += 3;
+            NEXTVAL_NEXTTOKE.ival = OP_DORASSIGN;
+            force_next(ASSIGNOP);
+            PL_expect = XTERM;
+        }
+        else if(*s == '|' && s[1] == '|' && s[2] == '=') {
+            PL_oldbufptr = s;
+
+            s += 3;
+            NEXTVAL_NEXTTOKE.ival = OP_ORASSIGN;
             force_next(ASSIGNOP);
             PL_expect = XTERM;
         }
@@ -5235,8 +5303,8 @@ yyl_dollar(pTHX_ char *s)
                     } while (isSPACE(*t));
                     if (isIDFIRST_lazy_if_safe(t, PL_bufend, UTF)) {
                         STRLEN len;
-                        t = scan_word(t, tmpbuf, sizeof tmpbuf, TRUE,
-                                        &len);
+                        t = scan_word6(t, tmpbuf, sizeof tmpbuf, TRUE,
+                                      &len, TRUE);
                         while (isSPACE(*t))
                             t++;
                         if (  *t == ';'
@@ -5269,7 +5337,7 @@ yyl_dollar(pTHX_ char *s)
                 char tmpbuf[sizeof PL_tokenbuf];
                 int t2;
                 STRLEN len;
-                scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
+                scan_word6(s, tmpbuf, sizeof tmpbuf, TRUE, &len, FALSE);
                 if ((t2 = keyword(tmpbuf, len, 0))) {
                     /* binary operators exclude handle interpretations */
                     switch (t2) {
@@ -5319,7 +5387,10 @@ yyl_sub(pTHX_ char *s, const int key)
     bool have_name, have_proto;
     STRLEN len;
     SV *format_name = NULL;
-    bool is_sigsub = FEATURE_SIGNATURES_IS_ENABLED;
+    bool is_method = (key == KEY_method);
+
+    /* method always implies signatures */
+    bool is_sigsub = is_method || FEATURE_SIGNATURES_IS_ENABLED;
 
     SSize_t off = s-SvPVX(PL_linestr);
     char *d;
@@ -5337,8 +5408,8 @@ yyl_sub(pTHX_ char *s, const int key)
     {
 
         PL_expect = XATTRBLOCK;
-        d = scan_word(s, tmpbuf, sizeof PL_tokenbuf - 1, TRUE,
-                      &len);
+        d = scan_word6(s, tmpbuf, sizeof PL_tokenbuf - 1, TRUE,
+                      &len, TRUE);
         if (key == KEY_format)
             format_name = S_newSV_maybe_utf8(aTHX_ s, d - s);
         *PL_tokenbuf = '&';
@@ -5377,7 +5448,7 @@ yyl_sub(pTHX_ char *s, const int key)
             NEXTVAL_NEXTTOKE.opval->op_private |= OPpCONST_BARE;
             force_next(BAREWORD);
         }
-        PREBLOCK(FORMAT);
+        PREBLOCK(KW_FORMAT);
     }
 
     /* Look for a prototype */
@@ -5398,9 +5469,9 @@ yyl_sub(pTHX_ char *s, const int key)
     if (  !(*s == ':' && s[1] != ':')
         && (*s != '{' && *s != '(') && key != KEY_format)
     {
-        assert(key == KEY_sub || key == KEY_AUTOLOAD ||
-               key == KEY_DESTROY || key == KEY_BEGIN ||
-               key == KEY_UNITCHECK || key == KEY_CHECK ||
+        assert(key == KEY_sub || key == KEY_method ||
+               key == KEY_AUTOLOAD || key == KEY_DESTROY ||
+               key == KEY_BEGIN || key == KEY_UNITCHECK || key == KEY_CHECK ||
                key == KEY_INIT || key == KEY_END ||
                key == KEY_my || key == KEY_state ||
                key == KEY_our);
@@ -5416,21 +5487,26 @@ yyl_sub(pTHX_ char *s, const int key)
         PL_lex_stuff = NULL;
         force_next(THING);
     }
+
     if (!have_name) {
         if (PL_curstash)
             sv_setpvs(PL_subname, "__ANON__");
         else
             sv_setpvs(PL_subname, "__ANON__::__ANON__");
-        if (is_sigsub)
-            TOKEN(ANON_SIGSUB);
+        if (is_method)
+            TOKEN(KW_METHOD_anon);
+        else if (is_sigsub)
+            TOKEN(KW_SUB_anon_sig);
         else
-            TOKEN(ANONSUB);
+            TOKEN(KW_SUB_anon);
     }
     force_ident_maybe_lex('&');
-    if (is_sigsub)
-        TOKEN(SIGSUB);
+    if (is_method)
+        TOKEN(KW_METHOD_named);
+    else if (is_sigsub)
+        TOKEN(KW_SUB_named_sig);
     else
-        TOKEN(SUB);
+        TOKEN(KW_SUB_named);
 }
 
 static int
@@ -5547,7 +5623,7 @@ yyl_secondclass_keyword(pTHX_ char *s, STRLEN len, int key, I32 *orig_keyword,
         {
             if (GvIMPORTED_CV(gv))
                 ogv = gv;
-            else if (! CvMETHOD(cv))
+            else if (! CvNOWARN_AMBIGUOUS(cv))
                 hgv = gv;
         }
         if (!ogv
@@ -5742,7 +5818,7 @@ yyl_hyphen(pTHX_ char *s)
                 TOKEN(ARROW);
             }
             if (isIDFIRST_lazy_if_safe(s, PL_bufend, UTF)) {
-                s = force_word(s,METHOD,FALSE,TRUE);
+                s = force_word(s,METHCALL0,FALSE,TRUE);
                 TOKEN(ARROW);
             }
             else if (*s == '$')
@@ -5914,11 +5990,10 @@ yyl_colon(pTHX_ char *s)
         s = skipspace(s);
         attrs = NULL;
         while (isIDFIRST_lazy_if_safe(s, PL_bufend, UTF)) {
-            bool sig = PL_parser->sig_seen;
             I32 tmp;
             SV *sv;
             STRLEN len;
-            char *d = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
+            char *d = scan_word6(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len, FALSE);
             if (isLOWER(*s) && (tmp = keyword(PL_tokenbuf, len, 0))) {
                 if (tmp < 0) tmp = -tmp;
                 switch (tmp) {
@@ -5941,7 +6016,8 @@ yyl_colon(pTHX_ char *s)
                 if (!d) {
                     if (attrs)
                         op_free(attrs);
-                    sv_free(sv);
+                    ASSUME(sv && SvREFCNT(sv) == 1);
+                    SvREFCNT_dec(sv);
                     Perl_croak(aTHX_ "Unterminated attribute parameter in attribute list");
                 }
                 COPLINE_SET_FROM_MULTI_END;
@@ -5954,45 +6030,8 @@ yyl_colon(pTHX_ char *s)
                 PL_lex_stuff = NULL;
             }
             else {
-                /* NOTE: any CV attrs applied here need to be part of
-                   the CVf_BUILTIN_ATTRS define in cv.h! */
-                if (!PL_in_my && memEQs(SvPVX(sv), len, "lvalue")) {
-                    sv_free(sv);
-                    if (!sig)
-                        CvLVALUE_on(PL_compcv);
-                }
-                else if (!PL_in_my && memEQs(SvPVX(sv), len, "method")) {
-                    sv_free(sv);
-                    if (!sig)
-                        CvMETHOD_on(PL_compcv);
-                }
-                else if (!PL_in_my && memEQs(SvPVX(sv), len, "const")) {
-                    sv_free(sv);
-                    if (!sig) {
-                        Perl_ck_warner_d(aTHX_
-                            packWARN(WARN_EXPERIMENTAL__CONST_ATTR),
-                           ":const is experimental"
-                        );
-                        CvANONCONST_on(PL_compcv);
-                        if (!CvANON(PL_compcv))
-                            yyerror(":const is not permitted on named "
-                                    "subroutines");
-                    }
-                }
-                /* After we've set the flags, it could be argued that
-                   we don't need to do the attributes.pm-based setting
-                   process, and shouldn't bother appending recognized
-                   flags.  To experiment with that, uncomment the
-                   following "else".  (Note that's already been
-                   uncommented.  That keeps the above-applied built-in
-                   attributes from being intercepted (and possibly
-                   rejected) by a package's attribute routines, but is
-                   justified by the performance win for the common case
-                   of applying only built-in attributes.) */
-                else
-                    attrs = op_append_elem(OP_LIST, attrs,
-                                        newSVOP(OP_CONST, 0,
-                                                sv));
+                attrs = op_append_elem(OP_LIST, attrs,
+                                    newSVOP(OP_CONST, 0, sv));
             }
             s = skipspace(d);
             if (*s == ':' && s[1] != ':')
@@ -6005,8 +6044,9 @@ yyl_colon(pTHX_ char *s)
         if (*s != ';'
             && *s != '}'
             && !(PL_expect == XOPERATOR
-                 ? (*s == '=' ||  *s == ')')
-                 : (*s == '{' ||  *s == '(')))
+                   /* if an operator is expected, permit =, //= and ||= or ) to end */
+                 ? (*s == '=' || *s == ')' || *s == '/' || *s == '|')
+                 : (*s == '{' || *s == '(')))
         {
             const char q = ((*s == '\'') ? '"' : '\'');
             /* If here for an expression, and parsed no attrs, back off. */
@@ -6135,8 +6175,8 @@ yyl_leftcurly(pTHX_ char *s, const U8 formbrack)
         }
         if (d < PL_bufend && isIDFIRST_lazy_if_safe(d, PL_bufend, UTF)) {
             STRLEN len;
-            d = scan_word(d, PL_tokenbuf + 1, sizeof PL_tokenbuf - 1,
-                          FALSE, &len);
+            d = scan_word6(d, PL_tokenbuf + 1, sizeof PL_tokenbuf - 1,
+                          FALSE, &len, FALSE);
             while (d < PL_bufend && SPACE_OR_TAB(*d))
                 d++;
             if (*d == '}') {
@@ -6178,6 +6218,7 @@ yyl_leftcurly(pTHX_ char *s, const U8 formbrack)
                     /* This hack is to get the ${} in the message. */
                     PL_bufptr = s+1;
                     yyerror("syntax error");
+                    yyquit();
                     break;
                 }
                 OPERATOR(HASHBRACK);
@@ -6597,8 +6638,8 @@ yyl_tilde(pTHX_ char *s)
             TOKEN(0);
         s += 2;
         Perl_ck_warner_d(aTHX_
-            packWARN(WARN_EXPERIMENTAL__SMARTMATCH),
-            "Smartmatch is experimental");
+            packWARN(WARN_DEPRECATED__SMARTMATCH),
+            "Smartmatch is deprecated");
         NCEop(OP_SMARTMATCH);
     }
     s++;
@@ -6921,7 +6962,7 @@ yyl_require(pTHX_ char *s, I32 orig_keyword)
     PL_last_uni = PL_oldbufptr;
     PL_last_lop_op = OP_REQUIRE;
     s = skipspace(s);
-    return REPORT( (int)REQUIRE );
+    return REPORT( (int)KW_REQUIRE );
 }
 
 static int
@@ -6981,7 +7022,7 @@ yyl_foreach(pTHX_ char *s)
             /* skip optional package name, as in "for my abc $x (..)" */
             if (UNLIKELY(isIDFIRST_lazy_if_safe(p, PL_bufend, UTF))) {
                 STRLEN len;
-                p = scan_word(p, PL_tokenbuf, sizeof PL_tokenbuf, TRUE, &len);
+                p = scan_word6(p, PL_tokenbuf, sizeof PL_tokenbuf, TRUE, &len, TRUE);
                 p = skipspace(p);
                 paren_is_valid = FALSE;
             }
@@ -6999,7 +7040,7 @@ yyl_foreach(pTHX_ char *s)
         /* The buffer may have been reallocated, update s */
         s = SvPVX(PL_linestr) + s_off;
     }
-    OPERATOR(FOR);
+    OPERATOR(KW_FOR);
 }
 
 static int
@@ -7007,13 +7048,13 @@ yyl_do(pTHX_ char *s, I32 orig_keyword)
 {
     s = skipspace(s);
     if (*s == '{')
-        PRETERMBLOCK(DO);
+        PRETERMBLOCK(KW_DO);
     if (*s != '\'') {
         char *d;
         STRLEN len;
         *PL_tokenbuf = '&';
-        d = scan_word(s, PL_tokenbuf + 1, sizeof PL_tokenbuf - 1,
-                      1, &len);
+        d = scan_word6(s, PL_tokenbuf + 1, sizeof PL_tokenbuf - 1,
+                      1, &len, TRUE);
         if (len && memNEs(PL_tokenbuf+1, len, "CORE")
          && !keyword(PL_tokenbuf + 1, len, 0)) {
             SSize_t off = s-SvPVX(PL_linestr);
@@ -7029,7 +7070,7 @@ yyl_do(pTHX_ char *s, I32 orig_keyword)
         pl_yylval.ival = 1;
     else
         pl_yylval.ival = 0;
-    OPERATOR(DO);
+    OPERATOR(KW_DO);
 }
 
 static int
@@ -7048,7 +7089,7 @@ yyl_my(pTHX_ char *s, I32 my)
     s = skipspace(s);
     if (isIDFIRST_lazy_if_safe(s, PL_bufend, UTF)) {
         STRLEN len;
-        s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, TRUE, &len);
+        s = scan_word6(s, PL_tokenbuf, sizeof PL_tokenbuf, TRUE, &len, TRUE);
         if (memEQs(PL_tokenbuf, len, "sub"))
             return yyl_sub(aTHX_ s, my);
         PL_in_my_stash = find_in_my_stash(PL_tokenbuf, len);
@@ -7069,7 +7110,7 @@ yyl_my(pTHX_ char *s, I32 my)
              packWARN(WARN_EXPERIMENTAL__DECLARED_REFS),
             "Declaring references is experimental");
     }
-    OPERATOR(MY);
+    OPERATOR(KW_MY);
 }
 
 static int yyl_try(pTHX_ char*);
@@ -7520,8 +7561,8 @@ yyl_just_a_word(pTHX_ char *s, STRLEN len, I32 orig_keyword, struct code c)
 
     if (*s == '\'' || (*s == ':' && s[1] == ':')) {
         STRLEN morelen;
-        s = scan_word(s, PL_tokenbuf + len, sizeof PL_tokenbuf - len,
-                      TRUE, &morelen);
+        s = scan_word6(s, PL_tokenbuf + len, sizeof PL_tokenbuf - len,
+                      TRUE, &morelen, TRUE);
         if (no_op_error) {
             no_op("Bareword",s);
             no_op_error = FALSE;
@@ -7622,12 +7663,6 @@ yyl_just_a_word(pTHX_ char *s, STRLEN len, I32 orig_keyword, struct code c)
         }
         s = SvPVX(PL_linestr) + s_off;
 
-        if (((PL_opargs[PL_last_lop_op] >> OASHIFT) & 7) == OA_FILEREF
-            && !immediate_paren && !c.cv
-            && !FEATURE_BAREWORD_FILEHANDLES_IS_ENABLED) {
-            no_bareword_filehandle(PL_tokenbuf);
-        }
-
         /* If not a declared subroutine, it's an indirect object. */
         /* (But it's an indir obj regardless for sort.) */
         /* Also, if "_" follows a filetest operator, it's a bareword */
@@ -7699,7 +7734,7 @@ yyl_just_a_word(pTHX_ char *s, STRLEN len, I32 orig_keyword, struct code c)
             PL_lex_fakeeof = LEX_FAKEEOF_LOWLOGIC;
         PL_expect = XBLOCKTERM;
         PL_bufptr = s;
-        return REPORT(METHOD);
+        return REPORT(METHCALL0);
     }
 
     /* If followed by a bareword, see if it looks like indir obj. */
@@ -7720,7 +7755,7 @@ yyl_just_a_word(pTHX_ char *s, STRLEN len, I32 orig_keyword, struct code c)
             else SvUTF8_off(c.sv);
         }
         op_free(c.rv2cv_op);
-        if (key == METHOD && !PL_lex_allbrackets
+        if (key == METHCALL0 && !PL_lex_allbrackets
             && PL_lex_fakeeof > LEX_FAKEEOF_LOWLOGIC)
         {
             PL_lex_fakeeof = LEX_FAKEEOF_LOWLOGIC;
@@ -7761,7 +7796,7 @@ yyl_word_or_keyword(pTHX_ char *s, STRLEN len, I32 key, I32 orig_keyword, struct
     case KEY___LINE__:
         FUN0OP(
             newSVOP(OP_CONST, 0,
-                Perl_newSVpvf(aTHX_ "%" IVdf, (IV)CopLINE(PL_curcop)))
+                Perl_newSVpvf(aTHX_ "%" LINE_Tf, CopLINE(PL_curcop)))
         );
 
     case KEY___PACKAGE__:
@@ -7778,9 +7813,12 @@ yyl_word_or_keyword(pTHX_ char *s, STRLEN len, I32 key, I32 orig_keyword, struct
         return yyl_fake_eof(aTHX_ LEX_FAKE_EOF, FALSE, s);
 
     case KEY___SUB__:
+        /* If !CvCLONE(PL_compcv) then rpeep will probably turn this into an
+         * OP_CONST. We need to make it big enough to allow room for that if
+         * so */
         FUN0OP(CvCLONE(PL_compcv)
                     ? newOP(OP_RUNCV, 0)
-                    : newPVOP(OP_RUNCV,0,NULL));
+                    : newSVOP(OP_RUNCV, 0, &PL_sv_undef));
 
     case KEY_AUTOLOAD:
     case KEY_DESTROY:
@@ -7793,6 +7831,16 @@ yyl_word_or_keyword(pTHX_ char *s, STRLEN len, I32 key, I32 orig_keyword, struct
             return yyl_sub(aTHX_ PL_bufptr, key);
         return yyl_just_a_word(aTHX_ s, len, orig_keyword, c);
 
+    case KEY_ADJUST:
+        Perl_ck_warner_d(aTHX_
+            packWARN(WARN_EXPERIMENTAL__CLASS), "ADJUST is experimental");
+
+        /* The way that KEY_CHECK et.al. are handled currently are nothing
+         * short of crazy. We won't copy that model for new phasers, but use
+         * this as an experiment to test if this will work
+         */
+        PHASERBLOCK(KEY_ADJUST);
+
     case KEY_abs:
         UNI(OP_ABS);
 
@@ -7825,11 +7873,21 @@ yyl_word_or_keyword(pTHX_ char *s, STRLEN len, I32 key, I32 orig_keyword, struct
     case KEY_catch:
         Perl_ck_warner_d(aTHX_
             packWARN(WARN_EXPERIMENTAL__TRY), "try/catch is experimental");
-        PREBLOCK(CATCH);
+        PREBLOCK(KW_CATCH);
 
     case KEY_chop:
         UNI(OP_CHOP);
 
+    case KEY_class:
+        Perl_ck_warner_d(aTHX_
+            packWARN(WARN_EXPERIMENTAL__CLASS), "class is experimental");
+
+        s = force_word(s,BAREWORD,FALSE,TRUE);
+        s = skipspace(s);
+        s = force_strict_version(s);
+        PL_expect = XATTRBLOCK;
+        TOKEN(KW_CLASS);
+
     case KEY_continue:
         /* We have to disambiguate the two senses of
           "continue". If the next token is a '{' then
@@ -7838,7 +7896,7 @@ yyl_word_or_keyword(pTHX_ char *s, STRLEN len, I32 key, I32 orig_keyword, struct
          */
         s = skipspace(s);
         if (*s == '{')
-            PREBLOCK(CONTINUE);
+            PREBLOCK(KW_CONTINUE);
         else
             FUN0(OP_CONTINUE);
 
@@ -7884,12 +7942,12 @@ yyl_word_or_keyword(pTHX_ char *s, STRLEN len, I32 key, I32 orig_keyword, struct
         UNI(OP_CHROOT);
 
     case KEY_default:
-        PREBLOCK(DEFAULT);
+        PREBLOCK(KW_DEFAULT);
 
     case KEY_defer:
         Perl_ck_warner_d(aTHX_
             packWARN(WARN_EXPERIMENTAL__DEFER), "defer is experimental");
-        PREBLOCK(DEFER);
+        PREBLOCK(KW_DEFER);
 
     case KEY_do:
         return yyl_do(aTHX_ s, orig_keyword);
@@ -7921,11 +7979,11 @@ yyl_word_or_keyword(pTHX_ char *s, STRLEN len, I32 key, I32 orig_keyword, struct
         LOOPX(OP_DUMP);
 
     case KEY_else:
-        PREBLOCK(ELSE);
+        PREBLOCK(KW_ELSE);
 
     case KEY_elsif:
         pl_yylval.ival = CopLINE(PL_curcop);
-        OPERATOR(ELSIF);
+        OPERATOR(KW_ELSIF);
 
     case KEY_eq:
         if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_COMPARE)
@@ -7983,10 +8041,22 @@ yyl_word_or_keyword(pTHX_ char *s, STRLEN len, I32 key, I32 orig_keyword, struct
     case KEY_endgrent:
         FUN0(OP_EGRENT);
 
+    case KEY_field:
+        /* TODO: maybe this should use the same parser/grammar structures as
+         * `my`, but it's also rather messy because of the `our` conflation
+         */
+        Perl_ck_warner_d(aTHX_
+            packWARN(WARN_EXPERIMENTAL__CLASS), "field is experimental");
+
+        croak_kw_unless_class("field");
+
+        PL_parser->in_my = KEY_field;
+        OPERATOR(KW_FIELD);
+
     case KEY_finally:
         Perl_ck_warner_d(aTHX_
             packWARN(WARN_EXPERIMENTAL__TRY), "try/catch/finally is experimental");
-        PREBLOCK(FINALLY);
+        PREBLOCK(KW_FINALLY);
 
     case KEY_for:
     case KEY_foreach:
@@ -8109,9 +8179,9 @@ yyl_word_or_keyword(pTHX_ char *s, STRLEN len, I32 key, I32 orig_keyword, struct
 
     case KEY_given:
         pl_yylval.ival = CopLINE(PL_curcop);
-        Perl_ck_warner_d(aTHX_ packWARN(WARN_EXPERIMENTAL__SMARTMATCH),
-                         "given is experimental");
-        OPERATOR(GIVEN);
+        Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED__SMARTMATCH),
+                         "given is deprecated");
+        OPERATOR(KW_GIVEN);
 
     case KEY_glob:
         LOP( orig_keyword==KEY_glob ? -OP_GLOB : OP_GLOB, XTERM );
@@ -8123,7 +8193,7 @@ yyl_word_or_keyword(pTHX_ char *s, STRLEN len, I32 key, I32 orig_keyword, struct
         if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_NONEXPR)
             return REPORT(0);
         pl_yylval.ival = CopLINE(PL_curcop);
-        OPERATOR(IF);
+        OPERATOR(KW_IF);
 
     case KEY_index:
         LOP(OP_INDEX,XTERM);
@@ -8156,7 +8226,7 @@ yyl_word_or_keyword(pTHX_ char *s, STRLEN len, I32 key, I32 orig_keyword, struct
         UNI(OP_LCFIRST);
 
     case KEY_local:
-        OPERATOR(LOCAL);
+        OPERATOR(KW_LOCAL);
 
     case KEY_length:
         UNI(OP_LENGTH);
@@ -8226,7 +8296,7 @@ yyl_word_or_keyword(pTHX_ char *s, STRLEN len, I32 key, I32 orig_keyword, struct
 
     case KEY_no:
         s = tokenize_use(0, s);
-        TOKEN(USE);
+        TOKEN(KW_USE_or_NO);
 
     case KEY_not:
         if (*s == '(' || (s = skipspace(s), *s == '('))
@@ -8241,7 +8311,7 @@ yyl_word_or_keyword(pTHX_ char *s, STRLEN len, I32 key, I32 orig_keyword, struct
         s = skipspace(s);
         if (isIDFIRST_lazy_if_safe(s, PL_bufend, UTF)) {
             const char *t;
-            char *d = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
+            char *d = scan_word6(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len, FALSE);
             for (t=d; isSPACE(*t);)
                 t++;
             if ( *t && memCHRs("|&*+-=!?:.", *t) && ckWARN_d(WARN_PRECEDENCE)
@@ -8299,7 +8369,7 @@ yyl_word_or_keyword(pTHX_ char *s, STRLEN len, I32 key, I32 orig_keyword, struct
         s = force_word(s,BAREWORD,FALSE,TRUE);
         s = skipspace(s);
         s = force_strict_version(s);
-        PREBLOCK(PACKAGE);
+        PREBLOCK(KW_PACKAGE);
 
     case KEY_pipe:
         LOP(OP_PIPE_OP,XTERM);
@@ -8515,6 +8585,12 @@ yyl_word_or_keyword(pTHX_ char *s, STRLEN len, I32 key, I32 orig_keyword, struct
     case KEY_substr:
         LOP(OP_SUBSTR,XTERM);
 
+    case KEY_method:
+        /* For now we just treat 'method' identical to 'sub' plus a warning */
+        Perl_ck_warner_d(aTHX_
+            packWARN(WARN_EXPERIMENTAL__CLASS), "method is experimental");
+        return yyl_sub(aTHX_ s, KEY_method);
+
     case KEY_format:
     case KEY_sub:
         return yyl_sub(aTHX_ s, key);
@@ -8570,7 +8646,7 @@ yyl_word_or_keyword(pTHX_ char *s, STRLEN len, I32 key, I32 orig_keyword, struct
         pl_yylval.ival = CopLINE(PL_curcop);
         Perl_ck_warner_d(aTHX_
             packWARN(WARN_EXPERIMENTAL__TRY), "try/catch is experimental");
-        PREBLOCK(TRY);
+        PREBLOCK(KW_TRY);
 
     case KEY_uc:
         UNI(OP_UC);
@@ -8585,13 +8661,13 @@ yyl_word_or_keyword(pTHX_ char *s, STRLEN len, I32 key, I32 orig_keyword, struct
         if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_NONEXPR)
             return REPORT(0);
         pl_yylval.ival = CopLINE(PL_curcop);
-        OPERATOR(UNTIL);
+        OPERATOR(KW_UNTIL);
 
     case KEY_unless:
         if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_NONEXPR)
             return REPORT(0);
         pl_yylval.ival = CopLINE(PL_curcop);
-        OPERATOR(UNLESS);
+        OPERATOR(KW_UNLESS);
 
     case KEY_unlink:
         LOP(OP_UNLINK,XTERM);
@@ -8613,7 +8689,7 @@ yyl_word_or_keyword(pTHX_ char *s, STRLEN len, I32 key, I32 orig_keyword, struct
 
     case KEY_use:
         s = tokenize_use(1, s);
-        TOKEN(USE);
+        TOKEN(KW_USE_or_NO);
 
     case KEY_values:
         UNI(OP_VALUES);
@@ -8626,15 +8702,15 @@ yyl_word_or_keyword(pTHX_ char *s, STRLEN len, I32 key, I32 orig_keyword, struct
             return REPORT(0);
         pl_yylval.ival = CopLINE(PL_curcop);
         Perl_ck_warner_d(aTHX_
-            packWARN(WARN_EXPERIMENTAL__SMARTMATCH),
-            "when is experimental");
-        OPERATOR(WHEN);
+            packWARN(WARN_DEPRECATED__SMARTMATCH),
+            "when is deprecated");
+        OPERATOR(KW_WHEN);
 
     case KEY_while:
         if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_NONEXPR)
             return REPORT(0);
         pl_yylval.ival = CopLINE(PL_curcop);
-        OPERATOR(WHILE);
+        OPERATOR(KW_WHILE);
 
     case KEY_warn:
         PL_hints |= HINT_BLOCK_SCOPE;
@@ -8683,7 +8759,7 @@ yyl_key_core(pTHX_ char *s, STRLEN len, struct code c)
     STRLEN olen = len;
     char *d = s;
     s += 2;
-    s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
+    s = scan_word6(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len, FALSE);
     if ((*s == ':' && s[1] == ':')
         || (!(key = keyword(PL_tokenbuf, len, 1)) && *s == '\''))
     {
@@ -8704,6 +8780,51 @@ yyl_key_core(pTHX_ char *s, STRLEN len, struct code c)
     return yyl_word_or_keyword(aTHX_ s, len, key, orig_keyword, c);
 }
 
+struct Perl_custom_infix_result {
+    struct Perl_custom_infix *def;
+    SV                       *parsedata;
+};
+
+static enum yytokentype tokentype_for_plugop(struct Perl_custom_infix *def)
+{
+    enum Perl_custom_infix_precedence prec = def->prec;
+    if(prec <= INFIX_PREC_LOW)
+        return PLUGIN_LOW_OP;
+    if(prec <= INFIX_PREC_LOGICAL_OR_LOW)
+        return PLUGIN_LOGICAL_OR_LOW_OP;
+    if(prec <= INFIX_PREC_LOGICAL_AND_LOW)
+        return PLUGIN_LOGICAL_AND_LOW_OP;
+    if(prec <= INFIX_PREC_ASSIGN)
+        return PLUGIN_ASSIGN_OP;
+    if(prec <= INFIX_PREC_LOGICAL_OR)
+        return PLUGIN_LOGICAL_OR_OP;
+    if(prec <= INFIX_PREC_LOGICAL_AND)
+        return PLUGIN_LOGICAL_AND_OP;
+    if(prec <= INFIX_PREC_REL)
+        return PLUGIN_REL_OP;
+    if(prec <= INFIX_PREC_ADD)
+        return PLUGIN_ADD_OP;
+    if(prec <= INFIX_PREC_MUL)
+        return PLUGIN_MUL_OP;
+    if(prec <= INFIX_PREC_POW)
+        return PLUGIN_POW_OP;
+    return PLUGIN_HIGH_OP;
+}
+
+OP *
+Perl_build_infix_plugin(pTHX_ OP *lhs, OP *rhs, void *tokendata)
+{
+    PERL_ARGS_ASSERT_BUILD_INFIX_PLUGIN;
+
+    struct Perl_custom_infix_result *result = (struct Perl_custom_infix_result *)tokendata;
+    SAVEFREEPV(result);
+    if(result->parsedata)
+        SAVEFREESV(result->parsedata);
+
+    return (*result->def->build_op)(aTHX_
+        &result->parsedata, lhs, rhs, result->def);
+}
+
 static int
 yyl_keylookup(pTHX_ char *s, GV *gv)
 {
@@ -8717,7 +8838,7 @@ yyl_keylookup(pTHX_ char *s, GV *gv)
     c.gv = gv;
 
     PL_bufptr = s;
-    s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
+    s = scan_word6(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len, FALSE);
 
     /* Some keywords can be followed by any delimiter, including ':' */
     anydelim = word_takes_any_delimiter(PL_tokenbuf, len);
@@ -8764,6 +8885,30 @@ yyl_keylookup(pTHX_ char *s, GV *gv)
         }
     }
 
+    /* Check for plugged-in named operator */
+    if(PLUGINFIX_IS_ENABLED) {
+        struct Perl_custom_infix *def;
+        STRLEN result;
+        result = PL_infix_plugin(aTHX_ PL_tokenbuf, len, &def);
+        if(result) {
+            if(result != len)
+                Perl_croak(aTHX_ "Bad infix plugin result (%zd) - did not consume entire identifier <%s>\n",
+                    result, PL_tokenbuf);
+            PL_bufptr = s = d;
+            struct Perl_custom_infix_result *result;
+            Newx(result, 1, struct Perl_custom_infix_result);
+            result->def = def;
+            result->parsedata = NULL;
+            if(def->parse) {
+                (*def->parse)(aTHX_ &result->parsedata, def);
+                s = PL_bufptr; /* restore local s variable */
+            }
+            pl_yylval.pval = result;
+            CLINE;
+            OPERATOR(tokentype_for_plugop(def));
+        }
+    }
+
     /* Is this a label? */
     if (!anydelim && PL_expect == XSTATE
           && d < PL_bufend && *d == ':' && *(d + 1) != ':') {
@@ -8794,7 +8939,8 @@ yyl_keylookup(pTHX_ char *s, GV *gv)
                                   SVt_PVCV);
                 c.off = 0;
                 if (!c.gv) {
-                    sv_free(c.sv);
+                    ASSUME(c.sv && SvREFCNT(c.sv) == 1);
+                    SvREFCNT_dec(c.sv);
                     c.sv = NULL;
                     return yyl_just_a_word(aTHX_ s, len, 0, c);
                 }
@@ -8842,6 +8988,34 @@ yyl_try(pTHX_ char *s)
     int tok;
 
   retry:
+    /* Check for plugged-in symbolic operator */
+    if(PLUGINFIX_IS_ENABLED && isPLUGINFIX_FIRST(*s)) {
+        struct Perl_custom_infix *def;
+        char *s_end = s, *d = PL_tokenbuf;
+        STRLEN len;
+
+        /* Copy the longest sequence of isPLUGINFIX() chars into PL_tokenbuf */
+        while(s_end < PL_bufend && d < PL_tokenbuf+sizeof(PL_tokenbuf)-1 && isPLUGINFIX(*s_end))
+            *d++ = *s_end++;
+        *d = '\0';
+
+        if((len = (*PL_infix_plugin)(aTHX_ PL_tokenbuf, s_end - s, &def))) {
+            s += len;
+            struct Perl_custom_infix_result *result;
+            Newx(result, 1, struct Perl_custom_infix_result);
+            result->def = def;
+            result->parsedata = NULL;
+            if(def->parse) {
+                PL_bufptr = s;
+                (*def->parse)(aTHX_ &result->parsedata, def);
+                s = PL_bufptr; /* restore local s variable */
+            }
+            pl_yylval.pval = result;
+            CLINE;
+            OPERATOR(tokentype_for_plugop(def));
+        }
+    }
+
     switch (*s) {
     default:
         if (UTF ? isIDFIRST_utf8_safe(s, PL_bufend) : isALNUMC(*s)) {
@@ -8909,7 +9083,7 @@ yyl_try(pTHX_ char *s)
                     ++svp;
                     sv_catpvs(PL_linestr, ";");
                 }
-                sv_free(MUTABLE_SV(PL_preambleav));
+                SvREFCNT_dec(MUTABLE_SV(PL_preambleav));
                 PL_preambleav = NULL;
             }
             if (PL_minus_E)
@@ -8927,7 +9101,7 @@ yyl_try(pTHX_ char *s)
                             && strchr(PL_splitstr + 1, *PL_splitstr))
                         {
                             /* strchr is ok, because -F pattern can't contain
-                             * embeddded NULs */
+                             * embedded NULs */
                             Perl_sv_catpvf(aTHX_ PL_linestr, "our @F=split(%s);", PL_splitstr);
                         }
                         else {
@@ -9388,8 +9562,8 @@ Perl_yylex(pTHX)
     }
     DEBUG_T( {
         SV* tmp = newSVpvs("");
-        PerlIO_printf(Perl_debug_log, "### %" IVdf ":LEX_%s/X%s %s\n",
-            (IV)CopLINE(PL_curcop),
+        PerlIO_printf(Perl_debug_log, "### %" LINE_Tf ":LEX_%s/X%s %s\n",
+            CopLINE(PL_curcop),
             lex_state_names[PL_lex_state],
             exp_name[PL_expect],
             pv_display(tmp, s, strlen(s), 0, 60));
@@ -9459,14 +9633,14 @@ Perl_yylex(pTHX)
             NEXTVAL_NEXTTOKE.ival = OP_JOIN;   /* emulate join($", ...) */
             force_next(FUNC);
         }
-        /* Convert (?{...}) and friends to 'do {...}' */
+        /* Convert (?{...}) or (*{...}) and friends to 'do {...}' */
         if (PL_lex_inpat && *PL_bufptr == '(') {
             PL_parser->lex_shared->re_eval_start = PL_bufptr;
             PL_bufptr += 2;
             if (*PL_bufptr != '{')
                 PL_bufptr++;
             PL_expect = XTERMBLOCK;
-            force_next(DO);
+            force_next(KW_DO);
         }
 
         if (PL_lex_starts++) {
@@ -9697,7 +9871,8 @@ S_pending_ident(pTHX)
                 /* PL_no_myglob is constant */
                 GCC_DIAG_IGNORE_STMT(-Wformat-nonliteral);
                 yyerror_pv(Perl_form(aTHX_ PL_no_myglob,
-                            PL_in_my == KEY_my ? "my" : "state",
+                            PL_in_my == KEY_my ? "my" :
+                            PL_in_my == KEY_field ? "field" : "state",
                             *PL_tokenbuf == '&' ? "subroutine" : "variable",
                             PL_tokenbuf),
                             UTF ? SVf_UTF8 : 0);
@@ -10037,70 +10212,73 @@ S_parse_ident(pTHX_ char **s, char **d, char * const e, int allow_package,
         else
             break;
     }
-    if (UNLIKELY(tick_warn && saw_tick && PL_lex_state == LEX_INTERPNORMAL
-              && !PL_lex_brackets && ckWARN(WARN_SYNTAX))) {
-        char *this_d;
-        char *d2;
-        Newx(this_d, *s - olds + saw_tick + 2, char); /* +2 for $# */
-        d2 = this_d;
-        SAVEFREEPV(this_d);
-        Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
-                         "Old package separator used in string");
-        if (olds[-1] == '#')
-            *d2++ = olds[-2];
-        *d2++ = olds[-1];
-        while (olds < *s) {
-            if (*olds == '\'') {
-                *d2++ = '\\';
-                *d2++ = *olds++;
+    if (UNLIKELY(saw_tick && tick_warn && ckWARN2_d(WARN_SYNTAX, WARN_DEPRECATED__APOSTROPHE_AS_PACKAGE_SEPARATOR))) {
+        if (PL_lex_state == LEX_INTERPNORMAL && !PL_lex_brackets) {
+            char *this_d;
+            char *d2;
+            Newx(this_d, *s - olds + saw_tick + 2, char); /* +2 for $# */
+            d2 = this_d;
+            SAVEFREEPV(this_d);
+
+            Perl_warner(aTHX_ packWARN2(WARN_SYNTAX, WARN_DEPRECATED__APOSTROPHE_AS_PACKAGE_SEPARATOR),
+                        "Old package separator used in string");
+            if (olds[-1] == '#')
+                *d2++ = olds[-2];
+            *d2++ = olds[-1];
+            while (olds < *s) {
+                if (*olds == '\'') {
+                    *d2++ = '\\';
+                    *d2++ = *olds++;
+                }
+                else
+                    *d2++ = *olds++;
             }
-            else
-                *d2++ = *olds++;
+            Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
+                        "\t(Did you mean \"%" UTF8f "\" instead?)\n",
+                        UTF8fARG(is_utf8, d2-this_d, this_d));
+        }
+        else {
+            Perl_warner(aTHX_ packWARN2(WARN_SYNTAX, WARN_DEPRECATED__APOSTROPHE_AS_PACKAGE_SEPARATOR),
+                        "Old package separator \"'\" deprecated");
         }
-        Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
-                         "\t(Did you mean \"%" UTF8f "\" instead?)\n",
-                          UTF8fARG(is_utf8, d2-this_d, this_d));
     }
     return;
 }
 
 /* Returns a NUL terminated string, with the length of the string written to
    *slp
+
+   scan_word6() may be removed once ' in names is removed.
    */
 char *
-Perl_scan_word(pTHX_ char *s, char *dest, STRLEN destlen, int allow_package, STRLEN *slp)
+Perl_scan_word6(pTHX_ char *s, char *dest, STRLEN destlen, int allow_package, STRLEN *slp, bool warn_tick)
 {
     char *d = dest;
     char * const e = d + destlen - 3;  /* two-character token, ending NUL */
     bool is_utf8 = cBOOL(UTF);
 
-    PERL_ARGS_ASSERT_SCAN_WORD;
+    PERL_ARGS_ASSERT_SCAN_WORD6;
 
-    parse_ident(&s, &d, e, allow_package, is_utf8, TRUE, FALSE);
+    parse_ident(&s, &d, e, allow_package, is_utf8, TRUE, warn_tick);
     *d = '\0';
     *slp = d - dest;
     return s;
 }
 
-/* Is the byte 'd' a legal single character identifier name?  'u' is true
- * iff Unicode semantics are to be used.  The legal ones are any of:
- *  a) all ASCII characters except:
- *          1) control and space-type ones, like NUL, SOH, \t, and SPACE;
- *          2) '{'
- *     The final case currently doesn't get this far in the program, so we
- *     don't test for it.  If that were to change, it would be ok to allow it.
- *  b) When not under Unicode rules, any upper Latin1 character
- *  c) Otherwise, when unicode rules are used, all XIDS characters.
- *
- *      Because all ASCII characters have the same representation whether
- *      encoded in UTF-8 or not, we can use the foo_A macros below and '\0' and
- *      '{' without knowing if is UTF-8 or not. */
-#define VALID_LEN_ONE_IDENT(s, e, is_utf8)                                  \
-    (isGRAPH_A(*(s)) || ((is_utf8)                                          \
-                         ? isIDFIRST_utf8_safe(s, e)                        \
-                         : (isGRAPH_L1(*s)                                  \
-                            && LIKELY((U8) *(s) != LATIN1_TO_NATIVE(0xAD)))))
+char *
+Perl_scan_word(pTHX_ char *s, char *dest, STRLEN destlen, int allow_package, STRLEN *slp)
+{
+    PERL_ARGS_ASSERT_SCAN_WORD;
+    return scan_word6(s, dest, destlen, allow_package, slp, FALSE);
+}
 
+/* scan s and extract an identifier ($var) from it if possible
+ * into dest.
+ * XXX: This function has subtle implications on parsing, and
+ * changing how it behaves can cause a variable to change from
+ * being a run time rv2sv call or a compile time binding to a
+ * specific variable name.
+ */
 STATIC char *
 S_scan_ident(pTHX_ char *s, char *dest, STRLEN destlen, I32 ck_uni)
 {
@@ -10110,7 +10288,7 @@ S_scan_ident(pTHX_ char *s, char *dest, STRLEN destlen, I32 ck_uni)
     char *d = dest;
     char * const e = d + destlen - 3;    /* two-character token, ending NUL */
     bool is_utf8 = cBOOL(UTF);
-    I32 orig_copline = 0, tmp_copline = 0;
+    line_t orig_copline = 0, tmp_copline = 0;
 
     PERL_ARGS_ASSERT_SCAN_IDENT;
 
@@ -10164,11 +10342,41 @@ S_scan_ident(pTHX_ char *s, char *dest, STRLEN destlen, I32 ck_uni)
             s = skipspace(s);
         }
     }
+
+
+    /* Extract the first character of the variable name from 's' and
+     * copy it, null terminated into 'd'. Note that this does not
+     * involve checking for just IDFIRST characters, as it allows the
+     * '^' for ${^FOO} type variable names, and it allows all the
+     * characters that are legal in a single character variable name.
+     *
+     * The legal ones are any of:
+     *  a) all ASCII characters except:
+     *          1) control and space-type ones, like NUL, SOH, \t, and SPACE;
+     *          2) '{'
+     *     The final case currently doesn't get this far in the program, so we
+     *     don't test for it.  If that were to change, it would be ok to allow it.
+     *  b) When not under Unicode rules, any upper Latin1 character
+     *  c) Otherwise, when unicode rules are used, all XIDS characters.
+     *
+     *      Because all ASCII characters have the same representation whether
+     *      encoded in UTF-8 or not, we can use the foo_A macros below and '\0' and
+     *      '{' without knowing if is UTF-8 or not. */
+
     if ((s <= PL_bufend - ((is_utf8)
                           ? UTF8SKIP(s)
                           : 1))
-        && VALID_LEN_ONE_IDENT(s, PL_bufend, is_utf8))
-    {
+        && (
+            isGRAPH_A(*s)
+            ||
+            ( is_utf8
+              ? isIDFIRST_utf8_safe(s, PL_bufend)
+              : (isGRAPH_L1(*s)
+                 && LIKELY((U8) *s != LATIN1_TO_NATIVE(0xAD))
+                )
+            )
+        )
+    ){
         if (is_utf8) {
             const STRLEN skip = UTF8SKIP(s);
             STRLEN i;
@@ -10178,24 +10386,27 @@ S_scan_ident(pTHX_ char *s, char *dest, STRLEN destlen, I32 ck_uni)
         }
         else {
             *d = *s++;
-            /* special case to handle ${10}, ${11} the same way we handle ${1} etc */
-            if (isDIGIT(*d)) {
-                bool is_zero= *d == '0' ? TRUE : FALSE;
-                char *digit_start= d;
-                while (s < PL_bufend && isDIGIT(*s)) {
-                    d++;
-                    if (d >= e)
-                        Perl_croak(aTHX_ "%s", ident_too_long);
-                    *d= *s++;
-                }
-                if (is_zero && d - digit_start > 1)
-                    Perl_croak(aTHX_ ident_var_zero_multi_digit);
-            }
             d[1] = '\0';
         }
     }
+
+    /* special case to handle ${10}, ${11} the same way we handle ${1} etc */
+    if (isDIGIT(*d)) {
+        bool is_zero= *d == '0' ? TRUE : FALSE;
+        char *digit_start= d;
+        while (s < PL_bufend && isDIGIT(*s)) {
+            d++;
+            if (d >= e)
+                Perl_croak(aTHX_ "%s", ident_too_long);
+            *d= *s++;
+        }
+        if (is_zero && d - digit_start >= 1) /* d points at the last digit */
+            Perl_croak(aTHX_ ident_var_zero_multi_digit);
+        d[1] = '\0';
+    }
+
     /* Convert $^F, ${^F} and the ^F of ${^FOO} to control characters */
-    if (*d == '^' && *s && isCONTROLVAR(*s)) {
+    else if (*d == '^' && *s && isCONTROLVAR(*s)) {
         *d = toCTRL(*s);
         s++;
     }
@@ -10204,6 +10415,7 @@ S_scan_ident(pTHX_ char *s, char *dest, STRLEN destlen, I32 ck_uni)
        about when not to warn.  */
     else if (ck_uni && bracket == -1)
         check_uni();
+
     if (bracket != -1) {
         bool skip;
         char *s2;
@@ -10462,9 +10674,12 @@ S_scan_pat(pTHX_ char *start, I32 type)
         char *e, *p = SvPV(PL_lex_stuff, len);
         e = p + len;
         for (; p < e; p++) {
-            if (p[0] == '(' && p[1] == '?'
-                && (p[2] == '{' || (p[2] == '?' && p[3] == '{')))
-            {
+            if (p[0] == '(' && (
+                (p[1] == '?' && (p[2] == '{' ||
+                                (p[2] == '?' && p[3] == '{'))) ||
+                (p[1] == '*' && (p[2] == '{' ||
+                                (p[2] == '*' && p[3] == '{')))
+            )){
                 pm->op_pmflags |= PMf_HAS_CV;
                 break;
             }
@@ -10757,7 +10972,6 @@ S_scan_heredoc(pTHX_ char *s)
 #endif
 
     tmpstr = newSV_type(SVt_PVIV);
-    SvGROW(tmpstr, 80);
     if (term == '\'') {
         op_type = OP_CONST;
         SvIV_set(tmpstr, -1);
@@ -10868,7 +11082,7 @@ S_scan_heredoc(pTHX_ char *s)
             goto interminable;
         }
 
-        sv_setpvn(tmpstr,d+1,s-d);
+        sv_setpvn_fresh(tmpstr,d+1,s-d);
         s += len - 1;
         /* the preceding stmt passes a newline */
         PL_parser->herelines++;
@@ -10915,7 +11129,8 @@ S_scan_heredoc(pTHX_ char *s)
         char *oldbufptr_save;
         char *oldoldbufptr_save;
       streaming:
-        SvPVCLEAR(tmpstr);   /* avoid "uninitialized" warning */
+        sv_grow_fresh(tmpstr, 80);
+        SvPVCLEAR_FRESH(tmpstr);   /* avoid "uninitialized" warning */
         term = PL_tokenbuf[1];
         len--;
         linestr_save = PL_linestr; /* must restore this afterwards */
@@ -11073,7 +11288,7 @@ S_scan_heredoc(pTHX_ char *s)
             }
         } /* while */
 
-        /* avoid sv_setsv() as we dont wan't to COW here */
+        /* avoid sv_setsv() as we don't want to COW here */
         sv_setpvn(tmpstr,SvPVX(newstr),SvCUR(newstr));
         Safefree(indent);
         SvREFCNT_dec_NN(newstr);
@@ -11182,7 +11397,7 @@ S_scan_inputsymbol(pTHX_ char *start)
         return s;
     }
     else {
-        bool readline_overriden = FALSE;
+        bool readline_overridden = FALSE;
         GV *gv_readline;
         /* we're in a filehandle read situation */
         d = PL_tokenbuf;
@@ -11191,9 +11406,9 @@ S_scan_inputsymbol(pTHX_ char *start)
         if (!len)
             Copy("ARGV",d,5,char);
 
-        /* Check whether readline() is overriden */
+        /* Check whether readline() is overridden */
         if ((gv_readline = gv_override("readline",8)))
-            readline_overriden = TRUE;
+            readline_overridden = TRUE;
 
         /* if <$fh>, create the ops to turn the variable into a
            filehandle
@@ -11207,16 +11422,15 @@ S_scan_inputsymbol(pTHX_ char *start)
                 if (PAD_COMPNAME_FLAGS_isOUR(tmp)) {
                     HV * const stash = PAD_COMPNAME_OURSTASH(tmp);
                     HEK * const stashname = HvNAME_HEK(stash);
-                    SV * const sym = sv_2mortal(newSVhek(stashname));
+                    SV * const sym = newSVhek_mortal(stashname);
                     sv_catpvs(sym, "::");
                     sv_catpv(sym, d+1);
                     d = SvPVX(sym);
                     goto intro_sym;
                 }
                 else {
-                    OP * const o = newOP(OP_PADSV, 0);
-                    o->op_targ = tmp;
-                    PL_lex_op = readline_overriden
+                    OP * const o = newPADxVOP(OP_PADSV, 0, tmp);
+                    PL_lex_op = readline_overridden
                         ? newUNOP(OP_ENTERSUB, OPf_STACKED,
                                 op_append_elem(OP_LIST, o,
                                     newCVREF(0, newGVOP(OP_GV,0,gv_readline))))
@@ -11230,7 +11444,7 @@ S_scan_inputsymbol(pTHX_ char *start)
                 gv = gv_fetchpv(d,
                                 GV_ADDMULTI | ( UTF ? SVf_UTF8 : 0 ),
                                 SVt_PV);
-                PL_lex_op = readline_overriden
+                PL_lex_op = readline_overridden
                     ? newUNOP(OP_ENTERSUB, OPf_STACKED,
                             op_append_elem(OP_LIST,
                                 newUNOP(OP_RV2SV, 0, newGVOP(OP_GV, 0, gv)),
@@ -11247,7 +11461,7 @@ S_scan_inputsymbol(pTHX_ char *start)
            (<Foo::BAR> or <FOO>) so build a simple readline OP */
         else {
             GV * const gv = gv_fetchpv(d, GV_ADD | ( UTF ? SVf_UTF8 : 0 ), SVt_PVIO);
-            PL_lex_op = readline_overriden
+            PL_lex_op = readline_overridden
                 ? newUNOP(OP_ENTERSUB, OPf_STACKED,
                         op_append_elem(OP_LIST,
                             newGVOP(OP_GV, 0, gv),
@@ -11441,19 +11655,19 @@ Perl_scan_str(pTHX_ char *start, int keep_bracketed_quoted, int keep_delims, int
                            : * (U8 *) close_delim_str;
     }
     else {  /* Here, the delimiter isn't paired, hence the close is the same as
-               the open; and has aready been set up.  But make sure it isn't
+               the open; and has already been set up.  But make sure it isn't
                deprecated to use this particular delimiter, as we plan
                eventually to make it paired. */
         if (ninstr(deprecated_opening_delims, deprecated_delims_end,
                    open_delim_str, open_delim_str + delim_byte_len))
         {
-            Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED),
+            Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED__DELIMITER_WILL_BE_PAIRED),
                              "Use of '%" UTF8f "' is deprecated as a string delimiter",
                              UTF8fARG(UTF, delim_byte_len, open_delim_str));
         }
 
         /* Note that a NUL may be used as a delimiter, and this happens when
-         * delimitting an empty string, and no special handling for it is
+         * delimiting an empty string, and no special handling for it is
          * needed, as ninstr() calls are used */
     }
 
@@ -11466,7 +11680,7 @@ Perl_scan_str(pTHX_ char *start, int keep_bracketed_quoted, int keep_delims, int
     /* create a new SV to hold the contents.  79 is the SV's initial length.
        What a random number. */
     sv = newSV_type(SVt_PVIV);
-    SvGROW(sv, 79);
+    sv_grow_fresh(sv, 79);
     SvIV_set(sv, close_delim_code);
     (void)SvPOK_only(sv);              /* validate pointer */
 
@@ -11589,7 +11803,8 @@ Perl_scan_str(pTHX_ char *start, int keep_bracketed_quoted, int keep_delims, int
         COPLINE_INC_WITH_HERELINES;
         PL_bufptr = PL_bufend;
         if (!lex_next_chunk(0)) {
-            sv_free(sv);
+            ASSUME(sv);
+            SvREFCNT_dec(sv);
             CopLINE_set(PL_curcop, (line_t)PL_multi_start);
             return NULL;
         }
@@ -11895,7 +12110,7 @@ Perl_scan_num(pTHX_ const char *start, YYSTYPE* lvalp)
                     NV nv_mult = 1.0;
 #endif
                     bool accumulate = TRUE;
-                    U8 b;
+                    U8 b = 0; /* silence compiler warning */
                     int lim = 1 << shift;
                     for (h++; ((isXDIGIT(*h) && (b = XDIGIT_VALUE(*h)) < lim) ||
                                *h == '_'); h++) {
@@ -12341,8 +12556,12 @@ S_scan_formline(pTHX_ char *s)
             }
         }
         eol = (char *) memchr(s,'\n',PL_bufend-s);
-        if (!eol++)
-                eol = PL_bufend;
+        if (! eol) {
+            eol = PL_bufend;
+        }
+        else {
+            eol++;
+        }
         if (*s != '#') {
             char *t;
             for (t = s; t < eol; t++) {
@@ -12393,7 +12612,7 @@ S_scan_formline(pTHX_ char *s)
             if (*s2 == '{') {
                 PL_expect = XTERMBLOCK;
                 NEXTVAL_NEXTTOKE.ival = 0;
-                force_next(DO);
+                force_next(KW_DO);
             }
             NEXTVAL_NEXTTOKE.ival = 0;
             force_next(FORMLBRACK);
@@ -12413,11 +12632,33 @@ S_scan_formline(pTHX_ char *s)
     return s;
 }
 
+/*
+=for apidoc start_subparse
+
+Set things up for parsing a subroutine.
+
+If C<is_format> is non-zero, the input is to be considered a format sub
+(a specialised sub used to implement perl's C<format> feature); else a
+normal C<sub>.
+
+C<flags> are added to the flags for C<PL_compcv>.  C<flags> may include the
+C<CVf_IsMETHOD> bit, which causes the new subroutine to be a method.
+
+This returns the value of C<PL_savestack_ix> that was in effect upon entry to
+the function;
+
+=cut
+*/
+
 I32
 Perl_start_subparse(pTHX_ I32 is_format, U32 flags)
 {
     const I32 oldsavestack_ix = PL_savestack_ix;
     CV* const outsidecv = PL_compcv;
+    bool is_method = flags & CVf_IsMETHOD;
+
+    if (is_method)
+        croak_kw_unless_class("method");
 
     SAVEI32(PL_subline);
     save_item(PL_subname);
@@ -12432,10 +12673,98 @@ Perl_start_subparse(pTHX_ I32 is_format, U32 flags)
     CvOUTSIDE_SEQ(PL_compcv) = PL_cop_seqmax;
     if (outsidecv && CvPADLIST(outsidecv))
         CvPADLIST(PL_compcv)->xpadl_outid = CvPADLIST(outsidecv)->xpadl_id;
+    if (is_method)
+        class_prepare_method_parse(PL_compcv);
 
     return oldsavestack_ix;
 }
 
+/* If o represents a builtin attribute, apply it to cv and returns true.
+ * Otherwise does nothing and returns false
+ */
+
+STATIC bool
+S_apply_builtin_cv_attribute(pTHX_ CV *cv, OP *o)
+{
+    assert(o->op_type == OP_CONST);
+    SV *sv = cSVOPo_sv;
+    STRLEN len = SvCUR(sv);
+
+    /* NOTE: any CV attrs applied here need to be part of
+       the CVf_BUILTIN_ATTRS define in cv.h! */
+
+    if(memEQs(SvPVX(sv), len, "lvalue"))
+        CvLVALUE_on(cv);
+    else if(memEQs(SvPVX(sv), len, "method"))
+        CvNOWARN_AMBIGUOUS_on(cv);
+    else if(memEQs(SvPVX(sv), len, "const")) {
+        Perl_ck_warner_d(aTHX_
+            packWARN(WARN_EXPERIMENTAL__CONST_ATTR),
+           ":const is experimental"
+        );
+        CvANONCONST_on(cv);
+        if (!CvANON(cv))
+            yyerror(":const is not permitted on named subroutines");
+    }
+    else
+        return false;
+
+    return true;
+}
+
+/*
+=for apidoc apply_builtin_cv_attributes
+
+Given an OP_LIST containing attribute definitions, filter it for known builtin
+attributes to apply to the cv, returning a possibly-smaller list containing
+just the remaining ones.
+
+=cut
+*/
+
+OP *
+Perl_apply_builtin_cv_attributes(pTHX_ CV *cv, OP *attrlist)
+{
+    PERL_ARGS_ASSERT_APPLY_BUILTIN_CV_ATTRIBUTES;
+
+    if(!attrlist)
+        return attrlist;
+
+    if(attrlist->op_type != OP_LIST) {
+        /* Not in fact a list but just a single attribute */
+        if(S_apply_builtin_cv_attribute(aTHX_ cv, attrlist)) {
+            op_free(attrlist);
+            return NULL;
+        }
+
+        return attrlist;
+    }
+
+    OP *prev = cLISTOPx(attrlist)->op_first;
+    assert(prev->op_type == OP_PUSHMARK);
+    OP *o = OpSIBLING(prev);
+
+    OP *next;
+    for(; o; o = next) {
+        next = OpSIBLING(o);
+
+        if(S_apply_builtin_cv_attribute(aTHX_ cv, o)) {
+            op_sibling_splice(attrlist, prev, 1, NULL);
+            op_free(o);
+        }
+        else {
+            prev = o;
+        }
+    }
+
+    if(OpHAS_SIBLING(cLISTOPx(attrlist)->op_first))
+        return attrlist;
+
+    /* The list is now entirely empty, we might as well discard it */
+    op_free(attrlist);
+    return NULL;
+}
+
 
 /* Do extra initialisation of a CV (typically one just created by
  * start_subparse()) if that CV is for a named sub
@@ -12480,16 +12809,26 @@ S_yywarn(pTHX_ const char *const s, U32 flags)
 }
 
 void
-Perl_abort_execution(pTHX_ const char * const msg, const char * const name)
+Perl_abort_execution(pTHX_ SV* msg_sv, const char * const name)
 {
     PERL_ARGS_ASSERT_ABORT_EXECUTION;
 
-    if (PL_minus_c)
-        Perl_croak(aTHX_ "%s%s had compilation errors.\n", msg, name);
-    else {
-        Perl_croak(aTHX_
-                "%sExecution of %s aborted due to compilation errors.\n", msg, name);
+    if (msg_sv) {
+        if (PL_minus_c)
+            Perl_croak(aTHX_ "%" SVf "%s had compilation errors.\n", SVfARG(msg_sv), name);
+        else {
+            Perl_croak(aTHX_
+                    "%" SVf "Execution of %s aborted due to compilation errors.\n", SVfARG(msg_sv), name);
+        }
+    } else {
+        if (PL_minus_c)
+            Perl_croak(aTHX_ "%s had compilation errors.\n", name);
+        else {
+            Perl_croak(aTHX_
+                    "Execution of %s aborted due to compilation errors.\n", name);
+        }
     }
+
     NOT_REACHED; /* NOTREACHED */
 }
 
@@ -12506,14 +12845,16 @@ int
 Perl_yyerror(pTHX_ const char *const s)
 {
     PERL_ARGS_ASSERT_YYERROR;
-    return yyerror_pvn(s, strlen(s), 0);
+    int r = yyerror_pvn(s, strlen(s), 0);
+    return r;
 }
 
 int
 Perl_yyerror_pv(pTHX_ const char *const s, U32 flags)
 {
     PERL_ARGS_ASSERT_YYERROR_PV;
-    return yyerror_pvn(s, strlen(s), flags);
+    int r = yyerror_pvn(s, strlen(s), flags);
+    return r;
 }
 
 int
@@ -12576,9 +12917,9 @@ Perl_yyerror_pvn(pTHX_ const char *const s, STRLEN len, U32 flags)
                 Perl_sv_catpvf(aTHX_ where_sv, "\\%03o", yychar & 255);
         }
         msg = newSVpvn_flags(s, len, (flags & SVf_UTF8) | SVs_TEMP);
-        Perl_sv_catpvf(aTHX_ msg, " at %s line %" IVdf ", ",
+        Perl_sv_catpvf(aTHX_ msg, " at %s line %" LINE_Tf ", ",
             OutCopFILE(PL_curcop),
-            (IV)(PL_parser->preambling == NOLINE
+            (PL_parser->preambling == NOLINE
                    ? CopLINE(PL_curcop)
                    : PL_parser->preambling));
         if (context)
@@ -12591,8 +12932,8 @@ Perl_yyerror_pvn(pTHX_ const char *const s, STRLEN len, U32 flags)
         {
             Perl_sv_catpvf(aTHX_ msg,
             "  (Might be a runaway multi-line %c%c string starting on"
-            " line %" IVdf ")\n",
-                    (int)PL_multi_open,(int)PL_multi_close,(IV)PL_multi_start);
+            " line %" LINE_Tf ")\n",
+                    (int)PL_multi_open,(int)PL_multi_close,(line_t)PL_multi_start);
             PL_multi_end = 0;
         }
         if (PL_in_eval & EVAL_WARNONLY) {
@@ -12603,24 +12944,11 @@ Perl_yyerror_pvn(pTHX_ const char *const s, STRLEN len, U32 flags)
             qerror(msg);
         }
     }
-    if (s == NULL || PL_error_count >= 10) {
-        const char * msg = "";
-        const char * const name = OutCopFILE(PL_curcop);
+    /* if there was no message then this is a yyquit(), which is actualy handled
+     * by qerror() with a NULL argument */
+    if (s == NULL)
+        qerror(NULL);
 
-        if (PL_in_eval) {
-            SV * errsv = ERRSV;
-            if (SvCUR(errsv)) {
-                msg = Perl_form(aTHX_ "%" SVf, SVfARG(errsv));
-            }
-        }
-
-        if (s == NULL) {
-            abort_execution(msg, name);
-        }
-        else {
-            Perl_croak(aTHX_ "%s%s has too many errors.\n", msg, name);
-        }
-    }
     PL_in_my = 0;
     PL_in_my_stash = NULL;
     return 0;
@@ -12983,6 +13311,18 @@ Perl_keyword_plugin_standard(pTHX_
     return KEYWORD_PLUGIN_DECLINE;
 }
 
+STRLEN
+Perl_infix_plugin_standard(pTHX_
+        char *operator_ptr, STRLEN operator_len, struct Perl_custom_infix **def)
+{
+    PERL_ARGS_ASSERT_INFIX_PLUGIN_STANDARD;
+    PERL_UNUSED_CONTEXT;
+    PERL_UNUSED_ARG(operator_ptr);
+    PERL_UNUSED_ARG(operator_len);
+    PERL_UNUSED_ARG(def);
+    return 0;
+}
+
 /*
 =for apidoc_section $lexer
 =for apidoc wrap_keyword_plugin
@@ -13056,6 +13396,45 @@ Perl_wrap_keyword_plugin(pTHX_
     KEYWORD_PLUGIN_MUTEX_UNLOCK;
 }
 
+/*
+=for apidoc wrap_infix_plugin
+
+B<NOTE:> This API exists entirely for the purpose of making the CPAN module
+C<XS::Parse::Infix> work. It is not expected that additional modules will make
+use of it; rather, that they should use C<XS::Parse::Infix> to provide parsing
+of new infix operators.
+
+Puts a C function into the chain of infix plugins.  This is the preferred
+way to manipulate the L</PL_infix_plugin> variable.  C<new_plugin> is a
+pointer to the C function that is to be added to the infix plugin chain, and
+C<old_plugin_p> points to a storage location where a pointer to the next
+function in the chain will be stored.  The value of C<new_plugin> is written
+into the L</PL_infix_plugin> variable, while the value previously stored there
+is written to C<*old_plugin_p>.
+
+Direct access to L</PL_infix_plugin> should be avoided.
+
+=cut
+*/
+
+void
+Perl_wrap_infix_plugin(pTHX_
+    Perl_infix_plugin_t new_plugin, Perl_infix_plugin_t *old_plugin_p)
+{
+
+    PERL_UNUSED_CONTEXT;
+    PERL_ARGS_ASSERT_WRAP_INFIX_PLUGIN;
+    if (*old_plugin_p) return;
+    /* We use the same mutex as for PL_keyword_plugin as it's so rare either
+     * of them is actually updated; no need for a dedicated one each */
+    KEYWORD_PLUGIN_MUTEX_LOCK;
+    if (!*old_plugin_p) {
+        *old_plugin_p = PL_infix_plugin;
+        PL_infix_plugin = new_plugin;
+    }
+    KEYWORD_PLUGIN_MUTEX_UNLOCK;
+}
+
 #define parse_recdescent(g,p) S_parse_recdescent(aTHX_ g,p)
 static void
 S_parse_recdescent(pTHX_ int gramtype, I32 fakeeof)
@@ -13352,7 +13731,7 @@ Perl_parse_label(pTHX_ U32 flags)
         t = s = PL_bufptr;
         if (!isIDFIRST_lazy_if_safe(s, PL_bufend, UTF))
             goto no_label;
-        t = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &wlen);
+        t = scan_word6(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &wlen, FALSE);
         if (word_takes_any_delimiter(s, wlen))
             goto no_label;
         bufptr_pos = s - SvPVX(PL_linestr);
index 4ae4e96..47d586c 100644 (file)
@@ -50,7 +50,7 @@
  *     This symbol, if defined, indicates that the chsize routine is available
  *     to truncate files.  You might need a -lx to get this routine.
  */
-/*#define      HAS_CHSIZE              / **/
+/*#define HAS_CHSIZE           / **/
 
 /* HAS_CRYPT:
  *     This symbol, if defined, indicates that the crypt routine is available
  *     This symbol, if defined, indicates that the mbstowcs routine is
  *     available to convert a multibyte string into a wide character string.
  */
-/*#define      HAS_MBSTOWCS            / **/
+/*#define HAS_MBSTOWCS         / **/
 
 /* HAS_MBTOWC:
  *     This symbol, if defined, indicates that the mbtowc routine is available
  *     This symbol, if defined, indicates to the C program that it should
  *     include <arpa/inet.h> to get inet_addr and friends declarations.
  */
-/*#define      I_ARPA_INET             / **/
+/*#define I_ARPA_INET          / **/
 
 /* I_DBM:
  *     This symbol, if defined, indicates that <dbm.h> exists and should
  *     This symbol, if defined, indicates to the C program that it should
  *     include <locale.h>.
  */
-/*#define      I_LOCALE                / **/
+/*#define I_LOCALE             / **/
 
 /* I_NETINET_IN:
  *     This symbol, if defined, indicates to the C program that it should
  *     This symbol, if defined, indicates the <sys/sockio.h> should be included
  *     to get socket ioctl options, like SIOCATMARK.
  */
-/*#define      I_SYS_IOCTL             / **/
+/*#define I_SYS_IOCTL          / **/
 /*#define I_SYS_SOCKIO / **/
 
 /* I_SYS_NDIR:
  *     This symbol, if defined, indicates to the C program that it should
  *     include <sys/stat.h>.
  */
-#define        I_SYS_STAT              /**/
+#define I_SYS_STAT             /**/
 
 /* I_SYS_TIMES:
  *     This symbol, if defined, indicates to the C program that it should
  *     include <sys/times.h>.
  */
-/*#define      I_SYS_TIMES             / **/
+/*#define I_SYS_TIMES          / **/
 
 /* I_SYS_TYPES:
  *     This symbol, if defined, indicates to the C program that it should
  *     include <sys/types.h>.
  */
-/*#define      I_SYS_TYPES             / **/
+/*#define I_SYS_TYPES          / **/
 
 /* I_SYS_UN:
  *     This symbol, if defined, indicates to the C program that it should
  *     This symbol is defined if the C compiler can cast negative
  *     or large floating point numbers to 32-bit ints.
  */
-/*#define      CASTI32         / **/
+/*#define CASTI32              / **/
 
 /* CASTNEGFLOAT:
  *     This symbol is defined if the C compiler can cast negative
  *             2 = couldn't cast >= 0x80000000
  *             4 = couldn't cast in argument expression list
  */
-/*#define      CASTNEGFLOAT            / **/
+/*#define CASTNEGFLOAT         / **/
 #define CASTFLAGS 0            /**/
 
 /* VOID_CLOSEDIR:
  *     This symbol, if defined, indicates that siginfo_t has the
  *     si_value member
  */
-/*#define      HAS_SIGINFO_SI_ERRNO    / **/
-/*#define      HAS_SIGINFO_SI_PID      / **/
-/*#define      HAS_SIGINFO_SI_UID      / **/
-/*#define      HAS_SIGINFO_SI_ADDR     / **/
-/*#define      HAS_SIGINFO_SI_STATUS   / **/
-/*#define      HAS_SIGINFO_SI_BAND     / **/
-/*#define      HAS_SIGINFO_SI_VALUE    / **/
+/*#define HAS_SIGINFO_SI_ERRNO / **/
+/*#define HAS_SIGINFO_SI_PID   / **/
+/*#define HAS_SIGINFO_SI_UID   / **/
+/*#define HAS_SIGINFO_SI_ADDR  / **/
+/*#define HAS_SIGINFO_SI_STATUS        / **/
+/*#define HAS_SIGINFO_SI_BAND  / **/
+/*#define HAS_SIGINFO_SI_VALUE / **/
 
 /* HAS_SIGSETJMP:
  *     This variable indicates to the C program that the sigsetjmp()
  *     This symbol, if defined, indicates that this system uses
  *     EBCDIC encoding.
  */
-/*#define      EBCDIC          / **/
+/*#define EBCDIC               / **/
 
 /* ARCHLIB:
  *     This variable, if defined, holds the name of the directory in
  *     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 "/usr/local/lib/perl5/5.36/unknown"          / **/
-/*#define ARCHLIB_EXP "/usr/local/lib/perl5/5.36/unknown"              / **/
+/*#define ARCHLIB "/usr/local/lib/perl5/5.38/unknown"          / **/
+/*#define ARCHLIB_EXP "/usr/local/lib/perl5/5.38/unknown"              / **/
 
 /* 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 "/usr/local/lib/perl5/5.36"            /**/
-#define PRIVLIB_EXP "/usr/local/lib/perl5/5.36"                /**/
+#define PRIVLIB "/usr/local/lib/perl5/5.38"            /**/
+#define PRIVLIB_EXP "/usr/local/lib/perl5/5.38"                /**/
 
 /* 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 "/usr/local/lib/perl5/5.36/unknown"         / **/
-/*#define SITEARCH_EXP "/usr/local/lib/perl5/5.36/unknown"             / **/
+/*#define SITEARCH "/usr/local/lib/perl5/5.38/unknown"         / **/
+/*#define SITEARCH_EXP "/usr/local/lib/perl5/5.38/unknown"             / **/
 
 /* 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 "/usr/local/lib/perl5/5.36"            /**/
-#define SITELIB_EXP "/usr/local/lib/perl5/5.36"                /**/
+#define SITELIB "/usr/local/lib/perl5/5.38"            /**/
+#define SITELIB_EXP "/usr/local/lib/perl5/5.38"                /**/
 #define SITELIB_STEM "/usr/local/lib/perl5"            /**/
 
 /* PERL_VENDORARCH:
  *     Can we handle GCC attribute for functions that should always be
  *     inlined.
  */
+/* HASATTRIBUTE_VISIBILITY:
+ *     Can we handle GCC attribute for functions that should have a
+ *     different visibility.
+ */
 /*#define HASATTRIBUTE_DEPRECATED      / **/
 /*#define HASATTRIBUTE_FORMAT  / **/
 /*#define PRINTF_FORMAT_NULL_OK        / **/
 /*#define HASATTRIBUTE_UNUSED  / **/
 /*#define HASATTRIBUTE_WARN_UNUSED_RESULT      / **/
 /*#define HASATTRIBUTE_ALWAYS_INLINE   / **/
+/*#define HASATTRIBUTE_VISIBILITY      / **/
 
 /* HAS_BACKTRACE:
  *     This symbol, if defined, indicates that the backtrace() routine is
  *     This symbol, if defined, indicates that the system supports filenames
  *     longer than 14 characters.
  */
-/*#define      FLEXFILENAMES           / **/
+/*#define FLEXFILENAMES                / **/
 
 /* HAS_GETGRENT:
  *     This symbol, if defined, indicates that the getgrent routine is
  *     This symbol, if defined, indicates the availability of
  *     struct ipv6_mreq_source;
  */
-/*#define      HAS_SOCKET              / **/
-/*#define      HAS_SOCKETPAIR  / **/
-/*#define      HAS_SOCKADDR_SA_LEN     / **/
-/*#define      HAS_SOCKADDR_IN6        / **/
-/*#define      HAS_SOCKADDR_STORAGE    / **/
-/*#define      HAS_SIN6_SCOPE_ID       / **/
-/*#define      HAS_IP_MREQ     / **/
-/*#define      HAS_IP_MREQ_SOURCE      / **/
-/*#define      HAS_IPV6_MREQ   / **/
-/*#define      HAS_IPV6_MREQ_SOURCE    / **/
+/*#define HAS_SOCKET           / **/
+/*#define HAS_SOCKETPAIR       / **/
+/*#define HAS_SOCKADDR_SA_LEN  / **/
+/*#define HAS_SOCKADDR_IN6     / **/
+/*#define HAS_SOCKADDR_STORAGE / **/
+/*#define HAS_SIN6_SCOPE_ID    / **/
+/*#define HAS_IP_MREQ  / **/
+/*#define HAS_IP_MREQ_SOURCE   / **/
+/*#define HAS_IPV6_MREQ        / **/
+/*#define HAS_IPV6_MREQ_SOURCE / **/
 
 /* USE_STAT_BLOCKS:
  *     This symbol is defined if this system has a stat structure declaring
  *     This symbol, if defined, indicates that <sys/uio.h> exists and
  *     should be included.
  */
-/*#define      I_SYSUIO                / **/
+/*#define I_SYSUIO             / **/
 
 /* I_TERMIO:
  *     This symbol, if defined, indicates that the program should include
  *     Perl has been cross-compiled to.  Undefined if not a cross-compile.
  */
 #ifndef USE_CROSS_COMPILE
-/*#define      USE_CROSS_COMPILE       / **/
-#define        PERL_TARGETARCH ""      /**/
+/*#define USE_CROSS_COMPILE    / **/
+#define PERL_TARGETARCH        ""      /**/
 #endif
 
 /* PERL_USE_DEVEL:
  *     -Dusedevel, to enable development features.  This should not be
  *     done for production builds.
  */
-/*#define      PERL_USE_DEVEL          / **/
+/*#define PERL_USE_DEVEL               / **/
 
 /* HAS_ATOLF:
  *     This symbol, if defined, indicates that the atolf routine is
 /* HAS_C99_VARIADIC_MACROS:
  *     If defined, the compiler supports C99 variadic macros.
  */
-/*#define      HAS_C99_VARIADIC_MACROS / **/
+/*#define HAS_C99_VARIADIC_MACROS      / **/
 
 /* HAS_CLASS:
  *     This symbol, if defined, indicates that the class routine is
  *     to the program to supply one.  A good guess is
  *             extern int dbminit(char *);
  */
-/*#define      HAS_DBMINIT_PROTO       / **/
+/*#define HAS_DBMINIT_PROTO    / **/
 
 /* HAS_DIR_DD_FD:
- *     This symbol, if defined, indicates that the the DIR* dirstream
+ *     This symbol, if defined, indicates that the DIR* dirstream
  *     structure contains a member variable named dd_fd.
  */
 /*#define HAS_DIR_DD_FD                / **/
  *     makes sense if you *have* dlsym, which we will presume is the
  *     case if you're using dl_dlopen.xs.
  */
-/*#define      DLSYM_NEEDS_UNDERSCORE  / **/
+/*#define DLSYM_NEEDS_UNDERSCORE       / **/
 
 /* HAS_DUP3:
  *     This symbol, if defined, indicates that the dup3 routine is
  *     to the program to supply one.  A good guess is
  *             extern int flock(int, int);
  */
-/*#define      HAS_FLOCK_PROTO / **/
+/*#define HAS_FLOCK_PROTO      / **/
 
 /* HAS_FMA:
  *     This symbol, if defined, indicates that the fma routine is
  *       FP_NAN        NaN
  *
  */
-/*#define      HAS_FPCLASSIFY          / **/
-/*#define      HAS_FP_CLASSIFY         / **/
+/*#define HAS_FPCLASSIFY               / **/
+/*#define HAS_FP_CLASSIFY              / **/
 
 /* HAS_FPCLASSL:
  *     This symbol, if defined, indicates that the fpclassl routine is
 /* HAS_FPOS64_T:
  *     This symbol will be defined if the C compiler supports fpos64_t.
  */
-/*#define      HAS_FPOS64_T    / **/
+/*#define HAS_FPOS64_T / **/
 
 /* HAS_FREXPL:
  *     This symbol, if defined, indicates that the frexpl routine is
 /* HAS_UNLINKAT:
  *     This symbol is defined if the unlinkat() routine is available.
  */
-/*#define      HAS_FCHMODAT    / **/
-/*#define      HAS_LINKAT      / **/
-/*#define      HAS_OPENAT      / **/
-/*#define      HAS_RENAMEAT    / **/
-/*#define      HAS_UNLINKAT    / **/
+/*#define HAS_FCHMODAT / **/
+/*#define HAS_LINKAT   / **/
+/*#define HAS_OPENAT   / **/
+/*#define HAS_RENAMEAT / **/
+/*#define HAS_UNLINKAT / **/
 
 /* HAS_FSEEKO:
  *     This symbol, if defined, indicates that the fseeko routine is
  *     j0l() function is available for Bessel functions of the first
  *     kind of the order zero, for long doubles.
  */
-/*#define      HAS_J0          / **/
-/*#define      HAS_J0L         / **/
+/*#define HAS_J0               / **/
+/*#define HAS_J0L              / **/
 
 /* HAS_LC_MONETARY_2008:
  *     This symbol, if defined, indicates that the localeconv routine is
  *     This symbol, if defined, indicates that the C program should
  *     include <xlocale.h> to get newlocale() and its friends.
  */
-/*#define      HAS_NEWLOCALE   / **/
-/*#define      HAS_FREELOCALE  / **/
-/*#define      HAS_USELOCALE   / **/
-/*#define      HAS_DUPLOCALE   / **/
-/*#define      HAS_QUERYLOCALE / **/
-/*#define      NEED_XLOCALE_H  / **/
-/*#define      I_XLOCALE               / **/
+/*#define HAS_NEWLOCALE        / **/
+/*#define HAS_FREELOCALE       / **/
+/*#define HAS_USELOCALE        / **/
+/*#define HAS_DUPLOCALE        / **/
+/*#define HAS_QUERYLOCALE      / **/
+/*#define NEED_XLOCALE_H       / **/
+/*#define I_XLOCALE               / **/
 
 /* HAS_NEXTAFTER:
  *     This symbol, if defined, indicates that the nextafter routine is
 /* HAS_OFF64_T:
  *     This symbol will be defined if the C compiler supports off64_t.
  */
-/*#define      HAS_OFF64_T             / **/
+/*#define HAS_OFF64_T          / **/
 
 /* HAS_PIPE2:
  *     This symbol, if defined, indicates that the pipe2 routine is
 /* HAS_PTRDIFF_T:
  *     This symbol will be defined if the C compiler supports ptrdiff_t.
  */
-#define        HAS_PTRDIFF_T           /**/
+#define HAS_PTRDIFF_T          /**/
 
 /* HAS_READV:
  *     This symbol, if defined, indicates that the readv routine is
  *             extern void* sbrk(int);
  *             extern void* sbrk(size_t);
  */
-/*#define      HAS_SBRK_PROTO  / **/
+/*#define HAS_SBRK_PROTO       / **/
 
 /* HAS_SCALBN:
  *     This symbol, if defined, indicates that the scalbn routine is
  */
 /*#define HAS_SENDMSG          / **/
 
+/* HAS_SETENV:
+ *     This symbol, if defined, indicates that the setenv routine is
+ *     available for use.
+ */
+/*#define HAS_SETENV           / **/
+
 /* HAS_SETITIMER:
  *     This symbol, if defined, indicates that the setitimer routine is
  *     available to set interval timers.
  *     be used.
  */
 #ifndef USE_SITECUSTOMIZE
-/*#define      USE_SITECUSTOMIZE               / **/
+/*#define USE_SITECUSTOMIZE            / **/
 #endif
 
 /* HAS_SNPRINTF:
  *     to the program to supply one.  A good guess is
  *             extern int sockatmark(int);
  */
-/*#define      HAS_SOCKATMARK_PROTO    / **/
+/*#define HAS_SOCKATMARK_PROTO / **/
 
 /* HAS_SOCKS5_INIT:
  *     This symbol, if defined, indicates that the socks5_init routine is
  *     to the program to supply one.  Good guesses are
  *             extern int setresgid(uid_t ruid, uid_t euid, uid_t suid);
  */
-/*#define      HAS_SETRESGID_PROTO     / **/
+/*#define HAS_SETRESGID_PROTO  / **/
 
 /* HAS_SETRESUID_PROTO:
  *     This symbol, if defined, indicates that the system provides
  *     to the program to supply one.  Good guesses are
  *             extern int setresuid(uid_t ruid, uid_t euid, uid_t suid);
  */
-/*#define      HAS_SETRESUID_PROTO     / **/
+/*#define HAS_SETRESUID_PROTO  / **/
 
 /* HAS_STRUCT_STATFS_F_FLAGS:
  *     This symbol, if defined, indicates that the struct statfs
  *             extern int syscall(int,  ...);
  *             extern int syscall(long, ...);
  */
-/*#define      HAS_SYSCALL_PROTO       / **/
+/*#define HAS_SYSCALL_PROTO    / **/
 
 /* HAS_TELLDIR_PROTO:
  *     This symbol, if defined, indicates that the system provides
  *     to the program to supply one.  A good guess is
  *             extern long telldir(DIR*);
  */
-/*#define      HAS_TELLDIR_PROTO       / **/
+/*#define HAS_TELLDIR_PROTO    / **/
 
 /* HAS_TGAMMA:
  *     This symbol, if defined, indicates that the tgamma routine is
  *     This symbol, if defined, indicates that the asctime64 () routine is
  *     available to do the 64bit variant of asctime ()
  */
-/*#define      HAS_CTIME64             / **/
-/*#define      HAS_LOCALTIME64         / **/
-/*#define      HAS_GMTIME64            / **/
-/*#define      HAS_MKTIME64            / **/
-/*#define      HAS_DIFFTIME64          / **/
-/*#define      HAS_ASCTIME64           / **/
+/*#define HAS_CTIME64          / **/
+/*#define HAS_LOCALTIME64              / **/
+/*#define HAS_GMTIME64         / **/
+/*#define HAS_MKTIME64         / **/
+/*#define HAS_DIFFTIME64               / **/
+/*#define HAS_ASCTIME64                / **/
 
 /* HAS_TIMEGM:
  *     This symbol, if defined, indicates that the timegm routine is
  *     to the program to supply one.  A good guess is
  *             extern int usleep(useconds_t);
  */
-/*#define      HAS_USLEEP_PROTO        / **/
+/*#define HAS_USLEEP_PROTO     / **/
 
 /* HAS_USTAT:
  *     This symbol, if defined, indicates that the ustat system call is
 
 /* HAS_WCSXFRM:
  *     This symbol, if defined, indicates that the wcsxfrm routine is
- *     available to tranform a wide character string for wcscmp().
+ *     available to transform a wide character string for wcscmp().
  */
 /*#define HAS_WCSXFRM  / **/
 
  *     Note that if fflushNULL is defined, fflushall will not
  *     even be probed for and will be left undefined.
  */
-/*#define      FFLUSH_NULL             / **/
-/*#define      FFLUSH_ALL              / **/
+/*#define FFLUSH_NULL          / **/
+/*#define FFLUSH_ALL           / **/
 
 /* I_BFD:
  *     This symbol, if defined, indicates that <bfd.h> exists and
  *     can be included.
  */
-/*#define      I_BFD           / **/
+/*#define I_BFD                / **/
 
 /* I_CRYPT:
  *     This symbol, if defined, indicates that <crypt.h> exists and
  *     should be included.
  */
-/*#define      I_CRYPT         / **/
+/*#define I_CRYPT              / **/
 
 /* DB_Prefix_t:
  *     This symbol contains the type of the prefix structure element
  *     This symbol, if defined, indicates that <fp.h> exists and
  *     should be included.
  */
-/*#define      I_FP            / **/
+/*#define I_FP         / **/
 
 /* I_FP_CLASS:
  *     This symbol, if defined, indicates that <fp_class.h> exists and
  *     should be included.
  */
-/*#define      I_FP_CLASS              / **/
+/*#define I_FP_CLASS           / **/
 
 /* I_IEEEFP:
  *     This symbol, if defined, indicates that <ieeefp.h> exists and
  *     should be included.
  */
-/*#define      I_IEEEFP                / **/
+/*#define I_IEEEFP             / **/
 
 /* I_INTTYPES:
  *     This symbol, if defined, indicates to the C program that it should
  *     This symbol, if defined, indicates that <langinfo.h> exists and
  *     should be included.
  */
-/*#define      I_LANGINFO              / **/
+/*#define I_LANGINFO           / **/
 
 /* I_LIBUTIL:
  *     This symbol, if defined, indicates that <libutil.h> exists and
  *     should be included.
  */
-/*#define      I_LIBUTIL               / **/
+/*#define I_LIBUTIL            / **/
 
 /* I_MALLOCMALLOC:
  *     This symbol, if defined, indicates to the C program that it should
  *     This symbol, if defined, indicates that <mntent.h> exists and
  *     should be included.
  */
-/*#define      I_MNTENT                / **/
+/*#define I_MNTENT             / **/
 
 /* I_NETINET_TCP:
  *     This symbol, if defined, indicates to the C program that it should
  *     This symbol, if defined, indicates that <poll.h> exists and
  *     should be included. (see also HAS_POLL)
  */
-/*#define      I_POLL          / **/
+/*#define I_POLL               / **/
 
 /* I_PROT:
  *     This symbol, if defined, indicates that <prot.h> exists and
  *     should be included.
  */
-/*#define      I_PROT          / **/
+/*#define I_PROT               / **/
 
 /* I_QUADMATH:
  *     This symbol, if defined, indicates that <quadmath.h> exists and
  *     should be included.
  */
-/*#define      I_QUADMATH              / **/
+/*#define I_QUADMATH           / **/
 
 /* I_SHADOW:
  *     This symbol, if defined, indicates that <shadow.h> exists and
  *     should be included.
  */
-/*#define      I_SHADOW                / **/
+/*#define I_SHADOW             / **/
 
 /* I_SOCKS:
  *     This symbol, if defined, indicates that <socks.h> exists and
  *     should be included.
  */
-/*#define      I_SOCKS         / **/
+/*#define I_SOCKS              / **/
 
 /* I_STDBOOL:
  *     This symbol, if defined, indicates that <stdbool.h> exists and
  *     can be included.
  */
-/*#define      I_STDBOOL               / **/
+/*#define I_STDBOOL            / **/
 
 /* I_STDINT:
  *     This symbol, if defined, indicates that <stdint.h> exists and
  *     This symbol, if defined, indicates that <sunmath.h> exists and
  *     should be included.
  */
-/*#define      I_SUNMATH               / **/
+/*#define I_SUNMATH            / **/
 
 /* I_SYSLOG:
  *     This symbol, if defined, indicates that <syslog.h> exists and
  *     should be included.
  */
-/*#define      I_SYSLOG                / **/
+/*#define I_SYSLOG             / **/
 
 /* I_SYSMODE:
  *     This symbol, if defined, indicates that <sys/mode.h> exists and
  *     should be included.
  */
-/*#define      I_SYSMODE               / **/
+/*#define I_SYSMODE            / **/
 
 /* I_SYS_MOUNT:
  *     This symbol, if defined, indicates that <sys/mount.h> exists and
  *     should be included.
  */
-/*#define      I_SYS_MOUNT             / **/
+/*#define I_SYS_MOUNT          / **/
 
 /* I_SYS_STATFS:
  *     This symbol, if defined, indicates that <sys/statfs.h> exists.
  */
-/*#define      I_SYS_STATFS            / **/
+/*#define I_SYS_STATFS         / **/
 
 /* I_SYS_STATVFS:
  *     This symbol, if defined, indicates that <sys/statvfs.h> exists and
  *     should be included.
  */
-/*#define      I_SYS_STATVFS           / **/
+/*#define I_SYS_STATVFS                / **/
+
+/* I_SYS_SYSCALL:
+ *     This symbol, if defined, indicates that <sys/syscall.h> exists.
+ */
+/*#define I_SYS_SYSCALL                / **/
 
 /* I_SYSUTSNAME:
  *     This symbol, if defined, indicates that <sys/utsname.h> exists and
  *     should be included.
  */
-/*#define      I_SYSUTSNAME            / **/
+/*#define I_SYSUTSNAME         / **/
 
 /* I_SYS_VFS:
  *     This symbol, if defined, indicates that <sys/vfs.h> exists and
  *     should be included.
  */
-/*#define      I_SYS_VFS               / **/
+/*#define I_SYS_VFS            / **/
 
 /* I_USTAT:
  *     This symbol, if defined, indicates that <ustat.h> exists and
  *     should be included.
  */
-/*#define      I_USTAT         / **/
+/*#define I_USTAT              / **/
 
 /* I_WCHAR:
  *     This symbol, if defined, indicates to the C program that <wchar.h>
 /* I_WCTYPE:
  *     This symbol, if defined, indicates that <wctype.h> exists.
  */
-/*#define      I_WCTYPE                / **/
+/*#define I_WCTYPE             / **/
 
 /* DOUBLEINFBYTES:
  *     This symbol, if defined, is a comma-separated list of
  *     of copying mechanisms, handy.h defines a platform-
  *     independent macro, Perl_va_copy(src, dst), to do the job.
  */
-#define        NEED_VA_COPY            /**/
+#define NEED_VA_COPY           /**/
+
+/* I32df:
+ *     This symbol defines the format string used for printing a Perl I32
+ *     as a signed decimal integer.
+ */
+/* U32uf:
+ *     This symbol defines the format string used for printing a Perl U32
+ *     as an unsigned decimal integer.
+ */
+/* U32of:
+ *     This symbol defines the format string used for printing a Perl U32
+ *     as an unsigned octal integer.
+ */
+/* U32xf:
+ *     This symbol defines the format string used for printing a Perl U32
+ *     as an unsigned hexadecimal integer in lowercase abcdef.
+ */
+/* U32Xf:
+ *     This symbol defines the format string used for printing a Perl U32
+ *     as an unsigned hexadecimal integer in uppercase ABCDEF.
+ */
+#define I32df          "ld"            /**/
+#define U32of          "lo"            /**/
+#define U32uf          "lu"            /**/
+#define U32xf          "lx"            /**/
+#define U32Xf          "lX"            /**/
 
 /* IVTYPE:
  *     This symbol defines the C type used for Perl's IV.
  *     This symbol, if defined, indicates that a variable of type NVTYPE
  *     stores 0.0 in memory as all bits zero.
  */
-#define        IVTYPE          long            /**/
-#define        UVTYPE          unsigned long           /**/
-#define        I8TYPE          signed char             /**/
-#define        U8TYPE          unsigned char           /**/
-#define        I16TYPE         short   /**/
-#define        U16TYPE         unsigned short  /**/
-#define        I32TYPE         long    /**/
-#define        U32TYPE         unsigned long   /**/
+#define IVTYPE         long            /**/
+#define UVTYPE         unsigned long           /**/
+#define I8TYPE         signed char             /**/
+#define U8TYPE         unsigned char           /**/
+#define I16TYPE                short   /**/
+#define U16TYPE                unsigned short  /**/
+#define I32TYPE                long    /**/
+#define U32TYPE                unsigned long   /**/
 #ifdef HAS_QUAD
-#define        I64TYPE         int64_t /**/
-#define        U64TYPE         uint64_t        /**/
+#define I64TYPE                int64_t /**/
+#define U64TYPE                uint64_t        /**/
 #endif
-#define        NVTYPE          double          /**/
-#define        IVSIZE          4               /**/
-#define        UVSIZE          4               /**/
-#define        I8SIZE          1               /**/
-#define        U8SIZE          1               /**/
-#define        I16SIZE         2       /**/
-#define        U16SIZE         2       /**/
-#define        I32SIZE         4       /**/
-#define        U32SIZE         4       /**/
+#define NVTYPE         double          /**/
+#define IVSIZE         4               /**/
+#define UVSIZE         4               /**/
+#define I8SIZE         1               /**/
+#define U8SIZE         1               /**/
+#define I16SIZE                2       /**/
+#define U16SIZE                2       /**/
+#define I32SIZE                4       /**/
+#define U32SIZE                4       /**/
 #ifdef HAS_QUAD
-#define        I64SIZE         8       /**/
-#define        U64SIZE         8       /**/
+#define I64SIZE                8       /**/
+#define U64SIZE                8       /**/
 #endif
-#define        NVSIZE          8               /**/
+#define NVSIZE         8               /**/
 #undef NV_PRESERVES_UV
-#define        NV_PRESERVES_UV_BITS    0
-#define        NV_OVERFLOWS_INTEGERS_AT        (256.0*256.0*256.0*256.0*256.0*256.0*2.0*2.0*2.0*2.0*2.0)
+#define NV_PRESERVES_UV_BITS   0
+#define NV_OVERFLOWS_INTEGERS_AT       (256.0*256.0*256.0*256.0*256.0*256.0*2.0*2.0*2.0*2.0*2.0)
 #undef NV_ZERO_IS_ALLBITS_ZERO
 #if UVSIZE == 8
 #   ifdef BYTEORDER
  *     This symbol defines the format string used for printing a Perl NV
  *     using %g-ish floating point format.
  */
-#define        IVdf            "ld"            /**/
-#define        UVuf            "lu"            /**/
-#define        UVof            "lo"            /**/
-#define        UVxf            "lx"            /**/
-#define        UVXf            "lX"            /**/
-#define        NVef            "e"             /**/
-#define        NVff            "f"             /**/
-#define        NVgf            "g"             /**/
+#define IVdf           "ld"            /**/
+#define UVuf           "lu"            /**/
+#define UVof           "lo"            /**/
+#define UVxf           "lx"            /**/
+#define UVXf           "lX"            /**/
+#define NVef           "e"             /**/
+#define NVff           "f"             /**/
+#define NVgf           "g"             /**/
 
 /* SELECT_MIN_BITS:
  *     This symbol holds the minimum number of bits operated by select.
  *     This symbol tells the name of the array holding the stdio streams.
  *     Usual values include _iob, __iob, and __sF.
  */
-/*#define      HAS_STDIO_STREAM_ARRAY  / **/
+/*#define HAS_STDIO_STREAM_ARRAY       / **/
 #ifdef HAS_STDIO_STREAM_ARRAY
 #define STDIO_STREAM_ARRAY     
 #endif
  *     you may need at least to reboot your OS to 64-bit mode.
  */
 #ifndef USE_64_BIT_INT
-/*#define      USE_64_BIT_INT          / **/
+/*#define USE_64_BIT_INT               / **/
 #endif
 #ifndef USE_64_BIT_ALL
-/*#define      USE_64_BIT_ALL          / **/
+/*#define USE_64_BIT_ALL               / **/
 #endif
 
 /* USE_C_BACKTRACE:
  *     Defaults to define in Perls 5.8 and earlier, to undef later.
  */
 #ifndef USE_FAST_STDIO
-/*#define      USE_FAST_STDIO          / **/
+/*#define USE_FAST_STDIO               / **/
 #endif
 
 /* USE_KERN_PROC_PATHNAME:
  *     should be used when available.
  */
 #ifndef USE_LARGE_FILES
-/*#define      USE_LARGE_FILES         / **/
+/*#define USE_LARGE_FILES              / **/
 #endif
 
 /* USE_LONG_DOUBLE:
  *     be used when available.
  */
 #ifndef USE_LONG_DOUBLE
-/*#define      USE_LONG_DOUBLE         / **/
+/*#define USE_LONG_DOUBLE              / **/
 #endif
 
 /* USE_MORE_BITS:
  *     long doubles should be used when available.
  */
 #ifndef USE_MORE_BITS
-/*#define      USE_MORE_BITS           / **/
+/*#define USE_MORE_BITS                / **/
 #endif
 
 /* MULTIPLICITY:
  *     be built to use multiplicity.
  */
 #ifndef MULTIPLICITY
-/*#define      MULTIPLICITY            / **/
+/*#define MULTIPLICITY         / **/
 #endif
 
 /* USE_NSGETEXECUTABLEPATH:
  *     used in a fully backward compatible manner.
  */
 #ifndef USE_PERLIO
-/*#define      USE_PERLIO              / **/
+/*#define USE_PERLIO           / **/
 #endif
 
 /* USE_QUADMATH:
  *     be used when available.
  */
 #ifndef USE_QUADMATH
-/*#define      USE_QUADMATH            / **/
+/*#define USE_QUADMATH         / **/
 #endif
 
 /* USE_SOCKS:
  *     be built to use socks.
  */
 #ifndef USE_SOCKS
-/*#define      USE_SOCKS               / **/
+/*#define USE_SOCKS            / **/
 #endif
 
 /* HAS_DRAND48_PROTO:
  *     to the program to supply one.  A good guess is
  *             extern double drand48(void);
  */
-/*#define      HAS_DRAND48_PROTO       / **/
+/*#define HAS_DRAND48_PROTO    / **/
 
 /* HAS_GETHOST_PROTOS:
  *     This symbol, if defined, indicates that <netdb.h> includes
  *     gethostbyaddr().  Otherwise, it is up to the program to guess
  *     them.  See netdbtype.U for probing for various Netdb_xxx_t types.
  */
-/*#define      HAS_GETHOST_PROTOS      / **/
+/*#define HAS_GETHOST_PROTOS   / **/
 
 /* HAS_GETNET_PROTOS:
  *     This symbol, if defined, indicates that <netdb.h> includes
  *     getnetbyaddr().  Otherwise, it is up to the program to guess
  *     them.  See netdbtype.U for probing for various Netdb_xxx_t types.
  */
-/*#define      HAS_GETNET_PROTOS       / **/
+/*#define HAS_GETNET_PROTOS    / **/
 
 /* HAS_GETPROTO_PROTOS:
  *     This symbol, if defined, indicates that <netdb.h> includes
  *     getprotobyaddr().  Otherwise, it is up to the program to guess
  *     them.  See netdbtype.U for probing for various Netdb_xxx_t types.
  */
-/*#define      HAS_GETPROTO_PROTOS     / **/
+/*#define HAS_GETPROTO_PROTOS  / **/
 
 /* HAS_GETSERV_PROTOS:
  *     This symbol, if defined, indicates that <netdb.h> includes
  *     getservbyaddr().  Otherwise, it is up to the program to guess
  *     them.  See netdbtype.U for probing for various Netdb_xxx_t types.
  */
-/*#define      HAS_GETSERV_PROTOS      / **/
+/*#define HAS_GETSERV_PROTOS   / **/
 
 /* HAS_LSEEK_PROTO:
  *     This symbol, if defined, indicates that the system provides
  *     to the program to supply one.  A good guess is
  *             extern off_t lseek(int, off_t, int);
  */
-/*#define      HAS_LSEEK_PROTO / **/
+/*#define HAS_LSEEK_PROTO      / **/
 
 /* Netdb_host_t:
  *     This symbol holds the type used for the 1st argument
  *     try to use the various _r versions of library functions.
  *     This is extremely experimental.
  */
-/*#define      USE_ITHREADS            / **/
-/*#define              USE_THREADS             / **/
-/*#define      OLD_PTHREADS_API                / **/
-/*#define      USE_REENTRANT_API       / **/
+/*#define USE_ITHREADS         / **/
+/*#define      USE_THREADS             / **/
+/*#define OLD_PTHREADS_API             / **/
+/*#define USE_REENTRANT_API    / **/
 
 /* HAS_TIME:
  *     This symbol, if defined, indicates that the time() routine exists.
 /* Gid_t_f:
  *     This symbol defines the format string used for printing a Gid_t.
  */
-#define        Gid_t_f         "lu"            /**/
+#define Gid_t_f                "lu"            /**/
 
 /* Gid_t_sign:
  *     This symbol holds the signedness of a Gid_t.
 /* Uid_t_f:
  *     This symbol defines the format string used for printing a Uid_t.
  */
-#define        Uid_t_f         "lu"            /**/
+#define Uid_t_f                "lu"            /**/
 
 /* Uid_t_sign:
  *     This symbol holds the signedness of a Uid_t.
 #endif
 
 /* Generated from:
- * 87e5998978daf803d19866c43bca24d7c01dc74119650db16f8d18d83f355da9 config_h.SH
- * 1a5fe19cbcfd68ba70230580fd344189b5c78c11b2285efd5976366e51b3257e uconfig.sh
- * ex: set ro: */
+ * e17a83ff6ae98071d846d4a001f6ce1a669df08c357fe153c2370adc4910135e config_h.SH
+ * 8d785207fec43bbad5118a8125e625d1cc654455994f09a76c1625b2ae2ae2d0 uconfig.sh
+ * ex: set ro ft=c: */
index 83fdd49..3c7fdbc 100644 (file)
@@ -6,8 +6,8 @@ afs='false'
 afsroot='/afs'
 alignbytes='4'
 aphostname='/bin/hostname'
-archlib='/usr/local/lib/perl5/5.36/unknown'
-archlibexp='/usr/local/lib/perl5/5.36/unknown'
+archlib='/usr/local/lib/perl5/5.38/unknown'
+archlibexp='/usr/local/lib/perl5/5.38/unknown'
 archname='unknown'
 asctime_r_proto='0'
 bin='/usr/local/bin'
@@ -63,6 +63,7 @@ d_attribute_nonnull='undef'
 d_attribute_noreturn='undef'
 d_attribute_pure='undef'
 d_attribute_unused='undef'
+d_attribute_visibility='undef'
 d_attribute_warn_unused_result='undef'
 d_backtrace='undef'
 d_bsd='undef'
@@ -429,6 +430,7 @@ d_semget='undef'
 d_semop='undef'
 d_sendmsg='undef'
 d_setegid='undef'
+d_setenv='undef'
 d_seteuid='undef'
 d_setgrent='undef'
 d_setgrent_r='undef'
@@ -645,6 +647,7 @@ h_fcntl='false'
 h_sysfile='true'
 i16size='2'
 i16type='short'
+i32dformat='"ld"'
 i32size='4'
 i32type='long'
 i64size='8'
@@ -715,6 +718,7 @@ i_syssockio='undef'
 i_sysstat='define'
 i_sysstatfs='undef'
 i_sysstatvfs='undef'
+i_syssyscall='undef'
 i_systime='undef'
 i_systimek='undef'
 i_systimes='undef'
@@ -789,8 +793,8 @@ perl_static_inline='static'
 perl_thread_local=''
 phostname='hostname'
 pidtype=int
-privlib='/usr/local/lib/perl5/5.36'
-privlibexp='/usr/local/lib/perl5/5.36'
+privlib='/usr/local/lib/perl5/5.38'
+privlibexp='/usr/local/lib/perl5/5.38'
 procselfexe=''
 prototype='undef'
 ptrsize='4'
@@ -840,11 +844,11 @@ sig_name_init='0'
 sig_num_init='0'
 sig_size='1'
 signal_t=int
-sitearch='/usr/local/lib/perl5/5.36/unknown'
-sitearchexp='/usr/local/lib/perl5/5.36/unknown'
-sitelib='/usr/local/lib/perl5/5.36'
+sitearch='/usr/local/lib/perl5/5.38/unknown'
+sitearchexp='/usr/local/lib/perl5/5.38/unknown'
+sitelib='/usr/local/lib/perl5/5.38'
 sitelib_stem='/usr/local/lib/perl5'
-sitelibexp='/usr/local/lib/perl5/5.36'
+sitelibexp='/usr/local/lib/perl5/5.38'
 sizesize=4
 sizetype='size_t'
 socksizetype='int'
@@ -873,8 +877,12 @@ touch='touch'
 ttyname_r_proto='0'
 u16size='2'
 u16type='unsigned short'
+u32XUformat='"lX"'
+u32oformat='"lo"'
 u32size='4'
 u32type='unsigned long'
+u32uformat='"lu"'
+u32xformat='"lx"'
 u64size='8'
 u64type='uint64_t'
 u8size='1'
index 403e00f..f1f7f58 100644 (file)
@@ -6,8 +6,8 @@ afs='false'
 afsroot='/afs'
 alignbytes='8'
 aphostname='/bin/hostname'
-archlib='/usr/local/lib/perl5/5.36/unknown'
-archlibexp='/usr/local/lib/perl5/5.36/unknown'
+archlib='/usr/local/lib/perl5/5.38/unknown'
+archlibexp='/usr/local/lib/perl5/5.38/unknown'
 archname='unknown64'
 asctime_r_proto='0'
 bin='/usr/local/bin'
@@ -63,6 +63,7 @@ d_attribute_nonnull='undef'
 d_attribute_noreturn='undef'
 d_attribute_pure='undef'
 d_attribute_unused='undef'
+d_attribute_visibility='undef'
 d_attribute_warn_unused_result='undef'
 d_backtrace='undef'
 d_bsd='undef'
@@ -429,6 +430,7 @@ d_semget='undef'
 d_semop='undef'
 d_sendmsg='undef'
 d_setegid='undef'
+d_setenv='undef'
 d_seteuid='undef'
 d_setgrent='undef'
 d_setgrent_r='undef'
@@ -645,6 +647,7 @@ h_fcntl='false'
 h_sysfile='true'
 i16size='2'
 i16type='short'
+i32dformat='"d"'
 i32size='4'
 i32type='int'
 i64size='8'
@@ -715,6 +718,7 @@ i_syssockio='undef'
 i_sysstat='define'
 i_sysstatfs='undef'
 i_sysstatvfs='undef'
+i_syssyscall='undef'
 i_systime='undef'
 i_systimek='undef'
 i_systimes='undef'
@@ -789,8 +793,8 @@ perl_static_inline='static'
 perl_thread_local=''
 phostname='hostname'
 pidtype=int
-privlib='/usr/local/lib/perl5/5.36'
-privlibexp='/usr/local/lib/perl5/5.36'
+privlib='/usr/local/lib/perl5/5.38'
+privlibexp='/usr/local/lib/perl5/5.38'
 procselfexe=''
 prototype='undef'
 ptrsize='8'
@@ -840,11 +844,11 @@ sig_name_init='0'
 sig_num_init='0'
 sig_size='1'
 signal_t=int
-sitearch='/usr/local/lib/perl5/5.36/unknown'
-sitearchexp='/usr/local/lib/perl5/5.36/unknown'
-sitelib='/usr/local/lib/perl5/5.36'
+sitearch='/usr/local/lib/perl5/5.38/unknown'
+sitearchexp='/usr/local/lib/perl5/5.38/unknown'
+sitelib='/usr/local/lib/perl5/5.38'
 sitelib_stem='/usr/local/lib/perl5'
-sitelibexp='/usr/local/lib/perl5/5.36'
+sitelibexp='/usr/local/lib/perl5/5.38'
 sizesize=4
 sizetype='size_t'
 socksizetype='int'
@@ -873,8 +877,12 @@ touch='touch'
 ttyname_r_proto='0'
 u16size='2'
 u16type='unsigned short'
+u32XUformat='"X"'
+u32oformat='"o"'
 u32size='4'
 u32type='unsigned int'
+u32uformat='"u"'
+u32xformat='"x"'
 u64size='8'
 u64type='unsigned long'
 u8size='1'
index e82c175..07a02b3 100644 (file)
@@ -1,4 +1,4 @@
-/* -*- buffer-read-only: t -*-
+/* -*- mode: C; buffer-read-only: t -*-
  * !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!!
  * This file is built by regen/unicode_constants.pl from Unicode data.
  * Any changes made here will be lost!
@@ -45,7 +45,7 @@ bytes.
 =cut
 */
 
-#define UNICODE_MAJOR_VERSION   14
+#define UNICODE_MAJOR_VERSION   15
 #define UNICODE_DOT_VERSION     0
 #define UNICODE_DOT_DOT_VERSION 0
 
@@ -103,7 +103,7 @@ bytes.
 #      define DEPRECATED_OPENING_NON_UTF8_BRACKETS "\xAB\xBB"
 #   endif
 
-#   ifdef PERL_IN_REGCOMP_C
+#   ifdef PERL_IN_REGCOMP_ANY
 #     define MAX_PRINT_A  0x7E   /* The max code point that isPRINT_A */
 #   endif
 #endif /* ASCII/Latin1 */
@@ -164,7 +164,7 @@ bytes.
 #      define DEPRECATED_OPENING_NON_UTF8_BRACKETS "\x8A\x8B"
 #   endif
 
-#   ifdef PERL_IN_REGCOMP_C
+#   ifdef PERL_IN_REGCOMP_ANY
 #     define MAX_PRINT_A  0xF9   /* The max code point that isPRINT_A */
 #   endif
 #endif /* EBCDIC 1047 */
@@ -225,14 +225,14 @@ bytes.
 #      define DEPRECATED_OPENING_NON_UTF8_BRACKETS "\x8A\x8B"
 #   endif
 
-#   ifdef PERL_IN_REGCOMP_C
+#   ifdef PERL_IN_REGCOMP_ANY
 #     define MAX_PRINT_A  0xF9   /* The max code point that isPRINT_A */
 #   endif
 #endif /* EBCDIC 037 */
 
 /* The number of code points not matching \pC */
-#ifdef PERL_IN_REGCOMP_C
-#  define NON_OTHER_COUNT  144534
+#ifdef PERL_IN_REGCOMP_ANY
+#  define NON_OTHER_COUNT  149016
 #endif
 
 /* The highest code point that has any type of case change */
@@ -242,4 +242,4 @@ bytes.
 
 #endif /* PERL_UNICODE_CONSTANTS_H_ */
 
-/* ex: set ro: */
+/* ex: set ro ft=c: */
index 9c7be31..20a36fa 100644 (file)
@@ -188,6 +188,27 @@ Perl_sv_derived_from_pvn(pTHX_ SV *sv, const char *const name, const STRLEN len,
     return sv_derived_from_svpvn(sv, NULL, name, len, flags);
 }
 
+/*
+=for apidoc sv_derived_from_hv
+
+Exactly like L</sv_derived_from_pvn>, but takes the name string as the
+C<HvNAME> of the given HV (which would presumably represent a stash).
+
+=cut
+*/
+
+bool
+Perl_sv_derived_from_hv(pTHX_ SV *sv, HV *hv)
+{
+    PERL_ARGS_ASSERT_SV_DERIVED_FROM_HV;
+
+    const char *hvname = HvNAME(hv);
+    if(!hvname)
+        return FALSE;
+
+    return sv_derived_from_svpvn(sv, NULL, hvname, HvNAMELEN(hv), HvNAMEUTF8(hv) ? SVf_UTF8 : 0);
+}
+
 /*
 =for apidoc sv_isa_sv
 
@@ -572,11 +593,21 @@ XS(XS_utf8_upgrade)
         croak_xs_usage(cv, "sv");
     else {
         SV * const sv = ST(0);
-        STRLEN RETVAL;
+        STRLEN RETVAL = 0;
         dXSTARG;
 
-        RETVAL = sv_utf8_upgrade(sv);
-        XSprePUSH; PUSHi((IV)RETVAL);
+        XSprePUSH;
+        if (UNLIKELY(! sv)) {
+            XSRETURN_UNDEF;
+        }
+
+        SvGETMAGIC(sv);
+        if (UNLIKELY(! SvOK(sv))) {
+            XSRETURN_UNDEF;
+        }
+
+        RETVAL = sv_utf8_upgrade_nomg(sv);
+        PUSHi( (IV) RETVAL);
     }
     XSRETURN(1);
 }
@@ -732,7 +763,7 @@ XS(XS_PerlIO_get_layers)
     {
         SV *   sv;
         GV *   gv;
-        IO *   io;
+        IO *   io = NULL;
         bool   input = TRUE;
         bool   details = FALSE;
 
@@ -775,12 +806,16 @@ XS(XS_PerlIO_get_layers)
         }
 
         sv = POPs;
-        gv = MAYBE_DEREF_GV(sv);
 
-        if (!gv && !SvROK(sv))
-            gv = gv_fetchsv_nomg(sv, 0, SVt_PVIO);
+        /* MAYBE_DEREF_GV will call get magic */
+        if ((gv = MAYBE_DEREF_GV(sv)))
+            io = GvIO(gv);
+        else if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVIO)
+            io = (IO*)SvRV(sv);
+        else if (!SvROK(sv) && (gv = gv_fetchsv_nomg(sv, 0, SVt_PVIO)))
+            io = GvIO(gv);
 
-        if (gv && (io = GvIO(gv))) {
+        if (io) {
              AV* const av = PerlIO_get_layers(aTHX_ input ?
                                         IoIFP(io) : IoOFP(io));
              SSize_t i;
index eafc6f1..097b85d 100644 (file)
@@ -21,7 +21,7 @@
  *     This symbol, if defined, indicates that the ioctl() routine is
  *     available to set I/O characteristics
  */
-#define        HAS_IOCTL               /**/
+#define HAS_IOCTL               /**/
  
 /* HAS_UTIME:
  *     This symbol, if defined, indicates that the routine utime() is
@@ -136,28 +136,34 @@ int afstat(int fd, struct stat *statb);
 #define Mkdir(path,mode)   mkdir((path),(mode))
 
 #if defined(__amigaos4__)
-#  define PERL_SYS_INIT_BODY(c,v)                                      \
-        MALLOC_CHECK_TAINT2(*c,*v) PERL_FPU_INIT; PERLIO_INIT; MALLOC_INIT; amigaos4_init_fork_array(); amigaos4_init_environ_sema();
-#  define PERL_SYS_TERM_BODY()                         \
-    HINTS_REFCNT_TERM; KEYWORD_PLUGIN_MUTEX_TERM;      \
-    OP_CHECK_MUTEX_TERM; OP_REFCNT_TERM; PERLIO_TERM;  \
-    MALLOC_TERM; LOCALE_TERM; USER_PROP_MUTEX_TERM;    \
-    ENV_TERM;                                          \
-    amigaos4_dispose_fork_array();
+#  define PLATFORM_SYS_TERM_  amigaos4_dispose_fork_array()
+#  define PLATFORM_SYS_INIT_ STMT_START {                       \
+                                amigaos4_init_fork_array();     \
+                                amigaos4_init_environ_sema();   \
+                             } STMT_END
+#else 
+#  define PLATFORM_SYS_TERM_  NOOP
+#  define PLATFORM_SYS_INIT_  NOOP
 #endif
 
 #ifndef PERL_SYS_INIT_BODY
-#  define PERL_SYS_INIT_BODY(c,v)                                      \
-        MALLOC_CHECK_TAINT2(*c,*v) PERL_FPU_INIT; PERLIO_INIT; MALLOC_INIT
+#define PERL_SYS_INIT_BODY(c,v)                                        \
+       MALLOC_CHECK_TAINT2(*c,*v) PERL_FPU_INIT; PERLIO_INIT;  \
+        MALLOC_INIT; PLATFORM_SYS_INIT_;
 #endif
 
+/* Generally add things last-in first-terminated.  IO and memory terminations
+ * need to be generally last
+ *
+ * BEWARE that using PerlIO in these will be using freed memory, so may appear
+ * to work, but must NOT be retained in production code. */
 #ifndef PERL_SYS_TERM_BODY
-#  define PERL_SYS_TERM_BODY()                         \
-    HINTS_REFCNT_TERM; KEYWORD_PLUGIN_MUTEX_TERM;      \
-    OP_CHECK_MUTEX_TERM; OP_REFCNT_TERM; PERLIO_TERM;  \
-    MALLOC_TERM; LOCALE_TERM; USER_PROP_MUTEX_TERM;    \
-    ENV_TERM;
-
+#  define PERL_SYS_TERM_BODY()                                          \
+                    ENV_TERM; USER_PROP_MUTEX_TERM; LOCALE_TERM;        \
+                    HINTS_REFCNT_TERM; KEYWORD_PLUGIN_MUTEX_TERM;       \
+                    OP_CHECK_MUTEX_TERM; OP_REFCNT_TERM;                \
+                    PERLIO_TERM; MALLOC_TERM;                           \
+                    PLATFORM_SYS_TERM_;
 #endif
 
 #define BIT_BUCKET "/dev/null"
index bde2176..75e8a4c 100644 (file)
@@ -37,11 +37,6 @@ static const char malformed_text[] = "Malformed UTF-8 character";
 static const char unees[] =
                         "Malformed UTF-8 character (unexpected end of string)";
 
-/* strlen() of a literal string constant.  We might want this more general,
- * but using it in just this file for now.  A problem with more generality is
- * the compiler warnings about comparing unlike signs */
-#define STRLENs(s)  (sizeof("" s "") - 1)
-
 /*
 These are various utility functions for manipulating UTF8-encoded
 strings.  For the uninitiated, this is a method of representing arbitrary
@@ -50,17 +45,6 @@ characters in the ASCII range are unmodified, and a zero byte never appears
 within non-zero characters.
 */
 
-/* helper for Perl__force_out_malformed_utf8_message(). Like
- * SAVECOMPILEWARNINGS(), but works with PL_curcop rather than
- * PL_compiling */
-
-static void
-S_restore_cop_warnings(pTHX_ void *p)
-{
-    free_and_set_cop_warnings(PL_curcop, (STRLEN*) p);
-}
-
-
 void
 Perl__force_out_malformed_utf8_message(pTHX_
             const U8 *const p,      /* First byte in UTF-8 sequence */
@@ -92,10 +76,7 @@ Perl__force_out_malformed_utf8_message(pTHX_
 
     PL_dowarn = G_WARN_ALL_ON|G_WARN_ON;
     if (PL_curcop) {
-        /* this is like SAVECOMPILEWARNINGS() except with PL_curcop rather
-         * than PL_compiling */
-        SAVEDESTRUCTOR_X(S_restore_cop_warnings,
-                (void*)PL_curcop->cop_warnings);
+        SAVECURCOPWARNINGS();
         PL_curcop->cop_warnings = pWARN_ALL;
     }
 
@@ -700,7 +681,7 @@ S_does_utf8_overflow(const U8 * const s,
         return 1;
     }
 
-    /* Here, it could be the overlong malformation, and might not actuallly
+    /* Here, it could be the overlong malformation, and might not actually
      * overflow if you were to calculate it out.
      *
      * See if it actually is overlong */
@@ -1530,7 +1511,7 @@ Perl__utf8n_to_uvchr_msgs_helper(const U8 *s,
 
     /* A well-formed UTF-8 character, as the vast majority of calls to this
      * function will be for, has this expected length.  For efficiency, set
-     * things up here to return it.  It will be overriden only in those rare
+     * things up here to return it.  It will be overridden only in those rare
      * cases where a malformation is found */
     if (retlen) {
         *retlen = expectlen;
@@ -1729,10 +1710,10 @@ Perl__utf8n_to_uvchr_msgs_helper(const U8 *s,
      * uv                   contains the code point the input sequence
      *                      represents; or if there is a problem that prevents
      *                      a well-defined value from being computed, it is
-     *                      some subsitute value, typically the REPLACEMENT
+     *                      some substitute value, typically the REPLACEMENT
      *                      CHARACTER.
      * s0                   points to the first byte of the character
-     * s                    points to just after were we left off processing
+     * s                    points to just after where we left off processing
      *                      the character
      * send                 points to just after where that character should
      *                      end, based on how many bytes the start byte tells
@@ -2122,7 +2103,7 @@ Perl__utf8n_to_uvchr_msgs_helper(const U8 *s,
 
         /* Since there was a possible problem, the returned length may need to
          * be changed from the one stored at the beginning of this function.
-         * Instead of trying to figure out if that's needed, just do it. */
+         * Instead of trying to figure out if it has changed, just do it. */
         if (retlen) {
             *retlen = curlen;
         }
@@ -2169,43 +2150,6 @@ Perl_utf8_to_uvchr_buf(pTHX_ const U8 *s, const U8 *send, STRLEN *retlen)
     return utf8_to_uvchr_buf_helper(s, send, retlen);
 }
 
-/* This is marked as deprecated
- *
-=for apidoc utf8_to_uvuni_buf
-
-Only in very rare circumstances should code need to be dealing in Unicode
-(as opposed to native) code points.  In those few cases, use
-C<L<NATIVE_TO_UNI(utf8_to_uvchr_buf(...))|perlapi/utf8_to_uvchr_buf>> instead.
-If you are not absolutely sure this is one of those cases, then assume it isn't
-and use plain C<utf8_to_uvchr_buf> instead.
-
-Returns the Unicode (not-native) code point of the first character in the
-string C<s> which
-is assumed to be in UTF-8 encoding; C<send> points to 1 beyond the end of C<s>.
-C<retlen> will be set to the length, in bytes, of that character.
-
-If C<s> does not point to a well-formed UTF-8 character and UTF8 warnings are
-enabled, zero is returned and C<*retlen> is set (if C<retlen> isn't
-NULL) to -1.  If those warnings are off, the computed value if well-defined (or
-the Unicode REPLACEMENT CHARACTER, if not) is silently returned, and C<*retlen>
-is set (if C<retlen> isn't NULL) so that (S<C<s> + C<*retlen>>) is the
-next possible position in C<s> that could begin a non-malformed character.
-See L<perlapi/utf8n_to_uvchr> for details on when the REPLACEMENT CHARACTER is
-returned.
-
-=cut
-*/
-
-UV
-Perl_utf8_to_uvuni_buf(pTHX_ const U8 *s, const U8 *send, STRLEN *retlen)
-{
-    PERL_ARGS_ASSERT_UTF8_TO_UVUNI_BUF;
-
-    assert(send > s);
-
-    return NATIVE_TO_UNI(utf8_to_uvchr_buf(s, send, retlen));
-}
-
 /*
 =for apidoc utf8_length
 
@@ -2217,44 +2161,154 @@ If C<e E<lt> s> or if the scan would end up past C<e>, it raises a UTF8 warning
 and returns the number of valid characters.
 
 =cut
+
+    For long strings we process the input word-at-a-time, and count
+    continuations, instead of otherwise counting characters and using UTF8SKIP
+    to find the next one.  If our input were 13-byte characters, the per-word
+    would be a loser, as we would be doing things in 8 byte chunks (or 4 on a
+    32-bit platform).  But the maximum legal Unicode code point is 4 bytes, and
+    most text will have a significant number of 1 and 2 byte characters, so the
+    per-word is generally a winner.
+
+    There are start-up and finish costs with the per-word method, so we use the
+    standard method unless the input has a relatively large length.
 */
 
 STRLEN
-Perl_utf8_length(pTHX_ const U8 *s, const U8 *e)
+Perl_utf8_length(pTHX_ const U8 * const s0, const U8 * const e)
 {
+    STRLEN continuations = 0;
     STRLEN len = 0;
+    const U8 * s = s0;
 
     PERL_ARGS_ASSERT_UTF8_LENGTH;
 
-    /* Note: cannot use UTF8_IS_...() too eagerly here since e.g.
-     * the bitops (especially ~) can create illegal UTF-8.
-     * In other words: in Perl UTF-8 is not just for Unicode. */
+    /* For EBCDCIC and short strings, we count the characters.  The boundary
+     * was determined by eyeballing the output of Porting/bench.pl and
+     * choosing a number where the continuations method gave better results (on
+     * a 64 bit system, khw not having access to a 32 bit system with
+     * cachegrind).  The number isn't critical, as at these sizes, the total
+     * time spent isn't large either way */
 
-    while (s < e) {
-        Ptrdiff_t expected_byte_count = UTF8SKIP(s);
+#ifndef EBCDIC
 
-        if (UNLIKELY(e - s  < expected_byte_count)) {
-            goto warn_and_return;
+    if (e - s0 < 96)
+
+#endif
+
+    {
+        while (s < e) { /* Count characters directly */
+
+            /* Take extra care to not exceed 'e' (which would be undefined
+             * behavior) should the input be malformed, with a partial
+             * character at the end */
+            Ptrdiff_t expected_byte_count = UTF8SKIP(s);
+            if (UNLIKELY(e - s  < expected_byte_count)) {
+                goto warn_and_return;
+            }
+
+            len++;
+            s += expected_byte_count;
+        }
+
+        if (LIKELY(e == s)) {
+            return len;
+        }
+
+      warn_and_return:
+        if (ckWARN_d(WARN_UTF8)) {
+            if (PL_op)
+                Perl_warner(aTHX_ packWARN(WARN_UTF8),
+                             "%s in %s", unees, OP_DESC(PL_op));
+            else
+                Perl_warner(aTHX_ packWARN(WARN_UTF8), "%s", unees);
         }
 
-        len++;
-        s += expected_byte_count;
+        return s - s0;
     }
 
-    if (LIKELY(e == s)) {
-        return len;
+#ifndef EBCDIC
+
+    /* Count continuations, word-at-a-time.
+     *
+     * We need to stop before the final start character in order to
+     * preserve the limited error checking that's always been done */
+    const U8 * e_limit = e - UTF8_MAXBYTES;
+
+    /* Points to the first byte >=s which is positioned at a word boundary.  If
+     * s is on a word boundary, it is s, otherwise it is to the next word. */
+    const U8 * partial_word_end = s + PERL_WORDSIZE * PERL_IS_SUBWORD_ADDR(s)
+                                    - (PTR2nat(s) & PERL_WORD_BOUNDARY_MASK);
+
+    /* Process up to a full word boundary. */
+    while (s < partial_word_end) {
+        const Size_t skip = UTF8SKIP(s);
+
+        continuations += skip - 1;
+        s += skip;
+    }
+
+    /* Adjust back down any overshoot */
+    continuations -= s - partial_word_end;
+    s = partial_word_end;
+
+    do { /* Process per-word */
+
+        /* The idea for counting continuation bytes came from
+         * http://www.daemonology.net/blog/2008-06-05-faster-utf8-strlen.html
+         * One thing it does that this doesn't is to prefetch the buffer
+         *      __builtin_prefetch(&s[256], 0, 0);
+         *
+         * A continuation byte has the upper 2 bits be '10', and the rest
+         * dont-cares.  The VARIANTS mask zeroes out all but the upper bit of
+         * each byte in the word.  That gets shifted to the byte's lowest bit,
+         * and 'anded' with the complement of the 2nd highest bit of the byte,
+         * which has also been shifted to that position.  Hence the bit in that
+         * position will be 1 iff the upper bit is 1 and the next one is 0.  We
+         * then use the same integer multiplcation and shifting that are used
+         * in variant_under_utf8_count() to count how many of those are set in
+         * the word. */
+
+        continuations += (((((* (const PERL_UINTMAX_T *) s)
+                                            & PERL_VARIANTS_WORD_MASK) >> 7)
+                      & (((~ (* (const PERL_UINTMAX_T *) s))) >> 6))
+                  * PERL_COUNT_MULTIPLIER)
+                >> ((PERL_WORDSIZE - 1) * CHARBITS);
+        s += PERL_WORDSIZE;
+    } while (s + PERL_WORDSIZE <= e_limit);
+
+    /* Process remainder per-byte */
+    while (s < e) {
+       if (UTF8_IS_CONTINUATION(*s)) {
+            continuations++;
+            s++;
+            continue;
+        }
+
+        /* Here is a starter byte.  Use UTF8SKIP from now on */
+        do {
+            Ptrdiff_t expected_byte_count = UTF8SKIP(s);
+            if (UNLIKELY(e - s  < expected_byte_count)) {
+                break;
+            }
+
+            continuations += expected_byte_count- 1;
+            s += expected_byte_count;
+        } while (s < e);
+
+        break;
     }
 
-    /* Here, s > e on entry */
+#  endif
 
-  warn_and_return:
-    if (PL_op)
-        Perl_ck_warner_d(aTHX_ packWARN(WARN_UTF8),
-                         "%s in %s", unees, OP_DESC(PL_op));
-    else
-        Perl_ck_warner_d(aTHX_ packWARN(WARN_UTF8), "%s", unees);
+    if (LIKELY(e == s)) {
+        return s - s0 - continuations;
+    }
+
+    /* Convert to characters */
+    s -= continuations;
 
-    return len;
+    goto warn_and_return;
 }
 
 /*
@@ -2353,41 +2407,207 @@ Perl_utf8_to_bytes(pTHX_ U8 *s, STRLEN *lenp)
         return s;
     }
 
-    {
-        U8 * const save = s;
-        U8 * const send = s + *lenp;
-        U8 * d;
-
-        /* Nothing before the first variant needs to be changed, so start the real
-         * work there */
-        s = first_variant;
-        while (s < send) {
+    /* Nothing before 'first_variant' needs to be changed, so start the real
+     * work there */
+
+    U8 * const save = s;
+    U8 * const send = s + *lenp;
+    U8 * d;
+
+#ifndef EBCDIC      /* The below relies on the bit patterns of UTF-8 */
+
+    /* There is some start-up/tear-down overhead with this, so no real gain
+     * unless the string is long enough.  The current value is just a
+     * guess. */
+    if (*lenp > 5 * PERL_WORDSIZE) {
+
+        /* First, go through the string a word at-a-time to verify that it is
+         * downgradable.  If it contains any start byte besides C2 and C3, then
+         * it isn't. */
+
+        const PERL_UINTMAX_T C0_mask = PERL_COUNT_MULTIPLIER * 0xC0;
+        const PERL_UINTMAX_T C2_mask = PERL_COUNT_MULTIPLIER * 0xC2;
+        const PERL_UINTMAX_T FE_mask = PERL_COUNT_MULTIPLIER * 0xFE;
+
+        /* Points to the first byte >=s which is positioned at a word boundary.
+         * If s is on a word boundary, it is s, otherwise it is the first byte
+         * of the next word. */
+        U8 * partial_word_end = s + PERL_WORDSIZE * PERL_IS_SUBWORD_ADDR(s)
+                                - (PTR2nat(s) & PERL_WORD_BOUNDARY_MASK);
+
+        /* Here there is at least a full word beyond the first word boundary.
+         * Process up to that boundary. */
+        while (s < partial_word_end) {
             if (! UTF8_IS_INVARIANT(*s)) {
                 if (! UTF8_IS_NEXT_CHAR_DOWNGRADEABLE(s, send)) {
                     *lenp = ((STRLEN) -1);
-                    return 0;
+                    return NULL;
                 }
                 s++;
             }
             s++;
         }
 
-        /* Is downgradable, so do it */
-        d = s = first_variant;
-        while (s < send) {
-            U8 c = *s++;
-            if (! UVCHR_IS_INVARIANT(c)) {
-                /* Then it is two-byte encoded */
-                c = EIGHT_BIT_UTF8_TO_NATIVE(c, *s);
-                s++;
+        /* Adjust back down any overshoot */
+        s = partial_word_end;
+
+        /* Process per-word */
+        do {
+
+            PERL_UINTMAX_T C2_C3_start_bytes;
+
+            /* First find the bytes that are start bytes.  ANDing with
+             * C0C0...C0 causes any start byte to become C0; any other byte
+             * becomes something else.  Then XORing with C0 causes any start
+             * byte to become 0; all other bytes non-zero. */
+            PERL_UINTMAX_T start_bytes
+                          = ((* (PERL_UINTMAX_T *) s) & C0_mask) ^ C0_mask;
+
+            /* These shifts causes the most significant bit to be set to 1 for
+             * any bytes in the word that aren't completely 0.  Hence after
+             * these, only the start bytes have 0 in their msb */
+            start_bytes |= start_bytes << 1;
+            start_bytes |= start_bytes << 2;
+            start_bytes |= start_bytes << 4;
+
+            /* When we complement, then AND with 8080...80, the start bytes
+             * will have 1 in their msb, and all other bits are 0 */
+            start_bytes = ~ start_bytes & PERL_VARIANTS_WORD_MASK;
+
+            /* Now repeat the procedure, but look for bytes that match only
+             * C2-C3. */
+            C2_C3_start_bytes = ((* (PERL_UINTMAX_T *) s) & FE_mask)
+                                                                ^ C2_mask;
+            C2_C3_start_bytes |= C2_C3_start_bytes << 1;
+            C2_C3_start_bytes |= C2_C3_start_bytes << 2;
+            C2_C3_start_bytes |= C2_C3_start_bytes << 4;
+            C2_C3_start_bytes = ~ C2_C3_start_bytes
+                                & PERL_VARIANTS_WORD_MASK;
+
+            /* Here, start_bytes has a 1 in the msb of each byte that has a
+             *                                              start_byte; And
+             * C2_C3_start_bytes has a 1 in the msb of each byte that has a
+             *                                       start_byte of C2 or C3
+             * If they're not equal, there are start bytes that aren't C2
+             * nor C3, hence this is not downgradable */
+            if (start_bytes != C2_C3_start_bytes) {
+                *lenp = ((STRLEN) -1);
+                return NULL;
             }
-            *d++ = c;
+
+            s += PERL_WORDSIZE;
+        } while (s + PERL_WORDSIZE <= send);
+
+        /* If the final byte was a start byte, it means that the character
+         * straddles two words, so back off one to start looking below at the
+         * first byte of the character  */
+        if (s > first_variant && UTF8_IS_START(*(s-1))) {
+            s--;
+        }
+    }
+
+#endif
+
+    /* Do the straggler bytes beyond the final word boundary (or all bytes
+     * in the case of EBCDIC) */
+    while (s < send) {
+        if (! UTF8_IS_INVARIANT(*s)) {
+            if (! UTF8_IS_NEXT_CHAR_DOWNGRADEABLE(s, send)) {
+                *lenp = ((STRLEN) -1);
+                return NULL;
+            }
+            s++;
+        }
+        s++;
+    }
+
+    /* Here, we passed the tests above.  For the EBCDIC case, everything
+     * was well-formed and can be downgraded to non-UTF8.  For non-EBCDIC,
+     * it means only that all start bytes were C2 or C3, hence any
+     * well-formed sequences are downgradable.  But we didn't test, for
+     * example, that there weren't two C2's in a row.  That means that in
+     * the loop below, we have to be sure things are well-formed.  Because
+     * this is very very likely, and we don't care about having speedy
+     * handling of malformed input, the loop proceeds as if well formed,
+     * and should a malformed one come along, it undoes what it already has
+     * done */
+
+    d = s = first_variant;
+
+    while (s < send) {
+        U8 * s1;
+
+        if (UVCHR_IS_INVARIANT(*s)) {
+            *d++ = *s++;
+            continue;
         }
-        *d = '\0';
-        *lenp = d - save;
 
-        return save;
+        /* Here it is two-byte encoded. */
+        if (   LIKELY(UTF8_IS_DOWNGRADEABLE_START(*s))
+            && LIKELY(UTF8_IS_CONTINUATION((s[1]))))
+        {
+            U8 first_byte = *s++;
+            *d++ = EIGHT_BIT_UTF8_TO_NATIVE(first_byte, *s);
+            s++;
+            continue;
+        }
+
+        /* Here, it is malformed.  This shouldn't happen on EBCDIC, and on
+         * ASCII platforms, we know that the only start bytes in the text
+         * are C2 and C3, and the code above has made sure that it doesn't
+         * end with a start byte.  That means the only malformations that
+         * are possible are a start byte without a continuation (either
+         * followed by another start byte or an invariant) or an unexpected
+         * continuation.
+         *
+         * We have to undo all we've done before, back down to the first
+         * UTF-8 variant.  Note that each 2-byte variant we've done so far
+         * (converted to single byte) slides things to the left one byte,
+         * and so we have bytes that haven't been written over.
+         *
+         * Here, 'd' points to the next position to overwrite, and 's'
+         * points to the first invalid byte.  That means 'd's contents
+         * haven't been changed yet, nor has anything else beyond it in the
+         * string.  In restoring to the original contents, we don't need to
+         * do anything past (d-1).
+         *
+         * In particular, the bytes from 'd' to 's' have not been changed.
+         * This loop uses a new variable 's1' (to avoid confusing 'source'
+         * and 'destination') set to 'd',  and moves 's' and 's1' in lock
+         * step back so that afterwards, 's1' points to the first changed
+         * byte that will be the source for the first byte (or bytes) at
+         * 's' that need to be changed back.  Note that s1 can expand to
+         * two bytes */
+        s1 = d;
+        while (s >= d) {
+            s--;
+            if (! UVCHR_IS_INVARIANT(*s1)) {
+                s--;
+            }
+            s1--;
+        }
+
+        /* Do the changing back */
+        while (s1 >= first_variant) {
+            if (UVCHR_IS_INVARIANT(*s1)) {
+                *s-- = *s1--;
+            }
+            else {
+                *s-- = UTF8_EIGHT_BIT_LO(*s1);
+                *s-- = UTF8_EIGHT_BIT_HI(*s1);
+                s1--;
+            }
+        }
+
+        *lenp = ((STRLEN) -1);
+        return NULL;
     }
+
+    /* Success! */
+    *d = '\0';
+    *lenp = d - save;
+
+    return save;
 }
 
 /*
@@ -3042,8 +3262,8 @@ Perl__to_uni_fold_flags(pTHX_ UV c, U8* p, STRLEN *lenp, U8 flags)
     if (flags & FOLD_FLAGS_LOCALE) {
         /* Treat a non-Turkic UTF-8 locale as not being in locale at all,
          * except for potentially warning */
-        _CHECK_AND_WARN_PROBLEMATIC_LOCALE;
-        if (IN_UTF8_CTYPE_LOCALE && ! PL_in_utf8_turkic_locale) {
+        CHECK_AND_WARN_PROBLEMATIC_LOCALE_;
+        if (IN_UTF8_CTYPE_LOCALE && ! IN_UTF8_TURKIC_LOCALE) {
             flags &= ~FOLD_FLAGS_LOCALE;
         }
         else {
@@ -3096,7 +3316,8 @@ S_is_utf8_common(pTHX_ const U8 *const p, const U8 * const e,
 PERLVAR(I, seen_deprecated_macro, HV *)
 
 STATIC void
-S_warn_on_first_deprecated_use(pTHX_ const char * const name,
+S_warn_on_first_deprecated_use(pTHX_ U32 category,
+                                     const char * const name,
                                      const char * const alternative,
                                      const bool use_locale,
                                      const char * const file,
@@ -3106,7 +3327,7 @@ S_warn_on_first_deprecated_use(pTHX_ const char * const name,
 
     PERL_ARGS_ASSERT_WARN_ON_FIRST_DEPRECATED_USE;
 
-    if (ckWARN_d(WARN_DEPRECATED)) {
+    if (ckWARN_d(category)) {
 
         key = Perl_form(aTHX_ "%s;%d;%s;%d", name, use_locale, file, line);
         if (! hv_fetch(PL_seen_deprecated_macro, key, strlen(key), 0)) {
@@ -3120,14 +3341,14 @@ S_warn_on_first_deprecated_use(pTHX_ const char * const name,
             }
 
             if (instr(file, "mathoms.c")) {
-                Perl_warner(aTHX_ WARN_DEPRECATED,
+                Perl_warner(aTHX_ category,
                             "In %s, line %d, starting in Perl v5.32, %s()"
                             " will be removed.  Avoid this message by"
                             " converting to use %s().\n",
                             file, line, name, alternative);
             }
             else {
-                Perl_warner(aTHX_ WARN_DEPRECATED,
+                Perl_warner(aTHX_ category,
                             "In %s, line %d, starting in Perl v5.32, %s() will"
                             " require an additional parameter.  Avoid this"
                             " message by converting to use %s().\n",
@@ -3594,9 +3815,9 @@ S_turkic_uc(pTHX_ const U8 * const p, const U8 * const e,
                                L1_func_extra_param, turkic)                  \
                                                                              \
     if (flags & (locale_flags)) {                                            \
-        _CHECK_AND_WARN_PROBLEMATIC_LOCALE;                                  \
+        CHECK_AND_WARN_PROBLEMATIC_LOCALE_;                                  \
         if (IN_UTF8_CTYPE_LOCALE) {                                          \
-            if (UNLIKELY(PL_in_utf8_turkic_locale)) {                        \
+            if (UNLIKELY(IN_UTF8_TURKIC_LOCALE)) {                           \
                 UV ret = turkic(p, e, ustrp, lenp);                          \
                 if (ret) return ret;                                         \
             }                                                                \
@@ -4175,7 +4396,7 @@ Perl_foldEQ_utf8_flags(pTHX_ const char *s1, char **pe1, UV l1, bool u1,
 
     if (flags & FOLDEQ_LOCALE) {
         if (IN_UTF8_CTYPE_LOCALE) {
-            if (UNLIKELY(PL_in_utf8_turkic_locale)) {
+            if (UNLIKELY(IN_UTF8_TURKIC_LOCALE)) {
                 flags_for_folder |= FOLD_FLAGS_LOCALE;
             }
             else {
index 0a0e32d..3256cf6 100644 (file)
 #ifndef PERL_UTF8_H_      /* Guard against recursive inclusion */
 #define PERL_UTF8_H_ 1
 
+/*
+=for apidoc Ay||utf8ness_t
+
+This typedef is used by several core functions that return PV strings, to
+indicate the UTF-8ness of those strings.
+
+(If you write a new function, you probably should instead return the PV in an
+SV with the UTF-8 flag of the SV properly set, rather than use this mechanism.)
+
+The possible values this can be are:
+
+=over
+
+=item C<UTF8NESS_YES>
+
+This means the string definitely should be treated as a sequence of
+UTF-8-encoded characters.
+
+Most code that needs to handle this typedef should be of the form:
+
+ if (utf8ness_flag == UTF8NESS_YES) {
+     treat as utf8;  // like turning on an SV UTF-8 flag
+ }
+
+=item C<UTF8NESS_NO>
+
+This means the string definitely should be treated as a sequence of bytes, not
+encoded as UTF-8.
+
+=item C<UTF8NESS_IMMATERIAL>
+
+This means it is equally valid to treat the string as bytes, or as UTF-8
+characters; use whichever way you want.  This happens when the string consists
+entirely of characters which have the same representation whether encoded in
+UTF-8 or not.
+
+=item C<UTF8NESS_UNKNOWN>
+
+This means it is unknown how the string should be treated.  No core function
+will ever return this value to a non-core caller.  Instead, it is used by the
+caller to initialize a variable to a non-legal value.  A typical call will look like:
+
+ utf8ness_t string_is_utf8 = UTF8NESS_UNKNOWN
+ const char * string = foo(arg1, arg2, ..., &string_is_utf8);
+ if (string_is_utf8 == UTF8NESS_YES) {
+    do something for UTF-8;
+ }
+
+=back
+
+The following relationships hold between the enum values:
+
+=over
+
+=item S<C<0 E<lt>= I<enum value> E<lt>= UTF8NESS_IMMATERIAL>>
+
+the string may be treated in code as non-UTF8
+
+=item S<C<UTF8NESS_IMMATERIAL E<lt>= <I<enum value>>>
+
+the string may be treated in code as encoded in UTF-8
+
+=back
+
+=cut
+*/
+
+typedef enum {
+    UTF8NESS_NO               =  0,  /* Definitely not UTF-8 */
+    UTF8NESS_IMMATERIAL       =  1,  /* Representation is the same in UTF-8 as
+                                        not, so the UTF8ness doesn't actually
+                                        matter */
+    UTF8NESS_YES              =  2,  /* Defintely is UTF-8, wideness
+                                        unspecified */
+    UTF8NESS_UNKNOWN          = -1,  /* Undetermined so far */
+} utf8ness_t;
+
 /* Use UTF-8 as the default script encoding?
  * Turning this on will break scripts having non-UTF-8 binary
  * data (such as Latin-1) in string literals. */
@@ -331,12 +408,7 @@ C<cp> is Unicode if above 255; otherwise is platform-native.
 
 =cut
  */
-#if defined(__m88k__)
-/* XXX workaround: m88k gcc3 produces wrong code with NATIVE_TO_UNI() */
-#define UVCHR_IS_INVARIANT(cp)  (OFFUNI_IS_INVARIANT(cp))
-#else  /* the original one */
 #define UVCHR_IS_INVARIANT(cp)  (OFFUNI_IS_INVARIANT(NATIVE_TO_UNI(cp)))
-#endif
 
 /* This defines the 1-bits that are to be in the first byte of a multi-byte
  * UTF-8 encoded character that mark it as a start byte and give the number of
@@ -664,7 +736,7 @@ uppercase/lowercase/titlecase/fold into.
 #define TWO_BYTE_UTF8_TO_NATIVE(HI, LO) \
     (__ASSERT_(FITS_IN_8_BITS(HI))                                              \
      __ASSERT_(FITS_IN_8_BITS(LO))                                              \
-     __ASSERT_(PL_utf8skip[HI] == 2)                                            \
+     __ASSERT_(PL_utf8skip[(U8) HI] == 2)                                            \
      __ASSERT_(UTF8_IS_CONTINUATION(LO))                                        \
      UNI_TO_NATIVE(UTF8_ACCUMULATE((NATIVE_UTF8_TO_I8(HI) & UTF_START_MASK(2)), \
                                    (LO))))
@@ -866,8 +938,8 @@ case any call to string overloading updates the internal UTF-8 encoding flag.
 
 /* Should all strings be treated as Unicode, and not just UTF-8 encoded ones?
  * Is so within 'feature unicode_strings' or 'locale :not_characters', and not
- * within 'use bytes'.  UTF-8 locales are not tested for here, but perhaps
- * could be */
+ * within 'use bytes'.  UTF-8 locales are not tested for here, because it gets
+ * complicated by the probability of having categories in different locales. */
 #define IN_UNI_8_BIT                                                    \
             ((    (      (CopHINTS_get(PL_curcop) & HINT_UNI_8_BIT))    \
                    || (   CopHINTS_get(PL_curcop) & HINT_LOCALE_PARTIAL \
index eebbe26..347a7b1 100644 (file)
@@ -12,7 +12,7 @@
  *
  * To summarize, the way it works is:
  * To convert an EBCDIC code point to UTF-EBCDIC:
- *  1) convert to Unicode.  No conversion is necesary for code points above
+ *  1) convert to Unicode.  No conversion is necessary for code points above
  *      255, as Unicode and EBCDIC are identical in this range.  For smaller
  *      code points, the conversion is done by lookup in the PL_e2a table (with
  *      inverse PL_a2e) in the generated file 'ebcdic_tables.h'.  The 'a'
@@ -73,7 +73,7 @@
  * macro NATIVE_TO_I8().  However, one "shadow", or parallel table,
  * PL_utf8skip, has been constructed that doesn't require undoing things.  It
  * is such that for each byte, it says how long the sequence is if that
-* (UTF-EBCDIC) byte were to begin it
+ * (UTF-EBCDIC) byte were to begin it.
  *
  * There are actually 3 slightly different UTF-EBCDIC encodings in
  * ebcdic_tables.h, one for each of the code pages recognized by Perl.  That
index 22cde1c..3c1cae4 100644 (file)
@@ -242,6 +242,7 @@ Perl_safesysrealloc(Malloc_t where,MEM_SIZE size)
     }
     else {
         dSAVE_ERRNO;
+        PERL_DEB(UV was_where = PTR2UV(where)); /* used in diags below */
 #ifdef USE_MDH
         where = (Malloc_t)((char*)where-PERL_MEMORY_DEBUG_HEADER_SIZE);
         if (size + PERL_MEMORY_DEBUG_HEADER_SIZE < size)
@@ -326,7 +327,7 @@ Perl_safesysrealloc(Malloc_t where,MEM_SIZE size)
     /* In particular, must do that fixup above before logging anything via
      *printf(), as it can reallocate memory, which can cause SEGVs.  */
 
-        DEBUG_m(PerlIO_printf(Perl_debug_log, "0x%" UVxf ": (%05ld) rfree\n",PTR2UV(where),(long)PL_an++));
+        DEBUG_m(PerlIO_printf(Perl_debug_log, "0x%" UVxf ": (%05ld) rfree\n",was_where,(long)PL_an++));
         DEBUG_m(PerlIO_printf(Perl_debug_log, "0x%" UVxf ": (%05ld) realloc %ld bytes\n",PTR2UV(ptr),(long)PL_an++,(long)size));
 
         if (ptr == NULL) {
@@ -557,7 +558,7 @@ Free_t   Perl_mfree (Malloc_t where)
 /* This is the value stored in *retlen in the two delimcpy routines below when
  * there wasn't enough room in the destination to store everything it was asked
  * to.  The value is deliberately very large so that hopefully if code uses it
- * unquestioninly to access memory, it will likely segfault.  And it is small
+ * unquestioningly to access memory, it will likely segfault.  And it is small
  * enough that if the caller does some arithmetic on it before accessing, it
  * won't overflow into a small legal number. */
 #define DELIMCPY_OUT_OF_BOUNDS_RET  I32_MAX
@@ -1319,77 +1320,6 @@ Perl_cntrl_to_mnemonic(const U8 c)
     return NULL;
 }
 
-/* copy a string to a safe spot */
-
-/*
-=for apidoc_section $string
-=for apidoc savepv
-
-Perl's version of C<strdup()>.  Returns a pointer to a newly allocated
-string which is a duplicate of C<pv>.  The size of the string is
-determined by C<strlen()>, which means it may not contain embedded C<NUL>
-characters and must have a trailing C<NUL>.  To prevent memory leaks, the
-memory allocated for the new string needs to be freed when no longer needed.
-This can be done with the C<L</Safefree>> function, or
-L<C<SAVEFREEPV>|perlguts/SAVEFREEPV(p)>.
-
-On some platforms, Windows for example, all allocated memory owned by a thread
-is deallocated when that thread ends.  So if you need that not to happen, you
-need to use the shared memory functions, such as C<L</savesharedpv>>.
-
-=cut
-*/
-
-char *
-Perl_savepv(pTHX_ const char *pv)
-{
-    PERL_UNUSED_CONTEXT;
-    if (!pv)
-        return NULL;
-    else {
-        char *newaddr;
-        const STRLEN pvlen = strlen(pv)+1;
-        Newx(newaddr, pvlen, char);
-        return (char*)memcpy(newaddr, pv, pvlen);
-    }
-}
-
-/* same thing but with a known length */
-
-/*
-=for apidoc savepvn
-
-Perl's version of what C<strndup()> would be if it existed.  Returns a
-pointer to a newly allocated string which is a duplicate of the first
-C<len> bytes from C<pv>, plus a trailing
-C<NUL> byte.  The memory allocated for
-the new string can be freed with the C<Safefree()> function.
-
-On some platforms, Windows for example, all allocated memory owned by a thread
-is deallocated when that thread ends.  So if you need that not to happen, you
-need to use the shared memory functions, such as C<L</savesharedpvn>>.
-
-=cut
-*/
-
-char *
-Perl_savepvn(pTHX_ const char *pv, Size_t len)
-{
-    char *newaddr;
-    PERL_UNUSED_CONTEXT;
-
-    Newx(newaddr,len+1,char);
-    /* Give a meaning to NULL pointer mainly for the use in sv_magic() */
-    if (pv) {
-        /* might not be null terminated */
-        newaddr[len] = '\0';
-        return (char *) CopyD(pv,newaddr,len,char);
-    }
-    else {
-        return (char *) ZeroD(newaddr,len+1,char);
-    }
-}
-
 /*
 =for apidoc savesharedpv
 
@@ -1441,53 +1371,6 @@ Perl_savesharedpvn(pTHX_ const char *const pv, const STRLEN len)
     return (char*)memcpy(newaddr, pv, len);
 }
 
-/*
-=for apidoc savesvpv
-
-A version of C<savepv()>/C<savepvn()> which gets the string to duplicate from
-the passed in SV using C<SvPV()>
-
-On some platforms, Windows for example, all allocated memory owned by a thread
-is deallocated when that thread ends.  So if you need that not to happen, you
-need to use the shared memory functions, such as C<L</savesharedsvpv>>.
-
-=cut
-*/
-
-char *
-Perl_savesvpv(pTHX_ SV *sv)
-{
-    STRLEN len;
-    const char * const pv = SvPV_const(sv, len);
-    char *newaddr;
-
-    PERL_ARGS_ASSERT_SAVESVPV;
-
-    ++len;
-    Newx(newaddr,len,char);
-    return (char *) CopyD(pv,newaddr,len,char);
-}
-
-/*
-=for apidoc savesharedsvpv
-
-A version of C<savesharedpv()> which allocates the duplicate string in
-memory which is shared between threads.
-
-=cut
-*/
-
-char *
-Perl_savesharedsvpv(pTHX_ SV *sv)
-{
-    STRLEN len;
-    const char * const pv = SvPV_const(sv, len);
-
-    PERL_ARGS_ASSERT_SAVESHAREDSVPV;
-
-    return savesharedpvn(pv, len);
-}
-
 /* the SV for Perl_form() and mess() is not kept in an arena */
 
 STATIC SV *
@@ -1742,8 +1625,8 @@ Perl_mess_sv(pTHX_ SV *basemsg, bool consume)
                 cop = PL_curcop;
 
             if (CopLINE(cop))
-                Perl_sv_catpvf(aTHX_ sv, " at %s line %" IVdf,
-                                OutCopFILE(cop), (IV)CopLINE(cop));
+                Perl_sv_catpvf(aTHX_ sv, " at %s line %" LINE_Tf,
+                                OutCopFILE(cop), CopLINE(cop));
         }
 
         /* Seems that GvIO() can be untrustworthy during global destruction. */
@@ -1756,7 +1639,7 @@ Perl_mess_sv(pTHX_ SV *basemsg, bool consume)
             Perl_sv_catpvf(aTHX_ sv, ", <%" SVf "> %s %" IVdf,
                            SVfARG(PL_last_in_gv == PL_argvgv
                                  ? &PL_sv_no
-                                 : sv_2mortal(newSVhek(GvNAME_HEK(PL_last_in_gv)))),
+                                 : newSVhek_mortal(GvNAME_HEK(PL_last_in_gv))),
                            line_mode ? "line" : "chunk",
                            (IV)IoLINES(GvIOp(PL_last_in_gv)));
         }
@@ -1834,8 +1717,8 @@ S_with_queued_errors(pTHX_ SV *ex)
     return ex;
 }
 
-STATIC bool
-S_invoke_exception_hook(pTHX_ SV *ex, bool warn)
+bool
+Perl_invoke_exception_hook(pTHX_ SV *ex, bool warn)
 {
     HV *stash;
     GV *gv;
@@ -2054,15 +1937,6 @@ Perl_croak_nocontext(const char *pat, ...)
 }
 #endif /* MULTIPLICITY */
 
-/* saves machine code for a common noreturn idiom typically used in Newx*() */
-GCC_DIAG_IGNORE_DECL(-Wunused-function);
-void
-Perl_croak_memory_wrap(void)
-{
-    Perl_croak_nocontext("%s",PL_memory_wrap);
-}
-GCC_DIAG_RESTORE_DECL;
-
 void
 Perl_croak(pTHX_ const char *pat, ...)
 {
@@ -2391,23 +2265,19 @@ S_ckwarn_common(pTHX_ U32 w)
     return FALSE;
 }
 
-/* Set buffer=NULL to get a new one.  */
-STRLEN *
-Perl_new_warnings_bitfield(pTHX_ STRLEN *buffer, const char *const bits,
+char *
+Perl_new_warnings_bitfield(pTHX_ char *buffer, const char *const bits,
                            STRLEN size) {
-    const MEM_SIZE len_wanted =
-        sizeof(STRLEN) + (size > WARNsize ? size : WARNsize);
+    const MEM_SIZE len_wanted = (size > WARNsize ? size : WARNsize);
     PERL_UNUSED_CONTEXT;
     PERL_ARGS_ASSERT_NEW_WARNINGS_BITFIELD;
 
-    buffer = (STRLEN*)
-        (specialWARN(buffer) ?
-         PerlMemShared_malloc(len_wanted) :
-         PerlMemShared_realloc(buffer, len_wanted));
-    buffer[0] = size;
-    Copy(bits, (buffer + 1), size, char);
+    /* pass in null as the source string as we will do the
+     * copy ourselves. */
+    buffer = rcpv_new(NULL, len_wanted, RCPVf_NO_COPY);
+    Copy(bits, buffer, size, char);
     if (size < WARNsize)
-        Zero((char *)(buffer + 1) + size, WARNsize - size, char);
+        Zero(buffer + size, WARNsize - size, char);
     return buffer;
 }
 
@@ -2423,22 +2293,14 @@ Perl_new_warnings_bitfield(pTHX_ STRLEN *buffer, const char *const bits,
 
 
 
-#ifdef USE_ENVIRON_ARRAY
+#if defined(USE_ENVIRON_ARRAY) || defined(WIN32)
 /* NB: VMS' my_setenv() is in vms.c */
 
-/* Configure doesn't test for HAS_SETENV yet, so decide based on platform.
- * For Solaris, setenv() and unsetenv() were introduced in Solaris 9, so
- * testing for HAS UNSETENV is sufficient.
- */
-#  if defined(__CYGWIN__)|| defined(__riscos__) || (defined(__sun) && defined(HAS_UNSETENV)) || defined(PERL_DARWIN)
-#    define MY_HAS_SETENV
-#  endif
-
 /* small wrapper for use by Perl_my_setenv that mallocs, or reallocs if
  * 'current' is non-null, with up to three sizes that are added together.
  * It handles integer overflow.
  */
-#  ifndef MY_HAS_SETENV
+#  ifndef HAS_SETENV
 static char *
 S_env_alloc(void *current, Size_t l1, Size_t l2, Size_t l3, Size_t size)
 {
@@ -2465,9 +2327,6 @@ S_env_alloc(void *current, Size_t l1, Size_t l2, Size_t l3, Size_t size)
 }
 #  endif
 
-
-#  if !defined(WIN32)
-
 /*
 =for apidoc_section $utility
 =for apidoc my_setenv
@@ -2481,156 +2340,54 @@ version has desirable safeguards
 void
 Perl_my_setenv(pTHX_ const char *nam, const char *val)
 {
-#    ifdef __amigaos4__
-  amigaos4_obtain_environ(__FUNCTION__);
-#    endif
-
-#    ifdef USE_ITHREADS
-  /* only parent thread can modify process environment, so no need to use a
-   * mutex */
-  if (PL_curinterp == aTHX)
-#    endif
-  {
-
-#    ifndef PERL_USE_SAFE_PUTENV
-    if (!PL_use_safe_putenv) {
-        /* most putenv()s leak, so we manipulate environ directly */
-        UV i;
-        Size_t vlen, nlen = strlen(nam);
-
-        /* where does it go? */
-        for (i = 0; environ[i]; i++) {
-            if (strnEQ(environ[i], nam, nlen) && environ[i][nlen] == '=')
-                break;
-        }
-
-        if (environ == PL_origenviron) {   /* need we copy environment? */
-            UV j, max;
-            char **tmpenv;
-
-            max = i;
-            while (environ[max])
-                max++;
-
-            /* XXX shouldn't that be max+1 rather than max+2 ??? - DAPM */
-            tmpenv = (char**)S_env_alloc(NULL, max, 2, 0, sizeof(char*));
-
-            for (j=0; j<max; j++) {         /* copy environment */
-                const Size_t len = strlen(environ[j]);
-                tmpenv[j] = S_env_alloc(NULL, len, 1, 0, 1);
-                Copy(environ[j], tmpenv[j], len+1, char);
-            }
-
-            tmpenv[max] = NULL;
-            environ = tmpenv;               /* tell exec where it is now */
-        }
-
-        if (!val) {
-            safesysfree(environ[i]);
-            while (environ[i]) {
-                environ[i] = environ[i+1];
-                i++;
-            }
-#      ifdef __amigaos4__
-            goto my_setenv_out;
-#      else
-            return;
-#      endif
-        }
-
-        if (!environ[i]) {                 /* does not exist yet */
-            environ = (char**)S_env_alloc(environ, i, 2, 0, sizeof(char*));
-            environ[i+1] = NULL;    /* make sure it's null terminated */
-        }
-        else
-            safesysfree(environ[i]);
-
-        vlen = strlen(val);
-
-        environ[i] = S_env_alloc(NULL, nlen, vlen, 2, 1);
-        /* all that work just for this */
-        my_setenv_format(environ[i], nam, nlen, val, vlen);
-    }
-    else {
-
-#    endif /* !PERL_USE_SAFE_PUTENV */
+#  if defined(USE_ITHREADS) && !defined(WIN32)
+    /* only parent thread can modify process environment, so no need to use a
+     * mutex */
+    if (PL_curinterp != aTHX)
+        return;
+#  endif
 
-#    ifdef MY_HAS_SETENV
-#      if defined(HAS_UNSETENV)
+#  if defined(HAS_SETENV) && defined(HAS_UNSETENV)
         if (val == NULL) {
-            (void)unsetenv(nam);
+            unsetenv(nam);
         } else {
-            (void)setenv(nam, val, 1);
+            setenv(nam, val, 1);
         }
-#      else /* ! HAS_UNSETENV */
-        (void)setenv(nam, val, 1);
-#      endif /* HAS_UNSETENV */
 
-#    elif defined(HAS_UNSETENV)
+#  elif defined(HAS_UNSETENV)
 
         if (val == NULL) {
             if (environ) /* old glibc can crash with null environ */
-                (void)unsetenv(nam);
+                unsetenv(nam);
         } else {
             const Size_t nlen = strlen(nam);
             const Size_t vlen = strlen(val);
             char * const new_env = S_env_alloc(NULL, nlen, vlen, 2, 1);
             my_setenv_format(new_env, nam, nlen, val, vlen);
-            (void)putenv(new_env);
+            putenv(new_env);
         }
 
-#    else /* ! HAS_UNSETENV */
+#  else /* ! HAS_UNSETENV */
 
-        char *new_env;
         const Size_t nlen = strlen(nam);
-        Size_t vlen;
         if (!val) {
            val = "";
         }
-        vlen = strlen(val);
-        new_env = S_env_alloc(NULL, nlen, vlen, 2, 1);
+        Size_t vlen = strlen(val);
+        char *new_env = S_env_alloc(NULL, nlen, vlen, 2, 1);
         /* all that work just for this */
         my_setenv_format(new_env, nam, nlen, val, vlen);
-        (void)putenv(new_env);
-
-#    endif /* MY_HAS_SETENV */
-
-#    ifndef PERL_USE_SAFE_PUTENV
-    }
+#    ifndef WIN32
+        putenv(new_env);
+#    else
+        PerlEnv_putenv(new_env);
+        safesysfree(new_env);
 #    endif
-  }
-
-#    ifdef __amigaos4__
-my_setenv_out:
-  amigaos4_release_environ(__FUNCTION__);
-#    endif
-}
 
-#  else /* WIN32 */
-
-void
-Perl_my_setenv(pTHX_ const char *nam, const char *val)
-{
-    char *envstr;
-    const Size_t nlen = strlen(nam);
-    Size_t vlen;
-
-    if (!val) {
-       val = "";
-    }
-    vlen = strlen(val);
-    envstr = S_env_alloc(NULL, nlen, vlen, 2, 1);
-    my_setenv_format(envstr, nam, nlen, val, vlen);
-    (void)PerlEnv_putenv(envstr);
-    safesysfree(envstr);
+#  endif /* HAS_SETENV */
 }
 
-#  endif /* WIN32 */
-
-#endif /* USE_ENVIRON_ARRAY */
-
-
-
+#endif /* USE_ENVIRON_ARRAY || WIN32 */
 
 #ifdef UNLINK_ALL_VERSIONS
 I32
@@ -3803,35 +3560,6 @@ Perl_find_script(pTHX_ const char *scriptname, bool dosearch,
 
 #ifndef PERL_GET_CONTEXT_DEFINED
 
-/*
-=for apidoc_section $embedding
-=for apidoc get_context
-
-Implements L<perlapi/C<PERL_GET_CONTEXT>>, which you should use instead.
-
-=cut
-*/
-
-void *
-Perl_get_context(void)
-{
-#if defined(USE_ITHREADS)
-#  ifdef OLD_PTHREADS_API
-    pthread_addr_t t;
-    int error = pthread_getspecific(PL_thr_key, &t);
-    if (error)
-        Perl_croak_nocontext("panic: pthread_getspecific, error=%d", error);
-    return (void*)t;
-#  elif defined(I_MACH_CTHREADS)
-    return (void*)cthread_data(cthread_self());
-#  else
-    return (void*)PTHREAD_GETSPECIFIC(PL_thr_key);
-#  endif
-#else
-    return (void*)NULL;
-#endif
-}
-
 /*
 =for apidoc_section $embedding
 =for apidoc set_context
@@ -3853,7 +3581,7 @@ Perl_set_context(void *t)
     cthread_set_data(cthread_self(), t);
 #  else
     /* We set thread-specific value always, as C++ code has to read it with
-     * pthreads, beacuse the declaration syntax for thread local storage for C11
+     * pthreads, because the declaration syntax for thread local storage for C11
      * is incompatible with C++, meaning that we can't expose the thread local
      * variable to C++ code. */
     {
@@ -3862,6 +3590,9 @@ Perl_set_context(void *t)
             Perl_croak_nocontext("panic: pthread_setspecific, error=%d", error);
     }
 #  endif
+
+    PERL_SET_NON_tTHX_CONTEXT(t);
+
 #else
     PERL_UNUSED_ARG(t);
 #endif
@@ -3869,6 +3600,16 @@ Perl_set_context(void *t)
 
 #endif /* !PERL_GET_CONTEXT_DEFINED */
 
+/*
+=for apidoc get_op_names
+
+Return a pointer to the array of all the names of the various OPs
+Given an opcode from the enum in F<opcodes.h>, C<PL_op_name[opcode]> returns a
+pointer to a C language string giving its name.
+
+=cut
+*/
+
 char **
 Perl_get_op_names(pTHX)
 {
@@ -3876,6 +3617,16 @@ Perl_get_op_names(pTHX)
     return (char **)PL_op_name;
 }
 
+/*
+=for apidoc get_op_descs
+
+Return a pointer to the array of all the descriptions of the various OPs
+Given an opcode from the enum in F<opcodes.h>, C<PL_op_desc[opcode]> returns a
+pointer to a C language string giving its description.
+
+=cut
+*/
+
 char **
 Perl_get_op_descs(pTHX)
 {
@@ -3917,16 +3668,6 @@ Perl_getenv_len(pTHX_ const char *env_elem, unsigned long *len)
 }
 #endif
 
-
-MGVTBL*
-Perl_get_vtbl(pTHX_ int vtbl_id)
-{
-    PERL_UNUSED_CONTEXT;
-
-    return (vtbl_id < 0 || vtbl_id >= magic_vtable_max)
-        ? NULL : (MGVTBL*)PL_magic_vtables + vtbl_id;
-}
-
 /*
 =for apidoc_section $io
 =for apidoc my_fflush_all
@@ -4018,7 +3759,7 @@ Perl_report_evil_fh(pTHX_ const GV *gv)
     if (ckWARN(warn_type)) {
         SV * const name
             = gv && isGV_with_GP(gv) && GvENAMELEN(gv) ?
-                                     sv_2mortal(newSVhek(GvENAME_HEK(gv))) : NULL;
+                                     newSVhek_mortal(GvENAME_HEK(gv)) : NULL;
         const char * const pars =
             (const char *)(OP_IS_FILETEST(op) ? "" : "()");
         const char * const func =
@@ -4077,11 +3818,12 @@ Perl_init_tm(pTHX_ struct tm *ptm)      /* see mktime, strftime and asctime */
     PERL_UNUSED_CONTEXT;
     PERL_ARGS_ASSERT_INIT_TM;
     (void)time(&now);
-    ENV_LOCALE_READ_LOCK;
+
+    LOCALTIME_LOCK;
     my_tm = localtime(&now);
     if (my_tm)
         Copy(my_tm, ptm, 1, struct tm);
-    ENV_LOCALE_READ_UNLOCK;
+    LOCALTIME_UNLOCK;
 #else
     PERL_UNUSED_CONTEXT;
     PERL_ARGS_ASSERT_INIT_TM;
@@ -4107,19 +3849,19 @@ Perl_mini_mktime(struct tm *ptm)
 
     PERL_ARGS_ASSERT_MINI_MKTIME;
 
-#define        DAYS_PER_YEAR   365
-#define        DAYS_PER_QYEAR  (4*DAYS_PER_YEAR+1)
-#define        DAYS_PER_CENT   (25*DAYS_PER_QYEAR-1)
-#define        DAYS_PER_QCENT  (4*DAYS_PER_CENT+1)
-#define        SECS_PER_HOUR   (60*60)
-#define        SECS_PER_DAY    (24*SECS_PER_HOUR)
+#define DAYS_PER_YEAR   365
+#define DAYS_PER_QYEAR  (4*DAYS_PER_YEAR+1)
+#define DAYS_PER_CENT   (25*DAYS_PER_QYEAR-1)
+#define DAYS_PER_QCENT  (4*DAYS_PER_CENT+1)
+#define SECS_PER_HOUR   (60*60)
+#define SECS_PER_DAY    (24*SECS_PER_HOUR)
 /* parentheses deliberately absent on these two, otherwise they don't work */
-#define        MONTH_TO_DAYS   153/5
-#define        DAYS_TO_MONTH   5/153
+#define MONTH_TO_DAYS   153/5
+#define DAYS_TO_MONTH   5/153
 /* offset to bias by March (month 4) 1st between month/mday & year finding */
-#define        YEAR_ADJUST     (4*MONTH_TO_DAYS+1)
+#define YEAR_ADJUST     (4*MONTH_TO_DAYS+1)
 /* as used here, the algorithm leaves Sunday as day 1 unless we adjust it */
-#define        WEEKDAY_BIAS    6       /* (1+6)%7 makes Sunday 0 again */
+#define WEEKDAY_BIAS    6       /* (1+6)%7 makes Sunday 0 again */
 
 /*
  * Year/day algorithm notes:
@@ -4284,128 +4026,6 @@ Perl_mini_mktime(struct tm *ptm)
     ptm->tm_wday = (jday + WEEKDAY_BIAS) % 7;
 }
 
-char *
-Perl_my_strftime(pTHX_ const char *fmt, int sec, int min, int hour, int mday, int mon, int year, int wday, int yday, int isdst)
-{
-#ifdef HAS_STRFTIME
-
-/*
-=for apidoc_section $time
-=for apidoc my_strftime
-strftime(), but with a different API so that the return value is a pointer
-to the formatted result (which MUST be arranged to be FREED BY THE
-CALLER).  This allows this function to increase the buffer size as needed,
-so that the caller doesn't have to worry about that.
-
-Note that yday and wday effectively are ignored by this function, as
-mini_mktime() overwrites them
-
-Also note that this is always executed in the underlying locale of the program,
-giving localized results.
-
-=cut
- */
-
-  char *buf;
-  int buflen;
-  struct tm mytm;
-  int len;
-
-  PERL_ARGS_ASSERT_MY_STRFTIME;
-
-  init_tm(&mytm);      /* XXX workaround - see init_tm() above */
-  mytm.tm_sec = sec;
-  mytm.tm_min = min;
-  mytm.tm_hour = hour;
-  mytm.tm_mday = mday;
-  mytm.tm_mon = mon;
-  mytm.tm_year = year;
-  mytm.tm_wday = wday;
-  mytm.tm_yday = yday;
-  mytm.tm_isdst = isdst;
-  mini_mktime(&mytm);
-  /* use libc to get the values for tm_gmtoff and tm_zone [perl #18238] */
-#if defined(HAS_MKTIME) && (defined(HAS_TM_TM_GMTOFF) || defined(HAS_TM_TM_ZONE))
-  STMT_START {
-    struct tm mytm2;
-    mytm2 = mytm;
-    mktime(&mytm2);
-#ifdef HAS_TM_TM_GMTOFF
-    mytm.tm_gmtoff = mytm2.tm_gmtoff;
-#endif
-#ifdef HAS_TM_TM_ZONE
-    mytm.tm_zone = mytm2.tm_zone;
-#endif
-  } STMT_END;
-#endif
-  buflen = 64;
-  Newx(buf, buflen, char);
-
-  GCC_DIAG_IGNORE_STMT(-Wformat-nonliteral); /* fmt checked by caller */
-
-  len = strftime(buf, buflen, fmt, &mytm);
-
-  GCC_DIAG_RESTORE_STMT;
-
-  /*
-  ** The following is needed to handle the situation where
-  ** tmpbuf overflows.  Basically we want to allocate a buffer
-  ** and try repeatedly, until it's large enough.  The reason why it is so
-  ** complicated ** is that getting a return value of 0 from strftime can
-  ** indicate one of the following:
-  ** 1. buffer overflowed,
-  ** 2. illegal conversion specifier, or
-  ** 3. the format string specifies nothing to be returned (which isn't an
-  **    an error).  This could be because the format is an empty string
-  **    or it specifies %p which yields an empty string in some locales.
-  ** If there is a better way to make it portable, go ahead by
-  ** all means.
-  */
-  if (inRANGE(len, 1, buflen - 1) || (len == 0 && *fmt == '\0'))
-    return buf;
-  else {
-    /* Possibly buf overflowed - try again with a bigger buf */
-    const int fmtlen = strlen(fmt);
-    int bufsize = fmtlen + buflen;
-
-    Renew(buf, bufsize, char);
-    while (buf) {
-
-      GCC_DIAG_IGNORE_STMT(-Wformat-nonliteral); /* fmt checked by caller */
-      buflen = strftime(buf, bufsize, fmt, &mytm);
-      GCC_DIAG_RESTORE_STMT;
-
-      if (inRANGE(buflen, 1, bufsize - 1))
-        break;
-      /* heuristic to prevent out-of-memory errors */
-      if (bufsize > 100*fmtlen) {
-
-        /* "%p" can legally return nothing, assume that was the case if we
-         * can't make the buffer large enough to get a non-zero return.  For
-         * any other formats, assume it is an error (probably it is an illegal
-         * conversion specifier.) */
-        if (strEQ(fmt, "%p")) {
-            Renew(buf, 1, char);
-            *buf = '\0';
-        }
-        else {
-            Safefree(buf);
-            buf = NULL;
-        }
-        break;
-      }
-      bufsize *= 2;
-      Renew(buf, bufsize, char);
-    }
-    return buf;
-  }
-#else
-  Perl_croak(aTHX_ "panic: no strftime");
-  return NULL;
-#endif
-}
-
-
 #define SV_CWD_RETURN_UNDEF \
     sv_set_undef(sv); \
     return FALSE
@@ -4604,7 +4224,7 @@ S_socketpair_udp (int fd[2]) {
 
         addresses[i].sin_family = AF_INET;
         addresses[i].sin_addr.s_addr = htonl(INADDR_LOOPBACK);
-        addresses[i].sin_port = 0;     /* kernel choses port.  */
+        addresses[i].sin_port = 0;     /* kernel chooses port.  */
         if (PerlSock_bind(sockets[i], (struct sockaddr *) &addresses[i],
                 sizeof(struct sockaddr_in)) == -1)
             goto tidy_up_and_fail;
@@ -4776,7 +4396,7 @@ Perl_my_socketpair (int family, int type, int protocol, int fd[2]) {
     memset(&listen_addr, 0, sizeof(listen_addr));
     listen_addr.sin_family = AF_INET;
     listen_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
-    listen_addr.sin_port = 0;  /* kernel choses port.  */
+    listen_addr.sin_port = 0;  /* kernel chooses port.  */
     if (PerlSock_bind(listener, (struct sockaddr *) &listen_addr,
             sizeof(listen_addr)) == -1)
         goto tidy_up_and_fail;
@@ -4972,12 +4592,42 @@ Perl_parse_unicode_opts(pTHX_ const char **popt)
 #  include <starlet.h>
 #endif
 
+/* hash a pointer and return a U32
+ *
+ * this code was derived from Sereal, which was derived from autobox.
+ */
+
+PERL_STATIC_INLINE U32 S_ptr_hash(PTRV u) {
+#if PTRSIZE == 8
+    /*
+     * This is one of Thomas Wang's hash functions for 64-bit integers from:
+     * http://www.concentric.net/~Ttwang/tech/inthash.htm
+     */
+    u = (~u) + (u << 18);
+    u = u ^ (u >> 31);
+    u = u * 21;
+    u = u ^ (u >> 11);
+    u = u + (u << 6);
+    u = u ^ (u >> 22);
+#else
+    /*
+     * This is one of Bob Jenkins' hash functions for 32-bit integers
+     * from: http://burtleburtle.net/bob/hash/integer.html
+     */
+    u = (u + 0x7ed55d16) + (u << 12);
+    u = (u ^ 0xc761c23c) ^ (u >> 19);
+    u = (u + 0x165667b1) + (u << 5);
+    u = (u + 0xd3a2646c) ^ (u << 9);
+    u = (u + 0xfd7046c5) + (u << 3);
+    u = (u ^ 0xb55a4f09) ^ (u >> 16);
+#endif
+    return (U32)u;
+}
+
+
 U32
 Perl_seed(pTHX)
 {
-#if defined(__OpenBSD__)
-       return arc4random();
-#else
     /*
      * This is really just a quick hack which grabs various garbage
      * values.  It really should be a real hash algorithm which
@@ -5043,10 +4693,10 @@ Perl_seed(pTHX)
     u += SEED_C3 * (U32)PerlProc_getpid();
     u += SEED_C4 * (U32)PTR2UV(PL_stack_sp);
 #ifndef PLAN9           /* XXX Plan9 assembler chokes on this; fix needed  */
-    u += SEED_C5 * (U32)PTR2UV(&when);
+    UV ptruv = PTR2UV(&when);
+    u += SEED_C5 * ptr_hash(ptruv);
 #endif
     return u;
-#endif
 }
 
 void
@@ -5213,7 +4863,7 @@ Perl_debug_hash_seed(pTHX_ bool via_debug_h)
 /* -DPERL_MEM_LOG_SPRINTF_BUF_SIZE=X: size of a (stack-allocated) buffer
  * the Perl_mem_log_...() will use (either via sprintf or snprintf).
  */
-#define PERL_MEM_LOG_SPRINTF_BUF_SIZE 128
+#define PERL_MEM_LOG_SPRINTF_BUF_SIZE 256
 
 /* -DPERL_MEM_LOG_FD=N: the file descriptor the Perl_mem_log_...()
  * writes to.  In the default logger, this is settable at runtime.
@@ -5322,6 +4972,33 @@ S_mem_log_common(enum mem_log_type mlt, const UV n,
                 len = 0;
             }
             PERL_UNUSED_RESULT(PerlLIO_write(fd, buf, len));
+#ifdef USE_C_BACKTRACE
+            if(strchr(pmlenv,'c') && (mlt == MLT_NEW_SV)) {
+                len = my_snprintf(buf, sizeof(buf),
+                        "  caller %s at %s line %" LINE_Tf "\n",
+                        /* CopSTASHPV can crash early on startup; use CopFILE to check */
+                        CopFILE(PL_curcop) ? CopSTASHPV(PL_curcop) : "<unknown>",
+                        CopFILE(PL_curcop), CopLINE(PL_curcop));
+                PERL_UNUSED_RESULT(PerlLIO_write(fd, buf, len));
+
+                Perl_c_backtrace *bt = Perl_get_c_backtrace(aTHX_ 3, 3);
+                Perl_c_backtrace_frame *frame;
+                UV i;
+                for (i = 0, frame = bt->frame_info;
+                        i < bt->header.frame_count;
+                        i++, frame++) {
+                    len = my_snprintf(buf, sizeof(buf),
+                            "  frame[%" UVuf "]: %p %s at %s +0x%lx\n",
+                            i,
+                            frame->addr,
+                            frame->symbol_name_size && frame->symbol_name_offset ? (char *)bt + frame->symbol_name_offset : "-",
+                            frame->object_name_size && frame->object_name_offset ? (char *)bt + frame->object_name_offset : "?",
+                            (char *)frame->addr - (char *)frame->object_base_addr);
+                    PERL_UNUSED_RESULT(PerlLIO_write(fd, buf, len));
+                }
+                Perl_free_c_backtrace(bt);
+            }
+#endif /* USE_C_BACKTRACE */
         }
     }
 }
@@ -5512,11 +5189,14 @@ getting C<vsnprintf>.
 
 =cut
 */
+
 int
 Perl_my_snprintf(char *buffer, const Size_t len, const char *format, ...)
 {
     int retval = -1;
     va_list ap;
+    dTHX;
+
     PERL_ARGS_ASSERT_MY_SNPRINTF;
 #ifndef HAS_VSNPRINTF
     PERL_UNUSED_VAR(len);
@@ -5525,9 +5205,12 @@ Perl_my_snprintf(char *buffer, const Size_t len, const char *format, ...)
 #ifdef USE_QUADMATH
     {
         bool quadmath_valid = FALSE;
+
         if (quadmath_format_valid(format)) {
             /* If the format looked promising, use it as quadmath. */
-            retval = quadmath_snprintf(buffer, len, format, va_arg(ap, NV));
+            WITH_LC_NUMERIC_SET_TO_NEEDED(
+                retval = quadmath_snprintf(buffer, len, format, va_arg(ap, NV));
+            );
             if (retval == -1) {
                 Perl_croak_nocontext("panic: quadmath_snprintf failed, format \"%s\"", format);
             }
@@ -5559,12 +5242,20 @@ Perl_my_snprintf(char *buffer, const Size_t len, const char *format, ...)
 
     }
 #endif
-    if (retval == -1)
+    if (retval == -1) {
+
 #ifdef HAS_VSNPRINTF
-        retval = vsnprintf(buffer, len, format, ap);
+        WITH_LC_NUMERIC_SET_TO_NEEDED(
+            retval = vsnprintf(buffer, len, format, ap);
+        );
 #else
-        retval = vsprintf(buffer, format, ap);
+        WITH_LC_NUMERIC_SET_TO_NEEDED(
+            retval = vsprintf(buffer, format, ap);
+        );
 #endif
+
+    }
+
     va_end(ap);
     /* vsprintf() shows failure with < 0 */
     if (retval < 0
@@ -5589,6 +5280,7 @@ C<sv_vcatpvf> instead, or getting C<vsnprintf>.
 
 =cut
 */
+
 int
 Perl_my_vsnprintf(char *buffer, const Size_t len, const char *format, va_list ap)
 {
@@ -5602,35 +5294,49 @@ Perl_my_vsnprintf(char *buffer, const Size_t len, const char *format, va_list ap
     return 0;
 #else
     int retval;
-#ifdef NEED_VA_COPY
+    dTHX;
+
+#  ifdef NEED_VA_COPY
     va_list apc;
 
     PERL_ARGS_ASSERT_MY_VSNPRINTF;
     Perl_va_copy(ap, apc);
-# ifdef HAS_VSNPRINTF
-    retval = vsnprintf(buffer, len, format, apc);
-# else
+#    ifdef HAS_VSNPRINTF
+
+    WITH_LC_NUMERIC_SET_TO_NEEDED(
+        retval = vsnprintf(buffer, len, format, apc);
+    );
+#    else
     PERL_UNUSED_ARG(len);
-    retval = vsprintf(buffer, format, apc);
-# endif
+    WITH_LC_NUMERIC_SET_TO_NEEDED(
+        retval = vsprintf(buffer, format, apc);
+    );
+#    endif
+
     va_end(apc);
-#else
-# ifdef HAS_VSNPRINTF
-    retval = vsnprintf(buffer, len, format, ap);
-# else
+#  else
+#    ifdef HAS_VSNPRINTF
+    WITH_LC_NUMERIC_SET_TO_NEEDED(
+        retval = vsnprintf(buffer, len, format, ap);
+    );
+#    else
     PERL_UNUSED_ARG(len);
-    retval = vsprintf(buffer, format, ap);
-# endif
-#endif /* #ifdef NEED_VA_COPY */
+    WITH_LC_NUMERIC_SET_TO_NEEDED(
+        retval = vsprintf(buffer, format, ap);
+    );
+#    endif
+#  endif /* #ifdef NEED_VA_COPY */
+
     /* vsprintf() shows failure with < 0 */
     if (retval < 0
-#ifdef HAS_VSNPRINTF
+#  ifdef HAS_VSNPRINTF
     /* vsnprintf() shows failure with >= len */
         ||
         (len > 0 && (Size_t)retval >= len)
-#endif
+#  endif
     )
         Perl_croak_nocontext("panic: my_vsnprintf buffer overflow");
+
     return retval;
 #endif
 }
@@ -5646,44 +5352,31 @@ Perl_my_clearenv(pTHX)
 #      if defined(USE_ITHREADS)
     /* only the parent thread can clobber the process environment, so no need
      * to use a mutex */
-    if (PL_curinterp == aTHX)
+    if (PL_curinterp != aTHX)
+        return;
 #      endif /* USE_ITHREADS */
-    {
-#      if ! defined(PERL_USE_SAFE_PUTENV)
-    if ( !PL_use_safe_putenv) {
-      I32 i;
-      if (environ == PL_origenviron)
-        environ = (char**)safesysmalloc(sizeof(char*));
-      else
-        for (i = 0; environ[i]; i++)
-          (void)safesysfree(environ[i]);
-    }
-    environ[0] = NULL;
-#      else /* PERL_USE_SAFE_PUTENV */
-#        if defined(HAS_CLEARENV)
-    (void)clearenv();
-#        elif defined(HAS_UNSETENV)
+#      if defined(HAS_CLEARENV)
+    clearenv();
+#      elif defined(HAS_UNSETENV)
     int bsiz = 80; /* Most envvar names will be shorter than this. */
     char *buf = (char*)safesysmalloc(bsiz);
     while (*environ != NULL) {
-      char *e = strchr(*environ, '=');
-      int l = e ? e - *environ : (int)strlen(*environ);
-      if (bsiz < l + 1) {
-        (void)safesysfree(buf);
-        bsiz = l + 1; /* + 1 for the \0. */
-        buf = (char*)safesysmalloc(bsiz);
-      } 
-      memcpy(buf, *environ, l);
-      buf[l] = '\0';
-      (void)unsetenv(buf);
-    }
-    (void)safesysfree(buf);
-#        else /* ! HAS_CLEARENV && ! HAS_UNSETENV */
+        char *e = strchr(*environ, '=');
+        int l = e ? e - *environ : (int)strlen(*environ);
+        if (bsiz < l + 1) {
+            safesysfree(buf);
+            bsiz = l + 1; /* + 1 for the \0. */
+            buf = (char*)safesysmalloc(bsiz);
+        }
+        memcpy(buf, *environ, l);
+        buf[l] = '\0';
+        unsetenv(buf);
+    }
+    safesysfree(buf);
+#      else /* ! HAS_CLEARENV && ! HAS_UNSETENV */
     /* Just null environ and accept the leakage. */
     *environ = NULL;
-#        endif /* HAS_CLEARENV || HAS_UNSETENV */
-#      endif /* ! PERL_USE_SAFE_PUTENV */
-    }
+#      endif /* HAS_CLEARENV || HAS_UNSETENV */
 #    endif /* USE_ENVIRON_ARRAY */
 #  endif /* PERL_IMPLICIT_SYS || WIN32 */
 #endif /* PERL_MICRO */
@@ -5876,9 +5569,9 @@ Perl_xs_handshake(const U32 key, void * v_my_perl, const char * file, ...)
         }
     }
     {
-        U32 xsverlen;
-        assert(HS_GETXSVERLEN(key) <= UCHAR_MAX && HS_GETXSVERLEN(key) <= HS_APIVERLEN_MAX);
-        if((xsverlen = HS_GETXSVERLEN(key)))
+        U32 xsverlen = HS_GETXSVERLEN(key);
+        assert(xsverlen <= UCHAR_MAX && xsverlen <= HS_APIVERLEN_MAX);
+        if(xsverlen)
             S_xs_version_bootcheck(aTHX_
                 items, ax, va_arg(args, char*), xsverlen);
     }
@@ -5935,86 +5628,12 @@ S_xs_version_bootcheck(pTHX_ U32 items, U32 ax, const char *xs_p,
     }
 }
 
-/*
-=for apidoc my_strlcat
-
-The C library C<strlcat> if available, or a Perl implementation of it.
-This operates on C C<NUL>-terminated strings.
-
-C<my_strlcat()> appends string C<src> to the end of C<dst>.  It will append at
-most S<C<size - strlen(dst) - 1>> characters.  It will then C<NUL>-terminate,
-unless C<size> is 0 or the original C<dst> string was longer than C<size> (in
-practice this should not happen as it means that either C<size> is incorrect or
-that C<dst> is not a proper C<NUL>-terminated string).
-
-Note that C<size> is the full size of the destination buffer and
-the result is guaranteed to be C<NUL>-terminated if there is room.  Note that
-room for the C<NUL> should be included in C<size>.
-
-The return value is the total length that C<dst> would have if C<size> is
-sufficiently large.  Thus it is the initial length of C<dst> plus the length of
-C<src>.  If C<size> is smaller than the return, the excess was not appended.
-
-=cut
-
-Description stolen from http://man.openbsd.org/strlcat.3
-*/
-#ifndef HAS_STRLCAT
-Size_t
-Perl_my_strlcat(char *dst, const char *src, Size_t size)
-{
-    Size_t used, length, copy;
-
-    used = strlen(dst);
-    length = strlen(src);
-    if (size > 0 && used < size - 1) {
-        copy = (length >= size - used) ? size - used - 1 : length;
-        memcpy(dst + used, src, copy);
-        dst[used + copy] = '\0';
-    }
-    return used + length;
-}
-#endif
-
-
-/*
-=for apidoc my_strlcpy
-
-The C library C<strlcpy> if available, or a Perl implementation of it.
-This operates on C C<NUL>-terminated strings.
-
-C<my_strlcpy()> copies up to S<C<size - 1>> characters from the string C<src>
-to C<dst>, C<NUL>-terminating the result if C<size> is not 0.
-
-The return value is the total length C<src> would be if the copy completely
-succeeded.  If it is larger than C<size>, the excess was not copied.
-
-=cut
-
-Description stolen from http://man.openbsd.org/strlcpy.3
-*/
-#ifndef HAS_STRLCPY
-Size_t
-Perl_my_strlcpy(char *dst, const char *src, Size_t size)
-{
-    Size_t length, copy;
-
-    length = strlen(src);
-    if (size > 0) {
-        copy = (length >= size) ? size - 1 : length;
-        memcpy(dst, src, copy);
-        dst[copy] = '\0';
-    }
-    return length;
-}
-#endif
-
 PERL_STATIC_INLINE bool
 S_gv_has_usable_name(pTHX_ GV *gv)
 {
     GV **gvp;
     return GvSTASH(gv)
-        && HvENAME(GvSTASH(gv))
+        && HvHasENAME(GvSTASH(gv))
         && (gvp = (GV **)hv_fetchhek(
                         GvSTASH(gv), GvNAME_HEK(gv), 0
            ))
@@ -6311,7 +5930,7 @@ typedef struct {
     bfd* abfd;
     /* bfd_syms is the BFD symbol table. */
     asymbol** bfd_syms;
-    /* bfd_text is handle to the the ".text" section of the object file. */
+    /* bfd_text is handle to the ".text" section of the object file. */
     asection* bfd_text;
     /* Since opening the executable and scanning its symbols is quite
      * heavy operation, we remember the filename we used the last time,
@@ -6560,8 +6179,13 @@ static void atos_symbolize(atos_context* ctx,
             return;
         }
     }
-    cnt = snprintf(cmd, sizeof(cmd), ctx->format,
-                   ctx->fname, ctx->object_base_addr, raw_frame);
+
+    dTHX;
+    WITH_LC_NUMERIC_SET_TO_NEEDED(
+        cnt = snprintf(cmd, sizeof(cmd), ctx->format,
+                       ctx->fname, ctx->object_base_addr, raw_frame);
+    );
+
     if (cnt < sizeof(cmd)) {
         /* Undo nostdio.h #defines that disable stdio.
          * This is somewhat naughty, but is used elsewhere
index d3f903a..d9b6161 100644 (file)
@@ -184,7 +184,7 @@ typedef struct {
 /* uses var file to set default filename for newXS_deffile to use for CvFILE */
 #define HSf_SETXSUBFN 0x00000020
 #define HSf_POPMARK 0x00000040 /* popmark mode or you must supply ax and items */
-#define HSf_IMP_CXT 0x00000080 /* ABI, threaded/MULTIPLICITY, pTHX_ present */
+#define HSf_IMP_CXT 0x00000080 /* ABI, threadedMULTIPLICITY, pTHX_ present */
 #define HSm_INTRPSIZE 0xFFFF0000 /* ABI, interp struct size */
 /* A mask of bits in the key which must always match between a XS mod and interp.
    Also if all ABI bits in a key are true, skip all ABI checks, it is very
@@ -247,7 +247,9 @@ returning NULL if not found.  The terminating NUL bytes are not compared.
 
 #ifdef HAS_MEMMEM
 #   define ninstr(big, bigend, little, lend)                                \
-            ((char *) memmem((big), (bigend) - (big),                       \
+            (__ASSERT_(bigend >= big)                                       \
+             __ASSERT_(lend >= little)                                      \
+             (char *) memmem((big), (bigend) - (big),                       \
                              (little), (lend) - (little)))
 #else
 #   define ninstr(a,b,c,d) Perl_ninstr(a,b,c,d)
index 268ae6d..4856fda 100644 (file)
@@ -9,14 +9,20 @@ utils/encguess
 utils/h2ph
 utils/h2xs
 utils/instmodsh
+utils/json_pp
 utils/libnetcfg
-utils/perlbug
+utils/perlbug  # link = utils/perlthanks
 utils/perldoc
 utils/perlivp
 utils/piconv
 utils/pl2pm
 utils/pod2html
 utils/prove
+utils/ptar
+utils/ptardiff
+utils/ptargrep
+utils/shasum
 utils/splain
 utils/streamzip
 utils/xsubpp
+utils/zipdetails
index 1cc943a..3bf9546 100644 (file)
@@ -35,9 +35,9 @@ print $fh <<'EOT';
 # Files to be built with variable substitution after miniperl is
 # available.  Dependencies handled manually below (for now).
 
-pl = corelist.PL cpan.PL h2ph.PL h2xs.PL instmodsh.PL perlbug.PL perldoc.PL perlivp.PL pl2pm.PL prove.PL splain.PL libnetcfg.PL piconv.PL enc2xs.PL encguess.PL xsubpp.PL pod2html.PL zipdetails.PL streamzip.PL
-plextract = corelist cpan h2ph h2xs instmodsh perlbug perldoc perlivp pl2pm prove splain libnetcfg piconv enc2xs encguess xsubpp pod2html zipdetails streamzip
-plextractexe = ./corelist ./cpan ./h2ph ./h2xs ./instmodsh ./perlbug ./perldoc ./perlivp ./pl2pm ./prove ./splain ./libnetcfg ./piconv ./enc2xs ./encguess xsubpp.PL ./pod2html ./zipdetails ./streamzip
+pl = corelist.PL cpan.PL h2ph.PL h2xs.PL instmodsh.PL json_pp.PL perlbug.PL perldoc.PL perlivp.PL pl2pm.PL prove.PL ptar.PL ptardiff.PL ptargrep.PL shasum.PL splain.PL libnetcfg.PL piconv.PL enc2xs.PL encguess.PL xsubpp.PL pod2html.PL zipdetails.PL streamzip.PL
+plextract = corelist cpan h2ph h2xs instmodsh json_pp perlbug perldoc perlivp pl2pm prove ptar ptardiff ptargrep shasum splain libnetcfg piconv enc2xs encguess xsubpp pod2html zipdetails streamzip
+plextractexe = ./corelist ./cpan ./h2ph ./h2xs ./json_pp ./instmodsh ./perlbug ./perldoc ./perlivp ./pl2pm ./prove ./ptar ./ptardiff ./ptargrep ./shasum ./splain ./libnetcfg ./piconv ./enc2xs ./encguess ./xsubpp ./pod2html ./zipdetails ./streamzip
 
 all: $(plextract) 
 
@@ -54,6 +54,8 @@ h2xs:         h2xs.PL ../config.sh
 
 instmodsh:     instmodsh.PL ../config.sh
 
+json_pp:       json_pp.PL ../config.sh
+
 perlbug:       perlbug.PL ../config.sh ../patchlevel.h
 
 perldoc:       perldoc.PL ../config.sh
@@ -62,8 +64,16 @@ perlivp:     perlivp.PL ../config.sh
 
 prove:         prove.PL ../config.sh
 
+ptar:          ptar.PL ../config.sh
+
+ptardiff:      ptardiff.PL ../config.sh
+
+ptargrep:      ptargrep.PL ../config.sh
+
 pl2pm:         pl2pm.PL ../config.sh
 
+shasum:                shasum.PL ../config.sh
+
 splain:                splain.PL ../config.sh ../lib/diagnostics.pm
 
 libnetcfg:     libnetcfg.PL ../config.sh
@@ -76,6 +86,8 @@ enc2xs:               encguess.PL ../config.sh
 
 xsubpp:                xsubpp.PL ../config.sh
 
+zipdetails:    zipdetails.PL ../config.sh
+
 streamzip:     streamzip.PL ../config.sh
 
 pod2html:      pod2html.PL ../config.sh ../ext/Pod-Html/bin/pod2html
index e4603dd..afa53c2 100644 (file)
@@ -576,7 +576,7 @@ sub next_line
                 $in =~ s/\?\?</{/g;                         # | ??<|  {|
                 $in =~ s/\?\?>/}/g;                         # | ??>|  }|
             }
-           if ($in =~ s/^\#ifdef __LANGUAGE_PASCAL__//) {
+           if ($in =~ /^\#ifdef __LANGUAGE_PASCAL__/) {
                # Tru64 disassembler.h evilness: mixed C and Pascal.
                while (<IN>) {
                    last if /^\#endif/;
@@ -584,8 +584,8 @@ sub next_line
                $in = "";
                next READ;
            }
-           # Skip inlined functions in headers
-           if ($in =~ s/^(extern|static) (__inline__|inline) .*[^;]\s*$//) {
+           if ($in =~ /^extern inline / && # Inlined assembler.
+               $^O eq 'linux' && $file =~ m!(?:^|/)asm/[^/]+\.h$!) {
                while (<IN>) {
                    last if /^}/;
                }
index 2bc9ff5..4448160 100644 (file)
@@ -86,7 +86,7 @@ BEGIN {
     $::HaveWrap = ($@ eq "");
 };
 
-our $VERSION = "1.42";
+our $VERSION = "1.43";
 
 #TODO:
 #       make sure failure (transmission-wise) of Mail::Send is accounted for.
@@ -354,12 +354,13 @@ This program provides an easy way to send a thank-you message back to the
 authors and maintainers of perl.
 
 If you wish to generate a bug report, please run it without the -T flag
+(or run the program perlbug rather than perlthanks)
 EOF
        } else {
            paraprint <<"EOF";
 This program provides an easy way to generate a bug report for the core
 perl distribution (along with tests or patches).  To send a thank-you
-note to $thanksaddress instead of a bug report, please use the -T flag.
+note to $thanksaddress instead of a bug report, please run 'perlthanks'.
 
 The GitHub issue tracker at https://github.com/Perl/perl5/issues is the
 best place to submit your report so it can be tracked and resolved.
@@ -619,6 +620,10 @@ generated with the help of perlbug $VERSION running under perl $perl_version.
 
 EOF
 
+    if ($report_about_module) {
+       print REP "Module: $report_about_module\n\n";
+    }
+
     if ($body) {
        print REP $body;
     } elsif ($usefile) {
@@ -645,12 +650,25 @@ EOF
            print REP <<'EOF';
 
 -----------------------------------------------------------------
-[Please describe your issue here]
+<!--[Please describe your issue here]-->
 
+**Description**
+<!-- A clear and concise description of what the bug is. -->
 
 
-[Please do not change anything below this line]
------------------------------------------------------------------
+
+**Steps to Reproduce**
+<!-- A one-liner or script to reproduce the issue. -->
+
+
+
+**Expected behavior**
+<!-- A clear and concise description of what you expected to happen. -->
+
+
+
+<!--[Please do not change anything below this line]-->
+<!------------------------------------------------------------------- -->
 EOF
        }
     }
@@ -670,26 +688,30 @@ sub Dump {
     $severity ||= 'low';
 
     print OUT <<EFF;
+
+
 ---
-Flags:
-    category=$category
-    severity=$severity
+**Flags**
+- category=$category
+- severity=$severity
 EFF
 
     if ($has_patch) {
         print OUT <<EFF;
-    Type=Patch
-    PatchStatus=HasPatch
+- Type=Patch
+- PatchStatus=HasPatch
 EFF
     }
 
     if ($report_about_module ) { 
         print OUT <<EFF;
-    module=$report_about_module
+- module=$report_about_module
 EFF
     }
     print OUT <<EFF;
 ---
+**Perl configuration**
+```
 EFF
     print OUT "This perlbug was built using Perl $config_tag1\n",
            "It is being executed now by  Perl $config_tag2.\n\n"
@@ -744,6 +766,7 @@ EOF
            print OUT "$_='$value'\n";
        }
     }
+    print OUT "```\n";
 } # sub Dump
 
 sub Edit {
@@ -1266,6 +1289,8 @@ S<[ B<-S> ]> S<[ B<-t> ]>  S<[ B<-d> ]>  S<[ B<-h> ]> S<[ B<-T> ]>
 B<perlbug> S<[ B<-v> ]> S<[ B<-r> I<returnaddress> ]>
  S<[ B<-ok> | B<-okay> | B<-nok> | B<-nokay> ]>
 
+B<perlthanks>
+
 =head1 DESCRIPTION
 
 
@@ -1401,8 +1426,8 @@ by Perl's test suite).
 
 =item Can you use C<perlbug> to submit a thank-you note?
 
-Yes, you can do this by using the C<-T> option.
-Thank-you notes are good. It makes people
+Yes, you can do this by either using the C<-T> option, or by invoking
+the program as C<perlthanks>. Thank-you notes are good. It makes people
 smile. 
 
 =back
index 4c5cf35..3d201ea 100644 (file)
@@ -23,7 +23,6 @@
 
 ~DECC~
 ~DECCXX~
-~GNUC~
 ~ARCH-TYPE~ = 1
 ~THREAD~
 ~SOCKET~
@@ -86,21 +85,6 @@ ARCHCORE = [.lib.$(ARCHNAME).$(PERL_VERSION).CORE]
 ARCHAUTO = [.lib.$(ARCHNAME).$(PERL_VERSION).auto]
 
 #: >>>>>Compiler-specific options <<<<<
-.ifdef GNUC
-.first
-       @ If F$TrnLnm("Sys").eqs."" Then Define/NoLog SYS GNU_CC_Include:[VMS]
-CC = gcc
-# -fno-builtin avoids bug in gcc up to version 2.6.2 which can destroy
-# data when memcpy() is called on large (>64 kB) blocks of memory
-# (fixed in gcc 2.6.3)
-XTRACCFLAGS = /Obj=$(MMS$TARGET_NAME)$(O)/NoCase_Hack/Optimize=2
-DBGSPECFLAGS =
-XTRADEF = 
-XTRAOBJS =
-LIBS1 = GNU_CC:[000000]GCCLIB.OLB/Library
-LIBS2 = Sys$Share:VAXCRTL/Shareable
-POSIX =
-.else
 XTRAOBJS = 
 LIBS1 = $(XTRAOBJS)
 DBGSPECFLAGS = /Show=(expansion,include)/machine
@@ -125,7 +109,6 @@ XTRACCFLAGS = /Include=[]/Standard=Relaxed_ANSI/Prefix=All/Obj=$(OBJVAL)
 .endif
 XTRADEF =
 POSIX = POSIX
-.endif
 
 #: >>>>> Configuration options <<<<<
 #: __DEBUG__: builds images with full VMS debugger support
@@ -226,27 +209,29 @@ FULLLIBS2 = $(LIBS2)|$(THRLIBS1)|$(THRLIBS2)
 
 #### End of system configuration section. ####
 
-c0 = $(MALLOC_C) av.c builtin.c caretx.c deb.c doio.c doop.c dquote.c dump.c globals.c gv.c hv.c mro_core.c
-c1 = mg.c locale.c mathoms.c miniperlmain.c numeric.c op.c pad.c perl.c perlio.c
-c2 = perly.c pp.c pp_ctl.c pp_hot.c pp_pack.c pp_sort.c pp_sys.c regcomp.c regexec.c reentr.c
-c3 = run.c scope.c sv.c taint.c time64.c toke.c universal.c utf8.c util.c vms.c keywords.c
-c = $(c0) $(c1) $(c2) $(c3)
+c0 = $(MALLOC_C) av.c builtin.c caretx.c class.c deb.c doio.c doop.c dquote.c dump.c globals.c gv.c hv.c mro_core.c
+c1 = mg.c locale.c mathoms.c miniperlmain.c numeric.c op.c pad.c peep.c perl.c perlio.c
+c2 = perly.c pp.c pp_ctl.c pp_hot.c pp_pack.c pp_sort.c pp_sys.c regcomp.c regcomp_debug.c
+c3 = regcomp_invlist.c regcomp_study.c regcomp_trie.c regexec.c reentr.c
+c4 = run.c scope.c sv.c taint.c time64.c toke.c universal.c utf8.c util.c vms.c keywords.c
+c = $(c0) $(c1) $(c2) $(c3) $(c4)
 
 obj0 = perl$(O)
-obj1 = $(MALLOC_O) av$(O) builtin$(O) caretx$(O) deb$(O) doio$(O) doop$(O) dquote$(O) dump$(O) mro_core$(O) globals$(O) gv$(O) hv$(O)
-obj2 = keywords$(O) locale$(O) mathoms$(O) mg$(O) miniperlmain$(O) numeric$(O) op$(O) pad$(O) perlio$(O) 
+obj1 = $(MALLOC_O) av$(O) builtin$(O) caretx$(O) class$(O) deb$(O) doio$(O) doop$(O) dquote$(O) dump$(O) mro_core$(O) globals$(O) gv$(O) hv$(O)
+obj2 = keywords$(O) locale$(O) mathoms$(O) mg$(O) miniperlmain$(O) numeric$(O) op$(O) pad$(O) peep$(O) perlio$(O) 
 obj3 = perly$(O) pp$(O) pp_ctl$(O) pp_hot$(O) reentr$(O) pp_pack$(O) pp_sort$(O) pp_sys$(O) regcomp$(O) 
-obj4 = regexec$(O) run$(O) scope$(O) sv$(O) taint$(O) time64$(O) toke$(O) universal$(O) utf8$(O) util$(O) vms$(O)
+obj4 = regcomp_debug$(O) regcomp_invlist$(O) regcomp_study$(O) regcomp_trie$(O)
+obj5 = regexec$(O) run$(O) scope$(O) sv$(O) taint$(O) time64$(O) toke$(O) universal$(O) utf8$(O) util$(O) vms$(O)
 
-mini_obj = perlmini$(O) $(obj1) $(obj2) $(obj3) $(obj4)
-obj = $(obj0) $(obj1) $(obj2) $(obj3) $(obj4)
+mini_obj = perlmini$(O) $(obj1) $(obj2) $(obj3) $(obj4) $(obj5)
+obj = $(obj0) $(obj1) $(obj2) $(obj3) $(obj4) $(obj5)
 
 h0 = av.h config.h cop.h cv.h embed.h embedvar.h
 h1 = EXTERN.h form.h gv.h handy.h hv.h l1_char_class_tab.h INTERN.h intrpvar.h
 h2 = iperlsys.h keywords.h mydtrace.h mg.h mg_vtable.h nostdio.h op.h 
 h3 = op_reg_common.h opcode.h opnames.h overload.h pad.h parser.h patchlevel.h 
 h4 = perl.h perlapi.h perlio.h perlsdio.h perlvars.h perly.h
-h5 = pp.h pp_proto.h proto.h regcomp.h regexp.h regnodes.h scope.h
+h5 = pp.h pp_proto.h proto.h regcomp.h regcomp_internal.h regexp.h regnodes.h scope.h
 h6 = sv.h thread.h utf8.h util.h vmsish.h warnings.h xsub.h
 h = $(h0) $(h1) $(h2) $(h3) $(h4) $(h5) $(h6)
 
@@ -313,7 +298,7 @@ utils : $(utils1) $(utils2) $(utils3) $(utils4) $(utils5)
 extra.pods : miniperl
        @ @extra_pods.com
 
-PERLDELTA_CURRENT = [.pod]perl5363delta.pod
+PERLDELTA_CURRENT = [.pod]perl5382delta.pod
 
 $(PERLDELTA_CURRENT) : [.pod]perldelta.pod
        Copy/NoConfirm/Log $(MMS$SOURCE) $(PERLDELTA_CURRENT)
@@ -663,6 +648,8 @@ pad$(O) : pad.c $(h)
        $(CC) $(CORECFLAGS) $(MMS$SOURCE)
 op$(O) : op.c $(h)
        $(CC) $(CORECFLAGS) $(MMS$SOURCE)
+peep$(O) : peep.c $(h)
+       $(CC) $(CORECFLAGS) $(MMS$SOURCE)
 perl$(O) : perl.c git_version.h $(h)
        $(CC) $(CORECFLAGS) $(MMS$SOURCE)
 perlio$(O) : perlio.c config.h $(h)
@@ -687,6 +674,14 @@ reentr$(O) : reentr.c $(h)
        $(CC) $(CORECFLAGS) $(MMS$SOURCE)
 regcomp$(O) : regcomp.c $(h)
        $(CC) $(CORECFLAGS) $(MMS$SOURCE)
+regcomp_debug$(O) : regcomp_debug.c $(h)
+       $(CC) $(CORECFLAGS) $(MMS$SOURCE)
+regcomp_invlist$(O) : regcomp_invlist.c $(h)
+       $(CC) $(CORECFLAGS) $(MMS$SOURCE)
+regcomp_study$(O) : regcomp_study.c $(h)
+       $(CC) $(CORECFLAGS) $(MMS$SOURCE)
+regcomp_trie$(O) : regcomp_trie.c $(h)
+       $(CC) $(CORECFLAGS) $(MMS$SOURCE)
 regexec$(O) : regexec.c $(h)
        $(CC) $(CORECFLAGS) $(MMS$SOURCE)
 run$(O) : run.c $(h)
index 7b9f606..660da1d 100644 (file)
@@ -56,8 +56,8 @@ my $docc = ($cc_cmd !~ /^~~/);
 print "\$docc = $docc\n" if $debug;
 
 my ( $use_threads, $use_mymalloc, $care_about_case, $shorten_symbols,
-     $debugging_enabled, $hide_mymalloc, $isgcc, $use_perlio, $dir )
-   = ( 0, 0, 0, 0, 0, 0, 0, 0 );
+     $debugging_enabled, $hide_mymalloc, $use_perlio, $dir )
+   = ( 0, 0, 0, 0, 0, 0, 0 );
 
 if (-f 'perl.h') { $dir = '[]'; }
 elsif (-f '[-]perl.h') { $dir = '[-]'; }
@@ -73,7 +73,6 @@ while(<CONFIG>) {
     $shorten_symbols++ if /d_vms_shorten_long_symbols='(define|yes|true|t|y|1)'/i;
     $debugging_enabled++ if /usedebugging_perl='(define|yes|true|t|y|1)'/i;
     $hide_mymalloc++ if /embedmymalloc='(define|yes|true|t|y|1)'/i;
-    $isgcc++ if /gccversion='[^']/;
     $use_perlio++ if /useperlio='(define|yes|true|t|y|1)'/i;
 }
 close CONFIG;
@@ -89,10 +88,6 @@ if (my ($prefix,$defines,$suffix) =
 }
 print "Filtered \$cc_cmd: \\$cc_cmd\\\n" if $debug;
 
-# check for gcc - if present, we'll need to use MACRO hack to
-# define global symbols for shared variables
-
-print "\$isgcc: $isgcc\n" if $debug;
 print "\$debugging_enabled: $debugging_enabled\n" if $debug;
 
 my $objsuffix = shift @ARGV;
@@ -127,7 +122,6 @@ while (my $line = <$makedefs>) {
   }
 }
 
-if ($debugging_enabled and $isgcc) { $vars{'colors'}++ }
 foreach (split /\s+/, $extnames) {
   my($pkgname) = $_;
   $pkgname =~ s/::/__/g;
@@ -142,9 +136,8 @@ my $marord = 1;
 open(OPTBLD,'>', "${dir}${dbgprefix}perlshr_bld.opt")
   or die "$0: Can't write to ${dir}${dbgprefix}perlshr_bld.opt: $!\n";
 
-unless ($isgcc) {
-  print OPTBLD "PSECT_ATTR=LIB\$INITIALIZE,GBL,NOEXE,NOWRT,NOSHR,LONG\n";
-}
+
+print OPTBLD "PSECT_ATTR=LIB\$INITIALIZE,GBL,NOEXE,NOWRT,NOSHR,LONG\n";
 print OPTBLD "case_sensitive=yes\n" if $care_about_case;
 my $count = 0;
 foreach my $var (sort (keys %vars)) {
@@ -157,19 +150,8 @@ foreach my $func (sort keys %fcns) {
 
 open(OPTATTR, '>', "${dir}perlshr_attr.opt")
   or die "$0: Can't write to ${dir}perlshr_attr.opt: $!\n";
-if ($isgcc) {
-# TODO -- lost ability to distinguish constant vars from others when
-# we switched to using makedef.pl for input.
-#  foreach my $var (sort keys %cvars) {
-#    print OPTATTR "PSECT_ATTR=${var},PIC,OVR,RD,NOEXE,NOWRT,SHR\n";
-#  }
-  foreach my $var (sort keys %vars) {
-    print OPTATTR "PSECT_ATTR=${var},PIC,OVR,RD,NOEXE,WRT,NOSHR\n";
-  }
-}
-else {
-  print OPTATTR "! No additional linker directives are needed when using DECC\n";
-}
+
+print OPTATTR "! No additional linker directives are needed when using DECC\n";
 close OPTATTR;
 
 my $incstr = 'perl,globals';
index 6c9fbc8..a961d48 100644 (file)
@@ -5659,7 +5659,7 @@ int_expanded:
   if (!DECC_EFS_CASE_PRESERVE) {
     char * tbuf;
     for (tbuf = rms_get_fna(myfab, mynam); *tbuf; tbuf++)
-      if (islower(*tbuf)) { haslower = 1; break; }
+      if (isU8_LOWER_LC(*tbuf)) { haslower = 1; break; }
   }
 
    /* Is a long or a short name expected */
@@ -6281,7 +6281,7 @@ int_fileify_dirspec(const char *dir, char *buf, int *utf8_fl)
 #endif
 
       for (cp = trndir; *cp; cp++)
-        if (islower(*cp)) { haslower = 1; break; }
+        if (isU8_LOWER_LC(*cp)) { haslower = 1; break; }
       if (!((sts = sys$parse(&dirfab)) & STS$K_SUCCESS)) {
         if ((dirfab.fab$l_sts == RMS$_DIR) ||
             (dirfab.fab$l_sts == RMS$_DNF) ||
@@ -9490,7 +9490,7 @@ mp_expand_wild_cards(pTHX_ char *item, struct list_item **head,
          */
         if (!DECC_EFS_CASE_PRESERVE) {
             for (c = string; *c; ++c)
-            if (isupper(*c))
+            if (isUPPER_L1(*c))
                 *c = toLOWER_L1(*c);
         }
         if (isunix) trim_unixpath(string,item,1);
@@ -13638,7 +13638,7 @@ mp_do_vms_realpath(pTHX_ const char *filespec, char *outbuf,
                      */
                     if (!DECC_EFS_CASE_PRESERVE) {
                         for (cp = filespec; *cp; cp++)
-                            if (islower(*cp)) { haslower = 1; break; }
+                            if (isU8_LOWER_LC(*cp)) { haslower = 1; break; }
 
                         if (haslower) __mystrtolower(rslt);
                     }
@@ -13789,7 +13789,7 @@ mp_do_vms_realname(pTHX_ const char *filespec, char *outbuf,
              */
             if (!DECC_EFS_CASE_PRESERVE) {
                 for (cp = filespec; *cp; cp++)
-                    if (islower(*cp)) { haslower = 1; break; }
+                    if (isU8_LOWER_LC(*cp)) { haslower = 1; break; }
 
                 if (haslower) __mystrtolower(outbuf);
             }
index ba228e5..378c107 100644 (file)
@@ -46,9 +46,7 @@
 #include <unixio.h>
 #include <unixlib.h>
 #include <file.h>  /* it's not <sys/file.h>, so don't use I_SYS_FILE */
-#if (defined(__DECC) && defined(__DECC_VER) && __DECC_VER > 20000000) || defined(__DECCXX)
-#  include <unistd.h> /* DECC has this; gcc doesn't */
-#endif
+#include <unistd.h>
 
 #ifdef NO_PERL_TYPEDEFS /* a2p; we don't want Perl's special routines */
 #  define DONT_MASK_RTL_CALLS
  */
 #define ALTERNATE_SHEBANG "$"
 
-/* Macros to set errno using the VAX thread-safe calls, if present */
-#if (defined(__DECC) || defined(__DECCXX)) && !defined(__ALPHA)
-#  define set_errno(v)      (cma$tis_errno_set_value(v))
-   void cma$tis_errno_set_value(int __value);  /* missing in some errno.h */
-#  define set_vaxc_errno(v) (vaxc$errno = (v))
-#else
-#  define set_errno(v)      (errno = (v))
-#  define set_vaxc_errno(v) (vaxc$errno = (v))
-#endif
+/* Macros to set errno.  */
+#define set_errno(v)      (errno = (v))
+#define set_vaxc_errno(v) (vaxc$errno = (v))
 
 /* Support for 'vmsish' behaviors enabled with C<use vmsish> pragma */
 
@@ -309,9 +301,8 @@ struct interp_intern {
 
 #define BIT_BUCKET "/dev/null"
 #define PERL_SYS_INIT_BODY(c,v)        MALLOC_CHECK_TAINT2(*c,*v) vms_image_init((c),(v)); PERLIO_INIT; MALLOC_INIT
-#define PERL_SYS_TERM_BODY()    HINTS_REFCNT_TERM; OP_REFCNT_TERM;      \
-                                PERLIO_TERM; MALLOC_TERM; LOCALE_TERM;  \
-                                ENV_TERM;
+/* Use standard PERL_SYS_TERM_BODY */
+
 #define dXSUB_SYS dNOOP
 #define HAS_KILL
 #define HAS_WAIT
@@ -340,7 +331,7 @@ struct interp_intern {
  *     This symbol, if defined, indicates that the ioctl() routine is
  *     available to set I/O characteristics
  */
-#define        HAS_IOCTL               /**/
+#define HAS_IOCTL               /**/
  
 /* HAS_UTIME:
  *     This symbol, if defined, indicates that the routine utime() is
index cb5e1b4..ab05c33 100644 (file)
@@ -609,11 +609,7 @@ VER_NV:
 
        /* may get too much accuracy */ 
        char tbuf[64];
-#ifdef __vax__
-       SV *sv = SvNVX(ver) > 10e37 ? newSV(64) : 0;
-#else
        SV *sv = SvNVX(ver) > 10e50 ? newSV(64) : 0;
-#endif
        char *buf;
 
 #if PERL_VERSION_GE(5,19,0)
index 0db6614..ce1765e 100644 (file)
@@ -1,4 +1,4 @@
-/* -*- buffer-read-only: t -*-
+/* -*- mode: C; buffer-read-only: t -*-
    !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!!
    This file is built by regen/warnings.pl.
    Any changes made here will be lost!
@@ -9,7 +9,6 @@
 #define Perl_Warn_Bit_(x)           (1 << ((x) % 8))
 #define PerlWarnIsSet_(a, x)        ((a)[Perl_Warn_Off_(x)] & Perl_Warn_Bit_(x))
 
-
 #define G_WARN_OFF             0       /* $^W == 0 */
 #define G_WARN_ON              1       /* -w flag and $^W != 0 */
 #define G_WARN_ALL_ON          2       /* -W flag */
@@ -18,8 +17,8 @@
 #define G_WARN_ALL_MASK                (G_WARN_ALL_ON|G_WARN_ALL_OFF)
 
 #define pWARN_STD              NULL
-#define pWARN_ALL              (STRLEN *) &PL_WARN_ALL    /* use warnings 'all' */
-#define pWARN_NONE             (STRLEN *) &PL_WARN_NONE   /* no  warnings 'all' */
+#define pWARN_ALL               &PL_WARN_ALL    /* use warnings 'all' */
+#define pWARN_NONE              &PL_WARN_NONE   /* no  warnings 'all' */
 
 #define specialWARN(x)         ((x) == pWARN_STD || (x) == pWARN_ALL ||        \
                                  (x) == pWARN_NONE)
 #define WARN_IMPRECISION                46
 #define WARN_ILLEGALPROTO               47
 
+/* Warnings Categories added in Perl 5.011003 */
+
+#define WARN_DEPRECATED__GOTO_CONSTRUCT         48
+#define WARN_DEPRECATED__UNICODE_PROPERTY_NAME 49
+
 /* Warnings Categories added in Perl 5.013 */
 
-#define WARN_NON_UNICODE                48
-#define WARN_NONCHAR                    49
-#define WARN_SURROGATE                  50
+#define WARN_NON_UNICODE                50
+#define WARN_NONCHAR                    51
+#define WARN_SURROGATE                  52
 
 /* Warnings Categories added in Perl 5.017 */
 
-#define WARN_EXPERIMENTAL               51
-#define WARN_EXPERIMENTAL__LEXICAL_SUBS         52
-#define WARN_EXPERIMENTAL__REGEX_SETS   53
-#define WARN_EXPERIMENTAL__SMARTMATCH   54
+#define WARN_EXPERIMENTAL               53
+#define WARN_EXPERIMENTAL__REGEX_SETS   54
 
 /* Warnings Categories added in Perl 5.019 */
 
-#define WARN_EXPERIMENTAL__POSTDEREF    55
-#define WARN_EXPERIMENTAL__SIGNATURES   56
-#define WARN_SYSCALLS                   57
+#define WARN_SYSCALLS                   55
 
 /* Warnings Categories added in Perl 5.021 */
 
-#define WARN_EXPERIMENTAL__BITWISE      58
-#define WARN_EXPERIMENTAL__CONST_ATTR   59
-#define WARN_EXPERIMENTAL__RE_STRICT    60
-#define WARN_EXPERIMENTAL__REFALIASING  61
-#define WARN_LOCALE                     62
-#define WARN_MISSING                    63
-#define WARN_REDUNDANT                  64
+#define WARN_EXPERIMENTAL__CONST_ATTR   56
+#define WARN_EXPERIMENTAL__RE_STRICT    57
+#define WARN_EXPERIMENTAL__REFALIASING  58
+#define WARN_LOCALE                     59
+#define WARN_MISSING                    60
+#define WARN_REDUNDANT                  61
 
 /* Warnings Categories added in Perl 5.025 */
 
-#define WARN_EXPERIMENTAL__DECLARED_REFS 65
+#define WARN_EXPERIMENTAL__DECLARED_REFS 62
 
-/* Warnings Categories added in Perl 5.027 */
+/* Warnings Categories added in Perl 5.025011 */
 
-#define WARN_EXPERIMENTAL__ALPHA_ASSERTIONS 66
-#define WARN_EXPERIMENTAL__SCRIPT_RUN   67
-#define WARN_SHADOW                     68
+#define WARN_DEPRECATED__DOT_IN_INC     63
 
-/* Warnings Categories added in Perl 5.029 */
+/* Warnings Categories added in Perl 5.027 */
 
-#define WARN_EXPERIMENTAL__PRIVATE_USE  69
-#define WARN_EXPERIMENTAL__UNIPROP_WILDCARDS 70
-#define WARN_EXPERIMENTAL__VLB          71
+#define WARN_SHADOW                     64
 
-/* Warnings Categories added in Perl 5.031 */
+/* Warnings Categories added in Perl 5.029 */
 
-#define WARN_EXPERIMENTAL__ISA          72
+#define WARN_EXPERIMENTAL__PRIVATE_USE  65
+#define WARN_EXPERIMENTAL__UNIPROP_WILDCARDS 66
+#define WARN_EXPERIMENTAL__VLB          67
 
 /* Warnings Categories added in Perl 5.033 */
 
-#define WARN_EXPERIMENTAL__TRY          73
+#define WARN_EXPERIMENTAL__TRY          68
 
 /* Warnings Categories added in Perl 5.035 */
 
-#define WARN_EXPERIMENTAL__ARGS_ARRAY_WITH_SIGNATURES 74
-#define WARN_EXPERIMENTAL__BUILTIN      75
-#define WARN_EXPERIMENTAL__DEFER        76
-#define WARN_EXPERIMENTAL__EXTRA_PAIRED_DELIMITERS 77
-#define WARN_EXPERIMENTAL__FOR_LIST     78
-#define WARN_SCALAR                     79
+#define WARN_EXPERIMENTAL__ARGS_ARRAY_WITH_SIGNATURES 69
+#define WARN_EXPERIMENTAL__BUILTIN      70
+#define WARN_EXPERIMENTAL__DEFER        71
+#define WARN_EXPERIMENTAL__EXTRA_PAIRED_DELIMITERS 72
+#define WARN_EXPERIMENTAL__FOR_LIST     73
+#define WARN_SCALAR                     74
+
+/* Warnings Categories added in Perl 5.035009 */
+
+#define WARN_DEPRECATED__VERSION_DOWNGRADE 75
+
+/* Warnings Categories added in Perl 5.03501 */
+
+#define WARN_DEPRECATED__DELIMITER_WILL_BE_PAIRED 76
+
+/* Warnings Categories added in Perl 5.037 */
+
+#define WARN_EXPERIMENTAL__CLASS        77
+
+/* Warnings Categories added in Perl 5.037009 */
+
+#define WARN_DEPRECATED__APOSTROPHE_AS_PACKAGE_SEPARATOR 78
+
+/* Warnings Categories added in Perl 5.03701 */
+
+#define WARN_DEPRECATED__SMARTMATCH     79
 #define WARNsize                        20
 #define WARN_ALLstring                  "\125\125\125\125\125\125\125\125\125\125\125\125\125\125\125\125\125\125\125\125"
 #define WARN_NONEstring                         "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
 #define isLEXWARN_off \
         cBOOL(!PL_curcop || PL_curcop->cop_warnings == pWARN_STD)
 #define isWARN_ONCE    (PL_dowarn & (G_WARN_ON|G_WARN_ONCE))
-#define isWARN_on(c,x) (PerlWarnIsSet_((U8 *)(c + 1), 2*(x)))
-#define isWARNf_on(c,x)        (PerlWarnIsSet_((U8 *)(c + 1), 2*(x)+1))
+#define hasWARNBIT(c,x) (RCPV_LEN(c) > (2*(x)/8))
+#define isWARN_on(c,x)  (hasWARNBIT(c,x) \
+                        ? PerlWarnIsSet_((U8 *)(c), 2*(x)) \
+                        : 0)
+#define isWARNf_on(c,x) (hasWARNBIT(c,x) \
+                        ? PerlWarnIsSet_((U8 *)(c), 2*(x)+1) \
+                        : 0)
 
 #define DUP_WARNINGS(p) Perl_dup_warnings(aTHX_ p)
 
 #define free_and_set_cop_warnings(cmp,w) STMT_START { \
-  if (!specialWARN((cmp)->cop_warnings)) PerlMemShared_free((cmp)->cop_warnings); \
+  if (!specialWARN((cmp)->cop_warnings)) rcpv_free((cmp)->cop_warnings); \
   (cmp)->cop_warnings = w; \
 } STMT_END
 
@@ -299,17 +321,14 @@ category parameters passed.
 =for apidoc Amnh||WARN_VOID
 =for apidoc Amnh||WARN_IMPRECISION
 =for apidoc Amnh||WARN_ILLEGALPROTO
+=for apidoc Amnh||WARN_DEPRECATED__GOTO_CONSTRUCT
+=for apidoc Amnh||WARN_DEPRECATED__UNICODE_PROPERTY_NAME
 =for apidoc Amnh||WARN_NON_UNICODE
 =for apidoc Amnh||WARN_NONCHAR
 =for apidoc Amnh||WARN_SURROGATE
 =for apidoc Amnh||WARN_EXPERIMENTAL
-=for apidoc Amnh||WARN_EXPERIMENTAL__LEXICAL_SUBS
 =for apidoc Amnh||WARN_EXPERIMENTAL__REGEX_SETS
-=for apidoc Amnh||WARN_EXPERIMENTAL__SMARTMATCH
-=for apidoc Amnh||WARN_EXPERIMENTAL__POSTDEREF
-=for apidoc Amnh||WARN_EXPERIMENTAL__SIGNATURES
 =for apidoc Amnh||WARN_SYSCALLS
-=for apidoc Amnh||WARN_EXPERIMENTAL__BITWISE
 =for apidoc Amnh||WARN_EXPERIMENTAL__CONST_ATTR
 =for apidoc Amnh||WARN_EXPERIMENTAL__RE_STRICT
 =for apidoc Amnh||WARN_EXPERIMENTAL__REFALIASING
@@ -317,13 +336,11 @@ category parameters passed.
 =for apidoc Amnh||WARN_MISSING
 =for apidoc Amnh||WARN_REDUNDANT
 =for apidoc Amnh||WARN_EXPERIMENTAL__DECLARED_REFS
-=for apidoc Amnh||WARN_EXPERIMENTAL__ALPHA_ASSERTIONS
-=for apidoc Amnh||WARN_EXPERIMENTAL__SCRIPT_RUN
+=for apidoc Amnh||WARN_DEPRECATED__DOT_IN_INC
 =for apidoc Amnh||WARN_SHADOW
 =for apidoc Amnh||WARN_EXPERIMENTAL__PRIVATE_USE
 =for apidoc Amnh||WARN_EXPERIMENTAL__UNIPROP_WILDCARDS
 =for apidoc Amnh||WARN_EXPERIMENTAL__VLB
-=for apidoc Amnh||WARN_EXPERIMENTAL__ISA
 =for apidoc Amnh||WARN_EXPERIMENTAL__TRY
 =for apidoc Amnh||WARN_EXPERIMENTAL__ARGS_ARRAY_WITH_SIGNATURES
 =for apidoc Amnh||WARN_EXPERIMENTAL__BUILTIN
@@ -331,10 +348,15 @@ category parameters passed.
 =for apidoc Amnh||WARN_EXPERIMENTAL__EXTRA_PAIRED_DELIMITERS
 =for apidoc Amnh||WARN_EXPERIMENTAL__FOR_LIST
 =for apidoc Amnh||WARN_SCALAR
+=for apidoc Amnh||WARN_DEPRECATED__VERSION_DOWNGRADE
+=for apidoc Amnh||WARN_DEPRECATED__DELIMITER_WILL_BE_PAIRED
+=for apidoc Amnh||WARN_EXPERIMENTAL__CLASS
+=for apidoc Amnh||WARN_DEPRECATED__APOSTROPHE_AS_PACKAGE_SEPARATOR
+=for apidoc Amnh||WARN_DEPRECATED__SMARTMATCH
 
 =cut
 */
 
 /* end of file warnings.h */
 
-/* ex: set ro: */
+/* ex: set ro ft=c: */
index 5b05b28..b2651ab 100644 (file)
@@ -6,7 +6,7 @@
 #      MinGW64 with gcc-4.4.3 or later
 #
 # This is set up to build a perl.exe that runs off a shared library
-# (perl536.dll).  Also makes individual DLLs for the XS extensions.
+# (perl538.dll).  Also makes individual DLLs for the XS extensions.
 #
 # The easiest way to customize the build process is to use parameters like this:
 #
@@ -63,7 +63,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.36.3
+#INST_VER      := \5.38.2
 
 #
 # Comment this out if you DON'T want your perl installation to have
@@ -180,6 +180,7 @@ DEFAULT_INC_EXCLUDES_DOT := define
 
 #
 # Uncomment this if you want to build everything in C++ mode
+# This requires gcc or at least MSVC 2019.
 #
 #USE_CPLUSPLUS := define
 
@@ -219,7 +220,7 @@ DEFAULT_INC_EXCLUDES_DOT := define
 # set this to additionally provide a statically linked perl-static.exe.
 # Note that dynamic loading will not work with this perl, so you must
 # include required modules statically using the STATIC_EXT or ALL_STATIC
-# variables below. A static library perl536s.lib will also be created.
+# variables below. A static library perl538s.lib will also be created.
 # Ordinary perl.exe is not affected by this option.
 #
 #BUILD_STATIC  := define
@@ -539,6 +540,9 @@ CPANDIR             = ..\cpan
 PODDIR         = ..\pod
 HTMLDIR                = .\html
 
+# Strip trailing backslash from INST_TOP
+override INST_TOP := $(INST_TOP:\=)
+
 INST_SCRIPT    = $(INST_TOP)$(INST_VER)\bin
 INST_BIN       = $(INST_SCRIPT)$(INST_ARCH)
 INST_LIB       = $(INST_TOP)$(INST_VER)\lib
@@ -605,11 +609,16 @@ LIBFILES  += -lquadmath
 endif
 
 ifeq ($(CFG),Debug)
-OPTIMIZE       = -g -O2
+# According to https://gcc.gnu.org/onlinedocs/gcc-8.3.0/gcc/Optimize-Options.html
+# -Og should provide some optimizations while still giving convenient debugging
+OPTIMIZE       = -g -Og
 LINK_DBG       = -g
 DEFINES                += -DDEBUGGING
 else
-OPTIMIZE       = -O2
+# In https://github.com/Perl/perl5/issues/20081 it is found that the previous
+# optimization level -O2 causes generated code that fails in mysterious ways
+# when run on Win11 (*even* if it was built and successfully tested on Win10!).
+OPTIMIZE       = -Os
 LINK_DBG       = -s
 endif
 
@@ -664,6 +673,9 @@ INCLUDES    = -I.\include -I. -I..
 DEFINES                = -DWIN32 -D_CONSOLE -DNO_STRICT
 LOCDEFS                = -DPERLDLL -DPERL_CORE
 CXX_FLAG       = -TP -EHsc
+ifeq ($(USE_CPLUSPLUS),define)
+CXX_FLAG       += -std:c++20
+endif
 EXTRACFLAGS    = -nologo -GF -W3
 
 ifeq ($(CCTYPE),MSVC120)
@@ -736,7 +748,7 @@ endif
 endif
 
 # Avoid __intel_new_proc_init link error for libircmt.
-# libmmd is /MD equivelent, other variants exist.
+# libmmd is /MD equivalent, other variants exist.
 # libmmd is Intel C's math addon funcs to MS CRT, contains long doubles, C99,
 # and optimized C89 funcs
 ifeq ($(__ICC),define)
@@ -899,9 +911,9 @@ ifeq ($(CCTYPE),GCC)
 
 CFGSH_TMPL     = config.gc
 CFGH_TMPL      = config_H.gc
-PERLIMPLIB     = $(COREDIR)\libperl536$(a)
-PERLIMPLIBBASE = libperl536$(a)
-PERLSTATICLIB  = ..\libperl536s$(a)
+PERLIMPLIB     = $(COREDIR)\libperl538$(a)
+PERLIMPLIBBASE = libperl538$(a)
+PERLSTATICLIB  = ..\libperl538s$(a)
 INT64          = long long
 
 else
@@ -914,12 +926,12 @@ endif
 
 # makedef.pl must be updated if this changes, and this should normally
 # only change when there is an incompatible revision of the public API.
-PERLIMPLIB     ?= $(COREDIR)\perl536$(a)
-PERLIMPLIBBASE ?= perl536$(a)
-PERLEXPLIB     ?= $(COREDIR)\perl536.exp
-PERLSTATICLIB  ?= ..\perl536s$(a)
-PERLDLL                = ..\perl536.dll
-PERLDLLBASE    = perl536.dll
+PERLIMPLIB     ?= $(COREDIR)\perl538$(a)
+PERLIMPLIBBASE ?= perl538$(a)
+PERLEXPLIB     ?= $(COREDIR)\perl538.exp
+PERLSTATICLIB  ?= ..\perl538s$(a)
+PERLDLL                = ..\perl538.dll
+PERLDLLBASE    = perl538.dll
 
 # don't let "gmake -n all" try to run "miniperl.exe make_ext.pl"
 PLMAKE         = gmake
@@ -933,6 +945,10 @@ NOOP               = @rem
 MICROCORE_SRC  =               \
                ..\toke.c       \
                ..\regcomp.c    \
+               ..\regcomp_trie.c       \
+               ..\regcomp_debug.c      \
+               ..\regcomp_invlist.c    \
+               ..\regcomp_study.c      \
                ..\regexec.c    \
                ..\op.c         \
                ..\sv.c         \
@@ -949,6 +965,7 @@ MICROCORE_SRC       =               \
                ..\av.c         \
                ..\builtin.c    \
                ..\caretx.c     \
+               ..\class.c      \
                ..\deb.c        \
                ..\doio.c       \
                ..\doop.c       \
@@ -961,6 +978,7 @@ MICROCORE_SRC       =               \
                ..\mg.c         \
                ..\numeric.c    \
                ..\pad.c        \
+               ..\peep.c       \
                ..\perly.c      \
                ..\pp_sort.c    \
                ..\reentr.c     \
@@ -1008,6 +1026,7 @@ CORE_NOCFG_H      =               \
                ..\pp.h         \
                ..\proto.h      \
                ..\regcomp.h    \
+               ..\regcomp_internal.h   \
                ..\regexp.h     \
                ..\scope.h      \
                ..\sv.h         \
@@ -1110,7 +1129,8 @@ CFG_VARS  =                                       \
                "LINK_FLAGS=$(subst ",\",$(LINK_FLAGS))"\
                "optimize=$(subst ",\",$(OPTIMIZE))"    \
                "ARCHPREFIX=$(ARCHPREFIX)"              \
-               "WIN64=$(WIN64)"
+               "WIN64=$(WIN64)"                        \
+               "SKIP_CCHOME_CHECK=$(SKIP_CCHOME_CHECK)"
 
 #
 # Top targets
@@ -1144,7 +1164,15 @@ ifeq ($(CCTYPE),)
 endif
 
 
-..\regcomp$(o) : ..\regnodes.h ..\regcharclass.h
+..\regcomp$(o) : ..\regcomp.h ..\regcomp_internal.h ..\regnodes.h ..\regcharclass.h
+
+..\regcomp_debug$(o) : ..\regcomp.h ..\regcomp_internal.h ..\regnodes.h ..\regcharclass.h
+
+..\regcomp_invlist$(o) : ..\regcomp.h ..\regcomp_internal.h ..\regnodes.h ..\regcharclass.h
+
+..\regcomp_study$(o) : ..\regcomp.h ..\regcomp_internal.h ..\regnodes.h ..\regcharclass.h
+
+..\regcomp_trie$(o) : ..\regcomp.h ..\regcomp_internal.h ..\regnodes.h ..\regcharclass.h
 
 ..\regexec$(o) : ..\regnodes.h ..\regcharclass.h
 
@@ -1171,7 +1199,9 @@ endif
 ..\perl$(o) : ..\git_version.h
 
 ..\config.sh : $(CFGSH_TMPL) config_sh.PL FindExt.pm $(HAVEMINIPERL)
-       $(MINIPERL) -I..\lib config_sh.PL $(CFG_VARS) $(CFGSH_TMPL) > ..\config.sh
+       $(MINIPERL) -I..\lib config_sh.PL $(CFG_VARS) $(CFGSH_TMPL) > ..\config.sh.tmp
+       if exist ..\config.sh del /f ..\config.sh
+       rename ..\config.sh.tmp config.sh
 
 # This target is for when changes to the main config.sh happen.
 # Edit config.gc, then make perl using GCC in a minimal configuration (i.e.
@@ -1184,7 +1214,7 @@ regen_config_h:
        -$(MINIPERL) -I..\lib config_h.PL "ARCHPREFIX=$(ARCHPREFIX)"
        rename config.h $(CFGH_TMPL)
 
-$(CONFIGPM): ..\config.sh config_h.PL
+$(CONFIGPM): ..\config.sh config_h.PL ..\git_version.h
        $(MINIPERL) -I..\lib ..\configpm --chdir=..
        -$(MINIPERL) -I..\lib config_h.PL "ARCHPREFIX=$(ARCHPREFIX)"
 
@@ -1624,7 +1654,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\perl5363delta.pod
+       copy ..\pod\perldelta.pod ..\pod\perl5382delta.pod
        $(MINIPERL) -I..\lib $(PL2BAT) $(UTILS)
        $(MINIPERL) -I..\lib ..\autodoc.pl ..
        $(MINIPERL) -I..\lib ..\pod\perlmodlib.PL -q ..
@@ -1696,7 +1726,6 @@ distclean: realclean
        -if exist $(LIBDIR)\MIME rmdir /s /q $(LIBDIR)\MIME
        -if exist $(LIBDIR)\Module rmdir /s /q $(LIBDIR)\Module
        -if exist $(LIBDIR)\Net\FTP rmdir /s /q $(LIBDIR)\Net\FTP
-       -if exist $(LIBDIR)\OpenBSD rmdir /s /q $(LIBDIR)\OpenBSD
        -if exist $(LIBDIR)\Params rmdir /s /q $(LIBDIR)\Params
        -if exist $(LIBDIR)\Parse rmdir /s /q $(LIBDIR)\Parse
        -if exist $(LIBDIR)\Perl rmdir /s /q $(LIBDIR)\Perl
@@ -1724,14 +1753,15 @@ 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 \
-           perl5363delta.pod perlaix.pod perlamiga.pod perlandroid.pod \
+           perl5382delta.pod perlaix.pod perlamiga.pod perlandroid.pod \
            perlapi.pod perlbs2000.pod perlcn.pod perlcygwin.pod \
            perlfreebsd.pod perlhaiku.pod perlhpux.pod perlhurd.pod \
            perlintern.pod perlirix.pod perljp.pod perlko.pod perllinux.pod \
            perlmacosx.pod perlmodlib.pod perlopenbsd.pod perlos2.pod \
            perlos390.pod perlos400.pod perlplan9.pod perlqnx.pod \
            perlriscos.pod perlsolaris.pod perlsynology.pod perltoc.pod \
-           perltru64.pod perltw.pod perlvos.pod perlwin32.pod
+           perltru64.pod perltw.pod perluniprops.pod perlvos.pod \
+           perlwin32.pod
        -cd ..\utils && del /f h2ph splain perlbug pl2pm h2xs \
            perldoc perlivp libnetcfg enc2xs encguess piconv cpan *.bat \
            xsubpp pod2html instmodsh json_pp prove ptar ptardiff ptargrep shasum corelist zipdetails
@@ -1808,11 +1838,11 @@ endif
 
 test : test-prep
        set PERL_STATIC_EXT=$(STATIC_EXT) && \
-           cd ..\t && perl.exe harness $(TEST_SWITCHES) $(TEST_FILES)
+           cd ..\t && perl.exe harness $(TEST_ARGS) $(TEST_SWITCHES) $(TEST_FILES)
 
 test_porting : test-prep
        set PERL_STATIC_EXT=$(STATIC_EXT) && \
-           cd ..\t && perl.exe harness $(TEST_SWITCHES) porting\*.t ..\lib\diagnostics.t
+           cd ..\t && perl.exe harness $(TEST_ARGS) $(TEST_SWITCHES) porting\*.t ..\lib\diagnostics.t
 
 test-reonly : reonly utils
        $(XCOPY) $(PERLEXE) ..\t\$(NULL)
@@ -1826,14 +1856,14 @@ regen :
 test-notty : test-prep
        set PERL_STATIC_EXT=$(STATIC_EXT) && \
            set PERL_SKIP_TTY_TEST=1 && \
-           cd ..\t && perl.exe harness $(TEST_SWITCHES) $(TEST_FILES)
+           cd ..\t && perl.exe harness $(TEST_ARGS) $(TEST_SWITCHES) $(TEST_FILES)
 
 _test :
        $(XCOPY) $(PERLEXE) ..\t\$(NULL)
        $(XCOPY) $(PERLDLL) ..\t\$(NULL)
        $(XCOPY) $(GLOBEXE) ..\t\$(NULL)
        set PERL_STATIC_EXT=$(STATIC_EXT) && \
-           cd ..\t && perl.exe harness $(TEST_SWITCHES) $(TEST_FILES)
+           cd ..\t && perl.exe harness $(TEST_ARGS) $(TEST_SWITCHES) $(TEST_FILES)
 
 _clean :
        -@erase miniperlmain$(o)
@@ -1883,4 +1913,3 @@ nok: utils $(PERLEXE) $(PERLDLL) Extensions_nonxs Extensions
 
 nokfile: utils $(PERLEXE) $(PERLDLL) Extensions_nonxs Extensions
        $(PERLEXE) ..\utils\perlbug -nok -s "(UNINSTALLED)" -F perl.nok
-
index d4079d7..9485932 100644 (file)
@@ -4,7 +4,7 @@
 #      Microsoft Visual C++ 12.0 or later
 #
 # This is set up to build a perl.exe that runs off a shared library
-# (perl536.dll).  Also makes individual DLLs for the XS extensions.
+# (perl538.dll).  Also makes individual DLLs for the XS extensions.
 #
 
 ##
@@ -37,7 +37,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.36.3
+#INST_VER      = \5.38.2
 
 #
 # Comment this out if you DON'T want your perl installation to have
@@ -120,6 +120,7 @@ DEFAULT_INC_EXCLUDES_DOT = define
 
 #
 # Uncomment this if you want to build everything in C++ mode
+# This requires at least MSVC 2019.
 #
 #USE_CPLUSPLUS = define
 
@@ -171,7 +172,7 @@ DEFAULT_INC_EXCLUDES_DOT = define
 # set this to additionally provide a statically linked perl-static.exe.
 # Note that dynamic loading will not work with this perl, so you must
 # include required modules statically using the STATIC_EXT or ALL_STATIC
-# variables below. A static library perl536s.lib will also be created.
+# variables below. A static library perl538s.lib will also be created.
 # Ordinary perl.exe is not affected by this option.
 #
 #BUILD_STATIC  = define
@@ -432,6 +433,9 @@ INCLUDES    = -I$(COREDIR) -I.\include -I. -I..
 DEFINES                = -DWIN32 -D_CONSOLE -DNO_STRICT
 LOCDEFS                = -DPERLDLL -DPERL_CORE
 CXX_FLAG       = -TP -EHsc
+!IF "$(USE_CPLUSPLUS)" == "define"
+CXX_FLAG       = $(CXX_FLAG) -std:c++20
+!ENDIF
 EXTRACFLAGS    = -nologo -GF -W3
 
 !IF "$(CCTYPE)" == "MSVC120"
@@ -504,7 +508,7 @@ LIBBASEFILES        = $(LIBBASEFILES) msvcrt.lib vcruntime.lib
 !ENDIF
 
 # Avoid __intel_new_proc_init link error for libircmt.
-# libmmd is /MD equivelent, other variants exist.
+# libmmd is /MD equivalent, other variants exist.
 # libmmd is Intel C's math addon funcs to MS CRT, contains long doubles, C99,
 # and optimized C89 funcs
 !IF "$(__ICC)" == "define"
@@ -579,9 +583,9 @@ $(o).dll:
 
 # makedef.pl must be updated if this changes, and this should normally
 # only change when there is an incompatible revision of the public API.
-PERLIMPLIB     = ..\perl536.lib
-PERLSTATICLIB  = ..\perl536s.lib
-PERLDLL                = ..\perl536.dll
+PERLIMPLIB     = ..\perl538.lib
+PERLSTATICLIB  = ..\perl538s.lib
+PERLDLL                = ..\perl538.dll
 
 MINIPERL       = ..\miniperl.exe
 MINIDIR                = .\mini
@@ -671,6 +675,7 @@ DEL         = del
 MICROCORE_SRC  =               \
                ..\av.c         \
                ..\caretx.c     \
+               ..\class.c      \
                ..\builtin.c    \
                ..\deb.c        \
                ..\doio.c       \
@@ -688,6 +693,7 @@ MICROCORE_SRC       =               \
                ..\numeric.c    \
                ..\op.c         \
                ..\pad.c        \
+               ..\peep.c       \
                ..\perl.c       \
                ..\perly.c      \
                ..\pp.c         \
@@ -698,6 +704,10 @@ MICROCORE_SRC      =               \
                ..\pp_sys.c     \
                ..\reentr.c     \
                ..\regcomp.c    \
+               ..\regcomp_trie.c       \
+               ..\regcomp_debug.c      \
+               ..\regcomp_invlist.c    \
+               ..\regcomp_study.c      \
                ..\regexec.c    \
                ..\run.c        \
                ..\scope.c      \
@@ -746,6 +756,7 @@ CORE_NOCFG_H        =               \
                ..\pp.h         \
                ..\proto.h      \
                ..\regcomp.h    \
+               ..\regcomp_internal.h   \
                ..\regexp.h     \
                ..\scope.h      \
                ..\sv.h         \
@@ -833,7 +844,8 @@ CFG_VARS    =                                       \
                "default_inc_excludes_dot=$(DEFAULT_INC_EXCLUDES_DOT)"  \
                "LINK_FLAGS=$(LINK_FLAGS:"=\")"         \
                "optimize=$(OPTIMIZE:"=\")"             \
-               "WIN64=$(WIN64)"
+               "WIN64=$(WIN64)"                        \
+               "SKIP_CCHOME_CHECK=$(SKIP_CCHOME_CHECK)"
 
 #
 # Top targets
@@ -846,7 +858,15 @@ all : ..\git_version.h $(GLOBEXE) $(CONFIGPM) \
 
 regnodes : ..\regnodes.h
 
-..\regcomp$(o) : ..\regnodes.h ..\regcharclass.h
+..\regcomp$(o) : ..\regcomp.h ..\regcomp_internal.h ..\regnodes.h ..\regcharclass.h
+
+..\regcomp_debug$(o) : ..\regcomp.h ..\regcomp_internal.h ..\regnodes.h ..\regcharclass.h
+
+..\regcomp_invlist$(o) : ..\regcomp.h ..\regcomp_internal.h ..\regnodes.h ..\regcharclass.h
+
+..\regcomp_study$(o) : ..\regcomp.h ..\regcomp_internal.h ..\regnodes.h ..\regcharclass.h
+
+..\regcomp_trie$(o) : ..\regcomp.h ..\regcomp_internal.h ..\regnodes.h ..\regcharclass.h
 
 ..\regexec$(o) : ..\regnodes.h ..\regcharclass.h
 
@@ -871,7 +891,9 @@ perlglob$(o)  : perlglob.c
 ..\perl$(o) : ..\git_version.h
 
 ..\config.sh : $(CFGSH_TMPL) config_sh.PL FindExt.pm $(MINIPERL)
-       $(MINIPERL) -I..\lib config_sh.PL $(CFG_VARS) $(CFGSH_TMPL) > ..\config.sh
+       $(MINIPERL) -I..\lib config_sh.PL $(CFG_VARS) $(CFGSH_TMPL) > ..\config.sh.tmp
+       if exist ..\config.sh del /f ..\config.sh
+       rename ..\config.sh.tmp config.sh
 
 # This target is for when changes to the main config.sh happen.
 # Edit config.vc, then make perl in a minimal configuration (i.e. with MULTI,
@@ -1156,7 +1178,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\perl5363delta.pod
+       copy ..\pod\perldelta.pod ..\pod\perl5382delta.pod
        cd ..\win32
        $(PERLEXE) $(PL2BAT) $(UTILS)
        $(MINIPERL) -I..\lib ..\autodoc.pl ..
@@ -1229,7 +1251,6 @@ distclean: realclean
        -if exist $(LIBDIR)\MIME rmdir /s /q $(LIBDIR)\MIME
        -if exist $(LIBDIR)\Module rmdir /s /q $(LIBDIR)\Module
        -if exist $(LIBDIR)\Net\FTP rmdir /s /q $(LIBDIR)\Net\FTP
-       -if exist $(LIBDIR)\OpenBSD rmdir /s /q $(LIBDIR)\OpenBSD
        -if exist $(LIBDIR)\Params rmdir /s /q $(LIBDIR)\Params
        -if exist $(LIBDIR)\Parse rmdir /s /q $(LIBDIR)\Parse
        -if exist $(LIBDIR)\Perl rmdir /s /q $(LIBDIR)\Perl
@@ -1257,14 +1278,15 @@ 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 \
-           perl5363delta.pod perlaix.pod perlamiga.pod perlandroid.pod \
+           perl5382delta.pod perlaix.pod perlamiga.pod perlandroid.pod \
            perlapi.pod perlbs2000.pod perlcn.pod perlcygwin.pod \
            perlfreebsd.pod perlhaiku.pod perlhpux.pod perlhurd.pod \
            perlintern.pod perlirix.pod perljp.pod perlko.pod perllinux.pod \
            perlmacosx.pod perlmodlib.pod perlopenbsd.pod perlos2.pod \
            perlos390.pod perlos400.pod perlplan9.pod perlqnx.pod \
            perlriscos.pod perlsolaris.pod perlsynology.pod perltoc.pod \
-           perltru64.pod perltw.pod perlvos.pod perlwin32.pod
+           perltru64.pod perltw.pod perluniprops.pod perlvos.pod \
+           perlwin32.pod
        -cd ..\utils && del /f h2ph splain perlbug pl2pm h2xs \
            perldoc perlivp libnetcfg enc2xs encguess piconv cpan streamzip *.bat \
            xsubpp pod2html instmodsh json_pp prove ptar ptardiff ptargrep shasum corelist zipdetails
@@ -1322,12 +1344,12 @@ test-prep : all utils ../pod/perltoc.pod
 
 test : test-prep
        cd ..\t
-       perl.exe harness $(TEST_SWITCHES) $(TEST_FILES)
+       perl.exe harness $(TEST_ARGS) $(TEST_SWITCHES) $(TEST_FILES)
        cd ..\win32
 
 test_porting : test-prep
        cd ..\t
-       perl.exe harness $(TEST_SWITCHES) porting\*.t ..\lib\diagnostics.t
+       perl.exe harness $(TEST_ARGS) $(TEST_SWITCHES) porting\*.t ..\lib\diagnostics.t
        cd ..\win32
 
 test-reonly : reonly utils
@@ -1346,7 +1368,7 @@ regen :
 test-notty : test-prep
        set PERL_SKIP_TTY_TEST=1
        cd ..\t
-       perl.exe harness $(TEST_SWITCHES) $(TEST_FILES)
+       perl.exe harness $(TEST_ARGS) $(TEST_SWITCHES) $(TEST_FILES)
        cd ..\win32
 
 _test : 
@@ -1354,7 +1376,7 @@ _test :
        $(XCOPY) $(PERLDLL) ..\t\$(NULL)
        $(XCOPY) $(GLOBEXE) ..\t\$(NULL)
        cd ..\t
-       perl.exe harness $(TEST_SWITCHES) $(TEST_FILES)
+       perl.exe harness $(TEST_ARGS) $(TEST_SWITCHES) $(TEST_FILES)
        cd ..\win32
 
 _clean :
index 271627a..3de8b72 100644 (file)
@@ -111,6 +111,7 @@ d_attribute_nonnull='undef'
 d_attribute_noreturn='undef'
 d_attribute_pure='undef'
 d_attribute_unused='undef'
+d_attribute_visibility='undef'
 d_attribute_warn_unused_result='undef'
 d_backtrace='undef'
 d_bsd='define'
@@ -307,8 +308,8 @@ d_ilogbl='define'
 d_inc_version_list='undef'
 d_index='undef'
 d_inetaton='undef'
-d_inetntop='undef'
-d_inetpton='undef'
+d_inetntop='define'
+d_inetpton='define'
 d_int64_t='undef'
 d_ip_mreq='undef'
 d_ip_mreq_source='undef'
@@ -478,6 +479,7 @@ d_semget='undef'
 d_semop='undef'
 d_sendmsg='undef'
 d_setegid='undef'
+d_setenv='undef'
 d_seteuid='undef'
 d_setgrent='undef'
 d_setgrent_r='undef'
@@ -728,6 +730,7 @@ html3dir=' '
 html3direxp=''
 i16size='2'
 i16type='short'
+i32dformat='"ld"'
 i32size='4'
 i32type='long'
 i64size='8'
@@ -798,6 +801,7 @@ i_syssockio='undef'
 i_sysstat='define'
 i_sysstatfs='undef'
 i_sysstatvfs='undef'
+i_syssyscall='undef'
 i_systime='undef'
 i_systimek='undef'
 i_systimes='undef'
@@ -1112,8 +1116,12 @@ troff=''
 ttyname_r_proto='0'
 u16size='2'
 u16type='unsigned short'
+u32XUformat='"lX"'
+u32oformat='"lo"'
 u32size='4'
 u32type='unsigned long'
+u32uformat='"lu"'
+u32xformat='"lx"'
 u64size='8'
 u64type='unsigned long long'
 u8size='1'
index ced8779..934e78f 100644 (file)
@@ -111,6 +111,7 @@ d_attribute_nonnull='undef'
 d_attribute_noreturn='undef'
 d_attribute_pure='undef'
 d_attribute_unused='undef'
+d_attribute_visibility='undef'
 d_attribute_warn_unused_result='undef'
 d_backtrace='undef'
 d_bsd='define'
@@ -478,6 +479,7 @@ d_semget='undef'
 d_semop='undef'
 d_sendmsg='undef'
 d_setegid='undef'
+d_setenv='undef'
 d_seteuid='undef'
 d_setgrent='undef'
 d_setgrent_r='undef'
@@ -727,6 +729,7 @@ html3dir=' '
 html3direxp=''
 i16size='2'
 i16type='short'
+i32dformat='"ld"'
 i32size='4'
 i32type='long'
 i64size='8'
@@ -797,6 +800,7 @@ i_syssockio='undef'
 i_sysstat='define'
 i_sysstatfs='undef'
 i_sysstatvfs='undef'
+i_syssyscall='undef'
 i_systime='undef'
 i_systimek='undef'
 i_systimes='undef'
@@ -1111,8 +1115,12 @@ troff=''
 ttyname_r_proto='0'
 u16size='2'
 u16type='unsigned short'
+u32XUformat='"lX"'
+u32oformat='"lo"'
 u32size='4'
 u32type='unsigned long'
+u32uformat='"lu"'
+u32xformat='"lx"'
 u64size='8'
 u64type='unsigned __int64'
 u8size='1'
index 3644377..4fccad8 100644 (file)
@@ -50,7 +50,7 @@
  *     This symbol, if defined, indicates that the chsize routine is available
  *     to truncate files.  You might need a -lx to get this routine.
  */
-#define        HAS_CHSIZE              /**/
+#define HAS_CHSIZE              /**/
 
 /* HAS_CRYPT:
  *     This symbol, if defined, indicates that the crypt routine is available
  *     This symbol, if defined, indicates that the mbstowcs routine is
  *     available to convert a multibyte string into a wide character string.
  */
-#define        HAS_MBSTOWCS            /**/
+#define HAS_MBSTOWCS            /**/
 
 /* HAS_MBTOWC:
  *     This symbol, if defined, indicates that the mbtowc routine is available
  *     This symbol, if defined, indicates to the C program that it should
  *     include <arpa/inet.h> to get inet_addr and friends declarations.
  */
-#define        I_ARPA_INET             /**/
+#define I_ARPA_INET             /**/
 
 /* I_DBM:
  *     This symbol, if defined, indicates that <dbm.h> exists and should
  *     This symbol, if defined, indicates to the C program that it should
  *     include <locale.h>.
  */
-#define        I_LOCALE                /**/
+#define I_LOCALE                /**/
 
 /* I_NETINET_IN:
  *     This symbol, if defined, indicates to the C program that it should
  *     This symbol, if defined, indicates the <sys/sockio.h> should be included
  *     to get socket ioctl options, like SIOCATMARK.
  */
-/*#define      I_SYS_IOCTL             / **/
+/*#define I_SYS_IOCTL           / **/
 /*#define I_SYS_SOCKIO / **/
 
 /* I_SYS_NDIR:
  *     This symbol, if defined, indicates to the C program that it should
  *     include <sys/stat.h>.
  */
-#define        I_SYS_STAT              /**/
+#define I_SYS_STAT              /**/
 
 /* I_SYS_TIMES:
  *     This symbol, if defined, indicates to the C program that it should
  *     include <sys/times.h>.
  */
-/*#define      I_SYS_TIMES             / **/
+/*#define I_SYS_TIMES           / **/
 
 /* I_SYS_TYPES:
  *     This symbol, if defined, indicates to the C program that it should
  *     include <sys/types.h>.
  */
-#define        I_SYS_TYPES             /**/
+#define I_SYS_TYPES             /**/
 
 /* I_SYS_UN:
  *     This symbol, if defined, indicates to the C program that it should
  *     This symbol is defined if the C compiler can cast negative
  *     or large floating point numbers to 32-bit ints.
  */
-#define        CASTI32         /**/
+#define CASTI32         /**/
 
 /* CASTNEGFLOAT:
  *     This symbol is defined if the C compiler can cast negative
  *             2 = couldn't cast >= 0x80000000
  *             4 = couldn't cast in argument expression list
  */
-#define        CASTNEGFLOAT            /**/
+#define CASTNEGFLOAT            /**/
 #define CASTFLAGS 0            /**/
 
 /* VOID_CLOSEDIR:
  *     This symbol, if defined, indicates that siginfo_t has the
  *     si_value member
  */
-/*#define      HAS_SIGINFO_SI_ERRNO    / **/
-/*#define      HAS_SIGINFO_SI_PID      / **/
-/*#define      HAS_SIGINFO_SI_UID      / **/
-/*#define      HAS_SIGINFO_SI_ADDR     / **/
-/*#define      HAS_SIGINFO_SI_STATUS   / **/
-/*#define      HAS_SIGINFO_SI_BAND     / **/
-/*#define      HAS_SIGINFO_SI_VALUE    / **/
+/*#define HAS_SIGINFO_SI_ERRNO  / **/
+/*#define HAS_SIGINFO_SI_PID    / **/
+/*#define HAS_SIGINFO_SI_UID    / **/
+/*#define HAS_SIGINFO_SI_ADDR   / **/
+/*#define HAS_SIGINFO_SI_STATUS / **/
+/*#define HAS_SIGINFO_SI_BAND   / **/
+/*#define HAS_SIGINFO_SI_VALUE  / **/
 
 /* HAS_SIGSETJMP:
  *     This variable indicates to the C program that the sigsetjmp()
  *     This symbol, if defined, indicates that this system uses
  *     EBCDIC encoding.
  */
-/*#define      EBCDIC          / **/
+/*#define EBCDIC                / **/
 
 /* ARCHLIB:
  *     This variable, if defined, holds the name of the directory in
  *     This symbol, if defined, indicates that the system supports filenames
  *     longer than 14 characters.
  */
-#define        FLEXFILENAMES           /**/
+#define FLEXFILENAMES           /**/
 
 /* HAS_GETGRENT:
  *     This symbol, if defined, indicates that the getgrent routine is
  *     This symbol, if defined, indicates the availability of
  *     struct ipv6_mreq_source;
  */
-#define        HAS_SOCKET              /**/
-/*#define      HAS_SOCKETPAIR  / **/
-/*#define      HAS_SOCKADDR_SA_LEN     / **/
-/*#define      HAS_SOCKADDR_IN6        / **/
-#define        HAS_SOCKADDR_STORAGE    /**/
-#define        HAS_SIN6_SCOPE_ID       /**/
-/*#define      HAS_IP_MREQ     / **/
-/*#define      HAS_IP_MREQ_SOURCE      / **/
-/*#define      HAS_IPV6_MREQ   / **/
-/*#define      HAS_IPV6_MREQ_SOURCE    / **/
+#define HAS_SOCKET              /**/
+/*#define HAS_SOCKETPAIR        / **/
+/*#define HAS_SOCKADDR_SA_LEN   / **/
+/*#define HAS_SOCKADDR_IN6      / **/
+#define HAS_SOCKADDR_STORAGE    /**/
+#define HAS_SIN6_SCOPE_ID       /**/
+/*#define HAS_IP_MREQ   / **/
+/*#define HAS_IP_MREQ_SOURCE    / **/
+/*#define HAS_IPV6_MREQ / **/
+/*#define HAS_IPV6_MREQ_SOURCE  / **/
 
 /* USE_STAT_BLOCKS:
  *     This symbol is defined if this system has a stat structure declaring
  *     This symbol, if defined, indicates that <sys/uio.h> exists and
  *     should be included.
  */
-/*#define      I_SYSUIO                / **/
+/*#define I_SYSUIO              / **/
 
 /* I_TERMIO:
  *     This symbol, if defined, indicates that the program should include
  *     Perl has been cross-compiled to.  Undefined if not a cross-compile.
  */
 #ifndef USE_CROSS_COMPILE
-/*#define      USE_CROSS_COMPILE       / **/
-#define        PERL_TARGETARCH ""      /**/
+/*#define USE_CROSS_COMPILE     / **/
+#define PERL_TARGETARCH ""      /**/
 #endif
 
 /* PERL_USE_DEVEL:
  *     -Dusedevel, to enable development features.  This should not be
  *     done for production builds.
  */
-/*#define      PERL_USE_DEVEL          / **/
+/*#define PERL_USE_DEVEL                / **/
 
 /* HAS_ATOLF:
  *     This symbol, if defined, indicates that the atolf routine is
 /* HAS_C99_VARIADIC_MACROS:
  *     If defined, the compiler supports C99 variadic macros.
  */
-/*#define      HAS_C99_VARIADIC_MACROS / **/
+/*#define HAS_C99_VARIADIC_MACROS       / **/
 
 /* HAS_CLASS:
  *     This symbol, if defined, indicates that the class routine is
  *     to the program to supply one.  A good guess is
  *             extern int dbminit(char *);
  */
-/*#define      HAS_DBMINIT_PROTO       / **/
+/*#define HAS_DBMINIT_PROTO     / **/
 
 /* HAS_DIR_DD_FD:
- *     This symbol, if defined, indicates that the the DIR* dirstream
+ *     This symbol, if defined, indicates that the DIR* dirstream
  *     structure contains a member variable named dd_fd.
  */
 /*#define HAS_DIR_DD_FD                / **/
  *     makes sense if you *have* dlsym, which we will presume is the
  *     case if you're using dl_dlopen.xs.
  */
-/*#define      DLSYM_NEEDS_UNDERSCORE  / **/
+/*#define DLSYM_NEEDS_UNDERSCORE        / **/
 
 /* HAS_DUP3:
  *     This symbol, if defined, indicates that the dup3 routine is
  *     to the program to supply one.  A good guess is
  *             extern int flock(int, int);
  */
-#define        HAS_FLOCK_PROTO /**/
+#define HAS_FLOCK_PROTO /**/
 
 /* HAS_FMA:
  *     This symbol, if defined, indicates that the fma routine is
  *       FP_NAN        NaN
  *
  */
-/*#define      HAS_FPCLASSIFY          / **/
-/*#define      HAS_FP_CLASSIFY         / **/
+/*#define HAS_FPCLASSIFY                / **/
+/*#define HAS_FP_CLASSIFY               / **/
 
 /* HAS_FPCLASSL:
  *     This symbol, if defined, indicates that the fpclassl routine is
 /* HAS_FPOS64_T:
  *     This symbol will be defined if the C compiler supports fpos64_t.
  */
-/*#define      HAS_FPOS64_T    / **/
+/*#define HAS_FPOS64_T  / **/
 
 /* HAS_FREXPL:
  *     This symbol, if defined, indicates that the frexpl routine is
 /* HAS_UNLINKAT:
  *     This symbol is defined if the unlinkat() routine is available.
  */
-/*#define      HAS_FCHMODAT    / **/
-/*#define      HAS_LINKAT      / **/
-/*#define      HAS_OPENAT      / **/
-/*#define      HAS_RENAMEAT    / **/
-/*#define      HAS_UNLINKAT    / **/
+/*#define HAS_FCHMODAT  / **/
+/*#define HAS_LINKAT    / **/
+/*#define HAS_OPENAT    / **/
+/*#define HAS_RENAMEAT  / **/
+/*#define HAS_UNLINKAT  / **/
 
 /* HAS_FSEEKO:
  *     This symbol, if defined, indicates that the fseeko routine is
  *     This symbol, if defined, indicates that the inet_ntop() function
  *     is available to parse IPv4 and IPv6 strings.
  */
-/*#define HAS_INETNTOP         / **/
+#define HAS_INETNTOP           /**/
 
 /* HAS_INETPTON:
  *     This symbol, if defined, indicates that the inet_pton() function
  *     is available to parse IPv4 and IPv6 strings.
  */
-/*#define HAS_INETPTON         / **/
+#define HAS_INETPTON           /**/
 
 /* HAS_INT64_T:
  *     This symbol will defined if the C compiler supports int64_t.
  *     j0l() function is available for Bessel functions of the first
  *     kind of the order zero, for long doubles.
  */
-#define        HAS_J0          /**/
-/*#define      HAS_J0L         / **/
+#define HAS_J0          /**/
+/*#define HAS_J0L               / **/
 
 /* HAS_LC_MONETARY_2008:
  *     This symbol, if defined, indicates that the localeconv routine is
  *     This symbol, if defined, indicates that the C program should
  *     include <xlocale.h> to get newlocale() and its friends.
  */
-/*#define      HAS_NEWLOCALE   / **/
-/*#define      HAS_FREELOCALE  / **/
-/*#define      HAS_USELOCALE   / **/
-/*#define      HAS_DUPLOCALE   / **/
-/*#define      HAS_QUERYLOCALE / **/
-/*#define      NEED_XLOCALE_H  / **/
-/*#define      I_XLOCALE               / **/
+/*#define HAS_NEWLOCALE / **/
+/*#define HAS_FREELOCALE        / **/
+/*#define HAS_USELOCALE / **/
+/*#define HAS_DUPLOCALE / **/
+/*#define HAS_QUERYLOCALE       / **/
+/*#define NEED_XLOCALE_H        / **/
+/*#define I_XLOCALE               / **/
 
 /* HAS_NEXTAFTER:
  *     This symbol, if defined, indicates that the nextafter routine is
 /* HAS_OFF64_T:
  *     This symbol will be defined if the C compiler supports off64_t.
  */
-/*#define      HAS_OFF64_T             / **/
+/*#define HAS_OFF64_T           / **/
 
 /* HAS_PIPE2:
  *     This symbol, if defined, indicates that the pipe2 routine is
 /* HAS_PTRDIFF_T:
  *     This symbol will be defined if the C compiler supports ptrdiff_t.
  */
-#define        HAS_PTRDIFF_T           /**/
+#define HAS_PTRDIFF_T           /**/
 
 /* HAS_READV:
  *     This symbol, if defined, indicates that the readv routine is
  *             extern void* sbrk(int);
  *             extern void* sbrk(size_t);
  */
-/*#define      HAS_SBRK_PROTO  / **/
+/*#define HAS_SBRK_PROTO        / **/
 
 /* HAS_SCALBN:
  *     This symbol, if defined, indicates that the scalbn routine is
  *     be used.
  */
 #ifndef USE_SITECUSTOMIZE
-/*#define      USE_SITECUSTOMIZE               / **/
+/*#define USE_SITECUSTOMIZE             / **/
 #endif
 
 /* HAS_SNPRINTF:
  *     to the program to supply one.  A good guess is
  *             extern int sockatmark(int);
  */
-/*#define      HAS_SOCKATMARK_PROTO    / **/
+/*#define HAS_SOCKATMARK_PROTO  / **/
 
 /* HAS_SOCKS5_INIT:
  *     This symbol, if defined, indicates that the socks5_init routine is
  *     to the program to supply one.  Good guesses are
  *             extern int setresgid(uid_t ruid, uid_t euid, uid_t suid);
  */
-/*#define      HAS_SETRESGID_PROTO     / **/
+/*#define HAS_SETRESGID_PROTO   / **/
 
 /* HAS_SETRESUID_PROTO:
  *     This symbol, if defined, indicates that the system provides
  *     to the program to supply one.  Good guesses are
  *             extern int setresuid(uid_t ruid, uid_t euid, uid_t suid);
  */
-/*#define      HAS_SETRESUID_PROTO     / **/
+/*#define HAS_SETRESUID_PROTO   / **/
 
 /* HAS_STRUCT_STATFS_F_FLAGS:
  *     This symbol, if defined, indicates that the struct statfs
  *             extern int syscall(int,  ...);
  *             extern int syscall(long, ...);
  */
-/*#define      HAS_SYSCALL_PROTO       / **/
+/*#define HAS_SYSCALL_PROTO     / **/
 
 /* HAS_TELLDIR_PROTO:
  *     This symbol, if defined, indicates that the system provides
  *     to the program to supply one.  A good guess is
  *             extern long telldir(DIR*);
  */
-#define        HAS_TELLDIR_PROTO       /**/
+#define HAS_TELLDIR_PROTO       /**/
 
 /* HAS_TGAMMA:
  *     This symbol, if defined, indicates that the tgamma routine is
  *     This symbol, if defined, indicates that the asctime64 () routine is
  *     available to do the 64bit variant of asctime ()
  */
-/*#define      HAS_CTIME64             / **/
-/*#define      HAS_LOCALTIME64         / **/
-/*#define      HAS_GMTIME64            / **/
-/*#define      HAS_MKTIME64            / **/
-/*#define      HAS_DIFFTIME64          / **/
-/*#define      HAS_ASCTIME64           / **/
+/*#define HAS_CTIME64           / **/
+/*#define HAS_LOCALTIME64               / **/
+/*#define HAS_GMTIME64          / **/
+/*#define HAS_MKTIME64          / **/
+/*#define HAS_DIFFTIME64                / **/
+/*#define HAS_ASCTIME64         / **/
 
 /* HAS_TIMEGM:
  *     This symbol, if defined, indicates that the timegm routine is
  *     to the program to supply one.  A good guess is
  *             extern int usleep(useconds_t);
  */
-/*#define      HAS_USLEEP_PROTO        / **/
+/*#define HAS_USLEEP_PROTO      / **/
 
 /* HAS_USTAT:
  *     This symbol, if defined, indicates that the ustat system call is
 
 /* HAS_WCSXFRM:
  *     This symbol, if defined, indicates that the wcsxfrm routine is
- *     available to tranform a wide character string for wcscmp().
+ *     available to transform a wide character string for wcscmp().
  */
 #define HAS_WCSXFRM    /**/
 
  *     Note that if fflushNULL is defined, fflushall will not
  *     even be probed for and will be left undefined.
  */
-#define        FFLUSH_NULL             /**/
-/*#define      FFLUSH_ALL              / **/
+#define FFLUSH_NULL             /**/
+/*#define FFLUSH_ALL            / **/
 
 /* I_BFD:
  *     This symbol, if defined, indicates that <bfd.h> exists and
  *     can be included.
  */
-/*#define      I_BFD           / **/
+/*#define I_BFD         / **/
 
 /* I_CRYPT:
  *     This symbol, if defined, indicates that <crypt.h> exists and
  *     should be included.
  */
-/*#define      I_CRYPT         / **/
+/*#define I_CRYPT               / **/
 
 /* DB_Prefix_t:
  *     This symbol contains the type of the prefix structure element
  *     This symbol, if defined, indicates that <fp.h> exists and
  *     should be included.
  */
-/*#define      I_FP            / **/
+/*#define I_FP          / **/
 
 /* I_FP_CLASS:
  *     This symbol, if defined, indicates that <fp_class.h> exists and
  *     should be included.
  */
-/*#define      I_FP_CLASS              / **/
+/*#define I_FP_CLASS            / **/
 
 /* I_IEEEFP:
  *     This symbol, if defined, indicates that <ieeefp.h> exists and
  *     should be included.
  */
-/*#define      I_IEEEFP                / **/
+/*#define I_IEEEFP              / **/
 
 /* I_INTTYPES:
  *     This symbol, if defined, indicates to the C program that it should
  *     This symbol, if defined, indicates that <langinfo.h> exists and
  *     should be included.
  */
-/*#define      I_LANGINFO              / **/
+/*#define I_LANGINFO            / **/
 
 /* I_LIBUTIL:
  *     This symbol, if defined, indicates that <libutil.h> exists and
  *     should be included.
  */
-/*#define      I_LIBUTIL               / **/
+/*#define I_LIBUTIL             / **/
 
 /* I_MALLOCMALLOC:
  *     This symbol, if defined, indicates to the C program that it should
  *     This symbol, if defined, indicates that <mntent.h> exists and
  *     should be included.
  */
-/*#define      I_MNTENT                / **/
+/*#define I_MNTENT              / **/
 
 /* I_NETINET_TCP:
  *     This symbol, if defined, indicates to the C program that it should
  *     This symbol, if defined, indicates that <poll.h> exists and
  *     should be included. (see also HAS_POLL)
  */
-/*#define      I_POLL          / **/
+/*#define I_POLL                / **/
 
 /* I_PROT:
  *     This symbol, if defined, indicates that <prot.h> exists and
  *     should be included.
  */
-/*#define      I_PROT          / **/
+/*#define I_PROT                / **/
 
 /* I_QUADMATH:
  *     This symbol, if defined, indicates that <quadmath.h> exists and
  *     should be included.
  */
-/*#define      I_QUADMATH              / **/
+/*#define I_QUADMATH            / **/
 
 /* I_SHADOW:
  *     This symbol, if defined, indicates that <shadow.h> exists and
  *     should be included.
  */
-/*#define      I_SHADOW                / **/
+/*#define I_SHADOW              / **/
 
 /* I_SOCKS:
  *     This symbol, if defined, indicates that <socks.h> exists and
  *     should be included.
  */
-/*#define      I_SOCKS         / **/
+/*#define I_SOCKS               / **/
 
 /* I_STDBOOL:
  *     This symbol, if defined, indicates that <stdbool.h> exists and
  *     can be included.
  */
-#define        I_STDBOOL               /**/
+#define I_STDBOOL               /**/
 
 /* I_STDINT:
  *     This symbol, if defined, indicates that <stdint.h> exists and
  *     This symbol, if defined, indicates that <sunmath.h> exists and
  *     should be included.
  */
-/*#define      I_SUNMATH               / **/
+/*#define I_SUNMATH             / **/
 
 /* I_SYSLOG:
  *     This symbol, if defined, indicates that <syslog.h> exists and
  *     should be included.
  */
-/*#define      I_SYSLOG                / **/
+/*#define I_SYSLOG              / **/
 
 /* I_SYSMODE:
  *     This symbol, if defined, indicates that <sys/mode.h> exists and
  *     should be included.
  */
-/*#define      I_SYSMODE               / **/
+/*#define I_SYSMODE             / **/
 
 /* I_SYS_MOUNT:
  *     This symbol, if defined, indicates that <sys/mount.h> exists and
  *     should be included.
  */
-/*#define      I_SYS_MOUNT             / **/
+/*#define I_SYS_MOUNT           / **/
 
 /* I_SYS_STATFS:
  *     This symbol, if defined, indicates that <sys/statfs.h> exists.
  */
-/*#define      I_SYS_STATFS            / **/
+/*#define I_SYS_STATFS          / **/
 
 /* I_SYS_STATVFS:
  *     This symbol, if defined, indicates that <sys/statvfs.h> exists and
  *     should be included.
  */
-/*#define      I_SYS_STATVFS           / **/
+/*#define I_SYS_STATVFS         / **/
 
 /* I_SYSUTSNAME:
  *     This symbol, if defined, indicates that <sys/utsname.h> exists and
  *     should be included.
  */
-/*#define      I_SYSUTSNAME            / **/
+/*#define I_SYSUTSNAME          / **/
 
 /* I_SYS_VFS:
  *     This symbol, if defined, indicates that <sys/vfs.h> exists and
  *     should be included.
  */
-/*#define      I_SYS_VFS               / **/
+/*#define I_SYS_VFS             / **/
 
 /* I_USTAT:
  *     This symbol, if defined, indicates that <ustat.h> exists and
  *     should be included.
  */
-/*#define      I_USTAT         / **/
+/*#define I_USTAT               / **/
 
 /* I_WCHAR:
  *     This symbol, if defined, indicates to the C program that <wchar.h>
 /* I_WCTYPE:
  *     This symbol, if defined, indicates that <wctype.h> exists.
  */
-/*#define      I_WCTYPE                / **/
+/*#define I_WCTYPE              / **/
 
 /* DOUBLEINFBYTES:
  *     This symbol, if defined, is a comma-separated list of
  *     of copying mechanisms, handy.h defines a platform-
  *     independent macro, Perl_va_copy(src, dst), to do the job.
  */
-/*#define      NEED_VA_COPY            / **/
+/*#define NEED_VA_COPY          / **/
 
 /* IVTYPE:
  *     This symbol defines the C type used for Perl's IV.
  *     This symbol, if defined, indicates that a variable of type NVTYPE
  *     stores 0.0 in memory as all bits zero.
  */
-#define        IVTYPE          long long               /**/
-#define        UVTYPE          unsigned long long              /**/
-#define        I8TYPE          char            /**/
-#define        U8TYPE          unsigned char           /**/
-#define        I16TYPE         short   /**/
-#define        U16TYPE         unsigned short  /**/
-#define        I32TYPE         long    /**/
-#define        U32TYPE         unsigned long   /**/
+#define IVTYPE          long long               /**/
+#define UVTYPE          unsigned long long              /**/
+#define I8TYPE          char            /**/
+#define U8TYPE          unsigned char           /**/
+#define I16TYPE         short   /**/
+#define U16TYPE         unsigned short  /**/
+#define I32TYPE         long    /**/
+#define U32TYPE         unsigned long   /**/
 #ifdef HAS_QUAD
-#define        I64TYPE         long long       /**/
-#define        U64TYPE         unsigned long long      /**/
+#define I64TYPE         long long       /**/
+#define U64TYPE         unsigned long long      /**/
 #endif
-#define        NVTYPE          double          /**/
-#define        IVSIZE          8               /**/
-#define        UVSIZE          8               /**/
-#define        I8SIZE          1               /**/
-#define        U8SIZE          1               /**/
-#define        I16SIZE         2       /**/
-#define        U16SIZE         2       /**/
-#define        I32SIZE         4       /**/
-#define        U32SIZE         4       /**/
+#define NVTYPE          double          /**/
+#define IVSIZE          8               /**/
+#define UVSIZE          8               /**/
+#define I8SIZE          1               /**/
+#define U8SIZE          1               /**/
+#define I16SIZE         2       /**/
+#define U16SIZE         2       /**/
+#define I32SIZE         4       /**/
+#define U32SIZE         4       /**/
 #ifdef HAS_QUAD
-#define        I64SIZE         8       /**/
-#define        U64SIZE         8       /**/
+#define I64SIZE         8       /**/
+#define U64SIZE         8       /**/
 #endif
-#define        NVSIZE          8               /**/
+#define NVSIZE          8               /**/
 #undef NV_PRESERVES_UV
-#define        NV_PRESERVES_UV_BITS    53
-#define        NV_OVERFLOWS_INTEGERS_AT        (256.0*256.0*256.0*256.0*256.0*256.0*2.0*2.0*2.0*2.0*2.0)
-#define        NV_ZERO_IS_ALLBITS_ZERO
+#define NV_PRESERVES_UV_BITS    53
+#define NV_OVERFLOWS_INTEGERS_AT        (256.0*256.0*256.0*256.0*256.0*256.0*2.0*2.0*2.0*2.0*2.0)
+#define NV_ZERO_IS_ALLBITS_ZERO
 #if UVSIZE == 8
 #   ifdef BYTEORDER
 #       if BYTEORDER == 0x1234
  *     This symbol defines the format string used for printing a Perl NV
  *     using %g-ish floating point format.
  */
-#define        IVdf            "I64d"          /**/
-#define        UVuf            "I64u"          /**/
-#define        UVof            "I64o"          /**/
-#define        UVxf            "I64x"          /**/
-#define        UVXf            "I64X"          /**/
-#define        NVef            "e"             /**/
-#define        NVff            "f"             /**/
-#define        NVgf            "g"             /**/
+/* I32df:
+ *     This symbol defines the format string used for printing a Perl I32
+ *     as a signed decimal integer.
+ */
+/* U32uf:
+ *     This symbol defines the format string used for printing a Perl U32
+ *     as an unsigned decimal integer.
+ */
+/* U32of:
+ *     This symbol defines the format string used for printing a Perl U32
+ *     as an unsigned octal integer.
+ */
+/* U32xf:
+ *     This symbol defines the format string used for printing a Perl U32
+ *     as an unsigned hexadecimal integer in lowercase abcdef.
+ */
+/* U32Xf:
+ *     This symbol defines the format string used for printing a Perl U32
+ *     as an unsigned hexadecimal integer in uppercase ABCDEF.
+ */
+#define IVdf            "I64d"          /**/
+#define UVuf            "I64u"          /**/
+#define UVof            "I64o"          /**/
+#define UVxf            "I64x"          /**/
+#define UVXf            "I64X"          /**/
+#define NVef            "e"             /**/
+#define NVff            "f"             /**/
+#define NVgf            "g"             /**/
+#define I32df           "ld"            /**/
+#define U32uf           "lu"            /**/
+#define U32of           "lo"            /**/
+#define U32xf           "lx"            /**/
+#define U32Xf           "lX"            /**/
 
 /* SELECT_MIN_BITS:
  *     This symbol holds the minimum number of bits operated by select.
  *     This symbol tells the name of the array holding the stdio streams.
  *     Usual values include _iob, __iob, and __sF.
  */
-/*#define      HAS_STDIO_STREAM_ARRAY  / **/
+/*#define HAS_STDIO_STREAM_ARRAY        / **/
 #ifdef HAS_STDIO_STREAM_ARRAY
 #define STDIO_STREAM_ARRAY     
 #endif
  *     you may need at least to reboot your OS to 64-bit mode.
  */
 #ifndef USE_64_BIT_INT
-#define        USE_64_BIT_INT          /**/
+#define USE_64_BIT_INT          /**/
 #endif
 #ifndef USE_64_BIT_ALL
-/*#define      USE_64_BIT_ALL          / **/
+/*#define USE_64_BIT_ALL                / **/
 #endif
 
 /* USE_C_BACKTRACE:
  *     Defaults to define in Perls 5.8 and earlier, to undef later.
  */
 #ifndef USE_FAST_STDIO
-/*#define      USE_FAST_STDIO          / **/
+/*#define USE_FAST_STDIO                / **/
 #endif
 
 /* USE_KERN_PROC_PATHNAME:
  *     should be used when available.
  */
 #ifndef USE_LARGE_FILES
-#define        USE_LARGE_FILES         /**/
+#define USE_LARGE_FILES         /**/
 #endif
 
 /* USE_LONG_DOUBLE:
  *     be used when available.
  */
 #ifndef USE_LONG_DOUBLE
-/*#define      USE_LONG_DOUBLE         / **/
+/*#define USE_LONG_DOUBLE               / **/
 #endif
 
 /* USE_MORE_BITS:
  *     long doubles should be used when available.
  */
 #ifndef USE_MORE_BITS
-/*#define      USE_MORE_BITS           / **/
+/*#define USE_MORE_BITS         / **/
 #endif
 
 /* MULTIPLICITY:
  *     be built to use multiplicity.
  */
 #ifndef MULTIPLICITY
-/*#define      MULTIPLICITY            / **/
+/*#define MULTIPLICITY          / **/
 #endif
 
 /* USE_NSGETEXECUTABLEPATH:
  *     used in a fully backward compatible manner.
  */
 #ifndef USE_PERLIO
-#define        USE_PERLIO              /**/
+#define USE_PERLIO              /**/
 #endif
 
 /* USE_QUADMATH:
  *     be used when available.
  */
 #ifndef USE_QUADMATH
-/*#define      USE_QUADMATH            / **/
+/*#define USE_QUADMATH          / **/
 #endif
 
 /* USE_SOCKS:
  *     be built to use socks.
  */
 #ifndef USE_SOCKS
-/*#define      USE_SOCKS               / **/
+/*#define USE_SOCKS             / **/
 #endif
 
 /* HAS_DRAND48_PROTO:
  *     to the program to supply one.  A good guess is
  *             extern double drand48(void);
  */
-/*#define      HAS_DRAND48_PROTO       / **/
+/*#define HAS_DRAND48_PROTO     / **/
 
 /* HAS_GETHOST_PROTOS:
  *     This symbol, if defined, indicates that <netdb.h> includes
  *     gethostbyaddr().  Otherwise, it is up to the program to guess
  *     them.  See netdbtype.U for probing for various Netdb_xxx_t types.
  */
-#define        HAS_GETHOST_PROTOS      /**/
+#define HAS_GETHOST_PROTOS      /**/
 
 /* HAS_GETNET_PROTOS:
  *     This symbol, if defined, indicates that <netdb.h> includes
  *     getnetbyaddr().  Otherwise, it is up to the program to guess
  *     them.  See netdbtype.U for probing for various Netdb_xxx_t types.
  */
-/*#define      HAS_GETNET_PROTOS       / **/
+/*#define HAS_GETNET_PROTOS     / **/
 
 /* HAS_GETPROTO_PROTOS:
  *     This symbol, if defined, indicates that <netdb.h> includes
  *     getprotobyaddr().  Otherwise, it is up to the program to guess
  *     them.  See netdbtype.U for probing for various Netdb_xxx_t types.
  */
-#define        HAS_GETPROTO_PROTOS     /**/
+#define HAS_GETPROTO_PROTOS     /**/
 
 /* HAS_GETSERV_PROTOS:
  *     This symbol, if defined, indicates that <netdb.h> includes
  *     getservbyaddr().  Otherwise, it is up to the program to guess
  *     them.  See netdbtype.U for probing for various Netdb_xxx_t types.
  */
-#define        HAS_GETSERV_PROTOS      /**/
+#define HAS_GETSERV_PROTOS      /**/
 
 /* HAS_LSEEK_PROTO:
  *     This symbol, if defined, indicates that the system provides
  *     to the program to supply one.  A good guess is
  *             extern off_t lseek(int, off_t, int);
  */
-#define        HAS_LSEEK_PROTO /**/
+#define HAS_LSEEK_PROTO /**/
 
 /* Netdb_host_t:
  *     This symbol holds the type used for the 1st argument
  *     try to use the various _r versions of library functions.
  *     This is extremely experimental.
  */
-/*#define      USE_ITHREADS            / **/
-/*#define              USE_THREADS             / **/
-/*#define      OLD_PTHREADS_API                / **/
-/*#define      USE_REENTRANT_API       / **/
+/*#define USE_ITHREADS          / **/
+/*#define       USE_THREADS             / **/
+/*#define OLD_PTHREADS_API              / **/
+/*#define USE_REENTRANT_API     / **/
 
 /* HAS_TIME:
  *     This symbol, if defined, indicates that the time() routine exists.
 /* Gid_t_f:
  *     This symbol defines the format string used for printing a Gid_t.
  */
-#define        Gid_t_f         "ld"            /**/
+#define Gid_t_f         "ld"            /**/
 
 /* Gid_t_sign:
  *     This symbol holds the signedness of a Gid_t.
 /* Uid_t_f:
  *     This symbol defines the format string used for printing a Uid_t.
  */
-#define        Uid_t_f         "ld"            /**/
+#define Uid_t_f         "ld"            /**/
 
 /* Uid_t_sign:
  *     This symbol holds the signedness of a Uid_t.
index 7f7886e..8cbb3f3 100644 (file)
@@ -50,7 +50,7 @@
  *     This symbol, if defined, indicates that the chsize routine is available
  *     to truncate files.  You might need a -lx to get this routine.
  */
-#define        HAS_CHSIZE              /**/
+#define HAS_CHSIZE              /**/
 
 /* HAS_CRYPT:
  *     This symbol, if defined, indicates that the crypt routine is available
  *     This symbol, if defined, indicates that the mbstowcs routine is
  *     available to convert a multibyte string into a wide character string.
  */
-#define        HAS_MBSTOWCS            /**/
+#define HAS_MBSTOWCS            /**/
 
 /* HAS_MBTOWC:
  *     This symbol, if defined, indicates that the mbtowc routine is available
  *     This symbol, if defined, indicates to the C program that it should
  *     include <arpa/inet.h> to get inet_addr and friends declarations.
  */
-#define        I_ARPA_INET             /**/
+#define I_ARPA_INET             /**/
 
 /* I_DBM:
  *     This symbol, if defined, indicates that <dbm.h> exists and should
  *     This symbol, if defined, indicates to the C program that it should
  *     include <locale.h>.
  */
-#define        I_LOCALE                /**/
+#define I_LOCALE                /**/
 
 /* I_NETINET_IN:
  *     This symbol, if defined, indicates to the C program that it should
  *     This symbol, if defined, indicates the <sys/sockio.h> should be included
  *     to get socket ioctl options, like SIOCATMARK.
  */
-/*#define      I_SYS_IOCTL             / **/
+/*#define I_SYS_IOCTL           / **/
 /*#define I_SYS_SOCKIO / **/
 
 /* I_SYS_NDIR:
  *     This symbol, if defined, indicates to the C program that it should
  *     include <sys/stat.h>.
  */
-#define        I_SYS_STAT              /**/
+#define I_SYS_STAT              /**/
 
 /* I_SYS_TIMES:
  *     This symbol, if defined, indicates to the C program that it should
  *     include <sys/times.h>.
  */
-/*#define      I_SYS_TIMES             / **/
+/*#define I_SYS_TIMES           / **/
 
 /* I_SYS_TYPES:
  *     This symbol, if defined, indicates to the C program that it should
  *     include <sys/types.h>.
  */
-#define        I_SYS_TYPES             /**/
+#define I_SYS_TYPES             /**/
 
 /* I_SYS_UN:
  *     This symbol, if defined, indicates to the C program that it should
  *     This symbol is defined if the C compiler can cast negative
  *     or large floating point numbers to 32-bit ints.
  */
-/*#define      CASTI32         / **/
+/*#define CASTI32               / **/
 
 /* CASTNEGFLOAT:
  *     This symbol is defined if the C compiler can cast negative
  *             2 = couldn't cast >= 0x80000000
  *             4 = couldn't cast in argument expression list
  */
-#define        CASTNEGFLOAT            /**/
+#define CASTNEGFLOAT            /**/
 #define CASTFLAGS 0            /**/
 
 /* VOID_CLOSEDIR:
  *     This symbol, if defined, indicates that siginfo_t has the
  *     si_value member
  */
-/*#define      HAS_SIGINFO_SI_ERRNO    / **/
-/*#define      HAS_SIGINFO_SI_PID      / **/
-/*#define      HAS_SIGINFO_SI_UID      / **/
-/*#define      HAS_SIGINFO_SI_ADDR     / **/
-/*#define      HAS_SIGINFO_SI_STATUS   / **/
-/*#define      HAS_SIGINFO_SI_BAND     / **/
-/*#define      HAS_SIGINFO_SI_VALUE    / **/
+/*#define HAS_SIGINFO_SI_ERRNO  / **/
+/*#define HAS_SIGINFO_SI_PID    / **/
+/*#define HAS_SIGINFO_SI_UID    / **/
+/*#define HAS_SIGINFO_SI_ADDR   / **/
+/*#define HAS_SIGINFO_SI_STATUS / **/
+/*#define HAS_SIGINFO_SI_BAND   / **/
+/*#define HAS_SIGINFO_SI_VALUE  / **/
 
 /* HAS_SIGSETJMP:
  *     This variable indicates to the C program that the sigsetjmp()
  *     This symbol, if defined, indicates that this system uses
  *     EBCDIC encoding.
  */
-/*#define      EBCDIC          / **/
+/*#define EBCDIC                / **/
 
 /* ARCHLIB:
  *     This variable, if defined, holds the name of the directory in
  *     This symbol, if defined, indicates that the system supports filenames
  *     longer than 14 characters.
  */
-#define        FLEXFILENAMES           /**/
+#define FLEXFILENAMES           /**/
 
 /* HAS_GETGRENT:
  *     This symbol, if defined, indicates that the getgrent routine is
  *     This symbol, if defined, indicates the availability of
  *     struct ipv6_mreq_source;
  */
-#define        HAS_SOCKET              /**/
-/*#define      HAS_SOCKETPAIR  / **/
-/*#define      HAS_SOCKADDR_SA_LEN     / **/
-/*#define      HAS_SOCKADDR_IN6        / **/
-#define        HAS_SOCKADDR_STORAGE    /**/
-#define        HAS_SIN6_SCOPE_ID       /**/
-/*#define      HAS_IP_MREQ     / **/
-/*#define      HAS_IP_MREQ_SOURCE      / **/
-/*#define      HAS_IPV6_MREQ   / **/
-/*#define      HAS_IPV6_MREQ_SOURCE    / **/
+#define HAS_SOCKET              /**/
+/*#define HAS_SOCKETPAIR        / **/
+/*#define HAS_SOCKADDR_SA_LEN   / **/
+/*#define HAS_SOCKADDR_IN6      / **/
+#define HAS_SOCKADDR_STORAGE    /**/
+#define HAS_SIN6_SCOPE_ID       /**/
+/*#define HAS_IP_MREQ   / **/
+/*#define HAS_IP_MREQ_SOURCE    / **/
+/*#define HAS_IPV6_MREQ / **/
+/*#define HAS_IPV6_MREQ_SOURCE  / **/
 
 /* USE_STAT_BLOCKS:
  *     This symbol is defined if this system has a stat structure declaring
  *     This symbol, if defined, indicates that <sys/uio.h> exists and
  *     should be included.
  */
-/*#define      I_SYSUIO                / **/
+/*#define I_SYSUIO              / **/
 
 /* I_TERMIO:
  *     This symbol, if defined, indicates that the program should include
  *     Perl has been cross-compiled to.  Undefined if not a cross-compile.
  */
 #ifndef USE_CROSS_COMPILE
-/*#define      USE_CROSS_COMPILE       / **/
-#define        PERL_TARGETARCH ""      /**/
+/*#define USE_CROSS_COMPILE     / **/
+#define PERL_TARGETARCH ""      /**/
 #endif
 
 /* PERL_USE_DEVEL:
  *     -Dusedevel, to enable development features.  This should not be
  *     done for production builds.
  */
-/*#define      PERL_USE_DEVEL          / **/
+/*#define PERL_USE_DEVEL                / **/
 
 /* HAS_ATOLF:
  *     This symbol, if defined, indicates that the atolf routine is
 /* HAS_C99_VARIADIC_MACROS:
  *     If defined, the compiler supports C99 variadic macros.
  */
-/*#define      HAS_C99_VARIADIC_MACROS / **/
+/*#define HAS_C99_VARIADIC_MACROS       / **/
 
 /* HAS_CLASS:
  *     This symbol, if defined, indicates that the class routine is
  *     to the program to supply one.  A good guess is
  *             extern int dbminit(char *);
  */
-/*#define      HAS_DBMINIT_PROTO       / **/
+/*#define HAS_DBMINIT_PROTO     / **/
 
 /* HAS_DIR_DD_FD:
- *     This symbol, if defined, indicates that the the DIR* dirstream
+ *     This symbol, if defined, indicates that the DIR* dirstream
  *     structure contains a member variable named dd_fd.
  */
 /*#define HAS_DIR_DD_FD                / **/
  *     makes sense if you *have* dlsym, which we will presume is the
  *     case if you're using dl_dlopen.xs.
  */
-/*#define      DLSYM_NEEDS_UNDERSCORE  / **/
+/*#define DLSYM_NEEDS_UNDERSCORE        / **/
 
 /* HAS_DUP3:
  *     This symbol, if defined, indicates that the dup3 routine is
  *     to the program to supply one.  A good guess is
  *             extern int flock(int, int);
  */
-#define        HAS_FLOCK_PROTO /**/
+#define HAS_FLOCK_PROTO /**/
 
 /* HAS_FMA:
  *     This symbol, if defined, indicates that the fma routine is
  *       FP_NAN        NaN
  *
  */
-/*#define      HAS_FPCLASSIFY          / **/
-/*#define      HAS_FP_CLASSIFY         / **/
+/*#define HAS_FPCLASSIFY                / **/
+/*#define HAS_FP_CLASSIFY               / **/
 
 /* HAS_FPCLASSL:
  *     This symbol, if defined, indicates that the fpclassl routine is
 /* HAS_FPOS64_T:
  *     This symbol will be defined if the C compiler supports fpos64_t.
  */
-/*#define      HAS_FPOS64_T    / **/
+/*#define HAS_FPOS64_T  / **/
 
 /* HAS_FREXPL:
  *     This symbol, if defined, indicates that the frexpl routine is
 /* HAS_UNLINKAT:
  *     This symbol is defined if the unlinkat() routine is available.
  */
-/*#define      HAS_FCHMODAT    / **/
-/*#define      HAS_LINKAT      / **/
-/*#define      HAS_OPENAT      / **/
-/*#define      HAS_RENAMEAT    / **/
-/*#define      HAS_UNLINKAT    / **/
+/*#define HAS_FCHMODAT  / **/
+/*#define HAS_LINKAT    / **/
+/*#define HAS_OPENAT    / **/
+/*#define HAS_RENAMEAT  / **/
+/*#define HAS_UNLINKAT  / **/
 
 /* HAS_FSEEKO:
  *     This symbol, if defined, indicates that the fseeko routine is
  *     j0l() function is available for Bessel functions of the first
  *     kind of the order zero, for long doubles.
  */
-/*#define      HAS_J0          / **/
-/*#define      HAS_J0L         / **/
+/*#define HAS_J0                / **/
+/*#define HAS_J0L               / **/
 
 /* HAS_LC_MONETARY_2008:
  *     This symbol, if defined, indicates that the localeconv routine is
  *     This symbol, if defined, indicates that the C program should
  *     include <xlocale.h> to get newlocale() and its friends.
  */
-/*#define      HAS_NEWLOCALE   / **/
-/*#define      HAS_FREELOCALE  / **/
-/*#define      HAS_USELOCALE   / **/
-/*#define      HAS_DUPLOCALE   / **/
-/*#define      HAS_QUERYLOCALE / **/
-/*#define      NEED_XLOCALE_H  / **/
-/*#define      I_XLOCALE               / **/
+/*#define HAS_NEWLOCALE / **/
+/*#define HAS_FREELOCALE        / **/
+/*#define HAS_USELOCALE / **/
+/*#define HAS_DUPLOCALE / **/
+/*#define HAS_QUERYLOCALE       / **/
+/*#define NEED_XLOCALE_H        / **/
+/*#define I_XLOCALE               / **/
 
 /* HAS_NEXTAFTER:
  *     This symbol, if defined, indicates that the nextafter routine is
 /* HAS_OFF64_T:
  *     This symbol will be defined if the C compiler supports off64_t.
  */
-/*#define      HAS_OFF64_T             / **/
+/*#define HAS_OFF64_T           / **/
 
 /* HAS_PIPE2:
  *     This symbol, if defined, indicates that the pipe2 routine is
 /* HAS_PTRDIFF_T:
  *     This symbol will be defined if the C compiler supports ptrdiff_t.
  */
-#define        HAS_PTRDIFF_T           /**/
+#define HAS_PTRDIFF_T           /**/
 
 /* HAS_READV:
  *     This symbol, if defined, indicates that the readv routine is
  *             extern void* sbrk(int);
  *             extern void* sbrk(size_t);
  */
-/*#define      HAS_SBRK_PROTO  / **/
+/*#define HAS_SBRK_PROTO        / **/
 
 /* HAS_SCALBN:
  *     This symbol, if defined, indicates that the scalbn routine is
  *     be used.
  */
 #ifndef USE_SITECUSTOMIZE
-/*#define      USE_SITECUSTOMIZE               / **/
+/*#define USE_SITECUSTOMIZE             / **/
 #endif
 
 /* HAS_SNPRINTF:
  *     to the program to supply one.  A good guess is
  *             extern int sockatmark(int);
  */
-/*#define      HAS_SOCKATMARK_PROTO    / **/
+/*#define HAS_SOCKATMARK_PROTO  / **/
 
 /* HAS_SOCKS5_INIT:
  *     This symbol, if defined, indicates that the socks5_init routine is
  *     to the program to supply one.  Good guesses are
  *             extern int setresgid(uid_t ruid, uid_t euid, uid_t suid);
  */
-/*#define      HAS_SETRESGID_PROTO     / **/
+/*#define HAS_SETRESGID_PROTO   / **/
 
 /* HAS_SETRESUID_PROTO:
  *     This symbol, if defined, indicates that the system provides
  *     to the program to supply one.  Good guesses are
  *             extern int setresuid(uid_t ruid, uid_t euid, uid_t suid);
  */
-/*#define      HAS_SETRESUID_PROTO     / **/
+/*#define HAS_SETRESUID_PROTO   / **/
 
 /* HAS_STRUCT_STATFS_F_FLAGS:
  *     This symbol, if defined, indicates that the struct statfs
  *             extern int syscall(int,  ...);
  *             extern int syscall(long, ...);
  */
-/*#define      HAS_SYSCALL_PROTO       / **/
+/*#define HAS_SYSCALL_PROTO     / **/
 
 /* HAS_TELLDIR_PROTO:
  *     This symbol, if defined, indicates that the system provides
  *     to the program to supply one.  A good guess is
  *             extern long telldir(DIR*);
  */
-#define        HAS_TELLDIR_PROTO       /**/
+#define HAS_TELLDIR_PROTO       /**/
 
 /* HAS_TGAMMA:
  *     This symbol, if defined, indicates that the tgamma routine is
  *     This symbol, if defined, indicates that the asctime64 () routine is
  *     available to do the 64bit variant of asctime ()
  */
-/*#define      HAS_CTIME64             / **/
-/*#define      HAS_LOCALTIME64         / **/
-/*#define      HAS_GMTIME64            / **/
-/*#define      HAS_MKTIME64            / **/
-/*#define      HAS_DIFFTIME64          / **/
-/*#define      HAS_ASCTIME64           / **/
+/*#define HAS_CTIME64           / **/
+/*#define HAS_LOCALTIME64               / **/
+/*#define HAS_GMTIME64          / **/
+/*#define HAS_MKTIME64          / **/
+/*#define HAS_DIFFTIME64                / **/
+/*#define HAS_ASCTIME64         / **/
 
 /* HAS_TIMEGM:
  *     This symbol, if defined, indicates that the timegm routine is
  *     to the program to supply one.  A good guess is
  *             extern int usleep(useconds_t);
  */
-/*#define      HAS_USLEEP_PROTO        / **/
+/*#define HAS_USLEEP_PROTO      / **/
 
 /* HAS_USTAT:
  *     This symbol, if defined, indicates that the ustat system call is
 
 /* HAS_WCSXFRM:
  *     This symbol, if defined, indicates that the wcsxfrm routine is
- *     available to tranform a wide character string for wcscmp().
+ *     available to transform a wide character string for wcscmp().
  */
 #define HAS_WCSXFRM    /**/
 
  *     Note that if fflushNULL is defined, fflushall will not
  *     even be probed for and will be left undefined.
  */
-#define        FFLUSH_NULL             /**/
-/*#define      FFLUSH_ALL              / **/
+#define FFLUSH_NULL             /**/
+/*#define FFLUSH_ALL            / **/
 
 /* I_BFD:
  *     This symbol, if defined, indicates that <bfd.h> exists and
  *     can be included.
  */
-/*#define      I_BFD           / **/
+/*#define I_BFD         / **/
 
 /* I_CRYPT:
  *     This symbol, if defined, indicates that <crypt.h> exists and
  *     should be included.
  */
-/*#define      I_CRYPT         / **/
+/*#define I_CRYPT               / **/
 
 /* DB_Prefix_t:
  *     This symbol contains the type of the prefix structure element
  *     This symbol, if defined, indicates that <fp.h> exists and
  *     should be included.
  */
-/*#define      I_FP            / **/
+/*#define I_FP          / **/
 
 /* I_FP_CLASS:
  *     This symbol, if defined, indicates that <fp_class.h> exists and
  *     should be included.
  */
-/*#define      I_FP_CLASS              / **/
+/*#define I_FP_CLASS            / **/
 
 /* I_IEEEFP:
  *     This symbol, if defined, indicates that <ieeefp.h> exists and
  *     should be included.
  */
-/*#define      I_IEEEFP                / **/
+/*#define I_IEEEFP              / **/
 
 /* I_INTTYPES:
  *     This symbol, if defined, indicates to the C program that it should
  *     This symbol, if defined, indicates that <langinfo.h> exists and
  *     should be included.
  */
-/*#define      I_LANGINFO              / **/
+/*#define I_LANGINFO            / **/
 
 /* I_LIBUTIL:
  *     This symbol, if defined, indicates that <libutil.h> exists and
  *     should be included.
  */
-/*#define      I_LIBUTIL               / **/
+/*#define I_LIBUTIL             / **/
 
 /* I_MALLOCMALLOC:
  *     This symbol, if defined, indicates to the C program that it should
  *     This symbol, if defined, indicates that <mntent.h> exists and
  *     should be included.
  */
-/*#define      I_MNTENT                / **/
+/*#define I_MNTENT              / **/
 
 /* I_NETINET_TCP:
  *     This symbol, if defined, indicates to the C program that it should
  *     This symbol, if defined, indicates that <poll.h> exists and
  *     should be included. (see also HAS_POLL)
  */
-/*#define      I_POLL          / **/
+/*#define I_POLL                / **/
 
 /* I_PROT:
  *     This symbol, if defined, indicates that <prot.h> exists and
  *     should be included.
  */
-/*#define      I_PROT          / **/
+/*#define I_PROT                / **/
 
 /* I_QUADMATH:
  *     This symbol, if defined, indicates that <quadmath.h> exists and
  *     should be included.
  */
-/*#define      I_QUADMATH              / **/
+/*#define I_QUADMATH            / **/
 
 /* I_SHADOW:
  *     This symbol, if defined, indicates that <shadow.h> exists and
  *     should be included.
  */
-/*#define      I_SHADOW                / **/
+/*#define I_SHADOW              / **/
 
 /* I_SOCKS:
  *     This symbol, if defined, indicates that <socks.h> exists and
  *     should be included.
  */
-/*#define      I_SOCKS         / **/
+/*#define I_SOCKS               / **/
 
 /* I_STDBOOL:
  *     This symbol, if defined, indicates that <stdbool.h> exists and
  *     can be included.
  */
-/*#define      I_STDBOOL               / **/
+/*#define I_STDBOOL             / **/
 
 /* I_STDINT:
  *     This symbol, if defined, indicates that <stdint.h> exists and
  *     This symbol, if defined, indicates that <sunmath.h> exists and
  *     should be included.
  */
-/*#define      I_SUNMATH               / **/
+/*#define I_SUNMATH             / **/
 
 /* I_SYSLOG:
  *     This symbol, if defined, indicates that <syslog.h> exists and
  *     should be included.
  */
-/*#define      I_SYSLOG                / **/
+/*#define I_SYSLOG              / **/
 
 /* I_SYSMODE:
  *     This symbol, if defined, indicates that <sys/mode.h> exists and
  *     should be included.
  */
-/*#define      I_SYSMODE               / **/
+/*#define I_SYSMODE             / **/
 
 /* I_SYS_MOUNT:
  *     This symbol, if defined, indicates that <sys/mount.h> exists and
  *     should be included.
  */
-/*#define      I_SYS_MOUNT             / **/
+/*#define I_SYS_MOUNT           / **/
 
 /* I_SYS_STATFS:
  *     This symbol, if defined, indicates that <sys/statfs.h> exists.
  */
-/*#define      I_SYS_STATFS            / **/
+/*#define I_SYS_STATFS          / **/
 
 /* I_SYS_STATVFS:
  *     This symbol, if defined, indicates that <sys/statvfs.h> exists and
  *     should be included.
  */
-/*#define      I_SYS_STATVFS           / **/
+/*#define I_SYS_STATVFS         / **/
 
 /* I_SYSUTSNAME:
  *     This symbol, if defined, indicates that <sys/utsname.h> exists and
  *     should be included.
  */
-/*#define      I_SYSUTSNAME            / **/
+/*#define I_SYSUTSNAME          / **/
 
 /* I_SYS_VFS:
  *     This symbol, if defined, indicates that <sys/vfs.h> exists and
  *     should be included.
  */
-/*#define      I_SYS_VFS               / **/
+/*#define I_SYS_VFS             / **/
 
 /* I_USTAT:
  *     This symbol, if defined, indicates that <ustat.h> exists and
  *     should be included.
  */
-/*#define      I_USTAT         / **/
+/*#define I_USTAT               / **/
 
 /* I_WCHAR:
  *     This symbol, if defined, indicates to the C program that <wchar.h>
 /* I_WCTYPE:
  *     This symbol, if defined, indicates that <wctype.h> exists.
  */
-/*#define      I_WCTYPE                / **/
+/*#define I_WCTYPE              / **/
 
 /* DOUBLEINFBYTES:
  *     This symbol, if defined, is a comma-separated list of
  *     of copying mechanisms, handy.h defines a platform-
  *     independent macro, Perl_va_copy(src, dst), to do the job.
  */
-/*#define      NEED_VA_COPY            / **/
+/*#define NEED_VA_COPY          / **/
 
 /* IVTYPE:
  *     This symbol defines the C type used for Perl's IV.
  *     This symbol, if defined, indicates that a variable of type NVTYPE
  *     stores 0.0 in memory as all bits zero.
  */
-#define        IVTYPE          __int64         /**/
-#define        UVTYPE          unsigned __int64                /**/
-#define        I8TYPE          char            /**/
-#define        U8TYPE          unsigned char           /**/
-#define        I16TYPE         short   /**/
-#define        U16TYPE         unsigned short  /**/
-#define        I32TYPE         long    /**/
-#define        U32TYPE         unsigned long   /**/
+#define IVTYPE          __int64         /**/
+#define UVTYPE          unsigned __int64                /**/
+#define I8TYPE          char            /**/
+#define U8TYPE          unsigned char           /**/
+#define I16TYPE         short   /**/
+#define U16TYPE         unsigned short  /**/
+#define I32TYPE         long    /**/
+#define U32TYPE         unsigned long   /**/
 #ifdef HAS_QUAD
-#define        I64TYPE         __int64 /**/
-#define        U64TYPE         unsigned __int64        /**/
+#define I64TYPE         __int64 /**/
+#define U64TYPE         unsigned __int64        /**/
 #endif
-#define        NVTYPE          double          /**/
-#define        IVSIZE          8               /**/
-#define        UVSIZE          8               /**/
-#define        I8SIZE          1               /**/
-#define        U8SIZE          1               /**/
-#define        I16SIZE         2       /**/
-#define        U16SIZE         2       /**/
-#define        I32SIZE         4       /**/
-#define        U32SIZE         4       /**/
+#define NVTYPE          double          /**/
+#define IVSIZE          8               /**/
+#define UVSIZE          8               /**/
+#define I8SIZE          1               /**/
+#define U8SIZE          1               /**/
+#define I16SIZE         2       /**/
+#define U16SIZE         2       /**/
+#define I32SIZE         4       /**/
+#define U32SIZE         4       /**/
 #ifdef HAS_QUAD
-#define        I64SIZE         8       /**/
-#define        U64SIZE         8       /**/
+#define I64SIZE         8       /**/
+#define U64SIZE         8       /**/
 #endif
-#define        NVSIZE          8               /**/
+#define NVSIZE          8               /**/
 #undef NV_PRESERVES_UV
-#define        NV_PRESERVES_UV_BITS    53
-#define        NV_OVERFLOWS_INTEGERS_AT        (256.0*256.0*256.0*256.0*256.0*256.0*2.0*2.0*2.0*2.0*2.0)
-#define        NV_ZERO_IS_ALLBITS_ZERO
+#define NV_PRESERVES_UV_BITS    53
+#define NV_OVERFLOWS_INTEGERS_AT        (256.0*256.0*256.0*256.0*256.0*256.0*2.0*2.0*2.0*2.0*2.0)
+#define NV_ZERO_IS_ALLBITS_ZERO
 #if UVSIZE == 8
 #   ifdef BYTEORDER
 #       if BYTEORDER == 0x1234
  *     This symbol defines the format string used for printing a Perl NV
  *     using %g-ish floating point format.
  */
-#define        IVdf            "I64d"          /**/
-#define        UVuf            "I64u"          /**/
-#define        UVof            "I64o"          /**/
-#define        UVxf            "I64x"          /**/
-#define        UVXf            "I64X"          /**/
-#define        NVef            "e"             /**/
-#define        NVff            "f"             /**/
-#define        NVgf            "g"             /**/
+/* I32df:
+ *     This symbol defines the format string used for printing a Perl I32
+ *     as a signed decimal integer.
+ */
+/* U32uf:
+ *     This symbol defines the format string used for printing a Perl U32
+ *     as an unsigned decimal integer.
+ */
+/* U32of:
+ *     This symbol defines the format string used for printing a Perl U32
+ *     as an unsigned octal integer.
+ */
+/* U32xf:
+ *     This symbol defines the format string used for printing a Perl U32
+ *     as an unsigned hexadecimal integer in lowercase abcdef.
+ */
+/* U32Xf:
+ *     This symbol defines the format string used for printing a Perl U32
+ *     as an unsigned hexadecimal integer in uppercase ABCDEF.
+ */
+#define IVdf            "I64d"          /**/
+#define UVuf            "I64u"          /**/
+#define UVof            "I64o"          /**/
+#define UVxf            "I64x"          /**/
+#define UVXf            "I64X"          /**/
+#define NVef            "e"             /**/
+#define NVff            "f"             /**/
+#define NVgf            "g"             /**/
+#define I32df           "ld"            /**/
+#define U32uf           "lu"            /**/
+#define U32of           "lo"            /**/
+#define U32xf           "lx"            /**/
+#define U32Xf           "lX"            /**/
 
 /* SELECT_MIN_BITS:
  *     This symbol holds the minimum number of bits operated by select.
  *     This symbol tells the name of the array holding the stdio streams.
  *     Usual values include _iob, __iob, and __sF.
  */
-/*#define      HAS_STDIO_STREAM_ARRAY  / **/
+/*#define HAS_STDIO_STREAM_ARRAY        / **/
 #ifdef HAS_STDIO_STREAM_ARRAY
 #define STDIO_STREAM_ARRAY     
 #endif
  *     you may need at least to reboot your OS to 64-bit mode.
  */
 #ifndef USE_64_BIT_INT
-#define        USE_64_BIT_INT          /**/
+#define USE_64_BIT_INT          /**/
 #endif
 #ifndef USE_64_BIT_ALL
-/*#define      USE_64_BIT_ALL          / **/
+/*#define USE_64_BIT_ALL                / **/
 #endif
 
 /* USE_C_BACKTRACE:
  *     Defaults to define in Perls 5.8 and earlier, to undef later.
  */
 #ifndef USE_FAST_STDIO
-/*#define      USE_FAST_STDIO          / **/
+/*#define USE_FAST_STDIO                / **/
 #endif
 
 /* USE_KERN_PROC_PATHNAME:
  *     should be used when available.
  */
 #ifndef USE_LARGE_FILES
-#define        USE_LARGE_FILES         /**/
+#define USE_LARGE_FILES         /**/
 #endif
 
 /* USE_LONG_DOUBLE:
  *     be used when available.
  */
 #ifndef USE_LONG_DOUBLE
-/*#define      USE_LONG_DOUBLE         / **/
+/*#define USE_LONG_DOUBLE               / **/
 #endif
 
 /* USE_MORE_BITS:
  *     long doubles should be used when available.
  */
 #ifndef USE_MORE_BITS
-/*#define      USE_MORE_BITS           / **/
+/*#define USE_MORE_BITS         / **/
 #endif
 
 /* MULTIPLICITY:
  *     be built to use multiplicity.
  */
 #ifndef MULTIPLICITY
-/*#define      MULTIPLICITY            / **/
+/*#define MULTIPLICITY          / **/
 #endif
 
 /* USE_NSGETEXECUTABLEPATH:
  *     used in a fully backward compatible manner.
  */
 #ifndef USE_PERLIO
-#define        USE_PERLIO              /**/
+#define USE_PERLIO              /**/
 #endif
 
 /* USE_QUADMATH:
  *     be used when available.
  */
 #ifndef USE_QUADMATH
-/*#define      USE_QUADMATH            / **/
+/*#define USE_QUADMATH          / **/
 #endif
 
 /* USE_SOCKS:
  *     be built to use socks.
  */
 #ifndef USE_SOCKS
-/*#define      USE_SOCKS               / **/
+/*#define USE_SOCKS             / **/
 #endif
 
 /* HAS_DRAND48_PROTO:
  *     to the program to supply one.  A good guess is
  *             extern double drand48(void);
  */
-/*#define      HAS_DRAND48_PROTO       / **/
+/*#define HAS_DRAND48_PROTO     / **/
 
 /* HAS_GETHOST_PROTOS:
  *     This symbol, if defined, indicates that <netdb.h> includes
  *     gethostbyaddr().  Otherwise, it is up to the program to guess
  *     them.  See netdbtype.U for probing for various Netdb_xxx_t types.
  */
-#define        HAS_GETHOST_PROTOS      /**/
+#define HAS_GETHOST_PROTOS      /**/
 
 /* HAS_GETNET_PROTOS:
  *     This symbol, if defined, indicates that <netdb.h> includes
  *     getnetbyaddr().  Otherwise, it is up to the program to guess
  *     them.  See netdbtype.U for probing for various Netdb_xxx_t types.
  */
-/*#define      HAS_GETNET_PROTOS       / **/
+/*#define HAS_GETNET_PROTOS     / **/
 
 /* HAS_GETPROTO_PROTOS:
  *     This symbol, if defined, indicates that <netdb.h> includes
  *     getprotobyaddr().  Otherwise, it is up to the program to guess
  *     them.  See netdbtype.U for probing for various Netdb_xxx_t types.
  */
-#define        HAS_GETPROTO_PROTOS     /**/
+#define HAS_GETPROTO_PROTOS     /**/
 
 /* HAS_GETSERV_PROTOS:
  *     This symbol, if defined, indicates that <netdb.h> includes
  *     getservbyaddr().  Otherwise, it is up to the program to guess
  *     them.  See netdbtype.U for probing for various Netdb_xxx_t types.
  */
-#define        HAS_GETSERV_PROTOS      /**/
+#define HAS_GETSERV_PROTOS      /**/
 
 /* HAS_LSEEK_PROTO:
  *     This symbol, if defined, indicates that the system provides
  *     to the program to supply one.  A good guess is
  *             extern off_t lseek(int, off_t, int);
  */
-#define        HAS_LSEEK_PROTO /**/
+#define HAS_LSEEK_PROTO /**/
 
 /* Netdb_host_t:
  *     This symbol holds the type used for the 1st argument
  *     try to use the various _r versions of library functions.
  *     This is extremely experimental.
  */
-/*#define      USE_ITHREADS            / **/
-/*#define              USE_THREADS             / **/
-/*#define      OLD_PTHREADS_API                / **/
-/*#define      USE_REENTRANT_API       / **/
+/*#define USE_ITHREADS          / **/
+/*#define       USE_THREADS             / **/
+/*#define OLD_PTHREADS_API              / **/
+/*#define USE_REENTRANT_API     / **/
 
 /* HAS_TIME:
  *     This symbol, if defined, indicates that the time() routine exists.
 /* Gid_t_f:
  *     This symbol defines the format string used for printing a Gid_t.
  */
-#define        Gid_t_f         "ld"            /**/
+#define Gid_t_f         "ld"            /**/
 
 /* Gid_t_sign:
  *     This symbol holds the signedness of a Gid_t.
 /* Uid_t_f:
  *     This symbol defines the format string used for printing a Uid_t.
  */
-#define        Uid_t_f         "ld"            /**/
+#define Uid_t_f         "ld"            /**/
 
 /* Uid_t_sign:
  *     This symbol holds the signedness of a Uid_t.
index f1d746e..4c6275d 100644 (file)
@@ -11,7 +11,32 @@ sub mungepath {
     $p =~ s/[ ;]+$//;
     $p =~ s/'/"/g;
     my @p = map { $_ = "\"$_\"" if /\s/ and !/^".*"$/; $_ } split /;/, $p;
-    return join(' ', @p);
+    return wantarray ? @p : join(' ', @p);
+}
+
+# check that the directories in the provided var exist
+sub check_path {
+    my $opt = shift;
+    my $p = shift;
+    my @paths = mungepath($p);
+    my $header_seen = 0;
+    foreach my $path (@paths) {
+        $path =~ s/^"(.*)"$/$1/;
+        next, if -d $path;
+
+        if (not $header_seen++) {
+            print STDERR "'$opt' contains the following non-existing paths:\n";
+        }
+        print STDERR "\t$path\n";
+    }
+    if ($header_seen) {
+        print STDERR <<EOF;
+Did you provide a correct value for the 'CCHOME' option?
+
+(This check can be skipped by using the SKIP_CCHOME_CHECK=1 option)
+EOF
+        exit 1;
+    }
 }
 
 # generate an array of option strings from command-line args
@@ -112,6 +137,11 @@ if (!$opt{cf_email}) {
 }
 $opt{usemymalloc} = 'y' if $opt{d_mymalloc} eq 'define';
 
+unless ($opt{SKIP_CCHOME_CHECK}) {
+    check_path('CCLIBDIR', $opt{libpth});
+    check_path('CCINCDIR', $opt{incpath});
+}
+
 $opt{libpth} = mungepath($opt{libpth}) if exists $opt{libpth};
 $opt{incpath} = mungepath($opt{incpath}) if exists $opt{incpath};
 
index 219f4f0..f2836ed 100644 (file)
@@ -4,7 +4,7 @@
 #include <errno.h>
 
 /* Eric Young.
- * This version of crypt has been developed from my MIT compatable
+ * This version of crypt has been developed from my MIT compatible
  * DES library.
  * The library is available at pub/DES at ftp.psy.uq.oz.au
  * eay@psych.psy.uq.oz.au
index 8f93fa0..185e7dd 100644 (file)
@@ -35,7 +35,7 @@ extern "C" {
 #endif
 
 #define PERL_BITS_PER_BYTE     8
-#define        PERL_NFDBITS            (sizeof(Perl_fd_mask)*PERL_BITS_PER_BYTE)
+#define PERL_NFDBITS            (sizeof(Perl_fd_mask)*PERL_BITS_PER_BYTE)
 
 typedef int                    Perl_fd_mask;
 
index 5ce4965..e6ef46f 100644 (file)
@@ -108,7 +108,7 @@ public:
     };
 
 /* IPerlMemParse */
-    /* Assume something else is using locks to mangaging serialize
+    /* Assume something else is using locks to manage serialization
        on a batch basis
      */
     inline void GetLockParse(void) { m_pVMemParse->GetLock(); };
index a8fe7af..64d9fdb 100644 (file)
@@ -34,7 +34,7 @@ EXTERN_C void boot_DynaLoader (pTHX_ CV* cv);
 static void
 xs_init(pTHX)
 {
-    char *file = __FILE__;
+    const char *file = __FILE__;
     dXSUB_SYS;
     newXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, file);
     /* other similar records will be included from "perllibst.h" */
@@ -180,6 +180,7 @@ RunPerl(int argc, char **argv, char **env)
     if (!(my_perl = perl_alloc()))
         return (1);
     perl_construct(my_perl);
+    PL_exit_flags |= PERL_EXIT_DESTRUCT_END;
     PL_perl_destruct_level = 0;
 
     /* PERL_SYS_INIT() may update the environment, e.g. via ansify_path().
@@ -247,7 +248,7 @@ DllMain(HINSTANCE hModule,  /* DLL module handle */
          * process termination or call to FreeLibrary.
          */
     case DLL_PROCESS_DETACH:
-        /* As long as we use TerminateProcess()/TerminateThread() etc. for mimicing kill()
+        /* As long as we use TerminateProcess()/TerminateThread() etc. for mimicking kill()
            anything here had better be harmless if:
             A. Not called at all.
             B. Called after memory allocation for Heap has been forcibly removed by OS.
index 628acb2..bb6e0e3 100644 (file)
@@ -72,6 +72,9 @@ POD = perl.pod        \
        perl5361delta.pod       \
        perl5362delta.pod       \
        perl5363delta.pod       \
+       perl5380delta.pod       \
+       perl5381delta.pod       \
+       perl5382delta.pod       \
        perl561delta.pod        \
        perl56delta.pod \
        perl581delta.pod        \
@@ -92,6 +95,8 @@ POD = perl.pod        \
        perlbot.pod     \
        perlcall.pod    \
        perlcheat.pod   \
+       perlclass.pod   \
+       perlclassguts.pod       \
        perlclib.pod    \
        perlcommunity.pod       \
        perldata.pod    \
@@ -242,6 +247,9 @@ MAN = perl.man      \
        perl5361delta.man       \
        perl5362delta.man       \
        perl5363delta.man       \
+       perl5380delta.man       \
+       perl5381delta.man       \
+       perl5382delta.man       \
        perl561delta.man        \
        perl56delta.man \
        perl581delta.man        \
@@ -262,6 +270,8 @@ MAN = perl.man      \
        perlbot.man     \
        perlcall.man    \
        perlcheat.man   \
+       perlclass.man   \
+       perlclassguts.man       \
        perlclib.man    \
        perlcommunity.man       \
        perldata.man    \
@@ -412,6 +422,9 @@ HTML = perl.html    \
        perl5361delta.html      \
        perl5362delta.html      \
        perl5363delta.html      \
+       perl5380delta.html      \
+       perl5381delta.html      \
+       perl5382delta.html      \
        perl561delta.html       \
        perl56delta.html        \
        perl581delta.html       \
@@ -432,6 +445,8 @@ HTML = perl.html    \
        perlbot.html    \
        perlcall.html   \
        perlcheat.html  \
+       perlclass.html  \
+       perlclassguts.html      \
        perlclib.html   \
        perlcommunity.html      \
        perldata.html   \
@@ -582,6 +597,9 @@ TEX = perl.tex      \
        perl5361delta.tex       \
        perl5362delta.tex       \
        perl5363delta.tex       \
+       perl5380delta.tex       \
+       perl5381delta.tex       \
+       perl5382delta.tex       \
        perl561delta.tex        \
        perl56delta.tex \
        perl581delta.tex        \
@@ -602,6 +620,8 @@ TEX = perl.tex      \
        perlbot.tex     \
        perlcall.tex    \
        perlcheat.tex   \
+       perlclass.tex   \
+       perlclassguts.tex       \
        perlclib.tex    \
        perlcommunity.tex       \
        perldata.tex    \
index bd765f6..c425ae1 100644 (file)
@@ -64,19 +64,37 @@ inline void MEMODSlx(char *str, long x)
 
 /* 
  * Pass all memory requests through to the compiler's msvcr*.dll.
- * Optionaly track by using a doubly linked header.
+ * Optionally track by using a doubly linked header.
  */
 
 #ifdef _USE_LINKED_LIST
 class VMem;
+
+/*
+ * Address an alignment issue with x64 mingw-w64 ports of gcc-12 and
+ * (presumably) later. We do the same thing again 16 lines further down.
+ * See https://github.com/Perl/perl5/issues/19824
+ */
+
+#if defined(__MINGW64__) && __GNUC__ > 11
+typedef struct _MemoryBlockHeader* PMEMORY_BLOCK_HEADER __attribute__ ((aligned(16)));
+#else
 typedef struct _MemoryBlockHeader* PMEMORY_BLOCK_HEADER;
+#endif
+
 typedef struct _MemoryBlockHeader {
     PMEMORY_BLOCK_HEADER    pNext;
     PMEMORY_BLOCK_HEADER    pPrev;
     VMem *owner;
+
+#if defined(__MINGW64__) && __GNUC__ > 11
+} MEMORY_BLOCK_HEADER __attribute__ ((aligned(16))), *PMEMORY_BLOCK_HEADER;
+#else
 } MEMORY_BLOCK_HEADER, *PMEMORY_BLOCK_HEADER;
 #endif
 
+#endif
+
 class VMem
 {
 public:
index 14dfa6a..5d54cf8 100644 (file)
@@ -38,6 +38,7 @@
 #include <io.h>
 #include <signal.h>
 #include <winioctl.h>
+#include <winternl.h>
 
 /* #include "config.h" */
 
@@ -72,7 +73,7 @@
 int _CRT_glob = 0;
 #endif
 
-#if defined(__MINGW32__) && (__MINGW32_MAJOR_VERSION==1)
+#if defined(__MINGW32__) && (__MINGW32_MAJOR_VERSION==1)       
 /* Mingw32-1.1 is missing some prototypes */
 START_EXTERN_C
 FILE * _wfopen(LPCWSTR wszFileName, LPCWSTR wszMode);
@@ -109,7 +110,7 @@ static char*        get_regstr(const char *valuename, SV **svp);
 #endif
 
 static char*   get_emd_part(SV **prev_pathp, STRLEN *const len,
-                        char *trailing, ...);
+                        const char *trailing, ...);
 static char*   win32_get_xlib(const char *pl,
                         WIN32_NO_REGISTRY_M_(const char *xlib)
                         const char *libname, STRLEN *const len);
@@ -156,9 +157,6 @@ static void translate_to_errno(void);
 START_EXTERN_C
 HANDLE w32_perldll_handle = INVALID_HANDLE_VALUE;
 char   w32_module_name[MAX_PATH+1];
-#ifdef WIN32_DYN_IOINFO_SIZE
-Size_t w32_ioinfo_size;/* avoid 0 extend op b4 mul, otherwise could be a U8 */
-#endif
 END_EXTERN_C
 
 static OSVERSIONINFO g_osver = {0, 0, 0, 0, 0, ""};
@@ -204,9 +202,9 @@ set_silent_invalid_parameter_handler(BOOL newvalue)
 
 static void
 my_invalid_parameter_handler(const wchar_t* expression,
-    const wchar_t* function,
-    const wchar_t* file,
-    unsigned int line,
+    const wchar_t* function, 
+    const wchar_t* file, 
+    unsigned int line, 
     uintptr_t pReserved)
 {
 #  ifdef _DEBUG
@@ -328,7 +326,7 @@ get_regstr(const char *valuename, SV **svp)
 
 /* *prev_pathp (if non-NULL) is expected to be POK (valid allocated SvPVX(sv)) */
 static char *
-get_emd_part(SV **prev_pathp, STRLEN *const len, char *trailing_path, ...)
+get_emd_part(SV **prev_pathp, STRLEN *const len, const char *trailing_path, ...)
 {
     char base[10];
     va_list ap;
@@ -396,7 +394,7 @@ get_emd_part(SV **prev_pathp, STRLEN *const len, char *trailing_path, ...)
 EXTERN_C char *
 win32_get_privlib(WIN32_NO_REGISTRY_M_(const char *pl) STRLEN *const len)
 {
-    char *stdlib = "lib";
+    const char *stdlib = "lib";
     SV *sv = NULL;
 #ifndef WIN32_NO_REGISTRY
     char buffer[MAX_PATH+1];
@@ -672,7 +670,7 @@ get_shell(void)
 int
 Perl_do_aspawn(pTHX_ SV *really, SV **mark, SV **sp)
 {
-    char **argv;
+    const char **argv;
     char *str;
     int status;
     int flag = P_WAIT;
@@ -687,7 +685,7 @@ Perl_do_aspawn(pTHX_ SV *really, SV **mark, SV **sp)
     if (get_shell() < 0)
         return -1;
 
-    Newx(argv, (sp - mark) + w32_perlshell_items + 2, char*);
+    Newx(argv, (sp - mark) + w32_perlshell_items + 2, const char*);
 
     if (SvNIOKp(*(mark+1)) && !SvPOKp(*(mark+1))) {
         ++mark;
@@ -1066,7 +1064,12 @@ win32_telldir(DIR *dirp)
 DllExport void
 win32_seekdir(DIR *dirp, long loc)
 {
-    dirp->curr = loc == -1 ? NULL : dirp->start + loc;
+    /* Ensure dirp->curr remains within `dirp->start` buffer. */
+    if (loc >= 0 && dirp->end - dirp->start > (ptrdiff_t) loc) {
+        dirp->curr = dirp->start + loc;
+    } else {
+        dirp->curr = NULL;
+    }
 }
 
 /* Rewinddir resets the string pointer to the start */
@@ -1519,35 +1522,102 @@ win32_kill(int pid, int sig)
 PERL_STATIC_INLINE
 time_t
 translate_ft_to_time_t(FILETIME ft) {
-    SYSTEMTIME st, local_st;
+    SYSTEMTIME st;
     struct tm pt;
+    time_t retval;
+    dTHX;
 
-    if (!FileTimeToSystemTime(&ft, &st) ||
-        !SystemTimeToTzSpecificLocalTime(NULL, &st, &local_st)) {
+    if (!FileTimeToSystemTime(&ft, &st))
         return -1;
-    }
 
     Zero(&pt, 1, struct tm);
-    pt.tm_year = local_st.wYear - 1900;
-    pt.tm_mon = local_st.wMonth - 1;
-    pt.tm_mday = local_st.wDay;
-    pt.tm_hour = local_st.wHour;
-    pt.tm_min = local_st.wMinute;
-    pt.tm_sec = local_st.wSecond;
-    pt.tm_isdst = -1;
+    pt.tm_year = st.wYear - 1900;
+    pt.tm_mon = st.wMonth - 1;
+    pt.tm_mday = st.wDay;
+    pt.tm_hour = st.wHour;
+    pt.tm_min = st.wMinute;
+    pt.tm_sec = st.wSecond;
+
+    MKTIME_LOCK;
+    retval = _mkgmtime(&pt);
+    MKTIME_UNLOCK;
 
-    return mktime(&pt);
+    return retval;
 }
 
 typedef DWORD (__stdcall *pGetFinalPathNameByHandleA_t)(HANDLE, LPSTR, DWORD, DWORD);
 
+/* Adapted from:
+
+https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/ns-ntifs-_reparse_data_buffer
+
+Renamed to avoid conflicts, apparently some SDKs define this
+structure.
+
+Hoisted the symlink and mount point data into a new type to allow us
+to make a pointer to it, and to avoid C++ scoping issues.
+
+*/
+
+typedef struct {
+    USHORT SubstituteNameOffset;
+    USHORT SubstituteNameLength;
+    USHORT PrintNameOffset;
+    USHORT PrintNameLength;
+    ULONG  Flags;
+    WCHAR  PathBuffer[MAX_PATH*3];
+} MY_SYMLINK_REPARSE_BUFFER, *PMY_SYMLINK_REPARSE_BUFFER;
+
+typedef struct {
+    USHORT SubstituteNameOffset;
+    USHORT SubstituteNameLength;
+    USHORT PrintNameOffset;
+    USHORT PrintNameLength;
+    WCHAR  PathBuffer[MAX_PATH*3];
+} MY_MOUNT_POINT_REPARSE_BUFFER;
+
+typedef struct {
+  ULONG  ReparseTag;
+  USHORT ReparseDataLength;
+  USHORT Reserved;
+  union {
+    MY_SYMLINK_REPARSE_BUFFER SymbolicLinkReparseBuffer;
+    MY_MOUNT_POINT_REPARSE_BUFFER MountPointReparseBuffer;
+    struct {
+      UCHAR DataBuffer[1];
+    } GenericReparseBuffer;
+  } Data;
+} MY_REPARSE_DATA_BUFFER, *PMY_REPARSE_DATA_BUFFER;
+
+#ifndef IO_REPARSE_TAG_SYMLINK
+#  define IO_REPARSE_TAG_SYMLINK                  (0xA000000CL)
+#endif
+#ifndef IO_REPARSE_TAG_AF_UNIX
+#  define IO_REPARSE_TAG_AF_UNIX 0x80000023
+#endif
+#ifndef IO_REPARSE_TAG_LX_FIFO
+#  define IO_REPARSE_TAG_LX_FIFO 0x80000024
+#endif
+#ifndef IO_REPARSE_TAG_LX_CHR
+#  define IO_REPARSE_TAG_LX_CHR  0x80000025
+#endif
+#ifndef IO_REPARSE_TAG_LX_BLK
+#  define IO_REPARSE_TAG_LX_BLK  0x80000026
+#endif
+
 static int
-win32_stat_low(HANDLE handle, const char *path, STRLEN len, Stat_t *sbuf) {
+win32_stat_low(HANDLE handle, const char *path, STRLEN len, Stat_t *sbuf,
+               DWORD reparse_type) {
     DWORD type = GetFileType(handle);
     BY_HANDLE_FILE_INFORMATION bhi;
 
     Zero(sbuf, 1, Stat_t);
 
+    if (reparse_type) {
+        /* Lie to get to the right place */
+        type = FILE_TYPE_DISK;
+    }
+
     type &= ~FILE_TYPE_REMOTE;
 
     switch (type) {
@@ -1571,7 +1641,35 @@ win32_stat_low(HANDLE handle, const char *path, STRLEN len, Stat_t *sbuf) {
             sbuf->st_mtime = translate_ft_to_time_t(bhi.ftLastWriteTime);
             sbuf->st_ctime = translate_ft_to_time_t(bhi.ftCreationTime);
 
-            if (bhi.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
+            if (reparse_type) {
+                /* https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-fscc/c8e77b37-3909-4fe6-a4ea-2b9d423b1ee4
+                   describes all of these as WSL only, but the AF_UNIX tag
+                   is known to be used for AF_UNIX sockets without WSL.
+                */
+                switch (reparse_type) {
+                case IO_REPARSE_TAG_AF_UNIX:
+                    sbuf->st_mode = _S_IFSOCK;
+                    break;
+
+                case IO_REPARSE_TAG_LX_FIFO:
+                    sbuf->st_mode = _S_IFIFO;
+                    break;
+
+                case IO_REPARSE_TAG_LX_CHR:
+                    sbuf->st_mode = _S_IFCHR;
+                    break;
+
+                case IO_REPARSE_TAG_LX_BLK:
+                    sbuf->st_mode = _S_IFBLK;
+                    break;
+
+                default:
+                    /* Is there anything else we can do here? */
+                    errno = EINVAL;
+                    return -1;
+                }
+            }
+            else if (bhi.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
                 sbuf->st_mode = _S_IFDIR | _S_IREAD | _S_IEXEC;
                 /* duplicate the logic from the end of the old win32_stat() */
                 if (!(bhi.dwFileAttributes & FILE_ATTRIBUTE_READONLY)) {
@@ -1638,6 +1736,122 @@ win32_stat_low(HANDLE handle, const char *path, STRLEN len, Stat_t *sbuf) {
     return 0;
 }
 
+/* https://docs.microsoft.com/en-us/windows/win32/fileio/reparse-points */
+#define SYMLINK_FOLLOW_LIMIT 63
+
+/*
+
+Given a pathname, required to be a symlink, follow it until we find a
+non-symlink path.
+
+This should only be called when the symlink() chain doesn't lead to a
+normal file, which should have been caught earlier.
+
+On success, returns a HANDLE to the target and sets *reparse_type to
+the ReparseTag of the target.
+
+Returns INVALID_HANDLE_VALUE on error, which might be that the symlink
+chain is broken, or requires too many links to resolve.
+
+*/
+
+static HANDLE
+S_follow_symlinks_to(pTHX_ const char *pathname, DWORD *reparse_type) {
+    char link_target[MAX_PATH];
+    SV *work_path = newSVpvn(pathname, strlen(pathname));
+    int link_count = 0;
+    int link_len;
+    HANDLE handle;
+
+    *reparse_type = 0;
+
+    while ((link_len = win32_readlink(SvPVX(work_path), link_target,
+                                      sizeof(link_target))) > 0) {
+        if (link_count++ >= SYMLINK_FOLLOW_LIMIT) {
+            /* Windows doesn't appear to ever return ELOOP,
+               let's do better ourselves
+            */
+            SvREFCNT_dec(work_path);
+            errno = ELOOP;
+            return INVALID_HANDLE_VALUE;
+        }
+        /* Adjust the linktarget based on the link source or current
+           directory as needed.
+        */
+        if (link_target[0] == '\\'
+            || link_target[0] == '/'
+            || (link_len >=2 && link_target[1] == ':')) {
+            /* link is absolute */
+            sv_setpvn(work_path, link_target, link_len);
+        }
+        else {
+            STRLEN work_len;
+            const char *workp = SvPV(work_path, work_len);
+            const char *final_bslash =
+                (const char *)my_memrchr(workp, '\\', work_len);
+            const char *final_slash =
+                (const char *)my_memrchr(workp, '/', work_len);
+            const char *path_sep = NULL;
+            if (final_bslash && final_slash)
+                path_sep = final_bslash > final_slash ? final_bslash : final_slash;
+            else if (final_bslash)
+                path_sep = final_bslash;
+            else if (final_slash)
+                path_sep = final_slash;
+
+            if (path_sep) {
+                SV *new_path = newSVpv(workp, path_sep - workp + 1);
+                sv_catpvn(new_path, link_target, link_len);
+                SvREFCNT_dec(work_path);
+                work_path = new_path;
+            }
+            else {
+                /* should only get here the first time around */
+                assert(link_count == 1);
+                char path_temp[MAX_PATH];
+                DWORD path_len = GetCurrentDirectoryA(sizeof(path_temp), path_temp);
+                if (!path_len || path_len > sizeof(path_temp)) {
+                    SvREFCNT_dec(work_path);
+                    errno = EINVAL;
+                    return INVALID_HANDLE_VALUE;
+                }
+
+                SV *new_path = newSVpvn(path_temp, path_len);
+                if (path_temp[path_len-1] != '\\') {
+                    sv_catpvs(new_path, "\\");
+                }
+                sv_catpvn(new_path, link_target, link_len);
+                SvREFCNT_dec(work_path);
+                work_path = new_path;
+            }
+        }
+    }
+
+    handle =
+        CreateFileA(SvPVX(work_path), GENERIC_READ, 0, NULL, OPEN_EXISTING,
+                    FILE_FLAG_OPEN_REPARSE_POINT|FILE_FLAG_BACKUP_SEMANTICS, 0);
+    SvREFCNT_dec(work_path);
+    if (handle != INVALID_HANDLE_VALUE) {
+        MY_REPARSE_DATA_BUFFER linkdata;
+        DWORD linkdata_returned;
+
+        if (!DeviceIoControl(handle, FSCTL_GET_REPARSE_POINT, NULL, 0,
+                             &linkdata, sizeof(linkdata),
+                             &linkdata_returned, NULL)) {
+            translate_to_errno();
+            CloseHandle(handle);
+            return INVALID_HANDLE_VALUE;
+        }
+        *reparse_type = linkdata.ReparseTag;
+        return handle;
+    }
+    else {
+        translate_to_errno();
+    }
+
+    return handle;
+}
+
 DllExport int
 win32_stat(const char *path, Stat_t *sbuf)
 {
@@ -1645,6 +1859,7 @@ win32_stat(const char *path, Stat_t *sbuf)
     BOOL        expect_dir = FALSE;
     int result;
     HANDLE handle;
+    DWORD reparse_type = 0;
 
     path = PerlDir_mapA(path);
 
@@ -1652,8 +1867,21 @@ win32_stat(const char *path, Stat_t *sbuf)
         CreateFileA(path, FILE_READ_ATTRIBUTES,
                     FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE,
                     NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
+    if (handle == INVALID_HANDLE_VALUE) {
+        /* AF_UNIX sockets need to be opened as a reparse point, but
+           that will also open symlinks rather than following them.
+
+           There may be other reparse points that need similar
+           treatment.
+        */
+        handle = S_follow_symlinks_to(aTHX_ path, &reparse_type);
+        if (handle == INVALID_HANDLE_VALUE) {
+            /* S_follow_symlinks_to() will set errno */
+            return -1;
+        }
+    }
     if (handle != INVALID_HANDLE_VALUE) {
-        result = win32_stat_low(handle, path, strlen(path), sbuf);
+        result = win32_stat_low(handle, path, strlen(path), sbuf, reparse_type);
         CloseHandle(handle);
     }
     else {
@@ -1706,52 +1934,6 @@ translate_to_errno(void)
     }
 }
 
-/* Adapted from:
-
-https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/ns-ntifs-_reparse_data_buffer
-
-Renamed to avoid conflicts, apparently some SDKs define this
-structure.
-
-Hoisted the symlink and mount point data into a new type to allow us
-to make a pointer to it, and to avoid C++ scoping issues.
-
-*/
-
-typedef struct {
-    USHORT SubstituteNameOffset;
-    USHORT SubstituteNameLength;
-    USHORT PrintNameOffset;
-    USHORT PrintNameLength;
-    ULONG  Flags;
-    WCHAR  PathBuffer[MAX_PATH*3];
-} MY_SYMLINK_REPARSE_BUFFER, *PMY_SYMLINK_REPARSE_BUFFER;
-
-typedef struct {
-    USHORT SubstituteNameOffset;
-    USHORT SubstituteNameLength;
-    USHORT PrintNameOffset;
-    USHORT PrintNameLength;
-    WCHAR  PathBuffer[MAX_PATH*3];
-} MY_MOUNT_POINT_REPARSE_BUFFER;
-
-typedef struct {
-  ULONG  ReparseTag;
-  USHORT ReparseDataLength;
-  USHORT Reserved;
-  union {
-    MY_SYMLINK_REPARSE_BUFFER SymbolicLinkReparseBuffer;
-    MY_MOUNT_POINT_REPARSE_BUFFER MountPointReparseBuffer;
-    struct {
-      UCHAR DataBuffer[1];
-    } GenericReparseBuffer;
-  } Data;
-} MY_REPARSE_DATA_BUFFER, *PMY_REPARSE_DATA_BUFFER;
-
-#ifndef IO_REPARSE_TAG_SYMLINK
-#  define IO_REPARSE_TAG_SYMLINK                  (0xA000000CL)
-#endif
-
 static BOOL
 is_symlink(HANDLE h) {
     MY_REPARSE_DATA_BUFFER linkdata;
@@ -1788,41 +1970,21 @@ is_symlink_name(const char *name) {
     return result;
 }
 
-DllExport int
-win32_readlink(const char *pathname, char *buf, size_t bufsiz) {
+static int
+do_readlink_handle(HANDLE hlink, char *buf, size_t bufsiz, bool *is_symlink) {
     MY_REPARSE_DATA_BUFFER linkdata;
-    HANDLE hlink;
-    DWORD fileattr = GetFileAttributes(pathname);
     DWORD linkdata_returned;
-    int bytes_out;
-    BOOL used_default;
-
-    if (fileattr == INVALID_FILE_ATTRIBUTES) {
-        translate_to_errno();
-        return -1;
-    }
 
-    if (!(fileattr & FILE_ATTRIBUTE_REPARSE_POINT)) {
-        /* not a symbolic link */
-        errno = EINVAL;
-        return -1;
-    }
-
-    hlink =
-        CreateFileA(pathname, GENERIC_READ, 0, NULL, OPEN_EXISTING,
-                    FILE_FLAG_OPEN_REPARSE_POINT|FILE_FLAG_BACKUP_SEMANTICS, 0);
-    if (hlink == INVALID_HANDLE_VALUE) {
-        translate_to_errno();
-        return -1;
-    }
+    if (is_symlink)
+        *is_symlink = FALSE;
 
     if (!DeviceIoControl(hlink, FSCTL_GET_REPARSE_POINT, NULL, 0, &linkdata, sizeof(linkdata), &linkdata_returned, NULL)) {
         translate_to_errno();
-        CloseHandle(hlink);
         return -1;
     }
-    CloseHandle(hlink);
 
+    int bytes_out;
+    BOOL used_default;
     switch (linkdata.ReparseTag) {
     case IO_REPARSE_TAG_SYMLINK:
         {
@@ -1834,9 +1996,11 @@ win32_readlink(const char *pathname, char *buf, size_t bufsiz) {
             }
             bytes_out =
                 WideCharToMultiByte(CP_ACP, WC_NO_BEST_FIT_CHARS,
-                                    sd->PathBuffer + sd->SubstituteNameOffset/2,
-                                    sd->SubstituteNameLength/2,
+                                    sd->PathBuffer + sd->PrintNameOffset/2,
+                                    sd->PrintNameLength/2,
                                     buf, (int)bufsiz, NULL, &used_default);
+            if (is_symlink)
+                *is_symlink = TRUE;
         }
         break;
     case IO_REPARSE_TAG_MOUNT_POINT:
@@ -1849,9 +2013,11 @@ win32_readlink(const char *pathname, char *buf, size_t bufsiz) {
             }
             bytes_out =
                 WideCharToMultiByte(CP_ACP, WC_NO_BEST_FIT_CHARS,
-                                    rd->PathBuffer + rd->SubstituteNameOffset/2,
-                                    rd->SubstituteNameLength/2,
+                                    rd->PathBuffer + rd->PrintNameOffset/2,
+                                    rd->PrintNameLength/2,
                                     buf, (int)bufsiz, NULL, &used_default);
+            if (is_symlink)
+                *is_symlink = TRUE;
         }
         break;
 
@@ -1865,6 +2031,47 @@ win32_readlink(const char *pathname, char *buf, size_t bufsiz) {
         errno = EINVAL;
         return -1;
     }
+
+    return bytes_out;
+}
+
+DllExport int
+win32_readlink(const char *pathname, char *buf, size_t bufsiz) {
+    if (pathname == NULL || buf == NULL) {
+        errno = EFAULT;
+        return -1;
+    }
+    if (bufsiz <= 0) {
+        errno = EINVAL;
+        return -1;
+    }
+
+    DWORD fileattr = GetFileAttributes(pathname);
+    if (fileattr == INVALID_FILE_ATTRIBUTES) {
+        translate_to_errno();
+        return -1;
+    }
+
+    if (!(fileattr & FILE_ATTRIBUTE_REPARSE_POINT)) {
+        /* not a symbolic link */
+        errno = EINVAL;
+        return -1;
+    }
+
+    HANDLE hlink =
+        CreateFileA(pathname, GENERIC_READ, 0, NULL, OPEN_EXISTING,
+                    FILE_FLAG_OPEN_REPARSE_POINT|FILE_FLAG_BACKUP_SEMANTICS, 0);
+    if (hlink == INVALID_HANDLE_VALUE) {
+        translate_to_errno();
+        return -1;
+    }
+    int bytes_out = do_readlink_handle(hlink, buf, bufsiz, NULL);
+    CloseHandle(hlink);
+    if (bytes_out < 0) {
+        /* errno already set */
+        return -1;
+    }
+
     if ((size_t)bytes_out > bufsiz) {
         errno = EINVAL;
         return -1;
@@ -1895,18 +2102,25 @@ win32_lstat(const char *path, Stat_t *sbuf)
         translate_to_errno();
         return -1;
     }
-
-    if (!is_symlink(f)) {
+    bool is_symlink;
+    int size = do_readlink_handle(f, NULL, 0, &is_symlink);
+    if (!is_symlink) {
+        /* it isn't a symlink, fallback to normal stat */
         CloseHandle(f);
         return win32_stat(path, sbuf);
     }
-
-    result = win32_stat_low(f, NULL, 0, sbuf);
-    CloseHandle(f);
+    else if (size < 0) {
+        /* some other error, errno already set */
+        CloseHandle(f);
+        return -1;
+    }
+    result = win32_stat_low(f, NULL, 0, sbuf, 0);
 
     if (result != -1){
         sbuf->st_mode = (sbuf->st_mode & ~_S_IFMT) | _S_IFLNK;
+        sbuf->st_size = size;
     }
+    CloseHandle(f);
 
     return result;
 }
@@ -2119,14 +2333,14 @@ win32_getenvironmentstrings(void)
     }
 
     /* Get the number of bytes required to store the ACP encoded string */
-    aenvstrings_len = WideCharToMultiByte(CP_ACP, WC_NO_BEST_FIT_CHARS,
+    aenvstrings_len = WideCharToMultiByte(CP_ACP, WC_NO_BEST_FIT_CHARS, 
                                           lpWStr, wenvstrings_len, NULL, 0, NULL, NULL);
     lpTmp = lpStr = (char *)win32_calloc(aenvstrings_len, sizeof(char));
     if(!lpTmp)
         out_of_memory();
 
     /* Convert the string from UTF-16 encoding to ACP encoding */
-    WideCharToMultiByte(CP_ACP, WC_NO_BEST_FIT_CHARS, lpWStr, wenvstrings_len, lpStr,
+    WideCharToMultiByte(CP_ACP, WC_NO_BEST_FIT_CHARS, lpWStr, wenvstrings_len, lpStr, 
                         aenvstrings_len, NULL, NULL);
 
     FreeEnvironmentStringsW(lpWStr);
@@ -2268,12 +2482,14 @@ filetime_from_time(PFILETIME pFileTime, time_t Time)
 {
     struct tm *pt;
     SYSTEMTIME st;
+    dTHX;
 
+    GMTIME_LOCK;
     pt = gmtime(&Time);
     if (!pt) {
+        GMTIME_UNLOCK;
         pFileTime->dwLowDateTime = 0;
         pFileTime->dwHighDateTime = 0;
-        fprintf(stderr, "fail bad gmtime\n");
         return FALSE;
     }
 
@@ -2285,6 +2501,8 @@ filetime_from_time(PFILETIME pFileTime, time_t Time)
     st.wSecond = pt->tm_sec;
     st.wMilliseconds = 0;
 
+    GMTIME_UNLOCK;
+
     if (!SystemTimeToFileTime(&st, pFileTime)) {
         pFileTime->dwLowDateTime = 0;
         pFileTime->dwHighDateTime = 0;
@@ -2456,7 +2674,7 @@ win32_uname(struct utsname *name)
     {
         SYSTEM_INFO info;
         DWORD procarch;
-        char *arch;
+        const char *arch;
         GetSystemInfo(&info);
 
 #if (defined(__MINGW32__) && !defined(_ANONYMOUS_UNION) && !defined(__MINGW_EXTENSION))
@@ -2487,7 +2705,7 @@ win32_uname(struct utsname *name)
 /* Timing related stuff */
 
 int
-do_raise(pTHX_ int sig)
+do_raise(pTHX_ int sig) 
 {
     if (sig < SIG_SIZE) {
         Sighandler_t handler = w32_sighandler[sig];
@@ -2523,8 +2741,8 @@ void
 sig_terminate(pTHX_ int sig)
 {
     Perl_warn(aTHX_ "Terminating on signal SIG%s(%d)\n",PL_sig_name[sig], sig);
-    /* exit() seems to be safe, my_exit() or die() is a problem in ^C
-       thread
+    /* exit() seems to be safe, my_exit() or die() is a problem in ^C 
+       thread 
      */
     exit(sig);
 }
@@ -2535,7 +2753,7 @@ win32_async_check(pTHX)
     MSG msg;
     HWND hwnd = w32_message_hwnd;
 
-    /* Reset w32_poll_count before doing anything else, incase we dispatch
+    /* Reset w32_poll_count before doing anything else, in case we dispatch
      * messages that end up calling back into perl */
     w32_poll_count = 0;
 
@@ -2575,7 +2793,7 @@ win32_async_check(pTHX)
     /* Above or other stuff may have set a signal flag */
     if (PL_sig_pending)
         despatch_signals();
-
+    
     return 1;
 }
 
@@ -2819,7 +3037,7 @@ DllExport unsigned int
 win32_alarm(unsigned int sec)
 {
     /*
-     * the 'obvious' implentation is SetTimer() with a callback
+     * the 'obvious' implementation is SetTimer() with a callback
      * which does whatever receiving SIGALRM would do
      * we cannot use SIGALRM even via raise() as it is not
      * one of the supported codes in <signal.h>
@@ -3145,11 +3363,7 @@ win32_freopen(const char *path, const char *mode, FILE *stream)
 DllExport int
 win32_fclose(FILE *pf)
 {
-#ifdef WIN32_NO_SOCKETS
     return fclose(pf);
-#else
-    return my_fclose(pf);      /* defined in win32sck.c */
-#endif
 }
 
 DllExport int
@@ -3306,7 +3520,7 @@ win32_fstat(int fd, Stat_t *sbufptr)
 {
     HANDLE handle = (HANDLE)win32_get_osfhandle(fd);
 
-    return win32_stat_low(handle, NULL, 0, sbufptr);
+    return win32_stat_low(handle, NULL, 0, sbufptr, 0);
 }
 
 DllExport int
@@ -3543,6 +3757,24 @@ win32_symlink(const char *oldfile, const char *newfile)
     */
     newfile = PerlDir_mapA(newfile);
 
+    if (strchr(oldfile, '/')) {
+        /* Win32 (or perhaps NTFS) won't follow symlinks containing
+           /, so replace any with \\
+        */
+        char *temp = savepv(oldfile);
+        SAVEFREEPV(temp);
+        char *p = temp;
+        while (*p) {
+            if (*p == '/') {
+                *p = '\\';
+            }
+            ++p;
+        }
+        *p = 0;
+        oldfile = temp;
+        oldfile_len = p - temp;
+    }
+
     /* are we linking to a directory?
        CreateSymlinkA() needs to know if the target is a directory,
        If it looks like a directory name:
@@ -3560,7 +3792,6 @@ win32_symlink(const char *oldfile, const char *newfile)
         strEQ(oldfile, ".") ||
         (isSLASH(oldfile[oldfile_len-2]) && oldfile[oldfile_len-1] == '.') ||
         strEQ(oldfile+oldfile_len-3, "\\..") ||
-        strEQ(oldfile+oldfile_len-3, "/..") ||
         (oldfile_len == 2 && oldfile[1] == ':')) {
         create_flags |= SYMBOLIC_LINK_FLAG_DIRECTORY;
     }
@@ -3569,15 +3800,15 @@ win32_symlink(const char *oldfile, const char *newfile)
         const char *dest_path = oldfile;
         char szTargetName[MAX_PATH+1];
 
-        if (oldfile_len >= 3 && oldfile[1] == ':' && oldfile[2] != '\\' && oldfile[2] != '/') {
-            /* relative to current directory on a drive */
+        if (oldfile_len >= 3 && oldfile[1] == ':') {
+            /* relative to current directory on a drive, or absolute */
             /* dest_path = oldfile; already done */
         }
-        else if (oldfile[0] != '\\' && oldfile[0] != '/') {
+        else if (oldfile[0] != '\\') {
             size_t newfile_len = strlen(newfile);
-            char *last_slash = strrchr(newfile, '/');
-            char *last_bslash = strrchr(newfile, '\\');
-            char *end_dir = last_slash && last_bslash
+            const char *last_slash = strrchr(newfile, '/');
+            const char *last_bslash = strrchr(newfile, '\\');
+            const char *end_dir = last_slash && last_bslash
                 ? ( last_slash > last_bslash ? last_slash : last_bslash)
                 : last_slash ? last_slash : last_bslash ? last_bslash : NULL;
 
@@ -3733,17 +3964,10 @@ win32_open(const char *path, int flag, ...)
     return open(PerlDir_mapA(path), flag, pmode);
 }
 
-/* close() that understands socket */
-extern int my_close(int);      /* in win32sck.c */
-
 DllExport int
 win32_close(int fd)
 {
-#ifdef WIN32_NO_SOCKETS
-    return close(fd);
-#else
-    return my_close(fd);
-#endif
+    return _close(fd);
 }
 
 DllExport int
@@ -3900,7 +4124,7 @@ win32_read(int fd, void *buf, unsigned int cnt)
     int ret;
     if (UNLIKELY(win32_isatty(fd) && GetConsoleCP() == 65001)) {
         MUTEX_LOCK(&win32_read_console_mutex);
-        ret = win32_read_console(fd, buf, cnt);
+        ret = win32_read_console(fd, (U8 *)buf, cnt);
         MUTEX_UNLOCK(&win32_read_console_mutex);
     }
     else
@@ -4809,7 +5033,7 @@ void
 Perl_init_os_extras(void)
 {
     dTHXa(NULL);
-    char *file = __FILE__;
+    const char *file = __FILE__;
 
     /* Initialize Win32CORE if it has been statically linked. */
 #ifndef PERL_IS_MINIPERL
@@ -4996,6 +5220,197 @@ ansify_path(void)
     win32_free(wide_path);
 }
 
+/* This hooks a function that is imported by the specified module. The hook is
+ * local to that module. */
+static bool
+win32_hook_imported_function_in_module(
+    HMODULE module, LPCSTR fun_name, FARPROC hook_ptr
+)
+{
+    ULONG_PTR image_base = (ULONG_PTR)module;
+    PIMAGE_DOS_HEADER dos_header = (PIMAGE_DOS_HEADER)image_base;
+    PIMAGE_NT_HEADERS nt_headers
+        = (PIMAGE_NT_HEADERS)(image_base + dos_header->e_lfanew);
+    PIMAGE_OPTIONAL_HEADER opt_header = &nt_headers->OptionalHeader;
+
+    PIMAGE_DATA_DIRECTORY data_dir = opt_header->DataDirectory;
+    DWORD data_dir_len = opt_header->NumberOfRvaAndSizes;
+
+    BOOL is_idt_present = data_dir_len > IMAGE_DIRECTORY_ENTRY_IMPORT
+        && data_dir[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress != 0;
+
+    if (!is_idt_present)
+        return FALSE;
+
+    BOOL found = FALSE;
+
+    /* Import Directory Table */
+    PIMAGE_IMPORT_DESCRIPTOR idt = (PIMAGE_IMPORT_DESCRIPTOR)(
+        image_base + data_dir[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress
+    );
+
+    for (; idt->Name != 0; ++idt) {
+        /* Import Lookup Table */
+        PIMAGE_THUNK_DATA ilt
+            = (PIMAGE_THUNK_DATA)(image_base + idt->OriginalFirstThunk);
+        /* Import Address Table */
+        PIMAGE_THUNK_DATA iat
+            = (PIMAGE_THUNK_DATA)(image_base + idt->FirstThunk);
+
+        ULONG_PTR address_of_data;
+        for (; address_of_data = ilt->u1.AddressOfData; ++ilt, ++iat) {
+            /* Ordinal imports are quite rare, so skipping them will most likely
+             * not cause any problems. */
+            BOOL is_ordinal
+                = address_of_data >> ((sizeof(address_of_data) * 8) - 1);
+
+            if (is_ordinal)
+                continue;
+
+            LPCSTR name = (
+                (PIMAGE_IMPORT_BY_NAME)(image_base + address_of_data)
+            )->Name;
+
+            if (strEQ(name, fun_name)) {
+                DWORD old_protect = 0;
+                BOOL succ = VirtualProtect(
+                    &iat->u1.Function, sizeof(iat->u1.Function), PAGE_READWRITE,
+                    &old_protect
+                );
+                if (!succ)
+                    return FALSE;
+
+                iat->u1.Function = (ULONG_PTR)hook_ptr;
+                found = TRUE;
+
+                VirtualProtect(
+                    &iat->u1.Function, sizeof(iat->u1.Function), old_protect,
+                    &old_protect
+                );
+                break;
+            }
+        }
+    }
+
+    return found;
+}
+
+typedef NTSTATUS (NTAPI *pNtQueryInformationFile_t)(HANDLE, PIO_STATUS_BLOCK, PVOID, ULONG, ULONG);
+pNtQueryInformationFile_t pNtQueryInformationFile = NULL;
+
+typedef BOOL (WINAPI *pCloseHandle)(HANDLE h);
+static pCloseHandle CloseHandle_orig;
+
+/* CloseHandle() that supports sockets. CRT uses mutexes during file operations,
+ * so the lack of thread safety in this function isn't a problem. */
+static BOOL WINAPI
+my_CloseHandle(HANDLE h)
+{
+    /* In theory, passing a non-socket handle to closesocket() is fine. It
+     * should return a WSAENOTSOCK error, which is easy to recover from.
+     * However, we should avoid doing that because it's not that simple in
+     * practice. For instance, it can deadlock on a handle to a stuck pipe (see:
+     * https://github.com/Perl/perl5/issues/19963).
+     *
+     * There's no foolproof way to tell if a handle is a socket (mostly because
+     * of the non-IFS sockets), but in some cases we can tell if a handle
+     * is definitely *not* a socket.
+     */
+
+    /* GetFileType() always returns FILE_TYPE_PIPE for sockets. */
+    BOOL maybe_socket = (GetFileType(h) == FILE_TYPE_PIPE);
+
+    if (maybe_socket && pNtQueryInformationFile) {
+        IO_STATUS_BLOCK isb;
+        struct {
+            ULONG name_len;
+            WCHAR name[100];
+        } volume = {0};
+
+        /* There are many ways to tell a named pipe from a socket, but almost
+         * all of them can deadlock on a handle to a stuck pipe (like in the
+         * bug ticket mentioned above). According to my tests,
+         * FileVolumeNameInfomation is the only relevant function that doesn't
+         * suffer from this problem.
+         *
+         * It's undocumented and it requires Windows 10, so on older systems
+         * we always pass pipes to closesocket().
+         */
+        NTSTATUS s = pNtQueryInformationFile(
+            h, &isb, &volume, sizeof(volume), 58 /* FileVolumeNameInformation */
+        );
+        if (NT_SUCCESS(s)) {
+            maybe_socket = (_wcsnicmp(
+                volume.name, L"\\Device\\NamedPipe", C_ARRAY_LENGTH(volume.name)
+            ) != 0);
+        }
+    }
+
+    if (maybe_socket)
+        if (closesocket((SOCKET)h) == 0)
+            return TRUE;
+        else if (WSAGetLastError() != WSAENOTSOCK)
+            return FALSE;
+
+    return CloseHandle_orig(h);
+}
+
+/* Hook CloseHandle() inside CRT so its functions like _close() or
+ * _dup2() can close sockets properly. */
+static void
+win32_hook_closehandle_in_crt()
+{
+    /* Get the handle to the CRT module basing on the address of _close()
+     * function. */
+    HMODULE crt_handle;
+    BOOL succ = GetModuleHandleExA(
+        GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS
+        | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, (LPCSTR)_close,
+        &crt_handle
+    );
+    if (!succ)
+        return;
+
+    CloseHandle_orig = (pCloseHandle)GetProcAddress(
+        GetModuleHandleA("kernel32.dll"), "CloseHandle"
+    );
+    if (!CloseHandle_orig)
+        return;
+
+    win32_hook_imported_function_in_module(
+        crt_handle, "CloseHandle", (FARPROC)my_CloseHandle
+    );
+
+    pNtQueryInformationFile = (pNtQueryInformationFile_t)GetProcAddress(
+        GetModuleHandleA("ntdll.dll"), "NtQueryInformationFile"
+    );
+}
+
+/* Remove the hook installed by win32_hook_closehandle_crt(). This is needed in
+ * case the Perl DLL is unloaded, which would cause the hook become invalid.
+ * This can happen in embedded Perls, for example in mod_perl. */
+static void
+win32_unhook_closehandle_in_crt()
+{
+    if (!CloseHandle_orig)
+        return;
+
+    HMODULE crt_handle;
+    BOOL succ = GetModuleHandleExA(
+        GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS
+        | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, (LPCSTR)_close,
+        &crt_handle
+    );
+    if (!succ)
+        return;
+
+    win32_hook_imported_function_in_module(
+        crt_handle, "CloseHandle", (FARPROC)CloseHandle_orig
+    );
+
+    CloseHandle_orig = NULL;
+}
+
 void
 Perl_win32_init(int *argcp, char ***argvp)
 {
@@ -5026,20 +5441,13 @@ Perl_win32_init(int *argcp, char ***argvp)
      */
     InitCommonControls();
 
+    WSADATA wsadata;
+    WSAStartup(MAKEWORD(2, 2), &wsadata);
+
     g_osver.dwOSVersionInfoSize = sizeof(g_osver);
     GetVersionEx(&g_osver);
 
-#ifdef WIN32_DYN_IOINFO_SIZE
-    {
-        Size_t ioinfo_size = _msize((void*)__pioinfo[0]);;
-        if((SSize_t)ioinfo_size <= 0) { /* -1 is err */
-            fprintf(stderr, "panic: invalid size for ioinfo\n"); /* no interp */
-            exit(1);
-        }
-        ioinfo_size /= IOINFO_ARRAY_ELTS;
-        w32_ioinfo_size = ioinfo_size;
-    }
-#endif
+    win32_hook_closehandle_in_crt();
 
     ansify_path();
 
@@ -5087,6 +5495,7 @@ Perl_win32_term(void)
     RegCloseKey(HKCU_Perl_hnd);
     /* the handles are in an undefined state until the next PERL_SYS_INIT3 */
 #endif
+    win32_unhook_closehandle_in_crt();
 }
 
 void
index fea567f..211c55c 100644 (file)
 
 /* Win32 only optimizations for faster building */
 #ifdef PERL_IS_MINIPERL
-/* this macro will remove Winsock only on miniperl, PERL_IMPLICIT_SYS and
- * makedef.pl create dependencies that will keep Winsock linked in even with
- * this macro defined, even though sockets will be umimplemented from a script
- * level in full perl
- */
-#  define WIN32_NO_SOCKETS
 /* less I/O calls during each require */
 #  define PERL_DISABLE_PMC
 
-/* unnecessery for miniperl to lookup anything from an "installed" perl */
+/* unnecessary for miniperl to lookup anything from an "installed" perl */
 #  define WIN32_NO_REGISTRY
 
 /* allow minitest to work */
 #  define PERL_TEXTMODE_SCRIPTS
 #endif
 
-#ifdef WIN32_NO_SOCKETS
-#  undef HAS_SOCKET
-#  undef HAS_GETPROTOBYNAME
-#  undef HAS_GETPROTOBYNUMBER
-#  undef HAS_GETPROTOENT
-#  undef HAS_GETNETBYNAME
-#  undef HAS_GETNETBYADDR
-#  undef HAS_GETNETENT
-#  undef HAS_GETSERVBYNAME
-#  undef HAS_GETSERVBYPORT
-#  undef HAS_GETSERVENT
-#  undef HAS_GETHOSTBYNAME
-#  undef HAS_GETHOSTBYADDR
-#  undef HAS_GETHOSTENT
-#  undef HAS_SELECT
-#  undef HAS_IOCTL
-#  undef HAS_NTOHL
-#  undef HAS_HTONL
-#  undef HAS_HTONS
-#  undef HAS_NTOHS
-#  define WIN32SCK_IS_STDSCK
-#endif
-
 #if defined(PERL_IMPLICIT_SYS)
 #  define DYNAMIC_ENV_FETCH
 #  define HAS_GETENV_LEN
@@ -233,10 +204,10 @@ struct utsname {
 
 /* access() mode bits */
 #ifndef R_OK
-#  define      R_OK    4
-#  define      W_OK    2
-#  define      X_OK    1
-#  define      F_OK    0
+#  define R_OK  4
+#  define W_OK  2
+#  define X_OK  1
+#  define F_OK  0
 #endif
 
 /* for waitpid() */
@@ -284,8 +255,8 @@ MSVC_DIAG_RESTORE
    importing __PL_nan_u across DLL boundaries in size in the importing DLL
    will be more than the 8 bytes it will take up being in each XS DLL if
    that DLL actually uses __PL_nan_u */
-extern const __declspec(selectany) union { unsigned __int64 __q; double __d; }
-__PL_nan_u = { 0x7FF8000000000000UI64 };
+union PerlNan { unsigned __int64 __q; double __d; };
+extern const __declspec(selectany) union PerlNan __PL_nan_u = { 0x7FF8000000000000UI64 };
 #define NV_NAN ((NV)__PL_nan_u.__d)
 
 /* The CRT was rewritten in VS2015. */
@@ -455,7 +426,6 @@ DllExport void              win32_get_child_IO(child_IO_table* ptr);
 DllExport HWND         win32_create_message_window(void);
 DllExport int          win32_async_check(pTHX);
 
-extern int             my_fclose(FILE *);
 extern char *          win32_get_privlib(WIN32_NO_REGISTRY_M_(const char *pl) STRLEN *const len);
 extern char *          win32_get_sitelib(const char *pl, STRLEN *const len);
 extern char *          win32_get_vendorlib(const char *pl, STRLEN *const len);
@@ -595,83 +565,6 @@ void win32_wait_for_children(pTHX);
 #  define PERL_WAIT_FOR_CHILDREN win32_wait_for_children(aTHX)
 #endif
 
-/* The following ioinfo struct manipulations had been removed but were
- * reinstated to fix RT#120091/118059. However, they do not work with
- * the rewritten CRT in VS2015 so they are removed once again for VS2015
- * onwards, which will therefore suffer from the reintroduction of the
- * close socket bug. */
-#if (!defined(_MSC_VER)) || (defined(_MSC_VER) && _MSC_VER < 1900)
-
-#ifdef PERL_CORE
-
-/* C doesn't like repeat struct definitions */
-#if defined(__MINGW32__) && (__MINGW32_MAJOR_VERSION>=3)
-#  undef _CRTIMP
-#endif
-#ifndef _CRTIMP
-#  define _CRTIMP __declspec(dllimport)
-#endif
-
-#ifndef __MINGW32__
-/* size of ioinfo struct is determined at runtime */
-#  define WIN32_DYN_IOINFO_SIZE
-#endif
-
-#ifndef WIN32_DYN_IOINFO_SIZE
-/*
- * Control structure for lowio file handles
- */
-typedef struct {
-    intptr_t osfhnd;/* underlying OS file HANDLE */
-    char osfile;    /* attributes of file (e.g., open in text mode?) */
-    char pipech;    /* one char buffer for handles opened on pipes */
-    int lockinitflag;
-    CRITICAL_SECTION lock;
-} ioinfo;
-#else
-typedef intptr_t ioinfo;
-#endif
-
-/*
- * Array of arrays of control structures for lowio files.
- */
-EXTERN_C _CRTIMP ioinfo* __pioinfo[];
-
-/*
- * Definition of IOINFO_L2E, the log base 2 of the number of elements in each
- * array of ioinfo structs.
- */
-#define IOINFO_L2E         5
-
-/*
- * Definition of IOINFO_ARRAY_ELTS, the number of elements in ioinfo array
- */
-#define IOINFO_ARRAY_ELTS   (1 << IOINFO_L2E)
-
-/*
- * Access macros for getting at an ioinfo struct and its fields from a
- * file handle
- */
-#ifdef WIN32_DYN_IOINFO_SIZE
-#  define _pioinfo(i) ((intptr_t *) \
-     (((Size_t)__pioinfo[(i) >> IOINFO_L2E])/* * to head of array ioinfo [] */\
-      /* offset to the head of a particular ioinfo struct */ \
-      + (((i) & (IOINFO_ARRAY_ELTS - 1)) * w32_ioinfo_size)) \
-   )
-/* first slice of ioinfo is always the OS handle */
-#  define _osfhnd(i)  (*(_pioinfo(i)))
-#else
-#  define _pioinfo(i) (__pioinfo[(i) >> IOINFO_L2E] + ((i) & (IOINFO_ARRAY_ELTS - 1)))
-#  define _osfhnd(i)  (_pioinfo(i)->osfhnd)
-#endif
-
-/* since we are not doing a dup2(), this works fine */
-#define _set_osfhnd(fh, osfh) (void)(_osfhnd(fh) = (intptr_t)osfh)
-
-#endif /* PERL_CORE */
-
-#endif /* !defined(_MSC_VER) || _MSC_VER<1900 */
-
 /* IO.xs and POSIX.xs define PERLIO_NOT_STDIO to 1 */
 #if defined(PERL_EXT_IO) || defined(PERL_EXT_POSIX)
 #undef  PERLIO_NOT_STDIO
@@ -694,11 +587,20 @@ DllExport void *win32_signal_context(void);
 
 /* ucrt at least seems to allocate a whole bit per type,
    just mask off one bit from the mask for our symlink
-   file type.
+   and socket file types.
 */
-#define _S_IFLNK ((unsigned)(_S_IFMT ^ (_S_IFMT & -_S_IFMT)))
+#define _S_IFLNK ((unsigned)(_S_IFDIR | _S_IFCHR))
+#define _S_IFSOCK ((unsigned)(_S_IFDIR | _S_IFIFO))
+/* mingw64 defines _S_IFBLK to 0x3000 which is _S_IFDIR | _S_IFIFO */
+#ifndef _S_IFBLK
+#  define _S_IFBLK ((unsigned)(_S_IFCHR | _S_IFIFO))
+#endif
 #undef S_ISLNK
 #define S_ISLNK(mode) (((mode) & _S_IFMT) == _S_IFLNK)
+#undef S_ISSOCK
+#define S_ISSOCK(mode) (((mode) & _S_IFMT) == _S_IFSOCK)
+#undef S_ISBLK
+#define S_ISBLK(mode) (((mode) & _S_IFMT) == _S_IFBLK)
 
 /*
 
index 9733d7b..a50d840 100644 (file)
@@ -200,7 +200,7 @@ END_EXTERN_C
 
 #define stderr                         win32_stderr()
 #define stdout                         win32_stdout()
-#define        stdin                           win32_stdin()
+#define stdin                           win32_stdin()
 #define feof(f)                                win32_feof(f)
 #define ferror(f)                      win32_ferror(f)
 #define errno                          (*win32_errno())
@@ -210,17 +210,17 @@ END_EXTERN_C
  * redirect to our own version
  */
 #undef fprintf
-#define        fprintf                 win32_fprintf
-#define        vfprintf                win32_vfprintf
-#define        printf                  win32_printf
-#define        vprintf                 win32_vprintf
+#define fprintf                 win32_fprintf
+#define vfprintf                win32_vfprintf
+#define printf                  win32_printf
+#define vprintf                 win32_vprintf
 #define fread(buf,size,count,f)        win32_fread(buf,size,count,f)
 #define fwrite(buf,size,count,f)       win32_fwrite(buf,size,count,f)
 #define fopen                  win32_fopen
 #undef fdopen
 #define fdopen                 win32_fdopen
 #define freopen                        win32_freopen
-#define        fclose(f)               win32_fclose(f)
+#define fclose(f)               win32_fclose(f)
 #define fputs(s,f)             win32_fputs(s,f)
 #define fputc(c,f)             win32_fputc(c,f)
 #define ungetc(c,f)            win32_ungetc(c,f)
index ef5c682..7289a47 100644 (file)
 #define OPEN_SOCKET(x) win32_open_osfhandle(x,O_RDWR|O_BINARY)
 #define TO_SOCKET(x)   _get_osfhandle(x)
 
-#define StartSockets() \
-    STMT_START {                                       \
-        if (!wsock_started)                            \
-            start_sockets();                           \
-    } STMT_END
-
 #define SOCKET_TEST(x, y) \
     STMT_START {                                       \
-        StartSockets();                                        \
         if((x) == (y))                                 \
             {                                          \
             int wsaerr = WSAGetLastError();            \
@@ -56,8 +49,6 @@ static struct servent* win32_savecopyservent(struct servent*d,
                                              struct servent*s,
                                              const char *proto);
 
-static int wsock_started = 0;
-
 #ifdef WIN32_DYN_IOINFO_SIZE
 EXTERN_C Size_t w32_ioinfo_size;
 #endif
@@ -65,8 +56,7 @@ EXTERN_C Size_t w32_ioinfo_size;
 EXTERN_C void
 EndSockets(void)
 {
-    if (wsock_started)
-        WSACleanup();
+    WSACleanup();
 }
 
 /* Translate WSAExxx values to corresponding Exxx values where possible. Not all
@@ -326,63 +316,27 @@ convert_errno_to_wsa_error(int err)
 }
 #endif /* ERRNO_HAS_POSIX_SUPPLEMENT */
 
-void
-start_sockets(void) 
-{
-    unsigned short version;
-    WSADATA retdata;
-    int ret;
-
-    /*
-     * initalize the winsock interface and insure that it is
-     * cleaned up at exit.
-     */
-    version = 0x2;
-    if(ret = WSAStartup(version, &retdata))
-        Perl_croak_nocontext("Unable to locate winsock library!\n");
-    if(retdata.wVersion != version)
-        Perl_croak_nocontext("Could not find version 2.0 of winsock dll\n");
-
-    /* atexit((void (*)(void)) EndSockets); */
-    wsock_started = 1;
-}
-
-/* in no sockets Win32 builds, these use the inline functions defined in
- * perl.h
- */
 u_long
 win32_htonl(u_long hostlong)
 {
-#ifndef WIN32_NO_SOCKETS
-    StartSockets();
-#endif
     return htonl(hostlong);
 }
 
 u_short
 win32_htons(u_short hostshort)
 {
-#ifndef WIN32_NO_SOCKETS
-    StartSockets();
-#endif
     return htons(hostshort);
 }
 
 u_long
 win32_ntohl(u_long netlong)
 {
-#ifndef WIN32_NO_SOCKETS
-    StartSockets();
-#endif
     return ntohl(netlong);
 }
 
 u_short
 win32_ntohs(u_short netshort)
 {
-#ifndef WIN32_NO_SOCKETS
-    StartSockets();
-#endif
     return ntohs(netshort);
 }
 
@@ -495,8 +449,6 @@ win32_select(int nfds, Perl_fd_set* rd, Perl_fd_set* wr, Perl_fd_set* ex, const
     FD_SET nrd, nwr, nex;
     bool just_sleep = TRUE;
 
-    StartSockets();
-
     FD_ZERO(&nrd);
     FD_ZERO(&nwr);
     FD_ZERO(&nex);
@@ -668,8 +620,6 @@ win32_socket(int af, int type, int protocol)
 {
     SOCKET s;
 
-    StartSockets();
-
     if((s = open_ifs_socket(af, type, protocol)) == INVALID_SOCKET)
         {
         int wsaerr = WSAGetLastError();
@@ -682,84 +632,6 @@ win32_socket(int af, int type, int protocol)
     return s;
 }
 
-/*
- * close RTL fd while respecting sockets
- * added as temporary measure until PerlIO has real
- * Win32 native layer
- *   -- BKS, 11-11-2000
-*/
-
-int my_close(int fd)
-{
-    int osf;
-    if (!wsock_started)                /* No WinSock? */
-        return(close(fd));     /* Then not a socket. */
-    osf = TO_SOCKET(fd);/* Get it now before it's gone! */
-    if (osf != -1) {
-        int err;
-        err = closesocket(osf);
-        if (err == 0) {
-#ifdef _set_osfhnd
-            assert(_osfhnd(fd) == osf); /* catch a bad ioinfo struct def */
-            /* don't close freed handle */
-            _set_osfhnd(fd, INVALID_HANDLE_VALUE);
-            return close(fd);
-#else
-            (void)close(fd);    /* handle already closed, ignore error */
-            return 0;
-#endif
-        }
-        else if (err == SOCKET_ERROR) {
-            int wsaerr = WSAGetLastError();
-            err = convert_wsa_error_to_errno(wsaerr);
-            if (err != ENOTSOCK) {
-                (void)close(fd);
-                errno = err;
-                SetLastError(wsaerr);
-                return EOF;
-            }
-        }
-    }
-    return close(fd);
-}
-
-#undef fclose
-int
-my_fclose (FILE *pf)
-{
-    int osf;
-    if (!wsock_started)                /* No WinSock? */
-        return(fclose(pf));    /* Then not a socket. */
-    osf = TO_SOCKET(win32_fileno(pf));/* Get it now before it's gone! */
-    if (osf != -1) {
-        int err;
-        win32_fflush(pf);
-        err = closesocket(osf);
-        if (err == 0) {
-#ifdef _set_osfhnd
-            assert(_osfhnd(win32_fileno(pf)) == osf); /* catch a bad ioinfo struct def */
-            /* don't close freed handle */
-            _set_osfhnd(win32_fileno(pf), INVALID_HANDLE_VALUE);
-            return fclose(pf);
-#else
-            (void)fclose(pf);   /* handle already closed, ignore error */
-            return 0;
-#endif
-        }
-        else if (err == SOCKET_ERROR) {
-            int wsaerr = WSAGetLastError();
-            err = convert_wsa_error_to_errno(wsaerr);
-            if (err != ENOTSOCK) {
-                (void)fclose(pf);
-                errno = err;
-                SetLastError(wsaerr);
-                return EOF;
-            }
-        }
-    }
-    return fclose(pf);
-}
-
 struct hostent *
 win32_gethostbyaddr(const char *addr, int len, int type)
 {
@@ -839,11 +711,6 @@ win32_ioctl(int i, unsigned int u, char *data)
     u_long u_long_arg; 
     int retval;
     
-    if (!wsock_started) {
-        Perl_croak_nocontext("ioctl implemented only on sockets");
-        /* NOTREACHED */
-    }
-
     /* mauke says using memcpy avoids alignment issues */
     memcpy(&u_long_arg, data, sizeof u_long_arg); 
     retval = ioctlsocket(TO_SOCKET(i), (long)u, &u_long_arg);
@@ -865,14 +732,12 @@ win32_ioctl(int i, unsigned int u, char *data)
 char FAR *
 win32_inet_ntoa(struct in_addr in)
 {
-    StartSockets();
     return inet_ntoa(in);
 }
 
 unsigned long
 win32_inet_addr(const char FAR *cp)
 {
-    StartSockets();
     return inet_addr(cp);
 }
 
@@ -967,6 +832,8 @@ win32_setservent(int stayopen)
     win32_croak_not_implemented("setservent");
 }
 
+static char tcp_proto[] = "tcp";
+
 static struct servent*
 win32_savecopyservent(struct servent*d, struct servent*s, const char *proto)
 {
@@ -979,7 +846,7 @@ win32_savecopyservent(struct servent*d, struct servent*s, const char *proto)
     if (proto && strlen(proto))
         d->s_proto = (char *)proto;
     else
-        d->s_proto = "tcp";
+        d->s_proto = tcp_proto;
    
     return d;
 }